[ppl] 06/68: Imported Upstream version 0.10~pre27

Andreas Tille tille at debian.org
Sat Nov 12 08:39:57 UTC 2016


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository ppl.

commit fbaf9c52561db8a1f57f1f31b5e4d12f5f096a93
Author: Andreas Tille <tille at debian.org>
Date:   Sat Nov 12 01:13:18 2016 -0600

    Imported Upstream version 0.10~pre27
---
 COPYING                                            |    912 +-
 CREDITS                                            |     81 +-
 ChangeLog                                          |  38158 ++++++-
 INSTALL                                            |     69 +-
 Makefile.am                                        |     25 +-
 Makefile.in                                        |    315 +-
 NEWS                                               |    190 +-
 README                                             |     20 +-
 README.configure                                   |     85 +-
 STANDARDS                                          |    115 +-
 TODO                                               |    140 +-
 Watchdog/COPYING                                   |    912 +-
 Watchdog/ChangeLog                                 |    804 +-
 Watchdog/INSTALL                                   |     69 +-
 Watchdog/Makefile.am                               |     16 +-
 Watchdog/Makefile.in                               |    210 +-
 Watchdog/NEWS                                      |     11 +
 Watchdog/README                                    |      8 +-
 Watchdog/aclocal.m4                                |   6567 +-
 Watchdog/compile                                   |      2 +-
 Watchdog/config.guess                              |     76 +-
 Watchdog/config.h.in                               |     16 +-
 Watchdog/config.sub                                |    128 +-
 Watchdog/configure                                 |  31671 +++---
 Watchdog/configure.ac                              |     67 +-
 Watchdog/depcomp                                   |     95 +-
 Watchdog/doc/Makefile.am                           |    297 +
 Watchdog/doc/Makefile.in                           |    632 +
 Watchdog/doc/README.doc                            |    139 +
 Watchdog/doc/devref.doxyconf-html                  |    273 +
 Watchdog/doc/devref.doxyconf-html.in               |    273 +
 Watchdog/doc/devref.doxyconf-latex                 |    273 +
 Watchdog/doc/devref.doxyconf-latex.in              |    273 +
 Watchdog/doc/devref.tex                            |    120 +
 Watchdog/doc/fdl.dox                               |    407 +
 Watchdog/doc/fdl.pdf                               |    Bin 0 -> 59059 bytes
 Watchdog/doc/fdl.ps.gz                             |    Bin 0 -> 67863 bytes
 Watchdog/doc/fdl.tex                               |    454 +
 Watchdog/doc/fdl.txt                               |    397 +
 Watchdog/doc/gpl.dox                               |    686 +
 Watchdog/doc/gpl.pdf                               |    Bin 0 -> 71114 bytes
 Watchdog/doc/gpl.ps.gz                             |    Bin 0 -> 80395 bytes
 Watchdog/doc/gpl.tex                               |    728 +
 Watchdog/doc/gpl.txt                               |    674 +
 Watchdog/doc/pwl-user-0.6-html.tar.gz              |    Bin 0 -> 150576 bytes
 Watchdog/doc/pwl-user-0.6.pdf                      |    Bin 0 -> 414587 bytes
 Watchdog/doc/pwl-user-0.6.ps.gz                    |    Bin 0 -> 215036 bytes
 Watchdog/doc/pwl.sty                               |    178 +
 Watchdog/doc/user.doxyconf-html                    |    244 +
 Watchdog/doc/user.doxyconf-html.in                 |    244 +
 Watchdog/doc/user.doxyconf-latex                   |    244 +
 Watchdog/doc/user.doxyconf-latex.in                |    244 +
 Watchdog/doc/user.tex                              |    120 +
 Watchdog/install-sh                                |    480 +-
 Watchdog/ltmain.sh                                 |  13217 ++-
 Watchdog/m4/Makefile.am                            |     31 +
 Watchdog/m4/Makefile.in                            |    396 +
 Watchdog/m4/ax_prefix_config_h.m4                  |    223 +
 Watchdog/m4/libtool.m4                             |   7357 ++
 Watchdog/m4/ltoptions.m4                           |    368 +
 Watchdog/m4/ltsugar.m4                             |    123 +
 Watchdog/m4/ltversion.m4                           |     23 +
 Watchdog/m4/lt~obsolete.m4                         |     92 +
 Watchdog/missing                                   |     66 +-
 Watchdog/mkinstalldirs                             |      5 +-
 Watchdog/src/Doubly_Linked_Object.defs.hh          |      4 +-
 Watchdog/src/Doubly_Linked_Object.inlines.hh       |      4 +-
 Watchdog/src/Doubly_Linked_Object.types.hh         |      2 +-
 Watchdog/src/EList.defs.hh                         |      6 +-
 Watchdog/src/EList.inlines.hh                      |      4 +-
 Watchdog/src/EList.types.hh                        |      2 +-
 Watchdog/src/EList_Iterator.defs.hh                |      4 +-
 Watchdog/src/EList_Iterator.inlines.hh             |      4 +-
 Watchdog/src/EList_Iterator.types.hh               |      2 +-
 Watchdog/src/Handler.defs.hh                       |      6 +-
 Watchdog/src/Handler.inlines.hh                    |      4 +-
 Watchdog/src/Handler.types.hh                      |      2 +-
 Watchdog/src/Makefile.am                           |     16 +-
 Watchdog/src/Makefile.in                           |    216 +-
 Watchdog/src/Pending_Element.cc                    |      6 +-
 Watchdog/src/Pending_Element.defs.hh               |      6 +-
 Watchdog/src/Pending_Element.inlines.hh            |      4 +-
 Watchdog/src/Pending_Element.types.hh              |      2 +-
 Watchdog/src/Pending_List.cc                       |      6 +-
 Watchdog/src/Pending_List.defs.hh                  |      4 +-
 Watchdog/src/Pending_List.inlines.hh               |      4 +-
 Watchdog/src/Pending_List.types.hh                 |      2 +-
 Watchdog/src/Time.cc                               |      6 +-
 Watchdog/src/Time.defs.hh                          |      4 +-
 Watchdog/src/Time.inlines.hh                       |      4 +-
 Watchdog/src/Time.types.hh                         |      2 +-
 Watchdog/src/Watchdog.cc                           |     18 +-
 Watchdog/src/Watchdog.defs.hh                      |     12 +-
 Watchdog/src/Watchdog.inlines.hh                   |      4 +-
 Watchdog/src/Watchdog.types.hh                     |      2 +-
 Watchdog/src/pwl.hh.dist                           |    227 +-
 Watchdog/src/pwl_header.hh                         |     22 +-
 Watchdog/utils/Makefile.am                         |      6 +-
 Watchdog/utils/Makefile.in                         |    128 +-
 Watchdog/utils/build_header.in                     |      4 +-
 aclocal.m4                                         |   6574 +-
 compile                                            |      2 +-
 config.guess                                       |     76 +-
 config.h.in                                        |    150 +-
 config.rpath                                       |    271 +-
 config.sub                                         |    128 +-
 configure                                          |  44599 ++++----
 configure.ac                                       |    576 +-
 debian/Makefile.am                                 |      4 +-
 debian/Makefile.in                                 |    214 +-
 debian/README                                      |     35 -
 debian/changelog                                   |     11 -
 debian/compat                                      |      1 -
 debian/control                                     |     74 -
 debian/libppl-c.dirs                               |      1 -
 debian/libppl-c.install                            |      1 -
 debian/libppl-c.links                              |      1 -
 debian/libppl-dev.dirs                             |      3 -
 debian/libppl-dev.doc-base                         |     17 -
 debian/libppl-dev.doc-base.user                    |     17 -
 debian/libppl-dev.docs                             |      0
 debian/libppl-dev.install                          |      5 -
 debian/libppl-dev.links                            |      1 -
 debian/libppl-pwl.copyright.in                     |    444 -
 debian/libppl-pwl.dirs                             |      2 -
 debian/libppl-pwl.docs                             |      5 -
 debian/libppl-pwl.install                          |      4 -
 debian/libppl.copyright.in                         |    444 -
 debian/libppl.dirs                                 |      3 -
 debian/libppl.docs                                 |      5 -
 debian/libppl.install                              |      8 -
 debian/rules                                       |    186 -
 demos/Makefile.am                                  |      4 +-
 demos/Makefile.in                                  |    259 +-
 demos/ppl_lcdd/Makefile.am                         |      4 +-
 demos/ppl_lcdd/Makefile.in                         |    299 +-
 demos/ppl_lcdd/examples/Makefile.am                |      4 +-
 demos/ppl_lcdd/examples/Makefile.in                |    214 +-
 demos/ppl_lcdd/ppl_lcdd.cc                         |     54 +-
 demos/ppl_lpsol/Makefile.am                        |    148 +-
 demos/ppl_lpsol/Makefile.in                        |    471 +-
 demos/ppl_lpsol/examples/Makefile.am               |     17 +-
 demos/ppl_lpsol/examples/Makefile.in               |    227 +-
 demos/ppl_lpsol/examples/README                    |     10 +-
 demos/ppl_lpsol/examples/egout.mps                 |    403 +
 demos/ppl_lpsol/examples/ex12.mps                  |     25 +
 demos/ppl_lpsol/examples/lseu.mps                  |    371 +
 demos/ppl_lpsol/examples/markshare1.mps            |    236 +
 demos/ppl_lpsol/examples/markshare2.mps            |    341 +
 demos/ppl_lpsol/examples/mas74.mps                 |   1131 +
 demos/ppl_lpsol/examples/mas76.mps                 |   1134 +
 demos/ppl_lpsol/examples/modglob.mps               |   1192 +
 demos/ppl_lpsol/examples/noswot.mps                |    729 +
 demos/ppl_lpsol/examples/opt1217.mps               |   1643 +
 demos/ppl_lpsol/examples/p0033.mps                 |    152 +
 demos/ppl_lpsol/examples/pk1.mps                   |    603 +
 demos/ppl_lpsol/examples/rout.mps                  |   2038 +
 demos/ppl_lpsol/expected_int16                     |   1006 +-
 demos/ppl_lpsol/expected_int16_a                   |    216 +-
 demos/ppl_lpsol/expected_int32                     |   1001 +-
 demos/ppl_lpsol/expected_int32_a                   |    211 +-
 demos/ppl_lpsol/expected_int64                     |   1997 +-
 demos/ppl_lpsol/expected_int64_a                   |    437 +-
 demos/ppl_lpsol/expected_int8                      |    208 +-
 demos/ppl_lpsol/expected_int8_a                    |    188 +-
 demos/ppl_lpsol/expected_mpz                       |   5819 +-
 demos/ppl_lpsol/expected_mpz_a                     |   4168 +-
 demos/ppl_lpsol/ppl_lpsol.c                        |    623 +-
 depcomp                                            |     95 +-
 doc/Makefile.am                                    |    563 +-
 doc/Makefile.in                                    |    868 +-
 doc/README.doc                                     |      6 +-
 doc/definitions.dox                                |    693 +-
 doc/devref-c-interface.doxyconf-html               |    248 +
 doc/devref-c-interface.doxyconf-html.in            |    248 +
 doc/devref-c-interface.doxyconf-latex              |    247 +
 doc/devref-c-interface.doxyconf-latex.in           |    247 +
 doc/devref-c-interface.tex                         |    130 +
 doc/devref-java-interface.doxyconf-html.in         |    285 +
 doc/devref-java-interface.doxyconf-latex           |    284 +
 doc/devref-java-interface.doxyconf-latex.in        |    284 +
 doc/devref-java-interface.tex                      |    130 +
 doc/devref-ocaml-interface.doxyconf-html.in        |    247 +
 doc/devref-ocaml-interface.doxyconf-latex          |    246 +
 doc/devref-ocaml-interface.doxyconf-latex.in       |    246 +
 doc/devref-ocaml-interface.tex                     |    146 +
 doc/devref-prolog-interface.doxyconf-html          |    251 +
 doc/devref-prolog-interface.doxyconf-html.in       |    251 +
 doc/devref-prolog-interface.doxyconf-latex         |    250 +
 doc/devref-prolog-interface.doxyconf-latex.in      |    250 +
 doc/devref-prolog-interface.tex                    |    130 +
 doc/devref.doxyconf-html                           |   1571 +-
 doc/devref.doxyconf-html.in                        |   1225 +-
 doc/devref.doxyconf-latex                          |   1569 +-
 doc/devref.doxyconf-latex.in                       |   1229 +-
 doc/devref.tex                                     |     35 +-
 doc/fdl.dox                                        |      9 +-
 doc/fdl.pdf                                        |    Bin 59059 -> 59057 bytes
 doc/fdl.ps.gz                                      |    Bin 67885 -> 67866 bytes
 doc/gpl.dox                                        |   1130 +-
 doc/gpl.pdf                                        |    Bin 71909 -> 71114 bytes
 doc/gpl.ps.gz                                      |    Bin 78865 -> 80387 bytes
 doc/gpl.tex                                        |   1034 +-
 doc/gpl.txt                                        |    912 +-
 doc/libppl.3                                       |     77 +
 doc/ppl-config.1                                   |      5 +-
 doc/ppl-user-0.10pre27-html.tar.gz                 |    Bin 0 -> 1044606 bytes
 doc/ppl-user-0.10pre27.pdf                         |  92038 ++++++++++++++++
 doc/ppl-user-0.10pre27.ps.gz                       |    Bin 0 -> 1596667 bytes
 doc/ppl-user-0.9-html.tar.gz                       |    Bin 583785 -> 0 bytes
 doc/ppl-user-0.9.pdf                               |    Bin 2839226 -> 0 bytes
 doc/ppl-user-0.9.ps.gz                             |    Bin 1163250 -> 0 bytes
 doc/ppl.sty                                        |      4 +-
 doc/ppl_lcdd.1                                     |     11 +-
 doc/ppl_lpsol.1                                    |     37 +-
 doc/user-c-interface.doxyconf-html                 |    249 +
 doc/user-c-interface.doxyconf-html.in              |    249 +
 doc/user-c-interface.doxyconf-latex                |    249 +
 doc/user-c-interface.doxyconf-latex.in             |    249 +
 doc/user-c-interface.tex                           |    130 +
 doc/user-java-interface.doxyconf-html.in           |    284 +
 doc/user-java-interface.doxyconf-latex             |    284 +
 doc/user-java-interface.doxyconf-latex.in          |    284 +
 doc/user-java-interface.tex                        |    130 +
 doc/user-ocaml-interface.doxyconf-html.in          |    247 +
 doc/user-ocaml-interface.doxyconf-latex            |    247 +
 doc/user-ocaml-interface.doxyconf-latex.in         |    247 +
 doc/user-ocaml-interface.tex                       |    146 +
 doc/user-prolog-interface.doxyconf-html            |    247 +
 doc/user-prolog-interface.doxyconf-html.in         |    247 +
 doc/user-prolog-interface.doxyconf-latex           |    247 +
 doc/user-prolog-interface.doxyconf-latex.in        |    247 +
 doc/user-prolog-interface.tex                      |    130 +
 doc/user.doxyconf-html                             |   1084 +-
 doc/user.doxyconf-html.in                          |   1074 +-
 doc/user.doxyconf-latex                            |   1080 +-
 doc/user.doxyconf-latex.in                         |   1070 +-
 doc/user.tex                                       |     35 +-
 fedora/Makefile.am                                 |     27 +
 fedora/Makefile.in                                 |    428 +
 fedora/ppl.hh                                      |     43 +
 fedora/ppl.spec                                    |    527 +
 fedora/ppl_c.h                                     |     43 +
 fedora/pwl.hh                                      |     43 +
 install-sh                                         |    480 +-
 instchk.hh                                         |    285 +-
 interfaces/C/C_interface.dox                       |   1359 +
 interfaces/C/Makefile.am                           |     62 +-
 interfaces/C/Makefile.in                           |    389 +-
 interfaces/C/ppl_c.cc                              |   2524 -
 interfaces/C/ppl_c.h                               |   2695 -
 interfaces/C/ppl_c.h.in                            |   2695 -
 interfaces/C/ppl_c_version.h.in                    |     62 +
 interfaces/C/ppl_interface_generator_c_cc.m4       |     88 +
 interfaces/C/ppl_interface_generator_c_cc_code.m4  |    922 +
 interfaces/C/ppl_interface_generator_c_cc_preamble |   2215 +
 interfaces/C/ppl_interface_generator_c_h.m4        |     79 +
 interfaces/C/ppl_interface_generator_c_h_code.m4   |    536 +
 interfaces/C/ppl_interface_generator_c_h_preamble  |   2079 +
 ...l_interface_generator_c_procedure_generators.m4 |     58 +
 interfaces/Java/Java_interface.dox                 |   2044 +
 interfaces/Java/Makefile.am                        |     42 +
 interfaces/Java/Makefile.in                        |    625 +
 interfaces/Java/jni/Makefile.am                    |     75 +
 interfaces/Java/jni/Makefile.in                    |    627 +
 ...interface_generator_java_ppl_java_classes_cc.m4 |     59 +
 ...face_generator_java_ppl_java_classes_cc_code.m4 |   1008 +
 interfaces/Java/jni/ppl_java_common.cc             |   1109 +
 interfaces/Java/jni/ppl_java_common.hh             |    451 +
 interfaces/Java/jni/ppl_java_globals.cc            |    485 +
 ...nterface_generator_java_procedure_generators.m4 |     52 +
 interfaces/Java/ppl_java/By_Reference.java         |     53 +
 interfaces/Java/ppl_java/Coefficient.java          |     75 +
 interfaces/Java/ppl_java/Congruence.java           |     62 +
 interfaces/Java/ppl_java/Congruence_System.java    |     36 +
 interfaces/Java/ppl_java/Constraint.java           |     71 +
 interfaces/Java/ppl_java/Constraint_System.java    |     38 +
 interfaces/Java/ppl_java/Degenerate_Element.java   |     32 +
 .../Java/ppl_java/Domain_Error_Exception.java      |     30 +
 interfaces/Java/ppl_java/Generator.java            |    137 +
 interfaces/Java/ppl_java/Generator_System.java     |     39 +
 interfaces/Java/ppl_java/Generator_Type.java       |     37 +
 interfaces/Java/ppl_java/Grid_Generator.java       |     98 +
 .../Java/ppl_java/Grid_Generator_System.java       |     38 +
 interfaces/Java/ppl_java/Grid_Generator_Type.java  |     35 +
 .../Java/ppl_java/Invalid_Argument_Exception.java  |     30 +
 .../Java/ppl_java/Length_Error_Exception.java      |     30 +
 interfaces/Java/ppl_java/Linear_Expression.java    |     57 +
 .../ppl_java/Linear_Expression_Coefficient.java    |     49 +
 .../ppl_java/Linear_Expression_Difference.java     |     61 +
 .../Java/ppl_java/Linear_Expression_Sum.java       |     58 +
 .../Java/ppl_java/Linear_Expression_Times.java     |     59 +
 .../ppl_java/Linear_Expression_Unary_Minus.java    |     49 +
 .../Java/ppl_java/Linear_Expression_Variable.java  |     48 +
 .../Java/ppl_java/Logic_Error_Exception.java       |     31 +
 interfaces/Java/ppl_java/MIP_Problem.java          |    267 +
 interfaces/Java/ppl_java/MIP_Problem_Status.java   |     34 +
 interfaces/Java/ppl_java/Makefile.am               |    166 +
 interfaces/Java/ppl_java/Makefile.in               |    581 +
 interfaces/Java/ppl_java/Optimization_Mode.java    |     33 +
 .../Java/ppl_java/Overflow_Error_Exception.java    |     30 +
 interfaces/Java/ppl_java/PPL_Object.java           |     42 +
 interfaces/Java/ppl_java/Pair.java                 |     46 +
 .../Java/ppl_java/Parma_Polyhedra_Library.java     |     43 +
 interfaces/Java/ppl_java/Partial_Function.java     |     31 +
 interfaces/Java/ppl_java/Poly_Con_Relation.java    |     87 +
 interfaces/Java/ppl_java/Poly_Gen_Relation.java    |     57 +
 interfaces/Java/ppl_java/Relation_Symbol.java      |     39 +
 interfaces/Java/ppl_java/Variable.java             |     69 +
 interfaces/Java/ppl_java/Variables_Set.java        |     31 +
 .../ppl_interface_generator_java_classes_java.m4   |    115 +
 ...l_interface_generator_java_classes_java_code.m4 |    495 +
 interfaces/Java/tests/C_Polyhedron_test1.java      |    108 +
 interfaces/Java/tests/Makefile.am                  |     81 +
 interfaces/Java/tests/Makefile.in                  |    497 +
 interfaces/Java/tests/NNC_Polyhedron_test1.java    |     88 +
 interfaces/Java/tests/Test_Executor.java           |     61 +
 interfaces/Java/tests/Test_Partial_Function.java   |     61 +
 .../ppl_interface_generator_java_test_java.m4      |    121 +
 .../ppl_interface_generator_java_test_java_code.m4 |    280 +
 interfaces/Java/tests/ppl_java_tests_common        |    113 +
 interfaces/Makefile.am                             |     31 +-
 interfaces/Makefile.in                             |    303 +-
 interfaces/OCaml/Makefile.am                       |    147 +
 interfaces/OCaml/Makefile.in                       |    791 +
 interfaces/OCaml/OCaml_interface.dox               |   2044 +
 .../OCaml/ppl_interface_generator_ocaml_cc.m4      |     65 +
 .../OCaml/ppl_interface_generator_ocaml_cc_code.m4 |   1036 +
 .../OCaml/ppl_interface_generator_ocaml_ml.m4      |     71 +
 .../OCaml/ppl_interface_generator_ocaml_ml_code.m4 |    529 +
 .../OCaml/ppl_interface_generator_ocaml_mli.m4     |    209 +
 .../ppl_interface_generator_ocaml_mli_code.m4      |    436 +
 ...terface_generator_ocaml_procedure_generators.m4 |     50 +
 interfaces/OCaml/ppl_ocaml_globals.cc              |   1007 +
 interfaces/OCaml/ppl_ocaml_globals.ml              |    107 +
 interfaces/OCaml/ppl_ocaml_types.ml                |     87 +
 interfaces/OCaml/tests/Makefile.am                 |     97 +
 interfaces/OCaml/tests/Makefile.in                 |    609 +
 .../tests/ppl_interface_generator_ocaml_test_ml.m4 |     64 +
 .../ppl_interface_generator_ocaml_test_ml_code.m4  |    802 +
 interfaces/OCaml/tests/ppl_ocaml_tests_common      |    235 +
 interfaces/OCaml/tests/test1.ml                    |    301 +
 interfaces/Prolog/Ciao/Makefile.am                 |     92 +-
 interfaces/Prolog/Ciao/Makefile.in                 |    372 +-
 interfaces/Prolog/Ciao/ciao_cfli.hh                |    336 +
 interfaces/Prolog/Ciao/ciao_clpq.pl                |      4 +-
 interfaces/Prolog/Ciao/ciao_clpq2.pl               |      4 +-
 interfaces/Prolog/Ciao/ciao_pl_check.pl            |     50 +-
 interfaces/Prolog/Ciao/ppl_ciao.cc                 |    346 +-
 interfaces/Prolog/Ciao/ppl_ciao.pl                 |   1683 -
 .../Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 |     87 +
 ..._interface_generator_ciao_predicate_check_pl.m4 |     65 +
 interfaces/Prolog/GNU/Makefile.am                  |    107 +-
 interfaces/Prolog/GNU/Makefile.in                  |    537 +-
 interfaces/Prolog/GNU/README                       |     32 -
 interfaces/Prolog/GNU/README.gprolog               |     36 +
 interfaces/Prolog/GNU/gnu_pl_check.pl              |      4 +-
 interfaces/Prolog/GNU/gp_clpq.pl                   |      4 +-
 interfaces/Prolog/GNU/gprolog_cfli.hh              |    425 +
 interfaces/Prolog/GNU/gprolog_efli.cc              |     73 +
 interfaces/Prolog/GNU/gprolog_efli.hh              |     80 +
 interfaces/Prolog/GNU/ppl_gprolog.pl               |    182 -
 interfaces/Prolog/GNU/ppl_gprolog_sd.cc            |    438 -
 .../GNU/ppl_interface_generator_gprolog_pl.m4      |     46 +
 interfaces/Prolog/GNU/ppl_prolog_sysdep.hh         |     23 +
 interfaces/Prolog/Makefile.am                      |     82 +-
 interfaces/Prolog/Makefile.in                      |    354 +-
 interfaces/Prolog/Prolog_interface.dox             |   1866 +-
 interfaces/Prolog/SICStus/Makefile.am              |    157 +-
 interfaces/Prolog/SICStus/Makefile.in              |    574 +-
 .../ppl_interface_generator_sicstus_sd_cc.m4       |    192 +
 interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh     |     23 +
 interfaces/Prolog/SICStus/ppl_sicstus.pl           |      4 +-
 interfaces/Prolog/SICStus/ppl_sicstus_sd.cc        |    474 -
 interfaces/Prolog/SICStus/sicstus_cfli.cc          |      4 +-
 interfaces/Prolog/SICStus/sicstus_cfli.h           |     18 +-
 interfaces/Prolog/SICStus/sicstus_cfli.ic          |     12 +-
 interfaces/Prolog/SICStus/sicstus_efli.cc          |     97 +
 interfaces/Prolog/SICStus/sicstus_efli.hh          |     83 +
 interfaces/Prolog/SICStus/sp_clpq.pl               |     26 +-
 interfaces/Prolog/SICStus/sp_pl_check.pl           |     38 +-
 interfaces/Prolog/SICStus/sp_predicate_check.pl    |     48 +
 interfaces/Prolog/SWI/Makefile.am                  |    162 +-
 interfaces/Prolog/SWI/Makefile.in                  |    591 +-
 interfaces/Prolog/SWI/README.swiprolog             |     33 +
 interfaces/Prolog/SWI/pl_clpq.cc                   |      9 +-
 interfaces/Prolog/SWI/pl_clpq.pl                   |      4 +-
 .../SWI/ppl_interface_generator_swiprolog_cc.m4    |     71 +
 interfaces/Prolog/SWI/ppl_pl.cc                    |      9 +-
 interfaces/Prolog/SWI/ppl_prolog_sysdep.hh         |     23 +
 interfaces/Prolog/SWI/ppl_swiprolog.cc             |    524 -
 interfaces/Prolog/SWI/ppl_swiprolog.pl             |      4 +-
 interfaces/Prolog/SWI/swi_cfli.hh                  |    327 +
 interfaces/Prolog/SWI/swi_efli.cc                  |     70 +
 interfaces/Prolog/SWI/swi_efli.hh                  |     83 +
 interfaces/Prolog/SWI/swi_pl_check.pl              |      6 +-
 interfaces/Prolog/SWI/swi_predicate_check.pl       |     38 +
 interfaces/Prolog/XSB/Makefile.am                  |    175 +-
 interfaces/Prolog/XSB/Makefile.in                  |    640 +-
 interfaces/Prolog/XSB/expected_clpq2_int16         |    102 -
 interfaces/Prolog/XSB/expected_clpq2_int16_a       |    103 -
 interfaces/Prolog/XSB/expected_clpq2_int32         |    109 -
 interfaces/Prolog/XSB/expected_clpq2_int32_a       |    102 -
 interfaces/Prolog/XSB/expected_clpq2_int64         |    109 -
 interfaces/Prolog/XSB/expected_clpq2_int64_a       |    109 -
 interfaces/Prolog/XSB/expected_clpq2_int8          |    101 -
 interfaces/Prolog/XSB/expected_clpq2_int8_a        |    101 -
 interfaces/Prolog/XSB/expected_clpq2_mpz           |    109 -
 interfaces/Prolog/XSB/expected_clpq2_mpz_a         |    109 -
 interfaces/Prolog/XSB/expected_clpq_int16          |     35 -
 interfaces/Prolog/XSB/expected_clpq_int16_a        |     35 -
 interfaces/Prolog/XSB/expected_clpq_int32          |     35 -
 interfaces/Prolog/XSB/expected_clpq_int32_a        |     35 -
 interfaces/Prolog/XSB/expected_clpq_int64          |     35 -
 interfaces/Prolog/XSB/expected_clpq_int64_a        |     35 -
 interfaces/Prolog/XSB/expected_clpq_int8           |     29 -
 interfaces/Prolog/XSB/expected_clpq_int8_a         |     29 -
 interfaces/Prolog/XSB/expected_clpq_mpz            |     35 -
 interfaces/Prolog/XSB/expected_clpq_mpz_a          |     35 -
 interfaces/Prolog/XSB/expected_pchk_int16          |      3 -
 interfaces/Prolog/XSB/expected_pchk_int16_a        |      3 -
 interfaces/Prolog/XSB/expected_pchk_int32          |      3 -
 interfaces/Prolog/XSB/expected_pchk_int32_a        |      3 -
 interfaces/Prolog/XSB/expected_pchk_int64          |      1 -
 interfaces/Prolog/XSB/expected_pchk_int64_a        |      3 -
 interfaces/Prolog/XSB/expected_pchk_int8           |      9 -
 interfaces/Prolog/XSB/expected_pchk_int8_a         |      9 -
 interfaces/Prolog/XSB/expected_pchk_mpz            |      1 -
 interfaces/Prolog/XSB/expected_pchk_mpz_a          |      1 -
 .../Prolog/XSB/ppl_interface_generator_xsb_H.m4    |     45 +
 .../Prolog/XSB/ppl_interface_generator_xsb_cc.m4   |    118 +
 .../Prolog/XSB/ppl_interface_generator_xsb_hh.m4   |     38 +
 ...pl_interface_generator_xsb_predicate_check_P.m4 |     86 +
 interfaces/Prolog/XSB/ppl_prolog_sysdep.hh         |     24 +
 interfaces/Prolog/XSB/ppl_xsb.H                    |    143 -
 interfaces/Prolog/XSB/ppl_xsb.cc                   |    834 -
 interfaces/Prolog/XSB/xsb_cfli.hh                  |    350 +
 interfaces/Prolog/XSB/xsb_clpq.P                   |      4 +-
 interfaces/Prolog/XSB/xsb_clpq2.P                  |      4 +-
 interfaces/Prolog/XSB/xsb_efli.cc                  |     72 +
 interfaces/Prolog/XSB/xsb_efli.hh                  |     80 +
 interfaces/Prolog/XSB/xsb_pl_check.P               |     53 +-
 interfaces/Prolog/YAP/Makefile.am                  |     98 +-
 interfaces/Prolog/YAP/Makefile.in                  |    510 +-
 interfaces/Prolog/YAP/README.yap                   |     11 +
 .../Prolog/YAP/ppl_interface_generator_yap_cc.m4   |    137 +
 interfaces/Prolog/YAP/ppl_prolog_sysdep.hh         |     23 +
 interfaces/Prolog/YAP/ppl_yap.cc                   |    725 -
 interfaces/Prolog/YAP/ppl_yap.pl                   |      4 +-
 interfaces/Prolog/YAP/yap_cfli.hh                  |    348 +
 interfaces/Prolog/YAP/yap_clpq.pl                  |      4 +-
 interfaces/Prolog/YAP/yap_clpq2.pl                 |      4 +-
 interfaces/Prolog/YAP/yap_efli.cc                  |     86 +
 interfaces/Prolog/YAP/yap_efli.hh                  |     82 +
 interfaces/Prolog/YAP/yap_pl_check.pl              |      4 +-
 interfaces/Prolog/exceptions.hh                    |    174 -
 .../ppl_interface_generator_prolog_cc_code.m4      |   1797 +
 .../ppl_interface_generator_prolog_cc_files.m4     |     76 +
 .../Prolog/ppl_interface_generator_prolog_dox.m4   |     72 +
 .../ppl_interface_generator_prolog_dox_code.m4     |    336 +
 .../ppl_interface_generator_prolog_hh_code.m4      |    542 +
 .../ppl_interface_generator_prolog_hh_files.m4     |     63 +
 ...erface_generator_prolog_procedure_generators.m4 |     79 +
 .../ppl_interface_generator_prolog_systems.m4      |     78 +
 interfaces/Prolog/ppl_prolog.icc                   |   3483 -
 interfaces/Prolog/ppl_prolog_common.cc             |   2005 +
 interfaces/Prolog/ppl_prolog_common.defs.hh        |    926 +
 interfaces/Prolog/ppl_prolog_common.inlines.hh     |     26 +
 interfaces/Prolog/ppl_prolog_sysdep_dox            |    212 +
 interfaces/Prolog/ppl_prolog_sysindep_dox          |   1554 +
 interfaces/Prolog/tests/Makefile.am                |     47 +-
 interfaces/Prolog/tests/Makefile.in                |    271 +-
 interfaces/Prolog/tests/clpq.pl                    |      6 +-
 interfaces/Prolog/tests/clpq2.pl                   |     14 +-
 interfaces/Prolog/tests/expected_clpq2_int16       |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int16_a     |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int32       |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int32_a     |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int64       |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int64_a     |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int8        |      2 +-
 interfaces/Prolog/tests/expected_clpq2_int8_a      |      2 +-
 interfaces/Prolog/tests/expected_clpq2_mpz         |      2 +-
 interfaces/Prolog/tests/expected_clpq2_mpz_a       |      2 +-
 interfaces/Prolog/tests/expected_clpq_int16        |      2 +-
 interfaces/Prolog/tests/expected_clpq_int16_a      |      2 +-
 interfaces/Prolog/tests/expected_clpq_int32        |      2 +-
 interfaces/Prolog/tests/expected_clpq_int32_a      |      2 +-
 interfaces/Prolog/tests/expected_clpq_int64        |      2 +-
 interfaces/Prolog/tests/expected_clpq_int64_a      |      2 +-
 interfaces/Prolog/tests/expected_clpq_int8         |      2 +-
 interfaces/Prolog/tests/expected_clpq_int8_a       |      2 +-
 interfaces/Prolog/tests/expected_clpq_mpz          |      2 +-
 interfaces/Prolog/tests/expected_clpq_mpz_a        |      2 +-
 interfaces/Prolog/tests/expected_pchk_int8         |      2 -
 interfaces/Prolog/tests/expected_pchk_int8_a       |      2 -
 interfaces/Prolog/tests/pl_check.pl                |    568 +-
 interfaces/Prolog/tests/pl_grid_check.pl           |   2301 +
 ...ppl_interface_generator_predicate_check_code.m4 |   1903 +
 .../ppl_interface_generator_predicate_check_pl.m4  |    359 +
 .../Prolog/tests/ppl_predicate_check_common.pl     |    613 +
 interfaces/Prolog/track_allocation.hh              |    116 -
 interfaces/interfaced_boxes.hh                     |    115 +
 interfaces/marked_pointers.hh                      |     64 +
 interfaces/ppl_interface_generator_common.m4       |    621 +
 interfaces/ppl_interface_generator_common_dat.m4   |   1112 +
 ...erface_generator_common_procedure_generators.m4 |    143 +
 interfaces/ppl_interface_generator_copyright       |     20 +
 ltmain.sh                                          |  13217 ++-
 m4/Makefile.am                                     |     15 +-
 m4/Makefile.in                                     |    225 +-
 m4/ac_check_ciao.m4                                |     92 +
 m4/ac_check_classpath.m4                           |     63 +
 m4/ac_check_fpu_control.m4                         |      8 +-
 m4/ac_check_gmp.m4                                 |      6 +-
 m4/ac_check_sicstus_prolog.m4                      |      8 +-
 m4/ac_check_swi_prolog.m4                          |     13 +-
 m4/ac_check_xsb_prolog.m4                          |      6 +-
 m4/ac_cxx_attribute_weak.m4                        |      6 +-
 m4/ac_cxx_double_binary_format.m4                  |     12 +-
 m4/ac_cxx_flexible_arrays.m4                       |      6 +-
 m4/ac_cxx_float_binary_format.m4                   |     11 +-
 m4/ac_cxx_long_double_binary_format.m4             |     20 +-
 m4/ac_cxx_proper_long_double.m4                    |     62 +
 m4/ac_cxx_remainder_bug.m4                         |     71 +
 m4/ac_prog_jar.m4                                  |     53 +
 m4/ac_prog_java.m4                                 |    267 +
 m4/ac_prog_javac.m4                                |    143 +
 m4/ac_prog_javah.m4                                |     50 +
 m4/ac_text_md5sum.m4                               |      6 +-
 m4/ax_prefix_config_h.m4                           |    219 +
 m4/lib-link.m4                                     |    260 +-
 m4/lib-prefix.m4                                   |     40 +-
 m4/libtool.m4                                      |   7357 ++
 m4/ltoptions.m4                                    |    368 +
 m4/ltsugar.m4                                      |    123 +
 m4/ltversion.m4                                    |     23 +
 m4/lt~obsolete.m4                                  |     92 +
 m4/ppl.m4                                          |     59 +-
 m4/ppl_c.m4                                        |    285 +
 missing                                            |     66 +-
 mkinstalldirs                                      |      5 +-
 ppl.spec.in                                        |    185 -
 src/Any_Pointset.defs.hh                           |   1382 +
 src/Any_Pointset.inlines.hh                        |     38 +
 src/Any_Pointset.types.hh                          |     21 +
 src/BDS_Status.idefs.hh                            |     18 +-
 src/BDS_Status.inlines.hh                          |     17 +-
 src/BD_Shape.cc                                    |     15 +-
 src/BD_Shape.defs.hh                               |   1088 +-
 src/BD_Shape.inlines.hh                            |    442 +-
 src/BD_Shape.templates.hh                          |   4626 +-
 src/BD_Shape.types.hh                              |      2 +-
 src/BHRZ03_Certificate.cc                          |      6 +-
 src/BHRZ03_Certificate.defs.hh                     |      8 +-
 src/BHRZ03_Certificate.inlines.hh                  |      4 +-
 src/BHRZ03_Certificate.types.hh                    |      2 +-
 src/Bit_Matrix.cc                                  |    243 +
 src/Bit_Matrix.defs.hh                             |    179 +
 src/Bit_Matrix.inlines.hh                          |    151 +
 src/Bit_Matrix.types.hh                            |     21 +
 src/Bit_Row.cc                                     |    347 +
 src/Bit_Row.defs.hh                                |    222 +
 src/Bit_Row.inlines.hh                             |    150 +
 src/Bit_Row.types.hh                               |     21 +
 src/Boundary.defs.hh                               |    745 +
 src/Bounding_Box.cc                                |    158 -
 src/Bounding_Box.defs.hh                           |    207 -
 src/Bounding_Box.inlines.hh                        |    137 -
 src/Bounding_Box.types.hh                          |     21 -
 src/Box.cc                                         |     76 +
 src/Box.defs.hh                                    |   1998 +
 src/Box.inlines.hh                                 |    605 +
 src/Box.templates.hh                               |   3700 +
 src/Box.types.hh                                   |     22 +
 src/Box_Status.idefs.hh                            |    114 +
 src/Box_Status.inlines.hh                          |    227 +
 src/COPYING.cc.dist                                |    912 +-
 src/CREDITS.cc.dist                                |     81 +-
 src/C_Integer.hh                                   |    175 +
 src/C_Polyhedron.cc                                |     27 +-
 src/C_Polyhedron.defs.hh                           |    122 +-
 src/C_Polyhedron.inlines.hh                        |     66 +-
 src/C_Polyhedron.types.hh                          |      2 +-
 src/Checked_Number.cc                              |     10 +-
 src/Checked_Number.defs.hh                         |    661 +-
 src/Checked_Number.inlines.hh                      |    511 +-
 src/Checked_Number.templates.hh                    |    147 +
 src/Checked_Number.types.hh                        |      2 +-
 src/Coefficient.cc                                 |     45 +-
 src/Coefficient.defs.hh                            |     21 +-
 src/Coefficient.inlines.hh                         |     31 +-
 src/Coefficient.types.hh                           |     20 +-
 src/Coefficient_traits_template.hh                 |      4 +-
 src/Congruence.cc                                  |    105 +-
 src/Congruence.defs.hh                             |    117 +-
 src/Congruence.inlines.hh                          |    105 +-
 src/Congruence.types.hh                            |      2 +-
 src/Congruence_System.cc                           |    162 +-
 src/Congruence_System.defs.hh                      |     91 +-
 src/Congruence_System.inlines.hh                   |     58 +-
 src/Congruence_System.types.hh                     |      2 +-
 src/Constraint.cc                                  |    118 +-
 src/Constraint.defs.hh                             |    146 +-
 src/Constraint.inlines.hh                          |     58 +-
 src/Constraint.types.hh                            |      2 +-
 src/Constraint_System.cc                           |     42 +-
 src/Constraint_System.defs.hh                      |     42 +-
 src/Constraint_System.inlines.hh                   |     13 +-
 src/Constraint_System.types.hh                     |      2 +-
 src/DB_Matrix.defs.hh                              |     45 +-
 src/DB_Matrix.inlines.hh                           |    380 +-
 src/DB_Matrix.templates.hh                         |    317 +
 src/DB_Matrix.types.hh                             |      2 +-
 src/DB_Row.defs.hh                                 |     81 +-
 src/DB_Row.inlines.hh                              |    237 +-
 src/DB_Row.templates.hh                            |    212 +
 src/DB_Row.types.hh                                |      6 +-
 src/Determinate.defs.hh                            |     59 +-
 src/Determinate.inlines.hh                         |    176 +-
 src/Determinate.types.hh                           |      4 +-
 src/Float.cc                                       |      6 +-
 src/Float.defs.hh                                  |     47 +-
 src/Float.inlines.hh                               |     44 +-
 src/GMP_Integer.defs.hh                            |     36 +-
 src/GMP_Integer.inlines.hh                         |     41 +-
 src/GMP_Integer.types.hh                           |      5 +-
 src/Generator.cc                                   |     49 +-
 src/Generator.defs.hh                              |    229 +-
 src/Generator.inlines.hh                           |    186 +-
 src/Generator.types.hh                             |      2 +-
 src/Generator_System.cc                            |     51 +-
 src/Generator_System.defs.hh                       |     36 +-
 src/Generator_System.inlines.hh                    |     13 +-
 src/Generator_System.types.hh                      |      2 +-
 src/Grid.defs.hh                                   |    975 +-
 src/Grid.inlines.hh                                |    182 +-
 src/Grid.templates.hh                              |    364 +-
 src/Grid.types.hh                                  |      2 +-
 src/Grid_Certificate.cc                            |     18 +-
 src/Grid_Certificate.defs.hh                       |      8 +-
 src/Grid_Certificate.inlines.hh                    |      4 +-
 src/Grid_Certificate.types.hh                      |      2 +-
 src/Grid_Generator.cc                              |    133 +-
 src/Grid_Generator.defs.hh                         |    221 +-
 src/Grid_Generator.inlines.hh                      |    114 +-
 src/Grid_Generator.types.hh                        |      2 +-
 src/Grid_Generator_System.cc                       |    192 +-
 src/Grid_Generator_System.defs.hh                  |    201 +-
 src/Grid_Generator_System.inlines.hh               |    130 +-
 src/Grid_Generator_System.types.hh                 |      2 +-
 src/Grid_Status.cc                                 |     12 +-
 src/Grid_Status.idefs.hh                           |     18 +-
 src/Grid_Status.inlines.hh                         |      4 +-
 src/Grid_chdims.cc                                 |    131 +-
 src/Grid_conversion.cc                             |    257 +-
 src/Grid_nonpublic.cc                              |    245 +-
 src/Grid_public.cc                                 |   1196 +-
 src/Grid_simplify.cc                               |    485 +-
 src/Grid_widenings.cc                              |    322 +-
 src/H79_Certificate.cc                             |      6 +-
 src/H79_Certificate.defs.hh                        |      4 +-
 src/H79_Certificate.inlines.hh                     |      4 +-
 src/H79_Certificate.types.hh                       |      2 +-
 src/Has_Assign_Or_Swap.hh                          |     53 +
 src/Init.cc                                        |     60 +-
 src/Init.defs.hh                                   |     47 +-
 src/Init.inlines.hh                                |     47 +
 src/Init.types.hh                                  |      2 +-
 src/Interval.cc                                    |     55 -
 src/Interval.defs.hh                               |    975 +-
 src/Interval.inlines.hh                            |   1256 +-
 src/Interval.templates.hh                          |    208 +
 src/Interval.types.hh                              |      6 +-
 src/Interval_Info.defs.hh                          |    300 +
 src/Interval_Info.inlines.hh                       |    121 +
 src/Interval_Info.types.hh                         |     25 +
 src/Interval_Restriction.defs.hh                   |    867 +
 src/LP_Problem.cc                                  |   1035 -
 src/LP_Problem.defs.hh                             |    394 -
 src/LP_Problem.inlines.hh                          |    267 -
 src/LP_Problem.types.hh                            |     32 -
 src/Limits.hh                                      |     95 -
 src/Linear_Expression.cc                           |     46 +-
 src/Linear_Expression.defs.hh                      |    123 +-
 src/Linear_Expression.inlines.hh                   |     39 +-
 src/Linear_Expression.types.hh                     |      2 +-
 src/Linear_Row.cc                                  |     39 +-
 src/Linear_Row.defs.hh                             |     40 +-
 src/Linear_Row.inlines.hh                          |      4 +-
 src/Linear_Row.types.hh                            |      2 +-
 src/Linear_System.cc                               |     66 +-
 src/Linear_System.defs.hh                          |     97 +-
 src/Linear_System.inlines.hh                       |    106 +-
 src/Linear_System.types.hh                         |      2 +-
 src/MIP_Problem.cc                                 |   2122 +
 src/MIP_Problem.defs.hh                            |    749 +
 src/MIP_Problem.inlines.hh                         |    175 +
 src/MIP_Problem.templates.hh                       |    156 +
 src/MIP_Problem.types.hh                           |     32 +
 src/Makefile.am                                    |    130 +-
 src/Makefile.in                                    |    572 +-
 src/Matrix.cc                                      |     10 +-
 src/Matrix.defs.hh                                 |     41 +-
 src/Matrix.inlines.hh                              |      9 +-
 src/Matrix.types.hh                                |      2 +-
 src/NNC_Polyhedron.cc                              |     29 +-
 src/NNC_Polyhedron.defs.hh                         |    112 +-
 src/NNC_Polyhedron.inlines.hh                      |     62 +-
 src/NNC_Polyhedron.types.hh                        |      2 +-
 src/Numeric_Format.defs.hh                         |      4 +-
 src/OR_Matrix.defs.hh                              |    589 +
 src/OR_Matrix.inlines.hh                           |    716 +
 src/OR_Matrix.templates.hh                         |    124 +
 src/OR_Matrix.types.hh                             |     22 +
 src/Octagonal_Shape.cc                             |    100 +
 src/Octagonal_Shape.defs.hh                        |   1980 +
 src/Octagonal_Shape.inlines.hh                     |    774 +
 src/Octagonal_Shape.templates.hh                   |   6417 ++
 src/Octagonal_Shape.types.hh                       |     22 +
 src/Og_Status.idefs.hh                             |    110 +
 src/Og_Status.inlines.hh                           |    225 +
 src/Partially_Reduced_Product.defs.hh              |   1535 +
 src/Partially_Reduced_Product.inlines.hh           |    762 +
 src/Partially_Reduced_Product.templates.hh         |    462 +
 src/Partially_Reduced_Product.types.hh             |     31 +
 src/Ph_Status.cc                                   |     10 +-
 src/Ph_Status.idefs.hh                             |     18 +-
 src/Ph_Status.inlines.hh                           |      4 +-
 src/Pointset_Powerset.cc                           |    326 +
 src/Pointset_Powerset.defs.hh                      |   1449 +
 src/Pointset_Powerset.inlines.hh                   |    337 +
 src/Pointset_Powerset.templates.hh                 |   1556 +
 src/Pointset_Powerset.types.hh                     |     22 +
 src/Poly_Con_Relation.cc                           |      8 +-
 src/Poly_Con_Relation.defs.hh                      |     19 +-
 src/Poly_Con_Relation.inlines.hh                   |      4 +-
 src/Poly_Con_Relation.types.hh                     |      2 +-
 src/Poly_Gen_Relation.cc                           |      8 +-
 src/Poly_Gen_Relation.defs.hh                      |     19 +-
 src/Poly_Gen_Relation.inlines.hh                   |      4 +-
 src/Poly_Gen_Relation.types.hh                     |      2 +-
 src/Polyhedra_Powerset.cc                          |    143 -
 src/Polyhedra_Powerset.defs.hh                     |    553 -
 src/Polyhedra_Powerset.inlines.hh                  |    268 -
 src/Polyhedra_Powerset.templates.hh                |    684 -
 src/Polyhedra_Powerset.types.hh                    |     22 -
 src/Polyhedron.defs.hh                             |    591 +-
 src/Polyhedron.inlines.hh                          |    126 +-
 src/Polyhedron.templates.hh                        |    360 +-
 src/Polyhedron.types.hh                            |      2 +-
 src/Polyhedron_chdims.cc                           |     64 +-
 src/Polyhedron_nonpublic.cc                        |    116 +-
 src/Polyhedron_public.cc                           |   1368 +-
 src/Polyhedron_widenings.cc                        |    135 +-
 src/Powerset.defs.hh                               |    243 +-
 src/Powerset.inlines.hh                            |    196 +-
 src/Powerset.templates.hh                          |     20 +-
 src/Powerset.types.hh                              |      2 +-
 src/Ptr_Iterator.defs.hh                           |      8 +-
 src/Ptr_Iterator.inlines.hh                        |      4 +-
 src/Ptr_Iterator.types.hh                          |      2 +-
 src/Rational_Box.hh                                |     38 +
 src/Rational_Interval.hh                           |     56 +
 src/Result.defs.hh                                 |     16 +-
 src/Result.inlines.hh                              |     26 +-
 src/Rounding_Dir.defs.hh                           |     31 +-
 src/Rounding_Dir.inlines.hh                        |     70 +-
 src/Row.cc                                         |    110 +-
 src/Row.defs.hh                                    |     58 +-
 src/Row.inlines.hh                                 |     30 +-
 src/Row.types.hh                                   |      2 +-
 src/Saturation_Matrix.cc                           |    227 -
 src/Saturation_Matrix.defs.hh                      |    177 -
 src/Saturation_Matrix.inlines.hh                   |    145 -
 src/Saturation_Matrix.types.hh                     |     21 -
 src/Saturation_Row.cc                              |    347 -
 src/Saturation_Row.defs.hh                         |    239 -
 src/Saturation_Row.inlines.hh                      |    136 -
 src/Saturation_Row.types.hh                        |     21 -
 src/Scalar_Products.cc                             |     45 +-
 src/Scalar_Products.defs.hh                        |     23 +-
 src/Scalar_Products.inlines.hh                     |     19 +-
 src/Scalar_Products.types.hh                       |      2 +-
 src/Slow_Copy.hh                                   |     60 +
 src/Temp.defs.hh                                   |    160 +
 src/Temp.inlines.hh                                |    115 +
 src/Temp.templates.hh                              |     33 +
 src/Topology.hh                                    |      4 +-
 src/Variable.cc                                    |      8 +-
 src/Variable.defs.hh                               |     14 +-
 src/Variable.inlines.hh                            |      4 +-
 src/Variable.types.hh                              |      2 +-
 src/Variables_Set.cc                               |     90 +
 src/Variables_Set.defs.hh                          |    108 +
 src/Variables_Set.inlines.hh                       |     74 +
 src/Variables_Set.types.hh                         |     21 +
 src/Widening_Function.defs.hh                      |     12 +-
 src/Widening_Function.inlines.hh                   |      8 +-
 src/Widening_Function.types.hh                     |      2 +-
 src/algorithms.hh                                  |     16 +-
 src/assign_or_swap.hh                              |     69 +
 src/checked.cc                                     |     11 +-
 src/checked.defs.hh                                |    319 +-
 src/checked.inlines.hh                             |    447 +-
 src/checked_ext.inlines.hh                         |    422 +-
 src/checked_float.inlines.hh                       |    782 +-
 src/checked_int.inlines.hh                         |   1517 +-
 src/checked_mpq.inlines.hh                         |    310 +-
 src/checked_mpz.inlines.hh                         |    386 +-
 src/checked_numeric_limits.hh                      |     65 +-
 src/compiler.hh                                    |     26 +-
 src/conversion.cc                                  |     41 +-
 src/distances.defs.hh                              |     53 +
 src/distances.inlines.hh                           |    112 +
 src/distances.types.hh                             |     28 +
 src/fpu-c99.inlines.hh                             |     23 +-
 src/fpu-ia32.cc                                    |     67 +
 src/fpu-ia32.inlines.hh                            |    126 +-
 src/fpu-none.inlines.hh                            |     16 +-
 src/fpu-sparc.inlines.hh                           |     22 +-
 src/fpu.defs.hh                                    |     16 +-
 src/fpu.types.hh                                   |      8 +-
 src/globals.cc                                     |      9 +-
 src/globals.defs.hh                                |    294 +-
 src/globals.inlines.hh                             |     56 +-
 src/globals.types.hh                               |     10 +-
 src/initializer.hh                                 |     35 +-
 src/iterator_to_const.defs.hh                      |    221 +
 src/iterator_to_const.inlines.hh                   |    201 +
 src/iterator_to_const.types.hh                     |     25 +
 src/math_utilities.defs.hh                         |    110 +
 src/math_utilities.inlines.hh                      |    120 +
 src/max_space_dimension.hh                         |     48 +-
 src/meta_programming.hh                            |    338 +
 src/minimize.cc                                    |     22 +-
 src/mp_numeric_limits.hh                           |    157 -
 src/mp_std_bits.cc                                 |     72 +
 src/mp_std_bits.defs.hh                            |    169 +
 src/mp_std_bits.inlines.hh                         |     38 +
 src/namespaces.hh                                  |     10 +-
 src/ppl-config.cc                                  |     24 +-
 src/ppl-config.cc.in                               |     16 +-
 src/ppl.hh.dist                                    | 100030 ++++++++++++------
 src/ppl_header.hh                                  |     38 +-
 src/simplify.cc                                    |     25 +-
 src/swapping_sort.icc                              |      8 +-
 src/version.cc                                     |     14 +-
 src/version.hh.in                                  |      4 +-
 tests/BBox.cc                                      |    188 -
 tests/BBox.hh                                      |    129 -
 tests/BD_Shape/Makefile.am                         |    166 +-
 tests/BD_Shape/Makefile.in                         |    766 +-
 tests/BD_Shape/addconstraints1.cc                  |    142 +-
 tests/BD_Shape/addspacedims1.cc                    |    200 +-
 tests/BD_Shape/affinedimension1.cc                 |    270 +-
 tests/BD_Shape/affineimage1.cc                     |    297 +-
 tests/BD_Shape/affineimage2.cc                     |    190 +-
 tests/BD_Shape/affinepreimage1.cc                  |    373 +-
 tests/BD_Shape/affinepreimage2.cc                  |    253 -
 tests/BD_Shape/ascii_dump_load1.cc                 |     82 +-
 tests/BD_Shape/bdsdifference1.cc                   |    216 +-
 tests/BD_Shape/bdshull1.cc                         |    226 +-
 tests/BD_Shape/bgp99extrapolation1.cc              |      8 +-
 tests/BD_Shape/bhmz05widening1.cc                  |    244 +-
 tests/BD_Shape/bhz03widening1.cc                   |      8 +-
 tests/BD_Shape/bounded1.cc                         |     96 +
 tests/BD_Shape/boundedaffineimage1.cc              |    487 +
 tests/BD_Shape/boundedaffinepreimage1.cc           |    359 +
 tests/BD_Shape/bounds1.cc                          |    272 +
 tests/BD_Shape/cc76extrapolation1.cc               |    428 +-
 tests/BD_Shape/cc76narrowing1.cc                   |    148 +-
 tests/BD_Shape/closure1.cc                         |    214 +-
 tests/BD_Shape/concatenate1.cc                     |    114 +-
 tests/BD_Shape/congruences1.cc                     |    223 +
 tests/BD_Shape/constrains1.cc                      |    228 +
 tests/BD_Shape/constraints1.cc                     |    152 +-
 tests/BD_Shape/contains1.cc                        |    125 +-
 tests/BD_Shape/containsintegerpoint1.cc            |    134 +
 tests/BD_Shape/discrete1.cc                        |    214 +
 tests/BD_Shape/disjoint1.cc                        |    192 +
 tests/BD_Shape/empty1.cc                           |    162 +-
 tests/BD_Shape/equality1.cc                        |     78 +-
 tests/BD_Shape/expandspacedim1.cc                  |    245 +
 tests/BD_Shape/foldspacedims1.cc                   |    337 +
 tests/BD_Shape/frombdshape1.cc                     |    132 +
 tests/BD_Shape/frombox1.cc                         |    357 +
 tests/BD_Shape/fromgensys1.cc                      |     44 +-
 tests/BD_Shape/fromgrid1.cc                        |    201 +
 tests/BD_Shape/fromoctagonalshape1.cc              |     55 +
 tests/BD_Shape/frompolyhedron1.cc                  |     64 +
 tests/BD_Shape/fromspacedim1.cc                    |    122 +
 tests/BD_Shape/generalizedaffineimage1.cc          |    385 +-
 tests/BD_Shape/generalizedaffineimage2.cc          |    315 +-
 tests/BD_Shape/generalizedaffinepreimage1.cc       |    299 +-
 tests/BD_Shape/generalizedaffinepreimage2.cc       |    559 +-
 tests/BD_Shape/generalizedaffinepreimage3.cc       |    173 +
 tests/BD_Shape/geomcovers1.cc                      |     20 +-
 tests/BD_Shape/h79widening1.cc                     |     32 +-
 tests/BD_Shape/intersection1.cc                    |    282 +-
 tests/BD_Shape/limitedbhmz05extrapolation1.cc      |    252 +-
 tests/BD_Shape/limitedcc76extrapolation1.cc        |    361 +-
 tests/BD_Shape/limitedh79extrapolation1.cc         |     18 +-
 tests/BD_Shape/mapspacedims1.cc                    |    101 +-
 tests/BD_Shape/max_min1.cc                         |    780 +
 tests/BD_Shape/max_min2.cc                         |    439 +
 tests/BD_Shape/maxspacedim.cc                      |     92 -
 tests/BD_Shape/maxspacedim1.cc                     |     85 +
 tests/BD_Shape/membytes1.cc                        |    246 +
 tests/BD_Shape/minconstraints1.cc                  |     52 +-
 tests/BD_Shape/pointsetpowerset1.cc                |    565 +
 tests/BD_Shape/relations1.cc                       |    248 +-
 tests/BD_Shape/relations2.cc                       |    221 +-
 tests/BD_Shape/relations3.cc                       |    421 +-
 tests/BD_Shape/relations4.cc                       |    435 +
 tests/BD_Shape/removespacedims1.cc                 |    250 +-
 tests/BD_Shape/run_tests                           |     22 +
 tests/BD_Shape/timeelapse1.cc                      |    196 +-
 tests/BD_Shape/unconstrain1.cc                     |    228 +
 tests/BD_Shape/universe1.cc                        |     62 +-
 tests/BD_Shape/writebdshape1.cc                    |     98 +-
 tests/Box/Makefile.am                              |    304 +
 tests/Box/Makefile.in                              |   1598 +
 tests/Box/addconstraints1.cc                       |    288 +
 tests/Box/addspacedims1.cc                         |    333 +
 tests/Box/affinedimension1.cc                      |    291 +
 tests/Box/affineimage1.cc                          |    437 +
 tests/Box/affinepreimage1.cc                       |    181 +
 tests/Box/ascii_dump_load1.cc                      |    252 +
 tests/Box/bgp99extrapolation1.cc                   |     94 +
 tests/Box/bhz03widening1.cc                        |     78 +
 tests/Box/bounded1.cc                              |     96 +
 tests/Box/boundedaffineimage1.cc                   |    515 +
 tests/Box/boundedaffinepreimage1.cc                |    518 +
 tests/Box/boxdifference1.cc                        |    457 +
 tests/Box/boxhull1.cc                              |    265 +
 tests/Box/cc76narrowing1.cc                        |    208 +
 tests/Box/cc76widening.cc                          |     86 +
 tests/Box/concatenate1.cc                          |    237 +
 tests/Box/congruences1.cc                          |    537 +
 tests/Box/constrains1.cc                           |    187 +
 tests/Box/constraints1.cc                          |    165 +
 tests/Box/contains1.cc                             |    179 +
 tests/Box/containsintegerpoint1.cc                 |    219 +
 tests/Box/discrete1.cc                             |    205 +
 tests/Box/disjoint1.cc                             |    191 +
 tests/Box/empty1.cc                                |    225 +
 tests/Box/equality1.cc                             |    130 +
 tests/Box/expandspacedim1.cc                       |    244 +
 tests/Box/foldspacedims1.cc                        |    276 +
 tests/Box/frombdshape1.cc                          |     87 +
 tests/Box/frombox1.cc                              |    158 +
 tests/Box/fromgensys1.cc                           |    181 +
 tests/Box/fromgrid1.cc                             |    486 +
 tests/Box/frompartiallyreducedproduct1.cc          |    136 +
 tests/Box/frompolyhedron1.cc                       |    526 +
 tests/Box/frompolyhedron2.cc                       |    141 +
 tests/Box/fromspacedim1.cc                         |    110 +
 tests/Box/generalizedaffineimage1.cc               |    632 +
 tests/Box/generalizedaffineimage2.cc               |    608 +
 tests/Box/generalizedaffinepreimage1.cc            |    474 +
 tests/Box/geomcovers1.cc                           |     71 +
 tests/Box/intersection1.cc                         |    462 +
 tests/Box/mapspacedims1.cc                         |    288 +
 tests/Box/max_min1.cc                              |    773 +
 tests/Box/maxspacedim1.cc                          |     58 +
 tests/Box/membytes1.cc                             |    111 +
 tests/Box/minconstraints1.cc                       |     94 +
 tests/Box/pointsetpowerset1.cc                     |    544 +
 tests/Box/pointsetpowerset2.cc                     |    478 +
 tests/Box/refinewithcongruences1.cc                |    403 +
 tests/Box/refinewithconstraint1.cc                 |    127 +
 tests/Box/refinewithconstraint2.cc                 |     80 +
 tests/Box/refinewithconstraints1.cc                |    611 +
 tests/Box/refinewithconstraints2.cc                |    444 +
 tests/Box/relations1.cc                            |    470 +
 tests/Box/relations2.cc                            |    442 +
 tests/Box/relations3.cc                            |    401 +
 tests/Box/relations4.cc                            |    485 +
 tests/Box/removespacedims1.cc                      |    367 +
 tests/Box/run_tests                                |     52 +
 tests/Box/timeelapse1.cc                           |    207 +
 tests/Box/topclosed1.cc                            |    205 +
 tests/Box/unconstrain1.cc                          |    229 +
 tests/Box/universe1.cc                             |     89 +
 tests/Box/writebox1.cc                             |     78 +
 tests/FCAIBVP.cc                                   |     47 +
 tests/FCAIBVP.defs.hh                              |     94 +
 tests/FCAIBVP.inlines.hh                           |    129 +
 tests/FCAIBVP.types.hh                             |     21 +
 tests/Grid/Makefile.am                             |    145 +-
 tests/Grid/Makefile.in                             |   1061 +-
 tests/Grid/addcongruence1.cc                       |     46 +-
 tests/Grid/addcongruences1.cc                      |     79 +-
 tests/Grid/addconstraint1.cc                       |     17 +-
 tests/Grid/addconstraints1.cc                      |     78 +-
 tests/Grid/addgenerator1.cc                        |    110 +-
 tests/Grid/addgenerators1.cc                       |    165 +-
 tests/Grid/addspacedims1.cc                        |     89 +-
 tests/Grid/affinedim1.cc                           |    104 +-
 tests/Grid/affineimage1.cc                         |    127 +-
 tests/Grid/affineimage2.cc                         |    144 +-
 tests/Grid/affinepreimage1.cc                      |    159 +-
 tests/Grid/affinepreimage2.cc                      |     64 +-
 tests/Grid/asciidumpload1.cc                       |    466 +-
 tests/Grid/asciidumpload2.cc                       |    494 +
 tests/Grid/asciidumpload3.cc                       |    123 +
 tests/Grid/asciidumpload4.cc                       |    144 +
 tests/Grid/asciidumpload5.cc                       |    154 +
 tests/Grid/asciidumpload6.cc                       |    144 +
 tests/Grid/asciidumpload7.cc                       |    239 +
 tests/Grid/bhz03widening1.cc                       |     11 +-
 tests/Grid/bounded1.cc                             |    132 +-
 tests/Grid/boundedaffineimage1.cc                  |    184 +
 tests/Grid/boundedaffinepreimage1.cc               |    184 +
 tests/Grid/boundingbox1.cc                         |    274 +-
 tests/Grid/boundingbox2.cc                         |    520 -
 tests/Grid/bounds1.cc                              |    120 +-
 tests/Grid/certificate1.cc                         |     30 +-
 tests/Grid/concatenate1.cc                         |     17 +-
 tests/Grid/congruence1.cc                          |    145 +-
 tests/Grid/congruences1.cc                         |    197 +-
 tests/Grid/congruences2.cc                         |    336 +
 tests/Grid/congruencesystem1.cc                    |    419 -
 tests/Grid/constraints1.cc                         |    353 +
 tests/Grid/contains1.cc                            |     22 +-
 tests/Grid/containsintegerpoint1.cc                |    289 +
 tests/Grid/copyconstruct1.cc                       |     70 -
 tests/Grid/coveringbox1.cc                         |    137 +-
 tests/Grid/coveringbox2.cc                         |    445 +-
 tests/Grid/discrete1.cc                            |    107 +-
 tests/Grid/disjoint1.cc                            |     54 +-
 tests/Grid/equals1.cc                              |     80 +-
 tests/Grid/expandspacedim1.cc                      |     28 +-
 tests/Grid/foldspacedims1.cc                       |     28 +-
 tests/Grid/frombdshape1.cc                         |     53 +
 tests/Grid/fromgrid1.cc                            |    101 +
 tests/Grid/fromoctagonalshape1.cc                  |     53 +
 tests/Grid/frompolyhedron1.cc                      |    342 +
 tests/Grid/generalizedaffineimage1.cc              |    144 +-
 tests/Grid/generalizedaffineimage2.cc              |    173 +-
 tests/Grid/generalizedaffineimage3.cc              |    376 +
 tests/Grid/generalizedaffinepreimage1.cc           |    197 +-
 tests/Grid/generalizedaffinepreimage2.cc           |    129 +-
 tests/Grid/generalizedaffinepreimage3.cc           |    461 +
 tests/Grid/generator1.cc                           |    304 +-
 tests/Grid/generators1.cc                          |    225 +-
 tests/Grid/generators2.cc                          |     55 +
 tests/Grid/grid1.cc                                |    362 +-
 tests/Grid/grid2.cc                                |    107 +-
 tests/Grid/grid3.cc                                |    356 +-
 tests/Grid/griddifference1.cc                      |     38 +-
 tests/Grid/intersection1.cc                        |     34 +-
 tests/Grid/isempty1.cc                             |      6 +-
 tests/Grid/isuniverse1.cc                          |      4 +-
 tests/Grid/join1.cc                                |     98 +-
 tests/Grid/join2.cc                                |     88 +-
 tests/Grid/limitedextrapolation1.cc                |    112 +-
 tests/Grid/limitedextrapolation2.cc                |    498 +
 tests/Grid/limitedextrapolation3.cc                |    498 +
 tests/Grid/mapspacedims1.cc                        |     26 +-
 tests/Grid/maxmin1.cc                              |    176 +-
 tests/Grid/membytes1.cc                            |     28 +-
 tests/Grid/mincongruences1.cc                      |     13 +-
 tests/Grid/mingenerators1.cc                       |     38 +-
 tests/Grid/outputoperator1.cc                      |     33 +-
 tests/Grid/outputoperator2.cc                      |     99 +
 tests/Grid/outputoperator3.cc                      |     90 +
 tests/Grid/partition1.cc                           |    108 +
 tests/Grid/pointsetpowerset1.cc                    |    481 +
 tests/Grid/powersetdifference1.cc                  |    314 +
 tests/Grid/powersetgeometricallycovers1.cc         |    180 +
 tests/Grid/powersetgeometricallyequals1.cc         |    113 +
 tests/Grid/refinewithcongruences1.cc               |    135 +
 tests/Grid/refinewithconstraints1.cc               |    132 +
 tests/Grid/relations1.cc                           |    208 +-
 tests/Grid/relations2.cc                           |    183 +-
 tests/Grid/relations3.cc                           |    462 +
 tests/Grid/removespacedims1.cc                     |    269 +-
 tests/Grid/removespacedims2.cc                     |    334 +
 tests/Grid/timeelapse1.cc                          |     40 +-
 tests/Grid/topclosed1.cc                           |    128 +-
 tests/Grid/topclosure1.cc                          |      4 +-
 tests/Grid/unconstrain1.cc                         |    229 +
 tests/Grid/widening1.cc                            |    131 +-
 tests/Grid/widening2.cc                            |    485 +
 tests/Grid/widening3.cc                            |    314 +
 tests/Grid/writecongruencesystem.cc                |      7 +-
 tests/MIP_Problem/Makefile.am                      |     85 +
 tests/MIP_Problem/Makefile.in                      |    717 +
 tests/MIP_Problem/ascii_dump_load1.cc              |    417 +
 tests/MIP_Problem/exceptions1.cc                   |    507 +
 tests/MIP_Problem/mipproblem1.cc                   |   1699 +
 tests/MIP_Problem/mipproblem2.cc                   |    157 +
 tests/MIP_Problem/mipproblem3.cc                   |    894 +
 tests/Makefile.am                                  |     22 +-
 tests/Makefile.in                                  |    320 +-
 tests/Octagonal_Shape/Makefile.am                  |    277 +
 tests/Octagonal_Shape/Makefile.in                  |   1509 +
 tests/Octagonal_Shape/addspacedims1.cc             |    234 +
 tests/Octagonal_Shape/affinedimension1.cc          |    305 +
 tests/Octagonal_Shape/affineimage1.cc              |    459 +
 tests/Octagonal_Shape/affineimage2.cc              |    553 +
 tests/Octagonal_Shape/affinepreimage1.cc           |    293 +
 tests/Octagonal_Shape/affinepreimage2.cc           |    425 +
 tests/Octagonal_Shape/ascii_dump_load1.cc          |    330 +
 tests/Octagonal_Shape/bhmz05widening1.cc           |    708 +
 tests/Octagonal_Shape/bhz03widening1.cc            |     76 +
 tests/Octagonal_Shape/bounded1.cc                  |    130 +
 tests/Octagonal_Shape/boundedaffineimage1.cc       |    601 +
 tests/Octagonal_Shape/boundedaffinepreimage1.cc    |    572 +
 tests/Octagonal_Shape/bounds1.cc                   |    311 +
 tests/Octagonal_Shape/cc76extrapolation1.cc        |    516 +
 tests/Octagonal_Shape/cc76narrowing1.cc            |    264 +
 tests/Octagonal_Shape/chinainit.cc                 |     75 +
 tests/Octagonal_Shape/concatenate1.cc              |    282 +
 tests/Octagonal_Shape/congruences1.cc              |    228 +
 tests/Octagonal_Shape/constrains1.cc               |    231 +
 tests/Octagonal_Shape/constraints1.cc              |    375 +
 tests/Octagonal_Shape/contains1.cc                 |    349 +
 tests/Octagonal_Shape/containsintegerpoint1.cc     |    195 +
 tests/Octagonal_Shape/discrete1.cc                 |    212 +
 tests/Octagonal_Shape/disjoint1.cc                 |    189 +
 tests/Octagonal_Shape/empty1.cc                    |    130 +
 tests/Octagonal_Shape/expandspacedim1.cc           |    294 +
 tests/Octagonal_Shape/foldspacedims1.cc            |    441 +
 tests/Octagonal_Shape/frombdshape1.cc              |     54 +
 tests/Octagonal_Shape/frombox1.cc                  |    357 +
 tests/Octagonal_Shape/fromgensys1.cc               |    270 +
 tests/Octagonal_Shape/fromgrid1.cc                 |    201 +
 tests/Octagonal_Shape/fromoctagonalshape1.cc       |    132 +
 tests/Octagonal_Shape/frompolyhedron1.cc           |    244 +
 tests/Octagonal_Shape/fromspacedim1.cc             |    122 +
 tests/Octagonal_Shape/generalizedaffineimage1.cc   |    603 +
 tests/Octagonal_Shape/generalizedaffineimage2.cc   |    356 +
 tests/Octagonal_Shape/generalizedaffineimage3.cc   |    592 +
 tests/Octagonal_Shape/generalizedaffineimage4.cc   |    380 +
 tests/Octagonal_Shape/generalizedaffineimage5.cc   |    343 +
 .../Octagonal_Shape/generalizedaffinepreimage1.cc  |    617 +
 .../Octagonal_Shape/generalizedaffinepreimage2.cc  |    619 +
 .../Octagonal_Shape/generalizedaffinepreimage3.cc  |    617 +
 .../Octagonal_Shape/generalizedaffinepreimage4.cc  |    637 +
 tests/Octagonal_Shape/intersection1.cc             |    376 +
 .../Octagonal_Shape/limitedbhmz05extrapolation1.cc |    339 +
 tests/Octagonal_Shape/limitedcc76extrapolation1.cc |    660 +
 tests/Octagonal_Shape/mapspacedims1.cc             |    262 +
 tests/Octagonal_Shape/max_min1.cc                  |    691 +
 tests/Octagonal_Shape/max_min2.cc                  |    310 +
 tests/Octagonal_Shape/maxspacedim1.cc              |     86 +
 tests/Octagonal_Shape/membytes1.cc                 |    233 +
 tests/Octagonal_Shape/minconstraints1.cc           |    134 +
 tests/Octagonal_Shape/octdifference1.cc            |    257 +
 tests/Octagonal_Shape/octhull1.cc                  |    392 +
 tests/Octagonal_Shape/pointsetpowerset1.cc         |    488 +
 tests/Octagonal_Shape/relatwithcons1.cc            |    595 +
 tests/Octagonal_Shape/relatwithcons2.cc            |    475 +
 tests/Octagonal_Shape/relatwithcons3.cc            |    508 +
 tests/Octagonal_Shape/relatwithgen1.cc             |    495 +
 tests/Octagonal_Shape/removespacedims1.cc          |    374 +
 tests/Octagonal_Shape/run_tests                    |     52 +
 tests/Octagonal_Shape/timeelapse1.cc               |    371 +
 tests/Octagonal_Shape/unconstrain1.cc              |    228 +
 tests/Octagonal_Shape/universe1.cc                 |    111 +
 tests/Octagonal_Shape/writeoctagon1.cc             |    210 +
 tests/Partial_Function.cc                          |      5 +-
 tests/Partial_Function.defs.hh                     |      4 +-
 tests/Partial_Function.inlines.hh                  |      4 +-
 tests/Partial_Function.types.hh                    |      2 +-
 tests/Partially_Reduced_Product/Makefile.am        |     68 +
 tests/Partially_Reduced_Product/Makefile.in        |    769 +
 tests/Partially_Reduced_Product/directproduct1.cc  |    606 +
 tests/Partially_Reduced_Product/directproduct2.cc  |    505 +
 tests/Partially_Reduced_Product/directproduct3.cc  |    793 +
 tests/Partially_Reduced_Product/directproduct4.cc  |    358 +
 tests/Partially_Reduced_Product/directproduct5.cc  |    601 +
 tests/Partially_Reduced_Product/directproduct6.cc  |    640 +
 .../partiallyreducedproduct1.cc                    |    835 +
 .../partiallyreducedproduct2.cc                    |    893 +
 .../partiallyreducedproduct3.cc                    |    755 +
 .../partiallyreducedproduct4.cc                    |    278 +
 tests/Polyhedron/Makefile.am                       |    440 +-
 tests/Polyhedron/Makefile.in                       |   2550 +-
 tests/Polyhedron/README                            |      6 +-
 tests/Polyhedron/addcongruence1.cc                 |    111 +-
 tests/Polyhedron/addcongruences1.cc                |    106 +-
 tests/Polyhedron/addconstraint1.cc                 |      8 +-
 tests/Polyhedron/addconstraints1.cc                |     28 +-
 tests/Polyhedron/addconstraints2.cc                |      6 +-
 tests/Polyhedron/addgenerator1.cc                  |      6 +-
 tests/Polyhedron/addgenerator2.cc                  |      8 +-
 tests/Polyhedron/addgenerators1.cc                 |     28 +-
 tests/Polyhedron/addgenerators2.cc                 |      6 +-
 tests/Polyhedron/addspacedims1.cc                  |     18 +-
 tests/Polyhedron/addspacedims2.cc                  |     16 +-
 tests/Polyhedron/affineimage1.cc                   |     34 +-
 tests/Polyhedron/affineimage2.cc                   |      4 +-
 tests/Polyhedron/affinepreimage1.cc                |     54 +-
 tests/Polyhedron/affinetrans.cc                    |      4 +-
 tests/Polyhedron/append1.cc                        |     21 +-
 tests/Polyhedron/append2.cc                        |     21 +-
 tests/Polyhedron/ascii_dump_load1.cc               |      4 +-
 tests/Polyhedron/ascii_dump_load2.cc               |      4 +-
 tests/Polyhedron/ascii_dump_load3.cc               |      4 +-
 tests/Polyhedron/bgp99extrapolation1.cc            |     20 +-
 tests/Polyhedron/bhrz03widening1.cc                |     42 +-
 tests/Polyhedron/bhrz03widening2.cc                |     18 +-
 tests/Polyhedron/bhrz03widening3.cc                |     57 +-
 tests/Polyhedron/bhz03widening1.cc                 |     74 +-
 tests/Polyhedron/bounded1.cc                       |      4 +-
 tests/Polyhedron/boundedaffineimage1.cc            |    133 +-
 tests/Polyhedron/boundedaffinepreimage1.cc         |     18 +-
 tests/Polyhedron/boundedbhrz03extrapolation1.cc    |      6 +-
 tests/Polyhedron/boundedh79extrapolation1.cc       |      6 +-
 tests/Polyhedron/boundingbox1.cc                   |    594 -
 tests/Polyhedron/boundingbox2.cc                   |     50 -
 tests/Polyhedron/boundingbox3.cc                   |    218 -
 tests/Polyhedron/bounds1.cc                        |      4 +-
 tests/Polyhedron/bug2.cc                           |     62 -
 tests/Polyhedron/cnncconversion1.cc                |     54 +-
 tests/Polyhedron/concatenate1.cc                   |     26 +-
 tests/Polyhedron/congruences1.cc                   |    323 +-
 tests/Polyhedron/constrains1.cc                    |    232 +
 tests/Polyhedron/constraints1.cc                   |      6 +-
 tests/Polyhedron/contains1.cc                      |      4 +-
 tests/Polyhedron/contains2.cc                      |      4 +-
 tests/Polyhedron/containsintegerpoint1.cc          |    127 +
 tests/Polyhedron/disjoint1.cc                      |      4 +-
 tests/Polyhedron/disjoint2.cc                      |      4 +-
 tests/Polyhedron/dualhypercubes.cc                 |    271 +-
 tests/Polyhedron/empty1.cc                         |      4 +-
 tests/Polyhedron/equals1.cc                        |      4 +-
 tests/Polyhedron/exceptions1.cc                    |    768 +-
 tests/Polyhedron/exceptions2.cc                    |    545 +-
 tests/Polyhedron/exceptions3.cc                    |    130 +-
 tests/Polyhedron/expandspacedim1.cc                |     20 +-
 tests/Polyhedron/expandspacedim2.cc                |      8 +-
 tests/Polyhedron/foldspacedims1.cc                 |     22 +-
 tests/Polyhedron/foldspacedims2.cc                 |     18 +-
 tests/Polyhedron/frombdshape1.cc                   |     56 +
 tests/Polyhedron/frombox1.cc                       |    258 +
 tests/Polyhedron/frombox2.cc                       |    111 +
 tests/Polyhedron/fromgrid1.cc                      |    201 +
 tests/Polyhedron/fromoctagonalshape1.cc            |     55 +
 tests/Polyhedron/generalizedaffineimage1.cc        |     74 +-
 tests/Polyhedron/generalizedaffineimage2.cc        |    118 +-
 tests/Polyhedron/generalizedaffinepreimage1.cc     |     28 +-
 tests/Polyhedron/generalizedaffinepreimage2.cc     |     10 +-
 tests/Polyhedron/generators1.cc                    |      4 +-
 tests/Polyhedron/geomcovers1.cc                    |     10 +-
 tests/Polyhedron/h79widening1.cc                   |     81 +-
 tests/Polyhedron/h79widening2.cc                   |      6 +-
 tests/Polyhedron/hybrid.cc                         |    868 +
 tests/Polyhedron/intersection1.cc                  |     35 +-
 tests/Polyhedron/limitedbhrz03extrapolation1.cc    |     21 +-
 tests/Polyhedron/limitedh79extrapolation1.cc       |     36 +-
 tests/Polyhedron/linearpartition1.cc               |     95 +-
 tests/Polyhedron/linearsystem1.cc                  |      7 +-
 tests/Polyhedron/linexpression1.cc                 |      4 +-
 tests/Polyhedron/lpproblem1.cc                     |    764 -
 tests/Polyhedron/mapspacedims1.cc                  |     64 +-
 tests/Polyhedron/matrix1.cc                        |     35 +-
 tests/Polyhedron/max_min1.cc                       |     47 +-
 tests/Polyhedron/maxspacedim1.cc                   |    115 +-
 tests/Polyhedron/mc91.cc                           |     14 +-
 tests/Polyhedron/membytes1.cc                      |     89 +-
 tests/Polyhedron/membytes2.cc                      |     92 -
 tests/Polyhedron/memory1.cc                        |     56 +-
 tests/Polyhedron/memory2.cc                        |     22 +-
 tests/Polyhedron/minconstraints1.cc                |      4 +-
 tests/Polyhedron/minconstraints2.cc                |      4 +-
 tests/Polyhedron/mingenerators1.cc                 |      4 +-
 tests/Polyhedron/mingenerators2.cc                 |      4 +-
 tests/Polyhedron/nncminimize1.cc                   |     30 +-
 tests/Polyhedron/nncminimize2.cc                   |      4 +-
 tests/Polyhedron/numberinput1.cc                   |     38 +-
 tests/Polyhedron/onepoint.cc                       |      4 +-
 tests/Polyhedron/permute.cc                        |      6 +-
 tests/Polyhedron/polydifference1.cc                |     33 +-
 tests/Polyhedron/polydifference2.cc                |     35 +-
 tests/Polyhedron/polyhull1.cc                      |     30 +-
 tests/Polyhedron/polyhull2.cc                      |      4 +-
 tests/Polyhedron/polypowerset1.cc                  |    382 -
 tests/Polyhedron/powerset1.cc                      |    249 -
 tests/Polyhedron/randphull1.cc                     |    160 +-
 tests/Polyhedron/randphull2.cc                     |    131 -
 tests/Polyhedron/refinewithcongruence1.cc          |    105 +
 tests/Polyhedron/refinewithcongruences1.cc         |    336 +
 tests/Polyhedron/refinewithconstraint1.cc          |    108 +
 tests/Polyhedron/refinewithconstraints1.cc         |    322 +
 tests/Polyhedron/relations1.cc                     |     56 +-
 tests/Polyhedron/relations2.cc                     |    102 +-
 tests/Polyhedron/relations3.cc                     |     26 +-
 tests/Polyhedron/removespacedims1.cc               |     16 +-
 tests/Polyhedron/removespacedims2.cc               |      8 +-
 tests/Polyhedron/simplifyusingcontext1.cc          |    644 +
 tests/Polyhedron/smm1.cc                           |     90 +-
 tests/Polyhedron/timeelapse1.cc                    |     46 +-
 tests/Polyhedron/timeelapse2.cc                    |     22 +-
 tests/Polyhedron/topclosed1.cc                     |      4 +-
 tests/Polyhedron/topclosure1.cc                    |     18 +-
 tests/Polyhedron/unconstrain1.cc                   |    228 +
 tests/Polyhedron/universe1.cc                      |     16 +-
 tests/Polyhedron/universe2.cc                      |     12 +-
 tests/Polyhedron/variablesset1.cc                  |    159 +
 tests/Polyhedron/watchdog1.cc                      |      4 +-
 tests/Polyhedron/writeconsys1.cc                   |     60 +-
 tests/Polyhedron/writegensys1.cc                   |     48 +-
 tests/Polyhedron/writepolyhedron1.cc               |     36 +-
 tests/Polyhedron/writepolyhedron2.cc               |     25 +-
 tests/Polyhedron/writerelation1.cc                 |    105 +-
 tests/Polyhedron/writevariable1.cc                 |      4 +-
 tests/Powerset/Makefile.am                         |     70 +
 tests/Powerset/Makefile.in                         |    739 +
 tests/Powerset/pointsetpowerset1.cc                |    508 +
 tests/Powerset/pointsetpowerset2.cc                |    504 +
 tests/Powerset/pointsetpowerset3.cc                |    381 +
 tests/Powerset/pointsetpowerset4.cc                |    686 +
 tests/Powerset/pointsetpowerset5.cc                |    629 +
 tests/Powerset/pointsetpowerset6.cc                |    372 +
 tests/Powerset/powerset1.cc                        |    177 +
 tests/Powerset/product1.cc                         |     72 +
 tests/Powerset/simplifyusingcontext1.cc            |    392 +
 tests/Random_Number_Generator.defs.hh              |      4 +-
 tests/Random_Number_Generator.inlines.hh           |      6 +-
 tests/Random_Number_Generator.types.hh             |      2 +-
 tests/files.cc                                     |      7 +-
 tests/files.hh                                     |      4 +-
 tests/ppl_test.cc                                  |     51 +-
 tests/ppl_test.hh                                  |    717 +-
 tests/print.cc                                     |      6 +-
 tests/print.hh                                     |     69 +-
 utils/Makefile.am                                  |     12 +-
 utils/Makefile.in                                  |    271 +-
 utils/build_header.in                              |      4 +-
 utils/cm_cleaner.sh                                |     37 +
 utils/cm_splitter.sh                               |     43 +
 utils/text2cxxarray.in                             |      4 +-
 utils/timings.cc                                   |     26 +-
 utils/timings.hh                                   |      4 +-
 1339 files changed, 520601 insertions(+), 167694 deletions(-)

diff --git a/COPYING b/COPYING
index 3912109..94a9ed0 100644
--- a/COPYING
+++ b/COPYING
@@ -1,285 +1,626 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
 
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-			    Preamble
+                            Preamble
 
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
 your programs, 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.
+them 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 software, or if you modify it.
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
 
   For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
 
   The precise terms and conditions for copying, distribution and
 modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-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 give any other recipients of the Program a copy of this License
-along with the Program.
-
-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.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-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 Program, 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 Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) 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; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, 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 executable.  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.
-
-If distribution of executable or 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 counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program 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.
-
-  5. 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 Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program 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
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
 this License.
 
-  7. 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
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program 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 Program.
-
-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.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program 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.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 Program
-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 Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, 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
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	    How to Apply These Terms to Your New Programs
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
 
   If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
@@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
 
   To do so, attach the following notices to the program.  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
+state 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 program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>
 
-    This program is free software; you can redistribute it and/or modify
+    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
+    the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
 
     This program is distributed in the hope that it will be useful,
@@ -304,37 +645,30 @@ the "copyright" line and a pointer to where the full notice is found.
     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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 Also add information on how to contact you by electronic and paper mail.
 
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
 
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.
 
 The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/CREDITS b/CREDITS
index 8bc4e84..874a8da 100644
--- a/CREDITS
+++ b/CREDITS
@@ -47,14 +47,6 @@ Current contributors:
                         widening operators for weakly relational
                         domains.  She is still working on this.
 
-  David Merchat         [5] (University of Parma) is helping us with
-                        the generation of the library's documentation
-                        using Doxygen.
-
-  Matthew Mundell       [6] (University of Leeds) is working on the
-                        implementation of rational grids.  He also
-                        helps on other implementation issues.
-
   Andrea Pescetti       (University of Parma) is helping with the
                         library's documentation.  Andrea was also one
                         of the four students with which the PPL
@@ -64,7 +56,7 @@ Current contributors:
                         implementation of bounded differences
                         and octagons.
 
-  Alessandro Zaccagnini [7] (University of Parma) has helped with
+  Alessandro Zaccagnini [5] (University of Parma) has helped with
                         the efficient implementation of GCD and LCM
                         for checked numbers.  He is now working on the
                         definitions of interval arithmetic operations.
@@ -99,6 +91,14 @@ Past contributors:
   Maximiliano Marchesi  (University of Parma) helped to improve the
                         documentation for bounded differences.
 
+  David Merchat         (formerly at the University of Parma) helped us
+                        with the generation of the library's documentation
+                        using Doxygen.
+
+  Matthew Mundell       [6] (formerly at the University of Leeds) worked
+                        on the implementation of rational grids.  He has
+                        also helped on other implementation issues.
+
   Angela Stazzone       (former student of the University of Parma)
                         worked on the library's documentation.
 
@@ -128,36 +128,36 @@ The following people have given important help to the project:
                         and/or refresh the notions needed for
                         developing the PPL library.
 
-  Marco Comini          [8] (University of Udine) allowed us to use his
+  Marco Comini          [7] (University of Udine) allowed us to use his
                         Mac OS X machine to work on portability to
                         that platform.
 
-  Bruno Haible          [9] (ILOG) made it possible (by writing the
+  Bruno Haible          [8] (ILOG) made it possible (by writing the
                         AC_LIB_LINKFLAGS macro and explaining how
                         to use it) to allow the use of versions of the
                         GMP library installed into nonstandard places.
 
-  Bertrand Jeannet      [10] (IRISA) wrote the New Polka library [11]
+  Bertrand Jeannet      [9] (IRISA) wrote the New Polka library [10]
                         and made it available.
 
   Herve' Le Verge       (r.i.p.) wrote and published an implementation
-                        [12] of the Chernikova's algorithm [13] that
+                        [11] of the Chernikova's algorithm [12] that
                         has set the stage for subsequent
                         implementation work, including our own.
 
-  Francesco Logozzo     [14] (Ecole Polytechnique) helped us straighten
+  Francesco Logozzo     [13] (Ecole Polytechnique) helped us straighten
                         out some portability issues on Cygwin.
 
-  Costantino Medori     [15] (University of Parma) helped us on the
+  Costantino Medori     [14] (University of Parma) helped us on the
                         mathematical aspects of the development.
 
-  Fred Mesnard          [16] (University of La Reunion), the main author
-                        of cTI [17], has worked with us at one of the
+  Fred Mesnard          [15] (University of La Reunion), the main author
+                        of cTI [16], has worked with us at one of the
                         first applications of the PPL: the "cTI"
                         data-flow analyzer, which performs a linear
                         size relation analysis using a domain of
                         convex polyhedra.  The China data-flow
-                        analyzer [18] uses the Parma Polyhedra Library
+                        analyzer [17] uses the Parma Polyhedra Library
                         to perform the same analysis.  We have been
                         running China against an old version of cTI
                         that did not use the PPL, using them to
@@ -174,26 +174,26 @@ organizations:
      ``Pure and Applied Mathematics'';
 
   2. MURST project ``Automatic Program Certification by Abstract
-     Interpretation'' [19];
+     Interpretation'' [18];
 
   3. MURST project ``Abstract Interpretation, Type Systems and
      Control-Flow Analysis''.
 
   4. MURST project ``Automatic Aggregate- and Number-Reasoning for
      Computing: from Decision Algorithms to Constraint Programming
-     with Multisets, Sets, and Maps'' [20].
+     with Multisets, Sets, and Maps'' [19].
 
   5. MURST project ``Constraint Based Verification of Reactive
-     Systems'' [21].
+     Systems'' [20].
 
   6. MURST project ``AIDA - Abstract Interpretation: Design and
-     Applications'' [22].
+     Applications'' [21].
 
   7. Royal Society Joint project 2004/R1-EU (UK-Italy)
      ``Automatic Detection of Unstable Numerical Computations''.
 
   8. EPSRC (UK) project EP/C520726/1
-     ``Numerical Domains for Software Analysis'' [23].
+     ``Numerical Domains for Software Analysis'' [22].
 
 --------
 
@@ -201,22 +201,21 @@ organizations:
  [2] http://www.comp.leeds.ac.uk/hill/
  [3] http://www.cs.unipr.it/~zaffanella/
  [4] http://www.comp.leeds.ac.uk/katyd/
- [5] http://www.cs.unipr.it/~merchat/
+ [5] http://www.math.unipr.it/~zaccagni/
  [6] http://www.mundell.ukfsn.org/
- [7] http://www.math.unipr.it/~zaccagni/
- [8] http://www.dimi.uniud.it/~comini/
- [9] http://www.haible.de/bruno/
-[10] http://www.irisa.fr/prive/Bertrand.Jeannet/
-[11] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html
-[12] http://www.cs.unipr.it/ppl/Documentation/chernikova.c
-[13] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92
-[14] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/
-[15] http://www.math.unipr.it/~medori/
-[16] http://www.univ-reunion.fr/~fred/
-[17] http://www.cs.unipr.it/cTI/
-[18] http://www.cs.unipr.it/China/
-[19] http://theory.sci.univr.it/p40/
-[20] http://www.cs.unipr.it/Projects/COFIN01
-[21] http://www.disi.unige.it/person/DelzannoG/cover/
-[22] http://www.cs.unipr.it/Projects/AIDA/
-[23] http://www.comp.leeds.ac.uk/hill/linda/
+ [7] http://www.dimi.uniud.it/~comini/
+ [8] http://www.haible.de/bruno/
+ [9] http://www.irisa.fr/prive/Bertrand.Jeannet/
+[10] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html
+[11] http://www.cs.unipr.it/ppl/Documentation/chernikova.c
+[12] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92
+[13] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/
+[14] http://www.math.unipr.it/~medori/
+[15] http://www.univ-reunion.fr/~fred/
+[16] http://www.cs.unipr.it/cTI/
+[17] http://www.cs.unipr.it/China/
+[18] http://theory.sci.univr.it/p40/
+[19] http://www.cs.unipr.it/Projects/COFIN01
+[20] http://www.disi.unige.it/person/DelzannoG/cover/
+[21] http://www.cs.unipr.it/Projects/AIDA/
+[22] http://www.comp.leeds.ac.uk/hill/linda/
diff --git a/ChangeLog b/ChangeLog
index 8d39dd8..364cdd9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,34688 @@
-2006-03-12  Release Manager
+2008-08-15 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
 
-	* PPL 0.9 Released.
+	* configure.ac (1.320), src/checked_mpz.inlines.hh (1.55): FIXME
+	  resolved.  We now require (for developers) Autoconf 2.60 or later
+	  version.
+
+2008-08-15 Friday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset3.cc (1.2): Testing Grid
+	  specialization for is_universe().
+
+2008-08-15 Friday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.cc (1.21), Pointset_Powerset.defs.hh
+	  (1.41): Added specialization of method is_universe() for
+	  powersets of grids.
+
+2008-08-15 Friday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/test1.ml (1.3): Obsolete code removed.
+
+2008-08-15 Friday 10:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.32), Powerset.inlines.hh (1.22): Added
+	  method upper_bound_assign_if_exact().
+
+2008-08-15 Friday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.31),
+	  Partially_Reduced_Product.inlines.hh (1.28): Drafted
+	  implementation for method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 21:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.22): Disable constrains/2 for the powersets in the interfaces.
+
+2008-08-14 Thursday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.29), ppl_interface_generator_ocaml_mli.m4 (1.14),
+	  ppl_ocaml_globals.ml (1.9): More test code removed.
+
+2008-08-14 Thursday 20:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.33), ppl_ocaml_globals.cc (1.14), tests/Makefile.am (1.6):
+	  Removed forgotten debug print statements.  Removed useless file
+	  inclusions, namespace directives, and test functions.
+
+2008-08-14 Thursday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.319): Version number bumped.
+
+2008-08-14 Thursday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.5): Link options fixed.
+
+2008-08-14 Thursday 19:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.21),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.76): Now enabled constrains, unconstrain_space_dimension and
+	  unconstrain_space_dimensions for all simple domains ie Polyhedra,
+	  Grids, Octagonal_Shapes, BD_Shapes, and Boxes
+
+	  M4 code for generating tests for the different domains added to
+	  the Prolog tests directory.
+
+2008-08-14 Thursday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.72), Grid_public.cc (1.74): Drafted
+	  implementation of method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 16:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.20),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.35),
+	  C/ppl_interface_generator_c_h_code.m4 (1.25),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.50),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.44), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.30), Java/tests/ppl_java_tests_common (1.8),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.32),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.28),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.21),
+	  OCaml/tests/test1.ml (1.2),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.67),
+	  Prolog/tests/pl_check.pl (1.54): Added constrains,
+	  unconstrain_space_dimension and unconstrain_space_dimensions for
+	  the Polyhedron domain to all the interfaces.
+
+	  Tests added for OCaml, Java and Prolog.
+
+2008-08-14 Thursday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.60), constrains1.cc (1.1): Added test
+	  for method constrains().
+
+2008-08-14 Thursday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.56), Box.templates.hh (1.113): Drfated
+	  implementation for method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.31), constrains1.cc (1.1):
+	  Added test for new method constrains().
+
+2008-08-14 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.50),
+	  Octagonal_Shape.templates.hh (1.79): Drafted implementation for
+	  method   bool constrains(Variable var) const;
+
+2008-08-14 Thursday 14:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.77), constrains1.cc (1.1): Added
+	  test for new method constrains().  Corrected a bug in the tests
+	  whereby the test congruences1 was using the sources for
+	  constraints1.
+
+2008-08-14 Thursday 14:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.124), BD_Shape.inlines.hh (1.163),
+	  BD_Shape.templates.hh (1.107): Drafted implementation of method
+	  bool constrains() const;
+
+2008-08-14 Thursday 00:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.4): Use the -o option of
+	  `ocamlc'.
+
+2008-08-13 Wednesday 13:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.34),
+	  ppl_interface_generator_c_h_code.m4 (1.24): Fixed a bug(s) that
+	  was preventing the generation of code for
+	  get_[minimized_]_[constraints,generators,congruences] methods.
+
+2008-08-13 Wednesday 12:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.3): Define test1_SOURCES.
+
+2008-08-13 Wednesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.42): Use the -o option of
+	  `ocamlc'.  Note: it should be specified before the source file.
+
+2008-08-12 Tuesday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.247): Added one item for PPL 0.10.
+
+2008-08-12 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.60),
+	  doc/devref-java-interface.doxyconf-html.in (1.2),
+	  doc/devref-java-interface.doxyconf-latex.in (1.2),
+	  doc/devref-java-interface.tex (1.2),
+	  doc/user-java-interface.doxyconf-html.in (1.2),
+	  doc/user-java-interface.doxyconf-latex.in (1.2),
+	  doc/user-java-interface.tex (1.2),
+	  interfaces/Java/Java_interface.dox (1.1),
+	  interfaces/Java/Makefile.am (1.17): Added the required machinery
+	  to generate the documentation for the Java interface.
+
+2008-08-12 Tuesday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Coefficient.java (1.8): FIXME removed.
+
+2008-08-12 Tuesday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/: Congruence.java (1.9),
+	  Linear_Expression_Coefficient.java (1.6): Doxygen comments fixed.
+
+2008-08-12 Tuesday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.41): Distribute also
+	  OCaml_interface.dox.
+
+2008-08-12 Tuesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence.java (1.8): Doxygen comment
+	  fixed.
+
+2008-08-12 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.48): Distribute also
+	  Prolog_interface.dox.
+
+2008-08-12 Tuesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-java-interface.doxyconf-html.in (1.1),
+	  devref-java-interface.doxyconf-latex.in (1.1),
+	  devref-java-interface.tex (1.1),
+	  user-java-interface.doxyconf-html.in (1.1),
+	  user-java-interface.doxyconf-latex.in (1.1),
+	  user-java-interface.tex (1.1): New files for the Java interface
+	  documentation.
+
+2008-08-12 Tuesday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.318), interfaces/C/Makefile.am (1.41): Distribute
+	  also C_interface.dox.
+
+2008-08-12 Tuesday 12:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.317), doc/devref-ocaml-interface.doxyconf-html.in
+	  (1.1), doc/devref-ocaml-interface.doxyconf-latex.in (1.1),
+	  doc/devref-prolog-interface.doxyconf-html.in (1.6): The machinery
+	  to generate the OCaml documentation should now be in place.  (The
+	  documentation itself still needs a lot of work.)
+
+2008-08-12 Tuesday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.316), doc/Makefile.am (1.59),
+	  doc/devref-ocaml-interface.tex (1.1),
+	  doc/devref-prolog-interface.doxyconf-latex.in (1.6),
+	  doc/devref-prolog-interface.tex (1.1): Added machinery to
+	  generate the LaTeX developer's manual for the OCaml interface.
+	  Fixed the generation of the same kind of documentation for the
+	  Prolog interface.
+
+2008-08-12 Tuesday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.315), doc/Makefile.am (1.58),
+	  doc/user-ocaml-interface.doxyconf-html.in (1.1),
+	  interfaces/OCaml/OCaml_interface.dox (1.2): Added machinery to
+	  generate the HTML documentation for the OCaml interface.
+
+2008-08-11 Monday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.314): Configure the interfaces/OCaml/tests
+	  directory.
+
+2008-08-11 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (1.7): File
+	  ppl_prolog.icc plays no role in the generation of the user's
+	  manual.
+
+2008-08-11 Monday 18:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.40), tests/Makefile.am (1.2):
+	  Got rid of some old kludges.
+
+2008-08-11 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.39), test1.ml (1.32),
+	  tests/.cvsignore (1.1), tests/Makefile.am (1.1), tests/test1.ml
+	  (1.1): The OCaml test programs now have their own directory.	Do
+	  not install .cmo files: now everything is packed into
+	  ppl_ocaml.cma.
+
+2008-08-11 Monday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.27):
+	  Erroneous double underscore changed to single.
+
+2008-08-11 Monday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.313), doc/Makefile.am (1.57),
+	  doc/user-ocaml-interface.doxyconf-latex.in (1.1),
+	  doc/user-ocaml-interface.tex (1.1): New machinery to generate the
+	  user's manual of the OCaml interface.
+
+2008-08-11 Monday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox (1.1): This will contain the
+	  OCaml interface documentation that is not automatically
+	  generated.
+
+2008-08-11 Monday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.15): Work around a bug of GCC 4.0.x.
+
+2008-08-10 Sunday 12:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.13):
+	  Started the adaptation required to produce the OCaml interface
+	  documentation using ocamldoc.
+
+2008-08-09 Saturday 22:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.246): Some items dealt with;	others reconsidered.
+
+2008-08-09 Saturday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.245), doc/definitions.dox (1.213): Added a section on
+	  upward approximation to the library's documentation.
+
+2008-08-09 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.312), tests/Makefile.am (1.266),
+	  tests/Polyhedron/Makefile.am (1.123),
+	  tests/Polyhedron/pointsetpowerset1.cc (1.11),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.5),
+	  tests/Polyhedron/pointsetpowerset3.cc (1.3),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.7),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.5),
+	  tests/Polyhedron/pointsetpowerset6.cc (1.3),
+	  tests/Polyhedron/powerset1.cc (1.23), tests/Powerset/.cvsignore
+	  (1.1), tests/Powerset/Makefile.am (1.1),
+	  tests/Powerset/pointsetpowerset1.cc (1.1),
+	  tests/Powerset/pointsetpowerset2.cc (1.1),
+	  tests/Powerset/pointsetpowerset3.cc (1.1),
+	  tests/Powerset/pointsetpowerset4.cc (1.1),
+	  tests/Powerset/pointsetpowerset5.cc (1.1),
+	  tests/Powerset/pointsetpowerset6.cc (1.1),
+	  tests/Powerset/powerset1.cc (1.1): Tests for the Powerset class
+	  have now their own directory.
+
+2008-08-09 Saturday 19:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.311), tests/Makefile.am (1.265),
+	  tests/Grid/Makefile.am (1.66), tests/Grid/directproduct1.cc
+	  (1.49), tests/Grid/directproduct2.cc (1.16),
+	  tests/Grid/directproduct3.cc (1.19), tests/Grid/directproduct4.cc
+	  (1.15), tests/Grid/directproduct5.cc (1.11),
+	  tests/Grid/directproduct6.cc (1.15),
+	  tests/Grid/partiallyreducedproduct1.cc (1.12),
+	  tests/Grid/partiallyreducedproduct2.cc (1.6),
+	  tests/Grid/partiallyreducedproduct3.cc (1.5),
+	  tests/Grid/partiallyreducedproduct4.cc (1.5),
+	  tests/Partially_Reduced_Product/.cvsignore (1.1),
+	  tests/Partially_Reduced_Product/Makefile.am (1.1),
+	  tests/Partially_Reduced_Product/directproduct1.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct2.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct3.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct4.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct5.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct6.cc (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+	  (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+	  (1.1): Tests for the Partially_Reduced_Product class have now
+	  their own directory.
+
+2008-08-09 Saturday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.16): Use consistent template parameters.
+	  Indentation fixed.
+
+2008-08-09 Saturday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.212): Improved the section on semantic
+	  geometric descriptors.
+
+2008-08-09 Saturday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.244), doc/definitions.dox (1.211): Started working on the
+	  completion and integration into the PPL manuals of the section
+	  about the different kinds of geometric descriptors implemented by
+	  the library.
+
+2008-08-09 Saturday 13:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (1.3): Added missing inclusion of <ppl-config.h>.
+
+2008-08-09 Saturday 12:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (1.2): Added missing namespace qualification.
+
+2008-08-09 Saturday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.180), fpu-ia32.inlines.hh (1.21): Drafted
+	  code to autodetect the presence of an SSE unit.
+
+2008-08-09 Saturday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (1.1): New source file containing IA-32 floating
+	  point unit non-inline related functions.
+
+2008-08-09 Saturday 11:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.20): Starting from the 2.18.50.0.4
+	  release of binutils, the x86 assembler no longer accepts `fnstsw
+	  %eax': `fnstsw %ax' should be used instead.
+
+2008-08-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.310): The Ciao-Prolog interface is no longer
+	  enabled by default.  Version number bumped.
+
+2008-08-08 Friday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.35), fpu-c99.inlines.hh (1.17),
+	  fpu-ia32.inlines.hh (1.19), fpu-none.inlines.hh (1.9),
+	  fpu-sparc.inlines.hh (1.11), fpu.defs.hh (1.20): Added stubs for
+	  fpu_initialize_control_functions(): this will allow, e.g.,
+	  detecting the presence of SSE support at run-time.
+
+2008-07-21 Monday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearsystem1.cc (1.11): Unused variable
+	  removed.
+
+2008-07-06 Sunday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxdifference1.cc (1.10): Fixed a couple of comments.
+
+2008-07-05 Saturday 21:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boxdifference1.cc (1.9): More tests added. Comments
+	  added to indicate what is being tested.
+
+2008-06-24 Tuesday 20:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.48): In methods normalize(),
+	  sign_normalize() and strong_normalize(), do not reset the
+	  sortedness flag if the number of rows is less than or equal to
+	  one.
+
+2008-06-14 Saturday 23:25  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.37): Fixed typo.
+
+2008-06-14 Saturday 16:41  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.36): Forgotten fixes.
+
+2008-06-14 Saturday 16:17  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.12): Added boundary complement.
+
+2008-06-14 Saturday 16:17  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.35): Untested attempt to implement
+	  interval difference.
+
+2008-06-10 Tuesday 11:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc (1.73), Pointset_Powerset.cc (1.20),
+	  Pointset_Powerset.defs.hh (1.40): In
+	  Grid::join_assign_if_exact(), added an assertion.
+
+	  In Pointset_Powerset.defs.hh corrected and improved brief
+	  description for approximate_partition().
+
+	  In Pointset_Powerset.cc, in approximate_partition(), ensure
+	  congruence system of grid q is minimized before copying;
+
+	  in approximate_partition_aux(), now there is no need to minimize
+	  the congruence system here.
+
+2008-06-10 Tuesday 09:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (1.24): In Grid::fold_space_dimensions(),
+	  emphasize the fact tha Grid::generators() is only called for its
+	  side-effects.
+
+2008-06-10 Tuesday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (1.23): Efficiency bug fixed in
+	  fold_space_dimensions().
+
+2008-06-08 Sunday 20:44  Andrea Cimino
+
+	* src/MIP_Problem_GLPK.icc (simplex.4): Solved a bug when computing
+	  the bounds to pass to the GLPK exact solver.	This commit makes
+	  'mippproblem3' test pass.
+
+2008-06-08 Sunday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.47): In
+	  Polyhedron::fold_space_dimensions(), emphasize the fact that
+	  Polyhedron::generators() is only called for its side-effects.
+
+2008-06-08 Sunday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.78): Spurious indentation
+	  fixed.
+
+2008-06-08 Sunday 18:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.46): Improved the efficiency of
+	  method fold_space_dimensions() by making sure that we compute at
+	  most one conversion from the constraint to the generator
+	  representation.
+
+2008-06-07 Saturday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem_GLPK.icc (simplex.3): Previous commit corrected
+	  and completed.  Code formatting fixed.
+
+2008-06-07 Saturday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem_GLPK.icc (simplex.2): Declaration and uses of the
+	  `statuses' write-only variable have been removed.
+
+2008-06-07 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.cc, MIP_Problem_GLPK.icc, MIP_Problem_PPL.icc,
+	  Makefile.am (simplex.[9,1,1,7]): Not the code for the PPL's MIP
+	  native solver and the code for the GLPK interface are completely
+	  separated.
+
+2008-06-07 Saturday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.8): Indentation fixed.  In many
+	  places, throw std::run_time_error instead of
+	  std::invalid_argument.
+
+2008-06-07 Saturday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.7): The code controlled by
+	  PPL_NOISY_SIMPLEX now systematically prints on std:cerr.  That
+	  macro has also been documented.
+
+2008-06-07 Saturday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.6): Properly commented long-scope
+	  #if's, #else's and #endif's.
+
+2008-06-07 Saturday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (simplex.2): Updated the text concerning Andrea Cimino.
+
+2008-06-07 Saturday 07:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.rpath (1.5), m4/lib-link.m4 (1.3), m4/lib-prefix.m4 (1.4):
+	  Updated from Gettext 0.17.
+
+2008-06-06 Friday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (simplex.5): New configure options:  `--with-glpk'
+	  checks whether the PPL should use the GLPK MIP solver, if
+	  available (the default is not to use it); `--with-glpk-glpssx'
+	  allows to specify the path where GLPK's glpssx.h can be found.
+
+2008-06-06 Friday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.5): Use the `PPL_USE_GLPK_MIP_SOLVER'
+	  symbol instead of `PPL_USE_GLPK'.  Define HAVE_GMP before
+	  including <glpssx.h> and <glpk.h>, undefining it after these
+	  inclusions.  The ulset() function does not exist in GLPK 4.28:
+	  use xlset() instead.
+
+2008-06-06 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore, ChangeLog, INSTALL, NEWS, README.configure, TODO,
+	  config.guess, config.sub, configure.ac, depcomp, install-sh,
+	  instchk.hh, ltmain.sh, Watchdog/.cvsignore, Watchdog/ChangeLog,
+	  Watchdog/INSTALL, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	  Watchdog/doc/fdl.dox, Watchdog/doc/gpl.dox,
+	  Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	  Watchdog/m4/libtool.m4, Watchdog/m4/ltoptions.m4,
+	  Watchdog/m4/ltsugar.m4, Watchdog/m4/ltversion.m4,
+	  Watchdog/m4/lt~obsolete.m4, Watchdog/src/.cvsignore,
+	  doc/definitions.dox, doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-c-interface.tex,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/fdl.dox, doc/gpl.dox,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, fedora/Makefile.am,
+	  fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, fedora/pwl.hh,
+	  interfaces/.cvsignore, interfaces/Makefile.am,
+	  interfaces/README.interfaces, interfaces/interfaced_boxes.hh,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	  interfaces/C/.cvsignore, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/ppl_java/.cvsignore,
+	  interfaces/Java/ppl_java/Makefile.am,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/OCaml/.cvsignore, interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/README.ocaml,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/Prolog/.cvsignore, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/Ciao/.cvsignore,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/.cvsignore,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/.cvsignore,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/.cvsignore,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/.cvsignore,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/YAP/.cvsignore,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/tests/.cvsignore,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/ac_check_ciao.m4, m4/libtool.m4, m4/ltoptions.m4,
+	  m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4,
+	  src/.cvsignore, src/Any_Pointset.defs.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bit_Row.defs.hh,
+	  src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.defs.hh,
+	  src/Box.inlines.hh, src/Box.templates.hh,
+	  src/Box_Status.idefs.hh, src/Box_Status.inlines.hh,
+	  src/C_Integer.hh, src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Congruence.inlines.hh,
+	  src/Float.defs.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Grid.defs.hh, src/Grid.inlines.hh,
+	  src/Grid.templates.hh, src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Init.cc,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval_Info.defs.hh, src/Makefile.am,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Og_Status.idefs.hh, src/Partially_Reduced_Product.defs.hh,
+	  src/Partially_Reduced_Product.inlines.hh,
+	  src/Partially_Reduced_Product.templates.hh,
+	  src/Ph_Status.idefs.hh, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Rational_Box.hh,
+	  src/Rational_Interval.hh, src/Row.inlines.hh,
+	  src/Temp.inlines.hh, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/compiler.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+	  src/meta_programming.hh, src/ppl_header.hh, src/simplify.cc,
+	  tests/Random_Number_Generator.inlines.hh, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/boundingbox1.cc, tests/BD_Shape/bounds1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frombdshape1.cc,
+	  tests/BD_Shape/frombox1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/fromgrid1.cc,
+	  tests/BD_Shape/fromoctagonalshape1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/fromspacedim1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/pointsetpowerset1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdshape1.cc,
+	  tests/Box/Makefile.am, tests/Box/addconstraints1.cc,
+	  tests/Box/addspacedims1.cc, tests/Box/affineimage1.cc,
+	  tests/Box/affinepreimage1.cc, tests/Box/bdsdifference1.cc,
+	  tests/Box/boundedaffineimage1.cc,
+	  tests/Box/boundedaffinepreimage1.cc, tests/Box/boxdifference1.cc,
+	  tests/Box/boxhull.cc, tests/Box/boxhull1.cc,
+	  tests/Box/cc76narrowing1.cc, tests/Box/cc76widening.cc,
+	  tests/Box/closure1.cc, tests/Box/concatenate1.cc,
+	  tests/Box/congruences1.cc, tests/Box/constraints1.cc,
+	  tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	  tests/Box/frombdshape1.cc, tests/Box/fromgensys1.cc,
+	  tests/Box/frompolyhedron1.cc,
+	  tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffineimage2.cc,
+	  tests/Box/generalizedaffinepreimage1.cc,
+	  tests/Box/geomcovers1.cc, tests/Box/intersection1.cc,
+	  tests/Box/interval1.cc, tests/Box/interval2.cc,
+	  tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+	  tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	  tests/Box/pointsetpowerset1.cc, tests/Box/pointsetpowerset2.cc,
+	  tests/Box/refine1.cc, tests/Box/refine2.cc, tests/Box/refine3.cc,
+	  tests/Box/refinewithcongruences1.cc,
+	  tests/Box/refinewithconstraint1.cc,
+	  tests/Box/refinewithconstraint2.cc,
+	  tests/Box/refinewithconstraints1.cc,
+	  tests/Box/refinewithconstraints2.cc, tests/Box/relations2.cc,
+	  tests/Box/relations3.cc, tests/Box/relations4.cc,
+	  tests/Box/removespacedims1.cc, tests/Box/timeelapse1.cc,
+	  tests/Box/unconstrain1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/congruences1.cc, tests/Grid/copyconstruct1.cc,
+	  tests/Grid/directproduct3.cc, tests/Grid/directproduct5.cc,
+	  tests/Grid/directproduct6.cc, tests/Grid/fromgrid1.cc,
+	  tests/Grid/frompolyhedron1.cc, tests/Grid/grid3.cc,
+	  tests/Grid/mincongruences1.cc,
+	  tests/Grid/partiallyreducedproduct1.cc,
+	  tests/Grid/partiallyreducedproduct2.cc,
+	  tests/Grid/partiallyreducedproduct3.cc,
+	  tests/Grid/partiallyreducedproduct4.cc,
+	  tests/Grid/pointsetpowerset1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/refinewithcongruences1.cc,
+	  tests/Grid/refinewithconstraints1.cc, tests/Grid/unconstrain1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/congruences1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/frombox1.cc,
+	  tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/pointsetpowerset1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithcons3.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/unconstrain1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/hybrid.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/pointsetpowerset2.cc,
+	  tests/Polyhedron/pointsetpowerset3.cc,
+	  tests/Polyhedron/pointsetpowerset4.cc,
+	  tests/Polyhedron/pointsetpowerset5.cc,
+	  tests/Polyhedron/pointsetpowerset6.cc,
+	  tests/Polyhedron/refinewithcongruence1.cc,
+	  tests/Polyhedron/refinewithcongruences1.cc,
+	  tests/Polyhedron/refinewithconstraint1.cc,
+	  tests/Polyhedron/refinewithconstraints1.cc,
+	  tests/Polyhedron/unconstrain1.cc, utils/cm_cleaner.sh,
+	  utils/cm_splitter.sh
+	  (simplex.[1,4,3,4,4,7,5,5,4,2,4,4,3,1,4,3,5,5,3,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,3,3,3,3,5,4,4,1,2,3,3,3,3,3,3,4,4,4,3,2,3,2,2,1,4,2,2,3,3,2,1,4,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,4,3,3,3,3,3,3,3,3,2,3,1,4,3,3,3,2,3,3,1,4,3,3,1,4,3,2,4,3,3,1,4,3,3,1,4,3,3,3,1,4,3,1,4,3,3,3,3,2,2,2,2,2,2,2,3,4,4,5,6,5,3,3,3,3,3,3,2,2,3,4,5,5,5,5,5,4,5,5,7,4,5,5,5,5,4,5,5,5,4,4,3,3,6,4,5,5,3,3,3,3,3,3,3,4,3,3,3,3,3,3,5,5,4,5,5,3,3,2,3,3,4,4,4,5,4,4,4,4,3,5,3,2,2,3,3,3,4,5,5,3,5,5,4,4 [...]
+	  Fifth merge of the trunk to the `simplex' branch.
+
+2008-06-06 Friday 16:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.4): Extended the scope of an #ifdef
+	  PPL_USE_GLPK.
+
+2008-06-06 Friday 14:10  Andrea Cimino
+
+	* src/: MIP_Problem.cc, MIP_Problem.defs.hh (simplex.[3,3]): As an
+	  option, now the PPL can use the exact simplex solver of GLPK.
+
+2008-06-05 Thursday 15:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am, wrap1.cc
+	  (bounded_arithmetic.[1,1]): New file wrap1.cc will contain tests
+	  for method Polyhedron::wrap_assign().
+
+2008-06-05 Thursday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, Polyhedron_public.cc
+	  (bounded_arithmetic.[1,1]): Added the declaration and a stub
+	  implementation of new method Polyhedron::wrap_assign().
+
+2008-06-05 Thursday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (bounded_arithmetic.1): New enumerations
+	  Bounded_Integer_Type_Width, Bounded_Integer_Type_Signedness and
+	  Bounded_Integer_Type_Overflow to encode the width, signedness and
+	  overflow behavior of bounded integer types, respectively.
+
+2008-05-26 Monday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (1.8): Capitalization fixed.
+
+2008-05-25 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_ciao.m4 (simplex.1): file ac_check_ciao.m4 was added
+	  on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-25 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.309), interfaces/Prolog/Ciao/Makefile.am (1.73),
+	  m4/ac_check_ciao.m4 (1.1): Added machinery to automatically find
+	  the header files of the Ciao Prolog foreign language interface.
+
+2008-05-24 Saturday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.308): Version number bumped.
+
+2008-05-24 Saturday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.26): Updated.
+
+2008-05-12 Monday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.43), Congruence.inlines.hh
+	  (1.20), Grid_Generator_System.inlines.hh (1.18),
+	  NNC_Polyhedron.inlines.hh (1.44): Define inline methods before
+	  their first invocation.
+
+2008-05-12 Monday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.123), Octagonal_Shape.defs.hh (1.49):
+	  Obsolete workarounds removed.
+
+2008-05-12 Monday 08:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.55): Obsolete workarounds removed.
+
+2008-05-12 Monday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: compiler.hh (1.14), fpu.defs.hh (1.19): The Intel C/C++
+	  compilers accept the same asm() syntax as GCC.
+
+2008-05-11 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.54), Box.inlines.hh (1.33), Box.templates.hh
+	  (1.112), Box_Status.idefs.hh (1.3), Box_Status.inlines.hh (1.3):
+	  Avoid name clashes between the parameter of class Box and class
+	  Interval.
+
+2008-05-11 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box_Status.idefs.hh (simplex.1): file Box_Status.idefs.hh was
+	  added on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-11 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box_Status.inlines.hh (simplex.1): file Box_Status.inlines.hh
+	  was added on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-11 Sunday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.111): Dead code removed.
+
+2008-05-11 Sunday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.53): Useless inclusion removed.
+
+2008-05-11 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.106), Octagonal_Shape.templates.hh
+	  (1.77): Unreachable breaks removed.
+
+2008-05-11 Sunday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (1.17): Inclusions fixed.
+
+2008-05-11 Sunday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.cc (1.67), Polyhedron_public.cc (1.117):
+	  Unreachable breaks removed.
+
+2008-05-11 Sunday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.39): Inclusions fixed.
+
+2008-05-11 Sunday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: compiler.hh (1.13), fpu.defs.hh (1.18): Do not try to use
+	  asm() statements unless defined(__GNUC__).
+
+2008-05-11 Sunday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.54): Warning avoided.
+
+2008-05-11 Sunday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.110): Code formatting improved.
+
+2008-05-11 Sunday 21:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.105), Octagonal_Shape.templates.hh
+	  (1.76): Avoid shadowing and repeated computations.
+
+2008-05-10 Saturday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.307): When the --enable-more-assertions option is
+	  given, we define both _GLIBCXX_DEBUG and _GLIBCXX_DEBUG_PEDANTIC;
+	  this way, when libstdc++ is used, it is used in pedantic debug
+	  mode.
+
+2008-05-10 Saturday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.34), Polyhedron.defs.hh (1.337),
+	  Polyhedron_public.cc (1.116), simplify.cc (1.51): Fixed an (until
+	  now) inconsequential problem whereby we were using the STL
+	  outside its specifications (problem spotted by Stefano Soffia and
+	  further analyzed by Enea Zaffanella).
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/libtool.m4 (simplex.1): file libtool.m4 was added on branch
+	  simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added on
+	  branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltversion.m4 (simplex.1): file ltversion.m4 was added on
+	  branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was added on
+	  branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/libtool.m4 (simplex.1): file libtool.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added
+	  on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ltversion.m4 (simplex.1): file ltversion.m4 was added
+	  on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was
+	  added on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.306), ltmain.sh (1.34), Watchdog/configure.ac
+	  (1.45), Watchdog/ltmain.sh (1.23), Watchdog/m4/libtool.m4 (1.5),
+	  Watchdog/m4/ltoptions.m4 (1.3), Watchdog/m4/ltversion.m4 (1.4),
+	  Watchdog/m4/lt~obsolete.m4 (1.2), m4/libtool.m4 (1.5),
+	  m4/ltoptions.m4 (1.3), m4/ltversion.m4 (1.4), m4/lt~obsolete.m4
+	  (1.2): Updated to Libtool 2.2.4.
+
+2008-05-04 Sunday 09:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.13): Temporarily work around a problem
+	  whereby testing for the existence of <fenv.h> is no longer enough
+	  for our purposes.
+
+2008-05-04 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh (1.12): Include <ctime>.
+
+2008-05-04 Sunday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.104): Use explicit braces to avoid
+	  ambiguous `else'.
+
+2008-04-30 Wednesday 12:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-c-interface.tex (1.5), devref.tex (1.26),
+	  user-c-interface.tex (1.5), user-prolog-interface.tex (1.5),
+	  user.tex (1.27): Package inclusions updated.	We now set the
+	  `tocdepth' counter to 2 in order to obtain a more useful index.
+
+2008-04-29 Tuesday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.103): Avoid useless computation in
+	  minimized_congruences(), thereby also silencing a compiler
+	  warning.
+
+2008-04-29 Tuesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/pointsetpowerset1.cc (1.3): Test 15 is no longer
+	  failing.
+
+2008-04-29 Tuesday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+	  14:22:11 +0000
+
+2008-04-28 Monday 16:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.inlines.hh (1.35),
+	  Octagonal_Shape.templates.hh (1.75): Corrected an efficiency bug
+	  in methods minimized_congruences() and congruences().  In method
+	  OK(), do not check for closure if the shape is based on non-exact
+	  (i.e., floating point) coefficients.
+
+2008-04-28 Monday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.162), BD_Shape.templates.hh (1.102):
+	  Corrected an efficiency bug in methods minimized_congruences()
+	  and congruences().
+
+2008-04-28 Monday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Float.defs.hh (1.29): Added missing inclusion of
+	  meta_programming.hh.
+
+2008-04-27 Sunday 16:28  Abramo Bagnara
+
+	* src/Temp.inlines.hh (1.5): Added missing inline.
+
+2008-04-27 Sunday 16:28  Abramo Bagnara
+
+	* src/Float.defs.hh (1.28): Added True/False helper.
+
+2008-04-24 Thursday 08:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.48), Polyhedron.defs.hh (1.336):
+	  Do not refer to the undefined concept `reduced' for congruence
+	  systems.
+
+2008-04-24 Thursday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.defs.hh (1.71): Minor improvements in documentation: do
+	  not refer to `reduced' congruence systems since it is undefined
+	  terminology at the user level.
+
+2008-04-24 Thursday 08:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.122): Minor fix in the indentation of the
+	  documentation.
+
+2008-04-23 Wednesday 16:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.19),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.33),
+	  C/ppl_interface_generator_c_h_code.m4 (1.23),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.49), Java/jni/ppl_java_common.cc (1.38),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.43), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.29), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.31),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.26),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.20),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.66),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.75), Prolog/tests/ppl_predicate_check_common.pl (1.11): Added
+	  to all the interfaces the unconstrain() procedure.
+
+	  Added (except to the C interface which already had it) the
+	  constrains() procedure.
+
+	  Added to the Prolog interface the option of building from a
+	  friend with complexity specified.
+
+	  Tests added for all new code in the Prolog and Java interfaces.
+
+2008-04-23 Wednesday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_common_procedure_generators.m4 was added
+	  on branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-04-23 Wednesday 12:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/pointsetpowerset1.cc (1.4),
+	  Octagonal_Shape/pointsetpowerset1.cc (1.4): Revised the distances
+	  from the exact values in test 03.
+
+2008-04-23 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+	  14:22:09 +0000
+
+2008-04-23 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset5.cc (simplex.1): file
+	  pointsetpowerset5.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset6.cc (simplex.1): file
+	  pointsetpowerset6.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/pointsetpowerset2.cc (simplex.1): file
+	  pointsetpowerset2.cc was added on branch simplex on 2008-06-06
+	  14:22:10 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/pointsetpowerset1.cc (1.3),
+	  Box/pointsetpowerset1.cc (1.6), Box/pointsetpowerset2.cc (1.2),
+	  Grid/pointsetpowerset1.cc (1.2),
+	  Octagonal_Shape/pointsetpowerset1.cc (1.3), Polyhedron/hybrid.cc
+	  (1.6), Polyhedron/pointsetpowerset1.cc (1.10),
+	  Polyhedron/pointsetpowerset2.cc (1.4),
+	  Polyhedron/pointsetpowerset5.cc (1.4),
+	  Polyhedron/pointsetpowerset6.cc (1.2): Do not put spaces around
+	  operator->().
+
+2008-04-22 Tuesday 19:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/Makefile.am (1.30): Type corrected.
+
+2008-04-22 Tuesday 17:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/pointsetpowerset1.cc (1.2): Allow for non-integral
+	  numbers using check_result().
+
+2008-04-22 Tuesday 17:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/pointsetpowerset1.cc (1.2): Allow for non
+	  integral results using check_results() on the disjuncts.
+
+2008-04-22 Tuesday 11:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.228), src/Pointset_Powerset.cc (1.19),
+	  src/Pointset_Powerset.defs.hh (1.38),
+	  src/Pointset_Powerset.inlines.hh (1.15),
+	  src/Pointset_Powerset.templates.hh (1.32),
+	  tests/BD_Shape/Makefile.am (1.76),
+	  tests/BD_Shape/pointsetpowerset1.cc (1.1), tests/Box/Makefile.am
+	  (1.59), tests/Box/pointsetpowerset2.cc (1.1),
+	  tests/Grid/Makefile.am (1.65), tests/Grid/pointsetpowerset1.cc
+	  (1.1), tests/Octagonal_Shape/Makefile.am (1.29),
+	  tests/Octagonal_Shape/pointsetpowerset1.cc (1.1),
+	  tests/Polyhedron/Makefile.am (1.122),
+	  tests/Polyhedron/pointsetpowerset6.cc (1.1): Added constructors
+	  for the pointset powerset domain from other domains that are not
+	  products or powersets.
+
+	  Added to all the constructors for the pointset powerset domain
+	  from other sematic domains an optional complexity argument.
+
+	  Tests for these new constructors added.  A note added in the NEWS
+	  file on these additions
+
+2008-04-22 Tuesday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.defs.hh (1.60): Properly order the list of
+	  parameters of NNC_Polyhedron(grid, complexity) in the doxygen
+	  documentation.
+
+2008-04-22 Tuesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.227): Mention the new unconstrain() methods.
+
+2008-04-22 Tuesday 09:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/pointsetpowerset1.cc (1.5): Tests 4 to 19 uncommented
+	  and adapted to use the box domain.
+
+2008-04-22 Tuesday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.43): Added a note on the implementation
+	  of gcdext_exact().
+
+2008-04-21 Monday 22:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/NNC_Polyhedron.defs.hh (1.59): Document the parameter
+	  complexity in: NNC_Polyhedron(const Grid &grid,
+	  Complexity_Class complexity=ANY_COMPLEXITY)
+
+2008-04-21 Monday 12:13  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.101): Corrected the private method
+	  `get_limiting_shape' when `cs' contains an equality.
+
+2008-04-18 Friday 14:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.30),
+	  Partially_Reduced_Product.inlines.hh (1.27): Added methods
+	  unconstrain() to class Partially_Reduced_Product.
+
+2008-04-18 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-04-18 Friday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/frombdshape1.cc (1.2),
+	  Octagonal_Shape/fromoctagonalshape1.cc (1.2): Corrected typos:
+	  the assignment operator is not meant to implement a conversion
+	  between different kinds of BD_ or Octagonal_ shapes.
+
+2008-04-18 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frombdshape1.cc (simplex.1): file frombdshape1.cc
+	  was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-18 Friday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.29),
+	  src/Partially_Reduced_Product.inlines.hh (1.26),
+	  tests/Grid/directproduct6.cc (1.14): Added a constructor for a
+	  product from another product but with possibly different
+	  templatic parameters.
+
+2008-04-18 Friday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.28),
+	  src/Partially_Reduced_Product.inlines.hh (1.25),
+	  tests/Grid/directproduct6.cc (1.13): Added the complexity class
+	  parameter for the copy constructor for the product domain.
+
+2008-04-18 Friday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/fromgrid1.cc (simplex.1): file fromgrid1.cc was added
+	  on branch simplex on 2008-06-06 14:22:11 +0000
+
+2008-04-18 Friday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct4.cc (simplex.1): file
+	  partiallyreducedproduct4.cc was added on branch simplex on
+	  2008-06-06 14:22:11 +0000
+
+2008-04-18 Friday 10:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.121), src/BD_Shape.inlines.hh (1.161),
+	  src/Box.defs.hh (1.52), src/Box.inlines.hh (1.32),
+	  src/Box.templates.hh (1.109), src/C_Polyhedron.defs.hh (1.58),
+	  src/C_Polyhedron.inlines.hh (1.42), src/Grid.defs.hh (1.70),
+	  src/Grid_public.cc (1.72), src/NNC_Polyhedron.defs.hh (1.58),
+	  src/NNC_Polyhedron.inlines.hh (1.43), src/Octagonal_Shape.defs.hh
+	  (1.47), src/Octagonal_Shape.inlines.hh (1.34),
+	  src/Partially_Reduced_Product.defs.hh (1.27),
+	  src/Partially_Reduced_Product.inlines.hh (1.24),
+	  src/Polyhedron.defs.hh (1.335), src/Polyhedron_nonpublic.cc
+	  (1.83), tests/BD_Shape/Makefile.am (1.75),
+	  tests/BD_Shape/frombdshape1.cc (1.1), tests/Grid/Makefile.am
+	  (1.64), tests/Grid/copyconstruct1.cc (1.10),
+	  tests/Grid/directproduct6.cc (1.12), tests/Grid/fromgrid1.cc
+	  (1.1), tests/Grid/partiallyreducedproduct1.cc (1.11),
+	  tests/Grid/partiallyreducedproduct2.cc (1.5),
+	  tests/Grid/partiallyreducedproduct3.cc (1.4),
+	  tests/Grid/partiallyreducedproduct4.cc (1.4),
+	  tests/Octagonal_Shape/Makefile.am (1.28),
+	  tests/Octagonal_Shape/fromoctagonalshape1.cc (1.1): Added to the
+	  Partially_Reduced_Product<> class in the semantic GD constructors
+	  from other classes a complexity parameter.
+
+	  Tests for this have been added as needed. Also some comments wrt
+	  the tests for the product domain have been corrected.
+
+	  In the Grid, Box, BD_Shape and Octagonal_Shape added a complexity
+	  class parameter to the copy constructor and to the constructor
+	  from the same class but with a different numeric class (where
+	  applicable).
+
+	  Test files added where no obvious test for the copy constructor
+	  could be found. For the grid tests, the test file
+	  copyconstruct1.cc has been renamed for uniformity with other
+	  tests and the other classes.
+
+2008-04-18 Friday 09:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.19), Pointset_Ask_Tell.defs.hh
+	  (1.16), Pointset_Ask_Tell.templates.hh (1.14): Added the
+	  unconstrain() methods to Any_Pointset and Pointset_Ask_Tell.
+
+2008-04-18 Friday 09:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.58), unconstrain1.cc (1.1): Added a
+	  test for the new Box::unconstrain() methods.
+
+2008-04-18 Friday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/unconstrain1.cc (simplex.1): file unconstrain1.cc was
+	  added on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-04-18 Friday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.51), Box.inlines.hh (1.31), Box.templates.hh
+	  (1.108): Added methods unconstrain().
+
+2008-04-17 Thursday 18:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/C_Polyhedron.cc (1.27), src/C_Polyhedron.defs.hh (1.57),
+	  src/NNC_Polyhedron.cc (1.27), src/NNC_Polyhedron.defs.hh (1.57),
+	  tests/Polyhedron/cnncconversion1.cc (1.6): Added a complexity
+	  parameter for converting between C and NNC polyhedra. This is
+	  ignored.
+
+	  A couple of tests added to cnncconversion1.cc.
+
+2008-04-17 Thursday 17:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.63), unconstrain1.cc (1.1): Added
+	  tests for unconstrain() for the grids.
+
+2008-04-17 Thursday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/unconstrain1.cc (simplex.1): file unconstrain1.cc was
+	  added on branch simplex on 2008-06-06 14:22:11 +0000
+
+2008-04-17 Thursday 17:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.69), Grid_public.cc (1.71): Added methods
+	  unconstrain().
+
+2008-04-17 Thursday 17:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.26), C_Polyhedron.defs.hh (1.56),
+	  C_Polyhedron.inlines.hh (1.41), NNC_Polyhedron.cc (1.26),
+	  NNC_Polyhedron.defs.hh (1.56), NNC_Polyhedron.inlines.hh (1.42),
+	  Polyhedron.templates.hh (1.19): Fixed indentation.
+
+2008-04-17 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frombox1.cc (simplex.1): file frombox1.cc was
+	  added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-17 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frombox1.cc (simplex.1): file frombox1.cc
+	  was added on branch simplex on 2008-06-06 14:22:12 +0000
+
+2008-04-17 Thursday 16:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.120), src/BD_Shape.inlines.hh (1.160),
+	  src/Grid.defs.hh (1.68), src/Grid.inlines.hh (1.24),
+	  src/Grid.templates.hh (1.34), src/Octagonal_Shape.defs.hh (1.46),
+	  src/Octagonal_Shape.inlines.hh (1.33), tests/BD_Shape/Makefile.am
+	  (1.74), tests/BD_Shape/boundingbox1.cc (1.4),
+	  tests/BD_Shape/frombox1.cc (1.1),
+	  tests/Octagonal_Shape/Makefile.am (1.27),
+	  tests/Octagonal_Shape/frombox1.cc (1.1): Added a complexity
+	  parameter for the constructors for the grid, bd_shape and
+	  octagonal_shape from the other semantic GD's.  In all cases the
+	  parameter is ignored.
+
+	  Added tests for the Octagonal_Shape domain for building from a
+	  box.	This file is a clone (with only trivial changes for the
+	  change of domain) of the old boundingbox1.cc (renamed for
+	  consistency as frombox1.cc) in BD_Shape tests directory.
+
+2008-04-17 Thursday 16:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: C_Polyhedron.cc (1.25), C_Polyhedron.defs.hh (1.55),
+	  C_Polyhedron.inlines.hh (1.40), NNC_Polyhedron.cc (1.25),
+	  NNC_Polyhedron.defs.hh (1.55), NNC_Polyhedron.inlines.hh (1.41):
+	  Added an extra complexity parameter for building polyhedra from a
+	  box, bd shape, octagonal shape, and a grid.  In all cases the
+	  parameter is ignored.
+
+2008-04-17 Thursday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.31): Fixed indentation;
+	  added implementation of methods unconstrain().
+
+2008-04-17 Thursday 15:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.37): Fixed indentation and
+	  grouping of methods.	Declared new methods unconstrain().
+
+2008-04-17 Thursday 15:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.210): Added bibligraphic entry HMT71.
+
+2008-04-17 Thursday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.209): Added a subsection about
+	  cylindrification of polyhedra.
+
+2008-04-17 Thursday 13:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.115): In the implementation of affine
+	  images/preimages, use new methods unconstrain() when appropriate.
+
+2008-04-17 Thursday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/unconstrain1.cc (simplex.1): file
+	  unconstrain1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-04-17 Thursday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.73), BD_Shape/unconstrain1.cc
+	  (1.1), Octagonal_Shape/Makefile.am (1.26),
+	  Octagonal_Shape/unconstrain1.cc (1.1): Added tests for the
+	  unconstrain() methods for BD_Shape and Octagonal_Shape.
+
+2008-04-17 Thursday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/unconstrain1.cc (simplex.1): file unconstrain1.cc
+	  was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-17 Thursday 13:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.119), BD_Shape.templates.hh (1.100),
+	  Octagonal_Shape.defs.hh (1.45), Octagonal_Shape.templates.hh
+	  (1.74): Added methods unconstrain() for BD_Shape and
+	  Octagonal_Shape.
+
+2008-04-17 Thursday 13:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Polyhedron.defs.hh (1.334), Polyhedron.templates.hh (1.18),
+	  Polyhedron_public.cc (1.114): Replaced common code in
+	  add_constraint() and refine_with_constraint() with a call to a
+	  private method refine_no_check() that does the same thing as the
+	  common code.
+
+	  Added an extra complexity parameter for the constructor of a
+	  polyhedron from a box. This is ignored (as algorithm is
+	  polynomial).
+
+2008-04-17 Thursday 12:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.121), unconstrain1.cc (1.1):
+	  Added some tests for new methods unconstrain().
+
+2008-04-17 Thursday 12:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/unconstrain1.cc (simplex.1): file
+	  unconstrain1.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-04-17 Thursday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.113): Corrected cut&paste error in
+	  the implementation of unconstrain(vs).
+
+2008-04-17 Thursday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.333), Polyhedron_public.cc (1.112):
+	  Added new methods   void unconstrain(Variable var);	void
+	  unconstrain(const Variable_Set& to_be_unconstrained); that modify
+	  the polyhedron by computing the cylindrification on the specified
+	  space dimensions.  In the documentation, moved the static methods
+	  can_recycle_constraints and can_recycle_congruences to a better
+	  place.
+
+2008-04-17 Thursday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.243): Added (partial) lists of the semantic GDs (simple
+	  and the constructors) in the section on Semantic geometric
+	  descriptors.
+
+2008-04-12 Saturday 22:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.70), tests/Grid/Makefile.am (1.62),
+	  tests/Grid/frompolyhedron1.cc (1.1), tests/Grid/grid3.cc (1.26):
+	  Corrected two bugs in the revised code for constructing a grid
+	  from a polyhedron with complexity class:
+
+	  The space dimension of the generator system must be set to be
+	  that of the polyhedron.
+
+	  After minimizing the polyhedron (in the case that the complexity
+	  is ANY_COMPLEXITY), we must check if the polyhedron is empty, and
+	  if it is return the empty grid.
+
+	  Added a new test file for checking this constructor, moved
+	  existing tests for it that were in grid3.cc to the new test file,
+	  and added a few extra tests to check the use of complexity
+	  classes.
+
+2008-04-12 Saturday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/frompolyhedron1.cc (simplex.1): file
+	  frompolyhedron1.cc was added on branch simplex on 2008-06-06
+	  14:22:11 +0000
+
+2008-04-12 Saturday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.67), Grid_public.cc (1.69): The constructor
+	  of a grid from a polyhedron now takes an optional argument
+	  specifying an upper bound to the complexity of the conversion to
+	  be applied.
+
+2008-04-10 Thursday 17:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.242): Small improvements to the description of
+	  syntactic/semantics GDs.
+
+2008-04-02 Wednesday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.33), Watchdog/ltmain.sh (1.22),
+	  Watchdog/m4/libtool.m4 (1.4), Watchdog/m4/ltoptions.m4 (1.2),
+	  Watchdog/m4/ltversion.m4 (1.3), m4/libtool.m4 (1.4),
+	  m4/ltoptions.m4 (1.2), m4/ltversion.m4 (1.3): Updated from
+	  Libtool 2.2.2.
+
+2008-03-29 Saturday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.305): Version number bumped.
+
+2008-03-25 Tuesday 10:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.18), src/Pointset_Powerset.defs.hh
+	  (1.36), src/Pointset_Powerset.inlines.hh (1.14),
+	  src/Pointset_Powerset.templates.hh (1.30),
+	  tests/Grid/powersetdifference1.cc (1.5),
+	  tests/Polyhedron/pointsetpowerset1.cc (1.9): Changes mainly
+	  affect poly_difference_assign().
+
+	  Added difference_assign() to be a clone of
+	  poly_difference_assign().  Added a couple of tests and improved
+	  an existing test.
+
+	  Replaced all lines: // FIXME: this is buggy when PS is not an
+	  abstraction of NNC_Polyhedron.  by // This code is only used when
+	  PS is an abstraction of NNC_Polyhedron.  since the Grid domains
+	  are specialised separately.
+
+	  Corrected a bug in poly_difference_assign() for Grids where some
+	  precision was wrongly lost (when a remainder was negative and had
+	  been assumed to be positive).
+
+2008-03-22 Saturday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/: devref.tex (1.5), fdl.dox (1.2), gpl.dox (1.3),
+	  user.tex (1.5): Properly named page anchors so as to avoid
+	  undefined references in the LaTeX documentation.
+
+2008-03-22 Saturday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/: devref.doxyconf-html.in (1.2),
+	  devref.doxyconf-latex.in (1.2), user.doxyconf-html.in (1.3),
+	  user.doxyconf-latex.in (1.3): Doxygen configuration files
+	  upgraded.
+
+2008-03-21 Friday 10:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.32),
+	  ppl_interface_generator_c_h_code.m4 (1.22): Removed the now
+	  redundant code for add_recycled_..._and_minimize procedures.
+
+2008-03-21 Friday 10:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.6): Removed the
+	  add_recycled_constraints/congruences_and_minimize from the list
+	  of procedures to build.
+
+2008-03-21 Friday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_c_procedure_generators.m4 was added on
+	  branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-03-21 Friday 09:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.26),
+	  Pointset_Powerset.defs.hh (1.35): Corrected a couple of typos in
+	  the documentation resulting in Doxygen warnings.
+
+2008-03-21 Friday 09:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.44), Octagonal_Shape.inlines.hh
+	  (1.32), Octagonal_Shape.templates.hh (1.73): Removed eager
+	  methods for the addition of constraints/congruences.
+
+2008-03-21 Friday 09:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: limitedbhmz05extrapolation1.cc (1.8),
+	  limitedcc76extrapolation1.cc (1.8), intersection1.cc (1.6): No
+	  longer using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 09:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: congruences1.cc (1.4),
+	  containsintegerpoint1.cc (1.6), octhull1.cc (1.6): No longer
+	  using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 09:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/congruences1.cc (simplex.1): file
+	  congruences1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-03-21 Friday 08:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: directproduct3.cc (1.18), directproduct5.cc (1.10):
+	  No longer using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 08:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct1.cc (1.10): No longer using
+	  eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 08:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.25),
+	  Partially_Reduced_Product.inlines.hh (1.23),
+	  Partially_Reduced_Product.templates.hh (1.9): Removed eager
+	  versions of methods adding constraints/congruences.
+
+2008-03-21 Friday 08:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.defs.hh (1.15),
+	  Pointset_Ask_Tell.templates.hh (1.13): Removed eager methods of
+	  methods adding constraints/congruences.
+
+2008-03-21 Friday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (1.8): Corrected typo in the noisy
+	  output.
+
+2008-03-21 Friday 08:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.13), congruences1.cc (1.4),
+	  intersection1.cc (1.10): No longer using eager methods for adding
+	  constraints/congruences.
+
+2008-03-21 Friday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.50), Box.inlines.hh (1.30): Removed eager
+	  versions of methods adding constraints and congruences.
+
+2008-03-20 Thursday 17:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/C_Polyhedron.defs.hh (1.54): Comment corrected.
+
+2008-03-20 Thursday 16:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_public.cc (1.111), Polyhedron_widenings.cc
+	  (1.66): Avoid using deprecated methods.
+
+2008-03-20 Thursday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.99): Avoid using deprecated methods;
+	  while at it, slightly simplified a few lines.
+
+2008-03-20 Thursday 15:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.templates.hh (1.29), Pointset_Powerset.cc
+	  (1.17), Grid_public.cc (1.68): Avoid using deprecated method.
+
+2008-03-20 Thursday 15:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.31),
+	  C/ppl_interface_generator_c_h_code.m4 (1.21),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.48),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.42), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.28), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.30),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.25),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.19): Added the
+	  code for the refine_with methods to the C, Java and Ocaml
+	  interfaces.  All the refine_with methods in all the interfaces
+	  enabled.
+
+2008-03-20 Thursday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.332), BD_Shape.defs.hh (1.118),
+	  Pointset_Powerset.defs.hh (1.34), Grid.defs.hh (1.66):
+	  Documentation of the eager versions of some methods now states
+	  that their usage is deprecated (linking to the manual for an
+	  explanation).
+
+2008-03-20 Thursday 14:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.208): In the section of the manual
+	  discussing lazy and eager version of some of the operators, added
+	  a paragraph stressing that the use of the eager versions is
+	  deprecated starting from PPL 0.10 and will be removed starting
+	  from PPL 0.11.
+
+2008-03-20 Thursday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.71),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.18),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.65): Added
+	  code in the Prolog interface for the refine_with methods.
+
+2008-03-20 Thursday 10:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.24),
+	  src/Partially_Reduced_Product.inlines.hh (1.22),
+	  tests/Grid/partiallyreducedproduct4.cc (1.3): Added refine_with
+	  methods to the product domains.
+
+2008-03-20 Thursday 09:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.33),
+	  src/Pointset_Powerset.templates.hh (1.28),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.3): Added
+	  refine_with_congruence() and	refine_with_congruences().  Tests
+	  added for all the refine_with methods for pointset powersets of
+	  polyhedra.
+
+2008-03-19 Wednesday 14:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.17),
+	  Prolog/tests/pl_grid_check.pl (1.10): Disabled the and_minimize
+	  methods for all domains except for the Polyhedron domains.
+	  Removed all tests for the and_minimize methods from
+	  Prolog/tests/pl_grid_check.pl.
+
+2008-03-19 Wednesday 14:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.331), src/Polyhedron_public.cc (1.110),
+	  tests/Polyhedron/Makefile.am (1.120),
+	  tests/Polyhedron/exceptions1.cc (1.16),
+	  tests/Polyhedron/refinewithcongruence1.cc (1.1),
+	  tests/Polyhedron/refinewithcongruences1.cc (1.1),
+	  tests/Polyhedron/refinewithconstraint1.cc (1.1),
+	  tests/Polyhedron/refinewithconstraints1.cc (1.1): Added
+	  refine_with methods for constraint(s) and congruence(s).
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithcongruence1.cc (simplex.1): file
+	  refinewithcongruence1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithcongruences1.cc (simplex.1): file
+	  refinewithcongruences1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithconstraint1.cc (simplex.1): file
+	  refinewithconstraint1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithconstraints1.cc (simplex.1): file
+	  refinewithconstraints1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 08:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.241): Revised the geometric descriptors draft
+	  documentation for the add and refine_with methods for constraints
+	  and congruences.
+
+2008-03-19 Wednesday 08:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/refinewithconstraints1.cc (1.3): tests 08 and 09 fail
+	  with checked-int8
+
+2008-03-19 Wednesday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraints1.cc (simplex.1): file
+	  refinewithconstraints1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-19 Wednesday 07:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.67): Restored implementation of
+	  add_constraints().
+
+2008-03-18 Tuesday 22:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.65), src/Grid.inlines.hh (1.23),
+	  src/Grid_public.cc (1.66), tests/Grid/Makefile.am (1.61),
+	  tests/Grid/congruences1.cc (1.14),
+	  tests/Grid/refinewithcongruences1.cc (1.1),
+	  tests/Grid/refinewithconstraints1.cc (1.1): Added methods
+	  refine_with_congruence(),  refine_with_congruences(),
+	  refine_with_constraint(),  refine_with_constraints().
+
+	  Removed some old redundant (commented out) tests in
+	  tests/Grid/congruences1.cc
+
+2008-03-18 Tuesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/refinewithcongruences1.cc (simplex.1): file
+	  refinewithcongruences1.cc was added on branch simplex on
+	  2008-06-06 14:22:11 +0000
+
+2008-03-18 Tuesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/refinewithconstraints1.cc (simplex.1): file
+	  refinewithconstraints1.cc was added on branch simplex on
+	  2008-06-06 14:22:11 +0000
+
+2008-03-18 Tuesday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.28), Watchdog/ChangeLog (1.17): Updated.
+
+2008-03-18 Tuesday 20:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.inlines.hh (1.29), tests/Box/Makefile.am (1.57): Restored
+	  code revoved in error.  Restored congruences1 test.
+
+2008-03-18 Tuesday 20:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.32): Two FIXMEs resolved.
+
+2008-03-18 Tuesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.31),
+	  Pointset_Powerset.templates.hh (1.27): Methods
+	  Pointset_Powerset<PS>::refine(const Constraint&) and
+	  Pointset_Powerset<PS>::refine(const Constraint_System&) renamed
+	  Pointset_Powerset<PS>::refine_with_constraint(const Constraint&)
+	  and Pointset_Powerset<PS>::refine_with_constraints(const
+	  Constraint_System&), respectively.
+
+2008-03-18 Tuesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.56): Disabled test program congruences1.
+
+2008-03-18 Tuesday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (1.7): Invoke refine_with_constraint()
+	  instead of the no longer existing refine().
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.49), src/Box.inlines.hh (1.28),
+	  tests/Box/Makefile.am (1.55), tests/Box/refine1.cc (1.13),
+	  tests/Box/refine2.cc (1.13), tests/Box/refine3.cc (1.6),
+	  tests/Box/refinewithconstraint1.cc (1.1),
+	  tests/Box/refinewithconstraint2.cc (1.1),
+	  tests/Box/refinewithconstraints1.cc (1.2),
+	  tests/Box/refinewithconstraints2.cc (1.1): Duplicate code
+	  avoided.  Fixed some comments.  Test programs reorganized.
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraint1.cc (simplex.1): file
+	  refinewithconstraint1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraint2.cc (simplex.1): file
+	  refinewithconstraint2.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraints2.cc (simplex.1): file
+	  refinewithconstraints2.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.48), src/Box.inlines.hh (1.27),
+	  src/Box.templates.hh (1.107), tests/Box/Makefile.am (1.54),
+	  tests/Box/refinewithcongruences1.cc (1.1),
+	  tests/Box/refinewithconstraints1.cc (1.1): Added
+	  refine_with_constraint(),  refine_with_constraints(),
+	  refine_with_congruence(),  refine_with_congruences() methods to
+	  the Box domain.
+
+2008-03-18 Tuesday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithcongruences1.cc (simplex.1): file
+	  refinewithcongruences1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 14:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.240): All the method names in the temporary documentation
+	  now preceded by the \p for use in doxygen code.  Also, all code
+	  here has been enclosed in the \code \endcode environment.
+
+2008-03-18 Tuesday 14:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.117), src/BD_Shape.inlines.hh (1.159),
+	  src/Octagonal_Shape.defs.hh (1.43),
+	  src/Octagonal_Shape.inlines.hh (1.31),
+	  src/Octagonal_Shape.templates.hh (1.72),
+	  tests/BD_Shape/congruences1.cc (1.4),
+	  tests/BD_Shape/constraints1.cc (1.24),
+	  tests/Octagonal_Shape/congruences1.cc (1.3),
+	  tests/Octagonal_Shape/constraints1.cc (1.7): Removed the
+	  and_minimize versions of the new refine_with methods.
+
+2008-03-18 Tuesday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/congruences1.cc (simplex.1): file congruences1.cc
+	  was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-03-18 Tuesday 13:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.239): Completed what I can of the documentation for the
+	  geometric descriptors.
+
+2008-03-18 Tuesday 12:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.238): Added to the draft documentation on geometric
+	  descrptors.
+
+2008-03-18 Tuesday 10:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.116), src/BD_Shape.inlines.hh (1.158),
+	  src/BD_Shape.templates.hh (1.98), src/Octagonal_Shape.defs.hh
+	  (1.42), src/Octagonal_Shape.inlines.hh (1.30),
+	  src/Octagonal_Shape.templates.hh (1.71),
+	  tests/BD_Shape/congruences1.cc (1.3),
+	  tests/BD_Shape/constraints1.cc (1.23),
+	  tests/Octagonal_Shape/congruences1.cc (1.2),
+	  tests/Octagonal_Shape/constraints1.cc (1.6): Added
+	  refine_with_[constraint GD] both with and without "and_minimize".
+	  A few tests added.  Small corrections to documentation for the
+	  add_[constraint GD] methods.
+
+2008-03-14 Friday 09:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.16): test07 definitely
+	  fails when using 8-bit coefficients and checking assertions.
+
+2008-03-14 Friday 09:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.76): Added macros
+	  DO_TEST_F<size><assertions>_MAY_OVERFLOW_IF_INEXACT for all
+	  possible bounded coefficient types.
+
+2008-03-14 Friday 08:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.75), BD_Shape/max_min2.cc (1.12): Modified
+	  the check_result helper function so as to take as input two
+	  _checked_ mpq_class numbers, rather than bare mpq_class. Adapted
+	  test10 of max_min2.cc accordingly.
+
+2008-03-11 Tuesday 08:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.237): Added a note on upward and downward approximations.
+
+2008-03-10 Monday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (1.11): Corrected silly initialization
+	  error of an mpq_class object from bounded numerator and
+	  denumrators.
+
+2008-03-10 Monday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (1.10): test10 modified so as to check
+	  its result using helper functions computing distances, thereby
+	  allowing for approximations.
+
+2008-03-10 Monday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.74): Added overloading for helper function
+	  check_result that allows for computing the rectilinear distance
+	  between two mpq_class numbers.
+
+2008-03-10 Monday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.236): Started drafting a text that, properly elaborated,
+	  should constitute the "philosophy" of our user interfaces.
+
+2008-03-10 Monday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.73): Added overloading for function
+	  check_result to compute and check distances between a pair of
+	  (closure) points.
+
+2008-03-10 Monday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.126), Generator.inlines.hh (1.64):
+	  Added functions to compute the (rectilinear, euclidean or
+	  l-infinify) distance between a pair of (closure) points.
+
+2008-03-10 Monday 07:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Octagonal_Shape.inlines.hh (1.29): Corrected a couple of
+	  comments.
+
+	  When building from a congruence system, for a non-zero dimension
+	  universe octagon, first set the stongly closed flag (as is
+	  already done for building from other systems).
+
+2008-03-09 Sunday 23:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.106): Braces added to avoid ambiguous
+	  `else'.
+
+2008-03-08 Saturday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.32), Watchdog/ltmain.sh (1.21),
+	  Watchdog/m4/libtool.m4 (1.3), Watchdog/m4/ltversion.m4 (1.2),
+	  m4/libtool.m4 (1.3), m4/ltversion.m4 (1.2): Updated from Libtool
+	  2.3a.
+
+2008-03-07 Friday 22:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/max_min2.cc (1.7): The bug shown by test07
+	  is now corrected.
+
+2008-03-07 Friday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (1.9): The bug shown by test10 is now
+	  corrected.
+
+2008-03-07 Friday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.97), MIP_Problem.cc (1.66):
+	  Corrected a bug in the evaluation of objective function whereby a
+	  wrong result could have been obtained if the objective function
+	  had a non-zero inhomogeneous term and the evaluating point was
+	  non-integral.
+
+2008-03-07 Friday 16:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/max_min2.cc (1.8), Octagonal_Shape/max_min2.cc
+	  (1.6): test07 in Octagonal_Shape/max_min2.cc and test10 in
+	  BD_Shape/max_min2.cc show a bug in having an inhomogeneous term
+	  in the linear expression for maximize() and minimize() when the
+	  denominator is different from 1.
+
+2008-03-07 Friday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh (1.96),
+	  src/Octagonal_Shape.templates.hh (1.70),
+	  tests/BD_Shape/relations3.cc (1.31), tests/BD_Shape/relations4.cc
+	  (1.13), tests/Octagonal_Shape/relatwithcons3.cc (1.3): Improved
+	  the code again for the relations_with() for constraints for both
+	  the Octagons and BD_Shapes. Tests also improved.
+
+	  The BD_Shape relation_with() for congruences now uses the
+	  relation_with() for constraints instead of the temporary
+	  implementation that converted to polyhedra to compute the
+	  relations.
+
+2008-03-07 Friday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons3.cc (simplex.1): file
+	  relatwithcons3.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-03-07 Friday 09:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/relatwithcons3.cc (1.2),
+	  src/Octagonal_Shape.templates.hh (1.69): Revised relation_with()
+	  for a congruence so as to use the relation_with() for a
+	  constraint instead of the temporary implementation which was
+	  coverting the octagon to a polyhedron and using the method there.
+
+	  Fixed a bug in relation_with() for a (non-octagonal) constraint
+	  due to the inclusion of the inhomogeneous term in the linear
+	  expression when calling maximize() and minimize().
+
+2008-03-07 Friday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations3.cc (simplex.1): file relations3.cc was added
+	  on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-03-07 Friday 07:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.105), tests/Box/relations3.cc (1.5):
+	  Redone the previous correction for the interval_relation() when
+	  the relation symbol is an equality as it did not correct the case
+	  when the interval was fully bounded.	A further test added for
+	  bounded intervals and equality.
+
+2008-03-06 Thursday 22:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.104), tests/Box/relations3.cc (1.4):
+	  Fixed a bug in the interval_relation() when the relation is an
+	  equality. Test added that showed this bug.
+
+2008-03-06 Thursday 16:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Octagonal_Shape.defs.hh (1.41),
+	  src/Octagonal_Shape.templates.hh (1.68),
+	  tests/BD_Shape/relations4.cc (1.12),
+	  tests/Octagonal_Shape/Makefile.am (1.25),
+	  tests/Octagonal_Shape/relatwithcons3.cc (1.1): In the Octagon
+	  domain, the relation_with() for a constraint now finds the
+	  relation with a non-octagonal difference constraint.
+
+	  Comment in Octagonal.defs.hh for relation_with() wrt this
+	  updated.
+
+	  Tests add to test this change.
+
+	  All tabs replaced by spaces in Octagonal.defs.hh and
+	  Octagonal_Shape.templates.hh
+
+	  The (if noisy) generated output in tests/BD_Shape/relations4.cc
+	  corrected.
+
+2008-03-06 Thursday 15:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: BD_Shape.defs.hh (1.115), BD_Shape.templates.hh (1.95):
+	  Removed/replaced all tabs.
+
+2008-03-06 Thursday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh (1.94): Two comment lines added.
+
+2008-03-06 Thursday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.114), src/BD_Shape.templates.hh (1.93),
+	  tests/BD_Shape/Makefile.am (1.72), tests/BD_Shape/relations2.cc
+	  (1.25), tests/BD_Shape/relations3.cc (1.30),
+	  tests/BD_Shape/relations4.cc (1.11): relation_with() for a
+	  constraint can now handle any constraint even if it is not a
+	  bounded difference.
+
+	  Comment in BD_Shape.defs.hh for this method updated.
+
+	  Tests added to check this (and existing tests to check exceptions
+	  revised).
+
+2008-03-06 Thursday 08:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.16): Enabled intersection_assign_and_minimize for all the Box
+	  domains, powersets with a Box domain as a disjunct and products
+	  with a Box domain as a component.
+
+2008-03-06 Thursday 08:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.15): In all the interfaces, the bounded_affine_image,
+	  generalized_affine_image, generalized_affine_image_lhs_rhs
+	  procedures are enabled now for: all the Box domains, powersets
+	  with a Box domain as its disjunct and products with a Box domain
+	  as a component.
+
+2008-03-05 Wednesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.304), Watchdog/configure.ac (1.44): Use the new
+	  style macro to initialize Libtool.
+
+2008-03-05 Wednesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.31), Watchdog/ltmain.sh (1.20),
+	  Watchdog/m4/libtool.m4 (1.2), m4/libtool.m4 (1.2): Updated to the
+	  CVS HEAD version of Libtool: this seems to solve the problems we
+	  experienced since the switch to Libtool 2.2.
+
+2008-03-03 Monday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.47), src/Box.inlines.hh (1.26),
+	  tests/Box/intersection1.cc (1.9): Added method
+	  intersection_assign_and_minimize() needed for uniformity with
+	  other domains in the PPL.
+
+2008-03-03 Monday 08:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.103), tests/Box/boundedaffineimage1.cc
+	  (1.16), tests/Box/generalizedaffineimage1.cc (1.15),
+	  tests/Box/generalizedaffineimage2.cc (1.5): Corrected two bugs,
+	  one in bounded_affine_image() when setting an interval to be
+	  unbounded caused an exception to be thrown and the other in
+	  generalized_affine_image/4 where the bounds were set when they
+	  should have been left unbounded.
+
+	  The first bug was illustrated by the extra test17 in
+	  boundedaffineimage1.cc
+
+	  The second bug by a modified form of test04 in
+	  generalizedaffineimage2.cc (previously the test did not test
+	  anything that is not tested elsewhere).
+
+	  Some tests in generalizedaffineimage1.cc used constraints that
+	  were not non-relational. Corrected.
+
+2008-03-03 Monday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffineimage2.cc (simplex.1): file
+	  generalizedaffineimage2.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on branch
+	  simplex on 2008-06-06 14:22:04 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.41), ltmain.sh (1.30), Watchdog/config.guess
+	  (1.25), Watchdog/ltmain.sh (1.19), Watchdog/m4/libtool.m4 (1.1),
+	  Watchdog/m4/ltoptions.m4 (1.1), Watchdog/m4/ltsugar.m4 (1.1),
+	  Watchdog/m4/ltversion.m4 (1.1), Watchdog/m4/lt~obsolete.m4 (1.1),
+	  m4/libtool.m4 (1.1), m4/ltoptions.m4 (1.1), m4/ltsugar.m4 (1.1),
+	  m4/ltversion.m4 (1.1), m4/lt~obsolete.m4 (1.1): Switched to
+	  Libtool 2.2.
+
+2008-03-02 Sunday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.72), Box/generalizedaffinepreimage1.cc
+	  (1.15): A couple of the test (11 and 15):  - definitely overflow
+	  when using 8 bit integers;  - may overflow when using bigger
+	  bounded integers and inexact intervals    boundary types.  Added
+	  new macro DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT to deal with these
+	  cases ... this is a tentative approach, have to decide if it is
+	  the way to go.
+
+2008-03-02 Sunday 08:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.71): Added a couple of using declaration for
+	  the IO_Operators namespace.
+
+2008-03-01 Saturday 23:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: boundedaffineimage1.cc (1.15),
+	  boundedaffinepreimage1.cc (1.8), generalizedaffinepreimage1.cc
+	  (1.14): A few tests may overflow if bounded integers coefficients
+	  *and* inexact interval boundary types are used together.
+
+2008-03-01 Saturday 23:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-01 Saturday 21:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.13): One of the
+	  previous changes reverted: test 7 needs an NNC polyhedron when
+	  checking for the known result.
+
+2008-03-01 Saturday 19:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.12): Test 7 overflows
+	  when using 8 bit integers with assertions turned on; tests 11 and
+	  15 overflow with 8 bit integers independently from assertions.
+
+2008-03-01 Saturday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.14): Tests 9 and 10 always
+	  succeed.
+
+2008-03-01 Saturday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.102): Fixed several issues in method
+	  bounded_affine_preimage that were preventing compilation when
+	  using bounded coefficient types; also corrected several
+	  efficiency bugs.
+
+2008-03-01 Saturday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.11): Fixed a bunch of
+	  known results by computing distances or requiring comparison with
+	  an NNC polyhedron if the exact boundaries are open.
+
+2008-03-01 Saturday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.17): Modified implementation of
+	  templatic constructor taking a Box: open bounds are now
+	  approximated using topologically closed halfspaces if the
+	  polyhedron being built is necessarily closed.
+
+2008-03-01 Saturday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.7): In test09() a
+	  C_Polyhedron is enough to check the result obtained.
+
+2008-03-01 Saturday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.70): Improved check_result() functions.
+
+2008-03-01 Saturday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.10): Indentation
+	  fixed.
+
+2008-03-01 Saturday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.6): Temporarily patched
+	  test09();  FIXME added.
+
+2008-03-01 Saturday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.5): Indentation fixed.
+	  Please do insert the lines
+
+	  ;; Do not use tabs for indentation.  (setq-default
+	  indent-tabs-mode nil)
+
+	  into your .emacs file.
+
+2008-03-01 Saturday 08:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.4): Revised check_result
+	  expected results for test12.
+
+2008-02-29 Friday 23:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.3): Corrected title line
+	  of file.
+
+2008-02-29 Friday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: addspacedims1.cc (1.5),
+	  affinepreimage1.cc (1.7), affinepreimage2.cc (1.5),
+	  boundedaffineimage1.cc (1.12), boundedaffinepreimage1.cc (1.6),
+	  cc76extrapolation1.cc (1.7), expandspacedim1.cc (1.7),
+	  frompolyhedron1.cc (1.6), generalizedaffineimage1.cc (1.6),
+	  generalizedaffineimage2.cc (1.6), generalizedaffineimage3.cc
+	  (1.11), generalizedaffineimage4.cc (1.6),
+	  generalizedaffineimage5.cc (1.6), generalizedaffinepreimage1.cc
+	  (1.7), generalizedaffinepreimage2.cc (1.11),
+	  generalizedaffinepreimage3.cc (1.7),
+	  generalizedaffinepreimage4.cc (1.6),
+	  limitedbhmz05extrapolation1.cc (1.7),
+	  limitedcc76extrapolation1.cc (1.7), membytes1.cc (1.6),
+	  minconstraints1.cc (1.6), relatwithgen1.cc (1.10): Untabified.
+
+2008-02-29 Friday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/congruences1.cc (1.2): This was ripped from the
+	  Octagonal_Shape directory without even renaming variables or
+	  adapting comments: fixed.
+
+2008-02-29 Friday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.69), BD_Shape/addconstraints1.cc (1.22),
+	  BD_Shape/addspacedims1.cc (1.19), BD_Shape/affineimage1.cc
+	  (1.23), BD_Shape/affineimage2.cc (1.16),
+	  BD_Shape/affinepreimage1.cc (1.24), BD_Shape/bdsdifference1.cc
+	  (1.18), BD_Shape/bdshull1.cc (1.19), BD_Shape/bhmz05widening1.cc
+	  (1.18), BD_Shape/boundedaffineimage1.cc (1.7),
+	  BD_Shape/boundedaffinepreimage1.cc (1.7),
+	  BD_Shape/cc76extrapolation1.cc (1.23), BD_Shape/cc76narrowing1.cc
+	  (1.21), BD_Shape/concatenate1.cc (1.17), BD_Shape/constraints1.cc
+	  (1.22), BD_Shape/expandspacedim1.cc (1.7),
+	  BD_Shape/foldspacedims1.cc (1.9), BD_Shape/fromgensys1.cc (1.18),
+	  BD_Shape/generalizedaffineimage1.cc (1.21),
+	  BD_Shape/generalizedaffineimage2.cc (1.25),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.19),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.20),
+	  BD_Shape/generalizedaffinepreimage3.cc (1.10),
+	  BD_Shape/h79widening1.cc (1.16), BD_Shape/intersection1.cc
+	  (1.21), BD_Shape/limitedbhmz05extrapolation1.cc (1.19),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.20),
+	  BD_Shape/limitedh79extrapolation1.cc (1.17),
+	  BD_Shape/mapspacedims1.cc (1.19), BD_Shape/minconstraints1.cc
+	  (1.15), BD_Shape/removespacedims1.cc (1.24),
+	  BD_Shape/timeelapse1.cc (1.25): Always use the check_result()
+	  functions to check computed results against the known ones.
+
+2008-02-29 Friday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.21), addspacedims1.cc
+	  (1.18), affinedimension1.cc (1.14), affineimage1.cc (1.22),
+	  affineimage2.cc (1.15), ascii_dump_load1.cc (1.18), bounded1.cc
+	  (1.5), boundedaffinepreimage1.cc (1.6), boundingbox1.cc (1.3),
+	  cc76extrapolation1.cc (1.22), closure1.cc (1.23),
+	  containsintegerpoint1.cc (1.5), discrete1.cc (1.5),
+	  fromgensys1.cc (1.17), fromgrid1.cc (1.4), fromoctagonalshape1.cc
+	  (1.3), fromspacedim1.cc (1.4), generalizedaffineimage1.cc (1.20),
+	  generalizedaffineimage2.cc (1.24), generalizedaffinepreimage1.cc
+	  (1.18), generalizedaffinepreimage2.cc (1.19),
+	  generalizedaffinepreimage3.cc (1.9),
+	  limitedbhmz05extrapolation1.cc (1.18),
+	  limitedcc76extrapolation1.cc (1.19), mapspacedims1.cc (1.18),
+	  max_min1.cc (1.5), max_min2.cc (1.7), membytes1.cc (1.6),
+	  minconstraints1.cc (1.14), relations1.cc (1.20), relations2.cc
+	  (1.24), relations3.cc (1.29), removespacedims1.cc (1.23),
+	  timeelapse1.cc (1.24), universe1.cc (1.17), writebdshape1.cc
+	  (1.13): More variables renamed.
+
+2008-02-29 Friday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: h79widening1.cc (1.15), intersection1.cc (1.20),
+	  limitedbhmz05extrapolation1.cc (1.17),
+	  limitedcc76extrapolation1.cc (1.18), limitedh79extrapolation1.cc
+	  (1.16), mapspacedims1.cc (1.17), timeelapse1.cc (1.23),
+	  writebdshape1.cc (1.12): Variable renaming completed.
+
+2008-02-29 Friday 16:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.2): In test03, result
+	  checked using check_result.
+
+2008-02-29 Friday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.101), tests/Box/Makefile.am (1.53),
+	  tests/Box/boundedaffinepreimage1.cc (1.1),
+	  tests/Box/generalizedaffinepreimage1.cc (1.9): Added code for
+	  generalized_affine_preimage (both versions) and
+	  bounded_affine_preimage.  Minor improvement to
+	  bounded_affine_image where we add the constraint that the lower
+	  bound expression must be less than the upper bound expression (or
+	  vice versa if the denominator is negative).
+
+	  Some tests added or revised.
+
+2008-02-29 Friday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.13): test09() and test10()
+	  provoke an overflow only with assertions enabled.
+
+2008-02-29 Friday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: addspacedims1.cc (1.8), boundedaffineimage1.cc
+	  (1.12), closure1.cc (1.6), expandspacedim1.cc (1.9),
+	  frompolyhedron1.cc (1.13), generalizedaffineimage1.cc (1.14),
+	  generalizedaffineimage2.cc (1.4), generalizedaffinepreimage1.cc
+	  (1.8), interval1.cc (1.6), interval2.cc (1.6), minconstraints1.cc
+	  (1.7), refine2.cc (1.12), refine3.cc (1.5), removespacedims1.cc
+	  (1.10), timeelapse1.cc (1.9): Untabified.
+
+2008-02-29 Friday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.11): Adapted test02() to the new dump
+	  format.
+
+2008-02-29 Friday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.100): Spurious separator avoided in
+	  ascii_dump().
+
+2008-02-29 Friday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.20), addspacedims1.cc
+	  (1.17), affineimage1.cc (1.21), affinepreimage1.cc (1.23),
+	  ascii_dump_load1.cc (1.17), bdsdifference1.cc (1.17), bdshull1.cc
+	  (1.18), bhmz05widening1.cc (1.17), boundedaffineimage1.cc (1.6),
+	  boundedaffinepreimage1.cc (1.5), bounds1.cc (1.5),
+	  cc76extrapolation1.cc (1.21), cc76narrowing1.cc (1.20),
+	  closure1.cc (1.22), concatenate1.cc (1.16), constraints1.cc
+	  (1.21), contains1.cc (1.17), disjoint1.cc (1.8), empty1.cc
+	  (1.13), equality1.cc (1.18), expandspacedim1.cc (1.6),
+	  foldspacedims1.cc (1.8), frompolyhedron1.cc (1.7),
+	  generalizedaffineimage1.cc (1.19), generalizedaffineimage2.cc
+	  (1.23), generalizedaffinepreimage1.cc (1.17),
+	  generalizedaffinepreimage2.cc (1.18),
+	  generalizedaffinepreimage3.cc (1.8), geomcovers1.cc (1.12),
+	  limitedbhmz05extrapolation1.cc (1.16),
+	  limitedcc76extrapolation1.cc (1.17), membytes1.cc (1.5),
+	  minconstraints1.cc (1.13), removespacedims1.cc (1.22),
+	  timeelapse1.cc (1.22): A first go at naming variables properly.
+
+2008-02-29 Friday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: generalizedaffineimage1.cc (1.13),
+	  generalizedaffineimage2.cc (1.3): Always the check_result()
+	  function to check results.
+
+2008-02-29 Friday 07:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.11): test09() and test10()
+	  cause overflows with 32-bit or narrower coefficients.
+
+2008-02-28 Thursday 23:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.12), addspacedims1.cc (1.7),
+	  affineimage1.cc (1.10), affinepreimage1.cc (1.7),
+	  boundedaffineimage1.cc (1.10), boxdifference1.cc (1.8),
+	  boxhull1.cc (1.7), cc76narrowing1.cc (1.7), cc76widening.cc
+	  (1.8), concatenate1.cc (1.8), congruences1.cc (1.3),
+	  constraints1.cc (1.11), frombdshape1.cc (1.4), fromgensys1.cc
+	  (1.6), generalizedaffineimage1.cc (1.12),
+	  generalizedaffineimage2.cc (1.2), generalizedaffinepreimage1.cc
+	  (1.7), intersection1.cc (1.8), mapspacedims1.cc (1.7), refine1.cc
+	  (1.12), refine3.cc (1.4), removespacedims1.cc (1.9),
+	  timeelapse1.cc (1.8): Always use check_result() to check for
+	  correctness of the results.
+
+2008-02-28 Thursday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: bdsdifference1.cc (1.7), boxhull.cc (1.6): Unwanted
+	  file removed.
+
+2008-02-28 Thursday 22:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/timeelapse1.cc (1.7): Comments fixed.
+
+2008-02-28 Thursday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.11), addspacedims1.cc (1.6),
+	  affineimage1.cc (1.9), affinepreimage1.cc (1.6),
+	  expandspacedim1.cc (1.8), foldspacedims1.cc (1.9), geomcovers1.cc
+	  (1.6), mapspacedims1.cc (1.6), removespacedims1.cc (1.8): Do not
+	  name something `box1' if there is no `box2' in sight.
+
+2008-02-28 Thursday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.99): All other things being equal, always
+	  prefer preincrement and predecrement to postincrement and
+	  postdecrement.
+
+2008-02-28 Thursday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (1.23): Spurious semicolon
+	  removed.
+
+2008-02-28 Thursday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.46), Box.templates.hh (1.98): Meaningless
+	  type qualifiers removed.
+
+2008-02-28 Thursday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.45): Indentation fixed.  Spurious semicolon
+	  and useless namespace enclosure removed.
+
+2008-02-28 Thursday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.44), Box.inlines.hh (1.25), Box.templates.hh
+	  (1.97), Box_Status.idefs.hh (1.2), Box_Status.inlines.hh (1.2):
+	  The Box class now uses (badly) the new Status member instead of
+	  the old two booleans.
+
+2008-02-28 Thursday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.96): Initialize a local variable in
+	  generalized_affine_image so as to avoid an annoying warning.
+
+2008-02-28 Thursday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffineimage1.cc (1.11): Avoid long lines.
+
+2008-02-28 Thursday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.9): Corrected known result
+	  for test03: no approximation is needed in this case.	Computed
+	  distances between known and computed result for test10.
+
+2008-02-28 Thursday 17:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.95): Fixed an error in
+	  l_m_distance_assign.
+
+2008-02-28 Thursday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: boundedaffineimage1.cc (1.8),
+	  generalizedaffineimage1.cc (1.10): Expected results revised.
+	  Notive that test10() in boundedaffineimage1.cc shows there is a
+	  bug in check_result().
+
+2008-02-28 Thursday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.86), devref.doxyconf-latex.in
+	  (1.25): Mention input files math_utilities.*.
+
+2008-02-28 Thursday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: globals.cc (1.33), math_utilities.inlines.hh (1.2):
+	  Implementation of function is_canonical() is now inlines and in a
+	  proper place.
+
+2008-02-28 Thursday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/math_utilities.inlines.hh (simplex.1): file
+	  math_utilities.inlines.hh was added on branch simplex on
+	  2008-06-06 14:22:05 +0000
+
+2008-02-28 Thursday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.207): Reference CC79 added.
+
+2008-02-28 Thursday 10:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/: boundedaffineimage1.cc (1.7),
+	  generalizedaffineimage1.cc (1.9): Revised expected results to
+	  allow for inexact computations.
+
+2008-02-28 Thursday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.18): Minor typo corrected in docs.
+
+2008-02-28 Thursday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.67): Indentation fixed.
+
+2008-02-25 Monday 11:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.94), src/Polyhedron_public.cc (1.109),
+	  tests/Box/Makefile.am (1.52),
+	  tests/Box/generalizedaffineimage1.cc (1.8),
+	  tests/Box/generalizedaffineimage2.cc (1.1): Added implementation
+	  for generalized_affine_image/3 Tests added and existing tests
+	  revised.
+
+	  Indentation corrected in src/Polyhedron_public.cc.
+
+2008-02-22 Friday 23:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (1.108),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.14): Fixed bug
+	  indicated in previous commit.  Added two further tests to
+	  tests/Polyhedron/boundedaffineimage1.cc to cover more cases of
+	  positive and negative denominator.
+
+2008-02-22 Friday 13:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.93): Use temporaries more in the
+	  bounded_affine_image/4 code..
+
+2008-02-22 Friday 12:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.92), tests/Box/Makefile.am (1.51),
+	  tests/Box/boundedaffineimage1.cc (1.6),
+	  tests/Box/generalizedaffineimage1.cc (1.7): First draft of code
+	  for generalized_affine_image/4 and bounded_affine_image/4.
+
+	  Tests revised and also enabled in Makefile.am.
+
+2008-02-22 Friday 12:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (1.13): Added a test04
+	  that shows a bug in bounded_affine_image().
+
+2008-02-21 Thursday 13:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.6),
+	  devref-c-interface.doxyconf-latex.in (1.6),
+	  devref-c-interface.tex (1.4),
+	  devref-prolog-interface.doxyconf-html.in (1.5),
+	  devref-prolog-interface.doxyconf-latex.in (1.5),
+	  devref.doxyconf-html.in (1.85), devref.doxyconf-latex.in (1.24),
+	  devref.tex (1.25), fdl.dox (1.8), gpl.dox (1.9),
+	  user-c-interface.doxyconf-html.in (1.7),
+	  user-c-interface.doxyconf-latex.in (1.7), user-c-interface.tex
+	  (1.4), user-prolog-interface.doxyconf-html.in (1.6),
+	  user-prolog-interface.doxyconf-latex.in (1.6),
+	  user-prolog-interface.tex (1.4), user.doxyconf-html.in (1.42),
+	  user.doxyconf-latex.in (1.13), user.tex (1.26): Modified
+	  configuration files for the HTML versions of foreign language
+	  interface manuals so that they will always include a new copy of
+	  the GPL and GFDL licenses.  Creating a documentation page in
+	  Doxygen using command \page does not produces a referenceable
+	  anchor: hence, explicitly added commands \anchor to gpl.dox and
+	  fdl.dox; modified main *.tex pages so as to proper reference
+	  these anchors (thereby solving a long standing issue).  All
+	  Doxygen configuration files upgraded to version 1.5.5.
+
+2008-02-19 Tuesday 22:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.29), ppl_interface_generator_ocaml_ml_code.m4 (1.24),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.18): Added the
+	  Tuareg emacs mode at the start of the ml and mli files and the
+	  C++ mode at the start of the cc file.  These then used to help
+	  improved some formatting.
+
+2008-02-19 Tuesday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.40), Octagonal_Shape.inlines.hh
+	  (1.28), Octagonal_Shape.templates.hh (1.66), Og_Status.idefs.hh
+	  (1.10): Added methods to operate on the status.
+
+2008-02-19 Tuesday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.113): Comment improved.
+
+2008-02-19 Tuesday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.43), Box.templates.hh (1.91): Added a (still
+	  unused) status member.
+
+2008-02-19 Tuesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.112), BD_Shape.inlines.hh (1.157),
+	  BD_Shape.templates.hh (1.92): Added methods to operate on the
+	  status.
+
+2008-02-19 Tuesday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh (1.24): Comment improved.
+
+2008-02-19 Tuesday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box_Status.idefs.hh (1.1), Box_Status.inlines.hh (1.1),
+	  Makefile.am (1.179): Declaration and definitions of the class
+	  Box<Interval>::Status.
+
+2008-02-19 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.23), BDS_Status.inlines.hh (1.19),
+	  Grid_Status.idefs.hh (1.9), Og_Status.idefs.hh (1.9),
+	  Ph_Status.idefs.hh (1.23): Multiple inclusion guards fixed.
+
+2008-02-19 Tuesday 13:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.42), Partially_Reduced_Product.defs.hh
+	  (1.22): Fixed a bunch of Doxygen related errors and warnings.
+
+2008-02-17 Sunday 22:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (1.107): Small improvement to code for
+	  relation_with(Congruence).
+
+2008-02-17 Sunday 00:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.70): Enable
+	  relation_with() for a congruence for the weakly relational
+	  domains in all the interfaces.
+
+2008-02-16 Saturday 23:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.90), tests/Box/relations4.cc (1.3):
+	  Improved code changed for 0-dimensional box domains for
+	  relation_with() for a congruence.  Added a test to check this
+	  change.
+
+2008-02-16 Saturday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations4.cc (simplex.1): file relations4.cc was added
+	  on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-02-16 Saturday 23:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.69),
+	  src/Box.templates.hh (1.89), tests/Box/relations4.cc (1.2):
+	  Enabled the relation_with() for box domains in all the
+	  interfaces.
+
+	  The Prolog generated tests showed a bug in the code for the zero
+	  dimensional empty Box - now tested in relations 4.cc.
+
+	  The bug has been fixed.
+
+2008-02-16 Saturday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.inlines.hh (1.34), Interval_Info.defs.hh (1.7):
+	  Properly comment the closing brace of namespaces.  When used in
+	  templates, Parma_Polyhedra_Library::used() should be fully
+	  qualified.
+
+2008-02-16 Saturday 15:28  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.55): Some fixes to refine_universal.
+	  Added unrepresentability_error check.
+
+2008-02-16 Saturday 15:04  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.11): Propagate unrepresentability error
+	  insted of aborting.
+
+2008-02-16 Saturday 13:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.41), src/Box.templates.hh (1.88),
+	  tests/Box/Makefile.am (1.50), tests/Box/relations4.cc (1.1):
+	  Renamed private method interval_relation_no_check() as
+	  interval_relation() as there is now nothing that is unchecked.
+	  Added relation_with() for congruences for Boxes.
+
+2008-02-16 Saturday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (1.6): Test rewritten.
+
+2008-02-16 Saturday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.49): Do test also with membytes1.cc.
+
+2008-02-15 Friday 18:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.87): Corrected a bug in an assignment in
+	  relation_with().
+
+2008-02-15 Friday 15:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.86), tests/Box/relations3.cc (1.3): Bug
+	  identified in previous commit, fixed.
+
+2008-02-15 Friday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/relations3.cc (1.2): Extra test shows a bug in the
+	  relation_with() for congruences for a non-relational,
+	  1-dimensional box and constraint.
+
+2008-02-15 Friday 12:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.30),
+	  C/ppl_interface_generator_c_h_code.m4 (1.20),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.47),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.41), Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.64):
+	  Include emacs mode at the top of the code files.  A few minor
+	  bugs fixed and for Prolog and C files, indentation improved using
+	  emacs.
+
+2008-02-15 Friday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.36): Missing change for uniformity of m4 files, related to the
+	  previous two commits.
+
+2008-02-15 Friday 10:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.16):
+	  Add a copyright notice to the generated file.
+
+2008-02-15 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_ocaml_procedure_generators.m4 was added
+	  on branch simplex on 2008-06-06 14:22:00 +0000
+
+2008-02-15 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_prolog_procedure_generators.m4 was added
+	  on branch simplex on 2008-06-06 14:22:00 +0000
+
+2008-02-15 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_procedure_generators.m4 was added on
+	  branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-02-15 Friday 10:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.32),
+	  ppl_interface_generator_common_dat.m4 (1.68),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.14),
+	  C/ppl_interface_generator_c_cc.m4 (1.16),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.29),
+	  C/ppl_interface_generator_c_h.m4 (1.16),
+	  C/ppl_interface_generator_c_h_code.m4 (1.19),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.5),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.6),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.13),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.46),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.21),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.40), OCaml/ppl_interface_generator_ocaml_cc.m4 (1.9),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.28),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.14),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.23),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.12),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.17),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.4), Prolog/ppl_interface_generator_prolog_icc.m4 (1.15),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.63),
+	  Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.2), Prolog/ppl_interface_generator_prolog_systems.m4 (1.14),
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.8),
+	  Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.9), Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.8),
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.12),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.15),
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.9),
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.11),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.10), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.9),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.74),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.35): Include a description of what the m4 code is for in each
+	  file.  Improved other details to make the code more uniform
+	  across all interfaces and all the different m4 file generators.
+
+	  Included the copyright notice in more of the generated files.
+
+2008-02-14 Thursday 22:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Box.defs.hh (1.40), Box.templates.hh (1.85): The
+	  Constraint::Type is passed as a parameter to
+	  interval_relation_no_check() instead of the Relation_Symbol.
+
+2008-02-14 Thursday 18:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Box.defs.hh (1.39), Box.templates.hh (1.84): In the code
+	  for relation_with() for constraints, avoid reconstructing the
+	  constraint only for the private method that implements the main
+	  cases to have to deconstruct the constraint.	Comments improved.
+
+2008-02-14 Thursday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.34): The out-of-range
+	  test in
+
+	    template <typename U, typename V> U jtype_to_unsigned(const V&)
+
+	  was indeed necessary.  Restored, but in a more efficient and
+	  warning-free way.
+
+2008-02-14 Thursday 13:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.83): Parameter renamed.  Avoid to declare
+	  things that are only used in assertions, unless everything is
+	  within #ifndef NDEBUG / #endif.
+
+2008-02-14 Thursday 12:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.38), src/Box.templates.hh (1.82),
+	  tests/Box/Makefile.am (1.48), tests/Box/relations2.cc (1.5),
+	  tests/Box/relations3.cc (1.1): Completed implementation for
+	  relation_with(Constraint) for a Box when the constraint is not an
+	  interval constraint.	Tests added for this case.
+
+	  The implementation is split between a private method that finds
+	  the relation between an interval and a one dimensional constraint
+	  and the public method for any box and any constraint.
+
+2008-02-14 Thursday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.45),
+	  ppl_java_common.hh (1.33): template <typename U, typename V> U
+	  jtype_to_unsigned(const V&) was unnecessarily complex and
+	  generated an annoying warning: fixed.
+
+2008-02-13 Wednesday 12:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.67): Spelling
+	  corrected.
+
+	  Previous commit change: removed redundant code and simplified
+	  code for the disjunct replacement.
+
+2008-02-13 Wednesday 12:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.66),
+	  src/Partially_Reduced_Product.inlines.hh (1.21),
+	  tests/Grid/partiallyreducedproduct4.cc (1.2): Fixed the bug
+	  indicated by the tests added in the previous commit.	Ensure that
+	  emptiness is always shared between the components for the
+	  Constraints_Product product_reduce().
+
+2008-02-13 Wednesday 09:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.60), partiallyreducedproduct4.cc
+	  (1.1): Two tests indicate bugs for Constraints_Product when a
+	  component is a box.
+
+2008-02-13 Wednesday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Integer.hh (1.7), Makefile.am (1.178), Row.inlines.hh
+	  (1.68), globals.defs.hh (1.55), globals.inlines.hh (1.23): Header
+	  file reorganization consequent to the introduction of
+	  math_utilities.*.
+
+2008-02-13 Wednesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.79), checked.inlines.hh
+	  (1.42): Redundant memory size inspection functions removed from
+	  the Checked namespace.
+
+2008-02-13 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: math_utilities.defs.hh (1.1), math_utilities.inlines.hh
+	  (1.1): New sources containing some math utility functions
+	  previously in globals.*.
+
+2008-02-13 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/math_utilities.defs.hh (simplex.1): file
+	  math_utilities.defs.hh was added on branch simplex on 2008-06-06
+	  14:22:05 +0000
+
+2008-02-12 Tuesday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.81): Several improvements in
+	  Box<Interval>::relation_with(const Constraint&).
+
+2008-02-12 Tuesday 21:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.80): Drafted the first part of the code
+	  required so that Box<Interval>::relation_with(const Constraint&
+	  c) does the right thing whatever is the form of `c'.
+
+2008-02-12 Tuesday 21:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh (1.33): Silenced a warning.
+
+2008-02-12 Tuesday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.177), Rational_Box.hh (1.8): Rational_Box is
+	  now Box<Rational_Interval>.
+
+2008-02-12 Tuesday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Interval.hh (1.1): Rational_Interval is an internal
+	  class implementing an interval with rational, possibly open
+	  boundaries.
+
+2008-02-12 Tuesday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Interval.hh (simplex.1): file Rational_Interval.hh
+	  was added on branch simplex on 2008-06-06 14:22:05 +0000
+
+2008-02-12 Tuesday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh (1.46), checked_mpz.inlines.hh
+	  (1.53), meta_programming.hh (1.11): More Is_Native
+	  specializations moved to meta_programming.hh.
+
+2008-02-12 Tuesday 18:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.73): Avoid some annoying warning messages.
+
+2008-02-12 Tuesday 18:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.65),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.13),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.72): Enable the memory_in_bytes methods for pointset_powersets
+	  of boxes and for products with boxes as components.
+
+	  The Prolog tests expected results have to allow for any
+	  Uint*_Box.
+
+2008-02-12 Tuesday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.303): Allow digits in the computation of
+	  `required_instantiations_java_sources'.
+
+2008-02-12 Tuesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.29): Previous commit completed.
+
+2008-02-12 Tuesday 12:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.inlines.hh (1.24), Interval.inlines.hh (1.32),
+	  checked_mpq.inlines.hh (1.45), checked_mpz.inlines.hh (1.52),
+	  globals.defs.hh (1.54), globals.inlines.hh (1.22): Moved all the
+	  memory occupation inspection functions to globals.*.	In
+	  GMP_Integer.defs.hh we keep the declarations of memory_size_type
+	  total_memory_in_bytes(const GMP_Integer& x) and memory_size_type
+	  external_memory_in_bytes(const GMP_Integer& x), in order to obey
+	  the rule "every public PPL object has memory inspection
+	  functions."  However, not to confuse Doxygen with (apparently)
+	  duplicated documentation, the documentation of the declarations
+	  in GMP_Integer.defs.hh is controlled by #ifndef
+	  PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS.
+
+2008-02-12 Tuesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.53), globals.inlines.hh (1.21): Added
+	  template <typename T> memory_size_type
+	  external_memory_in_bytes(const T&) enabled for all native types
+	  T.
+
+2008-02-12 Tuesday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked.defs.hh (1.45), checked_float.inlines.hh (1.84),
+	  checked_int.inlines.hh (1.66), meta_programming.hh (1.10): Moved
+	  the definitions for Is_Native to meta_programming.hh.
+
+2008-02-12 Tuesday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.64),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.12),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.71), Prolog/tests/ppl_predicate_check_common.pl (1.10): A
+	  couple of bugs in the m4 code fixed Enabled the generation of a
+	  few more procedures for certain domains.
+
+	  A bug in the Prolog test files fixed.
+
+2008-02-11 Monday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.97): Let
+	  external_memory_in_bytes(const Checked_Number<T, Policy>&) return
+	  memory_size_type, not size_t.
+
+2008-02-11 Monday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.37), Box.inlines.hh (1.24), Box.templates.hh
+	  (1.79): Added Box<Interval>::total_memory_in_bytes() and
+	  Box<Interval>::memory_size_type external_memory_in_bytes().
+
+2008-02-11 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.54), Interval.inlines.hh (1.31): Added
+	  Interval<Boundary, Info>::external_memory_in_bytes() and
+	  Interval<Boundary, Info>::total_memory_in_bytes().
+
+2008-02-11 Monday 10:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.36), Box.templates.hh (1.78): Adde
+	  Box<Interval>::topological_closure_assign().
+
+2008-02-11 Monday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.53): Added void Interval<Boundary,
+	  Info>::topological_closure_assign().
+
+2008-02-11 Monday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.77): Optimized bool
+	  Box<Interval>::is_topologically_closed() const: if
+	  !Interval::info_type::store_open, then the box is certainly
+	  topologically closed.
+
+2008-02-10 Sunday 22:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.15),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.63),
+	  interfaces/C/Makefile.am (1.40),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.15),
+	  interfaces/Java/jni/Makefile.am (1.18),
+	  interfaces/Java/jni/ppl_java_common.hh (1.32),
+	  interfaces/OCaml/Makefile.am (1.38),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.13),
+	  interfaces/Prolog/ppl_prolog_common.icc (1.15): Enable all 13
+	  types of boxes in interfaced_boxes.hh for all the interfaces, as
+	  they are or as disjuncts to the powerset domain or as components
+	  of the product domain.
+
+	  instchk.hh allows for all of these boxes to be arguments to
+	  "-instantiations" in the configuration.
+
+	  Macro m4_get_class_index name changed to m4_get_class_counter so
+	  that the word "counter" is used consistently for the number
+	  associated to the class being generated.
+
+2008-02-08 Friday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/interfaced_boxes.hh (1.4): Added declarations for the
+	  native integer boxes.
+
+2008-02-08 Friday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/interfaced_boxes.hh (simplex.1): file
+	  interfaced_boxes.hh was added on branch simplex on 2008-06-06
+	  14:21:57 +0000
+
+2008-02-08 Friday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: interfaced_boxes.hh (1.3),
+	  Prolog/ppl_prolog_common.icc (1.14), Prolog/Ciao/Makefile.am
+	  (1.72), Prolog/GNU/Makefile.am (1.70), Prolog/SICStus/Makefile.am
+	  (1.86), Prolog/SWI/Makefile.am (1.82), Prolog/XSB/Makefile.am
+	  (1.62), Prolog/YAP/Makefile.am (1.59): Include
+	  interfaced_boxes.hh into all Prolog interfaces.
+
+2008-02-08 Friday 14:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/interfaced_boxes.hh (1.2): Fixed a missing ">".
+
+2008-02-08 Friday 13:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.62): Minor
+	  technical improvements to the m4 code.
+
+2008-02-08 Friday 13:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.31), interfaced_boxes.hh (1.1): New
+	  header file (to be completed) providing declarations for the Box
+	  instantiations offered by the foreign interfaces.
+
+2008-02-08 Friday 13:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.31),
+	  ppl_interface_generator_common_dat.m4 (1.61): In the last commit,
+	  the message said  "the change has   a "fixme" since this
+	  indicates that the way the replacements for all   patterns is
+	  handled needs improving and that this local change   should be
+	  made more general." This is now fixed and the main replacement
+	  macros now incorporate this improvement.
+
+	  Improved the specification of the replacements for the binary
+	  operators for the Pointset_Powerset domains.
+
+	  A few minor improvements to avoid unnecessary computations.
+
+2008-02-08 Friday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.30),
+	  ppl_interface_generator_common_dat.m4 (1.60): The code for
+	  intersecting sequences of comma separated strings improved so
+	  that the same basic code is used for intersecting both 2
+	  sequences and 3 sequences.
+
+	  The last changes introduced a bug for some products (such as Grid
+	  x BD_Shape<...> products. This is now fixed, but the change has a
+	  "fixme" since this indicates that the way the replacements for
+	  all patterns is handled needs improving and that this local
+	  change should be made more general.
+
+2008-02-07 Thursday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.52): Added the documentation for the
+	  difference_assign() methods.
+
+2008-02-07 Thursday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh (1.76), Interval.defs.hh (1.51),
+	  Interval.inlines.hh (1.30): Added declarations and empty
+	  implementations for Interval<To_Boundary,
+	  To_Info>::difference_assign(const From&) and
+	  Interval<To_Boundary, To_Info>::difference_assign(const From1&,
+	  const From2&).
+
+2008-02-07 Thursday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bit_Row.defs.hh (1.10), Bit_Row.inlines.hh (1.7): Added
+	  void set_difference(const Bit_Row&, const Bit_Row&, Bit_Row&).
+
+2008-02-07 Thursday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.29),
+	  ppl_interface_generator_common_dat.m4 (1.59),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.11):
+	  Enabled the Pointset_Powerset domain to have a Rational_Box as
+	  the disjunct and the Product domains to have a Rational_Box as
+	  one of its component domains in all the interfaces.
+
+	  To allow for a number of missing methods in the Box domain that
+	  cannot therefore be provided in any product domain that has the
+	  Box as a component, defined two generic macros in
+	  ppl_interface_generator_common.m4 that intersect sequences of
+	  comma-separated strings: one that intersects two sequences and
+	  one that intersects three sequences.
+
+	  Also now support a new notation in a procedure string - e.g.,
+	  "?box" means don't include this procedure for any product that
+	  has Box as one of its components.  This option may be removed in
+	  the future and its use avoided by using the sequence intersection
+	  macros described above.
+
+2008-02-07 Thursday 07:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.35): Fixed the documentation of
+	  set_interval(Variable, const Interval&).
+
+2008-02-05 Tuesday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.14): The instantiations configuration options now
+	  include Rational_Box.
+
+2008-02-05 Tuesday 15:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.58),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.10),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.5):
+	  The interfaces now support Rational_Box as a simple class for
+	  most of the procedures.  Powersets and Products with a Box as a
+	  base domain still to be checked.
+
+2008-02-05 Tuesday 14:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.75): Fixed method
+	  Box<I>::concatenate_assign(const Box&).
+
+2008-02-05 Tuesday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/concatenate1.cc (1.7): Added test06 which shows an
+	  assertion failure when executing concatenate_assign() in the Box
+	  domain.
+
+2008-02-04 Monday 12:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.28),
+	  ppl_interface_generator_common_dat.m4 (1.57): Fixed some bugs,
+	  simplified and improved some code and improved the documentation
+	  for new and changed the macros.
+
+	  Now the interfaces compile and tests run ok with all
+	  Pointset_Powersets of polyhedra, weakly relational domains and
+	  grids.  Also the interfaces compile and tests run ok with any
+	  products of the same domains.
+
+2008-02-01 Friday 17:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.27),
+	  ppl_interface_generator_common_dat.m4 (1.56),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.9),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.39), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.27),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.22),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.16),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.62):
+	  Interface code revised so as to handle powersets of weakly
+	  relational domain elements. More tests are still needed.  The new
+	  m4 code in ppl_interface_generator_common_dat.m4 will be
+	  documentated later.
+
+2008-02-01 Friday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (1.10): Tests uncommented
+	  (apparently they were commented out by mistake on April 3, 2007).
+
+2008-02-01 Friday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.235), src/BD_Shape.defs.hh (1.111),
+	  src/BD_Shape.templates.hh (1.91), src/Octagonal_Shape.defs.hh
+	  (1.39), src/Octagonal_Shape.templates.hh (1.65),
+	  tests/BD_Shape/relations3.cc (1.28),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.9): Added methods
+	  relation_with() for congruences to the Octagonal_Shape and
+	  BD_Shape domains.
+
+	  Added notes wrt these and the relation_with() for costraints in
+	  the TODO file.
+
+	  Exception throwers throw_dimension_incompatible() for congruences
+	  added to both these domains.
+
+2008-01-31 Thursday 15:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.26),
+	  ppl_interface_generator_common_dat.m4 (1.55),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.8),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.4),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.4),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.3), Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.61),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.70): Now allow the list of procedure names for generation to
+	  have an optional "\" before a group name "g" which is meant to be
+	  used only in conjunction with the powerset domain, and to mean
+	  -don't generate code if the powerset's disjunct is in "g"-.  This
+	  is needed to avoid generating linear_partition code when the
+	  disjunct is Grid and similarly approximate_partition code when
+	  the disjunct is C_ or NNC_Polyhedron.
+
+	  The Powerset of Grids in all the interfaces now compiles and the
+	  compiled code passes all the tests in Java and Prolog interfaces.
+
+	  Added to the todo lists in the procedure_generator m4 files for
+	  C, Java and Ocaml, the approximate_partition procedure for
+	  powersets of grids.
+
+2008-01-31 Thursday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.54),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.7), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.28),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.18),
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (1.3),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.44),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.38),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.27), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (1.26), interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (1.21),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.15),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.60),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.69), src/Partially_Reduced_Product.defs.hh (1.21),
+	  src/Partially_Reduced_Product.inlines.hh (1.20),
+	  src/Pointset_Powerset.inlines.hh (1.13): Added hash_code() to the
+	  pointset_powerset and partially_reduced_product domains.  Enable
+	  this in the Java interface for all the domains.  Also enable in
+	  the Java interface the string() method for all the domains, so as
+	  to include the product domains.
+
+	  Added methods for external/total_memory_in_bytes for all the
+	  domains and to all the interfaces.  Existing tests for size() for
+	  prolog and java now use the MEMBYTES pattern instead so as to
+	  test all the replacements for MEMBYTES.
+
+	  These with the size() method (for the pointset_powerset domains)
+	  are all generated from a single "pattern" "MEMBYTES", defined in
+	  interfaces/ppl_interface_generator_common_dat.m4.
+
+	  Added methods for external/total_memory_in_bytes for all the
+	  domains and to all the interfaces.
+
+	  Existing tests for size() for prolog and java now use the
+	  MEMBYTES pattern instead so as to test all its replacements.
+
+	  These with the size() method (for the pointset_powerset domains)
+	  are all generated from a single "pattern" "MEMBYTES", defined in
+	  interfaces/ppl_interface_generator_common_dat.m4.
+
+2008-01-30 Wednesday 18:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.226),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.6), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.27),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.17),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.43),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.37),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.26), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (1.25), interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (1.20),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.14),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.59),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.68), src/Partially_Reduced_Product.inlines.hh (1.19):
+	  Corrected a missing "+" in
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  which caused some interface predicates not to be generated.
+
+	  Added add_constraint_and_minimize() and
+	  add_constraint_and_minimize() to the Partially_Reduced_Product
+	  domain.
+
+	  In the interfaces, the interface procedures for
+	  ppl_Grid_generalized_image_lhs_rhs/5 and
+	  ppl_Grid_generalized_preimage_lhs_rhs/5
+	  ppl_Grid_generalized_image/6 and
+	  ppl_Grid_generalized_preimage/6    have been renamed as
+	  ppl_Grid_generalized_image_lhs_rhs_with_congruence/5
+	  ppl_Grid_generalized_preimage_lhs_rhs_with_congruence/5
+	  ppl_Grid_generalized_image_with_congruence/6
+	  ppl_Grid_generalized_preimage_with_congruence/6    so as to allow
+	  for /4 and /5, resp., versions
+
+	  (This change also reported in "News").
+
+	  Tidied and commented the procedure list in
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  so that where not "+all" domains are implemented in the
+	  interfaces, comments explain further.
+
+	  A few remaining procedures that can be enabled for products
+	  and/or powersets in the interfaces have been enabled.
+
+	  Added two "todo" procedures to the OCaml list of procedure
+	  generators.
+
+2008-01-30 Wednesday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.5), src/Pointset_Powerset.defs.hh (1.30),
+	  src/Pointset_Powerset.inlines.hh (1.12),
+	  src/Pointset_Powerset.templates.hh (1.26),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.2): Added methods for
+	  expand_space_dimension() and fold_space_dimensions() and
+	  constructor from a box, for the pointset_powerset domain.
+
+	  Added tests for add and remove (higher) space dimensions for the
+	  powerset domain as well as tests for the new methods.
+
+	  Enabled the corresponding procedures in all the interfaces.
+
+2008-01-30 Wednesday 09:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.53),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.4), src/Partially_Reduced_Product.defs.hh (1.20),
+	  src/Partially_Reduced_Product.inlines.hh (1.18),
+	  tests/Grid/directproduct3.cc (1.17): Enabled a few more
+	  procedures in the interfaces for the product domain.
+
+	  Added to all the interfaces (including C++) the
+	  intersection_assign_and_minimize() procedure for the
+	  partially_reduced_product domains for uniformity with the other
+	  domains.
+
+2008-01-30 Wednesday 08:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.67): Bug in generated test file for the product domain fixed.
+
+2008-01-29 Tuesday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.25),
+	  ppl_interface_generator_common_dat.m4 (1.52),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.3),
+	  C/ppl_interface_generator_c_cc.m4 (1.14),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.66): Improved the definitions of the product domains so that
+	  the list of different product domains occurs just once in the m4
+	  code.
+
+	  Almost all the methods/procedures appropriate for the product
+	  domains are now enabled in all the interfaces.
+
+	  Bug in the generated tests in ppl_predicate_check_test.pl for the
+	  product domain still to be checked and fixed.
+
+2008-01-29 Tuesday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.13),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.51),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.2), interfaces/C/ppl_interface_generator_c_cc.m4 (1.13),
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (1.2): Enabled the product domains; building from space
+	  dimensions, other products, constraints and congruences.  Enable
+	  the OK check and the free() method for Java.
+
+	  Allow the configuration to include instantiations for the
+	  Direct_Product, Smash_Product and Constraints_Product domains
+	  with simple arguments.
+
+	  Every interface tested for just the instantiation
+	  Direct_Product<C_Polyhedron,Grid>
+
+2008-01-29 Tuesday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.76): Previous change unintended -
+	  revert to previous version.
+
+2008-01-28 Monday 15:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.26),
+	  ppl_interface_generator_c_h_code.m4 (1.16),
+	  ppl_interface_generator_c_procedure_generators.m4 (1.3): In the C
+	  interface, added (m4) implementation code for add_disjunct.
+	  Remove done items from "todo" list.
+
+2008-01-28 Monday 14:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.25),
+	  ppl_interface_generator_c_h_code.m4 (1.15),
+	  ppl_interface_generator_c_procedure_generators.m4 (1.2): Added to
+	  the C interface the m4 code for drop_disjuncts.
+
+2008-01-28 Monday 14:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.24),
+	  ppl_interface_generator_c_h_code.m4 (1.14): Added to the C
+	  interface procedures for Pointset_Powerset (const) iterators:
+	  increment, decrement, equals, begin and end.
+
+2008-01-28 Monday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.23),
+	  ppl_interface_generator_c_h_code.m4 (1.13): Added to the C
+	  interface the ppl_ at CLASS@_size method.
+
+2008-01-28 Monday 12:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Makefile.am (1.30),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.1),
+	  ppl_interface_generator_common_procedure_list.m4 (1.5),
+	  C/Makefile.am (1.39), C/ppl_c.h.in (1.75),
+	  C/ppl_interface_generator_c_all_dat.m4 (1.2),
+	  C/ppl_interface_generator_c_cc.m4 (1.12),
+	  C/ppl_interface_generator_c_h.m4 (1.15),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.1),
+	  Java/Makefile.am (1.16),
+	  Java/ppl_interface_generator_java_all_dat.m4 (1.3),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.1),
+	  Java/jni/Makefile.am (1.17),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.12), Java/ppl_java/Makefile.am (1.37),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.20), Java/tests/Makefile.am (1.19),
+	  Java/tests/ppl_interface_generator_java_test_java.m4 (1.15),
+	  OCaml/Makefile.am (1.37),
+	  OCaml/ppl_interface_generator_ocaml_all_dat.m4 (1.2),
+	  OCaml/ppl_interface_generator_ocaml_cc.m4 (1.8),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.13),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.11),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.1), Prolog/Makefile.am (1.47),
+	  Prolog/ppl_interface_generator_prolog_all_dat.m4 (1.2),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.14),
+	  Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.1), Prolog/ppl_interface_generator_prolog_systems.m4 (1.13),
+	  Prolog/Ciao/Makefile.am (1.71), Prolog/GNU/Makefile.am (1.69),
+	  Prolog/SICStus/Makefile.am (1.85), Prolog/SWI/Makefile.am (1.81),
+	  Prolog/XSB/Makefile.am (1.61), Prolog/YAP/Makefile.am (1.58),
+	  Prolog/tests/Makefile.am (1.20),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.34): Renamed the files containing the schematic lists of
+	  procedures so that the common tail is "procedure_generators.m4".
+
+2008-01-28 Monday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_procedure_list.m4
+	  (1.4), Java/ppl_interface_generator_java_dat.m4 (1.15),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.42), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.24),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.19),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.13): Fixed
+	  bugs wrt the pointset powerset caused by the previous commit
+	  domain in the OCaml and Java interfaces.
+
+2008-01-27 Sunday 21:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.50),
+	  ppl_interface_generator_common_procedure_list.m4 (1.3),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.41),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.36), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.23),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.18),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.12),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.58),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.65): By defining a new pattern "incdec" and its replacement,
+	  made the increment and decrement iterator methods use common
+	  code.  Similarly the begin_iterator and end_iterator now use
+	  common code.
+
+2008-01-26 Saturday 10:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.84): Use AM_CPPFLAGS for
+	  `splfr' and `spld', not CPPFLAGS.
+
+2008-01-25 Friday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.83): Support
+	  installation of SICStus in non-standard places.
+
+2008-01-25 Friday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.302): Version number bumped.
+
+2008-01-25 Friday 12:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.49),
+	  ppl_interface_generator_common_procedure_list.m4 (1.2),
+	  C/Makefile.am (1.38), C/ppl_interface_generator_c_all_dat.m4
+	  (1.1), C/ppl_interface_generator_c_cc.m4 (1.11),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.22),
+	  C/ppl_interface_generator_c_dat.m4 (1.15),
+	  C/ppl_interface_generator_c_h.m4 (1.14),
+	  C/ppl_interface_generator_c_h_code.m4 (1.12): Synchronizing the C
+	  interface with the other interfaces.	Several missing methods for
+	  the C interface are listed in a comment at the end of
+	  ppl_interface_generator_c_all_dat.m4
+
+2008-01-25 Friday 08:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/Makefile.am (1.36): Fixed a bug. The interface
+	  no longer uses ppl_interface_generator_prolog_dat.m4
+
+2008-01-24 Thursday 22:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.14), OCaml/Makefile.am (1.35),
+	  OCaml/ppl_interface_generator_ocaml_all_dat.m4 (1.1),
+	  OCaml/ppl_interface_generator_ocaml_cc.m4 (1.7),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.22),
+	  OCaml/ppl_interface_generator_ocaml_dat.m4 (1.9),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.12),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.17),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.10),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.11): OCaml
+	  interface now synchronized with the Java and Prolog interfaces.
+	  A few missing methods listed as a comment at the end of
+	  OCaml/ppl_interface_generator_ocaml_all_dat.m4
+
+	  Trivial layout improvement to
+	  Java/tests/ppl_interface_generator_java_test_java.m4
+
+2008-01-24 Thursday 16:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_interface_generator_java_all_dat.m4 (1.2):
+	  Comment corrected.
+
+2008-01-24 Thursday 16:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.48),
+	  Java/Makefile.am (1.15),
+	  Java/ppl_interface_generator_java_all_dat.m4 (1.1),
+	  Java/jni/Makefile.am (1.16),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.11),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.40), Java/ppl_java/Makefile.am (1.36),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.19),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.35), Java/tests/Makefile.am (1.18),
+	  Java/tests/ppl_interface_generator_java_test_java.m4 (1.13):
+	  Synchronizing the Java interface with the Prolog interface.  A
+	  few methods not yet implemented are listed as a comment in the
+	  added file Java/ppl_interface_generator_java_all_dat.m4 which
+	  also contains a few methods special to the Java interface.
+
+2008-01-24 Thursday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.47),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.39),
+	  Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.34), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.21),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.16),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.10),
+	  Prolog/Makefile.am (1.46),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.45),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.57),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.12),
+	  Prolog/Ciao/Makefile.am (1.70), Prolog/GNU/Makefile.am (1.68),
+	  Prolog/SWI/Makefile.am (1.80), Prolog/XSB/Makefile.am (1.60),
+	  Prolog/YAP/Makefile.am (1.57),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.64),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.33): For the pointset_powerset domain, the way the disjunct
+	  classes are handled changed so that the topology is replaced
+	  separately.
+
+	  Completed, for the Prolog interface, the separation between the
+	  system procedure list and the list of the procedures to be
+	  generated.
+
+2008-01-24 Thursday 09:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Makefile.am (1.29), Prolog/Makefile.am (1.45),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.13): Fixed a bug
+	  in the makefile dependencies for Prolog due to the new dependent
+	  common file ppl_interface_generator_common_procedure_list.m4
+
+2008-01-23 Wednesday 19:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.46): Change
+	  needed for the pointset_powerset domains and their C++ friend
+	  names.
+
+2008-01-23 Wednesday 18:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.24),
+	  ppl_interface_generator_common_procedure_list.m4 (1.1),
+	  Prolog/Makefile.am (1.44),
+	  Prolog/ppl_interface_generator_prolog_all_dat.m4 (1.1),
+	  Prolog/SICStus/Makefile.am (1.82), Prolog/tests/Makefile.am
+	  (1.19): A start on merging the procedure lists for the different
+	  interfaces to ensure the interface systems are fully
+	  synchronized.  Currently the new lists only used and tested in
+	  SICStus Prolog.
+
+2008-01-23 Wednesday 18:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.23),
+	  ppl_interface_generator_common_dat.m4 (1.45),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.21),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.38), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.20),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.56): Fixed a
+	  bug introduced in teh previous commit due to the overloading of
+	  the prefix "cpp_" in the patterns.  New prefix temporarily
+	  changed to "cppx_".  Further work on simplifying this code may
+	  allow the merge of the different uses of the "cpp_"/"cppx_"
+	  prefix into 1.
+
+2008-01-23 Wednesday 17:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.22),
+	  ppl_interface_generator_common_dat.m4 (1.44),
+	  C/ppl_interface_generator_c_cc.m4 (1.10),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.20),
+	  C/ppl_interface_generator_c_dat.m4 (1.14),
+	  C/ppl_interface_generator_c_h_code.m4 (1.11),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.37), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.19),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.55): Allow
+	  the C interface to build from a "friend" as we can already do in
+	  the other interfaces.
+
+	  Revised the "friend" pattern replacements.  To generate the new
+	  code for the C interface, an extra option has been added that
+	  allows for replacing friend classes C_Polyhedron and
+	  NNC_Polyhedron without their topology.
+
+	  cpp_friend now gives the C++ name while alt_friend has been
+	  changed to give the interface name without the topology (ie only
+	  in the case that the friend is a polyhedron).
+
+	  As we already used the alt_friend for the C++ version of the
+	  friend class name (now called cpp_friend), this change affected
+	  several files.
+
+2008-01-23 Wednesday 11:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/pointsetpowerset4.cc (1.6): Tests 5, 6 and 9
+	  fail for check-int8.
+
+2008-01-23 Wednesday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset4.cc (simplex.1): file
+	  pointsetpowerset4.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-01-23 Wednesday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.59): Fixed two bugs
+	  introduced in previous changes here.
+
+2008-01-22 Tuesday 21:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.14),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.36),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.33), tests/ppl_interface_generator_java_test_java.m4 (1.12),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.25): Just
+	  as is already the case for the Prolog interfaces, Java can build
+	  a class from a "friend" of that class.  E.g., a C_Polyhedron can
+	  be built from an NNC_Polyhedron, a Grid, a BD_Shape etc, provided
+	  the "friend" exists as one of the instantiations in the
+	  configuration.
+
+2008-01-22 Tuesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.10), config.guess (1.40), config.sub (1.38), depcomp
+	  (1.13), install-sh (1.19), Watchdog/INSTALL (1.7),
+	  Watchdog/config.guess (1.24), Watchdog/config.sub (1.23),
+	  Watchdog/depcomp (1.10), Watchdog/install-sh (1.15): Updated from
+	  Automake 1.10.1.
+
+2008-01-21 Monday 22:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.21),
+	  ppl_interface_generator_common_dat.m4 (1.43),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.44),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.63),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.32): A start on cleaning/tidying some of the m4 code -
+	  avoiding generating unwanted whitespace.
+
+2008-01-21 Monday 22:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.20),
+	  Prolog/Ciao/Makefile.am (1.69),
+	  Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.8), Prolog/SICStus/Makefile.am (1.81),
+	  Prolog/SICStus/sp_predicate_check.pl (1.7),
+	  Prolog/SWI/Makefile.am (1.79), Prolog/SWI/swi_predicate_check.pl
+	  (1.6), Prolog/XSB/Makefile.am (1.58),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.9), Prolog/tests/Makefile.am (1.18),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.62),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.31), Prolog/tests/ppl_predicate_check_common.pl (1.9): The
+	  tests for all the interfaces predicates that are generated and
+	  were placed in ppl_predicate_check.pl are now generated and split
+	  into a number of files; the top-level one is
+	  ppl_predicate_test_main.pl and the rest have a name of the form
+
+	  ppl_predicate_test_CLASS.pl
+
+	   where CLASS is the name of an interface class (there is just one
+	  file
+	  "ppl_predicate_test_Polyhedron.pl" for both the C_Polyhedron and
+	  NNC_Polyhedron domains.
+
+	  This resolves a problem when checking the interface predicates
+	  for XSB with more than 3 classes where the large generated file
+	  caused an error to be thrown.
+
+	  This change has been tested on SWI Prolog, SICStus, XSB and Ciao
+	  Prolog with up to 4 (5 if we count C_Polyhedron and
+	  NNC_Polyhedron separately) different interface classes.
+
+2008-01-21 Monday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/: cm_cleaner.sh (1.5), cm_splitter.sh (1.5): Use `IFS= read
+	  -r' instead of a simple `read'.  This means that leading blanks
+	  and backslashes will no longer be eaten.
+
+2008-01-21 Monday 16:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.18): Avoid having whitespace before the file cutting mark.
+
+2008-01-21 Monday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc.m4 (1.6),
+	  ppl_interface_generator_ocaml_ml.m4 (1.11),
+	  ppl_interface_generator_ocaml_mli.m4 (1.9): Revised the
+	  generation of these files so that all type and other class
+	  methods are added before the main part of the code so that one
+	  class can refer to elements of another class.
+
+2008-01-21 Monday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.3): Added some notes on the
+	  configuration of MLGMP, since the information contained in the
+	  package itself is rather terse.
+
+2008-01-21 Monday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.2): Explained the requirements
+	  for the OCaml interface.  Note that the Caml Hump page for MLGMP
+	  is out of date (bug already reported): while they fix it, MLGMP
+	  can be found at
+	  http://www-verimag.imag.fr/~monniaux/programmes.html.fr.
+
+2008-01-21 Monday 12:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.18), ppl_interface_generator_ocaml_dat.m4 (1.8),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.15),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.9): Removed the
+	  pattern "@INTOPOLOGY@" which preceded "@FRIEND@" since the
+	  topology is now part of the replacement for "@FRIEND@".
+
+2008-01-19 Saturday 18:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.42): Fixed a
+	  bug which showed in the Java generated code for the relation_with
+	  methods.
+
+2008-01-19 Saturday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (1.9): At the end of the C++ PPL header file,
+	  #undef PPL_NO_AUTOMATIC_INITIALIZATION if it is defined.
+
+2008-01-18 Friday 20:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/Makefile.am (1.3): Distribute also ppl.hh, ppl_c.h, and
+	  pwl.hh.
+
+2008-01-18 Friday 20:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.301): Version number bumped.
+
+2008-01-18 Friday 15:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.25), interfaces/README.interfaces (1.1):
+	  Brief notes on how to generate and use code for a choice of
+	  domains in the (mainly Prolog) interfaces.
+
+2008-01-18 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/README.interfaces (simplex.1): file README.interfaces
+	  was added on branch simplex on 2008-06-06 14:21:57 +0000
+
+2008-01-18 Friday 13:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.61): Fixed some bugs in the test file that caused some warning
+	  messages when testing the code in the Ciao interface.
+
+2008-01-18 Friday 12:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.60): A bug fixed.
+
+2008-01-18 Friday 12:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.68),
+	  SICStus/sp_predicate_check.pl (1.6), SWI/swi_predicate_check.pl
+	  (1.5), XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.8), tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.30): Enable make predicate_check_test for Ciao.  To do this,
+	  the ":- include ppl_predicate_check_common." directive has to be
+	  in the generated file ppl_predicate_check.pl
+
+	  For this reason, the corresponding directives in
+	  swi_predicate_check.pl and SICStus/sp_predicate_check.pl have
+	  been removed.
+
+	  For XSB, the include directive is not supported as is and instead
+	  a "#include" must be used. Changes made for XSB to handle this.
+
+	  Warning messages given by the Ciao system when compiling the
+	  generated file ppl_predicate_check.pl need further investigation
+	  but the test in Ciao succeeds.
+
+2008-01-18 Friday 11:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.12): The instantiation options "C_Polyhedron" and
+	  "NNC_Polyhedron" made invalid.
+
+2008-01-18 Friday 10:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: SICStus/Makefile.am (1.80),
+	  SICStus/sp_predicate_check.pl (1.5), SWI/Makefile.am (1.78),
+	  XSB/Makefile.am (1.57),
+	  XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.7): The
+	  Prolog systems SWI, SICStus and XSB all allow for the toplevel
+	  command "make predicate_check_test" to check the generated
+	  ppl_prolog.icc code for the chosen set of instantiations.
+
+	  Note that XSB cannot manage more than three instantiations (eg
+	  "Polyhedron at Grid@Pointset_Powerset<C_Polyhedron>") at any one
+	  time.
+
+2008-01-18 Friday 10:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.11),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.41): The
+	  instantiations for the powerset domains when the disjunct is a
+	  polyhedron is changed and now the topology must be explicit.
+	  Ie., the configuration instantiations option
+	  Pointset_Powerset<Polyhedron> is disabled but instead
+	  Pointset_Powerset<C_Polyhedron> and
+	  Pointset_Powerset<NNC_Polyhedron> are both enabled.
+
+2008-01-17 Thursday 16:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.40),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.43),
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl (1.8),
+	  src/Pointset_Powerset.defs.hh (1.29),
+	  src/Pointset_Powerset.templates.hh (1.25),
+	  tests/Polyhedron/Makefile.am (1.119),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.1): For the powerset
+	  domains, added methods for relation_with() for constraint,
+	  congruence and generator to all the interfaces.
+
+	  In the interfaces, also enable the grids to have relation_with()
+	  for a generator.
+
+2008-01-17 Thursday 13:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.39),
+	  src/Pointset_Powerset.defs.hh (1.28),
+	  src/Pointset_Powerset.templates.hh (1.24),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.5): For the powerset
+	  domain, the method topological_closure_assign() added to all the
+	  interfaces.
+
+2008-01-17 Thursday 12:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.38),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.42),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.59): Now allow for several more predicates for the powerset
+	  domain.  In particular all the recent additions in the main C++
+	  interface are now included in the Prolog interface.
+
+2008-01-17 Thursday 11:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.27),
+	  src/Pointset_Powerset.inlines.hh (1.11),
+	  src/Pointset_Powerset.templates.hh (1.23),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.4): For the powerset
+	  domain, added methods intersection_assign_and_minimize(),
+	  contains() and strictly_contains() with appropriate tests.
+
+2008-01-17 Thursday 09:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.26),
+	  src/Pointset_Powerset.templates.hh (1.22),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.3): For the powerset
+	  domain, added methods add_congruence(),
+	  add_congruence_and_minimize(), add_congruences() and
+	  add_congruences_and_minimize() with tests.
+
+2008-01-17 Thursday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.templates.hh (1.21),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.2): Fixed some bugs in
+	  code for maximize() and minimize() for the powerset domains and
+	  improved the tests.
+
+2008-01-16 Wednesday 21:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.41),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.58): Now
+	  allow for
+	  ppl_Pointset_Powerset_..._equals_ppl_Pointset_Powerset_..._ in
+	  the Prolog interface.
+
+2008-01-16 Wednesday 21:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.40):
+	  Now the interfaces can support bounds_from_above/below() and
+	  maximize/minimize for the powerset domain.  Also added support
+	  for bounds_from_above/below() for bd shapes and octagonal shapes
+	  in Prolog.
+
+2008-01-16 Wednesday 17:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.25),
+	  src/Pointset_Powerset.templates.hh (1.20),
+	  tests/Polyhedron/Makefile.am (1.118),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.1): For the powerset
+	  domains, added methods: bounds_from_above(), bounds_from_below(),
+	  maximize() and minimize() - both with and without returning the
+	  point.  Tests added to check these.
+
+2008-01-16 Wednesday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset3.cc (simplex.1): file
+	  pointsetpowerset3.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-01-16 Wednesday 09:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.24),
+	  src/Pointset_Powerset.templates.hh (1.19),
+	  tests/Polyhedron/pointsetpowerset3.cc (1.2): Added to the
+	  powerset domain methods is_discrete() and is_disjoint_from().
+
+2008-01-15 Tuesday 17:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.37),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.39): Added the
+	  is_empty(), is_universe(), is_topologically_closed() and
+	  is_bounded() for powersets to the Prolog interfaces.
+
+2008-01-15 Tuesday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.23),
+	  src/Pointset_Powerset.templates.hh (1.18),
+	  tests/Polyhedron/Makefile.am (1.117),
+	  tests/Polyhedron/pointsetpowerset3.cc (1.1): Added to the
+	  pointset powerset domain tests is_empty() is_universe()
+	  is_topologically_closed() and is_bounded().  Tests for these also
+	  added.
+
+	  Note: in the code for is_universe() there are the 2 FIXME
+	  comments:	// FIXME: this is not the most efficient
+	  implementation.      // FIXME: this is buggy when PS is not an
+	  abstraction of NNC_Polyhedron.
+
+2008-01-15 Tuesday 13:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.64), Grid_chdims.cc (1.22),
+	  Grid_nonpublic.cc (1.33), Grid_public.cc (1.65): Replaced bad
+	  coding style in Boolean expressions by a more readable style.
+	  Also update_congruences() now returns void and not bool.
+
+2008-01-15 Tuesday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.36),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.57): Support for minimized representations added.
+
+2008-01-15 Tuesday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.64): Change to correct the bug in
+	  minimized_congruences().
+
+2008-01-15 Tuesday 09:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/mincongruences1.cc (1.12): Changed test04 to show a
+	  bug: an extra OK() test shows that after minimized_congruences(),
+	  the grid is not ok.
+
+2008-01-15 Tuesday 08:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.38):
+	  Undone a change yesterday, that affected the compilation of
+	  SICStus and Ciao, for the generalized image for grids which needs
+	  a different arity to that for the other domains.
+
+2008-01-14 Monday 18:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.110), src/BD_Shape.inlines.hh (1.156),
+	  src/Octagonal_Shape.defs.hh (1.38),
+	  src/Octagonal_Shape.inlines.hh (1.27), src/Polyhedron.defs.hh
+	  (1.330), src/Polyhedron.inlines.hh (1.146),
+	  tests/BD_Shape/Makefile.am (1.71), tests/BD_Shape/congruences1.cc
+	  (1.1), tests/Octagonal_Shape/Makefile.am (1.24),
+	  tests/Octagonal_Shape/congruences1.cc (1.1),
+	  tests/Polyhedron/addcongruence1.cc (1.10): Added methods for
+	  add_congruence_and_minimize in order that we have a uniform set
+	  of methods across all simple classes.
+
+	  Also corrected congruences() and minimized_congruences() in the
+	  BD_Shape and Octagonal_Shape domains which were wrong for empty
+	  elements.
+
+	  Added tests for all these methods which were untested.
+
+2008-01-14 Monday 16:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.7): Wrong file name corrected.
+
+2008-01-14 Monday 16:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.56),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.29),
+	  ppl_predicate_check_common.pl (1.7): Some of the changes needed
+	  to get the interfaces working in Ciao Prolog.  For instance /= is
+	  changed to /==.  Also all the generated test predicates are
+	  declared as dynamic as some are never defined in the test code.
+
+2008-01-14 Monday 11:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.35):
+	  Improvements to layout and similar to the m4 code.
+
+2008-01-14 Monday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.34): Added
+	  support for building from congruences for all the domains.  Added
+	  support for contains_integer_point for the powerset domain.
+
+2008-01-13 Sunday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.37),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.54),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.55):
+	  Expanded the number of predicates generated for classes such as
+	  Octagonal_Shape<...> and Pointset_Powerset<...>.
+
+	  Fixed a bug in the m4 code for generating ppl_prolog.icc when
+	  building a class from a box.	Note that the bug only was apparent
+	  for classes with a templatic argument such as
+	  Octagonal_Shape<...>.
+
+	  In the m4 code for generating ppl_predicate_check.pl tests
+	  modified to allow for the larger set of classes.
+
+2008-01-13 Sunday 17:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.33),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.36),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.53):
+	  Upgraded the friend replacement code to allow for the simple
+	  classes (eg polyhedra, bd shapes, grids) to build from other
+	  simple classes that are in the list of instantiations.
+
+2008-01-13 Sunday 13:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.52), tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.54): Corrected bug in m4 generating code for ppl_prolog.icc
+	  for the powersets linear_partition predicate.
+
+	  Also corrected test for linear_partition in m4 generating code
+	  for ppl_predicate_check.pl
+
+2008-01-13 Sunday 11:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.13),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.35),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.32): The string "@FRINED@" was wrongly used.  As the
+	  definition of FRIEND in m4 is being revised to allow more classes
+	  to be built from other classes, this wrong use will become a bug
+	  if it is not corrected.
+
+2008-01-12 Saturday 23:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.53),
+	  ppl_predicate_check_common.pl (1.6): In
+	  ppl_interface_generator_predicate_check_code.m4 corrected syntax
+	  error.
+
+	  In ppl_predicate_check_common.pl revised expected relations for
+	  grids to match changes in src code.
+
+2008-01-09 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Java/jni/.cvsignore (1.4), Java/ppl_java/.cvsignore
+	  (1.3), Prolog/Ciao/.cvsignore (1.7), Prolog/GNU/.cvsignore (1.7),
+	  Prolog/SICStus/.cvsignore (1.8), Prolog/SWI/.cvsignore (1.8),
+	  Prolog/XSB/.cvsignore (1.6), Prolog/YAP/.cvsignore (1.7):
+	  Updated.
+
+2008-01-09 Wednesday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Java/.cvsignore (1.2), Java/jni/.cvsignore (1.3),
+	  Java/ppl_java/.cvsignore (1.2), Java/tests/.cvsignore (1.2),
+	  Prolog/.cvsignore (1.2), Prolog/tests/.cvsignore (1.2): Updated.
+
+2008-01-09 Wednesday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/.cvsignore (1.7), Watchdog/src/.cvsignore (1.3),
+	  interfaces/OCaml/.cvsignore (1.4),
+	  interfaces/Prolog/Ciao/.cvsignore (1.6),
+	  interfaces/Prolog/GNU/.cvsignore (1.6),
+	  interfaces/Prolog/SICStus/.cvsignore (1.7),
+	  interfaces/Prolog/SWI/.cvsignore (1.7),
+	  interfaces/Prolog/XSB/.cvsignore (1.5),
+	  interfaces/Prolog/YAP/.cvsignore (1.6), src/.cvsignore (1.12):
+	  Ignore *.loT files.
+
+2008-01-09 Wednesday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.8), Watchdog/.cvsignore (1.6),
+	  interfaces/.cvsignore (1.2), interfaces/C/.cvsignore (1.4),
+	  interfaces/Java/jni/.cvsignore (1.2), src/.cvsignore (1.11):
+	  Updated.
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.4): Avoid multiarch conflicts when installed
+	  for multiple architectures.
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/: ppl.hh (1.1), ppl_c.h (1.1), pwl.hh (1.1): Header file
+	  switchers to avoid multiarch conflicts when the PPL and PWL are
+	  installed for multiple architectures (e.g., i386 and x86_64).
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.hh (simplex.1): file ppl.hh was added on branch
+	  simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl_c.h (simplex.1): file ppl_c.h was added on branch
+	  simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/pwl.hh (simplex.1): file pwl.hh was added on branch
+	  simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-07 Monday 12:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING, CREDITS, ChangeLog, INSTALL, Makefile.am, NEWS, README,
+	  README.configure, STANDARDS, TODO, compile, config.guess,
+	  config.sub, configure.ac, depcomp, install-sh, instchk.hh,
+	  ltmain.sh, ppl.spec.in, Watchdog/COPYING, Watchdog/ChangeLog,
+	  Watchdog/INSTALL, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/README, Watchdog/compile, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/configure.ac, Watchdog/ltmain.sh,
+	  Watchdog/doc/.cvsignore, Watchdog/doc/Makefile.am,
+	  Watchdog/doc/README.doc, Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	  Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+	  Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+	  Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	  Watchdog/m4/.cvsignore, Watchdog/m4/Makefile.am,
+	  Watchdog/m4/ax_prefix_config_h.m4,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  debian/Makefile.am, debian/libppl-pwl.copyright.in,
+	  debian/libppl.copyright.in, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/README,
+	  demos/ppl_lpsol/examples/egout.mps,
+	  demos/ppl_lpsol/examples/ex12.mps,
+	  demos/ppl_lpsol/examples/lseu.mps,
+	  demos/ppl_lpsol/examples/markshare1.mps,
+	  demos/ppl_lpsol/examples/markshare2.mps,
+	  demos/ppl_lpsol/examples/mas74.mps,
+	  demos/ppl_lpsol/examples/mas76.mps,
+	  demos/ppl_lpsol/examples/modglob.mps,
+	  demos/ppl_lpsol/examples/noswot.mps,
+	  demos/ppl_lpsol/examples/opt1217.mps,
+	  demos/ppl_lpsol/examples/p0033.mps,
+	  demos/ppl_lpsol/examples/pk1.mps,
+	  demos/ppl_lpsol/examples/rout.mps, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox,
+	  doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-c-interface.tex,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/gpl.dox, doc/gpl.tex, doc/gpl.txt,
+	  doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl.sty,
+	  doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, fedora/.cvsignore,
+	  fedora/Makefile.am, fedora/ppl.spec, interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/ppl_java/.cvsignore,
+	  interfaces/Java/ppl_java/By_Reference.java,
+	  interfaces/Java/ppl_java/Coefficient.java,
+	  interfaces/Java/ppl_java/Congruence.java,
+	  interfaces/Java/ppl_java/Congruence_System.java,
+	  interfaces/Java/ppl_java/Constraint.java,
+	  interfaces/Java/ppl_java/Constraint_System.java,
+	  interfaces/Java/ppl_java/Degenerate_Element.java,
+	  interfaces/Java/ppl_java/Domain_Error_Exception.java,
+	  interfaces/Java/ppl_java/Generator.java,
+	  interfaces/Java/ppl_java/Generator_System.java,
+	  interfaces/Java/ppl_java/Generator_Type.java,
+	  interfaces/Java/ppl_java/Grid_Generator.java,
+	  interfaces/Java/ppl_java/Grid_Generator_System.java,
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java,
+	  interfaces/Java/ppl_java/Invalid_Argument_Exception.java,
+	  interfaces/Java/ppl_java/Length_Error_Exception.java,
+	  interfaces/Java/ppl_java/Linear_Expression.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Difference.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Sum.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Variable.java,
+	  interfaces/Java/ppl_java/Logic_Error_Exception.java,
+	  interfaces/Java/ppl_java/MIP_Problem.java,
+	  interfaces/Java/ppl_java/MIP_Problem_Status.java,
+	  interfaces/Java/ppl_java/Makefile.am,
+	  interfaces/Java/ppl_java/Optimization_Mode.java,
+	  interfaces/Java/ppl_java/Overflow_Error_Exception.java,
+	  interfaces/Java/ppl_java/PPL_Object.java,
+	  interfaces/Java/ppl_java/Parma_Polyhedra_Library.java,
+	  interfaces/Java/ppl_java/Partial_Function.java,
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java,
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java,
+	  interfaces/Java/ppl_java/Relation_Symbol.java,
+	  interfaces/Java/ppl_java/Variable.java,
+	  interfaces/Java/ppl_java/Variables_Set.java,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/Makefile.am, interfaces/OCaml/README.ocaml,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/OCaml/ppl_ocaml_globals.ml,
+	  interfaces/OCaml/ppl_ocaml_types.ml, interfaces/OCaml/test1.ml,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/README.gprolog,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/README.swiprolog,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/expected_pchk_mpz,
+	  interfaces/Prolog/XSB/expected_pchk_mpz_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/README.yap,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/Makefile.am, m4/ac_check_classpath.m4,
+	  m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+	  m4/ac_cxx_double_binary_format.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+	  m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+	  m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4,
+	  m4/ax_prefix_config_h.m4, m4/ppl.m4, m4/ppl_c.m4,
+	  src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	  src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	  src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	  src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	  src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	  src/Bit_Row.inlines.hh, src/Bit_Row.types.hh,
+	  src/Boundary.defs.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/Box.cc, src/Box.defs.hh,
+	  src/Box.inlines.hh, src/Box.templates.hh, src/Box.types.hh,
+	  src/C_Integer.hh, src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/C_Polyhedron.types.hh,
+	  src/Checked_Number.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence.types.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	  src/Congruence_System.types.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	  src/DB_Row.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Determinate.types.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/Float.cc, src/Float.defs.hh, src/Float.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/GMP_Integer.types.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator.inlines.hh,
+	  src/Generator.types.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Generator_System.types.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	  src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	  src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Has_Assign_Or_Swap.hh,
+	  src/Init.cc, src/Init.defs.hh, src/Init.types.hh,
+	  src/Interval.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.templates.hh, src/Interval.types.hh,
+	  src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+	  src/Interval_Info.types.hh, src/Interval_Restriction.defs.hh,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	  src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  src/Partially_Reduced_Product.defs.hh,
+	  src/Partially_Reduced_Product.inlines.hh,
+	  src/Partially_Reduced_Product.templates.hh,
+	  src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	  src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Rational_Box.hh, src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Slow_Copy.hh, src/Temp.defs.hh,
+	  src/Temp.inlines.hh, src/Temp.templates.hh, src/Topology.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/assign_or_swap.hh, src/checked.cc,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, src/compiler.hh,
+	  src/conversion.cc, src/distances.defs.hh,
+	  src/distances.inlines.hh, src/distances.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+	  src/fpu.defs.hh, src/fpu.types.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/meta_programming.hh, src/minimize.cc,
+	  src/mp_numeric_limits.hh, src/mp_std_bits.cc,
+	  src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+	  src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+	  tests/Makefile.am, tests/Partial_Function.cc,
+	  tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/files.cc,
+	  tests/files.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/valgrind_suppressions,
+	  tests/Ask_Tell/.cvsignore, tests/Ask_Tell/Makefile.am,
+	  tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/boundingbox1.cc, tests/BD_Shape/bounds1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/fromgrid1.cc,
+	  tests/BD_Shape/fromoctagonalshape1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/fromspacedim1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+	  tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/Box/.cvsignore,
+	  tests/Box/Makefile.am, tests/Box/addconstraints1.cc,
+	  tests/Box/addspacedims1.cc, tests/Box/affinedimension1.cc,
+	  tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+	  tests/Box/ascii_dump_load1.cc, tests/Box/bdsdifference1.cc,
+	  tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	  tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	  tests/Box/boxdifference1.cc, tests/Box/boxhull.cc,
+	  tests/Box/boxhull1.cc, tests/Box/cc76narrowing1.cc,
+	  tests/Box/cc76widening.cc, tests/Box/closure1.cc,
+	  tests/Box/concatenate1.cc, tests/Box/congruences1.cc,
+	  tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	  tests/Box/containsintegerpoint1.cc, tests/Box/discrete1.cc,
+	  tests/Box/disjoint1.cc, tests/Box/empty1.cc,
+	  tests/Box/equality1.cc, tests/Box/expandspacedim1.cc,
+	  tests/Box/foldspacedims1.cc, tests/Box/frombdshape1.cc,
+	  tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	  tests/Box/fromgrid1.cc,
+	  tests/Box/frompartiallyreducedproduct1.cc,
+	  tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	  tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffinepreimage1.cc,
+	  tests/Box/geomcovers1.cc, tests/Box/intersection1.cc,
+	  tests/Box/interval1.cc, tests/Box/interval2.cc,
+	  tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+	  tests/Box/maxspacedim1.cc, tests/Box/membytes1.cc,
+	  tests/Box/minconstraints1.cc, tests/Box/pointsetpowerset1.cc,
+	  tests/Box/refine1.cc, tests/Box/refine2.cc, tests/Box/refine3.cc,
+	  tests/Box/relations1.cc, tests/Box/relations2.cc,
+	  tests/Box/removespacedims1.cc, tests/Box/run_tests,
+	  tests/Box/timeelapse1.cc, tests/Box/universe1.cc,
+	  tests/Box/writebox1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/approximatepartition1.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	  tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/constraints1.cc,
+	  tests/Grid/contains1.cc, tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/directproduct3.cc,
+	  tests/Grid/directproduct4.cc, tests/Grid/directproduct5.cc,
+	  tests/Grid/directproduct6.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/frombdshape1.cc, tests/Grid/fromoctagonalshape1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	  tests/Grid/outputoperator3.cc,
+	  tests/Grid/partiallyreducedproduct1.cc,
+	  tests/Grid/partiallyreducedproduct2.cc,
+	  tests/Grid/partiallyreducedproduct3.cc, tests/Grid/partition1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/powersetgeometricallyequals1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/MIP_Problem/.cvsignore, tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/MIP_Problem/mipproblem2.cc,
+	  tests/MIP_Problem/mipproblem3.cc,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/frombdshape1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/fromgrid1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/fromspacedim1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/.cvsignore, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/README, tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constrains1.cc,
+	  tests/Polyhedron/constraints1.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	  tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	  tests/Polyhedron/fromoctagonalshape1.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc, tests/Polyhedron/hybrid.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/lpproblem3.cc,
+	  tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/pointsetpowerset2.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	  utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh
+	  (simplex.[1,1,3,2,3,3,3,3,3,6,1,4,4,3,1,3,3,2,2,1,3,2,3,2,3,1,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,3,2,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,15,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,4,3,3,1,1,1,3,2,3,3,2,3,2,2,2,2,2,2,2,2,3,3,3,2,2,2,3,2,2,2,2,3,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,5,3,2, [...]
+	  Fourth merge of the trunk to the `simplex' branch.  The `simplex'
+	  branch is open again.
+
+2008-01-02 Wednesday 18:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (1.9): Added comment in
+	  code for grid exceptions to explain change in previous commit:
+
+	      /* XSB does not throw catchable exceptions for integers out
+	  of range;
+		  so call to exception_sys_prolog is not made when testing
+	  XSB.
+		  The same exclusion for XSB and exception_sys_prolog/1
+	  test is also
+		  made in pl_check.pl (See log message 2007-09-19 10:29:08)
+	  */
+
+2008-01-02 Wednesday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (simplex.1): file
+	  pl_grid_check.pl was added on branch simplex on 2008-01-07
+	  11:15:31 +0000
+
+2008-01-02 Wednesday 13:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (1.8): Updated handling
+	  of exceptions so that the test file runs ok with XSB.
+
+2008-01-02 Wednesday 11:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.51): Corrected code for covering boxes (for Grids).
+
+2008-01-02 Wednesday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (simplex.1): file ppl_interface_generator_prolog_icc_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-02 Wednesday 11:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (1.7): Updated tests to
+	  match changes in the Grid class.
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_cleaner.sh (simplex.1): file cm_cleaner.sh was added on
+	  branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_splitter.sh (simplex.1): file cm_splitter.sh was added
+	  on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/constrains1.cc (simplex.1): file constrains1.cc
+	  was added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (simplex.1): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombdshape1.cc (simplex.1): file
+	  frombdshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox1.cc (simplex.1): file frombox1.cc was
+	  added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox2.cc (simplex.1): file frombox2.cc was
+	  added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/fromgrid1.cc (simplex.1): file fromgrid1.cc was
+	  added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (simplex.1): file hybrid.cc was added
+	  on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset2.cc (simplex.1): file
+	  pointsetpowerset2.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (simplex.1): file
+	  variablesset1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (simplex.1): file
+	  addspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (simplex.1): file
+	  affinedimension1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (simplex.1): file
+	  affineimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (simplex.1): file
+	  affineimage2.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (simplex.1): file
+	  affinepreimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (simplex.1): file
+	  affinepreimage2.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (simplex.1): file
+	  bhmz05widening1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (simplex.1): file
+	  bhz03widening1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (simplex.1): file bounded1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (simplex.1): file
+	  boundedaffineimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounds1.cc (simplex.1): file bounds1.cc was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (simplex.1): file
+	  cc76extrapolation1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (simplex.1): file
+	  cc76narrowing1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (simplex.1): file chinainit.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (simplex.1): file
+	  concatenate1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (simplex.1): file
+	  constraints1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (simplex.1): file contains1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (simplex.1): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/discrete1.cc (simplex.1): file discrete1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (simplex.1): file disjoint1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (simplex.1): file empty1.cc was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (simplex.1): file
+	  expandspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/foldspacedims1.cc (simplex.1): file
+	  foldspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frombdshape1.cc (simplex.1): file
+	  frombdshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (simplex.1): file
+	  fromgensys1.cc was added on branch simplex on 2008-01-07 11:15:37
+	  +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgrid1.cc (simplex.1): file fromgrid1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (simplex.1): file
+	  frompolyhedron1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromspacedim1.cc (simplex.1): file
+	  fromspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (simplex.1):
+	  file generalizedaffineimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (simplex.1):
+	  file generalizedaffineimage2.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (simplex.1):
+	  file generalizedaffineimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (simplex.1):
+	  file generalizedaffineimage4.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (simplex.1):
+	  file generalizedaffineimage5.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (simplex.1):
+	  file generalizedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc (simplex.1):
+	  file generalizedaffinepreimage2.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc (simplex.1):
+	  file generalizedaffinepreimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc (simplex.1):
+	  file generalizedaffinepreimage4.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (simplex.1): file
+	  intersection1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (simplex.1):
+	  file limitedbhmz05extrapolation1.cc was added on branch simplex
+	  on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc (simplex.1):
+	  file limitedcc76extrapolation1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (simplex.1): file
+	  mapspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (simplex.1): file max_min1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min2.cc (simplex.1): file max_min2.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (simplex.1): file
+	  maxspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/membytes1.cc (simplex.1): file membytes1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (simplex.1): file
+	  minconstraints1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (simplex.1): file
+	  octdifference1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (simplex.1): file octhull1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (simplex.1): file
+	  relatwithcons1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (simplex.1): file
+	  relatwithcons2.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (simplex.1): file
+	  relatwithgen1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (simplex.1): file
+	  removespacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (simplex.1): file run_tests was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (simplex.1): file
+	  timeelapse1.cc was added on branch simplex on 2008-01-07 11:15:37
+	  +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (simplex.1): file universe1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (simplex.1): file
+	  writeoctagon1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: MIP_Problem/Makefile.am, Octagonal_Shape/Makefile.am
+	  (simplex.[1,1]): file Makefile.am was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: MIP_Problem/ascii_dump_load1.cc,
+	  Octagonal_Shape/ascii_dump_load1.cc (simplex.[1,1]): file
+	  ascii_dump_load1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (simplex.1): file exceptions1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (simplex.1): file mipproblem1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (simplex.1): file mipproblem2.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (simplex.1): file mipproblem3.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/approximatepartition1.cc (simplex.1): file
+	  approximatepartition1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct3.cc (simplex.1): file directproduct3.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct4.cc (simplex.1): file directproduct4.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct5.cc (simplex.1): file directproduct5.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct6.cc (simplex.1): file directproduct6.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (simplex.1): file
+	  generalizedaffineimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (simplex.1): file
+	  generalizedaffinepreimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct1.cc (simplex.1): file
+	  partiallyreducedproduct1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct2.cc (simplex.1): file
+	  partiallyreducedproduct2.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct3.cc (simplex.1): file
+	  partiallyreducedproduct3.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partition1.cc (simplex.1): file partition1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetdifference1.cc (simplex.1): file
+	  powersetdifference1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallycovers1.cc (simplex.1): file
+	  powersetgeometricallycovers1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallyequals1.cc (simplex.1): file
+	  powersetgeometricallyequals1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/addconstraints1.cc (simplex.1): file addconstraints1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/addspacedims1.cc (simplex.1): file addspacedims1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/affinedimension1.cc (simplex.1): file
+	  affinedimension1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/affineimage1.cc (simplex.1): file affineimage1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/affinepreimage1.cc (simplex.1): file affinepreimage1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc (simplex.1): file
+	  ascii_dump_load1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bdsdifference1.cc (simplex.1): file bdsdifference1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bgp99extrapolation1.cc (simplex.1): file
+	  bgp99extrapolation1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bhz03widening1.cc (simplex.1): file bhz03widening1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bounded1.cc (simplex.1): file bounded1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/boundedaffineimage1.cc, Grid/boundedaffineimage1.cc
+	  (simplex.[1,1]): file boundedaffineimage1.cc was added on branch
+	  simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxdifference1.cc (simplex.1): file boxdifference1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxhull.cc (simplex.1): file boxhull.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (simplex.1): file boxhull1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/cc76narrowing1.cc (simplex.1): file cc76narrowing1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/cc76widening.cc (simplex.1): file cc76widening.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/closure1.cc (simplex.1): file closure1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/concatenate1.cc (simplex.1): file concatenate1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/congruences1.cc (simplex.1): file congruences1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/constraints1.cc, Grid/constraints1.cc
+	  (simplex.[1,1]): file constraints1.cc was added on branch simplex
+	  on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/contains1.cc (simplex.1): file contains1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/containsintegerpoint1.cc,
+	  Grid/containsintegerpoint1.cc (simplex.[1,1]): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/discrete1.cc (simplex.1): file discrete1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/disjoint1.cc (simplex.1): file disjoint1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/empty1.cc (simplex.1): file empty1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/equality1.cc (simplex.1): file equality1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/expandspacedim1.cc (simplex.1): file expandspacedim1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/foldspacedims1.cc (simplex.1): file foldspacedims1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/frombdshape1.cc, Grid/frombdshape1.cc
+	  (simplex.[1,1]): file frombdshape1.cc was added on branch simplex
+	  on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frombox1.cc (simplex.1): file frombox1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/fromgensys1.cc (simplex.1): file fromgensys1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/fromgrid1.cc (simplex.1): file fromgrid1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompartiallyreducedproduct1.cc (simplex.1): file
+	  frompartiallyreducedproduct1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (simplex.1): file frompolyhedron1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron2.cc (simplex.1): file frompolyhedron2.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/fromspacedim1.cc (simplex.1): file fromspacedim1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffineimage1.cc (simplex.1): file
+	  generalizedaffineimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (simplex.1): file
+	  generalizedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/geomcovers1.cc (simplex.1): file geomcovers1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/intersection1.cc (simplex.1): file intersection1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (simplex.1): file interval1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval2.cc (simplex.1): file interval2.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/mapspacedims1.cc (simplex.1): file mapspacedims1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (simplex.1): file max_min1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/maxspacedim1.cc (simplex.1): file maxspacedim1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (simplex.1): file membytes1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/minconstraints1.cc (simplex.1): file minconstraints1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (simplex.1): file refine1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (simplex.1): file refine2.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine3.cc (simplex.1): file refine3.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations1.cc (simplex.1): file relations1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations2.cc (simplex.1): file relations2.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/removespacedims1.cc (simplex.1): file
+	  removespacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/run_tests (simplex.1): file run_tests was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/timeelapse1.cc (simplex.1): file timeelapse1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/universe1.cc (simplex.1): file universe1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/writebox1.cc (simplex.1): file writebox1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (simplex.1): file Makefile.am was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (simplex.1): file append1.cc was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffineimage1.cc (simplex.1): file
+	  boundedaffineimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundingbox1.cc (simplex.1): file boundingbox1.cc
+	  was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounds1.cc (simplex.1): file bounds1.cc was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (simplex.1): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/discrete1.cc (simplex.1): file discrete1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (simplex.1): file disjoint1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/expandspacedim1.cc (simplex.1): file
+	  expandspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/foldspacedims1.cc (simplex.1): file
+	  foldspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromgrid1.cc (simplex.1): file fromgrid1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromspacedim1.cc (simplex.1): file
+	  fromspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min1.cc (simplex.1): file max_min1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (simplex.1): file max_min2.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (simplex.1): file maxspacedim1.cc
+	  was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/membytes1.cc (simplex.1): file membytes1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (simplex.1): file FCAIBVP.cc was added on branch
+	  simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (simplex.1): file FCAIBVP.defs.hh was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (simplex.1): file FCAIBVP.inlines.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (simplex.1): file FCAIBVP.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (simplex.1): file Variables_Set.defs.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (simplex.1): file
+	  Variables_Set.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (simplex.1): file
+	  Variables_Set.types.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assign_or_swap.hh (simplex.1): file assign_or_swap.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.defs.hh (simplex.1): file distances.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.inlines.hh (simplex.1): file distances.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.types.hh (simplex.1): file distances.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (simplex.1): file
+	  iterator_to_const.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (simplex.1): file
+	  iterator_to_const.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (simplex.1): file
+	  iterator_to_const.types.hh was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (simplex.1): file meta_programming.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.cc (simplex.1): file mp_std_bits.cc was added on
+	  branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.defs.hh (simplex.1): file mp_std_bits.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.inlines.hh (simplex.1): file
+	  mp_std_bits.inlines.hh was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (simplex.1): file Any_Pointset.defs.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (simplex.1): file
+	  Any_Pointset.inlines.hh was added on branch simplex on 2008-01-07
+	  11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (simplex.1): file Any_Pointset.types.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (simplex.1): file Ask_Tell.templates.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc (simplex.1): file Bit_Matrix.cc was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh (simplex.1): file Bit_Matrix.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.inlines.hh (simplex.1): file Bit_Matrix.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.types.hh (simplex.1): file Bit_Matrix.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (simplex.1): file Bit_Row.cc was added on branch
+	  simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (simplex.1): file Bit_Row.defs.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (simplex.1): file Bit_Row.inlines.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.types.hh (simplex.1): file Bit_Row.types.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (simplex.1): file Boundary.defs.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.cc (simplex.1): file Box.cc was added on branch simplex
+	  on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (simplex.1): file Box.defs.hh was added on branch
+	  simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (simplex.1): file Box.inlines.hh was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (simplex.1): file Box.templates.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.types.hh (simplex.1): file Box.types.hh was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Integer.hh (simplex.1): file C_Integer.hh was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Has_Assign_Or_Swap.hh (simplex.1): file Has_Assign_Or_Swap.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh (simplex.1): file Interval.templates.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh (simplex.1): file Interval_Info.defs.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh (simplex.1): file
+	  Interval_Info.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.types.hh (simplex.1): file
+	  Interval_Info.types.hh was added on branch simplex on 2008-01-07
+	  11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Restriction.defs.hh (simplex.1): file
+	  Interval_Restriction.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.1): file MIP_Problem.cc was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (simplex.1): file MIP_Problem.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (simplex.1): file
+	  MIP_Problem.inlines.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (simplex.1): file
+	  MIP_Problem.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (simplex.1): file MIP_Problem.types.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (simplex.1): file OR_Matrix.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (simplex.1): file OR_Matrix.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (simplex.1): file
+	  OR_Matrix.templates.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.types.hh (simplex.1): file OR_Matrix.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.cc (simplex.1): file Octagonal_Shape.cc was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (simplex.1): file
+	  Octagonal_Shape.defs.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (simplex.1): file
+	  Octagonal_Shape.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (simplex.1): file
+	  Octagonal_Shape.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.types.hh (simplex.1): file
+	  Octagonal_Shape.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (simplex.1): file Og_Status.idefs.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh (simplex.1): file Og_Status.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (simplex.1): file
+	  Partially_Reduced_Product.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.inlines.hh (simplex.1): file
+	  Partially_Reduced_Product.inlines.hh was added on branch simplex
+	  on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (simplex.1): file
+	  Partially_Reduced_Product.templates.hh was added on branch
+	  simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.types.hh (simplex.1): file
+	  Partially_Reduced_Product.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (simplex.1): file Pointset_Ask_Tell.cc
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (simplex.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (simplex.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (simplex.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (simplex.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (simplex.1): file Pointset_Powerset.cc
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (simplex.1): file
+	  Pointset_Powerset.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (simplex.1): file
+	  Pointset_Powerset.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (simplex.1): file
+	  Pointset_Powerset.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (simplex.1): file
+	  Pointset_Powerset.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Box.hh (simplex.1): file Rational_Box.hh was added
+	  on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Slow_Copy.hh (simplex.1): file Slow_Copy.hh was added on
+	  branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.defs.hh (simplex.1): file Temp.defs.hh was added on
+	  branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.inlines.hh (simplex.1): file Temp.inlines.hh was added
+	  on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.templates.hh (simplex.1): file Temp.templates.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (simplex.1): file Variables_Set.cc was added
+	  on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_proper_long_double.m4 (simplex.1): file
+	  ac_cxx_proper_long_double.m4 was added on branch simplex on
+	  2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_remainder_bug.m4 (simplex.1): file
+	  ac_cxx_remainder_bug.m4 was added on branch simplex on 2008-01-07
+	  11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_jar.m4 (simplex.1): file ac_prog_jar.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_java.m4 (simplex.1): file ac_prog_java.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javac.m4 (simplex.1): file ac_prog_javac.m4 was added
+	  on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javah.m4 (simplex.1): file ac_prog_javah.m4 was added
+	  on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl_c.m4 (simplex.1): file ppl_c.m4 was added on branch
+	  simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (simplex.1): file ppl_interface_generator_predicate_check_code.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (simplex.1): file ppl_interface_generator_predicate_check_pl.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (simplex.1): file ppl_interface_generator_yap_cc.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (simplex.1): file ppl_predicate_check_common.pl was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.hh (simplex.1): file yap_cfli.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (simplex.1): file ppl_interface_generator_swiprolog_cc.m4 was
+	  added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (simplex.1): file ppl_interface_generator_xsb_H.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (simplex.1): file ppl_interface_generator_xsb_cc.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (simplex.1): file
+	  ppl_interface_generator_xsb_predicate_check_P.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (simplex.1): file swi_cfli.hh
+	  was added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_predicate_check.pl (simplex.1): file
+	  swi_predicate_check.pl was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (simplex.1): file xsb_cfli.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (simplex.1): file
+	  gprolog_cfli.hh was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (simplex.1): file ppl_interface_generator_gprolog_pl.m4 was added
+	  on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (simplex.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+	  added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_predicate_check.pl (simplex.1): file
+	  sp_predicate_check.pl was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (simplex.1): file
+	  ciao_cfli.hh was added on branch simplex on 2008-01-07 11:15:30
+	  +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (simplex.1): file ppl_interface_generator_ciao_pl.m4 was added on
+	  branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (simplex.1): file
+	  ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+	  branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (simplex.1): file ppl_interface_generator_prolog_dat.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (simplex.1): file ppl_interface_generator_prolog_icc.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (simplex.1): file ppl_interface_generator_prolog_systems.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (simplex.1): file
+	  ppl_prolog_common.icc was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/By_Reference.java (simplex.1): file
+	  By_Reference.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (simplex.1): file
+	  C_Polyhedron_test1.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Coefficient.java (simplex.1): file
+	  Coefficient.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence.java (simplex.1): file
+	  Congruence.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence_System.java (simplex.1): file
+	  Congruence_System.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Constraint.java (simplex.1): file
+	  Constraint.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Constraint_System.java (simplex.1): file
+	  Constraint_System.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Degenerate_Element.java (simplex.1):
+	  file Degenerate_Element.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Domain_Error_Exception.java (simplex.1):
+	  file Domain_Error_Exception.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator.java (simplex.1): file
+	  Generator.java was added on branch simplex on 2008-01-07 11:15:29
+	  +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator_System.java (simplex.1): file
+	  Generator_System.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator_Type.java (simplex.1): file
+	  Generator_Type.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator.java (simplex.1): file
+	  Grid_Generator.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator_System.java (simplex.1):
+	  file Grid_Generator_System.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator_Type.java (simplex.1):
+	  file Grid_Generator_Type.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Invalid_Argument_Exception.java
+	  (simplex.1): file Invalid_Argument_Exception.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Length_Error_Exception.java (simplex.1):
+	  file Length_Error_Exception.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression.java (simplex.1): file
+	  Linear_Expression.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
+	  (simplex.1): file Linear_Expression_Coefficient.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Difference.java
+	  (simplex.1): file Linear_Expression_Difference.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Sum.java (simplex.1):
+	  file Linear_Expression_Sum.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Times.java
+	  (simplex.1): file Linear_Expression_Times.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
+	  (simplex.1): file Linear_Expression_Unary_Minus.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Variable.java
+	  (simplex.1): file Linear_Expression_Variable.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Logic_Error_Exception.java (simplex.1):
+	  file Logic_Error_Exception.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/MIP_Problem.java (simplex.1): file
+	  MIP_Problem.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/MIP_Problem_Status.java (simplex.1):
+	  file MIP_Problem_Status.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Optimization_Mode.java (simplex.1): file
+	  Optimization_Mode.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Overflow_Error_Exception.java
+	  (simplex.1): file Overflow_Error_Exception.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/PPL_Object.java (simplex.1): file
+	  PPL_Object.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Parma_Polyhedra_Library.java
+	  (simplex.1): file Parma_Polyhedra_Library.java was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Partial_Function.java (simplex.1): file
+	  Partial_Function.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Poly_Con_Relation.java (simplex.1): file
+	  Poly_Con_Relation.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Poly_Gen_Relation.java (simplex.1): file
+	  Poly_Gen_Relation.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Relation_Symbol.java (simplex.1): file
+	  Relation_Symbol.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Test_Partial_Function.java (simplex.1):
+	  file Test_Partial_Function.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Variable.java (simplex.1): file
+	  Variable.java was added on branch simplex on 2008-01-07 11:15:29
+	  +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Variables_Set.java (simplex.1): file
+	  Variables_Set.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (simplex.1): file ppl_interface_generator_java_classes_java.m4
+	  was added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_classes_java_code.m4 was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (simplex.1): file ppl_interface_generator_java_test_java.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (simplex.1): file ppl_interface_generator_java_test_java_code.m4
+	  was added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (simplex.1):
+	  file ppl_interface_generator_ocaml_cc.m4 was added on branch
+	  simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_cc_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_dat.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (simplex.1):
+	  file ppl_interface_generator_ocaml_ml.m4 was added on branch
+	  simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_ml_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_mli.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_mli_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (simplex.1): file
+	  ppl_ocaml_globals.cc was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.ml (simplex.1): file
+	  ppl_ocaml_globals.ml was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_types.ml (simplex.1): file
+	  ppl_ocaml_types.ml was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/test1.ml (simplex.1): file test1.ml was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (simplex.1): file C_interface.dox
+	  was added on branch simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (simplex.1): file Makefile.am was
+	  added on branch simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: jni/Makefile.am, ppl_java/Makefile.am,
+	  tests/Makefile.am (simplex.[1,1,1]): file Makefile.am was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (simplex.1): file
+	  ppl_c_version.h.in was added on branch simplex on 2008-01-07
+	  11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (simplex.1): file
+	  ppl_interface_generator_c_cc.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (simplex.1):
+	  file ppl_interface_generator_c_cc_code.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (simplex.1):
+	  file ppl_interface_generator_c_cc_preamble was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (simplex.1): file
+	  ppl_interface_generator_c_dat.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (simplex.1): file
+	  ppl_interface_generator_c_h.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (simplex.1):
+	  file ppl_interface_generator_c_h_code.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (simplex.1):
+	  file ppl_interface_generator_c_h_preamble was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (simplex.1): file
+	  ppl_interface_generator_common.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (simplex.1):
+	  file ppl_interface_generator_common_dat.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_copyright (simplex.1): file
+	  ppl_interface_generator_copyright was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (simplex.1):
+	  file ppl_interface_generator_java_dat.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (simplex.1): file
+	  ppl_java_common.cc was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (simplex.1): file
+	  ppl_java_common.hh was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc (simplex.1): file
+	  ppl_java_globals.cc was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.tex (simplex.1): file
+	  devref-c-interface.tex was added on branch simplex on 2008-01-07
+	  11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (simplex.1): file
+	  ppl-config_extra_man_text was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (simplex.1): file
+	  ppl_lcdd_extra_man_text was added on branch simplex on 2008-01-07
+	  11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (simplex.1): file
+	  ppl_lpsol_extra_man_text was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.tex (simplex.1): file user-c-interface.tex
+	  was added on branch simplex on 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.tex (simplex.1): file
+	  user-prolog-interface.tex was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: doc/Makefile.am, m4/Makefile.am (simplex.[1,1]): file
+	  Makefile.am was added on branch simplex on 2008-01-07 11:15:25
+	  +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/README.doc (simplex.1): file README.doc was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.tex (simplex.1): file devref.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/pwl.sty (simplex.1): file pwl.sty was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.tex (simplex.1): file user.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.44), README (1.52), README.configure (1.24),
+	  configure.ac (1.300), instchk.hh (1.10), Watchdog/Makefile.am
+	  (1.33), Watchdog/README (1.17), Watchdog/configure.ac (1.43),
+	  Watchdog/doc/Makefile.am (1.4), Watchdog/doc/README.doc (1.3),
+	  Watchdog/doc/devref.tex (1.4), Watchdog/doc/pwl.sty (1.3),
+	  Watchdog/doc/user.tex (1.4), Watchdog/m4/Makefile.am (1.3),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.5),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.5),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.4),
+	  Watchdog/src/EList.defs.hh (1.7), Watchdog/src/EList.inlines.hh
+	  (1.5), Watchdog/src/EList.types.hh (1.4),
+	  Watchdog/src/EList_Iterator.defs.hh (1.5),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.5),
+	  Watchdog/src/EList_Iterator.types.hh (1.4),
+	  Watchdog/src/Handler.defs.hh (1.6),
+	  Watchdog/src/Handler.inlines.hh (1.5),
+	  Watchdog/src/Handler.types.hh (1.4), Watchdog/src/Makefile.am
+	  (1.13), Watchdog/src/Pending_Element.cc (1.6),
+	  Watchdog/src/Pending_Element.defs.hh (1.6),
+	  Watchdog/src/Pending_Element.inlines.hh (1.5),
+	  Watchdog/src/Pending_Element.types.hh (1.4),
+	  Watchdog/src/Pending_List.cc (1.6),
+	  Watchdog/src/Pending_List.defs.hh (1.6),
+	  Watchdog/src/Pending_List.inlines.hh (1.5),
+	  Watchdog/src/Pending_List.types.hh (1.4), Watchdog/src/Time.cc
+	  (1.6), Watchdog/src/Time.defs.hh (1.6),
+	  Watchdog/src/Time.inlines.hh (1.5), Watchdog/src/Time.types.hh
+	  (1.4), Watchdog/src/Watchdog.cc (1.8),
+	  Watchdog/src/Watchdog.defs.hh (1.8),
+	  Watchdog/src/Watchdog.inlines.hh (1.5),
+	  Watchdog/src/Watchdog.types.hh (1.4), Watchdog/src/pwl_header.hh
+	  (1.6), Watchdog/utils/Makefile.am (1.9),
+	  Watchdog/utils/build_header.in (1.6), debian/Makefile.am (1.5),
+	  debian/libppl-pwl.copyright.in (1.6), debian/libppl.copyright.in
+	  (1.6), demos/Makefile.am (1.12), demos/ppl_lcdd/Makefile.am
+	  (1.29), demos/ppl_lcdd/ppl_lcdd.cc (1.61),
+	  demos/ppl_lcdd/examples/Makefile.am (1.10),
+	  demos/ppl_lpsol/Makefile.am (1.44), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.76), demos/ppl_lpsol/examples/Makefile.am (1.11),
+	  doc/Makefile.am (1.56), doc/README.doc (1.13),
+	  doc/definitions.dox (1.206), doc/devref-c-interface.tex (1.3),
+	  doc/devref.tex (1.24), doc/ppl-config.1 (1.6),
+	  doc/ppl-config_extra_man_text (1.3), doc/ppl.sty (1.28),
+	  doc/ppl_lcdd.1 (1.4), doc/ppl_lcdd_extra_man_text (1.3),
+	  doc/ppl_lpsol.1 (1.4), doc/ppl_lpsol_extra_man_text (1.3),
+	  doc/user-c-interface.tex (1.3), doc/user-prolog-interface.tex
+	  (1.3), doc/user.tex (1.25), fedora/Makefile.am (1.2),
+	  interfaces/Makefile.am (1.28),
+	  interfaces/ppl_interface_generator_common.m4 (1.19),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.32),
+	  interfaces/ppl_interface_generator_copyright (1.5),
+	  interfaces/C/C_interface.dox (1.3), interfaces/C/Makefile.am
+	  (1.37), interfaces/C/ppl_c.h.in (1.74),
+	  interfaces/C/ppl_c_version.h.in (1.7),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.9),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.19),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.13),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.9),
+	  interfaces/Java/Makefile.am (1.14),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.12),
+	  interfaces/Java/jni/Makefile.am (1.15),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.10),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.34), interfaces/Java/jni/ppl_java_common.cc (1.37),
+	  interfaces/Java/jni/ppl_java_common.hh (1.31),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.9),
+	  interfaces/Java/ppl_java/By_Reference.java (1.5),
+	  interfaces/Java/ppl_java/Coefficient.java (1.7),
+	  interfaces/Java/ppl_java/Congruence.java (1.7),
+	  interfaces/Java/ppl_java/Congruence_System.java (1.5),
+	  interfaces/Java/ppl_java/Constraint.java (1.7),
+	  interfaces/Java/ppl_java/Constraint_System.java (1.5),
+	  interfaces/Java/ppl_java/Degenerate_Element.java (1.4),
+	  interfaces/Java/ppl_java/Domain_Error_Exception.java (1.4),
+	  interfaces/Java/ppl_java/Generator.java (1.7),
+	  interfaces/Java/ppl_java/Generator_System.java (1.5),
+	  interfaces/Java/ppl_java/Generator_Type.java (1.4),
+	  interfaces/Java/ppl_java/Grid_Generator.java (1.7),
+	  interfaces/Java/ppl_java/Grid_Generator_System.java (1.6),
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java (1.4),
+	  interfaces/Java/ppl_java/Invalid_Argument_Exception.java (1.4),
+	  interfaces/Java/ppl_java/Length_Error_Exception.java (1.2),
+	  interfaces/Java/ppl_java/Linear_Expression.java (1.7),
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
+	  (1.5), interfaces/Java/ppl_java/Linear_Expression_Difference.java
+	  (1.6), interfaces/Java/ppl_java/Linear_Expression_Sum.java (1.6),
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java (1.5),
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
+	  (1.5), interfaces/Java/ppl_java/Linear_Expression_Variable.java
+	  (1.5), interfaces/Java/ppl_java/Logic_Error_Exception.java (1.4),
+	  interfaces/Java/ppl_java/MIP_Problem.java (1.8),
+	  interfaces/Java/ppl_java/MIP_Problem_Status.java (1.4),
+	  interfaces/Java/ppl_java/Makefile.am (1.35),
+	  interfaces/Java/ppl_java/Optimization_Mode.java (1.4),
+	  interfaces/Java/ppl_java/Overflow_Error_Exception.java (1.4),
+	  interfaces/Java/ppl_java/PPL_Object.java (1.6),
+	  interfaces/Java/ppl_java/Parma_Polyhedra_Library.java (1.4),
+	  interfaces/Java/ppl_java/Partial_Function.java (1.4),
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java (1.4),
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java (1.4),
+	  interfaces/Java/ppl_java/Relation_Symbol.java (1.5),
+	  interfaces/Java/ppl_java/Variable.java (1.6),
+	  interfaces/Java/ppl_java/Variables_Set.java (1.4),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.17),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.31), interfaces/Java/tests/C_Polyhedron_test1.java (1.13),
+	  interfaces/Java/tests/Makefile.am (1.17),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.4),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.11),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.24), interfaces/OCaml/Makefile.am (1.34),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.5),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.17),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.10),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.14),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.8),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.8),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.12),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.8),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.11),
+	  interfaces/OCaml/test1.ml (1.31), interfaces/Prolog/Makefile.am
+	  (1.43), interfaces/Prolog/Prolog_interface.dox (1.161),
+	  interfaces/Prolog/exceptions.hh (1.26),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.35),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.12),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.50),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.11), interfaces/Prolog/ppl_prolog_common.icc (1.13),
+	  interfaces/Prolog/track_allocation.hh (1.24),
+	  interfaces/Prolog/Ciao/Makefile.am (1.67),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.5),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.20),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.16),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.27),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.52),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.7),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.6), interfaces/Prolog/GNU/Makefile.am (1.67),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.12),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.13),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.8),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.45),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.7), interfaces/Prolog/SICStus/Makefile.am (1.79),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.11), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.29),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.9),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.11),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.19),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.20),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.14),
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl (1.4),
+	  interfaces/Prolog/SWI/Makefile.am (1.77),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.14),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.12),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.14), interfaces/Prolog/SWI/ppl_pl.cc (1.14),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.9),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.8),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.11),
+	  interfaces/Prolog/SWI/swi_predicate_check.pl (1.4),
+	  interfaces/Prolog/XSB/Makefile.am (1.56),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.8),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.10),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.6), interfaces/Prolog/XSB/xsb_cfli.hh (1.5),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.19),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.17),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.31),
+	  interfaces/Prolog/YAP/Makefile.am (1.56),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.8),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.13),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.5),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.14),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.10),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.14),
+	  interfaces/Prolog/tests/Makefile.am (1.17),
+	  interfaces/Prolog/tests/clpq.pl (1.11),
+	  interfaces/Prolog/tests/clpq2.pl (1.13),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.6),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.4),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.4),
+	  interfaces/Prolog/tests/pl_check.pl (1.53),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.6),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.52),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.28), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.5), m4/Makefile.am (1.29), m4/ac_check_fpu_control.m4 (1.6),
+	  m4/ac_check_gmp.m4 (1.26), m4/ac_check_sicstus_prolog.m4 (1.8),
+	  m4/ac_check_swi_prolog.m4 (1.14), m4/ac_check_xsb_prolog.m4
+	  (1.5), m4/ac_cxx_attribute_weak.m4 (1.10),
+	  m4/ac_cxx_double_binary_format.m4 (1.7),
+	  m4/ac_cxx_flexible_arrays.m4 (1.15),
+	  m4/ac_cxx_float_binary_format.m4 (1.6),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.7),
+	  m4/ac_cxx_proper_long_double.m4 (1.3), m4/ac_cxx_remainder_bug.m4
+	  (1.3), m4/ac_prog_jar.m4 (1.3), m4/ac_prog_java.m4 (1.6),
+	  m4/ac_prog_javac.m4 (1.7), m4/ac_prog_javah.m4 (1.9),
+	  m4/ac_text_md5sum.m4 (1.4), m4/ppl.m4 (1.9), m4/ppl_c.m4 (1.2),
+	  src/Any_Pointset.defs.hh (1.17), src/Any_Pointset.inlines.hh
+	  (1.4), src/Any_Pointset.types.hh (1.3), src/Ask_Tell.defs.hh
+	  (1.19), src/Ask_Tell.inlines.hh (1.18), src/Ask_Tell.templates.hh
+	  (1.10), src/Ask_Tell.types.hh (1.7), src/BDS_Status.idefs.hh
+	  (1.22), src/BDS_Status.inlines.hh (1.18), src/BD_Shape.cc (1.9),
+	  src/BD_Shape.defs.hh (1.109), src/BD_Shape.inlines.hh (1.155),
+	  src/BD_Shape.templates.hh (1.90), src/BD_Shape.types.hh (1.7),
+	  src/BHRZ03_Certificate.cc (1.14), src/BHRZ03_Certificate.defs.hh
+	  (1.19), src/BHRZ03_Certificate.inlines.hh (1.10),
+	  src/BHRZ03_Certificate.types.hh (1.6), src/Bit_Matrix.cc (1.5),
+	  src/Bit_Matrix.defs.hh (1.5), src/Bit_Matrix.inlines.hh (1.4),
+	  src/Bit_Matrix.types.hh (1.3), src/Bit_Row.cc (1.5),
+	  src/Bit_Row.defs.hh (1.9), src/Bit_Row.inlines.hh (1.6),
+	  src/Bit_Row.types.hh (1.3), src/Boundary.defs.hh (1.10),
+	  src/Box.cc (1.10), src/Box.defs.hh (1.34), src/Box.inlines.hh
+	  (1.23), src/Box.templates.hh (1.74), src/Box.types.hh (1.4),
+	  src/C_Integer.hh (1.6), src/C_Polyhedron.cc (1.24),
+	  src/C_Polyhedron.defs.hh (1.53), src/C_Polyhedron.inlines.hh
+	  (1.39), src/C_Polyhedron.types.hh (1.12), src/Checked_Number.cc
+	  (1.14), src/Checked_Number.defs.hh (1.96),
+	  src/Checked_Number.inlines.hh (1.78), src/Checked_Number.types.hh
+	  (1.11), src/Coefficient.cc (1.9), src/Coefficient.defs.hh (1.11),
+	  src/Coefficient.inlines.hh (1.10), src/Coefficient.types.hh
+	  (1.16), src/Coefficient_traits_template.hh (1.9),
+	  src/Congruence.cc (1.19), src/Congruence.defs.hh (1.23),
+	  src/Congruence.inlines.hh (1.19), src/Congruence.types.hh (1.4),
+	  src/Congruence_System.cc (1.28), src/Congruence_System.defs.hh
+	  (1.26), src/Congruence_System.inlines.hh (1.11),
+	  src/Congruence_System.types.hh (1.4), src/Constraint.cc (1.70),
+	  src/Constraint.defs.hh (1.128), src/Constraint.inlines.hh (1.69),
+	  src/Constraint.types.hh (1.12), src/Constraint_System.cc (1.29),
+	  src/Constraint_System.defs.hh (1.40),
+	  src/Constraint_System.inlines.hh (1.12),
+	  src/Constraint_System.types.hh (1.6), src/DB_Matrix.defs.hh
+	  (1.30), src/DB_Matrix.inlines.hh (1.34),
+	  src/DB_Matrix.templates.hh (1.8), src/DB_Matrix.types.hh (1.7),
+	  src/DB_Row.defs.hh (1.26), src/DB_Row.inlines.hh (1.24),
+	  src/DB_Row.templates.hh (1.8), src/DB_Row.types.hh (1.9),
+	  src/Determinate.defs.hh (1.68), src/Determinate.inlines.hh
+	  (1.58), src/Determinate.types.hh (1.11), src/Float.cc (1.8),
+	  src/Float.defs.hh (1.27), src/Float.inlines.hh (1.32),
+	  src/GMP_Integer.defs.hh (1.28), src/GMP_Integer.inlines.hh
+	  (1.23), src/GMP_Integer.types.hh (1.17), src/Generator.cc (1.77),
+	  src/Generator.defs.hh (1.125), src/Generator.inlines.hh (1.63),
+	  src/Generator.types.hh (1.12), src/Generator_System.cc (1.26),
+	  src/Generator_System.defs.hh (1.27),
+	  src/Generator_System.inlines.hh (1.11),
+	  src/Generator_System.types.hh (1.6), src/Grid.defs.hh (1.63),
+	  src/Grid.inlines.hh (1.22), src/Grid.templates.hh (1.33),
+	  src/Grid.types.hh (1.4), src/Grid_Certificate.cc (1.11),
+	  src/Grid_Certificate.defs.hh (1.7),
+	  src/Grid_Certificate.inlines.hh (1.5),
+	  src/Grid_Certificate.types.hh (1.4), src/Grid_Generator.cc
+	  (1.23), src/Grid_Generator.defs.hh (1.33),
+	  src/Grid_Generator.inlines.hh (1.16), src/Grid_Generator.types.hh
+	  (1.4), src/Grid_Generator_System.cc (1.21),
+	  src/Grid_Generator_System.defs.hh (1.29),
+	  src/Grid_Generator_System.inlines.hh (1.17),
+	  src/Grid_Generator_System.types.hh (1.4), src/Grid_Status.cc
+	  (1.9), src/Grid_Status.idefs.hh (1.8), src/Grid_Status.inlines.hh
+	  (1.5), src/Grid_chdims.cc (1.21), src/Grid_conversion.cc (1.23),
+	  src/Grid_nonpublic.cc (1.32), src/Grid_public.cc (1.63),
+	  src/Grid_simplify.cc (1.37), src/Grid_widenings.cc (1.17),
+	  src/H79_Certificate.cc (1.13), src/H79_Certificate.defs.hh
+	  (1.17), src/H79_Certificate.inlines.hh (1.11),
+	  src/H79_Certificate.types.hh (1.6), src/Has_Assign_Or_Swap.hh
+	  (1.3), src/Init.cc (1.33), src/Init.defs.hh (1.20),
+	  src/Init.types.hh (1.11), src/Interval.defs.hh (1.50),
+	  src/Interval.inlines.hh (1.29), src/Interval.templates.hh (1.4),
+	  src/Interval.types.hh (1.14), src/Interval_Info.defs.hh (1.6),
+	  src/Interval_Info.inlines.hh (1.7), src/Interval_Info.types.hh
+	  (1.4), src/Interval_Restriction.defs.hh (1.11),
+	  src/Linear_Expression.cc (1.20), src/Linear_Expression.defs.hh
+	  (1.38), src/Linear_Expression.inlines.hh (1.13),
+	  src/Linear_Expression.types.hh (1.6), src/Linear_Row.cc (1.25),
+	  src/Linear_Row.defs.hh (1.26), src/Linear_Row.inlines.hh (1.14),
+	  src/Linear_Row.types.hh (1.6), src/Linear_System.cc (1.47),
+	  src/Linear_System.defs.hh (1.33), src/Linear_System.inlines.hh
+	  (1.24), src/Linear_System.types.hh (1.6), src/MIP_Problem.cc
+	  (1.65), src/MIP_Problem.defs.hh (1.37),
+	  src/MIP_Problem.inlines.hh (1.17), src/MIP_Problem.templates.hh
+	  (1.12), src/MIP_Problem.types.hh (1.3), src/Makefile.am (1.176),
+	  src/Matrix.cc (1.98), src/Matrix.defs.hh (1.84),
+	  src/Matrix.inlines.hh (1.53), src/Matrix.types.hh (1.12),
+	  src/NNC_Polyhedron.cc (1.24), src/NNC_Polyhedron.defs.hh (1.54),
+	  src/NNC_Polyhedron.inlines.hh (1.40), src/NNC_Polyhedron.types.hh
+	  (1.12), src/Numeric_Format.defs.hh (1.8), src/OR_Matrix.defs.hh
+	  (1.14), src/OR_Matrix.inlines.hh (1.10),
+	  src/OR_Matrix.templates.hh (1.7), src/OR_Matrix.types.hh (1.4),
+	  src/Octagonal_Shape.cc (1.8), src/Octagonal_Shape.defs.hh (1.37),
+	  src/Octagonal_Shape.inlines.hh (1.26),
+	  src/Octagonal_Shape.templates.hh (1.64),
+	  src/Octagonal_Shape.types.hh (1.4), src/Og_Status.idefs.hh (1.8),
+	  src/Og_Status.inlines.hh (1.6),
+	  src/Partially_Reduced_Product.defs.hh (1.19),
+	  src/Partially_Reduced_Product.inlines.hh (1.17),
+	  src/Partially_Reduced_Product.templates.hh (1.8),
+	  src/Partially_Reduced_Product.types.hh (1.3), src/Ph_Status.cc
+	  (1.15), src/Ph_Status.idefs.hh (1.22), src/Ph_Status.inlines.hh
+	  (1.10), src/Pointset_Ask_Tell.cc (1.8),
+	  src/Pointset_Ask_Tell.defs.hh (1.14),
+	  src/Pointset_Ask_Tell.inlines.hh (1.7),
+	  src/Pointset_Ask_Tell.templates.hh (1.12),
+	  src/Pointset_Ask_Tell.types.hh (1.4), src/Pointset_Powerset.cc
+	  (1.16), src/Pointset_Powerset.defs.hh (1.22),
+	  src/Pointset_Powerset.inlines.hh (1.10),
+	  src/Pointset_Powerset.templates.hh (1.17),
+	  src/Pointset_Powerset.types.hh (1.3), src/Poly_Con_Relation.cc
+	  (1.17), src/Poly_Con_Relation.defs.hh (1.36),
+	  src/Poly_Con_Relation.inlines.hh (1.17),
+	  src/Poly_Con_Relation.types.hh (1.11), src/Poly_Gen_Relation.cc
+	  (1.17), src/Poly_Gen_Relation.defs.hh (1.34),
+	  src/Poly_Gen_Relation.inlines.hh (1.17),
+	  src/Poly_Gen_Relation.types.hh (1.11), src/Polyhedron.defs.hh
+	  (1.329), src/Polyhedron.inlines.hh (1.145),
+	  src/Polyhedron.templates.hh (1.16), src/Polyhedron.types.hh
+	  (1.18), src/Polyhedron_chdims.cc (1.45),
+	  src/Polyhedron_nonpublic.cc (1.82), src/Polyhedron_public.cc
+	  (1.106), src/Polyhedron_widenings.cc (1.65), src/Powerset.defs.hh
+	  (1.31), src/Powerset.inlines.hh (1.21), src/Powerset.templates.hh
+	  (1.6), src/Powerset.types.hh (1.7), src/Ptr_Iterator.defs.hh
+	  (1.12), src/Ptr_Iterator.inlines.hh (1.9),
+	  src/Ptr_Iterator.types.hh (1.7), src/Rational_Box.hh (1.7),
+	  src/Result.defs.hh (1.20), src/Result.inlines.hh (1.12),
+	  src/Rounding_Dir.defs.hh (1.14), src/Rounding_Dir.inlines.hh
+	  (1.8), src/Row.cc (1.105), src/Row.defs.hh (1.113),
+	  src/Row.inlines.hh (1.67), src/Row.types.hh (1.13),
+	  src/Scalar_Products.cc (1.10), src/Scalar_Products.defs.hh
+	  (1.11), src/Scalar_Products.inlines.hh (1.7),
+	  src/Scalar_Products.types.hh (1.5), src/Slow_Copy.hh (1.3),
+	  src/Temp.defs.hh (1.8), src/Temp.inlines.hh (1.4),
+	  src/Temp.templates.hh (1.3), src/Topology.hh (1.15),
+	  src/Variable.cc (1.25), src/Variable.defs.hh (1.55),
+	  src/Variable.inlines.hh (1.26), src/Variable.types.hh (1.12),
+	  src/Variables_Set.cc (1.7), src/Variables_Set.defs.hh (1.8),
+	  src/Variables_Set.inlines.hh (1.6), src/Variables_Set.types.hh
+	  (1.3), src/Widening_Function.defs.hh (1.19),
+	  src/Widening_Function.inlines.hh (1.16),
+	  src/Widening_Function.types.hh (1.7), src/algorithms.hh (1.50),
+	  src/assign_or_swap.hh (1.2), src/checked.cc (1.22),
+	  src/checked.defs.hh (1.44), src/checked.inlines.hh (1.41),
+	  src/checked_ext.defs.hh (1.15), src/checked_ext.inlines.hh
+	  (1.41), src/checked_float.inlines.hh (1.83),
+	  src/checked_int.inlines.hh (1.65), src/checked_mpq.inlines.hh
+	  (1.44), src/checked_mpz.inlines.hh (1.51),
+	  src/checked_numeric_limits.hh (1.22), src/compiler.hh (1.12),
+	  src/conversion.cc (1.85), src/distances.defs.hh (1.5),
+	  src/distances.inlines.hh (1.6), src/distances.types.hh (1.4),
+	  src/fpu-c99.inlines.hh (1.16), src/fpu-ia32.inlines.hh (1.18),
+	  src/fpu-none.inlines.hh (1.8), src/fpu-sparc.inlines.hh (1.10),
+	  src/fpu.defs.hh (1.17), src/fpu.types.hh (1.6), src/globals.cc
+	  (1.32), src/globals.defs.hh (1.52), src/globals.inlines.hh
+	  (1.20), src/globals.types.hh (1.12), src/initializer.hh (1.16),
+	  src/iterator_to_const.defs.hh (1.7),
+	  src/iterator_to_const.inlines.hh (1.5),
+	  src/iterator_to_const.types.hh (1.3), src/max_space_dimension.hh
+	  (1.14), src/meta_programming.hh (1.9), src/minimize.cc (1.49),
+	  src/mp_std_bits.cc (1.6), src/mp_std_bits.defs.hh (1.6),
+	  src/mp_std_bits.inlines.hh (1.5), src/namespaces.hh (1.13),
+	  src/ppl-config.cc.in (1.23), src/ppl_header.hh (1.8),
+	  src/simplify.cc (1.50), src/swapping_sort.icc (1.14),
+	  src/version.cc (1.11), src/version.hh.in (1.17), tests/FCAIBVP.cc
+	  (1.6), tests/FCAIBVP.defs.hh (1.6), tests/FCAIBVP.inlines.hh
+	  (1.6), tests/FCAIBVP.types.hh (1.3), tests/Makefile.am (1.264),
+	  tests/Partial_Function.cc (1.7), tests/Partial_Function.defs.hh
+	  (1.5), tests/Partial_Function.inlines.hh (1.4),
+	  tests/Partial_Function.types.hh (1.3),
+	  tests/Random_Number_Generator.defs.hh (1.6),
+	  tests/Random_Number_Generator.inlines.hh (1.11),
+	  tests/Random_Number_Generator.types.hh (1.4), tests/files.cc
+	  (1.12), tests/files.hh (1.12), tests/ppl_test.cc (1.12),
+	  tests/ppl_test.hh (1.68), tests/print.cc (1.29), tests/print.hh
+	  (1.45), tests/Ask_Tell/Makefile.am (1.5),
+	  tests/Ask_Tell/append1.cc (1.7), tests/BD_Shape/Makefile.am
+	  (1.70), tests/BD_Shape/addconstraints1.cc (1.19),
+	  tests/BD_Shape/addspacedims1.cc (1.16),
+	  tests/BD_Shape/affinedimension1.cc (1.13),
+	  tests/BD_Shape/affineimage1.cc (1.20),
+	  tests/BD_Shape/affineimage2.cc (1.14),
+	  tests/BD_Shape/affinepreimage1.cc (1.22),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.16),
+	  tests/BD_Shape/bdsdifference1.cc (1.16),
+	  tests/BD_Shape/bdshull1.cc (1.17),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.11),
+	  tests/BD_Shape/bhmz05widening1.cc (1.16),
+	  tests/BD_Shape/bhz03widening1.cc (1.11),
+	  tests/BD_Shape/bounded1.cc (1.4),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.5),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.4),
+	  tests/BD_Shape/boundingbox1.cc (1.2), tests/BD_Shape/bounds1.cc
+	  (1.4), tests/BD_Shape/cc76extrapolation1.cc (1.20),
+	  tests/BD_Shape/cc76narrowing1.cc (1.19),
+	  tests/BD_Shape/closure1.cc (1.21), tests/BD_Shape/concatenate1.cc
+	  (1.15), tests/BD_Shape/constraints1.cc (1.20),
+	  tests/BD_Shape/contains1.cc (1.16),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.4),
+	  tests/BD_Shape/discrete1.cc (1.4), tests/BD_Shape/disjoint1.cc
+	  (1.7), tests/BD_Shape/empty1.cc (1.12),
+	  tests/BD_Shape/equality1.cc (1.17),
+	  tests/BD_Shape/expandspacedim1.cc (1.5),
+	  tests/BD_Shape/foldspacedims1.cc (1.7),
+	  tests/BD_Shape/fromgensys1.cc (1.16), tests/BD_Shape/fromgrid1.cc
+	  (1.3), tests/BD_Shape/fromoctagonalshape1.cc (1.2),
+	  tests/BD_Shape/frompolyhedron1.cc (1.6),
+	  tests/BD_Shape/fromspacedim1.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.18),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.22),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.16),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.17),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.7),
+	  tests/BD_Shape/geomcovers1.cc (1.11),
+	  tests/BD_Shape/h79widening1.cc (1.14),
+	  tests/BD_Shape/intersection1.cc (1.19),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.15),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.16),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.15),
+	  tests/BD_Shape/mapspacedims1.cc (1.16),
+	  tests/BD_Shape/max_min1.cc (1.4), tests/BD_Shape/max_min2.cc
+	  (1.6), tests/BD_Shape/maxspacedim1.cc (1.5),
+	  tests/BD_Shape/membytes1.cc (1.4),
+	  tests/BD_Shape/minconstraints1.cc (1.12),
+	  tests/BD_Shape/relations1.cc (1.19), tests/BD_Shape/relations2.cc
+	  (1.23), tests/BD_Shape/relations3.cc (1.27),
+	  tests/BD_Shape/removespacedims1.cc (1.21),
+	  tests/BD_Shape/run_tests (1.20), tests/BD_Shape/timeelapse1.cc
+	  (1.21), tests/BD_Shape/universe1.cc (1.16),
+	  tests/BD_Shape/writebdshape1.cc (1.11), tests/Box/Makefile.am
+	  (1.47), tests/Box/addconstraints1.cc (1.10),
+	  tests/Box/addspacedims1.cc (1.5), tests/Box/affinedimension1.cc
+	  (1.7), tests/Box/affineimage1.cc (1.8),
+	  tests/Box/affinepreimage1.cc (1.5), tests/Box/ascii_dump_load1.cc
+	  (1.5), tests/Box/bdsdifference1.cc (1.6),
+	  tests/Box/bgp99extrapolation1.cc (1.5),
+	  tests/Box/bhz03widening1.cc (1.5), tests/Box/bounded1.cc (1.5),
+	  tests/Box/boundedaffineimage1.cc (1.5),
+	  tests/Box/boxdifference1.cc (1.7), tests/Box/boxhull.cc (1.5),
+	  tests/Box/boxhull1.cc (1.6), tests/Box/cc76narrowing1.cc (1.6),
+	  tests/Box/cc76widening.cc (1.7), tests/Box/closure1.cc (1.5),
+	  tests/Box/concatenate1.cc (1.6), tests/Box/congruences1.cc (1.2),
+	  tests/Box/constraints1.cc (1.10), tests/Box/contains1.cc (1.6),
+	  tests/Box/containsintegerpoint1.cc (1.7), tests/Box/discrete1.cc
+	  (1.6), tests/Box/disjoint1.cc (1.6), tests/Box/empty1.cc (1.6),
+	  tests/Box/equality1.cc (1.6), tests/Box/expandspacedim1.cc (1.7),
+	  tests/Box/foldspacedims1.cc (1.8), tests/Box/frombdshape1.cc
+	  (1.3), tests/Box/frombox1.cc (1.4), tests/Box/fromgensys1.cc
+	  (1.5), tests/Box/fromgrid1.cc (1.6),
+	  tests/Box/frompartiallyreducedproduct1.cc (1.2),
+	  tests/Box/frompolyhedron1.cc (1.12), tests/Box/frompolyhedron2.cc
+	  (1.10), tests/Box/fromspacedim1.cc (1.3),
+	  tests/Box/generalizedaffineimage1.cc (1.6),
+	  tests/Box/generalizedaffinepreimage1.cc (1.6),
+	  tests/Box/geomcovers1.cc (1.5), tests/Box/intersection1.cc (1.7),
+	  tests/Box/interval1.cc (1.5), tests/Box/interval2.cc (1.5),
+	  tests/Box/mapspacedims1.cc (1.5), tests/Box/max_min1.cc (1.7),
+	  tests/Box/maxspacedim1.cc (1.6), tests/Box/membytes1.cc (1.5),
+	  tests/Box/minconstraints1.cc (1.6),
+	  tests/Box/pointsetpowerset1.cc (1.4), tests/Box/refine1.cc
+	  (1.11), tests/Box/refine2.cc (1.10), tests/Box/refine3.cc (1.3),
+	  tests/Box/relations1.cc (1.6), tests/Box/relations2.cc (1.4),
+	  tests/Box/removespacedims1.cc (1.7), tests/Box/run_tests (1.4),
+	  tests/Box/timeelapse1.cc (1.6), tests/Box/universe1.cc (1.5),
+	  tests/Box/writebox1.cc (1.5), tests/Grid/Makefile.am (1.59),
+	  tests/Grid/addcongruence1.cc (1.15),
+	  tests/Grid/addcongruences1.cc (1.18),
+	  tests/Grid/addconstraint1.cc (1.13),
+	  tests/Grid/addconstraints1.cc (1.14), tests/Grid/addgenerator1.cc
+	  (1.17), tests/Grid/addgenerators1.cc (1.17),
+	  tests/Grid/addspacedims1.cc (1.16), tests/Grid/affinedim1.cc
+	  (1.13), tests/Grid/affineimage1.cc (1.15),
+	  tests/Grid/affineimage2.cc (1.13), tests/Grid/affinepreimage1.cc
+	  (1.16), tests/Grid/affinepreimage2.cc (1.9),
+	  tests/Grid/approximatepartition1.cc (1.4),
+	  tests/Grid/asciidumpload1.cc (1.15), tests/Grid/asciidumpload2.cc
+	  (1.7), tests/Grid/asciidumpload3.cc (1.6),
+	  tests/Grid/asciidumpload4.cc (1.6), tests/Grid/asciidumpload5.cc
+	  (1.4), tests/Grid/asciidumpload6.cc (1.4),
+	  tests/Grid/asciidumpload7.cc (1.5), tests/Grid/bhz03widening1.cc
+	  (1.14), tests/Grid/bounded1.cc (1.15),
+	  tests/Grid/boundedaffineimage1.cc (1.5),
+	  tests/Grid/boundedaffinepreimage1.cc (1.5),
+	  tests/Grid/boundingbox1.cc (1.20), tests/Grid/bounds1.cc (1.16),
+	  tests/Grid/certificate1.cc (1.15), tests/Grid/concatenate1.cc
+	  (1.15), tests/Grid/congruence1.cc (1.19),
+	  tests/Grid/congruences1.cc (1.13), tests/Grid/congruences2.cc
+	  (1.7), tests/Grid/constraints1.cc (1.2), tests/Grid/contains1.cc
+	  (1.13), tests/Grid/containsintegerpoint1.cc (1.5),
+	  tests/Grid/copyconstruct1.cc (1.9), tests/Grid/coveringbox1.cc
+	  (1.17), tests/Grid/coveringbox2.cc (1.15),
+	  tests/Grid/directproduct1.cc (1.48), tests/Grid/directproduct2.cc
+	  (1.15), tests/Grid/directproduct3.cc (1.16),
+	  tests/Grid/directproduct4.cc (1.14), tests/Grid/directproduct5.cc
+	  (1.9), tests/Grid/directproduct6.cc (1.11),
+	  tests/Grid/discrete1.cc (1.9), tests/Grid/disjoint1.cc (1.13),
+	  tests/Grid/equals1.cc (1.14), tests/Grid/expandspacedim1.cc
+	  (1.13), tests/Grid/foldspacedims1.cc (1.13),
+	  tests/Grid/frombdshape1.cc (1.2),
+	  tests/Grid/fromoctagonalshape1.cc (1.2),
+	  tests/Grid/generalizedaffineimage1.cc (1.15),
+	  tests/Grid/generalizedaffineimage2.cc (1.14),
+	  tests/Grid/generalizedaffineimage3.cc (1.6),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.17),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.17),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.6),
+	  tests/Grid/generator1.cc (1.21), tests/Grid/generators1.cc
+	  (1.14), tests/Grid/generators2.cc (1.4), tests/Grid/grid1.cc
+	  (1.22), tests/Grid/grid2.cc (1.17), tests/Grid/grid3.cc (1.25),
+	  tests/Grid/griddifference1.cc (1.13), tests/Grid/intersection1.cc
+	  (1.13), tests/Grid/isempty1.cc (1.9), tests/Grid/isuniverse1.cc
+	  (1.11), tests/Grid/join1.cc (1.17), tests/Grid/join2.cc (1.12),
+	  tests/Grid/limitedextrapolation1.cc (1.14),
+	  tests/Grid/limitedextrapolation2.cc (1.8),
+	  tests/Grid/limitedextrapolation3.cc (1.7),
+	  tests/Grid/mapspacedims1.cc (1.12), tests/Grid/maxmin1.cc (1.14),
+	  tests/Grid/membytes1.cc (1.11), tests/Grid/mincongruences1.cc
+	  (1.11), tests/Grid/mingenerators1.cc (1.11),
+	  tests/Grid/outputoperator1.cc (1.10),
+	  tests/Grid/outputoperator2.cc (1.4),
+	  tests/Grid/outputoperator3.cc (1.4),
+	  tests/Grid/partiallyreducedproduct1.cc (1.9),
+	  tests/Grid/partiallyreducedproduct2.cc (1.4),
+	  tests/Grid/partiallyreducedproduct3.cc (1.3),
+	  tests/Grid/partition1.cc (1.7), tests/Grid/powersetdifference1.cc
+	  (1.4), tests/Grid/powersetgeometricallycovers1.cc (1.4),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.4),
+	  tests/Grid/relations1.cc (1.16), tests/Grid/relations2.cc (1.18),
+	  tests/Grid/relations3.cc (1.9), tests/Grid/removespacedims1.cc
+	  (1.15), tests/Grid/removespacedims2.cc (1.15),
+	  tests/Grid/timeelapse1.cc (1.12), tests/Grid/topclosed1.cc
+	  (1.13), tests/Grid/topclosure1.cc (1.9), tests/Grid/widening1.cc
+	  (1.17), tests/Grid/widening2.cc (1.12), tests/Grid/widening3.cc
+	  (1.7), tests/Grid/writecongruencesystem.cc (1.9),
+	  tests/MIP_Problem/Makefile.am (1.10),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.5),
+	  tests/MIP_Problem/exceptions1.cc (1.5),
+	  tests/MIP_Problem/mipproblem1.cc (1.12),
+	  tests/MIP_Problem/mipproblem2.cc (1.10),
+	  tests/MIP_Problem/mipproblem3.cc (1.4),
+	  tests/Octagonal_Shape/Makefile.am (1.23),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.4),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.5),
+	  tests/Octagonal_Shape/affineimage1.cc (1.5),
+	  tests/Octagonal_Shape/affineimage2.cc (1.4),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.6),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.4),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.4),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.5),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.4),
+	  tests/Octagonal_Shape/bounded1.cc (1.4),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.11),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.5),
+	  tests/Octagonal_Shape/bounds1.cc (1.5),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.6),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.5),
+	  tests/Octagonal_Shape/chinainit.cc (1.4),
+	  tests/Octagonal_Shape/concatenate1.cc (1.4),
+	  tests/Octagonal_Shape/constraints1.cc (1.5),
+	  tests/Octagonal_Shape/contains1.cc (1.5),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.5),
+	  tests/Octagonal_Shape/discrete1.cc (1.4),
+	  tests/Octagonal_Shape/disjoint1.cc (1.8),
+	  tests/Octagonal_Shape/empty1.cc (1.4),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.6),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.6),
+	  tests/Octagonal_Shape/frombdshape1.cc (1.2),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.4),
+	  tests/Octagonal_Shape/fromgrid1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.5),
+	  tests/Octagonal_Shape/fromspacedim1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.10),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.6),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.10),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.6),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.5),
+	  tests/Octagonal_Shape/intersection1.cc (1.5),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.6),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.6),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.5),
+	  tests/Octagonal_Shape/max_min1.cc (1.6),
+	  tests/Octagonal_Shape/max_min2.cc (1.5),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.5),
+	  tests/Octagonal_Shape/membytes1.cc (1.5),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.5),
+	  tests/Octagonal_Shape/octdifference1.cc (1.5),
+	  tests/Octagonal_Shape/octhull1.cc (1.5),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.5),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.8),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.9),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.5),
+	  tests/Octagonal_Shape/run_tests (1.4),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.6),
+	  tests/Octagonal_Shape/universe1.cc (1.4),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.6),
+	  tests/Polyhedron/Makefile.am (1.116), tests/Polyhedron/README
+	  (1.8), tests/Polyhedron/addcongruence1.cc (1.9),
+	  tests/Polyhedron/addcongruences1.cc (1.13),
+	  tests/Polyhedron/addconstraint1.cc (1.12),
+	  tests/Polyhedron/addconstraints1.cc (1.13),
+	  tests/Polyhedron/addconstraints2.cc (1.12),
+	  tests/Polyhedron/addgenerator1.cc (1.13),
+	  tests/Polyhedron/addgenerator2.cc (1.13),
+	  tests/Polyhedron/addgenerators1.cc (1.14),
+	  tests/Polyhedron/addgenerators2.cc (1.13),
+	  tests/Polyhedron/addspacedims1.cc (1.13),
+	  tests/Polyhedron/addspacedims2.cc (1.13),
+	  tests/Polyhedron/affineimage1.cc (1.13),
+	  tests/Polyhedron/affineimage2.cc (1.12),
+	  tests/Polyhedron/affinepreimage1.cc (1.12),
+	  tests/Polyhedron/affinetrans.cc (1.12),
+	  tests/Polyhedron/append1.cc (1.13), tests/Polyhedron/append2.cc
+	  (1.12), tests/Polyhedron/ascii_dump_load1.cc (1.11),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.11),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.12),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.14),
+	  tests/Polyhedron/bhrz03widening1.cc (1.12),
+	  tests/Polyhedron/bhrz03widening2.cc (1.12),
+	  tests/Polyhedron/bhrz03widening3.cc (1.16),
+	  tests/Polyhedron/bhz03widening1.cc (1.15),
+	  tests/Polyhedron/bounded1.cc (1.12),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.12),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.10),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.11),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.13),
+	  tests/Polyhedron/bounds1.cc (1.12),
+	  tests/Polyhedron/cnncconversion1.cc (1.5),
+	  tests/Polyhedron/concatenate1.cc (1.12),
+	  tests/Polyhedron/congruences1.cc (1.14),
+	  tests/Polyhedron/constrains1.cc (1.2),
+	  tests/Polyhedron/constraints1.cc (1.12),
+	  tests/Polyhedron/contains1.cc (1.11),
+	  tests/Polyhedron/contains2.cc (1.11),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.4),
+	  tests/Polyhedron/disjoint1.cc (1.11),
+	  tests/Polyhedron/disjoint2.cc (1.13),
+	  tests/Polyhedron/dualhypercubes.cc (1.16),
+	  tests/Polyhedron/empty1.cc (1.12), tests/Polyhedron/equals1.cc
+	  (1.11), tests/Polyhedron/exceptions1.cc (1.15),
+	  tests/Polyhedron/exceptions2.cc (1.13),
+	  tests/Polyhedron/exceptions3.cc (1.12),
+	  tests/Polyhedron/expandspacedim1.cc (1.14),
+	  tests/Polyhedron/expandspacedim2.cc (1.14),
+	  tests/Polyhedron/foldspacedims1.cc (1.16),
+	  tests/Polyhedron/foldspacedims2.cc (1.17),
+	  tests/Polyhedron/frombdshape1.cc (1.2),
+	  tests/Polyhedron/frombox1.cc (1.5), tests/Polyhedron/frombox2.cc
+	  (1.5), tests/Polyhedron/fromgrid1.cc (1.2),
+	  tests/Polyhedron/fromoctagonalshape1.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.14),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.14),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.11),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.10),
+	  tests/Polyhedron/generators1.cc (1.12),
+	  tests/Polyhedron/geomcovers1.cc (1.15),
+	  tests/Polyhedron/h79widening1.cc (1.13),
+	  tests/Polyhedron/h79widening2.cc (1.12),
+	  tests/Polyhedron/hybrid.cc (1.5),
+	  tests/Polyhedron/intersection1.cc (1.16),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.11),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.12),
+	  tests/Polyhedron/linearpartition1.cc (1.15),
+	  tests/Polyhedron/linearsystem1.cc (1.10),
+	  tests/Polyhedron/linexpression1.cc (1.11),
+	  tests/Polyhedron/mapspacedims1.cc (1.16),
+	  tests/Polyhedron/matrix1.cc (1.11), tests/Polyhedron/max_min1.cc
+	  (1.13), tests/Polyhedron/maxspacedim1.cc (1.16),
+	  tests/Polyhedron/mc91.cc (1.16), tests/Polyhedron/membytes1.cc
+	  (1.16), tests/Polyhedron/memory1.cc (1.14),
+	  tests/Polyhedron/memory2.cc (1.16),
+	  tests/Polyhedron/minconstraints1.cc (1.11),
+	  tests/Polyhedron/minconstraints2.cc (1.13),
+	  tests/Polyhedron/mingenerators1.cc (1.11),
+	  tests/Polyhedron/mingenerators2.cc (1.12),
+	  tests/Polyhedron/nncminimize1.cc (1.8),
+	  tests/Polyhedron/nncminimize2.cc (1.8),
+	  tests/Polyhedron/numberinput1.cc (1.33),
+	  tests/Polyhedron/onepoint.cc (1.12), tests/Polyhedron/permute.cc
+	  (1.10), tests/Polyhedron/pointsetpowerset1.cc (1.8),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.3),
+	  tests/Polyhedron/polydifference1.cc (1.13),
+	  tests/Polyhedron/polydifference2.cc (1.13),
+	  tests/Polyhedron/polyhull1.cc (1.13),
+	  tests/Polyhedron/polyhull2.cc (1.12),
+	  tests/Polyhedron/powerset1.cc (1.22),
+	  tests/Polyhedron/randphull1.cc (1.14),
+	  tests/Polyhedron/relations1.cc (1.12),
+	  tests/Polyhedron/relations2.cc (1.13),
+	  tests/Polyhedron/relations3.cc (1.12),
+	  tests/Polyhedron/removespacedims1.cc (1.12),
+	  tests/Polyhedron/removespacedims2.cc (1.12),
+	  tests/Polyhedron/smm1.cc (1.11), tests/Polyhedron/timeelapse1.cc
+	  (1.13), tests/Polyhedron/timeelapse2.cc (1.13),
+	  tests/Polyhedron/topclosed1.cc (1.12),
+	  tests/Polyhedron/topclosure1.cc (1.12),
+	  tests/Polyhedron/universe1.cc (1.12),
+	  tests/Polyhedron/universe2.cc (1.12),
+	  tests/Polyhedron/variablesset1.cc (1.12),
+	  tests/Polyhedron/watchdog1.cc (1.11),
+	  tests/Polyhedron/writeconsys1.cc (1.12),
+	  tests/Polyhedron/writegensys1.cc (1.12),
+	  tests/Polyhedron/writepolyhedron1.cc (1.12),
+	  tests/Polyhedron/writepolyhedron2.cc (1.12),
+	  tests/Polyhedron/writerelation1.cc (1.14),
+	  tests/Polyhedron/writevariable1.cc (1.9), utils/Makefile.am
+	  (1.17), utils/build_header.in (1.6), utils/cm_cleaner.sh (1.4),
+	  utils/cm_splitter.sh (1.4), utils/text2cxxarray.in (1.5),
+	  utils/timings.cc (1.13), utils/timings.hh (1.7): Copyright years
+	  extended.
+
+2007-12-29 Saturday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.67): Include <typeinfo> for typeid().
+
+2007-12-29 Saturday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/files.cc (1.11): Include <cstdlib> for exit().	Use extra
+	  parentheses to disambiguate a comparison.
+
+2007-12-29 Saturday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.12),
+	  src/BDS_Status.inlines.hh (1.17), src/BD_Shape.cc (1.8),
+	  src/BD_Shape.inlines.hh (1.154), src/BD_Shape.templates.hh
+	  (1.89), src/Box.cc (1.9), src/Box.templates.hh (1.73),
+	  src/Congruence_System.cc (1.27), src/Constraint_System.cc (1.28),
+	  src/Generator_System.cc (1.25), src/Grid_Certificate.cc (1.10),
+	  src/Grid_nonpublic.cc (1.31), src/Grid_public.cc (1.62),
+	  src/Interval.templates.hh (1.3), src/Linear_System.cc (1.46),
+	  src/MIP_Problem.cc (1.64), src/Octagonal_Shape.cc (1.7),
+	  src/Octagonal_Shape.inlines.hh (1.25),
+	  src/Octagonal_Shape.templates.hh (1.63),
+	  src/Polyhedron_nonpublic.cc (1.81), src/Polyhedron_public.cc
+	  (1.105), src/Polyhedron_widenings.cc (1.64): Use explicit braces
+	  to avoid ambiguous else's.
+
+2007-12-29 Saturday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Row.cc (1.24): Added a pair of extra parentheses to
+	  disambiguate an addition within a shift.
+
+2007-12-29 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.12): Include <cstdlib> for exit().
+
+2007-12-29 Saturday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.72): Implemented template
+
+	  <typename Interval> template <typename Iterator> void
+	  Box<Interval>::CC76_widening_assign(const Box& y,
+			      Iterator first, Iterator last)
+
+	  in terms of the new Interval's widening.
+
+2007-12-29 Saturday 10:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.49), Interval.inlines.hh (1.28),
+	  Interval.templates.hh (1.2): Moved several implemementations from
+	  Interval.defs.hh to Interval.inlines.hh.  Added the new method
+	  template
+
+	  <typename Boundary, typename Info> template <typename From,
+	  typename Iterator> typename Enable_If<Is_Interval<From>::value,
+	  void>::type Interval<Boundary, Info>::CC76_widening_assign(const
+	  From& y,					    Iterator first,
+						  Iterator last).
+
+2007-12-28 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.234): Two new items added.
+
+2007-12-28 Friday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bit_Row.defs.hh (1.8), Bit_Row.inlines.hh (1.5): Added
+	  inline void set_intersection(const Bit_Row& x, const Bit_Row& y,
+	  Bit_Row& z).
+
+2007-12-28 Friday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.11): Include <exception> and <iostream>.
+
+2007-12-28 Friday 08:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.66): Added missing std:: qualification.
+
+2007-12-28 Friday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.44): Must include <cstdlib> for getenv().
+
+2007-12-10 Monday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.299): Version number bumped.
+
+2007-12-10 Monday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.225): Three items improved and merged.
+
+2007-12-10 Monday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.52), Grid.defs.hh (1.62): Comments
+	  improved for consistency (the abbreviation we use for
+	  `bounded-difference shape' is `BDS').
+
+2007-12-05 Wednesday 14:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.33): Corrected code for free() as suggested by Andrea Cimino.
+
+2007-12-05 Wednesday 10:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.224), src/BD_Shape.defs.hh (1.108),
+	  src/BD_Shape.inlines.hh (1.153), src/C_Polyhedron.defs.hh (1.51),
+	  src/C_Polyhedron.inlines.hh (1.38), src/Grid.defs.hh (1.61),
+	  src/Grid.inlines.hh (1.21), src/NNC_Polyhedron.defs.hh (1.53),
+	  src/NNC_Polyhedron.inlines.hh (1.39), src/Octagonal_Shape.defs.hh
+	  (1.36), src/Octagonal_Shape.inlines.hh (1.24),
+	  src/Partially_Reduced_Product.defs.hh (1.18),
+	  src/Partially_Reduced_Product.inlines.hh (1.16),
+	  tests/BD_Shape/Makefile.am (1.69),
+	  tests/BD_Shape/fromoctagonalshape1.cc (1.1),
+	  tests/Grid/Makefile.am (1.58), tests/Grid/directproduct1.cc
+	  (1.47), tests/Grid/frombdshape1.cc (1.1),
+	  tests/Grid/fromoctagonalshape1.cc (1.1),
+	  tests/Octagonal_Shape/Makefile.am (1.22),
+	  tests/Octagonal_Shape/frombdshape1.cc (1.1),
+	  tests/Polyhedron/Makefile.am (1.115),
+	  tests/Polyhedron/frombdshape1.cc (1.1),
+	  tests/Polyhedron/fromoctagonalshape1.cc (1.1): Added methods to
+	  the Polyhedra classes, and the Grid, BD_Shape, Octagonal_Shape
+	  classes that construct an element from a BD_Shape and from an
+	  Octagonal_Shape.  Added also similar methods to the partially
+	  reduced product class Added tests to check these new methods.
+	  Updated the NEWS with this information.
+
+2007-12-04 Tuesday 15:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/fromgrid1.cc (1.2), Octagonal_Shape/fromgrid1.cc
+	  (1.2): Fixed a bug in the tests. The "==" was being used for
+	  different objects.
+
+2007-12-04 Tuesday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.23): Test the finalize() methods by explicitly calling
+	  System.gc().
+
+2007-12-04 Tuesday 09:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.298): Version number bumped.
+
+2007-12-04 Tuesday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/fromgrid1.cc (1.1), Octagonal_Shape/fromgrid1.cc
+	  (1.1): Missing test files added.
+
+2007-12-04 Tuesday 08:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.30), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.22): Reverted finalize() to being protected.
+
+2007-12-03 Monday 22:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.17),
+	  src/Partially_Reduced_Product.inlines.hh (1.15),
+	  tests/Grid/directproduct1.cc (1.46): A partially reduced product
+	  can now be constructed directly from a closed polyhedron, a not
+	  necessarily closed polyhedron, a grid or a box.
+
+2007-12-03 Monday 21:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.11),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.32),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.29), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.21): Added the method free() to delete the C++ class allowing
+	  Java garbage collection to reclaim the wrapper.
+
+2007-12-03 Monday 12:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.223), src/BD_Shape.defs.hh (1.107),
+	  src/BD_Shape.inlines.hh (1.152), src/Octagonal_Shape.defs.hh
+	  (1.35), src/Octagonal_Shape.inlines.hh (1.23),
+	  src/Polyhedron_public.cc (1.104), tests/BD_Shape/Makefile.am
+	  (1.68), tests/Octagonal_Shape/Makefile.am (1.21): Added
+	  constructors fro BD_Shape and Octagonal_Shape fro a Grid.  Added
+	  tests for the new constructors.
+
+	  Undone an unintended change to src/Polyhedron_public.cc in
+	  previous commit (assertion that was added, removed).
+
+2007-12-03 Monday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.222), src/C_Polyhedron.cc (1.23),
+	  src/C_Polyhedron.defs.hh (1.50), src/NNC_Polyhedron.cc (1.23),
+	  src/NNC_Polyhedron.defs.hh (1.52), src/Polyhedron_public.cc
+	  (1.103), tests/Grid/directproduct3.cc (1.15),
+	  tests/Polyhedron/Makefile.am (1.114),
+	  tests/Polyhedron/fromgrid1.cc (1.1): Added constructors for
+	  NNC_Polyhedron and C_Polyhedron from a Grid.	Test file
+	  fromgrid1.cc and its nnc version tests these constructors.
+
+	  The test19 in Grid/directproduct3.cc now checks
+	  is_topologically_closed() for Box x Grid products.
+
+2007-12-03 Monday 11:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.221): Mentioned the bug fixed today.
+
+2007-12-03 Monday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.45): Fixed a bug in method insert()
+	  whereby a wrong result could have been obtained when inserting an
+	  NNC linear row into an empty linear system having a higher space
+	  dimension.  This was the bug shown by test14() in
+	  tests/Polyhedron/congruences1.cc.
+
+2007-12-03 Monday 11:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (1.13): test14 is no longer
+	  expected to fail (bug corrected).
+
+2007-12-03 Monday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/congruences1.cc (1.12): Test14 shows a bug when
+	  converting a congruence system to a constraint system.
+
+2007-11-30 Friday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: sp_clpq.pl (1.19), sp_pl_check.pl
+	  (1.13): Little cosmetic improvements.
+
+2007-11-30 Friday 16:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/: sp_clpq.pl (1.18), sp_pl_check.pl
+	  (1.12): Allow for different versions of SICStus.
+
+2007-11-30 Friday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/: sp_clpq.pl (1.17), sp_pl_check.pl
+	  (1.11): Changes to allow support for SICStus version 4.  FIXME
+	  notes added.
+
+2007-11-29 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (1.7): Include <gprolog.h>
+	  unconditionally.
+
+2007-11-28 Wednesday 16:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.220): Revised reference to Box domain.
+
+2007-11-28 Wednesday 15:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/congruences1.cc (1.1): Tests all the congruence methods
+	  for the Box domain.
+
+2007-11-28 Wednesday 15:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.219), tests/Box/Makefile.am (1.46),
+	  tests/Box/addconstraints1.cc (1.9), tests/Box/cc76widening.cc
+	  (1.6), tests/Grid/directproduct1.cc (1.45),
+	  tests/Grid/directproduct2.cc (1.14), tests/Grid/directproduct3.cc
+	  (1.14), tests/Grid/directproduct4.cc (1.13),
+	  tests/Grid/directproduct5.cc (1.8), tests/Grid/directproduct6.cc
+	  (1.10):
+	  Tests for new methods just committed added to appropriate files
+	  in tests/Box.
+
+	  Tests for directproduct now have the Box domain for one of the
+	  product's components as an optional directive although the
+	  products are currently set with directives for testing
+	  NNC_Polyhedron with the Grid.
+
+2007-11-28 Wednesday 15:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Box.cc (1.8), Box.defs.hh (1.33), Box.inlines.hh (1.22),
+	  Box.templates.hh (1.71): Enabled the product of a Box and a Grid.
+	   To do this, for compatibility with the other classes, the
+	  following methods have been added:	Box(Congruence_System cgs)
+
+	     add_constraint_and_minimize(Constraint c)
+	     add_constraints_and_minimize(Constraint_System cs)
+	     add_recycled_constraints(Constraint_System cs)
+	     add_recycled_constraints_and_minimize(Constraint_System& cs)
+
+	     add_congruence(Congruence cg)
+	     add_congruence_and_minimize(Congruence_System cgs)
+	     add_congruences(Congruence_System cgs)
+	     add_congruences_and_minimize(Congruence_System cgs)
+	     add_recycled_congruences(Congruence_System cgs)
+	     add_recycled_congruences_and_minimize(Congruence_System& cgs)
+
+	     widening_assign
+
+	     congruences()
+	     minimized_congruences()
+
+	     can_recycle_constraint_systems()
+	     can_recycle_congruence_systems()
+
+	     throw_dimension_incompatible(char* method, Congruence cg)
+	     throw_dimension_incompatible(char* method, Congruence_System
+	  cgs)
+
+	  Also private methods added:
+
+	     extract_interval_congruence(Congruence cg, ...)
+	     add_congruence_no_check(Congruence cg)
+	     add_congruences_no_check(Congruence_System cgs)
+
+2007-11-28 Wednesday 06:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.297), interfaces/Prolog/GNU/gprolog_cfli.hh
+	  (1.6): No two distributions install gprolog.h in the same place:
+	  the only reliable way for the users of the GNU Prolog interface
+	  is to define CPPFLAGS.
+
+2007-11-27 Tuesday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: BD_Shape.templates.hh (1.88), Octagonal_Shape.templates.hh
+	  (1.62): Missing "const" added.
+
+2007-11-27 Tuesday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/constraints1.cc (1.9): test06 succeeds.
+
+2007-11-27 Tuesday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.32), Box.templates.hh (1.70):
+	  Box<Interval>::add_constraint_no_check() assumes (and assumed)
+	  that the box was not marked empty: assertion added.  This
+	  invariant was ensured by Box<Interval>::add_constraint() but not
+	  by Box<Interval>::add_constraints_no_check(const
+	  Constraint_System&): the latter has been fixed accordingly.
+
+2007-11-27 Tuesday 10:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/constraints1.cc (1.8): test05 succeeds.
+
+2007-11-27 Tuesday 10:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.69): Spurious comment removed.
+
+2007-11-27 Tuesday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.68), tests/Box/constraints1.cc (1.7):
+	  Last change undone and a change in the commit before this also
+	  undone.
+
+2007-11-27 Tuesday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.67): Check for emptiness moved from
+	  add_constraints_no_check() to add_constraint_no_check().  Also do
+	  the empty check by just checking marked_empty() instead of
+	  is_empty().
+
+2007-11-27 Tuesday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.66): Duplicate code avoided in
+	  Box<Interval>::add_constraint_no_check().
+
+2007-11-27 Tuesday 09:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.65), tests/Box/constraints1.cc (1.6):
+	  Added corrections for bugs in identified by previous commit.
+
+2007-11-27 Tuesday 08:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/constraints1.cc (1.5): test05 and test06 show bugs in
+	  add_constraint_no_check() and add_constraints_no_check().
+
+2007-11-26 Monday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.296), interfaces/Prolog/GNU/gprolog_cfli.hh
+	  (1.5): Find gprolog.h also under Ubuntu 7.10.
+
+2007-11-23 Friday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct3.cc (1.13): Test07 fails only when the
+	  assertions are enabled with 8 bit integers.
+
+2007-11-22 Thursday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.295): Version number bumped.
+
+2007-11-22 Thursday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct3.cc (1.12): Test07 is set to fail for 8
+	  bit integers when one of the domain components is C_Polyhedron.
+
+2007-11-21 Wednesday 11:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct1.cc (1.44): Test is now reset to test
+	  product Grid x NNC_Polyhedron
+
+2007-11-21 Wednesday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.218), src/Octagonal_Shape.defs.hh (1.34),
+	  src/Octagonal_Shape.inlines.hh (1.22),
+	  tests/Grid/directproduct1.cc (1.43): Octagonal domain now has a
+	  constructor from a box.
+
+2007-11-21 Wednesday 11:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.217), src/Octagonal_Shape.defs.hh (1.33),
+	  src/Octagonal_Shape.inlines.hh (1.21),
+	  src/Octagonal_Shape.templates.hh (1.61),
+	  tests/Grid/directproduct1.cc (1.42), tests/Grid/directproduct2.cc
+	  (1.13), tests/Grid/directproduct3.cc (1.11),
+	  tests/Grid/directproduct4.cc (1.12), tests/Grid/directproduct5.cc
+	  (1.7), tests/Grid/directproduct6.cc (1.9): The
+	  Partially_Reduced_Product now works for products with
+	  Octagonal_Shape domain elements.
+
+	  Tests now have an option to test with a product of
+	  Octagonal_Shape and Grid, but all tests are currently set to test
+	  C_ or NNC_Polyhedron x Grid (or vice versa) combinations.
+
+2007-11-21 Wednesday 08:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.defs.hh (1.48), Direct_Product.inlines.hh
+	  (1.46), Direct_Product.templates.hh (1.24),
+	  Direct_Product.types.hh (1.7), Makefile.am (1.175): The old
+	  implentation for Direct_Product removed as this is replaced by an
+	  instance of the Partially_Reduced_Product class.
+
+2007-11-20 Tuesday 22:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.31), src/Box.templates.hh (1.64),
+	  tests/Box/Makefile.am (1.45), tests/Box/fromdirectproduct1.cc
+	  (1.6), tests/Box/frompartiallyreducedproduct1.cc (1.1): Changed
+	  the construction of a box from a direct product class to the
+	  construction of a box from a partially reduced product class.
+
+	  Test file updated and renamed to test this change.
+
+2007-11-20 Tuesday 15:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.106), src/BD_Shape.inlines.hh (1.151),
+	  tests/BD_Shape/Makefile.am (1.67), tests/BD_Shape/boundingbox1.cc
+	  (1.1), tests/Grid/directproduct1.cc (1.41): Added method for
+	  constructing a BD_Shape from a box.
+
+	  Test file for building from a box added for the BD_Shape.
+
+	  Test for building a product from a box is now enabled when a
+	  component of the product is a BD_Shape.
+
+2007-11-20 Tuesday 13:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.105), src/BD_Shape.inlines.hh (1.150),
+	  tests/Grid/directproduct3.cc (1.10): Added widening_assign()
+	  using the H79_widening_assign() as the default widening. Test for
+	  widening_assign uncommented for products using the BD_Shape
+	  class.
+
+2007-11-20 Tuesday 08:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/partiallyreducedproduct2.cc (1.3): Tests 08 and 18
+	  fail for 8-bit integers.
+
+2007-11-19 Monday 18:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.inlines.hh (1.149), tests/Grid/directproduct1.cc
+	  (1.40), tests/Grid/directproduct2.cc (1.12),
+	  tests/Grid/directproduct3.cc (1.9), tests/Grid/directproduct4.cc
+	  (1.11), tests/Grid/directproduct5.cc (1.6),
+	  tests/Grid/directproduct6.cc (1.8): Corrected code for
+	  BD_Shape<T>::add_congruences_and_minimize(const
+	  Congruence_System& cgs)
+
+	  All the tests for directproduct?.cc have an option to run using
+	  the BD_Shape x Grid domain, apart from a few tests that are
+	  commented out due to missing methods in the BD_Shape class.
+
+	  Note that these tests are currently set to run using
+	  NNC_Polyhedron x Grid or Grid x.NNC_Polyhedron.
+
+2007-11-19 Monday 14:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.104), src/BD_Shape.inlines.hh (1.148),
+	  src/BD_Shape.templates.hh (1.87), src/Polyhedron.inlines.hh
+	  (1.144), src/Polyhedron_public.cc (1.102),
+	  tests/Grid/directproduct1.cc (1.39): Added methods for adding
+	  congruences and for obtaining the set of equality congruences
+	  from a BD_Shape.
+
+	  Methods in Polyhedron_public.cc for adding congruences moved to
+	  Polyhedron.inlines.hh.
+
+2007-11-19 Monday 11:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.16),
+	  src/Partially_Reduced_Product.templates.hh (1.7),
+	  tests/Grid/directproduct5.cc (1.5),
+	  tests/Grid/partiallyreducedproduct3.cc (1.2): Added
+	  relation_with(Congruences) to the Partially_Reduced_Product
+	  class.
+
+2007-11-19 Monday 10:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.216): Added item
+
+	  o  The method relations_with(Congruence) has been added to the
+	  Polyhedron	class for compatibility with the Grid class
+	  methods.
+
+2007-11-19 Monday 09:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.328), src/Polyhedron_public.cc (1.101),
+	  tests/Polyhedron/relations2.cc (1.12): Added method
+	  relation_with(Congruence) to Polyhedron class.
+
+2007-11-19 Monday 08:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.100): A couple of small improvements
+	  to the implementation of constrains():   - avoid counting lines
+	  if the generator system is not minimized (no matter	  if it has
+	  pending generators or not);	- prefer efficient methods
+	  g.is_line_or_ray() and g.is_line()	 with respect to g.type()
+	  when checking for lines and rays.
+
+2007-11-18 Sunday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.10),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.31),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.28), tests/ppl_interface_generator_java_test_java.m4 (1.10),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.20):
+	  Added Java interface for constraints().
+
+	  In Java/tests/ppl_interface_generator_java_test_java.m4, just a
+	  spelling correction.
+
+2007-11-17 Saturday 22:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.215), src/Grid.defs.hh (1.60), src/Grid.inlines.hh
+	  (1.20), src/Partially_Reduced_Product.defs.hh (1.15),
+	  src/Partially_Reduced_Product.inlines.hh (1.14),
+	  src/Partially_Reduced_Product.templates.hh (1.6),
+	  src/Polyhedron.defs.hh (1.327), src/Polyhedron.inlines.hh
+	  (1.143), src/Polyhedron_public.cc (1.99),
+	  tests/Grid/directproduct1.cc (1.38), tests/Grid/directproduct4.cc
+	  (1.10), tests/Grid/directproduct5.cc (1.4),
+	  tests/Grid/partiallyreducedproduct1.cc (1.8),
+	  tests/Polyhedron/addcongruences1.cc (1.12): Added methods
+	  add_congruences_and_minimize(Congruence_System),
+	  add_recycled_congruences(Congruence_System), and
+	  add_recycled_congruences_and_minimize(Congruence_System) to
+	  Polyhedron class.  Added static methods
+	  can_recycle_constraint_systems() and
+	  can_recycle_congruence_systems() to Polyhedron and Grid classes.
+	  Added methods add_congruences_and_minimize(Congruence_System),
+	  add_recycled_congruences(Congruence_System), and
+	  add_recycled_congruences_and_minimize(Congruence_System) to the
+	  Partially_Reduced_Product class.
+
+	  Some simple tests added to check these.
+
+2007-11-17 Saturday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.214), src/Polyhedron.defs.hh (1.326),
+	  src/Polyhedron_public.cc (1.98), tests/Polyhedron/Makefile.am
+	  (1.113), tests/Polyhedron/constrains1.cc (1.1),
+	  tests/Polyhedron/constraints1.cc (1.11): New method bool
+	  Polyhedron::constrains(Variable var) const returns `true' if and
+	  only if `var' is constrained in `*this'.
+
+2007-11-17 Saturday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/relations3.cc (1.11): New test.
+
+2007-11-17 Saturday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (1.14): Friend declaration
+	  fixed and uncommented.
+
+2007-11-16 Friday 14:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.13): A couple of FIXME's
+	  added.
+
+2007-11-16 Friday 14:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.59), src/Partially_Reduced_Product.defs.hh
+	  (1.12), src/Partially_Reduced_Product.inlines.hh (1.13),
+	  tests/Grid/directproduct1.cc (1.37), tests/Grid/directproduct3.cc
+	  (1.8), tests/Grid/partiallyreducedproduct3.cc (1.1): Test file
+	  added for partially reduced products (which should have been
+	  added before).
+
+	  Many doxygen comments in the defs file improved and corrected.
+	  The setting/clearing of the reduced flag also revised for some
+	  methods.
+
+2007-11-16 Friday 12:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.11),
+	  src/Partially_Reduced_Product.inlines.hh (1.12),
+	  tests/Grid/directproduct4.cc (1.9): Added an implementation of
+	  add_congruences_and_minimize().
+
+	  Removed some redundant code in
+	  src/Partially_Reduced_Product.defs.hh.
+
+2007-11-16 Friday 11:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct4.cc (1.8): Tests for
+	  generalized_affine_(pre)image() methods that were commented out
+	  now have now been revised to test the defined methods and
+	  un-commented.
+
+2007-11-16 Friday 10:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.58), src/Grid.inlines.hh (1.19),
+	  src/Partially_Reduced_Product.defs.hh (1.10),
+	  src/Partially_Reduced_Product.inlines.hh (1.11),
+	  tests/Grid/directproduct1.cc (1.36), tests/Grid/directproduct2.cc
+	  (1.11): Methods in the Grid domain that build a grid from
+	  generators, add generators to a grid and get the generators
+	  defining a grid are no longer supported.  (Note: this change only
+	  affects methods wrt "generators" and _not_ wrt
+	  "grid_generators".)
+
+	  In the Partially_Reduced_Product domain all methods that build a
+	  product from generators or grid generators, add generators or
+	  grid generators to a product and get the generators or grid
+	  generators defining a product are no longer supported.
+
+	  Changes to the tests reflect this change.
+
+2007-11-15 Thursday 14:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.9),
+	  src/Partially_Reduced_Product.inlines.hh (1.10),
+	  src/Partially_Reduced_Product.templates.hh (1.5),
+	  tests/Grid/partiallyreducedproduct1.cc (1.7): Corrected the
+	  set_reduced_flag() to clear_reduced_flag() when building a new
+	  product from constraints or congruences.
+
+	  Made 2 additional tests for OK() that checks products after using
+	  these constructors.
+
+	  The code implementing OK() now forces reduced() to reduce the
+	  copy of *this by setting its "reduced" flag to false.  The code
+	  for OK() now moved to *.templates.hh
+
+	  Some formatting improvements mainly in *.inlines.hh.
+
+2007-11-15 Thursday 10:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.templates.hh (1.4),
+	  tests/Grid/Makefile.am (1.57): More tests added for smash and
+	  constraints product..  Formatting improvements to
+	  /Partially_Reduced_Product.templates.hh.
+
+2007-11-13 Tuesday 10:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.9),
+	  tests/Grid/partiallyreducedproduct1.cc (1.6),
+	  tests/Grid/partiallyreducedproduct2.cc (1.2): Many corrections to
+	  the product domain implementation mainly wrt when reduction must
+	  be done and setting the reduced Boolean.  Tests added and
+	  improved. Some useless tests removed.
+
+2007-11-12 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.43): Useless @SET_MAKE@ removed.
+
+2007-11-12 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.294): New versions of GCC on Darwin no longer
+	  support -Wno-long-double: we no longer use this option on that
+	  platform (people using older versions will simply get lots of
+	  warnings they can ignore).
+
+2007-11-09 Friday 11:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct3.cc (1.7): Test18 fails for 8-bit
+	  coefficients.
+
+2007-11-07 Wednesday 14:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: directproduct1.cc (1.35), directproduct3.cc (1.6):
+	  Tests corrected.
+
+2007-11-07 Wednesday 09:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: directproduct1.cc (1.34), directproduct3.cc (1.5):
+	  Temporarily disabled test14 and test19 in directproduct1 and
+	  directproduct3, respectively, which are known to fail.
+
+2007-11-05 Monday 21:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.142),
+	  tests/Polyhedron/congruences1.cc (1.11): The method congruences()
+	  for the Polyhedron classes must return all equalities including
+	  the implied equalities.
+
+2007-11-05 Monday 17:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.56), partiallyreducedproduct1.cc
+	  (1.5), partiallyreducedproduct2.cc (1.1):
+	  partiallyreducedproduct1.cc no longer tests the direct product
+	  domain.  More tests for the Smash_Product and Constraints_Product
+	  domains added in partiallyreducedproduct2.cc
+
+2007-11-05 Monday 15:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: directproduct1.cc (1.33), directproduct2.cc (1.10),
+	  directproduct3.cc (1.4), directproduct4.cc (1.7),
+	  directproduct5.cc (1.3): Revised the directproduct tests so as
+	  not to build or enlarge a product using the generators or grid
+	  generators.
+
+2007-11-05 Monday 14:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.8),
+	  src/Partially_Reduced_Product.inlines.hh (1.8),
+	  src/Polyhedron.defs.hh (1.325), src/Polyhedron_public.cc (1.97),
+	  tests/Grid/directproduct4.cc (1.6): Undone the change to
+	  generalized_affine_image in previous commit so these methods are,
+	  again, unsupported by the  Partially_Reduced_Product domains.
+
+2007-11-05 Monday 12:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct1.cc (1.32): Revised test so as not to
+	  use the generators or grid_generators constructors
+
+2007-11-05 Monday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.7),
+	  src/Partially_Reduced_Product.inlines.hh (1.7),
+	  src/Polyhedron.defs.hh (1.324), src/Polyhedron_public.cc (1.96),
+	  tests/Grid/directproduct4.cc (1.5): Revised the methods
+	  generalized_affine_image() so as to allow for a modulus as the
+	  fourth argument.  Note that for the Polyhedron domains the
+	  modulus is ignored and the transformation is treated as if it was
+	  0 (equality).  Enabled the tests in directproduct4.cc that test
+	  this.
+
+2007-11-05 Monday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.defs.hh (1.49), src/C_Polyhedron.inlines.hh
+	  (1.37), src/NNC_Polyhedron.defs.hh (1.51),
+	  src/NNC_Polyhedron.inlines.hh (1.38),
+	  src/Partially_Reduced_Product.defs.hh (1.6),
+	  src/Partially_Reduced_Product.inlines.hh (1.6),
+	  tests/Grid/partiallyreducedproduct1.cc (1.4): Removed
+	  C_Polyhedron::C_Polyhedron(const Grid_Generator_System&),
+	  NNC_Polyhedron::NNC_Polyhedron(const Grid_Generator_System&) and
+	  similar constructors.
+
+2007-11-05 Monday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.5), tests/print.hh
+	  (1.43), tests/Grid/Makefile.am (1.55),
+	  tests/Grid/directproduct1.cc (1.31), tests/Grid/directproduct2.cc
+	  (1.9), tests/Grid/directproduct3.cc (1.3),
+	  tests/Grid/directproduct4.cc (1.4), tests/Grid/directproduct5.cc
+	  (1.2), tests/Grid/directproduct6.cc (1.7),
+	  tests/Grid/directproduct7.cc (1.5): Completely revised the test
+	  files directproduct?.cc
+
+	  In tests/print.hh, added to the print options for the tests:
+
+	  print_constraints(const
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>&
+	  pd, print_congruences(const
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>&
+	  pd,
+
+	  Corrected the implementation of strictly_contains() for
+	  Partially_Reduced_Product domains.
+
+2007-11-03 Saturday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.4),
+	  src/globals.defs.hh (1.51), tests/Grid/Makefile.am (1.54),
+	  tests/Grid/asciidumpload7.cc (1.4),
+	  tests/Grid/partiallyreducedproduct1.cc (1.3): Added code for
+	  ascii_dump() for Partially_Reduced_Product class.
+
+2007-11-02 Friday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.13): FIXME resolved.
+
+2007-11-02 Friday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (1.3): Comments
+	  revised so as to adhere to our standards.
+
+2007-11-02 Friday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (1.2): Simplified the
+	  logic of Smash_Reduction<D1, D2>::product_reduce() so as to
+	  remove all explicit returns.
+
+2007-11-02 Friday 16:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.5),
+	  Partially_Reduced_Product.inlines.hh (1.3): Revised comments for
+	  the product domain.  Removed a useless return.
+
+2007-11-02 Friday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.2): Do not name
+	  unused parameters (this avoids the compiler warnings).  Avoid
+	  useless returns.
+
+2007-11-02 Friday 16:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.4): Added comments for
+	  the new reduction classes and their methods.	Corrected another
+	  comment.
+
+2007-11-02 Friday 14:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.3),
+	  tests/Grid/partiallyreducedproduct1.cc (1.2): Removed redundant
+	  typedef declarations and revised the tests to use the more
+	  generic types for products.
+
+2007-11-02 Friday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.2),
+	  Partially_Reduced_Product.types.hh (1.2): Temporarily added the
+	  Domain_Product class: it will be removed when template typedefs
+	  will be supported by C++.
+
+2007-11-02 Friday 11:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Makefile.am (1.174), src/Partially_Reduced_Product.defs.hh
+	  (1.1), src/Partially_Reduced_Product.inlines.hh (1.1),
+	  src/Partially_Reduced_Product.templates.hh (1.1),
+	  src/Partially_Reduced_Product.types.hh (1.1),
+	  tests/Grid/Makefile.am (1.53),
+	  tests/Grid/partiallyreducedproduct1.cc (1.1): First revision for
+	  implementing Partially_Reduced_Product classes that is intended
+	  to replace the Direct_Product and Open_Product classes.
+
+2007-11-01 Thursday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.30): Avoid abusing logical operators.
+
+2007-10-29 Monday 11:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.15): Test corrected so as to
+	  take into proper account 32bit architectures.
+
+2007-10-27 Saturday 14:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/h79widening1.cc (1.12): Simplified the logic
+	  underlying test01.
+
+2007-10-27 Saturday 13:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/affinepreimage1.cc (1.15): Removed TODO comment and
+	  uncommented gr.add_congruence((3*A - 6*B %= 3) / 9);
+
+2007-10-27 Saturday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.15): Modified to compute
+	  (and print in noisy mode) information on the cardinality of the
+	  intermediate results, as well as checking the cardinalities of
+	  the final results to match those reported in the FAC 2005 paper.
+
+2007-10-27 Saturday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (1.5): Tests extended and
+	  FIXMEs resolved.
+
+2007-10-27 Saturday 07:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage1.cc (1.14): Avoid abusing logical
+	  operators.
+
+2007-10-27 Saturday 06:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/membytes1.cc (1.10): TODO dealt with.
+
+2007-10-27 Saturday 06:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.14): One FIXME resolved,
+	  another one added.
+
+2007-10-26 Friday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: .cvsignore (1.6), writegensys1.cc (1.11),
+	  writepolyhedron1.cc (1.11), writepolyhedron2.cc (1.11): Several
+	  FIXMEs resolved.
+
+2007-10-26 Friday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearpartition1.cc (1.14): FIXME resolved: now
+	  test04() checks all the results.
+
+2007-10-26 Friday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.14): Variable renamed.
+
+2007-10-26 Friday 12:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.inlines.hh (1.45),
+	  Direct_Product.templates.hh (1.23): Non-inline code moved from
+	  Direct_Product.inlines.hh to Direct_Product.templates.hh
+
+2007-10-25 Thursday 22:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.21),
+	  src/Pointset_Powerset.templates.hh (1.16),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.2): Added
+	  affine_dimension() to the Pointset_Powerset.
+
+2007-10-25 Thursday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.13): Define also
+	  SWI_PROLOG_LD_OPTIONS.
+
+2007-10-24 Wednesday 15:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.20),
+	  src/Pointset_Powerset.templates.hh (1.15),
+	  tests/Polyhedron/Makefile.am (1.112),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.1): Added
+	  generalized_*image() and bounded_*image() to the Pointset
+	  Powerset domain.
+
+	  Added tests for these and for the affine_image() and
+	  affine_preimage() methods.
+
+2007-10-22 Monday 21:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.44),
+	  tests/Grid/directproduct6.cc (1.6): Revised code for
+	  relation_with(Constraint).  Added one extra test for this.
+
+2007-10-22 Monday 14:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.43),
+	  tests/Grid/directproduct1.cc (1.30), tests/Grid/directproduct2.cc
+	  (1.8), tests/Grid/directproduct3.cc (1.2),
+	  tests/Grid/directproduct4.cc (1.3), tests/Grid/directproduct6.cc
+	  (1.5), tests/Grid/directproduct7.cc (1.4): Bug fixed for
+	  congruences() and minimized_congruences().  Tests changed so as
+	  to test the Direct_Product class rather than the Open_Product
+	  class.
+
+2007-10-22 Monday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.205), src/Direct_Product.defs.hh (1.47),
+	  src/Direct_Product.inlines.hh (1.42): Documentation revised for
+	  grids, bibliographic cross-reference corrected and some missing
+	  code for the direct product domain added.
+
+2007-10-22 Monday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.46), src/Direct_Product.inlines.hh
+	  (1.41), tests/Grid/directproduct6.cc (1.4): Revised the returned
+	  result for relation_with(Constraint).
+
+2007-10-22 Monday 09:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.45), src/Direct_Product.inlines.hh
+	  (1.40), tests/Grid/directproduct6.cc (1.3): Added the
+	  relation_with(Constraint) and relation_with(Generator) method for
+	  the direct product.
+
+2007-10-20 Saturday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.76): Use the `-pl' option of
+	  `plld' to make sure the right Prolog interpreter is used.
+
+2007-10-20 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.12): Set and substitute the
+	  `SWI_PROLOG' variables: it contains the complete path of the
+	  SWI-Prolog interpreter.
+
+2007-10-20 Saturday 18:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.57), src/Grid_nonpublic.cc (1.29),
+	  src/Grid_public.cc (1.61), tests/Grid/relations1.cc (1.15),
+	  tests/Grid/relations2.cc (1.17), tests/Grid/relations3.cc (1.8):
+	  Revised the grid relation_with() methods for congruences and
+	  constraints so that saturates() is included in the result
+	  whenever the congruence or constraint is an equality and every
+	  point of the grid satisfies the equality.
+
+	  Added grid relation_with() methods for a generator so that a
+	  point or closure point has the same relation with the grid as the
+	  corresponding grid point, and a ray or line has the same relation
+	  with the grid as a grid line.
+
+	  Expected results revised and new tests for the grid
+	  relation_with() methods for a generator added to relations1.cc.
+
+2007-10-19 Friday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.293): Version number bumped.
+
+2007-10-19 Friday 15:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.60): In code for building a grid from a
+	  polyhedron, bug that was causing an assertion to fail corrected.
+
+2007-10-19 Friday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.36),
+	  ppl_java/Lenght_Error_Exception.java (1.4),
+	  ppl_java/Length_Error_Exception.java (1.1), ppl_java/Makefile.am
+	  (1.34): Spelling of file name corrected.
+
+2007-10-19 Friday 08:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.24): test19 expected to fail with an
+	  overflow exception with checked_int8 configuration.
+
+2007-10-18 Thursday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.292): For a change, test with
+	  Octagonal_Shape<double> instead of BD_Shape<int8_t>.
+
+2007-10-18 Thursday 11:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.44), src/Direct_Product.inlines.hh
+	  (1.39), tests/Grid/directproduct7.cc (1.3): Added maximize/5 and
+	  minimize/5 for the direct product.  Comments improved.  Tests
+	  added for these methods.
+
+2007-10-18 Thursday 08:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.59): TEMP_INTEGER taken outside loops.
+
+2007-10-18 Thursday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.16):
+	  Additional change made so as to deal with change to maximize/5
+	  and minimize/5 for the grid domain.
+
+2007-10-18 Thursday 08:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.58), tests/Grid/grid3.cc (1.23): Bug shown
+	  in previous commit now corrected.
+
+2007-10-18 Thursday 07:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.22): test18 shows a bug in the code added
+	  for building a grid using the generators of a polyhedron.
+
+2007-10-17 Wednesday 22:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.57): Code for constructing a grid from a
+	  polyhedron improved.
+
+2007-10-17 Wednesday 21:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.15):
+	  Changed the OCaml interface so as to match the change to
+	  maximize/5 and minimize/5 for the grid domain.
+
+2007-10-17 Wednesday 18:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.18),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.30),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.27),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.19),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.49),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.51), src/Grid.defs.hh (1.56), src/Grid.inlines.hh (1.18),
+	  src/Grid_nonpublic.cc (1.28), tests/Grid/maxmin1.cc (1.13):
+	  Changed the methods maximize/5 and minimize/5 for the Grid class
+	  so that a Generator point, the maximum point of the grid, is the
+	  5th argument.
+
+2007-10-17 Wednesday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.55), src/Grid_public.cc (1.56),
+	  tests/Grid/grid3.cc (1.21): Added a constructor for a grid from a
+	  polyhedron.
+
+2007-10-17 Wednesday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.323): Grid befriended to allow for the
+	  efficient implementation of a Grid constructor from a Polyhedron.
+
+2007-10-16 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.25): FIXME resolved.
+
+2007-10-16 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.types.hh (1.8): Template parameters renamed.
+
+2007-10-16 Tuesday 17:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.43), src/Direct_Product.inlines.hh
+	  (1.38), tests/Grid/directproduct7.cc (1.2): Added
+	  bounded_affine_image() and bounded_affine_preimage() for the
+	  direct product domain with some simple tests in
+	  directproduct7.cc.
+
+	  Improved a few comments in Direct_Product.defs.hh.
+
+2007-10-16 Tuesday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.42), src/Direct_Product.inlines.hh
+	  (1.37), tests/Grid/Makefile.am (1.52),
+	  tests/Grid/directproduct7.cc (1.1): Revised several comments in
+	  Direct_Product.defs.hh.  Added bounds_from_above/1,
+	  bounds_from_below/1, maximize/4 and minimize/4 for direct product
+	  domain.  Added tests for these in directproduct7.cc.
+
+2007-10-16 Tuesday 12:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (1.36): Useless copies avoided.
+
+2007-10-16 Tuesday 12:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.35): Implementation of
+	  constraints(), minimized_constraints(), congruences() and
+	  minimized_congruences() improved.
+
+2007-10-16 Tuesday 10:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.41), src/Direct_Product.inlines.hh
+	  (1.34), tests/Grid/directproduct4.cc (1.2): Added affime_*image
+	  and versions of generalized_..._*image that are supported by both
+	  the grids and polyhedra classes.  Tests for these have been
+	  enabled.
+
+2007-10-16 Tuesday 09:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.33),
+	  tests/Grid/directproduct6.cc (1.2): Improved code in previous
+	  commit for add_constraints() and constraints() and similar
+	  methods with the recycle and minimize options. Similarly for
+	  congruences.	Testing of these improved.
+
+2007-10-15 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.16): Added the `Box_Pointset' derived
+	  class.  Provide the constructors from boxes, bounded-difference
+	  and octagonal shapes.
+
+2007-10-15 Monday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Ask_Tell.defs.hh (1.18): Add class Ask_Tell to the C++
+	  interface documentation.
+
+2007-10-15 Monday 19:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.40): Add class Direct_Product to
+	  the C++ interface documentation.  Use properly the math
+	  environment delimiters in docs. Fix indentation.
+
+2007-10-15 Monday 19:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.15): Add class Any_Pointset to the
+	  C++ interface documentation.	Do properly group documented
+	  methods.
+
+2007-10-15 Monday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.51), directproduct1.cc (1.29),
+	  directproduct2.cc (1.7), directproduct3.cc (1.1),
+	  directproduct4.cc (1.1), directproduct5.cc (1.1),
+	  directproduct6.cc (1.1): directproduct1.c split into 4 files
+	  directproduct2.cc now named directproduct5.cc directproduct6.cc
+	  is some additional tests..
+
+2007-10-15 Monday 15:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.defs.hh (1.39), Direct_Product.inlines.hh
+	  (1.32): Added a short description of a direct product.
+
+	  Modified the code for constraints(), congruences() so as to
+	  return all the constraints or congruences in the components.
+	  Similarly for minimized_constraints() and the recycled versions.
+
+2007-10-15 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Term.defs.hh (polynomials.3): `Checked_Exponent_Type_Policy'
+	  now sets `has_nan' to false.
+
+2007-10-15 Monday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (1.18): Added tests for == and != for
+	  congruences when they have not been normalised or strongly
+	  normalised.
+
+2007-10-15 Monday 12:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (1.25): Removed operator==(const
+	  Congruence_System& x, const Congruence_System& y);
+
+2007-10-15 Monday 09:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Term.cc (polynomials.3): Reimplemented method
+	  Term::shift_space_dimensions(const Variables_Set&) so as to use a
+	  single loop instead of two.
+
+2007-10-15 Monday 09:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polynomial_Space.templates.hh (polynomials.3): Prefer
+	  const_iterator to iterator when accessing a Variables_Set.  When
+	  creating a Variables_Set, prefer adding a variable index instead
+	  of a proper Variable, if it is known that the index is less than
+	  the maximum allowed space dimension.
+
+2007-10-15 Monday 09:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polynomial.cc (polynomials.3): Fixed a typo in a comment.
+
+2007-10-14 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Monomial.cc, Monomial.defs.hh, Monomial.inlines.hh,
+	  Polynomial.cc, Polynomial.defs.hh, Polynomial.inlines.hh,
+	  Polynomial_Cone.defs.hh, Polynomial_Constraint.defs.hh,
+	  Polynomial_Space.cc, Polynomial_Space.defs.hh,
+	  Polynomial_Space.templates.hh, Term.cc, Term.defs.hh,
+	  Term.inlines.hh (polynomials.[2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Non-standard qualifications removed.	Spurious semicolons
+	  removed.  Variable shadowing avoided.
+
+2007-10-14 Sunday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh (1.7): Non-standard qualification
+	  removed.
+
+2007-10-14 Sunday 10:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, configure.ac, src/Makefile.am, src/Monomial.cc,
+	  src/Monomial.defs.hh, src/Monomial.inlines.hh,
+	  src/Monomial.types.hh, src/Polynomial.cc, src/Polynomial.defs.hh,
+	  src/Polynomial.inlines.hh, src/Polynomial.types.hh,
+	  src/Polynomial_Cone.cc, src/Polynomial_Cone.defs.hh,
+	  src/Polynomial_Cone.inlines.hh, src/Polynomial_Cone.types.hh,
+	  src/Polynomial_Constraint.cc, src/Polynomial_Constraint.defs.hh,
+	  src/Polynomial_Constraint.inlines.hh,
+	  src/Polynomial_Constraint.types.hh,
+	  src/Polynomial_Constraint_System.cc,
+	  src/Polynomial_Constraint_System.defs.hh,
+	  src/Polynomial_Constraint_System.inlines.hh,
+	  src/Polynomial_Constraint_System.types.hh,
+	  src/Polynomial_Space.cc, src/Polynomial_Space.defs.hh,
+	  src/Polynomial_Space.inlines.hh,
+	  src/Polynomial_Space.templates.hh, src/Polynomial_Space.types.hh,
+	  src/Term.cc, src/Term.defs.hh, src/Term.inlines.hh,
+	  src/Term.types.hh, src/globals.types.hh, tests/Makefile.am
+	  (polynomials.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Initial implementation of polynomial spaces (joint work with
+	  Enric Rodríguez Carbonell and Enea Zaffanella).
+
+2007-10-13 Saturday 19:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.cc (1.7), Pointset_Ask_Tell.defs.hh
+	  (1.13), Pointset_Ask_Tell.templates.hh (1.11): A few FIXMEs have
+	  been resolved by adding a private typedef.
+
+2007-10-13 Saturday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.cc (1.6), Pointset_Ask_Tell.templates.hh
+	  (1.10): Compilation errors fixed, with FIXMEs added.
+
+2007-10-13 Saturday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.38): Non-standard qualification
+	  removed.
+
+2007-10-13 Saturday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.103), Bit_Row.defs.hh (1.7),
+	  Box.defs.hh (1.30), Congruence.defs.hh (1.22),
+	  Congruence_System.defs.hh (1.24), Constraint.defs.hh (1.127),
+	  Constraint_System.defs.hh (1.39), Generator_System.defs.hh
+	  (1.26), Grid.defs.hh (1.54), Grid_Generator_System.defs.hh
+	  (1.28), Linear_Expression.defs.hh (1.37), OR_Matrix.defs.hh
+	  (1.12), Octagonal_Shape.defs.hh (1.32), Poly_Con_Relation.defs.hh
+	  (1.35), Poly_Gen_Relation.defs.hh (1.33), Polyhedron.defs.hh
+	  (1.322), Ptr_Iterator.defs.hh (1.11): Non-standard qualifications
+	  removed.
+
+2007-10-13 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh (1.6): Avoid naming an unused
+	  parameter.
+
+2007-10-13 Saturday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.55), src/Pointset_Ask_Tell.cc (1.5),
+	  src/Pointset_Ask_Tell.defs.hh (1.12),
+	  src/Pointset_Ask_Tell.inlines.hh (1.6), src/Pointset_Powerset.cc
+	  (1.15), src/Pointset_Powerset.defs.hh (1.19),
+	  src/Pointset_Powerset.inlines.hh (1.9),
+	  src/checked_float.inlines.hh (1.82),
+	  tests/Polyhedron/powerset1.cc (1.21): Due to compiler bugs, there
+	  is no way to compile the PPL with GCC versions up to and
+	  including 3.4.6: old kludges removed.
+
+2007-10-13 Saturday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.48): Work around a bug in version 10.0 of
+	  the Intel C/C++ compiler.
+
+2007-10-13 Saturday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.9): Compiler warning avoided.
+
+2007-10-11 Thursday 08:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.32): In the constructor of grids from
+	  boxes, avoid meaningless implicit conversions in the calls to
+	  constructors for Grid_Generator_System.  Don't use function
+	  `used' to suppress a compiler warning when it is enough to avoid
+	  naming an unused parameter.
+
+2007-10-10 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.inlines.hh (1.9): Coefficient_zero() and
+	  Coefficient_one() temporarily restored to the old definition.
+
+2007-10-10 Wednesday 14:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.213): Added that a bug has been fixed for the grid
+	  domain.
+
+2007-10-10 Wednesday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.53), Polyhedron.defs.hh (1.321): Comments
+	  for constraints() and minimized_constraints() in Grid.defs.hh
+	  improved; similar improvements for congruences in
+	  Polyhedron.defs.hh.
+
+2007-10-09 Tuesday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.9), TODO (1.233), Watchdog/INSTALL (1.6): The `make
+	  uninstall' command is now mentioned in the INSTALL file.
+
+2007-10-09 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.23): Example simplified.
+
+2007-10-09 Tuesday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.291): Provide the Intel C/C++ compiler with
+	  adequate warning flags.
+
+2007-10-09 Tuesday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.290): The Intel C/C++ equivalent of GCC's
+	  -frounding-math should be -fp-model strict -fp-speculation off.
+
+2007-10-09 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.289): Detect the Intel C/C++ compiler.
+
+2007-10-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.212), interfaces/C/ppl_c.h.in (1.73): In the C interface
+	  it is no longer an error to call ppl_initialize() or
+	  ppl_finalize() multiple times (this matches the behavior of the
+	  other interfaces).
+
+2007-10-09 Tuesday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (1.12): Teach
+	  emacs that this is a C++ file.  Disable automatic initialization.
+	  Use the new Parma_Polyhedra_Library::initialize() and
+	  Parma_Polyhedra_Library::finalize() instead of something ad hoc.
+
+2007-10-09 Tuesday 15:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.13): Do not rely on automatic initialization of the PPL.
+
+2007-10-09 Tuesday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.11): No longer rely on
+	  automatic initialization.
+
+2007-10-09 Tuesday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.211), src/initializer.hh (1.15): Users of the C++
+	  interface of the library can now decide to disable the automatic
+	  initialization mechanism of the PPL.	To do so, the preprocessor
+	  symbol PPL_NO_AUTOMATIC_INITIALIZATION should be defined before
+	  including the `ppl.hh' header file.  When automatic
+	  initialization is disabled it is imperative to explicitly call
+	  the new function
+
+	      void Parma_Polyhedra_Library::initialize()
+
+	  before using the library.  The new function
+
+	      void Parma_Polyhedra_Library::finalize() and
+
+	  should also be called (to release a small amount of memory) when
+	  done with the library.
+
+2007-10-08 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.147), Box.inlines.hh (1.21),
+	  Octagonal_Shape.inlines.hh (1.20): Use DIRTY_TEMP instead of
+	  static variables.
+
+2007-10-08 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.12): Use DIRTY_TEMP0 for temporaries.
+
+2007-10-08 Monday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Coefficient.cc (1.8), Coefficient.defs.hh (1.10),
+	  Coefficient.inlines.hh (1.8), Congruence.cc (1.18),
+	  Congruence.defs.hh (1.21), Congruence.inlines.hh (1.18),
+	  Congruence_System.cc (1.26), Congruence_System.defs.hh (1.23),
+	  Congruence_System.inlines.hh (1.10), Constraint.cc (1.69),
+	  Constraint.defs.hh (1.126), Constraint.inlines.hh (1.68),
+	  Constraint_System.cc (1.27), Constraint_System.defs.hh (1.38),
+	  Constraint_System.inlines.hh (1.11), Generator.cc (1.76),
+	  Generator.defs.hh (1.124), Generator.inlines.hh (1.62),
+	  Generator_System.cc (1.24), Generator_System.defs.hh (1.25),
+	  Generator_System.inlines.hh (1.10), Grid_Generator.cc (1.22),
+	  Grid_Generator.defs.hh (1.32), Grid_Generator.inlines.hh (1.15),
+	  Grid_Generator_System.cc (1.20), Grid_Generator_System.defs.hh
+	  (1.27), Grid_Generator_System.inlines.hh (1.16), Init.cc (1.32),
+	  Linear_Expression.cc (1.19), Linear_Expression.defs.hh (1.36),
+	  Linear_Expression.inlines.hh (1.12): First go at getting rid of
+	  all non-POD static variables.
+
+2007-10-08 Monday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.inlines.hh (1.3): Allow the use of DIRTY_TEMP and
+	  DIRTY_TEMP0 also outside the Parma_Polyhedra_Library namespace.
+
+2007-10-08 Monday 14:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/congruences1.cc (1.10): Added some tests for
+	  congruences() and minimized_congruences().  test06 shows that
+	  implied equalities (eg A + B >= 3, A + B <= 3) are ignored (at
+	  the moment) for congruences().
+
+2007-10-08 Monday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.84): Use DIRTY_TEMP0 instead of a static
+	  variable.
+
+2007-10-08 Monday 14:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.26): When building a
+	  Constraint_System from a Congruence_System, do properly set the
+	  topology and the space dimension; adding the positivity
+	  constraint is not needed.
+
+2007-10-08 Monday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.cc (1.68): When building a constraint from a
+	  congruence, do not require a non-zero space dimension; also,
+	  avoid building a NOT_NECESSARILY_CLOSED constraint.
+
+2007-10-08 Monday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.17), Congruence.inlines.hh (1.17): An
+	  assertion made stronger and a new one added.
+
+2007-10-08 Monday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.52): Simplified the
+	  handling of error messages and ppl finalization, removing a few
+	  dead code and useless cuts.
+
+2007-10-08 Monday 11:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Constraint_System.cc (1.25), Grid.inlines.hh (1.17): Undone
+	  change to Grid.inlines.hh in last commit and made a corresponding
+	  change to the Constraint_System() code.
+
+2007-10-08 Monday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (1.16): Fixed the bug shown in test03 and
+	  test10 in constraints1.cc
+
+2007-10-08 Monday 11:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.50), constraints1.cc (1.1):
+	  constraints1.cc has tests for constraints() and
+	  minimized_constraints().  test03 and tests10 show a bug - cause
+	  an assertion to fail - when getting the constraints from an empty
+	  grid with 0 space dimensions.
+
+2007-10-08 Monday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.51): Removed a spurious
+	  occurrence of ppl_finalize/0 in time_out/1, which was causing a
+	  bug.
+
+2007-10-07 Sunday 18:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.38): Added an explanation of how to use the
+	  test-coverage facilities provided by GCC.
+
+2007-10-07 Sunday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: pl_clpq.cc (1.13), ppl_pl.cc (1.13): With
+	  versions of SWI-Prolog after 5.6.43, ask SWI-Prolog not to fiddle
+	  with GMP allocation functions.
+
+2007-10-07 Sunday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.11): No longer use global variables of kind mpz_class, since
+	  that does not allow to precisely control construction and
+	  destruction time.  This triggers a bug in pl_check.pl: apparently
+	  it tries to use the PPL interface after having called
+	  ppl_finalize/0 without an intervening invocation of
+	  ppl_initialize/0.
+
+2007-10-07 Sunday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (1.4): Comment improved.
+
+2007-10-07 Sunday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: jni/ppl_java_common.hh (1.30),
+	  ppl_java/MIP_Problem.java (1.7), ppl_java/PPL_Object.java (1.5):
+	  Comments and formatting improved.
+
+2007-10-07 Sunday 09:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.232): Item dealt with and removed.
+
+2007-10-06 Saturday 22:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.231): Removed item - Revise the documentation for all the
+	  congruences() and   minimized_congruences() methods.
+
+2007-10-06 Saturday 22:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.defs.hh (1.37), Grid.defs.hh (1.52),
+	  Polyhedron.defs.hh (1.320): Revised comments for some
+	  congruences() and minimized_congruences() methods and also
+	  similarly for some constraints() and minimized_constraints()
+	  methods.  A couple of other typos fixed in comments in
+	  Grid.defs.hh
+
+2007-10-06 Saturday 21:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.22), TODO (1.230): Mentioned that the
+	  mechanisms to specify additional compilation flags may be used to
+	  request extra optimizations.	Corresponding to-do item removed.
+
+2007-10-06 Saturday 15:03  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.81): Replaced volatile with
+	  avoid_cse.
+
+2007-10-06 Saturday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.21): Revised the example with the Intel C/C++
+	  compiler.  Other minor improvements.
+
+2007-10-06 Saturday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (1.7): Unwanted change undone.
+
+2007-10-06 Saturday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ciao_cfli.hh (1.4), GNU/gprolog_cfli.hh
+	  (1.4), SICStus/sicstus_cfli.ic (1.18), SWI/swi_cfli.hh (1.6),
+	  XSB/xsb_cfli.hh (1.4), YAP/yap_cfli.hh (1.4): Comments improved.
+
+2007-10-05 Friday 18:43  Abramo Bagnara
+
+	* src/Interval_Restriction.defs.hh (1.10): Avoid naming unused
+	  parameter.
+
+2007-10-05 Friday 18:35  Abramo Bagnara
+
+	* src/Grid_simplify.cc (1.36): Fixed gcdext_assign call.
+
+2007-10-05 Friday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.29): Work around bug of the Intel compiler.
+
+2007-10-05 Friday 14:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval_Restriction.defs.hh (1.9), checked_int.inlines.hh
+	  (1.64), checked_mpz.inlines.hh (1.50): Avoid naming unused
+	  parameters.  Avoid long source lines.
+
+2007-10-05 Friday 12:24  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.95), Checked_Number.inlines.hh
+	  (1.77), GMP_Integer.defs.hh (1.27), GMP_Integer.inlines.hh
+	  (1.22), checked.defs.hh (1.43), checked.inlines.hh (1.40),
+	  checked_ext.defs.hh (1.14), checked_ext.inlines.hh (1.40),
+	  checked_mpz.inlines.hh (1.49): Fixed prototype for gcdext.
+
+2007-10-04 Thursday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.229): Reorganized: some things will definitely not be
+	  ready for PPL 0.10.
+
+2007-10-04 Thursday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.288): Version number bumped.
+
+2007-10-04 Thursday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (1.7): Comment fixed.
+
+2007-10-03 Wednesday 19:16  Andrea Cimino
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.9),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.29), jni/ppl_java_globals.cc (1.8), ppl_java/MIP_Problem.java
+	  (1.6), ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.26), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.18): Implemented `total_memory_in_bytes' for the PPL objects.
+	  At the moment the method returns only the memory used by the C++
+	  objects.
+
+2007-10-02 Tuesday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.9): test01 always fails with
+	  8-bit coefficients, provided the timeout is long enough.
+
+2007-10-02 Tuesday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.8): Timeout increased to 2
+	  seconds.
+
+2007-10-01 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.22): Option `--licence' fixed: the PPL is
+	  now released under GPL version 3.
+
+2007-09-30 Sunday 23:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.7): Timeout increased to 1
+	  second.
+
+2007-09-30 Sunday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.210), configure.ac (1.287),
+	  interfaces/Prolog/Ciao/Makefile.am (1.66),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.51),
+	  interfaces/Prolog/GNU/Makefile.am (1.66),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.44),
+	  interfaces/Prolog/SICStus/Makefile.am (1.78),
+	  interfaces/Prolog/SWI/Makefile.am (1.75),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.10), interfaces/Prolog/XSB/Makefile.am (1.55),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.9),
+	  interfaces/Prolog/YAP/Makefile.am (1.55): Fixed bugs that
+	  prevented building the library on systems not supported by the
+	  Parma Watchdog Library or when the `--disable-watchdog' configure
+	  was used.  There is still a pending issue concerning the XSB
+	  Prolog interface.
+
+2007-09-29 Saturday 19:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.6): test01 does not fail
+	  unless assertions are enabled.
+
+2007-09-29 Saturday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.3):  The value of the `License' tag is now
+	  `GPLv3+'.
+	  `ppl-swiprolog' dependency on `readline-devel' removed (again).
+
+2007-09-29 Saturday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (simplex.1): file ppl.spec was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-09-27 Thursday 08:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.43): List file
+	  do_not_output_location in MOSTLYCLEANFILES.
+
+2007-09-26 Wednesday 21:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.42), expected_mpz (1.14),
+	  expected_mpz_a (1.13): Do not output the optimum location for
+	  tests adlittle, boeing1, boeing2 and rout, since these may vary
+	  (without affecting the optimum value itself) depending on the
+	  computing platform. Expected results for mpz (with and without
+	  assertions) updated accordingly.
+
+2007-09-26 Wednesday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.10): There is no need to include "pwl.hh" here.
+
+2007-09-26 Wednesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.10): Support for
+	  systems where the Parma Watchdog Library is not available: on
+	  these systems, both ppl_set_timeout/1 and ppl_reset_timeout/0
+	  fail.
+
+2007-09-26 Wednesday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.286): The preprocessor symbol
+	  WATCHDOG_LIBRARY_ENABLED is defined if and only if the Parma
+	  Watchdog Library is enabled.
+
+2007-09-26 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.77): Initial support for
+	  systems where the Parma Watchdog Library is not available.
+
+2007-09-26 Wednesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.11): Cater for systems with no clocks.
+
+2007-09-26 Wednesday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.285): Added checks for the `timeval' type and for
+	  the `getrusage' function.
+
+2007-09-26 Wednesday 13:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.75): If the problem is
+	  optimizable, then the output of the problem state is subsumed by
+	  the output of the optimum value; hence, do output the problem
+	  state only if verbosity == 1.
+
+2007-09-26 Wednesday 13:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.74): A couple of minor corrections
+	  in the usage string.	Option --version replaced by option
+	  --verbosity=LEVEL, taking as argument an integer between 0 and 4
+	  (default 3). The verbosity level is systematically checked before
+	  producing output (except for error messages).
+
+2007-09-26 Wednesday 13:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.41): Cleanup should not depend on
+	  configuration.
+
+2007-09-25 Tuesday 19:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/: Makefile.am (1.9), bug1.cc (1.2), bug2.cc
+	  (1.2), mipproblem2.cc (1.5): Tests bug1.cc and bug2.cc were not
+	  showing real bugs.  Test test01 in miproblem2.cc may also fail
+	  with 8bit integer coefficient and assertions disabled.
+
+2007-09-24 Monday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.54): The special expected_*
+	  files for XSB has been removed, so they are no longer
+	  distributed. Also cut away the corresponding FIXME comment.
+
+2007-09-23 Sunday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int16 (1.4),
+	  XSB/expected_clpq2_int16_a (1.4), XSB/expected_clpq2_int32 (1.4),
+	  XSB/expected_clpq2_int32_a (1.6), XSB/expected_clpq2_int64 (1.4),
+	  XSB/expected_clpq2_int64_a (1.4), XSB/expected_clpq2_int8 (1.5),
+	  XSB/expected_clpq2_int8_a (1.6), XSB/expected_clpq2_mpz (1.4),
+	  XSB/expected_clpq2_mpz_a (1.4), XSB/expected_clpq_int16 (1.6),
+	  XSB/expected_clpq_int16_a (1.6), XSB/expected_clpq_int32 (1.4),
+	  XSB/expected_clpq_int32_a (1.4), XSB/expected_clpq_int64 (1.4),
+	  XSB/expected_clpq_int64_a (1.4), XSB/expected_clpq_int8 (1.4),
+	  XSB/expected_clpq_int8_a (1.4), XSB/expected_clpq_mpz (1.4),
+	  XSB/expected_clpq_mpz_a (1.4), XSB/expected_pchk_int16 (1.5),
+	  XSB/expected_pchk_int16_a (1.5), XSB/expected_pchk_int32 (1.5),
+	  XSB/expected_pchk_int32_a (1.5), XSB/expected_pchk_int64 (1.2),
+	  XSB/expected_pchk_int64_a (1.4), XSB/expected_pchk_int8 (1.5),
+	  XSB/expected_pchk_int8_a (1.6), XSB/expected_pchk_mpz (1.2),
+	  XSB/expected_pchk_mpz_a (1.2), tests/clpq2.pl (1.12): Applied the
+	  workaround suggested by Paul Broome to the XSB bug described in
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2007-September/011126.html.
+	  The special expect-files for XSB are no longer needed.
+
+2007-09-23 Sunday 14:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (1.6): The typedef defined in
+	  this file are now added to the documentation group related to
+	  version checking. (As a side effect, by no longer using \file, we
+	  also avoid a couple of dangling references in the produced docs.)
+
+2007-09-22 Saturday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.53): Apparently, XSB now
+	  implements more of the ISO standard.	This could make the
+	  XSB-specific expect-file useless: they are now still present but
+	  disabled.
+
+2007-09-22 Saturday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.4): Use DO_TEST_F8A to invoke
+	  test01().
+
+2007-09-20 Thursday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.3): Expected results for
+	  test10() fixed.
+
+2007-09-20 Thursday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.2): Wrap big integer
+	  constants within Coefficient("...").
+
+2007-09-20 Thursday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/Makefile.am (1.10): File ex11.mps has
+	  gone.
+
+2007-09-19 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.40),
+	  demos/ppl_lpsol/examples/ex11.mps (1.4),
+	  tests/MIP_Problem/Makefile.am (1.8),
+	  tests/MIP_Problem/mipproblem1.cc (1.11),
+	  tests/MIP_Problem/mipproblem3.cc (1.1): Test program
+	  mipproblem3.cc forked off mipproblem1.cc.  Example MIP problem
+	  ex11.mps removed and used to write test10() of mipproblem3.cc.
+
+2007-09-19 Wednesday 10:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.50): XSB does not throw
+	  catchable exceptions for integers out of range; so call to
+	  exception_sys_prolog is not made when testing XSB.
+
+2007-09-18 Tuesday 15:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (1.9): Exploit assign_or_swap in the
+	  implementation of grow.  Avoid useless copies/swaps (via grow) in
+	  the implementation of resize_no_copy.
+
+2007-09-18 Tuesday 15:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.11): Corrected detailed documentation
+	  for resize_no_copy: it was promising to preserve the old contents
+	  of the matrix.
+
+2007-09-18 Tuesday 15:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.86), Octagonal_Shape.templates.hh
+	  (1.60): Exploit assign_or_swap in the implementation of
+	  remove_space_dimensions and map_space_dimensions.
+
+2007-09-18 Tuesday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (1.7): Added a couple of FIXME's for
+	  places where (sometimes) we could replace expensive copies with
+	  cheaper swaps.
+
+2007-09-18 Tuesday 09:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.59): Removed a few useless
+	  initializations.  Prefer neg_assign(x, y) to x = -y; prefer
+	  neg_assign(x) to beg_assign(x, x).  Move allocation of
+	  temporaries out of loop bodies; reduce the number of temporaries
+	  when the change does not affect code readability.
+
+2007-09-18 Tuesday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.85): Added a comment in a few places
+	  where we use a temporary named `coeff_i' to actually store the
+	  negation of coeff_i (so as to avoid an allocation).
+
+2007-09-17 Monday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.84): For readability, prefer
+	  neg_assign(x) to neg_assign(x, x).
+
+2007-09-17 Monday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (1.7): Typo corrected.
+
+2007-09-16 Sunday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/: Makefile.am (1.6), bug1.cc (1.1), bug2.cc
+	  (1.1): Two programs exhibiting strange behavior on some systems.
+
+2007-09-16 Sunday 18:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: randphull1.cc (1.13), smm1.cc (1.10): Minor
+	  stylistic changes.
+
+2007-09-15 Saturday 19:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/:
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.28), Java/jni/ppl_java_common.cc (1.35),
+	  Java/jni/ppl_java_common.hh (1.29), Java/jni/ppl_java_globals.cc
+	  (1.7), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.14),
+	  OCaml/ppl_ocaml_globals.cc (1.11),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.48),
+	  Prolog/ppl_prolog_common.icc (1.9): Prefer TEMP_INTEGER to
+	  Coefficient when allocating temporary coefficients.
+
+2007-09-15 Saturday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.12): Made clean up independent from
+	  configuration.
+
+2007-09-15 Saturday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.15): Definition of temporary
+	  coefficients moved out of loop.
+
+2007-09-15 Saturday 16:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.63): Indentation fixed.  Definition of
+	  temporaries factored out of loop.
+
+2007-09-15 Saturday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.83): Temporary definition factored
+	  out of a loop body.
+
+2007-09-15 Saturday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.82): Try to improve the management
+	  of temporary coefficients:   - prefer neg_assign(x, x) to x = -x;
+	  - avoid useless temporaries;   - factor out common temporary
+	  definitions; in particular, speculatively	move temporary
+	  definitions out of loop bodies.
+
+2007-09-15 Saturday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.17), Octagonal_Shape.templates.hh
+	  (1.58): Added a couple of missing spaces.
+
+2007-09-15 Saturday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.62): Added a missing space.
+
+2007-09-15 Saturday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (1.33): noinst_JAVA has to
+	  be defined only when building the Java interface.
+
+2007-09-15 Saturday 13:38  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.61): FIXME dealt with. A feasible point is
+	  returned correctly if the status of the problem is
+	  `UNBOUNDED_MIP_PROBLEM'. When the status `UNBOUNDED_MIP_PROBLEM'
+	  is detected in `solve_mip', a feasible point is set.
+
+2007-09-15 Saturday 13:19  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.60): Comment fixed.
+
+2007-09-14 Friday 22:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.111): Test randphull2 is no
+	  longer built.
+
+2007-09-14 Friday 22:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Ask_Tell/Makefile.am (1.4), Grid/Makefile.am (1.49),
+	  MIP_Problem/Makefile.am (1.5): Removed old style handling of
+	  tests that are known to fail on some configurations.
+
+2007-09-14 Friday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.54): FIXME resolved.
+
+2007-09-14 Friday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.110), randphull1.cc (1.12),
+	  randphull2.cc (1.11), smm1.cc (1.9): Tests randphull[12] and smm1
+	  now conforms to the STANDARDS for test programs; randphull2
+	  merged into randphull1; the old machinery in Makefile.am for
+	  tests failing with bounded coefficients is no longer needed.
+
+2007-09-14 Friday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.65), GNU/Makefile.am
+	  (1.65), SICStus/Makefile.am (1.76), SWI/Makefile.am (1.74),
+	  XSB/Makefile.am (1.52), YAP/Makefile.am (1.54): Cleanup made
+	  independent from the configuration chosen by the user.
+
+2007-09-14 Friday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/Makefile.am (1.16): Build source file
+	  ppl_predicate_check.pl is only required when the user asks for
+	  some Prolog interface.
+
+2007-09-14 Friday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.42): Built source file
+	  ppl_prolog.icc is only required when the user asks for some
+	  Prolog interface.
+
+2007-09-14 Friday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: Java/Makefile.am (1.13), Java/ppl_java/Makefile.am
+	  (1.32), Java/tests/Makefile.am (1.16), OCaml/Makefile.am (1.33):
+	  Distribution and cleanup made independent from the configuration
+	  chosen by the user.
+
+2007-09-14 Friday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.36): Cleanup should be independent
+	  from the configuration chosen by the user.
+
+2007-09-14 Friday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.44), bug1.cc (1.2), bug2.cc (1.2): The
+	  bug exhibited by bug1.cc and bug2.cc has been fixed.
+
+2007-09-14 Friday 10:10  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.80): Fixed float rounding on
+	  inexact conversion.
+
+2007-09-14 Friday 09:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.43): Restore refine[12].cc.
+
+2007-09-14 Friday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.10): Wrap big integer
+	  constants within Coefficient("...").
+
+2007-09-14 Friday 08:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.9): test18 fails with all
+	  bounded integer coefficient types; test19 fails if less than 64
+	  bit coefficients are used.
+
+2007-09-13 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.42): Temporarily disable also
+	  refine2.cc.
+
+2007-09-13 Thursday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.8): Added test18() and
+	  test19().
+
+2007-09-13 Thursday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.7): Always test the return
+	  value of MIP_Problem::solve().  Added test17().
+
+2007-09-13 Thursday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.6): Added test15() and
+	  test16().
+
+2007-09-13 Thursday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.47), Interval.templates.hh (1.1),
+	  Makefile.am (1.173): Interval.templates.hh should contain the
+	  non-inline template functions of the Interval class
+	  implementation.
+
+2007-09-13 Thursday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.41): Do not test with bug*.cc.
+
+2007-09-13 Thursday 19:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.209), debian/libppl-pwl.copyright.in (1.5),
+	  debian/libppl.copyright.in (1.5), doc/definitions.dox (1.204),
+	  doc/devref-c-interface.tex (1.2), doc/devref.tex (1.23),
+	  doc/gpl.dox (1.8), doc/gpl.tex (1.4), doc/gpl.txt (1.4),
+	  doc/user-c-interface.tex (1.2), doc/user-prolog-interface.tex
+	  (1.2), doc/user.tex (1.24), m4/ac_cxx_proper_long_double.m4
+	  (1.2): The Parma Polyhedra Library is now released under the
+	  terms of the version 3 (or later) of the GNU General Public
+	  License.
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: NEWS (1.10), doc/devref.tex (1.3), doc/gpl.dox (1.2),
+	  doc/gpl.tex (1.2), doc/gpl.txt (1.2), doc/user.tex (1.3): The
+	  Parma Watchdog Library is now released under the terms of the
+	  version 3 (or later) of the GNU General Public License.
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.dox (simplex.1): file gpl.dox was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.tex (simplex.1): file gpl.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.txt (simplex.1): file gpl.txt was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.59): Comment fixed.
+
+2007-09-13 Thursday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/.cvsignore (1.1): Put under CVS control.
+
+2007-09-13 Thursday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:27 +0000
+
+2007-09-13 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.40): Temporarily disable the tests that
+	  are known to fail.
+
+2007-09-13 Thursday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.13), src/MIP_Problem.cc (1.58):
+	  FIXME resolved.  This also makes the PPL independent from the bug
+	  of mpq_get_d() in GMP 4.1.4.
+
+2007-09-13 Thursday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_chdims.cc (1.20): Definition of unused macro removed.
+
+2007-09-13 Thursday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_chdims.cc (1.19), Grid_conversion.cc (1.22),
+	  Grid_simplify.cc (1.35): Pointless inline directives removed.
+
+2007-09-13 Thursday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.51), Grid_nonpublic.cc (1.27): The second
+	  argument of Grid::max_min() was erroneously `char *': it is
+	  `const char*' now.
+
+2007-09-13 Thursday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.57): Simplified the implementation of the
+	  steepest-edge heuristics.
+
+2007-09-13 Thursday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.228): The handling of temporary coefficients has been
+	  redone and the C and Prolog cover all the supported domains.
+
+2007-09-12 Wednesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.39), bug2.cc (1.1): A simplified
+	  version of bug1.cc.
+
+2007-09-12 Wednesday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.38), bug1.cc (1.1): Test program
+	  exhibiting a bug somewhere.
+
+2007-09-12 Wednesday 09:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.284), Watchdog/configure.ac (1.42): Do not allow
+	  AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+
+2007-09-12 Wednesday 00:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.81), MIP_Problem.cc (1.56),
+	  Octagonal_Shape.templates.hh (1.57): Several temporary
+	  Coefficient variables are now allocated via TEMP_INTEGER.
+
+2007-09-11 Tuesday 23:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc (1.31): Typo fixed.
+
+2007-09-11 Tuesday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.80), Box.inlines.hh (1.20),
+	  Box.templates.hh (1.63), Interval_Restriction.defs.hh (1.8),
+	  MIP_Problem.cc (1.55), Octagonal_Shape.templates.hh (1.56),
+	  Polyhedron_nonpublic.cc (1.80), Polyhedron_public.cc (1.95),
+	  checked.inlines.hh (1.39), checked_int.inlines.hh (1.63),
+	  checked_mpz.inlines.hh (1.48), globals.cc (1.30),
+	  globals.inlines.hh (1.19): For temporaries of type mpz_class or
+	  mpq_class, use DIRTY_TEMP0 instead of local variables.
+
+2007-09-11 Tuesday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.79), Octagonal_Shape.templates.hh
+	  (1.55): Useless initializations removed.  For temporaries, use
+	  DIRTY_TEMP instead of local variables.  Code formatting fixes.
+
+2007-09-11 Tuesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.inlines.hh (1.19),
+	  Octagonal_Shape.templates.hh (1.54): For temporaries, use
+	  DIRTY_TEMP instead of local variables.
+
+2007-09-11 Tuesday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_Generator_System.defs.hh (1.26),
+	  Grid_Generator_System.inlines.hh (1.15): Method
+	  is_equal_to(Grid_Generator_System) replaced by is_equal_to(const
+	  Grid_Generator_System&).
+
+2007-09-11 Tuesday 19:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.14), BD_Shape.defs.hh (1.102),
+	  Box.defs.hh (1.28), Checked_Number.defs.hh (1.94),
+	  Congruence_System.defs.hh (1.22), DB_Matrix.defs.hh (1.29),
+	  Direct_Product.defs.hh (1.36), Grid.defs.hh (1.50),
+	  Grid_Generator_System.defs.hh (1.25), MIP_Problem.defs.hh (1.36),
+	  OR_Matrix.defs.hh (1.10), Octagonal_Shape.defs.hh (1.31),
+	  Polyhedron.defs.hh (1.319): Useless const qualifications removed.
+
+2007-09-11 Tuesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.30), Octagonal_Shape.inlines.hh
+	  (1.18): Method add_octagonal_constraint(dimension_type,
+	  dimension_type j, N) replaced by
+	  add_octagonal_constraint(dimension_type, dimension_type j, const
+	  N&).
+
+2007-09-11 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.101), BD_Shape.inlines.hh (1.146):
+	  Method add_dbm_constraint(dimension_type, dimension_type, N)
+	  replaced by add_dbm_constraint(dimension_type, dimension_type,
+	  const N&).
+
+2007-09-11 Tuesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.145), BD_Shape.templates.hh (1.78):
+	  For temporaries, use DIRTY_TEMP instead of local variables.
+
+2007-09-11 Tuesday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.50): Comment revised and turned into a
+	  Doxygen comment.
+
+2007-09-11 Tuesday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Temp.defs.hh (1.7), Temp.inlines.hh (1.2),
+	  Temp.templates.hh (1.2): Comments added.
+
+2007-09-11 Tuesday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.172): New files added to INCLUDE_FILES.
+
+2007-09-11 Tuesday 13:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.cc (1.29), globals.defs.hh (1.49): Switch to the
+	  new technology for the handling of temporaries.
+
+2007-09-11 Tuesday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Temp.defs.hh (1.6), Temp.inlines.hh (1.1),
+	  Temp.templates.hh (1.1): Started the reorganization of the Temp_*
+	  classes.
+
+2007-09-11 Tuesday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.93): Include Slow_Copy.hh.
+
+2007-09-11 Tuesday 11:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh (1.43), checked_mpz.inlines.hh
+	  (1.47): Leave the definition of Slow_Copy for the basic types to
+	  Slow_Copy.hh.
+
+2007-09-11 Tuesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.46), Interval_Restriction.defs.hh
+	  (1.7): Include the new files.
+
+2007-09-11 Tuesday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assign_or_swap.hh (1.1): The assign_or_swap() utility
+	  functions.
+
+2007-09-11 Tuesday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Has_Assign_Or_Swap.hh (1.2): Spurious code removed.
+
+2007-09-11 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Has_Assign_Or_Swap.hh (1.1): Has_Assign_Or_Swap classes
+	  declarations.
+
+2007-09-11 Tuesday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Slow_Copy.hh (1.2): Multiple-inclusion guards renamed.
+
+2007-09-11 Tuesday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Slow_Copy.hh (1.1): Basic Slow_Copy classes declarations.
+
+2007-09-10 Monday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.73): Use va_start() and va_end()
+	  properly around calls to vfprintf().
+
+2007-09-10 Monday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.283): With GCC, use -frounding-math to disable
+	  transformations and optimizations that assume default floating
+	  point rounding behavior.
+
+2007-09-10 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.41): Added a comment about the
+	  positioning of  AC_PROG_CC and AC_PROG_CXX.
+
+2007-09-10 Monday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.282): Useless quotes removed.
+
+2007-09-10 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.281), Watchdog/configure.ac (1.40): Pass the
+	  no-define option to AM_INIT_AUTOMAKE.
+
+2007-09-10 Monday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.7), config.guess (1.39), config.sub (1.37), depcomp
+	  (1.12), install-sh (1.18), Watchdog/compile (1.7),
+	  Watchdog/config.guess (1.23), Watchdog/config.sub (1.22):
+	  Updated.
+
+2007-09-10 Monday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.280), Watchdog/configure.ac (1.39): Corrections
+	  to the handling of compilation flags.
+
+2007-09-06 Thursday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a (1.12): Updated to reflect changes
+	  in the ordering of the input (caused by upgrade of glpk).
+
+2007-09-06 Thursday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.12): Updated: sometimes the
+	  location of the optimum changes (the optimum staying teh same)
+	  due to the upgrade of glpk, which is used by ppl_lpsol to read in
+	  the lp problems and sometimes reorders the input wrt previous
+	  versions.
+
+2007-09-02 Sunday 17:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.35): Header files ppl_c.h and
+	  ppl_c_version.h should be installed, but they should not be
+	  distributed (since they are generated on-demand): list them in
+	  variable nodist_include_HEADERS, instead of include_HEADERS.
+
+2007-09-01 Saturday 16:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence_System.defs.hh (1.21),
+	  Grid_Generator_System.defs.hh (1.24), Matrix.defs.hh (1.83): In
+	  the Doxygen documentation, don't use \atop and \choose, which
+	  cause problems. Use \genfrac instead.
+
+2007-09-01 Saturday 13:06  Andrea Cimino
+
+	* configure.ac (1.279): The Java interface was unconditionally
+	  built even if not requested by the user with the
+	  `--enable-interface' option: fixed.
+
+2007-09-01 Saturday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.73): When compiling
+	  pl_clpq*, fixed paths for finding pl_clpq*.pl.  (temporary patch;
+	  provide the right path option to the compilation command).
+
+2007-08-31 Friday 16:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.160): Using new doxygen
+	  alias \extref for references to the main manual.
+
+2007-08-31 Friday 16:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-prolog-interface.doxyconf-html.in (1.4),
+	  devref-prolog-interface.doxyconf-latex.in (1.4),
+	  user-prolog-interface.doxyconf-html.in (1.5),
+	  user-prolog-interface.doxyconf-latex.in (1.5): Added command
+	  alias \extref.
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-html.in (simplex.1): file
+	  devref-prolog-interface.doxyconf-html.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-latex.in (simplex.1): file
+	  devref-prolog-interface.doxyconf-latex.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-html.in (simplex.1): file
+	  user-prolog-interface.doxyconf-html.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (simplex.1): file
+	  user-prolog-interface.doxyconf-latex.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.227): Spurious characters removed.
+
+2007-08-31 Friday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.2): New packages `ppl-ocaml' and
+	  `ppl-ocaml-devel' contain the OCaml interface.
+
+2007-08-31 Friday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.278), demos/ppl_lpsol/ppl_lpsol.c (1.72): Should
+	  support all versions of GLPK now.  Diagnostics of ppl_lpsol
+	  improved.
+
+2007-08-31 Friday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.55): Remove spurious line continuation
+	  character that was preventing distribution of the core PS
+	  manuals.
+
+2007-08-31 Friday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (simplex.1): file README.ocaml was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2007-08-31 Friday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.226), interfaces/OCaml/README.ocaml (1.1): New file
+	  README.ocaml, still to be written properly.
+
+2007-08-31 Friday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.72): Dependencies fixed.
+
+2007-08-31 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.277), demos/ppl_lpsol/ppl_lpsol.c (1.71): Support
+	  GLPK versions up to 4.15, both installed from a source package or
+	  from Fedora RPM packages.
+
+2007-08-31 Friday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.27): Directory interfaces has to be
+	  processed before its subdirs.
+
+2007-08-30 Thursday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.42), configure.ac (1.276), ppl.spec.in (1.31),
+	  fedora/Makefile.am (1.1), fedora/ppl.spec (1.1): New placement
+	  for the Fedora PPL spec file.  It did not make much sense to have
+	  the PPL version number be filled in automatically.
+
+2007-08-30 Thursday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.54): Install (and uninstall) also the TODO
+	  file.
+
+2007-08-30 Thursday 18:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.51): Always use the -fPIC
+	  option when compiling the C/C++ foreign modules.
+
+2007-08-30 Thursday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.53): Distribute README.yap.
+
+2007-08-30 Thursday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.71): Distribute
+	  README.swiprolog.
+
+2007-08-30 Thursday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.64): Distribute
+	  README.gprolog.
+
+2007-08-30 Thursday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README (1.3): Obsolete file removed.
+
+2007-08-30 Thursday 15:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.2): Made consistent with respect
+	  to the currently generated C interface.  Using new Doxygen alias
+	  \extref when referring to the main manual.
+
+2007-08-30 Thursday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.5),
+	  devref-c-interface.doxyconf-latex.in (1.5),
+	  devref-c-interface.tex (1.1), user-c-interface.doxyconf-html.in
+	  (1.6), user-c-interface.doxyconf-latex.in (1.6): Added main title
+	  page for the LaTeX version of the C interface devref.  Added
+	  Doxygen alias \extref for references to external documentation:
+	  it behaves as \ref for the HTML documentation (exploiting TAG
+	  files), it simply prints the second argument for the LaTeX
+	  documentation (since these seems not to be able to exploit TAG
+	  files). By using \extref we should be able to avoid dozens of
+	  annoying Doxygen warnings when producing the manuals for foreign
+	  language interfaces.
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-html.in (simplex.1): file
+	  devref-c-interface.doxyconf-html.in was added on branch simplex
+	  on 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-latex.in (simplex.1): file
+	  devref-c-interface.doxyconf-latex.in was added on branch simplex
+	  on 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-html.in (simplex.1): file
+	  user-c-interface.doxyconf-html.in was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-latex.in (simplex.1): file
+	  user-c-interface.doxyconf-latex.in was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-prolog-interface.doxyconf-html.in (1.4),
+	  user-prolog-interface.doxyconf-latex.in (1.4): Updated to Doxygen
+	  1.5.3.  Use user-prolog-interface.tex for the LaTeX version.
+
+2007-08-30 Thursday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-prolog-interface.tex (1.1): Put under CVS control.
+
+2007-08-30 Thursday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.4),
+	  devref-c-interface.doxyconf-latex.in (1.4),
+	  user-c-interface.doxyconf-html.in (1.5),
+	  user-c-interface.doxyconf-latex.in (1.5): Added C_interface.dox
+	  to the documentation INPUT files.
+
+2007-08-30 Thursday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.53): C interface docs depends on
+	  interfaces/C/C_interface.dox.
+
+2007-08-30 Thursday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.1): Recovered documentation for
+	  the C interface types and functions related to convex polyhedra.
+	  This file will not be compiled (since the functions will be
+	  automatically generated), it just serve as a template
+	  documentation for all kind of domains. To be checked for
+	  completeness wrt the actually generated code.
+
+2007-08-28 Tuesday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: Makefile.am (1.28), ppl_c.m4 (1.1): Initial implementation
+	  of the new function AM_PATH_PPL_C to to test for the existence
+	  and usability of particular versions of the C interface of the
+	  PPL, defining macros containing the required paths.
+
+2007-08-28 Tuesday 15:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.8): Several bugs fixed.
+
+2007-08-28 Tuesday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.275): Version number bumped.
+
+2007-08-27 Monday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.7): Trailing whitespace removed.
+
+2007-08-27 Monday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.34): Install also ppl_c.h.
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/: user.doxyconf-html.in (1.2),
+	  user.doxyconf-latex.in (1.2): Updated to Doxygen 1.5.3-20070815.
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-html.in (simplex.1): file
+	  user.doxyconf-html.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-latex.in (simplex.1): file
+	  user.doxyconf-latex.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-08-26 Sunday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.225): Noted that it would be nice to have an
+	  implementation of Minkowski addition.
+
+2007-08-26 Sunday 17:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.224): Added a note about the work of Kent Andersen and
+	  Gérard Cornuéjols.
+
+2007-08-03 Friday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.203): Avoid duplicated section label.
+
+2007-08-02 Thursday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-c-interface.doxyconf-html.in (1.4),
+	  user-c-interface.doxyconf-latex.in (1.4), user-c-interface.tex
+	  (1.1): Upgraded to doxygen version 1.5.3.  Changed LATEX_HEADER
+	  so as to be specific for the C interface.
+
+2007-08-02 Thursday 13:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.17): Do
+	  initialize a local Boolean variable passed by reference, so as to
+	  avoid 4 annoying warnings.
+
+2007-08-02 Thursday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/meta_programming.hh (1.8): Do hide documentation of inner
+	  class Is_Same_Or_Derived::Any.
+
+2007-08-02 Thursday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.84), devref.doxyconf-latex.in
+	  (1.23): Upgraded to doxygen version 1.5.3.  Added
+	  Interval_Restriction.defs.hh and Interval_Info.* to INPUT.
+
+2007-08-02 Thursday 09:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.41), user.doxyconf-latex.in
+	  (1.12): Upgraded to doxygen version 1.5.3.
+
+2007-08-02 Thursday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/meta_programming.hh (1.7): Added \ingroup doxygen command to
+	  several class definitions.
+
+2007-08-02 Thursday 09:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.92), Checked_Number.inlines.hh
+	  (1.76): Minor formatting improvements, as well as the addition of
+	  some doxygen commands.
+
+2007-08-02 Thursday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh (1.5): Fixed a couple of \relates
+	  commands.
+
+2007-07-30 Monday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.45): Doxygen documentation should be
+	  associated to members' declarations, rather than members'
+	  implementation. Also removed a couple of inappropriate \relates
+	  commands (which should only be used for functions that are NOT
+	  members of a class).
+
+2007-07-30 Monday 13:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.14): Added a couple of missing
+	  \relates Doxygen commands.
+
+2007-07-30 Monday 13:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.62): Removed optional (and usually
+	  omitted) template instantiations, which were also causing a
+	  Doxygen warning.
+
+2007-07-30 Monday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (1.19): Removed optional (and usually omitted)
+	  template instantiation, which was also causing a Doxygen warning.
+
+2007-07-30 Monday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.83), devref.doxyconf-latex.in
+	  (1.22): Add meta_programming.hh to variable INPUT.
+
+2007-07-30 Monday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.41), Watchdog/Makefile.am (1.32): Added a comment
+	  on the need to explicitly clean files generated by macro
+	  AX_PREFIX_CONFIG_H.
+
+2007-07-29 Sunday 16:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.40), Watchdog/Makefile.am (1.31): The prefixed
+	  configuration header and _config.sed added to DESTCLEANFILES.
+
+2007-07-17 Tuesday 08:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.223): Remember to have a look at
+
+
+	  http://www.inf.ethz.ch/personal/gonnet/FPAccuracy/Analysis.html
+
+	  especially at the "Surprises" section, where it talks about
+	  rounding problems for division and multiplication on Pentium/AMD.
+
+2007-07-13 Friday 15:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.52): The foreign language interface manuals in
+	  HTML format depend on the corresponding core manuals (due to the
+	  use of Doxygen generated tag files).
+
+2007-07-12 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.4), Makefile.am (1.39), README (1.51),
+	  README.configure (1.20), configure.ac (1.274), instchk.hh (1.9),
+	  Watchdog/COPYING (1.4), Watchdog/Makefile.am (1.30),
+	  Watchdog/README (1.16), Watchdog/configure.ac (1.38),
+	  Watchdog/doc/Makefile.am (1.3), Watchdog/doc/README.doc (1.2),
+	  Watchdog/doc/devref.tex (1.2), Watchdog/doc/pwl.sty (1.2),
+	  Watchdog/doc/user.tex (1.2), Watchdog/m4/Makefile.am (1.2),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.4),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.4),
+	  Watchdog/src/EList.defs.hh (1.6), Watchdog/src/EList.inlines.hh
+	  (1.4), Watchdog/src/EList_Iterator.defs.hh (1.4),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.4),
+	  Watchdog/src/Handler.defs.hh (1.5),
+	  Watchdog/src/Handler.inlines.hh (1.4), Watchdog/src/Makefile.am
+	  (1.11), Watchdog/src/Pending_Element.cc (1.5),
+	  Watchdog/src/Pending_Element.defs.hh (1.5),
+	  Watchdog/src/Pending_Element.inlines.hh (1.4),
+	  Watchdog/src/Pending_List.cc (1.5),
+	  Watchdog/src/Pending_List.defs.hh (1.5),
+	  Watchdog/src/Pending_List.inlines.hh (1.4), Watchdog/src/Time.cc
+	  (1.5), Watchdog/src/Time.defs.hh (1.5),
+	  Watchdog/src/Time.inlines.hh (1.4), Watchdog/src/Watchdog.cc
+	  (1.7), Watchdog/src/Watchdog.defs.hh (1.6),
+	  Watchdog/src/Watchdog.inlines.hh (1.4),
+	  Watchdog/src/pwl_header.hh (1.5), Watchdog/utils/Makefile.am
+	  (1.8), Watchdog/utils/build_header.in (1.5), debian/Makefile.am
+	  (1.4), demos/Makefile.am (1.11), demos/ppl_lcdd/Makefile.am
+	  (1.28), demos/ppl_lcdd/ppl_lcdd.cc (1.60),
+	  demos/ppl_lcdd/examples/Makefile.am (1.9),
+	  demos/ppl_lpsol/Makefile.am (1.39), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.70), demos/ppl_lpsol/examples/Makefile.am (1.9),
+	  doc/Makefile.am (1.51), doc/README.doc (1.12), doc/devref.tex
+	  (1.22), doc/ppl.sty (1.27), doc/user.tex (1.23),
+	  interfaces/Makefile.am (1.26),
+	  interfaces/ppl_interface_generator_common.m4 (1.18),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.31),
+	  interfaces/ppl_interface_generator_copyright (1.4),
+	  interfaces/C/Makefile.am (1.33), interfaces/C/ppl_c.h.in (1.72),
+	  interfaces/C/ppl_c_version.h.in (1.5),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.8),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.16),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.11),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.12),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.12),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.9),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.8),
+	  interfaces/Java/Makefile.am (1.12),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.8),
+	  interfaces/Java/jni/Makefile.am (1.14),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.9),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.27), interfaces/Java/jni/ppl_java_common.cc (1.34),
+	  interfaces/Java/jni/ppl_java_common.hh (1.28),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.6),
+	  interfaces/Java/ppl_java/By_Reference.java (1.4),
+	  interfaces/Java/ppl_java/Coefficient.java (1.6),
+	  interfaces/Java/ppl_java/Congruence.java (1.6),
+	  interfaces/Java/ppl_java/Congruence_System.java (1.4),
+	  interfaces/Java/ppl_java/Constraint.java (1.6),
+	  interfaces/Java/ppl_java/Constraint_System.java (1.4),
+	  interfaces/Java/ppl_java/Degenerate_Element.java (1.3),
+	  interfaces/Java/ppl_java/Domain_Error_Exception.java (1.3),
+	  interfaces/Java/ppl_java/Generator.java (1.6),
+	  interfaces/Java/ppl_java/Generator_System.java (1.4),
+	  interfaces/Java/ppl_java/Generator_Type.java (1.3),
+	  interfaces/Java/ppl_java/Grid_Generator.java (1.6),
+	  interfaces/Java/ppl_java/Grid_Generator_System.java (1.5),
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java (1.3),
+	  interfaces/Java/ppl_java/Invalid_Argument_Exception.java (1.3),
+	  interfaces/Java/ppl_java/Lenght_Error_Exception.java (1.3),
+	  interfaces/Java/ppl_java/Linear_Expression.java (1.6),
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
+	  (1.4), interfaces/Java/ppl_java/Linear_Expression_Difference.java
+	  (1.5), interfaces/Java/ppl_java/Linear_Expression_Sum.java (1.5),
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java (1.4),
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
+	  (1.4), interfaces/Java/ppl_java/Linear_Expression_Variable.java
+	  (1.4), interfaces/Java/ppl_java/Logic_Error_Exception.java (1.3),
+	  interfaces/Java/ppl_java/MIP_Problem.java (1.5),
+	  interfaces/Java/ppl_java/MIP_Problem_Status.java (1.3),
+	  interfaces/Java/ppl_java/Makefile.am (1.31),
+	  interfaces/Java/ppl_java/Optimization_Mode.java (1.3),
+	  interfaces/Java/ppl_java/Overflow_Error_Exception.java (1.3),
+	  interfaces/Java/ppl_java/PPL_Object.java (1.4),
+	  interfaces/Java/ppl_java/Parma_Polyhedra_Library.java (1.3),
+	  interfaces/Java/ppl_java/Partial_Function.java (1.3),
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java (1.3),
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java (1.3),
+	  interfaces/Java/ppl_java/Relation_Symbol.java (1.4),
+	  interfaces/Java/ppl_java/Variable.java (1.5),
+	  interfaces/Java/ppl_java/Variables_Set.java (1.3),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.16),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.25), interfaces/Java/tests/C_Polyhedron_test1.java (1.12),
+	  interfaces/Java/tests/Makefile.am (1.15),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.3),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.9),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.17), interfaces/OCaml/Makefile.am (1.32),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.4),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.13),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.6),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.9),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.13),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.7),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.10),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.7),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.10),
+	  interfaces/OCaml/test1.ml (1.30), interfaces/Prolog/Makefile.am
+	  (1.41), interfaces/Prolog/Prolog_interface.dox (1.159),
+	  interfaces/Prolog/exceptions.hh (1.25),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.34),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.11),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.47),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.10), interfaces/Prolog/ppl_prolog_common.icc (1.8),
+	  interfaces/Prolog/track_allocation.hh (1.23),
+	  interfaces/Prolog/Ciao/Makefile.am (1.64),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.3),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.19),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.15),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.26),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.50),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.6),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.5), interfaces/Prolog/GNU/Makefile.am (1.63),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.11),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.12),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.3),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.43),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.6), interfaces/Prolog/SICStus/Makefile.am (1.75),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.9), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.28),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.8),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.10),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.17),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.16),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.10),
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl (1.3),
+	  interfaces/Prolog/SWI/Makefile.am (1.70),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.12),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.11),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.9), interfaces/Prolog/SWI/ppl_pl.cc (1.12),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.8),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.5),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.10),
+	  interfaces/Prolog/SWI/swi_predicate_check.pl (1.3),
+	  interfaces/Prolog/XSB/Makefile.am (1.50),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.7),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.8),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.5), interfaces/Prolog/XSB/xsb_cfli.hh (1.3),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.18),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.16),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.30),
+	  interfaces/Prolog/YAP/Makefile.am (1.52),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.7),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.12),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.3),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.13),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.9),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.13),
+	  interfaces/Prolog/tests/Makefile.am (1.15),
+	  interfaces/Prolog/tests/clpq.pl (1.10),
+	  interfaces/Prolog/tests/clpq2.pl (1.11),
+	  interfaces/Prolog/tests/pl_check.pl (1.49),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.5),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.50),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.27), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.4), m4/Makefile.am (1.27), m4/ac_check_fpu_control.m4 (1.5),
+	  m4/ac_check_gmp.m4 (1.25), m4/ac_check_sicstus_prolog.m4 (1.6),
+	  m4/ac_check_swi_prolog.m4 (1.11), m4/ac_check_xsb_prolog.m4
+	  (1.4), m4/ac_cxx_attribute_weak.m4 (1.9),
+	  m4/ac_cxx_double_binary_format.m4 (1.6),
+	  m4/ac_cxx_flexible_arrays.m4 (1.14),
+	  m4/ac_cxx_float_binary_format.m4 (1.5),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.6),
+	  m4/ac_cxx_remainder_bug.m4 (1.2), m4/ac_prog_javac.m4 (1.6),
+	  m4/ac_text_md5sum.m4 (1.3), m4/ppl.m4 (1.6),
+	  src/Any_Pointset.defs.hh (1.13), src/Any_Pointset.inlines.hh
+	  (1.3), src/Ask_Tell.defs.hh (1.17), src/Ask_Tell.inlines.hh
+	  (1.16), src/Ask_Tell.templates.hh (1.9), src/BDS_Status.idefs.hh
+	  (1.21), src/BDS_Status.inlines.hh (1.16), src/BD_Shape.cc (1.7),
+	  src/BD_Shape.defs.hh (1.100), src/BD_Shape.inlines.hh (1.144),
+	  src/BD_Shape.templates.hh (1.77), src/BHRZ03_Certificate.cc
+	  (1.13), src/BHRZ03_Certificate.defs.hh (1.18),
+	  src/BHRZ03_Certificate.inlines.hh (1.9), src/Bit_Matrix.cc (1.4),
+	  src/Bit_Matrix.defs.hh (1.4), src/Bit_Matrix.inlines.hh (1.3),
+	  src/Bit_Row.cc (1.4), src/Bit_Row.defs.hh (1.6),
+	  src/Bit_Row.inlines.hh (1.4), src/Boundary.defs.hh (1.8),
+	  src/Box.cc (1.7), src/Box.defs.hh (1.27), src/Box.inlines.hh
+	  (1.18), src/Box.templates.hh (1.61), src/C_Integer.hh (1.5),
+	  src/C_Polyhedron.cc (1.22), src/C_Polyhedron.defs.hh (1.48),
+	  src/C_Polyhedron.inlines.hh (1.36), src/Checked_Number.cc (1.13),
+	  src/Checked_Number.defs.hh (1.91), src/Checked_Number.inlines.hh
+	  (1.75), src/Coefficient.cc (1.7), src/Coefficient.defs.hh (1.9),
+	  src/Coefficient.inlines.hh (1.7), src/Congruence.cc (1.16),
+	  src/Congruence.defs.hh (1.20), src/Congruence.inlines.hh (1.16),
+	  src/Congruence_System.cc (1.25), src/Congruence_System.defs.hh
+	  (1.20), src/Congruence_System.inlines.hh (1.9), src/Constraint.cc
+	  (1.67), src/Constraint.defs.hh (1.125), src/Constraint.inlines.hh
+	  (1.67), src/Constraint_System.cc (1.24),
+	  src/Constraint_System.defs.hh (1.37),
+	  src/Constraint_System.inlines.hh (1.10), src/DB_Matrix.defs.hh
+	  (1.28), src/DB_Matrix.inlines.hh (1.33),
+	  src/DB_Matrix.templates.hh (1.6), src/DB_Row.defs.hh (1.24),
+	  src/DB_Row.inlines.hh (1.23), src/DB_Row.templates.hh (1.7),
+	  src/Determinate.defs.hh (1.67), src/Determinate.inlines.hh
+	  (1.57), src/Direct_Product.defs.hh (1.35),
+	  src/Direct_Product.inlines.hh (1.31),
+	  src/Direct_Product.templates.hh (1.22), src/Float.cc (1.7),
+	  src/Float.defs.hh (1.26), src/Float.inlines.hh (1.31),
+	  src/GMP_Integer.defs.hh (1.26), src/GMP_Integer.inlines.hh
+	  (1.21), src/Generator.cc (1.75), src/Generator.defs.hh (1.123),
+	  src/Generator.inlines.hh (1.61), src/Generator_System.cc (1.23),
+	  src/Generator_System.defs.hh (1.24),
+	  src/Generator_System.inlines.hh (1.9), src/Grid.defs.hh (1.49),
+	  src/Grid.inlines.hh (1.15), src/Grid.templates.hh (1.31),
+	  src/Grid_Certificate.cc (1.9), src/Grid_Certificate.defs.hh
+	  (1.6), src/Grid_Certificate.inlines.hh (1.4),
+	  src/Grid_Generator.cc (1.21), src/Grid_Generator.defs.hh (1.31),
+	  src/Grid_Generator.inlines.hh (1.14),
+	  src/Grid_Generator_System.cc (1.19),
+	  src/Grid_Generator_System.defs.hh (1.23),
+	  src/Grid_Generator_System.inlines.hh (1.14), src/Grid_Status.cc
+	  (1.8), src/Grid_Status.idefs.hh (1.7), src/Grid_Status.inlines.hh
+	  (1.4), src/Grid_chdims.cc (1.18), src/Grid_conversion.cc (1.21),
+	  src/Grid_nonpublic.cc (1.26), src/Grid_public.cc (1.53),
+	  src/Grid_simplify.cc (1.34), src/Grid_widenings.cc (1.16),
+	  src/H79_Certificate.cc (1.12), src/H79_Certificate.defs.hh
+	  (1.16), src/H79_Certificate.inlines.hh (1.10), src/Init.cc
+	  (1.31), src/Init.defs.hh (1.19), src/Interval.defs.hh (1.44),
+	  src/Interval.inlines.hh (1.27), src/Interval_Info.defs.hh (1.5),
+	  src/Interval_Info.inlines.hh (1.4),
+	  src/Interval_Restriction.defs.hh (1.6), src/Linear_Expression.cc
+	  (1.18), src/Linear_Expression.defs.hh (1.35),
+	  src/Linear_Expression.inlines.hh (1.11), src/Linear_Row.cc
+	  (1.23), src/Linear_Row.defs.hh (1.25), src/Linear_Row.inlines.hh
+	  (1.13), src/Linear_System.cc (1.44), src/Linear_System.defs.hh
+	  (1.32), src/Linear_System.inlines.hh (1.23), src/MIP_Problem.cc
+	  (1.54), src/MIP_Problem.defs.hh (1.35),
+	  src/MIP_Problem.inlines.hh (1.16), src/MIP_Problem.templates.hh
+	  (1.11), src/Makefile.am (1.171), src/Matrix.cc (1.97),
+	  src/Matrix.defs.hh (1.82), src/Matrix.inlines.hh (1.52),
+	  src/NNC_Polyhedron.cc (1.22), src/NNC_Polyhedron.defs.hh (1.50),
+	  src/NNC_Polyhedron.inlines.hh (1.37), src/Numeric_Format.defs.hh
+	  (1.7), src/OR_Matrix.defs.hh (1.9), src/OR_Matrix.inlines.hh
+	  (1.8), src/OR_Matrix.templates.hh (1.6), src/Octagonal_Shape.cc
+	  (1.6), src/Octagonal_Shape.defs.hh (1.29),
+	  src/Octagonal_Shape.inlines.hh (1.17),
+	  src/Octagonal_Shape.templates.hh (1.53), src/Og_Status.idefs.hh
+	  (1.7), src/Og_Status.inlines.hh (1.5), src/Ph_Status.cc (1.14),
+	  src/Ph_Status.idefs.hh (1.21), src/Ph_Status.inlines.hh (1.9),
+	  src/Pointset_Ask_Tell.cc (1.4), src/Pointset_Ask_Tell.defs.hh
+	  (1.11), src/Pointset_Ask_Tell.inlines.hh (1.5),
+	  src/Pointset_Ask_Tell.templates.hh (1.9),
+	  src/Pointset_Powerset.cc (1.13), src/Pointset_Powerset.defs.hh
+	  (1.18), src/Pointset_Powerset.inlines.hh (1.8),
+	  src/Pointset_Powerset.templates.hh (1.14),
+	  src/Poly_Con_Relation.cc (1.16), src/Poly_Con_Relation.defs.hh
+	  (1.34), src/Poly_Con_Relation.inlines.hh (1.16),
+	  src/Poly_Gen_Relation.cc (1.16), src/Poly_Gen_Relation.defs.hh
+	  (1.32), src/Poly_Gen_Relation.inlines.hh (1.16),
+	  src/Polyhedron.defs.hh (1.318), src/Polyhedron.inlines.hh
+	  (1.141), src/Polyhedron.templates.hh (1.14),
+	  src/Polyhedron_chdims.cc (1.44), src/Polyhedron_nonpublic.cc
+	  (1.79), src/Polyhedron_public.cc (1.94),
+	  src/Polyhedron_widenings.cc (1.63), src/Powerset.defs.hh (1.30),
+	  src/Powerset.inlines.hh (1.20), src/Powerset.templates.hh (1.5),
+	  src/Ptr_Iterator.defs.hh (1.10), src/Ptr_Iterator.inlines.hh
+	  (1.8), src/Rational_Box.hh (1.6), src/Result.defs.hh (1.19),
+	  src/Result.inlines.hh (1.11), src/Rounding_Dir.defs.hh (1.13),
+	  src/Rounding_Dir.inlines.hh (1.7), src/Row.cc (1.104),
+	  src/Row.defs.hh (1.112), src/Row.inlines.hh (1.66),
+	  src/Scalar_Products.cc (1.9), src/Scalar_Products.defs.hh (1.10),
+	  src/Scalar_Products.inlines.hh (1.6), src/Temp.defs.hh (1.5),
+	  src/Variable.cc (1.24), src/Variable.defs.hh (1.54),
+	  src/Variable.inlines.hh (1.25), src/Variables_Set.cc (1.6),
+	  src/Variables_Set.defs.hh (1.7), src/Variables_Set.inlines.hh
+	  (1.5), src/Widening_Function.defs.hh (1.18),
+	  src/Widening_Function.inlines.hh (1.15), src/algorithms.hh
+	  (1.49), src/checked.cc (1.21), src/checked.defs.hh (1.42),
+	  src/checked.inlines.hh (1.38), src/checked_ext.defs.hh (1.13),
+	  src/checked_ext.inlines.hh (1.39), src/checked_float.inlines.hh
+	  (1.79), src/checked_int.inlines.hh (1.62),
+	  src/checked_mpq.inlines.hh (1.42), src/checked_mpz.inlines.hh
+	  (1.46), src/checked_numeric_limits.hh (1.21), src/compiler.hh
+	  (1.11), src/conversion.cc (1.83), src/distances.defs.hh (1.4),
+	  src/distances.inlines.hh (1.5), src/fpu-c99.inlines.hh (1.15),
+	  src/fpu-ia32.inlines.hh (1.17), src/fpu-none.inlines.hh (1.7),
+	  src/fpu-sparc.inlines.hh (1.9), src/fpu.defs.hh (1.16),
+	  src/globals.cc (1.28), src/globals.defs.hh (1.48),
+	  src/globals.inlines.hh (1.18), src/initializer.hh (1.14),
+	  src/iterator_to_const.defs.hh (1.6),
+	  src/iterator_to_const.inlines.hh (1.4),
+	  src/max_space_dimension.hh (1.13), src/meta_programming.hh (1.6),
+	  src/minimize.cc (1.48), src/mp_std_bits.cc (1.5),
+	  src/mp_std_bits.defs.hh (1.5), src/mp_std_bits.inlines.hh (1.4),
+	  src/namespaces.hh (1.12), src/ppl-config.cc.in (1.21),
+	  src/ppl_header.hh (1.7), src/simplify.cc (1.49),
+	  src/swapping_sort.icc (1.13), src/version.cc (1.10),
+	  src/version.hh.in (1.16), tests/FCAIBVP.cc (1.5),
+	  tests/FCAIBVP.defs.hh (1.5), tests/FCAIBVP.inlines.hh (1.5),
+	  tests/Makefile.am (1.263), tests/Partial_Function.cc (1.6),
+	  tests/Partial_Function.defs.hh (1.4),
+	  tests/Partial_Function.inlines.hh (1.3),
+	  tests/Random_Number_Generator.defs.hh (1.5),
+	  tests/Random_Number_Generator.inlines.hh (1.10), tests/files.cc
+	  (1.10), tests/files.hh (1.11), tests/ppl_test.cc (1.10),
+	  tests/ppl_test.hh (1.65), tests/print.cc (1.28), tests/print.hh
+	  (1.42), tests/Ask_Tell/Makefile.am (1.3),
+	  tests/Ask_Tell/append1.cc (1.6), tests/BD_Shape/Makefile.am
+	  (1.66), tests/BD_Shape/addconstraints1.cc (1.18),
+	  tests/BD_Shape/addspacedims1.cc (1.15),
+	  tests/BD_Shape/affinedimension1.cc (1.12),
+	  tests/BD_Shape/affineimage1.cc (1.19),
+	  tests/BD_Shape/affineimage2.cc (1.13),
+	  tests/BD_Shape/affinepreimage1.cc (1.21),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.15),
+	  tests/BD_Shape/bdsdifference1.cc (1.15),
+	  tests/BD_Shape/bdshull1.cc (1.16),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.10),
+	  tests/BD_Shape/bhmz05widening1.cc (1.15),
+	  tests/BD_Shape/bhz03widening1.cc (1.10),
+	  tests/BD_Shape/bounded1.cc (1.3),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.4),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.3),
+	  tests/BD_Shape/bounds1.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.19),
+	  tests/BD_Shape/cc76narrowing1.cc (1.18),
+	  tests/BD_Shape/closure1.cc (1.20), tests/BD_Shape/concatenate1.cc
+	  (1.14), tests/BD_Shape/constraints1.cc (1.19),
+	  tests/BD_Shape/contains1.cc (1.15),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.3),
+	  tests/BD_Shape/discrete1.cc (1.3), tests/BD_Shape/disjoint1.cc
+	  (1.6), tests/BD_Shape/empty1.cc (1.11),
+	  tests/BD_Shape/equality1.cc (1.16),
+	  tests/BD_Shape/expandspacedim1.cc (1.4),
+	  tests/BD_Shape/foldspacedims1.cc (1.6),
+	  tests/BD_Shape/fromgensys1.cc (1.15),
+	  tests/BD_Shape/frompolyhedron1.cc (1.5),
+	  tests/BD_Shape/fromspacedim1.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.17),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.21),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.15),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.16),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.6),
+	  tests/BD_Shape/geomcovers1.cc (1.10),
+	  tests/BD_Shape/h79widening1.cc (1.13),
+	  tests/BD_Shape/intersection1.cc (1.18),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.14),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.15),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.14),
+	  tests/BD_Shape/mapspacedims1.cc (1.15),
+	  tests/BD_Shape/max_min1.cc (1.3), tests/BD_Shape/max_min2.cc
+	  (1.5), tests/BD_Shape/maxspacedim1.cc (1.4),
+	  tests/BD_Shape/membytes1.cc (1.3),
+	  tests/BD_Shape/minconstraints1.cc (1.11),
+	  tests/BD_Shape/relations1.cc (1.18), tests/BD_Shape/relations2.cc
+	  (1.22), tests/BD_Shape/relations3.cc (1.26),
+	  tests/BD_Shape/removespacedims1.cc (1.20),
+	  tests/BD_Shape/run_tests (1.19), tests/BD_Shape/timeelapse1.cc
+	  (1.20), tests/BD_Shape/universe1.cc (1.15),
+	  tests/BD_Shape/writebdshape1.cc (1.10), tests/Box/Makefile.am
+	  (1.37), tests/Box/addconstraints1.cc (1.8),
+	  tests/Box/addspacedims1.cc (1.4), tests/Box/affinedimension1.cc
+	  (1.6), tests/Box/affineimage1.cc (1.7),
+	  tests/Box/affinepreimage1.cc (1.4), tests/Box/ascii_dump_load1.cc
+	  (1.4), tests/Box/bdsdifference1.cc (1.5),
+	  tests/Box/bgp99extrapolation1.cc (1.4),
+	  tests/Box/bhz03widening1.cc (1.4), tests/Box/bounded1.cc (1.4),
+	  tests/Box/boundedaffineimage1.cc (1.4),
+	  tests/Box/boxdifference1.cc (1.6), tests/Box/boxhull.cc (1.4),
+	  tests/Box/boxhull1.cc (1.5), tests/Box/cc76narrowing1.cc (1.5),
+	  tests/Box/cc76widening.cc (1.5), tests/Box/closure1.cc (1.4),
+	  tests/Box/concatenate1.cc (1.5), tests/Box/constraints1.cc (1.4),
+	  tests/Box/contains1.cc (1.5), tests/Box/containsintegerpoint1.cc
+	  (1.6), tests/Box/discrete1.cc (1.5), tests/Box/disjoint1.cc
+	  (1.5), tests/Box/empty1.cc (1.5), tests/Box/equality1.cc (1.5),
+	  tests/Box/expandspacedim1.cc (1.6), tests/Box/foldspacedims1.cc
+	  (1.7), tests/Box/frombdshape1.cc (1.2), tests/Box/frombox1.cc
+	  (1.3), tests/Box/fromdirectproduct1.cc (1.5),
+	  tests/Box/fromgensys1.cc (1.4), tests/Box/fromgrid1.cc (1.5),
+	  tests/Box/frompolyhedron1.cc (1.11), tests/Box/frompolyhedron2.cc
+	  (1.9), tests/Box/fromspacedim1.cc (1.2),
+	  tests/Box/generalizedaffineimage1.cc (1.5),
+	  tests/Box/generalizedaffinepreimage1.cc (1.5),
+	  tests/Box/geomcovers1.cc (1.4), tests/Box/intersection1.cc (1.6),
+	  tests/Box/interval1.cc (1.4), tests/Box/interval2.cc (1.4),
+	  tests/Box/mapspacedims1.cc (1.4), tests/Box/max_min1.cc (1.6),
+	  tests/Box/maxspacedim1.cc (1.5), tests/Box/membytes1.cc (1.4),
+	  tests/Box/minconstraints1.cc (1.5),
+	  tests/Box/pointsetpowerset1.cc (1.3), tests/Box/refine1.cc
+	  (1.10), tests/Box/refine2.cc (1.9), tests/Box/refine3.cc (1.2),
+	  tests/Box/relations1.cc (1.5), tests/Box/relations2.cc (1.3),
+	  tests/Box/removespacedims1.cc (1.6), tests/Box/run_tests (1.3),
+	  tests/Box/timeelapse1.cc (1.5), tests/Box/universe1.cc (1.4),
+	  tests/Box/writebox1.cc (1.4), tests/Grid/Makefile.am (1.48),
+	  tests/Grid/addcongruence1.cc (1.14),
+	  tests/Grid/addcongruences1.cc (1.17),
+	  tests/Grid/addconstraint1.cc (1.12),
+	  tests/Grid/addconstraints1.cc (1.13), tests/Grid/addgenerator1.cc
+	  (1.16), tests/Grid/addgenerators1.cc (1.16),
+	  tests/Grid/addspacedims1.cc (1.15), tests/Grid/affinedim1.cc
+	  (1.12), tests/Grid/affineimage1.cc (1.14),
+	  tests/Grid/affineimage2.cc (1.12), tests/Grid/affinepreimage1.cc
+	  (1.13), tests/Grid/affinepreimage2.cc (1.8),
+	  tests/Grid/approximatepartition1.cc (1.3),
+	  tests/Grid/asciidumpload1.cc (1.14), tests/Grid/asciidumpload2.cc
+	  (1.6), tests/Grid/asciidumpload3.cc (1.5),
+	  tests/Grid/asciidumpload4.cc (1.5), tests/Grid/asciidumpload5.cc
+	  (1.3), tests/Grid/asciidumpload6.cc (1.3),
+	  tests/Grid/asciidumpload7.cc (1.3), tests/Grid/bhz03widening1.cc
+	  (1.13), tests/Grid/bounded1.cc (1.14),
+	  tests/Grid/boundedaffineimage1.cc (1.4),
+	  tests/Grid/boundedaffinepreimage1.cc (1.4),
+	  tests/Grid/boundingbox1.cc (1.19), tests/Grid/bounds1.cc (1.15),
+	  tests/Grid/certificate1.cc (1.14), tests/Grid/concatenate1.cc
+	  (1.14), tests/Grid/congruence1.cc (1.17),
+	  tests/Grid/congruences1.cc (1.12), tests/Grid/congruences2.cc
+	  (1.6), tests/Grid/contains1.cc (1.12),
+	  tests/Grid/containsintegerpoint1.cc (1.4),
+	  tests/Grid/copyconstruct1.cc (1.8), tests/Grid/coveringbox1.cc
+	  (1.16), tests/Grid/coveringbox2.cc (1.14),
+	  tests/Grid/directproduct1.cc (1.28), tests/Grid/directproduct2.cc
+	  (1.6), tests/Grid/discrete1.cc (1.8), tests/Grid/disjoint1.cc
+	  (1.12), tests/Grid/equals1.cc (1.13),
+	  tests/Grid/expandspacedim1.cc (1.12),
+	  tests/Grid/foldspacedims1.cc (1.12),
+	  tests/Grid/generalizedaffineimage1.cc (1.14),
+	  tests/Grid/generalizedaffineimage2.cc (1.13),
+	  tests/Grid/generalizedaffineimage3.cc (1.5),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.16),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.16),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.5),
+	  tests/Grid/generator1.cc (1.20), tests/Grid/generators1.cc
+	  (1.13), tests/Grid/generators2.cc (1.3), tests/Grid/grid1.cc
+	  (1.21), tests/Grid/grid2.cc (1.16), tests/Grid/grid3.cc (1.20),
+	  tests/Grid/griddifference1.cc (1.12), tests/Grid/intersection1.cc
+	  (1.12), tests/Grid/isempty1.cc (1.8), tests/Grid/isuniverse1.cc
+	  (1.10), tests/Grid/join1.cc (1.16), tests/Grid/join2.cc (1.11),
+	  tests/Grid/limitedextrapolation1.cc (1.13),
+	  tests/Grid/limitedextrapolation2.cc (1.7),
+	  tests/Grid/limitedextrapolation3.cc (1.6),
+	  tests/Grid/mapspacedims1.cc (1.11), tests/Grid/maxmin1.cc (1.12),
+	  tests/Grid/membytes1.cc (1.9), tests/Grid/mincongruences1.cc
+	  (1.10), tests/Grid/mingenerators1.cc (1.10),
+	  tests/Grid/outputoperator1.cc (1.9),
+	  tests/Grid/outputoperator2.cc (1.3),
+	  tests/Grid/outputoperator3.cc (1.3), tests/Grid/partition1.cc
+	  (1.6), tests/Grid/powersetdifference1.cc (1.3),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.3),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.3),
+	  tests/Grid/relations1.cc (1.14), tests/Grid/relations2.cc (1.16),
+	  tests/Grid/relations3.cc (1.7), tests/Grid/removespacedims1.cc
+	  (1.14), tests/Grid/removespacedims2.cc (1.14),
+	  tests/Grid/timeelapse1.cc (1.11), tests/Grid/topclosed1.cc
+	  (1.12), tests/Grid/topclosure1.cc (1.8), tests/Grid/widening1.cc
+	  (1.16), tests/Grid/widening2.cc (1.11), tests/Grid/widening3.cc
+	  (1.6), tests/Grid/writecongruencesystem.cc (1.8),
+	  tests/MIP_Problem/Makefile.am (1.4),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.4),
+	  tests/MIP_Problem/exceptions1.cc (1.3),
+	  tests/MIP_Problem/mipproblem1.cc (1.5),
+	  tests/MIP_Problem/mipproblem2.cc (1.3),
+	  tests/Octagonal_Shape/Makefile.am (1.20),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.3),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.4),
+	  tests/Octagonal_Shape/affineimage1.cc (1.4),
+	  tests/Octagonal_Shape/affineimage2.cc (1.3),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.5),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.3),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.3),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.4),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.3),
+	  tests/Octagonal_Shape/bounded1.cc (1.3),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.10),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.4),
+	  tests/Octagonal_Shape/bounds1.cc (1.4),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.5),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.4),
+	  tests/Octagonal_Shape/chinainit.cc (1.3),
+	  tests/Octagonal_Shape/concatenate1.cc (1.3),
+	  tests/Octagonal_Shape/constraints1.cc (1.4),
+	  tests/Octagonal_Shape/contains1.cc (1.4),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.4),
+	  tests/Octagonal_Shape/discrete1.cc (1.3),
+	  tests/Octagonal_Shape/disjoint1.cc (1.7),
+	  tests/Octagonal_Shape/empty1.cc (1.3),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.5),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.5),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.4),
+	  tests/Octagonal_Shape/fromspacedim1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.9),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.9),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.4),
+	  tests/Octagonal_Shape/intersection1.cc (1.4),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.5),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.5),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.4),
+	  tests/Octagonal_Shape/max_min1.cc (1.5),
+	  tests/Octagonal_Shape/max_min2.cc (1.4),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.4),
+	  tests/Octagonal_Shape/membytes1.cc (1.4),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.4),
+	  tests/Octagonal_Shape/octdifference1.cc (1.4),
+	  tests/Octagonal_Shape/octhull1.cc (1.4),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.4),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.7),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.8),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.4),
+	  tests/Octagonal_Shape/run_tests (1.3),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.5),
+	  tests/Octagonal_Shape/universe1.cc (1.3),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.4),
+	  tests/Polyhedron/Makefile.am (1.109), tests/Polyhedron/README
+	  (1.7), tests/Polyhedron/addcongruence1.cc (1.8),
+	  tests/Polyhedron/addcongruences1.cc (1.11),
+	  tests/Polyhedron/addconstraint1.cc (1.11),
+	  tests/Polyhedron/addconstraints1.cc (1.12),
+	  tests/Polyhedron/addconstraints2.cc (1.11),
+	  tests/Polyhedron/addgenerator1.cc (1.12),
+	  tests/Polyhedron/addgenerator2.cc (1.12),
+	  tests/Polyhedron/addgenerators1.cc (1.13),
+	  tests/Polyhedron/addgenerators2.cc (1.12),
+	  tests/Polyhedron/addspacedims1.cc (1.12),
+	  tests/Polyhedron/addspacedims2.cc (1.12),
+	  tests/Polyhedron/affineimage1.cc (1.12),
+	  tests/Polyhedron/affineimage2.cc (1.11),
+	  tests/Polyhedron/affinepreimage1.cc (1.11),
+	  tests/Polyhedron/affinetrans.cc (1.11),
+	  tests/Polyhedron/append1.cc (1.12), tests/Polyhedron/append2.cc
+	  (1.11), tests/Polyhedron/ascii_dump_load1.cc (1.10),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.10),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.11),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.13),
+	  tests/Polyhedron/bhrz03widening1.cc (1.11),
+	  tests/Polyhedron/bhrz03widening2.cc (1.11),
+	  tests/Polyhedron/bhrz03widening3.cc (1.15),
+	  tests/Polyhedron/bhz03widening1.cc (1.14),
+	  tests/Polyhedron/bounded1.cc (1.11),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.11),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.9),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.10),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.12),
+	  tests/Polyhedron/bounds1.cc (1.11),
+	  tests/Polyhedron/cnncconversion1.cc (1.4),
+	  tests/Polyhedron/concatenate1.cc (1.11),
+	  tests/Polyhedron/congruences1.cc (1.9),
+	  tests/Polyhedron/constraints1.cc (1.10),
+	  tests/Polyhedron/contains1.cc (1.10),
+	  tests/Polyhedron/contains2.cc (1.10),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.3),
+	  tests/Polyhedron/disjoint1.cc (1.10),
+	  tests/Polyhedron/disjoint2.cc (1.12),
+	  tests/Polyhedron/dualhypercubes.cc (1.13),
+	  tests/Polyhedron/empty1.cc (1.11), tests/Polyhedron/equals1.cc
+	  (1.10), tests/Polyhedron/exceptions1.cc (1.14),
+	  tests/Polyhedron/exceptions2.cc (1.12),
+	  tests/Polyhedron/exceptions3.cc (1.11),
+	  tests/Polyhedron/expandspacedim1.cc (1.13),
+	  tests/Polyhedron/expandspacedim2.cc (1.13),
+	  tests/Polyhedron/foldspacedims1.cc (1.15),
+	  tests/Polyhedron/foldspacedims2.cc (1.16),
+	  tests/Polyhedron/frombox1.cc (1.4), tests/Polyhedron/frombox2.cc
+	  (1.4), tests/Polyhedron/generalizedaffineimage1.cc (1.13),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.13),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.10),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.9),
+	  tests/Polyhedron/generators1.cc (1.11),
+	  tests/Polyhedron/geomcovers1.cc (1.14),
+	  tests/Polyhedron/h79widening1.cc (1.11),
+	  tests/Polyhedron/h79widening2.cc (1.11),
+	  tests/Polyhedron/hybrid.cc (1.4),
+	  tests/Polyhedron/intersection1.cc (1.15),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.10),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.11),
+	  tests/Polyhedron/linearpartition1.cc (1.13),
+	  tests/Polyhedron/linearsystem1.cc (1.9),
+	  tests/Polyhedron/linexpression1.cc (1.10),
+	  tests/Polyhedron/mapspacedims1.cc (1.15),
+	  tests/Polyhedron/matrix1.cc (1.10), tests/Polyhedron/max_min1.cc
+	  (1.12), tests/Polyhedron/maxspacedim1.cc (1.13),
+	  tests/Polyhedron/mc91.cc (1.15), tests/Polyhedron/membytes1.cc
+	  (1.15), tests/Polyhedron/memory1.cc (1.13),
+	  tests/Polyhedron/memory2.cc (1.15),
+	  tests/Polyhedron/minconstraints1.cc (1.10),
+	  tests/Polyhedron/minconstraints2.cc (1.12),
+	  tests/Polyhedron/mingenerators1.cc (1.10),
+	  tests/Polyhedron/mingenerators2.cc (1.11),
+	  tests/Polyhedron/nncminimize1.cc (1.7),
+	  tests/Polyhedron/nncminimize2.cc (1.7),
+	  tests/Polyhedron/numberinput1.cc (1.32),
+	  tests/Polyhedron/onepoint.cc (1.11), tests/Polyhedron/permute.cc
+	  (1.9), tests/Polyhedron/pointsetpowerset1.cc (1.7),
+	  tests/Polyhedron/polydifference1.cc (1.12),
+	  tests/Polyhedron/polydifference2.cc (1.12),
+	  tests/Polyhedron/polyhull1.cc (1.12),
+	  tests/Polyhedron/polyhull2.cc (1.11),
+	  tests/Polyhedron/powerset1.cc (1.20),
+	  tests/Polyhedron/randphull1.cc (1.11),
+	  tests/Polyhedron/randphull2.cc (1.10),
+	  tests/Polyhedron/relations1.cc (1.11),
+	  tests/Polyhedron/relations2.cc (1.11),
+	  tests/Polyhedron/relations3.cc (1.10),
+	  tests/Polyhedron/removespacedims1.cc (1.11),
+	  tests/Polyhedron/removespacedims2.cc (1.11),
+	  tests/Polyhedron/smm1.cc (1.8), tests/Polyhedron/timeelapse1.cc
+	  (1.12), tests/Polyhedron/timeelapse2.cc (1.12),
+	  tests/Polyhedron/topclosed1.cc (1.11),
+	  tests/Polyhedron/topclosure1.cc (1.11),
+	  tests/Polyhedron/universe1.cc (1.11),
+	  tests/Polyhedron/universe2.cc (1.11),
+	  tests/Polyhedron/variablesset1.cc (1.11),
+	  tests/Polyhedron/watchdog1.cc (1.10),
+	  tests/Polyhedron/writeconsys1.cc (1.11),
+	  tests/Polyhedron/writegensys1.cc (1.10),
+	  tests/Polyhedron/writepolyhedron1.cc (1.10),
+	  tests/Polyhedron/writepolyhedron2.cc (1.10),
+	  tests/Polyhedron/writerelation1.cc (1.13),
+	  tests/Polyhedron/writevariable1.cc (1.8), utils/Makefile.am
+	  (1.16), utils/build_header.in (1.5), utils/cm_cleaner.sh (1.3),
+	  utils/cm_splitter.sh (1.3), utils/text2cxxarray.in (1.4),
+	  utils/timings.cc (1.10), utils/timings.hh (1.6): Started the
+	  upgrade to GPL version 3 or later.
+
+2007-07-11 Wednesday 16:16  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.43): Fixed typo. Removed
+	  Is_Singleton_Or_Interval. Added Is_Singleton and Is_Interva.
+
+2007-07-10 Tuesday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.3),
+	  devref-c-interface.doxyconf-latex.in (1.3),
+	  devref-prolog-interface.doxyconf-html.in (1.3),
+	  devref-prolog-interface.doxyconf-latex.in (1.3),
+	  devref.doxyconf-html.in (1.82), devref.doxyconf-latex.in (1.21),
+	  user-c-interface.doxyconf-html.in (1.3),
+	  user-c-interface.doxyconf-latex.in (1.3),
+	  user-prolog-interface.doxyconf-html.in (1.3),
+	  user-prolog-interface.doxyconf-latex.in (1.3),
+	  user.doxyconf-html.in (1.40), user.doxyconf-latex.in (1.11):
+	  Updated configuration files to version 1.5.2 of Doxygen.
+
+2007-07-10 Tuesday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.26): Documentation link fixed.
+
+2007-07-10 Tuesday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (1.10): Cut-and-paste documentation
+	  typo fixed.
+
+2007-07-10 Tuesday 16:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.65), Box/Makefile.am (1.36),
+	  Octagonal_Shape/Makefile.am (1.19): List run_tests.stamp in
+	  DISTCLEANFILES.
+
+2007-07-09 Monday 10:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.31): Partially undone last
+	  commit, as it was again causing dependency problems in parallel
+	  builds.
+
+2007-07-08 Sunday 13:41  Andrea Cimino
+
+	* interfaces/: Java/Makefile.am (1.11), OCaml/Makefile.am (1.30):
+	  Use `pkglibdir' instead of hardcoding destination paths.  Install
+	  the OCaml interface in `pkglibdir', honoring the `--prefix'
+	  option.  Avoided a useless directive in the OCaml's Makefile.am:
+	  the serialization of the build is done correctly now thanks to
+	  the previous commit.
+
+2007-07-07 Saturday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.273): New Automake conditional HOST_CPU_X86_64.
+
+2007-07-07 Saturday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.272): Version number bumped.
+
+2007-07-07 Saturday 00:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.29): Try to fix Makefile.am so as
+	  to enforce the right dependencies even in the presence of
+	  parallel builds. To be checked.
+
+2007-07-06 Friday 15:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.28): Added option -f to cp and rm
+	  commands.
+
+2007-07-06 Friday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.13): File ppl_java_classes.cc
+	  is generated, hence should not be distributed.
+
+2007-07-06 Friday 13:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (1.30): Exploit macros is
+	  already available.  Remove wrong dependency from Polyhedron.java.
+
+2007-07-06 Friday 11:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am (1.32), Java/jni/Makefile.am (1.12),
+	  Java/ppl_java/Makefile.am (1.29), OCaml/Makefile.am (1.27),
+	  Prolog/Makefile.am (1.40), Java/tests/Makefile.am (1.14),
+	  Prolog/Ciao/Makefile.am (1.63), Prolog/GNU/Makefile.am (1.62),
+	  Prolog/SICStus/Makefile.am (1.74), Prolog/SWI/Makefile.am (1.69),
+	  Prolog/XSB/Makefile.am (1.49), Prolog/tests/Makefile.am (1.14),
+	  Prolog/YAP/Makefile.am (1.51): File
+	  ppl_interface_instatiations.m4 is a generated file, so it must be
+	  found in the build directory.
+
+2007-07-06 Friday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.24): Bug 246815 had been fixed: YAP
+	  support enabled again.
+
+2007-07-06 Friday 09:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.48): Small improvements -
+	  mainly to comments.
+
+2007-07-06 Friday 08:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.47): Improved the code
+	  testing large integers.
+
+2007-07-05 Thursday 22:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.46): Modified the test for
+	  large integers in the case that current_prolog_flag(bounded,
+	  true) holds.
+
+	  In this case, the generated large integer may wrap and any
+	  comparison with Max_int - obtained with
+	  current_prolog_flag(max_integer, Max_int) meaningless.
+
+	  So we also compare the generated integer with another number that
+	  is generated to be about half its size (and therefore already
+	  tested).
+
+2007-07-05 Thursday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.23): Disable YAP support until bug
+	  246815 is fixed.  Bug 243084 has been fixed: `ppl-swiprolog'
+	  dependency on `readline-devel' removed.
+
+2007-07-05 Thursday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.39): Distribute also
+	  ppl_prolog_common.icc.
+
+2007-07-05 Thursday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.22): The `gprolog' package is not
+	  available on ppc64: the GNU Prolog interface must thus be
+	  disabled for that architecture.
+
+2007-07-04 Wednesday 21:39  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.33): Removed some non
+	  used variables in the C++ side of the Java interface.
+
+2007-07-04 Wednesday 21:38  Andrea Cimino
+
+	* interfaces/: OCaml/Makefile.am (1.26), Java/tests/Makefile.am
+	  (1.13): Fixed the `dist' target in the OCaml and Java/test
+	  interfaces: included all the m4 generator interface files in
+	  EXTRA_DIST.  Do not distribute `ppl_ocaml.cc' because it's a
+	  generated source.
+
+2007-07-04 Wednesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.29): Added `m4' to `SUBDIRS'.
+
+2007-07-04 Wednesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.271): Version number bumped.
+
+2007-07-03 Tuesday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch, ppl.spec.in (ppl-0_9-branch.[4,21]): Use
+	  `%{buildroot}' consistently, instead of  `$RPM_BUILD_ROOT'.
+
+2007-07-02 Monday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.208), TODO (1.222), doc/definitions.dox (1.202): Use the
+	  UTF-8 encoding instead of ISO-8859.
+
+2007-07-01 Sunday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.221): Added an item concerning additional documentation.
+
+2007-07-01 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.220): Remember to pProvide PPL-specific documentation on
+	  the use of `make check' and `make uninstall'.
+
+2007-07-01 Sunday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.219): The Java interface has been improved: corresponding
+	  item removed.
+
+2007-06-30 Saturday 10:41  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.64): Use method instead of function.
+
+2007-06-29 Friday 22:25  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.42): Converted many Interval functions in
+	  methods.
+
+2007-06-29 Friday 22:20  Abramo Bagnara
+
+	* src/: Box.templates.hh (1.60), Interval.defs.hh (1.41): Converted
+	  many Interval functions in methods.
+
+2007-06-28 Thursday 12:18  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.40): Removed duplicate definition.
+
+2007-06-28 Thursday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.29), Watchdog/ltmain.sh (1.18): Updated from Libtool
+	  1.5.24.
+
+2007-06-13 Wednesday 18:31  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.26): Call the appropriate destructor if the underlined C++
+	  object is a NNC_Polyhedron or a C_Polyhedron.
+
+2007-06-12 Tuesday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.20): `%%check' removed.
+
+2007-06-12 Tuesday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch, ppl.spec.in (ppl-0_9-branch.[3,19]):
+	  `%%check' added.  Revised the description of the `devel' package.
+	  Include also the `TODO' file in the documentation of the main
+	  package.
+
+2007-06-12 Tuesday 20:25  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.32): Removed some
+	  useless calls in the Java interface.
+
+2007-06-12 Tuesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.18): Patch the `libtool' script after
+	  `%%configure' so as to fix the rpath issue.
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/README.swiprolog (simplex.1): file
+	  README.swiprolog was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/README.yap (simplex.1): file README.yap was
+	  added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/README.gprolog (1.2),
+	  SWI/README.swiprolog (1.2), YAP/README.yap (1.2): New
+	  documentation files.
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README.gprolog (simplex.1): file
+	  README.gprolog was added on branch simplex on 2008-01-07 11:15:30
+	  +0000
+
+2007-06-08 Friday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.17): %install commands revised.
+
+2007-06-08 Friday 18:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.270), Watchdog/configure.ac (1.37): Do not
+	  override the externally-provided CFLAGS and CXXFLAGS.
+
+2007-06-08 Friday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ax_prefix_config_h.m4 (simplex.1): file ax_prefix_config_h.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2007-06-08 Friday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.207), configure.ac (1.269), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.59), demos/ppl_lpsol/ppl_lpsol.c (1.69),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.10),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.16),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.4), m4/Makefile.am (1.26),
+	  m4/ac_check_fpu_control.m4 (1.4),
+	  m4/ac_cxx_double_binary_format.m4 (1.5),
+	  m4/ac_cxx_float_binary_format.m4 (1.4),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.5),
+	  m4/ax_prefix_config_h.m4 (1.1), src/BD_Shape.cc (1.6),
+	  src/BHRZ03_Certificate.cc (1.12), src/Bit_Matrix.cc (1.3),
+	  src/Bit_Row.cc (1.3), src/Bit_Row.inlines.hh (1.3), src/Box.cc
+	  (1.6), src/C_Integer.hh (1.4), src/C_Polyhedron.cc (1.21),
+	  src/Checked_Number.cc (1.12), src/Coefficient.cc (1.6),
+	  src/Coefficient.defs.hh (1.8), src/Coefficient.types.hh (1.15),
+	  src/Congruence.cc (1.15), src/Congruence_System.cc (1.24),
+	  src/Constraint.cc (1.66), src/Constraint_System.cc (1.23),
+	  src/DB_Row.defs.hh (1.23), src/DB_Row.inlines.hh (1.22),
+	  src/DB_Row.templates.hh (1.6), src/Float.cc (1.6),
+	  src/Float.defs.hh (1.25), src/Float.inlines.hh (1.30),
+	  src/GMP_Integer.inlines.hh (1.20), src/Generator.cc (1.74),
+	  src/Generator_System.cc (1.22), src/Grid_Certificate.cc (1.8),
+	  src/Grid_Generator.cc (1.20), src/Grid_Generator_System.cc
+	  (1.18), src/Grid_Status.cc (1.7), src/Grid_chdims.cc (1.17),
+	  src/Grid_conversion.cc (1.20), src/Grid_nonpublic.cc (1.25),
+	  src/Grid_public.cc (1.52), src/Grid_simplify.cc (1.33),
+	  src/Grid_widenings.cc (1.15), src/H79_Certificate.cc (1.11),
+	  src/Init.cc (1.30), src/Linear_Expression.cc (1.17),
+	  src/Linear_Row.cc (1.22), src/Linear_System.cc (1.43),
+	  src/MIP_Problem.cc (1.53), src/Matrix.cc (1.96),
+	  src/NNC_Polyhedron.cc (1.21), src/Octagonal_Shape.cc (1.5),
+	  src/Ph_Status.cc (1.13), src/Pointset_Ask_Tell.cc (1.3),
+	  src/Pointset_Powerset.cc (1.12), src/Poly_Con_Relation.cc (1.15),
+	  src/Poly_Gen_Relation.cc (1.15), src/Polyhedron_chdims.cc (1.43),
+	  src/Polyhedron_nonpublic.cc (1.78), src/Polyhedron_public.cc
+	  (1.93), src/Polyhedron_widenings.cc (1.62), src/Row.cc (1.103),
+	  src/Row.defs.hh (1.111), src/Row.inlines.hh (1.65),
+	  src/Scalar_Products.cc (1.8), src/Variable.cc (1.23),
+	  src/Variables_Set.cc (1.5), src/checked.cc (1.20),
+	  src/checked.inlines.hh (1.37), src/checked_float.inlines.hh
+	  (1.78), src/checked_int.inlines.hh (1.61),
+	  src/checked_mpz.inlines.hh (1.45), src/conversion.cc (1.82),
+	  src/fpu-c99.inlines.hh (1.14), src/fpu-sparc.inlines.hh (1.8),
+	  src/fpu.defs.hh (1.15), src/fpu.types.hh (1.5), src/globals.cc
+	  (1.27), src/minimize.cc (1.47), src/mp_std_bits.cc (1.4),
+	  src/ppl-config.cc.in (1.20), src/ppl_header.hh (1.6),
+	  src/simplify.cc (1.48), src/version.cc (1.9), tests/FCAIBVP.cc
+	  (1.4), tests/Partial_Function.cc (1.5), tests/ppl_test.cc (1.9),
+	  tests/ppl_test.hh (1.63), tests/print.hh (1.41),
+	  tests/Polyhedron/memory1.cc (1.12), tests/Polyhedron/memory2.cc
+	  (1.14), utils/timings.cc (1.9): The `ppl.hh' header file no
+	  longer defines macros not prefixed by "PPL_".
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ax_prefix_config_h.m4 (simplex.1): file
+	  ax_prefix_config_h.m4 was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.28), NEWS (1.9), configure.ac (1.36),
+	  m4/.cvsignore (1.1), m4/Makefile.am (1.1),
+	  m4/ax_prefix_config_h.m4 (1.1), src/Makefile.am (1.10),
+	  src/Pending_Element.cc (1.4), src/Pending_List.cc (1.4),
+	  src/Time.cc (1.4), src/Watchdog.cc (1.6), src/Watchdog.defs.hh
+	  (1.5), src/pwl_header.hh (1.4): The `pwl.hh' header file no
+	  longer defines macros not prefixed by "PWL_".
+
+2007-06-07 Thursday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.16): Apply both patches.
+
+2007-06-07 Thursday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.15): Fixed the command to remove all
+	  installed *.la files.
+
+2007-06-07 Thursday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.14): Remove installed *.la files.
+	  Added a `ppl-0.9-configure.patch' to avoid overriding CFLAGS and
+	  CXXFLAGS.
+
+2007-06-07 Thursday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.13): All the static archives are now
+	  in `*-static' packages.  Packages `ppl-gprolog-devel',
+	  `ppl-swiprolog-devel' and `ppl-yap-devel' renamed `ppl-gprolog',
+	  `ppl-swiprolog' and `ppl-yap', respectively.	As a workaround for
+	  a bug in the `pl' package (Bugzilla Bug 243084) `ppl-swiprolog'
+	  is now dependent on `readline-devel'.  Added `%%dir
+	  %%{_datadir}/doc/%%{name}'.  The `ppl-user-0.9-html'
+	  documentation directory is now properly listed.
+
+2007-06-06 Wednesday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.12): Use `%{_includedir}' and
+	  `%{_libdir}' instead of `/usr/include' and `/usr/lib',
+	  respectively.  Use `%{_datadir}/doc/%{name}' instead of
+	  `/usr/share/doc/ppl'.  Replaced `%defattr(-,root,root)' with
+	  `%defattr(-,root,root,-)'.  (Thanks to Mamoru Tasaka.)
+
+2007-06-05 Tuesday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.27): Shadowing avoided.
+
+2007-06-05 Tuesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.31): Useless break's
+	  and braces removed.  Indentation fixed in several places.
+
+2007-06-05 Tuesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.140): Make sure
+	  Polyhedron::space_dimension() is defined before being used.
+
+2007-05-29 Tuesday 08:05  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.16): In the generated Java tests, for each method that returns
+	  a non void type, a corresponding variable of the appropriate type
+	  is declared and assigned to the value that the method returns.
+	  Removed a redundant `ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code
+	  section.
+
+2007-05-28 Monday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.206): Updated.
+
+2007-05-28 Monday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.24): Fixed the generation of relation_with() methods.
+
+2007-05-28 Monday 06:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.defs.hh (1.34), MIP_Problem.inlines.hh (1.15):
+	  Removed method hash_code().
+
+2007-05-24 Thursday 07:56  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.15): Using `hashcode' instead of `hash'.  Spurious blank space
+	  removed.
+
+2007-05-23 Wednesday 23:11  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.14): Fixed a typo.
+
+2007-05-23 Wednesday 23:07  Andrea Cimino
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.7),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.25),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.23), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.13): In the Java interface provided, for most of the PPL
+	  classes, the methods `equals(Object y)' and `hashCode()'.
+
+2007-05-23 Wednesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.12), Ask_Tell.defs.hh (1.16),
+	  BD_Shape.defs.hh (1.99), BD_Shape.inlines.hh (1.143),
+	  Grid.defs.hh (1.48), Grid.inlines.hh (1.14), MIP_Problem.defs.hh
+	  (1.33), MIP_Problem.inlines.hh (1.14), Octagonal_Shape.defs.hh
+	  (1.28), Octagonal_Shape.inlines.hh (1.16),
+	  Pointset_Ask_Tell.defs.hh (1.9), Pointset_Ask_Tell.inlines.hh
+	  (1.4), Pointset_Powerset.defs.hh (1.17), Polyhedron.defs.hh
+	  (1.317), Polyhedron.inlines.hh (1.139): All PPL semantic objects
+	  now provide the method
+
+	       int32_t hash_code() const
+
+	  returning a 32-bit hash code for *this.  If x and y are such that
+	  x == y evaluates to true, so does x.hash_code() == y.hash_code().
+
+2007-05-21 Monday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.170): Distribute also meta_programming.hh and
+	  Temp.defs.hh.
+
+2007-05-21 Monday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.28), Watchdog/ltmain.sh (1.17): Updated from Libtool
+	  1.5.23b.
+
+2007-05-21 Monday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.218): Added one item concerning the Java interface.
+	  (Thanks to Fausto Spoto.)
+
+2007-05-18 Friday 07:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mapspacedims1.cc (1.14): New test added.
+
+2007-05-15 Tuesday 09:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.268): Version number bumped.
+
+2007-05-10 Thursday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.8): The former `prolog_atoms' array is now called
+	  `prolog_interface_atoms'.
+
+2007-04-11 Wednesday 06:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.15): List cm_cleaner.sh and cm_splitter.sh
+	  in dist_noinst_SCRIPTS, not noinst_SCRIPTS (problem reported by
+	  Stefano Soffia).
+
+2007-04-03 Tuesday 18:04  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.90), Checked_Number.inlines.hh
+	  (1.74), checked.defs.hh (1.41), checked_ext.inlines.hh (1.38),
+	  checked_float.inlines.hh (1.77), checked_int.inlines.hh (1.60),
+	  checked_mpq.inlines.hh (1.41), checked_mpz.inlines.hh (1.44):
+	  Added idiv.
+
+2007-04-03 Tuesday 14:47  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (1.52): Corrected the method
+	  Octagonal_Shape::relation_with(c) when the Octagonal_Shape is
+	  based on integer coefficients and when the constraint `c' is `1
+	  == 0'.
+
+2007-04-03 Tuesday 14:43  Elena Mazzi
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (1.6): Added two new
+	  tests on `Octagonal_Shape::relation_with(c)'.  Test18() shows a
+	  bug in relation_with(const Constraint& c) when the constraint `c'
+	  is `1 == 0'.
+
+2007-04-03 Tuesday 12:17  Elena Mazzi
+
+	* tests/Octagonal_Shape/: Makefile.am (1.18), fromspacedim1.cc
+	  (1.1): New test program fromspacedim1.cc tests
+	  Octagonal_Shape<N>::Octagonal_Shape(dimension_type,
+	  Degenerate_Element).
+
+2007-04-03 Tuesday 11:44  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.64), fromspacedim1.cc (1.1): New
+	  test program fromspacedim1.cc tests
+	  BD_Shape<N>::BD_Shape(dimension_type, Degenerate_Element).
+
+2007-04-01 Sunday 18:57  Abramo Bagnara
+
+	* TODO (1.217): Fixed and cleaned TODO description.
+
+2007-04-01 Sunday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.216): Added a new item concerning possible aliasing in
+	  the arguments of a function.
+
+2007-04-01 Sunday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.215): Added new item concerning rem() and remp().
+
+2007-04-01 Sunday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.46), ppl_prolog_common.icc (1.7), track_allocation.hh (1.22):
+	  Avoided conflicts with symbols defined in the new versions of
+	  CiaoDE.
+
+2007-03-31 Saturday 19:27  Abramo Bagnara
+
+	* src/fpu.defs.hh (1.14): Give priority to faster architecture
+	  dependent fpu control.
+
+2007-03-26 Monday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.76): On platforms not providing
+	  rintl() and not providing proper long doubles, make the
+	  assumption that long double and double are the same type and use
+	  rint() instead of rintl().
+
+2007-03-25 Sunday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.201): Corrected a wrong sign in the
+	  paragraph about "Images and Preimages of Affine Transfer
+	  Relations."
+
+2007-03-25 Sunday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.267), m4/Makefile.am (1.25),
+	  m4/ac_cxx_proper_long_double.m4 (1.1): Check whether the C++
+	  compiler provides proper long doubles.
+
+2007-03-24 Saturday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.6): Fixed test18() and
+	  test19().  Drafted test20().
+
+2007-03-21 Wednesday 11:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.2): Test modified so as to
+	  propagate overflows and therefore interact correctly with macro
+	  DO_TEST_OVERFLOW. The test overflows when using 8-bit
+	  coefficients.
+
+2007-03-21 Wednesday 10:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.8): Test test02() does not overflow with
+	  64 bits integers.
+
+2007-03-20 Tuesday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frombox1.cc (1.2): Test test05() overflows with all
+	  bounded coefficients.
+
+2007-03-20 Tuesday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.59): Use DIRTY_TEMP when allocating a
+	  temporary Coefficient or mpq_class object.  Use properly typed
+	  temporaries in max_min(), so as to avoid errors when configured
+	  to used bounded integer coefficients.
+
+2007-03-19 Monday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.58): Excessively optimistic assertions
+	  just introduced replaced by canonicalization, which is required.
+	  In the constructor of a Box from a polyhedron, do use Coefficient
+	  temporaries when invoking the MIP solver.
+
+2007-03-19 Monday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.52): The excessively optimistic assertions
+	  just introduced replaced by canonicalization, which is indeed
+	  required.
+
+2007-03-19 Monday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.57): Useless canonnicalizations of mpq
+	  rationals replaced by assertions.  Simplified part of the code
+	  for the construction of a Box starting from a generator system.
+	  Avoid a couple of useless temporaries.
+
+2007-03-19 Monday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.92): A comment about the canonical
+	  form of an mpq rational supported by corresponding assertion.
+
+2007-03-19 Monday 15:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.51): A few useless canonicalizations of mpq
+	  rationals replaced by assertions.
+
+2007-03-19 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.35), frombdshape1.cc (1.1): Test
+	  Box::Box(const BD_Shape&, Complexity_Class).
+
+2007-03-19 Monday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: globals.cc (1.26), globals.defs.hh (1.47): Removed useless
+	  inline directives in function declarations that are not
+	  definitions. Added helper function   bool is_canonical(const
+	  mpq_class& ); to be used in assertions.
+
+2007-03-19 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh (1.47): Grid::Grid(const Box<Interval>&) made
+	  explicit.
+
+2007-03-19 Monday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.56): Fixed Box<Interval>::Box(const
+	  BD_Shape<T>&, Complexity_Class).
+
+2007-03-19 Monday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.55): We were using Interval::lower_set()
+	  instead of Interval::lower_set_uninit() in
+	  Box<Interval>::Box(const BD_Shape<T>&, Complexity_Class).
+	  Several assert(OK()) were missing.
+
+2007-03-18 Sunday 17:26  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.40): Removed unused formal
+	  argument.
+
+2007-03-18 Sunday 16:53  Abramo Bagnara
+
+	* src/: checked_int.inlines.hh (1.59), checked_mpq.inlines.hh
+	  (1.39), checked_mpz.inlines.hh (1.43): Fixed construct from
+	  special value.
+
+2007-03-18 Sunday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.34), frombox1.cc (1.1): Test
+	  Box<Interval>::Box(const Box<Other_Interval>&).
+
+2007-03-18 Sunday 14:01  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.38): Removed unused argument.
+
+2007-03-18 Sunday 13:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.54): Added tests against exceeding the
+	  maximum space dimension.  Optimized
+	  Box<Interval>::add_space_dimensions_and_project(dimension_type).
+
+2007-03-18 Sunday 12:21  Abramo Bagnara
+
+	* src/Box.templates.hh (1.53): Fixed typo.
+
+2007-03-18 Sunday 12:13  Abramo Bagnara
+
+	* src/Box.templates.hh (1.52): Cleaned Box constructor from Grid.
+
+2007-03-18 Sunday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.51): Added tests against exceeding the
+	  maximum space dimension.
+
+2007-03-18 Sunday 12:02  Abramo Bagnara
+
+	* src/Box.templates.hh (1.50): Cleaned Box constructor from
+	  Octagon.
+
+2007-03-18 Sunday 11:59  Abramo Bagnara
+
+	* src/Box.templates.hh (1.49): Cleaned Box constructor from
+	  Polyhedron.
+
+2007-03-18 Sunday 11:41  Abramo Bagnara
+
+	* src/Box.templates.hh (1.48): Substituted refine with narrow in
+	  refine_no_check.
+
+2007-03-18 Sunday 11:34  Abramo Bagnara
+
+	* src/: Box.templates.hh (1.47), Checked_Number.defs.hh (1.89),
+	  Checked_Number.inlines.hh (1.73), checked_ext.inlines.hh (1.37),
+	  checked_float.inlines.hh (1.75): Added support for inexact
+	  checking.
+
+2007-03-18 Sunday 11:05  Abramo Bagnara
+
+	* src/Box.templates.hh (1.46): Fixed comparison.
+
+2007-03-18 Sunday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.45): Marked the places in
+	  Box<Interval>::refine_no_check(const Constraint&) where the
+	  inexact flag must be reset.
+
+2007-03-18 Sunday 11:01  Abramo Bagnara
+
+	* src/Box.templates.hh (1.44): Undone last commit.
+
+2007-03-18 Sunday 10:54  Abramo Bagnara
+
+	* src/Box.templates.hh (1.43): Fixed comparison.
+
+2007-03-18 Sunday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.42): Box<Interval>::Box(const
+	  Generator_System&) simplified and adorned with FIXMEs.
+
+2007-03-18 Sunday 10:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.41): Box<Interval>::Box(const
+	  Box<Other_Interval>&) simplified.
+
+2007-03-18 Sunday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.25), src/Box.templates.hh (1.40),
+	  tests/Box/Makefile.am (1.33), tests/Box/fromspacedim1.cc (1.1):
+	  Box<Interval>::Box(dimension_type, Degenerate_Element) rewritten
+	  exploiting the fact that marked empty boxes do not impose any
+	  constraint on the intervals apart from the fact that their memory
+	  has been allocated.  Box<Interval>::OK() has been changed
+	  accordingly.	New test program fromspacedim1.cc tests
+	  Box<Interval>::Box(dimension_type, Degenerate_Element).
+	  Box<Interval>::Box(const BD_Shape<T>&, Complexity_Class) modified
+	  to exploit the new interval construction mechanisms.
+
+2007-03-18 Sunday 08:40  Abramo Bagnara
+
+	* src/: BD_Shape.inlines.hh (1.142), BD_Shape.templates.hh (1.76),
+	  Boundary.defs.hh (1.7), Box.inlines.hh (1.17), Box.templates.hh
+	  (1.39), Checked_Number.cc (1.11), Checked_Number.defs.hh (1.88),
+	  Checked_Number.inlines.hh (1.72), DB_Matrix.inlines.hh (1.32),
+	  DB_Row.templates.hh (1.5), Interval.defs.hh (1.39),
+	  Interval_Info.defs.hh (1.4), Interval_Restriction.defs.hh (1.5),
+	  OR_Matrix.inlines.hh (1.7), Octagonal_Shape.inlines.hh (1.15),
+	  Octagonal_Shape.templates.hh (1.51), Temp.defs.hh (1.4),
+	  checked.defs.hh (1.40), checked.inlines.hh (1.36),
+	  checked_ext.inlines.hh (1.36), checked_float.inlines.hh (1.74),
+	  checked_int.inlines.hh (1.58), checked_mpq.inlines.hh (1.37),
+	  checked_mpz.inlines.hh (1.42), checked_numeric_limits.hh (1.20),
+	  globals.defs.hh (1.46), meta_programming.hh (1.5): Removed
+	  special values classes. Changed interface to interval
+	  construction and modify.
+
+2007-03-17 Saturday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.9): test01(), test03() and test04() will
+	  fail with 8-bit coefficients.
+
+2007-03-16 Friday 21:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.7): Restored test02().
+
+2007-03-16 Friday 20:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.8): Completed test07().
+
+2007-03-16 Friday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.38): Removed spurious assignment `t_bound
+	  = 0' from Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-16 Friday 19:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.7): Test test07() shows a bug in refine()
+	  when handling an equality constraint.
+
+2007-03-16 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.6): Fixed test06().
+
+2007-03-16 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.81), devref.doxyconf-latex.in
+	  (1.20): Updated the list of files from which to harvest the
+	  documentation for developers.
+
+2007-03-16 Friday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.5): New test added.
+
+2007-03-16 Friday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.24), Box.templates.hh (1.37): Comment with
+	  the implementation details of
+	  Box<Interval>::refine_no_check(const Constraint&) adapted to
+	  Doxygen and moved before the declaration in Box.defs.hh.
+
+2007-03-16 Friday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (1.27): Fixed some Doxygen
+	  references.
+
+2007-03-16 Friday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.2),
+	  devref-c-interface.doxyconf-latex.in (1.2),
+	  devref-prolog-interface.doxyconf-html.in (1.2),
+	  devref-prolog-interface.doxyconf-latex.in (1.2),
+	  devref.doxyconf-html.in (1.80), devref.doxyconf-latex.in (1.19),
+	  user-c-interface.doxyconf-html.in (1.2),
+	  user-c-interface.doxyconf-latex.in (1.2),
+	  user-prolog-interface.doxyconf-html.in (1.2),
+	  user-prolog-interface.doxyconf-latex.in (1.2),
+	  user.doxyconf-html.in (1.39), user.doxyconf-latex.in (1.10):
+	  Updated for the new versions of Doxygen.
+
+2007-03-13 Tuesday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.23), Box.templates.hh (1.36): New
+	  implementation of Box<Interval>::refine_no_check(const
+	  Constraint&).  Added declaration and fake definition for
+	  Box<Interval>::limited_CC76_extrapolation_assign(const Box&,
+	  const Constraint_System&, unsigned).
+
+2007-03-13 Tuesday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.38): New template <typename
+	  Interval_Boundary_Type> struct Select_Temp_Boundary_Type is an
+	  helper class to select the appropriate numerical type to perform
+	  boundary computations so as to reduce the chances of overflow
+	  without incurring too much overhead.
+
+2007-03-13 Tuesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.6): Temporarily disabled test02().
+
+2007-03-13 Tuesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.4): Improved test01().
+
+2007-03-13 Tuesday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/relations1.cc (1.17), BD_Shape/relations2.cc
+	  (1.21), BD_Shape/relations3.cc (1.25),
+	  Octagonal_Shape/relatwithcons1.cc (1.3),
+	  Octagonal_Shape/relatwithcons2.cc (1.5),
+	  Octagonal_Shape/relatwithgen1.cc (1.7): Output made consistent
+	  with the rest of the testsuite.
+
+2007-03-13 Tuesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.16),
+	  Pointset_Powerset.templates.hh (1.13): Added void
+	  Pointset_Powerset<PS>::refine(const Constraint&) and void
+	  Pointset_Powerset<PS>::refine(const Constraint_System&).
+
+2007-03-13 Tuesday 15:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.75): Corrected the method
+	  BD_Shape::relation_with(c) when the BD_Shape is based on integer
+	  coefficients and when the constraint `c' is `1 == 0'.
+
+2007-03-13 Tuesday 15:49  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.63), relations3.cc (1.24): Test
+	  relations3 abled. Added test17() that shows a bug in
+	  BD_Shape::relation_with(const Constraint& c) when the constraint
+	  `c' is `1 == 0'.
+
+2007-03-13 Tuesday 14:57  quartieri
+
+	* src/Octagonal_Shape_strong_closure4.hh (octagons.3): Removed a
+	  useless code line.
+
+2007-03-13 Tuesday 14:55  quartieri
+
+	* tests/Octagonal_Shape/: Makefile.am, universal_incremental.cc,
+	  universal_strong.cc (octagons.[4,1,1]): Added new tests on
+	  strong_closure() and incremental_strong_closure().
+
+2007-03-13 Tuesday 12:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bhrz03widening3.cc (1.14): Test test10()
+	  completed and restored.
+
+2007-03-13 Tuesday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.61): Applied a workaround in
+	  private method select_H79_constraints() so as to correctly deal
+	  with NNC polyhedra. A too strong assertion made weaker: due to
+	  the value of the epsilon coordinate, the sign of the scalar
+	  product can be anything when the polyhedra are NNC, the
+	  constraint from x is strict and the generator from y is a point.
+
+2007-03-13 Tuesday 09:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Scalar_Products.cc (1.7): Added the definition of a
+	  Scalar_Product::assign() variant that was declared but not
+	  implemented.
+
+2007-03-12 Monday 20:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bhrz03widening3.cc (1.13): Test test10() greatly
+	  simplified, while still showing the assertion violation.
+
+2007-03-12 Monday 16:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/bhrz03widening3.cc (1.12): Added a test showing
+	  an assertion violation for the BHRZ03 widening.
+
+2007-03-12 Monday 14:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.35): Th eimplementation of affine_image
+	  and affine_preimage changed so as to use Tmp_Interval_Type. Also
+	  corrected a type in affine_preimage.
+
+2007-03-12 Monday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.22): Added typedef Tmp_Interval_Type for the
+	  interval datatype that has to be used when performing internal
+	  computations and trying to avoid the accumulation of rounding
+	  errors. As for now, this is defined to be the same as Interval.
+
+2007-03-11 Sunday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.15),
+	  Pointset_Powerset.templates.hh (1.12): Added method bool
+	  contains_integer_point() const.
+
+2007-03-11 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (1.2): No longer mention
+	  README.configure.
+
+2007-03-10 Saturday 23:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.3): Expected results fixed.
+
+2007-03-10 Saturday 23:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.32), refine3.cc (1.1): New test that
+	  triggers a bug in the Box class.
+
+2007-03-10 Saturday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.5): test02() fails with 64-bit or smaller
+	  coefficients.
+
+2007-03-10 Saturday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.21), Box.inlines.hh (1.16): Assignment
+	  operator added.
+
+2007-03-10 Saturday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.81): Fixed a couple of comments.
+
+2007-03-10 Saturday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.62): For boxes, check_result_i() prints now
+	  more information in case containment does not hold.
+
+2007-03-10 Saturday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.4): Tests that do not require a watchdog
+	  timer moved to refine1.cc.  Remaining tests improved:
+	  known_result computed precisely and reduced the compilation time
+	  by resorting to ascii_load() methods.
+
+2007-03-10 Saturday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.2): Tests that do not require a watchdog
+	  timer moved from refine1.cc.
+
+2007-03-10 Saturday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.37): Drafted bool
+	  ascii_load(std::istream&) and template <typename Boundary,
+	  typename Info> std::istream& operator>>(std::istream&
+	  Interval<Boundary, Info>&).
+
+2007-03-09 Friday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.34): Fixed Box<Interval>::Box(const
+	  Box<Other_Interval>&).
+
+2007-03-09 Friday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.33): Improved
+	  Box<Interval>::ascii_dump(std::ostream&).
+
+2007-03-09 Friday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.36): Interval::ascii_dump(ostream&)
+	  correctly (and simply) implemented.
+
+2007-03-09 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/: Makefile.am (1.3), mipproblem1.cc (1.4),
+	  mipproblem2.cc (1.1): New program mipproblem2.cc to test the
+	  MIP_Problem class with instances that require a watchdog timer.
+	  Test from mipproblem1.cc adapted and moved here.
+
+2007-03-09 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.50): The maybe_abandon() function is now
+	  called in the right places.
+
+2007-03-09 Friday 18:07  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.49): Call `maybe_abandon()' each time a new
+	  vertex is explored.
+
+2007-03-09 Friday 18:02  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.48): Call `maybe_abandon()' each time the
+	  simplex algorithm is involved.
+
+2007-03-09 Friday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.3): Completed test01().  Four more tests
+	  added (one of them is currently disabled, as it seems to trigger
+	  a bug somewhere).
+
+2007-03-09 Friday 15:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.31), cc76narrowing1.cc (1.4): Restored
+	  test cc76narrowing1.
+
+2007-03-09 Friday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.20), Box.templates.hh (1.32): Drafted
+	  implementation of CC76_narrowing_assign().
+
+2007-03-09 Friday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.30): Restored bgp99extrapolation1 and
+	  bhz03widening1.
+
+2007-03-09 Friday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.29), maxspacedim1.cc (1.4): Restored
+	  test maxspacedim1.cc.
+
+2007-03-09 Friday 14:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.28): Restored test affinepreimage1.cc.
+
+2007-03-09 Friday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/affineimage1.cc (1.6): Distances recomputed for test08.
+
+2007-03-09 Friday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/cc76extrapolation1.cc (1.18),
+	  Octagonal_Shape/cc76extrapolation1.cc (1.4): Use the new typedef
+	  coefficient_type_base.
+
+2007-03-09 Friday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.98), Grid.defs.hh (1.46),
+	  Octagonal_Shape.defs.hh (1.26), Polyhedron.defs.hh (1.316): Added
+	  public typedef coefficient_type to Polyhedron and Grid.  Typedef
+	  base_type renamed as coefficient_base_type for BDSs and OSs.
+
+2007-03-09 Friday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.27), affineimage1.cc (1.5): Test
+	  affineimage1.cc restored.
+
+2007-03-09 Friday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (1.5): Use new macro.
+
+2007-03-09 Friday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.61): Filled in the stub implementation of
+	  check_result for Box.  Macro DO_TEST_MAY_OVERFLOW_IF_FLOAT
+	  improved and renamed as DO_TEST_MAY_OVERFLOW_IF_INEXACT.
+
+2007-03-09 Friday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.15), Box.templates.hh (1.31): Added
+	  implementations of functions computing distances between boxes.
+
+2007-03-09 Friday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.19): Added declarations for functions that
+	  compute distances between boxes.
+
+2007-03-09 Friday 08:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.37): Added a paragraph describing DO_TEST_Fxxx
+	  macros.
+
+2007-03-08 Thursday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.73): Removed trailing whitespace.
+
+2007-03-08 Thursday 16:30  quartieri
+
+	* tests/Octagonal_Shape/incremental1.cc (octagons.3): Removed debug
+	  informations.
+
+2007-03-08 Thursday 15:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (1.4): Tests test07() and test08() may
+	  overflow when TBox has been instantiated with a floating point
+	  datatype.
+
+2007-03-08 Thursday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.60): Added macro DO_TEST_OVERFLOW which
+	  checks that a failure in a test is actually motivated by an
+	  overflow. The new macro used instead of DO_TEST_F (which was
+	  accepting any kind of failure) when defining macros DO_TEST_Fxx.
+
+	  Added new macro DO_TEST_MAY_OVERFLOW_WITH_FLOAT to be used when a
+	  test may cause an overflow only when one of the domains
+	  supporting floating points (i.e., Box, BD_Shape and
+	  Octagonal_Shape) is actually instantiated with a floating point
+	  datatype.
+
+2007-03-08 Thursday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: relations1.cc (1.4), relations2.cc (1.2): Noisy
+	  output standardized.
+
+2007-03-08 Thursday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.2): Fixed test01().
+
+2007-03-08 Thursday 14:11  quartieri
+
+	* tests/Octagonal_Shape/incremental1.cc (octagons.2): Truncate
+	  random coefficients to 1000.
+
+2007-03-08 Thursday 13:41  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[18,57]): Unused function removed.
+
+2007-03-08 Thursday 13:39  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[17,56]): Added a temporary function to count the
+	  infinities in the Octagonal_Shape.
+
+2007-03-08 Thursday 13:03  quartieri
+
+	* src/: Octagonal_Shape.templates.hh,
+	  Octagonal_Shape_incremental_strong_closure1.hh,
+	  Octagonal_Shape_incremental_strong_closure10.hh,
+	  Octagonal_Shape_incremental_strong_closure4.hh,
+	  Octagonal_Shape_incremental_strong_closure5.hh,
+	  Octagonal_Shape_incremental_strong_closure6.hh,
+	  Octagonal_Shape_incremental_strong_closure7.hh,
+	  Octagonal_Shape_incremental_strong_closure8.hh,
+	  Octagonal_Shape_incremental_strong_closure9.hh,
+	  Octagonal_Shape_strong_closure1.hh,
+	  Octagonal_Shape_strong_closure2.hh,
+	  Octagonal_Shape_strong_closure4.hh, script_flags.hh
+	  (octagons.[55,4,5,4,4,4,4,4,4,2,3,2,2]): Added possibility to
+	  count operations.
+
+2007-03-08 Thursday 13:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Box.hh (1.5), tests/ppl_test.hh (1.59): Intervals
+	  used in the Box class can be empty.
+
+2007-03-08 Thursday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.214): Adde another entry.
+
+2007-03-08 Thursday 13:02  quartieri
+
+	* src/: Octagonal_Shape_incremental_strong_closure2.hh,
+	  Octagonal_Shape_incremental_strong_closure3.hh (octagons.[4,4]):
+	  Corrected both incomplete algorithms.
+
+2007-03-08 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.108): Use special flags only for
+	  the compilation of Watchdog1.
+
+2007-03-08 Thursday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (1.14), src/Box.templates.hh (1.30),
+	  tests/Box/Makefile.am (1.26), tests/Box/addconstraints1.cc (1.7),
+	  tests/Box/refine1.cc (1.1), tests/Box/refine2.cc (1.1): Drafted a
+	  first version of Box<Interval>::refine_no_check(const
+	  Constraint_System&).	New test programs refine1.cc and
+	  refine2.cc: the latter is for tests possibly requiring a watchdog
+	  timer.
+
+2007-03-07 Wednesday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.141), BD_Shape.templates.hh (1.74):
+	  Reverted previous change (i.e., restored implementation of
+	  time_elapse exploiting polyhedra).
+
+2007-03-07 Wednesday 17:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/timeelapse1.cc (1.19): New test shows a bug in the
+	  (just added) direct implementation of
+	  BD_Shape<T>::time_elapse_assign().
+
+2007-03-07 Wednesday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.140), BD_Shape.templates.hh (1.73):
+	  The implementation of method BD_Shape<T>::time_elapse_assign() no
+	  longer relies on the corresponding method of class Polyhedron.
+
+2007-03-07 Wednesday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.cc (1.5), Box.defs.hh (1.18), Box.templates.hh (1.29):
+	  Interface of private method extract_interval_constraint() made
+	  more intuitive.  Consequently adapted methods
+	  add_constraint_no_check() and relation_with().
+
+2007-03-06 Tuesday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.28), tests/Box/addconstraints1.cc (1.6):
+	  Revised Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-06 Tuesday 21:15  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.6): Moved assert to right place.
+
+2007-03-06 Tuesday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.27): Revised void
+	  Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-06 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.17), src/Box.inlines.hh (1.13),
+	  src/Box.templates.hh (1.26), tests/Box/addconstraints1.cc (1.5):
+	  Added the declarations for void Box<Interval>::refine(const
+	  Constraint&) and void Box<Interval>::refine(const
+	  Constraint_System&).	Drafted an implementation for the former.
+	  Commented-out test06() in tests/Box/addconstraints1.cc is meant
+	  to test it (will be moved elsewhere when the final name of the
+	  method is decided).
+
+2007-03-06 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/pointsetpowerset1.cc (1.2): Started drafting a couple
+	  of new tests.
+
+2007-03-06 Tuesday 12:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.25): Restored test timeelapse1.cc.
+
+2007-03-06 Tuesday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.16), Box.templates.hh (1.25): Drafted
+	  implementation for time_elapse_assign().
+
+2007-03-06 Tuesday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.12): Call
+	  Parma_Polyhedra_Library::max_space_dimension().
+
+2007-03-06 Tuesday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/max_space_dimension.hh (1.12): Take boxes into account (with
+	  FIXME).
+
+2007-03-06 Tuesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (octagons.14): If EXTRA_ROW_DEBUG is not
+	  defined, define it to 0, not 1.
+
+2007-03-06 Tuesday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.107), writeconsys1.cc (1.10):
+	  Test completed and FIXME resolved.
+
+2007-03-06 Tuesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (1.10): FIXME resolved.
+
+2007-03-06 Tuesday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/writerelation1.cc (1.12): This test program was
+	  not testing anything: fixed.
+
+2007-03-05 Monday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (1.3): This test program
+	  was not testing anything: fixed.
+
+2007-03-05 Monday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (1.3): This test program was not
+	  testing anything: fixed.
+
+2007-03-05 Monday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/writebdshape1.cc (1.9): This test program was not
+	  testing anything: fixed.
+
+2007-03-05 Monday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Direct_Product.inlines.hh (1.30), Grid.defs.hh (1.45),
+	  Grid.templates.hh (1.30): Method Grid::get_covering_box() now
+	  takes as parameter a reference to an object of class
+	  Parma_Polyhedra_Library::Box.
+
+2007-03-05 Monday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.45): No longer use private Box methods.
+
+2007-03-05 Monday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.15), Box.inlines.hh (1.12), Grid.defs.hh
+	  (1.44): Got rid of methods Box::raise_lower_bound() and
+	  Box::lower_upper_bound().
+
+2007-03-05 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.14), Box.inlines.hh (1.11): Privatized const
+	  Interval& Box<Interval>::operator[](dimension_type k) const.
+	  Drafted const Interval& Box<Interval>::get_interval(Variable)
+	  const and void Box<Interval>::set_interval(Variable, const
+	  Interval&).
+
+2007-03-05 Monday 17:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: coveringbox1.cc (1.15), coveringbox2.cc (1.13),
+	  directproduct1.cc (1.27): Removed raise_lower_bound and
+	  lower_upper_bound
+
+2007-03-05 Monday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.13), Box.inlines.hh (1.10): Added
+	  declaration and fake definitions for bool
+	  Box<Interval>::box_hull_assign_if_exact(const Box&) and bool
+	  Box<Interval>::upper_bound_assign_if_exact(const Box&).
+
+2007-03-05 Monday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.24), fromdirectproduct1.cc (1.4):
+	  Program fromdirectproduct1.cc revised (with one FIXME) and
+	  activated.
+
+2007-03-04 Sunday 23:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.19): Even test03() overflows when
+	  using 16 bit checked integers.
+
+2007-03-04 Sunday 23:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.18): Another test showing that even
+	  two applications of Floyd-Warshall may not be enough to obtain
+	  shortest path closure when using floating points.
+
+2007-03-04 Sunday 23:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.17): Test test02() overflows when
+	  using 16bit checked integers.
+
+2007-03-04 Sunday 23:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.16): Test test02() shows a simple
+	  example where the Floyd-Warshall algorithm fails to compute
+	  shortest path closure due to floating point approximations.
+
+2007-03-04 Sunday 22:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.30): Remove
+	  unwanted previously commented m4 code.
+
+2007-03-04 Sunday 22:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.44): Remove temporarily commented old code.
+
+2007-03-04 Sunday 22:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.43): Avoid generating code "From_Bounding_Box" Also avoid
+	  using raise_lower_bound and lower_upper_bound.
+
+2007-03-04 Sunday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.205), interfaces/C/ppl_interface_generator_c_cc_code.m4
+	  (1.15), interfaces/C/ppl_interface_generator_c_cc_preamble (1.9),
+	  src/C_Polyhedron.defs.hh (1.47), src/C_Polyhedron.inlines.hh
+	  (1.35), src/Direct_Product.defs.hh (1.34),
+	  src/Direct_Product.inlines.hh (1.29), src/Grid.defs.hh (1.43),
+	  src/Grid.templates.hh (1.29), src/NNC_Polyhedron.defs.hh (1.49),
+	  src/NNC_Polyhedron.inlines.hh (1.36), src/globals.defs.hh (1.45),
+	  tests/ppl_test.hh (1.58), tests/Box/fromgrid1.cc (1.4),
+	  tests/Box/frompolyhedron2.cc (1.8), tests/Grid/boundingbox1.cc
+	  (1.18), tests/Grid/directproduct1.cc (1.26),
+	  tests/Polyhedron/frombox1.cc (1.3), tests/Polyhedron/frombox2.cc
+	  (1.3): The constructors
+
+	    template <typename Box> C_Polyhedron(const Box&,
+	  From_Bounding_Box),
+	    template <typename Box> NNC_Polyhedron(const Box&,
+	  From_Bounding_Box) and
+	    template <typename Box> Grid(const Box&, From_Bounding_Box)
+
+	  have been removed in favor of
+
+	    template <typename Interval> C_Polyhedron(const
+	  Box<Interval>&),
+	    template <typename Interval> NNC_Polyhedron(const
+	  Box<Interval>&) and
+	    template <typename Interval> Grid(const Box<Interval>&).
+
+2007-03-04 Sunday 18:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.templates.hh (1.28), tests/Grid/boundingbox1.cc (1.17):
+	  Use add_constraint() instead of raise_lower_bound() and
+	  lower_upper_bound()
+
+2007-03-04 Sunday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.23): Testing with intervals with long
+	  double boundaries enabled again.
+
+2007-03-04 Sunday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.24): Fixed Box<Interval>::max_min().
+
+2007-03-04 Sunday 17:43  Abramo Bagnara
+
+	* src/: Boundary.defs.hh (1.5), Checked_Number.defs.hh (1.87),
+	  Checked_Number.inlines.hh (1.71): Added more versatile comparison
+	  functions.
+
+2007-03-04 Sunday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.33): Removed declaration for void
+	  get_covering_box(Box&) const.
+
+2007-03-04 Sunday 17:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox2.cc (1.2): No longer use
+	  Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: empty1.cc (1.4), fromdirectproduct1.cc (1.3),
+	  fromgrid1.cc (1.3), frompolyhedron2.cc (1.7): No longer use
+	  Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox1.cc (1.2): No longer use
+	  Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.66), Determinate.inlines.hh (1.56),
+	  Determinate.types.hh (1.10), Pointset_Ask_Tell.defs.hh (1.8),
+	  Pointset_Ask_Tell.inlines.hh (1.3),
+	  Pointset_Ask_Tell.templates.hh (1.8), Pointset_Ask_Tell.types.hh
+	  (1.3), Pointset_Powerset.defs.hh (1.14),
+	  Pointset_Powerset.inlines.hh (1.7),
+	  Pointset_Powerset.templates.hh (1.11): Type variable `PH' renamed
+	  `PS'.
+
+2007-03-04 Sunday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.22), pointsetpowerset1.cc (1.1): New
+	  program to test Pointset_Powerset<PH> with boxes.  Temporarily
+	  disable testing with intervals with long double boundaries.
+
+2007-03-04 Sunday 10:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.213), src/Pointset_Powerset.defs.hh (1.13),
+	  src/Pointset_Powerset.templates.hh (1.10): Added
+	  Pointset_Powerset<PH>::affine_image(Variable, const
+	  Linear_Expression&, Coefficient_traits::const_reference).  Many
+	  other methods of Pointset_Powerset are missing.
+
+2007-03-04 Sunday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.23), tests/Box/intersection1.cc (1.5):
+	  Fixed Box<Interval>::intersection_assign(const Box&): it was not
+	  dealing properly with the emptiness flags.
+
+2007-03-03 Saturday 23:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (1.10): Test test14() fails with all
+	  bounded integer types.
+
+2007-03-03 Saturday 22:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.21), max_min1.cc (1.3): Restored
+	  max_min1.cc after disabling some of the tests that necessarily
+	  fail on floating point datatypes (to be improved so as to allow
+	  for approximations).
+
+2007-03-03 Saturday 22:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.22): Corrected method is_universe().
+
+2007-03-03 Saturday 21:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.21): Added a few missing interval
+	  initializations; marked by FIXMEs so as to be improved when we
+	  will have a richer set of intervals' constructors.
+
+2007-03-03 Saturday 21:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.20), relations2.cc (1.1): Testing
+	  methods relation_with().
+
+2007-03-03 Saturday 21:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.12), Box.templates.hh (1.20): Drafted
+	  implementations of methods relation_with().
+
+2007-03-03 Saturday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.212): New item added.
+
+2007-03-03 Saturday 20:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.19): Support parallel builds.
+
+2007-03-03 Saturday 18:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.211): New item added.
+
+2007-03-03 Saturday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (1.9): Drafted a more complex test.
+
+2007-03-03 Saturday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron2.cc (1.6): Comment revised.
+
+2007-03-03 Saturday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron2.cc (1.5): Test Box::Box(const
+	  NNC_Polyhedron&, Complexity_Class).
+
+2007-03-03 Saturday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.106), frombox2.cc (1.1): Test
+	  NNC_Polyhedron(const Box&, From_Bounding_Box).
+
+2007-03-03 Saturday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.18): Check Box::Box(const Polyhedron&,
+	  Complexity_Class) also with NNC polyhedra.
+
+2007-03-03 Saturday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: frompolyhedron1.cc (1.8), frompolyhedron2.cc (1.4),
+	  frompolyhedron4.cc (1.3): Tests for Box::Box(const Polyhedron&,
+	  Complexity_Class) reorganized.
+
+2007-03-03 Saturday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.105), frombox1.cc (1.1): Test
+	  C_Polyhedron(const Box&, From_Bounding_Box) and
+	  NNC_Polyhedron(const Box&, From_Bounding_Box).
+
+2007-03-03 Saturday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.57): Define BOX_INSTANCE if it is not
+	  already defined.
+
+2007-03-03 Saturday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.17), frompolyhedron1.cc (1.7),
+	  frompolyhedron2.cc (1.3): Adapted tests in frompolyhedron2.cc.
+	  Program max_min1 temporarily disabled (it fails).
+
+2007-03-03 Saturday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.56), Box/Makefile.am (1.16), Box/run_tests
+	  (1.2): Test class Box with multiple instantiations of the
+	  Interval parameter.
+
+2007-03-03 Saturday 15:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: frompolyhedron1.cc (1.6), frompolyhedron3.cc (1.3):
+	  Test in frompolyhedron3.cc is now included in frompolyhedron1.cc.
+
+2007-03-03 Saturday 12:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/bdsdifference1.cc (1.14),
+	  BD_Shape/bhmz05widening1.cc (1.14), BD_Shape/expandspacedim1.cc
+	  (1.3), BD_Shape/foldspacedims1.cc (1.5),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.13),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.14),
+	  BD_Shape/limitedh79extrapolation1.cc (1.13),
+	  BD_Shape/timeelapse1.cc (1.18), Box/bdsdifference1.cc (1.4),
+	  Box/boxdifference1.cc (1.5), Box/expandspacedim1.cc (1.5),
+	  Box/foldspacedims1.cc (1.6), Box/timeelapse1.cc (1.4),
+	  Octagonal_Shape/expandspacedim1.cc (1.4),
+	  Octagonal_Shape/foldspacedims1.cc (1.4),
+	  Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.4),
+	  Octagonal_Shape/limitedcc76extrapolation1.cc (1.4),
+	  Octagonal_Shape/timeelapse1.cc (1.4): Noisy output improved.
+
+2007-03-03 Saturday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: addcongruences1.cc (1.10), addconstraint1.cc
+	  (1.10), addconstraints1.cc (1.11), addconstraints2.cc (1.10),
+	  addgenerator1.cc (1.11), addgenerator2.cc (1.11),
+	  addgenerators1.cc (1.12), addgenerators2.cc (1.11),
+	  addspacedims1.cc (1.11), addspacedims2.cc (1.11), affineimage1.cc
+	  (1.11), affinepreimage1.cc (1.10), append1.cc (1.11), append2.cc
+	  (1.10), bhrz03widening1.cc (1.10), bhrz03widening2.cc (1.10),
+	  bhrz03widening3.cc (1.11), boundedaffineimage1.cc (1.10),
+	  boundedaffinepreimage1.cc (1.8), boundedh79extrapolation1.cc
+	  (1.11), concatenate1.cc (1.10), congruences1.cc (1.8),
+	  dualhypercubes.cc (1.12), expandspacedim1.cc (1.12),
+	  expandspacedim2.cc (1.12), foldspacedims1.cc (1.14),
+	  foldspacedims2.cc (1.15), generalizedaffineimage1.cc (1.12),
+	  generalizedaffineimage2.cc (1.12), generalizedaffinepreimage1.cc
+	  (1.9), generalizedaffinepreimage2.cc (1.8), h79widening1.cc
+	  (1.10), h79widening2.cc (1.10), intersection1.cc (1.14),
+	  limitedbhrz03extrapolation1.cc (1.9), limitedh79extrapolation1.cc
+	  (1.10), linearpartition1.cc (1.12), mapspacedims1.cc (1.13),
+	  nncminimize1.cc (1.6), numberinput1.cc (1.31), permute.cc (1.8),
+	  polydifference1.cc (1.11), polydifference2.cc (1.11),
+	  polyhull1.cc (1.11), relations1.cc (1.10), removespacedims1.cc
+	  (1.10), removespacedims2.cc (1.10), timeelapse1.cc (1.11),
+	  timeelapse2.cc (1.11), topclosure1.cc (1.10), universe1.cc
+	  (1.10), universe2.cc (1.10): Noisy output improved.
+
+2007-03-03 Saturday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: addcongruence1.cc (1.13), addcongruences1.cc (1.16),
+	  addconstraint1.cc (1.11), addconstraints1.cc (1.12),
+	  addgenerator1.cc (1.15), addgenerators1.cc (1.15),
+	  addspacedims1.cc (1.14), affineimage1.cc (1.13), affineimage2.cc
+	  (1.11), affinepreimage1.cc (1.12), affinepreimage2.cc (1.7),
+	  bounded1.cc (1.13), boundedaffineimage1.cc (1.3),
+	  boundedaffinepreimage1.cc (1.3), boundingbox1.cc (1.16),
+	  generalizedaffineimage1.cc (1.13), generalizedaffineimage2.cc
+	  (1.12), generalizedaffineimage3.cc (1.4),
+	  generalizedaffinepreimage1.cc (1.15),
+	  generalizedaffinepreimage2.cc (1.15),
+	  generalizedaffinepreimage3.cc (1.4), grid1.cc (1.20),
+	  limitedextrapolation1.cc (1.12), limitedextrapolation2.cc (1.6),
+	  limitedextrapolation3.cc (1.5), partition1.cc (1.5), widening1.cc
+	  (1.15), widening2.cc (1.10), widening3.cc (1.5): Enforced
+	  consistency with the other tests.
+
+2007-03-02 Friday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.204), interfaces/C/ppl_c.h.in (1.71), src/Grid.defs.hh
+	  (1.42): Last steps in the removal of the shrink_bounding_box()
+	  methods.
+
+2007-03-02 Friday 21:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.14), BBox.hh (1.12), Makefile.am (1.262),
+	  Box/frompolyhedron2.cc (1.2), Box/frompolyhedron3.cc (1.2),
+	  Box/frompolyhedron4.cc (1.2): Class BBox phased out.
+
+2007-03-02 Friday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.11), Box.templates.hh (1.19): New private
+	  methods void Box::add_constraint_no_check(const Constraint&) and
+	  void Box::add_constraints_no_check(const Constraint_System&)
+	  allow to optimize the addition of constraints to a box.
+
+2007-03-02 Friday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.10), src/Box.inlines.hh (1.9),
+	  src/Box.templates.hh (1.18), src/Direct_Product.defs.hh (1.32),
+	  src/Direct_Product.inlines.hh (1.28), tests/ppl_test.hh (1.55),
+	  tests/Box/fromdirectproduct1.cc (1.2): Got rid of
+	  Direct_Product::shrink_bounding_box() in favor of the constructor
+	  Box::Box(const Direct_Product<D1, D2>&, Complexity_Class).
+	  Removed lots of x's.
+
+2007-03-02 Friday 18:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.266), src/Any_Pointset.defs.hh (1.11),
+	  src/BD_Shape.cc (1.5), src/BD_Shape.defs.hh (1.97),
+	  src/BHRZ03_Certificate.defs.hh (1.17), src/Bit_Matrix.defs.hh
+	  (1.3), src/Bit_Row.defs.hh (1.5), src/Box.cc (1.4),
+	  src/Box.defs.hh (1.9), src/Checked_Number.defs.hh (1.86),
+	  src/Coefficient.types.hh (1.14),
+	  src/Coefficient_traits_template.hh (1.8), src/Congruence.defs.hh
+	  (1.19), src/Congruence_System.defs.hh (1.19),
+	  src/Constraint_System.defs.hh (1.36), src/DB_Matrix.defs.hh
+	  (1.27), src/DB_Matrix.inlines.hh (1.31),
+	  src/DB_Matrix.templates.hh (1.5), src/DB_Row.defs.hh (1.22),
+	  src/DB_Row.inlines.hh (1.21), src/DB_Row.templates.hh (1.4),
+	  src/Determinate.defs.hh (1.65), src/Direct_Product.defs.hh
+	  (1.31), src/Float.defs.hh (1.24), src/GMP_Integer.types.hh
+	  (1.16), src/Generator.defs.hh (1.122),
+	  src/Generator_System.defs.hh (1.23), src/Grid.defs.hh (1.41),
+	  src/Grid_Certificate.defs.hh (1.5), src/Grid_Generator.defs.hh
+	  (1.30), src/Grid_Generator_System.defs.hh (1.22),
+	  src/Grid_nonpublic.cc (1.24), src/Init.defs.hh (1.18),
+	  src/Linear_Row.defs.hh (1.24), src/Linear_System.defs.hh (1.31),
+	  src/Linear_System.inlines.hh (1.22), src/MIP_Problem.defs.hh
+	  (1.32), src/Matrix.defs.hh (1.81), src/OR_Matrix.defs.hh (1.8),
+	  src/OR_Matrix.inlines.hh (1.6), src/Octagonal_Shape.cc (1.4),
+	  src/Octagonal_Shape.defs.hh (1.25), src/Pointset_Ask_Tell.defs.hh
+	  (1.7), src/Pointset_Powerset.cc (1.11),
+	  src/Pointset_Powerset.defs.hh (1.12),
+	  src/Pointset_Powerset.templates.hh (1.9), src/Polyhedron.defs.hh
+	  (1.315), src/Polyhedron_nonpublic.cc (1.77),
+	  src/Ptr_Iterator.defs.hh (1.9), src/Rational_Box.hh (1.4),
+	  src/Row.cc (1.102), src/Row.defs.hh (1.110), src/Row.inlines.hh
+	  (1.64), src/Scalar_Products.defs.hh (1.9), src/Topology.hh
+	  (1.14), src/Variables_Set.defs.hh (1.6),
+	  src/Widening_Function.defs.hh (1.17), src/algorithms.hh (1.48),
+	  src/checked_numeric_limits.hh (1.19), src/compiler.hh (1.10),
+	  src/distances.inlines.hh (1.4), src/globals.defs.hh (1.44),
+	  src/iterator_to_const.defs.hh (1.5), src/meta_programming.hh
+	  (1.4), src/mp_std_bits.defs.hh (1.4), src/namespaces.hh (1.11):
+	  The `--enable-more-assertions' configure option can now be used
+	  to enable all sorts of ABI-breaking extra assertion checking.
+	  The `EXTRA_ROW_DEBUG' that was used in several places with
+	  different meaning has now gone in favor of new symbols, all
+	  characterized by the `PPL_' prefix.  Commends of several #endif's
+	  fixed.
+
+2007-03-02 Friday 18:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.62): Test relations3 temporarily
+	  disabled.
+
+2007-03-02 Friday 17:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/relations3.cc (1.23): Test test16() shows a bug in
+	  BD_Shape::relation_with(const Constraint& c) when the BD_Shape is
+	  based on integer coefficients.
+
+2007-03-02 Friday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.8), Box.templates.hh (1.17),
+	  Octagonal_Shape.defs.hh (1.24), Octagonal_Shape.templates.hh
+	  (1.50): Got rid of Octagonal_Shape::shrink_bounding_box() in
+	  favor of the constructor Box::Box(const Octagonal_Shape<T>&,
+	  Complexity_Class).
+
+2007-03-02 Friday 17:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.16): Solved a few FIXMEs. Corrected
+	  implementation of max_min().
+
+2007-03-02 Friday 16:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.15), addconstraints1.cc (1.4): Test
+	  addconstraints1.cc corrected and restored.
+
+2007-03-02 Friday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.14), discrete1.cc (1.4): Test
+	  discrete1 corrected and restored.
+
+2007-03-02 Friday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.8), Box.templates.hh (1.15): Method
+	  constraints() no longer forces an emptyness check.  Method
+	  minimized_constraints() forces an emptyness check and also
+	  detects equality constraints.
+
+2007-03-02 Friday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.13), minconstraints1.cc (1.4): Test
+	  minconstraints1.cc corrected and restored.
+
+2007-03-02 Friday 15:35  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.4): Added missing argument.
+
+2007-03-02 Friday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.12), expandspacedim1.cc (1.4): Test
+	  expandspacedim1.cc corrected and restored.
+
+2007-03-02 Friday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.35): Drafted Interval::ascii_dump() to
+	  help in debugging.
+
+2007-03-02 Friday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.7), Box.templates.hh (1.14): Corrected a
+	  bug in Box::add_constraint() whereby a Box flagged as empty had
+	  the flag removed after adding a new constraint.
+
+2007-03-02 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.13), tests/Box/Makefile.am (1.11),
+	  tests/Box/fromgrid1.cc (1.2): Constructor
+	  Box<Interval>::Box(const Grid&, Complexity_Class) corrected.
+	  Notice that this constructor is much less precise than it could
+	  be in case the box is made of modulo intervals.  Test program
+	  fromgrid1.cc revised and activated.
+
+2007-03-02 Friday 14:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.10), equality1.cc (1.4): Test
+	  equality1.cc corrected and restored.
+
+2007-03-02 Friday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (1.4): Test test08() shows a bug when
+	  calling join_assign() on Interval.
+
+2007-03-02 Friday 14:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.9), intersection1.cc (1.4): Test
+	  intersection1.cc corrected and restored.
+
+2007-03-02 Friday 14:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.8), max_min1.cc (1.2): Test
+	  max_min1.cc corrected and restored.
+
+2007-03-02 Friday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.7), containsintegerpoint1.cc (1.5):
+	  Improved and restored test on Box::contains_integer_points().
+
+2007-03-02 Friday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.34): Fixed
+	  Interval::contains_integer_points() so as to correctly handle the
+	  case of unbounded intervals.
+
+2007-03-02 Friday 12:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.12): Added a fast-fail test to
+	  Box::contains_integer_point().
+
+2007-03-02 Friday 12:44  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.33): Fixed typos.
+
+2007-03-02 Friday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.14),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.11),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.8),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.42), src/BD_Shape.defs.hh (1.96), src/BD_Shape.templates.hh
+	  (1.72), src/Box.defs.hh (1.7), src/Box.templates.hh (1.11),
+	  src/Grid.defs.hh (1.40), src/Grid.templates.hh (1.27),
+	  src/Grid_Generator.defs.hh (1.29), src/Polyhedron.defs.hh
+	  (1.314), src/Polyhedron.templates.hh (1.13),
+	  tests/Box/fromdirectproduct1.cc (1.1), tests/Box/fromgrid1.cc
+	  (1.1), tests/Box/frompolyhedron1.cc (1.5),
+	  tests/Box/frompolyhedron2.cc (1.1), tests/Box/frompolyhedron3.cc
+	  (1.1), tests/Box/frompolyhedron4.cc (1.1), tests/Grid/Makefile.am
+	  (1.47), tests/Grid/boundingbox2.cc (1.14),
+	  tests/Grid/directproduct1.cc (1.25), tests/Polyhedron/Makefile.am
+	  (1.104), tests/Polyhedron/boundingbox1.cc (1.15),
+	  tests/Polyhedron/boundingbox2.cc (1.14),
+	  tests/Polyhedron/boundingbox3.cc (1.15): Started getting rid of
+	  BD_Shape::shrink_bounding_box() and Grid::shrink_bounding_box().
+
+2007-03-02 Friday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/containsintegerpoint1.cc (1.4): Test test04() shows a
+	  bug in Interval::contains_integer_point().
+
+2007-03-02 Friday 10:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.6), affinedimension1.cc (1.5):
+	  Restored test affinedimension1.
+
+2007-03-02 Friday 10:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.5): Disabled some tests.
+
+2007-03-02 Friday 10:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxdifference1.cc (1.4): Temporarily commented out
+	  test07.
+
+2007-03-02 Friday 09:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Makefile.am (1.261): Enable checks in the Box directory.
+
+2007-03-02 Friday 09:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.4), affinedimension1.cc (1.4),
+	  max_min1.cc (1.1), run_tests (1.1): A first attempt at
+	  distinguishing tests that compile, fail and succeed so as to
+	  enable automatic checks. Work still in progress.
+
+2007-03-01 Thursday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.9): Test no
+	  longer fails with 8-bit checked integers and assertions disabled.
+
+2007-03-01 Thursday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.10), Polyhedron_widenings.cc
+	  (1.60): Started getting rid of Polyhedron::shrink_bounding_box().
+
+2007-02-28 Wednesday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.19), TODO (1.210): Mention the fact that GCC
+	  version 3.4.x are known to miscompile at least one of the
+	  development snapshots that led to PPL 0.10.  Mention also the
+	  fact that GCC 3.3.3 segfaults on such a snapshot (CVS HEAD, at
+	  least on x86_64).
+
+2007-02-28 Wednesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_java_tests_common (simplex.1): file
+	  ppl_java_tests_common was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2007-02-28 Wednesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.203), TODO (1.209), demos/ppl_lpsol/ppl_lpsol.c (1.68),
+	  interfaces/C/ppl_c.h.in (1.70),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.8),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.7),
+	  interfaces/Java/jni/ppl_java_common.cc (1.30),
+	  interfaces/Java/ppl_java/Relation_Symbol.java (1.3),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.11),
+	  interfaces/Java/tests/ppl_java_tests_common (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.6),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.9),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.9),
+	  interfaces/OCaml/test1.ml (1.29),
+	  interfaces/Prolog/ppl_prolog_common.icc (1.6),
+	  m4/ac_prog_javac.m4 (1.5), src/BD_Shape.templates.hh (1.71),
+	  src/Box.inlines.hh (1.6), src/Box.templates.hh (1.10),
+	  src/Grid_public.cc (1.51), src/Grid_simplify.cc (1.32),
+	  src/Interval.defs.hh (1.32), src/MIP_Problem.cc (1.47),
+	  src/Octagonal_Shape.templates.hh (1.49), src/Polyhedron_public.cc
+	  (1.91), src/globals.types.hh (1.11),
+	  tests/BD_Shape/affineimage1.cc (1.18),
+	  tests/BD_Shape/foldspacedims1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.16),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.20),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.14),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.15),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.5),
+	  tests/BD_Shape/removespacedims1.cc (1.19),
+	  tests/Box/affineimage1.cc (1.4), tests/Box/foldspacedims1.cc
+	  (1.5), tests/Box/generalizedaffineimage1.cc (1.4),
+	  tests/Box/generalizedaffinepreimage1.cc (1.4),
+	  tests/Box/removespacedims1.cc (1.5), tests/Grid/addgenerators1.cc
+	  (1.14), tests/Grid/directproduct1.cc (1.24),
+	  tests/Grid/generalizedaffineimage3.cc (1.3),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.3),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.9),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.8),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.8),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.3),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.9),
+	  tests/Polyhedron/exceptions1.cc (1.13),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.11),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.11),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.8): All
+	  identifiers containing the strings `less_than_or_equal' or
+	  `greater_than_or_equal', any case, have been renamed so as to
+	  contain `less_or_equal' or `greater_or_equal', respectively.
+
+2007-02-28 Wednesday 15:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.5), Box.templates.hh (1.9): Drafted
+	  implementations for provate helper functions bounds and max_min.
+	  Added inline implementations of bounds_from_above/below and
+	  maximize/minimize expliting the private helper functions.
+
+2007-02-28 Wednesday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.6): Added methods bounds_from_above,
+	  bounds_from_below, maximize and minimize, with versions computing
+	  a generator; also added private helper functions.
+
+2007-02-28 Wednesday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.208), tests/Polyhedron/memory2.cc (1.13): All tests have
+	  been converted to the new standards.
+
+2007-02-28 Wednesday 11:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinepreimage1.cc (1.20): New test added.
+
+2007-02-28 Wednesday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.17), affinepreimage1.cc
+	  (1.4), bug1.cc (1.4): Test program bug1.cc integrated into
+	  affinepreimage1.cc.
+
+2007-02-28 Wednesday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.61): Previous change completed.
+
+2007-02-28 Wednesday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.60), affinepreimage1.cc (1.19),
+	  affinepreimage2.cc (1.14): Test program affinepreimage2.cc merged
+	  into affinepreimage1.cc.
+
+2007-02-28 Wednesday 09:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.202), src/Congruence_System.cc (1.23),
+	  src/Congruence_System.defs.hh (1.18),
+	  src/Congruence_System.inlines.hh (1.8), src/Constraint_System.cc
+	  (1.22), src/Generator_System.cc (1.21), src/Grid.templates.hh
+	  (1.26), src/Grid_Certificate.cc (1.7),
+	  src/Grid_Generator_System.defs.hh (1.21),
+	  src/Grid_Generator_System.inlines.hh (1.13), src/Grid_chdims.cc
+	  (1.16), src/Grid_conversion.cc (1.19), src/Grid_nonpublic.cc
+	  (1.23), src/Grid_public.cc (1.50), src/Grid_simplify.cc (1.31),
+	  src/Grid_widenings.cc (1.14), src/Linear_System.cc (1.42),
+	  src/Linear_System.inlines.hh (1.21), src/Polyhedron.templates.hh
+	  (1.12), src/Polyhedron_chdims.cc (1.42),
+	  src/Polyhedron_nonpublic.cc (1.76), src/Polyhedron_public.cc
+	  (1.90), src/Polyhedron_widenings.cc (1.59), src/minimize.cc
+	  (1.46): The new methods `bool Congruence_System::empty() const'
+	  and `bool Grid_Generator_System::empty() const' return true if
+	  and only if the system in question is empty.	Method
+	  Grid_Generator_System::num_generators() renamed num_rows().  All
+	  these methods are now used consistently throughout the library.
+
+2007-02-27 Tuesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh (1.8), Polyhedron.templates.hh (1.11):
+	  Fixed Polyhedron::shrink_bounding_box().
+
+2007-02-27 Tuesday 19:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.7): Constructor taking a Polyhedron
+	  rewritten from scratch.
+
+2007-02-27 Tuesday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (1.4): Adjusted the known result.
+
+2007-02-27 Tuesday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.5), src/Box.inlines.hh (1.4),
+	  src/Box.templates.hh (1.6), src/Interval.defs.hh (1.31),
+	  tests/Box/cc76widening.cc (1.4), tests/Box/concatenate1.cc (1.4),
+	  tests/Box/contains1.cc (1.4), tests/Box/disjoint1.cc (1.4),
+	  tests/Box/foldspacedims1.cc (1.4), tests/Box/removespacedims1.cc
+	  (1.4): Fourth merge from the `altnum' branch.
+
+2007-02-27 Tuesday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/Box.defs.hh, src/Box.templates.hh,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Interval.defs.hh, src/Interval_Restriction.defs.hh,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/Polyhedron.templates.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh
+	  (altnum.[9,7,8,25,39,4,4,5,4,94,10,8,6,5,9,12,11,5,15,7]):
+	  Eleventh merge of the main trunk to the `altnum' branch.
+
+2007-02-27 Tuesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.4), Box.templates.hh (1.5),
+	  Polyhedron.templates.hh (1.10): New constructor `explicit
+	  Box(const Polyhedron& ph, Complexity_Class complexity =
+	  ANY_COMPLEXITY)' builds a box from the polyhedron `ph' taking
+	  into account `complexity'.  This is the beginning of the end of
+	  Polyhedron::shrink_bounding_box().
+
+2007-02-27 Tuesday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.313), Polyhedron.inlines.hh (1.138):
+	  New private method `Constraint_System simplified_constraints()
+	  const' returns, if constraints are up-to-date, a simplified copy
+	  of them.  Class Polyhedron now befriends Box.
+
+2007-02-27 Tuesday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.201), src/Constraint_System.defs.hh (1.35),
+	  src/Constraint_System.inlines.hh (1.9),
+	  src/Generator_System.defs.hh (1.22),
+	  src/Generator_System.inlines.hh (1.8): The new methods `bool
+	  Constraint_System::empty() const' and `bool
+	  Generator_System::empty() const' return true if and only if the
+	  constraint (resp., generator) system has no constraints (resp.,
+	  generators).
+
+2007-02-27 Tuesday 16:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.80), Matrix.inlines.hh (1.51): New method
+	  bool Matrix empty() const returns true if and only if *this has
+	  no rows.
+
+2007-02-27 Tuesday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: cc76widening.cc, foldspacedims1.cc,
+	  removespacedims1.cc (altnum.[4,2,3]): Minor corrections to the
+	  known results.
+
+2007-02-27 Tuesday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.38): Corrected a bug in
+	  remove_space_dimensions().  Do not forget to handle the case of
+	  an empty Box in CC76_widening_assign().  Drafted implementation
+	  for fold_space_dimensions().
+
+2007-02-27 Tuesday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.27): Drafted implementations for
+	  max_space_dimension() and expand_space_dimension().
+
+2007-02-27 Tuesday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.24): Added declaration for
+	  max_space_dimension().
+
+2007-02-27 Tuesday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.37): Fixed an error in
+	  CC76_widening_assign().
+
+2007-02-27 Tuesday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: concatenate1.cc, cc76widening.cc (altnum.[3,3]): Let
+	  it compile.
+
+2007-02-27 Tuesday 11:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: contains1.cc, disjoint1.cc (altnum.[2,2]): Adapted to
+	  the Box domain.
+
+2007-02-27 Tuesday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.36): Corrected method contains(): it
+	  was not checking for emptyness of the first argument. Drafted
+	  implementation for is_disjoint_from().
+
+2007-02-27 Tuesday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.26): Added implementation for
+	  strictly_contains().
+
+2007-02-27 Tuesday 10:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.23): Declared methods strictly_contains()
+	  and is_disjoint_from().  Slightly improved the documentation for
+	  method contains().
+
+2007-02-27 Tuesday 10:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.93): Drafted method
+	  is_disjoint_from(). To be carefully checked.
+
+2007-02-27 Tuesday 09:46  Abramo Bagnara
+
+	* src/: Interval.defs.hh (1.30), Interval_Restriction.defs.hh
+	  (1.4): Functions on restrictions need to return a state.
+
+2007-02-26 Monday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.139), BD_Shape.templates.hh (1.70),
+	  Box.templates.hh (1.4), Makefile.am (1.169),
+	  Octagonal_Shape.inlines.hh (1.14), Octagonal_Shape.templates.hh
+	  (1.48), Old_Interval.cc (1.4), Old_Interval.defs.hh (1.4),
+	  Old_Interval.inlines.hh (1.4), Old_Interval.types.hh (1.4),
+	  Polyhedron.templates.hh (1.9), globals.defs.hh (1.43),
+	  globals.inlines.hh (1.17): Got rid of Old_Interval and related
+	  classes.  Functions div_round_up(), is_additive_inverse(),
+	  is_even(), max_assign(), min_assign() and numer_denom() moved to
+	  globals.defs.hh and globals.inlines.hh.  The method
+	  Polyhedron::shrink_bounding_box() is now based on Box
+	  constructors.
+
+2007-02-26 Monday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.8): Previous change reverted.
+
+2007-02-26 Monday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.7): Started getting rid of
+	  Old_Interval.
+
+2007-02-26 Monday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.3), src/Box.cc (1.3), src/Box.defs.hh
+	  (1.3), src/Box.inlines.hh (1.3), src/Box.templates.hh (1.3),
+	  src/Box.types.hh (1.3), src/C_Integer.hh (1.3),
+	  src/Interval_Info.defs.hh (1.3), src/Interval_Info.inlines.hh
+	  (1.3), src/Interval_Info.types.hh (1.3),
+	  src/Interval_Restriction.defs.hh (1.3), src/Old_Interval.cc
+	  (1.3), src/Old_Interval.defs.hh (1.3),
+	  src/Old_Interval.inlines.hh (1.3), src/Old_Interval.types.hh
+	  (1.3), src/Rational_Box.hh (1.3), src/Temp.defs.hh (1.3),
+	  src/meta_programming.hh (1.3), src/mp_std_bits.cc (1.3),
+	  src/mp_std_bits.defs.hh (1.3), src/mp_std_bits.inlines.hh (1.3),
+	  tests/Box/Makefile.am (1.3), tests/Box/addconstraints1.cc (1.3),
+	  tests/Box/addspacedims1.cc (1.3), tests/Box/affinedimension1.cc
+	  (1.3), tests/Box/affineimage1.cc (1.3),
+	  tests/Box/affinepreimage1.cc (1.3), tests/Box/ascii_dump_load1.cc
+	  (1.3), tests/Box/bdsdifference1.cc (1.3),
+	  tests/Box/bgp99extrapolation1.cc (1.3),
+	  tests/Box/bhz03widening1.cc (1.3), tests/Box/bounded1.cc (1.3),
+	  tests/Box/boundedaffineimage1.cc (1.3),
+	  tests/Box/boxdifference1.cc (1.3), tests/Box/boxhull.cc (1.3),
+	  tests/Box/boxhull1.cc (1.3), tests/Box/cc76narrowing1.cc (1.3),
+	  tests/Box/cc76widening.cc (1.3), tests/Box/closure1.cc (1.3),
+	  tests/Box/concatenate1.cc (1.3), tests/Box/constraints1.cc (1.3),
+	  tests/Box/contains1.cc (1.3), tests/Box/containsintegerpoint1.cc
+	  (1.3), tests/Box/discrete1.cc (1.3), tests/Box/disjoint1.cc
+	  (1.3), tests/Box/empty1.cc (1.3), tests/Box/equality1.cc (1.3),
+	  tests/Box/expandspacedim1.cc (1.3), tests/Box/foldspacedims1.cc
+	  (1.3), tests/Box/fromgensys1.cc (1.3),
+	  tests/Box/frompolyhedron1.cc (1.3),
+	  tests/Box/generalizedaffineimage1.cc (1.3),
+	  tests/Box/generalizedaffinepreimage1.cc (1.3),
+	  tests/Box/geomcovers1.cc (1.3), tests/Box/intersection1.cc (1.3),
+	  tests/Box/interval1.cc (1.3), tests/Box/interval2.cc (1.3),
+	  tests/Box/mapspacedims1.cc (1.3), tests/Box/maxspacedim1.cc
+	  (1.3), tests/Box/membytes1.cc (1.3), tests/Box/minconstraints1.cc
+	  (1.3), tests/Box/relations1.cc (1.3),
+	  tests/Box/removespacedims1.cc (1.3), tests/Box/timeelapse1.cc
+	  (1.3), tests/Box/universe1.cc (1.3), tests/Box/writebox1.cc
+	  (1.3): Copyright years extended.
+
+2007-02-26 Monday 10:38  Abramo Bagnara
+
+	* src/: checked.inlines.hh (1.35), checked_ext.inlines.hh (1.35):
+	  Use different function names.
+
+2007-02-26 Monday 10:24  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_ext.inlines.hh
+	  (altnum.[33,15]): Use different function names.
+
+2007-02-25 Sunday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2007-02-25 Sunday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.265),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.7),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.41), interfaces/Prolog/ppl_prolog_common.icc (1.5),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.15),
+	  interfaces/Prolog/SWI/Makefile.am (1.68),
+	  interfaces/Prolog/tests/pl_check.pl (1.45),
+	  src/BD_Shape.templates.hh (1.69), src/Boundary.defs.hh (1.2),
+	  src/Bounding_Box.cc (1.15), src/Bounding_Box.defs.hh (1.17),
+	  src/Bounding_Box.inlines.hh (1.16), src/Bounding_Box.types.hh
+	  (1.6), src/Box.cc (1.2), src/Box.defs.hh (1.2),
+	  src/Box.inlines.hh (1.2), src/Box.templates.hh (1.2),
+	  src/Box.types.hh (1.2), src/C_Integer.hh (1.2),
+	  src/Checked_Number.defs.hh (1.85), src/Checked_Number.inlines.hh
+	  (1.70), src/DB_Matrix.inlines.hh (1.30),
+	  src/Direct_Product.templates.hh (1.21), src/Float.defs.hh (1.23),
+	  src/GMP_Integer.defs.hh (1.25), src/GMP_Integer.inlines.hh
+	  (1.19), src/GMP_Integer.types.hh (1.15), src/Grid.templates.hh
+	  (1.25), src/Init.cc (1.29), src/Interval.cc (1.15),
+	  src/Interval.defs.hh (1.29), src/Interval.inlines.hh (1.26),
+	  src/Interval.types.hh (1.13), src/Interval_Info.defs.hh (1.2),
+	  src/Interval_Info.inlines.hh (1.2), src/Interval_Info.types.hh
+	  (1.2), src/Interval_Restriction.defs.hh (1.2), src/Limits.hh
+	  (1.11), src/Makefile.am (1.168), src/OR_Matrix.inlines.hh (1.5),
+	  src/Octagonal_Shape.templates.hh (1.47), src/Old_Interval.cc
+	  (1.2), src/Old_Interval.defs.hh (1.2),
+	  src/Old_Interval.inlines.hh (1.2), src/Old_Interval.types.hh
+	  (1.2), src/Polyhedron.inlines.hh (1.137),
+	  src/Polyhedron.templates.hh (1.6), src/Polyhedron_public.cc
+	  (1.89), src/Polyhedron_widenings.cc (1.58), src/Rational_Box.hh
+	  (1.2), src/Result.defs.hh (1.18), src/Rounding_Dir.defs.hh
+	  (1.12), src/Rounding_Dir.inlines.hh (1.6), src/Temp.defs.hh
+	  (1.2), src/checked.defs.hh (1.39), src/checked.inlines.hh (1.34),
+	  src/checked_ext.inlines.hh (1.34), src/checked_float.inlines.hh
+	  (1.72), src/checked_int.inlines.hh (1.57),
+	  src/checked_mpq.inlines.hh (1.36), src/checked_mpz.inlines.hh
+	  (1.41), src/checked_numeric_limits.hh (1.18), src/compiler.hh
+	  (1.9), src/fpu-c99.inlines.hh (1.13), src/fpu-ia32.inlines.hh
+	  (1.16), src/fpu-none.inlines.hh (1.6), src/fpu-sparc.inlines.hh
+	  (1.7), src/fpu.types.hh (1.4), src/globals.defs.hh (1.42),
+	  src/globals.types.hh (1.10), src/meta_programming.hh (1.2),
+	  src/mp_numeric_limits.cc (1.3), src/mp_numeric_limits.hh (1.11),
+	  src/mp_std_bits.cc (1.2), src/mp_std_bits.defs.hh (1.2),
+	  src/mp_std_bits.inlines.hh (1.2), tests/ppl_test.cc (1.8),
+	  tests/ppl_test.hh (1.54), tests/print.hh (1.40),
+	  tests/valgrind_suppressions (1.5), tests/BD_Shape/Makefile.am
+	  (1.59), tests/Box/.cvsignore (1.2), tests/Box/Makefile.am (1.2),
+	  tests/Box/addconstraints1.cc (1.2), tests/Box/addspacedims1.cc
+	  (1.2), tests/Box/affinedimension1.cc (1.2),
+	  tests/Box/affineimage1.cc (1.2), tests/Box/affinepreimage1.cc
+	  (1.2), tests/Box/ascii_dump_load1.cc (1.2),
+	  tests/Box/bdsdifference1.cc (1.2),
+	  tests/Box/bgp99extrapolation1.cc (1.2),
+	  tests/Box/bhz03widening1.cc (1.2), tests/Box/bounded1.cc (1.2),
+	  tests/Box/boundedaffineimage1.cc (1.2),
+	  tests/Box/boxdifference1.cc (1.2), tests/Box/boxhull.cc (1.2),
+	  tests/Box/boxhull1.cc (1.2), tests/Box/cc76narrowing1.cc (1.2),
+	  tests/Box/cc76widening.cc (1.2), tests/Box/closure1.cc (1.2),
+	  tests/Box/concatenate1.cc (1.2), tests/Box/constraints1.cc (1.2),
+	  tests/Box/contains1.cc (1.2), tests/Box/containsintegerpoint1.cc
+	  (1.2), tests/Box/discrete1.cc (1.2), tests/Box/disjoint1.cc
+	  (1.2), tests/Box/empty1.cc (1.2), tests/Box/equality1.cc (1.2),
+	  tests/Box/expandspacedim1.cc (1.2), tests/Box/foldspacedims1.cc
+	  (1.2), tests/Box/fromgensys1.cc (1.2),
+	  tests/Box/frompolyhedron1.cc (1.2),
+	  tests/Box/generalizedaffineimage1.cc (1.2),
+	  tests/Box/generalizedaffinepreimage1.cc (1.2),
+	  tests/Box/geomcovers1.cc (1.2), tests/Box/intersection1.cc (1.2),
+	  tests/Box/interval1.cc (1.2), tests/Box/interval2.cc (1.2),
+	  tests/Box/mapspacedims1.cc (1.2), tests/Box/maxspacedim1.cc
+	  (1.2), tests/Box/membytes1.cc (1.2), tests/Box/minconstraints1.cc
+	  (1.2), tests/Box/relations1.cc (1.2),
+	  tests/Box/removespacedims1.cc (1.2), tests/Box/timeelapse1.cc
+	  (1.2), tests/Box/universe1.cc (1.2), tests/Box/writebox1.cc
+	  (1.2), tests/Grid/boundingbox1.cc (1.15),
+	  tests/Grid/boundingbox2.cc (1.13), tests/Grid/coveringbox1.cc
+	  (1.14), tests/Grid/coveringbox2.cc (1.12),
+	  tests/Grid/directproduct1.cc (1.23),
+	  tests/Octagonal_Shape/Makefile.am (1.16),
+	  tests/Polyhedron/boundingbox1.cc (1.14),
+	  tests/Polyhedron/boundingbox2.cc (1.13),
+	  tests/Polyhedron/boundingbox3.cc (1.14),
+	  tests/Polyhedron/numberinput1.cc (1.30): Third merge from the
+	  `altnum' branch.
+
+2007-02-25 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, README, README.configure, TODO, configure.ac,
+	  instchk.hh, Watchdog/Makefile.am, Watchdog/README,
+	  Watchdog/configure.ac, Watchdog/doc/.cvsignore,
+	  Watchdog/doc/Makefile.am, Watchdog/doc/README.doc,
+	  Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	  Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+	  Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+	  Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  debian/Makefile.am, debian/libppl-pwl.copyright.in,
+	  debian/libppl.copyright.in, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox, doc/devref.tex,
+	  doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl.sty,
+	  doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/user.tex,
+	  interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.h.in,
+	  interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/ppl_java/By_Reference.java,
+	  interfaces/Java/ppl_java/Coefficient.java,
+	  interfaces/Java/ppl_java/Congruence.java,
+	  interfaces/Java/ppl_java/Congruence_System.java,
+	  interfaces/Java/ppl_java/Constraint.java,
+	  interfaces/Java/ppl_java/Constraint_System.java,
+	  interfaces/Java/ppl_java/Degenerate_Element.java,
+	  interfaces/Java/ppl_java/Domain_Error_Exception.java,
+	  interfaces/Java/ppl_java/Generator.java,
+	  interfaces/Java/ppl_java/Generator_System.java,
+	  interfaces/Java/ppl_java/Generator_Type.java,
+	  interfaces/Java/ppl_java/Grid_Generator.java,
+	  interfaces/Java/ppl_java/Grid_Generator_System.java,
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java,
+	  interfaces/Java/ppl_java/Invalid_Argument_Exception.java,
+	  interfaces/Java/ppl_java/Lenght_Error_Exception.java,
+	  interfaces/Java/ppl_java/Linear_Expression.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Difference.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Sum.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Variable.java,
+	  interfaces/Java/ppl_java/Logic_Error_Exception.java,
+	  interfaces/Java/ppl_java/MIP_Problem.java,
+	  interfaces/Java/ppl_java/MIP_Problem_Status.java,
+	  interfaces/Java/ppl_java/Makefile.am,
+	  interfaces/Java/ppl_java/Optimization_Mode.java,
+	  interfaces/Java/ppl_java/Overflow_Error_Exception.java,
+	  interfaces/Java/ppl_java/PPL_Object.java,
+	  interfaces/Java/ppl_java/Parma_Polyhedra_Library.java,
+	  interfaces/Java/ppl_java/Partial_Function.java,
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java,
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java,
+	  interfaces/Java/ppl_java/Relation_Symbol.java,
+	  interfaces/Java/ppl_java/Variable.java,
+	  interfaces/Java/ppl_java/Variables_Set.java,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/OCaml/ppl_ocaml_globals.ml,
+	  interfaces/OCaml/ppl_ocaml_types.ml, interfaces/OCaml/test1.ml,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/Makefile.am, m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+	  m4/ac_cxx_double_binary_format.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_remainder_bug.m4, m4/ac_prog_jar.m4,
+	  m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	  m4/ac_text_md5sum.m4, m4/ppl.m4, src/Any_Pointset.defs.hh,
+	  src/Any_Pointset.inlines.hh, src/Any_Pointset.types.hh,
+	  src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+	  src/Ask_Tell.templates.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/BD_Shape.types.hh,
+	  src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	  src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	  src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	  src/Bit_Row.inlines.hh, src/Bit_Row.types.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/C_Polyhedron.types.hh,
+	  src/Checked_Number.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence.types.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	  src/Congruence_System.types.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	  src/DB_Row.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Determinate.types.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/Float.cc, src/Float.defs.hh, src/Float.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/GMP_Integer.types.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator.inlines.hh,
+	  src/Generator.types.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Generator_System.types.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	  src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	  src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.types.hh, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.types.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	  src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Ph_Status.inlines.hh, src/Pointset_Ask_Tell.cc,
+	  src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+	  src/distances.inlines.hh, src/distances.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+	  src/fpu.defs.hh, src/fpu.types.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+	  src/ppl_header.hh, src/simplify.cc, src/swapping_sort.icc,
+	  src/version.cc, src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+	  tests/Makefile.am, tests/Partial_Function.cc,
+	  tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/files.cc,
+	  tests/files.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/Ask_Tell/Makefile.am,
+	  tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	  tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/run_tests, tests/BD_Shape/timeelapse1.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdshape1.cc,
+	  tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/affinepreimage2.cc,
+	  tests/Grid/approximatepartition1.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	  tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	  tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/powersetgeometricallyequals1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc, tests/Octagonal_Shape/bug1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/README,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constraints1.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc, tests/Polyhedron/hybrid.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/randphull2.cc, tests/Polyhedron/relations1.cc,
+	  tests/Polyhedron/relations2.cc, tests/Polyhedron/relations3.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	  utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh
+	  (altnum.[6,5,5,10,28,4,7,4,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,8,13,4,7,8,4,6,3,10,5,3,3,5,3,3,3,3,5,5,4,4,3,4,7,3,3,4,5,4,3,4,3,4,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,4,4,2,2,2,4,4,9,4,4,4,8,3,5,4,8,3,4,5,5,8,3,3,7,3,2,3,6,3,8,4,2,2,2,4,4,3,3,9,2,3,3,2,2,3,3,3,7,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,5,7,3,2,3,3,3,3, [...]
+	  Tenth merge of the main trunk to the `altnum' branch.
+
+2007-02-25 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.27): Two corrections to the code
+	  implementing the `--enable-fpmath' option.
+
+2007-02-25 Sunday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/fpu-ia32.inlines.hh (altnum.[26,8]): The
+	  `--enable-fpmath' configure option now causes the possible
+	  definition of macros PPL_FPMATH_MAY_USE_387 and
+	  PPL_FPMATH_MAY_USE_SSE.
+
+2007-02-24 Saturday 20:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.25): New option `--enable-fpmath' allows to
+	  select specific floating point arithmetics.  Possible values are
+	  sse, sse2, 387, sse+387, sse2+387, default or no (equivalent to
+	  --disable-fpmath).
+
+2007-02-24 Saturday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (altnum.8): No longer use the
+	  comma as the separator for plld's -ld-options (since commas can
+	  occur in the arguments, e.g., in -mfpmath=sse,387): use the slash
+	  instead.
+
+2007-02-23 Friday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.11): The user manual (in various
+	  formats) is now in the `docs' package.
+
+2007-02-23 Friday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.207): New entry added.
+
+2007-02-22 Thursday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.24): Drafted new configure options
+	  --enable-sse and --enable-sse2.
+
+2007-02-22 Thursday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.10): Percent signs quoted in the
+	  change log.
+
+2007-02-22 Thursday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.9): Version bumped.
+
+2007-02-22 Thursday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.8): Dependencies for YAP fixed.  Make
+	  sure the header files of GNU Prolog and YAP are found.
+
+2007-02-22 Thursday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.7): Added missing dependencies.
+
+2007-02-19 Monday 17:23  Abramo Bagnara
+
+	* src/: fpu-c99.inlines.hh, fpu-ia32.inlines.hh,
+	  fpu-none.inlines.hh, fpu-sparc.inlines.hh (altnum.[4,7,3,4]): Add
+	  support for SSE. Removed unused function.
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/.cvsignore (altnum.1): file .cvsignore was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/README.doc (altnum.1): file README.doc was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-html.in (altnum.1): file
+	  devref.doxyconf-html.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-html.in (simplex.1): file
+	  devref.doxyconf-html.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-latex.in (altnum.1): file
+	  devref.doxyconf-latex.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-latex.in (simplex.1): file
+	  devref.doxyconf-latex.in was added on branch simplex on
+	  2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.tex (altnum.1): file devref.tex was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.dox (altnum.1): file fdl.dox was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.dox (simplex.1): file fdl.dox was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.tex (altnum.1): file fdl.tex was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.tex (simplex.1): file fdl.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.txt (altnum.1): file fdl.txt was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.txt (simplex.1): file fdl.txt was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.dox (altnum.1): file gpl.dox was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.tex (altnum.1): file gpl.tex was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.txt (altnum.1): file gpl.txt was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/pwl.sty (altnum.1): file pwl.sty was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-html.in (altnum.1): file
+	  user.doxyconf-html.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-latex.in (altnum.1): file
+	  user.doxyconf-latex.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.tex (altnum.1): file user.tex was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.27), configure.ac (1.35),
+	  doc/.cvsignore (1.1), doc/Makefile.am (1.1), doc/README.doc
+	  (1.1), doc/devref.doxyconf-html.in (1.1),
+	  doc/devref.doxyconf-latex.in (1.1), doc/devref.tex (1.1),
+	  doc/fdl.dox (1.1), doc/fdl.tex (1.1), doc/fdl.txt (1.1),
+	  doc/gpl.dox (1.1), doc/gpl.tex (1.1), doc/gpl.txt (1.1),
+	  doc/pwl.sty (1.1), doc/user.doxyconf-html.in (1.1),
+	  doc/user.doxyconf-latex.in (1.1), doc/user.tex (1.1):
+	  Documentation for the Parma Watchdog Library.
+
+2007-02-18 Sunday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.6): %doc tags corrected for the
+	  Prolog interfaces.  Tabs used consistently instead of spaces.
+
+2007-02-18 Sunday 12:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch (ppl-0_9-branch.2): Revised.
+
+2007-02-18 Sunday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README.doc (ppl-0_9-branch.1): Explains where to find
+	  the documentation.
+
+2007-02-18 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/README.gprolog, SWI/README.swiprolog,
+	  YAP/README.yap (ppl-0_9-branch.[2,2,2]): Revised for clarity.
+
+2007-02-17 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch, ppl.spec.in,
+	  interfaces/Prolog/GNU/README.gprolog,
+	  interfaces/Prolog/SWI/README.swiprolog,
+	  interfaces/Prolog/YAP/README.yap (ppl-0_9-branch.[1,5,1,1,1]):
+	  Make `swiprolog-devel' depend on `pl' (at leat 5.6);
+	  documentation added.	The `yap' package has been renamed
+	  `yap-devel' and completed.  The `gprolog' package has been
+	  renamed `gprolog-devel' and completed.  The `ppl_lcdd' and
+	  `ppl_lpsol' programs are now in a new `utils' package.  The
+	  `ppl-config' program is now in the `devel' package.  Modified the
+	  configuration command so that the `glpk-devel' include files are
+	  found.
+
+2007-02-13 Tuesday 14:48  quartieri
+
+	* src/Octagonal_Shape_incremental_strong_closure10.hh (octagons.4):
+	  Corrected some errors.
+
+2007-02-11 Sunday 21:09  Andrea Cimino
+
+	* DarwinPorts_Portfile (ppl-0_9-branch.3): Variant sections
+	  removed.
+
+2007-02-11 Sunday 14:26  Andrea Cimino
+
+	* DarwinPorts_Portfile (ppl-0_9-branch.2): Don't require the
+	  development snapshots of the Prolog systems, use the stable
+	  versions instead.
+
+2007-02-10 Saturday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.4): Summaries improved.  Started
+	  splitting packages into "run-time" and "devel" packages.
+
+2007-02-10 Saturday 20:57  Andrea Cimino
+
+	* DarwinPorts_Portfile (ppl-0_9-branch.1): Initial revision of a
+	  DarwinPort's Portfile.
+
+2007-02-10 Saturday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.3): Do configure with the
+	  --disable-rpath option so as to avoid hardcoding the path to
+	  search libraries.  Do not include libtool archive files.
+	  Packages reorganized: we now have `ppl' and `ppl-devel';  `ppl-c'
+	  has gone.
+
+2007-02-10 Saturday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.2): Added the `%%changelog' section.
+	  `Release' set to 2.  `Packager' and `Vendor' tags removed.
+	  `Summary' fields are no longer ended with a dot.  The value of
+	  the `License' tag is now `GPL'.  Removed unused definition of
+	  `builddir'.  The `Name', `Version' and `Release' tags are now
+	  directly defined.  Commented out the efinitions of the `Require'
+	  and `Prefix' tags.  Set the `BuildRequires' tag to `gmp-devel'.
+	  Exploit the features of `%%setup', `%%configure', `%%install',
+	  `%%post' and `%%postun'.  Mixed use of spaces and tabs avoided.
+
+2007-02-10 Saturday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.1): Added the `%changelog' section.
+
+2007-02-09 Friday 14:56  Abramo Bagnara
+
+	* src/fpu-ia32.inlines.hh (altnum.6): First attempt to support SSE
+	  floating point rounding.
+
+2007-02-08 Thursday 19:20  Andrea Cimino
+
+	* interfaces/Java/: jni/Makefile.am (1.11),
+	  tests/C_Polyhedron_test1.java (1.10),
+	  tests/ppl_interface_generator_java_test_java.m4 (1.8): In Darwin
+	  force libtool to generate a .jnilib instead of a .dylib if we
+	  have to deal with a JNI library.
+
+2007-02-08 Thursday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.264): On Fedora Core systems we can now find the
+	  JDK even if the --with-java option is not specified.
+
+2007-02-08 Thursday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.263), m4/Makefile.am (1.24): Improved the
+	  detection of Darwin.
+
+2007-02-08 Thursday 17:03  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.9),
+	  ppl_interface_generator_java_test_java.m4 (1.7): Load the right
+	  interface library appropriately.
+
+2007-02-08 Thursday 16:15  Andrea Cimino
+
+	* configure.ac (1.262): Try to detect if we are building the PPL on
+	  a MacOSX: if so, set the the default JDK path to
+	  /Library/Java/Home.
+
+2007-02-08 Thursday 15:27  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.8),
+	  Makefile.am (1.12), ppl_interface_generator_java_test_java.m4
+	  (1.6): Made some changes to correctly load the Java PPL bindings
+	  if the running OS is Darwin.
+
+2007-02-07 Wednesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.13): Prefer standard C99 floating point
+	  rounding and exception handling on all systems that support it.
+
+2007-02-06 Tuesday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bug1.cc (1.3): Further reduced.
+
+2007-02-06 Tuesday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bug1.cc (altnum.1): file bug1.cc was added
+	  on branch altnum on 2007-02-25 18:27:11 +0000
+
+2007-02-06 Tuesday 15:38  Andrea Cimino
+
+	* tests/Octagonal_Shape/bug1.cc (1.2): Removed some constraints
+	  from the test case to simplify the debugging process.
+
+2007-02-06 Tuesday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.15), bug1.cc (1.1): Small
+	  program showing a (compiler?) bug that manifests itself on
+	  iMac's.
+
+2007-02-03 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_remainder_bug.m4 (altnum.1): file
+	  ac_cxx_remainder_bug.m4 was added on branch altnum on 2007-02-25
+	  18:27:02 +0000
+
+2007-02-03 Saturday 11:57  Andrea Cimino
+
+	* configure.ac (1.261), m4/Makefile.am (1.23),
+	  m4/ac_cxx_remainder_bug.m4 (1.1): Definition of an M4 macro that
+	  checks if INT_MIN / -1 is correctly compiled by the C++ compiler.
+
+2007-02-02 Friday 11:06  quartieri
+
+	* src/: Octagonal_Shape_incremental_strong_closure1.hh,
+	  Octagonal_Shape_incremental_strong_closure10.hh,
+	  Octagonal_Shape_incremental_strong_closure2.hh,
+	  Octagonal_Shape_incremental_strong_closure3.hh,
+	  Octagonal_Shape_incremental_strong_closure4.hh,
+	  Octagonal_Shape_incremental_strong_closure5.hh,
+	  Octagonal_Shape_incremental_strong_closure6.hh,
+	  Octagonal_Shape_incremental_strong_closure7.hh,
+	  Octagonal_Shape_incremental_strong_closure8.hh,
+	  Octagonal_Shape_incremental_strong_closure9.hh
+	  (octagons.[3,3,3,3,3,3,3,3,3,3]): Removed some useless operation
+	  counters.
+
+2007-01-31 Wednesday 13:48  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.54): Removed
+	  'plus_infinity' test from strong_coherence_assign().
+
+2007-01-24 Wednesday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.46): Code for debugging improved.
+
+2007-01-19 Friday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.206): Removed item: - Add tests for
+	  ppl_Polyhedron_contains_integer_point/1 in pl_check.pl.
+
+2007-01-19 Friday 12:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.29),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.33),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.40),
+	  Prolog/tests/pl_check.pl (1.44),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.49): Added a test to pl_check.pl for
+	  ppl_Polyhedron_contains_integer_point/2
+
+	  Also added m4 code to generate interface predicates such as
+	  ppl_Pointset_Powerset_C_Polyhedron_linear_partition/4 and
+	  ppl_Pointset_Powerset_Grid_approximate_partition/4
+
+	  Added m4 code for generating tests for these.
+
+2007-01-15 Monday 13:01  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.5),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.6),
+	  ppl_ocaml_types.ml (1.8): Removed some commented and non used
+	  declarations.
+
+2007-01-15 Monday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_mli.m4 was added on branch
+	  altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-15 Monday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (altnum.1): file ppl_interface_generator_ocaml_mli_code.m4 was
+	  added on branch altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-15 Monday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_types.ml (altnum.1): file
+	  ppl_ocaml_types.ml was added on branch altnum on 2007-02-25
+	  18:26:59 +0000
+
+2007-01-13 Saturday 20:17  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.12), ppl_interface_generator_ocaml_ml_code.m4 (1.12),
+	  ppl_interface_generator_ocaml_mli.m4 (1.4),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.5),
+	  ppl_ocaml_globals.cc (1.8), ppl_ocaml_types.ml (1.7), test1.ml
+	  (1.28): Corrected the constructors `from space_dimension' that
+	  until now  allowed to build types just from UNIVERSE. Created the
+	  type `degenerate_element' for that purposes.
+
+2007-01-13 Saturday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (altnum.1): file ppl_interface_generator_ocaml_cc_code.m4 was
+	  added on branch altnum on 2007-02-25 18:26:58 +0000
+
+2007-01-13 Saturday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (altnum.1): file ppl_interface_generator_ocaml_ml_code.m4 was
+	  added on branch altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-13 Saturday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (altnum.1): file
+	  ppl_ocaml_globals.cc was added on branch altnum on 2007-02-25
+	  18:26:59 +0000
+
+2007-01-11 Thursday 16:00  quartieri
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh,
+	  src/Octagonal_Shape_incremental_strong_closure1.hh,
+	  src/Octagonal_Shape_incremental_strong_closure10.hh,
+	  src/Octagonal_Shape_incremental_strong_closure2.hh,
+	  src/Octagonal_Shape_incremental_strong_closure3.hh,
+	  src/Octagonal_Shape_incremental_strong_closure4.hh,
+	  src/Octagonal_Shape_incremental_strong_closure5.hh,
+	  src/Octagonal_Shape_incremental_strong_closure6.hh,
+	  src/Octagonal_Shape_incremental_strong_closure7.hh,
+	  src/Octagonal_Shape_incremental_strong_closure8.hh,
+	  src/Octagonal_Shape_incremental_strong_closure9.hh,
+	  src/Octagonal_Shape_strong_closure2.hh, src/script_flags.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/incremental1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/incremental1.cc
+	  (octagons.[3,3,3,53,2,2,2,2,2,2,2,2,2,2,2,1,3,1,3,1]): Changed
+	  some files to improve the tests on closure and incremental
+	  closure.
+
+2007-01-11 Thursday 08:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.15),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.22): Revised
+	  the way the code for the iterator classes is generated.
+
+2007-01-08 Monday 15:31  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.24), jni/ppl_java_common.cc (1.29), jni/ppl_java_common.hh
+	  (1.26), ppl_java/PPL_Object.java (1.3),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.21): Written support for Pointset_Powerset iterators.
+
+2007-01-07 Sunday 13:20  Andrea Cimino
+
+	* configure.ac (1.260),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.6),
+	  interfaces/Java/ppl_java/Makefile.am (1.28),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.20): Written the Java code to handle Powereset_Iterators.
+	  Still the C++ code that really intefaces with the PPL must be
+	  written. Modified the Makefile.am to delete all the generated
+	  files if the target `clean' is requested.
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_cc.m4 was added on branch
+	  altnum on 2007-02-25 18:26:58 +0000
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_dat.m4 was added on branch
+	  altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_ml.m4 was added on branch
+	  altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.28),
+	  C/ppl_interface_generator_c_cc.m4 (1.7),
+	  C/ppl_interface_generator_c_h.m4 (1.11),
+	  Java/ppl_interface_generator_java_dat.m4 (1.5),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.8), Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.14), Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.5), OCaml/ppl_interface_generator_ocaml_cc.m4 (1.3),
+	  OCaml/ppl_interface_generator_ocaml_dat.m4 (1.5),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.8),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.32),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.10),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.39),
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.5),
+	  Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.4), Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.5),
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.7),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.8),
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.6),
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.7),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.4), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.48),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.26): Copyright notices fixed.
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (altnum.1): file hybrid.cc was added
+	  on branch altnum on 2007-02-25 18:27:12 +0000
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.ml (altnum.1): file
+	  ppl_ocaml_globals.ml was added on branch altnum on 2007-02-25
+	  18:26:59 +0000
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.38), README (1.50), README.configure (1.18),
+	  configure.ac (1.259), instchk.hh (1.8), Watchdog/Makefile.am
+	  (1.26), Watchdog/README (1.15), Watchdog/configure.ac (1.34),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.3),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.3),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.3),
+	  Watchdog/src/EList.defs.hh (1.5), Watchdog/src/EList.inlines.hh
+	  (1.3), Watchdog/src/EList.types.hh (1.3),
+	  Watchdog/src/EList_Iterator.defs.hh (1.3),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.3),
+	  Watchdog/src/EList_Iterator.types.hh (1.3),
+	  Watchdog/src/Handler.defs.hh (1.4),
+	  Watchdog/src/Handler.inlines.hh (1.3),
+	  Watchdog/src/Handler.types.hh (1.3), Watchdog/src/Makefile.am
+	  (1.9), Watchdog/src/Pending_Element.cc (1.3),
+	  Watchdog/src/Pending_Element.defs.hh (1.4),
+	  Watchdog/src/Pending_Element.inlines.hh (1.3),
+	  Watchdog/src/Pending_Element.types.hh (1.3),
+	  Watchdog/src/Pending_List.cc (1.3),
+	  Watchdog/src/Pending_List.defs.hh (1.4),
+	  Watchdog/src/Pending_List.inlines.hh (1.3),
+	  Watchdog/src/Pending_List.types.hh (1.3), Watchdog/src/Time.cc
+	  (1.3), Watchdog/src/Time.defs.hh (1.4),
+	  Watchdog/src/Time.inlines.hh (1.3), Watchdog/src/Time.types.hh
+	  (1.3), Watchdog/src/Watchdog.cc (1.5),
+	  Watchdog/src/Watchdog.defs.hh (1.4),
+	  Watchdog/src/Watchdog.inlines.hh (1.3),
+	  Watchdog/src/Watchdog.types.hh (1.3), Watchdog/src/pwl_header.hh
+	  (1.3), Watchdog/utils/Makefile.am (1.7),
+	  Watchdog/utils/build_header.in (1.4), debian/Makefile.am (1.3),
+	  debian/libppl-pwl.copyright.in (1.4), debian/libppl.copyright.in
+	  (1.4), demos/Makefile.am (1.10), demos/ppl_lcdd/Makefile.am
+	  (1.27), demos/ppl_lcdd/ppl_lcdd.cc (1.58),
+	  demos/ppl_lcdd/examples/Makefile.am (1.8),
+	  demos/ppl_lpsol/Makefile.am (1.38), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.67), demos/ppl_lpsol/examples/Makefile.am (1.8),
+	  doc/Makefile.am (1.50), doc/README.doc (1.11),
+	  doc/definitions.dox (1.200), doc/devref.tex (1.21),
+	  doc/ppl-config.1 (1.5), doc/ppl-config_extra_man_text (1.2),
+	  doc/ppl.sty (1.26), doc/ppl_lcdd.1 (1.3),
+	  doc/ppl_lcdd_extra_man_text (1.2), doc/ppl_lpsol.1 (1.3),
+	  doc/ppl_lpsol_extra_man_text (1.2), doc/user.tex (1.22),
+	  interfaces/Makefile.am (1.25),
+	  interfaces/ppl_interface_generator_common.m4 (1.17),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.27),
+	  interfaces/ppl_interface_generator_copyright (1.3),
+	  interfaces/C/Makefile.am (1.31), interfaces/C/ppl_c.h.in (1.69),
+	  interfaces/C/ppl_c_version.h.in (1.4),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.6),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.6),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.7),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.6),
+	  interfaces/Java/Makefile.am (1.10),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.4),
+	  interfaces/Java/jni/Makefile.am (1.10),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.7),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.23), interfaces/Java/jni/ppl_java_common.cc (1.28),
+	  interfaces/Java/jni/ppl_java_common.hh (1.25),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.5),
+	  interfaces/Java/ppl_java/By_Reference.java (1.3),
+	  interfaces/Java/ppl_java/Coefficient.java (1.5),
+	  interfaces/Java/ppl_java/Congruence.java (1.5),
+	  interfaces/Java/ppl_java/Congruence_System.java (1.3),
+	  interfaces/Java/ppl_java/Constraint.java (1.5),
+	  interfaces/Java/ppl_java/Constraint_System.java (1.3),
+	  interfaces/Java/ppl_java/Degenerate_Element.java (1.2),
+	  interfaces/Java/ppl_java/Domain_Error_Exception.java (1.2),
+	  interfaces/Java/ppl_java/Generator.java (1.5),
+	  interfaces/Java/ppl_java/Generator_System.java (1.3),
+	  interfaces/Java/ppl_java/Generator_Type.java (1.2),
+	  interfaces/Java/ppl_java/Grid_Generator.java (1.5),
+	  interfaces/Java/ppl_java/Grid_Generator_System.java (1.4),
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java (1.2),
+	  interfaces/Java/ppl_java/Invalid_Argument_Exception.java (1.2),
+	  interfaces/Java/ppl_java/Lenght_Error_Exception.java (1.2),
+	  interfaces/Java/ppl_java/Linear_Expression.java (1.5),
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
+	  (1.3), interfaces/Java/ppl_java/Linear_Expression_Difference.java
+	  (1.4), interfaces/Java/ppl_java/Linear_Expression_Sum.java (1.4),
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java (1.3),
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
+	  (1.3), interfaces/Java/ppl_java/Linear_Expression_Variable.java
+	  (1.3), interfaces/Java/ppl_java/Logic_Error_Exception.java (1.2),
+	  interfaces/Java/ppl_java/MIP_Problem.java (1.4),
+	  interfaces/Java/ppl_java/MIP_Problem_Status.java (1.2),
+	  interfaces/Java/ppl_java/Makefile.am (1.27),
+	  interfaces/Java/ppl_java/Optimization_Mode.java (1.2),
+	  interfaces/Java/ppl_java/Overflow_Error_Exception.java (1.2),
+	  interfaces/Java/ppl_java/PPL_Object.java (1.2),
+	  interfaces/Java/ppl_java/Parma_Polyhedra_Library.java (1.2),
+	  interfaces/Java/ppl_java/Partial_Function.java (1.2),
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java (1.2),
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java (1.2),
+	  interfaces/Java/ppl_java/Relation_Symbol.java (1.2),
+	  interfaces/Java/ppl_java/Variable.java (1.4),
+	  interfaces/Java/ppl_java/Variables_Set.java (1.2),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.13),
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.19), interfaces/Java/tests/C_Polyhedron_test1.java (1.7),
+	  interfaces/Java/tests/Makefile.am (1.11),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.2),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.4),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.12), interfaces/OCaml/Makefile.am (1.25),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.2),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.11),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.4),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.11),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.2),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.4),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.7),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.6),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.6),
+	  interfaces/OCaml/test1.ml (1.27), interfaces/Prolog/Makefile.am
+	  (1.38), interfaces/Prolog/Prolog_interface.dox (1.158),
+	  interfaces/Prolog/exceptions.hh (1.24),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.31),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.9),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.38),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.9), interfaces/Prolog/ppl_prolog_common.icc (1.4),
+	  interfaces/Prolog/track_allocation.hh (1.21),
+	  interfaces/Prolog/Ciao/Makefile.am (1.62),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.2),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.18),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.14),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.25),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.49),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.4),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.3), interfaces/Prolog/GNU/Makefile.am (1.61),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.10),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.11),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.2),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.42),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.4), interfaces/Prolog/SICStus/Makefile.am (1.73),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.6), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.27),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.7),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.9),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.14),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.15),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.9),
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl (1.2),
+	  interfaces/Prolog/SWI/Makefile.am (1.67),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.11),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.10),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.7), interfaces/Prolog/SWI/ppl_pl.cc (1.11),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.7),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.3),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.9),
+	  interfaces/Prolog/SWI/swi_predicate_check.pl (1.2),
+	  interfaces/Prolog/XSB/Makefile.am (1.48),
+	  interfaces/Prolog/XSB/expected_clpq2_int16 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int32 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a (1.5),
+	  interfaces/Prolog/XSB/expected_clpq2_int64 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int8 (1.4),
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a (1.5),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int16 (1.5),
+	  interfaces/Prolog/XSB/expected_clpq_int16_a (1.5),
+	  interfaces/Prolog/XSB/expected_clpq_int32 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int32_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int64 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int64_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int8 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int8_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_mpz (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a (1.3),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.5),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.6),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.3), interfaces/Prolog/XSB/xsb_cfli.hh (1.2),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.17),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.15),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.29),
+	  interfaces/Prolog/YAP/Makefile.am (1.50),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.5),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.11),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.2),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.12),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.8),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.12),
+	  interfaces/Prolog/tests/Makefile.am (1.13),
+	  interfaces/Prolog/tests/clpq.pl (1.9),
+	  interfaces/Prolog/tests/clpq2.pl (1.10),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.3),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.3),
+	  interfaces/Prolog/tests/pl_check.pl (1.43),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.4),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.47),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.25), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.3), m4/Makefile.am (1.22), m4/ac_check_fpu_control.m4 (1.3),
+	  m4/ac_check_gmp.m4 (1.24), m4/ac_check_sicstus_prolog.m4 (1.5),
+	  m4/ac_check_swi_prolog.m4 (1.10), m4/ac_check_xsb_prolog.m4
+	  (1.3), m4/ac_cxx_attribute_weak.m4 (1.8),
+	  m4/ac_cxx_double_binary_format.m4 (1.4),
+	  m4/ac_cxx_flexible_arrays.m4 (1.13),
+	  m4/ac_cxx_float_binary_format.m4 (1.3),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.4), m4/ac_prog_jar.m4
+	  (1.2), m4/ac_prog_java.m4 (1.5), m4/ac_prog_javac.m4 (1.4),
+	  m4/ac_prog_javah.m4 (1.8), m4/ac_text_md5sum.m4 (1.2), m4/ppl.m4
+	  (1.5), src/Any_Pointset.defs.hh (1.9),
+	  src/Any_Pointset.inlines.hh (1.2), src/Any_Pointset.types.hh
+	  (1.2), src/Ask_Tell.defs.hh (1.15), src/Ask_Tell.inlines.hh
+	  (1.15), src/Ask_Tell.templates.hh (1.8), src/Ask_Tell.types.hh
+	  (1.6), src/BDS_Status.idefs.hh (1.20), src/BDS_Status.inlines.hh
+	  (1.15), src/BD_Shape.cc (1.4), src/BD_Shape.defs.hh (1.95),
+	  src/BD_Shape.inlines.hh (1.138), src/BD_Shape.templates.hh
+	  (1.68), src/BD_Shape.types.hh (1.6), src/BHRZ03_Certificate.cc
+	  (1.11), src/BHRZ03_Certificate.defs.hh (1.16),
+	  src/BHRZ03_Certificate.inlines.hh (1.8),
+	  src/BHRZ03_Certificate.types.hh (1.5), src/Bit_Matrix.cc (1.2),
+	  src/Bit_Matrix.defs.hh (1.2), src/Bit_Matrix.inlines.hh (1.2),
+	  src/Bit_Matrix.types.hh (1.2), src/Bit_Row.cc (1.2),
+	  src/Bit_Row.defs.hh (1.4), src/Bit_Row.inlines.hh (1.2),
+	  src/Bit_Row.types.hh (1.2), src/Bounding_Box.cc (1.14),
+	  src/Bounding_Box.defs.hh (1.16), src/Bounding_Box.inlines.hh
+	  (1.15), src/Bounding_Box.types.hh (1.5), src/C_Polyhedron.cc
+	  (1.20), src/C_Polyhedron.defs.hh (1.46),
+	  src/C_Polyhedron.inlines.hh (1.34), src/C_Polyhedron.types.hh
+	  (1.11), src/Checked_Number.cc (1.10), src/Checked_Number.defs.hh
+	  (1.84), src/Checked_Number.inlines.hh (1.69),
+	  src/Checked_Number.types.hh (1.10), src/Coefficient.cc (1.5),
+	  src/Coefficient.defs.hh (1.7), src/Coefficient.inlines.hh (1.6),
+	  src/Coefficient.types.hh (1.13),
+	  src/Coefficient_traits_template.hh (1.7), src/Congruence.cc
+	  (1.14), src/Congruence.defs.hh (1.18), src/Congruence.inlines.hh
+	  (1.15), src/Congruence.types.hh (1.3), src/Congruence_System.cc
+	  (1.22), src/Congruence_System.defs.hh (1.17),
+	  src/Congruence_System.inlines.hh (1.7),
+	  src/Congruence_System.types.hh (1.3), src/Constraint.cc (1.65),
+	  src/Constraint.defs.hh (1.124), src/Constraint.inlines.hh (1.66),
+	  src/Constraint.types.hh (1.11), src/Constraint_System.cc (1.21),
+	  src/Constraint_System.defs.hh (1.34),
+	  src/Constraint_System.inlines.hh (1.8),
+	  src/Constraint_System.types.hh (1.5), src/DB_Matrix.defs.hh
+	  (1.26), src/DB_Matrix.inlines.hh (1.29),
+	  src/DB_Matrix.templates.hh (1.4), src/DB_Matrix.types.hh (1.6),
+	  src/DB_Row.defs.hh (1.21), src/DB_Row.inlines.hh (1.20),
+	  src/DB_Row.templates.hh (1.3), src/DB_Row.types.hh (1.7),
+	  src/Determinate.defs.hh (1.64), src/Determinate.inlines.hh
+	  (1.55), src/Determinate.types.hh (1.9),
+	  src/Direct_Product.defs.hh (1.30), src/Direct_Product.inlines.hh
+	  (1.27), src/Direct_Product.templates.hh (1.20),
+	  src/Direct_Product.types.hh (1.6), src/Float.cc (1.5),
+	  src/Float.defs.hh (1.22), src/Float.inlines.hh (1.29),
+	  src/GMP_Integer.defs.hh (1.24), src/GMP_Integer.inlines.hh
+	  (1.18), src/GMP_Integer.types.hh (1.14), src/Generator.cc (1.73),
+	  src/Generator.defs.hh (1.121), src/Generator.inlines.hh (1.60),
+	  src/Generator.types.hh (1.11), src/Generator_System.cc (1.20),
+	  src/Generator_System.defs.hh (1.21),
+	  src/Generator_System.inlines.hh (1.7),
+	  src/Generator_System.types.hh (1.5), src/Grid.defs.hh (1.39),
+	  src/Grid.inlines.hh (1.13), src/Grid.templates.hh (1.24),
+	  src/Grid.types.hh (1.3), src/Grid_Certificate.cc (1.6),
+	  src/Grid_Certificate.defs.hh (1.4),
+	  src/Grid_Certificate.inlines.hh (1.3),
+	  src/Grid_Certificate.types.hh (1.3), src/Grid_Generator.cc
+	  (1.19), src/Grid_Generator.defs.hh (1.28),
+	  src/Grid_Generator.inlines.hh (1.13), src/Grid_Generator.types.hh
+	  (1.3), src/Grid_Generator_System.cc (1.17),
+	  src/Grid_Generator_System.defs.hh (1.20),
+	  src/Grid_Generator_System.inlines.hh (1.12),
+	  src/Grid_Generator_System.types.hh (1.3), src/Grid_Status.cc
+	  (1.6), src/Grid_Status.idefs.hh (1.6), src/Grid_Status.inlines.hh
+	  (1.3), src/Grid_chdims.cc (1.15), src/Grid_conversion.cc (1.18),
+	  src/Grid_nonpublic.cc (1.22), src/Grid_public.cc (1.49),
+	  src/Grid_simplify.cc (1.30), src/Grid_widenings.cc (1.13),
+	  src/H79_Certificate.cc (1.10), src/H79_Certificate.defs.hh
+	  (1.15), src/H79_Certificate.inlines.hh (1.9),
+	  src/H79_Certificate.types.hh (1.5), src/Init.cc (1.28),
+	  src/Init.defs.hh (1.17), src/Init.types.hh (1.10),
+	  src/Interval.cc (1.14), src/Interval.defs.hh (1.28),
+	  src/Interval.inlines.hh (1.25), src/Interval.types.hh (1.12),
+	  src/Limits.hh (1.10), src/Linear_Expression.cc (1.16),
+	  src/Linear_Expression.defs.hh (1.34),
+	  src/Linear_Expression.inlines.hh (1.10),
+	  src/Linear_Expression.types.hh (1.5), src/Linear_Row.cc (1.21),
+	  src/Linear_Row.defs.hh (1.23), src/Linear_Row.inlines.hh (1.12),
+	  src/Linear_Row.types.hh (1.5), src/Linear_System.cc (1.41),
+	  src/Linear_System.defs.hh (1.30), src/Linear_System.inlines.hh
+	  (1.20), src/Linear_System.types.hh (1.5), src/MIP_Problem.cc
+	  (1.45), src/MIP_Problem.defs.hh (1.31),
+	  src/MIP_Problem.inlines.hh (1.13), src/MIP_Problem.templates.hh
+	  (1.10), src/MIP_Problem.types.hh (1.2), src/Makefile.am (1.167),
+	  src/Matrix.cc (1.95), src/Matrix.defs.hh (1.79),
+	  src/Matrix.inlines.hh (1.50), src/Matrix.types.hh (1.11),
+	  src/NNC_Polyhedron.cc (1.20), src/NNC_Polyhedron.defs.hh (1.48),
+	  src/NNC_Polyhedron.inlines.hh (1.35), src/NNC_Polyhedron.types.hh
+	  (1.11), src/Numeric_Format.defs.hh (1.6), src/OR_Matrix.defs.hh
+	  (1.7), src/OR_Matrix.inlines.hh (1.4), src/OR_Matrix.templates.hh
+	  (1.5), src/OR_Matrix.types.hh (1.3), src/Octagonal_Shape.cc
+	  (1.3), src/Octagonal_Shape.defs.hh (1.23),
+	  src/Octagonal_Shape.inlines.hh (1.13),
+	  src/Octagonal_Shape.templates.hh (1.46),
+	  src/Octagonal_Shape.types.hh (1.3), src/Og_Status.idefs.hh (1.6),
+	  src/Og_Status.inlines.hh (1.4), src/Ph_Status.cc (1.12),
+	  src/Ph_Status.idefs.hh (1.20), src/Ph_Status.inlines.hh (1.8),
+	  src/Pointset_Ask_Tell.cc (1.2), src/Pointset_Ask_Tell.defs.hh
+	  (1.6), src/Pointset_Ask_Tell.inlines.hh (1.2),
+	  src/Pointset_Ask_Tell.templates.hh (1.7),
+	  src/Pointset_Ask_Tell.types.hh (1.2), src/Pointset_Powerset.cc
+	  (1.10), src/Pointset_Powerset.defs.hh (1.11),
+	  src/Pointset_Powerset.inlines.hh (1.6),
+	  src/Pointset_Powerset.templates.hh (1.8),
+	  src/Pointset_Powerset.types.hh (1.2), src/Poly_Con_Relation.cc
+	  (1.14), src/Poly_Con_Relation.defs.hh (1.33),
+	  src/Poly_Con_Relation.inlines.hh (1.15),
+	  src/Poly_Con_Relation.types.hh (1.10), src/Poly_Gen_Relation.cc
+	  (1.14), src/Poly_Gen_Relation.defs.hh (1.31),
+	  src/Poly_Gen_Relation.inlines.hh (1.15),
+	  src/Poly_Gen_Relation.types.hh (1.10), src/Polyhedron.defs.hh
+	  (1.312), src/Polyhedron.inlines.hh (1.136),
+	  src/Polyhedron.templates.hh (1.5), src/Polyhedron.types.hh
+	  (1.17), src/Polyhedron_chdims.cc (1.41),
+	  src/Polyhedron_nonpublic.cc (1.75), src/Polyhedron_public.cc
+	  (1.88), src/Polyhedron_widenings.cc (1.57), src/Powerset.defs.hh
+	  (1.29), src/Powerset.inlines.hh (1.19), src/Powerset.templates.hh
+	  (1.4), src/Powerset.types.hh (1.6), src/Ptr_Iterator.defs.hh
+	  (1.8), src/Ptr_Iterator.inlines.hh (1.7),
+	  src/Ptr_Iterator.types.hh (1.6), src/Result.defs.hh (1.17),
+	  src/Result.inlines.hh (1.10), src/Rounding_Dir.defs.hh (1.11),
+	  src/Rounding_Dir.inlines.hh (1.5), src/Row.cc (1.101),
+	  src/Row.defs.hh (1.109), src/Row.inlines.hh (1.63),
+	  src/Row.types.hh (1.12), src/Scalar_Products.cc (1.6),
+	  src/Scalar_Products.defs.hh (1.8), src/Scalar_Products.inlines.hh
+	  (1.5), src/Scalar_Products.types.hh (1.4), src/Topology.hh
+	  (1.13), src/Variable.cc (1.22), src/Variable.defs.hh (1.53),
+	  src/Variable.inlines.hh (1.24), src/Variable.types.hh (1.11),
+	  src/Variables_Set.cc (1.4), src/Variables_Set.defs.hh (1.5),
+	  src/Variables_Set.inlines.hh (1.4), src/Variables_Set.types.hh
+	  (1.2), src/Widening_Function.defs.hh (1.16),
+	  src/Widening_Function.inlines.hh (1.14),
+	  src/Widening_Function.types.hh (1.6), src/algorithms.hh (1.47),
+	  src/checked.cc (1.19), src/checked.defs.hh (1.38),
+	  src/checked.inlines.hh (1.33), src/checked_ext.defs.hh (1.12),
+	  src/checked_ext.inlines.hh (1.33), src/checked_float.inlines.hh
+	  (1.71), src/checked_int.inlines.hh (1.56),
+	  src/checked_mpq.inlines.hh (1.35), src/checked_mpz.inlines.hh
+	  (1.40), src/checked_numeric_limits.hh (1.17), src/compiler.hh
+	  (1.8), src/conversion.cc (1.80), src/distances.defs.hh (1.3),
+	  src/distances.inlines.hh (1.3), src/distances.types.hh (1.3),
+	  src/fpu-c99.inlines.hh (1.12), src/fpu-ia32.inlines.hh (1.15),
+	  src/fpu-none.inlines.hh (1.5), src/fpu-sparc.inlines.hh (1.6),
+	  src/fpu.defs.hh (1.12), src/fpu.types.hh (1.3), src/globals.cc
+	  (1.25), src/globals.defs.hh (1.41), src/globals.inlines.hh
+	  (1.16), src/globals.types.hh (1.9), src/initializer.hh (1.13),
+	  src/iterator_to_const.defs.hh (1.4),
+	  src/iterator_to_const.inlines.hh (1.3),
+	  src/iterator_to_const.types.hh (1.2), src/max_space_dimension.hh
+	  (1.11), src/minimize.cc (1.45), src/mp_numeric_limits.cc (1.2),
+	  src/mp_numeric_limits.hh (1.10), src/namespaces.hh (1.10),
+	  src/ppl-config.cc.in (1.19), src/ppl_header.hh (1.5),
+	  src/simplify.cc (1.47), src/swapping_sort.icc (1.12),
+	  src/version.cc (1.8), src/version.hh.in (1.15), tests/BBox.cc
+	  (1.13), tests/BBox.hh (1.11), tests/FCAIBVP.cc (1.3),
+	  tests/FCAIBVP.defs.hh (1.4), tests/FCAIBVP.inlines.hh (1.4),
+	  tests/FCAIBVP.types.hh (1.2), tests/Makefile.am (1.260),
+	  tests/Partial_Function.cc (1.4), tests/Partial_Function.defs.hh
+	  (1.3), tests/Partial_Function.inlines.hh (1.2),
+	  tests/Partial_Function.types.hh (1.2),
+	  tests/Random_Number_Generator.defs.hh (1.4),
+	  tests/Random_Number_Generator.inlines.hh (1.9),
+	  tests/Random_Number_Generator.types.hh (1.3), tests/files.cc
+	  (1.9), tests/files.hh (1.10), tests/ppl_test.cc (1.7),
+	  tests/ppl_test.hh (1.53), tests/print.cc (1.27), tests/print.hh
+	  (1.39), tests/Ask_Tell/Makefile.am (1.2),
+	  tests/Ask_Tell/append1.cc (1.5), tests/BD_Shape/Makefile.am
+	  (1.58), tests/BD_Shape/addconstraints1.cc (1.17),
+	  tests/BD_Shape/addspacedims1.cc (1.14),
+	  tests/BD_Shape/affinedimension1.cc (1.11),
+	  tests/BD_Shape/affineimage1.cc (1.17),
+	  tests/BD_Shape/affineimage2.cc (1.12),
+	  tests/BD_Shape/affinepreimage1.cc (1.18),
+	  tests/BD_Shape/affinepreimage2.cc (1.13),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.14),
+	  tests/BD_Shape/bdsdifference1.cc (1.13),
+	  tests/BD_Shape/bdshull1.cc (1.15),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.9),
+	  tests/BD_Shape/bhmz05widening1.cc (1.13),
+	  tests/BD_Shape/bhz03widening1.cc (1.9),
+	  tests/BD_Shape/bounded1.cc (1.2),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.3),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.2),
+	  tests/BD_Shape/bounds1.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.17),
+	  tests/BD_Shape/cc76narrowing1.cc (1.17),
+	  tests/BD_Shape/closure1.cc (1.15), tests/BD_Shape/concatenate1.cc
+	  (1.13), tests/BD_Shape/constraints1.cc (1.18),
+	  tests/BD_Shape/contains1.cc (1.14),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.2),
+	  tests/BD_Shape/discrete1.cc (1.2), tests/BD_Shape/disjoint1.cc
+	  (1.5), tests/BD_Shape/empty1.cc (1.10),
+	  tests/BD_Shape/equality1.cc (1.15),
+	  tests/BD_Shape/expandspacedim1.cc (1.2),
+	  tests/BD_Shape/foldspacedims1.cc (1.3),
+	  tests/BD_Shape/fromgensys1.cc (1.14),
+	  tests/BD_Shape/frompolyhedron1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.15),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.19),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.13),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.14),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.4),
+	  tests/BD_Shape/geomcovers1.cc (1.9),
+	  tests/BD_Shape/h79widening1.cc (1.12),
+	  tests/BD_Shape/intersection1.cc (1.17),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.12),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.13),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.12),
+	  tests/BD_Shape/mapspacedims1.cc (1.14),
+	  tests/BD_Shape/max_min1.cc (1.2), tests/BD_Shape/max_min2.cc
+	  (1.4), tests/BD_Shape/maxspacedim1.cc (1.2),
+	  tests/BD_Shape/membytes1.cc (1.2),
+	  tests/BD_Shape/minconstraints1.cc (1.10),
+	  tests/BD_Shape/relations1.cc (1.16), tests/BD_Shape/relations2.cc
+	  (1.20), tests/BD_Shape/relations3.cc (1.22),
+	  tests/BD_Shape/removespacedims1.cc (1.18),
+	  tests/BD_Shape/run_tests (1.18), tests/BD_Shape/timeelapse1.cc
+	  (1.17), tests/BD_Shape/universe1.cc (1.14),
+	  tests/BD_Shape/writebdshape1.cc (1.8), tests/Grid/Makefile.am
+	  (1.46), tests/Grid/addcongruence1.cc (1.12),
+	  tests/Grid/addcongruences1.cc (1.15),
+	  tests/Grid/addconstraint1.cc (1.10),
+	  tests/Grid/addconstraints1.cc (1.11), tests/Grid/addgenerator1.cc
+	  (1.14), tests/Grid/addgenerators1.cc (1.13),
+	  tests/Grid/addspacedims1.cc (1.13), tests/Grid/affinedim1.cc
+	  (1.11), tests/Grid/affineimage1.cc (1.12),
+	  tests/Grid/affineimage2.cc (1.10), tests/Grid/affinepreimage1.cc
+	  (1.11), tests/Grid/affinepreimage2.cc (1.6),
+	  tests/Grid/approximatepartition1.cc (1.2),
+	  tests/Grid/asciidumpload1.cc (1.13), tests/Grid/asciidumpload2.cc
+	  (1.5), tests/Grid/asciidumpload3.cc (1.4),
+	  tests/Grid/asciidumpload4.cc (1.4), tests/Grid/asciidumpload5.cc
+	  (1.2), tests/Grid/asciidumpload6.cc (1.2),
+	  tests/Grid/asciidumpload7.cc (1.2), tests/Grid/bhz03widening1.cc
+	  (1.12), tests/Grid/bounded1.cc (1.12),
+	  tests/Grid/boundedaffineimage1.cc (1.2),
+	  tests/Grid/boundedaffinepreimage1.cc (1.2),
+	  tests/Grid/boundingbox1.cc (1.14), tests/Grid/boundingbox2.cc
+	  (1.12), tests/Grid/bounds1.cc (1.14), tests/Grid/certificate1.cc
+	  (1.13), tests/Grid/concatenate1.cc (1.13),
+	  tests/Grid/congruence1.cc (1.16), tests/Grid/congruences1.cc
+	  (1.11), tests/Grid/congruences2.cc (1.5), tests/Grid/contains1.cc
+	  (1.11), tests/Grid/containsintegerpoint1.cc (1.3),
+	  tests/Grid/copyconstruct1.cc (1.7), tests/Grid/coveringbox1.cc
+	  (1.13), tests/Grid/coveringbox2.cc (1.11),
+	  tests/Grid/directproduct1.cc (1.22), tests/Grid/directproduct2.cc
+	  (1.5), tests/Grid/discrete1.cc (1.7), tests/Grid/disjoint1.cc
+	  (1.11), tests/Grid/equals1.cc (1.12),
+	  tests/Grid/expandspacedim1.cc (1.11),
+	  tests/Grid/foldspacedims1.cc (1.11),
+	  tests/Grid/generalizedaffineimage1.cc (1.12),
+	  tests/Grid/generalizedaffineimage2.cc (1.11),
+	  tests/Grid/generalizedaffineimage3.cc (1.2),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.14),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.14),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.2),
+	  tests/Grid/generator1.cc (1.19), tests/Grid/generators1.cc
+	  (1.12), tests/Grid/generators2.cc (1.2), tests/Grid/grid1.cc
+	  (1.19), tests/Grid/grid2.cc (1.15), tests/Grid/grid3.cc (1.19),
+	  tests/Grid/griddifference1.cc (1.11), tests/Grid/intersection1.cc
+	  (1.11), tests/Grid/isempty1.cc (1.7), tests/Grid/isuniverse1.cc
+	  (1.9), tests/Grid/join1.cc (1.15), tests/Grid/join2.cc (1.10),
+	  tests/Grid/limitedextrapolation1.cc (1.11),
+	  tests/Grid/limitedextrapolation2.cc (1.5),
+	  tests/Grid/limitedextrapolation3.cc (1.4),
+	  tests/Grid/mapspacedims1.cc (1.10), tests/Grid/maxmin1.cc (1.11),
+	  tests/Grid/membytes1.cc (1.8), tests/Grid/mincongruences1.cc
+	  (1.9), tests/Grid/mingenerators1.cc (1.9),
+	  tests/Grid/outputoperator1.cc (1.8),
+	  tests/Grid/outputoperator2.cc (1.2),
+	  tests/Grid/outputoperator3.cc (1.2), tests/Grid/partition1.cc
+	  (1.4), tests/Grid/powersetdifference1.cc (1.2),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.2),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.2),
+	  tests/Grid/relations1.cc (1.13), tests/Grid/relations2.cc (1.15),
+	  tests/Grid/relations3.cc (1.6), tests/Grid/removespacedims1.cc
+	  (1.13), tests/Grid/removespacedims2.cc (1.13),
+	  tests/Grid/timeelapse1.cc (1.10), tests/Grid/topclosed1.cc
+	  (1.11), tests/Grid/topclosure1.cc (1.7), tests/Grid/widening1.cc
+	  (1.14), tests/Grid/widening2.cc (1.9), tests/Grid/widening3.cc
+	  (1.4), tests/Grid/writecongruencesystem.cc (1.7),
+	  tests/MIP_Problem/Makefile.am (1.2),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.3),
+	  tests/MIP_Problem/exceptions1.cc (1.2),
+	  tests/MIP_Problem/mipproblem1.cc (1.3),
+	  tests/Octagonal_Shape/Makefile.am (1.14),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.2),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.3),
+	  tests/Octagonal_Shape/affineimage1.cc (1.3),
+	  tests/Octagonal_Shape/affineimage2.cc (1.2),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.3),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.2),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.2),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.3),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.2),
+	  tests/Octagonal_Shape/bounded1.cc (1.2),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.8),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.3),
+	  tests/Octagonal_Shape/bounds1.cc (1.3),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.3),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.3),
+	  tests/Octagonal_Shape/chinainit.cc (1.2),
+	  tests/Octagonal_Shape/concatenate1.cc (1.2),
+	  tests/Octagonal_Shape/constraints1.cc (1.3),
+	  tests/Octagonal_Shape/contains1.cc (1.3),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.3),
+	  tests/Octagonal_Shape/discrete1.cc (1.2),
+	  tests/Octagonal_Shape/disjoint1.cc (1.6),
+	  tests/Octagonal_Shape/empty1.cc (1.2),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.3),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.2),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.2),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.2),
+	  tests/Octagonal_Shape/intersection1.cc (1.3),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.3),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.3),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.3),
+	  tests/Octagonal_Shape/max_min1.cc (1.4),
+	  tests/Octagonal_Shape/max_min2.cc (1.3),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.2),
+	  tests/Octagonal_Shape/membytes1.cc (1.3),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.3),
+	  tests/Octagonal_Shape/octdifference1.cc (1.3),
+	  tests/Octagonal_Shape/octhull1.cc (1.3),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.2),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.4),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.6),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.3),
+	  tests/Octagonal_Shape/run_tests (1.2),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.3),
+	  tests/Octagonal_Shape/universe1.cc (1.2),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.3),
+	  tests/Polyhedron/Makefile.am (1.103), tests/Polyhedron/README
+	  (1.6), tests/Polyhedron/addcongruence1.cc (1.7),
+	  tests/Polyhedron/addcongruences1.cc (1.9),
+	  tests/Polyhedron/addconstraint1.cc (1.9),
+	  tests/Polyhedron/addconstraints1.cc (1.10),
+	  tests/Polyhedron/addconstraints2.cc (1.9),
+	  tests/Polyhedron/addgenerator1.cc (1.10),
+	  tests/Polyhedron/addgenerator2.cc (1.10),
+	  tests/Polyhedron/addgenerators1.cc (1.11),
+	  tests/Polyhedron/addgenerators2.cc (1.10),
+	  tests/Polyhedron/addspacedims1.cc (1.10),
+	  tests/Polyhedron/addspacedims2.cc (1.10),
+	  tests/Polyhedron/affineimage1.cc (1.10),
+	  tests/Polyhedron/affineimage2.cc (1.10),
+	  tests/Polyhedron/affinepreimage1.cc (1.9),
+	  tests/Polyhedron/affinetrans.cc (1.10),
+	  tests/Polyhedron/append1.cc (1.10), tests/Polyhedron/append2.cc
+	  (1.9), tests/Polyhedron/ascii_dump_load1.cc (1.9),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.9),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.10),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.12),
+	  tests/Polyhedron/bhrz03widening1.cc (1.9),
+	  tests/Polyhedron/bhrz03widening2.cc (1.9),
+	  tests/Polyhedron/bhrz03widening3.cc (1.10),
+	  tests/Polyhedron/bhz03widening1.cc (1.13),
+	  tests/Polyhedron/bounded1.cc (1.10),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.8),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.7),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.8),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.10),
+	  tests/Polyhedron/boundingbox1.cc (1.13),
+	  tests/Polyhedron/boundingbox2.cc (1.12),
+	  tests/Polyhedron/boundingbox3.cc (1.13),
+	  tests/Polyhedron/bounds1.cc (1.10),
+	  tests/Polyhedron/cnncconversion1.cc (1.3),
+	  tests/Polyhedron/concatenate1.cc (1.9),
+	  tests/Polyhedron/congruences1.cc (1.7),
+	  tests/Polyhedron/constraints1.cc (1.9),
+	  tests/Polyhedron/contains1.cc (1.9),
+	  tests/Polyhedron/contains2.cc (1.9),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.2),
+	  tests/Polyhedron/disjoint1.cc (1.9),
+	  tests/Polyhedron/disjoint2.cc (1.11),
+	  tests/Polyhedron/dualhypercubes.cc (1.11),
+	  tests/Polyhedron/empty1.cc (1.10), tests/Polyhedron/equals1.cc
+	  (1.9), tests/Polyhedron/exceptions1.cc (1.12),
+	  tests/Polyhedron/exceptions2.cc (1.11),
+	  tests/Polyhedron/exceptions3.cc (1.10),
+	  tests/Polyhedron/expandspacedim1.cc (1.11),
+	  tests/Polyhedron/expandspacedim2.cc (1.11),
+	  tests/Polyhedron/foldspacedims1.cc (1.13),
+	  tests/Polyhedron/foldspacedims2.cc (1.14),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.10),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.10),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.7),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.7),
+	  tests/Polyhedron/generators1.cc (1.10),
+	  tests/Polyhedron/geomcovers1.cc (1.13),
+	  tests/Polyhedron/h79widening1.cc (1.9),
+	  tests/Polyhedron/h79widening2.cc (1.9),
+	  tests/Polyhedron/hybrid.cc (1.3),
+	  tests/Polyhedron/intersection1.cc (1.13),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.8),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.9),
+	  tests/Polyhedron/linearpartition1.cc (1.11),
+	  tests/Polyhedron/linearsystem1.cc (1.8),
+	  tests/Polyhedron/linexpression1.cc (1.9),
+	  tests/Polyhedron/mapspacedims1.cc (1.12),
+	  tests/Polyhedron/matrix1.cc (1.9), tests/Polyhedron/max_min1.cc
+	  (1.11), tests/Polyhedron/maxspacedim1.cc (1.11),
+	  tests/Polyhedron/mc91.cc (1.14), tests/Polyhedron/membytes1.cc
+	  (1.14), tests/Polyhedron/memory1.cc (1.11),
+	  tests/Polyhedron/memory2.cc (1.12),
+	  tests/Polyhedron/minconstraints1.cc (1.9),
+	  tests/Polyhedron/minconstraints2.cc (1.11),
+	  tests/Polyhedron/mingenerators1.cc (1.9),
+	  tests/Polyhedron/mingenerators2.cc (1.10),
+	  tests/Polyhedron/nncminimize1.cc (1.5),
+	  tests/Polyhedron/nncminimize2.cc (1.6),
+	  tests/Polyhedron/numberinput1.cc (1.29),
+	  tests/Polyhedron/onepoint.cc (1.10), tests/Polyhedron/permute.cc
+	  (1.7), tests/Polyhedron/pointsetpowerset1.cc (1.5),
+	  tests/Polyhedron/polydifference1.cc (1.10),
+	  tests/Polyhedron/polydifference2.cc (1.10),
+	  tests/Polyhedron/polyhull1.cc (1.10),
+	  tests/Polyhedron/polyhull2.cc (1.10),
+	  tests/Polyhedron/powerset1.cc (1.19),
+	  tests/Polyhedron/randphull1.cc (1.10),
+	  tests/Polyhedron/randphull2.cc (1.9),
+	  tests/Polyhedron/relations1.cc (1.9),
+	  tests/Polyhedron/relations2.cc (1.10),
+	  tests/Polyhedron/relations3.cc (1.9),
+	  tests/Polyhedron/removespacedims1.cc (1.9),
+	  tests/Polyhedron/removespacedims2.cc (1.9),
+	  tests/Polyhedron/smm1.cc (1.7), tests/Polyhedron/timeelapse1.cc
+	  (1.10), tests/Polyhedron/timeelapse2.cc (1.10),
+	  tests/Polyhedron/topclosed1.cc (1.10),
+	  tests/Polyhedron/topclosure1.cc (1.9),
+	  tests/Polyhedron/universe1.cc (1.9),
+	  tests/Polyhedron/universe2.cc (1.9),
+	  tests/Polyhedron/variablesset1.cc (1.9),
+	  tests/Polyhedron/watchdog1.cc (1.9),
+	  tests/Polyhedron/writeconsys1.cc (1.9),
+	  tests/Polyhedron/writegensys1.cc (1.9),
+	  tests/Polyhedron/writepolyhedron1.cc (1.9),
+	  tests/Polyhedron/writepolyhedron2.cc (1.9),
+	  tests/Polyhedron/writerelation1.cc (1.11),
+	  tests/Polyhedron/writevariable1.cc (1.7), utils/Makefile.am
+	  (1.14), utils/build_header.in (1.4), utils/cm_cleaner.sh (1.2),
+	  utils/cm_splitter.sh (1.2), utils/text2cxxarray.in (1.3),
+	  utils/timings.cc (1.8), utils/timings.hh (1.5): Copyright years
+	  extended.
+
+2006-12-30 Saturday 21:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.30):
+	  Fixed a bug for Pointset_Powerset BHZ03 extrapolation predicates.
+
+2006-12-30 Saturday 14:03  Andrea Cimino
+
+	* configure.ac (1.258): Removed an extra (previously added) `@'.
+
+2006-12-30 Saturday 13:55  Andrea Cimino
+
+	* configure.ac (1.257): Fixed to allow compiling the Java interface
+	  when the instantiation Pointset_Powerset<Polyhedron> is
+	  requested.
+
+2006-12-28 Thursday 16:57  Andrea Cimino
+
+	* m4/ac_prog_java.m4 (1.4): Fixed a `test' statement in a m4 macro.
+
+2006-12-27 Wednesday 14:25  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.10), ppl_interface_generator_ocaml_dat.m4 (1.3),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.10),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.3), test1.ml (1.26):
+	  Written initial support for OCaml Pointset_Powerset.
+
+2006-12-26 Tuesday 14:48  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.9), ppl_interface_generator_ocaml_dat.m4 (1.2),
+	  ppl_interface_generator_ocaml_ml.m4 (1.6), ppl_ocaml_globals.cc
+	  (1.6): Launch an OCaml exception if a PPL method requires an
+	  unsigned integer and the input is a negative number.	Fixed some
+	  bugs in the interface.
+
+2006-12-26 Tuesday 12:40  Andrea Cimino
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.8):
+	  Fixed a wrong m4 replacement.
+
+2006-12-25 Monday 17:02  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.22),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.18), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.11): Added CC76_narrowing_assign in the Java interface.
+
+2006-12-24 Sunday 14:56  Andrea Cimino
+
+	* m4/ac_prog_javac.m4 (1.3): Put an extra space between `whether'
+	  and `$JAVAC' in a `configure' message.
+
+2006-12-24 Sunday 11:59  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.7), ppl_interface_generator_ocaml_ml_code.m4 (1.9),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.2), test1.ml (1.25):
+	  Widening OCaml function are split in versions with and without
+	  tokens.
+
+2006-12-23 Saturday 19:00  Andrea Cimino
+
+	* interfaces/OCaml/: Makefile.am (1.24),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.6),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.8),
+	  ppl_interface_generator_ocaml_mli.m4 (1.1),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.1), ppl_ocaml.mli
+	  (1.18), ppl_ocaml_globals.ml (1.5): Now the interface file .mli
+	  is automatically generated.  Added support for compilation with
+	  srcdir != builddir.  Added support for parallel builds.
+
+2006-12-23 Saturday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.91): Revised the documentation for
+	  refine_existential() and refine_universal().
+
+2006-12-22 Friday 17:20  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.5), ppl_interface_generator_ocaml_ml_code.m4 (1.7): Interfaced
+	  other functions in the OCaml interface.
+
+2006-12-22 Friday 16:14  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.8),
+	  ppl_java_Polyhedron.cc (1.20): Removed previously non generated
+	  source files.
+
+2006-12-22 Friday 16:11  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.23): Modified dependencies for
+	  source files in Makefile.am.
+
+2006-12-22 Friday 16:01  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.ml (1.5): Removed the non generated
+	  `ppl_ocaml.ml' from the repository.
+
+2006-12-22 Friday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.9): Make sure the current
+	  directory is made before `tests'.
+
+2006-12-22 Friday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (1.10): Compile against
+	  ../ppl_java.jar.
+
+2006-12-22 Friday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (1.9): Do not distribute
+	  generated files.  Use `check_JAVA' instead of `EXTRA_DIST'.
+	  Notice that, due to a bug in Automake (at least until version
+	  1.9.6) check_JAVA targes are always compiled.  That bug has
+	  already been reported.
+
+2006-12-22 Friday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.32): Generated file should not
+	  be under CVS.
+
+2006-12-22 Friday 14:05  Andrea Cimino
+
+	* interfaces/Java/tests/Makefile.am (1.8): Java tests restored.
+
+2006-12-22 Friday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (1.2): Make sure
+	  __STDC_LIMIT_MACROS is defined before the first inclusion of
+	  <stdint.h>.
+
+2006-12-22 Friday 11:09  Andrea Cimino
+
+	* interfaces/Java/tests/Makefile.am (1.7): Use always
+	  `ppl_java.jar' archive to build and run the tests.
+
+2006-12-22 Friday 10:33  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.24): Written a Doxygen
+	  comment for function `jtype_to_unsigned'.
+
+2006-12-21 Thursday 17:28  Andrea Cimino
+
+	* interfaces/OCaml/test1.ml (1.24): Restored the
+	  `map_space_dimensions' call.
+
+2006-12-21 Thursday 17:02  Andrea Cimino
+
+	* interfaces/OCaml/test1.ml (1.23): Modified the partial function
+	  to be valid and so the C++ world doesn't throw exceptions
+
+2006-12-21 Thursday 16:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.5):
+	  Correctly generate the type c_polyhedron and nnc_polyhedron as
+	  well as any other class type.
+
+2006-12-21 Thursday 16:20  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.4), ppl_interface_generator_ocaml_ml.m4 (1.4),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.6), test1.ml (1.22):
+	  Split Polyhedron in C_Polyhedron and NNC_Polyhedron.
+
+2006-12-21 Thursday 13:00  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.22): Now it's possible to use the
+	  PPL using the module installed in the OCaml library directory.
+
+2006-12-21 Thursday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.29),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.37),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.46):
+	  Added predicates for ..._upper_bound_if_exact and
+	  poly_hull_if_exact.  Tests for them also added.
+
+2006-12-20 Wednesday 16:48  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.21): Install ppl module in OCaml
+	  library directory if requested.
+
+2006-12-20 Wednesday 15:47  Andrea Cimino
+
+	* interfaces/Java/jni/Makefile.am (1.9), m4/ac_prog_javah.m4 (1.7):
+	  Include JDK Path during C++ compilation just when the Java
+	  interface is compiled. Avoid using obsolete Autoconf macros.
+
+2006-12-20 Wednesday 14:56  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.27): Fixed a bug in the
+	  Java interface: Java grid parameters where not properly
+	  generated.
+
+2006-12-20 Wednesday 13:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.5), test1.ml (1.21): A bug in the code for generalized affine
+	  image fixed.	Improved the printing layout by test1.ml.  Other
+	  small additions to the tests in test1.ml.
+
+2006-12-20 Wednesday 12:35  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.4), ppl_ocaml_types.ml (1.5), test1.ml (1.20): Uniformed name
+	  types.  Little corrections to allow test code to compile.
+
+2006-12-20 Wednesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.3), ppl_ocaml_types.ml (1.4): Some bugs corrected.
+
+2006-12-20 Wednesday 11:46  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.20): Never remove generated
+	  files.
+
+2006-12-20 Wednesday 11:32  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.19): Patched the Makefile.am to
+	  give priority to generated .ml files when compiling.
+
+2006-12-20 Wednesday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.3), ppl_interface_generator_ocaml_ml.m4 (1.3),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.2),
+	  ppl_ocaml_types.ml (1.3): Added ppl_ at CLASS@_equals_ at CLASS@ to the
+	  interface.  Corrected bugs in code for
+	  ppl_ at CLASS@_ at COMPARISON@_ at CLASS@ Added a type
+	  "relation_with_grid_generator" and corrected some typos that
+	  prevented the generated ppl_ocaml.ml compiling.
+
+2006-12-19 Tuesday 18:07  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (1.5): Don't forget the
+	  denominator when building PPL grid parameters.
+
+2006-12-19 Tuesday 18:04  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml_globals.cc (1.4), ppl_ocaml_types.ml
+	  (1.2): Implemented support for grid_generator and
+	  grid_generator_system.  No more noisy warnings.
+
+2006-12-19 Tuesday 15:56  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.2), ppl_ocaml_globals.cc (1.3): Compilation restored but still
+	  some work needed to let work things properly.
+
+2006-12-19 Tuesday 14:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.31): Restore file that should
+	  not have been revised in previous commit.
+
+2006-12-19 Tuesday 14:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: Makefile.am (1.18),
+	  ppl_interface_generator_ocaml_cc.m4 (1.1),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.1), ppl_ocaml.cc
+	  (1.30), ppl_ocaml_globals.cc (1.2), test1.ml (1.19): Adding code
+	  for generating the ppl_ocaml.cc file.
+
+2006-12-19 Tuesday 10:44  Andrea Cimino
+
+	* interfaces/Java/Makefile.am (1.8): Install ppl_java.jar in
+	  $prefix/lib/ppl when a `make install' is invoked.
+
+2006-12-19 Tuesday 09:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml.m4 (1.2),
+	  ppl_ocaml.cc (1.29), ppl_ocaml_globals.cc (1.1),
+	  ppl_ocaml_globals.ml (1.4): Separated the ppl_ocaml.cc code into
+	  a fixed part and a part to be generated.  Moved more code from
+	  the generated part of ppl_ocaml.ml to the fixed part.
+
+2006-12-19 Tuesday 09:30  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.6),
+	  Makefile.am (1.6): Added a simple test for the Java interface.
+	  Modified Makefile.am to avoid possible problems when `make check'
+	  is called more than one time.
+
+2006-12-18 Monday 23:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: Makefile.am (1.17),
+	  ppl_interface_generator_ocaml_dat.m4 (1.1),
+	  ppl_interface_generator_ocaml_ml.m4 (1.1),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.1), ppl_ocaml.cc
+	  (1.28), ppl_ocaml.ml (1.4), ppl_ocaml.mli (1.17), test1.ml
+	  (1.18): Revised names of functions to match the rest of the
+	  interfaces.  Now ppl_ocaml.ml is generated using m4 (but only
+	  checked for the Polyhedron class).
+
+2006-12-15 Friday 14:26  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.27), ppl_ocaml_globals.ml
+	  (1.3), test1.ml (1.17): Implemented
+	  `ppl_MIP_Problem_objective_function'.
+
+2006-12-14 Thursday 16:13  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.44), src/Variables_Set.cc (1.3),
+	  src/Variables_Set.defs.hh (1.4),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.2): Added `ascii_load'
+	  and `ascii_dump' for Variables_Set.  MIP problem now correctly
+	  loads and dumps problems with declared integer variables.
+
+2006-12-14 Thursday 12:25  Andrea Cimino
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.3),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.21), jni/ppl_java_globals.cc (1.4), ppl_java/Congruence.java
+	  (1.4), ppl_java/Congruence_System.java (1.2),
+	  ppl_java/Constraint.java (1.4), ppl_java/Constraint_System.java
+	  (1.2), ppl_java/Generator.java (1.4),
+	  ppl_java/Generator_System.java (1.2),
+	  ppl_java/Grid_Generator.java (1.4),
+	  ppl_java/Grid_Generator_System.java (1.3),
+	  ppl_java/MIP_Problem.java (1.3), ppl_java/Makefile.am (1.26),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.17), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.10), tests/ppl_java_tests_common (1.6): All the Java classes
+	  now have the `toString' method that returns a string
+	  representation of each PPL object.
+
+2006-12-14 Thursday 10:50  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_globals.cc (1.3),
+	  ppl_java/Linear_Expression.java (1.4), ppl_java/Makefile.am
+	  (1.25), tests/ppl_java_tests_common (1.5): Added the method
+	  `toString' the returns a string representation of a linear
+	  expression.
+
+2006-12-13 Wednesday 19:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am, interval2.cc (altnum.[5,1]): A test
+	  derived from interval1.cc that exhibits an interesting behavior.
+
+2006-12-13 Wednesday 18:38  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.90): Fixed typo.
+
+2006-12-13 Wednesday 18:31  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.26): Removed previously
+	  commented code (now useless).
+
+2006-12-13 Wednesday 18:27  Andrea Cimino
+
+	* interfaces/OCaml/: Makefile.am (1.16), ppl_ocaml.cc (1.25),
+	  ppl_ocaml.ml (1.3), ppl_ocaml.mli (1.16), ppl_ocaml_globals.ml
+	  (1.2), ppl_ocaml_types.ml (1.1), test1.ml (1.16): Defined the
+	  data structures used in `ppl_ocaml_types.ml'.  MIP_Problem
+	  interface almost completed.
+
+2006-12-13 Wednesday 14:46  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.30): Added missing fixme comment.
+
+2006-12-13 Wednesday 14:42  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Checked_Number.defs.hh,
+	  Checked_Number.inlines.hh, Interval.defs.hh
+	  (altnum.[29,42,36,89]): Completed division implementation.
+
+2006-12-12 Tuesday 19:57  Andrea Cimino
+
+	* interfaces/OCaml/: Makefile.am (1.15), ppl_ocaml.cc (1.24),
+	  ppl_ocaml.ml (1.2), ppl_ocaml_globals.ml (1.1), test1.ml (1.15):
+	  Added the file `ppl_ocaml_globals.ml' that should contain the
+	  fixed code after the migration to m4.
+
+2006-12-12 Tuesday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.6): Useless code removed.
+
+2006-12-12 Tuesday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.5): Revised so as to perform more
+	  interesting tests.
+
+2006-12-12 Tuesday 18:29  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[28,88]): New
+	  implementation for intervals add, sub and mul.
+
+2006-12-11 Monday 16:30  Andrea Cimino
+
+	* configure.ac (1.256), interfaces/OCaml/Makefile.am (1.14),
+	  interfaces/OCaml/ppl_ocaml.ml (1.1),
+	  interfaces/OCaml/ppl_ocaml.mli (1.15): Separated declaration and
+	  implementation of the OCaml interface.  Added some kinds of
+	  exceptions that relates to PPL.  Added a piece of code in
+	  `configure.ac' that tries to detect the presence of the GMP-OCaml
+	  module.
+
+2006-12-10 Sunday 16:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (1.2): Tests 01 and 02 fail with 8-bit
+	  coefficients; the same for test 04, but only when assertions are
+	  enabled.
+
+2006-12-08 Friday 23:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.102), hybrid.cc (1.1): The
+	  hybrid.cc tests three examples adapted from the papers by
+	  Halbwachs, Proy and Roumanoff on linear hybrid systems (1994 and
+	  1997).
+
+2006-12-08 Friday 14:58  Andrea Cimino
+
+	* tests/Polyhedron/: Makefile.am, serialize1.cc (serial.[1,1]):
+	  Added some tests for the Serializer class.
+
+2006-12-08 Friday 12:54  Andrea Cimino
+
+	* configure.ac, m4/ac_check_bz2lib.m4, m4/ac_check_zlib.m4,
+	  src/Bit_Matrix.defs.hh, src/Bit_Row.defs.hh,
+	  src/Constraint_System.defs.hh, src/Generator_System.defs.hh,
+	  src/Linear_System.defs.hh, src/Makefile.am,
+	  src/Ph_Status.idefs.hh, src/Polyhedron.defs.hh, src/Row.defs.hh,
+	  src/Serializer.cc, src/Serializer.defs.hh,
+	  src/Serializer.inlines.hh, src/Serializer.types.hh
+	  (serial.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Put the Serializer
+	  class under CVS control.  Added some friend declaration to let
+	  the Serializer compile.  Added a couple of macros to detect if
+	  `bz2' and `gzlib' are installed.
+
+2006-12-07 Thursday 11:05  Andrea Cimino
+
+	* src/Polyhedron_nonpublic.cc (1.74): Use `gen_sys_i' instead of
+	  `g' whenever is appropriate to avoid wrong computations.
+
+2006-12-07 Thursday 10:00  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.67): Removed an useless variable and
+	  added const to a variable in BD_Shape::refine.
+
+2006-12-06 Wednesday 19:58  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[27,87]): Fixed
+	  some compilation errors.
+
+2006-12-06 Wednesday 18:20  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.86): Commented out empty check in
+	  OK().
+
+2006-12-06 Wednesday 18:17  Abramo Bagnara
+
+	* src/: Box.inlines.hh, Box.templates.hh, Interval.defs.hh
+	  (altnum.[25,35,85]): Added non working implementation of
+	  refine_universal. Renamed refine in refine_existential.
+
+2006-12-06 Wednesday 16:38  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, checked_ext.inlines.hh
+	  (altnum.[26,84,13]): Some name cleaning. Fixed comparison.
+
+2006-12-06 Wednesday 16:24  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.23), ppl_ocaml.mli (1.14),
+	  test1.ml (1.14): Implemented `map_space_dimension' function in
+	  the OCaml interface.
+
+2006-12-06 Wednesday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am, boxdifference1.cc (altnum.[4,1]): Added
+	  a test file for the box_difference_assign() method.
+
+2006-12-06 Wednesday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[22,24,34]): Added declarations and drafted
+	  implementations for methods box_difference_assign() and
+	  difference_assign().	Added an assertion inside add_constraint(),
+	  showing a bug in function refine working on Interval objects.
+
+2006-12-06 Wednesday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (altnum.41): Added missing access
+	  control specification.
+
+2006-12-06 Wednesday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.39): Compiler warnings avoided.
+
+2006-12-06 Wednesday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.20): Missing inclusions added.
+
+2006-12-06 Wednesday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (1.21): Shadowing avoided.
+
+2006-12-06 Wednesday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (altnum.7): Now the empty box
+	  (for any number of dimensions) is represented by the singleton
+	  list [empty], the test data has to be updated to match.
+
+2006-12-06 Wednesday 08:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_prolog_common.icc, tests/pl_check.pl (altnum.[7,4,6]): In
+	  tests/pl_check.pl, spelling correction done that has already been
+	  done in the main branch.
+
+	  In ppl_prolog_common.icc, in interval_term(), the upper bound
+	  when unbounded has to be "pinf" and not "minf".
+
+	  In the ppl_prolog.icc code for get_bounding_box, we must cater
+	  specially for the empty box.
+
+2006-12-05 Tuesday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (1.3): Old compilers cannot cope with the
+	  change of the previous commit: reverted.
+
+2006-12-05 Tuesday 21:53  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.22): Avoid to hide previously
+	  declared variables if there is no need.
+
+2006-12-05 Tuesday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (1.2): Useless qualifications (tentatively)
+	  removed.
+
+2006-12-05 Tuesday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.23): Spurious declaration removed.
+
+2006-12-05 Tuesday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.21): Useless breaks removed.
+	  Added a FIXME.
+
+2006-12-05 Tuesday 19:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.12):
+	  Duplicate return statement removed.
+
+2006-12-05 Tuesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.11):
+	  Spurious semicolon removed.
+
+2006-12-05 Tuesday 19:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.73): Avoid shadowing parameters.
+
+2006-12-05 Tuesday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.17), Congruence.inlines.hh (1.14),
+	  Constraint.cc (1.64), Constraint.inlines.hh (1.65),
+	  Grid.inlines.hh (1.12), Grid_Generator.defs.hh (1.27),
+	  Grid_Generator.inlines.hh (1.12),
+	  Grid_Generator_System.inlines.hh (1.11), Makefile.am (1.166),
+	  Polyhedron.inlines.hh (1.135): Inclusions fixed.  A couple of
+	  constructors (with loops) made non-inline.  Made sure inlines are
+	  defined before being called.
+
+2006-12-05 Tuesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/max_space_dimension.hh (1.10): Fixed max_space_dimension().
+
+2006-12-05 Tuesday 17:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/fromgensys1.cc (altnum.3): Adapted to the Box
+	  abstraction; also test the case of closure points.
+
+2006-12-05 Tuesday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.33): Implemented constructor
+	  Box(const Generator_System& gs).
+
+2006-12-05 Tuesday 17:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.42): Spelling corrected.
+
+2006-12-05 Tuesday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[21,23]): Added
+	  recycling constructors from systems of constraints/generators.
+	  Prefer Interval::set_universe() where appropriate.
+
+2006-12-05 Tuesday 11:35  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.20), ppl_ocaml.mli (1.13),
+	  test1.ml (1.13): Implemented `fold_space_dimensions' and
+	  `remove_space_dimensions'.
+
+2006-12-05 Tuesday 09:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/mapspacedims1.cc (altnum.3): Fixed known results.
+
+2006-12-05 Tuesday 09:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.22): Temporarily patched constructor
+	  taking a Constraint_System.
+
+2006-12-04 Monday 23:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.32): Do not assume the underlying
+	  interval type can handle empty intervals (apart from answering
+	  the is_empty() query).
+
+2006-12-04 Monday 23:11  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.83): Invalidate cardinality cache
+	  when needed.
+
+2006-12-04 Monday 22:54  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.82): Added missing return.
+
+2006-12-04 Monday 22:49  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.81): Call normalize() only on
+	  restricted intervals.
+
+2006-12-04 Monday 22:33  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Result.defs.hh, checked.defs.hh
+	  (altnum.[40,3,41]): Made Check_Overflow_Policy more transparent.
+
+2006-12-04 Monday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/empty1.cc (altnum.2): New function test06() exhibits a
+	  bug in Box::is_empty().  The other tests are currently not
+	  executed since they are waiting for conversion.
+
+2006-12-04 Monday 22:06  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.80): Added OK() calls.
+
+2006-12-04 Monday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[20,21,31]): Drafted implementation of methods swap and
+	  map_space_dimensions.
+
+2006-12-04 Monday 21:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.30): Corrected method is_bounded().
+
+2006-12-04 Monday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/bhz03widening1.cc (altnum.2): Disambiguate pointer to
+	  widening method. Added a FIXME to remember that we need to define
+	  a widening certificate for CC76.
+
+2006-12-04 Monday 21:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (altnum.1): Put under CVS control.
+
+2006-12-04 Monday 21:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/bgp99extrapolation1.cc (altnum.2): Avoid ambiguity when
+	  taking the address of method CC76_widening_assign.
+
+2006-12-04 Monday 20:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh (altnum.[19,29]): Added
+	  (optional) tokens support to CC76 widening method.
+
+2006-12-04 Monday 20:03  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.79): Fixed singleton output.
+
+2006-12-04 Monday 19:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.4): Do not rely on default
+	  parameters of std::complex constructors.
+
+2006-12-04 Monday 19:43  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.78): Added explicit.
+
+2006-12-04 Monday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.3): First rough bits of a new test
+	  shows some interesting things.
+
+2006-12-04 Monday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh, Interval.defs.hh
+	  (altnum.[18,28,77]): Drafted implementations for
+	  Box::ascii_dump() and Box::ascii_load(), currently depending on
+	  stub implementations of the corresponding methods of class
+	  Interval.
+
+2006-12-04 Monday 18:56  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.76): Added return value.
+
+2006-12-04 Monday 18:52  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.75): Fixed info for singleton.
+
+2006-12-04 Monday 18:46  Abramo Bagnara
+
+	* src/: Box.inlines.hh, Interval.defs.hh (altnum.[20,74]): Fixed
+	  division.
+
+2006-12-04 Monday 18:36  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.73): Fixed return type.
+
+2006-12-04 Monday 18:25  Abramo Bagnara
+
+	* src/: Interval.defs.hh, Interval_Restriction.defs.hh
+	  (altnum.[72,9]): Added operators.
+
+2006-12-04 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.71): Added naive version of
+	  Interval::Interval(const Boundary&).
+
+2006-12-04 Monday 17:57  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.35): Fixed typo.
+
+2006-12-04 Monday 16:50  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.70): Fixed signatures.
+
+2006-12-04 Monday 16:24  Abramo Bagnara
+
+	* tests/Box/interval1.cc (altnum.2): Fixed policy.
+
+2006-12-04 Monday 15:49  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.19): Simplified the code to
+	  build constraint systems, generator systems and congruence
+	  systems.
+
+2006-12-04 Monday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundingbox3.cc (altnum.5): Print constraints
+	  whenever printing generators does not give any advantage.  Always
+	  print after having determined the result of the test.
+
+2006-12-04 Monday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.31): Missing dependency added.
+
+2006-12-04 Monday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.27): Corrected a bug in
+	  CC76_widening_assign().
+
+2006-12-04 Monday 15:22  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.18), ppl_ocaml.mli (1.12):
+	  Drafted a first implementation of `relation_with' methods.  In
+	  OCaml the value returned is a list with the relations between a
+	  Constraint/Generator and the Polyhedron.
+
+2006-12-04 Monday 14:48  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.69): Use checked I/O.
+
+2006-12-04 Monday 14:47  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[39,34]): Added I/O for native.
+
+2006-12-04 Monday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: boundingbox1.cc, boundingbox2.cc
+	  (altnum.[5,4]): Print constraints whenever printing generators
+	  does not give any advantage.	Always print after having
+	  determined the result of the test.
+
+2006-12-04 Monday 14:15  Abramo Bagnara
+
+	* src/Interval_Restriction.defs.hh (altnum.8): Fixed restrict()
+	  return value.
+
+2006-12-04 Monday 13:56  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.25): Fixed typo.
+
+2006-12-04 Monday 12:44  Abramo Bagnara
+
+	* src/: Interval_Info.defs.hh, Interval_Restriction.defs.hh
+	  (altnum.[16,7]): Clear info in constructors.
+
+2006-12-04 Monday 12:43  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.68): Added I_MAYBE_EMPTY.
+
+2006-12-04 Monday 12:43  Abramo Bagnara
+
+	* src/Box.inlines.hh (altnum.19): Fixed use of I_Result.
+
+2006-12-04 Monday 12:42  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.24): Fixed boundary comparison.
+
+2006-12-04 Monday 10:42  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.17), ppl_ocaml.mli (1.11),
+	  test1.ml (1.12): Implemented the swap operation between two
+	  polyhedrons.
+
+2006-12-03 Sunday 22:30  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Interval_Restriction.defs.hh,
+	  Temp.defs.hh, checked.inlines.hh (altnum.[38,6,9,31]): Removed
+	  optional parameter in Enable_If when it's useless and confusing.
+
+2006-12-03 Sunday 22:22  Abramo Bagnara
+
+	* src/Temp.defs.hh (altnum.8): Added option type parameter.
+
+2006-12-03 Sunday 20:29  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh, Temp.defs.hh (altnum.[33,7]):
+	  Fixed swap calls.
+
+2006-12-03 Sunday 20:20  Abramo Bagnara
+
+	* src/Temp.defs.hh (altnum.6): Cleaned namespace mess.
+
+2006-12-03 Sunday 19:56  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Temp.defs.hh, mp_std_bits.defs.hh, mp_std_bits.inlines.hh,
+	  Checked_Number.defs.hh, mp_std_bits.defs.hh
+	  (altnum.[36,32,5,3,2,37,4]): Moved swap in the same namespace of
+	  type of its arguments.
+
+2006-12-03 Sunday 17:57  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh,
+	  Rational_Box.hh (altnum.[23,67,15,11]): Removed policy flag
+	  infinity_is_open and fixed the related mess.
+
+2006-12-03 Sunday 17:20  Abramo Bagnara
+
+	* src/Rational_Box.hh (altnum.10): Fixed policy.
+
+2006-12-03 Sunday 17:17  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.66): Fixed OK check.
+
+2006-12-03 Sunday 16:00  Abramo Bagnara
+
+	* src/globals.defs.hh (altnum.13): Much more elegant definitions
+	  for Constant.
+
+2006-12-03 Sunday 14:48  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.16), ppl_ocaml.mli (1.10),
+	  test1.ml (1.11): Implemented `maximize', `minimize' and
+	  `expand_space_dimension'.
+
+2006-12-03 Sunday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (altnum.3): Restored some
+	  of the code lost during the ninth merge from the main trunk.
+
+2006-12-03 Sunday 00:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (altnum.7): Avoid comparing a
+	  Checked_Number with the integer constant 1.
+
+2006-12-02 Saturday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  instchk.hh, Watchdog/config.guess, Watchdog/config.sub,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/C/Makefile.am,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/ppl_java/By_Reference.java,
+	  interfaces/Java/ppl_java/Coefficient.java,
+	  interfaces/Java/ppl_java/Congruence.java,
+	  interfaces/Java/ppl_java/Congruence_System.java,
+	  interfaces/Java/ppl_java/Constraint.java,
+	  interfaces/Java/ppl_java/Constraint_System.java,
+	  interfaces/Java/ppl_java/Degenerate_Element.java,
+	  interfaces/Java/ppl_java/Domain_Error_Exception.java,
+	  interfaces/Java/ppl_java/Generator.java,
+	  interfaces/Java/ppl_java/Generator_System.java,
+	  interfaces/Java/ppl_java/Generator_Type.java,
+	  interfaces/Java/ppl_java/Grid_Generator.java,
+	  interfaces/Java/ppl_java/Grid_Generator_System.java,
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java,
+	  interfaces/Java/ppl_java/Invalid_Argument_Exception.java,
+	  interfaces/Java/ppl_java/Lenght_Error_Exception.java,
+	  interfaces/Java/ppl_java/Linear_Expression.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Difference.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Sum.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Variable.java,
+	  interfaces/Java/ppl_java/Logic_Error_Exception.java,
+	  interfaces/Java/ppl_java/MIP_Problem.java,
+	  interfaces/Java/ppl_java/MIP_Problem_Status.java,
+	  interfaces/Java/ppl_java/Makefile.am,
+	  interfaces/Java/ppl_java/Optimization_Mode.java,
+	  interfaces/Java/ppl_java/Overflow_Error_Exception.java,
+	  interfaces/Java/ppl_java/PPL_Object.java,
+	  interfaces/Java/ppl_java/Parma_Polyhedra_Library.java,
+	  interfaces/Java/ppl_java/Partial_Function.java,
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java,
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java,
+	  interfaces/Java/ppl_java/Relation_Symbol.java,
+	  interfaces/Java/ppl_java/Variable.java,
+	  interfaces/Java/ppl_java/Variables_Set.java,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+	  interfaces/OCaml/test1.ml, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/Makefile.am, m4/ac_check_classpath.m4, m4/ac_prog_jar.m4,
+	  m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	  src/Any_Pointset.defs.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+	  src/Bit_Matrix.inlines.hh, src/Bit_Matrix.types.hh,
+	  src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+	  src/Bit_Row.types.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid_Generator_System.cc,
+	  src/Grid_chdims.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+	  src/Grid_widenings.cc, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Makefile.am,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	  src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+	  src/Saturation_Matrix.inlines.hh, src/Saturation_Matrix.types.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+	  src/Saturation_Row.inlines.hh, src/Saturation_Row.types.hh,
+	  src/Variables_Set.cc, src/Variables_Set.defs.hh,
+	  src/Variables_Set.inlines.hh, src/conversion.cc,
+	  src/globals.defs.hh, src/minimize.cc, src/mp_std_bits.cc,
+	  src/mp_std_bits.defs.hh, src/simplify.cc, src/swapping_sort.icc,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/bounds1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+	  tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/relations3.cc,
+	  tests/Grid/Makefile.am, tests/Grid/approximatepartition1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/partition1.cc, tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/powersetgeometricallyequals1.cc,
+	  tests/Grid/widening2.cc, tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/variablesset1.cc, utils/Makefile.am,
+	  utils/cm_cleaner.sh, utils/cm_splitter.sh
+	  (altnum.[5,9,6,5,23,3,6,5,12,6,7,3,5,9,7,3,4,3,3,3,3,4,3,3,3,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,6,7,2,3,7,6,7,3,3,2,2,7,2,6,3,6,3,3,5,3,3,3,2,3,2,2,2,2,2,3,5,5,6,2,2,2,2,2,2,2,2,26,5,7,6,35,3,3,3,3,3,3,3,6,6,6,3,3,30,2,6,6,3,3,6,3,3,3,3,10,7,14,11,9,3,3,3,3,4,3,4,3,3,3,3,8,12,6,1,2,7,5,3,3,3,6,3,2,2,4,3,2,2,4,2,4,3,2,3,3,3,2,2,2,3,3,6,3,3,2,3,3,2,3,2,2,3,2,3,4,3,3,3,3,2,2]):
+	  Ninth merge of the trunk to the `altnum' branch.
+
+2006-12-02 Saturday 18:01  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[34,31]): Adjusted prototype for arithmetic operators.
+
+2006-12-02 Saturday 17:27  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[22,65]):
+	  Adjusted prototype for interval == and !=.
+
+2006-12-02 Saturday 16:48  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[33,30,40,31,40,36,39]): Made
+	  relational operators on Checked_Numbers less invasive.
+
+2006-12-02 Saturday 16:22  Abramo Bagnara
+
+	* src/C_Integer.hh (altnum.1): Added support for Constants. Use
+	  only a template for all C integers info.
+
+2006-12-02 Saturday 16:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.5): Drafted the documentation for
+	  template <bool b> struct Compile_Time_Check.
+
+2006-12-02 Saturday 16:12  Abramo Bagnara
+
+	* src/: Limits.hh, Makefile.am, checked.inlines.hh,
+	  checked_int.inlines.hh, checked_mpz.inlines.hh, globals.defs.hh
+	  (altnum.[7,29,30,39,38,11]): Added support for Constants. Use
+	  only a template for all C integers info.
+
+2006-12-02 Saturday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.4): Added an example showing how
+	  to use Enable_If.
+
+2006-12-02 Saturday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+	  (altnum.[5,5]): Temporary kludge to allow parallel builds to
+	  work.
+
+2006-12-02 Saturday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.3): Drafted the documentation of
+	  template <bool b, typename T> struct Enable_If.
+
+2006-12-02 Saturday 12:44  Andrea Cimino
+
+	* interfaces/: Java/jni/ppl_java_common.cc (1.26),
+	  OCaml/ppl_ocaml.cc (1.15), OCaml/ppl_ocaml.mli (1.9),
+	  OCaml/test1.ml (1.10): Interfaced other methods that relate to
+	  Polyhedron.  Avoid useless checks in the Java interface.
+
+2006-12-02 Saturday 12:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (altnum.1): file
+	  ppl_java_common.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-12-02 Saturday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+	  (altnum.[4,4]): Previous change completed.
+
+2006-12-02 Saturday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (altnum.35): Fixed copy and paste
+	  mistake.
+
+2006-12-02 Saturday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.2): Changed an instance of
+	  `class' to `typename'.
+
+2006-12-02 Saturday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Interval.defs.hh, Interval_Restriction.defs.hh, Temp.defs.hh,
+	  checked.inlines.hh, compiler.hh, meta_programming.hh
+	  (altnum.[32,29,64,5,4,29,18,1]): New source `meta_programming.hh'
+	  will contain all our metaprogramming utilities.
+
+2006-12-02 Saturday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+	  (altnum.[3,3]): Allow parallel builds in tests/BD_Shape and
+	  tests/Octagonal_Shape.
+
+2006-12-02 Saturday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (altnum.37): Spurious comment removed.
+
+2006-12-02 Saturday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Grid/boundingbox1.cc, Grid/boundingbox2.cc,
+	  Grid/coveringbox1.cc, Grid/coveringbox2.cc,
+	  Grid/directproduct1.cc, Polyhedron/boundingbox1.cc,
+	  Polyhedron/boundingbox3.cc (altnum.[3,3,3,3,3,4,4]): No longer
+	  use Bounding_Box: use Rational_Box instead.
+
+2006-12-02 Saturday 10:58  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.28): Fixed comparison.
+
+2006-12-02 Saturday 10:58  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.36): Added missing #include.
+
+2006-12-02 Saturday 10:32  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.14): Solved a bug that was
+	  causing segmentation faults.
+
+2006-12-02 Saturday 10:13  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[27,34,35]): Implemented universal
+	  comparisons.
+
+2006-12-02 Saturday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.17): Drafted the documentation for
+	  template <typename Base, typename Derived> struct
+	  Is_Same_Or_Derived.
+
+2006-12-02 Saturday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Temp.defs.hh, compiler.hh (altnum.[3,16]): Drafted the
+	  documentation for template <bool b> struct Bool, struct True,
+	  struct False, and template <typename T1, typename T2> struct
+	  Is_Same.
+
+2006-12-02 Saturday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh,
+	  GMP_Integer.types.hh, Makefile.am, Old_Interval.defs.hh,
+	  checked.defs.hh, checked_mpq.inlines.hh, checked_mpz.inlines.hh,
+	  checked_numeric_limits.hh, mp_numeric_limits.hh,
+	  mp_std_bits.defs.hh, mp_std_bits.inlines.hh
+	  (altnum.[9,8,6,28,3,39,33,34,7,3,1,1]): New sources
+	  `mp_std_bits.defs.hh' and `mp_std_bits.inlines.hh' contain the
+	  specializations of std:: objects that are not defined by GMP and
+	  MPFR (presently these include std::swap() and
+	  std::numeric_limits).  The policy is to include
+	  mp_std_bits.defs.hh immediately after each inclusion of gmpxx.h.
+	  File `mp_numeric_limits.hh' phased out.
+
+2006-12-01 Friday 18:00  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh,
+	  Interval_Restriction.defs.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh, compiler.hh, fpu-ia32.inlines.hh
+	  (altnum.[21,63,14,4,30,38,15,5]): Silenced some warnings.
+
+2006-12-01 Friday 17:59  Abramo Bagnara
+
+	* src/Temp.defs.hh (altnum.2): Commented out missing specialization
+	  check.
+
+2006-12-01 Friday 16:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.16),
+	  ppl_interface_generator_common_dat.m4 (1.26),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.28),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.36),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.45): Use the H79 certificate for more widenings.  Provided
+	  code for extrapolation operators for the disjuncts for the BGP99
+	  extrapolation. However this is not enabled as the C++ code does
+	  not support this yet.
+
+	  Allow for the replacement to be "NONE" as well as the
+	  alternative.	If either are "NONE" then the code is not
+	  generated.
+
+2006-12-01 Friday 15:55  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.20): Commented out two
+	  COMPILE_TIME_CHECK.
+
+2006-12-01 Friday 15:54  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[32,33]): Added missing swap.
+
+2006-12-01 Friday 15:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Interval.defs.hh,
+	  Interval_Restriction.defs.hh, Rounding_Dir.defs.hh, Temp.defs.hh,
+	  checked.defs.hh, checked_mpq.inlines.hh, checked_mpz.inlines.hh,
+	  compiler.hh (altnum.[31,62,3,5,1,38,31,32,14]): Added support for
+	  fast (dirty) temporary.
+
+2006-12-01 Friday 14:43  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.13): Use a more appropriate way
+	  to return PPL coefficients to the OCaml world.
+
+2006-12-01 Friday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh, OR_Matrix.inlines.hh (altnum.[3,3]):
+	  Use the function sgn() when comparing a Checked_Number with the
+	  constant 0.
+
+2006-12-01 Friday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh
+	  (altnum.[5,5]): Avoid comparing a checked number with the integer
+	  constant 1.
+
+2006-12-01 Friday 11:58  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.12), test1.ml (1.9): The code
+	  now compiles also with non GMP types.  Still some problems to
+	  solve in the lookup phase at runtime.
+
+2006-12-01 Friday 10:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.25):
+	  Redundant code removed and a "FIXME" comment added.
+
+2006-12-01 Friday 10:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.15),
+	  ppl_interface_generator_common_dat.m4 (1.24): Further
+	  modifications to the code for generating the pattern replacements
+	  means that we can also generate the code for the
+	  Pointset_Powerset<BD_Shape<int8_t> > (and similarly
+	  Octagonal_Shape) for the widening and extrapolation operators.
+
+	  One new feature introduced in the m4 code is: if the alternative
+	  replacement is defined to be "NONE", no code is generated. This
+	  caters for the case when the BD_Shape widening does not come with
+	  a certificate and, so, cannot be used for the pointset powerset
+	  certificate widening.
+
+2006-12-01 Friday 09:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.23): In the
+	  widening/extrapolation of Pointset_Powerset domains, when the
+	  disjunct domain is C_Polyhedron or NNC_Polyhedron, we must remove
+	  the topology before looking for the pattern replacement for the
+	  disjunct widening.
+
+2006-12-01 Friday 08:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.27),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.35),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.44):
+	  Added m4 code for generating the BGP99 extrapolation assign
+	  predicate.  A simple check for this extrapolation predicate added
+	  to the tests.
+
+	  Also added draft code for a "with_tokens" version of the BHZ03
+	  certificate widening (but not enabled as there is no
+	  "with_tokens" option in the C++ BHZ03 widening).
+
+2006-12-01 Friday 07:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.34): Correction to Pointset_Powerset certificate widening
+	  code.
+
+2006-11-30 Thursday 23:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.22),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.26),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.33): Added
+	  Prolog predicates for widening pointset_powerset domains using
+	  certificate-based widenings. Code is incomplete and not working.
+
+2006-11-30 Thursday 23:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.defs.hh (altnum.[25,61]): Fixed
+	  implementation of contains() for intervals.  Corrected a bug in
+	  the implementation of Box::contains(). Pointed out a name hiding
+	  issue.
+
+2006-11-30 Thursday 22:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh (altnum.[17,24]): Implemented
+	  method Box::contains().
+
+2006-11-30 Thursday 18:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh
+	  (altnum.[4,4]): Use the sign function when comparing a checked
+	  coefficient with the integer constant 0.
+
+2006-11-30 Thursday 18:43  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.11), ppl_ocaml.mli (1.8),
+	  test1.ml (1.8): Defined and implemented other methods that belong
+	  to Polyhedron.
+
+2006-11-30 Thursday 17:09  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[30,28]): Added implementation of sgn and cmp for native
+	  types.
+
+2006-11-30 Thursday 16:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (altnum.5): Added dummy definitions for
+	  Test_Box_Interval_Info and for check_result() on Box objects.
+
+2006-11-30 Thursday 14:36  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.10), ppl_ocaml.mli (1.7),
+	  test1.ml (1.7): Added support to return congruence systems.
+
+2006-11-30 Thursday 14:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.60): Typo corrected.
+
+2006-11-30 Thursday 13:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh (altnum.13): Added copyright preamble.
+
+2006-11-30 Thursday 13:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rational_Box.hh (altnum.9): Use Interval_Restriction_None
+	  instead of Interval_No_Restrictions.
+
+2006-11-30 Thursday 09:48  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.9), ppl_ocaml.mli (1.6),
+	  test1.ml (1.6): Written the code to return constraints,
+	  generators, generator systems and constraints system.
+
+2006-11-30 Thursday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.59): Use function info to access
+	  private base class.
+
+2006-11-30 Thursday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Restriction.defs.hh (altnum.2): Corrected a typo (EQ
+	  --> V_EQ).
+
+2006-11-30 Thursday 09:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (altnum.4): Inserted a few comppile-time
+	  boolean constants in Test_Box_Interval_Info_Policy; the policy
+	  still misses members.
+
+2006-11-30 Thursday 09:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.58): Added inline definition for
+	  operator!=.
+
+2006-11-30 Thursday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (altnum.30): Added a missing template
+	  argument to a div call in the sqrt implementation.
+
+2006-11-29 Wednesday 17:46  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Box.templates.hh, Interval.defs.hh,
+	  Interval_Info.defs.hh, Interval_Restriction.defs.hh,
+	  Rational_Box.hh, checked_float.inlines.hh, checked_int.inlines.hh
+	  (altnum.[19,23,57,12,1,8,29,37]): First working version of
+	  Interval_Restriction_Integer_Modulo.
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/approximatepartition1.cc (altnum.1): file
+	  approximatepartition1.cc was added on branch altnum on 2006-12-02
+	  22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetdifference1.cc (altnum.1): file
+	  powersetdifference1.cc was added on branch altnum on 2006-12-02
+	  22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallycovers1.cc (altnum.1): file
+	  powersetgeometricallycovers1.cc was added on branch altnum on
+	  2006-12-02 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallyequals1.cc (altnum.1): file
+	  powersetgeometricallyequals1.cc was added on branch altnum on
+	  2006-12-02 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.9), src/Pointset_Powerset.defs.hh
+	  (1.10), tests/Grid/Makefile.am (1.45),
+	  tests/Grid/approximatepartition1.cc (1.1),
+	  tests/Grid/partition1.cc (1.3), tests/Grid/powerset1.cc (1.4),
+	  tests/Grid/powersetdifference1.cc (1.1),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.1),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.1): Corrected and
+	  improved the code for approximate_partition() The test file
+	  approximatepartition1.cc now tests this.  Restored partition1.cc
+	  to just test the algorithm partition() defined there.  Replaced
+	  powerset1.cc by three test files, one for each operation and
+	  added some extra tests.
+
+2006-11-29 Wednesday 06:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/:
+	  ppl_interface_generator_sicstus_sd_cc.m4 (1.5), sp_clpq.pl
+	  (1.14), sp_pl_check.pl (1.8): Added support for SICStus 4.
+
+2006-11-28 Tuesday 18:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.8), src/Pointset_Powerset.defs.hh
+	  (1.9), tests/Grid/partition1.cc (1.2), tests/Grid/powerset1.cc
+	  (1.3): Boolean flag name changed from exact to finite_partition.
+
+	  Added another test to powerset1.cc Changed partition1.cc test to
+	  use approximate_partition()
+
+	  Revised/added a couple of comments.
+
+2006-11-28 Tuesday 17:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.cc (1.7), Pointset_Powerset.defs.hh
+	  (1.8): Functions approximate_partition() and check_containment()
+	  working on (powersets of) grids are now publicly available.
+	  Corrected the handling of the boolean argument encoding exactness
+	  of the partition.
+
+2006-11-28 Tuesday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.7): Use std::make_pair()
+	  where appropriate.
+
+2006-11-28 Tuesday 09:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.21): Enable
+	  ..._geometrically_covers/2 and ..._geometrically_equals/2 for
+	  powersets of Grids.
+
+2006-11-28 Tuesday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.6), src/Pointset_Powerset.inlines.hh
+	  (1.5), tests/Grid/powerset1.cc (1.2): Added
+	  geometrically_covers() and geometrically_equals() for Grids.	A
+	  few basic tests for them also added.
+
+2006-11-28 Tuesday 08:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (1.44), tests/Grid/powerset1.cc (1.1),
+	  src/Pointset_Powerset.cc (1.5): Added poly_difference_assign()
+	  for powersets of grids.
+
+	  Tests added to check this.
+
+	  Also added approximate_partition() for two grids that sets a
+	  Boolean flag depending on whether or not the partition is exact.
+
+2006-11-27 Monday 18:29  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.56): Readded
+	  set_{lower,upper}_unbounded.
+
+2006-11-27 Monday 17:07  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.8), ppl_ocaml.mli (1.5),
+	  test1.ml (1.5): Defined and implemented some constructors and
+	  methods that relates to Polyhedron.
+
+2006-11-27 Monday 16:31  Abramo Bagnara
+
+	* src/: Interval.defs.hh, Interval_Info.defs.hh (altnum.[55,11]):
+	  Fixed some constness.
+
+2006-11-27 Monday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.4): Added stub implementations for a
+	  couple of fully specialized members.
+
+2006-11-27 Monday 15:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.7): Little adjustments to the
+	  documentation: prefer "disjuncts" to "polyhedra" when talking
+	  about elements of a Pointset_Powerset.  Added declarations for
+	  the Pointset_Powerset<Grid> specializations of methods
+	  poly_difference_assign() and geometrically_covers().
+
+2006-11-27 Monday 15:11  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh (altnum.[37,26]): Moved
+	  #include compiler.hh.
+
+2006-11-27 Monday 15:04  Abramo Bagnara
+
+	* src/Rational_Box.hh (altnum.7): Some fixes to conform to new
+	  implementation.
+
+2006-11-27 Monday 14:23  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[18,54,10]): Shiny new implementation of intervals with
+	  support for generic restrictions.
+
+2006-11-27 Monday 14:22  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[36,25,28,36,29,31]): Added Checked_Supports template.
+	  Some name cleaning according to STANDARDS.
+
+2006-11-27 Monday 14:21  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[29,27]): Added some missing Enable_If.
+
+2006-11-27 Monday 14:20  Abramo Bagnara
+
+	* src/compiler.hh (altnum.13): Removed some macros.
+
+2006-11-27 Monday 13:52  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.45),
+	  tests/Octagonal_Shape/constraints1.cc (1.2),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.5): Corrected two bugs:
+	  one in relation_with() and another in add_constraint().
+
+2006-11-27 Monday 13:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.20),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.43): Temporarily disable poly_difference for powersets where
+	  the elements are not Polyhedra.
+
+	  Corrected a bug in the test code..
+
+2006-11-27 Monday 12:42  quartieri
+
+	* tests/BD_Shape/constraints1.cc (1.17), src/BD_Shape.templates.hh
+	  (1.66): Corrected an error in add_constraint() when adding an
+	  inconsistent constraint.
+
+2006-11-27 Monday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.36): In the section about "Names", added (surely
+	  partial) guidelines about when to use lower, upper and mixed case
+	  identifiers.
+
+2006-11-27 Monday 11:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/constraints1.cc (1.16): Added test05 which shows
+	  an error when adding an inconsistent constraint.
+
+2006-11-27 Monday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.32): Corrected ...add_disjuncts code - we must use the C++
+	  name and not the interface name.
+
+2006-11-25 Saturday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.31): When calling predicate ppl_*_get_disjunct/2, the
+	  resulting PPL object handle is now registered in the track
+	  allocation system by calling macro WEAK_REGISTER. These handles
+	  should not be deleted by the Prolog programmer.
+
+2006-11-25 Saturday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.20): Added a new set of
+	  registered objects whose deletion is under the PPL library
+	  responsibility. Added a new method weak_insert() to register
+	  addresses to such objects. Added shorthand macro WEAK_REGISTER.
+	  When destroying the allocation tracker, the memory leak error
+	  message is displayed only when there still are REGISTERed objects
+	  (i.e., disregarding WEAK_REGISTERed objects).
+
+2006-11-25 Saturday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.42): Corrected a few bugs leading to memory leaks when
+	  checking Pointset_Powerset instantiations.
+
+2006-11-24 Friday 17:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.30), tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.41), tests/ppl_predicate_check_common.pl (1.2): Removed some
+	  redundant code and an erroneous assignment.
+
+	  Improved the definition of all the test data.
+
+	  Improved the tests of predicates for the pointset_powerset
+	  domain.
+
+2006-11-24 Friday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/ppl_predicate_check_common.pl (altnum.1):
+	  file ppl_predicate_check_common.pl was added on branch altnum on
+	  2006-12-02 22:35:30 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Domain_Error_Exception.java (altnum.1):
+	  file Domain_Error_Exception.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Invalid_Argument_Exception.java
+	  (altnum.1): file Invalid_Argument_Exception.java was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Lenght_Error_Exception.java (altnum.1):
+	  file Lenght_Error_Exception.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Logic_Error_Exception.java (altnum.1):
+	  file Logic_Error_Exception.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Overflow_Error_Exception.java
+	  (altnum.1): file Overflow_Error_Exception.java was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (altnum.1): file ppl_interface_generator_java_test_java.m4 was
+	  added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.25),
+	  jni/ppl_java_common.hh (1.23),
+	  ppl_java/Domain_Error_Exception.java (1.1),
+	  ppl_java/Invalid_Argument_Exception.java (1.1),
+	  ppl_java/Lenght_Error_Exception.java (1.1),
+	  ppl_java/Logic_Error_Exception.java (1.1), ppl_java/Makefile.am
+	  (1.24), ppl_java/Overflow_Error_Exception.java (1.1),
+	  tests/ppl_interface_generator_java_test_java.m4 (1.3): Use
+	  appropriate classes to handle various kinds of exceptions coming
+	  from the C++ world.
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (altnum.1): file
+	  ppl_java_common.hh was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-24 Friday 14:20  Andrea Cimino
+
+	* interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+	  (1.2), ppl_interface_generator_java_test_java_code.m4 (1.9):
+	  Avoid to continue the test if an overflow is detected.
+
+2006-11-24 Friday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (altnum.1): file ppl_interface_generator_java_test_java_code.m4
+	  was added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 13:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.40): Improved and added tests for the Pointset_Powerset
+	  classes.
+
+2006-11-24 Friday 11:16  Andrea Cimino
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (1.5): Removed an
+	  useless call.
+
+2006-11-24 Friday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (altnum.1): file
+	  C_Polyhedron_test1.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-24 Friday 11:00  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.4),
+	  Makefile.am (1.5), Test_Partial_Function.java (1.1): Added a new
+	  test that relates to Partial_Function implementation in the Java
+	  interface. The written test is based on test03() of
+	  mapspacedims1.cc in the test/Polyhedron directory.
+
+2006-11-24 Friday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (altnum.1): file Makefile.am
+	  was added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Test_Partial_Function.java (altnum.1): file
+	  Test_Partial_Function.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 10:27  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.24),
+	  ppl_java_common.hh (1.22): Fixed other little errors in
+	  Partial_Function caused by a wrong cut and paste.
+
+2006-11-24 Friday 09:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.25),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.29),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.39):
+	  Added two predicates for the pointset_powerset domains.
+	  ppl_ at CLASS@_size/2 and ppl_ at CLASS@_iterator_equals_iterator/2.
+	  Some tests added to check them.
+
+2006-11-24 Friday 08:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.38): Corrected and added extra tests for the pointset_powerset
+	  predicates.
+
+2006-11-24 Friday 00:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.28): Corrected another typo in ppl_*_begin_iterator and
+	  ppl_*_end_iterator.
+
+2006-11-23 Thursday 21:32  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.23),
+	  ppl_java_common.hh (1.21): Fixed code related to Partial
+	  Function.
+
+2006-11-23 Thursday 19:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.24),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.27): Further
+	  corrected a typo in ppl_*_get_disjunct/2 (test reactivated).
+	  Removed now useless code for ppl_*_get_disjuncts/2.
+
+2006-11-23 Thursday 19:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.23),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.37):
+	  Disabled *_get_disjunct as it still is buggy.
+
+	  Changed several tests so that they first check the existence of
+	  ppl predicates before using them to test the results.  These
+	  checks now have to be in the generated code as the m4 generation
+	  no longer does similar checks.
+
+2006-11-23 Thursday 17:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.22):
+	  Enabled *_get_disjunct
+
+2006-11-23 Thursday 17:51  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.65), tests/BD_Shape/relations3.cc
+	  (1.21): Corrected bugs found in BD_Shape::relation_with(g).
+
+2006-11-23 Thursday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.21),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.26): Corrected the
+	  interfacing of Pointset_Powerset iterators:	- the predicates
+	  *_begin_iterator and *_end_iterator now construct new     objects
+	  of class iterator (note: not const_iterator) that are registered
+	  to the track allocation system;   - added a new predicate
+	  ppl_ at CLASS@_delete_iterator to deallocate an	   iterator (which
+	  is then unregistered);   - added implementations for
+	  *_increment_iterator and *_decrement_iterator;   - corrected
+	  *_get_disjunct so as to check the allocation of the iterator;   -
+	  corrected method *_drop_disjunct so as to update the iterator to
+	  point     to the next disjunct.
+
+2006-11-23 Thursday 15:36  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.8): Use try-catch blocks to allow `make check' pass when
+	  coefficients used are not the GMP ones.
+
+2006-11-23 Thursday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.41): Reactivated check on
+	  ppl_MIP_Problem_objective_function.
+
+2006-11-23 Thursday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.3): Corrected method
+	  get_linear_expression. Also made it non-templatic, as it shoudl
+	  be applied to Linear_Expression objects only.
+
+2006-11-23 Thursday 15:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (altnum.1): file
+	  ppl_prolog_common.icc was added on branch altnum on 2006-12-02
+	  22:35:29 +0000
+
+2006-11-23 Thursday 13:29  Andrea Cimino
+
+	* interfaces/Java/ppl_java/: C_Polyhedron.java (1.7), Makefile.am
+	  (1.23), Polyhedron.java (1.17): Removed old files, now
+	  automatically generated, to avoid conflicts when a parallel build
+	  is running.
+
+2006-11-23 Thursday 12:18  Andrea Cimino
+
+	* interfaces/Java/ppl_java/Makefile.am (1.22): Useless declaration
+	  removed.
+
+2006-11-23 Thursday 12:09  Andrea Cimino
+
+	* interfaces/Java/ppl_java/Makefile.am (1.21): ppl_java now
+	  compiles if a -j`n' parameter is passed to `make'.
+
+2006-11-23 Thursday 10:50  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh,
+	  checked_float.inlines.hh, checked_numeric_limits.hh
+	  (altnum.[28,35,27,6]): Removed force_integer.
+
+2006-11-23 Thursday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog_common.icc (1.2),
+	  tests/pl_check.pl (1.40): Renamed get_linear_expression() to
+	  get_homogeneous_expression() as this ignored the inhomogeneous
+	  part (needed when getting the objective function for an
+	  MIP_Problem).
+
+	  Added get_linear_expression() although tests show a bug in this.
+
+	  Extended the test predicate mip_get..
+
+2006-11-23 Thursday 09:51  Andrea Cimino
+
+	* interfaces/Java/ppl_java/Makefile.am (1.20): Removed an unused
+	  variable.
+
+2006-11-22 Wednesday 20:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.24): Java interface enabled.
+
+2006-11-22 Wednesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/MIP_Problem.java (altnum.1): file
+	  MIP_Problem.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-22 Wednesday 18:27  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.20), jni/ppl_java_globals.cc (1.2), ppl_java/MIP_Problem.java
+	  (1.2): Fixed some constructors of Polyhedron.  Added the method
+	  `constraints()' to the Java version of MIP_Problem.
+
+2006-11-22 Wednesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (altnum.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+	  added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-22 Wednesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc (altnum.1): file
+	  ppl_java_globals.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-22 Wednesday 15:44  Abramo Bagnara
+
+	* src/: checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[26,35,28,30]): Make wider use of assign_exact. Fixed
+	  floor, ceil, trunc for int.
+
+2006-11-22 Wednesday 15:42  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.24): Cleaned Safe_Comparison.
+
+2006-11-22 Wednesday 13:49  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.7): Some small changes to let the generated test be more
+	  readable.
+
+2006-11-22 Wednesday 12:49  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/checked.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, tests/Polyhedron/numberinput1.cc
+	  (altnum.[27,26,34,12,25,34,27,29,5,4]): Renamed may_be_ in has_.
+
+2006-11-22 Wednesday 12:28  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh, src/checked.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  tests/Polyhedron/numberinput1.cc
+	  (altnum.[26,33,11,24,33,26,28,4,3]): Renamed misleading
+	  handle_nan and handle_infinity in may_be_nan and may_be_infinity.
+
+2006-11-22 Wednesday 11:57  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.19),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.16), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.6), tests/ppl_java_tests_common (1.4): Fixed some small bugs
+	  in the Java interface.  Extended the generated test.
+
+2006-11-22 Wednesday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (altnum.1): file
+	  ppl_interface_generator_java_classes_java_code.m4 was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-22 Wednesday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_java_tests_common (altnum.1): file
+	  ppl_java_tests_common was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-22 Wednesday 11:56  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_float.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[23,23,25,27]): Added force_integer implementation.
+
+2006-11-22 Wednesday 11:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.25),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.36),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.24), src/Grid.defs.hh (1.38), tests/BD_Shape/relations3.cc
+	  (1.20), tests/Octagonal_Shape/relatwithgen1.cc (1.4): Comment
+	  corrected in src/Grid.defs.hh
+
+	  Redundant code removed in added tests in
+	  tests/Octagonal_Shape/relatwithgen1.cc and
+	  tests/BD_Shape/relations3.cc
+
+	  Bug corrected in
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+
+	  Generation of tests simplified (and made faster) in
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+
+	  Temporarily suppressed failing tests in
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+
+2006-11-22 Wednesday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/relations3.cc (1.19),
+	  Octagonal_Shape/relatwithgen1.cc (1.3): Added 2 tests to each of
+	  these test files.
+
+	  The first of these (13 in BD_Shape/relations3.cc and 20 in
+	  Octagonal_Shape/relatwithgen1.cc) throw an exception but the call
+	  to these is commented for now.
+
+	  The second of these (14 in BD_Shape/relations3.cc and 21 in
+	  Octagonal_Shape/relatwithgen1.cc) fail indicating a possible bug.
+
+2006-11-21 Tuesday 22:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: SICStus/sp_predicate_check.pl (1.1),
+	  SWI/swi_predicate_check.pl (1.1), tests/Makefile.am (1.12),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.35),
+	  tests/ppl_interface_generator_predicate_check_extra_code (1.23),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.23),
+	  tests/ppl_predicate_check_common.pl (1.1): The fixed part of the
+	  code containing the test data is now a separate Prolog file
+	  called tests/ppl_predicate_check_common.pl
+
+	  This is included with the generated code by the top-level test
+	  files: SICStus/sp_predicate_check.pl and
+	  SWI/swi_predicate_check.pl.  Similar files will be needed by the
+	  other Prolog systems before they can run these generated tests.
+
+	  The code generator no longer attempts to generate tests for the
+	  fixed MIP and version predicates.
+
+	  The file tests/ppl_interface_generator_predicate_check_extra_code
+	  which contained the fixed data is now replaced by
+	  ppl_predicate_check_common.pl.
+
+2006-11-21 Tuesday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_predicate_check.pl (altnum.1): file
+	  sp_predicate_check.pl was added on branch altnum on 2006-12-02
+	  22:35:29 +0000
+
+2006-11-21 Tuesday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_predicate_check.pl (altnum.1): file
+	  swi_predicate_check.pl was added on branch altnum on 2006-12-02
+	  22:35:30 +0000
+
+2006-11-21 Tuesday 18:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.19): It is
+	  upper_bound_assign_if_exact and not as I had it:
+	  upper_bound_if_exact.
+
+2006-11-21 Tuesday 18:37  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.18),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.15), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.5), tests/ppl_java_tests_common (1.3): Some fixes to the
+	  interface.  Extended the m4 generated test.
+
+2006-11-21 Tuesday 16:16  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.64): Removed an useless variable
+	  `space_dim' in refine().
+
+2006-11-21 Tuesday 15:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.18): Allow
+	  the relation_with_generator procedrure for BD_Shape.
+
+2006-11-21 Tuesday 13:35  Andrea Cimino
+
+	* interfaces/Java/ppl_java/MIP_Problem_Status.java (1.1): Added a
+	  missing enum declaration.
+
+2006-11-21 Tuesday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/MIP_Problem_Status.java (altnum.1): file
+	  MIP_Problem_Status.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-21 Tuesday 11:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: Makefile.am (1.4),
+	  ppl_interface_generator_java_test_java_code.m4 (1.4): Added a
+	  test for affine and space dimension.	Changed the Makefile.am so
+	  that make check runs the generated test.
+
+2006-11-21 Tuesday 11:28  Andrea Cimino
+
+	* interfaces/Java/tests/: Makefile.am (1.3),
+	  ppl_interface_generator_java_test_java_code.m4 (1.3),
+	  ppl_java_tests_common (1.2): Fixed test generation.  Allow
+	  Makefile to compile the generated Java source.
+
+2006-11-21 Tuesday 10:48  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.2): Fixed the m4 to build the test correctly.
+
+2006-11-21 Tuesday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Optimization_Mode.java (altnum.1): file
+	  Optimization_Mode.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-21 Tuesday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Parma_Polyhedra_Library.java (altnum.1):
+	  file Parma_Polyhedra_Library.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-21 Tuesday 10:04  Andrea Cimino
+
+	* interfaces/Java/: jni/Makefile.am (1.8), jni/ppl_java_common.cc
+	  (1.22), jni/ppl_java_common.hh (1.20), jni/ppl_java_globals.cc
+	  (1.1), ppl_java/C_Polyhedron.java (1.6),
+	  ppl_java/MIP_Problem.java (1.1), ppl_java/Makefile.am (1.19),
+	  ppl_java/Optimization_Mode.java (1.1),
+	  ppl_java/Parma_Polyhedra_Library.java (1.1): Written an almost
+	  complete support for MIP_Problem.  Written the class
+	  Parma_Polyhedra_Library to obtain version information about the
+	  library.
+
+2006-11-21 Tuesday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (altnum.1): file Makefile.am was
+	  added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-21 Tuesday 09:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+	  (1.1), ppl_interface_generator_java_test_java_code.m4 (1.1),
+	  ppl_java_tests_common (1.1): New files for generating the tests
+	  for the Java interface.
+
+2006-11-20 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.templates.hh,
+	  Octagonal_Shape_incremental_strong_closure1.hh,
+	  Octagonal_Shape_incremental_strong_closure10.hh,
+	  Octagonal_Shape_incremental_strong_closure2.hh,
+	  Octagonal_Shape_incremental_strong_closure3.hh,
+	  Octagonal_Shape_incremental_strong_closure4.hh,
+	  Octagonal_Shape_incremental_strong_closure5.hh,
+	  Octagonal_Shape_incremental_strong_closure6.hh,
+	  Octagonal_Shape_incremental_strong_closure7.hh,
+	  Octagonal_Shape_incremental_strong_closure8.hh,
+	  Octagonal_Shape_incremental_strong_closure9.hh,
+	  Octagonal_Shape_strong_closure1.hh,
+	  Octagonal_Shape_strong_closure2.hh,
+	  Octagonal_Shape_strong_closure4.hh
+	  (octagons.[52,1,1,1,1,1,1,1,1,1,1,1,1,1]): Alternate versions of
+	  Octagonal_Shape<T>::strong_closure_assign() and
+	  Octagonal_Shape<T>::incremental_strong_closure_assign(Variable).
+	  They can be selected at configure time by setting CPPFLAGS in the
+	  appropriate way.
+
+2006-11-20 Monday 12:23  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.17),
+	  ppl_java_common.hh (1.19): In widening methods, ensure that the
+	  Java token can fit in a C++ unsigned integer.
+
+2006-11-20 Monday 11:25  Andrea Cimino
+
+	* interfaces/Java/ppl_java/: Congruence.java (1.3), Constraint.java
+	  (1.3), Generator.java (1.3), Grid_Generator.java (1.3),
+	  Linear_Expression.java (1.3), Linear_Expression_Coefficient.java
+	  (1.2), Linear_Expression_Difference.java (1.3),
+	  Linear_Expression_Sum.java (1.3), Linear_Expression_Times.java
+	  (1.2), Linear_Expression_Unary_Minus.java (1.2),
+	  Linear_Expression_Variable.java (1.2): All the object are now
+	  built by copy, thanks to the implementation of the Cloneable
+	  interface.
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence.java (altnum.1): file
+	  Congruence.java was added on branch altnum on 2006-12-02 22:35:28
+	  +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Constraint.java (altnum.1): file
+	  Constraint.java was added on branch altnum on 2006-12-02 22:35:28
+	  +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator.java (altnum.1): file
+	  Generator.java was added on branch altnum on 2006-12-02 22:35:28
+	  +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator.java (altnum.1): file
+	  Grid_Generator.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression.java (altnum.1): file
+	  Linear_Expression.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
+	  (altnum.1): file Linear_Expression_Coefficient.java was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Difference.java
+	  (altnum.1): file Linear_Expression_Difference.java was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Sum.java (altnum.1):
+	  file Linear_Expression_Sum.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Times.java (altnum.1):
+	  file Linear_Expression_Times.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
+	  (altnum.1): file Linear_Expression_Unary_Minus.java was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-20 Monday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Variable.java
+	  (altnum.1): file Linear_Expression_Variable.java was added on
+	  branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-20 Monday 11:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.14): Revised the type of the token also for the widen methods.
+
+2006-11-20 Monday 11:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.13): Revised the type of the token for the limited/bounded
+	  extrapolation method.
+
+2006-11-19 Sunday 23:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.20),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.24): Prolog
+	  interface predicates ppl_..._get_disjunct and
+	  ppl_..._drop_disjunct draft code added.
+
+2006-11-19 Sunday 11:27  Abramo Bagnara
+
+	* src/: Interval.defs.hh, Interval_Info.defs.hh, Rational_Box.hh
+	  (altnum.[53,9,6]): Allow Interval inheritance. Removed
+	  check_empty_args policy.
+
+2006-11-19 Sunday 11:26  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked.inlines.hh, checked_ext.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[25,25,32,22,10,22,32,24,26]): Use separate policies also
+	  for checked lowlevel. Added trunc. Converted check_nan_args into
+	  check_nan_result. Use full function names in SPECIALIZE_ macros.
+
+2006-11-19 Sunday 11:22  Abramo Bagnara
+
+	* src/compiler.hh (altnum.12): Added ENABLE_IF macro.
+
+2006-11-18 Saturday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, INSTALL, NEWS, STANDARDS, TODO, config.guess,
+	  config.sub, configure.ac, install-sh, instchk.hh, missing,
+	  mkinstalldirs, Watchdog/ChangeLog, Watchdog/INSTALL,
+	  Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	  Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/Handler.defs.hh,
+	  Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/README,
+	  demos/ppl_lpsol/examples/egout.mps,
+	  demos/ppl_lpsol/examples/ex11.mps,
+	  demos/ppl_lpsol/examples/ex12.mps,
+	  demos/ppl_lpsol/examples/lseu.mps,
+	  demos/ppl_lpsol/examples/markshare1.mps,
+	  demos/ppl_lpsol/examples/markshare2.mps,
+	  demos/ppl_lpsol/examples/mas74.mps,
+	  demos/ppl_lpsol/examples/mas76.mps,
+	  demos/ppl_lpsol/examples/modglob.mps,
+	  demos/ppl_lpsol/examples/noswot.mps,
+	  demos/ppl_lpsol/examples/opt1217.mps,
+	  demos/ppl_lpsol/examples/p0033.mps,
+	  demos/ppl_lpsol/examples/pk1.mps,
+	  demos/ppl_lpsol/examples/rout.mps, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl_lcdd.1,
+	  doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/ppl_java/.cvsignore,
+	  interfaces/Java/ppl_java/By_Reference.java,
+	  interfaces/Java/ppl_java/C_Polyhedron.java,
+	  interfaces/Java/ppl_java/Coefficient.java,
+	  interfaces/Java/ppl_java/Congruence.java,
+	  interfaces/Java/ppl_java/Congruence_System.java,
+	  interfaces/Java/ppl_java/Constraint.java,
+	  interfaces/Java/ppl_java/Constraint_System.java,
+	  interfaces/Java/ppl_java/Degenerate_Element.java,
+	  interfaces/Java/ppl_java/Generator.java,
+	  interfaces/Java/ppl_java/Generator_System.java,
+	  interfaces/Java/ppl_java/Generator_Type.java,
+	  interfaces/Java/ppl_java/Grid_Generator.java,
+	  interfaces/Java/ppl_java/Grid_Generator_System.java,
+	  interfaces/Java/ppl_java/Grid_Generator_Type.java,
+	  interfaces/Java/ppl_java/Linear_Expression.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Coefficient.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Difference.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Sum.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Times.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java,
+	  interfaces/Java/ppl_java/Linear_Expression_Variable.java,
+	  interfaces/Java/ppl_java/Makefile.am,
+	  interfaces/Java/ppl_java/PPL_Object.java,
+	  interfaces/Java/ppl_java/Partial_Function.java,
+	  interfaces/Java/ppl_java/Poly_Con_Relation.java,
+	  interfaces/Java/ppl_java/Poly_Gen_Relation.java,
+	  interfaces/Java/ppl_java/Polyhedron.java,
+	  interfaces/Java/ppl_java/Relation_Symbol.java,
+	  interfaces/Java/ppl_java/Variable.java,
+	  interfaces/Java/ppl_java/Variables_Set.java,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+	  interfaces/OCaml/test1.ml, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  m4/Makefile.am, m4/ac_check_classpath.m4, m4/ac_prog_jar.m4,
+	  m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	  src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	  src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	  src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+	  src/Bit_Matrix.inlines.hh, src/Bit_Matrix.types.hh,
+	  src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+	  src/Bit_Row.types.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Congruence_System.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Certificate.cc, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	  src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+	  src/MIP_Problem.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/NNC_Polyhedron.cc,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/OR_Matrix.templates.hh, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.templates.hh, src/Result.defs.hh,
+	  src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/algorithms.hh,
+	  src/checked.cc, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/conversion.cc,
+	  src/fpu-ia32.inlines.hh, src/globals.defs.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/mp_numeric_limits.cc,
+	  src/mp_numeric_limits.hh, src/namespaces.hh, src/simplify.cc,
+	  src/swapping_sort.icc, tests/BBox.cc, tests/FCAIBVP.cc,
+	  tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+	  tests/FCAIBVP.types.hh, tests/Makefile.am,
+	  tests/Partial_Function.cc, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/Ask_Tell/.cvsignore,
+	  tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+	  tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+	  tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/affinepreimage2.cc, tests/Grid/asciidumpload1.cc,
+	  tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	  tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	  tests/Grid/asciidumpload6.cc, tests/Grid/asciidumpload7.cc,
+	  tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/containsintegerpoint1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/outputoperator2.cc, tests/Grid/outputoperator3.cc,
+	  tests/Grid/partition1.cc, tests/Grid/relations1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	  tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	  tests/Grid/timeelapse1.cc, tests/Grid/topclosed1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/MIP_Problem/.cvsignore,
+	  tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/append1.cc, tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/bug2.dat,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/dualhypercubes.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	  tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/timeelapse1.cc,
+	  tests/Polyhedron/variablesset1.cc, utils/Makefile.am,
+	  utils/cm_cleaner.sh, utils/cm_splitter.sh, utils/timings.cc
+	  (octagons.[1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,4,4,1,2,1,2,1,2,2,2,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,2,2,2,2,2,2,1,1,2,1,1,1,2,2,1,2,1,1,2,1,2,1,1,1,2,1,2,1,1,1,2,2,2,1,1,2,1,1,2,1,2,1,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1, [...]
+	  Second merge to octagons.
+
+2006-11-18 Saturday 16:50  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.16): A couple of bugs fixed in the generation of the C++ code.
+
+2006-11-18 Saturday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (octagons.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+	  added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-18 Saturday 16:02  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.15),
+	  ppl_java_common.hh (1.18): Ensure that a jlong fits in a unsigned
+	  type for methods that need that check. Some m4 code fixes.
+
+2006-11-18 Saturday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (octagons.1): file
+	  ppl_java_common.hh was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-18 Saturday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.205): Commit test.
+
+2006-11-18 Saturday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.204): Test commit.
+
+2006-11-18 Saturday 11:26  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh,
+	  checked_numeric_limits.hh (altnum.[24,31,3]): Added force_integer
+	  policy flag.
+
+2006-11-18 Saturday 11:25  Abramo Bagnara
+
+	* src/compiler.hh (altnum.11): Added some useful functions for
+	  static expressions.
+
+2006-11-18 Saturday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (octagons.1): file
+	  ppl_interface_generator_predicate_check_code.m4 was added on
+	  branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-18 Saturday 09:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.19),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.23),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.34):
+	  Added predicates ppl_ at CLASS@_begin_iterator\2 and
+	  ppl_ at CLASS@_end_iterator\2.
+
+	  Temporarily disabled check for geometrically_equals predicate.
+
+2006-11-18 Saturday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (octagons.1): file ppl_interface_generator_prolog_dat.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-18 Saturday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (octagons.1): file ppl_interface_generator_prolog_icc_code.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-17 Friday 16:58  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.14),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.12): Specialized generalized_affine_image and
+	  generalized_affine_preimage for Grids.
+
+2006-11-17 Friday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (octagons.1): file
+	  ppl_interface_generator_java_classes_java_code.m4 was added on
+	  branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-17 Friday 16:53  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.94), Octagonal_Shape.defs.hh (1.22):
+	  Added a note to the documentation of refine().
+
+2006-11-17 Friday 15:59  Elena Mazzi
+
+	* src/: Octagonal_Shape.defs.hh (1.21),
+	  Octagonal_Shape.templates.hh (1.44): Added an helper function for
+	  the computation of affine relations Octagonal_Shape::refine() and
+	  used it on the methods
+	  Octagonal_Shape::generalized_affine_preimage() and
+	  Octagonal_Shape::bounded_affine_preimage.
+
+2006-11-17 Friday 15:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.37),
+	  ppl_interface_generator_prolog_icc.m4 (1.8),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.22),
+	  ppl_interface_generator_prolog_icc_preamble (1.16),
+	  ppl_prolog_common.icc (1.1): The
+	  ppl_interface_generator_prolog_icc_preamble is now renamed as
+	  ppl_prolog_common.icc and included by the generated
+	  ppl_prolog.icc.
+
+	  The term_to_classname_handle() methods are now defined
+	  term_to_handle<T>() where T is the C++ class name.
+
+2006-11-17 Friday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (octagons.1): file ppl_interface_generator_prolog_icc.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-17 Friday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (octagons.1): file
+	  ppl_prolog_common.icc was added on branch octagons on 2006-11-18
+	  20:36:46 +0000
+
+2006-11-17 Friday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.15): Misplaced angle bracket fixed.
+
+2006-11-17 Friday 11:59  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.13),
+	  ppl_java_common.cc (1.21), ppl_java_common.hh (1.17): Implemented
+	  JNI functions for Grids_Generator and Grid Generator_System.
+	  Solved other little bugs.  The Java test now works.
+
+2006-11-17 Friday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (octagons.1): file
+	  ppl_java_common.cc was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-17 Friday 11:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.6): For the Polyhedron class, add include statements for
+	  ppl_java_C_Polyhedron.h and ppl_java_NNC_Polyhedron.h.
+
+2006-11-17 Friday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (altnum.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+	  branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-17 Friday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (octagons.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+	  branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-17 Friday 11:31  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.93), BD_Shape.templates.hh (1.63),
+	  Octagonal_Shape.defs.hh (1.20), Polyhedron.defs.hh (1.311): Used
+	  consistent parameter's name for max_min().
+
+2006-11-17 Friday 10:34  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.92), BD_Shape.templates.hh (1.62):
+	  Added an helper function for the computation of affine relations
+	  BD_Shape::refine() and used it on the methods
+	  BD_Shape::generalized_affine_preimage() and
+	  BD_Shape::bounded_affine_preimage.
+
+2006-11-17 Friday 10:22  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.12): Avoid compiler warning messages.
+
+2006-11-17 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.14): Added <template typename T> T*
+	  term_to_handle(Prolog_term_ref, const char*).
+
+2006-11-17 Friday 10:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.11): Correct reference to point to be generic.
+
+2006-11-17 Friday 09:57  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.16): Written the
+	  prototypes for three missing function to allow compiling.
+
+2006-11-17 Friday 09:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.10): Corrected code for intersection_assign_and_minimize (and
+	  similar binary operations that return a Boolean).
+
+2006-11-17 Friday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.9), ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.11): Corrected the bug in the OK() method.
+
+2006-11-17 Friday 09:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.5),
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.8):
+	  Only have "Recycle_Intput" for Polyhedron class.  The include
+	  statement for "ppl_java_common.hh" should occur only once.
+
+2006-11-17 Friday 09:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.21): Unused schematic code for building a new iterator added.
+
+2006-11-17 Friday 09:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.7):
+	  Activated the term_to_iterator_handle code generator.
+
+2006-11-17 Friday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.20): Added `m4_term_to_iterator_handle_code'.
+
+2006-11-17 Friday 08:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.7): Where the class name should be the C++ name, the pattern
+	  is now correct and is replaced by the right form of the name..
+
+2006-11-17 Friday 08:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.17):
+	  Reinstated a lost comma.
+
+2006-11-17 Friday 08:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (octagons.1):
+	  file ppl_interface_generator_common_dat.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 19:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.4),
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.6):
+	  REmoved cutting marks and added "try/catch" everywhere.
+
+2006-11-16 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.7): Compile only one C++ file
+	  for all the required instantiations of the Java interface.
+
+2006-11-16 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (octagons.1): file Makefile.am
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-16 Thursday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.255), interfaces/Java/jni/Makefile.am (1.6),
+	  interfaces/Java/ppl_java/Makefile.am (1.18): Automatically
+	  generated all the header files required by the Java interface.
+
+2006-11-16 Thursday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (octagons.1): file
+	  Makefile.am was added on branch octagons on 2006-11-18 20:36:45
+	  +0000
+
+2006-11-16 Thursday 18:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: jni/ppl_java_common.hh (1.15),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.10): Corrected the type of "add_..._and_minimize to be
+	  Boolean.  Typo in comment fixed.
+
+2006-11-16 Thursday 18:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.5): Bug in the relation with code fixed.
+
+2006-11-16 Thursday 18:05  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.20),
+	  ppl_java_common.hh (1.14): Renamed an internal routine.
+
+2006-11-16 Thursday 17:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.16),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.4): Some but not all bugs fixed.
+
+2006-11-16 Thursday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (1.17): CLEANFILES defined.
+
+2006-11-16 Thursday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.254): Make sure
+	  `required_instantiations_java_sources' really contains all the
+	  required Java sources.
+
+2006-11-16 Thursday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Makefile.am (1.7), ppl_java/Makefile.am (1.16):
+	  Ensure ppl_java.jar has the right structure.
+
+2006-11-16 Thursday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (octagons.1): file Makefile.am was
+	  added on branch octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 14:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.12): Corrected c++ name to interface name.
+
+2006-11-16 Thursday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (altnum.1): file ppl_interface_generator_java_classes_java.m4 was
+	  added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-16 Thursday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (octagons.1): file ppl_interface_generator_java_classes_java.m4
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-16 Thursday 14:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.9): Changed specific "Polyhedron" etc to schematic class name.
+
+2006-11-16 Thursday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Makefile.am (1.6), ppl_java/Makefile.am (1.15):
+	  Machinery to build the Java interface revised.
+
+2006-11-16 Thursday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (octagons.1): file
+	  mipproblem1.cc was added on branch octagons on 2006-11-18
+	  20:36:58 +0000
+
+2006-11-16 Thursday 14:04  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.43), tests/MIP_Problem/mipproblem1.cc
+	  (1.2): Fixed MIP_Problem when it has to deal with
+	  zero-dimensional problems.
+
+2006-11-16 Thursday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (octagons.1): file MIP_Problem.cc was added on
+	  branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-16 Thursday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/: Makefile.am (1.5),
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.3):
+	  Enabled the splitting of the generated code for the ".cc".
+
+2006-11-16 Thursday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.2),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.3), ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.11): Corrected the preamble for the ".cc" generated files.
+	  Redundant space removed.
+
+2006-11-16 Thursday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (1.14): Use TAB as separator
+	  in make rules.
+
+2006-11-16 Thursday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.253), interfaces/Java/ppl_java/Makefile.am
+	  (1.13): Added a mechanism to build the automatically generated
+	  Java sources.
+
+2006-11-16 Thursday 11:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.10),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.8): Several
+	  bugs fixed.
+
+2006-11-16 Thursday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.23), Java/ppl_java/Makefile.am
+	  (1.12): Installed the mechanism for the automatic generation of
+	  the .java sources for the semantic object classes.  The
+	  interfaces/Java directory is temporarily disabled in order to
+	  avoid failures.
+
+2006-11-16 Thursday 09:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.2): Added missing swap() and OK() methods and fixed a few
+	  bugs.
+
+2006-11-16 Thursday 09:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.9),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.7): Added
+	  some missing methods.  Corrected some schematic names.  Added
+	  lines for the closing "}".
+
+2006-11-16 Thursday 08:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.14),
+	  ppl_interface_generator_common_dat.m4 (1.15),
+	  Java/ppl_interface_generator_java_dat.m4 (1.2),
+	  Java/jni/Makefile.am (1.4),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.1),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.1): Added files for generating the ".cc" files for the
+	  classes.  This needed modifications to the main replacement m4
+	  code to allow for inserting "1" after embedded "_"s.
+
+	  Java/jni/Makefile.am includes necessary code for building the
+	  combined files (temporarily named ppl_java_Polyhedron1.cc).
+
+2006-11-16 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (octagons.1): file
+	  ppl_interface_generator_common.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (altnum.1):
+	  file ppl_interface_generator_java_dat.m4 was added on branch
+	  altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-16 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (octagons.1):
+	  file ppl_interface_generator_java_dat.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-15 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/C_Polyhedron.java (octagons.1): file
+	  C_Polyhedron.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-15 Wednesday 18:41  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_C_Polyhedron.cc (1.7),
+	  ppl_java/C_Polyhedron.java (1.5): Implemented the ordinary copy
+	  constructor of C_Polyhedron.
+
+2006-11-15 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (altnum.1): file
+	  ppl_java_C_Polyhedron.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-15 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (octagons.1): file
+	  ppl_java_C_Polyhedron.cc was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 17:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.8),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.6): The cut
+	  line must have the file name and not just the root of the file
+	  name.  Typo fixed.
+
+2006-11-15 Wednesday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.7),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.5): Added
+	  the swap and ok methods - copied from the source file.
+
+2006-11-15 Wednesday 17:19  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (1.19): Added the
+	  `try' and `catch' blocks to every method of Polyhedron.
+
+2006-11-15 Wednesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (altnum.1): file
+	  ppl_java_Polyhedron.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-15 Wednesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (octagons.1): file
+	  ppl_java_Polyhedron.cc was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-15 Wednesday 17:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.6),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.4): Changed
+	  the split marker to %<--%<--%<--
+
+2006-11-15 Wednesday 16:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.10): Add the
+	  recycle pattern to the procedure that builds from a recycled
+	  representation.
+
+2006-11-15 Wednesday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (octagons.1):
+	  file ppl_interface_generator_c_cc_code.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-15 Wednesday 16:23  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_C_Polyhedron.cc (1.6),
+	  jni/ppl_java_Polyhedron.cc (1.18), jni/ppl_java_common.cc (1.19),
+	  jni/ppl_java_common.hh (1.13), ppl_java/Polyhedron.java (1.16):
+	  Fixed a C_Polyhedron constructor.  Added the infractructure for
+	  handling the exceptions.  Defined and implemented the native
+	  methods `swap(Polyhedron)' and `OK(boolean)'.
+
+2006-11-15 Wednesday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Polyhedron.java (octagons.1): file
+	  Polyhedron.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-15 Wednesday 16:11  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.91), BD_Shape.templates.hh (1.61),
+	  Octagonal_Shape.defs.hh (1.19), Octagonal_Shape.templates.hh
+	  (1.43), Polyhedron.defs.hh (1.310), Polyhedron_nonpublic.cc
+	  (1.72): Used consistent parameter's name for max_min(),
+	  maximize() and minimize().
+
+2006-11-15 Wednesday 15:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.19): Added the recycle argument to the build from a
+	  representation.
+
+2006-11-15 Wednesday 15:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.14): Add a
+	  replacement for the extra recycle argument.
+
+2006-11-15 Wednesday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.66): Do recycle data structures
+	  when possible.
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/: Makefile.am (1.13), cm_cleaner.sh (1.1), cm_splitter.sh
+	  (1.1): cm_splitter.sh splits stdin according to cutting markers.
+	  cm_cleaner.sh erases all files listed in the cutting markers
+	  found on stdin.
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_cleaner.sh (altnum.1): file cm_cleaner.sh was added on
+	  branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_cleaner.sh (octagons.1): file cm_cleaner.sh was added on
+	  branch octagons on 2006-11-18 20:37:00 +0000
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_splitter.sh (altnum.1): file cm_splitter.sh was added on
+	  branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_splitter.sh (octagons.1): file cm_splitter.sh was added
+	  on branch octagons on 2006-11-18 20:37:00 +0000
+
+2006-11-15 Wednesday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.57): Do recycle data structures
+	  when possible.
+
+2006-11-15 Wednesday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.5),
+	  ppl_java_Polyhedron.cc (1.17): Do recycle the input data
+	  structures when possible.
+
+2006-11-15 Wednesday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.37), Grid.inlines.hh (1.11),
+	  Grid_nonpublic.cc (1.21), Grid_public.cc (1.48): Disambiguate the
+	  constructors of grids by adding a dummy argument to those that
+	  can recycle the data structures of their arguments.  Added
+	  support for actually recycling the data structures when this is
+	  allowed.  Removed a non-implemented (private) method.
+
+2006-11-15 Wednesday 15:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.19), C_Polyhedron.defs.hh (1.45),
+	  C_Polyhedron.inlines.hh (1.33), NNC_Polyhedron.cc (1.19),
+	  NNC_Polyhedron.defs.hh (1.47), NNC_Polyhedron.inlines.hh (1.34),
+	  Polyhedron.defs.hh (1.309), Polyhedron_nonpublic.cc (1.71):
+	  Disambiguate the constructors of polyhedra by adding a dummy
+	  argument to those that may recycle the data structures of their
+	  arguments.
+
+2006-11-15 Wednesday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.40): Added tag class Recycle_Input() to
+	  help differentiating overloaded functions (in particular,
+	  constructors) that may destructively recycle the data structures
+	  of their arguments instead of taking a copy.
+
+2006-11-15 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.4): Corrected a typo in
+	  test19().
+
+2006-11-15 Wednesday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (octagons.1): file
+	  pointsetpowerset1.cc was added on branch octagons on 2006-11-18
+	  20:37:00 +0000
+
+2006-11-15 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.3): Corrected the bug uncovered by
+	  test18() in pointsetpowerset1.cc.
+
+2006-11-15 Wednesday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (octagons.1): file Pointset_Powerset.cc
+	  was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-11-15 Wednesday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
+	  (1.3): Added more schematic methods.
+
+2006-11-15 Wednesday 13:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.5): Now correctly add first line of code so that, for
+	  Polyhedron class, it is added for each file.
+
+2006-11-15 Wednesday 12:30  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_C_Polyhedron.cc (1.4),
+	  ppl_java/C_Polyhedron.java (1.4): Implemented the native methods
+	  C_Polyhedron::poly_hull_assign_if_exact(C_Polyhedron y) and
+	  C_Polyhedron::upper_bound_assign_if_exact(C_Polyhedron y).
+
+2006-11-15 Wednesday 12:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.4): Closing "}" removed from the generating code.	This has to
+	  be added to each of the split files.
+
+2006-11-15 Wednesday 12:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java/:
+	  ppl_interface_generator_java_classes_java.m4 (1.3),
+	  ppl_interface_generator_java_classes_java_code.m4 (1.2): Generate
+	  annotated methods so that file can be split.	Note that the
+	  preamble with copyright info and package declaration have been
+	  omitted and these need to be added to the start of each of the
+	  split files.
+
+2006-11-15 Wednesday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Degenerate_Element.java (altnum.1): file
+	  Degenerate_Element.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-15 Wednesday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Degenerate_Element.java (octagons.1):
+	  file Degenerate_Element.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 11:33  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_C_Polyhedron.cc (1.3),
+	  ppl_java/C_Polyhedron.java (1.3),
+	  ppl_java/Degenerate_Element.java (1.1), ppl_java/Makefile.am
+	  (1.11): Added the Degenerate_Element enum to the Java interface.
+	  Defined and implemented the constructor C_Polyhedron(long dim,
+	  Degenerate_Element kind).
+
+2006-11-15 Wednesday 10:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.33),
+	  ppl_interface_generator_predicate_check_extra_code (1.22):
+	  Revised and corrected some tests.
+
+2006-11-15 Wednesday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (octagons.1): file
+	  ppl_interface_generator_predicate_check_extra_code was added on
+	  branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-15 Wednesday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc (1.47), Grid_widenings.cc (1.12): Corrected
+	  bugs found in is_disjoint(), intersection_assign() and
+	  generator_widening_assign().
+
+2006-11-15 Wednesday 10:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: disjoint1.cc (1.10), intersection1.cc (1.10),
+	  widening2.cc (1.8): Added tests showing bugs in the is_disjoint()
+	  intersection_assign() and generator_widening_assign().
+
+2006-11-15 Wednesday 10:12  Andrea Cimino
+
+	* m4/ac_prog_java.m4 (1.3): Avoid configure warnings during Java
+	  environment checking.
+
+2006-11-15 Wednesday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_java.m4 (altnum.1): file ac_prog_java.m4 was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-15 Wednesday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_java.m4 (octagons.1): file ac_prog_java.m4 was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-15 Wednesday 09:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (1.10): Just for test
+	  purposes, automatically generate Polyhedron1.java.
+
+2006-11-15 Wednesday 09:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.3): Last 2 tests added
+	  in previous commit are known to fail.
+
+2006-11-15 Wednesday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
+	  (1.2): Inclusions fixed.
+
+2006-11-15 Wednesday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.5): Distribute
+	  ppl_interface_generator_java_dat.m4.
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (1.1): Put under CVS control.
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (octagons.1): file .cvsignore
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-11-15 Wednesday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.36): Make the `tests' directory
+	  before making the directories of the individual Prolog systems.
+
+2006-11-15 Wednesday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.2): Added test to show
+	  bug in geometrically_equals and geometrically_covers when one of
+	  the powersets contains a polyhedron which is not in minimal form
+	  and the other is.
+
+2006-11-14 Tuesday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.37), interfaces/C/Makefile.am
+	  (1.30), src/Makefile.am (1.165): Define and exploit the right
+	  inter-library dependencies.
+
+2006-11-14 Tuesday 18:35  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.16),
+	  jni/ppl_java_common.cc (1.18), jni/ppl_java_common.hh (1.12),
+	  ppl_java/Makefile.am (1.9), ppl_java/Partial_Function.java (1.1),
+	  ppl_java/Polyhedron.java (1.15): First draft implementation for
+	  Partial_Function.  Implemented the method `map_space_dimension'.
+
+2006-11-14 Tuesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Partial_Function.java (altnum.1): file
+	  Partial_Function.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-14 Tuesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Partial_Function.java (octagons.1): file
+	  Partial_Function.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-14 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.29): Ensure that the dependency of
+	  libppl_c on libppl is encoded into libppl.
+
+2006-11-14 Tuesday 18:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.13): Revised
+	  for disjuncts.
+
+2006-11-14 Tuesday 17:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.18),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.18),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.32),
+	  tests/ppl_interface_generator_predicate_check_extra_code (1.21):
+	  Corrected get_disjuncts code in the prolog interface.  Added
+	  procedure in the prolog interface to call ascii_dump().  Added an
+	  extra test (a bounded interval in 1 dimension) to the prolog
+	  schematic tests.
+
+2006-11-14 Tuesday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (octagons.1): file
+	  C_Polyhedron_test1.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-14 Tuesday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Constraint.java (octagons.1): file
+	  Constraint.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-14 Tuesday 15:29  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.17),
+	  ppl_java/Constraint.java (1.2), tests/C_Polyhedron_test1.java
+	  (1.3): Modified the test to avoid overflows.	Modified the
+	  constructor of Constraint.
+
+2006-11-14 Tuesday 14:34  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.42): Corrected the bug on
+	  Octagonal_Shape::max_min() when the inhomogeneous term of
+	  expression is null.
+
+2006-11-14 Tuesday 14:33  quartieri
+
+	* tests/Octagonal_Shape/max_min1.cc (1.3): Added two tests that
+	  show a bug on Octagonal_Shape::max_min() when the inhomogeneous
+	  term of expression is null.
+
+2006-11-14 Tuesday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (altnum.1): file max_min1.cc
+	  was added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-14 Tuesday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (octagons.1): file max_min1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-14 Tuesday 14:30  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.60): Corrected the bug on
+	  BD_Shape::max_min() when the inhomogeneous term of expression is
+	  null.
+
+2006-11-14 Tuesday 14:29  Elena Mazzi
+
+	* tests/BD_Shape/max_min2.cc (1.3): Added two tests that show a bug
+	  on BD_Shape::maximize() when the inhomogeneous term of expression
+	  is null.
+
+2006-11-14 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (altnum.1): file max_min2.cc was added
+	  on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-14 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (octagons.1): file max_min2.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-14 Tuesday 12:02  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.15),
+	  jni/ppl_java_common.cc (1.16), jni/ppl_java_common.hh (1.11),
+	  ppl_java/By_Reference.java (1.2), ppl_java/Polyhedron.java
+	  (1.14): Implemented all the widening methods in the Java
+	  interface.
+
+2006-11-14 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/By_Reference.java (altnum.1): file
+	  By_Reference.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-14 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/By_Reference.java (octagons.1): file
+	  By_Reference.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-14 Tuesday 09:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.1),
+	  ppl_java/ppl_interface_generator_java_classes_java.m4 (1.1),
+	  ppl_java/ppl_interface_generator_java_classes_java_code.m4 (1.1):
+	  Files needed for generating Polyhedron.java
+
+2006-11-13 Monday 21:47  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.14),
+	  jni/ppl_java_common.cc (1.15), jni/ppl_java_common.hh (1.10),
+	  ppl_java/Generator.java (1.2), ppl_java/Polyhedron.java (1.13):
+	  Implemented the other two missing versions of `minimize()' and
+	  `maximize()'.
+
+2006-11-13 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator.java (octagons.1): file
+	  Generator.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-13 Monday 19:35  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, compiler.hh
+	  (altnum.[17,52,10]): Added some compile time check.
+
+2006-11-13 Monday 19:06  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.13),
+	  jni/ppl_java_common.cc (1.14), jni/ppl_java_common.hh (1.9),
+	  ppl_java/By_Reference.java (1.1), ppl_java/Coefficient.java
+	  (1.4), ppl_java/Makefile.am (1.8), ppl_java/Polyhedron.java
+	  (1.12): Implemented By_Reference class that allows to pass object
+	  by reference in Java world. Implemented one version of `maximize'
+	  and `minimize'.  Implemented `equals'.
+
+2006-11-13 Monday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Coefficient.java (octagons.1): file
+	  Coefficient.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-13 Monday 16:26  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.12),
+	  ppl_java/Polyhedron.java (1.11): Added the methods
+	  space_dimension() and affine_dimension() to Polyhedron.
+
+2006-11-13 Monday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.6): Fixed a Doxygen comment to
+	  use the brief style.
+
+2006-11-13 Monday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (octagons.1): file
+	  Pointset_Powerset.defs.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-11-13 Monday 12:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.90), Octagonal_Shape.defs.hh (1.18):
+	  Modified the documentation of concatenate_assign() to link to the
+	  general description of the concatenation operator.
+
+2006-11-13 Monday 09:08  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.16): Fixed typo. Implemented
+	  set_unbounded() correctly.
+
+2006-11-13 Monday 09:07  Abramo Bagnara
+
+	* src/compiler.hh (altnum.9): Now COMPILE_TIME_CHECK() works as
+	  expected.
+
+2006-11-12 Sunday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.164), mp_numeric_limits.cc (1.1),
+	  mp_numeric_limits.hh (1.9): Define the static constants declared
+	  in mp_numeric_limits.hh, as mandated by Section 9.4.2/4 of the
+	  C++ standard.
+
+2006-11-12 Sunday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.cc (octagons.1): file mp_numeric_limits.cc
+	  was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-11-12 Sunday 16:32  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_C_Polyhedron.cc (1.2),
+	  jni/ppl_java_Polyhedron.cc (1.11), jni/ppl_java_common.cc (1.13),
+	  jni/ppl_java_common.hh (1.8), ppl_java/C_Polyhedron.java (1.2),
+	  ppl_java/Grid_Generator.java (1.2),
+	  ppl_java/Grid_Generator_System.java (1.2),
+	  ppl_java/Grid_Generator_Type.java (1.1), ppl_java/Makefile.am
+	  (1.7): Added support for Grid_Generator and
+	  Grid_Generator_System.  Added other constructors to C_Polyhedron.
+	  Renamed routine methods for consistency.
+
+2006-11-12 Sunday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator.java (octagons.1): file
+	  Grid_Generator.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-12 Sunday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator_System.java (altnum.1):
+	  file Grid_Generator_System.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-12 Sunday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator_System.java (octagons.1):
+	  file Grid_Generator_System.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-12 Sunday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator_Type.java (altnum.1):
+	  file Grid_Generator_Type.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-12 Sunday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Grid_Generator_Type.java (octagons.1):
+	  file Grid_Generator_Type.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-12 Sunday 16:21  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Rational_Box.hh
+	  (altnum.[15,51,5]): Compilation fixes.
+
+2006-11-12 Sunday 15:48  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Rational_Box.hh, checked.defs.hh,
+	  checked.inlines.hh, checked_int.inlines.hh, compiler.hh
+	  (altnum.[23,4,30,21,31,8]): Renamed const_bool and const_int.
+
+2006-11-12 Sunday 15:48  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.21): is_inf_float return
+	  value is now more useful.
+
+2006-11-12 Sunday 15:47  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[14,50,8]): Commited incomplete new boundary
+	  implementation.
+
+2006-11-12 Sunday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.38), config.sub (1.36), Watchdog/config.guess
+	  (1.22), Watchdog/config.sub (1.21): Updated.
+
+2006-11-12 Sunday 12:33  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.10),
+	  jni/ppl_java_common.cc (1.12), jni/ppl_java_common.hh (1.7),
+	  ppl_java/Makefile.am (1.6), ppl_java/Poly_Gen_Relation.java
+	  (1.1), ppl_java/Polyhedron.java (1.10): Added the class
+	  Poly_Gen_Relation.  Implemented the method
+	  Polyhedron::relation_with(Generator g).
+
+2006-11-12 Sunday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Poly_Gen_Relation.java (altnum.1): file
+	  Poly_Gen_Relation.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-12 Sunday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Poly_Gen_Relation.java (octagons.1):
+	  file Poly_Gen_Relation.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-12 Sunday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.7): Comments revised.
+
+2006-11-12 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.6): Added new macros for per-class
+	  constants that need no further definition.
+
+2006-11-12 Sunday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Poly_Con_Relation.java (altnum.1): file
+	  Poly_Con_Relation.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-12 Sunday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Poly_Con_Relation.java (octagons.1):
+	  file Poly_Con_Relation.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-12 Sunday 11:57  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.9),
+	  jni/ppl_java_common.cc (1.11), jni/ppl_java_common.hh (1.6),
+	  ppl_java/Makefile.am (1.5), ppl_java/Poly_Con_Relation.java
+	  (1.1), ppl_java/Polyhedron.java (1.9): Added the class
+	  Poly_Con_Relation.  Implemented the method
+	  Polyhedron::relation_with(Constraint c).
+
+2006-11-12 Sunday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8_a (1.5): Reflect recent
+	  changes in the Prolog tests.
+
+2006-11-12 Sunday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8_a (1.8): Reflect
+	  recent changes in the Prolog tests.
+
+2006-11-11 Saturday 22:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.31): Bugs in test code fixed.
+
+2006-11-11 Saturday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.5): COMPILE_TIME_CHECK macro added, as
+	  well as several comments.
+
+2006-11-11 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.203): Added a new item.
+
+2006-11-11 Saturday 15:27  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.8),
+	  jni/ppl_java_common.cc (1.10), jni/ppl_java_common.hh (1.5),
+	  ppl_java/Polyhedron.java (1.8): Now the PPL can return to Java
+	  objects like generators, constraints and congruences and their
+	  systems. Written a lot of native methods that return objects
+	  built by the PPL.
+
+2006-11-11 Saturday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.252): Improved the checking of required
+	  instantiations; now also managing the generation of canonical
+	  names for templates having multiple parameters.
+
+2006-11-10 Friday 20:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am, interval1.cc (altnum.[3,1]): New tests
+	  for the Interval class.
+
+2006-11-10 Friday 17:46  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.9),
+	  ppl_java/Congruence.java (1.2),
+	  ppl_java/Congruence_Constraint.java (1.2),
+	  ppl_java/Congruence_Linear_Expression.java (1.2): In the Java
+	  interface congruences are built just from linear expressions.
+
+2006-11-10 Friday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence.java (octagons.1): file
+	  Congruence.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-10 Friday 14:56  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.7),
+	  jni/ppl_java_common.cc (1.8), jni/ppl_java_common.hh (1.4),
+	  ppl_java/Congruence.java (1.1),
+	  ppl_java/Congruence_Constraint.java (1.1),
+	  ppl_java/Congruence_Linear_Expression.java (1.1),
+	  ppl_java/Congruence_System.java (1.1),
+	  ppl_java/Grid_Generator.java (1.1),
+	  ppl_java/Grid_Generator_System.java (1.1),
+	  ppl_java/Polyhedron.java (1.7): Initial support for the
+	  Congruence/Grid classes.  Added other methods to the Polyhedron
+	  Java interface, but some of them must be implemented.
+
+2006-11-10 Friday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence_System.java (altnum.1): file
+	  Congruence_System.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-10 Friday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Congruence_System.java (octagons.1):
+	  file Congruence_System.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-10 Friday 12:50  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Interval.defs.hh,
+	  Interval_Info.defs.hh, Rational_Box.hh, checked.defs.hh,
+	  checked.inlines.hh, checked_int.inlines.hh, compiler.hh
+	  (altnum.[22,49,7,3,29,20,30,4]): Fixed compilation without
+	  optimization.
+
+2006-11-10 Friday 12:35  Abramo Bagnara
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (altnum.3):
+	  C99 mandates that sizeof unsigned is always the same of
+	  corresponding signed type.
+
+2006-11-10 Friday 07:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.251): Version number bumped.
+
+2006-11-10 Friday 00:00  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.13): Fixed return value.
+
+2006-11-09 Thursday 23:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.22): Methods computing affine (pre-)
+	  images now also deal with the case of denominators different from
+	  1.
+
+2006-11-09 Thursday 22:59  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.48): Adjust flags on set_unbounded.
+	  A little more work on div_assign. Splitted normalize_integer to
+	  help the compiler in its inlining job.
+
+2006-11-09 Thursday 18:28  Abramo Bagnara
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic, src/Limits.hh,
+	  configure.ac (altnum.[3,6,22]): C99 mandates that sizeof unsigned
+	  is always the same of corresponding signed type.
+
+2006-11-09 Thursday 17:24  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.12): set_unbounded returns a
+	  feedback.
+
+2006-11-09 Thursday 17:17  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.24): Substituted
+	  specializations with templates.
+
+2006-11-09 Thursday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh, Box.templates.hh (altnum.[18,21]): Be
+	  explicit when invoking methods of a class template.
+
+2006-11-09 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.61), GNU/Makefile.am
+	  (1.60): Ensure `make distclean' does the right thing.
+
+2006-11-09 Thursday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.20): Corrected method OK(): even if
+	  the box is marked empty, this does not imply that there should be
+	  empty intervals in it.  Drafted (partial) implementation of
+	  affine_preimage().
+
+2006-11-09 Thursday 14:31  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.42): MIP_Problem fixed.
+
+2006-11-09 Thursday 13:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.19): Drafted (partial)
+	  implementation of the affine_image() method.
+
+2006-11-09 Thursday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.16): Added declarations for all the
+	  affine image/preimage methods.
+
+2006-11-09 Thursday 13:42  quartieri
+
+	* tests/Octagonal_Shape/bounds1.cc (1.2): Added some tests on
+	  bounds_from_above() and bounds_from_below() checking universal
+	  octagons.
+
+2006-11-09 Thursday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounds1.cc (altnum.1): file bounds1.cc was
+	  added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-09 Thursday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounds1.cc (octagons.1): file bounds1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-09 Thursday 13:37  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.41): The previous correction didn't work as
+	  expected.  Now MIP_Problem should work also when the tableau is
+	  empty.
+
+2006-11-09 Thursday 12:30  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.7): Removed some prints
+	  used for debugging purposes.
+
+2006-11-09 Thursday 12:27  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.6),
+	  jni/ppl_java_common.cc (1.6), jni/ppl_java_common.hh (1.3),
+	  ppl_java/Polyhedron.java (1.6), ppl_java/Variable.java (1.3),
+	  ppl_java/Variables_Set.java (1.1): Added the Variables_Set class
+	  to the repository.  Implemented other native methods that belongs
+	  to Polyhedron.  Added other routine functions.
+
+2006-11-09 Thursday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Variable.java (octagons.1): file
+	  Variable.java was added on branch octagons on 2006-11-18 20:36:45
+	  +0000
+
+2006-11-09 Thursday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Variables_Set.java (altnum.1): file
+	  Variables_Set.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-09 Thursday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Variables_Set.java (octagons.1): file
+	  Variables_Set.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-09 Thursday 12:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.87): Corrected a bug in
+	  poly_difference_assign(): an assertion was failing when the
+	  argument polyhedron was represented by an inconsistent constraint
+	  system, but emptiness was not detected yet.
+
+2006-11-09 Thursday 11:47  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.41): Removed the control on
+	  the universal Octagonal_Shape cause MIP_Problem handles this case
+	  properly.
+
+2006-11-09 Thursday 10:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.30),
+	  ppl_interface_generator_predicate_check_extra_code (1.20):
+	  Several bugs in the testing framework fixed.	Added test07 to the
+	  test data.
+
+2006-11-09 Thursday 10:36  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.40): Fixed another bug in MIP_Problem.	A
+	  wrong status was computed if minimization was requested and the
+	  internal tableau was empty.
+
+2006-11-09 Thursday 10:26  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.47): Avoid comparisons statically
+	  unsafe.
+
+2006-11-09 Thursday 10:24  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.19): Added support for safe
+	  comparisons.
+
+2006-11-09 Thursday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/polydifference2.cc (1.9): Added test shows a bug
+	  in poly_difference_assign() when the polyhedron to be subtracted
+	  is empty and not in minimal form.
+
+2006-11-09 Thursday 08:39  Abramo Bagnara
+
+	* configure.ac (altnum.21): Added two more SIZEOF.
+
+2006-11-09 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min2.cc (altnum.1): file max_min2.cc
+	  was added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-09 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min2.cc (octagons.1): file max_min2.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-09 Thursday 08:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/max_min2.cc (1.2), Octagonal_Shape/max_min2.cc
+	  (1.2): Added 2 tests to both test files showing a bug in
+	  minimize() (with point) for both BD_Shape and Octagonal_Shape.
+
+	  One of these tests shows the bug (the denominator is 0) while the
+	  second shows that a similar bug does not occur with maximize()
+	  (with point).
+
+2006-11-09 Thursday 08:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.202), doc/Makefile.am (1.49), interfaces/Makefile.am
+	  (1.22), interfaces/C/Makefile.am (1.28),
+	  interfaces/Prolog/Makefile.am (1.35),
+	  interfaces/Prolog/SICStus/Makefile.am (1.72),
+	  interfaces/Prolog/SWI/Makefile.am (1.66),
+	  interfaces/Prolog/XSB/Makefile.am (1.47),
+	  interfaces/Prolog/YAP/Makefile.am (1.49),
+	  interfaces/Prolog/tests/Makefile.am (1.11): Clean automatically
+	  generated files.
+
+2006-11-09 Thursday 07:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/Makefile.am (1.7): Distribute all
+	  examples.
+
+2006-11-08 Wednesday 18:24  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.59): Removed some lines
+	  not-necessary in the following methods: - bounds(); - max_min().
+
+2006-11-08 Wednesday 18:13  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.39): Fixed a bug: return the origin with
+	  the right space dimension if the input Constraint_System is
+	  universal and the problem is unbounded.
+
+2006-11-08 Wednesday 17:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.58): Corrected the method max_min().
+
+2006-11-08 Wednesday 17:51  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.40),
+	  tests/Octagonal_Shape/Makefile.am (1.13),
+	  tests/Octagonal_Shape/max_min2.cc (1.1): Corrected a bug in the
+	  method max_min() and added some tests.
+
+2006-11-08 Wednesday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (octagons.1): file Makefile.am
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-08 Wednesday 17:44  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.57), tests/BD_Shape/Makefile.am
+	  (1.57), tests/BD_Shape/max_min2.cc (1.1): Corrected the method
+	  max_min() and added some tests on it.
+
+2006-11-08 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.60): ppl_ciao.cc is not
+	  built.
+
+2006-11-08 Wednesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh,
+	  Polyhedron_public.cc (altnum.[3,3,10]): (Generalized) Affine
+	  (pre-) image methods changed so as to throw an exception when the
+	  relation symbol is NOT_EQUAL. Switchs on Relation_Symbol changed
+	  to take into proper account the new value.
+
+2006-11-08 Wednesday 16:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.18): Method OK() now also checks
+	  that a box declared to be (non) empty is actually (non) empty.
+	  Typo fixed in is_topologically_closed().  Added implementation
+	  for method is_discrete().  Do check for emptyness in method
+	  is_bounded().
+
+2006-11-08 Wednesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.8): More methods activated.
+
+2006-11-08 Wednesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (octagons.1): file Any_Pointset.defs.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-08 Wednesday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.21): Java directory activated.
+
+2006-11-08 Wednesday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (1.2): Tests 3 and 4 fail with
+	  8-bit integers.
+
+2006-11-08 Wednesday 15:33  Andrea Cimino
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (1.2): Added some
+	  new calls to the test reflecting the last changes to the Java
+	  interface.
+
+2006-11-08 Wednesday 15:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.17): Indentation fixed.
+
+2006-11-08 Wednesday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.250): Version number bumped.
+
+2006-11-08 Wednesday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.17): Temporarily patched the default
+	  constructor and method add_space_dimensions_and_embed() so as to
+	  match tehir specification.
+
+2006-11-08 Wednesday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.48), interfaces/C/Makefile.am (1.27),
+	  interfaces/Prolog/Makefile.am (1.34),
+	  interfaces/Prolog/Ciao/Makefile.am (1.59),
+	  interfaces/Prolog/GNU/Makefile.am (1.59),
+	  interfaces/Prolog/SICStus/Makefile.am (1.71),
+	  interfaces/Prolog/SWI/Makefile.am (1.65),
+	  interfaces/Prolog/XSB/Makefile.am (1.46),
+	  interfaces/Prolog/YAP/Makefile.am (1.48),
+	  interfaces/Prolog/tests/Makefile.am (1.10): Fixed several
+	  packaging glitches.
+
+2006-11-08 Wednesday 14:47  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.5),
+	  jni/ppl_java_common.cc (1.5), jni/ppl_java_common.hh (1.2),
+	  ppl_java/Polyhedron.java (1.5): Added other methods to the Java
+	  C_Polyhedron inteface.  Added new routine methods.  Revised
+	  several comments.
+
+2006-11-08 Wednesday 13:57  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.23): Reverted changed
+	  commited by mistake.
+
+2006-11-08 Wednesday 13:55  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh, Interval.defs.hh
+	  (altnum.[22,46]): Added missing signatures for operator==.
+
+2006-11-08 Wednesday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.30): Minor change in the
+	  documentation: name the set of integer variables in the brief
+	  description of a constructor.
+
+2006-11-08 Wednesday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (octagons.1): file MIP_Problem.defs.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-08 Wednesday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearpartition1.cc (1.10): Refer to
+	  Pointset_Powerset<PH> instead of Powerset<Determinate<PH> >.
+
+2006-11-08 Wednesday 12:01  Abramo Bagnara
+
+	* src/: checked_ext.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[9,29,23,25]): Pushed native extended handling to lowest
+	  level.
+
+2006-11-08 Wednesday 11:37  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.17),
+	  src/Octagonal_Shape.inlines.hh (1.12),
+	  src/Octagonal_Shape.templates.hh (1.39),
+	  tests/Octagonal_Shape/Makefile.am (1.12),
+	  tests/Octagonal_Shape/bounds1.cc (1.1),
+	  tests/Octagonal_Shape/max_min1.cc (1.1): Defined the methods: -
+	  bounds(); - bounds_from_above(); - bounds_from_below(); -
+	  max_min(); - maximize(); - minimize(); and added some tests on
+	  them.
+
+2006-11-08 Wednesday 11:12  Abramo Bagnara
+
+	* src/: Float.defs.hh, checked_ext.inlines.hh (altnum.[3,8]):
+	  Converted handle_ext_natively in a function.
+
+2006-11-08 Wednesday 09:54  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (altnum.22): Removed useless function.
+
+2006-11-08 Wednesday 09:54  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (altnum.7): Added extended constants
+	  printing.
+
+2006-11-08 Wednesday 09:17  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.45): Added multiplication.
+
+2006-11-08 Wednesday 09:17  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.11): Renamed sign into sgn for
+	  conformity to other places.
+
+2006-11-08 Wednesday 00:58  Andrea Cimino
+
+	* interfaces/Java/jni/Makefile.am (1.3): If a `make clean' is
+	  called, delete all the headers generated by javah.
+
+2006-11-08 Wednesday 00:01  Andrea Cimino
+
+	* m4/ac_prog_javah.m4 (1.6): Avoid to compile the Java interface if
+	  javah is found but the jni.h header is not found.
+
+2006-11-08 Wednesday 00:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javah.m4 (altnum.1): file ac_prog_javah.m4 was added
+	  on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-08 Wednesday 00:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javah.m4 (octagons.1): file ac_prog_javah.m4 was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-07 Tuesday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.16): Drafted an implementation of
+	  add_constraint().
+
+2006-11-07 Tuesday 20:08  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.4),
+	  ppl_java/Polyhedron.java (1.4): Added other Polyhedron methods to
+	  the Java interface.
+
+2006-11-07 Tuesday 19:22  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_Polyhedron.cc (1.3),
+	  ppl_java/Polyhedron.java (1.3): Added some Polyhedron related
+	  methods to the Java interface.
+
+2006-11-07 Tuesday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.56): Useless parentheses removed.
+
+2006-11-07 Tuesday 17:04  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.18): Added temporary kludge to fix
+	  compiling.
+
+2006-11-07 Tuesday 16:24  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_ext.inlines.hh (altnum.[17,6]):
+	  Removed unsafe comparisons.
+
+2006-11-07 Tuesday 16:20  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.89), src/BD_Shape.inlines.hh (1.137),
+	  src/BD_Shape.templates.hh (1.55), tests/BD_Shape/Makefile.am
+	  (1.56), tests/BD_Shape/bounds1.cc (1.1),
+	  tests/BD_Shape/max_min1.cc (1.1): Defined the following methods:
+	  - bounds_from_above(); - bounds_from_below(); - bounds(); -
+	  max_min(); - maximize(); - minimize().  Added some tests on them.
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounds1.cc (altnum.1): file bounds1.cc was added
+	  on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounds1.cc (octagons.1): file bounds1.cc was added
+	  on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min1.cc (altnum.1): file max_min1.cc was added
+	  on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min1.cc (octagons.1): file max_min1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-07 Tuesday 15:48  Abramo Bagnara
+
+	* src/Rounding_Dir.inlines.hh (altnum.5): Moved a definition to
+	  permit inlining.
+
+2006-11-07 Tuesday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.inlines.hh,
+	  Interval_Info.defs.hh, Interval_Info.inlines.hh,
+	  Interval_Info.types.hh, Makefile.am (altnum.[15,14,6,1,1,27]):
+	  swap() functions and methods for the Interval_Info classes
+	  revised.  Rewritten Box<Interval>::operator(ostream&).
+
+2006-11-07 Tuesday 15:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.39): Fixed a couple of
+	  memory leaks in exception_prolog.
+
+2006-11-07 Tuesday 15:20  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.54): Fixed a comment on
+	  BD_Shape::remove_space_dimensions().
+
+2006-11-07 Tuesday 15:18  Andrea Cimino
+
+	* configure.ac (1.249), m4/Makefile.am (1.21), m4/ac_prog_java.m4
+	  (1.2), m4/ac_prog_java_works.m4 (1.3), m4/ac_prog_javac.m4 (1.2),
+	  m4/ac_prog_javac_works.m4 (1.2): Java environment detection
+	  improved. Moved all the *_works stuff in the ac_prog_java* files.
+
+2006-11-07 Tuesday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javac.m4 (altnum.1): file ac_prog_javac.m4 was added
+	  on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-07 Tuesday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javac.m4 (octagons.1): file ac_prog_javac.m4 was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-07 Tuesday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.88), BD_Shape.inlines.hh (1.136),
+	  BD_Shape.templates.hh (1.53), Octagonal_Shape.defs.hh (1.16),
+	  Octagonal_Shape.inlines.hh (1.11), Octagonal_Shape.templates.hh
+	  (1.38): Added (imprecise but safe) implementations of shapes
+	  constructors taking a congruence system as input.  Added a few
+	  missing include files so as to avoid indirect dependencies.
+
+2006-11-07 Tuesday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh, Interval.inlines.hh (altnum.[44,13]):
+	  Added Interval::swap(Interval& y) for consistency with the rest
+	  of the library.  The corresponding std::swap() function is now
+	  implemented in terms of that one.
+
+2006-11-07 Tuesday 13:14  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[10,43,5]): Added swap. Moved adjust_boundary_info in
+	  more appropriate file.
+
+2006-11-07 Tuesday 13:13  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[21,21]): Move swap in std namespace.
+
+2006-11-07 Tuesday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.248), m4/ac_prog_javah.m4 (1.5):
+	  AC_CANONICAL_SYSTEM is obsolete: use AC_CANONICAL_HOST instead.
+
+2006-11-07 Tuesday 10:00  Andrea Cimino
+
+	* configure.ac (1.247), m4/ac_prog_javah.m4 (1.4): Call
+	  AC_CANONICAL_SYSTEM before AM_INIT_AUTOMAKE to avoid the previous
+	  autoreconf messages. ac_prog_javah.m4 reverted to the previous
+	  version.
+
+2006-11-07 Tuesday 09:23  Andrea Cimino
+
+	* m4/ac_prog_javah.m4 (1.3): Avoid autoreconf warnings.
+
+2006-11-07 Tuesday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.16): Fixed Box<Interval>::is_empty().
+
+2006-11-07 Tuesday 08:34  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.42): Fixed typo.
+
+2006-11-06 Monday 23:48  Abramo Bagnara
+
+	* src/Interval_Info.defs.hh (altnum.4): Added static keyword.
+
+2006-11-06 Monday 23:46  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.41): Fixed typo.
+
+2006-11-06 Monday 23:44  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.40): Fixes to convex_hull and
+	  intersect.
+
+2006-11-06 Monday 23:16  Andrea Cimino
+
+	* m4/ac_prog_java_works.m4 (1.2): Proceed configuring if a not
+	  suitable JDK is found.
+
+2006-11-06 Monday 23:01  Andrea Cimino
+
+	* m4/ac_prog_javah.m4 (1.2): Fixed an autoconf call.
+
+2006-11-06 Monday 22:57  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[9,39,3]): Simplified Interval return values. Changed
+	  integer properties.
+
+2006-11-06 Monday 22:25  Andrea Cimino
+
+	* m4/ac_prog_java.m4 (1.1): Added a missing macro to the `m4'
+	  directory.
+
+2006-11-06 Monday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (octagons.1): file Makefile.am
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-06 Monday 22:12  Andrea Cimino
+
+	* interfaces/Java/: Makefile.am (1.4), jni/Makefile.am (1.2),
+	  tests/Makefile.am (1.2): Makefile.am's updated to take the
+	  programs name from autoconf.
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_classpath.m4 (altnum.1): file ac_check_classpath.m4
+	  was added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_classpath.m4 (octagons.1): file ac_check_classpath.m4
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_classpath.m4 (simplex.1): file ac_check_classpath.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_jar.m4 (altnum.1): file ac_prog_jar.m4 was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_jar.m4 (octagons.1): file ac_prog_jar.m4 was added on
+	  branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.246), m4/Makefile.am (1.20),
+	  m4/ac_check_classpath.m4 (1.1), m4/ac_prog_jar.m4 (1.1),
+	  m4/ac_prog_java_works.m4 (1.1), m4/ac_prog_javac.m4 (1.1),
+	  m4/ac_prog_javac_works.m4 (1.1), m4/ac_prog_javah.m4 (1.1):
+	  Autodetect the availability of the required Java development
+	  environment.
+
+2006-11-06 Monday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (altnum.6): Use the new implementation of intervals.
+
+2006-11-06 Monday 16:05  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.38): Added missing argument.
+
+2006-11-06 Monday 15:59  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.37): Fixed two typos hard to see.
+
+2006-11-06 Monday 15:58  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.36): Added two missing 'combine'.
+
+2006-11-06 Monday 15:56  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.35): Added two missing functions
+	  invoking methods. Fixed typos.
+
+2006-11-06 Monday 15:46  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[8,34,2]): Modified properties handling for generic
+	  property value. Added normalize_integer().
+
+2006-11-06 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.15): Do not use low-level methods
+	  (this seems to expose a bug in the Interval implementation).
+
+2006-11-06 Monday 12:57  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.37): Replaced some assign_r()
+	  with the operator=().
+
+2006-11-06 Monday 12:06  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.52), tests/BD_Shape/Makefile.am
+	  (1.55), tests/BD_Shape/boundedaffinepreimage1.cc (1.1): Defined a
+	  new method: BD_Shape::bounded_affine_preimage() and added some
+	  tests on it.
+
+2006-11-06 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-12-02 22:35:33 +0000
+
+2006-11-06 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffinepreimage1.cc (octagons.1): file
+	  boundedaffinepreimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-11-06 Monday 10:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.51): Corrected a bug on
+	  bds_hull_assign() when a BDS is minimized.
+
+2006-11-06 Monday 10:51  Elena Mazzi
+
+	* tests/BD_Shape/bdshull1.cc (1.14): Added test 08 that shows a bug
+	  in bds_hull_assign.
+
+2006-11-06 Monday 10:49  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.50): Replaced some assign_r() with
+	  the operator=().
+
+2006-11-06 Monday 10:46  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.33): Modified strictly_contains
+	  implementation.
+
+2006-11-06 Monday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble (altnum.[5,5]):
+	  References to Rational_Box fixed.  Reference to Old_Interval
+	  removed.
+
+2006-11-06 Monday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.15): Added new typename member
+	  `interval_type'.
+
+2006-11-05 Sunday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.14): Exploit the information returned
+	  by refine()
+
+2006-11-05 Sunday 22:30  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.7): Fixed typos.
+
+2006-11-05 Sunday 22:26  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.32): Added strictly_contains. Fixed
+	  contains for empty intervals. NAN scalar is not a singleton.
+
+2006-11-05 Sunday 22:18  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.31): Added some FIXME's.
+
+2006-11-05 Sunday 22:11  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.30): Added an incorrect stub for
+	  info_open to permit compilation.
+
+2006-11-05 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.13): Two FIXMEs partially resolved.
+
+2006-11-05 Sunday 22:04  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.29): Added contains. Simplified
+	  operator==.
+
+2006-11-05 Sunday 22:03  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.6): Modified implementation of
+	  is_unbounded and extended its use.
+
+2006-11-05 Sunday 21:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.12),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.17),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.17),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.29): Added add_disjunct and get_disjuncts to the Prolog
+	  interface.  The generated tests show a bug, still to be fixed, in
+	  get_disjuncts.
+
+2006-11-05 Sunday 21:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh (altnum.[14,14]): Added
+	  dimension_type Box<Interval>::affine_dimension() const.
+
+2006-11-05 Sunday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.inlines.hh, Box.templates.hh (altnum.[12,13]): Added
+	  void Box<Interval>::add_space_dimensions_and_embed(const
+	  dimension_type) and void
+	  Box<Interval>::add_space_dimensions_and_project(const
+	  dimension_type).
+
+2006-11-05 Sunday 19:12  Abramo Bagnara
+
+	* src/: Box.templates.hh, Interval.defs.hh (altnum.[12,28]):
+	  Cosmetic fixes. Added contains_integer_point implementation.
+
+2006-11-05 Sunday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.49), Octagonal_Shape.templates.hh
+	  (1.36): Exception throwers simplified.
+
+2006-11-05 Sunday 18:57  Andrea Cimino
+
+	* configure.ac (1.245), interfaces/Java/Makefile.am (1.3),
+	  interfaces/Java/jni/Makefile.am (1.1),
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc (1.2),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.1),
+	  interfaces/Java/tests/Makefile.am (1.1): The `ppl_java' library
+	  is now built.  Added the first test for the Java interface.
+	  Solved some cut and paste bugs in ppl_java_Polyhedron.cc.
+
+2006-11-05 Sunday 18:35  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.27): Added missing ().
+
+2006-11-05 Sunday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.defs.hh (altnum.[11,26]): Added
+	  template <typename Boundary, typename Info, typename T> inline
+	  bool operator!=(const Interval<Boundary, Info>&, const T&).
+
+2006-11-05 Sunday 18:23  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.25): Added missing const.
+
+2006-11-05 Sunday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Makefile.am (1.4): Silly comment
+	  removed.
+
+2006-11-05 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[13,11]): Addded
+	  Constraint_System Box<Interval>::minimized_constraints() const.
+	  Added missing friend declarations.
+
+2006-11-05 Sunday 17:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[12,10]): Added
+	  explicit Box<Interval>::Box(const Constraint_System&).
+
+2006-11-05 Sunday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[11,9,10]): Added Box<Interval>::Box(const Box&) and
+	  template <typename Other_Interval> explicit
+	  Box<Interval>::Box(const Box<Other_Interval>&).
+
+2006-11-05 Sunday 17:04  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.24): Added missing return.
+
+2006-11-05 Sunday 17:02  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.23): Improved version of operator==.
+
+2006-11-05 Sunday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[10,8]): Added explicit
+	  Box<Interval>::Box(dimension_type num_dimensions = 0,
+	  Degenerate_Element kind = UNIVERSE).
+
+2006-11-05 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.hh, tests/Box/Makefile.am,
+	  tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	  tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+	  tests/Box/bdsdifference1.cc, tests/Box/boundedaffineimage1.cc,
+	  tests/Box/boxhull.cc, tests/Box/cc76narrowing1.cc,
+	  tests/Box/cc76widening.cc, tests/Box/closure1.cc,
+	  tests/Box/concatenate1.cc, tests/Box/constraints1.cc,
+	  tests/Box/containsintegerpoint1.cc, tests/Box/fromgensys1.cc,
+	  tests/Box/frompolyhedron1.cc,
+	  tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffinepreimage1.cc,
+	  tests/Box/intersection1.cc, tests/Box/mapspacedims1.cc,
+	  tests/Box/maxspacedim1.cc, tests/Box/removespacedims1.cc,
+	  tests/Box/timeelapse1.cc
+	  (altnum.[20,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Added some infrastructure to begin testing in tests/Box.
+
+2006-11-05 Sunday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_widenings.cc, Rational_Box.hh (altnum.[8,2]):
+	  Rational_Box is now in the Parma_Polyhedra_Library namespace.
+
+2006-11-05 Sunday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.22): Added missing return statement.
+
+2006-11-05 Sunday 16:35  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.21): Better unbounded check.
+
+2006-11-05 Sunday 16:32  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[5,20]): Added
+	  refine (still incomplete). Better name for is_integer applied to
+	  intervals.
+
+2006-11-05 Sunday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[9,7,9]): Drafted bool operator==(const Box<Interval>&,
+	  const Box<Interval>&) and bool operator!=(const Box<Interval>&,
+	  const Box<Interval>&).
+
+2006-11-05 Sunday 16:04  Andrea Cimino
+
+	* interfaces/Java/: ppl_java/Makefile.am (1.3),
+	  ppl_java/Polyhedron.java (1.2), jni/ppl_java_common.cc (1.4):
+	  Fixed Makefile.am to avoid some autoconf warnings.  Fixed some
+	  interface bugs.
+
+2006-11-05 Sunday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[8,6,8]): Implementation of Box abstracted with respect
+	  to the sequence employed in the representation.  Drafted void
+	  Box<Interval>::concatenate_assign(const Box&).
+
+2006-11-05 Sunday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.19): Added missing inclusions and
+	  std:: qualifications.
+
+2006-11-05 Sunday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (altnum.3): Added NOT_EQUAL to enum
+	  Relation_Symbol.
+
+2006-11-05 Sunday 15:12  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.18): Added OK().
+
+2006-11-05 Sunday 15:11  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked_ext.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[20,20,28,5,20,28,21,24]): Added ceil and floor.
+
+2006-11-05 Sunday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.201): Note that in the OK() methods, instead of having
+	  all those #ifndef NDEBUG, it is probably worthwhile to use a
+	  suitable defined `barf' stream that does the right thing.
+
+2006-11-05 Sunday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.200): Remember to add a "quick assign" function to
+	  checked numbers that allows to efficiently assign small integer
+	  constants (like those in the range [-2, 2]) that are guaranteed
+	  not to cause any rounding or overflow problems.
+
+2006-11-05 Sunday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.7): Added declarations for the standard
+	  member functions that may modify the dimension of the vector
+	  space.
+
+2006-11-05 Sunday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: .cvsignore, Makefile.am, addconstraints1.cc,
+	  addspacedims1.cc, affinedimension1.cc, affineimage1.cc,
+	  affinepreimage1.cc, ascii_dump_load1.cc, bdsdifference1.cc,
+	  bgp99extrapolation1.cc, bhz03widening1.cc, bounded1.cc,
+	  boundedaffineimage1.cc, boxhull.cc, cc76narrowing1.cc,
+	  cc76widening.cc, closure1.cc, concatenate1.cc, constraints1.cc,
+	  contains1.cc, containsintegerpoint1.cc, discrete1.cc,
+	  disjoint1.cc, empty1.cc, equality1.cc, expandspacedim1.cc,
+	  foldspacedims1.cc, fromgensys1.cc, frompolyhedron1.cc,
+	  generalizedaffineimage1.cc, generalizedaffinepreimage1.cc,
+	  geomcovers1.cc, intersection1.cc, mapspacedims1.cc,
+	  maxspacedim1.cc, membytes1.cc, minconstraints1.cc, relations1.cc,
+	  removespacedims1.cc, timeelapse1.cc, universe1.cc, writebox1.cc
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Ripped from the tests/BD_Shape directory to serve as a basis for
+	  building the Box testsuite.
+
+2006-11-05 Sunday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (altnum.1): file
+	  maxspacedim1.cc was added on branch altnum on 2006-12-02 22:35:34
+	  +0000
+
+2006-11-05 Sunday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (octagons.1): file
+	  maxspacedim1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-11-05 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.54), BD_Shape/maxspacedim.cc
+	  (1.14), BD_Shape/maxspacedim1.cc (1.1),
+	  Octagonal_Shape/Makefile.am (1.11),
+	  Octagonal_Shape/maxspacedim.cc (1.2),
+	  Octagonal_Shape/maxspacedim1.cc (1.1): Renamed maxspacedim.cc to
+	  maxspacedim1.cc.
+
+2006-11-05 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (altnum.1): file maxspacedim1.cc
+	  was added on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-05 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (octagons.1): file maxspacedim1.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-05 Sunday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.87): Missing blanks added.
+
+2006-11-05 Sunday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.cc, Box.defs.hh, Box.templates.hh (altnum.[2,6,7]):
+	  Added void Box<Interval>::add_constraints(const
+	  Constraint_System&) and bool Box<Interval>::OK() const.  Started
+	  drafting void Box<Interval>::add_constraint(const Constraint&).
+
+2006-11-05 Sunday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[5,5,6]): New methods void box_hull_assign(const Box&)
+	  and void upper_bound_assign(const Box&).
+
+2006-11-05 Sunday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[4,4,5]): New methods bool Box<Interval>::marked_empty()
+	  const and void Box<Interval>::intersection_assign(const Box&).
+
+2006-11-05 Sunday 09:41  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[4,17]): Added
+	  some methods.
+
+2006-11-05 Sunday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.4): Two FIXMEs resolved by using
+	  Interval::set_lower_unbounded() and
+	  Interval::set_upper_unbounded().
+
+2006-11-05 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Boundary.defs.hh, Box.defs.hh, Box.inlines.hh,
+	  Box.templates.hh (altnum.[3,3,3,3]): Method is_empty() revised.
+	  Added methods bool is_universe() const, bool
+	  is_topologically_closed() const, bool is_bounded() const, and
+	  bool contains_integer_point() const.
+
+2006-11-05 Sunday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.7): Activated the
+	  bounded_affine_image() and bounded_affine_preimage() methods.
+
+2006-11-04 Saturday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+	  src/Bounding_Box.inlines.hh, src/Bounding_Box.types.hh,
+	  src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	  src/Makefile.am, src/Polyhedron_widenings.cc, src/Rational_Box.hh
+	  (altnum.[4,4,4,4,3,2,2,2,26,7,1]): New class Rational_Box to
+	  replace the old Bounding_Box.  Several corrections to the
+	  definition of class Box.
+
+2006-11-04 Saturday 20:25  Andrea Cimino
+
+	* interfaces/Java/: Makefile.am (1.2), ppl_java/Makefile.am (1.2):
+	  If Java interface generation is enabled, ppl_java.jar is
+	  automatically built. The java files are now compiled always
+	  together.
+
+2006-11-04 Saturday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.cc, Box.defs.hh, Box.inlines.hh, Box.templates.hh,
+	  Box.types.hh, Interval.defs.hh, Makefile.am
+	  (altnum.[1,1,1,1,1,16,25]): The new Box templatic class
+	  efficiently represents not necessarily closed, iso-oriented
+	  hyperrectangles.
+
+2006-11-04 Saturday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble (altnum.[3,4]): Enum
+	  value LOWER and UPPER renamed LOWER_BOUNDARY and UPPER_BOUNDARY,
+	  respectively.
+
+2006-11-04 Saturday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval.inlines.hh,
+	  Interval.types.hh, Makefile.am, Old_Interval.defs.hh,
+	  Old_Interval.inlines.hh, Old_Interval.types.hh
+	  (altnum.[2,15,12,3,24,2,2,2]): Old implementation of intervals
+	  moved further out of the way.  New interval implementation is now
+	  included in ppl.hh.
+
+2006-11-04 Saturday 16:46  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.14): Added quick and dirty trick to
+	  support interval construction from strings.
+
+2006-11-04 Saturday 16:39  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[1,13,1]): Splitted and reorganized new intervals code.
+
+2006-11-04 Saturday 16:38  Abramo Bagnara
+
+	* src/fpu-ia32.inlines.hh (altnum.4): Added memory clobber
+	  directive to avoid asm reordering.
+
+2006-11-04 Saturday 16:37  Abramo Bagnara
+
+	* src/compiler.hh (altnum.3): Added avoid_cse.
+
+2006-11-04 Saturday 16:36  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.19): Reinserted lost commit.
+	  Added avoid_cse.
+
+2006-11-04 Saturday 16:35  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (altnum.19): Improved comment.
+
+2006-11-03 Friday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.3): Use switches
+	  whenever possible.
+
+2006-11-03 Friday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.2): Avoid long lines.
+
+2006-11-03 Friday 16:41  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.12): More work on interval.
+
+2006-11-03 Friday 16:38  Andrea Cimino
+
+	* interfaces/Java/jni/: .cvsignore (1.1), ppl_java_C_Polyhedron.cc
+	  (1.1), ppl_java_Polyhedron.cc (1.1), ppl_java_common.cc (1.1),
+	  ppl_java_common.hh (1.1): Added the `jni' directory to the trunk.
+	  Added some files that interface Java to C++ via JNI.
+
+2006-11-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/.cvsignore (octagons.1): file .cvsignore was
+	  added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-11-03 Friday 15:24  quartieri
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (1.7): Removed some
+	  useless lines from test13().
+
+2006-11-03 Friday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (octagons.1): file
+	  boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-11-03 Friday 14:51  Andrea Cimino
+
+	* interfaces/Makefile.am (1.20): Temporarily disabled the Java
+	  interface to be processed by Makefile.
+
+2006-11-03 Friday 14:24  Andrea Cimino
+
+	* interfaces/Java/ppl_java/: C_Polyhedron.java (1.1),
+	  Constraint_System.java (1.1), Generator.java (1.1),
+	  Generator_System.java (1.1), Generator_Type.java (1.1),
+	  PPL_Object.java (1.1), Polyhedron.java (1.1): Put other Java
+	  interface files under CVS control.
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Constraint_System.java (altnum.1): file
+	  Constraint_System.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Constraint_System.java (octagons.1):
+	  file Constraint_System.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator_System.java (altnum.1): file
+	  Generator_System.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator_System.java (octagons.1): file
+	  Generator_System.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator_Type.java (altnum.1): file
+	  Generator_Type.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Generator_Type.java (octagons.1): file
+	  Generator_Type.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/PPL_Object.java (altnum.1): file
+	  PPL_Object.java was added on branch altnum on 2006-12-02 22:35:28
+	  +0000
+
+2006-11-03 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/PPL_Object.java (octagons.1): file
+	  PPL_Object.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-03 Friday 10:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.11),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.19),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.22): Fixed some bugs.  Tidied the handling of a "friend" class
+	  replacement.	Improved some comments.
+
+2006-11-03 Friday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (octagons.1): file ppl_interface_generator_predicate_check_pl.m4
+	  was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-02 Thursday 16:51  quartieri
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (1.2): Added some tests.
+
+2006-11-02 Thursday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (octagons.1): file
+	  expandspacedim1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-11-02 Thursday 15:21  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.35),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.2): Corrected
+	  the method bounded_affine_preimage() when `lb_expr' contains
+	  `var'.  Added some tests.
+
+2006-11-02 Thursday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffinepreimage1.cc (octagons.1):
+	  file boundedaffinepreimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-11-02 Thursday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.70): Unwanted changes withdrawn.
+
+2006-11-02 Thursday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh (altnum.[18,27]):
+	  Enable inexact check when requested.
+
+2006-11-02 Thursday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (altnum.18): Fixed missing round
+	  direction extraction.
+
+2006-11-02 Thursday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.83), checked.defs.hh (1.37),
+	  checked_float.inlines.hh (1.69): Previous changes reverted (they
+	  were meant for the `altnum' branch only).
+
+2006-11-02 Thursday 10:03  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.11): Added more functions. Added
+	  some notes to not forget.
+
+2006-11-01 Wednesday 23:00  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.68): Fixed missing round
+	  direction extraction.
+
+2006-11-01 Wednesday 22:59  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.82), checked.defs.hh (1.36):
+	  Enable inexact check when requested.
+
+2006-11-01 Wednesday 22:56  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.10): More work on new intervals.
+
+2006-11-01 Wednesday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.38): Block indentation corrected.
+
+2006-11-01 Wednesday 20:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.13),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.18),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.21): Further improvements to the generation of the code.
+
+2006-11-01 Wednesday 17:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (1.12): Some ongoing
+	  improvements - both to the comments and in making the arguments
+	  to the macros more uniform.
+
+2006-11-01 Wednesday 15:42  Abramo Bagnara
+
+	* src/: Init.cc, Rounding_Dir.defs.hh, Rounding_Dir.inlines.hh,
+	  fpu-c99.inlines.hh, fpu-ia32.inlines.hh, fpu-sparc.inlines.hh,
+	  fpu.types.hh (altnum.[4,4,4,3,3,3,3]), checked_float.inlines.hh
+	  (1.67): Use specific types for fpu_rounding_direction_type and
+	  fpu_rounding_control_word_type.
+
+2006-11-01 Wednesday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.28),
+	  ppl_interface_generator_predicate_check_extra_code (1.17),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.20): Several
+	  improvements to the code - both the generated code and to the m4
+	  itself.
+
+2006-11-01 Wednesday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.16),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.16): Added code for
+	  the Octagonal_Shape and BD_Shape narrowing procedures.
+
+2006-11-01 Wednesday 12:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.10),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.9),
+	  C/ppl_interface_generator_c_dat.m4 (1.9),
+	  C/ppl_interface_generator_c_h_code.m4 (1.6),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.15),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.15),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.27): Several improvements - mainly wrt the generation of code
+	  for the widening and extrapolation operators.  All extrapolations
+	  (including the widenings) for all the simple domains are now
+	  generated. The only missing procedure now is the narrowing.
+
+	  Names of some of the patterns to be replaced have also been
+	  revised.
+
+2006-11-01 Wednesday 12:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (octagons.1): file
+	  ppl_interface_generator_c_dat.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-11-01 Wednesday 12:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (octagons.1):
+	  file ppl_interface_generator_c_h_code.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-01 Wednesday 12:24  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.9): More work on intervals.
+
+2006-11-01 Wednesday 08:13  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.8): Put under CVS control.
+
+2006-10-31 Tuesday 23:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.7): Cater also for Octagonal_Shape.  Methods
+	  renamed so as to reflect that Polyhedra_Powerset has been renamed
+	  Pointset_Powerset.
+
+2006-10-31 Tuesday 21:46  Andrea Cimino
+
+	* interfaces/Java/ppl_java/Linear_Expression_Common.java (1.2):
+	  This source file is not used: deleted.
+
+2006-10-31 Tuesday 19:12  Andrea Cimino
+
+	* interfaces/Java/ppl_java/: Coefficient.java (1.3),
+	  Linear_Expression.java (1.2), Linear_Expression_Difference.java
+	  (1.2), Linear_Expression_Sum.java (1.2): Fixed some typos and
+	  some doxygen commands.
+
+2006-10-31 Tuesday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression.java (octagons.1):
+	  file Linear_Expression.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Difference.java
+	  (octagons.1): file Linear_Expression_Difference.java was added on
+	  branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Sum.java (octagons.1):
+	  file Linear_Expression_Sum.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
+	  (octagons.1): file Linear_Expression_Coefficient.java was added
+	  on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Times.java
+	  (octagons.1): file Linear_Expression_Times.java was added on
+	  branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
+	  (octagons.1): file Linear_Expression_Unary_Minus.java was added
+	  on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Linear_Expression_Variable.java
+	  (octagons.1): file Linear_Expression_Variable.java was added on
+	  branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Relation_Symbol.java (altnum.1): file
+	  Relation_Symbol.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Relation_Symbol.java (octagons.1): file
+	  Relation_Symbol.java was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Constraint.java (1.2), Linear_Expression.java
+	  (1.2), Linear_Expression_Coefficient.java (1.2),
+	  Linear_Expression_Common.java (1.2),
+	  Linear_Expression_Difference.java (1.2),
+	  Linear_Expression_Sum.java (1.2), Linear_Expression_Times.java
+	  (1.2), Linear_Expression_Unary_Minus.java (1.2),
+	  Linear_Expression_Variable.java (1.2), Relation_Symbol.java
+	  (1.2), ppl_java/Constraint.java (1.1),
+	  ppl_java/Linear_Expression.java (1.1),
+	  ppl_java/Linear_Expression_Coefficient.java (1.1),
+	  ppl_java/Linear_Expression_Common.java (1.1),
+	  ppl_java/Linear_Expression_Difference.java (1.1),
+	  ppl_java/Linear_Expression_Sum.java (1.1),
+	  ppl_java/Linear_Expression_Times.java (1.1),
+	  ppl_java/Linear_Expression_Unary_Minus.java (1.1),
+	  ppl_java/Linear_Expression_Variable.java (1.1),
+	  ppl_java/Relation_Symbol.java (1.1): Moved.
+
+2006-10-31 Tuesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.48): Corrected another occurrence of
+	  the same problem identified in the previous commit (wrong
+	  handling of capacities), again in remove_space_dimensions().
+
+2006-10-31 Tuesday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Constraint.java (1.1), Linear_Expression.java
+	  (1.1), Linear_Expression_Coefficient.java (1.1),
+	  Linear_Expression_Common.java (1.1),
+	  Linear_Expression_Difference.java (1.1),
+	  Linear_Expression_Sum.java (1.1), Linear_Expression_Times.java
+	  (1.1), Linear_Expression_Unary_Minus.java (1.1),
+	  Linear_Expression_Variable.java (1.1), Relation_Symbol.java
+	  (1.1): Put under CVS control.
+
+2006-10-31 Tuesday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.47): Corrected a bug (in the
+	  handling of DB_Row capacities) in method
+	  remove_space_dimension(). Avoid useless computations when the
+	  BD_Shape is known to be empty.
+
+2006-10-31 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/foldspacedims1.cc (altnum.1): file
+	  foldspacedims1.cc was added on branch altnum on 2006-12-02
+	  22:35:34 +0000
+
+2006-10-31 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/foldspacedims1.cc (octagons.1): file
+	  foldspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-31 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (octagons.1): file
+	  mapspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-31 Tuesday 16:35  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.15),
+	  src/Octagonal_Shape.templates.hh (1.34),
+	  tests/Octagonal_Shape/Makefile.am (1.10),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.1),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.2): Defined the method
+	  fold_space_dimensions() and added some tests about it.  Removed
+	  the trailing white spaces from mapspacedims1.
+
+2006-10-31 Tuesday 14:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.26),
+	  ppl_interface_generator_predicate_check_extra_code (1.16),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.19): Added
+	  generic tests for the remaining widening/extrapolation and change
+	  dimensions procedures.
+
+2006-10-31 Tuesday 13:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/foldspacedims1.cc (1.2): Added two tests to show a
+	  bug.	Both test fold_space_dimensions() for an empty shape in 2
+	  dimensions but where the initial shape is built in different
+	  ways.  One of these tests causes an exception to be thrown
+	  whereas the other passes.
+
+2006-10-31 Tuesday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/foldspacedims1.cc (octagons.1): file
+	  foldspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-10-31 Tuesday 09:30  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh, Rounding_Dir.defs.hh,
+	  Rounding_Dir.inlines.hh, checked_int.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[19,3,3,27,23]),
+	  Checked_Number.defs.hh (1.81): Check for FPU inexact result only
+	  when explicitly requested by the individual functions/operators.
+
+2006-10-31 Tuesday 09:23  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (altnum.20): Fixed is_int_mpq().
+
+2006-10-31 Tuesday 08:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.29): Avoid a Doxygen warning about an
+	  undocumented parameter.
+
+2006-10-30 Monday 18:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.25): Tests for the affine image and preimage predicates added.
+
+2006-10-30 Monday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Saturation_Matrix.cc (1.12), Saturation_Matrix.defs.hh
+	  (1.12), Saturation_Matrix.inlines.hh (1.8),
+	  Saturation_Matrix.types.hh (1.5), Saturation_Row.cc (1.12),
+	  Saturation_Row.defs.hh (1.13), Saturation_Row.inlines.hh (1.9),
+	  Saturation_Row.types.hh (1.5): Replaced by the corresponding
+	  files Bit_*.
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc (altnum.1): file Bit_Matrix.cc was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc (octagons.1): file Bit_Matrix.cc was added on
+	  branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh (altnum.1): file Bit_Matrix.defs.hh was
+	  added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh (octagons.1): file Bit_Matrix.defs.hh was
+	  added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.inlines.hh (altnum.1): file Bit_Matrix.inlines.hh
+	  was added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.inlines.hh (octagons.1): file
+	  Bit_Matrix.inlines.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.types.hh (altnum.1): file Bit_Matrix.types.hh was
+	  added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.types.hh (octagons.1): file Bit_Matrix.types.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (altnum.1): file Bit_Row.cc was added on branch
+	  altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (octagons.1): file Bit_Row.cc was added on branch
+	  octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (altnum.1): file Bit_Row.defs.hh was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (octagons.1): file Bit_Row.defs.hh was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (altnum.1): file Bit_Row.inlines.hh was
+	  added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (octagons.1): file Bit_Row.inlines.hh was
+	  added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.types.hh (altnum.1): file Bit_Row.types.hh was added
+	  on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.types.hh (octagons.1): file Bit_Row.types.hh was
+	  added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.199), doc/devref.doxyconf-html.in (1.79),
+	  doc/devref.doxyconf-latex.in (1.18), src/BD_Shape.defs.hh (1.86),
+	  src/BD_Shape.templates.hh (1.46), src/Bit_Matrix.cc (1.1),
+	  src/Bit_Matrix.defs.hh (1.1), src/Bit_Matrix.inlines.hh (1.1),
+	  src/Bit_Matrix.types.hh (1.1), src/Bit_Row.cc (1.1),
+	  src/Bit_Row.defs.hh (1.1), src/Bit_Row.inlines.hh (1.1),
+	  src/Bit_Row.types.hh (1.1), src/Linear_System.cc (1.40),
+	  src/Linear_System.defs.hh (1.29), src/Linear_System.inlines.hh
+	  (1.19), src/Makefile.am (1.163), src/Polyhedron.defs.hh (1.308),
+	  src/Polyhedron_chdims.cc (1.40), src/Polyhedron_nonpublic.cc
+	  (1.70), src/Polyhedron_public.cc (1.86),
+	  src/Polyhedron_widenings.cc (1.56), src/conversion.cc (1.79),
+	  src/minimize.cc (1.44), src/simplify.cc (1.46),
+	  src/swapping_sort.icc (1.11): Classes Saturation_Row and
+	  Saturation_Matrix renamed as Bit_Row and Bit_Matrix,
+	  respectively.
+
+2006-10-30 Monday 14:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Saturation_Row.defs.hh (1.12): Added specification for   void
+	  set_until(unsigned long k);
+
+2006-10-30 Monday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.85), BD_Shape.templates.hh (1.45): The
+	  redundancy_dbm private data member of BD_Shape is now implemented
+	  by using a Saturation_Matrix (instead of a vector of deques of
+	  Booleans).
+
+2006-10-30 Monday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Saturation_Matrix.cc (1.11), Saturation_Matrix.defs.hh
+	  (1.11), Saturation_Matrix.inlines.hh (1.7): Added comparison
+	  operators for Saturation_Matrix.
+
+2006-10-30 Monday 12:23  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.33): Removed an old FIXME and
+	  a provisional implementation of the method
+	  external_memory_in_bytes().
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (octagons.1): file FCAIBVP.cc was added on
+	  branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (octagons.1): file FCAIBVP.defs.hh was
+	  added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (octagons.1): file FCAIBVP.inlines.hh
+	  was added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (octagons.1): file
+	  variablesset1.cc was added on branch octagons on 2006-11-18
+	  20:37:00 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (octagons.1): file Variables_Set.cc was
+	  added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (octagons.1): file
+	  Variables_Set.defs.hh was added on branch octagons on 2006-11-18
+	  20:36:51 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (octagons.1): file
+	  Variables_Set.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-10-30 Monday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.8),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.5),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.14),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.13), src/BD_Shape.templates.hh (1.44),
+	  src/Grid_Generator_System.cc (1.16), src/Grid_chdims.cc (1.14),
+	  src/MIP_Problem.cc (1.37), src/MIP_Problem.defs.hh (1.28),
+	  src/Octagonal_Shape.templates.hh (1.32), src/Polyhedron_chdims.cc
+	  (1.39), src/Variables_Set.cc (1.2), src/Variables_Set.defs.hh
+	  (1.3), src/Variables_Set.inlines.hh (1.3), tests/FCAIBVP.cc
+	  (1.2), tests/FCAIBVP.defs.hh (1.3), tests/FCAIBVP.inlines.hh
+	  (1.3), tests/Polyhedron/variablesset1.cc (1.8): Variables_Set is
+	  now an std::set of variables' indexes (instead of Variable).
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (octagons.1):
+	  file ppl_interface_generator_c_cc_preamble was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-30 Monday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+	  src/Bounding_Box.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Grid.templates.hh, src/Interval.cc, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh, src/Makefile.am,
+	  src/Old_Interval.cc, src/Old_Interval.defs.hh,
+	  src/Old_Interval.inlines.hh, src/Old_Interval.types.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh
+	  (altnum.[3,3,3,3,3,3,2,7,11,2,23,1,1,1,1,9,3]): Old interval
+	  implementation moved out of the way.
+
+2006-10-29 Sunday 22:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.24),
+	  ppl_interface_generator_predicate_check_extra_code (1.15): Added
+	  generic tests for the binary operators.
+
+2006-10-29 Sunday 20:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, COPYING, CREDITS, ChangeLog, INSTALL, Makefile.am, NEWS,
+	  README, README.configure, STANDARDS, TODO, compile, config.guess,
+	  config.rpath, config.sub, configure.ac, depcomp, install-sh,
+	  instchk.hh, ltmain.sh, missing, mkinstalldirs, ppl.lsm.in,
+	  ppl.spec.in, Watchdog/.cvsignore, Watchdog/COPYING,
+	  Watchdog/CREDITS, Watchdog/ChangeLog,
+	  Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+	  Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh,
+	  Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+	  Watchdog/INSTALL, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/Pending_Element.cc, Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh,
+	  Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/Pending_List.types.hh, Watchdog/README,
+	  Watchdog/Time.cc, Watchdog/Time.defs.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/Time.types.hh,
+	  Watchdog/Watchdog.cc, Watchdog/Watchdog.defs.hh,
+	  Watchdog/Watchdog.inlines.hh, Watchdog/Watchdog.types.hh,
+	  Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/pwl_header.bottom, Watchdog/pwl_header.middle,
+	  Watchdog/pwl_header.top, Watchdog/src/.cvsignore,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/.cvsignore, Watchdog/utils/Makefile.am,
+	  Watchdog/utils/build_header.in, debian/.cvsignore,
+	  debian/Makefile.am, debian/README, debian/changelog,
+	  debian/compat, debian/control, debian/libppl-c.dirs,
+	  debian/libppl-c.install, debian/libppl-c.links,
+	  debian/libppl-dev.dirs, debian/libppl-dev.doc-base,
+	  debian/libppl-dev.doc-base.user, debian/libppl-dev.docs,
+	  debian/libppl-dev.install, debian/libppl-dev.links,
+	  debian/libppl-pwl.copyright.in, debian/libppl-pwl.dirs,
+	  debian/libppl-pwl.docs, debian/libppl-pwl.install,
+	  debian/libppl.copyright.in, debian/libppl.dirs,
+	  debian/libppl.docs, debian/libppl.install, debian/rules,
+	  demos/Makefile.am, demos/ppl_lcdd/.cvsignore,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lcdd/examples/README, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/README,
+	  demos/ppl_lpsol/examples/adlittle.mps,
+	  demos/ppl_lpsol/examples/blend.mps,
+	  demos/ppl_lpsol/examples/boeing1.mps,
+	  demos/ppl_lpsol/examples/boeing2.mps,
+	  demos/ppl_lpsol/examples/egout.mps,
+	  demos/ppl_lpsol/examples/ex11.mps,
+	  demos/ppl_lpsol/examples/ex12.mps,
+	  demos/ppl_lpsol/examples/kb2.mps,
+	  demos/ppl_lpsol/examples/lseu.mps,
+	  demos/ppl_lpsol/examples/markshare1.mps,
+	  demos/ppl_lpsol/examples/markshare2.mps,
+	  demos/ppl_lpsol/examples/mas74.mps,
+	  demos/ppl_lpsol/examples/mas76.mps,
+	  demos/ppl_lpsol/examples/mip.mps,
+	  demos/ppl_lpsol/examples/modglob.mps,
+	  demos/ppl_lpsol/examples/noswot.mps,
+	  demos/ppl_lpsol/examples/opt1217.mps,
+	  demos/ppl_lpsol/examples/p0033.mps,
+	  demos/ppl_lpsol/examples/pk1.mps,
+	  demos/ppl_lpsol/examples/rout.mps,
+	  demos/ppl_lpsol/examples/sc105.mps,
+	  demos/ppl_lpsol/examples/sc50a.mps,
+	  demos/ppl_lpsol/examples/sc50b.mps,
+	  demos/ppl_lpsol/examples/ship08l.mps, doc/.cvsignore,
+	  doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/fdl.dox, doc/fdl.tex, doc/fdl.txt,
+	  doc/gpl.dox, doc/gpl.tex, doc/gpl.txt, doc/ppl-config.1,
+	  doc/ppl-config_extra_man_text, doc/ppl.sty, doc/ppl_lcdd.1,
+	  doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_java/.cvsignore,
+	  interfaces/Java/ppl_java/Coefficient.java,
+	  interfaces/Java/ppl_java/Makefile.am,
+	  interfaces/Java/ppl_java/Variable.java,
+	  interfaces/OCaml/Makefile.am, interfaces/OCaml/ppl_ocaml.cc,
+	  interfaces/OCaml/ppl_ocaml.mli, interfaces/OCaml/test1.ml,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/.cvsignore,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected2_int16,
+	  interfaces/Prolog/XSB/expected2_int16_a,
+	  interfaces/Prolog/XSB/expected2_int32,
+	  interfaces/Prolog/XSB/expected2_int32_a,
+	  interfaces/Prolog/XSB/expected2_int64,
+	  interfaces/Prolog/XSB/expected2_int64_a,
+	  interfaces/Prolog/XSB/expected2_int8,
+	  interfaces/Prolog/XSB/expected2_int8_a,
+	  interfaces/Prolog/XSB/expected2_mpz,
+	  interfaces/Prolog/XSB/expected2_mpz_a,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int32_a,
+	  interfaces/Prolog/XSB/expected3_int64,
+	  interfaces/Prolog/XSB/expected3_int64_a,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/expected3_int8_a,
+	  interfaces/Prolog/XSB/expected3_mpz,
+	  interfaces/Prolog/XSB/expected3_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_int16,
+	  interfaces/Prolog/XSB/expected_int16_a,
+	  interfaces/Prolog/XSB/expected_int32,
+	  interfaces/Prolog/XSB/expected_int32_a,
+	  interfaces/Prolog/XSB/expected_int64,
+	  interfaces/Prolog/XSB/expected_int64_a,
+	  interfaces/Prolog/XSB/expected_int8,
+	  interfaces/Prolog/XSB/expected_int8_a,
+	  interfaces/Prolog/XSB/expected_mpz,
+	  interfaces/Prolog/XSB/expected_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/expected_pchk_mpz,
+	  interfaces/Prolog/XSB/expected_pchk_mpz_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/check_script,
+	  interfaces/Prolog/tests/check_script2,
+	  interfaces/Prolog/tests/check_script2_int8,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected2_int16,
+	  interfaces/Prolog/tests/expected2_int16_a,
+	  interfaces/Prolog/tests/expected2_int32,
+	  interfaces/Prolog/tests/expected2_int32_a,
+	  interfaces/Prolog/tests/expected2_int64,
+	  interfaces/Prolog/tests/expected2_int64_a,
+	  interfaces/Prolog/tests/expected2_int8,
+	  interfaces/Prolog/tests/expected2_int8_a,
+	  interfaces/Prolog/tests/expected2_mpz,
+	  interfaces/Prolog/tests/expected2_mpz_a,
+	  interfaces/Prolog/tests/expected3_int16,
+	  interfaces/Prolog/tests/expected3_int16_a,
+	  interfaces/Prolog/tests/expected3_int32,
+	  interfaces/Prolog/tests/expected3_int32_a,
+	  interfaces/Prolog/tests/expected3_int64,
+	  interfaces/Prolog/tests/expected3_int64_a,
+	  interfaces/Prolog/tests/expected3_int8,
+	  interfaces/Prolog/tests/expected3_int8_a,
+	  interfaces/Prolog/tests/expected3_mpz,
+	  interfaces/Prolog/tests/expected3_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_int16,
+	  interfaces/Prolog/tests/expected_int16_a,
+	  interfaces/Prolog/tests/expected_int32,
+	  interfaces/Prolog/tests/expected_int32_a,
+	  interfaces/Prolog/tests/expected_int64,
+	  interfaces/Prolog/tests/expected_int64_a,
+	  interfaces/Prolog/tests/expected_int8,
+	  interfaces/Prolog/tests/expected_int8_a,
+	  interfaces/Prolog/tests/expected_mpz,
+	  interfaces/Prolog/tests/expected_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/expected_pchk_mpz,
+	  interfaces/Prolog/tests/expected_pchk_mpz_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/script_clpq,
+	  interfaces/Prolog/tests/script_clpq2,
+	  interfaces/Prolog/tests/script_clpq2_int8, m4/Makefile.am,
+	  m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+	  m4/ac_cxx_double_binary_format.m4,
+	  m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_long_double_is_iec_559.m4, m4/ac_cxx_long_long.m4,
+	  m4/ac_text_md5sum.m4, m4/lib-ld.m4, m4/lib-link.m4,
+	  m4/lib-prefix.m4, m4/ppl.m4, src/.cvsignore,
+	  src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	  src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	  src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence.types.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Congruence_System.inlines.hh, src/Congruence_System.types.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint.types.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/Constraint_System.types.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.templates.hh, src/DB_Matrix.types.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	  src/DB_Row.templates.hh, src/DB_Row.types.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Determinate.types.hh, src/Direct_Product.defs.hh,
+	  src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Direct_Product.types.hh, src/E_NIT.defs.hh,
+	  src/E_NIT.inlines.hh, src/E_NIT.types.hh, src/E_Rational.defs.hh,
+	  src/E_Rational.inlines.hh, src/E_Rational.types.hh,
+	  src/Extended_Number.defs.hh, src/Extended_Number.inlines.hh,
+	  src/Extended_Number.types.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+	  src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid.types.hh, src/Grid_Certificate.cc,
+	  src/Grid_Certificate.defs.hh, src/Grid_Certificate.inlines.hh,
+	  src/Grid_Certificate.types.hh, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator.types.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.types.hh, src/Interval.cc, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh, src/Limits.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_Row.types.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Linear_System.types.hh,
+	  src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	  src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+	  src/MIP_Problem.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/OR_Matrix.templates.hh, src/OR_Matrix.types.hh,
+	  src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Octagonal_Shape.types.hh, src/Og_Status.idefs.hh,
+	  src/Og_Status.inlines.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	  src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh, src/Rounding.defs.hh,
+	  src/Rounding.inlines.hh, src/Rounding.types.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+	  src/distances.inlines.hh, src/distances.types.hh,
+	  src/float.types.hh, src/fpu-c99.inlines.hh,
+	  src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	  src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	  src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.bottom, src/ppl_header.hh,
+	  src/ppl_header.middle, src/ppl_header.top, src/simplify.cc,
+	  src/swapping_sort.icc, src/version.cc, src/version.hh.in,
+	  tests/BBox.cc, tests/BBox.hh, tests/FCAIBVP.cc,
+	  tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+	  tests/FCAIBVP.types.hh, tests/Makefile.am, tests/PFunction.cc,
+	  tests/PFunction.hh, tests/Partial_Function.cc,
+	  tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+	  tests/ppl_test.cc, tests/ppl_test.hh, tests/print.cc,
+	  tests/print.hh, tests/Ask_Tell/.cvsignore,
+	  tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/.cvsignore, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affineimage3.cc, tests/BD_Shape/affineimage4.cc,
+	  tests/BD_Shape/affineimage5.cc, tests/BD_Shape/affineimage6.cc,
+	  tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+	  tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+	  tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+	  tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+	  tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdiffs1.cc, tests/BD_Shape/writebdiffs2.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/Grid/.cvsignore,
+	  tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/affinepreimage2.cc, tests/Grid/asciidumpload1.cc,
+	  tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	  tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	  tests/Grid/asciidumpload6.cc, tests/Grid/asciidumpload7.cc,
+	  tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	  tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/MIP_Problem/.cvsignore, tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/maxspacedim.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/.cvsignore, tests/Polyhedron/CbecomesNNC1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc,
+	  tests/Polyhedron/valgrind_suppressions,
+	  tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/.cvsignore,
+	  utils/Makefile.am, utils/build_header.in, utils/text2cxxarray.in,
+	  utils/timings.cc, utils/timings.hh
+	  (altnum.[2,1,6,3,2,5,8,4,4,4,8,3,5,2,4,19,2,5,2,3,2,1,3,3,1,1,1,3,2,2,2,2,2,2,2,3,2,3,2,2,2,6,3,2,2,2,2,2,2,2,2,3,2,2,2,2,3,3,2,1,3,5,4,4,2,5,3,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1,7,11,3,3,5,3,2,3,3,3,3,2,2,3,3,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,4,2,8,6,2,2,6,2,2,6,2,4,1,2,2,1,1,2,2,2,4,2,2,2,2,2,4,2,2,4,2,2,4,2,4,3,2,2,2,2,9,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,8,3,2, [...]
+	  Eighth merge from the main trunk.
+
+2006-10-28 Saturday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.23),
+	  ppl_interface_generator_predicate_check_extra_code (1.14): Added
+	  generic tests for adding a representation or elements of a
+	  representation (with and without minimize).
+
+2006-10-28 Saturday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (altnum.1): file ppl_interface_generator_predicate_check_code.m4
+	  was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-28 Saturday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (altnum.1): file
+	  ppl_interface_generator_predicate_check_extra_code was added on
+	  branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (altnum.1): file Makefile.am
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (altnum.1): file disjoint1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (octagons.1): file
+	  disjoint1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (altnum.1): file
+	  expandspacedim1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (altnum.1): file
+	  relatwithcons2.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (octagons.1): file
+	  relatwithcons2.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-27 Friday 17:42  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.14),
+	  src/Octagonal_Shape.templates.hh (1.31),
+	  tests/Octagonal_Shape/Makefile.am (1.9),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.6),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.1),
+	  tests/Octagonal_Shape/disjoint1.cc (1.5),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.1),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.3): Corrected a bug in
+	  the method relation_with().  Added some tests on the methods
+	  relation_with() and is_disjoint_from().  Defined the methods
+	  bounded_affine_preimage() and expand_space_dimension() and added
+	  some tests on them.
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (altnum.1): file
+	  Octagonal_Shape.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (altnum.1): file
+	  Octagonal_Shape.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-27 Friday 16:00  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.53), membytes1.cc (1.1): Added
+	  new tests on on the methods	external_memoty_in_bytes() and
+	  total_memory_in_bytes().
+
+2006-10-27 Friday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/membytes1.cc (altnum.1): file membytes1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-27 Friday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/membytes1.cc (octagons.1): file membytes1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-27 Friday 12:41  Elena Mazzi
+
+	* tests/BD_Shape/relations3.cc (1.18): Added some new tests on
+	  BD_Shape::relation_with(Constraint).
+
+2006-10-27 Friday 12:40  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.43): Corrected a bug in
+	  BD_Shape::relation_with(const Constraint& c) when the constraint
+	  is an equality and is disjoint from BDS.
+
+2006-10-27 Friday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (altnum.1): file BD_Shape.templates.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-27 Friday 11:41  quartieri
+
+	* tests/Octagonal_Shape/membytes1.cc (1.2): Removed an annotation
+	  indicating an expected failure with 8 bits coefficients.
+
+2006-10-27 Friday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/membytes1.cc (altnum.1): file membytes1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/membytes1.cc (octagons.1): file
+	  membytes1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-10-27 Friday 10:55  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.42): Corrected a bug in
+	  BD_Shape::is_disjoint_from() when the two BD_Shapes consist of
+	  single but different points in 1D.
+
+2006-10-27 Friday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.22),
+	  ppl_interface_generator_predicate_check_extra_code (1.13),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.18): Added tests
+	  for comparing the class objects.
+
+	  General improvements to the test system including:
+
+	  Changing the test_data identifiers to be "test0n".  Using a list
+	  to give all the required tests and the member predicate to select
+	  the tests.  Generating code for building the test object for any
+	  given test id and use this instead of coding it in the actual
+	  tests.  The space_dimension and affine_dimension are now defined
+	  by an auxiliary predicate for each test id.
+
+2006-10-27 Friday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (altnum.1): file ppl_interface_generator_predicate_check_pl.m4
+	  was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-26 Thursday 22:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/disjoint1.cc (1.4): Added test07 which shows a bug
+	  when the two BD_Shapes consist of single but different points in
+	  1D.
+
+2006-10-26 Thursday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (altnum.1): file disjoint1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-26 Thursday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (octagons.1): file disjoint1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-26 Thursday 17:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/relations3.cc (1.17): Added a test showing a bug
+	  in the relation_with() method.  Test04 fails as the relation
+	  returned is "strictly_intersects" and not, as expected,
+	  "is_disjoint".
+
+2006-10-26 Thursday 15:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.21),
+	  ppl_interface_generator_predicate_check_extra_code (1.12): Added
+	  generic tests for maximize, minimize, maximize_with_point and
+	  minimize_with_point.
+
+2006-10-26 Thursday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.69): Corrected a bug in method
+	  max_min() whereby an assertion was failing when maximizing or
+	  minimizing an expression on a zero-dimensional polyhedron.
+
+2006-10-26 Thursday 11:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/max_min1.cc (1.10): Test 03 causes an assertion
+	  failure for the universe polyhedron with 0 dimensions.
+
+2006-10-25 Wednesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/foldspacedims1.cc (altnum.1): file
+	  foldspacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-25 Wednesday 15:58  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.52), expandspacedim1.cc (1.1),
+	  foldspacedims1.cc (1.1): Added new tests on methods: -
+	  BD_Shape<T>::expand_space_dimension(Variable var, dimension_type
+	  m); - BD_Shape<T>::fold_space_dimensions(Variables_Set&
+	  to_be_folded, 			    Variable var).
+
+2006-10-25 Wednesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/expandspacedim1.cc (altnum.1): file
+	  expandspacedim1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-25 Wednesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/expandspacedim1.cc (octagons.1): file
+	  expandspacedim1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-10-25 Wednesday 15:55  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.84), BD_Shape.templates.hh (1.41):
+	  Defined two new methods:
+	  BD_Shape<T>::expand_space_dimension(Variable var, dimension_type
+	  m); BD_Shape<T>::fold_space_dimensions(Variables_Set&
+	  to_be_folded, 			      Variable var).
+
+2006-10-25 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.6): Avoided a couple of
+	  copies.
+
+2006-10-25 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (altnum.1): file
+	  Pointset_Powerset.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-25 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (octagons.1): file
+	  Pointset_Powerset.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-10-25 Wednesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.6): Uncommented code that was
+	  temporarily disabled due to missing method in some pointset
+	  classes.
+
+2006-10-25 Wednesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (altnum.1): file Any_Pointset.defs.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-25 Wednesday 11:09  quartieri
+
+	* tests/Octagonal_Shape/Makefile.am (1.8): Added the test
+	  membytes1.cc.
+
+2006-10-25 Wednesday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.14):
+	  The Prolog predicate for BD_Shape_..._bounded_affine_image must
+	  not be built.
+
+2006-10-25 Wednesday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (altnum.1): file ppl_interface_generator_prolog_dat.m4 was added
+	  on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-24 Tuesday 18:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.9),
+	  C/ppl_interface_generator_c_dat.m4 (1.8),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.13),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.13),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.20),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.11): In the ppl/interfaces:
+
+	  The @BOX@ replacement is now only used for building from a box
+	  (bounding_box or covering_box).
+
+	  The "get" or "shrink" bounding_box or covering_box" procedures,
+	  do not use any pattern. As the Grid has the same aruments as the
+	  Polyhedron for shrink_bounding_box, we can combine all the
+	  classes for this procedure into one schema. On the other hand,
+	  although the covering box is only available at present for the
+	  Grid domain, it is provided as a generic schema.
+
+	  The property "is_topologically_closed" is now enabled for
+	  BD_Shape and Octagons Prolog interfaces.  Similarly the
+	  "topological_closure_assign" procedure is now enabled for
+	  BD_Shape and Octagons Prolog interfaces.
+
+	  Generic tests for all the properties using schema
+	  ppl_ at CLASS@_ at HAS_PROPERTY@ have been added.  Generic tests for
+	  ppl_ at CLASS@_ at SIMPLIFY@ have been added (for the domains under
+	  consideration, this is just the ."topological_closure_assign"
+	  procedure).
+
+	  The test data for the generic tests has again been reorganised
+	  and restructured making it easier to extend and maintain.
+
+2006-10-24 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (altnum.1): file
+	  ppl_interface_generator_c_dat.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-24 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (altnum.1): file
+	  ppl_interface_generator_common_dat.m4 was added on branch altnum
+	  on 2006-10-29 19:26:57 +0000
+
+2006-10-24 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (altnum.1): file ppl_interface_generator_prolog_icc_code.m4 was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-24 Tuesday 17:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.36), src/Grid.templates.hh (1.22),
+	  tests/Grid/boundingbox1.cc (1.13), tests/Grid/boundingbox2.cc
+	  (1.11): In ppl/src:
+
+	  The grid can now be built from boxes which may have different
+	  finite values for the upper and lower bounds or have only the
+	  upper or the lower bound bounded or have open finite bounds.
+	  Before when this happened an exception was thrown. Now we compute
+	  an approximation.
+
+	  Also, now the Grid domain requires the complexity as an argument
+	  for shrink_bounding_box so as to be compatible with the
+	  Polyhedron_shrink_bounding_box. This argument is not used.
+
+	  The tests/Grid/boundingbox1.cc and tests/Grid/boundingbox2.cc
+	  have been revised to match.
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh (altnum.1): file Grid.defs.hh was added on
+	  branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (altnum.1): file Grid.templates.hh was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox1.cc (altnum.1): file boundingbox1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox2.cc (altnum.1): file boundingbox2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-24 Tuesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.19): Recursively process the Java
+	  directory.
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: .cvsignore, ppl_java/.cvsignore (altnum.[1,1]):
+	  file .cvsignore was added on branch altnum on 2006-10-29 19:26:59
+	  +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/.cvsignore (octagons.1): file .cvsignore was
+	  added on branch octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/.cvsignore (octagons.1): file .cvsignore
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/.cvsignore (simplex.1): file .cvsignore was added
+	  on branch simplex on 2008-01-07 11:15:28 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/.cvsignore (simplex.1): file .cvsignore
+	  was added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Makefile.am, ppl_java/Makefile.am
+	  (altnum.[1,1]): file Makefile.am was added on branch altnum on
+	  2006-10-29 19:26:59 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.244), interfaces/Java/.cvsignore (1.1),
+	  interfaces/Java/Makefile.am (1.1),
+	  interfaces/Java/ppl_java/.cvsignore (1.1),
+	  interfaces/Java/ppl_java/Makefile.am (1.1): Java directories
+	  activated.
+
+2006-10-24 Tuesday 17:06  Andrea Cimino
+
+	* interfaces/Java/ppl_java/: Coefficient.java (1.2), Variable.java
+	  (1.2): Minor changes in Doxygen stuff.
+
+2006-10-24 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Coefficient.java (altnum.1): file
+	  Coefficient.java was added on branch altnum on 2006-10-29
+	  19:26:59 +0000
+
+2006-10-24 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java/Variable.java (altnum.1): file
+	  Variable.java was added on branch altnum on 2006-10-29 19:26:59
+	  +0000
+
+2006-10-24 Tuesday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Coefficient.java (1.3), Variable.java (1.3),
+	  ppl_java/Coefficient.java (1.1), ppl_java/Variable.java (1.1):
+	  Moved into the package's directory.
+
+2006-10-24 Tuesday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Coefficient.java (1.2): Comments and identifiers
+	  names revised.
+
+2006-10-24 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Variable.java (1.2): Cosmetic changes.
+
+2006-10-24 Tuesday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Variable.java (1.1): Coefficient Java class
+	  declaration and implementation.
+
+2006-10-24 Tuesday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Coefficient.java (1.1): Coefficient Java class
+	  declaration and implementation.
+
+2006-10-23 Monday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (1.4): Added FIXMEs to remember
+	  when the generalization to Powerset's of arbitrary stuff is going
+	  to be buggy.
+
+2006-10-23 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (altnum.1): file
+	  Pointset_Powerset.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (octagons.1): file
+	  Pointset_Powerset.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-10-23 Monday 11:52  quartieri
+
+	* tests/Octagonal_Shape/membytes1.cc (1.1): Added some tests on the
+	  methods   external_memoty_in_bytes() and
+	  total_memory_in_bytes().
+
+2006-10-23 Monday 11:51  quartieri
+
+	* src/: OR_Matrix.defs.hh (1.6), OR_Matrix.inlines.hh (1.3),
+	  OR_Matrix.templates.hh (1.4), Octagonal_Shape.templates.hh
+	  (1.30): Defined the methods	  external_memory_in_bytes() and
+	  total_memory_in_bytes().
+
+2006-10-23 Monday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (altnum.1): file OR_Matrix.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (altnum.1): file OR_Matrix.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (altnum.1): file
+	  OR_Matrix.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-23 Monday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.5),
+	  Pointset_Powerset.inlines.hh (1.3),
+	  Pointset_Powerset.templates.hh (1.5): No longer defining the
+	  specialized constructor:   Pointset_Powerset<C_Polyhedron>(const
+	  Pointset_Powerset<QH>&); defining the generic constructor
+	  Pointset_Powerset<PH>(const Pointset_Powerset<QH>&); instead.
+	  Similarly, generalized the specialized method:
+	  poly_difference_assign<C_Polyhedron>(...) to (temporarily) work
+	  on arbitrary instances.
+
+2006-10-23 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (altnum.1): file
+	  Pointset_Powerset.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.83), Octagonal_Shape.defs.hh (1.13):
+	  Unary constructors made explicit so as to avoid unexpected
+	  conversions.
+
+2006-10-23 Monday 08:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.40), Grid_public.cc (1.46),
+	  Octagonal_Shape.templates.hh (1.29), Polyhedron_public.cc (1.85):
+	  Prefer "existential quantification" to "cylindrification" in
+	  comments.
+
+2006-10-23 Monday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (altnum.1): file Grid_public.cc was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-10-22 Sunday 02:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.45): Make sure XSB finds
+	  libppl and libpwl in the current build tree.
+
+2006-10-21 Saturday 23:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.12),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.19),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.17): Added
+	  tests for get_bounding_box and get_covering_box.
+
+	  Removed unnecessary code and simplified the code in
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+
+	  Added the arity of the predicate under test to the test name.
+
+	  In Prolog/ppl_interface_generator_prolog_dat.m4 : now allow the
+	  interface code to be generated for get_bounding_box/3 for
+	  BD_Shape.
+
+2006-10-21 Saturday 13:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.45): Indentation fixed.  Redundant
+	  parentheses avoided.
+
+2006-10-21 Saturday 13:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.44): Fixed spelling error introduced with
+	  last commit.
+
+2006-10-21 Saturday 12:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.11),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.18),
+	  tests/ppl_interface_generator_predicate_check_extra_code (1.10),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.16): In
+	  ...prolog_dat.m4, moved the delete predicate schema first This is
+	  a work-around to a problem in generating a list of predicates in
+	  m4.
+
+	  In the Prolog/tests m4 files, a number of bugs fixed and added a
+	  test for the relation_with predicates.
+
+2006-10-21 Saturday 10:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.43): Corrected error indicated in the
+	  previous commit for tests/Grid/relations.cc.
+
+2006-10-21 Saturday 10:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (1.14): Test 20 shows a bug in the code
+	  for PPL::Grid::relation_with(const Congruence& cg)
+
+2006-10-21 Saturday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations2.cc (altnum.1): file relations2.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: boundedaffineimage1.cc (1.5),
+	  generalizedaffineimage3.cc (1.6), generalizedaffinepreimage2.cc
+	  (1.6): Several wicked whiches replaced by thats.
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (altnum.1): file
+	  generalizedaffineimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (octagons.1):
+	  file generalizedaffineimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc (altnum.1):
+	  file generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc (octagons.1):
+	  file generalizedaffinepreimage2.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-10-18 Wednesday 17:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.17),
+	  ppl_interface_generator_predicate_check_extra_code (1.9): Further
+	  additions and reorganisation of test data.  Added tests for
+	  get_ at GET_REPRESENT@ and get_minimized_ at GET_REPRESENT@ predicates.
+
+2006-10-18 Wednesday 11:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.8),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.16),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.8): Improved organisation of test data. Use "alt_replacement"
+	  to get an alternative build representation.  Added test data 3
+	  for some tests.  Other minor improvements.
+
+2006-10-17 Tuesday 20:56  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.36), MIP_Problem.templates.hh (1.9): Be
+	  more verbose when throwing exceptions.  Indentation fixed.
+
+2006-10-17 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (altnum.1): file MIP_Problem.cc was added on
+	  branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-17 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (altnum.1): file
+	  MIP_Problem.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-17 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (octagons.1): file
+	  MIP_Problem.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-10-17 Tuesday 15:37  quartieri
+
+	* tests/Octagonal_Shape/: boundedaffineimage1.cc (1.4),
+	  generalizedaffineimage3.cc (1.5), generalizedaffinepreimage2.cc
+	  (1.5): Improved some comments.
+
+2006-10-17 Tuesday 14:05  quartieri
+
+	* tests/Octagonal_Shape/: boundedaffineimage1.cc (1.3),
+	  generalizedaffineimage3.cc (1.4), generalizedaffinepreimage2.cc
+	  (1.4): Corrected some inaccurate comments.
+
+2006-10-17 Tuesday 11:26  Elena Mazzi
+
+	* tests/Octagonal_Shape/: affineimage1.cc (1.2), affinepreimage1.cc
+	  (1.2), bhmz05widening1.cc (1.2), boundedaffineimage1.cc (1.2),
+	  cc76extrapolation1.cc (1.2), cc76narrowing1.cc (1.2),
+	  disjoint1.cc (1.4), generalizedaffineimage3.cc (1.3),
+	  generalizedaffinepreimage2.cc (1.3),
+	  generalizedaffinepreimage3.cc (1.2), intersection1.cc (1.2),
+	  limitedbhmz05extrapolation1.cc (1.2),
+	  limitedcc76extrapolation1.cc (1.2), octdifference1.cc (1.2),
+	  octhull1.cc (1.2), relatwithcons2.cc (1.2), relatwithgen1.cc
+	  (1.2), removespacedims1.cc (1.2), timeelapse1.cc (1.2): Fixed
+	  lots of spelling mistakes in many tests.
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (altnum.1): file
+	  affineimage1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (octagons.1): file
+	  affineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (altnum.1): file
+	  affinepreimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (octagons.1): file
+	  affinepreimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (altnum.1): file
+	  bhmz05widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (octagons.1): file
+	  bhmz05widening1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (altnum.1): file
+	  cc76extrapolation1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (octagons.1): file
+	  cc76extrapolation1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (altnum.1): file
+	  cc76narrowing1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (octagons.1): file
+	  cc76narrowing1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc (altnum.1):
+	  file generalizedaffinepreimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc (octagons.1):
+	  file generalizedaffinepreimage3.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (altnum.1): file
+	  intersection1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (octagons.1): file
+	  intersection1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (altnum.1):
+	  file limitedbhmz05extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
+	  (octagons.1): file limitedbhmz05extrapolation1.cc was added on
+	  branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc (altnum.1):
+	  file limitedcc76extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc (octagons.1):
+	  file limitedcc76extrapolation1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (altnum.1): file
+	  octdifference1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (octagons.1): file
+	  octdifference1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (altnum.1): file octhull1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (octagons.1): file octhull1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (altnum.1): file
+	  relatwithgen1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (octagons.1): file
+	  relatwithgen1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (altnum.1): file
+	  removespacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (octagons.1): file
+	  removespacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (altnum.1): file
+	  timeelapse1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (octagons.1): file
+	  timeelapse1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 10:52  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (1.28): Corrected a bug in
+	  strong_reduction_assign().
+
+2006-10-17 Tuesday 10:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.39): Corrected a bug in
+	  shortest_path_reduction_assign().
+
+2006-10-17 Tuesday 10:40  Elena Mazzi
+
+	* tests/Octagonal_Shape/minconstraints1.cc (1.2): Test 3 shows a
+	  bug in minimized_constraints() when the Octagonal Shape is
+	  zero-dimensional and universe.
+
+2006-10-17 Tuesday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (altnum.1): file
+	  minconstraints1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (octagons.1): file
+	  minconstraints1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 10:38  Elena Mazzi
+
+	* tests/BD_Shape/minconstraints1.cc (1.9): Test 2 shows a bug in
+	  minimized_constraints() when the BD_Shape is zero-dimensional and
+	  universe.
+
+2006-10-17 Tuesday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/minconstraints1.cc (altnum.1): file
+	  minconstraints1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Elena Mazzi
+
+	* tests/BD_Shape/: addconstraints1.cc (1.16), affineimage1.cc
+	  (1.16), affinepreimage1.cc (1.17), bdsdifference1.cc (1.12),
+	  bdshull1.cc (1.13), bhmz05widening1.cc (1.12),
+	  boundedaffineimage1.cc (1.2), cc76extrapolation1.cc (1.16),
+	  cc76narrowing1.cc (1.16), disjoint1.cc (1.3),
+	  generalizedaffineimage2.cc (1.18), generalizedaffinepreimage3.cc
+	  (1.3), intersection1.cc (1.16), limitedbhmz05extrapolation1.cc
+	  (1.11), limitedcc76extrapolation1.cc (1.12), relations2.cc
+	  (1.19), relations3.cc (1.16), removespacedims1.cc (1.17),
+	  timeelapse1.cc (1.16): Fixed lots of spelling mistakes in many
+	  tests.
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference1.cc (altnum.1): file
+	  bdsdifference1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdshull1.cc (altnum.1): file bdshull1.cc was added
+	  on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening1.cc (altnum.1): file
+	  bhmz05widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffineimage1.cc (octagons.1): file
+	  boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage3.cc (altnum.1): file
+	  generalizedaffinepreimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage3.cc (octagons.1): file
+	  generalizedaffinepreimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (altnum.1): file
+	  limitedbhmz05extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (altnum.1): file
+	  limitedcc76extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 09:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.15),
+	  ppl_interface_generator_predicate_check_extra_code (1.7),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.15): Error in
+	  the swap code corrected.
+
+	  Tests for space_dimension and affine_dimension added.
+
+	  Now, for check_noisy, a list of all successful tests is output.
+	  For check_all and check_noisy, a list of all failed tests is
+	  output.  For check_noisy, the constraint and generator (or
+	  similar) systems of the failing object are output.
+
+2006-10-16 Monday 15:10  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.12),
+	  src/Octagonal_Shape.inlines.hh (1.10),
+	  src/Octagonal_Shape.templates.hh (1.27),
+	  tests/Octagonal_Shape/Makefile.am (1.7),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.1): Defined the
+	  method	       Octagonal_Shape<T>::bounded_affine_image()
+	  and added some tests on it.
+
+2006-10-16 Monday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (altnum.1): file
+	  Octagonal_Shape.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-16 Monday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.200): The entry for LP_Problem rewritten so as to
+	  introduce the generalization to MIP_Problem.
+
+2006-10-16 Monday 15:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.199): We no longer have class LP_Problem: the TODO items
+	  now refer to MIP_Problem.
+
+2006-10-16 Monday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.37), LP_Problem.defs.hh (1.27),
+	  LP_Problem.inlines.hh (1.12), LP_Problem.templates.hh (1.2),
+	  LP_Problem.types.hh (1.6), Makefile.am (1.162): No longer build
+	  LP_Problem; corresponding source files removed.
+
+2006-10-16 Monday 14:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.243), tests/Makefile.am (1.259): Do perform tests
+	  for class MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/: .cvsignore (1.1), Makefile.am (1.1),
+	  ascii_dump_load1.cc (1.1), exceptions1.cc (1.1), mipproblem1.cc
+	  (1.1): Put under CVS control.
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/.cvsignore (octagons.1): file .cvsignore was
+	  added on branch octagons on 2006-11-18 20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (altnum.1): file Makefile.am was
+	  added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (octagons.1): file Makefile.am was
+	  added on branch octagons on 2006-11-18 20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/ascii_dump_load1.cc (altnum.1): file
+	  ascii_dump_load1.cc was added on branch altnum on 2006-10-29
+	  19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/ascii_dump_load1.cc (octagons.1): file
+	  ascii_dump_load1.cc was added on branch octagons on 2006-11-18
+	  20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (altnum.1): file exceptions1.cc
+	  was added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (octagons.1): file
+	  exceptions1.cc was added on branch octagons on 2006-11-18
+	  20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (altnum.1): file mipproblem1.cc
+	  was added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.65): Correct the name of a
+	  constructor for MIP_Problem.
+
+2006-10-16 Monday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c_version.h.in (1.3),
+	  ppl_interface_generator_c_cc_preamble (1.4),
+	  ppl_interface_generator_c_h_preamble (1.5): Interface class
+	  MIP_Problem, not LP_Problem.	Constructor
+	  new_MIP_Problem_from_dimension() renamed as
+	  new_MIP_Problem_from_space_dimension() for consistency.  Started
+	  reorganizing the documentation of the C interface.
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (altnum.1): file
+	  ppl_c_version.h.in was added on branch altnum on 2006-10-29
+	  19:26:58 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (octagons.1): file
+	  ppl_c_version.h.in was added on branch octagons on 2006-11-18
+	  20:36:44 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (altnum.1):
+	  file ppl_interface_generator_c_cc_preamble was added on branch
+	  altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (altnum.1):
+	  file ppl_interface_generator_c_h_preamble was added on branch
+	  altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (octagons.1):
+	  file ppl_interface_generator_c_h_preamble was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-16 Monday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (altnum.1): file
+	  pl_grid_check.pl was added on branch altnum on 2006-10-29
+	  19:27:09 +0000
+
+2006-10-16 Monday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (octagons.1): file
+	  pl_grid_check.pl was added on branch octagons on 2006-11-18
+	  20:36:49 +0000
+
+2006-10-16 Monday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.157),
+	  ppl_interface_generator_prolog_dat.m4 (1.10),
+	  ppl_interface_generator_prolog_icc_preamble (1.12),
+	  Ciao/ciao_pl_check.pl (1.24), XSB/xsb_pl_check.P (1.28),
+	  tests/pl_check.pl (1.38), tests/pl_grid_check.pl (1.3): Interface
+	  class MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (altnum.1): file ppl_interface_generator_prolog_icc_preamble was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-16 Monday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/README (1.3): Minor improvements and
+	  corrections to links.
+
+2006-10-16 Monday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/README (altnum.1): file README was added
+	  on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-16 Monday 14:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.78), devref.doxyconf-latex.in
+	  (1.17): Generate documentation of MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-latex.in (altnum.1): file
+	  devref.doxyconf-latex.in was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-10-16 Monday 14:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.21): Do silence an annoying compiler
+	  warning.
+
+2006-10-16 Monday 14:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.templates.hh (1.4), Polyhedron_nonpublic.cc
+	  (1.68): Use MIP_Problem instead of LP_Problem.
+
+2006-10-16 Monday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (altnum.1): file
+	  Polyhedron.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-16 Monday 14:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.134): Removed useless inclusion.
+
+2006-10-16 Monday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.38): Corrected a bug in
+	  affine_dimension().  Do use class MIP_Problem instead of
+	  LP_Problem.
+
+2006-10-16 Monday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.26): Correct a bug in
+	  affine_dimension().  Do use class MIP_Problem instead of
+	  LP_Problem.
+
+2006-10-16 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (altnum.1): file
+	  affinedimension1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-16 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (octagons.1): file
+	  affinedimension1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-16 Monday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/affinedimension1.cc (1.10),
+	  Octagonal_Shape/affinedimension1.cc (1.2): A bug in
+	  affine_dimension() is affecting both BD_Shape and
+	  Octagonal_Shape.  The bug causes an assertion to be violated when
+	  the shape is zero-dimensional and universe.
+
+2006-10-16 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinedimension1.cc (altnum.1): file
+	  affinedimension1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-16 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.7): Invocations of Coefficient
+	  constructors fixed.
+
+2006-10-16 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (altnum.1): file ppl_ocaml.cc was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-16 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (octagons.1): file ppl_ocaml.cc was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-16 Monday 09:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/affinedimension1.cc (1.9): Test 11 shows a bug in
+	  affine_dimension() when the BD_Shape object is constructed from
+	  an empty constraint system.
+
+2006-10-13 Friday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.14),
+	  ppl_interface_generator_predicate_check_extra_code (1.6),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.14): Added code
+	  for producing noisy output when tests fail.
+
+2006-10-13 Friday 11:56  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.51), boundedaffineimage1.cc
+	  (1.1): Added new tests on the method
+	  BD_Shape::bounded_affine_image().
+
+2006-10-13 Friday 11:53  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.82), BD_Shape.templates.hh (1.37):
+	  Defined the new method: BD_Shape<T>::bounded_affine_image(var,
+	  lb_expr, ub_expr, den).
+
+2006-10-13 Friday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.13): Cut_and_paste error fixed.
+
+2006-10-13 Friday 09:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.12),
+	  ppl_interface_generator_predicate_check_extra_code (1.5): Added
+	  tests and test data for strict constraints and closure points for
+	  NNC polyhedra.  Extended test for building a bounding/covering
+	  box.
+
+2006-10-12 Thursday 22:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.11),
+	  ppl_interface_generator_predicate_check_extra_code (1.4),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.13): More
+	  improvements to the test framework and added generic tests for
+	  new_ at CLASS@_from_ at BOX@ and the swap procedure.
+
+2006-10-11 Wednesday 18:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.10),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.12): Added some
+	  code for future use and development of the test code...
+
+2006-10-11 Wednesday 16:38  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.35): Removed a spurious line to allow
+	  compiling if the heuristic is disabled.
+
+2006-10-11 Wednesday 14:13  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.36), expected_int16 (1.9),
+	  expected_int16_a (1.9), expected_int32 (1.10), expected_int32_a
+	  (1.10), expected_int64 (1.10), expected_int64_a (1.10),
+	  expected_int8 (1.9), expected_int8_a (1.8), expected_mpz (1.11),
+	  expected_mpz_a (1.11): Regenerated all the expected_* reflecting
+	  the new changes in Makefile.am.
+
+2006-10-11 Wednesday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.18): OCaml subdirectory enabled.
+
+2006-10-10 Tuesday 19:32  Andrea Cimino
+
+	* demos/ppl_lpsol/Makefile.am (1.35): Keep problems sorted.
+
+2006-10-10 Tuesday 19:30  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.34), examples/ex11.mps (1.3),
+	  examples/ex12.mps (1.1): Renamed ex11.mps as ex12.mps and
+	  restored the old ex11.mps.  Modified Makefile.am to skip ex12.mps
+	  checking.
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex11.mps (altnum.1): file ex11.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex11.mps (octagons.1): file ex11.mps was
+	  added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex12.mps (altnum.1): file ex12.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex12.mps (octagons.1): file ex12.mps was
+	  added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex12.mps (simplex.1): file ex12.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 19:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/congruence1.cc (1.15),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.11): No longer rely on an operator recently removed.
+
+2006-10-10 Tuesday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruence1.cc (altnum.1): file congruence1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-10 Tuesday 19:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.16), Congruence.inlines.hh (1.13):
+	  Removed operator building a Congruence object from a Coefficient
+	  and a Linear_Expression (in that order) as it was clashing with a
+	  template member of class Checked_Number.
+
+2006-10-10 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh (altnum.1): file Congruence.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-10 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.inlines.hh (altnum.1): file Congruence.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-10 Tuesday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.defs.hh (1.33): Removed redundant
+	  declarations (with repeated documentation).
+
+2006-10-10 Tuesday 18:59  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.64): Typo fixed.
+
+2006-10-10 Tuesday 18:54  Andrea Cimino
+
+	* demos/ppl_lpsol/examples/ex11.mps (1.2): Modified for testing
+	  purposes.
+
+2006-10-10 Tuesday 17:25  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.33), expected_int16 (1.8),
+	  expected_int16_a (1.8), expected_int32 (1.9), expected_int32_a
+	  (1.9), expected_int64 (1.9), expected_int64_a (1.9),
+	  expected_int8 (1.8), expected_int8_a (1.7), expected_mpz (1.10),
+	  expected_mpz_a (1.10), examples/README (1.2), examples/egout.mps
+	  (1.1), examples/ex11.mps (1.1), examples/lseu.mps (1.1),
+	  examples/markshare1.mps (1.1), examples/markshare2.mps (1.1),
+	  examples/mas74.mps (1.1), examples/mas76.mps (1.1),
+	  examples/modglob.mps (1.1), examples/noswot.mps (1.1),
+	  examples/opt1217.mps (1.1), examples/p0033.mps (1.1),
+	  examples/pk1.mps (1.1), examples/rout.mps (1.1): Added new test
+	  for ppl_lpsol: now ppl_lsol checks satisfiability and optimality
+	  of some MIP Problems. Added other .mps files to the testsuite.
+	  README and obtained_* updated.
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/egout.mps (altnum.1): file egout.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/egout.mps (octagons.1): file egout.mps
+	  was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/egout.mps (simplex.1): file egout.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/lseu.mps (altnum.1): file lseu.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/lseu.mps (octagons.1): file lseu.mps was
+	  added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/lseu.mps (simplex.1): file lseu.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare1.mps (altnum.1): file
+	  markshare1.mps was added on branch altnum on 2006-10-29 19:26:55
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare1.mps (octagons.1): file
+	  markshare1.mps was added on branch octagons on 2006-11-18
+	  20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare1.mps (simplex.1): file
+	  markshare1.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare2.mps (altnum.1): file
+	  markshare2.mps was added on branch altnum on 2006-10-29 19:26:55
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare2.mps (octagons.1): file
+	  markshare2.mps was added on branch octagons on 2006-11-18
+	  20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare2.mps (simplex.1): file
+	  markshare2.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas74.mps (altnum.1): file mas74.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas74.mps (octagons.1): file mas74.mps
+	  was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas74.mps (simplex.1): file mas74.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas76.mps (altnum.1): file mas76.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas76.mps (octagons.1): file mas76.mps
+	  was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas76.mps (simplex.1): file mas76.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/modglob.mps (altnum.1): file modglob.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/modglob.mps (octagons.1): file
+	  modglob.mps was added on branch octagons on 2006-11-18 20:36:42
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/modglob.mps (simplex.1): file
+	  modglob.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/noswot.mps (altnum.1): file noswot.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/noswot.mps (octagons.1): file noswot.mps
+	  was added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/noswot.mps (simplex.1): file noswot.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/opt1217.mps (altnum.1): file opt1217.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/opt1217.mps (octagons.1): file
+	  opt1217.mps was added on branch octagons on 2006-11-18 20:36:43
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/opt1217.mps (simplex.1): file
+	  opt1217.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/p0033.mps (altnum.1): file p0033.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/p0033.mps (octagons.1): file p0033.mps
+	  was added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/p0033.mps (simplex.1): file p0033.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/pk1.mps (altnum.1): file pk1.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/pk1.mps (octagons.1): file pk1.mps was
+	  added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/pk1.mps (simplex.1): file pk1.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/rout.mps (altnum.1): file rout.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/rout.mps (octagons.1): file rout.mps was
+	  added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/rout.mps (simplex.1): file rout.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 14:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.9),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.11): Simplified
+	  the testing framework.
+
+2006-10-10 Tuesday 14:01  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.7): Use the method empty()
+	  given by the STL instead of checking for a zero size.
+
+2006-10-10 Tuesday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (altnum.1): file
+	  variablesset1.cc was added on branch altnum on 2006-10-29
+	  19:27:34 +0000
+
+2006-10-10 Tuesday 12:46  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.6): Code cleaned. Added a
+	  FIXME concerning the operator==.
+
+2006-10-10 Tuesday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.10): Avoid generating useless tests.
+
+2006-10-10 Tuesday 09:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_systems.m4
+	  (1.8), tests/ppl_interface_generator_predicate_check_pl.m4 (1.9):
+	  Comments and formatting improved.
+
+2006-10-10 Tuesday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (altnum.1): file ppl_interface_generator_prolog_systems.m4 was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-10 Tuesday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (octagons.1): file ppl_interface_generator_prolog_systems.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-10 Tuesday 09:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.47), yap_cfli.cc (1.3):
+	  Distribute yap_cfli.hh.  Removed the obsolete yap_cfli.cc.
+
+2006-10-10 Tuesday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.44): Distribute also
+	  xsb_cfli.hh.
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.64),
+	  ppl_interface_generator_swiprolog_cc.m4 (1.6), swi_cfli.cc (1.3),
+	  swi_cfli.h (1.3), swi_cfli.hh (1.1), swi_cfli.ic (1.3):
+	  Reorganized the SWI Prolog Common Foreign Language Interface.
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (altnum.1): file ppl_interface_generator_swiprolog_cc.m4 was
+	  added on branch altnum on 2006-10-29 19:27:04 +0000
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (octagons.1): file ppl_interface_generator_swiprolog_cc.m4 was
+	  added on branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (altnum.1): file swi_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:04 +0000
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (octagons.1): file swi_cfli.hh
+	  was added on branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-09 Monday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.58): Copy-and-paste mistake
+	  fixed.
+
+2006-10-09 Monday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/membytes1.cc (1.13): test01() is expected to
+	  result in underflow with 8-bit coefficients also with assertions
+	  disabled.
+
+2006-10-09 Monday 16:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.11),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.8),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.3), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.8): [no log message]
+
+2006-10-09 Monday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (altnum.1): file
+	  ppl_interface_generator_common.m4 was added on branch altnum on
+	  2006-10-29 19:26:57 +0000
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.33): YAP subdirectory
+	  re-enabled.
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.5):
+	  Copy-and-paste mistake fixed.
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (altnum.1): file ppl_interface_generator_xsb_cc.m4 was added on
+	  branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (octagons.1): file ppl_interface_generator_xsb_cc.m4 was added on
+	  branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-09 Monday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (1.5): Work around a bug in GCC
+	  3.3.3.
+
+2006-10-09 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (1.1): New implementation of
+	  the XSB Prolog Common Foreign Language Interface.
+
+2006-10-09 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (altnum.1): file xsb_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-09 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (octagons.1): file xsb_cfli.hh
+	  was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-09 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.2):
+	  Thresholds for test12() updated to reflect the precision
+	  attainable on the Alpha processor.
+
+2006-10-09 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (altnum.1):
+	  file generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-09 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (octagons.1):
+	  file generalizedaffinepreimage1.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-10-09 Monday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (1.3): Spurious ASCII-dumps
+	  removed.
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (altnum.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+	  added on branch altnum on 2006-10-29 19:27:03 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (octagons.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+	  added on branch octagons on 2006-11-18 20:36:47 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (altnum.1): file ppl_interface_generator_yap_cc.m4 was added on
+	  branch altnum on 2006-10-29 19:27:06 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (octagons.1): file ppl_interface_generator_yap_cc.m4 was added on
+	  branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.hh (altnum.1): file yap_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:06 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.hh (octagons.1): file yap_cfli.hh
+	  was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.12), ppl_interface_generator_prolog_icc_preamble (1.10),
+	  Ciao/Makefile.am (1.58), Ciao/ciao_cfli.hh (1.1),
+	  Ciao/ppl_ciao.cc (1.48), GNU/Makefile.am (1.57),
+	  GNU/gprolog_cfli.hh (1.1), GNU/ppl_gprolog_sd.cc (1.41),
+	  SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.4),
+	  SWI/ppl_interface_generator_swiprolog_cc.m4 (1.5),
+	  XSB/ppl_interface_generator_xsb_cc.m4 (1.4),
+	  YAP/ppl_interface_generator_yap_cc.m4 (1.4), YAP/yap_cfli.h
+	  (1.3), YAP/yap_cfli.hh (1.1), YAP/yap_cfli.ic (1.3): Prolog
+	  interfaces cleaned up.
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (altnum.1): file ciao_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (octagons.1): file
+	  ciao_cfli.hh was added on branch octagons on 2006-11-18 20:36:46
+	  +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (altnum.1): file
+	  gprolog_cfli.hh was added on branch altnum on 2006-10-29 19:27:02
+	  +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (octagons.1): file
+	  gprolog_cfli.hh was added on branch octagons on 2006-11-18
+	  20:36:47 +0000
+
+2006-10-07 Saturday 18:18  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.63): Useless code removed.
+
+2006-10-07 Saturday 18:16  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.62): maybe_check_results() fixed
+	  when `no_optimization' flag is enabled.
+
+2006-10-07 Saturday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.27): Revised a couple of comments.
+
+2006-10-07 Saturday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (altnum.1): file MIP_Problem.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-07 Saturday 15:47  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.34), MIP_Problem.defs.hh (1.26): Defined
+	  and implemented the method `is_saturated()'.
+
+2006-10-07 Saturday 15:15  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.61),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.3),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.4),
+	  src/MIP_Problem.cc (1.33), src/MIP_Problem.defs.hh (1.25),
+	  src/MIP_Problem.templates.hh (1.8), src/Polyhedron_public.cc
+	  (1.84): ppl_lpsol: restored the old threshold.  MIP_Problem:
+	  added the new constructor
+
+	  template <typename In>   MIP_Problem(dimension_type dim,
+	       In first, In last,		const Variables_Set&
+	  int_vars,		  const Linear_Expression& obj =
+	  Linear_Expression::zero(),		   Optimization_Mode mode =
+	  MAXIMIZATION)
+
+	  Renamed `set_integer_dimensions()' to
+	  `add_to_integer_space_dimensions'.  Check, if a variables_set is
+	  passed to a constructor, if the set does not exceed the space
+	  dimension of the MIP Problem.
+
+2006-10-07 Saturday 13:00  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.60): The -r option is now
+	  compatible with -e. Throw an error if we want to solve a MIP with
+	  -e. maybe_check_results() cleaned.  Modified the default
+	  threshold between GLPK and ppl_lpsol, this to prepare us for the
+	  next commit that will change the testsuite.
+
+2006-10-06 Friday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.59): Spurious blanks removed.
+
+2006-10-06 Friday 20:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.58): At least version 0.10 is
+	  required for the MIP solving functionality.
+
+2006-10-06 Friday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.57): This is no longer a toy.
+
+2006-10-06 Friday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.56): Fixed some comments and code
+	  formatting.
+
+2006-10-06 Friday 19:37  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.55): Use "variables" instead of
+	  "Variables" when printing verbose output.
+
+2006-10-06 Friday 19:30  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.54): Some changes: -r is
+	  incompatible with -e.  If a MIP problem is going to be solved,
+	  print, if requested, the variables constrained to be integer.
+
+2006-10-06 Friday 14:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (1.10): Another
+	  change to name of a macro.
+
+2006-10-06 Friday 14:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.9),
+	  C/ppl_interface_generator_c_cc.m4 (1.5),
+	  C/ppl_interface_generator_c_h.m4 (1.9),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.7),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4 (1.7):
+	  Complete improvements to ppl_interface_generator_common.m4.  The
+	  top level macro used by the main generating files now m4_all_code
+	  instead of m4_all_classes_code.  The calls therefore adjusted
+	  appropriately.
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (altnum.1): file
+	  ppl_interface_generator_c_cc.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (octagons.1): file
+	  ppl_interface_generator_c_cc.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (altnum.1): file
+	  ppl_interface_generator_c_h.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (octagons.1): file
+	  ppl_interface_generator_c_h.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (altnum.1): file ppl_interface_generator_prolog_icc.m4 was added
+	  on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-06 Friday 13:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.8),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.7): Revised
+	  C/ppl_interface_generator_c_cc_code.m4 for the changes to the
+	  pattern names.
+
+	  General improvements to ppl_interface_generator_common.m4
+	  including making some macro names more meaningful and improving
+	  the comments.
+
+2006-10-06 Friday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (altnum.1):
+	  file ppl_interface_generator_c_cc_code.m4 was added on branch
+	  altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 10:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.7),
+	  C/ppl_interface_generator_c_h.m4 (1.8),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.9),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.4),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.6): Many
+	  improvements to the m4 code and comments in
+	  ppl_interface_generator_common.m4
+
+	  Names of macros improved and hence some changes needed in other
+	  interface_generator files that use these names.
+
+	  Unwanted text removed from C/ppl_interface_generator_c_h.m4
+
+	  Bug fixed in ppl_interface_generator_common.m4.
+
+2006-10-05 Thursday 15:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.7),
+	  C/ppl_interface_generator_c_cc.m4 (1.4),
+	  C/ppl_interface_generator_c_dat.m4 (1.7),
+	  C/ppl_interface_generator_c_h.m4 (1.7),
+	  C/ppl_interface_generator_c_h_code.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.8),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.11),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.5),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.7), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.6): Patterns "represent" and "describe" replaced by 4 patterns
+	  "build_represent", "get_represent", "add_represent" and
+	  "relation_represent", to more accurately relate to the sets of
+	  methods and predicates for which they apply.
+
+	  Before including the preamble, we first change the quote
+	  characters ` and ' using m4_changequote/2. This avoids m4 eating
+	  the quotes in the preamble text.
+
+2006-10-05 Thursday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (altnum.1): file
+	  ppl_interface_generator_c_h_code.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-05 Thursday 15:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.242): Adjusted to support the building of
+	  separate documentations for the library and its foreign language
+	  interfaces.
+
+2006-10-05 Thursday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: Makefile.am (1.47), devref-c-interface.doxyconf-html.in
+	  (1.1), devref-c-interface.doxyconf-latex.in (1.1),
+	  devref-prolog-interface.doxyconf-html.in (1.1),
+	  devref-prolog-interface.doxyconf-latex.in (1.1),
+	  devref.doxyconf-html.in (1.77), devref.doxyconf-latex.in (1.16),
+	  user-c-interface.doxyconf-html.in (1.1),
+	  user-c-interface.doxyconf-latex.in (1.1),
+	  user-prolog-interface.doxyconf-html.in (1.1),
+	  user-prolog-interface.doxyconf-latex.in (1.1),
+	  user.doxyconf-html.in (1.38), user.doxyconf-latex.in (1.9): The
+	  documentation of foreign languages interfaces is now separated
+	  from the documentation of the main library. The actual
+	  documentation will have to be changed accordingly to reflect this
+	  new design choice.
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-html.in (altnum.1): file
+	  devref-c-interface.doxyconf-html.in was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-html.in (octagons.1): file
+	  devref-c-interface.doxyconf-html.in was added on branch octagons
+	  on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-latex.in (altnum.1): file
+	  devref-c-interface.doxyconf-latex.in was added on branch altnum
+	  on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-latex.in (octagons.1): file
+	  devref-c-interface.doxyconf-latex.in was added on branch octagons
+	  on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-html.in (altnum.1): file
+	  devref-prolog-interface.doxyconf-html.in was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-html.in (octagons.1): file
+	  devref-prolog-interface.doxyconf-html.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-latex.in (altnum.1): file
+	  devref-prolog-interface.doxyconf-latex.in was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-latex.in (octagons.1): file
+	  devref-prolog-interface.doxyconf-latex.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-html.in (altnum.1): file
+	  user-c-interface.doxyconf-html.in was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-html.in (octagons.1): file
+	  user-c-interface.doxyconf-html.in was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-latex.in (altnum.1): file
+	  user-c-interface.doxyconf-latex.in was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-latex.in (octagons.1): file
+	  user-c-interface.doxyconf-latex.in was added on branch octagons
+	  on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-html.in (altnum.1): file
+	  user-prolog-interface.doxyconf-html.in was added on branch altnum
+	  on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-html.in (octagons.1): file
+	  user-prolog-interface.doxyconf-html.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (altnum.1): file
+	  user-prolog-interface.doxyconf-latex.in was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (octagons.1): file
+	  user-prolog-interface.doxyconf-latex.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.doxyconf-latex.in (altnum.1): file
+	  user.doxyconf-latex.in was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-10-05 Thursday 14:57  Elena Mazzi
+
+	* src/: BD_Shape.templates.hh (1.36), DB_Matrix.defs.hh (1.25),
+	  DB_Matrix.inlines.hh (1.28), DB_Matrix.templates.hh (1.3),
+	  DB_Row.defs.hh (1.20), DB_Row.inlines.hh (1.19),
+	  DB_Row.templates.hh (1.2): Added the definitions of methods
+	  `memory_size_type total_memory_in_bytes() const' and
+	  `memory_size_type external_memory_in_bytes() const' in the
+	  following classes: DB_Row, DB_Matrix, BD_Shape.
+
+2006-10-05 Thursday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (altnum.1): file
+	  DB_Matrix.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-10-05 Thursday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh (altnum.1): file DB_Row.templates.hh was
+	  added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-05 Thursday 12:19  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.35), tests/BD_Shape/disjoint1.cc
+	  (1.2): Fixed the comment in the method
+	  BD_Shape<T>::is_disjoint_from().  Added new tests on this method.
+	  Replaced `system/s of bounded differences' with `bounded
+	  difference shape/s'.
+
+2006-10-05 Thursday 11:34  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.32), MIP_Problem.defs.hh (1.24):
+	  `recursion_depth' thrown away.
+
+2006-10-05 Thursday 11:14  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.31), MIP_Problem.defs.hh (1.23): Comments
+	  revised.  `recursion_depth' is an unsigned long.
+
+2006-10-05 Thursday 10:18  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.30), MIP_Problem.defs.hh (1.22),
+	  MIP_Problem.inlines.hh (1.12), MIP_Problem.templates.hh (1.7):
+	  The correctness of the solution found, if is involved a non-empty
+	  integer Variables_Set, is now proofed without having a special
+	  member in the class. Slightly modified is_mip_satisfiable(),
+	  solve_mip and choose_branching_variable() intefaces for that
+	  purpose.
+
+2006-10-05 Thursday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (altnum.1): file
+	  MIP_Problem.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-05 Thursday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (octagons.1): file
+	  MIP_Problem.inlines.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-10-05 Thursday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.68), GMP_Integer.defs.hh
+	  (1.23), GMP_Integer.inlines.hh (1.17): Added void
+	  rem_assign(GMP_Integer&, const GMP_Integer&, const GMP_Integer&).
+	  Added void rem_assign(Checked_Number<T, Policy>&, const
+	  Checked_Number<T, Policy>&, const Checked_Number<T, Policy>&).
+
+2006-10-04 Wednesday 23:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.6),
+	  ppl_interface_generator_common_dat.m4 (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.6), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.5): ppl_interface_generator_common.m4
+	  ppl_interface_generator_common_dat.m4: Redundant code removed,
+	  spelling in comment corrected.
+
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4:
+	  Extra predicate definition added to compensate for missing
+	  topology in generated test code.  A rather inelegant solution to
+	  a problem caused by some code requiring the topology "C_" or
+	  "NNC_" attached to "Polyhedron" and some not, depending on the
+	  initiating class.
+
+2006-10-04 Wednesday 21:24  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.29), MIP_Problem.defs.hh (1.21): Typos
+	  fixed. `recursion_depth' now is an unsigned long.
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am (1.43), partition1.cc (1.1):
+	  Proof-of-concept implementation of the generalization to grids of
+	  the partition algorithm in [Srivastava93].
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (altnum.1): file Makefile.am was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partition1.cc (altnum.1): file partition1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partition1.cc (octagons.1): file partition1.cc was
+	  added on branch octagons on 2006-11-18 20:36:57 +0000
+
+2006-10-04 Wednesday 16:01  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.28), MIP_Problem.defs.hh (1.20),
+	  MIP_Problem.inlines.hh (1.11), MIP_Problem.templates.hh (1.6):
+	  Check in method OK() that the solution, if found, satisfies the
+	  Variables_Set that encodes all the Variables constrained to be
+	  integer.  Added a new member to the class for that purpose.
+
+2006-10-04 Wednesday 13:04  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.25),
+	  tests/Octagonal_Shape/disjoint1.cc (1.2): Improved the method
+	  is_disjoint_from() and added a new test on it.
+
+2006-10-03 Tuesday 20:02  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.27): Some missing parentheses added.
+
+2006-10-03 Tuesday 19:50  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.26), MIP_Problem.defs.hh (1.19): Fixed
+	  some typos.  Used more appropriate variable names.
+
+2006-10-03 Tuesday 19:24  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.25), MIP_Problem.defs.hh (1.18): Comments
+	  revised. Variable type and name changed.
+
+2006-10-03 Tuesday 17:33  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.24): Moved a couple of variable
+	  declarations in the right place.
+
+2006-10-03 Tuesday 17:29  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.23), MIP_Problem.defs.hh (1.17): Fixed a
+	  bug in solve_mip(): if MAXIMIZATION was requested, the `branch
+	  and bound' tree was cut too early, loosing optimal solutions.
+	  Slightly modified solve_mip() interface to allow to print some
+	  debugging information if requested.
+
+2006-10-03 Tuesday 16:16  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.135), BD_Shape.templates.hh (1.34):
+	  No longer inlined the following functions: -
+	  BD_Shape::affine_dimension(); -
+	  BD_Shape::forget_all_dbm_constraints(v); -
+	  BD_Shape::forget_binary_dbm_constraints(v).
+
+2006-10-03 Tuesday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.5),
+	  ppl_interface_generator_predicate_check_extra_code (1.2),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.4): Some
+	  improvements.  Commented code in
+	  ppl_interface_generator_predicate_check_code.m4 shows a bug in
+	  the main m4 replacement code for friend classes.
+
+2006-10-03 Tuesday 15:35  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.33): The method
+	  BD_Shape::is_disjoint_from(y) is now implemented without using a
+	  copy of a BD_Shape.
+
+2006-10-03 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/discrete1.cc (altnum.1): file discrete1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-03 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/discrete1.cc (octagons.1): file
+	  discrete1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-10-03 Tuesday 14:25  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.9),
+	  src/Octagonal_Shape.templates.hh (1.24),
+	  tests/Octagonal_Shape/Makefile.am (1.6),
+	  tests/Octagonal_Shape/discrete1.cc (1.1): Defined the method
+	  is_discrete() and moved it from the file
+	  Octagonal_Shape.templates.hh to the file
+	  Octagonal_Shape.inlines.hh.  Added some tests about it.
+
+2006-10-03 Tuesday 14:02  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.134), BD_Shape.templates.hh (1.32):
+	  Moved the method BD_Shape::is_discrete() from file
+	  `BD_Shape.templates.hh' to `BD_Shape.inlines.hh'.
+
+2006-10-03 Tuesday 13:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.4): Bug
+	  in code generator for XSB corrected.
+
+2006-10-03 Tuesday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (altnum.1): file ppl_interface_generator_xsb_H.m4 was added on
+	  branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-03 Tuesday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (octagons.1): file ppl_interface_generator_xsb_H.m4 was added on
+	  branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-03 Tuesday 13:04  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.31), tests/BD_Shape/Makefile.am
+	  (1.50), tests/BD_Shape/discrete1.cc (1.1): Defined the method
+	  BD_Shape::is_discrete() and added some tests on this method.
+
+2006-10-03 Tuesday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/discrete1.cc (altnum.1): file discrete1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-03 Tuesday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/discrete1.cc (octagons.1): file discrete1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-03 Tuesday 11:49  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.22): In a MIP_Problem, if we exit with
+	  status UNBOUNDED and we have found a feasible generator, store it
+	  in `last_generator'.
+
+2006-10-03 Tuesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: certificate1.cc (1.12), congruence1.cc (1.14),
+	  discrete1.cc (1.6): Awful syntax avoided.
+
+2006-10-03 Tuesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/certificate1.cc (altnum.1): file certificate1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-03 Tuesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/discrete1.cc (altnum.1): file discrete1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-03 Tuesday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.32), expected_int16 (1.7),
+	  expected_int16_a (1.7), expected_int32 (1.8), expected_int32_a
+	  (1.8), expected_int64 (1.8), expected_int64_a (1.8),
+	  expected_int8 (1.7), expected_int8_a (1.6), expected_mpz (1.9),
+	  expected_mpz_a (1.9): Do not lie anymore: write on the expected*
+	  files a faithful indication of the command being executed.
+
+2006-10-03 Tuesday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: Makefile.am (1.9),
+	  ppl_interface_generator_predicate_check_code.m4 (1.4),
+	  ppl_interface_generator_predicate_check_extra_code (1.1),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.3): The extra
+	  test code moved to a separate "extra_code" file.  Before the
+	  m4_include for this file, the quote characters are changed to
+	  @<<@ and @>>@ and then restored back to the original ` and '
+	  after the include.  This allows the inclusion of quote characters
+	  in the Prolog code in the "extra_code" file.
+
+	  Makefile.am modified so that in the interfaces/Prolog/tests
+	  directory "make" creates the Prolog test program
+	  "ppl_predicate_check.pl".
+
+2006-10-03 Tuesday 00:20  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.21), MIP_Problem.defs.hh (1.16):
+	  Performance of the heuristic method improved: an equality
+	  constraint is an `active constraint' by definition.
+
+2006-10-02 Monday 21:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.37): Previous commit for
+	  this file reversed and test file restored.
+
+2006-10-02 Monday 21:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: pl_check.pl (1.36),
+	  ppl_interface_generator_predicate_check_code.m4 (1.3): Corrected
+	  a few typos.
+
+2006-10-02 Monday 19:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (1.6): Corrected an
+	  m4 macro call.
+
+2006-10-02 Monday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.20): Comments revised.
+
+2006-10-02 Monday 18:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Makefile.am (1.17),
+	  ppl_interface_generator_common.m4 (1.5): Two more changes made
+	  for the change to the m4 builtins.
+
+2006-10-02 Monday 17:45  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.19), MIP_Problem.defs.hh (1.15): Added a
+	  new heuristic that selects a branching variable when a
+	  MIP_Problem feasibility has to be proofed.  Modified the
+	  prototype for `is_satisfied' to allow the checking of `active
+	  constraints'.  The new heuristic is turned on by default.
+
+2006-10-02 Monday 17:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.6),
+	  ppl_interface_generator_c_h.m4 (1.6): Fixed a couple of bugs
+	  where the m4 builtin had not been revised to m4_builtin.
+
+2006-10-02 Monday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.16): Skip the OCaml directory, for the
+	  time being.
+
+2006-10-02 Monday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.52), Polyhedron/dualhypercubes.cc (1.10):
+	  Test Polyhedron/dualhypercubes.cc fails on 64 bits checked
+	  integers when assertions are turned on.
+
+2006-10-02 Monday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/Makefile.am (1.26),
+	  C/ppl_interface_generator_c_h.m4 (1.5), Prolog/Makefile.am
+	  (1.32), Prolog/Ciao/Makefile.am (1.57), Prolog/GNU/Makefile.am
+	  (1.56), Prolog/SICStus/Makefile.am (1.70), Prolog/SWI/Makefile.am
+	  (1.63), Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.4),
+	  Prolog/XSB/Makefile.am (1.43), Prolog/YAP/Makefile.am (1.46):
+	  Corrections where some builtins for m4 were not changed as
+	  required.  The Makefile.am files now have m4 --prefix-builtin in
+	  the m4 commands.
+
+2006-10-02 Monday 16:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/:
+	  Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.2),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.2),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.2):
+	  Changed these interface_generator files for the test code to
+	  require the m4 command to include --prefix-builtin.
+
+2006-10-02 Monday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (altnum.1): file
+	  ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+	  branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-02 Monday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (octagons.1): file
+	  ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+	  branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (altnum.1): file ppl_interface_generator_ciao_pl.m4 was added on
+	  branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (octagons.1): file ppl_interface_generator_ciao_pl.m4 was added
+	  on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (altnum.1): file ppl_interface_generator_gprolog_pl.m4 was added
+	  on branch altnum on 2006-10-29 19:27:02 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (octagons.1): file ppl_interface_generator_gprolog_pl.m4 was
+	  added on branch octagons on 2006-11-18 20:36:47 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (altnum.1): file ppl_interface_generator_xsb_predicate_check_P.m4
+	  was added on branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (octagons.1): file
+	  ppl_interface_generator_xsb_predicate_check_P.m4 was added on
+	  branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-02 Monday 16:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.4),
+	  ppl_interface_generator_common_dat.m4 (1.5),
+	  C/ppl_interface_generator_c_cc.m4 (1.3),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.5),
+	  C/ppl_interface_generator_c_dat.m4 (1.5),
+	  C/ppl_interface_generator_c_h.m4 (1.4),
+	  C/ppl_interface_generator_c_h_code.m4 (1.4),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.7),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.10),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.4),
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.3),
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.3),
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.3),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.3),
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.3),
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.3),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.2), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.3):
+	  Changed all the built-ins for the m4 code for generating the
+	  interfaces from builtin to m4_builtin.  Note that the built-in
+	  dnl is unchanged; instead, I have added define(`dnl', `m4_dnl')
+	  at the start of the main files.
+
+2006-10-02 Monday 14:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/:
+	  Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.1),
+	  XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.1),
+	  tests/pl_check.pl (1.35),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.1),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.1):
+	  interface generator code for generating a test file for all
+	  predicates for  all the required classes.
+
+2006-10-02 Monday 14:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.3): Comments
+	  corrected and allow for a default code that is needed for the
+	  tests.
+
+2006-10-02 Monday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.241): Generate the Grid interfaces by default.
+
+2006-10-02 Monday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.15), OCaml/ppl_ocaml.cc (1.6),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.9): Fixed
+	  the generalized image predicated for Grid.
+
+2006-10-02 Monday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.6),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.8): Corrected the
+	  interfacing of Grid::generalized_affine_[pre]image*.
+
+2006-10-02 Monday 10:56  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.30): Improved the method:
+	  BD_Shape::is_disjoint_from(const BD_Shape& y).
+
+2006-10-02 Monday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.7), ppl_interface_generator_prolog_icc_preamble (1.9):
+	  term_to_relation_symbol() revised.
+
+2006-10-01 Sunday 22:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.8): Corrected order of arguments in
+	  ppl_new_LP_Problem_from_space_dimension/2.
+
+2006-10-01 Sunday 22:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.34): Define aux predicate
+	  clean_ppl_new_LP_Problem_from_space_dimension/2.
+
+2006-10-01 Sunday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.6), ppl_interface_generator_prolog_icc_preamble (1.7): Severa
+	  FIXMEs dealt with.
+
+2006-10-01 Sunday 20:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.23),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.5),
+	  ppl_interface_generator_prolog_icc_preamble (1.6): Most
+	  predicates now raise meaningful exceptions.
+
+2006-10-01 Sunday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.22),
+	  ppl_interface_generator_prolog_icc_preamble (1.5): Class
+	  PPL_integer_out_of_range revised.
+
+2006-10-01 Sunday 17:19  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.4): Test also
+	  `std::set_intersection' and `std::set_difference'.
+
+2006-10-01 Sunday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.5),
+	  ppl_interface_generator_prolog_icc_preamble (1.4): LP_Problem
+	  interface updated.
+
+2006-10-01 Sunday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.21),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.4),
+	  ppl_interface_generator_prolog_icc_preamble (1.3): Started
+	  improving the Prolog interface error reporting mechanisms.  Fixed
+	  several copy-and-paste mistakes in the support for grids.
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.5), ppl_ocaml.mli (1.4),
+	  test1.ml (1.4): Sample code to support building polyhedra from
+	  OCaml.
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.mli (altnum.1): file ppl_ocaml.mli was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.mli (octagons.1): file ppl_ocaml.mli
+	  was added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/test1.ml (altnum.1): file test1.ml was added on
+	  branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/test1.ml (octagons.1): file test1.ml was added
+	  on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-01 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.4), ppl_ocaml.mli (1.3),
+	  test1.ml (1.3): build_Constraint_System() and
+	  build_Generator_System() rewritten.
+
+2006-09-30 Saturday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.3): Support the building of
+	  constraint and generator systems.
+
+2006-09-30 Saturday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.2), ppl_ocaml.mli (1.2),
+	  test1.ml (1.2): Support the building of constraints and
+	  generators.
+
+2006-09-30 Saturday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.13), ppl_ocaml.cc (1.1),
+	  ppl_ocaml.mli (1.1), test1.ml (1.1): Initial steps for the OCaml
+	  interface.
+
+2006-09-30 Saturday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.4):
+	  Corrected trivial bug (missing commas) whereby the C interface
+	  code was not generated for several methods.
+
+2006-09-30 Saturday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (1.4): Minor
+	  improvements: methods not available for BDS are neither avaiable
+	  for Octagonal shapes.
+
+2006-09-30 Saturday 16:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.11), Octagonal_Shape.inlines.hh
+	  (1.8), Octagonal_Shape.templates.hh (1.23): Added methods
+	  shrink_bounding_box() and topological_closure_assign().
+
+2006-09-30 Saturday 16:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.29): Corrected a bug in
+	  shrink_bounding_box.
+
+2006-09-30 Saturday 15:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.4):
+	  BD_Shape now have the generalized (pre-) images methods.
+
+2006-09-30 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.240): Do not invoke AM_PROG_GCJ.
+
+2006-09-30 Saturday 13:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (1.3):
+	  Distribute the output functions in the corresponding group
+	  depending on the interfaced PPL entity.
+
+2006-09-30 Saturday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (1.3): Corrected
+	  simple bug in the generation of documentation grouping.
+
+2006-09-29 Friday 23:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.4),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.3),
+	  C/ppl_interface_generator_c_dat.m4 (1.3),
+	  C/ppl_interface_generator_c_h_code.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.3): Replaced
+	  pattern "is_ at STATE@ by "@HAS_PROPERTY@ and added replacement
+	  "contains_integer_point" for this pattern.  A comment corrected.
+
+2006-09-29 Friday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.239): Added the infrastructure required to enable
+	  the Java interface.
+
+2006-09-29 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.238): Added the infrastructure required to enable
+	  the OCaml interface.
+
+2006-09-29 Friday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (1.3): Show how
+	  std::set_union() should be used.
+
+2006-09-29 Friday 18:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.101), containsintegerpoint1.cc
+	  (1.1): Added a test for Polyhedron::contains_integer_point().
+
+2006-09-29 Friday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-09-29 Friday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:37:00 +0000
+
+2006-09-29 Friday 18:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.3):
+	  Polyhedra_Powerset renamed as Pointset_Powerset.
+
+2006-09-29 Friday 16:01  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.2): Fixed a typo.
+
+2006-09-29 Friday 16:00  Andrea Cimino
+
+	* tests/Polyhedron/: Makefile.am (1.100), variablesset1.cc (1.1):
+	  Added some tests for the Variables_Set class.  Remeber also to
+	  test set_union(), set_difference()...
+
+2006-09-29 Friday 14:19  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.22),
+	  tests/Octagonal_Shape/Makefile.am (1.5),
+	  tests/Octagonal_Shape/disjoint1.cc (1.1): Added the method
+	  bool Octagonal_Shape<T>::is_disjoint_from() and some tests about
+	  it.
+
+2006-09-29 Friday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: foldspacedims2.cc (1.13), membytes1.cc (1.12):
+	  Adjusted tests that no longer fail with 8-bit coefficients.
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.237), instchk.hh (1.6), interfaces/Makefile.am
+	  (1.14), interfaces/ppl_interface_generator_common.m4 (1.2),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.2),
+	  interfaces/ppl_interface_generator_copyright (1.2),
+	  interfaces/C/Makefile.am (1.25), interfaces/C/ppl_c.cc (1.158),
+	  interfaces/C/ppl_c_version.h.in (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.2),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.2),
+	  interfaces/Prolog/Makefile.am (1.31),
+	  interfaces/Prolog/exceptions.hh (1.20),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.2), interfaces/Prolog/ppl_prolog.icc (1.181),
+	  interfaces/Prolog/Ciao/Makefile.am (1.56),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.93),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.2),
+	  interfaces/Prolog/GNU/Makefile.am (1.55),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.62),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.2), interfaces/Prolog/SICStus/Makefile.am (1.69),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.2), interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.97),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.8),
+	  interfaces/Prolog/SWI/Makefile.am (1.62),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.2), interfaces/Prolog/SWI/ppl_swiprolog.cc (1.127),
+	  interfaces/Prolog/SWI/swi_cfli.cc (1.2),
+	  interfaces/Prolog/SWI/swi_cfli.h (1.2),
+	  interfaces/Prolog/SWI/swi_cfli.ic (1.2),
+	  interfaces/Prolog/XSB/Makefile.am (1.42),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.2),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.51),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.93),
+	  interfaces/Prolog/YAP/Makefile.am (1.45),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.2),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.121),
+	  interfaces/Prolog/YAP/yap_cfli.cc (1.2),
+	  interfaces/Prolog/YAP/yap_cfli.h (1.2),
+	  interfaces/Prolog/YAP/yap_cfli.ic (1.2),
+	  interfaces/Prolog/tests/Makefile.am (1.8),
+	  interfaces/Prolog/tests/pl_check.pl (1.33),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.2),
+	  src/BD_Shape.defs.hh (1.81), src/BD_Shape.inlines.hh (1.133),
+	  src/BD_Shape.templates.hh (1.28): The `interfaces' branch has
+	  been merged to the main trunk.  The branch has now to be
+	  considered closed.
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (altnum.1): file instchk.hh was added on branch altnum
+	  on 2006-10-29 19:26:46 +0000
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_copyright (altnum.1): file
+	  ppl_interface_generator_copyright was added on branch altnum on
+	  2006-10-29 19:26:57 +0000
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_copyright (octagons.1): file
+	  ppl_interface_generator_copyright was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-09-29 Friday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (interfaces.5): Temporarily disable
+	  the YAP interface.
+
+2006-09-29 Friday 11:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc.m4,
+	  ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_h.m4,
+	  ppl_interface_generator_c_h_preamble (interfaces.[7,6,7,7]):
+	  Added support for interfacing MIP_problem class and for
+	  ascii_dump methods, as done in the main trunk.
+
+2006-09-29 Friday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.cc (interfaces.1): Put under CVS
+	  control.
+
+2006-09-29 Friday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.83): Added a workaround to the
+	  implementation of contains_integer_point(), so as to correctly
+	  handle the case of NNC polyhedra and also avoid a few trivial
+	  cases where the polyhedron is known to be empty.
+
+2006-09-29 Friday 09:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_preamble,
+	  C/ppl_interface_generator_c_h_preamble,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  Prolog/tests/pl_check.pl (interfaces.[5,6,31,5,2]): Updated for
+	  changes from the Trunk.  Now C and Prolog interfaces compile with
+	  the "Polyhedron" for the --enable-instantiation.  Only SICStus
+	  and SWI Prolog interfaces tested.
+
+2006-09-29 Friday 00:42  Andrea Cimino
+
+	* src/: LP_Problem.defs.hh (1.26), MIP_Problem.defs.hh (1.14):
+	  Other doxygen comments fixed.
+
+2006-09-28 Thursday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, INSTALL, NEWS, STANDARDS, TODO, config.guess,
+	  config.sub, configure.ac, install-sh, instchk.hh, missing,
+	  mkinstalldirs, Watchdog/ChangeLog, Watchdog/INSTALL,
+	  Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	  Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/Handler.defs.hh,
+	  Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/ppl-config.1,
+	  doc/ppl-config_extra_man_text, doc/ppl_lcdd.1,
+	  doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/pl_check.pl, src/Any_Pointset.defs.hh,
+	  src/Any_Pointset.inlines.hh, src/Any_Pointset.types.hh,
+	  src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+	  src/Ask_Tell.templates.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/Generator.cc, src/Generator.defs.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Certificate.cc, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.templates.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/OR_Matrix.templates.hh, src/OR_Matrix.types.hh,
+	  src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Octagonal_Shape.types.hh, src/Og_Status.idefs.hh,
+	  src/Og_Status.inlines.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Pointset_Ask_Tell.cc,
+	  src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.templates.hh, src/Result.defs.hh,
+	  src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/algorithms.hh,
+	  src/checked.inlines.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_numeric_limits.hh, src/conversion.cc,
+	  src/distances.defs.hh, src/distances.inlines.hh,
+	  src/distances.types.hh, src/fpu-ia32.inlines.hh,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/mp_numeric_limits.hh, src/namespaces.hh, tests/BBox.cc,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+	  tests/Makefile.am, tests/Partial_Function.cc, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/print.hh, tests/Ask_Tell/.cvsignore,
+	  tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/disjoint1.cc, tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+	  tests/Grid/Makefile.am, tests/Grid/affineimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload3.cc,
+	  tests/Grid/asciidumpload4.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox2.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/equals1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	  tests/Grid/widening2.cc, tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/maxspacedim.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/bug2.dat, tests/Polyhedron/dualhypercubes.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	  tests/Polyhedron/exceptions3.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/timeelapse1.cc,
+	  utils/timings.cc
+	  (interfaces.[1,1,1,1,1,1,1,1,5,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,2,5,1,1,1,1,1,1,5,1,1,1,1,1,2,2,2,1,1,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,1,1,2,2,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1, [...]
+	  Second merge from main trunk (several compilation errors still to
+	  be fixed).
+
+2006-09-28 Thursday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: ppl_interface_generator_yap_cc.m4,
+	  yap_cfli.h, yap_cfli.ic (interfaces.[4,2,2]): Started a revision
+	  of the YAP interface.
+
+2006-09-28 Thursday 21:06  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (1.25): Other little English inaccuracy
+	  fixed.
+
+2006-09-28 Thursday 21:03  Andrea Cimino
+
+	* src/: LP_Problem.cc (1.36), LP_Problem.defs.hh (1.24),
+	  MIP_Problem.cc (1.18), MIP_Problem.defs.hh (1.13): Some English
+	  inaccuracies fixed.  Properly renamed also `unsplit()' to
+	  `merge_split_variables()'.
+
+2006-09-28 Thursday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (interfaces.1): file MIP_Problem.cc was added
+	  on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-28 Thursday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (interfaces.1): file MIP_Problem.defs.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-28 Thursday 17:21  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.49), disjoint1.cc (1.1): Added
+	  new tests on the method BD_Shape::is_disjoint_from(y).
+
+2006-09-28 Thursday 17:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (interfaces.1): file disjoint1.cc was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 17:19  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.27): Defined the method:
+	  BD_Shape::is_disjoint_from(const BD_Shape& y).
+
+2006-09-28 Thursday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.12): test01() never fails.
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:27 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffineimage1.cc (interfaces.1): file
+	  boundedaffineimage1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffineimage1.cc (octagons.1): file
+	  boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:27 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (interfaces.1): file
+	  boundedaffinepreimage1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (octagons.1): file
+	  boundedaffinepreimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-28 Thursday 14:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.35), src/Grid_public.cc (1.42),
+	  tests/Grid/Makefile.am (1.42), tests/Grid/boundedaffineimage1.cc
+	  (1.1), tests/Grid/boundedaffinepreimage1.cc (1.1): Added methods
+	  bounded_affine_image() and bounded_affine_preimage() for Grids
+	  and tests to test them.
+
+2006-09-28 Thursday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.11): Print also known_result
+	  in test01().
+
+2006-09-28 Thursday 11:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.defs.hh (1.32): Removed annoying trailing
+	  whitespace.
+
+2006-09-28 Thursday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/membytes1.cc (1.11): test02() should never fail.
+
+2006-09-28 Thursday 06:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (1.4): Disable valgrind
+	  checking.
+
+2006-09-28 Thursday 06:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (interfaces.1): file
+	  Makefile.am was added on branch interfaces on 2006-09-28 20:46:32
+	  +0000
+
+2006-09-27 Wednesday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.48): Disable valgrind checking.
+
+2006-09-27 Wednesday 18:45  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.17), MIP_Problem.defs.hh (1.12):
+	  solve_mip() and is_mip_satisfiable() declared static.  Avoided a
+	  lot of copies involed when a mip problem has to be solved /
+	  checked for satisfiability. Added a sketch of code in OK() that
+	  has to proof the satisfiability of a solution found that is
+	  constrained to have integer coefficients.
+
+2006-09-27 Wednesday 16:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.34), src/Grid_public.cc (1.41),
+	  tests/Grid/Makefile.am (1.41),
+	  tests/Grid/generalizedaffineimage3.cc (1.1),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.1): Added an
+	  implementation for generalizedaffineimage() and
+	  generalizedaffinepreimage() in the case that resym is not EQUAL.
+	  Added tests to test this.
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (altnum.1): file
+	  generalizedaffineimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (interfaces.1): file
+	  generalizedaffineimage3.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (octagons.1): file
+	  generalizedaffineimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (altnum.1): file
+	  generalizedaffinepreimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (interfaces.1): file
+	  generalizedaffinepreimage3.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (octagons.1): file
+	  generalizedaffinepreimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-26 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.8), interfaces/C/Makefile.am (1.24),
+	  interfaces/Prolog/SWI/Makefile.am (1.61),
+	  tests/BD_Shape/Makefile.am (1.47),
+	  tests/Octagonal_Shape/Makefile.am (1.3): Typos fixed.
+
+2006-09-26 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/: EList.defs.hh (1.4), Handler.defs.hh (1.3),
+	  Pending_Element.defs.hh (1.3), Watchdog.cc (1.4),
+	  Watchdog.defs.hh (1.3): Comments improved.
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList.defs.hh (altnum.1): file EList.defs.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Handler.defs.hh (altnum.1): file Handler.defs.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.defs.hh (altnum.1): file
+	  Pending_Element.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc (altnum.1): file Watchdog.cc was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh (altnum.1): file Watchdog.defs.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 19:07  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.53): Fixed a bug in
+	  `maybe_check_results': no_optimization flag was not properly
+	  handled.
+
+2006-09-26 Tuesday 18:56  Andrea Cimino
+
+	* src/MIP_Problem.inlines.hh (1.10): Copy operator fixed.
+
+2006-09-26 Tuesday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (interfaces.1): file
+	  MIP_Problem.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-26 Tuesday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.82): In method OK(), do not attempt
+	  minimizing the constraint description, unless the constraints are
+	  claimed to be already minimized (so as to check for the
+	  correctness of the claim) or if explicitly required to check for
+	  emptyness.
+
+2006-09-26 Tuesday 15:16  quartieri
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (1.2): Added some
+	  tests on the method bool
+	  Octagonal_Shape<T>::contains_integer_point() const.
+
+2006-09-26 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-26 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (interfaces.1):
+	  file containsintegerpoint1.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-26 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-26 Tuesday 10:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage2.cc (1.9), generalizedaffineimage1.cc
+	  (1.11), generalizedaffineimage2.cc (1.10),
+	  generalizedaffinepreimage1.cc (1.13),
+	  generalizedaffinepreimage2.cc (1.13): Updated for the revisions
+	  to the methods generalized_affine_image() and
+	  generalized_affine_preimage().
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (altnum.1): file affineimage2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage1.cc (altnum.1): file
+	  generalizedaffineimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage2.cc (altnum.1): file
+	  generalizedaffineimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage1.cc (altnum.1): file
+	  generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage2.cc (altnum.1): file
+	  generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.33), Grid_public.cc (1.40): Revised
+	  generalized_affime_image() and generalized_affime_preimage() for
+	  the Grid domain to include the relation symbol.  Current version
+	  only handles the case when this is EQUAL which also denotes a
+	  congruence relation.	The default value for the modulus is now
+	  zero.
+
+2006-09-26 Tuesday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.5): Debugging declarations commented
+	  out.
+
+2006-09-26 Tuesday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (interfaces.1): file
+	  Any_Pointset.defs.hh was added on branch interfaces on 2006-09-28
+	  20:46:28 +0000
+
+2006-09-26 Tuesday 10:21  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.31), ppl_lpsol.c (1.52):
+	  ppl_lpsol modified to use the MIP_Problem class instead of
+	  LP_Problem. Now ppl_lpsol can handle also MIP problems optimizing
+	  them and finding feasible points.
+
+2006-09-25 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.4): More methods added.
+
+2006-09-25 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.80), BD_Shape.inlines.hh (1.132),
+	  Octagonal_Shape.defs.hh (1.10), Octagonal_Shape.inlines.hh (1.7):
+	  Added BD_Shape::is_topologically_closed() and
+	  Octagonal_Shape::is_topologically_closed().
+
+2006-09-25 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (interfaces.1): file
+	  Octagonal_Shape.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (interfaces.1): file
+	  Octagonal_Shape.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.79), BD_Shape.templates.hh (1.26),
+	  Octagonal_Shape.defs.hh (1.9), Octagonal_Shape.templates.hh
+	  (1.21): Added declarations and fake implementations of
+	  BD_Shape::is_disjoint_from(),
+	  Octagonal_Shape::is_disjoint_from(), BD_Shape::is_discrete() and
+	  Octagonal_Shape::is_discrete().
+
+2006-09-25 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (interfaces.1): file
+	  Octagonal_Shape.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.80): Comments revised.
+
+2006-09-25 Monday 19:45  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.16): Fixed a bug: if we are solving real
+	  MIP problems, remember to always store a feasible point. This
+	  avoids a bug shown if a problem is unbounded and we are asked for
+	  a feasible point.
+
+2006-09-25 Monday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.157), ppl_c.h.in (1.68): Added
+	  ascii_dump functions to the C interface.
+
+2006-09-25 Monday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.51): Added 'r' to OPTION_LETTERS.
+
+2006-09-25 Monday 11:56  Elena Mazzi
+
+	* tests/BD_Shape/timeelapse1.cc (1.15): Renamed the variables `oc'
+	  with `bd' in many tests.
+
+2006-09-25 Monday 11:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (1.3): Documentation of class
+	  iterator_to_const revised.
+
+2006-09-25 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (altnum.1): file
+	  iterator_to_const.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-25 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (interfaces.1): file
+	  iterator_to_const.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (octagons.1): file
+	  iterator_to_const.defs.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-24 Sunday 23:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.3): Debugging code commented out.
+
+2006-09-24 Sunday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.2): Added more methods to
+	  Any_Pointset and its subclasses.
+
+2006-09-24 Sunday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.11): Declarations of integer variables
+	  get/add methods moved to better places; drafted documentation for
+	  the setting of integer variables.
+
+2006-09-24 Sunday 21:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.50): Optimization modes are
+	  specified at library level, not inside LP_Problem class.
+
+2006-09-24 Sunday 21:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.156), ppl_c.h.in (1.67): First draft
+	  at interfacing class MIP_Problem.
+
+2006-09-24 Sunday 18:07  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.15): If we add integer space dimensions to
+	  an unsatisfiable problem, it remains unsatisfiable.
+
+2006-09-24 Sunday 18:00  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.14): set_integer_space_dimensions() now
+	  throws a valid error message.
+
+2006-09-24 Sunday 17:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.20): Use
+	  is_additive_inverse() to improve readability in several places.
+	  Used is_even() in tight_coherence_would_make_empty().  Corrected
+	  bug in the output operator whereby the output of an octagon
+	  having integer coefficients could have been innacurate (but
+	  correct).
+
+2006-09-24 Sunday 17:56  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.13), MIP_Problem.defs.hh (1.10): void
+	  set_integer_space_dimensions(const Variables_Set& i_vars) defined
+	  and implemented.
+
+2006-09-24 Sunday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.131): Fixed is_even() and
+	  is_additive_inverse() (ROUND_IGNORE evaluates the returned Result
+	  info lazily, that is, it will happily return V_LGE ---a.k.a.
+	  "don't know"--- if returning something more precise costs one
+	  extra clock cycle).
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.1), Any_Pointset.inlines.hh (1.1),
+	  Any_Pointset.types.hh (1.1), Makefile.am (1.161): Started writing
+	  the new Any_Pointset class.
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (altnum.1): file
+	  Any_Pointset.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (interfaces.1): file
+	  Any_Pointset.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (octagons.1): file
+	  Any_Pointset.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (altnum.1): file Any_Pointset.types.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (interfaces.1): file
+	  Any_Pointset.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (octagons.1): file
+	  Any_Pointset.types.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-09-24 Sunday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.198): Added one item.
+
+2006-09-24 Sunday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/max_space_dimension.hh (1.9): Fixed
+	  Parma_Polyhedra_Library::max_space_dimension().
+
+2006-09-24 Sunday 17:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.78), BD_Shape.inlines.hh (1.130),
+	  BD_Shape.templates.hh (1.25), Octagonal_Shape.defs.hh (1.8),
+	  Octagonal_Shape.inlines.hh (1.6), Octagonal_Shape.templates.hh
+	  (1.19): Added declarations and placeholder implementations of
+	  methods total_memory_in_bytes() and external_memory_in_bytes().
+
+2006-09-24 Sunday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.24): Exploited new utility function
+	  is_additive_inverse() to improve readability.
+
+2006-09-24 Sunday 16:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.129): Added utility functions bool
+	  is_even(m) and bool is_additive_inverse(m, n) to namespace
+	  Implementation::BD_Shapes.
+
+2006-09-24 Sunday 14:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (1.11): [no log message]
+
+2006-09-24 Sunday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_widenings.cc (altnum.1): file Grid_widenings.cc was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.39), tests/Grid/containsintegerpoint1.cc
+	  (1.2): Grid::contains_integer_point() fixed.
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:27 +0000
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/containsintegerpoint1.cc (interfaces.1): file
+	  containsintegerpoint1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-24 Sunday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am (1.40), containsintegerpoint1.cc (1.1),
+	  onepoint1.cc (1.2): Test program renamed.  Comment revised.
+
+2006-09-24 Sunday 13:50  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.49): Some improvements when
+	  `no-optimization' is involved.  Now the enumeration solving
+	  method accepts the `no-optimization' parameter. Some fixes in
+	  maybe_check_result(): do not forget that the `no_optimization'
+	  flag exists.
+
+2006-09-24 Sunday 12:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.32), src/Grid.templates.hh (1.20),
+	  src/Grid_public.cc (1.38), tests/Grid/Makefile.am (1.39),
+	  tests/Grid/onepoint1.cc (1.1): Revised comment in
+	  src/Grid.templates.hh Added Grid::contains_integer_point()
+	  method.
+
+2006-09-24 Sunday 12:24  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.12), MIP_Problem.defs.hh (1.9),
+	  MIP_Problem.inlines.hh (1.9): Moved all throwing exceptions
+	  methods from MIP_Problems.inlines.hh to MIP_Problems.cc, removing
+	  the `inline' directive for each method.  Added the method `const
+	  Variables_Set& integer_space_dimensions() const'.
+
+2006-09-24 Sunday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (1.2): New test test04()
+	  shows an inaccuracy of the output procedure when dealing with
+	  octagons having integer coefficients.
+
+2006-09-24 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (altnum.1): file
+	  writeoctagon1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-24 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (interfaces.1): file
+	  writeoctagon1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-24 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (octagons.1): file
+	  writeoctagon1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-24 Sunday 10:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc (1.18), grid2.cc (1.14), widening2.cc
+	  (1.7): Revised comments.
+
+2006-09-24 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid1.cc (altnum.1): file grid1.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid2.cc (altnum.1): file grid2.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening2.cc (altnum.1): file widening2.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.197): The ask-and-tell generic construction has been
+	  reimplemented.
+
+2006-09-24 Sunday 10:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.51): Useless template function
+	  copy_compare() removed.
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.templates.hh (1.18),
+	  Pointset_Ask_Tell.defs.hh (1.5), Pointset_Powerset.defs.hh (1.4),
+	  Polyhedron_public.cc (1.81), Polyhedron_widenings.cc (1.55):
+	  Standardize on tags: CHECKME (with no space), FIXME, and TODO are
+	  the only tags we use.
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (altnum.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (interfaces.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (octagons.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (interfaces.1): file
+	  Pointset_Powerset.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (altnum.1): file append1.cc was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (interfaces.1): file append1.cc was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (octagons.1): file append1.cc was added
+	  on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.defs.hh (1.14), src/Ask_Tell.templates.hh (1.7),
+	  src/Determinate.defs.hh (1.63), src/Determinate.inlines.hh
+	  (1.54), tests/Ask_Tell/append1.cc (1.4):
+	  Ask_Tell::upper_bound_assign() now uses a basic deabsorption
+	  procedure.
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (altnum.1): file Ask_Tell.templates.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (interfaces.1): file
+	  Ask_Tell.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (octagons.1): file
+	  Ask_Tell.templates.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (altnum.1): file contains1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (interfaces.1): file
+	  contains1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (octagons.1): file
+	  contains1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (interfaces.1):
+	  file generalizedaffineimage3.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc
+	  (interfaces.1): file generalizedaffinepreimage2.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearsystem1.cc (altnum.1): file
+	  linearsystem1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bhz03widening1.cc (altnum.1): file bhz03widening1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences2.cc (altnum.1): file congruences2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/equals1.cc (altnum.1): file equals1.cc was added on
+	  branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/foldspacedims1.cc (altnum.1): file foldspacedims1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations3.cc (altnum.1): file relations3.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations3.cc (octagons.1): file relations3.cc was
+	  added on branch octagons on 2006-11-18 20:36:57 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.19),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.47),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.40),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.96),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.126),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.120),
+	  tests/Ask_Tell/append1.cc (1.3),
+	  tests/BD_Shape/addconstraints1.cc (1.15),
+	  tests/BD_Shape/affinepreimage1.cc (1.16),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.17),
+	  tests/Grid/bhz03widening1.cc (1.11), tests/Grid/congruences2.cc
+	  (1.4), tests/Grid/equals1.cc (1.11), tests/Grid/foldspacedims1.cc
+	  (1.10), tests/Grid/grid1.cc (1.17), tests/Grid/relations2.cc
+	  (1.13), tests/Grid/relations3.cc (1.5),
+	  tests/Octagonal_Shape/contains1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.2),
+	  tests/Polyhedron/bhz03widening1.cc (1.12),
+	  tests/Polyhedron/linearsystem1.cc (1.7),
+	  tests/Polyhedron/polyhull1.cc (1.9): Spelling corrections.
+
+2006-09-24 Sunday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.38): Added template <typename PH> void
+	  print_constraints(const Pointset_Ask_Tell<PH>&, const
+	  std::string&, std::ostream&).
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: FCAIBVP.defs.hh (1.2), FCAIBVP.inlines.hh (1.2): Added
+	  methods  void weakening_assign(const FCAIBVP&) and static bool
+	  has_nontrivial_weakening().
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (altnum.1): file FCAIBVP.defs.hh was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (interfaces.1): file FCAIBVP.defs.hh was
+	  added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (altnum.1): file FCAIBVP.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (interfaces.1): file FCAIBVP.inlines.hh
+	  was added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-23 Saturday 23:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.2),
+	  containsintegerpoint1.cc (1.1): Added new test for
+	  Octagonal_Shape::contains_integer_points().
+
+2006-09-23 Saturday 23:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.7), Octagonal_Shape.templates.hh
+	  (1.17): Added new method   bool
+	  Octagonal_Shape::contains_integer_points() const.
+
+2006-09-23 Saturday 22:34  Andrea Cimino
+
+	* src/MIP_Problem.inlines.hh (1.8): Other little formatting
+	  changes.  Removed an useless comment.
+
+2006-09-23 Saturday 22:29  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.11), MIP_Problem.inlines.hh (1.7): Better
+	  handled MIP_Problem `status' to avoid useless computations. Minor
+	  stylistic changes.
+
+2006-09-23 Saturday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.198): Spelling corrections.
+
+2006-09-23 Saturday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.199), STANDARDS (1.35): Spelling corrections.
+
+2006-09-23 Saturday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_widenings.cc (1.54), checked_int.inlines.hh
+	  (1.55): Identifiers improved.
+
+2006-09-23 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.23): Renamed a couple of
+	  identifiers.
+
+2006-09-23 Saturday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.10): Revised the woring of a couple of
+	  comments.
+
+2006-09-23 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.22): Updated.
+
+2006-09-23 Saturday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.31), Grid_conversion.cc (1.17),
+	  Grid_simplify.cc (1.29): Got rid of tracing code that was
+	  cluttering the sources.
+
+2006-09-23 Saturday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_conversion.cc (altnum.1): file Grid_conversion.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc (altnum.1): file Grid_simplify.cc was added
+	  on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 17:53  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.9): Fixed a couple of bugs in
+	  is_mip_satisfiable() and solve_mip().
+
+2006-09-23 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.templates.hh (1.19), Grid_Generator.cc (1.18),
+	  Grid_conversion.cc (1.16), Grid_public.cc (1.37): Use `tmp' to
+	  denote a temporary: neither `tem' nor `temp'.
+
+2006-09-23 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.cc (altnum.1): file Grid_Generator.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.53): Use square brackets for
+	  literature citations.
+
+2006-09-23 Saturday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.48): The command parser now
+	  recognizes the --no-mip (-r) option: this allows to consider
+	  integer variables as real variables.
+
+2006-09-23 Saturday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.198), TODO (1.196), interfaces/C/ppl_c.cc (1.155),
+	  interfaces/C/ppl_c.h.in (1.66),
+	  interfaces/Prolog/Prolog_interface.dox (1.156),
+	  interfaces/Prolog/ppl_prolog.icc (1.180),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.23),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.92),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.95),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.125),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.50),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.92),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.27),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.119), src/BD_Shape.defs.hh
+	  (1.77), src/Polyhedron.defs.hh (1.307): Added C and Prolog
+	  interfaces for Polyhedron::contains_integer_point().
+	  Documentation improved.  Added remainders to NEWS and TODO.
+
+2006-09-23 Saturday 16:01  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.8), MIP_Problem.defs.hh (1.8),
+	  MIP_Problem.inlines.hh (1.6): Implemented is_satisfiable() for
+	  real MIP Problems in a more efficient way.
+
+2006-09-23 Saturday 14:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.22): Minor readability improvements
+	  to contains_integer_point(), as well as correcting a typo
+	  resulting in a bug.
+
+2006-09-23 Saturday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.27), Watchdog/ChangeLog (1.16): Updated.
+
+2006-09-23 Saturday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.35), MIP_Problem.cc (1.7),
+	  Octagonal_Shape.templates.hh (1.16): Avoid unnecessary (and
+	  silly) abbreviations.
+
+2006-09-23 Saturday 13:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.46), containsintegerpoint1.cc
+	  (1.1): Added simple test for method contains_integer_point().
+
+2006-09-23 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-23 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (interfaces.1): file
+	  containsintegerpoint1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-23 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-23 Saturday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.76), BD_Shape.templates.hh (1.21):
+	  Added declaration and tentative implementation of method   bool
+	  BD_Shape<T>::contains_integer_point() const.
+
+2006-09-23 Saturday 13:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.15): Avoid pleonastic
+	  comments.
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.cc (altnum.1): file Congruence.cc was added on
+	  branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (altnum.1): file Congruence_System.cc
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.defs.hh (altnum.1): file
+	  Congruence_System.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (altnum.1): file
+	  Direct_Product.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (octagons.1): file
+	  Direct_Product.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.cc (altnum.1): file Grid_Certificate.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.cc (altnum.1): file
+	  Grid_Generator_System.cc was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.cc (altnum.1): file Grid_Status.cc was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_chdims.cc (altnum.1): file Grid_chdims.cc was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (altnum.1): file Grid_nonpublic.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (interfaces.1): file OR_Matrix.defs.hh was
+	  added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (interfaces.1): file
+	  OR_Matrix.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (altnum.1): file Og_Status.idefs.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (interfaces.1): file Og_Status.idefs.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh (altnum.1): file Og_Status.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh (interfaces.1): file
+	  Og_Status.inlines.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (altnum.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (interfaces.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (octagons.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (interfaces.1): file
+	  Pointset_Powerset.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (altnum.1): file mp_numeric_limits.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/namespaces.hh (altnum.1): file namespaces.hh was added on
+	  branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.14), BD_Shape.cc (1.3),
+	  BD_Shape.defs.hh (1.75), BD_Shape.inlines.hh (1.128),
+	  BD_Shape.templates.hh (1.20), Bounding_Box.defs.hh (1.15),
+	  Checked_Number.defs.hh (1.79), Congruence.cc (1.13),
+	  Congruence.inlines.hh (1.12), Congruence_System.cc (1.20),
+	  Congruence_System.defs.hh (1.16), Constraint_System.cc (1.19),
+	  Constraint_System.defs.hh (1.33), DB_Matrix.defs.hh (1.24),
+	  DB_Matrix.templates.hh (1.2), Direct_Product.inlines.hh (1.26),
+	  Generator_System.cc (1.19), Generator_System.defs.hh (1.20),
+	  Grid.defs.hh (1.30), Grid.templates.hh (1.18),
+	  Grid_Certificate.cc (1.5), Grid_Generator_System.cc (1.15),
+	  Grid_Status.cc (1.5), Grid_chdims.cc (1.13), Grid_conversion.cc
+	  (1.15), Grid_nonpublic.cc (1.20), Grid_public.cc (1.36),
+	  Grid_simplify.cc (1.28), Grid_widenings.cc (1.10), LP_Problem.cc
+	  (1.34), LP_Problem.defs.hh (1.23), Linear_System.cc (1.39),
+	  Linear_System.defs.hh (1.28), MIP_Problem.cc (1.6),
+	  MIP_Problem.defs.hh (1.7), Matrix.cc (1.94), OR_Matrix.defs.hh
+	  (1.5), OR_Matrix.templates.hh (1.3), Octagonal_Shape.defs.hh
+	  (1.6), Octagonal_Shape.templates.hh (1.14), Og_Status.idefs.hh
+	  (1.5), Og_Status.inlines.hh (1.3), Ph_Status.cc (1.11),
+	  Pointset_Ask_Tell.defs.hh (1.4), Pointset_Ask_Tell.templates.hh
+	  (1.6), Pointset_Powerset.defs.hh (1.3),
+	  Pointset_Powerset.templates.hh (1.4), Polyhedron_nonpublic.cc
+	  (1.67), Polyhedron_public.cc (1.80), Powerset.defs.hh (1.28),
+	  Saturation_Matrix.cc (1.10), Saturation_Row.cc (1.11),
+	  Saturation_Row.defs.hh (1.11), checked.inlines.hh (1.32),
+	  checked_int.inlines.hh (1.54), conversion.cc (1.78),
+	  fpu-ia32.inlines.hh (1.14), mp_numeric_limits.hh (1.8),
+	  namespaces.hh (1.9): Fixed lots of spelling mistakes.  Badly
+	  named variables renamed.  Long lines split.  Code formatting
+	  improvements.
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.cc (altnum.1): file BD_Shape.cc was added on branch
+	  altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 12:59  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.5), MIP_Problem.inlines.hh (1.5): Cleaned
+	  solve() method.  Removed a bit of useless code in solve_mip().
+
+2006-09-23 Saturday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.195), src/Polyhedron_public.cc (1.79): A few adjustments
+	  to Polyhedron::contains_integer_point(); currently we cannot
+	  handle the case of strict inequalities.
+
+2006-09-23 Saturday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/membytes1.cc (1.10): test02() fails with 8-bit
+	  coefficients.
+
+2006-09-22 Friday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.14), Ask_Tell.templates.hh (1.6),
+	  Pointset_Ask_Tell.templates.hh (1.5):
+	  Ask_Tell::upper_bound_assign() moved to Ask_Tell.templates.hh.
+	  Restored commented out code in Ask_Tell::OK().  Fixed
+	  Pointset_Ask_Tell::remove_space_dimensions().
+
+2006-09-22 Friday 20:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.306), Polyhedron_public.cc (1.78):
+	  Added a first, tentative implementation of
+	  Polyhedron::contains_integer_point().
+
+2006-09-22 Friday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.4): Formatting fixed.
+
+2006-09-22 Friday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.19), Grid_chdims.cc (1.12),
+	  Octagonal_Shape.templates.hh (1.13), Polyhedron_chdims.cc (1.38):
+	  Use the services provided by Variables_Set.
+
+2006-09-22 Friday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (1.2): Fixed the documentation of
+	  Variables_Set::space_dimension().
+
+2006-09-22 Friday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (altnum.1): file Variables_Set.defs.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-22 Friday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (interfaces.1): file
+	  Variables_Set.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (1.2): Fixed
+	  Variables_Set::space_dimension().
+
+2006-09-22 Friday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (altnum.1): file
+	  Variables_Set.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-09-22 Friday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (interfaces.1): file
+	  Variables_Set.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 17:23  Andrea Cimino
+
+	* src/MIP_Problem.inlines.hh (1.4): Solved a bug in MIP_Problem.
+	  Added some tests for MIP_Problem.
+
+2006-09-22 Friday 16:45  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.3), MIP_Problem.defs.hh (1.6),
+	  MIP_Problem.inlines.hh (1.3): Implemented is_satisfiable for the
+	  `MIP' case.
+
+2006-09-22 Friday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.34): Added a point covering tests programs that
+	  require auxiliary functions.
+
+2006-09-22 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.defs.hh (1.5), MIP_Problem.templates.hh (1.5),
+	  globals.types.hh (1.8): Redundant MIP_Problem constructor
+	  removed.  Removed also the Variables_Integrality enumeration.
+
+2006-09-22 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (interfaces.1): file
+	  MIP_Problem.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (altnum.1): file globals.types.hh was added
+	  on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-22 Friday 15:41  Elena Mazzi
+
+	* tests/BD_Shape/mapspacedims1.cc (1.13): Rewritten test04 using
+	  the method BD_Shape::minimized_constraints().
+
+2006-09-22 Friday 15:40  Elena Mazzi
+
+	* tests/BD_Shape/universe1.cc (1.13): Added two new tests on the
+	  method BD_Shape::is_universe().
+
+2006-09-22 Friday 15:39  Elena Mazzi
+
+	* tests/BD_Shape/removespacedims1.cc (1.16): Added two new tests on
+	  the method BD_Shape::remove_space_dimensions() and
+	  BD_Shape::remove_higher_space_dimensions().
+
+2006-09-22 Friday 15:38  Elena Mazzi
+
+	* tests/BD_Shape/intersection1.cc (1.15): Added two new tests on
+	  the method BD_Shape::intersection_assign().
+
+2006-09-22 Friday 15:36  Elena Mazzi
+
+	* tests/BD_Shape/contains1.cc (1.13): Added two new tests on the
+	  method BD_Shape::contains().
+
+2006-09-22 Friday 15:34  Elena Mazzi
+
+	* tests/BD_Shape/bdshull1.cc (1.12): Added new test on the method
+	  BD_Shape::bds_hull_assign_and_minimize().
+
+2006-09-22 Friday 15:33  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.2): Added a first implementation that
+	  handles MIP_Problems.
+
+2006-09-22 Friday 15:33  Elena Mazzi
+
+	* tests/BD_Shape/addspacedims1.cc (1.13): Added new two tests on
+	  the methods BD_Shape::add_space_dimensions_and_project() and
+	  BD_Shape::add_space_dimensions_and_embed().
+
+2006-09-22 Friday 15:28  Andrea Cimino
+
+	* src/: MIP_Problem.defs.hh (1.4), MIP_Problem.inlines.hh (1.2),
+	  MIP_Problem.templates.hh (1.4): Added a first implementation that
+	  handles MIP_Problems.
+
+2006-09-22 Friday 14:25  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.5): Removed a redundant
+	  assertion 'assertion(OK())' in	  inline void
+	  Octagonal_Shape<T>::add_constraints().
+
+2006-09-22 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.10): Useless stuff removed.
+	  Test more classes.
+
+2006-09-22 Friday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matrix1.cc (altnum.1): file matrix1.cc was added
+	  on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-09-22 Friday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matrix1.cc (1.8): test01() made self-contained.
+
+2006-09-22 Friday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.99), membytes1.cc (1.9),
+	  membytes2.cc (1.8): Made membytes1.cc conformant to the PPL
+	  standards.  The test formerly in membytes2.cc is now test02() in
+	  membytes1.cc.
+
+2006-09-22 Friday 13:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (1.2): Restored a few access
+	  restrictions; added corresponding friend declarations.
+
+2006-09-22 Friday 12:57  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.4): Removed a redundant
+	  assertion 'assert(OK())' in the constructor inline
+	  Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs).
+
+2006-09-22 Friday 12:06  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.12): Removed a redundant
+	  assertion 'assert(OK())' from the method	   void
+	  Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-09-22 Friday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ciao_pl_check.pl (1.22), ppl_ciao.pl
+	  (1.91): Corrected a few typos.
+
+2006-09-22 Friday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.98): XFAIL_WITH_INT8 no longer
+	  includes membytes1.
+
+2006-09-22 Friday 11:16  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.11): Removed a redundant
+	  assertion 'assert(OK())' from the method	   void
+	  Octagonal_Shape<T>::generalized_affine_image().
+
+2006-09-22 Friday 08:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Ask_Tell.inlines.hh (1.13): Avoid redundant template
+	  parameter specifications.
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.74), BD_Shape.templates.hh (1.18),
+	  Direct_Product.defs.hh (1.29), Direct_Product.inlines.hh (1.25),
+	  Grid.defs.hh (1.29), Grid_Generator_System.cc (1.14),
+	  Grid_Generator_System.defs.hh (1.19), Grid_chdims.cc (1.11),
+	  MIP_Problem.defs.hh (1.3), MIP_Problem.templates.hh (1.3),
+	  Makefile.am (1.160), Octagonal_Shape.defs.hh (1.5),
+	  Pointset_Ask_Tell.defs.hh (1.3), Pointset_Ask_Tell.templates.hh
+	  (1.4), Pointset_Powerset.defs.hh (1.2),
+	  Pointset_Powerset.templates.hh (1.3), Polyhedron.defs.hh (1.305),
+	  Polyhedron_chdims.cc (1.37), Variable.cc (1.21), Variable.defs.hh
+	  (1.52), Variables_Set.cc (1.1), Variables_Set.defs.hh (1.1),
+	  Variables_Set.inlines.hh (1.1), Variables_Set.types.hh (1.1):
+	  Variables_Set is now a fully fledged class.
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (altnum.1): file
+	  Direct_Product.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (octagons.1): file
+	  Direct_Product.defs.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.defs.hh (altnum.1): file
+	  Grid_Generator_System.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (altnum.1): file Variables_Set.cc was added
+	  on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (interfaces.1): file Variables_Set.cc was
+	  added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (altnum.1): file
+	  Variables_Set.types.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (interfaces.1): file
+	  Variables_Set.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (octagons.1): file
+	  Variables_Set.types.hh was added on branch octagons on 2006-11-18
+	  20:36:51 +0000
+
+2006-09-21 Thursday 17:48  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.127), BD_Shape.templates.hh (1.17):
+	  Moved some assertions 'assert(OK())' where they are really needed
+	  in the methods:  - void BD_Shape<T>::affine_preimage();  -
+	  BD_Shape(const dimension_type num_dimensions,       const
+	  Degenerate_Element kind).
+
+2006-09-21 Thursday 16:34  Elena Mazzi
+
+	* src/BD_Shape.inlines.hh (1.126): Removed a useless assertion
+	  'assert(OK())' from the method inline void
+	  BD_Shape<T>::add_dbm_constraint().
+
+2006-09-21 Thursday 16:05  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.10): Moved some assertions
+	  'assert(OK())' where they are needed in the method
+	  void Octagonal_Shape<T>::affine_preimage().
+
+2006-09-21 Thursday 15:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.defs.hh (1.2), MIP_Problem.templates.hh (1.2):
+	  Class documentation revised.	Added two new constructors: one
+	  takes a set of variables that are constrained to take an integer
+	  value; the other takes a shorthand concerning the integrality of
+	  all or no variables.
+
+2006-09-21 Thursday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (1.7): New enumeration Variables_Integrality
+	  encodes assertions concerning the integrality of a set of
+	  variables.
+
+2006-09-21 Thursday 15:26  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.3): Removed a useless assertion
+	  'assert(OK())' from the method       inline void
+	  Octagonal_Shape<T>::add_octagonal_constraint().
+
+2006-09-21 Thursday 14:45  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.9): Removed a redundant
+	  assertion 'assert(OK())' from the method     void
+	  Octagonal_Shape<T>::limited_BHMZ05_extrapolation_assign().
+
+2006-09-21 Thursday 14:04  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.8): Removed a redundant
+	  assertion 'assert(OK())' from the method	void
+	  Octagonal_Shape<T>::limited_CC76_extrapolation_assign().
+
+2006-09-21 Thursday 13:50  Andrea Cimino
+
+	* tests/Polyhedron/membytes1.cc (1.8): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 13:44  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (1.22): Fixed some typos in the
+	  documentation, thanks to Sebastian Pop.
+
+2006-09-21 Thursday 13:28  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.7): Removed a redundant
+	  assertion 'assert(OK())' from the method		void
+	  Octagonal_Shape<T>::map_space_dimensions().
+
+2006-09-21 Thursday 13:19  Andrea Cimino
+
+	* tests/Polyhedron/maxspacedim1.cc (1.9): Modified to be compliant
+	  to the new standards.
+
+2006-09-21 Thursday 13:16  Andrea Cimino
+
+	* tests/Polyhedron/matrix1.cc (1.7): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 13:11  Andrea Cimino
+
+	* tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.7): Modified
+	  to be compliant to the new standards.
+
+2006-09-21 Thursday 13:08  Andrea Cimino
+
+	* tests/Polyhedron/append2.cc (1.8): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 13:04  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.125), BD_Shape.templates.hh (1.16):
+	  Removed some redundant assertions `assert(OK())' from:  -
+	  concatenate_assign();  - map_space_dimensions();  -
+	  limited_CC76_extrapolation_assign();	-
+	  limited_BHMZ05_extrapolation_assign();  -
+	  generalized_affine_image();  - generalized_affine_preimage();  -
+	  BD_Shape(const Generator_System& gs);  - BD_Shape(const
+	  Constraint_System& cs).
+
+2006-09-21 Thursday 12:55  Andrea Cimino
+
+	* tests/Polyhedron/append1.cc (1.9): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 12:45  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.6): Removed a redundant
+	  assertion 'assert(OK())' from the method	   void
+	  Octagonal_Shape<T>::concatenate_assign().
+
+2006-09-21 Thursday 12:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.5): Removed a redundant
+	  assertion 'assert(OK())' from the constructor
+	  Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs).
+
+2006-09-21 Thursday 11:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: MIP_Problem.cc (1.1), MIP_Problem.defs.hh (1.1),
+	  MIP_Problem.inlines.hh (1.1), MIP_Problem.templates.hh (1.1),
+	  MIP_Problem.types.hh (1.1), Makefile.am (1.159): MIP_Problem
+	  files put under CVS control.
+
+2006-09-21 Thursday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (altnum.1): file MIP_Problem.types.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-21 Thursday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (interfaces.1): file
+	  MIP_Problem.types.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-21 Thursday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (octagons.1): file MIP_Problem.types.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-09-21 Thursday 11:24  Andrea Cimino
+
+	* tests/Polyhedron/exceptions3.cc (1.9): Made exceptions3.cc more
+	  compliant to the new test policy.
+
+2006-09-21 Thursday 11:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.21): LP_Problem now only depends on the
+	  name of class Constraint_System.
+
+2006-09-21 Thursday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.32): Removed useless friend
+	  declaration.
+
+2006-09-21 Thursday 11:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (1.2): Corrected a couple of
+	  Doxygen \relates commands.
+
+2006-09-21 Thursday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (altnum.1): file
+	  iterator_to_const.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-21 Thursday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (interfaces.1): file
+	  iterator_to_const.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (octagons.1): file
+	  iterator_to_const.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-21 Thursday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.defs.hh (1.31): Avoid useless inclusion.
+
+2006-09-21 Thursday 11:12  Andrea Cimino
+
+	* tests/Polyhedron/exceptions2.cc (1.10): Made exceptions2.cc more
+	  compliant to the new test policy.
+
+2006-09-21 Thursday 10:46  Andrea Cimino
+
+	* tests/Polyhedron/exceptions1.cc (1.11): The exceptions tests are
+	  now more consistent to what defined in STANDARDS.
+
+2006-09-21 Thursday 10:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.76), devref.doxyconf-latex.in
+	  (1.15): Let iterator_to_const.*, Ask_Tell.* and
+	  Pointset_Ask_Tell.* files participate to the generation of the
+	  devref manuals.
+
+2006-09-21 Thursday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.20): A few further improvements to the
+	  devref documentation.
+
+2006-09-21 Thursday 10:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.19): Do not let the user assume that we
+	  solve the LP Problem by using a fixed algorithm (future releases
+	  may use a different one).
+
+2006-09-21 Thursday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.18): Corrected documentation for
+	  add_constraints.
+
+2006-09-21 Thursday 09:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.17): A few improvements to the
+	  documentation.  Declare the std::swap specialization before
+	  defining it.
+
+2006-09-21 Thursday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.defs.hh (1.2),
+	  Pointset_Ask_Tell.templates.hh (1.3): Unwanted stuff removed.
+
+2006-09-21 Thursday 07:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.16): Dratfed some initial user
+	  documentation for LP_Problem.
+
+2006-09-20 Wednesday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.12), Ask_Tell.templates.hh (1.5),
+	  Pointset_Ask_Tell.templates.hh (1.2): Implemented
+	  Ask_Tell::empty(), Pointset_Ask_Tell::concatenate_assign(),
+	  Pointset_Ask_Tell::remove_space_dimensions() and
+	  Pointset_Ask_Tell::remove_higher_space_dimensions().
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (altnum.1): file powerset1.cc was
+	  added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.12), FCAIBVP.cc (1.1), FCAIBVP.defs.hh (1.1),
+	  FCAIBVP.inlines.hh (1.1), FCAIBVP.types.hh (1.1), Makefile.am
+	  (1.258), Partial_Function.cc (1.3), ppl_test.hh (1.50),
+	  Ask_Tell/append1.cc (1.2), Polyhedron/powerset1.cc (1.18): New
+	  test class FCAIBVP used to factorize some common code.  Missing
+	  inclusions added.
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (altnum.1): file FCAIBVP.cc was added on branch
+	  altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (interfaces.1): file FCAIBVP.cc was added on
+	  branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (altnum.1): file FCAIBVP.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (interfaces.1): file FCAIBVP.types.hh was
+	  added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (octagons.1): file FCAIBVP.types.hh was
+	  added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.cc (altnum.1): file Partial_Function.cc
+	  was added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (altnum.1): file .cvsignore was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (interfaces.1): file .cvsignore was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (octagons.1): file .cvsignore was added
+	  on branch octagons on 2006-11-18 20:36:55 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (simplex.1): file .cvsignore was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (interfaces.1): file Makefile.am was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (octagons.1): file Makefile.am was
+	  added on branch octagons on 2006-11-18 20:36:55 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (altnum.1): file Pointset_Ask_Tell.cc
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (interfaces.1): file
+	  Pointset_Ask_Tell.cc was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (octagons.1): file Pointset_Ask_Tell.cc
+	  was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (altnum.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (interfaces.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (octagons.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (altnum.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (interfaces.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (octagons.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (altnum.1): file Pointset_Powerset.cc
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (interfaces.1): file
+	  Pointset_Powerset.cc was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (interfaces.1): file
+	  Pointset_Powerset.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (altnum.1): file
+	  iterator_to_const.types.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (interfaces.1): file
+	  iterator_to_const.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (octagons.1): file
+	  iterator_to_const.types.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.197), configure.ac (1.236), src/Ask_Tell.defs.hh (1.13),
+	  src/Ask_Tell.templates.hh (1.4), src/Makefile.am (1.158),
+	  src/Pointset_Ask_Tell.cc (1.1), src/Pointset_Ask_Tell.defs.hh
+	  (1.1), src/Pointset_Ask_Tell.inlines.hh (1.1),
+	  src/Pointset_Ask_Tell.templates.hh (1.1),
+	  src/Pointset_Ask_Tell.types.hh (1.1), src/Pointset_Powerset.cc
+	  (1.2), src/Pointset_Powerset.inlines.hh (1.2),
+	  src/Pointset_Powerset.templates.hh (1.2), src/Powerset.defs.hh
+	  (1.27), src/Powerset.inlines.hh (1.18),
+	  src/iterator_to_const.defs.hh (1.1),
+	  src/iterator_to_const.inlines.hh (1.1),
+	  src/iterator_to_const.types.hh (1.1), tests/Makefile.am (1.257),
+	  tests/Ask_Tell/.cvsignore (1.1), tests/Ask_Tell/Makefile.am
+	  (1.1), tests/Ask_Tell/append1.cc (1.1),
+	  tests/Polyhedron/powerset1.cc (1.17): The classes
+	  Powerset::omega_iterator and Powerset::omega_const_iterator have
+	  been replaced by the classes template <typename Container>
+	  iterator_to_const and template <typename Container> const
+	  iterator_to_const.  Implementation of the Ask_Tell class is
+	  almost complete.  Added a first sketch (mostly obtained by
+	  copy-and-paste) of the new class Pointset_Ask_Tell.
+
+2006-09-20 Wednesday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: ppl_xsb.H (1.49), ppl_xsb.cc (1.91),
+	  xsb_pl_check.P (1.26): Adapted to the chnages in the LP_Problem
+	  interface.
+
+2006-09-20 Wednesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.7): Fixed a bug in print_clock().
+
+2006-09-20 Wednesday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.196): Added a short description of the new features
+	  provided by LP_Problem.
+
+2006-09-20 Wednesday 09:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.47): Adapted to the new LP_Problem
+	  interface.
+
+2006-09-20 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.15),
+	  src/Octagonal_Shape.templates.hh (1.4),
+	  src/Polyhedron.templates.hh (1.3), src/Polyhedron_nonpublic.cc
+	  (1.66), interfaces/C/ppl_c.cc (1.154), interfaces/C/ppl_c.h.in
+	  (1.65), interfaces/Prolog/Prolog_interface.dox (1.155),
+	  interfaces/Prolog/ppl_prolog.icc (1.179),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.21),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.90),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.61),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.94),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.124),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.118),
+	  interfaces/Prolog/tests/pl_check.pl (1.32): Adapted to the new
+	  LP_Problem interface.
+
+2006-09-20 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.157): Do consider new source file
+	  LP_Problem.templates.hh.
+
+2006-09-20 Wednesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.33), LP_Problem.defs.hh (1.15),
+	  LP_Problem.inlines.hh (1.11), LP_Problem.templates.hh (1.1): The
+	  constructors of LP_Problem now take the space dimension as an
+	  explicit argument. Exception thrown if this exceeds the maximum
+	  allowed space dim.  Adding a constraint no longer automatically
+	  adjusts space dimensions; exception thrown if the space dimension
+	  of the constraint exceeds that of the LP_Problem; the latter can
+	  be extended by new method add_space_dimensions_and_embed.  Method
+	  constraints() returning (a copy of) the constraint system
+	  defining the feasible region replaced by const_iterator's
+	  (constraints_begin() and constraints_end()). Also added a
+	  templatic method that adds a sequence of constraints using
+	  iterators.
+
+2006-09-20 Wednesday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.templates.hh (interfaces.1): file
+	  LP_Problem.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 08:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.16): Work around bugs in GCC
+	  3.3.3.
+
+2006-09-19 Tuesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.195): Introduce the new Octagonal_Shape class.
+
+2006-09-19 Tuesday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.3): Indentation fixes.  Never
+	  leave an operator at end of line.  Useless inclusions removed.
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (interfaces.1): file
+	  affineimage1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (altnum.1): file
+	  affineimage2.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (interfaces.1): file
+	  affineimage2.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (octagons.1): file
+	  affineimage2.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (interfaces.1): file
+	  affinepreimage1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (altnum.1): file
+	  affinepreimage2.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (interfaces.1): file
+	  affinepreimage2.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (octagons.1): file
+	  affinepreimage2.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/ascii_dump_load1.cc (altnum.1): file
+	  ascii_dump_load1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/ascii_dump_load1.cc (interfaces.1): file
+	  ascii_dump_load1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/ascii_dump_load1.cc (octagons.1): file
+	  ascii_dump_load1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (interfaces.1): file
+	  bhmz05widening1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (altnum.1): file
+	  bhz03widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (interfaces.1): file
+	  bhz03widening1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (octagons.1): file
+	  bhz03widening1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (altnum.1): file bounded1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (interfaces.1): file
+	  bounded1.cc was added on branch interfaces on 2006-09-28 20:46:32
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (octagons.1): file bounded1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (interfaces.1): file
+	  cc76extrapolation1.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (interfaces.1): file
+	  cc76narrowing1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (altnum.1): file chinainit.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (interfaces.1): file
+	  chinainit.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (octagons.1): file
+	  chinainit.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (altnum.1): file
+	  concatenate1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (interfaces.1): file
+	  concatenate1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (octagons.1): file
+	  concatenate1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (altnum.1): file
+	  constraints1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (interfaces.1): file
+	  constraints1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (octagons.1): file
+	  constraints1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (altnum.1): file empty1.cc was
+	  added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (interfaces.1): file empty1.cc
+	  was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (octagons.1): file empty1.cc was
+	  added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (altnum.1): file
+	  fromgensys1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (interfaces.1): file
+	  fromgensys1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (octagons.1): file
+	  fromgensys1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (altnum.1): file
+	  frompolyhedron1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (interfaces.1): file
+	  frompolyhedron1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (octagons.1): file
+	  frompolyhedron1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (altnum.1): file
+	  generalizedaffineimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (interfaces.1):
+	  file generalizedaffineimage1.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (octagons.1):
+	  file generalizedaffineimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (altnum.1): file
+	  generalizedaffineimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (interfaces.1):
+	  file generalizedaffineimage2.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (octagons.1):
+	  file generalizedaffineimage2.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (altnum.1): file
+	  generalizedaffineimage4.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (interfaces.1):
+	  file generalizedaffineimage4.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (octagons.1):
+	  file generalizedaffineimage4.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (altnum.1): file
+	  generalizedaffineimage5.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (interfaces.1):
+	  file generalizedaffineimage5.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (octagons.1):
+	  file generalizedaffineimage5.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc
+	  (interfaces.1): file generalizedaffinepreimage1.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc
+	  (interfaces.1): file generalizedaffinepreimage3.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc (altnum.1):
+	  file generalizedaffinepreimage4.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc
+	  (interfaces.1): file generalizedaffinepreimage4.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc (octagons.1):
+	  file generalizedaffinepreimage4.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (interfaces.1): file
+	  intersection1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
+	  (interfaces.1): file limitedbhmz05extrapolation1.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc
+	  (interfaces.1): file limitedcc76extrapolation1.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (altnum.1): file
+	  mapspacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (interfaces.1): file
+	  mapspacedims1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim.cc (altnum.1): file
+	  maxspacedim.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim.cc (interfaces.1): file
+	  maxspacedim.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (interfaces.1): file
+	  minconstraints1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (interfaces.1): file
+	  octdifference1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (interfaces.1): file
+	  octhull1.cc was added on branch interfaces on 2006-09-28 20:46:32
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (altnum.1): file
+	  relatwithcons1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (interfaces.1): file
+	  relatwithcons1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (octagons.1): file
+	  relatwithcons1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (interfaces.1): file
+	  relatwithcons2.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (interfaces.1): file
+	  relatwithgen1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (interfaces.1): file
+	  removespacedims1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (altnum.1): file run_tests was
+	  added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (interfaces.1): file run_tests
+	  was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (octagons.1): file run_tests was
+	  added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (interfaces.1): file
+	  timeelapse1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (altnum.1): file universe1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (interfaces.1): file
+	  universe1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (octagons.1): file
+	  universe1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (interfaces.1): file .cvsignore
+	  was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (octagons.1): file .cvsignore
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (altnum.1): file
+	  addspacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (interfaces.1): file
+	  addspacedims1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (octagons.1): file
+	  addspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (interfaces.1): file
+	  affinedimension1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.235), tests/Makefile.am (1.256),
+	  tests/Octagonal_Shape/.cvsignore (1.1),
+	  tests/Octagonal_Shape/Makefile.am (1.1),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.1),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.1),
+	  tests/Octagonal_Shape/affineimage1.cc (1.1),
+	  tests/Octagonal_Shape/affineimage2.cc (1.1),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.1),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.1),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.1),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.1),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.1),
+	  tests/Octagonal_Shape/bounded1.cc (1.1),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.1),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.1),
+	  tests/Octagonal_Shape/chinainit.cc (1.1),
+	  tests/Octagonal_Shape/concatenate1.cc (1.1),
+	  tests/Octagonal_Shape/constraints1.cc (1.1),
+	  tests/Octagonal_Shape/contains1.cc (1.1),
+	  tests/Octagonal_Shape/empty1.cc (1.1),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.1),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.1),
+	  tests/Octagonal_Shape/intersection1.cc (1.1),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.1),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.1),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.1),
+	  tests/Octagonal_Shape/maxspacedim.cc (1.1),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.1),
+	  tests/Octagonal_Shape/octdifference1.cc (1.1),
+	  tests/Octagonal_Shape/octhull1.cc (1.1),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.1),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.1),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.1),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.1),
+	  tests/Octagonal_Shape/run_tests (1.1),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.1),
+	  tests/Octagonal_Shape/universe1.cc (1.1),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.1): Directory
+	  tests/Octagon renamed tests/Octagonal_Shape.
+
+2006-09-19 Tuesday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.90): Reverted previous change
+	  (it was only meant for XSB 3.0.1).
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bgp99extrapolation1.cc (altnum.1): file
+	  bgp99extrapolation1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bhz03widening1.cc (altnum.1): file
+	  bhz03widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/geomcovers1.cc (altnum.1): file geomcovers1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/membytes1.cc (altnum.1): file membytes1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (altnum.1): file
+	  pointsetpowerset1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (interfaces.1): file
+	  pointsetpowerset1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (altnum.1): file
+	  Pointset_Powerset.types.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (interfaces.1): file
+	  Pointset_Powerset.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (octagons.1): file
+	  Pointset_Powerset.types.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.194), instchk.hh (1.5), doc/devref.doxyconf-html.in
+	  (1.75), doc/devref.doxyconf-latex.in (1.14),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.89), src/Makefile.am (1.156),
+	  src/Pointset_Powerset.cc (1.1), src/Pointset_Powerset.defs.hh
+	  (1.1), src/Pointset_Powerset.inlines.hh (1.1),
+	  src/Pointset_Powerset.templates.hh (1.1),
+	  src/Pointset_Powerset.types.hh (1.1), src/Polyhedra_Powerset.cc
+	  (1.7), src/Polyhedra_Powerset.defs.hh (1.37),
+	  src/Polyhedra_Powerset.inlines.hh (1.43),
+	  src/Polyhedra_Powerset.templates.hh (1.5),
+	  src/Polyhedra_Powerset.types.hh (1.5),
+	  src/Widening_Function.defs.hh (1.15),
+	  src/Widening_Function.inlines.hh (1.13), src/algorithms.hh
+	  (1.46), src/max_space_dimension.hh (1.8), tests/print.hh (1.37),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.8),
+	  tests/BD_Shape/bhz03widening1.cc (1.8),
+	  tests/BD_Shape/geomcovers1.cc (1.8), tests/Grid/bhz03widening1.cc
+	  (1.10), tests/Grid/membytes1.cc (1.7),
+	  tests/Polyhedron/Makefile.am (1.97),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.11),
+	  tests/Polyhedron/bhz03widening1.cc (1.11),
+	  tests/Polyhedron/exceptions1.cc (1.10),
+	  tests/Polyhedron/geomcovers1.cc (1.12),
+	  tests/Polyhedron/linearpartition1.cc (1.9),
+	  tests/Polyhedron/maxspacedim1.cc (1.8), tests/Polyhedron/mc91.cc
+	  (1.13), tests/Polyhedron/membytes2.cc (1.7),
+	  tests/Polyhedron/pointsetpowerset1.cc (1.1),
+	  tests/Polyhedron/polydifference1.cc (1.9),
+	  tests/Polyhedron/polypowerset1.cc (1.21),
+	  tests/Polyhedron/timeelapse1.cc (1.9): The Polyhedra_Powerset
+	  template class has been renamed Pointset_Powerset.
+
+2006-09-19 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.42),
+	  src/Polyhedra_Powerset.templates.hh (1.4), src/Powerset.defs.hh
+	  (1.26), src/Powerset.inlines.hh (1.17), src/Powerset.templates.hh
+	  (1.3), tests/Polyhedron/powerset1.cc (1.15): Powerset
+	  implementation made more lazy.  Fixed a couple of FIXMEs.
+	  Methods Powerset::add_non_bottom_disjunct() renamed
+	  add_non_bottom_disjunct_preserve_reduction(), since the true
+	  emphasis is on preserving reduction.	This required the addition
+	  of two FIXMEs concerning the implementation of
+	  Polyhedra_Powerset, as it is not clear whether the preservation
+	  of reduction was an issue there.
+
+2006-09-19 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.templates.hh (altnum.1): file Powerset.templates.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-19 Tuesday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.14): Adhere to the our standards
+	  for test programs.  Two more tests added.  Added also a FIXME.
+
+2006-09-19 Tuesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.defs.hh (altnum.1): file
+	  Grid_Generator.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-09-19 Tuesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.idefs.hh (altnum.1): file Grid_Status.idefs.hh
+	  was added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-19 Tuesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.19), BD_Shape.defs.hh (1.73),
+	  Congruence_System.defs.hh (1.15), Constraint.defs.hh (1.123),
+	  Constraint_System.defs.hh (1.31), DB_Matrix.defs.hh (1.23),
+	  Direct_Product.defs.hh (1.28), Generator.defs.hh (1.120),
+	  Generator_System.defs.hh (1.19), Grid.defs.hh (1.28),
+	  Grid_Generator.defs.hh (1.26), Grid_Generator_System.defs.hh
+	  (1.18), Grid_Status.idefs.hh (1.5), LP_Problem.defs.hh (1.14),
+	  Linear_Expression.defs.hh (1.30), Linear_Row.defs.hh (1.22),
+	  Linear_System.defs.hh (1.27), Matrix.defs.hh (1.78),
+	  OR_Matrix.defs.hh (1.4), Octagonal_Shape.defs.hh (1.4),
+	  Og_Status.idefs.hh (1.4), Ph_Status.idefs.hh (1.19),
+	  Polyhedra_Powerset.defs.hh (1.36), Polyhedron.defs.hh (1.304),
+	  Row.defs.hh (1.108), Saturation_Matrix.defs.hh (1.10): Fixed the
+	  references (in the documentation) to the various
+	  ascii_dump(std::ostream&) const methods.
+
+2006-09-19 Tuesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.25): Use vertical spacing to improve
+	  readability.
+
+2006-09-19 Tuesday 08:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.12), Ask_Tell.inlines.hh (1.11),
+	  Ask_Tell.templates.hh (1.3): Started making normalization lazy.
+
+2006-09-18 Monday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.18), BD_Shape.defs.hh (1.72),
+	  Congruence_System.defs.hh (1.14), Constraint.defs.hh (1.122),
+	  Constraint_System.defs.hh (1.30), DB_Matrix.defs.hh (1.22),
+	  Direct_Product.defs.hh (1.27), Generator.defs.hh (1.119),
+	  Generator_System.defs.hh (1.18), Grid.defs.hh (1.27),
+	  Grid_Generator.defs.hh (1.25), Grid_Generator_System.defs.hh
+	  (1.17), Grid_Status.idefs.hh (1.4), LP_Problem.defs.hh (1.13),
+	  Linear_Expression.defs.hh (1.29), Linear_Row.defs.hh (1.21),
+	  Linear_System.defs.hh (1.26), Matrix.defs.hh (1.77),
+	  OR_Matrix.defs.hh (1.3), Octagonal_Shape.defs.hh (1.3),
+	  Og_Status.idefs.hh (1.3), Ph_Status.idefs.hh (1.18),
+	  Polyhedra_Powerset.defs.hh (1.35), Polyhedron.defs.hh (1.303),
+	  Row.defs.hh (1.107), Saturation_Matrix.defs.hh (1.9): Fixed
+	  documentation references to the various ascii_dump(std::ostream&)
+	  methods (this, unfortunately triggers a Doxygen bug, see
+	  http://bugzilla.gnome.org/show_bug.cgi?id=356597).  Other
+	  documentation fixes.
+
+2006-09-18 Monday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.11), Ask_Tell.inlines.hh (1.10),
+	  Ask_Tell.templates.hh (1.2): The former engine() method is now
+	  called normalize().  New method bool is_normalized() const.
+
+2006-09-18 Monday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.10), Ask_Tell.inlines.hh (1.9),
+	  Ask_Tell.templates.hh (1.1): Halfway through the rewriting of the
+	  Ask_Tell template class.
+
+2006-09-18 Monday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.templates.hh (1.2), tests/Polyhedron/append2.cc
+	  (1.7): Indentation fixed.
+
+2006-09-17 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_pchk_int8 (1.4),
+	  tests/expected_pchk_int8 (1.8): Updated to reflect the new
+	  implementations of simplex.
+
+2006-09-17 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8 (altnum.1): file
+	  expected_pchk_int8 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-09-17 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8 (altnum.1): file
+	  expected_pchk_int8 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-09-17 Sunday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.13): Fixed the implementations
+	  of Fcaibvp::upper_bound_assign(const Fcaibvp&) and
+	  Fcaibvp::meet_assign(const Fcaibvp&) (they were swapped).
+
+2006-09-17 Sunday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.12): Fixed a bug in
+	  operator<<(std::ostream&, const Fcaibvp&).
+
+2006-09-16 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.9), Ask_Tell.inlines.hh (1.8),
+	  Ask_Tell.types.hh (1.5): Complete rewriting of the Ask_Tell
+	  template class started.
+
+2006-09-15 Friday 16:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_Generator.cc (1.17): Backtracking previous change as far
+	  as Grid_Generator is concerned.
+
+2006-09-15 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.194): Remember to advertise the failure of GCC 3.4.x to
+	  compile the PPL correctly.
+
+2006-09-15 Friday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.12), Constraint.cc (1.63), Generator.cc
+	  (1.72), Grid_Generator.cc (1.16): Added some missing sanity
+	  checks to a few OK() methods:  - Constraint::OK() and
+	  Generator::OK() no also check that the corresponding	  object is
+	  a valid Linear_Row;  - Congruence::OK() checks that the object is
+	  a valid Row;	- Grid_Generator::OK() check that the object is a
+	  valid Generator.
+
+2006-09-15 Friday 11:54  Andrea Cimino
+
+	* src/: LP_Problem.cc (1.32), LP_Problem.defs.hh (1.12): Minor
+	  stylistic changes.  Unused method definition removed.
+
+2006-09-14 Thursday 17:52  Andrea Cimino
+
+	* src/LP_Problem.cc (1.31): Fixed a bug in LP_Problem::ascii_load()
+
+2006-09-14 Thursday 11:34  Andrea Cimino
+
+	* src/LP_Problem.cc (1.30): Test that every member used in
+	  LP_Problem is OK.  Fixed a bug in ascii_load().  Added a test
+	  concerning ascii_dump/ascii_load.
+
+2006-09-14 Thursday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Expression.cc (1.15), Linear_Row.cc (1.20),
+	  Linear_Row.defs.hh (1.20), Row.cc (1.100), Row.defs.hh (1.106):
+	  Added method OK(), taking no arguments, to classes Row and
+	  Linear_Row.  The OK() method for Linear_Expression modified
+	  accordingly (previous implementation may have resulted in false
+	  alarms, i.e., returning false even when the object was well
+	  formed).
+
+2006-09-13 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.35): Every OK() methods must take care of
+	  reporting its own failures: redundant prints avoided.
+
+2006-09-13 Wednesday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.46): Made C99 compliant (we were
+	  using C++-style comments and declaring variables in the middle of
+	  body functions).
+
+2006-09-13 Wednesday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.45): Variables renamed to improve
+	  readability.
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: ppl-config_extra_man_text (1.1), ppl_lcdd_extra_man_text
+	  (1.1), ppl_lpsol_extra_man_text (1.1), prog2man (1.1):
+	  Provisional machinery to automatically build the man pages put
+	  under CVS control.
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (altnum.1): file
+	  ppl-config_extra_man_text was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (interfaces.1): file
+	  ppl-config_extra_man_text was added on branch interfaces on
+	  2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (octagons.1): file
+	  ppl-config_extra_man_text was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (altnum.1): file
+	  ppl_lcdd_extra_man_text was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (interfaces.1): file
+	  ppl_lcdd_extra_man_text was added on branch interfaces on
+	  2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (octagons.1): file
+	  ppl_lcdd_extra_man_text was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (altnum.1): file
+	  ppl_lpsol_extra_man_text was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (interfaces.1): file
+	  ppl_lpsol_extra_man_text was added on branch interfaces on
+	  2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (octagons.1): file
+	  ppl_lpsol_extra_man_text was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (altnum.1): file prog2man was added on branch altnum
+	  on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (interfaces.1): file prog2man was added on branch
+	  interfaces on 2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (octagons.1): file prog2man was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (simplex.1): file prog2man was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: ppl-config.1 (1.4), ppl_lcdd.1 (1.2), ppl_lpsol.1 (1.2):
+	  Updated.
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (altnum.1): file ppl-config.1 was added on
+	  branch altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd.1 (altnum.1): file ppl_lcdd.1 was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol.1 (altnum.1): file ppl_lpsol.1 was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.44): Added the --version (-V)
+	  option.  The brief version of the --max-memory option is now -R.
+	  Help text revised.  The --help (-h) option now prints to stdout,
+	  as it should.  Fixed a couple of error messages.  Silenced a
+	  couple of compiler warnings.
+
+2006-09-13 Wednesday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.43): Now the --check option
+	  accepts an option parameter specifying the threshold with which
+	  optima are checked.
+
+2006-09-13 Wednesday 12:46  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.42): `check_threshold' is now set
+	  to a proper value.
+
+2006-09-13 Wednesday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.41): Fixed a bug whereby the abs()
+	  function was used instead of fabs().
+
+2006-09-13 Wednesday 12:17  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.40): MIP problems now are treated
+	  as LP ones.
+
+2006-09-13 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.193): New item added.
+
+2006-09-13 Wednesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.39): Redundant test avoided.
+
+2006-09-13 Wednesday 11:09  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.38): Deallocate `optimum' only if
+	  an optimum is found.
+
+2006-09-13 Wednesday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.37): The `optimum' variable was
+	  cleared too early.  Make GLPK silent when NDEBUG is defined.
+
+2006-09-13 Wednesday 09:33  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.36): Modified ppl_lpsol.c to
+	  compile.  Properly checked if an LP Problem is MIP or not.
+
+2006-09-12 Tuesday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.35): Typo fixed.  The --check
+	  options is still not working, as the call to lpx_get_num_int()
+	  aborts the program immediately.
+
+2006-09-12 Tuesday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.34): New draft implementation of
+	  the --check option.
+
+2006-09-12 Tuesday 18:14  Andrea Cimino
+
+	* src/LP_Problem.cc (1.29): Added some noisy output if something
+	  fails in LP_Problem::OK(). Removed a previous redundant check.
+
+2006-09-12 Tuesday 18:04  Andrea Cimino
+
+	* src/LP_Problem.cc (1.28): Antoher little test added in
+	  LP_Problem::OK().  Another FIXME dealt with.
+
+2006-09-12 Tuesday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.192), src/Direct_Product.defs.hh (1.26),
+	  src/Direct_Product.inlines.hh (1.24),
+	  tests/Grid/directproduct1.cc (1.21): Restored previous
+	  implementation of affine_relation() Improved several comments.
+
+2006-09-12 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (altnum.1): file directproduct1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-12 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (octagons.1): file directproduct1.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-12 Tuesday 12:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.234), tests/Makefile.am (1.255),
+	  tests/Polyhedron/Makefile.am (1.96),
+	  tests/Polyhedron/exceptions2.cc (1.9),
+	  tests/Polyhedron/lpproblem1.cc (1.10): Tests concerning the
+	  LP_Problem class have been moved into a separate directory.
+
+2006-09-11 Monday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_mpz (1.8), expected_mpz_a (1.8):
+	  Updated to reflect the new implementations of simplex and
+	  ppl_lpsol.
+
+2006-09-11 Monday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.27): IO_Operators::operator<<(std::ostream&,
+	  const LP_Problem&) now prints the correct optimization mode.
+	  Useless redundancy avoided in the same function.
+
+2006-09-11 Monday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int8_a (1.5): Updated to reflect the new
+	  implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 19:09  Andrea Cimino
+
+	* src/LP_Problem.cc (1.26): Removed a non wanted FIXME.
+
+2006-09-11 Monday 19:07  Andrea Cimino
+
+	* src/: LP_Problem.cc (1.25), LP_Problem.defs.hh (1.11):
+	  Implemented an initial version of the << operator.
+
+2006-09-11 Monday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int16_a (1.6): Updated to reflect the
+	  new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int32_a (1.7): Updated to reflect the
+	  new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int64_a (1.7): Updated to reflect the
+	  new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int64 (1.7): Updated to reflect the new
+	  implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.6), expected_int32 (1.7):
+	  Updated to reflect the new implementations of simplex and
+	  ppl_lpsol.
+
+2006-09-11 Monday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int8 (1.6): Updated to reflect the new
+	  implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.33): Added a newline in the error
+	  output.
+
+2006-09-11 Monday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.32): The error_handler() function
+	  now prints the error also to the output file, if any.
+
+2006-09-11 Monday 13:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.25), src/Direct_Product.inlines.hh
+	  (1.23), tests/Grid/directproduct1.cc (1.20): Changed
+	  implementation of affine_dimension() for Direct_Product to assume
+	  no reduction.  Revised comment for affine_dimension().  Revised
+	  test for affine_dimension().
+
+2006-09-10 Sunday 22:15  Andrea Cimino
+
+	* src/LP_Problem.cc (1.24): ascii_load() method implemented.
+	  Slightly modified ascii_dump() to allow ascii_load() working.
+
+2006-09-10 Sunday 11:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.191): Removed a todo item for the grid widening as this
+	  has been done.  Added - Direct_Product: Check that all comments
+	  and code are consistent with	 intended semantics.
+
+2006-09-10 Sunday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.24): Some comments improved.
+
+2006-09-10 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.23):
+	  LP_Problem::steepest_edge_entering_index() fixed.
+
+2006-09-09 Saturday 18:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: asciidumpload1.cc (1.12), asciidumpload3.cc (1.3),
+	  asciidumpload4.cc (1.3): Adjusted to match the recent change in
+	  ascii dump & load methods.
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload1.cc (altnum.1): file asciidumpload1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload3.cc (altnum.1): file asciidumpload3.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload3.cc (octagons.1): file asciidumpload3.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload4.cc (altnum.1): file asciidumpload4.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload4.cc (octagons.1): file asciidumpload4.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-09 Saturday 18:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.11), Grid_Generator.cc (1.15),
+	  Linear_Row.cc (1.19), Row.cc (1.99): Patched methods for ascii
+	  dump&load so as they also manage size information and perform any
+	  required allocation/deallocation.
+
+2006-09-09 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.22): Removed another bug due to assuming
+	  that Coefficient is a GMP integer.
+
+2006-09-09 Saturday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.67): Added missing \relates
+	  commands.  Long source lines avoided.
+
+2006-09-09 Saturday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_chdims.cc (1.10), Grid_simplify.cc (1.27),
+	  checked_ext.inlines.hh (1.32), checked_float.inlines.hh (1.66),
+	  checked_int.inlines.hh (1.53): Little code formatting
+	  improvements.
+
+2006-09-09 Saturday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.26), Grid_nonpublic.cc (1.19):
+	  Const-correctness improved.
+
+2006-09-09 Saturday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.21): assert(false) does not provide any real
+	  protection and should only be used in efficiency-critical inline
+	  functions.  Use throw std::runtime_error("PPL internal error")
+	  instead.
+
+2006-09-09 Saturday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.18): Simplified the logic of debugging
+	  code in Grid::normalize_divisors(Grid_Generator_System&,
+	  Grid_Generator_System&).
+
+2006-09-09 Saturday 13:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.20): Avoid creating temporaries.
+
+2006-09-09 Saturday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.19): Use floating point constants to
+	  initialize floatin point values.
+
+2006-09-09 Saturday 13:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.18): Do not assume Coefficient is a GMP
+	  integer.  Must include <cmath> for fabs().
+	  PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT re-enabled.
+
+2006-09-09 Saturday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.17): Replaced "can't", "don't", "doesn't",
+	  "aren't" by "cannot", "do not", "does not" and "are not".
+
+2006-09-09 Saturday 13:10  Andrea Cimino
+
+	* TODO (1.190): Don't confuse operator with method.
+
+2006-09-09 Saturday 13:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (altnum.1): file
+	  frompolyhedron1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-09 Saturday 13:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (1.3): test01() fails with
+	  8-bit coefficients, but does not fail with 16-bit ones.
+
+2006-09-09 Saturday 13:07  Andrea Cimino
+
+	* TODO (1.189): Added a couple of items concering PPL::LP_Problem.
+
+2006-09-09 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Result.defs.hh (1.16), Result.inlines.hh (1.9): Functions
+	  Result classify(Result) and bool is_special(Result) documented.
+	  Useless inclusion removed.
+
+2006-09-09 Saturday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (1.4): Include <cassert>.
+
+2006-09-09 Saturday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (altnum.1): file
+	  Rounding_Dir.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-09-09 Saturday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Result.defs.hh (1.15), Result.inlines.hh (1.8): Removed the
+	  unused function Result sign(Result).
+
+2006-09-09 Saturday 09:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.95): Programs lpproblem2 and
+	  lpproblem3 no longer exist.
+
+2006-09-09 Saturday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.9): test01() overflows with
+	  32-bit coefficients, but does not with 64-bit ones.
+
+2006-09-09 Saturday 08:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.188): Added an item concerning the covering of the
+	  LP_Problem code.
+
+2006-09-09 Saturday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.94), lpproblem1.cc (1.9),
+	  lpproblem2.cc (1.7), lpproblem3.cc (1.5): Tests for the
+	  LP_Problem class fixed and merged.
+
+2006-09-08 Friday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.193): Added some items, not to forget them.
+
+2006-09-08 Friday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.16): Avoid calling num_columns() on input_cs
+	  and pending_input_cs, since these constraint systems may be NNC
+	  and therefore have an extra column for the epsilon coefficient.
+	  Do call space_dimension(), instead, taking care of the offset.
+	  Adjusted some badly indented lines; adjusted some bad line
+	  breaks.
+
+2006-09-08 Friday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.233): Version number bumped.
+
+2006-09-08 Friday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.15): Temporarily set
+	  PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT to 0.  This is to
+	  avoid trying to the expression fabs(raw_value(cost_j).get_d()),
+	  which only makes sense with GMP integer coefficients.
+
+2006-09-08 Friday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.187), demos/ppl_lpsol/ppl_lpsol.c (1.31),
+	  doc/devref.doxyconf-html.in (1.74), src/LP_Problem.cc (1.14),
+	  src/LP_Problem.defs.hh (1.10), src/LP_Problem.inlines.hh (1.10),
+	  src/Linear_Expression.cc (1.14), src/Linear_Expression.defs.hh
+	  (1.28), src/Linear_Expression.inlines.hh (1.9),
+	  tests/Polyhedron/Makefile.am (1.93),
+	  tests/Polyhedron/lpproblem1.cc (1.8),
+	  tests/Polyhedron/lpproblem2.cc (1.6),
+	  tests/Polyhedron/lpproblem3.cc (1.4): First (and, quite likely,
+	  last) merge of the `simplex' branch to the main trunk.
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (interfaces.1): file
+	  OR_Matrix.inlines.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.types.hh (altnum.1): file OR_Matrix.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.types.hh (interfaces.1): file OR_Matrix.types.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.cc (altnum.1): file Octagonal_Shape.cc was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.cc (interfaces.1): file Octagonal_Shape.cc
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.types.hh (altnum.1): file
+	  Octagonal_Shape.types.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.types.hh (interfaces.1): file
+	  Octagonal_Shape.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (altnum.1): file
+	  checked_numeric_limits.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.defs.hh (altnum.1): file distances.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.defs.hh (interfaces.1): file distances.defs.hh was
+	  added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.inlines.hh (altnum.1): file distances.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.inlines.hh (interfaces.1): file
+	  distances.inlines.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.types.hh (altnum.1): file distances.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.types.hh (interfaces.1): file distances.types.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.232), doc/definitions.dox (1.197),
+	  doc/devref.doxyconf-html.in (1.73), doc/devref.doxyconf-latex.in
+	  (1.13), src/Checked_Number.defs.hh (1.78),
+	  src/Checked_Number.inlines.hh (1.66), src/DB_Matrix.inlines.hh
+	  (1.27), src/DB_Row.defs.hh (1.19), src/Makefile.am (1.155),
+	  src/OR_Matrix.defs.hh (1.2), src/OR_Matrix.inlines.hh (1.2),
+	  src/OR_Matrix.templates.hh (1.2), src/OR_Matrix.types.hh (1.2),
+	  src/Octagonal_Shape.cc (1.2), src/Octagonal_Shape.defs.hh (1.2),
+	  src/Octagonal_Shape.inlines.hh (1.2),
+	  src/Octagonal_Shape.templates.hh (1.2),
+	  src/Octagonal_Shape.types.hh (1.2), src/Og_Status.idefs.hh (1.2),
+	  src/Og_Status.inlines.hh (1.2), src/Polyhedron.defs.hh (1.302),
+	  src/checked_numeric_limits.hh (1.16), src/distances.defs.hh
+	  (1.2), src/distances.inlines.hh (1.2), src/distances.types.hh
+	  (1.2), src/globals.defs.hh (1.39), src/globals.inlines.hh (1.15),
+	  tests/Makefile.am (1.254), tests/ppl_test.hh (1.49),
+	  tests/print.hh (1.36), tests/BD_Shape/addconstraints1.cc (1.14),
+	  tests/BD_Shape/addspacedims1.cc (1.12),
+	  tests/BD_Shape/affineimage1.cc (1.15),
+	  tests/BD_Shape/affinepreimage1.cc (1.15),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.13),
+	  tests/BD_Shape/bdsdifference1.cc (1.11),
+	  tests/BD_Shape/bdshull1.cc (1.11),
+	  tests/BD_Shape/bhmz05widening1.cc (1.11),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.15),
+	  tests/BD_Shape/cc76narrowing1.cc (1.15),
+	  tests/BD_Shape/concatenate1.cc (1.12),
+	  tests/BD_Shape/constraints1.cc (1.15),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.14),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.16),
+	  tests/BD_Shape/h79widening1.cc (1.11),
+	  tests/BD_Shape/intersection1.cc (1.14),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.10),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.11),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.11),
+	  tests/BD_Shape/mapspacedims1.cc (1.12),
+	  tests/BD_Shape/minconstraints1.cc (1.8),
+	  tests/BD_Shape/removespacedims1.cc (1.15),
+	  tests/BD_Shape/timeelapse1.cc (1.14), tests/BD_Shape/universe1.cc
+	  (1.12): First (and, quite likely, last) merge of the `octagons'
+	  branch to the main trunk.
+
+2006-09-08 Friday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.50): Improved strong
+	  closure implementation by better exploting data locality.  Also,
+	  avoid testing for +inf since it happens to slow down execution
+	  (octagonal matrices tend to become dense quite quickly).
+
+2006-09-08 Friday 13:37  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[64,32,23]): `is_artificial' is no longer used. Now the
+	  informations about artificial variables are handled just in the
+	  first phase of the simplex algorithm.
+
+2006-09-08 Friday 11:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.14): Initial, partial
+	  implementation of the `--check' option.  What remains to be done
+	  is specified in TODO comments.  The variable `check_optimum' has
+	  been renamed `check_results'.
+
+2006-09-08 Friday 10:21  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.13): Added a FIXME.
+
+2006-09-08 Friday 09:43  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.12): Added a white space.
+
+2006-09-08 Friday 09:40  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.11): Force `make check',
+	  temporarly commented out a `fatal()' call.
+
+2006-09-08 Friday 09:12  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.10): Fixed an unwanted
+	  carriage return.
+
+2006-09-07 Thursday 19:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.10), Congruence.defs.hh (1.15),
+	  Congruence_System.cc (1.19), Constraint.cc (1.62), Generator.cc
+	  (1.71), Grid.templates.hh (1.17), Grid_Generator.cc (1.14),
+	  Grid_conversion.cc (1.14), Grid_nonpublic.cc (1.17),
+	  Grid_public.cc (1.34), Grid_simplify.cc (1.26),
+	  Linear_Expression.cc (1.13), Linear_Expression.defs.hh (1.27),
+	  Polyhedron.templates.hh (1.2), Polyhedron_public.cc (1.77):
+	  Prefer using TEMP_INTEGER to Coefficient where declaring an
+	  automatic variable.  Do not use
+	  Coefficient_traits::const_reference for automatic variable
+	  declarations: only use it when declaring formal parameter types.
+
+2006-09-07 Thursday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (simplex.63): Remember to generate auxiliary
+	  output function definitions as soon as we have an implementation
+	  of operator<<.
+
+2006-09-07 Thursday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (simplex.31): Use macro
+	  PPL_OUTPUT_DECLARATIONS.
+
+2006-09-07 Thursday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[62,30]):
+	  Useless inclusions avoided.
+
+2006-09-07 Thursday 16:35  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.61): Prefer neg_assign(x, y) to x =
+	  -y.
+
+2006-09-07 Thursday 16:18  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.60): Prefer `TEMP_INTEGER(x)' to
+	  `Coefficient x'.
+
+2006-09-07 Thursday 15:11  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.59): Restored ascii_dump().
+	  Indentation fixed.
+
+2006-09-07 Thursday 14:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Expression.cc, Linear_Expression.defs.hh,
+	  Linear_Expression.inlines.hh (simplex.[4,6,3]): Added ascii
+	  dump/load methods.
+
+2006-09-07 Thursday 13:45  Andrea Cimino
+
+	* src/: LP_Problem.cc, Linear_Expression.defs.hh (simplex.[58,5]):
+	  No more `friend' declarations.  Added a FIXME:
+	  ascii_dump(ostream) modified waiting for the
+	  Linear_Epression::ascii_dump(ostream) method.
+
+2006-09-07 Thursday 12:32  Andrea Cimino
+
+	* src/: Generator.defs.hh, LP_Problem.cc (simplex.[5,57]): Minor
+	  improvements. Avoided another `friend' declaration.
+
+2006-09-07 Thursday 10:37  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.56): Avoid using useless temporaries.
+
+2006-09-07 Thursday 10:25  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.55): A FIXME dealt with by using
+	  Generator::ascii_dump(ostream).
+
+2006-09-07 Thursday 10:15  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.54): Use abs_assign(x) instead of
+	  abs_assign(x, x).
+
+2006-09-07 Thursday 10:02  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.53): Specified what kind of macro we
+	  are referring to in important #endif statements.
+
+2006-09-07 Thursday 09:49  Andrea Cimino
+
+	* src/: Constraint.defs.hh, LP_Problem.cc (simplex.[5,52]): Removed
+	  the `friend' declaration from Constraint.defs.hh of the class
+	  LP_Problem using the public methods of the class Constraint. Some
+	  other little improvements.
+
+2006-09-06 Wednesday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.44), C_Polyhedron.inlines.hh
+	  (1.32): Fixed the parameter names of
+	  C_Polyhedron::C_Polyhedron(const Grid_Generator_System&) and
+	  C_Polyhedron::C_Polyhedron(Grid_Generator_System&).  Added 4
+	  FIXMEs for the same constructors: their documentation seems
+	  wrong, and their implementation seems incomplete.
+
+2006-09-06 Wednesday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, config.guess, config.sub, install-sh, missing,
+	  mkinstalldirs, Watchdog/INSTALL, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/install-sh, Watchdog/missing,
+	  Watchdog/mkinstalldirs, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/clpq2.pl, src/BD_Shape.defs.hh,
+	  src/BD_Shape.templates.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Direct_Product.defs.hh,
+	  src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Direct_Product.types.hh, src/Float.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/Generator.cc, src/Generator.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Makefile.am, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_public.cc,
+	  src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	  src/Scalar_Products.inlines.hh, src/checked.cc,
+	  src/checked_ext.inlines.hh, src/checked_int.inlines.hh,
+	  src/fpu-ia32.inlines.hh, src/globals.defs.hh, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	  tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+	  tests/Grid/directproduct1.cc, tests/Grid/directproduct2.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/outputoperator2.cc, tests/Grid/outputoperator3.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/widening1.cc,
+	  tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/bug2.cc, tests/Polyhedron/bug2.dat
+	  (simplex.[1,3,3,2,1,1,1,3,3,2,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,6,2,2,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,29,22,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,4,2,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,2,3,3,3,3,3,3,3,7,3,3,1]):
+	  Third merge from the main trunk.
+
+2006-09-06 Wednesday 09:19  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.51): Simplified the changes of the
+	  last commit.
+
+2006-09-06 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.22), GMP_Integer.inlines.hh (1.16):
+	  Added void abs_assign(GMP_Integer& x) and void
+	  abs_assign(GMP_Integer& x, const GMP_Integer& y).
+
+2006-09-05 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.33): Long lines avoided.
+
+2006-09-05 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.77), Checked_Number.inlines.hh
+	  (1.65): Added template <typename T, typename Policy> void
+	  abs_assign(Checked_Number<T, Policy>& x) and template <typename
+	  T, typename Policy> void abs_assign(Checked_Number<T, Policy>& x,
+	  const Checked_Number<T, Policy>& y).
+
+2006-09-05 Tuesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.76): Added the declaration and
+	  documentation for template <typename T, typename Policy> void
+	  neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T,
+	  Policy>& y).
+
+2006-09-05 Tuesday 16:18  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.50): Attempt to avoid explicit
+	  products to improve performances by not using temporaries.
+
+2006-09-05 Tuesday 15:26  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.49): Don't use `dimension_type' if we
+	  are not dealing with dimensions.
+
+2006-09-05 Tuesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.16): Only define debugging variables
+	  when NDEBUG is not defined.
+
+2006-09-05 Tuesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/clpq2.pl (1.9): Fixed do_command/2.
+
+2006-09-04 Monday 17:43  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.48): Other little formatting changes.
+
+2006-09-04 Monday 16:14  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.47): Typo fixed.
+
+2006-09-04 Monday 16:11  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[46,28]):
+	  Removed other useless code. Added a CHECKME.
+
+2006-09-04 Monday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (simplex.21): Little formatting change.
+
+2006-09-04 Monday 11:41  Andrea Cimino
+
+	* src/LP_Problem.inlines.hh (simplex.20): Fixed the swap operator.
+
+2006-09-04 Monday 11:26  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[45,27,19]): Big changes.  Now the Status `UNSOLVED' is
+	  dropped because every LP_Problem, from the beginning, now is
+	  treated like `PARTIALLY_SATISFIABLE', so all the redundant code
+	  is dropped too. Other little, but important, bugfixes. This new
+	  implementation must be heavily tested.
+
+2006-09-01 Friday 12:02  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.44): Fixed a bug in compute_simplex():
+	  the test02 in lpproblem1.cc caused to fail the assertion
+	  `assert(challenger >= current)'.  Now the test seems to work.
+
+2006-07-20 Thursday 08:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.31):
+	  Removed a duplicate macro definition, improved some comments,
+	  reordered some macros.
+
+	  Added macros to make the components of a "simple" open or direct
+	  product cplusplus class available; these are now defined as:
+	  m4_cplusplus_class`'i_j where "i" is the class counter and "j" =
+	  1 or 2 depending on whether it is the 1st or second argument.  By
+	  "simple", we mean that the product construct is not nested.
+
+2006-07-06 Thursday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.23): Temporarily commented out a
+	  friend declaration that is rejected by GCC 3.3.x.
+
+2006-07-06 Thursday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (simplex.1): file
+	  Direct_Product.defs.hh was added on branch simplex on 2006-09-06
+	  18:41:51 +0000
+
+2006-07-02 Sunday 13:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.30):
+	  Some small improvements.
+
+2006-06-30 Friday 20:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.117): Repeated inclusion
+	  removed.  Useless declaration and initialization of `a_throw'
+	  removed as well.
+
+2006-06-30 Friday 19:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[29,30,21,24]): Revised the code for widening so that
+	  the supporting methods are not needed and removed. The limited
+	  and bounded options for extrapolation are now coded as a single
+	  pattern.
+
+	  Changes for schematising the limited and bounded options still to
+	  be done in the C interface.
+
+2006-06-30 Friday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: yap_cfli.h, yap_cfli.ic
+	  (interfaces.[1,1]): Started drafting the YAP Prolog Common
+	  Foreign Language Interface.
+
+2006-06-30 Friday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: swi_cfli.cc, swi_cfli.h, swi_cfli.ic
+	  (interfaces.[2,2,2]): Little improvements.
+
+2006-06-30 Friday 15:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[28,14,22,29,23]): Separate patterns for widening and
+	  extrapolation to give more flexibility.
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Direct_Product.templates.hh (1.19), Grid.inlines.hh (1.10),
+	  Grid.templates.hh (1.16), Grid_Generator.defs.hh (1.24): Missing
+	  inclusions added.
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (altnum.1): file
+	  Direct_Product.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (octagons.1): file
+	  Direct_Product.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (simplex.1): file
+	  Direct_Product.templates.hh was added on branch simplex on
+	  2006-09-06 18:41:51 +0000
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (altnum.1): file Grid.inlines.hh was added on
+	  branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-06-29 Thursday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.14), Polyhedron.defs.hh (1.301):
+	  Missing inclusions added.
+
+2006-06-29 Thursday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: bug1.cc (1.4), bug1.dat (1.5): The situation
+	  exhibited by bug1.cc and bug1.dat has been clarified (not a bug,
+	  but Constraint::OK() needed improving).
+
+2006-06-29 Thursday 18:59  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.22), Direct_Product.inlines.hh
+	  (1.22), Direct_Product.templates.hh (1.18), globals.defs.hh
+	  (1.38): Improve some FIXMEs.
+
+2006-06-29 Thursday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (simplex.1): file
+	  Direct_Product.inlines.hh was added on branch simplex on
+	  2006-09-06 18:41:51 +0000
+
+2006-06-29 Thursday 18:38  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.19): Add the ability to test with
+	  C_Polyhedron as the Polyhedral component.
+
+2006-06-29 Thursday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (simplex.1): file directproduct1.cc
+	  was added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-29 Thursday 17:47  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.18): Add a widening test.
+
+2006-06-29 Thursday 17:46  Matthew Mundell
+
+	* src/: Polyhedron.inlines.hh (1.133), Polyhedron.defs.hh (1.300):
+	  Add widening_assign(ph, tp) which is equivalent to
+	  H79_widening_assign(ph, tp).
+
+2006-06-29 Thursday 17:45  Matthew Mundell
+
+	* src/Direct_Product.defs.hh (1.21): Direct out the relation_with
+	  declarations.
+
+2006-06-29 Thursday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.8), config.guess (1.37), config.sub (1.35), install-sh
+	  (1.17), missing (1.13), mkinstalldirs (1.10), Watchdog/INSTALL
+	  (1.5), Watchdog/config.guess (1.21), Watchdog/config.sub (1.20),
+	  Watchdog/install-sh (1.14), Watchdog/missing (1.9),
+	  Watchdog/mkinstalldirs (1.6): Updated from Autoconf 2.60.
+
+2006-06-29 Thursday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.92): The situation exhibited by
+	  bug1.cc and bug1.dat has been clarified (not a bug, but
+	  Constraint::OK() needed improving).
+
+2006-06-29 Thursday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.h (interfaces.1): Spacing
+	  changed.
+
+2006-06-29 Thursday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am,
+	  ppl_interface_generator_swiprolog_cc.m4, swi_cfli.cc, swi_cfli.h,
+	  swi_cfli.ic (interfaces.[4,6,1,1,1]): SWI-Prolog Common Foreign
+	  Language Interface separated from the PPL stuff.
+
+2006-06-29 Thursday 16:17  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.17): Update to test only the
+	  methods defined in Direct_Product.  Update some expected values
+	  for when Grid is the first component.
+
+2006-06-29 Thursday 16:14  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.20), Direct_Product.inlines.hh
+	  (1.21), Direct_Product.templates.hh (1.17): Direct out the
+	  covering box, bounds_from_*, maximize and minimize methods for
+	  now.	Convert the returns of the system-returning methods from
+	  references to values.  Reduce to a single widening method:
+	  widening_assign(dp).
+
+	  Convert both product classes to assume that every method is
+	  implemented in both components.
+
+2006-06-29 Thursday 16:06  Matthew Mundell
+
+	* src/Congruence.defs.hh (1.13): Add Constraint friend declaration.
+
+2006-06-29 Thursday 16:06  Matthew Mundell
+
+	* src/: C_Polyhedron.defs.hh (1.43), C_Polyhedron.inlines.hh
+	  (1.31): Add constructors that take Grid_Generator_Systems.
+
+2006-06-29 Thursday 16:05  Matthew Mundell
+
+	* src/: Polyhedron.defs.hh (1.299), Polyhedron.inlines.hh (1.132),
+	  Polyhedron_public.cc (1.76): Add congruences(),
+	  minimized_congruences(), grid_generators(),
+	  minimized_grid_generators(), is_discrete(), add_grid_generator(g)
+	  and add_grid_generator_and_minimize(g).
+
+2006-06-29 Thursday 16:01  Matthew Mundell
+
+	* src/: Grid_nonpublic.cc (1.15), Grid_public.cc (1.32),
+	  Grid.defs.hh (1.25), Grid.inlines.hh (1.9): Add Grid(const gs),
+	  Grid(gs), constraints(), minimized_constraints(), generators(),
+	  minimized_generators(), add_generator(g) and
+	  add_generator_and_minimize(g).
+
+2006-06-29 Thursday 15:56  Matthew Mundell
+
+	* src/: Constraint_System.cc (1.18), Constraint_System.defs.hh
+	  (1.29): Add Constraint_System(cgs).
+
+2006-06-29 Thursday 15:55  Matthew Mundell
+
+	* src/: Constraint.cc (1.61), Constraint.defs.hh (1.121),
+	  Constraint.inlines.hh (1.64): Add methods
+	  throw_invalid_argument(method, msg), Constraint(cg) and
+	  Constraint(cg, sz, capacity).
+
+2006-06-29 Thursday 15:53  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (1.13): Improve insert(c)
+	  description slightly.
+
+2006-06-29 Thursday 15:52  Matthew Mundell
+
+	* src/: NNC_Polyhedron.defs.hh (1.46), NNC_Polyhedron.inlines.hh
+	  (1.33), Congruence_System.cc (1.18): Update Congruence_System(cs)
+	  to construct Matrix with the required space dimension.
+
+2006-06-29 Thursday 15:38  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.16): Convert test76 to fail with
+	  int8.
+
+2006-06-29 Thursday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.60): Constraint::OK() improved: it now
+	  detects illegal "strict" equalities.
+
+2006-06-29 Thursday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.91), bug2.cc (1.7), bug2.dat
+	  (1.2): The bug shown by bug2.cc and bug2.dat has been fixed long
+	  ago.
+
+2006-06-29 Thursday 13:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/bug1.dat (1.4): Testcase simplified.
+
+2006-06-29 Thursday 12:42  Matthew Mundell
+
+	* tests/Polyhedron/bug1.dat (1.3): Add data file for bug1.
+
+2006-06-29 Thursday 12:39  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.90), bug1.cc (1.3): Add bug1.
+
+2006-06-29 Thursday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.27):
+	  Simplified code for defining the add_disjuncts replacement - this
+	  uses the new macro m4_echo_unquoted added in the previous commit.
+
+2006-06-29 Thursday 08:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[42,26,22]): Added 3 new application-independent
+	  macros to the common.m4 m4_echo_quoted, m4_echo_unquoted,
+	  m4_arg_counter:
+
+	  m4_echo_quoted and m4_echo_unquoted correspond to echo1 and echo2
+	  in the m4 documentation. Neither used yet but I plan to use the
+	  m4_echo_unquoted to expand terms.
+
+	  m4_arg_counter takes a string and a sequence of arguments and
+	  either expands to the first index of the argument sequence that
+	  matches the string or to the empty string.  m4_arg_counter is now
+	  used instead of m4_check_if_class_in_group which is removed.
+
+	  In common_dat.m4 added a dummy predicate for widening
+	  Polyhedra_Powerset classes and in prolog_icc_code.m4 added unused
+	  schematic code for developing the widening for powersets (this is
+	  prefixed by a "FIXME" and should be ignored).
+
+2006-06-28 Wednesday 19:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4 (interfaces.[28,21]):
+	  Added Polyhedra_Powerset schema predicate for "get_disjuncts"/2.
+	  Removed some unwanted commented-out lines of code.
+
+2006-06-28 Wednesday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (octagons.1): Adjusted spacing when
+	  using \ to break lines in macro definitions.
+
+2006-06-28 Wednesday 18:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (octagons.18): Do initialize `i' when
+	  constructing the past-the-end any_row_iterator, so as to avoid
+	  the annoying compiler warning.  Do initialize `size_' when
+	  default constructing a Pseudo_Row (for the same reason as above).
+
+2006-06-28 Wednesday 16:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[25,27,20]): For the Polyhedra_Powerset classes, we
+	  now allow for add_disjunct and pairwise_reduce in the interfaces
+	  (currently these are only included in the Prolog interfaces).
+
+2006-06-28 Wednesday 12:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.24):
+	  Avoid generating unwanted spaces.
+
+2006-06-28 Wednesday 12:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[23,20,19]): Revised the friend pattern replacement
+	  macros.  Added handles for C_Polyhedron and NNC_Polyhedron
+	  whenever the Polyhedron class is generated.
+
+2006-06-27 Tuesday 20:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am, C/Makefile.am, Prolog/Makefile.am,
+	  Prolog/Ciao/Makefile.am, Prolog/GNU/Makefile.am,
+	  Prolog/SICStus/Makefile.am, Prolog/SWI/Makefile.am,
+	  Prolog/XSB/Makefile.am, Prolog/YAP/Makefile.am
+	  (interfaces.[2,4,4,4,5,3,3,3,3]): Added the specification of all
+	  the dependencies concerning the generation of interfaces.
+
+2006-06-27 Tuesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (interfaces.3): Added
+	  ../ppl_interface_generator_common_dat.m4 to
+	  interface_generator_files.
+
+2006-06-27 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (interfaces.3): Added
+	  ../ppl_interface_generator_common_dat.m4 to
+	  interface_generator_files.
+
+2006-06-27 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (interfaces.2): This is now a generated
+	  source.
+
+2006-06-27 Tuesday 13:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.22):
+	  Now it does not remove spaces from the class names.
+
+2006-06-27 Tuesday 13:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.21):
+	  Simplified the code for the replacements for pattern "friend" by
+	  making a new more generic macro.  Added friends for octagons and
+	  polyhedra_powersets class kinds.
+
+2006-06-27 Tuesday 09:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[41,20,19]): Added and redone existing code so that
+	  any class of kind BD_Shape is a friend of any other class of kind
+	  BD_Shape and also a friend of Polyhedron class.
+
+	  Note that if a class is defined as a "friend" then the schema
+	  name ppl_new_ at TOPOLOGY@@CLASS at _from_@INTOPOLOGY@@FRIEND@ is
+	  instantiated to have this class and friend.
+
+	  The Prolog C++ (ppl_prolog.icc) code needs the procedure
+	  converting terms to class handles to come before use.  With this
+	  friend code, all these procedures must be defined before any
+	  other generated code.  Therefore a new macro
+	  m4_pre_all_classes_code is called before generating the main
+	  classes code.  This has a default expansion of the empty string.
+
+2006-06-26 Monday 19:47  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.15): Add directive GRID_IS_D1,
+	  for testing with Grid as the first component.  In test15 and
+	  test16 compare the congruence systems via temporary grids.
+
+2006-06-26 Monday 19:45  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.19), Direct_Product.inlines.hh
+	  (1.20), Direct_Product.templates.hh (1.16): Add the
+	  system-returning methods to Open_Product so that they reduce the
+	  product before returning the system.	Add C_Polyhedron
+	  specialisation to any methods already specialised for
+	  NNC_Polyhedron.
+
+2006-06-26 Monday 09:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[40,19,26,18]): Improved the processing of the
+	  replacement lists for a pattern.
+
+	  Added 2 new application independent helper macros:  - m4_nargs
+	  (definition taken from m4 documentation)  - m4_arg (finds the
+	  n+1'st argument in a list of arguments - where n is the 1st
+	  argument)
+
+	  The alternative replacement is now also defined via an
+	  alternative list of replacements (the number and order must match
+	  the usual list of replacements for the given class). This change
+	  was triggered by the wish to have a "friend" pattern (see below).
+
+	  Introduced a new pattern "friend" and use in in the Prolog
+	  interface to use instead of the 2nd "class" in
+	  ppl_new_ at CLASS@_from_ at INTOPOLOGY@@CLASS@ ie.,
+	  ppl_new_ at CLASS@_from_ at INTOPOLOGY@@FRIEND at .  That is, a friend is
+	  a class that can be used to construct an element in the current
+	  class. Every class is declared to be a friend of itself.  The
+	  intention is to add to more "friend"s for each class so that, for
+	  instance, Polyhedron will be a friend of BD_Shape.  Note that the
+	  friend pattern is only used in the Prolog interface at the
+	  moment.
+
+2006-06-22 Thursday 13:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.15): Using the new policy
+	  WRD_Extendend_Number_Policy when assertions are turned off.
+
+2006-06-22 Thursday 13:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (octagons.[1,1]): Added new policy WRD_Extended_Number_Policy, to
+	  be used by weakly-relational domains when assertions are turned
+	  off.
+
+2006-06-22 Thursday 11:27  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.49): Corrected a bug
+	  in Octagonal_Shape<T>::CC76_narrowing_assign().
+
+2006-06-21 Wednesday 19:49  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.14): Insert is_disjoint() test
+	  test34 where the intersection of the products determines the
+	  outcome.  Add a directive to control the product used.
+
+2006-06-21 Wednesday 19:46  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.18), Direct_Product.inlines.hh
+	  (1.19), Direct_Product.templates.hh (1.15): Convert the reduced
+	  flag methods to const methods.  Update the predicate methods
+	  (is_empty(), etc) to first reduce the components.  Update
+	  is_disjoint_from to consider the intersection of the two
+	  products.
+
+2006-06-21 Wednesday 14:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[39,18,13,21,25,18,17]): Revised the way we handle
+	  compound domains (is the powerset and product domains).
+
+	  Where compound domains have Polyhedron as a component, the system
+	  creates two domains, one where Polyhedron is prefixed by C and
+	  the other where it is prefixed by NNC. Note that this change has
+	  been made so as _not_ to affect the simple domain Polyhedron.
+
+	  As requested, both the user name and the C++ name have the
+	  topology C and NNC inserted just before the string "Polyhedron".
+	  Note though this still assumes that every component = Polyhedron
+	  has the same topology. Automatically generating different
+	  topologies for these components will be difficult and not really
+	  practical or useful.
+
+	  Simplified the way class name patterns are replaced by the actual
+	  name. The class patterns are now replaced as part of the main
+	  list of replacements.
+
+2006-06-21 Wednesday 13:11  Matthew Mundell
+
+	* src/: Direct_Product.inlines.hh (1.18),
+	  Direct_Product.templates.hh (1.14), Direct_Product.defs.hh
+	  (1.17): Add a reduced flag to Open_Product.  Add reduction
+	  function propagate_constraints_reduce and update standard_reduce
+	  to call it.  Update Open_Product is_bounded to call reduce()
+	  instead of propagating constraints directly.
+
+2006-06-21 Wednesday 12:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.48): Removed an
+	  efficiency bug (repeated allocations) in the strong closure and
+	  strong coherence methods.
+
+2006-06-20 Tuesday 15:30  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.16), Direct_Product.inlines.hh
+	  (1.17), Direct_Product.templates.hh (1.13),
+	  Direct_Product.types.hh (1.5): Replace the Open_Product reduction
+	  methods with a single reduce() method and a reduction function
+	  template parameter.
+
+2006-06-20 Tuesday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.types.hh (altnum.1): file
+	  Direct_Product.types.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-06-20 Tuesday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.types.hh (octagons.1): file
+	  Direct_Product.types.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-06-20 Tuesday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.types.hh (simplex.1): file
+	  Direct_Product.types.hh was added on branch simplex on 2006-09-06
+	  18:41:51 +0000
+
+2006-06-18 Sunday 22:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4 (interfaces.[38,17]):
+	  Comments improved and redundant code removed.
+
+2006-06-18 Sunday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4 (interfaces.[37,16]):
+	  Revised handling of C++ class names so that a product domain with
+	  commas works.  Basic approach is to immediately replace the ","
+	  in the list of C++ names obtained from the instantiations.m4 file
+	  by "@COMMA@" and then at the end of the code generation, restore
+	  the ",".
+
+2006-06-17 Saturday 10:39  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.13): Add tests of
+	  Direct_Product(covering_box), shrink_bounding_box(box) and
+	  get_covering_box(box).
+
+2006-06-17 Saturday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox2.cc (altnum.1): file coveringbox2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-17 Saturday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (altnum.1): file ppl_test.cc was added on
+	  branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-06-17 Saturday 10:32  Matthew Mundell
+
+	* tests/: Grid/boundingbox2.cc (1.10), ppl_test.cc (1.6),
+	  ppl_test.hh (1.48), Grid/coveringbox2.cc (1.10): Move the
+	  temporary function operator==(box,box) to ppl_test.cc.
+
+2006-06-17 Saturday 10:31  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.15), Direct_Product.inlines.hh
+	  (1.16), Direct_Product.templates.hh (1.12): Define
+	  shrink_bounding_box(box) and get_covering_box(box).
+
+2006-06-16 Friday 18:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.15):
+	  Previous simplification means that the replacement code here can
+	  also be improved.
+
+2006-06-16 Friday 18:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (interfaces.[36,14,10,5]): Revised comments, Simplified some
+	  macros and removed some multiple levels of quoting.  Avoid
+	  generating unwanted (and unintended) blank lines (by making sure
+	  every line ending with "dnl" ends with "`'dnl").
+
+2006-06-16 Friday 16:48  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.12), tests/Grid/directproduct2.cc
+	  (1.4), src/Direct_Product.templates.hh (1.11),
+	  src/Direct_Product.types.hh (1.4): Add an Open_Product
+	  is_bounded() NNC_Polyhedron-Grid specialization which propagates
+	  equalities.
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (altnum.1): file directproduct2.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (interfaces.1): file
+	  directproduct2.cc was added on branch interfaces on 2006-09-28
+	  20:46:31 +0000
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (octagons.1): file directproduct2.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (simplex.1): file directproduct2.cc
+	  was added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-16 Friday 16:47  Matthew Mundell
+
+	* src/Polyhedron_public.cc (1.75): Update add_congruences(cgs) and
+	  add_congruence(cg) to strong normalize constructed constraints
+	  before adding them.
+
+2006-06-16 Friday 15:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4
+	  (interfaces.12): Revised C code for including topology in
+	  compound C++ class names.
+
+2006-06-16 Friday 14:18  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.11): Add tests of contains() and
+	  strictly_contains().
+
+2006-06-16 Friday 14:18  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.14), Direct_Product.inlines.hh
+	  (1.15): Implement contains() and strictly_contains().
+
+2006-06-16 Friday 13:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (interfaces.[35,24,9,6,4]): Fixed an old bug affecting Ciao and
+	  XSB interfaces.  The bug was in the handling of the list
+	  separator.  Now a counter for the list is passed as as argument
+	  and the separator is suppressed when the counter is 0.
+
+2006-06-16 Friday 09:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[34,13,23,16]): Completed basic changes for
+	  Powerset_Polyhedron<...>.  Compilation only tested (in the Prolog
+	  interface) for Powerset_Polyhedron<Polyhedron> for the predicates
+	  "ppl_new_C_Polyhedra_Powerset_Polyhedron_from_space_dimension"
+	  and
+	  "ppl_new_NNC_Polyhedra_Powerset_Polyhedron_from_space_dimension".
+
+2006-06-15 Thursday 23:29  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.10): Replace the use of
+	  Direct_Product with a local typedef, Product.  Add tests of the
+	  remaining predicate methods (is_topologically_closed(), etc).
+	  Ensure that each of the defined adding methods (add_congruence(),
+	  etc) is used at least once in the file.
+
+2006-06-15 Thursday 23:29  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.13), Direct_Product.inlines.hh
+	  (1.14), Direct_Product.templates.hh (1.10): Define more of the
+	  adding methods (add_congruence(), etc).  Take out the constraint
+	  parameter congruence adding method declarations.  Correct some of
+	  the predicate methods.
+
+	  Add to Open_Product the remaining constructors, ~Open_Product()
+	  and operator=.  Define Open_Product::is_universe().
+
+2006-06-15 Thursday 17:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[33,15]): Added provision for prefixing topology
+	  wherever in the C++ class name the class "Polyhdedron".  Only
+	  tested for the basic Polyhedron class and only in the Prolog
+	  interface code.
+
+2006-06-15 Thursday 16:16  Matthew Mundell
+
+	* tests/Grid/directproduct2.cc (1.3): Typedef Product to
+	  Open_Product instead of Reduced_Product.
+
+2006-06-15 Thursday 16:08  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.12), Direct_Product.inlines.hh
+	  (1.13), Direct_Product.templates.hh (1.9),
+	  Direct_Product.types.hh (1.3): Rename Reduced_Product
+	  Open_Product.  Reorder sytem-returning method declarations.  Move
+	  empty-reduce methods into Open_Product.  Define rest of predicate
+	  methods (is_bounded(), etc).
+
+2006-06-15 Thursday 15:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[32,17]): Some bugs fixed.
+
+2006-06-15 Thursday 10:36  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.47): Corrected a code
+	  line in      Octagonal_Shape<T>::generalized_affine_preimage().
+	  Added some new tests on
+	  Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-06-15 Thursday 09:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[31,16]): Revised comments to match previous changes.
+	  Improved a few macro names.
+
+2006-06-15 Thursday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.[30,12,15,8]):   The m4_class (ie the interface name)
+	  and the m4_cpp_name are
+	    never passed as arguments now. Instead the number of the class
+	    is passed (as well as the class_kind) and the names are found
+	    from the definition generated in the initialisation phase.
+
+	    The macro definitions for the initialisation of the class
+	    names been moved from ppl_interface_generator_common.m4
+	    to ppl_interface_generator_common_dat.m4 as these are then
+	    used as fixed macros for the main code generation.
+
+	  The order of generation has been changed.  The @CLASS@ and
+	  @CPP_CLASS@ are replaced by the actual class names immediately
+	  after getting the code (or, for the Prolog systems, the
+	  exntensions have been added)
+
+	  In Prolog/ppl_interface_generator_prolog_systems.m4, the macros
+	  for generating the Prolog system code for fixed library
+	  predicates now uses code specific to these predicates.
+
+2006-06-14 Wednesday 19:20  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.9): Add tests of the rest of the
+	  system-returning methods.
+
+2006-06-14 Wednesday 19:20  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.11), Direct_Product.inlines.hh
+	  (1.12), Direct_Product.templates.hh (1.8): Add relation_with(g).
+	  Define Direct_Product(gs), Direct_Product(cbox) and the rest of
+	  the system-returning methods.
+
+2006-06-14 Wednesday 16:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc.m4,
+	  C/ppl_interface_generator_c_h.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[29,11,6,6,22,14]): Improved and corrected macro
+	  definitions for m4_filter and m4_filter_all.	Started passing the
+	  class number instead of the m4_interface_class_name and
+	  m4_cplusplus_class_name as arguments to macros.
+
+2006-06-12 Monday 19:00  Matthew Mundell
+
+	* src/Direct_Product.defs.hh (1.10), src/Direct_Product.inlines.hh
+	  (1.11), src/Direct_Product.templates.hh (1.7),
+	  src/Direct_Product.types.hh (1.2), tests/Grid/directproduct2.cc
+	  (1.2): Introduce Reduced_Product.  Move most Direct_Product
+	  reduce methods into Reduced_Product.
+
+2006-06-12 Monday 18:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[28,10,21,13,14]): Revised the way the pattern
+	  replacements are defined and revised the code for replacement.
+
+	  Extended the prolog_dat.m4 list of predicates that can generate
+	  code for BD_Shape to match that of the C interface (and removed a
+	  bug that prevented BD_Shape widening compiling).
+
+2006-06-12 Monday 17:27  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.38), directproduct1.cc (1.8),
+	  directproduct2.cc (1.1): Add tests of time_elapse_assign(dp) and
+	  topological_closure_assign() to directproduct1.  Add
+	  directproduct2.  Move directproduct1 reduce tests into
+	  directproduct2.
+
+2006-06-12 Monday 17:26  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.9), Direct_Product.inlines.hh
+	  (1.10): Declare Generator_System constructors.  Implement
+	  time_elapse_assign(dp) and topological_closure_assign().
+
+2006-06-12 Monday 16:03  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.7): Add tests of
+	  difference_assign(y) and of the affine transformation methods.
+
+2006-06-12 Monday 16:03  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.8), Direct_Product.inlines.hh
+	  (1.9), Direct_Product.templates.hh (1.6): Declare Generator
+	  adding methods.  Implement difference_assign(y) and the affine
+	  transformation methods.
+
+2006-06-12 Monday 16:02  Matthew Mundell
+
+	* tests/Grid/: generalizedaffinepreimage1.cc (1.12),
+	  generalizedaffinepreimage2.cc (1.12): Move
+	  generalizedaffinepreimage2 test06 into
+	  generalizedaffinepreimage1.
+
+2006-06-11 Sunday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[27,11,20,20,13]): Corrected a bug introduced for
+	  formatting.
+
+	  Revised the use of generator to grid_generator to match changes
+	  due to merge from the trunk.
+
+	  Removed the use of alt_box replacement for the grid
+	  "get_covering_box" and "get_bounding_box", by providing the code
+	  explicitly.
+
+	  Now the "alt_" replacement is not used anymore and this option
+	  for defining replacements will be removed later when other
+	  improvements here are made..
+
+2006-06-11 Sunday 09:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence_System.cc, src/Direct_Product.defs.hh,
+	  src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_public.cc,
+	  src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Makefile.am, src/Polyhedron.defs.hh, src/globals.defs.hh,
+	  tests/print.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	  tests/Grid/contains1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	  tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	  tests/Grid/timeelapse1.cc, tests/Grid/topclosed1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc
+	  (interfaces.[1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  First merge from the main trunk.
+
+2006-06-10 Saturday 12:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.9):
+	  Comment improved.
+
+2006-06-10 Saturday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.[26,8,19,19]): Bug fixed in
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+
+	  Comments improved.
+
+	  Improvements to formatting.
+
+2006-06-10 Saturday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4 (interfaces.[18,12]):
+	  Now using `@' as a pattern delimiter.
+
+2006-06-10 Saturday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.7): Changed macro m4_pattern_delimiter so as to use
+	  `@' as a delimiter.
+
+2006-06-10 Saturday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_dat.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[10,18,9]): Now
+	  patterns are delimited by `@'.
+
+2006-06-10 Saturday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.25):
+	  Changed macros m4_extension and m4_pattern_delimiter so as to
+	  allow for the use of `@' as a pattern delimiter.
+
+2006-06-09 Friday 23:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.[24,7,17,17]): Revised the way the groups of classes
+	  are defined and used.  Thus the selection and deselection of a
+	  procedure for a given group or class kind is clearer and easier
+	  to extend.  An initial list of groups and the classes they
+	  include is provided in ppl_interface_generator_common_dat.m4.
+
+	  Also, allow for arity and the attribute "nofail" to be optionally
+	  defined and occur anywhere in the info text after the procedure
+	  name.
+
+2006-06-09 Friday 16:07  Matthew Mundell
+
+	* tests/Grid/expandspacedim1.cc (1.10): Add the description to the
+	  print message in test04.
+
+2006-06-09 Friday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/expandspacedim1.cc (altnum.1): file expandspacedim1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-09 Friday 16:06  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.6): Add tests of the dimension
+	  changing methods.
+
+2006-06-09 Friday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (interfaces.1): file
+	  directproduct1.cc was added on branch interfaces on 2006-06-11
+	  07:13:48 +0000
+
+2006-06-09 Friday 16:02  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.7), Direct_Product.inlines.hh
+	  (1.8), Direct_Product.templates.hh (1.5): Rename methods,
+	  replacing "generator" with "grid_generator".	Add
+	  grid_generators() and minimized_grid_generators().  Implement
+	  congruences(), add_grid_generator(g),
+	  add_grid_generator_and_minimize(g) and the dimension changing
+	  methods.
+
+2006-06-09 Friday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (interfaces.1): file
+	  Direct_Product.templates.hh was added on branch interfaces on
+	  2006-06-11 07:13:47 +0000
+
+2006-06-09 Friday 14:06  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.12): Add test12.
+
+2006-06-09 Friday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims2.cc (altnum.1): file
+	  removespacedims2.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-09 Friday 14:05  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.9): Correct the dim_kinds to congruence
+	  mapping assumed in the congruence case of
+	  remove_higher_space_dimensions.
+
+2006-06-09 Friday 13:59  Matthew Mundell
+
+	* tests/Grid/concatenate1.cc (1.12): Order the known_cgs insertions
+	  in test05 by dimension.
+
+2006-06-09 Friday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/concatenate1.cc (altnum.1): file concatenate1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 20:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (interfaces.4): Added a few comments.
+
+2006-06-08 Thursday 20:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4 (interfaces.[23,6]):
+	  Updated so as to exploit the configuration-generated information
+	  about the required instantiations.
+
+2006-06-08 Thursday 20:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am, Prolog/Makefile.am,
+	  Prolog/Ciao/Makefile.am, Prolog/GNU/Makefile.am,
+	  Prolog/SICStus/Makefile.am, Prolog/SWI/Makefile.am,
+	  Prolog/XSB/Makefile.am, Prolog/YAP/Makefile.am
+	  (interfaces.[2,2,3,4,2,2,2,2]): Updated so as to allow m4 to
+	  include from $(top_buildir)/interfaces.
+
+2006-06-08 Thursday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  YAP/ppl_interface_generator_yap_cc.m4 (interfaces.[5,3]): Added
+	  useful comments.
+
+2006-06-08 Thursday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.6): Adapted to new style of common macros. Also added
+	  a few coments.
+
+2006-06-08 Thursday 19:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.11): Added a cople of newlines where needed.
+
+2006-06-08 Thursday 19:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_interface_generator_c_h.m4,
+	  C/ppl_interface_generator_c_cc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[5,5,12]): Adapted to new style of global macros.
+	  Also added a few comments.
+
+2006-06-08 Thursday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.16):
+	  Use commas to separate entries in m4_procedure_list.
+
+2006-06-08 Thursday 19:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (interfaces.8):
+	  Added a few missing commas that were at the origina of a
+	  debugging nightmare.
+
+2006-06-08 Thursday 19:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.22): The
+	  common macros changed so as to prefer working with explicit
+	  arguments rather than global macros. There still are global
+	  macros, but these are restricted to be the ones defined in the
+	  _dat files.
+
+2006-06-08 Thursday 12:05  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (1.11),
+	  tests/Grid/addcongruences1.cc (1.14), tests/Grid/addgenerator1.cc
+	  (1.13), tests/Grid/addgenerators1.cc (1.12),
+	  tests/Grid/addspacedims1.cc (1.12), tests/Grid/affinedim1.cc
+	  (1.10), tests/Grid/affineimage1.cc (1.11),
+	  tests/Grid/affineimage2.cc (1.8), tests/Grid/affinepreimage1.cc
+	  (1.10), tests/Grid/affinepreimage2.cc (1.5),
+	  tests/Grid/asciidumpload1.cc (1.11), tests/Grid/asciidumpload2.cc
+	  (1.4), tests/Grid/bounded1.cc (1.11), tests/Grid/boundingbox1.cc
+	  (1.12), tests/Grid/boundingbox2.cc (1.9), tests/Grid/bounds1.cc
+	  (1.13), tests/Grid/certificate1.cc (1.11),
+	  tests/Grid/congruences1.cc (1.10), tests/Grid/contains1.cc
+	  (1.10), tests/Grid/coveringbox1.cc (1.12),
+	  tests/Grid/coveringbox2.cc (1.9), tests/Grid/directproduct1.cc
+	  (1.5), tests/Grid/discrete1.cc (1.5), tests/Grid/disjoint1.cc
+	  (1.9), tests/Grid/equals1.cc (1.10),
+	  tests/Grid/expandspacedim1.cc (1.9), tests/Grid/foldspacedims1.cc
+	  (1.9), tests/Grid/generalizedaffineimage1.cc (1.10),
+	  tests/Grid/generalizedaffineimage2.cc (1.9),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.11),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.11),
+	  tests/Grid/generators1.cc (1.11), tests/Grid/grid1.cc (1.16),
+	  tests/Grid/griddifference1.cc (1.10), tests/Grid/intersection1.cc
+	  (1.9), tests/Grid/isempty1.cc (1.6), tests/Grid/join1.cc (1.14),
+	  tests/Grid/join2.cc (1.9), tests/Grid/limitedextrapolation1.cc
+	  (1.10), tests/Grid/limitedextrapolation2.cc (1.4),
+	  tests/Grid/limitedextrapolation3.cc (1.3),
+	  tests/Grid/mapspacedims1.cc (1.9), tests/Grid/maxmin1.cc (1.10),
+	  tests/Grid/membytes1.cc (1.6), tests/Grid/mingenerators1.cc
+	  (1.8), tests/Grid/outputoperator1.cc (1.7),
+	  tests/Grid/relations2.cc (1.12), tests/Grid/relations3.cc (1.4),
+	  tests/Grid/removespacedims1.cc (1.12),
+	  tests/Grid/removespacedims2.cc (1.11), tests/Grid/timeelapse1.cc
+	  (1.9), tests/Grid/topclosed1.cc (1.10), tests/Grid/widening1.cc
+	  (1.13), tests/Grid/widening2.cc (1.6), tests/Grid/widening3.cc
+	  (1.3), src/Direct_Product.defs.hh (1.6),
+	  src/Direct_Product.inlines.hh (1.7),
+	  src/Direct_Product.templates.hh (1.4), src/Grid.defs.hh (1.24),
+	  src/Grid.templates.hh (1.15), src/Grid_public.cc (1.31),
+	  src/Grid_widenings.cc (1.9), tests/print.cc (1.26): Rename
+	  Grid_Generator methods, replacing "generator" with
+	  "grid_generator".
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruence1.cc (altnum.1): file addcongruence1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruences1.cc (altnum.1): file addcongruences1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerator1.cc (altnum.1): file addgenerator1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerators1.cc (altnum.1): file addgenerators1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addspacedims1.cc (altnum.1): file addspacedims1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinedim1.cc (altnum.1): file affinedim1.cc was added
+	  on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage1.cc (altnum.1): file affineimage1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage1.cc (altnum.1): file affinepreimage1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage2.cc (altnum.1): file affinepreimage2.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload2.cc (altnum.1): file asciidumpload2.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounded1.cc (altnum.1): file bounded1.cc was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounds1.cc (altnum.1): file bounds1.cc was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences1.cc (altnum.1): file congruences1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/contains1.cc (altnum.1): file contains1.cc was added
+	  on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox1.cc (altnum.1): file coveringbox1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/disjoint1.cc (altnum.1): file disjoint1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators1.cc (altnum.1): file generators1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/griddifference1.cc (altnum.1): file griddifference1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/intersection1.cc (altnum.1): file intersection1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isempty1.cc (altnum.1): file isempty1.cc was added on
+	  branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join1.cc (altnum.1): file join1.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join2.cc (altnum.1): file join2.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation1.cc (altnum.1): file
+	  limitedextrapolation1.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation2.cc (altnum.1): file
+	  limitedextrapolation2.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation3.cc (altnum.1): file
+	  limitedextrapolation3.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mapspacedims1.cc (altnum.1): file mapspacedims1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/maxmin1.cc (altnum.1): file maxmin1.cc was added on
+	  branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mingenerators1.cc (altnum.1): file mingenerators1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator1.cc (altnum.1): file outputoperator1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations3.cc (simplex.1): file relations3.cc was
+	  added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims1.cc (altnum.1): file
+	  removespacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/timeelapse1.cc (altnum.1): file timeelapse1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosed1.cc (altnum.1): file topclosed1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening1.cc (altnum.1): file widening1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening3.cc (altnum.1): file widening3.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 08:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc.m4,
+	  Ciao/ppl_interface_generator_ciao_pl.m4 (interfaces.[11,5]):
+	  Corrected a bug in _ciao_pl.m4.
+
+	  Corrected a bug in the addition of the extra widening code in
+	  _icc.m4.  Also removed code that checked the number of binop
+	  replacements for that class: this is because, now LP_Problem is a
+	  fixed class, all the classes denote domains with at least one
+	  binary operator.
+
+2006-06-07 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, interfaces/Makefile.am (interfaces.[4,1]): Finished
+	  the support for the --enable-instantiations configuration option.
+
+2006-06-07 Wednesday 21:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.10): Fixed a bug in the expansion of num_binops for
+	  generating the Prolog ppl_prolog.icc.
+
+2006-06-07 Wednesday 17:46  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.4): Add tests of
+	  intersection_assign and upper_bound_assign.  Enable the grid
+	  generator constructor tests.
+
+2006-06-07 Wednesday 17:44  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.5), Direct_Product.inlines.hh
+	  (1.6), Direct_Product.templates.hh (1.3): Add
+	  empty_reduce_d1_with_d2() and empty_reduce_d2_with_d1().  Define
+	  add_generator().  Add Grid Polyhedron specialisations off
+	  add_generator() and of the grid generator constructors.  Take out
+	  grid methods intersection_assign_and_minimize,
+	  join_assign_and_minimize and join_assign_if_exact.
+
+2006-06-07 Wednesday 15:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.5):
+	  is_disjoint_from is also defined for BD shapes.
+
+2006-06-07 Wednesday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.4):
+	  Restored join_assign and join_assign_and minimize for Grids.
+
+2006-06-07 Wednesday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.10): Added spaces at the end of function definitions
+	  to improve readability of generated file. Try to avoid spurious
+	  indentations in the definnition of parameter lists.
+
+2006-06-07 Wednesday 14:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.3):
+	  The first 5 binary operators are common to all instantiations.
+	  Polyhedra and BD_Shape have some *further* binary operators with
+	  instantiation specific names.  For simplicity, do NOT have
+	  binminop's depend on binop's.
+
+2006-06-07 Wednesday 14:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_dat.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[9,15,7]): Method
+	  concatenate_assign is now dealt with as all the other binary
+	  operators.
+
+2006-06-07 Wednesday 14:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  C/ppl_interface_generator_c_h_code.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[2,8,14,6,9]): Swap generator and grid generator in
+	  replacement code.
+
+2006-06-07 Wednesday 14:16  Matthew Mundell
+
+	* tests/Grid/: join1.cc (1.13), join2.cc (1.8): Move join1 test12
+	  to join2.  Add join2 test13, to test
+	  upper_bound_assign_and_minimize().
+
+2006-06-07 Wednesday 14:14  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.23), Grid.inlines.hh (1.8): Add
+	  upper_bound_assign_and_minimize().
+
+2006-06-07 Wednesday 13:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.16): Include file
+	  ppl_interface_generator_common_dat.m4 instead of repeating
+	  language independent macros. Prefer dnl to # for m4 comments.
+
+2006-06-07 Wednesday 13:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.13):
+	  Include ppl_interface_generator_common_dat.m4 instead of
+	  repeating language independent macros. LP_Problem is always
+	  interfaced. Dropped arities from name of procedures.
+
+2006-06-07 Wednesday 13:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[7,5]): Dropped
+	  trailing underscore from patterns TOPOLOGY_ and INTOPOLOGY_.
+
+2006-06-07 Wednesday 13:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.21):
+	  Simplified macro m4_replace_class_patterns.
+
+2006-06-07 Wednesday 13:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.1):
+	  The common (i.e., language indepedent) part of
+	  ppl_interface_generator_<LANG>_dat.m4 moved here to avoid
+	  inconsistencies.
+
+2006-06-07 Wednesday 12:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.[20,5]): Added a macro "m4_pattern_delimiter".  This
+	  is defined in ppl_interface_generator_common.m4 as `4' and
+	  Prolog/ppl_interface_generator_prolog_systems.m4 as `4'.
+
+	  When the patterns in the procedure macro names have no
+	  delimeters, and when the code has @ delimiter, these must be
+	  changed, the common definition to `@' and the system definition
+	  to `'.
+
+2006-06-07 Wednesday 10:33  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.3): Add is_universe() tests.
+
+2006-06-06 Tuesday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.15): Bug corrected.
+
+2006-06-06 Tuesday 21:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble
+	  (interfaces.[14,8,4]): term_to_polyhedron_handle and similar are
+	  now with the class name (polyhedron) in capitals.  Many of the
+	  BD_Shape procedures are now compiling ok in the Prolog interface.
+
+2006-06-06 Tuesday 18:54  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.2): Add tests of is_empty() and
+	  reduce().
+
+2006-06-06 Tuesday 18:52  Matthew Mundell
+
+	* tests/Grid/bhz03widening1.cc (1.9): Correct spacing.
+
+2006-06-06 Tuesday 18:52  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.4), Direct_Product.inlines.hh
+	  (1.5), Direct_Product.templates.hh (1.2): Implement is_empty and
+	  is_universe.	Specialise the reduce methods for
+	  Direct_Product<NNC_Polyhedron, Grid>.
+
+2006-06-06 Tuesday 17:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble
+	  (interfaces.[13,7,3]): LP_Problem is no longer generated with the
+	  other classes.  In the dat.m4 file, all the LP_Problem procedures
+	  are listed as "library procedures" for the system Prolog files.
+
+2006-06-06 Tuesday 16:05  Matthew Mundell
+
+	* src/: Congruence.defs.hh (1.12), Congruence.inlines.hh (1.11):
+	  Take out the private version of modulus().
+
+2006-06-06 Tuesday 15:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/exceptions.hh,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (interfaces.[19,2,12,9,6,2]): In
+	  ppl_interface_generator_common.m4, revised `m4_get_code_schema'
+	  to correct a bug.
+
+	  In the Prolog directory Allow for exceptions for any user class
+	  when using ppl class handles. There is one common exception
+	  called ppl_handle_mismatch for all classes.
+
+	  The code for term_to_polyhedron_handle and similar is now
+	  replaced by a schema that generates this code for all the user
+	  classes.
+
+	  The procedure list has XBD_Shape everywhere and the user class
+	  BD_Shape<int8_t> added to the list of classes being tested.
+
+2006-06-06 Tuesday 14:09  Matthew Mundell
+
+	* src/: Direct_Product.inlines.hh (1.4),
+	  Direct_Product.templates.hh (1.1), Makefile.am (1.154): Add
+	  Direct_Product.templates.hh.	Move reduce() and ascii_load(s)
+	  there.  Add inline keyword to all inline methods definitions.
+
+2006-06-06 Tuesday 13:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.12):
+	  Use @ instead of , to separate instances.
+
+2006-06-06 Tuesday 13:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (interfaces.6):
+	  Corrected code schemas using pattern DESCRIBE.
+
+2006-06-06 Tuesday 13:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh, BD_Shape.inlines.hh,
+	  BD_Shape.templates.hh (interfaces.[1,1,1]): Added methods:
+	  shrink_bounding_box	is_topologically_closed
+	  topologcal_closure_assign   is_disjoint_from
+	  add_recycled_constraints   add_recycled_constraints_and_minimize.
+
+2006-06-06 Tuesday 12:33  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.37), asciidumpload7.cc (1.1),
+	  directproduct1.cc (1.1): Add directproduct1 and asciidumpload7.
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (altnum.1): file asciidumpload7.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (interfaces.1): file
+	  asciidumpload7.cc was added on branch interfaces on 2006-06-11
+	  07:13:48 +0000
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (octagons.1): file asciidumpload7.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (simplex.1): file asciidumpload7.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-06-05 Monday 19:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.18):
+	  Fixed an old bug whereby "Polyhedron" could not be used to
+	  indicate that that was the only class to be coded for the
+	  schematic procedure name.
+
+2006-06-05 Monday 17:43  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.3), Direct_Product.inlines.hh
+	  (1.3): Add Direct_Product(bbox).
+
+2006-06-05 Monday 17:41  Matthew Mundell
+
+	* src/Grid.defs.hh (1.22), src/Grid_public.cc (1.30),
+	  tests/Grid/topclosed1.cc (1.9): Update is_topologically_closed to
+	  return true always.
+
+2006-06-05 Monday 17:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4, C/ppl_c.cc,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[17,1,11,5]): Fixed a bug in the Prolog dat.m4 file.
+	  Changed the separator in the input list to be an @ and not a ,.
+
+2006-06-05 Monday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.11):
+	  Temporarily disable the generation of a few functions in some
+	  interfaces.
+
+2006-06-05 Monday 17:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (interfaces.4): Corrected comment in the first line.
+
+2006-06-05 Monday 17:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.8): Prefer dnl to ifelse to have an m4 comment.
+
+2006-06-05 Monday 15:49  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.18): Add test23, which tests
+	  Linear_Expression(const Grid_Generator&).
+
+2006-06-05 Monday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generator1.cc (altnum.1): file generator1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-05 Monday 15:48  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh (1.23), Linear_Expression.cc (1.12),
+	  Linear_Expression.defs.hh (1.26): Add Linear_Expression(const
+	  Grid_Generator&).
+
+2006-06-05 Monday 14:55  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.21), Polyhedron.defs.hh (1.298): Correct
+	  type of get_lower_bound and get_upper_bound `closed' arguments in
+	  docs.
+
+2006-06-05 Monday 14:54  Matthew Mundell
+
+	* src/Grid.templates.hh (1.14): Add initialisation of box
+	  constructor closed flag variables.
+
+2006-06-05 Monday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.10):
+	  Octagon renamed Octagonal_Shape.  join_assign renamed
+	  upper_bound_assign.
+
+2006-06-05 Monday 12:11  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.2), Direct_Product.inlines.hh
+	  (1.2): Add domain1(), domain2(), reduce_domain1_with_domain2(),
+	  reduce_domain2_with_domain1(), reduce(), OK(), ascii methods and
+	  operator<<.  Implement some of the already defined methods.
+
+2006-06-05 Monday 12:09  Matthew Mundell
+
+	* src/globals.defs.hh (1.37): Add macro
+	  PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS.
+
+2006-06-05 Monday 10:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.16): In
+	  macro m4_replace_pattern, which gets called several times and
+	  re-defines the same macros (PATTERN, num_strings, etc.) each
+	  time, prefer using bultins pushdef and popdef instead of define.
+	  Same change in m4_all_classes_loop.  Prefer using pattern
+	  4CPP_CLASS4 to 4SYSCLASS4.  Macro m4_replace_with_code renamed as
+	  m4_get_code_schema.  Macro m4_filter changed so as to perform
+	  filtering by using m4_class_kind instead of m4_class.
+
+2006-06-05 Monday 10:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (interfaces.5):
+	  The CPP macro PPL_TYPE_DECLARATION made more readable by adding
+	  line breaks.
+
+2006-06-05 Monday 10:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (interfaces.5):
+	  In the code schemas, using pattern 4CPP_CLASS4 instead of 4CLASS4
+	  where appropriate.
+
+2006-06-05 Monday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (interfaces.4): The
+	  class preamble changed to invoke DECLARE_CONVERSIONS with two
+	  arguments.
+
+2006-06-05 Monday 10:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble
+	  (interfaces.4): The CPP macro DEECLARE_CONVERSIONS changed to
+	  take two arguments so as to also accomodate for the case of
+	  templatic classes, where the interface class name is different
+	  from the C++ class name in a nontrivial way.
+
+2006-06-05 Monday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (interfaces.4):
+	  Prefer dnl to # for m4 comments.
+
+2006-06-05 Monday 10:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.9):
+	  Prefer dnl to # to implement m4 comments.  Let the macros
+	  m4_class_group and m4_class_super_group take an argument instead
+	  of having its value hard-wired in.  The macro
+	  m4_pattern_substitution_list renamed as m4_patter_list (because
+	  it only list patterns and not their substitutions); dropped a
+	  mismatched parenthesis at the end of the list.
+
+2006-06-05 Monday 09:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (interfaces.[15,7]):
+	  Renamed and changed macro "m4_set_class" to
+	  "m4_replace_class_patterns".
+
+	  New version allows for different patterns for the class name so
+	  as to differentiate between the different applications of the
+	  pattern (user name, C++ name and the kind of class).
+
+2006-06-04 Sunday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[14,8,10,4]): In ppl_interface_generator_common.m4,
+	  changed the macro name set_schema_strings to
+	  replace_all_patterns.
+
+	  The same name change in C/ppl_interface_generator_c_dat.m4 and
+	  Prolog/ppl_interface_generator_prolog_dat.m4 where this macro is
+	  defined.
+
+	  In the Prolog interface, the and_embed and and_project combined
+	  into one schema as already done in the C interface.
+
+	  In response to a FIXME comment in the C interface code, the
+	  concatenate_assign is now included in the schema corresponding to
+	  the binop pattern. This change has only been done in the Prolog
+	  interface.
+
+2006-06-04 Sunday 22:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.13):
+	  Added example for m4_get_name_components.  Entended macro
+	  m4_all_classes_loop to define more macros about the current class
+	  name - its components and type.  Added an example to show what is
+	  defined.
+
+2006-06-04 Sunday 16:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  C/ppl_interface_generator_c_h_code.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[12,4,7,4,9,6,3]): All the patterns have been changed
+	  to 4PATTERN4 or 4UALT_PATTERN4 or 4UPATTERN4 or 4ALT_PATTERN4.
+	  Several patterns have improved names.  The pattern M4_CLASS is
+	  replaced by 4CLASS4 everywhere.
+
+2006-06-03 Saturday 16:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (interfaces.4):
+	  Some formatting.  Declare print functions for congruences, grid
+	  generatorsand their systems.
+
+2006-06-03 Saturday 16:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (interfaces.3):
+	  Classes should be declared outside of the Doxygen documentation
+	  block listing their functions.
+
+2006-06-03 Saturday 16:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.6):
+	  Classes should be declared outside of the Doxygen comment block
+	  listing their functions.
+
+2006-06-03 Saturday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[3,3]): We now
+	  have a single ppl_new_<classname>_from_space_dimension() method,
+	  also taking an integer (interpreted as a Boolean) dictating
+	  whether or not the new object has to be empty or universe.
+
+2006-06-03 Saturday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_h_preamble (interfaces.[3,3]): Added a
+	  lot of (fixed, i.e., non m4-generated) interface code for the
+	  handling of congruences, grid generators and their systems.
+
+2006-06-03 Saturday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (interfaces.[11,5]):
+	  Renamed m4_set_string by m4_replace_pattern.
+
+2006-06-03 Saturday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.10):
+	  Prefer dnl to # when writing m4 comments.
+
+	  In macro m4_set_string(), made the following substitutions for
+	  readability:	- ustring	      ==> PATTERN  - actual_string
+	       ==> replacement	- alt_actual_string   ==> alt_replacement
+	  - Uactual_string	==> Replacement  - Ualt_actual_string  ==>
+	  Alt_Replacement
+
+	  Macros m4_init_*_classes() now take a single argument. The
+	  counter is only used by the auxiliary macros
+	  m4_init_*_classes_aux().
+
+2006-06-03 Saturday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc.m4,
+	  ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_dat.m4, ppl_interface_generator_c_h.m4,
+	  ppl_interface_generator_c_h_code.m4,
+	  ppl_interface_generator_c_h_preamble
+	  (interfaces.[3,2,2,5,2,2,2]): Corrected so as to use M4_CLASS and
+	  the new common functions defined by Pat.  Also made further steps
+	  towards the generation of the Grid C interface.
+
+2006-06-02 Friday 11:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[9,8]):
+	  Improved some comments.  Removed the definition and use of the
+	  short_class_name.
+
+2006-06-02 Friday 10:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[8,7]):
+	  Revised the way the user list of classes is handled and now the
+	  list of classes for both the interface names and the C++
+	  procedures must be a comma separated sequence.
+
+2006-06-02 Friday 08:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[7,6]):
+	  Changed the way the list of classes to be supported is given and
+	  how these are handled.  This aims to allow for automatic
+	  generation of these lists by the configure file.
+
+	  The current code will support the classes such as Polyhhedron,
+	  LP_Problem, Grid and also those such as BD_Shape<int8_t> with a
+	  numeric type.
+
+2006-06-01 Thursday 12:26  Matthew Mundell
+
+	* tests/Grid/coveringbox1.cc (1.11): Update test13 to DO_TEST_F16.
+
+2006-06-01 Thursday 11:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (interfaces.[6,4,4,4,3,3,3,3,2]): The macro "m4_extension" is now
+	  defined directly in the Prolog systems m4 files. The macro
+	  "extension" is no more.
+
+	  This change only affects the Prolog interface as the default
+	  definition for "m4_extension" for the C++ and C files is in the
+	  common.m4 file.
+
+	  Also, in common.m4, the internal counters for calls to
+	  m4_forloop, renamed as m4_i.
+
+2006-06-01 Thursday 10:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[5,5,4,2]): The dynamically created macro "class" is
+	  now "m4_class".  The fixed list of classes "Class`'i is now
+	  m4_Class`'i The pattern CLASS is now M4_CLASS The pattern cLASS
+	  is now M4_lCLASS (l = lower case) Note that these changes need
+	  propagating in the C interface files.
+
+2006-06-01 Thursday 08:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.[4,4,4]): The dat.m4 file for the C interface is
+	  updated with changes to that in the prolog interface.
+
+	  Comments in the Prolog interface dat.m4 file improved.
+
+	  The arity "/" symbol is now optional for the procedure schema
+	  names - but this needs testing in the C interface.
+
+2006-05-31 Wednesday 23:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.[3,3,3,3]): Redone some code so that more is common -
+	  ie avoid having similar definitions in different files.  Changes
+	  to macro names will break the C interface m4 code and the
+	  "_dat.m4" will need revising.
+
+2006-05-31 Wednesday 22:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (interfaces.3): We now have to configure file
+	  ppl_c_version.h.in (not ppl_c.h.in).
+
+2006-05-31 Wednesday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, instchk.hh (interfaces.[2,2]): Correctly check for
+	  valid instantiations.
+
+2006-05-31 Wednesday 18:04  Matthew Mundell
+
+	* tests/Grid/congruences2.cc (1.3): Rename helper function
+	  `fulfils' to `satisfies'.  Correct test08.
+
+2006-05-31 Wednesday 17:16  Matthew Mundell
+
+	* tests/Grid/congruences2.cc (1.2): Convert the fulfils generator
+	  system parameter into a generator.
+
+2006-05-31 Wednesday 17:15  Matthew Mundell
+
+	* tests/Grid/affinepreimage1.cc (1.9): Convert test12 FIXME into a
+	  TODO.
+
+2006-05-31 Wednesday 17:14  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (1.12): Correct indentation of
+	  messages.  Turn test04 into a divisor test.
+
+2006-05-31 Wednesday 16:18  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (1.13): Leave the
+	  remove_space_dimensions swap_columns Matrix qualifiers as they
+	  are.
+
+2006-05-31 Wednesday 16:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (interfaces.1): A first attempt at
+	  generating automatically ppl_c.h.
+
+2006-05-31 Wednesday 16:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (interfaces.1): Factored out the
+	  tiny part of ppl_c.h depending on PPL version number.
+
+2006-05-31 Wednesday 16:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_h.m4,
+	  ppl_interface_generator_c_h_code.m4,
+	  ppl_interface_generator_c_h_preamble (interfaces.[1,1,1]): First
+	  attempt at generating file ppl_c.h.
+
+2006-05-31 Wednesday 16:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.3):
+	  Dropping useless nofail attributes.
+
+2006-05-31 Wednesday 16:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (interfaces.2):
+	  Using new common macro names.
+
+2006-05-31 Wednesday 16:05  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.8): Covert FIXMEs in expand_space_dimension
+	  and fold_space_dimensions to TODOs.
+
+2006-05-31 Wednesday 16:04  Matthew Mundell
+
+	* src/Grid_public.cc (1.29): Take FIXME out of
+	  generalized_affine_preimage/3.
+
+2006-05-31 Wednesday 15:17  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (1.16): Add namespace to
+	  operator== friend declaration.
+
+2006-05-31 Wednesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (interfaces.1): Allow instantiation with Grid of the
+	  non-C++ interfaces.
+
+2006-05-31 Wednesday 15:15  Matthew Mundell
+
+	* tests/Grid/boundingbox1.cc (1.11): Add int8 failure to test13
+	  invocation.
+
+2006-05-31 Wednesday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (interfaces.1): Restore the code for the
+	  --enable-instantiations configure option.
+
+2006-05-31 Wednesday 14:13  Matthew Mundell
+
+	* tests/Grid/coveringbox1.cc (1.10): Add int8 failure to test13
+	  invocation.
+
+2006-05-31 Wednesday 14:12  Matthew Mundell
+
+	* src/Grid.templates.hh (1.13): Move the Grid box constructor
+	  point_divisor declarations into the blocks that use them.
+
+2006-05-31 Wednesday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (interfaces.3): Let also GNU
+	  Prolog compile.
+
+2006-05-31 Wednesday 13:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc, GNU/Makefile.am,
+	  GNU/ppl_gprolog.pl, GNU/ppl_interface_generator_gprolog_pl.m4,
+	  SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  SWI/ppl_swiprolog.cc, XSB/ppl_interface_generator_xsb_H.m4,
+	  XSB/ppl_interface_generator_xsb_cc.m4, XSB/ppl_xsb.H,
+	  XSB/ppl_xsb.cc, YAP/ppl_yap.cc
+	  (interfaces.[1,2,1,3,2,1,2,2,1,1,1]): Got rid of automatically
+	  generated files.
+
+2006-05-31 Wednesday 13:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/:
+	  ppl_interface_generator_sicstus_sd_cc.m4, ppl_sicstus_sd.cc
+	  (interfaces.[2,1]): Get rid of the ppl_sicstus_sd.cc (which is
+	  now generated automatically).
+
+2006-05-31 Wednesday 13:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am, ppl_ciao.pl,
+	  ppl_interface_generator_ciao_pl.m4 (interfaces.[2,1,3]): Let the
+	  automatically generated Ciao Prolog interface compile.
+
+2006-05-30 Tuesday 22:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (interfaces.[2,2,2,2,2,2,2]): Many of the fixed macro names are
+	  now prefixed by m4_.	Some internal codes improved.  The macros
+	  for generating the extensions for the Prolog systems moved to the
+	  prolog_systems.m4 file from the common.m4 file.
+
+2006-05-30 Tuesday 16:32  Matthew Mundell
+
+	* src/Grid.templates.hh (1.12): Use const references for
+	  point_divisor in the box constructors.
+
+2006-05-30 Tuesday 15:22  Matthew Mundell
+
+	* src/Grid.templates.hh (1.11): Update map_space_dimensions to
+	  throw an exception if the pfunc::maps call fails.
+
+2006-05-30 Tuesday 14:41  Matthew Mundell
+
+	* tests/Grid/grid3.cc (1.18): Correct DO_TEST invocations for
+	  test09 and test10.
+
+2006-05-30 Tuesday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid3.cc (altnum.1): file grid3.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-30 Tuesday 14:32  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.17), src/Congruence_System.cc (1.17),
+	  src/Grid_Generator.cc (1.13), src/Grid_Generator.defs.hh (1.22):
+	  Convert division operations to exact_div_assign calls.  Move
+	  Grid_Generator::scale_to_divisor to the private section.
+
+2006-05-30 Tuesday 13:57  Matthew Mundell
+
+	* src/Grid_public.cc (1.28): Move the modulus negation check back
+	  out of the congruence creation in generalized_affine_image/3 and
+	  generalized_affine_preimage/3.
+
+2006-05-30 Tuesday 13:46  Matthew Mundell
+
+	* src/Grid_conversion.cc (1.13): Convert division operations to
+	  exact_div_assign calls.
+
+2006-05-30 Tuesday 13:34  Matthew Mundell
+
+	* tests/Grid/: widening1.cc (1.12), widening2.cc (1.5): Correct
+	  indentation of messages.
+
+2006-05-30 Tuesday 13:33  Matthew Mundell
+
+	* tests/Grid/: boundingbox1.cc (1.10), coveringbox1.cc (1.9): Add
+	  tests with boxes of larger dimensions.
+
+2006-05-30 Tuesday 13:32  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.25): Update the reduce methods to create
+	  fewer temporaries explicitly and to use references to row[column]
+	  and pivot[column].
+
+2006-05-30 Tuesday 13:29  Matthew Mundell
+
+	* src/: Grid.templates.hh (1.10), Grid_Generator.defs.hh (1.21):
+	  Update the box constructors to create both systems.
+
+2006-05-29 Monday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc.m4,
+	  ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_dat.m4 (interfaces.[1,1,1,1]): Drafted
+	  a first attempt at generating one of the files (definitions) for
+	  interfacing polyhedra using C.
+
+2006-05-29 Monday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_copyright, Prolog/Makefile.am,
+	  Prolog/exceptions.hh,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/Makefile.am,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/GNU/Makefile.am,
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  Prolog/SICStus/Makefile.am,
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  Prolog/SWI/Makefile.am,
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  Prolog/XSB/Makefile.am,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  Prolog/YAP/Makefile.am,
+	  Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  Prolog/tests/Makefile.am, Prolog/tests/pl_grid_check.pl
+	  (interfaces.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Added m4 files for the generation of the Prolog interfaces.
+	  Modified makefiles so as to do their job in the new framework.
+	  (Tested only the SWI and YAP interfaces up to now).
+
+2006-05-26 Friday 07:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.178): Always use CHECK as
+	  early as possible.
+
+2006-05-25 Thursday 13:32  Matthew Mundell
+
+	* src/Grid_public.cc (1.27): Update affine_dimension() to use the
+	  minimized form of either system, preferring the generators.
+
+2006-05-25 Thursday 11:44  Matthew Mundell
+
+	* tests/Grid/relations3.cc (1.3): Print the congruences instead of
+	  the generators in test12.
+
+2006-05-25 Thursday 11:43  Matthew Mundell
+
+	* tests/Grid/grid2.cc (1.13): Correct DO_TEST invocations.
+
+2006-05-24 Wednesday 18:47  Matthew Mundell
+
+	* tests/Grid/: grid1.cc (1.15), grid3.cc (1.17): Update DO_TEST
+	  calls to reflect moved tests.
+
+2006-05-24 Wednesday 18:45  Matthew Mundell
+
+	* tests/Grid/grid2.cc (1.12): Correct comment about cong_test4.
+
+2006-05-24 Wednesday 18:45  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.11): Take out tracing calls to
+	  ascii_dump.
+
+2006-05-24 Wednesday 18:24  Matthew Mundell
+
+	* src/: Congruence_System.defs.hh (1.12),
+	  Congruence_System.inlines.hh (1.6), Grid.inlines.hh (1.7),
+	  Grid_nonpublic.cc (1.14), Grid_public.cc (1.26): Add private
+	  method Congruence_System::Congruence_System(d).  Update
+	  Grid::construct(const_gs) to only copy the given gs when needed.
+	  Update both Grid construct methods and their callers so that the
+	  initially constructed versions of con_sys and gen_sys are used
+	  when the grid is empty.
+
+2006-05-24 Wednesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.inlines.hh (altnum.1): file
+	  Congruence_System.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-05-24 Wednesday 18:18  Matthew Mundell
+
+	* src/Congruence.inlines.hh (1.10): Update zero_dim_false so that
+	  the inhomogeneous term of zdf is positive.
+
+2006-05-24 Wednesday 15:48  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (1.20): Update list of Grid friend
+	  declaration dependencies.
+
+2006-05-24 Wednesday 15:47  Matthew Mundell
+
+	* tests/Grid/relations3.cc (1.2): Add tests to cover the rest of
+	  relation_with(c).
+
+2006-05-24 Wednesday 15:46  Matthew Mundell
+
+	* src/Grid_public.cc (1.25): Complete relation_with(c).
+
+2006-05-24 Wednesday 14:10  Matthew Mundell
+
+	* src/: Scalar_Products.cc (1.5), Scalar_Products.defs.hh (1.7),
+	  Scalar_Products.inlines.hh (1.4): Add to Scalar_Product assign(z,
+	  c, gg), sign(c, gg), homogeneous_assign(z, gg, c) and
+	  homogeneous_sign(gg, c).
+
+2006-05-24 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.cc (altnum.1): file Scalar_Products.cc was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-05-24 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.defs.hh (altnum.1): file
+	  Scalar_Products.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-05-24 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.inlines.hh (altnum.1): file
+	  Scalar_Products.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-05-24 Wednesday 13:22  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.46): Improved the
+	  readability of
+	  Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-05-24 Wednesday 12:06  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.45): Improved the
+	  readability of   Octagonal_Shape<T>::generalized_affine_image().
+
+2006-05-23 Tuesday 16:27  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.44): Improved the
+	  readability of   Octagonal_Shape<T>::affine_image().
+
+2006-05-23 Tuesday 14:07  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.7): Update remove_higher_space_dimensions
+	  to also clear and resize the out-of-date system.
+
+2006-05-23 Tuesday 13:44  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.10): Add test10 and test11
+	  which test removal via congruences.
+
+2006-05-23 Tuesday 13:38  Matthew Mundell
+
+	* src/Grid.defs.hh (1.20), src/Grid_Generator_System.cc (1.12),
+	  src/Grid_Generator_System.defs.hh (1.15), src/Grid_chdims.cc
+	  (1.6), tests/Grid/removespacedims1.cc (1.11): Correct
+	  print_generator and print_congruence messages.  Add system
+	  printing to some tests.
+
+2006-05-23 Tuesday 13:28  Matthew Mundell
+
+	* src/: Congruence_System.cc (1.16), Congruence_System.defs.hh
+	  (1.11): Add remove_higher_space_dimensions(new_dimension).
+
+2006-05-23 Tuesday 11:57  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.43): Corrected a wrong
+	  parameter in the exeption throw in
+	  Octagonal_Shape<T>::remove_space_dimensions() and in the affine
+	  images and preimages.
+
+2006-05-19 Friday 13:57  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.36), relations3.cc (1.1): Add
+	  relations3, which tests Grid::relation_with(const Constraint&).
+
+2006-05-19 Friday 13:55  Matthew Mundell
+
+	* tests/Grid/: relations1.cc (1.12), relations2.cc (1.11): Correct
+	  indentation.	Improve a comment.
+
+2006-05-19 Friday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations1.cc (altnum.1): file relations1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-19 Friday 13:55  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.19), Grid_public.cc (1.24): Add
+	  relation_with(const Constraint& c).
+
+2006-05-18 Thursday 19:34  Matthew Mundell
+
+	* src/: C_Polyhedron.defs.hh (1.42), Grid.defs.hh (1.18),
+	  NNC_Polyhedron.defs.hh (1.45), Polyhedron.defs.hh (1.297):
+	  Replace phrases like "will be recycled" with phrases like "may be
+	  recycled".
+
+2006-05-18 Thursday 16:53  Matthew Mundell
+
+	* tests/Grid/Makefile.am (1.35): Drop writecongruencesystem1.dat
+	  from MOSTLYCLEANFILES.
+
+2006-05-18 Thursday 15:30  Matthew Mundell
+
+	* tests/BD_Shape/: addconstraints1.cc (1.13), affineimage1.cc
+	  (1.14), affinepreimage1.cc (1.14), bdsdifference1.cc (1.10),
+	  bdshull1.cc (1.10), bhmz05widening1.cc (1.10),
+	  cc76extrapolation1.cc (1.14), cc76narrowing1.cc (1.14),
+	  contains1.cc (1.12), fromgensys1.cc (1.13),
+	  generalizedaffineimage2.cc (1.15), generalizedaffinepreimage3.cc
+	  (1.2), intersection1.cc (1.13), limitedbhmz05extrapolation1.cc
+	  (1.9), limitedcc76extrapolation1.cc (1.10), relations2.cc (1.18),
+	  relations3.cc (1.15), removespacedims1.cc (1.14), timeelapse1.cc
+	  (1.13): Correct return values in exception tests.  As a result
+	  convert the value of d in affineimage1 test15 to 0 and do away
+	  with addconstraints1 test04 and test05 and affineimage1 test16.
+
+2006-05-18 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromgensys1.cc (altnum.1): file fromgensys1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-05-18 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage3.cc (simplex.1): file
+	  generalizedaffinepreimage3.cc was added on branch simplex on
+	  2006-09-06 18:41:54 +0000
+
+2006-05-18 Thursday 14:52  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.42): Improved the
+	  readability of   Octagonal_Shape(const Generator_System& gs)
+	  using type aliases.
+
+2006-05-18 Thursday 12:24  Matthew Mundell
+
+	* tests/Grid/: addcongruence1.cc (1.10), addcongruences1.cc (1.13),
+	  addconstraint1.cc (1.9), addconstraints1.cc (1.10),
+	  addgenerator1.cc (1.11), addgenerators1.cc (1.10),
+	  addspacedims1.cc (1.11), affineimage2.cc (1.7),
+	  affinepreimage2.cc (1.4), boundingbox1.cc (1.9), boundingbox2.cc
+	  (1.8), bounds1.cc (1.12), concatenate1.cc (1.11), congruence1.cc
+	  (1.13), contains1.cc (1.9), coveringbox1.cc (1.8), disjoint1.cc
+	  (1.8), expandspacedim1.cc (1.8), foldspacedims1.cc (1.8),
+	  generalizedaffineimage1.cc (1.9), generalizedaffinepreimage1.cc
+	  (1.10), generalizedaffinepreimage2.cc (1.10), generator1.cc
+	  (1.16), grid1.cc (1.14), grid3.cc (1.16), griddifference1.cc
+	  (1.9), intersection1.cc (1.8), join1.cc (1.12), join2.cc (1.7),
+	  limitedextrapolation1.cc (1.9), limitedextrapolation2.cc (1.3),
+	  limitedextrapolation3.cc (1.2), relations1.cc (1.11),
+	  relations2.cc (1.10), removespacedims1.cc (1.10),
+	  removespacedims2.cc (1.9), timeelapse1.cc (1.8), widening1.cc
+	  (1.11), widening2.cc (1.4), widening3.cc (1.2): Correct return
+	  values in exception tests.
+
+2006-05-18 Thursday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraint1.cc (altnum.1): file addconstraint1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-18 Thursday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraints1.cc (altnum.1): file addconstraints1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-18 Thursday 12:19  Matthew Mundell
+
+	* tests/Grid/Makefile.am (1.34): Add many ascii_dump_load*.dat
+	  files to MOSTLYCLEANFILES.
+
+2006-05-18 Thursday 11:53  Matthew Mundell
+
+	* tests/Grid/: grid1.cc (1.13), grid2.cc (1.11), grid3.cc (1.15):
+	  From grid3 move generator tests into grid1 and congruence tests
+	  into grid2.
+
+2006-05-18 Thursday 11:16  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.15): Add test22 which tries to get
+	  the divisor of a line.
+
+2006-05-18 Thursday 11:07  Matthew Mundell
+
+	* tests/Grid/asciidumpload1.cc (1.10): Add Grid_Status ascii_load
+	  tests.
+
+2006-05-17 Wednesday 21:39  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.33), asciidumpload5.cc (1.1),
+	  asciidumpload6.cc (1.1): Add asciidumpload5 and asciidumpload6
+	  which test Congruence and Congruence_System.
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload5.cc (altnum.1): file asciidumpload5.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload5.cc (octagons.1): file asciidumpload5.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload5.cc (simplex.1): file asciidumpload5.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload6.cc (altnum.1): file asciidumpload6.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload6.cc (octagons.1): file asciidumpload6.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload6.cc (simplex.1): file asciidumpload6.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:38  Matthew Mundell
+
+	* tests/Grid/: asciidumpload1.cc (1.9), asciidumpload3.cc (1.2),
+	  asciidumpload4.cc (1.2): Add tests of ascii_load failure.
+
+2006-05-17 Wednesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload3.cc (simplex.1): file asciidumpload3.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload4.cc (simplex.1): file asciidumpload4.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:36  Matthew Mundell
+
+	* src/Congruence_System.cc (1.15): Update ascii_load to return
+	  false if a congruence load fails.
+
+2006-05-17 Wednesday 16:37  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.41): Improved the
+	  readability of   Octagonal_Shape<T>::get_limiting_octagon().
+
+2006-05-17 Wednesday 15:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.40): Improved the
+	  readability of   Poly_Gen_Relation
+	  Octagonal_Shape<T>::relation_with().
+
+2006-05-17 Wednesday 14:40  Matthew Mundell
+
+	* tests/Grid/asciidumpload2.cc (1.3): Add zero dimension tests
+	  test15 and test16.
+
+2006-05-17 Wednesday 14:39  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.9): Add test13 which adds to a
+	  zero dim universe.  Correct returns in exception tests.
+
+2006-05-17 Wednesday 14:37  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.17), Grid_public.cc (1.23): Add an
+	  assertion that the given system has points in the zero dim case
+	  of add_recycled_generators.  Convert the exception in the zero
+	  dim case of add_recycled_generators_and_minimize to an assertion.
+
+2006-05-17 Wednesday 13:45  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.39): Changed the name
+	  of an index in       Octagonal_Shape<T>::add_constraint().
+	  Improved the readability of	   Poly_Con_Relation
+	  Octagonal_Shape<T>::relation_with().
+
+2006-05-17 Wednesday 13:12  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.32), generators2.cc (1.1),
+	  outputoperator3.cc (1.1): Add outputoperator3 which tests
+	  Grid_Generator_System IO operators.  Add generators2 which tests
+	  class Grid_Generator_System.
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators2.cc (altnum.1): file generators2.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators2.cc (octagons.1): file generators2.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators2.cc (simplex.1): file generators2.cc was
+	  added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator3.cc (altnum.1): file outputoperator3.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator3.cc (octagons.1): file
+	  outputoperator3.cc was added on branch octagons on 2006-11-18
+	  20:36:57 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator3.cc (simplex.1): file
+	  outputoperator3.cc was added on branch simplex on 2006-09-06
+	  18:41:55 +0000
+
+2006-05-17 Wednesday 13:09  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc (1.11),
+	  Grid_Generator_System.defs.hh (1.14): Convert the exceptions in
+	  remove_space_dimensions and remove_higher_space_dimensions into
+	  assertions.
+
+2006-05-17 Wednesday 12:07  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.38): Improved the
+	  readability of   Octagonal_Shape<T>::add_constraint().
+
+2006-05-17 Wednesday 11:02  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (octagons.9): Moved
+	  Octagonal_Shape<T>::is_empty() to the right place.  Corrected
+	  some wrong comments in the distances' code.
+
+2006-05-16 Tuesday 22:43  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.31), outputoperator2.cc (1.1): Add
+	  outputoperator2, to test Grid_Generator IO operators.
+
+2006-05-16 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator2.cc (altnum.1): file outputoperator2.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-16 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator2.cc (octagons.1): file
+	  outputoperator2.cc was added on branch octagons on 2006-11-18
+	  20:36:57 +0000
+
+2006-05-16 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator2.cc (simplex.1): file
+	  outputoperator2.cc was added on branch simplex on 2006-09-06
+	  18:41:55 +0000
+
+2006-05-16 Tuesday 22:38  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.14): Add test20 to test type() and
+	  test21 to test scale_to_divisor().
+
+2006-05-16 Tuesday 22:37  Matthew Mundell
+
+	* src/Grid_Generator.cc (1.12): Update set_is_parameter to convert
+	  the generator from a point only when it is a point.
+
+2006-05-16 Tuesday 22:35  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (1.19): Improve coefficient_swap
+	  description slightly.
+
+2006-05-16 Tuesday 15:54  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.12): Correct comment in test15.
+
+2006-05-16 Tuesday 15:48  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.30), asciidumpload3.cc (1.1),
+	  asciidumpload4.cc (1.1): Add asciidumpload3 and asciidumpload4
+	  for Congruence and Congruence_System.
+
+2006-05-16 Tuesday 15:46  Matthew Mundell
+
+	* tests/Grid/congruences1.cc (1.9): Turn off test09 and test18, as
+	  Congruence_System::concatenate is now private.
+
+2006-05-16 Tuesday 15:44  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (1.12): Move test15 to addcongruence1
+	  (test05).  Add exception tests test15 and test16.
+
+2006-05-16 Tuesday 15:40  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.11): Add test15 which minimizes
+	  a grid with minimized congruences and up to date generators.
+	  Correct return values in exception tests.
+
+2006-05-16 Tuesday 15:38  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (1.9): Add space dimension test
+	  test05.
+
+2006-05-16 Tuesday 15:37  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.13): Add a comment in the max_min
+	  method.
+
+2006-05-16 Tuesday 15:36  Matthew Mundell
+
+	* src/: Congruence_System.cc (1.14), Congruence_System.defs.hh
+	  (1.10): Move concatenate(cgs) into the private section, adding
+	  the requirement that cgs must contain rows.
+
+2006-05-16 Tuesday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (octagons.4): Avoid useless white space.
+
+2006-05-16 Tuesday 12:20  quartieri
+
+	* src/Og_Status.idefs.hh (octagons.3): Indentation fixed.
+
+2006-05-16 Tuesday 12:19  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (octagons.8): Moved some methods
+	  in the right place.
+
+2006-05-16 Tuesday 12:16  quartieri
+
+	* src/Octagonal_Shape.defs.hh (octagons.14): Corrected a wrong
+	  comment.
+
+2006-05-15 Monday 19:54  Matthew Mundell
+
+	* src/: Congruence.cc (1.9), Congruence.defs.hh (1.11),
+	  Congruence.inlines.hh (1.9): Convert Congruence(le,m,capacity) to
+	  Congruence(le,m), adding the requirement that m >= 0.
+
+2006-05-15 Monday 14:07  Matthew Mundell
+
+	* tests/Grid/grid3.cc (1.14): Add test22 and test23 which construct
+	  grids from constant zero dimension contraint systems.
+
+2006-05-15 Monday 14:06  Matthew Mundell
+
+	* tests/Grid/asciidumpload2.cc (1.2): Add test14 where the grid has
+	  a virtual generator.
+
+2006-05-15 Monday 14:05  Matthew Mundell
+
+	* tests/print.hh (1.35): Take out macro dump_grids.
+
+2006-05-15 Monday 14:05  Matthew Mundell
+
+	* src/Grid_public.cc (1.22): Update add_recycled_generators(gs) to
+	  assume that zero-dimension generator systems that contain
+	  generators always contain a point.
+
+2006-05-15 Monday 12:18  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.37): Renamed the
+	  iterator on the constraints system to avoid a shadowing problem
+	  in	    Octagonal_Shape<T>::get_limiting_octagon().
+
+2006-05-12 Friday 19:55  Matthew Mundell
+
+	* tests/Grid/grid3.cc (1.13): Add test20 and test21, which test
+	  adding zero dimension systems.
+
+2006-05-12 Friday 19:55  Matthew Mundell
+
+	* src/Grid_public.cc (1.21): Update Grid(cs) and Grid(ccs) to set
+	  the space dimension.	Rename ccs to cs in Grid(cs).
+
+2006-05-12 Friday 19:55  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.12): Update construct(ccgs) to use the
+	  given system when the space dimension is zero.
+
+2006-05-12 Friday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Direct_Product.defs.hh (1.1), Direct_Product.inlines.hh
+	  (1.1), Direct_Product.types.hh (1.1), Makefile.am (1.153):
+	  Started an implementation of the direct product construction for
+	  the "semantic" domains.
+
+2006-05-12 Friday 15:58  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.11): Convert the runtime exception in
+	  normalize_divisors(gs,gs) to an assertion.
+
+2006-05-12 Friday 15:56  Matthew Mundell
+
+	* src/Grid.defs.hh (1.16): Correct parameter indentation.
+
+2006-05-12 Friday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (1.6): Avoid any kind of using declaration in
+	  header files.
+
+2006-05-12 Friday 14:37  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.8): Correct the print_generators
+	  message in test11.  Add test12 to test the point-finding loop in
+	  Grid::normalize_divisors(gs,gs).
+
+2006-05-12 Friday 12:03  Matthew Mundell
+
+	* src/Grid.templates.hh (1.9): Improve comments in bounding box
+	  methods.
+
+2006-05-11 Thursday 17:52  Matthew Mundell
+
+	* tests/Polyhedron/addgenerators1.cc (1.10): Correct indentation.
+
+2006-05-11 Thursday 17:52  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.8): Turn off test05 and test06
+	  (remove_higher_space_dimensions is now private).
+
+2006-05-11 Thursday 17:51  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.7): Correct indenting.  Turn off
+	  test05 and test06.  Add test11 to test zero_dim_univ().
+
+2006-05-11 Thursday 17:49  Matthew Mundell
+
+	* src/: Grid_Generator_System.defs.hh (1.13),
+	  Grid_Generator_System.inlines.hh (1.10): Add destructor,
+	  assignment operator and method zero_dim_univ.  Order declarations
+	  and inline definitions as in Generator.  Move [] operators,
+	  affine_image, add_universe_rows_and_columns,
+	  remove_space_dimensions and remove_higher_space_dimensions to the
+	  private section.
+
+2006-05-11 Thursday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.inlines.hh (altnum.1): file
+	  Grid_Generator_System.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-05-11 Thursday 14:57  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.24): Rework the post-reduction part of
+	  simplify(cgs) to better handle the case when the given system is
+	  empty or all zeroes, and to save the check on reduced_num_rows in
+	  the zero row clipping block.
+
+2006-05-11 Thursday 13:44  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.23): Add const to some variable types.
+
+2006-05-11 Thursday 12:32  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.13): Convert the type of the
+	  dimension variable in test17 from int to dimension_type.
+
+2006-05-11 Thursday 12:26  Matthew Mundell
+
+	* src/: Congruence.cc (1.8), Congruence.defs.hh (1.10),
+	  Constraint.cc (1.59), Constraint.defs.hh (1.120), Generator.cc
+	  (1.70), Generator.defs.hh (1.118), Grid_Generator.cc (1.11),
+	  Grid_Generator.defs.hh (1.18), Grid_widenings.cc (1.8),
+	  Linear_Expression.cc (1.11): Convert the types of dimension
+	  variable from int to dimension_type in class documentation
+	  examples, "<<" operators and Grid::select_wider_generators.
+
+2006-05-10 Wednesday 19:31  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.22): Convert variable pivot_dim in
+	  reduce_reduced to a reference.
+
+2006-05-10 Wednesday 19:14  Matthew Mundell
+
+	* src/Grid_public.cc (1.20): Move temporary sp out of the loop in
+	  method relation_with.  In generalized_affine_image/3 and
+	  generalized_affine_preimage/3 move the modulus negation check
+	  into the creation of the congruence to save the use of a
+	  temporary.
+
+2006-05-10 Wednesday 18:27  Matthew Mundell
+
+	* src/Grid_conversion.cc (1.12): In both conversion methods move
+	  temp integers out of loops and convert `source_dim' temp integers
+	  to references.
+
+2006-05-10 Wednesday 18:04  Matthew Mundell
+
+	* src/Grid.templates.hh (1.8): In get_covering_box replace the use
+	  of l_n and l_d with the use of `temp' and convert temp integer
+	  `divisor' into a reference.
+
+2006-05-10 Wednesday 17:19  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.12): Correct indentation in test17.
+
+2006-05-10 Wednesday 17:19  Matthew Mundell
+
+	* src/: Congruence_System.cc (1.13), Congruence_System.defs.hh
+	  (1.9), Congruence_System.inlines.hh (1.5),
+	  Grid_Generator_System.cc (1.10), Grid_Generator_System.defs.hh
+	  (1.12), Grid_Generator_System.inlines.hh (1.9),
+	  Grid_conversion.cc (1.11), Grid_simplify.cc (1.21): Update grid
+	  row and column counter variable names to *num_rows and
+	  *num_columns.
+
+2006-05-10 Wednesday 16:21  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.36): Improved the
+	  readability of the method
+	  Octagonal_Shape<T>::map_space_dimensions().
+
+2006-05-10 Wednesday 15:41  Matthew Mundell
+
+	* src/Congruence_System.cc (1.12): Add const to a few variable
+	  declarations.  In normalize_moduli convert the `modulus'
+	  variables to references and move temp integer `factor' out of the
+	  for loop.
+
+2006-05-10 Wednesday 15:21  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.35): Indented
+	  correctly a comment.
+
+2006-05-10 Wednesday 14:33  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.14): Renamed iterators in
+	  BD_Shape::get_limiting_shape() so as to avoid misleading name
+	  clash with space dimension indices Corrected a couple of typos in
+	  the (optional) output produced by OK() when invarinats are
+	  violated.
+
+2006-05-10 Wednesday 14:22  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.34): Corrected some
+	  comments in	 Octagonal_Shape<T>::generalized_affine_image().
+	  Added the definition for	 Octagonal_Shape<T>
+	  ::generalized_affine_preimage(const Linear_Expression& lhs,
+						      const Relation_Symbol
+	  relsym,					    const
+	  Linear_Expression& rhs).
+
+2006-05-10 Wednesday 14:19  quartieri
+
+	* src/Octagonal_Shape.defs.hh (octagons.13): Added the declaration
+	  for		 void generalized_affine_preimage(const
+	  Linear_Expression& lhs,
+	  const Relation_Symbol relsym,
+		const Linear_Expression& rhs).
+
+2006-05-10 Wednesday 14:18  Matthew Mundell
+
+	* src/Grid_widenings.cc (1.7): Correct parameter indentation.  Add
+	  const to some variable declarations.
+
+2006-05-10 Wednesday 13:57  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.20): Move temp integers out of the loop
+	  in reduce_reduced.
+
+2006-05-10 Wednesday 13:29  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.19): Replace semicolons in tracing
+	  statements.
+
+2006-05-10 Wednesday 13:08  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.13): Avoid almost useless uses of
+	  reference DB_Row (prefer the direct dbm accessors' operators if a
+	  single access to the row has to be done).
+
+2006-05-10 Wednesday 13:00  Matthew Mundell
+
+	* src/Grid_public.cc (1.19): Update relation_with(cg) to use a
+	  reference instead of a temporary integer for variable `modulus'.
+
+2006-05-10 Wednesday 12:22  Matthew Mundell
+
+	* src/Congruence.defs.hh (1.9): Convert use of namespace alias PPL
+	  to use of full name.
+
+2006-05-10 Wednesday 11:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.13): Avoid compiler warnings.
+
+2006-05-10 Wednesday 11:29  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.45),
+	  generalizedaffinepreimage2.cc (1.13),
+	  generalizedaffinepreimage3.cc (1.1): Added some tests for
+	  generalized_affine_preimage(const Linear_Expression& lhs,
+			     Relation_Symbol relsym,
+	  const Linear_Expression& rhs).
+
+2006-05-10 Wednesday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (altnum.1): file
+	  generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-05-10 Wednesday 11:27  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.71), BD_Shape.templates.hh (1.12):
+	  Defined a new method: BD_Shape::generalized_affine_preimage(const
+	  Linear_Expression& lhs,
+	  Relation_Symbol relsym,				  const
+	  Linear_Expression& rhs).
+
+2006-05-10 Wednesday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.cc (1.7), Float.inlines.hh (1.28),
+	  Grid_simplify.cc (1.18), checked.cc (1.18),
+	  checked_int.inlines.hh (1.52): Prefer predecrement and
+	  preincrement to postdecrement and postincrement.
+
+2006-05-10 Wednesday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (altnum.1): file checked.cc was added on branch
+	  altnum on 2006-10-29 19:27:15 +0000
+
+2006-05-10 Wednesday 11:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_ext.inlines.hh (1.31): Spurious goto removed.
+
+2006-05-10 Wednesday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_conversion.cc (1.10): Compiler warning avoided.
+
+2006-05-10 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.defs.hh (1.14), LP_Problem.defs.hh (1.9),
+	  LP_Problem.inlines.hh (1.9): Header file inclusions adjusted.
+
+2006-05-09 Tuesday 21:17  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.15), Grid.inlines.hh (1.5),
+	  Grid_nonpublic.cc (1.10): Improve the descriptions of the
+	  normalize_divisors functions.  Add normalize_divisors(sys).
+	  Replace the second parameter of normalize_divisors(sys,divisor,f)
+	  with a writable reference and move the temporary in this method
+	  into the callers of the method.
+
+2006-05-09 Tuesday 17:04  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.5): Rename variable `tem' in
+	  add_space_dimensions(cgs,gs,d) to `old_modulus_index'.
+
+2006-05-09 Tuesday 16:47  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (1.9): Rename all row and column
+	  count variables to `num_rows' and `num_cols'.
+
+2006-05-09 Tuesday 16:44  Matthew Mundell
+
+	* src/Grid.templates.hh (1.7): In shrink_bounding_box replace the
+	  temporary `divisor' with a coefficient reference and the two
+	  temporaries `gcd' and `reduced_divisor' with a single temporary.
+
+2006-05-09 Tuesday 14:31  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.17): In reduce_pc_with_pc rename
+	  pivot_col to old_pivot_col and convert multiple array accesses to
+	  use references.
+
+2006-05-09 Tuesday 13:16  Matthew Mundell
+
+	* src/: Grid_conversion.cc (1.9), Grid_simplify.cc (1.16): Replace
+	  "red_" variable name prefixes with "reduced_".
+
+2006-05-09 Tuesday 12:25  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.11): Add tests of copy constructor
+	  and zero_dim_point().
+
+2006-05-09 Tuesday 12:24  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh (1.17), Grid_Generator.inlines.hh
+	  (1.11): Add copy constructor, destructor, max_space_dimension()
+	  and zero_dim_point().  Order declarations as in Generator.
+
+2006-05-09 Tuesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.inlines.hh (altnum.1): file
+	  Grid_Generator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-05-09 Tuesday 10:32  Matthew Mundell
+
+	* src/: Grid_conversion.cc (1.8), Grid_simplify.cc (1.15): Replace
+	  statements using addition/subtraction and multiplication
+	  operators with calls to sub_mul_assign and add_mul_assign.
+
+2006-05-09 Tuesday 10:25  Matthew Mundell
+
+	* src/: Grid_Generator.cc (1.10), Grid_Generator.inlines.hh (1.10),
+	  Grid_Generator_System.cc (1.8): Tailor the Grid_Generator
+	  ascii_dump and ascii_load methods for grids.	Use these methods
+	  in Grid_Generator_System ascii_dump and ascii_load.
+
+2006-05-09 Tuesday 01:22  Andrea Cimino
+
+	* tests/Polyhedron/Makefile.am (simplex.6): Re-enabled lpproblem2.
+
+2006-05-09 Tuesday 01:13  Andrea Cimino
+
+	* tests/Polyhedron/: LP_Problem1.cc, LP_Problem2.cc, lpproblem2.cc
+	  (simplex.[6,3,4]): Fixed the tests: removed the old stuff and
+	  added lpproblem2, (probably) lost during the last merge.
+
+2006-05-08 Monday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
+	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  instchk.hh, ppl.lsm.in, ppl.spec.in, Watchdog/CREDITS,
+	  Watchdog/ChangeLog, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/README, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/src/.cvsignore, Watchdog/src/Makefile.am,
+	  Watchdog/src/Watchdog.cc, Watchdog/utils/.cvsignore,
+	  Watchdog/utils/Makefile.am, debian/.cvsignore,
+	  debian/Makefile.am, debian/README, debian/changelog,
+	  debian/control, debian/libppl-dev.install,
+	  debian/libppl-gprolog.links, debian/libppl-pwl.copyright.in,
+	  debian/libppl-pwl.install, debian/libppl-sicstus.links,
+	  debian/libppl-swi.links, debian/libppl-yap.links,
+	  debian/libppl.copyright.in, debian/libppl.dirs,
+	  debian/libppl.install, debian/rules, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/.cvsignore,
+	  doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/ppl-config.1, doc/ppl.sty, doc/ppl_lcdd.1,
+	  doc/ppl_lpsol.1, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, interfaces/Makefile.am,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/OCaml/Makefile.am,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/.cvsignore,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_fpu_control.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_cxx_double_binary_format.m4,
+	  m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_float_is_iec_559.m4, m4/ac_cxx_long_double.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_long_double_is_iec_559.m4, m4/ac_cxx_long_long.m4,
+	  m4/ac_text_md5sum.m4, m4/ppl.m4, src/.cvsignore,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/BHRZ03_Certificate.defs.hh,
+	  src/Bounding_Box.defs.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence.types.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Congruence_System.inlines.hh, src/Congruence_System.types.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	  src/DB_Row.templates.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	  src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	  src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Interval.defs.hh, src/LP_Problem.cc, src/LP_Problem.types.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh, src/Makefile.am,
+	  src/Matrix.cc, src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Result.defs.hh,
+	  src/Rounding_Dir.defs.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+	  src/Saturation_Matrix.inlines.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh,
+	  src/Variable.defs.hh, src/Widening_Function.defs.hh,
+	  src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, src/compiler.hh,
+	  src/float.types.hh, src/fpu-c99.inlines.hh,
+	  src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	  src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	  src/globals.defs.hh, src/globals.types.hh,
+	  src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/version.hh.in, tests/Makefile.am,
+	  tests/PFunction.cc, tests/PFunction.hh,
+	  tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/valgrind_suppressions,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhmz05widening2.cc,
+	  tests/BD_Shape/bhmz05widening3.cc,
+	  tests/BD_Shape/bhmz05widening4.cc,
+	  tests/BD_Shape/bhmz05widening5.cc,
+	  tests/BD_Shape/bhmz05widening6.cc,
+	  tests/BD_Shape/bhmz05widening7.cc,
+	  tests/BD_Shape/bhmz05widening8.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+	  tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+	  tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/empty5.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+	  tests/BD_Shape/exceptions3.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation2.cc,
+	  tests/BD_Shape/limitedcc76extrapolation3.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Grid/.cvsignore, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/boundingbox1.cc, tests/Grid/boundingbox2.cc,
+	  tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	  tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	  tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	  tests/Grid/contains1.cc, tests/Grid/copyconstruct1.cc,
+	  tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/relations1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc,
+	  tests/Polyhedron/LP_Problem3.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc,
+	  tests/Polyhedron/valgrind_suppressions,
+	  tests/Polyhedron/watchdog1.cc, tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc, utils/.cvsignore,
+	  utils/Makefile.am
+	  (simplex.[1,2,2,2,2,2,2,5,2,2,2,2,1,1,1,2,2,1,2,2,2,1,2,2,1,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,5,5,2,2,4,4,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,3,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,4,2,3,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2, [...]
+	  Second merge from main trunk.
+
+2006-05-08 Monday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, interfaces/Prolog/ppl_prolog.icc,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence_System.cc, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	  src/DB_Row.templates.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Linear_Expression.defs.hh, src/Makefile.am,
+	  tests/ppl_test.cc, tests/ppl_test.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/join1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/writecongruencesystem.cc, tests/Polyhedron/Makefile.am
+	  (octagons.[1,3,3,1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,6,1,4,1,2,1,2,2,1,2,2,2,2,2,2,1,1,2,2,1,2,2,2,1,1,2,2,1,1,1,1,1,1,1]):
+	  First merge from main trunk.
+
+2006-05-08 Monday 16:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.33): Corrected a
+	  comment in	    Octagonal_Shape<T>::affine_preimage() and
+	  changed	`Coefficient b = expr.inhomogeneous_term();' in
+	  `const Coefficient& b = expr.inhomogeneous_term();'.
+
+2006-05-08 Monday 15:56  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.14): Reduce the number of implicit
+	  temporaries in the loop in reduce_pc_with_pc.  Move the explicit
+	  creation of temporary integers outside the same loop.
+
+2006-05-08 Monday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc (simplex.1): file Grid_simplify.cc was added
+	  on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:32  Matthew Mundell
+
+	* src/Grid_Status.cc (1.4): Drop the printing of the final trailing
+	  space from method ascii_dump.
+
+2006-05-08 Monday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.cc (simplex.1): file Grid_Status.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:30  Matthew Mundell
+
+	* src/Grid_public.cc (1.18): Update time_elapse_assign to use
+	  Grid_Generator::set_is_parameter() instead of multiple calls to
+	  Grid_Generator::set_divisor.
+
+2006-05-08 Monday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (simplex.1): file Grid_public.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:28  Matthew Mundell
+
+	* src/: Grid_Generator.cc (1.9), Grid_Generator.defs.hh (1.16): Add
+	  set_is_parameter().
+
+2006-05-08 Monday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.cc (simplex.1): file Grid_Generator.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.defs.hh (simplex.1): file
+	  Grid_Generator.defs.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-05-08 Monday 15:27  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc (1.7),
+	  Grid_Generator_System.inlines.hh (1.8): Tailor the ascii_dump and
+	  ascii_load methods for grids.
+
+2006-05-08 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.cc (simplex.1): file
+	  Grid_Generator_System.cc was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.inlines.hh (simplex.1): file
+	  Grid_Generator_System.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 14:05  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.32): Avoid repeated
+	  computations in
+	  Octagonal_Shape<T>::generalized_affine_image().
+
+2006-05-08 Monday 13:28  Matthew Mundell
+
+	* src/: Congruence.cc (1.6), Congruence.defs.hh (1.8),
+	  Congruence.inlines.hh (1.8), Linear_Expression.defs.hh (1.25):
+	  Add create(le,le), create(le,n) and create(n,le) to Congruence.
+	  Update the Congruence-returning %= operators to use the new
+	  create methods instead of requiring the friend relations between
+	  these operators and the Congruence and Linear_Expression classes.
+
+2006-05-08 Monday 13:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.cc (simplex.1): file Congruence.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 13:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh (simplex.1): file Congruence.defs.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 13:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.inlines.hh (simplex.1): file Congruence.inlines.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Matthew Mundell
+
+	* src/: Congruence.cc (1.5), Congruence_System.cc (1.11),
+	  Grid.templates.hh (1.6), Grid_conversion.cc (1.7),
+	  Grid_nonpublic.cc (1.9), Grid_public.cc (1.17), Grid_simplify.cc
+	  (1.13): Update many loops to loop down towards a constant instead
+	  of up towards a value in a variable.
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (simplex.1): file Congruence_System.cc
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (simplex.1): file Grid.templates.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_conversion.cc (simplex.1): file Grid_conversion.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (simplex.1): file Grid_nonpublic.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 16:51  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh,
+	  Octagonal_Shape.templates.hh (octagons.[12,7,31]): Renamed the
+	  parameter `v' to `v_id' in
+	  Octagonal_Shape<T>::forget_binary_octagonal_constraints().
+	  `v_id' is the index of variable whose constraints are forgotten,
+	  `v' was the index of rows/columns on `v_id' in the octagon,
+	  instead.
+
+2006-05-05 Friday 16:26  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh,
+	  Octagonal_Shape.templates.hh (octagons.[11,6,30]): Renamed the
+	  parameter `v' to `v_id' in
+	  Octagonal_Shape<T>::forget_all_octagonal_constraints().  `v_id'
+	  is the index of variable whose constraints are forgotten, `v' was
+	  the index of rows/columns on `v_id' in the octagon, instead.
+
+2006-05-05 Friday 16:21  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.70), BD_Shape.templates.hh (1.11):
+	  Renamed some parameters in helper functions for the computation
+	  of affine relations: `pos_sum' and `neg_sum' renamed as `ub_v'
+	  and minus_lb_v'.
+
+	  Added some assertions in these helper funcions: - `sc_den' should
+	  be positive; - `ub_v' and `minus_lb_v' shouldn't be equal to
+	  plus infinity.
+
+2006-05-05 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (simplex.1): file BD_Shape.templates.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 15:42  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.29): Added some
+	  comments in Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().
+
+2006-05-05 Friday 15:39  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.28): Added some
+	  comments in Octagonal_Shape<T>::deduce_v_pm_u_bounds().
+
+2006-05-05 Friday 15:28  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.27): Added the
+	  assertion   assert(!is_plus_infinity(minus_lb_v)); in
+	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds() to ensure that
+	  `minus_lb_v' is a meaningful parameter.
+
+2006-05-05 Friday 15:23  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.26): Added the
+	  assertion   assert(!is_plus_infinity(ub_v)); in
+	  Octagonal_Shape<T>::deduce_v_pm_u_bounds() to ensure that `ub_v'
+	  is a meaningful parameter.
+
+2006-05-05 Friday 15:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.25): Added the
+	  assertion   assert(sc_den > 0); in
+	  Octagonal_Shape<T>::deduce_v_pm_u_bounds() and in
+	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().  `sc_den' is
+	  always positive.
+
+2006-05-05 Friday 14:27  quartieri
+
+	* src/Octagonal_Shape.defs.hh (octagons.10): Corrected the
+	  documentation for    void deduce_v_pm_u_bounds() and	       void
+	  deduce_minus_v_pm_u_bounds().
+
+2006-05-05 Friday 14:01  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.24): Corrected some
+	  comments in	  Octagonal_Shape<T>::deduce_v_pm_u_bounds().
+	  Corrected some comments and renamed `minus_q' in `q' in
+	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds() to improve
+	  readability.
+
+2006-05-05 Friday 13:48  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.23): Corrected some
+	  comments and renamed `q' in `minus_q' in
+	  Octagonal_Shape<T>::deduce_v_pm_u_bounds() to improve
+	  readability.
+
+2006-05-05 Friday 13:14  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.22): Corrected two
+	  bugs in	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().
+
+2006-05-04 Thursday 21:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.124), BD_Shape.defs.hh (1.69): Added
+	  a couple of missing \relates Doxygen commands.
+
+2006-05-04 Thursday 21:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in, devref.doxyconf-latex.in
+	  (octagons.[2,2]): Also consider files distances.* when producing
+	  the devref manual.
+
+2006-05-04 Thursday 21:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[12,17]):
+	  Added a few missing \relates Doxygen commands.  Corrected the
+	  name of a macro (error probably caused by uncareful query
+	  replace).  Reordered definitions of inline functions so as to
+	  alow inlining.
+
+2006-05-04 Thursday 21:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+	  (octagons.[9,5]): Added a few missing \relates Doxygen commands.
+
+2006-05-04 Thursday 16:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[8,21]): Helper functions for the computation of affine
+	  relations rewritten and reorganized:	- deduce_v_pm_u_bounds()
+	  now replaces the two functions    deduce_v_minus_u_bounds() and
+	  deduce_v_plus_u_bounds(), since these were	always called one
+	  after the other and they were going through the    same loop;  -
+	  similarly done for deduce_minus_v_pm_u_bounds();  - pos_sum and
+	  neg_sum parameters renamed as ub_v and minus_lb_v;  - code
+	  improved a lot for readability (and maybe also efficiency);  -
+	  avoided use of ROND_UP when dealing with mpq_class objects
+	  (prefer    using ROUND_NOT_NEEDED);  - removed inline directive
+	  from is_bounded().
+
+2006-05-04 Thursday 16:31  Matthew Mundell
+
+	* tests/Grid/maxmin1.cc (1.9): In check_both, check_minimize and
+	  check_maximize add parameter const qualifiers and convert all
+	  parameters to references.
+
+2006-05-04 Thursday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/maxmin1.cc (simplex.1): file maxmin1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 16:20  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.20): Reversed some
+	  loops.
+
+2006-05-04 Thursday 16:12  Matthew Mundell
+
+	* src/Grid_Generator.cc (1.8): Update the output operator to denote
+	  parameters with a `q'.
+
+2006-05-04 Thursday 15:56  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.12): Improve variable names in
+	  reduce_parameter_with_line and reduce_congruence_with_equality.
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload1.cc (simplex.1): file asciidumpload1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator1.cc (simplex.1): file
+	  outputoperator1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/writecongruencesystem.cc (altnum.1): file
+	  writecongruencesystem.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/writecongruencesystem.cc (simplex.1): file
+	  writecongruencesystem.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.cc (1.5), ppl_test.hh (1.47),
+	  BD_Shape/addconstraints1.cc (1.12), BD_Shape/affineimage1.cc
+	  (1.13), BD_Shape/affinepreimage1.cc (1.13),
+	  BD_Shape/bdsdifference1.cc (1.9), BD_Shape/bdshull1.cc (1.9),
+	  BD_Shape/bhmz05widening1.cc (1.9), BD_Shape/cc76extrapolation1.cc
+	  (1.13), BD_Shape/cc76narrowing1.cc (1.13), BD_Shape/contains1.cc
+	  (1.11), BD_Shape/fromgensys1.cc (1.12),
+	  BD_Shape/generalizedaffineimage2.cc (1.14),
+	  BD_Shape/intersection1.cc (1.12),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.8),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.9),
+	  BD_Shape/relations2.cc (1.17), BD_Shape/relations3.cc (1.14),
+	  BD_Shape/removespacedims1.cc (1.13), BD_Shape/timeelapse1.cc
+	  (1.12), Grid/asciidumpload1.cc (1.8), Grid/maxmin1.cc (1.8),
+	  Grid/outputoperator1.cc (1.6), Grid/writecongruencesystem.cc
+	  (1.6): Repeated using directives removed; others avoided.  Added
+	  missing inclusions and missing std:: qualifications.
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (simplex.1): file ppl_test.cc was added on
+	  branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-05-04 Thursday 14:49  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.19): Improved
+	  generalized_affine_preimage().
+
+2006-05-04 Thursday 14:17  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.18): Several (mainly
+	  readability) improvements to the implementation of method
+	  generalized_affine_image().
+
+2006-05-04 Thursday 13:47  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.17): Another pass
+	  through the code of generalized_affine_preimage(), to improve
+	  readability and thus maintainability.      - in the general case,
+	  the references inside the matrix are named	     m_*, e.g.,
+	  m_i, m_ci, m_v, etc.	Avoid almost useless uses of row_iterator
+	  (prefer the direct matrix accessors' operators if a single access
+	  to the row has to be done).
+
+2006-05-04 Thursday 13:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.16): Another pass
+	  through the code of generalized_affine_preimage(), to improve
+	  readability and thus maintainability.      - moved the definition
+	  of minus_den to avoid repeated computations;	   - in the case
+	  t==0, removed an unneccesary row_iterator and       defined
+	  two_b;	- in the case t==1, coeff renamed as w_coeff and
+	  lv_index renamed  as	   n_w.
+
+2006-05-04 Thursday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.44), Polyhedron/Makefile.am
+	  (1.89): Unwanted indentation removed.
+
+2006-05-04 Thursday 12:16  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.15): Improved
+	  readability and thus maintainability in the methods of affine
+	  trasformations: - in the case t==1, the coefficient a renamed as
+	  w_coeff.
+
+	  Corrected a bug in the method affine_image().
+
+2006-05-04 Thursday 10:46  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.14): Improved
+	  readability and thus maintainability in the methods of affine
+	  trasformations: - last_var_id renamed as w_id; - num_var renamed
+	  as var_id.
+
+2006-05-04 Thursday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.13): Another pass
+	  through the code of affine_image(), to improve readability and
+	  thus maintainability.   - last_var_id renamed as w_id;   - in the
+	  case t==1, coeff renamed as w_coeff;	 - variable indices should
+	  be called *_id; the indices used to access the     matrix should
+	  be named n_*, e.g., var and n_w;   - the references inside the
+	  matrix are named m_*, e.g., m_i, m_ci, m_v, etc.  Avoid repeated
+	  testing of known conditionals; avoid almost useless uses of
+	  row_iterator (prefer the direct matrix accessors' operators if a
+	  single access to the row has to be done).
+
+2006-05-04 Thursday 10:05  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.12): Some (mainly
+	  readability) improvements to the implementation of method
+	  affine_preimage().  Indented region in some methods.
+
+2006-05-03 Wednesday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.11): Several (mainly
+	  readability) improvements to the implementation of method
+	  affine_image() for the case when t == 1.
+
+2006-05-03 Wednesday 14:43  Elena Mazzi
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[7,10]): Added a new method
+	  Octagonal_Shape::is_bounded().
+
+2006-05-03 Wednesday 14:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.9): A few improvements
+	  in method constraints() and operator <<.
+
+2006-05-03 Wednesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.8): Added (macro for)
+	  definitions of output functions.
+
+2006-05-02 Tuesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounded1.cc (altnum.1): file bounded1.cc was added
+	  on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-05-02 Tuesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounded1.cc (octagons.1): file bounded1.cc was
+	  added on branch octagons on 2006-05-08 16:16:44 +0000
+
+2006-05-02 Tuesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounded1.cc (simplex.1): file bounded1.cc was
+	  added on branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-05-02 Tuesday 17:48  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.68), src/BD_Shape.templates.hh (1.10),
+	  tests/BD_Shape/Makefile.am (1.43), tests/BD_Shape/bounded1.cc
+	  (1.1): Defined a new method BD_Shape::is_bounded().  Added some
+	  tests for this method.
+
+2006-05-02 Tuesday 16:39  Elena Mazzi
+
+	* tests/BD_Shape/affinedimension1.cc (1.8): Rewrited and added some
+	  tests for affine_dimension().
+
+2006-05-02 Tuesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (1.2): test01() in
+	  frompolyhedron1.cc overflows when using 8-bit and 16-bit
+	  integers.
+
+2006-05-02 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (octagons.1): file
+	  frompolyhedron1.cc was added on branch octagons on 2006-05-08
+	  16:16:44 +0000
+
+2006-05-02 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (simplex.1): file
+	  frompolyhedron1.cc was added on branch simplex on 2006-05-08
+	  17:15:53 +0000
+
+2006-05-02 Tuesday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (octagons.3): Added support for checking the
+	  results of approximated Octagonal_Shape computations.
+
+2006-05-02 Tuesday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[11,16]):
+	  All instances of OR_Matrix are now friends of each other.  Added
+	  constructor building an overapproximation of an OR_Matrix of a
+	  different coefficient type.
+
+2006-05-02 Tuesday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+	  (octagons.[6,4]): Added declarations and definitions of fucntions
+	  computing distances.	Added constructor converting from another
+	  Octagonal_Shape.  All instances of Octagonal_Shape are now
+	  friends of each other.
+
+2006-05-02 Tuesday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[10,15]):
+	  Added declarations and definitions of helper functions for
+	  computing distances.
+
+2006-05-02 Tuesday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh, Makefile.am, distances.defs.hh,
+	  distances.inlines.hh, distances.types.hh (octagons.[1,5,1,1,1]):
+	  Common code for computing distances put in files distances.*
+
+2006-05-02 Tuesday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.7): Restored previous
+	  version of is_strongly_reduced(): the modified version was not
+	  working as it was assumming that a strongly reduced matrix is
+	  just strongly closed plus Booleans indicating redundancies (as
+	  for BD shapes).  Removed a few redundant template qualifications.
+
+2006-05-02 Tuesday 12:31  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.9): Don't confuse the class
+	  used to solve the lp problems and the name of the program.
+
+2006-05-02 Tuesday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh,
+	  Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+	  (octagons.[9,14,5,3]): OR_Matrix should know nothing about
+	  coherence. Methods at() moved in Octagonal_Shape and named
+	  matrix_at().
+
+2006-05-02 Tuesday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.6): Corrected a bug in
+	  is_strongly_reduced().
+
+2006-05-02 Tuesday 09:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.5): A few improvements
+	  to comments.	Added some missing const qualifiers; removed
+	  redundant parentheses.  Some improvements to the incremental
+	  strong closure procedure (mainly in readability). Corrected
+	  strong_coherence_assign().
+
+2006-04-30 Sunday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.4): Removed declarations
+	  for no longer used alternative implementations of (incremental)
+	  strong closure.
+
+2006-04-30 Sunday 18:46  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.4): Corrected a bug in
+	  Octagonal_Shape<T>::affine_preimage().  Erased some
+	  duplicated code lines and corrected the insertion of constraints
+	  in	     Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-04-30 Sunday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (octagons.2): Avoid useless
+	  inclusions of iostream, sstream and stdexcept.  Avoid a few
+	  useless braces.  Deleted useless function
+	  strong_coherence_local_step().  Deleted functions
+	  get_matrix_element() (use OR_Matrix<T>::at() instead).  Some
+	  improvements (in particular, in assertion checking) in methods
+	  add_octagonal_constraint() and forget_octagonal_constraints().  A
+	  few documentation improvements.
+
+2006-04-30 Sunday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[8,13]):
+	  Added methods at(dimension_type, dimension_type) that provide
+	  controlled access to the matrix as if it was a square matrix.
+	  Corrected method clear().
+
+2006-04-30 Sunday 15:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.3): Corrected a bug in
+	  affine_dimension() regarding the identification of the singular
+	  zero-equivalence class.
+
+2006-04-30 Sunday 10:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (octagons.1): Drafted a common section for
+	  describing both BDSs and OSs.
+
+2006-04-30 Sunday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.3): Corrected a LaTeX error
+	  in the documentation.
+
+2006-04-30 Sunday 09:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (octagons.2): Added missing include
+	  directive for friend declaration.
+
+2006-04-30 Sunday 09:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.42), frompolyhedron1.cc (1.1):
+	  Added a test on the conversion from C_Polyhedron to BD_Shape
+	  exploiting the simplex algorithm.
+
+2006-04-29 Saturday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.9): Corrected the constructor taking
+	  a polyhedron an SIMPLEX_COMPLEXITY.
+
+2006-04-29 Saturday 22:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.2): Implemented the
+	  constructor building an OS from a Polyhedron.  Removed redundant
+	  template parameter in the argument of concatenate_assign().
+	  Small correction in the output of method OK().
+
+2006-04-29 Saturday 22:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.2): Corrected some comments
+	  (in particular, references to Doxygen documentation).
+
+2006-04-29 Saturday 22:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (octagons.1): Octagonal_Shape is a friend
+	  of Polyhedron (needed for conversion).
+
+2006-04-29 Saturday 22:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (octagons.12): Removed redundant
+	  template parameter in the argument of operator-: it was confusing
+	  Doxygen.
+
+2006-04-29 Saturday 22:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (octagons.7): Removed trailing whitespace.
+
+2006-04-29 Saturday 12:15  Andrea Cimino
+
+	* tests/Polyhedron/lpproblem1.cc (simplex.3): Fixed the test to
+	  match the new expected result.
+
+2006-04-29 Saturday 11:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.8): Corrected the two bugs in
+	  generalized_affine_preimage() shown by test04() and test05() in
+	  generalizedaffinepreimage2.cc.
+
+2006-04-29 Saturday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.12): test05()
+	  shows a bug in BD_Shape::generalized_affine_preimage() that shows
+	  up when using GREATER_THAN_OR_EQUAL.
+
+2006-04-29 Saturday 11:04  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.42): Turned on the steepest edge
+	  floating point version.
+
+2006-04-29 Saturday 10:54  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.41): Removed redundant line.
+
+2006-04-29 Saturday 10:48  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.40): Turn off the steepest-edge
+	  floating point version by default.
+
+2006-04-29 Saturday 10:40  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.39): Fixed a bug in the floating point
+	  version: remember to initialize the values in the first loop
+	  before comparing `current' and `challenger' values.
+
+2006-04-29 Saturday 09:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.7): In
+	  BD_Shape<T>::affine_preimage(), corrected the bug shown by
+	  test09() of affinepreimage2.cc.
+
+2006-04-29 Saturday 09:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/affinepreimage2.cc (1.12): test09() shows a bug in
+	  the computation of BD_Shape<T>::affine_preimage() under somehow
+	  specific conditions (expression is invertible and on a single
+	  variable, denominator is equal to opposite of the coefficient of
+	  the variable and the inhomogeneous term is non-zero).
+
+2006-04-28 Friday 23:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am, src/Octagon.cc, src/Octagon.defs.hh,
+	  src/Octagon.inlines.hh, src/Octagon.templates.hh,
+	  src/Octagon.types.hh, src/Octagonal_Shape.cc,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  tests/ppl_test.hh, tests/print.hh
+	  (octagons.[4,2,17,17,28,2,1,1,1,1,1,2,3,1,1,2,2]): Class template
+	  Octagon renamed to Octagonal_Shape.
+
+2006-04-28 Friday 17:27  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[16,16,27]): Improved the private methods
+	  Octagon<T>::forget_all_octagonal_constraints() and
+	  Octagon<T>::forget_binary_octagonal_constraints().
+
+2006-04-28 Friday 16:46  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[15,15,26]): Improved the private methods
+	  Octagon<T>::add_octagonal_constraint().
+
+2006-04-28 Friday 16:18  quartieri
+
+	* src/Octagon.templates.hh (octagons.25): Corrected a bug in
+	  Octagon<T>::generalized_affine_preimage() and added some tests
+	  for it.
+
+2006-04-28 Friday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.6): Corrected a couple of typos in
+	  the (optional) output produced by OK() when invarinats are
+	  violated.  Renamed iterators in BD_Shape(const Generator_System&)
+	  so as to avoid misleading name clash with space dimension
+	  indices.
+
+2006-04-27 Thursday 17:08  quartieri
+
+	* src/Octagon.templates.hh (octagons.24): Corrected a bug in
+	  Octagon::generalized_affine_preimage() and added a test for it.
+
+2006-04-27 Thursday 17:05  Elena Mazzi
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.11): Corrected an
+	  error in `test04', but the bug remains.
+
+2006-04-27 Thursday 16:31  Elena Mazzi
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[6,11]):
+	  Improved the comments about the class OR_Matrix.
+
+2006-04-27 Thursday 13:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagon.templates.hh (octagons.23): Corrected a few spelling
+	  errors inside assertions.
+
+2006-04-27 Thursday 13:28  Elena Mazzi
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.10): Added a new
+	  test that shows a bug in the method:
+	  BD_Shape::generalized_affine_preimage().
+
+2006-04-27 Thursday 12:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagon.templates.hh (octagons.22): Committed an improved
+	  version of the inner loop of strong_closure_assign(), avoiding
+	  repeated conditional tests and coherent indexes computations.
+
+2006-04-27 Thursday 12:23  quartieri
+
+	* src/Octagon.templates.hh (octagons.21): Corrected the functions
+	  Octagon<T>::affine_image(),
+	  Octagon<T>::affine_preimage(),
+	  Octagon<T>::generalized_affine_image(const Variable var,
+					     const Relation_Symbol relsym,
+						   const Linear_Expression&
+	  expr ,
+	  Coefficient_traits::const_reference
+			denominator),
+	  Octagon<T>::generalized_affine_image(const Linear_Expression&
+	  lhs,						 const
+	  Relation_Symbol relsym,
+	  const Linear_Expression& rhs).  Added the function
+	  Octagon<T>::generalized_affine_preimage().
+
+2006-04-27 Thursday 12:04  quartieri
+
+	* src/Octagon.inlines.hh (octagons.14): Defined the function
+	  Octagon<T>::forget_binary_octagonal_constraints().
+
+2006-04-27 Thursday 12:00  quartieri
+
+	* src/Octagon.defs.hh (octagons.14): Added the new functions
+	  void forget_binary_octagonal_constraints() and  void
+	  generalized_affine_preimage().
+
+2006-04-27 Thursday 10:38  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[13,20]):
+	  Renamed `compute_nexts()' with `compute_successors()'.  Replaced
+	  the word `next' with `successor'.  Removed an obsolete line in
+	  Octagon::strong_reduction_assign().
+
+2006-04-26 Wednesday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[5,10]):
+	  Removed unused method OR_Matrix::erase_to_end().
+
+2006-04-26 Wednesday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagon.templates.hh (octagons.19): Prefer
+	  OR_Matrix::shrink() to OR_Matrix::resize_no_copy() when we
+	  statically know that we are removing space dimensions.
+
+2006-04-26 Wednesday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[12,13,18]): In Octagon.defs.hh:   Small formatting and
+	  documentation improvements (Use the multiline   Doxygen comment
+	  style for comments spanning more lines).    Methods grouped into
+	  classes (as done for other domains).	  Added declarations for
+	  debugging-related output methods.
+
+	  In Octagon.inlines.hh:   Do not include useless file headers
+	  (vector, deque, string).    Avoid lines that are twoo long and
+	  trailing whitespace.	  Use OR_Matrix::shrink() instead of
+	  OR_Matrix::remove_rows().
+
+	  In OR_Matrix.templates.hh:   Do include header file for strings.
+	    Several optimizations to strong_closure_assign().	 Added
+	  several missing const modifiers.    Prefer using "\n" to
+	  std::endl when printing on streams.
+
+2006-04-26 Wednesday 14:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am, OR_Matrix.defs.hh, OR_Matrix.inlines.hh,
+	  OR_Matrix.templates.hh (octagons.[3,4,9,1]): In
+	  OR_Matrix.defs.hh:   Include globals.defs.hh; do not include
+	  vector and deque.    Small formatting and documentation
+	  improvements (Use the multiline    Doxygen comment style for
+	  comments spanning more lines).    Default constructor OR_Matrix()
+	  is now private and not implemented.	 Added method
+	  OR_Matrix::shrink() to remove some of the last dimensions    from
+	  the matrix; removed methods add_rows() and remove_rows().
+	  Corrected documentation of method ascii_dump & load.
+
+	  In OR_Matrix.inlines.hh:   Do not include useless file headers
+	  (vector, deque, string, iostream,   sstream, stdexcept).    Added
+	  missing inline declarations to methods row_size() and
+	  row_first_element_index(), as well as several const modifiers.
+	  Avoid lines that are twoo long and trailing whitespace.
+	  Removed (buggy) implementation of default constructor.
+	  Implemented new method OR_Matrix::shrink() and used in the
+	  implementation of resize_no_copy() (which still contains an
+	  efficiency bug).    Method that do not stand a chance of being
+	  inlined moved into	OR_Matrix.templates.hh (ascii_dump,
+	  ascii_load, operator<<, OK).
+
+	  In OR_Matrix.templates.hh:   Improved implementation of method
+	  OK() by printing the reasons	 of failures. Added
+	  debugging-related output methods.
+
+2006-04-26 Wednesday 12:09  Elena Mazzi
+
+	* src/Octagon.inlines.hh (octagons.12): Removed a silly and
+	  not-necessary function change(); renamed `position_cell()' with
+	  `get_matrix_element()'.
+
+2006-04-26 Wednesday 09:52  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[11,17]):
+	  Added a new constructor: Octagon(const Generator_System& gs).
+	  Improved and adjust some comments in Octagon::constraints().
+	  Improved the method Octagon::OK(): MINUS_INFINITY cannot occur at
+	  all.	Improved the method Octagon::is_strong_coherent(): removing
+	  some not necessary lines.
+
+	  Adjusted some comments in Octagon::map_space_dimensions(),
+	  Octagon::remove_space_dimensions().  Renamed also some silly
+	  variables.
+
+2006-04-20 Thursday 16:32  quartieri
+
+	* src/Octagon.templates.hh (octagons.16): Completed and corrected
+	  affine_image().  Corrected operator<<().  Cleaned some lines in
+	  affine_preimage().
+
+2006-04-20 Thursday 16:27  quartieri
+
+	* src/Octagon.inlines.hh (octagons.11): Corrected a wrong index in
+	  forget_all_octagonal_constraints().
+
+2006-04-20 Thursday 16:23  quartieri
+
+	* src/Octagon.defs.hh (octagons.10): Eliminated the wrong method
+	  `deduce_u_plus_v_bounds() and added the method
+	  deduce_minus_v_minus_u_bounds().
+
+2006-04-20 Thursday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.pl (1.89), GNU/ppl_gprolog.pl
+	  (1.60), SICStus/ppl_sicstus_sd.cc (1.93), SWI/ppl_swiprolog.cc
+	  (1.123), XSB/ppl_xsb.H (1.48), XSB/ppl_xsb.cc (1.88),
+	  YAP/ppl_yap.cc (1.116): Restore previous versions of system
+	  dependent files.
+
+2006-04-20 Thursday 07:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.177), Ciao/ppl_ciao.pl
+	  (1.88), GNU/ppl_gprolog.pl (1.59), SICStus/ppl_sicstus_sd.cc
+	  (1.92), SWI/ppl_swiprolog.cc (1.122), XSB/ppl_xsb.H (1.47),
+	  XSB/ppl_xsb.cc (1.87), YAP/ppl_yap.cc (1.115): Redundant widening
+	  code removed.
+
+2006-04-19 Wednesday 16:38  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[9,10,15]): Cleaned strong_reduction_assign().  Added a
+	  new method: Octagon::minimized_constraints().  Added tests for
+	  minimized_constraints().
+
+2006-04-19 Wednesday 15:02  Elena Mazzi
+
+	* src/Octagon.templates.hh (octagons.14): Fixed and added some
+	  comments in Octagon::concatenate_assign() and
+	  Octagon::is_strongly_reduced().
+
+2006-04-19 Wednesday 14:25  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[8,13]): No
+	  longer disregard the optional tokens parameter in the
+	  extrapolation and widening methods.  Renamed CH78_widening and
+	  limited_CH78_extrapolation respectly BHMZ05_widening and
+	  limited_BHMZ05_extrapolation.
+
+	  Tests for extrapolation and widening rewritten according to the
+	  new guidelines.
+
+2006-04-19 Wednesday 13:21  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[7,9,12]): No longer disregard the optional tokens
+	  parameter in the CC76_extrapolation_assign() methods.  Tests for
+	  Octagon::CC76_extrapolation_assign() rewritten according to the
+	  new guidelines.
+
+2006-04-19 Wednesday 12:55  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[6,8,11]): Fixed the constructors and some methods.
+	  Defined the methods	 deduce_v_plus_u_bounds() and
+	  deduce_u_plus_v_bounds() used by affine_image().
+
+2006-04-19 Wednesday 12:49  quartieri
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[3,8]):
+	  Replaced the private field 'num_rows_' with the field
+	  'space_dim', that is
+	  the dimension of the octagon represented by the OR_Matrix.
+
+2006-04-19 Wednesday 12:11  Elena Mazzi
+
+	* src/Octagon.templates.hh (octagons.10): Improved
+	  Octagon::CC76_narrowing_assign().  Tests for
+	  Octagon::CC76_narrowing_assign() rewritten according to the new
+	  guidelines.
+
+2006-04-19 Wednesday 12:05  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.5): Corrected
+	  BD_Shape::get_limiting_shape().  Now there's no precision bug in
+	  BD_Shape::limited_CC76_extrapolation_assign().
+
+2006-04-19 Wednesday 11:54  Elena Mazzi
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (1.8): Corrected test
+	  number `6', now it shows a precision bug.
+
+2006-04-19 Wednesday 11:31  Elena Mazzi
+
+	* src/Octagon.templates.hh (octagons.9): Cleaned
+	  Octagon::add_constraint.  Methods poly_hull_assign() and
+	  poly_hull_assign_and_minimize() renamed as oct_hull_assign() and
+	  oct_hull_assign_and_minimize().  Tests for
+	  Octagon::oct_hull_assign() rewritten according to the new
+	  guidelines.
+
+2006-04-18 Tuesday 23:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[5,7,8]): Corrected copyright year and address of the
+	  FSF.	Added method strictly_contains().  Methods
+	  poly_hull_assign() and poly_hull_assign_and_minimize() renamed as
+	  oct_hull_assign() and oct_hull_assign_and_minimize().  Added
+	  method upper_bound_assign().	Added methods
+	  oct_hull_assign_if_exact() and upper_bound_assign_if_exact(),
+	  both with dummy implementations always returning false.  Added
+	  method difference_assign().  Added token parameter tp to
+	  CH78_widening_assign(), temporarily ignored, so as to allow for
+	  using this widening in widen_fun_ref().  Duplicated code for
+	  numer_denom() and assign_min() removed: now using numer_denom()
+	  and min_assign() as defined in Implementation::BD_Shapes.
+
+2006-04-18 Tuesday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (simplex.38): Improved
+	  LP_Problem::steepest_edge_entering_index() by avoiding duplicate
+	  computation and mitigating a problem (still present) whereby no
+	  caution is taken with respect to the possibility that
+	  mpq_class::get_d() (and, previously, also mpz_class::get_d())
+	  give rise to undefined behavior.  Added a FIXME not to forget
+	  about this problem.
+
+2006-04-18 Tuesday 21:01  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.8): Be verbose only if
+	  requested.
+
+2006-04-18 Tuesday 19:44  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.7): Modified `ppl_lpsol' for
+	  testing purposes: added the options --no-optimization (-n) and
+	  --incremental (-i).
+
+2006-04-16 Sunday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (octagons.7): Improved
+	  OR_Matrix<T>::ascii_load(): useless reference avoided, variable
+	  renamed, added a const qualifier.
+
+2006-04-16 Sunday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.72), devref.doxyconf-latex.in
+	  (1.12): Also generate devref docs from DB_Row.templates.hh and
+	  DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.152): Take into account DB_Row.templates.hh
+	  and DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.21), DB_Matrix.inlines.hh (1.26),
+	  DB_Matrix.templates.hh (1.1): DB_Matrix non-inline methods moved
+	  to DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (octagons.1): file
+	  DB_Matrix.templates.hh was added on branch octagons on 2006-05-08
+	  16:16:43 +0000
+
+2006-04-16 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (simplex.1): file
+	  DB_Matrix.templates.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-04-16 Sunday 08:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Row.defs.hh (1.18), DB_Row.inlines.hh (1.18),
+	  DB_Row.templates.hh (1.1): DB_Row non-inline methods moved in
+	  file DB_Row.templates.hh.  Methods begin() and end() are now
+	  declared inline.
+
+2006-04-16 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh (octagons.1): file DB_Row.templates.hh
+	  was added on branch octagons on 2006-05-08 16:16:43 +0000
+
+2006-04-16 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh (simplex.1): file DB_Row.templates.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-04-14 Friday 18:25  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.6): Improved
+	  IO_Operators::operator<<().
+
+2006-04-14 Friday 17:29  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.5): Improved the method
+	  OR_Matrix<T>::ascii_load().
+
+2006-04-14 Friday 16:55  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.4): Improved the method
+	  OR_Matrix<T>::grow().
+
+2006-04-14 Friday 16:27  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.3): Removed a wrong comment.
+
+2006-04-14 Friday 15:50  quartieri
+
+	* src/OR_Matrix.defs.hh (octagons.2): Corrected some wrong
+	  comments.
+
+2006-04-13 Thursday 15:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage2.cc (1.6), join1.cc (1.11): Added extra
+	  tests to match the running example in the Muller-Olm and Seidl
+	  2005 ESOP paper.  Small improvements to the tests using the
+	  example in the Muller-Olm and Seidl 2005 SAS paper
+
+2006-04-13 Thursday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (simplex.1): file affineimage2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-13 Thursday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join1.cc (simplex.1): file join1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-12 Wednesday 13:05  quartieri
+
+	* src/Octagon.inlines.hh (octagons.6): Restored a missing '#ifdef'
+	  line.
+
+2006-04-12 Wednesday 11:13  quartieri
+
+	* src/Octagon.inlines.hh (octagons.5): Removed the redundant
+	  definition of div_round_up: it is already in BD_Shape.inlines.hh.
+
+2006-04-11 Tuesday 17:06  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[4,4,7]): Removed the unnecessary algorithms of strong
+	  closure and incremental strong closure.
+
+2006-04-10 Monday 16:11  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[3,6]):
+	  Added a new method `Octagon::affine_dimension()'.  Defined a new
+	  function `Octagon::compute_leaders(leader)' that the above method
+	  uses.
+
+2006-04-10 Monday 13:57  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[2,5]):
+	  Method Octagon::poly_difference_assign() renamed
+	  Octagon::oct_difference_assign().  Corrected a bug in
+	  Octagon::oct_difference_assign().
+
+	  Improved Octagon::transitive_reduction_assign() using two new
+	  functions: Octagon::compute_nexts() and
+	  Octagon::compute_leaders().
+
+2006-04-08 Saturday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc (1.3): Typo fixed in comment.
+
+2006-04-07 Friday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (octagons.1): Added template <typename T> void
+	  print_constraints(const Parma_Polyhedra_Library::Octagon<T>& oc,
+	  const std::string& intro = "", std::ostream& s = nout).
+
+2006-04-07 Friday 07:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc, addspacedims1.cc,
+	  affineimage1.cc, affinepreimage1.cc, ascii_dump_load1.cc,
+	  bdsdifference1.cc, bdshull1.cc, bhmz05widening1.cc,
+	  cc76extrapolation1.cc, cc76narrowing1.cc, concatenate1.cc,
+	  constraints1.cc, generalizedaffineimage1.cc,
+	  generalizedaffineimage2.cc, h79widening1.cc, intersection1.cc,
+	  limitedbhmz05extrapolation1.cc, limitedcc76extrapolation1.cc,
+	  limitedh79extrapolation1.cc, mapspacedims1.cc,
+	  minconstraints1.cc, removespacedims1.cc, timeelapse1.cc
+	  (octagons.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Spurious blank spaces removed.
+
+2006-04-07 Friday 07:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/universe1.cc (octagons.1): This test was wrong:
+	  fixed.
+
+2006-04-06 Thursday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am, Octagon.templates.hh, Og_Status.inlines.hh
+	  (octagons.[2,4,2]): Several corrections.
+
+2006-04-06 Thursday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Row.defs.hh, OR_Matrix.inlines.hh, Octagon.inlines.hh,
+	  Octagon.templates.hh (octagons.[1,2,3,3]): More corrections.	One
+	  FIXME added to DB_Row.defs.hh concerning a "private" that was
+	  temporarily turned into "public".
+
+2006-04-05 Wednesday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagon.inlines.hh, src/Octagon.templates.hh,
+	  src/globals.defs.hh, src/globals.inlines.hh, tests/ppl_test.hh
+	  (octagons.[2,2,1,1,1]): Lots of corrections.
+
+2006-04-05 Wednesday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Makefile.am, src/OR_Matrix.defs.hh,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.types.hh, src/Octagon.cc,
+	  src/Octagon.defs.hh, src/Octagon.inlines.hh,
+	  src/Octagon.templates.hh, src/Octagon.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  tests/Makefile.am (octagons.[1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Imported (with changes) from the private repository.
+
+2006-04-04 Tuesday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.56): The `-V' option is only
+	  available with the PPL version.
+
+2006-04-03 Monday 09:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.12): Revised failing tests for different
+	  checked integer configurations.
+
+2006-04-03 Monday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid3.cc (simplex.1): file grid3.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-03 Monday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.119), Constraint.inlines.hh (1.63):
+	  Added Constraint operator==(Variable v1, Variable v2), Constraint
+	  operator<=(Variable v1, Variable v2), Constraint
+	  operator>=(Variable v1, Variable v2), Constraint
+	  operator<(Variable v1, Variable v2) and Constraint
+	  operator>(Variable v1, Variable v2).
+
+2006-04-03 Monday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.13), BD_Shape.templates.hh (1.4),
+	  DB_Matrix.inlines.hh (1.25): Drop spurious semicolons.
+
+2006-04-03 Monday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.118): Use vertical spacing to separate
+	  declarations from one another.
+
+2006-03-31 Friday 16:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.templates.hh (1.5), Grid_Generator.cc (1.7),
+	  Grid_Generator.defs.hh (1.15), Grid_Generator.inlines.hh (1.9),
+	  Grid_nonpublic.cc (1.8), Grid_public.cc (1.16): A grid generator
+	  is a "grid_line", "parameter" or "grid_point".
+
+2006-03-31 Friday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.inlines.hh (simplex.1): file
+	  Grid_Generator.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-31 Friday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.15): Allow for the empty constraint system
+	  when constructing a grid.  This fixes a bug illustrated by test03
+	  in grid3.cc
+
+2006-03-31 Friday 14:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.11): test03 inserted to show a bug in the
+	  grids system when constructing a grid from an empty constraint
+	  system.
+
+2006-03-28 Tuesday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.192), README (1.49), configure.ac (1.231),
+	  src/Makefile.am (1.151): We are now in the 0.10 era.
+
+2006-03-28 Tuesday 11:19  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[37,26]):
+	  Underline the difference betweeen the `steepest-edge' and
+	  `textbook' techniques.
+
+2006-03-24 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_simplify.cc (1.11), Polyhedra_Powerset.templates.hh
+	  (1.3): Spurious semicolons removed.
+
+2006-03-24 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.templates.hh (simplex.1): file
+	  Polyhedra_Powerset.templates.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.7): Avoid variable re-declaration.
+
+2006-03-24 Friday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.inlines.hh (1.7), Congruence_System.inlines.hh
+	  (1.4): Inline definitions moved before their first use.
+
+2006-03-24 Friday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.inlines.hh (simplex.1): file
+	  Congruence_System.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generator1.cc (simplex.1): file generator1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.4), src/Grid_Generator.cc (1.6),
+	  src/Grid_Generator.defs.hh (1.14), src/Grid_Generator.inlines.hh
+	  (1.8), src/Grid_conversion.cc (1.6), src/Grid_public.cc (1.14),
+	  src/Grid_simplify.cc (1.10), tests/Grid/generator1.cc (1.10):
+	  Method Coefficient& Grid_Generator::divisor() removed.  Method
+	  void
+	  Grid_Generator::set_divisor(Coefficient_traits::const_reference)
+	  added.
+
+2006-03-24 Friday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence_System.inlines.hh (1.3),
+	  Grid_Generator_System.inlines.hh (1.7): Inline definitions moved
+	  before their first use.
+
+2006-03-24 Friday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generator1.cc (1.9): FIXME added.
+
+2006-03-24 Friday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (1.10): Spurious variable re-declaration
+	  removed.
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.17), BD_Shape.defs.hh (1.67),
+	  Congruence.cc (1.4), Congruence.defs.hh (1.7),
+	  Congruence.inlines.hh (1.6), Congruence_System.cc (1.9),
+	  Congruence_System.defs.hh (1.8), Constraint.cc (1.58),
+	  Constraint.defs.hh (1.117), Constraint_System.cc (1.17),
+	  Constraint_System.defs.hh (1.28), DB_Matrix.defs.hh (1.20),
+	  Generator.cc (1.69), Generator.defs.hh (1.117),
+	  Generator_System.cc (1.18), Generator_System.defs.hh (1.17),
+	  Grid.defs.hh (1.14), Grid_Generator.cc (1.5),
+	  Grid_Generator.defs.hh (1.13), Grid_Generator_System.cc (1.6),
+	  Grid_Generator_System.defs.hh (1.11), Grid_Status.cc (1.3),
+	  Grid_Status.idefs.hh (1.3), Grid_public.cc (1.13), LP_Problem.cc
+	  (1.13), LP_Problem.defs.hh (1.8), Linear_Row.cc (1.18),
+	  Linear_Row.defs.hh (1.19), Linear_System.cc (1.38),
+	  Linear_System.defs.hh (1.25), Matrix.cc (1.93), Matrix.defs.hh
+	  (1.76), Ph_Status.cc (1.10), Ph_Status.idefs.hh (1.17),
+	  Poly_Con_Relation.cc (1.13), Poly_Con_Relation.defs.hh (1.32),
+	  Poly_Gen_Relation.cc (1.13), Poly_Gen_Relation.defs.hh (1.30),
+	  Polyhedra_Powerset.defs.hh (1.34), Polyhedron.defs.hh (1.296),
+	  Polyhedron_public.cc (1.74), Row.cc (1.98), Row.defs.hh (1.105),
+	  Saturation_Matrix.cc (1.9), Saturation_Matrix.defs.hh (1.8):
+	  Unwanted semicolons removed.
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.defs.hh (simplex.1): file
+	  Congruence_System.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh (simplex.1): file Grid.defs.hh was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.defs.hh (simplex.1): file
+	  Grid_Generator_System.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.idefs.hh (simplex.1): file Grid_Status.idefs.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 16:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.inlines.hh (1.7): Inline definitions moved
+	  before their first use.
+
+2006-03-24 Friday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affinedim1.cc (1.9), bounded1.cc (1.10), bounds1.cc
+	  (1.11), discrete1.cc (1.4), maxmin1.cc (1.7), topclosed1.cc
+	  (1.8): Replaced assert(copy_compare(...)) with a comment.
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinedim1.cc (simplex.1): file affinedim1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounded1.cc (simplex.1): file bounded1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounds1.cc (simplex.1): file bounds1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/discrete1.cc (simplex.1): file discrete1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosed1.cc (simplex.1): file topclosed1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (1.12), src/Grid_Generator.inlines.hh
+	  (1.6), tests/Grid/generator1.cc (1.8): Added coefficient() to
+	  Grid_Generator class.
+
+2006-03-24 Friday 11:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/widening2.cc (1.3): There is positive overflow for
+	  tests 12 and 13 for checked 8.
+
+2006-03-24 Friday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening2.cc (simplex.1): file widening2.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 11:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh (1.6): Indentation fixed.
+
+2006-03-24 Friday 11:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.5), Congruence.inlines.hh (1.5),
+	  Linear_Expression.defs.hh (1.24): Lots of bogus declarations
+	  fixed.
+
+2006-03-23 Thursday 23:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.9): All comments on right of code moved
+	  (and, as needed, reworded) to separate line(s) before code being
+	  commented.
+
+2006-03-23 Thursday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.13), Grid_simplify.cc (1.8): Enforce a bit
+	  of const-correctness.
+
+2006-03-23 Thursday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc (1.7): Avoid the creation of several
+	  temporaries.
+
+2006-03-23 Thursday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.295), Polyhedron_chdims.cc (1.36),
+	  Polyhedron_public.cc (1.73): Do not use `f(...)' to mean function
+	  `f': use `f()' instead (the ellipsis indicates variable number of
+	  arguments in C++).  Puncutation fixes in comments.
+
+2006-03-22 Wednesday 13:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.196), src/Congruence.defs.hh (1.4),
+	  src/Congruence.inlines.hh (1.4), src/Linear_Expression.defs.hh
+	  (1.23), tests/Grid/congruence1.cc (1.11): Added n %= e to the
+	  allowed set of congruence constructors.  The current
+	  implementation is temporary; an executable specification needing
+	  friendship of Linear_Expression.
+
+2006-03-22 Wednesday 13:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruence1.cc (simplex.1): file congruence1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-22 Wednesday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.46): Removed find_variation(): it was plain
+	  nonsense.
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation3.cc (simplex.1): file
+	  limitedextrapolation3.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening1.cc (simplex.1): file widening1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening3.cc (simplex.1): file widening3.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.195), src/Grid.defs.hh (1.12),
+	  src/Grid_widenings.cc (1.6), tests/Grid/Makefile.am (1.29),
+	  tests/Grid/limitedextrapolation1.cc (1.8),
+	  tests/Grid/limitedextrapolation2.cc (1.2),
+	  tests/Grid/limitedextrapolation3.cc (1.1),
+	  tests/Grid/widening1.cc (1.10), tests/Grid/widening2.cc (1.2),
+	  tests/Grid/widening3.cc (1.1): There are now three flavours of
+	  grid widening.
+
+	  The `generator_widening_assign()' is as commited previously
+	  (using generators) and file `widening2.cc' tests this.
+
+	  The `congruence_widening_assign()' is a renaming of the old
+	  `widening_assign()' (using congruences) and `widening1.cc' tests
+	  this.
+
+	  The new `widening_assign()' uses either of the above two
+	  widenings depending on which of the systems describing the grid
+	  are up-to-date. The new test file `widening3.cc' tests this
+	  widening.
+
+	  There are, similarly, three flavours of a
+	  `limited_*extrapolation_assign()' operator.
+
+	  The documentation in `definitions.dox' on the grid widening has
+	  been brought up to date and improved.
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_widenings.cc (simplex.1): file Grid_widenings.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation1.cc (simplex.1): file
+	  limitedextrapolation1.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation2.cc (simplex.1): file
+	  limitedextrapolation2.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-14 Tuesday 11:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.11), src/Grid_Generator.defs.hh (1.11),
+	  src/Grid_Generator.inlines.hh (1.5), src/Grid_widenings.cc (1.5),
+	  tests/Grid/Makefile.am (1.28),
+	  tests/Grid/limitedextrapolation2.cc (1.1),
+	  tests/Grid/widening2.cc (1.1): Added new methods
+	  generator_widening_assign() and
+	  limited_generator_widening_assign() as defined in draft paper.
+
+	  Added method is_equal_at_dimension() for grid generators which is
+	  a clone of the existing method for congruences.
+
+	  widening2.cc and limitedextrapolation2.cc check the new widening.
+
+2006-03-13 Monday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.27): Added ascii_dump_load1.dat to
+	  MOSTLYCLEANFILES.
+
+2006-03-12 Sunday 20:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem1.cc (1.10): Tests in
+	  congruencesystem1.cc now included in congruences2.cc.
+
+2006-03-12 Sunday 10:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (1.4): Typo in comment corrected.
+
+2006-03-12 Sunday 10:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.26), congruences1.cc (1.8),
+	  congruences2.cc (1.1), congruencesystem1.cc (1.9), generator1.cc
+	  (1.7), generators1.cc (1.10), grid3.cc (1.10),
+	  removespacedims1.cc (1.9), removespacedims2.cc (1.7): To improve
+	  coverage of testing added further tests.
+
+	  Test program congruences1 split into congruences1 and
+	  congruences2 to make room for extra tsets in congruences1.
+
+	  Tests in removespacedims1 check remove_space_dimensions while
+	  tests in  removespacedims2 check remove_higher_space_dimensions.
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences1.cc (simplex.1): file congruences1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences2.cc (simplex.1): file congruences2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators1.cc (simplex.1): file generators1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims1.cc (simplex.1): file
+	  removespacedims1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims2.cc (simplex.1): file
+	  removespacedims2.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-12 Sunday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_9-branch.1): Update version.
+
+2006-03-12 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_9-branch.[1,1]): Mark
+	  ChangeLog.
+
+2006-03-11 Saturday 12:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/asciidumpload2.cc (1.1): Further tests for
+	  ascii_load() to improve coverage.
+
+2006-03-11 Saturday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload2.cc (simplex.1): file asciidumpload2.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.25), addconstraints1.cc (1.9),
+	  addspacedims1.cc (1.10), asciidumpload1.cc (1.7), concatenate1.cc
+	  (1.10), congruence1.cc (1.10), congruencesystem1.cc (1.8),
+	  equals1.cc (1.9), generators1.cc (1.9), grid2.cc (1.10), grid3.cc
+	  (1.9), mincongruences1.cc (1.8), relations1.cc (1.10),
+	  relations2.cc (1.9), removespacedims1.cc (1.8): Small changes o
+	  existing tests.  Several new tests (in the existing files added
+	  to improve test coverage.  A few of these extra tests showed up
+	  bugs that are now fixed.
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraints1.cc (simplex.1): file
+	  addconstraints1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addspacedims1.cc (simplex.1): file addspacedims1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/concatenate1.cc (simplex.1): file concatenate1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/equals1.cc (simplex.1): file equals1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid2.cc (simplex.1): file grid2.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mincongruences1.cc (altnum.1): file mincongruences1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mincongruences1.cc (simplex.1): file
+	  mincongruences1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations1.cc (simplex.1): file relations1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations2.cc (simplex.1): file relations2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 09:53  Andrea Cimino
+
+	* TODO (simplex.4): Removed the previously added item.	In the
+	  incremental implementation, the check that a slack variable can
+	  avoid an artifical one is already implemented.
+
+2006-03-11 Saturday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.26): Updated.
 
 2006-03-11 Saturday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
 
@@ -10,10 +34692,25 @@
 
 	* debian/README (1.2): Incomplete sentence removed.
 
+2006-03-10 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/README (altnum.1): file README was added on branch altnum
+	  on 2006-10-29 19:26:52 +0000
+
+2006-03-10 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/README (simplex.1): file README was added on branch
+	  simplex on 2006-05-08 17:15:45 +0000
+
 2006-03-10 Friday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* debian/changelog (1.4): Updated for PPL 0.9.
 
+2006-03-10 Friday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/changelog (altnum.1): file changelog was added on branch
+	  altnum on 2006-10-29 19:26:52 +0000
+
 2006-03-10 Friday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* ChangeLog (1.25), Watchdog/ChangeLog (1.15): Updated.
@@ -72,6 +34769,18 @@
 	  Random_Number_Generator.inlines.hh (1.8): Allow for the
 	  specification of a fixed seed.
 
+2006-03-09 Thursday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.defs.hh (altnum.1): file
+	  Random_Number_Generator.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-03-09 Thursday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh (altnum.1): file
+	  Random_Number_Generator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
 2006-03-09 Thursday 08:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
 
 	* src/: Grid_Generator.cc (1.4), Grid_Generator_System.inlines.hh
@@ -207,6 +34916,17 @@
 	  (1.4): Using std::distance() to compute the number of
 	  constraints/generators and check their count is the expected one.
 
+2006-03-06 Monday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize1.cc (altnum.1): file nncminimize1.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize1.cc (simplex.1): file
+	  nncminimize1.cc was added on branch simplex on 2006-05-08
+	  17:15:57 +0000
+
 2006-03-06 Monday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* src/: Congruence_System.defs.hh (1.7), Constraint_System.defs.hh
@@ -220,6 +34940,282 @@
 
 2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* tests/Polyhedron/addcongruence1.cc (altnum.1): file
+	  addcongruence1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Grid/addcongruence1.cc, Polyhedron/addcongruence1.cc
+	  (simplex.[1,1]): file addcongruence1.cc was added on branch
+	  simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruences1.cc (altnum.1): file
+	  addcongruences1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Grid/addcongruences1.cc, Polyhedron/addcongruences1.cc
+	  (simplex.[1,1]): file addcongruences1.cc was added on branch
+	  simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraint1.cc (simplex.1): file addconstraint1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerator1.cc (simplex.1): file addgenerator1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerators1.cc (simplex.1): file addgenerators1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage1.cc (simplex.1): file affineimage1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage1.cc (simplex.1): file
+	  affinepreimage1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage2.cc (simplex.1): file
+	  affinepreimage2.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bhz03widening1.cc (simplex.1): file bhz03widening1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedbhrz03extrapolation1.cc (altnum.1): file
+	  boundedbhrz03extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox1.cc (simplex.1): file boundingbox1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox2.cc (simplex.1): file boundingbox2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/certificate1.cc (simplex.1): file certificate1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/cnncconversion1.cc (altnum.1): file
+	  cnncconversion1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/cnncconversion1.cc (simplex.1): file
+	  cnncconversion1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (altnum.1): file congruences1.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (simplex.1): file
+	  congruences1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/contains1.cc (simplex.1): file contains1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/copyconstruct1.cc (altnum.1): file copyconstruct1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/copyconstruct1.cc (simplex.1): file copyconstruct1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox1.cc (simplex.1): file coveringbox1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox2.cc (simplex.1): file coveringbox2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/disjoint1.cc (simplex.1): file disjoint1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/expandspacedim1.cc (simplex.1): file
+	  expandspacedim1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/foldspacedims1.cc (simplex.1): file foldspacedims1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage1.cc (simplex.1): file
+	  generalizedaffineimage1.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage2.cc (simplex.1): file
+	  generalizedaffineimage2.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generalizedaffinepreimage1.cc (altnum.1): file
+	  generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage1.cc (simplex.1): file
+	  generalizedaffinepreimage1.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generalizedaffinepreimage2.cc (altnum.1): file
+	  generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage2.cc (simplex.1): file
+	  generalizedaffinepreimage2.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid1.cc (simplex.1): file grid1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/griddifference1.cc (simplex.1): file
+	  griddifference1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/intersection1.cc (simplex.1): file intersection1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isempty1.cc (simplex.1): file isempty1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isuniverse1.cc (altnum.1): file isuniverse1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isuniverse1.cc (simplex.1): file isuniverse1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join2.cc (simplex.1): file join2.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mapspacedims1.cc (simplex.1): file mapspacedims1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/membytes1.cc (simplex.1): file membytes1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mingenerators1.cc (simplex.1): file mingenerators1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (altnum.1): file nncminimize2.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (simplex.1): file
+	  nncminimize2.cc was added on branch simplex on 2006-05-08
+	  17:15:57 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (altnum.1): file numberinput1.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/timeelapse1.cc (simplex.1): file timeelapse1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosure1.cc (altnum.1): file topclosure1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosure1.cc (simplex.1): file topclosure1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* tests/: ppl_test.hh (1.45), BD_Shape/addconstraints1.cc (1.11),
 	  BD_Shape/addspacedims1.cc (1.11), BD_Shape/affinedimension1.cc
 	  (1.7), BD_Shape/affineimage1.cc (1.12), BD_Shape/affineimage2.cc
@@ -343,6 +35339,22 @@
 	  Polyhedron/writerelation1.cc (1.10): Obsolete macro DO_TEST
 	  removed.  Macros NEW_TEST* renamed DO_TEST*.
 
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (altnum.1): file closure1.cc was added
+	  on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (altnum.1): file
+	  generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/writebdshape1.cc (altnum.1): file writebdshape1.cc
+	  was added on branch altnum on 2006-10-29 19:27:22 +0000
+
 2006-03-06 Monday 08:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
 
 	* tests/Grid/topclosed1.cc (1.6): Renovation of topclosed1.cc done.
@@ -491,14 +35503,43 @@
 
 2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* m4/ac_cxx_long_double_binary_format.m4 (altnum.1): file
+	  ac_cxx_long_double_binary_format.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (simplex.1): file
+	  ac_cxx_long_double_binary_format.m4 was added on branch simplex
+	  on 2006-05-08 17:15:48 +0000
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* m4/ac_cxx_double_binary_format.m4 (1.3): Fixed a couple of
 	  comments.
 
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (altnum.1): file
+	  ac_cxx_double_binary_format.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (simplex.1): file
+	  ac_cxx_double_binary_format.m4 was added on branch simplex on
+	  2006-05-08 17:15:48 +0000
+
 2006-03-05 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* tests/BD_Shape/: Makefile.am (1.41), run_tests (1.17): Do not
 	  test with unsupported floating point types.
 
+2006-03-05 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (altnum.1): file run_tests was added on
+	  branch altnum on 2006-10-29 19:27:22 +0000
+
 2006-03-04 Saturday 23:16  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* tests/Polyhedron/polypowerset1.cc (1.19): Adapted to the new
@@ -525,6 +35566,18 @@
 	  (1.65), src/checked_numeric_limits.hh (1.15): More improvements
 	  concerning the detection of supported floating point numbers.
 
+2006-03-04 Saturday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float_binary_format.m4 (altnum.1): file
+	  ac_cxx_float_binary_format.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-03-04 Saturday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float_binary_format.m4 (simplex.1): file
+	  ac_cxx_float_binary_format.m4 was added on branch simplex on
+	  2006-05-08 17:15:48 +0000
+
 2006-03-04 Saturday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* configure.ac (1.227), m4/ac_cxx_double_binary_format.m4 (1.1),
@@ -1203,6 +36256,11 @@
 	  checked_ext.defs.hh (1.11), checked_ext.inlines.hh (1.30),
 	  checked_int.inlines.hh (1.50): Try to avoid long source lines.
 
+2006-02-26 Sunday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.cc (simplex.1): file Grid_Certificate.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
 2006-02-26 Sunday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* src/Float.inlines.hh (1.26): Do not leave operators ad end of
@@ -1293,6 +36351,16 @@
 
 2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* m4/ac_text_md5sum.m4 (altnum.1): file ac_text_md5sum.m4 was added
+	  on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_text_md5sum.m4 (simplex.1): file ac_text_md5sum.m4 was
+	  added on branch simplex on 2006-05-08 17:15:48 +0000
+
+2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* configure.ac (1.224), demos/ppl_lcdd/Makefile.am (1.23),
 	  m4/ac_text_md5sum.m4 (1.1): New function to set the command for
 	  computing the MD5 checksum of text files.  Old (not working)
@@ -1348,6 +36416,12 @@
 	* tests/valgrind_suppressions (1.4): Ignore warnings originating
 	  from /usr/bin/make.
 
+2006-02-22 Wednesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/valgrind_suppressions (simplex.1): file
+	  valgrind_suppressions was added on branch simplex on 2006-05-08
+	  17:15:53 +0000
+
 2006-02-22 Wednesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* tests/Polyhedron/Makefile.am (1.51): Path fixed.
@@ -1689,6 +36763,23 @@
 	  structure; non-exceptions failure of one test does prevent the
 	  other tests to be run.  Several tests have also been fixed.
 
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.cc (simplex.1): file Partial_Function.cc
+	  was added on branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.defs.hh (altnum.1): file
+	  Partial_Function.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:21 +0000
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.defs.hh (simplex.1): file
+	  Partial_Function.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:53 +0000
+
 2006-02-15 Wednesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* tests/Polyhedron/Makefile.am (1.49): dualhypercubes also fails
@@ -1758,11 +36849,45 @@
 	  Partial_Function and implemented consistently.  Avoided code
 	  duplication for print_function().
 
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.inlines.hh (altnum.1): file
+	  Partial_Function.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.inlines.hh (simplex.1): file
+	  Partial_Function.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:53 +0000
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.types.hh (altnum.1): file
+	  Partial_Function.types.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.types.hh (simplex.1): file
+	  Partial_Function.types.hh was added on branch simplex on
+	  2006-05-08 17:15:53 +0000
+
 2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* src/fpu-sparc.inlines.hh (1.5): Definitions of FPU_UPWARD and
 	  FPU_DOWNWARD fixed.
 
+2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (altnum.1): file fpu-sparc.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (simplex.1): file fpu-sparc.inlines.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
 2006-02-13 Monday 19:17  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* tests/BD_Shape/: addconstraints1.cc (1.7), addspacedims1.cc
@@ -1875,6 +37000,12 @@
 
 2006-02-13 Monday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* src/Polyhedron.templates.hh (simplex.1): file
+	  Polyhedron.templates.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-02-13 Monday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* doc/devref.doxyconf-html.in (1.69), doc/devref.doxyconf-latex.in
 	  (1.10), src/Makefile.am (1.148), src/Polyhedron.defs.hh (1.294),
 	  src/Polyhedron.inlines.hh (1.131), src/Polyhedron.templates.hh
@@ -1964,6 +37095,17 @@
 	  tests/Polyhedron/congruences1.cc (1.4): Copyright years made
 	  consistent across the entire library.
 
+2006-02-13 Monday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.copyright.in (altnum.1): file
+	  libppl-pwl.copyright.in was added on branch altnum on 2006-10-29
+	  19:26:52 +0000
+
+2006-02-13 Monday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.copyright.in (altnum.1): file libppl.copyright.in
+	  was added on branch altnum on 2006-10-29 19:26:52 +0000
+
 2006-02-13 Monday 08:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
 
 	* tests/ppl_test.hh (1.35): "const" added in copy_compare().
@@ -2171,6 +37313,18 @@
 	  (1.8), globals.defs.hh (1.36): Inserting the Grid classes in the
 	  C++ interface documentation group.
 
+2006-02-11 Saturday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.defs.hh (altnum.1): file
+	  Grid_Certificate.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-02-11 Saturday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.defs.hh (simplex.1): file
+	  Grid_Certificate.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
 2006-02-11 Saturday 15:51  Andrea Cimino
 
 	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[31,23]):
@@ -2209,6 +37363,11 @@
 	  tests/Polyhedron/watchdog1.cc (1.8): We now directly create
 	  `pwl.hh': `pwl_install.hh' does not exist any longer.
 
+2006-02-11 Saturday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/.cvsignore (altnum.1): file .cvsignore was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
 2006-02-11 Saturday 11:06  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* src/Polyhedra_Powerset.inlines.hh (1.40): Added a couple of
@@ -2220,6 +37379,21 @@
 	  doc/.cvsignore (1.3), src/.cvsignore (1.10), utils/.cvsignore
 	  (1.2): Ignore more built files and directories.
 
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/.cvsignore (altnum.1): file .cvsignore was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/.cvsignore (altnum.1): file .cvsignore was added on branch
+	  altnum on 2006-10-29 19:26:52 +0000
+
+2006-02-11 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (altnum.1): file ppl-config.cc.in was added
+	  on branch altnum on 2006-10-29 19:27:15 +0000
+
 2006-02-11 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* demos/ppl_lcdd/ppl_lcdd.cc (1.55), interfaces/C/ppl_c.cc (1.152),
@@ -2249,6 +37423,16 @@
 	  fpu_rounding_direction_type and fpu_rounding_control_word_type
 	  are unconditionally defined to be the int type.
 
+2006-02-10 Friday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.types.hh (altnum.1): file fpu.types.hh was added on
+	  branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-10 Friday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.types.hh (simplex.1): file fpu.types.hh was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
 2006-02-10 Friday 20:05  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* src/checked_float.inlines.hh (1.61): Avoid long lines.
@@ -2273,6 +37457,23 @@
 	* m4/ac_check_fpu_control.m4 (1.2): Use AC_LANG_SOURCE to obtain
 	  the test program source.
 
+2006-02-10 Friday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (altnum.1): file
+	  ac_check_fpu_control.m4 was added on branch altnum on 2006-10-29
+	  19:27:11 +0000
+
+2006-02-10 Friday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (simplex.1): file
+	  ac_check_fpu_control.m4 was added on branch simplex on 2006-05-08
+	  17:15:48 +0000
+
+2006-02-10 Friday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-none.inlines.hh (altnum.1): file fpu-none.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
 2006-02-10 Friday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* configure.ac (1.217), src/Init.cc (1.24), src/fpu-none.inlines.hh
@@ -2358,6 +37559,11 @@
 	  (1.58), checked_numeric_limits.hh (1.13), float.types.hh (1.15):
 	  Better abstraction for float binary format.
 
+2006-02-08 Wednesday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.cc (altnum.1): file Float.cc was added on branch altnum
+	  on 2006-10-29 19:27:12 +0000
+
 2006-02-06 Monday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* src/Makefile.am (1.144): Distribute also fpu-none.inlines.hh and
@@ -2483,7 +37689,7 @@
 	* m4/ac_cxx_float128_binary_format.m4 (1.1): New function to detect
 	  the binary format used by 128-bit floats.
 
-2006-02-05 Sunday 14:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-02-05 Sunday 14:17  Matthew Mundell
 
 	* tests/Grid/: certificate1.cc (1.4), isuniverse1.cc (1.4): Take
 	  out stray calls to ascii_dump.
@@ -2581,35 +37787,35 @@
 	  widening1.cc so that those based on examples 8 and 9 are
 	  together.
 
-2006-02-01 Wednesday 01:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-02-01 Wednesday 01:34  Matthew Mundell
 
 	* tests/Grid/Makefile.am (1.6): Take NOISY directive out of
 	  AM_CPPFLAGS.
 
-2006-02-01 Wednesday 01:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-02-01 Wednesday 01:04  Matthew Mundell
 
 	* debian/README (1.1): Initial revision.
 
-2006-01-31 Tuesday 19:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:12  Matthew Mundell
 
 	* tests/Grid/grid2.cc (1.4): Move variables to a local namespace.
 
-2006-01-31 Tuesday 19:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:12  Matthew Mundell
 
 	* tests/Grid/grid1.cc (1.5): Ensure that all exception tests emit
 	  noisy messages.  Move variables to a local namespace.
 
-2006-01-31 Tuesday 19:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:11  Matthew Mundell
 
 	* tests/Grid/equals1.cc (1.3): Add tests to cover the rest of
 	  Grid::quick_equivalence_test().  Move variables to a local
 	  namespace.
 
-2006-01-31 Tuesday 19:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:09  Matthew Mundell
 
 	* tests/Grid/bounds1.cc (1.3): Add space dimension exception test.
 
-2006-01-31 Tuesday 19:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:08  Matthew Mundell
 
 	* tests/Grid/: addgenerator1.cc (1.5), addspacedims1.cc (1.4),
 	  addspacedims2.cc (1.4), concatenate1.cc (1.4), congruence1.cc
@@ -2617,45 +37823,50 @@
 	  join3.cc (1.4), relations1.cc (1.5): Ensure that all exception
 	  tests emit noisy messages and exit correctly.
 
-2006-01-31 Tuesday 19:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:05  Matthew Mundell
 
 	* tests/Grid/addcongruences1.cc (1.5): Add tests that exercise the
 	  case in minimize() where both systems are up-to-date.
 
-2006-01-31 Tuesday 19:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 19:03  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (1.5): Replace the empty check in the
 	  minimize() case where both systems are up-to-date with an
 	  assertion that the congruence system is empty.
 
-2006-01-31 Tuesday 13:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 13:20  Matthew Mundell
 
 	* tests/Grid/removespacedims2.cc (1.3): Add tests where: the
 	  resulting grid is the zero dimension universe, the resulting grid
 	  is the same, a space dimension exception is thrown.
 
-2006-01-31 Tuesday 13:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 13:18  Matthew Mundell
 
 	* tests/Grid/removespacedims1.cc (1.3): Add tests of: the exception
 	  case, passing the empty variable set and an outcome of a zero
 	  dimension universe.
 
-2006-01-31 Tuesday 13:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 13:16  Matthew Mundell
 
 	* tests/Grid/: expandspacedim1.cc (1.3), foldspacedims1.cc (1.3):
 	  Add tests of exception cases.
 
-2006-01-31 Tuesday 13:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 13:10  Matthew Mundell
 
 	* tests/Grid/concatenate1.cc (1.3): Add possible space dimension
 	  exception test.
 
-2006-01-31 Tuesday 13:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 13:09  Matthew Mundell
 
 	* src/Grid_chdims.cc (1.4): Correct exception message in
 	  expand_space_dimension.
 
-2006-01-30 Monday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-31 Tuesday 13:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_chdims.cc (simplex.1): file Grid_chdims.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-30 Monday 20:00  Matthew Mundell
 
 	* tests/Grid/: addspacedims1.cc (1.3), addspacedims2.cc (1.3):
 	  Update tests to always call find_variation only once, directly
@@ -2663,90 +37874,90 @@
 	  exceptions, zero dimension universes, minimized congruences, and
 	  out-of-date congruences with minimized generators.
 
-2006-01-30 Monday 19:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 19:54  Matthew Mundell
 
 	* src/Grid_chdims.cc (1.3): Update add_space_dimensions_and_project
 	  to adjust dim_kinds when generators are out of date and
 	  congruences are minimized.
 
-2006-01-30 Monday 18:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 18:06  Matthew Mundell
 
 	* tests/Grid/certificate1.cc (1.3): Add test7 where the minimized
 	  generators are used for the Grid_Certificate construction.
 
-2006-01-30 Monday 18:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 18:04  Matthew Mundell
 
 	* src/Grid_Generator.defs.hh (1.7): Correct the Grid class friend
 	  declaration comment.
 
-2006-01-30 Monday 13:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 13:26  Matthew Mundell
 
 	* src/Grid_conversion.cc (1.4): Update lower_triangular and
 	  upper_triangular to check that the diagonal is positive and to
 	  correctly check for squareness when there are virtual rows.
 
-2006-01-30 Monday 11:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 11:30  Matthew Mundell
 
 	* tests/Grid/widening1.cc (1.3): Add exception testing test test16.
 	  Add test17 where minimizing the first congruence system finds
 	  the grid empty.
 
-2006-01-30 Monday 11:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 11:29  Matthew Mundell
 
 	* tests/Grid/limitedextrapolation1.cc (1.3): Add exception tests.
 	  Add test15, which limits with an empty congruence system.
 
-2006-01-30 Monday 11:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 11:27  Matthew Mundell
 
 	* src/Grid_widenings.cc (1.3): Correct the exception message in
 	  method widening_assign.
 
-2006-01-30 Monday 10:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 10:03  Matthew Mundell
 
 	* tests/Grid/join3.cc (1.3): Add test of space dimension exception.
 
-2006-01-30 Monday 10:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 10:02  Matthew Mundell
 
 	* tests/Grid/join1.cc (1.3): Add test of space dimension exception.
 	  Add test where updating the generators finds the grid empty.
 
-2006-01-30 Monday 10:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 10:01  Matthew Mundell
 
 	* tests/Grid/griddifference1.cc (1.3): Update some tests to call
 	  difference_assign instead of grid_difference_assign.	Add space
 	  dimension exception test.
 
-2006-01-30 Monday 10:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 10:00  Matthew Mundell
 
 	* tests/Grid/: generalizedaffinepreimage1.cc (1.3),
 	  generalizedaffinepreimage2.cc (1.3): Add tests with zero
 	  denominator parameters, negative moduli and space dimension
 	  exceptions.
 
-2006-01-30 Monday 09:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 09:59  Matthew Mundell
 
 	* tests/Grid/: affineimage1.cc (1.3), affinepreimage1.cc (1.3),
 	  generalizedaffineimage1.cc (1.3), generalizedaffineimage2.cc
 	  (1.3): Add tests with zero denominator parameters and space
 	  dimension exceptions.
 
-2006-01-30 Monday 09:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 09:56  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (1.4): Add tests for adding to an
 	  empty grid.
 
-2006-01-30 Monday 09:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 09:55  Matthew Mundell
 
 	* tests/Grid/addcongruences1.cc (1.4): Add tests for adding an
 	  empty system and adding a trivial system to a zero dim grid.
 
-2006-01-30 Monday 09:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 09:54  Matthew Mundell
 
 	* tests/Grid/: Makefile.am (1.5), addgenerators1.cc (1.1): Add
 	  addgenerators1, which tests methods that can add multiple
 	  generators to a grid.
 
-2006-01-30 Monday 09:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 09:52  Matthew Mundell
 
 	* src/Grid_public.cc (1.8): Update add_generator(g) to throw an
 	  exception when a parameter is given and the grid is zero
@@ -2754,7 +37965,7 @@
 	  generalized_affine_preimage(lhs,..) lhs space dimension
 	  calculation to aid coverage analysis.
 
-2006-01-30 Monday 09:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-30 Monday 09:40  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (1.4): Rename parameters in
 	  throw_dimension_incompatible(char*, char*, Grid).
@@ -2785,61 +37996,61 @@
 	  Corrected some bugs in the explanation of affine image and
 	  preimage in Polyhedron.defs.hh.
 
-2006-01-28 Saturday 18:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-28 Saturday 18:23  Matthew Mundell
 
 	* tests/Grid/grid2.cc (1.3): Add more zero dimension tests.
 
-2006-01-28 Saturday 18:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-28 Saturday 18:20  Matthew Mundell
 
 	* tests/Grid/: addconstraint1.cc (1.3), addconstraints1.cc (1.3),
 	  contains1.cc (1.3), disjoint1.cc (1.3), grid1.cc (1.4), grid3.cc
 	  (1.3), intersection1.cc (1.3), timeelapse1.cc (1.3): Add space
 	  dimension exception tests.
 
-2006-01-28 Saturday 18:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-28 Saturday 18:19  Matthew Mundell
 
 	* tests/Grid/addcongruences1.cc (1.3): Add space dimension
 	  exception tests.  Add test8 which adds to an empty grid.
 
-2006-01-28 Saturday 18:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-28 Saturday 18:17  Matthew Mundell
 
 	* src/Grid_public.cc (1.7): Update
 	  add_recycled_congruences_and_minimize and
 	  add_recycled_congruences zero dimension grid cases to always
 	  leave the empty grid empty.
 
-2006-01-27 Friday 19:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 19:26  Matthew Mundell
 
 	* tests/Grid/topclosed1.cc (1.3): Add test11 where minimizing the
 	  congruence system finds the grid empty.
 
-2006-01-27 Friday 19:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 19:25  Matthew Mundell
 
 	* tests/Grid/pointed1.cc (1.3): Add a minimal congruence system
 	  case to test5.  Add test11 where minimizing the congruence system
 	  finds the grid empty.
 
-2006-01-27 Friday 19:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 19:23  Matthew Mundell
 
 	* tests/Grid/congruence1.cc (1.3): Add space dimension exception
 	  test.
 
-2006-01-27 Friday 19:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 19:23  Matthew Mundell
 
 	* tests/Grid/bounded1.cc (1.3): Add test13, where a paramter comes
 	  first in the system.
 
-2006-01-27 Friday 19:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 19:22  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (1.3): Add zero dimension and space
 	  dimension exception tests.
 
-2006-01-27 Friday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 19:21  Matthew Mundell
 
 	* tests/Grid/: Makefile.am (1.4), asciidumpload1.cc (1.1),
 	  outputoperator1.cc (1.1): Add asciidumpload1 and outputoperator1.
 
-2006-01-27 Friday 14:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 14:50  Matthew Mundell
 
 	* src/: Grid_simplify.cc (1.3), Grid.templates.hh (1.2),
 	  Grid_Certificate.cc (1.3), Grid_Generator.defs.hh (1.5),
@@ -2852,23 +38063,28 @@
 	  num_rays to num_parameters.  Correct a typo in the Grid_Generator
 	  class doc.
 
-2006-01-27 Friday 14:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 14:43  Matthew Mundell
 
 	* src/Grid.inlines.hh (1.4): Drop the extra
 	  topological_closure_assign and difference_assign PPL namespace
 	  qualifiers.
 
-2006-01-27 Friday 14:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 14:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (simplex.1): file Grid.inlines.hh was added
+	  on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-27 Friday 14:43  Matthew Mundell
 
 	* src/Grid.defs.hh (1.6): Drop the extra rows_are_zero Grid
 	  namespace qualifier.
 
-2006-01-27 Friday 14:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 14:42  Matthew Mundell
 
 	* doc/devref.doxyconf-latex.in (1.9): Clip trailing whitespace.
 	  Add grid-related files.
 
-2006-01-27 Friday 14:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 14:41  Matthew Mundell
 
 	* doc/devref.doxyconf-html.in (1.68): Add missing Grid files to
 	  INPUT.
@@ -2879,7 +38095,7 @@
 	  grids section of the documentation.  Avoid a multiply defined
 	  label warning due to label in the powerset section.
 
-2006-01-27 Friday 11:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-27 Friday 11:48  Matthew Mundell
 
 	* src/: Grid_Generator.defs.hh (1.4), Grid_Generator.inlines.hh
 	  (1.3): Take out method topology.
@@ -2928,34 +38144,39 @@
 
 		  When calling prolog_system/1 use capitalised names.
 
-2006-01-26 Thursday 23:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 23:26  Matthew Mundell
 
 	* tests/Grid/relations2.cc (1.4): Add test15, of an empty grid,
 	  where updating finds the grid empty.	Add test16 to test18 which
 	  require the GCD calculation in relation_with.
 
-2006-01-26 Thursday 23:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 23:24  Matthew Mundell
 
 	* tests/Grid/relations1.cc (1.4): Add zero dim universe test test9.
 
-2006-01-26 Thursday 23:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 23:24  Matthew Mundell
 
 	* tests/Grid/isuniverse1.cc (1.3): Update test4 to actually test
 	  the empty case.  Scrap test10.  Add test15 where use of a point
 	  is required in is_universe.
 
-2006-01-26 Thursday 23:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 23:22  Matthew Mundell
 
 	* tests/Grid/: Makefile.am (1.3), isempty1.cc (1.1): Add isempty1,
 	  which tests is_empty().
 
-2006-01-26 Thursday 23:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 23:20  Matthew Mundell
 
 	* src/Grid_public.cc (1.5): Simplify the satisfy check case in
 	  is_universe.
 
 2006-01-26 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* src/Powerset.templates.hh (simplex.1): file Powerset.templates.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-26 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* STANDARDS (1.31), doc/devref.doxyconf-html.in (1.67),
 	  doc/devref.doxyconf-latex.in (1.8), src/BD_Shape.defs.hh (1.65),
 	  src/BD_Shape.inlines.hh (1.123), src/BD_Shape.templates.hh (1.1),
@@ -2973,71 +38194,71 @@
 	* src/checked.inlines.hh (1.31): Tests reordered so as to avoid a
 	  compiler warning.
 
-2006-01-26 Thursday 21:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 21:32  Matthew Mundell
 
 	* tests/Grid/relations2.cc (1.3): Add test14, of the space
 	  dimension exception.	Add more complex false congruence cases to
 	  test7.
 
-2006-01-26 Thursday 21:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 21:30  Matthew Mundell
 
 	* tests/Grid/relations1.cc (1.3): Add test8, of the space dimension
 	  exception.
 
-2006-01-26 Thursday 21:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 21:29  Matthew Mundell
 
 	* tests/Grid/mincongruences1.cc (1.3): Add test8, of an empty grid
 	  where updating the congruences finds the grid empty.
 
-2006-01-26 Thursday 21:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 21:29  Matthew Mundell
 
 	* tests/Grid/grid1.cc (1.3): Add test23, to test the assignment of
 	  a zero dim universe grid.
 
-2006-01-26 Thursday 21:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 21:28  Matthew Mundell
 
 	* tests/Grid/: generators1.cc (1.3), mingenerators1.cc (1.3): Add
 	  test9, of an empty grid where updating the generators finds the
 	  grid empty.
 
-2006-01-26 Thursday 21:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 21:27  Matthew Mundell
 
 	* src/Grid_public.cc (1.4): Improve the relation_with(cg) zero dim
 	  case a little.
 
-2006-01-26 Thursday 18:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 18:25  Matthew Mundell
 
 	* src/Grid_minimize.cc (1.3), src/Makefile.am (1.141),
 	  doc/devref.doxyconf-html.in (1.66): Complete the integration of
 	  the Grid minimize methods into their callers.
 
-2006-01-26 Thursday 16:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 16:00  Matthew Mundell
 
 	* src/Congruence.cc (1.3): Take old alternative code out of
 	  ascii_load.
 
-2006-01-26 Thursday 14:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 14:50  Matthew Mundell
 
 	* src/Grid_Generator_System.defs.hh (1.4): Correct typo in
 	  add_universe_rows_and_columns doc.
 
-2006-01-26 Thursday 13:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 13:58  Matthew Mundell
 
 	* doc/definitions.dox (1.191): Update anchor names in references in
 	  the grids sections.
 
-2006-01-26 Thursday 13:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 13:56  Matthew Mundell
 
 	* src/Grid_Generator_System.defs.hh (1.3): Correct
 	  add_universe_rows_and_columns doc.
 
-2006-01-26 Thursday 13:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 13:56  Matthew Mundell
 
 	* src/Grid.defs.hh (1.3): Neaten some doc formatting.  Align the
 	  class description as in Polyhedron.  Update reference names in
 	  docs.  Improve docs related to covering boxes.
 
-2006-01-26 Thursday 13:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-26 Thursday 13:52  Matthew Mundell
 
 	* src/Congruence_System.defs.hh (1.3): Correct
 	  add_unit_rows_and_columns doc.  Correct ref in affine_preimage
@@ -3059,15 +38280,15 @@
 
 	* configure.ac (1.207): Version number bumped.
 
-2006-01-25 Wednesday 21:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 21:57  Matthew Mundell
 
 	* TODO (1.177): Complete some grid items, move rest into section 1.
 
-2006-01-25 Wednesday 21:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 21:56  Matthew Mundell
 
 	* src/Grid_public.cc (1.3): Convert final FIX to a FIXME.
 
-2006-01-25 Wednesday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 21:46  Matthew Mundell
 
 	* tests/Makefile.am (1.250): Reorder the directories in SUBDIRS.
 
@@ -3081,6 +38302,114 @@
 	* Watchdog/src/Makefile.in (grids.4): Makefile.in is automatically
 	  generated: it should not be under CVS.
 
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/.cvsignore (altnum.1): file .cvsignore was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.types.hh (altnum.1): file Congruence.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.types.hh (simplex.1): file Congruence.types.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.types.hh (altnum.1): file
+	  Congruence_System.types.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.types.hh (simplex.1): file
+	  Congruence_System.types.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.types.hh (altnum.1): file Grid.types.hh was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.types.hh (simplex.1): file Grid.types.hh was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.inlines.hh (altnum.1): file
+	  Grid_Certificate.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.inlines.hh (simplex.1): file
+	  Grid_Certificate.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.types.hh (altnum.1): file
+	  Grid_Certificate.types.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.types.hh (simplex.1): file
+	  Grid_Certificate.types.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.types.hh (altnum.1): file
+	  Grid_Generator.types.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.types.hh (simplex.1): file
+	  Grid_Generator.types.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.types.hh (altnum.1): file
+	  Grid_Generator_System.types.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.types.hh (simplex.1): file
+	  Grid_Generator_System.types.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.inlines.hh (altnum.1): file
+	  Grid_Status.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.inlines.hh (simplex.1): file
+	  Grid_Status.inlines.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.types.hh (altnum.1): file
+	  Scalar_Products.types.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
 2006-01-25 Wednesday 21:06  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* TODO (1.175), configure.ac (1.206), doc/definitions.dox (1.190),
@@ -3178,7 +38507,7 @@
 	  tests/Polyhedron/congruences1.cc (1.2): First (and, quite likely,
 	  last) merge from the `grids' branch.
 
-2006-01-25 Wednesday 19:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 19:31  Matthew Mundell
 
 	* ChangeLog, Makefile.am, NEWS, README, README.configure, TODO,
 	  configure.ac, ppl.spec.in, Watchdog/CREDITS, Watchdog/ChangeLog,
@@ -3233,22 +38562,22 @@
 	  (grids.[3,6,6,4,4,19,10,3,1,3,2,3,2,3,3,3,2,2,2,2,3,11,8,4,6,4,7,5,6,5,5,3,5,8,8,4,5,5,12,10,3,2,6,11,6,4,6,6,5,4,18,13,5,4,4,3,3,12,7,5,14,9,5,4,3,3,8,10,3,4,2,3,5,4,9,3,4,6,2,4,4,7,11,5,7,6,3,7,4,4,3,3,6,10,3,3,3,3,3,4,3,4,3,3]):
 	  Eighth and last merge from the main trunk.
 
-2006-01-25 Wednesday 16:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 16:34  Matthew Mundell
 
 	* tests/Grid/generalizedaffinepreimage2.cc (grids.6): Correct the
 	  expected results in test17, test18, test21 and test22.
 
-2006-01-25 Wednesday 16:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 16:33  Matthew Mundell
 
 	* tests/Grid/generalizedaffinepreimage1.cc (grids.7): Enable test6
 	  and test7, and adjust their expected results.
 
-2006-01-25 Wednesday 16:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 16:32  Matthew Mundell
 
 	* tests/Grid/generalizedaffineimage2.cc (grids.7): Correct the
 	  expected result in test18.
 
-2006-01-25 Wednesday 16:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 16:31  Matthew Mundell
 
 	* src/Grid_public.cc (grids.138): Correct the
 	  generalized_affine_preimage(lhs,..) case where variables in lhs
@@ -3259,24 +38588,24 @@
 	* interfaces/Prolog/SICStus/Makefile.am (1.64): Always link with
 	  the PIC version of ppl_sicstus_sd.o.
 
-2006-01-25 Wednesday 12:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 12:57  Matthew Mundell
 
 	* src/Grid_public.cc (grids.137): Replace the first
 	  generalized_affine_preimage(lhs,..)  line-adding call to
 	  add_recycled_generators with equivalent code, as in
 	  generalized_affine_image(lhs,..).  Neaten TODO comments.
 
-2006-01-25 Wednesday 12:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 12:48  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.42): Add a simple comment for the
 	  invert-transpose loops in both conversions.
 
-2006-01-24 Tuesday 21:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 21:54  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.41): Improve the comments on the
 	  destination initialization in the conversion methods.
 
-2006-01-24 Tuesday 21:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 21:33  Matthew Mundell
 
 	* src/: Checked_Number.defs.hh (1.68), Checked_Number.inlines.hh
 	  (1.56), GMP_Integer.defs.hh (1.19), GMP_Integer.inlines.hh
@@ -3286,106 +38615,106 @@
 	  checked_mpz.inlines.hh (1.35): Add function
 	  gcdext_assign(to,x,y,s,t) to the GMP and checked integer types.
 
-2006-01-24 Tuesday 16:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 16:54  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.40): Slightly improve comments,
 	  error messages and formatting.
 
-2006-01-24 Tuesday 13:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 13:33  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.39): Improve comments in both
 	  conversion methods.
 
-2006-01-24 Tuesday 11:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 11:52  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.38): Correct the comment in both
 	  conversions about the iteration of source_index and dest_index.
 
-2006-01-24 Tuesday 11:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 11:37  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.37): Leave variable name
 	  tem_source_index as such.
 
-2006-01-24 Tuesday 00:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-24 Tuesday 00:20  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[100,62]): Update
 	  simplify(gs..) to expect the reduction to result in a system
 	  containing a point.
 
-2006-01-23 Monday 23:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 23:38  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.61): Note a possible todo item in the
 	  congruence simplify method.
 
-2006-01-23 Monday 23:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 23:35  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.60): Update
 	  reduce_congruence_with_equality to set the `row' element at
 	  `column' directly and to account for `row' elements known to be
 	  zero.  Improve variable names in same method.
 
-2006-01-23 Monday 23:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 23:28  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.59): Update
 	  reduce_parameter_with_line to set the `row' element at `column'
 	  directly and to account for `row' elements known to be zero.
 
-2006-01-23 Monday 22:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 22:52  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.58): Clean comments and improve
 	  variable names in the reduce methods.  Update these methods to
 	  all subtract the pivot from the row (intead of the other way
 	  around).
 
-2006-01-23 Monday 22:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 22:47  Matthew Mundell
 
 	* src/Grid_public.cc (grids.136): Update minimized_congruences and
 	  Grid::Grid(n,k) to recover the congruence system minimal form
 	  when inserting the zero dimension integrality.
 
-2006-01-23 Monday 22:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 22:41  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence.cc (grids.[44,23]):
 	  Correct a comment in sign_normalize.	Update normalize to always
 	  normalize the constant term, even when all homogeneous terms are
 	  zero.
 
-2006-01-23 Monday 17:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 17:44  Matthew Mundell
 
 	* src/Congruence_System.defs.hh (grids.28): Move swap into the
 	  public section.  Improve the has_a_free_dimension doc a little.
 
-2006-01-23 Monday 16:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 16:21  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.99): Correct the description of
 	  reduce_parameter_with_line.
 
-2006-01-23 Monday 15:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 15:04  Matthew Mundell
 
 	* TODO (grids.18): Complete the ascii_dump item.
 
-2006-01-23 Monday 12:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 12:33  Matthew Mundell
 
 	* src/Grid_public.cc (grids.135): Move the gs space dimension
 	  adjustment in add_recycled_generators to the empty case.
 
-2006-01-23 Monday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-23 Monday 12:31  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[16,25]):
 	  Update coefficient_swap to account for the divisor element and
 	  the sizes of the two generators.
 
-2006-01-22 Sunday 22:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:39  Matthew Mundell
 
 	* src/Generator_System.defs.hh (grids.12): Take out the Grid friend
 	  declaration.
 
-2006-01-22 Sunday 22:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:38  Matthew Mundell
 
 	* tests/Grid/addconstraint1.cc (grids.3): Correct test name in
 	  message.
 
-2006-01-22 Sunday 22:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:38  Matthew Mundell
 
 	* src/: Grid_simplify.cc, Grid.defs.hh, Grid_public.cc
 	  (grids.[57,98,134]): Reduce dependence on the Congruence_System
@@ -3404,12 +38733,12 @@
 
 	  Correct the num_cols init in reduce_parameter_with_line.
 
-2006-01-22 Sunday 22:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:26  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.13): Update select_wider_congruences
 	  to use Congruence::is_equal_at_dimension.
 
-2006-01-22 Sunday 22:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:25  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.31): Reduce dependence on
 	  Congruence_System's Grid friend declaration: update both
@@ -3417,12 +38746,12 @@
 	  Congruence_System::add_unit_rows_and_columns and update
 	  concatenate_assign to use Congruence_System::concatenate.
 
-2006-01-22 Sunday 22:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:18  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.28): Declare old_num_rows in
 	  recycling_insert const.
 
-2006-01-22 Sunday 22:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:18  Matthew Mundell
 
 	* src/: Grid_Generator_System.defs.hh,
 	  Grid_Generator_System.inlines.hh (grids.[22,13]): Add wrapper
@@ -3430,12 +38759,12 @@
 	  permute_columns, erase_to_end, num_columns, resize_no_copy,
 	  set_index_first_pending_row, and unset_pending_rows.
 
-2006-01-22 Sunday 22:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:15  Matthew Mundell
 
 	* src/Congruence.inlines.hh (grids.23): Correct
 	  is_equal_at_dimension.
 
-2006-01-22 Sunday 22:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:15  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[43,27]): Add methods is_equal_to(cgs),
@@ -3444,13 +38773,13 @@
 	  add_rows to insert, updating it to add columns as required and
 	  moving it to the public section.
 
-2006-01-22 Sunday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 22:01  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[40,22]):
 	  Add is_equal_at_dimension.  Improve Grid friend declaration
 	  comment.
 
-2006-01-22 Sunday 21:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 21:34  Matthew Mundell
 
 	* src/Congruence.cc (grids.22): Update operator<< to use
 	  Coefficient_zero() for zero.
@@ -3460,47 +38789,47 @@
 	* src/Constraint.cc (1.56): Print objects of class Coefficient as
 	  such.
 
-2006-01-22 Sunday 15:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 15:29  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.56): Simplify the
 	  reduce_line_with_line comment.  Clean up a few comments the other
 	  reduce_x_with_x methods.
 
-2006-01-22 Sunday 13:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-22 Sunday 13:29  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.55): Update reduce_line_with_line and
 	  reduce_equality_with_equality to set the column'th element of row
 	  directly.
 
-2006-01-21 Saturday 20:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-21 Saturday 20:49  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.54): Take out of
 	  reduce_parameter_with_line a query about an existing improvement.
 
-2006-01-21 Saturday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-21 Saturday 20:45  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.53): Update
 	  reduce_equality_with_equality and reduce_line_with_line to
 	  account for columns that are known to be zero.
 
-2006-01-21 Saturday 20:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-21 Saturday 20:33  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.97): Improve the description of the col
 	  parameter in some of the reduction methods.
 
-2006-01-21 Saturday 19:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-21 Saturday 19:50  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.96): Improve the description of
 	  reduce_line_with_line a little.
 
-2006-01-21 Saturday 19:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-21 Saturday 19:39  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[95,52]): Update
 	  reduce_pc_with_pc to take arguments `start' and `end' instead of
 	  using a `parameters' argument to calculate the start and end of
 	  the relevant portions of the rows.
 
-2006-01-21 Saturday 19:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-21 Saturday 19:29  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.42): Improve a comment in
 	  normalize_moduli.
@@ -3510,66 +38839,76 @@
 	* src/: Checked_Number.defs.hh (1.67), Checked_Number.inlines.hh
 	  (1.55): Simplified Checked and Native mixing.
 
-2006-01-20 Friday 23:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 23:53  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.51): Update reduce_pc_with_pc to set
 	  the column'th element of both row and pivot directly.
 
-2006-01-20 Friday 23:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 23:26  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.50): Correct a comment in the
 	  generator system simplify.
 
-2006-01-20 Friday 23:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 23:21  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.49): Update reduce_pc_with_pc to skip
 	  the trailing or leading columns that are known to be zero.
 
-2006-01-20 Friday 22:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 22:16  Matthew Mundell
 
 	* src/Grid_public.cc (grids.133): Inline the addition of the
 	  congruence in the case where lhs is a constant.
 
-2006-01-20 Friday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 18:44  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.48): Add a rough query to
 	  reduce_pc_with_pc.
 
-2006-01-20 Friday 18:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 18:37  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, grid2_16.cc, grid4.cc (grids.[60,1,3]):
 	  Rename grid4 to grid2_16.
 
-2006-01-20 Friday 18:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 18:34  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.22): Improve the comment about
 	  cong_test4.
 
-2006-01-20 Friday 18:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 18:08  Matthew Mundell
 
 	* tests/Grid/: grid1.cc, grid1_16.cc (grids.[28,2]): Move grid1
 	  test11 and test14 into grid1_16.  Describe grid1_16 test1.
 
-2006-01-20 Friday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 17:43  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, grid1.cc, grid1_16.cc
 	  (grids.[59,27,1]): Add grid1_16, for tests that require integers
 	  of at least 16 bits.	Move grid1 test8 into grid1_16.
 
-2006-01-20 Friday 17:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 17:33  Matthew Mundell
 
 	* debian/: control (ppl-0_8-branch.1), control (1.13): Update
 	  libppl-dev to depend on the system compiler.
 
-2006-01-20 Friday 14:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (altnum.1): file control was added on branch
+	  altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 14:23  Matthew Mundell
 
 	* debian/rules (ppl-0_8-branch.1): Correct version parsing sed
 	  expression.
 
-2006-01-20 Friday 14:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 14:17  Matthew Mundell
 
 	* debian/rules (1.10): Correct version parsing sed expression.
 
+2006-01-20 Friday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/rules (altnum.1): file rules was added on branch altnum on
+	  2006-10-29 19:26:52 +0000
+
 2006-01-20 Friday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* configure.ac (ppl-0_8-branch.1): Update version.
@@ -3588,7 +38927,7 @@
 	* README (ppl-0_8-branch.1): Reflected the fact that some files
 	  have been deleted overnight.
 
-2006-01-20 Friday 06:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 06:17  Matthew Mundell
 
 	* debian/Makefile.am (grids.1): file Makefile.am was added on
 	  branch grids on 2006-01-25 18:31:23 +0000
@@ -3598,47 +38937,57 @@
 	* debian/Makefile.am (1.2): Do not distribute no longer existent
 	  files.
 
-2006-01-20 Friday 01:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/Makefile.am (altnum.1): file Makefile.am was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2006-05-08 17:15:45 +0000
+
+2006-01-20 Friday 01:06  Matthew Mundell
 
 	* debian/: control.prologs (1.2), libppl-gprolog.links (1.2),
 	  libppl-sicstus.links (1.2), libppl-swi.links (1.2),
 	  libppl-yap.links (1.2): Clear out Prolog configuration files.
 
-2006-01-20 Friday 01:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 01:00  Matthew Mundell
 
 	* debian/rules (1.9): Use the system C and C++ compilers.
 
-2006-01-20 Friday 01:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 01:00  Matthew Mundell
 
 	* debian/control (1.12): Revert to the stable distribution (sarge)
 	  dependencies.
 
-2006-01-20 Friday 00:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 00:59  Matthew Mundell
 
 	* debian/changelog (1.3): Add entry for 0.8 release.
 
-2006-01-20 Friday 00:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 00:25  Matthew Mundell
 
 	* src/Grid_Generator_System.defs.hh (grids.21): Improve the
 	  add_universe_rows_and_columns description.
 
-2006-01-20 Friday 00:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-20 Friday 00:24  Matthew Mundell
 
 	* doc/devref.doxyconf-html.in (grids.7): Add to INPUT classes
 	  Grid_Generator, Grid_Generator_System, Grid_Certificate and file
 	  Grid_widenings.cc.
 
-2006-01-19 Thursday 20:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-19 Thursday 20:23  Matthew Mundell
 
 	* tests/Makefile.am (grids.5): Run the grid tests before the
 	  others.
 
-2006-01-19 Thursday 18:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-19 Thursday 18:24  Matthew Mundell
 
 	* tests/BD_Shape/Makefile.am (grids.9): Correct temporary
 	  BD_SHAPE_INSTANCE values.
 
-2006-01-19 Thursday 16:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-19 Thursday 16:59  Matthew Mundell
 
 	* tests/BD_Shape/Makefile.am (grids.8): Temporarily modify to run
 	  the tests once, with BD_SHAPE_INSTANCE set according to
@@ -3656,7 +39005,7 @@
 	  order of arguments already used in all the widening and
 	  extrapolation operators.
 
-2006-01-19 Thursday 12:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-19 Thursday 12:45  Matthew Mundell
 
 	* tests/Grid/limitedextrapolation1.cc (grids.7): Insert a second
 	  token test as test9.
@@ -3675,7 +39024,7 @@
 	* src/NNC_Polyhedron.defs.hh (1.43): Corrected a couple of
 	  comments.
 
-2006-01-19 Thursday 11:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-19 Thursday 11:11  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, grid1.cc, grid1_64.cc
 	  (grids.[58,26,1]): Add grid1_64 for tests that require 64 bit or
@@ -3713,13 +39062,18 @@
 	* m4/ac_check_swi_prolog.m4 (1.9): Fixed the detection of
 	  SWI-Prolog version 5.6.0 or later.
 
-2006-01-18 Wednesday 16:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-18 Wednesday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (altnum.1): file ac_check_swi_prolog.m4
+	  was added on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-01-18 Wednesday 16:25  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, grid1.cc, grid1_gmp.cc
 	  (grids.[57,25,1]): Add grid1_gmp for tests expected to pass only
 	  with GMP integers.  Move grid1 test19 to grid1_gmp.
 
-2006-01-18 Wednesday 13:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-18 Wednesday 13:56  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.47): Add more tracing to
 	  reduce_pc_with_pc.
@@ -3756,30 +39110,30 @@
 	* tests/Polyhedron/powerset1.cc (1.10): Some old compilers do not
 	  fully understand using directives/declarations.
 
-2006-01-17 Tuesday 21:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 21:30  Matthew Mundell
 
 	* tests/Grid/congruencesystem1.cc (grids.10): Revert change made
 	  during testing.
 
-2006-01-17 Tuesday 20:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 20:27  Matthew Mundell
 
 	* tests/Grid/grid4.cc (grids.2): Clear out tracing messages.
 
-2006-01-17 Tuesday 20:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 20:26  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, timeelapse1.cc, timeelapse2.cc
 	  (grids.[56,7,1]): Add timeelapse2, where the tests are expected
 	  to fail with checkedint8.  Move timeelapse1 test9 into
 	  timeelapse2.
 
-2006-01-17 Tuesday 20:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 20:07  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, grid2.cc, grid4.cc (grids.[55,21,1]):
 	  Add grid4 for tests of grids created from congruences where the
 	  tests are expected to fail with checkedint8.	Move grid2 test10
 	  into grid4.
 
-2006-01-17 Tuesday 18:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 18:24  Matthew Mundell
 
 	* src/Checked_Number.defs.hh (grids.11): Take out the four
 	  parameter gcdext_assign declaration.
@@ -3791,13 +39145,13 @@
 	  mapping system. Now the Constraint taken by `incrementality' is
 	  passed by const reference.
 
-2006-01-17 Tuesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 17:03  Matthew Mundell
 
 	* tests/: ppl_test.hh, Grid/congruencesystem1.cc (grids.[18,9]):
 	  Add macro PPL_TEST_STR.  Rename macro stringify to PPL_TEST_XSTR,
 	  correcting the expansion.
 
-2006-01-17 Tuesday 16:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 16:54  Matthew Mundell
 
 	* src/globals.defs.hh (1.33): Correct the macro names in the
 	  PPL_STR and PPL_XSTR docs.
@@ -3830,12 +39184,12 @@
 	* src/Makefile.am (1.138): Removed no longer necessary definition
 	  of DOC_FILES.
 
-2006-01-17 Tuesday 13:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 13:43  Matthew Mundell
 
 	* README (1.42): Change "source distributions" to "source
 	  distribution".
 
-2006-01-17 Tuesday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 12:58  Matthew Mundell
 
 	* README.configure (1.17): Clip trailing whitespace.
 
@@ -3904,6 +39258,11 @@
 	  Added all (user-level) C++ namespaces, classes, structs, defines,
 	  typedefs and enumerations to the new group.
 
+2006-01-17 Tuesday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (altnum.1): file Rounding_Dir.defs.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
 2006-01-17 Tuesday 09:42  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* src/Result.defs.hh (1.14): Hiding initializers of enumeration
@@ -3930,12 +39289,12 @@
 	* tests/Polyhedron/powerset1.cc (1.6): Removed spurious
 	  redeclaration of ps3 (it broke the build).
 
-2006-01-17 Tuesday 01:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 01:35  Matthew Mundell
 
 	* src/Powerset.defs.hh (1.19): Document the requirements for
 	  template parameter D.
 
-2006-01-17 Tuesday 01:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-17 Tuesday 01:13  Matthew Mundell
 
 	* tests/Polyhedron/powerset1.cc (1.5): Involve every method of
 	  Fcaibvp in the test.	Make std::set a private parent of Fcaibvp.
@@ -3953,7 +39312,7 @@
 
 	* NEWS (1.187): Revised a couple of items.
 
-2006-01-16 Monday 22:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 22:25  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.39): Comment the #endif of the
 	  ascii_load doc directive.
@@ -3966,12 +39325,12 @@
 
 	* NEWS (1.185): Added some quotations marks.
 
-2006-01-16 Monday 20:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 20:55  Matthew Mundell
 
 	* NEWS (1.184): Change "all what is needed" to "all that is needed"
 	  and "what is the relation" to "what the relation is".
 
-2006-01-16 Monday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 20:50  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.38): Mark the ascii_load doc an
 	  implementation detail.
@@ -3980,7 +39339,7 @@
 
 	* NEWS (1.183): Drafted a news item concerning checked numbers.
 
-2006-01-16 Monday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 20:00  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence_System.cc,
 	  Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
@@ -4017,7 +39376,7 @@
 
 	* tests/Polyhedron/polypowerset1.cc (1.14): Fixed test12().
 
-2006-01-16 Monday 15:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 15:14  Matthew Mundell
 
 	* src/: Checked_Number.defs.hh, Congruence_System.cc,
 	  GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Grid_conversion.cc,
@@ -4057,7 +39416,7 @@
 	* NEWS (1.182): The section "Integers Represented by Floating Point
 	  Numbers" does not belong to the user's manual.
 
-2006-01-16 Monday 14:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 14:30  Matthew Mundell
 
 	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
 	  Grid_conversion.cc, Grid_simplify.cc (grids.[23,18,35,46]): Move
@@ -4068,7 +39427,7 @@
 	* NEWS (1.181): News items reordered.  Added a notice for the
 	  exchange of unbounded numbers with YAP.
 
-2006-01-16 Monday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 14:28  Matthew Mundell
 
 	* src/: Checked_Number.inlines.hh, GMP_Integer.defs.hh,
 	  GMP_Integer.inlines.hh (grids.[9,8,5]): Rename the wrapped
@@ -4084,6 +39443,11 @@
 
 	* m4/ppl.m4 (1.4): Comparison fixed.
 
+2006-01-16 Monday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (altnum.1): file ppl.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
 2006-01-16 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* interfaces/Prolog/Prolog_interface.dox (1.150): Warn the user
@@ -4203,7 +39567,7 @@
 	  Ptr_Iterator.defs.hh (1.7), Row.defs.hh (1.103): Do not document
 	  implementation-related classes in the user manual.
 
-2006-01-16 Monday 02:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 02:10  Matthew Mundell
 
 	* BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
 	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
@@ -4867,7 +40231,7 @@
 	  Seventh (last but one?) merge of the main trunk to the grids
 	  branch.
 
-2006-01-15 Sunday 22:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 22:22  Matthew Mundell
 
 	* src/Grid_Generator_System.inlines.hh (grids.12): Update method
 	  clear to add the parameter divisor column after clearing.  Add
@@ -4891,7 +40255,7 @@
 	  interfaces/C/Makefile.am (1.23): Allow the C interface not to be
 	  built using the --enable-interfaces configure option.
 
-2006-01-15 Sunday 21:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 21:57  Matthew Mundell
 
 	* src/checked.inlines.hh (grids.9): Update gcdext_exact to always
 	  return errors from functions abs and neg.  Describe the COPY_GMP
@@ -4916,18 +40280,18 @@
 	* src/BDS_Status.inlines.hh (1.12): Fixed a \relates Doxygen
 	  command.
 
-2006-01-15 Sunday 18:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 18:48  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.12): Only add the limiting
 	  congruences if widening will changes the grid.
 
-2006-01-15 Sunday 17:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 17:42  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am (1.45), affinepreimage12.cc (1.1):
 	  Add affinepreimage12, which tests the examples from
 	  definitions.dox.
 
-2006-01-15 Sunday 17:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 17:42  Matthew Mundell
 
 	* tests/Polyhedron/affinepreimage12.cc (grids.1): file
 	  affinepreimage12.cc was added on branch grids on 2006-01-16
@@ -4939,7 +40303,7 @@
 	  "all you need to do is to find it".  "to build." to "to be
 	  built." determined before"" to "already determined".
 
-2006-01-15 Sunday 16:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 16:53  Matthew Mundell
 
 	* src/Checked_Number.defs.hh (1.59): Change "proviso" to
 	  "provisos".
@@ -4960,12 +40324,12 @@
 	  lpproblem3.cc (1.2): Added another test for LP_Problem.  Avoid
 	  redundnat inclusion in lpproblem1.cc.
 
-2006-01-15 Sunday 14:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 14:27  Matthew Mundell
 
 	* tests/Polyhedron/lpproblem1.cc (grids.1): file lpproblem1.cc was
 	  added on branch grids on 2006-01-16 01:10:41 +0000
 
-2006-01-15 Sunday 14:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-15 Sunday 14:27  Matthew Mundell
 
 	* tests/Polyhedron/lpproblem3.cc (grids.1): file lpproblem3.cc was
 	  added on branch grids on 2006-01-16 01:10:41 +0000
@@ -5025,11 +40389,11 @@
 	* tests/Polyhedron/: Makefile.am, lpproblem3.cc (simplex.[4,1]):
 	  Added another test for LP_Problem.
 
-2006-01-14 Saturday 22:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 22:48  Matthew Mundell
 
 	* doc/definitions.dox (1.186): Revert last change.
 
-2006-01-14 Saturday 22:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 22:17  Matthew Mundell
 
 	* doc/definitions.dox (1.185): Replace "there exist a matrix" with
 	  "there exists a matrix" in subsection "Images and Preimages of
@@ -5042,7 +40406,7 @@
 	  `max'.  However, in XSB 2.7.1, <error_xsb.h> still does not come
 	  with the extern "C" wrapper.
 
-2006-01-14 Saturday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 20:30  Matthew Mundell
 
 	* doc/definitions.dox (1.184): Change the first \leq in the affine
 	  relation definition in subsection Generalized_Affine_Relations to
@@ -5118,12 +40482,12 @@
 	  necessary.  Partial specializations of std::numeric_limits
 	  provided with a Doxygen comment.
 
-2006-01-14 Saturday 16:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 16:44  Matthew Mundell
 
 	* NEWS (1.177): Always indent code with two spaces.  Convert tabs
 	  to spaces.
 
-2006-01-14 Saturday 16:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 16:41  Matthew Mundell
 
 	* NEWS (1.176): Correct spelling of "publicly".
 
@@ -5153,11 +40517,11 @@
 	* src/Checked_Number.defs.hh (1.57): Improved the documentation for
 	  input(std::istream&, Checked_Number<T, Policy>&, Rounding_Dir).
 
-2006-01-14 Saturday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 15:48  Matthew Mundell
 
 	* Watchdog/NEWS (1.7): Add detail to the 0.5 Time entry.
 
-2006-01-14 Saturday 15:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 15:37  Matthew Mundell
 
 	* Watchdog/NEWS (1.6): Update 0.8 entries from ChangeLog.
 
@@ -5174,7 +40538,7 @@
 
 	* interfaces/C/ppl_c.h.in (1.62): Typo fixed.
 
-2006-01-14 Saturday 14:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 14:12  Matthew Mundell
 
 	* NEWS (1.175): Update 0.8 entries from ChangeLog.
 
@@ -5253,15 +40617,15 @@
 
 	* src/Powerset.defs.hh (1.16): Some comments revised.
 
-2006-01-13 Friday 14:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-13 Friday 14:52  Matthew Mundell
 
 	* TODO (1.170): Add Debian package TODO list.
 
-2006-01-13 Friday 14:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-13 Friday 14:19  Matthew Mundell
 
 	* debian/control.prologs (1.1): Initial revision.
 
-2006-01-13 Friday 14:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-13 Friday 14:19  Matthew Mundell
 
 	* debian/control.prologs (grids.1): file control.prologs was added
 	  on branch grids on 2006-01-16 01:10:28 +0000
@@ -5273,7 +40637,7 @@
 	  reason, now  is used also by incrementality.	Added some useful
 	  checks in OK().
 
-2006-01-13 Friday 13:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-13 Friday 13:48  Matthew Mundell
 
 	* debian/control (1.11): Only build the packages for which Debian
 	  provides the build requirements.
@@ -5298,26 +40662,46 @@
 	  extrapolation operator.  Removed a couple of misplaced OK()
 	  assertions.
 
-2006-01-12 Thursday 22:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 22:43  Matthew Mundell
 
 	* interfaces/Prolog/GNU/README (1.2): Clip trailing whitespace.
 
-2006-01-12 Thursday 22:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README (altnum.1): file README was added on
+	  branch altnum on 2006-10-29 19:27:02 +0000
+
+2006-01-12 Thursday 22:42  Matthew Mundell
 
 	* debian/libppl-pwl.install (1.3): Add usr/lib/libpwl.so.
 
-2006-01-12 Thursday 22:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.install (altnum.1): file libppl-pwl.install was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:42  Matthew Mundell
 
 	* debian/: libppl-dev.install (1.3), libppl.install (1.5): Move
 	  usr/lib/libppl.so from libppl-dev to libppl.	Add
 	  usr/bin/ppl-config to libppl.
 
-2006-01-12 Thursday 22:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.install (altnum.1): file libppl-dev.install was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.install (altnum.1): file libppl.install was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:39  Matthew Mundell
 
 	* debian/control (1.10): Drop the libppl-swi and libppl-gprolog
 	  dependencies on swi-prolog and gprolog, resp.
 
-2006-01-12 Thursday 22:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 22:30  Matthew Mundell
 
 	* BUGS (1.5): Improve the known bugs statement.
 
@@ -5330,37 +40714,42 @@
 	* doc/definitions.dox (1.183): Small improvements to subsection 1.6
 	  on the powerset domain.
 
-2006-01-12 Thursday 16:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 16:31  Matthew Mundell
 
 	* debian/rules (1.8): Correct the ppl-config source directory.
 	  Improve two comments.
 
-2006-01-12 Thursday 16:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 16:31  Matthew Mundell
 
 	* debian/libppl.install (1.4): Add ppl_lpsol and the manual pages.
 
-2006-01-12 Thursday 16:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 16:30  Matthew Mundell
 
 	* debian/libppl.dirs (1.3): Add usr/share/man/man1.
 
-2006-01-12 Thursday 16:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.dirs (altnum.1): file libppl.dirs was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 16:30  Matthew Mundell
 
 	* debian/libppl-pwl.install (1.2): Move pwl.hh to libppl-dev.
 
-2006-01-12 Thursday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 16:29  Matthew Mundell
 
 	* debian/libppl-dev.install (1.2): Add the header files.
 
-2006-01-12 Thursday 16:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 16:28  Matthew Mundell
 
 	* debian/control (1.9): Add glpk to Build-Depends.
 
-2006-01-12 Thursday 13:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 13:29  Matthew Mundell
 
 	* debian/rules (1.7): Add ppl_lpsol and ppl-config to the programs
 	  installed in install-arch.
 
-2006-01-12 Thursday 13:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-12 Thursday 13:28  Matthew Mundell
 
 	* debian/control (1.8): Update to the new GMP package names.  Add
 	  libgmp3-doc to the libdevel suggested packages.  Improve some
@@ -5398,13 +40787,13 @@
 	  was not fully cleared if the problem was solved from scratch.
 	  Typo fixed in the documentation.
 
-2006-01-11 Wednesday 20:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-11 Wednesday 20:34  Matthew Mundell
 
 	* debian/rules (1.6): Improve the comment about ppl_lcdd.  Improve
 	  the comments about the installation of the change logs.  Merge
 	  the copy commands of the merged browse and print documents.
 
-2006-01-11 Wednesday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-11 Wednesday 19:21  Matthew Mundell
 
 	* debian/rules (1.5): Call autoreconf instead of each of the auto*
 	  scripts.  Leave the configuration of the Watchdog to the PPL
@@ -5431,12 +40820,12 @@
 	  longer used.	Renamed `swap_base' to `pivot'.  `slack' and
 	  `artificial' variables are better handled and documented.
 
-2006-01-11 Wednesday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-11 Wednesday 15:23  Matthew Mundell
 
 	* src/Matrix.cc (1.92): Convert the add_recycled_row row size
 	  assertion into an OK assertion on the given row.
 
-2006-01-11 Wednesday 13:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-11 Wednesday 13:46  Matthew Mundell
 
 	* debian/changelog (1.2): Clear dummy entry.
 
@@ -5471,14 +40860,14 @@
 	* src/globals.defs.hh (1.29): The comments for output methods
 	  marked as brief comments.
 
-2006-01-11 Wednesday 02:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-11 Wednesday 02:21  Matthew Mundell
 
 	* src/: Linear_System.cc (1.37), Matrix.cc (1.91), Matrix.defs.hh
 	  (1.73), Matrix.inlines.hh (1.49): Add Matrix methods
 	  add_row(const Row&) and add_recycled_row(Row&).  Update
 	  Linear_System::add_row to use Matrix::add_row.
 
-2006-01-10 Tuesday 21:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 21:08  Matthew Mundell
 
 	* doc/ppl-config.1 (grids.1): file ppl-config.1 was added on branch
 	  grids on 2006-01-16 01:10:29 +0000
@@ -5487,7 +40876,12 @@
 
 	* doc/ppl-config.1 (1.3): Improved.
 
-2006-01-10 Tuesday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (simplex.1): file ppl-config.1 was added on
+	  branch simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 21:02  Matthew Mundell
 
 	* doc/ppl_lcdd.1 (grids.1): file ppl_lcdd.1 was added on branch
 	  grids on 2006-01-16 01:10:29 +0000
@@ -5497,12 +40891,17 @@
 	* doc/: Makefile.am (1.42), ppl_lcdd.1 (1.1): Added a draft man
 	  page for `ppl_lcdd'.
 
+2006-01-10 Tuesday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd.1 (simplex.1): file ppl_lcdd.1 was added on branch
+	  simplex on 2006-05-08 17:15:46 +0000
+
 2006-01-10 Tuesday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* demos/ppl_lcdd/ppl_lcdd.cc (1.54): Changed again: option
 	  --max-memory has now -R (and not -M) as its short counterpart.
 
-2006-01-10 Tuesday 20:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 20:59  Matthew Mundell
 
 	* doc/ppl_lpsol.1 (grids.1): file ppl_lpsol.1 was added on branch
 	  grids on 2006-01-16 01:10:29 +0000
@@ -5512,6 +40911,11 @@
 	* doc/: Makefile.am (1.41), ppl_lpsol.1 (1.1): Added a draft man
 	  page for `ppl_lpsol'.
 
+2006-01-10 Tuesday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol.1 (simplex.1): file ppl_lpsol.1 was added on branch
+	  simplex on 2006-05-08 17:15:46 +0000
+
 2006-01-10 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* demos/ppl_lpsol/ppl_lpsol.c (1.28): Option --max-memory has now
@@ -5540,6 +40944,11 @@
 
 2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* Watchdog/utils/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* Makefile.am (1.36), Watchdog/Makefile.am (1.25),
 	  Watchdog/src/Makefile.am (1.5), Watchdog/utils/Makefile.am (1.6),
 	  demos/Makefile.am (1.9), demos/ppl_lcdd/Makefile.am (1.22),
@@ -5586,7 +40995,7 @@
 	* src/LP_Problem.cc (1.12): Exploit the now available ascii_dump()
 	  method for Generator.
 
-2006-01-10 Tuesday 16:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 16:17  Matthew Mundell
 
 	* src/LP_Problem.cc (grids.1): file LP_Problem.cc was added on
 	  branch grids on 2006-01-16 01:10:33 +0000
@@ -5595,7 +41004,7 @@
 
 	* src/LP_Problem.inlines.hh (1.8): Dealt with another FIXME.
 
-2006-01-10 Tuesday 16:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 16:12  Matthew Mundell
 
 	* src/LP_Problem.inlines.hh (grids.1): file LP_Problem.inlines.hh
 	  was added on branch grids on 2006-01-16 01:10:33 +0000
@@ -5610,7 +41019,7 @@
 	* tests/BD_Shape/run_tests (1.12): Allow to override the `make'
 	  command used: invoke "$MAKE" instead of "make".
 
-2006-01-10 Tuesday 15:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 15:58  Matthew Mundell
 
 	* src/: BD_Shape.inlines.hh (1.118), Constraint.cc (1.55),
 	  Constraint.defs.hh (1.114), Constraint.inlines.hh (1.62),
@@ -5637,12 +41046,12 @@
 	  Declare Poly_Con_Relation::acsii_dump(ostream&) and
 	  Poly_Gen_Relation::ascii_dump(ostream&) public.
 
-2006-01-10 Tuesday 15:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 15:58  Matthew Mundell
 
 	* src/LP_Problem.defs.hh (grids.1): file LP_Problem.defs.hh was
 	  added on branch grids on 2006-01-16 01:10:33 +0000
 
-2006-01-10 Tuesday 15:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-10 Tuesday 15:46  Matthew Mundell
 
 	* src/globals.defs.hh (1.28): Add macros PPL_STR(s), PPL_XSTR(s),
 	  PPL_OUTPUT_DECLARATIONS, PPL_OUTPUT_DEFINITIONS(class_name),
@@ -5758,6 +41167,78 @@
 	* src/BDS_Status.inlines.hh (1.10): Methods OK(), ascii_dump() and
 	  ascii_load() are no longer inlined.
 
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16 (altnum.1): file
+	  expected_pchk_int16 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int16 (altnum.1): file
+	  expected_pchk_int16 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16_a (altnum.1): file
+	  expected_pchk_int16_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int16_a (altnum.1): file
+	  expected_pchk_int16_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32 (altnum.1): file
+	  expected_pchk_int32 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int32 (altnum.1): file
+	  expected_pchk_int32 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32_a (altnum.1): file
+	  expected_pchk_int32_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int32_a (altnum.1): file
+	  expected_pchk_int32_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64_a (altnum.1): file
+	  expected_pchk_int64_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int64_a (altnum.1): file
+	  expected_pchk_int64_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8_a (altnum.1): file
+	  expected_pchk_int8_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8_a (altnum.1): file
+	  expected_pchk_int8_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
 2006-01-09 Monday 13:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
 
 	* interfaces/Prolog/: Prolog_interface.dox (1.145),
@@ -6554,7 +42035,7 @@
 	  (simplex.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,2,1,1,1,1,1,1,1,1,4,4,1,1,3,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,4,1,1,1,1,1,1 [...]
 	  First merge from the main trunk.
 
-2006-01-06 Friday 19:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-06 Friday 19:20  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
 	  Congruence.types.hh, Congruence_System.cc,
@@ -6572,12 +42053,12 @@
 	  (grids.[19,35,20,2,39,25,13,2,93,52,2,9,3,2,2,21,16,2,26,19,11,2,5,6,4,30,33,25,67,130,44,11]):
 	  Update copyright year.
 
-2006-01-06 Friday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-06 Friday 18:44  Matthew Mundell
 
 	* src/Matrix.defs.hh (grids.7): Take out old grid includes and
 	  declaration.
 
-2006-01-06 Friday 18:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-06 Friday 18:13  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence_System.defs.hh,
 	  Grid.defs.hh, Grid_Certificate.defs.hh, Grid_Generator.defs.hh,
@@ -6600,7 +42081,7 @@
 	* interfaces/Prolog/tests/expected_pchk_int64_a (1.5): Restore
 	  expected output.
 
-2006-01-05 Thursday 19:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-05 Thursday 19:45  Matthew Mundell
 
 	* src/Grid_public.cc (grids.129): Leave the modulus handling as it
 	  is in the inverse relation case of
@@ -6616,6 +42097,12 @@
 	  files and avoid error message when there is an overflow exception
 	  for the large numbers in the C++.
 
+2006-01-05 Thursday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int64 (altnum.1): file
+	  expected_pchk_int64 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
 2006-01-05 Thursday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* interfaces/Prolog/YAP/ppl_yap.cc (1.106): Fixed
@@ -6732,55 +42219,55 @@
 	  correction of a bug in the conversion from SWI Prolog unbounded
 	  coefficients to PPL's (checked bounded integers) Coefficient.
 
-2006-01-03 Tuesday 16:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:43  Matthew Mundell
 
 	* tests/Grid/intersection1.cc (grids.8): Replace the Variables in
 	  the tests with common Variables in a local namespace.
 
-2006-01-03 Tuesday 16:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:40  Matthew Mundell
 
 	* tests/Grid/affinepreimage1.cc (grids.10): Add two simple tests.
 
-2006-01-03 Tuesday 16:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:36  Matthew Mundell
 
 	* src/Grid_public.cc (grids.128): Take the empty flag query out of
 	  add_recycled_generators.
 
-2006-01-03 Tuesday 16:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:35  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.66): Note possible improvements to
 	  the empty cases in the construct methods.
 
-2006-01-03 Tuesday 16:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:34  Matthew Mundell
 
 	* src/Grid_Generator_System.inlines.hh (grids.10): Add sortedness
 	  and pending row settings to method `clear'.
 
-2006-01-03 Tuesday 16:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:32  Matthew Mundell
 
 	* src/Grid_Generator.defs.hh (grids.19): Move the
 	  writable-reference-returning divisor method to the private
 	  section.  Improve the comment on the need for the Grid class
 	  friend declaration.
 
-2006-01-03 Tuesday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:29  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.51): Update map_space_dimensions to
 	  create the point with the correct divisor when inserting a point,
 	  instead of inserting the point and then adjusting the divisor.
 
-2006-01-03 Tuesday 16:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:27  Matthew Mundell
 
 	* src/Congruence_System.defs.hh (grids.23): Add a note to consider
 	  adding a recycling_insert method.
 
-2006-01-03 Tuesday 16:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:26  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.33): Move the
 	  writable-reference-returning modulus method to the private
 	  section.  Improve two comments a little.
 
-2006-01-03 Tuesday 16:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-03 Tuesday 16:25  Matthew Mundell
 
 	* src/Congruence.cc (grids.18): Update strong_normalize to use
 	  Row::normalize.
@@ -6856,7 +42343,7 @@
 	  generalizedaffinepreimage1.cc was added on branch simplex on
 	  2006-01-06 20:00:55 +0000
 
-2006-01-02 Monday 09:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-02 Monday 09:36  Matthew Mundell
 
 	* tests/BD_Shape/generalizedaffinepreimage1.cc (grids.1): file
 	  generalizedaffinepreimage1.cc was added on branch grids on
@@ -6886,6 +42373,17 @@
 	  Watchdog/src/Time.defs.hh (1.3), src/version.hh.in (1.13): Do
 	  adopt the new format for multiline brief doxygen documentation.
 
+2006-01-01 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.defs.hh (altnum.1): file
+	  Pending_List.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.defs.hh (altnum.1): file Time.defs.hh was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
 2006-01-01 Sunday 22:46  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.5): Temporarily
@@ -6893,6 +42391,36 @@
 
 2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* interfaces/Prolog/tests/expected_clpq2_int32_a (altnum.1): file
+	  expected_clpq2_int32_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int8 (altnum.1): file
+	  expected_clpq2_int8 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int8_a (altnum.1): file
+	  expected_clpq2_int8_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int16 (altnum.1): file
+	  expected_clpq_int16 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int16_a (altnum.1): file
+	  expected_clpq_int16_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.4),
 	  XSB/expected_clpq2_int8 (1.3), XSB/expected_clpq2_int8_a (1.4),
 	  XSB/expected_clpq_int16 (1.4), XSB/expected_clpq_int16_a (1.4),
@@ -6909,6 +42437,36 @@
 	  Adapted to recent changes in the implementation of checked
 	  numbers.
 
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32_a (altnum.1): file
+	  expected_clpq2_int32_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8 (altnum.1): file
+	  expected_clpq2_int8 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8_a (altnum.1): file
+	  expected_clpq2_int8_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16 (altnum.1): file
+	  expected_clpq_int16 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16_a (altnum.1): file
+	  expected_clpq_int16_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
 2006-01-01 Sunday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* TODO (1.166), src/Ask_Tell.defs.hh (1.8), src/BDS_Status.idefs.hh
@@ -6977,7 +42535,7 @@
 	* tests/Polyhedron/lpproblem2.cc (simplex.1): file lpproblem2.cc
 	  was added on branch simplex on 2006-01-06 20:00:58 +0000
 
-2006-01-01 Sunday 17:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 17:25  Matthew Mundell
 
 	* tests/Polyhedron/lpproblem2.cc (grids.1): file lpproblem2.cc was
 	  added on branch grids on 2006-01-16 01:10:41 +0000
@@ -7000,15 +42558,30 @@
 
 2006-01-01 Sunday 10:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
 
-	* interfaces/Prolog/tests/pl_check.pl (1.15): Corrected and
-	  improved maximize, maximize_with_point, minimize and
-	  minimize_with_point tests.
+	* interfaces/Prolog/tests/pl_check.pl (1.15): Corrected and
+	  improved maximize, maximize_with_point, minimize and
+	  minimize_with_point tests.
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/build_header.in (altnum.1): file build_header.in was added
+	  on branch altnum on 2006-10-29 19:27:45 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray.in (altnum.1): file text2cxxarray.in was
+	  added on branch altnum on 2006-10-29 19:27:45 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/Polyhedron/LP_Problem3.cc (grids.1): file LP_Problem3.cc
 	  was added on branch grids on 2006-01-16 01:10:40 +0000
 
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (altnum.1): file memory2.cc was added
+	  on branch altnum on 2006-10-29 19:27:32 +0000
+
 2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (simplex.1): file
@@ -7081,73 +42654,73 @@
 	  limitedcc76extrapolation3.cc was added on branch simplex on
 	  2006-01-06 20:00:55 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (grids.1): file
 	  limitedbhmz05extrapolation1.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation2.cc (grids.1): file
 	  limitedbhmz05extrapolation2.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation3.cc (grids.1): file
 	  limitedbhmz05extrapolation3.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation4.cc (grids.1): file
 	  limitedbhmz05extrapolation4.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation5.cc (grids.1): file
 	  limitedbhmz05extrapolation5.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation6.cc (grids.1): file
 	  limitedbhmz05extrapolation6.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation7.cc (grids.1): file
 	  limitedbhmz05extrapolation7.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation8.cc (grids.1): file
 	  limitedbhmz05extrapolation8.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedbhmz05extrapolation9.cc (grids.1): file
 	  limitedbhmz05extrapolation9.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedcc76extrapolation1.cc (grids.1): file
 	  limitedcc76extrapolation1.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedcc76extrapolation2.cc (grids.1): file
 	  limitedcc76extrapolation2.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/limitedcc76extrapolation3.cc (grids.1): file
 	  limitedcc76extrapolation3.cc was added on branch grids on
@@ -7207,77 +42780,407 @@
 	  generalizedaffinepreimage2.cc was added on branch simplex on
 	  2006-01-06 20:00:55 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening1.cc (grids.1): file
 	  bhmz05widening1.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening2.cc (grids.1): file
 	  bhmz05widening2.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening3.cc (grids.1): file
 	  bhmz05widening3.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening4.cc (grids.1): file
 	  bhmz05widening4.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening5.cc (grids.1): file
 	  bhmz05widening5.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening6.cc (grids.1): file
 	  bhmz05widening6.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening7.cc (grids.1): file
 	  bhmz05widening7.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/bhmz05widening8.cc (grids.1): file
 	  bhmz05widening8.cc was added on branch grids on 2006-01-16
 	  01:10:39 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* tests/BD_Shape/generalizedaffinepreimage2.cc (grids.1): file
 	  generalizedaffinepreimage2.cc was added on branch grids on
 	  2006-01-16 01:10:39 +0000
 
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.types.hh (altnum.1): file
+	  Random_Number_Generator.types.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
 2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
 
 	* src/BD_Shape.cc (simplex.1): file BD_Shape.cc was added on branch
 	  simplex on 2006-01-06 20:00:51 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* src/BD_Shape.cc (grids.1): file BD_Shape.cc was added on branch
 	  grids on 2006-01-16 01:10:33 +0000
 
-2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-01 Sunday 09:27  Matthew Mundell
 
 	* src/LP_Problem.types.hh (grids.1): file LP_Problem.types.hh was
 	  added on branch grids on 2006-01-16 01:10:33 +0000
 
 2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* src/ppl_header.hh (altnum.1): file ppl_header.hh was added on
+	  branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (altnum.1): file
+	  ac_check_sicstus_prolog.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_xsb_prolog.m4 (altnum.1): file ac_check_xsb_prolog.m4
+	  was added on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16 (altnum.1): file
+	  expected_clpq2_int16 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int16 (altnum.1): file
+	  expected_clpq2_int16 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16_a (altnum.1): file
+	  expected_clpq2_int16_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int16_a (altnum.1): file
+	  expected_clpq2_int16_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32 (altnum.1): file
+	  expected_clpq2_int32 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int32 (altnum.1): file
+	  expected_clpq2_int32 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64 (altnum.1): file
+	  expected_clpq2_int64 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int64 (altnum.1): file
+	  expected_clpq2_int64 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64_a (altnum.1): file
+	  expected_clpq2_int64_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int64_a (altnum.1): file
+	  expected_clpq2_int64_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz (altnum.1): file
+	  expected_clpq2_mpz was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_mpz (altnum.1): file
+	  expected_clpq2_mpz was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz_a (altnum.1): file
+	  expected_clpq2_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_mpz_a (altnum.1): file
+	  expected_clpq2_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32 (altnum.1): file
+	  expected_clpq_int32 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int32 (altnum.1): file
+	  expected_clpq_int32 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32_a (altnum.1): file
+	  expected_clpq_int32_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int32_a (altnum.1): file
+	  expected_clpq_int32_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64 (altnum.1): file
+	  expected_clpq_int64 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int64 (altnum.1): file
+	  expected_clpq_int64 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64_a (altnum.1): file
+	  expected_clpq_int64_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int64_a (altnum.1): file
+	  expected_clpq_int64_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8 (altnum.1): file
+	  expected_clpq_int8 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int8 (altnum.1): file
+	  expected_clpq_int8 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8_a (altnum.1): file
+	  expected_clpq_int8_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int8_a (altnum.1): file
+	  expected_clpq_int8_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz (altnum.1): file
+	  expected_clpq_mpz was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_mpz (altnum.1): file
+	  expected_clpq_mpz was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz_a (altnum.1): file
+	  expected_clpq_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_mpz_a (altnum.1): file
+	  expected_clpq_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/build_header.in (altnum.1): file build_header.in
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Doubly_Linked_Object.defs.hh (altnum.1): file
+	  Doubly_Linked_Object.defs.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Doubly_Linked_Object.inlines.hh (altnum.1): file
+	  Doubly_Linked_Object.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Doubly_Linked_Object.types.hh (altnum.1): file
+	  Doubly_Linked_Object.types.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList.inlines.hh (altnum.1): file EList.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList.types.hh (altnum.1): file EList.types.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList_Iterator.defs.hh (altnum.1): file
+	  EList_Iterator.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList_Iterator.inlines.hh (altnum.1): file
+	  EList_Iterator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList_Iterator.types.hh (altnum.1): file
+	  EList_Iterator.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Handler.inlines.hh (altnum.1): file
+	  Handler.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Handler.types.hh (altnum.1): file Handler.types.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.cc (altnum.1): file
+	  Pending_Element.cc was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.inlines.hh (altnum.1): file
+	  Pending_Element.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.types.hh (altnum.1): file
+	  Pending_Element.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.cc (altnum.1): file Pending_List.cc was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.inlines.hh (altnum.1): file
+	  Pending_List.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.types.hh (altnum.1): file
+	  Pending_List.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.cc (altnum.1): file Time.cc was added on branch
+	  altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.inlines.hh (altnum.1): file Time.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.types.hh (altnum.1): file Time.types.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.inlines.hh (altnum.1): file
+	  Watchdog.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.types.hh (altnum.1): file Watchdog.types.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/pwl_header.hh (altnum.1): file pwl_header.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* Makefile.am (1.35), README (1.38), README.configure (1.16),
 	  configure.ac (1.200), instchk.hh (1.3), Watchdog/Makefile.am
 	  (1.24), Watchdog/README (1.12), Watchdog/configure.ac (1.33),
@@ -8455,46 +44358,46 @@
 	  enumeration Simplex_Status renamed as LP_Problem_Status.  Its
 	  definition moved into LP_Problem.types.hh.
 
-2005-12-23 Friday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 17:03  Matthew Mundell
 
 	* src/Grid_public.cc (grids.127): Update the constraint system
 	  adding methods to leave the check on the existence of rows in the
 	  temporary congruence system to the method that will add that
 	  congruence system.
 
-2005-12-23 Friday 16:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 16:51  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.inlines.hh
 	  (grids.[38,12]): Ensure that all constructors create at least two
 	  columns.
 
-2005-12-23 Friday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 15:48  Matthew Mundell
 
 	* src/Grid_public.cc (grids.126): Enable the all-zero parameter OK
 	  check.
 
-2005-12-23 Friday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 15:48  Matthew Mundell
 
 	* src/Grid_Generator_System.defs.hh (grids.17): Add the all-zero
 	  parameter behaviour to the insert(g) description.
 
-2005-12-23 Friday 15:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 15:41  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.25): Adding setting of the
 	  first pending row index to the recycling_insert methods.
 
-2005-12-23 Friday 14:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 14:40  Matthew Mundell
 
 	* tests/Grid/isuniverse1.cc (grids.9): Add three tests where the
 	  grid is defined by a minimized congruence system.
 
-2005-12-23 Friday 14:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 14:39  Matthew Mundell
 
 	* src/Grid_public.cc (grids.125): Leave the is_universe assumption
 	  that the minimized universe congruence system always contains
 	  exactly the integrality congruence.
 
-2005-12-23 Friday 14:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-23 Friday 14:38  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.29): Add a query about using the
 	  congruence system in remove_space_dimensions.
@@ -8533,12 +44436,12 @@
 	  SWI/ppl_swiprolog.cc, tests/pl_check.pl (simplex.[1,1,1,1]):
 	  Drafted the (SWI) Prolog interface for class LP_Problem.
 
-2005-12-22 Thursday 20:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 20:01  Matthew Mundell
 
 	* tests/Grid/relations2.cc (grids.7): Add test10 to test13, which
 	  test grids with divisors that are greater than one.
 
-2005-12-22 Thursday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 20:00  Matthew Mundell
 
 	* src/Grid_public.cc (grids.124): Account for the divisor in the
 	  parameter case of relation_with(g) by modulating the scalar
@@ -8558,7 +44461,7 @@
 	  feasible_point() and optimizing_point() are now declared const.
 	  A few stylistic and doxygen comments improvements.
 
-2005-12-22 Thursday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 17:41  Matthew Mundell
 
 	* src/Grid_public.cc (grids.123): Update OK to check that the
 	  con_sys and grid space dimensions match when con_sys is empty.
@@ -8569,35 +44472,35 @@
 	  Replace the add_recycled_generators call in
 	  generalized_affine_image(l,r,m) with equivalent, quicker code.
 
-2005-12-22 Thursday 17:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 17:37  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
 	  (grids.[24,16]): Add recycling_insert(g).
 
-2005-12-22 Thursday 17:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 17:35  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.inlines.hh
 	  (grids.[13,15]): Implement operator<< directly, adding divisor
 	  output for parameters.
 
-2005-12-22 Thursday 17:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 17:33  Matthew Mundell
 
 	* src/Matrix.defs.hh (grids.6): Correct typo in add_recycled_row
 	  description.
 
-2005-12-22 Thursday 13:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 13:21  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.23): Improve the insert query
 	  about wrapping an NNC generator.
 
-2005-12-22 Thursday 13:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-22 Thursday 13:08  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.22): Leave the tmp_row
 	  allocation in insert alone (tmp_row is a stack variable so the
 	  Linear_Row destructor will be called and it will free the memory
 	  in tmp_row).
 
-2005-12-21 Wednesday 19:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 19:14  Matthew Mundell
 
 	* src/Grid_public.cc (grids.122): Add divisor normalization after
 	  the parameter insertion in generalized_affine_image.
@@ -8605,40 +44508,40 @@
 	  Update add_generator(g) to make one normalize_divisor call when
 	  the grid originally contained points.
 
-2005-12-21 Wednesday 19:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 19:09  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.65): Include parameters in the
 	  normalize_divisors(sys,d,f) LCM calculation.
 
-2005-12-21 Wednesday 19:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 19:07  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.28): Add divisor normalization after
 	  inserting parameters in add_space_dimensions and
 	  add_space_dimensions_and_project.
 
-2005-12-21 Wednesday 19:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 19:06  Matthew Mundell
 
 	* src/Grid_Generator.cc (grids.12): Update scale_to_divisor to
 	  leave the divisor column out of the scaling.
 
-2005-12-21 Wednesday 19:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 19:03  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.21): Update affine_image to
 	  use Grid_Generator and Grid_Generator_System instead of Generator
 	  and Generator_System.
 
-2005-12-21 Wednesday 19:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 19:01  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.16): Make parens in find_variation
 	  messages consistent.
 
-2005-12-21 Wednesday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 17:10  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.20): Update method insert to
 	  leave alone the divisors of inserted parameters (Grid will
 	  normalize the divisors).
 
-2005-12-21 Wednesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 17:03  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.13): Revert to the actual
 	  known grid in test3.
@@ -8649,36 +44552,36 @@
 	  the distance computation so as to detect when a computed result
 	  is ok even if different from the known result.
 
-2005-12-21 Wednesday 16:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 16:17  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.50): Update map_space_dimensions to
 	  call grid_line in place of line.
 
-2005-12-21 Wednesday 16:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 16:14  Matthew Mundell
 
 	* src/: Grid_Generator_System.defs.hh,
 	  Grid_Generator_System.inlines.hh (grids.[15,9]): Take out
 	  insert(g).
 
-2005-12-21 Wednesday 16:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 16:14  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
 	  Grid_Generator.inlines.hh (grids.[11,18,14]): Add
 	  throw_invalid_argument.  Update the divisor methods to throw
 	  std::invalid_argument if the generator is a line.
 
-2005-12-21 Wednesday 16:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 16:14  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[91,64]): Take out
 	  the throw_topology_incompatible methods.
 
-2005-12-21 Wednesday 15:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 15:41  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[10,17]):
 	  Update scale_to_divisor to throw std::invalid_argument if the
 	  given divisor is zero.
 
-2005-12-21 Wednesday 14:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 14:31  Matthew Mundell
 
 	* src/Grid_public.cc (grids.121): Update Grid(n,k) to trust the
 	  divisor value of the trivially true point created by grid_point.
@@ -8692,17 +44595,17 @@
 	  method: BD_Shape::generalized_affine_preimage(var, relsym, expr,
 	  den).  Added some tests about this method.
 
-2005-12-21 Wednesday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 14:28  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.32): Correct a comment in the
 	  congruence to generator conversion.
 
-2005-12-21 Wednesday 14:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 14:27  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.19): Keep the
 	  add_universe_rows_and_columns num_columns assertion.
 
-2005-12-21 Wednesday 14:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 14:24  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_Generator.cc, Grid_Generator.defs.hh,
 	  Grid_nonpublic.cc (grids.[90,9,16,63]): Update
@@ -8719,42 +44622,42 @@
 	  sign normalization would only be required if divisors could be
 	  negative.
 
-2005-12-21 Wednesday 14:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-21 Wednesday 14:04  Matthew Mundell
 
 	* tests/Grid/generator1.cc (grids.4): Enable test5 (comparison of
 	  parameters that have divisors > 1).
 
-2005-12-20 Tuesday 21:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:49  Matthew Mundell
 
 	* tests/Grid/relations1.cc (grids.6): Use parameter divisors in
 	  test6 and test7.
 
-2005-12-20 Tuesday 21:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:48  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.12): Temporarily match the
 	  expected result in test3 to the actual result.
 
-2005-12-20 Tuesday 21:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:48  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.12): Correct the expected result in
 	  test4.
 
-2005-12-20 Tuesday 21:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:47  Matthew Mundell
 
 	* tests/Grid/isuniverse1.cc (grids.8): Correct the fail case in
 	  test10.
 
-2005-12-20 Tuesday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:46  Matthew Mundell
 
 	* tests/Grid/congruencesystem2.cc (grids.11): Use parameter
 	  divisors.
 
-2005-12-20 Tuesday 21:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:45  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.27): Take some old code out of
 	  add_space_dimensions_and_embed.
 
-2005-12-20 Tuesday 21:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:44  Matthew Mundell
 
 	* src/: Congruence_System.cc, Grid.inlines.hh,
 	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
@@ -8795,7 +44698,7 @@
 
 	  Take out Grid_Generator_System(const Generator&).
 
-2005-12-20 Tuesday 21:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-20 Tuesday 21:41  Matthew Mundell
 
 	* src/: Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
 	  Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
@@ -8852,12 +44755,12 @@
 	  (1.34), namespaces.hh (1.3): Avoid the use of anonymous
 	  namespaces in files that are going to be included.
 
-2005-12-19 Monday 20:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-19 Monday 20:22  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, copyconstruct1.cc (grids.[54,1]): Add
 	  copyconstruct1, to test Grid copy construction.
 
-2005-12-19 Monday 20:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-19 Monday 20:21  Matthew Mundell
 
 	* src/Grid_public.cc (grids.119): Update the copy constructor to
 	  always copy the systems when the space dimension is zero.
@@ -8882,40 +44785,40 @@
 	  computations are now handled only by is_satisfiable() and
 	  second_phase().
 
-2005-12-17 Saturday 01:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-17 Saturday 01:31  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.61): Enable the system equality
 	  checks in quick_equivalence_test.
 
-2005-12-17 Saturday 01:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-17 Saturday 01:30  Matthew Mundell
 
 	* src/Congruence.inlines.hh (grids.19): Negate the coefficient used
 	  to create the zero_dim_integrality congruence (so that the
 	  resulting constant term is positive).
 
-2005-12-17 Saturday 01:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-17 Saturday 01:25  Matthew Mundell
 
 	* src/: Grid_Generator_System.defs.hh,
 	  Grid_Generator_System.inlines.hh (grids.[13,7]): Add
 	  Grid_Generator_System::is_equal_to(ggs) and operator==(ggs,ggs).
 
-2005-12-16 Friday 23:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-16 Friday 23:38  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.48): Add note for map_space_dimensions
 	  code awaiting parameter divisors.
 
-2005-12-16 Friday 23:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-16 Friday 23:26  Matthew Mundell
 
 	* src/Grid_public.cc (grids.118): Improve relation descriptions in
 	  relation_with(cg).
 
-2005-12-16 Friday 23:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-16 Friday 23:01  Matthew Mundell
 
 	* src/: Grid_nonpublic.cc, Grid_simplify.cc (grids.[60,42]): Move
 	  update_generators system column assertion into congruence
 	  simplify.
 
-2005-12-16 Friday 21:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-16 Friday 21:13  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.36): Add Constraint_System
 	  includes.
@@ -8924,24 +44827,24 @@
 
 	* STANDARDS (1.27): Avoid anonymous namespaces in header files.
 
-2005-12-15 Thursday 14:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-15 Thursday 14:50  Matthew Mundell
 
 	* src/Grid_public.cc (grids.117): Update add_generator(g) to insert
 	  the given generator, instead of inserting a copy, when the grid
 	  contains points.
 
-2005-12-15 Thursday 14:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-15 Thursday 14:25  Matthew Mundell
 
 	* src/Grid_public.cc (grids.116): Confirm that creation of the
 	  universe systems in Grid(n,k) works.	Slightly improve spacing
 	  and a few comments in Grid(n,k).
 
-2005-12-15 Thursday 14:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-15 Thursday 14:15  Matthew Mundell
 
 	* src/Grid_Generator.defs.hh (grids.14): Move Grid_Generator(g) to
 	  the private section.
 
-2005-12-15 Thursday 14:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-15 Thursday 14:14  Matthew Mundell
 
 	* src/Grid_Generator.cc (grids.7): Improve the note about
 	  converting the Generator in function `parameter' to a
@@ -8952,7 +44855,7 @@
 	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[8,9]): Minor
 	  stylistic and performance improvements.
 
-2005-12-14 Wednesday 22:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 22:13  Matthew Mundell
 
 	* src/checked_mpz.inlines.hh (grids.6): Update the mpz_gcd call in
 	  gcdext_mpz to mpz_gcdext.
@@ -8961,12 +44864,12 @@
 
 	* TODO (1.162): New to-do item.
 
-2005-12-14 Wednesday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 21:02  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.59): Update set_zero_dim_univ to
 	  leave the con_sys size adjustment to Congruence_System::clear.
 
-2005-12-14 Wednesday 20:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 20:24  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
 	  (grids.[17,12]): Update remove_higher_space_dimensions with a
@@ -8974,38 +44877,38 @@
 	  dimension will remain the same, and to clear the system if the
 	  new dimension is 0.
 
-2005-12-14 Wednesday 19:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 19:37  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
 	  (grids.[16,11]): Update remove_space_dimensions to check the
 	  space dim of the given set and to exit immediately if the set is
 	  empty.
 
-2005-12-14 Wednesday 18:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 18:21  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
 	  (grids.[15,10]): Update recycling_insert to increase the system
 	  space dimension if that of the system being inserted is bigger.
 
-2005-12-14 Wednesday 17:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 17:40  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.14): Leave it up to the
 	  add_universe_rows_and_columns to ensure that the system will
 	  contain a point.
 
-2005-12-14 Wednesday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 17:10  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.47): Revert map_space_dimensions to
 	  insert parameters via function point for now (as the given
 	  expression already uses the system divisor).
 
-2005-12-14 Wednesday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 16:56  Matthew Mundell
 
 	* tests/Grid/generalizedaffineimage1.cc (grids.6): Correct expected
 	  values in test2, test4, test5 and test6 (now that parameter
 	  divisors are adjusted at insertion).
 
-2005-12-14 Wednesday 16:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-14 Wednesday 16:38  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.13): Update method insert to
 	  represent inserted parameters with the divisor of the first
@@ -9393,7 +45296,7 @@
 	* interfaces/Prolog/tests/pl_check.pl (1.13): Remove trailing
 	  whitespace.
 
-2005-12-12 Monday 21:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-12 Monday 21:36  Matthew Mundell
 
 	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_Generator.cc,
 	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
@@ -9434,7 +45337,7 @@
 	  generator creation functions.  Correct the expected values of a
 	  few tests that use parameters.
 
-2005-12-12 Monday 17:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-12 Monday 17:49  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
 	  (grids.[87,57,114]): Take out old parameter hiding.
@@ -9445,7 +45348,7 @@
 	  (simplex.[4,4,6]): Written some code in `PPL::LP_Problem::OK()'.
 	  Properly renamed `opt_kind' to `opt_mode'.
 
-2005-12-12 Monday 13:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-12 Monday 13:49  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
 	  (grids.[12,8]): Implement operator<<(s,ggs).
@@ -9649,60 +45552,60 @@
 
 	* doc/definitions.dox (1.178): Draftet a section on BD shapes.
 
-2005-12-03 Saturday 15:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 15:33  Matthew Mundell
 
 	* src/Grid_Generator_System.inlines.hh (grids.6): Update insert to
 	  construct the generator directly into the constructor call.
 
-2005-12-03 Saturday 15:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 15:33  Matthew Mundell
 
 	* src/Grid_Generator_System.defs.hh (grids.7): Update the matrix
 	  diagram in the add_universe_rows_and_columns description.
 
-2005-12-03 Saturday 15:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 15:31  Matthew Mundell
 
 	* src/Grid_Generator.inlines.hh (grids.11): Update
 	  Grid_Generator(g) to swap with g instead of copying g.  Clean
 	  some comments.  Move the equality operators to better positions.
 	  Update line and point to use Grid_Generator(g).
 
-2005-12-03 Saturday 15:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 15:19  Matthew Mundell
 
 	* tests/Grid/generator1.cc (grids.2): Insert test8, to check
 	  construction from a Generator reference.
 
-2005-12-03 Saturday 15:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 15:09  Matthew Mundell
 
 	* src/Grid_Generator.defs.hh (grids.12): Move Grid_Generator(g) to
 	  the beginning of the public section.	Improve the
 	  Grid_Generator(g) description.
 
-2005-12-03 Saturday 12:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 12:55  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, generator1.cc (grids.[53,1]): Add
 	  generator1, to test Grid_Generator.
 
-2005-12-03 Saturday 12:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 12:21  Matthew Mundell
 
 	* src/Generator_System.defs.hh (grids.10): Keep the Grid friend
 	  declaration.
 
-2005-12-03 Saturday 12:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 12:13  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.11): Add a note that
 	  ascii_load is a copy of Generator_System::ascii_load.
 
-2005-12-03 Saturday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 12:12  Matthew Mundell
 
 	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
 	  (grids.[11,10]): Add ascii_dump and ascii_load wrappers.
 
-2005-12-03 Saturday 12:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 12:04  Matthew Mundell
 
 	* tests/Grid/congruence1.cc (grids.11): Update main to output the
 	  test name.  Convert variable names to A, B and C.
 
-2005-12-03 Saturday 00:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-03 Saturday 00:38  Matthew Mundell
 
 	* src/: Generator.defs.hh, Grid.defs.hh, Grid_Generator.defs.hh,
 	  Grid_Generator.inlines.hh, Grid_Generator_System.cc,
@@ -9741,7 +45644,7 @@
 	  Clean some comments.	Add some comments.  Take out the
 	  directed-out Grid code left in in the last few commits.
 
-2005-12-02 Friday 22:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 22:16  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
 	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
@@ -9784,14 +45687,14 @@
 
 	  Take the topology and sorted checks out of OK.
 
-2005-12-02 Friday 22:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 22:13  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.9): Update
 	  add_universe_rows_and_columns to unset pending rows.	Update
 	  insert(gg) so that at most it adjusts the space dimension if an
 	  all-zero parameter is given.
 
-2005-12-02 Friday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 20:45  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
 	  (grids.[8,5]): Add recycling_insert, remove_space_dimensions,
@@ -9799,17 +45702,17 @@
 	  add_row to the private section.  Keep the Grid friend
 	  declaration, for now.
 
-2005-12-02 Friday 20:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 20:41  Matthew Mundell
 
 	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
 	  (grids.[9,8]): Add access operators.
 
-2005-12-02 Friday 17:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 17:38  Matthew Mundell
 
 	* src/Grid_public.cc (grids.111): Take the topology specification
 	  out of the generator system construction in Grid(n,k).
 
-2005-12-02 Friday 17:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 17:36  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.54): Reduce dependency on the
 	  Grid_Generator_System Grid friend declaration: let
@@ -9820,7 +45723,7 @@
 	  num_columns call with an equivalent which uses
 	  Grid_Generator_System::space_dimension().
 
-2005-12-02 Friday 17:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 17:28  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
 	  Grid_Generator_System.inlines.hh (grids.[7,4,4]): Add a topology
@@ -9829,13 +45732,13 @@
 	  wrapper methods max_space_dimension, space_dimension and
 	  num_lines.  Add Grid_Generator_System(dim).
 
-2005-12-02 Friday 16:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 16:13  Matthew Mundell
 
 	* src/Grid_public.cc (grids.110): Update
 	  generalized_affine_image(v,e,d,m) to insert the parameter via
 	  function `parameter'.
 
-2005-12-02 Friday 16:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 16:12  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
 	  Grid_Generator_System.inlines.hh (grids.[6,3,3]): Add method
@@ -9845,52 +45748,52 @@
 	  ascii_dump() a real (vs inline) method.  Set the affine_image
 	  grid parameter automatic value to true.
 
-2005-12-02 Friday 16:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 16:05  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.inlines.hh (grids.[5,7]):
 	  Implement method parameter locally to work around the
 	  normalization in Generator::ray.
 
-2005-12-02 Friday 16:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-02 Friday 16:04  Matthew Mundell
 
 	* src/Grid_Generator.defs.hh (grids.8): Keep the Grid friend
 	  declaration.
 
-2005-12-01 Thursday 22:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 22:43  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.10): Turn off test4 (includes ray
 	  insertion), for now.
 
-2005-12-01 Thursday 22:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 22:34  Matthew Mundell
 
 	* src/Grid_public.cc (grids.109): Update add_generator(g) to only
 	  adjust the divisor for points, for now.
 
-2005-12-01 Thursday 22:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 22:23  Matthew Mundell
 
 	* src/Grid_public.cc (grids.108): Revert is_universe to create a
 	  generator for each dimension.
 
-2005-12-01 Thursday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 22:01  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.28): Improve a comment slightly.
 
-2005-12-01 Thursday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 22:01  Matthew Mundell
 
 	* src/Grid_Generator.inlines.hh (grids.6): Add a temporary note.
 
-2005-12-01 Thursday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 22:01  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.5): Update insert to work
 	  around the Linear_System::insert normalization check when
 	  inserting a parameter.
 
-2005-12-01 Thursday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 21:46  Matthew Mundell
 
 	* src/Grid_public.cc (grids.107): Revert add_generator to multiply
 	  the given point after it has been inserted.
 
-2005-12-01 Thursday 20:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 20:44  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
 	  Grid_Generator.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
@@ -9900,29 +45803,29 @@
 	  Grid::generalized_affine_image(v,e,d,m) to insert the parameter
 	  in stages.
 
-2005-12-01 Thursday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 20:00  Matthew Mundell
 
 	* tests/Grid/membytes1.cc (grids.3): Update function add_generator
 	  to use Generator instead of Grid_Generator.
 
-2005-12-01 Thursday 19:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 19:59  Matthew Mundell
 
 	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
 	  (grids.[6,4]): Add methods total_memory_in_bytes and
 	  external_memory_in_bytes.
 
-2005-12-01 Thursday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 19:35  Matthew Mundell
 
 	* tests/Grid/congruencesystem2.cc (grids.9): Update
 	  satisfies_all_congruences to use Generator instead of
 	  Grid_Generator.
 
-2005-12-01 Thursday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 19:21  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.14): Update test4 to add all
 	  generators.
 
-2005-12-01 Thursday 19:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 19:10  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
 	  (grids.[84,52,105]): Reduce the dependency on the Grid_Generator
@@ -9936,18 +45839,18 @@
 
 	  Take out the OK NC check and the add_generator NC handling.
 
-2005-12-01 Thursday 18:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:56  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.27): Update upper_triangular to use
 	  Generator instead of Grid_Generator.
 
-2005-12-01 Thursday 18:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:56  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.24): In both add_space_dimensions
 	  methods use add_universe_rows_and_columns instead of manually
 	  adding the rows.
 
-2005-12-01 Thursday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:55  Matthew Mundell
 
 	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
 	  Grid_Generator_System.inlines.hh (grids.[4,2,2]): Add
@@ -9955,14 +45858,14 @@
 	  add_row(gg), and new method add_universe_rows_and_columns.  Use
 	  Generator instead of Grid_Generator in const_iterator.
 
-2005-12-01 Thursday 18:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:52  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
 	  Grid_Generator.inlines.hh (grids.[3,5,3]): Add many Generator
 	  wrapper methods, and new methods multiply and coefficient_swap.
 	  Update OK to call methods directly, instead of via a reference.
 
-2005-12-01 Thursday 18:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:49  Matthew Mundell
 
 	* src/: Scalar_Products.cc, Scalar_Products.defs.hh,
 	  Scalar_Products.inlines.hh (grids.[4,4,4]): Use Grid_Generator
@@ -9971,44 +45874,44 @@
 	  homogeneous_assign(z,e,g).  Take out
 	  Topology_Adjusted_Scalar_Product_Assign.
 
-2005-12-01 Thursday 18:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:45  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[35,21]): Use Grid_Generator instead of Generator.
 
-2005-12-01 Thursday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-12-01 Thursday 18:44  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.23): Turn of ray test for now.
 
-2005-11-30 Wednesday 20:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 20:09  Matthew Mundell
 
 	* src/: Generator.defs.hh, Generator_System.defs.hh,
 	  Grid_Generator.defs.hh (grids.[15,9,4]): Comment inclusions above
 	  the line instead of at the line end, to please
 	  utils/build_header.
 
-2005-11-30 Wednesday 19:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 19:56  Matthew Mundell
 
 	* src/Grid_Generator_System.cc (grids.3): Update OK to call the
 	  updated Grid_Generator::OK, and to use Grid_Generator_System for
 	  the generator system type.
 
-2005-11-30 Wednesday 19:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 19:53  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[2,3]):
 	  Add OK method.
 
-2005-11-30 Wednesday 19:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 19:53  Matthew Mundell
 
 	* src/: Generator.cc, Generator.defs.hh (grids.[6,14]): Take out
 	  the OK method flag parameter hack.
 
-2005-11-30 Wednesday 19:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 19:52  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.13): Add only NC generators
 	  for now.
 
-2005-11-30 Wednesday 17:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 17:49  Matthew Mundell
 
 	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
 	  Grid_Generator.inlines.hh, Grid_Generator_System.cc, Makefile.am
@@ -10024,7 +45927,7 @@
 
 	* TODO (1.160): Added an item.
 
-2005-11-30 Wednesday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-30 Wednesday 16:55  Matthew Mundell
 
 	* src/Grid_public.cc, src/Grid_simplify.cc,
 	  src/Linear_Expression.defs.hh, src/Makefile.am,
@@ -10120,12 +46023,12 @@
 
 	* demos/ppl_lpsol/ppl_lpsol.c (1.20): Removed trailing whitespace.
 
-2005-11-28 Monday 21:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 21:08  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.34): Compare to zero explicitly
 	  in normalize_moduli.
 
-2005-11-28 Monday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 21:04  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.22): Update
 	  add_space_dimensions_and_embed and
@@ -10133,30 +46036,30 @@
 	  grid.  Update concatenate_assign to handle empty congruence
 	  systems.
 
-2005-11-28 Monday 21:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 21:01  Matthew Mundell
 
 	* src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_simplify.cc
 	  (grids.[44,50,38]): Improve a trace message slightly.  Improve a
 	  few comments.  Update the congruence system simplify method to
 	  accept empty congruence systems.
 
-2005-11-28 Monday 20:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 20:54  Matthew Mundell
 
 	* src/Grid_public.cc (grids.103): Improve a few comments.  Update
 	  intersection_assign to add the `y' congruence system only if it
 	  contains rows.  Take the setting of the up-to-date flag out of
 	  Grid(n,k).
 
-2005-11-28 Monday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 20:50  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.10): Improve a comment slightly.
 
-2005-11-28 Monday 16:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 16:03  Matthew Mundell
 
 	* src/Grid_public.cc (grids.102): Update Grid(const Grid&) to
 	  ensure that the out of date systems are the correct size.
 
-2005-11-28 Monday 15:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 15:59  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.21): Update remove_space_dimensions and
 	  remove_higher_space_dimensions to call set_empty when the grid is
@@ -10169,11 +46072,11 @@
 	  generalized_affine_image(). Common code factored out in a couple
 	  of helper functions.
 
-2005-11-28 Monday 13:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 13:27  Matthew Mundell
 
 	* src/Congruence_System.inlines.hh (grids.11): Align comment.
 
-2005-11-28 Monday 13:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-28 Monday 13:27  Matthew Mundell
 
 	* src/Grid_public.cc (grids.101): Take out query (set_zero_dim_univ
 	  will insert a point, which adjusts the space dimension).
@@ -10193,37 +46096,37 @@
 
 	* doc/ppl.sty (grids.4): Improved comments.
 
-2005-11-27 Sunday 19:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 19:03  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.37): In the generator simplify method
 	  also assert sys is OK in the empty case.  In both cases pass
 	  false to OK.
 
-2005-11-27 Sunday 18:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 18:54  Matthew Mundell
 
 	* src/Grid_public.cc (grids.100): Leave congruences as they are
 	  (update_generators will simplify them).
 
-2005-11-27 Sunday 18:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 18:27  Matthew Mundell
 
 	* src/Grid_public.cc (grids.99): Assert false if relation_with(cg)
 	  finds a closure point.
 
-2005-11-27 Sunday 18:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 18:05  Matthew Mundell
 
 	* src/Row.defs.hh (grids.7): Take out the Grid friend declaration.
 
-2005-11-27 Sunday 18:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 18:04  Matthew Mundell
 
 	* src/Polyhedron_public.cc (grids.9): Note a possible improvement
 	  in add_congruences(cgs).
 
-2005-11-27 Sunday 18:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 18:02  Matthew Mundell
 
 	* src/Matrix.defs.hh (grids.5): Mention size and capacity in the
 	  add_recycled_row parameter description.
 
-2005-11-27 Sunday 17:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 17:59  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.36): In the congruence simplify
 	  method always erase rows with erase_to_end.  Take out the
@@ -10231,18 +46134,18 @@
 	  Improve two comments.  Compare to zero explicitly in two
 	  assertions.
 
-2005-11-27 Sunday 17:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 17:53  Matthew Mundell
 
 	* src/Constraint.defs.hh (grids.9): Take out the Congruence_System
 	  friend declaration.
 
-2005-11-27 Sunday 17:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 17:52  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.33): Update insert to use
 	  Constraint::space_dimension instead of the Constraint::size and
 	  Constraint::is_necessarily_closed.
 
-2005-11-27 Sunday 17:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 17:48  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
 	  Linear_Expression.defs.hh, Linear_Expression.inlines.hh
@@ -10251,37 +46154,37 @@
 	  Linear_Expression(le,sz) in the Congruence %= operators.  Take
 	  out Linear_Expression(le,sz,capacity).
 
-2005-11-27 Sunday 17:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-27 Sunday 17:37  Matthew Mundell
 
 	* STANDARDS (grids.8): Take out section "Standards for the Test
 	  Programs".
 
-2005-11-25 Friday 15:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 15:53  Matthew Mundell
 
 	* src/Row.defs.hh (grids.6): Take out the Congruence_System friend
 	  declaration.
 
-2005-11-25 Friday 14:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 14:08  Matthew Mundell
 
 	* src/Polyhedron_public.cc (grids.8): Take out a query that relates
 	  to the trunk.
 
-2005-11-25 Friday 14:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 14:04  Matthew Mundell
 
 	* tests/Grid/affinepreimage1.cc (grids.7): Simplify a congruence in
 	  test8.
 
-2005-11-25 Friday 14:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 14:00  Matthew Mundell
 
 	* STANDARDS (grids.7): Mention that OK is called in
 	  find_variation_template.  Give an example of calling
 	  find_variation_template.
 
-2005-11-25 Friday 13:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 13:57  Matthew Mundell
 
 	* src/Matrix.cc (grids.6): Improve a comment in add_recycled_row.
 
-2005-11-25 Friday 11:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 11:42  Matthew Mundell
 
 	* src/: Grid_chdims.cc, Grid_nonpublic.cc, Grid_public.cc,
 	  Grid_widenings.cc (grids.[20,49,98,9]): In is_included_in merge
@@ -10292,94 +46195,94 @@
 	  for the fact the resulting grid always contains at least one
 	  point.
 
-2005-11-25 Friday 11:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 11:29  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.43): Keep the shrink_covering_box and
 	  get_covering_box dimension compatibility checks.
 
-2005-11-25 Friday 11:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-25 Friday 11:28  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.82): Improve the update_congruences() and
 	  minimize() descriptions.
 
-2005-11-24 Thursday 13:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-24 Thursday 13:49  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.31): Take out Polyhedron friend
 	  declaration.
 
-2005-11-24 Thursday 13:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-24 Thursday 13:14  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.42): In the covering box grid
 	  constructor return immediately after setting empty when a
 	  universe interval is encountered.
 
-2005-11-24 Thursday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-24 Thursday 12:37  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.25): Move TRACE definition into the
 	  PPL namespace.  #undef TRACE afterwards.
 
-2005-11-24 Thursday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-24 Thursday 12:37  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.35): Replace the tracing stream with
 	  cerr and a macro called TRACE.
 
-2005-11-24 Thursday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-24 Thursday 12:12  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.48): In bounds(expr,char*) use
 	  Generator::is_line_or_ray.
 
-2005-11-24 Thursday 12:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-24 Thursday 12:05  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.24): Replace the tracing stream
 	  with cerr and macro TRACE.
 
-2005-11-23 Wednesday 20:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 20:53  Matthew Mundell
 
 	* src/Generator_System.cc (grids.17): Re-enable the OK assertion.
 
-2005-11-23 Wednesday 20:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 20:51  Matthew Mundell
 
 	* src/: Generator.cc, Generator.defs.hh (grids.[5,12]): Extend the
 	  OK method check_normalization argument to other
 	  polyhedron-specific checks.
 
-2005-11-23 Wednesday 19:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 19:12  Matthew Mundell
 
 	* src/Grid_public.cc (grids.97): In add_recycled_generators
 	  minimize via update_generators instead of via minimize.
 
-2005-11-23 Wednesday 18:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 18:37  Matthew Mundell
 
 	* src/: Grid_public.cc, Grid_nonpublic.cc (grids.[96,47]): In
 	  add_recycled_generators_and_minimize minimize via
 	  update_generators and update_congruences instead of via minimize.
 
-2005-11-23 Wednesday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 17:43  Matthew Mundell
 
 	* src/Congruence_System.defs.hh (grids.20): Make
 	  has_linear_equalities public.
 
-2005-11-23 Wednesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 17:41  Matthew Mundell
 
 	* src/Checked_Number.inlines.hh (grids.7): Update policy
 	  ROUND_DEFAULT to ROUND_DEFAULT_FUNCTION.
 
-2005-11-23 Wednesday 17:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 17:33  Matthew Mundell
 
 	* src/: Grid_nonpublic.cc, Grid_public.cc (grids.[46,95]): Use
 	  Generator::is_line_or_ray instead of Generator::is_point.
 
-2005-11-23 Wednesday 17:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 17:02  Matthew Mundell
 
 	* src/Linear_Expression.defs.hh (grids.7): Declare
 	  Congruence_System a friend.
 
-2005-11-23 Wednesday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 17:01  Matthew Mundell
 
 	* src/Generator_System.cc (grids.16): Include compiler.hh.  Resolve
 	  two merge conflicts.
 
-2005-11-23 Wednesday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 17:00  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence_System.cc,
 	  Generator.defs.hh, Grid_nonpublic.cc, Grid_public.cc,
@@ -10568,7 +46471,7 @@
 	* src/BD_Shape.inlines.hh (1.98): Corrected an ambiguous call
 	  problem when coefficients are checked_int64.
 
-2005-11-23 Wednesday 00:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-23 Wednesday 00:06  Matthew Mundell
 
 	* src/: Congruence_System.cc, Grid.defs.hh, Grid_minimize.cc,
 	  Grid_nonpublic.cc, Grid_public.cc (grids.[31,81,24,44,93]): Move
@@ -10580,28 +46483,28 @@
 	  generator conversion via a temporary grid instead of a temporary
 	  congruence system.
 
-2005-11-22 Tuesday 12:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-22 Tuesday 12:08  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.23): Improve two comments.
 
-2005-11-22 Tuesday 11:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-22 Tuesday 11:34  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_conversion.cc (grids.[80,22]): Make
 	  conversion void of return.
 
-2005-11-22 Tuesday 11:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-22 Tuesday 11:21  Matthew Mundell
 
 	* src/Grid_public.cc (grids.92): Leave dim_kinds at the end of the
 	  ASCII dump.  Resign to reading dim_kind into a short temporary
 	  int in ascii_load.
 
-2005-11-22 Tuesday 11:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-22 Tuesday 11:01  Matthew Mundell
 
 	* tests/Grid/congruence1.cc (grids.9): Use a local namespace.
 	  Merge test10 and test11.  Add is_trivial_* tests of the form b %=
 	  0 mod m where b <> 0 mod m.
 
-2005-11-22 Tuesday 10:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-22 Tuesday 10:38  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh (grids.[16,28]): Consider
 	  b %= 0 mod m where b <> 0 mod m as false in is_trivial_false.
@@ -10622,21 +46525,21 @@
 
 	* src/Rounding_Dir.defs.hh (1.3): Added a couple of comments.
 
-2005-11-21 Monday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-21 Monday 16:29  Matthew Mundell
 
 	* tests/Grid/isuniverse1.cc (grids.5): Use a local namespace.
 	  Insert test4, where the gird is zero dimension empty.  Add tests
 	  with the systems in various states of minimization and
 	  up-to-date'ness.
 
-2005-11-21 Monday 16:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-21 Monday 16:02  Matthew Mundell
 
 	* src/Grid_public.cc (grids.91): In is_universe check for a single
 	  integrality congruence if the congruences are minimized, use a
 	  single temporary generator instead of creating a temporary grid,
 	  and take out the gen_sys check.
 
-2005-11-21 Monday 15:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-21 Monday 15:58  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.27): Correct is_trivial_true doc.
 
@@ -10941,6 +46844,12 @@
 
 2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* interfaces/Prolog/XSB/expected_pchk_int64 (altnum.1): file
+	  expected_pchk_int64 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* interfaces/Prolog/XSB/expected_pchk_int64 (grids.1): file
 	  expected_pchk_int64 was added on branch grids on 2005-11-23
 	  13:24:06 +0000
@@ -10953,12 +46862,24 @@
 
 2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* interfaces/Prolog/XSB/expected_pchk_mpz (altnum.1): file
+	  expected_pchk_mpz was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* interfaces/Prolog/XSB/expected_pchk_mpz (grids.1): file
 	  expected_pchk_mpz was added on branch grids on 2005-11-23
 	  13:24:06 +0000
 
 2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* interfaces/Prolog/XSB/expected_pchk_mpz_a (altnum.1): file
+	  expected_pchk_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* interfaces/Prolog/XSB/expected_pchk_mpz_a (grids.1): file
 	  expected_pchk_mpz_a was added on branch grids on 2005-11-23
 	  13:24:06 +0000
@@ -11081,12 +47002,12 @@
 	* src/BD_Shape.inlines.hh (1.89): The precision of affine_image()
 	  improved further.
 
-2005-11-18 Friday 17:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 17:31  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.19): In concatenate_assign improve some
 	  comments and split an assert into two.
 
-2005-11-18 Friday 17:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 17:30  Matthew Mundell
 
 	* tests/Grid/concatenate1.cc (grids.4): Define tests in a local
 	  namespace.  Add a test where the second grid is empty.  Add tests
@@ -11094,34 +47015,34 @@
 	  congruence system.  In all tests call find_variation only on the
 	  grid under test and only after concatenating.
 
-2005-11-18 Friday 14:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 14:53  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.30): Add an extra loop to
 	  satisfies_all_congruences so that the scalar product is
 	  multiplied by the divisor only as required.
 
-2005-11-18 Friday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 14:28  Matthew Mundell
 
 	* src/Grid_chdims.cc, tests/Grid/removespacedims1.cc
 	  (grids.[18,8]): Add test6 (where the variable set includes the
 	  first dim) and test7 (where the result contains an all-zero
 	  parameter).  Define the tests within a local namespace.
 
-2005-11-18 Friday 13:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 13:30  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.21): Reduce the number of known_gr
 	  congruences in test15.
 
-2005-11-18 Friday 13:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 13:03  Matthew Mundell
 
 	* tests/Grid/removespacedims1.cc (grids.7): Enable test4.  Rename
 	  test1 test5.	Add a simple test as test1.
 
-2005-11-18 Friday 12:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 12:46  Matthew Mundell
 
 	* tests/Grid/intersection2.cc (grids.7): Modify test7 slightly.
 
-2005-11-18 Friday 12:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-18 Friday 12:40  Matthew Mundell
 
 	* tests/Grid/congruencesystem1.cc (grids.7): Neaten formatting.
 	  Take out list of methods that could be tested.
@@ -11131,7 +47052,7 @@
 	* tests/BD_Shape/: Makefile.am (1.26), run_tests (1.8): Let
 	  BD_Shape<mpq> be the first one to be tested.
 
-2005-11-17 Thursday 15:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 15:35  Matthew Mundell
 
 	* tests/Grid/foldspacedims1.cc (grids.4): Correct two comments.
 	  Add test11, in which a relational grid becomes a grid that is
@@ -11143,35 +47064,35 @@
 	  checked_float.inlines.hh (1.54), checked_mpz.inlines.hh (1.33):
 	  Removed traling whitespace.
 
-2005-11-17 Thursday 14:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 14:14  Matthew Mundell
 
 	* tests/Grid/congruencesystem2.cc (grids.7): Add a local namespace.
 	  Fit fulfils to satisfies_all_congruence.  Take out the closure
 	  point tests.	Add tests where the divisor is greater than one.
 
-2005-11-17 Thursday 13:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 13:33  Matthew Mundell
 
 	* tests/Grid/congruence1.cc (grids.8): Resolve a query (the two
 	  grids should be equal).
 
-2005-11-17 Thursday 13:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 13:19  Matthew Mundell
 
 	* tests/Grid/addspacedims2.cc (grids.7): Take out two simple
 	  queries.  Use equalities where possible to create the test5 known
 	  congruence system.
 
-2005-11-17 Thursday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 12:58  Matthew Mundell
 
 	* src/scalar_products.cc (grids.4): Clean a
 	  reduced_scalar_product_assign comment.
 
-2005-11-17 Thursday 12:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 12:51  Matthew Mundell
 
 	* src/Grid_Certificate.cc (grids.8): Format returns consistently.
 	  Quote variables consistently in comments.  Resign to creating a
 	  temporary certificate in compare(gr).
 
-2005-11-17 Thursday 12:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-17 Thursday 12:15  Matthew Mundell
 
 	* src/scalar_products.defs.hh (grids.5): Keep
 	  homogeneous_scalar_product_sign, which is used in method
@@ -11219,28 +47140,28 @@
 	  Euclidean_Distance_Specialization.  Avoided a compiler warning.
 	  Factorized some common code.
 
-2005-11-16 Wednesday 18:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-16 Wednesday 18:12  Matthew Mundell
 
 	* src/scalar_products.defs.hh (grids.4): Keep
 	  homogeneous_scalar_product_assign, which is used in max_min.
 
-2005-11-16 Wednesday 18:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-16 Wednesday 18:03  Matthew Mundell
 
 	* src/Matrix.defs.hh (grids.4): Take out old friends.
 
-2005-11-16 Wednesday 18:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-16 Wednesday 18:02  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.34): Correct typo in temporary
 	  comment.
 
-2005-11-16 Wednesday 18:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-16 Wednesday 18:00  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.79): Mention only that expr in the
 	  bounded methods are bounded (instead of mentioning bounding from
 	  above or below.  Note that the two "bound_from" methods are the
 	  same.
 
-2005-11-16 Wednesday 16:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-16 Wednesday 16:59  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.8): Take out the inclusion of the
 	  bounding box header.
@@ -11310,17 +47231,17 @@
 	* src/simplex.cc (1.31): The steepest-edge technique should be
 	  enabled by default (it was disabled by error in the last commit).
 
-2005-11-15 Tuesday 17:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 17:35  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.inlines.hh (grids.[15,17]): Make
 	  is_trivial_true and is_trivial_false real (vs inline) methods.
 
-2005-11-15 Tuesday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 17:19  Matthew Mundell
 
 	* src/Generator_System.cc (grids.14): "Use" parameter
 	  check_normalization in method `insert'.
 
-2005-11-15 Tuesday 17:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 17:17  Matthew Mundell
 
 	* src/: Grid_Certificate.cc, Grid_minimize.cc, Grid_public.cc,
 	  Grid_simplify.cc, Grid_widenings.cc (grids.[7,23,90,33,7]):
@@ -11329,7 +47250,7 @@
 	  add_recycled_generators and add_recycled_generators_and_minimize
 	  only set zero dimension universe when the grid is empty.
 
-2005-11-15 Tuesday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 17:10  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.77): Doc the minimized_generators()
 	  parameter conversion.
@@ -11346,19 +47267,19 @@
 
 	* src/checked_ext.inlines.hh (1.25): Added missing argument.
 
-2005-11-15 Tuesday 15:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 15:38  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, mingenerators1.cc (grids.[52,1]): Add
 	  mingenerators1, which tests Grid::minimized_generators().
 
-2005-11-15 Tuesday 15:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 15:37  Matthew Mundell
 
 	* src/Grid_public.cc (grids.89): In generators() use
 	  hide_parameters() and move the zero dim check to precede the
 	  empty check.	Implement minimized_generators() directly, instead
 	  of calling generators().
 
-2005-11-15 Tuesday 15:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 15:31  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[76,43]): Add
 	  hide_parameters().
@@ -11367,7 +47288,7 @@
 
 	* src/DB_Row.inlines.hh (1.13): Two FIXMEs removed.
 
-2005-11-15 Tuesday 14:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 14:54  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.42): In construct(gs,) move the
 	  gen_sys sorted flag setting into the space_dim > 0 case.
@@ -11410,19 +47331,19 @@
 	  New file Rounding_Dir.inlines.hh will contain inline functions
 	  operating on enum Rounding_Dir values.
 
-2005-11-15 Tuesday 12:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 12:38  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, generators1.cc, mincongruences1.cc
 	  (grids.[51,1,1]): Add generators1 and mincongruences1, which test
 	  Grid::generators() and Grid::minimized_congruences().
 
-2005-11-15 Tuesday 12:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 12:36  Matthew Mundell
 
 	* tests/Grid/congruences1.cc (grids.4): Insert test6, where the
 	  grid is defined by generators.  In test8 (was test7) minimize
 	  when adding congruence.
 
-2005-11-15 Tuesday 12:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-15 Tuesday 12:33  Matthew Mundell
 
 	* src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
 	  (grids.[41,41,88]): Always set zero dim universe via
@@ -11486,29 +47407,29 @@
 	  feasible point if satisfiable.  All of the above based on
 	  implementation work by Andrea Cimino.
 
-2005-11-14 Monday 18:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 18:19  Matthew Mundell
 
 	* tests/Grid/congruences1.cc (grids.3): Add test7, where a
 	  congruence system reference is used after the zero dimension grid
 	  from which it comes has been made empty.
 
-2005-11-14 Monday 17:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 17:55  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.18): Add zero dimension construction
 	  tests.
 
-2005-11-14 Monday 17:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 17:55  Matthew Mundell
 
 	* tests/Grid/congruences1.cc (grids.2): Add test6, where a
 	  congruence system reference is used after the grid from which it
 	  comes has been made empty.
 
-2005-11-14 Monday 16:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:57  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, congruences1.cc (grids.[50,1]): Add
 	  congrueces1, which tests Grid::congruences().
 
-2005-11-14 Monday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:56  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.75): Note the covering box constructor
 	  behaviour when the box is empty.  Improve the get_covering_box
@@ -11521,23 +47442,23 @@
 	  numeric_limits<mpz_class>::epsilon() and
 	  numeric_limits<mpz_class>::round_error(): they now return 0.
 
-2005-11-14 Monday 16:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:47  Matthew Mundell
 
 	* tests/Grid/maxmin1.cc (grids.2): Use check_both in test2.
 	  Implement the zero dimension universe test.
 
-2005-11-14 Monday 16:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:46  Matthew Mundell
 
 	* tests/Grid/coveringbox2.cc (grids.5): Add an empty fail check to
 	  operator==.  Update the boxes expected from empty grids.  Add
 	  zero dimension tests.
 
-2005-11-14 Monday 16:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:44  Matthew Mundell
 
 	* tests/Grid/boundingbox2.cc (grids.3): Add an empty fail check to
 	  operator==.  Add zero dimension tests.
 
-2005-11-14 Monday 16:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:42  Matthew Mundell
 
 	* src/Grid_public.cc (grids.87): In Grid(dims,kind),
 	  add_recycled_congruences(cgs) and
@@ -11550,17 +47471,17 @@
 	  Improve and correct some comments.  Neaten the OK zero dimension
 	  universe check.
 
-2005-11-14 Monday 16:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:32  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.22): In both minimize methods assert
 	  that there are the minimum required number of columns.
 
-2005-11-14 Monday 16:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:30  Matthew Mundell
 
 	* src/Grid_Certificate.cc (grids.6): Use gr instead of cgr, for
 	  consistency.
 
-2005-11-14 Monday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:29  Matthew Mundell
 
 	* src/: Grid.inlines.hh, Grid_nonpublic.cc (grids.[40,40]): In
 	  set_empty make con_sys false.
@@ -11582,12 +47503,12 @@
 	  dimension check and take out a redundant check for rows in the
 	  generator system.
 
-2005-11-14 Monday 16:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:08  Matthew Mundell
 
 	* src/Congruence_System.inlines.hh (grids.10): Ensure that the
 	  modulus and constant term columns always exist.
 
-2005-11-14 Monday 16:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-14 Monday 16:05  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.29): Neaten formatting.
 
@@ -11773,39 +47694,39 @@
 
 	* README.configure (1.15): Corrected a couple of typos.
 
-2005-11-11 Friday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 17:29  Matthew Mundell
 
 	* src/: Grid_public.cc, Grid.inlines.hh (grids.[86,39]): Inline
 	  method is_empty.  In is_empty add more fast-fail tests and
 	  minimize only the congruence system in the last-resort test.
 
-2005-11-11 Friday 17:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 17:25  Matthew Mundell
 
 	* src/: Grid_Status.cc, Grid_Status.idefs.hh,
 	  Grid_Status.inlines.hh (grids.[4,4,3]): Gridify the Grid_Status
 	  comments.
 
-2005-11-11 Friday 17:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 17:23  Matthew Mundell
 
 	* doc/definitions.dox (grids.8): Add anchor grid_space_dimensions.
 	  Refer to affine_function instead of affine_transformation.
 
-2005-11-11 Friday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 17:03  Matthew Mundell
 
 	* tests/Grid/affinepreimage1.cc (grids.6): Correct expected result
 	  in test16.
 
-2005-11-11 Friday 15:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 15:35  Matthew Mundell
 
 	* src/Congruence_System.inlines.hh (grids.9): Only qualify the
 	  namespace of insert(cg) once.
 
-2005-11-11 Friday 15:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 15:32  Matthew Mundell
 
 	* src/Generator_System.defs.hh (grids.6): Document all parameters
 	  in a method when some are documented.
 
-2005-11-11 Friday 15:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-11 Friday 15:29  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.74): Improve the class description.
 	  Update to the newly named affine_function and
@@ -11815,27 +47736,27 @@
 	  documented.  Correct the return value documentation for the
 	  simplify methods.
 
-2005-11-10 Thursday 21:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 21:28  Matthew Mundell
 
 	* src/Grid_public.cc (grids.85): Add colon between namespace and
 	  class in comment.
 
-2005-11-10 Thursday 21:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 21:28  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.73): Convert the class doc examples into
 	  grid examples.  Correct a parameter name.
 
-2005-11-10 Thursday 21:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 21:26  Matthew Mundell
 
 	* src/Generator.defs.hh (grids.9): Keep Congruence_System as a
 	  friend.
 
-2005-11-10 Thursday 21:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 21:21  Matthew Mundell
 
 	* tests/Grid/: affineimage1.cc, affinepreimage1.cc (grids.[7,5]):
 	  Add three simple tests.
 
-2005-11-10 Thursday 19:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 19:14  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh (grids.[14,24]): Add
 	  method throw_invalid_argument.  Use it in
@@ -11843,7 +47764,7 @@
 	  constraints move the check that the constraint is an equality to
 	  come before the construction of the underlying row.
 
-2005-11-10 Thursday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 18:31  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh,
 	  Congruence_System.inlines.hh, Constraint.defs.hh
@@ -11855,14 +47776,14 @@
 
 	  Doc the strong normalization of the insert methods.
 
-2005-11-10 Thursday 18:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 18:23  Matthew Mundell
 
 	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
 	  (grids.[4,3,3]): Add add_recycled_row(Row&).	Move the bulk of
 	  add_row to add_recycled_row.	Call add_recycled_row from add_row.
 	  Inline add_row.
 
-2005-11-10 Thursday 18:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 18:16  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh (grids.[13,23]): Add
 	  Congruence(c, sz, capacity).
@@ -11872,7 +47793,7 @@
 	* src/BD_Shape.inlines.hh (1.80): Corrected a bug in method
 	  ascii_load().
 
-2005-11-10 Thursday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 14:07  Matthew Mundell
 
 	* src/: Congruence.defs.hh, scalar_products.cc,
 	  scalar_products.defs.hh (grids.[22,3,3]): Take out
@@ -11880,37 +47801,37 @@
 	  reduced_scalar_product_assign(.., ref), which were required by an
 	  older form of Congruence_System::satisfies_all_congruences.
 
-2005-11-10 Thursday 13:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 13:41  Matthew Mundell
 
 	* src/: Congruence_System.defs.hh, Congruence_System.inlines.hh
 	  (grids.[18,7]): Make the ascii_dump and ascii_load documentation
 	  implementation details.  Take out
 	  Congruence_System(n_rows,n_cols).  Keep has_linear_equalities().
 
-2005-11-10 Thursday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 12:31  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, topclosure1.cc (grids.[49,1]): Add
 	  topclosure1, which tests Grid::topological_closure_assign().
 
-2005-11-10 Thursday 12:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 12:29  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
 	  (grids.[72,38,84]): Declare and implement
 	  topological_closure_assign().
 
-2005-11-10 Thursday 11:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 11:57  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, membytes1.cc, membytes2.cc
 	  (grids.[48,1,1]): Add membytes1 and membytes2, to exercise
 	  Grid::total_memory_in_bytes() and
 	  Grid::external_memory_in_bytes().
 
-2005-11-10 Thursday 11:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 11:56  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.6): Rename parameter selected_cgs as
 	  cgs_selected.
 
-2005-11-10 Thursday 11:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-10 Thursday 11:55  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_minimize.cc,
 	  Grid_nonpublic.cc, Grid_public.cc (grids.[71,37,21,39,83]): Doc
@@ -11931,7 +47852,7 @@
 	  minimize(gs,cgs) to match the other methods that return an
 	  indication of the grid's emptiness.
 
-2005-11-08 Tuesday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 21:46  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.70): Correct and neaten comments.
 	  Document the parameters in the shrink and get bounding box
@@ -11940,35 +47861,35 @@
 	  join_assign_and_minimize declaration to match the Polyhedron
 	  ordering.
 
-2005-11-08 Tuesday 20:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 20:25  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, disjoint1.cc (grids.[47,1]): Add
 	  disjoint1, which tests Grid::is_disjoint_from().
 
-2005-11-08 Tuesday 20:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 20:24  Matthew Mundell
 
 	* tests/Grid/contains1.cc (grids.4): Improve comments, messages and
 	  a variable name.
 
-2005-11-08 Tuesday 20:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 20:22  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.5): In limited_extrapolation_assign
 	  check dimension compatibility before falling back to the ordinary
 	  widening.
 
-2005-11-08 Tuesday 20:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 20:16  Matthew Mundell
 
 	* src/Grid_public.cc (grids.82): Enable the is_disjoint_from
 	  definition.  In intersection_assign pass true only to y.OK, as x
 	  can be empty.  Update a temporary comment.  In OK use
 	  "unsatisfiable" instead fo "insoluble".  Neaten a comment.
 
-2005-11-08 Tuesday 20:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 20:11  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.36): Take out is_necessarily_closed()
 	  and topology().
 
-2005-11-08 Tuesday 20:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 20:10  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.69): Neaten and correct comments.
 
@@ -11986,30 +47907,30 @@
 	  minconstraints1.cc was added on branch grids on 2005-11-23
 	  13:24:07 +0000
 
-2005-11-08 Tuesday 17:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 17:54  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.17): Align copyright line.
 
-2005-11-08 Tuesday 17:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 17:54  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.68): Document the length_error exceptions
 	  that occur in many constructors.  Mention copying the given
 	  system in the brief descriptions for many constructors.  Improve
 	  formatting and correct typos in a few comments.
 
-2005-11-08 Tuesday 17:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 17:52  Matthew Mundell
 
 	* src/Grid_public.cc (grids.81): In the copy constructor create
 	  gen_sys NECESSARILY_CLOSED and assert that the given gen_sys was
 	  NECESSARILY_CLOSED.  Move operator= to match the order of method
 	  declarations.
 
-2005-11-08 Tuesday 17:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 17:50  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.35): Move box constructors to follow
 	  other constructors.
 
-2005-11-08 Tuesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 17:41  Matthew Mundell
 
 	* TODO (grids.15): Complete upper_bound_assign_and_minimize item.
 
@@ -12025,22 +47946,22 @@
 	  redundancy information. The method constraints() now invokes
 	  minimized_constraints() if the BD_Shape is known to be reduced.
 
-2005-11-08 Tuesday 14:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 14:09  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, addcongruences1.cc (grids.[46,1]): Add
 	  addcongruences1, to test methods which add multiple congruences
 	  to a grid.
 
-2005-11-08 Tuesday 14:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 14:08  Matthew Mundell
 
 	* tests/Grid/grid3.cc (grids.5): Align copyright line.
 
-2005-11-08 Tuesday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 14:07  Matthew Mundell
 
 	* tests/Grid/addcongruence1.cc (grids.6): Improve title comment.
 	  Add namespace with shared Variables.
 
-2005-11-08 Tuesday 13:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 13:41  Matthew Mundell
 
 	* tests/Grid/: grid3.cc, Makefile.am, addconstraint1.cc,
 	  addconstraints1.cc (grids.[4,45,1,10]): Add grid3, which tests
@@ -12054,7 +47975,7 @@
 	  add_recycled_constraints(cs) and
 	  add_recycled_constraints_and_minimize(cs) to addconstraints1.
 
-2005-11-08 Tuesday 13:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-08 Tuesday 13:32  Matthew Mundell
 
 	* TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[14,67,80]):
 	  Add Grid(cs), add_constraint_and_minimize(c),
@@ -12099,32 +48020,32 @@
 	* src/BD_Shape.inlines.hh (1.76): Got rid of the wrong version of
 	  div_round_up().
 
-2005-11-07 Monday 18:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 18:29  Matthew Mundell
 
 	* tests/Grid/griddifference1 (grids.2): Remove file added in error
 	  earlier.
 
-2005-11-07 Monday 18:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 18:24  Matthew Mundell
 
 	* tests/Grid/maxmin1.cc (grids.1): Add maxmin1, which tests
 	  Grid::maximize(le&, ...) and Grid::minimize(le&, ...).
 
-2005-11-07 Monday 18:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 18:20  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.9): Add test10, for
 	  add_recycled_congruences_and_minimize(cs).
 
-2005-11-07 Monday 18:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 18:20  Matthew Mundell
 
 	* src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[66,79,13]):
 	  Add add_recycled_congruences_and_minimize(cs).
 
-2005-11-07 Monday 18:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 18:07  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.8): Add test9, for
 	  add_recycled_congruences(cs).
 
-2005-11-07 Monday 18:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 18:07  Matthew Mundell
 
 	* TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[12,65,78]):
 	  Add add_recycled_congruences(cs).  Add a dimension compatibility
@@ -12165,12 +48086,12 @@
 	  Added a lot of const qualifications; avoided some dbm's
 	  coefficient copies, preferring the use of references instead.
 
-2005-11-07 Monday 16:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 16:52  Matthew Mundell
 
 	* src/Grid_public.cc (grids.77): Implement add_congruences and
 	  add_congruences_and_minimize via Congruence_System(cs).
 
-2005-11-07 Monday 16:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 16:52  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[27,17]): Add Congruence_System(Constraint_System&).  Move
@@ -12189,33 +48110,33 @@
 
 	* src/checked_mpq.inlines.hh (1.26): Added add_mul and sub_mul.
 
-2005-11-07 Monday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 14:35  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.7): Add test8, for
 	  add_congruences(cs).
 
-2005-11-07 Monday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 14:35  Matthew Mundell
 
 	* src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[64,76,11]):
 	  Add add_congruences(cs).  In add_congruences_and_minimize(cs) add
 	  the congruences with add_recycled_congruences_and_minimize.
 
-2005-11-07 Monday 12:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 12:04  Matthew Mundell
 
 	* src/Congruence_System.defs.hh (grids.16): Narrow a comment.
 
-2005-11-07 Monday 12:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 12:01  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, griddifference1 (grids.[44,1]): Add
 	  maxmin1, which tests Grid::maximize(le&, ...) and
 	  Grid::minimize(le&, ...).
 
-2005-11-07 Monday 11:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 11:59  Matthew Mundell
 
 	* tests/Grid/bounds1.cc (grids.2): Match expected values to updated
 	  method behaviour.
 
-2005-11-07 Monday 11:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-07 Monday 11:58  Matthew Mundell
 
 	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
 	  TODO (grids.[63,34,38,10]): Separate parameters with semicolons
@@ -12289,27 +48210,27 @@
 
 	* src/BD_Shape.inlines.hh (1.73): Reimplemented div_round_up().
 
-2005-11-04 Friday 11:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-04 Friday 11:16  Matthew Mundell
 
 	* tests/Grid/bounded1.cc (grids.2): Add test12, in which every
 	  generator is the same point.
 
-2005-11-04 Friday 11:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-04 Friday 11:15  Matthew Mundell
 
 	* src/Grid_public.cc (grids.75): In is_bounded use the generator
 	  system in any form.
 
-2005-11-04 Friday 11:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-04 Friday 11:13  Matthew Mundell
 
 	* tests/Grid/topclosed1.cc (grids.3): Take out the find_variation
 	  directive.
 
-2005-11-04 Friday 11:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-04 Friday 11:12  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, bounds1.cc (grids.[43,1]): Add bounds1,
 	  which tests Grid::bounds_from_above and Grid::bounds_from_below.
 
-2005-11-04 Friday 11:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-04 Friday 11:11  Matthew Mundell
 
 	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
 	  TODO (grids.[62,33,37,9]): Add methods bounds, bounds_from_above
@@ -12361,32 +48282,32 @@
 	* src/: Float.defs.hh (1.12), Polyhedron_nonpublic.cc (1.57):
 	  Spurious semicolons removed.
 
-2005-11-02 Wednesday 21:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 21:07  Matthew Mundell
 
 	* TODO (grids.8): Complete operation is_bounded.
 
-2005-11-02 Wednesday 21:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 21:06  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, bounded1.cc (grids.[42,1]): Add
 	  bounded1, which tests Grid::is_bounded.
 
-2005-11-02 Wednesday 21:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 21:05  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_public.cc (grids.[61,74]): Add method
 	  is_bounded.
 
-2005-11-02 Wednesday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 20:45  Matthew Mundell
 
 	* TODO (grids.7): Complete operation affine_dimension.
 
-2005-11-02 Wednesday 20:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 20:43  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[60,36]): To
 	  normalize_divisors(gs,div) add third argument first_point, which
 	  implies that all points in gs have the same divisor.	Use this
 	  argument in normalize_divisors(gs,gs).
 
-2005-11-02 Wednesday 19:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 19:49  Matthew Mundell
 
 	* src/Grid_public.cc (grids.73): In is_topologically_closed search
 	  for a single parameter or proper congruence, instead of checking
@@ -12410,18 +48331,18 @@
 	* src/float.types.hh (1.11): Do not define symbols in the global
 	  namespace.
 
-2005-11-02 Wednesday 11:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 11:32  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, affinedim1.cc (grids.[41,1]): Add
 	  affinedim1, which tests Grid::affine_dimension().
 
-2005-11-02 Wednesday 11:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 11:31  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.26): In increase_space_dimension
 	  only add columns when more columns are requested (instead of
 	  always ensuring that the modulus and constant term column exist).
 
-2005-11-02 Wednesday 11:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-02 Wednesday 11:28  Matthew Mundell
 
 	* src/Grid_public.cc (grids.72): Enable and implement method
 	  affine_dimension.  In minimized_congruences and
@@ -12432,49 +48353,49 @@
 
 	* src/Float.defs.hh (1.11): Fixed typo.
 
-2005-11-01 Tuesday 18:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 18:45  Matthew Mundell
 
 	* TODO (grids.6): Complete operators is_topologally_closed and
 	  shrink_bounding_box.
 
-2005-11-01 Tuesday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 18:44  Matthew Mundell
 
 	* tests/Grid/topclosed1.cc (grids.2): Replace function
 	  topclosed1_equal with copy_compare (in ppl_test.hh).	Correct
 	  error messages.
 
-2005-11-01 Tuesday 18:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 18:42  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.13): Add function copy_compare(Grid&,
 	  Grid&).
 
-2005-11-01 Tuesday 18:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 18:41  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, pointed1.cc (grids.[40,1]): Add
 	  pointed1, which tests Grid::is_pointed().
 
-2005-11-01 Tuesday 18:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 18:40  Matthew Mundell
 
 	* src/: Grid_public.cc, Grid.defs.hh (grids.[71,59]): Add the
 	  definition and improve the doc description of is_pointed.
 
-2005-11-01 Tuesday 14:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 14:51  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, topclosed1.cc (grids.[39,1]): Add
 	  topclosed1, which tests Grid::is_topologically_closed().
 
-2005-11-01 Tuesday 14:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 14:49  Matthew Mundell
 
 	* src/Grid_public.cc (grids.70): Implement method
 	  is_topologically_closed.
 
-2005-11-01 Tuesday 14:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 14:26  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.11): Add test8, in which the
 	  added generator has a divisor.  Only call find_variation on the
 	  grid under test.
 
-2005-11-01 Tuesday 14:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-11-01 Tuesday 14:24  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[58,35]): In
 	  normalize_divisors(gs,coeff) read the initial divisor of gs into
@@ -12572,7 +48493,7 @@
 	* tests/BD_Shape/Makefile.am (1.20): The `run_tests' script is now
 	  distributed.
 
-2005-10-30 Sunday 18:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-30 Sunday 18:53  Matthew Mundell
 
 	* tests/Grid/: addconstraints1.cc, addspacedims1.cc,
 	  addspacedims2.cc, concatenate1.cc, congruence1.cc, contains1.cc,
@@ -12583,45 +48504,45 @@
 	  (grids.[6,9,6,3,7,3,2,4,6,5,6,4,5,2,4,6,5,4,6]): Make the title
 	  comments of the tests consistent.
 
-2005-10-30 Sunday 18:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-30 Sunday 18:51  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[57,32]): Update
 	  get_covering_box to work directly with any form of generator
 	  system and to only ever attempt to set each bound once.
 
-2005-10-30 Sunday 00:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-30 Sunday 00:44  Matthew Mundell
 
 	* tests/Grid/coveringbox2.cc (grids.3): Add test14 and test15, to
 	  test that fractions are reduced before being assigned to
 	  intervals.
 
-2005-10-30 Sunday 00:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-30 Sunday 00:42  Matthew Mundell
 
 	* tests/Grid/boundingbox2.cc (grids.2): Improve comment slightly.
 
-2005-10-30 Sunday 00:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-30 Sunday 00:42  Matthew Mundell
 
 	* src/: Grid.inlines.hh, Grid.defs.hh (grids.[31,56]): In
 	  get_covering_box reduce the fraction before assigning it to the
 	  interval.
 
-2005-10-29 Saturday 20:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-29 Saturday 20:17  Matthew Mundell
 
 	* tests/Grid/coveringbox2.cc (grids.2): Name variables
 	  consistently, improve some comments and add test13 (in which an
 	  empty grid is defined by congruences).
 
-2005-10-29 Saturday 20:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-29 Saturday 20:16  Matthew Mundell
 
 	* tests/Grid/boundingbox1.cc (grids.7): Note that boundingbox2 also
 	  tests the constructor under test.
 
-2005-10-29 Saturday 20:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-29 Saturday 20:15  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, boundingbox2.cc (grids.[38,1]): Add
 	  boundingbox2, which tests shrink_bounding_box(Box&).
 
-2005-10-29 Saturday 20:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-29 Saturday 20:11  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[55,30]): Add
 	  shrink_bounding_box(Box&).  Correct two comments in
@@ -12651,7 +48572,7 @@
 
 	* TODO (grids.5): Added a list of TODO items for the grids branch.
 
-2005-10-28 Friday 12:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-28 Friday 12:38  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.29): Calculate the proper congruence
 	  coefficients in the covering box constructor via the GCD of the
@@ -12661,7 +48582,7 @@
 	  the absolute value calculations that would have been performed in
 	  lcm_assign.
 
-2005-10-27 Thursday 18:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-27 Thursday 18:10  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, boundingbox1.cc, coveringbox1.cc,
 	  coveringbox2.cc (grids.[37,6,7,1]): Add coveringbox2.  Move the
@@ -12669,50 +48590,50 @@
 	  tests into coveringbox1.  Fill boundingbox1 with tests of the
 	  bounding box constructor.
 
-2005-10-27 Thursday 18:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-27 Thursday 18:04  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[54,28]): Add a
 	  bounding box constructor.  In the covering box constructor move
 	  the closed bound checks to come before the empty test.
 
-2005-10-27 Thursday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-27 Thursday 12:31  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.53): Add the open bound behaviour to the
 	  description of the covering box constructor.
 
-2005-10-27 Thursday 12:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-27 Thursday 12:04  Matthew Mundell
 
 	* tests/Grid/boundingbox1.cc (grids.5): Add test11, in which a
 	  bound in the box is open.
 
-2005-10-27 Thursday 12:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-27 Thursday 12:03  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.27): In the covering box constructor
 	  throw an exception if any bound is open.
 
-2005-10-26 Wednesday 17:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 17:47  Matthew Mundell
 
 	* src/Grid.defs.hh, src/Grid.inlines.hh,
 	  tests/Grid/boundingbox1.cc, tests/Grid/coveringbox1.cc
 	  (grids.[52,26,4,6]): Use From_Covering_Box instead of
 	  From_Bounding_Box in the Grid from box constructor.
 
-2005-10-26 Wednesday 17:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 17:44  Matthew Mundell
 
 	* src/globals.defs.hh (grids.4): Add tag class From_Covering_Box.
 
-2005-10-26 Wednesday 16:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 16:21  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.51): Improve the covering box constructor
 	  description.	Add the methods required of the box class to the
 	  get_covering_box description.
 
-2005-10-26 Wednesday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 15:23  Matthew Mundell
 
 	* src/Grid_public.cc (grids.69): In OK, assert that the reduced
 	  temporary generator system defines a grid that contains points.
 
-2005-10-26 Wednesday 15:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 15:22  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.20): In the generator system minimize
 	  method assert that, after being reduced, the generator system
@@ -12720,60 +48641,60 @@
 	  empty resulting grid.  Take out the Linear_Row.defs.hh include.
 	  Correct the title comment.
 
-2005-10-26 Wednesday 15:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 15:19  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.25): In get_covering_box assert that,
 	  after being reduced, the generator system defines a grid that
 	  contains points, instead of catering for an empty resulting grid.
 
-2005-10-26 Wednesday 15:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 15:14  Matthew Mundell
 
 	* src/Grid_Certificate.cc (grids.5): Simplify the
 	  Grid_Certificate(cgr) assertion that after being reduced the
 	  generator system defines a grid that contains points.
 
-2005-10-26 Wednesday 12:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 12:48  Matthew Mundell
 
 	* tests/Grid/boundingbox1.cc (grids.3): Add test10, where the box
 	  has a dimension open only from below.
 
-2005-10-26 Wednesday 12:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 12:47  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.50): Improve the descriptions of the box
 	  constructor and method get_covering_box.
 
-2005-10-26 Wednesday 12:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 12:46  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.24): In the Grid covering box
 	  constructor add an equality for each interval that is bounded
 	  only from below.
 
-2005-10-26 Wednesday 11:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 11:38  Matthew Mundell
 
 	* tests/Grid/coveringbox1.cc (grids.5): Use Bounding_Box instead of
 	  BBox.  Add a temporary Bounding_Box operator==.  Rename box to
 	  box1.  In every test add a further check which uses the Grid
 	  covering box constructor.  Always use closed bounds.
 
-2005-10-26 Wednesday 11:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 11:33  Matthew Mundell
 
 	* tests/Grid/boundingbox1.cc (grids.2): Match the expected values
 	  to the updated behaviour of the covering box constructor.
 
-2005-10-26 Wednesday 11:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-26 Wednesday 11:32  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.23): Update the covering box
 	  constructor to handle universe, empty and half open intervals in
 	  ways that match the behaviour of get_covering_box.  Always use
 	  closed bounds.
 
-2005-10-25 Tuesday 17:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-25 Tuesday 17:23  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.49): In the get_covering_box description
 	  note that the lower bounds are as close as possible to the
 	  origin, and add information about the calling guarantees.
 
-2005-10-25 Tuesday 14:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-25 Tuesday 14:33  Matthew Mundell
 
 	* tests/Grid/coveringbox1.cc (grids.4): Add test12, in which all
 	  the points have the same value in one of the dimensions.  Update
@@ -12781,7 +48702,7 @@
 	  close as possible to the origin.  Add the dimension in the test11
 	  description.
 
-2005-10-25 Tuesday 14:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-25 Tuesday 14:21  Matthew Mundell
 
 	* configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
 	  src/Coefficient.cc, src/Coefficient.defs.hh,
@@ -12791,7 +48712,7 @@
 	  (grids.[7,5,7,3,3,21,19,34,32,6,3]): Revert files accidentally
 	  included in last change.
 
-2005-10-25 Tuesday 13:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-25 Tuesday 13:53  Matthew Mundell
 
 	* configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
 	  src/Coefficient.cc, src/Coefficient.defs.hh, src/Grid.inlines.hh,
@@ -12867,11 +48788,11 @@
 	  type Optimization_Kind to specify whether the primal simplex
 	  algorithm should maximize or minimize the object function.
 
-2005-10-24 Monday 12:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-24 Monday 12:39  Matthew Mundell
 
 	* configure.ac (1.195): Set text_md5sum, to complete last change.
 
-2005-10-24 Monday 11:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-24 Monday 11:30  Matthew Mundell
 
 	* configure.ac (1.194): Take out the attempt at checking for an
 	  md5sum -t option.
@@ -12905,17 +48826,17 @@
 	* m4/ac_check_sicstus_prolog.m4 (1.2): Make sure things work even
 	  if `sicstus' is a symbolic link.
 
-2005-10-21 Friday 21:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-21 Friday 21:27  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, coveringbox1.cc (grids.[36,1]): Add
 	  coveringbox1, which tests get_covering_box.
 
-2005-10-21 Friday 21:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-21 Friday 21:25  Matthew Mundell
 
 	* src/Grid_Certificate.cc (grids.4): Finalise calculation of number
 	  of congruences from number of generators.
 
-2005-10-21 Friday 21:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-21 Friday 21:25  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[48,21]): Add template
 	  get_covering_box.
@@ -12999,21 +48920,21 @@
 
 	* src/Constraint_System.cc (1.13): Added a missing const qualifier.
 
-2005-10-18 Tuesday 23:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-18 Tuesday 23:32  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.12): Include cstdlib.
 
-2005-10-18 Tuesday 23:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-18 Tuesday 23:28  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.11): Add a test where the
 	  parsing fails and whitespace follows the parsed number.
 
-2005-10-18 Tuesday 23:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-18 Tuesday 23:12  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.10): Check for expected
 	  spaces in residuals.	Always exit with 1 on error.
 
-2005-10-18 Tuesday 20:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-18 Tuesday 20:19  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.9): Add three tests with
 	  trailing whitespace.
@@ -13109,7 +49030,7 @@
 	  now used in the implementation of
 	  Polyhedron::shrink_bounding_box() and Polyhedron::OK().
 
-2005-10-14 Friday 13:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-14 Friday 13:09  Matthew Mundell
 
 	* src/checked.cc (1.9): Comment every function.  Slightly improve
 	  the formatting in parse_number and input_mpq.
@@ -13256,7 +49177,7 @@
 	* interfaces/Prolog/XSB/ppl_xsb.H (1.41): Reflect the
 	  reorganization of the Watchdog directory.
 
-2005-10-10 Monday 17:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-10 Monday 17:11  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.8): Add two hexadecimal tests
 	  where parsing will stop after the "0x".  Use valid digits in the
@@ -13314,7 +49235,7 @@
 
 	* src/Linear_System.cc (1.27): FIXME resolved.
 
-2005-10-07 Friday 18:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-07 Friday 18:43  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.7): Update temporary
 	  comments.  Increase stack space if large exponents are being
@@ -13341,7 +49262,7 @@
 	* interfaces/C/ppl_c.h.in (1.53): The Linear Programming demo is
 	  now in demos/ppl_lpsol/.
 
-2005-10-06 Thursday 17:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 17:59  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.6): Improve formatting and
 	  messages slightly.  Take out the "fix" macro.  Group tests into
@@ -13349,32 +49270,32 @@
 	  number.  Add a test of the exponent size limit.  Revise temporary
 	  comments.
 
-2005-10-06 Thursday 12:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 12:26  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.5): Take out tracing function
 	  dump_mpz_ptr.  Only print output on error.
 
-2005-10-06 Thursday 12:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 12:21  Matthew Mundell
 
 	* src/checked_int.inlines.hh (1.39): Clip trailing spaces.
 
-2005-10-06 Thursday 11:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 11:56  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.25): In satisfies_all_congruences
 	  multiply the modulus by the divisor when the divisor is greater
 	  than 1 (was 0).
 
-2005-10-06 Thursday 11:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 11:55  Matthew Mundell
 
 	* src/GMP_Integer.defs.hh (grids.5): Take `inline' out of gcdext
 	  declarations.
 
-2005-10-06 Thursday 11:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 11:54  Matthew Mundell
 
 	* src/checked.inlines.hh (grids.7): In gcdext_generic do the s and
 	  t negation only once when the given x and y are negative.
 
-2005-10-06 Thursday 11:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-06 Thursday 11:50  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.35): Add FAIL_TEST directives for
 	  the checked types.
@@ -13419,30 +49340,30 @@
 	  documentation of function is_in_base() improved.  Function
 	  compute_generator() also simplified.
 
-2005-10-04 Tuesday 14:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-04 Tuesday 14:45  Matthew Mundell
 
 	* src/minimize.cc (1.42): Indent note consistently.
 
-2005-10-04 Tuesday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-04 Tuesday 14:35  Matthew Mundell
 
 	* src/Polyhedron_public.cc (1.62): Take out two redundant `else'
 	  and a redundant `if'.  Correct some comments (mostly typos).
 	  Clip a trailing space.  Take out a \relates comment on a
 	  Polyhedron method.
 
-2005-10-04 Tuesday 13:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-04 Tuesday 13:20  Matthew Mundell
 
 	* src/Polyhedron_chdims.cc (1.33): Correct and update some comments
 	  (mostly grammar).  Add a space after two primitive calls in
 	  expand_space_dimension.
 
-2005-10-04 Tuesday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-04 Tuesday 12:58  Matthew Mundell
 
 	* src/: Native_Integer.defs.hh (1.13), Native_Integer.inlines.hh
 	  (1.14): Add template assign(Native_Integer<To>&, const
 	  mpz_class&, Rounding_Dir).
 
-2005-10-04 Tuesday 12:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-04 Tuesday 12:57  Matthew Mundell
 
 	* tests/Random_Number_Generator.inlines.hh (1.3): Revert to using
 	  assign in method get.
@@ -13470,7 +49391,7 @@
 	* configure.ac (1.190): Revised the URI for the Perl directory at
 	  perl.org.
 
-2005-10-03 Monday 18:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-10-03 Monday 18:11  Matthew Mundell
 
 	* tests/Random_Number_Generator.inlines.hh (1.2): In method get
 	  "use" parameter info, and assign the generated number with
@@ -13579,7 +49500,7 @@
 	  simplified by removing a lot of (not really necessary)
 	  bookkeeping. Local variables renamed for improved readability.
 
-2005-09-30 Friday 09:16  David Merchat <merchat at cs.unipr.it>
+2005-09-30 Friday 09:16  David Merchat
 
 	* src/GMP_Integer.types.hh (1.9): We use doxygen command
 	  ``\relates'' to put  all informations about GMP_Integer at the
@@ -13589,26 +49510,26 @@
 	  comment ``\class GMP_Integer'' just before declaration of type
 	  GMP_Integer
 
-2005-09-29 Thursday 18:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-29 Thursday 18:03  Matthew Mundell
 
 	* src/: checked.inlines.hh, checked_float.inlines.hh,
 	  checked_int.inlines.hh (grids.[6,5,5]): Rename gcdext_generic to
 	  gcdext_exact.
 
-2005-09-29 Thursday 18:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-29 Thursday 18:02  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
 	  scalar_products.cc, scalar_products.defs.hh,
 	  scalar_products.inlines.hh (grids.[12,21,16,2,2,2]): Move scalar
 	  product functions into scalar_products.*.
 
-2005-09-29 Thursday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-29 Thursday 17:00  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.4): Improve the call to
 	  function input in function test.  Update temporary comments.	Add
 	  a test with a much larger integer.
 
-2005-09-29 Thursday 11:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-29 Thursday 11:24  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.3): Convert test_template to
 	  function test, which uses an mpq_class checked number.  In
@@ -13642,7 +49563,7 @@
 	  (grids.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
 	  Files moved as in the main trunk.
 
-2005-09-28 Wednesday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-28 Wednesday 21:04  Matthew Mundell
 
 	* CREDITS, ChangeLog, Makefile.am, NEWS, STANDARDS, TODO,
 	  configure.ac, instchk.hh, Watchdog/.cvsignore,
@@ -13761,7 +49682,7 @@
 	  sure the scripts in the `utils' subdirectory are made also at
 	  distribution time, even if they are not distributed themselves.
 
-2005-09-28 Wednesday 17:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-28 Wednesday 17:57  Matthew Mundell
 
 	* tests/Polyhedron/numberinput1.cc (1.2): In test_template add
 	  checks, including residual checks, and improve the comparison
@@ -13798,12 +49719,12 @@
 	  at a time.  Simplified function first_phase() by avoiding useless
 	  matrix copies.
 
-2005-09-27 Tuesday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-27 Tuesday 20:50  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am (1.34), numberinput1.cc (1.1): Add
 	  numberinput1, a start at testing number input.
 
-2005-09-27 Tuesday 20:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-27 Tuesday 20:43  Matthew Mundell
 
 	* src/checked.cc (1.8): Really revert to revision 1.4.
 
@@ -13863,16 +49784,16 @@
 	* src/: BHRZ03_Certificate.cc (1.9), H79_Certificate.cc (1.8): A
 	  few FIXME's have been (properly) renamed into TODO's.
 
-2005-09-26 Monday 15:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-26 Monday 15:54  Matthew Mundell
 
 	* tests/Polyhedron/matrix1.cc (1.4): Correct spelling.
 
-2005-09-26 Monday 15:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-26 Monday 15:27  Matthew Mundell
 
 	* src/checked.defs.hh (1.24): Indent arguments to function
 	  declaration macros consistently.
 
-2005-09-26 Monday 15:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-26 Monday 15:24  Matthew Mundell
 
 	* tests/Polyhedron/linsysasciidumpload1.cc (1.2): Moved to
 	  linearsystem1.cc.
@@ -13881,13 +49802,13 @@
 
 	* tests/Polyhedron/matrix1.cc (1.3): Avoid unnecessary inclusions.
 
-2005-09-26 Monday 13:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-26 Monday 13:44  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am (1.33), linearsystem1.cc (1.1):
 	  Move linsysasciidumpload1 to linearsystem1.  Match linearsystem1
 	  to matrix1.
 
-2005-09-26 Monday 12:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-26 Monday 12:10  Matthew Mundell
 
 	* src/checked.cc (1.7): Revert to revision 1.4.
 
@@ -14018,7 +49939,7 @@
 	  Watchdog/utils/build_header.in (1.2), utils/Makefile.am (1.9),
 	  utils/build_header.in (1.2): Generation of utility scripts fixed.
 
-2005-09-23 Friday 16:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-23 Friday 16:51  Matthew Mundell
 
 	* utils/Makefile.am (1.8): Add bin_SCRIPT.  Set bin_SCRIPT to
 	  build_header, text2cxxarray and a phony target which sets the
@@ -14085,39 +50006,39 @@
 	* configure.ac (1.181): `sys/time.h' was listed twice in the
 	  argument of AC_CHECK_HEADERS.  Check also for `time.h'.
 
-2005-09-22 Thursday 18:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 18:08  Matthew Mundell
 
 	* src/Polyhedron.defs.hh (1.283): Correct grammar.
 
-2005-09-22 Thursday 17:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 17:30  Matthew Mundell
 
 	* src/checked_numeric_limits.hh (1.5): Specialize numeric_limits
 	  for int and all unsigned integer native types.
 
-2005-09-22 Thursday 15:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 15:51  Matthew Mundell
 
 	* src/Grid_public.cc (grids.68): Automatically initialise con_sys
 	  and gen_sys in Grid(n,k).
 
-2005-09-22 Thursday 15:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 15:28  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am (1.30), linsysasciidumpload1.cc
 	  (1.1): Add linsysasciidumpload1, which tests Linear_System ASCII
 	  loading.
 
-2005-09-22 Thursday 15:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 15:21  Matthew Mundell
 
 	* src/: Linear_Row.cc (1.13), Linear_Row.defs.hh (1.12),
 	  Linear_System.cc (1.26): Add methods Linear_Row::ascii_load and
 	  Linear_Row::Flags::ascii_load.  Complete
 	  Linear_System::ascii_load.
 
-2005-09-22 Thursday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 14:07  Matthew Mundell
 
 	* tests/Polyhedron/matasciidumpload1.cc (1.3): Correct the
 	  numeric_limits instantiation.  Only allow valid modulation.
 
-2005-09-22 Thursday 13:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-22 Thursday 13:09  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am (1.29), matasciidumpload1.cc
 	  (1.2): In matasciidumpload1 limit the size of the random values
@@ -14150,12 +50071,12 @@
 	  of member templates have been moved into file
 	  Polyhedra_Powerset.cc.
 
-2005-09-21 Wednesday 17:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 17:05  Matthew Mundell
 
 	* src/Linear_System.cc (1.25): Indent consistently in ascii_load.
 	  Correct typo, grammar and formatting in three comments.
 
-2005-09-21 Wednesday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 16:56  Matthew Mundell
 
 	* src/: Congruence_System.defs.hh, Linear_System.cc,
 	  Congruence_System.cc (grids.[15,2,24]): Take out
@@ -14231,7 +50152,7 @@
 	  failure when list is not nil terminated removed.  Some tests in
 	  pl_check.pl reordered.
 
-2005-09-21 Wednesday 16:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 16:18  Matthew Mundell
 
 	* src/Generator_System.cc (1.10): In
 	  adjust_topology_and_space_dimension pass to add_zero_columns the
@@ -14254,28 +50175,28 @@
 	* configure.ac (1.180), tests/Makefile.am (1.245): Previous change
 	  reverted.
 
-2005-09-21 Wednesday 12:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 12:56  Matthew Mundell
 
 	* src/Generator_System.cc (1.9): Align argument indentation of
 	  affine_image.
 
-2005-09-21 Wednesday 12:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 12:49  Matthew Mundell
 
 	* configure.ac (1.179): Add tests/Matrix/Makefile to
 	  AC_CONFIG_FILES.
 
-2005-09-21 Wednesday 12:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 12:49  Matthew Mundell
 
 	* tests/Makefile.am (1.244): Add Matrix to SUBDIRS.
 
-2005-09-21 Wednesday 12:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 12:44  Matthew Mundell
 
 	* src/: Matrix.cc (1.85), Row.cc (1.90), Row.defs.hh (1.98):
 	  Complete Matrix::ascii_load.	Restore the stream attributes at
 	  the end of Row::ascii_dump.  Add ascii_load methods to Row::Flags
 	  and Row.
 
-2005-09-21 Wednesday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-21 Wednesday 12:37  Matthew Mundell
 
 	* src/Constraint_System.cc (1.10): In method num_inequalities use
 	  dimension_type instead of int for temporary n.
@@ -14291,31 +50212,31 @@
 	* TODO (1.150): SWI 5.4.7 automatically initializes the library.
 	  So todo item for this removed.
 
-2005-09-20 Tuesday 19:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 19:39  Matthew Mundell
 
 	* configure.ac (1.178): Indent all lines with spaces in
 	  AC_CONFIG_FILES.
 
-2005-09-20 Tuesday 19:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 19:29  Matthew Mundell
 
 	* src/checked.inlines.hh (grids.4): Take a redundant assignment out
 	  of gcdext_generic.
 
-2005-09-20 Tuesday 19:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 19:29  Matthew Mundell
 
 	* src/Native_Integer.inlines.hh (grids.3): Take a redundant
 	  assignment out of gcdext.
 
-2005-09-20 Tuesday 19:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 19:28  Matthew Mundell
 
 	* src/Grid_public.cc (grids.67): Improve temporary comment.
 
-2005-09-20 Tuesday 19:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 19:27  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, boundingbox1.cc (grids.[34,1]): Add
 	  boundingbox1, which tests Grid(Box& box).
 
-2005-09-20 Tuesday 19:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 19:26  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[47,20]): Add template
 	  Grid(box, dummy).  Improve method descriptions.
@@ -14349,7 +50270,7 @@
 	* src/Row.cc (1.89): Use the ternary version of gcd_assign() so as
 	  to gain on checked numbers.
 
-2005-09-20 Tuesday 11:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-20 Tuesday 11:00  Matthew Mundell
 
 	* src/checked.cc (1.6): In parse_number1 move the maximum remainder
 	  calculation into a variable.
@@ -14429,57 +50350,57 @@
 	  total_memory_in_bytes() and external_memory_in_bytes() properly
 	  implemented for checked numbers.
 
-2005-09-19 Monday 19:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 19:07  Matthew Mundell
 
 	* src/BD_Shape.defs.hh (1.30): Correct grammar in notes.
 
-2005-09-19 Monday 19:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 19:06  Matthew Mundell
 
 	* src/BD_Shape.defs.hh (1.29): Clip trailing whitespace.
 
-2005-09-19 Monday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 18:55  Matthew Mundell
 
 	* src/checked.cc (1.5): In parse_number1 parse the exponent in the
 	  FRACTIONAL case.
 
-2005-09-19 Monday 17:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:11  Matthew Mundell
 
 	* tests/Polyhedron/affineimage6.cc (1.6): Neaten expression
 	  formatting.
 
-2005-09-19 Monday 17:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:11  Matthew Mundell
 
 	* tests/Polyhedron/addspacedims3.cc (1.6): Correct argument in
 	  print_generators message.
 
-2005-09-19 Monday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:10  Matthew Mundell
 
 	* tests/Polyhedron/Makefile.am (1.27): Indent all lines in
 	  ORIGINAL_TESTS and DERIVED_TESTS with tabs.
 
-2005-09-19 Monday 17:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:06  Matthew Mundell
 
 	* tests/BD_Shape/Makefile.am (1.15): Clip trailing whitespace.
 
-2005-09-19 Monday 17:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:04  Matthew Mundell
 
 	* src/checked.cc (1.4): Use `true' to evaluate true.  Clip trailing
 	  whitespace.
 
-2005-09-19 Monday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:03  Matthew Mundell
 
 	* src/Polyhedron_widenings.cc (1.47): Correct variable names in
 	  H79_widening_assign comments.
 
-2005-09-19 Monday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 17:00  Matthew Mundell
 
 	* src/Polyhedron.defs.hh (1.281): Markup parameter in description.
 
-2005-09-19 Monday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 16:56  Matthew Mundell
 
 	* src/Linear_System.defs.hh (1.16): Reformat comment.
 
-2005-09-19 Monday 16:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 16:43  Matthew Mundell
 
 	* configure.ac (1.177): Cater for the Debian dpkg version of
 	  md5sum.
@@ -14506,7 +50427,7 @@
 
 	* src/Saturation_Row.inlines.hh (1.7): Include <cassert>.
 
-2005-09-19 Monday 10:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-19 Monday 10:00  Matthew Mundell
 
 	* src/Native_Integer.inlines.hh (1.12): In template gcd take the
 	  absolute value of the resulting gcd instead of initially taking
@@ -14575,14 +50496,14 @@
 	* src/Polyhedron_chdims.cc (1.31): Three FIXMEs investigated and
 	  removed.
 
-2005-09-18 Sunday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-18 Sunday 20:00  Matthew Mundell
 
 	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
 	  (grids.[3,3]): Add macros FUNC4, DEF_ASSIGN_FUN5_4 and
 	  DEF_ASSIGN_FUN5_5.  Add function assign_gcdext and the
 	  gcdext_assign user interface functions.
 
-2005-09-18 Sunday 19:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-18 Sunday 19:55  Matthew Mundell
 
 	* src/: checked.defs.hh, checked.inlines.hh, checked_ext.defs.hh,
 	  checked_ext.inlines.hh, checked_float.inlines.hh,
@@ -14593,16 +50514,16 @@
 	  floats.  Add wrapper gcdext_ext.  Add and specialize wrapper
 	  gcdext_mpz.
 
-2005-09-18 Sunday 19:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-18 Sunday 19:40  Matthew Mundell
 
 	* tests/Grid/addcongruence1.cc (grids.5): Only call find_variation
 	  on the grid under test.
 
-2005-09-18 Sunday 19:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-18 Sunday 19:39  Matthew Mundell
 
 	* tests/print.cc (grids.4): Include Congruence_System definitions.
 
-2005-09-18 Sunday 19:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-18 Sunday 19:38  Matthew Mundell
 
 	* src/: Native_Integer.defs.hh, Native_Integer.inlines.hh
 	  (grids.[2,2]): Add gcdext_assign methods.  "Use" the parameter in
@@ -14701,109 +50622,109 @@
 	* src/checked.inlines.hh (1.22): Faster and more precise
 	  implementation of gcd.
 
-2005-09-13 Tuesday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 19:21  Matthew Mundell
 
 	* tests/Polyhedron/Makefile.am (grids.7): Add derived tests for the
 	  congruence adding tests.
 
-2005-09-13 Tuesday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 19:21  Matthew Mundell
 
 	* tests/Polyhedron/addcongruence2.cc (grids.2): Use C_Polyhedron
 	  instead of NNC_Polyhedron.
 
-2005-09-13 Tuesday 18:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 18:57  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am, congruences1.cc (grids.[6,1]):
 	  Add test congruences1 and derived test nnc_congruences1, which
 	  test the polyhedra congruence constructors.
 
-2005-09-13 Tuesday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 18:55  Matthew Mundell
 
 	* src/: C_Polyhedron.cc, C_Polyhedron.defs.hh, NNC_Polyhedron.cc,
 	  NNC_Polyhedron.defs.hh (grids.[3,3,3,3]): Add C_Polyhedron(const
 	  cgs), C_Polyhedron(cgs), NNC_Polyhedron(const cgs) and
 	  NNC_Polyhedron(cgs).
 
-2005-09-13 Tuesday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 17:43  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am, addcongruences1.cc,
 	  addcongruences2.cc, addcongruences3.cc, addcongruences4.cc,
 	  addcongruences5.cc (grids.[5,1,1,1,1,1]): Add addcongruences1-5.
 
-2005-09-13 Tuesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 17:41  Matthew Mundell
 
 	* tests/: print.cc, print.hh (grids.[3,6]): Add
 	  print_constraints(cgs).
 
-2005-09-13 Tuesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 17:41  Matthew Mundell
 
 	* src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
 	  Polyhedron_public.cc (grids.[6,4,4]): Add
 	  throw_dimension_incompatible(m, cgs_name, cgs) and
 	  add_congruences(cgs).
 
-2005-09-13 Tuesday 17:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 17:39  Matthew Mundell
 
 	* src/Grid_public.cc (grids.66): In add_constraints(cs) only add
 	  cgs to the grid if congruences have been inserted into cgs.
 
-2005-09-13 Tuesday 17:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 17:37  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.46): Correct two descriptions.
 
-2005-09-13 Tuesday 15:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:56  Matthew Mundell
 
 	* tests/Polyhedron/: Makefile.am, addcongruence1.cc,
 	  addcongruence2.cc, addcongruence3.cc, addcongruence4.cc,
 	  addcongruence5.cc (grids.[4,1,1,1,1,1]): Add addcongruence1-5.
 
-2005-09-13 Tuesday 15:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:54  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.33): List related tests in TESTS on
 	  single lines.
 
-2005-09-13 Tuesday 15:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:52  Matthew Mundell
 
 	* src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
 	  Polyhedron_public.cc (grids.[5,3,3]): Add
 	  throw_dimension_incompatible(method, cg_name, cg) and
 	  add_congruence(cg).
 
-2005-09-13 Tuesday 15:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:51  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.20): Declare Polyhedron a friend.
 
-2005-09-13 Tuesday 15:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:46  Matthew Mundell
 
 	* src/: Constraint.cc, Constraint.defs.hh (grids.[3,4]): Add
 	  ascii_dump(s).
 
-2005-09-13 Tuesday 15:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:44  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.inlines.hh (grids.[11,15]): Make
 	  Congruence(c) a real function (was inline).
 
-2005-09-13 Tuesday 15:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:43  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.45): Use \brief on a line of its own.
 	  Prefer //! to \brief for single line comments.
 
-2005-09-13 Tuesday 15:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-13 Tuesday 15:41  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.5): Add test7 (adds an NNC
 	  constraint).
 
-2005-09-12 Monday 16:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-12 Monday 16:17  Matthew Mundell
 
 	* STANDARDS (1.23): Add coding standard entries for negation and
 	  comparison to zero.
 
-2005-09-12 Monday 14:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-12 Monday 14:29  Matthew Mundell
 
 	* tests/Grid/certificate1.cc (grids.3): Correct an error message in
 	  test3.  Add test6, which uses zero dimension universes.
 
-2005-09-12 Monday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-12 Monday 14:28  Matthew Mundell
 
 	* src/Grid_Certificate.cc (grids.3): In Grid_Certificate(cgr)
 	  handle the zero dimension universe specially, and improve three
@@ -14914,7 +50835,7 @@
 	  interfaces/Prolog/YAP/Makefile.am (1.39): Allow to selectively
 	  enable the construction of the Prolog interfaces.
 
-2005-09-07 Wednesday 23:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-07 Wednesday 23:37  Matthew Mundell
 
 	* src/Grid_Certificate.cc (grids.2): In Grid_Certificate(cgr) call
 	  simplify outside the points assertion.
@@ -14930,36 +50851,36 @@
 	* configure.ac (1.172): Started implementing the new
 	  `--enable-interfaces' option.
 
-2005-09-06 Tuesday 16:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 16:24  Matthew Mundell
 
 	* tests/Grid/widening1.cc (grids.5): Add test15, to show problems
 	  with using the Halbwachs method.
 
-2005-09-06 Tuesday 16:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 16:23  Matthew Mundell
 
 	* src/Grid_widenings.cc (grids.4): Add space between sentences.
 
-2005-09-06 Tuesday 15:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 15:27  Matthew Mundell
 
 	* tests/Grid/certificate1.cc (grids.2): Use compare(gr) or struct
 	  Compare::operator() instead of compare(grc) in some of the
 	  comparison tests.  Also test is_stabilising in some of the tests.
 
-2005-09-06 Tuesday 15:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 15:00  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, certificate1.cc (grids.[32,1]): Add
 	  certificate1, which tests class Grid_Certificate.
 
-2005-09-06 Tuesday 13:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 13:19  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, contains2.cc (grids.[31,1]): Add
 	  contains2, which tests strictly_contains.
 
-2005-09-06 Tuesday 13:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 13:19  Matthew Mundell
 
 	* tests/Grid/contains1.cc (grids.2): Improve failure messages.
 
-2005-09-06 Tuesday 13:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-06 Tuesday 13:07  Matthew Mundell
 
 	* tests/Grid/bhz03widening1.cc (grids.2): Describe test1.  Add
 	  test2, where the widening falls back to joining the grids.
@@ -14972,34 +50893,34 @@
 	  function is now parametric on its second argument too (i.e., the
 	  limiting cs).
 
-2005-09-05 Monday 22:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 22:51  Matthew Mundell
 
 	* tests/Grid/congruence1.cc (grids.6): Add colons to messages.
 
-2005-09-05 Monday 22:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 22:50  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, bhz03widening1.cc (grids.[30,1]): Add
 	  an initial bhz03widening1.
 
-2005-09-05 Monday 22:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 22:49  Matthew Mundell
 
 	* src/: Polyhedra_Powerset.inlines.hh, Polyhedron.defs.hh,
 	  Polyhedron.inlines.hh (grids.[4,4,4]): Add method
 	  Polyhedron::difference_assign, and use it in
 	  BHZ03_widening_assign (shadowing the trunk).
 
-2005-09-05 Monday 22:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 22:37  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.32): Shorten two comments.
 
-2005-09-05 Monday 22:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 22:37  Matthew Mundell
 
 	* src/: Congruence_System.defs.hh, Generator_System.defs.hh,
 	  Grid.defs.hh, Grid.inlines.hh (grids.[14,5,44,19]): Befriend
 	  Grid_Certificate where necessary.  Enable
 	  Grid::strictly_contains.  Add difference_assign.
 
-2005-09-05 Monday 22:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 22:34  Matthew Mundell
 
 	* src/: Grid_Certificate.cc, Grid_Certificate.defs.hh,
 	  Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
@@ -15012,13 +50933,13 @@
 	  difference_assign(), which is now used in the widening on
 	  powersets.
 
-2005-09-05 Monday 11:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 11:15  Matthew Mundell
 
 	* src/Grid_public.cc (grids.65): In relation_with(cg) use the
 	  scalar_product_assign that expects cg to be at most the size of
 	  the generator.
 
-2005-09-05 Monday 11:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-05 Monday 11:13  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh (grids.[10,19]): Add
 	  scalar_product_assign(Coefficient&, const Congruence&, const
@@ -15041,40 +50962,40 @@
 
 	* src/conversion.cc (1.70): FIXME dealt with.
 
-2005-09-04 Sunday 21:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 21:05  Matthew Mundell
 
 	* tests/Grid/: join1.cc, join2.cc (grids.[8,4]): Use common
 	  Variables for all the tests.	Only call find_variation for the
 	  grid under test.
 
-2005-09-04 Sunday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 21:04  Matthew Mundell
 
 	* tests/Grid/generalizedaffinepreimage1.cc (grids.4): Correct the
 	  known grids in test3, test4 and test5.
 
-2005-09-04 Sunday 21:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 21:03  Matthew Mundell
 
 	* tests/Grid/affinepreimage1.cc (grids.4): Note which second grid
 	  is under test in failure messages.  Correct the known grid and
 	  given variable in test13.
 
-2005-09-04 Sunday 20:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 20:58  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.4): Comment the end of the
 	  namespace block.
 
-2005-09-04 Sunday 20:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 20:57  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, contains1.cc, join3.cc
 	  (grids.[29,1,1]): Add contains1, including a test for the
 	  is_included_in error found via CHINA.  Add join3, which tests
 	  join_assign_if_exact.
 
-2005-09-04 Sunday 20:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 20:52  Matthew Mundell
 
 	* src/Grid_public.cc (grids.64): Implement join_assign_if_exact.
 
-2005-09-04 Sunday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-04 Sunday 19:35  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.31): In is_included_in check that
 	  all generators (including the first one) satisfy the congruences.
@@ -15146,24 +51067,24 @@
 	  element().poly_hull_assign(): refer to
 	  element().upper_bound_assign() instead.
 
-2005-09-03 Saturday 12:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 12:47  Matthew Mundell
 
 	* src/: Congruence_System.inlines.hh, Grid_Status.cc,
 	  Grid_conversion.cc, Grid_nonpublic.cc (grids.[6,3,19,30]): Update
 	  FSF address.
 
-2005-09-03 Saturday 12:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 12:46  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
 	  (grids.[43,18,63]): Add methods upper_bound_assign,
 	  join_assign_if_exact and upper_bound_assign_if_exact.
 
-2005-09-03 Saturday 12:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 12:44  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.7): Use upper_bound_assign in some of
 	  the tests.
 
-2005-09-03 Saturday 12:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 12:44  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.3): Update FSF address.
 
@@ -15197,7 +51118,7 @@
 	  PH::upper_bound_assign_if_exact() method and not the function
 	  with the same name.
 
-2005-09-03 Saturday 12:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 12:07  Matthew Mundell
 
 	* tests/Grid/: addcongruence1.cc, addgenerator1.cc,
 	  addspacedims1.cc, addspacedims2.cc, affineimage1.cc,
@@ -15230,7 +51151,7 @@
 
 	* src/Polyhedron.defs.hh (1.277): Long source line avoided.
 
-2005-09-03 Saturday 11:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 11:53  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
 	  Congruence_System.cc, Congruence_System.defs.hh, Grid.defs.hh,
@@ -15245,12 +51166,12 @@
 	* tests/Polyhedron/: max_min1.cc (1.5), max_min2.cc (1.5): Adapted
 	  so as to use the new interfaces for maximize() and minimize().
 
-2005-09-03 Saturday 11:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 11:18  Matthew Mundell
 
 	* tests/Grid/writecongruencesystem.cc (grids.4): Use a single equal
 	  sign in the expected output string.
 
-2005-09-03 Saturday 11:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 11:17  Matthew Mundell
 
 	* tests/Grid/: addcongruence1.cc, addgenerator1.cc,
 	  affineimage1.cc, affinepreimage1.cc, expandspacedim1.cc,
@@ -15275,7 +51196,7 @@
 	* src/Polyhedra_Powerset.defs.hh (1.17): New typedef `element_type'
 	  corresponding to the type of the underlying numeric domain.
 
-2005-09-03 Saturday 10:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 10:53  Matthew Mundell
 
 	* tests/Grid/addconstraints1.cc (grids.2): Dump grids on error.
 	  Test Grid(ccs).  Add tests where the resulting grid is empty.
@@ -15296,7 +51217,7 @@
 	  bds_hull_assign*.  New method void upper_bound_assign(const
 	  BD_Shape<T>& y) is the same as bds_hull_assign(y).
 
-2005-09-03 Saturday 10:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-03 Saturday 10:51  Matthew Mundell
 
 	* src/Grid_public.cc (grids.61): In Grid(ccs) ensure that the grid
 	  is the same dimension as ccs.
@@ -15351,17 +51272,17 @@
 	  global DEGENERATE_ELEMENT enum instead of the local
 	  DEGENERATE_KIND.
 
-2005-09-02 Friday 19:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 19:15  Matthew Mundell
 
 	* src/Congruence.inlines.hh (grids.12): Compute the row capacity in
 	  Congruence(c).
 
-2005-09-02 Friday 18:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 18:54  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, addconstraints1.cc (grids.[27,1]): Add
 	  addconstraints1.
 
-2005-09-02 Friday 18:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 18:53  Matthew Mundell
 
 	* src/Congruence.inlines.hh (grids.11): Account for the extra
 	  element in NNC constraints in Congruence(c).
@@ -15901,7 +51822,7 @@
 	  (grids.[1,2,2,2,1,3,2,2,1,2,1,2,3,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,2,2,1,2,1,7,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,2,4,1,1,1,1,1,2,2,1,1,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,2,2,1,1,1,1,1,2,2,1,1,1,2,3,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,2,2,3,2,3,6,3,12,4,1,1,1,1,2,2,1,2,2,1,1,2,4,2,4,4,3,1,1,1,6,2,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,1,2,1,2, [...]
 	  Second merge from main trunk.
 
-2005-09-02 Friday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 17:00  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.16): Take reference to pending rows
 	  out of comment.
@@ -15910,30 +51831,30 @@
 
 	* utils/timings.cc (1.5): Fixed print_clock().
 
-2005-09-02 Friday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 17:00  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
 	  (grids.[40,29,59]): Add add_constraint, add_constraints and
 	  Grid(cs). Add throw_dimension_incompatible methods for
 	  Constraints and Constraint_Systems.
 
-2005-09-02 Friday 11:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 11:42  Matthew Mundell
 
 	* src/Congruence.inlines.hh (grids.10): Check for all cases of
 	  trivially true congruences.
 
-2005-09-02 Friday 11:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 11:41  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence_System.cc (grids.[16,22]):
 	  Strong normalize congruences before outputting them from the
 	  congruence system.
 
-2005-09-02 Friday 11:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 11:39  Matthew Mundell
 
 	* src/Congruence.cc (grids.8): In the output operator only output
 	  the modulus for proper congruences, and use `=' instead of `=='.
 
-2005-09-02 Friday 10:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-02 Friday 10:53  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.21): Use `while (true)' instead
 	  of `while (1)'.
@@ -15954,62 +51875,62 @@
 	  constraint system, if we add back an epsilon upper bound
 	  constraint we should reset the minimization flag.
 
-2005-09-01 Thursday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 18:31  Matthew Mundell
 
 	* src/Grid_public.cc (grids.57): In generalized_affine_preimage
 	  improve a variable name and skip the normalization check when
 	  inserting the lines.
 
-2005-09-01 Thursday 18:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 18:18  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.28): Set gen_sys's sortedness false
 	  after clearing gen_sys.  Correct a comment.
 
-2005-09-01 Thursday 18:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 18:17  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.15): In map_space_dimensions clear
 	  minimized flags after permuting columns, and skip the
 	  normalization check when inserting generators.
 
-2005-09-01 Thursday 17:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 17:17  Matthew Mundell
 
 	* src/Grid_public.cc (grids.56): In the copy constructor set
 	  gen_sys's sortedness to false when given grid's generators are
 	  out of date.	In OK correct a comment and a message and test that
 	  gen_sys's sortedness is false.
 
-2005-09-01 Thursday 17:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 17:15  Matthew Mundell
 
 	* src/: Grid.inlines.hh, Grid_chdims.cc, Grid_simplify.cc
 	  (grids.[14,16,29]): Set gen_sys's sortedness to false after
 	  clearing gen_sys.  Take extra set_sorted calls out of the
 	  generator simplify method.
 
-2005-09-01 Thursday 15:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 15:54  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.13): Set sortedness of the temporary
 	  generators system in map_space_dimensions to false.
 
-2005-09-01 Thursday 15:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 15:34  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.27): Take tracing out of
 	  is_included_in.
 
-2005-09-01 Thursday 15:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 15:29  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.20): Take tracing out of
 	  satisfies_all_congruences.
 
-2005-09-01 Thursday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 15:23  Matthew Mundell
 
 	* src/: Grid_nonpublic.cc, Grid_public.cc (grids.[26,55]): Always
 	  and only set sorted to false when adding new generators.
 
-2005-09-01 Thursday 15:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 15:21  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.15): Use correct domain in comment.
 
-2005-09-01 Thursday 15:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-01 Thursday 15:20  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.39): Take out old Polyhedra comments.
 
@@ -16033,30 +51954,30 @@
 	* install-sh (1.15), ltmain.sh (1.26), Watchdog/install-sh (1.12),
 	  Watchdog/ltmain.sh (1.15): Updated from Libtool 1.5.20.
 
-2005-08-31 Wednesday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-31 Wednesday 18:09  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.38): Mark up parameter description
 	  correctly.
 
-2005-08-31 Wednesday 18:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-31 Wednesday 18:08  Matthew Mundell
 
 	* doc/definitions.dox (grids.6): Correct spelling of anchor.
 
-2005-08-31 Wednesday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-31 Wednesday 17:19  Matthew Mundell
 
 	* doc/definitions.dox (grids.5): Clip trailing whitespace.
 
-2005-08-31 Wednesday 17:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-31 Wednesday 17:04  Matthew Mundell
 
 	* src/Makefile.am (grids.5): Add grid_widenings.cc to
 	  libppl_la_SOURCES.
 
-2005-08-31 Wednesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-31 Wednesday 17:03  Matthew Mundell
 
 	* tests/Grid/bug1.dat, src/Grid_public.cc (grids.[3,54]): Enable
 	  dumping and loading of the entire status.
 
-2005-08-31 Wednesday 16:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-31 Wednesday 16:58  Matthew Mundell
 
 	* src/Grid_Status.cc (grids.2): Append a newline to the ASCII dump.
 	  ASCII dump on failure of the empty flag check in the OK method.
@@ -16234,54 +52155,54 @@
 	  src/Makefile.am (1.116), tests/BD_Shape/maxspacedim.cc (1.6):
 	  Obsolete classes E_NIT and E_Rational removed.
 
-2005-08-25 Thursday 18:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-25 Thursday 18:37  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, limitedextrapolation1.cc
 	  (grids.[26,1]): Add limitedextrapolation1.
 
-2005-08-25 Thursday 18:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-25 Thursday 18:36  Matthew Mundell
 
 	* tests/Grid/widening1.cc (grids.2): Add congruences to the correct
 	  grid in test5.  Improve a comment.  Use a definition for the
 	  token count in test10.  Take out the old test invocations.
 
-2005-08-25 Thursday 18:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-25 Thursday 18:30  Matthew Mundell
 
 	* tests/Grid/relations2.cc (grids.3): Add test9, in which a grid
 	  with a line strictly intersects a relational congruence.
 
-2005-08-25 Thursday 18:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-25 Thursday 18:19  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_widenings.cc (grids.[37,2]): Add method
 	  limited_extrapolation_assign.  Improve the description of
 	  dim_kinds.  Rename the congruence parameter in the relation_with
 	  declaration to cg.
 
-2005-08-25 Thursday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-25 Thursday 18:09  Matthew Mundell
 
 	* src/Grid_public.cc (grids.53): In relation_with(cg) only modulate
 	  the scalar product for points and parameters.
 
-2005-08-25 Thursday 18:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-25 Thursday 18:06  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.12): Swap dim_kinds in method swap.
 
-2005-08-23 Tuesday 22:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-23 Tuesday 22:07  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, widening1.cc (grids.[25,1]): Add
 	  widening1.
 
-2005-08-23 Tuesday 22:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-23 Tuesday 22:06  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_widenings.cc (grids.[36,1]): Add methods
 	  widening_assign and select_wider_congruences.
 
-2005-08-23 Tuesday 11:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-23 Tuesday 11:22  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Grid_conversion.cc, Grid_simplify.cc
 	  (grids.[15,18,28]): Prefer postfix operators.
 
-2005-08-22 Monday 12:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-22 Monday 12:18  Matthew Mundell
 
 	* src/Grid_public.cc (grids.52): In OK check dim_kinds size before
 	  checking upper triangularity.
@@ -16978,49 +52899,49 @@
 	* utils/text2cxxarray (1.1): Convert an ASCII text into the
 	  declaration of a C++ array.
 
-2005-08-18 Thursday 20:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 20:49  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, timeelapse1.cc (grids.[24,1]): Add
 	  timeelapse1.
 
-2005-08-18 Thursday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 20:45  Matthew Mundell
 
 	* src/Grid_public.cc (grids.51): Enable method time_elapse_assign.
 
-2005-08-18 Thursday 20:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 20:44  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.25): Improve temporary comment.
 
-2005-08-18 Thursday 15:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 15:34  Matthew Mundell
 
 	* src/Grid_public.cc (grids.50): Check for points before adding
 	  lines in generalized_affine_image(lhs,rhs,m).
 
-2005-08-18 Thursday 15:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 15:24  Matthew Mundell
 
 	* tests/Grid/griddifference1.cc (grids.3): Add test11, in which
 	  many 2-complements are added to the result.
 
-2005-08-18 Thursday 12:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 12:59  Matthew Mundell
 
 	* tests/Grid/griddifference1.cc (grids.2): Add test10.
 
-2005-08-18 Thursday 12:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 12:21  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, generalizedaffinepreimage1.cc,
 	  generalizedaffinepreimage2.cc (grids.[23,1,1]): Add partial tests
 	  generalizedaffinepreimage1 and generalizedaffinepreimage2.
 
-2005-08-18 Thursday 12:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 12:18  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_public.cc (grids.[35,49]): Add the
 	  generalized_affine_preimage methods.
 
-2005-08-18 Thursday 12:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 12:16  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.19): Add a comment.
 
-2005-08-18 Thursday 12:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-18 Thursday 12:15  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.14): Declare Linear_Expression a
 	  friend.
@@ -17082,24 +53003,24 @@
 	* doc/definitions.dox (1.173): Had another try at explaining the
 	  shorthand notation for affine relations.
 
-2005-08-16 Tuesday 11:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-16 Tuesday 11:44  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, griddifference1.cc (grids.[22,1]): Add
 	  griddifference1.
 
-2005-08-16 Tuesday 11:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-16 Tuesday 11:43  Matthew Mundell
 
 	* tests/: ppl_test.hh, print.hh (grids.[10,4]): Move dump_grids to
 	  print.hh.  Abort if the comparison in find_variation_template
 	  fails.
 
-2005-08-16 Tuesday 11:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-16 Tuesday 11:41  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
 	  (grids.[34,24,48]): Enable grid_difference_assign.  Add and
 	  improve a few comments.  Take out some old Polyhedron code.
 
-2005-08-16 Tuesday 11:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-16 Tuesday 11:39  Matthew Mundell
 
 	* src/: Linear_Expression.cc, Linear_Expression.defs.hh
 	  (grids.[1,3]): Add constructor Linear_Expression(cg).
@@ -17157,27 +53078,27 @@
 	  description of affine transfer relations so as to also allow for
 	  preimages of (bounded or generalized) affine relations.
 
-2005-08-12 Friday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-12 Friday 16:55  Matthew Mundell
 
 	* tests/Grid/generalizedaffineimage2.cc (grids.2): Add test22.
 
-2005-08-11 Thursday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-11 Thursday 17:29  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, generalizedaffineimage2.cc
 	  (grids.[21,1]): Add generalizedaffineimage2.
 
-2005-08-11 Thursday 17:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-11 Thursday 17:27  Matthew Mundell
 
 	* tests/Grid/intersection2.cc (grids.3): Always call
 	  intersection_assign_and_minimize.  Only call find_variation after
 	  the operation.
 
-2005-08-11 Thursday 17:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-11 Thursday 17:21  Matthew Mundell
 
 	* tests/Grid/intersection1.cc (grids.2): In test8 leave
 	  minimization to intersection_assign.
 
-2005-08-11 Thursday 17:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-11 Thursday 17:20  Matthew Mundell
 
 	* src/Grid_public.cc (grids.47): In intersection_assign,
 	  add_recycled_congruences_and_minimize and
@@ -17186,26 +53107,26 @@
 
 	  Enable generalized_affine_image(lhs,rhs,modulus).
 
-2005-08-11 Thursday 17:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-11 Thursday 17:18  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.33): Improve some descriptions.
 
-2005-08-09 Tuesday 16:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-09 Tuesday 16:37  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.7): Correct comment.
 
-2005-08-09 Tuesday 16:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-09 Tuesday 16:36  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.32): Markup parameters in the
 	  construct(gs,convert_rays_to_lines) description.
 
-2005-08-09 Tuesday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-09 Tuesday 16:29  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.6): Add test9, which tests a
 	  minimized grid in which the point contains factors and the
 	  divisor is greater than one.	Dump the grids on failure.
 
-2005-08-09 Tuesday 16:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-09 Tuesday 16:27  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc
 	  (grids.[31,11,23]): Add a convert_rays_to_line parameter to
@@ -17221,69 +53142,69 @@
 	    - skip converting rays to lines when creating the temporary new
 	      grid.
 
-2005-08-08 Monday 20:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-08 Monday 20:01  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, generalizedaffineimage1.cc
 	  (grids.[20,1]): Add generalizedaffineimage1.
 
-2005-08-08 Monday 19:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-08 Monday 19:59  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_public.cc (grids.[30,46]): Declare the
 	  generalized_affine_image methods.  Enable method
 	  generalized_affine_image(var,expr,denom,mod).  Clean some
 	  formatting.  Note where comments mention rays.
 
-2005-08-08 Monday 19:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-08 Monday 19:54  Matthew Mundell
 
 	* src/Generator_System.cc (grids.10): Call
 	  remove_invalid_lines_and_rays when grid is true.
 
-2005-08-03 Wednesday 20:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-03 Wednesday 20:36  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, foldspacedims1.cc (grids.[19,1]): Add
 	  foldspacedims1.
 
-2005-08-03 Wednesday 20:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-03 Wednesday 20:35  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.5): Add test6 and test7, in which the
 	  generators are initially out of date.
 
-2005-08-03 Wednesday 20:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-03 Wednesday 20:33  Matthew Mundell
 
 	* src/: Grid_chdims.cc, Grid_public.cc (grids.[14,45]): Enable
 	  fold_space_dimensions.  Invert the empty tests after updating in
 	  join_assign.
 
-2005-08-02 Tuesday 19:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-02 Tuesday 19:43  Matthew Mundell
 
 	* tests/Grid/affineimage1.cc (grids.2): Format linear expressions
 	  consistently.
 
-2005-08-02 Tuesday 19:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-02 Tuesday 19:42  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, affinepreimage1.cc (grids.[18,1]): Add
 	  affinepreimage1.
 
-2005-08-02 Tuesday 19:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-02 Tuesday 19:41  Matthew Mundell
 
 	* src/Grid_public.cc (grids.44): Enable affine_preimage.
 
-2005-08-01 Monday 18:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-01 Monday 18:32  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, affineimage1.cc (grids.[17,1]): Add
 	  affineimage1.
 
-2005-08-01 Monday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-01 Monday 18:31  Matthew Mundell
 
 	* src/: Linear_Row.cc, Linear_Row.defs.hh (grids.[3,3]): Add method
 	  ascii_dump().
 
-2005-08-01 Monday 18:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-01 Monday 18:30  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.22): In normalize_divisors(sys,
 	  divisor) only set the divisor for points.
 
-2005-08-01 Monday 18:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-08-01 Monday 18:28  Matthew Mundell
 
 	* src/: Congruence_System.cc, Generator.cc, Generator.defs.hh,
 	  Generator_System.cc, Generator_System.defs.hh, Grid_public.cc,
@@ -17305,11 +53226,11 @@
 
 	  Declare Grid and Congruence_System friends of Linear_Expression.
 
-2005-07-27 Wednesday 13:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-27 Wednesday 13:18  Matthew Mundell
 
 	* tests/Grid/relations2.cc (grids.2): Add test4 to test8.
 
-2005-07-27 Wednesday 13:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-27 Wednesday 13:17  Matthew Mundell
 
 	* src/Grid_public.cc (grids.42): Update relation_with(cg) to handle
 	  any grid representation, instead of requiring a minimized
@@ -17329,34 +53250,34 @@
 	  their arguments
 	     the wrong way round.
 
-2005-07-14 Thursday 20:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-14 Thursday 20:53  Matthew Mundell
 
 	* tests/Grid/expandspacedim1.cc (grids.2): Indent the copyright
 	  line.
 
-2005-07-14 Thursday 20:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-14 Thursday 20:52  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, relations1.cc, relations2.cc
 	  (grids.[16,1,1]): Add relations1 and relations2.
 
-2005-07-14 Thursday 20:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-14 Thursday 20:51  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_public.cc
 	  (grids.[29,13,41]): Enable and convert relation_with(cg) and
 	  relation_with(g), adding an optional divisor argument to
 	  relations_with(g).
 
-2005-07-14 Thursday 20:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-14 Thursday 20:47  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[17,12]): Add method insert_verbatim.
 
-2005-07-13 Wednesday 14:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-13 Wednesday 14:58  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, expandspacedim1.cc (grids.[15,1]): Add
 	  expandspacedim1.
 
-2005-07-13 Wednesday 14:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-13 Wednesday 14:56  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.12): Enable and convert
 	  expand_space_dimension.
@@ -17371,14 +53292,14 @@
 	* NEWS (1.156): Announced new method
 	  Polyhedron::bounded_affine_image().
 
-2005-07-12 Tuesday 15:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-12 Tuesday 15:47  Matthew Mundell
 
 	* tests/Grid/: grid1.cc, grid2.cc (grids.[18,14]): Dump grids on
 	  failure.  Only use find_variation for the grid under test.
 	  Insert test9 to test12, test14 and test22, from the revised
 	  Chiara tests.
 
-2005-07-12 Tuesday 15:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-12 Tuesday 15:44  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.9): Add macro dump_grids.
 
@@ -17407,12 +53328,12 @@
 	  interfaces and documented. Added a few tests on its C++ version
 	  (no test added yet for Prolog).
 
-2005-07-12 Tuesday 12:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-12 Tuesday 12:49  Matthew Mundell
 
 	* tests/Grid/: grid1.cc, grid2.cc (grids.[17,13]): Match tests to
 	  revised Chiara algorithm tests.
 
-2005-07-11 Monday 17:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-11 Monday 17:47  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
 	  (grids.[28,16,40]): Replace both add_and_minimize methods with
@@ -17426,44 +53347,44 @@
 	  Watchdog/depcomp (1.8), Watchdog/missing (1.6),
 	  Watchdog/mkinstalldirs (1.5): Updated from Automake 1.9.6.
 
-2005-07-08 Friday 20:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-08 Friday 20:02  Matthew Mundell
 
 	* tests/Grid/: Makefile.am, equals1.cc (grids.[14,1]): Add equals,
 	  which tests operator== and operator!=.
 
-2005-07-08 Friday 19:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-08 Friday 19:58  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.5): Correct test7 expected
 	  result.  Print test name from all tests.
 
-2005-07-08 Friday 19:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-08 Friday 19:57  Matthew Mundell
 
 	* tests/Grid/congruencesystem2.cc (grids.5): Add another line test,
 	  and some temporary comments.
 
-2005-07-08 Friday 19:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-08 Friday 19:56  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.8): Correct test3 expected
 	  result.
 
-2005-07-08 Friday 19:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-08 Friday 19:55  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.16): In satisfies_all_congruences
 	  compare the entire scalar product to zero when the generator is a
 	  line.
 
-2005-07-07 Thursday 16:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-07 Thursday 16:41  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.4): Add test5, which requires divisor
 	  normalisation.  Call join_assign instead of
 	  join_assign_and_minimize in test4.
 
-2005-07-07 Thursday 16:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-07 Thursday 16:39  Matthew Mundell
 
 	* src/Grid_public.cc (grids.39): Match the divisors of the two
 	  generator systems in join_assign.
 
-2005-07-06 Wednesday 20:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-06 Wednesday 20:21  Matthew Mundell
 
 	* tests/Grid/congruencesystem2.cc, tests/Grid/grid1.cc,
 	  tests/Grid/grid2.cc, tests/Grid/removespacedims1.cc,
@@ -17856,6 +53777,12 @@
 	* interfaces/Prolog/tests/: Makefile.am (1.4), check_script2_int8
 	  (1.2), script_clpq2_int8 (1.1): Distribution fixed.
 
+2005-07-03 Sunday 23:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/script_clpq2_int8 (altnum.1): file
+	  script_clpq2_int8 was added on branch altnum on 2006-10-29
+	  19:27:09 +0000
+
 2005-07-03 Sunday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* interfaces/Prolog/YAP/Makefile.am (1.37): Link against libYap.
@@ -17936,6 +53863,29 @@
 	  expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1), script_clpq
 	  (1.1), script_clpq2 (1.1): Use more sensible file names.
 
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_mpz (altnum.1): file
+	  expected_pchk_mpz was added on branch altnum on 2006-10-29
+	  19:27:08 +0000
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_mpz_a (altnum.1): file
+	  expected_pchk_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:08 +0000
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/script_clpq (altnum.1): file script_clpq
+	  was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/script_clpq2 (altnum.1): file
+	  script_clpq2 was added on branch altnum on 2006-10-29 19:27:09
+	  +0000
+
 2005-07-03 Sunday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* configure.ac (1.164): Version number bumped.
@@ -17957,25 +53907,25 @@
 	  (1.12): LDADD reordered so that libraries occur in dependence
 	  order (Cygwin seems to depend on this).
 
-2005-07-01 Friday 17:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-07-01 Friday 17:13  Matthew Mundell
 
 	* src/: Grid_public.cc, Grid.defs.hh, Grid_nonpublic.cc
 	  (grids.[37,26,20]): Add back normalizing of divisors.  Take out
 	  two temporary comments, and add one.	Take some old Polyhedron
 	  code out of add_recycled_generators_and_minimize.
 
-2005-06-30 Thursday 19:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-30 Thursday 19:56  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_conversion.cc, Grid_simplify.cc,
 	  Row.inlines.hh (grids.[25,17,27,1]): Add strong reduction.  Use
 	  negate(x) instead of -x.  Slightly improve some comments.
 
-2005-06-27 Monday 13:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-27 Monday 13:15  Matthew Mundell
 
 	* tests/Grid/: addspacedims2.cc, removespacedims1.cc,
 	  removespacedims2.cc (grids.[4,3,3]): Correct known_gr.
 
-2005-06-27 Monday 13:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-27 Monday 13:12  Matthew Mundell
 
 	* src/: Generator_System.cc, Generator_System.defs.hh,
 	  Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
@@ -18079,16 +54029,16 @@
 	* interfaces/Prolog/Ciao/Makefile.am (1.41): Do not assume `.' is
 	  in the `PATH' environment variable.
 
-2005-06-14 Tuesday 15:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-14 Tuesday 15:22  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.7): Improve comment.
 
-2005-06-14 Tuesday 15:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-14 Tuesday 15:22  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.7): Print ASCII dump of a when loading
 	  it fails.
 
-2005-06-14 Tuesday 15:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-14 Tuesday 15:21  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
 	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
@@ -18178,44 +54128,44 @@
 	* NEWS (1.152), interfaces/C/ppl_c.h.in (1.48): Do not infringe on
 	  system name space as well as on user name space.
 
-2005-06-10 Friday 18:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:33  Matthew Mundell
 
 	* src/Grid_public.cc (grids.34): Improve comment.
 
-2005-06-10 Friday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:31  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.11): Add test14, which adds a
 	  congruence system having a row capacity larger than the row
 	  capacity of the grid's existing congruence system.
 
-2005-06-10 Friday 18:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:30  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.15): Take tracing out of test20.
 
-2005-06-10 Friday 18:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:26  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.13): Move bug1 to TESTS.
 
-2005-06-10 Friday 18:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:21  Matthew Mundell
 
 	* tests/Grid/bug1.cc (grids.2): Add header comment, use nout
 	  instead of cerr.
 
-2005-06-10 Friday 18:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:14  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.14): Improve comment.
 
-2005-06-10 Friday 18:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:05  Matthew Mundell
 
 	* src/Row.defs.hh (grids.3): Declare Congruence_System a friend
 	  when EXTRA_ROW_DEBUG.
 
-2005-06-10 Friday 18:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 18:01  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.24): In reduce_pc_with_pc add GCD
 	  tracing and use the ternary operator instead of !.
 
-2005-06-10 Friday 17:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 17:59  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.14): In generator to congruence
 	  conversion ensure that the resulting moduli and first element of
@@ -18225,12 +54175,12 @@
 
 	* src/checked_int.inlines.hh (1.33): Avoided a warning.
 
-2005-06-10 Friday 11:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 11:16  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.23): In free_row in the congruence
 	  simplify, ensure that all the rows to have the same capacity.
 
-2005-06-10 Friday 11:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-10 Friday 11:13  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[13,9]): Add method add_row.
@@ -18239,27 +54189,27 @@
 
 	* tests/Polyhedron/exceptions3.cc (1.4): Avoid a compiler warning.
 
-2005-06-09 Thursday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-09 Thursday 17:29  Matthew Mundell
 
 	* interfaces/Prolog/SWI/Makefile.am (grids.2): Revert last change.
 
-2005-06-09 Thursday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-09 Thursday 12:12  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_conversion.cc (grids.[22,13]): Move the
 	  grid multiplying code into two inline functions called
 	  multiply_grid.
 
-2005-06-08 Wednesday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-08 Wednesday 17:00  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.13): Add test20, which constructs from
 	  a generator system containing a ray.
 
-2005-06-08 Wednesday 16:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-08 Wednesday 16:59  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.17): In method construct convert
 	  rays to lines.
 
-2005-06-08 Wednesday 16:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-08 Wednesday 16:58  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.9): Use a temporary variable in
 	  add_space_dimensions.
@@ -18275,13 +54225,13 @@
 	  (1.5), removespacedims1.cc (1.4), universe1.cc (1.4): Avoid
 	  unused variable warnings.
 
-2005-06-07 Tuesday 19:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-07 Tuesday 19:36  Matthew Mundell
 
 	* src/Row.defs.hh (grids.2): Only befriend Grid when
 	  EXTRA_ROW_DEBUG.  Take out declaration of operator==(gr,gr) as a
 	  friend.
 
-2005-06-07 Tuesday 18:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-07 Tuesday 18:17  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.21): Include
 	  Constraint_Systems.inlines.hh.
@@ -18301,12 +54251,12 @@
 
 	* src/checked.cc (1.2): Indentation fixed.
 
-2005-06-07 Tuesday 16:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-07 Tuesday 16:28  Matthew Mundell
 
 	* interfaces/Prolog/SWI/Makefile.am (grids.1): Link against pl in
 	  rule ppl_pl$(EXEEXT).
 
-2005-06-07 Tuesday 12:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-07 Tuesday 12:43  Matthew Mundell
 
 	* src/Row.defs.hh (grids.1): Temporarily befriend operator==(gr,gr)
 	  and Grid, and make method capacity public, for tracing.
@@ -18324,35 +54274,35 @@
 
 	* src/checked.inlines.hh (1.19): Include "compiler.hh".
 
-2005-06-01 Wednesday 20:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 20:26  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc,
 	  Grid_public.cc (grids.[20,10,16,33]): Take out method
 	  add_low_level_congruences.
 
-2005-06-01 Wednesday 20:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 20:25  Matthew Mundell
 
 	* src/Generator_System.cc (grids.7): Update comments.  Re-enable
 	  the ascii_load comparison between actual and declared types.
 
-2005-06-01 Wednesday 20:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 20:23  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[12,8]): Update comments.  In OK add a message for the
 	  number of columns check and take out an old test.
 
-2005-06-01 Wednesday 20:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 20:20  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
 	  (grids.[6,12,8]): Update comments.  Add a modulus method that
 	  returns a writable reference.
 
-2005-06-01 Wednesday 18:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 18:12  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.19): Make most of the constructors
 	  explicit.
 
-2005-06-01 Wednesday 17:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 17:07  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
 	  (grids.[18,13,32]): Take out the add_and_minimize\3 methods.
@@ -18360,17 +54310,17 @@
 	  the given rows to the system, instead of looking for duplicates.
 	  Convert rays to lines in all generator-adding methods, for now.
 
-2005-06-01 Wednesday 13:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 13:15  Matthew Mundell
 
 	* src/Grid_public.cc (grids.31): In add_generators add rays as
 	  lines, for now.
 
-2005-06-01 Wednesday 13:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-06-01 Wednesday 13:11  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.3): Add more interesting generators in
 	  test3.  Add test4, in which a ray is inserted.
 
-2005-05-28 Saturday 13:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-28 Saturday 13:17  Matthew Mundell
 
 	* tests/Grid/bug1.dat, src/Generator_System.cc (grids.[2,6]): In
 	  Generator_System::asci_load leave the stream read position at the
@@ -18383,19 +54333,19 @@
 	  be renamed) Grid::add_congruences_and_minimize(const
 	  Constraint_System&).
 
-2005-05-27 Friday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-27 Friday 21:02  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.12): Improve a comment.
 
-2005-05-27 Friday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-27 Friday 21:02  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.10): Revert last change.
 
-2005-05-27 Friday 20:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-27 Friday 20:54  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.9): Improve a comment.
 
-2005-05-27 Friday 20:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-27 Friday 20:53  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_nonpublic.cc,
 	  Grid_public.cc (grids.[17,12,15,30]): Take out methods
@@ -18405,7 +54355,7 @@
 	  the sorted flag in the generator construct method.  Neaten some
 	  formatting.
 
-2005-05-27 Friday 14:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-27 Friday 14:57  Matthew Mundell
 
 	* tests/ppl_test.hh, tests/Grid/addgenerator1.cc,
 	  tests/Grid/addspacedims1.cc, tests/Grid/congruencesystem2.cc,
@@ -18417,27 +54367,27 @@
 	  (grids.[6,6,7,3,3,5,11,5,9,8,12,11,14,29,22]): Use `!' instead of
 	  comparing to `false'.
 
-2005-05-27 Friday 14:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-27 Friday 14:53  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.11): Make zero_dim_false and
 	  zero_dim_integrality public.
 
-2005-05-26 Thursday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 20:50  Matthew Mundell
 
 	* tests/Grid/join2.cc (grids.2): Add test2 which joins with both
 	  grids universe.
 
-2005-05-26 Thursday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 20:50  Matthew Mundell
 
 	* tests/Grid/join1.cc (grids.2): Add test2 and test3 which join
 	  with both and one grids universe.
 
-2005-05-26 Thursday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 20:30  Matthew Mundell
 
 	* src/Grid_public.cc (grids.28): Rename adjust_space_dimension to
 	  increase_space_dimension.
 
-2005-05-26 Thursday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 20:30  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh,
 	  Congruence_System.inlines.hh (grids.[10,7,5]): Rename
@@ -18447,7 +54397,7 @@
 	  saturates_all_congruences.  Make the member access permissions
 	  more sensible.  Enable the definition of zero_dim_empty.
 
-2005-05-26 Thursday 20:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 20:24  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence.inlines.hh,
 	  Grid_conversion.cc, Grid_simplify.cc (grids.[10,7,11,21]): Make
@@ -18455,28 +54405,28 @@
 	  methods private.  In Congruence rename is_congruence to
 	  is_proper_congruence, and add method zero_dim_false.
 
-2005-05-26 Thursday 20:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 20:20  Matthew Mundell
 
 	* tests/Grid/: congruence1.cc, congruencesystem1.cc,
 	  congruencesystem2.cc (grids.[4,5,2]): Wrap the class under test,
 	  instead of requiring all methods to be public.
 
-2005-05-26 Thursday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 17:01  Matthew Mundell
 
 	* tests/Grid/addcongruence1.cc (grids.2): Add test2, which adds to
 	  an empty grid.
 
-2005-05-26 Thursday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 17:01  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.5): Add test7, which adds a
 	  generator to a universe grid.
 
-2005-05-26 Thursday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 17:00  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.20): Improve a variable name, and a
 	  comment.
 
-2005-05-26 Thursday 16:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 16:58  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_public.cc (grids.[16,27]): Restore the
 	  declaration of add_congruence(c), and add a new declaration for
@@ -18485,7 +54435,7 @@
 	  ordering of the public definitions.  Define add_congruence(c) and
 	  add_congruence_and_minimize(c).
 
-2005-05-26 Thursday 16:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 16:52  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh,
 	  Congruence_System.inlines.hh (grids.[9,6,4]): Call num_columns
@@ -18496,28 +54446,28 @@
 	  of ascii_load.  Correct the names in the Congruence_System(c)
 	  declaration.
 
-2005-05-26 Thursday 16:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 16:38  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
 	  (grids.[4,9,6]): Take out throw_invalid_modulus.  Update some
 	  temporary comments.  In Congruence(c) throw an exception if the
 	  constraint is a relation, and set the modulus to 0 instead of 1.
 
-2005-05-26 Thursday 13:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 13:21  Matthew Mundell
 
 	* src/Grid_public.cc (grids.26): In add_generator also clear the
 	  congruences up-to-date flag when adding to an empty grid.
 
-2005-05-26 Thursday 12:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 12:52  Matthew Mundell
 
 	* tests/Grid/addspacedims2.cc (grids.3): Add test6, which add
 	  dimensions only to the grid's generator system.
 
-2005-05-26 Thursday 12:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-26 Thursday 12:51  Matthew Mundell
 
 	* tests/Grid/addspacedims1.cc (grids.6): Improve comment.
 
-2005-05-25 Wednesday 21:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 21:18  Matthew Mundell
 
 	* src/Grid_public.cc (grids.25): In OK, take the extra copy of the
 	  generator system out of the minimized test, Use "generators"
@@ -18525,29 +54475,29 @@
 	  system (instead of the original) in the congruence minimized
 	  test.
 
-2005-05-25 Wednesday 20:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 20:47  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.11): Add test addcongruence1.
 
-2005-05-25 Wednesday 20:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 20:47  Matthew Mundell
 
 	* tests/Grid/addcongruence1.cc (grids.1): Initial revision.
 
-2005-05-25 Wednesday 20:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 20:46  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.4): Add test6, which tests
 	  add_generator_and_minimize.
 
-2005-05-25 Wednesday 19:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 19:27  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.3): Add tests 2 to 5.
 
-2005-05-25 Wednesday 14:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 14:48  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.8): Start from the universe when
 	  constructing grids from congruences.
 
-2005-05-25 Wednesday 14:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-25 Wednesday 14:46  Matthew Mundell
 
 	* src/Grid_public.cc (grids.24): Take the extra temporary
 	  congruence system out of the OK minimize test.  Modify
@@ -18579,29 +54529,29 @@
 	* interfaces/Prolog/SWI/Makefile.am (1.46): The `libppl_swiprolog'
 	  library must be linked also with `libpwl'.
 
-2005-05-24 Tuesday 21:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 21:27  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_chdims.cc,
 	  Grid_nonpublic.cc, Grid_public.cc (grids.[15,8,7,13,23]): Take
 	  out all code for handling pending rows.  Add a check for pending
 	  rows to method OK.
 
-2005-05-24 Tuesday 21:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 21:23  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.19): Use unset_pending_rows instead
 	  of clearing the pending rows manually.
 
-2005-05-24 Tuesday 19:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 19:17  Matthew Mundell
 
 	* src/Grid_public.cc (grids.22): Always adjust the space dimension
 	  of con_sys in constructor Grid(num_dimensions, kind).  Clean a
 	  comment.
 
-2005-05-24 Tuesday 18:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 18:23  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.10): Take out tracing.
 
-2005-05-24 Tuesday 18:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 18:13  Matthew Mundell
 
 	* src/Grid.defs.hh, tests/Grid/addgenerator1.cc,
 	  tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
@@ -18612,31 +54562,31 @@
 	  Grid(num_dimensions, kind) kind is UNIVERSE if only
 	  num_dimensions if given.
 
-2005-05-24 Tuesday 17:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 17:14  Matthew Mundell
 
 	* src/Grid_public.cc (grids.21): Output "true" from operator<< if
 	  the grid is universe.
 
-2005-05-24 Tuesday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 17:01  Matthew Mundell
 
 	* tests/Grid/addspacedims1.cc (grids.4): Add test5, where
 	  dimensions are only added to the congruence system.
 
-2005-05-24 Tuesday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 16:55  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.10): Add test addgenerator1.
 
-2005-05-24 Tuesday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 16:55  Matthew Mundell
 
 	* tests/Grid/addgenerator1.cc (grids.1): Initial revision.
 
-2005-05-24 Tuesday 16:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 16:54  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.3): Add test6 (maps additional
 	  dimensions to themselves), test7 (maps over existing dimensions)
 	  and test8 (maps away a dimension in an empty grid).
 
-2005-05-24 Tuesday 16:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-24 Tuesday 16:51  Matthew Mundell
 
 	* src/Grid_public.cc (grids.20): Set congruences up to date in
 	  add_congruence.  Implement the rest of add_generator.
@@ -18654,53 +54604,53 @@
 	  non equality constraints that may be present in `cs' are simply
 	  ignored.
 
-2005-05-23 Monday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-23 Monday 18:09  Matthew Mundell
 
 	* src/Grid_public.cc (grids.17): Implement some of add_generator.
 	  Modify add_congruences_and_minimize to match the dimension of the
 	  congruence system being constructed to the given constraint
 	  system.  Correct a doxygen comment.
 
-2005-05-23 Monday 15:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-23 Monday 15:57  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.2): Add test5.
 
-2005-05-23 Monday 15:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-23 Monday 15:51  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.18): Adjust the system's row capacity
 	  after inserting or erasing rows.
 
-2005-05-23 Monday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-23 Monday 15:48  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.6): In add_space_dimensions_and_embed
 	  correct the clearing of the minimize flags and the loop that adds
 	  virtual rows.  Take some pending code out of concatenate_assign.
 
-2005-05-20 Friday 09:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-20 Friday 09:12  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.9): Add test mapspacedims1.
 
-2005-05-20 Friday 09:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-20 Friday 09:12  Matthew Mundell
 
 	* tests/Grid/mapspacedims1.cc (grids.1): Initial revision.
 
-2005-05-20 Friday 09:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-20 Friday 09:11  Matthew Mundell
 
 	* src/Grid.inlines.hh (grids.7): Enable and implement method
 	  map_space_dimensions.
 
-2005-05-19 Thursday 09:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-19 Thursday 09:35  Matthew Mundell
 
 	* src/Grid_public.cc (grids.16): Take out some of the pending code.
 	  Add the definition of add_congruences_and_minimize.
 
-2005-05-19 Thursday 09:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-19 Thursday 09:34  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.13): Temporarily add
 	  add_congruences_and_minimize and erroneously rename
 	  add_congruences to add_congruences_and_minimize.
 
-2005-05-19 Thursday 09:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-19 Thursday 09:07  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.17): Rename pivot_num to pivot_index.
 	  In the congruence reduction swap the current row with a newly
@@ -18711,12 +54661,12 @@
 
 	* tests/Grid/.cvsignore (grids.1): Put under CVS control.
 
-2005-05-18 Wednesday 17:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-18 Wednesday 17:45  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.10): Always define
 	  is_upper_triangular and is_lower_triangular.	Add some tracing.
 
-2005-05-18 Wednesday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-18 Wednesday 17:43  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.12): Always declare is_upper_triangular
 	  and is_lower_triangular
@@ -18760,101 +54710,101 @@
 	  Checked_Number.inlines.hh (1.32): Converted many Checked_Number
 	  method in functions.
 
-2005-05-15 Sunday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:34  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.8): Add test concatenate1.
 
-2005-05-15 Sunday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:34  Matthew Mundell
 
 	* tests/Grid/concatenate1.cc (grids.1): Initial revision.
 
-2005-05-15 Sunday 10:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:33  Matthew Mundell
 
 	* tests/Grid/removespacedims1.cc (grids.2): Take out trace dumping.
 
-2005-05-15 Sunday 10:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:32  Matthew Mundell
 
 	* tests/Grid/addspacedims1.cc (grids.3): Shorten comments.
 
-2005-05-15 Sunday 10:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:31  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.16): In the congruence reduction,
 	  after erasing rows set the row capacity of the system from the
 	  first row.
 
-2005-05-15 Sunday 10:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:18  Matthew Mundell
 
 	* src/Grid_public.cc (grids.15): Add loading of the minimize flag
 	  to ascii_load.
 
-2005-05-15 Sunday 10:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:16  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.5): Enable and implement
 	  concatenate_assign.
 
-2005-05-15 Sunday 10:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:13  Matthew Mundell
 
 	* src/Generator_System.cc (grids.4): In method ascii_load, turn off
 	  the type check (for now), and correctly handle reading in the
 	  virtual flag.
 
-2005-05-15 Sunday 10:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:09  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.8): In operator== decrement the
 	  row count before the comparing the elements.
 
-2005-05-15 Sunday 10:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-15 Sunday 10:08  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.5): In find_variation, dump the ASCII of
 	  `a' before loading it into `b', and print an error and exit if
 	  the load fails.
 
-2005-05-12 Thursday 18:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 18:11  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.7): Add test removespacedims1.
 
-2005-05-12 Thursday 18:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 18:10  Matthew Mundell
 
 	* tests/Grid/removespacedims1.cc (grids.1): Initial revision.
 
-2005-05-12 Thursday 18:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 18:10  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.12): Clean comments and take out
 	  tracing in normalize_divisors.
 
-2005-05-12 Thursday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 18:09  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.4): Enable and implement
 	  add_space_dimensions.
 
-2005-05-12 Thursday 18:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 18:07  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.11): Integrate a too-deeply nested
 	  doxygen sublist into the parent item.  Correct parameter names in
 	  some method descriptions.
 
-2005-05-12 Thursday 16:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 16:04  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.8): Take doxygen \p's out of maths
 	  environments.
 
-2005-05-12 Thursday 14:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 14:49  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.7): Escape %'s in maths
 	  environments.
 
-2005-05-12 Thursday 14:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 14:13  Matthew Mundell
 
 	* src/Grid_public.cc (grids.14): In OK declare limit the scope of
 	  variable num_columns, instead of jumping into that scope.  Add
 	  the state of minimization to the ascii_dump output.
 
-2005-05-12 Thursday 13:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 13:20  Matthew Mundell
 
 	* src/Makefile.am (grids.3): Add Congruence, Congruence_System and
 	  Grid files to DOC_FILES.
 
-2005-05-12 Thursday 13:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-12 Thursday 13:15  Matthew Mundell
 
 	* doc/: devref-browse.doxyconf-latex.in,
 	  devref-print.doxyconf-latex.in (grids.[1,1]): Add files for
@@ -18865,47 +54815,47 @@
 	* doc/definitions.dox (grids.2): Several small improvements to the
 	  new documentation on grids.
 
-2005-05-11 Wednesday 20:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 20:18  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.6): Add test removespacedims2.
 
-2005-05-11 Wednesday 20:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 20:17  Matthew Mundell
 
 	* tests/Grid/removespacedims2.cc (grids.1): Initial revision.
 
-2005-05-11 Wednesday 20:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 20:16  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.11): Enable
 	  remove_pending_to_obtain_generators.
 
-2005-05-11 Wednesday 20:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 20:15  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.3): Update
 	  add_space_dimensions_and_project to clear the generator system if
 	  the grid is empty.  Enable and implement method
 	  remove_higher_space_dimensions.
 
-2005-05-11 Wednesday 17:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 17:17  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.5): Add tests isuniverse1 and
 	  addspacedims2.
 
-2005-05-11 Wednesday 17:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 17:16  Matthew Mundell
 
 	* tests/Grid/addspacedims1.cc (grids.2): Improve the file
 	  description.	Take out excess variable declarations.	Add a check
 	  that the grid is the universe to test3.
 
-2005-05-11 Wednesday 17:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 17:12  Matthew Mundell
 
 	* tests/Grid/: addspacedims2.cc, isuniverse1.cc (grids.[1,1]):
 	  Initial revision.
 
-2005-05-11 Wednesday 17:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 17:07  Matthew Mundell
 
 	* src/Grid_public.cc (grids.13): Enable and finish off is_universe.
 
-2005-05-11 Wednesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-11 Wednesday 17:03  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_chdims.cc (grids.[10,2]): Add method
 	  add_space_dimensions(cgs, gs dims).  Declare the original
@@ -18921,53 +54871,53 @@
 	  documentation for grids and draft specifications of most of the
 	  main operations to be implemented.
 
-2005-05-09 Monday 12:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:40  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.4): Add tests addspacedims1,
 	  intersection1, intersection2, join1 and join2.
 
-2005-05-09 Monday 12:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:39  Matthew Mundell
 
 	* tests/Grid/addspacedims1.cc (grids.1): Initial revision.
 
-2005-05-09 Monday 12:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:36  Matthew Mundell
 
 	* tests/Grid/: grid3.cc, intersection1.cc, intersection2.cc,
 	  join1.cc, join2.cc (grids.[3,1,1,1,1]): Move operation tests to
 	  per-operation files.	Add various tests of the
 	  intersection_assign methods.
 
-2005-05-09 Monday 12:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:32  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.6): Add test13 (an empty grid
 	  constructed with congruences).
 
-2005-05-09 Monday 12:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:32  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.10): Add test19 (a generator system
 	  with only a line).
 
-2005-05-09 Monday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:31  Matthew Mundell
 
 	* tests/Grid/: congruence1.cc, congruencesystem1.cc (grids.[3,4]):
 	  Use C++ style single line comments.  Take out some duplicate
 	  Variables.
 
-2005-05-09 Monday 12:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:28  Matthew Mundell
 
 	* tests/print.hh (grids.2): Declare nout and vnout static.
 
-2005-05-09 Monday 12:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:27  Matthew Mundell
 
 	* src/Makefile.am (grids.2): Add Grid_chdims.cc to
 	  libppl_la_SOURCES.
 
-2005-05-09 Monday 12:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:26  Matthew Mundell
 
 	* src/Grid_chdims.cc (grids.1): Initial revision, with methods
 	  add_space_dimensions and add_space_dimensions_and_embed enabled.
 
-2005-05-09 Monday 12:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:24  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_public.cc, Grid_simplify.cc
 	  (grids.[9,12,15]): Add method add_space_dimensions.  Change the
@@ -18979,29 +54929,29 @@
 	  contains.  Update comments.  Take out some tracing.  Correct the
 	  asserts in two of the reduce functions.
 
-2005-05-09 Monday 12:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:05  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.10): Take out some tracing.  Update
 	  comments left from Polyhedron.
 
-2005-05-09 Monday 12:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-09 Monday 12:00  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[7,5]): Take out a line of tracing and the declaration of
 	  method insert(const Constraint&).  Update a comment.
 
-2005-05-06 Friday 11:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:47  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.9): Correct method name typo.
 
-2005-05-06 Friday 11:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:39  Matthew Mundell
 
 	* tests/Grid/grid3.cc (grids.2): Use A instead of C in test1.  Add
 	  test2, test3 and test4, which test
 	  intersection_assign_and_minimize, join_assign and
 	  join_assign_and_minimize.
 
-2005-05-06 Friday 11:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:37  Matthew Mundell
 
 	* src/: Grid_conversion.cc, Grid_simplify.cc (grids.[8,14]): Use
 	  new method Congruence_System::is_congruence.	Update parameter
@@ -19010,39 +54960,39 @@
 	  to make the first row the integrality congruence if the resulting
 	  grid is empty.
 
-2005-05-06 Friday 11:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:29  Matthew Mundell
 
 	* src/Grid_public.cc (grids.11): Enable and implement
 	  intersection_assign_and_minimize, join_assign and
 	  join_assign_and_minimize.
 
-2005-05-06 Friday 11:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:27  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.9): Normalise moduli before
 	  simplifying in construct.  Correct some comments.
 
-2005-05-06 Friday 11:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:26  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.9): Reorder method definitions.  Add
 	  some temporary comments.
 
-2005-05-06 Friday 11:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-06 Friday 11:22  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence.inlines.hh,
 	  Congruence_System.cc (grids.[6,5,6]): Add method is_congruence.
 	  Adjust normalize_moduli to loop through all the rows when
 	  calculating the LCM.
 
-2005-05-05 Thursday 10:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:55  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.3): Add grid3_SOURCES and add grid3
 	  to TESTS.
 
-2005-05-05 Thursday 10:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:54  Matthew Mundell
 
 	* tests/Grid/grid3.cc (grids.1): Initial revision.
 
-2005-05-05 Thursday 10:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:49  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.13): Rename function
 	  trailing_rows_are_zero to rows_are_zero, and modify it to also
@@ -19053,33 +55003,33 @@
 	  In the congruence simplify decrement orig_row_num in macro
 	  free_row, to match it to the new number of rows.
 
-2005-05-05 Thursday 10:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:42  Matthew Mundell
 
 	* src/Grid_public.cc (grids.10): Simplify instead of processing
 	  pending, in is_universe.  Enable processing of pending generators
 	  in add_congruence.  Enable and implement intersection_assign.
 
-2005-05-05 Thursday 10:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:36  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.8): Minimize instead of simplifying
 	  in the process_pending methods.  Update a comment.
 
-2005-05-05 Thursday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:34  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.8): Take out tracing, add a comment.
 
-2005-05-05 Thursday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:34  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh
 	  (grids.[5,4]): Add void method add_rows(const
 	  Congruence_System&).
 
-2005-05-05 Thursday 10:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-05 Thursday 10:32  Matthew Mundell
 
 	* tests/Grid/: grid1.cc, grid2.cc (grids.[9,5]): Convert comments
 	  to C++ style.
 
-2005-05-04 Wednesday 15:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-04 Wednesday 15:04  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
 	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
@@ -19095,12 +55045,12 @@
 	  update some comments.  Update construct to convert a given NNC
 	  generator system to NC.
 
-2005-05-03 Tuesday 15:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 15:20  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.11): Only throw the "type match" run
 	  time errors when assertions are enabled.
 
-2005-05-03 Tuesday 15:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 15:03  Matthew Mundell
 
 	* tests/Grid/: grid1.cc, grid2.cc (grids.[8,4]): Neaten tracing
 	  headers.  Use the single argument Grid constructor, instead of
@@ -19109,18 +55059,18 @@
 	  test16, test17 and test18, which test universe grids of one, many
 	  and zero dimensions.
 
-2005-05-03 Tuesday 15:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 15:02  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.10): Turn off tracing.
 
-2005-05-03 Tuesday 15:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 15:01  Matthew Mundell
 
 	* src/Grid_public.cc (grids.8): Ensure that dimensions given to the
 	  constructor are small enough.  Implement method is_universe.
 	  Enable, clean up and improve the OK method.  Add operator= (moved
 	  from Grid_nonpublic.cc).
 
-2005-05-03 Tuesday 14:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 14:48  Matthew Mundell
 
 	* src/Grid_nonpublic.cc (grids.6): Take out operator= (moved to
 	  Grid_public.cc).  Enable and update process_pending_congruences
@@ -19128,13 +55078,13 @@
 	  minimize().  Drop the topol argument from calls to
 	  throw_space_dimension_overflow.
 
-2005-05-03 Tuesday 14:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 14:40  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.7): Simplify before initialising the
 	  destination in the minimize functions.  Improve the loops that
 	  create identity matrices.
 
-2005-05-03 Tuesday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 14:35  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.6): Update some comments.  Add and
 	  use macro ctrace_dump.  Only throw the "type match" run time
@@ -19142,14 +55092,14 @@
 	  the row-processing loop in the parameter to congruence
 	  conversion.
 
-2005-05-03 Tuesday 14:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 14:22  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[7,5]): Improve some
 	  comments.  Revert the miscellaneous methods to private.  Drop
 	  throw_space_dimension_overflow's topol argument.  Take out the
 	  bounding box method definitions.  Enable method process_pending.
 
-2005-05-03 Tuesday 14:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-05-03 Tuesday 14:11  Matthew Mundell
 
 	* tests/Grid/congruencesystem1.cc (grids.3): Neaten test7.
 
@@ -19158,7 +55108,7 @@
 	* src/: Float.defs.hh (1.7), checked_float.inlines.hh (1.36): Avoid
 	  some compiler warnings.
 
-2005-04-27 Wednesday 21:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-27 Wednesday 21:45  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
 	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
@@ -19189,12 +55139,12 @@
 	  trailing_rows_are_zero
 	    when assertions are enabled.
 
-2005-04-27 Wednesday 21:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-27 Wednesday 21:10  Matthew Mundell
 
 	* src/Congruence_System.inlines.hh (grids.3): Take old comment out
 	  of resize_no_copy.
 
-2005-04-26 Tuesday 20:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:54  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.8): Use the new is_virtual and
 	  set_is_virtual methods instead of the old virtual row functions.
@@ -19206,47 +55156,47 @@
 	  one of the comparisons in the empty grid check at the end of the
 	  congruence reduction.
 
-2005-04-26 Tuesday 20:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:38  Matthew Mundell
 
 	* src/Grid_minimize.cc (grids.5): Add an assertion that there are
 	  rows to the 4 parameter congruence to generator minimize method.
 	  Take the Polhedron assertion comment out of both of the 4
 	  parameter minimize methods.
 
-2005-04-26 Tuesday 20:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:33  Matthew Mundell
 
 	* src/: Generator_System.cc, Grid_conversion.cc, Grid_nonpublic.cc
 	  (grids.[3,4,4]): Use new is_virtual and set_is_virtual methods
 	  instead of the old virtual row functions.
 
-2005-04-26 Tuesday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:30  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[5,3]): Take out the
 	  virtual row functions (replace with methods in the Generator and
 	  Congruence classes).
 
-2005-04-26 Tuesday 20:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:28  Matthew Mundell
 
 	* src/: Generator.defs.hh, Generator.inlines.hh (grids.[2,1]): Add
 	  is_virtual.
 
-2005-04-26 Tuesday 20:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:27  Matthew Mundell
 
 	* src/Congruence_System.defs.hh (grids.3): Correct comment.
 
-2005-04-26 Tuesday 20:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 20:26  Matthew Mundell
 
 	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[5,4]):
 	  Add methods is_virtual and set_is_virtual.  Assert that there are
 	  elements in methods modulus and set_is_equality.
 
-2005-04-26 Tuesday 11:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-26 Tuesday 11:04  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.7): Add test15, which tests
 	  reduce_line_with_line.  Neaten the generator system definition in
 	  test9.
 
-2005-04-25 Monday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-25 Monday 19:35  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[4,7]): Use
 	  strace_dump in the congruence system reduction.
@@ -19261,59 +55211,59 @@
 	  Correct the assertions.  Add and use macro strace_dump and
 	  temporary tracing stream strace.
 
-2005-04-25 Monday 18:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-25 Monday 18:58  Matthew Mundell
 
 	* src/Grid_public.cc (grids.6): In
 	  add_recycled_congruences_and_minimize use the add_and_minimize
 	  return directly, instead of using a variable.
 
-2005-04-25 Monday 18:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-25 Monday 18:48  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.6): In
 	  add_recycled_congruences_and_minimize use the add_and_minimize
 	  return directly, instead of using a variable.
 
-2005-04-25 Monday 18:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-25 Monday 18:46  Matthew Mundell
 
 	* src/Grid_conversion.cc (grids.3): Rename the trace stream ctrace.
 
-2005-04-25 Monday 18:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-25 Monday 18:42  Matthew Mundell
 
 	* src/GMP_Integer.defs.hh (grids.2): Improve comment.
 
-2005-04-25 Monday 13:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-25 Monday 13:03  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.3): Add general tests test11 and
 	  test12, which have more and fewer rows than columns,
 	  respectively.
 
-2005-04-22 Friday 11:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-22 Friday 11:41  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.2): Add general test cong_test4.
 
-2005-04-21 Thursday 12:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 12:30  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.2): Add grid2_SOURCES, and add
 	  grid2 to TESTS.
 
-2005-04-21 Thursday 12:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 12:29  Matthew Mundell
 
 	* tests/Grid/grid2.cc (grids.1): Initial revision.
 
-2005-04-21 Thursday 12:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 12:28  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.6): Always compare the grid and known
 	  grid in the same order.  Match the test names in the comments to
 	  the new Chiara names.
 
-2005-04-21 Thursday 12:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 12:16  Matthew Mundell
 
 	* src/Grid_public.cc (grids.5): Update
 	  add_recycled_congruences_and_minimize to clear the empty flag and
 	  set the congruences up-to-date.  Take out the polyhedra comments
 	  in operator==, and neaten operator<<.
 
-2005-04-21 Thursday 12:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 12:10  Matthew Mundell
 
 	* src/: Grid_minimize.cc, Grid_nonpublic.cc, Grid_simplify.cc
 	  (grids.[4,3,5]): Return a bool from the update_congruences and
@@ -19330,7 +55280,7 @@
 	  simplify when adding the top row, search for a valid modulus and
 	  set the diagonal (and modulus) to the result of the search.
 
-2005-04-21 Thursday 11:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 11:51  Matthew Mundell
 
 	* src/Grid.defs.hh (grids.3): Return a bool from update_congruences
 	  and simplify to indicate whether the grid is empty.  Pass this
@@ -19338,13 +55288,13 @@
 	  simplify.  Assert an equal number of columns in the sources in
 	  the congruence to generator add_and_minimize\5.
 
-2005-04-21 Thursday 11:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 11:40  Matthew Mundell
 
 	* src/Generator_System.cc (grids.2): In operator<< increment the
 	  iterator after the virtual row check, and loop with a single
 	  comparison.
 
-2005-04-21 Thursday 11:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-21 Thursday 11:37  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.4): Take out normalize_moduli
 	  tracing.  Add satisfies_all_cgs tracing.  Update normalize_moduli
@@ -19352,30 +55302,30 @@
 	  move the moduli to the new last column.  Neaten the operator<<
 	  loop.
 
-2005-04-19 Tuesday 19:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-19 Tuesday 19:08  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.5): Add test14 which uses larger
 	  numbers than the existing tests.
 
-2005-04-19 Tuesday 14:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-19 Tuesday 14:22  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.4): Add test11-13 which test with an
 	  empty grid in one, an empty grid in many dimensions and a grid in
 	  which the values are larger than in the existing tests.
 
-2005-04-19 Tuesday 14:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-19 Tuesday 14:17  Matthew Mundell
 
 	* src/Linear_Row.cc (grids.1): Note the virtual row in
 	  Flags::ascii_dump.
 
-2005-04-19 Tuesday 14:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-19 Tuesday 14:15  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.4): Include the divisor in the
 	  parameter version of le_pc_reduce.  In the congruence version
 	  consider every row (instead of leaving out the last row) and skip
 	  modifying virtual rows.
 
-2005-04-19 Tuesday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-19 Tuesday 14:07  Matthew Mundell
 
 	* src/: Grid_minimize.cc, Grid_public.cc (grids.[3,4]): Take out
 	  the pending row tracing.
@@ -19386,49 +55336,49 @@
 	  fpu.defs.hh (1.4): Code cleaning. Added
 	  fpu_set_rounding_direction.
 
-2005-04-15 Friday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 18:55  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.3): Take out tracing.  Enable
 	  comparison to known grid in test1.
 
-2005-04-15 Friday 18:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 18:51  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.4): ASCII dump `a'.
 
-2005-04-15 Friday 18:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 18:49  Matthew Mundell
 
 	* src/Grid_simplify.cc (grids.3): When the first row must be added,
 	  add an empty congruence or point instead of a virtual row.
 
-2005-04-15 Friday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 17:29  Matthew Mundell
 
 	* tests/Grid/Makefile.am (grids.1): Initial revision.
 
-2005-04-15 Friday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 15:23  Matthew Mundell
 
 	* src/Congruence.inlines.hh (grids.3): Take out tracing.
 
-2005-04-15 Friday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 15:23  Matthew Mundell
 
 	* src/Congruence.defs.hh (grids.4): Take out inclusion of test
 	  file.
 
-2005-04-15 Friday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 12:12  Matthew Mundell
 
 	* tests/Grid/grid1.cc (grids.2): Add test7 to test10, and update
 	  all tests to test reduction and conversion.
 
-2005-04-15 Friday 12:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 12:11  Matthew Mundell
 
 	* tests/Grid/congruencesystem1.cc (grids.2): Add test7, which
 	  includes an all-zero congruence and an equality.
 
-2005-04-15 Friday 12:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 12:07  Matthew Mundell
 
 	* src/: Linear_Row.defs.hh, Linear_Row.inlines.hh (grids.[1,1]):
 	  Add a virtual flag and methods is_virtual and set_is_virtual.
 
-2005-04-15 Friday 12:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 12:06  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
 	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
@@ -19462,12 +55412,12 @@
 
 	  Update reduction (the simplify methods).
 
-2005-04-15 Friday 11:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 11:01  Matthew Mundell
 
 	* src/Generator_System.cc (grids.1): Add virtual_rows to loading
 	  and dumping.
 
-2005-04-15 Friday 10:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 10:55  Matthew Mundell
 
 	* src/: Congruence_System.cc, Congruence_System.defs.hh,
 	  Congruence_System.inlines.hh (grids.[3,2,2]): Add method
@@ -19478,7 +55428,7 @@
 	  satisfies_all_congruences compare the scalar product with zero
 	  for equalities.
 
-2005-04-15 Friday 10:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 10:41  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
 	  (grids.[3,3,2]): Add versions of reduced_scalar_product_assign
@@ -19487,7 +55437,7 @@
 	  modulus when the coefficients are all zero.  Correct the loading
 	  of the "m" in ascii_load.
 
-2005-04-15 Friday 10:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-04-15 Friday 10:30  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.3): In find_variation_template neaten
 	  the failure output, take out the tracing output, and note that
@@ -19529,16 +55479,16 @@
 	  method Constraint_System BD_Shape<T>::minimized_constraints()
 	  const.
 
-2005-03-31 Thursday 12:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 12:14  Matthew Mundell
 
 	* doc/Makefile.am (1.34): Keep TXT_LICENSES in LICENSES.  Use
 	  specific licence variables in ALL_TARGETS, instead of LICENSES.
 
-2005-03-31 Thursday 12:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 12:11  Matthew Mundell
 
 	* demos/ppl_lcdd/examples/README (1.3): Make "example" plural.
 
-2005-03-31 Thursday 12:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 12:10  Matthew Mundell
 
 	* debian/: libppl.dirs (1.2), libppl.install (1.3), rules (1.4):
 	  Add ppl_lcdd to the libppl package.  Extract the PPL version
@@ -19546,36 +55496,46 @@
 	  files.  Make the PWL.  Install the PWL and Debian changelog to
 	  libppl-pwl.  Copy the Debian changelog to libppl correctly.
 
-2005-03-31 Thursday 12:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 12:03  Matthew Mundell
 
 	* debian/: libppl-pwl.dirs (1.1), libppl-pwl.docs (1.1),
 	  libppl-pwl.install (1.1): Initial revision.
 
-2005-03-31 Thursday 12:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.dirs (altnum.1): file libppl-pwl.dirs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-31 Thursday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.docs (altnum.1): file libppl-pwl.docs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-31 Thursday 12:02  Matthew Mundell
 
 	* debian/control (1.7): For the PWL package, correct long and short
 	  descriptions and take out the libppl dependency.
 
-2005-03-31 Thursday 11:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 11:59  Matthew Mundell
 
 	* configure.ac (1.160): Add Debian copyright files to
 	  AC_CONFIG_FILES.  Clean some whitespace.
 
-2005-03-31 Thursday 11:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 11:58  Matthew Mundell
 
 	* debian/libppl-pwl.links (1.2): Use libppl-pwl.docs instead of a
 	  symlink.
 
-2005-03-31 Thursday 11:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 11:56  Matthew Mundell
 
 	* debian/libppl.copyright (1.2): Move to libppl.copyright.in.
 
-2005-03-31 Thursday 11:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 11:55  Matthew Mundell
 
 	* debian/libppl.copyright.in (1.1): Initial revision (moved here
 	  from libppl.copyright).
 
-2005-03-31 Thursday 11:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-31 Thursday 11:54  Matthew Mundell
 
 	* debian/libppl-pwl.copyright.in (1.1): Initial revision.
 
@@ -19590,11 +55550,11 @@
 	  checked_mpz.inlines.hh (1.21): New implementation of standardized
 	  input of checked numbers. Added mpq to float conversion.
 
-2005-03-29 Tuesday 16:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 16:40  Matthew Mundell
 
 	* doc/README.doc (1.4): Revert accidental previous commit.
 
-2005-03-29 Tuesday 16:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 16:37  Matthew Mundell
 
 	* doc/: README.doc (1.3), Makefile.am (1.33): Preserve text
 	  licences across the clean rules by making CLEANFILES and
@@ -19602,32 +55562,43 @@
 	  duplicate text files out of EXTRA_DIST.  Take out the dist-hook
 	  rule.
 
-2005-03-29 Tuesday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 16:29  Matthew Mundell
 
 	* debian/rules (1.3): For the config.status rule add a Watchdog
 	  configure command and take out the dependency on configure.
 
-2005-03-29 Tuesday 12:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 12:01  Matthew Mundell
 
 	* debian/rules (1.2): Add configure flags assignment suggested in
 	  Debian autotools-dev README.	Change DOC_DIR to libppl-dev (user
 	  manual moved to package libppl-dev).	Update comment.
 
-2005-03-29 Tuesday 11:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 11:50  Matthew Mundell
 
 	* debian/libppl.doc-base (1.2): Moved to libppl-dev.doc-base.user
 	  (user manual moved to package libppl-dev).
 
-2005-03-29 Tuesday 11:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 11:47  Matthew Mundell
 
 	* debian/libppl-dev.doc-base.user (1.1): Initial revision.
 
-2005-03-29 Tuesday 11:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 11:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.doc-base.user (altnum.1): file
+	  libppl-dev.doc-base.user was added on branch altnum on 2006-10-29
+	  19:26:52 +0000
+
+2005-03-29 Tuesday 11:45  Matthew Mundell
 
 	* debian/libppl-dev.doc-base (1.2): Make the fields in the first
 	  section contiguous.  Update HTML directory name.
 
-2005-03-29 Tuesday 11:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-29 Tuesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.doc-base (altnum.1): file libppl-dev.doc-base
+	  was added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-29 Tuesday 11:43  Matthew Mundell
 
 	* debian/control (1.6): Add automake1.4 build conflict.  Update
 	  interface short descriptions.  As per Developers Reference: take
@@ -19756,83 +55727,83 @@
 	  checked_mpz.inlines.hh (1.18): Removed unused pred/succ. Don't
 	  return special result for representable values.
 
-2005-03-22 Tuesday 13:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 13:01  Matthew Mundell
 
 	* STANDARDS (grids.2): Take out the paragraph about the check_dump
 	  function.
 
-2005-03-22 Tuesday 13:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 13:00  Matthew Mundell
 
 	* tests/Grid/writecongruencesystem.cc (grids.2): Take out the dump
 	  comparisons.	Add find_variation checks.  Use endl instead of
 	  '\n'.
 
-2005-03-22 Tuesday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 12:58  Matthew Mundell
 
 	* tests/Grid/congruence1.cc (grids.2): Take out all dump
 	  comparisons.	Use find_variation instead of check_ok.  Print
 	  fewer NOISY tracing messages.  Add dumps to the NOISY test
 	  failure messages.
 
-2005-03-22 Tuesday 12:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 12:55  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.2): Take out check_dump.  Create the
 	  comparison object in find_variation_template with a copy
 	  constructor.
 
-2005-03-22 Tuesday 12:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 12:54  Matthew Mundell
 
 	* src/Grid_public.cc (grids.2): Define the copy constructor.
 
-2005-03-22 Tuesday 12:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 12:53  Matthew Mundell
 
 	* src/Congruence_System.cc (grids.2): Use Congruence::ascii_load.
 
-2005-03-22 Tuesday 12:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-22 Tuesday 12:52  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh (grids.[2,2]): Add method
 	  ascii_load.
 
-2005-03-21 Monday 20:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 20:12  Matthew Mundell
 
 	* src/: Matrix.cc, Matrix.defs.hh (grids.[1,1]): Declare Grid and
 	  an operator== as friends.  Add method add_row.
 
-2005-03-21 Monday 20:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 20:03  Matthew Mundell
 
 	* doc/devref.doxyconf-html.in (grids.1): Add Grid, Congruence and
 	  Congruence_System files to INPUT.
 
-2005-03-21 Monday 19:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:59  Matthew Mundell
 
 	* src/Row.defs.hh (1.93): Take out dot following \brief.
 
-2005-03-21 Monday 19:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:52  Matthew Mundell
 
 	* src/Makefile.am (grids.1): Add Grid, Congruence and
 	  Congruence_System files to INCLUDE_FILES and libppl_la_SOURCES.
 
-2005-03-21 Monday 19:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:49  Matthew Mundell
 
 	* src/: Linear_Expression.defs.hh, Linear_Expression.inlines.hh
 	  (grids.[1,1]): Declare Congruence, two operator%='s and
 	  swap(Linear_Expression&, Linear_Expression&) as friends.  Add
 	  copy constructor which takes size and capacity.
 
-2005-03-21 Monday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:35  Matthew Mundell
 
 	* src/Generator_System.defs.hh (grids.1): Declare Grid friendship.
 
-2005-03-21 Monday 19:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:34  Matthew Mundell
 
 	* src/Generator.defs.hh (grids.1): Declare Grid and
 	  Congruence_System as friends.
 
-2005-03-21 Monday 19:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:33  Matthew Mundell
 
 	* src/Constraint.defs.hh (grids.1): Declare Congruence a friend.
 
-2005-03-21 Monday 19:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:32  Matthew Mundell
 
 	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
 	  Congruence.types.hh, Congruence_System.cc,
@@ -19840,33 +55811,33 @@
 	  Congruence_System.types.hh (grids.[1,1,1,1,1,1,1,1]): Initial
 	  revision.
 
-2005-03-21 Monday 19:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:30  Matthew Mundell
 
 	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (grids.[1,1]):
 	  Add gcdext_assign.
 
-2005-03-21 Monday 19:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:27  Matthew Mundell
 
 	* tests/ppl_test.hh (grids.1): Include the std and PPL namespaces.
 	  Define macro stringify, function checkdump and template
 	  find_variation_template.
 
-2005-03-21 Monday 19:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:24  Matthew Mundell
 
 	* tests/print.hh (grids.1): Set NOISY and VERY_NOISY from the
 	  associated directives.  Create the nout and vnout streams.
 
-2005-03-21 Monday 19:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:22  Matthew Mundell
 
 	* tests/Makefile.am (grids.1): Add Grid to SUBDIRS.
 
-2005-03-21 Monday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:21  Matthew Mundell
 
 	* tests/Grid/: Makefile.in, congruence1.cc, congruencesystem1.cc,
 	  congruencesystem2.cc, grid1.cc, writecongruencesystem.cc
 	  (grids.[1,1,1,1,1,1]): Initial revision.
 
-2005-03-21 Monday 19:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:15  Matthew Mundell
 
 	* src/: Grid.defs.hh, Grid.inlines.hh, Grid.types.hh,
 	  Grid_Status.cc, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
@@ -19874,12 +55845,12 @@
 	  Grid_public.cc, Grid_simplify.cc (grids.[1,1,1,1,1,1,1,1,1,1,1]):
 	  Initial, partial, rough revision.
 
-2005-03-21 Monday 19:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:11  Matthew Mundell
 
 	* configure.ac (grids.1): Add tests/Grid/Makefile to
 	  AC_CONFIG_FILES.
 
-2005-03-21 Monday 19:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-21 Monday 19:09  Matthew Mundell
 
 	* STANDARDS (grids.1): Add "Standards for the Test Programs"
 	  section.
@@ -19968,15 +55939,20 @@
 	  BD_Shape<T>::generalized_affine_image(Variable, const
 	  Relation_Symbol, const Linear_Expression&, const Coefficient&).
 
-2005-03-09 Wednesday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 17:19  Matthew Mundell
 
 	* debian/libppl.docs (1.2): TODO is currently for internal use.
 
-2005-03-09 Wednesday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.docs (altnum.1): file libppl.docs was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:37  Matthew Mundell
 
 	* debian/copyright (1.2): Move to libppl.copyright.
 
-2005-03-09 Wednesday 12:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 12:24  Matthew Mundell
 
 	* debian/: libppl-c.dirs (1.1), libppl-c.install (1.1),
 	  libppl-c.links (1.1), libppl-dev.doc-base (1.1), libppl-dev.docs
@@ -19986,24 +55962,54 @@
 	  (1.1), libppl.doc-base (1.1), libppl.docs (1.1): Initial
 	  revisions.
 
-2005-03-09 Wednesday 11:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-c.dirs (altnum.1): file libppl-c.dirs was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-c.install (altnum.1): file libppl-c.install was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-c.links (altnum.1): file libppl-c.links was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.docs (altnum.1): file libppl-dev.docs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.links (altnum.1): file libppl-dev.links was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 11:46  Matthew Mundell
 
 	* debian/libppl.install (1.2): Only install the main library
 	  (others now installed in interface packages).
 
-2005-03-09 Wednesday 11:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 11:45  Matthew Mundell
 
 	* debian/libppl-dev.dirs (1.2): Replace package specific doc dir
 	  with the general libppl doc dir.  Take out usr/lib/pkgconfig.
 
-2005-03-09 Wednesday 11:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.dirs (altnum.1): file libppl-dev.dirs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 11:43  Matthew Mundell
 
 	* debian/control (1.5): Rename to libppl.  Add a source section
 	  name.  Depend on graphviz and debhelper version of 4 or higher.
 	  Drop libppl-c-dev.  Complete the entries for the interface
 	  packages.
 
-2005-03-09 Wednesday 11:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-03-09 Wednesday 11:38  Matthew Mundell
 
 	* debian/: changelog (1.1), rules (1.1): Initial revision.
 
@@ -20179,6 +56185,11 @@
 	* debian/: compat (1.1), control (1.1), copyright (1.1): Initial
 	  drafts put under CVS control.
 
+2005-02-28 Monday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/compat (altnum.1): file compat was added on branch altnum
+	  on 2006-10-29 19:26:52 +0000
+
 2005-02-28 Monday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* ppl.spec.in (1.25): URL for the source fixed.
@@ -20269,12 +56280,12 @@
 	* src/BD_Shape.defs.hh (1.5): Comments for BD_Shape::BD_Shape(const
 	  Constraint_System& cs) improved.
 
-2005-02-24 Thursday 19:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-02-24 Thursday 19:05  Matthew Mundell
 
 	* src/: Generator.defs.hh (1.103), Linear_System.cc (1.18): Correct
 	  comment typo.
 
-2005-02-24 Thursday 19:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-02-24 Thursday 19:05  Matthew Mundell
 
 	* src/Constraint_System.defs.hh (1.9): Correct comment typos and
 	  clip off trailing whitespace.
@@ -20574,7 +56585,7 @@
 	  Linear_System::unset_pending_rows() are defined before being
 	  invoked.
 
-2005-02-15 Tuesday 18:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-02-15 Tuesday 18:16  Matthew Mundell
 
 	* src/BDS_Status.idefs.hh (1.5): Correct a typo.
 
@@ -20606,7 +56617,7 @@
 	  const Saturation_Row&) and operator!=(const Saturation_Row&,
 	  const Saturation_Row&) speeded up.
 
-2005-02-14 Monday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-02-14 Monday 17:19  Matthew Mundell
 
 	* src/Linear_System.inlines.hh (1.14): Improve comment.
 
@@ -21748,6 +57759,57 @@
 
 2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* demos/ppl_lpsol/examples/adlittle.mps (altnum.1): file
+	  adlittle.mps was added on branch altnum on 2006-10-29 19:26:55
+	  +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/blend.mps (altnum.1): file blend.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/boeing1.mps (altnum.1): file boeing1.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/boeing2.mps (altnum.1): file boeing2.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/kb2.mps (altnum.1): file kb2.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mip.mps (altnum.1): file mip.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/sc105.mps (altnum.1): file sc105.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/sc50a.mps (altnum.1): file sc50a.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/sc50b.mps (altnum.1): file sc50b.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ship08l.mps (altnum.1): file ship08l.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* TODO (1.138), demos/ppl_lpsol/Makefile.am (1.10),
 	  demos/ppl_lpsol/examples/Makefile.am (1.2),
 	  demos/ppl_lpsol/examples/adlittle.mps (1.1),
diff --git a/INSTALL b/INSTALL
index 56b077d..d3c5b40 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,8 +1,8 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007 Free Software Foundation, Inc.
 
 This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
@@ -10,7 +10,10 @@ unlimited permission to copy, distribute and modify it.
 Basic Installation
 ==================
 
-These are generic installation instructions.
+Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
 
    The `configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
@@ -23,9 +26,9 @@ debugging `configure').
 
    It can also use an optional file (typically called `config.cache'
 and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
+the results of its tests to speed up reconfiguring.  Caching is
 disabled by default to prevent problems with accidental use of stale
-cache files.)
+cache files.
 
    If you need to do unusual things to compile the package, please try
 to figure out how `configure' could check whether to do them, and mail
@@ -35,20 +38,17 @@ some point `config.cache' contains results you don't want to keep, you
 may remove or edit it.
 
    The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
 
 The simplest way to compile this package is:
 
   1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
+     `./configure' to configure the package for your system.
 
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
 
   2. Type `make' to compile the package.
 
@@ -67,6 +67,9 @@ The simplest way to compile this package is:
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
+  6. Often, you can also type `make uninstall' to remove the installed
+     files again.
+
 Compilers and Options
 =====================
 
@@ -78,7 +81,7 @@ details on some of the pertinent environment variables.
 by setting variables in the command line or in the environment.  Here
 is an example:
 
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 
    *Note Defining Variables::, for more details.
 
@@ -87,31 +90,29 @@ Compiling For Multiple Architectures
 
 You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+own directory.  To do this, you can use GNU `make'.  `cd' to the
 directory where you want the object files and executables to go and run
 the `configure' script.  `configure' automatically checks for the
 source code in the directory that `configure' is in and in `..'.
 
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
 
 Installation Names
 ==================
 
-By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PREFIX'.
+By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PREFIX', the package will
-use PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
 
    In addition, if you use an unusual directory layout you can give
 options like `--bindir=DIR' to specify different values for particular
@@ -159,7 +160,7 @@ where SYSTEM can have one of these forms:
 need to know the machine type.
 
    If you are _building_ compiler tools for cross-compiling, you should
-use the `--target=TYPE' option to select the type of system they will
+use the option `--target=TYPE' to select the type of system they will
 produce code for.
 
    If you want to _use_ a cross compiler, that generates code for a
@@ -190,12 +191,12 @@ them in the `configure' command line, using `VAR=value'.  For example:
      ./configure CC=/usr/local2/bin/gcc
 
 causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).  Here is a another example:
+overridden in the site shell script).
 
-     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
 
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
 
 `configure' Invocation
 ======================
diff --git a/Makefile.am b/Makefile.am
index 9d7560e..32e1bec 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -32,11 +32,26 @@ configure
 dist_noinst_HEADERS = \
 instchk.hh
 
+dist-hook:
+	sed -e "s/^enableval=thorough$$/enableval=quick/g" \
+		<$(distdir)/configure.ac >$(distdir)/configure.ac.new \
+	&& touch $(distdir)/configure.ac.new -r $(distdir)/configure.ac \
+	&& mv -f $(distdir)/configure.ac.new $(distdir)/configure.ac
+	sed -e "s/^enableval=thorough$$/enableval=quick/g" \
+		<$(distdir)/configure >$(distdir)/configure.new \
+	&& touch $(distdir)/configure.new -r $(distdir)/configure \
+	&& mv -f $(distdir)/configure.new $(distdir)/configure \
+	&& chmod +x $(distdir)/configure
+
 EXTRA_DIST = \
 ppl.lsm.in \
-ppl.spec.in \
 BUGS CREDITS README.configure STANDARDS
 
- at SET_MAKE@
+SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian fedora
 
-SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian
+# The files @PACKAGE at -config.h and _configs.sed, which are generated by
+# the autoconf macro AX_PREFIX_CONFIG_H, are not automatically cleaned up
+# by `make distclean'. So we need to explicitly clean them.
+DISTCLEANFILES = \
+ at PACKAGE@-config.h \
+_configs.sed
diff --git a/Makefile.in b/Makefile.in
index 0bfb79b..c198422 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/ppl/ .
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = .
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -59,16 +55,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+subdir = .
 DIST_COMMON = README $(am__configure_deps) $(dist_noinst_HEADERS) \
 	$(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
-	$(srcdir)/ppl.lsm.in $(srcdir)/ppl.spec.in \
-	$(top_srcdir)/configure COPYING ChangeLog INSTALL NEWS TODO \
-	compile config.guess config.rpath config.sub depcomp \
-	install-sh ltmain.sh missing mkinstalldirs
-subdir = .
+	$(srcdir)/ppl.lsm.in $(top_srcdir)/configure COPYING ChangeLog \
+	INSTALL NEWS TODO compile config.guess config.rpath config.sub \
+	depcomp install-sh ltmain.sh missing mkinstalldirs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -78,26 +74,39 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno configure.status.lineno
+ configure.lineno config.status.lineno
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = ppl.lsm ppl.spec
+CONFIG_CLEAN_FILES = ppl.lsm
 SCRIPTS = $(dist_noinst_SCRIPTS)
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
 HEADERS = $(dist_noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
@@ -113,39 +122,18 @@ GZIP_ENV = --best
 distuninstallcheck_listfiles = find . -type f -print
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -155,53 +143,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -210,56 +196,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -271,10 +231,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -283,24 +247,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 
 # Tell aclocal where to find `.m4' files.
@@ -316,10 +298,17 @@ instchk.hh
 
 EXTRA_DIST = \
 ppl.lsm.in \
-ppl.spec.in \
 BUGS CREDITS README.configure STANDARDS
 
-SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian
+SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian fedora
+
+# The files @PACKAGE at -config.h and _configs.sed, which are generated by
+# the autoconf macro AX_PREFIX_CONFIG_H, are not automatically cleaned up
+# by `make distclean'. So we need to explicitly clean them.
+DISTCLEANFILES = \
+ at PACKAGE@-config.h \
+_configs.sed
+
 all: config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
@@ -361,7 +350,7 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 config.h: stamp-h1
 	@if test ! -f $@; then \
 	  rm -f stamp-h1; \
-	  $(MAKE) stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
 	else :; fi
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@@ -376,8 +365,6 @@ distclean-hdr:
 	-rm -f config.h stamp-h1
 ppl.lsm: $(top_builddir)/config.status $(srcdir)/ppl.lsm.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
-ppl.spec: $(top_builddir)/config.status $(srcdir)/ppl.spec.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -387,7 +374,6 @@ clean-libtool:
 
 distclean-libtool:
 	-rm -f libtool
-uninstall-info-am:
 
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
@@ -420,8 +406,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -465,8 +450,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -491,8 +476,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -502,13 +487,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -523,24 +507,22 @@ distclean-tags:
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
-	mkdir $(distdir)
-	$(mkdir_p) $(distdir)/. $(distdir)/debian $(distdir)/doc $(distdir)/interfaces/C $(distdir)/m4 $(distdir)/src
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	test -d $(distdir) || mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -554,7 +536,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -562,14 +544,19 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
 	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
 	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
 	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r $(distdir)
 dist-gzip: distdir
 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
@@ -578,6 +565,10 @@ dist-bzip2: distdir
 	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
 	$(am__remove_distdir)
 
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
 dist-tarZ: distdir
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__remove_distdir)
@@ -606,6 +597,8 @@ distcheck: dist
 	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
@@ -645,7 +638,7 @@ distcheck: dist
 	$(am__remove_distdir)
 	@(echo "$(distdir) archives ready for distribution: "; \
 	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
 distuninstallcheck:
 	@cd $(distuninstallcheck_dir) \
 	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
@@ -689,6 +682,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -715,12 +709,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am:
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -741,27 +743,38 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
-	check-am clean clean-generic clean-libtool clean-recursive \
-	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
-	dist-shar dist-tarZ dist-zip distcheck distclean \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-recursive distclean-tags distcleancheck distdir \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+	dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-zip \
+	distcheck distclean distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags distcleancheck distdir \
 	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
 	install-strip installcheck installcheck-am installdirs \
 	installdirs-am maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am uninstall-info-am
-
-
- at SET_MAKE@
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-recursive uninstall uninstall-am
+
+
+dist-hook:
+	sed -e "s/^enableval=thorough$$/enableval=quick/g" \
+		<$(distdir)/configure.ac >$(distdir)/configure.ac.new \
+	&& touch $(distdir)/configure.ac.new -r $(distdir)/configure.ac \
+	&& mv -f $(distdir)/configure.ac.new $(distdir)/configure.ac
+	sed -e "s/^enableval=thorough$$/enableval=quick/g" \
+		<$(distdir)/configure >$(distdir)/configure.new \
+	&& touch $(distdir)/configure.new -r $(distdir)/configure \
+	&& mv -f $(distdir)/configure.new $(distdir)/configure \
+	&& chmod +x $(distdir)/configure
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/NEWS b/NEWS
index 83d1966..25a352a 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,172 @@ Parma Polyhedra Library NEWS -- history of user-visible changes
 
 
 --------------------------------------------------------------------------
+NEWS for version 0.10  (release date to be decided)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The Parma Polyhedra Library is now released under the terms of the
+   version 3 (or later) of the GNU General Public License.
+
+o  The new class Octagonal_Shape provides an implementation of the domain
+   of octagonal shapes (including optimized algorithms and a provably
+   correct widening and optimized algorithms) as proposed by Roberto Bagnara,
+   Patricia Hill, Elena Mazzi and Enea Zaffanella in their SAS 2005 paper.
+
+o  The class LP_Problem has been renamed MIP_Problem and now supports
+   the solution of Mixed Integer (Linear) Programming problems. Also
+   added support for the incremental solution of MIP problems: it is now
+   possible to add new space dimensions or new constraints to the
+   feasible region, as well as change the objective function and the
+   optimization mode, while still exploiting some of the computational
+   work done before these changes. See the documentation of class
+   MIP_Problem for a detailed description of the public interface.
+
+o  All PPL semantic objects now provide the method
+
+     int32_t hash_code() const
+
+   returning a 32-bit hash code for *this.  If x and y are such that
+   x == y evaluates to true, so does x.hash_code() == y.hash_code().
+
+o  The method relations_with(Congruence) has been added to the Polyhedron
+   class for compatibility with the Grid class methods.
+
+o  The class Polyhedra_Powerset has been renamed Pointset_Powerset,
+   since it can be applied to non-polyhedral abstractions, such as
+   the one offered by the Grid class.
+
+o  The new methods
+
+     bool Constraint_System::empty() const
+     bool Generator_System::empty() const
+     bool Congruence_System::empty() const
+     bool Grid_Generator_System::empty() const
+
+   return true if and only if the system in question is empty (i.e.,
+   it has no constraints, generators, congruences or grid-generators,
+   respectively).
+
+o  All identifiers containing the strings `less_than_or_equal' or
+   `greater_than_or_equal', any case, have been renamed so as to contain
+   `less_or_equal' or `greater_or_equal', respectively.
+
+o  Users of the C++ interface of the library can now decide to disable
+   the automatic initialization mechanism of the PPL.  To do so, the
+   preprocessor symbol PPL_NO_AUTOMATIC_INITIALIZATION should be defined
+   before including the `ppl.hh' header file.  When automatic initialization
+   is disabled it is imperative to explicitly call the new function
+
+     void Parma_Polyhedra_Library::initialize()
+
+   before using the library.  The new function
+
+     void Parma_Polyhedra_Library::finalize() and
+
+   should also be called (to release a small amount of memory) when
+   done with the library.
+
+o  In the C interface it is no longer an error to call ppl_initialize()
+   or ppl_finalize() multiple times (this matches the behavior of the
+   other interfaces).
+
+o  In the Octagonal_Shape, BD_Shape and Box domains:
+   add_congruences_and_minimize(Congruence_System cgs)
+   add_recycled_congruences(Congruence_System cgs)
+   add_recycled_congruences_and_minimize(Congruence_System& cgs)
+   widening_assign ...
+
+o  In the Octagonal_Shape domain:
+   add_recycled_constraints(Congruence_System cgs)
+   add_recycled_constraints_and_minimize(Congruence_System& cgs)
+   constructor from Box ...
+
+o  A new abstraction called Box has been added that ...
+
+o  can_recycle_constraint_systems()
+   can_recycle_congruence_systems() ...
+
+o  constrains(Variable var) ...
+
+o  unconstrain(Variable var)
+   unconstrain(const Variables_Set& to_be_unconstrained) ...
+
+o  contains_integer_point() ...
+
+o  Partially_Reduced_Product ...
+
+o  shrink_bounding_box has gone ...
+
+o  All PPL semantic objects can be constructed from other PPL semantic
+   objects. All these constructors have an optional complexity argument
+   with default value allowing algorithms with any complexity to be used.
+
+o  As all PPL semantic objects can now be constructed from boxes,
+   the constructors
+
+     template <typename Box> C_Polyhedron(const Box&, From_Bounding_Box),
+     template <typename Box> NNC_Polyhedron(const Box&, From_Bounding_Box),
+     template <typename Box> Grid(const Box&, From_Bounding_Box)
+
+   have been removed.
+
+o  The `ppl.hh' header file no longer defines macros not prefixed
+   by "PPL_".
+
+o  Added constructors so that objects of classes C_Polyhedron,
+   NNC_Polyhedron, Grid, Box, BD_Shape and Octagonal_Shape are always
+   constructible from one another.
+
+o  In the interfaces, the methods/functions/predicates named
+
+     ppl_ABSTRACTION_{constraints,generators,congruences}
+
+   and
+
+     ppl_ABSTRACTION_minimized_{constraints,generators,congruences}
+
+   have been renamed
+
+     ppl_ABSTRACTION_get_{constraints,generators,congruences}
+
+   and
+
+     ppl_ABSTRACTION_get_minimized_{constraints,generators,congruences},
+
+  respectively.
+
+o  In the interfaces, the interface procedures for
+   ppl_Grid_generalized_image_lhs_rhs/5 and
+   ppl_Grid_generalized_preimage_lhs_rhs/5
+   ppl_Grid_generalized_image/6 and
+   ppl_Grid_generalized_preimage/6
+   have been renamed as
+   ppl_Grid_generalized_image_lhs_rhs_with_congruence/5
+   ppl_Grid_generalized_preimage_lhs_rhs_with_congruence/5
+   ppl_Grid_generalized_image_with_congruence/6
+   ppl_Grid_generalized_preimage_with_congruence/6
+   so as to allow for /4 and /5, resp., versions
+
+
+Bugfixes
+========
+
+o  Fixed bugs that prevented building the library on systems not supported
+   by the Parma Watchdog Library or when the `--disable-watchdog' configure
+   was used.
+
+o  Fixed a bug in Grid::constraints() and Grid::minimized_constraints()
+   that caused an internal assertion to fail when the grid had 0 space
+   dimensions.
+
+o  Fixed a bug in Linear_System::insert(const Linear_Row&) whereby a
+   wrong result could have been obtained when inserting a not necessarily
+   closed constraint/generator in an empty system having a higher space
+   dimension.
+
+--------------------------------------------------------------------------
 NEWS for version 0.9  (released on March 12, 2006)
 --------------------------------------------------------------------------
 
@@ -148,7 +314,7 @@ o  Added Polyhedron methods difference_assign() and join_assign(),
 
 o  The helper function widen_fun_ref() building a limited widening
    function is now templatic even on the second argument (i.e., the
-   limiting constraint system). The templatic widening method
+   limiting constraint system). The template widening method
 
      Polyhedra_Powerset<PH>::BHZ03_widening_assign()
 
@@ -275,7 +441,7 @@ o  New functions added to the C interface:
    allow C applications to obtain information about the Coefficient
    integer numerical type.
 
-   The new Prolog interface predicates ppl_Coeffient_is_bounded/0,
+   The new Prolog interface predicates ppl_Coefficient_is_bounded/0,
    ppl_Coefficient_max/1 and ppl_Coefficient_min/1 provide the same
    functionality.
 
@@ -576,7 +742,7 @@ NEWS for version 0.6  (released on August 18, 2004)
 New and Changed Features
 ========================
 
-o  New templatic classes Determinate, PowerSet, and Polyhedra_PowerSet.
+o  New template classes Determinate, PowerSet, and Polyhedra_PowerSet.
    The first two classes realize, in a completely generic way, the
    determinate and powerset constructions described by Roberto Bagnara
    in his 1998, Science of Computer Programming paper.  The third class
@@ -791,7 +957,7 @@ o  Timeout computation facilities have been added to the Prolog interfaces:
    ppl_timeout_exception_atom/1, ppl_set_timeout/1, ppl_reset_timeout/0.
 
 o  Many efficiency improvements have been achieved.  Part of these have
-   been obtained by increasing the degree of "lazyness" of the library.
+   been obtained by increasing the degree of "laziness" of the library.
 
 o  Many portability and standard-conformance improvements: the library
    can now be compiled with GNU g++, Intel C++ Compiler 7.0 for Linux,
@@ -959,7 +1125,7 @@ o  New, complete C interface.  As a demo, a toy solver for pure linear
    as a demo is only a toy provided as a demo.
 
 o  Revised and completed Prolog interface:
-   - now supporting GNU Prolog, SICStus Prolog, SWI Prolog and YAP.
+   - now supporting GNU Prolog, SICStus Prolog, SWI-Prolog and YAP.
    - all predicates have been renamed to match their intended
      semantics;
    - arguments have been reordered where necessary so as to follow the
@@ -979,7 +1145,7 @@ o  Added support for timeout-guarded operations.  It is now possible
 o  The methods named convex_hull_* and convex_difference_*
    have been renamed poly_hull_* and poly_difference_*.
 
-o  All methods named *_and_minimize() now return a boolean
+o  All methods named *_and_minimize() now return a Boolean
    flag that is false if the result is empty.
 
 o  All method and variable names containing the word "vertex"
@@ -1006,10 +1172,10 @@ o  The methods Polyhedron::widening_assign() and
    of the widenings introduced in
 
      N. Halbwachs.
-     D�termination Automatique de Relations Lin�aires
-     V�rifi�es par les Variables d'un Programme.
-     Th�se de 3�me cicle d'informatique,
-     Universit� scientifique et m�dicale de Grenoble,
+     Détermination Automatique de Relations Linéaires
+     Vérifiées par les Variables d'un Programme.
+     Thèse de 3ème cicle d'informatique,
+     Université scientifique et médicale de Grenoble,
      Grenoble, France, March 1979.
 
    and described in
@@ -1042,7 +1208,7 @@ NEWS for version 0.3 (released on February 26, 2002)
 New Features
 ============
 
-o  The library has been ported under libtool: it is now possible
+o  The library has been ported under Libtool: it is now possible
    to build dynamic libraries as well.
 
 o  We now use the integer C++ class of GMP to represent the
@@ -1075,7 +1241,7 @@ o  Fixed Polyhedron::satisfies(const Constraint&) and
    Polyhedron::affine_image().
 
 o  Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
-   was erroneously returning a (random) boolean: it is now a void
+   was erroneously returning a (random) Boolean: it is now a void
    method.
 
 
diff --git a/README b/README
index f4a9509..21a3a7b 100644
--- a/README
+++ b/README
@@ -1,11 +1,11 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 See below for the copying conditions.
 
 
-Parma Polyhedra Library (Release 0.9)
+Parma Polyhedra Library (Release 0.10)
 =====================================
 
-This is the release 0.9 of the Parma Polyhedra Library:
+This is the release 0.10 of the Parma Polyhedra Library:
 a C++ library for (not necessarily closed) convex polyhedra
 and other numerical abstractions.
 
@@ -63,10 +63,10 @@ See http://www.cs.unipr.it/ppl/ for more information on the PPL.
 For any additional questions you might have, please do not hesitate to
 write to ppl-devel at cs.unipr.it.
 
-Here is the contents of the PPL 0.9 source distribution
+Here is the contents of the PPL 0.10 source distribution
 (27 directories, 924 files):
 
-ppl-0.9
+ppl-0.10
 |-- BUGS
 |-- COPYING
 |-- CREDITS
@@ -356,9 +356,9 @@ ppl-0.9
 |   |-- gpl.tex
 |   |-- gpl.txt
 |   |-- ppl-config.1
-|   |-- ppl-user-0.9-html.tar.gz
-|   |-- ppl-user-0.9.pdf
-|   |-- ppl-user-0.9.ps.gz
+|   |-- ppl-user-0.10-html.tar.gz
+|   |-- ppl-user-0.10.pdf
+|   |-- ppl-user-0.10.ps.gz
 |   |-- ppl.sty
 |   |-- ppl_lcdd.1
 |   |-- ppl_lpsol.1
@@ -1021,7 +1021,7 @@ ppl-0.9
 
 --------
 
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
@@ -1034,7 +1034,7 @@ of each distribution of the PPL in files called `fdl.*'.
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.  The license is included, in various
 formats, in the `doc' subdirectory of each distribution of the PPL in
 files called `gpl.*'.
diff --git a/README.configure b/README.configure
index 744cc4f..f3d2e0d 100644
--- a/README.configure
+++ b/README.configure
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 See below for the copying conditions.
 
 
@@ -6,11 +6,11 @@ Configuration of the Parma Polyhedra Library
 ============================================
 
 In an ideal situation (i.e., on a more or less standard Un*x
-environment, with the right compilers, the GMP library installed in
-a standard place and provided the user is satisfied with all the
-options we chose as defaults), a source distribution of the Parma
-Polyhedra Library (PPL) can be unpacked, configured, built and
-installed with the following, well-known procedure:
+environment, with the right compilers, the GMP library installed in a
+standard place and provided the user is satisfied with all the options
+we chose as defaults), a source distribution of the Parma Polyhedra
+Library (PPL) can be unpacked, configured, built and installed with
+the following, well-known procedure:
 
   $ tar jxf ppl-x.y.tar.bz2
   $ ./configure
@@ -19,8 +19,8 @@ installed with the following, well-known procedure:
   Password: <root password>
   $ make install
 
-After successful completion of these steps the PPL is completely installed
-on the system and can be used as expected.
+After successful completion of these steps the PPL is completely
+installed on the system and can be used as expected.
 
 On the other hand, the PPL `configure' shell script provides many
 options to adjust the build and installation process for customizing
@@ -106,31 +106,38 @@ library.  These switches are
   --with-cflags=XXX       add XXX to the options for the C compiler
   --with-cxxflags=XXX     add XXX to the options for the C++ compiler
 
+Among other things, the ability to specify the C and C++ compilation
+flags allows you to use special compilation options ---such as
+`-fno-threadsafe-statics'--- that, while not safe for general use,
+may be adequate for your particular application.
+
 Let us take the occasion to stress, once again, the fact that you
 _must_ use the same C++ compiler to compile the C++ interface of GMP,
 the PPL and your application, if you use the C++ interface of the PPL.
+It should be noted that no version of GCC prior to 4.0.3 is known to
+reliably compile PPL 0.10.
 
-Here is an example with the Intel C/C++ compiler version 8.1.  Assuming
-you have configured GMP with a command like
+Here is an example of configuration that uses the Intel C/C++ compiler
+version 10.1.  Assuming you have configured GMP with a command like
 
-  CC=icc CXX=icpc /path/to/gmp-4.1.4/configure --enable-cxx \
-    --prefix=/opt/intel_cc_80
+  CC=icc CXX=icpc /path/to/gmp-4.2.2/configure --enable-cxx \
+    --prefix=/opt/intel/cce/10.1.015
 
 you can configure the PPL with a command like
 
   /path/to/ppl-x.y/configure --with-cxx=icpc --with-cc=icc \
-    --with-cxxflags="-w2 -wd161,177,193,279,383,444,981,1188,1418" \
-    --with-libgmpxx-prefix=/opt/intel_cc_80
+    --with-cxxflags="-strict-ansi" \
+    --with-libgmpxx-prefix=/opt/intel/cce/10.1.015
 
 Notice that the `--with-cxxflags' option is absolutely non-essential
 here and is only included to show how extra compiler options can be
 passed to the configure script.
 
 As another example, here is how you can compile the PPL with
-Comeau C/C++ 4.3.3.  First configure GMP with a command like
+Comeau C/C++ 4.3.10.1.  First configure GMP with a command like
 
-  CXX=como /path/to/gmp-4.1.4/configure --enable-cxx \
-    --disable-shared --prefix=/usr/local/lib/como433/local
+  CXX=como /path/to/gmp-4.2.2/configure --enable-cxx \
+    --disable-shared --prefix=/opt/comeau/local
 
 Then you can configure the PPL with a command like
 
@@ -141,7 +148,7 @@ Then you can configure the PPL with a command like
 
 Notice the use of the option `--disable-shared' both in the configuration
 of GMP and the configuration of the PPL.  This is due to the fact that
-Comeau C/C++ 4.3.3 does not support shared libraries.
+Comeau C/C++ 4.3.10.1 does not support shared libraries.
 
 
 Enabling the Use of Alternative Coefficient Types
@@ -184,9 +191,47 @@ choices for TYPE are available:
   native-int32     use 32-bit *unchecked* integers
   native-int64     use 64-bit *unchecked* integers
 
+Configuring for the interfaces
+------------------------------
+
+The instantiations for the domains for interfaces other than the main
+C++ interface can be customized via the `instantiations' option for
+the PPL `configure' shell script.
+
+To enable the use of various kinds of instantiations, you can use
+the configure option
+
+--instantiations=DOMAINS
+
+where DOMAINS is an "@" separated list;
+the following options are currently supported:
+
+Polyhedron
+Grid
+BD_Shape<I>
+Octagonal_Shape<I>
+Pointset_Powerset<C_Polyhedron>
+Pointset_Powerset<NNC_Polyhedron>
+Pointset_Powerset<Grid>
+Pointset_Powerset<BD_Shape<I> >
+Pointset_Powerset<Octagonal_Shape<I> >
+
+where "I" can be
+	signed char
+	long
+	long long
+	int
+	short
+	mpz_class
+	mpq_class"
+
+Note that the domain "Polyhedron" must be specified
+without any topology "C_" and "NNC_" as they are added automatically
+and both the domains "C_Polyhedron" and "NNC_Polyhedron" will be generated.
+
 --------
 
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
@@ -199,7 +244,7 @@ of each distribution of the PPL in files called `fdl.*'.
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.  The license is included, in various
 formats, in the `doc' subdirectory of each distribution of the PPL in
 files are called `gpl.*'.
diff --git a/STANDARDS b/STANDARDS
index 6e9c002..386fc66 100644
--- a/STANDARDS
+++ b/STANDARDS
@@ -18,6 +18,11 @@ compound name.  By all means, avoid baStudlyCaps: write
 available_widening_tokens (if it is a variable) or
 Available_Widening_Tokens (if it is a class or enum); never write
 availableWideningTokens or AvailableWideningTokens.
+In general, we use:
+
+  lower_case for variables, methods, functions, typedefs;
+  UPPER_CASE for macros and enum values;
+  Mixed_Case for class names and template parameter names.
 
 
 Pre and post increment and decrement operators
@@ -38,9 +43,9 @@ algorithm should be specialized to use the swap method.
 Limiting the visibility of variables, functions, macros and so forth
 --------------------------------------------------------------------
 
-Avoid using the keyword "static" to specify that global variables or
+Avoid using the keyword `static' to specify that global variables or
 functions should be visible only inside the current translation unit;
-use the anonymous namespace, instead. The keyword "static" should
+use the anonymous namespace, instead. The keyword `static' should
 only appear inside class definitions or function bodies. As an example,
 
 static const char* s = "Not accessible by other translation units";
@@ -74,13 +79,13 @@ its impact as much as possible by naming objects in a conspicuous way
 and by limiting as much as possible the scope of declarations.
 This means
 
-- all C and C++ macros should have names prefixed by "PPL_";
+- all C and C++ macros should have names prefixed by `PPL_';
   those that are not meant to be directly accessible by the user should
   be #undef'ed as soon as possible in the source file they are defined in;
 - all functions and types declared by the C interface should have
-  names prefixed by "ppl_";
+  names prefixed by `ppl_';
 - all Prolog predicates declared by the Prolog interfaces should have
-  names prefixed by "ppl_".
+  names prefixed by `ppl_'.
 
 
 Macros
@@ -100,7 +105,7 @@ Trailing whitespace
 -------------------
 
 Always avoid trailing whitespace.
-If you use emacs, then all the trailing whitespace in the current
+If you use Emacs, then all the trailing whitespace in the current
 buffer can be removed by using the command
 
   M-x delete-trailing-whitespace
@@ -157,7 +162,7 @@ non-empty lines here start at column 0;
 
 } // namespace Parma_Polyhedra_Library
 
-If you use emacs, you may want to put the following two lines in your
+If you use Emacs, you may want to put the following two lines in your
 .emacs:
 
 ;; Disable indentation when in namespace blocks.
@@ -202,14 +207,14 @@ Source code should be organized so as to ensure that:
   - each file is of manageable size.
 
 As a rule of thumb, each type (class, struct, class template, etc.)
-named "Xtype" that is relevant on its own for the user or the
+named `Xtype' that is relevant on its own for the user or the
 developer of the library should be provided with a set of source files
-whose filenames start with "Xtype". The source files for such a type
+whose filenames start with `Xtype'. The source files for such a type
 should be named and populated as follows:
 
 a) Xtype.types.hh
 Contains the forward declarations of type names (in particular, the
-one for "Xtype") and other useful typedef's.
+one for `Xtype') and other useful typedef's.
 
 b) Xtype.defs.hh
 Contains the definition of the type, together with the declaration of
@@ -321,7 +326,7 @@ Standards for Documenting the Project with Doxygen
    (but that are useful for the developers) should be surrounded by
 
      #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-	//! ... doxygen comments ...
+	//! ... Doxygen comments ...
      #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 
    so that they will only appear in the developer's reference.
@@ -360,7 +365,7 @@ Standards for Documenting the Project with Doxygen
    Typically, this will be the only kind of Doxygen command
    occurring in *.inlines.hh and *.cc source files.
 
-   If Classname is a templatic class, the arguments of the template
+   If Classname is a template class, the arguments of the template
    (as well as the angle brackets) should be omitted.
    The namespace qualification of the class can be omitted, provided
    the comment block is included in the namespace scope.
@@ -421,16 +426,20 @@ o  The test functions should be written
 
         // Comment describing the test...
         bool
-          test10() {
+        test10() {
             // ... test code ...
         }
 
-   where the 10 in "test10" indicates that it is the 10th test function
+   where the 10 in `test10' indicates that it is the 10th test function
    in the program.
 
 o  The test functions should return true if the test succeeds and false
    if it fails.
 
+o  If a test requires auxiliary functions and/or classes, put them
+   in a namespace named, e.g., `test10_namespace', which in turn is
+   within the anonymous namespace.
+
 o  Following all the test functions, include:
 
         BEGIN_MAIN
@@ -441,6 +450,26 @@ o  Following all the test functions, include:
 
    where every test function in the program is included in the list.
 
+o  If any of the tests is known to fail due to an overflow when the
+   library is configured to use some of the bounded-precision checked
+   integers, then the corresponding test function should be called,
+   e.g., as follows
+
+          DO_TEST_F32(test07);
+
+   where the subscript "_F32" means that the overflow is expected for
+   all checked integers having 32 bits at most (i.e., 64 bits checked
+   integers are not expected to overflow). As an alternative,
+
+          DO_TEST_F32A(test07);
+
+   means that the overflow is expected, as before, for all checked
+   integers having less than 32 bits but in the case of 32 bits checked
+   integers the overflow occurs only if assertions are enabled.
+   Hence, the possible subscripts for DO_TEST are:
+
+          _F8A, _F8, _F16A, _F16, _F32A, _F32, _F64A, _F64.
+
 o  Normally, test code should produce no output at all (independently from
    whether the test succeeded or failed). Output is only meant to help
    during debugging. In order to support for the coding of conditional
@@ -487,3 +516,61 @@ o  Refer to the existing tests for examples. Many tests are written along
      b) create a second object in a different (maybe simpler) way, having
         as value the expected result of the computations done in point a);
      c) check for equivalence of the two objects.
+
+o  Ideally the tests should exercise every line of code in the library.
+   To help ensure that, the test-coverage facilities provided by GCC
+   are very useful.  They are described in Chapter 9 of the GCC manual
+   ("`gcov'---a Test Coverage Program").  For a shorter introduction,
+   the build tree under test must be configured with the
+   `--enable-coverage' and `--disable-optimization options' (and possibly
+   also with --enable-profiling).  For example:
+
+     $ configure --enable-coverage --disable-optimization \
+                 --enable-profiling \
+                 --enable-assertions --enable-more-assertions
+
+   Running the tests (with `make check') produces many .gcno and .gcda
+   files in src/.libs and in the test directories.  These are data
+   files for the `gcov' program.  The `gcov' program produces coverage
+   information.  For example:
+
+     $ cd src
+     $ gcov -o .libs Grid_public.cc
+
+   will produce a file called Grid_public.cc.gcov containing the
+   coverage information for Grid_public.cc.  In a similar way
+
+     $ cd tests/Grid
+     $ gcov *.cc
+
+   will produce a file call tests/Grid/ppl.hh.gcov containing coverage
+   information for the header files.
+
+   Below is a section from a .gcov file.  The first column is the
+   number of times the line was run, the second is the line number of the
+   line in the source file.  Line 1006 has been run 48245 times.  Lines
+   1007, 1002 and 1013 have yet to be run.  It would be very difficult
+   to run line 1007, since this requires a Linear_System that does not
+   satisfy the invariants for its class and the PPL does everything it
+   can to make that impossible without fiddling with memory using raw
+   memory pointers.  Similarly for line 1013.  However, the fact that
+   line 1012 has never been run is suspicious and may indicate an area
+   that needs testing.
+
+        -: 1001:bool
+    48245: 1002:PPL::Generator_System::OK() const {
+        -: 1003:  // A Generator_System must be a valid Linear_System; do not check for
+        -: 1004:  // strong normalization, since this will be done when
+        -: 1005:  // checking each individual generator.
+    48245: 1006:  if (!Linear_System::OK(false))
+    #####: 1007:    return false;
+        -: 1008:
+        -: 1009:  // Checking each generator in the system.
+    48245: 1010:  const Generator_System& x = *this;
+    96490: 1011:  for (dimension_type i = num_rows(); i-- > 0; )
+    #####: 1012:    if (!x[i].OK())
+    #####: 1013:      return false;
+        -: 1014:
+        -: 1015:  // All checks passed.
+    48245: 1016:  return true;
+        -: 1017:}
diff --git a/TODO b/TODO
index 0254a33..aa3fdfb 100644
--- a/TODO
+++ b/TODO
@@ -2,44 +2,142 @@
 Enhancements for PPL 0.10
 =========================
 
-- Develop a C and Prolog interfaces for all the supported domains.
-- Incorporate the domain of intervals.
-- Reduce the number of FIXMEs to no more than 20.
+- Make
+
+    void set_rounding_for_PPL()
+    void restore_pre_PPL_rounding()
+
+  available in all the interfaces.
+
+- The definition.dox file still talks about "polyhedra powersets":
+  this must be changed to describe the notion of "pointset powerset".
+
+- Document --enable-interfaces and --enable-instantiations in the
+  README.configure file.
+
+- Fix the handling of interfaces/Prolog/tests/ppl_predicate_check_common.pl
+  (it is removed by `make distclean', it is sometimes copied unconditionally,
+  sometimes conditionally, ...).
+
+- Write interfaces/OCaml/README.ocaml.
+
+- Provide PPL-specific documentation on the use of `make check'.
+
+- Modify all methods add_constraint(s)/congruence(s) to reflect what
+  is said in definitions.dox wrt the throwing of exceptions; modify
+  all of the tests accordingly (when in doubt, a user application
+  has to use the refine_with methods); also pay attention to
+  constructors taking a syntactic description as argument.
+
+- Add a short section to the user documentation explaining how to
+  compile and link (at least under Un*x) an application using the PPL
+  through the C and C++ interface (this information is already provided
+  for the Prolog interfaces).  This section should also mention the
+  programs in the demos directory (they constitute additional examples
+  of use of the C and C++ interfaces) and in the directories under tests
+  (these are currently covered by a README file).
+- Define functions rem() and remp() to compute the remainder of division
+  in the general case, for rem(), and in the case where the second
+  argument is known to be positive, for remp().  In the implementation
+  of rem(), if CXX_HAS_REMAINDER_BUG is nonzero, a suitable workaround
+  should be implemented to circumvent the INT_MIN % -1 bug.
+  rem() and remp() should be used (with a strong preference to the second,
+  of course) wherever we now use operator%().
+- Update the examples in README.configure.
+- Check all the Makefile.am's to make sure CLEANFILES, MOSTLYCLEANFILES
+  and DISTCLEANFILES are used in a sensible way.
+- Ensure the tests in tests/MIP_Problem/* cover every line of
+  code in MIP_Problem.*.
+- `make check' in ppl_lpsol must run also the incremental version
+  of the simplex solver.
+- MIP_Problem: ensure ascii_load() and operator<< are correct.
 - Complete the manual pages for ppl-config, ppl_lpsol and ppl_lcdd.
 - Write a manual page for ppl (3).
-- Ensure that the Grid tests cover all the code.
-- Provide a single, generic implementation to replace all our status
-  classes.
 - Clearly explain, in the documentation, how (not) to use
   set_GMP_memory_allocation_functions().  More generally, explain how
   to have memory-guarded computations.
-- Reconsider the handling of temporary coefficients.
-- Provide a generic implementation for the `widening with tokens'.
-- Transform LP_Problem into an incremental solver and add to it support
-  for abandoning costly computations.
-- Add a widening for grids using only generator representations.
+- Octagonal_Shape relation_with_constraints and BD_Shape
+  relation_with_constraints should consider constraints
+  that are not octagonal, resp., bd_shapes; at present
+  they throw an exception when these conditions are not met.
+- Octagonal_Shape relation_with_congruences and BD_Shape
+  relation_with_congruences construct the equivalent polyhedron
+  and use the Polyhedron relation_with_congruences method.
+  These should be rewritten to work directly with the shape domain.
 
+Enhancements for PPL 0.11 or later versions
+===========================================
 
-Enhancements for PPL 0.10 or later versions
-==========================================
+- Suppose we want to sum three numbers, and suppose we do it by
 
-- Implement void Polyhedron::envelope_assign(const Polyhedron& y).
+    add(T& to, const T& x, const T& y, const T& z) {
+      add(to, x, y);
+      add(to, to, z);
+    }
+
+  Now suppose that &to == &z, so that we compute the wrong result.
+  Perform a code audit to ensure that the above situation never happens.
+  In order to ensure that, ensure that the following rule (to be added
+  to STANDARDS) is always obeyed:
+
+    if an argument of type T and passed by reference is changed,
+    after the change no argument of type U and passed by const or
+    non-const reference should be read unless U is incompatible with T
+    or we are otherwise 100% sure that the changed argument and the
+    argument that is read afterward are not aliases (in the latter
+    case an assert(&to != &z) shall be added.
+- Improve the handling of the --enable-instantiations configure
+  option so that "closure by subdomain" is automatically implemented
+  (e.g., if Pointset_Powerset(X) is specified, X should be automatically
+  added in case it is not already present).
+- Add a "quick assign" function to checked numbers that allows
+  to efficiently assign small integer constants (like those in
+  the range [-2, 2]) that are guaranteed not to cause any
+  rounding or overflow problems.
+- Consider whether or not our interface for method time_elapse_assign()
+  is the one needed by users: in particular, see if it should take as
+  an argument a generator system, instead of an abstract element.
+- Finish the domain of intervals.
+- Reduce the number of FIXMEs to no more than 20.
+- Provide a generic implementation for the `widening with tokens'.
+- In the OK() methods, instead of having all those #ifndef NDEBUG,
+  it is probably worthwhile to use a suitable defined `barf' stream
+  that does the right thing.
+- Using meta_programming.hh it is possible to define all the swap functions
+  "automatically".  Consider whether it is worth doing it.
+- Provide a single, generic implementation to replace all our status
+  classes.
 - Implement the extrapolation operators defined in HenzingerH95
   and HenzingerPW01.
+- Implement void Polyhedron::envelope_assign(const Polyhedron& y).
+- Provide support for strict inequalities in MIP problems.
 - See whether, using the techniques described in
   ftp://ftp.ifor.math.ethz.ch/pub/fukuda/reports/polyunion001120.ps.gz
   we can implement bool poly_hull_assign_if_exact(PH& p, const PH& q),
   temporarily in algorithms.hh, more efficiently.
 - Provide optimized implementations of Polyhedron::expand_dimension()
   Polyhedron::fold_dimensions().
-- Experiment with different compilation flags, such as GCC's
-  `-fno-threadsafe-statics'.
-- Reimplement the ask-and-tell generic construction.
 - Suppose we are only interested in integral solutions (as is the
   case, e.g., in most termination analyses).  Then cutting-plane methods
-  (Gomory, Chv�tal, ...) allow to shrink polyhedra still not losing any
+  (Gomory, Chvátal, ...) allow to shrink polyhedra still not losing any
   integral solution.
   See http://www.cs.unipr.it/ppl/Documentation/bibliography#NemhauserW88
+  Check the work by Kent Andersen and Gérard Cornuéjols on
+  reduce-and-split cuts.
+- Add an implementation of Minkowski addition.  Check the algorithm
+  described in
+
+    K. Fukuda.
+    From the zonotope construction to the Minkowski addition
+    of convex polytopes.
+    J. Symbolic Comput., 38(4):1261–1272, 2004.
+
+- Pointset_Powerset and Partially_Reduced_Product domains:
+  Improve and add to the existing methods for the powerset and product domains
+  so that they can be subdomains of themselves and of each other;
+  tidy the tests directories for these domains and ensure the code
+  with all likely instantiations is fully tested;
+  add the same functionaity to the C, Java, OCaml and Prolog interfaces.
 
 
 Efficiency Issues
@@ -47,12 +145,12 @@ Efficiency Issues
 
 - There must be a more efficient way to implement
   bool Polyhedron::is_disjoint_from(const Polyhedron&).
-- There must be a more efficient way to compute convex
-  differences.
+- There must be a more efficient way to compute convex differences.
 - We are being rather careless about the creation of temporaries
   as far as the classes Linear_Expression, Constraint and Generator
   are concerned.
-
+- Provide a better implementation of computing squares in MIP_Problem's
+  steepest-edge to avoid big numbers.
 
 Debian packaging
 ================
diff --git a/Watchdog/COPYING b/Watchdog/COPYING
index 3912109..94a9ed0 100644
--- a/Watchdog/COPYING
+++ b/Watchdog/COPYING
@@ -1,285 +1,626 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
 
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-			    Preamble
+                            Preamble
 
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
 your programs, 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.
+them 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 software, or if you modify it.
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
 
   For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
 
   The precise terms and conditions for copying, distribution and
 modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-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 give any other recipients of the Program a copy of this License
-along with the Program.
-
-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.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-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 Program, 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 Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) 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; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, 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 executable.  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.
-
-If distribution of executable or 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 counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program 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.
-
-  5. 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 Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program 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
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
 this License.
 
-  7. 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
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program 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 Program.
-
-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.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program 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.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 Program
-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 Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, 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
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	    How to Apply These Terms to Your New Programs
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
 
   If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
@@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
 
   To do so, attach the following notices to the program.  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
+state 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 program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>
 
-    This program is free software; you can redistribute it and/or modify
+    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
+    the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
 
     This program is distributed in the hope that it will be useful,
@@ -304,37 +645,30 @@ the "copyright" line and a pointer to where the full notice is found.
     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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 Also add information on how to contact you by electronic and paper mail.
 
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
 
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.
 
 The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Watchdog/ChangeLog b/Watchdog/ChangeLog
index 278f82e..e5ce44e 100644
--- a/Watchdog/ChangeLog
+++ b/Watchdog/ChangeLog
@@ -1,6 +1,647 @@
-2006-03-12  Release Manager
+2008-06-06 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
 
-	* PPL 0.9 Released.
+	* .cvsignore, ChangeLog, INSTALL, config.guess, config.sub,
+	  configure.ac, depcomp, install-sh, ltmain.sh,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/fdl.dox, doc/gpl.dox,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, m4/libtool.m4, m4/ltoptions.m4, m4/ltsugar.m4,
+	  m4/ltversion.m4, m4/lt~obsolete.m4, src/.cvsignore
+	  (simplex.[1,4,3,5,5,3,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2]): Fifth
+	  merge of the trunk to the `simplex' branch.
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.45), ltmain.sh (1.23), m4/libtool.m4 (1.5),
+	  m4/ltoptions.m4 (1.3), m4/ltversion.m4 (1.4), m4/lt~obsolete.m4
+	  (1.2): Updated to Libtool 2.2.4.
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/libtool.m4 (simplex.1): file libtool.m4 was added on branch
+	  simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltversion.m4 (simplex.1): file ltversion.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-04-02 Wednesday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.22), m4/libtool.m4 (1.4), m4/ltoptions.m4 (1.2),
+	  m4/ltversion.m4 (1.3): Updated from Libtool 2.2.2.
+
+2008-03-22 Saturday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.tex (1.5), fdl.dox (1.2), gpl.dox (1.3), user.tex
+	  (1.5): Properly named page anchors so as to avoid undefined
+	  references in the LaTeX documentation.
+
+2008-03-22 Saturday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.2), devref.doxyconf-latex.in
+	  (1.2), user.doxyconf-html.in (1.3), user.doxyconf-latex.in (1.3):
+	  Doxygen configuration files upgraded.
+
+2008-03-18 Tuesday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.17): Updated.
+
+2008-03-08 Saturday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.21), m4/libtool.m4 (1.3), m4/ltversion.m4 (1.2):
+	  Updated from Libtool 2.3a.
+
+2008-03-05 Wednesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.44): Use the new style macro to initialize
+	  Libtool.
+
+2008-03-05 Wednesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.20), m4/libtool.m4 (1.2): Updated to the CVS HEAD
+	  version of Libtool: this seems to solve the problems we
+	  experienced since the switch to Libtool 2.2.
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on branch
+	  simplex on 2008-06-06 14:21:55 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.25), ltmain.sh (1.19), m4/libtool.m4 (1.1),
+	  m4/ltoptions.m4 (1.1), m4/ltsugar.m4 (1.1), m4/ltversion.m4
+	  (1.1), m4/lt~obsolete.m4 (1.1): Switched to Libtool 2.2.
+
+2008-01-22 Tuesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.7), config.guess (1.24), config.sub (1.23), depcomp
+	  (1.10), install-sh (1.15): Updated from Automake 1.10.1.
+
+2008-01-09 Wednesday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.7), src/.cvsignore (1.3): Ignore *.loT files.
+
+2008-01-09 Wednesday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.6): Updated.
+
+2008-01-07 Monday 12:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, compile,
+	  config.guess, config.sub, configure.ac, ltmain.sh,
+	  doc/.cvsignore, doc/Makefile.am, doc/README.doc,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/fdl.dox, doc/fdl.tex, doc/fdl.txt,
+	  doc/gpl.dox, doc/gpl.tex, doc/gpl.txt, doc/pwl.sty,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, m4/.cvsignore, m4/Makefile.am,
+	  m4/ax_prefix_config_h.m4, src/Doubly_Linked_Object.defs.hh,
+	  src/Doubly_Linked_Object.inlines.hh,
+	  src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+	  src/EList.inlines.hh, src/EList.types.hh,
+	  src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+	  src/EList_Iterator.types.hh, src/Handler.defs.hh,
+	  src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+	  src/Pending_Element.cc, src/Pending_Element.defs.hh,
+	  src/Pending_Element.inlines.hh, src/Pending_Element.types.hh,
+	  src/Pending_List.cc, src/Pending_List.defs.hh,
+	  src/Pending_List.inlines.hh, src/Pending_List.types.hh,
+	  src/Time.cc, src/Time.defs.hh, src/Time.inlines.hh,
+	  src/Time.types.hh, src/Watchdog.cc, src/Watchdog.defs.hh,
+	  src/Watchdog.inlines.hh, src/Watchdog.types.hh,
+	  src/pwl_header.hh, utils/Makefile.am, utils/build_header.in
+	  (simplex.[1,3,2,3,2,3,1,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,3,2]):
+	  Fourth merge of the trunk to the `simplex' branch.  The `simplex'
+	  branch is open again.
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.33), README (1.17), configure.ac (1.43),
+	  doc/Makefile.am (1.4), doc/README.doc (1.3), doc/devref.tex
+	  (1.4), doc/pwl.sty (1.3), doc/user.tex (1.4), m4/Makefile.am
+	  (1.3), src/Doubly_Linked_Object.defs.hh (1.5),
+	  src/Doubly_Linked_Object.inlines.hh (1.5),
+	  src/Doubly_Linked_Object.types.hh (1.4), src/EList.defs.hh (1.7),
+	  src/EList.inlines.hh (1.5), src/EList.types.hh (1.4),
+	  src/EList_Iterator.defs.hh (1.5), src/EList_Iterator.inlines.hh
+	  (1.5), src/EList_Iterator.types.hh (1.4), src/Handler.defs.hh
+	  (1.6), src/Handler.inlines.hh (1.5), src/Handler.types.hh (1.4),
+	  src/Makefile.am (1.13), src/Pending_Element.cc (1.6),
+	  src/Pending_Element.defs.hh (1.6), src/Pending_Element.inlines.hh
+	  (1.5), src/Pending_Element.types.hh (1.4), src/Pending_List.cc
+	  (1.6), src/Pending_List.defs.hh (1.6),
+	  src/Pending_List.inlines.hh (1.5), src/Pending_List.types.hh
+	  (1.4), src/Time.cc (1.6), src/Time.defs.hh (1.6),
+	  src/Time.inlines.hh (1.5), src/Time.types.hh (1.4),
+	  src/Watchdog.cc (1.8), src/Watchdog.defs.hh (1.8),
+	  src/Watchdog.inlines.hh (1.5), src/Watchdog.types.hh (1.4),
+	  src/pwl_header.hh (1.6), utils/Makefile.am (1.9),
+	  utils/build_header.in (1.6): Copyright years extended.
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am, m4/Makefile.am (simplex.[1,1]): file Makefile.am
+	  was added on branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc (simplex.1): file README.doc was added on branch
+	  simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.tex (simplex.1): file devref.tex was added on branch
+	  simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/pwl.sty (simplex.1): file pwl.sty was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.tex (simplex.1): file user.tex was added on branch
+	  simplex on 2008-01-07 11:15:25 +0000
+
+2007-10-14 Sunday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.defs.hh (1.7): Non-standard qualification removed.
+
+2007-10-09 Tuesday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.6): The `make uninstall' command is now mentioned in
+	  the INSTALL file.
+
+2007-09-15 Saturday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.12): Made clean up independent from
+	  configuration.
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.10), doc/devref.tex (1.3), doc/gpl.dox (1.2), doc/gpl.tex
+	  (1.2), doc/gpl.txt (1.2), doc/user.tex (1.3): The Parma Watchdog
+	  Library is now released under the terms of the version 3 (or
+	  later) of the GNU General Public License.
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.dox (simplex.1): file gpl.dox was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.tex (simplex.1): file gpl.tex was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.txt (simplex.1): file gpl.txt was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2007-09-12 Wednesday 09:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.42): Do not allow AC_PROG_CC and AC_PROG_CXX to
+	  affect CFLAGS and CXXFLAGS.
+
+2007-09-10 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.41): Added a comment about the positioning of
+	  AC_PROG_CC and AC_PROG_CXX.
+
+2007-09-10 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.40): Pass the no-define option to
+	  AM_INIT_AUTOMAKE.
+
+2007-09-10 Monday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.7), config.guess (1.23), config.sub (1.22): Updated.
+
+2007-09-10 Monday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.39): Corrections to the handling of compilation
+	  flags.
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.2), user.doxyconf-latex.in (1.2):
+	  Updated to Doxygen 1.5.3-20070815.
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.doxyconf-html.in (simplex.1): file user.doxyconf-html.in
+	  was added on branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.doxyconf-latex.in (simplex.1): file
+	  user.doxyconf-latex.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-07-30 Monday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.32): Added a comment on the need to explicitly
+	  clean files generated by macro AX_PREFIX_CONFIG_H.
+
+2007-07-29 Sunday 16:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.31): The prefixed configuration header and
+	  _config.sed added to DESTCLEANFILES.
+
+2007-07-12 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.4), Makefile.am (1.30), README (1.16), configure.ac
+	  (1.38), doc/Makefile.am (1.3), doc/README.doc (1.2),
+	  doc/devref.tex (1.2), doc/pwl.sty (1.2), doc/user.tex (1.2),
+	  m4/Makefile.am (1.2), src/Doubly_Linked_Object.defs.hh (1.4),
+	  src/Doubly_Linked_Object.inlines.hh (1.4), src/EList.defs.hh
+	  (1.6), src/EList.inlines.hh (1.4), src/EList_Iterator.defs.hh
+	  (1.4), src/EList_Iterator.inlines.hh (1.4), src/Handler.defs.hh
+	  (1.5), src/Handler.inlines.hh (1.4), src/Makefile.am (1.11),
+	  src/Pending_Element.cc (1.5), src/Pending_Element.defs.hh (1.5),
+	  src/Pending_Element.inlines.hh (1.4), src/Pending_List.cc (1.5),
+	  src/Pending_List.defs.hh (1.5), src/Pending_List.inlines.hh
+	  (1.4), src/Time.cc (1.5), src/Time.defs.hh (1.5),
+	  src/Time.inlines.hh (1.4), src/Watchdog.cc (1.7),
+	  src/Watchdog.defs.hh (1.6), src/Watchdog.inlines.hh (1.4),
+	  src/pwl_header.hh (1.5), utils/Makefile.am (1.8),
+	  utils/build_header.in (1.5): Started the upgrade to GPL version 3
+	  or later.
+
+2007-07-04 Wednesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.29): Added `m4' to `SUBDIRS'.
+
+2007-06-28 Thursday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.18): Updated from Libtool 1.5.24.
+
+2007-06-08 Friday 18:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.37): Do not override the externally-provided
+	  CFLAGS and CXXFLAGS.
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/.cvsignore (simplex.1): file .cvsignore was added on branch
+	  simplex on 2008-01-07 11:15:25 +0000
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ax_prefix_config_h.m4 (simplex.1): file ax_prefix_config_h.m4
+	  was added on branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.28), NEWS (1.9), configure.ac (1.36),
+	  m4/.cvsignore (1.1), m4/Makefile.am (1.1),
+	  m4/ax_prefix_config_h.m4 (1.1), src/Makefile.am (1.10),
+	  src/Pending_Element.cc (1.4), src/Pending_List.cc (1.4),
+	  src/Time.cc (1.4), src/Watchdog.cc (1.6), src/Watchdog.defs.hh
+	  (1.5), src/pwl_header.hh (1.4): The `pwl.hh' header file no
+	  longer defines macros not prefixed by "PWL_".
+
+2007-05-21 Monday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.17): Updated from Libtool 1.5.23b.
+
+2007-03-11 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.2): No longer mention README.configure.
+
+2007-02-25 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, README, configure.ac, doc/.cvsignore,
+	  doc/Makefile.am, doc/README.doc, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex, doc/fdl.dox,
+	  doc/fdl.tex, doc/fdl.txt, doc/gpl.dox, doc/gpl.tex, doc/gpl.txt,
+	  doc/pwl.sty, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex,
+	  src/Doubly_Linked_Object.defs.hh,
+	  src/Doubly_Linked_Object.inlines.hh,
+	  src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+	  src/EList.inlines.hh, src/EList.types.hh,
+	  src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+	  src/EList_Iterator.types.hh, src/Handler.defs.hh,
+	  src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+	  src/Pending_Element.cc, src/Pending_Element.defs.hh,
+	  src/Pending_Element.inlines.hh, src/Pending_Element.types.hh,
+	  src/Pending_List.cc, src/Pending_List.defs.hh,
+	  src/Pending_List.inlines.hh, src/Pending_List.types.hh,
+	  src/Time.cc, src/Time.defs.hh, src/Time.inlines.hh,
+	  src/Time.types.hh, src/Watchdog.cc, src/Watchdog.defs.hh,
+	  src/Watchdog.inlines.hh, src/Watchdog.types.hh,
+	  src/pwl_header.hh, utils/Makefile.am, utils/build_header.in
+	  (altnum.[7,4,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]):
+	  Tenth merge of the main trunk to the `altnum' branch.
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/.cvsignore (altnum.1): file .cvsignore was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/.cvsignore (simplex.1): file .cvsignore was added on branch
+	  simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (altnum.1): file Makefile.am was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc (altnum.1): file README.doc was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (altnum.1): file
+	  devref.doxyconf-html.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (simplex.1): file
+	  devref.doxyconf-html.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-latex.in (altnum.1): file
+	  devref.doxyconf-latex.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-latex.in (simplex.1): file
+	  devref.doxyconf-latex.in was added on branch simplex on
+	  2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.tex (altnum.1): file devref.tex was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.dox (altnum.1): file fdl.dox was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.dox (simplex.1): file fdl.dox was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.tex (altnum.1): file fdl.tex was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.tex (simplex.1): file fdl.tex was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.txt (altnum.1): file fdl.txt was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.txt (simplex.1): file fdl.txt was added on branch simplex
+	  on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.dox (altnum.1): file gpl.dox was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.tex (altnum.1): file gpl.tex was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.txt (altnum.1): file gpl.txt was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/pwl.sty (altnum.1): file pwl.sty was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.doxyconf-html.in (altnum.1): file user.doxyconf-html.in
+	  was added on branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.doxyconf-latex.in (altnum.1): file
+	  user.doxyconf-latex.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.tex (altnum.1): file user.tex was added on branch altnum
+	  on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.27), configure.ac (1.35), doc/.cvsignore (1.1),
+	  doc/Makefile.am (1.1), doc/README.doc (1.1),
+	  doc/devref.doxyconf-html.in (1.1), doc/devref.doxyconf-latex.in
+	  (1.1), doc/devref.tex (1.1), doc/fdl.dox (1.1), doc/fdl.tex
+	  (1.1), doc/fdl.txt (1.1), doc/gpl.dox (1.1), doc/gpl.tex (1.1),
+	  doc/gpl.txt (1.1), doc/pwl.sty (1.1), doc/user.doxyconf-html.in
+	  (1.1), doc/user.doxyconf-latex.in (1.1), doc/user.tex (1.1):
+	  Documentation for the Parma Watchdog Library.
+
+2007-02-18 Sunday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.doc (ppl-0_9-branch.1): Explains where to find the
+	  documentation.
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.26), README (1.15), configure.ac (1.34),
+	  src/Doubly_Linked_Object.defs.hh (1.3),
+	  src/Doubly_Linked_Object.inlines.hh (1.3),
+	  src/Doubly_Linked_Object.types.hh (1.3), src/EList.defs.hh (1.5),
+	  src/EList.inlines.hh (1.3), src/EList.types.hh (1.3),
+	  src/EList_Iterator.defs.hh (1.3), src/EList_Iterator.inlines.hh
+	  (1.3), src/EList_Iterator.types.hh (1.3), src/Handler.defs.hh
+	  (1.4), src/Handler.inlines.hh (1.3), src/Handler.types.hh (1.3),
+	  src/Makefile.am (1.9), src/Pending_Element.cc (1.3),
+	  src/Pending_Element.defs.hh (1.4), src/Pending_Element.inlines.hh
+	  (1.3), src/Pending_Element.types.hh (1.3), src/Pending_List.cc
+	  (1.3), src/Pending_List.defs.hh (1.4),
+	  src/Pending_List.inlines.hh (1.3), src/Pending_List.types.hh
+	  (1.3), src/Time.cc (1.3), src/Time.defs.hh (1.4),
+	  src/Time.inlines.hh (1.3), src/Time.types.hh (1.3),
+	  src/Watchdog.cc (1.5), src/Watchdog.defs.hh (1.4),
+	  src/Watchdog.inlines.hh (1.3), src/Watchdog.types.hh (1.3),
+	  src/pwl_header.hh (1.3), utils/Makefile.am (1.7),
+	  utils/build_header.in (1.4): Copyright years extended.
+
+2006-12-02 Saturday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess, config.sub (altnum.[6,5]): Ninth merge of the trunk
+	  to the `altnum' branch.
+
+2006-11-18 Saturday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, INSTALL, config.guess, config.sub, install-sh,
+	  missing, mkinstalldirs, src/EList.defs.hh, src/Handler.defs.hh,
+	  src/Makefile.am, src/Pending_Element.defs.hh, src/Watchdog.cc,
+	  src/Watchdog.defs.hh (octagons.[1,1,1,1,1,1,1,1,1,1,1,2,1]):
+	  Second merge to octagons.
+
+2006-11-12 Sunday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.22), config.sub (1.21): Updated.
+
+2006-10-29 Sunday 20:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore, COPYING, CREDITS, ChangeLog,
+	  Doubly_Linked_Object.defs.hh, Doubly_Linked_Object.inlines.hh,
+	  Doubly_Linked_Object.types.hh, EList.defs.hh, EList.inlines.hh,
+	  EList.types.hh, EList_Iterator.defs.hh,
+	  EList_Iterator.inlines.hh, EList_Iterator.types.hh,
+	  Handler.defs.hh, Handler.inlines.hh, Handler.types.hh, INSTALL,
+	  Makefile.am, NEWS, Pending_Element.cc, Pending_Element.defs.hh,
+	  Pending_Element.inlines.hh, Pending_Element.types.hh,
+	  Pending_List.cc, Pending_List.defs.hh, Pending_List.inlines.hh,
+	  Pending_List.types.hh, README, Time.cc, Time.defs.hh,
+	  Time.inlines.hh, Time.types.hh, Watchdog.cc, Watchdog.defs.hh,
+	  Watchdog.inlines.hh, Watchdog.types.hh, compile, config.guess,
+	  config.sub, configure.ac, depcomp, install-sh, ltmain.sh,
+	  missing, mkinstalldirs, pwl_header.bottom, pwl_header.middle,
+	  pwl_header.top, src/.cvsignore, src/Doubly_Linked_Object.defs.hh,
+	  src/Doubly_Linked_Object.inlines.hh,
+	  src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+	  src/EList.inlines.hh, src/EList.types.hh,
+	  src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+	  src/EList_Iterator.types.hh, src/Handler.defs.hh,
+	  src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+	  src/Pending_Element.cc, src/Pending_Element.defs.hh,
+	  src/Pending_Element.inlines.hh, src/Pending_Element.types.hh,
+	  src/Pending_List.cc, src/Pending_List.defs.hh,
+	  src/Pending_List.inlines.hh, src/Pending_List.types.hh,
+	  src/Time.cc, src/Time.defs.hh, src/Time.inlines.hh,
+	  src/Time.types.hh, src/Watchdog.cc, src/Watchdog.defs.hh,
+	  src/Watchdog.inlines.hh, src/Watchdog.types.hh,
+	  src/pwl_header.hh, utils/.cvsignore, utils/Makefile.am,
+	  utils/build_header.in
+	  (altnum.[1,1,1,3,2,2,2,2,2,2,2,3,2,3,2,2,2,6,3,2,2,2,2,2,2,2,2,3,2,2,2,2,3,3,2,1,3,5,4,4,2,5,3,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Eighth merge from the main trunk.
+
+2006-09-28 Thursday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, INSTALL, config.guess, config.sub, install-sh,
+	  missing, mkinstalldirs, src/EList.defs.hh, src/Handler.defs.hh,
+	  src/Makefile.am, src/Pending_Element.defs.hh, src/Watchdog.cc,
+	  src/Watchdog.defs.hh (interfaces.[1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Second merge from main trunk (several compilation errors still to
+	  be fixed).
+
+2006-09-26 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.8): Typos fixed.
+
+2006-09-26 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.1): file Makefile.am was added on branch
+	  altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: EList.defs.hh (1.4), Handler.defs.hh (1.3),
+	  Pending_Element.defs.hh (1.3), Watchdog.cc (1.4),
+	  Watchdog.defs.hh (1.3): Comments improved.
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/EList.defs.hh (altnum.1): file EList.defs.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Handler.defs.hh (altnum.1): file Handler.defs.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_Element.defs.hh (altnum.1): file
+	  Pending_Element.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.cc (altnum.1): file Watchdog.cc was added on branch
+	  altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.defs.hh (altnum.1): file Watchdog.defs.hh was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-23 Saturday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.16): Updated.
+
+2006-09-06 Wednesday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, config.guess, config.sub, install-sh, missing,
+	  mkinstalldirs (simplex.[1,3,3,2,1,1]): Third merge from the main
+	  trunk.
+
+2006-06-29 Thursday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.5), config.guess (1.21), config.sub (1.20), install-sh
+	  (1.14), missing (1.9), mkinstalldirs (1.6): Updated from Autoconf
+	  2.60.
+
+2006-05-08 Monday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, Makefile.am, NEWS, README, config.guess,
+	  config.sub, src/.cvsignore, src/Makefile.am, src/Watchdog.cc,
+	  utils/.cvsignore, utils/Makefile.am
+	  (simplex.[1,2,2,1,2,2,2,1,2,2,1,2]): Second merge from main
+	  trunk.
+
+2006-05-08 Monday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.cc (octagons.1): First merge from main trunk.
+
+2006-04-08 Saturday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.cc (1.3): Typo fixed in comment.
+
+2006-03-12 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_9-branch.1): Mark ChangeLog.
+
+2006-03-10 Friday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.15): Updated.
 
 2006-03-10 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
 
@@ -21,16 +662,26 @@
 	* src/: .cvsignore (1.2), Makefile.am (1.6): We now directly create
 	  `pwl.hh': `pwl_install.hh' does not exist any longer.
 
+2006-02-11 Saturday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/.cvsignore (altnum.1): file .cvsignore was added on branch
+	  altnum on 2006-10-29 19:26:51 +0000
+
 2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* utils/.cvsignore (1.2): Ignore more built files and directories.
 
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/.cvsignore (altnum.1): file .cvsignore was added on branch
+	  altnum on 2006-10-29 19:26:51 +0000
+
 2006-01-25 Wednesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* src/Makefile.in (grids.4): Makefile.in is automatically
 	  generated: it should not be under CVS.
 
-2006-01-25 Wednesday 19:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-25 Wednesday 19:31  Matthew Mundell
 
 	* CREDITS, ChangeLog, NEWS, README (grids.[1,3,2,3]): Eighth and
 	  last merge from the main trunk.
@@ -59,7 +710,7 @@
 
 	* NEWS (1.8): Release date decided.
 
-2006-01-16 Monday 02:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-16 Monday 02:10  Matthew Mundell
 
 	* ChangeLog, Makefile.am, NEWS, README, config.guess, config.sub,
 	  configure.ac, install-sh, ltmain.sh,
@@ -83,16 +734,21 @@
 	  Seventh (last but one?) merge of the main trunk to the grids
 	  branch.
 
-2006-01-14 Saturday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 15:48  Matthew Mundell
 
 	* NEWS (1.7): Add detail to the 0.5 Time entry.
 
-2006-01-14 Saturday 15:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2006-01-14 Saturday 15:37  Matthew Mundell
 
 	* NEWS (1.6): Update 0.8 entries from ChangeLog.
 
 2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
 
+	* utils/Makefile.am (altnum.1): file Makefile.am was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
 	* Makefile.am (1.25), src/Makefile.am (1.5), utils/Makefile.am
 	  (1.6): Avoid providing default information that Automake does
 	  figure out by itself.
@@ -133,6 +789,21 @@
 	  Time.defs.hh (1.3): Do adopt the new format for multiline brief
 	  doxygen documentation.
 
+2006-01-01 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_List.defs.hh (altnum.1): file Pending_List.defs.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Time.defs.hh (altnum.1): file Time.defs.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/build_header.in (altnum.1): file build_header.in was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
 2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* Makefile.am (1.24), README (1.12), configure.ac (1.33),
@@ -155,6 +826,125 @@
 	  src/pwl_header.hh (1.2), utils/Makefile.am (1.5),
 	  utils/build_header.in (1.3): Copyright years extended.
 
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Doubly_Linked_Object.defs.hh (altnum.1): file
+	  Doubly_Linked_Object.defs.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Doubly_Linked_Object.inlines.hh (altnum.1): file
+	  Doubly_Linked_Object.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Doubly_Linked_Object.types.hh (altnum.1): file
+	  Doubly_Linked_Object.types.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/EList.inlines.hh (altnum.1): file EList.inlines.hh was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/EList.types.hh (altnum.1): file EList.types.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/EList_Iterator.defs.hh (altnum.1): file
+	  EList_Iterator.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/EList_Iterator.inlines.hh (altnum.1): file
+	  EList_Iterator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/EList_Iterator.types.hh (altnum.1): file
+	  EList_Iterator.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Handler.inlines.hh (altnum.1): file Handler.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Handler.types.hh (altnum.1): file Handler.types.hh was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_Element.cc (altnum.1): file Pending_Element.cc was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_Element.inlines.hh (altnum.1): file
+	  Pending_Element.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_Element.types.hh (altnum.1): file
+	  Pending_Element.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_List.cc (altnum.1): file Pending_List.cc was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_List.inlines.hh (altnum.1): file
+	  Pending_List.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pending_List.types.hh (altnum.1): file Pending_List.types.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Time.cc (altnum.1): file Time.cc was added on branch altnum
+	  on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Time.inlines.hh (altnum.1): file Time.inlines.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Time.types.hh (altnum.1): file Time.types.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.inlines.hh (altnum.1): file Watchdog.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.types.hh (altnum.1): file Watchdog.types.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/pwl_header.hh (altnum.1): file pwl_header.hh was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
 2005-12-19 Monday 07:37  Roberto Bagnara <bagnara at cs.unipr.it>
 
 	* config.guess (1.18), config.sub (1.17), install-sh (1.13),
@@ -199,7 +989,7 @@
 	  (grids.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
 	  Files moved as in the main trunk.
 
-2005-09-28 Wednesday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+2005-09-28 Wednesday 21:04  Matthew Mundell
 
 	* .cvsignore, ChangeLog, Doubly_Linked_Object.defs.hh,
 	  Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
diff --git a/Watchdog/INSTALL b/Watchdog/INSTALL
index 56b077d..d3c5b40 100644
--- a/Watchdog/INSTALL
+++ b/Watchdog/INSTALL
@@ -1,8 +1,8 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007 Free Software Foundation, Inc.
 
 This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
@@ -10,7 +10,10 @@ unlimited permission to copy, distribute and modify it.
 Basic Installation
 ==================
 
-These are generic installation instructions.
+Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
 
    The `configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
@@ -23,9 +26,9 @@ debugging `configure').
 
    It can also use an optional file (typically called `config.cache'
 and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
+the results of its tests to speed up reconfiguring.  Caching is
 disabled by default to prevent problems with accidental use of stale
-cache files.)
+cache files.
 
    If you need to do unusual things to compile the package, please try
 to figure out how `configure' could check whether to do them, and mail
@@ -35,20 +38,17 @@ some point `config.cache' contains results you don't want to keep, you
 may remove or edit it.
 
    The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
 
 The simplest way to compile this package is:
 
   1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
+     `./configure' to configure the package for your system.
 
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
 
   2. Type `make' to compile the package.
 
@@ -67,6 +67,9 @@ The simplest way to compile this package is:
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
+  6. Often, you can also type `make uninstall' to remove the installed
+     files again.
+
 Compilers and Options
 =====================
 
@@ -78,7 +81,7 @@ details on some of the pertinent environment variables.
 by setting variables in the command line or in the environment.  Here
 is an example:
 
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 
    *Note Defining Variables::, for more details.
 
@@ -87,31 +90,29 @@ Compiling For Multiple Architectures
 
 You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+own directory.  To do this, you can use GNU `make'.  `cd' to the
 directory where you want the object files and executables to go and run
 the `configure' script.  `configure' automatically checks for the
 source code in the directory that `configure' is in and in `..'.
 
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
 
 Installation Names
 ==================
 
-By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PREFIX'.
+By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PREFIX', the package will
-use PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
 
    In addition, if you use an unusual directory layout you can give
 options like `--bindir=DIR' to specify different values for particular
@@ -159,7 +160,7 @@ where SYSTEM can have one of these forms:
 need to know the machine type.
 
    If you are _building_ compiler tools for cross-compiling, you should
-use the `--target=TYPE' option to select the type of system they will
+use the option `--target=TYPE' to select the type of system they will
 produce code for.
 
    If you want to _use_ a cross compiler, that generates code for a
@@ -190,12 +191,12 @@ them in the `configure' command line, using `VAR=value'.  For example:
      ./configure CC=/usr/local2/bin/gcc
 
 causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).  Here is a another example:
+overridden in the site shell script).
 
-     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
 
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
 
 `configure' Invocation
 ======================
diff --git a/Watchdog/Makefile.am b/Watchdog/Makefile.am
index 56ff427..0a9ffd8 100644
--- a/Watchdog/Makefile.am
+++ b/Watchdog/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,10 @@
 # For the most up-to-date information see the CS at Parma software
 # site: http://www.cs.unipr.it/Software/ . */
 
-SUBDIRS = utils src
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = m4 utils src doc
 
 dist_noinst_SCRIPTS = \
 configure
@@ -28,3 +31,10 @@ configure
 EXTRA_DIST = \
 BUGS \
 CREDITS
+
+# The files @PACKAGE at -config.h and _configs.sed, which are generated by
+# the autoconf macro AX_PREFIX_CONFIG_H, are not automatically cleaned up
+# by `make distclean'. So we need to explicitly clean them.
+DISTCLEANFILES = \
+ at PACKAGE@-config.h \
+_configs.sed
diff --git a/Watchdog/Makefile.in b/Watchdog/Makefile.in
index c07c4ce..e2c51a4 100644
--- a/Watchdog/Makefile.in
+++ b/Watchdog/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the CS at Parma software
 # site: http://www.cs.unipr.it/Software/ . */
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = .
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -58,18 +54,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+subdir = .
 DIST_COMMON = README $(am__configure_deps) $(dist_noinst_SCRIPTS) \
 	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
 	$(srcdir)/config.h.in $(top_srcdir)/configure COPYING \
 	ChangeLog INSTALL NEWS compile config.guess config.sub depcomp \
 	install-sh ltmain.sh missing mkinstalldirs
-subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno configure.status.lineno
+ configure.lineno config.status.lineno
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES =
@@ -78,10 +77,13 @@ SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
@@ -97,21 +99,15 @@ GZIP_ENV = --best
 distuninstallcheck_listfiles = find . -type f -print
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
 CXXCPP = @CXXCPP@
@@ -120,32 +116,37 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -155,23 +156,18 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -183,30 +179,45 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
-SUBDIRS = utils src
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = m4 utils src doc
 dist_noinst_SCRIPTS = \
 configure
 
@@ -214,6 +225,14 @@ EXTRA_DIST = \
 BUGS \
 CREDITS
 
+
+# The files @PACKAGE at -config.h and _configs.sed, which are generated by
+# the autoconf macro AX_PREFIX_CONFIG_H, are not automatically cleaned up
+# by `make distclean'. So we need to explicitly clean them.
+DISTCLEANFILES = \
+ at PACKAGE@-config.h \
+_configs.sed
+
 all: config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
@@ -255,7 +274,7 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 config.h: stamp-h1
 	@if test ! -f $@; then \
 	  rm -f stamp-h1; \
-	  $(MAKE) stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
 	else :; fi
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@@ -277,7 +296,6 @@ clean-libtool:
 
 distclean-libtool:
 	-rm -f libtool
-uninstall-info-am:
 
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
@@ -310,8 +328,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -355,8 +372,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -381,8 +398,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -392,13 +409,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -413,23 +429,22 @@ distclean-tags:
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
-	mkdir $(distdir)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	test -d $(distdir) || mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -443,7 +458,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -451,6 +466,8 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -458,7 +475,7 @@ distdir: $(DISTFILES)
 	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
 	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r $(distdir)
 dist-gzip: distdir
 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
@@ -467,6 +484,10 @@ dist-bzip2: distdir
 	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
 	$(am__remove_distdir)
 
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
 dist-tarZ: distdir
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__remove_distdir)
@@ -495,6 +516,8 @@ distcheck: dist
 	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
@@ -534,7 +557,7 @@ distcheck: dist
 	$(am__remove_distdir)
 	@(echo "$(distdir) archives ready for distribution: "; \
 	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
 distuninstallcheck:
 	@cd $(distuninstallcheck_dir) \
 	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
@@ -578,6 +601,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -604,12 +628,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am:
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -630,24 +662,26 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
-	check-am clean clean-generic clean-libtool clean-recursive \
-	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
-	dist-shar dist-tarZ dist-zip distcheck distclean \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-recursive distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am uninstall-info-am
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+	dist-gzip dist-lzma dist-shar dist-tarZ dist-zip distcheck \
+	distclean distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/Watchdog/NEWS b/Watchdog/NEWS
index ff70afd..4453179 100644
--- a/Watchdog/NEWS
+++ b/Watchdog/NEWS
@@ -4,6 +4,17 @@ Parma Watchdog Library NEWS -- history of user-visible changes
 
 
 --------------------------------------------------------------------------
+NEWS for version 0.6  (release date to be decided)
+--------------------------------------------------------------------------
+
+o  The Parma Watchdog Library is now released under the terms of the
+   version 3 (or later) of the GNU General Public License.
+
+o  The `pwl.hh' header file no longer defines macros not prefixed
+   by "PWL_".
+
+
+--------------------------------------------------------------------------
 NEWS for version 0.5  (released on January 20, 2006)
 --------------------------------------------------------------------------
 
diff --git a/Watchdog/README b/Watchdog/README
index 16a7817..a2c8fb7 100644
--- a/Watchdog/README
+++ b/Watchdog/README
@@ -1,5 +1,5 @@
 
-This is the release 0.5 of the Parma Watchdog Library:
+This is the release 0.6 of the Parma Watchdog Library:
 a C++ library for software timeouts.
 
 To be continued...
@@ -12,7 +12,7 @@ See the file BUGS for known bugs and how to report new ones.
 See the file CREDITS for a list of people and organizations that
 contributed to the PWL.
 
-Here is the contents of the PWL 0.5 source distribution
+Here is the contents of the PWL 0.6 source distribution
 (2 directories, 56 files):
 
 Watchdog
@@ -77,11 +77,11 @@ Watchdog
 
 --------
 
-Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 The Parma Watchdog Library 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
+published by the Free Software Foundation; either version 3 of the
 License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful, but
diff --git a/Watchdog/aclocal.m4 b/Watchdog/aclocal.m4
index 4723f85..52e2523 100644
--- a/Watchdog/aclocal.m4
+++ b/Watchdog/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005  Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008  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.
@@ -11,6384 +11,15 @@
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(AC_AUTOCONF_VERSION, [2.61],,
+[m4_warning([this file was generated for autoconf 2.61.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# serial 48 AC_PROG_LIBTOOL
-
-
-# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
-# -----------------------------------------------------------
-# If this macro is not defined by Autoconf, define it here.
-m4_ifdef([AC_PROVIDE_IFELSE],
-         [],
-         [m4_define([AC_PROVIDE_IFELSE],
-	         [m4_ifdef([AC_PROVIDE_$1],
-		           [$2], [$3])])])
-
-
-# AC_PROG_LIBTOOL
-# ---------------
-AC_DEFUN([AC_PROG_LIBTOOL],
-[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
-dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
-dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
-  AC_PROVIDE_IFELSE([AC_PROG_CXX],
-    [AC_LIBTOOL_CXX],
-    [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
-  ])])
-dnl And a similar setup for Fortran 77 support
-  AC_PROVIDE_IFELSE([AC_PROG_F77],
-    [AC_LIBTOOL_F77],
-    [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
-])])
-
-dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
-dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
-dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
-  AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-    [AC_LIBTOOL_GCJ],
-    [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-      [AC_LIBTOOL_GCJ],
-      [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
-	[AC_LIBTOOL_GCJ],
-      [ifdef([AC_PROG_GCJ],
-	     [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-       ifdef([A][M_PROG_GCJ],
-	     [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-       ifdef([LT_AC_PROG_GCJ],
-	     [define([LT_AC_PROG_GCJ],
-		defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
-])])# AC_PROG_LIBTOOL
-
-
-# _AC_PROG_LIBTOOL
-# ----------------
-AC_DEFUN([_AC_PROG_LIBTOOL],
-[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-# Prevent multiple expansion
-define([AC_PROG_LIBTOOL], [])
-])# _AC_PROG_LIBTOOL
-
-
-# AC_LIBTOOL_SETUP
-# ----------------
-AC_DEFUN([AC_LIBTOOL_SETUP],
-[AC_PREREQ(2.50)dnl
-AC_REQUIRE([AC_ENABLE_SHARED])dnl
-AC_REQUIRE([AC_ENABLE_STATIC])dnl
-AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_LD])dnl
-AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
-AC_REQUIRE([AC_PROG_NM])dnl
-
-AC_REQUIRE([AC_PROG_LN_S])dnl
-AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
-# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
-AC_REQUIRE([AC_OBJEXT])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-dnl
-
-AC_LIBTOOL_SYS_MAX_CMD_LEN
-AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-AC_LIBTOOL_OBJDIR
-
-AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-_LT_AC_PROG_ECHO_BACKSLASH
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
-
-# Same as above, but do not quote variable references.
-[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-AC_CHECK_TOOL(AR, ar, false)
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-AC_CHECK_TOOL(STRIP, strip, :)
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$SED" && SED=sed
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    AC_PATH_MAGIC
-  fi
-  ;;
-esac
-
-AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
-AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
-enable_win32_dll=yes, enable_win32_dll=no)
-
-AC_ARG_ENABLE([libtool-lock],
-    [AC_HELP_STRING([--disable-libtool-lock],
-	[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-AC_ARG_WITH([pic],
-    [AC_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-test -z "$pic_mode" && pic_mode=default
-
-# Use C for the default configuration in the libtool script
-tagname=
-AC_LIBTOOL_LANG_C_CONFIG
-_LT_AC_TAGCONFIG
-])# AC_LIBTOOL_SETUP
-
-
-# _LT_AC_SYS_COMPILER
-# -------------------
-AC_DEFUN([_LT_AC_SYS_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_AC_SYS_COMPILER
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-AC_DEFUN([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-])
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-AC_DEFUN([_LT_COMPILER_BOILERPLATE],
-[ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-AC_DEFUN([_LT_LINKER_BOILERPLATE],
-[ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
-])# _LT_LINKER_BOILERPLATE
-
-
-# _LT_AC_SYS_LIBPATH_AIX
-# ----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
-[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_AC_SYS_LIBPATH_AIX
-
-
-# _LT_AC_SHELL_INIT(ARG)
-# ----------------------
-AC_DEFUN([_LT_AC_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-	 [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_AC_SHELL_INIT
-
-
-# _LT_AC_PROG_ECHO_BACKSLASH
-# --------------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
-[_LT_AC_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-echo=${ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-[$]*
-EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
-  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
-       echo_test_string=`eval $cmd` &&
-       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
-    then
-      break
-    fi
-  done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-   test "X$echo_testing_string" = "X$echo_test_string"; then
-  :
-else
-  # The Solaris, AIX, and Digital Unix default echo programs unquote
-  # backslashes.  This makes it impossible to quote backslashes using
-  #   echo "$something" | sed 's/\\/\\\\/g'
-  #
-  # So, first we look for a working echo in the user's PATH.
-
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for dir in $PATH /usr/ucb; do
-    IFS="$lt_save_ifs"
-    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      echo="$dir/echo"
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  if test "X$echo" = Xecho; then
-    # We didn't find a better echo, so look for alternatives.
-    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      # This shell has a builtin print -r that does the trick.
-      echo='print -r'
-    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-	 test "X$CONFIG_SHELL" != X/bin/ksh; then
-      # If we have ksh, try running configure again with it.
-      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-      export ORIGINAL_CONFIG_SHELL
-      CONFIG_SHELL=/bin/ksh
-      export CONFIG_SHELL
-      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-    else
-      # Try using printf.
-      echo='printf %s\n'
-      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-	 test "X$echo_testing_string" = "X$echo_test_string"; then
-	# Cool, printf works
-	:
-      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	export CONFIG_SHELL
-	SHELL="$CONFIG_SHELL"
-	export SHELL
-	echo="$CONFIG_SHELL [$]0 --fallback-echo"
-      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	echo="$CONFIG_SHELL [$]0 --fallback-echo"
-      else
-	# maybe with a smaller string...
-	prev=:
-
-	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
-	  then
-	    break
-	  fi
-	  prev="$cmd"
-	done
-
-	if test "$prev" != 'sed 50q "[$]0"'; then
-	  echo_test_string=`eval $prev`
-	  export echo_test_string
-	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-	else
-	  # Oops.  We lost completely, so just stick with echo.
-	  echo=echo
-	fi
-      fi
-    fi
-  fi
-fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(ECHO)
-])])# _LT_AC_PROG_ECHO_BACKSLASH
-
-
-# _LT_AC_LOCK
-# -----------
-AC_DEFUN([_LT_AC_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-    [AC_HELP_STRING([--disable-libtool-lock],
-	[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *ELF-32*)
-      HPUX_IA64_MODE="32"
-      ;;
-    *ELF-64*)
-      HPUX_IA64_MODE="64"
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-   if test "$lt_cv_prog_gnu_ld" = yes; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -melf32bsmip"
-      ;;
-    *N32*)
-      LD="${LD-ld} -melf32bmipn32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -melf64bmip"
-      ;;
-    esac
-   else
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -32"
-      ;;
-    *N32*)
-      LD="${LD-ld} -n32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -64"
-      ;;
-    esac
-   fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *32-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_i386"
-          ;;
-        ppc64-*linux*|powerpc64-*linux*)
-          LD="${LD-ld} -m elf32ppclinux"
-          ;;
-        s390x-*linux*)
-          LD="${LD-ld} -m elf_s390"
-          ;;
-        sparc64-*linux*)
-          LD="${LD-ld} -m elf32_sparc"
-          ;;
-      esac
-      ;;
-    *64-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        ppc*-*linux*|powerpc*-*linux*)
-          LD="${LD-ld} -m elf64ppc"
-          ;;
-        s390*-*linux*)
-          LD="${LD-ld} -m elf64_s390"
-          ;;
-        sparc*-*linux*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)    LD="${LD-ld} -64" ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
-[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-  ])
-esac
-
-need_locks="$enable_libtool_lock"
-
-])# _LT_AC_LOCK
-
-
-# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
-[AC_REQUIRE([LT_AC_PROG_SED])
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-  ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $rm conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    ifelse([$5], , :, [$5])
-else
-    ifelse([$6], , :, [$6])
-fi
-])# AC_LIBTOOL_COMPILER_OPTION
-
-
-# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                          [ACTION-SUCCESS], [ACTION-FAILURE])
-# ------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
-[AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    ifelse([$4], , :, [$4])
-else
-    ifelse([$5], , :, [$5])
-fi
-])# AC_LIBTOOL_LINKER_OPTION
-
-
-# AC_LIBTOOL_SYS_MAX_CMD_LEN
-# --------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
-[# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ 	]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    # If test is not a shell built-in, we'll probably end up computing a
-    # maximum length that is only half of the actual maximum length, but
-    # we can't tell.
-    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-    while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
-	       = "XX$teststring") >/dev/null 2>&1 &&
-	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
-	    lt_cv_sys_max_cmd_len=$new_result &&
-	    test $i != 17 # 1/2 MB should be enough
-    do
-      i=`expr $i + 1`
-      teststring=$teststring$teststring
-    done
-    teststring=
-    # Add a significant safety factor because C++ compilers can tack on massive
-    # amounts of additional arguments before passing them to the linker.
-    # It appears as though 1/2 is a usable value.
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-])# AC_LIBTOOL_SYS_MAX_CMD_LEN
-
-
-# _LT_AC_CHECK_DLFCN
-# ------------------
-AC_DEFUN([_LT_AC_CHECK_DLFCN],
-[AC_CHECK_HEADERS(dlfcn.h)dnl
-])# _LT_AC_CHECK_DLFCN
-
-
-# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ---------------------------------------------------------------------
-AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
-[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-    exit (status);
-}]
-EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_AC_TRY_DLOPEN_SELF
-
-
-# AC_LIBTOOL_DLOPEN_SELF
-# ----------------------
-AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
-[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-   ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-   ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-   ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_AC_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-    	  lt_cv_dlopen_self_static, [dnl
-	  _LT_AC_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-])# AC_LIBTOOL_DLOPEN_SELF
-
-
-# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
-# ---------------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler
-AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
-[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
-])
-])# AC_LIBTOOL_PROG_CC_C_O
-
-
-# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
-# -----------------------------------------
-# Check to see if we can do hard links to lock some files if needed
-AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
-[AC_REQUIRE([_LT_AC_LOCK])dnl
-
-hard_links="nottested"
-if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
-
-
-# AC_LIBTOOL_OBJDIR
-# -----------------
-AC_DEFUN([AC_LIBTOOL_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-])# AC_LIBTOOL_OBJDIR
-
-
-# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
-# ----------------------------------------------
-# Check hardcoding attributes.
-AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_AC_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
-   test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
-   test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_AC_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_AC_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
-
-
-# AC_LIBTOOL_SYS_LIB_STRIP
-# ------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
-[striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-   darwin*)
-       if test -n "$STRIP" ; then
-         striplib="$STRIP -x"
-         AC_MSG_RESULT([yes])
-       else
-  AC_MSG_RESULT([no])
-fi
-       ;;
-   *)
-  AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-])# AC_LIBTOOL_SYS_LIB_STRIP
-
-
-# AC_LIBTOOL_SYS_DYNAMIC_LINKER
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
-[AC_MSG_CHECKING([dynamic linker characteristics])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
-
-
-# _LT_AC_TAGCONFIG
-# ----------------
-AC_DEFUN([_LT_AC_TAGCONFIG],
-[AC_ARG_WITH([tags],
-    [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
-        [include additional configurations @<:@automatic@:>@])],
-    [tagnames="$withval"])
-
-if test -f "$ltmain" && test -n "$tagnames"; then
-  if test ! -f "${ofile}"; then
-    AC_MSG_WARN([output file `$ofile' does not exist])
-  fi
-
-  if test -z "$LTCC"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
-    if test -z "$LTCC"; then
-      AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
-    else
-      AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
-    fi
-  fi
-  if test -z "$LTCFLAGS"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
-  fi
-
-  # Extract list of available tagged configurations in $ofile.
-  # Note that this assumes the entire list is on one line.
-  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
-
-  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-  for tagname in $tagnames; do
-    IFS="$lt_save_ifs"
-    # Check whether tagname contains only valid characters
-    case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
-    "") ;;
-    *)  AC_MSG_ERROR([invalid tag name: $tagname])
-	;;
-    esac
-
-    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
-    then
-      AC_MSG_ERROR([tag name \"$tagname\" already exists])
-    fi
-
-    # Update the list of available tags.
-    if test -n "$tagname"; then
-      echo appending configuration tag \"$tagname\" to $ofile
-
-      case $tagname in
-      CXX)
-	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-	    (test "X$CXX" != "Xg++"))) ; then
-	  AC_LIBTOOL_LANG_CXX_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      F77)
-	if test -n "$F77" && test "X$F77" != "Xno"; then
-	  AC_LIBTOOL_LANG_F77_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      GCJ)
-	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
-	  AC_LIBTOOL_LANG_GCJ_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      RC)
-	AC_LIBTOOL_LANG_RC_CONFIG
-	;;
-
-      *)
-	AC_MSG_ERROR([Unsupported tag name: $tagname])
-	;;
-      esac
-
-      # Append the new tag name to the list of available tags.
-      if test -n "$tagname" ; then
-      available_tags="$available_tags $tagname"
-    fi
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  # Now substitute the updated list of available tags.
-  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
-    mv "${ofile}T" "$ofile"
-    chmod +x "$ofile"
-  else
-    rm -f "${ofile}T"
-    AC_MSG_ERROR([unable to update list of available tagged configurations.])
-  fi
-fi
-])# _LT_AC_TAGCONFIG
-
-
-# AC_LIBTOOL_DLOPEN
-# -----------------
-# enable checks for dlopen support
-AC_DEFUN([AC_LIBTOOL_DLOPEN],
- [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
-])# AC_LIBTOOL_DLOPEN
-
-
-# AC_LIBTOOL_WIN32_DLL
-# --------------------
-# declare package support for building win32 DLLs
-AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
-])# AC_LIBTOOL_WIN32_DLL
-
-
-# AC_ENABLE_SHARED([DEFAULT])
-# ---------------------------
-# implement the --enable-shared flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_SHARED],
-[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([shared],
-    [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
-])# AC_ENABLE_SHARED
-
-
-# AC_DISABLE_SHARED
-# -----------------
-# set the default shared flag to --disable-shared
-AC_DEFUN([AC_DISABLE_SHARED],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_SHARED(no)
-])# AC_DISABLE_SHARED
-
-
-# AC_ENABLE_STATIC([DEFAULT])
-# ---------------------------
-# implement the --enable-static flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_STATIC],
-[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([static],
-    [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]AC_ENABLE_STATIC_DEFAULT)
-])# AC_ENABLE_STATIC
-
-
-# AC_DISABLE_STATIC
-# -----------------
-# set the default static flag to --disable-static
-AC_DEFUN([AC_DISABLE_STATIC],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_STATIC(no)
-])# AC_DISABLE_STATIC
-
-
-# AC_ENABLE_FAST_INSTALL([DEFAULT])
-# ---------------------------------
-# implement the --enable-fast-install flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_FAST_INSTALL],
-[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([fast-install],
-    [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
-])# AC_ENABLE_FAST_INSTALL
-
-
-# AC_DISABLE_FAST_INSTALL
-# -----------------------
-# set the default to --disable-fast-install
-AC_DEFUN([AC_DISABLE_FAST_INSTALL],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_FAST_INSTALL(no)
-])# AC_DISABLE_FAST_INSTALL
-
-
-# AC_LIBTOOL_PICMODE([MODE])
-# --------------------------
-# implement the --with-pic flag
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-AC_DEFUN([AC_LIBTOOL_PICMODE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-pic_mode=ifelse($#,1,$1,default)
-])# AC_LIBTOOL_PICMODE
-
-
-# AC_PROG_EGREP
-# -------------
-# This is predefined starting with Autoconf 2.54, so this conditional
-# definition can be removed once we require Autoconf 2.54 or later.
-m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
-[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
-   [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi])
- EGREP=$ac_cv_prog_egrep
- AC_SUBST([EGREP])
-])])
-
-
-# AC_PATH_TOOL_PREFIX
-# -------------------
-# find a file program which can recognise shared library
-AC_DEFUN([AC_PATH_TOOL_PREFIX],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="ifelse([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-])# AC_PATH_TOOL_PREFIX
-
-
-# AC_PATH_MAGIC
-# -------------
-# find a file program which can recognise a shared library
-AC_DEFUN([AC_PATH_MAGIC],
-[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# AC_PATH_MAGIC
-
-
-# AC_PROG_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([AC_PROG_LD],
-[AC_ARG_WITH([gnu-ld],
-    [AC_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])
-AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_PROG_LD_GNU
-])# AC_PROG_LD
-
-
-# AC_PROG_LD_GNU
-# --------------
-AC_DEFUN([AC_PROG_LD_GNU],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# AC_PROG_LD_GNU
-
-
-# AC_PROG_LD_RELOAD_FLAG
-# ----------------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-])# AC_PROG_LD_RELOAD_FLAG
-
-
-# AC_DEPLIBS_CHECK_METHOD
-# -----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
-[AC_CACHE_CHECK([how to recognise dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix4* | aix5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
-  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | kfreebsd*-gnu | dragonfly*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix3*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-nto-qnx*)
-  lt_cv_deplibs_check_method=unknown
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-])# AC_DEPLIBS_CHECK_METHOD
-
-
-# AC_PROG_NM
-# ----------
-# find the pathname to a BSD-compatible name lister
-AC_DEFUN([AC_PROG_NM],
-[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then 
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi])
-NM="$lt_cv_path_NM"
-])# AC_PROG_NM
-
-
-# AC_CHECK_LIBM
-# -------------
-# check for math library
-AC_DEFUN([AC_CHECK_LIBM],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-])# AC_CHECK_LIBM
-
-
-# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl convenience library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-convenience to the configure arguments.  Note that
-# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
-# it is assumed to be `libltdl'.  LIBLTDL will be prefixed with
-# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
-# (note the single quotes!).  If your package is not flat and you're not
-# using automake, define top_builddir and top_srcdir appropriately in
-# the Makefiles.
-AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  case $enable_ltdl_convenience in
-  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
-  "") enable_ltdl_convenience=yes
-      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
-  esac
-  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
-  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-  # For backwards non-gettext consistent compatibility...
-  INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_CONVENIENCE
-
-
-# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl installable library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-install to the configure arguments.  Note that
-# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
-# and an installed libltdl is not found, it is assumed to be `libltdl'.
-# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
-# '${top_srcdir}/' (note the single quotes!).  If your package is not
-# flat and you're not using automake, define top_builddir and top_srcdir
-# appropriately in the Makefiles.
-# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
-AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  AC_CHECK_LIB(ltdl, lt_dlinit,
-  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
-  [if test x"$enable_ltdl_install" = xno; then
-     AC_MSG_WARN([libltdl not installed, but installation disabled])
-   else
-     enable_ltdl_install=yes
-   fi
-  ])
-  if test x"$enable_ltdl_install" = x"yes"; then
-    ac_configure_args="$ac_configure_args --enable-ltdl-install"
-    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
-    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-  else
-    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
-    LIBLTDL="-lltdl"
-    LTDLINCL=
-  fi
-  # For backwards non-gettext consistent compatibility...
-  INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_INSTALLABLE
-
-
-# AC_LIBTOOL_CXX
-# --------------
-# enable support for C++ libraries
-AC_DEFUN([AC_LIBTOOL_CXX],
-[AC_REQUIRE([_LT_AC_LANG_CXX])
-])# AC_LIBTOOL_CXX
-
-
-# _LT_AC_LANG_CXX
-# ---------------
-AC_DEFUN([_LT_AC_LANG_CXX],
-[AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([_LT_AC_PROG_CXXCPP])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
-])# _LT_AC_LANG_CXX
-
-# _LT_AC_PROG_CXXCPP
-# ------------------
-AC_DEFUN([_LT_AC_PROG_CXXCPP],
-[
-AC_REQUIRE([AC_PROG_CXX])
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-fi
-])# _LT_AC_PROG_CXXCPP
-
-# AC_LIBTOOL_F77
-# --------------
-# enable support for Fortran 77 libraries
-AC_DEFUN([AC_LIBTOOL_F77],
-[AC_REQUIRE([_LT_AC_LANG_F77])
-])# AC_LIBTOOL_F77
-
-
-# _LT_AC_LANG_F77
-# ---------------
-AC_DEFUN([_LT_AC_LANG_F77],
-[AC_REQUIRE([AC_PROG_F77])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
-])# _LT_AC_LANG_F77
-
-
-# AC_LIBTOOL_GCJ
-# --------------
-# enable support for GCJ libraries
-AC_DEFUN([AC_LIBTOOL_GCJ],
-[AC_REQUIRE([_LT_AC_LANG_GCJ])
-])# AC_LIBTOOL_GCJ
-
-
-# _LT_AC_LANG_GCJ
-# ---------------
-AC_DEFUN([_LT_AC_LANG_GCJ],
-[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
-    [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
-      [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
-	 [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
-	   [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
-])# _LT_AC_LANG_GCJ
-
-
-# AC_LIBTOOL_RC
-# -------------
-# enable support for Windows resource files
-AC_DEFUN([AC_LIBTOOL_RC],
-[AC_REQUIRE([LT_AC_PROG_RC])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
-])# AC_LIBTOOL_RC
-
-
-# AC_LIBTOOL_LANG_C_CONFIG
-# ------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
-AC_DEFUN([_LT_AC_LANG_C_CONFIG],
-[lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}\n'
-
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-AC_LIBTOOL_SYS_LIB_STRIP
-AC_LIBTOOL_DLOPEN_SELF
-
-# Report which library types will actually be built
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-    ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_C_CONFIG
-
-
-# AC_LIBTOOL_LANG_CXX_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
-AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
-[AC_LANG_PUSH(C++)
-AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([_LT_AC_PROG_CXXCPP])
-
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_AC_TAGVAR(allow_undefined_flag, $1)=
-_LT_AC_TAGVAR(always_export_symbols, $1)=no
-_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_direct, $1)=no
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_AC_TAGVAR(hardcode_automatic, $1)=no
-_LT_AC_TAGVAR(module_cmds, $1)=
-_LT_AC_TAGVAR(module_expsym_cmds, $1)=
-_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_AC_TAGVAR(no_undefined_flag, $1)=
-_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Dependencies to place before and after the object being linked:
-_LT_AC_TAGVAR(predep_objects, $1)=
-_LT_AC_TAGVAR(postdep_objects, $1)=
-_LT_AC_TAGVAR(predeps, $1)=
-_LT_AC_TAGVAR(postdeps, $1)=
-_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_LD=$LD
-lt_save_GCC=$GCC
-GCC=$GXX
-lt_save_with_gnu_ld=$with_gnu_ld
-lt_save_path_LD=$lt_cv_path_LD
-if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-else
-  $as_unset lt_cv_prog_gnu_ld
-fi
-if test -n "${lt_cv_path_LDCXX+set}"; then
-  lt_cv_path_LD=$lt_cv_path_LDCXX
-else
-  $as_unset lt_cv_path_LD
-fi
-test -z "${LDCXX+set}" || LD=$LDCXX
-CC=${CXX-"c++"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-# We don't want -fno-exception wen compiling C++ code, so set the
-# no_builtin_flag separately
-if test "$GXX" = yes; then
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-else
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-fi
-
-if test "$GXX" = yes; then
-  # Set up default GNU C++ configuration
-
-  AC_PROG_LD
-
-  # Check if GNU C++ uses GNU ld as the underlying linker, since the
-  # archiving commands below assume that GNU ld is being used.
-  if test "$with_gnu_ld" = yes; then
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-    #     investigate it a little bit more. (MM)
-    wlarc='${wl}'
-
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
-	grep 'no-whole-archive' > /dev/null; then
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    with_gnu_ld=no
-    wlarc=
-
-    # A generic and very simple default shared library creation
-    # command for GNU C++ for the case where it uses the native
-    # linker, instead of GNU ld.  If possible, this setting should
-    # overridden to take advantage of the native linker features on
-    # the platform it is being used on.
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-  fi
-
-  # Commands to make compiler produce verbose output that lists
-  # what "hidden" libraries, object files and flags are used when
-  # linking a shared library.
-  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-else
-  GXX=no
-  with_gnu_ld=no
-  wlarc=
-fi
-
-# PORTME: fill in a description of your system's C++ link characteristics
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-_LT_AC_TAGVAR(ld_shlibs, $1)=yes
-case $host_os in
-  aix3*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  aix4* | aix5*)
-    if test "$host_cpu" = ia64; then
-      # On IA64, the linker does run time linking by default, so we don't
-      # have to do anything special.
-      aix_use_runtimelinking=no
-      exp_sym_flag='-Bexport'
-      no_entry_flag=""
-    else
-      aix_use_runtimelinking=no
-
-      # Test if we are trying to use run time linking or normal
-      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-      # need to do runtime linking.
-      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
-	for ld_flag in $LDFLAGS; do
-	  case $ld_flag in
-	  *-brtl*)
-	    aix_use_runtimelinking=yes
-	    break
-	    ;;
-	  esac
-	done
-	;;
-      esac
-
-      exp_sym_flag='-bexport'
-      no_entry_flag='-bnoentry'
-    fi
-
-    # When large executables or shared objects are built, AIX ld can
-    # have problems creating the table of contents.  If linking a library
-    # or program results in "error TOC overflow" add -mminimal-toc to
-    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-    _LT_AC_TAGVAR(archive_cmds, $1)=''
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-    if test "$GXX" = yes; then
-      case $host_os in aix4.[[012]]|aix4.[[012]].*)
-      # We only want to do this on AIX 4.2 and lower, the check
-      # below for broken collect2 doesn't work under 4.3+
-	collect2name=`${CC} -print-prog-name=collect2`
-	if test -f "$collect2name" && \
-	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	then
-	  # We have reworked collect2
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	else
-	  # We have old collect2
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-	fi
-	;;
-      esac
-      shared_flag='-shared'
-      if test "$aix_use_runtimelinking" = yes; then
-	shared_flag="$shared_flag "'${wl}-G'
-      fi
-    else
-      # not using gcc
-      if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	shared_flag='-G'
-      else
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag='${wl}-G'
-	else
-	  shared_flag='${wl}-bM:SRE'
-	fi
-      fi
-    fi
-
-    # It seems that -bexpall does not export symbols beginning with
-    # underscore (_), so it is better to generate a list of symbols to export.
-    _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-    if test "$aix_use_runtimelinking" = yes; then
-      # Warning - without using the other runtime loading flags (-brtl),
-      # -berok will link without error, but may produce a broken library.
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
-      # Determine the default libpath from the value encoded in an empty executable.
-      _LT_AC_SYS_LIBPATH_AIX
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-     else
-      if test "$host_cpu" = ia64; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-      else
-	# Determine the default libpath from the value encoded in an empty executable.
-	_LT_AC_SYS_LIBPATH_AIX
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	# Warning - without using the other run time loading flags,
-	# -berok will link without error, but may produce a broken library.
-	_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	# Exported symbols can be pulled into shared objects from archives
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-	# This is similar to how AIX traditionally builds its shared libraries.
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-      fi
-    fi
-    ;;
-
-  beos*)
-    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-      # support --undefined.  This deserves some investigation.  FIXME
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-    ;;
-
-  chorus*)
-    case $cc_basename in
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-
-  cygwin* | mingw* | pw32*)
-    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-    # as there is no search path for DLLs.
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-    _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-    _LT_AC_TAGVAR(always_export_symbols, $1)=no
-    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      # If the export-symbols file already is a .def file (1st line
-      # is EXPORTS), use it as is; otherwise, prepend...
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	cp $export_symbols $output_objdir/$soname.def;
-      else
-	echo EXPORTS > $output_objdir/$soname.def;
-	cat $export_symbols >> $output_objdir/$soname.def;
-      fi~
-      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-  ;;
-      darwin* | rhapsody*)
-        case $host_os in
-        rhapsody* | darwin1.[[012]])
-         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[[012]])
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-        esac
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-    if test "$GXX" = yes ; then
-      lt_int_apple_cc_single_mod=no
-      output_verbose_link_cmd='echo'
-      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
-       lt_int_apple_cc_single_mod=yes
-      fi
-      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-       _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      else
-          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-        fi
-        _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          else
-            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          fi
-            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-          _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         _LT_AC_TAGVAR(ld_shlibs, $1)=no
-          ;;
-      esac
-      fi
-        ;;
-
-  dgux*)
-    case $cc_basename in
-      ec++*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      ghcx*)
-	# Green Hills C++ Compiler
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  freebsd[[12]]*)
-    # C++ shared libraries reported to be fairly broken before switch to ELF
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  freebsd-elf*)
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    ;;
-  freebsd* | kfreebsd*-gnu | dragonfly*)
-    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-    # conventions
-    _LT_AC_TAGVAR(ld_shlibs, $1)=yes
-    ;;
-  gnu*)
-    ;;
-  hpux9*)
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				# but as the default
-				# location of the library.
-
-    case $cc_basename in
-    CC*)
-      # FIXME: insert proper C++ library support
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    aCC*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      #
-      # There doesn't appear to be a way to prevent this compiler from
-      # explicitly linking system object files so we need to strip them
-      # from the output so that they don't get included in the library
-      # dependencies.
-      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-      ;;
-    *)
-      if test "$GXX" = yes; then
-        _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-        # FIXME: insert proper C++ library support
-        _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-    ;;
-  hpux10*|hpux11*)
-    if test $with_gnu_ld = no; then
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-      case $host_cpu in
-      hppa*64*|ia64*)
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-        ;;
-      *)
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        ;;
-      esac
-    fi
-    case $host_cpu in
-    hppa*64*|ia64*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-    *)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					      # but as the default
-					      # location of the library.
-      ;;
-    esac
-
-    case $cc_basename in
-      CC*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      aCC*)
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	esac
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test $with_gnu_ld = no; then
-	    case $host_cpu in
-	    hppa*64*)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    ia64*)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    *)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    esac
-	  fi
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  interix3*)
-    _LT_AC_TAGVAR(hardcode_direct, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-    # Instead, shared libraries are loaded at an image base (0x10000000 by
-    # default) and relocated if they conflict, which is a slow very memory
-    # consuming and fragmenting process.  To avoid this, we pick a random,
-    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    ;;
-  irix5* | irix6*)
-    case $cc_basename in
-      CC*)
-	# SGI C++
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	# Archives containing C++ object files must be created using
-	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test "$with_gnu_ld" = no; then
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	  else
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
-	  fi
-	fi
-	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-	;;
-    esac
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-    ;;
-  linux*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	;;
-      icpc*)
-	# Intel C++
-	with_gnu_ld=yes
-	# version 8.0 and above of icpc choke on multiply defined symbols
-	# if we add $predep_objects and $postdep_objects, however 7.1 and
-	# earlier do not add the objects themselves.
-	case `$CC -V 2>&1` in
-	*"Version 7."*)
-  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	*)  # Version 8.0 or newer
-	  tmp_idyn=
-	  case $host_cpu in
-	    ia64*) tmp_idyn=' -i_dynamic';;
-	  esac
-  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	esac
-	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	;;
-      pgCC*)
-        # Portland Group C++ compiler
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-        ;;
-      cxx*)
-	# Compaq C++
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	runpath_var=LD_RUN_PATH
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-    esac
-    ;;
-  lynxos*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  m88k*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  mvs*)
-    case $cc_basename in
-      cxx*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-      wlarc=
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    fi
-    # Workaround some broken pre-1.5 toolchains
-    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-    ;;
-  openbsd2*)
-    # C++ shared libraries are fairly broken
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  openbsd*)
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    fi
-    output_verbose_link_cmd='echo'
-    ;;
-  osf3*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      cxx*)
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  osf4* | osf5*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Archives containing C++ object files must be created using
-	# the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      cxx*)
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	  echo "-hidden">> $lib.exp~
-	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
-	  $rm $lib.exp'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	 _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  psos*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  sunos4*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.x
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      lcc*)
-	# Lucid
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  solaris*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.2, 5.x and Centerline C++
-        _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
-	_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	case $host_os in
-	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	  *)
-	    # The C++ compiler is used as linker so we must use $wl
-	    # flag to pass the commands to the underlying system
-	    # linker. We must also pass each convience library through
-	    # to the system linker between allextract/defaultextract.
-	    # The C++ compiler will combine linker options so we
-	    # cannot just pass the convience library names through
-	    # without $wl.
-	    # Supported since Solaris 2.6 (maybe 2.5.1?)
-	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
-	    ;;
-	esac
-	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-	output_verbose_link_cmd='echo'
-
-	# Archives containing C++ object files must be created using
-	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	;;
-      gcx*)
-	# Green Hills C++ Compiler
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	# The C++ compiler must be used to create the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	;;
-      *)
-	# GNU C++ compiler with Solaris linker
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	  if $CC --version | grep -v '^2\.7' > /dev/null; then
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  else
-	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	    # platform.
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  fi
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	fi
-	;;
-    esac
-    ;;
-  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  sysv5* | sco3.2v5* | sco5v6*)
-    # Note: We can NOT use -z defs as we might desire, because we do not
-    # link with -lc, and that would cause any symbols used from libc to
-    # always be unresolved, which means just about no library would
-    # ever link correctly.  If we're not using GNU ld we use -z text
-    # though, which does catch some bad symbols but isn't as heavy-handed
-    # as -z defs.
-    # For security reasons, it is highly recommended that you always
-    # use absolute paths for naming shared libraries, and exclude the
-    # DT_RUNPATH tag from executables and libraries.  But doing so
-    # requires that you compile everything twice, which is a pain.
-    # So that behaviour is only enabled if SCOABSPATH is set to a
-    # non-empty value in the environment.  Most likely only useful for
-    # creating official distributions of packages.
-    # This is a hack until libtool officially supports absolute path
-    # names for shared libraries.
-    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-    _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  tandem*)
-    case $cc_basename in
-      NCC*)
-	# NonStop-UX NCC 3.20
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  vxworks*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  *)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-esac
-AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_AC_TAGVAR(GCC, $1)="$GXX"
-_LT_AC_TAGVAR(LD, $1)="$LD"
-
-AC_LIBTOOL_POSTDEP_PREDEP($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC=$lt_save_CC
-LDCXX=$LD
-LD=$lt_save_LD
-GCC=$lt_save_GCC
-with_gnu_ldcxx=$with_gnu_ld
-with_gnu_ld=$lt_save_with_gnu_ld
-lt_cv_path_LDCXX=$lt_cv_path_LD
-lt_cv_path_LD=$lt_save_path_LD
-lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-])# AC_LIBTOOL_LANG_CXX_CONFIG
-
-# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
-# ------------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
-int a;
-void foo (void) { a = 0; }
-EOF
-],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-EOF
-],[$1],[F77],[cat > conftest.$ac_ext <<EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-EOF
-],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  # The `*' in the case matches for architectures that use `case' in
-  # $output_verbose_cmd can trigger glob expansion during the loop
-  # eval without this substitution.
-  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
-
-  for p in `eval $output_verbose_link_cmd`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" \
-	  || test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
-	   _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
-	   _LT_AC_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
-	   _LT_AC_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$rm -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-ifelse([$1],[CXX],
-[case $host_os in
-interix3*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_AC_TAGVAR(predep_objects,$1)=
-  _LT_AC_TAGVAR(postdep_objects,$1)=
-  _LT_AC_TAGVAR(postdeps,$1)=
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_AC_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
-])# AC_LIBTOOL_POSTDEP_PREDEP
-
-# AC_LIBTOOL_LANG_F77_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
-AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
-[AC_REQUIRE([AC_PROG_F77])
-AC_LANG_PUSH(Fortran 77)
-
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_AC_TAGVAR(allow_undefined_flag, $1)=
-_LT_AC_TAGVAR(always_export_symbols, $1)=no
-_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_direct, $1)=no
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-_LT_AC_TAGVAR(hardcode_automatic, $1)=no
-_LT_AC_TAGVAR(module_cmds, $1)=
-_LT_AC_TAGVAR(module_expsym_cmds, $1)=
-_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_AC_TAGVAR(no_undefined_flag, $1)=
-_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="      program t\n      end\n"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${F77-"f77"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-  ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-_LT_AC_TAGVAR(GCC, $1)="$G77"
-_LT_AC_TAGVAR(LD, $1)="$LD"
-
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_F77_CONFIG
-
-
-# AC_LIBTOOL_LANG_GCJ_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
-AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
-[AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_GCJ_CONFIG
-
-
-# AC_LIBTOOL_LANG_RC_CONFIG
-# -------------------------
-# Ensure that the configuration vars for the Windows resource compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
-AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
-[AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${RC-"windres"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_RC_CONFIG
-
-
-# AC_LIBTOOL_CONFIG([TAGNAME])
-# ----------------------------
-# If TAGNAME is not passed, then create an initial libtool script
-# with a default configuration from the untagged config vars.  Otherwise
-# add code to config.status for appending the configuration named by
-# TAGNAME from the matching tagged config vars.
-AC_DEFUN([AC_LIBTOOL_CONFIG],
-[# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    _LT_AC_TAGVAR(compiler, $1) \
-    _LT_AC_TAGVAR(CC, $1) \
-    _LT_AC_TAGVAR(LD, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
-    _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
-    _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
-    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
-    _LT_AC_TAGVAR(old_archive_cmds, $1) \
-    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
-    _LT_AC_TAGVAR(predep_objects, $1) \
-    _LT_AC_TAGVAR(postdep_objects, $1) \
-    _LT_AC_TAGVAR(predeps, $1) \
-    _LT_AC_TAGVAR(postdeps, $1) \
-    _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
-    _LT_AC_TAGVAR(archive_cmds, $1) \
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
-    _LT_AC_TAGVAR(postinstall_cmds, $1) \
-    _LT_AC_TAGVAR(postuninstall_cmds, $1) \
-    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
-    _LT_AC_TAGVAR(allow_undefined_flag, $1) \
-    _LT_AC_TAGVAR(no_undefined_flag, $1) \
-    _LT_AC_TAGVAR(export_symbols_cmds, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
-    _LT_AC_TAGVAR(hardcode_automatic, $1) \
-    _LT_AC_TAGVAR(module_cmds, $1) \
-    _LT_AC_TAGVAR(module_expsym_cmds, $1) \
-    _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
-    _LT_AC_TAGVAR(exclude_expsyms, $1) \
-    _LT_AC_TAGVAR(include_expsyms, $1); do
-
-    case $var in
-    _LT_AC_TAGVAR(old_archive_cmds, $1) | \
-    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
-    _LT_AC_TAGVAR(archive_cmds, $1) | \
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
-    _LT_AC_TAGVAR(module_cmds, $1) | \
-    _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
-    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
-    _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
-
-  case $lt_echo in
-  *'\[$]0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
-    ;;
-  esac
-
-ifelse([$1], [],
-  [cfgfile="${ofile}T"
-  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
-  $rm -f "$cfgfile"
-  AC_MSG_NOTICE([creating $ofile])],
-  [cfgfile="$ofile"])
-
-  cat <<__EOF__ >> "$cfgfile"
-ifelse([$1], [],
-[#! $SHELL
-
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-#
-# This file is part of GNU Libtool:
-# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="$SED -e 1s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-# The names of the tagged configurations supported by this script.
-available_tags=
-
-# ### BEGIN LIBTOOL CONFIG],
-[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
-
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
-
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A C compiler.
-LTCC=$lt_LTCC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
-
-# A language-specific compiler.
-CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
-
-# Is the compiler the GNU C compiler?
-with_gcc=$_LT_AC_TAGVAR(GCC, $1)
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# The linker used to build libraries.
-LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
-
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
-
-# A BSD-compatible nm program.
-NM=$lt_NM
-
-# A symbol stripping program
-STRIP=$lt_STRIP
-
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
-
-# Object file suffix (normally "o").
-objext="$ac_objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
-pic_mode=$pic_mode
-
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
-
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
-archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
-module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
-
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
-
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
-
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
-
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
-
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
-
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
-
-# Symbols that must always be exported.
-include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
-
-ifelse([$1],[],
-[# ### END LIBTOOL CONFIG],
-[# ### END LIBTOOL TAG CONFIG: $tagname])
-
-__EOF__
-
-ifelse([$1],[], [
-  case $host_os in
-  aix3*)
-    cat <<\EOF >> "$cfgfile"
-
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-EOF
-    ;;
-  esac
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" || \
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-])
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
-])# AC_LIBTOOL_CONFIG
-
-
-# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------------------
-AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
-[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-
-_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-
-  AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
-
-
-# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-# ---------------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
-[AC_REQUIRE([AC_CANONICAL_HOST])
-AC_REQUIRE([AC_PROG_NM])
-AC_REQUIRE([AC_OBJEXT])
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*) # Its linker distinguishes data from code symbols
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  ;;
-linux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDGIRSTW]]'
-    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if grep ' nm_test_var$' "$nlist" >/dev/null; then
-	if grep ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
-
-	  cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[[]] =
-{
-EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
-	  cat <<\EOF >> conftest.$ac_ext
-  {0, (lt_ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -f conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-
-
-# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
-# ---------------------------------------
-AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
-[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
- ifelse([$1],[CXX],[
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-      ;;
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | os2* | pw32*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix4* | aix5*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-       darwin*)
-         # PIC is the default on this platform
-         # Common symbols not allowed in MH_DYLIB files
-         case $cc_basename in
-           xlc*)
-           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
-           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-           ;;
-         esac
-       ;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | kfreebsd*-gnu | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux*)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  icpc* | ecpc*)
-	    # Intel C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC*)
-	    # Portland Group C++ compiler.
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-      ;;
-
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
-         _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-         ;;
-       esac
-       ;;
-
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    newsos6)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      esac
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
-    _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
-    [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
-AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
-])
-
-
-# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
-# ------------------------------------
-# See if the linker supports building shared libraries.
-AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
-[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-ifelse([$1],[CXX],[
-  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix4* | aix5*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw*)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-],[
-  runpath_var=
-  _LT_AC_TAGVAR(allow_undefined_flag, $1)=
-  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_AC_TAGVAR(archive_cmds, $1)=
-  _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
-  _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-  _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-  _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_AC_TAGVAR(hardcode_automatic, $1)=no
-  _LT_AC_TAGVAR(module_cmds, $1)=
-  _LT_AC_TAGVAR(module_expsym_cmds, $1)=
-  _LT_AC_TAGVAR(always_export_symbols, $1)=no
-  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_AC_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  _LT_CC_BASENAME([$compiler])
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
-      fi
-      ;;
-
-    amigaos*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(always_export_symbols, $1)=no
-      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    interix3*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-	if test $supports_anon_versioning = yes; then
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) 
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_AC_TAGVAR(archive_cmds, $1)=''
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	  else
-  	  # We have old collect2
-  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-  	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       _LT_AC_SYS_LIBPATH_AIX
-       _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 _LT_AC_SYS_LIBPATH_AIX
-	 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      # see comment about different semantics on the GNU ld section
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    bsdi[[45]]*)
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[[012]])
-         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[[012]])
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         _LT_AC_TAGVAR(ld_shlibs, $1)=no
-          ;;
-      esac
-    fi
-      ;;
-
-    dgux*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    openbsd*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	   _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	   ;;
-	 *)
-	   _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
-
-    os2*)
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
-      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-  fi
-])
-AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_AC_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
-	pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
-        _LT_AC_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
-        then
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
-      ;;
-    esac
-  fi
-  ;;
-esac
-])# AC_LIBTOOL_PROG_LD_SHLIBS
-
-
-# _LT_AC_FILE_LTDLL_C
-# -------------------
-# Be careful that the start marker always follows a newline.
-AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# #  ifdef __CYGWIN32__
-# #    define __CYGWIN__ __CYGWIN32__
-# #  endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-#   __hDllInstance_base = hInst;
-#   return TRUE;
-# }
-# /* ltdll.c ends here */
-])# _LT_AC_FILE_LTDLL_C
-
-
-# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
-# ---------------------------------
-AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
-
-
-# old names
-AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
-AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
-AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
-AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
-AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
-
-# This is just to silence aclocal about the macro not being used
-ifelse([AC_DISABLE_FAST_INSTALL])
-
-AC_DEFUN([LT_AC_PROG_GCJ],
-[AC_CHECK_TOOL(GCJ, gcj, no)
-  test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-  AC_SUBST(GCJFLAGS)
-])
-
-AC_DEFUN([LT_AC_PROG_RC],
-[AC_CHECK_TOOL(RC, windres, no)
-])
-
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-# LT_AC_PROG_SED
-# --------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-AC_DEFUN([LT_AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_MSG_RESULT([$SED])
-])
-
-# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -6398,14 +29,31 @@ AC_MSG_RESULT([$SED])
 # ----------------------------
 # Automake X.Y traces this macro to ensure aclocal.m4 has been
 # generated from the m4 files accompanying Automake X.Y.
-AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.10.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
 
 # AM_SET_CURRENT_AUTOMAKE_VERSION
 # -------------------------------
-# Call AM_AUTOMAKE_VERSION so it can be traced.
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-	 [AM_AUTOMAKE_VERSION([1.9.6])])
+[AM_AUTOMAKE_VERSION([1.10.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
@@ -6462,14 +110,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
 # 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.
 
-# serial 7
+# serial 8
 
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
@@ -6478,8 +126,10 @@ AC_DEFUN([AM_CONDITIONAL],
 [AC_PREREQ(2.52)dnl
  ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
 	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])
-AC_SUBST([$1_FALSE])
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
 if $2; then
   $1_TRUE=
   $1_FALSE='#'
@@ -6493,15 +143,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
 # 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.
 
-# serial 8
+# serial 9
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -6529,6 +178,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl
 ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
        [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
        [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
        [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
                    [depcc="$$1"   am_compiler_list=])
 
@@ -6594,6 +244,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
        $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
          >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
@@ -6646,7 +297,8 @@ if test "x$enable_dependency_tracking" != xno; then
   AMDEPBACKSLASH='\'
 fi
 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
 ])
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
@@ -6671,8 +323,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
   # some people rename them; so instead we look at the file content.
   # Grep'ing the first line is not enough: some people post-process
   # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
     dirpart=`AS_DIRNAME("$mf")`
   else
     continue
@@ -6719,14 +372,14 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008 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.
 
-# serial 12
+# serial 13
 
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
@@ -6743,16 +396,20 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 # arguments mandatory, and then we can depend on a new Autoconf
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.58])dnl
+[AC_PREREQ([2.60])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
 AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
 AC_REQUIRE([AC_PROG_INSTALL])dnl
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
 fi
 
 # test whether we have cygpath
@@ -6772,6 +429,9 @@ m4_ifval([$2],
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
@@ -6807,6 +467,10 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX],
                   [_AM_DEPENDENCIES(CXX)],
                   [define([AC_PROG_CXX],
                           defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                  [_AM_DEPENDENCIES(OBJC)],
+                  [define([AC_PROG_OBJC],
+                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
 ])
 ])
 
@@ -6820,16 +484,17 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX],
 # our stamp files there.
 AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
 [# Compute $1's index in $config_headers.
+_am_arg=$1
 _am_stamp_count=1
 for _am_header in $config_headers :; do
   case $_am_header in
-    $1 | $1:* )
+    $_am_arg | $_am_arg:* )
       break ;;
     * )
       _am_stamp_count=`expr $_am_stamp_count + 1` ;;
   esac
 done
-echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
 # Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 #
@@ -6842,7 +507,7 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
 AC_SUBST(install_sh)])
 
 # Copyright (C) 2003, 2005  Free Software Foundation, Inc.
@@ -6920,14 +585,14 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
 # 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.
 
-# serial 4
+# serial 5
 
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
@@ -6943,6 +608,7 @@ AC_SUBST($1)])
 # If it does, set am_missing_run to use it, otherwise, to nothing.
 AC_DEFUN([AM_MISSING_HAS_RUN],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
 test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
 # Use eval to expand $SHELL
 if eval "$MISSING --run true"; then
@@ -6953,7 +619,7 @@ else
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -6961,60 +627,23 @@ fi
 
 # AM_PROG_MKDIR_P
 # ---------------
-# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
-#
-# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
-# created by `make install' are always world readable, even if the
-# installer happens to have an overly restrictive umask (e.g. 077).
-# This was a mistake.  There are at least two reasons why we must not
-# use `-m 0755':
-#   - it causes special bits like SGID to be ignored,
-#   - it may be too restrictive (some setups expect 775 directories).
-#
-# Do not use -m 0755 and let people choose whatever they expect by
-# setting umask.
-#
-# We cannot accept any implementation of `mkdir' that recognizes `-p'.
-# Some implementations (such as Solaris 8's) are not thread-safe: if a
-# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
-# concurrently, both version can detect that a/ is missing, but only
-# one can create it and the other will error out.  Consequently we
-# restrict ourselves to GNU make (using the --version option ensures
-# this.)
+# Check for `mkdir -p'.
 AC_DEFUN([AM_PROG_MKDIR_P],
-[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-  # We used to keeping the `.' as first argument, in order to
-  # allow $(mkdir_p) to be used without argument.  As in
-  #   $(mkdir_p) $(somedir)
-  # where $(somedir) is conditionally defined.  However this is wrong
-  # for two reasons:
-  #  1. if the package is installed by a user who cannot write `.'
-  #     make install will fail,
-  #  2. the above comment should most certainly read
-  #     $(mkdir_p) $(DESTDIR)$(somedir)
-  #     so it does not work when $(somedir) is undefined and
-  #     $(DESTDIR) is not.
-  #  To support the latter case, we have to write
-  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
-  #  so the `.' trick is pointless.
-  mkdir_p='mkdir -p --'
-else
-  # On NextStep and OpenStep, the `mkdir' command does not
-  # recognize any option.  It will interpret all options as
-  # directories to create, and then abort because `.' already
-  # exists.
-  for d in ./-p ./--version;
-  do
-    test -d $d && rmdir $d
-  done
-  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
-  if test -f "$ac_aux_dir/mkinstalldirs"; then
-    mkdir_p='$(mkinstalldirs)'
-  else
-    mkdir_p='$(install_sh) -d'
-  fi
-fi
-AC_SUBST([mkdir_p])])
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
@@ -7126,9 +755,21 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
+# Copyright (C) 2006  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.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
 # Check how to create a tarball.                            -*- Autoconf -*-
 
 # Copyright (C) 2004, 2005  Free Software Foundation, Inc.
@@ -7225,3 +866,9 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
+m4_include([m4/ax_prefix_config_h.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/Watchdog/compile b/Watchdog/compile
index cd27e88..1b1d232 100755
--- a/Watchdog/compile
+++ b/Watchdog/compile
@@ -17,7 +17,7 @@ scriptversion=2005-05-14.22
 # 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,
+# along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 # As a special exception to the GNU General Public License, if you
diff --git a/Watchdog/config.guess b/Watchdog/config.guess
index ec46d18..c7607c7 100755
--- a/Watchdog/config.guess
+++ b/Watchdog/config.guess
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2006-02-27'
+timestamp='2008-04-14'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -56,8 +56,8 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -161,6 +161,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
@@ -211,7 +212,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
 	exit ;;
     macppc:MirBSD:*:*)
-	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
@@ -329,7 +330,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
-    i86pc:SunOS:5.*:*)
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     sun4*:SunOS:6*:*)
@@ -531,7 +532,7 @@ EOF
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[45])
+    *:AIX:*:[456])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
@@ -771,6 +772,8 @@ EOF
 	case ${UNAME_MACHINE} in
 	    pc98)
 		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
 		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
@@ -778,10 +781,7 @@ EOF
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
-    i*:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:MSYS_NT-*:*:*)
+    *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
     i*:windows32*:*)
@@ -791,12 +791,18 @@ EOF
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
-    x86:Interix*:[345]*)
-	echo i586-pc-interix${UNAME_RELEASE}
-	exit ;;
-    EM64T:Interix*:[345]*)
-	echo x86_64-unknown-interix${UNAME_RELEASE}
-	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 	echo i${UNAME_MACHINE}-pc-mks
 	exit ;;
@@ -830,6 +836,16 @@ EOF
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
     arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     cris:Linux:*:*)
@@ -948,6 +964,9 @@ EOF
     x86_64:Linux:*:*)
 	echo x86_64-unknown-linux-gnu
 	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
     i*86:Linux:*:*)
 	# The BFD linker knows what the default object file format is, so
 	# first see if it will tell us. cd to the root directory to prevent
@@ -966,9 +985,6 @@ EOF
 	  a.out-i386-linux)
 		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
 		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
 	  "")
 		# Either a pre-BFD a.out linker (linux-gnuoldld) or
 		# one that does not give us useful --help.
@@ -990,7 +1006,7 @@ EOF
 	LIBC=gnulibc1
 	# endif
 	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
 	LIBC=gnu
 	#else
 	LIBC=gnuaout
@@ -1197,6 +1213,9 @@ EOF
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
 	echo i586-pc-beos
 	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1206,6 +1225,15 @@ EOF
     SX-6:SUPER-UX:*:*)
 	echo sx6-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1456,9 +1484,9 @@ This script, last modified $timestamp, has failed to recognize
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff --git a/Watchdog/config.h.in b/Watchdog/config.h.in
index 428cd43..9c1a451 100644
--- a/Watchdog/config.h.in
+++ b/Watchdog/config.h.in
@@ -36,12 +36,13 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
 /* Assertions are disabled when this is defined */
 #undef NDEBUG
 
-/* Name of package */
-#undef PACKAGE
-
 /* Define to the address where bug reports for this package should be sent. */
 #undef PACKAGE_BUGREPORT
 
@@ -63,8 +64,11 @@
 /* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
 #undef TIME_WITH_SYS_TIME
 
-/* Version number of package */
-#undef VERSION
-
 /* Define to empty if `const' does not conform to ANSI C. */
 #undef const
+
+
+#ifdef PWL_NDEBUG
+# define NDEBUG PWL_NDEBUG
+#endif
+
diff --git a/Watchdog/config.sub b/Watchdog/config.sub
index ab2c16c..a649350 100755
--- a/Watchdog/config.sub
+++ b/Watchdog/config.sub
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2006-02-27'
+timestamp='2008-06-16'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -72,8 +72,8 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -241,20 +241,23 @@ case $basic_machine in
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
 	| bfin \
 	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
+	| fido | fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
-	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
+	| mips64octeon | mips64octeonel \
 	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
 	| mips64vr4100 | mips64vr4100el \
 	| mips64vr4300 | mips64vr4300el \
 	| mips64vr5000 | mips64vr5000el \
@@ -275,21 +278,19 @@ case $basic_machine in
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 	| pyramid \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| strongarm \
+	| spu | strongarm \
 	| tahoe | thumb | tic4x | tic80 | tron \
 	| v850 | v850e \
 	| we32k \
-	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
 	| z8k)
 		basic_machine=$basic_machine-unknown
 		;;
-	m32c)
-		basic_machine=$basic_machine-unknown
-		;;
 	m6811 | m68hc11 | m6812 | m68hc12)
 		# Motorola 68HC11/12.
 		basic_machine=$basic_machine-unknown
@@ -319,25 +320,27 @@ case $basic_machine in
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* \
+	| avr-* | avr32-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
 	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
-	| m32r-* | m32rle-* \
+	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
+	| mips64octeon-* | mips64octeonel-* \
 	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
 	| mips64vr4100-* | mips64vr4100el-* \
 	| mips64vr4300-* | mips64vr4300el-* \
 	| mips64vr5000-* | mips64vr5000el-* \
@@ -359,22 +362,24 @@ case $basic_machine in
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 	| pyramid-* \
 	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
 	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
 	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
 	| tron-* \
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-*)
 		;;
-	m32c-*)
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
 		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
@@ -446,10 +451,22 @@ case $basic_machine in
 		basic_machine=ns32k-sequent
 		os=-dynix
 		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
 	convex-c1)
 		basic_machine=c1-convex
 		os=-bsd
@@ -478,8 +495,8 @@ case $basic_machine in
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16c)
-		basic_machine=cr16c-unknown
+	cr16)
+		basic_machine=cr16-unknown
 		os=-elf
 		;;
 	crds | unos)
@@ -517,6 +534,10 @@ case $basic_machine in
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
 	djgpp)
 		basic_machine=i586-pc
 		os=-msdosdjgpp
@@ -671,6 +692,14 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	m88k-omron*)
 		basic_machine=m88k-omron
 		;;
@@ -686,6 +715,10 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-mingw32
 		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
 	miniframe)
 		basic_machine=m68000-convergent
 		;;
@@ -812,6 +845,14 @@ case $basic_machine in
 		basic_machine=i860-intel
 		os=-osf
 		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	pbd)
 		basic_machine=sparc-tti
 		;;
@@ -913,6 +954,10 @@ case $basic_machine in
 	sb1el)
 		basic_machine=mipsisa64sb1el-unknown
 		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
 	sei)
 		basic_machine=mips-sei
 		os=-seiux
@@ -924,6 +969,9 @@ case $basic_machine in
 		basic_machine=sh-hitachi
 		os=-hms
 		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
 	sh64)
 		basic_machine=sh64-unknown
 		;;
@@ -1013,6 +1061,10 @@ case $basic_machine in
 		basic_machine=tic6x-unknown
 		os=-coff
 		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
 	tx39)
 		basic_machine=mipstx39-unknown
 		;;
@@ -1208,7 +1260,7 @@ case $os in
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
 	      | -uxpv* | -beos* | -mpeix* | -udk* \
@@ -1218,7 +1270,7 @@ case $os in
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1348,6 +1400,9 @@ case $os in
 	-zvmoe)
 		os=-zvmoe
 		;;
+	-dicos*)
+		os=-dicos
+		;;
 	-none)
 		;;
 	*)
@@ -1370,6 +1425,12 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
 	*-acorn)
 		os=-riscix1.2
 		;;
@@ -1379,9 +1440,9 @@ case $basic_machine in
 	arm*-semi)
 		os=-aout
 		;;
-    c4x-* | tic4x-*)
-        os=-coff
-        ;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
 		os=-tops20
@@ -1407,6 +1468,9 @@ case $basic_machine in
 	m68*-cisco)
 		os=-aout
 		;;
+        mep-*)
+		os=-elf
+		;;
 	mips*-cisco)
 		os=-elf
 		;;
diff --git a/Watchdog/configure b/Watchdog/configure
index d14003f..9cfc7b8 100755
--- a/Watchdog/configure
+++ b/Watchdog/configure
@@ -1,27 +1,56 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for the Parma Watchdog Library 0.4.
+# Generated by GNU Autoconf 2.61 for the Parma Watchdog Library 0.6.
 #
 # Report bugs to <bagnara at cs.unipr.it>.
 #
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
 fi
-DUALCASE=1; export DUALCASE # for MKS sh
 
 # Support unset when possible.
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
@@ -31,8 +60,43 @@ else
 fi
 
 
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
 # Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
 PS1='$ '
 PS2='> '
 PS4='+ '
@@ -46,18 +110,19 @@ do
   if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
     eval $as_var=C; export $as_var
   else
-    $as_unset $as_var
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
   fi
 done
 
 # Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
   as_basename=basename
 else
   as_basename=false
@@ -65,157 +130,388 @@ fi
 
 
 # Name of the executable.
-as_me=`$as_basename "$0" ||
+as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
 
+# CDPATH.
+$as_unset CDPATH
 
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
 fi
 
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
+  case $as_dir in
 	 /*)
-	   if ("$as_dir/$as_base" -c '
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf at gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
+  chmod +x "$as_me.lineno" ||
     { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -224,7 +520,28 @@ else
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -233,36 +550,27 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 
 
 # Check that we are running under the correct shell.
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-case X$ECHO in
+case X$lt_ECHO in
 X*--fallback-echo)
   # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
   ;;
 esac
 
-echo=${ECHO-echo}
+ECHO=${lt_ECHO-echo}
 if test "X$1" = X--no-reexec; then
   # Discard the --no-reexec flag, and continue.
   shift
 elif test "X$1" = X--fallback-echo; then
   # Avoid inline document here, it may be left over
   :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $echo works!
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
   :
 else
   # Restart under the correct shell.
@@ -272,9 +580,9 @@ fi
 if test "X$1" = X--fallback-echo; then
   # used as fallback echo
   shift
-  cat <<EOF
+  cat <<_LT_EOF
 $*
-EOF
+_LT_EOF
   exit 0
 fi
 
@@ -282,191 +590,314 @@ fi
 # if CDPATH is set.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
-  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
-       echo_test_string=`eval $cmd` &&
-       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
-    then
-      break
-    fi
-  done
-fi
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
 
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-   test "X$echo_testing_string" = "X$echo_test_string"; then
-  :
-else
-  # The Solaris, AIX, and Digital Unix default echo programs unquote
-  # backslashes.  This makes it impossible to quote backslashes using
-  #   echo "$something" | sed 's/\\/\\\\/g'
-  #
-  # So, first we look for a working echo in the user's PATH.
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
 
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for dir in $PATH /usr/ucb; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
     IFS="$lt_save_ifs"
-    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      echo="$dir/echo"
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
 
-  if test "X$echo" = Xecho; then
-    # We didn't find a better echo, so look for alternatives.
-    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      # This shell has a builtin print -r that does the trick.
-      echo='print -r'
-    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-	 test "X$CONFIG_SHELL" != X/bin/ksh; then
-      # If we have ksh, try running configure again with it.
-      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-      export ORIGINAL_CONFIG_SHELL
-      CONFIG_SHELL=/bin/ksh
-      export CONFIG_SHELL
-      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
-    else
-      # Try using printf.
-      echo='printf %s\n'
-      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-	 test "X$echo_testing_string" = "X$echo_test_string"; then
-	# Cool, printf works
-	:
-      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
 	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	export CONFIG_SHELL
-	SHELL="$CONFIG_SHELL"
-	export SHELL
-	echo="$CONFIG_SHELL $0 --fallback-echo"
-      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	echo="$CONFIG_SHELL $0 --fallback-echo"
-      else
-	# maybe with a smaller string...
-	prev=:
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
 
-	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
-	  then
-	    break
-	  fi
-	  prev="$cmd"
-	done
+	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
 
-	if test "$prev" != 'sed 50q "$0"'; then
-	  echo_test_string=`eval $prev`
-	  export echo_test_string
-	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
-	else
-	  # Oops.  We lost completely, so just stick with echo.
-	  echo=echo
-	fi
+	  if test "$prev" != 'sed 50q "$0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
       fi
     fi
   fi
 fi
-fi
 
 # Copy echo and quote the copy suitably for passing to libtool from
 # the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
 fi
 
 
 
 
-tagnames=${tagnames+${tagnames},}CXX
-
-tagnames=${tagnames+${tagnames},}F77
+exec 7<&0 </dev/null 6>&1
 
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
-exec 6>&1
-
 #
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_clean_files=
 ac_config_libobj_dir=.
+LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
 # Identity of this package.
 PACKAGE_NAME='the Parma Watchdog Library'
-PACKAGE_TARNAME='watchdog'
-PACKAGE_VERSION='0.4'
-PACKAGE_STRING='the Parma Watchdog Library 0.4'
+PACKAGE_TARNAME='pwl'
+PACKAGE_VERSION='0.6'
+PACKAGE_STRING='the Parma Watchdog Library 0.6'
 PACKAGE_BUGREPORT='bagnara at cs.unipr.it'
 
 ac_unique_file="src/Watchdog.cc"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
-#if HAVE_SYS_TYPES_H
+#ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#if HAVE_SYS_STAT_H
+#ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
-#if STDC_HEADERS
+#ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <stddef.h>
 #else
-# if HAVE_STDLIB_H
+# ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 # endif
 #endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
 #  include <memory.h>
 # endif
 # include <string.h>
 #endif
-#if HAVE_STRINGS_H
+#ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
+#ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
 #endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INS [...]
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+ISODATE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+PERL
+HAVE_PERL_TRUE
+HAVE_PERL_FALSE
+BUILD_WATCHDOG_LIBRARY_TRUE
+BUILD_WATCHDOG_LIBRARY_FALSE
+CXX
+CXXFLAGS
+ac_ct_CXX
+CXXDEPMODE
+am__fastdepCXX_TRUE
+am__fastdepCXX_FALSE
+CXXCPP
+GREP
+EGREP
+LIBTOOL
+SED
+FGREP
+LD
+DUMPBIN
+ac_ct_DUMPBIN
+NM
+LN_S
+OBJDUMP
+AR
+RANLIB
+lt_ECHO
+DSYMUTIL
+NMEDIT
+LIPO
+OTOOL
+OTOOL64
+NO_UNDEFINED_TRUE
+NO_UNDEFINED_FALSE
+debug_flag
+LIBOBJS
+LTLIBOBJS'
 ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CXXCPP'
+
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -493,34 +924,48 @@ x_libraries=NONE
 # and all the variables that are supposed to be based on exec_prefix
 # by default will actually change.
 # Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
 
 ac_prev=
+ac_dashdash=
 for ac_option
 do
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
+    eval $ac_prev=\$ac_option
     ac_prev=
     continue
   fi
 
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case $ac_option in
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
@@ -542,33 +987,45 @@ do
   --config-cache | -C)
     cache_file=config.cache ;;
 
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+  -datadir | --datadir | --datadi | --datad)
     ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
     datadir=$ac_optarg ;;
 
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
   -disable-* | --disable-*)
     ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
     ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -595,6 +1052,12 @@ do
   -host=* | --host=* | --hos=* | --ho=*)
     host_alias=$ac_optarg ;;
 
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
@@ -619,13 +1082,16 @@ do
   | --libexe=* | --libex=* | --libe=*)
     libexecdir=$ac_optarg ;;
 
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
   -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
+  | --localstate | --localstat | --localsta | --localst | --locals)
     ac_prev=localstatedir ;;
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
     localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
@@ -690,6 +1156,16 @@ do
   | --progr-tra=* | --program-tr=* | --program-t=*)
     program_transform_name=$ac_optarg ;;
 
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
@@ -742,24 +1218,20 @@ do
   -with-* | --with-*)
     ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
 
   -without-* | --without-*)
     ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -790,8 +1262,7 @@ Try \`$0 --help' for more information." >&2
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
+    eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
@@ -811,27 +1282,19 @@ if test -n "$ac_prev"; then
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
 do
-  eval ac_val=$`echo $ac_var`
+  eval ac_val=\$$ac_var
   case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -858,94 +1321,76 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias-
 test "$silent" = yes && exec 6>/dev/null
 
 
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$0" : 'X\(//\)[^/]' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
+  if test ! -r "$srcdir/$ac_unique_file"; then
     srcdir=..
   fi
 else
   ac_srcdir_defaulted=no
 fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
 fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CXX_set=${CXX+set}
-ac_env_CXX_value=$CXX
-ac_cv_env_CXX_set=${CXX+set}
-ac_cv_env_CXX_value=$CXX
-ac_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_env_CXXFLAGS_value=$CXXFLAGS
-ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_cv_env_CXXFLAGS_value=$CXXFLAGS
-ac_env_CXXCPP_set=${CXXCPP+set}
-ac_env_CXXCPP_value=$CXXCPP
-ac_cv_env_CXXCPP_set=${CXXCPP+set}
-ac_cv_env_CXXCPP_value=$CXXCPP
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
-ac_env_F77_set=${F77+set}
-ac_env_F77_value=$F77
-ac_cv_env_F77_set=${F77+set}
-ac_cv_env_F77_value=$F77
-ac_env_FFLAGS_set=${FFLAGS+set}
-ac_env_FFLAGS_value=$FFLAGS
-ac_cv_env_FFLAGS_set=${FFLAGS+set}
-ac_cv_env_FFLAGS_value=$FFLAGS
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
 
 #
 # Report the --help message.
@@ -954,7 +1399,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 the Parma Watchdog Library 0.4 to adapt to many kinds of systems.
+\`configure' configures the Parma Watchdog Library 0.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -974,9 +1419,6 @@ Configuration:
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
 
-_ACEOF
-
-  cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
 			  [$ac_default_prefix]
@@ -994,15 +1436,22 @@ Fine tuning of the installation directories:
   --bindir=DIR           user executables [EPREFIX/bin]
   --sbindir=DIR          system admin executables [EPREFIX/sbin]
   --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
   --libdir=DIR           object code libraries [EPREFIX/lib]
   --includedir=DIR       C header files [PREFIX/include]
   --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/pwl]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -1020,7 +1469,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of the Parma Watchdog Library 0.4:";;
+     short | recursive ) echo "Configuration of the Parma Watchdog Library 0.6:";;
    esac
   cat <<\_ACEOF
 
@@ -1036,10 +1485,8 @@ Optional Features:
   --enable-optimization   enable compiler optimizations
   --enable-arch=arch      optimize for architecture arch
   --enable-watchdog       build also the Parma Watchdog Library
-  --enable-shared[=PKGS]
-                          build shared libraries [default=yes]
-  --enable-static[=PKGS]
-                          build static libraries [default=yes]
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
@@ -1051,145 +1498,107 @@ Optional Packages:
   --with-cxx=xxx          use XXX as the C++ compiler
   --with-cflags=xxx       add XXX to the options for the C compiler
   --with-cxxflags=xxx     add XXX to the options for the C++ compiler
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-pic              try to use only PIC/non-PIC objects [default=use
                           both]
-  --with-tags[=TAGS]
-                          include additional configurations [automatic]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
 
 Some influential environment variables:
   CC          C compiler command
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
   CXXCPP      C++ preprocessor
-  CPP         C preprocessor
-  F77         Fortran 77 compiler command
-  FFLAGS      Fortran 77 compiler flags
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
 Report bugs to <bagnara at cs.unipr.it>.
 _ACEOF
+ac_status=$?
 fi
 
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
+    test -d "$ac_dir" || continue
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
-test -n "$ac_init_help" && exit 0
+test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-the Parma Watchdog Library configure 0.4
-generated by GNU Autoconf 2.59
+the Parma Watchdog Library configure 0.6
+generated by GNU Autoconf 2.61
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
-  exit 0
+  exit
 fi
-exec 5>config.log
-cat >&5 <<_ACEOF
+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 the Parma Watchdog Library $as_me 0.4, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+It was created by the Parma Watchdog Library $as_me 0.6, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
+exec 5>>config.log
 {
 cat <<_ASUNAME
 ## --------- ##
@@ -1208,7 +1617,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown`
 /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
 /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
 /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
 /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
@@ -1222,6 +1631,7 @@ do
   test -z "$as_dir" && as_dir=.
   echo "PATH: $as_dir"
 done
+IFS=$as_save_IFS
 
 } >&5
 
@@ -1243,7 +1653,6 @@ _ACEOF
 ac_configure_args=
 ac_configure_args0=
 ac_configure_args1=
-ac_sep=
 ac_must_keep_next=false
 for ac_pass in 1 2
 do
@@ -1254,7 +1663,7 @@ do
     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    *\'*)
       ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
@@ -1276,9 +1685,7 @@ do
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
+      ac_configure_args="$ac_configure_args '$ac_arg'"
       ;;
     esac
   done
@@ -1289,8 +1696,8 @@ $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
 # would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
   # Save into config.log some information that might help in debugging.
   {
@@ -1303,20 +1710,34 @@ trap 'exit_status=$?
 _ASBOX
     echo
     # The following way of writing the cache mishandles newlines in values,
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
   (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
     *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-}
+    esac |
+    sort
+)
     echo
 
     cat <<\_ASBOX
@@ -1327,22 +1748,28 @@ _ASBOX
     echo
     for ac_var in $ac_subst_vars
     do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
       cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
 _ASBOX
       echo
       for ac_var in $ac_subst_files
       do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1354,26 +1781,24 @@ _ASBOX
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h | sort
+      cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
-     ' 0
+' 0
 for ac_signal in 1 2 13 15; do
   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
+rm -f -r conftest* confdefs.h
 
 # Predefined preprocessor variables.
 
@@ -1404,14 +1829,17 @@ _ACEOF
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in $CONFIG_SITE; do
+shift
+for ac_site_file
+do
   if test -r "$ac_site_file"; then
     { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
@@ -1427,8 +1855,8 @@ if test -r "$cache_file"; then
     { echo "$as_me:$LINENO: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
     esac
   fi
 else
@@ -1440,12 +1868,11 @@ fi
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+for ac_var in $ac_precious_vars; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
       { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
@@ -1470,8 +1897,7 @@ echo "$as_me:   current value: $ac_new_val" >&2;}
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1488,12 +1914,6 @@ echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start ov
    { (exit 1); exit 1; }; }
 fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
 
 
 
@@ -1518,6 +1938,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
@@ -1527,32 +1952,128 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 # Make sure the sources are there.
 
 
-# Use Automake.
-am__api_version="1.9"
+# Specify the location of additional local Autoconf macros.
+
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
+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
+  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
+  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
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+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.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
    { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
 fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Use Automake.
+am__api_version='1.10'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -1567,8 +2088,8 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1590,7 +2111,7 @@ case $as_dir/ in
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -1609,21 +2130,22 @@ case $as_dir/ in
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -1633,8 +2155,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
 # Just in case
 sleep 1
 echo timestamp > conftest.file
@@ -1676,20 +2198,20 @@ echo "$as_me: error: newly created file is older than distributed files!
 Check your system clock" >&2;}
    { (exit 1); exit 1; }; }
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 test "$program_prefix" != NONE &&
-  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
-  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
 # Double any \ or $.  echo might interpret backslashes.
 # By default was `s,x,x', remove it if useless.
 cat <<\_ACEOF >conftest.sed
 s/[\\$]/&&/g;s/;s,x,x,$//
 _ACEOF
 program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm conftest.sed
+rm -f conftest.sed
 
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
@@ -1704,45 +2226,60 @@ else
 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
-if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-  # We used to keeping the `.' as first argument, in order to
-  # allow $(mkdir_p) to be used without argument.  As in
-  #   $(mkdir_p) $(somedir)
-  # where $(somedir) is conditionally defined.  However this is wrong
-  # for two reasons:
-  #  1. if the package is installed by a user who cannot write `.'
-  #     make install will fail,
-  #  2. the above comment should most certainly read
-  #     $(mkdir_p) $(DESTDIR)$(somedir)
-  #     so it does not work when $(somedir) is undefined and
-  #     $(DESTDIR) is not.
-  #  To support the latter case, we have to write
-  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
-  #  so the `.' trick is pointless.
-  mkdir_p='mkdir -p --'
-else
-  # On NextStep and OpenStep, the `mkdir' command does not
-  # recognize any option.  It will interpret all options as
-  # directories to create, and then abort because `.' already
-  # exists.
-  for d in ./-p ./--version;
-  do
-    test -d $d && rmdir $d
-  done
-  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
-  if test -f "$ac_aux_dir/mkinstalldirs"; then
-    mkdir_p='$(mkinstalldirs)'
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
   else
-    mkdir_p='$(install_sh) -d'
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
   fi
 fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
 
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AWK+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1755,54 +2292,57 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AWK="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AWK" && break
 done
 
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
 all:
-	@echo 'ac_maketemp="$(MAKE)"'
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
 rm -f conftest.make
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   SET_MAKE=
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -1815,12 +2355,16 @@ else
 fi
 rmdir .tst 2>/dev/null
 
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
    { (exit 1); exit 1; }; }
+  fi
 fi
 
 # test whether we have cygpath
@@ -1834,18 +2378,9 @@ fi
 
 
 # Define the identity of the package.
- PACKAGE='watchdog'
- VERSION='0.4'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
+ PACKAGE='pwl'
+ VERSION='0.6'
 
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
 
 # Some tools Automake needs.
 
@@ -1863,7 +2398,7 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
 
 # Installed binaries are usually stripped using `strip' when the user
 # run `make install-strip'.  However `strip' might not be the right
@@ -1873,8 +2408,8 @@ if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1887,32 +2422,34 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1925,33 +2462,47 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
 else
   STRIP="$ac_cv_prog_STRIP"
 fi
 
 fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
@@ -1968,17 +2519,27 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
 
 
 # Generate a configuration header file.
-          ac_config_headers="$ac_config_headers config.h"
+ac_config_headers="$ac_config_headers config.h"
+
+
+# Generate prefixed defines.
+ac_config_commands="$ac_config_commands $PACKAGE-config.h"
+
+
+ISODATE=`date +%Y-%m-%d`
+
+
+
 
 
 # C compiler
 
 
-# Check whether --with-cc or --without-cc was given.
+# Check whether --with-cc was given.
 if test "${with_cc+set}" = set; then
-  withval="$with_cc"
-  CC=$with_cc
-fi;
+  withval=$with_cc; CC=$with_cc
+fi
+
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -1990,7 +2551,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 # Checks for typedefs, structures, and compiler characteristics.
 DEPDIR="${am__leading_dot}deps"
 
-          ac_config_commands="$ac_config_commands depfiles"
+ac_config_commands="$ac_config_commands depfiles"
 
 
 am_make=${MAKE-make}
@@ -2000,8 +2561,8 @@ am__doit:
 .PHONY: am__doit
 END
 # If we don't find an include directive, just comment out the code.
-echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
 am__include="#"
 am__quote=
 _am_result=none
@@ -2028,22 +2589,20 @@ if test "$am__include" = "#"; then
 fi
 
 
-echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
 rm -f confinc confmf
 
-# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+# Check whether --enable-dependency-tracking was given.
 if test "${enable_dependency_tracking+set}" = set; then
-  enableval="$enable_dependency_tracking"
+  enableval=$enable_dependency_tracking;
+fi
 
-fi;
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
 fi
-
-
-if test "x$enable_dependency_tracking" != xno; then
+ if test "x$enable_dependency_tracking" != xno; then
   AMDEP_TRUE=
   AMDEP_FALSE='#'
 else
@@ -2052,7 +2611,6 @@ else
 fi
 
 
-
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2061,8 +2619,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2075,32 +2633,34 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2113,36 +2673,51 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
   CC="$ac_cv_prog_CC"
 fi
 
 if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2155,74 +2730,34 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
 
+  fi
 fi
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2236,7 +2771,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -2247,6 +2782,7 @@ do
   fi
 done
 done
+IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
@@ -2264,22 +2800,23 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+  for ac_prog in cl.exe
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2292,36 +2829,38 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
     test -n "$CC" && break
   done
 fi
 if test -z "$CC"; then
   ac_ct_CC=$CC
-  for ac_prog in cl
+  for ac_prog in cl.exe
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2334,29 +2873,45 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$ac_ct_CC" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 fi
 
 fi
@@ -2369,21 +2924,35 @@ See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
@@ -2408,47 +2977,77 @@ ac_clean_files="$ac_clean_files a.out a.exe b.out"
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
 	# certainly right.
 	break;;
     *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
 	break;;
     * )
 	break;;
   esac
 done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
 else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
@@ -2460,19 +3059,21 @@ See \`config.log' for more details." >&2;}
 fi
 
 ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
 
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -2491,22 +3092,27 @@ See \`config.log' for more details." >&2;}
     fi
   fi
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
 rm -f a.out a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
+# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
@@ -2517,9 +3123,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
 	  break;;
     * ) break;;
   esac
@@ -2533,14 +3138,14 @@ See \`config.log' for more details." >&2;}
 fi
 
 rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
 if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2560,14 +3165,20 @@ main ()
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
@@ -2585,12 +3196,12 @@ fi
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -2613,50 +3224,49 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2672,38 +3282,118 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2719,12 +3409,12 @@ else
     CFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
+  ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2758,12 +3448,17 @@ static char *f (char * (*g) (char **, int), char **p, ...)
 /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    function prototypes and stuff, but not '\xHH' hex character constants.
    These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
+   as 'x'.  The following induces an error, until -std is added to get
    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
    array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
+   that's true only with -std.  */
 int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
 int test (int i, double x);
 struct s1 {int (*f) (int a);};
 struct s2 {int (*f) (double a);};
@@ -2778,205 +3473,57 @@ return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
+rm -f conftest.$ac_ext
 CC=$ac_save_CC
 
 fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
   *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2985,8 +3532,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 depcc="$CC"   am_compiler_list=
 
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3050,6 +3597,7 @@ else
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
        $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
          >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
@@ -3075,13 +3623,11 @@ else
 fi
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
 
-
-
-if
+ if
   test "x$enable_dependency_tracking" != xno \
   && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
   am__fastdepCC_TRUE=
@@ -3093,8 +3639,8 @@ fi
 
 
 
-echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
 if test "${ac_cv_c_const+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3112,10 +3658,10 @@ main ()
 #ifndef __cplusplus
   /* Ultrix mips cc rejects this.  */
   typedef int charset[2];
-  const charset x;
+  const charset cs;
   /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *ccp;
-  char **p;
+  char const *const *pcpcc;
+  char **ppc;
   /* NEC SVR4.0.2 mips cc rejects this.  */
   struct point {int x, y;};
   static struct point const zero = {0,0};
@@ -3124,16 +3670,17 @@ main ()
      an arm of an if-expression whose if-part is not a constant
      expression */
   const char *g = "string";
-  ccp = &g + (g ? g-g : 0);
+  pcpcc = &g + (g ? g-g : 0);
   /* HPUX 7.0 cc rejects these. */
-  ++ccp;
-  p = (char**) ccp;
-  ccp = (char const *const *) p;
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
   { /* SCO 3.2v4 cc rejects this.  */
     char *t;
     char const *s = 0 ? (char *) 0 : (char const *) 0;
 
     *t++ = 0;
+    if (s) return 0;
   }
   { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
     int x[] = {25, 17};
@@ -3152,7 +3699,9 @@ main ()
   }
   { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
     const int foo = 10;
+    if (!foo) return 0;
   }
+  return !cs[0] && !zero.x;
 #endif
 
   ;
@@ -3160,38 +3709,34 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_c_const=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_c_const=no
+	ac_cv_c_const=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
 if test $ac_cv_c_const = no; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -3204,115 +3749,347 @@ fi
 # C++ compiler
 
 
-# Check whether --with-cxx or --without-cxx was given.
+# Check whether --with-cxx was given.
 if test "${with_cxx+set}" = set; then
-  withval="$with_cxx"
-  CXX=$with_cxx
-fi;
+  withval=$with_cxx; CXX=$with_cxx
+fi
 
-ac_ext=cc
+
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-# Checks for programs.
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PERL+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
+  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+  ;;
+esac
 fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+  { echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
 
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
 
-  CC=$ac_ct_CC
+ if test x"$PERL" != xno; then
+  HAVE_PERL_TRUE=
+  HAVE_PERL_FALSE='#'
 else
-  CC="$ac_cv_prog_CC"
+  HAVE_PERL_TRUE='#'
+  HAVE_PERL_FALSE=
 fi
 
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+{ echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
+echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6; }
+# Check whether --enable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+  enableval=$enable_debugging;
+fi
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  OPT_FLAGS="-g"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
+echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6; }
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then
+  enableval=$enable_profiling;
+fi
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPWL_PROFILING=1"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
+echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6; }
+# Check whether --enable-coverage was given.
+if test "${enable_coverage+set}" = set; then
+  enableval=$enable_coverage;
+fi
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
+echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6; }
+# Check whether --enable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+  enableval=$enable_assertions;
+fi
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define NDEBUG 1
+_ACEOF
+
+  debug_flag="-DNDEBUG=1"
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} --enable-assertions, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+arch=no
+enableval=standard
+{ echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
+echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6; }
+# Check whether --enable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+  enableval=$enable_optimization;
+fi
+
+case "${enableval}" in
+sspeed)
+  { echo "$as_me:$LINENO: result: sspeed" >&5
+echo "${ECHO_T}sspeed" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  { echo "$as_me:$LINENO: result: speed" >&5
+echo "${ECHO_T}speed" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  { echo "$as_me:$LINENO: result: size" >&5
+echo "${ECHO_T}size" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  { echo "$as_me:$LINENO: result: standard" >&5
+echo "${ECHO_T}standard" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  { echo "$as_me:$LINENO: result: mild" >&5
+echo "${ECHO_T}mild" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  { echo "$as_me:$LINENO: result: zero" >&5
+echo "${ECHO_T}zero" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=$arch
+{ echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
+echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6; }
+# Check whether --enable-arch was given.
+if test "${enable_arch+set}" = set; then
+  enableval=$enable_arch;
+fi
+
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    { echo "$as_me:$LINENO: result: $m" >&5
+echo "${ECHO_T}$m" >&6; }
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    { echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6; }
+    ;;
+  esac
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6; }
+  ;;
+*)
+  { echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
+
+# Allow additions to C and C++ compilation flags
+
+
+# Check whether --with-cflags was given.
+if test "${with_cflags+set}" = set; then
+  withval=$with_cflags; CFLAGS="$CFLAGS $with_cflags"
+fi
+
+
+
+# Check whether --with-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then
+  withval=$with_cxxflags; CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi
+
+
+enableval=yes
+{ echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
+echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6; }
+# Check whether --enable-watchdog was given.
+if test "${enable_watchdog+set}" = set; then
+  enableval=$enable_watchdog;
+fi
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+build_watchdog_library=$enableval
+ if test x"$build_watchdog_library" = xyes; then
+  BUILD_WATCHDOG_LIBRARY_TRUE=
+  BUILD_WATCHDOG_LIBRARY_FALSE='#'
+else
+  BUILD_WATCHDOG_LIBRARY_TRUE='#'
+  BUILD_WATCHDOG_LIBRARY_FALSE=
+fi
+
+
+if test x"$build_watchdog_library" = xyes
+then
+  # Checks for header files.
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -3320,37 +4097,43 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
+    test -n "$CXX" && break
+  done
 fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -3358,204 +4141,86 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
 fi
 
+  fi
 fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CC" && break
-done
-
-  CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -3577,50 +4242,49 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3636,322 +4300,144 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
+	CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
 int
 main ()
 {
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+
   ;
   return 0;
 }
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f conftest.err conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
+	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
+int
+main ()
+{
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
+  ;
+  return 0;
+}
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-depcc="$CC"   am_compiler_list=
+depcc="$CXX"  am_compiler_list=
 
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
@@ -3973,7 +4459,7 @@ else
   # directory.
   mkdir sub
 
-  am_cv_CC_dependencies_compiler_type=none
+  am_cv_CXX_dependencies_compiler_type=none
   if test "$am_compiler_list" = ""; then
      am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
   fi
@@ -4014,6 +4500,7 @@ else
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
        $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
          >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
@@ -4026,7 +4513,7 @@ else
       #   icc: Command line remark: option '-MP' not supported
       if (grep 'ignoring option' conftest.err ||
           grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
+        am_cv_CXX_dependencies_compiler_type=$depmode
         break
       fi
     fi
@@ -4035,143 +4522,29 @@ else
   cd ..
   rm -rf conftest.dir
 else
-  am_cv_CC_dependencies_compiler_type=none
+  am_cv_CXX_dependencies_compiler_type=none
 fi
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
-
+{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
 
-if
+ if
   test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  echo "$as_me:$LINENO: result: $CXX" >&5
-echo "${ECHO_T}$CXX" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
-echo "${ECHO_T}$ac_ct_CXX" >&6
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CXX" && break
-done
-test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
-
-  CXX=$ac_ct_CXX
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
 fi
 
 
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C++ compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
 
-echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; }
+if test "${ac_cv_header_time+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -4180,361 +4553,176 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
 
 int
 main ()
 {
-#ifndef __GNUC__
-       choke me
-#endif
-
+if ((struct tm *) 0)
+return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_time=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
+	ac_cv_header_time=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
-GXX=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-CXXFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
-echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cxx_g+set}" = set; then
+{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cxx_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cxx_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+  # Broken: fails on valid input.
 continue
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
+#include <ac_nonexistent.h>
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-depcc="$CXX"  am_compiler_list=
+rm -f conftest.err conftest.$ac_ext
 
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
 
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
     done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
+    ac_cv_prog_CXXCPP=$CXXCPP
 
 fi
-echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
-
-
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
+  CXXCPP=$ac_cv_prog_CXXCPP
 else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
+  ac_cv_prog_CXXCPP=$CXXCPP
 fi
-
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
-echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
-if test -z "$CXXCPP"; then
-  if test "${ac_cv_prog_CXXCPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
 for ac_cxx_preproc_warn_flag in '' yes
 do
   # Use a header file that comes with gcc, so configuring glibc
@@ -4556,24 +4744,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -4582,9 +4768,10 @@ sed 's/^/| /' conftest.$ac_ext >&5
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -4594,24 +4781,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -4622,2284 +4807,2053 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
 rm -f conftest.err conftest.$ac_ext
 if $ac_preproc_ok; then
-  break
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 fi
 
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-echo "$as_me:$LINENO: result: $CXXCPP" >&5
-echo "${ECHO_T}$CXXCPP" >&6
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Broken: fails on valid input.
-continue
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <ac_nonexistent.h>
+#include <string.h>
+
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
 else
-  ac_cpp_err=yes
+  ac_cv_header_stdc=no
 fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+rm -f conftest*
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
 fi
-rm -f conftest.err conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
   :
 else
-  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+  ac_cv_header_stdc=no
 fi
+rm -f conftest*
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+fi
 
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
 else
-  cat >conftest.make <<\_ACEOF
-all:
-	@echo 'ac_maketemp="$(MAKE)"'
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
 else
-  eval ac_cv_prog_make_${ac_make}_set=no
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
 fi
-rm -f conftest.make
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  SET_MAKE=
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  SET_MAKE="MAKE=${MAKE-make}"
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
 
-# 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:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
-  ./ | .// | /cC/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-done
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
 
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	eval "$as_ac_Header=no"
 fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL=$ac_install_sh
-  fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+fi
 
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+done
 
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
-# Check for Perl.
-# Extract the first word of "perl", so it can be a program name with args.
-set dummy perl; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_PERL+set}" = set; then
+for ac_header in sys/time.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
-  case $PERL in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PERL="$PERL" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
-  ;;
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
 esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
 fi
-PERL=$ac_cv_path_PERL
 
-if test -n "$PERL"; then
-  echo "$as_me:$LINENO: result: $PERL" >&5
-echo "${ECHO_T}$PERL" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
 fi
 
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## ---------------------------------- ##
+## Report this to bagnara at cs.unipr.it ##
+## ---------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
-if test x"$PERL" != xno; then
-  HAVE_PERL_TRUE=
-  HAVE_PERL_FALSE='#'
-else
-  HAVE_PERL_TRUE='#'
-  HAVE_PERL_FALSE=
 fi
 
+done
 
-# Compilation flags
 
-COMP_FLAGS=""
-OPT_FLAGS=""
+  # Checks for library fuctions.
+  # The following invocations of AC_LANG_PUSH(C) and AC_LANG_POP(C)
+  # are to work around a bug in AC_CHECK_FUNCS.  For more information,
+  # http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-enableval=yes
-echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
-echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6
-# Check whether --enable-debugging or --disable-debugging was given.
-if test "${enable_debugging+set}" = set; then
-  enableval="$enable_debugging"
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  OPT_FLAGS="-g"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
+for ac_func in setitimer
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
 
-enableval=no
-echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
-echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6
-# Check whether --enable-profiling or --disable-profiling was given.
-if test "${enable_profiling+set}" = set; then
-  enableval="$enable_profiling"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  OPT_FLAGS="-g"
-  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-enableval=no
-echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
-echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6
-# Check whether --enable-coverage or --disable-coverage was given.
-if test "${enable_coverage+set}" = set; then
-  enableval="$enable_coverage"
+#undef $ac_func
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  OPT_FLAGS="-g"
-  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
-
-enableval=no
-echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
-echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6
-# Check whether --enable-assertions or --disable-assertions was given.
-if test "${enable_assertions+set}" = set; then
-  enableval="$enable_assertions"
-
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-
-cat >>confdefs.h <<\_ACEOF
-#define NDEBUG 1
-_ACEOF
-
-  debug_flag="-DNDEBUG=1"
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-assertions, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} --enable-assertions, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
-
-arch=no
-enableval=standard
-echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
-echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6
-# Check whether --enable-optimization or --disable-optimization was given.
-if test "${enable_optimization+set}" = set; then
-  enableval="$enable_optimization"
-
-fi;
-case "${enableval}" in
-sspeed)
-  echo "$as_me:$LINENO: result: sspeed" >&5
-echo "${ECHO_T}sspeed" >&6
-  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
-  arch=yes
-  ;;
-speed)
-  echo "$as_me:$LINENO: result: speed" >&5
-echo "${ECHO_T}speed" >&6
-  OPT_FLAGS="$OPT_FLAGS -O3"
-  arch=yes
-  ;;
-size)
-  echo "$as_me:$LINENO: result: size" >&5
-echo "${ECHO_T}size" >&6
-  OPT_FLAGS="$OPT_FLAGS -Os"
-  arch=yes
-  ;;
-standard | yes)
-  echo "$as_me:$LINENO: result: standard" >&5
-echo "${ECHO_T}standard" >&6
-  OPT_FLAGS="$OPT_FLAGS -O2"
-  ;;
-mild)
-  echo "$as_me:$LINENO: result: mild" >&5
-echo "${ECHO_T}mild" >&6
-  OPT_FLAGS="$OPT_FLAGS -O1"
-  ;;
-zero)
-  echo "$as_me:$LINENO: result: zero" >&5
-echo "${ECHO_T}zero" >&6
-  OPT_FLAGS="$OPT_FLAGS -O0"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
-
-enableval=$arch
-echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
-echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6
-# Check whether --enable-arch or --disable-arch was given.
-if test "${enable_arch+set}" = set; then
-  enableval="$enable_arch"
-
-fi;
-case "${enableval}" in
-yes)
-  m=`uname -m`
-  case $m in
-  i?86 | k6 | athlon)
-    echo "$as_me:$LINENO: result: $m" >&5
-echo "${ECHO_T}$m" >&6
-    OPT_FLAGS="$OPT_FLAGS -march=$m"
-    ;;
-  *)
-    echo "$as_me:$LINENO: result: default" >&5
-echo "${ECHO_T}default" >&6
-    ;;
-  esac
-  ;;
-no)
-  echo "$as_me:$LINENO: result: default" >&5
-echo "${ECHO_T}default" >&6
-  ;;
-*)
-  echo "$as_me:$LINENO: result: $enableval" >&5
-echo "${ECHO_T}$enableval" >&6
-  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
-  ;;
-esac
-
-CFLAGS="$COMP_FLAGS $OPT_FLAGS"
-CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
-
-# Allow additions to C and C++ compilation flags
-
-
-# Check whether --with-cflags or --without-cflags was given.
-if test "${with_cflags+set}" = set; then
-  withval="$with_cflags"
-  CFLAGS="$CFLAGS $with_cflags"
-fi;
-
-
-# Check whether --with-cxxflags or --without-cxxflags was given.
-if test "${with_cxxflags+set}" = set; then
-  withval="$with_cxxflags"
-  CXXFLAGS="$CXXFLAGS $with_cxxflags"
-fi;
-
-enableval=yes
-echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
-echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6
-# Check whether --enable-watchdog or --disable-watchdog was given.
-if test "${enable_watchdog+set}" = set; then
-  enableval="$enable_watchdog"
-
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
-build_watchdog_library=$enableval
-
-
-if test x"$build_watchdog_library" = xyes; then
-  BUILD_WATCHDOG_LIBRARY_TRUE=
-  BUILD_WATCHDOG_LIBRARY_FALSE='#'
-else
-  BUILD_WATCHDOG_LIBRARY_TRUE='#'
-  BUILD_WATCHDOG_LIBRARY_FALSE=
-fi
-
-
-if test x"$build_watchdog_library" = xyes
-then
-  # Checks for header files.
-
-echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
-echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
-if test "${ac_cv_header_time+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
 
 int
 main ()
 {
-if ((struct tm *) 0)
-return 0;
+return $ac_func ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_time=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_time=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+	eval "$as_ac_var=no"
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
-echo "${ECHO_T}$ac_cv_header_time" >&6
-if test $ac_cv_header_time = yes; then
 
-cat >>confdefs.h <<\_ACEOF
-#define TIME_WITH_SYS_TIME 1
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
+else
+  { { echo "$as_me:$LINENO: error: CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&5
+echo "$as_me: error: CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&2;}
+   { (exit 1); exit 1; }; }
 fi
+done
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
+fi
 
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
+# Checks for programs.
+# Note that AC_PROG_CC must precede the first use of $GCC abd AC_PROG_CXX
+# must precede the first use of $GXX.  Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+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_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
 
 
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+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_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-int
-main ()
-{
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_stdc=yes
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdc=no
+  CC="$ac_cv_prog_CC"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+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_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
 fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
 else
-  ac_cv_header_stdc=no
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
-rm -f conftest*
 
-fi
 
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  ac_prog_rejected=no
+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
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-( exit $ac_status )
-ac_cv_header_stdc=no
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
 
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
 
 fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_Header=yes"
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+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_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-done
-
 
-
-for ac_header in sys/time.h
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
 do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+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_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <$ac_header>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ---------------------------------- ##
-## Report this to bagnara at cs.unipr.it ##
-## ---------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-fi
-
-done
-
-
-  # Checks for library fuctions.
-  # The following invocations of AC_LANG_PUSH(C) and AC_LANG_POP(C)
-  # are to work around a bug in AC_CHECK_FUNCS.  For more information,
-  # http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
+int
+main ()
+{
 
-for ac_func in setitimer
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
 
 int
 main ()
 {
-return f != $ac_func;
+
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_var=no"
+
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
 
-else
-  { { echo "$as_me:$LINENO: error: CANNOT BUILD THE WATCHDOG LIBRARY
-*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&5
-echo "$as_me: error: CANNOT BUILD THE WATCHDOG LIBRARY
-*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&2;}
-   { (exit 1); exit 1; }; }
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-done
 
-  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 
 fi
 
-# Libtool.
-# Turn off shared libraries during beta-testing, since they
-# make debugging harder and the build process takes too long.
-#AC_DISABLE_SHARED
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
 
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
 
 
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
-  enableval="$enable_shared"
-  p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi;
+depcc="$CC"   am_compiler_list=
 
-# Check whether --enable-static or --disable-static was given.
-if test "${enable_static+set}" = set; then
-  enableval="$enable_static"
-  p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  enable_static=yes
-fi;
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
 
-# Check whether --enable-fast-install or --disable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then
-  enableval="$enable_fast_install"
-  p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
       ;;
+    none) break ;;
     esac
-else
-  enable_fast_install=yes
-fi;
-
-# Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
-   { (exit 1); exit 1; }; }
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
 
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
-if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  cd ..
+  rm -rf conftest.dir
 else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
+  am_cv_CC_dependencies_compiler_type=none
 fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
-build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
 
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
-if test "${ac_cv_host+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
 else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
 fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
-host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 
 
-echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
-echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
-if test "${lt_cv_path_SED+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
+CFLAGS="$save_CFLAGS"
+save_CXXFLAGS="$CXXFLAGS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
+  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_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
 done
+done
+IFS=$as_save_IFS
 
 fi
-
-SED=$lt_cv_path_SED
-echo "$as_me:$LINENO: result: $SED" >&5
-echo "${ECHO_T}$SED" >&6
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi;
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+    test -n "$CXX" && break
+  done
 fi
-if test "${lt_cv_path_LD+set}" = set; then
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
 else
-  lt_cv_path_LD="$LD" # 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_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
 fi
 fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
-   { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${lt_cv_prog_gnu_ld+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
 esac
+    CXX=$ac_ct_CXX
+  fi
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
 
-echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
-if test "${lt_cv_ld_reload_flag+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_ld_reload_flag='-r'
+  fi
 fi
-echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
 esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
 esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
 
-echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
-echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
-if test "${lt_cv_path_NM+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi
-fi
-echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
-echo "${ECHO_T}$lt_cv_path_NM" >&6
-NM="$lt_cv_path_NM"
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
 else
-  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
 fi
 
-echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
-echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
-if test "${lt_cv_deplibs_check_method+set}" = set; then
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-case $host_os in
-aix4* | aix5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+int
+main ()
+{
 
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
+	CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
+int
+main ()
+{
 
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
-  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-freebsd* | kfreebsd*-gnu | dragonfly*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
+int
+main ()
+{
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
 
-interix3*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
+fi
 
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-# This must be Linux ELF.
-linux*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-netbsd*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
   else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+    CXXFLAGS="-g"
   fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-nto-qnx*)
-  lt_cv_deplibs_check_method=unknown
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
   else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+    CXXFLAGS=
   fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
 fi
-echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
+depcc="$CXX"  am_compiler_list=
 
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
 
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then
-  enableval="$enable_libtool_lock"
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
 
-fi;
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
 
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *ELF-32*)
-      HPUX_IA64_MODE="32"
-      ;;
-    *ELF-64*)
-      HPUX_IA64_MODE="64"
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line 6381 "configure"' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-   if test "$lt_cv_prog_gnu_ld" = yes; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -melf32bsmip"
-      ;;
-    *N32*)
-      LD="${LD-ld} -melf32bmipn32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -melf64bmip"
-      ;;
-    esac
-   else
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -32"
-      ;;
-    *N32*)
-      LD="${LD-ld} -n32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -64"
-      ;;
-    esac
-   fi
-  fi
-  rm -rf conftest*
-  ;;
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
 
-x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    case `/usr/bin/file conftest.o` in
-    *32-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_i386"
-          ;;
-        ppc64-*linux*|powerpc64-*linux*)
-          LD="${LD-ld} -m elf32ppclinux"
-          ;;
-        s390x-*linux*)
-          LD="${LD-ld} -m elf_s390"
-          ;;
-        sparc64-*linux*)
-          LD="${LD-ld} -m elf32_sparc"
-          ;;
-      esac
-      ;;
-    *64-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        ppc*-*linux*|powerpc*-*linux*)
-          LD="${LD-ld} -m elf64ppc"
-          ;;
-        s390*-*linux*)
-          LD="${LD-ld} -m elf64_s390"
-          ;;
-        sparc*-*linux*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
 
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
-if test "${lt_cv_cc_needs_belf+set}" = set; then
+CXXFLAGS="$save_CXXFLAGS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat >conftest.$ac_ext <<_ACEOF
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  lt_cv_cc_needs_belf=yes
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-lt_cv_cc_needs_belf=no
+  # Broken: fails on valid input.
+continue
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)    LD="${LD-ld} -64" ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-cygwin* | *-*-mingw* | *-*-pw32*)
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_DLLTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$DLLTOOL"; then
-  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
-  echo "$as_me:$LINENO: result: $DLLTOOL" >&5
-echo "${ECHO_T}$DLLTOOL" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
-  ac_ct_DLLTOOL=$DLLTOOL
-  # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_DLLTOOL"; then
-  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false"
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
-  echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
-echo "${ECHO_T}$ac_ct_DLLTOOL" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  DLLTOOL=$ac_ct_DLLTOOL
-else
-  DLLTOOL="$ac_cv_prog_DLLTOOL"
-fi
-
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
-set dummy ${ac_tool_prefix}as; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_AS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$AS"; then
-  ac_cv_prog_AS="$AS" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AS="${ac_tool_prefix}as"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-AS=$ac_cv_prog_AS
-if test -n "$AS"; then
-  echo "$as_me:$LINENO: result: $AS" >&5
-echo "${ECHO_T}$AS" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_AS"; then
-  ac_ct_AS=$AS
-  # Extract the first word of "as", so it can be a program name with args.
-set dummy as; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_AS"; then
-  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AS="as"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false"
-fi
-fi
-ac_ct_AS=$ac_cv_prog_ac_ct_AS
-if test -n "$ac_ct_AS"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
-echo "${ECHO_T}$ac_ct_AS" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  AS=$ac_ct_AS
-else
-  AS="$ac_cv_prog_AS"
-fi
-
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  echo "$as_me:$LINENO: result: $OBJDUMP" >&5
-echo "${ECHO_T}$OBJDUMP" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false"
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
-echo "${ECHO_T}$ac_ct_OBJDUMP" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  OBJDUMP=$ac_ct_OBJDUMP
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-  ;;
-
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
@@ -6908,6 +6862,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -6918,17 +6873,17 @@ if $ac_preproc_ok; then
 fi
 
     done
-    ac_cv_prog_CPP=$CPP
+    ac_cv_prog_CXXCPP=$CXXCPP
 
 fi
-  CPP=$ac_cv_prog_CPP
+  CXXCPP=$ac_cv_prog_CXXCPP
 else
-  ac_cv_prog_CPP=$CPP
+  ac_cv_prog_CXXCPP=$CXXCPP
 fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
 ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
+for ac_cxx_preproc_warn_flag in '' yes
 do
   # Use a header file that comes with gcc, so configuring glibc
   # with a fresh cross-compiler works.
@@ -6949,24 +6904,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -6975,9 +6928,10 @@ sed 's/^/| /' conftest.$ac_ext >&5
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -6987,24 +6941,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -7015,6 +6967,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -7023,1054 +6976,536 @@ rm -f conftest.err conftest.$ac_ext
 if $ac_preproc_ok; then
   :
 else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
 See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
 See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-for ac_header in dlfcn.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+# 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:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
   else
-    ac_cpp_err=
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
   fi
-else
-  ac_cpp_err=yes
 fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ---------------------------------- ##
-## Report this to bagnara at cs.unipr.it ##
-## ---------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Libtool.
+case `pwd` in
+  *\ * | *\	*)
+    { echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
 
-fi
 
-done
+macro_version='2.2.6'
+macro_revision='1.3012'
 
 
 
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
-echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
-if test -z "$CXXCPP"; then
-  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; }
+if test "${ac_cv_path_SED+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" | sed 99q >conftest.sed
+     $as_unset ac_script || ac_script=
+     # Extract the first word of "sed gsed" to use in msg output
+if test -z "$SED"; then
+set dummy sed gsed; ac_prog_name=$2
+if test "${ac_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cpp_err=yes
+  ac_path_SED_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+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_prog in sed gsed; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+    # Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_SED_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
 fi
-if test -z "$ac_cpp_err"; then
-  :
+
+SED="$ac_cv_path_SED"
+if test -z "$SED"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  ac_cv_path_SED=$SED
+fi
 
-  # Broken: fails on valid input.
-continue
 fi
-rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
+echo "${ECHO_T}$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
-fi
 
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
 
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-echo "$as_me:$LINENO: result: $CXXCPP" >&5
-echo "${ECHO_T}$CXXCPP" >&6
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-fi
 
-ac_ext=f
-ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
-ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_f77_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_F77+set}" = set; then
+{ echo "$as_me:$LINENO: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$F77"; then
-  ac_cv_prog_F77="$F77" # Let the user override the test.
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     # Extract the first word of "fgrep" to use in msg output
+if test -z "$FGREP"; then
+set dummy fgrep; ac_prog_name=$2
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
+  ac_path_FGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
+  for ac_prog in fgrep; do
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
+    ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+    # Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
 
-fi
-fi
-F77=$ac_cv_prog_F77
-if test -n "$F77"; then
-  echo "$as_me:$LINENO: result: $F77" >&5
-echo "${ECHO_T}$F77" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
 
-    test -n "$F77" && break
+    $ac_path_FGREP_found && break 3
   done
-fi
-if test -z "$F77"; then
-  ac_ct_F77=$F77
-  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_F77"; then
-  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_F77="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
 done
+
 done
+IFS=$as_save_IFS
+
 
 fi
+
+FGREP="$ac_cv_path_FGREP"
+if test -z "$FGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
 fi
-ac_ct_F77=$ac_cv_prog_ac_ct_F77
-if test -n "$ac_ct_F77"; then
-  echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
-echo "${ECHO_T}$ac_ct_F77" >&6
+
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  ac_cv_path_FGREP=$FGREP
 fi
 
-  test -n "$ac_ct_F77" && break
-done
 
-  F77=$ac_ct_F77
+   fi
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
 
 
-# Provide some information about the compiler.
-echo "$as_me:7519:" \
-     "checking for Fortran 77 compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-rm -f a.out
-
-# If we don't use `.F' as extension, the preprocessor is not run on the
-# input file.  (Note that this only needs to work for GNU compilers.)
-ac_save_ext=$ac_ext
-ac_ext=F
-echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
-if test "${ac_cv_f77_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-      program main
-#ifndef __GNUC__
-       choke me
-#endif
+test -z "$GREP" && GREP=grep
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_f77_compiler_gnu=$ac_compiler_gnu
 
-fi
-echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
-ac_ext=$ac_save_ext
-ac_test_FFLAGS=${FFLAGS+set}
-ac_save_FFLAGS=$FFLAGS
-FFLAGS=
-echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
-echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_f77_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  FFLAGS=-g
-cat >conftest.$ac_ext <<_ACEOF
-      program main
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_f77_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_f77_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
-echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
-if test "$ac_test_FFLAGS" = set; then
-  FFLAGS=$ac_save_FFLAGS
-elif test $ac_cv_prog_f77_g = yes; then
-  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
-    FFLAGS="-g -O2"
-  else
-    FFLAGS="-g"
-  fi
-else
-  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
-    FFLAGS="-O2"
-  else
-    FFLAGS=
-  fi
-fi
 
-G77=`test $ac_compiler_gnu = yes && echo yes`
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
 
-# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
 
-# find the maximum length of command line arguments
-echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
-echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-    i=0
-  teststring="ABCD"
 
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
 
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
 
-  cygwin* | mingw*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
 
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
 
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ 	]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
     ;;
   *)
-    # If test is not a shell built-in, we'll probably end up computing a
-    # maximum length that is only half of the actual maximum length, but
-    # we can't tell.
-    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-    while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
-	       = "XX$teststring") >/dev/null 2>&1 &&
-	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
-	    lt_cv_sys_max_cmd_len=$new_result &&
-	    test $i != 17 # 1/2 MB should be enough
-    do
-      i=`expr $i + 1`
-      teststring=$teststring$teststring
-    done
-    teststring=
-    # Add a significant safety factor because C++ compilers can tack on massive
-    # amounts of additional arguments before passing them to the linker.
-    # It appears as though 1/2 is a usable value.
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
     ;;
   esac
-
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
 fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
-echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
 else
-  echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
 fi
 
-
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
-echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*) # Its linker distinguishes data from code symbols
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  ;;
-linux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDGIRSTW]'
-    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
   ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+*)
+  lt_cv_prog_gnu_ld=no
   ;;
 esac
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode$symcode*\)[ 	][ 	]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
 
-  # Check to see that the pipe works correctly.
-  pipe_works=no
 
-  rm -f conftest*
-  cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
 
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
-  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
 
-      # Make sure that we snagged all the symbols we need.
-      if grep ' nm_test_var$' "$nlist" >/dev/null; then
-	if grep ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
 
-EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
 
-	  cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
 
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[] =
-{
-EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
-	  cat <<\EOF >> conftest.$ac_ext
-  {0, (lt_ptr_t) 0}
-};
 
-#ifdef __cplusplus
-}
-#endif
-EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -f conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6
-else
-  echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6
-fi
-
-echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6
-if test "${lt_cv_objdir+set}" = set; then
+{ echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
+echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6; }
+if test "${lt_cv_path_NM+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
 else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
 fi
-rmdir .libs 2>/dev/null
 fi
-echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
-echo "${ECHO_T}$lt_cv_objdir" >&6
-objdir=$lt_cv_objdir
-
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_AR+set}" = set; then
+{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -8078,37 +7513,43 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { echo "$as_me:$LINENO: result: $DUMPBIN" >&5
+echo "${ECHO_T}$DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
+    test -n "$DUMPBIN" && break
+  done
 fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -8116,4027 +7557,3316 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AR="ar"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
 fi
 fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
+echo "${ECHO_T}$ac_ct_DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  AR=$ac_ct_AR
-else
-  AR="$ac_cv_prog_AR"
-fi
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
+  test -n "$ac_ct_DUMPBIN" && break
 done
 
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
 fi
 
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
 fi
+test -z "$NM" && NM=nm
 
-  RANLIB=$ac_ct_RANLIB
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_STRIP+set}" = set; then
+
+
+
+
+{ echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
+echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6; }
+if test "${lt_cv_nm_interface+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:7620: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:7623: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:7626: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
   fi
-done
-done
-
-fi
+  rm -f conftest*
 fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
+echo "${ECHO_T}$lt_cv_nm_interface" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+# find the maximum length of command line arguments
+{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
+    i=0
+  teststring="ABCD"
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
 
-  STRIP=$ac_ct_STRIP
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
 
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
 
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$SED" && SED=sed
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
 
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
 
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
     ;;
   *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
     ;;
   esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+
 fi
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
 
 
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
 
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
 
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
 
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
 
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
+{ echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
+echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ echo "$as_me:$LINENO: result: $xsi_shell" >&5
+echo "${ECHO_T}$xsi_shell" >&6; }
 
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+{ echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
+echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ echo "$as_me:$LINENO: result: $lt_shell_append" >&5
+echo "${ECHO_T}$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  lt_unset=false
 fi
 
-  else
-    MAGIC_CMD=:
-  fi
-fi
 
-  fi
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
   ;;
 esac
 
-enable_dlopen=yes
-enable_win32_dll=yes
 
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then
-  enableval="$enable_libtool_lock"
 
-fi;
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
 
-# Check whether --with-pic or --without-pic was given.
-if test "${with_pic+set}" = set; then
-  withval="$with_pic"
-  pic_mode="$withval"
-else
-  pic_mode=default
-fi;
-test -z "$pic_mode" && pic_mode=default
 
-# Use C for the default configuration in the libtool script
-tagname=
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}\n'
 
+{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
 
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
 
 
 
-lt_prog_compiler_no_builtin_flag=
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+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_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+echo "${ECHO_T}$OBJDUMP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_prog_compiler_rtti_exceptions=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8582: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:8586: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $rm conftest*
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+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_prog_ac_ct_OBJDUMP="objdump"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+echo "${ECHO_T}$ac_ct_OBJDUMP" >&6; }
 else
-    :
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
 fi
 
-lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
+test -z "$OBJDUMP" && OBJDUMP=objdump
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
 
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-      ;;
 
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
 
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
+{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    *)
-      lt_prog_compiler_pic='-fPIC'
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
       ;;
     esac
   else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         lt_prog_compiler_pic='-qnocommon'
-         lt_prog_compiler_wl='-Wl,'
-         ;;
-       esac
-       ;;
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
 
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      esac
-      ;;
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
 
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
 
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_pic_works=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8850: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:8854: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works=yes
-     fi
-   fi
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
 
-if test x"$lt_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
 
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works+set}" = set; then
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works=yes
-       fi
-     else
-       lt_prog_compiler_static_works=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+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_prog_AR="${ac_tool_prefix}ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
 fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
-
-if test x"$lt_prog_compiler_static_works" = xyes; then
-    :
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
 else
-    lt_prog_compiler_static=
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_prog_compiler_c_o=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8954: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:8958: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+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_prog_ac_ct_AR="ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
-
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
   fi
 else
-  need_locks=no
+  AR="$ac_cv_prog_AR"
 fi
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
-
-  runpath_var=
-  allow_undefined_flag=
-  enable_shared_with_static_runtimes=no
-  archive_cmds=
-  archive_expsym_cmds=
-  old_archive_From_new_cmds=
-  old_archive_from_expsyms_cmds=
-  export_dynamic_flag_spec=
-  whole_archive_flag_spec=
-  thread_safe_flag_spec=
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_direct=no
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  link_all_deplibs=unknown
-  hardcode_automatic=no
-  module_cmds=
-  module_expsym_cmds=
-  always_export_symbols=no
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
 
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
 
-  ld_shlibs=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
 
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
 
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
 
-EOF
-      fi
-      ;;
 
-    amigaos*)
-      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
 
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      ld_shlibs=no
-      ;;
 
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
 
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+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_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    interix3*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-	if test $supports_anon_versioning = yes; then
-	  archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+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_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<EOF 1>&2
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
+test -z "$STRIP" && STRIP=:
 
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
 
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+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_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+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_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
   else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
 
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
+test -z "$RANLIB" && RANLIB=:
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
 
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  hardcode_direct=yes
-	  else
-  	  # We have old collect2
-  	  hardcode_direct=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  hardcode_minus_L=yes
-  	  hardcode_libdir_flag_spec='-L$libdir'
-  	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
 
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
 
-int
-main ()
-{
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-       hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
 
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec='$convenience'
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
 
-    amigaos*)
-      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs=no
-      ;;
 
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_From_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
 
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      archive_cmds_need_lc=no
-      hardcode_direct=no
-      hardcode_automatic=yes
-      hardcode_shlibpath_var=unsupported
-      whole_archive_flag_spec=''
-      link_all_deplibs=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs=no
-          ;;
-      esac
-    fi
-      ;;
 
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
 
-    freebsd1*)
-      ld_shlibs=no
-      ;;
 
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
 
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
 
-	hardcode_direct=yes
-	export_dynamic_flag_spec='${wl}-E'
 
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
 
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
 
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_libdir_flag_spec_ld='+b $libdir'
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  export_dynamic_flag_spec='${wl}-E'
 
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_ld='-rpath $libdir'
-      fi
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      link_all_deplibs=yes
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
 
-    openbsd*)
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	   archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   hardcode_libdir_flag_spec='-R$libdir'
-	   ;;
-	 *)
-	   archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
 
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
 
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      hardcode_libdir_separator=:
-      ;;
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
 
-    solaris*)
-      no_undefined_flag=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      link_all_deplibs=yes
-      ;;
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
+# Allow CC to be a program name with arguments.
+compiler=$CC
 
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
 
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
 
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-  fi
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
 
-echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6
-test "$ld_shlibs" = no && can_build_shared=no
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
 
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl
-	pic_flag=$lt_prog_compiler_pic
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag
-        allow_undefined_flag=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc=no
-        else
-	  archive_cmds_need_lc=yes
-        fi
-        allow_undefined_flag=$lt_save_allow_undefined_flag
+  (exit $ac_status); }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
       else
-        cat conftest.err 1>&5
+	rm -f "$nlist"T
       fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
-echo "${ECHO_T}$archive_cmds_need_lc" >&6
-      ;;
-    esac
-  fi
-  ;;
-esac
 
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
 
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
+	  cat <<_LT_EOF >> conftest.$ac_ext
 
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
 
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
       else
-	can_build_shared=no
+	echo "cannot find nm_test_var in $nlist" >&5
       fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
     else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
     fi
-    shlibpath_var=LIBPATH
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
   fi
-  ;;
+  rm -rf conftest* conftst*
 
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+fi
 
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6; }
+else
+  { echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6; }
+fi
 
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
 
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
 
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
 
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
 
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
 
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
 
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
 
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
 	;;
-      *)
-	shlibpath_overrides_runpath=yes
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
 	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
+    esac
   fi
+  rm -rf conftest*
   ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 8847 "configure"' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
   fi
+  rm -rf conftest*
   ;;
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
 	;;
     esac
   fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
+  rm -rf conftest*
   ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
-   test -n "$runpath_var" || \
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6
-
-if test "$hardcode_action" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-striplib=
-old_striplib=
-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-   darwin*)
-       if test -n "$STRIP" ; then
-         striplib="$STRIP -x"
-         echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-       else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-       ;;
-   *)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-    ;;
-  esac
-fi
 
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-   ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-   ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
 int
 main ()
 {
-dlopen ();
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dl_dlopen=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  lt_cv_cc_needs_belf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	lt_cv_cc_needs_belf=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
-if test $ac_cv_lib_dl_dlopen = yes; then
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
+{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
 
-   ;;
 
-  *)
-    echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
-if test "${ac_cv_func_shl_load+set}" = set; then
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define shl_load innocuous_shl_load
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+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_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char shl_load (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
+echo "${ECHO_T}$DSYMUTIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
 
-#undef shl_load
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+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_prog_ac_ct_DSYMUTIL="dsymutil"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char shl_load ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
-choke me
-#else
-char (*f) () = shl_load;
-#endif
-#ifdef __cplusplus
-}
-#endif
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
+echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-int
-main ()
-{
-return f != shl_load;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_shl_load=yes
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+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_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-ac_cv_func_shl_load=no
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6
-if test $ac_cv_func_shl_load = yes; then
-  lt_cv_dlopen="shl_load"
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { echo "$as_me:$LINENO: result: $NMEDIT" >&5
+echo "${ECHO_T}$NMEDIT" >&6; }
 else
-  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char shl_load ();
-int
-main ()
-{
-shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dld_shl_load=yes
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+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_prog_ac_ct_NMEDIT="nmedit"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-ac_cv_lib_dld_shl_load=no
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
-if test $ac_cv_lib_dld_shl_load = yes; then
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
+echo "${ECHO_T}$ac_ct_NMEDIT" >&6; }
 else
-  echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
-if test "${ac_cv_func_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define dlopen innocuous_dlopen
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
 
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char dlopen (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_LIPO+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+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_prog_LIPO="${ac_tool_prefix}lipo"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { echo "$as_me:$LINENO: result: $LIPO" >&5
+echo "${ECHO_T}$LIPO" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-#undef dlopen
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
-choke me
-#else
-char (*f) () = dlopen;
-#endif
-#ifdef __cplusplus
-}
-#endif
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+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_prog_ac_ct_LIPO="lipo"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-int
-main ()
-{
-return f != dlopen;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_dlopen=yes
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5
+echo "${ECHO_T}$ac_ct_LIPO" >&6; }
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-ac_cv_func_dlopen=no
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+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_prog_OTOOL="${ac_tool_prefix}otool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6
-if test $ac_cv_func_dlopen = yes; then
-  lt_cv_dlopen="dlopen"
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { echo "$as_me:$LINENO: result: $OTOOL" >&5
+echo "${ECHO_T}$OTOOL" >&6; }
 else
-  echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+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_prog_ac_ct_OTOOL="otool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5
+echo "${ECHO_T}$ac_ct_OTOOL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OTOOL64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+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_prog_OTOOL64="${ac_tool_prefix}otool64"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { echo "$as_me:$LINENO: result: $OTOOL64" >&5
+echo "${ECHO_T}$OTOOL64" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+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_prog_ac_ct_OTOOL64="otool64"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5
+echo "${ECHO_T}$ac_ct_OTOOL64" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
+echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
+echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6; }
+    { echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
+echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
 int
 main ()
 {
-dlopen ();
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dl_dlopen=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  lt_cv_ld_exported_symbols_list=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	lt_cv_ld_exported_symbols_list=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+	LDFLAGS="$save_LDFLAGS"
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
-if test $ac_cv_lib_dl_dlopen = yes; then
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
+echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+$ac_includes_default
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
-int
-main ()
-{
-dlopen ();
-  ;
-  return 0;
-}
+#include <$ac_header>
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_svld_dlopen=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_svld_dlopen=no
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
-if test $ac_cv_lib_svld_dlopen = yes; then
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+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_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+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_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dld_link ();
 int
 main ()
 {
-dld_link ();
+#ifndef __GNUC__
+       choke me
+#endif
+
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dld_dld_link=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_dld_link=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
-if test $ac_cv_lib_dld_dld_link = yes; then
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+	ac_compiler_gnu=no
 fi
 
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+int
+main ()
+{
 
-fi
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+int
+main ()
+{
 
-fi
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+int
+main ()
+{
 
-fi
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
 
 fi
 
-    ;;
-  esac
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
   else
-    enable_dlopen=no
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
   fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+depcc="$CXX"  am_compiler_list=
 
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self+set}" = set; then
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-#line 11299 "configure"
-#include "confdefs.h"
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
 
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-#include <stdio.h>
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
 
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
 
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
 
-#ifdef __cplusplus
-extern "C" void exit (int);
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
 #endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
+  # Broken: fails on valid input.
+continue
+fi
 
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
+rm -f conftest.err conftest.$ac_ext
 
-    exit (status);
-}
-EOF
-  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
-rm -fr conftest*
 
+rm -f conftest.err conftest.$ac_ext
 
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
 fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self_static+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
 else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
 else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-#line 11399 "configure"
-#include "confdefs.h"
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
+  # Broken: fails on valid input.
+continue
+fi
 
-#include <stdio.h>
+rm -f conftest.err conftest.$ac_ext
 
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
 
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
+rm -f conftest.err conftest.$ac_ext
 
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  _lt_caught_CXX_error=yes
+fi
 
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-    exit (status);
-}
-EOF
-  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
+else
+  _lt_caught_CXX_error=yes
 fi
-rm -fr conftest*
 
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
-    fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
 
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
+# Set options
+enable_dlopen=yes
 
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
 
 
-# Report which library types will actually be built
-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
 
-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
-test "$can_build_shared" = "no" && enable_shared=no
+  enable_win32_dll=no
 
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
 
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-    ;;
-esac
-echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
-
-echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
-
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler \
-    CC \
-    LD \
-    lt_prog_compiler_wl \
-    lt_prog_compiler_pic \
-    lt_prog_compiler_static \
-    lt_prog_compiler_no_builtin_flag \
-    export_dynamic_flag_spec \
-    thread_safe_flag_spec \
-    whole_archive_flag_spec \
-    enable_shared_with_static_runtimes \
-    old_archive_cmds \
-    old_archive_from_new_cmds \
-    predep_objects \
-    postdep_objects \
-    predeps \
-    postdeps \
-    compiler_lib_search_path \
-    archive_cmds \
-    archive_expsym_cmds \
-    postinstall_cmds \
-    postuninstall_cmds \
-    old_archive_from_expsyms_cmds \
-    allow_undefined_flag \
-    no_undefined_flag \
-    export_symbols_cmds \
-    hardcode_libdir_flag_spec \
-    hardcode_libdir_flag_spec_ld \
-    hardcode_libdir_separator \
-    hardcode_automatic \
-    module_cmds \
-    module_expsym_cmds \
-    lt_cv_prog_compiler_c_o \
-    exclude_expsyms \
-    include_expsyms; do
-
-    case $var in
-    old_archive_cmds | \
-    old_archive_from_new_cmds | \
-    archive_cmds | \
-    archive_expsym_cmds | \
-    module_cmds | \
-    module_expsym_cmds | \
-    old_archive_from_expsyms_cmds | \
-    export_symbols_cmds | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
     *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
       ;;
     esac
-  done
+else
+  enable_shared=yes
+fi
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
 
-cfgfile="${ofile}T"
-  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
-  $rm -f "$cfgfile"
-  { echo "$as_me:$LINENO: creating $ofile" >&5
-echo "$as_me: creating $ofile" >&6;}
 
-  cat <<__EOF__ >> "$cfgfile"
-#! $SHELL
 
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-#
-# This file is part of GNU Libtool:
-# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.
 
-# A sed program that does not truncate output.
-SED=$lt_SED
 
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="$SED -e 1s/^X//"
 
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-# The names of the tagged configurations supported by this script.
-available_tags=
 
-# ### BEGIN LIBTOOL CONFIG
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A C compiler.
-LTCC=$lt_LTCC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
-
-# A language-specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# The linker used to build libraries.
-LD=$lt_LD
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
+test -z "$pic_mode" && pic_mode=default
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
 
-# Old archive suffix (normally "a").
-libext="$libext"
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-pic_mode=$pic_mode
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
 
-# Do we need a version for libraries?
-need_version=$need_version
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
+test -z "$LN_S" && LN_S="ln -s"
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
+{ echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6; }
+if test "${lt_cv_objdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
 
-# ### END LIBTOOL CONFIG
 
-__EOF__
 
 
-  case $host_os in
-  aix3*)
-    cat <<\EOF >> "$cfgfile"
 
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-EOF
-    ;;
-  esac
 
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
 
-  mv -f "$cfgfile" "$ofile" || \
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
 
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
   fi
-fi
+  ;;
+esac
 
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-CC="$lt_save_CC"
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
 
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
 
-# Check whether --with-tags or --without-tags was given.
-if test "${with_tags+set}" = set; then
-  withval="$with_tags"
-  tagnames="$withval"
-fi;
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
 
-if test -f "$ltmain" && test -n "$tagnames"; then
-  if test ! -f "${ofile}"; then
-    { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
-echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
-  fi
+# Global variables:
+ofile=libtool
+can_build_shared=yes
 
-  if test -z "$LTCC"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
-    if test -z "$LTCC"; then
-      { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
-echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
-    else
-      { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
-echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
-    fi
-  fi
-  if test -z "$LTCFLAGS"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
-  fi
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
 
-  # Extract list of available tagged configurations in $ofile.
-  # Note that this assumes the entire list is on one line.
-  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+with_gnu_ld="$lt_cv_prog_gnu_ld"
 
-  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-  for tagname in $tagnames; do
-    IFS="$lt_save_ifs"
-    # Check whether tagname contains only valid characters
-    case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
-    "") ;;
-    *)  { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
-echo "$as_me: error: invalid tag name: $tagname" >&2;}
-   { (exit 1); exit 1; }; }
-	;;
-    esac
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
 
-    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
-    then
-      { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
-echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
-   { (exit 1); exit 1; }; }
-    fi
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
 
-    # Update the list of available tags.
-    if test -n "$tagname"; then
-      echo appending configuration tag \"$tagname\" to $ofile
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
-      case $tagname in
-      CXX)
-	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-	    (test "X$CXX" != "Xg++"))) ; then
-	  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
 
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
 
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
 
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_flag_spec_ld_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-# Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
 
-# Source file extension for C++ test sources.
-ac_ext=cpp
 
-# Object file extension for compiled C++ test sources.
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
 objext=o
-objext_CXX=$objext
+objext=$objext
 
 # Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
+lt_simple_compile_test_code="int some_variable = 0;"
 
 # Code to be used in simple link tests
-lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
 
 # If no C compiler was specified, use CC.
 LTCC=${LTCC-"$CC"}
@@ -12147,6972 +10877,5670 @@ LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 # Allow CC to be a program name with arguments.
 compiler=$CC
 
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
 
 # save warnings/boilerplate of simple test code
 ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
 eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
 _lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
+$RM conftest*
 
 ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
 eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
 _lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
+$RM -r conftest*
 
 
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_LD=$LD
-lt_save_GCC=$GCC
-GCC=$GXX
-lt_save_with_gnu_ld=$with_gnu_ld
-lt_save_path_LD=$lt_cv_path_LD
-if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  $as_unset lt_cv_prog_gnu_ld
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:10927: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:10931: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
 fi
-if test -n "${lt_cv_path_LDCXX+set}"; then
-  lt_cv_path_LD=$lt_cv_path_LDCXX
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
-  $as_unset lt_cv_path_LD
+    :
 fi
-test -z "${LDCXX+set}" || LD=$LDCXX
-CC=${CXX-"c++"}
-compiler=$CC
-compiler_CXX=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
-
-# We don't want -fno-exception wen compiling C++ code, so set the
-# no_builtin_flag separately
-if test "$GXX" = yes; then
-  lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-else
-  lt_prog_compiler_no_builtin_flag_CXX=
 fi
 
-if test "$GXX" = yes; then
-  # Set up default GNU C++ configuration
 
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi;
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
       ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
-fi
-if test "${lt_cv_path_LD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	lt_prog_compiler_pic='-fPIC'
 	;;
       esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
-   { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${lt_cv_prog_gnu_ld+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
+      ;;
 
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
 
-  # Check if GNU C++ uses GNU ld as the underlying linker, since the
-  # archiving commands below assume that GNU ld is being used.
-  if test "$with_gnu_ld" = yes; then
-    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
 
-    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
 
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-    #     investigate it a little bit more. (MM)
-    wlarc='${wl}'
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
 
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
-	grep 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec_CXX=
-    fi
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
   else
-    with_gnu_ld=no
-    wlarc=
-
-    # A generic and very simple default shared library creation
-    # command for GNU C++ for the case where it uses the native
-    # linker, instead of GNU ld.  If possible, this setting should
-    # overridden to take advantage of the native linker features on
-    # the platform it is being used on.
-    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-  fi
-
-  # Commands to make compiler produce verbose output that lists
-  # what "hidden" libraries, object files and flags are used when
-  # linking a shared library.
-  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
 
-else
-  GXX=no
-  with_gnu_ld=no
-  wlarc=
-fi
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
 
-# PORTME: fill in a description of your system's C++ link characteristics
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
-ld_shlibs_CXX=yes
-case $host_os in
-  aix3*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  aix4* | aix5*)
-    if test "$host_cpu" = ia64; then
-      # On IA64, the linker does run time linking by default, so we don't
-      # have to do anything special.
-      aix_use_runtimelinking=no
-      exp_sym_flag='-Bexport'
-      no_entry_flag=""
-    else
-      aix_use_runtimelinking=no
-
-      # Test if we are trying to use run time linking or normal
-      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-      # need to do runtime linking.
-      case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	for ld_flag in $LDFLAGS; do
-	  case $ld_flag in
-	  *-brtl*)
-	    aix_use_runtimelinking=yes
-	    break
-	    ;;
-	  esac
-	done
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
 	;;
       esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
 
-      exp_sym_flag='-bexport'
-      no_entry_flag='-bnoentry'
-    fi
-
-    # When large executables or shared objects are built, AIX ld can
-    # have problems creating the table of contents.  If linking a library
-    # or program results in "error TOC overflow" add -mminimal-toc to
-    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-    archive_cmds_CXX=''
-    hardcode_direct_CXX=yes
-    hardcode_libdir_separator_CXX=':'
-    link_all_deplibs_CXX=yes
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
-    if test "$GXX" = yes; then
-      case $host_os in aix4.[012]|aix4.[012].*)
-      # We only want to do this on AIX 4.2 and lower, the check
-      # below for broken collect2 doesn't work under 4.3+
-	collect2name=`${CC} -print-prog-name=collect2`
-	if test -f "$collect2name" && \
-	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	then
-	  # We have reworked collect2
-	  hardcode_direct_CXX=yes
-	else
-	  # We have old collect2
-	  hardcode_direct_CXX=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L_CXX=yes
-	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  hardcode_libdir_separator_CXX=
-	fi
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	esac
 	;;
       esac
-      shared_flag='-shared'
-      if test "$aix_use_runtimelinking" = yes; then
-	shared_flag="$shared_flag "'${wl}-G'
-      fi
-    else
-      # not using gcc
-      if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	shared_flag='-G'
-      else
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag='${wl}-G'
-	else
-	  shared_flag='${wl}-bM:SRE'
-	fi
-      fi
-    fi
-
-    # It seems that -bexpall does not export symbols beginning with
-    # underscore (_), so it is better to generate a list of symbols to export.
-    always_export_symbols_CXX=yes
-    if test "$aix_use_runtimelinking" = yes; then
-      # Warning - without using the other runtime loading flags (-brtl),
-      # -berok will link without error, but may produce a broken library.
-      allow_undefined_flag_CXX='-berok'
-      # Determine the default libpath from the value encoded in an empty executable.
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+      ;;
 
-int
-main ()
-{
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
-      hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-      archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-     else
-      if test "$host_cpu" = ia64; then
-	hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	allow_undefined_flag_CXX="-z nodefs"
-	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-      else
-	# Determine the default libpath from the value encoded in an empty executable.
-	cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	# Warning - without using the other run time loading flags,
-	# -berok will link without error, but may produce a broken library.
-	no_undefined_flag_CXX=' ${wl}-bernotok'
-	allow_undefined_flag_CXX=' ${wl}-berok'
-	# Exported symbols can be pulled into shared objects from archives
-	whole_archive_flag_spec_CXX='$convenience'
-	archive_cmds_need_lc_CXX=yes
-	# This is similar to how AIX traditionally builds its shared libraries.
-	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-      fi
-    fi
-    ;;
-
-  beos*)
-    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-      allow_undefined_flag_CXX=unsupported
-      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-      # support --undefined.  This deserves some investigation.  FIXME
-      archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    else
-      ld_shlibs_CXX=no
-    fi
-    ;;
-
-  chorus*)
-    case $cc_basename in
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-
-  cygwin* | mingw* | pw32*)
-    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-    # as there is no search path for DLLs.
-    hardcode_libdir_flag_spec_CXX='-L$libdir'
-    allow_undefined_flag_CXX=unsupported
-    always_export_symbols_CXX=no
-    enable_shared_with_static_runtimes_CXX=yes
-
-    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-      archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      # If the export-symbols file already is a .def file (1st line
-      # is EXPORTS), use it as is; otherwise, prepend...
-      archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	cp $export_symbols $output_objdir/$soname.def;
-      else
-	echo EXPORTS > $output_objdir/$soname.def;
-	cat $export_symbols >> $output_objdir/$soname.def;
-      fi~
-      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-    else
-      ld_shlibs_CXX=no
-    fi
-  ;;
-      darwin* | rhapsody*)
-        case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-        esac
-      archive_cmds_need_lc_CXX=no
-      hardcode_direct_CXX=no
-      hardcode_automatic_CXX=yes
-      hardcode_shlibpath_var_CXX=unsupported
-      whole_archive_flag_spec_CXX=''
-      link_all_deplibs_CXX=yes
-
-    if test "$GXX" = yes ; then
-      lt_int_apple_cc_single_mod=no
-      output_verbose_link_cmd='echo'
-      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
-       lt_int_apple_cc_single_mod=yes
-      fi
-      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-       archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      else
-          archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-        fi
-        module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          else
-            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          fi
-            module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      else
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
       case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-          module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs_CXX=no
-          ;;
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
       esac
-      fi
-        ;;
+      ;;
 
-  dgux*)
-    case $cc_basename in
-      ec++*)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      ghcx*)
-	# Green Hills C++ Compiler
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-  freebsd[12]*)
-    # C++ shared libraries reported to be fairly broken before switch to ELF
-    ld_shlibs_CXX=no
-    ;;
-  freebsd-elf*)
-    archive_cmds_need_lc_CXX=no
-    ;;
-  freebsd* | kfreebsd*-gnu | dragonfly*)
-    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-    # conventions
-    ld_shlibs_CXX=yes
-    ;;
-  gnu*)
-    ;;
-  hpux9*)
-    hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-    hardcode_libdir_separator_CXX=:
-    export_dynamic_flag_spec_CXX='${wl}-E'
-    hardcode_direct_CXX=yes
-    hardcode_minus_L_CXX=yes # Not in the search PATH,
-				# but as the default
-				# location of the library.
-
-    case $cc_basename in
-    CC*)
-      # FIXME: insert proper C++ library support
-      ld_shlibs_CXX=no
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
       ;;
-    aCC*)
-      archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      #
-      # There doesn't appear to be a way to prevent this compiler from
-      # explicitly linking system object files so we need to strip them
-      # from the output so that they don't get included in the library
-      # dependencies.
-      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
       ;;
-    *)
-      if test "$GXX" = yes; then
-        archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
       fi
       ;;
-    esac
-    ;;
-  hpux10*|hpux11*)
-    if test $with_gnu_ld = no; then
-      hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_CXX=:
 
-      case $host_cpu in
-      hppa*64*|ia64*)
-	hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
-        ;;
-      *)
-	export_dynamic_flag_spec_CXX='${wl}-E'
-        ;;
-      esac
-    fi
-    case $host_cpu in
-    hppa*64*|ia64*)
-      hardcode_direct_CXX=no
-      hardcode_shlibpath_var_CXX=no
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
       ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
     *)
-      hardcode_direct_CXX=yes
-      hardcode_minus_L_CXX=yes # Not in the search PATH,
-					      # but as the default
-					      # location of the library.
+      lt_prog_compiler_can_build_shared=no
       ;;
     esac
+  fi
 
-    case $cc_basename in
-      CC*)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      aCC*)
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	esac
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test $with_gnu_ld = no; then
-	    case $host_cpu in
-	    hppa*64*)
-	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    ia64*)
-	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    *)
-	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    esac
-	  fi
-	else
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	fi
-	;;
-    esac
-    ;;
-  interix3*)
-    hardcode_direct_CXX=no
-    hardcode_shlibpath_var_CXX=no
-    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-    export_dynamic_flag_spec_CXX='${wl}-E'
-    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-    # Instead, shared libraries are loaded at an image base (0x10000000 by
-    # default) and relocated if they conflict, which is a slow very memory
-    # consuming and fragmenting process.  To avoid this, we pick a random,
-    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-    archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
     ;;
-  irix5* | irix6*)
-    case $cc_basename in
-      CC*)
-	# SGI C++
-	archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	# Archives containing C++ object files must be created using
-	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test "$with_gnu_ld" = no; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	  else
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
-	  fi
-	fi
-	link_all_deplibs_CXX=yes
-	;;
-    esac
-    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-    hardcode_libdir_separator_CXX=:
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
     ;;
-  linux*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-
-	hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	;;
-      icpc*)
-	# Intel C++
-	with_gnu_ld=yes
-	# version 8.0 and above of icpc choke on multiply defined symbols
-	# if we add $predep_objects and $postdep_objects, however 7.1 and
-	# earlier do not add the objects themselves.
-	case `$CC -V 2>&1` in
-	*"Version 7."*)
-  	  archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-  	  archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	*)  # Version 8.0 or newer
-	  tmp_idyn=
-	  case $host_cpu in
-	    ia64*) tmp_idyn=' -i_dynamic';;
-	  esac
-  	  archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	  archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	esac
-	archive_cmds_need_lc_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	;;
-      pgCC*)
-        # Portland Group C++ compiler
-	archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-  	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-
-	hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-        ;;
-      cxx*)
-	# Compaq C++
-	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+esac
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
 
-	runpath_var=LD_RUN_PATH
-	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	hardcode_libdir_separator_CXX=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-    esac
-    ;;
-  lynxos*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  m88k*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  mvs*)
-    case $cc_basename in
-      cxx*)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-      wlarc=
-      hardcode_libdir_flag_spec_CXX='-R$libdir'
-      hardcode_direct_CXX=yes
-      hardcode_shlibpath_var_CXX=no
-    fi
-    # Workaround some broken pre-1.5 toolchains
-    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-    ;;
-  openbsd2*)
-    # C++ shared libraries are fairly broken
-    ld_shlibs_CXX=no
-    ;;
-  openbsd*)
-    hardcode_direct_CXX=yes
-    hardcode_shlibpath_var_CXX=no
-    archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-      export_dynamic_flag_spec_CXX='${wl}-E'
-      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    fi
-    output_verbose_link_cmd='echo'
-    ;;
-  osf3*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
 
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	hardcode_libdir_separator_CXX=:
 
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
 
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      cxx*)
-	allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	hardcode_libdir_separator_CXX=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	  archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
 
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:11266: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:11270: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
 
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6; }
 
-	else
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	fi
-	;;
-    esac
-    ;;
-  osf4* | osf5*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
 
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+fi
 
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	hardcode_libdir_separator_CXX=:
 
-	# Archives containing C++ object files must be created using
-	# the KAI C++ compiler.
-	old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      cxx*)
-	allow_undefined_flag_CXX=' -expect_unresolved \*'
-	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	  echo "-hidden">> $lib.exp~
-	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
-	  $rm $lib.exp'
-
-	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	hardcode_libdir_separator_CXX=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
 
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
 
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
 
-	else
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	fi
-	;;
-    esac
-    ;;
-  psos*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  sunos4*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.x
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      lcc*)
-	# Lucid
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-  solaris*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.2, 5.x and Centerline C++
-        archive_cmds_need_lc_CXX=yes
-	no_undefined_flag_CXX=' -zdefs'
-	archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	hardcode_libdir_flag_spec_CXX='-R$libdir'
-	hardcode_shlibpath_var_CXX=no
-	case $host_os in
-	  solaris2.[0-5] | solaris2.[0-5].*) ;;
-	  *)
-	    # The C++ compiler is used as linker so we must use $wl
-	    # flag to pass the commands to the underlying system
-	    # linker. We must also pass each convience library through
-	    # to the system linker between allextract/defaultextract.
-	    # The C++ compiler will combine linker options so we
-	    # cannot just pass the convience library names through
-	    # without $wl.
-	    # Supported since Solaris 2.6 (maybe 2.5.1?)
-	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
-	    ;;
-	esac
-	link_all_deplibs_CXX=yes
 
-	output_verbose_link_cmd='echo'
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
 
-	# Archives containing C++ object files must be created using
-	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	;;
-      gcx*)
-	# Green Hills C++ Compiler
-	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6; }
 
-	# The C++ compiler must be used to create the archive.
-	old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	;;
-      *)
-	# GNU C++ compiler with Solaris linker
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
-	  if $CC --version | grep -v '^2\.7' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
 
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  else
-	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	    # platform.
-	    archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
 
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  fi
 
-	  hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
-	fi
-	;;
-    esac
-    ;;
-  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-    no_undefined_flag_CXX='${wl}-z,text'
-    archive_cmds_need_lc_CXX=no
-    hardcode_shlibpath_var_CXX=no
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  sysv5* | sco3.2v5* | sco5v6*)
-    # Note: We can NOT use -z defs as we might desire, because we do not
-    # link with -lc, and that would cause any symbols used from libc to
-    # always be unresolved, which means just about no library would
-    # ever link correctly.  If we're not using GNU ld we use -z text
-    # though, which does catch some bad symbols but isn't as heavy-handed
-    # as -z defs.
-    # For security reasons, it is highly recommended that you always
-    # use absolute paths for naming shared libraries, and exclude the
-    # DT_RUNPATH tag from executables and libraries.  But doing so
-    # requires that you compile everything twice, which is a pain.
-    # So that behaviour is only enabled if SCOABSPATH is set to a
-    # non-empty value in the environment.  Most likely only useful for
-    # creating official distributions of packages.
-    # This is a hack until libtool officially supports absolute path
-    # names for shared libraries.
-    no_undefined_flag_CXX='${wl}-z,text'
-    allow_undefined_flag_CXX='${wl}-z,nodefs'
-    archive_cmds_need_lc_CXX=no
-    hardcode_shlibpath_var_CXX=no
-    hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-    hardcode_libdir_separator_CXX=':'
-    link_all_deplibs_CXX=yes
-    export_dynamic_flag_spec_CXX='${wl}-Bexport'
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  tandem*)
-    case $cc_basename in
-      NCC*)
-	# NonStop-UX NCC 3.20
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-  vxworks*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  *)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-esac
-echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
-echo "${ECHO_T}$ld_shlibs_CXX" >&6
-test "$ld_shlibs_CXX" = no && can_build_shared=no
 
-GCC_CXX="$GXX"
-LD_CXX="$LD"
 
 
-cat > conftest.$ac_ext <<EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-EOF
 
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:11371: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:11375: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
-  # The `*' in the case matches for architectures that use `case' in
-  # $output_verbose_cmd can trigger glob expansion during the loop
-  # eval without this substitution.
-  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
-  for p in `eval $output_verbose_link_cmd`; do
-    case $p in
 
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" \
-	  || test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
 
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
-	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
-	 fi
-       fi
-       ;;
 
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
 
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
 
-    *) ;; # Ignore the rest.
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-    esac
-  done
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:11426: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:11430: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling CXX test program"
 fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
-$rm -f confest.$objext
 
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix3*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
 
-solaris*)
-  case $cc_basename in
-  CC*)
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    postdeps_CXX='-lCstd -lCrun'
-    ;;
-  esac
-  ;;
-esac
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
 
 
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
 
-lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
 
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
 
+  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
     case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
       fi
       ;;
+
     amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-      ;;
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | os2* | pw32*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
       case $host_cpu in
-      hppa*64*|ia64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
       esac
       ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
       ;;
-    esac
-  else
-    case $host_os in
-      aix4* | aix5*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
 	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
 	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
 	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
 	esac
-	;;
-       darwin*)
-         # PIC is the default on this platform
-         # Common symbols not allowed in MH_DYLIB files
-         case $cc_basename in
-           xlc*)
-           lt_prog_compiler_pic_CXX='-qnocommon'
-           lt_prog_compiler_wl_CXX='-Wl,'
-           ;;
-         esac
-       ;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
 	esac
-	;;
-      freebsd* | kfreebsd*-gnu | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
 	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux*)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  icpc* | ecpc*)
-	    # Intel C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC*)
-	    # Portland Group C++ compiler.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec=
+	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
 	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
+      else
+        ld_shlibs=no
+      fi
+      ;;
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_pic_works_CXX=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13739: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:13743: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works_CXX=yes
-     fi
-   fi
-   $rm conftest*
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
-if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
-fi
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
 
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13843: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:13847: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
 
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
 fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
 
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix4* | aix5*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
-  ;;
-  cygwin* | mingw*)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
+fi
 
-echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
-echo "${ECHO_T}$ld_shlibs_CXX" >&6
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+int
+main ()
+{
 
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl_CXX
-	pic_flag=$lt_prog_compiler_pic_CXX
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-        allow_undefined_flag_CXX=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc_CXX=no
-        else
-	  archive_cmds_need_lc_CXX=yes
-        fi
-        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
-echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
 fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
 
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
+fi
 
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
       fi
       ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
 
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
 
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_from_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
+    darwin* | rhapsody*)
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
 
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  whole_archive_flag_spec=''
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
   esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
   else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  ld_shlibs=no
   fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
 
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
+      ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
       ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
       ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
 
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_flag_spec_ld='+b $libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
 
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
 
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        cat >conftest.$ac_ext <<_ACEOF
+int foo(void) {}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
 
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
+fi
 
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+        LDFLAGS="$save_LDFLAGS"
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
 
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
 
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
+    *nto* | *qnx*)
+      ;;
 
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
       ;;
-    siemens)
-      need_lib_prefix=no
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
       ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
       ;;
-  esac
-  ;;
 
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
 	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
+      esac
+      link_all_deplibs=yes
+      ;;
 
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-*)
-  dynamic_linker=no
-  ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
 
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
 
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" || \
-   test -n "$runpath_var_CXX" || \
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
 
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct_CXX" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
-echo "${ECHO_T}$hardcode_action_CXX" >&6
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
 
-if test "$hardcode_action_CXX" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
 
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
 
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_CXX \
-    CC_CXX \
-    LD_CXX \
-    lt_prog_compiler_wl_CXX \
-    lt_prog_compiler_pic_CXX \
-    lt_prog_compiler_static_CXX \
-    lt_prog_compiler_no_builtin_flag_CXX \
-    export_dynamic_flag_spec_CXX \
-    thread_safe_flag_spec_CXX \
-    whole_archive_flag_spec_CXX \
-    enable_shared_with_static_runtimes_CXX \
-    old_archive_cmds_CXX \
-    old_archive_from_new_cmds_CXX \
-    predep_objects_CXX \
-    postdep_objects_CXX \
-    predeps_CXX \
-    postdeps_CXX \
-    compiler_lib_search_path_CXX \
-    archive_cmds_CXX \
-    archive_expsym_cmds_CXX \
-    postinstall_cmds_CXX \
-    postuninstall_cmds_CXX \
-    old_archive_from_expsyms_cmds_CXX \
-    allow_undefined_flag_CXX \
-    no_undefined_flag_CXX \
-    export_symbols_cmds_CXX \
-    hardcode_libdir_flag_spec_CXX \
-    hardcode_libdir_flag_spec_ld_CXX \
-    hardcode_libdir_separator_CXX \
-    hardcode_automatic_CXX \
-    module_cmds_CXX \
-    module_expsym_cmds_CXX \
-    lt_cv_prog_compiler_c_o_CXX \
-    exclude_expsyms_CXX \
-    include_expsyms_CXX; do
-
-    case $var in
-    old_archive_cmds_CXX | \
-    old_archive_from_new_cmds_CXX | \
-    archive_cmds_CXX | \
-    archive_expsym_cmds_CXX | \
-    module_cmds_CXX | \
-    module_expsym_cmds_CXX | \
-    old_archive_from_expsyms_cmds_CXX | \
-    export_symbols_cmds_CXX | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
       ;;
+
     *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ld_shlibs=no
       ;;
     esac
-  done
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
 
-cfgfile="$ofile"
+{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+with_gnu_ld=$with_gnu_ld
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
 
-# A C compiler.
-LTCC=$lt_LTCC
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
 
-# A language-specific compiler.
-CC=$lt_compiler_CXX
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_CXX
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
 
-# An ERE matcher.
-EGREP=$lt_EGREP
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-# The linker used to build libraries.
-LD=$lt_LD_CXX
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
 
-# Old archive suffix (normally "a").
-libext="$libext"
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-pic_mode=$pic_mode
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_CXX
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_CXX
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_CXX
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_CXX
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_CXX
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_CXX
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_CXX
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_CXX"
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
 
-# ### END LIBTOOL TAG CONFIG: $tagname
 
-__EOF__
 
 
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
 
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-CC=$lt_save_CC
-LDCXX=$LD
-LD=$lt_save_LD
-GCC=$lt_save_GCC
-with_gnu_ldcxx=$with_gnu_ld
-with_gnu_ld=$lt_save_with_gnu_ld
-lt_cv_path_LDCXX=$lt_cv_path_LD
-lt_cv_path_LD=$lt_save_path_LD
-lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
 
-	else
-	  tagname=""
-	fi
-	;;
 
-      F77)
-	if test -n "$F77" && test "X$F77" != "Xno"; then
-
-ac_ext=f
-ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
-ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_f77_compiler_gnu
-
-
-archive_cmds_need_lc_F77=no
-allow_undefined_flag_F77=
-always_export_symbols_F77=no
-archive_expsym_cmds_F77=
-export_dynamic_flag_spec_F77=
-hardcode_direct_F77=no
-hardcode_libdir_flag_spec_F77=
-hardcode_libdir_flag_spec_ld_F77=
-hardcode_libdir_separator_F77=
-hardcode_minus_L_F77=no
-hardcode_automatic_F77=no
-module_cmds_F77=
-module_expsym_cmds_F77=
-link_all_deplibs_F77=unknown
-old_archive_cmds_F77=$old_archive_cmds
-no_undefined_flag_F77=
-whole_archive_flag_spec_F77=
-enable_shared_with_static_runtimes_F77=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-objext_F77=$objext
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
 
-# Code to be used in simple link tests
-lt_simple_link_test_code="      program t\n      end\n"
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
 
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
 
 
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${F77-"f77"}
-compiler=$CC
-compiler_F77=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
 
-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
 
-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
-test "$can_build_shared" = "no" && enable_shared=no
 
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-  ;;
-esac
-echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
 
-echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
 
-GCC_F77="$G77"
-LD_F77="$LD"
 
-lt_prog_compiler_wl_F77=
-lt_prog_compiler_pic_F77=
-lt_prog_compiler_static_F77=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl_F77='-Wl,'
-    lt_prog_compiler_static_F77='-static'
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_F77='-Bstatic'
-      fi
-      ;;
 
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
-      ;;
 
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
-      ;;
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_F77='-fno-common'
-      ;;
 
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared_F77=no
-      enable_shared=no
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_F77=-Kconform_pic
-      fi
-      ;;
 
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_F77='-fPIC'
-	;;
-      esac
-      ;;
 
-    *)
-      lt_prog_compiler_pic_F77='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_F77='-Bstatic'
-      else
-	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         lt_prog_compiler_pic_F77='-qnocommon'
-         lt_prog_compiler_wl_F77='-Wl,'
-         ;;
-       esac
-       ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
-      ;;
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_F77='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static_F77='-non_shared'
-      ;;
 
-    newsos6)
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	lt_prog_compiler_wl_F77='-Wl,'
-	lt_prog_compiler_pic_F77='-KPIC'
-	lt_prog_compiler_static_F77='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl_F77='-Wl,'
-	lt_prog_compiler_pic_F77='-fpic'
-	lt_prog_compiler_static_F77='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl_F77='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static_F77='-non_shared'
-        ;;
-      esac
-      ;;
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static_F77='-non_shared'
-      ;;
 
-    solaris*)
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl_F77='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl_F77='-Wl,';;
-      esac
-      ;;
 
-    sunos4*)
-      lt_prog_compiler_wl_F77='-Qoption ld '
-      lt_prog_compiler_pic_F77='-PIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic_F77='-Kconform_pic'
-	lt_prog_compiler_static_F77='-Bstatic'
-      fi
-      ;;
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    unicos*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      lt_prog_compiler_can_build_shared_F77=no
-      ;;
 
-    uts4*)
-      lt_prog_compiler_pic_F77='-pic'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    *)
-      lt_prog_compiler_can_build_shared_F77=no
-      ;;
-    esac
-  fi
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_F77"; then
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_pic_works_F77=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_F77"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:15413: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:15417: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works_F77=yes
-     fi
-   fi
-   $rm conftest*
-
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
 
-if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
-    case $lt_prog_compiler_pic_F77 in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
-     esac
-else
-    lt_prog_compiler_pic_F77=
-     lt_prog_compiler_can_build_shared_F77=no
-fi
 
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_F77=
-    ;;
-  *)
-    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
-    ;;
-esac
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works_F77=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works_F77=yes
-       fi
-     else
-       lt_prog_compiler_static_works_F77=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
 
-if test x"$lt_prog_compiler_static_works_F77" = xyes; then
-    :
-else
-    lt_prog_compiler_static_F77=
-fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_c_o_F77=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:15517: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:15521: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_F77=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
 
-  runpath_var=
-  allow_undefined_flag_F77=
-  enable_shared_with_static_runtimes_F77=no
-  archive_cmds_F77=
-  archive_expsym_cmds_F77=
-  old_archive_From_new_cmds_F77=
-  old_archive_from_expsyms_cmds_F77=
-  export_dynamic_flag_spec_F77=
-  whole_archive_flag_spec_F77=
-  thread_safe_flag_spec_F77=
-  hardcode_libdir_flag_spec_F77=
-  hardcode_libdir_flag_spec_ld_F77=
-  hardcode_libdir_separator_F77=
-  hardcode_direct_F77=no
-  hardcode_minus_L_F77=no
-  hardcode_shlibpath_var_F77=unsupported
-  link_all_deplibs_F77=unknown
-  hardcode_automatic_F77=no
-  module_cmds_F77=
-  module_expsym_cmds_F77=
-  always_export_symbols_F77=no
-  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms_F77=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
 
-  ld_shlibs_F77=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
 
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec_F77='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	whole_archive_flag_spec_F77=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
 
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs_F77=no
-	cat <<EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
 
-EOF
-      fi
-      ;;
 
-    amigaos*)
-      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_minus_L_F77=yes
-
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      ld_shlibs_F77=no
-      ;;
 
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag_F77=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      allow_undefined_flag_F77=unsupported
-      always_export_symbols_F77=no
-      enable_shared_with_static_runtimes_F77=yes
-      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    interix3*)
-      hardcode_direct_F77=no
-      hardcode_shlibpath_var_F77=no
-      hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec_F77='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
 
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-	if test $supports_anon_versioning = yes; then
-	  archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
 
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	ld_shlibs_F77=no
-	cat <<EOF 1>&2
+  { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
 
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs_F77=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    ld_shlibs_F77=no
-	  fi
-	;;
-      esac
-      ;;
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
 
-    sunos4*)
-      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
 
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
       else
-	ld_shlibs_F77=no
+	can_build_shared=no
       fi
       ;;
     esac
-
-    if test "$ld_shlibs_F77" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec_F77=
-      export_dynamic_flag_spec_F77=
-      whole_archive_flag_spec_F77=
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
     fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag_F77=unsupported
-      always_export_symbols_F77=yes
-      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L_F77=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct_F77=unsupported
-      fi
-      ;;
+    shlibpath_var=LIBPATH
+  fi
+  ;;
 
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
 
-      archive_cmds_F77=''
-      hardcode_direct_F77=yes
-      hardcode_libdir_separator_F77=':'
-      link_all_deplibs_F77=yes
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
 
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  hardcode_direct_F77=yes
-	  else
-  	  # We have old collect2
-  	  hardcode_direct_F77=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  hardcode_minus_L_F77=yes
-  	  hardcode_libdir_flag_spec_F77='-L$libdir'
-  	  hardcode_libdir_separator_F77=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
 
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols_F77=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag_F77='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       cat >conftest.$ac_ext <<_ACEOF
-      program main
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
 
-       hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
-	archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag_F77="-z nodefs"
-	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 cat >conftest.$ac_ext <<_ACEOF
-      program main
+freebsd1*)
+  dynamic_linker=no
+  ;;
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag_F77=' ${wl}-bernotok'
-	  allow_undefined_flag_F77=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec_F77='$convenience'
-	  archive_cmds_need_lc_F77=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_minus_L_F77=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs_F77=no
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
       ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec_F77=-rdynamic
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
       ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
 
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec_F77=' '
-      allow_undefined_flag_F77=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_From_new_cmds_F77='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes_F77=yes
-      ;;
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
 
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      archive_cmds_need_lc_F77=no
-      hardcode_direct_F77=no
-      hardcode_automatic_F77=yes
-      hardcode_shlibpath_var_F77=unsupported
-      whole_archive_flag_spec_F77=''
-      link_all_deplibs_F77=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
     else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs_F77=no
-          ;;
-      esac
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
     fi
-      ;;
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
 
-    dgux*)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_shlibpath_var_F77=no
-      ;;
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
 
-    freebsd1*)
-      ld_shlibs_F77=no
-      ;;
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
 
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_F77=yes
-      hardcode_minus_L_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
+int
+main ()
+{
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      hardcode_direct_F77=yes
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then
+  shlibpath_overrides_runpath=yes
+fi
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L_F77=yes
-      export_dynamic_flag_spec_F77='${wl}-E'
-      ;;
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_F77=:
 
-	hardcode_direct_F77=yes
-	export_dynamic_flag_spec_F77='${wl}-E'
+fi
 
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L_F77=yes
-      fi
-      ;;
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
 
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_F77=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_libdir_flag_spec_ld_F77='+b $libdir'
-	  hardcode_direct_F77=no
-	  hardcode_shlibpath_var_F77=no
-	  ;;
-	*)
-	  hardcode_direct_F77=yes
-	  export_dynamic_flag_spec_F77='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L_F77=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
-      fi
-      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      link_all_deplibs_F77=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
-
-    newsos6)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_F77=yes
-      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      hardcode_shlibpath_var_F77=no
-      ;;
-
-    openbsd*)
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_F77='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	   archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   hardcode_libdir_flag_spec_F77='-R$libdir'
-	   ;;
-	 *)
-	   archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_minus_L_F77=yes
-      allow_undefined_flag_F77=unsupported
-      archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag_F77=' -expect_unresolved \*'
-	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      ;;
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag_F77=' -expect_unresolved \*'
-	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
 
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec_F77='-rpath $libdir'
-      fi
-      hardcode_libdir_separator_F77=:
-      ;;
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
 
-    solaris*)
-      no_undefined_flag_F77=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_shlibpath_var_F77=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      link_all_deplibs_F77=yes
-      ;;
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_direct_F77=yes
-      hardcode_minus_L_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
 
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_F77=yes # is this really true???
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
 	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds_F77='$CC -r -o $output$reload_objs'
-	  hardcode_direct_F77=no
-        ;;
-	motorola)
-	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+      *)
+	shlibpath_overrides_runpath=yes
 	;;
       esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var_F77=no
-      ;;
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
 
-    sysv4.3*)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var_F77=no
-      export_dynamic_flag_spec_F77='-Bexport'
-      ;;
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var_F77=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs_F77=yes
-      fi
-      ;;
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      no_undefined_flag_F77='${wl}-z,text'
-      archive_cmds_need_lc_F77=no
-      hardcode_shlibpath_var_F77=no
-      runpath_var='LD_RUN_PATH'
+rdos*)
+  dynamic_linker=no
+  ;;
 
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag_F77='${wl}-z,text'
-      allow_undefined_flag_F77='${wl}-z,nodefs'
-      archive_cmds_need_lc_F77=no
-      hardcode_shlibpath_var_F77=no
-      hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator_F77=':'
-      link_all_deplibs_F77=yes
-      export_dynamic_flag_spec_F77='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
 
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
       ;;
-
-    uts4*)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_shlibpath_var_F77=no
+    siemens)
+      need_lib_prefix=no
       ;;
-
-    *)
-      ld_shlibs_F77=no
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
       ;;
-    esac
-  fi
+  esac
+  ;;
 
-echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
-echo "${ECHO_T}$ld_shlibs_F77" >&6
-test "$ld_shlibs_F77" = no && can_build_shared=no
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_F77" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_F77=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_F77 in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl_F77
-	pic_flag=$lt_prog_compiler_pic_F77
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_F77
-        allow_undefined_flag_F77=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc_F77=no
-        else
-	  archive_cmds_need_lc_F77=yes
-        fi
-        allow_undefined_flag_F77=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
-echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix4* | aix5*)
-  version_type=linux
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
   need_lib_prefix=no
   need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
     case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
   fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
   ;;
 
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
   ;;
 
-bsdi[45]*)
+uts4*)
   version_type=linux
-  need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
   ;;
 
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
 
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
 
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
 
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
 
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
 
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
 
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
 
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
 
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
 
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
 
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
 
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
 
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
 
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
 
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-*)
-  dynamic_linker=no
-  ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
 
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
 
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action_F77=
-if test -n "$hardcode_libdir_flag_spec_F77" || \
-   test -n "$runpath_var_F77" || \
-   test "X$hardcode_automatic_F77" = "Xyes" ; then
 
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct_F77" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
-     test "$hardcode_minus_L_F77" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_F77=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_F77=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_F77=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
-echo "${ECHO_T}$hardcode_action_F77" >&6
 
-if test "$hardcode_action_F77" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
 
 
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_F77 \
-    CC_F77 \
-    LD_F77 \
-    lt_prog_compiler_wl_F77 \
-    lt_prog_compiler_pic_F77 \
-    lt_prog_compiler_static_F77 \
-    lt_prog_compiler_no_builtin_flag_F77 \
-    export_dynamic_flag_spec_F77 \
-    thread_safe_flag_spec_F77 \
-    whole_archive_flag_spec_F77 \
-    enable_shared_with_static_runtimes_F77 \
-    old_archive_cmds_F77 \
-    old_archive_from_new_cmds_F77 \
-    predep_objects_F77 \
-    postdep_objects_F77 \
-    predeps_F77 \
-    postdeps_F77 \
-    compiler_lib_search_path_F77 \
-    archive_cmds_F77 \
-    archive_expsym_cmds_F77 \
-    postinstall_cmds_F77 \
-    postuninstall_cmds_F77 \
-    old_archive_from_expsyms_cmds_F77 \
-    allow_undefined_flag_F77 \
-    no_undefined_flag_F77 \
-    export_symbols_cmds_F77 \
-    hardcode_libdir_flag_spec_F77 \
-    hardcode_libdir_flag_spec_ld_F77 \
-    hardcode_libdir_separator_F77 \
-    hardcode_automatic_F77 \
-    module_cmds_F77 \
-    module_expsym_cmds_F77 \
-    lt_cv_prog_compiler_c_o_F77 \
-    exclude_expsyms_F77 \
-    include_expsyms_F77; do
-
-    case $var in
-    old_archive_cmds_F77 | \
-    old_archive_from_new_cmds_F77 | \
-    archive_cmds_F77 | \
-    archive_expsym_cmds_F77 | \
-    module_cmds_F77 | \
-    module_expsym_cmds_F77 | \
-    old_archive_from_expsyms_cmds_F77 | \
-    export_symbols_cmds_F77 | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
 
-cfgfile="$ofile"
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_F77
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
 
-# A C compiler.
-LTCC=$lt_LTCC
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
 
-# A language-specific compiler.
-CC=$lt_compiler_F77
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_F77
 
-# An ERE matcher.
-EGREP=$lt_EGREP
 
-# The linker used to build libraries.
-LD=$lt_LD_F77
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_F77
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
 
-# Old archive suffix (normally "a").
-libext="$libext"
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_F77
-pic_mode=$pic_mode
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_F77
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_F77
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6; }
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_F77
-archive_expsym_cmds=$lt_archive_expsym_cmds_F77
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_F77
-module_expsym_cmds=$lt_module_expsym_cmds_F77
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_F77
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_F77
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_F77
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_F77
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_F77
+  darwin*)
+  # if libdl is installed we need to link against it
+    { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_F77
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
+	ac_cv_lib_dl_dlopen=no
+fi
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_F77
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+fi
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+    ;;
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_F77
+  *)
+    { echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; }
+if test "${ac_cv_func_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define shl_load innocuous_shl_load
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_F77
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_F77
+#undef shl_load
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_shl_load || defined __stub___shl_load
+choke me
+#endif
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_F77
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+	ac_cv_func_shl_load=no
+fi
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6; }
+if test $ac_cv_func_shl_load = yes; then
+  lt_cv_dlopen="shl_load"
+else
+  { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_F77"
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dld_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_F77
+	ac_cv_lib_dld_shl_load=no
+fi
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_F77
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
+if test $ac_cv_lib_dld_shl_load = yes; then
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  { echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
+if test "${ac_cv_func_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define dlopen innocuous_dlopen
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_F77
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_F77
+#undef dlopen
 
-# ### END LIBTOOL TAG CONFIG: $tagname
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_dlopen || defined __stub___dlopen
+choke me
+#endif
 
-__EOF__
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_cv_func_dlopen=no
+fi
 
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
+if test $ac_cv_func_dlopen = yes; then
+  lt_cv_dlopen="dlopen"
+else
+  { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+	ac_cv_lib_dl_dlopen=no
+fi
 
-CC="$lt_save_CC"
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-	else
-	  tagname=""
-	fi
-	;;
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_svld_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-      GCJ)
-	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+	ac_cv_lib_svld_dlopen=no
+fi
 
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; }
+if test $ac_cv_lib_svld_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dld_dld_link=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Source file extension for Java test sources.
-ac_ext=java
+	ac_cv_lib_dld_dld_link=no
+fi
 
-# Object file extension for compiled Java test sources.
-objext=o
-objext_GCJ=$objext
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
+if test $ac_cv_lib_dld_dld_link = yes; then
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}\n"
 
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+fi
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
+fi
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
+fi
 
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
+fi
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
 
+fi
 
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${GCJ-"gcj"}
-compiler=$CC
-compiler_GCJ=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
+    ;;
   esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-archive_cmds_need_lc_GCJ=no
-
-old_archive_cmds_GCJ=$old_archive_cmds
 
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
 
-lt_prog_compiler_no_builtin_flag_GCJ=
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
 
-echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+    { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_prog_compiler_rtti_exceptions=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:17720: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:17724: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $rm conftest*
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
 else
-    :
-fi
-
-fi
-
-lt_prog_compiler_wl_GCJ=
-lt_prog_compiler_pic_GCJ=
-lt_prog_compiler_static_GCJ=
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 14182 "configure"
+#include "confdefs.h"
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl_GCJ='-Wl,'
-    lt_prog_compiler_static_GCJ='-static'
+#include <stdio.h>
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_GCJ='-Bstatic'
-      fi
-      ;;
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
 
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
-      ;;
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
 
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
-      ;;
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_GCJ='-fno-common'
-      ;;
+  return status;
+}
+_LT_EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
 
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared_GCJ=no
-      enable_shared=no
-      ;;
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6; }
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_GCJ=-Kconform_pic
-      fi
-      ;;
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 14278 "configure"
+#include "confdefs.h"
 
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_GCJ='-fPIC'
-	;;
-      esac
-      ;;
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
 
-    *)
-      lt_prog_compiler_pic_GCJ='-fPIC'
-      ;;
-    esac
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
   else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_GCJ='-Bstatic'
-      else
-	lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         lt_prog_compiler_pic_GCJ='-qnocommon'
-         lt_prog_compiler_wl_GCJ='-Wl,'
-         ;;
-       esac
-       ;;
+    puts (dlerror ());
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
-      ;;
+  return status;
+}
+_LT_EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_GCJ='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static_GCJ='-non_shared'
-      ;;
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; }
+    fi
 
-    newsos6)
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
 
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	lt_prog_compiler_wl_GCJ='-Wl,'
-	lt_prog_compiler_pic_GCJ='-KPIC'
-	lt_prog_compiler_static_GCJ='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl_GCJ='-Wl,'
-	lt_prog_compiler_pic_GCJ='-fpic'
-	lt_prog_compiler_static_GCJ='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl_GCJ='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static_GCJ='-non_shared'
-        ;;
-      esac
-      ;;
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static_GCJ='-non_shared'
-      ;;
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
 
-    solaris*)
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl_GCJ='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl_GCJ='-Wl,';;
-      esac
-      ;;
 
-    sunos4*)
-      lt_prog_compiler_wl_GCJ='-Qoption ld '
-      lt_prog_compiler_pic_GCJ='-PIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
 
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic_GCJ='-Kconform_pic'
-	lt_prog_compiler_static_GCJ='-Bstatic'
-      fi
-      ;;
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
 
-    unicos*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      lt_prog_compiler_can_build_shared_GCJ=no
-      ;;
 
-    uts4*)
-      lt_prog_compiler_pic_GCJ='-pic'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
 
-    *)
-      lt_prog_compiler_can_build_shared_GCJ=no
-      ;;
-    esac
-  fi
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_GCJ"; then
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_pic_works_GCJ=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:17988: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:17992: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works_GCJ=yes
-     fi
-   fi
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
 
-if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
-    case $lt_prog_compiler_pic_GCJ in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
-     esac
-else
-    lt_prog_compiler_pic_GCJ=
-     lt_prog_compiler_can_build_shared_GCJ=no
-fi
 
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_GCJ=
+
+
+
+striplib=
+old_striplib=
+{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+    else
+      { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+    fi
     ;;
   *)
-    lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     ;;
-esac
+  esac
+fi
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works_GCJ=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works_GCJ=yes
-       fi
-     else
-       lt_prog_compiler_static_works_GCJ=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
 
-if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
-    :
-else
-    lt_prog_compiler_static_GCJ=
-fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_c_o_GCJ=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18092: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:18096: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_GCJ=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
 
-  runpath_var=
-  allow_undefined_flag_GCJ=
-  enable_shared_with_static_runtimes_GCJ=no
-  archive_cmds_GCJ=
-  archive_expsym_cmds_GCJ=
-  old_archive_From_new_cmds_GCJ=
-  old_archive_from_expsyms_cmds_GCJ=
-  export_dynamic_flag_spec_GCJ=
-  whole_archive_flag_spec_GCJ=
-  thread_safe_flag_spec_GCJ=
-  hardcode_libdir_flag_spec_GCJ=
-  hardcode_libdir_flag_spec_ld_GCJ=
-  hardcode_libdir_separator_GCJ=
-  hardcode_direct_GCJ=no
-  hardcode_minus_L_GCJ=no
-  hardcode_shlibpath_var_GCJ=unsupported
-  link_all_deplibs_GCJ=unknown
-  hardcode_automatic_GCJ=no
-  module_cmds_GCJ=
-  module_expsym_cmds_GCJ=
-  always_export_symbols_GCJ=no
-  export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms_GCJ=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
+  # Report which library types will actually be built
+  { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6; }
+
+  { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
   case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
     fi
     ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
     ;;
   esac
+  { echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6; }
 
-  ld_shlibs_GCJ=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+  { echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6; }
 
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	whole_archive_flag_spec_GCJ=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
 
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs_GCJ=no
-	cat <<EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
 
-EOF
-      fi
-      ;;
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-    amigaos*)
-      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_minus_L_GCJ=yes
-
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      ld_shlibs_GCJ=no
-      ;;
+CC="$lt_save_CC"
 
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag_GCJ=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      allow_undefined_flag_GCJ=unsupported
-      always_export_symbols_GCJ=no
-      enable_shared_with_static_runtimes_GCJ=yes
-      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-    interix3*)
-      hardcode_direct_GCJ=no
-      hardcode_shlibpath_var_GCJ=no
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec_GCJ='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
 
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+# Source file extension for C++ test sources.
+ac_ext=cpp
 
-	if test $supports_anon_versioning = yes; then
-	  archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
 
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	ld_shlibs_GCJ=no
-	cat <<EOF 1>&2
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs_GCJ=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    ld_shlibs_GCJ=no
-	  fi
-	;;
-      esac
-      ;;
 
-    sunos4*)
-      archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
-    esac
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
 
-    if test "$ld_shlibs_GCJ" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec_GCJ=
-      export_dynamic_flag_spec_GCJ=
-      whole_archive_flag_spec_GCJ=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag_GCJ=unsupported
-      always_export_symbols_GCJ=yes
-      archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L_GCJ=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct_GCJ=unsupported
-      fi
-      ;;
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
+# Allow CC to be a program name with arguments.
+compiler=$CC
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
       fi
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
 
-      archive_cmds_GCJ=''
-      hardcode_direct_GCJ=yes
-      hardcode_libdir_separator_GCJ=':'
-      link_all_deplibs_GCJ=yes
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
 
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
 	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
-  	  # We have reworked collect2
-  	  hardcode_direct_GCJ=yes
+	    # We have reworked collect2
+	    :
 	  else
-  	  # We have old collect2
-  	  hardcode_direct_GCJ=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  hardcode_minus_L_GCJ=yes
-  	  hardcode_libdir_flag_spec_GCJ='-L$libdir'
-  	  hardcode_libdir_separator_GCJ=
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
 	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
+          esac
+          shared_flag='-shared'
 	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag="$shared_flag "'${wl}-G'
 	  fi
-	fi
-      fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
 
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols_GCJ=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag_GCJ='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       cat >conftest.$ac_ext <<_ACEOF
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-int
-main ()
-{
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_CXX='$convenience'
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+        # as there is no search path for DLLs.
+        hardcode_libdir_flag_spec_CXX='-L$libdir'
+        allow_undefined_flag_CXX=unsupported
+        always_export_symbols_CXX=no
+        enable_shared_with_static_runtimes_CXX=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          ld_shlibs_CXX=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  whole_archive_flag_spec_CXX=''
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[12]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5]* | *pgcpp\ [1-5]*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	ld_shlibs_CXX=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='${wl}-E'
+	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='${wl}-z,text'
+	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; }
+
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:16290: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:16294: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
 
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-       hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
-	archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag_GCJ="-z nodefs"
-	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_CXX" >&6; }
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag_GCJ=' ${wl}-bernotok'
-	  allow_undefined_flag_GCJ=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec_GCJ='$convenience'
-	  archive_cmds_need_lc_GCJ=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_minus_L_GCJ=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs_GCJ=no
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec_GCJ=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec_GCJ=' '
-      allow_undefined_flag_GCJ=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_From_new_cmds_GCJ='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes_GCJ=yes
-      ;;
 
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      archive_cmds_need_lc_GCJ=no
-      hardcode_direct_GCJ=no
-      hardcode_automatic_GCJ=yes
-      hardcode_shlibpath_var_GCJ=unsupported
-      whole_archive_flag_spec_GCJ=''
-      link_all_deplibs_GCJ=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs_GCJ=no
-          ;;
-      esac
-    fi
-      ;;
-
-    dgux*)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_shlibpath_var_GCJ=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs_GCJ=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+fi
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_GCJ=yes
-      hardcode_minus_L_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      hardcode_direct_GCJ=yes
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L_GCJ=yes
-      export_dynamic_flag_spec_GCJ='${wl}-E'
-      ;;
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works_CXX" >&6; }
 
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_GCJ=:
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
 
-	hardcode_direct_GCJ=yes
-	export_dynamic_flag_spec_GCJ='${wl}-E'
 
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L_GCJ=yes
-      fi
-      ;;
 
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_GCJ=:
 
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
-	  hardcode_direct_GCJ=no
-	  hardcode_shlibpath_var_GCJ=no
-	  ;;
-	*)
-	  hardcode_direct_GCJ=yes
-	  export_dynamic_flag_spec_GCJ='${wl}-E'
+    { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L_GCJ=yes
-	  ;;
-	esac
-      fi
-      ;;
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:16389: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:16393: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
-      fi
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      link_all_deplibs_GCJ=yes
-      ;;
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; }
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    newsos6)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_GCJ=yes
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    openbsd*)
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_GCJ='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	   archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   hardcode_libdir_flag_spec_GCJ='-R$libdir'
-	   ;;
-	 *)
-	   archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
+    { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-    os2*)
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_minus_L_GCJ=yes
-      allow_undefined_flag_GCJ=unsupported
-      archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:16441: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:16445: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag_GCJ=' -expect_unresolved \*'
-	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      ;;
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; }
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag_GCJ=' -expect_unresolved \*'
-	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
 
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
-      fi
-      hardcode_libdir_separator_GCJ=:
-      ;;
 
-    solaris*)
-      no_undefined_flag_GCJ=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_shlibpath_var_GCJ=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      link_all_deplibs_GCJ=yes
-      ;;
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_minus_L_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
 
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_GCJ=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds_GCJ='$CC -r -o $output$reload_objs'
-	  hardcode_direct_GCJ=no
-        ;;
-	motorola)
-	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    sysv4.3*)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var_GCJ=no
-      export_dynamic_flag_spec_GCJ='-Bexport'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var_GCJ=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs_GCJ=yes
-      fi
-      ;;
+    { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      no_undefined_flag_GCJ='${wl}-z,text'
-      archive_cmds_need_lc_GCJ=no
-      hardcode_shlibpath_var_GCJ=no
-      runpath_var='LD_RUN_PATH'
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
 
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag_GCJ='${wl}-z,text'
-      allow_undefined_flag_GCJ='${wl}-z,nodefs'
-      archive_cmds_need_lc_GCJ=no
-      hardcode_shlibpath_var_GCJ=no
-      hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator_GCJ=':'
-      link_all_deplibs_GCJ=yes
-      export_dynamic_flag_spec_GCJ='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
 
-    uts4*)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    *)
-      ld_shlibs_GCJ=no
-      ;;
-    esac
-  fi
 
-echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
-echo "${ECHO_T}$ld_shlibs_GCJ" >&6
-test "$ld_shlibs_GCJ" = no && can_build_shared=no
 
 #
 # Do we need to explicitly link libc?
 #
-case "x$archive_cmds_need_lc_GCJ" in
+case "x$archive_cmds_need_lc_CXX" in
 x|xyes)
   # Assume -lc should be added
-  archive_cmds_need_lc_GCJ=yes
+  archive_cmds_need_lc_CXX=yes
 
   if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_GCJ in
+    case $archive_cmds_CXX in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
       ;;
@@ -19120,10 +16548,10 @@ x|xyes)
       # Test whether the compiler implicitly links with -lc since on some
       # systems, -lgcc has to come before -lc. If gcc already passes -lc
       # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
       if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
@@ -19134,40 +16562,104 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&
         lib=conftest
         libobjs=conftest.$ac_objext
         deplibs=
-        wl=$lt_prog_compiler_wl_GCJ
-	pic_flag=$lt_prog_compiler_pic_GCJ
+        wl=$lt_prog_compiler_wl_CXX
+	pic_flag=$lt_prog_compiler_pic_CXX
         compiler_flags=-v
         linker_flags=-v
         verstring=
         output_objdir=.
         libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
-        allow_undefined_flag_GCJ=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+        allow_undefined_flag_CXX=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
         then
-	  archive_cmds_need_lc_GCJ=no
+	  archive_cmds_need_lc_CXX=no
         else
-	  archive_cmds_need_lc_GCJ=yes
+	  archive_cmds_need_lc_CXX=yes
         fi
-        allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
       else
         cat conftest.err 1>&5
       fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
-echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+      $RM conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; }
       ;;
     esac
   fi
   ;;
 esac
 
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
@@ -19181,20 +16673,6 @@ shlibpath_overrides_runpath=unknown
 version_type=none
 dynamic_linker="$host_os ld.so"
 sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
 need_lib_prefix=unknown
 hardcode_into_libs=no
 
@@ -19212,7 +16690,7 @@ aix3*)
   soname_spec='${libname}${release}${shared_ext}$major'
   ;;
 
-aix4* | aix5*)
+aix[4-9]*)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -19231,7 +16709,7 @@ aix4* | aix5*)
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
@@ -19257,9 +16735,18 @@ aix4* | aix5*)
   ;;
 
 amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
   ;;
 
 beos*)
@@ -19282,25 +16769,28 @@ bsdi[45]*)
   # libtool to hard-code these into programs
   ;;
 
-cygwin* | mingw* | pw32*)
+cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
   shrext_cmds=".dll"
   need_version=no
   need_lib_prefix=no
 
   case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
     postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
       dlpath=$dir/\$dldll~
-       $rm \$dlpath'
+       $RM \$dlpath'
     shlibpath_overrides_runpath=yes
 
     case $host_os in
@@ -19309,20 +16799,20 @@ cygwin* | mingw* | pw32*)
       soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
       sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
       ;;
-    mingw*)
+    mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
       soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH printed by
         # mingw gcc, but we are running on Cygwin. Gcc prints its search
         # path with ; separators, and with drive letters. We can handle the
         # drive letters (cygwin fileutils understands them), so leave them,
         # especially as we might pass files found there to a mingw objdump,
         # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       fi
       ;;
     pw32*)
@@ -19346,17 +16836,12 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
   soname_spec='${libname}${release}${major}$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
+
   sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
   ;;
 
@@ -19373,18 +16858,6 @@ freebsd1*)
   dynamic_linker=no
   ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -19422,7 +16895,7 @@ freebsd* | dragonfly*)
     shlibpath_overrides_runpath=no
     hardcode_into_libs=yes
     ;;
-  freebsd*) # from 4.6 on
+  *) # from 4.6 on, and DragonFly
     shlibpath_overrides_runpath=yes
     hardcode_into_libs=yes
     ;;
@@ -19461,18 +16934,18 @@ hpux9* | hpux10* | hpux11*)
     fi
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
     shrext_cmds='.sl'
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
@@ -19485,7 +16958,7 @@ hpux9* | hpux10* | hpux11*)
   postinstall_cmds='chmod 555 $lib'
   ;;
 
-interix3*)
+interix[3-9]*)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -19540,7 +17013,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux*)
+linux* | k*bsd*-gnu)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -19549,6 +17022,60 @@ linux*)
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then
+  shlibpath_overrides_runpath=yes
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
   # This implies no fast_install, which is unacceptable.
   # Some rework will be needed to allow for fast_install
   # before this can be enabled.
@@ -19556,7 +17083,7 @@ linux*)
 
   # Append ld.so.conf contents to the search path
   if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
@@ -19569,23 +17096,11 @@ linux*)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
   need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
@@ -19606,14 +17121,16 @@ newsos6)
   shlibpath_overrides_runpath=yes
   ;;
 
-nto-qnx*)
-  version_type=linux
+*nto* | *qnx*)
+  version_type=qnx
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
   ;;
 
 openbsd*)
@@ -19622,13 +17139,13 @@ openbsd*)
   need_lib_prefix=no
   # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
   case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
   esac
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
   shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
     case $host_os in
       openbsd2.[89] | openbsd2.[89].*)
 	shlibpath_overrides_runpath=no
@@ -19662,6 +17179,10 @@ osf3* | osf4* | osf5*)
   sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
   ;;
 
+rdos*)
+  dynamic_linker=no
+  ;;
+
 solaris*)
   version_type=linux
   need_lib_prefix=no
@@ -19696,7 +17217,6 @@ sysv4 | sysv4.3*)
     sni)
       shlibpath_overrides_runpath=no
       need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
       runpath_var=LD_RUN_PATH
       ;;
     siemens)
@@ -19727,13 +17247,12 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   if test "$with_gnu_ld" = yes; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
     case $host_os in
       sco3.2v5*)
         sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
@@ -19743,6 +17262,17 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
   sys_lib_dlsearch_path_spec='/usr/lib'
   ;;
 
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
 uts4*)
   version_type=linux
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -19754,8 +17284,8 @@ uts4*)
   dynamic_linker=no
   ;;
 esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
 test "$dynamic_linker" = no && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -19763,35 +17293,78 @@ if test "$GCC" = yes; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action_GCJ=
-if test -n "$hardcode_libdir_flag_spec_GCJ" || \
-   test -n "$runpath_var_GCJ" || \
-   test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
 
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct_GCJ" != no &&
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
-     test "$hardcode_minus_L_GCJ" != no; then
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
     # Linking always hardcodes the temporary library directory.
-    hardcode_action_GCJ=relink
+    hardcode_action_CXX=relink
   else
     # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_GCJ=immediate
+    hardcode_action_CXX=immediate
   fi
 else
   # We cannot hardcode anything, or else we can only hardcode existing
   # directories.
-  hardcode_action_GCJ=unsupported
+  hardcode_action_CXX=unsupported
 fi
-echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
-echo "${ECHO_T}$hardcode_action_GCJ" >&6
+{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6; }
 
-if test "$hardcode_action_GCJ" = relink; then
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
   # Fast installation is not supported
   enable_fast_install=no
 elif test "$shlibpath_overrides_runpath" = yes ||
@@ -19801,2439 +17374,2807 @@ elif test "$shlibpath_overrides_runpath" = yes ||
 fi
 
 
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_GCJ \
-    CC_GCJ \
-    LD_GCJ \
-    lt_prog_compiler_wl_GCJ \
-    lt_prog_compiler_pic_GCJ \
-    lt_prog_compiler_static_GCJ \
-    lt_prog_compiler_no_builtin_flag_GCJ \
-    export_dynamic_flag_spec_GCJ \
-    thread_safe_flag_spec_GCJ \
-    whole_archive_flag_spec_GCJ \
-    enable_shared_with_static_runtimes_GCJ \
-    old_archive_cmds_GCJ \
-    old_archive_from_new_cmds_GCJ \
-    predep_objects_GCJ \
-    postdep_objects_GCJ \
-    predeps_GCJ \
-    postdeps_GCJ \
-    compiler_lib_search_path_GCJ \
-    archive_cmds_GCJ \
-    archive_expsym_cmds_GCJ \
-    postinstall_cmds_GCJ \
-    postuninstall_cmds_GCJ \
-    old_archive_from_expsyms_cmds_GCJ \
-    allow_undefined_flag_GCJ \
-    no_undefined_flag_GCJ \
-    export_symbols_cmds_GCJ \
-    hardcode_libdir_flag_spec_GCJ \
-    hardcode_libdir_flag_spec_ld_GCJ \
-    hardcode_libdir_separator_GCJ \
-    hardcode_automatic_GCJ \
-    module_cmds_GCJ \
-    module_expsym_cmds_GCJ \
-    lt_cv_prog_compiler_c_o_GCJ \
-    exclude_expsyms_GCJ \
-    include_expsyms_GCJ; do
-
-    case $var in
-    old_archive_cmds_GCJ | \
-    old_archive_from_new_cmds_GCJ | \
-    archive_cmds_GCJ | \
-    archive_expsym_cmds_GCJ | \
-    module_cmds_GCJ | \
-    module_expsym_cmds_GCJ | \
-    old_archive_from_expsyms_cmds_GCJ | \
-    export_symbols_cmds_GCJ | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
 
-cfgfile="$ofile"
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+  fi # test -n "$compiler"
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_GCJ
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
 
-# A C compiler.
-LTCC=$lt_LTCC
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
 
-# A language-specific compiler.
-CC=$lt_compiler_GCJ
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_GCJ
 
-# An ERE matcher.
-EGREP=$lt_EGREP
 
-# The linker used to build libraries.
-LD=$lt_LD_GCJ
+        ac_config_commands="$ac_config_commands libtool"
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
+# Only expand once:
+
+
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+  CFLAGS="$CFLAGS -W -Wall"
+fi
+if test x"$GXX" = xyes
+then
+  CXXFLAGS="$CXXFLAGS -W -Wall"
+fi
+
+# System-dependent adjustments.
+no_undefined=no
+
+case "${host_os}" in
+cygwin)
+  no_undefined=yes
+  ;;
+*)
+  ;;
+esac
+ if test x$no_undefined = xyes; then
+  NO_UNDEFINED_TRUE=
+  NO_UNDEFINED_FALSE='#'
+else
+  NO_UNDEFINED_TRUE='#'
+  NO_UNDEFINED_FALSE=
+fi
+
+
+
+
+ac_config_files="$ac_config_files Makefile src/Makefile m4/Makefile doc/Makefile doc/user.doxyconf-latex doc/devref.doxyconf-latex doc/user.doxyconf-html doc/devref.doxyconf-html utils/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
+LTLIBOBJS=$ac_ltlibobjs
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_GCJ
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
 
-# Old archive suffix (normally "a").
-libext="$libext"
+fi
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_GCJ
-pic_mode=$pic_mode
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_GCJ
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
 
-# Library versioning type.
-version_type=$version_type
+# CDPATH.
+$as_unset CDPATH
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_GCJ
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_GCJ
-archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_GCJ
-module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_GCJ
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_GCJ
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_GCJ
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_GCJ
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
+exec 6>&1
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by the Parma Watchdog Library $as_me 0.6, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_GCJ
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
+_ACEOF
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+_ACEOF
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
+Usage: $0 [OPTIONS] [FILE]...
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+Configuration files:
+$config_files
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_GCJ
+Configuration headers:
+$config_headers
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
+Configuration commands:
+$config_commands
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+Report bugs to <bug-autoconf at gnu.org>."
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+the Parma Watchdog Library config.status 0.6
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_GCJ
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+_ACEOF
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_GCJ
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_GCJ
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_GCJ
+  esac
+  shift
+done
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+ac_configure_extra_args=
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_GCJ"
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_GCJ
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+PACKAGE="$PACKAGE"
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_GCJ
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_GCJ
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
+enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
+host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
+host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
+host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
+build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
+build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
+build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
+SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
+Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
+GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
+EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
+FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
+LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
+NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
+LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
+exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
+AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
+GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
+SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
+ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
+need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
+LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
+libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
+version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
+striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`'
+predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`'
+postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+SHELL \
+ECHO \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_flag_spec_ld_CXX \
+hardcode_libdir_separator_CXX \
+fix_srcfile_path_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
 
-# ### END LIBTOOL TAG CONFIG: $tagname
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
 
-__EOF__
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
+  ;;
+esac
 
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
 
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
 fi
 
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
-	else
-	  tagname=""
-	fi
-	;;
-
-      RC)
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
 
 
 
-# Source file extension for RC test sources.
-ac_ext=rc
 
-# Object file extension for compiled RC test sources.
-objext=o
-objext_RC=$objext
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
 
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+_ACEOF
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+cat >>$CONFIG_STATUS <<\_ACEOF
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "$PACKAGE-config.h") CONFIG_COMMANDS="$CONFIG_COMMANDS $PACKAGE-config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "doc/user.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;;
+    "doc/devref.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;;
+    "doc/user.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;;
+    "doc/devref.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;;
+    "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
 
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
 
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
 
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${RC-"windres"}
-compiler=$CC
-compiler_RC=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-lt_cv_prog_compiler_c_o_RC=yes
-
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_RC \
-    CC_RC \
-    LD_RC \
-    lt_prog_compiler_wl_RC \
-    lt_prog_compiler_pic_RC \
-    lt_prog_compiler_static_RC \
-    lt_prog_compiler_no_builtin_flag_RC \
-    export_dynamic_flag_spec_RC \
-    thread_safe_flag_spec_RC \
-    whole_archive_flag_spec_RC \
-    enable_shared_with_static_runtimes_RC \
-    old_archive_cmds_RC \
-    old_archive_from_new_cmds_RC \
-    predep_objects_RC \
-    postdep_objects_RC \
-    predeps_RC \
-    postdeps_RC \
-    compiler_lib_search_path_RC \
-    archive_cmds_RC \
-    archive_expsym_cmds_RC \
-    postinstall_cmds_RC \
-    postuninstall_cmds_RC \
-    old_archive_from_expsyms_cmds_RC \
-    allow_undefined_flag_RC \
-    no_undefined_flag_RC \
-    export_symbols_cmds_RC \
-    hardcode_libdir_flag_spec_RC \
-    hardcode_libdir_flag_spec_ld_RC \
-    hardcode_libdir_separator_RC \
-    hardcode_automatic_RC \
-    module_cmds_RC \
-    module_expsym_cmds_RC \
-    lt_cv_prog_compiler_c_o_RC \
-    exclude_expsyms_RC \
-    include_expsyms_RC; do
-
-    case $var in
-    old_archive_cmds_RC | \
-    old_archive_from_new_cmds_RC | \
-    archive_cmds_RC | \
-    archive_expsym_cmds_RC | \
-    module_cmds_RC | \
-    module_expsym_cmds_RC | \
-    old_archive_from_expsyms_cmds_RC | \
-    export_symbols_cmds_RC | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
+_ACEOF
 
-cfgfile="$ofile"
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+ISODATE!$ISODATE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+PERL!$PERL$ac_delim
+HAVE_PERL_TRUE!$HAVE_PERL_TRUE$ac_delim
+HAVE_PERL_FALSE!$HAVE_PERL_FALSE$ac_delim
+BUILD_WATCHDOG_LIBRARY_TRUE!$BUILD_WATCHDOG_LIBRARY_TRUE$ac_delim
+BUILD_WATCHDOG_LIBRARY_FALSE!$BUILD_WATCHDOG_LIBRARY_FALSE$ac_delim
+CXX!$CXX$ac_delim
+CXXFLAGS!$CXXFLAGS$ac_delim
+ac_ct_CXX!$ac_ct_CXX$ac_delim
+CXXDEPMODE!$CXXDEPMODE$ac_delim
+am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim
+am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim
+CXXCPP!$CXXCPP$ac_delim
+GREP!$GREP$ac_delim
+_ACEOF
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_RC
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+EGREP!$EGREP$ac_delim
+LIBTOOL!$LIBTOOL$ac_delim
+SED!$SED$ac_delim
+FGREP!$FGREP$ac_delim
+LD!$LD$ac_delim
+DUMPBIN!$DUMPBIN$ac_delim
+ac_ct_DUMPBIN!$ac_ct_DUMPBIN$ac_delim
+NM!$NM$ac_delim
+LN_S!$LN_S$ac_delim
+OBJDUMP!$OBJDUMP$ac_delim
+AR!$AR$ac_delim
+RANLIB!$RANLIB$ac_delim
+lt_ECHO!$lt_ECHO$ac_delim
+DSYMUTIL!$DSYMUTIL$ac_delim
+NMEDIT!$NMEDIT$ac_delim
+LIPO!$LIPO$ac_delim
+OTOOL!$OTOOL$ac_delim
+OTOOL64!$OTOOL64$ac_delim
+NO_UNDEFINED_TRUE!$NO_UNDEFINED_TRUE$ac_delim
+NO_UNDEFINED_FALSE!$NO_UNDEFINED_FALSE$ac_delim
+debug_flag!$debug_flag$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 23; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
 
-# A C compiler.
-LTCC=$lt_LTCC
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
 
-# A language-specific compiler.
-CC=$lt_compiler_RC
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_RC
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
 
-# An ERE matcher.
-EGREP=$lt_EGREP
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
 
-# The linker used to build libraries.
-LD=$lt_LD_RC
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
 
-# A BSD-compatible nm program.
-NM=$lt_NM
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
-# A symbol stripping program
-STRIP=$lt_STRIP
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
 
-# Used on cygwin: assembler.
-AS="$AS"
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+_ACEOF
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_RC
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_arg=$ac_file
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
 
-# Old archive suffix (normally "a").
-libext="$libext"
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
+  case $ac_file$ac_mode in
+    "$PACKAGE-config.h":C) ac_prefix_conf_OUT=`echo $PACKAGE-config.h`
+ac_prefix_conf_DEF=`echo _$ac_prefix_conf_OUT | sed -e "y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:" -e "s/[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g"`
+ac_prefix_conf_PKG=`echo $PACKAGE`
+ac_prefix_conf_LOW=`echo _$ac_prefix_conf_PKG | sed -e "y:ABCDEFGHIJKLMNOPQRSTUVWXYZ-:abcdefghijklmnopqrstuvwxyz_:"`
+ac_prefix_conf_UPP=`echo $ac_prefix_conf_PKG | sed -e "y:abcdefghijklmnopqrstuvwxyz-:ABCDEFGHIJKLMNOPQRSTUVWXYZ_:"  -e "/^[0123456789]/s/^/_/"`
+ac_prefix_conf_INP=`echo "" | sed -e 's/ *//'`
+if test ".$ac_prefix_conf_INP" = "."; then
+   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
+     case "$ac_file" in
+        *.h) ac_prefix_conf_INP=$ac_file ;;
+        *)
+     esac
+     test ".$ac_prefix_conf_INP" != "." && break
+   done
+fi
+if test ".$ac_prefix_conf_INP" = "."; then
+   case "$ac_prefix_conf_OUT" in
+      */*) ac_prefix_conf_INP=`basename "$ac_prefix_conf_OUT"`
+      ;;
+      *-*) ac_prefix_conf_INP=`echo "$ac_prefix_conf_OUT" | sed -e "s/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*-//"`
+      ;;
+      *) ac_prefix_conf_INP=config.h
+      ;;
+   esac
+fi
+if test -z "$ac_prefix_conf_PKG" ; then
+   { { echo "$as_me:$LINENO: error: no prefix for _PREFIX_PKG_CONFIG_H" >&5
+echo "$as_me: error: no prefix for _PREFIX_PKG_CONFIG_H" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  if test ! -f "$ac_prefix_conf_INP" ; then if test -f "$srcdir/$ac_prefix_conf_INP" ; then
+     ac_prefix_conf_INP="$srcdir/$ac_prefix_conf_INP"
+  fi fi
+  { echo "$as_me:$LINENO: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&5
+echo "$as_me: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&6;}
+  if test -f $ac_prefix_conf_INP ; then
+    echo "s/^#undef  *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_]\\)/#undef $ac_prefix_conf_UPP""_\\1/" > conftest.prefix
+    echo "s/^#undef  *\\([abcdefghijklmnopqrstuvwxyz]\\)/#undef $ac_prefix_conf_LOW""_\\1/" >> conftest.prefix
+    echo "s/^#define  *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_UPP""_\\1 \\" >> conftest.prefix
+    echo "#define $ac_prefix_conf_UPP""_\\1 \\2 \\" >> conftest.prefix
+    echo "#endif/" >>conftest.prefix
+    echo "s/^#define  *\\([abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_LOW""_\\1 \\" >> conftest.prefix
+    echo "#define $ac_prefix_conf_LOW""_\\1 \\2 \\" >> conftest.prefix
+    echo "#endif/" >> conftest.prefix
+    # now executing _script on _DEF input to create _OUT output file
+    echo "#ifndef $ac_prefix_conf_DEF"      >$tmp/pconfig.h
+    echo "#define $ac_prefix_conf_DEF 1" >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo /'*' $ac_prefix_conf_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
+
+    sed -f conftest.prefix $ac_prefix_conf_INP >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo '/* once:' $ac_prefix_conf_DEF '*/' >>$tmp/pconfig.h
+    echo "#endif" >>$tmp/pconfig.h
+    if cmp -s $ac_prefix_conf_OUT $tmp/pconfig.h 2>/dev/null; then
+      { echo "$as_me:$LINENO: $ac_prefix_conf_OUT is unchanged" >&5
+echo "$as_me: $ac_prefix_conf_OUT is unchanged" >&6;}
+    else
+      ac_dir=`$as_dirname -- "$ac_prefix_conf_OUT" ||
+$as_expr X"$ac_prefix_conf_OUT" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_prefix_conf_OUT" : 'X\(//\)[^/]' \| \
+	 X"$ac_prefix_conf_OUT" : 'X\(//\)$' \| \
+	 X"$ac_prefix_conf_OUT" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_prefix_conf_OUT" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+      rm -f "$ac_prefix_conf_OUT"
+      mv $tmp/pconfig.h "$ac_prefix_conf_OUT"
+    fi
+    cp conftest.prefix _configs.sed
+  else
+    { { echo "$as_me:$LINENO: error: input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" >&5
+echo "$as_me: error: input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  rm -f conftest.*
+fi
+ ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+    "libtool":C)
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_RC
-pic_mode=$pic_mode
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
+# ### BEGIN LIBTOOL CONFIG
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_RC
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+# What type of objects to build.
+pic_mode=$pic_mode
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
 
-# Library versioning type.
-version_type=$version_type
+# A sed program that does not truncate output.
+SED=$lt_SED
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
+# A grep program that handles long lines.
+GREP=$lt_GREP
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
+# An ERE matcher.
+EGREP=$lt_EGREP
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_RC
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
+# A literal string matcher.
+FGREP=$lt_FGREP
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_RC
-archive_expsym_cmds=$lt_archive_expsym_cmds_RC
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_RC
-module_expsym_cmds=$lt_module_expsym_cmds_RC
+# Object file suffix (normally "o").
+objext=$ac_objext
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
+# Executable file suffix (normally "").
+exeext=$exeext
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_RC
+# whether the shell understands "unset".
+lt_unset=$lt_unset
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_RC
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_RC
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_RC
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
+# Command to use when deplibs_check_method == "file_magic".
 file_magic_cmd=$lt_file_magic_cmd
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_RC
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_RC
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
+# A C compiler.
+LTCC=$lt_CC
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
 
 # Take the output of nm and produce a listing of raw symbols and C names.
 global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
+# Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
+# Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_RC
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
-
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_RC
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_RC
+# An echo program that does not interpret backslashes.
+ECHO=$lt_ECHO
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_RC
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_RC
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_RC"
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_RC
+# Old archive suffix (normally "a").
+libext=$libext
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_RC
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
 
 # The commands to extract the exported symbol list from a shared archive.
 extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_RC
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_RC
-
-# ### END LIBTOOL TAG CONFIG: $tagname
-
-__EOF__
-
-
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
-
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
-	;;
-
-      *)
-	{ { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
-echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
-   { (exit 1); exit 1; }; }
-	;;
-      esac
-
-      # Append the new tag name to the list of available tags.
-      if test -n "$tagname" ; then
-      available_tags="$available_tags $tagname"
-    fi
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  # Now substitute the updated list of available tags.
-  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
-    mv "${ofile}T" "$ofile"
-    chmod +x "$ofile"
-  else
-    rm -f "${ofile}T"
-    { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
-echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-fi
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-# Prevent multiple expansion
-
-
-
-
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
 
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
 
+# Do we need a version for libraries?
+need_version=$need_version
 
+# Library versioning type.
+version_type=$version_type
 
+# Shared library runtime path variable.
+runpath_var=$runpath_var
 
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
 
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
 
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
 
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
 
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
 
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
 
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
 
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
 
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
 
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
 
-# If we are using GCC we want to compile with warnings enabled.
-if test x"$GCC" = xyes
-then
-  CFLAGS="$CFLAGS -W -Wall"
-fi
-if test x"$GXX" = xyes
-then
-  CXXFLAGS="$CXXFLAGS -W -Wall"
-fi
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
 
-# System-dependent adjustments.
-no_undefined=no
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
 
-case "${host_os}" in
-cygwin)
-  no_undefined=yes
-  ;;
-*)
-  ;;
-esac
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
 
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
 
-if test x$no_undefined = xyes; then
-  NO_UNDEFINED_TRUE=
-  NO_UNDEFINED_FALSE='#'
-else
-  NO_UNDEFINED_TRUE='#'
-  NO_UNDEFINED_FALSE=
-fi
 
+# The linker used to build libraries.
+LD=$lt_LD
 
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
 
+# A language specific compiler.
+CC=$lt_compiler
 
-                              ac_config_files="$ac_config_files Makefile src/Makefile utils/Makefile"
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
 
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
 
-_ACEOF
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
 
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
-  (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-} |
-  sed '
-     t clear
-     : clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
-    cat confcache >$cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
 
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
 
-DEFS=-DHAVE_CONFIG_H
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
 
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
 
-LTLIBOBJS=$ac_ltlibobjs
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
 
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
 
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
 
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
 
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
 
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
 
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
 
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
 
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
 
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
 
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
 
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
 
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
 
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
 
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
 
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
 fi
+_LT_EOF
+    ;;
+  esac
 
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
 
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
+ltmain="$ac_aux_dir/ltmain.sh"
 
-as_executable_p="test -f"
 
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
 
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+  case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
 
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
 
-# CDPATH.
-$as_unset CDPATH
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
 
-exec 6>&1
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
 
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
+# func_opt_split
+func_opt_split ()
 {
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
 
-This file was extended by the Parma Watchdog Library $as_me 0.4, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
 
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
 
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
 
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
 
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
 
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
 
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
 
-cat >>$CONFIG_STATUS <<\_ACEOF
 
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
 
-Usage: $0 [OPTIONS] [FILE]...
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
 
-  -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
 
-Configuration files:
-$config_files
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
 
-Configuration headers:
-$config_headers
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
+}
 
-Configuration commands:
-$config_commands
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$@"`
+}
 
-Report bugs to <bug-autoconf at gnu.org>."
-_ACEOF
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
 
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-the Parma Watchdog Library config.status 0.4
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+_LT_EOF
+esac
 
-Copyright (C) 2003 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
-_ACEOF
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    ac_shift=:
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+_LT_EOF
     ;;
-  -*)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1=\$$1\$2"
+}
+
+_LT_EOF
     ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
   esac
 
-  case $ac_option in
-  # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; } ;;
 
-  *) ac_config_targets="$ac_config_targets $1" ;;
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
 
-  esac
-  shift
-done
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
 
-ac_configure_extra_args=
 
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
+    cat <<_LT_EOF >> "$ofile"
 
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
 
-_ACEOF
+# The linker used to build libraries.
+LD=$lt_LD_CXX
 
-cat >>$CONFIG_STATUS <<_ACEOF
-#
-# INIT-COMMANDS section.
-#
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
 
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+# A language specific compiler.
+CC=$lt_compiler_CXX
 
-_ACEOF
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
 
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
 
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
-  "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
-  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
 
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
 
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
 
-# Create a (secure) tmp directory for tmp files.
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
 
-{
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
 
-_ACEOF
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
 
-cat >>$CONFIG_STATUS <<_ACEOF
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
 
-#
-# CONFIG_FILES section.
-#
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
 
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s, at SHELL@,$SHELL,;t t
-s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s, at exec_prefix@,$exec_prefix,;t t
-s, at prefix@,$prefix,;t t
-s, at program_transform_name@,$program_transform_name,;t t
-s, at bindir@,$bindir,;t t
-s, at sbindir@,$sbindir,;t t
-s, at libexecdir@,$libexecdir,;t t
-s, at datadir@,$datadir,;t t
-s, at sysconfdir@,$sysconfdir,;t t
-s, at sharedstatedir@,$sharedstatedir,;t t
-s, at localstatedir@,$localstatedir,;t t
-s, at libdir@,$libdir,;t t
-s, at includedir@,$includedir,;t t
-s, at oldincludedir@,$oldincludedir,;t t
-s, at infodir@,$infodir,;t t
-s, at mandir@,$mandir,;t t
-s, at build_alias@,$build_alias,;t t
-s, at host_alias@,$host_alias,;t t
-s, at target_alias@,$target_alias,;t t
-s, at DEFS@,$DEFS,;t t
-s, at ECHO_C@,$ECHO_C,;t t
-s, at ECHO_N@,$ECHO_N,;t t
-s, at ECHO_T@,$ECHO_T,;t t
-s, at LIBS@,$LIBS,;t t
-s, at INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s, at INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s, at INSTALL_DATA@,$INSTALL_DATA,;t t
-s, at CYGPATH_W@,$CYGPATH_W,;t t
-s, at PACKAGE@,$PACKAGE,;t t
-s, at VERSION@,$VERSION,;t t
-s, at ACLOCAL@,$ACLOCAL,;t t
-s, at AUTOCONF@,$AUTOCONF,;t t
-s, at AUTOMAKE@,$AUTOMAKE,;t t
-s, at AUTOHEADER@,$AUTOHEADER,;t t
-s, at MAKEINFO@,$MAKEINFO,;t t
-s, at install_sh@,$install_sh,;t t
-s, at STRIP@,$STRIP,;t t
-s, at ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s, at INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
-s, at mkdir_p@,$mkdir_p,;t t
-s, at AWK@,$AWK,;t t
-s, at SET_MAKE@,$SET_MAKE,;t t
-s, at am__leading_dot@,$am__leading_dot,;t t
-s, at AMTAR@,$AMTAR,;t t
-s, at am__tar@,$am__tar,;t t
-s, at am__untar@,$am__untar,;t t
-s, at CC@,$CC,;t t
-s, at CFLAGS@,$CFLAGS,;t t
-s, at LDFLAGS@,$LDFLAGS,;t t
-s, at CPPFLAGS@,$CPPFLAGS,;t t
-s, at ac_ct_CC@,$ac_ct_CC,;t t
-s, at EXEEXT@,$EXEEXT,;t t
-s, at OBJEXT@,$OBJEXT,;t t
-s, at DEPDIR@,$DEPDIR,;t t
-s, at am__include@,$am__include,;t t
-s, at am__quote@,$am__quote,;t t
-s, at AMDEP_TRUE@,$AMDEP_TRUE,;t t
-s, at AMDEP_FALSE@,$AMDEP_FALSE,;t t
-s, at AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
-s, at CCDEPMODE@,$CCDEPMODE,;t t
-s, at am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
-s, at am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
-s, at CXX@,$CXX,;t t
-s, at CXXFLAGS@,$CXXFLAGS,;t t
-s, at ac_ct_CXX@,$ac_ct_CXX,;t t
-s, at CXXDEPMODE@,$CXXDEPMODE,;t t
-s, at am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
-s, at am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
-s, at CXXCPP@,$CXXCPP,;t t
-s, at PERL@,$PERL,;t t
-s, at HAVE_PERL_TRUE@,$HAVE_PERL_TRUE,;t t
-s, at HAVE_PERL_FALSE@,$HAVE_PERL_FALSE,;t t
-s, at BUILD_WATCHDOG_LIBRARY_TRUE@,$BUILD_WATCHDOG_LIBRARY_TRUE,;t t
-s, at BUILD_WATCHDOG_LIBRARY_FALSE@,$BUILD_WATCHDOG_LIBRARY_FALSE,;t t
-s, at EGREP@,$EGREP,;t t
-s, at build@,$build,;t t
-s, at build_cpu@,$build_cpu,;t t
-s, at build_vendor@,$build_vendor,;t t
-s, at build_os@,$build_os,;t t
-s, at host@,$host,;t t
-s, at host_cpu@,$host_cpu,;t t
-s, at host_vendor@,$host_vendor,;t t
-s, at host_os@,$host_os,;t t
-s, at LN_S@,$LN_S,;t t
-s, at ECHO@,$ECHO,;t t
-s, at AR@,$AR,;t t
-s, at ac_ct_AR@,$ac_ct_AR,;t t
-s, at RANLIB@,$RANLIB,;t t
-s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s, at DLLTOOL@,$DLLTOOL,;t t
-s, at ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t
-s, at AS@,$AS,;t t
-s, at ac_ct_AS@,$ac_ct_AS,;t t
-s, at OBJDUMP@,$OBJDUMP,;t t
-s, at ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t
-s, at CPP@,$CPP,;t t
-s, at F77@,$F77,;t t
-s, at FFLAGS@,$FFLAGS,;t t
-s, at ac_ct_F77@,$ac_ct_F77,;t t
-s, at LIBTOOL@,$LIBTOOL,;t t
-s, at NO_UNDEFINED_TRUE@,$NO_UNDEFINED_TRUE,;t t
-s, at NO_UNDEFINED_FALSE@,$NO_UNDEFINED_FALSE,;t t
-s, at debug_flag@,$debug_flag,;t t
-s, at LIBOBJS@,$LIBOBJS,;t t
-s, at LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
 
-_ACEOF
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
 
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
-  fi
-fi # test -n "$CONFIG_FILES"
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
 
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
 
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
 
-  ac_builddir=.
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
 
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
 
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
 
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
-  esac
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
 
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s, at configure_input@,$configure_input,;t t
-s, at srcdir@,$ac_srcdir,;t t
-s, at abs_srcdir@,$ac_abs_srcdir,;t t
-s, at top_srcdir@,$ac_top_srcdir,;t t
-s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s, at builddir@,$ac_builddir,;t t
-s, at abs_builddir@,$ac_abs_builddir,;t t
-s, at top_builddir@,$ac_top_builddir,;t t
-s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
-s, at INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
 
-#
-# CONFIG_HEADER section.
-#
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
 
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
 
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
 
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
 
-_ACEOF
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path_CXX
 
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
 
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
-  if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
 
-      rm -f $ac_file
-      mv $tmp/config.h $ac_file
-    fi
-  else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
-  fi
-# Compute $ac_file's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $ac_file | $ac_file:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
-$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X$ac_file : 'X\(//\)[^/]' \| \
-	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`/stamp-h$_am_stamp_count
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
 
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
 
-  ac_builddir=.
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
 
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
 
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
 
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
 
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`(dirname "$mf") 2>/dev/null ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`(dirname "$file") 2>/dev/null ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    { if $as_mkdir_p; then
-    mkdir -p $dirpart/$fdir
-  else
-    as_dir=$dirpart/$fdir
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
-   { (exit 1); exit 1; }; }; }
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
 
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
  ;;
+
   esac
-done
-_ACEOF
+done # for ac_tag
 
-cat >>$CONFIG_STATUS <<\_ACEOF
 
 { (exit 0); exit 0; }
 _ACEOF
diff --git a/Watchdog/configure.ac b/Watchdog/configure.ac
index 12ff75a..9378565 100644
--- a/Watchdog/configure.ac
+++ b/Watchdog/configure.ac
@@ -1,11 +1,11 @@
 # Autoconf source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,7 +23,7 @@
 # Process this file with autoconf to produce a configure script.
 
 # Every other copy of the package version number gets its value from here.
-AC_INIT([the Parma Watchdog Library],[0.4],[bagnara at cs.unipr.it],[watchdog])
+AC_INIT([the Parma Watchdog Library],[0.6],[bagnara at cs.unipr.it],[pwl])
 
 # Minimum autoconf version required.
 AC_PREREQ(2.59)
@@ -31,13 +31,32 @@ AC_PREREQ(2.59)
 # Make sure the sources are there.
 AC_CONFIG_SRCDIR(src/Watchdog.cc)
 
+# Specify the location of additional local Autoconf macros.
+AC_CONFIG_MACRO_DIR([m4])
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
+AC_CANONICAL_HOST
+
 # Use Automake.
-AM_INIT_AUTOMAKE([foreign dist-bzip2 dist-zip 1.7.3])
+AM_INIT_AUTOMAKE([foreign no-define dist-bzip2 dist-zip 1.7.3])
 AC_SUBST(VERSION)
 
 # Generate a configuration header file.
 AC_CONFIG_HEADER([config.h])
 
+# Generate prefixed defines.
+AX_PREFIX_CONFIG_H
+
+ISODATE=`date +%Y-%m-%d`
+AC_SUBST(ISODATE)
+
+AH_BOTTOM([
+#ifdef PWL_NDEBUG
+# define NDEBUG PWL_NDEBUG
+#endif
+])
+
 # C compiler
 
 AC_ARG_WITH(cc,
@@ -57,13 +76,6 @@ CXX=$with_cxx)
 
 AC_LANG(C++)
 
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_CXX
-AC_PROG_CXXCPP
-AC_PROG_MAKE_SET
-AC_PROG_INSTALL
-
 # Check for Perl.
 AC_PATH_PROG([PERL], perl, no)
 AC_SUBST([PERL])
@@ -99,7 +111,7 @@ case "${enableval}" in
 yes)
   AC_MSG_RESULT(yes)
   OPT_FLAGS="-g"
-  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPWL_PROFILING=1"
   ;;
 no)
   AC_MSG_RESULT(no)
@@ -212,8 +224,8 @@ no)
   ;;
 esac
 
-CFLAGS="$COMP_FLAGS $OPT_FLAGS"
-CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
 
 # Allow additions to C and C++ compilation flags
 
@@ -261,13 +273,22 @@ then
   AC_LANG_POP(C)
 fi
 
+# Checks for programs.
+# Note that AC_PROG_CC must precede the first use of $GCC abd AC_PROG_CXX
+# must precede the first use of $GXX.  Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+AC_PROG_CC
+CFLAGS="$save_CFLAGS"
+save_CXXFLAGS="$CXXFLAGS"
+AC_PROG_CXX
+CXXFLAGS="$save_CXXFLAGS"
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
 # Libtool.
-# Turn off shared libraries during beta-testing, since they
-# make debugging harder and the build process takes too long.
-#AC_DISABLE_SHARED
-AC_LIBTOOL_DLOPEN
-AC_LIBTOOL_WIN32_DLL
-AC_PROG_LIBTOOL
+LT_INIT([dlopen,win32-dll])
 
 # If we are using GCC we want to compile with warnings enabled.
 if test x"$GCC" = xyes
@@ -295,5 +316,11 @@ AC_SUBST(debug_flag)
 
 AC_CONFIG_FILES(Makefile
                 src/Makefile
+                m4/Makefile
+                doc/Makefile
+                doc/user.doxyconf-latex
+                doc/devref.doxyconf-latex
+                doc/user.doxyconf-html
+                doc/devref.doxyconf-html
                 utils/Makefile)
 AC_OUTPUT
diff --git a/Watchdog/depcomp b/Watchdog/depcomp
index 011ebd9..e5f9736 100755
--- a/Watchdog/depcomp
+++ b/Watchdog/depcomp
@@ -1,9 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2005-07-09.11
+scriptversion=2007-03-29.01
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
+# Foundation, Inc.
 
 # 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
@@ -16,7 +17,7 @@ scriptversion=2005-07-09.11
 # 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,
+# along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 # 02110-1301, USA.
 
@@ -91,7 +92,20 @@ gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
 ## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
 ## it if -MD -MP comes after the -MF stuff.  Hmm.
-  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
   stat=$?
   if test $stat -eq 0; then :
   else
@@ -201,34 +215,39 @@ aix)
   # current directory.  Also, the AIX compiler puts `$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
   if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
     "$@" -Wc,-M
   else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
     "$@" -M
   fi
   stat=$?
 
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
   if test $stat -eq 0; then :
   else
-    rm -f "$tmpdepfile"
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
     exit $stat
   fi
 
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
   if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
     # Each line is of the form `foo.o: dependent.h'.
     # Do two passes, one to just change these to
     # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -276,6 +295,46 @@ icc)
   rm -f "$tmpdepfile"
   ;;
 
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
@@ -288,13 +347,13 @@ tru64)
 
    if test "$libtool" = yes; then
       # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mecanism is used in libtool 1.4 series to
+      # static library.  This mechanism is used in libtool 1.4 series to
       # handle both shared and static libraries in a single compilation.
       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
       #
       # With libtool 1.5 this exception was removed, and libtool now
       # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # compilations output dependencies in $dir.libs/$base.o.d and
       # in $dir$base.o.d.  We have to check for both files, because
       # one of the two compilations can be disabled.  We should prefer
       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
diff --git a/Watchdog/doc/Makefile.am b/Watchdog/doc/Makefile.am
new file mode 100644
index 0000000..7ab8c5c
--- /dev/null
+++ b/Watchdog/doc/Makefile.am
@@ -0,0 +1,297 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PWL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Watchdog Library
+# site: http://www.cs.unipr.it/pwl/ .
+
+# All the documentation in docdir.
+docdir = @docdir@
+htmldir = $(docdir)
+pdfdir = $(docdir)
+psdir = $(docdir)
+txtdir = $(docdir)
+
+DOXYGEN = doxygen
+INSTALLDOX = ./installdox -q
+
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+# Library Core Manuals (C++ interface)
+
+HTML_CORE_MANUALS = \
+pwl-user- at VERSION@-html.tar.gz \
+pwl-devref- at VERSION@-html.tar.gz
+
+PDF_CORE_MANUALS = \
+pwl-user- at VERSION@.pdf \
+pwl-devref- at VERSION@.pdf
+
+PS_CORE_MANUALS = \
+pwl-user- at VERSION@.ps.gz \
+pwl-devref- at VERSION@.ps.gz
+
+USER_HTML_DIR = pwl-user- at VERSION@-html
+DEVREF_HTML_DIR = pwl-devref- at VERSION@-html
+
+CORE_HTML_DIRS = $(USER_HTML_DIR) $(DEVREF_HTML_DIR)
+
+DIST_CORE_HTML_DOCS = \
+pwl-user- at VERSION@-html.tar.gz
+
+DIST_CORE_PDF_DOCS = \
+pwl-user- at VERSION@.pdf
+
+DIST_CORE_PS_DOCS = \
+pwl-user- at VERSION@.ps.gz
+
+DOX_FILES = \
+gpl.dox \
+fdl.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+pwl.sty \
+$(top_builddir)/src/pwl.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+pwl.sty \
+$(PWL_SOURCE_FILES)
+
+
+MANUALS = \
+$(HTML_CORE_MANUALS) \
+$(PDF_CORE_MANUALS) \
+$(PS_CORE_MANUALS)
+
+HTML_DIRS = \
+$(CORE_HTML_DIRS)
+
+DIST_HTML_DOCS = \
+$(DIST_CORE_HTML_DOCS)
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(DIST_CORE_PDF_DOCS)
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+$(DIST_CORE_PS_DOCS)
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+# We distribute some preprocessed user's documentation.
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+ALL_TARGETS = \
+$(HTML_DIRS) \
+$(PDF_LICENSES) \
+$(PS_LICENSES) \
+$(MANUALS)
+
+# Do nothing by default.
+all:
+
+user: pwl-user- at VERSION@.pdf
+
+world: $(ALL_TARGETS)
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	  gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+	  for file in $$dir/*; do \
+	    $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+	  done; \
+	done
+
+installdirs-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+uninstall-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+	for file in $(DIST_PDF_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+installdirs-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+	rm -f $(DESTDIR)$(pdfdir)/*.pdf
+
+# Installation and uninstallation of PostScript documentation.
+install-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+	for file in $(DIST_PS_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+	done
+
+installdirs-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+	rm -f $(DESTDIR)$(psdir)/*.ps.gz
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+	done
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README; do \
+	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+installdirs-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	  rm -f $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+PWL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+pwl-user- at VERSION@.pdf: user.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+pwl-devref- at VERSION@.pdf: devref.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+$(USER_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+$(DEVREF_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+
+%.tar: %
+	tar cf $@ $<
+
+%.gz: %
+	gzip --best --force $<
+
+%.pdf: %.tex
+	$(TEX_ENV) pdflatex $<
+
+%.ps:	%.pdf
+	pdftops $< $@
+
+EXTRA_DIST= \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+user.doxyconf-latex \
+devref.doxyconf-latex \
+user.doxyconf-html \
+devref.doxyconf-html \
+user.tex \
+devref.tex \
+gpl.tex \
+fdl.tex \
+pwl.sty \
+README.doc
+
+mostlyclean-local:
+	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(HTML_DIRS) *.aux *.log
+
+CLEANFILES = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(USER_HTML_DIR).tag \
+$(DEVREF_HTML_DIR).tag
diff --git a/Watchdog/doc/Makefile.in b/Watchdog/doc/Makefile.in
new file mode 100644
index 0000000..50bcf14
--- /dev/null
+++ b/Watchdog/doc/Makefile.in
@@ -0,0 +1,632 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PWL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Watchdog Library
+# site: http://www.cs.unipr.it/pwl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/devref.doxyconf-html.in \
+	$(srcdir)/devref.doxyconf-latex.in \
+	$(srcdir)/user.doxyconf-html.in \
+	$(srcdir)/user.doxyconf-latex.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = user.doxyconf-latex devref.doxyconf-latex \
+	user.doxyconf-html devref.doxyconf-html
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+
+# All the documentation in docdir.
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = $(docdir)
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = $(docdir)
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = $(docdir)
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+txtdir = $(docdir)
+DOXYGEN = doxygen
+INSTALLDOX = ./installdox -q
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+
+# Library Core Manuals (C++ interface)
+HTML_CORE_MANUALS = \
+pwl-user- at VERSION@-html.tar.gz \
+pwl-devref- at VERSION@-html.tar.gz
+
+PDF_CORE_MANUALS = \
+pwl-user- at VERSION@.pdf \
+pwl-devref- at VERSION@.pdf
+
+PS_CORE_MANUALS = \
+pwl-user- at VERSION@.ps.gz \
+pwl-devref- at VERSION@.ps.gz
+
+USER_HTML_DIR = pwl-user- at VERSION@-html
+DEVREF_HTML_DIR = pwl-devref- at VERSION@-html
+CORE_HTML_DIRS = $(USER_HTML_DIR) $(DEVREF_HTML_DIR)
+DIST_CORE_HTML_DOCS = \
+pwl-user- at VERSION@-html.tar.gz
+
+DIST_CORE_PDF_DOCS = \
+pwl-user- at VERSION@.pdf
+
+DIST_CORE_PS_DOCS = \
+pwl-user- at VERSION@.ps.gz
+
+DOX_FILES = \
+gpl.dox \
+fdl.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+pwl.sty \
+$(top_builddir)/src/pwl.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+pwl.sty \
+$(PWL_SOURCE_FILES)
+
+MANUALS = \
+$(HTML_CORE_MANUALS) \
+$(PDF_CORE_MANUALS) \
+$(PS_CORE_MANUALS)
+
+HTML_DIRS = \
+$(CORE_HTML_DIRS)
+
+DIST_HTML_DOCS = \
+$(DIST_CORE_HTML_DOCS)
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(DIST_CORE_PDF_DOCS)
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+$(DIST_CORE_PS_DOCS)
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+
+# We distribute some preprocessed user's documentation.
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+ALL_TARGETS = \
+$(HTML_DIRS) \
+$(PDF_LICENSES) \
+$(PS_LICENSES) \
+$(MANUALS)
+
+PWL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+EXTRA_DIST = \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+user.doxyconf-latex \
+devref.doxyconf-latex \
+user.doxyconf-html \
+devref.doxyconf-html \
+user.tex \
+devref.tex \
+gpl.tex \
+fdl.tex \
+pwl.sty \
+README.doc
+
+CLEANFILES = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(USER_HTML_DIR).tag \
+$(DEVREF_HTML_DIR).tag
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  doc/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+user.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs: installdirs-local
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-local install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-local maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-local
+
+
+# Do nothing by default.
+all:
+
+user: pwl-user- at VERSION@.pdf
+
+world: $(ALL_TARGETS)
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	  gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+	  for file in $$dir/*; do \
+	    $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+	  done; \
+	done
+
+installdirs-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+uninstall-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+	for file in $(DIST_PDF_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+installdirs-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+	rm -f $(DESTDIR)$(pdfdir)/*.pdf
+
+# Installation and uninstallation of PostScript documentation.
+install-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+	for file in $(DIST_PS_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+	done
+
+installdirs-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+	rm -f $(DESTDIR)$(psdir)/*.ps.gz
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+	done
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README; do \
+	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+installdirs-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	  rm -f $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+pwl-user- at VERSION@.pdf: user.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+pwl-devref- at VERSION@.pdf: devref.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+$(USER_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+$(DEVREF_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+%.tar: %
+	tar cf $@ $<
+
+%.gz: %
+	gzip --best --force $<
+
+%.pdf: %.tex
+	$(TEX_ENV) pdflatex $<
+
+%.ps:	%.pdf
+	pdftops $< $@
+
+mostlyclean-local:
+	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(HTML_DIRS) *.aux *.log
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Watchdog/doc/README.doc b/Watchdog/doc/README.doc
new file mode 100644
index 0000000..a20abe0
--- /dev/null
+++ b/Watchdog/doc/README.doc
@@ -0,0 +1,139 @@
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+How To Get (More) PWL Documentation
+===================================
+
+Do you have all the documentation you need? If you don't or if you are
+unsure, the following is for you.
+
+There are two versions of the Parma Watchdog Library's documentation:
+
+  + a `user' manual, containing all and only the information needed by
+    people wishing to use the library;
+  + a `devref' (developer reference) manual, also containing details
+    about the library implementation.
+
+Each of these versions can be obtained in several formats:
+
+  + a PDF file suitable for browsing on the screen;
+  + a (gzipped) PostScript file suitable for printing;
+  + a (tarred and gzipped) collection of HTML pages suitable for browsing.
+
+
+The Documentation You May Already Have
+======================================
+
+First of all, you may already have some documentation and all you need
+to do is to find it.
+
+If you have downloaded a source (tar or zip) archive for PWL version
+X.Y.Z, you will find in the doc subdirectory the following set of user
+manuals:
+
+  pwl-user-X.Y.Z.pdf
+  pwl-user-X.Y.Z.ps.gz
+
+If you have installed a binary RPM package, then you have the same set
+of manuals. You can find them with the command `rpm -ql pwl' which
+will print, among other things, something like
+
+  /usr/share/doc/pwl-X.Y.Z
+  /usr/share/doc/pwl-X.Y.Z/README
+  /usr/share/doc/pwl-X.Y.Z/pwl-user-X.Y.Z.pdf
+  /usr/share/doc/pwl-X.Y.Z/pwl-user-X.Y.Z.ps.gz
+
+
+The Documentation You May Download
+==================================
+
+If you are using the latest released version of the library, you will
+find all the documentation in all formats at
+http://www.cs.unipr.it/pwl/Documentation/ .
+
+
+The Documentation You May Build Yourself
+========================================
+
+When all else fails (which is the case, for example, when you are
+using a CVS version [1]) then you may build the documentation by
+yourself. In order to do that, you should have a recent version of
+Doxygen [2] and, if you want to build the HTML documentation, a recent
+version of Graphviz [3].  When you have all the tools installed and
+running, you should follow the following procedure.
+
+First, you should determine which version of the library you are
+working with. The safest way is to go to the top source directory of
+the library and to locate the unique line in the file configure.ac
+containing the string "AC_INIT". This will look like
+
+  AC_INIT([the Parma Watchdog Library], 0.6.3pre4, pwl-devel at cs.unipr.it, pwl)
+
+from which you determine that the version is 0.6.3pre4 (a.k.a. the 4th
+beta version before release 0.6.3).
+
+Then, if you have not yet done it, build the library itself (see the
+building instructions in the file INSTALL [4] in the top source
+directory.  The default build process, while essential in order to
+produce the documentation, will not generate it directly. For this
+reason you should go to the doc subdirectory of your build directory
+(i.e., the one where you compiled the library) and build all the
+documents you want by executing a command of the form
+
+    make doc1 doc2 ...
+
+Here, doc1, doc2 and so forth are the names of the documents to be built.
+Document names may be obtained from the following list by replacing
+X.Y.Z with the version number you have already determined, and by
+replacing KIND with either `user' or `devref':
+
+    pwl-KIND-X.Y.Z.pdf
+    pwl-KIND-X.Y.Z.ps.gz
+    pwl-KIND-X.Y.Z-html.tar.gz
+
+For example, the command
+
+    make pwl-user-0.6.3pre4.pdf pwl-devref-0.6.3pre4.pdf
+
+will build both kinds of manuals in a PDF format.  Alternatively, the
+command `make world' will build all the available documentation in all
+of the above formats.
+
+--------
+
+[1] http://www.cs.unipr.it/pwl/Download/cvs
+[2] http://www.doxygen.org/
+[3] http://www.research.att.com/sw/tools/graphviz/
+
+
+--------
+
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This document describes the Parma Watchdog Library (PWL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PWL in files called `fdl.*'.
+
+The PWL 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 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PWL in
+files are called `gpl.*'.
+
+The PWL 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.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PWL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Watchdog Library
+site: http://www.cs.unipr.it/pwl/ .
diff --git a/Watchdog/doc/devref.doxyconf-html b/Watchdog/doc/devref.doxyconf-html
new file mode 100644
index 0000000..f2c2321
--- /dev/null
+++ b/Watchdog/doc/devref.doxyconf-html
@@ -0,0 +1,273 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = 0.6
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = /home/roberto/ppl/ppl/Watchdog/doc/../src/Doubly_Linked_Object.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Doubly_Linked_Object.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Doubly_Linked_Object.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList_Iterator.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList_Iterator.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList_Iterator.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Handler.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Handler.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Handler.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/Watchdog/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = pwl-devref-0.6-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = /home/roberto/ppl/ppl/Watchdog/doc/devref.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PWL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = pwl-devref-0.6-html.tag
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/devref.doxyconf-html.in b/Watchdog/doc/devref.doxyconf-html.in
new file mode 100644
index 0000000..1c59716
--- /dev/null
+++ b/Watchdog/doc/devref.doxyconf-html.in
@@ -0,0 +1,273 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../src/Doubly_Linked_Object.types.hh \
+                         @srcdir@/../src/Doubly_Linked_Object.defs.hh \
+                         @srcdir@/../src/Doubly_Linked_Object.inlines.hh \
+                         @srcdir@/../src/EList.types.hh \
+                         @srcdir@/../src/EList.defs.hh \
+                         @srcdir@/../src/EList.inlines.hh \
+                         @srcdir@/../src/EList_Iterator.types.hh \
+                         @srcdir@/../src/EList_Iterator.defs.hh \
+                         @srcdir@/../src/EList_Iterator.inlines.hh \
+                         @srcdir@/../src/Handler.types.hh \
+                         @srcdir@/../src/Handler.defs.hh \
+                         @srcdir@/../src/Handler.inlines.hh \
+                         @srcdir@/../src/Pending_Element.types.hh \
+                         @srcdir@/../src/Pending_Element.defs.hh \
+                         @srcdir@/../src/Pending_Element.inlines.hh \
+                         @srcdir@/../src/Pending_Element.cc \
+                         @srcdir@/../src/Pending_List.types.hh \
+                         @srcdir@/../src/Pending_List.defs.hh \
+                         @srcdir@/../src/Pending_List.inlines.hh \
+                         @srcdir@/../src/Pending_List.cc \
+                         @srcdir@/../src/Time.types.hh \
+                         @srcdir@/../src/Time.defs.hh \
+                         @srcdir@/../src/Time.inlines.hh \
+                         @srcdir@/../src/Time.cc \
+                         @srcdir@/../src/Watchdog.types.hh \
+                         @srcdir@/../src/Watchdog.defs.hh \
+                         @srcdir@/../src/Watchdog.inlines.hh \
+                         @srcdir@/../src/Watchdog.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = pwl-devref- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = @srcdir@/devref.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PWL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = pwl-devref- at VERSION@-html.tag
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/devref.doxyconf-latex b/Watchdog/doc/devref.doxyconf-latex
new file mode 100644
index 0000000..b78840c
--- /dev/null
+++ b/Watchdog/doc/devref.doxyconf-latex
@@ -0,0 +1,273 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = 0.6
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = /home/roberto/ppl/ppl/Watchdog/doc/../src/Doubly_Linked_Object.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Doubly_Linked_Object.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Doubly_Linked_Object.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList_Iterator.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList_Iterator.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/EList_Iterator.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Handler.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Handler.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Handler.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_Element.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Pending_List.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Time.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.types.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.defs.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.inlines.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/../src/Watchdog.cc \
+                         /home/roberto/ppl/ppl/Watchdog/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/Watchdog/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = pwl-devref-0.6-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = /home/roberto/ppl/ppl/Watchdog/doc/devref.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PWL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/devref.doxyconf-latex.in b/Watchdog/doc/devref.doxyconf-latex.in
new file mode 100644
index 0000000..417b9b6
--- /dev/null
+++ b/Watchdog/doc/devref.doxyconf-latex.in
@@ -0,0 +1,273 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../src/Doubly_Linked_Object.types.hh \
+                         @srcdir@/../src/Doubly_Linked_Object.defs.hh \
+                         @srcdir@/../src/Doubly_Linked_Object.inlines.hh \
+                         @srcdir@/../src/EList.types.hh \
+                         @srcdir@/../src/EList.defs.hh \
+                         @srcdir@/../src/EList.inlines.hh \
+                         @srcdir@/../src/EList_Iterator.types.hh \
+                         @srcdir@/../src/EList_Iterator.defs.hh \
+                         @srcdir@/../src/EList_Iterator.inlines.hh \
+                         @srcdir@/../src/Handler.types.hh \
+                         @srcdir@/../src/Handler.defs.hh \
+                         @srcdir@/../src/Handler.inlines.hh \
+                         @srcdir@/../src/Pending_Element.types.hh \
+                         @srcdir@/../src/Pending_Element.defs.hh \
+                         @srcdir@/../src/Pending_Element.inlines.hh \
+                         @srcdir@/../src/Pending_Element.cc \
+                         @srcdir@/../src/Pending_List.types.hh \
+                         @srcdir@/../src/Pending_List.defs.hh \
+                         @srcdir@/../src/Pending_List.inlines.hh \
+                         @srcdir@/../src/Pending_List.cc \
+                         @srcdir@/../src/Time.types.hh \
+                         @srcdir@/../src/Time.defs.hh \
+                         @srcdir@/../src/Time.inlines.hh \
+                         @srcdir@/../src/Time.cc \
+                         @srcdir@/../src/Watchdog.types.hh \
+                         @srcdir@/../src/Watchdog.defs.hh \
+                         @srcdir@/../src/Watchdog.inlines.hh \
+                         @srcdir@/../src/Watchdog.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = pwl-devref- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = @srcdir@/devref.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PWL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/devref.tex b/Watchdog/doc/devref.tex
new file mode 100644
index 0000000..c32b300
--- /dev/null
+++ b/Watchdog/doc/devref.tex
@@ -0,0 +1,120 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Watchdog Library (PWL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PWL in files called `fdl.*'.
+%
+% The PWL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PWL in
+% files are called `gpl.*'.
+%
+% The PWL 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.
+%
+% For the most up-to-date information see the Parma Watchdog Library
+% site: http://www.cs.unipr.it/pwl/ .
+
+\documentclass[a4paper]{article}
+\nonstopmode
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{alltt}
+\usepackage{doxygen}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{pwl}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Watchdog Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Watchdog Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Watchdog Library \\
+Developer's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Watchdog Library (PWL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PWL 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.
+
+For the most up-to-date information see the Parma Watchdog Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/pwl/}{\tt http://www.cs.unipr.it/pwl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/Watchdog/doc/fdl.dox b/Watchdog/doc/fdl.dox
new file mode 100644
index 0000000..43fe58b
--- /dev/null
+++ b/Watchdog/doc/fdl.dox
@@ -0,0 +1,407 @@
+/*! \page GFDL GNU Free Documentation License
+
+\anchor GFDL
+
+Version 1.2, November 2002
+
+<PRE>
+Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA.
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+<P>
+<STRONG>0. PREAMBLE</STRONG>
+<P>
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+<P>
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+<P>
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+<P>
+
+<STRONG>1. APPLICABILITY AND DEFINITIONS</STRONG>
+<P>
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+<P>
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+<P>
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+<P>
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+<P>
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+<P>
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+<P>
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+<P>
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+<p>
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+<p>
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+<P>
+<STRONG>2. VERBATIM COPYING</STRONG>
+<P>
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+<P>
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+<P>
+
+<STRONG>3. COPYING IN QUANTITY</STRONG>
+<P>
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+<P>
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+<P>
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+<P>
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+<P>
+
+<STRONG>4. MODIFICATIONS</STRONG>
+<P>
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+<P>
+<UL>
+<LI><STRONG>A.</STRONG> Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+<LI><STRONG>B.</STRONG> List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+<LI><STRONG>C.</STRONG> State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+<LI><STRONG>D.</STRONG> Preserve all the copyright notices of the Document.
+<LI><STRONG>E.</STRONG> Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+<LI><STRONG>F.</STRONG> Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+<LI><STRONG>G.</STRONG> Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+<LI><STRONG>H.</STRONG> Include an unaltered copy of this License.
+<LI><STRONG>I.</STRONG> Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+<LI><STRONG>J.</STRONG> Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+<LI><STRONG>K.</STRONG> For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+<LI><STRONG>L.</STRONG> Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+<LI><STRONG>M.</STRONG> Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+<LI><STRONG>N.</STRONG> Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+<LI><STRONG>O.</STRONG> Preserve any Warranty Disclaimers.
+</UL>
+<P>
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+<P>
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+<P>
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+<P>
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+<P>
+
+<STRONG>5. COMBINING DOCUMENTS</STRONG>
+<P>
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+<P>
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+<P>
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements."
+<P>
+
+<STRONG>6. COLLECTIONS OF DOCUMENTS</STRONG>
+<P>
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+<P>
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+<P>
+
+
+<STRONG>7. AGGREGATION WITH INDEPENDENT WORKS</STRONG>
+<P>
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+<P>
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+<P>
+
+<STRONG>8. TRANSLATION</STRONG>
+<P>
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+<p>
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+<P>
+
+<STRONG>9. TERMINATION</STRONG>
+<P>
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+<P>
+
+<STRONG>10. FUTURE REVISIONS OF THIS LICENSE</STRONG>
+<P>
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+<P>
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+<P>
+
+<H2>How to use this License for your documents</H2>
+<P>
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+<P>
+<PRE>
+      Copyright (c)  YEAR  YOUR NAME.
+      Permission is granted to copy, distribute and/or modify this document
+      under the terms of the GNU Free Documentation License, Version 1.2
+      or any later version published by the Free Software Foundation;
+      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+      Texts.  A copy of the license is included in the section entitled
+      "GNU Free Documentation License".
+</PRE>
+<P>
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+<p>
+<pre>
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+</pre>
+<p>
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+<p>
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+*/
diff --git a/Watchdog/doc/fdl.pdf b/Watchdog/doc/fdl.pdf
new file mode 100644
index 0000000..ddab691
Binary files /dev/null and b/Watchdog/doc/fdl.pdf differ
diff --git a/Watchdog/doc/fdl.ps.gz b/Watchdog/doc/fdl.ps.gz
new file mode 100644
index 0000000..60fc3e4
Binary files /dev/null and b/Watchdog/doc/fdl.ps.gz differ
diff --git a/Watchdog/doc/fdl.tex b/Watchdog/doc/fdl.tex
new file mode 100644
index 0000000..fa38f28
--- /dev/null
+++ b/Watchdog/doc/fdl.tex
@@ -0,0 +1,454 @@
+\documentclass[a4paper,12pt]{article}
+
+\usepackage[english]{babel}
+
+\begin{document}
+
+
+\title{GNU Free Documentation License}
+\date{}
+\author{}
+\maketitle
+
+ \begin{center}
+
+       Version 1.2, November 2002
+
+
+ Copyright \copyright 2000,2001,2002  Free Software Foundation, Inc.
+
+ \bigskip
+
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA
+
+ \bigskip
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+\end{center}
+
+
+\section*{Preamble}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\section{Applicability and Definitions}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The \textbf{"Document"}, below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as \textbf{"you"}.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A \textbf{"Modified Version"} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A \textbf{"Secondary Section"} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The \textbf{"Cover Texts"} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{"Transparent"} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called \textbf{"Opaque"}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The \textbf{"Title Page"} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as \textbf{"Acknowledgements"},
+\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.)
+To \textbf{"Preserve the Title"}
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\section{Verbatim Copying}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\section{Copying in Quantity}
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\section{Modifications}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+\begin{itemize}
+\item[A.]
+   Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+
+\item[B.]
+   List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+
+\item[C.]
+   State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+
+\item[D.]
+   Preserve all the copyright notices of the Document.
+
+\item[E.]
+   Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+
+\item[F.]
+   Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+
+\item[G.]
+   Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+
+\item[H.]
+   Include an unaltered copy of this License.
+
+\item[I.]
+   Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+
+\item[J.]
+   Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+
+\item[K.]
+   For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+
+\item[L.]
+   Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+
+\item[M.]
+   Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+
+\item[N.]
+   Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+
+\item[O.]
+   Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\section{Combining Documents}
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+\section{Collections of Documents}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\section{Aggregation with Independent Works}
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\section{Translation}
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+\section{Termination}
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+\section{Future Revisions of this License}
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\section*{Addendum: How To Use this License for Your Documents}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\begin{quote}
+    Copyright \copyright  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+\end{quote}
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+\begin{quote}
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+\end{quote}
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+\end{document}
diff --git a/Watchdog/doc/fdl.txt b/Watchdog/doc/fdl.txt
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/Watchdog/doc/fdl.txt
@@ -0,0 +1,397 @@
+		GNU Free Documentation License
+		  Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+    Copyright (c)  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/Watchdog/doc/gpl.dox b/Watchdog/doc/gpl.dox
new file mode 100644
index 0000000..c1122ac
--- /dev/null
+++ b/Watchdog/doc/gpl.dox
@@ -0,0 +1,686 @@
+/*! \page GPL GNU General Public License
+
+\anchor GPL
+
+Version 3, 29 June 2007
+
+<p>Copyright (C) 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p><p>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<h1>Preamble</h1>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>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
+them 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.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<h1>TERMS AND CONDITIONS</h1>
+
+<h2>0. Definitions.</h2>
+
+<p>“This License” refers to version 3 of the GNU General Public License.</p>
+
+<p>“Copyright” also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+
+<p>“The Program” refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as “you”.  “Licensees” and
+“recipients” may be individuals or organizations.</p>
+
+<p>To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a “modified version” of the
+earlier work or a work “based on” the earlier work.</p>
+
+<p>A “covered work” means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays “Appropriate Legal Notices”
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<h2>1. Source Code.</h2>
+
+<p>The “source code” for a work means the preferred form of the work
+for making modifications to it.  “Object code” means any non-source
+form of a work.</p>
+
+<p>A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<h2>2. Basic Permissions.</h2>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<h2>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h2>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<h2>4. Conveying Verbatim Copies.</h2>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<h2>5. Conveying Modified Source Versions.</h2>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    “keep intact all notices”.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<h2>6. Conveying Non-Source Forms.</h2>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, “normally used” refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<h2>7. Additional Terms.</h2>
+
+<p>“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<h2>8. Termination.</h2>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<h2>9. Acceptance Not Required for Having Copies.</h2>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<h2>10. Automatic Licensing of Downstream Recipients.</h2>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<h2>11. Patents.</h2>
+
+<p>A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's “contributor version”.</p>
+
+<p>A contributor's “essential patent claims” are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is “discriminatory” if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<h2>12. No Surrender of Others' Freedom.</h2>
+
+<p>If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<h2>13. Use with the GNU Affero General Public License.</h2>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<h2>14. Revised Versions of this License.</h2>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU 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.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License “or any later version” applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<h2>15. Disclaimer of Warranty.</h2>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<h2>16. Limitation of Liability.</h2>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<h2>17. Interpretation of Sections 15 and 16.</h2>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<h1>How to Apply These Terms to Your New Programs</h1>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.</p>
+
+<pre>    <var>one line to give the program's name and a brief idea of what it does.</var>
+    Copyright (C) <var>year</var>  <var>name of author</var>
+
+    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 3 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, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    <var>program</var>  Copyright (C) <var>year</var>  <var>name of author</var>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an “about box”.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>.</p>
+*/
diff --git a/Watchdog/doc/gpl.pdf b/Watchdog/doc/gpl.pdf
new file mode 100644
index 0000000..e6c54f0
Binary files /dev/null and b/Watchdog/doc/gpl.pdf differ
diff --git a/Watchdog/doc/gpl.ps.gz b/Watchdog/doc/gpl.ps.gz
new file mode 100644
index 0000000..1a50bf3
Binary files /dev/null and b/Watchdog/doc/gpl.ps.gz differ
diff --git a/Watchdog/doc/gpl.tex b/Watchdog/doc/gpl.tex
new file mode 100644
index 0000000..1e867c3
--- /dev/null
+++ b/Watchdog/doc/gpl.tex
@@ -0,0 +1,728 @@
+\documentclass[a4paper,12pt]{article}
+\usepackage{a4wide}
+\usepackage{times}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+
+\title{GNU GENERAL PUBLIC LICENSE}
+\date{Version 3, 29 June 2007}
+
+\begin{document}
+\maketitle
+
+\begin{center}
+{\parindent 0in
+
+Copyright \copyright\  2007 Free Software Foundation, Inc. http://fsf.org/
+
+\bigskip
+Everyone is permitted to copy and distribute verbatim copies of this
+
+license document, but changing it is not allowed.}
+
+\end{center}
+
+\renewcommand{\abstractname}{Preamble}
+\begin{abstract}
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+\end{abstract}
+
+\begin{center}
+{\Large \sc Terms and Conditions}
+\end{center}
+
+
+\begin{enumerate}
+
+\addtocounter{enumi}{-1}
+
+\item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a ``modified version'' of the
+earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices''
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+\item Source Code.
+
+The ``source code'' for a work means the preferred form of the work
+for making modifications to it.  ``Object code'' means any non-source
+form of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+The Corresponding Source for a work in source code form is that
+same work.
+
+\item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+\item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+\item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+\item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+  \begin{enumerate}
+  \item The work must carry prominent notices stating that you modified
+  it, and giving a relevant date.
+
+  \item The work must carry prominent notices stating that it is
+  released under this License and any conditions added under section
+  7.  This requirement modifies the requirement in section 4 to
+  ``keep intact all notices''.
+
+  \item You must license the entire work, as a whole, under this
+  License to anyone who comes into possession of a copy.  This
+  License will therefore apply, along with any applicable section 7
+  additional terms, to the whole of the work, and all its parts,
+  regardless of how they are packaged.  This License gives no
+  permission to license the work in any other way, but it does not
+  invalidate such permission if you have separately received it.
+
+  \item If the work has interactive user interfaces, each must display
+  Appropriate Legal Notices; however, if the Program has interactive
+  interfaces that do not display Appropriate Legal Notices, your
+  work need not make them do so.
+\end{enumerate}
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+\item Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+  \begin{enumerate}
+  \item Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by the
+  Corresponding Source fixed on a durable physical medium
+  customarily used for software interchange.
+
+  \item Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by a
+  written offer, valid for at least three years and valid for as
+  long as you offer spare parts or customer support for that product
+  model, to give anyone who possesses the object code either (1) a
+  copy of the Corresponding Source for all the software in the
+  product that is covered by this License, on a durable physical
+  medium customarily used for software interchange, for a price no
+  more than your reasonable cost of physically performing this
+  conveying of source, or (2) access to copy the
+  Corresponding Source from a network server at no charge.
+
+  \item Convey individual copies of the object code with a copy of the
+  written offer to provide the Corresponding Source.  This
+  alternative is allowed only occasionally and noncommercially, and
+  only if you received the object code with such an offer, in accord
+  with subsection 6b.
+
+  \item Convey the object code by offering access from a designated
+  place (gratis or for a charge), and offer equivalent access to the
+  Corresponding Source in the same way through the same place at no
+  further charge.  You need not require recipients to copy the
+  Corresponding Source along with the object code.  If the place to
+  copy the object code is a network server, the Corresponding Source
+  may be on a different server (operated by you or a third party)
+  that supports equivalent copying facilities, provided you maintain
+  clear directions next to the object code saying where to find the
+  Corresponding Source.  Regardless of what server hosts the
+  Corresponding Source, you remain obligated to ensure that it is
+  available for as long as needed to satisfy these requirements.
+
+  \item Convey the object code using peer-to-peer transmission, provided
+  you inform other peers where the object code and Corresponding
+  Source of the work are being offered to the general public at no
+  charge under subsection 6d.
+  \end{enumerate}
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, ``normally used'' refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+\item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+  \begin{enumerate}
+  \item Disclaiming warranty or limiting liability differently from the
+  terms of sections 15 and 16 of this License; or
+
+  \item Requiring preservation of specified reasonable legal notices or
+  author attributions in that material or in the Appropriate Legal
+  Notices displayed by works containing it; or
+
+  \item Prohibiting misrepresentation of the origin of that material, or
+  requiring that modified versions of such material be marked in
+  reasonable ways as different from the original version; or
+
+  \item Limiting the use for publicity purposes of names of licensors or
+  authors of the material; or
+
+  \item Declining to grant rights under trademark law for use of some
+  trade names, trademarks, or service marks; or
+
+  \item Requiring indemnification of licensors and authors of that
+  material by anyone who conveys the material (or modified versions of
+  it) with contractual assumptions of liability to the recipient, for
+  any liability that these contractual assumptions directly impose on
+  those licensors and authors.
+  \end{enumerate}
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+\item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+\item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+\item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+\item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+\item No Surrender of Others' Freedom.
+
+If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+\item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+\item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of
+the GNU 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
+Program specifies that a certain numbered version of the GNU General
+Public License ``or any later version'' applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+\item Disclaimer of Warranty.
+
+\begin{sloppypar}
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+ APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+ COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``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 PROGRAM IS WITH YOU.
+ SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+ NECESSARY SERVICING, REPAIR OR CORRECTION.
+\end{sloppypar}
+
+\item Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+ AND/OR CONVEYS THE PROGRAM 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 PROGRAM
+ (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+ HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES.
+
+\item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+\begin{center}
+{\Large\sc End of Terms and Conditions}
+
+How to Apply These Terms to Your New Programs
+
+\end{center}
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+\begin{quote}
+  <one line to give the program's name and a brief idea of what it does.>
+
+  Copyright (C) <year>  <name of author>
+
+  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 3 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, see
+  http://www.gnu.org/licenses/.
+
+\end{quote}
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+\begin{quote}
+  <program>  Copyright (C) <year>  <name of author>
+
+  This program comes with ABSOLUTELY NO WARRANTY; for details type
+{\tt show w}.
+  This is free software, and you are welcome to redistribute it
+  under certain conditions; type {\tt show c} for details.
+\end{quote}
+
+The hypothetical commands {\tt show w} and {\tt show c} should show
+the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary.  For more information on this, and how to apply and follow
+the GNU GPL, see http://www.gnu.org/licenses/.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.
+
+\end{enumerate}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
+
diff --git a/Watchdog/doc/gpl.txt b/Watchdog/doc/gpl.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/Watchdog/doc/gpl.txt
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state 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 program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 3 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, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Watchdog/doc/pwl-user-0.6-html.tar.gz b/Watchdog/doc/pwl-user-0.6-html.tar.gz
new file mode 100644
index 0000000..7e5946b
Binary files /dev/null and b/Watchdog/doc/pwl-user-0.6-html.tar.gz differ
diff --git a/Watchdog/doc/pwl-user-0.6.pdf b/Watchdog/doc/pwl-user-0.6.pdf
new file mode 100644
index 0000000..9dac81f
Binary files /dev/null and b/Watchdog/doc/pwl-user-0.6.pdf differ
diff --git a/Watchdog/doc/pwl-user-0.6.ps.gz b/Watchdog/doc/pwl-user-0.6.ps.gz
new file mode 100644
index 0000000..c61eb0f
Binary files /dev/null and b/Watchdog/doc/pwl-user-0.6.ps.gz differ
diff --git a/Watchdog/doc/pwl.sty b/Watchdog/doc/pwl.sty
new file mode 100644
index 0000000..faf86f6
--- /dev/null
+++ b/Watchdog/doc/pwl.sty
@@ -0,0 +1,178 @@
+%%    LaTeX package providing macros for typesetting the PWL manuals.
+%%    Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%%
+%% This file is part of the Parma Watchdog Library (PWL).
+%%
+%% The PWL 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 3 of the License, or (at your
+%% option) any later version.
+%%
+%% The PWL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%%
+%% For the most up-to-date information see the Parma Watchdog Library
+%% site: http://www.cs.unipr.it/pwl/ .
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pwl}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+
+%% Calligraphic alphabet
+\newcommand*{\cA}{\ensuremath{\mathcal{A}}}
+\newcommand*{\cB}{\ensuremath{\mathcal{B}}}
+\newcommand*{\cC}{\ensuremath{\mathcal{C}}}
+\newcommand*{\cD}{\ensuremath{\mathcal{D}}}
+\newcommand*{\cE}{\ensuremath{\mathcal{E}}}
+\newcommand*{\cF}{\ensuremath{\mathcal{F}}}
+\newcommand*{\cG}{\ensuremath{\mathcal{G}}}
+\newcommand*{\cH}{\ensuremath{\mathcal{H}}}
+\newcommand*{\cI}{\ensuremath{\mathcal{I}}}
+\newcommand*{\cJ}{\ensuremath{\mathcal{J}}}
+\newcommand*{\cK}{\ensuremath{\mathcal{K}}}
+\newcommand*{\cL}{\ensuremath{\mathcal{L}}}
+\newcommand*{\cM}{\ensuremath{\mathcal{M}}}
+\newcommand*{\cN}{\ensuremath{\mathcal{N}}}
+\newcommand*{\cO}{\ensuremath{\mathcal{O}}}
+\newcommand*{\cP}{\ensuremath{\mathcal{P}}}
+\newcommand*{\cQ}{\ensuremath{\mathcal{Q}}}
+\newcommand*{\cR}{\ensuremath{\mathcal{R}}}
+\newcommand*{\cS}{\ensuremath{\mathcal{S}}}
+\newcommand*{\cT}{\ensuremath{\mathcal{T}}}
+\newcommand*{\cU}{\ensuremath{\mathcal{U}}}
+\newcommand*{\cV}{\ensuremath{\mathcal{V}}}
+\newcommand*{\cW}{\ensuremath{\mathcal{W}}}
+\newcommand*{\cX}{\ensuremath{\mathcal{X}}}
+\newcommand*{\cY}{\ensuremath{\mathcal{Y}}}
+\newcommand*{\cZ}{\ensuremath{\mathcal{Z}}}
+
+%% Special letters denoting sets and algebras.
+\providecommand*{\Nset}{\mathbb{N}}            % Naturals
+\newcommand*{\extNset}{\mathbb{N}_\infty}      % Extended naturals
+\providecommand*{\Oset}{\mathbb{O}}            % Ordinals
+\providecommand*{\Qset}{\mathbb{Q}}            % Rationals
+\providecommand*{\Rset}{\mathbb{R}}            % Reals
+\providecommand*{\nonnegRset}{\mathbb{R}_{\scriptscriptstyle{+}}}
+                                               % Non-negative reals
+\newcommand*{\extRset}{\Rset_\infty}           % Extended reals
+\providecommand*{\Zset}{\mathbb{Z}}            % Integers
+\providecommand*{\CPset}{\mathbb{CP}}          % Closed polyhedra
+\providecommand*{\Pset}{\mathbb{P}}            % (NNC) polyhedra
+\providecommand*{\Sset}{\mathbb{S}}            % Reals or rationals
+
+%% Grid notation
+\providecommand*{\Gset}{\mathbb{G}}            % Grid
+\providecommand*{\cg}{\mathord{\mathrm{cg}}}   % Congruence
+\newcommand*{\gcon}{\mathop{\mathrm{gcon}}\nolimits}
+                                               % Grid from congruence system
+\newcommand*{\ggen}{\mathop{\mathrm{ggen}}\nolimits}
+                                               % Grid from generator system
+
+%% Function notation
+\newcommand*{\fund}[3]{\mathord{#1}\colon#2\rightarrow#3}
+\newcommand*{\pard}[3]{\mathord{#1}\colon#2\rightarrowtail#3}
+
+%% Relation notation
+\newcommand*{\reld}[3]{\mathord{#1}\subseteq#2\times#3}
+
+%% Set theory.
+\renewcommand*{\emptyset}{\mathord{\varnothing}}
+\newcommand*{\sseq}{\subseteq}
+\newcommand*{\sseqf}{\mathrel{\subseteq_\mathrm{f}}}
+\newcommand*{\sslt}{\subset}
+\newcommand*{\Sseq}{\supseteq}
+\newcommand*{\Ssgt}{\supset}
+\newcommand*{\inters}{\cap}
+\newcommand*{\setdiff}{\setminus}
+\newcommand*{\union}{\cup}
+\newcommand*{\card}{\mathop{\#}\nolimits}
+\newcommand*{\sset}[2]{{\renewcommand*{\arraystretch}{1.2}
+                      \left\{\,#1 \,\left|\,
+                               \begin{array}{@{}l@{}}#2\end{array}
+                      \right.   \,\right\}}}
+\newcommand*{\meet}{\mathbin{\otimes}}
+\newcommand*{\join}{\mathbin{\oplus}}
+
+%% Logic notation.
+\newcommand*{\entails}{\mathrel{\vdash}}
+\newcommand*{\sentails}{\mathrel{\Vdash}}
+\newcommand*{\Nentails}{\mathrel{\nvdash}}
+\newcommand*{\Nsentails}{\mathrel{\nVdash}}
+\newcommand*{\entailss}[1]{\mathrel{\vdash_{#1}}}
+\newcommand*{\Entailss}[1]{\mathrel{\dashv_{#1}}}
+\newcommand*{\sentailss}[1]{\mathrel{\Vdash_{#1}}}
+\newcommand*{\Nentailss}[1]{\mathrel{\nvdash_{#1}}}
+\newcommand*{\bigland}{\mathop{\bigwedge}\limits}
+\newcommand*{\biglor}{\mathop{\bigvee}\limits}
+\newcommand*{\piff}{\mathrel{\leftrightarrow}}
+\newcommand*{\pimplies}{\mathrel{\rightarrow}}
+\newcommand*{\pimplied}{\mathrel{\leftarrow}}
+\newcommand*{\st}{\mathrel{.}}
+\newcommand*{\itc}{\mathrel{:}}
+
+%% Integer division and reminder binary operators.
+\newcommand*{\bdiv}{\mathbin{\mathrm{div}}}
+\newcommand*{\brem}{\mathbin{\mathrm{rem}}}
+
+
+%% True and false
+\newcommand*{\false}{\mathord{\textbf{\textup{0}}}}
+\newcommand*{\true}{\mathord{\textbf{\textup{1}}}}
+
+%% Things that hold by definition.
+\newcommand*{\defrel}[1]{\mathrel{\buildrel \mathrm{def} \over {#1}}}
+\newcommand*{\defeq}{\defrel{=}}
+\newcommand*{\defiff}{\defrel{\Longleftrightarrow}}
+
+% Arbitrary relation symbol.
+\newcommand*{\relsym}{\mathrel{\bowtie}}
+\newcommand*{\relsyms}[1]{\mathrel{\bowtie_{#1}}}
+
+% Vectors.
+\renewcommand*{\vec}[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
+{\mbox{\boldmath$\textstyle#1$}}
+{\mbox{\boldmath$\scriptstyle#1$}}
+{\mbox{\boldmath$\scriptscriptstyle#1$}}}
+
+\newcommand*{\vect}[1]{\vec{#1}}
+
+% Matrix functions.
+\newcommand*{\transpose}{\mathrm{T}}
+
+% Hulls.
+\newcommand*{\linearhull}{\mathop{\mathrm{linear.hull}}}
+\newcommand*{\conichull}{\mathop{\mathrm{conic.hull}}}
+\newcommand*{\affinehull}{\mathop{\mathrm{affine.hull}}}
+\newcommand*{\convexhull}{\mathop{\mathrm{convex.hull}}}
+\newcommand*{\NNChull}{\mathop{\mathrm{nnc.hull}}}
+\newcommand*{\inthull}{\mathop{\mathrm{int.hull}}}
+\newcommand*{\intaffinehull}{\mathop{\mathrm{int.affine.hull}}}
+
+% Polyhedron functions.
+\newcommand*{\prank}{\mathop{\mathrm{rank}}}
+\newcommand*{\pdim}{\mathop{\mathrm{dim}}}
+\newcommand*{\linspace}{\mathop{\mathrm{lin.space}}}
+\newcommand*{\cone}{\mathop{\mathrm{cone}}}
+
+% Widening
+\newcommand*{\widen}{\mathrel{\nabla}}
+
+% Powerset notation
+\newcommand*{\pnonredmap}{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_n}}}\nolimits}
+\newcommand*{\pnonredmapi}[1]{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_{#1}}}}\nolimits}
+\newcommand*{\nonredmap}{\mathop{\Omega^{\scriptscriptstyle\entails}_{\scriptscriptstyle D}}\nolimits}
+
+\newcommand*{\wpf}{\mathop{\wp_\mathrm{f}}\nolimits}
+\newcommand*{\wpfn}[2]{\mathord{\wp_\mathrm{fn}^{\scriptscriptstyle #2}}(#1)}
+
+\newcommand*{\smallP}{{\scriptscriptstyle\mathrm{P}}}
+\newcommand*{\entailsP}{\entailss{\smallP}}
+\newcommand*{\NentailsP}{\Nentailss{\smallP}}
+\newcommand*{\sentailsP}{\sentailss{\smallP}}
diff --git a/Watchdog/doc/user.doxyconf-html b/Watchdog/doc/user.doxyconf-html
new file mode 100644
index 0000000..9e1b21b
--- /dev/null
+++ b/Watchdog/doc/user.doxyconf-html
@@ -0,0 +1,244 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = 0.6
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../src/pwl.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/Watchdog/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = pwl-user-0.6-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = /home/roberto/ppl/ppl/Watchdog/doc/user.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = pwl-user-0.6-html.tag
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/user.doxyconf-html.in b/Watchdog/doc/user.doxyconf-html.in
new file mode 100644
index 0000000..f60f854
--- /dev/null
+++ b/Watchdog/doc/user.doxyconf-html.in
@@ -0,0 +1,244 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../src/pwl.hh \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = pwl-user- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = @srcdir@/user.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = pwl-user- at VERSION@-html.tag
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/user.doxyconf-latex b/Watchdog/doc/user.doxyconf-latex
new file mode 100644
index 0000000..6cb6106
--- /dev/null
+++ b/Watchdog/doc/user.doxyconf-latex
@@ -0,0 +1,244 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = 0.6
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../src/pwl.hh \
+                         /home/roberto/ppl/ppl/Watchdog/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/Watchdog/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = pwl-user-0.6-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = /home/roberto/ppl/ppl/Watchdog/doc/user.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/user.doxyconf-latex.in b/Watchdog/doc/user.doxyconf-latex.in
new file mode 100644
index 0000000..7afb04a
--- /dev/null
+++ b/Watchdog/doc/user.doxyconf-latex.in
@@ -0,0 +1,244 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PWL
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../src/pwl.hh \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = pwl-user- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = pwl
+LATEX_HEADER           = @srcdir@/user.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PWL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/Watchdog/doc/user.tex b/Watchdog/doc/user.tex
new file mode 100644
index 0000000..3a0a607
--- /dev/null
+++ b/Watchdog/doc/user.tex
@@ -0,0 +1,120 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Watchdog Library (PWL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PWL in files called `fdl.*'.
+%
+% The PWL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PWL in
+% files are called `gpl.*'.
+%
+% The PWL 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.
+%
+% For the most up-to-date information see the Parma Watchdog Library
+% site: http://www.cs.unipr.it/pwl/ .
+
+\documentclass[a4paper]{article}
+\nonstopmode
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{alltt}
+\usepackage{doxygen}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{pwl}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Watchdog Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Watchdog Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Watchdog Library \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Watchdog Library (PWL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PWL 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.
+
+For the most up-to-date information see the Parma Watchdog Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/pwl/}{\tt http://www.cs.unipr.it/pwl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/Watchdog/install-sh b/Watchdog/install-sh
index 0ae12c0..a5897de 100755
--- a/Watchdog/install-sh
+++ b/Watchdog/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2005-11-07.23
+scriptversion=2006-12-25.00
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -39,52 +39,68 @@ scriptversion=2005-11-07.23
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# 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-}"
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
 
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
+# 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_glob=
 posix_mkdir=
 
-# Symbolic mode for testing mkdir with directories.
-# It is the same as 755, but also tests that "u+" works.
-test_mode=u=rwx,g=rx,o=rx,u+wx
-
 # Desired mode of installed file.
 mode=0755
 
-# Desired mode of newly created intermediate directories.
-# It is empty if not known yet.
-intermediate_mode=
-
+chgrpcmd=
 chmodcmd=$chmodprog
 chowncmd=
-chgrpcmd=
-stripcmd=
+mvcmd=$mvprog
 rmcmd="$rmprog -f"
-mvcmd="$mvprog"
+stripcmd=
+
 src=
 dst=
 dir_arg=
-dstarg=
+dst_arg=
+
+copy_on_change=false
 no_target_directory=
 
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
    or: $0 [OPTION]... SRCFILES... DIRECTORY
    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
    or: $0 [OPTION]... -d DIRECTORIES...
@@ -94,81 +110,86 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
 In the 4th, create DIRECTORIES.
 
 Options:
--c         (ignored)
--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.
---help     display this help and exit.
---version  display version info and exit.
+     --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 CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
 "
 
-while test -n "$1"; do
+while test $# -ne 0; do
   case $1 in
-    -c) shift
-        continue;;
+    -c) ;;
+
+    -C) copy_on_change=true;;
 
-    -d) dir_arg=true
-        shift
-        continue;;
+    -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
+	shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-        shift
-        shift
-        continue;;
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
 
     -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
+	shift;;
 
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
+    -s) stripcmd=$stripprog;;
 
-    -t) dstarg=$2
-	shift
-	shift
-	continue;;
+    -t) dst_arg=$2
+	shift;;
 
-    -T) no_target_directory=true
-	shift
-	continue;;
+    -T) no_target_directory=true;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    *)  # When -d is used, all remaining arguments are directories to create.
-	# When -t is used, the destination is already specified.
-	test -n "$dir_arg$dstarg" && break
-        # Otherwise, the last argument is the destination.  Remove it from $@.
-	for arg
-	do
-          if test -n "$dstarg"; then
-	    # $@ is not empty: it contains at least $arg.
-	    set fnord "$@" "$dstarg"
-	    shift # fnord
-	  fi
-	  shift # arg
-	  dstarg=$arg
-	done
+    --)	shift
 	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
   esac
+  shift
 done
 
-if test -z "$1"; then
+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
+  done
+fi
+
+if test $# -eq 0; then
   if test -z "$dir_arg"; then
     echo "$0: no input file specified." >&2
     exit 1
@@ -178,13 +199,38 @@ if test -z "$1"; then
   exit 0
 fi
 
-test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 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 starting with `-'.
   case $src in
-    -*) src=./$src ;;
+    -*) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -202,22 +248,22 @@ do
       exit 1
     fi
 
-    if test -z "$dstarg"; then
+    if test -z "$dst_arg"; then
       echo "$0: no destination specified." >&2
       exit 1
     fi
 
-    dst=$dstarg
+    dst=$dst_arg
     # Protect names starting with `-'.
     case $dst in
-      -*) dst=./$dst ;;
+      -*) dst=./$dst;;
     esac
 
     # 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: $dstarg: Is a directory" >&2
+	echo "$0: $dst_arg: Is a directory" >&2
 	exit 1
       fi
       dstdir=$dst
@@ -230,14 +276,25 @@ do
 	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	     X"$dst" : 'X\(//\)[^/]' \| \
 	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| \
-	     .       : '\(.\)' 2>/dev/null ||
+	     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'
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
       `
 
       test -d "$dstdir"
@@ -250,83 +307,131 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	posix_mkdir=false
-	if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
-	  posix_mkdir=true
-	else
-	  # Remove any dirs left behind by ancient mkdir implementations.
-	  rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
-	fi ;;
-    esac
-
-    if
-      $posix_mkdir && {
+	# 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, create it using the same intermediate mode that
-	# mkdir -p would use when creating intermediate directories.
-	# POSIX says that this mode is "$(umask -S),u+wx", so use that
-	# if umask -S works.
-
+	# Otherwise, rely on $mkdir_umask.
 	if test -n "$dir_arg"; then
-	  mkdir_mode=$mode
+	  mkdir_mode=-m$mode
 	else
-	  case $intermediate_mode in
-	    '')
-	      if umask_S=`(umask -S) 2>/dev/null`; then
-		intermediate_mode=$umask_S,u+wx
-	      else
-		intermediate_mode=$test_mode
-	      fi ;;
-	  esac
-	  mkdir_mode=$intermediate_mode
+	  mkdir_mode=
 	fi
 
-	$mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
-      }
+	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
 
-      # 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.
+      # 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
-	/*) pathcomp=/ ;;
-	-*) pathcomp=./ ;;
-	*)  pathcomp= ;;
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
       esac
 
-      case $posix_glob in
-        '')
-	  if (set -f) 2>/dev/null; then
-	    posix_glob=true
-	  else
-	    posix_glob=false
-	  fi ;;
-      esac
+      eval "$initialize_posix_glob"
 
       oIFS=$IFS
       IFS=/
-      $posix_glob && set -f
+      $posix_glob set -f
       set fnord $dstdir
       shift
-      $posix_glob && set +f
+      $posix_glob set +f
       IFS=$oIFS
 
+      prefixes=
+
       for d
       do
-	test "x$d" = x && continue
+	test -z "$d" && continue
 
-	pathcomp=$pathcomp$d
-	if test ! -d "$pathcomp"; then
-	  $mkdirprog "$pathcomp"
-	  # Don't fail if two instances are running concurrently.
-	  test -d "$pathcomp" || exit 1
+	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
-	pathcomp=$pathcomp/
+	prefix=$prefix/
       done
-      obsolete_mkdir_used=true
+
+      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
 
@@ -334,7 +439,7 @@ do
     { 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
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
   else
 
     # Make a couple of temp file names in the proper directory.
@@ -345,7 +450,7 @@ do
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    $doit $cpprog "$src" "$dsttmp" &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
@@ -353,41 +458,54 @@ do
     # 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"; } &&
-
-    # Now 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.
-	   {
-	     if test -f "$dst"; then
-	       $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
-	       }
-	     else
-	       :
-	     fi
-	   } &&
-
-	   # Now rename the file to the real destination.
-	   $doit $mvcmd "$dsttmp" "$dst"
-	 }
-    } || exit 1
+    { 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
diff --git a/Watchdog/ltmain.sh b/Watchdog/ltmain.sh
index 06823e0..b36c4ad 100644
--- a/Watchdog/ltmain.sh
+++ b/Watchdog/ltmain.sh
@@ -1,30 +1,174 @@
-# ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun configure.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
+# Generated from ltmain.m4sh.
+
+# ltmain.sh (GNU libtool) 2.2.6
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool 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
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
 #
-# 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.
+#     --config             show all configuration variables
+#     --debug              enable verbose shell tracing
+# -n, --dry-run            display commands without modifying any files
+#     --features           display basic configuration information and exit
+#     --mode=MODE          use operation mode MODE
+#     --preserve-dup-deps  don't remove duplicate dependency libraries
+#     --quiet, --silent    don't print informational messages
+#     --tag=TAG            use configuration variables from tag TAG
+# -v, --verbose            print informational messages (default)
+#     --version            print version information
+# -h, --help               print short or long help message
+#
+# MODE must be one of the following:
+#
+#       clean              remove files from the build directory
+#       compile            compile a source file into a libtool object
+#       execute            automatically set library path, then run a program
+#       finish             complete the installation of libtool libraries
+#       install            install libraries or executables
+#       link               create a library or an executable
+#       uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#       host-triplet:	$host
+#       shell:		$SHELL
+#       compiler:		$LTCC
+#       compiler flags:		$LTCFLAGS
+#       linker:		$LD (gnu? $with_gnu_ld)
+#       $progname:		(GNU libtool) 2.2.6
+#       automake:		$automake_version
+#       autoconf:		$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=2.2.6
+TIMESTAMP=""
+package_revision=1.3012
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+
+$lt_unset CDPATH
+
+
+
+
+
+: ${CP="cp -f"}
+: ${ECHO="echo"}
+: ${EGREP="/usr/bin/grep -E"}
+: ${FGREP="/usr/bin/grep -F"}
+: ${GREP="/usr/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/opt/local/bin/gsed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
 
-basename="s,^.*/,,g"
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+# Generated shell functions inserted here.
 
 # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
 # is ksh but when the shell is invoked as "sh" and the current value of
@@ -34,112 +178,174 @@ basename="s,^.*/,,g"
 progpath="$0"
 
 # The name of this program:
-progname=`echo "$progpath" | $SED $basename`
-modename="$progname"
+# In the unlikely event $progname began with a '-', it would play havoc with
+# func_echo (imagine progname=-n), so we prepend ./ in that case:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+case $progname in
+  -*) progname=./$progname ;;
+esac
 
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
 
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=1.5.22
-TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname${mode+: }$mode: $*"
+}
 
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes.
-if test -n "${ZSH_VERSION+set}" ; then
-  setopt NO_GLOB_SUBST
-fi
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
 
-# Check that we have a working $echo.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell, and then maybe $echo will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
 
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
 
-default_mode=
-help="Try \`$progname --help' for more information."
-magic="%%%MAGIC variable%%%"
-mkdir="mkdir"
-mv="mv -f"
-rm="rm -f"
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  SP2NL='tr \040 \012'
-  NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  SP2NL='tr \100 \n'
-  NL2SP='tr \r\n \100\100'
-  ;;
-esac
+    # bash bug again:
+    :
+}
 
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-# We save the old values to restore during execute mode.
-if test "${LC_ALL+set}" = set; then
-  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
-fi
-if test "${LANG+set}" = set; then
-  save_LANG="$LANG"; LANG=C; export LANG
-fi
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
 
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
 
-if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-  $echo "$modename: not configured to build any kind of library" 1>&2
-  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-  exit $EXIT_FAILURE
-fi
 
-# Global variables.
-mode=$default_mode
-nonopt=
-prev=
-prevopt=
-run=
-show="$echo"
-show_help=
-execute_dlfiles=
-duplicate_deps=no
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
 
-#####################################
-# Shell function definitions:
-# This seems to be the best place for them
 
 # func_mktempdir [string]
 # Make a temporary directory that won't clash with other running
@@ -149,7 +355,7 @@ func_mktempdir ()
 {
     my_template="${TMPDIR-/tmp}/${1-$progname}"
 
-    if test "$run" = ":"; then
+    if test "$opt_dry_run" = ":"; then
       # Return a directory name, but don't create it in dry-run mode
       my_tmpdir="${my_template}-$$"
     else
@@ -158,546 +364,818 @@ func_mktempdir ()
       my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
 
       if test ! -d "$my_tmpdir"; then
-	# Failing that, at least try and use $RANDOM to avoid a race
-	my_tmpdir="${my_template}-${RANDOM-0}$$"
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
 
-	save_mktempdir_umask=`umask`
-	umask 0077
-	$mkdir "$my_tmpdir"
-	umask $save_mktempdir_umask
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || {
-        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
-	exit $EXIT_FAILURE
-      }
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
     fi
 
-    $echo "X$my_tmpdir" | $Xsed
+    $ECHO "X$my_tmpdir" | $Xsed
 }
 
 
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-func_win32_libid ()
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
 {
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
-      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 | \
-	$SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
     esac
-    ;;
-  esac
-  $echo $win32_libid_type
 }
 
 
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
 {
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-	case $arg in
-	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	CC_quoted="$CC_quoted $arg"
-      done
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "X$1" | $Xsed \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
       *)
-	for z in $available_tags; do
-	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	    # Double-quote args containing other shell metacharacters.
-	    case $arg in
-	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	      arg="\"$arg\""
-	      ;;
-	    esac
-	    CC_quoted="$CC_quoted $arg"
-	  done
-	    case "$@ " in
-	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  $echo "$modename: unable to infer tagged configuration"
-	  $echo "$modename: specify a tag with \`--tag'" 1>&2
-	  exit $EXIT_FAILURE
-#        else
-#          $echo "$modename: using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
 }
 
 
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
 {
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
 
-    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
-    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
-      exit $EXIT_FAILURE
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
     fi
 }
 
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
 {
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-    my_status=""
-
-    $show "${rm}r $my_gentop"
-    $run ${rm}r "$my_gentop"
-    $show "$mkdir $my_gentop"
-    $run $mkdir "$my_gentop"
-    my_status=$?
-    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
-      exit $my_status
-    fi
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
 
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
-      my_xdir="$my_gentop/$my_xlib"
-
-      $show "${rm}r $my_xdir"
-      $run ${rm}r "$my_xdir"
-      $show "$mkdir $my_xdir"
-      $run $mkdir "$my_xdir"
-      exit_status=$?
-      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
-	exit $exit_status
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
       fi
-      case $host in
-      *-darwin*)
-	$show "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	if test -z "$run"; then
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
-	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
-	  if test -n "$darwin_arches"; then 
-	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      lipo -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    ${rm}r unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd "$darwin_orig_dir"
- 	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	fi # $run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-        ;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-    func_extract_archives_result="$my_oldobjs"
+    fi
 }
-# End of Shell function definitions
-#####################################
 
-# Darwin sucks
-eval std_shrext=\"$shrext_cmds\"
 
-disable_libs=no
 
-# Parse our command line options once, thoroughly.
-while test "$#" -gt 0
-do
-  arg="$1"
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $SED -n '/^# Usage:/,/# -h/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    $ECHO
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+     }' < "$progpath"
+    exit $?
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    func_error "missing argument for $1"
+    exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+# Check that we have a working $ECHO.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
   shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell, and then maybe $ECHO will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
 
-  case $arg in
-  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
 
-  # If the previous option needs an argument, assign it.
-  if test -n "$prev"; then
-    case $prev in
-    execute_dlfiles)
-      execute_dlfiles="$execute_dlfiles $arg"
-      ;;
-    tag)
-      tagname="$arg"
-      preserve_args="${preserve_args}=$arg"
-
-      # Check whether tagname contains only valid characters
-      case $tagname in
-      *[!-_A-Za-z0-9,/]*)
-	$echo "$progname: invalid tag name: $tagname" 1>&2
-	exit $EXIT_FAILURE
-	;;
-      esac
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
 
-      case $tagname in
-      CC)
-	# Don't test for the "default" C tag, as we know, it's there, but
-	# not specially marked.
-	;;
-      *)
-	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
-	  taglist="$taglist $tagname"
-	  # Evaluate the configuration.
-	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
-	else
-	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
-	fi
-	;;
-      esac
-      ;;
-    *)
-      eval "$prev=\$arg"
-      ;;
-    esac
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
 
-    prev=
-    prevopt=
-    continue
-  fi
+opt_dry_run=false
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
 
-  # Have we seen a non-optional argument yet?
-  case $arg in
-  --help)
-    show_help=yes
-    ;;
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
 
-  --version)
-    $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
-    $echo
-    $echo "Copyright (C) 2005  Free Software Foundation, Inc."
-    $echo "This is free software; see the source for copying conditions.  There is NO"
-    $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-    exit $?
-    ;;
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
 
-  --config)
-    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
     # Now print the configurations for the tags.
     for tagname in $taglist; do
-      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
     done
-    exit $?
-    ;;
-
-  --debug)
-    $echo "$progname: enabling shell trace mode"
-    set -x
-    preserve_args="$preserve_args $arg"
-    ;;
 
-  --dry-run | -n)
-    run=:
-    ;;
+    exit $?
+}
 
-  --features)
-    $echo "host: $host"
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    $ECHO "host: $host"
     if test "$build_libtool_libs" = yes; then
-      $echo "enable shared libraries"
+      $ECHO "enable shared libraries"
     else
-      $echo "disable shared libraries"
+      $ECHO "disable shared libraries"
     fi
     if test "$build_old_libs" = yes; then
-      $echo "enable static libraries"
+      $ECHO "enable static libraries"
     else
-      $echo "disable static libraries"
+      $ECHO "disable static libraries"
     fi
+
     exit $?
-    ;;
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
 
-  --finish) mode="finish" ;;
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
 
-  --mode) prevopt="--mode" prev=mode ;;
-  --mode=*) mode="$optarg" ;;
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
 
-  --preserve-dup-deps) duplicate_deps="yes" ;;
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
 
-  --quiet | --silent)
-    show=:
-    preserve_args="$preserve_args $arg"
-    ;;
+# Parse options once, thoroughly.  This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
 
-  --tag)
-    prevopt="--tag"
-    prev=tag
-    preserve_args="$preserve_args --tag"
+  # Shorthand for --mode=foo, only valid as the first argument
+  case $1 in
+  clean|clea|cle|cl)
+    shift; set dummy --mode clean ${1+"$@"}; shift
     ;;
-  --tag=*)
-    set tag "$optarg" ${1+"$@"}
-    shift
-    prev=tag
-    preserve_args="$preserve_args --tag"
+  compile|compil|compi|comp|com|co|c)
+    shift; set dummy --mode compile ${1+"$@"}; shift
     ;;
-
-  -dlopen)
-    prevopt="-dlopen"
-    prev=execute_dlfiles
+  execute|execut|execu|exec|exe|ex|e)
+    shift; set dummy --mode execute ${1+"$@"}; shift
     ;;
-
-  -*)
-    $echo "$modename: unrecognized option \`$arg'" 1>&2
-    $echo "$help" 1>&2
-    exit $EXIT_FAILURE
+  finish|finis|fini|fin|fi|f)
+    shift; set dummy --mode finish ${1+"$@"}; shift
     ;;
-
-  *)
-    nonopt="$arg"
-    break
+  install|instal|insta|inst|ins|in|i)
+    shift; set dummy --mode install ${1+"$@"}; shift
+    ;;
+  link|lin|li|l)
+    shift; set dummy --mode link ${1+"$@"}; shift
+    ;;
+  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+    shift; set dummy --mode uninstall ${1+"$@"}; shift
     ;;
   esac
-done
 
-if test -n "$prevopt"; then
-  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
-  $echo "$help" 1>&2
-  exit $EXIT_FAILURE
-fi
+  # Parse non-mode specific arguments:
+  while test "$#" -gt 0; do
+    opt="$1"
+    shift
 
-case $disable_libs in
-no) 
-  ;;
-shared)
-  build_libtool_libs=no
-  build_old_libs=yes
-  ;;
-static)
-  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-  ;;
-esac
+    case $opt in
+      --config)		func_config					;;
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
+      --debug)		preserve_args="$preserve_args $opt"
+			func_echo "enabling shell trace mode"
+			opt_debug='set -x'
+			$opt_debug
+			;;
 
-if test -z "$show_help"; then
+      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			execute_dlfiles="$execute_dlfiles $1"
+			shift
+			;;
 
-  # Infer the operation mode.
-  if test -z "$mode"; then
-    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
-    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
-    case $nonopt in
-    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
-      mode=link
-      for arg
-      do
-	case $arg in
-	-c)
-	   mode=compile
-	   break
-	   ;;
-	esac
-      done
-      ;;
-    *db | *dbx | *strace | *truss)
-      mode=execute
-      ;;
-    *install*|cp|mv)
-      mode=install
-      ;;
-    *rm)
-      mode=uninstall
+      --dry-run | -n)	opt_dry_run=:					;;
+      --features)       func_features					;;
+      --finish)		mode="finish"					;;
+
+      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			case $1 in
+			  # Valid mode arguments:
+			  clean)	;;
+			  compile)	;;
+			  execute)	;;
+			  finish)	;;
+			  install)	;;
+			  link)		;;
+			  relink)	;;
+			  uninstall)	;;
+
+			  # Catch anything else as an error
+			  *) func_error "invalid argument for $opt"
+			     exit_cmd=exit
+			     break
+			     ;;
+		        esac
+
+			mode="$1"
+			shift
+			;;
+
+      --preserve-dup-deps)
+			opt_duplicate_deps=:				;;
+
+      --quiet|--silent)	preserve_args="$preserve_args $opt"
+			opt_silent=:
+			;;
+
+      --verbose| -v)	preserve_args="$preserve_args $opt"
+			opt_silent=false
+			;;
+
+      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			preserve_args="$preserve_args $opt $1"
+			func_enable_tag "$1"	# tagname is set here
+			shift
+			;;
+
+      # Separate optargs to long options:
+      -dlopen=*|--mode=*|--tag=*)
+			func_opt_split "$opt"
+			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+			shift
+			;;
+
+      -\?|-h)		func_usage					;;
+      --help)		opt_help=:					;;
+      --version)	func_version					;;
+
+      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
+
+      *)		nonopt="$opt"
+			break
+			;;
+    esac
+  done
+
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
       ;;
     *)
-      # If we have no mode, but dlfiles were specified, then do execute mode.
-      test -n "$execute_dlfiles" && mode=execute
+      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      ;;
+  esac
 
-      # Just use the default operation mode.
-      if test -z "$mode"; then
-	if test -n "$nonopt"; then
-	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
-	else
-	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
-	fi
+  # Having warned about all mis-specified options, bail out if
+  # anything was wrong.
+  $exit_cmd $EXIT_FAILURE
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
       fi
-      ;;
-    esac
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+$opt_help || {
+  # Sanity checks first:
+  func_check_version_match
+
+  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+    func_fatal_configuration "not configured to build any kind of library"
   fi
 
+  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+  # Darwin sucks
+  eval std_shrext=\"$shrext_cmds\"
+
+
   # Only execute mode is allowed to have -dlopen flags.
   if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
-    $echo "$help" 1>&2
+    func_error "unrecognized option \`-dlopen'"
+    $ECHO "$help" 1>&2
     exit $EXIT_FAILURE
   fi
 
   # Change the help message to a mode-specific one.
   generic_help="$help"
-  help="Try \`$modename --help --mode=$mode' for more information."
+  help="Try \`$progname --help --mode=$mode' for more information."
+}
 
-  # These modes are in order of execution frequency so that they run quickly.
-  case $mode in
-  # libtool compile mode
-  compile)
-    modename="$modename: compile"
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
 
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
 
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
 
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  if test -n "$libobj" ; then
-	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  arg_mode=target
-	  continue
-	  ;;
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
 
-	-static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
 
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_ltwrapper_scriptname_result=""
+    if func_ltwrapper_executable_p "$1"; then
+	func_dirname_and_basename "$1" "" "."
+	func_stripname '' '.exe' "$func_basename_result"
+	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    fi
+}
 
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
 
-	-Wc,*)
-	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
- 	  for arg in $args; do
-	    IFS="$save_ifs"
 
-	    # Double-quote args containing other shell metacharacters.
-	    # Many Bourne shells cannot handle close brackets correctly
-	    # in scan sets, so we specify it separately.
-	    case $arg in
-	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	      arg="\"$arg\""
-	      ;;
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+        func_quote_for_eval "$arg"
+	CC_quoted="$CC_quoted $func_quote_for_eval_result"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_quote_for_eval "$arg"
+	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
+	    done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
 	    esac
-	    lastarg="$lastarg $arg"
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag="$pie_flag $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_quote_for_eval "$arg"
+	    lastarg="$lastarg $func_quote_for_eval_result"
 	  done
 	  IFS="$save_ifs"
-	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
 
 	  # Add the arguments to base_compile.
 	  base_compile="$base_compile $lastarg"
 	  continue
 	  ;;
 
-	* )
+	*)
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
@@ -709,64 +1187,42 @@ if test -z "$show_help"; then
       esac    #  case $arg_mode
 
       # Aesthetically quote the previous argument.
-      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
-
-      case $lastarg in
-      # Double-quote args containing other shell metacharacters.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, and some SunOS ksh mistreat backslash-escaping
-      # in scan sets (worked around with variable expansion),
-      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
-      # at all, so we specify them separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	lastarg="\"$lastarg\""
-	;;
-      esac
-
-      base_compile="$base_compile $lastarg"
+      func_quote_for_eval "$lastarg"
+      base_compile="$base_compile $func_quote_for_eval_result"
     done # for arg
 
     case $arg_mode in
     arg)
-      $echo "$modename: you must specify an argument for -Xcompile"
-      exit $EXIT_FAILURE
+      func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      $echo "$modename: you must specify a target with \`-o'" 1>&2
-      exit $EXIT_FAILURE
+      func_fatal_error "you must specify a target with \`-o'"
       ;;
     *)
       # Get the name of the library object.
-      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
       ;;
     esac
 
     # Recognize several different file suffixes.
     # If the user specifies -o file.o, it is replaced with file.lo
-    xform='[cCFSifmso]'
     case $libobj in
-    *.ada) xform=ada ;;
-    *.adb) xform=adb ;;
-    *.ads) xform=ads ;;
-    *.asm) xform=asm ;;
-    *.c++) xform=c++ ;;
-    *.cc) xform=cc ;;
-    *.ii) xform=ii ;;
-    *.class) xform=class ;;
-    *.cpp) xform=cpp ;;
-    *.cxx) xform=cxx ;;
-    *.f90) xform=f90 ;;
-    *.for) xform=for ;;
-    *.java) xform=java ;;
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
     esac
 
-    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
-
     case $libobj in
-    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
-      exit $EXIT_FAILURE
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
       ;;
     esac
 
@@ -774,7 +1230,15 @@ if test -z "$show_help"; then
 
     for arg in $later; do
       case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
       -static)
+	build_libtool_libs=no
 	build_old_libs=yes
 	continue
 	;;
@@ -791,28 +1255,17 @@ if test -z "$show_help"; then
       esac
     done
 
-    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
-    case $qlibobj in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	qlibobj="\"$qlibobj\"" ;;
-    esac
-    test "X$libobj" != "X$qlibobj" \
-	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
-	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
-    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
-    if test "X$xdir" = "X$obj"; then
-      xdir=
-    else
-      xdir=$xdir/
-    fi
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
     lobj=${xdir}$objdir/$objname
 
-    if test -z "$base_compile"; then
-      $echo "$modename: you must specify a compilation command" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
     if test "$build_old_libs" = yes; then
@@ -821,12 +1274,9 @@ if test -z "$show_help"; then
       removelist="$lobj $libobj ${libobj}T"
     fi
 
-    $run $rm $removelist
-    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
-
     # On Cygwin there's no "real" PIC flag so we must build both object types
     case $host_os in
-    cygwin* | mingw* | pw32* | os2*)
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
       pic_mode=default
       ;;
     esac
@@ -838,10 +1288,8 @@ if test -z "$show_help"; then
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
     if test "$compiler_c_o" = no; then
-      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
       lockfile="$output_obj.lock"
-      removelist="$removelist $output_obj $lockfile"
-      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
     else
       output_obj=
       need_locks=no
@@ -851,13 +1299,13 @@ if test -z "$show_help"; then
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
     if test "$need_locks" = yes; then
-      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
-	$show "Waiting for $lockfile to be removed"
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
     elif test "$need_locks" = warn; then
       if test -f "$lockfile"; then
-	$echo "\
+	$ECHO "\
 *** ERROR, $lockfile exists and contains:
 `cat $lockfile 2>/dev/null`
 
@@ -868,34 +1316,22 @@ repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
-	$run $rm $removelist
+	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
-      $echo "$srcfile" > "$lockfile"
+      removelist="$removelist $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
     fi
 
+    $opt_dry_run || $RM $removelist
+    removelist="$removelist $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
     if test -n "$fix_srcfile_path"; then
       eval srcfile=\"$fix_srcfile_path\"
     fi
-    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
-    case $qsrcfile in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-      qsrcfile="\"$qsrcfile\"" ;;
-    esac
-
-    $run $rm "$libobj" "${libobj}T"
-
-    # Create a libtool object file (analogous to a ".la" file),
-    # but don't create it if we're doing a dry run.
-    test -z "$run" && cat > ${libobj}T <<EOF
-# $libobj - a libtool object file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-EOF
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
     if test "$build_libtool_libs" = yes; then
@@ -909,32 +1345,19 @@ EOF
 	command="$base_compile $qsrcfile"
       fi
 
-      if test ! -d "${xdir}$objdir"; then
-	$show "$mkdir ${xdir}$objdir"
-	$run $mkdir ${xdir}$objdir
-	exit_status=$?
-	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
-	  exit $exit_status
-	fi
-      fi
+      func_mkdir_p "$xdir$objdir"
 
       if test -z "$output_obj"; then
 	# Place PIC objects in $objdir
 	command="$command -o $lobj"
       fi
 
-      $run $rm "$lobj" "$output_obj"
-
-      $show "$command"
-      if $run eval "$command"; then :
-      else
-	test -n "$output_obj" && $run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
       if test "$need_locks" = warn &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$echo "\
+	$ECHO "\
 *** ERROR, $lockfile contains:
 `cat $lockfile 2>/dev/null`
 
@@ -948,45 +1371,27 @@ repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
-	$run $rm $removelist
+	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
 
       # Just move the object if needed, then go on to compile the next one
       if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	$show "$mv $output_obj $lobj"
-	if $run $mv $output_obj $lobj; then :
-	else
-	  error=$?
-	  $run $rm $removelist
-	  exit $error
-	fi
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
       fi
 
-      # Append the name of the PIC object to the libtool object file.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-pic_object='$objdir/$objname'
-
-EOF
-
       # Allow error messages only from the first compilation.
       if test "$suppress_opt" = yes; then
-        suppress_output=' >/dev/null 2>&1'
+	suppress_output=' >/dev/null 2>&1'
       fi
-    else
-      # No PIC object so indicate it doesn't exist in the libtool
-      # object file.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-pic_object=none
-
-EOF
     fi
 
     # Only build a position-dependent object if we build old libraries.
     if test "$build_old_libs" = yes; then
       if test "$pic_mode" != yes; then
 	# Don't build PIC code
-	command="$base_compile $qsrcfile"
+	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
@@ -996,17 +1401,12 @@ EOF
 
       # Suppress compiler output if we already did a PIC compilation.
       command="$command$suppress_output"
-      $run $rm "$obj" "$output_obj"
-      $show "$command"
-      if $run eval "$command"; then :
-      else
-	$run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
       if test "$need_locks" = warn &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$echo "\
+	$ECHO "\
 *** ERROR, $lockfile contains:
 `cat $lockfile 2>/dev/null`
 
@@ -1020,5423 +1420,6777 @@ repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
-	$run $rm $removelist
+	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
 
       # Just move the object if needed
       if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	$show "$mv $output_obj $obj"
-	if $run $mv $output_obj $obj; then :
-	else
-	  error=$?
-	  $run $rm $removelist
-	  exit $error
-	fi
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
       fi
-
-      # Append the name of the non-PIC object the libtool object file.
-      # Only append if the libtool object file exists.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-# Name of the non-PIC object.
-non_pic_object='$objname'
-
-EOF
-    else
-      # Append the name of the non-PIC object the libtool object file.
-      # Only append if the libtool object file exists.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-# Name of the non-PIC object.
-non_pic_object=none
-
-EOF
     fi
 
-    $run $mv "${libobj}T" "${libobj}"
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
-    # Unlock the critical section if it was locked
-    if test "$need_locks" != no; then
-      $run $rm "$lockfile"
-    fi
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
 
     exit $EXIT_SUCCESS
-    ;;
-
-  # libtool link mode
-  link | relink)
-    modename="$modename: link"
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
+}
 
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args="$nonopt"
-    base_compile="$nonopt $@"
-    compile_command="$nonopt"
-    finalize_command="$nonopt"
+$opt_help || {
+test "$mode" = compile && func_mode_compile ${1+"$@"}
+}
 
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
 
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    notinst_path= # paths that contain not-installed libtool libraries
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
 
-    func_infer_tag $base_compile
+Remove files from the build directory.
 
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -all-static | -static)
-	if test "X$arg" = "X-all-static"; then
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	else
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	fi
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
 
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
 
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
-	;;
-      *) qarg=$arg ;;
-      esac
-      libtool_args="$libtool_args $qarg"
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
 
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  compile_command="$compile_command @OUTPUT@"
-	  finalize_command="$finalize_command @OUTPUT@"
-	  ;;
-	esac
+Compile a source file into a libtool library object.
 
-	case $prev in
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    compile_command="$compile_command @SYMFILE@"
-	    finalize_command="$finalize_command @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  if test ! -f "$arg"; then
-	    $echo "$modename: symbol file \`$arg' does not exist"
-	    exit $EXIT_FAILURE
-	  fi
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat $save_arg`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
+This mode accepts the following additional options:
 
-	      # Check to see that this really is a libtool object.
-	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-		pic_object=
-		non_pic_object=
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
 
-		# Read the .lo file
-		# If there is no directory component, then add one.
-		case $arg in
-		*/* | *\\*) . $arg ;;
-		*) . ./$arg ;;
-		esac
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
 
-		if test -z "$pic_object" || \
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none && \
-		   test "$non_pic_object" = none; then
-		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
-		  exit $EXIT_FAILURE
-		fi
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
 
-		# Extract subdirectory from the argument.
-		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-		if test "X$xdir" = "X$arg"; then
-		  xdir=
-		else
-		  xdir="$xdir/"
-		fi
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
 
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
+Automatically set library path, then run a program.
 
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
+This mode accepts the following additional options:
 
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
+  -dlopen FILE      add the directory containing FILE to the library path
 
-		  # A PIC object.
-		  libobjs="$libobjs $pic_object"
-		  arg="$pic_object"
-		fi
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
 
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
 
-		  # A standard non-PIC object
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if test -z "$run"; then
-		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
-		  exit $EXIT_FAILURE
-		else
-		  # Dry-run case.
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
 
-		  # Extract subdirectory from the argument.
-		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-		  if test "X$xdir" = "X$arg"; then
-		    xdir=
-		  else
-		    xdir="$xdir/"
-		  fi
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
 
-		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
-		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
-		  libobjs="$libobjs $pic_object"
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		fi
-	      fi
-	    done
-	  else
-	    $echo "$modename: link input file \`$save_arg' does not exist"
-	    exit $EXIT_FAILURE
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    $echo "$modename: only absolute run-paths are allowed" 1>&2
-	    exit $EXIT_FAILURE
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  compile_command="$compile_command $qarg"
-	  finalize_command="$finalize_command $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  compile_command="$compile_command $wl$qarg"
-	  finalize_command="$finalize_command $wl$qarg"
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  compile_command="$compile_command $qarg"
-	  finalize_command="$finalize_command $qarg"
-	  continue
-	  ;;
-	shrext)
-  	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	darwin_framework|darwin_framework_skip)
-	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
-	  compile_command="$compile_command $arg"
-	  finalize_command="$finalize_command $arg"
-	  prev=
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
+Complete the installation of libtool libraries.
 
-      prevarg="$arg"
+Each LIBDIR is a directory that contains libtool libraries.
 
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  compile_command="$compile_command $link_static_flag"
-	  finalize_command="$finalize_command $link_static_flag"
-	fi
-	continue
-	;;
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
 
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
-	continue
-	;;
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
 
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
+Install executables or libraries.
 
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
 
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
+The following components of INSTALL-COMMAND are treated specially:
 
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
+  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
 
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  $echo "$modename: more than one -exported-symbols argument is not allowed"
-	  exit $EXIT_FAILURE
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
 
-      -framework|-arch|-isysroot)
-	case " $CC " in
-	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
-		prev=darwin_framework_skip ;;
-	  *) compiler_flags="$compiler_flags $arg"
-	     prev=darwin_framework ;;
-	esac
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-	continue
-	;;
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
 
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
+Link object files or libraries together to form another library, or to
+create an executable program.
 
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  compile_command="$compile_command $arg"
-	  finalize_command="$finalize_command $arg"
-	  ;;
-	esac
-	continue
-	;;
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
 
-      -L*)
-	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  if test -z "$absdir"; then
-	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
-	    absdir="$dir"
-	    notinst_path="$notinst_path $dir"
-	  fi
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
+The following components of LINK-COMMAND are treated specially:
 
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs -framework System"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
 
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      -model)
-	compile_command="$compile_command $arg"
-	compiler_flags="$compiler_flags $arg"
-	finalize_command="$finalize_command $arg"
-	prev=xcompiler
-	continue
-	;;
+All other options (arguments beginning with \`-') are ignored.
 
-     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
-	compiler_flags="$compiler_flags $arg"
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-	continue
-	;;
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
 
-      -module)
-	module=yes
-	continue
-	;;
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
 
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m* pass through architecture-specific compiler args for GCC
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -pg pass through profiling flag for GCC
-      # @file GCC response files
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
-      -t[45]*|-txscale*|@*)
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
 
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-        compile_command="$compile_command $arg"
-        finalize_command="$finalize_command $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
         ;;
 
-      -shrext)
-	prev=shrext
-	continue
-	;;
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
 
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
+Remove libraries from an installation directory.
 
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # in order for the loader to find any dlls it needs.
-	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
-	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
 
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
 
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
+      *)
+        func_fatal_help "invalid operation mode \`$mode'"
+        ;;
+    esac
 
-      -o) prev=output ;;
+    $ECHO
+    $ECHO "Try \`$progname --help' for more information about other modes."
 
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
+    exit $?
+}
 
-      -release)
-	prev=release
-	continue
-	;;
+  # Now that we've collected a possible --mode arg, show help if necessary
+  $opt_help && func_mode_help
 
-      -rpath)
-	prev=rpath
-	continue
-	;;
 
-      -R)
-	prev=xrpath
-	continue
-	;;
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
 
-      -R*)
-	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  $echo "$modename: only absolute run-paths are allowed" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -static)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
 
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
 
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
 
-      -Wc,*)
-	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-	  case $flag in
-	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	    flag="\"$flag\""
-	    ;;
-	  esac
-	  arg="$arg $wl$flag"
-	  compiler_flags="$compiler_flags $flag"
-	done
-	IFS="$save_ifs"
-	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
-	;;
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
 
-      -Wl,*)
-	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-	  case $flag in
-	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	    flag="\"$flag\""
-	    ;;
-	  esac
-	  arg="$arg $wl$flag"
-	  compiler_flags="$compiler_flags $wl$flag"
-	  linker_flags="$linker_flags $flag"
-	done
-	IFS="$save_ifs"
-	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
-	;;
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
 
-      -Xcompiler)
-	prev=xcompiler
-	continue
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
 	;;
 
-      -Xlinker)
-	prev=xlinker
-	continue
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
 	;;
 
-      -XCClinker)
-	prev=xcclinker
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
+      esac
 
-      # Some other compiler flag.
-      -* | +*)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
 
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
 
-      *.lo)
-	# A libtool-controlled object.
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
 
-	# Check to see that this really is a libtool object.
-	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  pic_object=
-	  non_pic_object=
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_quote_for_eval "$file"
+      args="$args $func_quote_for_eval_result"
+    done
 
-	  # Read the .lo file
-	  # If there is no directory component, then add one.
-	  case $arg in
-	  */* | *\\*) . $arg ;;
-	  *) . ./$arg ;;
-	  esac
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
 
-	  if test -z "$pic_object" || \
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none && \
-	     test "$non_pic_object" = none; then
-	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
 
-	  # Extract subdirectory from the argument.
-	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	  if test "X$xdir" = "X$arg"; then
-	    xdir=
- 	  else
-	    xdir="$xdir/"
-	  fi
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	$ECHO "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
 
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
+test "$mode" = execute && func_mode_execute ${1+"$@"}
 
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
 
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libdirs="$nonopt"
+    admincmds=
 
-	    # A PIC object.
-	    libobjs="$libobjs $pic_object"
-	    arg="$pic_object"
-	  fi
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
 
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
 
-	    # A standard non-PIC object
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if test -z "$run"; then
-	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
-	    exit $EXIT_FAILURE
-	  else
-	    # Dry-run case.
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
 
-	    # Extract subdirectory from the argument.
-	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	    if test "X$xdir" = "X$arg"; then
-	      xdir=
-	    else
-	      xdir="$xdir/"
-	    fi
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    $ECHO "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $ECHO "   $libdir"
+    done
+    $ECHO
+    $ECHO "If you ever happen to want to link against installed libraries"
+    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
+    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $ECHO "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $ECHO "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $ECHO "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
 
-	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
-	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
-	    libobjs="$libobjs $pic_object"
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	  fi
-	fi
-	;;
+      $ECHO "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $ECHO "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $ECHO
 
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
+    $ECHO "See any operating system documentation about shared libraries for"
+    case $host in
+      solaris2.[6789]|solaris2.1[0-9])
+        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	$ECHO "pages."
 	;;
+      *)
+        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
+        ;;
+    esac
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+}
 
-      *.la)
-	# A libtool-controlled library.
+test "$mode" = finish && func_mode_finish ${1+"$@"}
 
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
 
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
-      esac # arg
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
 
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog="$install_prog$func_quote_for_eval_result"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
       fi
-    done # argument parsing loop
 
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      compile_command="$compile_command $arg"
-      finalize_command="$finalize_command $arg"
-    fi
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog="$install_prog $func_quote_for_eval_result"
+    done
 
-    oldlibs=
-    # calculate the name of the file, without its directory
-    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
-    libobjs_save="$libobjs"
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
 
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
 
-    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-    if test "X$output_objdir" = "X$output"; then
-      output_objdir="$objdir"
-    else
-      output_objdir="$output_objdir/$objdir"
-    fi
-    # Create the object directory.
-    if test ! -d "$output_objdir"; then
-      $show "$mkdir $output_objdir"
-      $run $mkdir $output_objdir
-      exit_status=$?
-      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
-	exit $exit_status
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
       fi
     fi
 
-    # Determine the type of output
-    case $output in
-    "")
-      $echo "$modename: you must specify an output file" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
 
-    case $host in
-    *cygwin* | *mingw* | *pw32*)
-      # don't eliminate duplications in $postdeps and $predeps
-      duplicate_compiler_generated_deps=yes
-      ;;
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
     *)
-      duplicate_compiler_generated_deps=$duplicate_deps
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
       ;;
     esac
-    specialdeplibs=
 
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if test "X$duplicate_deps" = "Xyes" ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
 
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
 
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
 	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
 
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    case $linkmode in
-    lib)
-	passes="conv link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
-	    exit $EXIT_FAILURE
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
 	    ;;
 	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-    for pass in $passes; do
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
 	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
-	    continue
-	  fi
-	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
-	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
 	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if (${SED} -e '2q' $lib |
-                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-		  library_names=
-		  old_library=
-		  case $lib in
-		  */* | *\\*) . $lib ;;
-		  *) . ./$lib ;;
-		  esac
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
-		    test "X$ladir" = "X$lib" && ladir="."
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-	        ;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-	    ;;
-	  *)
-	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    valid_a_lib=no
-	    case $deplibs_check_method in
-	      match_pattern*)
-		set dummy $deplibs_check_method
-	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-		if eval $echo \"$deplib\" 2>/dev/null \
-		    | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		  valid_a_lib=yes
-		fi
-		;;
-	      pass_all)
-		valid_a_lib=yes
-		;;
-            esac
-	    if test "$valid_a_lib" != yes; then
-	      $echo
-	      $echo "*** Warning: Trying to link with static lib archive $deplib."
-	      $echo "*** I have the capability to make that library automatically link in when"
-	      $echo "*** you link to this library.  But I can only do this if you have a"
-	      $echo "*** shared version of the library, which you do not appear to have"
-	      $echo "*** because the file extensions .$libext of this argument makes me believe"
-	      $echo "*** that it is just a static archive that I should not used here."
-	    else
-	      $echo
-	      $echo "*** Warning: Linking the shared library $output against the"
-	      $echo "*** static library $deplib is not portable!"
-	      deplibs="$deplib $deplibs"
-	    fi
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
 	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
 
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-	  exit $EXIT_FAILURE
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
-	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$ladir" = "X$lib" && ladir="."
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
 
+      *.lo)
+	# Install (i.e. copy) a libtool object.
 
-	# Read the .la file
-	case $lib in
-	*/* | *\\*) . $lib ;;
-	*) . ./$lib ;;
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
 	esac
 
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
 	fi
+	exit $EXIT_SUCCESS
+	;;
 
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
-	      exit $EXIT_FAILURE
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
 	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	    tmp_libs=
-	    for deplib in $dependency_libs; do
-	      deplibs="$deplib $deplibs"
-              if test "X$duplicate_deps" = "Xyes" ; then
-	        case "$tmp_libs " in
-	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	        esac
-              fi
-	      tmp_libs="$tmp_libs $deplib"
-	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  continue
-	fi # $pass = conv
+	    ;;
+	esac
 
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
 
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+	  func_source "$wrapper"
 
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
 	  else
-	    newdlfiles="$newdlfiles $lib"
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
 	  fi
-	  continue
-	fi # $pass = dlopen
+	fi
 
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
-	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-	    abs_ladir="$ladir"
-	  fi
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
 	  ;;
 	esac
-	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
 
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
 
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir"; then
-	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
 
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
 
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
 
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
 
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
 
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if test "X$duplicate_deps" = "Xyes" ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
 
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath " in
-	      *" $dir "*) ;;
-	      *" $absdir "*) ;;
-	      *) temp_rpath="$temp_rpath $absdir" ;;
-	      esac
-	    fi
+test "$mode" = install && func_mode_install ${1+"$@"}
 
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
 
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
 
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes ; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  if test "$installed" = no; then
-	    notinst_deplibs="$notinst_deplibs $lib"
-	    need_relink=yes
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_verbose "extracting global C symbols from \`$progfile'"
+	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
 	  fi
-	  # This is a shared library
 
-	  # Warn about portability, can't link against -module's on
-	  # some systems (darwin)
-	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
-	    $echo
-	    if test "$linkmode" = prog; then
-	      $echo "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $echo "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $echo "*** $linklib is not portable!"
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
 	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
 	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
 	      esac
-	      ;;
-	    esac
+	    }
 	  fi
+	fi
 
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    realname="$2"
-	    shift; shift
-	    libname=`eval \\$echo \"$libname_spec\"`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw*)
-		major=`expr $current - $age`
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
-	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      $show "extracting exported symbol list from \`$soname'"
-	      save_ifs="$IFS"; IFS='~'
-	      cmds=$extract_expsyms_cmds
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd" || exit $?
-	      done
-	      IFS="$save_ifs"
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      $show "generating import library for \`$soname'"
-	      save_ifs="$IFS"; IFS='~'
-	      cmds=$old_archive_from_expsyms_cmds
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd" || exit $?
-	      done
-	      IFS="$save_ifs"
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a module then we can not link against
-		    # it, someone is ignoring the new warnings I added
-		    if /usr/bin/file -L $add 2> /dev/null |
-                      $EGREP ": [^:]* bundle" >/dev/null ; then
-		      $echo "** Warning, lib $linklib is a module, not a shared library"
-		      if test -z "$old_library" ; then
-		        $echo
-		        $echo "** And there doesn't seem to be a static archive available"
-		        $echo "** The link will probably fail, sorry"
-		      else
-		        add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+	  $opt_dry_run || {
+	    eval '$ECHO ": $name " >> "$nlist"'
+	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	  }
+	done
 
-	    if test "$lib_linked" != yes; then
-	      $echo "$modename: configuration error: unsupported hardcode properties"
-	      exit $EXIT_FAILURE
-	    fi
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
 
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes && \
-		 test "$hardcode_minus_L" != yes && \
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
 	  fi
 
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-	        add="$inst_prefix_dir$libdir/$linklib"
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
 	      else
-	        add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
 	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
 	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
 
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    $echo
-	    $echo "*** Warning: This system can not link to static lib archive $lib."
-	    $echo "*** I have the capability to make that library automatically link in when"
-	    $echo "*** you link to this library.  But I can only do this if you have a"
-	    $echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      $echo "*** But as you try to build a module library, libtool will still create "
-	      $echo "*** a static module, that should work as long as the dlopening application"
-	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		$echo
-		$echo "*** However, this would only work if libtool was able to extract symbol"
-		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		$echo "*** not find such a program.  So, this module is probably useless."
-		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
 	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
+	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
-	fi # link shared/static library?
 
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
 
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if test "X$duplicate_deps" = "Xyes" ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+"
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* )
+	    $ECHO >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs.  */"
+	    lt_dlsym_const= ;;
+	  *osf5*)
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+	    lt_dlsym_const= ;;
+	  *)
+	    lt_dlsym_const=const ;;
+	  esac
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+extern $lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+$lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
 	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags="$symtab_cflags $arg" ;;
+	  esac
+	done
 
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
-		test "X$dir" = "X$deplib" && dir="."
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if grep "^installed=no" $deplib > /dev/null; then
-		  path="$absdir/$objdir"
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  if test -z "$libdir"; then
-		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
-		    exit $EXIT_FAILURE
-		  fi
-		  if test "$absdir" != "$libdir"; then
-		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
-		  fi
-		  path="$absdir"
-		fi
-		depdepl=
-		case $host in
-		*-*-darwin*)
-		  # we do not want to link against static libs,
-		  # but need to link against shared
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$path/$depdepl" ; then
-		      depdepl="$path/$depdepl"
-		    fi
-		    # do not add paths which are already there
-		    case " $newlib_search_path " in
-		    *" $path "*) ;;
-		    *) newlib_search_path="$newlib_search_path $path";;
-		    esac
-		  fi
-		  path=""
-		  ;;
-		*)
-		  path="-L$path"
-		  ;;
-		esac
-		;;
-	      -l*)
-		case $host in
-		*-*-darwin*)
-		  # Again, we only want to link against shared libraries
-		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
-		  for tmp in $newlib_search_path ; do
-		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
-		      eval depdepl="$tmp/lib$tmp_libs.dylib"
-		      break
-		    fi
-		  done
-		  path=""
-		  ;;
-		*) continue ;;
-		esac
-		;;
-	      *) continue ;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	      case " $deplibs " in
-	      *" $depdepl "*) ;;
-	      *) deplibs="$depdepl $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
 	  ;;
 	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-      dlprefiles="$newdlprefiles"
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
     fi
+}
 
-    case $linkmode in
-    oldlib)
-      if test -n "$deplibs"; then
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
-      fi
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
 
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
-      fi
 
-      if test -n "$rpath"; then
-	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
-      fi
 
-      if test -n "$xrpath"; then
-	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
-      fi
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
 
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
-      fi
 
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
-      fi
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
 
-      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
-      fi
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
 
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
+      func_mkdir_p "$my_xdir"
 
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	if test "$module" = no; then
-	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-	fi
-	;;
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
       esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
 
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
-	  exit $EXIT_FAILURE
-	else
-	  $echo
-	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
-	  $echo "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
+    func_extract_archives_result="$my_oldobjs"
+}
 
-      if test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
-      fi
 
-      set dummy $rpath
-      if test "$#" -gt 2; then
-	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
-      fi
-      install_libdir="$2"
 
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
+# func_emit_wrapper_part1 [arg=no]
+#
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
+{
+	func_emit_wrapper_part1_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part1_arg1=$1
 	fi
 
-	if test -n "$vinfo"; then
-	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
-	fi
+	$ECHO "\
+#! $SHELL
 
-	if test -n "$release"; then
-	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
-	fi
-      else
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
 
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	IFS="$save_ifs"
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
 
-	if test -n "$8"; then
-	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
 
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-	case $vinfo_number in
-	yes)
-	  number_major="$2"
-	  number_minor="$3"
-	  number_revision="$4"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows)
-	    current=`expr $number_major + $number_minor`
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    current=`expr $number_major + $number_minor - 1`
-	    age="$number_minor"
-	    revision="$number_minor"
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$2"
-	  revision="$3"
-	  age="$4"
-	  ;;
-	esac
+relink_command=\"$relink_command\"
 
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    ECHO=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$ECHO works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$ECHO will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$ECHO "\
 
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
 
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
 
-	if test "$age" -gt "$current"; then
-	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
 
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
+    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+"
+}
+# end: func_emit_wrapper_part1
 
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  major=.`expr $current - $age`
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  minor_current=`expr $current + 1`
-	  verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  ;;
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+	func_emit_wrapper_part2_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part2_arg1=$1
+	fi
 
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
+	$ECHO "\
 
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current";
-	  ;;
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
 
-	irix | nonstopux)
-	  major=`expr $current - $age + 1`
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
 
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
 
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    iface=`expr $revision - $loop`
-	    loop=`expr $loop - 1`
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
+    file=\"\$\$-\$program\"
 
-	linux)
-	  major=.`expr $current - $age`
-	  versuffix="$major.$age.$revision"
-	  ;;
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
 
-	osf)
-	  major=.`expr $current - $age`
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
+	  $ECHO "\
 
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    iface=`expr $current - $loop`
-	    loop=`expr $loop - 1`
-	    verstring="$verstring:${iface}.0"
-	  done
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
 
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
 
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
+	$ECHO "\
 
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  major=`expr $current - $age`
-	  versuffix="-$major"
-	  ;;
+  if test -f \"\$progdir/\$program\"; then"
 
-	*)
-	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
-	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
 
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
 
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
+    export $shlibpath_var
+"
 	fi
 
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
 	fi
-      fi
 
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$echo "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-	         then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	if test -n "$removelist"; then
-	  $show "${rm}r $removelist"
-	  $run ${rm}r $removelist
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2* | *-cegcc*)
+	  $ECHO "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $ECHO "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+# end: func_emit_wrapper_part2
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_arg1=$1
 	fi
-      fi
 
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+	# split this up so that func_emit_cwrapperexe_src
+	# can call each part independently.
+	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
 
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
 
-      # Eliminate all temporary directories.
-      for path in $notinst_path; do
-	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
-	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
-	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
-      done
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_tmp1=`cygpath -w "$1"`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=""
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
 
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+        func_to_host_pathlist_tmp2="$1"
+        # Once set for this call, this variable should not be
+        # reassigned. It is used in tha fallback case.
+        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+          $SED -e 's|^:*||' -e 's|:*$||'`
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+                  fi
+                fi
+              fi
+              IFS=:
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result" ; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
 
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
 
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
 
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs -framework System"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
- 	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
 
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $rm conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "$SHELL $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat <<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+# define setmode _setmode
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+#  define HAVE_SETENV
+#  ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+#  endif
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+#ifdef _MSC_VER
+# define S_IXUSR _S_IEXEC
+# define stat _stat
+# ifndef _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifdef __CYGWIN__
+# define FOPEN_WB "wb"
+#endif
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+    va_list args;
+    va_start (args, fmt);
+    (void) vfprintf (stderr, fmt, args);
+    va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
+EOF
+
+	    func_emit_wrapper_part1 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+	    cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+	    func_emit_wrapper_part2 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+
+	    cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
 EOF
-	  $rm conftest
-	  $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
-	  if test "$?" -eq 0 ; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      name=`expr $i : '-l\(.*\)'`
-	      # If $name is empty we are operating on a -L argument.
-              if test "$name" != "" && test "$name" -ne "0"; then
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-	        fi
-		if test -n "$i" ; then
-		  libname=`eval \\$echo \"$libname_spec\"`
-		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
-		  set dummy $deplib_matches
-		  deplib_match=$2
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    $echo
-		    $echo "*** Warning: dynamic linker does not accept needed library $i."
-		    $echo "*** I have the capability to make that library automatically link in when"
-		    $echo "*** you link to this library.  But I can only do this if you have a"
-		    $echo "*** shared version of the library, which I believe you do not have"
-		    $echo "*** because a test_compile did reveal that the linker did not use it for"
-		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-	      else
-		newdeplibs="$newdeplibs $i"
-	      fi
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      name=`expr $i : '-l\(.*\)'`
-	      # If $name is empty we are operating on a -L argument.
-              if test "$name" != "" && test "$name" != "0"; then
-		$rm conftest
-		$LTCC $LTCFLAGS -o conftest conftest.c $i
-		# Did it work?
-		if test "$?" -eq 0 ; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval \\$echo \"$libname_spec\"`
-		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
-		    set dummy $deplib_matches
-		    deplib_match=$2
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      $echo
-		      $echo "*** Warning: dynamic linker does not accept needed library $i."
-		      $echo "*** I have the capability to make that library automatically link in when"
-		      $echo "*** you link to this library.  But I can only do this if you have a"
-		      $echo "*** shared version of the library, which you do not appear to have"
-		      $echo "*** because a test_compile did reveal that the linker did not use this one"
-		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  $echo
-		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
-		  $echo "***  make it link in!  You will probably need to install it or some"
-		  $echo "*** library that it depends on before this library will be fully"
-		  $echo "*** functional.  Installing it before continuing would be even better."
-		fi
-	      else
-		newdeplibs="$newdeplibs $i"
-	      fi
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method
-	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    name=`expr $a_deplib : '-l\(.*\)'`
-	    # If $name is empty we are operating on a -L argument.
-            if test "$name" != "" && test  "$name" != "0"; then
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval \\$echo \"$libname_spec\"`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null \
-			 | grep " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
-			 | ${SED} 10q \
-			 | $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$echo
-		$echo "*** Warning: linker path does not have real file for library $a_deplib."
-		$echo "*** I have the capability to make that library automatically link in when"
-		$echo "*** you link to this library.  But I can only do this if you have a"
-		$echo "*** shared version of the library, which you do not appear to have"
-		$echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $echo "*** with $libname and none of the candidates passed a file format test"
-		  $echo "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
 	    else
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
 	    fi
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    name=`expr $a_deplib : '-l\(.*\)'`
-	    # If $name is empty we are operating on a -L argument.
-	    if test -n "$name" && test "$name" != "0"; then
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval \\$echo \"$libname_spec\"`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval $echo \"$potent_lib\" 2>/dev/null \
-		        | ${SED} 10q \
-		        | $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$echo
-		$echo "*** Warning: linker path does not have real file for library $a_deplib."
-		$echo "*** I have the capability to make that library automatically link in when"
-		$echo "*** you link to this library.  But I can only do this if you have a"
-		$echo "*** shared version of the library, which you do not appear to have"
-		$echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $echo "*** with $libname and none of the candidates passed a file format test"
-		  $echo "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
 	    else
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
 	    fi
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
-	    -e 's/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
-	    done
-	  fi
-	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
-	    | grep . >/dev/null; then
-	    $echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
 	    else
-	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
 	    fi
-	    $echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	  fi
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
 
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library is the System framework
-	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	  ;;
-	esac
 
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    $echo
-	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
-	    $echo "*** a static module, that should work as long as the dlopening"
-	    $echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      $echo
-	      $echo "*** However, this would only work if libtool was able to extract symbol"
-	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      $echo "*** not find such a program.  So, this module is probably useless."
-	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    $echo "*** The inter-library dependencies that have been dropped here will be"
-	    $echo "*** automatically added whenever a program is linked with this library"
-	    $echo "*** or is declared to -dlopen it."
+	    cat <<"EOF"
 
-	    if test "$allow_undefined" = no; then
-	      $echo
-	      $echo "*** Since this library must not contain undefined symbols,"
-	      $echo "*** because either the platform does not support them or"
-	      $echo "*** it was explicitly requested with -no-undefined,"
-	      $echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
 
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
 
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
 
+static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
+  /* argument is putenv-style "foo=bar", value of foo is set to bar */
 
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
+  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
 
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
+static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
+  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
 
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
 
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	realname="$2"
-	shift; shift
+  int i;
 
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
 
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
+  /* very simple arg parsing; don't want to rely on getopt */
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
 
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    cat <<"EOF"
+	  printf ("%s", script_text_part1);
+	  printf ("%s", script_text_part2);
+	  return 0;
+	}
+    }
 
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    $show "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $run $rm $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      if len=`expr "X$cmd" : ".*"` &&
-	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	        $show "$cmd"
-	        $run eval "$cmd" || exit $?
-	        skipped_export=false
-	      else
-	        # The command line is too long to execute in one step.
-	        $show "using reloadable object file for export list..."
-	        skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex"; then
-	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
-	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
-	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
+  newargz = XMALLOC (char *, argc + 1);
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal ("Couldn't find %s", argv[0]);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+			  tmp_pathspec));
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+			  actual_cwrapper_path));
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
+EOF
 
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
-	fi
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
 
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-		case " $convenience " in
-		*" $test_deplib "*) ;;
-		*)
-			tmp_deplibs="$tmp_deplibs $test_deplib"
-			;;
-		esac
-	done
-	deplibs="$tmp_deplibs"
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
 
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
 
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	  fi
-	fi
-	
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
 
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
-	fi
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
 
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	  eval test_cmds=\"$archive_expsym_cmds\"
-	  cmds=$archive_expsym_cmds
-	else
-	  eval test_cmds=\"$archive_cmds\"
-	  cmds=$archive_cmds
-	  fi
-	fi
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
 
-	if test "X$skipped_export" != "X:" &&
-	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise.
-	  $echo "creating reloadable object files..."
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
 
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+        {
+          if (argv[i][env_set_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_set_opt_len + 1;
+              lt_opt_process_env_set (p);
+            }
+          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_set (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_set_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+        {
+          if (argv[i][env_prepend_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_prepend_opt_len + 1;
+              lt_opt_process_env_prepend (p);
+            }
+          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_prepend_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+        {
+          if (argv[i][env_append_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_append_opt_len + 1;
+              lt_opt_process_env_append (p);
+            }
+          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_append (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_append_opt);
+          continue;
+        }
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
 
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  delfiles=
-	  last_robj=
-	  k=1
-	  output=$output_objdir/$output_la-${k}.$objext
-	  # Loop over the list of objects to be linked.
-	  for obj in $save_libobjs
-	  do
-	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
-	    if test "X$objlist" = X ||
-	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-		 test "$len" -le "$max_cmd_len"; }; then
-	      objlist="$objlist $obj"
-	    else
-	      # The command $test_cmds is almost too long, add a
-	      # command to the queue.
-	      if test "$k" -eq 1 ; then
-		# The first file doesn't have a previous command to add.
-		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
-	      else
-		# All subsequent reloadable object files will link in
-		# the last one created.
-		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
-	      fi
-	      last_robj=$output_objdir/$output_la-${k}.$objext
-	      k=`expr $k + 1`
-	      output=$output_objdir/$output_la-${k}.$objext
-	      objlist=$obj
-	      len=1
-	    fi
-	  done
-	  # Handle the remaining objects by creating one last
-	  # reloadable object file.  All subsequent reloadable object
-	  # files will link in the last one created.
-	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
-
-	  if ${skipped_export-false}; then
-	    $show "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $run $rm $export_symbols
-	    libobjs=$output
-	    # Append the command to create the export file.
-	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
-          fi
-
-	  # Set up a command to remove the reloadable object files
-	  # after they are used.
-	  i=0
-	  while test "$i" -lt "$k"
-	  do
-	    i=`expr $i + 1`
-	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
-	  done
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
+    {
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+    }
 
-	  $echo "creating a temporary reloadable object file: $output"
+EOF
 
-	  # Loop through the commands generated above and execute them.
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $concat_cmds; do
-	    IFS="$save_ifs"
-	    $show "$cmd"
-	    $run eval "$cmd" || exit $?
-	  done
-	  IFS="$save_ifs"
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
 
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
+	    cat <<"EOF"
+}
 
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
 
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    cmds=$archive_expsym_cmds
-	  else
-	    cmds=$archive_cmds
-	    fi
-	  fi
+  return p;
+}
 
-	  # Append the command to remove the reloadable object files
-	  # to the just-reset $cmds.
-	  eval cmds=\"\$cmds~\$rm $delfiles\"
-	fi
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $show "$cmd"
-	  $run eval "$cmd" || {
-	    lt_exit=$?
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
 
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
-	    fi
+const char *
+base_name (const char *name)
+{
+  const char *base;
 
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
 
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
 
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      $show "${rm}r $gentop"
-	      $run ${rm}r "$gentop"
-	    fi
-	  fi
+int
+check_executable (const char *path)
+{
+  struct stat st;
 
-	  exit $EXIT_SUCCESS
-	fi
+  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
 
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
-	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
-	  fi
-	done
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
 
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
 
-    obj)
-      if test -n "$deplibs"; then
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
-      fi
+  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
 
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
-      fi
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
 
-      if test -n "$rpath"; then
-	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
-      fi
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
 
-      if test -n "$xrpath"; then
-	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
-      fi
+  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
+			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
 
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
-      fi
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
 
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
-      fi
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
 
-      case $output in
-      *.lo)
-	if test -n "$objs$old_deplibs"; then
-	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	libobj="$output"
-	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal ("getcwd failed");
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
 
-      # Delete the old objects.
-      $run $rm $obj $libobj
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
 
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec
-      wl=
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+			      tmp_pathspec));
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
 
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  char *errstr = strerror (errno);
+	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+	}
+    }
+  XFREE (tmp_pathspec);
 
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
 
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal ("Could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
 
-      output="$obj"
-      cmds=$reload_cmds
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-	IFS="$save_ifs"
-	eval cmd=\"$cmd\"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
 
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  $show "${rm}r $gentop"
-	  $run ${rm}r $gentop
-	fi
+  assert (str != NULL);
+  assert (pat != NULL);
 
-	exit $EXIT_SUCCESS
-      fi
+  len = strlen (str);
+  patlen = strlen (pat);
 
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  $show "${rm}r $gentop"
-	  $run ${rm}r $gentop
-	fi
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
 
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $run eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
+static void
+lt_error_core (int exit_status, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	cmds=$reload_cmds
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $show "$cmd"
-	  $run eval "$cmd" || exit $?
-	done
-	IFS="$save_ifs"
-      fi
+  if (exit_status >= 0)
+    exit (exit_status);
+}
 
-      if test -n "$gentop"; then
-	$show "${rm}r $gentop"
-	$run ${rm}r $gentop
-      fi
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
 
-      exit $EXIT_SUCCESS
-      ;;
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
 
-    prog)
-      case $host in
-	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
-      esac
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
-      fi
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
 
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
-      fi
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+  const char *p;
+  int len;
+  if (!arg || !*arg)
+    return 1;
 
-      if test "$preload" = yes; then
-	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
-	   test "$dlopen_self_static" = unknown; then
-	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
-	fi
-      fi
+  p = strchr (arg, (int)'=');
 
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	;;
-      esac
+  if (!p)
+    return 1;
 
-      case $host in
-      *darwin*)
-        # Don't allow lazy linking, it breaks C++ global constructors
-        if test "$tagname" = CXX ; then
-        compile_command="$compile_command ${wl}-bind_at_load"
-        finalize_command="$finalize_command ${wl}-bind_at_load"
-        fi
-        ;;
-      esac
+  *value = xstrdup (++p);
 
+  len = strlen (arg) - strlen (*value);
+  *name = XMALLOC (char, len);
+  strncpy (*name, arg, len-1);
+  (*name)[len - 1] = '\0';
 
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
+  return 0;
+}
 
+void
+lt_opt_process_env_set (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
 
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+    }
 
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
+  lt_setenv (name, value);
+  XFREE (name);
+  XFREE (value);
+}
 
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
 
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+    }
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
+  new_value = lt_extend_str (getenv (name), value, 0);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
 
-      dlsyms=
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	  dlsyms="${outputname}S.c"
-	else
-	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
-	fi
-      fi
+void
+lt_opt_process_env_append (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
 
-      if test -n "$dlsyms"; then
-	case $dlsyms in
-	"") ;;
-	*.c)
-	  # Discover the nlist of each of the dlfiles.
-	  nlist="$output_objdir/${outputname}.nm"
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+    }
 
-	  $show "$rm $nlist ${nlist}S ${nlist}T"
-	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+  new_value = lt_extend_str (getenv (name), value, 1);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
 
-	  # Parse the name list into a source file.
-	  $show "creating $output_objdir/$dlsyms"
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
 
-	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
-/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
-/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
 
-#ifdef __cplusplus
-extern \"C\" {
-#endif
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
 
-/* Prevent the only kind of declaration conflicts we can make. */
-#define lt_preloaded_symbols some_other_symbol
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
 
-/* External symbol declarations for the compiler. */\
-"
 
-	  if test "$dlself" = yes; then
-	    $show "generating symbol list for \`$output'"
+EOF
+}
+# end: func_emit_cwrapperexe_src
 
-	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
 
-	    # Add our own program objects to the symbol list.
-	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	    for arg in $progfiles; do
-	      $show "extracting global C symbols from \`$arg'"
-	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-	    done
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
 
-	    if test -n "$exclude_expsyms"; then
-	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      $run eval '$mv "$nlist"T "$nlist"'
-	    fi
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
 
-	    if test -n "$export_symbols_regex"; then
-	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      $run eval '$mv "$nlist"T "$nlist"'
-	    fi
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
 
-	    # Prepare the list of exported symbols
-	    if test -z "$export_symbols"; then
-	      export_symbols="$output_objdir/$outputname.exp"
-	      $run $rm $export_symbols
-	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-              case $host in
-              *cygwin* | *mingw* )
-	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-                ;;
-              esac
-	    else
-	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      $run eval 'mv "$nlist"T "$nlist"'
-              case $host in
-              *cygwin* | *mingw* )
-	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-                ;;
-              esac
-	    fi
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
 	  fi
-
-	  for arg in $dlprefiles; do
-	    $show "extracting global C symbols from \`$arg'"
-	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
-	    $run eval '$echo ": $name " >> "$nlist"'
-	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -z "$run"; then
-	    # Make sure we have at least an empty file.
-	    test -f "$nlist" || : > "$nlist"
-
-	    if test -n "$exclude_expsyms"; then
-	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	      $mv "$nlist"T "$nlist"
-	    fi
-
-	    # Try sorting and uniquifying the output.
-	    if grep -v "^: " < "$nlist" |
-		if sort -k 3 </dev/null >/dev/null 2>&1; then
-		  sort -k 3
-		else
-		  sort +2
-		fi |
-		uniq > "$nlist"S; then
-	      :
-	    else
-	      grep -v "^: " < "$nlist" > "$nlist"S
-	    fi
-
-	    if test -f "$nlist"S; then
-	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
-	    else
-	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
-	    fi
-
-	    $echo >> "$output_objdir/$dlsyms" "\
-
-#undef lt_preloaded_symbols
-
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-"
-
-	    case $host in
-	    *cygwin* | *mingw* )
-	  $echo >> "$output_objdir/$dlsyms" "\
-/* DATA imports from DLLs on WIN32 can't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs */
-struct {
-"
-	      ;;
-	    * )
-	  $echo >> "$output_objdir/$dlsyms" "\
-const struct {
-"
-	      ;;
-	    esac
-
-
-	  $echo >> "$output_objdir/$dlsyms" "\
-  const char *name;
-  lt_ptr address;
-}
-lt_preloaded_symbols[] =
-{\
-"
-
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
-
-	    $echo >> "$output_objdir/$dlsyms" "\
-  {0, (lt_ptr) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
 	  fi
-
-	  pic_flag_for_symtable=
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    case "$compile_command " in
-	    *" -static "*) ;;
-	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
-	    esac;;
-	  *-*-hpux*)
-	    case "$compile_command " in
-	    *" -static "*) ;;
-	    *) pic_flag_for_symtable=" $pic_flag";;
-	    esac
-	  esac
-
-	  # Now compile the dynamic symbol file.
-	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
-	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
-
-	  # Clean up the generated files.
-	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
-	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
-
-	  # Transform the symbol file into the correct name.
-          case $host in
-          *cygwin* | *mingw* )
-            if test -f "$output_objdir/${outputname}.def" ; then
-              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
-              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
-            else
-              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-             fi
-            ;;
-          * )
-            compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-            finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-            ;;
-          esac
+	  prefer_static_libs=yes
 	  ;;
-	*)
-	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
-	  exit $EXIT_FAILURE
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
 	  ;;
 	esac
-      else
-	# We keep going just in case the user didn't refer to
-	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-	# really was required.
-
-	# Nullify the symbol file.
-	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-      fi
-
-      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-	# Replace the output file specification.
-	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
 
-	# We have no uninstalled library dependencies, so finalize right now.
-	$show "$link_command"
-	$run eval "$link_command"
-	exit_status=$?
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
 
-	# Delete the generated files.
-	if test -n "$dlsyms"; then
-	  $show "$rm $output_objdir/${outputname}S.${objext}"
-	  $run $rm "$output_objdir/${outputname}S.${objext}"
-	fi
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
 
-	exit $exit_status
-      fi
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
 
-      if test -n "$shlibpath_var"; then
-	# We should set the shlibpath_var
-	rpath=
-	for dir in $temp_rpath; do
-	  case $dir in
-	  [\\/]* | [A-Za-z]:[\\/]*)
-	    # Absolute path.
-	    rpath="$rpath$dir:"
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
 	    ;;
 	  *)
-	    # Relative path: add a thisdir entry.
-	    rpath="$rpath\$thisdir/$dir:"
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
 	    ;;
 	  esac
-	done
-	temp_rpath="$rpath"
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
 
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
 
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$run $rm $output
-	# Link the executable and exit
-	$show "$link_command"
-	$run eval "$link_command" || exit $?
-	exit $EXIT_SUCCESS
-      fi
+		# Read the .lo file
+		func_source "$arg"
 
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
 
-	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
-	$echo "$modename: \`$output' will be relinked during installation" 1>&2
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
 
-      # Replace the output file specification.
-      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
 
-      # Delete the old output files.
-      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
 
-      $show "$link_command"
-      $run eval "$link_command" || exit $?
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
 
-      # Now create the wrapper script.
-      $show "creating $output"
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
 
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
-	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
 
-      # Quote $echo for shipping.
-      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
-	case $progpath in
-	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-	esac
-	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if our run command is non-null.
-      if test -z "$run"; then
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
-	  *) exeext= ;;
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs="$weak_libs $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
 	esac
-	case $host in
-	  *cygwin* | *mingw* )
-            output_name=`basename $output`
-            output_path=`dirname $output`
-            cwrappersource="$output_path/$objdir/lt-$output_name.c"
-            cwrapper="$output_path/$output_name.exe"
-            $rm $cwrappersource $cwrapper
-            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    cat > $cwrappersource <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "/bin/sh $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat >> $cwrappersource<<"EOF"
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
+      fi # test -n "$prev"
 
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
+      prevarg="$arg"
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
 
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
 
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
 
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
 
-/* -DDEBUG is fairly common in CFLAGS.  */
-#undef DEBUG
-#if defined DEBUGWRAPPER
-# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
-#else
-# define DEBUG(format, ...)
-#endif
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
 
-const char *program_name = NULL;
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
 
-void * xmalloc (size_t num);
-char * xstrdup (const char *string);
-const char * base_name (const char *name);
-char * find_executable(const char *wrapper);
-int    check_executable(const char *path);
-char * strendzap(char *str, const char *pat);
-void lt_fatal (const char *message, ...);
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
 
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int i;
+      -framework)
+	prev=framework
+	continue
+	;;
 
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  DEBUG("(main) argv[0]      : %s\n",argv[0]);
-  DEBUG("(main) program_name : %s\n",program_name);
-  newargz = XMALLOC(char *, argc+2);
-EOF
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
 
-            cat >> $cwrappersource <<EOF
-  newargz[0] = (char *) xstrdup("$SHELL");
-EOF
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
 
-            cat >> $cwrappersource <<"EOF"
-  newargz[1] = find_executable(argv[0]);
-  if (newargz[1] == NULL)
-    lt_fatal("Couldn't find %s", argv[0]);
-  DEBUG("(main) found exe at : %s\n",newargz[1]);
-  /* we know the script has the same name, without the .exe */
-  /* so make sure newargz[1] doesn't end in .exe */
-  strendzap(newargz[1],".exe");
-  for (i = 1; i < argc; i++)
-    newargz[i+1] = xstrdup(argv[i]);
-  newargz[argc+1] = NULL;
+      -L*)
+	func_stripname '-L' '' "$arg"
+	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
 
-  for (i=0; i<argc+1; i++)
-  {
-    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
-    ;
-  }
-
-EOF
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
 
-            case $host_os in
-              mingw*)
-                cat >> $cwrappersource <<EOF
-  execv("$SHELL",(char const **)newargz);
-EOF
-              ;;
-              *)
-                cat >> $cwrappersource <<EOF
-  execv("$SHELL",newargz);
-EOF
-              ;;
-            esac
+      -module)
+	module=yes
+	continue
+	;;
 
-            cat >> $cwrappersource <<"EOF"
-  return 127;
-}
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
 
-void *
-xmalloc (size_t num)
-{
-  void * p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+	esac
+	continue
+	;;
 
-  return p;
-}
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
 
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
-;
-}
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
 
-const char *
-base_name (const char *name)
-{
-  const char *base;
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
-    name += 2;
-#endif
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
 
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
 
-int
-check_executable(const char * path)
-{
-  struct stat st;
+      -o) prev=output ;;
 
-  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
-  if ((!path) || (!*path))
-    return 0;
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
 
-  if ((stat (path, &st) >= 0) &&
-      (
-        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
-#if defined (S_IXOTH)
-       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
-#endif
-#if defined (S_IXGRP)
-       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
-#endif
-       ((st.st_mode & S_IXUSR) == S_IXUSR))
-      )
-    return 1;
-  else
-    return 0;
-}
+      -release)
+	prev=release
+	continue
+	;;
 
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise */
-char *
-find_executable (const char* wrapper)
-{
-  int has_slash = 0;
-  const char* p;
-  const char* p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char* concat_name;
+      -rpath)
+	prev=rpath
+	continue
+	;;
 
-  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+      -R)
+	prev=xrpath
+	continue
+	;;
 
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
 
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
-  {
-    concat_name = xstrdup (wrapper);
-    if (check_executable(concat_name))
-      return concat_name;
-    XFREE(concat_name);
-  }
-  else
-  {
-#endif
-    if (IS_DIR_SEPARATOR (wrapper[0]))
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable(concat_name))
-        return concat_name;
-      XFREE(concat_name);
-    }
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  }
-#endif
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
 
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-    {
-      has_slash = 1;
-      break;
-    }
-  if (!has_slash)
-  {
-    /* no slashes; search PATH */
-    const char* path = getenv ("PATH");
-    if (path != NULL)
-    {
-      for (p = path; *p; p = p_next)
-      {
-        const char* q;
-        size_t p_len;
-        for (q = p; *q; q++)
-          if (IS_PATH_SEPARATOR(*q))
-            break;
-        p_len = q - p;
-        p_next = (*q == '\0' ? q : q + 1);
-        if (p_len == 0)
-        {
-          /* empty path: current directory */
-          if (getcwd (tmp, LT_PATHMAX) == NULL)
-            lt_fatal ("getcwd failed");
-          tmp_len = strlen(tmp);
-          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
-          memcpy (concat_name, tmp, tmp_len);
-          concat_name[tmp_len] = '/';
-          strcpy (concat_name + tmp_len + 1, wrapper);
-        }
-        else
-        {
-          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
-          memcpy (concat_name, p, p_len);
-          concat_name[p_len] = '/';
-          strcpy (concat_name + p_len + 1, wrapper);
-        }
-        if (check_executable(concat_name))
-          return concat_name;
-        XFREE(concat_name);
-      }
-    }
-    /* not found in PATH; assume curdir */
-  }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen(tmp);
-  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
+      -shrext)
+	prev=shrext
+	continue
+	;;
 
-  if (check_executable(concat_name))
-    return concat_name;
-  XFREE(concat_name);
-  return NULL;
-}
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
 
-char *
-strendzap(char *str, const char *pat)
-{
-  size_t len, patlen;
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
 
-  assert(str != NULL);
-  assert(pat != NULL);
+      -version-info)
+	prev=vinfo
+	continue
+	;;
 
-  len = strlen(str);
-  patlen = strlen(pat);
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
 
-  if (patlen <= len)
-  {
-    str += len - patlen;
-    if (strcmp(str, pat) == 0)
-      *str = '\0';
-  }
-  return str;
-}
+      -weak)
+        prev=weak
+	continue
+	;;
 
-static void
-lt_error_core (int exit_status, const char * mode,
-          const char * message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
 
-  if (exit_status >= 0)
-    exit (exit_status);
-}
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+	  linker_flags="$linker_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
 
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-EOF
-          # we should really use a build-platform specific compiler
-          # here, but OTOH, the wrappers (shell script and this C one)
-          # are only useful if you want to execute the "real" binary.
-          # Since the "real" binary is built for $host, then this
-          # wrapper might as well be built for $host, too.
-          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
-          ;;
-        esac
-        $rm $output
-        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
 
-	$echo > $output "\
-#! $SHELL
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
 
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
 
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
 
-relink_command=\"$relink_command\"
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
 
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variable:
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$echo are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    echo=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$echo works!
-      :
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
     else
-      # Restart under the correct shell, and then maybe \$echo will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+      shlib_search_path=
     fi
-  fi\
-"
-	$echo >> $output "\
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
-  # Find the directory that this script lives in.
-  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
 
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_duplicate_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  case $lib in
+	  *.la)	func_source "$lib" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs="$deplibs $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    dir=$func_stripname_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		$ECHO
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
+		$ECHO "*** that it is just a static archive that I should not use here."
+	      else
+		$ECHO
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	    # Keep a list of preopened convenience libraries to check
+	    # that they are being used correctly in the link pass.
+	    test -z "$libdir" && \
+		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         newlib_search_path="$newlib_search_path $func_stripname_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath="$temp_rpath$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    $ECHO
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  $ECHO
+			  $ECHO "*** And there doesn't seem to be a static archive available"
+			  $ECHO "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $ECHO
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** I have the capability to make that library automatically link in when"
+	    $ECHO "*** you link to this library.  But I can only do this if you have a"
+	    $ECHO "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $ECHO "*** But as you try to build a module library, libtool will still create "
+	      $ECHO "*** a static module, that should work as long as the dlopening application"
+	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$ECHO
+		$ECHO "*** However, this would only work if libtool was able to extract symbol"
+		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$ECHO "*** not find such a program.  So, this module is probably useless."
+		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_dirname "$deplib" "" "."
+		dir="$func_dirname_result"
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  $ECHO
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs="$libobjs $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
+      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $ECHO
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    $ECHO "*** I have the capability to make that library automatically link in when"
+		    $ECHO "*** you link to this library.  But I can only do this if you have a"
+		    $ECHO "*** shared version of the library, which I believe you do not have"
+		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
+		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $ECHO
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      $ECHO "*** I have the capability to make that library automatically link in when"
+		      $ECHO "*** you link to this library.  But I can only do this if you have a"
+		      $ECHO "*** shared version of the library, which you do not appear to have"
+		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
+		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $ECHO
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $ECHO "*** make it link in!  You will probably need to install it or some"
+		  $ECHO "*** library that it depends on before this library will be fully"
+		  $ECHO "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
+	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+	    done
+	  fi
+	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
+	     $GREP . >/dev/null; then
+	    $ECHO
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $ECHO "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $ECHO
+	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $ECHO "*** a static module, that should work as long as the dlopening"
+	    $ECHO "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $ECHO
+	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
+	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $ECHO "*** not find such a program.  So, this module is probably useless."
+	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
+	    $ECHO "*** automatically added whenever a program is linked with this library"
+	    $ECHO "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $ECHO
+	      $ECHO "*** Since this library must not contain undefined symbols,"
+	      $ECHO "*** because either the platform does not support them or"
+	      $ECHO "*** it was explicitly requested with -no-undefined,"
+	      $ECHO "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
 
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
 
-    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
-  done
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
 
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
 
-	if test "$fast_install" = yes; then
-	  $echo >> $output "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
 
-  if test ! -f \"\$progdir/\$program\" || \\
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
 
-    file=\"\$\$-\$program\"
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles="$delfiles $export_symbols"
+	fi
 
-    if test ! -d \"\$progdir\"; then
-      $mkdir \"\$progdir\"
-    else
-      $rm \"\$progdir/\$file\"
-    fi"
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
 
-	  $echo >> $output "\
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      func_len " $cmd"
+	      len=$func_len_result
+	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
 
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$echo \"\$relink_command_output\" >&2
-	$rm \"\$progdir/\$file\"
-	exit $EXIT_FAILURE
-      fi
-    fi
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	fi
 
-    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $rm \"\$progdir/\$program\";
-      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $rm \"\$progdir/\$file\"
-  fi"
-	else
-	  $echo >> $output "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	fi
 
-	$echo >> $output "\
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs="$tmp_deplibs $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
 
-  if test -f \"\$progdir/\$program\"; then"
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
 
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $echo >> $output "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
 
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
 
-    export $shlibpath_var
-"
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $echo >> $output "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
 	fi
 
-	$echo >> $output "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2*)
-	  $echo >> $output "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
 
-	*)
-	  $echo >> $output "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$echo >> $output "\
-      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
-      exit $EXIT_FAILURE
-    fi
-  else
-    # The program doesn't exist.
-    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$echo \"This script is just a wrapper for \$program.\" 1>&2
-    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit $EXIT_FAILURE
-  fi
-fi\
-"
-	chmod +x $output
-      fi
-      exit $EXIT_SUCCESS
-      ;;
-    esac
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
 
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
 
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	fi
-	addlibs="$old_convenience"
-      fi
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    $ECHO 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    $ECHO ')' >> $output
+	    delfiles="$delfiles $output"
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    delfiles="$delfiles $output"
+	    output=$firstobj\"$file_list_spec$output\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=$obj
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      delfiles="$delfiles $output"
 
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
+	    else
+	      output=
+	    fi
 
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
 
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-       cmds=$old_archive_from_new_cmds
-      else
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  $echo "copying selected object files to avoid basename conflicts..."
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
 
-	  if test -z "$gentop"; then
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
 
-	    $show "${rm}r $gentop"
-	    $run ${rm}r "$gentop"
-	    $show "$mkdir $gentop"
-	    $run $mkdir "$gentop"
-	    exit_status=$?
-	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
-	      exit $exit_status
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
 	  fi
 
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		counter=`expr $counter + 1`
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      $run ln "$obj" "$gentop/$newobj" ||
-	      $run cp "$obj" "$gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	    fi
 
-	eval cmds=\"$old_archive_cmds\"
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
 
-	if len=`expr "X$cmds" : ".*"` &&
-	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  $echo "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
 
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  for obj in $save_oldobjs
-	  do
-	    oldobjs="$objlist $obj"
-	    objlist="$objlist $obj"
-	    eval test_cmds=\"$old_archive_cmds\"
-	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-	       test "$len" -le "$max_cmd_len"; then
-	      :
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
 	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-	        RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
+	      cmds=$module_cmds
 	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
 	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
 	  fi
 	fi
-      fi
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-        eval cmd=\"$cmd\"
-	IFS="$save_ifs"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
 
-    if test -n "$generated"; then
-      $show "${rm}r$generated"
-      $run ${rm}r$generated
-    fi
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
 
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      $show "creating $output"
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
 
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
-	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs="$libobjs $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
 	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
 
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
 
-      # Only create the output if not a dry run.
-      if test -z "$run"; then
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
 	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		if test -z "$libdir"; then
-		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
-		  exit $EXIT_FAILURE
-		fi
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-	      if test -z "$libdir"; then
-		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-		exit $EXIT_FAILURE
-	      fi
-	      newdlfiles="$newdlfiles $libdir/$name"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-	      if test -z "$libdir"; then
-		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-		exit $EXIT_FAILURE
-	      fi
-	      newdlprefiles="$newdlprefiles $libdir/$name"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
 	  fi
-	  $rm $output
-	  # place dlname in correct position for cygwin
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
-	  esac
-	  $echo > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
 
-# The name that we can dlopen(3).
-dlname='$tdlname'
+	  exit $EXIT_SUCCESS
+	fi
 
-# Names of this library.
-library_names='$library_names'
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
 
-# The name of the static archive.
-old_library='$old_library'
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
 
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
 
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
 
-# Is this an already installed library?
-installed=$installed
+	exit $EXIT_SUCCESS
+      fi
 
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
 
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
 
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $echo >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
-      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-    ;;
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
 
-  # libtool install mode
-  install)
-    modename="$modename: install"
+      exit $EXIT_SUCCESS
+      ;;
 
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       $echo "X$nonopt" | grep shtool > /dev/null; then
-      # Aesthetically quote it.
-      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	arg="\"$arg\""
-	;;
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
       esac
-      install_prog="$arg "
-      arg="$1"
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
 
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-    case $arg in
-    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-      arg="\"$arg\""
-      ;;
-    esac
-    install_prog="$install_prog$arg"
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
 
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
-      case $arg in
-      -d) isdir=yes ;;
-      -f) 
-      	case " $install_prog " in
-	*[\\\ /]cp\ *) ;;
-	*) prev=$arg ;;
-	esac
-	;;
-      -g | -m | -o) prev=$arg ;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
 	;;
       esac
 
-      # Aesthetically quote the argument.
-      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	arg="\"$arg\""
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command="$compile_command ${wl}-bind_at_load"
+	      finalize_command="$finalize_command ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
 	;;
       esac
-      install_prog="$install_prog $arg"
-    done
-
-    if test -z "$install_prog"; then
-      $echo "$modename: you must specify an install program" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prev' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	$echo "$modename: no file or destination specified" 1>&2
-      else
-	$echo "$modename: you must specify a destination" 1>&2
-      fi
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    # Strip any trailing slash from the destination.
-    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
 
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
-      test "X$destdir" = "X$dest" && destdir=.
-      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
 
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files
-      if test "$#" -gt 2; then
-	$echo "$modename: \`$dest' is not a directory" 1>&2
-	$echo "$help" 1>&2
-	exit $EXIT_FAILURE
-      fi
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
 	*)
-	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
 	  ;;
 	esac
       done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
 
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
 
-      *.la)
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
 
-	library_names=
-	old_library=
-	relink_command=
-	# If there is no directory component, then add one.
-	case $file in
-	*/* | *\\*) . $file ;;
-	*) . ./$file ;;
-	esac
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
 
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
 	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
 	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
 	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
 	  esac
 	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
 
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
-	test "X$dir" = "X$file/" && dir=
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  if test "$inst_prefix_dir" = "$destdir"; then
-	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
 
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
 
-	  $echo "$modename: warning: relinking \`$file'" 1>&2
-	  $show "$relink_command"
-	  if $run eval "$relink_command"; then :
-	  else
-	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	fi
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
 
-	# See the names of the shared library.
-	set dummy $library_names
-	if test -n "$2"; then
-	  realname="$2"
-	  shift
-	  shift
+      wrappers_required=yes
+      case $host in
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *cegcc)
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
 
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
 
-	  # Install the shared library and build the symlinks.
-	  $show "$install_prog $dir/$srcname $destdir/$realname"
-	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
-	  if test -n "$stripme" && test -n "$striplib"; then
-	    $show "$striplib $destdir/$realname"
-	    $run eval "$striplib $destdir/$realname" || exit $?
-	  fi
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
 
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      if test "$linkname" != "$realname"; then
-                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
-                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
-	      fi
-	    done
-	  fi
+	exit $exit_status
+      fi
 
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  cmds=$postinstall_cmds
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $cmds; do
-	    IFS="$save_ifs"
-	    eval cmd=\"$cmd\"
-	    $show "$cmd"
-	    $run eval "$cmd" || {
-	      lt_exit=$?
-
-	      # Restore the uninstalled library and exit
-	      if test "$mode" = relink; then
-		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
-	      fi
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
 
-	      exit $lt_exit
-	    }
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
 	  done
-	  IFS="$save_ifs"
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
 	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
 
-	# Install the pseudo-library for information purposes.
-	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	instname="$dir/$name"i
-	$show "$install_prog $instname $destdir/$name"
-	$run eval "$install_prog $instname $destdir/$name" || exit $?
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+	exit $EXIT_SUCCESS
+      fi
 
-      *.lo)
-	# Install (i.e. copy) a libtool object.
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
 
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
 	else
-	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	  destfile="$destdir/$destfile"
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
 	fi
+      fi
 
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+      # Replace the output file specification.
+      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
 
-	# Install the libtool object if requested.
-	if test -n "$destfile"; then
-	  $show "$install_prog $file $destfile"
-	  $run eval "$install_prog $file $destfile" || exit $?
-	fi
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
 
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+      func_show_eval "$link_command" 'exit $?'
 
-	  $show "$install_prog $staticobj $staticdest"
-	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
-	fi
-	exit $EXIT_SUCCESS
-	;;
+      # Now create the wrapper script.
+      func_verbose "creating $output"
 
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	  destfile="$destdir/$destfile"
-	fi
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
 
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      file=`$echo $file|${SED} 's,.exe$,,'`
-	      stripped_ext=".exe"
-	    fi
-	    ;;
+      # Quote $ECHO for shipping.
+      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
 	esac
+	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+      fi
 
-	# Do a test to see if this is really a libtool program.
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
 	case $host in
-	*cygwin*|*mingw*)
-	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
 	esac
-	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  # Note that it is not necessary on cygwin/mingw to append a dot to
-	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
-	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-	  # `FILE.' does not work on cygwin managed mounts.
-	  #
-	  # If there is no directory component, then add one.
-	  case $wrapper in
-	  */* | *\\*) . ${wrapper} ;;
-	  *) . ./${wrapper} ;;
-	  esac
-
-	  # Check the variables that should have been set.
-	  if test -z "$notinst_deplibs"; then
-	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      # If there is no directory component, then add one.
-	      case $lib in
-	      */* | *\\*) . $lib ;;
-	      *) . ./$lib ;;
-	      esac
-	    fi
-	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  # Note that it is not necessary on cygwin/mingw to append a dot to
-	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
-	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-	  # `FILE.' does not work on cygwin managed mounts.
-	  #
-	  # If there is no directory component, then add one.
-	  case $wrapper in
-	  */* | *\\*) . ${wrapper} ;;
-	  *) . ./${wrapper} ;;
-	  esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
 
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    if test "$finalize" = yes && test -z "$run"; then
-	      tmpdir=`func_mktempdir`
-	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
-	      outputname="$tmpdir/$file"
-	      # Replace the output file specification.
-	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
-	      $show "$relink_command"
-	      if $run eval "$relink_command"; then :
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
-		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-		${rm}r "$tmpdir"
-		continue
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
 	      fi
-	      file="$outputname"
-	    else
-	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
-	    fi
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
 
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway 
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
-	    ;;
-	  esac
+	    func_emit_wrapper no > $output
+	    chmod +x $output
 	  ;;
 	esac
-	$show "$install_prog$stripme $file $destfile"
-	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
-	test -n "$outputname" && ${rm}r "$tmpdir"
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
 
-      $show "$install_prog $file $oldlib"
-      $run eval "$install_prog \$file \$oldlib" || exit $?
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
 
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	$show "$old_striplib $oldlib"
-	$run eval "$old_striplib $oldlib" || exit $?
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs="$oldobjs $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
       fi
 
-      # Do each command in the postinstall commands.
-      cmds=$old_postinstall_cmds
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-	IFS="$save_ifs"
-	eval cmd=\"$cmd\"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
 
-    if test -n "$future_libdirs"; then
-      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
-    fi
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
 
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      test -n "$run" && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-    ;;
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
 
-  # libtool finish mode
-  finish)
-    modename="$modename: finish"
-    libdirs="$nonopt"
-    admincmds=
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
 
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs="$oldobjs $func_extract_archives_result"
+	fi
 
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  cmds=$finish_cmds
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $cmds; do
-	    IFS="$save_ifs"
-	    eval cmd=\"$cmd\"
-	    $show "$cmd"
-	    $run eval "$cmd" || admincmds="$admincmds
-       $cmd"
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $ECHO "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
 	  done
-	  IFS="$save_ifs"
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $run eval "$cmds" || admincmds="$admincmds
-       $cmds"
 	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    test "$show" = : && exit $EXIT_SUCCESS
+	eval cmds=\"$old_archive_cmds\"
 
-    $echo "X----------------------------------------------------------------------" | $Xsed
-    $echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $echo "   $libdir"
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
     done
-    $echo
-    $echo "If you ever happen to want to link against installed libraries"
-    $echo "in a given directory, LIBDIR, you must either use libtool, and"
-    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $echo "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $echo "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $echo
-    $echo "See any operating system documentation about shared libraries for"
-    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
-    $echo "X----------------------------------------------------------------------" | $Xsed
-    exit $EXIT_SUCCESS
-    ;;
 
-  # libtool execute mode
-  execute)
-    modename="$modename: execute"
-
-    # The first argument is the command name.
-    cmd="$nonopt"
-    if test -z "$cmd"; then
-      $echo "$modename: you must specify a COMMAND" 1>&2
-      $echo "$help"
-      exit $EXIT_FAILURE
-    fi
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
 
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      if test ! -f "$file"; then
-	$echo "$modename: \`$file' is not a file" 1>&2
-	$echo "$help" 1>&2
-	exit $EXIT_FAILURE
-      fi
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
 
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
 	else
-	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
 	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
 
-	# Read the libtool library.
-	dlname=
-	library_names=
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles="$newdlfiles $libdir/$name"
+		;;
+	      *) newdlfiles="$newdlfiles $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles="$newdlprefiles $libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
 
-	# If there is no directory component, then add one.
-	case $file in
-	*/* | *\\*) . $file ;;
-	*) . ./$file ;;
-	esac
+# The name that we can dlopen(3).
+dlname='$tdlname'
 
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
+# Names of this library.
+library_names='$library_names'
 
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$dir" = "X$file" && dir=.
+# The name of the static archive.
+old_library='$old_library'
 
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	;;
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
 
-      *.lo)
-	# Just add the directory containing the .lo file.
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$dir" = "X$file" && dir=.
-	;;
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
 
-      *)
-	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
-	continue
-	;;
-      esac
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
 
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
 
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
+# Is this an already installed library?
+installed=$installed
 
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
 
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -*) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  # If there is no directory component, then add one.
-	  case $file in
-	  */* | *\\*) . $file ;;
-	  *) . ./$file ;;
-	  esac
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
 
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
-      args="$args \"$file\""
-    done
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
 
-    if test -z "$run"; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
 
-      # Restore saved environment variables
-      if test "${save_LC_ALL+set}" = set; then
-	LC_ALL="$save_LC_ALL"; export LC_ALL
-      fi
-      if test "${save_LANG+set}" = set; then
-	LANG="$save_LANG"; export LANG
-      fi
+{ test "$mode" = link || test "$mode" = relink; } &&
+    func_mode_link ${1+"$@"}
 
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
-	$echo "export $shlibpath_var"
-      fi
-      $echo "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-    ;;
 
-  # libtool clean and uninstall mode
-  clean | uninstall)
-    modename="$modename: $mode"
-    rm="$nonopt"
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
     files=
     rmforce=
     exit_status=0
@@ -6448,30 +8202,28 @@ relink_command=\"$relink_command\""
     for arg
     do
       case $arg in
-      -f) rm="$rm $arg"; rmforce=yes ;;
-      -*) rm="$rm $arg" ;;
+      -f) RM="$RM $arg"; rmforce=yes ;;
+      -*) RM="$RM $arg" ;;
       *) files="$files $arg" ;;
       esac
     done
 
-    if test -z "$rm"; then
-      $echo "$modename: you must specify an RM program" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
 
     rmdirs=
 
     origobjdir="$objdir"
     for file in $files; do
-      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$dir" = "X$file"; then
-	dir=.
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
 	objdir="$origobjdir"
       else
 	objdir="$dir/$origobjdir"
       fi
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      func_basename "$file"
+      name="$func_basename_result"
       test "$mode" = uninstall && objdir="$dir"
 
       # Remember objdir for removal later, being careful to avoid duplicates
@@ -6483,9 +8235,9 @@ relink_command=\"$relink_command\""
       fi
 
       # Don't error if the file doesn't exist and rm -f was used.
-      if (test -L "$file") >/dev/null 2>&1 \
-	|| (test -h "$file") >/dev/null 2>&1 \
-	|| test -f "$file"; then
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
 	:
       elif test -d "$file"; then
 	exit_status=1
@@ -6499,8 +8251,8 @@ relink_command=\"$relink_command\""
       case $name in
       *.la)
 	# Possibly a libtool archive, so verify it.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  . $dir/$name
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
 
 	  # Delete the libtool libraries and symlinks.
 	  for n in $library_names; do
@@ -6515,39 +8267,17 @@ relink_command=\"$relink_command\""
 	    *" $dlname "*) ;;
 	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
 	    esac
-	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
 	    ;;
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
-	      cmds=$postuninstall_cmds
-	      save_ifs="$IFS"; IFS='~'
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd"
-		if test "$?" -ne 0 && test "$rmforce" != yes; then
-		  exit_status=1
-		fi
-	      done
-	      IFS="$save_ifs"
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
-	      cmds=$old_postuninstall_cmds
-	      save_ifs="$IFS"; IFS='~'
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd"
-		if test "$?" -ne 0 && test "$rmforce" != yes; then
-		  exit_status=1
-		fi
-	      done
-	      IFS="$save_ifs"
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
@@ -6557,20 +8287,20 @@ relink_command=\"$relink_command\""
 
       *.lo)
 	# Possibly a libtool object, so verify it.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	if func_lalib_p "$file"; then
 
 	  # Read the .lo file
-	  . $dir/$name
+	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" \
-	     && test "$pic_object" != none; then
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
 	    rmfiles="$rmfiles $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" \
-	     && test "$non_pic_object" != none; then
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
 	    rmfiles="$rmfiles $dir/$non_pic_object"
 	  fi
 	fi
@@ -6581,17 +8311,26 @@ relink_command=\"$relink_command\""
 	  noexename=$name
 	  case $file in
 	  *.exe)
-	    file=`$echo $file|${SED} 's,.exe$,,'`
-	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
 	    # $file with .exe has already been added to rmfiles,
 	    # add $file without .exe
 	    rmfiles="$rmfiles $file"
 	    ;;
 	  esac
 	  # Do a test to see if this is a libtool program.
-	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	    relink_command=
-	    . $dir/$noexename
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
@@ -6606,237 +8345,38 @@ relink_command=\"$relink_command\""
 	fi
 	;;
       esac
-      $show "$rm $rmfiles"
-      $run $rm $rmfiles || exit_status=1
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
     objdir="$origobjdir"
 
     # Try to remove the ${objdir}s in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
-	$show "rmdir $dir"
-	$run rmdir $dir >/dev/null 2>&1
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
       fi
     done
 
     exit $exit_status
-    ;;
+}
 
-  "")
-    $echo "$modename: you must specify a MODE" 1>&2
-    $echo "$generic_help" 1>&2
-    exit $EXIT_FAILURE
-    ;;
-  esac
+{ test "$mode" = uninstall || test "$mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
 
-  if test -z "$exec_cmd"; then
-    $echo "$modename: invalid operation mode \`$mode'" 1>&2
-    $echo "$generic_help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-fi # test -z "$show_help"
+test -z "$mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$mode'"
 
 if test -n "$exec_cmd"; then
-  eval exec $exec_cmd
+  eval exec "$exec_cmd"
   exit $EXIT_FAILURE
 fi
 
-# We need to display help for each of the modes.
-case $mode in
-"") $echo \
-"Usage: $modename [OPTION]... [MODE-ARG]...
-
-Provide generalized library-building support services.
-
-    --config          show all configuration variables
-    --debug           enable verbose shell tracing
--n, --dry-run         display commands without modifying any files
-    --features        display basic configuration information and exit
-    --finish          same as \`--mode=finish'
-    --help            display this help message and exit
-    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
-    --quiet           same as \`--silent'
-    --silent          don't print informational messages
-    --tag=TAG         use configuration variables from tag TAG
-    --version         print version information
-
-MODE must be one of the following:
-
-      clean           remove files from the build directory
-      compile         compile a source file into a libtool object
-      execute         automatically set library path, then run a program
-      finish          complete the installation of libtool libraries
-      install         install libraries or executables
-      link            create a library or an executable
-      uninstall       remove libraries from an installed directory
-
-MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
-a more detailed description of MODE.
-
-Report bugs to <bug-libtool at gnu.org>."
-  exit $EXIT_SUCCESS
-  ;;
-
-clean)
-  $echo \
-"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-compile)
-  $echo \
-"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -static           always build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-  ;;
-
-execute)
-  $echo \
-"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-  ;;
-
-finish)
-  $echo \
-"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-  ;;
-
-install)
-  $echo \
-"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-  ;;
-
-link)
-  $echo \
-"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-		    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-		    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -static           do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-		    specify library version info [each variable defaults to 0]
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-  ;;
-
-uninstall)
-  $echo \
-"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
+exit $exit_status
 
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-*)
-  $echo "$modename: invalid operation mode \`$mode'" 1>&2
-  $echo "$help" 1>&2
-  exit $EXIT_FAILURE
-  ;;
-esac
-
-$echo
-$echo "Try \`$modename --help' for more information about other modes."
-
-exit $?
 
 # The TAGs below are defined such that we never get into a situation
 # in which we disable both kinds of libraries.  Given conflicting
@@ -6850,14 +8390,17 @@ exit $?
 # configuration.  But we'll never go from static-only to shared-only.
 
 # ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-disable_libs=shared
+build_libtool_libs=no
+build_old_libs=yes
 # ### END LIBTOOL TAG CONFIG: disable-shared
 
 # ### BEGIN LIBTOOL TAG CONFIG: disable-static
-disable_libs=static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # ### END LIBTOOL TAG CONFIG: disable-static
 
 # Local Variables:
 # mode:shell-script
 # sh-indentation:2
 # End:
+# vi:sw=2
+
diff --git a/Watchdog/m4/Makefile.am b/Watchdog/m4/Makefile.am
new file mode 100644
index 0000000..367e7d1
--- /dev/null
+++ b/Watchdog/m4/Makefile.am
@@ -0,0 +1,31 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PWL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA =
+
+# M4 macro files for internal use.
+m4macros = \
+ax_prefix_config_h.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
diff --git a/Watchdog/m4/Makefile.in b/Watchdog/m4/Makefile.in
new file mode 100644
index 0000000..579648c
--- /dev/null
+++ b/Watchdog/m4/Makefile.in
@@ -0,0 +1,396 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PWL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(m4datadir)"
+m4dataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(m4data_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = 
+
+# M4 macro files for internal use.
+m4macros = \
+ax_prefix_config_h.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  m4/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-m4dataDATA: $(m4data_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)"
+	@list='$(m4data_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(m4dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4datadir)/$$f'"; \
+	  $(m4dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4datadir)/$$f"; \
+	done
+
+uninstall-m4dataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(m4data_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(m4datadir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(m4datadir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(m4datadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-m4dataDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-m4dataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-m4dataDATA install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-m4dataDATA
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Watchdog/m4/ax_prefix_config_h.m4 b/Watchdog/m4/ax_prefix_config_h.m4
new file mode 100644
index 0000000..b3a9465
--- /dev/null
+++ b/Watchdog/m4/ax_prefix_config_h.m4
@@ -0,0 +1,223 @@
+##### http://autoconf-archive.cryp.to/ax_prefix_config_h.html
+#
+# SYNOPSIS
+#
+#   AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])]
+#
+# DESCRIPTION
+#
+#   This is a new variant from ac_prefix_config_ this one will use a
+#   lowercase-prefix if the config-define was starting with a
+#   lowercase-char, e.g. "#define const", "#define restrict", or
+#   "#define off_t", (and this one can live in another directory, e.g.
+#   testpkg/config.h therefore I decided to move the output-header to
+#   be the first arg)
+#
+#   takes the usual config.h generated header file; looks for each of
+#   the generated "#define SOMEDEF" lines, and prefixes the defined
+#   name (ie. makes it "#define PREFIX_SOMEDEF". The result is written
+#   to the output config.header file. The PREFIX is converted to
+#   uppercase for the conversions.
+#
+#   Defaults:
+#
+#     OUTPUT-HEADER = $PACKAGE-config.h
+#     PREFIX = $PACKAGE
+#     ORIG-HEADER, from AM_CONFIG_HEADER(config.h)
+#
+#   Your configure.ac script should contain both macros in this order,
+#   and unlike the earlier variations of this prefix-macro it is okay
+#   to place the AX_PREFIX_CONFIG_H call before the AC_OUTPUT
+#   invokation.
+#
+#   Example:
+#
+#     AC_INIT(config.h.in)        # config.h.in as created by "autoheader"
+#     AM_INIT_AUTOMAKE(testpkg, 0.1.1)    # makes #undef VERSION and PACKAGE
+#     AM_CONFIG_HEADER(config.h)          # prep config.h from config.h.in
+#     AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it..
+#     AC_MEMORY_H                         # makes "#undef NEED_MEMORY_H"
+#     AC_C_CONST_H                        # makes "#undef const"
+#     AC_OUTPUT(Makefile)                 # creates the "config.h" now
+#                                         # and also mylib/_config.h
+#
+#   if the argument to AX_PREFIX_CONFIG_H would have been omitted then
+#   the default outputfile would have been called simply
+#   "testpkg-config.h", but even under the name "mylib/_config.h" it
+#   contains prefix-defines like
+#
+#     #ifndef TESTPKG_VERSION
+#     #define TESTPKG_VERSION "0.1.1"
+#     #endif
+#     #ifndef TESTPKG_NEED_MEMORY_H
+#     #define TESTPKG_NEED_MEMORY_H 1
+#     #endif
+#     #ifndef _testpkg_const
+#     #define _testpkg_const _const
+#     #endif
+#
+#   and this "mylib/_config.h" can be installed along with other
+#   header-files, which is most convenient when creating a shared
+#   library (that has some headers) where some functionality is
+#   dependent on the OS-features detected at compile-time. No need to
+#   invent some "mylib-confdefs.h.in" manually. :-)
+#
+#   Note that some AC_DEFINEs that end up in the config.h file are
+#   actually self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the
+#   AC_TYPE_OFF_T say that they "will define inline|const|off_t if the
+#   system does not do it by itself". You might want to clean up about
+#   these - consider an extra mylib/conf.h that reads something like:
+#
+#      #include <mylib/_config.h>
+#      #ifndef _testpkg_const
+#      #define _testpkg_const const
+#      #endif
+#
+#   and then start using _testpkg_const in the header files. That is
+#   also a good thing to differentiate whether some library-user has
+#   starting to take up with a different compiler, so perhaps it could
+#   read something like this:
+#
+#     #ifdef _MSC_VER
+#     #include <mylib/_msvc.h>
+#     #else
+#     #include <mylib/_config.h>
+#     #endif
+#     #ifndef _testpkg_const
+#     #define _testpkg_const const
+#     #endif
+#
+# LAST MODIFICATION
+#
+#   2007-01-17
+#
+# COPYLEFT
+#
+#   Copyright (c) 2007 Guido U. Draheim <guidod at gmx.de>
+#   Copyright (c) 2007 Marten Svantesson <msv at kth.se>
+#   Copyright (c) 2007 Gerald Point <Gerald.Point at labri.fr>
+#
+#   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, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+
+AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl
+AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl
+AC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl
+AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl
+AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl
+AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl
+AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl
+AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl
+AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl
+m4_pushdef([_script],[conftest.prefix])dnl
+m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl
+_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)`
+_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"`
+_PKG=`echo ifelse($2, , $PACKAGE, $2)`
+_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"`
+_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:"  -e "/^@<:@m4_cr_digits@:>@/s/^/_/"`
+_INP=`echo "ifelse($3,,,$3)" | sed -e 's/ *//'`
+if test ".$_INP" = "."; then
+   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
+     case "$ac_file" in
+        *.h) _INP=$ac_file ;;
+        *)
+     esac
+     test ".$_INP" != "." && break
+   done
+fi
+if test ".$_INP" = "."; then
+   case "$_OUT" in
+      */*) _INP=`basename "$_OUT"`
+      ;;
+      *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"`
+      ;;
+      *) _INP=config.h
+      ;;
+   esac
+fi
+if test -z "$_PKG" ; then
+   AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H])
+else
+  if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then
+     _INP="$srcdir/$_INP"
+  fi fi
+  AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines)
+  if test -f $_INP ; then
+    echo "s/^@%:@undef  *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/" > _script
+    echo "s/^@%:@undef  *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/" >> _script
+    echo "s/^@%:@def[]ine  *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1 \\" >> _script
+    echo "@%:@def[]ine $_UPP""_\\1 \\2 \\" >> _script
+    echo "@%:@endif/" >>_script
+    echo "s/^@%:@def[]ine  *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1 \\" >> _script
+    echo "@%:@define $_LOW""_\\1 \\2 \\" >> _script
+    echo "@%:@endif/" >> _script
+    # now executing _script on _DEF input to create _OUT output file
+    echo "@%:@ifndef $_DEF"      >$tmp/pconfig.h
+    echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
+
+    sed -f _script $_INP >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h
+    echo "@%:@endif" >>$tmp/pconfig.h
+    if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then
+      AC_MSG_NOTICE([$_OUT is unchanged])
+    else
+      ac_dir=`AS_DIRNAME(["$_OUT"])`
+      AS_MKDIR_P(["$ac_dir"])
+      rm -f "$_OUT"
+      mv $tmp/pconfig.h "$_OUT"
+    fi
+    cp _script _configs.sed
+  else
+    AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT])
+  fi
+  rm -f conftest.*
+fi
+m4_popdef([_symbol])dnl
+m4_popdef([_script])dnl
+AS_VAR_POPDEF([_INP])dnl
+AS_VAR_POPDEF([_UPP])dnl
+AS_VAR_POPDEF([_LOW])dnl
+AS_VAR_POPDEF([_PKG])dnl
+AS_VAR_POPDEF([_DEF])dnl
+AS_VAR_POPDEF([_OUT])dnl
+],[PACKAGE="$PACKAGE"])])
+
+dnl implementation note: a bug report (31.5.2005) from Marten Svantesson points
+dnl out a problem where `echo "\1"` results in a Control-A. The unix standard
+dnl    http://www.opengroup.org/onlinepubs/000095399/utilities/echo.html
+dnl defines all backslash-sequences to be inherently non-portable asking
+dnl for replacement mit printf. Some old systems had problems with that
+dnl one either. However, the latest libtool (!) release does export an $ECHO
+dnl (and $echo) that does the right thing - just one question is left: what
+dnl was the first version to have it? Is it greater 2.58 ?
diff --git a/Watchdog/m4/libtool.m4 b/Watchdog/m4/libtool.m4
new file mode 100644
index 0000000..39ba996
--- /dev/null
+++ b/Watchdog/m4/libtool.m4
@@ -0,0 +1,7357 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# 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.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 56 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+_LT_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+  ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+if test "$no_create" != yes; then
+  lt_cl_success=:
+  test "$silent" = yes &&
+    lt_config_lt_args="$lt_config_lt_args --quiet"
+  exec AS_MESSAGE_LOG_FD>/dev/null
+  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+  exec AS_MESSAGE_LOG_FD>>config.log
+  $lt_cl_success || AS_EXIT(1)
+fi
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_XSI_SHELLFNS
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX
+# -----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+[$]*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "[$]0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+    [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+       [shlibpath_overrides_runpath=yes])])
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method == "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        AC_LINK_IFELSE(int foo(void) {},
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+        )
+        LDFLAGS="$save_LDFLAGS"
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+        _LT_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [fix_srcfile_path], [1],
+    [Fix the shell variable $srcfile for the compiler])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+        # as there is no search path for DLLs.
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+        _LT_TAGVAR(always_export_symbols, $1)=no
+        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          _LT_TAGVAR(ld_shlibs, $1)=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${F77-"f77"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${FC-"f95"}
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC="$lt_save_CC"
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]+=\$[2]"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+    ;;
+  esac
+])
diff --git a/Watchdog/m4/ltoptions.m4 b/Watchdog/m4/ltoptions.m4
new file mode 100644
index 0000000..34151a3
--- /dev/null
+++ b/Watchdog/m4/ltoptions.m4
@@ -0,0 +1,368 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# 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.
+
+# serial 6 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/Watchdog/m4/ltsugar.m4 b/Watchdog/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/Watchdog/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# 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.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/Watchdog/m4/ltversion.m4 b/Watchdog/m4/ltversion.m4
new file mode 100644
index 0000000..b8e154f
--- /dev/null
+++ b/Watchdog/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# 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.
+
+# Generated from ltversion.in.
+
+# serial 3012 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6])
+m4_define([LT_PACKAGE_REVISION], [1.3012])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6'
+macro_revision='1.3012'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/Watchdog/m4/lt~obsolete.m4 b/Watchdog/m4/lt~obsolete.m4
new file mode 100644
index 0000000..637bb20
--- /dev/null
+++ b/Watchdog/m4/lt~obsolete.m4
@@ -0,0 +1,92 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# 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.
+
+# serial 4 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
diff --git a/Watchdog/missing b/Watchdog/missing
index d84fac8..1c8ff70 100755
--- a/Watchdog/missing
+++ b/Watchdog/missing
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
 
-scriptversion=2005-06-08.21
+scriptversion=2006-05-10.23
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
 #   Free Software Foundation, Inc.
 # Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
@@ -18,8 +18,9 @@ scriptversion=2005-06-08.21
 # 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -32,6 +33,8 @@ if test $# -eq 0; then
 fi
 
 run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
 
 # In the cases where this matters, `missing' is being run in the
 # srcdir already.
@@ -43,7 +46,7 @@ fi
 
 msg="missing on your system"
 
-case "$1" in
+case $1 in
 --run)
   # Try to run requested program, and just exit if it succeeds.
   run=
@@ -76,6 +79,7 @@ Supported PROGRAM values:
   aclocal      touch file \`aclocal.m4'
   autoconf     touch file \`configure'
   autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
   automake     touch all \`Makefile.in' files
   bison        create \`y.tab.[ch]', if possible, from existing .[ch]
   flex         create \`lex.yy.c', if possible, from existing .c
@@ -105,7 +109,7 @@ esac
 # Now exit if we have it, but it failed.  Also exit now if we
 # don't have it and --version was passed (most likely to detect
 # the program).
-case "$1" in
+case $1 in
   lex|yacc)
     # Not GNU programs, they don't have --version.
     ;;
@@ -134,7 +138,7 @@ esac
 
 # If it does not exist, or fails to run (possibly an outdated version),
 # try to emulate it.
-case "$1" in
+case $1 in
   aclocal*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
@@ -163,7 +167,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     test -z "$files" && files="config.h"
     touch_files=
     for f in $files; do
-      case "$f" in
+      case $f in
       *:*) touch_files="$touch_files "`echo "$f" |
 				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
       *) touch_files="$touch_files $f.in";;
@@ -191,8 +195,8 @@ WARNING: \`$1' is needed, but is $msg.
          You can get \`$1' as part of \`Autoconf' from any GNU
          archive site."
 
-    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
-    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
     if test -f "$file"; then
 	touch $file
     else
@@ -213,25 +217,25 @@ WARNING: \`$1' $msg.  You should only need it if
          in order for those modifications to take effect.  You can get
          \`Bison' from any GNU archive site."
     rm -f y.tab.c y.tab.h
-    if [ $# -ne 1 ]; then
+    if test $# -ne 1; then
         eval LASTARG="\${$#}"
-	case "$LASTARG" in
+	case $LASTARG in
 	*.y)
 	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" y.tab.c
 	    fi
 	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" y.tab.h
 	    fi
 	  ;;
 	esac
     fi
-    if [ ! -f y.tab.h ]; then
+    if test ! -f y.tab.h; then
 	echo >y.tab.h
     fi
-    if [ ! -f y.tab.c ]; then
+    if test ! -f y.tab.c; then
 	echo 'main() { return 0; }' >y.tab.c
     fi
     ;;
@@ -243,18 +247,18 @@ WARNING: \`$1' is $msg.  You should only need it if
          in order for those modifications to take effect.  You can get
          \`Flex' from any GNU archive site."
     rm -f lex.yy.c
-    if [ $# -ne 1 ]; then
+    if test $# -ne 1; then
         eval LASTARG="\${$#}"
-	case "$LASTARG" in
+	case $LASTARG in
 	*.l)
 	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" lex.yy.c
 	    fi
 	  ;;
 	esac
     fi
-    if [ ! -f lex.yy.c ]; then
+    if test ! -f lex.yy.c; then
 	echo 'main() { return 0; }' >lex.yy.c
     fi
     ;;
@@ -266,11 +270,9 @@ WARNING: \`$1' is $msg.  You should only need it if
 	 \`Help2man' package in order for those modifications to take
 	 effect.  You can get \`Help2man' from any GNU archive site."
 
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
-    fi
-    if [ -f "$file" ]; then
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
 	touch $file
     else
 	test -z "$file" || exec >$file
@@ -288,11 +290,17 @@ WARNING: \`$1' is $msg.  You should only need it if
          DU, IRIX).  You might want to install the \`Texinfo' package or
          the \`GNU make' package.  Grab either from any GNU archive site."
     # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
     if test -z "$file"; then
       # ... or it is the one specified with @setfilename ...
       infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
       # ... or it is derived from the source name (dir/f.texi becomes f.info)
       test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
     fi
@@ -316,13 +324,13 @@ WARNING: \`$1' is $msg.  You should only need it if
     fi
     firstarg="$1"
     if shift; then
-	case "$firstarg" in
+	case $firstarg in
 	*o*)
 	    firstarg=`echo "$firstarg" | sed s/o//`
 	    tar "$firstarg" "$@" && exit 0
 	    ;;
 	esac
-	case "$firstarg" in
+	case $firstarg in
 	*h*)
 	    firstarg=`echo "$firstarg" | sed s/h//`
 	    tar "$firstarg" "$@" && exit 0
diff --git a/Watchdog/mkinstalldirs b/Watchdog/mkinstalldirs
index 259dbfc..ef7e16f 100755
--- a/Watchdog/mkinstalldirs
+++ b/Watchdog/mkinstalldirs
@@ -1,7 +1,7 @@
 #! /bin/sh
 # mkinstalldirs --- make directory hierarchy
 
-scriptversion=2005-06-29.22
+scriptversion=2006-05-11.19
 
 # Original author: Noah Friedman <friedman at prep.ai.mit.edu>
 # Created: 1993-05-16
@@ -11,6 +11,9 @@ scriptversion=2005-06-29.22
 # bugs to <bug-automake at gnu.org> or send patches to
 # <automake-patches at gnu.org>.
 
+nl='
+'
+IFS=" ""	$nl"
 errstatus=0
 dirmode=
 
diff --git a/Watchdog/src/Doubly_Linked_Object.defs.hh b/Watchdog/src/Doubly_Linked_Object.defs.hh
index bac30b5..46d3257 100644
--- a/Watchdog/src/Doubly_Linked_Object.defs.hh
+++ b/Watchdog/src/Doubly_Linked_Object.defs.hh
@@ -1,11 +1,11 @@
 /* Doubly_Linked_Object class declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Doubly_Linked_Object.inlines.hh b/Watchdog/src/Doubly_Linked_Object.inlines.hh
index 8b7d52e..98f0a66 100644
--- a/Watchdog/src/Doubly_Linked_Object.inlines.hh
+++ b/Watchdog/src/Doubly_Linked_Object.inlines.hh
@@ -1,11 +1,11 @@
 /* Doubly_Linked_Object class implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Doubly_Linked_Object.types.hh b/Watchdog/src/Doubly_Linked_Object.types.hh
index a3466b0..725737c 100644
--- a/Watchdog/src/Doubly_Linked_Object.types.hh
+++ b/Watchdog/src/Doubly_Linked_Object.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/EList.defs.hh b/Watchdog/src/EList.defs.hh
index 1572e28..6dc672d 100644
--- a/Watchdog/src/EList.defs.hh
+++ b/Watchdog/src/EList.defs.hh
@@ -1,11 +1,11 @@
 /* EList class declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -52,7 +52,7 @@ public:
   void push_back(T& obj);
 
   /*! \brief
-    Inserts \p obj jyst before \p position and returns an iterator
+    Inserts \p obj just before \p position and returns an iterator
     that points to the inserted object.
   */
   Iterator insert(Iterator position, T& obj);
diff --git a/Watchdog/src/EList.inlines.hh b/Watchdog/src/EList.inlines.hh
index 828fa55..84523cb 100644
--- a/Watchdog/src/EList.inlines.hh
+++ b/Watchdog/src/EList.inlines.hh
@@ -1,11 +1,11 @@
 /* EList class implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/EList.types.hh b/Watchdog/src/EList.types.hh
index 84d7300..d3e3b87 100644
--- a/Watchdog/src/EList.types.hh
+++ b/Watchdog/src/EList.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/EList_Iterator.defs.hh b/Watchdog/src/EList_Iterator.defs.hh
index fd7123f..bd8ab9e 100644
--- a/Watchdog/src/EList_Iterator.defs.hh
+++ b/Watchdog/src/EList_Iterator.defs.hh
@@ -1,11 +1,11 @@
 /* EList_Iterator class declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/EList_Iterator.inlines.hh b/Watchdog/src/EList_Iterator.inlines.hh
index 1998f11..cd62e20 100644
--- a/Watchdog/src/EList_Iterator.inlines.hh
+++ b/Watchdog/src/EList_Iterator.inlines.hh
@@ -1,11 +1,11 @@
 /* EList_Iterator class implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/EList_Iterator.types.hh b/Watchdog/src/EList_Iterator.types.hh
index f3e3d91..02fd313 100644
--- a/Watchdog/src/EList_Iterator.types.hh
+++ b/Watchdog/src/EList_Iterator.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/Handler.defs.hh b/Watchdog/src/Handler.defs.hh
index fdbc555..46a2820 100644
--- a/Watchdog/src/Handler.defs.hh
+++ b/Watchdog/src/Handler.defs.hh
@@ -1,11 +1,11 @@
 /* Handler and derived classes' declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,7 +37,7 @@ public:
 
 //! A kind of Handler that installs a flag onto a flag-holder.
 /*!
-  The templatic class Handler_Flag<Flag_Base, Flag> is an handler whose
+  The template class Handler_Flag<Flag_Base, Flag> is an handler whose
   job is to install a flag onto an <EM>holder</EM> for the flag.
   The flag is of type \p Flag and the holder is a (volatile) pointer
   to \p Flag_Base.  Installing the flag onto the holder means making
diff --git a/Watchdog/src/Handler.inlines.hh b/Watchdog/src/Handler.inlines.hh
index 8ef1325..f4314ed 100644
--- a/Watchdog/src/Handler.inlines.hh
+++ b/Watchdog/src/Handler.inlines.hh
@@ -1,11 +1,11 @@
 /* Handler and derived classes' implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Handler.types.hh b/Watchdog/src/Handler.types.hh
index fd81d28..426d3d3 100644
--- a/Watchdog/src/Handler.types.hh
+++ b/Watchdog/src/Handler.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/Makefile.am b/Watchdog/src/Makefile.am
index 9982382..b8b2798 100644
--- a/Watchdog/src/Makefile.am
+++ b/Watchdog/src/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -62,7 +62,7 @@ if BUILD_WATCHDOG_LIBRARY
 
 # Libtool -version-info for libpwl.la.
 #
-#  1. Start with version information of `0:0:0' for each libtool library.
+#  1. Start with version information of `0:0:0' for each Libtool library.
 #
 #  2. Update the version information only immediately before a public
 #     release of your software.  More frequent updates are unnecessary,
@@ -86,8 +86,10 @@ if BUILD_WATCHDOG_LIBRARY
 #	    0.2			0.5		    1:0:0
 #	    0.3			0.6		    2:0:0
 #	    0.4			0.7		    3:0:0
+#	    0.5			0.8		    3:0:0
+#	    0.6			0.10		    4:0:0
 
-LIBPWL_LT_CURRENT =  3
+LIBPWL_LT_CURRENT =  4
 LIBPWL_LT_REVISION = 0
 LIBPWL_LT_AGE =      0
 
@@ -117,7 +119,7 @@ pwl_include_files.hh: $(INCLUDE_FILES) Makefile
 
 if HAVE_PERL
 
-pwl.hh:	$(top_builddir)/config.h pwl_header.hh pwl_include_files.hh Makefile $(top_builddir)/utils/build_header
+pwl.hh:	$(top_builddir)/config.h pwl_header.hh pwl_include_files.hh $(top_builddir)/utils/build_header
 	$(top_builddir)/utils/build_header \
 		-I $(top_builddir) -I $(top_builddir)/src \
 		$(top_srcdir)/src/pwl_header.hh >$@
@@ -138,6 +140,6 @@ $(nodist_noinst_HEADERS)
 dist-hook:
 	mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist
 
-MOSTLYCLEANFILES = $(BUILT_SOURCES)
-
 endif BUILD_WATCHDOG_LIBRARY
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
diff --git a/Watchdog/src/Makefile.in b/Watchdog/src/Makefile.in
index 304b698..528df27 100644
--- a/Watchdog/src/Makefile.in
+++ b/Watchdog/src/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/Software/ . */
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -63,7 +59,10 @@ subdir = src
 DIST_COMMON = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
@@ -95,26 +94,31 @@ am__objects_2 = $(am__objects_1) Pending_Element.lo Pending_List.lo \
 	Time.lo Watchdog.lo
 @BUILD_WATCHDOG_LIBRARY_TRUE at am_libpwl_la_OBJECTS = $(am__objects_2)
 libpwl_la_OBJECTS = $(am_libpwl_la_OBJECTS)
+libpwl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libpwl_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_WATCHDOG_LIBRARY_TRUE at am_libpwl_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(libpwl_la_SOURCES)
 DIST_SOURCES = $(am__libpwl_la_SOURCES_DIST)
 am__include_HEADERS_DIST = pwl.hh
@@ -124,21 +128,15 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
 CXXCPP = @CXXCPP@
@@ -147,32 +145,37 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -182,23 +185,18 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -210,29 +208,41 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
 
 # The ordering of the following list *matters*!
 INCLUDE_FILES = \
@@ -275,7 +285,7 @@ pwl_header.hh
 
 # Libtool -version-info for libpwl.la.
 #
-#  1. Start with version information of `0:0:0' for each libtool library.
+#  1. Start with version information of `0:0:0' for each Libtool library.
 #
 #  2. Update the version information only immediately before a public
 #     release of your software.  More frequent updates are unnecessary,
@@ -299,7 +309,9 @@ pwl_header.hh
 #	    0.2			0.5		    1:0:0
 #	    0.3			0.6		    2:0:0
 #	    0.4			0.7		    3:0:0
- at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_CURRENT = 3
+#	    0.5			0.8		    3:0:0
+#	    0.6			0.10		    4:0:0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_CURRENT = 4
 @BUILD_WATCHDOG_LIBRARY_TRUE at LIBPWL_LT_REVISION = 0
 @BUILD_WATCHDOG_LIBRARY_TRUE at LIBPWL_LT_AGE = 0
 @BUILD_WATCHDOG_LIBRARY_TRUE at lib_LTLIBRARIES = libpwl.la
@@ -315,7 +327,7 @@ pwl_header.hh
 @BUILD_WATCHDOG_LIBRARY_TRUE@$(include_HEADERS) \
 @BUILD_WATCHDOG_LIBRARY_TRUE@$(nodist_noinst_HEADERS)
 
- at BUILD_WATCHDOG_LIBRARY_TRUE@MOSTLYCLEANFILES = $(BUILT_SOURCES)
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-am
 
@@ -352,21 +364,21 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
 	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-libLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
 	done
 
 clean-libLTLIBRARIES:
@@ -378,7 +390,7 @@ clean-libLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 libpwl.la: $(libpwl_la_OBJECTS) $(libpwl_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_libpwl_la_rpath) $(libpwl_la_LDFLAGS) $(libpwl_la_OBJECTS) $(libpwl_la_LIBADD) $(LIBS)
+	$(libpwl_la_LINK) $(am_libpwl_la_rpath) $(libpwl_la_OBJECTS) $(libpwl_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -392,22 +404,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Watchdog.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -417,13 +429,9 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-includeHEADERS: $(include_HEADERS)
 	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
 	@list='$(include_HEADERS)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -444,8 +452,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -457,8 +465,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -468,13 +476,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -489,22 +496,21 @@ distclean-tags:
 @BUILD_WATCHDOG_LIBRARY_FALSE at dist-hook:
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -524,7 +530,7 @@ check: $(BUILT_SOURCES)
 all-am: Makefile $(LTLIBRARIES) $(HEADERS)
 installdirs:
 	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) install-am
@@ -562,7 +568,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -576,12 +582,20 @@ info-am:
 
 install-data-am: install-includeHEADERS
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-libLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -602,21 +616,23 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-includeHEADERS uninstall-info-am \
-	uninstall-libLTLIBRARIES
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
 	clean-libLTLIBRARIES clean-libtool ctags dist-hook distclean \
 	distclean-compile distclean-generic distclean-libtool \
 	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-includeHEADERS install-info \
-	install-info-am install-libLTLIBRARIES install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-includeHEADERS uninstall-info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-includeHEADERS install-info \
+	install-info-am install-libLTLIBRARIES install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-includeHEADERS \
 	uninstall-libLTLIBRARIES
 
 
@@ -627,7 +643,7 @@ uninstall-am: uninstall-includeHEADERS uninstall-info-am \
 @BUILD_WATCHDOG_LIBRARY_TRUE@	  printf "#include \"%s\"\n" $$file >>$@; \
 @BUILD_WATCHDOG_LIBRARY_TRUE@	done
 
- at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE at pwl.hh:	$(top_builddir)/config.h pwl_header.hh pwl_include_files.hh Makefile $(top_builddir)/utils/build_header
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE at pwl.hh:	$(top_builddir)/config.h pwl_header.hh pwl_include_files.hh $(top_builddir)/utils/build_header
 @BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@	$(top_builddir)/utils/build_header \
 @BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@		-I $(top_builddir) -I $(top_builddir)/src \
 @BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@		$(top_srcdir)/src/pwl_header.hh >$@
diff --git a/Watchdog/src/Pending_Element.cc b/Watchdog/src/Pending_Element.cc
index ea026e3..19830e3 100644
--- a/Watchdog/src/Pending_Element.cc
+++ b/Watchdog/src/Pending_Element.cc
@@ -1,11 +1,11 @@
 /* Pending_Element class implementation (non-inline functions).
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see
 http://www.cs.unipr.it/Software/ . */
 
-#include <config.h>
+#include <pwl-config.h>
 
 #include "Pending_Element.defs.hh"
 
diff --git a/Watchdog/src/Pending_Element.defs.hh b/Watchdog/src/Pending_Element.defs.hh
index 76b1df5..147350b 100644
--- a/Watchdog/src/Pending_Element.defs.hh
+++ b/Watchdog/src/Pending_Element.defs.hh
@@ -1,11 +1,11 @@
 /* Pending_Element class declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -32,7 +32,7 @@ http://www.cs.unipr.it/Software/ . */
 /*!
   Each pending watchdog event is characterized by a deadline (a positive
   time interval), an associated handler that will be invoked upon event
-  expiration, and a boolean flag that indicates whether the event has already
+  expiration, and a Boolean flag that indicates whether the event has already
   expired or not.
 */
 class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object {
diff --git a/Watchdog/src/Pending_Element.inlines.hh b/Watchdog/src/Pending_Element.inlines.hh
index 42a1744..1a3fef3 100644
--- a/Watchdog/src/Pending_Element.inlines.hh
+++ b/Watchdog/src/Pending_Element.inlines.hh
@@ -1,11 +1,11 @@
 /* Pending_Element class implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Pending_Element.types.hh b/Watchdog/src/Pending_Element.types.hh
index 7f8cb62..7598e96 100644
--- a/Watchdog/src/Pending_Element.types.hh
+++ b/Watchdog/src/Pending_Element.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/Pending_List.cc b/Watchdog/src/Pending_List.cc
index 5ce8a38..96f5da5 100644
--- a/Watchdog/src/Pending_List.cc
+++ b/Watchdog/src/Pending_List.cc
@@ -1,11 +1,11 @@
 /* Pending_List class implementation (non-inline functions).
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see
 http://www.cs.unipr.it/Software/ . */
 
-#include <config.h>
+#include <pwl-config.h>
 
 #include "Pending_List.defs.hh"
 #include <iostream>
diff --git a/Watchdog/src/Pending_List.defs.hh b/Watchdog/src/Pending_List.defs.hh
index 366dcb7..998f81d 100644
--- a/Watchdog/src/Pending_List.defs.hh
+++ b/Watchdog/src/Pending_List.defs.hh
@@ -1,11 +1,11 @@
 /* Pending_List class declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Pending_List.inlines.hh b/Watchdog/src/Pending_List.inlines.hh
index 1486419..82b1f31 100644
--- a/Watchdog/src/Pending_List.inlines.hh
+++ b/Watchdog/src/Pending_List.inlines.hh
@@ -1,11 +1,11 @@
 /* Pending_List class implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Pending_List.types.hh b/Watchdog/src/Pending_List.types.hh
index f784288..dbd1644 100644
--- a/Watchdog/src/Pending_List.types.hh
+++ b/Watchdog/src/Pending_List.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/Time.cc b/Watchdog/src/Time.cc
index 88fa378..b45b937 100644
--- a/Watchdog/src/Time.cc
+++ b/Watchdog/src/Time.cc
@@ -1,11 +1,11 @@
 /* Time class implementation (non-inline functions).
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see
 http://www.cs.unipr.it/Software/ . */
 
-#include <config.h>
+#include <pwl-config.h>
 
 #include "Time.defs.hh"
 
diff --git a/Watchdog/src/Time.defs.hh b/Watchdog/src/Time.defs.hh
index ae27c8d..abb5ff6 100644
--- a/Watchdog/src/Time.defs.hh
+++ b/Watchdog/src/Time.defs.hh
@@ -1,11 +1,11 @@
 /* Time class declaration.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Time.inlines.hh b/Watchdog/src/Time.inlines.hh
index 8971c0f..81d26f6 100644
--- a/Watchdog/src/Time.inlines.hh
+++ b/Watchdog/src/Time.inlines.hh
@@ -1,11 +1,11 @@
 /* Time class implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Time.types.hh b/Watchdog/src/Time.types.hh
index 90698d1..da0a08b 100644
--- a/Watchdog/src/Time.types.hh
+++ b/Watchdog/src/Time.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/Watchdog.cc b/Watchdog/src/Watchdog.cc
index 49cbadd..1da507f 100644
--- a/Watchdog/src/Watchdog.cc
+++ b/Watchdog/src/Watchdog.cc
@@ -1,11 +1,11 @@
 /* Watchdog and associated classes' implementation (non-inline functions).
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the CS at Parma software
 site: http://www.cs.unipr.it/Software/ . */
 
-#include <config.h>
+#include <pwl-config.h>
 
 #include "Watchdog.defs.hh"
 
@@ -31,11 +31,11 @@ site: http://www.cs.unipr.it/Software/ . */
 #include <string>
 #include <string.h>
 
-#ifdef TIME_WITH_SYS_TIME
+#ifdef PWL_TIME_WITH_SYS_TIME
 # include <sys/time.h>
 # include <ctime>
 #else
-# ifdef HAVE_SYS_TIME_H
+# ifdef PWL_HAVE_SYS_TIME_H
 #  include <sys/time.h>
 # else
 #  include <ctime>
@@ -43,8 +43,8 @@ site: http://www.cs.unipr.it/Software/ . */
 #endif
 
 // Cygwin only supports ITIMER_REAL.
-// Profiling does not work on programs that uses the ITIMER_PROF timer.
-#if defined(__CYGWIN__) || defined(PROFILING)
+// Profiling does not work on programs that use the ITIMER_PROF timer.
+#if defined(__CYGWIN__) || defined(PWL_PROFILING)
 #define THE_TIMER  ITIMER_REAL
 #define THE_SIGNAL SIGALRM
 #else
@@ -57,10 +57,10 @@ namespace PWL = Parma_Watchdog_Library;
 using std::cerr;
 using std::endl;
 
-// Pass this to getitimer.
+// Pass this to getitimer().
 itimerval PWL::Watchdog::current_timer_status;
 
-// Pass this to setitimer.
+// Pass this to setitimer().
 itimerval PWL::Watchdog::signal_once;
 
 // Last time value we set the timer to.
diff --git a/Watchdog/src/Watchdog.defs.hh b/Watchdog/src/Watchdog.defs.hh
index d8b3464..cbc7a51 100644
--- a/Watchdog/src/Watchdog.defs.hh
+++ b/Watchdog/src/Watchdog.defs.hh
@@ -1,11 +1,11 @@
 /* Watchdog and associated classes' declaration and inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,7 +29,7 @@ http://www.cs.unipr.it/Software/ . */
 #include "Pending_List.defs.hh"
 #include <cassert>
 
-#ifdef HAVE_SYS_TIME_H
+#ifdef PWL_HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
@@ -62,13 +62,13 @@ private:
   Watchdog(const Watchdog&);
   Watchdog& operator=(const Watchdog&);
 
-  // Pass this to getitimer.
+  // Pass this to getitimer().
   static itimerval current_timer_status;
 
   // Get the timer value.
   static void get_timer(Time& time);
 
-  // Pass this to setitimer.
+  // Pass this to setitimer().
   static itimerval signal_once;
 
   // Last time value we set the timer to.
@@ -109,7 +109,7 @@ private:
   // Whether we are changing data that is also changed by the signal handler.
   static volatile bool in_critical_section;
 
-  friend void Parma_Watchdog_Library::PWL_handle_timeout(int signum);
+  friend void PWL_handle_timeout(int signum);
 };
 
 class Init {
diff --git a/Watchdog/src/Watchdog.inlines.hh b/Watchdog/src/Watchdog.inlines.hh
index 00b9878..483a469 100644
--- a/Watchdog/src/Watchdog.inlines.hh
+++ b/Watchdog/src/Watchdog.inlines.hh
@@ -1,11 +1,11 @@
 /* Watchdog and associated classes' implementation: inline functions.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/Watchdog/src/Watchdog.types.hh b/Watchdog/src/Watchdog.types.hh
index bbe1313..c465a71 100644
--- a/Watchdog/src/Watchdog.types.hh
+++ b/Watchdog/src/Watchdog.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/Watchdog/src/pwl.hh.dist b/Watchdog/src/pwl.hh.dist
index 6dc3767..463d7bd 100644
--- a/Watchdog/src/pwl.hh.dist
+++ b/Watchdog/src/pwl.hh.dist
@@ -1,11 +1,11 @@
 /* This is the header file of the Parma Watchdog Library.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,79 +28,132 @@ site: http://www.cs.unipr.it/Software/ . */
 # undef NDEBUG
 #endif
 
-// Automatically generated from PPL source file ../config.h line 1
-/* config.h.  Generated by configure.  */
+// Automatically generated from PPL source file ../pwl-config.h line 1
+#ifndef _PWL_CONFIG_H
+#define _PWL_CONFIG_H 1
+ 
+/* pwl-config.h. Generated automatically at end of configure. */
+/* config.h.  Generated from config.h.in by configure.  */
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
+#ifndef PWL_HAVE_DLFCN_H 
+#define PWL_HAVE_DLFCN_H  1 
+#endif
 
 /* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
+#ifndef PWL_HAVE_INTTYPES_H 
+#define PWL_HAVE_INTTYPES_H  1 
+#endif
 
 /* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
+#ifndef PWL_HAVE_MEMORY_H 
+#define PWL_HAVE_MEMORY_H  1 
+#endif
 
 /* Define to 1 if you have the `setitimer' function. */
-#define HAVE_SETITIMER 1
+#ifndef PWL_HAVE_SETITIMER 
+#define PWL_HAVE_SETITIMER  1 
+#endif
 
 /* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
+#ifndef PWL_HAVE_STDINT_H 
+#define PWL_HAVE_STDINT_H  1 
+#endif
 
 /* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
+#ifndef PWL_HAVE_STDLIB_H 
+#define PWL_HAVE_STDLIB_H  1 
+#endif
 
 /* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
+#ifndef PWL_HAVE_STRINGS_H 
+#define PWL_HAVE_STRINGS_H  1 
+#endif
 
 /* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
+#ifndef PWL_HAVE_STRING_H 
+#define PWL_HAVE_STRING_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
+#ifndef PWL_HAVE_SYS_STAT_H 
+#define PWL_HAVE_SYS_STAT_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
+#ifndef PWL_HAVE_SYS_TIME_H 
+#define PWL_HAVE_SYS_TIME_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
+#ifndef PWL_HAVE_SYS_TYPES_H 
+#define PWL_HAVE_SYS_TYPES_H  1 
+#endif
 
 /* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
+#ifndef PWL_HAVE_UNISTD_H 
+#define PWL_HAVE_UNISTD_H  1 
+#endif
 
-/* Assertions are disabled when this is defined */
-#define NDEBUG 1
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#ifndef PWL_LT_OBJDIR 
+#define PWL_LT_OBJDIR  ".libs/" 
+#endif
 
-/* Name of package */
-#define PACKAGE "watchdog"
+/* Assertions are disabled when this is defined */
+#ifndef PWL_NDEBUG 
+#define PWL_NDEBUG  1 
+#endif
 
 /* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bagnara at cs.unipr.it"
+#ifndef PWL_PACKAGE_BUGREPORT 
+#define PWL_PACKAGE_BUGREPORT  "bagnara at cs.unipr.it" 
+#endif
 
 /* Define to the full name of this package. */
-#define PACKAGE_NAME "the Parma Watchdog Library"
+#ifndef PWL_PACKAGE_NAME 
+#define PWL_PACKAGE_NAME  "the Parma Watchdog Library" 
+#endif
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "the Parma Watchdog Library 0.4"
+#ifndef PWL_PACKAGE_STRING 
+#define PWL_PACKAGE_STRING  "the Parma Watchdog Library 0.6" 
+#endif
 
 /* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "watchdog"
+#ifndef PWL_PACKAGE_TARNAME 
+#define PWL_PACKAGE_TARNAME  "pwl" 
+#endif
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "0.4"
+#ifndef PWL_PACKAGE_VERSION 
+#define PWL_PACKAGE_VERSION  "0.6" 
+#endif
 
 /* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
+#ifndef PWL_STDC_HEADERS 
+#define PWL_STDC_HEADERS  1 
+#endif
 
 /* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Version number of package */
-#define VERSION "0.4"
+#ifndef PWL_TIME_WITH_SYS_TIME 
+#define PWL_TIME_WITH_SYS_TIME  1 
+#endif
 
 /* Define to empty if `const' does not conform to ANSI C. */
 /* #undef const */
-// Automatically generated from PPL source file ../src/Doubly_Linked_Object.types.hh line 1
+
+
+#ifdef PWL_NDEBUG
+# define NDEBUG 1
+#endif
+
+ 
+/* once: _PWL_CONFIG_H */
+#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Doubly_Linked_Object.types.hh line 1
 
 #ifndef PWL_Doubly_Linked_Object_types_hh
 #define PWL_Doubly_Linked_Object_types_hh 1
@@ -112,7 +165,7 @@ class Doubly_Linked_Object;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Doubly_Linked_Object_types_hh)
-// Automatically generated from PPL source file ../src/EList.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList.types.hh line 1
 
 #ifndef PWL_EList_types_hh
 #define PWL_EList_types_hh 1
@@ -125,7 +178,7 @@ class EList;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_EList_types_hh)
-// Automatically generated from PPL source file ../src/EList_Iterator.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList_Iterator.types.hh line 1
 
 #ifndef PWL_EList_Iterator_types_hh
 #define PWL_EList_Iterator_types_hh 1
@@ -138,7 +191,7 @@ class EList_Iterator;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_EList_Iterator_types_hh)
-// Automatically generated from PPL source file ../src/Handler.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Handler.types.hh line 1
 
 #ifndef PWL_Handler_types_hh
 #define PWL_Handler_types_hh 1
@@ -155,7 +208,7 @@ class Handler_Function;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Handler_types_hh)
-// Automatically generated from PPL source file ../src/Pending_Element.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_Element.types.hh line 1
 
 #ifndef PWL_Pending_Element_types_hh
 #define PWL_Pending_Element_types_hh 1
@@ -167,7 +220,7 @@ class Pending_Element;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Pending_Element_types_hh)
-// Automatically generated from PPL source file ../src/Pending_List.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_List.types.hh line 1
 
 #ifndef PWL_Pending_List_types_hh
 #define PWL_Pending_List_types_hh 1
@@ -179,7 +232,7 @@ class Pending_List;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Pending_List_types_hh)
-// Automatically generated from PPL source file ../src/Time.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Time.types.hh line 1
 
 #ifndef PWL_Time_types_hh
 #define PWL_Time_types_hh 1
@@ -191,7 +244,7 @@ class Time;
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Time_types_hh)
-// Automatically generated from PPL source file ../src/Watchdog.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Watchdog.types.hh line 1
 
 #ifndef PWL_Watchdog_types_hh
 #define PWL_Watchdog_types_hh 1
@@ -203,14 +256,14 @@ namespace Parma_Watchdog_Library {
 }
 
 #endif // !defined(PWL_Watchdog_types_hh)
-// Automatically generated from PPL source file ../src/Handler.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Handler.defs.hh line 1
 /* Handler and derived classes' declaration.
 */
 
 #ifndef PWL_Handler_defs_hh
 #define PWL_Handler_defs_hh 1
 
-// Automatically generated from PPL source file ../src/Handler.defs.hh line 27
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Handler.defs.hh line 27
 
 //! Abstract base class for handlers of the watchdog events.
 class Parma_Watchdog_Library::Handler {
@@ -224,7 +277,7 @@ public:
 
 //! A kind of Handler that installs a flag onto a flag-holder.
 /*!
-  The templatic class Handler_Flag<Flag_Base, Flag> is an handler whose
+  The template class Handler_Flag<Flag_Base, Flag> is an handler whose
   job is to install a flag onto an <EM>holder</EM> for the flag.
   The flag is of type \p Flag and the holder is a (volatile) pointer
   to \p Flag_Base.  Installing the flag onto the holder means making
@@ -272,7 +325,7 @@ private:
   void (*f)();
 };
 
-// Automatically generated from PPL source file ../src/Handler.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Handler.inlines.hh line 1
 /* Handler and derived classes' implementation: inline functions.
 */
 
@@ -311,17 +364,17 @@ Handler_Function::act() const {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Handler_inlines_hh)
-// Automatically generated from PPL source file ../src/Handler.defs.hh line 89
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Handler.defs.hh line 89
 
 #endif // !defined(PWL_Handler_defs_hh)
-// Automatically generated from PPL source file ../src/Time.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Time.defs.hh line 1
 /* Time class declaration.
 */
 
 #ifndef PWL_Time_defs_hh
 #define PWL_Time_defs_hh 1
 
-// Automatically generated from PPL source file ../src/Time.defs.hh line 27
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Time.defs.hh line 27
 
 namespace Parma_Watchdog_Library {
 
@@ -404,7 +457,7 @@ private:
   unsigned long microsecs;
 };
 
-// Automatically generated from PPL source file ../src/Time.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Time.inlines.hh line 1
 /* Time class implementation: inline functions.
 */
 
@@ -530,17 +583,17 @@ operator>=(const Time& x, const Time& y) {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Time_inlines_hh)
-// Automatically generated from PPL source file ../src/Time.defs.hh line 110
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Time.defs.hh line 110
 
 #endif // !defined(PWL_Time_defs_hh)
-// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Doubly_Linked_Object.defs.hh line 1
 /* Doubly_Linked_Object class declaration.
 */
 
 #ifndef PWL_Doubly_Linked_Object_defs_hh
 #define PWL_Doubly_Linked_Object_defs_hh 1
 
-// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 29
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Doubly_Linked_Object.defs.hh line 29
 
 //! A (base) class for doubly linked objects.
 class Parma_Watchdog_Library::Doubly_Linked_Object {
@@ -574,7 +627,7 @@ private:
   template <typename T> friend class EList_Iterator;
 };
 
-// Automatically generated from PPL source file ../src/Doubly_Linked_Object.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Doubly_Linked_Object.inlines.hh line 1
 /* Doubly_Linked_Object class implementation: inline functions.
 */
 
@@ -625,17 +678,17 @@ Doubly_Linked_Object::~Doubly_Linked_Object() {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Doubly_Linked_Object_inlines_hh)
-// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 63
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Doubly_Linked_Object.defs.hh line 63
 
 #endif // !defined(PWL_Doubly_Linked_Object_defs_hh)
-// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList_Iterator.defs.hh line 1
 /* EList_Iterator class declaration.
 */
 
 #ifndef PWL_EList_Iterator_defs_hh
 #define PWL_EList_Iterator_defs_hh 1
 
-// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 28
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList_Iterator.defs.hh line 28
 
 namespace Parma_Watchdog_Library {
 
@@ -689,14 +742,14 @@ private:
   friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
 };
 
-// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList_Iterator.inlines.hh line 1
 /* EList_Iterator class implementation: inline functions.
 */
 
 #ifndef PWL_EList_Iterator_inlines_hh
 #define PWL_EList_Iterator_inlines_hh 1
 
-// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 27
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList_Iterator.inlines.hh line 27
 
 namespace Parma_Watchdog_Library {
 
@@ -775,17 +828,17 @@ operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_EList_Iterator_inlines_hh)
-// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 82
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList_Iterator.defs.hh line 82
 
 #endif // !defined(PWL_EList_Iterator_defs_hh)
-// Automatically generated from PPL source file ../src/EList.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList.defs.hh line 1
 /* EList class declaration.
 */
 
 #ifndef PWL_EList_defs_hh
 #define PWL_EList_defs_hh 1
 
-// Automatically generated from PPL source file ../src/EList.defs.hh line 28
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList.defs.hh line 28
 
 /*! \brief
   A simple kind of embedded list (i.e., a doubly linked objects
@@ -813,7 +866,7 @@ public:
   void push_back(T& obj);
 
   /*! \brief
-    Inserts \p obj jyst before \p position and returns an iterator
+    Inserts \p obj just before \p position and returns an iterator
     that points to the inserted object.
   */
   Iterator insert(Iterator position, T& obj);
@@ -843,7 +896,7 @@ public:
   bool OK() const;
 };
 
-// Automatically generated from PPL source file ../src/EList.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList.inlines.hh line 1
 /* EList class implementation: inline functions.
 */
 
@@ -937,23 +990,23 @@ EList<T>::OK() const {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_EList_inlines_hh)
-// Automatically generated from PPL source file ../src/EList.defs.hh line 86
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/EList.defs.hh line 86
 
 #endif // !defined(PWL_EList_defs_hh)
-// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_Element.defs.hh line 1
 /* Pending_Element class declaration.
 */
 
 #ifndef PWL_Pending_Element_defs_hh
 #define PWL_Pending_Element_defs_hh 1
 
-// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 30
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_Element.defs.hh line 30
 
 //! A class for pending watchdog events with embedded links.
 /*!
   Each pending watchdog event is characterized by a deadline (a positive
   time interval), an associated handler that will be invoked upon event
-  expiration, and a boolean flag that indicates whether the event has already
+  expiration, and a Boolean flag that indicates whether the event has already
   expired or not.
 */
 class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object {
@@ -991,7 +1044,7 @@ private:
   bool* p_f;
 };
 
-// Automatically generated from PPL source file ../src/Pending_Element.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_Element.inlines.hh line 1
 /* Pending_Element class implementation: inline functions.
 */
 
@@ -1036,17 +1089,17 @@ Pending_Element::expired_flag() const {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Pending_Element_inlines_hh)
-// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 74
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_Element.defs.hh line 74
 
 #endif // !defined(PWL_Pending_Element_defs_hh)
-// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_List.defs.hh line 1
 /* Pending_List class declaration.
 */
 
 #ifndef PWL_Pending_List_defs_hh
 #define PWL_Pending_List_defs_hh 1
 
-// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 31
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_List.defs.hh line 31
 
 //! An ordered list for recording pending watchdog events.
 class Parma_Watchdog_Library::Pending_List {
@@ -1088,7 +1141,7 @@ private:
   EList<Pending_Element> free_list;
 };
 
-// Automatically generated from PPL source file ../src/Pending_List.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_List.inlines.hh line 1
 /* Pending_List class implementation: inline functions.
 */
 
@@ -1135,20 +1188,20 @@ Pending_List::erase(Iterator position) {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Pending_List_inlines_hh)
-// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 73
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Pending_List.defs.hh line 73
 
 #endif // !defined(PWL_Pending_List_defs_hh)
-// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Watchdog.defs.hh line 1
 /* Watchdog and associated classes' declaration and inline functions.
 */
 
 #ifndef PWL_Watchdog_defs_hh
 #define PWL_Watchdog_defs_hh 1
 
-// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 30
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Watchdog.defs.hh line 30
 #include <cassert>
 
-#ifdef HAVE_SYS_TIME_H
+#ifdef PWL_HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
@@ -1181,13 +1234,13 @@ private:
   Watchdog(const Watchdog&);
   Watchdog& operator=(const Watchdog&);
 
-  // Pass this to getitimer.
+  // Pass this to getitimer().
   static itimerval current_timer_status;
 
   // Get the timer value.
   static void get_timer(Time& time);
 
-  // Pass this to setitimer.
+  // Pass this to setitimer().
   static itimerval signal_once;
 
   // Last time value we set the timer to.
@@ -1228,7 +1281,7 @@ private:
   // Whether we are changing data that is also changed by the signal handler.
   static volatile bool in_critical_section;
 
-  friend void Parma_Watchdog_Library::PWL_handle_timeout(int signum);
+  friend void PWL_handle_timeout(int signum);
 };
 
 class Init {
@@ -1246,7 +1299,7 @@ public:
 
 } // namespace Parma_Watchdog_Library
 
-// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Watchdog.inlines.hh line 1
 /* Watchdog and associated classes' implementation: inline functions.
 */
 
@@ -1255,7 +1308,7 @@ public:
 
 #include <stdexcept>
 
-// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 29
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Watchdog.inlines.hh line 29
 
 namespace Parma_Watchdog_Library {
 
@@ -1308,7 +1361,7 @@ Init::~Init() {
 } // namespace Parma_Watchdog_Library
 
 #endif // !defined(PWL_Watchdog_inlines_hh)
-// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 131
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/Watchdog/src/Watchdog.defs.hh line 131
 
 namespace {
 
@@ -1320,19 +1373,15 @@ Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer;
 
 
 #ifdef PWL_SAVE_NDEBUG
-# define NDEBUG 1
+# ifndef NDEBUG
+#  define NDEBUG 1
+# endif
 # undef PWL_SAVE_NDEBUG
 #else
-# undef NDEBUG
+# ifdef NDEBUG
+#  undef NDEBUG
+# endif
 #endif
 #include <cassert>
 
-#undef PACKAGE
-#undef PACKAGE_BUGREPORT
-#undef PACKAGE_NAME
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-#undef VERSION
-
 #endif
diff --git a/Watchdog/src/pwl_header.hh b/Watchdog/src/pwl_header.hh
index 69eef10..51ead61 100644
--- a/Watchdog/src/pwl_header.hh
+++ b/Watchdog/src/pwl_header.hh
@@ -1,11 +1,11 @@
 /* This is the header file of the Parma Watchdog Library.
-   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Watchdog Library (PWL).
 
 The PWL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,23 +28,19 @@ site: http://www.cs.unipr.it/Software/ . */
 # undef NDEBUG
 #endif
 
-#include "config.h"
+#include "pwl-config.h"
 #include "pwl_include_files.hh"
 
 #ifdef PWL_SAVE_NDEBUG
-# define NDEBUG 1
+# ifndef NDEBUG
+#  define NDEBUG 1
+# endif
 # undef PWL_SAVE_NDEBUG
 #else
-# undef NDEBUG
+# ifdef NDEBUG
+#  undef NDEBUG
+# endif
 #endif
 #include <cassert>
 
-#undef PACKAGE
-#undef PACKAGE_BUGREPORT
-#undef PACKAGE_NAME
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-#undef VERSION
-
 #endif
diff --git a/Watchdog/utils/Makefile.am b/Watchdog/utils/Makefile.am
index 6fc0edc..f71376b 100644
--- a/Watchdog/utils/Makefile.am
+++ b/Watchdog/utils/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,7 +38,7 @@ do not modify; modify the .in file instead.
 do_subst = sed -e 's,[@]PERL[@],$(PERL),g' \
 	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
 
-build_header: build_header.in Makefile
+build_header: build_header.in
 	$(do_subst) < $(srcdir)/build_header.in > build_header
 	chmod +x build_header
 
diff --git a/Watchdog/utils/Makefile.in b/Watchdog/utils/Makefile.in
index 89fc943..6dca2e5 100644
--- a/Watchdog/utils/Makefile.in
+++ b/Watchdog/utils/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Watchdog Library.
-# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Watchdog Library (PWL).
 #
 # The PWL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PWL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the CS at Parma software
 # site: http://www.cs.unipr.it/Software/ . */
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,10 @@ subdir = utils
 DIST_COMMON = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
@@ -73,21 +72,15 @@ SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
 CXXCPP = @CXXCPP@
@@ -96,32 +89,37 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -131,23 +129,18 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -159,29 +152,41 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
 dist_noinst_SCRIPTS = \
 build_header.in
 
@@ -233,10 +238,6 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 tags: TAGS
 TAGS:
 
@@ -245,22 +246,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -309,7 +309,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -323,12 +323,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -347,17 +355,21 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
 	dist-hook distclean distclean-generic distclean-libtool \
 	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
 	install-strip installcheck installcheck-am installdirs \
 	maintainer-clean maintainer-clean-generic mostlyclean \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	uninstall uninstall-am uninstall-info-am
+	uninstall uninstall-am
 
 
 # Even if the scripts listed in noinst_SCRIPTS are not distributed
@@ -366,7 +378,7 @@ uninstall-am: uninstall-info-am
 # we came up with to obtain this effect.
 dist-hook: $(noinst_SCRIPTS)
 
-build_header: build_header.in Makefile
+build_header: build_header.in
 	$(do_subst) < $(srcdir)/build_header.in > build_header
 	chmod +x build_header
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/Watchdog/utils/build_header.in b/Watchdog/utils/build_header.in
index 4ebe2f3..178cea1 100644
--- a/Watchdog/utils/build_header.in
+++ b/Watchdog/utils/build_header.in
@@ -6,13 +6,13 @@ eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
     if 0;
 
 # Builds a self-contained C++ header file by performing recursive inclusion.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/aclocal.m4 b/aclocal.m4
index dccda82..4f912bf 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005  Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008  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.
@@ -11,6384 +11,15 @@
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(AC_AUTOCONF_VERSION, [2.61],,
+[m4_warning([this file was generated for autoconf 2.61.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# serial 48 AC_PROG_LIBTOOL
-
-
-# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
-# -----------------------------------------------------------
-# If this macro is not defined by Autoconf, define it here.
-m4_ifdef([AC_PROVIDE_IFELSE],
-         [],
-         [m4_define([AC_PROVIDE_IFELSE],
-	         [m4_ifdef([AC_PROVIDE_$1],
-		           [$2], [$3])])])
-
-
-# AC_PROG_LIBTOOL
-# ---------------
-AC_DEFUN([AC_PROG_LIBTOOL],
-[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
-dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
-dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
-  AC_PROVIDE_IFELSE([AC_PROG_CXX],
-    [AC_LIBTOOL_CXX],
-    [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
-  ])])
-dnl And a similar setup for Fortran 77 support
-  AC_PROVIDE_IFELSE([AC_PROG_F77],
-    [AC_LIBTOOL_F77],
-    [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
-])])
-
-dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
-dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
-dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
-  AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-    [AC_LIBTOOL_GCJ],
-    [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-      [AC_LIBTOOL_GCJ],
-      [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
-	[AC_LIBTOOL_GCJ],
-      [ifdef([AC_PROG_GCJ],
-	     [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-       ifdef([A][M_PROG_GCJ],
-	     [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-       ifdef([LT_AC_PROG_GCJ],
-	     [define([LT_AC_PROG_GCJ],
-		defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
-])])# AC_PROG_LIBTOOL
-
-
-# _AC_PROG_LIBTOOL
-# ----------------
-AC_DEFUN([_AC_PROG_LIBTOOL],
-[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-# Prevent multiple expansion
-define([AC_PROG_LIBTOOL], [])
-])# _AC_PROG_LIBTOOL
-
-
-# AC_LIBTOOL_SETUP
-# ----------------
-AC_DEFUN([AC_LIBTOOL_SETUP],
-[AC_PREREQ(2.50)dnl
-AC_REQUIRE([AC_ENABLE_SHARED])dnl
-AC_REQUIRE([AC_ENABLE_STATIC])dnl
-AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_LD])dnl
-AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
-AC_REQUIRE([AC_PROG_NM])dnl
-
-AC_REQUIRE([AC_PROG_LN_S])dnl
-AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
-# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
-AC_REQUIRE([AC_OBJEXT])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-dnl
-
-AC_LIBTOOL_SYS_MAX_CMD_LEN
-AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-AC_LIBTOOL_OBJDIR
-
-AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-_LT_AC_PROG_ECHO_BACKSLASH
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
-
-# Same as above, but do not quote variable references.
-[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-AC_CHECK_TOOL(AR, ar, false)
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-AC_CHECK_TOOL(STRIP, strip, :)
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$SED" && SED=sed
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    AC_PATH_MAGIC
-  fi
-  ;;
-esac
-
-AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
-AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
-enable_win32_dll=yes, enable_win32_dll=no)
-
-AC_ARG_ENABLE([libtool-lock],
-    [AC_HELP_STRING([--disable-libtool-lock],
-	[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-AC_ARG_WITH([pic],
-    [AC_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-test -z "$pic_mode" && pic_mode=default
-
-# Use C for the default configuration in the libtool script
-tagname=
-AC_LIBTOOL_LANG_C_CONFIG
-_LT_AC_TAGCONFIG
-])# AC_LIBTOOL_SETUP
-
-
-# _LT_AC_SYS_COMPILER
-# -------------------
-AC_DEFUN([_LT_AC_SYS_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_AC_SYS_COMPILER
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-AC_DEFUN([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-])
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-AC_DEFUN([_LT_COMPILER_BOILERPLATE],
-[ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-AC_DEFUN([_LT_LINKER_BOILERPLATE],
-[ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
-])# _LT_LINKER_BOILERPLATE
-
-
-# _LT_AC_SYS_LIBPATH_AIX
-# ----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
-[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_AC_SYS_LIBPATH_AIX
-
-
-# _LT_AC_SHELL_INIT(ARG)
-# ----------------------
-AC_DEFUN([_LT_AC_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-	 [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_AC_SHELL_INIT
-
-
-# _LT_AC_PROG_ECHO_BACKSLASH
-# --------------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
-[_LT_AC_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-echo=${ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-[$]*
-EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
-  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
-       echo_test_string=`eval $cmd` &&
-       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
-    then
-      break
-    fi
-  done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-   test "X$echo_testing_string" = "X$echo_test_string"; then
-  :
-else
-  # The Solaris, AIX, and Digital Unix default echo programs unquote
-  # backslashes.  This makes it impossible to quote backslashes using
-  #   echo "$something" | sed 's/\\/\\\\/g'
-  #
-  # So, first we look for a working echo in the user's PATH.
-
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for dir in $PATH /usr/ucb; do
-    IFS="$lt_save_ifs"
-    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      echo="$dir/echo"
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  if test "X$echo" = Xecho; then
-    # We didn't find a better echo, so look for alternatives.
-    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      # This shell has a builtin print -r that does the trick.
-      echo='print -r'
-    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-	 test "X$CONFIG_SHELL" != X/bin/ksh; then
-      # If we have ksh, try running configure again with it.
-      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-      export ORIGINAL_CONFIG_SHELL
-      CONFIG_SHELL=/bin/ksh
-      export CONFIG_SHELL
-      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-    else
-      # Try using printf.
-      echo='printf %s\n'
-      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-	 test "X$echo_testing_string" = "X$echo_test_string"; then
-	# Cool, printf works
-	:
-      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	export CONFIG_SHELL
-	SHELL="$CONFIG_SHELL"
-	export SHELL
-	echo="$CONFIG_SHELL [$]0 --fallback-echo"
-      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	echo="$CONFIG_SHELL [$]0 --fallback-echo"
-      else
-	# maybe with a smaller string...
-	prev=:
-
-	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
-	  then
-	    break
-	  fi
-	  prev="$cmd"
-	done
-
-	if test "$prev" != 'sed 50q "[$]0"'; then
-	  echo_test_string=`eval $prev`
-	  export echo_test_string
-	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-	else
-	  # Oops.  We lost completely, so just stick with echo.
-	  echo=echo
-	fi
-      fi
-    fi
-  fi
-fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(ECHO)
-])])# _LT_AC_PROG_ECHO_BACKSLASH
-
-
-# _LT_AC_LOCK
-# -----------
-AC_DEFUN([_LT_AC_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-    [AC_HELP_STRING([--disable-libtool-lock],
-	[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *ELF-32*)
-      HPUX_IA64_MODE="32"
-      ;;
-    *ELF-64*)
-      HPUX_IA64_MODE="64"
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-   if test "$lt_cv_prog_gnu_ld" = yes; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -melf32bsmip"
-      ;;
-    *N32*)
-      LD="${LD-ld} -melf32bmipn32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -melf64bmip"
-      ;;
-    esac
-   else
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -32"
-      ;;
-    *N32*)
-      LD="${LD-ld} -n32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -64"
-      ;;
-    esac
-   fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *32-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_i386"
-          ;;
-        ppc64-*linux*|powerpc64-*linux*)
-          LD="${LD-ld} -m elf32ppclinux"
-          ;;
-        s390x-*linux*)
-          LD="${LD-ld} -m elf_s390"
-          ;;
-        sparc64-*linux*)
-          LD="${LD-ld} -m elf32_sparc"
-          ;;
-      esac
-      ;;
-    *64-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        ppc*-*linux*|powerpc*-*linux*)
-          LD="${LD-ld} -m elf64ppc"
-          ;;
-        s390*-*linux*)
-          LD="${LD-ld} -m elf64_s390"
-          ;;
-        sparc*-*linux*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)    LD="${LD-ld} -64" ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
-[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-  ])
-esac
-
-need_locks="$enable_libtool_lock"
-
-])# _LT_AC_LOCK
-
-
-# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
-[AC_REQUIRE([LT_AC_PROG_SED])
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-  ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $rm conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    ifelse([$5], , :, [$5])
-else
-    ifelse([$6], , :, [$6])
-fi
-])# AC_LIBTOOL_COMPILER_OPTION
-
-
-# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                          [ACTION-SUCCESS], [ACTION-FAILURE])
-# ------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
-[AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    ifelse([$4], , :, [$4])
-else
-    ifelse([$5], , :, [$5])
-fi
-])# AC_LIBTOOL_LINKER_OPTION
-
-
-# AC_LIBTOOL_SYS_MAX_CMD_LEN
-# --------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
-[# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ 	]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    # If test is not a shell built-in, we'll probably end up computing a
-    # maximum length that is only half of the actual maximum length, but
-    # we can't tell.
-    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-    while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
-	       = "XX$teststring") >/dev/null 2>&1 &&
-	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
-	    lt_cv_sys_max_cmd_len=$new_result &&
-	    test $i != 17 # 1/2 MB should be enough
-    do
-      i=`expr $i + 1`
-      teststring=$teststring$teststring
-    done
-    teststring=
-    # Add a significant safety factor because C++ compilers can tack on massive
-    # amounts of additional arguments before passing them to the linker.
-    # It appears as though 1/2 is a usable value.
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-])# AC_LIBTOOL_SYS_MAX_CMD_LEN
-
-
-# _LT_AC_CHECK_DLFCN
-# ------------------
-AC_DEFUN([_LT_AC_CHECK_DLFCN],
-[AC_CHECK_HEADERS(dlfcn.h)dnl
-])# _LT_AC_CHECK_DLFCN
-
-
-# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ---------------------------------------------------------------------
-AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
-[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-    exit (status);
-}]
-EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_AC_TRY_DLOPEN_SELF
-
-
-# AC_LIBTOOL_DLOPEN_SELF
-# ----------------------
-AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
-[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-   ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-   ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-   ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_AC_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-    	  lt_cv_dlopen_self_static, [dnl
-	  _LT_AC_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-])# AC_LIBTOOL_DLOPEN_SELF
-
-
-# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
-# ---------------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler
-AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
-[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
-])
-])# AC_LIBTOOL_PROG_CC_C_O
-
-
-# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
-# -----------------------------------------
-# Check to see if we can do hard links to lock some files if needed
-AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
-[AC_REQUIRE([_LT_AC_LOCK])dnl
-
-hard_links="nottested"
-if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
-
-
-# AC_LIBTOOL_OBJDIR
-# -----------------
-AC_DEFUN([AC_LIBTOOL_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-])# AC_LIBTOOL_OBJDIR
-
-
-# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
-# ----------------------------------------------
-# Check hardcoding attributes.
-AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_AC_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
-   test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
-   test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_AC_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_AC_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
-
-
-# AC_LIBTOOL_SYS_LIB_STRIP
-# ------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
-[striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-   darwin*)
-       if test -n "$STRIP" ; then
-         striplib="$STRIP -x"
-         AC_MSG_RESULT([yes])
-       else
-  AC_MSG_RESULT([no])
-fi
-       ;;
-   *)
-  AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-])# AC_LIBTOOL_SYS_LIB_STRIP
-
-
-# AC_LIBTOOL_SYS_DYNAMIC_LINKER
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
-[AC_MSG_CHECKING([dynamic linker characteristics])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
-
-
-# _LT_AC_TAGCONFIG
-# ----------------
-AC_DEFUN([_LT_AC_TAGCONFIG],
-[AC_ARG_WITH([tags],
-    [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
-        [include additional configurations @<:@automatic@:>@])],
-    [tagnames="$withval"])
-
-if test -f "$ltmain" && test -n "$tagnames"; then
-  if test ! -f "${ofile}"; then
-    AC_MSG_WARN([output file `$ofile' does not exist])
-  fi
-
-  if test -z "$LTCC"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
-    if test -z "$LTCC"; then
-      AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
-    else
-      AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
-    fi
-  fi
-  if test -z "$LTCFLAGS"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
-  fi
-
-  # Extract list of available tagged configurations in $ofile.
-  # Note that this assumes the entire list is on one line.
-  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
-
-  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-  for tagname in $tagnames; do
-    IFS="$lt_save_ifs"
-    # Check whether tagname contains only valid characters
-    case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
-    "") ;;
-    *)  AC_MSG_ERROR([invalid tag name: $tagname])
-	;;
-    esac
-
-    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
-    then
-      AC_MSG_ERROR([tag name \"$tagname\" already exists])
-    fi
-
-    # Update the list of available tags.
-    if test -n "$tagname"; then
-      echo appending configuration tag \"$tagname\" to $ofile
-
-      case $tagname in
-      CXX)
-	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-	    (test "X$CXX" != "Xg++"))) ; then
-	  AC_LIBTOOL_LANG_CXX_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      F77)
-	if test -n "$F77" && test "X$F77" != "Xno"; then
-	  AC_LIBTOOL_LANG_F77_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      GCJ)
-	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
-	  AC_LIBTOOL_LANG_GCJ_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      RC)
-	AC_LIBTOOL_LANG_RC_CONFIG
-	;;
-
-      *)
-	AC_MSG_ERROR([Unsupported tag name: $tagname])
-	;;
-      esac
-
-      # Append the new tag name to the list of available tags.
-      if test -n "$tagname" ; then
-      available_tags="$available_tags $tagname"
-    fi
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  # Now substitute the updated list of available tags.
-  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
-    mv "${ofile}T" "$ofile"
-    chmod +x "$ofile"
-  else
-    rm -f "${ofile}T"
-    AC_MSG_ERROR([unable to update list of available tagged configurations.])
-  fi
-fi
-])# _LT_AC_TAGCONFIG
-
-
-# AC_LIBTOOL_DLOPEN
-# -----------------
-# enable checks for dlopen support
-AC_DEFUN([AC_LIBTOOL_DLOPEN],
- [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
-])# AC_LIBTOOL_DLOPEN
-
-
-# AC_LIBTOOL_WIN32_DLL
-# --------------------
-# declare package support for building win32 DLLs
-AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
-])# AC_LIBTOOL_WIN32_DLL
-
-
-# AC_ENABLE_SHARED([DEFAULT])
-# ---------------------------
-# implement the --enable-shared flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_SHARED],
-[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([shared],
-    [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
-])# AC_ENABLE_SHARED
-
-
-# AC_DISABLE_SHARED
-# -----------------
-# set the default shared flag to --disable-shared
-AC_DEFUN([AC_DISABLE_SHARED],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_SHARED(no)
-])# AC_DISABLE_SHARED
-
-
-# AC_ENABLE_STATIC([DEFAULT])
-# ---------------------------
-# implement the --enable-static flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_STATIC],
-[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([static],
-    [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]AC_ENABLE_STATIC_DEFAULT)
-])# AC_ENABLE_STATIC
-
-
-# AC_DISABLE_STATIC
-# -----------------
-# set the default static flag to --disable-static
-AC_DEFUN([AC_DISABLE_STATIC],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_STATIC(no)
-])# AC_DISABLE_STATIC
-
-
-# AC_ENABLE_FAST_INSTALL([DEFAULT])
-# ---------------------------------
-# implement the --enable-fast-install flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_FAST_INSTALL],
-[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([fast-install],
-    [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
-])# AC_ENABLE_FAST_INSTALL
-
-
-# AC_DISABLE_FAST_INSTALL
-# -----------------------
-# set the default to --disable-fast-install
-AC_DEFUN([AC_DISABLE_FAST_INSTALL],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_FAST_INSTALL(no)
-])# AC_DISABLE_FAST_INSTALL
-
-
-# AC_LIBTOOL_PICMODE([MODE])
-# --------------------------
-# implement the --with-pic flag
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-AC_DEFUN([AC_LIBTOOL_PICMODE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-pic_mode=ifelse($#,1,$1,default)
-])# AC_LIBTOOL_PICMODE
-
-
-# AC_PROG_EGREP
-# -------------
-# This is predefined starting with Autoconf 2.54, so this conditional
-# definition can be removed once we require Autoconf 2.54 or later.
-m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
-[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
-   [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi])
- EGREP=$ac_cv_prog_egrep
- AC_SUBST([EGREP])
-])])
-
-
-# AC_PATH_TOOL_PREFIX
-# -------------------
-# find a file program which can recognise shared library
-AC_DEFUN([AC_PATH_TOOL_PREFIX],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="ifelse([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-])# AC_PATH_TOOL_PREFIX
-
-
-# AC_PATH_MAGIC
-# -------------
-# find a file program which can recognise a shared library
-AC_DEFUN([AC_PATH_MAGIC],
-[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# AC_PATH_MAGIC
-
-
-# AC_PROG_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([AC_PROG_LD],
-[AC_ARG_WITH([gnu-ld],
-    [AC_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])
-AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_PROG_LD_GNU
-])# AC_PROG_LD
-
-
-# AC_PROG_LD_GNU
-# --------------
-AC_DEFUN([AC_PROG_LD_GNU],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# AC_PROG_LD_GNU
-
-
-# AC_PROG_LD_RELOAD_FLAG
-# ----------------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-])# AC_PROG_LD_RELOAD_FLAG
-
-
-# AC_DEPLIBS_CHECK_METHOD
-# -----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
-[AC_CACHE_CHECK([how to recognise dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix4* | aix5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
-  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | kfreebsd*-gnu | dragonfly*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix3*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-nto-qnx*)
-  lt_cv_deplibs_check_method=unknown
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-])# AC_DEPLIBS_CHECK_METHOD
-
-
-# AC_PROG_NM
-# ----------
-# find the pathname to a BSD-compatible name lister
-AC_DEFUN([AC_PROG_NM],
-[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then 
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi])
-NM="$lt_cv_path_NM"
-])# AC_PROG_NM
-
-
-# AC_CHECK_LIBM
-# -------------
-# check for math library
-AC_DEFUN([AC_CHECK_LIBM],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-])# AC_CHECK_LIBM
-
-
-# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl convenience library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-convenience to the configure arguments.  Note that
-# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
-# it is assumed to be `libltdl'.  LIBLTDL will be prefixed with
-# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
-# (note the single quotes!).  If your package is not flat and you're not
-# using automake, define top_builddir and top_srcdir appropriately in
-# the Makefiles.
-AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  case $enable_ltdl_convenience in
-  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
-  "") enable_ltdl_convenience=yes
-      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
-  esac
-  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
-  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-  # For backwards non-gettext consistent compatibility...
-  INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_CONVENIENCE
-
-
-# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl installable library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-install to the configure arguments.  Note that
-# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
-# and an installed libltdl is not found, it is assumed to be `libltdl'.
-# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
-# '${top_srcdir}/' (note the single quotes!).  If your package is not
-# flat and you're not using automake, define top_builddir and top_srcdir
-# appropriately in the Makefiles.
-# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
-AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  AC_CHECK_LIB(ltdl, lt_dlinit,
-  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
-  [if test x"$enable_ltdl_install" = xno; then
-     AC_MSG_WARN([libltdl not installed, but installation disabled])
-   else
-     enable_ltdl_install=yes
-   fi
-  ])
-  if test x"$enable_ltdl_install" = x"yes"; then
-    ac_configure_args="$ac_configure_args --enable-ltdl-install"
-    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
-    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-  else
-    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
-    LIBLTDL="-lltdl"
-    LTDLINCL=
-  fi
-  # For backwards non-gettext consistent compatibility...
-  INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_INSTALLABLE
-
-
-# AC_LIBTOOL_CXX
-# --------------
-# enable support for C++ libraries
-AC_DEFUN([AC_LIBTOOL_CXX],
-[AC_REQUIRE([_LT_AC_LANG_CXX])
-])# AC_LIBTOOL_CXX
-
-
-# _LT_AC_LANG_CXX
-# ---------------
-AC_DEFUN([_LT_AC_LANG_CXX],
-[AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([_LT_AC_PROG_CXXCPP])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
-])# _LT_AC_LANG_CXX
-
-# _LT_AC_PROG_CXXCPP
-# ------------------
-AC_DEFUN([_LT_AC_PROG_CXXCPP],
-[
-AC_REQUIRE([AC_PROG_CXX])
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-fi
-])# _LT_AC_PROG_CXXCPP
-
-# AC_LIBTOOL_F77
-# --------------
-# enable support for Fortran 77 libraries
-AC_DEFUN([AC_LIBTOOL_F77],
-[AC_REQUIRE([_LT_AC_LANG_F77])
-])# AC_LIBTOOL_F77
-
-
-# _LT_AC_LANG_F77
-# ---------------
-AC_DEFUN([_LT_AC_LANG_F77],
-[AC_REQUIRE([AC_PROG_F77])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
-])# _LT_AC_LANG_F77
-
-
-# AC_LIBTOOL_GCJ
-# --------------
-# enable support for GCJ libraries
-AC_DEFUN([AC_LIBTOOL_GCJ],
-[AC_REQUIRE([_LT_AC_LANG_GCJ])
-])# AC_LIBTOOL_GCJ
-
-
-# _LT_AC_LANG_GCJ
-# ---------------
-AC_DEFUN([_LT_AC_LANG_GCJ],
-[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
-    [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
-      [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
-	 [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
-	   [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
-])# _LT_AC_LANG_GCJ
-
-
-# AC_LIBTOOL_RC
-# -------------
-# enable support for Windows resource files
-AC_DEFUN([AC_LIBTOOL_RC],
-[AC_REQUIRE([LT_AC_PROG_RC])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
-])# AC_LIBTOOL_RC
-
-
-# AC_LIBTOOL_LANG_C_CONFIG
-# ------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
-AC_DEFUN([_LT_AC_LANG_C_CONFIG],
-[lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}\n'
-
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-AC_LIBTOOL_SYS_LIB_STRIP
-AC_LIBTOOL_DLOPEN_SELF
-
-# Report which library types will actually be built
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-    ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_C_CONFIG
-
-
-# AC_LIBTOOL_LANG_CXX_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
-AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
-[AC_LANG_PUSH(C++)
-AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([_LT_AC_PROG_CXXCPP])
-
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_AC_TAGVAR(allow_undefined_flag, $1)=
-_LT_AC_TAGVAR(always_export_symbols, $1)=no
-_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_direct, $1)=no
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_AC_TAGVAR(hardcode_automatic, $1)=no
-_LT_AC_TAGVAR(module_cmds, $1)=
-_LT_AC_TAGVAR(module_expsym_cmds, $1)=
-_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_AC_TAGVAR(no_undefined_flag, $1)=
-_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Dependencies to place before and after the object being linked:
-_LT_AC_TAGVAR(predep_objects, $1)=
-_LT_AC_TAGVAR(postdep_objects, $1)=
-_LT_AC_TAGVAR(predeps, $1)=
-_LT_AC_TAGVAR(postdeps, $1)=
-_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_LD=$LD
-lt_save_GCC=$GCC
-GCC=$GXX
-lt_save_with_gnu_ld=$with_gnu_ld
-lt_save_path_LD=$lt_cv_path_LD
-if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-else
-  $as_unset lt_cv_prog_gnu_ld
-fi
-if test -n "${lt_cv_path_LDCXX+set}"; then
-  lt_cv_path_LD=$lt_cv_path_LDCXX
-else
-  $as_unset lt_cv_path_LD
-fi
-test -z "${LDCXX+set}" || LD=$LDCXX
-CC=${CXX-"c++"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-# We don't want -fno-exception wen compiling C++ code, so set the
-# no_builtin_flag separately
-if test "$GXX" = yes; then
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-else
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-fi
-
-if test "$GXX" = yes; then
-  # Set up default GNU C++ configuration
-
-  AC_PROG_LD
-
-  # Check if GNU C++ uses GNU ld as the underlying linker, since the
-  # archiving commands below assume that GNU ld is being used.
-  if test "$with_gnu_ld" = yes; then
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-    #     investigate it a little bit more. (MM)
-    wlarc='${wl}'
-
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
-	grep 'no-whole-archive' > /dev/null; then
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    with_gnu_ld=no
-    wlarc=
-
-    # A generic and very simple default shared library creation
-    # command for GNU C++ for the case where it uses the native
-    # linker, instead of GNU ld.  If possible, this setting should
-    # overridden to take advantage of the native linker features on
-    # the platform it is being used on.
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-  fi
-
-  # Commands to make compiler produce verbose output that lists
-  # what "hidden" libraries, object files and flags are used when
-  # linking a shared library.
-  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-else
-  GXX=no
-  with_gnu_ld=no
-  wlarc=
-fi
-
-# PORTME: fill in a description of your system's C++ link characteristics
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-_LT_AC_TAGVAR(ld_shlibs, $1)=yes
-case $host_os in
-  aix3*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  aix4* | aix5*)
-    if test "$host_cpu" = ia64; then
-      # On IA64, the linker does run time linking by default, so we don't
-      # have to do anything special.
-      aix_use_runtimelinking=no
-      exp_sym_flag='-Bexport'
-      no_entry_flag=""
-    else
-      aix_use_runtimelinking=no
-
-      # Test if we are trying to use run time linking or normal
-      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-      # need to do runtime linking.
-      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
-	for ld_flag in $LDFLAGS; do
-	  case $ld_flag in
-	  *-brtl*)
-	    aix_use_runtimelinking=yes
-	    break
-	    ;;
-	  esac
-	done
-	;;
-      esac
-
-      exp_sym_flag='-bexport'
-      no_entry_flag='-bnoentry'
-    fi
-
-    # When large executables or shared objects are built, AIX ld can
-    # have problems creating the table of contents.  If linking a library
-    # or program results in "error TOC overflow" add -mminimal-toc to
-    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-    _LT_AC_TAGVAR(archive_cmds, $1)=''
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-    if test "$GXX" = yes; then
-      case $host_os in aix4.[[012]]|aix4.[[012]].*)
-      # We only want to do this on AIX 4.2 and lower, the check
-      # below for broken collect2 doesn't work under 4.3+
-	collect2name=`${CC} -print-prog-name=collect2`
-	if test -f "$collect2name" && \
-	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	then
-	  # We have reworked collect2
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	else
-	  # We have old collect2
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-	fi
-	;;
-      esac
-      shared_flag='-shared'
-      if test "$aix_use_runtimelinking" = yes; then
-	shared_flag="$shared_flag "'${wl}-G'
-      fi
-    else
-      # not using gcc
-      if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	shared_flag='-G'
-      else
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag='${wl}-G'
-	else
-	  shared_flag='${wl}-bM:SRE'
-	fi
-      fi
-    fi
-
-    # It seems that -bexpall does not export symbols beginning with
-    # underscore (_), so it is better to generate a list of symbols to export.
-    _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-    if test "$aix_use_runtimelinking" = yes; then
-      # Warning - without using the other runtime loading flags (-brtl),
-      # -berok will link without error, but may produce a broken library.
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
-      # Determine the default libpath from the value encoded in an empty executable.
-      _LT_AC_SYS_LIBPATH_AIX
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-     else
-      if test "$host_cpu" = ia64; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-      else
-	# Determine the default libpath from the value encoded in an empty executable.
-	_LT_AC_SYS_LIBPATH_AIX
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	# Warning - without using the other run time loading flags,
-	# -berok will link without error, but may produce a broken library.
-	_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	# Exported symbols can be pulled into shared objects from archives
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-	# This is similar to how AIX traditionally builds its shared libraries.
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-      fi
-    fi
-    ;;
-
-  beos*)
-    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-      # support --undefined.  This deserves some investigation.  FIXME
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-    ;;
-
-  chorus*)
-    case $cc_basename in
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-
-  cygwin* | mingw* | pw32*)
-    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-    # as there is no search path for DLLs.
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-    _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-    _LT_AC_TAGVAR(always_export_symbols, $1)=no
-    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      # If the export-symbols file already is a .def file (1st line
-      # is EXPORTS), use it as is; otherwise, prepend...
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	cp $export_symbols $output_objdir/$soname.def;
-      else
-	echo EXPORTS > $output_objdir/$soname.def;
-	cat $export_symbols >> $output_objdir/$soname.def;
-      fi~
-      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-  ;;
-      darwin* | rhapsody*)
-        case $host_os in
-        rhapsody* | darwin1.[[012]])
-         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[[012]])
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-        esac
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-    if test "$GXX" = yes ; then
-      lt_int_apple_cc_single_mod=no
-      output_verbose_link_cmd='echo'
-      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
-       lt_int_apple_cc_single_mod=yes
-      fi
-      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-       _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      else
-          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-        fi
-        _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          else
-            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          fi
-            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-          _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         _LT_AC_TAGVAR(ld_shlibs, $1)=no
-          ;;
-      esac
-      fi
-        ;;
-
-  dgux*)
-    case $cc_basename in
-      ec++*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      ghcx*)
-	# Green Hills C++ Compiler
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  freebsd[[12]]*)
-    # C++ shared libraries reported to be fairly broken before switch to ELF
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  freebsd-elf*)
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    ;;
-  freebsd* | kfreebsd*-gnu | dragonfly*)
-    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-    # conventions
-    _LT_AC_TAGVAR(ld_shlibs, $1)=yes
-    ;;
-  gnu*)
-    ;;
-  hpux9*)
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				# but as the default
-				# location of the library.
-
-    case $cc_basename in
-    CC*)
-      # FIXME: insert proper C++ library support
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    aCC*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      #
-      # There doesn't appear to be a way to prevent this compiler from
-      # explicitly linking system object files so we need to strip them
-      # from the output so that they don't get included in the library
-      # dependencies.
-      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-      ;;
-    *)
-      if test "$GXX" = yes; then
-        _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-        # FIXME: insert proper C++ library support
-        _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-    ;;
-  hpux10*|hpux11*)
-    if test $with_gnu_ld = no; then
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-      case $host_cpu in
-      hppa*64*|ia64*)
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-        ;;
-      *)
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        ;;
-      esac
-    fi
-    case $host_cpu in
-    hppa*64*|ia64*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-    *)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					      # but as the default
-					      # location of the library.
-      ;;
-    esac
-
-    case $cc_basename in
-      CC*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      aCC*)
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	esac
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test $with_gnu_ld = no; then
-	    case $host_cpu in
-	    hppa*64*)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    ia64*)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    *)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    esac
-	  fi
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  interix3*)
-    _LT_AC_TAGVAR(hardcode_direct, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-    # Instead, shared libraries are loaded at an image base (0x10000000 by
-    # default) and relocated if they conflict, which is a slow very memory
-    # consuming and fragmenting process.  To avoid this, we pick a random,
-    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    ;;
-  irix5* | irix6*)
-    case $cc_basename in
-      CC*)
-	# SGI C++
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	# Archives containing C++ object files must be created using
-	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test "$with_gnu_ld" = no; then
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	  else
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
-	  fi
-	fi
-	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-	;;
-    esac
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-    ;;
-  linux*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	;;
-      icpc*)
-	# Intel C++
-	with_gnu_ld=yes
-	# version 8.0 and above of icpc choke on multiply defined symbols
-	# if we add $predep_objects and $postdep_objects, however 7.1 and
-	# earlier do not add the objects themselves.
-	case `$CC -V 2>&1` in
-	*"Version 7."*)
-  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	*)  # Version 8.0 or newer
-	  tmp_idyn=
-	  case $host_cpu in
-	    ia64*) tmp_idyn=' -i_dynamic';;
-	  esac
-  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	esac
-	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	;;
-      pgCC*)
-        # Portland Group C++ compiler
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-        ;;
-      cxx*)
-	# Compaq C++
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	runpath_var=LD_RUN_PATH
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-    esac
-    ;;
-  lynxos*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  m88k*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  mvs*)
-    case $cc_basename in
-      cxx*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-      wlarc=
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    fi
-    # Workaround some broken pre-1.5 toolchains
-    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-    ;;
-  openbsd2*)
-    # C++ shared libraries are fairly broken
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  openbsd*)
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    fi
-    output_verbose_link_cmd='echo'
-    ;;
-  osf3*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      cxx*)
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  osf4* | osf5*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Archives containing C++ object files must be created using
-	# the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      cxx*)
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	  echo "-hidden">> $lib.exp~
-	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
-	  $rm $lib.exp'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	 _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  psos*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  sunos4*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.x
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      lcc*)
-	# Lucid
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  solaris*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.2, 5.x and Centerline C++
-        _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
-	_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	case $host_os in
-	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	  *)
-	    # The C++ compiler is used as linker so we must use $wl
-	    # flag to pass the commands to the underlying system
-	    # linker. We must also pass each convience library through
-	    # to the system linker between allextract/defaultextract.
-	    # The C++ compiler will combine linker options so we
-	    # cannot just pass the convience library names through
-	    # without $wl.
-	    # Supported since Solaris 2.6 (maybe 2.5.1?)
-	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
-	    ;;
-	esac
-	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-	output_verbose_link_cmd='echo'
-
-	# Archives containing C++ object files must be created using
-	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	;;
-      gcx*)
-	# Green Hills C++ Compiler
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	# The C++ compiler must be used to create the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	;;
-      *)
-	# GNU C++ compiler with Solaris linker
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	  if $CC --version | grep -v '^2\.7' > /dev/null; then
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  else
-	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	    # platform.
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  fi
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	fi
-	;;
-    esac
-    ;;
-  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  sysv5* | sco3.2v5* | sco5v6*)
-    # Note: We can NOT use -z defs as we might desire, because we do not
-    # link with -lc, and that would cause any symbols used from libc to
-    # always be unresolved, which means just about no library would
-    # ever link correctly.  If we're not using GNU ld we use -z text
-    # though, which does catch some bad symbols but isn't as heavy-handed
-    # as -z defs.
-    # For security reasons, it is highly recommended that you always
-    # use absolute paths for naming shared libraries, and exclude the
-    # DT_RUNPATH tag from executables and libraries.  But doing so
-    # requires that you compile everything twice, which is a pain.
-    # So that behaviour is only enabled if SCOABSPATH is set to a
-    # non-empty value in the environment.  Most likely only useful for
-    # creating official distributions of packages.
-    # This is a hack until libtool officially supports absolute path
-    # names for shared libraries.
-    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-    _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  tandem*)
-    case $cc_basename in
-      NCC*)
-	# NonStop-UX NCC 3.20
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  vxworks*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  *)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-esac
-AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_AC_TAGVAR(GCC, $1)="$GXX"
-_LT_AC_TAGVAR(LD, $1)="$LD"
-
-AC_LIBTOOL_POSTDEP_PREDEP($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC=$lt_save_CC
-LDCXX=$LD
-LD=$lt_save_LD
-GCC=$lt_save_GCC
-with_gnu_ldcxx=$with_gnu_ld
-with_gnu_ld=$lt_save_with_gnu_ld
-lt_cv_path_LDCXX=$lt_cv_path_LD
-lt_cv_path_LD=$lt_save_path_LD
-lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-])# AC_LIBTOOL_LANG_CXX_CONFIG
-
-# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
-# ------------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
-int a;
-void foo (void) { a = 0; }
-EOF
-],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-EOF
-],[$1],[F77],[cat > conftest.$ac_ext <<EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-EOF
-],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  # The `*' in the case matches for architectures that use `case' in
-  # $output_verbose_cmd can trigger glob expansion during the loop
-  # eval without this substitution.
-  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
-
-  for p in `eval $output_verbose_link_cmd`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" \
-	  || test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
-	   _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
-	   _LT_AC_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
-	   _LT_AC_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$rm -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-ifelse([$1],[CXX],
-[case $host_os in
-interix3*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_AC_TAGVAR(predep_objects,$1)=
-  _LT_AC_TAGVAR(postdep_objects,$1)=
-  _LT_AC_TAGVAR(postdeps,$1)=
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_AC_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
-])# AC_LIBTOOL_POSTDEP_PREDEP
-
-# AC_LIBTOOL_LANG_F77_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
-AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
-[AC_REQUIRE([AC_PROG_F77])
-AC_LANG_PUSH(Fortran 77)
-
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_AC_TAGVAR(allow_undefined_flag, $1)=
-_LT_AC_TAGVAR(always_export_symbols, $1)=no
-_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_direct, $1)=no
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-_LT_AC_TAGVAR(hardcode_automatic, $1)=no
-_LT_AC_TAGVAR(module_cmds, $1)=
-_LT_AC_TAGVAR(module_expsym_cmds, $1)=
-_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_AC_TAGVAR(no_undefined_flag, $1)=
-_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="      program t\n      end\n"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${F77-"f77"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-  ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-_LT_AC_TAGVAR(GCC, $1)="$G77"
-_LT_AC_TAGVAR(LD, $1)="$LD"
-
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_F77_CONFIG
-
-
-# AC_LIBTOOL_LANG_GCJ_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
-AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
-[AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}\n"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_GCJ_CONFIG
-
-
-# AC_LIBTOOL_LANG_RC_CONFIG
-# -------------------------
-# Ensure that the configuration vars for the Windows resource compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
-AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
-[AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${RC-"windres"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_RC_CONFIG
-
-
-# AC_LIBTOOL_CONFIG([TAGNAME])
-# ----------------------------
-# If TAGNAME is not passed, then create an initial libtool script
-# with a default configuration from the untagged config vars.  Otherwise
-# add code to config.status for appending the configuration named by
-# TAGNAME from the matching tagged config vars.
-AC_DEFUN([AC_LIBTOOL_CONFIG],
-[# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    _LT_AC_TAGVAR(compiler, $1) \
-    _LT_AC_TAGVAR(CC, $1) \
-    _LT_AC_TAGVAR(LD, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
-    _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
-    _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
-    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
-    _LT_AC_TAGVAR(old_archive_cmds, $1) \
-    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
-    _LT_AC_TAGVAR(predep_objects, $1) \
-    _LT_AC_TAGVAR(postdep_objects, $1) \
-    _LT_AC_TAGVAR(predeps, $1) \
-    _LT_AC_TAGVAR(postdeps, $1) \
-    _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
-    _LT_AC_TAGVAR(archive_cmds, $1) \
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
-    _LT_AC_TAGVAR(postinstall_cmds, $1) \
-    _LT_AC_TAGVAR(postuninstall_cmds, $1) \
-    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
-    _LT_AC_TAGVAR(allow_undefined_flag, $1) \
-    _LT_AC_TAGVAR(no_undefined_flag, $1) \
-    _LT_AC_TAGVAR(export_symbols_cmds, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
-    _LT_AC_TAGVAR(hardcode_automatic, $1) \
-    _LT_AC_TAGVAR(module_cmds, $1) \
-    _LT_AC_TAGVAR(module_expsym_cmds, $1) \
-    _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
-    _LT_AC_TAGVAR(exclude_expsyms, $1) \
-    _LT_AC_TAGVAR(include_expsyms, $1); do
-
-    case $var in
-    _LT_AC_TAGVAR(old_archive_cmds, $1) | \
-    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
-    _LT_AC_TAGVAR(archive_cmds, $1) | \
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
-    _LT_AC_TAGVAR(module_cmds, $1) | \
-    _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
-    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
-    _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
-
-  case $lt_echo in
-  *'\[$]0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
-    ;;
-  esac
-
-ifelse([$1], [],
-  [cfgfile="${ofile}T"
-  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
-  $rm -f "$cfgfile"
-  AC_MSG_NOTICE([creating $ofile])],
-  [cfgfile="$ofile"])
-
-  cat <<__EOF__ >> "$cfgfile"
-ifelse([$1], [],
-[#! $SHELL
-
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-#
-# This file is part of GNU Libtool:
-# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="$SED -e 1s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-# The names of the tagged configurations supported by this script.
-available_tags=
-
-# ### BEGIN LIBTOOL CONFIG],
-[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
-
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
-
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A C compiler.
-LTCC=$lt_LTCC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
-
-# A language-specific compiler.
-CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
-
-# Is the compiler the GNU C compiler?
-with_gcc=$_LT_AC_TAGVAR(GCC, $1)
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# The linker used to build libraries.
-LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
-
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
-
-# A BSD-compatible nm program.
-NM=$lt_NM
-
-# A symbol stripping program
-STRIP=$lt_STRIP
-
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
-
-# Object file suffix (normally "o").
-objext="$ac_objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
-pic_mode=$pic_mode
-
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
-
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
-archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
-module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
-
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
-
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
-
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
-
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
-
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
-
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
-
-# Symbols that must always be exported.
-include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
-
-ifelse([$1],[],
-[# ### END LIBTOOL CONFIG],
-[# ### END LIBTOOL TAG CONFIG: $tagname])
-
-__EOF__
-
-ifelse([$1],[], [
-  case $host_os in
-  aix3*)
-    cat <<\EOF >> "$cfgfile"
-
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-EOF
-    ;;
-  esac
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" || \
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-])
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
-])# AC_LIBTOOL_CONFIG
-
-
-# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------------------
-AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
-[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-
-_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-
-  AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
-
-
-# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-# ---------------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
-[AC_REQUIRE([AC_CANONICAL_HOST])
-AC_REQUIRE([AC_PROG_NM])
-AC_REQUIRE([AC_OBJEXT])
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*) # Its linker distinguishes data from code symbols
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  ;;
-linux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDGIRSTW]]'
-    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if grep ' nm_test_var$' "$nlist" >/dev/null; then
-	if grep ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
-
-	  cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[[]] =
-{
-EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
-	  cat <<\EOF >> conftest.$ac_ext
-  {0, (lt_ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -f conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-
-
-# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
-# ---------------------------------------
-AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
-[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
- ifelse([$1],[CXX],[
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-      ;;
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | os2* | pw32*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix4* | aix5*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-       darwin*)
-         # PIC is the default on this platform
-         # Common symbols not allowed in MH_DYLIB files
-         case $cc_basename in
-           xlc*)
-           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
-           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-           ;;
-         esac
-       ;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | kfreebsd*-gnu | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux*)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  icpc* | ecpc*)
-	    # Intel C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC*)
-	    # Portland Group C++ compiler.
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-      ;;
-
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
-         _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-         ;;
-       esac
-       ;;
-
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    newsos6)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      esac
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
-    _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
-    [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
-AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
-])
-
-
-# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
-# ------------------------------------
-# See if the linker supports building shared libraries.
-AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
-[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-ifelse([$1],[CXX],[
-  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix4* | aix5*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw*)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-],[
-  runpath_var=
-  _LT_AC_TAGVAR(allow_undefined_flag, $1)=
-  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_AC_TAGVAR(archive_cmds, $1)=
-  _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
-  _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-  _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-  _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_AC_TAGVAR(hardcode_automatic, $1)=no
-  _LT_AC_TAGVAR(module_cmds, $1)=
-  _LT_AC_TAGVAR(module_expsym_cmds, $1)=
-  _LT_AC_TAGVAR(always_export_symbols, $1)=no
-  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_AC_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  _LT_CC_BASENAME([$compiler])
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
-      fi
-      ;;
-
-    amigaos*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(always_export_symbols, $1)=no
-      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    interix3*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-	if test $supports_anon_versioning = yes; then
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) 
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_AC_TAGVAR(archive_cmds, $1)=''
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	  else
-  	  # We have old collect2
-  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-  	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       _LT_AC_SYS_LIBPATH_AIX
-       _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 _LT_AC_SYS_LIBPATH_AIX
-	 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      # see comment about different semantics on the GNU ld section
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    bsdi[[45]]*)
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[[012]])
-         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[[012]])
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         _LT_AC_TAGVAR(ld_shlibs, $1)=no
-          ;;
-      esac
-    fi
-      ;;
-
-    dgux*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    openbsd*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	   _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	   ;;
-	 *)
-	   _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
-
-    os2*)
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
-      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-  fi
-])
-AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_AC_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
-	pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
-        _LT_AC_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
-        then
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
-      ;;
-    esac
-  fi
-  ;;
-esac
-])# AC_LIBTOOL_PROG_LD_SHLIBS
-
-
-# _LT_AC_FILE_LTDLL_C
-# -------------------
-# Be careful that the start marker always follows a newline.
-AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# #  ifdef __CYGWIN32__
-# #    define __CYGWIN__ __CYGWIN32__
-# #  endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-#   __hDllInstance_base = hInst;
-#   return TRUE;
-# }
-# /* ltdll.c ends here */
-])# _LT_AC_FILE_LTDLL_C
-
-
-# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
-# ---------------------------------
-AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
-
-
-# old names
-AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
-AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
-AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
-AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
-AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
-
-# This is just to silence aclocal about the macro not being used
-ifelse([AC_DISABLE_FAST_INSTALL])
-
-AC_DEFUN([LT_AC_PROG_GCJ],
-[AC_CHECK_TOOL(GCJ, gcj, no)
-  test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-  AC_SUBST(GCJFLAGS)
-])
-
-AC_DEFUN([LT_AC_PROG_RC],
-[AC_CHECK_TOOL(RC, windres, no)
-])
-
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-# LT_AC_PROG_SED
-# --------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-AC_DEFUN([LT_AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_MSG_RESULT([$SED])
-])
-
-# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -6398,14 +29,31 @@ AC_MSG_RESULT([$SED])
 # ----------------------------
 # Automake X.Y traces this macro to ensure aclocal.m4 has been
 # generated from the m4 files accompanying Automake X.Y.
-AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.10.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
 
 # AM_SET_CURRENT_AUTOMAKE_VERSION
 # -------------------------------
-# Call AM_AUTOMAKE_VERSION so it can be traced.
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-	 [AM_AUTOMAKE_VERSION([1.9.6])])
+[AM_AUTOMAKE_VERSION([1.10.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
@@ -6462,14 +110,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
 # 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.
 
-# serial 7
+# serial 8
 
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
@@ -6478,8 +126,10 @@ AC_DEFUN([AM_CONDITIONAL],
 [AC_PREREQ(2.52)dnl
  ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
 	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])
-AC_SUBST([$1_FALSE])
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
 if $2; then
   $1_TRUE=
   $1_FALSE='#'
@@ -6493,15 +143,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
 # 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.
 
-# serial 8
+# serial 9
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -6529,6 +178,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl
 ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
        [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
        [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
        [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
                    [depcc="$$1"   am_compiler_list=])
 
@@ -6594,6 +244,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
        $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
          >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
@@ -6646,7 +297,8 @@ if test "x$enable_dependency_tracking" != xno; then
   AMDEPBACKSLASH='\'
 fi
 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
 ])
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
@@ -6671,8 +323,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
   # some people rename them; so instead we look at the file content.
   # Grep'ing the first line is not enough: some people post-process
   # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
     dirpart=`AS_DIRNAME("$mf")`
   else
     continue
@@ -6719,14 +372,14 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008 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.
 
-# serial 12
+# serial 13
 
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
@@ -6743,16 +396,20 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 # arguments mandatory, and then we can depend on a new Autoconf
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.58])dnl
+[AC_PREREQ([2.60])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
 AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
 AC_REQUIRE([AC_PROG_INSTALL])dnl
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
 fi
 
 # test whether we have cygpath
@@ -6772,6 +429,9 @@ m4_ifval([$2],
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
@@ -6807,6 +467,10 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX],
                   [_AM_DEPENDENCIES(CXX)],
                   [define([AC_PROG_CXX],
                           defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                  [_AM_DEPENDENCIES(OBJC)],
+                  [define([AC_PROG_OBJC],
+                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
 ])
 ])
 
@@ -6820,16 +484,17 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX],
 # our stamp files there.
 AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
 [# Compute $1's index in $config_headers.
+_am_arg=$1
 _am_stamp_count=1
 for _am_header in $config_headers :; do
   case $_am_header in
-    $1 | $1:* )
+    $_am_arg | $_am_arg:* )
       break ;;
     * )
       _am_stamp_count=`expr $_am_stamp_count + 1` ;;
   esac
 done
-echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
 # Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 #
@@ -6842,7 +507,7 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
 AC_SUBST(install_sh)])
 
 # Copyright (C) 2003, 2005  Free Software Foundation, Inc.
@@ -6920,14 +585,14 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
 # 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.
 
-# serial 4
+# serial 5
 
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
@@ -6943,6 +608,7 @@ AC_SUBST($1)])
 # If it does, set am_missing_run to use it, otherwise, to nothing.
 AC_DEFUN([AM_MISSING_HAS_RUN],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
 test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
 # Use eval to expand $SHELL
 if eval "$MISSING --run true"; then
@@ -6953,7 +619,7 @@ else
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -6961,60 +627,23 @@ fi
 
 # AM_PROG_MKDIR_P
 # ---------------
-# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
-#
-# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
-# created by `make install' are always world readable, even if the
-# installer happens to have an overly restrictive umask (e.g. 077).
-# This was a mistake.  There are at least two reasons why we must not
-# use `-m 0755':
-#   - it causes special bits like SGID to be ignored,
-#   - it may be too restrictive (some setups expect 775 directories).
-#
-# Do not use -m 0755 and let people choose whatever they expect by
-# setting umask.
-#
-# We cannot accept any implementation of `mkdir' that recognizes `-p'.
-# Some implementations (such as Solaris 8's) are not thread-safe: if a
-# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
-# concurrently, both version can detect that a/ is missing, but only
-# one can create it and the other will error out.  Consequently we
-# restrict ourselves to GNU make (using the --version option ensures
-# this.)
+# Check for `mkdir -p'.
 AC_DEFUN([AM_PROG_MKDIR_P],
-[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-  # We used to keeping the `.' as first argument, in order to
-  # allow $(mkdir_p) to be used without argument.  As in
-  #   $(mkdir_p) $(somedir)
-  # where $(somedir) is conditionally defined.  However this is wrong
-  # for two reasons:
-  #  1. if the package is installed by a user who cannot write `.'
-  #     make install will fail,
-  #  2. the above comment should most certainly read
-  #     $(mkdir_p) $(DESTDIR)$(somedir)
-  #     so it does not work when $(somedir) is undefined and
-  #     $(DESTDIR) is not.
-  #  To support the latter case, we have to write
-  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
-  #  so the `.' trick is pointless.
-  mkdir_p='mkdir -p --'
-else
-  # On NextStep and OpenStep, the `mkdir' command does not
-  # recognize any option.  It will interpret all options as
-  # directories to create, and then abort because `.' already
-  # exists.
-  for d in ./-p ./--version;
-  do
-    test -d $d && rmdir $d
-  done
-  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
-  if test -f "$ac_aux_dir/mkinstalldirs"; then
-    mkdir_p='$(mkinstalldirs)'
-  else
-    mkdir_p='$(install_sh) -d'
-  fi
-fi
-AC_SUBST([mkdir_p])])
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
@@ -7126,9 +755,21 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
+# Copyright (C) 2006  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.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
 # Check how to create a tarball.                            -*- Autoconf -*-
 
 # Copyright (C) 2004, 2005  Free Software Foundation, Inc.
@@ -7225,6 +866,7 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
+m4_include([m4/ac_check_ciao.m4])
 m4_include([m4/ac_check_fpu_control.m4])
 m4_include([m4/ac_check_gmp.m4])
 m4_include([m4/ac_check_sicstus_prolog.m4])
@@ -7235,7 +877,19 @@ m4_include([m4/ac_cxx_double_binary_format.m4])
 m4_include([m4/ac_cxx_flexible_arrays.m4])
 m4_include([m4/ac_cxx_float_binary_format.m4])
 m4_include([m4/ac_cxx_long_double_binary_format.m4])
+m4_include([m4/ac_cxx_proper_long_double.m4])
+m4_include([m4/ac_cxx_remainder_bug.m4])
+m4_include([m4/ac_prog_jar.m4])
+m4_include([m4/ac_prog_java.m4])
+m4_include([m4/ac_prog_javac.m4])
+m4_include([m4/ac_prog_javah.m4])
 m4_include([m4/ac_text_md5sum.m4])
+m4_include([m4/ax_prefix_config_h.m4])
 m4_include([m4/lib-ld.m4])
 m4_include([m4/lib-link.m4])
 m4_include([m4/lib-prefix.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/compile b/compile
index cd27e88..1b1d232 100755
--- a/compile
+++ b/compile
@@ -17,7 +17,7 @@ scriptversion=2005-05-14.22
 # 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,
+# along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 # As a special exception to the GNU General Public License, if you
diff --git a/config.guess b/config.guess
index ec46d18..c7607c7 100755
--- a/config.guess
+++ b/config.guess
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2006-02-27'
+timestamp='2008-04-14'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -56,8 +56,8 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -161,6 +161,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
@@ -211,7 +212,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
 	exit ;;
     macppc:MirBSD:*:*)
-	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
@@ -329,7 +330,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
-    i86pc:SunOS:5.*:*)
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     sun4*:SunOS:6*:*)
@@ -531,7 +532,7 @@ EOF
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[45])
+    *:AIX:*:[456])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
@@ -771,6 +772,8 @@ EOF
 	case ${UNAME_MACHINE} in
 	    pc98)
 		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
 		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
@@ -778,10 +781,7 @@ EOF
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
-    i*:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:MSYS_NT-*:*:*)
+    *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
     i*:windows32*:*)
@@ -791,12 +791,18 @@ EOF
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
-    x86:Interix*:[345]*)
-	echo i586-pc-interix${UNAME_RELEASE}
-	exit ;;
-    EM64T:Interix*:[345]*)
-	echo x86_64-unknown-interix${UNAME_RELEASE}
-	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 	echo i${UNAME_MACHINE}-pc-mks
 	exit ;;
@@ -830,6 +836,16 @@ EOF
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
     arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     cris:Linux:*:*)
@@ -948,6 +964,9 @@ EOF
     x86_64:Linux:*:*)
 	echo x86_64-unknown-linux-gnu
 	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
     i*86:Linux:*:*)
 	# The BFD linker knows what the default object file format is, so
 	# first see if it will tell us. cd to the root directory to prevent
@@ -966,9 +985,6 @@ EOF
 	  a.out-i386-linux)
 		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
 		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
 	  "")
 		# Either a pre-BFD a.out linker (linux-gnuoldld) or
 		# one that does not give us useful --help.
@@ -990,7 +1006,7 @@ EOF
 	LIBC=gnulibc1
 	# endif
 	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
 	LIBC=gnu
 	#else
 	LIBC=gnuaout
@@ -1197,6 +1213,9 @@ EOF
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
 	echo i586-pc-beos
 	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1206,6 +1225,15 @@ EOF
     SX-6:SUPER-UX:*:*)
 	echo sx6-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1456,9 +1484,9 @@ This script, last modified $timestamp, has failed to recognize
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff --git a/config.h.in b/config.h.in
index 8dc0031..73389dc 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,9 +1,10 @@
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
+/* ABI-breaking extra assertions are enabled when this is defined. */
+#undef ABI_BREAKING_EXTRA_DEBUG
 
-#ifndef PPL_ppl_config_h
-#define PPL_ppl_config_h 1
-
+/* Not zero if the FPU can be controlled. */
+#undef CAN_CONTROL_FPU
 
 /* Defined if the integral type to be used for coefficients is a checked one.
    */
@@ -15,24 +16,49 @@
 /* The integral type used to represent coefficients. */
 #undef COEFFICIENT_TYPE
 
+/* This contains the options with which `configure' was invoked. */
+#undef CONFIGURE_OPTIONS
+
 /* The binary format of C++ doubles, if supported; undefined otherwise. */
 #undef CXX_DOUBLE_BINARY_FORMAT
 
 /* The binary format of C++ floats, if supported; undefined otherwise. */
 #undef CXX_FLOAT_BINARY_FORMAT
 
+/* Not zero if the C++ compiler has the remainder bug. */
+#undef CXX_HAS_REMAINDER_BUG
+
 /* The binary format of C++ long doubles, if supported; undefined otherwise.
    */
 #undef CXX_LONG_DOUBLE_BINARY_FORMAT
 
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+   range or precision than double. */
+#undef CXX_PROVIDES_PROPER_LONG_DOUBLE
+
 /* Not zero if the C++ compiler supports __attribute__ ((weak)). */
 #undef CXX_SUPPORTS_ATTRIBUTE_WEAK
 
 /* Not zero if the C++ compiler supports flexible arrays. */
 #undef CXX_SUPPORTS_FLEXIBLE_ARRAYS
 
-/* Enable more assertions when defined. */
-#undef EXTRA_ROW_DEBUG
+/* Defined if floating point arithmetics may use the 387 unit. */
+#undef FPMATH_MAY_USE_387
+
+/* Defined if floating point arithmetics may use the SSE instruction set. */
+#undef FPMATH_MAY_USE_SSE
+
+/* Defined if GLPK provides glp_term_hook(). */
+#undef GLPK_HAS_GLP_TERM_HOOK
+
+/* Defined if GLPK provides glp_term_out(). */
+#undef GLPK_HAS_GLP_TERM_OUT
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+#undef GLPK_HAS_LIB_SET_PRINT_HOOK
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+#undef GLPK_HAS__GLP_LIB_PRINT_HOOK
 
 /* Defined if the integral type to be used for coefficients is GMP's one. */
 #undef GMP_INTEGERS
@@ -58,6 +84,10 @@
    */
 #undef HAVE_DECL_GETENV
 
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETRUSAGE
+
 /* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
    */
 #undef HAVE_DECL_RINTF
@@ -111,6 +141,12 @@
 /* Define to 1 if you have the <getopt.h> header file. */
 #undef HAVE_GETOPT_H
 
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+#undef HAVE_GLPK_GLPK_H
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#undef HAVE_GLPK_H
+
 /* Define to 1 if you have the <ieeefp.h> header file. */
 #undef HAVE_IEEEFP_H
 
@@ -156,6 +192,12 @@
 /* Define to 1 if you have the <sys/types.h> header file. */
 #undef HAVE_SYS_TYPES_H
 
+/* Define to 1 if the system has the type `timeval'. */
+#undef HAVE_TIMEVAL
+
+/* Define to 1 if typeof works with your compiler. */
+#undef HAVE_TYPEOF
+
 /* Define to 1 if the system has the type `uint_fast16_t'. */
 #undef HAVE_UINT_FAST16_T
 
@@ -177,6 +219,10 @@
 /* Define to 1 if `_mp_size' is member of `__mpz_struct'. */
 #undef HAVE___MPZ_STRUCT__MP_SIZE
 
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
 /* Defined if the integral type to be used for coefficients is a native one.
    */
 #undef NATIVE_INTEGERS
@@ -184,9 +230,6 @@
 /* Assertions are disabled when this is defined. */
 #undef NDEBUG
 
-/* Name of package */
-#undef PACKAGE
-
 /* Define to the address where bug reports for this package should be sent. */
 #undef PACKAGE_BUGREPORT
 
@@ -202,64 +245,67 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
-/* Not zero if the FPU can be controlled. */
-#undef PPL_CAN_CONTROL_FPU
-
-/* This contains the options with which `configure' was invoked. */
-#undef PPL_CONFIGURE_OPTIONS
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
 
-/* Not zero if doubles are supported. */
-#undef PPL_SUPPORTED_DOUBLE
-
-/* Not zero if floats are supported. */
-#undef PPL_SUPPORTED_FLOAT
-
-/* Not zero if long doubles are supported. */
-#undef PPL_SUPPORTED_LONG_DOUBLE
-
-/* The size of a `double', as computed by sizeof. */
+/* The size of `double', as computed by sizeof. */
 #undef SIZEOF_DOUBLE
 
-/* The size of a `float', as computed by sizeof. */
+/* The size of `float', as computed by sizeof. */
 #undef SIZEOF_FLOAT
 
-/* The size of a `int', as computed by sizeof. */
+/* The size of `fp', as computed by sizeof. */
+#undef SIZEOF_FP
+
+/* The size of `int', as computed by sizeof. */
 #undef SIZEOF_INT
 
-/* The size of a `long', as computed by sizeof. */
+/* The size of `int*', as computed by sizeof. */
+#undef SIZEOF_INTP
+
+/* The size of `long', as computed by sizeof. */
 #undef SIZEOF_LONG
 
-/* The size of a `long double', as computed by sizeof. */
+/* The size of `long double', as computed by sizeof. */
 #undef SIZEOF_LONG_DOUBLE
 
-/* The size of a `long long', as computed by sizeof. */
+/* The size of `long long', as computed by sizeof. */
 #undef SIZEOF_LONG_LONG
 
-/* The size of a `mp_limb_t', as computed by sizeof. */
+/* The size of `mp_limb_t', as computed by sizeof. */
 #undef SIZEOF_MP_LIMB_T
 
-/* The size of a `size_t', as computed by sizeof. */
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
 #undef SIZEOF_SIZE_T
 
-/* The size of a `unsigned', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
 
-/* The size of a `unsigned long', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED_LONG
+/* Not zero if doubles are supported. */
+#undef SUPPORTED_DOUBLE
 
-/* The size of a `unsigned long long', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED_LONG_LONG
+/* Not zero if floats are supported. */
+#undef SUPPORTED_FLOAT
 
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
+/* Not zero if long doubles are supported. */
+#undef SUPPORTED_LONG_DOUBLE
 
-/* Version number of package */
-#undef VERSION
+/* Defined if the Parma Watchdog Library is enabled. */
+#undef WATCHDOG_LIBRARY_ENABLED
 
 /* Define to 1 if your processor stores words with the most significant byte
    first (like Motorola and SPARC, unlike Intel and VAX). */
 #undef WORDS_BIGENDIAN
 
+/* When defined and libstdc++ is used, it is used in debug mode. */
+#undef _GLIBCXX_DEBUG
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+#undef _GLIBCXX_DEBUG_PEDANTIC
+
 /* Define to empty if `const' does not conform to ANSI C. */
 #undef const
 
@@ -269,18 +315,30 @@
 #undef inline
 #endif
 
+/* Define to __typeof__ if your compiler spells it that way. */
+#undef typeof
+
+
+#ifdef PPL_NDEBUG
+# define NDEBUG PPL_NDEBUG
+#endif
 
 /*
   In order for the definition of `int64_t' to be seen by Comeau C/C++,
   we must make sure <stdint.h> is included before <sys/types.hh> is
   (even indirectly) included.
+
+  Moreover we need to define __STDC_LIMIT_MACROS before the first
+  inclusion of <stdint.h> in order to have the macros defined also in C++.
 */
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
 #endif
 
-#endif /* !defined(PPL_ppl_config_h) */
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
 
diff --git a/config.rpath b/config.rpath
index 65e298a..c547c68 100755
--- a/config.rpath
+++ b/config.rpath
@@ -2,28 +2,13 @@
 # Output a system dependent set of variables, describing how to set the
 # run time search path of shared libraries in an executable.
 #
-#   Copyright 1996-2004 Free Software Foundation, Inc.
+#   Copyright 1996-2007 Free Software Foundation, Inc.
 #   Taken from GNU libtool, 2001
 #   Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
 #
-#   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., 51 Franklin Street, Fifth Floor, 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.
+#   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.
 #
 # The first argument passed to this file is the canonical host specification,
 #    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
@@ -40,7 +25,7 @@
 #   known workaround is to choose shorter directory names for the build
 #   directory and/or the installation directory.
 
-# All known linkers require a `.a' archive for static linking (except M$VC,
+# All known linkers require a `.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 shrext=.so
@@ -50,6 +35,18 @@ host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
 host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
 host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
 # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
 
 wl=
@@ -60,7 +57,14 @@ else
     aix*)
       wl='-Wl,'
       ;;
-    mingw* | pw32* | os2*)
+    darwin*)
+      case $cc_basename in
+        xlc*)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    mingw* | cygwin* | pw32* | os2*)
       ;;
     hpux9* | hpux10* | hpux11*)
       wl='-Wl,'
@@ -70,23 +74,33 @@ else
       ;;
     newsos6)
       ;;
-    linux*)
-      case $CC in
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
         icc* | ecc*)
           wl='-Wl,'
           ;;
+        pgcc | pgf77 | pgf90)
+          wl='-Wl,'
+          ;;
         ccc*)
           wl='-Wl,'
           ;;
         como)
           wl='-lopt='
           ;;
+        *)
+          case `$CC -V 2>&1 | sed 5q` in
+            *Sun\ C*)
+              wl='-Wl,'
+              ;;
+          esac
+          ;;
       esac
       ;;
     osf3* | osf4* | osf5*)
       wl='-Wl,'
       ;;
-    sco3.2v5*)
+    rdos*)
       ;;
     solaris*)
       wl='-Wl,'
@@ -94,11 +108,17 @@ else
     sunos4*)
       wl='-Qoption ld '
       ;;
-    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    sysv4 | sysv4.2uw2* | sysv4.3*)
       wl='-Wl,'
       ;;
     sysv4*MP*)
       ;;
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      wl='-Wl,'
+      ;;
+    unicos*)
+      wl='-Wl,'
+      ;;
     uts4*)
       ;;
   esac
@@ -120,6 +140,10 @@ case "$host_os" in
       with_gnu_ld=no
     fi
     ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
   openbsd*)
     with_gnu_ld=no
     ;;
@@ -127,6 +151,12 @@ esac
 
 ld_shlibs=yes
 if test "$with_gnu_ld" = yes; then
+  # Set some defaults for GNU ld with shared library support. These
+  # are reset later if shared libraries are not supported. Putting them
+  # here allows them to be overridden if necessary.
+  # Unlike libtool, we use -rpath here, not --rpath, since the documented
+  # option of GNU ld is called -rpath, not --rpath.
+  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
   case "$host_os" in
     aix3* | aix4* | aix5*)
       # On AIX/PPC, the GNU linker is very broken
@@ -162,9 +192,20 @@ if test "$with_gnu_ld" = yes; then
         ld_shlibs=no
       fi
       ;;
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      ;;
+    gnu* | linux* | k*bsd*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
     netbsd*)
       ;;
-    solaris* | sysv5*)
+    solaris*)
       if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
         ld_shlibs=no
       elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
@@ -173,16 +214,23 @@ if test "$with_gnu_ld" = yes; then
         ld_shlibs=no
       fi
       ;;
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+          ld_shlibs=no
+          ;;
+        *)
+          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+          else
+            ld_shlibs=no
+          fi
+          ;;
+      esac
+      ;;
     sunos4*)
       hardcode_direct=yes
       ;;
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
     *)
       if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
         :
@@ -191,10 +239,8 @@ if test "$with_gnu_ld" = yes; then
       fi
       ;;
   esac
-  if test "$ld_shlibs" = yes; then
-    # Unlike libtool, we use -rpath here, not --rpath, since the documented
-    # option of GNU ld is called -rpath, not --rpath.
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  if test "$ld_shlibs" = no; then
+    hardcode_libdir_flag_spec=
   fi
 else
   case "$host_os" in
@@ -225,6 +271,7 @@ else
               break
             fi
           done
+          ;;
         esac
       fi
       hardcode_direct=yes
@@ -236,7 +283,7 @@ else
             strings "$collect2name" | grep resolve_lib_name >/dev/null
           then
             # We have reworked collect2
-            hardcode_direct=yes
+            :
           else
             # We have old collect2
             hardcode_direct=unsupported
@@ -244,6 +291,7 @@ else
             hardcode_libdir_flag_spec='-L$libdir'
             hardcode_libdir_separator=
           fi
+          ;;
         esac
       fi
       # Begin _LT_AC_SYS_LIBPATH_AIX.
@@ -286,6 +334,20 @@ else
       hardcode_libdir_flag_spec=' '
       libext=lib
       ;;
+    darwin* | rhapsody*)
+      hardcode_direct=no
+      if test "$GCC" = yes ; then
+        :
+      else
+        case $cc_basename in
+          xlc*)
+            ;;
+          *)
+            ld_shlibs=no
+            ;;
+        esac
+      fi
+      ;;
     dgux*)
       hardcode_libdir_flag_spec='-L$libdir'
       ;;
@@ -300,7 +362,7 @@ else
       hardcode_direct=yes
       hardcode_minus_L=yes
       ;;
-    freebsd* | kfreebsd*-gnu)
+    freebsd* | dragonfly*)
       hardcode_libdir_flag_spec='-R$libdir'
       hardcode_direct=yes
       ;;
@@ -312,24 +374,25 @@ else
       # but as the default location of the library.
       hardcode_minus_L=yes
       ;;
-    hpux10* | hpux11*)
+    hpux10*)
       if test "$with_gnu_ld" = no; then
-        case "$host_cpu" in
-          hppa*64*)
-            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-            hardcode_libdir_separator=:
-            hardcode_direct=no
-            ;;
-          ia64*)
-            hardcode_libdir_flag_spec='-L$libdir'
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        hardcode_direct=yes
+        # hardcode_minus_L: Not really in the search PATH,
+        # but as the default location of the library.
+        hardcode_minus_L=yes
+      fi
+      ;;
+    hpux11*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        case $host_cpu in
+          hppa*64*|ia64*)
             hardcode_direct=no
-            # hardcode_minus_L: Not really in the search PATH,
-            # but as the default location of the library.
-            hardcode_minus_L=yes
             ;;
           *)
-            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-            hardcode_libdir_separator=:
             hardcode_direct=yes
             # hardcode_minus_L: Not really in the search PATH,
             # but as the default location of the library.
@@ -352,18 +415,22 @@ else
       hardcode_libdir_separator=:
       ;;
     openbsd*)
-      hardcode_direct=yes
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      if test -f /usr/libexec/ld.so; then
+        hardcode_direct=yes
+        if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+          hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        else
+          case "$host_os" in
+            openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+              hardcode_libdir_flag_spec='-R$libdir'
+              ;;
+            *)
+              hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+              ;;
+          esac
+        fi
       else
-        case "$host_os" in
-          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-            hardcode_libdir_flag_spec='-R$libdir'
-            ;;
-          *)
-            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-            ;;
-        esac
+        ld_shlibs=no
       fi
       ;;
     os2*)
@@ -383,8 +450,6 @@ else
       fi
       hardcode_libdir_separator=:
       ;;
-    sco3.2v5*)
-      ;;
     solaris*)
       hardcode_libdir_flag_spec='-R$libdir'
       ;;
@@ -413,14 +478,11 @@ else
         ld_shlibs=yes
       fi
       ;;
-    sysv4.2uw2*)
-      hardcode_direct=yes
-      hardcode_minus_L=no
-      ;;
-    sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[78]* | unixware7*)
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
       ;;
-    sysv5*)
-      hardcode_libdir_flag_spec=
+    sysv5* | sco3.2v5* | sco5v6*)
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
       ;;
     uts4*)
       hardcode_libdir_flag_spec='-L$libdir'
@@ -433,36 +495,54 @@ fi
 
 # Check dynamic linker characteristics
 # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec=      # the last element of library_names_spec in libtool.m4
 libname_spec='lib$name'
 case "$host_os" in
   aix3*)
+    library_names_spec='$libname.a'
     ;;
   aix4* | aix5*)
+    library_names_spec='$libname$shrext'
     ;;
   amigaos*)
+    library_names_spec='$libname.a'
     ;;
   beos*)
+    library_names_spec='$libname$shrext'
     ;;
   bsdi[45]*)
+    library_names_spec='$libname$shrext'
     ;;
   cygwin* | mingw* | pw32*)
     shrext=.dll
+    library_names_spec='$libname.dll.a $libname.lib'
     ;;
   darwin* | rhapsody*)
     shrext=.dylib
+    library_names_spec='$libname$shrext'
     ;;
   dgux*)
+    library_names_spec='$libname$shrext'
     ;;
   freebsd1*)
     ;;
-  kfreebsd*-gnu)
-    ;;
-  freebsd*)
+  freebsd* | dragonfly*)
+    case "$host_os" in
+      freebsd[123]*)
+        library_names_spec='$libname$shrext$versuffix' ;;
+      *)
+        library_names_spec='$libname$shrext' ;;
+    esac
     ;;
   gnu*)
+    library_names_spec='$libname$shrext'
     ;;
   hpux9* | hpux10* | hpux11*)
-    case "$host_cpu" in
+    case $host_cpu in
       ia64*)
         shrext=.so
         ;;
@@ -473,8 +553,13 @@ case "$host_os" in
         shrext=.sl
         ;;
     esac
+    library_names_spec='$libname$shrext'
+    ;;
+  interix[3-9]*)
+    library_names_spec='$libname$shrext'
     ;;
   irix5* | irix6* | nonstopux*)
+    library_names_spec='$libname$shrext'
     case "$host_os" in
       irix5* | nonstopux*)
         libsuff= shlibsuff=
@@ -491,44 +576,62 @@ case "$host_os" in
     ;;
   linux*oldld* | linux*aout* | linux*coff*)
     ;;
-  linux*)
+  linux* | k*bsd*-gnu)
+    library_names_spec='$libname$shrext'
     ;;
   knetbsd*-gnu)
+    library_names_spec='$libname$shrext'
     ;;
   netbsd*)
+    library_names_spec='$libname$shrext'
     ;;
   newsos6)
+    library_names_spec='$libname$shrext'
     ;;
   nto-qnx*)
+    library_names_spec='$libname$shrext'
     ;;
   openbsd*)
+    library_names_spec='$libname$shrext$versuffix'
     ;;
   os2*)
     libname_spec='$name'
     shrext=.dll
+    library_names_spec='$libname.a'
     ;;
   osf3* | osf4* | osf5*)
+    library_names_spec='$libname$shrext'
     ;;
-  sco3.2v5*)
+  rdos*)
     ;;
   solaris*)
+    library_names_spec='$libname$shrext'
     ;;
   sunos4*)
+    library_names_spec='$libname$shrext$versuffix'
     ;;
-  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  sysv4 | sysv4.3*)
+    library_names_spec='$libname$shrext'
     ;;
   sysv4*MP*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+    library_names_spec='$libname$shrext'
     ;;
   uts4*)
+    library_names_spec='$libname$shrext'
     ;;
 esac
 
 sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
 escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
 shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
 escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
 
-sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
 
 # How to pass a linker flag through the compiler.
 wl="$escaped_wl"
@@ -539,6 +642,12 @@ libext="$libext"
 # Shared library suffix (normally "so").
 shlibext="$shlibext"
 
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
 # Flag to hardcode \$libdir into a binary during linking.
 # This must work even if \$libdir does not exist.
 hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
diff --git a/config.sub b/config.sub
index ab2c16c..a649350 100755
--- a/config.sub
+++ b/config.sub
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2006-02-27'
+timestamp='2008-06-16'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -72,8 +72,8 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -241,20 +241,23 @@ case $basic_machine in
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
 	| bfin \
 	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
+	| fido | fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
-	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
+	| mips64octeon | mips64octeonel \
 	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
 	| mips64vr4100 | mips64vr4100el \
 	| mips64vr4300 | mips64vr4300el \
 	| mips64vr5000 | mips64vr5000el \
@@ -275,21 +278,19 @@ case $basic_machine in
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 	| pyramid \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| strongarm \
+	| spu | strongarm \
 	| tahoe | thumb | tic4x | tic80 | tron \
 	| v850 | v850e \
 	| we32k \
-	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
 	| z8k)
 		basic_machine=$basic_machine-unknown
 		;;
-	m32c)
-		basic_machine=$basic_machine-unknown
-		;;
 	m6811 | m68hc11 | m6812 | m68hc12)
 		# Motorola 68HC11/12.
 		basic_machine=$basic_machine-unknown
@@ -319,25 +320,27 @@ case $basic_machine in
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* \
+	| avr-* | avr32-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
 	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
-	| m32r-* | m32rle-* \
+	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
+	| mips64octeon-* | mips64octeonel-* \
 	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
 	| mips64vr4100-* | mips64vr4100el-* \
 	| mips64vr4300-* | mips64vr4300el-* \
 	| mips64vr5000-* | mips64vr5000el-* \
@@ -359,22 +362,24 @@ case $basic_machine in
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 	| pyramid-* \
 	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
 	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
 	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
 	| tron-* \
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-*)
 		;;
-	m32c-*)
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
 		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
@@ -446,10 +451,22 @@ case $basic_machine in
 		basic_machine=ns32k-sequent
 		os=-dynix
 		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
 	convex-c1)
 		basic_machine=c1-convex
 		os=-bsd
@@ -478,8 +495,8 @@ case $basic_machine in
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16c)
-		basic_machine=cr16c-unknown
+	cr16)
+		basic_machine=cr16-unknown
 		os=-elf
 		;;
 	crds | unos)
@@ -517,6 +534,10 @@ case $basic_machine in
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
 	djgpp)
 		basic_machine=i586-pc
 		os=-msdosdjgpp
@@ -671,6 +692,14 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	m88k-omron*)
 		basic_machine=m88k-omron
 		;;
@@ -686,6 +715,10 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-mingw32
 		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
 	miniframe)
 		basic_machine=m68000-convergent
 		;;
@@ -812,6 +845,14 @@ case $basic_machine in
 		basic_machine=i860-intel
 		os=-osf
 		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	pbd)
 		basic_machine=sparc-tti
 		;;
@@ -913,6 +954,10 @@ case $basic_machine in
 	sb1el)
 		basic_machine=mipsisa64sb1el-unknown
 		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
 	sei)
 		basic_machine=mips-sei
 		os=-seiux
@@ -924,6 +969,9 @@ case $basic_machine in
 		basic_machine=sh-hitachi
 		os=-hms
 		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
 	sh64)
 		basic_machine=sh64-unknown
 		;;
@@ -1013,6 +1061,10 @@ case $basic_machine in
 		basic_machine=tic6x-unknown
 		os=-coff
 		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
 	tx39)
 		basic_machine=mipstx39-unknown
 		;;
@@ -1208,7 +1260,7 @@ case $os in
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
 	      | -uxpv* | -beos* | -mpeix* | -udk* \
@@ -1218,7 +1270,7 @@ case $os in
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1348,6 +1400,9 @@ case $os in
 	-zvmoe)
 		os=-zvmoe
 		;;
+	-dicos*)
+		os=-dicos
+		;;
 	-none)
 		;;
 	*)
@@ -1370,6 +1425,12 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
 	*-acorn)
 		os=-riscix1.2
 		;;
@@ -1379,9 +1440,9 @@ case $basic_machine in
 	arm*-semi)
 		os=-aout
 		;;
-    c4x-* | tic4x-*)
-        os=-coff
-        ;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
 		os=-tops20
@@ -1407,6 +1468,9 @@ case $basic_machine in
 	m68*-cisco)
 		os=-aout
 		;;
+        mep-*)
+		os=-elf
+		;;
 	mips*-cisco)
 		os=-elf
 		;;
diff --git a/configure b/configure
index b5d4798..062f480 100755
--- a/configure
+++ b/configure
@@ -1,27 +1,56 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for the Parma Polyhedra Library 0.9.
+# Generated by GNU Autoconf 2.61 for the Parma Polyhedra Library 0.10pre27.
 #
 # Report bugs to <ppl-devel at cs.unipr.it>.
 #
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
 
-# Be Bourne compatible
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
 fi
-DUALCASE=1; export DUALCASE # for MKS sh
 
 # Support unset when possible.
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
@@ -31,8 +60,43 @@ else
 fi
 
 
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
 # Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
 PS1='$ '
 PS2='> '
 PS4='+ '
@@ -46,18 +110,19 @@ do
   if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
     eval $as_var=C; export $as_var
   else
-    $as_unset $as_var
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
   fi
 done
 
 # Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
   as_basename=basename
 else
   as_basename=false
@@ -65,157 +130,388 @@ fi
 
 
 # Name of the executable.
-as_me=`$as_basename "$0" ||
+as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
 
+# CDPATH.
+$as_unset CDPATH
 
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
 fi
 
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
+  case $as_dir in
 	 /*)
-	   if ("$as_dir/$as_base" -c '
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
   as_lineno_1=$LINENO
   as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf at gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
   # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
     sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
       N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
       t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
+      s/-\n.*//
     ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
+  chmod +x "$as_me.lineno" ||
     { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
   # Exit status is that of the last command.
   exit
 }
 
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
 else
   as_expr=false
 fi
 
 rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
 echo >conf$$.file
 if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
     as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
 elif ln conf$$.file conf$$ 2>/dev/null; then
   as_ln_s=ln
 else
   as_ln_s='cp -p'
 fi
-rm -f conf$$ conf$$.exe conf$$.file
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
   as_mkdir_p=:
@@ -224,7 +520,28 @@ else
   as_mkdir_p=false
 fi
 
-as_executable_p="test -f"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -233,36 +550,27 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
 
 
 # Check that we are running under the correct shell.
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-case X$ECHO in
+case X$lt_ECHO in
 X*--fallback-echo)
   # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
   ;;
 esac
 
-echo=${ECHO-echo}
+ECHO=${lt_ECHO-echo}
 if test "X$1" = X--no-reexec; then
   # Discard the --no-reexec flag, and continue.
   shift
 elif test "X$1" = X--fallback-echo; then
   # Avoid inline document here, it may be left over
   :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $echo works!
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
   :
 else
   # Restart under the correct shell.
@@ -272,9 +580,9 @@ fi
 if test "X$1" = X--fallback-echo; then
   # used as fallback echo
   shift
-  cat <<EOF
+  cat <<_LT_EOF
 $*
-EOF
+_LT_EOF
   exit 0
 fi
 
@@ -282,192 +590,426 @@ fi
 # if CDPATH is set.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
-  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
-       echo_test_string=`eval $cmd` &&
-       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
-    then
-      break
-    fi
-  done
-fi
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
 
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-   test "X$echo_testing_string" = "X$echo_test_string"; then
-  :
-else
-  # The Solaris, AIX, and Digital Unix default echo programs unquote
-  # backslashes.  This makes it impossible to quote backslashes using
-  #   echo "$something" | sed 's/\\/\\\\/g'
-  #
-  # So, first we look for a working echo in the user's PATH.
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
 
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for dir in $PATH /usr/ucb; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
     IFS="$lt_save_ifs"
-    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      echo="$dir/echo"
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
 
-  if test "X$echo" = Xecho; then
-    # We didn't find a better echo, so look for alternatives.
-    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      # This shell has a builtin print -r that does the trick.
-      echo='print -r'
-    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-	 test "X$CONFIG_SHELL" != X/bin/ksh; then
-      # If we have ksh, try running configure again with it.
-      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-      export ORIGINAL_CONFIG_SHELL
-      CONFIG_SHELL=/bin/ksh
-      export CONFIG_SHELL
-      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
-    else
-      # Try using printf.
-      echo='printf %s\n'
-      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-	 test "X$echo_testing_string" = "X$echo_test_string"; then
-	# Cool, printf works
-	:
-      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	export CONFIG_SHELL
-	SHELL="$CONFIG_SHELL"
-	export SHELL
-	echo="$CONFIG_SHELL $0 --fallback-echo"
-      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	echo="$CONFIG_SHELL $0 --fallback-echo"
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
       else
-	# maybe with a smaller string...
-	prev=:
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
 
-	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
-	  then
-	    break
-	  fi
-	  prev="$cmd"
-	done
+	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
 
-	if test "$prev" != 'sed 50q "$0"'; then
-	  echo_test_string=`eval $prev`
-	  export echo_test_string
-	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
-	else
-	  # Oops.  We lost completely, so just stick with echo.
-	  echo=echo
-	fi
+	  if test "$prev" != 'sed 50q "$0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
       fi
     fi
   fi
 fi
-fi
 
 # Copy echo and quote the copy suitably for passing to libtool from
 # the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
 fi
 
 
 
 
-tagnames=${tagnames+${tagnames},}CXX
-
-tagnames=${tagnames+${tagnames},}F77
+exec 7<&0 </dev/null 6>&1
 
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
-exec 6>&1
-
 #
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_clean_files=
 ac_config_libobj_dir=.
+LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
 # Identity of this package.
 PACKAGE_NAME='the Parma Polyhedra Library'
 PACKAGE_TARNAME='ppl'
-PACKAGE_VERSION='0.9'
-PACKAGE_STRING='the Parma Polyhedra Library 0.9'
+PACKAGE_VERSION='0.10pre27'
+PACKAGE_STRING='the Parma Polyhedra Library 0.10pre27'
 PACKAGE_BUGREPORT='ppl-devel at cs.unipr.it'
 
 ac_unique_file="src/Polyhedron_public.cc"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
-#if HAVE_SYS_TYPES_H
+#ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#if HAVE_SYS_STAT_H
+#ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
-#if STDC_HEADERS
+#ifdef STDC_HEADERS
 # include <stdlib.h>
 # include <stddef.h>
 #else
-# if HAVE_STDLIB_H
+# ifdef HAVE_STDLIB_H
 #  include <stdlib.h>
 # endif
 #endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
 #  include <memory.h>
 # endif
 # include <string.h>
 #endif
-#if HAVE_STRINGS_H
+#ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
+#ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
 #endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
-ac_subdirs_all="$ac_subdirs_all Watchdog"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INS [...]
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+PPL_VERSION_MAJOR
+PPL_VERSION_MINOR
+PPL_VERSION_REVISION
+PPL_VERSION_BETA
+CONFIGURE_OPTIONS
+ISODATE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+CXX
+CXXFLAGS
+ac_ct_CXX
+CXXDEPMODE
+am__fastdepCXX_TRUE
+am__fastdepCXX_FALSE
+GREP
+EGREP
+CXXCPP
+ASSERTIONS_ENABLED_TRUE
+ASSERTIONS_ENABLED_FALSE
+USE_PRECOMPILED_HEADERS_TRUE
+USE_PRECOMPILED_HEADERS_FALSE
+USE_NATIVE_INTEGERS_TRUE
+USE_NATIVE_INTEGERS_FALSE
+USE_CHECKED_INTEGERS_TRUE
+USE_CHECKED_INTEGERS_FALSE
+USE_GMP_INTEGERS_TRUE
+USE_GMP_INTEGERS_FALSE
+USE_INT8_TRUE
+USE_INT8_FALSE
+USE_INT16_TRUE
+USE_INT16_FALSE
+USE_INT32_TRUE
+USE_INT32_FALSE
+USE_INT64_TRUE
+USE_INT64_FALSE
+PERL
+HAVE_PERL_TRUE
+HAVE_PERL_FALSE
+CPP
+CAN_CONTROL_FPU_TRUE
+CAN_CONTROL_FPU_FALSE
+SUPPORTED_FLOAT_TRUE
+SUPPORTED_FLOAT_FALSE
+SUPPORTED_DOUBLE_TRUE
+SUPPORTED_DOUBLE_FALSE
+SUPPORTED_LONG_DOUBLE_TRUE
+SUPPORTED_LONG_DOUBLE_FALSE
+LIBGMP
+LTLIBGMP
+LIBGMP_PREFIX
+LIBGMPXX
+LTLIBGMPXX
+LIBGMPXX_PREFIX
+BUILD_WATCHDOG_LIBRARY_TRUE
+BUILD_WATCHDOG_LIBRARY_FALSE
+subdirs
+BUILD_C_INTERFACE_TRUE
+BUILD_C_INTERFACE_FALSE
+JAVAC
+JAVA
+uudecode
+JAR
+JAVAH
+JNIFLAGS
+BUILD_JAVA_INTERFACE_TRUE
+BUILD_JAVA_INTERFACE_FALSE
+OCAMLC
+BUILD_OCAML_INTERFACE_TRUE
+BUILD_OCAML_INTERFACE_FALSE
+ciao_prolog
+CIAO_PROLOG
+CIAO_PROLOG_INCLUDE_OPTIONS
+BUILD_CIAO_PROLOG_INTERFACE_TRUE
+BUILD_CIAO_PROLOG_INTERFACE_FALSE
+GNU_PROLOG
+BUILD_GNU_PROLOG_INTERFACE_TRUE
+BUILD_GNU_PROLOG_INTERFACE_FALSE
+sicstus_prolog
+SICSTUS_PROLOG_INCLUDE_OPTIONS
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE
+swi_prolog
+SWI_PROLOG
+SWI_PROLOG_INCLUDE_OPTIONS
+SWI_PROLOG_LD_OPTIONS
+BUILD_SWI_PROLOG_INTERFACE_TRUE
+BUILD_SWI_PROLOG_INTERFACE_FALSE
+xsb_prolog
+XSB_PROLOG_INCLUDE_OPTIONS
+BUILD_XSB_PROLOG_INTERFACE_TRUE
+BUILD_XSB_PROLOG_INTERFACE_FALSE
+YAP_PROLOG
+BUILD_YAP_PROLOG_INTERFACE_TRUE
+BUILD_YAP_PROLOG_INTERFACE_FALSE
+BUILD_SOME_PROLOG_INTERFACES_TRUE
+BUILD_SOME_PROLOG_INTERFACES_FALSE
+THOROUGH_MAKE_CHECK_TRUE
+THOROUGH_MAKE_CHECK_FALSE
+LIBTOOL
+SED
+FGREP
+LD
+DUMPBIN
+ac_ct_DUMPBIN
+NM
+LN_S
+OBJDUMP
+AR
+RANLIB
+lt_ECHO
+DSYMUTIL
+NMEDIT
+LIPO
+OTOOL
+OTOOL64
+ENABLE_SHARED_TRUE
+ENABLE_SHARED_FALSE
+ENABLE_STATIC_TRUE
+ENABLE_STATIC_FALSE
+MD5SUM
+HAVE_MD5SUM_TRUE
+HAVE_MD5SUM_FALSE
+TEXT_MD5SUM
+HAVE_GLPK_TRUE
+HAVE_GLPK_FALSE
+HOST_OS_CYGWIN_TRUE
+HOST_OS_CYGWIN_FALSE
+HOST_OS_DARWIN_TRUE
+HOST_OS_DARWIN_FALSE
+HOST_OS_SOLARIS_TRUE
+HOST_OS_SOLARIS_FALSE
+HOST_CPU_X86_64_TRUE
+HOST_CPU_X86_64_FALSE
+NO_UNDEFINED_TRUE
+NO_UNDEFINED_FALSE
+extra_includes
+extra_libraries
+debug_flag
+coefficient_mnemonic
+required_instantiations
+required_instantiations_canonical_names
+required_instantiations_prolog_cxx_headers
+required_instantiations_prolog_cxx_sources
+required_instantiations_prolog_cxx_objects
+required_instantiations_java_sources
+required_instantiations_java_cxx_headers
+required_instantiations_java_cxx_headers_sources
+ocamlc_root
+LIBOBJS
+LTLIBOBJS'
 ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+CPP'
+ac_subdirs_all='Watchdog'
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -494,34 +1036,48 @@ x_libraries=NONE
 # and all the variables that are supposed to be based on exec_prefix
 # by default will actually change.
 # Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
 
 ac_prev=
+ac_dashdash=
 for ac_option
 do
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
+    eval $ac_prev=\$ac_option
     ac_prev=
     continue
   fi
 
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case $ac_option in
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
@@ -543,33 +1099,45 @@ do
   --config-cache | -C)
     cache_file=config.cache ;;
 
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+  -datadir | --datadir | --datadi | --datad)
     ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
     datadir=$ac_optarg ;;
 
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
   -disable-* | --disable-*)
     ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
     ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid feature name: $ac_feature" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -596,6 +1164,12 @@ do
   -host=* | --host=* | --hos=* | --ho=*)
     host_alias=$ac_optarg ;;
 
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
@@ -620,13 +1194,16 @@ do
   | --libexe=* | --libex=* | --libe=*)
     libexecdir=$ac_optarg ;;
 
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
   -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
+  | --localstate | --localstat | --localsta | --localst | --locals)
     ac_prev=localstatedir ;;
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
     localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
@@ -691,6 +1268,16 @@ do
   | --progr-tra=* | --program-tr=* | --program-t=*)
     program_transform_name=$ac_optarg ;;
 
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
@@ -743,24 +1330,20 @@ do
   -with-* | --with-*)
     ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
 
   -without-* | --without-*)
     ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid package name: $ac_package" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -791,8 +1374,7 @@ Try \`$0 --help' for more information." >&2
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
       { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
+    eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
@@ -812,27 +1394,19 @@ if test -n "$ac_prev"; then
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
 do
-  eval ac_val=$`echo $ac_var`
+  eval ac_val=\$$ac_var
   case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -859,94 +1433,76 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias-
 test "$silent" = yes && exec 6>/dev/null
 
 
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
 $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$0" : 'X\(//\)[^/]' \| \
 	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
   srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
+  if test ! -r "$srcdir/$ac_unique_file"; then
     srcdir=..
   fi
 else
   ac_srcdir_defaulted=no
 fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
-   { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
-  fi
 fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CXX_set=${CXX+set}
-ac_env_CXX_value=$CXX
-ac_cv_env_CXX_set=${CXX+set}
-ac_cv_env_CXX_value=$CXX
-ac_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_env_CXXFLAGS_value=$CXXFLAGS
-ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_cv_env_CXXFLAGS_value=$CXXFLAGS
-ac_env_CXXCPP_set=${CXXCPP+set}
-ac_env_CXXCPP_value=$CXXCPP
-ac_cv_env_CXXCPP_set=${CXXCPP+set}
-ac_cv_env_CXXCPP_value=$CXXCPP
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
-ac_env_F77_set=${F77+set}
-ac_env_F77_value=$F77
-ac_cv_env_F77_set=${F77+set}
-ac_cv_env_F77_value=$F77
-ac_env_FFLAGS_set=${FFLAGS+set}
-ac_env_FFLAGS_value=$FFLAGS
-ac_cv_env_FFLAGS_set=${FFLAGS+set}
-ac_cv_env_FFLAGS_value=$FFLAGS
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
 
 #
 # Report the --help message.
@@ -955,7 +1511,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 the Parma Polyhedra Library 0.9 to adapt to many kinds of systems.
+\`configure' configures the Parma Polyhedra Library 0.10pre27 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -975,9 +1531,6 @@ Configuration:
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
 
-_ACEOF
-
-  cat <<_ACEOF
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
 			  [$ac_default_prefix]
@@ -995,15 +1548,22 @@ Fine tuning of the installation directories:
   --bindir=DIR           user executables [EPREFIX/bin]
   --sbindir=DIR          system admin executables [EPREFIX/sbin]
   --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
   --libdir=DIR           object code libraries [EPREFIX/lib]
   --includedir=DIR       C header files [PREFIX/include]
   --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/ppl]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -1021,33 +1581,33 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of the Parma Polyhedra Library 0.9:";;
+     short | recursive ) echo "Configuration of the Parma Polyhedra Library 0.10pre27:";;
    esac
   cat <<\_ACEOF
 
 Optional Features:
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
   --enable-debugging      compile with debugging information
   --enable-profiling      compile for profiling
   --enable-coverage       compile for test coverage
   --enable-assertions     check run-time assertions
   --enable-more-assertions
-                          check even more run-time assertions
+                          break the ABI to check even more run-time assertions
   --enable-optimization   enable compiler optimizations
-  --enable-arch[=ARCH]
-                          optimize for architecture ARCH
+  --enable-arch[=ARCH]    optimize for architecture ARCH
+  --enable-fpmath         select floating point arithmetics
   --enable-pch            use precompiled headers, if available
   --enable-coefficients   select the type of the coefficients
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
   --disable-rpath         do not hardcode runtime library paths
   --enable-watchdog       build also the Parma Watchdog Library
   --enable-interfaces     enable some or all the library interfaces
-  --enable-shared[=PKGS]
-                          build shared libraries [default=yes]
-  --enable-static[=PKGS]
-                          build static libraries [default=yes]
+  --enable-instantiations enable instantiations for the non-C++ interfaces
+  --enable-check          select thorough or quick `make check'
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
@@ -1064,145 +1624,109 @@ Optional Packages:
   --without-libgmp-prefix     don't search for libgmp in includedir and libdir
   --with-libgmpxx-prefix[=DIR]  search for libgmpxx in DIR/include and DIR/lib
   --without-libgmpxx-prefix     don't search for libgmpxx in includedir and libdir
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-java=dir         use dir as Java SDK root directory
   --with-pic              try to use only PIC/non-PIC objects [default=use
                           both]
-  --with-tags[=TAGS]
-                          include additional configurations [automatic]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
 
 Some influential environment variables:
   CC          C compiler command
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
   CXXCPP      C++ preprocessor
   CPP         C preprocessor
-  F77         Fortran 77 compiler command
-  FFLAGS      Fortran 77 compiler flags
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
 Report bugs to <ppl-devel at cs.unipr.it>.
 _ACEOF
+ac_status=$?
 fi
 
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
+    test -d "$ac_dir" || continue
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
-test -n "$ac_init_help" && exit 0
+test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-the Parma Polyhedra Library configure 0.9
-generated by GNU Autoconf 2.59
+the Parma Polyhedra Library configure 0.10pre27
+generated by GNU Autoconf 2.61
 
-Copyright (C) 2003 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
-  exit 0
+  exit
 fi
-exec 5>config.log
-cat >&5 <<_ACEOF
+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 the Parma Polyhedra Library $as_me 0.9, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+It was created by the Parma Polyhedra Library $as_me 0.10pre27, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
+exec 5>>config.log
 {
 cat <<_ASUNAME
 ## --------- ##
@@ -1221,7 +1745,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown`
 /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
 /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
 /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
 /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
@@ -1235,6 +1759,7 @@ do
   test -z "$as_dir" && as_dir=.
   echo "PATH: $as_dir"
 done
+IFS=$as_save_IFS
 
 } >&5
 
@@ -1256,7 +1781,6 @@ _ACEOF
 ac_configure_args=
 ac_configure_args0=
 ac_configure_args1=
-ac_sep=
 ac_must_keep_next=false
 for ac_pass in 1 2
 do
@@ -1267,7 +1791,7 @@ do
     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    *\'*)
       ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
@@ -1289,9 +1813,7 @@ do
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
+      ac_configure_args="$ac_configure_args '$ac_arg'"
       ;;
     esac
   done
@@ -1302,8 +1824,8 @@ $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
 # would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
   # Save into config.log some information that might help in debugging.
   {
@@ -1316,20 +1838,34 @@ trap 'exit_status=$?
 _ASBOX
     echo
     # The following way of writing the cache mishandles newlines in values,
-{
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
   (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
       sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
     *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
       ;;
-    esac;
-}
+    esac |
+    sort
+)
     echo
 
     cat <<\_ASBOX
@@ -1340,22 +1876,28 @@ _ASBOX
     echo
     for ac_var in $ac_subst_vars
     do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
       cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
 _ASBOX
       echo
       for ac_var in $ac_subst_files
       do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1367,26 +1909,24 @@ _ASBOX
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h | sort
+      cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
       echo "$as_me: caught signal $ac_signal"
     echo "$as_me: exit $exit_status"
   } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
-     ' 0
+' 0
 for ac_signal in 1 2 13 15; do
   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
+rm -f -r conftest* confdefs.h
 
 # Predefined preprocessor variables.
 
@@ -1417,14 +1957,17 @@ _ACEOF
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in $CONFIG_SITE; do
+shift
+for ac_site_file
+do
   if test -r "$ac_site_file"; then
     { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
@@ -1440,8 +1983,8 @@ if test -r "$cache_file"; then
     { echo "$as_me:$LINENO: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
     esac
   fi
 else
@@ -1453,12 +1996,11 @@ fi
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+for ac_var in $ac_precious_vars; do
   eval ac_old_set=\$ac_cv_env_${ac_var}_set
   eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
       { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
@@ -1483,8 +2025,7 @@ echo "$as_me:   current value: $ac_new_val" >&2;}
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1501,12 +2042,6 @@ echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start ov
    { (exit 1); exit 1; }; }
 fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
 
 
 
@@ -1531,6 +2066,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
@@ -1540,32 +2080,128 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 # Make sure the sources are there.
 
 
-# Use Automake.
-am__api_version="1.9"
+# Specify the location of additional local Autoconf macros.
+
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
+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
+  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
+  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
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+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.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Use Automake.
+am__api_version='1.10'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -1580,8 +2216,8 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1603,7 +2239,7 @@ case $as_dir/ in
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -1622,21 +2258,22 @@ case $as_dir/ in
     ;;
 esac
 done
+IFS=$as_save_IFS
 
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
     INSTALL=$ac_cv_path_install
   else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
+    # removed, or if the value is a relative name.
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -1646,8 +2283,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
 # Just in case
 sleep 1
 echo timestamp > conftest.file
@@ -1689,20 +2326,20 @@ echo "$as_me: error: newly created file is older than distributed files!
 Check your system clock" >&2;}
    { (exit 1); exit 1; }; }
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 test "$program_prefix" != NONE &&
-  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
-  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
 # Double any \ or $.  echo might interpret backslashes.
 # By default was `s,x,x', remove it if useless.
 cat <<\_ACEOF >conftest.sed
 s/[\\$]/&&/g;s/;s,x,x,$//
 _ACEOF
 program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm conftest.sed
+rm -f conftest.sed
 
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
@@ -1717,45 +2354,60 @@ else
 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
-if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-  # We used to keeping the `.' as first argument, in order to
-  # allow $(mkdir_p) to be used without argument.  As in
-  #   $(mkdir_p) $(somedir)
-  # where $(somedir) is conditionally defined.  However this is wrong
-  # for two reasons:
-  #  1. if the package is installed by a user who cannot write `.'
-  #     make install will fail,
-  #  2. the above comment should most certainly read
-  #     $(mkdir_p) $(DESTDIR)$(somedir)
-  #     so it does not work when $(somedir) is undefined and
-  #     $(DESTDIR) is not.
-  #  To support the latter case, we have to write
-  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
-  #  so the `.' trick is pointless.
-  mkdir_p='mkdir -p --'
-else
-  # On NextStep and OpenStep, the `mkdir' command does not
-  # recognize any option.  It will interpret all options as
-  # directories to create, and then abort because `.' already
-  # exists.
-  for d in ./-p ./--version;
-  do
-    test -d $d && rmdir $d
-  done
-  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
-  if test -f "$ac_aux_dir/mkinstalldirs"; then
-    mkdir_p='$(mkinstalldirs)'
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
   else
-    mkdir_p='$(install_sh) -d'
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
   fi
 fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
 
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_AWK+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1768,54 +2420,57 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AWK="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
   test -n "$AWK" && break
 done
 
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
 all:
-	@echo 'ac_maketemp="$(MAKE)"'
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
 rm -f conftest.make
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   SET_MAKE=
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -1828,12 +2483,16 @@ else
 fi
 rmdir .tst 2>/dev/null
 
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
    { (exit 1); exit 1; }; }
+  fi
 fi
 
 # test whether we have cygpath
@@ -1848,18 +2507,9 @@ fi
 
 # Define the identity of the package.
  PACKAGE='ppl'
- VERSION='0.9'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
+ VERSION='0.10pre27'
 
 
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
 # Some tools Automake needs.
 
 ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
@@ -1876,7 +2526,7 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
 
 # Installed binaries are usually stripped using `strip' when the user
 # run `make install-strip'.  However `strip' might not be the right
@@ -1886,8 +2536,8 @@ if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1900,32 +2550,34 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
 if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -1938,33 +2590,47 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
 else
   STRIP="$ac_cv_prog_STRIP"
 fi
 
 fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
@@ -2005,7 +2671,7 @@ fi
 
 
 cat >>confdefs.h <<_ACEOF
-#define PPL_CONFIGURE_OPTIONS "$ac_configure_args"
+#define CONFIGURE_OPTIONS "$ac_configure_args"
 _ACEOF
 
 PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
@@ -2016,68 +2682,14 @@ docdir='${datadir}/doc/ppl'
 
 
 # Generate a configuration header file.
-          ac_config_headers="$ac_config_headers config.h"
-
-
-ISODATE=`date +%Y-%m-%d`
+ac_config_headers="$ac_config_headers config.h"
 
 
-# Check for host type.
-# Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
-   { (exit 1); exit 1; }; }
-
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
-if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
-build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
-if test "${ac_cv_host+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
-host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
+# Generate prefixed defines.
+ac_config_commands="$ac_config_commands $PACKAGE-config.h"
 
 
+ISODATE=`date +%Y-%m-%d`
 
 
 
@@ -2087,777 +2699,1201 @@ host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 # C compiler
 
 
-# Check whether --with-cc or --without-cc was given.
+# Check whether --with-cc was given.
 if test "${with_cc+set}" = set; then
-  withval="$with_cc"
-  CC=$with_cc
-fi;
+  withval=$with_cc; CC=$with_cc
+fi
+
 
 # C++ compiler
 
 
-# Check whether --with-cxx or --without-cxx was given.
+# Check whether --with-cxx was given.
 if test "${with_cxx+set}" = set; then
-  withval="$with_cxx"
-  CXX=$with_cxx
-fi;
-
-# Compilation flags
+  withval=$with_cxx; CXX=$with_cxx
+fi
 
-COMP_FLAGS=""
-OPT_FLAGS=""
 
-enableval=yes
-echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
-echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6
-# Check whether --enable-debugging or --disable-debugging was given.
-if test "${enable_debugging+set}" = set; then
-  enableval="$enable_debugging"
+# Checks for programs.
+# Note that AC_PROG_CC must precede the first use of $GCC abd AC_PROG_CXX
+# must precede the first use of $GXX.  Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+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_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  OPT_FLAGS="-g"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
-
-enableval=no
-echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
-echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6
-# Check whether --enable-profiling or --disable-profiling was given.
-if test "${enable_profiling+set}" = set; then
-  enableval="$enable_profiling"
-
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  OPT_FLAGS="-g"
-  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-enableval=no
-echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
-echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6
-# Check whether --enable-coverage or --disable-coverage was given.
-if test "${enable_coverage+set}" = set; then
-  enableval="$enable_coverage"
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  OPT_FLAGS="-g"
-  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+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_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-enableval=no
-echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
-echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6
-# Check whether --enable-assertions or --disable-assertions was given.
-if test "${enable_assertions+set}" = set; then
-  enableval="$enable_assertions"
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
 esac
-enable_assertions=${enableval}
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
 
-enableval=no
-echo "$as_me:$LINENO: checking whether to enable even more run-time assertions" >&5
-echo $ECHO_N "checking whether to enable even more run-time assertions... $ECHO_C" >&6
-# Check whether --enable-more-assertions or --disable-more-assertions was given.
-if test "${enable_more_assertions+set}" = set; then
-  enableval="$enable_more_assertions"
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+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_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
-esac
-enable_more_assertions=${enableval}
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-if test x"$enable_more_assertions" = xyes
-then
-  enable_assertions=yes
 
-cat >>confdefs.h <<\_ACEOF
-#define EXTRA_ROW_DEBUG 1
-_ACEOF
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+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
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-if test x"$enable_assertions" = xno
-then
 
-cat >>confdefs.h <<\_ACEOF
-#define NDEBUG 1
-_ACEOF
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+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_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-  debug_flag="-DNDEBUG=1"
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+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_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-if test x"$enable_assertions" = xyes; then
-  ASSERTIONS_ENABLED_TRUE=
-  ASSERTIONS_ENABLED_FALSE='#'
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
 else
-  ASSERTIONS_ENABLED_TRUE='#'
-  ASSERTIONS_ENABLED_FALSE=
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
+  test -n "$ac_ct_CC" && break
+done
 
-arch=no
-enableval=standard
-echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
-echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6
-# Check whether --enable-optimization or --disable-optimization was given.
-if test "${enable_optimization+set}" = set; then
-  enableval="$enable_optimization"
-
-fi;
-case "${enableval}" in
-sspeed)
-  echo "$as_me:$LINENO: result: sspeed" >&5
-echo "${ECHO_T}sspeed" >&6
-  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
-  arch=yes
-  ;;
-speed)
-  echo "$as_me:$LINENO: result: speed" >&5
-echo "${ECHO_T}speed" >&6
-  OPT_FLAGS="$OPT_FLAGS -O3"
-  arch=yes
-  ;;
-size)
-  echo "$as_me:$LINENO: result: size" >&5
-echo "${ECHO_T}size" >&6
-  OPT_FLAGS="$OPT_FLAGS -Os"
-  arch=yes
-  ;;
-standard | yes)
-  echo "$as_me:$LINENO: result: standard" >&5
-echo "${ECHO_T}standard" >&6
-  OPT_FLAGS="$OPT_FLAGS -O2"
-  ;;
-mild)
-  echo "$as_me:$LINENO: result: mild" >&5
-echo "${ECHO_T}mild" >&6
-  OPT_FLAGS="$OPT_FLAGS -O1"
-  ;;
-zero)
-  echo "$as_me:$LINENO: result: zero" >&5
-echo "${ECHO_T}zero" >&6
-  OPT_FLAGS="$OPT_FLAGS -O0"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
 esac
+    CC=$ac_ct_CC
+  fi
+fi
 
-enableval=$arch
-echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
-echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6
-# Check whether --enable-arch or --disable-arch was given.
-if test "${enable_arch+set}" = set; then
-  enableval="$enable_arch"
-
-fi;
-case "${enableval}" in
-yes)
-  m=`uname -m`
-  case $m in
-  i?86 | k6 | athlon)
-    echo "$as_me:$LINENO: result: $m" >&5
-echo "${ECHO_T}$m" >&6
-    OPT_FLAGS="$OPT_FLAGS -march=$m"
-    ;;
-  *)
-    echo "$as_me:$LINENO: result: default" >&5
-echo "${ECHO_T}default" >&6
-    ;;
-  esac
-  ;;
-no)
-  echo "$as_me:$LINENO: result: default" >&5
-echo "${ECHO_T}default" >&6
-  ;;
-*)
-  echo "$as_me:$LINENO: result: $enableval" >&5
-echo "${ECHO_T}$enableval" >&6
-  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
-  ;;
-esac
+fi
 
-enableval=no
-echo "$as_me:$LINENO: checking whether to use precompiled headers" >&5
-echo $ECHO_N "checking whether to use precompiled headers... $ECHO_C" >&6
-# Check whether --enable-pch or --disable-pch was given.
-if test "${enable_pch+set}" = set; then
-  enableval="$enable_pch"
 
-fi;
-case "${enableval}" in
-yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
-  ;;
-no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-pch, needs yes or no" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-pch, needs yes or no" >&2;}
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
-  ;;
-esac
-
 
-if test x"$enableval" = xyes; then
-  USE_PRECOMPILED_HEADERS_TRUE=
-  USE_PRECOMPILED_HEADERS_FALSE='#'
-else
-  USE_PRECOMPILED_HEADERS_TRUE='#'
-  USE_PRECOMPILED_HEADERS_FALSE=
-fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
 
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-CFLAGS="$COMP_FLAGS $OPT_FLAGS"
-CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+int
+main ()
+{
 
-enableval=mpz
-echo "$as_me:$LINENO: checking the type of integral values to use as coefficients" >&5
-echo $ECHO_N "checking the type of integral values to use as coefficients... $ECHO_C" >&6
-# Check whether --enable-coefficients or --disable-coefficients was given.
-if test "${enable_coefficients+set}" = set; then
-  enableval="$enable_coefficients"
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
 
-fi;
-case "${enableval}" in
-native-int8)
-  echo "$as_me:$LINENO: result: native 8 bits integers" >&5
-echo "${ECHO_T}native 8 bits integers" >&6
-  coefficient_kind=native
-  coefficient_bits=8
-  coefficient_mnemonic=nint8
-  ;;
-native-int16)
-  echo "$as_me:$LINENO: result: native 16 bits integers" >&5
-echo "${ECHO_T}native 16 bits integers" >&6
-  coefficient_kind=native
-  coefficient_bits=16
-  coefficient_mnemonic=nint16
-  ;;
-native-int32)
-  echo "$as_me:$LINENO: result: native 32 bits integers" >&5
-echo "${ECHO_T}native 32 bits integers" >&6
-  coefficient_kind=native
-  coefficient_bits=32
-  coefficient_mnemonic=nint32
-  ;;
-native-int64)
-  echo "$as_me:$LINENO: result: native 64 bits integers" >&5
-echo "${ECHO_T}native 64 bits integers" >&6
-  coefficient_kind=native
-  coefficient_bits=64
-  coefficient_mnemonic=nint64
-  ;;
-checked-int8)
-  echo "$as_me:$LINENO: result: checked 8 bits integers" >&5
-echo "${ECHO_T}checked 8 bits integers" >&6
-  coefficient_kind=checked
-  coefficient_bits=8
-  coefficient_mnemonic=int8
-  ;;
-checked-int16)
-  echo "$as_me:$LINENO: result: checked 16 bits integers" >&5
-echo "${ECHO_T}checked 16 bits integers" >&6
-  coefficient_kind=checked
-  coefficient_bits=16
-  coefficient_mnemonic=int16
-  ;;
-checked-int32)
-  echo "$as_me:$LINENO: result: checked 32 bits integers" >&5
-echo "${ECHO_T}checked 32 bits integers" >&6
-  coefficient_kind=checked
-  coefficient_bits=32
-  coefficient_mnemonic=int32
-  ;;
-checked-int64)
-  echo "$as_me:$LINENO: result: checked 64 bits integers" >&5
-echo "${ECHO_T}checked 64 bits integers" >&6
-  coefficient_kind=checked
-  coefficient_bits=64
-  coefficient_mnemonic=int64
-  ;;
-mpz)
-  echo "$as_me:$LINENO: result: GMP mpz" >&5
-echo "${ECHO_T}GMP mpz" >&6
-  coefficient_kind=unbounded
-  coefficient_bits=0
-  coefficient_mnemonic=mpz
-  ;;
-*)
-  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&5
-echo "$as_me: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&2;}
-   { (exit 1); exit 1; }; }
-  ;;
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
 esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
 
+else
+  ac_file=''
+fi
 
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-if test x"$coefficient_kind" = xnative; then
-  USE_NATIVE_INTEGERS_TRUE=
-  USE_NATIVE_INTEGERS_FALSE='#'
-else
-  USE_NATIVE_INTEGERS_TRUE='#'
-  USE_NATIVE_INTEGERS_FALSE=
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
 fi
 
+ac_exeext=$ac_cv_exeext
 
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 
-if test x"$coefficient_kind" = xchecked; then
-  USE_CHECKED_INTEGERS_TRUE=
-  USE_CHECKED_INTEGERS_FALSE='#'
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
 else
-  USE_CHECKED_INTEGERS_TRUE='#'
-  USE_CHECKED_INTEGERS_FALSE=
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 fi
 
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
 
-
-if test x"$coefficient_kind" = xunbounded; then
-  USE_GMP_INTEGERS_TRUE=
-  USE_GMP_INTEGERS_FALSE='#'
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  USE_GMP_INTEGERS_TRUE='#'
-  USE_GMP_INTEGERS_FALSE=
-fi
-
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+int
+main ()
+{
 
-if test x"$coefficient_bits" = x8; then
-  USE_INT8_TRUE=
-  USE_INT8_FALSE='#'
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
 else
-  USE_INT8_TRUE='#'
-  USE_INT8_FALSE=
-fi
-
-
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-if test x"$coefficient_bits" = x16; then
-  USE_INT16_TRUE=
-  USE_INT16_FALSE='#'
-else
-  USE_INT16_TRUE='#'
-  USE_INT16_FALSE=
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 fi
 
-
-
-if test x"$coefficient_bits" = x32; then
-  USE_INT32_TRUE=
-  USE_INT32_FALSE='#'
-else
-  USE_INT32_TRUE='#'
-  USE_INT32_FALSE=
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
 
-
-if test x"$coefficient_bits" = x64; then
-  USE_INT64_TRUE=
-  USE_INT64_FALSE='#'
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
 else
-  USE_INT64_TRUE='#'
-  USE_INT64_FALSE=
-fi
-
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_compiler_gnu=no
+fi
 
-if test x"$coefficient_kind" = xnative
-then
-  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy>"
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
-cat >>confdefs.h <<_ACEOF
-#define COEFFICIENT_TYPE $coefficient_type
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+int
+main ()
+{
 
-cat >>confdefs.h <<_ACEOF
-#define COEFFICIENT_BITS $coefficient_bits
+  ;
+  return 0;
+}
 _ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-
-cat >>confdefs.h <<\_ACEOF
-#define NATIVE_INTEGERS 1
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-elif test x"$coefficient_kind" = xchecked
-then
-  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t>"
-  cat >>confdefs.h <<_ACEOF
-#define COEFFICIENT_TYPE $coefficient_type
-_ACEOF
+int
+main ()
+{
 
-  cat >>confdefs.h <<_ACEOF
-#define COEFFICIENT_BITS $coefficient_bits
+  ;
+  return 0;
+}
 _ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-
-cat >>confdefs.h <<\_ACEOF
-#define CHECKED_INTEGERS 1
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-elif test x"$coefficient_kind" = xunbounded
-then
-  cat >>confdefs.h <<\_ACEOF
-#define COEFFICIENT_TYPE mpz_class
-_ACEOF
+int
+main ()
+{
 
-  cat >>confdefs.h <<\_ACEOF
-#define COEFFICIENT_BITS 0
+  ;
+  return 0;
+}
 _ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
 
-cat >>confdefs.h <<\_ACEOF
-#define GMP_INTEGERS 1
-_ACEOF
-
 fi
 
-# Allow additions to C and C++ compilation flags
-
-
-# Check whether --with-cflags or --without-cflags was given.
-if test "${with_cflags+set}" = set; then
-  withval="$with_cflags"
-  CFLAGS="$CFLAGS $with_cflags"
-fi;
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-# Check whether --with-cxxflags or --without-cxxflags was given.
-if test "${with_cxxflags+set}" = set; then
-  withval="$with_cxxflags"
-  CXXFLAGS="$CXXFLAGS $with_cxxflags"
-fi;
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-# Checks for programs.
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
 else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
 
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
 
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
 fi
 
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
 
 fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
 fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
 fi
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
 
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval=$enable_dependency_tracking;
 fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
 fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
 fi
 
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
 
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
 
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
   fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
 fi
+
 fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
 fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+
+
+CFLAGS="$save_CFLAGS"
+
+# The Intel C compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  { echo "$as_me:$LINENO: checking whether we are actually using the Intel C compiler" >&5
+echo $ECHO_N "checking whether we are actually using the Intel C compiler... $ECHO_C" >&6; }
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ICC=yes
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ICC=no
 fi
 
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
+
+save_CXXFLAGS="$CXXFLAGS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -2865,41 +3901,43 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-    test -n "$CC" && break
+
+    test -n "$CXX" && break
   done
 fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -2907,61 +3945,89 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  test -n "$ac_ct_CC" && break
+
+  test -n "$ac_ct_CXX" && break
 done
 
-  CC=$ac_ct_CC
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
 fi
 
+  fi
 fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
 # Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 
-cat >conftest.$ac_ext <<_ACEOF
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -2971,158 +4037,63 @@ cat >>conftest.$ac_ext <<_ACEOF
 int
 main ()
 {
+#ifndef __GNUC__
+       choke me
+#endif
 
   ;
   return 0;
 }
 _ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
-	break;;
-    * )
-	break;;
-  esac
-done
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
+	ac_compiler_gnu=no
 fi
 
-ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  fi
 fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
-if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
 int
 main ()
@@ -3132,42 +4103,30 @@ main ()
   return 0;
 }
 _ACEOF
-rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
+	CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3177,59 +4136,36 @@ cat >>conftest.$ac_ext <<_ACEOF
 int
 main ()
 {
-#ifndef __GNUC__
-       choke me
-#endif
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
+	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -3245,1299 +4181,1328 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cc_g=no
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
   else
-    CFLAGS="-g"
+    CXXFLAGS="-g"
   fi
 else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
   else
-    CFLAGS=
+    CXXFLAGS=
   fi
 fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+CXXFLAGS="$save_CXXFLAGS"
+
+# The Intel C++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  { echo "$as_me:$LINENO: checking whether we are actually using the Intel C++ compiler" >&5
+echo $ECHO_N "checking whether we are actually using the Intel C++ compiler... $ECHO_C" >&6; }
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
 
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+#ifndef __INTEL_COMPILER
+choke me
+#endif
 
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
 _ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ICPC=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ICPC=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 fi
-rm -f conftest.err conftest.$ac_objext
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
 done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
+
+done
+IFS=$as_save_IFS
+
 
 fi
 
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
 do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+  # Broken: fails on valid input.
 continue
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
+#include <ac_nonexistent.h>
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
 
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+rm -f conftest.err conftest.$ac_ext
 
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-          ac_config_commands="$ac_config_commands depfiles"
 
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
 
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo done
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
 fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
 fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+  # Broken: fails on valid input.
+continue
+fi
 
-echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6
-rm -f confinc confmf
+rm -f conftest.err conftest.$ac_ext
 
-# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then
-  enableval="$enable_dependency_tracking"
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-fi;
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
 
+rm -f conftest.err conftest.$ac_ext
 
-if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
 else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 fi
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-
-
-depcc="$CC"   am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
 fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
-
-
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
 else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
 fi
 
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CXX+set}" = set; then
+# 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:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  echo "$as_me:$LINENO: result: $CXX" >&5
-echo "${ECHO_T}$CXX" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
 
-    test -n "$CXX" && break
-  done
 fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
   fi
-done
-done
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Compilation flags
 
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+{ echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
+echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6; }
+# Check whether --enable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+  enableval=$enable_debugging;
 fi
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  OPT_FLAGS="-g"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
+echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6; }
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then
+  enableval=$enable_profiling;
 fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
-echo "${ECHO_T}$ac_ct_CXX" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
+echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6; }
+# Check whether --enable-coverage was given.
+if test "${enable_coverage+set}" = set; then
+  enableval=$enable_coverage;
 fi
 
-  test -n "$ac_ct_CXX" && break
-done
-test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
 
-  CXX=$ac_ct_CXX
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
+echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6; }
+# Check whether --enable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+  enableval=$enable_assertions;
 fi
 
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+enable_assertions=${enableval}
 
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C++ compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to enable even more run-time assertions" >&5
+echo $ECHO_N "checking whether to enable even more run-time assertions... $ECHO_C" >&6; }
+# Check whether --enable-more-assertions was given.
+if test "${enable_more_assertions+set}" = set; then
+  enableval=$enable_more_assertions;
+fi
 
-echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+enable_more_assertions=${enableval}
 
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
+if test x"$enable_more_assertions" = xyes
+then
+  enable_assertions=yes
 
-  ;
-  return 0;
-}
+cat >>confdefs.h <<\_ACEOF
+#define ABI_BREAKING_EXTRA_DEBUG 1
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
-fi
-echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
-GXX=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-CXXFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
-echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cxx_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
+cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_DEBUG 1
 _ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
 
-int
-main ()
-{
 
-  ;
-  return 0;
-}
+cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_DEBUG_PEDANTIC 1
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cxx_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_cxx_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
+if test x"$enable_assertions" = xno
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define NDEBUG 1
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
+  debug_flag="-DNDEBUG=1"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
 
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+ if test x"$enable_assertions" = xyes; then
+  ASSERTIONS_ENABLED_TRUE=
+  ASSERTIONS_ENABLED_FALSE='#'
 else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
+  ASSERTIONS_ENABLED_TRUE='#'
+  ASSERTIONS_ENABLED_FALSE=
+fi
 
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
 
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
+arch=no
+enableval=standard
+{ echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
+echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6; }
+# Check whether --enable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+  enableval=$enable_optimization;
 fi
 
-fi
-echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+case "${enableval}" in
+sspeed)
+  { echo "$as_me:$LINENO: result: sspeed" >&5
+echo "${ECHO_T}sspeed" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  { echo "$as_me:$LINENO: result: speed" >&5
+echo "${ECHO_T}speed" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  { echo "$as_me:$LINENO: result: size" >&5
+echo "${ECHO_T}size" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  { echo "$as_me:$LINENO: result: standard" >&5
+echo "${ECHO_T}standard" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  { echo "$as_me:$LINENO: result: mild" >&5
+echo "${ECHO_T}mild" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  { echo "$as_me:$LINENO: result: zero" >&5
+echo "${ECHO_T}zero" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
 
+enableval=$arch
+{ echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
+echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6; }
+# Check whether --enable-arch was given.
+if test "${enable_arch+set}" = set; then
+  enableval=$enable_arch;
+fi
 
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    { echo "$as_me:$LINENO: result: $m" >&5
+echo "${ECHO_T}$m" >&6; }
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    { echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6; }
+    ;;
+  esac
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6; }
+  ;;
+*)
+  { echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
 
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
+enableval=default
+fpmath_may_use_387=yes
+fpmath_may_use_sse=yes
+{ echo "$as_me:$LINENO: checking whether to select specific floating point arithmetics" >&5
+echo $ECHO_N "checking whether to select specific floating point arithmetics... $ECHO_C" >&6; }
+# Check whether --enable-fpmath was given.
+if test "${enable_fpmath+set}" = set; then
+  enableval=$enable_fpmath;
 fi
 
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
-echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
-if test -z "$CXXCPP"; then
-  if test "${ac_cv_prog_CXXCPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
+case "${enableval}" in
+sse)
+  { echo "$as_me:$LINENO: result: sse" >&5
+echo "${ECHO_T}sse" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse"
+  # The SSE instruction set only supports single precision arithmetics:
+  # double and extended precision arithmetics is still done using 387.
+  ;;
+sse2)
+  { echo "$as_me:$LINENO: result: sse2" >&5
+echo "${ECHO_T}sse2" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse"
+  # SSE2 still does not support extended precision arithmetics.
+  ;;
+387)
+  { echo "$as_me:$LINENO: result: 387" >&5
+echo "${ECHO_T}387" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -mno-sse -mno-sse2 -mfpmath=387"
+  # Note that the -mno-sse* and -mfpmath options are only guaranteed
+  # to work with GCC.
+  if test x"$GCC" = xyes
+  then
+    fpmath_may_use_sse=no
   fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  ;;
+sse+387)
+  { echo "$as_me:$LINENO: result: sse+387" >&5
+echo "${ECHO_T}sse+387" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387"
+  ;;
+sse2+387)
+  { echo "$as_me:$LINENO: result: sse2+387" >&5
+echo "${ECHO_T}sse2+387" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387"
+  ;;
+default)
+  { echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6; }
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
 
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
+if test x"$fpmath_may_use_387" = xyes
+then
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
+cat >>confdefs.h <<\_ACEOF
+#define FPMATH_MAY_USE_387 1
 _ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
+
+fi
+
+if test x"$fpmath_may_use_sse" = xyes
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define FPMATH_MAY_USE_SSE 1
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+
+fi
+
+# Disable all transformations and optimizations that assume default
+# floating point rounding behavior.
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    OPT_FLAGS="$OPT_FLAGS -fp-model strict -fp-speculation off"
   else
-    ac_cpp_err=
+    OPT_FLAGS="$OPT_FLAGS -frounding-math"
   fi
-else
-  ac_cpp_err=yes
 fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
+enableval=no
+{ echo "$as_me:$LINENO: checking whether to use precompiled headers" >&5
+echo $ECHO_N "checking whether to use precompiled headers... $ECHO_C" >&6; }
+# Check whether --enable-pch was given.
+if test "${enable_pch+set}" = set; then
+  enableval=$enable_pch;
 fi
-rm -f conftest.err conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
+case "${enableval}" in
+yes)
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+  ;;
+no)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-pch, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-pch, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+ if test x"$enableval" = xyes; then
+  USE_PRECOMPILED_HEADERS_TRUE=
+  USE_PRECOMPILED_HEADERS_FALSE='#'
+else
+  USE_PRECOMPILED_HEADERS_TRUE='#'
+  USE_PRECOMPILED_HEADERS_FALSE=
 fi
 
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
 
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
+
+enableval=mpz
+{ echo "$as_me:$LINENO: checking the type of integral values to use as coefficients" >&5
+echo $ECHO_N "checking the type of integral values to use as coefficients... $ECHO_C" >&6; }
+# Check whether --enable-coefficients was given.
+if test "${enable_coefficients+set}" = set; then
+  enableval=$enable_coefficients;
 fi
-  CXXCPP=$ac_cv_prog_CXXCPP
+
+case "${enableval}" in
+native-int8)
+  { echo "$as_me:$LINENO: result: native 8 bits integers" >&5
+echo "${ECHO_T}native 8 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=8
+  coefficient_mnemonic=nint8
+  ;;
+native-int16)
+  { echo "$as_me:$LINENO: result: native 16 bits integers" >&5
+echo "${ECHO_T}native 16 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=16
+  coefficient_mnemonic=nint16
+  ;;
+native-int32)
+  { echo "$as_me:$LINENO: result: native 32 bits integers" >&5
+echo "${ECHO_T}native 32 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=32
+  coefficient_mnemonic=nint32
+  ;;
+native-int64)
+  { echo "$as_me:$LINENO: result: native 64 bits integers" >&5
+echo "${ECHO_T}native 64 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=64
+  coefficient_mnemonic=nint64
+  ;;
+checked-int8)
+  { echo "$as_me:$LINENO: result: checked 8 bits integers" >&5
+echo "${ECHO_T}checked 8 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=8
+  coefficient_mnemonic=int8
+  ;;
+checked-int16)
+  { echo "$as_me:$LINENO: result: checked 16 bits integers" >&5
+echo "${ECHO_T}checked 16 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=16
+  coefficient_mnemonic=int16
+  ;;
+checked-int32)
+  { echo "$as_me:$LINENO: result: checked 32 bits integers" >&5
+echo "${ECHO_T}checked 32 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=32
+  coefficient_mnemonic=int32
+  ;;
+checked-int64)
+  { echo "$as_me:$LINENO: result: checked 64 bits integers" >&5
+echo "${ECHO_T}checked 64 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=64
+  coefficient_mnemonic=int64
+  ;;
+mpz)
+  { echo "$as_me:$LINENO: result: GMP mpz" >&5
+echo "${ECHO_T}GMP mpz" >&6; }
+  coefficient_kind=unbounded
+  coefficient_bits=0
+  coefficient_mnemonic=mpz
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+ if test x"$coefficient_kind" = xnative; then
+  USE_NATIVE_INTEGERS_TRUE=
+  USE_NATIVE_INTEGERS_FALSE='#'
 else
-  ac_cv_prog_CXXCPP=$CXXCPP
+  USE_NATIVE_INTEGERS_TRUE='#'
+  USE_NATIVE_INTEGERS_FALSE=
 fi
-echo "$as_me:$LINENO: result: $CXXCPP" >&5
-echo "${ECHO_T}$CXXCPP" >&6
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
+
+ if test x"$coefficient_kind" = xchecked; then
+  USE_CHECKED_INTEGERS_TRUE=
+  USE_CHECKED_INTEGERS_FALSE='#'
 else
-  ac_cpp_err=yes
+  USE_CHECKED_INTEGERS_TRUE='#'
+  USE_CHECKED_INTEGERS_FALSE=
 fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Broken: fails on valid input.
-continue
+ if test x"$coefficient_kind" = xunbounded; then
+  USE_GMP_INTEGERS_TRUE=
+  USE_GMP_INTEGERS_FALSE='#'
+else
+  USE_GMP_INTEGERS_TRUE='#'
+  USE_GMP_INTEGERS_FALSE=
 fi
-rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
+ if test x"$coefficient_bits" = x8; then
+  USE_INT8_TRUE=
+  USE_INT8_FALSE='#'
 else
-  ac_cpp_err=yes
+  USE_INT8_TRUE='#'
+  USE_INT8_FALSE=
 fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
+ if test x"$coefficient_bits" = x16; then
+  USE_INT16_TRUE=
+  USE_INT16_FALSE='#'
 else
-  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+  USE_INT16_TRUE='#'
+  USE_INT16_FALSE=
 fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.make <<\_ACEOF
-all:
-	@echo 'ac_maketemp="$(MAKE)"'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
+ if test x"$coefficient_bits" = x32; then
+  USE_INT32_TRUE=
+  USE_INT32_FALSE='#'
 else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftest.make
+  USE_INT32_TRUE='#'
+  USE_INT32_FALSE=
 fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  SET_MAKE=
+
+ if test x"$coefficient_bits" = x64; then
+  USE_INT64_TRUE=
+  USE_INT64_FALSE='#'
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  SET_MAKE="MAKE=${MAKE-make}"
+  USE_INT64_TRUE='#'
+  USE_INT64_FALSE=
 fi
 
-# 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:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
-  ./ | .// | /cC/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-done
 
 
+if test x"$coefficient_kind" = xnative
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy>"
+
+cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define NATIVE_INTEGERS 1
+_ACEOF
+
+elif test x"$coefficient_kind" = xchecked
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t>"
+  cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+  cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define CHECKED_INTEGERS 1
+_ACEOF
+
+elif test x"$coefficient_kind" = xunbounded
+then
+  cat >>confdefs.h <<\_ACEOF
+#define COEFFICIENT_TYPE mpz_class
+_ACEOF
+
+  cat >>confdefs.h <<\_ACEOF
+#define COEFFICIENT_BITS 0
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define GMP_INTEGERS 1
+_ACEOF
+
 fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL=$ac_install_sh
-  fi
+
+# Allow additions to C and C++ compilation flags
+
+
+# Check whether --with-cflags was given.
+if test "${with_cflags+set}" = set; then
+  withval=$with_cflags; CFLAGS="$CFLAGS $with_cflags"
 fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
 
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
 
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+# Check whether --with-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then
+  withval=$with_cxxflags; CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi
 
 
 # Check for Perl.
 # Extract the first word of "perl", so it can be a program name with args.
 set dummy perl; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
 if test "${ac_cv_path_PERL+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4552,32 +5517,31 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
   ;;
 esac
 fi
 PERL=$ac_cv_path_PERL
-
 if test -n "$PERL"; then
-  echo "$as_me:$LINENO: result: $PERL" >&5
-echo "${ECHO_T}$PERL" >&6
+  { echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
 
-
-if test x"$PERL" != xno; then
+ if test x"$PERL" != xno; then
   HAVE_PERL_TRUE=
   HAVE_PERL_FALSE='#'
 else
@@ -4593,9 +5557,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-
-echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
 if test "${ac_cv_c_const+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4613,10 +5576,10 @@ main ()
 #ifndef __cplusplus
   /* Ultrix mips cc rejects this.  */
   typedef int charset[2];
-  const charset x;
+  const charset cs;
   /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *ccp;
-  char **p;
+  char const *const *pcpcc;
+  char **ppc;
   /* NEC SVR4.0.2 mips cc rejects this.  */
   struct point {int x, y;};
   static struct point const zero = {0,0};
@@ -4625,16 +5588,17 @@ main ()
      an arm of an if-expression whose if-part is not a constant
      expression */
   const char *g = "string";
-  ccp = &g + (g ? g-g : 0);
+  pcpcc = &g + (g ? g-g : 0);
   /* HPUX 7.0 cc rejects these. */
-  ++ccp;
-  p = (char**) ccp;
-  ccp = (char const *const *) p;
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
   { /* SCO 3.2v4 cc rejects this.  */
     char *t;
     char const *s = 0 ? (char *) 0 : (char const *) 0;
 
     *t++ = 0;
+    if (s) return 0;
   }
   { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
     int x[] = {25, 17};
@@ -4653,7 +5617,9 @@ main ()
   }
   { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
     const int foo = 10;
+    if (!foo) return 0;
   }
+  return !cs[0] && !zero.x;
 #endif
 
   ;
@@ -4661,38 +5627,34 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_c_const=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_c_const=no
+	ac_cv_c_const=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
 if test $ac_cv_c_const = no; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -4701,8 +5663,8 @@ _ACEOF
 
 fi
 
-echo "$as_me:$LINENO: checking for inline" >&5
-echo $ECHO_N "checking for inline... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
 if test "${ac_cv_c_inline+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -4722,39 +5684,37 @@ $ac_kw foo_t foo () {return 0; }
 
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_c_inline=$ac_kw; break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_inline=$ac_kw
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
 done
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
-echo "${ECHO_T}$ac_cv_c_inline" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6; }
 
 
 case $ac_cv_c_inline in
@@ -4772,296 +5732,62 @@ _ACEOF
     ;;
 esac
 
-echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
-echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
-if test "${ac_cv_c_bigendian+set}" = set; then
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  # See if sys/param.h defines the BYTE_ORDER macro.
-cat >conftest.$ac_ext <<_ACEOF
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/param.h>
-
-int
-main ()
-{
-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
- bogus endian macros
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
 #endif
-
-  ;
-  return 0;
-}
+		     Syntax error
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
- not big endian
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_c_bigendian=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_c_bigendian=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-# It does not; compile a test program.
-if test "$cross_compiling" = yes; then
-  # try to guess the endianness by grepping values into an object file
-  ac_cv_c_bigendian=unknown
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
-int
-main ()
-{
- _ascii (); _ebcdic ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
-  ac_cv_c_bigendian=yes
-fi
-if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-  if test "$ac_cv_c_bigendian" = unknown; then
-    ac_cv_c_bigendian=no
-  else
-    # finding both strings is unlikely to happen, but who knows?
-    ac_cv_c_bigendian=unknown
-  fi
-fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-int
-main ()
-{
-  /* Are we little or big endian?  From Harbison&Steele.  */
-  union
-  {
-    long l;
-    char c[sizeof (long)];
-  } u;
-  u.l = 1;
-  exit (u.c[sizeof (long) - 1] == 1);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_c_bigendian=no
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_c_bigendian=yes
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
-echo "${ECHO_T}$ac_cv_c_bigendian" >&6
-case $ac_cv_c_bigendian in
-  yes)
-
-cat >>confdefs.h <<\_ACEOF
-#define WORDS_BIGENDIAN 1
-_ACEOF
- ;;
-  no)
-     ;;
-  *)
-    { { echo "$as_me:$LINENO: error: unknown endianness
-presetting ac_cv_c_bigendian=no (or yes) will help" >&5
-echo "$as_me: error: unknown endianness
-presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
-   { (exit 1); exit 1; }; } ;;
-esac
-
-
-# Checks for C type sizes.
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -5070,9 +5796,10 @@ sed 's/^/| /' conftest.$ac_ext >&5
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -5082,24 +5809,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -5110,6 +5835,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -5127,8 +5853,8 @@ fi
 else
   ac_cv_prog_CPP=$CPP
 fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -5151,24 +5877,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 #endif
 		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   :
 else
   echo "$as_me: failed program was:" >&5
@@ -5177,9 +5901,10 @@ sed 's/^/| /' conftest.$ac_ext >&5
   # Broken: fails on valid input.
 continue
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
+  # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -5189,24 +5914,22 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   # Broken: success on invalid input.
 continue
 else
@@ -5217,6 +5940,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ac_preproc_ok=:
 break
 fi
+
 rm -f conftest.err conftest.$ac_ext
 
 done
@@ -5239,8 +5963,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -5264,35 +5988,31 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+	ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
@@ -5348,6 +6068,7 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <ctype.h>
+#include <stdlib.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
@@ -5367,18 +6088,27 @@ main ()
   for (i = 0; i < 256; i++)
     if (XOR (islower (i), ISLOWER (i))
 	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
+      return 2;
+  return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -5391,12 +6121,14 @@ sed 's/^/| /' conftest.$ac_ext >&5
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
+
+
 fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -5419,9 +6151,9 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
 		  inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -5435,38 +6167,35 @@ $ac_includes_default
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-eval "$as_ac_Header=no"
+	eval "$as_ac_Header=no"
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
@@ -5477,173 +6206,391 @@ fi
 done
 
 
-echo "$as_me:$LINENO: checking for int" >&5
-echo $ECHO_N "checking for int... $ECHO_C" >&6
-if test "${ac_cv_type_int+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; }
+if test "${ac_cv_c_bigendian+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+#include <sys/types.h>
+#include <sys/param.h>
+
 int
 main ()
 {
-if ((int *) 0)
-  return 0;
-if (sizeof (int))
-  return 0;
+#if  ! (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN \
+	&& BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN)
+ bogus endian macros
+#endif
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_int=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_bigendian=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int=no
+	ac_cv_c_bigendian=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
-echo "${ECHO_T}$ac_cv_type_int" >&6
 
-echo "$as_me:$LINENO: checking size of int" >&5
-echo $ECHO_N "checking size of int... $ECHO_C" >&6
-if test "${ac_cv_sizeof_int+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
-  if test "$ac_cv_type_int" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
-  if test "$cross_compiling" = yes; then
-  # Depending upon the size, compute the lo and hi bounds.
-cat >conftest.$ac_ext <<_ACEOF
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	# It does not; compile a test program.
+if test "$cross_compiling" = yes; then
+  # try to guess the endianness by grepping values into an object file
+  ac_cv_c_bigendian=unknown
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
-test_array [0] = 0
-
+ _ascii (); _ebcdic ();
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
+  ac_cv_c_bigendian=yes
+fi
+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+  if test "$ac_cv_c_bigendian" = unknown; then
+    ac_cv_c_bigendian=no
+  else
+    # finding both strings is unlikely to happen, but who knows?
+    ac_cv_c_bigendian=unknown
+  fi
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+  /* Are we little or big endian?  From Harbison&Steele.  */
+  union
+  {
+    long int l;
+    char c[sizeof (long int)];
+  } u;
+  u.l = 1;
+  return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat >conftest.$ac_ext <<_ACEOF
+  ac_cv_c_bigendian=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6; }
+case $ac_cv_c_bigendian in
+  yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+ ;;
+  no)
+     ;;
+  *)
+    { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+
+
+  { echo "$as_me:$LINENO: checking for typeof syntax and keyword spelling" >&5
+echo $ECHO_N "checking for typeof syntax and keyword spelling... $ECHO_C" >&6; }
+if test "${ac_cv_c_typeof+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_typeof=no
+     for ac_kw in typeof __typeof__ no; do
+       test $ac_kw = no && break
+       cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
-test_array [0] = 0
+
+	   int value;
+	   typedef struct {
+		   char a [1
+			   + ! (($ac_kw (value))
+				(($ac_kw (value)) 0 < ($ac_kw (value)) -1
+				 ? ($ac_kw (value)) - 1
+				 : ~ (~ ($ac_kw (value)) 0
+				      << sizeof ($ac_kw (value)))))]; }
+	      ac__typeof_type_;
+	   return
+	     (! ((void) ((ac__typeof_type_ *) 0), 0));
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_hi=$ac_mid; break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_typeof=$ac_kw
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+       test $ac_cv_c_typeof != no && break
+     done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_typeof" >&5
+echo "${ECHO_T}$ac_cv_c_typeof" >&6; }
+  if test $ac_cv_c_typeof != no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TYPEOF 1
+_ACEOF
+
+    if test $ac_cv_c_typeof != typeof; then
+
+cat >>confdefs.h <<_ACEOF
+#define typeof $ac_cv_c_typeof
+_ACEOF
+
+    fi
+  fi
+
+
+# Checks for C type sizes.
+{ echo "$as_me:$LINENO: checking for char" >&5
+echo $ECHO_N "checking for char... $ECHO_C" >&6; }
+if test "${ac_cv_type_char+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef char ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_char=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_cv_type_char=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
+echo "${ECHO_T}$ac_cv_type_char" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of char" >&5
+echo $ECHO_N "checking size of char... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_char+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5651,10 +6598,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -5662,28 +6610,23 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_hi=-1 ac_mid=-1
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -5692,10 +6635,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -5703,64 +6647,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_lo=$ac_mid; break
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
-  cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef char ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -5768,52 +6701,146 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef char ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef char ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_int=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+?*) ac_cv_sizeof_char=$ac_lo;;
+'') if test "$ac_cv_type_char" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -5821,8 +6848,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (int)); }
-unsigned long ulongval () { return (long) (sizeof (int)); }
+   typedef char ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -5831,69 +6859,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (int))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (int))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_int=`cat conftest.val`
+  ac_cv_sizeof_char=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+if test "$ac_cv_type_char" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (int), 77
+echo "$as_me: error: cannot compute sizeof (char)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_char=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_int=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
-echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_char" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
+#define SIZEOF_CHAR $ac_cv_sizeof_char
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for long" >&5
-echo $ECHO_N "checking for long... $ECHO_C" >&6
-if test "${ac_cv_type_long+set}" = set; then
+{ echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6; }
+if test "${ac_cv_type_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -5903,61 +6943,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef short ac__type_new_;
 int
 main ()
 {
-if ((long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_long=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_short=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long=no
+	ac_cv_type_short=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
-echo "${ECHO_T}$ac_cv_type_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6; }
 
-echo "$as_me:$LINENO: checking size of long" >&5
-echo $ECHO_N "checking size of long... $ECHO_C" >&6
-if test "${ac_cv_sizeof_long+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -5967,10 +7003,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -5978,27 +7015,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6008,10 +7040,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6019,56 +7052,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -6076,27 +7106,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6106,10 +7131,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6117,50 +7143,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -6171,10 +7195,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef short ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6182,52 +7207,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+?*) ac_cv_sizeof_short=$ac_lo;;
+'') if test "$ac_cv_type_short" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -6235,8 +7253,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long)); }
-unsigned long ulongval () { return (long) (sizeof (long)); }
+   typedef short ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -6245,69 +7264,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_long=`cat conftest.val`
+  ac_cv_sizeof_short=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+if test "$ac_cv_type_short" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
+echo "$as_me: error: cannot compute sizeof (short)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_short=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
+#define SIZEOF_SHORT $ac_cv_sizeof_short
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for long long" >&5
-echo $ECHO_N "checking for long long... $ECHO_C" >&6
-if test "${ac_cv_type_long_long+set}" = set; then
+{ echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6; }
+if test "${ac_cv_type_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -6317,61 +7348,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef int ac__type_new_;
 int
 main ()
 {
-if ((long long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_long_long=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_int=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long_long=no
+	ac_cv_type_int=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
-echo "${ECHO_T}$ac_cv_type_long_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6; }
 
-echo "$as_me:$LINENO: checking size of long long" >&5
-echo $ECHO_N "checking size of long long... $ECHO_C" >&6
-if test "${ac_cv_sizeof_long_long+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -6381,10 +7408,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -6392,27 +7420,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6422,10 +7445,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6433,56 +7457,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -6490,27 +7511,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6520,10 +7536,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6531,50 +7548,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -6585,10 +7600,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6596,52 +7612,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_long_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long long), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -6649,8 +7658,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long long)); }
-unsigned long ulongval () { return (long) (sizeof (long long)); }
+   typedef int ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -6659,69 +7669,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_long_long=`cat conftest.val`
+  ac_cv_sizeof_int=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+if test "$ac_cv_type_int" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long long), 77
+echo "$as_me: error: cannot compute sizeof (int)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long_long=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+#define SIZEOF_INT $ac_cv_sizeof_int
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for unsigned" >&5
-echo $ECHO_N "checking for unsigned... $ECHO_C" >&6
-if test "${ac_cv_type_unsigned+set}" = set; then
+{ echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
+if test "${ac_cv_type_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -6731,61 +7753,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long ac__type_new_;
 int
 main ()
 {
-if ((unsigned *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (unsigned))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_unsigned=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_unsigned=no
+	ac_cv_type_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_unsigned" >&5
-echo "${ECHO_T}$ac_cv_type_unsigned" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
 
-echo "$as_me:$LINENO: checking size of unsigned" >&5
-echo $ECHO_N "checking size of unsigned... $ECHO_C" >&6
-if test "${ac_cv_sizeof_unsigned+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_unsigned" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -6795,10 +7813,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -6806,27 +7825,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6836,10 +7850,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6847,56 +7862,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -6904,27 +7916,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -6934,10 +7941,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -6945,50 +7953,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -6999,10 +8005,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7010,52 +8017,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_unsigned=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned), 77
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (unsigned), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -7063,8 +8063,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (unsigned)); }
-unsigned long ulongval () { return (long) (sizeof (unsigned)); }
+   typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -7073,69 +8074,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (unsigned))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (unsigned))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (unsigned))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_unsigned=`cat conftest.val`
+  ac_cv_sizeof_long=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned), 77
+if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (unsigned), 77
+echo "$as_me: error: cannot compute sizeof (long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_unsigned=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned" >&5
-echo "${ECHO_T}$ac_cv_sizeof_unsigned" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned
+#define SIZEOF_LONG $ac_cv_sizeof_long
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for unsigned long" >&5
-echo $ECHO_N "checking for unsigned long... $ECHO_C" >&6
-if test "${ac_cv_type_unsigned_long+set}" = set; then
+{ echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6; }
+if test "${ac_cv_type_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -7145,61 +8158,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long long ac__type_new_;
 int
 main ()
 {
-if ((unsigned long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (unsigned long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_unsigned_long=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_long_long=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_unsigned_long=no
+	ac_cv_type_long_long=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long" >&5
-echo "${ECHO_T}$ac_cv_type_unsigned_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6; }
 
-echo "$as_me:$LINENO: checking size of unsigned long" >&5
-echo $ECHO_N "checking size of unsigned long... $ECHO_C" >&6
-if test "${ac_cv_sizeof_unsigned_long+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long long" >&5
+echo $ECHO_N "checking size of long long... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_unsigned_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -7209,10 +8218,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -7220,27 +8230,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -7250,10 +8255,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7261,56 +8267,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -7318,27 +8321,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -7348,10 +8346,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7359,50 +8358,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -7413,10 +8410,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long long ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7424,52 +8422,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_unsigned_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+?*) ac_cv_sizeof_long_long=$ac_lo;;
+'') if test "$ac_cv_type_long_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+echo "$as_me: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long_long=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -7477,8 +8468,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (unsigned long)); }
-unsigned long ulongval () { return (long) (sizeof (unsigned long)); }
+   typedef long long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -7487,69 +8479,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (unsigned long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (unsigned long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (unsigned long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_unsigned_long=`cat conftest.val`
+  ac_cv_sizeof_long_long=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+if test "$ac_cv_type_long_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+echo "$as_me: error: cannot compute sizeof (long long)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long_long=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_unsigned_long=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_unsigned_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for unsigned long long" >&5
-echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
-if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+{ echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_size_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -7559,61 +8563,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef size_t ac__type_new_;
 int
 main ()
 {
-if ((unsigned long long *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (unsigned long long))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_unsigned_long_long=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_size_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_unsigned_long_long=no
+	ac_cv_type_size_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
-echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6; }
 
-echo "$as_me:$LINENO: checking size of unsigned long long" >&5
-echo $ECHO_N "checking size of unsigned long long... $ECHO_C" >&6
-if test "${ac_cv_sizeof_unsigned_long_long+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of size_t" >&5
+echo $ECHO_N "checking size of size_t... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_size_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_unsigned_long_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -7623,10 +8623,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef size_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -7634,27 +8635,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -7664,10 +8660,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef size_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7675,56 +8672,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef size_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -7732,27 +8726,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -7762,10 +8751,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef size_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7773,50 +8763,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -7827,10 +8815,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef size_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -7838,52 +8827,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_unsigned_long_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long), 77
+?*) ac_cv_sizeof_size_t=$ac_lo;;
+'') if test "$ac_cv_type_size_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (unsigned long long), 77
+echo "$as_me: error: cannot compute sizeof (size_t)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -7891,8 +8873,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (unsigned long long)); }
-unsigned long ulongval () { return (long) (sizeof (unsigned long long)); }
+   typedef size_t ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -7901,69 +8884,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (unsigned long long))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (unsigned long long))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (unsigned long long))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_unsigned_long_long=`cat conftest.val`
+  ac_cv_sizeof_size_t=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long), 77
+if test "$ac_cv_type_size_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (unsigned long long), 77
+echo "$as_me: error: cannot compute sizeof (size_t)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_unsigned_long_long=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_unsigned_long_long" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for size_t" >&5
-echo $ECHO_N "checking for size_t... $ECHO_C" >&6
-if test "${ac_cv_type_size_t+set}" = set; then
+{ echo "$as_me:$LINENO: checking for float" >&5
+echo $ECHO_N "checking for float... $ECHO_C" >&6; }
+if test "${ac_cv_type_float+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -7973,61 +8968,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef float ac__type_new_;
 int
 main ()
 {
-if ((size_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (size_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_size_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_float=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_size_t=no
+	ac_cv_type_float=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
-echo "${ECHO_T}$ac_cv_type_size_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_float" >&5
+echo "${ECHO_T}$ac_cv_type_float" >&6; }
 
-echo "$as_me:$LINENO: checking size of size_t" >&5
-echo $ECHO_N "checking size of size_t... $ECHO_C" >&6
-if test "${ac_cv_sizeof_size_t+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of float" >&5
+echo $ECHO_N "checking size of float... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_float+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_size_t" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -8037,10 +9028,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef float ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -8048,27 +9040,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -8078,10 +9065,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef float ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8089,56 +9077,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef float ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (size_t))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -8146,27 +9131,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -8176,10 +9156,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef float ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8187,50 +9168,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -8241,10 +9220,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef float ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8252,52 +9232,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_size_t=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77
+?*) ac_cv_sizeof_float=$ac_lo;;
+'') if test "$ac_cv_type_float" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (float)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (size_t), 77
+echo "$as_me: error: cannot compute sizeof (float)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_float=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -8305,8 +9278,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (size_t)); }
-unsigned long ulongval () { return (long) (sizeof (size_t)); }
+   typedef float ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -8315,69 +9289,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (size_t))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (size_t))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (size_t))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_size_t=`cat conftest.val`
+  ac_cv_sizeof_float=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77
+if test "$ac_cv_type_float" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (float)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (size_t), 77
+echo "$as_me: error: cannot compute sizeof (float)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_float=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_size_t=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5
-echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_float" >&5
+echo "${ECHO_T}$ac_cv_sizeof_float" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for float" >&5
-echo $ECHO_N "checking for float... $ECHO_C" >&6
-if test "${ac_cv_type_float+set}" = set; then
+{ echo "$as_me:$LINENO: checking for double" >&5
+echo $ECHO_N "checking for double... $ECHO_C" >&6; }
+if test "${ac_cv_type_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -8387,61 +9373,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef double ac__type_new_;
 int
 main ()
 {
-if ((float *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (float))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_float=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_double=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_float=no
+	ac_cv_type_double=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_float" >&5
-echo "${ECHO_T}$ac_cv_type_float" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_double" >&5
+echo "${ECHO_T}$ac_cv_type_double" >&6; }
 
-echo "$as_me:$LINENO: checking size of float" >&5
-echo $ECHO_N "checking size of float... $ECHO_C" >&6
-if test "${ac_cv_sizeof_float+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of double" >&5
+echo $ECHO_N "checking size of double... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_float" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -8451,10 +9433,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (float))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -8462,27 +9445,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -8492,10 +9470,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8503,56 +9482,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (float))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -8560,27 +9536,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -8590,10 +9561,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (float))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8601,50 +9573,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -8655,10 +9625,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8666,52 +9637,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_float=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77
+?*) ac_cv_sizeof_double=$ac_lo;;
+'') if test "$ac_cv_type_double" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (double)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (float), 77
+echo "$as_me: error: cannot compute sizeof (double)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_double=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -8719,8 +9683,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (float)); }
-unsigned long ulongval () { return (long) (sizeof (float)); }
+   typedef double ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -8729,69 +9694,81 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (float))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (float))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (float))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_float=`cat conftest.val`
+  ac_cv_sizeof_double=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77
+if test "$ac_cv_type_double" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (double)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (float), 77
+echo "$as_me: error: cannot compute sizeof (double)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_double=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_float=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_float" >&5
-echo "${ECHO_T}$ac_cv_sizeof_float" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_double" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_FLOAT $ac_cv_sizeof_float
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for double" >&5
-echo $ECHO_N "checking for double... $ECHO_C" >&6
-if test "${ac_cv_type_double+set}" = set; then
+{ echo "$as_me:$LINENO: checking for long double" >&5
+echo $ECHO_N "checking for long double... $ECHO_C" >&6; }
+if test "${ac_cv_type_long_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -8801,61 +9778,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef long double ac__type_new_;
 int
 main ()
 {
-if ((double *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (double))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_double=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_long_double=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_double=no
+	ac_cv_type_long_double=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_double" >&5
-echo "${ECHO_T}$ac_cv_type_double" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5
+echo "${ECHO_T}$ac_cv_type_long_double" >&6; }
 
-echo "$as_me:$LINENO: checking size of double" >&5
-echo $ECHO_N "checking size of double... $ECHO_C" >&6
-if test "${ac_cv_sizeof_double+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long double" >&5
+echo $ECHO_N "checking size of long double... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_long_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_double" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -8865,10 +9838,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (double))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -8876,27 +9850,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -8906,10 +9875,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -8917,56 +9887,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (double))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -8974,27 +9941,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -9004,10 +9966,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (double))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -9015,50 +9978,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -9069,10 +10030,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef long double ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -9080,52 +10042,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_double=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77
+?*) ac_cv_sizeof_long_double=$ac_lo;;
+'') if test "$ac_cv_type_long_double" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (double), 77
+echo "$as_me: error: cannot compute sizeof (long double)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long_double=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -9133,8 +10088,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (double)); }
-unsigned long ulongval () { return (long) (sizeof (double)); }
+   typedef long double ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -9143,69 +10099,84 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (double))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (double))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (double))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_double=`cat conftest.val`
+  ac_cv_sizeof_long_double=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77
+if test "$ac_cv_type_long_double" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (double), 77
+echo "$as_me: error: cannot compute sizeof (long double)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long_double=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_double=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_double" >&5
-echo "${ECHO_T}$ac_cv_sizeof_double" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_double" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
 _ACEOF
 
 
-echo "$as_me:$LINENO: checking for long double" >&5
-echo $ECHO_N "checking for long double... $ECHO_C" >&6
-if test "${ac_cv_type_long_double+set}" = set; then
+# The following are required to validate an horrible kludge working
+# around an horrible bug in <gprolog.h> (see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+{ echo "$as_me:$LINENO: checking for int*" >&5
+echo $ECHO_N "checking for int*... $ECHO_C" >&6; }
+if test "${ac_cv_type_intp+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -9215,61 +10186,57 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef int* ac__type_new_;
 int
 main ()
 {
-if ((long double *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (long double))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_long_double=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_intp=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_long_double=no
+	ac_cv_type_intp=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5
-echo "${ECHO_T}$ac_cv_type_long_double" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_intp" >&5
+echo "${ECHO_T}$ac_cv_type_intp" >&6; }
 
-echo "$as_me:$LINENO: checking size of long double" >&5
-echo $ECHO_N "checking size of long double... $ECHO_C" >&6
-if test "${ac_cv_sizeof_long_double+set}" = set; then
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of int*" >&5
+echo $ECHO_N "checking size of int*... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_intp+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_long_double" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -9279,10 +10246,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int* ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -9290,27 +10258,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -9320,10 +10283,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int* ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -9331,56 +10295,53 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int* ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long double))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -9388,27 +10349,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -9418,10 +10374,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int* ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -9429,50 +10386,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -9483,10 +10438,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+   typedef int* ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -9494,52 +10450,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
-?*) ac_cv_sizeof_long_double=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+?*) ac_cv_sizeof_intp=$ac_lo;;
+'') if test "$ac_cv_type_intp" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int*)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long double), 77
+echo "$as_me: error: cannot compute sizeof (int*)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_intp=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -9547,8 +10496,9 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-long longval () { return (long) (sizeof (long double)); }
-unsigned long ulongval () { return (long) (sizeof (long double)); }
+   typedef int* ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -9557,336 +10507,398 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (long double))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (long double))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long double))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_sizeof_long_double=`cat conftest.val`
+  ac_cv_sizeof_intp=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+if test "$ac_cv_type_intp" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (int*)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long double), 77
+echo "$as_me: error: cannot compute sizeof (int*)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_intp=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_long_double=0
-fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long_double" >&6
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
-_ACEOF
-
-
-
-# Use C++ for the remaining checks.
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_intp" >&5
+echo "${ECHO_T}$ac_cv_sizeof_intp" >&6; }
 
 
 
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INTP $ac_cv_sizeof_intp
+_ACEOF
 
 
-for ac_header in fenv.h ieeefp.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for fp" >&5
+echo $ECHO_N "checking for fp... $ECHO_C" >&6; }
+if test "${ac_cv_type_fp+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
+typedef int *(*fp)();
+
+typedef fp ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_fp=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_cv_type_fp=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_fp" >&5
+echo "${ECHO_T}$ac_cv_type_fp" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of fp" >&5
+echo $ECHO_N "checking size of fp... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_fp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <$ac_header>
+typedef int *(*fp)();
+
+   typedef fp ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+typedef int *(*fp)();
+
+   typedef fp ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-  ac_header_preproc=no
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
 
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to ppl-devel at cs.unipr.it ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
 else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+	cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+typedef int *(*fp)();
 
-fi
-
-done
+   typedef fp ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
 
-echo "$as_me:$LINENO: checking for the possibility to control the FPU" >&5
-echo $ECHO_N "checking for the possibility to control the FPU... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+typedef int *(*fp)();
 
+   typedef fp ac__type_sizeof_;
 int
-main() {
-#if i386
-#elif defined(HAVE_FENV_H)
-#elif sparc && defined( HAVE_IEEEFP_H)
-#else
-  choke me
-#endif
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
 
   ;
   return 0;
 }
-
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ac_cv_can_control_fpu=1
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ac_cv_can_control_fpu=0
-
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext,
 
-
-if test $ac_cv_can_control_fpu = 1; then
-  CAN_CONTROL_FPU_TRUE=
-  CAN_CONTROL_FPU_FALSE='#'
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
 else
-  CAN_CONTROL_FPU_TRUE='#'
-  CAN_CONTROL_FPU_FALSE=
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_lo= ac_hi=
 fi
 
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-cat >>confdefs.h <<_ACEOF
-#define PPL_CAN_CONTROL_FPU $ac_cv_can_control_fpu
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+typedef int *(*fp)();
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-# Detect the binary format used by C++ floats.
+   typedef fp ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
 
-ac_save_CPPFLAGS="$CPPFLAGS"
-ac_save_LIBS="$LIBS"
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
 
-echo "$as_me:$LINENO: checking the binary format of C++ floats" >&5
-echo $ECHO_N "checking the binary format of C++ floats... $ECHO_C" >&6
-ac_cxx_float_binary_format=unknown
-if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_fp=$ac_lo;;
+'') if test "$ac_cv_type_fp" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (fp)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
+echo "$as_me: error: cannot compute sizeof (fp)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_fp=0
+   fi ;;
+esac
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -9894,269 +10906,347 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+typedef int *(*fp)();
 
-#include <limits>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#if SIZEOF_FLOAT == 4
-
-inline float
-convert(uint32_t x) {
-  union {
-    float value;
-    uint32_t word;
-  } u;
-
-  u.word = x;
-  return u.value;
-}
-
+   typedef fp ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
 int
-main() {
-  return std::numeric_limits<float>::is_iec559
-    && (convert(0xaaacccaaUL)
-	== -3.069535185924732179074680971098132431507110595703125e-13
-    &&  convert(0xcccaaaccUL)
-	== -106255968)
-  ? 0 : 1;
-}
+main ()
+{
 
-#else // SIZEOF_FLOAT != 4
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
 
-int
-main() {
-  return 1;
+  ;
+  return 0;
 }
-
-#endif // SIZEOF_FLOAT != 4
-
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-
-cat >>confdefs.h <<\_ACEOF
-#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
-_ACEOF
-
-  ac_cxx_float_binary_format="IEEE754 Single Precision"
+  ac_cv_sizeof_fp=`cat conftest.val`
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+( exit $ac_status )
+if test "$ac_cv_type_fp" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (fp)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (fp)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_fp=0
+   fi
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
-
-echo "$as_me:$LINENO: result: $ac_cxx_float_binary_format" >&5
-echo "${ECHO_T}$ac_cxx_float_binary_format" >&6
-
-if test x"$ac_cxx_float_binary_format" = x"unknown"
-then
-  ac_supported_float=0
-else
-  ac_supported_float=1
+rm -f conftest.val
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_fp" >&5
+echo "${ECHO_T}$ac_cv_sizeof_fp" >&6; }
 
 
-if test $ac_supported_float = 1; then
-  SUPPORTED_FLOAT_TRUE=
-  SUPPORTED_FLOAT_FALSE='#'
-else
-  SUPPORTED_FLOAT_TRUE='#'
-  SUPPORTED_FLOAT_FALSE=
-fi
-
 
 cat >>confdefs.h <<_ACEOF
-#define PPL_SUPPORTED_FLOAT $ac_supported_float
+#define SIZEOF_FP $ac_cv_sizeof_fp
 _ACEOF
 
 
-ac_ext=cc
+
+# Use C++ for the remaining checks.
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-CPPFLAGS="$ac_save_CPPFLAGS"
-LIBS="$ac_save_LIBS"
 
+# Check for the possibility to control the FPU.
 
-# Detect the binary format used by C++ doubles.
 
-ac_save_CPPFLAGS="$CPPFLAGS"
-ac_save_LIBS="$LIBS"
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking the binary format of C++ doubles" >&5
-echo $ECHO_N "checking the binary format of C++ doubles... $ECHO_C" >&6
-ac_cxx_double_binary_format=unknown
-if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+
+for ac_header in fenv.h ieeefp.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-
-#include <limits>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#if SIZEOF_DOUBLE == 8
-
-double
-convert(uint32_t msp, uint32_t lsp) {
-  union {
-    double value;
-    struct {
-#ifdef WORDS_BIGENDIAN
-      uint32_t msp;
-      uint32_t lsp;
-#else
-      uint32_t lsp;
-      uint32_t msp;
-#endif
-    } parts;
-  } u;
-
-  u.parts.msp = msp;
-  u.parts.lsp = lsp;
-  return u.value;
-}
-
-int
-main() {
-  return std::numeric_limits<double>::is_iec559
-    && (convert(0xaaacccaaUL, 0xacccaaacUL)
-	== -4.018242396032647e-103
-    &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
-	  == -85705035845709846787631445265530356117787053916987832397725696.0)
-    ? 0 : 1;
-}
-
-#else // SIZEOF_DOUBLE != 8
-
-int
-main() {
-  return 1;
-}
-
-#endif // SIZEOF_DOUBLE != 8
-
+$ac_includes_default
+#include <$ac_header>
 _ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-cat >>confdefs.h <<\_ACEOF
-#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
-_ACEOF
-
-  ac_cxx_double_binary_format="IEEE754 Double Precision"
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
 else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+	ac_header_compiler=no
 fi
 
-echo "$as_me:$LINENO: result: $ac_cxx_double_binary_format" >&5
-echo "${ECHO_T}$ac_cxx_double_binary_format" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
-if test x"$ac_cxx_double_binary_format" = x"unknown"
-then
-  ac_supported_double=0
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
 else
-  ac_supported_double=1
-fi
-
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-if test $ac_supported_double = 1; then
-  SUPPORTED_DOUBLE_TRUE=
-  SUPPORTED_DOUBLE_FALSE='#'
-else
-  SUPPORTED_DOUBLE_TRUE='#'
-  SUPPORTED_DOUBLE_FALSE=
+  ac_header_preproc=no
 fi
 
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
-cat >>confdefs.h <<_ACEOF
-#define PPL_SUPPORTED_DOUBLE $ac_supported_double
-_ACEOF
-
-
-ac_ext=cc
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking for the possibility to control the FPU" >&5
+echo $ECHO_N "checking for the possibility to control the FPU... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main() {
+#if i386
+#elif defined(HAVE_FENV_H)
+#elif sparc && defined( HAVE_IEEEFP_H)
+#else
+  choke me
+#endif
+
+  ;
+  return 0;
+}
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ac_cv_can_control_fpu=1
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cv_can_control_fpu=0
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext,
+ if test $ac_cv_can_control_fpu = 1; then
+  CAN_CONTROL_FPU_TRUE=
+  CAN_CONTROL_FPU_FALSE='#'
+else
+  CAN_CONTROL_FPU_TRUE='#'
+  CAN_CONTROL_FPU_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define CAN_CONTROL_FPU $ac_cv_can_control_fpu
+_ACEOF
+
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-CPPFLAGS="$ac_save_CPPFLAGS"
-LIBS="$ac_save_LIBS"
 
 
-# Detect the binary format used by C++ long doubles.
+# Check whether the C++ compiler provides proper long doubles.
 
 ac_save_CPPFLAGS="$CPPFLAGS"
 ac_save_LIBS="$LIBS"
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking the binary format of C++ long doubles" >&5
-echo $ECHO_N "checking the binary format of C++ long doubles... $ECHO_C" >&6
-ac_cxx_long_double_binary_format=unknown
-
+{ echo "$as_me:$LINENO: checking whether the C++ compiler provides proper long doubles" >&5
+echo $ECHO_N "checking whether the C++ compiler provides proper long doubles... $ECHO_C" >&6; }
 if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cxx_provides_proper_long_double=no
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10165,84 +11255,92 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-#include <limits>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#if SIZEOF_LONG_DOUBLE == 12
-
-long double
-convert(uint32_t msp, uint64_t lsp) {
-  union {
-    long double value;
-    struct {
-#ifdef WORDS_BIGENDIAN
-      uint32_t msp;
-      uint64_t lsp;
-#else
-      uint64_t lsp;
-      uint32_t msp;
-#endif
-    } parts;
-  } u;
-
-  u.parts.msp = msp;
-  u.parts.lsp = lsp;
-  return u.value;
-}
-
-int
-main() {
-  return std::numeric_limits<long double>::is_iec559
-    && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
-	== -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034971013793 [...]
-    &&  convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
-        == -3.2343499084336735697883624337582367014013792003863104780702304912017160945762080887330922093527110817635309731394394027547210062178890319023095669053441067666970505933558514051896941259661008015375938113204938505791529386797054658707886845235185418061587914083787185969361328546834255817542052425946141924658766401026284322468976745836497454676411392342071395848101018687729153124540755822652406871842792438612173516670599208782361645064732617977033939815107992280307781523996574 [...]
-    ? 0 : 1;
-}
+#include <cfloat>
 
-#else // SIZEOF_LONG_DOUBLE != 12
+long double f = 0.0;
 
-int
-main() {
-  return 1;
+int main() {
+  return ((LDBL_MAX <= DBL_MAX) && (DBL_EPSILON <= LDBL_EPSILON)
+	  && (LDBL_MAX_EXP <= DBL_MAX_EXP) && (LDBL_MANT_DIG <= DBL_MANT_DIG))
+    ? 1
+    : 0;
 }
 
-#endif // SIZEOF_LONG_DOUBLE != 12
-
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-
-cat >>confdefs.h <<\_ACEOF
-#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
-_ACEOF
-
-  ac_cxx_long_double_binary_format="Intel Double-Extended"
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ac_cxx_provides_proper_long_double=yes
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+( exit $ac_status )
+{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cxx_provides_proper_long_double=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
-if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+
+
+if test x"$ac_cxx_provides_proper_long_double" = xyes
 then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define CXX_PROVIDES_PROPER_LONG_DOUBLE $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ floats.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking the binary format of C++ floats" >&5
+echo $ECHO_N "checking the binary format of C++ floats... $ECHO_C" >&6; }
+ac_cxx_float_binary_format=unknown
 if test "$cross_compiling" = yes; then
   { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
 See \`config.log' for more details." >&5
@@ -10259,176 +11357,133 @@ cat >>conftest.$ac_ext <<_ACEOF
 
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
 #include <inttypes.h>
 #endif
 
-#if SIZEOF_LONG_DOUBLE == 16
+#if SIZEOF_FLOAT == 4
 
-long double
-convert(uint64_t msp, uint64_t lsp) {
+inline float
+convert(uint32_t x) {
   union {
-    long double value;
-    struct {
-#ifdef WORDS_BIGENDIAN
-      uint64_t msp;
-      uint64_t lsp;
-#else
-      uint64_t lsp;
-      uint64_t msp;
-#endif
-    } parts;
+    float value;
+    uint32_t word;
   } u;
 
-  u.parts.msp = msp;
-  u.parts.lsp = lsp;
+  u.word = x;
   return u.value;
 }
 
 int
 main() {
-  return std::numeric_limits<long double>::is_iec559
-    && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
-        == -8.5585565388510043474134185399390263e-1644L
-    &&  convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
-        == -1.245145811075115522107964569349668e+986L)
-    ? 0 : 1;
+  return std::numeric_limits<float>::is_iec559
+    && (convert(0xaaacccaaUL)
+	== -3.069535185924732179074680971098132431507110595703125e-13
+    &&  convert(0xcccaaaccUL)
+	== -106255968)
+  ? 0 : 1;
 }
 
-#else // SIZEOF_LONG_DOUBLE != 16
+#else // SIZEOF_FLOAT != 4
 
 int
 main() {
   return 1;
 }
 
-#endif // SIZEOF_LONG_DOUBLE != 16
+#endif // SIZEOF_FLOAT != 4
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
 
 cat >>confdefs.h <<\_ACEOF
-#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_quad
+#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
 _ACEOF
 
-  ac_cxx_long_double_binary_format="IEEE754 Quad Precision"
+  ac_cxx_float_binary_format="IEEE754 Single Precision"
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
-if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+
+
+{ echo "$as_me:$LINENO: result: $ac_cxx_float_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_float_binary_format" >&6; }
+
+if test x"$ac_cxx_float_binary_format" = x"unknown"
 then
-if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+  ac_supported_float=0
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-#include <limits>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#if SIZEOF_LONG_DOUBLE == 16
+  ac_supported_float=1
+fi
+ if test $ac_supported_float = 1; then
+  SUPPORTED_FLOAT_TRUE=
+  SUPPORTED_FLOAT_FALSE='#'
+else
+  SUPPORTED_FLOAT_TRUE='#'
+  SUPPORTED_FLOAT_FALSE=
+fi
 
-long double
-convert(uint64_t msp, uint64_t lsp) {
-  union {
-    long double value;
-    struct {
-#ifdef WORDS_BIGENDIAN
-      uint64_t msp;
-      uint64_t lsp;
-#else
-      uint64_t lsp;
-      uint64_t msp;
-#endif
-    } parts;
-  } u;
 
-  u.parts.msp = msp;
-  u.parts.lsp = lsp;
-  return u.value;
-}
+cat >>confdefs.h <<_ACEOF
+#define SUPPORTED_FLOAT $ac_supported_float
+_ACEOF
 
-int
-main() {
-  return std::numeric_limits<long double>::is_iec559
-  && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
-      == -7.604854094366020338337599887587800202175513745285694296699118737579061822543271195468213752945697068626341230960061791319756014599393179237494607606117559455091592495531339152856677735299681614113855047309039978381765251689655330467878879653297684753038610775075912700489795099693753075187209767515639593721823446001374821995460346508811516182804821576375433157503444723668976504567458418892711612877008293336291456723718701753008252854005800263180027419214648596175836662547627167 [...]
-      && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
-         == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797 [...]
-    ? 0 : 1;
-}
 
-#else // SIZEOF_LONG_DOUBLE != 16
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-int
-main() {
-  return 1;
-}
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
 
-#endif // SIZEOF_LONG_DOUBLE != 16
 
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+# Detect the binary format used by C++ doubles.
 
-cat >>confdefs.h <<\_ACEOF
-#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
-_ACEOF
 
-  ac_cxx_long_double_binary_format="Intel Double-Extended"
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
 
-if test x"$ac_cxx_long_double_binary_format" = x"unknown"
-then
+{ echo "$as_me:$LINENO: checking the binary format of C++ doubles" >&5
+echo $ECHO_N "checking the binary format of C++ doubles... $ECHO_C" >&6; }
+ac_cxx_double_binary_format=unknown
 if test "$cross_compiling" = yes; then
   { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
 See \`config.log' for more details." >&5
@@ -10445,18 +11500,21 @@ cat >>conftest.$ac_ext <<_ACEOF
 
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
 #include <inttypes.h>
 #endif
 
-#if SIZEOF_LONG_DOUBLE == 8
+#if SIZEOF_DOUBLE == 8
 
 double
 convert(uint32_t msp, uint32_t lsp) {
   union {
-    long double value;
+    double value;
     struct {
 #ifdef WORDS_BIGENDIAN
       uint32_t msp;
@@ -10475,7 +11533,7 @@ convert(uint32_t msp, uint32_t lsp) {
 
 int
 main() {
-  return std::numeric_limits<long double>::is_iec559
+  return std::numeric_limits<double>::is_iec559
     && (convert(0xaaacccaaUL, 0xacccaaacUL)
 	== -4.018242396032647e-103
     &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
@@ -10483,69 +11541,77 @@ main() {
     ? 0 : 1;
 }
 
-#else // SIZEOF_LONG_DOUBLE != 8
+#else // SIZEOF_DOUBLE != 8
 
 int
 main() {
   return 1;
 }
 
-#endif // SIZEOF_LONG_DOUBLE != 8
+#endif // SIZEOF_DOUBLE != 8
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
 
 cat >>confdefs.h <<\_ACEOF
-#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_double
+#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
 _ACEOF
 
-  ac_cxx_long_double_binary_format="IEEE754 Double Precision"
+  ac_cxx_double_binary_format="IEEE754 Double Precision"
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:$LINENO: result: $ac_cxx_long_double_binary_format" >&5
-echo "${ECHO_T}$ac_cxx_long_double_binary_format" >&6
 
-if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+
+{ echo "$as_me:$LINENO: result: $ac_cxx_double_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_double_binary_format" >&6; }
+
+if test x"$ac_cxx_double_binary_format" = x"unknown"
 then
-  ac_supported_long_double=0
+  ac_supported_double=0
 else
-  ac_supported_long_double=1
+  ac_supported_double=1
 fi
-
-
-if test $ac_supported_long_double = 1; then
-  SUPPORTED_LONG_DOUBLE_TRUE=
-  SUPPORTED_LONG_DOUBLE_FALSE='#'
+ if test $ac_supported_double = 1; then
+  SUPPORTED_DOUBLE_TRUE=
+  SUPPORTED_DOUBLE_FALSE='#'
 else
-  SUPPORTED_LONG_DOUBLE_TRUE='#'
-  SUPPORTED_LONG_DOUBLE_FALSE=
+  SUPPORTED_DOUBLE_TRUE='#'
+  SUPPORTED_DOUBLE_FALSE=
 fi
 
 
 cat >>confdefs.h <<_ACEOF
-#define PPL_SUPPORTED_LONG_DOUBLE $ac_supported_long_double
+#define SUPPORTED_DOUBLE $ac_supported_double
 _ACEOF
 
 
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -10555,23 +11621,27 @@ CPPFLAGS="$ac_save_CPPFLAGS"
 LIBS="$ac_save_LIBS"
 
 
-# Check whether the C++ compiler supports flexible arrays.
+# Detect the binary format used by C++ long doubles.
 
 ac_save_CPPFLAGS="$CPPFLAGS"
 ac_save_LIBS="$LIBS"
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking whether the C++ compiler supports flexible arrays" >&5
-echo $ECHO_N "checking whether the C++ compiler supports flexible arrays... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking the binary format of C++ long doubles" >&5
+echo $ECHO_N "checking the binary format of C++ long doubles... $ECHO_C" >&6; }
+ac_cxx_long_double_binary_format=unknown
+
 if test "$cross_compiling" = yes; then
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ac_cxx_supports_flexible_arrays=no
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10580,191 +11650,211 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-#include <new>
-#include <cstddef>
-#include <cstdlib>
-
-class A {
-private:
-  int i;
-  bool b;
-
-public:
-  A()
-    : i(0), b(false) {
-  }
-};
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
 
-class B {
-private:
-  int capacity;
-  A vec[];
+#if SIZEOF_LONG_DOUBLE == 12
 
-public:
-  void* operator new(size_t fixed_size, int c) {
-    return ::operator new(fixed_size + c*sizeof(B));
-  }
+long double
+convert(uint32_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
 
-  void operator delete(void* p) {
-    ::operator delete(p);
-  }
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
 
-  void operator delete(void* p, int) {
-    ::operator delete(p);
-  }
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+	== -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034971013793 [...]
+    &&  convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+        == -3.2343499084336735697883624337582367014013792003863104780702304912017160945762080887330922093527110817635309731394394027547210062178890319023095669053441067666970505933558514051896941259661008015375938113204938505791529386797054658707886845235185418061587914083787185969361328546834255817542052425946141924658766401026284322468976745836497454676411392342071395848101018687729153124540755822652406871842792438612173516670599208782361645064732617977033939815107992280307781523996574 [...]
+    ? 0 : 1;
+}
 
-  B(int s)
-    : capacity(s) {
-  }
-};
+#else // SIZEOF_LONG_DOUBLE != 12
 
 int
 main() {
-  B* p = new (100) B(100);
-  delete p;
-  exit(0);
+  return 1;
 }
 
+#endif // SIZEOF_LONG_DOUBLE != 12
+
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ac_cxx_supports_flexible_arrays=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+_ACEOF
+
+  ac_cxx_long_double_binary_format="Intel Double-Extended"
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-( exit $ac_status )
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ac_cxx_supports_flexible_arrays=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
-if test x"$ac_cxx_supports_flexible_arrays" = xyes
+
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
 then
-  value=1
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 else
-  value=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define CXX_SUPPORTS_FLEXIBLE_ARRAYS $value
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
 _ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CPPFLAGS="$ac_save_CPPFLAGS"
-LIBS="$ac_save_LIBS"
-
-
-# Check whether the C++ compiler supports __attribute__ ((weak)).
+#if SIZEOF_LONG_DOUBLE == 16
 
-ac_save_CPPFLAGS="$CPPFLAGS"
-ac_save_LIBS="$LIBS"
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
 
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
 
-echo "$as_me:$LINENO: checking whether the C++ compiler supports __attribute__ ((weak))" >&5
-echo $ECHO_N "checking whether the C++ compiler supports __attribute__ ((weak))... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+        == -8.5585565388510043474134185399390263e-1644L
+    &&  convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+        == -1.245145811075115522107964569349668e+986L)
+    ? 0 : 1;
+}
 
-void
-foo() __attribute__ ((weak));
+#else // SIZEOF_LONG_DOUBLE != 16
 
-void
-foo() {
+int
+main() {
+  return 1;
 }
 
+#endif // SIZEOF_LONG_DOUBLE != 16
+
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ac_cxx_supports_attribute_weak=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_quad
+_ACEOF
+
+  ac_cxx_long_double_binary_format="IEEE754 Quad Precision"
 else
-  echo "$as_me: failed program was:" >&5
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ac_cxx_supports_attribute_weak=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test x"$ac_cxx_supports_attribute_weak" = xyes
-then
-  value=1
-else
-  value=0
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
-cat >>confdefs.h <<_ACEOF
-#define CXX_SUPPORTS_ATTRIBUTE_WEAK $value
-_ACEOF
-
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CPPFLAGS="$ac_save_CPPFLAGS"
-LIBS="$ac_save_LIBS"
 
+fi
 
-# Checks for the availability of C library functions in C++.
-echo "$as_me:$LINENO: checking whether ffs is declared" >&5
-echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_ffs+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10772,72 +11862,106 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <strings.h>
 
-int
-main ()
-{
-#ifndef ffs
-  char *p = (char *) ffs;
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
 #endif
 
-  ;
-  return 0;
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+  && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+      == -7.604854094366020338337599887587800202175513745285694296699118737579061822543271195468213752945697068626341230960061791319756014599393179237494607606117559455091592495531339152856677735299681614113855047309039978381765251689655330467878879653297684753038610775075912700489795099693753075187209767515639593721823446001374821995460346508811516182804821576375433157503444723668976504567458418892711612877008293336291456723718701753008252854005800263180027419214648596175836662547627167 [...]
+      && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+         == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797 [...]
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
 }
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_have_decl_ffs=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+_ACEOF
+
+  ac_cxx_long_double_binary_format="Intel Double-Extended"
 else
-  echo "$as_me: failed program was:" >&5
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_ffs=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6
-if test $ac_cv_have_decl_ffs = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFS 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFS 0
-_ACEOF
 
 
 fi
 
-
-echo "$as_me:$LINENO: checking whether getenv is declared" >&5
-echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_getenv+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10845,70 +11969,148 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cstdlib>
 
-int
-main ()
-{
-#ifndef getenv
-  char *p = (char *) getenv;
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
 #endif
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacUL)
+	== -4.018242396032647e-103
+    &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_have_decl_getenv=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_double
+_ACEOF
+
+  ac_cxx_long_double_binary_format="IEEE754 Double Precision"
 else
-  echo "$as_me: failed program was:" >&5
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_getenv=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
-if test $ac_cv_have_decl_getenv = yes; then
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETENV 1
-_ACEOF
 
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_cxx_long_double_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_long_double_binary_format" >&6; }
 
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+  ac_supported_long_double=0
 else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETENV 0
+  ac_supported_long_double=1
+fi
+ if test $ac_supported_long_double = 1; then
+  SUPPORTED_LONG_DOUBLE_TRUE=
+  SUPPORTED_LONG_DOUBLE_FALSE='#'
+else
+  SUPPORTED_LONG_DOUBLE_TRUE='#'
+  SUPPORTED_LONG_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define SUPPORTED_LONG_DOUBLE $ac_supported_long_double
 _ACEOF
 
 
-fi
-echo "$as_me:$LINENO: checking whether strtof is declared" >&5
-echo $ECHO_N "checking whether strtof is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strtof+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler supports flexible arrays.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking whether the C++ compiler supports flexible arrays" >&5
+echo $ECHO_N "checking whether the C++ compiler supports flexible arrays... $ECHO_C" >&6; }
+if test "$cross_compiling" = yes; then
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cxx_supports_flexible_arrays=no
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10916,70 +12118,131 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
+
+#include <new>
+#include <cstddef>
 #include <cstdlib>
 
-int
-main ()
-{
-#ifndef strtof
-  char *p = (char *) strtof;
-#endif
+class A {
+private:
+  int i;
+  bool b;
 
-  ;
-  return 0;
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec[];
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  exit(0);
 }
+
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_have_decl_strtof=yes
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ac_cxx_supports_flexible_arrays=yes
 else
-  echo "$as_me: failed program was:" >&5
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_strtof=no
+( exit $ac_status )
+{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cxx_supports_flexible_arrays=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtof" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strtof" >&6
-if test $ac_cv_have_decl_strtof = yes; then
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOF 1
-_ACEOF
 
 
+if test x"$ac_cxx_supports_flexible_arrays" = xyes
+then
+  value=1
 else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOF 0
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define CXX_SUPPORTS_FLEXIBLE_ARRAYS $value
 _ACEOF
 
 
-fi
-echo "$as_me:$LINENO: checking whether strtod is declared" >&5
-echo $ECHO_N "checking whether strtod is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strtod+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler has the remainder bug
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking if the compiler has the remainder bug" >&5
+echo $ECHO_N "checking if the compiler has the remainder bug... $ECHO_C" >&6; }
+if test "$cross_compiling" = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ac_cv_cxx_has_remainder_bug=yes
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10987,140 +12250,172 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cstdlib>
 
-int
-main ()
-{
-#ifndef strtod
-  char *p = (char *) strtod;
-#endif
+#include <climits>
 
-  ;
-  return 0;
+int minus_one(int n) {
+   return (n+1)*(n-1)-n*n;
+}
+
+int p(int x, int y) {
+   int z = x % y;
+   return z;
+}
+
+int main(int argc, char** argv) {
+   if (p(INT_MIN, minus_one(argc)) != 0)
+     return 1;
+   else
+     return 0;
 }
+
+
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_have_decl_strtod=yes
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cv_cxx_has_remainder_bug=no
 else
-  echo "$as_me: failed program was:" >&5
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_strtod=no
+( exit $ac_status )
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ac_cv_cxx_has_remainder_bug=yes
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtod" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strtod" >&6
-if test $ac_cv_have_decl_strtod = yes; then
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOD 1
-_ACEOF
 
 
+if test x"$ac_cv_cxx_has_remainder_bug" = xyes
+then
+  value=1
 else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOD 0
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define CXX_HAS_REMAINDER_BUG $value
 _ACEOF
 
 
-fi
-echo "$as_me:$LINENO: checking whether strtold is declared" >&5
-echo $ECHO_N "checking whether strtold is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strtold+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking whether the C++ compiler supports __attribute__ ((weak))" >&5
+echo $ECHO_N "checking whether the C++ compiler supports __attribute__ ((weak))... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cstdlib>
 
-int
-main ()
-{
-#ifndef strtold
-  char *p = (char *) strtold;
-#endif
+void
+foo() __attribute__ ((weak));
 
-  ;
-  return 0;
+void
+foo() {
 }
+
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strtold=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  ac_cxx_supports_attribute_weak=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_strtold=no
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  ac_cxx_supports_attribute_weak=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+  value=1
+else
+  value=0
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtold" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strtold" >&6
-if test $ac_cv_have_decl_strtold = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOLD 1
+#define CXX_SUPPORTS_ATTRIBUTE_WEAK $value
 _ACEOF
 
 
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOLD 0
-_ACEOF
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
 
-fi
-echo "$as_me:$LINENO: checking whether strtoll is declared" >&5
-echo $ECHO_N "checking whether strtoll is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strtoll+set}" = set; then
+
+# Checks for the availability of C library functions in C++.
+{ echo "$as_me:$LINENO: checking whether ffs is declared" >&5
+echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_ffs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11129,13 +12424,13 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cstdlib>
+#include <strings.h>
 
 int
 main ()
 {
-#ifndef strtoll
-  char *p = (char *) strtoll;
+#ifndef ffs
+  (void) ffs;
 #endif
 
   ;
@@ -11143,55 +12438,53 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strtoll=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_ffs=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_strtoll=no
+	ac_cv_have_decl_ffs=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoll" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strtoll" >&6
-if test $ac_cv_have_decl_strtoll = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6; }
+if test $ac_cv_have_decl_ffs = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOLL 1
+#define HAVE_DECL_FFS 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOLL 0
+#define HAVE_DECL_FFS 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking whether strtoull is declared" >&5
-echo $ECHO_N "checking whether strtoull is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strtoull+set}" = set; then
+
+
+{ echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getenv+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11205,8 +12498,8 @@ cat >>conftest.$ac_ext <<_ACEOF
 int
 main ()
 {
-#ifndef strtoull
-  char *p = (char *) strtoull;
+#ifndef getenv
+  (void) getenv;
 #endif
 
   ;
@@ -11214,57 +12507,51 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strtoull=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_getenv=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_strtoull=no
+	ac_cv_have_decl_getenv=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoull" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strtoull" >&6
-if test $ac_cv_have_decl_strtoull = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6; }
+if test $ac_cv_have_decl_getenv = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOULL 1
+#define HAVE_DECL_GETENV 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRTOULL 0
+#define HAVE_DECL_GETENV 0
 _ACEOF
 
 
 fi
-
-
-echo "$as_me:$LINENO: checking whether fma is declared" >&5
-echo $ECHO_N "checking whether fma is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fma+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether strtof is declared" >&5
+echo $ECHO_N "checking whether strtof is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtof+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11273,13 +12560,13 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cmath>
+#include <cstdlib>
 
 int
 main ()
 {
-#ifndef fma
-  char *p = (char *) fma;
+#ifndef strtof
+  (void) strtof;
 #endif
 
   ;
@@ -11287,55 +12574,51 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fma=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_strtof=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_fma=no
+	ac_cv_have_decl_strtof=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fma" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fma" >&6
-if test $ac_cv_have_decl_fma = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtof" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtof" >&6; }
+if test $ac_cv_have_decl_strtof = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FMA 1
+#define HAVE_DECL_STRTOF 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FMA 0
+#define HAVE_DECL_STRTOF 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking whether fmaf is declared" >&5
-echo $ECHO_N "checking whether fmaf is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fmaf+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether strtod is declared" >&5
+echo $ECHO_N "checking whether strtod is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtod+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11344,13 +12627,13 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cmath>
+#include <cstdlib>
 
 int
 main ()
 {
-#ifndef fmaf
-  char *p = (char *) fmaf;
+#ifndef strtod
+  (void) strtod;
 #endif
 
   ;
@@ -11358,55 +12641,51 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fmaf=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_strtod=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_fmaf=no
+	ac_cv_have_decl_strtod=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmaf" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fmaf" >&6
-if test $ac_cv_have_decl_fmaf = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtod" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtod" >&6; }
+if test $ac_cv_have_decl_strtod = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FMAF 1
+#define HAVE_DECL_STRTOD 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FMAF 0
+#define HAVE_DECL_STRTOD 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking whether fmal is declared" >&5
-echo $ECHO_N "checking whether fmal is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fmal+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether strtold is declared" >&5
+echo $ECHO_N "checking whether strtold is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtold+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11415,13 +12694,13 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cmath>
+#include <cstdlib>
 
 int
 main ()
 {
-#ifndef fmal
-  char *p = (char *) fmal;
+#ifndef strtold
+  (void) strtold;
 #endif
 
   ;
@@ -11429,55 +12708,51 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fmal=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_strtold=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_fmal=no
+	ac_cv_have_decl_strtold=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmal" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fmal" >&6
-if test $ac_cv_have_decl_fmal = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtold" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtold" >&6; }
+if test $ac_cv_have_decl_strtold = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FMAL 1
+#define HAVE_DECL_STRTOLD 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FMAL 0
+#define HAVE_DECL_STRTOLD 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking whether rintf is declared" >&5
-echo $ECHO_N "checking whether rintf is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_rintf+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether strtoll is declared" >&5
+echo $ECHO_N "checking whether strtoll is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtoll+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11486,13 +12761,13 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cmath>
+#include <cstdlib>
 
 int
 main ()
 {
-#ifndef rintf
-  char *p = (char *) rintf;
+#ifndef strtoll
+  (void) strtoll;
 #endif
 
   ;
@@ -11500,55 +12775,51 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_rintf=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_strtoll=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_rintf=no
+	ac_cv_have_decl_strtoll=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintf" >&5
-echo "${ECHO_T}$ac_cv_have_decl_rintf" >&6
-if test $ac_cv_have_decl_rintf = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoll" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoll" >&6; }
+if test $ac_cv_have_decl_strtoll = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RINTF 1
+#define HAVE_DECL_STRTOLL 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RINTF 0
+#define HAVE_DECL_STRTOLL 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking whether rintl is declared" >&5
-echo $ECHO_N "checking whether rintl is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_rintl+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether strtoull is declared" >&5
+echo $ECHO_N "checking whether strtoull is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_strtoull+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11557,13 +12828,13 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <cmath>
+#include <cstdlib>
 
 int
 main ()
 {
-#ifndef rintl
-  char *p = (char *) rintl;
+#ifndef strtoull
+  (void) strtoull;
 #endif
 
   ;
@@ -11571,59 +12842,53 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_rintl=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_strtoull=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_have_decl_rintl=no
+	ac_cv_have_decl_strtoull=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintl" >&5
-echo "${ECHO_T}$ac_cv_have_decl_rintl" >&6
-if test $ac_cv_have_decl_rintl = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoull" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoull" >&6; }
+if test $ac_cv_have_decl_strtoull = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RINTL 1
+#define HAVE_DECL_STRTOULL 1
 _ACEOF
 
 
 else
   cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RINTL 0
+#define HAVE_DECL_STRTOULL 0
 _ACEOF
 
 
 fi
 
 
-
-# Checks for the availability of "fast" integral types.
-echo "$as_me:$LINENO: checking for int_fast16_t" >&5
-echo $ECHO_N "checking for int_fast16_t... $ECHO_C" >&6
-if test "${ac_cv_type_int_fast16_t+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether fma is declared" >&5
+echo $ECHO_N "checking whether fma is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fma+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11632,62 +12897,65 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+#include <cmath>
+
 int
 main ()
 {
-if ((int_fast16_t *) 0)
-  return 0;
-if (sizeof (int_fast16_t))
-  return 0;
+#ifndef fma
+  (void) fma;
+#endif
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_int_fast16_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_fma=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_fast16_t=no
+	ac_cv_have_decl_fma=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_fast16_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_fast16_t" >&6
-if test $ac_cv_type_int_fast16_t = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fma" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fma" >&6; }
+if test $ac_cv_have_decl_fma = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_INT_FAST16_T 1
+#define HAVE_DECL_FMA 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking for int_fast32_t" >&5
-echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6
-if test "${ac_cv_type_int_fast32_t+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether fmaf is declared" >&5
+echo $ECHO_N "checking whether fmaf is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fmaf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11696,62 +12964,65 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+#include <cmath>
+
 int
 main ()
 {
-if ((int_fast32_t *) 0)
-  return 0;
-if (sizeof (int_fast32_t))
-  return 0;
+#ifndef fmaf
+  (void) fmaf;
+#endif
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_int_fast32_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_fmaf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_fast32_t=no
+	ac_cv_have_decl_fmaf=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6
-if test $ac_cv_type_int_fast32_t = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmaf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fmaf" >&6; }
+if test $ac_cv_have_decl_fmaf = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_INT_FAST32_T 1
+#define HAVE_DECL_FMAF 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking for int_fast64_t" >&5
-echo $ECHO_N "checking for int_fast64_t... $ECHO_C" >&6
-if test "${ac_cv_type_int_fast64_t+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether fmal is declared" >&5
+echo $ECHO_N "checking whether fmal is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fmal+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11760,62 +13031,65 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+#include <cmath>
+
 int
 main ()
 {
-if ((int_fast64_t *) 0)
-  return 0;
-if (sizeof (int_fast64_t))
-  return 0;
+#ifndef fmal
+  (void) fmal;
+#endif
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_int_fast64_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_fmal=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_int_fast64_t=no
+	ac_cv_have_decl_fmal=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_int_fast64_t" >&5
-echo "${ECHO_T}$ac_cv_type_int_fast64_t" >&6
-if test $ac_cv_type_int_fast64_t = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmal" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fmal" >&6; }
+if test $ac_cv_have_decl_fmal = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_INT_FAST64_T 1
+#define HAVE_DECL_FMAL 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking for uint_fast16_t" >&5
-echo $ECHO_N "checking for uint_fast16_t... $ECHO_C" >&6
-if test "${ac_cv_type_uint_fast16_t+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether rintf is declared" >&5
+echo $ECHO_N "checking whether rintf is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_rintf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11824,62 +13098,65 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+#include <cmath>
+
 int
 main ()
 {
-if ((uint_fast16_t *) 0)
-  return 0;
-if (sizeof (uint_fast16_t))
-  return 0;
+#ifndef rintf
+  (void) rintf;
+#endif
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_uint_fast16_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_rintf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint_fast16_t=no
+	ac_cv_have_decl_rintf=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast16_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint_fast16_t" >&6
-if test $ac_cv_type_uint_fast16_t = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_rintf" >&6; }
+if test $ac_cv_have_decl_rintf = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_UINT_FAST16_T 1
+#define HAVE_DECL_RINTF 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking for uint_fast32_t" >&5
-echo $ECHO_N "checking for uint_fast32_t... $ECHO_C" >&6
-if test "${ac_cv_type_uint_fast32_t+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether rintl is declared" >&5
+echo $ECHO_N "checking whether rintl is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_rintl+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11888,62 +13165,69 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-$ac_includes_default
+#include <cmath>
+
 int
 main ()
 {
-if ((uint_fast32_t *) 0)
-  return 0;
-if (sizeof (uint_fast32_t))
-  return 0;
+#ifndef rintl
+  (void) rintl;
+#endif
+
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_uint_fast32_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_rintl=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint_fast32_t=no
+	ac_cv_have_decl_rintl=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast32_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint_fast32_t" >&6
-if test $ac_cv_type_uint_fast32_t = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintl" >&5
+echo "${ECHO_T}$ac_cv_have_decl_rintl" >&6; }
+if test $ac_cv_have_decl_rintl = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_UINT_FAST32_T 1
+#define HAVE_DECL_RINTL 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL 0
 _ACEOF
 
 
 fi
-echo "$as_me:$LINENO: checking for uint_fast64_t" >&5
-echo $ECHO_N "checking for uint_fast64_t... $ECHO_C" >&6
-if test "${ac_cv_type_uint_fast64_t+set}" = set; then
+
+
+
+# Checks for the availability of "fast" integral types.
+{ echo "$as_me:$LINENO: checking for int_fast16_t" >&5
+echo $ECHO_N "checking for int_fast16_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int_fast16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -11953,73 +13237,375 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
+typedef int_fast16_t ac__type_new_;
 int
 main ()
 {
-if ((uint_fast64_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (uint_fast64_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_uint_fast64_t=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_int_fast16_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_uint_fast64_t=no
+	ac_cv_type_int_fast16_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast64_t" >&5
-echo "${ECHO_T}$ac_cv_type_uint_fast64_t" >&6
-if test $ac_cv_type_uint_fast64_t = yes; then
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_fast16_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast16_t" >&6; }
+if test $ac_cv_type_int_fast16_t = yes; then
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_UINT_FAST64_T 1
+#define HAVE_INT_FAST16_T 1
 _ACEOF
 
 
 fi
+{ echo "$as_me:$LINENO: checking for int_fast32_t" >&5
+echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int_fast32_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef int_fast32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_int_fast32_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_cv_type_int_fast32_t=no
+fi
 
-# Must link everything with libm.
-extra_libraries="${extra_libraries} -lm"
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6; }
+if test $ac_cv_type_int_fast32_t = yes; then
 
-# GMP library
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST32_T 1
+_ACEOF
 
 
-      if test "X$prefix" = "XNONE"; then
-    acl_final_prefix="$ac_default_prefix"
-  else
-    acl_final_prefix="$prefix"
-  fi
-  if test "X$exec_prefix" = "XNONE"; then
-    acl_final_exec_prefix='${prefix}'
+fi
+{ echo "$as_me:$LINENO: checking for int_fast64_t" >&5
+echo $ECHO_N "checking for int_fast64_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int_fast64_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef int_fast64_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_int_fast64_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_type_int_fast64_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int_fast64_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast64_t" >&6; }
+if test $ac_cv_type_int_fast64_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST64_T 1
+_ACEOF
+
+
+fi
+{ echo "$as_me:$LINENO: checking for uint_fast16_t" >&5
+echo $ECHO_N "checking for uint_fast16_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_uint_fast16_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef uint_fast16_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_uint_fast16_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_type_uint_fast16_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast16_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast16_t" >&6; }
+if test $ac_cv_type_uint_fast16_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST16_T 1
+_ACEOF
+
+
+fi
+{ echo "$as_me:$LINENO: checking for uint_fast32_t" >&5
+echo $ECHO_N "checking for uint_fast32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_uint_fast32_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef uint_fast32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_uint_fast32_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_type_uint_fast32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast32_t" >&6; }
+if test $ac_cv_type_uint_fast32_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST32_T 1
+_ACEOF
+
+
+fi
+{ echo "$as_me:$LINENO: checking for uint_fast64_t" >&5
+echo $ECHO_N "checking for uint_fast64_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_uint_fast64_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef uint_fast64_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_uint_fast64_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_type_uint_fast64_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast64_t" >&6; }
+if test $ac_cv_type_uint_fast64_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST64_T 1
+_ACEOF
+
+
+fi
+
+
+# Must link everything with libm.
+extra_libraries="${extra_libraries} -lm"
+
+# GMP library
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
   else
     acl_final_exec_prefix="$exec_prefix"
   fi
@@ -12029,13 +13615,13 @@ extra_libraries="${extra_libraries} -lm"
   prefix="$acl_save_prefix"
 
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
+# Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
 else
   with_gnu_ld=no
-fi;
+fi
+
 # Prepare PATH_SEPARATOR.
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
@@ -12052,8 +13638,8 @@ fi
 ac_prog=ld
 if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by GCC" >&5
-echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; }
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -12082,11 +13668,11 @@ echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
     ;;
   esac
 elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
 else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
 fi
 if test "${acl_cv_path_LD+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12116,17 +13702,17 @@ fi
 
 LD="$acl_cv_path_LD"
 if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
 if test "${acl_cv_prog_gnu_ld+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -12138,15 +13724,15 @@ case `$LD -v 2>&1 </dev/null` in
   acl_cv_prog_gnu_ld=no ;;
 esac
 fi
-echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
+{ echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; }
 with_gnu_ld=$acl_cv_prog_gnu_ld
 
 
 
 
-                                                echo "$as_me:$LINENO: checking for shared library run path origin" >&5
-echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
+                                                { echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; }
 if test "${acl_cv_rpath+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -12158,22 +13744,43 @@ else
     acl_cv_rpath=done
 
 fi
-echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
-echo "${ECHO_T}$acl_cv_rpath" >&6
+{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6; }
   wl="$acl_cv_wl"
-  libext="$acl_cv_libext"
-  shlibext="$acl_cv_shlibext"
-  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
-  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
-  hardcode_direct="$acl_cv_hardcode_direct"
-  hardcode_minus_L="$acl_cv_hardcode_minus_L"
-    # Check whether --enable-rpath or --disable-rpath was given.
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath was given.
 if test "${enable_rpath+set}" = set; then
-  enableval="$enable_rpath"
-  :
+  enableval=$enable_rpath; :
 else
   enable_rpath=yes
-fi;
+fi
+
+
+
+                  acl_libdirstem=lib
+  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+  if test -n "$searchpath"; then
+    acl_save_IFS="${IFS= 	}"; IFS=":"
+    for searchdir in $searchpath; do
+      if test -d "$searchdir"; then
+        case "$searchdir" in
+          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+          *) searchdir=`cd "$searchdir" && pwd`
+             case "$searchdir" in
+               */lib64 ) acl_libdirstem=lib64 ;;
+             esac ;;
+        esac
+      fi
+    done
+    IFS="$acl_save_IFS"
+  fi
 
 
 if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then
@@ -12189,14 +13796,16 @@ fi
 
 
 
-  echo "$as_me:$LINENO: checking how to link with libgmp" >&5
-echo $ECHO_N "checking how to link with libgmp... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking how to link with libgmp" >&5
+echo $ECHO_N "checking how to link with libgmp... $ECHO_C" >&6; }
 if test "${ac_cv_libgmp_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 
 
 
+
+
     use_additional=yes
 
   acl_save_prefix="$prefix"
@@ -12211,10 +13820,9 @@ else
   prefix="$acl_save_prefix"
 
 
-# Check whether --with-libgmp-prefix or --without-libgmp-prefix was given.
+# Check whether --with-libgmp-prefix was given.
 if test "${with_libgmp_prefix+set}" = set; then
-  withval="$with_libgmp_prefix"
-
+  withval=$with_libgmp_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
     else
@@ -12233,14 +13841,16 @@ if test "${with_libgmp_prefix+set}" = set; then
 
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/lib"
+        additional_libdir="$withval/$acl_libdirstem"
       fi
     fi
 
-fi;
+fi
+
       LIBGMP=
   LTLIBGMP=
   INCGMP=
+  LIBGMP_PREFIX=
   rpathdirs=
   ltrpathdirs=
   names_already_handled=
@@ -12274,22 +13884,52 @@ fi;
           found_la=
           found_so=
           found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
           if test $use_additional = yes; then
-            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
-              found_dir="$additional_libdir"
-              found_so="$additional_libdir/lib$name.$shlibext"
-              if test -f "$additional_libdir/lib$name.la"; then
-                found_la="$additional_libdir/lib$name.la"
-              fi
-            else
-              if test -f "$additional_libdir/lib$name.$libext"; then
-                found_dir="$additional_libdir"
-                found_a="$additional_libdir/lib$name.$libext"
-                if test -f "$additional_libdir/lib$name.la"; then
-                  found_la="$additional_libdir/lib$name.la"
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
                 fi
               fi
             fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
           fi
           if test "X$found_dir" = "X"; then
             for x in $LDFLAGS $LTLIBGMP; do
@@ -12305,21 +13945,44 @@ fi;
               case "$x" in
                 -L*)
                   dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
-                    found_dir="$dir"
-                    found_so="$dir/lib$name.$shlibext"
-                    if test -f "$dir/lib$name.la"; then
-                      found_la="$dir/lib$name.la"
-                    fi
-                  else
-                    if test -f "$dir/lib$name.$libext"; then
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
                       found_dir="$dir"
-                      found_a="$dir/lib$name.$libext"
-                      if test -f "$dir/lib$name.la"; then
-                        found_la="$dir/lib$name.la"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
                       fi
                     fi
                   fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
                   ;;
               esac
               if test "X$found_dir" != "X"; then
@@ -12330,7 +13993,7 @@ fi;
           if test "X$found_dir" != "X"; then
                         LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$found_dir -l$name"
             if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
                                 LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
               else
                                                                                 haveit=
@@ -12343,10 +14006,10 @@ fi;
                 if test -z "$haveit"; then
                   ltrpathdirs="$ltrpathdirs $found_dir"
                 fi
-                                if test "$hardcode_direct" = yes; then
+                                if test "$acl_hardcode_direct" = yes; then
                                                       LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
                 else
-                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                             LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
                                                             haveit=
                     for x in $rpathdirs; do
@@ -12378,7 +14041,7 @@ fi;
                     if test -z "$haveit"; then
                       LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir"
                     fi
-                    if test "$hardcode_minus_L" != no; then
+                    if test "$acl_hardcode_minus_L" != no; then
                                                                                         LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
                     else
                                                                                                                                                                                 LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name"
@@ -12395,8 +14058,9 @@ fi;
             fi
                         additional_includedir=
             case "$found_dir" in
-              */lib | */lib/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                LIBGMP_PREFIX="$basedir"
                 additional_includedir="$basedir/include"
                 ;;
             esac
@@ -12445,9 +14109,9 @@ fi;
                 case "$dep" in
                   -L*)
                     additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
                       haveit=
-                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
                         if test -n "$GCC"; then
                           case $host_os in
                             linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -12547,21 +14211,21 @@ fi;
     done
   done
   if test "X$rpathdirs" != "X"; then
-    if test -n "$hardcode_libdir_separator"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
                         alldirs=
       for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
       done
             acl_save_libdir="$libdir"
       libdir="$alldirs"
-      eval flag=\"$hardcode_libdir_flag_spec\"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
       libdir="$acl_save_libdir"
       LIBGMP="${LIBGMP}${LIBGMP:+ }$flag"
     else
             for found_dir in $rpathdirs; do
         acl_save_libdir="$libdir"
         libdir="$found_dir"
-        eval flag=\"$hardcode_libdir_flag_spec\"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
         libdir="$acl_save_libdir"
         LIBGMP="${LIBGMP}${LIBGMP:+ }$flag"
       done
@@ -12576,13 +14240,15 @@ fi;
     ac_cv_libgmp_libs="$LIBGMP"
     ac_cv_libgmp_ltlibs="$LTLIBGMP"
     ac_cv_libgmp_cppflags="$INCGMP"
+    ac_cv_libgmp_prefix="$LIBGMP_PREFIX"
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_libgmp_libs" >&5
-echo "${ECHO_T}$ac_cv_libgmp_libs" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_libgmp_libs" >&5
+echo "${ECHO_T}$ac_cv_libgmp_libs" >&6; }
   LIBGMP="$ac_cv_libgmp_libs"
   LTLIBGMP="$ac_cv_libgmp_ltlibs"
   INCGMP="$ac_cv_libgmp_cppflags"
+  LIBGMP_PREFIX="$ac_cv_libgmp_prefix"
 
   for element in $INCGMP; do
     haveit=
@@ -12608,6 +14274,7 @@ echo "${ECHO_T}$ac_cv_libgmp_libs" >&6
 
 
 
+
       HAVE_LIBGMP=yes
 
 
@@ -12618,14 +14285,16 @@ echo "${ECHO_T}$ac_cv_libgmp_libs" >&6
 
 
 
-  echo "$as_me:$LINENO: checking how to link with libgmpxx" >&5
-echo $ECHO_N "checking how to link with libgmpxx... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking how to link with libgmpxx" >&5
+echo $ECHO_N "checking how to link with libgmpxx... $ECHO_C" >&6; }
 if test "${ac_cv_libgmpxx_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 
 
 
+
+
     use_additional=yes
 
   acl_save_prefix="$prefix"
@@ -12640,10 +14309,9 @@ else
   prefix="$acl_save_prefix"
 
 
-# Check whether --with-libgmpxx-prefix or --without-libgmpxx-prefix was given.
+# Check whether --with-libgmpxx-prefix was given.
 if test "${with_libgmpxx_prefix+set}" = set; then
-  withval="$with_libgmpxx_prefix"
-
+  withval=$with_libgmpxx_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
     else
@@ -12662,14 +14330,16 @@ if test "${with_libgmpxx_prefix+set}" = set; then
 
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/lib"
+        additional_libdir="$withval/$acl_libdirstem"
       fi
     fi
 
-fi;
+fi
+
       LIBGMPXX=
   LTLIBGMPXX=
   INCGMPXX=
+  LIBGMPXX_PREFIX=
   rpathdirs=
   ltrpathdirs=
   names_already_handled=
@@ -12703,22 +14373,52 @@ fi;
           found_la=
           found_so=
           found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
           if test $use_additional = yes; then
-            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
-              found_dir="$additional_libdir"
-              found_so="$additional_libdir/lib$name.$shlibext"
-              if test -f "$additional_libdir/lib$name.la"; then
-                found_la="$additional_libdir/lib$name.la"
-              fi
-            else
-              if test -f "$additional_libdir/lib$name.$libext"; then
-                found_dir="$additional_libdir"
-                found_a="$additional_libdir/lib$name.$libext"
-                if test -f "$additional_libdir/lib$name.la"; then
-                  found_la="$additional_libdir/lib$name.la"
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
                 fi
               fi
             fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
           fi
           if test "X$found_dir" = "X"; then
             for x in $LDFLAGS $LTLIBGMPXX; do
@@ -12734,20 +14434,43 @@ fi;
               case "$x" in
                 -L*)
                   dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
-                    found_dir="$dir"
-                    found_so="$dir/lib$name.$shlibext"
-                    if test -f "$dir/lib$name.la"; then
-                      found_la="$dir/lib$name.la"
-                    fi
-                  else
-                    if test -f "$dir/lib$name.$libext"; then
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
                       found_dir="$dir"
-                      found_a="$dir/lib$name.$libext"
-                      if test -f "$dir/lib$name.la"; then
-                        found_la="$dir/lib$name.la"
-                      fi
-                    fi
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
                   fi
                   ;;
               esac
@@ -12759,7 +14482,7 @@ fi;
           if test "X$found_dir" != "X"; then
                         LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$found_dir -l$name"
             if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
                                 LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
               else
                                                                                 haveit=
@@ -12772,10 +14495,10 @@ fi;
                 if test -z "$haveit"; then
                   ltrpathdirs="$ltrpathdirs $found_dir"
                 fi
-                                if test "$hardcode_direct" = yes; then
+                                if test "$acl_hardcode_direct" = yes; then
                                                       LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
                 else
-                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                             LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
                                                             haveit=
                     for x in $rpathdirs; do
@@ -12807,7 +14530,7 @@ fi;
                     if test -z "$haveit"; then
                       LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir"
                     fi
-                    if test "$hardcode_minus_L" != no; then
+                    if test "$acl_hardcode_minus_L" != no; then
                                                                                         LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
                     else
                                                                                                                                                                                 LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name"
@@ -12824,8 +14547,9 @@ fi;
             fi
                         additional_includedir=
             case "$found_dir" in
-              */lib | */lib/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                LIBGMPXX_PREFIX="$basedir"
                 additional_includedir="$basedir/include"
                 ;;
             esac
@@ -12874,9 +14598,9 @@ fi;
                 case "$dep" in
                   -L*)
                     additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
                       haveit=
-                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
                         if test -n "$GCC"; then
                           case $host_os in
                             linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -12976,21 +14700,21 @@ fi;
     done
   done
   if test "X$rpathdirs" != "X"; then
-    if test -n "$hardcode_libdir_separator"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
                         alldirs=
       for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
       done
             acl_save_libdir="$libdir"
       libdir="$alldirs"
-      eval flag=\"$hardcode_libdir_flag_spec\"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
       libdir="$acl_save_libdir"
       LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag"
     else
             for found_dir in $rpathdirs; do
         acl_save_libdir="$libdir"
         libdir="$found_dir"
-        eval flag=\"$hardcode_libdir_flag_spec\"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
         libdir="$acl_save_libdir"
         LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag"
       done
@@ -13005,13 +14729,15 @@ fi;
     ac_cv_libgmpxx_libs="$LIBGMPXX"
     ac_cv_libgmpxx_ltlibs="$LTLIBGMPXX"
     ac_cv_libgmpxx_cppflags="$INCGMPXX"
+    ac_cv_libgmpxx_prefix="$LIBGMPXX_PREFIX"
 
 fi
-echo "$as_me:$LINENO: result: $ac_cv_libgmpxx_libs" >&5
-echo "${ECHO_T}$ac_cv_libgmpxx_libs" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_libgmpxx_libs" >&5
+echo "${ECHO_T}$ac_cv_libgmpxx_libs" >&6; }
   LIBGMPXX="$ac_cv_libgmpxx_libs"
   LTLIBGMPXX="$ac_cv_libgmpxx_ltlibs"
   INCGMPXX="$ac_cv_libgmpxx_cppflags"
+  LIBGMPXX_PREFIX="$ac_cv_libgmpxx_prefix"
 
   for element in $INCGMPXX; do
     haveit=
@@ -13037,6 +14763,7 @@ echo "${ECHO_T}$ac_cv_libgmpxx_libs" >&6
 
 
 
+
       HAVE_LIBGMPXX=yes
 
 
@@ -13044,18 +14771,18 @@ echo "${ECHO_T}$ac_cv_libgmpxx_libs" >&6
 
 ac_save_LIBS="$LIBS"
 LIBS="$LIBS $LIBGMPXX"
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-echo "$as_me:$LINENO: checking for the GMP library version 4.1.3 or above" >&5
-echo $ECHO_N "checking for the GMP library version 4.1.3 or above... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for the GMP library version 4.1.3 or above" >&5
+echo $ECHO_N "checking for the GMP library version 4.1.3 or above... $ECHO_C" >&6; }
 if test "$cross_compiling" = yes; then
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   ac_cv_have_gmp=no
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -13078,18 +14805,27 @@ int main() {
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   ac_cv_have_gmp=yes
 else
   echo "$as_me: program exited with status $ac_status" >&5
@@ -13097,20 +14833,22 @@ echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   ac_cv_have_gmp=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
+
+
 have_gmp=${ac_cv_have_gmp}
 
 if test x"$ac_cv_have_gmp" = xyes
 then
 
-echo "$as_me:$LINENO: checking for mp_limb_t" >&5
-echo $ECHO_N "checking for mp_limb_t... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for mp_limb_t" >&5
+echo $ECHO_N "checking for mp_limb_t... $ECHO_C" >&6; }
 if test "${ac_cv_type_mp_limb_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13122,61 +14860,57 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
+typedef mp_limb_t ac__type_new_;
 int
 main ()
 {
-if ((mp_limb_t *) 0)
+if ((ac__type_new_ *) 0)
   return 0;
-if (sizeof (mp_limb_t))
+if (sizeof (ac__type_new_))
   return 0;
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_type_mp_limb_t=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_type_mp_limb_t=no
+	ac_cv_type_mp_limb_t=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_type_mp_limb_t" >&5
-echo "${ECHO_T}$ac_cv_type_mp_limb_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_type_mp_limb_t" >&5
+echo "${ECHO_T}$ac_cv_type_mp_limb_t" >&6; }
 
-echo "$as_me:$LINENO: checking size of mp_limb_t" >&5
-echo $ECHO_N "checking size of mp_limb_t... $ECHO_C" >&6
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of mp_limb_t" >&5
+echo $ECHO_N "checking size of mp_limb_t... $ECHO_C" >&6; }
 if test "${ac_cv_sizeof_mp_limb_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test "$ac_cv_type_mp_limb_t" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
@@ -13187,10 +14921,11 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
+   typedef mp_limb_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) >= 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
 test_array [0] = 0
 
   ;
@@ -13198,27 +14933,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -13229,10 +14959,11 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
+   typedef mp_limb_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -13240,46 +14971,42 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -13287,10 +15014,11 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
+   typedef mp_limb_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) < 0)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
 test_array [0] = 0
 
   ;
@@ -13298,27 +15026,22 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
@@ -13329,10 +15052,11 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
+   typedef mp_limb_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) >= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -13340,50 +15064,48 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_lo=$ac_mid; break
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   done
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo= ac_hi=
+	ac_lo= ac_hi=
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
@@ -13395,10 +15117,11 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
+   typedef mp_limb_t ac__type_sizeof_;
 int
 main ()
 {
-static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) <= $ac_mid)];
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
 test_array [0] = 0
 
   ;
@@ -13406,52 +15129,45 @@ test_array [0] = 0
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_hi=$ac_mid
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_lo=`expr '(' $ac_mid ')' + 1`
+	ac_lo=`expr '(' $ac_mid ')' + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 done
 case $ac_lo in
 ?*) ac_cv_sizeof_mp_limb_t=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t), 77
+'') if test "$ac_cv_type_mp_limb_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (mp_limb_t), 77
+echo "$as_me: error: cannot compute sizeof (mp_limb_t)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_mp_limb_t=0
+   fi ;;
 esac
 else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -13460,8 +15176,9 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <gmp.h>
 
-long longval () { return (long) (sizeof (mp_limb_t)); }
-unsigned long ulongval () { return (long) (sizeof (mp_limb_t)); }
+   typedef mp_limb_t ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
 #include <stdio.h>
 #include <stdlib.h>
 int
@@ -13470,35 +15187,44 @@ main ()
 
   FILE *f = fopen ("conftest.val", "w");
   if (! f)
-    exit (1);
-  if (((long) (sizeof (mp_limb_t))) < 0)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
     {
-      long i = longval ();
-      if (i != ((long) (sizeof (mp_limb_t))))
-	exit (1);
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%ld\n", i);
     }
   else
     {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (mp_limb_t))))
-	exit (1);
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
       fprintf (f, "%lu\n", i);
     }
-  exit (ferror (f) || fclose (f) != 0);
+  return ferror (f) || fclose (f) != 0;
 
   ;
   return 0;
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
@@ -13509,33 +15235,36 @@ echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t), 77
+if test "$ac_cv_type_mp_limb_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t)
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (mp_limb_t), 77
+echo "$as_me: error: cannot compute sizeof (mp_limb_t)
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_mp_limb_t=0
+   fi
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f conftest.val
-else
-  ac_cv_sizeof_mp_limb_t=0
 fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_mp_limb_t" >&5
-echo "${ECHO_T}$ac_cv_sizeof_mp_limb_t" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_mp_limb_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_mp_limb_t" >&6; }
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t
 _ACEOF
 
 
 
-echo "$as_me:$LINENO: checking whether GMP has been compiled with support for exceptions" >&5
-echo $ECHO_N "checking whether GMP has been compiled with support for exceptions... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking whether GMP has been compiled with support for exceptions" >&5
+echo $ECHO_N "checking whether GMP has been compiled with support for exceptions... $ECHO_C" >&6; }
 if test "$cross_compiling" = yes; then
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   ac_cv_gmp_supports_exceptions=no
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -13576,18 +15305,27 @@ int main() {
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   ac_cv_gmp_supports_exceptions=yes
 else
   echo "$as_me: program exited with status $ac_status" >&5
@@ -13595,13 +15333,15 @@ echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   ac_cv_gmp_supports_exceptions=no
 fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
+
+
 gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
 if test x"$gmp_supports_exceptions" = xyes
 then
@@ -13617,7 +15357,7 @@ _ACEOF
 
 fi
 
-ac_ext=cc
+ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -13627,7 +15367,6 @@ LIBS="$ac_save_LIBS"
 
 gmp_library_option="$LTLIBGMPXX"
 
-
 if test x"$have_gmp" = xno
 then
   { { echo "$as_me:$LINENO: error: Cannot find GMP version 4.1.3 or higher.
@@ -13658,8 +15397,8 @@ add --enable-cxx to the configuration options." >&2;}
   fi
 fi
 
-echo "$as_me:$LINENO: checking for __mpz_struct._mp_alloc" >&5
-echo $ECHO_N "checking for __mpz_struct._mp_alloc... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for __mpz_struct._mp_alloc" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_alloc... $ECHO_C" >&6; }
 if test "${ac_cv_member___mpz_struct__mp_alloc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13682,33 +15421,28 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_member___mpz_struct__mp_alloc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -13727,40 +15461,37 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_member___mpz_struct__mp_alloc=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_member___mpz_struct__mp_alloc=no
+	ac_cv_member___mpz_struct__mp_alloc=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_alloc" >&5
-echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_alloc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_alloc" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_alloc" >&6; }
 if test $ac_cv_member___mpz_struct__mp_alloc = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -13771,8 +15502,8 @@ _ACEOF
 else
   gmp_has_changes=yes
 fi
-echo "$as_me:$LINENO: checking for __mpz_struct._mp_size" >&5
-echo $ECHO_N "checking for __mpz_struct._mp_size... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for __mpz_struct._mp_size" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_size... $ECHO_C" >&6; }
 if test "${ac_cv_member___mpz_struct__mp_size+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13795,33 +15526,28 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_member___mpz_struct__mp_size=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -13840,40 +15566,37 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_member___mpz_struct__mp_size=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_member___mpz_struct__mp_size=no
+	ac_cv_member___mpz_struct__mp_size=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_size" >&5
-echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_size" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_size" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_size" >&6; }
 if test $ac_cv_member___mpz_struct__mp_size = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -13884,8 +15607,8 @@ _ACEOF
 else
   gmp_has_changes=yes
 fi
-echo "$as_me:$LINENO: checking for __mpz_struct._mp_d" >&5
-echo $ECHO_N "checking for __mpz_struct._mp_d... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking for __mpz_struct._mp_d" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_d... $ECHO_C" >&6; }
 if test "${ac_cv_member___mpz_struct__mp_d+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -13908,33 +15631,28 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_member___mpz_struct__mp_d=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-cat >conftest.$ac_ext <<_ACEOF
+	cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -13953,40 +15671,37 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_cv_member___mpz_struct__mp_d=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_member___mpz_struct__mp_d=no
+	ac_cv_member___mpz_struct__mp_d=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_d" >&5
-echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_d" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_d" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_d" >&6; }
 if test $ac_cv_member___mpz_struct__mp_d = yes; then
 
 cat >>confdefs.h <<_ACEOF
@@ -14018,21 +15733,21 @@ extra_includes="${extra_includes}${extra_includes:+ }${gmp_includes_option}"
 extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}"
 
 enableval=yes
-echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
-echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6
-# Check whether --enable-watchdog or --disable-watchdog was given.
+{ echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
+echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6; }
+# Check whether --enable-watchdog was given.
 if test "${enable_watchdog+set}" = set; then
-  enableval="$enable_watchdog"
+  enableval=$enable_watchdog;
+fi
 
-fi;
 case "${enableval}" in
 yes)
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
   ;;
 no)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
   ;;
 *)
   { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&5
@@ -14041,9 +15756,7 @@ echo "$as_me: error: bad value ${enableval} for --enable-watchdog, needs yes or
   ;;
 esac
 build_watchdog_library=$enableval
-
-
-if test x"$build_watchdog_library" = xyes; then
+ if test x"$build_watchdog_library" = xyes; then
   BUILD_WATCHDOG_LIBRARY_TRUE=
   BUILD_WATCHDOG_LIBRARY_FALSE='#'
 else
@@ -14051,28 +15764,36 @@ else
   BUILD_WATCHDOG_LIBRARY_FALSE=
 fi
 
+if test x"$build_watchdog_library" = xyes
+then
 
-# Enabled or not, the Watchdog subdirectory must be configured.
+cat >>confdefs.h <<\_ACEOF
+#define WATCHDOG_LIBRARY_ENABLED 1
+_ACEOF
 
+fi
 
+# Enabled or not, the Watchdog subdirectory must be configured.
 subdirs="$subdirs Watchdog"
 
 
 # This is the list of available interfaces: lowercase and blank-separated.
-available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog ocaml java"
 
 # This is the list of interfaces that are enabled by default.
 #default_interfaces="cxx c swi_prolog"
-default_interfaces=${available_interfaces}
+#default_interfaces=${available_interfaces}
+default_interfaces="cxx c sicstus_prolog swi_prolog xsb_prolog ocaml java"
+#default_interfaces="cxx c gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog ocaml java"
 
 enableval=not_specified
-echo "$as_me:$LINENO: checking which interfaces are enabled" >&5
-echo $ECHO_N "checking which interfaces are enabled... $ECHO_C" >&6
-# Check whether --enable-interfaces or --disable-interfaces was given.
+{ echo "$as_me:$LINENO: checking which interfaces are enabled" >&5
+echo $ECHO_N "checking which interfaces are enabled... $ECHO_C" >&6; }
+# Check whether --enable-interfaces was given.
 if test "${enable_interfaces+set}" = set; then
-  enableval="$enable_interfaces"
+  enableval=$enable_interfaces;
+fi
 
-fi;
 case x"${enableval}" in
 xyes | x)
   { { echo "$as_me:$LINENO: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&5
@@ -14084,16 +15805,16 @@ xnone | xno)
   do
     eval ${interface}_interface_enabled=no
   done
-  echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
   ;;
 xall)
   for interface in ${available_interfaces}
   do
     eval ${interface}_interface_enabled=yes
   done
-  echo "$as_me:$LINENO: result: ${available_interfaces}" >&5
-echo "${ECHO_T}${available_interfaces}" >&6
+  { echo "$as_me:$LINENO: result: ${available_interfaces}" >&5
+echo "${ECHO_T}${available_interfaces}" >&6; }
   ;;
 *)
   if test x"${enableval}" = xnot_specified
@@ -14128,15 +15849,13 @@ echo "$as_me: error: unknown interface ${interface}: must be one of ${available_
       ;;
     esac
   done
-  echo "$as_me:$LINENO: result: ${enabled_interfaces}" >&5
-echo "${ECHO_T}${enabled_interfaces}" >&6
+  { echo "$as_me:$LINENO: result: ${enabled_interfaces}" >&5
+echo "${ECHO_T}${enabled_interfaces}" >&6; }
   ;;
 esac
 
 # Set an Automake conditional to build or not to build the C interface.
-
-
-if test x${c_interface_enabled} = xyes; then
+ if test x${c_interface_enabled} = xyes; then
   BUILD_C_INTERFACE_TRUE=
   BUILD_C_INTERFACE_FALSE='#'
 else
@@ -14145,20 +15864,60 @@ else
 fi
 
 
-# Checks for Prolog systems for which the interface is enabled.
+# Checks for systems for which the interface is enabled.
 
-# Ciao Prolog
-if test x${ciao_prolog_interface_enabled} = xyes
+# Set the optional Java SDK directory.
+
+# Check whether --with-java was given.
+if test "${with_java+set}" = set; then
+  withval=$with_java; JAVA_HOME=$with_java
+fi
+
+
+case "${host_os}" in
+# On Darwin the JDK, if present, is installed in /Library/Java/Home .
+darwin*)
+  if test "x$JAVA_HOME" = x
+  then
+    JAVA_HOME="/Library/Java/Home"
+  fi
+  ;;
+# On Fedora Core systems the JDK is usually in /usr/java/default .
+linux*)
+  if test "x$JAVA_HOME" = x
+  then
+    JAVA_HOME="/usr/java/default"
+  fi
+  ;;
+*)
+  ;;
+esac
+
+if test ! "x$JAVA_HOME" = x
 then
-  # Extract the first word of "ciao", so it can be a program name with args.
-set dummy ciao; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CIAO_PROLOG+set}" = set; then
+  JAVAPREFIX="${JAVA_HOME}/bin"
+fi
+
+# Java
+if test x${java_interface_enabled} = xyes
+then
+  # Check for Java programs. Order here is important: check first
+  # for the compiler.
+
+
+if test "x$JAVAPREFIX" = x
+then
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_JAVAC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$CIAO_PROLOG"; then
-  ac_cv_prog_CIAO_PROLOG="$CIAO_PROLOG" # Let the user override the test.
+  if test -n "$JAVAC"; then
+  ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -14166,196 +15925,233 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CIAO_PROLOG="ciao"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_JAVAC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-CIAO_PROLOG=$ac_cv_prog_CIAO_PROLOG
-if test -n "$CIAO_PROLOG"; then
-  echo "$as_me:$LINENO: result: $CIAO_PROLOG" >&5
-echo "${ECHO_T}$CIAO_PROLOG" >&6
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+  { echo "$as_me:$LINENO: result: $JAVAC" >&5
+echo "${ECHO_T}$JAVAC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  if test x"$CIAO_PROLOG" = xciao
-  then
-  if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
-echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6
-if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
-echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
 else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking ciao_prolog.h usability" >&5
-echo $ECHO_N "checking ciao_prolog.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <ciao_prolog.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_JAVAC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  case $JAVAC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+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_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-ac_header_compiler=no
+  ;;
+esac
+fi
+JAVAC=$ac_cv_path_JAVAC
+if test -n "$JAVAC"; then
+  { echo "$as_me:$LINENO: result: $JAVAC" >&5
+echo "${ECHO_T}$JAVAC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking ciao_prolog.h presence" >&5
-echo $ECHO_N "checking ciao_prolog.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ciao_prolog.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+fi
+if test ! x$JAVAC = "xno"
+then
+
+{ echo "$as_me:$LINENO: checking whether $JAVAC supports enums" >&5
+echo $ECHO_N "checking whether $JAVAC supports enums... $ECHO_C" >&6; }
+if test "${ac_cv_javac_supports_enums+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 16013 "configure" */
+public class Test {
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+ }
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
   ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
+  (exit $ac_status); }; } >/dev/null 2>&1; then
+  ac_cv_javac_supports_enums=yes
 else
-  ac_cpp_err=yes
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  ac_cv_javac_supports_enums=no
 fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  ac_header_preproc=no
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+
 fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_javac_supports_enums" >&5
+echo "${ECHO_T}$ac_cv_javac_supports_enums" >&6; }
 
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: ciao_prolog.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: ciao_prolog.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: ciao_prolog.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: ciao_prolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to ppl-devel at cs.unipr.it ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
-echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6
-if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+fi
+
+
+if test x$JAVAPREFIX = x; then
+        test x$JAVA = x && for ac_prog in java$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_JAVA+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_header_ciao_prolog_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
-echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6
+  if test -n "$JAVA"; then
+  ac_cv_prog_JAVA="$JAVA" # Let the user override the test.
+else
+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_prog_JAVA="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
 fi
-if test $ac_cv_header_ciao_prolog_h = yes; then
-  :
+fi
+JAVA=$ac_cv_prog_JAVA
+if test -n "$JAVA"; then
+  { echo "$as_me:$LINENO: result: $JAVA" >&5
+echo "${ECHO_T}$JAVA" >&6; }
 else
-  CIAO_PROLOG=""
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
-  fi
-fi
+  test -n "$JAVA" && break
+done
+test -n "$JAVA" || JAVA="no"
 
+else
+        test x$JAVA = x && for ac_prog in java$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_JAVA+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $JAVA in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+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_JAVA="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-if test x$CIAO_PROLOG = xciao; then
-  BUILD_CIAO_PROLOG_INTERFACE_TRUE=
-  BUILD_CIAO_PROLOG_INTERFACE_FALSE='#'
+  ;;
+esac
+fi
+JAVA=$ac_cv_path_JAVA
+if test -n "$JAVA"; then
+  { echo "$as_me:$LINENO: result: $JAVA" >&5
+echo "${ECHO_T}$JAVA" >&6; }
 else
-  BUILD_CIAO_PROLOG_INTERFACE_TRUE='#'
-  BUILD_CIAO_PROLOG_INTERFACE_FALSE=
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
-# GNU Prolog
-if test x${gnu_prolog_interface_enabled} = xyes
+  test -n "$JAVA" && break
+done
+test -n "$JAVA" || JAVA="no"
+
+fi
+if test ! x$JAVA = "xno"
 then
-  # Extract the first word of "gprolog", so it can be a program name with args.
-set dummy gprolog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_GNU_PROLOG+set}" = set; then
+
+# Extract the first word of "uudecode$EXEEXT", so it can be a program name with args.
+set dummy uudecode$EXEEXT; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_uudecode+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$GNU_PROLOG"; then
-  ac_cv_prog_GNU_PROLOG="$GNU_PROLOG" # Let the user override the test.
+  if test -n "$uudecode"; then
+  ac_cv_prog_uudecode="$uudecode" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -14363,594 +16159,693 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_GNU_PROLOG="gprolog"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_uudecode="yes"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-GNU_PROLOG=$ac_cv_prog_GNU_PROLOG
-if test -n "$GNU_PROLOG"; then
-  echo "$as_me:$LINENO: result: $GNU_PROLOG" >&5
-echo "${ECHO_T}$GNU_PROLOG" >&6
+uudecode=$ac_cv_prog_uudecode
+if test -n "$uudecode"; then
+  { echo "$as_me:$LINENO: result: $uudecode" >&5
+echo "${ECHO_T}$uudecode" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  if test x"$GNU_PROLOG" = xgprolog
-  then
-    if test "${ac_cv_header_gprolog_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for gprolog.h" >&5
-echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6
-if test "${ac_cv_header_gprolog_h+set}" = set; then
+
+if test x$uudecode = xyes; then
+{ echo "$as_me:$LINENO: checking if uudecode can decode base 64 file" >&5
+echo $ECHO_N "checking if uudecode can decode base 64 file... $ECHO_C" >&6; }
+if test "${ac_cv_prog_uudecode_base64+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
-echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking gprolog.h usability" >&5
-echo $ECHO_N "checking gprolog.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <gprolog.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+        ac_cv_prog_uudecode_base64=yes
+else
+        echo "configure: 16204: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+        echo "configure: failed file was:" >&5
+        cat Test.uue >&5
+        ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_uudecode_base64" >&5
+echo "${ECHO_T}$ac_cv_prog_uudecode_base64" >&6; }
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        rm -f Test.class
+        if test x$ac_cv_javac_supports_enums = x; then
 
-# Is the header present?
-echo "$as_me:$LINENO: checking gprolog.h presence" >&5
-echo $ECHO_N "checking gprolog.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <gprolog.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
+if test "x$JAVAPREFIX" = x
+then
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_JAVAC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
+  if test -n "$JAVAC"; then
+  ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+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_prog_JAVAC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: gprolog.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: gprolog.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: gprolog.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: gprolog.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: gprolog.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: gprolog.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: gprolog.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: gprolog.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: gprolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: gprolog.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: gprolog.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: gprolog.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to ppl-devel at cs.unipr.it ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for gprolog.h" >&5
-echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6
-if test "${ac_cv_header_gprolog_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_header_gprolog_h=$ac_header_preproc
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
-echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6
-
 fi
-if test $ac_cv_header_gprolog_h = yes; then
-  :
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+  { echo "$as_me:$LINENO: result: $JAVAC" >&5
+echo "${ECHO_T}$JAVAC" >&6; }
 else
-  GNU_PROLOG=""
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
-  fi
-fi
-
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
 
-if test x$GNU_PROLOG = xgprolog; then
-  BUILD_GNU_PROLOG_INTERFACE_TRUE=
-  BUILD_GNU_PROLOG_INTERFACE_FALSE='#'
 else
-  BUILD_GNU_PROLOG_INTERFACE_TRUE='#'
-  BUILD_GNU_PROLOG_INTERFACE_FALSE=
-fi
-
-
-# SICStus
-if test x${sicstus_prolog_interface_enabled} = xyes
-then
-
-# Extract the first word of "sicstus", so it can be a program name with args.
-set dummy sicstus; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_sicstus_prolog+set}" = set; then
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_JAVAC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $sicstus_prolog in
+  case $JAVAC in
   [\\/]* | ?:[\\/]*)
-  ac_cv_path_sicstus_prolog="$sicstus_prolog" # Let the user override the test with a path.
+  ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path.
   ;;
   *)
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+for as_dir in $JAVAPREFIX
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   ;;
 esac
 fi
-sicstus_prolog=$ac_cv_path_sicstus_prolog
-
-if test -n "$sicstus_prolog"; then
-  echo "$as_me:$LINENO: result: $sicstus_prolog" >&5
-echo "${ECHO_T}$sicstus_prolog" >&6
+JAVAC=$ac_cv_path_JAVAC
+if test -n "$JAVAC"; then
+  { echo "$as_me:$LINENO: result: $JAVAC" >&5
+echo "${ECHO_T}$JAVAC" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-if test x$sicstus_prolog != x
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+fi
+if test ! x$JAVAC = "xno"
 then
-        sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
-  SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
-  ac_save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
-  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-  # We require SICStus Prolog 3.9.1 or later.
-  if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
-echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6
-if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether $JAVAC supports enums" >&5
+echo $ECHO_N "checking whether $JAVAC supports enums... $ECHO_C" >&6; }
+if test "${ac_cv_javac_supports_enums+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
-echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6
 else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking sicstus/sicstus.h usability" >&5
-echo $ECHO_N "checking sicstus/sicstus.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <sicstus/sicstus.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 16323 "configure" */
+public class Test {
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+ }
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
+  (exit $ac_status); }; } >/dev/null 2>&1; then
+  ac_cv_javac_supports_enums=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  ac_cv_javac_supports_enums=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking sicstus/sicstus.h presence" >&5
-echo $ECHO_N "checking sicstus/sicstus.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sicstus/sicstus.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
 
-  ac_header_preproc=no
 fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_javac_supports_enums" >&5
+echo "${ECHO_T}$ac_cv_javac_supports_enums" >&6; }
 
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to ppl-devel at cs.unipr.it ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
-echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6
-if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_header_sicstus_sicstus_h=$ac_header_preproc
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
-echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6
 
+        fi
 fi
-if test $ac_cv_header_sicstus_sicstus_h = yes; then
-  echo "$as_me:$LINENO: checking for SICStus version 3.9.1 or later" >&5
-echo $ECHO_N "checking for SICStus version 3.9.1 or later... $ECHO_C" >&6
-                  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-                      #include <sicstus/sicstus.h>
-                      #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
-                      yes
-                      #endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+{ echo "$as_me:$LINENO: checking if $JAVA works" >&5
+echo $ECHO_N "checking if $JAVA works... $ECHO_C" >&6; }
+if test "${ac_cv_prog_java_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  sicstus_prolog=""
-                    echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
 
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+cat << \EOF > $JAVA_TEST
+/* [#]line 16372 "configure" */
+public class Test {
+public static void main (String args[]) {
+        System.exit (0);
+} }
+EOF
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } && test -s $CLASS_TEST; then
+                :
+        else
+          echo "configure: failed program was:" >&5
+          cat $JAVA_TEST >&5
+          { echo "$as_me:$LINENO: WARNING: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5
+echo "$as_me: WARNING: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;}
+        fi
 fi
-rm -f conftest*
-
+# if we don't have a Java compiler installed, it's useless to check if Java
+# works beacause a working javac is needed.
+if test x$ac_cv_javac_supports_enums = xno; then
+ ac_cv_prog_java_works=skipping
 else
-  sicstus_prolog=""
-fi
-
-
-  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-  CPPFLAGS="$ac_save_CPPFLAGS"
-
-fi
-
-if test x$sicstus_prolog != x
-then
-  have_sicstus_prolog=yes
+if { ac_try='$JAVA $JAVAFLAGS $TEST'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null 2>&1; then
+  ac_cv_prog_java_works=yes
 else
-  have_sicstus_prolog=no
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  { echo "$as_me:$LINENO: WARNING: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&5
+echo "$as_me: WARNING: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&2;}
+  fi
 fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
 
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_java_works" >&5
+echo "${ECHO_T}$ac_cv_prog_java_works" >&6; }
 
 
-if test x$have_sicstus_prolog = xyes; then
-  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE=
-  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE='#'
-else
-  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE='#'
-  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE=
 fi
 
 
-# SWI Prolog
-if test x${swi_prolog_interface_enabled} = xyes
-then
-
-# Extract the first word of "swi-prolog", so it can be a program name with args.
-set dummy swi-prolog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_swi_prolog+set}" = set; then
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAR" = x && for ac_prog in jar$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_JAR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $swi_prolog in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  if test -n "$JAR"; then
+  ac_cv_prog_JAR="$JAR" # Let the user override the test.
+else
+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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_JAR="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  ;;
-esac
 fi
-swi_prolog=$ac_cv_path_swi_prolog
-
-if test -n "$swi_prolog"; then
-  echo "$as_me:$LINENO: result: $swi_prolog" >&5
-echo "${ECHO_T}$swi_prolog" >&6
+fi
+JAR=$ac_cv_prog_JAR
+if test -n "$JAR"; then
+  { echo "$as_me:$LINENO: result: $JAR" >&5
+echo "${ECHO_T}$JAR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-if test -z $swi_prolog
-then
-  # Extract the first word of "swipl", so it can be a program name with args.
-set dummy swipl; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_swi_prolog+set}" = set; then
+
+  test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="no"
+
+else
+        test "x$JAR" = x && for ac_prog in jar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_JAR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $swi_prolog in
+  case $JAR in
   [\\/]* | ?:[\\/]*)
-  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ac_cv_path_JAR="$JAR" # Let the user override the test with a path.
   ;;
   *)
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+for as_dir in $JAVAPREFIX
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   ;;
 esac
 fi
-swi_prolog=$ac_cv_path_swi_prolog
+JAR=$ac_cv_path_JAR
+if test -n "$JAR"; then
+  { echo "$as_me:$LINENO: result: $JAR" >&5
+echo "${ECHO_T}$JAR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-if test -n "$swi_prolog"; then
-  echo "$as_me:$LINENO: result: $swi_prolog" >&5
-echo "${ECHO_T}$swi_prolog" >&6
+
+  test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="no"
+
+fi
+test "x$JAR" = xno
+
+
+if test "x$JAVAPREFIX" = x; then
+        for ac_prog in javah
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_JAVAH+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$JAVAH"; then
+  ac_cv_prog_JAVAH="$JAVAH" # Let the user override the test.
+else
+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_prog_JAVAH="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAH=$ac_cv_prog_JAVAH
+if test -n "$JAVAH"; then
+  { echo "$as_me:$LINENO: result: $JAVAH" >&5
+echo "${ECHO_T}$JAVAH" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  if test -z $swi_prolog
-  then
-    # Extract the first word of "pl", so it can be a program name with args.
-set dummy pl; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_swi_prolog+set}" = set; then
+
+  test -n "$JAVAH" && break
+done
+test -n "$JAVAH" || JAVAH="no"
+
+else
+	for ac_prog in javah
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_JAVAH+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $swi_prolog in
+  case $JAVAH in
   [\\/]* | ?:[\\/]*)
-  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ac_cv_path_JAVAH="$JAVAH" # Let the user override the test with a path.
   ;;
   *)
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+for as_dir in $JAVAPREFIX
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_JAVAH="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
   ;;
 esac
 fi
-swi_prolog=$ac_cv_path_swi_prolog
+JAVAH=$ac_cv_path_JAVAH
+if test -n "$JAVAH"; then
+  { echo "$as_me:$LINENO: result: $JAVAH" >&5
+echo "${ECHO_T}$JAVAH" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-if test -n "$swi_prolog"; then
-  echo "$as_me:$LINENO: result: $swi_prolog" >&5
-echo "${ECHO_T}$swi_prolog" >&6
+
+  test -n "$JAVAH" && break
+done
+test -n "$JAVAH" || JAVAH="no"
+
+fi
+
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != xno ; then
+  cat >conftest.$ac_ext <<_ACEOF
+#include <jni.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+    ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+    ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+    JNIFLAGS="-I$ac_dir -I$ac_dir/$ac_machdep"
+    CPPFLAGS="$ac_save_CPPFLAGS $JNIFLAGS"
+
+    cat >conftest.$ac_ext <<_ACEOF
+#include <jni.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  CPPFLAGS="$ac_save_CPPFLAGS"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  { echo "$as_me:$LINENO: WARNING: unable to include <jni.h>" >&5
+echo "$as_me: WARNING: unable to include <jni.h>" >&2;}
+	       JAVAH=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+    CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+rm -f conftest.err conftest.$ac_ext
+fi
+fi
+
+# All the Java programs are required to build the Java interface and if
+# the Java interface is enabled.
+ if test ! "x$JAVA" = xno &&  test ! "x$ac_cv_javac_supports_enums" = xno && test ! "x$JAR" = xno && test ! "x$JAVAH" = xno && test x${java_interface_enabled} = xyes; then
+  BUILD_JAVA_INTERFACE_TRUE=
+  BUILD_JAVA_INTERFACE_FALSE='#'
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  BUILD_JAVA_INTERFACE_TRUE='#'
+  BUILD_JAVA_INTERFACE_FALSE=
 fi
 
+
+# OCaml
+if test x${ocaml_interface_enabled} = xyes
+then
+  # Extract the first word of "ocamlc", so it can be a program name with args.
+set dummy ocamlc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OCAMLC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OCAMLC"; then
+  ac_cv_prog_OCAMLC="$OCAMLC" # Let the user override the test.
+else
+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_prog_OCAMLC="ocamlc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
+done
+done
+IFS=$as_save_IFS
+
 fi
-if test x$swi_prolog != x
+fi
+OCAMLC=$ac_cv_prog_OCAMLC
+if test -n "$OCAMLC"; then
+  { echo "$as_me:$LINENO: result: $OCAMLC" >&5
+echo "${ECHO_T}$OCAMLC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  ocamlgmp="no"
+  if test x"$OCAMLC" = xocamlc
+  then
+     ocamlc_root=`ocamlc -where`
+     # checking for OCaml GMP
+     { echo "$as_me:$LINENO: checking for Caml-GMP module gmp.cma" >&5
+echo $ECHO_N "checking for Caml-GMP module gmp.cma... $ECHO_C" >&6; }
+     if test -f ${ocamlc_root}/gmp/gmp.cma;
+     then
+         { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	 ocamlgmp="yes"
+     else
+         { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+	 ocamlgmp="no"
+     fi
+  fi
+fi
+ if test x$OCAMLC = xocamlc && test x$ocamlgmp = xyes; then
+  BUILD_OCAML_INTERFACE_TRUE=
+  BUILD_OCAML_INTERFACE_FALSE='#'
+else
+  BUILD_OCAML_INTERFACE_TRUE='#'
+  BUILD_OCAML_INTERFACE_FALSE=
+fi
+
+
+# Ciao Prolog
+if test x${ciao_prolog_interface_enabled} = xyes
 then
-  swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
-  swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
 
+# Extract the first word of "ciao", so it can be a program name with args.
+set dummy ciao; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ciao_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ciao_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ciao_prolog="$ciao_prolog" # 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_ciao_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ciao_prolog=$ac_cv_path_ciao_prolog
+if test -n "$ciao_prolog"; then
+  { echo "$as_me:$LINENO: result: $ciao_prolog" >&5
+echo "${ECHO_T}$ciao_prolog" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+if test x$ciao_prolog != x
+then
+  # Create a temporary directory $tmp in $TMPDIR (default /tmp).
+  # Use mktemp if possible; otherwise fall back on mkdir,
+  # with $RANDOM to make collisions less likely.
+  : ${TMPDIR=/tmp}
+  {
+    tmp=`
+      (umask 077 && mktemp -d "$TMPDIR/ppl_ciao_XXXXXX") 2>/dev/null
+    ` &&
+    test -n "$tmp" && test -d "$tmp"
+  } || {
+    tmp=$TMPDIR/ppl_ciao_$$-$RANDOM
+    (umask 077 && mkdir "$tmp")
+  } || exit $?
+  cat >$tmp/print_include_dir.pl <<_CIAO_PRINT_INCLUDE_DIR_EOF
+main(_) :-
+    ciaolibdir(Lib_Dir),
+    get_os(Os),
+    /*get_arch(Arch),*/
+    format("~p/include/", [Lib_Dir/*, Os, Arch*/]).
+_CIAO_PRINT_INCLUDE_DIR_EOF
+  ciao_prolog_include_dir=`$ciao_prolog $tmp/print_include_dir.pl`
+  rm -rf $tmp
+
+  CIAO_PROLOG_INCLUDE_OPTIONS="-I${ciao_prolog_include_dir}"
 
-  SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
   ac_save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
-  ac_ext=cc
+  CPPFLAGS="$CPPFLAGS $CIAO_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-  # We require SWI-Prolog 5.6.0 or later.
-  if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
-echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6
-if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+  if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
+echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
-echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking SWI-Prolog.h usability" >&5
-echo $ECHO_N "checking SWI-Prolog.h usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking ciao_prolog.h usability" >&5
+echo $ECHO_N "checking ciao_prolog.h usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -14958,70 +16853,64 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-#include <SWI-Prolog.h>
+#include <ciao_prolog.h>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking SWI-Prolog.h presence" >&5
-echo $ECHO_N "checking SWI-Prolog.h presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking ciao_prolog.h presence" >&5
+echo $ECHO_N "checking ciao_prolog.h presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <SWI-Prolog.h>
+#include <ciao_prolog.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -15029,62 +16918,61 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
   yes:no: )
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&2;}
     ac_header_preproc=yes
     ;;
   no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: SWI-Prolog.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: SWI-Prolog.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: SWI-Prolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: ciao_prolog.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: ciao_prolog.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: ciao_prolog.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: ciao_prolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
 ## ------------------------------------ ##
 ## Report this to ppl-devel at cs.unipr.it ##
 ## ------------------------------------ ##
 _ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
-echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
-echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6
-if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+{ echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
+echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_header_SWI_Prolog_h=$ac_header_preproc
+  ac_cv_header_ciao_prolog_h=$ac_header_preproc
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
-echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6; }
 
 fi
-if test $ac_cv_header_SWI_Prolog_h = yes; then
-  echo "$as_me:$LINENO: checking for SWI-Prolog version 5.6.0 or later" >&5
-echo $ECHO_N "checking for SWI-Prolog version 5.6.0 or later... $ECHO_C" >&6
+if test $ac_cv_header_ciao_prolog_h = yes; then
+  { echo "$as_me:$LINENO: checking for Ciao Prolog version x.y.z or later" >&5
+echo $ECHO_N "checking for Ciao Prolog version x.y.z or later... $ECHO_C" >&6; }
                   cat >conftest.$ac_ext <<_ACEOF
-#include <SWI-Prolog.h>
+#include <ciao_prolog.h>
 
 int
 main() {
-#if !defined(PLVERSION) || PLVERSION < 50600
+#if 0
   choke me
 #endif
 
@@ -15093,161 +16981,83 @@ main() {
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-swi_prolog=""
-                    echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+	ciao_prolog=""
+                    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
-  swi_prolog=""
+  ciao_prolog=""
 fi
 
 
-  ac_ext=cc
+
+
+  ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
   CPPFLAGS="$ac_save_CPPFLAGS"
+  CIAO_PROLOG="$ciao_prolog"
 
-fi
 
-if test x$swi_prolog != x
+  fi
+
+if test x$ciao_prolog != x
 then
-  have_swi_prolog=yes
+  have_ciao_prolog=yes
 else
-  have_swi_prolog=no
-fi
-
-fi
-
-
-if test x$have_swi_prolog = xyes; then
-  BUILD_SWI_PROLOG_INTERFACE_TRUE=
-  BUILD_SWI_PROLOG_INTERFACE_FALSE='#'
-else
-  BUILD_SWI_PROLOG_INTERFACE_TRUE='#'
-  BUILD_SWI_PROLOG_INTERFACE_FALSE=
-fi
-
-
-# XSB
-if test x${xsb_prolog_interface_enabled} = xyes
-then
-
-# Extract the first word of "xsb", so it can be a program name with args.
-set dummy xsb; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_xsb_prolog+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $xsb_prolog in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_xsb_prolog="$xsb_prolog" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  ;;
-esac
-fi
-xsb_prolog=$ac_cv_path_xsb_prolog
-
-if test -n "$xsb_prolog"; then
-  echo "$as_me:$LINENO: result: $xsb_prolog" >&5
-echo "${ECHO_T}$xsb_prolog" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-if test x$xsb_prolog != x
-then
-        xsb_emu_dir=$(xsb --nobanner --quietload --noprompt \
-                -e "write('emudir='), \
-                  xsb_configuration(emudir, X), write(X), nl, halt." \
-                    2>/dev/null | sed "s/^emudir=//g")
-  xsb_config_dir=$(xsb --nobanner --quietload --noprompt \
-                   -e "write('config_dir='), \
-                     xsb_configuration(config_dir,X), write(X), nl, halt." \
-                       2>/dev/null | sed "s/^config_dir=//g")
-  XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
-
-fi
-
-if test x$xsb_prolog != x
-then
-  have_xsb_prolog=yes
-else
-  have_xsb_prolog=no
+  have_ciao_prolog=no
 fi
 
 fi
-
-
-if test x$have_xsb_prolog = xyes; then
-  BUILD_XSB_PROLOG_INTERFACE_TRUE=
-  BUILD_XSB_PROLOG_INTERFACE_FALSE='#'
+ if test x$have_ciao_prolog = xyes; then
+  BUILD_CIAO_PROLOG_INTERFACE_TRUE=
+  BUILD_CIAO_PROLOG_INTERFACE_FALSE='#'
 else
-  BUILD_XSB_PROLOG_INTERFACE_TRUE='#'
-  BUILD_XSB_PROLOG_INTERFACE_FALSE=
+  BUILD_CIAO_PROLOG_INTERFACE_TRUE='#'
+  BUILD_CIAO_PROLOG_INTERFACE_FALSE=
 fi
 
 
-# YAP
-if test x${yap_prolog_interface_enabled} = xyes
+# GNU Prolog
+if test x${gnu_prolog_interface_enabled} = xyes
 then
-  # Extract the first word of "yap", so it can be a program name with args.
-set dummy yap; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_YAP_PROLOG+set}" = set; then
+  # Extract the first word of "gprolog", so it can be a program name with args.
+set dummy gprolog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_GNU_PROLOG+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$YAP_PROLOG"; then
-  ac_cv_prog_YAP_PROLOG="$YAP_PROLOG" # Let the user override the test.
+  if test -n "$GNU_PROLOG"; then
+  ac_cv_prog_GNU_PROLOG="$GNU_PROLOG" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -15255,39 +17065,41 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_YAP_PROLOG="yap"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_GNU_PROLOG="gprolog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-YAP_PROLOG=$ac_cv_prog_YAP_PROLOG
-if test -n "$YAP_PROLOG"; then
-  echo "$as_me:$LINENO: result: $YAP_PROLOG" >&5
-echo "${ECHO_T}$YAP_PROLOG" >&6
+GNU_PROLOG=$ac_cv_prog_GNU_PROLOG
+if test -n "$GNU_PROLOG"; then
+  { echo "$as_me:$LINENO: result: $GNU_PROLOG" >&5
+echo "${ECHO_T}$GNU_PROLOG" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  if test x"$YAP_PROLOG" = xyap
+
+  if test x"$GNU_PROLOG" = xgprolog
   then
-    if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
-echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6
-if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+    if test "${ac_cv_header_gprolog_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for gprolog.h" >&5
+echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_gprolog_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
-echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking Yap/c_interface.h usability" >&5
-echo $ECHO_N "checking Yap/c_interface.h usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking gprolog.h usability" >&5
+echo $ECHO_N "checking gprolog.h usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -15295,70 +17107,64 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-#include <Yap/c_interface.h>
+#include <gprolog.h>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking Yap/c_interface.h presence" >&5
-echo $ECHO_N "checking Yap/c_interface.h presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking gprolog.h presence" >&5
+echo $ECHO_N "checking gprolog.h presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <Yap/c_interface.h>
+#include <gprolog.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -15366,1064 +17172,765 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
   yes:no: )
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: gprolog.h: proceeding with the compiler's result" >&2;}
     ac_header_preproc=yes
     ;;
   no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: Yap/c_interface.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: Yap/c_interface.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: Yap/c_interface.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: gprolog.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: gprolog.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: gprolog.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: gprolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: gprolog.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: gprolog.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
 ## ------------------------------------ ##
 ## Report this to ppl-devel at cs.unipr.it ##
 ## ------------------------------------ ##
 _ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
-echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
-echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6
-if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+{ echo "$as_me:$LINENO: checking for gprolog.h" >&5
+echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_gprolog_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_cv_header_Yap_c_interface_h=$ac_header_preproc
+  ac_cv_header_gprolog_h=$ac_header_preproc
 fi
-echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
-echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6; }
 
 fi
-if test $ac_cv_header_Yap_c_interface_h = yes; then
+if test $ac_cv_header_gprolog_h = yes; then
   :
 else
-  YAP_PROLOG=""
+  GNU_PROLOG=""
 fi
 
 
   fi
 fi
-
-
-if test x$YAP_PROLOG = xyap; then
-  BUILD_YAP_PROLOG_INTERFACE_TRUE=
-  BUILD_YAP_PROLOG_INTERFACE_FALSE='#'
+ if test x$GNU_PROLOG = xgprolog; then
+  BUILD_GNU_PROLOG_INTERFACE_TRUE=
+  BUILD_GNU_PROLOG_INTERFACE_FALSE='#'
 else
-  BUILD_YAP_PROLOG_INTERFACE_TRUE='#'
-  BUILD_YAP_PROLOG_INTERFACE_FALSE=
+  BUILD_GNU_PROLOG_INTERFACE_TRUE='#'
+  BUILD_GNU_PROLOG_INTERFACE_FALSE=
 fi
 
 
-# # This is the list of interfaces that are enabled by default.
-# # Different instantiations are separated by a '@' character.
-# default_instantiations="Polyhedron @ BD_Shape<int8_t>"
-#
-# enableval=not_specified
-# AC_MSG_CHECKING([which instantiations are enabled])
-# AC_ARG_ENABLE(instantiations,
-#   AC_HELP_STRING([--enable-instantiations],
-#     [enable instantiations for the non-C++ interfaces]))
-# case x"${enableval}" in
-# xyes | x)
-#   AC_MSG_ERROR([--enable-instantiations needs at least one argument])
-#   ;;
-# xno | xnone)
-#   enabled_instantiations=
-#   AC_MSG_RESULT(none)
-#   ;;
-# *)
-#   if test x"${enableval}" = xnot_specified
-#   then
-#     enableval=${default_instantiations}
-#   fi
-#   # Make the list blank-separated.
-#   required_instantiations=`echo "${enableval}" | sed -e 's/[[ 	]][[ 	]]*//g' -e 's/@/ /g' -e 's/[[ 	]][[ 	]]*/ /g'`
-#   # Check the specified instantiations for validity.
-#   ac_save_CPPFLAGS="$CPPFLAGS"
-#   CPPFLAGS="$CPPFLAGS -I${srcdir}"
-#   for instantiation in ${required_instantiations}
-#   do
-#     AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-# #include "instchk.hh"
-#
-# using namespace Parma_Polyhedra_Library;
-#
-# bool valid = ${instantiation}::valid_instantiation();
-# ]])],
-#       valid_instantiation=yes,
-#       valid_instantiation=no)
-#     if test x${valid_instantiation} != xyes
-#     then
-#       AC_MSG_ERROR([invalid instantiation ${instantiation}])
-#     fi
-#   done
-#   CPPFLAGS="$ac_save_CPPFLAGS"
-#   AC_MSG_RESULT([${required_instantiations}])
-#   ;;
-# esac
+# SICStus
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
 
-# Libtool.
-# Turn off shared libraries during beta-testing, since they
-# make debugging harder and the build process takes too long.
-#AC_DISABLE_SHARED
+# Extract the first word of "sicstus", so it can be a program name with args.
+set dummy sicstus; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_sicstus_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $sicstus_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_sicstus_prolog="$sicstus_prolog" # 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_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
+  ;;
+esac
+fi
+sicstus_prolog=$ac_cv_path_sicstus_prolog
+if test -n "$sicstus_prolog"; then
+  { echo "$as_me:$LINENO: result: $sicstus_prolog" >&5
+echo "${ECHO_T}$sicstus_prolog" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
 
+if test x$sicstus_prolog != x
+then
+        sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
+  SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
-  enableval="$enable_shared"
-  p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
+  # We require SICStus Prolog 3.9.1 or later.
+  if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
+echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
+echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6; }
 else
-  enable_shared=yes
-fi;
-
-# Check whether --enable-static or --disable-static was given.
-if test "${enable_static+set}" = set; then
-  enableval="$enable_static"
-  p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking sicstus/sicstus.h usability" >&5
+echo $ECHO_N "checking sicstus/sicstus.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <sicstus/sicstus.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
 else
-  enable_static=yes
-fi;
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Check whether --enable-fast-install or --disable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then
-  enableval="$enable_fast_install"
-  p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi;
+	ac_header_compiler=no
+fi
 
-echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
-echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
-if test "${lt_cv_path_SED+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking sicstus/sicstus.h presence" >&5
+echo $ECHO_N "checking sicstus/sicstus.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sicstus/sicstus.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
 else
-  # Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+  ac_header_preproc=no
 fi
 
-SED=$lt_cv_path_SED
-echo "$as_me:$LINENO: result: $SED" >&5
-echo "${ECHO_T}$SED" >&6
-
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi;
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
     ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
-fi
-if test "${lt_cv_path_LD+set}" = set; then
+esac
+{ echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
+echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  ac_cv_header_sicstus_sicstus_h=$ac_header_preproc
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
+echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6; }
+
 fi
+if test $ac_cv_header_sicstus_sicstus_h = yes; then
+  { echo "$as_me:$LINENO: checking for SICStus version 3.9.1 or later" >&5
+echo $ECHO_N "checking for SICStus version 3.9.1 or later... $ECHO_C" >&6; }
+                  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+                      #include <sicstus/sicstus.h>
+                      #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+                      yes
+                      #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  sicstus_prolog=""
+                    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+
 fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
-   { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${lt_cv_prog_gnu_ld+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+rm -f conftest*
+
 else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
+  sicstus_prolog=""
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
-with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
-echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
-if test "${lt_cv_ld_reload_flag+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_ld_reload_flag='-r'
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
 fi
-echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
 
-echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
-echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
-if test "${lt_cv_path_NM+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+if test x$sicstus_prolog != x
+then
+  have_sicstus_prolog=yes
 else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  have_sicstus_prolog=no
+fi
+
+fi
+ if test x$have_sicstus_prolog = xyes; then
+  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE=
+  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE='#'
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi
+  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE='#'
+  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE=
 fi
-echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
-echo "${ECHO_T}$lt_cv_path_NM" >&6
-NM="$lt_cv_path_NM"
 
-echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6
-fi
 
-echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
-echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
-if test "${lt_cv_deplibs_check_method+set}" = set; then
+# SWI-Prolog
+if test x${swi_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "swi-prolog", so it can be a program name with args.
+set dummy swi-prolog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_swi_prolog+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix4* | aix5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
-  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # 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_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
   ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-freebsd* | kfreebsd*-gnu | dragonfly*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
+if test -z $swi_prolog
+then
+  # Extract the first word of "swipl", so it can be a program name with args.
+set dummy swipl; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
   ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
   *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
+  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_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-interix3*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
   ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-# This must be Linux ELF.
-linux*)
-  lt_cv_deplibs_check_method=pass_all
+  if test -z $swi_prolog
+  then
+    # Extract the first word of "pl", so it can be a program name with args.
+set dummy pl; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
   ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  *)
+  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_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
-  ;;
+done
+done
+IFS=$as_save_IFS
 
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
   ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-nto-qnx*)
-  lt_cv_deplibs_check_method=unknown
-  ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   fi
-  ;;
+fi
+if test x$swi_prolog != x
+then
+  swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
+  swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
+  swi_prolog_arch=`$swi_prolog -dump-runtime-variables | grep PLARCH= | sed 's/PLARCH="\(.*\)";/\1/'`
+  swi_prolog_libs=`$swi_prolog -dump-runtime-variables | grep PLLIBS= | sed 's/PLLIBS="\(.*\)";/\1/'`
+  swi_prolog_lib=`$swi_prolog -dump-runtime-variables | grep PLLIB= | sed 's/PLLIB="\(.*\)";/\1/'`
 
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
 
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
+  SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} ${swi_prolog_lib} ${swi_prolog_libs}"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  # We require SWI-Prolog 5.6.0 or later.
+  if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
+echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking SWI-Prolog.h usability" >&5
+echo $ECHO_N "checking SWI-Prolog.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <SWI-Prolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
 esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_header_compiler=no
 fi
-echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then
-  enableval="$enable_libtool_lock"
-
-fi;
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *ELF-32*)
-      HPUX_IA64_MODE="32"
-      ;;
-    *ELF-64*)
-      HPUX_IA64_MODE="64"
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line 16042 "configure"' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
+# Is the header present?
+{ echo "$as_me:$LINENO: checking SWI-Prolog.h presence" >&5
+echo $ECHO_N "checking SWI-Prolog.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <SWI-Prolog.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-   if test "$lt_cv_prog_gnu_ld" = yes; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -melf32bsmip"
-      ;;
-    *N32*)
-      LD="${LD-ld} -melf32bmipn32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -melf64bmip"
-      ;;
-    esac
-   else
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -32"
-      ;;
-    *N32*)
-      LD="${LD-ld} -n32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -64"
-      ;;
-    esac
-   fi
-  fi
-  rm -rf conftest*
-  ;;
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    case `/usr/bin/file conftest.o` in
-    *32-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_i386"
-          ;;
-        ppc64-*linux*|powerpc64-*linux*)
-          LD="${LD-ld} -m elf32ppclinux"
-          ;;
-        s390x-*linux*)
-          LD="${LD-ld} -m elf_s390"
-          ;;
-        sparc64-*linux*)
-          LD="${LD-ld} -m elf32_sparc"
-          ;;
-      esac
-      ;;
-    *64-bit*)
-      case $host in
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        ppc*-*linux*|powerpc*-*linux*)
-          LD="${LD-ld} -m elf64ppc"
-          ;;
-        s390*-*linux*)
-          LD="${LD-ld} -m elf64_s390"
-          ;;
-        sparc*-*linux*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
+  ac_header_preproc=no
+fi
 
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
-if test "${lt_cv_cc_needs_belf+set}" = set; then
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: SWI-Prolog.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: SWI-Prolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
+echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+  ac_cv_header_SWI_Prolog_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6; }
 
-     cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+fi
+if test $ac_cv_header_SWI_Prolog_h = yes; then
+  { echo "$as_me:$LINENO: checking for SWI-Prolog version 5.6.0 or later" >&5
+echo $ECHO_N "checking for SWI-Prolog version 5.6.0 or later... $ECHO_C" >&6; }
+                  cat >conftest.$ac_ext <<_ACEOF
+#include <SWI-Prolog.h>
 
 int
-main ()
-{
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+  choke me
+#endif
 
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  lt_cv_cc_needs_belf=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-lt_cv_cc_needs_belf=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+	swi_prolog=""
+                    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)    LD="${LD-ld} -64" ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
 
-*-*-cygwin* | *-*-mingw* | *-*-pw32*)
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_DLLTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
-  if test -n "$DLLTOOL"; then
-  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
-  echo "$as_me:$LINENO: result: $DLLTOOL" >&5
-echo "${ECHO_T}$DLLTOOL" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  swi_prolog=""
 fi
 
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
-  ac_ct_DLLTOOL=$DLLTOOL
-  # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_DLLTOOL"; then
-  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
 
-  test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false"
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
-  echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
-echo "${ECHO_T}$ac_ct_DLLTOOL" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  SWI_PROLOG="$swi_prolog"
+
+
 
-  DLLTOOL=$ac_ct_DLLTOOL
-else
-  DLLTOOL="$ac_cv_prog_DLLTOOL"
 fi
 
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
-set dummy ${ac_tool_prefix}as; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_AS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$AS"; then
-  ac_cv_prog_AS="$AS" # Let the user override the test.
+if test x$swi_prolog != x
+then
+  have_swi_prolog=yes
 else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AS="${ac_tool_prefix}as"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
+  have_swi_prolog=no
 fi
+
 fi
-AS=$ac_cv_prog_AS
-if test -n "$AS"; then
-  echo "$as_me:$LINENO: result: $AS" >&5
-echo "${ECHO_T}$AS" >&6
+ if test x$have_swi_prolog = xyes; then
+  BUILD_SWI_PROLOG_INTERFACE_TRUE=
+  BUILD_SWI_PROLOG_INTERFACE_FALSE='#'
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  BUILD_SWI_PROLOG_INTERFACE_TRUE='#'
+  BUILD_SWI_PROLOG_INTERFACE_FALSE=
 fi
 
-fi
-if test -z "$ac_cv_prog_AS"; then
-  ac_ct_AS=$AS
-  # Extract the first word of "as", so it can be a program name with args.
-set dummy as; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
+
+# XSB
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "xsb", so it can be a program name with args.
+set dummy xsb; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_xsb_prolog+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_AS"; then
-  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  case $xsb_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_xsb_prolog="$xsb_prolog" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AS="as"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false"
-fi
+  ;;
+esac
 fi
-ac_ct_AS=$ac_cv_prog_ac_ct_AS
-if test -n "$ac_ct_AS"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
-echo "${ECHO_T}$ac_ct_AS" >&6
+xsb_prolog=$ac_cv_path_xsb_prolog
+if test -n "$xsb_prolog"; then
+  { echo "$as_me:$LINENO: result: $xsb_prolog" >&5
+echo "${ECHO_T}$xsb_prolog" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  AS=$ac_ct_AS
-else
-  AS="$ac_cv_prog_AS"
+
+if test x$xsb_prolog != x
+then
+        xsb_emu_dir=$(xsb --nobanner --quietload --noprompt \
+                -e "write('emudir='), \
+                  xsb_configuration(emudir, X), write(X), nl, halt." \
+                    2>/dev/null | sed "s/^emudir=//g")
+  xsb_config_dir=$(xsb --nobanner --quietload --noprompt \
+                   -e "write('config_dir='), \
+                     xsb_configuration(config_dir,X), write(X), nl, halt." \
+                       2>/dev/null | sed "s/^config_dir=//g")
+  XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+
 fi
 
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+if test x$xsb_prolog != x
+then
+  have_xsb_prolog=yes
 else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
+  have_xsb_prolog=no
 fi
+
 fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  echo "$as_me:$LINENO: result: $OBJDUMP" >&5
-echo "${ECHO_T}$OBJDUMP" >&6
+ if test x$have_xsb_prolog = xyes; then
+  BUILD_XSB_PROLOG_INTERFACE_TRUE=
+  BUILD_XSB_PROLOG_INTERFACE_FALSE='#'
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  BUILD_XSB_PROLOG_INTERFACE_TRUE='#'
+  BUILD_XSB_PROLOG_INTERFACE_FALSE=
 fi
 
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
+
+# YAP
+if test x${yap_prolog_interface_enabled} = xyes
+then
+  # Extract the first word of "yap", so it can be a program name with args.
+set dummy yap; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_YAP_PROLOG+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+  if test -n "$YAP_PROLOG"; then
+  ac_cv_prog_YAP_PROLOG="$YAP_PROLOG" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -16431,54 +17938,41 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_YAP_PROLOG="yap"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false"
-fi
 fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
-echo "${ECHO_T}$ac_ct_OBJDUMP" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
 fi
-
-  OBJDUMP=$ac_ct_OBJDUMP
+YAP_PROLOG=$ac_cv_prog_YAP_PROLOG
+if test -n "$YAP_PROLOG"; then
+  { echo "$as_me:$LINENO: result: $YAP_PROLOG" >&5
+echo "${ECHO_T}$YAP_PROLOG" >&6; }
 else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  ;;
-
-esac
-
-need_locks="$enable_libtool_lock"
-
-
 
-for ac_header in dlfcn.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  if test x"$YAP_PROLOG" = xyap
+  then
+    if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
+echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
+echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6; }
 else
   # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking Yap/c_interface.h usability" >&5
+echo $ECHO_N "checking Yap/c_interface.h usability... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -16486,70 +17980,64 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 $ac_includes_default
-#include <$ac_header>
+#include <Yap/c_interface.h>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_header_compiler=no
+	ac_header_compiler=no
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
 # Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+{ echo "$as_me:$LINENO: checking Yap/c_interface.h presence" >&5
+echo $ECHO_N "checking Yap/c_interface.h presence... $ECHO_C" >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <$ac_header>
+#include <Yap/c_interface.h>
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
@@ -16557,1026 +18045,1007 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
   ac_header_preproc=no
 fi
+
 rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
 # So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
   yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&2;}
     ac_header_preproc=yes
     ;;
   no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: Yap/c_interface.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: Yap/c_interface.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
 ## ------------------------------------ ##
 ## Report this to ppl-devel at cs.unipr.it ##
 ## ------------------------------------ ##
 _ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
+{ echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
+echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  eval "$as_ac_Header=\$ac_header_preproc"
+  ac_cv_header_Yap_c_interface_h=$ac_header_preproc
 fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+{ echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
+echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6; }
 
 fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
+if test $ac_cv_header_Yap_c_interface_h = yes; then
+  :
+else
+  YAP_PROLOG=""
 fi
 
-done
 
+  fi
+fi
+ if test x$YAP_PROLOG = xyap; then
+  BUILD_YAP_PROLOG_INTERFACE_TRUE=
+  BUILD_YAP_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_YAP_PROLOG_INTERFACE_TRUE='#'
+  BUILD_YAP_PROLOG_INTERFACE_FALSE=
+fi
 
 
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
-echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
-if test -z "$CXXCPP"; then
-  if test "${ac_cv_prog_CXXCPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+# Test if *any* Prolog system has to be built.
+if test x${have_ciao_prolog} = xyes \
+|| test x${GNU_PROLOG} = xgprolog \
+|| test x${have_sicstus_prolog} = xyes \
+|| test x${have_swi_prolog} = xyes \
+|| test x${have_xsb_prolog} = xyes \
+|| test x${YAP_PROLOG} = xyap
+then
+  SOME_PROLOG=yes
+fi
+ if test x$SOME_PROLOG = xyes; then
+  BUILD_SOME_PROLOG_INTERFACES_TRUE=
+  BUILD_SOME_PROLOG_INTERFACES_FALSE='#'
 else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
+  BUILD_SOME_PROLOG_INTERFACES_TRUE='#'
+  BUILD_SOME_PROLOG_INTERFACES_FALSE=
 fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Broken: fails on valid input.
-continue
+
+# Define the list of interfaces that are enabled by default.
+# Different instantiations are separated by a '@' character.
+default_instantiations="Polyhedron @ Grid"
+default_instantiations="${default_instantiations} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class> @ Octagonal_Shape<double>"
+#default_instantiations="${default_instantiations} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class> @ BD_Shape<double>"
+#default_instantiations="${default_instantiations} @ Rational_Box @ Double_Box"
+#default_instantiations="${default_instantiations} @ Constraints_Product<C_Polyhedron, Grid>"
+default_instantiations="${default_instantiations} @ Pointset_Powerset<C_Polyhedron> @ Pointset_Powerset<NNC_Polyhedron>"
+
+enableval=not_specified
+{ echo "$as_me:$LINENO: checking which instantiations are enabled" >&5
+echo $ECHO_N "checking which instantiations are enabled... $ECHO_C" >&6; }
+# Check whether --enable-instantiations was given.
+if test "${enable_instantiations+set}" = set; then
+  enableval=$enable_instantiations;
 fi
-rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
+case x"${enableval}" in
+xyes | x)
+  { { echo "$as_me:$LINENO: error: --enable-instantiations needs at least one argument" >&5
+echo "$as_me: error: --enable-instantiations needs at least one argument" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+xno | xnone)
+  enabled_instantiations=
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_instantiations}
+  fi
+  # Avoid extra blanks.
+  required_instantiations=`echo "${enableval}" | sed -e 's/[	 ][	 ]*/ /g' -e 's/[ ]*\([@<>,]\)[ ]*/\1/g' -e 's/>>/> >/g' -e 's/^[ ]//g' -e 's/[ ]$//g'`
+  # Check the specified instantiations for validity.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS -I${srcdir}"
+  old_IFS="${IFS}"
+  IFS=@
+  set -- ${required_instantiations}
+  IFS="${old_IFS}"
+  for instantiation
+  do
+    cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
+#include "instchk.hh"
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
-fi
+using namespace Parma_Polyhedra_Library;
 
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
+bool valid = ${instantiation}::valid_instantiation();
 
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-echo "$as_me:$LINENO: result: $CXXCPP" >&5
-echo "${ECHO_T}$CXXCPP" >&6
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  valid_instantiation=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-  # Broken: fails on valid input.
-continue
+	valid_instantiation=no
 fi
-rm -f conftest.err conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test x${valid_instantiation} != xyes
+    then
+      { { echo "$as_me:$LINENO: error: invalid instantiation ${instantiation}" >&5
+echo "$as_me: error: invalid instantiation ${instantiation}" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  done
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  required_instantiations_canonical_names=`echo "${required_instantiations}" | sed -e 's/> //g' -e 's/>//g' -e 's/[< ,]/_/g'`
+  required_instantiations_prolog_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_prolog_cxx_objects=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\).lo/ppl_prolog_\1.lo/g'`
+  required_instantiations_prolog_cxx_sources=`echo "${required_instantiations_prolog_cxx_objects}" | sed -e 's/\([^. ]*\).lo/..\/\1.cc/g'`
+  required_instantiations_prolog_cxx_headers=`echo "${required_instantiations_prolog_cxx_sources}" | sed -e 's/.cc/.hh/g'`
+  required_instantiations_java_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/^Polyhedron/Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' | sed -e 's/Pointset_Powerset_[a-zA-Z0-9_]*/&@&_Iterator/g'`
+  required_instantiations_java_sources=`echo "${required_instantiations_java_source_names}" | sed -e 's/@/.java /g' -e 's/$/.java/g'`
+  required_instantiations_java_cxx_headers=`echo "${required_instantiations_java_sources}" | sed -e 's/\([^. ]*\).java/ppl_java.\1/g'`
+  required_instantiations_java_cxx_headers_sources=`echo "${required_instantiations_java_sources}" | sed -e 's/\([^. ]*\).java/ppl_java_\1.h/g'`
+  { echo "$as_me:$LINENO: result: ${required_instantiations}" >&5
+echo "${ECHO_T}${required_instantiations}" >&6; }
+  ;;
+esac
 
-  # Passes both tests.
-ac_preproc_ok=:
-break
+enableval=quick
+{ echo "$as_me:$LINENO: checking whether \`make check' does a thorough or quick check" >&5
+echo $ECHO_N "checking whether \`make check' does a thorough or quick check... $ECHO_C" >&6; }
+# Check whether --enable-check was given.
+if test "${enable_check+set}" = set; then
+  enableval=$enable_check;
 fi
-rm -f conftest.err conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." >&2;}
+case "${enableval}" in
+thorough)
+  { echo "$as_me:$LINENO: result: thorough" >&5
+echo "${ECHO_T}thorough" >&6; }
+  ;;
+quick)
+  { echo "$as_me:$LINENO: result: quick" >&5
+echo "${ECHO_T}quick" >&6; }
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-check, needs thorough or quick" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-check, needs thorough or quick" >&2;}
    { (exit 1); exit 1; }; }
+  ;;
+esac
+ if test x"$enableval" = xthorough; then
+  THOROUGH_MAKE_CHECK_TRUE=
+  THOROUGH_MAKE_CHECK_FALSE='#'
+else
+  THOROUGH_MAKE_CHECK_TRUE='#'
+  THOROUGH_MAKE_CHECK_FALSE=
 fi
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-fi
+# Libtool.
+case `pwd` in
+  *\ * | *\	*)
+    { echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
 
-ac_ext=f
-ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
-ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_f77_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_F77+set}" = set; then
+
+
+macro_version='2.2.6'
+macro_revision='1.3012'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; }
+if test "${ac_cv_path_SED+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$F77"; then
-  ac_cv_prog_F77="$F77" # Let the user override the test.
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" | sed 99q >conftest.sed
+     $as_unset ac_script || ac_script=
+     # Extract the first word of "sed gsed" to use in msg output
+if test -z "$SED"; then
+set dummy sed gsed; ac_prog_name=$2
+if test "${ac_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
+  ac_path_SED_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
 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_prog in sed gsed; do
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
+    ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+    # Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_SED_found && break 3
+  done
 done
+
 done
+IFS=$as_save_IFS
+
 
 fi
+
+SED="$ac_cv_path_SED"
+if test -z "$SED"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
 fi
-F77=$ac_cv_prog_F77
-if test -n "$F77"; then
-  echo "$as_me:$LINENO: result: $F77" >&5
-echo "${ECHO_T}$F77" >&6
+
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  ac_cv_path_SED=$SED
 fi
 
-    test -n "$F77" && break
-  done
 fi
-if test -z "$F77"; then
-  ac_ct_F77=$F77
-  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+{ echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
+echo "${ECHO_T}$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_F77"; then
-  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     # Extract the first word of "fgrep" to use in msg output
+if test -z "$FGREP"; then
+set dummy fgrep; ac_prog_name=$2
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
+  ac_path_FGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
+  for ac_prog in fgrep; do
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_F77="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
+    ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+    # Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_FGREP_found && break 3
+  done
 done
+
 done
+IFS=$as_save_IFS
+
 
 fi
+
+FGREP="$ac_cv_path_FGREP"
+if test -z "$FGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
 fi
-ac_ct_F77=$ac_cv_prog_ac_ct_F77
-if test -n "$ac_ct_F77"; then
-  echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
-echo "${ECHO_T}$ac_ct_F77" >&6
+
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  ac_cv_path_FGREP=$FGREP
 fi
 
-  test -n "$ac_ct_F77" && break
-done
 
-  F77=$ac_ct_F77
+   fi
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
 
 
-# Provide some information about the compiler.
-echo "$as_me:16945:" \
-     "checking for Fortran 77 compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-rm -f a.out
-
-# If we don't use `.F' as extension, the preprocessor is not run on the
-# input file.  (Note that this only needs to work for GNU compilers.)
-ac_save_ext=$ac_ext
-ac_ext=F
-echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
-if test "${ac_cv_f77_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-      program main
-#ifndef __GNUC__
-       choke me
-#endif
+test -z "$GREP" && GREP=grep
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_compiler_gnu=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_f77_compiler_gnu=$ac_compiler_gnu
 
-fi
-echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
-ac_ext=$ac_save_ext
-ac_test_FFLAGS=${FFLAGS+set}
-ac_save_FFLAGS=$FFLAGS
-FFLAGS=
-echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
-echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_f77_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  FFLAGS=-g
-cat >conftest.$ac_ext <<_ACEOF
-      program main
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_f77_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_prog_f77_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
 
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
-echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
-if test "$ac_test_FFLAGS" = set; then
-  FFLAGS=$ac_save_FFLAGS
-elif test $ac_cv_prog_f77_g = yes; then
-  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
-    FFLAGS="-g -O2"
-  else
-    FFLAGS="-g"
-  fi
-else
-  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
-    FFLAGS="-O2"
-  else
-    FFLAGS=
-  fi
-fi
 
-G77=`test $ac_compiler_gnu = yes && echo yes`
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
 
-# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
 
-# find the maximum length of command line arguments
-echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
-echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-    i=0
-  teststring="ABCD"
 
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
 
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
 
-  cygwin* | mingw*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
 
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
 
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ 	]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
     ;;
   *)
-    # If test is not a shell built-in, we'll probably end up computing a
-    # maximum length that is only half of the actual maximum length, but
-    # we can't tell.
-    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-    while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
-	       = "XX$teststring") >/dev/null 2>&1 &&
-	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
-	    lt_cv_sys_max_cmd_len=$new_result &&
-	    test $i != 17 # 1/2 MB should be enough
-    do
-      i=`expr $i + 1`
-      teststring=$teststring$teststring
-    done
-    teststring=
-    # Add a significant safety factor because C++ compilers can tack on massive
-    # amounts of additional arguments before passing them to the linker.
-    # It appears as though 1/2 is a usable value.
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
     ;;
   esac
-
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
 fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
-echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
 else
-  echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
 fi
 
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
 
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
-echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
 
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
 
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
 
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
 
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
 
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
 
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*) # Its linker distinguishes data from code symbols
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  ;;
-linux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDGIRSTW]'
-    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+{ echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
+echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6; }
+if test "${lt_cv_path_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
   fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode$symcode*\)[ 	][ 	]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
-  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
-  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if grep ' nm_test_var$' "$nlist" >/dev/null; then
-	if grep ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
-
-	  cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[] =
-{
-EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
-	  cat <<\EOF >> conftest.$ac_ext
-  {0, (lt_ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
       fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -f conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+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_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
 done
+done
+IFS=$as_save_IFS
 
 fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
 fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { echo "$as_me:$LINENO: result: $DUMPBIN" >&5
+echo "${ECHO_T}$DUMPBIN" >&6; }
 else
-  echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6
-if test "${lt_cv_objdir+set}" = set; then
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
 else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
+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_prog_ac_ct_DUMPBIN="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
 fi
-rmdir .libs 2>/dev/null
 fi
-echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
-echo "${ECHO_T}$lt_cv_objdir" >&6
-objdir=$lt_cv_objdir
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
+echo "${ECHO_T}$ac_ct_DUMPBIN" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
 
+  test -n "$ac_ct_DUMPBIN" && break
+done
 
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
 
 
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
   fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+fi
+test -z "$NM" && NM=nm
 
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
 
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
 
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
 
-# Constants:
-rm="rm -f"
 
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_AR+set}" = set; then
+{ echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
+echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6; }
+if test "${lt_cv_nm_interface+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:18786: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:18789: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:18792: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
   fi
-done
-done
-
-fi
+  rm -f conftest*
 fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
+echo "${ECHO_T}$lt_cv_nm_interface" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6; }
 fi
 
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+# find the maximum length of command line arguments
+{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AR="ar"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
 
-  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
 fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
 fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
+echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ echo "$as_me:$LINENO: result: $xsi_shell" >&5
+echo "${ECHO_T}$xsi_shell" >&6; }
+
+
+{ echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
+echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ echo "$as_me:$LINENO: result: $lt_shell_append" >&5
+echo "${ECHO_T}$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  lt_unset=false
 fi
 
-  AR=$ac_ct_AR
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  AR="$ac_cv_prog_AR"
+  lt_cv_ld_reload_flag='-r'
 fi
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
 
 if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_RANLIB+set}" = set; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -17584,37 +19053,39 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+echo "${ECHO_T}$OBJDUMP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -17622,79 +19093,318 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
 fi
 fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+echo "${ECHO_T}$ac_ct_OBJDUMP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  RANLIB=$ac_ct_RANLIB
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
 else
-  RANLIB="$ac_cv_prog_RANLIB"
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
 fi
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
 fi
 fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+
 fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -17702,1195 +19412,708 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_STRIP="strip"
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
+IFS=$as_save_IFS
 
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
 fi
 fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-  STRIP=$ac_ct_STRIP
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
 else
-  STRIP="$ac_cv_prog_STRIP"
+  AR="$ac_cv_prog_AR"
 fi
 
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
 test -z "$AR" && AR=ar
 test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$SED" && SED=sed
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
 
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
 
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
 
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+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_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
 fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+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_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
 fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
   else
-    MAGIC_CMD=:
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
   fi
+else
+  STRIP="$ac_cv_prog_STRIP"
 fi
 
-  fi
-  ;;
-esac
+test -z "$STRIP" && STRIP=:
 
-enable_dlopen=yes
-enable_win32_dll=yes
 
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then
-  enableval="$enable_libtool_lock"
 
-fi;
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
 
-# Check whether --with-pic or --without-pic was given.
-if test "${with_pic+set}" = set; then
-  withval="$with_pic"
-  pic_mode="$withval"
-else
-  pic_mode=default
-fi;
-test -z "$pic_mode" && pic_mode=default
 
-# Use C for the default configuration in the libtool script
-tagname=
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+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_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-# Source file extension for C test sources.
-ac_ext=c
 
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+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_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}\n'
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
 
+test -z "$RANLIB" && RANLIB=:
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
 
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
 
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
 
 
-lt_prog_compiler_no_builtin_flag=
 
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18008: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:18012: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
 
-fi
 
-lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
 
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-      ;;
 
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
 
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
 
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
 
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         lt_prog_compiler_pic='-qnocommon'
-         lt_prog_compiler_wl='-Wl,'
-         ;;
-       esac
-       ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
 
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      esac
-      ;;
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
 
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
 
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
 
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
 
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+# Allow CC to be a program name with arguments.
+compiler=$CC
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works+set}" = set; then
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_prog_compiler_pic_works=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18276: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:18280: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works=yes
-     fi
-   fi
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
 
-if test x"$lt_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
 
-fi
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
 esac
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works=yes
-       fi
-     else
-       lt_prog_compiler_static_works=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
-if test x"$lt_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
 
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18380: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:18384: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
 
+  # Check to see that the pipe works correctly.
+  pipe_works=no
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
 
-  runpath_var=
-  allow_undefined_flag=
-  enable_shared_with_static_runtimes=no
-  archive_cmds=
-  archive_expsym_cmds=
-  old_archive_From_new_cmds=
-  old_archive_from_expsyms_cmds=
-  export_dynamic_flag_spec=
-  whole_archive_flag_spec=
-  thread_safe_flag_spec=
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_direct=no
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  link_all_deplibs=unknown
-  hardcode_automatic=no
-  module_cmds=
-  module_expsym_cmds=
-  always_export_symbols=no
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
 
-  ld_shlibs=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+	  cat <<_LT_EOF >> conftest.$ac_ext
 
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
       else
-  	whole_archive_flag_spec=
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
     fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
 
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<EOF 1>&2
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
+fi
 
-EOF
-      fi
-      ;;
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6; }
+else
+  { echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6; }
+fi
 
-    amigaos*)
-      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
 
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      ld_shlibs=no
-      ;;
 
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
 
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    interix3*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
 
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-	if test $supports_anon_versioning = yes; then
-	  archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
 
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<EOF 1>&2
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
 
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
 
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
 
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  hardcode_direct=yes
-	  else
-  	  # We have old collect2
-  	  hardcode_direct=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  hardcode_minus_L=yes
-  	  hardcode_libdir_flag_spec='-L$libdir'
-  	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval=$enable_libtool_lock;
+fi
 
-int
-main ()
-{
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
   ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 20013 "configure"' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
+  (exit $ac_status); }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-       hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 cat >conftest.$ac_ext <<_ACEOF
+     cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -18906,2663 +20129,1910 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  lt_cv_cc_needs_belf=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+	lt_cv_cc_needs_belf=no
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec='$convenience'
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
 	fi
-      fi
+	;;
+      esac
       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
 
-    amigaos*)
-      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs=no
-      ;;
+need_locks="$enable_libtool_lock"
 
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_From_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+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_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      archive_cmds_need_lc=no
-      hardcode_direct=no
-      hardcode_automatic=yes
-      hardcode_shlibpath_var=unsupported
-      whole_archive_flag_spec=''
-      link_all_deplibs=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs=no
-          ;;
-      esac
-    fi
-      ;;
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
+echo "${ECHO_T}$DSYMUTIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
 
-    freebsd1*)
-      ld_shlibs=no
-      ;;
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+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_prog_ac_ct_DSYMUTIL="dsymutil"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
+echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+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_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { echo "$as_me:$LINENO: result: $NMEDIT" >&5
+echo "${ECHO_T}$NMEDIT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
 
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+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_prog_ac_ct_NMEDIT="nmedit"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-	hardcode_direct=yes
-	export_dynamic_flag_spec='${wl}-E'
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
+echo "${ECHO_T}$ac_ct_NMEDIT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
 
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_LIPO+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+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_prog_LIPO="${ac_tool_prefix}lipo"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_libdir_flag_spec_ld='+b $libdir'
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  export_dynamic_flag_spec='${wl}-E'
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { echo "$as_me:$LINENO: result: $LIPO" >&5
+echo "${ECHO_T}$LIPO" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_ld='-rpath $libdir'
-      fi
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      link_all_deplibs=yes
-      ;;
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+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_prog_ac_ct_LIPO="lipo"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5
+echo "${ECHO_T}$ac_ct_LIPO" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
 
-    openbsd*)
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	   archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   hardcode_libdir_flag_spec='-R$libdir'
-	   ;;
-	 *)
-	   archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+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_prog_OTOOL="${ac_tool_prefix}otool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { echo "$as_me:$LINENO: result: $OTOOL" >&5
+echo "${ECHO_T}$OTOOL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+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_prog_ac_ct_OTOOL="otool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      hardcode_libdir_separator=:
-      ;;
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5
+echo "${ECHO_T}$ac_ct_OTOOL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    solaris*)
-      no_undefined_flag=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      link_all_deplibs=yes
-      ;;
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_OTOOL64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+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_prog_OTOOL64="${ac_tool_prefix}otool64"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { echo "$as_me:$LINENO: result: $OTOOL64" >&5
+echo "${ECHO_T}$OTOOL64" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+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_prog_ac_ct_OTOOL64="otool64"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5
+echo "${ECHO_T}$ac_ct_OTOOL64" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
 
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
 
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-  fi
 
-echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6
-test "$ld_shlibs" = no && can_build_shared=no
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl
-	pic_flag=$lt_prog_compiler_pic
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag
-        allow_undefined_flag=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc=no
-        else
-	  archive_cmds_need_lc=yes
-        fi
-        allow_undefined_flag=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
-echo "${ECHO_T}$archive_cmds_need_lc" >&6
-      ;;
-    esac
-  fi
-  ;;
-esac
 
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
 
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
 
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
 
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
 
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
 
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
 
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
 
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
 
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
 
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
+
+
+    { echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
+echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
+echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6; }
+    { echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
+echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  lt_cv_ld_exported_symbols_list=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	lt_cv_ld_exported_symbols_list=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
+echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6; }
     case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
   esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
     ;;
   esac
-  ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
 
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
+	eval "$as_ac_Header=no"
+fi
 
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
+fi
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
+done
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
 
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+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_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
+done
+done
+IFS=$as_save_IFS
 
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+    test -n "$CXX" && break
+  done
 fi
-
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
-   test -n "$runpath_var" || \
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+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_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
-if test "$hardcode_action" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
 fi
-
-striplib=
-old_striplib=
-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-   darwin*)
-       if test -n "$STRIP" ; then
-         striplib="$STRIP -x"
-         echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-       else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
 fi
-       ;;
-   *)
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-    ;;
-  esac
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
 
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
+  test -n "$ac_ct_CXX" && break
+done
 
-  mingw* | pw32*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-   ;;
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
 
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-   ;;
+  fi
+fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
 
-  darwin*)
-  # if libdl is installed we need to link against it
-    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
 int
 main ()
 {
-dlopen ();
+#ifndef __GNUC__
+       choke me
+#endif
+
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dl_dlopen=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dl_dlopen=no
+	ac_compiler_gnu=no
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
-if test $ac_cv_lib_dl_dlopen = yes; then
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-   ;;
-
-  *)
-    echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
-if test "${ac_cv_func_shl_load+set}" = set; then
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define shl_load innocuous_shl_load
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char shl_load (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef shl_load
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char shl_load ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
-choke me
-#else
-char (*f) () = shl_load;
-#endif
-#ifdef __cplusplus
-}
-#endif
 
 int
 main ()
 {
-return f != shl_load;
+
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_shl_load=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_shl_load=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6
-if test $ac_cv_func_shl_load = yes; then
-  lt_cv_dlopen="shl_load"
-else
-  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+	CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char shl_load ();
 int
 main ()
 {
-shl_load ();
+
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dld_shl_load=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_shl_load=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
-if test $ac_cv_lib_dld_shl_load = yes; then
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
-else
-  echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
-if test "${ac_cv_func_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
+	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define dlopen innocuous_dlopen
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char dlopen (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef dlopen
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
-choke me
-#else
-char (*f) () = dlopen;
-#endif
-#ifdef __cplusplus
-}
-#endif
 
 int
 main ()
 {
-return f != dlopen;
+
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_dlopen=yes
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_func_dlopen=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6
-if test $ac_cv_func_dlopen = yes; then
-  lt_cv_dlopen="dlopen"
-else
-  echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
-int
-main ()
-{
-dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dl_dlopen=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
 
-ac_cv_lib_dl_dlopen=no
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
-if test $ac_cv_lib_dl_dlopen = yes; then
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
 else
-  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dlopen ();
-int
-main ()
-{
-dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_svld_dlopen=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
 
-ac_cv_lib_svld_dlopen=no
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
-if test $ac_cv_lib_svld_dlopen = yes; then
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
 else
-  echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dld_link ();
-int
-main ()
-{
-dld_link ();
-  ;
-  return 0;
-}
+		     Syntax error
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dld_dld_link=yes
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_dld_dld_link=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
-if test $ac_cv_lib_dld_dld_link = yes; then
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+  # Broken: fails on valid input.
+continue
 fi
 
+rm -f conftest.err conftest.$ac_ext
 
-fi
-
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
 
+rm -f conftest.err conftest.$ac_ext
 
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
 fi
 
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
 
 fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-
+  # Broken: fails on valid input.
+continue
 fi
 
-    ;;
-  esac
+rm -f conftest.err conftest.$ac_ext
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
 
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
+rm -f conftest.err conftest.$ac_ext
 
-    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
 else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
 else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-#line 20725 "configure"
-#include "confdefs.h"
+  _lt_caught_CXX_error=yes
+fi
 
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
 
-#include <stdio.h>
 
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
 
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
+# Set options
+enable_dlopen=yes
 
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
 
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
 
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
 
-    exit (status);
-}
-EOF
-  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
+  enable_win32_dll=no
 
 
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
 fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self_static+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-#line 20825 "configure"
-#include "confdefs.h"
 
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
 
-#include <stdio.h>
 
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
 
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
 
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
 
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
 
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
 
-    exit (status);
-}
-EOF
-  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
     esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
+else
+  enable_static=yes
 fi
-rm -fr conftest*
 
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
-    fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
 
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
 
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
 
 
-# Report which library types will actually be built
-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
 
-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
 
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-    ;;
-esac
-echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
-
-echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
-
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler \
-    CC \
-    LD \
-    lt_prog_compiler_wl \
-    lt_prog_compiler_pic \
-    lt_prog_compiler_static \
-    lt_prog_compiler_no_builtin_flag \
-    export_dynamic_flag_spec \
-    thread_safe_flag_spec \
-    whole_archive_flag_spec \
-    enable_shared_with_static_runtimes \
-    old_archive_cmds \
-    old_archive_from_new_cmds \
-    predep_objects \
-    postdep_objects \
-    predeps \
-    postdeps \
-    compiler_lib_search_path \
-    archive_cmds \
-    archive_expsym_cmds \
-    postinstall_cmds \
-    postuninstall_cmds \
-    old_archive_from_expsyms_cmds \
-    allow_undefined_flag \
-    no_undefined_flag \
-    export_symbols_cmds \
-    hardcode_libdir_flag_spec \
-    hardcode_libdir_flag_spec_ld \
-    hardcode_libdir_separator \
-    hardcode_automatic \
-    module_cmds \
-    module_expsym_cmds \
-    lt_cv_prog_compiler_c_o \
-    exclude_expsyms \
-    include_expsyms; do
-
-    case $var in
-    old_archive_cmds | \
-    old_archive_from_new_cmds | \
-    archive_cmds | \
-    archive_expsym_cmds | \
-    module_cmds | \
-    module_expsym_cmds | \
-    old_archive_from_expsyms_cmds | \
-    export_symbols_cmds | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
 
-cfgfile="${ofile}T"
-  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
-  $rm -f "$cfgfile"
-  { echo "$as_me:$LINENO: creating $ofile" >&5
-echo "$as_me: creating $ofile" >&6;}
 
-  cat <<__EOF__ >> "$cfgfile"
-#! $SHELL
+test -z "$pic_mode" && pic_mode=default
 
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-#
-# This file is part of GNU Libtool:
-# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.
 
-# A sed program that does not truncate output.
-SED=$lt_SED
 
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="$SED -e 1s/^X//"
 
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-# The names of the tagged configurations supported by this script.
-available_tags=
 
-# ### BEGIN LIBTOOL CONFIG
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
 
-# A C compiler.
-LTCC=$lt_LTCC
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
-# A language-specific compiler.
-CC=$lt_compiler
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC
 
-# An ERE matcher.
-EGREP=$lt_EGREP
 
-# The linker used to build libraries.
-LD=$lt_LD
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
 
-# Old archive suffix (normally "a").
-libext="$libext"
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-pic_mode=$pic_mode
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
+test -z "$LN_S" && LN_S="ln -s"
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
+{ echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6; }
+if test "${lt_cv_objdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic
+# Global variables:
+ofile=libtool
+can_build_shared=yes
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
+with_gnu_ld="$lt_cv_prog_gnu_ld"
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-# ### END LIBTOOL CONFIG
 
-__EOF__
 
 
-  case $host_os in
-  aix3*)
-    cat <<\EOF >> "$cfgfile"
 
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-EOF
-    ;;
-  esac
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
 
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
 
-  mv -f "$cfgfile" "$ofile" || \
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
 
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
 else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
 fi
 
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-# Check whether --with-tags or --without-tags was given.
-if test "${with_tags+set}" = set; then
-  withval="$with_tags"
-  tagnames="$withval"
-fi;
-
-if test -f "$ltmain" && test -n "$tagnames"; then
-  if test ! -f "${ofile}"; then
-    { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
-echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+  else
+    MAGIC_CMD=:
   fi
+fi
 
-  if test -z "$LTCC"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
-    if test -z "$LTCC"; then
-      { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
-echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
-    else
-      { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
-echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
-    fi
-  fi
-  if test -z "$LTCFLAGS"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
   fi
+  ;;
+esac
 
-  # Extract list of available tagged configurations in $ofile.
-  # Note that this assumes the entire list is on one line.
-  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
-
-  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-  for tagname in $tagnames; do
-    IFS="$lt_save_ifs"
-    # Check whether tagname contains only valid characters
-    case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
-    "") ;;
-    *)  { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
-echo "$as_me: error: invalid tag name: $tagname" >&2;}
-   { (exit 1); exit 1; }; }
-	;;
-    esac
-
-    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
-    then
-      { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
-echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
-   { (exit 1); exit 1; }; }
-    fi
+# Use C for the default configuration in the libtool script
 
-    # Update the list of available tags.
-    if test -n "$tagname"; then
-      echo appending configuration tag \"$tagname\" to $ofile
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-      case $tagname in
-      CXX)
-	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-	    (test "X$CXX" != "Xg++"))) ; then
-	  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
+# Source file extension for C test sources.
+ac_ext=c
 
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
 
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
 
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_flag_spec_ld_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
 
-# Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
 
-# Source file extension for C++ test sources.
-ac_ext=cpp
 
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;\n"
 
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
 
 # If no C compiler was specified, use CC.
 LTCC=${LTCC-"$CC"}
@@ -21573,1689 +22043,542 @@ LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 # Allow CC to be a program name with arguments.
 compiler=$CC
 
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
 
 # save warnings/boilerplate of simple test code
 ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
 eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
 _lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
+$RM conftest*
 
 ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
 eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
 _lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
-
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_LD=$LD
-lt_save_GCC=$GCC
-GCC=$GXX
-lt_save_with_gnu_ld=$with_gnu_ld
-lt_save_path_LD=$lt_cv_path_LD
-if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-else
-  $as_unset lt_cv_prog_gnu_ld
-fi
-if test -n "${lt_cv_path_LDCXX+set}"; then
-  lt_cv_path_LD=$lt_cv_path_LDCXX
-else
-  $as_unset lt_cv_path_LD
-fi
-test -z "${LDCXX+set}" || LD=$LDCXX
-CC=${CXX-"c++"}
-compiler=$CC
-compiler_CXX=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+$RM -r conftest*
 
 
-# We don't want -fno-exception wen compiling C++ code, so set the
-# no_builtin_flag separately
-if test "$GXX" = yes; then
-  lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-else
-  lt_prog_compiler_no_builtin_flag_CXX=
-fi
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
 
-if test "$GXX" = yes; then
-  # Set up default GNU C++ configuration
+lt_prog_compiler_no_builtin_flag=
 
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
 
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
+  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  with_gnu_ld=no
-fi;
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
-fi
-if test "${lt_cv_path_LD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:22093: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:22097: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
 fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
+    :
 fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
-   { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${lt_cv_prog_gnu_ld+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
+
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
-with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
 
-  # Check if GNU C++ uses GNU ld as the underlying linker, since the
-  # archiving commands below assume that GNU ld is being used.
-  if test "$with_gnu_ld" = yes; then
-    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
 
-    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
 
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-    #     investigate it a little bit more. (MM)
-    wlarc='${wl}'
 
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
-	grep 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec_CXX=
-    fi
-  else
-    with_gnu_ld=no
-    wlarc=
-
-    # A generic and very simple default shared library creation
-    # command for GNU C++ for the case where it uses the native
-    # linker, instead of GNU ld.  If possible, this setting should
-    # overridden to take advantage of the native linker features on
-    # the platform it is being used on.
-    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-  fi
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
 
-  # Commands to make compiler produce verbose output that lists
-  # what "hidden" libraries, object files and flags are used when
-  # linking a shared library.
-  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
 
-else
-  GXX=no
-  with_gnu_ld=no
-  wlarc=
-fi
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
 
-# PORTME: fill in a description of your system's C++ link characteristics
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
-ld_shlibs_CXX=yes
-case $host_os in
-  aix3*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  aix4* | aix5*)
-    if test "$host_cpu" = ia64; then
-      # On IA64, the linker does run time linking by default, so we don't
-      # have to do anything special.
-      aix_use_runtimelinking=no
-      exp_sym_flag='-Bexport'
-      no_entry_flag=""
-    else
-      aix_use_runtimelinking=no
-
-      # Test if we are trying to use run time linking or normal
-      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-      # need to do runtime linking.
-      case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	for ld_flag in $LDFLAGS; do
-	  case $ld_flag in
-	  *-brtl*)
-	    aix_use_runtimelinking=yes
-	    break
-	    ;;
-	  esac
-	done
-	;;
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
       esac
+      ;;
 
-      exp_sym_flag='-bexport'
-      no_entry_flag='-bnoentry'
-    fi
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
 
-    # When large executables or shared objects are built, AIX ld can
-    # have problems creating the table of contents.  If linking a library
-    # or program results in "error TOC overflow" add -mminimal-toc to
-    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
 
-    archive_cmds_CXX=''
-    hardcode_direct_CXX=yes
-    hardcode_libdir_separator_CXX=':'
-    link_all_deplibs_CXX=yes
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
 
-    if test "$GXX" = yes; then
-      case $host_os in aix4.[012]|aix4.[012].*)
-      # We only want to do this on AIX 4.2 and lower, the check
-      # below for broken collect2 doesn't work under 4.3+
-	collect2name=`${CC} -print-prog-name=collect2`
-	if test -f "$collect2name" && \
-	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	then
-	  # We have reworked collect2
-	  hardcode_direct_CXX=yes
-	else
-	  # We have old collect2
-	  hardcode_direct_CXX=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L_CXX=yes
-	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  hardcode_libdir_separator_CXX=
-	fi
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
 	;;
       esac
-      shared_flag='-shared'
-      if test "$aix_use_runtimelinking" = yes; then
-	shared_flag="$shared_flag "'${wl}-G'
-      fi
-    else
-      # not using gcc
-      if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	shared_flag='-G'
-      else
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag='${wl}-G'
-	else
-	  shared_flag='${wl}-bM:SRE'
-	fi
-      fi
-    fi
-
-    # It seems that -bexpall does not export symbols beginning with
-    # underscore (_), so it is better to generate a list of symbols to export.
-    always_export_symbols_CXX=yes
-    if test "$aix_use_runtimelinking" = yes; then
-      # Warning - without using the other runtime loading flags (-brtl),
-      # -berok will link without error, but may produce a broken library.
-      allow_undefined_flag_CXX='-berok'
-      # Determine the default libpath from the value encoded in an empty executable.
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
+      ;;
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
 
-      hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
 
-      archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-     else
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
       if test "$host_cpu" = ia64; then
-	hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	allow_undefined_flag_CXX="-z nodefs"
-	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
       else
-	# Determine the default libpath from the value encoded in an empty executable.
-	cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
 
-int
-main ()
-{
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	# Warning - without using the other run time loading flags,
-	# -berok will link without error, but may produce a broken library.
-	no_undefined_flag_CXX=' ${wl}-bernotok'
-	allow_undefined_flag_CXX=' ${wl}-berok'
-	# Exported symbols can be pulled into shared objects from archives
-	whole_archive_flag_spec_CXX='$convenience'
-	archive_cmds_need_lc_CXX=yes
-	# This is similar to how AIX traditionally builds its shared libraries.
-	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-      fi
-    fi
-    ;;
-
-  beos*)
-    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-      allow_undefined_flag_CXX=unsupported
-      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-      # support --undefined.  This deserves some investigation.  FIXME
-      archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    else
-      ld_shlibs_CXX=no
-    fi
-    ;;
-
-  chorus*)
-    case $cc_basename in
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-
-  cygwin* | mingw* | pw32*)
-    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-    # as there is no search path for DLLs.
-    hardcode_libdir_flag_spec_CXX='-L$libdir'
-    allow_undefined_flag_CXX=unsupported
-    always_export_symbols_CXX=no
-    enable_shared_with_static_runtimes_CXX=yes
-
-    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-      archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      # If the export-symbols file already is a .def file (1st line
-      # is EXPORTS), use it as is; otherwise, prepend...
-      archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	cp $export_symbols $output_objdir/$soname.def;
-      else
-	echo EXPORTS > $output_objdir/$soname.def;
-	cat $export_symbols >> $output_objdir/$soname.def;
-      fi~
-      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-    else
-      ld_shlibs_CXX=no
-    fi
-  ;;
-      darwin* | rhapsody*)
-        case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-        esac
-      archive_cmds_need_lc_CXX=no
-      hardcode_direct_CXX=no
-      hardcode_automatic_CXX=yes
-      hardcode_shlibpath_var_CXX=unsupported
-      whole_archive_flag_spec_CXX=''
-      link_all_deplibs_CXX=yes
-
-    if test "$GXX" = yes ; then
-      lt_int_apple_cc_single_mod=no
-      output_verbose_link_cmd='echo'
-      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
-       lt_int_apple_cc_single_mod=yes
-      fi
-      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-       archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      else
-          archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-        fi
-        module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
-            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          else
-            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          fi
-            module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-          module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs_CXX=no
-          ;;
-      esac
-      fi
-        ;;
-
-  dgux*)
-    case $cc_basename in
-      ec++*)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      ghcx*)
-	# Green Hills C++ Compiler
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
 	;;
       *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
+	lt_prog_compiler_pic='+Z'
 	;;
-    esac
-    ;;
-  freebsd[12]*)
-    # C++ shared libraries reported to be fairly broken before switch to ELF
-    ld_shlibs_CXX=no
-    ;;
-  freebsd-elf*)
-    archive_cmds_need_lc_CXX=no
-    ;;
-  freebsd* | kfreebsd*-gnu | dragonfly*)
-    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-    # conventions
-    ld_shlibs_CXX=yes
-    ;;
-  gnu*)
-    ;;
-  hpux9*)
-    hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-    hardcode_libdir_separator_CXX=:
-    export_dynamic_flag_spec_CXX='${wl}-E'
-    hardcode_direct_CXX=yes
-    hardcode_minus_L_CXX=yes # Not in the search PATH,
-				# but as the default
-				# location of the library.
-
-    case $cc_basename in
-    CC*)
-      # FIXME: insert proper C++ library support
-      ld_shlibs_CXX=no
-      ;;
-    aCC*)
-      archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      #
-      # There doesn't appear to be a way to prevent this compiler from
-      # explicitly linking system object files so we need to strip them
-      # from the output so that they don't get included in the library
-      # dependencies.
-      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
       ;;
-    *)
-      if test "$GXX" = yes; then
-        archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-      fi
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
       ;;
-    esac
-    ;;
-  hpux10*|hpux11*)
-    if test $with_gnu_ld = no; then
-      hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_CXX=:
 
-      case $host_cpu in
-      hppa*64*|ia64*)
-	hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
         ;;
-      *)
-	export_dynamic_flag_spec_CXX='${wl}-E'
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
         ;;
-      esac
-    fi
-    case $host_cpu in
-    hppa*64*|ia64*)
-      hardcode_direct_CXX=no
-      hardcode_shlibpath_var_CXX=no
-      ;;
-    *)
-      hardcode_direct_CXX=yes
-      hardcode_minus_L_CXX=yes # Not in the search PATH,
-					      # but as the default
-					      # location of the library.
-      ;;
-    esac
-
-    case $cc_basename in
-      CC*)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      aCC*)
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	esac
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test $with_gnu_ld = no; then
-	    case $host_cpu in
-	    hppa*64*)
-	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    ia64*)
-	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    *)
-	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    esac
-	  fi
-	else
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	fi
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
 	;;
-    esac
-    ;;
-  interix3*)
-    hardcode_direct_CXX=no
-    hardcode_shlibpath_var_CXX=no
-    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-    export_dynamic_flag_spec_CXX='${wl}-E'
-    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-    # Instead, shared libraries are loaded at an image base (0x10000000 by
-    # default) and relocated if they conflict, which is a slow very memory
-    # consuming and fragmenting process.  To avoid this, we pick a random,
-    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-    archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    ;;
-  irix5* | irix6*)
-    case $cc_basename in
-      CC*)
-	# SGI C++
-	archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	# Archives containing C++ object files must be created using
-	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
 	;;
       *)
-	if test "$GXX" = yes; then
-	  if test "$with_gnu_ld" = no; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	  else
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
-	  fi
-	fi
-	link_all_deplibs_CXX=yes
-	;;
-    esac
-    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-    hardcode_libdir_separator_CXX=:
-    ;;
-  linux*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-
-	hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	;;
-      icpc*)
-	# Intel C++
-	with_gnu_ld=yes
-	# version 8.0 and above of icpc choke on multiply defined symbols
-	# if we add $predep_objects and $postdep_objects, however 7.1 and
-	# earlier do not add the objects themselves.
-	case `$CC -V 2>&1` in
-	*"Version 7."*)
-  	  archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-  	  archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
 	  ;;
-	*)  # Version 8.0 or newer
-	  tmp_idyn=
-	  case $host_cpu in
-	    ia64*) tmp_idyn=' -i_dynamic';;
-	  esac
-  	  archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	  archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
 	  ;;
 	esac
-	archive_cmds_need_lc_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
 	;;
-      pgCC*)
-        # Portland Group C++ compiler
-	archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-  	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-
-	hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-        ;;
-      cxx*)
-	# Compaq C++
-	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+      esac
+      ;;
 
-	runpath_var=LD_RUN_PATH
-	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	hardcode_libdir_separator_CXX=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-    esac
-    ;;
-  lynxos*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  m88k*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  mvs*)
-    case $cc_basename in
-      cxx*)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-      wlarc=
-      hardcode_libdir_flag_spec_CXX='-R$libdir'
-      hardcode_direct_CXX=yes
-      hardcode_shlibpath_var_CXX=no
-    fi
-    # Workaround some broken pre-1.5 toolchains
-    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-    ;;
-  openbsd2*)
-    # C++ shared libraries are fairly broken
-    ld_shlibs_CXX=no
-    ;;
-  openbsd*)
-    hardcode_direct_CXX=yes
-    hardcode_shlibpath_var_CXX=no
-    archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-      export_dynamic_flag_spec_CXX='${wl}-E'
-      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    fi
-    output_verbose_link_cmd='echo'
-    ;;
-  osf3*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
 
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	hardcode_libdir_separator_CXX=:
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      cxx*)
-	allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	hardcode_libdir_separator_CXX=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
       *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	  archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
 
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
-	else
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	fi
-	;;
-    esac
-    ;;
-  osf4* | osf5*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
 
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	hardcode_libdir_separator_CXX=:
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
 
-	# Archives containing C++ object files must be created using
-	# the KAI C++ compiler.
-	old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      cxx*)
-	allow_undefined_flag_CXX=' -expect_unresolved \*'
-	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	  echo "-hidden">> $lib.exp~
-	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
-	  $rm $lib.exp'
-
-	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	hardcode_libdir_separator_CXX=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
-	else
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	fi
-	;;
-    esac
-    ;;
-  psos*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
-    ;;
-  sunos4*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.x
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      lcc*)
-	# Lucid
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
     esac
-    ;;
-  solaris*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.2, 5.x and Centerline C++
-        archive_cmds_need_lc_CXX=yes
-	no_undefined_flag_CXX=' -zdefs'
-	archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	hardcode_libdir_flag_spec_CXX='-R$libdir'
-	hardcode_shlibpath_var_CXX=no
-	case $host_os in
-	  solaris2.[0-5] | solaris2.[0-5].*) ;;
-	  *)
-	    # The C++ compiler is used as linker so we must use $wl
-	    # flag to pass the commands to the underlying system
-	    # linker. We must also pass each convience library through
-	    # to the system linker between allextract/defaultextract.
-	    # The C++ compiler will combine linker options so we
-	    # cannot just pass the convience library names through
-	    # without $wl.
-	    # Supported since Solaris 2.6 (maybe 2.5.1?)
-	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
-	    ;;
-	esac
-	link_all_deplibs_CXX=yes
-
-	output_verbose_link_cmd='echo'
-
-	# Archives containing C++ object files must be created using
-	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	;;
-      gcx*)
-	# Green Hills C++ Compiler
-	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	# The C++ compiler must be used to create the archive.
-	old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	;;
-      *)
-	# GNU C++ compiler with Solaris linker
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
-	  if $CC --version | grep -v '^2\.7' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  else
-	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	    # platform.
-	    archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  fi
+  fi
 
-	  hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
-	fi
-	;;
-    esac
-    ;;
-  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-    no_undefined_flag_CXX='${wl}-z,text'
-    archive_cmds_need_lc_CXX=no
-    hardcode_shlibpath_var_CXX=no
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  sysv5* | sco3.2v5* | sco5v6*)
-    # Note: We can NOT use -z defs as we might desire, because we do not
-    # link with -lc, and that would cause any symbols used from libc to
-    # always be unresolved, which means just about no library would
-    # ever link correctly.  If we're not using GNU ld we use -z text
-    # though, which does catch some bad symbols but isn't as heavy-handed
-    # as -z defs.
-    # For security reasons, it is highly recommended that you always
-    # use absolute paths for naming shared libraries, and exclude the
-    # DT_RUNPATH tag from executables and libraries.  But doing so
-    # requires that you compile everything twice, which is a pain.
-    # So that behaviour is only enabled if SCOABSPATH is set to a
-    # non-empty value in the environment.  Most likely only useful for
-    # creating official distributions of packages.
-    # This is a hack until libtool officially supports absolute path
-    # names for shared libraries.
-    no_undefined_flag_CXX='${wl}-z,text'
-    allow_undefined_flag_CXX='${wl}-z,nodefs'
-    archive_cmds_need_lc_CXX=no
-    hardcode_shlibpath_var_CXX=no
-    hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-    hardcode_libdir_separator_CXX=':'
-    link_all_deplibs_CXX=yes
-    export_dynamic_flag_spec_CXX='${wl}-Bexport'
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  tandem*)
-    case $cc_basename in
-      NCC*)
-	# NonStop-UX NCC 3.20
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-    esac
-    ;;
-  vxworks*)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
     ;;
   *)
-    # FIXME: insert proper C++ library support
-    ld_shlibs_CXX=no
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
     ;;
 esac
-echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
-echo "${ECHO_T}$ld_shlibs_CXX" >&6
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
 
-GCC_CXX="$GXX"
-LD_CXX="$LD"
 
 
-cat > conftest.$ac_ext <<EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-EOF
 
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
 
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
 
-  # The `*' in the case matches for architectures that use `case' in
-  # $output_verbose_cmd can trigger glob expansion during the loop
-  # eval without this substitution.
-  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:22432: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:22436: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
 
-  for p in `eval $output_verbose_link_cmd`; do
-    case $p in
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6; }
 
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" \
-	  || test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
 
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
-	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
-	 fi
-       fi
-       ;;
+fi
 
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
 
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
 
-    *) ;; # Ignore the rest.
 
-    esac
-  done
 
-  # Clean up.
-  rm -f a.out a.exe
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "libtool.m4: error: problem compiling CXX test program"
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
 fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6; }
 
-$rm -f confest.$objext
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
 
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix3*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
 
-solaris*)
-  case $cc_basename in
-  CC*)
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    postdeps_CXX='-lCstd -lCrun'
-    ;;
-  esac
-  ;;
-esac
 
 
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
 
-lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
 
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
-      fi
-      ;;
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-      ;;
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | os2* | pw32*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
-      esac
-      ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix4* | aix5*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
-	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-       darwin*)
-         # PIC is the default on this platform
-         # Common symbols not allowed in MH_DYLIB files
-         case $cc_basename in
-           xlc*)
-           lt_prog_compiler_pic_CXX='-qnocommon'
-           lt_prog_compiler_wl_CXX='-Wl,'
-           ;;
-         esac
-       ;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | kfreebsd*-gnu | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux*)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  icpc* | ecpc*)
-	    # Intel C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC*)
-	    # Portland Group C++ compiler.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
-
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
-
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_pic_works_CXX=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
    # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
    lt_compile=`echo "$ac_compile" | $SED \
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:23165: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
+   (eval echo "\"\$as_me:22537: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:23169: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
+   cat out/conftest.err >&5
+   echo "$as_me:22541: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
      # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works_CXX=yes
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
      fi
    fi
-   $rm conftest*
-
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
-if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
 fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
 
-if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $rm -r conftest 2>/dev/null
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
    mkdir conftest
    cd conftest
    mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
    lt_compiler_flag="-o out/conftest2.$ac_objext"
    # Insert the option either (1) after the last *FLAGS variable, or
@@ -23266,49 +22589,51 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:23269: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:22592: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:23273: \$? = $ac_status" >&5
+   echo "$as_me:22596: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
      $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
      if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
+       lt_cv_prog_compiler_c_o=yes
      fi
    fi
    chmod u+w . 2>&5
-   $rm conftest*
+   $RM conftest*
    # SGI C++ compiler will create directory out/ii_files/ for
    # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
    cd ..
-   rmdir conftest
-   $rm conftest*
+   $RM -r conftest
+   $RM conftest*
 
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
+
+
 
 
 hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
   # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
   hard_links=yes
-  $rm conftest*
+  $RM conftest*
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   touch conftest.a
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
   if test "$hard_links" = no; then
     { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
@@ -23318,2786 +22643,1460 @@ else
   need_locks=no
 fi
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
 
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+
+
+
+
+  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
   case $host_os in
-  aix4* | aix5*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
     fi
     ;;
-  pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
-  ;;
-  cygwin* | mingw*)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
   esac
 
-echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
-echo "${ECHO_T}$ld_shlibs_CXX" >&6
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
       ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl_CXX
-	pic_flag=$lt_prog_compiler_pic_CXX
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-        allow_undefined_flag_CXX=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc_CXX=no
-        else
-	  archive_cmds_need_lc_CXX=yes
-        fi
-        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       else
-        cat conftest.err 1>&5
+	ld_shlibs=no
       fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
-echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
       ;;
-    esac
-  fi
-  ;;
-esac
 
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
 
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
 
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
+    gnu* | linux* | tpf* | k*bsd*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec=
+	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
       else
-	can_build_shared=no
+        ld_shlibs=no
       fi
       ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
 
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
 
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
       ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+	ld_shlibs=no
       fi
       ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
     esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
   else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
 
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
 	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
 
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
+int
+main ()
+{
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
+fi
 
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
+int
+main ()
+{
 
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
 
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
+fi
 
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
       ;;
-    siemens)
-      need_lib_prefix=no
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
       ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
       ;;
-  esac
-  ;;
 
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_from_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  whole_archive_flag_spec=''
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
   else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
+  ld_shlibs=no
   fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
 
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
+      ;;
 
-*)
-  dynamic_linker=no
-  ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" || \
-   test -n "$runpath_var_CXX" || \
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct_CXX" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
-echo "${ECHO_T}$hardcode_action_CXX" >&6
-
-if test "$hardcode_action_CXX" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_CXX \
-    CC_CXX \
-    LD_CXX \
-    lt_prog_compiler_wl_CXX \
-    lt_prog_compiler_pic_CXX \
-    lt_prog_compiler_static_CXX \
-    lt_prog_compiler_no_builtin_flag_CXX \
-    export_dynamic_flag_spec_CXX \
-    thread_safe_flag_spec_CXX \
-    whole_archive_flag_spec_CXX \
-    enable_shared_with_static_runtimes_CXX \
-    old_archive_cmds_CXX \
-    old_archive_from_new_cmds_CXX \
-    predep_objects_CXX \
-    postdep_objects_CXX \
-    predeps_CXX \
-    postdeps_CXX \
-    compiler_lib_search_path_CXX \
-    archive_cmds_CXX \
-    archive_expsym_cmds_CXX \
-    postinstall_cmds_CXX \
-    postuninstall_cmds_CXX \
-    old_archive_from_expsyms_cmds_CXX \
-    allow_undefined_flag_CXX \
-    no_undefined_flag_CXX \
-    export_symbols_cmds_CXX \
-    hardcode_libdir_flag_spec_CXX \
-    hardcode_libdir_flag_spec_ld_CXX \
-    hardcode_libdir_separator_CXX \
-    hardcode_automatic_CXX \
-    module_cmds_CXX \
-    module_expsym_cmds_CXX \
-    lt_cv_prog_compiler_c_o_CXX \
-    exclude_expsyms_CXX \
-    include_expsyms_CXX; do
-
-    case $var in
-    old_archive_cmds_CXX | \
-    old_archive_from_new_cmds_CXX | \
-    archive_cmds_CXX | \
-    archive_expsym_cmds_CXX | \
-    module_cmds_CXX | \
-    module_expsym_cmds_CXX | \
-    old_archive_from_expsyms_cmds_CXX | \
-    export_symbols_cmds_CXX | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
       ;;
-    esac
-  done
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
+    freebsd1*)
+      ld_shlibs=no
+      ;;
 
-cfgfile="$ofile"
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_flag_spec_ld='+b $libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        cat >conftest.$ac_ext <<_ACEOF
+int foo(void) {}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
+fi
 
-# A C compiler.
-LTCC=$lt_LTCC
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+        LDFLAGS="$save_LDFLAGS"
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-# A language-specific compiler.
-CC=$lt_compiler_CXX
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_CXX
+    *nto* | *qnx*)
+      ;;
 
-# An ERE matcher.
-EGREP=$lt_EGREP
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
-# The linker used to build libraries.
-LD=$lt_LD_CXX
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
 
-# A BSD-compatible nm program.
-NM=$lt_NM
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
 
-# A symbol stripping program
-STRIP=$lt_STRIP
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
 
-# Used on cygwin: assembler.
-AS="$AS"
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
 
-# Old archive suffix (normally "a").
-libext="$libext"
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
 
-# Executable file suffix (normally "").
-exeext="$exeext"
+    *)
+      ld_shlibs=no
+      ;;
+    esac
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-pic_mode=$pic_mode
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
+{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+with_gnu_ld=$with_gnu_ld
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_CXX
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_CXX
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_CXX
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_CXX
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_CXX
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_CXX
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_CXX
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_CXX"
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
 
-# ### END LIBTOOL TAG CONFIG: $tagname
 
-__EOF__
 
 
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
 
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-CC=$lt_save_CC
-LDCXX=$LD
-LD=$lt_save_LD
-GCC=$lt_save_GCC
-with_gnu_ldcxx=$with_gnu_ld
-with_gnu_ld=$lt_save_with_gnu_ld
-lt_cv_path_LDCXX=$lt_cv_path_LD
-lt_cv_path_LD=$lt_save_path_LD
-lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
 
-	else
-	  tagname=""
-	fi
-	;;
 
-      F77)
-	if test -n "$F77" && test "X$F77" != "Xno"; then
-
-ac_ext=f
-ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
-ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_f77_compiler_gnu
-
-
-archive_cmds_need_lc_F77=no
-allow_undefined_flag_F77=
-always_export_symbols_F77=no
-archive_expsym_cmds_F77=
-export_dynamic_flag_spec_F77=
-hardcode_direct_F77=no
-hardcode_libdir_flag_spec_F77=
-hardcode_libdir_flag_spec_ld_F77=
-hardcode_libdir_separator_F77=
-hardcode_minus_L_F77=no
-hardcode_automatic_F77=no
-module_cmds_F77=
-module_expsym_cmds_F77=
-link_all_deplibs_F77=unknown
-old_archive_cmds_F77=$old_archive_cmds
-no_undefined_flag_F77=
-whole_archive_flag_spec_F77=
-enable_shared_with_static_runtimes_F77=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-objext_F77=$objext
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
 
-# Code to be used in simple link tests
-lt_simple_link_test_code="      program t\n      end\n"
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
 
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
 
 
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${F77-"f77"}
-compiler=$CC
-compiler_F77=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
 
-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
 
-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
-test "$can_build_shared" = "no" && enable_shared=no
 
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-aix4* | aix5*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-  ;;
-esac
-echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
 
-echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
 
-GCC_F77="$G77"
-LD_F77="$LD"
 
-lt_prog_compiler_wl_F77=
-lt_prog_compiler_pic_F77=
-lt_prog_compiler_static_F77=
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl_F77='-Wl,'
-    lt_prog_compiler_static_F77='-static'
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_F77='-Bstatic'
-      fi
-      ;;
 
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
-      ;;
 
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
-      ;;
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_F77='-fno-common'
-      ;;
 
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared_F77=no
-      enable_shared=no
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_F77=-Kconform_pic
-      fi
-      ;;
 
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_F77='-fPIC'
-	;;
-      esac
-      ;;
 
-    *)
-      lt_prog_compiler_pic_F77='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_F77='-Bstatic'
-      else
-	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         lt_prog_compiler_pic_F77='-qnocommon'
-         lt_prog_compiler_wl_F77='-Wl,'
-         ;;
-       esac
-       ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
-      ;;
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_F77='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static_F77='-non_shared'
-      ;;
 
-    newsos6)
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	lt_prog_compiler_wl_F77='-Wl,'
-	lt_prog_compiler_pic_F77='-KPIC'
-	lt_prog_compiler_static_F77='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl_F77='-Wl,'
-	lt_prog_compiler_pic_F77='-fpic'
-	lt_prog_compiler_static_F77='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl_F77='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static_F77='-non_shared'
-        ;;
-      esac
-      ;;
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static_F77='-non_shared'
-      ;;
 
-    solaris*)
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl_F77='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl_F77='-Wl,';;
-      esac
-      ;;
 
-    sunos4*)
-      lt_prog_compiler_wl_F77='-Qoption ld '
-      lt_prog_compiler_pic_F77='-PIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic_F77='-Kconform_pic'
-	lt_prog_compiler_static_F77='-Bstatic'
-      fi
-      ;;
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      lt_prog_compiler_pic_F77='-KPIC'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    unicos*)
-      lt_prog_compiler_wl_F77='-Wl,'
-      lt_prog_compiler_can_build_shared_F77=no
-      ;;
 
-    uts4*)
-      lt_prog_compiler_pic_F77='-pic'
-      lt_prog_compiler_static_F77='-Bstatic'
-      ;;
 
-    *)
-      lt_prog_compiler_can_build_shared_F77=no
-      ;;
-    esac
-  fi
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_F77"; then
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_pic_works_F77=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_F77"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:24839: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:24843: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works_F77=yes
-     fi
-   fi
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
 
-if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
-    case $lt_prog_compiler_pic_F77 in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
-     esac
-else
-    lt_prog_compiler_pic_F77=
-     lt_prog_compiler_can_build_shared_F77=no
-fi
 
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_F77=
-    ;;
-  *)
-    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
-    ;;
-esac
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works_F77=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works_F77=yes
-       fi
-     else
-       lt_prog_compiler_static_works_F77=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
 
-if test x"$lt_prog_compiler_static_works_F77" = xyes; then
-    :
-else
-    lt_prog_compiler_static_F77=
-fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_c_o_F77=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:24943: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:24947: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_F77=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
 
-  runpath_var=
-  allow_undefined_flag_F77=
-  enable_shared_with_static_runtimes_F77=no
-  archive_cmds_F77=
-  archive_expsym_cmds_F77=
-  old_archive_From_new_cmds_F77=
-  old_archive_from_expsyms_cmds_F77=
-  export_dynamic_flag_spec_F77=
-  whole_archive_flag_spec_F77=
-  thread_safe_flag_spec_F77=
-  hardcode_libdir_flag_spec_F77=
-  hardcode_libdir_flag_spec_ld_F77=
-  hardcode_libdir_separator_F77=
-  hardcode_direct_F77=no
-  hardcode_minus_L_F77=no
-  hardcode_shlibpath_var_F77=unsupported
-  link_all_deplibs_F77=unknown
-  hardcode_automatic_F77=no
-  module_cmds_F77=
-  module_expsym_cmds_F77=
-  always_export_symbols_F77=no
-  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms_F77=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
 
-  ld_shlibs_F77=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
 
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec_F77='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	whole_archive_flag_spec_F77=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
 
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs_F77=no
-	cat <<EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
 
-EOF
-      fi
-      ;;
 
-    amigaos*)
-      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_minus_L_F77=yes
-
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      ld_shlibs_F77=no
-      ;;
 
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag_F77=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      allow_undefined_flag_F77=unsupported
-      always_export_symbols_F77=no
-      enable_shared_with_static_runtimes_F77=yes
-      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    interix3*)
-      hardcode_direct_F77=no
-      hardcode_shlibpath_var_F77=no
-      hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec_F77='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
 
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-	if test $supports_anon_versioning = yes; then
-	  archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
 
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	ld_shlibs_F77=no
-	cat <<EOF 1>&2
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs_F77=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    ld_shlibs_F77=no
-	  fi
-	;;
-      esac
-      ;;
 
-    sunos4*)
-      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
 
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_F77=no
-      fi
-      ;;
-    esac
 
-    if test "$ld_shlibs_F77" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec_F77=
-      export_dynamic_flag_spec_F77=
-      whole_archive_flag_spec_F77=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag_F77=unsupported
-      always_export_symbols_F77=yes
-      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L_F77=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct_F77=unsupported
-      fi
-      ;;
 
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-      archive_cmds_F77=''
-      hardcode_direct_F77=yes
-      hardcode_libdir_separator_F77=':'
-      link_all_deplibs_F77=yes
 
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  hardcode_direct_F77=yes
-	  else
-  	  # We have old collect2
-  	  hardcode_direct_F77=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  hardcode_minus_L_F77=yes
-  	  hardcode_libdir_flag_spec_F77='-L$libdir'
-  	  hardcode_libdir_separator_F77=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
 
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols_F77=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag_F77='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       cat >conftest.$ac_ext <<_ACEOF
-      program main
-
-      end
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-       hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
-	archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag_F77="-z nodefs"
-	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 cat >conftest.$ac_ext <<_ACEOF
-      program main
 
-      end
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_f77_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
 
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-	 hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag_F77=' ${wl}-bernotok'
-	  allow_undefined_flag_F77=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec_F77='$convenience'
-	  archive_cmds_need_lc_F77=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
 
-    amigaos*)
-      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_minus_L_F77=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs_F77=no
-      ;;
 
-    bsdi[45]*)
-      export_dynamic_flag_spec_F77=-rdynamic
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec_F77=' '
-      allow_undefined_flag_F77=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_From_new_cmds_F77='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes_F77=yes
-      ;;
 
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      archive_cmds_need_lc_F77=no
-      hardcode_direct_F77=no
-      hardcode_automatic_F77=yes
-      hardcode_shlibpath_var_F77=unsupported
-      whole_archive_flag_spec_F77=''
-      link_all_deplibs_F77=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs_F77=no
-          ;;
-      esac
-    fi
-      ;;
 
-    dgux*)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_shlibpath_var_F77=no
-      ;;
 
-    freebsd1*)
-      ld_shlibs_F77=no
-      ;;
 
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_F77=yes
-      hardcode_minus_L_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      hardcode_direct_F77=yes
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L_F77=yes
-      export_dynamic_flag_spec_F77='${wl}-E'
-      ;;
 
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_F77=:
 
-	hardcode_direct_F77=yes
-	export_dynamic_flag_spec_F77='${wl}-E'
+  { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
 
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L_F77=yes
-      fi
-      ;;
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
 
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_F77=:
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
 
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_libdir_flag_spec_ld_F77='+b $libdir'
-	  hardcode_direct_F77=no
-	  hardcode_shlibpath_var_F77=no
-	  ;;
-	*)
-	  hardcode_direct_F77=yes
-	  export_dynamic_flag_spec_F77='${wl}-E'
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
 
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L_F77=yes
-	  ;;
-	esac
-      fi
-      ;;
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
 
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
       else
-	archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+	can_build_shared=no
       fi
-      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      link_all_deplibs_F77=yes
       ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
 
-    newsos6)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_F77=yes
-      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      hardcode_shlibpath_var_F77=no
-      ;;
-
-    openbsd*)
-      hardcode_direct_F77=yes
-      hardcode_shlibpath_var_F77=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_F77='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	   archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   hardcode_libdir_flag_spec_F77='-R$libdir'
-	   ;;
-	 *)
-	   archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_minus_L_F77=yes
-      allow_undefined_flag_F77=unsupported
-      archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag_F77=' -expect_unresolved \*'
-	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_F77=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag_F77=' -expect_unresolved \*'
-	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec_F77='-rpath $libdir'
-      fi
-      hardcode_libdir_separator_F77=:
-      ;;
-
-    solaris*)
-      no_undefined_flag_F77=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      hardcode_libdir_flag_spec_F77='-R$libdir'
-      hardcode_shlibpath_var_F77=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      link_all_deplibs_F77=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_direct_F77=yes
-      hardcode_minus_L_F77=yes
-      hardcode_shlibpath_var_F77=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_F77=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds_F77='$CC -r -o $output$reload_objs'
-	  hardcode_direct_F77=no
-        ;;
-	motorola)
-	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var_F77=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var_F77=no
-      export_dynamic_flag_spec_F77='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var_F77=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs_F77=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      no_undefined_flag_F77='${wl}-z,text'
-      archive_cmds_need_lc_F77=no
-      hardcode_shlibpath_var_F77=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag_F77='${wl}-z,text'
-      allow_undefined_flag_F77='${wl}-z,nodefs'
-      archive_cmds_need_lc_F77=no
-      hardcode_shlibpath_var_F77=no
-      hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator_F77=':'
-      link_all_deplibs_F77=yes
-      export_dynamic_flag_spec_F77='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_F77='-L$libdir'
-      hardcode_shlibpath_var_F77=no
-      ;;
-
-    *)
-      ld_shlibs_F77=no
-      ;;
-    esac
-  fi
-
-echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
-echo "${ECHO_T}$ld_shlibs_F77" >&6
-test "$ld_shlibs_F77" = no && can_build_shared=no
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_F77" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_F77=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_F77 in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl_F77
-	pic_flag=$lt_prog_compiler_pic_F77
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_F77
-        allow_undefined_flag_F77=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc_F77=no
-        else
-	  archive_cmds_need_lc_F77=yes
-        fi
-        allow_undefined_flag_F77=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
-echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
 
 bsdi[45]*)
   version_type=linux
@@ -26113,25 +24112,28 @@ bsdi[45]*)
   # libtool to hard-code these into programs
   ;;
 
-cygwin* | mingw* | pw32*)
+cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
   shrext_cmds=".dll"
   need_version=no
   need_lib_prefix=no
 
   case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
     postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
       dlpath=$dir/\$dldll~
-       $rm \$dlpath'
+       $RM \$dlpath'
     shlibpath_overrides_runpath=yes
 
     case $host_os in
@@ -26140,20 +24142,20 @@ cygwin* | mingw* | pw32*)
       soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
       sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
       ;;
-    mingw*)
+    mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
       soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH printed by
         # mingw gcc, but we are running on Cygwin. Gcc prints its search
         # path with ; separators, and with drive letters. We can handle the
         # drive letters (cygwin fileutils understands them), so leave them,
         # especially as we might pass files found there to a mingw objdump,
         # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       fi
       ;;
     pw32*)
@@ -26177,17 +24179,13 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
   soname_spec='${libname}${release}${major}$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
   sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
   ;;
 
@@ -26204,18 +24202,6 @@ freebsd1*)
   dynamic_linker=no
   ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -26253,7 +24239,7 @@ freebsd* | dragonfly*)
     shlibpath_overrides_runpath=no
     hardcode_into_libs=yes
     ;;
-  freebsd*) # from 4.6 on
+  *) # from 4.6 on, and DragonFly
     shlibpath_overrides_runpath=yes
     hardcode_into_libs=yes
     ;;
@@ -26292,31 +24278,31 @@ hpux9* | hpux10* | hpux11*)
     fi
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
+  hppa*64*)
     shrext_cmds='.sl'
+    hardcode_into_libs=yes
     dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
     soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
   postinstall_cmds='chmod 555 $lib'
   ;;
 
-interix3*)
+interix[3-9]*)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -26371,7 +24357,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux*)
+linux* | k*bsd*-gnu)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -26380,6 +24366,60 @@ linux*)
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then
+  shlibpath_overrides_runpath=yes
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
   # This implies no fast_install, which is unacceptable.
   # Some rework will be needed to allow for fast_install
   # before this can be enabled.
@@ -26387,7 +24427,7 @@ linux*)
 
   # Append ld.so.conf contents to the search path
   if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
@@ -26400,23 +24440,11 @@ linux*)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
   need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
@@ -26437,14 +24465,16 @@ newsos6)
   shlibpath_overrides_runpath=yes
   ;;
 
-nto-qnx*)
-  version_type=linux
+*nto* | *qnx*)
+  version_type=qnx
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
   ;;
 
 openbsd*)
@@ -26453,13 +24483,13 @@ openbsd*)
   need_lib_prefix=no
   # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
   case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
   esac
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
   shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
     case $host_os in
       openbsd2.[89] | openbsd2.[89].*)
 	shlibpath_overrides_runpath=no
@@ -26493,6 +24523,10 @@ osf3* | osf4* | osf5*)
   sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
   ;;
 
+rdos*)
+  dynamic_linker=no
+  ;;
+
 solaris*)
   version_type=linux
   need_lib_prefix=no
@@ -26527,7 +24561,6 @@ sysv4 | sysv4.3*)
     sni)
       shlibpath_overrides_runpath=no
       need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
       runpath_var=LD_RUN_PATH
       ;;
     siemens)
@@ -26558,13 +24591,12 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   if test "$with_gnu_ld" = yes; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
     case $host_os in
       sco3.2v5*)
         sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
@@ -26574,6 +24606,17 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
   sys_lib_dlsearch_path_spec='/usr/lib'
   ;;
 
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
 uts4*)
   version_type=linux
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -26585,8 +24628,8 @@ uts4*)
   dynamic_linker=no
   ;;
 esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
 test "$dynamic_linker" = no && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -26594,1380 +24637,1400 @@ if test "$GCC" = yes; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action_F77=
-if test -n "$hardcode_libdir_flag_spec_F77" || \
-   test -n "$runpath_var_F77" || \
-   test "X$hardcode_automatic_F77" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct_F77" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
-     test "$hardcode_minus_L_F77" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_F77=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_F77=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_F77=unsupported
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
 fi
-echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
-echo "${ECHO_T}$hardcode_action_F77" >&6
-
-if test "$hardcode_action_F77" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
 fi
 
 
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_F77 \
-    CC_F77 \
-    LD_F77 \
-    lt_prog_compiler_wl_F77 \
-    lt_prog_compiler_pic_F77 \
-    lt_prog_compiler_static_F77 \
-    lt_prog_compiler_no_builtin_flag_F77 \
-    export_dynamic_flag_spec_F77 \
-    thread_safe_flag_spec_F77 \
-    whole_archive_flag_spec_F77 \
-    enable_shared_with_static_runtimes_F77 \
-    old_archive_cmds_F77 \
-    old_archive_from_new_cmds_F77 \
-    predep_objects_F77 \
-    postdep_objects_F77 \
-    predeps_F77 \
-    postdeps_F77 \
-    compiler_lib_search_path_F77 \
-    archive_cmds_F77 \
-    archive_expsym_cmds_F77 \
-    postinstall_cmds_F77 \
-    postuninstall_cmds_F77 \
-    old_archive_from_expsyms_cmds_F77 \
-    allow_undefined_flag_F77 \
-    no_undefined_flag_F77 \
-    export_symbols_cmds_F77 \
-    hardcode_libdir_flag_spec_F77 \
-    hardcode_libdir_flag_spec_ld_F77 \
-    hardcode_libdir_separator_F77 \
-    hardcode_automatic_F77 \
-    module_cmds_F77 \
-    module_expsym_cmds_F77 \
-    lt_cv_prog_compiler_c_o_F77 \
-    exclude_expsyms_F77 \
-    include_expsyms_F77; do
-
-    case $var in
-    old_archive_cmds_F77 | \
-    old_archive_from_new_cmds_F77 | \
-    archive_cmds_F77 | \
-    archive_expsym_cmds_F77 | \
-    module_cmds_F77 | \
-    module_expsym_cmds_F77 | \
-    old_archive_from_expsyms_cmds_F77 | \
-    export_symbols_cmds_F77 | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
-
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
 
-cfgfile="$ofile"
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_F77
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
 
-# A C compiler.
-LTCC=$lt_LTCC
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
 
-# A language-specific compiler.
-CC=$lt_compiler_F77
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_F77
 
-# An ERE matcher.
-EGREP=$lt_EGREP
 
-# The linker used to build libraries.
-LD=$lt_LD_F77
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_F77
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
 
-# Old archive suffix (normally "a").
-libext="$libext"
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_F77
-pic_mode=$pic_mode
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
 
-# Do we need a version for libraries?
-need_version=$need_version
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_F77
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_F77
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_F77
-archive_expsym_cmds=$lt_archive_expsym_cmds_F77
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_F77
-module_expsym_cmds=$lt_module_expsym_cmds_F77
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_F77
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_F77
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_F77
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_F77
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_F77
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_F77
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_F77
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_F77
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_F77
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_F77
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_F77
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_F77
+  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6; }
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_F77"
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_F77
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_F77
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_F77
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_F77
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
 
-# ### END LIBTOOL TAG CONFIG: $tagname
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
 
-__EOF__
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
 
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
 
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
-
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
-	else
-	  tagname=""
-	fi
-	;;
+  darwin*)
+  # if libdl is installed we need to link against it
+    { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-      GCJ)
-	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_cv_lib_dl_dlopen=no
+fi
 
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
 
-# Source file extension for Java test sources.
-ac_ext=java
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
 
-# Object file extension for compiled Java test sources.
-objext=o
-objext_GCJ=$objext
+fi
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}\n"
+    ;;
 
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+  *)
+    { echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; }
+if test "${ac_cv_func_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define shl_load innocuous_shl_load
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+#undef shl_load
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_shl_load || defined __stub___shl_load
+choke me
+#endif
 
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
+	ac_cv_func_shl_load=no
+fi
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6; }
+if test $ac_cv_func_shl_load = yes; then
+  lt_cv_dlopen="shl_load"
+else
+  { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dld_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${GCJ-"gcj"}
-compiler=$CC
-compiler_GCJ=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+	ac_cv_lib_dld_shl_load=no
+fi
 
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
+if test $ac_cv_lib_dld_shl_load = yes; then
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  { echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
+if test "${ac_cv_func_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define dlopen innocuous_dlopen
 
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-archive_cmds_need_lc_GCJ=no
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-old_archive_cmds_GCJ=$old_archive_cmds
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
+#undef dlopen
 
-lt_prog_compiler_no_builtin_flag_GCJ=
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_dlopen || defined __stub___dlopen
+choke me
+#endif
 
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_cv_func_dlopen=no
+fi
 
-echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
+if test $ac_cv_func_dlopen = yes; then
+  lt_cv_dlopen="dlopen"
+else
+  { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_cv_prog_compiler_rtti_exceptions=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:27146: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:27150: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $rm conftest*
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
+	ac_cv_lib_dl_dlopen=no
 fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
-    :
+  { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_svld_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_svld_dlopen=no
 fi
 
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
 fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; }
+if test $ac_cv_lib_svld_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-lt_prog_compiler_wl_GCJ=
-lt_prog_compiler_pic_GCJ=
-lt_prog_compiler_static_GCJ=
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dld_dld_link=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+	ac_cv_lib_dld_dld_link=no
+fi
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl_GCJ='-Wl,'
-    lt_prog_compiler_static_GCJ='-static'
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
+if test $ac_cv_lib_dld_dld_link = yes; then
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_GCJ='-Bstatic'
-      fi
-      ;;
 
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
-      ;;
+fi
 
-    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
-      ;;
+fi
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_GCJ='-fno-common'
-      ;;
 
-    interix3*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
+fi
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared_GCJ=no
-      enable_shared=no
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_GCJ=-Kconform_pic
-      fi
-      ;;
+fi
 
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_GCJ='-fPIC'
-	;;
-      esac
-      ;;
 
-    *)
-      lt_prog_compiler_pic_GCJ='-fPIC'
-      ;;
-    esac
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
   else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_GCJ='-Bstatic'
-      else
-	lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         lt_prog_compiler_pic_GCJ='-qnocommon'
-         lt_prog_compiler_wl_GCJ='-Wl,'
-         ;;
-       esac
-       ;;
+    enable_dlopen=no
+  fi
 
-    mingw* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
-      ;;
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_GCJ='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
-      ;;
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static_GCJ='-non_shared'
-      ;;
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
 
-    newsos6)
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
+    { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 25348 "configure"
+#include "confdefs.h"
 
-    linux*)
-      case $cc_basename in
-      icc* | ecc*)
-	lt_prog_compiler_wl_GCJ='-Wl,'
-	lt_prog_compiler_pic_GCJ='-KPIC'
-	lt_prog_compiler_static_GCJ='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl_GCJ='-Wl,'
-	lt_prog_compiler_pic_GCJ='-fpic'
-	lt_prog_compiler_static_GCJ='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl_GCJ='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static_GCJ='-non_shared'
-        ;;
-      esac
-      ;;
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static_GCJ='-non_shared'
-      ;;
+#include <stdio.h>
 
-    solaris*)
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl_GCJ='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl_GCJ='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl_GCJ='-Qoption ld '
-      lt_prog_compiler_pic_GCJ='-PIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic_GCJ='-Kconform_pic'
-	lt_prog_compiler_static_GCJ='-Bstatic'
-      fi
-      ;;
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      lt_prog_compiler_pic_GCJ='-KPIC'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
 
-    unicos*)
-      lt_prog_compiler_wl_GCJ='-Wl,'
-      lt_prog_compiler_can_build_shared_GCJ=no
-      ;;
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
 
-    uts4*)
-      lt_prog_compiler_pic_GCJ='-pic'
-      lt_prog_compiler_static_GCJ='-Bstatic'
-      ;;
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
 
-    *)
-      lt_prog_compiler_can_build_shared_GCJ=no
-      ;;
+  return status;
+}
+_LT_EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
     esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
   fi
+fi
+rm -fr conftest*
 
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_GCJ"; then
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6; }
 
-echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
-if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  lt_prog_compiler_pic_works_GCJ=no
-  ac_outfile=conftest.$ac_objext
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:27414: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:27418: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_prog_compiler_pic_works_GCJ=yes
-     fi
-   fi
-   $rm conftest*
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 25444 "configure"
+#include "confdefs.h"
 
-fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
 
-if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
-    case $lt_prog_compiler_pic_GCJ in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
-     esac
-else
-    lt_prog_compiler_pic_GCJ=
-     lt_prog_compiler_can_build_shared_GCJ=no
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
 fi
+rm -fr conftest*
+
 
 fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_GCJ=
-    ;;
-  *)
-    lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
     ;;
-esac
+  esac
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
-if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_prog_compiler_static_works_GCJ=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   printf "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_prog_compiler_static_works_GCJ=yes
-       fi
-     else
-       lt_prog_compiler_static_works_GCJ=yes
-     fi
-   fi
-   $rm conftest*
-   LDFLAGS="$save_LDFLAGS"
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
 
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
 fi
-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
-echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
 
-if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
-    :
-else
-    lt_prog_compiler_static_GCJ=
-fi
 
 
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  lt_cv_prog_compiler_c_o_GCJ=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:27518: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:27522: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_GCJ=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
 
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
-  if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
 
-echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
 
-  runpath_var=
-  allow_undefined_flag_GCJ=
-  enable_shared_with_static_runtimes_GCJ=no
-  archive_cmds_GCJ=
-  archive_expsym_cmds_GCJ=
-  old_archive_From_new_cmds_GCJ=
-  old_archive_from_expsyms_cmds_GCJ=
-  export_dynamic_flag_spec_GCJ=
-  whole_archive_flag_spec_GCJ=
-  thread_safe_flag_spec_GCJ=
-  hardcode_libdir_flag_spec_GCJ=
-  hardcode_libdir_flag_spec_ld_GCJ=
-  hardcode_libdir_separator_GCJ=
-  hardcode_direct_GCJ=no
-  hardcode_minus_L_GCJ=no
-  hardcode_shlibpath_var_GCJ=unsupported
-  link_all_deplibs_GCJ=unknown
-  hardcode_automatic_GCJ=no
-  module_cmds_GCJ=
-  module_expsym_cmds_GCJ=
-  always_export_symbols_GCJ=no
-  export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms_GCJ=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
 
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+    else
+      { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     fi
     ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
+  *)
+    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
     ;;
   esac
+fi
 
-  ld_shlibs_GCJ=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	whole_archive_flag_spec_GCJ=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs_GCJ=no
-	cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
 
-EOF
-      fi
-      ;;
 
-    amigaos*)
-      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_minus_L_GCJ=yes
-
-      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      ld_shlibs_GCJ=no
-      ;;
 
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag_GCJ=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      allow_undefined_flag_GCJ=unsupported
-      always_export_symbols_GCJ=no
-      enable_shared_with_static_runtimes_GCJ=yes
-      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
 
-    interix3*)
-      hardcode_direct_GCJ=no
-      hardcode_shlibpath_var_GCJ=no
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec_GCJ='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
 
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-	if test $supports_anon_versioning = yes; then
-	  archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
 
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	ld_shlibs_GCJ=no
-	cat <<EOF 1>&2
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
+  # Report which library types will actually be built
+  { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6; }
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs_GCJ=no
-	cat <<_LT_EOF 1>&2
+  { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
 
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    ld_shlibs_GCJ=no
-	  fi
-	;;
-      esac
-      ;;
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6; }
 
-    sunos4*)
-      archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+  { echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6; }
 
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_GCJ=no
-      fi
-      ;;
-    esac
 
-    if test "$ld_shlibs_GCJ" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec_GCJ=
-      export_dynamic_flag_spec_GCJ=
-      whole_archive_flag_spec_GCJ=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag_GCJ=unsupported
-      always_export_symbols_GCJ=yes
-      archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L_GCJ=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct_GCJ=unsupported
-      fi
-      ;;
 
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
+CC="$lt_save_CC"
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-      archive_cmds_GCJ=''
-      hardcode_direct_GCJ=yes
-      hardcode_libdir_separator_GCJ=':'
-      link_all_deplibs_GCJ=yes
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
 	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
-  	  # We have reworked collect2
-  	  hardcode_direct_GCJ=yes
+	    # We have reworked collect2
+	    :
 	  else
-  	  # We have old collect2
-  	  hardcode_direct_GCJ=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  hardcode_minus_L_GCJ=yes
-  	  hardcode_libdir_flag_spec_GCJ='-L$libdir'
-  	  hardcode_libdir_separator_GCJ=
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
 	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
+          esac
+          shared_flag='-shared'
 	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag="$shared_flag "'${wl}-G'
 	  fi
-	fi
-      fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
 
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols_GCJ=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag_GCJ='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       cat >conftest.$ac_ext <<_ACEOF
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -27983,52 +26046,59 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
 # Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-       hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
-	archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag_GCJ="-z nodefs"
-	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 cat >conftest.$ac_ext <<_ACEOF
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
@@ -28044,1048 +26114,2239 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
 # Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`; fi
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 fi
-rm -f conftest.err conftest.$ac_objext \
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 
-	 hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag_GCJ=' ${wl}-bernotok'
-	  allow_undefined_flag_GCJ=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec_GCJ='$convenience'
-	  archive_cmds_need_lc_GCJ=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_CXX='$convenience'
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
 	fi
-      fi
-      ;;
+	;;
 
-    amigaos*)
-      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_minus_L_GCJ=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs_GCJ=no
-      ;;
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
 
-    bsdi[45]*)
-      export_dynamic_flag_spec_GCJ=-rdynamic
-      ;;
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+        # as there is no search path for DLLs.
+        hardcode_libdir_flag_spec_CXX='-L$libdir'
+        allow_undefined_flag_CXX=unsupported
+        always_export_symbols_CXX=no
+        enable_shared_with_static_runtimes_CXX=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          ld_shlibs_CXX=no
+        fi
+        ;;
+      darwin* | rhapsody*)
 
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec_GCJ=' '
-      allow_undefined_flag_GCJ=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_From_new_cmds_GCJ='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes_GCJ=yes
-      ;;
 
-    darwin* | rhapsody*)
-      case $host_os in
-        rhapsody* | darwin1.[012])
-         allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
-         ;;
-       *) # Darwin 1.3 on
-         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
-           allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-         else
-           case ${MACOSX_DEPLOYMENT_TARGET} in
-             10.[012])
-               allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
-               ;;
-             10.*)
-               allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
-               ;;
-           esac
-         fi
-         ;;
-      esac
-      archive_cmds_need_lc_GCJ=no
-      hardcode_direct_GCJ=no
-      hardcode_automatic_GCJ=yes
-      hardcode_shlibpath_var_GCJ=unsupported
-      whole_archive_flag_spec_GCJ=''
-      link_all_deplibs_GCJ=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
-      module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-      archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-      module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
-         module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         ld_shlibs_GCJ=no
-          ;;
-      esac
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  whole_archive_flag_spec_CXX=''
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
     fi
-      ;;
 
-    dgux*)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_shlibpath_var_GCJ=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs_GCJ=no
-      ;;
+  else
+  ld_shlibs_CXX=no
+  fi
 
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+	;;
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_GCJ=yes
-      hardcode_minus_L_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+      freebsd[12]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      hardcode_direct_GCJ=yes
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L_GCJ=yes
-      export_dynamic_flag_spec_GCJ='${wl}-E'
-      ;;
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
 
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_GCJ=:
+      gnu*)
+        ;;
 
-	hardcode_direct_GCJ=yes
-	export_dynamic_flag_spec_GCJ='${wl}-E'
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
 
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L_GCJ=yes
-      fi
-      ;;
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
 
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_GCJ=:
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
 
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
-	  hardcode_direct_GCJ=no
-	  hardcode_shlibpath_var_GCJ=no
-	  ;;
-	*)
-	  hardcode_direct_GCJ=yes
-	  export_dynamic_flag_spec_GCJ='${wl}-E'
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
 
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L_GCJ=yes
-	  ;;
-	esac
-      fi
-      ;;
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
 
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
-      fi
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      link_all_deplibs_GCJ=yes
-      ;;
+      linux* | k*bsd*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5]* | *pgcpp\ [1-5]*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
 
-    newsos6)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_GCJ=yes
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
 
-    openbsd*)
-      hardcode_direct_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_GCJ='${wl}-E'
-      else
-       case $host_os in
-	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	   archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	   hardcode_libdir_flag_spec_GCJ='-R$libdir'
-	   ;;
-	 *)
-	   archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	   hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
-	   ;;
-       esac
-      fi
-      ;;
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
 
-    os2*)
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_minus_L_GCJ=yes
-      allow_undefined_flag_GCJ=unsupported
-      archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag_GCJ=' -expect_unresolved \*'
-	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GCJ=:
-      ;;
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag_GCJ=' -expect_unresolved \*'
-	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
 
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
-      fi
-      hardcode_libdir_separator_GCJ=:
-      ;;
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
 
-    solaris*)
-      no_undefined_flag_GCJ=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      hardcode_libdir_flag_spec_GCJ='-R$libdir'
-      hardcode_shlibpath_var_GCJ=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
- 	# The compiler driver will combine linker options so we
- 	# cannot just pass the convience library names through
- 	# without $wl, iff we do not link with $LD.
- 	# Luckily, gcc supports the same syntax we need for Sun Studio.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
- 	case $wlarc in
- 	'')
- 	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
- 	*)
- 	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
- 	esac ;;
-      esac
-      link_all_deplibs_GCJ=yes
-      ;;
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_direct_GCJ=yes
-      hardcode_minus_L_GCJ=yes
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
 
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_GCJ=yes # is this really true???
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	ld_shlibs_CXX=no
 	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds_GCJ='$CC -r -o $output$reload_objs'
-	  hardcode_direct_GCJ=no
-        ;;
-	motorola)
-	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='${wl}-E'
+	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  ld_shlibs_CXX=no
+	fi
 	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var_GCJ=no
-      ;;
 
-    sysv4.3*)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var_GCJ=no
-      export_dynamic_flag_spec_GCJ='-Bexport'
-      ;;
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var_GCJ=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs_GCJ=yes
-      fi
-      ;;
+	    hardcode_libdir_separator_CXX=:
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      no_undefined_flag_GCJ='${wl}-z,text'
-      archive_cmds_need_lc_GCJ=no
-      hardcode_shlibpath_var_GCJ=no
-      runpath_var='LD_RUN_PATH'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
 
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag_GCJ='${wl}-z,text'
-      allow_undefined_flag_GCJ='${wl}-z,nodefs'
-      archive_cmds_need_lc_GCJ=no
-      hardcode_shlibpath_var_GCJ=no
-      hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator_GCJ=':'
-      link_all_deplibs_GCJ=yes
-      export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
       ;;
 
-    uts4*)
-      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_GCJ='-L$libdir'
-      hardcode_shlibpath_var_GCJ=no
-      ;;
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='${wl}-z,text'
+	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
 
-    *)
-      ld_shlibs_GCJ=no
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
       ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
     esac
-  fi
 
-echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
-echo "${ECHO_T}$ld_shlibs_GCJ" >&6
-test "$ld_shlibs_GCJ" = no && can_build_shared=no
+    { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_GCJ" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_GCJ=yes
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_GCJ in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
-      $rm conftest*
-      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
 
-      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl_GCJ
-	pic_flag=$lt_prog_compiler_pic_GCJ
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
-        allow_undefined_flag_GCJ=
-        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
-  (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-        then
-	  archive_cmds_need_lc_GCJ=no
-        else
-	  archive_cmds_need_lc_GCJ=yes
-        fi
-        allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
-echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
-      ;;
-    esac
-  fi
-  ;;
-esac
+  (exit $ac_status); }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
 
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-if test "$GCC" = yes; then
-  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-need_lib_prefix=unknown
-hardcode_into_libs=no
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
 
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
 
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
 
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
 
-aix4* | aix5*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
+  done
 
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+$RM -f confest.$objext
 
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
   ;;
 
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
 
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
       ;;
     esac
-    ;;
 
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
     ;;
   esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
   ;;
+esac
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
-  if test "$GCC" = yes; then
-    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
-  else
-    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
-  fi
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
 
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
 
-kfreebsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
     case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
       ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  freebsd*) # from 4.6 on
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix3*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
     esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-knetbsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='GNU ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
     case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
 	;;
-      *)
-	shlibpath_overrides_runpath=yes
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
 	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; }
+
+
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:27456: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:27460: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:27555: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:27559: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:27607: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:27611: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+
+{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_CXX
+	pic_flag=$lt_prog_compiler_pic_CXX
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+        allow_undefined_flag_CXX=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_CXX=no
+        else
+	  archive_cmds_need_lc_CXX=yes
+        fi
+        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then
+  shlibpath_overrides_runpath=yes
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
   ;;
 
 solaris*)
@@ -29122,7 +28383,6 @@ sysv4 | sysv4.3*)
     sni)
       shlibpath_overrides_runpath=no
       need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
       runpath_var=LD_RUN_PATH
       ;;
     siemens)
@@ -29153,13 +28413,12 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   if test "$with_gnu_ld" = yes; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
     case $host_os in
       sco3.2v5*)
         sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
@@ -29169,3575 +28428,4620 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
   sys_lib_dlsearch_path_spec='/usr/lib'
   ;;
 
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
 
-*)
-  dynamic_linker=no
-  ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
+        ac_config_commands="$ac_config_commands libtool"
 
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
 
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action_GCJ=
-if test -n "$hardcode_libdir_flag_spec_GCJ" || \
-   test -n "$runpath_var_GCJ" || \
-   test "X$hardcode_automatic_GCJ" = "Xyes" ; then
 
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct_GCJ" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
-     test "$hardcode_minus_L_GCJ" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_GCJ=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_GCJ=immediate
-  fi
+
+# Only expand once:
+
+
+ if test x"$enable_shared" = xyes; then
+  ENABLE_SHARED_TRUE=
+  ENABLE_SHARED_FALSE='#'
 else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_GCJ=unsupported
+  ENABLE_SHARED_TRUE='#'
+  ENABLE_SHARED_FALSE=
 fi
-echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
-echo "${ECHO_T}$hardcode_action_GCJ" >&6
 
-if test "$hardcode_action_GCJ" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
+ if test x"$enable_static" = xyes; then
+  ENABLE_STATIC_TRUE=
+  ENABLE_STATIC_FALSE='#'
+else
+  ENABLE_STATIC_TRUE='#'
+  ENABLE_STATIC_FALSE=
 fi
 
 
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
+# Checks for md5sum.
+# Extract the first word of "md5sum", so it can be a program name with args.
+set dummy md5sum; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_MD5SUM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MD5SUM"; then
+  ac_cv_prog_MD5SUM="$MD5SUM" # Let the user override the test.
+else
+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_prog_MD5SUM="md5sum"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_GCJ \
-    CC_GCJ \
-    LD_GCJ \
-    lt_prog_compiler_wl_GCJ \
-    lt_prog_compiler_pic_GCJ \
-    lt_prog_compiler_static_GCJ \
-    lt_prog_compiler_no_builtin_flag_GCJ \
-    export_dynamic_flag_spec_GCJ \
-    thread_safe_flag_spec_GCJ \
-    whole_archive_flag_spec_GCJ \
-    enable_shared_with_static_runtimes_GCJ \
-    old_archive_cmds_GCJ \
-    old_archive_from_new_cmds_GCJ \
-    predep_objects_GCJ \
-    postdep_objects_GCJ \
-    predeps_GCJ \
-    postdeps_GCJ \
-    compiler_lib_search_path_GCJ \
-    archive_cmds_GCJ \
-    archive_expsym_cmds_GCJ \
-    postinstall_cmds_GCJ \
-    postuninstall_cmds_GCJ \
-    old_archive_from_expsyms_cmds_GCJ \
-    allow_undefined_flag_GCJ \
-    no_undefined_flag_GCJ \
-    export_symbols_cmds_GCJ \
-    hardcode_libdir_flag_spec_GCJ \
-    hardcode_libdir_flag_spec_ld_GCJ \
-    hardcode_libdir_separator_GCJ \
-    hardcode_automatic_GCJ \
-    module_cmds_GCJ \
-    module_expsym_cmds_GCJ \
-    lt_cv_prog_compiler_c_o_GCJ \
-    exclude_expsyms_GCJ \
-    include_expsyms_GCJ; do
-
-    case $var in
-    old_archive_cmds_GCJ | \
-    old_archive_from_new_cmds_GCJ | \
-    archive_cmds_GCJ | \
-    archive_expsym_cmds_GCJ | \
-    module_cmds_GCJ | \
-    module_expsym_cmds_GCJ | \
-    old_archive_from_expsyms_cmds_GCJ | \
-    export_symbols_cmds_GCJ | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
-
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
+done
+done
+IFS=$as_save_IFS
 
-cfgfile="$ofile"
+fi
+fi
+MD5SUM=$ac_cv_prog_MD5SUM
+if test -n "$MD5SUM"; then
+  { echo "$as_me:$LINENO: result: $MD5SUM" >&5
+echo "${ECHO_T}$MD5SUM" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+ if test x$MD5SUM = xmd5sum; then
+  HAVE_MD5SUM_TRUE=
+  HAVE_MD5SUM_FALSE='#'
+else
+  HAVE_MD5SUM_TRUE='#'
+  HAVE_MD5SUM_FALSE=
+fi
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+if test x$MD5SUM = xmd5sum
+then
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
+{ echo "$as_me:$LINENO: checking for the text md5sum command" >&5
+echo $ECHO_N "checking for the text md5sum command... $ECHO_C" >&6; }
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+  ac_cv_prog_text_md5sum='md5sum -t'
+else
+  ac_cv_prog_text_md5sum='md5sum'
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_text_md5sum" >&5
+echo "${ECHO_T}$ac_cv_prog_text_md5sum" >&6; }
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+fi
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+# Check for the GLPK library.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
+for ac_header in glpk.h glpk/glpk.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
+	ac_header_compiler=no
+fi
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
-# A C compiler.
-LTCC=$lt_LTCC
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
+  ac_header_preproc=no
+fi
 
-# A language-specific compiler.
-CC=$lt_compiler_GCJ
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_GCJ
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
-# An ERE matcher.
-EGREP=$lt_EGREP
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_glpk=yes
+fi
 
-# The linker used to build libraries.
-LD=$lt_LD_GCJ
+done
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
+ if test x$have_glpk = xyes; then
+  HAVE_GLPK_TRUE=
+  HAVE_GLPK_FALSE='#'
+else
+  HAVE_GLPK_TRUE='#'
+  HAVE_GLPK_FALSE=
+fi
 
-# A BSD-compatible nm program.
-NM=$lt_NM
+if test x$have_glpk = xyes
+then
+  ac_save_LIBS="$LIBS"
+  LIBS="$LIBS -lglpk"
+  { echo "$as_me:$LINENO: checking for lib_set_print_hook" >&5
+echo $ECHO_N "checking for lib_set_print_hook... $ECHO_C" >&6; }
+if test "${ac_cv_func_lib_set_print_hook+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define lib_set_print_hook to an innocuous variant, in case <limits.h> declares lib_set_print_hook.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define lib_set_print_hook innocuous_lib_set_print_hook
 
-# A symbol stripping program
-STRIP=$lt_STRIP
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char lib_set_print_hook (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
+#undef lib_set_print_hook
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char lib_set_print_hook ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_lib_set_print_hook || defined __stub___lib_set_print_hook
+choke me
+#endif
 
-# Used on cygwin: assembler.
-AS="$AS"
+int
+main ()
+{
+return lib_set_print_hook ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_lib_set_print_hook=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+	ac_cv_func_lib_set_print_hook=no
+fi
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_lib_set_print_hook" >&5
+echo "${ECHO_T}$ac_cv_func_lib_set_print_hook" >&6; }
+if test $ac_cv_func_lib_set_print_hook = yes; then
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_GCJ
+cat >>confdefs.h <<\_ACEOF
+#define GLPK_HAS_LIB_SET_PRINT_HOOK 1
+_ACEOF
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
+fi
 
-# Old archive suffix (normally "a").
-libext="$libext"
+  { echo "$as_me:$LINENO: checking for _glp_lib_print_hook" >&5
+echo $ECHO_N "checking for _glp_lib_print_hook... $ECHO_C" >&6; }
+if test "${ac_cv_func__glp_lib_print_hook+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define _glp_lib_print_hook to an innocuous variant, in case <limits.h> declares _glp_lib_print_hook.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define _glp_lib_print_hook innocuous__glp_lib_print_hook
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _glp_lib_print_hook (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Executable file suffix (normally "").
-exeext="$exeext"
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_GCJ
-pic_mode=$pic_mode
+#undef _glp_lib_print_hook
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _glp_lib_print_hook ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub__glp_lib_print_hook || defined __stub____glp_lib_print_hook
+choke me
+#endif
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+int
+main ()
+{
+return _glp_lib_print_hook ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func__glp_lib_print_hook=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
+	ac_cv_func__glp_lib_print_hook=no
+fi
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func__glp_lib_print_hook" >&5
+echo "${ECHO_T}$ac_cv_func__glp_lib_print_hook" >&6; }
+if test $ac_cv_func__glp_lib_print_hook = yes; then
 
-# Do we need a version for libraries?
-need_version=$need_version
+cat >>confdefs.h <<\_ACEOF
+#define GLPK_HAS__GLP_LIB_PRINT_HOOK 1
+_ACEOF
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
+fi
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
+  { echo "$as_me:$LINENO: checking for glp_term_out" >&5
+echo $ECHO_N "checking for glp_term_out... $ECHO_C" >&6; }
+if test "${ac_cv_func_glp_term_out+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define glp_term_out to an innocuous variant, in case <limits.h> declares glp_term_out.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define glp_term_out innocuous_glp_term_out
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char glp_term_out (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_GCJ
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+#undef glp_term_out
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glp_term_out ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_glp_term_out || defined __stub___glp_term_out
+choke me
+#endif
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+int
+main ()
+{
+return glp_term_out ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_glp_term_out=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+	ac_cv_func_glp_term_out=no
+fi
 
-# Library versioning type.
-version_type=$version_type
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_glp_term_out" >&5
+echo "${ECHO_T}$ac_cv_func_glp_term_out" >&6; }
+if test $ac_cv_func_glp_term_out = yes; then
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
+cat >>confdefs.h <<\_ACEOF
+#define GLPK_HAS_GLP_TERM_OUT 1
+_ACEOF
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
+fi
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
+  { echo "$as_me:$LINENO: checking for glp_term_hook" >&5
+echo $ECHO_N "checking for glp_term_hook... $ECHO_C" >&6; }
+if test "${ac_cv_func_glp_term_hook+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define glp_term_hook to an innocuous variant, in case <limits.h> declares glp_term_hook.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define glp_term_hook innocuous_glp_term_hook
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_GCJ
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char glp_term_hook (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+#undef glp_term_hook
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_GCJ
-archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glp_term_hook ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_glp_term_hook || defined __stub___glp_term_hook
+choke me
+#endif
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_GCJ
-module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+int
+main ()
+{
+return glp_term_hook ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_glp_term_hook=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
+	ac_cv_func_glp_term_hook=no
+fi
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_GCJ
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_glp_term_hook" >&5
+echo "${ECHO_T}$ac_cv_func_glp_term_hook" >&6; }
+if test $ac_cv_func_glp_term_hook = yes; then
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_GCJ
+cat >>confdefs.h <<\_ACEOF
+#define GLPK_HAS_GLP_TERM_HOOK 1
+_ACEOF
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_GCJ
+fi
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_GCJ
+  LIBS="$ac_save_LIBS"
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
+# Checks for header files.
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_GCJ
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_GCJ
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+for ac_header in fenv.h ieeefp.h getopt.h signal.h sys/resource.h sys/time.h sys/types.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
+	ac_header_compiler=no
+fi
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_GCJ
+  ac_header_preproc=no
+fi
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+fi
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_GCJ
+done
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_GCJ
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+# Checks for header declarations.
+{ echo "$as_me:$LINENO: checking whether RLIMIT_DATA is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_DATA is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_RLIMIT_DATA+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_GCJ
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_GCJ
+int
+main ()
+{
+#ifndef RLIMIT_DATA
+  (void) RLIMIT_DATA;
+#endif
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_RLIMIT_DATA=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+	ac_cv_have_decl_RLIMIT_DATA=no
+fi
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_GCJ"
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_DATA" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_DATA" >&6; }
+if test $ac_cv_have_decl_RLIMIT_DATA = yes; then
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_GCJ
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA 1
+_ACEOF
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_GCJ
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA 0
+_ACEOF
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_GCJ
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_GCJ
+fi
+{ echo "$as_me:$LINENO: checking whether RLIMIT_RSS is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_RSS is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_RLIMIT_RSS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-# ### END LIBTOOL TAG CONFIG: $tagname
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
 
-__EOF__
 
+int
+main ()
+{
+#ifndef RLIMIT_RSS
+  (void) RLIMIT_RSS;
+#endif
 
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_RLIMIT_RSS=yes
 else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
-
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-CC="$lt_save_CC"
+	ac_cv_have_decl_RLIMIT_RSS=no
+fi
 
-	else
-	  tagname=""
-	fi
-	;;
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_RSS" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_RSS" >&6; }
+if test $ac_cv_have_decl_RLIMIT_RSS = yes; then
 
-      RC)
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS 1
+_ACEOF
 
 
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS 0
+_ACEOF
 
-# Source file extension for RC test sources.
-ac_ext=rc
 
-# Object file extension for compiled RC test sources.
-objext=o
-objext_RC=$objext
+fi
+{ echo "$as_me:$LINENO: checking whether RLIMIT_VMEM is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_VMEM is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_RLIMIT_VMEM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
 
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
 
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+int
+main ()
+{
+#ifndef RLIMIT_VMEM
+  (void) RLIMIT_VMEM;
+#endif
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_RLIMIT_VMEM=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+	ac_cv_have_decl_RLIMIT_VMEM=no
+fi
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_VMEM" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_VMEM" >&6; }
+if test $ac_cv_have_decl_RLIMIT_VMEM = yes; then
 
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM 1
+_ACEOF
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
 
-ac_outfile=conftest.$ac_objext
-printf "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm conftest*
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM 0
+_ACEOF
 
 
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${RC-"windres"}
-compiler=$CC
-compiler_RC=$CC
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-lt_cv_prog_compiler_c_o_RC=yes
-
-# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    compiler_RC \
-    CC_RC \
-    LD_RC \
-    lt_prog_compiler_wl_RC \
-    lt_prog_compiler_pic_RC \
-    lt_prog_compiler_static_RC \
-    lt_prog_compiler_no_builtin_flag_RC \
-    export_dynamic_flag_spec_RC \
-    thread_safe_flag_spec_RC \
-    whole_archive_flag_spec_RC \
-    enable_shared_with_static_runtimes_RC \
-    old_archive_cmds_RC \
-    old_archive_from_new_cmds_RC \
-    predep_objects_RC \
-    postdep_objects_RC \
-    predeps_RC \
-    postdeps_RC \
-    compiler_lib_search_path_RC \
-    archive_cmds_RC \
-    archive_expsym_cmds_RC \
-    postinstall_cmds_RC \
-    postuninstall_cmds_RC \
-    old_archive_from_expsyms_cmds_RC \
-    allow_undefined_flag_RC \
-    no_undefined_flag_RC \
-    export_symbols_cmds_RC \
-    hardcode_libdir_flag_spec_RC \
-    hardcode_libdir_flag_spec_ld_RC \
-    hardcode_libdir_separator_RC \
-    hardcode_automatic_RC \
-    module_cmds_RC \
-    module_expsym_cmds_RC \
-    lt_cv_prog_compiler_c_o_RC \
-    exclude_expsyms_RC \
-    include_expsyms_RC; do
-
-    case $var in
-    old_archive_cmds_RC | \
-    old_archive_from_new_cmds_RC | \
-    archive_cmds_RC | \
-    archive_expsym_cmds_RC | \
-    module_cmds_RC | \
-    module_expsym_cmds_RC | \
-    old_archive_from_expsyms_cmds_RC | \
-    export_symbols_cmds_RC | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
+fi
+{ echo "$as_me:$LINENO: checking whether RLIMIT_AS is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_AS is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_RLIMIT_AS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-  case $lt_echo in
-  *'\$0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
 
-cfgfile="$ofile"
 
-  cat <<__EOF__ >> "$cfgfile"
-# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+int
+main ()
+{
+#ifndef RLIMIT_AS
+  (void) RLIMIT_AS;
+#endif
 
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_RLIMIT_AS=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+	ac_cv_have_decl_RLIMIT_AS=no
+fi
 
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_AS" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_AS" >&6; }
+if test $ac_cv_have_decl_RLIMIT_AS = yes; then
 
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS 1
+_ACEOF
 
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_RC
 
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS 0
+_ACEOF
 
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
 
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
+fi
 
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
 
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
 
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
+{ echo "$as_me:$LINENO: checking whether getrusage is declared" >&5
+echo $ECHO_N "checking whether getrusage is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getrusage+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-# A C compiler.
-LTCC=$lt_LTCC
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
 
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
 
-# A language-specific compiler.
-CC=$lt_compiler_RC
+int
+main ()
+{
+#ifndef getrusage
+  (void) getrusage;
+#endif
 
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC_RC
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_getrusage=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# An ERE matcher.
-EGREP=$lt_EGREP
+	ac_cv_have_decl_getrusage=no
+fi
 
-# The linker used to build libraries.
-LD=$lt_LD_RC
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getrusage" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getrusage" >&6; }
+if test $ac_cv_have_decl_getrusage = yes; then
 
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETRUSAGE 1
+_ACEOF
 
-# A BSD-compatible nm program.
-NM=$lt_NM
 
-# A symbol stripping program
-STRIP=$lt_STRIP
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETRUSAGE 0
+_ACEOF
 
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
 
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
+fi
 
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
 
-# Used on cygwin: assembler.
-AS="$AS"
 
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+# Checks for typedefs, structures, and compiler characteristics.
+{ echo "$as_me:$LINENO: checking for timeval" >&5
+echo $ECHO_N "checking for timeval... $ECHO_C" >&6; }
+if test "${ac_cv_type_timeval+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef timeval ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_timeval=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+	ac_cv_type_timeval=no
+fi
 
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_RC
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_timeval" >&5
+echo "${ECHO_T}$ac_cv_type_timeval" >&6; }
+if test $ac_cv_type_timeval = yes; then
 
-# Object file suffix (normally "o").
-objext="$ac_objext"
+cat >>confdefs.h <<_ACEOF
+#define HAVE_TIMEVAL 1
+_ACEOF
 
-# Old archive suffix (normally "a").
-libext="$libext"
 
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
+fi
 
-# Executable file suffix (normally "").
-exeext="$exeext"
 
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_RC
-pic_mode=$pic_mode
+# Checks for library functions.
+# Nothing for the time being.
 
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
+# If we are using GCC or the Intel C/C++ compiler we want to compile
+# with lots of warnings enabled.
+if test x"$GCC" = xyes
+then
+  if test x"$ICC" = xyes
+  then
+    CFLAGS="$CFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418"
+  else
+    CFLAGS="$CFLAGS -W -Wall"
+  fi
+fi
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    CXXFLAGS="$CXXFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418"
+  else
+    CXXFLAGS="$CXXFLAGS -W -Wall"
+  fi
+fi
 
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+# System-dependent adjustments.
+cygwin=no
+darwin=no
+solaris=no
+x86_64=no
+no_undefined=no
 
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
+case "${host_cpu}" in
+alpha*)
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee"
+    CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee"
+  else
+    CFLAGS="$CFLAGS -fprm d -ieee -underflow_to_zero"
+    CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
+  fi
+  ;;
+x86_64*)
+  x86_64=yes
+  ;;
+*)
+  ;;
+esac
 
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
+case "${host_os}" in
+cygwin)
+  cygwin=yes
+  no_undefined=yes
+  ;;
+darwin*)
+  darwin=yes
+  ;;
+solaris*)
+  solaris=yes
+  ;;
+*)
+  ;;
+esac
 
-# Do we need a version for libraries?
-need_version=$need_version
+ if test x$cygwin = xyes; then
+  HOST_OS_CYGWIN_TRUE=
+  HOST_OS_CYGWIN_FALSE='#'
+else
+  HOST_OS_CYGWIN_TRUE='#'
+  HOST_OS_CYGWIN_FALSE=
+fi
 
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
+ if test x$darwin = xyes; then
+  HOST_OS_DARWIN_TRUE=
+  HOST_OS_DARWIN_FALSE='#'
+else
+  HOST_OS_DARWIN_TRUE='#'
+  HOST_OS_DARWIN_FALSE=
+fi
 
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
+ if test x$solaris = xyes; then
+  HOST_OS_SOLARIS_TRUE=
+  HOST_OS_SOLARIS_FALSE='#'
+else
+  HOST_OS_SOLARIS_TRUE='#'
+  HOST_OS_SOLARIS_FALSE=
+fi
 
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
 
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_RC
+ if test x$x86_64 = xyes; then
+  HOST_CPU_X86_64_TRUE=
+  HOST_CPU_X86_64_FALSE='#'
+else
+  HOST_CPU_X86_64_TRUE='#'
+  HOST_CPU_X86_64_FALSE=
+fi
+
+
+ if test x$no_undefined = xyes; then
+  NO_UNDEFINED_TRUE=
+  NO_UNDEFINED_FALSE='#'
+else
+  NO_UNDEFINED_TRUE='#'
+  NO_UNDEFINED_FALSE=
+fi
+
 
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
 
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
 
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
 
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
 
-# Library versioning type.
-version_type=$version_type
 
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
 
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
 
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
 
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds_RC
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
 
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
 
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds_RC
-archive_expsym_cmds=$lt_archive_expsym_cmds_RC
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
+# FIXME: rename headers_sources into sources.
 
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_module_cmds_RC
-module_expsym_cmds=$lt_module_expsym_cmds_RC
 
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_predep_objects_RC
+ac_config_files="$ac_config_files Makefile ppl.lsm debian/Makefile debian/libppl.copyright debian/libppl-pwl.copyright fedora/Makefile src/Makefile src/version.hh src/ppl-config.cc tests/Makefile tests/BD_Shape/Makefile tests/Box/Makefile tests/Grid/Makefile tests/MIP_Problem/Makefile tests/Octagonal_Shape/Makefile tests/Partially_Reduced_Product/Makefile tests/Polyhedron/Makefile tests/Powerset/Makefile utils/Makefile m4/Makefile demos/Makefile demos/ppl_lcdd/Makefile demos/ppl_lcdd/exa [...]
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_postdep_objects_RC
+#               tests/Ask_Tell/Makefile
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
 
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_predeps_RC
+_ACEOF
 
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_postdeps_RC
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
 
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
 
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
+DEFS=-DHAVE_CONFIG_H
 
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_RC
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
 
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_RC
+LTLIBOBJS=$ac_ltlibobjs
 
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
 
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_JAVA_INTERFACE_TRUE}" && test -z "${BUILD_JAVA_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_JAVA_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_JAVA_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_OCAML_INTERFACE_TRUE}" && test -z "${BUILD_OCAML_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_OCAML_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_OCAML_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SOME_PROLOG_INTERFACES_TRUE}" && test -z "${BUILD_SOME_PROLOG_INTERFACES_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SOME_PROLOG_INTERFACES\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SOME_PROLOG_INTERFACES\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${THOROUGH_MAKE_CHECK_TRUE}" && test -z "${THOROUGH_MAKE_CHECK_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"THOROUGH_MAKE_CHECK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"THOROUGH_MAKE_CHECK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_CPU_X86_64_TRUE}" && test -z "${HOST_CPU_X86_64_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_CPU_X86_64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_CPU_X86_64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
 
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
 
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
 
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
 
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
+fi
 
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_RC
 
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
 
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
 
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
 
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct_RC
 
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L_RC
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
 
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
 
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$hardcode_automatic_RC
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
 
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
 
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_RC
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
 
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
 
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
 
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path_RC"
 
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols_RC
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
 
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_RC
+# CDPATH.
+$as_unset CDPATH
 
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_RC
 
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_RC
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
-# ### END LIBTOOL TAG CONFIG: $tagname
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
 
-__EOF__
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
 
 
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
 else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
+  as_dirname=false
 fi
 
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
-	;;
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
 
-      *)
-	{ { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
-echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
-   { (exit 1); exit 1; }; }
-	;;
-      esac
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
 
-      # Append the new tag name to the list of available tags.
-      if test -n "$tagname" ; then
-      available_tags="$available_tags $tagname"
-    fi
-    fi
-  done
-  IFS="$lt_save_ifs"
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
 
-  # Now substitute the updated list of available tags.
-  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
-    mv "${ofile}T" "$ofile"
-    chmod +x "$ofile"
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
   else
-    rm -f "${ofile}T"
-    { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
-echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
-   { (exit 1); exit 1; }; }
+    as_ls_L_option=
   fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
 fi
+as_executable_p=$as_test_x
 
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
 
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-# Prevent multiple expansion
-
-
-
-
-
-
-
-
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
+exec 6>&1
 
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by the Parma Polyhedra Library $as_me 0.10pre27, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
 
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
 
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
 
+_ACEOF
 
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
 
+_ACEOF
 
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
 
+Usage: $0 [OPTIONS] [FILE]...
 
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
 
+Configuration files:
+$config_files
 
+Configuration headers:
+$config_headers
 
-if test x"$enable_shared" = xyes; then
-  ENABLE_SHARED_TRUE=
-  ENABLE_SHARED_FALSE='#'
-else
-  ENABLE_SHARED_TRUE='#'
-  ENABLE_SHARED_FALSE=
-fi
+Configuration commands:
+$config_commands
 
+Report bugs to <bug-autoconf at gnu.org>."
 
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+the Parma Polyhedra Library config.status 0.10pre27
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-if test x"$enable_static" = xyes; then
-  ENABLE_STATIC_TRUE=
-  ENABLE_STATIC_FALSE='#'
-else
-  ENABLE_STATIC_TRUE='#'
-  ENABLE_STATIC_FALSE=
-fi
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
 
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+_ACEOF
 
-# Checks for md5sum.
-# Extract the first word of "md5sum", so it can be a program name with args.
-set dummy md5sum; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_MD5SUM+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$MD5SUM"; then
-  ac_cv_prog_MD5SUM="$MD5SUM" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_MD5SUM="md5sum"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-MD5SUM=$ac_cv_prog_MD5SUM
-if test -n "$MD5SUM"; then
-  echo "$as_me:$LINENO: result: $MD5SUM" >&5
-echo "${ECHO_T}$MD5SUM" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
 
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
 
-if test x$MD5SUM = xmd5sum; then
-  HAVE_MD5SUM_TRUE=
-  HAVE_MD5SUM_FALSE='#'
-else
-  HAVE_MD5SUM_TRUE='#'
-  HAVE_MD5SUM_FALSE=
-fi
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
 
-if test x$MD5SUM = xmd5sum
-then
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
 
-echo "$as_me:$LINENO: checking for the text md5sum command" >&5
-echo $ECHO_N "checking for the text md5sum command... $ECHO_C" >&6
-if echo a | (md5sum -t) >/dev/null 2>&1
-then
-  ac_cv_prog_text_md5sum='md5sum -t'
-else
-  ac_cv_prog_text_md5sum='md5sum'
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_text_md5sum" >&5
-echo "${ECHO_T}$ac_cv_prog_text_md5sum" >&6
-TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+  esac
+  shift
+done
 
+ac_configure_extra_args=
 
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
 fi
 
-# Check for the GLPK library.
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-if test "${ac_cv_header_glpk_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for glpk.h" >&5
-echo $ECHO_N "checking for glpk.h... $ECHO_C" >&6
-if test "${ac_cv_header_glpk_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_glpk_h" >&5
-echo "${ECHO_T}$ac_cv_header_glpk_h" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking glpk.h usability" >&5
-echo $ECHO_N "checking glpk.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <glpk.h>
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking glpk.h presence" >&5
-echo $ECHO_N "checking glpk.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
 _ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <glpk.h>
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+PACKAGE="$PACKAGE"
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
 
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
 
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: glpk.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: glpk.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: glpk.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: glpk.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: glpk.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: glpk.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: glpk.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: glpk.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: glpk.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: glpk.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: glpk.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: glpk.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: glpk.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: glpk.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: glpk.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: glpk.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to ppl-devel at cs.unipr.it ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
+enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
+host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
+host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
+host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
+build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
+build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
+build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
+SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
+Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
+GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
+EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
+FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
+LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
+NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
+LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
+exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
+AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
+GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
+SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
+ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
+need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
+LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
+libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
+version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
+striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`'
+predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`'
+postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+SHELL \
+ECHO \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_flag_spec_ld_CXX \
+hardcode_libdir_separator_CXX \
+fix_srcfile_path_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
+  ;;
 esac
-echo "$as_me:$LINENO: checking for glpk.h" >&5
-echo $ECHO_N "checking for glpk.h... $ECHO_C" >&6
-if test "${ac_cv_header_glpk_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_header_glpk_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_glpk_h" >&5
-echo "${ECHO_T}$ac_cv_header_glpk_h" >&6
 
-fi
-if test $ac_cv_header_glpk_h = yes; then
-  HAVE_GLPK_H=yes
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
 fi
 
 
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
 
 
-if test x$HAVE_GLPK_H = xyes; then
-  HAVE_GLPK_TRUE=
-  HAVE_GLPK_FALSE='#'
-else
-  HAVE_GLPK_TRUE='#'
-  HAVE_GLPK_FALSE=
-fi
 
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-# Checks for header files.
 
+_ACEOF
 
+cat >>$CONFIG_STATUS <<\_ACEOF
 
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "$PACKAGE-config.h") CONFIG_COMMANDS="$CONFIG_COMMANDS $PACKAGE-config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "ppl.lsm") CONFIG_FILES="$CONFIG_FILES ppl.lsm" ;;
+    "debian/Makefile") CONFIG_FILES="$CONFIG_FILES debian/Makefile" ;;
+    "debian/libppl.copyright") CONFIG_FILES="$CONFIG_FILES debian/libppl.copyright" ;;
+    "debian/libppl-pwl.copyright") CONFIG_FILES="$CONFIG_FILES debian/libppl-pwl.copyright" ;;
+    "fedora/Makefile") CONFIG_FILES="$CONFIG_FILES fedora/Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "src/version.hh") CONFIG_FILES="$CONFIG_FILES src/version.hh" ;;
+    "src/ppl-config.cc") CONFIG_FILES="$CONFIG_FILES src/ppl-config.cc" ;;
+    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+    "tests/BD_Shape/Makefile") CONFIG_FILES="$CONFIG_FILES tests/BD_Shape/Makefile" ;;
+    "tests/Box/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Box/Makefile" ;;
+    "tests/Grid/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Grid/Makefile" ;;
+    "tests/MIP_Problem/Makefile") CONFIG_FILES="$CONFIG_FILES tests/MIP_Problem/Makefile" ;;
+    "tests/Octagonal_Shape/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Octagonal_Shape/Makefile" ;;
+    "tests/Partially_Reduced_Product/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Partially_Reduced_Product/Makefile" ;;
+    "tests/Polyhedron/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;;
+    "tests/Powerset/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Powerset/Makefile" ;;
+    "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "demos/Makefile") CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;;
+    "demos/ppl_lcdd/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/Makefile" ;;
+    "demos/ppl_lcdd/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/examples/Makefile" ;;
+    "demos/ppl_lpsol/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/Makefile" ;;
+    "demos/ppl_lpsol/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/examples/Makefile" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "doc/user.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;;
+    "doc/devref.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;;
+    "doc/user.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;;
+    "doc/devref.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;;
+    "doc/user-c-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user-c-interface.doxyconf-latex" ;;
+    "doc/devref-c-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref-c-interface.doxyconf-latex" ;;
+    "doc/user-c-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user-c-interface.doxyconf-html" ;;
+    "doc/devref-c-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref-c-interface.doxyconf-html" ;;
+    "doc/user-prolog-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user-prolog-interface.doxyconf-latex" ;;
+    "doc/devref-prolog-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref-prolog-interface.doxyconf-latex" ;;
+    "doc/user-prolog-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user-prolog-interface.doxyconf-html" ;;
+    "doc/devref-prolog-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref-prolog-interface.doxyconf-html" ;;
+    "doc/user-ocaml-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user-ocaml-interface.doxyconf-html" ;;
+    "doc/user-ocaml-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user-ocaml-interface.doxyconf-latex" ;;
+    "doc/devref-ocaml-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref-ocaml-interface.doxyconf-html" ;;
+    "doc/devref-ocaml-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref-ocaml-interface.doxyconf-latex" ;;
+    "doc/user-java-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user-java-interface.doxyconf-html" ;;
+    "doc/user-java-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user-java-interface.doxyconf-latex" ;;
+    "doc/devref-java-interface.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref-java-interface.doxyconf-html" ;;
+    "doc/devref-java-interface.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref-java-interface.doxyconf-latex" ;;
+    "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
+    "interfaces/C/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/C/Makefile" ;;
+    "interfaces/C/ppl_c_version.h") CONFIG_FILES="$CONFIG_FILES interfaces/C/ppl_c_version.h" ;;
+    "interfaces/Java/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/Makefile" ;;
+    "interfaces/Java/jni/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/jni/Makefile" ;;
+    "interfaces/Java/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/tests/Makefile" ;;
+    "interfaces/Java/ppl_java/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/ppl_java/Makefile" ;;
+    "interfaces/OCaml/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/OCaml/Makefile" ;;
+    "interfaces/OCaml/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/OCaml/tests/Makefile" ;;
+    "interfaces/Prolog/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Makefile" ;;
+    "interfaces/Prolog/Ciao/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Ciao/Makefile" ;;
+    "interfaces/Prolog/GNU/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/GNU/Makefile" ;;
+    "interfaces/Prolog/SICStus/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SICStus/Makefile" ;;
+    "interfaces/Prolog/SWI/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SWI/Makefile" ;;
+    "interfaces/Prolog/XSB/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/XSB/Makefile" ;;
+    "interfaces/Prolog/YAP/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/YAP/Makefile" ;;
+    "interfaces/Prolog/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/tests/Makefile" ;;
 
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
 
 
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
 
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
 
-for ac_header in fenv.h ieeefp.h getopt.h signal.h sys/resource.h sys/time.h sys/types.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+PPL_VERSION_MAJOR!$PPL_VERSION_MAJOR$ac_delim
+PPL_VERSION_MINOR!$PPL_VERSION_MINOR$ac_delim
+PPL_VERSION_REVISION!$PPL_VERSION_REVISION$ac_delim
+PPL_VERSION_BETA!$PPL_VERSION_BETA$ac_delim
+CONFIGURE_OPTIONS!$CONFIGURE_OPTIONS$ac_delim
+ISODATE!$ISODATE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+CXX!$CXX$ac_delim
+CXXFLAGS!$CXXFLAGS$ac_delim
+ac_ct_CXX!$ac_ct_CXX$ac_delim
+CXXDEPMODE!$CXXDEPMODE$ac_delim
+am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim
+am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
 
-ac_header_compiler=no
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
 fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
 
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_cxx_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+CXXCPP!$CXXCPP$ac_delim
+ASSERTIONS_ENABLED_TRUE!$ASSERTIONS_ENABLED_TRUE$ac_delim
+ASSERTIONS_ENABLED_FALSE!$ASSERTIONS_ENABLED_FALSE$ac_delim
+USE_PRECOMPILED_HEADERS_TRUE!$USE_PRECOMPILED_HEADERS_TRUE$ac_delim
+USE_PRECOMPILED_HEADERS_FALSE!$USE_PRECOMPILED_HEADERS_FALSE$ac_delim
+USE_NATIVE_INTEGERS_TRUE!$USE_NATIVE_INTEGERS_TRUE$ac_delim
+USE_NATIVE_INTEGERS_FALSE!$USE_NATIVE_INTEGERS_FALSE$ac_delim
+USE_CHECKED_INTEGERS_TRUE!$USE_CHECKED_INTEGERS_TRUE$ac_delim
+USE_CHECKED_INTEGERS_FALSE!$USE_CHECKED_INTEGERS_FALSE$ac_delim
+USE_GMP_INTEGERS_TRUE!$USE_GMP_INTEGERS_TRUE$ac_delim
+USE_GMP_INTEGERS_FALSE!$USE_GMP_INTEGERS_FALSE$ac_delim
+USE_INT8_TRUE!$USE_INT8_TRUE$ac_delim
+USE_INT8_FALSE!$USE_INT8_FALSE$ac_delim
+USE_INT16_TRUE!$USE_INT16_TRUE$ac_delim
+USE_INT16_FALSE!$USE_INT16_FALSE$ac_delim
+USE_INT32_TRUE!$USE_INT32_TRUE$ac_delim
+USE_INT32_FALSE!$USE_INT32_FALSE$ac_delim
+USE_INT64_TRUE!$USE_INT64_TRUE$ac_delim
+USE_INT64_FALSE!$USE_INT64_FALSE$ac_delim
+PERL!$PERL$ac_delim
+HAVE_PERL_TRUE!$HAVE_PERL_TRUE$ac_delim
+HAVE_PERL_FALSE!$HAVE_PERL_FALSE$ac_delim
+CPP!$CPP$ac_delim
+CAN_CONTROL_FPU_TRUE!$CAN_CONTROL_FPU_TRUE$ac_delim
+CAN_CONTROL_FPU_FALSE!$CAN_CONTROL_FPU_FALSE$ac_delim
+SUPPORTED_FLOAT_TRUE!$SUPPORTED_FLOAT_TRUE$ac_delim
+SUPPORTED_FLOAT_FALSE!$SUPPORTED_FLOAT_FALSE$ac_delim
+SUPPORTED_DOUBLE_TRUE!$SUPPORTED_DOUBLE_TRUE$ac_delim
+SUPPORTED_DOUBLE_FALSE!$SUPPORTED_DOUBLE_FALSE$ac_delim
+SUPPORTED_LONG_DOUBLE_TRUE!$SUPPORTED_LONG_DOUBLE_TRUE$ac_delim
+SUPPORTED_LONG_DOUBLE_FALSE!$SUPPORTED_LONG_DOUBLE_FALSE$ac_delim
+LIBGMP!$LIBGMP$ac_delim
+LTLIBGMP!$LTLIBGMP$ac_delim
+LIBGMP_PREFIX!$LIBGMP_PREFIX$ac_delim
+LIBGMPXX!$LIBGMPXX$ac_delim
+LTLIBGMPXX!$LTLIBGMPXX$ac_delim
+LIBGMPXX_PREFIX!$LIBGMPXX_PREFIX$ac_delim
+BUILD_WATCHDOG_LIBRARY_TRUE!$BUILD_WATCHDOG_LIBRARY_TRUE$ac_delim
+BUILD_WATCHDOG_LIBRARY_FALSE!$BUILD_WATCHDOG_LIBRARY_FALSE$ac_delim
+subdirs!$subdirs$ac_delim
+BUILD_C_INTERFACE_TRUE!$BUILD_C_INTERFACE_TRUE$ac_delim
+BUILD_C_INTERFACE_FALSE!$BUILD_C_INTERFACE_FALSE$ac_delim
+JAVAC!$JAVAC$ac_delim
+JAVA!$JAVA$ac_delim
+uudecode!$uudecode$ac_delim
+JAR!$JAR$ac_delim
+JAVAH!$JAVAH$ac_delim
+JNIFLAGS!$JNIFLAGS$ac_delim
+BUILD_JAVA_INTERFACE_TRUE!$BUILD_JAVA_INTERFACE_TRUE$ac_delim
+BUILD_JAVA_INTERFACE_FALSE!$BUILD_JAVA_INTERFACE_FALSE$ac_delim
+OCAMLC!$OCAMLC$ac_delim
+BUILD_OCAML_INTERFACE_TRUE!$BUILD_OCAML_INTERFACE_TRUE$ac_delim
+BUILD_OCAML_INTERFACE_FALSE!$BUILD_OCAML_INTERFACE_FALSE$ac_delim
+ciao_prolog!$ciao_prolog$ac_delim
+CIAO_PROLOG!$CIAO_PROLOG$ac_delim
+CIAO_PROLOG_INCLUDE_OPTIONS!$CIAO_PROLOG_INCLUDE_OPTIONS$ac_delim
+BUILD_CIAO_PROLOG_INTERFACE_TRUE!$BUILD_CIAO_PROLOG_INTERFACE_TRUE$ac_delim
+BUILD_CIAO_PROLOG_INTERFACE_FALSE!$BUILD_CIAO_PROLOG_INTERFACE_FALSE$ac_delim
+GNU_PROLOG!$GNU_PROLOG$ac_delim
+BUILD_GNU_PROLOG_INTERFACE_TRUE!$BUILD_GNU_PROLOG_INTERFACE_TRUE$ac_delim
+BUILD_GNU_PROLOG_INTERFACE_FALSE!$BUILD_GNU_PROLOG_INTERFACE_FALSE$ac_delim
+sicstus_prolog!$sicstus_prolog$ac_delim
+SICSTUS_PROLOG_INCLUDE_OPTIONS!$SICSTUS_PROLOG_INCLUDE_OPTIONS$ac_delim
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE!$BUILD_SICSTUS_PROLOG_INTERFACE_TRUE$ac_delim
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE!$BUILD_SICSTUS_PROLOG_INTERFACE_FALSE$ac_delim
+swi_prolog!$swi_prolog$ac_delim
+SWI_PROLOG!$SWI_PROLOG$ac_delim
+SWI_PROLOG_INCLUDE_OPTIONS!$SWI_PROLOG_INCLUDE_OPTIONS$ac_delim
+SWI_PROLOG_LD_OPTIONS!$SWI_PROLOG_LD_OPTIONS$ac_delim
+BUILD_SWI_PROLOG_INTERFACE_TRUE!$BUILD_SWI_PROLOG_INTERFACE_TRUE$ac_delim
+BUILD_SWI_PROLOG_INTERFACE_FALSE!$BUILD_SWI_PROLOG_INTERFACE_FALSE$ac_delim
+xsb_prolog!$xsb_prolog$ac_delim
+XSB_PROLOG_INCLUDE_OPTIONS!$XSB_PROLOG_INCLUDE_OPTIONS$ac_delim
+BUILD_XSB_PROLOG_INTERFACE_TRUE!$BUILD_XSB_PROLOG_INTERFACE_TRUE$ac_delim
+BUILD_XSB_PROLOG_INTERFACE_FALSE!$BUILD_XSB_PROLOG_INTERFACE_FALSE$ac_delim
+YAP_PROLOG!$YAP_PROLOG$ac_delim
+BUILD_YAP_PROLOG_INTERFACE_TRUE!$BUILD_YAP_PROLOG_INTERFACE_TRUE$ac_delim
+BUILD_YAP_PROLOG_INTERFACE_FALSE!$BUILD_YAP_PROLOG_INTERFACE_FALSE$ac_delim
+BUILD_SOME_PROLOG_INTERFACES_TRUE!$BUILD_SOME_PROLOG_INTERFACES_TRUE$ac_delim
+BUILD_SOME_PROLOG_INTERFACES_FALSE!$BUILD_SOME_PROLOG_INTERFACES_FALSE$ac_delim
+THOROUGH_MAKE_CHECK_TRUE!$THOROUGH_MAKE_CHECK_TRUE$ac_delim
+THOROUGH_MAKE_CHECK_FALSE!$THOROUGH_MAKE_CHECK_FALSE$ac_delim
+LIBTOOL!$LIBTOOL$ac_delim
+SED!$SED$ac_delim
+FGREP!$FGREP$ac_delim
+LD!$LD$ac_delim
+DUMPBIN!$DUMPBIN$ac_delim
+ac_ct_DUMPBIN!$ac_ct_DUMPBIN$ac_delim
+NM!$NM$ac_delim
+LN_S!$LN_S$ac_delim
+OBJDUMP!$OBJDUMP$ac_delim
+AR!$AR$ac_delim
+RANLIB!$RANLIB$ac_delim
+lt_ECHO!$lt_ECHO$ac_delim
+DSYMUTIL!$DSYMUTIL$ac_delim
+NMEDIT!$NMEDIT$ac_delim
+LIPO!$LIPO$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
   else
-    ac_cpp_err=
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+done
 
-  ac_header_preproc=no
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
 fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
 
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ------------------------------------ ##
-## Report this to ppl-devel at cs.unipr.it ##
-## ------------------------------------ ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+OTOOL!$OTOOL$ac_delim
+OTOOL64!$OTOOL64$ac_delim
+ENABLE_SHARED_TRUE!$ENABLE_SHARED_TRUE$ac_delim
+ENABLE_SHARED_FALSE!$ENABLE_SHARED_FALSE$ac_delim
+ENABLE_STATIC_TRUE!$ENABLE_STATIC_TRUE$ac_delim
+ENABLE_STATIC_FALSE!$ENABLE_STATIC_FALSE$ac_delim
+MD5SUM!$MD5SUM$ac_delim
+HAVE_MD5SUM_TRUE!$HAVE_MD5SUM_TRUE$ac_delim
+HAVE_MD5SUM_FALSE!$HAVE_MD5SUM_FALSE$ac_delim
+TEXT_MD5SUM!$TEXT_MD5SUM$ac_delim
+HAVE_GLPK_TRUE!$HAVE_GLPK_TRUE$ac_delim
+HAVE_GLPK_FALSE!$HAVE_GLPK_FALSE$ac_delim
+HOST_OS_CYGWIN_TRUE!$HOST_OS_CYGWIN_TRUE$ac_delim
+HOST_OS_CYGWIN_FALSE!$HOST_OS_CYGWIN_FALSE$ac_delim
+HOST_OS_DARWIN_TRUE!$HOST_OS_DARWIN_TRUE$ac_delim
+HOST_OS_DARWIN_FALSE!$HOST_OS_DARWIN_FALSE$ac_delim
+HOST_OS_SOLARIS_TRUE!$HOST_OS_SOLARIS_TRUE$ac_delim
+HOST_OS_SOLARIS_FALSE!$HOST_OS_SOLARIS_FALSE$ac_delim
+HOST_CPU_X86_64_TRUE!$HOST_CPU_X86_64_TRUE$ac_delim
+HOST_CPU_X86_64_FALSE!$HOST_CPU_X86_64_FALSE$ac_delim
+NO_UNDEFINED_TRUE!$NO_UNDEFINED_TRUE$ac_delim
+NO_UNDEFINED_FALSE!$NO_UNDEFINED_FALSE$ac_delim
+extra_includes!$extra_includes$ac_delim
+extra_libraries!$extra_libraries$ac_delim
+debug_flag!$debug_flag$ac_delim
+coefficient_mnemonic!$coefficient_mnemonic$ac_delim
+required_instantiations!$required_instantiations$ac_delim
+required_instantiations_canonical_names!$required_instantiations_canonical_names$ac_delim
+required_instantiations_prolog_cxx_headers!$required_instantiations_prolog_cxx_headers$ac_delim
+required_instantiations_prolog_cxx_sources!$required_instantiations_prolog_cxx_sources$ac_delim
+required_instantiations_prolog_cxx_objects!$required_instantiations_prolog_cxx_objects$ac_delim
+required_instantiations_java_sources!$required_instantiations_java_sources$ac_delim
+required_instantiations_java_cxx_headers!$required_instantiations_java_cxx_headers$ac_delim
+required_instantiations_java_cxx_headers_sources!$required_instantiations_java_cxx_headers_sources$ac_delim
+ocamlc_root!$ocamlc_root$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 37; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
 
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
 fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-3.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
 _ACEOF
 
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
 fi
 
-done
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
 
 
-# Checks for header declarations.
-echo "$as_me:$LINENO: checking whether RLIMIT_DATA is declared" >&5
-echo $ECHO_N "checking whether RLIMIT_DATA is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_RLIMIT_DATA+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
 
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
 
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
 
-int
-main ()
-{
-#ifndef RLIMIT_DATA
-  char *p = (char *) RLIMIT_DATA;
-#endif
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
 
-  ;
-  return 0;
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
 }
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
 _ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_RLIMIT_DATA=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_RLIMIT_DATA=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_DATA" >&5
-echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_DATA" >&6
-if test $ac_cv_have_decl_RLIMIT_DATA = yes; then
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_DATA 1
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" | sed -f "$tmp/subs-3.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
 _ACEOF
 
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
 
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_DATA 0
-_ACEOF
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_arg=$ac_file
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
 
 
+  case $ac_file$ac_mode in
+    "$PACKAGE-config.h":C) ac_prefix_conf_OUT=`echo $PACKAGE-config.h`
+ac_prefix_conf_DEF=`echo _$ac_prefix_conf_OUT | sed -e "y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:" -e "s/[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g"`
+ac_prefix_conf_PKG=`echo $PACKAGE`
+ac_prefix_conf_LOW=`echo _$ac_prefix_conf_PKG | sed -e "y:ABCDEFGHIJKLMNOPQRSTUVWXYZ-:abcdefghijklmnopqrstuvwxyz_:"`
+ac_prefix_conf_UPP=`echo $ac_prefix_conf_PKG | sed -e "y:abcdefghijklmnopqrstuvwxyz-:ABCDEFGHIJKLMNOPQRSTUVWXYZ_:"  -e "/^[0123456789]/s/^/_/"`
+ac_prefix_conf_INP=`echo "" | sed -e 's/ *//'`
+if test ".$ac_prefix_conf_INP" = "."; then
+   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
+     case "$ac_file" in
+        *.h) ac_prefix_conf_INP=$ac_file ;;
+        *)
+     esac
+     test ".$ac_prefix_conf_INP" != "." && break
+   done
 fi
-echo "$as_me:$LINENO: checking whether RLIMIT_RSS is declared" >&5
-echo $ECHO_N "checking whether RLIMIT_RSS is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_RLIMIT_RSS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+if test ".$ac_prefix_conf_INP" = "."; then
+   case "$ac_prefix_conf_OUT" in
+      */*) ac_prefix_conf_INP=`basename "$ac_prefix_conf_OUT"`
+      ;;
+      *-*) ac_prefix_conf_INP=`echo "$ac_prefix_conf_OUT" | sed -e "s/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*-//"`
+      ;;
+      *) ac_prefix_conf_INP=config.h
+      ;;
+   esac
+fi
+if test -z "$ac_prefix_conf_PKG" ; then
+   { { echo "$as_me:$LINENO: error: no prefix for _PREFIX_PKG_CONFIG_H" >&5
+echo "$as_me: error: no prefix for _PREFIX_PKG_CONFIG_H" >&2;}
+   { (exit 1); exit 1; }; }
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+  if test ! -f "$ac_prefix_conf_INP" ; then if test -f "$srcdir/$ac_prefix_conf_INP" ; then
+     ac_prefix_conf_INP="$srcdir/$ac_prefix_conf_INP"
+  fi fi
+  { echo "$as_me:$LINENO: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&5
+echo "$as_me: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&6;}
+  if test -f $ac_prefix_conf_INP ; then
+    echo "s/^#undef  *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_]\\)/#undef $ac_prefix_conf_UPP""_\\1/" > conftest.prefix
+    echo "s/^#undef  *\\([abcdefghijklmnopqrstuvwxyz]\\)/#undef $ac_prefix_conf_LOW""_\\1/" >> conftest.prefix
+    echo "s/^#define  *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_UPP""_\\1 \\" >> conftest.prefix
+    echo "#define $ac_prefix_conf_UPP""_\\1 \\2 \\" >> conftest.prefix
+    echo "#endif/" >>conftest.prefix
+    echo "s/^#define  *\\([abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_LOW""_\\1 \\" >> conftest.prefix
+    echo "#define $ac_prefix_conf_LOW""_\\1 \\2 \\" >> conftest.prefix
+    echo "#endif/" >> conftest.prefix
+    # now executing _script on _DEF input to create _OUT output file
+    echo "#ifndef $ac_prefix_conf_DEF"      >$tmp/pconfig.h
+    echo "#define $ac_prefix_conf_DEF 1" >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo /'*' $ac_prefix_conf_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
+
+    sed -f conftest.prefix $ac_prefix_conf_INP >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo '/* once:' $ac_prefix_conf_DEF '*/' >>$tmp/pconfig.h
+    echo "#endif" >>$tmp/pconfig.h
+    if cmp -s $ac_prefix_conf_OUT $tmp/pconfig.h 2>/dev/null; then
+      { echo "$as_me:$LINENO: $ac_prefix_conf_OUT is unchanged" >&5
+echo "$as_me: $ac_prefix_conf_OUT is unchanged" >&6;}
+    else
+      ac_dir=`$as_dirname -- "$ac_prefix_conf_OUT" ||
+$as_expr X"$ac_prefix_conf_OUT" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_prefix_conf_OUT" : 'X\(//\)[^/]' \| \
+	 X"$ac_prefix_conf_OUT" : 'X\(//\)$' \| \
+	 X"$ac_prefix_conf_OUT" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_prefix_conf_OUT" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+      rm -f "$ac_prefix_conf_OUT"
+      mv $tmp/pconfig.h "$ac_prefix_conf_OUT"
+    fi
+    cp conftest.prefix _configs.sed
+  else
+    { { echo "$as_me:$LINENO: error: input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" >&5
+echo "$as_me: error: input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  rm -f conftest.*
+fi
+ ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+    "libtool":C)
 
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
 
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
 
-int
-main ()
-{
-#ifndef RLIMIT_RSS
-  char *p = (char *) RLIMIT_RSS;
-#endif
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_RLIMIT_RSS=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
-ac_cv_have_decl_RLIMIT_RSS=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_RSS" >&5
-echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_RSS" >&6
-if test $ac_cv_have_decl_RLIMIT_RSS = yes; then
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_RSS 1
-_ACEOF
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
 
+# ### BEGIN LIBTOOL CONFIG
 
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_RSS 0
-_ACEOF
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
 
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
 
-fi
-echo "$as_me:$LINENO: checking whether RLIMIT_VMEM is declared" >&5
-echo $ECHO_N "checking whether RLIMIT_VMEM is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_RLIMIT_VMEM+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
 
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
+# What type of objects to build.
+pic_mode=$pic_mode
 
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
 
-int
-main ()
-{
-#ifndef RLIMIT_VMEM
-  char *p = (char *) RLIMIT_VMEM;
-#endif
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_RLIMIT_VMEM=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+# A grep program that handles long lines.
+GREP=$lt_GREP
 
-ac_cv_have_decl_RLIMIT_VMEM=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_VMEM" >&5
-echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_VMEM" >&6
-if test $ac_cv_have_decl_RLIMIT_VMEM = yes; then
+# An ERE matcher.
+EGREP=$lt_EGREP
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_VMEM 1
-_ACEOF
+# A literal string matcher.
+FGREP=$lt_FGREP
 
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
 
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_VMEM 0
-_ACEOF
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
 
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
 
-fi
-echo "$as_me:$LINENO: checking whether RLIMIT_AS is declared" >&5
-echo $ECHO_N "checking whether RLIMIT_AS is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_RLIMIT_AS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
+# Object file suffix (normally "o").
+objext=$ac_objext
 
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
+# Executable file suffix (normally "").
+exeext=$exeext
 
+# whether the shell understands "unset".
+lt_unset=$lt_unset
 
-int
-main ()
-{
-#ifndef RLIMIT_AS
-  char *p = (char *) RLIMIT_AS;
-#endif
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
 
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_RLIMIT_AS=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
 
-ac_cv_have_decl_RLIMIT_AS=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_AS" >&5
-echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_AS" >&6
-if test $ac_cv_have_decl_RLIMIT_AS = yes; then
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_AS 1
-_ACEOF
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
 
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
 
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_RLIMIT_AS 0
-_ACEOF
+# Command to use when deplibs_check_method == "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
 
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
 
-fi
+# A symbol stripping program.
+STRIP=$lt_STRIP
 
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
 
+# A C compiler.
+LTCC=$lt_CC
 
-# Checks for typedefs, structures, and compiler characteristics.
-# Nothing for the time being.
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
 
-# Checks for library functions.
-# Nothing for the time being.
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 
-# If we are using GCC we want to compile with warnings enabled.
-if test x"$GCC" = xyes
-then
-  CFLAGS="-W -Wall $CFLAGS"
-fi
-if test x"$GXX" = xyes
-then
-  CXXFLAGS="-W -Wall $CXXFLAGS"
-fi
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
-# System-dependent adjustments.
-cygwin=no
-darwin=no
-solaris=no
-no_undefined=no
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
-case "${host_cpu}" in
-alpha*)
-  if test x"$GCC" = xyes
-  then
-    CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee"
-    CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee"
-  else
-    CFLAGS="$CFLAGS -fprm d -ieee -underflow_to_zero"
-    CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
-  fi
-  ;;
-*)
-  ;;
-esac
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
-case "${host_os}" in
-cygwin)
-  cygwin=yes
-  no_undefined=yes
-  ;;
-darwin*)
-  darwin=yes
-  if test x"$GCC" = xyes
-  then
-    CFLAGS="$CFLAGS -Wno-long-double"
-    CXXFLAGS="$CXXFLAGS -Wno-long-double"
-  fi
-  ;;
-solaris*)
-  solaris=yes
-  ;;
-*)
-  ;;
-esac
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
 
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
 
+# An echo program that does not interpret backslashes.
+ECHO=$lt_ECHO
 
-if test x$cygwin = xyes; then
-  HOST_OS_CYGWIN_TRUE=
-  HOST_OS_CYGWIN_FALSE='#'
-else
-  HOST_OS_CYGWIN_TRUE='#'
-  HOST_OS_CYGWIN_FALSE=
-fi
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
 
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
 
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
 
-if test x$darwin = xyes; then
-  HOST_OS_DARWIN_TRUE=
-  HOST_OS_DARWIN_FALSE='#'
-else
-  HOST_OS_DARWIN_TRUE='#'
-  HOST_OS_DARWIN_FALSE=
-fi
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
 
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
 
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
 
-if test x$solaris = xyes; then
-  HOST_OS_SOLARIS_TRUE=
-  HOST_OS_SOLARIS_FALSE='#'
-else
-  HOST_OS_SOLARIS_TRUE='#'
-  HOST_OS_SOLARIS_FALSE=
-fi
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
 
+# Old archive suffix (normally "a").
+libext=$libext
 
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
 
-if test x$no_undefined = xyes; then
-  NO_UNDEFINED_TRUE=
-  NO_UNDEFINED_FALSE='#'
-else
-  NO_UNDEFINED_TRUE='#'
-  NO_UNDEFINED_FALSE=
-fi
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
 
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
 
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
 
+# Do we need a version for libraries?
+need_version=$need_version
 
+# Library versioning type.
+version_type=$version_type
 
+# Shared library runtime path variable.
+runpath_var=$runpath_var
 
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
 
-                                                                                                                                                                                                                                                                                                                                                                        ac_config_files="$ac_config_files Makefile ppl.lsm ppl.spec debian/Makefile debian/libppl.copyright debian/libppl-pwl.copyright src/ [...]
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
 
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
 
-_ACEOF
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
 
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
-  (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-} |
-  sed '
-     t clear
-     : clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
-    cat confcache >$cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
 
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
 
-DEFS=-DHAVE_CONFIG_H
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
 
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
 
-LTLIBOBJS=$ac_ltlibobjs
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
 
-if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_GMP_INTEGERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_GMP_INTEGERS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_INT8\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_INT8\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_INT16\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_INT16\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_INT32\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_INT32\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"USE_INT64\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"USE_INT64\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"CAN_CONTROL_FPU\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"CAN_CONTROL_FPU\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_FLOAT\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"SUPPORTED_FLOAT\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_C_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_C_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_SHARED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"ENABLE_SHARED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_STATIC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"ENABLE_STATIC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HAVE_MD5SUM\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HAVE_MD5SUM\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HAVE_GLPK\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HAVE_GLPK\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_CYGWIN\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HOST_OS_CYGWIN\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_DARWIN\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HOST_OS_DARWIN\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_SOLARIS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HOST_OS_SOLARIS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
 
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
 
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
 
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
+# The linker used to build libraries.
+LD=$lt_LD
 
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
 
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
+# A language specific compiler.
+CC=$lt_compiler
 
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
 
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
 
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
 
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
 
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
 
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
 
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
 
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
 
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
 
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
 
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
 
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
 
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
 
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
 
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
 
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
 fi
+_LT_EOF
+    ;;
+  esac
 
-as_executable_p="test -f"
 
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
 
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+  case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
 
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
 
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
 
-# CDPATH.
-$as_unset CDPATH
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
 
-exec 6>&1
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
 
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
+# func_opt_split
+func_opt_split ()
 {
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
 
-This file was extended by the Parma Polyhedra Library $as_me 0.9, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
 
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
 
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
 
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
 
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
 
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
 
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
 
-cat >>$CONFIG_STATUS <<\_ACEOF
 
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
 
-Usage: $0 [OPTIONS] [FILE]...
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
 
-  -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
 
-Configuration files:
-$config_files
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
 
-Configuration headers:
-$config_headers
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
+}
 
-Configuration commands:
-$config_commands
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$@"`
+}
 
-Report bugs to <bug-autoconf at gnu.org>."
-_ACEOF
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
 
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-the Parma Polyhedra Library config.status 0.9
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+_LT_EOF
+esac
 
-Copyright (C) 2003 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
-_ACEOF
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    ac_shift=:
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+_LT_EOF
     ;;
-  -*)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1=\$$1\$2"
+}
+
+_LT_EOF
     ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
   esac
 
-  case $ac_option in
-  # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
 
-  # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; } ;;
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
 
-  *) ac_config_targets="$ac_config_targets $1" ;;
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
 
-  esac
-  shift
-done
 
-ac_configure_extra_args=
+    cat <<_LT_EOF >> "$ofile"
 
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
 
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
+# The linker used to build libraries.
+LD=$lt_LD_CXX
 
-_ACEOF
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
 
-cat >>$CONFIG_STATUS <<_ACEOF
-#
-# INIT-COMMANDS section.
-#
+# A language specific compiler.
+CC=$lt_compiler_CXX
 
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
 
-_ACEOF
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
 
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
 
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "ppl.lsm" ) CONFIG_FILES="$CONFIG_FILES ppl.lsm" ;;
-  "ppl.spec" ) CONFIG_FILES="$CONFIG_FILES ppl.spec" ;;
-  "debian/Makefile" ) CONFIG_FILES="$CONFIG_FILES debian/Makefile" ;;
-  "debian/libppl.copyright" ) CONFIG_FILES="$CONFIG_FILES debian/libppl.copyright" ;;
-  "debian/libppl-pwl.copyright" ) CONFIG_FILES="$CONFIG_FILES debian/libppl-pwl.copyright" ;;
-  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
-  "src/version.hh" ) CONFIG_FILES="$CONFIG_FILES src/version.hh" ;;
-  "src/ppl-config.cc" ) CONFIG_FILES="$CONFIG_FILES src/ppl-config.cc" ;;
-  "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
-  "tests/BD_Shape/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/BD_Shape/Makefile" ;;
-  "tests/Polyhedron/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;;
-  "tests/Grid/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Grid/Makefile" ;;
-  "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
-  "m4/Makefile" ) CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
-  "demos/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;;
-  "demos/ppl_lcdd/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/Makefile" ;;
-  "demos/ppl_lcdd/examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/examples/Makefile" ;;
-  "demos/ppl_lpsol/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/Makefile" ;;
-  "demos/ppl_lpsol/examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/examples/Makefile" ;;
-  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-  "doc/user.doxyconf-latex" ) CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;;
-  "doc/devref.doxyconf-latex" ) CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;;
-  "doc/user.doxyconf-html" ) CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;;
-  "doc/devref.doxyconf-html" ) CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;;
-  "interfaces/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
-  "interfaces/C/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/C/Makefile" ;;
-  "interfaces/C/ppl_c.h" ) CONFIG_FILES="$CONFIG_FILES interfaces/C/ppl_c.h" ;;
-  "interfaces/Prolog/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Makefile" ;;
-  "interfaces/Prolog/Ciao/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Ciao/Makefile" ;;
-  "interfaces/Prolog/GNU/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/GNU/Makefile" ;;
-  "interfaces/Prolog/SICStus/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SICStus/Makefile" ;;
-  "interfaces/Prolog/SWI/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SWI/Makefile" ;;
-  "interfaces/Prolog/XSB/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/XSB/Makefile" ;;
-  "interfaces/Prolog/YAP/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/YAP/Makefile" ;;
-  "interfaces/Prolog/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/tests/Makefile" ;;
-  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
 
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
 
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
 
-# Create a (secure) tmp directory for tmp files.
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
 
-{
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
 
-_ACEOF
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
 
-cat >>$CONFIG_STATUS <<_ACEOF
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
 
-#
-# CONFIG_FILES section.
-#
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
 
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s, at SHELL@,$SHELL,;t t
-s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s, at exec_prefix@,$exec_prefix,;t t
-s, at prefix@,$prefix,;t t
-s, at program_transform_name@,$program_transform_name,;t t
-s, at bindir@,$bindir,;t t
-s, at sbindir@,$sbindir,;t t
-s, at libexecdir@,$libexecdir,;t t
-s, at datadir@,$datadir,;t t
-s, at sysconfdir@,$sysconfdir,;t t
-s, at sharedstatedir@,$sharedstatedir,;t t
-s, at localstatedir@,$localstatedir,;t t
-s, at libdir@,$libdir,;t t
-s, at includedir@,$includedir,;t t
-s, at oldincludedir@,$oldincludedir,;t t
-s, at infodir@,$infodir,;t t
-s, at mandir@,$mandir,;t t
-s, at build_alias@,$build_alias,;t t
-s, at host_alias@,$host_alias,;t t
-s, at target_alias@,$target_alias,;t t
-s, at DEFS@,$DEFS,;t t
-s, at ECHO_C@,$ECHO_C,;t t
-s, at ECHO_N@,$ECHO_N,;t t
-s, at ECHO_T@,$ECHO_T,;t t
-s, at LIBS@,$LIBS,;t t
-s, at INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s, at INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s, at INSTALL_DATA@,$INSTALL_DATA,;t t
-s, at CYGPATH_W@,$CYGPATH_W,;t t
-s, at PACKAGE@,$PACKAGE,;t t
-s, at VERSION@,$VERSION,;t t
-s, at ACLOCAL@,$ACLOCAL,;t t
-s, at AUTOCONF@,$AUTOCONF,;t t
-s, at AUTOMAKE@,$AUTOMAKE,;t t
-s, at AUTOHEADER@,$AUTOHEADER,;t t
-s, at MAKEINFO@,$MAKEINFO,;t t
-s, at install_sh@,$install_sh,;t t
-s, at STRIP@,$STRIP,;t t
-s, at ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s, at INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
-s, at mkdir_p@,$mkdir_p,;t t
-s, at AWK@,$AWK,;t t
-s, at SET_MAKE@,$SET_MAKE,;t t
-s, at am__leading_dot@,$am__leading_dot,;t t
-s, at AMTAR@,$AMTAR,;t t
-s, at am__tar@,$am__tar,;t t
-s, at am__untar@,$am__untar,;t t
-s, at PPL_VERSION_MAJOR@,$PPL_VERSION_MAJOR,;t t
-s, at PPL_VERSION_MINOR@,$PPL_VERSION_MINOR,;t t
-s, at PPL_VERSION_REVISION@,$PPL_VERSION_REVISION,;t t
-s, at PPL_VERSION_BETA@,$PPL_VERSION_BETA,;t t
-s, at PPL_CONFIGURE_OPTIONS@,$PPL_CONFIGURE_OPTIONS,;t t
-s, at docdir@,$docdir,;t t
-s, at ISODATE@,$ISODATE,;t t
-s, at build@,$build,;t t
-s, at build_cpu@,$build_cpu,;t t
-s, at build_vendor@,$build_vendor,;t t
-s, at build_os@,$build_os,;t t
-s, at host@,$host,;t t
-s, at host_cpu@,$host_cpu,;t t
-s, at host_vendor@,$host_vendor,;t t
-s, at host_os@,$host_os,;t t
-s, at ASSERTIONS_ENABLED_TRUE@,$ASSERTIONS_ENABLED_TRUE,;t t
-s, at ASSERTIONS_ENABLED_FALSE@,$ASSERTIONS_ENABLED_FALSE,;t t
-s, at USE_PRECOMPILED_HEADERS_TRUE@,$USE_PRECOMPILED_HEADERS_TRUE,;t t
-s, at USE_PRECOMPILED_HEADERS_FALSE@,$USE_PRECOMPILED_HEADERS_FALSE,;t t
-s, at USE_NATIVE_INTEGERS_TRUE@,$USE_NATIVE_INTEGERS_TRUE,;t t
-s, at USE_NATIVE_INTEGERS_FALSE@,$USE_NATIVE_INTEGERS_FALSE,;t t
-s, at USE_CHECKED_INTEGERS_TRUE@,$USE_CHECKED_INTEGERS_TRUE,;t t
-s, at USE_CHECKED_INTEGERS_FALSE@,$USE_CHECKED_INTEGERS_FALSE,;t t
-s, at USE_GMP_INTEGERS_TRUE@,$USE_GMP_INTEGERS_TRUE,;t t
-s, at USE_GMP_INTEGERS_FALSE@,$USE_GMP_INTEGERS_FALSE,;t t
-s, at USE_INT8_TRUE@,$USE_INT8_TRUE,;t t
-s, at USE_INT8_FALSE@,$USE_INT8_FALSE,;t t
-s, at USE_INT16_TRUE@,$USE_INT16_TRUE,;t t
-s, at USE_INT16_FALSE@,$USE_INT16_FALSE,;t t
-s, at USE_INT32_TRUE@,$USE_INT32_TRUE,;t t
-s, at USE_INT32_FALSE@,$USE_INT32_FALSE,;t t
-s, at USE_INT64_TRUE@,$USE_INT64_TRUE,;t t
-s, at USE_INT64_FALSE@,$USE_INT64_FALSE,;t t
-s, at EGREP@,$EGREP,;t t
-s, at CC@,$CC,;t t
-s, at CFLAGS@,$CFLAGS,;t t
-s, at LDFLAGS@,$LDFLAGS,;t t
-s, at CPPFLAGS@,$CPPFLAGS,;t t
-s, at ac_ct_CC@,$ac_ct_CC,;t t
-s, at EXEEXT@,$EXEEXT,;t t
-s, at OBJEXT@,$OBJEXT,;t t
-s, at DEPDIR@,$DEPDIR,;t t
-s, at am__include@,$am__include,;t t
-s, at am__quote@,$am__quote,;t t
-s, at AMDEP_TRUE@,$AMDEP_TRUE,;t t
-s, at AMDEP_FALSE@,$AMDEP_FALSE,;t t
-s, at AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
-s, at CCDEPMODE@,$CCDEPMODE,;t t
-s, at am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
-s, at am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
-s, at CXX@,$CXX,;t t
-s, at CXXFLAGS@,$CXXFLAGS,;t t
-s, at ac_ct_CXX@,$ac_ct_CXX,;t t
-s, at CXXDEPMODE@,$CXXDEPMODE,;t t
-s, at am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
-s, at am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
-s, at CXXCPP@,$CXXCPP,;t t
-s, at PERL@,$PERL,;t t
-s, at HAVE_PERL_TRUE@,$HAVE_PERL_TRUE,;t t
-s, at HAVE_PERL_FALSE@,$HAVE_PERL_FALSE,;t t
-s, at CPP@,$CPP,;t t
-s, at CAN_CONTROL_FPU_TRUE@,$CAN_CONTROL_FPU_TRUE,;t t
-s, at CAN_CONTROL_FPU_FALSE@,$CAN_CONTROL_FPU_FALSE,;t t
-s, at SUPPORTED_FLOAT_TRUE@,$SUPPORTED_FLOAT_TRUE,;t t
-s, at SUPPORTED_FLOAT_FALSE@,$SUPPORTED_FLOAT_FALSE,;t t
-s, at SUPPORTED_DOUBLE_TRUE@,$SUPPORTED_DOUBLE_TRUE,;t t
-s, at SUPPORTED_DOUBLE_FALSE@,$SUPPORTED_DOUBLE_FALSE,;t t
-s, at SUPPORTED_LONG_DOUBLE_TRUE@,$SUPPORTED_LONG_DOUBLE_TRUE,;t t
-s, at SUPPORTED_LONG_DOUBLE_FALSE@,$SUPPORTED_LONG_DOUBLE_FALSE,;t t
-s, at LIBGMP@,$LIBGMP,;t t
-s, at LTLIBGMP@,$LTLIBGMP,;t t
-s, at LIBGMPXX@,$LIBGMPXX,;t t
-s, at LTLIBGMPXX@,$LTLIBGMPXX,;t t
-s, at BUILD_WATCHDOG_LIBRARY_TRUE@,$BUILD_WATCHDOG_LIBRARY_TRUE,;t t
-s, at BUILD_WATCHDOG_LIBRARY_FALSE@,$BUILD_WATCHDOG_LIBRARY_FALSE,;t t
-s, at subdirs@,$subdirs,;t t
-s, at BUILD_C_INTERFACE_TRUE@,$BUILD_C_INTERFACE_TRUE,;t t
-s, at BUILD_C_INTERFACE_FALSE@,$BUILD_C_INTERFACE_FALSE,;t t
-s, at CIAO_PROLOG@,$CIAO_PROLOG,;t t
-s, at BUILD_CIAO_PROLOG_INTERFACE_TRUE@,$BUILD_CIAO_PROLOG_INTERFACE_TRUE,;t t
-s, at BUILD_CIAO_PROLOG_INTERFACE_FALSE@,$BUILD_CIAO_PROLOG_INTERFACE_FALSE,;t t
-s, at GNU_PROLOG@,$GNU_PROLOG,;t t
-s, at BUILD_GNU_PROLOG_INTERFACE_TRUE@,$BUILD_GNU_PROLOG_INTERFACE_TRUE,;t t
-s, at BUILD_GNU_PROLOG_INTERFACE_FALSE@,$BUILD_GNU_PROLOG_INTERFACE_FALSE,;t t
-s, at sicstus_prolog@,$sicstus_prolog,;t t
-s, at SICSTUS_PROLOG_INCLUDE_OPTIONS@,$SICSTUS_PROLOG_INCLUDE_OPTIONS,;t t
-s, at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@,$BUILD_SICSTUS_PROLOG_INTERFACE_TRUE,;t t
-s, at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@,$BUILD_SICSTUS_PROLOG_INTERFACE_FALSE,;t t
-s, at swi_prolog@,$swi_prolog,;t t
-s, at SWI_PROLOG_INCLUDE_OPTIONS@,$SWI_PROLOG_INCLUDE_OPTIONS,;t t
-s, at BUILD_SWI_PROLOG_INTERFACE_TRUE@,$BUILD_SWI_PROLOG_INTERFACE_TRUE,;t t
-s, at BUILD_SWI_PROLOG_INTERFACE_FALSE@,$BUILD_SWI_PROLOG_INTERFACE_FALSE,;t t
-s, at xsb_prolog@,$xsb_prolog,;t t
-s, at XSB_PROLOG_INCLUDE_OPTIONS@,$XSB_PROLOG_INCLUDE_OPTIONS,;t t
-s, at BUILD_XSB_PROLOG_INTERFACE_TRUE@,$BUILD_XSB_PROLOG_INTERFACE_TRUE,;t t
-s, at BUILD_XSB_PROLOG_INTERFACE_FALSE@,$BUILD_XSB_PROLOG_INTERFACE_FALSE,;t t
-s, at YAP_PROLOG@,$YAP_PROLOG,;t t
-s, at BUILD_YAP_PROLOG_INTERFACE_TRUE@,$BUILD_YAP_PROLOG_INTERFACE_TRUE,;t t
-s, at BUILD_YAP_PROLOG_INTERFACE_FALSE@,$BUILD_YAP_PROLOG_INTERFACE_FALSE,;t t
-s, at LN_S@,$LN_S,;t t
-s, at ECHO@,$ECHO,;t t
-s, at AR@,$AR,;t t
-s, at ac_ct_AR@,$ac_ct_AR,;t t
-s, at RANLIB@,$RANLIB,;t t
-s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s, at DLLTOOL@,$DLLTOOL,;t t
-s, at ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t
-s, at AS@,$AS,;t t
-s, at ac_ct_AS@,$ac_ct_AS,;t t
-s, at OBJDUMP@,$OBJDUMP,;t t
-s, at ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t
-s, at F77@,$F77,;t t
-s, at FFLAGS@,$FFLAGS,;t t
-s, at ac_ct_F77@,$ac_ct_F77,;t t
-s, at LIBTOOL@,$LIBTOOL,;t t
-s, at ENABLE_SHARED_TRUE@,$ENABLE_SHARED_TRUE,;t t
-s, at ENABLE_SHARED_FALSE@,$ENABLE_SHARED_FALSE,;t t
-s, at ENABLE_STATIC_TRUE@,$ENABLE_STATIC_TRUE,;t t
-s, at ENABLE_STATIC_FALSE@,$ENABLE_STATIC_FALSE,;t t
-s, at MD5SUM@,$MD5SUM,;t t
-s, at HAVE_MD5SUM_TRUE@,$HAVE_MD5SUM_TRUE,;t t
-s, at HAVE_MD5SUM_FALSE@,$HAVE_MD5SUM_FALSE,;t t
-s, at TEXT_MD5SUM@,$TEXT_MD5SUM,;t t
-s, at HAVE_GLPK_TRUE@,$HAVE_GLPK_TRUE,;t t
-s, at HAVE_GLPK_FALSE@,$HAVE_GLPK_FALSE,;t t
-s, at HOST_OS_CYGWIN_TRUE@,$HOST_OS_CYGWIN_TRUE,;t t
-s, at HOST_OS_CYGWIN_FALSE@,$HOST_OS_CYGWIN_FALSE,;t t
-s, at HOST_OS_DARWIN_TRUE@,$HOST_OS_DARWIN_TRUE,;t t
-s, at HOST_OS_DARWIN_FALSE@,$HOST_OS_DARWIN_FALSE,;t t
-s, at HOST_OS_SOLARIS_TRUE@,$HOST_OS_SOLARIS_TRUE,;t t
-s, at HOST_OS_SOLARIS_FALSE@,$HOST_OS_SOLARIS_FALSE,;t t
-s, at NO_UNDEFINED_TRUE@,$NO_UNDEFINED_TRUE,;t t
-s, at NO_UNDEFINED_FALSE@,$NO_UNDEFINED_FALSE,;t t
-s, at extra_includes@,$extra_includes,;t t
-s, at extra_libraries@,$extra_libraries,;t t
-s, at debug_flag@,$debug_flag,;t t
-s, at coefficient_mnemonic@,$coefficient_mnemonic,;t t
-s, at LIBOBJS@,$LIBOBJS,;t t
-s, at LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
-
-_ACEOF
-
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
-  fi
-fi # test -n "$CONFIG_FILES"
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
 
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
 
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
 
-  ac_builddir=.
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
 
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
 
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
 
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
-  esac
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s, at configure_input@,$configure_input,;t t
-s, at srcdir@,$ac_srcdir,;t t
-s, at abs_srcdir@,$ac_abs_srcdir,;t t
-s, at top_srcdir@,$ac_top_srcdir,;t t
-s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s, at builddir@,$ac_builddir,;t t
-s, at abs_builddir@,$ac_abs_builddir,;t t
-s, at top_builddir@,$ac_top_builddir,;t t
-s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
-s, at INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
 
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
-#
-# CONFIG_HEADER section.
-#
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
 
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
 
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
 
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
-_ACEOF
-
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
-
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
-  if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
 
-      rm -f $ac_file
-      mv $tmp/config.h $ac_file
-    fi
-  else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
-  fi
-# Compute $ac_file's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $ac_file | $ac_file:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
-$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X$ac_file : 'X\(//\)[^/]' \| \
-	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`/stamp-h$_am_stamp_count
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path_CXX
 
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
 
-  ac_builddir=.
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
 
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
 
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
 
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
 
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
 
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`(dirname "$mf") 2>/dev/null ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`(dirname "$file") 2>/dev/null ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    { if $as_mkdir_p; then
-    mkdir -p $dirpart/$fdir
-  else
-    as_dir=$dirpart/$fdir
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
-   { (exit 1); exit 1; }; }; }
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
 
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
  ;;
+
   esac
-done
-_ACEOF
+done # for ac_tag
 
-cat >>$CONFIG_STATUS <<\_ACEOF
 
 { (exit 0); exit 0; }
 _ACEOF
@@ -32774,7 +33078,10 @@ if test "$no_recursion" != yes; then
   # Remove --cache-file and --srcdir arguments so they do not pile up.
   ac_sub_configure_args=
   ac_prev=
-  for ac_arg in $ac_configure_args; do
+  eval "set x $ac_configure_args"
+  shift
+  for ac_arg
+  do
     if test -n "$ac_prev"; then
       ac_prev=
       continue
@@ -32797,123 +33104,123 @@ if test "$no_recursion" != yes; then
       ac_prev=prefix ;;
     -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
       ;;
-    *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+    *)
+      case $ac_arg in
+      *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      esac
+      ac_sub_configure_args="$ac_sub_configure_args '$ac_arg'" ;;
     esac
   done
 
   # Always prepend --prefix to ensure using the same prefix
   # in subdir configurations.
-  ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args"
+  ac_arg="--prefix=$prefix"
+  case $ac_arg in
+  *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+  # Pass --silent
+  if test "$silent" = yes; then
+    ac_sub_configure_args="--silent $ac_sub_configure_args"
+  fi
 
   ac_popdir=`pwd`
   for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
 
     # Do not complain, so a configure script can configure whichever
     # parts of a large source tree are present.
-    test -d $srcdir/$ac_dir || continue
-
-    { echo "$as_me:$LINENO: configuring in $ac_dir" >&5
-echo "$as_me: configuring in $ac_dir" >&6;}
-    { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
+    test -d "$srcdir/$ac_dir" || continue
+
+    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+    echo "$as_me:$LINENO: $ac_msg" >&5
+    echo "$ac_msg" >&6
+    { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
     as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
 $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
 echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
     done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-
     ac_builddir=.
 
-if test "$ac_dir" != .; then
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
   ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
 
 case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
+  .)  # We are building in place.
     ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
     ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
 esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
 
-    cd $ac_dir
+    cd "$ac_dir"
 
     # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'"
-    elif test -f $ac_srcdir/configure; then
-      ac_sub_configure="$SHELL '$ac_srcdir/configure'"
-    elif test -f $ac_srcdir/configure.in; then
-      ac_sub_configure=$ac_configure
+    if test -f "$ac_srcdir/configure.gnu"; then
+      ac_sub_configure=$ac_srcdir/configure.gnu
+    elif test -f "$ac_srcdir/configure"; then
+      ac_sub_configure=$ac_srcdir/configure
+    elif test -f "$ac_srcdir/configure.in"; then
+      # This should be Cygnus configure.
+      ac_sub_configure=$ac_aux_dir/configure
     else
       { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5
 echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
@@ -32925,21 +33232,21 @@ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
       # Make the cache file name correct relative to the subdirectory.
       case $cache_file in
       [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
-      *) # Relative path.
-	ac_sub_cache_file=$ac_top_builddir$cache_file ;;
+      *) # Relative name.
+	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
       esac
 
-      { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
-echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+      { echo "$as_me:$LINENO: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
       # The eval makes quoting arguments work.
-      eval $ac_sub_configure $ac_sub_configure_args \
-	   --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir ||
+      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
 	{ { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5
 echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
    { (exit 1); exit 1; }; }
     fi
 
-    cd $ac_popdir
+    cd "$ac_popdir"
   done
 fi
 
diff --git a/configure.ac b/configure.ac
index 18e3c2e..0212ff6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,11 +1,11 @@
 # Autoconf source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,16 +23,23 @@
 # Process this file with autoconf to produce a configure script.
 
 # Every other copy of the package version number gets its value from here.
-AC_INIT([the Parma Polyhedra Library], [0.9], [ppl-devel at cs.unipr.it], [ppl])
+AC_INIT([the Parma Polyhedra Library],[0.10pre27],[ppl-devel at cs.unipr.it],[ppl])
 
 # Minimum autoconf version required.
-AC_PREREQ(2.59)
+AC_PREREQ(2.60)
 
 # Make sure the sources are there.
 AC_CONFIG_SRCDIR(src/Polyhedron_public.cc)
 
+# Specify the location of additional local Autoconf macros.
+AC_CONFIG_MACRO_DIR([m4])
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
+AC_CANONICAL_HOST
+
 # Use Automake.
-AM_INIT_AUTOMAKE([foreign dist-bzip2 dist-zip 1.7.3])
+AM_INIT_AUTOMAKE([foreign no-define dist-bzip2 dist-zip 1.7.3])
 
 AC_SUBST(VERSION)
 
@@ -60,9 +67,9 @@ AC_SUBST(PPL_VERSION_MINOR)
 AC_SUBST(PPL_VERSION_REVISION)
 AC_SUBST(PPL_VERSION_BETA)
 
-AC_DEFINE_UNQUOTED(PPL_CONFIGURE_OPTIONS, "$ac_configure_args", [This contains the options with which `configure' was invoked.])
+AC_DEFINE_UNQUOTED(CONFIGURE_OPTIONS, "$ac_configure_args", [This contains the options with which `configure' was invoked.])
 PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
-AC_SUBST(PPL_CONFIGURE_OPTIONS)
+AC_SUBST(CONFIGURE_OPTIONS)
 
 # Installation directories.
 AC_SUBST([docdir], ['${datadir}/doc/ppl'])
@@ -70,33 +77,38 @@ AC_SUBST([docdir], ['${datadir}/doc/ppl'])
 # Generate a configuration header file.
 AC_CONFIG_HEADER(config.h)
 
+# Generate prefixed defines.
+AX_PREFIX_CONFIG_H
+
 ISODATE=`date +%Y-%m-%d`
 AC_SUBST(ISODATE)
 
-# Check for host type.
-AC_CANONICAL_HOST
-
-AH_TOP([
-#ifndef PPL_ppl_config_h
-#define PPL_ppl_config_h 1
-])
-
 AH_BOTTOM([
+#ifdef PPL_NDEBUG
+# define NDEBUG PPL_NDEBUG
+#endif
+
 /*
   In order for the definition of `int64_t' to be seen by Comeau C/C++,
   we must make sure <stdint.h> is included before <sys/types.hh> is
   (even indirectly) included.
+
+  Moreover we need to define __STDC_LIMIT_MACROS before the first
+  inclusion of <stdint.h> in order to have the macros defined also in C++.
 */
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
 #endif
 
-#endif /* !defined(PPL_ppl_config_h) */
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
 ])
 
+
 # C compiler
 
 AC_ARG_WITH(cc,
@@ -111,6 +123,61 @@ AC_ARG_WITH(cxx,
     [use XXX as the C++ compiler]),
   CXX=$with_cxx)
 
+# Checks for programs.
+# Note that AC_PROG_CC must precede the first use of $GCC abd AC_PROG_CXX
+# must precede the first use of $GXX.  Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+AC_PROG_CC
+CFLAGS="$save_CFLAGS"
+
+# The Intel C compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using the Intel C compiler])
+  AC_LANG_PUSH(C)
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  ICC=yes,
+  AC_MSG_RESULT(no)
+  ICC=no,
+  AC_MSG_RESULT(no)
+  ICC=no)
+  AC_LANG_POP(C)
+fi
+
+save_CXXFLAGS="$CXXFLAGS"
+AC_PROG_CXX
+CXXFLAGS="$save_CXXFLAGS"
+
+# The Intel C++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using the Intel C++ compiler])
+  AC_LANG_PUSH(C++)
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  ICPC=yes,
+  AC_MSG_RESULT(no)
+  ICPC=no,
+  AC_MSG_RESULT(no)
+  ICPC=no)
+  AC_LANG_POP(C++)
+fi
+
+AC_PROG_EGREP
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
 # Compilation flags
 
 COMP_FLAGS=""
@@ -143,7 +210,7 @@ case "${enableval}" in
 yes)
   AC_MSG_RESULT(yes)
   OPT_FLAGS="-g"
-  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1"
   ;;
 no)
   AC_MSG_RESULT(no)
@@ -194,7 +261,7 @@ enableval=no
 AC_MSG_CHECKING([whether to enable even more run-time assertions])
 AC_ARG_ENABLE(more-assertions,
   AC_HELP_STRING([--enable-more-assertions],
-    [check even more run-time assertions]))
+    [break the ABI to check even more run-time assertions]))
 case "${enableval}" in
 yes)
   AC_MSG_RESULT(yes)
@@ -211,7 +278,9 @@ enable_more_assertions=${enableval}
 if test x"$enable_more_assertions" = xyes
 then
   enable_assertions=yes
-  AC_DEFINE(EXTRA_ROW_DEBUG, 1, [Enable more assertions when defined.])
+  AC_DEFINE(ABI_BREAKING_EXTRA_DEBUG, 1, [ABI-breaking extra assertions are enabled when this is defined.])
+  AC_DEFINE(_GLIBCXX_DEBUG, 1, [When defined and libstdc++ is used, it is used in debug mode.])
+  AC_DEFINE(_GLIBCXX_DEBUG_PEDANTIC, 1, [When defined and libstdc++ is used, it is used in pedantic debug mode.])
 fi
 
 if test x"$enable_assertions" = xno
@@ -292,6 +361,76 @@ no)
   ;;
 esac
 
+enableval=default
+fpmath_may_use_387=yes
+fpmath_may_use_sse=yes
+AC_MSG_CHECKING([whether to select specific floating point arithmetics])
+AC_ARG_ENABLE(fpmath,
+  AC_HELP_STRING([--enable-fpmath],
+    [select floating point arithmetics]))
+case "${enableval}" in
+sse)
+  AC_MSG_RESULT(sse)
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse"
+  # The SSE instruction set only supports single precision arithmetics:
+  # double and extended precision arithmetics is still done using 387.
+  ;;
+sse2)
+  AC_MSG_RESULT(sse2)
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse"
+  # SSE2 still does not support extended precision arithmetics.
+  ;;
+387)
+  AC_MSG_RESULT(387)
+  OPT_FLAGS="$OPT_FLAGS -mno-sse -mno-sse2 -mfpmath=387"
+  # Note that the -mno-sse* and -mfpmath options are only guaranteed
+  # to work with GCC.
+  if test x"$GCC" = xyes
+  then
+    fpmath_may_use_sse=no
+  fi
+  ;;
+sse+387)
+  AC_MSG_RESULT(sse+387)
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387"
+  ;;
+sse2+387)
+  AC_MSG_RESULT(sse2+387)
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387"
+  ;;
+default)
+  AC_MSG_RESULT(default)
+  ;;
+no)
+  AC_MSG_RESULT(default)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no])
+  ;;
+esac
+
+if test x"$fpmath_may_use_387" = xyes
+then
+  AC_DEFINE(FPMATH_MAY_USE_387, 1, [Defined if floating point arithmetics may use the 387 unit.])
+fi
+
+if test x"$fpmath_may_use_sse" = xyes
+then
+  AC_DEFINE(FPMATH_MAY_USE_SSE, 1, [Defined if floating point arithmetics may use the SSE instruction set.])
+fi
+
+# Disable all transformations and optimizations that assume default
+# floating point rounding behavior.
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    OPT_FLAGS="$OPT_FLAGS -fp-model strict -fp-speculation off"
+  else
+    OPT_FLAGS="$OPT_FLAGS -frounding-math"
+  fi
+fi
+
 enableval=no
 AC_MSG_CHECKING([whether to use precompiled headers])
 AC_ARG_ENABLE(pch,
@@ -311,8 +450,8 @@ no)
 esac
 AM_CONDITIONAL(USE_PRECOMPILED_HEADERS, test x"$enableval" = xyes)
 
-CFLAGS="$COMP_FLAGS $OPT_FLAGS"
-CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
 
 enableval=mpz
 AC_MSG_CHECKING([the type of integral values to use as coefficients])
@@ -419,14 +558,6 @@ AC_ARG_WITH(cxxflags,
     [add XXX to the options for the C++ compiler]),
   CXXFLAGS="$CXXFLAGS $with_cxxflags")
 
-# Checks for programs.
-AC_PROG_EGREP
-AC_PROG_CC
-AC_PROG_CXX
-AC_PROG_CXXCPP
-AC_PROG_MAKE_SET
-AC_PROG_INSTALL
-
 # Check for Perl.
 AC_PATH_PROG([PERL], perl, no)
 AC_SUBST([PERL])
@@ -437,25 +568,33 @@ AC_LANG(C)
 AC_C_CONST
 AC_C_INLINE
 AC_C_BIGENDIAN
+AC_C_TYPEOF
 
 # Checks for C type sizes.
+AC_CHECK_SIZEOF(char)
+AC_CHECK_SIZEOF(short)
 AC_CHECK_SIZEOF(int)
 AC_CHECK_SIZEOF(long)
 AC_CHECK_SIZEOF(long long)
-AC_CHECK_SIZEOF(unsigned)
-AC_CHECK_SIZEOF(unsigned long)
-AC_CHECK_SIZEOF(unsigned long long)
 AC_CHECK_SIZEOF(size_t)
 AC_CHECK_SIZEOF(float)
 AC_CHECK_SIZEOF(double)
 AC_CHECK_SIZEOF(long double)
+# The following are required to validate an horrible kludge working
+# around an horrible bug in <gprolog.h> (see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+AC_CHECK_SIZEOF([int*])
+AC_CHECK_SIZEOF([fp], [], [typedef int *(*fp)();])
 
 # Use C++ for the remaining checks.
 AC_LANG(C++)
 
-dnl Check for the possibility to control the FPU.
+# Check for the possibility to control the FPU.
 AC_CHECK_FPU_CONTROL
 
+# Check whether the C++ compiler provides proper long doubles.
+AC_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
 # Detect the binary format used by C++ floats.
 AC_CXX_FLOAT_BINARY_FORMAT
 
@@ -468,6 +607,9 @@ AC_CXX_LONG_DOUBLE_BINARY_FORMAT
 # Check whether the C++ compiler supports flexible arrays.
 AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS
 
+# Check whether the C++ compiler has the remainder bug
+AC_CXX_HAS_REMAINDER_BUG
+
 # Check whether the C++ compiler supports __attribute__ ((weak)).
 AC_CXX_SUPPORTS_ATTRIBUTE_WEAK
 
@@ -485,7 +627,6 @@ extra_libraries="${extra_libraries} -lm"
 # GMP library
 
 AC_CHECK_GMP
-
 if test x"$have_gmp" = xno
 then
   AC_MSG_ERROR([Cannot find GMP version 4.1.3 or higher.
@@ -541,16 +682,22 @@ no)
 esac
 build_watchdog_library=$enableval
 AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes)
+if test x"$build_watchdog_library" = xyes
+then
+  AC_DEFINE(WATCHDOG_LIBRARY_ENABLED, 1, [Defined if the Parma Watchdog Library is enabled.])
+fi
 
 # Enabled or not, the Watchdog subdirectory must be configured.
 AC_CONFIG_SUBDIRS(Watchdog)
 
 # This is the list of available interfaces: lowercase and blank-separated.
-available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog ocaml java"
 
 # This is the list of interfaces that are enabled by default.
 #default_interfaces="cxx c swi_prolog"
-default_interfaces=${available_interfaces}
+#default_interfaces=${available_interfaces}
+default_interfaces="cxx c sicstus_prolog swi_prolog xsb_prolog ocaml java"
+#default_interfaces="cxx c gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog ocaml java"
 
 enableval=not_specified
 AC_MSG_CHECKING([which interfaces are enabled])
@@ -613,20 +760,81 @@ esac
 # Set an Automake conditional to build or not to build the C interface.
 AM_CONDITIONAL(BUILD_C_INTERFACE, test x${c_interface_enabled} = xyes)
 
-# Checks for Prolog systems for which the interface is enabled.
+# Checks for systems for which the interface is enabled.
 
-# Ciao Prolog
-if test x${ciao_prolog_interface_enabled} = xyes
+# Set the optional Java SDK directory.
+AC_ARG_WITH(java,
+	AC_HELP_STRING([--with-java=dir],
+       [use dir as Java SDK root directory]),
+       [JAVA_HOME=$with_java])
+
+case "${host_os}" in
+# On Darwin the JDK, if present, is installed in /Library/Java/Home .
+darwin*)
+  if test "x$JAVA_HOME" = x
+  then
+    JAVA_HOME="/Library/Java/Home"
+  fi
+  ;;
+# On Fedora Core systems the JDK is usually in /usr/java/default .
+linux*)
+  if test "x$JAVA_HOME" = x
+  then
+    JAVA_HOME="/usr/java/default"
+  fi
+  ;;
+*)
+  ;;
+esac
+
+if test ! "x$JAVA_HOME" = x
+then
+  JAVAPREFIX="${JAVA_HOME}/bin"
+fi
+
+# Java
+if test x${java_interface_enabled} = xyes
 then
-  AC_CHECK_PROG(CIAO_PROLOG, ciao, ciao)
-  if test x"$CIAO_PROLOG" = xciao
+  # Check for Java programs. Order here is important: check first
+  # for the compiler.
+  AC_PROG_JAVAC
+  AC_PROG_JAVA
+  AC_PROG_JAR
+  AC_PROG_JAVAH
+fi
+
+# All the Java programs are required to build the Java interface and if
+# the Java interface is enabled.
+AM_CONDITIONAL(BUILD_JAVA_INTERFACE, test ! "x$JAVA" = xno &&  test ! "x$ac_cv_javac_supports_enums" = xno && test ! "x$JAR" = xno && test ! "x$JAVAH" = xno && test x${java_interface_enabled} = xyes)
+
+# OCaml
+if test x${ocaml_interface_enabled} = xyes
+then
+  AC_CHECK_PROG(OCAMLC, ocamlc, ocamlc)
+  ocamlgmp="no"
+  if test x"$OCAMLC" = xocamlc
   then
-  AC_CHECK_HEADER(ciao_prolog.h,
-                  [],
-                  CIAO_PROLOG="")
+     ocamlc_root=`ocamlc -where`
+     # checking for OCaml GMP
+     AC_MSG_CHECKING(for Caml-GMP module gmp.cma)
+     if test -f ${ocamlc_root}/gmp/gmp.cma;
+     then
+         AC_MSG_RESULT(yes)
+	 ocamlgmp="yes"
+     else
+         AC_MSG_RESULT(no)
+	 ocamlgmp="no"
+     fi
   fi
 fi
-AM_CONDITIONAL(BUILD_CIAO_PROLOG_INTERFACE, test x$CIAO_PROLOG = xciao)
+AM_CONDITIONAL(BUILD_OCAML_INTERFACE, test x$OCAMLC = xocamlc && test x$ocamlgmp = xyes)
+
+# Ciao Prolog
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_CIAO_PROLOG
+fi
+AM_CONDITIONAL(BUILD_CIAO_PROLOG_INTERFACE, test x$have_ciao_prolog = xyes)
 
 # GNU Prolog
 if test x${gnu_prolog_interface_enabled} = xyes
@@ -648,7 +856,7 @@ then
 fi
 AM_CONDITIONAL(BUILD_SICSTUS_PROLOG_INTERFACE, test x$have_sicstus_prolog = xyes)
 
-# SWI Prolog
+# SWI-Prolog
 if test x${swi_prolog_interface_enabled} = xyes
 then
   AC_CHECK_SWI_PROLOG
@@ -675,61 +883,104 @@ then
 fi
 AM_CONDITIONAL(BUILD_YAP_PROLOG_INTERFACE, test x$YAP_PROLOG = xyap)
 
-# # This is the list of interfaces that are enabled by default.
-# # Different instantiations are separated by a '@' character.
-# default_instantiations="Polyhedron @ BD_Shape<int8_t>"
-# 
-# enableval=not_specified
-# AC_MSG_CHECKING([which instantiations are enabled])
-# AC_ARG_ENABLE(instantiations,
-#   AC_HELP_STRING([--enable-instantiations],
-#     [enable instantiations for the non-C++ interfaces]))
-# case x"${enableval}" in
-# xyes | x)
-#   AC_MSG_ERROR([--enable-instantiations needs at least one argument])
-#   ;;
-# xno | xnone)
-#   enabled_instantiations=
-#   AC_MSG_RESULT(none)
-#   ;;
-# *)
-#   if test x"${enableval}" = xnot_specified
-#   then
-#     enableval=${default_instantiations}
-#   fi
-#   # Make the list blank-separated.
-#   required_instantiations=`echo "${enableval}" | sed -e 's/[[ 	]][[ 	]]*//g' -e 's/@/ /g' -e 's/[[ 	]][[ 	]]*/ /g'`
-#   # Check the specified instantiations for validity.
-#   ac_save_CPPFLAGS="$CPPFLAGS"
-#   CPPFLAGS="$CPPFLAGS -I${srcdir}"
-#   for instantiation in ${required_instantiations}
-#   do
-#     AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-# #include "instchk.hh"
-# 
-# using namespace Parma_Polyhedra_Library;
-# 
-# bool valid = ${instantiation}::valid_instantiation();
-# ]])],
-#       valid_instantiation=yes,
-#       valid_instantiation=no)
-#     if test x${valid_instantiation} != xyes
-#     then
-#       AC_MSG_ERROR([invalid instantiation ${instantiation}])
-#     fi
-#   done
-#   CPPFLAGS="$ac_save_CPPFLAGS"
-#   AC_MSG_RESULT([${required_instantiations}])
-#   ;;
-# esac
+# Test if *any* Prolog system has to be built.
+if test x${have_ciao_prolog} = xyes \
+|| test x${GNU_PROLOG} = xgprolog \
+|| test x${have_sicstus_prolog} = xyes \
+|| test x${have_swi_prolog} = xyes \
+|| test x${have_xsb_prolog} = xyes \
+|| test x${YAP_PROLOG} = xyap
+then
+  SOME_PROLOG=yes
+fi
+AM_CONDITIONAL(BUILD_SOME_PROLOG_INTERFACES, test x$SOME_PROLOG = xyes)
+
+# Define the list of interfaces that are enabled by default.
+# Different instantiations are separated by a '@' character.
+default_instantiations="Polyhedron @ Grid"
+default_instantiations="${default_instantiations} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class> @ Octagonal_Shape<double>"
+#default_instantiations="${default_instantiations} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class> @ BD_Shape<double>"
+#default_instantiations="${default_instantiations} @ Rational_Box @ Double_Box"
+#default_instantiations="${default_instantiations} @ Constraints_Product<C_Polyhedron, Grid>"
+default_instantiations="${default_instantiations} @ Pointset_Powerset<C_Polyhedron> @ Pointset_Powerset<NNC_Polyhedron>"
+
+enableval=not_specified
+AC_MSG_CHECKING([which instantiations are enabled])
+AC_ARG_ENABLE(instantiations,
+  AC_HELP_STRING([--enable-instantiations],
+    [enable instantiations for the non-C++ interfaces]))
+case x"${enableval}" in
+xyes | x)
+  AC_MSG_ERROR([--enable-instantiations needs at least one argument])
+  ;;
+xno | xnone)
+  enabled_instantiations=
+  AC_MSG_RESULT(none)
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_instantiations}
+  fi
+  # Avoid extra blanks.
+  required_instantiations=`echo "${enableval}" | sed -e 's/[[	 ]][[	 ]]*/ /g' -e 's/[[ ]]*\([[@<>,]]\)[[ ]]*/\1/g' -e 's/>>/> >/g' -e 's/^[[ ]]//g' -e 's/[[ ]]$//g'`
+  # Check the specified instantiations for validity.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS -I${srcdir}"
+  old_IFS="${IFS}"
+  IFS=@
+  set -- ${required_instantiations}
+  IFS="${old_IFS}"
+  for instantiation
+  do
+    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include "instchk.hh"
+
+using namespace Parma_Polyhedra_Library;
+
+bool valid = ${instantiation}::valid_instantiation();
+]])],
+      valid_instantiation=yes,
+      valid_instantiation=no)
+    if test x${valid_instantiation} != xyes
+    then
+      AC_MSG_ERROR([invalid instantiation ${instantiation}])
+    fi
+  done
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  required_instantiations_canonical_names=`echo "${required_instantiations}" | sed -e 's/> //g' -e 's/>//g' -e 's/[[< ,]]/_/g'`
+  required_instantiations_prolog_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_prolog_cxx_objects=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\).lo/ppl_prolog_\1.lo/g'`
+  required_instantiations_prolog_cxx_sources=`echo "${required_instantiations_prolog_cxx_objects}" | sed -e 's/\([[^. ]]*\).lo/..\/\1.cc/g'`
+  required_instantiations_prolog_cxx_headers=`echo "${required_instantiations_prolog_cxx_sources}" | sed -e 's/.cc/.hh/g'`
+  required_instantiations_java_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/^Polyhedron/Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' | sed -e 's/Pointset_Powerset_[[a-zA-Z0-9_]]*/&@&_Iterator/g'`
+  required_instantiations_java_sources=`echo "${required_instantiations_java_source_names}" | sed -e 's/@/.java /g' -e 's/$/.java/g'`
+  required_instantiations_java_cxx_headers=`echo "${required_instantiations_java_sources}" | sed -e 's/\([[^. ]]*\).java/ppl_java.\1/g'`
+  required_instantiations_java_cxx_headers_sources=`echo "${required_instantiations_java_sources}" | sed -e 's/\([[^. ]]*\).java/ppl_java_\1.h/g'`
+  AC_MSG_RESULT([${required_instantiations}])
+  ;;
+esac
+
+enableval=quick
+AC_MSG_CHECKING([whether `make check' does a thorough or quick check])
+AC_ARG_ENABLE(check,
+  AC_HELP_STRING([--enable-check],
+    [select thorough or quick `make check']))
+case "${enableval}" in
+thorough)
+  AC_MSG_RESULT(thorough)
+  ;;
+quick)
+  AC_MSG_RESULT(quick)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-check, needs thorough or quick])
+  ;;
+esac
+AM_CONDITIONAL(THOROUGH_MAKE_CHECK, test x"$enableval" = xthorough)
 
 # Libtool.
-# Turn off shared libraries during beta-testing, since they
-# make debugging harder and the build process takes too long.
-#AC_DISABLE_SHARED
-AC_LIBTOOL_DLOPEN
-AC_LIBTOOL_WIN32_DLL
-AC_PROG_LIBTOOL
+LT_INIT([dlopen])
 AM_CONDITIONAL(ENABLE_SHARED, test x"$enable_shared" = xyes)
 AM_CONDITIONAL(ENABLE_STATIC, test x"$enable_static" = xyes)
 
@@ -743,8 +994,30 @@ fi
 
 # Check for the GLPK library.
 AC_LANG_PUSH(C)
-AC_CHECK_HEADER(glpk.h, HAVE_GLPK_H=yes)
-AM_CONDITIONAL(HAVE_GLPK, test x$HAVE_GLPK_H = xyes)
+AC_CHECK_HEADERS([glpk.h glpk/glpk.h], have_glpk=yes)
+AM_CONDITIONAL(HAVE_GLPK, test x$have_glpk = xyes)
+if test x$have_glpk = xyes
+then
+  ac_save_LIBS="$LIBS"
+  LIBS="$LIBS -lglpk"
+  AC_CHECK_FUNC(lib_set_print_hook,
+                AC_DEFINE(GLPK_HAS_LIB_SET_PRINT_HOOK,
+                          1,
+                          [Defined if GLPK provides lib_set_print_hook().]))
+  AC_CHECK_FUNC(_glp_lib_print_hook,
+                AC_DEFINE(GLPK_HAS__GLP_LIB_PRINT_HOOK,
+                          1,
+                          [Defined if GLPK provides _glp_lib_print_hook().]))
+  AC_CHECK_FUNC(glp_term_out,
+                AC_DEFINE(GLPK_HAS_GLP_TERM_OUT,
+                          1,
+                          [Defined if GLPK provides glp_term_out().]))
+  AC_CHECK_FUNC(glp_term_hook,
+                AC_DEFINE(GLPK_HAS_GLP_TERM_HOOK,
+                          1,
+                          [Defined if GLPK provides glp_term_hook().]))
+  LIBS="$ac_save_LIBS"
+fi
 AC_LANG_POP(C)
 
 # Checks for header files.
@@ -760,26 +1033,50 @@ AC_CHECK_DECLS([RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS],
 #endif
 ])
 
+AC_CHECK_DECLS([getrusage],
+               ,
+               ,
+               [
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+])
+
 # Checks for typedefs, structures, and compiler characteristics.
-# Nothing for the time being.
+AC_CHECK_TYPES([timeval])
 
 # Checks for library functions.
 # Nothing for the time being.
 
-# If we are using GCC we want to compile with warnings enabled.
+# If we are using GCC or the Intel C/C++ compiler we want to compile
+# with lots of warnings enabled.
 if test x"$GCC" = xyes
 then
-  CFLAGS="-W -Wall $CFLAGS"
+  if test x"$ICC" = xyes
+  then
+    CFLAGS="$CFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418"
+  else
+    CFLAGS="$CFLAGS -W -Wall"
+  fi
 fi
 if test x"$GXX" = xyes
 then
-  CXXFLAGS="-W -Wall $CXXFLAGS"
+  if test x"$ICPC" = xyes
+  then
+    CXXFLAGS="$CXXFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418"
+  else
+    CXXFLAGS="$CXXFLAGS -W -Wall"
+  fi
 fi
 
 # System-dependent adjustments.
 cygwin=no
 darwin=no
 solaris=no
+x86_64=no
 no_undefined=no
 
 case "${host_cpu}" in
@@ -793,6 +1090,9 @@ alpha*)
     CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
   fi
   ;;
+x86_64*)
+  x86_64=yes
+  ;;
 *)
   ;;
 esac
@@ -804,11 +1104,6 @@ cygwin)
   ;;
 darwin*)
   darwin=yes
-  if test x"$GCC" = xyes
-  then
-    CFLAGS="$CFLAGS -Wno-long-double"
-    CXXFLAGS="$CXXFLAGS -Wno-long-double"
-  fi
   ;;
 solaris*)
   solaris=yes
@@ -820,25 +1115,44 @@ esac
 AM_CONDITIONAL(HOST_OS_CYGWIN, test x$cygwin = xyes)
 AM_CONDITIONAL(HOST_OS_DARWIN, test x$darwin = xyes)
 AM_CONDITIONAL(HOST_OS_SOLARIS, test x$solaris = xyes)
+
+AM_CONDITIONAL(HOST_CPU_X86_64, test x$x86_64 = xyes)
+
 AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
 
 AC_SUBST(extra_includes)
 AC_SUBST(extra_libraries)
 AC_SUBST(debug_flag)
 AC_SUBST(coefficient_mnemonic)
+AC_SUBST(required_instantiations)
+AC_SUBST(required_instantiations_canonical_names)
+AC_SUBST(required_instantiations_prolog_cxx_headers)
+AC_SUBST(required_instantiations_prolog_cxx_sources)
+AC_SUBST(required_instantiations_prolog_cxx_objects)
+AC_SUBST(required_instantiations_java_sources)
+AC_SUBST(required_instantiations_java_cxx_headers)
+# FIXME: rename headers_sources into sources.
+AC_SUBST(required_instantiations_java_cxx_headers_sources)
+AC_SUBST(ocamlc_root)
 
 AC_CONFIG_FILES(Makefile
-                ppl.lsm ppl.spec
+                ppl.lsm
                 debian/Makefile
                 debian/libppl.copyright
                 debian/libppl-pwl.copyright
+		fedora/Makefile
                 src/Makefile
                 src/version.hh
                 src/ppl-config.cc
                 tests/Makefile
                 tests/BD_Shape/Makefile
-                tests/Polyhedron/Makefile
+                tests/Box/Makefile
                 tests/Grid/Makefile
+                tests/MIP_Problem/Makefile
+                tests/Octagonal_Shape/Makefile
+                tests/Partially_Reduced_Product/Makefile
+                tests/Polyhedron/Makefile
+                tests/Powerset/Makefile
                 utils/Makefile
                 m4/Makefile
                 demos/Makefile
@@ -851,9 +1165,31 @@ AC_CONFIG_FILES(Makefile
                 doc/devref.doxyconf-latex
                 doc/user.doxyconf-html
                 doc/devref.doxyconf-html
+                doc/user-c-interface.doxyconf-latex
+                doc/devref-c-interface.doxyconf-latex
+                doc/user-c-interface.doxyconf-html
+                doc/devref-c-interface.doxyconf-html
+                doc/user-prolog-interface.doxyconf-latex
+                doc/devref-prolog-interface.doxyconf-latex
+                doc/user-prolog-interface.doxyconf-html
+                doc/devref-prolog-interface.doxyconf-html
+                doc/user-ocaml-interface.doxyconf-html
+                doc/user-ocaml-interface.doxyconf-latex
+                doc/devref-ocaml-interface.doxyconf-html
+                doc/devref-ocaml-interface.doxyconf-latex
+                doc/user-java-interface.doxyconf-html
+                doc/user-java-interface.doxyconf-latex
+                doc/devref-java-interface.doxyconf-html
+                doc/devref-java-interface.doxyconf-latex
                 interfaces/Makefile
                 interfaces/C/Makefile
-                interfaces/C/ppl_c.h
+                interfaces/C/ppl_c_version.h
+               	interfaces/Java/Makefile
+		interfaces/Java/jni/Makefile
+		interfaces/Java/tests/Makefile
+                interfaces/Java/ppl_java/Makefile
+		interfaces/OCaml/Makefile
+		interfaces/OCaml/tests/Makefile
                 interfaces/Prolog/Makefile
                 interfaces/Prolog/Ciao/Makefile
                 interfaces/Prolog/GNU/Makefile
@@ -861,7 +1197,9 @@ AC_CONFIG_FILES(Makefile
                 interfaces/Prolog/SWI/Makefile
                 interfaces/Prolog/XSB/Makefile
                 interfaces/Prolog/YAP/Makefile
-                interfaces/Prolog/tests/Makefile)
+                interfaces/Prolog/tests/Makefile
+                )
+#               tests/Ask_Tell/Makefile
 AC_OUTPUT
 
 if test x"$gmp_supports_exceptions" = xno
diff --git a/debian/Makefile.am b/debian/Makefile.am
index a33cb7e..51a8a0f 100644
--- a/debian/Makefile.am
+++ b/debian/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/debian/Makefile.in b/debian/Makefile.in
index 57f9618..dc03c50 100644
--- a/debian/Makefile.in
+++ b/debian/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
 	$(srcdir)/libppl-pwl.copyright.in \
 	$(srcdir)/libppl.copyright.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -84,39 +91,18 @@ SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -126,53 +112,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -181,56 +165,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -242,10 +200,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -254,24 +216,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 EXTRA_DIST = \
 changelog \
@@ -338,10 +318,6 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 tags: TAGS
 TAGS:
 
@@ -350,22 +326,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -410,7 +385,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -424,12 +399,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -448,17 +431,20 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
 	distclean distclean-generic distclean-libtool distdir dvi \
 	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
 	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/debian/README b/debian/README
deleted file mode 100644
index a1564a0..0000000
--- a/debian/README
+++ /dev/null
@@ -1,35 +0,0 @@
-Building the Debian packages
-============================
-
-The simplest way to build the Debian packages is to run the following
-command in an up-to-date PPL directory.
-
-	dpkg-buildpackage -rsudo
-
-`dpkg-buildpackage' is available in the dpkg-dev package.  Here the
-`sudo' program (from the sudo package) is also required.  This will
-build the PPL using the standard GMP, C compiler and C++ compiler.
-Note that the configuration of GMP, at least on the Debian stable
-distribution, lacks the -fexceptions preprocessor flag, which is
-required for PPL memory bounds handling.
-
-Alternatively, the `pbuilder' program (from the pbuilder package) can
-be used to build a "clean-room" package.  `pbuilder' sets up a chroot
-of a minimal stable distribution and then builds the package inside
-the chroot.  This is good to verify the build dependencies.  It also
-may be required, to ensure that the PPL is built against the compiler
-and GMP from the stable distributions (if, for example, the build
-machine uses the testing or unstable distributions).
-
-
-References
-----------
-
- - Debian Library Packaging guide
-	 http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html
-
- - Debian New Maintainers' Guide
-	 http://www.debian.org/doc/maint-guide/
-
- - Debian Developer's Reference
-	 http://www.debian.org/doc/developers-reference/
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 2ed3e36..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,11 +0,0 @@
-libppl (0.9) unstable; urgency=low
-
-   * Release 0.9.
-
- -- Roberto Bagnara <bagnara at cs.unipr.it>  Fri, 10 Mar 2006 18:08:34 +0000
-
-libppl (0.8) unstable; urgency=low
-
-   * Initial upstream release.
-
- -- Roberto Bagnara <bagnara at cs.unipr.it>  Thu, 19 Jan 2006 23:58:34 +0000
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index b8626c4..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-4
diff --git a/debian/control b/debian/control
deleted file mode 100644
index c6ef086..0000000
--- a/debian/control
+++ /dev/null
@@ -1,74 +0,0 @@
-Source: libppl
-Section: libs
-Priority: optional
-Maintainer: PPL developers <ppl-devel at cs.unipr.it>
-Standards-Version: 3.6.1
-Build-Depends: debhelper (>= 4), binutils, g++, libgmp3-dev (>= 4.1.3), autoconf, automake1.9, libtool, doxygen, graphviz, glpk, tetex-bin, tetex-extra, xpdf-utils, gs-gpl
-Build-Conflicts: automake1.4
-
-Package: libppl
-Architecture: any
-Depends: libgmp3 (>=4.1.3)
-Description: Parma Polyhedra Library: base package
- The Parma Polyhedra Library (PPL) is a C++ library for the
- manipulation of (not necessarily closed) convex polyhedra and other
- numerical abstractions.  The applications of convex polyhedra include
- program analysis, optimized compilation, integer and combinatorial
- optimization and statistical data-editing.  The Parma Polyhedra
- Library is user friendly (you write `x + 2*y + 5*z <= 7' when you
- mean it), fully dynamic (available virtual memory is the only
- limitation to the dimension of anything), written in standard C++,
- exception-safe, rather efficient and thoroughly documented.
- .
- Homepage: http://www.cs.unipr.it/ppl/
-
-Package: libppl-dev
-Architecture: any
-Section: libdevel
-Depends: libppl, graphviz
-Recommends: libgmp3-dev
-Suggests: libgmp3-doc
-Description: Parma Polyhedra Library: C++ interface
- The Parma Polyhedra Library (PPL) is a C++ library for the
- manipulation of (not necessarily closed) convex polyhedra and other
- numerical abstractions.  The applications of convex polyhedra include
- program analysis, optimized compilation, integer and combinatorial
- optimization and statistical data-editing.  The Parma Polyhedra
- Library is user friendly (you write `x + 2*y + 5*z <= 7' when you
- mean it), fully dynamic (available virtual memory is the only
- limitation to the dimension of anything), written in standard C++,
- exception-safe, rather efficient and thoroughly documented.
- .
- This package provides C++ header files, the static library and
- various formats of the developer documentation.
- .
- Homepage: http://www.cs.unipr.it/ppl/
-
-Package: libppl-c
-Architecture: any
-Depends: libppl, libc6
-Description: Parma Polyhedra Library: C interface
- The Parma Polyhedra Library (PPL) is a C++ library for the
- manipulation of (not necessarily closed) convex polyhedra and other
- numerical abstractions.  The applications of convex polyhedra include
- program analysis, optimized compilation, integer and combinatorial
- optimization and statistical data-editing.  The Parma Polyhedra
- Library is user friendly (you write `x + 2*y + 5*z <= 7' when you
- mean it), fully dynamic (available virtual memory is the only
- limitation to the dimension of anything), written in standard C++,
- exception-safe, rather efficient and thoroughly documented.
- .
- This package provides the C interface.
- .
- Homepage: http://www.cs.unipr.it/ppl/
-
-Package: libppl-pwl
-Architecture: any
-Section: libs
-Description: Parma Watchdog Library: C++ library for watchdog timers
- The Parma Watchdog Library (PWL) provides support for multiple,
- concurrent watchdog timers on systems providing setitimer(2).  The
- PWL is currently distributed with the Parma Polyhedra Library (PPL),
- but is totally independent from it.
- .
- Homepage: http://www.cs.unipr.it/ppl/
diff --git a/debian/libppl-c.dirs b/debian/libppl-c.dirs
deleted file mode 100644
index 6845771..0000000
--- a/debian/libppl-c.dirs
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib
diff --git a/debian/libppl-c.install b/debian/libppl-c.install
deleted file mode 100644
index 9ffe5c0..0000000
--- a/debian/libppl-c.install
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/libppl_c.so.*
diff --git a/debian/libppl-c.links b/debian/libppl-c.links
deleted file mode 100644
index f764b85..0000000
--- a/debian/libppl-c.links
+++ /dev/null
@@ -1 +0,0 @@
-usr/share/doc/libppl usr/share/doc/libppl-c
diff --git a/debian/libppl-dev.dirs b/debian/libppl-dev.dirs
deleted file mode 100644
index 3b6ff49..0000000
--- a/debian/libppl-dev.dirs
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/include
-usr/share/doc-base
-usr/share/doc/libppl
diff --git a/debian/libppl-dev.doc-base b/debian/libppl-dev.doc-base
deleted file mode 100644
index 8aa51e2..0000000
--- a/debian/libppl-dev.doc-base
+++ /dev/null
@@ -1,17 +0,0 @@
-Document: libppl-dev
-Title: The Parma Polyhedra Library Developer Reference Manual
-Author: PPL developers <ppl-devel at cs.unipr.it>
-Abstract: This manual contains a general introduction to the Parma
- Polyhedra Library (PPL) and full documentation of the PPL C++
- interface, including implementation details.
-Section: Apps/Programming
-
-Format: postscript
-Files: /usr/share/doc/libppl/ppl-devref-browse.ps.gz
-
-Format: pdf
-Files: /usr/share/doc/libppl/ppl-devref-browse.pdf
-
-Format: HTML
-Index: /usr/share/doc/libppl/html/developer-reference/index.html
-Files: /usr/share/doc/libppl/html/developer-reference/*.html
diff --git a/debian/libppl-dev.doc-base.user b/debian/libppl-dev.doc-base.user
deleted file mode 100644
index 1bbe891..0000000
--- a/debian/libppl-dev.doc-base.user
+++ /dev/null
@@ -1,17 +0,0 @@
-Document: libppl
-Title: The Parma Polyhedra Library User Manual
-Author: PPL developers <ppl-devel at cs.unipr.it>
-Abstract: This manual contains a general introduction to the Parma
- Polyhedra Library (PPL) and full documentation of the PPL C++
- interface.
-Section: Apps/Programming
-
-Format: postscript
-Files: /usr/share/doc/libppl/ppl-user-browse.ps.gz
-
-Format: pdf
-Files: /usr/share/doc/libppl/ppl-user-browse.pdf
-
-Format: HTML
-Index: /usr/share/doc/libppl/html/user-manual/index.html
-Files: /usr/share/doc/libppl/html/user-manual/*.html
diff --git a/debian/libppl-dev.docs b/debian/libppl-dev.docs
deleted file mode 100644
index e69de29..0000000
diff --git a/debian/libppl-dev.install b/debian/libppl-dev.install
deleted file mode 100644
index 1371793..0000000
--- a/debian/libppl-dev.install
+++ /dev/null
@@ -1,5 +0,0 @@
-usr/lib/libppl.la
-usr/lib/libppl.a
-usr/include/ppl_c.h
-usr/include/ppl.hh
-usr/include/pwl.hh
diff --git a/debian/libppl-dev.links b/debian/libppl-dev.links
deleted file mode 100644
index cf1724c..0000000
--- a/debian/libppl-dev.links
+++ /dev/null
@@ -1 +0,0 @@
-usr/share/doc/libppl usr/share/doc/libppl-dev
diff --git a/debian/libppl-pwl.copyright.in b/debian/libppl-pwl.copyright.in
deleted file mode 100644
index 16a6b17..0000000
--- a/debian/libppl-pwl.copyright.in
+++ /dev/null
@@ -1,444 +0,0 @@
-This is the Debian GNU/Linux prepackaged version of the Parma
-Polyhedra Library (PPL): a C++ library for the manipulation of
-numerical abstractions.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/
-
-
-Sources: this package was put together by the PPL developers
-<ppl-devel at cs.unipr.it>, with sources obtained from
-
-  ftp://ftp.cs.unipr.it/pub/ppl/releases/@VERSION@/ppl-@VERSION@.tar.gz
-
-or, for prereleases, from the anonymously accessible CVS repository
-
-  :pserver:anoncvs at cvs.cs.unipr.it:/cvs/ppl
-
-
-Authors: see the CREDITS file or http://www.cs.unipr.it/ppl/Credits
-for the complete list of authors.
-
-
-Copyright: 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-  The PPL 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.
-
-  The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-On Debian systems, the complete text of the GNU General Public
-License, version 2, can be found in /usr/share/common-licenses/GPL-2.
-
-The documentation of the PPL is licensed under the GNU Free Documentation
-License (v1.2), appended at the end of this file.
-
-
-==============================================================================
-
-		GNU Free Documentation License
-		  Version 1.2, November 2002
-
-
- Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document "free" in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense.  It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does.  But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book.  We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License.  Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein.  The "Document", below,
-refers to any such manual or work.  Any member of the public is a
-licensee, and is addressed as "you".  You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject.  (Thus, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.)  The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.  If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant.  The Document may contain zero
-Invariant Sections.  If the Document does not identify any Invariant
-Sections then there are none.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.  A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters.  A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text.  A copy that is not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML, PostScript or PDF designed for human modification.  Examples of
-transparent image formats include PNG, XCF and JPG.  Opaque formats
-include proprietary formats that can be read and edited only by
-proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML, PostScript or PDF produced by some word
-processors for output purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page.  For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section "Entitled XYZ" means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language.  (Here XYZ stands for a
-specific section name mentioned below, such as "Acknowledgements",
-"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
-of such a section when you modify the Document means that it remains a
-section "Entitled XYZ" according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document.  These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License.  You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute.  However, you may accept
-compensation in exchange for copies.  If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover.  Both covers must also clearly and legibly identify
-you as the publisher of these copies.  The front cover must present
-the full title with all words of the title equally prominent and
-visible.  You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it.  In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
-   from that of the Document, and from those of previous versions
-   (which should, if there were any, be listed in the History section
-   of the Document).  You may use the same title as a previous version
-   if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
-   responsible for authorship of the modifications in the Modified
-   Version, together with at least five of the principal authors of the
-   Document (all of its principal authors, if it has fewer than five),
-   unless they release you from this requirement.
-C. State on the Title page the name of the publisher of the
-   Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
-   adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
-   giving the public permission to use the Modified Version under the
-   terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
-   and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section Entitled "History", Preserve its Title, and add
-   to it an item stating at least the title, year, new authors, and
-   publisher of the Modified Version as given on the Title Page.  If
-   there is no section Entitled "History" in the Document, create one
-   stating the title, year, authors, and publisher of the Document as
-   given on its Title Page, then add an item describing the Modified
-   Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
-   public access to a Transparent copy of the Document, and likewise
-   the network locations given in the Document for previous versions
-   it was based on.  These may be placed in the "History" section.
-   You may omit a network location for a work that was published at
-   least four years before the Document itself, or if the original
-   publisher of the version it refers to gives permission.
-K. For any section Entitled "Acknowledgements" or "Dedications",
-   Preserve the Title of the section, and preserve in the section all
-   the substance and tone of each of the contributor acknowledgements
-   and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
-   unaltered in their text and in their titles.  Section numbers
-   or the equivalent are not considered part of the section titles.
-M. Delete any section Entitled "Endorsements".  Such a section
-   may not be included in the Modified Version.
-N. Do not retitle any existing section to be Entitled "Endorsements"
-   or to conflict in title with any Invariant Section.
-O. Preserve any Warranty Disclaimers.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant.  To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version.  Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity.  If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy.  If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled "History"
-in the various original documents, forming one section Entitled
-"History"; likewise combine any sections Entitled "Acknowledgements",
-and any sections Entitled "Dedications".  You must delete all sections
-Entitled "Endorsements".
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an "aggregate" if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections.  You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers.  In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled "Acknowledgements",
-"Dedications", or "History", the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License.  Any other attempt to
-copy, modify, sublicense or distribute the Document 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.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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.  See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation.  If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-    Copyright (c)  YEAR  YOUR NAME.
-    Permission is granted to copy, distribute and/or modify this document
-    under the terms of the GNU Free Documentation License, Version 1.2
-    or any later version published by the Free Software Foundation;
-    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-    A copy of the license is included in the section entitled "GNU
-    Free Documentation License".
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the "with...Texts." line with this:
-
-    with the Invariant Sections being LIST THEIR TITLES, with the
-    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
diff --git a/debian/libppl-pwl.dirs b/debian/libppl-pwl.dirs
deleted file mode 100644
index 4418816..0000000
--- a/debian/libppl-pwl.dirs
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/lib
-usr/include
diff --git a/debian/libppl-pwl.docs b/debian/libppl-pwl.docs
deleted file mode 100644
index a5a4271..0000000
--- a/debian/libppl-pwl.docs
+++ /dev/null
@@ -1,5 +0,0 @@
-BUGS
-NEWS
-README
-ChangeLog
-CREDITS
diff --git a/debian/libppl-pwl.install b/debian/libppl-pwl.install
deleted file mode 100644
index 353e95a..0000000
--- a/debian/libppl-pwl.install
+++ /dev/null
@@ -1,4 +0,0 @@
-usr/lib/libpwl.so
-usr/lib/libpwl.so.*
-usr/lib/libpwl.a
-usr/lib/libpwl.la
diff --git a/debian/libppl.copyright.in b/debian/libppl.copyright.in
deleted file mode 100644
index 16a6b17..0000000
--- a/debian/libppl.copyright.in
+++ /dev/null
@@ -1,444 +0,0 @@
-This is the Debian GNU/Linux prepackaged version of the Parma
-Polyhedra Library (PPL): a C++ library for the manipulation of
-numerical abstractions.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/
-
-
-Sources: this package was put together by the PPL developers
-<ppl-devel at cs.unipr.it>, with sources obtained from
-
-  ftp://ftp.cs.unipr.it/pub/ppl/releases/@VERSION@/ppl-@VERSION@.tar.gz
-
-or, for prereleases, from the anonymously accessible CVS repository
-
-  :pserver:anoncvs at cvs.cs.unipr.it:/cvs/ppl
-
-
-Authors: see the CREDITS file or http://www.cs.unipr.it/ppl/Credits
-for the complete list of authors.
-
-
-Copyright: 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-  The PPL 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.
-
-  The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-On Debian systems, the complete text of the GNU General Public
-License, version 2, can be found in /usr/share/common-licenses/GPL-2.
-
-The documentation of the PPL is licensed under the GNU Free Documentation
-License (v1.2), appended at the end of this file.
-
-
-==============================================================================
-
-		GNU Free Documentation License
-		  Version 1.2, November 2002
-
-
- Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document "free" in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense.  It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does.  But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book.  We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License.  Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein.  The "Document", below,
-refers to any such manual or work.  Any member of the public is a
-licensee, and is addressed as "you".  You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject.  (Thus, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.)  The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.  If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant.  The Document may contain zero
-Invariant Sections.  If the Document does not identify any Invariant
-Sections then there are none.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.  A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters.  A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text.  A copy that is not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML, PostScript or PDF designed for human modification.  Examples of
-transparent image formats include PNG, XCF and JPG.  Opaque formats
-include proprietary formats that can be read and edited only by
-proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML, PostScript or PDF produced by some word
-processors for output purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page.  For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section "Entitled XYZ" means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language.  (Here XYZ stands for a
-specific section name mentioned below, such as "Acknowledgements",
-"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
-of such a section when you modify the Document means that it remains a
-section "Entitled XYZ" according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document.  These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License.  You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute.  However, you may accept
-compensation in exchange for copies.  If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover.  Both covers must also clearly and legibly identify
-you as the publisher of these copies.  The front cover must present
-the full title with all words of the title equally prominent and
-visible.  You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it.  In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
-   from that of the Document, and from those of previous versions
-   (which should, if there were any, be listed in the History section
-   of the Document).  You may use the same title as a previous version
-   if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
-   responsible for authorship of the modifications in the Modified
-   Version, together with at least five of the principal authors of the
-   Document (all of its principal authors, if it has fewer than five),
-   unless they release you from this requirement.
-C. State on the Title page the name of the publisher of the
-   Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
-   adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
-   giving the public permission to use the Modified Version under the
-   terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
-   and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section Entitled "History", Preserve its Title, and add
-   to it an item stating at least the title, year, new authors, and
-   publisher of the Modified Version as given on the Title Page.  If
-   there is no section Entitled "History" in the Document, create one
-   stating the title, year, authors, and publisher of the Document as
-   given on its Title Page, then add an item describing the Modified
-   Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
-   public access to a Transparent copy of the Document, and likewise
-   the network locations given in the Document for previous versions
-   it was based on.  These may be placed in the "History" section.
-   You may omit a network location for a work that was published at
-   least four years before the Document itself, or if the original
-   publisher of the version it refers to gives permission.
-K. For any section Entitled "Acknowledgements" or "Dedications",
-   Preserve the Title of the section, and preserve in the section all
-   the substance and tone of each of the contributor acknowledgements
-   and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
-   unaltered in their text and in their titles.  Section numbers
-   or the equivalent are not considered part of the section titles.
-M. Delete any section Entitled "Endorsements".  Such a section
-   may not be included in the Modified Version.
-N. Do not retitle any existing section to be Entitled "Endorsements"
-   or to conflict in title with any Invariant Section.
-O. Preserve any Warranty Disclaimers.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant.  To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version.  Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity.  If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy.  If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled "History"
-in the various original documents, forming one section Entitled
-"History"; likewise combine any sections Entitled "Acknowledgements",
-and any sections Entitled "Dedications".  You must delete all sections
-Entitled "Endorsements".
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an "aggregate" if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections.  You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers.  In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled "Acknowledgements",
-"Dedications", or "History", the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License.  Any other attempt to
-copy, modify, sublicense or distribute the Document 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.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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.  See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation.  If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-    Copyright (c)  YEAR  YOUR NAME.
-    Permission is granted to copy, distribute and/or modify this document
-    under the terms of the GNU Free Documentation License, Version 1.2
-    or any later version published by the Free Software Foundation;
-    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-    A copy of the license is included in the section entitled "GNU
-    Free Documentation License".
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the "with...Texts." line with this:
-
-    with the Invariant Sections being LIST THEIR TITLES, with the
-    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
diff --git a/debian/libppl.dirs b/debian/libppl.dirs
deleted file mode 100644
index d96c6d6..0000000
--- a/debian/libppl.dirs
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/lib
-usr/bin
-usr/share/man/man1
diff --git a/debian/libppl.docs b/debian/libppl.docs
deleted file mode 100644
index a5a4271..0000000
--- a/debian/libppl.docs
+++ /dev/null
@@ -1,5 +0,0 @@
-BUGS
-NEWS
-README
-ChangeLog
-CREDITS
diff --git a/debian/libppl.install b/debian/libppl.install
deleted file mode 100644
index a7ba61c..0000000
--- a/debian/libppl.install
+++ /dev/null
@@ -1,8 +0,0 @@
-usr/lib/libppl.so
-usr/lib/libppl.so.*
-usr/bin/ppl-config
-usr/bin/ppl_lcdd
-usr/bin/ppl_lpsol
-usr/share/man/man1/ppl-config.1
-usr/share/man/man1/ppl_lcdd.1
-usr/share/man/man1/ppl_lpsol.1
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index aaa9070..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,186 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-#
-# Modified to make a template file for a multi-binary package with separated
-# build-arch and build-indep targets  by Bill Allombert 2001
-
-# Uncomment this to turn on verbose mode.
-export DH_VERBOSE=1
-
-# This has to be exported to make some magic below work.
-export DH_OPTIONS
-
-# These are used for cross-compiling and for saving the configure script
-# from having to guess our platform (since we know it already)
-DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
-DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
-
-CFLAGS = -Wall -g
-
-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
-	CFLAGS += -O0
-else
-	CFLAGS += -O2
-endif
-
-# FOR AUTOCONF 2.52 AND NEWER ONLY
-ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
-  confflags += --build $(DEB_HOST_GNU_TYPE)
-else
-  confflags += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
-endif
-
-# If the version string was set using automake then the build would
-# have to be configured before the dpkg-buildpackage command.
-PPL_VERSION = $(shell grep "^AC_INIT" $(CURDIR)/configure.ac | sed -e "s/^AC_INIT.\[[^]]*\],[ \t]*\[\([^]]*\)\],.*/\1/")
-
-config.status:
-	dh_testdir
-#   Add here commands to configure the package.
-#   /usr/share/doc/autotools-dev/README.Debian.gz:
-#     - Call the autoconf suite using simple names ("autoconf", "autoheader", etc.)
-#     - Call the automake suite using *versioned* names ("automake-1.9", etc),
-	autoreconf && CFLAGS="$(CFLAGS)" ./configure $(confflags) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
-
-## Architecture
-build: build-arch build-indep
-
-build-arch: build-arch-stamp
-build-arch-stamp: config.status
-
-#	Add here commands to compile the arch part of the package.
-	$(MAKE)
-	touch build-arch-stamp
-
-build-indep: build-indep-stamp
-build-indep-stamp:  config.status
-
-#	Add here commands to compile the indep part of the package.
-#   FIX this depends on build-arch to install the doc to debian/tmp
-#	$(MAKE) doc
-	touch build-indep-stamp
-
-clean:
-	dh_testdir
-	dh_testroot
-	rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
-
-#	Add here commands to clean up after the build process.
-	-$(MAKE) distclean
-ifneq "$(wildcard /usr/share/misc/config.sub)" ""
-	cp -f /usr/share/misc/config.sub config.sub
-endif
-ifneq "$(wildcard /usr/share/misc/config.guess)" ""
-	cp -f /usr/share/misc/config.guess config.guess
-endif
-	dh_clean
-
-install: install-indep install-arch
-install: install-arch
-
-install-indep:
-# 	dh_testdir
-# 	dh_testroot
-# 	dh_clean -k -i
-# 	dh_installdirs -i
-
-##	Add here commands to install the indep part of the package into
-##	debian/<package>-doc.
-
-# 	dh_install -i
-
-# Destination directory for user manual.
-DOC_DIR=debian/libppl-dev/usr/share/doc/libppl
-# Destination directory for developer reference.
-DEV_DOC_DIR=debian/libppl-dev/usr/share/doc/libppl
-#SRC_DOC_DIR=$(CURDIR)/debian/tmp/usr/share/doc/ppl/
-SRC_DOC_DIR=$(CURDIR)/doc
-install-arch:
-	dh_testdir
-	dh_testroot
-	dh_clean -k -s
-	dh_installdirs -s
-
-#	Add here commands to install the arch part of the package into
-# 	debian/tmp.
-
-	$(MAKE) install DESTDIR=$(CURDIR)/debian/tmp
-	$(MAKE) -C Watchdog install DESTDIR=$(CURDIR)/debian/tmp
-
-#   Install the PPL programs.
-#   FIXME: Consider installing the ppl_lcdd and ppl_lpsol examples
-#          (what about copyrights?).
-	cp -a $(CURDIR)/src/ppl-config $(CURDIR)/debian/tmp/usr/bin/
-	cp -a $(CURDIR)/demos/ppl_lcdd/ppl_lcdd $(CURDIR)/debian/tmp/usr/bin/
-	cp -a $(CURDIR)/demos/ppl_lpsol/ppl_lpsol $(CURDIR)/debian/tmp/usr/bin/
-
-#   Build all the documentation, then move it into debian/tmp
-#   directories which have fixed names.
-	mkdir -p $(DOC_DIR)/html || exit 1
-	mkdir -p $(DEV_DOC_DIR)/html || exit 1
-	$(MAKE) -C doc world \
-	&& cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION)-html $(DOC_DIR)/html/user-manual/ \
-	&& cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION).pdf $(DOC_DIR)/ppl-user-browse.pdf \
-	&& cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION).ps.gz $(DOC_DIR)/ppl-user-print.ps.gz \
-	&& cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION)-html $(DEV_DOC_DIR)/html/developer-reference/ \
-	&& cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION).pdf $(DEV_DOC_DIR)/ppl-devref-browse.pdf \
-	&& cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION).ps.gz $(DEV_DOC_DIR)/ppl-devref-print.ps.gz
-
-#	Explicitly install the Debian changelog, for libppl and libppl-pwl.
-	mkdir -p debian/libppl/usr/share/doc/libppl/
-	cp -a debian/changelog debian/libppl/usr/share/doc/libppl/changelog.Debian
-	mkdir -p debian/libppl-pwl/usr/share/doc/libppl-pwl/
-	cp -a debian/changelog debian/libppl-pwl/usr/share/doc/libppl-pwl/changelog.Debian
-
-	dh_install -s --sourcedir=debian/tmp
-
-# Must not depend on anything. This is to be called by
-# binary-arch/binary-indep
-# in another 'make' thread.
-binary-common:
-	dh_testdir
-	dh_testroot
-
-#   This would install the change logs into every package, so instead
-#   the install-arch rule above copies the logs into place.
-#	dh_installchangelogs -plibppl -plibppl-pwl
-
-	dh_installdocs
-#   These directories will be symlinks instead.  The [^p] is to keep
-#   the directory for libppl-pwl.
-	rmdir debian/libppl-[^p]*/usr/share/doc/libppl-* || exit 1
-#	dh_installexamples
-#	dh_installmenu
-#	dh_installdebconf
-#	dh_installlogrotate
-#	dh_installinit
-#	dh_installcron
-#	dh_installinfo
-#	dh_installman
-	dh_link
-	dh_strip
-	dh_compress
-	dh_fixperms
-#	dh_perl
-#	dh_python
-	dh_makeshlibs
-	dh_installdeb
-	dh_shlibdeps
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-## Build architecture independant packages using the common target.
-binary-indep: build-indep install-indep
-#	$(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
-
-## Build architecture dependant packages using the common target.
-binary-arch: build-arch install-arch
-	$(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
-
-binary: binary-arch binary-indep
-.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch
diff --git a/demos/Makefile.am b/demos/Makefile.am
index 5f88c4e..0753f2e 100644
--- a/demos/Makefile.am
+++ b/demos/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/demos/Makefile.in b/demos/Makefile.in
index aea007a..1a9fc41 100644
--- a/demos/Makefile.in
+++ b/demos/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -60,7 +56,8 @@ host_triplet = @host@
 subdir = demos
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -70,8 +67,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -82,48 +89,30 @@ SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -133,53 +122,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -188,56 +175,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -249,10 +210,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -261,24 +226,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 SUBDIRS = ppl_lcdd ppl_lpsol
 all: all-recursive
@@ -320,10 +303,6 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -355,8 +334,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -400,8 +378,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -426,8 +404,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -437,13 +415,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -457,22 +434,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -486,7 +462,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -494,6 +470,8 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -533,8 +511,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-recursive
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
+distclean-am: clean-am distclean-generic distclean-tags
 
 dvi: dvi-recursive
 
@@ -548,12 +525,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am:
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -572,22 +557,24 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-generic clean-libtool clean-recursive ctags \
-	ctags-recursive distclean distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic maintainer-clean-recursive \
-	mostlyclean mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/demos/ppl_lcdd/Makefile.am b/demos/ppl_lcdd/Makefile.am
index fe5b08e..1550a8e 100644
--- a/demos/ppl_lcdd/Makefile.am
+++ b/demos/ppl_lcdd/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/demos/ppl_lcdd/Makefile.in b/demos/ppl_lcdd/Makefile.in
index 09135ae..3ad0922 100644
--- a/demos/ppl_lcdd/Makefile.in
+++ b/demos/ppl_lcdd/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ bin_PROGRAMS = ppl_lcdd$(EXEEXT)
 subdir = demos/ppl_lcdd
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -87,63 +94,46 @@ am_ppl_lcdd_OBJECTS = ppl_lcdd.$(OBJEXT)
 ppl_lcdd_OBJECTS = $(am_ppl_lcdd_OBJECTS)
 ppl_lcdd_DEPENDENCIES = $(top_builddir)/src/libppl.la \
 	$(top_builddir)/utils/libppl_utils.a
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(ppl_lcdd_SOURCES)
 DIST_SOURCES = $(ppl_lcdd_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -153,53 +143,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -208,56 +196,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -269,10 +231,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -281,24 +247,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 SUBDIRS = examples
 AM_CPPFLAGS = \
@@ -394,15 +378,15 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
 	@list='$(bin_PROGRAMS)'; for p in $$list; do \
 	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
 	  if test -f $$p \
 	     || test -f $$p1 \
 	  ; then \
 	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
 	  else :; fi; \
 	done
 
@@ -422,7 +406,7 @@ clean-binPROGRAMS:
 	done
 ppl_lcdd$(EXEEXT): $(ppl_lcdd_OBJECTS) $(ppl_lcdd_DEPENDENCIES) 
 	@rm -f ppl_lcdd$(EXEEXT)
-	$(CXXLINK) $(ppl_lcdd_LDFLAGS) $(ppl_lcdd_OBJECTS) $(ppl_lcdd_LDADD) $(LIBS)
+	$(CXXLINK) $(ppl_lcdd_OBJECTS) $(ppl_lcdd_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -433,22 +417,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lcdd.Po at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -459,10 +443,6 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -494,8 +474,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -539,8 +518,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -565,8 +544,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -576,13 +555,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -596,22 +574,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -625,7 +602,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -633,6 +610,8 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -645,7 +624,7 @@ all-am: Makefile $(PROGRAMS)
 installdirs: installdirs-recursive
 installdirs-am:
 	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-recursive
 install-exec: install-exec-recursive
@@ -680,7 +659,7 @@ distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-recursive
 
@@ -694,12 +673,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am: install-binPROGRAMS
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -720,24 +707,26 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+uninstall-am: uninstall-binPROGRAMS
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	check-local clean clean-binPROGRAMS clean-generic \
-	clean-libtool clean-recursive ctags ctags-recursive distclean \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am check-local clean clean-binPROGRAMS \
+	clean-generic clean-libtool ctags ctags-recursive distclean \
 	distclean-compile distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
-	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-binPROGRAMS uninstall-info-am
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am \
+	uninstall-binPROGRAMS
 
 
 polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
diff --git a/demos/ppl_lcdd/examples/Makefile.am b/demos/ppl_lcdd/examples/Makefile.am
index 4ddf077..6f758ce 100644
--- a/demos/ppl_lcdd/examples/Makefile.am
+++ b/demos/ppl_lcdd/examples/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/demos/ppl_lcdd/examples/Makefile.in b/demos/ppl_lcdd/examples/Makefile.in
index 771315f..d3ee68d 100644
--- a/demos/ppl_lcdd/examples/Makefile.in
+++ b/demos/ppl_lcdd/examples/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ subdir = demos/ppl_lcdd/examples
 DIST_COMMON = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -85,39 +92,18 @@ DIST_SOURCES =
 DATA = $(dist_noinst_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -127,53 +113,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -182,56 +166,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -243,10 +201,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -255,24 +217,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 EXT_FILES = \
 ccc4.ext \
@@ -425,10 +405,6 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 tags: TAGS
 TAGS:
 
@@ -437,22 +413,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -497,7 +472,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -511,12 +486,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -535,17 +518,20 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
 	distclean distclean-generic distclean-libtool distdir dvi \
 	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
 	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/demos/ppl_lcdd/ppl_lcdd.cc b/demos/ppl_lcdd/ppl_lcdd.cc
index 5391e47..2d0da76 100644
--- a/demos/ppl_lcdd/ppl_lcdd.cc
+++ b/demos/ppl_lcdd/ppl_lcdd.cc
@@ -1,11 +1,11 @@
 /* A sort of clone of the cddlib test program `lcdd'.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -44,7 +44,7 @@ namespace PPL = Parma_Polyhedra_Library;
 
 typedef PPL::C_Polyhedron POLYHEDRON_TYPE;
 
-#if !CXX_SUPPORTS_ATTRIBUTE_WEAK
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
 extern "C" void
 set_GMP_memory_allocation_functions(void) {
 }
@@ -52,7 +52,7 @@ set_GMP_memory_allocation_functions(void) {
 
 #elif defined(USE_POLKA)
 
-#include <config.h>
+#include <ppl-config.h>
 #include <gmp.h>
 
 extern "C" {
@@ -73,7 +73,7 @@ typedef poly_t* POLYHEDRON_TYPE;
 
 #elif defined(USE_POLYLIB)
 
-#include <config.h>
+#include <ppl-config.h>
 #include <gmp.h>
 
 extern "C" {
@@ -102,21 +102,21 @@ typedef Polyhedron* POLYHEDRON_TYPE;
 #include <sstream>
 #include <stdexcept>
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 #include <getopt.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
+#ifdef PPL_HAVE_UNISTD_H
 // Include this for `getopt()': especially important if we do not have
 // <getopt.h>.
 # include <unistd.h>
 #endif
 
-#ifdef HAVE_SYS_TIME_H
+#ifdef PPL_HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_RESOURCE_H
+#ifdef PPL_HAVE_SYS_RESOURCE_H
 // This should be included after <time.h> and <sys/time.h> so as to make
 // sure we have the definitions for, e.g., `ru_utime'.
 # include <sys/resource.h>
@@ -124,16 +124,16 @@ typedef Polyhedron* POLYHEDRON_TYPE;
 
 namespace {
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 struct option long_options[] = {
   {"max-cpu",        required_argument, 0, 'C'},
   {"max-memory",     required_argument, 0, 'R'},
   {"help",           no_argument,       0, 'h'},
-  {"version",        no_argument,       0, 'V'},
   {"output",         required_argument, 0, 'o'},
   {"timings",        no_argument,       0, 't'},
   {"verbose",        no_argument,       0, 'v'},
 #if defined(USE_PPL)
+  {"version",        no_argument,       0, 'V'},
   {"check",          required_argument, 0, 'c'},
 #endif
   {0, 0, 0, 0}
@@ -145,14 +145,14 @@ static const char* usage_string
 "  -CSECS, --max-cpu=SECS  limits CPU usage to SECS seconds\n"
 "  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"
 "  -h, --help              prints this help text to stdout\n"
-"  -V, --version           prints version information to stdout\n"
 "  -oPATH, --output=PATH   appends output to PATH\n"
 "  -t, --timings           prints timings to stderr\n"
 "  -v, --verbose           produces lots of output\n"
 #if defined(USE_PPL)
+"  -V, --version           prints version information to stdout\n"
 "  -cPATH, --check=PATH    checks if the result is equal to what is in PATH\n"
 #endif
-#ifndef HAVE_GETOPT_H
+#ifndef PPL_HAVE_GETOPT_H
 "\n"
 "NOTE: this version does not support long options.\n"
 #endif
@@ -160,9 +160,9 @@ static const char* usage_string
 "Report bugs to <ppl-devel at cs.unipr.it>.\n";
 
 #if defined(USE_PPL)
-#define OPTION_LETTERS "C:R:hVo:tvc:"
+#define OPTION_LETTERS "C:R:ho:tvVc:"
 #else
-#define OPTION_LETTERS "C:R:hVo:tv"
+#define OPTION_LETTERS "C:R:ho:tv"
 #endif
 
 const char* program_name = 0;
@@ -295,7 +295,7 @@ set_alarm_on_cpu_time(const unsigned seconds, sig_handler_type handler) {
   }
 }
 
-#if HAVE_DECL_RLIMIT_AS
+#if PPL_HAVE_DECL_RLIMIT_AS
 void
 limit_virtual_memory(const unsigned bytes) {
   struct rlimit t;
@@ -313,7 +313,7 @@ limit_virtual_memory(const unsigned bytes) {
 void
 limit_virtual_memory(unsigned) {
 }
-#endif // !HAVE_DECL_RLIMIT_AS
+#endif // !PPL_HAVE_DECL_RLIMIT_AS
 
 extern "C" void
 timeout(int) {
@@ -338,7 +338,7 @@ timeout(int) {
 void
 process_options(int argc, char* argv[]) {
   while (true) {
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
     int option_index = 0;
     int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
 			&option_index);
@@ -361,11 +361,6 @@ process_options(int argc, char* argv[]) {
       exit(0);
       break;
 
-    case 'V':
-      fprintf(stdout, "%s\n", PPL_VERSION);
-      exit(0);
-      break;
-
     case 'C':
       l = strtol(optarg, &endptr, 10);
       if (*endptr || l < 0)
@@ -394,10 +389,19 @@ process_options(int argc, char* argv[]) {
       verbose = true;
       break;
 
+#if defined(USE_PPL)
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      exit(0);
+      break;
+
     case 'c':
       check_file_name = optarg;
       break;
 
+#endif
+
     default:
       abort();
     }
@@ -861,7 +865,7 @@ read_polyhedron(std::istream& in, POLYHEDRON_TYPE& ph) {
 
   if (rep == H) {
 #if defined(USE_PPL)
-    ph = PPL::C_Polyhedron(cs);
+    ph = PPL::C_Polyhedron(cs, PPL::Recycle_Input());
 #elif defined(USE_POLKA)
     ph = poly_universe(space_dim);
     ph = poly_add_constraints_lazy(ph, mat);
@@ -877,7 +881,7 @@ read_polyhedron(std::istream& in, POLYHEDRON_TYPE& ph) {
   }
   else {
 #if defined(USE_PPL)
-    ph = PPL::C_Polyhedron(gs);
+    ph = PPL::C_Polyhedron(gs, PPL::Recycle_Input());
 #elif defined(USE_POLKA)
     ph = poly_of_frames(mat);
 #elif defined(USE_POLYLIB)
diff --git a/demos/ppl_lpsol/Makefile.am b/demos/ppl_lpsol/Makefile.am
index 06c7f75..8d85bb2 100644
--- a/demos/ppl_lpsol/Makefile.am
+++ b/demos/ppl_lpsol/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -48,7 +48,6 @@ dummy.cc
 ppl_lpsol_LDADD = \
 -lglpk \
 $(top_builddir)/interfaces/C/libppl_c.la \
-$(top_builddir)/src/libppl.la \
 @extra_libraries@
 
 COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
@@ -58,6 +57,19 @@ if ASSERTIONS_ENABLED
 TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
 afiro.mps
 
+TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \
+opt1217.mps \
+rout.mps
+
+TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+pk1.mps \
+rout.mps
+
 EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
 
 CHECK_OPTION =
@@ -75,8 +87,19 @@ adlittle.mps \
 blend.mps \
 boeing1.mps \
 boeing2.mps \
+egout.mps \
 kb2.mps \
-mip.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
 sc105.mps \
 sc50a.mps \
 sc50b.mps \
@@ -84,8 +107,51 @@ ship08l.mps \
 $(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
 
 TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ship08l.mps\
+$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \
+$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \
+egout.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+pk1.mps \
+rout.mps
+
+LP_PROBLEMS = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+kb2.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
 ship08l.mps
 
+DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \
+adlittle.mps \
+boeing1.mps \
+boeing2.mps \
+rout.mps
+
+DO_NOT_CHECK_PROBLEMS = \
+ex12.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps
+
 if HOST_OS_CYGWIN
 
 DIFF_COMMAND = \
@@ -125,22 +191,25 @@ endif !HOST_OS_CYGWIN
 
 check-local: ppl_lpsol
 	echo $(ECHO_N) "$(ECHO_C)" >obtained
-	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+	echo $(LP_PROBLEMS) >lp_problems
+	echo $(DO_NOT_CHECK_PROBLEMS) >do_not_check_problems
 	LANG=C; \
-	for path in $(srcdir)/examples/*.mps; \
+	echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples
+	-for path in $(srcdir)/examples/*.mps; \
 	do \
 	  file=`basename $$path`; \
+	  grep $$file lp_problems >/dev/null 2>&1 && continue; \
+	  grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
 	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
-	  for m in -m -M; \
-	  do \
-	    echo "*** ppl_lpsol -e $$m -oobtained $$file" >>obtained; \
-	    ./ppl_lpsol -e $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
-	  done \
+	  echo "*** ppl_lpsol -s -n $$m -oobtained $$file" >>obtained; \
+	  ./ppl_lpsol -s -n $(CHECK_OPTION) -oobtained $$path >/dev/null; \
 	done
-	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
-	for path in $(srcdir)/examples/*.mps; \
+	echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples
+	-for path in $(srcdir)/examples/*.mps; \
 	do \
 	  file=`basename $$path`; \
+	  grep $$file lp_problems >/dev/null 2>&1 && continue; \
+	  grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
 	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
 	  for m in -m -M; \
 	  do \
@@ -148,13 +217,58 @@ check-local: ppl_lpsol
 	    ./ppl_lpsol -s $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
 	  done \
 	done
+	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+	echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location
+	-for path in $(srcdir)/examples/*.mps; \
+	do \
+	 file=`basename $$path`; \
+	 grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
+	 grep $$file tough_examples >/dev/null 2>&1 && continue; \
+	 verbosity='';\
+	 grep $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \
+	 for m in -m -M; \
+	 do \
+	    echo "*** ppl_lpsol -r -s $$m -oobtained $$file" >>obtained; \
+	    ./ppl_lpsol -r -s $(CHECK_OPTION) $$verbosity $$m -oobtained $$path >/dev/null; \
+	  done \
+	done
+	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+	-for path in $(srcdir)/examples/*.mps; \
+	do \
+	  file=`basename $$path`; \
+	  grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
+	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+	  echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \
+	  ./ppl_lpsol -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+	done
+	echo "*** ppl_lpsol -r -s -m -oobtained mas74.mps" >>obtained
+	-./ppl_lpsol -r -s -m $(CHECK_OPTION) $(srcdir)/examples/mas74.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps" >>obtained
+	-./ppl_lpsol -r -s -M -c0.000123 $(srcdir)/examples/mas74.mps $$m -oobtained >/dev/null
+	echo "*** ppl_lpsol -n -s -oobtained mas74.mps" >>obtained
+	-./ppl_lpsol -n -s $(CHECK_OPTION) $(srcdir)/examples/mas74.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -r -s -m -oobtained mas76.mps" >>obtained
+	-./ppl_lpsol -r -s -m $(CHECK_OPTION) $(srcdir)/examples/mas76.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps" >>obtained
+	-./ppl_lpsol -r -s -M -c0.000123 $(srcdir)/examples/mas76.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -n -s -oobtained mas76.mps" >>obtained
+	-./ppl_lpsol -n -s $(CHECK_OPTION) $(srcdir)/examples/mas76.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps" >>obtained
+	-./ppl_lpsol -r -s -m -c0.0000002 $(srcdir)/examples/modglob.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps" >>obtained
+	-./ppl_lpsol -r -s -M -c0.000003 $(srcdir)/examples/modglob.mps -oobtained >/dev/null
+	echo "*** ppl_lpsol -n -s -oobtained modglob.mps" >>obtained
+	-./ppl_lpsol -n -s $(CHECK_OPTION) $(srcdir)/examples/modglob.mps -oobtained >/dev/null
 	$(DIFF_COMMAND)
 
+endif HAVE_GLPK
+endif BUILD_C_INTERFACE
+
 MOSTLYCLEANFILES = \
+do_not_check_problems \
+do_not_output_location \
 tough_examples \
 obtained \
 expected_optima \
-obtained_optima
-
-endif HAVE_GLPK
-endif BUILD_C_INTERFACE
+obtained_optima \
+lp_problems
diff --git a/demos/ppl_lpsol/Makefile.in b/demos/ppl_lpsol/Makefile.in
index 50a89da..e0e60ec 100644
--- a/demos/ppl_lpsol/Makefile.in
+++ b/demos/ppl_lpsol/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -63,7 +59,8 @@ host_triplet = @host@
 subdir = demos/ppl_lpsol
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -73,8 +70,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -89,73 +96,56 @@ am__ppl_lpsol_SOURCES_DIST = ppl_lpsol.c dummy.cc
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	ppl_lpsol.$(OBJEXT) \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	dummy.$(OBJEXT)
 ppl_lpsol_OBJECTS = $(am_ppl_lpsol_OBJECTS)
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_DEPENDENCIES = $(top_builddir)/interfaces/C/libppl_c.la \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(top_builddir)/src/libppl.la
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_DEPENDENCIES = $(top_builddir)/interfaces/C/libppl_c.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(ppl_lpsol_SOURCES)
 DIST_SOURCES = $(am__ppl_lpsol_SOURCES_DIST)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -165,53 +155,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -220,56 +208,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -281,10 +243,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -293,24 +259,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 SUBDIRS = examples
 EXTRA_DIST = \
@@ -335,13 +319,25 @@ expected_int64_a
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_LDADD = \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at -lglpk \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/interfaces/C/libppl_c.la \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/src/libppl.la \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_libraries@
 
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
 @ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
 @ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps
 
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
 @ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
 @ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION = -c
@@ -351,8 +347,19 @@ expected_int64_a
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at egout.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mip.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at lseu.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at p0033.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
@@ -360,8 +367,51 @@ expected_int64_a
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
 
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps\
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at egout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at lseu.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at LP_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at bgprtr.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sample.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps
 
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at DO_NOT_CHECK_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ex12.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps
+
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_FALSE at DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE at DIFF_COMMAND = \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE at grep "^Optimum value: " $(srcdir)/$(EXPECTED) \
@@ -380,11 +430,14 @@ expected_int64_a
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& grep "^Optimum value: " obtained >obtained_optima \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& diff -u expected_optima obtained_optima
 
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at MOSTLYCLEANFILES = \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at tough_examples \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at obtained \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at expected_optima \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at obtained_optima
+MOSTLYCLEANFILES = \
+do_not_check_problems \
+do_not_output_location \
+tough_examples \
+obtained \
+expected_optima \
+obtained_optima \
+lp_problems
 
 all: all-recursive
 
@@ -421,15 +474,15 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
 	@list='$(bin_PROGRAMS)'; for p in $$list; do \
 	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
 	  if test -f $$p \
 	     || test -f $$p1 \
 	  ; then \
 	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
 	  else :; fi; \
 	done
 
@@ -449,7 +502,7 @@ clean-binPROGRAMS:
 	done
 ppl_lpsol$(EXEEXT): $(ppl_lpsol_OBJECTS) $(ppl_lpsol_DEPENDENCIES) 
 	@rm -f ppl_lpsol$(EXEEXT)
-	$(CXXLINK) $(ppl_lpsol_LDFLAGS) $(ppl_lpsol_OBJECTS) $(ppl_lpsol_LDADD) $(LIBS)
+	$(CXXLINK) $(ppl_lpsol_OBJECTS) $(ppl_lpsol_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -461,43 +514,43 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lpsol.Po at am__quote@
 
 .c.o:
- at am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c $<
 
 .c.obj:
- at am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .c.lo:
- at am__fastdepCC_TRUE@	if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -508,10 +561,6 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -543,8 +592,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -588,8 +636,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -614,8 +662,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -625,13 +673,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -645,22 +692,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -674,7 +720,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -682,6 +728,8 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -695,7 +743,7 @@ all-am: Makefile $(PROGRAMS)
 installdirs: installdirs-recursive
 installdirs-am:
 	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-recursive
 install-exec: install-exec-recursive
@@ -730,7 +778,7 @@ distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-recursive
 
@@ -744,12 +792,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am: install-binPROGRAMS
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -770,44 +826,49 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+uninstall-am: uninstall-binPROGRAMS
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	check-local clean clean-binPROGRAMS clean-generic \
-	clean-libtool clean-recursive ctags ctags-recursive distclean \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am check-local clean clean-binPROGRAMS \
+	clean-generic clean-libtool ctags ctags-recursive distclean \
 	distclean-compile distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
-	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-binPROGRAMS uninstall-info-am
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am \
+	uninstall-binPROGRAMS
 
 
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at check-local: ppl_lpsol
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(ECHO_N) "$(ECHO_C)" >obtained
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(LP_PROBLEMS) >lp_problems
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(DO_NOT_CHECK_PROBLEMS) >do_not_check_problems
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	LANG=C; \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file lp_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  for m in -m -M; \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  do \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    echo "*** ppl_lpsol -e $$m -oobtained $$file" >>obtained; \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    ./ppl_lpsol -e $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  echo "*** ppl_lpsol -s -n $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  ./ppl_lpsol -s -n $(CHECK_OPTION) -oobtained $$path >/dev/null; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
- at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file lp_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  for m in -m -M; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  do \
@@ -815,6 +876,48 @@ uninstall-info: uninstall-info-recursive
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    ./ppl_lpsol -s $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 verbosity='';\
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 grep $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    echo "*** ppl_lpsol -r -s $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    ./ppl_lpsol -r -s $(CHECK_OPTION) $$verbosity $$m -oobtained $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file do_not_check_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  ./ppl_lpsol -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -r -s -m -oobtained mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -r -s -m $(CHECK_OPTION) $(srcdir)/examples/mas74.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -r -s -M -c0.000123 $(srcdir)/examples/mas74.mps $$m -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -n -s -oobtained mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -n -s $(CHECK_OPTION) $(srcdir)/examples/mas74.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -r -s -m -oobtained mas76.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -r -s -m $(CHECK_OPTION) $(srcdir)/examples/mas76.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -r -s -M -c0.000123 $(srcdir)/examples/mas76.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -n -s -oobtained mas76.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -n -s $(CHECK_OPTION) $(srcdir)/examples/mas76.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -r -s -m -c0.0000002 $(srcdir)/examples/modglob.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -r -s -M -c0.000003 $(srcdir)/examples/modglob.mps -oobtained >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo "*** ppl_lpsol -n -s -oobtained modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-./ppl_lpsol -n -s $(CHECK_OPTION) $(srcdir)/examples/modglob.mps -oobtained >/dev/null
 @BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(DIFF_COMMAND)
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/demos/ppl_lpsol/examples/Makefile.am b/demos/ppl_lpsol/examples/Makefile.am
index e10393f..ec3b973 100644
--- a/demos/ppl_lpsol/examples/Makefile.am
+++ b/demos/ppl_lpsol/examples/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,9 +27,22 @@ bgprtr.mps \
 blend.mps \
 boeing1.mps \
 boeing2.mps \
+egout.mps \
+ex12.mps \
 ex1.mps \
 kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
 mip.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
 sample.mps \
 sc105.mps \
 sc50a.mps \
diff --git a/demos/ppl_lpsol/examples/Makefile.in b/demos/ppl_lpsol/examples/Makefile.in
index 82c7b70..2a76c79 100644
--- a/demos/ppl_lpsol/examples/Makefile.in
+++ b/demos/ppl_lpsol/examples/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ subdir = demos/ppl_lpsol/examples
 DIST_COMMON = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -85,39 +92,18 @@ DIST_SOURCES =
 DATA = $(dist_noinst_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -127,53 +113,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -182,56 +166,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -243,10 +201,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -255,24 +217,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 dist_noinst_DATA = \
 adlittle.mps \
@@ -281,9 +261,22 @@ bgprtr.mps \
 blend.mps \
 boeing1.mps \
 boeing2.mps \
+egout.mps \
+ex12.mps \
 ex1.mps \
 kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
 mip.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
 sample.mps \
 sc105.mps \
 sc50a.mps \
@@ -329,10 +322,6 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 tags: TAGS
 TAGS:
 
@@ -341,22 +330,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -401,7 +389,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -415,12 +403,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -439,17 +435,20 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
 	distclean distclean-generic distclean-libtool distdir dvi \
 	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
 	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/demos/ppl_lpsol/examples/README b/demos/ppl_lpsol/examples/README
index 91cfe27..671c211 100644
--- a/demos/ppl_lpsol/examples/README
+++ b/demos/ppl_lpsol/examples/README
@@ -1,7 +1,9 @@
-Most of the examples in this directory have been taken from the `lp'
-library of Netlib [1].
-
+Most of the examples in this directory have been taken from:
+  - the `lp' library of Netlib [1];
+  - the problem sets MIPLIB 3.0 [2] and MIPLIB 2003 [3].
 
 --------
 
-[1] http://www.netlib.org/
+[1] http://www.netlib.org/lp/index.html
+[2] http://miplib.zib.de/miplib3/miplib3.html
+[3] http://miplib.zib.de/miplib2003.php
diff --git a/demos/ppl_lpsol/examples/egout.mps b/demos/ppl_lpsol/examples/egout.mps
new file mode 100644
index 0000000..dab1108
--- /dev/null
+++ b/demos/ppl_lpsol/examples/egout.mps
@@ -0,0 +1,403 @@
+*NAME:         egout
+*ROWS:         98
+*COLUMNS:      141
+*INTEGER:      55
+*NONZERO:      282
+*BEST SOLN:    568.101 (opt)
+*LP SOLN:      149.589
+*SOURCE:       Etienne Loute (Univ. of Louvain)
+*              Laurence A. Wolsey (Univ. of Louvain)
+*              Martin Savelsbergh (Eindhoven Univ. of Technology)
+*APPLICATION:  drainage system design, 42 nodes, 55 arcs
+*COMMENTS:     all integer variables are binary
+*              solution reported by Martin W. P. Savelsbergh
+*      
+NAME          EGOUT
+ROWS
+ N  COST    
+ E  ...     
+ E  001     
+ E  002     
+ E  004     
+ E  006     
+ E  007     
+ E  009     
+ E  010     
+ E  011     
+ E  013     
+ E  014     
+ E  015     
+ E  017     
+ E  019     
+ E  020     
+ E  021     
+ E  023     
+ E  025     
+ E  026     
+ E  028     
+ E  029     
+ E  030     
+ E  031     
+ E  033     
+ E  034     
+ E  035     
+ E  036     
+ E  038     
+ E  039     
+ E  040     
+ E  041     
+ E  042     
+ E  003     
+ E  005     
+ E  008     
+ E  012     
+ E  016     
+ E  018     
+ E  024     
+ E  022     
+ E  027     
+ E  032     
+ E  037     
+ L  U.001...
+ L  U.001003
+ L  U.002003
+ L  U.002...
+ L  U.003005
+ L  U.004005
+ L  U.004...
+ L  U.005007
+ L  U.006007
+ L  U.007008
+ L  U.008...
+ L  U.008009
+ L  U.010012
+ L  U.011012
+ L  U.012...
+ L  U.012013
+ L  U.013016
+ L  U.014015
+ L  U.015016
+ L  U.016...
+ L  U.016017
+ L  U.017018
+ L  U.009018
+ L  U.018019
+ L  U.019024
+ L  U.024...
+ L  U.023024
+ L  U.022023
+ L  U.020022
+ L  U.021022
+ L  U.022...
+ L  U.024026
+ L  U.025026
+ L  U.025...
+ L  U.026027
+ L  U.027...
+ L  U.027032
+ L  U.030031
+ L  U.031032
+ L  U.029031
+ L  U.028029
+ L  U.028...
+ L  U.032033
+ L  U.033037
+ L  U.036037
+ L  U.034036
+ L  U.035036
+ L  U.037038
+ L  U.038040
+ L  U.039040
+ L  U.040...
+ L  U.041...
+ L  U.040041
+ L  U.041042
+ L  U.042...
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    I.001...  COST             28.21   U.001...       -117.04
+    I.001003  COST             18.57   U.001003       -117.04
+    I.002003  COST              8.45   U.002003       -117.04
+    I.002...  COST             21.16   U.002...       -117.04
+    I.003005  COST             28.38   U.003005       -117.04
+    I.004005  COST               9.8   U.004005       -117.04
+    I.004...  COST             23.29   U.004...       -117.04
+    I.005007  COST              5.07   U.005007       -117.04
+    I.006007  COST              6.78   U.006007       -117.04
+    I.007008  COST               2.9   U.007008       -117.04
+    I.008...  COST             27.89   U.008...       -117.04
+    I.008009  COST             10.03   U.008009       -117.04
+    I.010012  COST             14.74   U.010012       -117.04
+    I.011012  COST              6.19   U.011012       -117.04
+    I.012...  COST              22.1   U.012...       -117.04
+    I.012013  COST             15.82   U.012013       -117.04
+    I.013016  COST             11.33   U.013016       -117.04
+    I.014015  COST              5.79   U.014015       -117.04
+    I.015016  COST               3.9   U.015016       -117.04
+    I.016...  COST             24.79   U.016...       -117.04
+    I.016017  COST             16.36   U.016017       -117.04
+    I.017018  COST              3.45   U.017018       -117.04
+    I.009018  COST              2.26   U.009018       -117.04
+    I.018019  COST              3.86   U.018019       -117.04
+    I.019024  COST              8.41   U.019024       -117.04
+    I.024...  COST             26.46   U.024...       -117.04
+    I.023024  COST             16.01   U.023024       -117.04
+    I.022023  COST             16.73   U.022023       -117.04
+    I.020022  COST             11.75   U.020022       -117.04
+    I.021022  COST              3.25   U.021022       -117.04
+    I.022...  COST             27.41   U.022...       -117.04
+    I.024026  COST              5.98   U.024026       -117.04
+    I.025026  COST             21.88   U.025026       -117.04
+    I.025...  COST             43.71   U.025...       -117.04
+    I.026027  COST             11.42   U.026027       -117.04
+    I.027...  COST              23.4   U.027...       -117.04
+    I.027032  COST               7.5   U.027032       -117.04
+    I.030031  COST              6.73   U.030031       -117.04
+    I.031032  COST              5.92   U.031032       -117.04
+    I.029031  COST               9.7   U.029031       -117.04
+    I.028029  COST             12.67   U.028029       -117.04
+    I.028...  COST             26.45   U.028...       -117.04
+    I.032033  COST              2.71   U.032033       -117.04
+    I.033037  COST              5.89   U.033037       -117.04
+    I.036037  COST              9.85   U.036037       -117.04
+    I.034036  COST               8.5   U.034036       -117.04
+    I.035036  COST                 9   U.035036       -117.04
+    I.037038  COST              2.27   U.037038       -117.04
+    I.038040  COST              6.37   U.038040       -117.04
+    I.039040  COST              16.2   U.039040       -117.04
+    I.040...  COST             23.58   U.040...       -117.04
+    I.041...  COST             29.93   U.041...       -117.04
+    I.040041  COST              6.73   U.040041       -117.04
+    I.041042  COST             20.66   U.041042       -117.04
+    I.042...  COST             30.92   U.042...       -117.04
+    MARK0001  'MARKER'                 'INTEND'
+    F....001  ...                  1   001                 -1
+    F....002  ...                  1   002                 -1
+    F....004  ...                  1   004                 -1
+    F....006  ...                  1   006                 -1
+    F....007  ...                  1   007                 -1
+    F....009  ...                  1   009                 -1
+    F....010  ...                  1   010                 -1
+    F....011  ...                  1   011                 -1
+    F....013  ...                  1   013                 -1
+    F....014  ...                  1   014                 -1
+    F....015  ...                  1   015                 -1
+    F....017  ...                  1   017                 -1
+    F....019  ...                  1   019                 -1
+    F....020  ...                  1   020                 -1
+    F....021  ...                  1   021                 -1
+    F....023  ...                  1   023                 -1
+    F....025  ...                  1   025                 -1
+    F....026  ...                  1   026                 -1
+    F....028  ...                  1   028                 -1
+    F....029  ...                  1   029                 -1
+    F....030  ...                  1   030                 -1
+    F....031  ...                  1   031                 -1
+    F....033  ...                  1   033                 -1
+    F....034  ...                  1   034                 -1
+    F....035  ...                  1   035                 -1
+    F....036  ...                  1   036                 -1
+    F....038  ...                  1   038                 -1
+    F....039  ...                  1   039                 -1
+    F....040  ...                  1   040                 -1
+    F....041  ...                  1   041                 -1
+    F....042  ...                  1   042                 -1
+    F.001...  COST             0.979   ...                 -1
+    F.001...  001                  1   U.001...             1
+    F.001003  COST             0.034   001                  1
+    F.001003  003                 -1   U.001003             1
+    F.002003  COST             0.016   002                  1
+    F.002003  003                 -1   U.002003             1
+    F.002...  COST             0.914   ...                 -1
+    F.002...  002                  1   U.002...             1
+    F.003005  COST             0.057   003                  1
+    F.003005  005                 -1   U.003005             1
+    F.004005  COST             0.016   004                  1
+    F.004005  005                 -1   U.004005             1
+    F.004...  COST             0.969   ...                 -1
+    F.004...  004                  1   U.004...             1
+    F.005007  COST             0.006   007                 -1
+    F.005007  005                  1   U.005007             1
+    F.006007  COST              0.01   006                  1
+    F.006007  007                 -1   U.006007             1
+    F.007008  COST             0.002   007                  1
+    F.007008  008                 -1   U.007008             1
+    F.008...  COST             0.976   ...                 -1
+    F.008...  008                  1   U.008...             1
+    F.008009  COST             0.017   009                 -1
+    F.008009  008                  1   U.008009             1
+    F.010012  COST             0.027   010                  1
+    F.010012  012                 -1   U.010012             1
+    F.011012  COST             0.009   011                  1
+    F.011012  012                 -1   U.011012             1
+    F.012...  COST             0.964   ...                 -1
+    F.012...  012                  1   U.012...             1
+    F.012013  COST             0.025   013                 -1
+    F.012013  012                  1   U.012013             1
+    F.013016  COST             0.015   013                  1
+    F.013016  016                 -1   U.013016             1
+    F.014015  COST              0.01   014                  1
+    F.014015  015                 -1   U.014015             1
+    F.015016  COST             0.006   015                  1
+    F.015016  016                 -1   U.015016             1
+    F.016...  COST              0.97   ...                 -1
+    F.016...  016                  1   U.016...             1
+    F.016017  COST             0.022   017                 -1
+    F.016017  016                  1   U.016017             1
+    F.017018  COST             0.003   017                  1
+    F.017018  018                 -1   U.017018             1
+    F.009018  COST             0.002   009                  1
+    F.009018  018                 -1   U.009018             1
+    F.018019  COST             0.004   019                 -1
+    F.018019  018                  1   U.018019             1
+    F.019024  COST             0.969   019                  1
+    F.019024  024                 -1   U.019024             1
+    F.024...  COST             0.021   ...                 -1
+    F.024...  024                  1   U.024...             1
+    F.023024  COST             0.026   023                  1
+    F.023024  024                 -1   U.023024             1
+    F.022023  COST             0.022   023                 -1
+    F.022023  022                  1   U.022023             1
+    F.020022  COST             0.005   020                  1
+    F.020022  022                 -1   U.020022             1
+    F.021022  COST             0.971   021                  1
+    F.021022  022                 -1   U.021022             1
+    F.022...  COST             0.004   ...                 -1
+    F.022...  022                  1   U.022...             1
+    F.024026  COST             0.054   026                 -1
+    F.024026  024                  1   U.024026             1
+    F.025026  COST             0.054   025                  1
+    F.025026  026                 -1   U.025026             1
+    F.025...  COST             1.017   ...                 -1
+    F.025...  025                  1   U.025...             1
+    F.026027  COST              0.02   026                  1
+    F.026027  027                 -1   U.026027             1
+    F.027...  COST             0.967   ...                 -1
+    F.027...  027                  1   U.027...             1
+    F.027032  COST             0.011   027                  1
+    F.027032  032                 -1   U.027032             1
+    F.030031  COST             0.012   030                  1
+    F.030031  031                 -1   U.030031             1
+    F.031032  COST             0.004   031                  1
+    F.031032  032                 -1   U.031032             1
+    F.029031  COST             0.012   029                  1
+    F.029031  031                 -1   U.029031             1
+    F.028029  COST             0.024   028                  1
+    F.028029  029                 -1   U.028029             1
+    F.028...  COST             0.975   ...                 -1
+    F.028...  028                  1   U.028...             1
+    F.032033  COST             0.002   033                 -1
+    F.032033  032                  1   U.032033             1
+    F.033037  COST             0.004   033                  1
+    F.033037  037                 -1   U.033037             1
+    F.036037  COST             0.018   036                  1
+    F.036037  037                 -1   U.036037             1
+    F.034036  COST             0.016   034                  1
+    F.034036  036                 -1   U.034036             1
+    F.035036  COST             0.015   035                  1
+    F.035036  036                 -1   U.035036             1
+    F.037038  COST             0.001   038                 -1
+    F.037038  037                  1   U.037038             1
+    F.038040  COST             0.009   038                  1
+    F.038040  040                 -1   U.038040             1
+    F.039040  COST             0.025   039                  1
+    F.039040  040                 -1   U.039040             1
+    F.040...  COST             0.967   ...                 -1
+    F.040...  040                  1   U.040...             1
+    F.041...  COST              0.98   ...                 -1
+    F.041...  041                  1   U.041...             1
+    F.040041  COST              0.01   040                  1
+    F.040041  041                 -1   U.040041             1
+    F.041042  COST             0.035   041                  1
+    F.041042  042                 -1   U.041042             1
+    F.042...  COST             0.978   ...                 -1
+    F.042...  042                  1   U.042...             1
+RHS
+BOUNDS
+ UP BOUNDS    I.001...             1
+ UP BOUNDS    I.001003             1
+ UP BOUNDS    I.002003             1
+ UP BOUNDS    I.002...             1
+ UP BOUNDS    I.003005             1
+ UP BOUNDS    I.004005             1
+ UP BOUNDS    I.004...             1
+ UP BOUNDS    I.005007             1
+ UP BOUNDS    I.006007             1
+ UP BOUNDS    I.007008             1
+ UP BOUNDS    I.008...             1
+ UP BOUNDS    I.008009             1
+ UP BOUNDS    I.010012             1
+ UP BOUNDS    I.011012             1
+ UP BOUNDS    I.012...             1
+ UP BOUNDS    I.012013             1
+ UP BOUNDS    I.013016             1
+ UP BOUNDS    I.014015             1
+ UP BOUNDS    I.015016             1
+ UP BOUNDS    I.016...             1
+ UP BOUNDS    I.016017             1
+ UP BOUNDS    I.017018             1
+ UP BOUNDS    I.009018             1
+ UP BOUNDS    I.018019             1
+ UP BOUNDS    I.019024             1
+ UP BOUNDS    I.024...             1
+ UP BOUNDS    I.023024             1
+ UP BOUNDS    I.022023             1
+ UP BOUNDS    I.020022             1
+ UP BOUNDS    I.021022             1
+ UP BOUNDS    I.022...             1
+ UP BOUNDS    I.024026             1
+ UP BOUNDS    I.025026             1
+ UP BOUNDS    I.025...             1
+ UP BOUNDS    I.026027             1
+ UP BOUNDS    I.027...             1
+ UP BOUNDS    I.027032             1
+ UP BOUNDS    I.030031             1
+ UP BOUNDS    I.031032             1
+ UP BOUNDS    I.029031             1
+ UP BOUNDS    I.028029             1
+ UP BOUNDS    I.028...             1
+ UP BOUNDS    I.032033             1
+ UP BOUNDS    I.033037             1
+ UP BOUNDS    I.036037             1
+ UP BOUNDS    I.034036             1
+ UP BOUNDS    I.035036             1
+ UP BOUNDS    I.037038             1
+ UP BOUNDS    I.038040             1
+ UP BOUNDS    I.039040             1
+ UP BOUNDS    I.040...             1
+ UP BOUNDS    I.041...             1
+ UP BOUNDS    I.040041             1
+ UP BOUNDS    I.041042             1
+ UP BOUNDS    I.042...             1
+ FX BOUNDS    F....001          2.45
+ FX BOUNDS    F....002          0.61
+ FX BOUNDS    F....004          7.91
+ FX BOUNDS    F....006          4.54
+ FX BOUNDS    F....007          1.14
+ FX BOUNDS    F....009          0.28
+ FX BOUNDS    F....010          1.13
+ FX BOUNDS    F....011         21.46
+ FX BOUNDS    F....013          4.64
+ FX BOUNDS    F....014          0.31
+ FX BOUNDS    F....015          1.24
+ FX BOUNDS    F....017          0.07
+ FX BOUNDS    F....019          2.41
+ FX BOUNDS    F....020          0.39
+ FX BOUNDS    F....021          7.41
+ FX BOUNDS    F....023          0.07
+ FX BOUNDS    F....025         19.22
+ FX BOUNDS    F....026         10.49
+ FX BOUNDS    F....028          0.88
+ FX BOUNDS    F....029           5.7
+ FX BOUNDS    F....030          0.28
+ FX BOUNDS    F....031          0.28
+ FX BOUNDS    F....033          0.19
+ FX BOUNDS    F....034          0.19
+ FX BOUNDS    F....035          0.28
+ FX BOUNDS    F....036          0.57
+ FX BOUNDS    F....038           5.3
+ FX BOUNDS    F....039          5.32
+ FX BOUNDS    F....040          0.76
+ FX BOUNDS    F....041          5.08
+ FX BOUNDS    F....042          6.44
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ex12.mps b/demos/ppl_lpsol/examples/ex12.mps
new file mode 100644
index 0000000..755462b
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex12.mps
@@ -0,0 +1,25 @@
+* Problem:    UNKNOWN
+* Class:      MIP
+* Rows:       2
+* Columns:    2 (1 integer, 0 binary)
+* Non-zeros:  4
+* Format:     Fixed MPS
+*
+NAME
+ROWS
+ N  R0000000
+ L  R0000001
+ L  R0000002
+COLUMNS
+    M0000001  'MARKER'                 'INTORG'
+    C0000001  R0000000             4   R0000001           0.7
+    C0000001  R0000002           0.1
+    M0000002  'MARKER'                 'INTEND'
+    C0000002  R0000000             1   R0000001             1
+    C0000002  R0000002         0.025
+RHS
+    RHS1      R0000001           630   R0000002           135
+BOUNDS
+ LO BND1      C0000002            20
+ UP BND1      C0000002           500
+ENDATA
diff --git a/demos/ppl_lpsol/examples/lseu.mps b/demos/ppl_lpsol/examples/lseu.mps
new file mode 100644
index 0000000..00e6b5a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/lseu.mps
@@ -0,0 +1,371 @@
+*NAME:         lseu   
+*ROWS:         28
+*COLUMNS:      89
+*INTEGER:      89
+*NONZERO:      309
+*BEST SOLN:    1120 (opt)
+*LP SOLN:      834.68
+*SOURCE:       C. E. Lemke and K. Spielberg
+*              Ellis L. Johnson and Uwe H. Suhl 
+*              John J. Forrest (IBM)
+*APPLICATION:  unknown
+*COMMENTS:     pure 0/1 IP
+*              
+*      
+NAME          LSEU
+ROWS
+ N  R100    
+ L  R101    
+ L  R102    
+ L  R103    
+ L  R104    
+ L  R105    
+ L  R106    
+ L  R107    
+ L  R108    
+ L  R109    
+ L  R110    
+ L  R111    
+ L  R112    
+ L  R113    
+ L  R114    
+ L  R115    
+ L  R116    
+ L  R117    
+ L  R118    
+ L  R119    
+ L  R120    
+ L  R121    
+ L  R122    
+ L  R123    
+ L  R124    
+ L  R125    
+ L  R126    
+ L  R127    
+ L  R128    
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    C101      R100                 7   R119               525
+    C101      R120              -525   R122              -525
+    C101      R123              -525
+    C102      R100                10   R119               500
+    C102      R120              -500   R122              -500
+    C102      R123              -500
+    C103      R100               179   R101                 1
+    C103      R119               475   R120              -475
+    C103      R124              -475   R125              -475
+    C104      R100               186   R101                 1
+    C104      R119               475   R120              -475
+    C104      R122              -475   R123              -475
+    C105      R100               179   R101                 1
+    C105      R119               475   R120              -475
+    C105      R122              -190   R123              -190
+    C105      R124              -285   R125              -285
+    C106      R102                 1   R118              -450
+    C107      R102                 1   R124              -450
+    C107      R125              -450
+    C108      R100                 6   R102                 1
+    C108      R122              -450   R123              -450
+    C109      R102                 1   R122              -165
+    C109      R123              -165   R124              -285
+    C109      R125              -285
+    C110      R102                 1   R124              -150
+    C110      R125              -150
+    C111      R100               164   R103                 1
+    C111      R118              -435
+    C112      R100               164   R103                 1
+    C112      R124              -435   R125              -435
+    C113      R100               170   R103                 1
+    C113      R119               435   R120              -435
+    C113      R123              -435
+    C114      R100               164   R103                 1
+    C114      R119               435   R120              -435
+    C114      R121              -435
+    C115      R100               346   R104                 1
+    C115      R124              -435   R125              -435
+    C116      R100               346   R104                 1
+    C116      R119               435   R120              -435
+    C116      R125              -435
+    C117      R100               248   R105                 1
+    C117      R119               435   R120              -435
+    C117      R124              -435   R125              -435
+    C118      R100               253   R105                 1
+    C118      R119               435   R120              -435
+    C118      R122              -435   R123              -435
+    C119      R100               248   R105                 1
+    C119      R119               435   R120              -435
+    C119      R122              -300   R123              -300
+    C119      R124              -135   R125              -135
+    C120      R100               346   R106                 1
+    C120      R118              -435
+    C121      R100               346   R106                 1
+    C121      R123              -400
+    C122      R100               346   R106                 1
+    C122      R121              -400
+    C123      R100               346   R106                 1
+    C123      R124              -100   R125              -100
+    C123      R127              -300
+    C124      R100               160   R107                 1
+    C124      R124              -400   R125              -400
+    C125      R100               161   R107                 1
+    C125      R122              -400   R123              -400
+    C126      R100               160   R107                 1
+    C126      R122              -115   R123              -115
+    C126      R124              -285   R125              -285
+    C127      R100               160   R107                 1
+    C127      R119               425   R120              -425
+    C127      R125              -425
+    C128      R100               161   R107                 1
+    C128      R119               425   R120              -425
+    C128      R123              -425
+    C129      R100               160   R107                 1
+    C129      R119               425   R120              -425
+    C129      R123              -140   R125              -285
+    C130      R100               160   R107                 1
+    C130      R124              -100   R125              -100
+    C130      R126              -300   R127              -300
+    C131      R100               278   R108                 1
+    C131      R118              -350
+    C132      R100               278   R108                 1
+    C132      R124              -350   R125              -350
+    C133      R100               278   R108                 1
+    C133      R121              -350
+    C134      R100                86   R109                 1
+    C134      R122              -330   R123              -330
+    C135      R100                86   R109                 1
+    C135      R126              -330   R127              -330
+    C136      R100                86   R109                 1
+    C136      R119               330   R120              -330
+    C136      R124              -330   R125              -330
+    C137      R100                86   R109                 1
+    C137      R119               330   R120              -330
+    C137      R123              -330
+    C138      R100                86   R109                 1
+    C138      R119               330   R120              -330
+    C138      R121              -330
+    C139      R100                86   R119               330
+    C139      R120              -330   R122              -330
+    C139      R123              -330
+    C140      R100               188   R110                 1
+    C140      R122              -330   R123              -330
+    C141      R100               188   R110                 1
+    C141      R119               330   R120              -330
+    C141      R124              -330   R125              -330
+    C142      R100               188   R110                 1
+    C142      R119               330   R120              -330
+    C142      R121              -330
+    C143      R100                85   R111                 1
+    C143      R122              -325   R123              -325
+    C144      R100                85   R111                 1
+    C144      R126              -325   R127              -325
+    C145      R100                85   R111                 1
+    C145      R119               325   R120              -325
+    C145      R124              -325   R125              -325
+    C146      R100                85   R111                 1
+    C146      R119               325   R120              -325
+    C146      R123              -325
+    C147      R100                85   R111                 1
+    C147      R119               325   R120              -325
+    C147      R121              -325
+    C148      R100                78   R112                 1
+    C148      R122              -300   R123              -300
+    C149      R100                78   R112                 1
+    C149      R119               300   R120              -300
+    C149      R124              -300   R125              -300
+    C150      R100                78   R112                 1
+    C150      R119               300   R120              -300
+    C150      R121              -300
+    C151      R100                78   R112                 1
+    C151      R128              -300
+    C152      R100                78   R113                 1
+    C152      R122              -300   R123              -300
+    C153      R100                78   R113                 1
+    C153      R126              -300   R127              -300
+    C154      R100                78   R113                 1
+    C154      R119               300   R120              -300
+    C154      R124              -300   R125              -300
+    C155      R100                78   R113                 1
+    C155      R119               300   R120              -300
+    C155      R123              -300
+    C156      R100                78   R113                 1
+    C156      R119               300   R120              -300
+    C156      R121              -300
+    C157      R100               171   R114                 1
+    C157      R122              -300   R123              -300
+    C158      R100               171   R114                 1
+    C158      R126              -300   R127              -300
+    C159      R100               171   R114                 1
+    C159      R119               300   R120              -300
+    C159      R123              -300
+    C160      R100               171   R114                 1
+    C160      R119               300   R120              -300
+    C160      R121              -300
+    C161      R100               163   R115                 1
+    C161      R119               285   R120              -285
+    C161      R124              -285   R125              -285
+    C162      R100               163   R115                 1
+    C162      R119               285   R120              -285
+    C162      R122              -285   R123              -285
+    C163      R100               163   R115                 1
+    C163      R128              -285
+    C164      R100                69   R116                 1
+    C164      R119               265   R120              -265
+    C164      R124              -265   R125              -265
+    C165      R100                69   R116                 1
+    C165      R119               265   R120              -265
+    C165      R122              -265   R123              -265
+    C166      R100               183   R117                 1
+    C166      R118              -230
+    C167      R100               183   R117                 1
+    C167      R124              -230   R125              -230
+    C168      R100               183   R117                 1
+    C168      R119               230   R120              -230
+    C168      R125              -230
+    C169      R100               183   R117                 1
+    C169      R119               230   R120              -230
+    C169      R123              -230
+    C170      R100                49   R119               190
+    C170      R120              -190   R122              -190
+    C170      R123              -190
+    C171      R100               183   R117                 1
+    C172      R100               258   R118              -200
+    C173      R100               517   R118              -400
+    C174      R100               250   R126              -200
+    C174      R127              -200
+    C175      R100               500   R126              -400
+    C175      R127              -400
+    C176      R100               250   R127              -200
+    C177      R100               500   R127              -400
+    C178      R100               159   R119               200
+    C178      R120              -200   R124              -200
+    C178      R125              -200
+    C179      R100               318   R119               400
+    C179      R120              -400   R124              -400
+    C179      R125              -400
+    C180      R100               159   R119               200
+    C180      R120              -200   R125              -200
+    C181      R100               318   R119               400
+    C181      R120              -400   R125              -400
+    C182      R100               159   R119               200
+    C182      R120              -200   R122              -200
+    C182      R123              -200
+    C183      R100               318   R119               400
+    C183      R120              -400   R122              -400
+    C183      R123              -400
+    C184      R100               159   R119               200
+    C184      R120              -200   R123              -200
+    C185      R100               318   R119               400
+    C185      R120              -400   R123              -400
+    C186      R100               114   R119               200
+    C186      R120              -200   R121              -200
+    C187      R100               228   R119               400
+    C187      R120              -400   R121              -400
+    C188      R100               159   R128              -200
+    C189      R100               318   R128              -400
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       R101                 1   R102                 1
+    RHS       R103                 1   R104                 1
+    RHS       R105                 1   R106                 1
+    RHS       R107                 1   R108                 1
+    RHS       R109                 1   R110                 1
+    RHS       R111                 1   R112                 1
+    RHS       R113                 1   R114                 1
+    RHS       R115                 1   R116                 1
+    RHS       R117                 1   R118              -190
+    RHS       R119              2700   R120             -2600
+    RHS       R121              -630   R122              -900
+    RHS       R123             -1656   R124              -335
+    RHS       R125             -1026   R126              -150
+    RHS       R127              -500   R128              -270
+BOUNDS
+ UP ONE       C101                 1
+ UP ONE       C102                 1
+ UP ONE       C103                 1
+ UP ONE       C104                 1
+ UP ONE       C105                 1
+ UP ONE       C106                 1
+ UP ONE       C107                 1
+ UP ONE       C108                 1
+ UP ONE       C109                 1
+ UP ONE       C110                 1
+ UP ONE       C111                 1
+ UP ONE       C112                 1
+ UP ONE       C113                 1
+ UP ONE       C114                 1
+ UP ONE       C115                 1
+ UP ONE       C116                 1
+ UP ONE       C117                 1
+ UP ONE       C118                 1
+ UP ONE       C119                 1
+ UP ONE       C120                 1
+ UP ONE       C121                 1
+ UP ONE       C122                 1
+ UP ONE       C123                 1
+ UP ONE       C124                 1
+ UP ONE       C125                 1
+ UP ONE       C126                 1
+ UP ONE       C127                 1
+ UP ONE       C128                 1
+ UP ONE       C129                 1
+ UP ONE       C130                 1
+ UP ONE       C131                 1
+ UP ONE       C132                 1
+ UP ONE       C133                 1
+ UP ONE       C134                 1
+ UP ONE       C135                 1
+ UP ONE       C136                 1
+ UP ONE       C137                 1
+ UP ONE       C138                 1
+ UP ONE       C139                 1
+ UP ONE       C140                 1
+ UP ONE       C141                 1
+ UP ONE       C142                 1
+ UP ONE       C143                 1
+ UP ONE       C144                 1
+ UP ONE       C145                 1
+ UP ONE       C146                 1
+ UP ONE       C147                 1
+ UP ONE       C148                 1
+ UP ONE       C149                 1
+ UP ONE       C150                 1
+ UP ONE       C151                 1
+ UP ONE       C152                 1
+ UP ONE       C153                 1
+ UP ONE       C154                 1
+ UP ONE       C155                 1
+ UP ONE       C156                 1
+ UP ONE       C157                 1
+ UP ONE       C158                 1
+ UP ONE       C159                 1
+ UP ONE       C160                 1
+ UP ONE       C161                 1
+ UP ONE       C162                 1
+ UP ONE       C163                 1
+ UP ONE       C164                 1
+ UP ONE       C165                 1
+ UP ONE       C166                 1
+ UP ONE       C167                 1
+ UP ONE       C168                 1
+ UP ONE       C169                 1
+ UP ONE       C170                 1
+ UP ONE       C171                 1
+ UP ONE       C172                 1
+ UP ONE       C173                 1
+ UP ONE       C174                 1
+ UP ONE       C175                 1
+ UP ONE       C176                 1
+ UP ONE       C177                 1
+ UP ONE       C178                 1
+ UP ONE       C179                 1
+ UP ONE       C180                 1
+ UP ONE       C181                 1
+ UP ONE       C182                 1
+ UP ONE       C183                 1
+ UP ONE       C184                 1
+ UP ONE       C185                 1
+ UP ONE       C186                 1
+ UP ONE       C187                 1
+ UP ONE       C188                 1
+ UP ONE       C189                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/markshare1.mps b/demos/ppl_lpsol/examples/markshare1.mps
new file mode 100644
index 0000000..1efa1f5
--- /dev/null
+++ b/demos/ppl_lpsol/examples/markshare1.mps
@@ -0,0 +1,236 @@
+NAME           markshare1
+ROWS
+ N  obj     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+COLUMNS
+    x1        obj                  1   c1                   1
+    x2        obj                 -1   c1                   1
+    x3        obj                  1   c2                   1
+    x4        obj                 -1   c2                   1
+    x5        obj                  1   c3                   1
+    x6        obj                 -1   c3                   1
+    x7        obj                  1   c4                   1
+    x8        obj                 -1   c4                   1
+    x9        obj                  1   c5                   1
+    x10       obj                 -1   c5                   1
+    x11       obj                  1   c6                   1
+    x12       obj                 -1   c6                   1
+    MARK0000  'MARKER'                 'INTORG'
+    x13       c1                  25   c2                  97
+    x13       c3                  95   c4                   1
+    x13       c5                   3   c6                  69
+    x14       c1                  35   c2                  64
+    x14       c3                  71   c4                  27
+    x14       c5                  94   c6                  72
+    x15       c1                  14   c2                  24
+    x15       c3                  19   c4                  46
+    x15       c5                  51   c6                  94
+    x16       c1                  76   c2                  63
+    x16       c3                  15   c4                  48
+    x16       c5                   4   c6                  56
+    x17       c1                  58   c2                  58
+    x17       c3                  66   c4                  66
+    x17       c5                  25   c6                  90
+    x18       c1                  10   c2                  45
+    x18       c3                  76   c4                  58
+    x18       c5                  46   c6                  20
+    x19       c1                  20   c2                  20
+    x19       c3                   4   c4                  52
+    x19       c5                  30   c6                  56
+    x20       c1                  51   c2                  71
+    x20       c3                  50   c4                   6
+    x20       c5                   2   c6                  50
+    x21       c1                  58   c2                  32
+    x21       c3                  50   c4                  14
+    x21       c5                  89   c6                  79
+    x22       c1                   1   c2                   7
+    x22       c3                  97   c4                  26
+    x22       c5                  65   c6                  59
+    x23       c1                  35   c2                  28
+    x23       c3                  83   c4                  55
+    x23       c5                  28   c6                  36
+    x24       c1                  40   c2                  77
+    x24       c3                  14   c4                  61
+    x24       c5                  46   c6                  24
+    x25       c1                  65   c2                  95
+    x25       c3                  27   c4                  60
+    x25       c5                  36   c6                  42
+    x26       c1                  59   c2                  96
+    x26       c3                  14   c4                   3
+    x26       c5                  53   c6                   9
+    x27       c1                  24   c2                  70
+    x27       c3                  34   c4                  33
+    x27       c5                  30   c6                  29
+    x28       c1                  44   c2                  22
+    x28       c3                   9   c4                  99
+    x28       c5                  73   c6                  68
+    x29       c1                   1   c2                  93
+    x29       c3                  99   c4                  36
+    x29       c5                  37   c6                  10
+    x30       c1                  93   c2                  32
+    x30       c3                  62   c4                  55
+    x30       c5                  60   c6                   1
+    x31       c1                  24   c2                  17
+    x31       c3                  92   c4                  70
+    x31       c5                  21   c6                  44
+    x32       c1                  68   c2                  56
+    x32       c3                  39   c4                  73
+    x32       c5                  41   c6                  74
+    x33       c1                  38   c2                  74
+    x33       c3                  56   c4                  70
+    x33       c5                   2   c6                  61
+    x34       c1                  64   c2                  62
+    x34       c3                  53   c4                  38
+    x34       c5                  21   c6                  37
+    x35       c1                  93   c2                  94
+    x35       c3                  91   c4                  66
+    x35       c5                  93   c6                  71
+    x36       c1                  14   c2                   9
+    x36       c3                  81   c4                  39
+    x36       c5                  82   c6                  63
+    x37       c1                  83   c2                  92
+    x37       c3                  46   c4                  43
+    x37       c5                  16   c6                  44
+    x38       c1                   6   c2                  90
+    x38       c3                  94   c4                  63
+    x38       c5                  97   c6                  77
+    x39       c1                  58   c2                  40
+    x39       c3                  76   c4                  88
+    x39       c5                  75   c6                  57
+    x40       c1                  14   c2                  45
+    x40       c3                  53   c4                  47
+    x40       c5                  50   c6                  46
+    x41       c1                  71   c2                  84
+    x41       c3                  58   c4                  18
+    x41       c5                  13   c6                  51
+    x42       c1                  17   c2                  62
+    x42       c3                  23   c4                  73
+    x42       c5                  43   c6                  43
+    x43       c1                  18   c2                  62
+    x43       c3                  15   c4                  40
+    x43       c5                  45   c6                   4
+    x44       c1                   8   c2                  34
+    x44       c3                  63   c4                  91
+    x44       c5                  64   c6                  85
+    x45       c1                  57   c2                  21
+    x45       c3                   2   c4                  96
+    x45       c5                  78   c6                  59
+    x46       c1                  48   c2                   2
+    x46       c3                  31   c4                  49
+    x46       c5                  78   c6                   7
+    x47       c1                  35   c2                  75
+    x47       c3                  55   c4                  13
+    x47       c5                   6   c6                  25
+    x48       c1                  13   c2                  42
+    x48       c3                  71   c4                  27
+    x48       c5                  35   c6                  46
+    x49       c1                  47   c2                  75
+    x49       c3                  97   c4                  22
+    x49       c5                  72   c6                  25
+    x50       c1                  46   c2                  29
+    x50       c3                  71   c4                  71
+    x50       c5                  31   c6                  70
+    x51       c1                   8   c2                   4
+    x51       c3                  55   c4                  99
+    x51       c5                  28   c6                  78
+    x52       c1                  82   c2                  64
+    x52       c3                   8   c4                  66
+    x52       c5                  56   c6                  88
+    x53       c1                  51   c2                  80
+    x53       c3                  57   c4                  57
+    x53       c5                  60   c6                  20
+    x54       c1                  49   c2                  17
+    x54       c3                  14   c4                   1
+    x54       c5                  23   c6                  40
+    x55       c1                  85   c2                  55
+    x55       c3                  76   c4                  54
+    x55       c5                  70   c6                  40
+    x56       c1                  66   c2                  73
+    x56       c3                   1   c4                  35
+    x56       c5                  46   c6                  16
+    x57       c1                  45   c2                  23
+    x57       c3                  46   c4                  52
+    x57       c5                  88   c6                   3
+    x58       c1                  99   c2                  13
+    x58       c3                  87   c4                  66
+    x58       c5                  20   c6                   3
+    x59       c1                  21   c2                  91
+    x59       c3                  22   c4                  26
+    x59       c5                  69   c6                   5
+    x60       c1                  75   c2                  70
+    x60       c3                  97   c4                   1
+    x60       c5                  13   c6                  77
+    x61       c1                  78   c2                  73
+    x61       c3                  99   c4                  26
+    x61       c5                  40   c6                  88
+    x62       c1                  43   c2                  28
+    x62       c3                  92   c4                  12
+    x62       c5                  73   c6                  16
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c1                1116   c2                1325
+    rhs       c3                1353   c4                1169
+    rhs       c5                1160   c6                1163
+BOUNDS
+ FX bnd       x2                   0
+ FX bnd       x4                   0
+ FX bnd       x6                   0
+ FX bnd       x8                   0
+ FX bnd       x10                  0
+ FX bnd       x12                  0
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/markshare2.mps b/demos/ppl_lpsol/examples/markshare2.mps
new file mode 100644
index 0000000..3e50b0a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/markshare2.mps
@@ -0,0 +1,341 @@
+NAME           markshare2
+ROWS
+ N  obj     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+ E  c7      
+COLUMNS
+    x1        obj                  1   c1                   1
+    x2        obj                 -1   c1                   1
+    x3        obj                  1   c2                   1
+    x4        obj                 -1   c2                   1
+    x5        obj                  1   c3                   1
+    x6        obj                 -1   c3                   1
+    x7        obj                  1   c4                   1
+    x8        obj                 -1   c4                   1
+    x9        obj                  1   c5                   1
+    x10       obj                 -1   c5                   1
+    x11       obj                  1   c6                   1
+    x12       obj                 -1   c6                   1
+    x13       obj                  1   c7                   1
+    x14       obj                 -1   c7                   1
+    MARK0000  'MARKER'                 'INTORG'
+    x15       c1                  74   c2                  20
+    x15       c3                  85   c4                  13
+    x15       c5                  35   c6                  86
+    x15       c7                  41
+    x16       c1                  49   c2                   7
+    x16       c3                  47   c4                  71
+    x16       c5                  61   c6                   8
+    x16       c7                  64
+    x17       c1                  12   c2                  68
+    x17       c3                  67   c4                  78
+    x17       c5                  66   c6                  44
+    x17       c7                  82
+    x18       c1                  93   c2                  69
+    x18       c3                  59   c4                  84
+    x18       c5                  78   c6                  96
+    x18       c7                  24
+    x19       c1                  56   c2                  95
+    x19       c3                  84   c4                  56
+    x19       c5                  46   c6                  64
+    x19       c7                  48
+    x20       c1                  16   c2                  64
+    x20       c3                  59   c4                  66
+    x20       c5                  89   c6                  65
+    x20       c7                  41
+    x21       c1                  39   c2                  76
+    x21       c3                  19   c4                   8
+    x21       c5                  61   c6                  68
+    x21       c7                  29
+    x22       c1                  77   c2                  12
+    x22       c3                   8   c4                  68
+    x22       c5                  25   c6                  53
+    x22       c7                  93
+    x23       c1                  56   c2                  45
+    x23       c3                  50   c4                  48
+    x23       c5                  55   c6                  19
+    x23       c7                  64
+    x24       c1                  73   c2                  43
+    x24       c3                  66   c4                  28
+    x24       c5                  16   c6                  33
+    x24       c7                  39
+    x25       c1                   1   c2                  83
+    x25       c3                   5   c4                  33
+    x25       c5                  81   c6                  28
+    x25       c7                  92
+    x26       c1                   3   c2                  15
+    x26       c3                  51   c4                  34
+    x26       c5                  35   c6                  42
+    x26       c7                  86
+    x27       c1                  68   c2                  90
+    x27       c3                  51   c4                   8
+    x27       c5                  96   c6                  72
+    x27       c7                  64
+    x28       c1                  61   c2                  10
+    x28       c3                  64   c4                  99
+    x28       c5                  23   c6                  39
+    x28       c7                  45
+    x29       c1                   8   c2                  96
+    x29       c3                  64   c4                  80
+    x29       c5                  83   c6                   5
+    x29       c7                  87
+    x30       c1                  55   c2                  98
+    x30       c3                  53   c4                  74
+    x30       c5                  39   c6                  77
+    x30       c7                  34
+    x31       c1                  18   c2                  53
+    x31       c3                  61   c4                   2
+    x31       c5                  14   c6                  37
+    x31       c7                  39
+    x32       c1                  21   c2                   1
+    x32       c3                  45   c4                  10
+    x32       c5                  53   c6                  89
+    x32       c7                  88
+    x33       c1                  57   c2                   2
+    x33       c3                   3   c4                  96
+    x33       c5                  23   c6                   7
+    x33       c7                  99
+    x34       c1                  98   c2                  58
+    x34       c3                  76   c4                  41
+    x34       c5                  23   c6                  78
+    x34       c7                  63
+    x35       c1                  58   c2                  24
+    x35       c3                  17   c4                  98
+    x35       c5                  93   c6                  10
+    x35       c7                  85
+    x36       c1                  57   c2                  90
+    x36       c3                  54   c4                  74
+    x36       c5                  38   c6                  78
+    x36       c7                  48
+    x37       c1                  46   c2                  29
+    x37       c3                  13   c4                  39
+    x37       c5                  15   c6                  10
+    x37       c7                  83
+    x38       c1                  72   c2                  57
+    x38       c3                  89   c4                  91
+    x38       c5                  20   c6                  96
+    x38       c7                  88
+    x39       c1                   6   c2                  19
+    x39       c3                  68   c4                  85
+    x39       c5                  19   c6                  55
+    x39       c7                  85
+    x40       c1                  16   c2                  73
+    x40       c3                  57   c4                  95
+    x40       c5                  28   c6                   1
+    x40       c7                   5
+    x41       c1                  76   c2                  89
+    x41       c3                   4   c4                  96
+    x41       c5                  79   c6                  64
+    x41       c7                  14
+    x42       c1                  21   c2                  31
+    x42       c3                  24   c4                   1
+    x42       c5                  51   c6                  61
+    x42       c7                  31
+    x43       c1                  78   c2                  12
+    x43       c3                  96   c4                  80
+    x43       c5                  24   c6                  63
+    x43       c7                  12
+    x44       c1                  18   c2                  34
+    x44       c3                  81   c4                  90
+    x44       c5                   6   c6                  90
+    x44       c7                  93
+    x45       c1                  11   c2                  67
+    x45       c3                  36   c4                  97
+    x45       c5                   3   c6                  22
+    x45       c7                  55
+    x46       c1                  58   c2                  48
+    x46       c3                  54   c4                  36
+    x46       c5                  47   c6                  78
+    x46       c7                   1
+    x47       c1                  59   c2                  11
+    x47       c3                   3   c4                   7
+    x47       c5                  61   c6                  92
+    x47       c7                   2
+    x48       c1                  25   c2                  22
+    x48       c3                  82   c4                  69
+    x48       c5                  60   c6                  25
+    x48       c7                  22
+    x49       c1                  32   c2                  36
+    x49       c3                  33   c4                   9
+    x49       c5                  71   c6                  24
+    x49       c7                  93
+    x50       c1                  14   c2                  78
+    x50       c3                  88   c4                   9
+    x50       c5                  63   c6                  65
+    x50       c7                  49
+    x51       c1                  16   c2                  75
+    x51       c3                   1   c4                  93
+    x51       c5                  26   c6                   6
+    x51       c7                  35
+    x52       c1                   3   c2                  52
+    x52       c3                  29   c4                  94
+    x52       c5                  66   c6                  68
+    x52       c7                  25
+    x53       c1                  60   c2                  95
+    x53       c3                   4   c4                  44
+    x53       c5                  71   c6                  66
+    x53       c7                  39
+    x54       c1                  12   c2                  57
+    x54       c3                  48   c4                  36
+    x54       c5                  63   c6                  66
+    x54       c7                   1
+    x55       c1                   7   c2                  62
+    x55       c3                  51   c4                  71
+    x55       c5                  56   c6                   1
+    x55       c7                  77
+    x56       c1                  42   c2                  94
+    x56       c3                  14   c4                  37
+    x56       c5                  32   c6                  67
+    x56       c7                  43
+    x57       c1                  98   c2                  10
+    x57       c3                  86   c4                  72
+    x57       c5                  39   c6                  78
+    x57       c7                   7
+    x58       c1                  34   c2                  42
+    x58       c3                  64   c4                  38
+    x58       c5                  31   c6                  21
+    x58       c7                  42
+    x59       c1                  33   c2                  89
+    x59       c3                  73   c4                  74
+    x59       c5                  64   c6                  47
+    x59       c7                  36
+    x60       c1                  16   c2                  11
+    x60       c3                  78   c4                  89
+    x60       c5                  89   c6                  17
+    x60       c7                  63
+    x61       c1                  97   c2                  77
+    x61       c3                  45   c4                  37
+    x61       c5                  62   c6                  89
+    x61       c7                   5
+    x62       c1                  63   c2                  85
+    x62       c3                  65   c4                  24
+    x62       c5                  68   c6                  77
+    x62       c7                   8
+    x63       c1                  66   c2                  30
+    x63       c3                  30   c4                  88
+    x63       c5                  59   c6                  88
+    x63       c7                  43
+    x64       c1                  28   c2                  82
+    x64       c3                  52   c4                  77
+    x64       c5                  71   c6                  54
+    x64       c7                  18
+    x65       c1                  57   c2                  20
+    x65       c3                   6   c4                  61
+    x65       c5                  48   c6                  10
+    x65       c7                  60
+    x66       c1                  19   c2                  52
+    x66       c3                  78   c4                  80
+    x66       c5                  76   c6                  87
+    x66       c7                  47
+    x67       c1                  74   c2                  78
+    x67       c3                   9   c4                   2
+    x67       c5                  96   c6                  88
+    x67       c7                  47
+    x68       c1                  44   c2                   6
+    x68       c3                  19   c4                  60
+    x68       c5                  74   c6                  80
+    x68       c7                  46
+    x69       c1                  45   c2                  57
+    x69       c3                  87   c4                  87
+    x69       c5                  61   c6                  76
+    x69       c7                  45
+    x70       c1                  49   c2                  65
+    x70       c3                  73   c4                  80
+    x70       c5                  21   c6                   9
+    x70       c7                  38
+    x71       c1                  76   c2                  79
+    x71       c3                  10   c4                  74
+    x71       c5                  46   c6                  83
+    x71       c7                   9
+    x72       c1                  74   c2                  83
+    x72       c3                  87   c4                  42
+    x72       c5                  18   c6                  95
+    x72       c7                  37
+    x73       c1                   9   c2                  16
+    x73       c3                  33   c4                   2
+    x73       c5                  23   c6                  86
+    x73       c7                   8
+    x74       c1                  44   c2                  67
+    x74       c3                   1   c4                  37
+    x74       c5                  24   c6                  24
+    x74       c7                  82
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c1                1324   c2                1554
+    rhs       c3                1429   c4                1686
+    rhs       c5                1482   c6                1613
+    rhs       c7                1424
+BOUNDS
+ FX bnd       x2                   0
+ FX bnd       x4                   0
+ FX bnd       x6                   0
+ FX bnd       x8                   0
+ FX bnd       x10                  0
+ FX bnd       x12                  0
+ FX bnd       x14                  0
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mas74.mps b/demos/ppl_lpsol/examples/mas74.mps
new file mode 100644
index 0000000..c5ed04a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mas74.mps
@@ -0,0 +1,1131 @@
+NAME           mas74
+ROWS
+ N  obj     
+ L  c1      
+ G  c2      
+ G  c3      
+ G  c4      
+ G  c5      
+ G  c6      
+ G  c7      
+ G  c8      
+ G  c9      
+ G  c10     
+ G  c11     
+ G  c12     
+ G  c13     
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        obj               1E-5   c1                   1
+    x1        c2        3857.5340376   c3                4264
+    x1        c4                4264   c5                4264
+    x1        c6                4264   c7                4264
+    x1        c8                4264   c9                4264
+    x1        c10               4264   c11               4264
+    x1        c12       1530.2702703   c13               4264
+    x2        obj               1E-5   c1                   1
+    x2        c2        125.76760563   c3                5339
+    x2        c4                5339   c5        5026.3323601
+    x2        c6                5339   c7                5339
+    x2        c8        3236.6488464   c9                5339
+    x2        c10               5339   c11               5339
+    x2        c13               5339
+    x3        obj               1E-5   c1                   1
+    x3        c2        7165.7769953   c3              7227.5
+    x3        c4        5876.7923949   c5        4212.5800487
+    x3        c7                3489   c8                8260
+    x3        c9                8260   c11               4540
+    x3        c13               8260
+    x4        obj               1E-5   c1                   1
+    x4        c2                2876   c3                2876
+    x4        c4                2876   c5                2876
+    x4        c6                2876   c7                2876
+    x4        c8                2876   c9                2876
+    x4        c10               2876   c11               2876
+    x4        c12               2876   c13               2876
+    x5        obj               1E-5   c1                   1
+    x5        c2                9723   c4                9723
+    x5        c6                9723   c9        6324.0237443
+    x5        c10       5706.6236192   c11       6007.4739286
+    x5        c12       6622.5405405   c13        7071.525641
+    x6        obj               1E-5   c1                   1
+    x6        c2                7310   c3                7310
+    x6        c4                7310   c7                7310
+    x6        c8                6884   c9                7310
+    x6        c11               7310   c13               7310
+    x7        obj               1E-5   c1                   1
+    x7        c2                1529   c3                1529
+    x7        c4                1529   c5                1529
+    x7        c6                1529   c7                1529
+    x7        c8                1529   c9                1529
+    x7        c10               1529   c11               1529
+    x7        c12               1529   c13               1529
+    x8        obj               1E-5   c1                   1
+    x8        c2                1585   c3                1585
+    x8        c4                1585   c5                1585
+    x8        c6                1585   c7                1585
+    x8        c8                1585   c9                1585
+    x8        c10               1585   c11               1585
+    x8        c12               1585   c13               1585
+    x9        obj               1E-5   c1                   1
+    x9        c2                2949   c3                2949
+    x9        c4                2949   c5                2949
+    x9        c6                2949   c7                2949
+    x9        c8                2949   c9                2949
+    x9        c10               2949   c11               2949
+    x9        c12               2949   c13               2949
+    x10       obj               1E-5   c1                   1
+    x10       c2                7097   c3        5404.8448466
+    x10       c4                7097   c5                7097
+    x10       c7        5864.7752809   c10               7097
+    x10       c12       2091.1486486   c13               1239
+    x11       obj               1E-5   c1                   1
+    x11       c2                1239   c3                1239
+    x11       c4                1239   c5                1239
+    x11       c6                1239   c7                1239
+    x11       c8                1239   c9                1239
+    x11       c10               1239   c11               1239
+    x11       c12               1239   c13               1239
+    x12       obj               1E-5   c1                   1
+    x12       c2                6449   c3        8128.2443156
+    x12       c4        3263.9478854   c5                6449
+    x12       c6                2475   c7        9321.7752809
+    x12       c9        2669.5520548   c11       5164.8090243
+    x12       c12               5210   c13       1431.2820513
+    x13       obj               1E-5   c1                   1
+    x13       c2          4596.07277   c3        2473.8400699
+    x13       c4        4787.9998652   c5        1673.7990268
+    x13       c6        6817.4161987   c7        7919.9662921
+    x13       c8        5586.9236606   c9                3224
+    x13       c10        3270.405833   c11       1287.8998662
+    x13       c12       2116.7297297   c13               4388
+    x14       obj               1E-5   c1                   1
+    x14       c2                8037   c3                8037
+    x14       c5                8037   c7                8037
+    x14       c9                8037   c10               8037
+    x14       c12               8037
+    x15       obj               1E-5   c1                   1
+    x15       c2                7123   c3                7123
+    x15       c4        3932.0774689   c5                7123
+    x15       c6                7123   c8                7123
+    x15       c13               7123
+    x16       obj               1E-5   c1                   1
+    x16       c2                8067   c4                4508
+    x16       c5        4902.0158151   c6                3754
+    x16       c7                2923   c8        2980.0315887
+    x16       c9         721.8803653   c10       6814.5238232
+    x16       c11        6755.136625   c12       421.86486486
+    x16       c13       3091.3205128
+    x17       obj               1E-5   c1                   1
+    x17       c2                5704   c3                5704
+    x17       c4        5383.2865918   c5        2299.7472019
+    x17       c6                5704   c7                5704
+    x17       c8                4171   c9                5704
+    x17       c10               5704   c11               5704
+    x17       c12               5704   c13               5704
+    x18       obj               1E-5   c1                   1
+    x18       c2                1582   c3                1582
+    x18       c4        1007.7206724   c5                1582
+    x18       c6                1582   c7                1582
+    x18       c8                1582   c9                1582
+    x18       c10               1582   c11               1582
+    x18       c12               1582   c13       1144.5384615
+    x19       obj               1E-5   c1                   1
+    x19       c2                8713   c4                8713
+    x19       c5                8713   c7        8171.3932584
+    x19       c9                8713   c10               8713
+    x19       c13               8713
+    x20       obj               1E-5   c1                   1
+    x20       c2                9232   c4                9232
+    x20       c6                9232   c7                9232
+    x20       c9                9232   c10               9232
+    x20       c11               9232
+    x21       obj               1E-5   c1                   1
+    x21       c2                3371   c3                4035
+    x21       c4        3733.6777996   c5                4035
+    x21       c6                4035   c7                4600
+    x21       c8                3371   c9                3371
+    x21       c10               4600   c11               4600
+    x21       c12               4035   c13       2933.5384615
+    x22       obj               1E-5   c1                   1
+    x22       c2                2637   c3                2637
+    x22       c4                2637   c5                2637
+    x22       c6                2637   c7                2637
+    x22       c8                2637   c9                2637
+    x22       c10               2637   c11               2637
+    x22       c12               2637   c13               2637
+    x23       obj               1E-5   c1                   1
+    x23       c2                7131   c3         2505.925667
+    x23       c4        2622.9478854   c5                7131
+    x23       c6                7131   c7        3525.6966292
+    x23       c8                7131   c9        7048.9675799
+    x23       c10               7131   c11       5166.9799255
+    x23       c12               1313   c13       1662.1153846
+    x24       obj               1E-5   c1                   1
+    x24       c2         418.3028169   c3                9861
+    x24       c4        5572.0948907   c5         2435.796837
+    x24       c6        5429.5829374   c8        922.29134407
+    x24       c9        5007.8803653   c10       4652.0215414
+    x24       c11       1899.2210109
+    x25       obj               1E-5   c1                   1
+    x25       c2                3647   c3                3647
+    x25       c4                3647   c5                3647
+    x25       c6                3647   c7                3647
+    x25       c8                3647   c9                3647
+    x25       c10               3647   c11               3647
+    x25       c12               3647   c13               3647
+    x26       obj               1E-5   c1                   1
+    x26       c2        5688.4859155   c3        5478.2871361
+    x26       c4                8494   c5        1160.0158151
+    x26       c6                7496   c8        805.25526479
+    x26       c9        2201.1196347   c10       3891.5238232
+    x26       c11        3013.136625   c12       421.86486486
+    x26       c13       2501.1474359
+    x27       obj               1E-5   c1                   1
+    x27       c2        7832.5997653   c3        5665.9031945
+    x27       c4        1590.9888423   c5        1850.9749392
+    x27       c6               583.5   c7        4272.9662921
+    x27       c8        2660.5892304   c9         1631.030137
+    x27       c10       5039.7045485   c11       5571.6006929
+    x27       c12       2940.1756757   c13       1070.4038462
+    x28       obj               1E-5   c1                   1
+    x28       c2        4409.1255869   c3                5880
+    x28       c4                5880   c5                5880
+    x28       c6              5162.5   c7                5880
+    x28       c8                5880   c9                5880
+    x28       c13       5649.4038462
+    x29       obj               1E-5   c1                   1
+    x29       c2                1053   c3                1053
+    x29       c4                1053   c5                1053
+    x29       c6                1053   c7                1053
+    x29       c8                1053   c9                1053
+    x29       c10               1053   c11               1053
+    x29       c12               1053   c13               1053
+    x30       obj               1E-5   c1                   1
+    x30       c2                2869   c3                2869
+    x30       c4                2869   c5        1573.9406326
+    x30       c6        449.31447084   c7                2869
+    x30       c8                2869   c9        204.02305936
+    x30       c10               2869   c11               2869
+    x30       c12               1053
+    x31       obj               1E-5   c1                   1
+    x31       c2                5410   c3                5410
+    x31       c4                5410   c5                5410
+    x31       c6        3240.6855292   c7                5410
+    x31       c8                5410   c9          2678.01621
+    x31       c10               5410   c12               5287
+    x31       c13       2480.7179487
+    x32       obj               1E-5   c1                   1
+    x32       c2                3948   c3                3948
+    x32       c4                3948   c5                3948
+    x32       c6                3948   c7                3948
+    x32       c8                3948   c9                3948
+    x32       c10               3948   c11               3948
+    x32       c12               3948   c13               3948
+    x33       obj               1E-5   c1                   1
+    x33       c2                6049   c3                6049
+    x33       c4                6049   c5                6049
+    x33       c6                6049   c9                6049
+    x33       c10               6049   c11               6049
+    x34       obj               1E-5   c1                   1
+    x34       c2                9317   c5                9317
+    x34       c6                9317   c7                9317
+    x34       c8                9317   c9                9317
+    x34       c12       5488.7162162   c13                888
+    x35       obj               1E-5   c1                   1
+    x35       c2                6880   c3                6880
+    x35       c4        1928.2865918   c5                6880
+    x35       c6                1950   c7        2311.7191011
+    x35       c8        1762.3431016   c9        4388.8803653
+    x35       c10               6880   c11       3103.6850787
+    x35       c12       4446.6621622
+    x36       obj               1E-5   c1                   1
+    x36       c2                3779   c3                3779
+    x36       c4                3779   c5                3779
+    x36       c6                3779   c7                3779
+    x36       c8                3779   c9                3779
+    x36       c10               3779   c11               3779
+    x36       c12               3779   c13               3779
+    x37       obj               1E-5   c1                   1
+    x37       c2                3641   c3                3641
+    x37       c4                3641   c5                3641
+    x37       c6                3641   c7                3641
+    x37       c8                3641   c9                3641
+    x37       c10               3641   c11               3641
+    x37       c12               3641   c13               3641
+    x38       obj               1E-5   c1                   1
+    x38       c2                5567   c3                5567
+    x38       c4                5567   c5                5567
+    x38       c6                5567   c7                5567
+    x38       c8                5567   c10       1477.4963355
+    x38       c11               5567   c12       4894.9189189
+    x38       c13               5567
+    x39       obj               1E-5   c1                   1
+    x39       c2                2197   c3                2197
+    x39       c4                2197   c5                2197
+    x39       c6                2197   c7                2197
+    x39       c8                2197   c9                2197
+    x39       c10               2197   c11               2197
+    x39       c12               2197   c13               2197
+    x40       obj               1E-5   c1                   1
+    x40       c2                2842   c3        1164.8704111
+    x40       c4                2842   c5                2842
+    x40       c6                2842   c7                2842
+    x40       c8                2842   c9                2842
+    x40       c10               2842   c11               2842
+    x40       c12       2103.3243243   c13               2842
+    x41       obj               1E-5   c1                   1
+    x41       c2                4846   c3                4846
+    x41       c4                4846   c5                4846
+    x41       c6                4846   c7                4846
+    x41       c8                4846   c9                4846
+    x41       c10               4846   c11               4846
+    x41       c12               4846   c13               4846
+    x42       obj               1E-5   c1                   1
+    x42       c2                4616   c3        139.72342842
+    x42       c4                4616   c5                4616
+    x42       c6                4616   c7                4616
+    x42       c8                4616   c9                4616
+    x42       c10               4616   c11               4616
+    x42       c12               4616   c13       2765.2179487
+    x43       obj               1E-5   c1                   1
+    x43       c2                8807   c4                8807
+    x43       c6                8807   c7                8807
+    x43       c8                8807   c10               8807
+    x43       c11               8807   c12               8807
+    x44       obj               1E-5   c1                   1
+    x44       c2                3261   c3                3261
+    x44       c4                3261   c5                3261
+    x44       c6                3261   c7                3261
+    x44       c8                3261   c9                3261
+    x44       c10               3261   c11               3261
+    x44       c12               3261   c13               3261
+    x45       obj               1E-5   c1                   1
+    x45       c2                3553   c3                3553
+    x45       c4                3553   c5                3553
+    x45       c6                3553   c7                3553
+    x45       c8                3553   c9                3553
+    x45       c10               3553   c11               3553
+    x45       c12               3553   c13               3553
+    x46       obj               1E-5   c1                   1
+    x46       c2                5239   c3                5239
+    x46       c4                5239   c5                2665
+    x46       c6                5239   c7                5239
+    x46       c8        3338.1665376   c9                5239
+    x46       c10               5239   c11               5239
+    x46       c12               2665   c13               2665
+    x47       obj               1E-5   c1                   1
+    x47       c2                6665   c3                6665
+    x47       c4                6665   c5                6665
+    x47       c6                6665   c11               6665
+    x48       obj               1E-5   c1                   1
+    x48       c2        3257.4906103   c3        1655.7848997
+    x48       c4                8172   c5        4492.4068127
+    x48       c6                8172   c7        5877.6685393
+    x48       c8        2589.3009446   c9                8172
+    x48       c10               8172   c11               8172
+    x48       c12       1009.4459459
+    x49       obj               1E-5   c1                   1
+    x49       c2         7219.556338   c3        1655.7848997
+    x49       c4        5587.4533223   c5        4492.4068127
+    x49       c6                8425   c7        4262.3764045
+    x49       c8        2589.3009446   c9                8425
+    x49       c10               8425   c11       3203.5967077
+    x49       c12       1009.4459459
+    x50       obj               1E-5   c1                   1
+    x50       c2                2536   c3                2536
+    x50       c4                2536   c5                2536
+    x50       c6                2536   c7                2536
+    x50       c8                2536   c9                2536
+    x50       c10               2536   c11               2536
+    x50       c12               2536   c13               2536
+    x51       obj               1E-5   c1                   1
+    x51       c2                8013   c3                8013
+    x51       c5        3924.9124088   c6        4869.6696544
+    x51       c7         7090.005618   c8                6077
+    x51       c9        1351.1242009   c10               8013
+    x51       c12       2956.6621622   c13               2768
+    x52       obj               1E-5   c1                   1
+    x52       c2                3541   c3                3541
+    x52       c4        509.74314193   c5                3541
+    x52       c6                3541   c7         1074.011236
+    x52       c8                3541   c9                3541
+    x52       c10               3541   c12       420.66216216
+    x52       c13               3541
+    x53       obj               1E-5   c1                   1
+    x53       c2                8080   c3                8080
+    x53       c5        3336.9664234   c6                8080
+    x53       c7                8080   c10               8080
+    x53       c11               8080   c13               8080
+    x54       obj               1E-5   c1                   1
+    x54       c2        5593.0586854   c3        2778.8438922
+    x54       c4        5130.4842654   c5        509.94136253
+    x54       c6        5337.9205184   c7        2240.3595506
+    x54       c8        257.07955249   c9                6767
+    x54       c10        2672.975731   c11               6767
+    x54       c13       759.60897436
+    x55       obj               1E-5   c1                   1
+    x55       c2                5036   c3                5036
+    x55       c4                5036   c5                5036
+    x55       c6                5036   c7                5036
+    x55       c8                5036   c9                5036
+    x55       c10               5036   c11               5036
+    x55       c12               5036   c13               5036
+    x56       obj               1E-5   c1                   1
+    x56       c2                1782   c3                1782
+    x56       c4                1782   c5                1782
+    x56       c6                1782   c7                1782
+    x56       c8                1782   c9                1782
+    x56       c10               1782   c11               1782
+    x56       c12               1782   c13               1782
+    x57       obj               1E-5   c1                   1
+    x57       c2                3895   c3        1724.2205458
+    x57       c4        476.85677148   c5        2066.1187348
+    x57       c6                3895   c7                3895
+    x57       c8                3895   c9                3895
+    x57       c10               3895   c11               3895
+    x57       c12               3895   c13               3895
+    x58       obj               1E-5   c1                   1
+    x58       c2                4205   c4                4205
+    x58       c5                4205   c6                4205
+    x58       c7                4205   c8                4205
+    x58       c9                4205   c10               4205
+    x58       c11               4205   c12               4205
+    x58       c13               4205
+    x59       obj               1E-5   c1                   1
+    x59       c2                7772   c3                7772
+    x59       c5                7772   c7        7106.3258427
+    x59       c8                7772   c10       2726.2276162
+    x59       c11               7772   c12               7772
+    x60       obj               1E-5   c1                   1
+    x60       c2                9326   c5        8367.2374696
+    x60       c6              5256.5   c7                7383
+    x60       c8        6619.0778105   c9        6075.1340183
+    x60       c10       3171.9293238   c11       4961.8312283
+    x60       c12       5919.7837838   c13               9326
+    x61       obj               1E-5   c1                   1
+    x61       c2                4757   c3                4757
+    x61       c4        2026.2568581   c5                4757
+    x61       c6        2104.6903888   c7         3561.488764
+    x61       c9        88.128310502   c10               4757
+    x61       c11               2536   c13       1576.5448718
+    x62       obj               1E-5   c1                   1
+    x62       c2                5355   c4                5355
+    x62       c5        2978.6437956   c7        2033.3258427
+    x62       c8                5355   c9                5355
+    x62       c10               5355   c11               5355
+    x62       c12               5355   c13               5355
+    x63       obj               1E-5   c1                   1
+    x63       c2                1919   c3                1919
+    x63       c4                1919   c5                1919
+    x63       c6                1919   c7                1919
+    x63       c8                1919   c9                1919
+    x63       c10               1919   c11               1919
+    x63       c12               1919   c13               1919
+    x64       obj               1E-5   c1                   1
+    x64       c2        7510.5774648   c3         8722.393681
+    x64       c4        3652.6973102   c6        4473.0773218
+    x64       c7        6121.0505618   c8                9948
+    x64       c10       4389.7373933   c11       5846.2742077
+    x64       c12       6017.0810811
+    x65       obj               1E-5   c1                   1
+    x65       c2                7341   c3                7341
+    x65       c5                7341   c6                7341
+    x65       c8                7341   c11               7341
+    x65       c12       5188.3918919   c13       2995.1025641
+    x66       obj               1E-5   c1                   1
+    x66       c2                8541   c4                8541
+    x66       c5                4655   c6                4655
+    x66       c7                8541   c8        6962.5370084
+    x66       c11       7926.8090243   c12       7281.4594595
+    x66       c13               8541
+    x67       obj               1E-5   c1                   1
+    x67       c2                8352   c4                8352
+    x67       c5                8352   c6                8352
+    x67       c9                8352   c11               8352
+    x67       c12       2160.4594595   c13               8352
+    x68       obj               1E-5   c1                   1
+    x68       c2                3291   c3                3291
+    x68       c4                3291   c5                3291
+    x68       c6                3291   c7                3291
+    x68       c8                3291   c9                3291
+    x68       c10               3291   c11               3291
+    x68       c12               3291   c13               3291
+    x69       obj               1E-5   c1                   1
+    x69       c2                7328   c3                7328
+    x69       c5                7328   c6                7328
+    x69       c8                7328   c11               7328
+    x69       c12       6739.2972973
+    x70       obj               1E-5   c1                   1
+    x70       c2                4506   c3                4506
+    x70       c4                4506   c5                4506
+    x70       c6                4506   c7                4429
+    x70       c8                4506   c9                4506
+    x70       c10               4506   c11               4506
+    x70       c12               4429   c13               4506
+    x71       obj               1E-5   c1                   1
+    x71       c2                4429   c3                4429
+    x71       c4                4429   c5                4429
+    x71       c6                4429   c7                4429
+    x71       c8                4429   c9                4429
+    x71       c10               4429   c11               4429
+    x71       c12               4429   c13               4429
+    x72       obj               1E-5   c1                   1
+    x72       c2                4593   c3                4593
+    x72       c4                4593   c5        896.82189781
+    x72       c6                4593   c7        4081.3146067
+    x72       c8                4593   c9                4593
+    x72       c10               4593   c11               4593
+    x72       c12               4593   c13               4593
+    x73       obj               1E-5   c1                   1
+    x73       c2                9138   c4        6903.6330621
+    x73       c5         2486.593674   c6                9138
+    x73       c7        4272.9662921   c8                9138
+    x73       c10       4769.9270193   c11       2864.5421929
+    x73       c13               9138
+    x74       obj               1E-5   c1                   1
+    x74       c2        3731.7664319   c3        4857.7089899
+    x74       c4        4972.5996947   c5        7925.6586375
+    x74       c6        5052.5596112   c7        7999.5842697
+    x74       c8        940.48633478   c9        1881.3954338
+    x74       c10        560.5962977   c11        3452.764849
+    x74       c12       1530.2702703   c13       7740.9358974
+    x75       obj               1E-5   c1                   1
+    x75       c2        5124.2922535   c3                7404
+    x75       c4        4006.8453527   c5        1794.7394161
+    x75       c6        1174.3740821   c7        5324.3033708
+    x75       c8        6731.8123645   c9        4723.3954338
+    x75       c10       3402.5962977   c11       4126.5871636
+    x75       c12       4615.3378378   c13               7404
+    x76       obj               1E-5   c1                   1
+    x76       c2                4378   c3                4378
+    x76       c4                4378   c5                4378
+    x76       c6                4378   c7                4378
+    x76       c8         2220.491406   c9                4378
+    x76       c10               4378   c11               4378
+    x76       c12       1530.2702703   c13               4378
+    x77       obj               1E-5   c1                   1
+    x77       c2                3647   c3                3647
+    x77       c4                3647   c5                3647
+    x77       c6                3647   c7                3647
+    x77       c8                3647   c9                3647
+    x77       c10               3647   c11               3647
+    x77       c12               3647   c13               3647
+    x78       obj               1E-5   c1                   1
+    x78       c2                3795   c3                3795
+    x78       c4                3795   c5        1205.9406326
+    x78       c6                3795   c7                3795
+    x78       c8                3795   c9                3795
+    x78       c10               3795   c11               3795
+    x78       c12               3795   c13               3795
+    x79       obj               1E-5   c1                   1
+    x79       c2                2912   c3                2912
+    x79       c4                2912   c5        1205.9406326
+    x79       c6                2912   c7        2559.6067416
+    x79       c8                2912   c9                2912
+    x79       c10               2912   c11               2912
+    x79       c12               2912   c13               2912
+    x80       obj               1E-5   c1                   1
+    x80       c2                8830   c3        7601.2456701
+    x80       c6                8830   c7        2550.0224719
+    x80       c8                6707   c9                8830
+    x80       c10               8830   c12               8830
+    x80       c13       390.93589744
+    x81       obj               1E-5   c1                   1
+    x81       c2                5445   c3                5445
+    x81       c4                5445   c5                5445
+    x81       c6                5445   c7         5008.247191
+    x81       c8                5445   c9                5445
+    x81       c11               5445   c13               5445
+    x82       obj               1E-5   c1                   1
+    x83       obj               1E-5   c1                   1
+    x83       c2                6112   c3                6112
+    x83       c4                6112   c5                6112
+    x83       c6                6112   c9                6112
+    x83       c10               6112   c12               6112
+    x84       obj               1E-5   c1                   1
+    x84       c2                8841   c4                8841
+    x84       c5                8841   c8                8841
+    x84       c10               8841   c13               8841
+    x85       obj               1E-5   c1                   1
+    x85       c2                1236   c3                1236
+    x85       c4                1236   c5                1236
+    x85       c6                1236   c7                1236
+    x85       c8                1236   c9                1236
+    x85       c10               1236   c11               1236
+    x85       c12               1236   c13               1236
+    x86       obj               1E-5   c1                   1
+    x86       c2                7010   c3                7010
+    x86       c4                7010   c7                7010
+    x86       c8                2909   c9                7010
+    x86       c10               7010   c11               7010
+    x86       c12               1324   c13               7010
+    x87       obj               1E-5   c1                   1
+    x87       c2                2909   c3                2909
+    x87       c4        1599.0521146   c5                2909
+    x87       c6                2909   c7                2909
+    x87       c8                2909   c9                2909
+    x87       c10               2909   c11               2909
+    x87       c12               2909   c13               2909
+    x88       obj               1E-5   c1                   1
+    x88       c2                7622   c3        5342.1452962
+    x88       c4                7622   c5                7622
+    x88       c9                7622   c10               7622
+    x88       c11               7622
+    x89       obj               1E-5   c1                   1
+    x89       c2                7393   c3                7393
+    x89       c5                7393   c6                7393
+    x89       c9                7393   c10               7393
+    x89       c12               7393   c13               7393
+    x90       obj               1E-5   c1                   1
+    x90       c2        8317.6971831   c3        6883.3314132
+    x90       c5                8830   c7        4261.7191011
+    x90       c8        2953.3115129   c9        6338.8803653
+    x90       c10       4727.2211862   c11       5053.6850787
+    x90       c12       6396.6621622
+    x91       obj               1E-5   c1                   1
+    x91       c2                1950   c3                1950
+    x91       c4                1950   c5                1950
+    x91       c6                1950   c7                1950
+    x91       c8                1950   c9                1950
+    x91       c10               1950   c11               1950
+    x91       c12               1950
+    x92       obj               1E-5   c1                   1
+    x92       c2                4654   c3                4654
+    x92       c4                4654   c5                4654
+    x92       c6                4654   c7                4654
+    x92       c8                4654   c9                4654
+    x92       c10               4654   c11               1188
+    x92       c12               4654   c13               4654
+    x93       obj               1E-5   c1                   1
+    x93       c2                2255   c3                2255
+    x93       c4                2255   c5                2255
+    x93       c6                2255   c7        117.03370787
+    x93       c8                2255   c9                2255
+    x93       c10               2255   c11               2255
+    x93       c12               2255   c13               2255
+    x94       obj               1E-5   c1                   1
+    x94       c2                7104   c3                7104
+    x94       c4                7104   c7                7104
+    x94       c8                7104   c9                7104
+    x94       c10       6114.1385266   c11               7104
+    x94       c12               7104
+    x95       obj               1E-5   c1                   1
+    x95       c2        7534.7887324   c3        7435.0469687
+    x95       c4                7744   c7        3406.2808989
+    x95       c8                7744   c9                7744
+    x95       c11               7744   c12       3202.5945946
+    x95       c13               7744
+    x96       obj               1E-5   c1                   1
+    x96       c2                2054   c3                2054
+    x96       c4                2054   c5                2054
+    x96       c6                2054   c7                2054
+    x96       c8                2054   c9                2054
+    x96       c10               2054   c11               2054
+    x96       c12               2054   c13               2054
+    x97       obj               1E-5   c1                   1
+    x97       c2                6682   c3                6682
+    x97       c4                6682   c5                6682
+    x97       c8        1726.1613116   c9                6682
+    x97       c11               6682   c12       4613.5135135
+    x97       c13       1696.5128205
+    x98       obj               1E-5   c1                   1
+    x98       c2                3234   c3                3234
+    x98       c4                3234   c5                3234
+    x98       c6                3234   c7                3234
+    x98       c8                3234   c9                3234
+    x98       c10               3234   c11               3234
+    x98       c12               3234   c13               3234
+    x99       obj               1E-5   c1                   1
+    x99       c2                2842   c3        1164.8704111
+    x99       c4                2842   c5                2842
+    x99       c6                2842   c7        2675.2808989
+    x99       c8                2842   c9                2842
+    x99       c10               2842   c11               2842
+    x99       c12       2103.3243243   c13               2842
+    x100      obj               1E-5   c1                   1
+    x100      c2                3974   c3                3974
+    x100      c4                3974   c5                3974
+    x100      c6                3974   c7                3974
+    x100      c8                3974   c9                3974
+    x100      c10               3974   c11               3974
+    x100      c12               3974   c13       2670.2820513
+    x101      obj               1E-5   c1                   1
+    x101      c2                3624   c3                3624
+    x101      c4                3624   c5                3624
+    x101      c6                3624   c7                3624
+    x101      c8                3624   c9                3624
+    x101      c10               3624   c11               3624
+    x101      c12               3624   c13               3624
+    x102      obj               1E-5   c1                   1
+    x102      c2                5415   c3                5415
+    x102      c4                5415   c5                5415
+    x102      c6                5415   c7                5415
+    x102      c8                5415   c9                5415
+    x102      c10               5415
+    x103      obj               1E-5   c1                   1
+    x103      c2                2246   c3                1582
+    x103      c4                2246   c5                1582
+    x103      c6                2246   c7                2246
+    x103      c8                2246   c9                2246
+    x103      c10       1807.7609822   c11               2246
+    x103      c12               1582   c13               2246
+    x104      obj               1E-5   c1                   1
+    x104      c2                8590   c4                8590
+    x104      c5                8590   c7                8590
+    x104      c8                8590   c11       5312.3064276
+    x104      c12       5392.9324324
+    x105      obj               1E-5   c1                   1
+    x105      c2                2633   c3                2633
+    x105      c4                2633   c5                2633
+    x105      c6                2633   c7        40.747191011
+    x105      c8                2633   c9                2633
+    x105      c10               2633   c11               2633
+    x105      c12       732.93243243   c13               2633
+    x106      obj               1E-5   c1                   1
+    x106      c2                4655   c3                4655
+    x106      c4                4655   c5                4655
+    x106      c6                4655   c7                4655
+    x106      c8                4655   c9                4655
+    x106      c10               4655   c11               4655
+    x106      c12       418.45945946   c13                691
+    x107      obj               1E-5   c1                   1
+    x107      c2                2923   c3                2923
+    x107      c4                2923   c5                2923
+    x107      c6                2923   c7                2923
+    x107      c8                2923   c9                2923
+    x107      c10               2923   c11               2923
+    x107      c12               2923   c13               2923
+    x108      obj               1E-5   c1                   1
+    x108      c2                6318   c3                6318
+    x108      c5                6318   c6                6318
+    x108      c7        4285.6853933   c8                6318
+    x108      c9                6318   c10               6318
+    x108      c11               6318   c13               6318
+    x109      obj               1E-5   c1                   1
+    x109      c2                7440   c3                7440
+    x109      c4         5080.614002   c6                1739
+    x109      c7         6319.247191   c8                7440
+    x109      c9        3677.0954338   c10               7440
+    x109      c13       1402.1282051
+    x110      obj               1E-5   c1                   1
+    x110      c2                4579   c3                4579
+    x110      c4                4579   c5                4579
+    x110      c6                4579   c7                4579
+    x110      c8                4579   c9        1172.1497717
+    x110      c10       3472.3863166   c11               4579
+    x110      c12               4579   c13               4579
+    x111      obj               1E-5   c1                   1
+    x111      c2                8342   c3                8342
+    x111      c6                8342   c7                8342
+    x111      c9                8342   c11               8342
+    x111      c12               8342   c13               3445
+    x112      obj               1E-5   c1                   1
+    x112      c2        3813.4002347   c3                5050
+    x112      c4        4677.0111577   c5        81.974939173
+    x112      c6                1239   c7        3764.0337079
+    x112      c8        2660.5892304   c9        2180.2694064
+    x112      c10       3270.7045485   c11               5050
+    x112      c12               1102   c13       3648.6794872
+    x113      obj               1E-5   c1                   1
+    x113      c2                6268   c3                6268
+    x113      c4                6268   c5                6268
+    x113      c6              1822.5   c9                6268
+    x113      c10               6268   c11       4575.3149213
+    x113      c12               6268   c13       4719.0833333
+    x114      obj               1E-5   c1                   1
+    x114      c2                8570   c3                8570
+    x114      c6                8570   c8                8570
+    x114      c9        6425.2703196   c10               8570
+    x114      c11               7133
+    x115      obj               1E-5   c1                   1
+    x115      c2                9838   c5         6831.392944
+    x115      c6                9838   c7        5613.6853933
+    x115      c8                9838   c9        4293.1287671
+    x115      c10               9838   c11               5180
+    x115      c13       2068.8974359
+    x116      obj               1E-5   c1                   1
+    x116      c2                4876   c3                4876
+    x116      c4         2157.614002   c5                4876
+    x116      c6                4876   c7                4876
+    x116      c8                4876   c9                4876
+    x116      c10       4624.3962297   c11               4876
+    x116      c13        1920.724359
+    x117      obj               1E-5   c1                   1
+    x117      c2         418.3028169   c3                9861
+    x117      c4        5572.0948907   c5         2435.796837
+    x117      c6        5429.5829374   c8        922.29134407
+    x117      c9        5007.8803653   c10       4652.0215414
+    x117      c11       1899.2210109
+    x118      obj               1E-5   c1                   1
+    x118      c2                4922   c3                4922
+    x118      c4                4922   c5                4922
+    x118      c6                4922   c7                3647
+    x118      c8                4922   c9                4922
+    x118      c10       2886.5022818   c11               4922
+    x118      c12       3225.1351351   c13       1741.5064103
+    x119      obj               1E-5   c1                   1
+    x119      c2                3590   c3                3590
+    x119      c4                3590   c5                3590
+    x119      c6                3590   c7        625.96629213
+    x119      c8                3590   c9                3590
+    x119      c10               3590   c11       2057.4578071
+    x119      c12       1866.4459459   c13       899.94871795
+    x120      obj               1E-5   c1                   1
+    x120      c2                7152   c3                7152
+    x120      c4                7152   c6                7152
+    x120      c8                7152   c9                7152
+    x120      c12       3625.7162162   c13               7152
+    x121      obj               1E-5   c1                   1
+    x121      c2                7056   c3                7056
+    x121      c4                7056   c5                7056
+    x121      c10               7056   c11               7056
+    x121      c13       3555.5641026
+    x122      obj               1E-5   c1                   1
+    x122      c2                9136   c4                9136
+    x122      c5                9136   c8                9136
+    x122      c9                9136   c12               9136
+    x123      obj               1E-5   c1                   1
+    x123      c2                7850   c3                4655
+    x123      c4                7850   c7                7850
+    x123      c8        5952.0905079   c9                4655
+    x123      c10               4655   c11               7850
+    x123      c12               7850   c13               7850
+    x124      obj               1E-5   c1                   1
+    x124      c2                6863   c3                6863
+    x124      c4                6863   c6                6863
+    x124      c7                6863   c10               6863
+    x124      c12               6863   c13               6863
+    x125      obj               1E-5   c1                   1
+    x125      c2                9356   c4                9356
+    x125      c6                9356   c7                9356
+    x125      c9                9091   c11       5319.7567851
+    x125      c12               9356   c13       7943.6794872
+    x126      obj               1E-5   c1                   1
+    x126      c2                2933   c3                2933
+    x126      c4                2933   c5                2933
+    x126      c6                2933   c7                2933
+    x126      c8                2933   c9                2933
+    x126      c10               2933   c11               2933
+    x126      c12               2933   c13               2933
+    x127      obj               1E-5   c1                   1
+    x127      c2                2665   c3                2665
+    x127      c4                2665   c5                2665
+    x127      c6                2665   c7                2665
+    x127      c8                2665   c9                2665
+    x127      c10               2665   c11               2665
+    x127      c12               2665   c13               2665
+    x128      obj               1E-5   c1                   1
+    x128      c2                4063   c3                4063
+    x128      c4                4063   c5                4063
+    x128      c6                4063   c7                4063
+    x128      c8                4063   c9                4063
+    x128      c10               4063   c11               4063
+    x128      c12               4020   c13               4063
+    x129      obj               1E-5   c1                   1
+    x129      c2                7502   c3        4120.6364834
+    x129      c4                7502   c5                7502
+    x129      c7         5485.988764   c8        2002.5321694
+    x129      c10               7502   c11               7502
+    x129      c13       6355.8974359
+    x130      obj               1E-5   c1                   1
+    x130      c2                1966   c3                1966
+    x130      c4                1966   c5                1966
+    x130      c6                1966   c7                1966
+    x130      c8                1966   c9                1966
+    x130      c10               1966   c11               1966
+    x130      c12               1966   c13               1966
+    x131      obj               1E-5   c1                   1
+    x131      c2                4540   c3                4540
+    x131      c4                4540   c5                4540
+    x131      c6                4540   c7                4540
+    x131      c8                4540   c9                4540
+    x131      c10               4540   c11               4540
+    x131      c12               4540   c13               4540
+    x132      obj               1E-5   c1                   1
+    x132      c2                1370   c3                1370
+    x132      c4                1370   c5                1370
+    x132      c6                1370   c7                1370
+    x132      c8                1370   c9                1370
+    x132      c10               1370   c11               1370
+    x132      c12               1370   c13               1370
+    x133      obj               1E-5   c1                   1
+    x133      c2                9828   c5        6682.7810219
+    x133      c6                9828   c7         4661.988764
+    x133      c8                9828   c9                9828
+    x133      c10               9828   c11        7435.893535
+    x134      obj               1E-5   c1                   1
+    x134      c2                9376   c4                9376
+    x134      c6                9376   c8                9376
+    x134      c9                7354   c10               9376
+    x134      c12               4540   c13               9376
+    x135      obj               1E-5   c1                   1
+    x135      c2        3856.6326291   c3        2379.6660405
+    x135      c4                6443   c5        5038.2167883
+    x135      c6        5616.8782937   c7        5761.1011236
+    x135      c8                6443   c9                6443
+    x135      c10       2784.1324972   c11       4802.8550525
+    x135      c13       816.93589744
+    x136      obj               1E-5   c1                   1
+    x136      c2                1996   c3                1996
+    x136      c4                1996   c5                1996
+    x136      c6                1996   c7                1996
+    x136      c8                1996   c9                1996
+    x136      c10               1996   c11               1996
+    x136      c12               1996   c13               1996
+    x137      obj               1E-5   c1                   1
+    x137      c2                5320   c3                5320
+    x137      c4                5320   c5        4660.7472019
+    x137      c6                5320   c7                5320
+    x137      c8                5320   c9                5320
+    x137      c10       2436.2770533   c11               5320
+    x137      c12       1390.0810811   c13               5320
+    x138      obj               1E-5   c1                   1
+    x138      c2        3107.4788732   c3        5533.7993219
+    x138      c4        2524.7428057   c5                6754
+    x138      c6        1358.4934125   c7        3269.2808989
+    x138      c8        6041.6761381   c9        801.50639269
+    x138      c10       579.50663393   c12                275
+    x138      c13       1376.7820513
+    x139      obj               1E-5   c1                   1
+    x139      c2                1645   c3                1645
+    x139      c4                1645   c5                1645
+    x139      c6                1645   c7                1645
+    x139      c8                1645   c9                1645
+    x139      c10               1645   c11               1645
+    x139      c12               1645   c13               1645
+    x140      obj               1E-5   c1                   1
+    x140      c2        2890.0046948   c3                4365
+    x140      c4        499.32083911   c5        2864.8812652
+    x140      c6                4365   c7         3781.011236
+    x140      c8                 647   c9                4920
+    x140      c10       3851.4963355   c11       3400.7613107
+    x140      c12       7967.1621622   c13                433
+    x141      obj               1E-5   c1                   1
+    x141      c2                4920   c3                4920
+    x141      c4                4920   c5                4920
+    x141      c6                4920   c7        4396.0561798
+    x141      c8                4920   c9                4920
+    x141      c10               4920   c11               4920
+    x141      c12               4920   c13               4920
+    x142      obj               1E-5   c1                   1
+    x142      c2                8107   c3                8107
+    x142      c5                8107   c7                8107
+    x142      c9        4475.8803653   c10               8107
+    x142      c11               8107   c12       3561.7972973
+    x143      obj               1E-5   c1                   1
+    x143      c2                6103   c3                6103
+    x143      c4                6103   c5                6103
+    x143      c6                6103   c9                6103
+    x143      c10               6103   c12       2247.6351351
+    x144      obj               1E-5   c1                   1
+    x144      c2                4970   c3                4970
+    x144      c4                4970   c5                4970
+    x144      c6                4970   c7                4970
+    x144      c8                4970   c9                4970
+    x144      c10               4970   c11               4970
+    x144      c12               4970   c13               3647
+    x145      obj               1E-5   c1                   1
+    x145      c2                1582   c3                1582
+    x145      c4        1007.7206724   c5                1582
+    x145      c6                1582   c7                1582
+    x145      c8                1582   c9                1582
+    x145      c10               1582   c11               1582
+    x145      c12               1582   c13               1582
+    x146      obj               1E-5   c1                   1
+    x146      c2                6146   c3                6146
+    x146      c4                6146   c6                6146
+    x146      c7                4694   c8                6146
+    x146      c9        4153.7584475   c10       956.80938421
+    x146      c11               6146   c12               6146
+    x146      c13               3939
+    x147      obj               1E-5   c1                   1
+    x147      c2                6295   c3                6295
+    x147      c4                6295   c5        5403.1975669
+    x147      c6                6295   c10               6295
+    x147      c11       4239.4996656   c12               6295
+    x147      c13               6295
+    x148      obj               1E-5   c1                   1
+    x148      c2                8177   c3                8177
+    x148      c5        3640.0593674   c6                8177
+    x148      c8                8177   c11       5869.4915429
+    x148      c12       1942.6756757   c13               8177
+    x149      obj               1E-5   c1                   1
+    x149      c2                5339   c3              6015.5
+    x149      c4                8641   c6                8742
+    x149      c7        4299.5617978   c8                8742
+    x149      c10               4836
+    x150      obj               1E-5   c1                   1
+    x150      c2                9936   c3                9936
+    x150      c8                9936   c9                8641
+    x150      c10               5887   c11               9936
+    x150      c12               9936   c13               9936
+    MARK0001  'MARKER'                 'INTEND'
+    x151      obj                  1   c2                   1
+    x151      c3                   1   c4                   1
+    x151      c5                   1   c6                   1
+    x151      c7                   1   c8                   1
+    x151      c9                   1   c10                  1
+    x151      c11                  1   c12                  1
+    x151      c13                  1
+RHS
+    rhs       c1                  20   c2        157344.61033
+    rhs       c3        110007.77718   c4        113089.95355
+    rhs       c5              107767   c6        107283.94838
+    rhs       c7               86376   c8              107309
+    rhs       c9        105490.73653   c10       117802.11377
+    rhs       c11              97934   c12              85137
+    rhs       c13            94358.5
+BOUNDS
+ UP bnd       x1                   1
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ UP bnd       x75                  1
+ UP bnd       x76                  1
+ UP bnd       x77                  1
+ UP bnd       x78                  1
+ UP bnd       x79                  1
+ UP bnd       x80                  1
+ UP bnd       x81                  1
+ UP bnd       x82                  1
+ UP bnd       x83                  1
+ UP bnd       x84                  1
+ UP bnd       x85                  1
+ UP bnd       x86                  1
+ UP bnd       x87                  1
+ UP bnd       x88                  1
+ UP bnd       x89                  1
+ UP bnd       x90                  1
+ UP bnd       x91                  1
+ UP bnd       x92                  1
+ UP bnd       x93                  1
+ UP bnd       x94                  1
+ UP bnd       x95                  1
+ UP bnd       x96                  1
+ UP bnd       x97                  1
+ UP bnd       x98                  1
+ UP bnd       x99                  1
+ UP bnd       x100                 1
+ UP bnd       x101                 1
+ UP bnd       x102                 1
+ UP bnd       x103                 1
+ UP bnd       x104                 1
+ UP bnd       x105                 1
+ UP bnd       x106                 1
+ UP bnd       x107                 1
+ UP bnd       x108                 1
+ UP bnd       x109                 1
+ UP bnd       x110                 1
+ UP bnd       x111                 1
+ UP bnd       x112                 1
+ UP bnd       x113                 1
+ UP bnd       x114                 1
+ UP bnd       x115                 1
+ UP bnd       x116                 1
+ UP bnd       x117                 1
+ UP bnd       x118                 1
+ UP bnd       x119                 1
+ UP bnd       x120                 1
+ UP bnd       x121                 1
+ UP bnd       x122                 1
+ UP bnd       x123                 1
+ UP bnd       x124                 1
+ UP bnd       x125                 1
+ UP bnd       x126                 1
+ UP bnd       x127                 1
+ UP bnd       x128                 1
+ UP bnd       x129                 1
+ UP bnd       x130                 1
+ UP bnd       x131                 1
+ UP bnd       x132                 1
+ UP bnd       x133                 1
+ UP bnd       x134                 1
+ UP bnd       x135                 1
+ UP bnd       x136                 1
+ UP bnd       x137                 1
+ UP bnd       x138                 1
+ UP bnd       x139                 1
+ UP bnd       x140                 1
+ UP bnd       x141                 1
+ UP bnd       x142                 1
+ UP bnd       x143                 1
+ UP bnd       x144                 1
+ UP bnd       x145                 1
+ UP bnd       x146                 1
+ UP bnd       x147                 1
+ UP bnd       x148                 1
+ UP bnd       x149                 1
+ UP bnd       x150                 1
+ UP bnd       x151             1E+12
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mas76.mps b/demos/ppl_lpsol/examples/mas76.mps
new file mode 100644
index 0000000..7ff9a64
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mas76.mps
@@ -0,0 +1,1134 @@
+NAME           mas76
+ROWS
+ N  obj     
+ L  c1      
+ G  c2      
+ G  c3      
+ G  c4      
+ G  c5      
+ G  c6      
+ G  c7      
+ G  c8      
+ G  c9      
+ G  c10     
+ G  c11     
+ G  c12     
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        obj               1E-5   c1                   1
+    x1        c2        3857.5340376   c3                4264
+    x1        c4                4264   c5                4264
+    x1        c6                4264   c7                4264
+    x1        c8                4264   c9                4264
+    x1        c10               4264   c11               4264
+    x1        c12               4264
+    x2        obj               1E-5   c1                   1
+    x2        c2        125.76760563   c3                5339
+    x2        c4                5339   c5                5339
+    x2        c6                4264   c7                5339
+    x2        c8                5339   c9        3875.8958001
+    x2        c10       1218.3024772   c11       2349.7029047
+    x2        c12       3717.0066721
+    x3        obj               1E-5   c1                   1
+    x3        c2        7165.7769953   c3        5997.5298448
+    x3        c4                4020   c5        2551.0705817
+    x3        c6                7749   c7                5950
+    x3        c8                8260   c9        4091.5157068
+    x3        c11       5954.3061901   c12               3906
+    x4        obj               1E-5   c1                   1
+    x4        c2                2876   c3                2876
+    x4        c4                2876   c5                2876
+    x4        c6                2876   c7                2876
+    x4        c8                2876   c9                2876
+    x4        c10               2876   c11               2876
+    x4        c12               2876
+    x5        obj               1E-5   c1                   1
+    x5        c2                9723   c5                9723
+    x5        c6                9723   c7                9723
+    x5        c8                8445   c9                9723
+    x5        c11               9723   c12       7630.8567538
+    x6        obj               1E-5   c1                   1
+    x6        c2                7310   c3                7310
+    x6        c4                7310   c5                7310
+    x6        c8                7310   c11               7310
+    x6        c12               7310
+    x7        obj               1E-5   c1                   1
+    x7        c2                1529   c3                1529
+    x7        c4                1529   c5                1529
+    x7        c6                1529   c7                1529
+    x7        c8                1529   c9                1529
+    x7        c10               1529   c11               1529
+    x7        c12               1529
+    x8        obj               1E-5   c1                   1
+    x8        c2                1585   c3                1585
+    x8        c4                1585   c5                1585
+    x8        c6                1585   c7                1585
+    x8        c8                1585   c9                1585
+    x8        c10               1585   c11               1585
+    x8        c12               1585
+    x9        obj               1E-5   c1                   1
+    x9        c2                2949   c3                2949
+    x9        c4                2949   c5                2949
+    x9        c6                2949   c7                2949
+    x9        c8                2949   c9                2949
+    x9        c10               2949   c11               2949
+    x9        c12               2949
+    x10       obj               1E-5   c1                   1
+    x10       c2                7097   c3        4194.6948608
+    x10       c4                7097   c5                7097
+    x10       c6        5307.6683033   c7        3402.7992571
+    x10       c8                7097   c9                7097
+    x10       c11               7097   c12       3993.4803922
+    x11       obj               1E-5   c1                   1
+    x11       c2                1239   c3                1239
+    x11       c4                1239   c5                1239
+    x11       c6                1239   c7                1239
+    x11       c8                1239   c9                1239
+    x11       c10               1239   c11               1239
+    x11       c12               1239
+    x12       obj               1E-5   c1                   1
+    x12       c2                6449   c3                9402
+    x12       c4                5213   c5        5460.1237005
+    x12       c6        4623.3631424   c7                6449
+    x12       c8        2364.3477082   c9                9402
+    x12       c11       6019.7713621
+    x13       obj               1E-5   c1                   1
+    x13       c2          4596.07277   c3                8025
+    x13       c4        5205.5725555   c5        6988.5590257
+    x13       c6        5095.7938067   c7                3647
+    x13       c8                2463   c9        141.85254951
+    x13       c10       2623.8400161   c11               8025
+    x13       c12       996.84041394
+    x14       obj               1E-5   c1                   1
+    x14       c2                8037   c3                8037
+    x14       c5                8037   c6                8037
+    x14       c8                8037   c9                8037
+    x14       c10               8037   c12               8037
+    x15       obj               1E-5   c1                   1
+    x15       c2                7123   c3                7123
+    x15       c4        3447.1997813   c5                7123
+    x15       c6                7123   c7        4517.0858346
+    x15       c8                7123   c10               7123
+    x15       c11               7123
+    x16       obj               1E-5   c1                   1
+    x16       c2                8067   c3        4956.3455567
+    x16       c4        5187.6249609   c5                8067
+    x16       c6                8067   c10       3697.4308858
+    x16       c11               8067
+    x17       obj               1E-5   c1                   1
+    x17       c2                5704   c3                5704
+    x17       c4                5704   c5                5704
+    x17       c6                5704   c7                5704
+    x17       c8                2933   c9                5704
+    x17       c10               5704   c11               5704
+    x17       c12               5704
+    x18       obj               1E-5   c1                   1
+    x18       c2                1582   c3                1582
+    x18       c4        1506.6047419   c5                1582
+    x18       c6                1582   c7                1582
+    x18       c8                1582   c9                1582
+    x18       c10               1582   c11               1582
+    x18       c12               1582
+    x19       obj               1E-5   c1                   1
+    x19       c2                8713   c4                8713
+    x19       c5        4132.4582009   c6         6570.524825
+    x19       c7        7115.7257058   c8                8713
+    x19       c10               8713   c11               8713
+    x19       c12       7955.7135076
+    x20       obj               1E-5   c1                   1
+    x20       c2                9232   c4                9232
+    x20       c6                9232   c8                9232
+    x20       c9                8172   c10               8172
+    x20       c11               9232   c12               9232
+    x21       obj               1E-5   c1                   1
+    x21       c2                3371   c3        4450.6085385
+    x21       c4                4600   c5                4035
+    x21       c6                4035   c7                3371
+    x21       c8                4600   c9                4600
+    x21       c10               4600   c11               4600
+    x21       c12               4600
+    x22       obj               1E-5   c1                   1
+    x22       c2                2637   c3                2637
+    x22       c4                2637   c5                2637
+    x22       c6                2637   c7                2637
+    x22       c8                2637   c9                2637
+    x22       c10               2637   c11               2637
+    x22       c12               2637
+    x23       obj               1E-5   c1                   1
+    x23       c2                7131   c3        2834.0627677
+    x23       c4        3022.4184269   c5        5161.2867944
+    x23       c6        5112.4181569   c7                7131
+    x23       c8        6859.5538378   c9        6201.8467448
+    x23       c10        3993.954677   c11               7131
+    x23       c12       6771.8233932
+    x24       obj               1E-5   c1                   1
+    x24       c2         418.3028169   c3        6800.7326017
+    x24       c4        1444.7264377   c5        4438.6399605
+    x24       c6        4376.4583031   c7        5896.5208271
+    x24       c8        2400.0713317   c9                4056
+    x24       c10               9861   c11       4486.3993937
+    x24       c12       425.53118192
+    x25       obj               1E-5   c1                   1
+    x25       c2                3647   c3                3647
+    x25       c4                3647   c5                3647
+    x25       c6                3647   c7                3647
+    x25       c8                3647   c9                3647
+    x25       c10               3647   c11               3647
+    x25       c12               3647
+    x26       obj               1E-5   c1                   1
+    x26       c2        5688.4859155   c3        5067.3705835
+    x26       c4                8494   c5        4130.3600395
+    x26       c6        6202.6957438   c7                8494
+    x26       c8                2923   c9                4370
+    x26       c10               8494   c11       5761.3993937
+    x26       c12       2913.3760893
+    x27       obj               1E-5   c1                   1
+    x27       c2        7832.5997653   c3                9897
+    x27       c5                9897   c7        379.40517583
+    x27       c8        1683.2694603   c9        692.80030731
+    x27       c10       1978.1561741   c11       3143.4143401
+    x27       c12       2587.7352941
+    x28       obj               1E-5   c1                   1
+    x28       c2        4409.1255869   c3                5880
+    x28       c4                4579   c5                5880
+    x28       c6                5880   c7                5880
+    x28       c8                5880   c9                1252
+    x28       c10               5880   c11       4322.1433305
+    x28       c12       3416.7352941
+    x29       obj               1E-5   c1                   1
+    x29       c2                1053   c3                1053
+    x29       c4                1053   c5                1053
+    x29       c6                1053   c7                1053
+    x29       c8                1053   c9                1053
+    x29       c10               1053   c11               1053
+    x29       c12               1053
+    x30       obj               1E-5   c1                   1
+    x30       c2                2869   c3                2869
+    x30       c4                2869   c5                2869
+    x30       c6                2869   c7                2869
+    x30       c8        2781.1171684   c9                2869
+    x30       c10               2869   c11               2869
+    x30       c12               2869
+    x31       obj               1E-5   c1                   1
+    x31       c2                5410   c3                5410
+    x31       c4                5410   c5                4453
+    x31       c6                5410   c7                5410
+    x31       c8         1920.896664   c9                5410
+    x31       c10               5410   c11               5410
+    x31       c12       1867.9586057
+    x32       obj               1E-5   c1                   1
+    x32       c2                3948   c3                3948
+    x32       c4                3948   c5                3948
+    x32       c6                3948   c7                3948
+    x32       c8                3948   c9                3948
+    x32       c10               3948   c11               3948
+    x32       c12               3948
+    x33       obj               1E-5   c1                   1
+    x33       c2                6049   c3                6049
+    x33       c4                6049   c5                6049
+    x33       c6                6049   c7                6049
+    x33       c8                6049   c9                6049
+    x33       c10               6049   c11               6049
+    x33       c12               6049
+    x34       obj               1E-5   c1                   1
+    x34       c2                9317   c4                9317
+    x34       c6                9317   c8                9317
+    x34       c9                9317   c10               9317
+    x35       obj               1E-5   c1                   1
+    x35       c2                6880   c3                6880
+    x35       c4               179.5   c5                1950
+    x35       c6                6880   c7        2814.2200099
+    x35       c8        2633.4930838   c9        4584.1996927
+    x35       c10       2002.5472941   c11       4666.1862662
+    x35       c12               6880
+    x36       obj               1E-5   c1                   1
+    x36       c2                3779   c3                3779
+    x36       c4                3779   c5                3779
+    x36       c6                3779   c7                3779
+    x36       c8                3779   c9                3779
+    x36       c10               3779   c11               3779
+    x36       c12               3779
+    x37       obj               1E-5   c1                   1
+    x37       c2                3641   c3                3641
+    x37       c4                3641   c5                3641
+    x37       c6                3641   c7                3641
+    x37       c8                3641   c9                3641
+    x37       c10               3641   c11               3641
+    x37       c12               3641
+    x38       obj               1E-5   c1                   1
+    x38       c2                5567   c3        4989.1615364
+    x38       c4                5567   c5                5567
+    x38       c6                5567   c7                5567
+    x38       c8                5567   c9                5567
+    x38       c10               5567   c11               5353
+    x38       c12               5567
+    x39       obj               1E-5   c1                   1
+    x39       c2                2197   c3                2197
+    x39       c4                2197   c5                2197
+    x39       c6                2197   c7                2197
+    x39       c8                2197   c9                2197
+    x39       c10               2197   c11               2197
+    x39       c12               2197
+    x40       obj               1E-5   c1                   1
+    x40       c2                2842   c3                2842
+    x40       c4                2842   c5                2842
+    x40       c6                2842   c7                2842
+    x40       c8                2842   c9                2842
+    x40       c10               2842   c11               2842
+    x40       c12               2842
+    x41       obj               1E-5   c1                   1
+    x41       c2                4846   c3                4846
+    x41       c4                4846   c5                4846
+    x41       c6                4846   c7                4846
+    x41       c8                4846   c9                4846
+    x41       c10               4846   c11               4846
+    x41       c12               4846
+    x42       obj               1E-5   c1                   1
+    x42       c2                4616   c3                4616
+    x42       c4                4616   c5                4616
+    x42       c6        4386.6285041   c7                4616
+    x42       c8                4616   c9                4616
+    x42       c10               4616   c11               4616
+    x42       c12               4616
+    x43       obj               1E-5   c1                   1
+    x43       c2                8807   c4                8807
+    x43       c5                8807   c8                8807
+    x43       c9                8807   c10               8807
+    x43       c11               8807   c12               8807
+    x44       obj               1E-5   c1                   1
+    x44       c2                3261   c3                3261
+    x44       c4                3261   c5                3261
+    x44       c6                3261   c7                3261
+    x44       c8                3261   c9                3261
+    x44       c10               3261   c11               3261
+    x44       c12               3261
+    x45       obj               1E-5   c1                   1
+    x45       c2                3553   c3                3553
+    x45       c4                3553   c5                3553
+    x45       c6                3553   c7                3553
+    x45       c8                3553   c9                3553
+    x45       c10               3553   c11               3553
+    x45       c12               3553
+    x46       obj               1E-5   c1                   1
+    x46       c2                5239   c3                5239
+    x46       c4                5239   c5                5239
+    x46       c6                5239   c7                5239
+    x46       c8                5239   c9                5239
+    x46       c10               5239   c11               5239
+    x46       c12               5239
+    x47       obj               1E-5   c1                   1
+    x47       c2                6665   c3                6665
+    x47       c4                6665   c5                6665
+    x47       c6                6665   c7                6665
+    x47       c9                6665   c10               6665
+    x47       c11               6665
+    x48       obj               1E-5   c1                   1
+    x48       c2        3257.4906103   c3        6513.6694995
+    x48       c4                8172   c6                8172
+    x48       c7        5519.3776127   c8                8172
+    x48       c9                8172   c10               8172
+    x48       c11               8172   c12               8172
+    x49       obj               1E-5   c1                   1
+    x49       c2         7219.556338   c3        6513.6694995
+    x49       c4                8425   c6                8425
+    x49       c7        5519.3776127   c8                8425
+    x49       c11               8425   c12       4380.7073802
+    x50       obj               1E-5   c1                   1
+    x50       c2                2536   c3                2536
+    x50       c4                2536   c5                2536
+    x50       c6                2536   c7                2536
+    x50       c8                2536   c9                2536
+    x50       c10               2536   c11               2536
+    x50       c12               2536
+    x51       obj               1E-5   c1                   1
+    x51       c2                8013   c3                5762
+    x51       c5        5175.6917691   c6        2922.0679176
+    x51       c7        2679.7992571   c8        6292.9194467
+    x51       c9        7163.2213749   c10       5780.0146168
+    x51       c11               8013   c12        5333.267293
+    x52       obj               1E-5   c1                   1
+    x52       c2                3541   c3                3541
+    x52       c4                3541   c5                3541
+    x52       c6        922.71451306   c7                3541
+    x52       c8                3541   c9                3541
+    x52       c10               3541   c11               3541
+    x52       c12               3541
+    x53       obj               1E-5   c1                   1
+    x53       c2                8080   c3                8080
+    x53       c5                8080   c6                8080
+    x53       c9                8080   c10               8080
+    x53       c11               8080   c12               8080
+    x54       obj               1E-5   c1                   1
+    x54       c2        5593.0586854   c3                6767
+    x54       c4        4966.4377418   c5        2857.9555159
+    x54       c6                6767   c7        5991.3240713
+    x54       c8        4602.7549498   c9        3568.8679718
+    x54       c10       6701.5752929   c11               6767
+    x54       c12       3547.4434913
+    x55       obj               1E-5   c1                   1
+    x55       c2                5036   c3                5036
+    x55       c4                5036   c5                5036
+    x55       c6                5036   c7                5036
+    x55       c8                5036   c9                5036
+    x55       c10               5036   c11               5036
+    x55       c12               5036
+    x56       obj               1E-5   c1                   1
+    x56       c2                1782   c3                1782
+    x56       c4                1782   c5                1782
+    x56       c6                1782   c7                1782
+    x56       c8                1782   c9                1782
+    x56       c10               1782   c11               1782
+    x56       c12               1782
+    x57       obj               1E-5   c1                   1
+    x57       c2                3895   c3                3895
+    x57       c4                3895   c5                3895
+    x57       c6                3895   c7                3895
+    x57       c8                3895   c9                3895
+    x57       c10               3895   c11               3895
+    x57       c12       769.38126362
+    x58       obj               1E-5   c1                   1
+    x58       c2                4205   c3                4205
+    x58       c4                4205   c5                4205
+    x58       c6                4205   c7                4205
+    x58       c8                4205   c9                4205
+    x58       c10               4205   c11               4205
+    x58       c12               4205
+    x59       obj               1E-5   c1                   1
+    x59       c2                7772   c3                7772
+    x59       c4                7772   c7                7772
+    x59       c9                7772   c10               7772
+    x59       c11       6995.3832487
+    x60       obj               1E-5   c1                   1
+    x60       c2                9326   c4        6887.3290528
+    x60       c5        2548.0705817   c6                9326
+    x60       c7                9326   c8        5781.2161649
+    x60       c10               9326   c11               9326
+    x61       obj               1E-5   c1                   1
+    x61       c2                4757   c3                4757
+    x61       c4        1337.1303919   c5        1766.2736704
+    x61       c8        3828.0930296   c9        2546.4977806
+    x61       c10       4720.6651742   c11               1936
+    x61       c12       1374.3269336
+    x62       obj               1E-5   c1                   1
+    x62       c2                5355   c3                5355
+    x62       c4                5355   c5                5355
+    x62       c6                5355   c7                5355
+    x62       c8                5355   c9        920.44109948
+    x62       c10               5355   c11               5355
+    x62       c12               5355
+    x63       obj               1E-5   c1                   1
+    x63       c2                1919   c3                1919
+    x63       c4                1919   c5                1919
+    x63       c6                1919   c7                1919
+    x63       c8                1919   c9                1919
+    x63       c10               1919   c11               1919
+    x63       c12               1919
+    x64       obj               1E-5   c1                   1
+    x64       c2        7510.5774648   c3        7988.4333512
+    x64       c4        6185.1233268   c6        5491.8578076
+    x64       c7        6851.4383853   c8        6803.6804991
+    x64       c10       3921.3900634   c11       7066.1811901
+    x64       c12       1296.5245098
+    x65       obj               1E-5   c1                   1
+    x65       c2                7341   c3                7341
+    x65       c4                7341   c5                7341
+    x65       c8                7341   c9        6295.6057364
+    x65       c11               7341
+    x66       obj               1E-5   c1                   1
+    x66       c2                8541   c3                8541
+    x66       c6                4655   c7                8541
+    x66       c8                4655   c9                3195
+    x66       c10               8541   c11               4655
+    x66       c12               8541
+    x67       obj               1E-5   c1                   1
+    x67       c2                8352   c3                8352
+    x67       c5                8352   c7                8352
+    x67       c10               8352   c11               8352
+    x67       c12               8352
+    x68       obj               1E-5   c1                   1
+    x68       c2                3291   c3                3291
+    x68       c4                3291   c5                3291
+    x68       c6                3291   c7                3291
+    x68       c8                3291   c9                3291
+    x68       c10               3291   c11               3291
+    x68       c12               3291
+    x69       obj               1E-5   c1                   1
+    x69       c2                7328   c3                7328
+    x69       c4                7328   c5                7328
+    x69       c8                7328   c11               7328
+    x69       c12               7328
+    x70       obj               1E-5   c1                   1
+    x70       c2                4506   c3                4506
+    x70       c4                4506   c5                4506
+    x70       c6                4506   c7                4506
+    x70       c8                4506   c9                4506
+    x70       c10               4506   c11               4506
+    x70       c12               4506
+    x71       obj               1E-5   c1                   1
+    x71       c2                4429   c3                4429
+    x71       c4                4429   c5                4429
+    x71       c6                4429   c7                4429
+    x71       c8                4429   c9                4429
+    x71       c10               4429   c11               4429
+    x71       c12               4429
+    x72       obj               1E-5   c1                   1
+    x72       c2                4593   c3                4593
+    x72       c4        2038.6351681   c5                4593
+    x72       c6        3783.7812896   c7        2671.1703318
+    x72       c8        2068.3189585   c9                4593
+    x72       c10               4593   c11               4593
+    x72       c12       758.29711329
+    x73       obj               1E-5   c1                   1
+    x73       c2                9138   c4         6121.179313
+    x73       c5                8484   c7        4071.8888806
+    x73       c8                8484   c9        2896.1020089
+    x73       c10               9138   c11       2081.7976241
+    x73       c12       2184.2401961
+    x74       obj               1E-5   c1                   1
+    x74       c2        3731.7664319   c3        6465.6610011
+    x74       c4         6197.801258   c5         6175.543002
+    x74       c7        5999.3406637   c8        4290.3138053
+    x74       c9        5877.0429661   c10       3472.3031042
+    x74       c11       3545.8932953   c12       4236.1090686
+    x75       obj               1E-5   c1                   1
+    x75       c2        5124.2922535   c3        5806.8664347
+    x75       c4         1698.801258   c5        2921.3990893
+    x75       c6        654.39121533   c7        3781.9888063
+    x75       c8        5470.8814755   c9        984.49846346
+    x75       c10       630.30310424   c11       5202.9097575
+    x75       c12       5406.1224129
+    x76       obj               1E-5   c1                   1
+    x76       c2                4378   c3                4378
+    x76       c4        2279.4274445   c5                4378
+    x76       c6                4378   c8                4378
+    x76       c9                4378   c10               4378
+    x76       c11               4378   c12               4378
+    x77       obj               1E-5   c1                   1
+    x77       c2                3647   c3                3647
+    x77       c4                3647   c5                3647
+    x77       c6                3647   c7                3647
+    x77       c8                3647   c9                3647
+    x77       c10               3647   c11               3647
+    x77       c12               3647
+    x78       obj               1E-5   c1                   1
+    x78       c2                3795   c3        1395.1358405
+    x78       c4                3795   c5                3795
+    x78       c6                3795   c7                3795
+    x78       c8                3795   c9                3795
+    x78       c10               2912   c11               3795
+    x78       c12               3795
+    x79       obj               1E-5   c1                   1
+    x79       c2                2912   c3                2912
+    x79       c4                2912   c5                2912
+    x79       c6                2912   c7                2912
+    x79       c8                2912   c9                2912
+    x79       c10               2912   c11               2912
+    x79       c12               2912
+    x80       obj               1E-5   c1                   1
+    x80       c2                8830   c4                8830
+    x80       c5        2505.1281467   c6                8830
+    x80       c7                8830   c8                8830
+    x80       c9                8830   c12        40.55787037
+    x81       obj               1E-5   c1                   1
+    x81       c2                5445   c3                5445
+    x81       c4                5445   c5                5445
+    x81       c6                5445   c7                5445
+    x81       c8                5445   c9        2395.8979911
+    x81       c10               5445   c11               5445
+    x81       c12               5445
+    x82       obj               1E-5   c1                   1
+    x83       obj               1E-5   c1                   1
+    x83       c2                6112   c3                6112
+    x83       c4        4478.7723368   c5                6112
+    x83       c6                6112   c7                6112
+    x83       c8                6112   c9                6112
+    x83       c10               6112   c11               6112
+    x83       c12               6112
+    x84       obj               1E-5   c1                   1
+    x84       c2                8841   c4                8841
+    x84       c5                8841   c6                8841
+    x84       c10               8841   c12               8841
+    x85       obj               1E-5   c1                   1
+    x85       c2                1236   c3                1236
+    x85       c4                1236   c5                1236
+    x85       c6                1236   c7                1236
+    x85       c8                1236   c9                1236
+    x85       c10               1236   c11               1236
+    x85       c12               1236
+    x86       obj               1E-5   c1                   1
+    x86       c2                7010   c3                7010
+    x86       c4                7010   c5                7010
+    x86       c6                7010   c9                7010
+    x86       c10               7010
+    x87       obj               1E-5   c1                   1
+    x87       c2                2909   c3                2909
+    x87       c4                2909   c5                2909
+    x87       c6                2909   c7                2909
+    x87       c8                2909   c9                2909
+    x87       c10               2909   c11               2909
+    x87       c12               2909
+    x88       obj               1E-5   c1                   1
+    x88       c2                7622   c3                7622
+    x88       c4                7622   c7                7622
+    x88       c8                7622   c9                7622
+    x88       c10               7622   c12               7622
+    x89       obj               1E-5   c1                   1
+    x89       c2                7393   c3         6594.385439
+    x89       c4        1997.1997813   c5        6110.5626987
+    x89       c6        5966.6503463   c7        6281.3502229
+    x89       c8                7393   c9                7393
+    x89       c10               7393   c12               7393
+    x90       obj               1E-5   c1                   1
+    x90       c2        8317.6971831   c3                8830
+    x90       c6        4789.3781866   c7        4764.2200099
+    x90       c8        3307.7596962   c9        4019.8003073
+    x90       c10       3952.5472941   c11       5757.7289904
+    x90       c12               8830
+    x91       obj               1E-5   c1                   1
+    x91       c2                1950   c3                1950
+    x91       c4               179.5   c5                1950
+    x91       c6                1950   c7                1950
+    x91       c8                1950   c9                1950
+    x91       c10               1950   c11               1950
+    x91       c12               1950
+    x92       obj               1E-5   c1                   1
+    x92       c2                4654   c3                4654
+    x92       c4                4654   c5                4654
+    x92       c6                4654   c7                4654
+    x92       c8                4654   c9        2510.3471432
+    x92       c10               4654   c11               4654
+    x92       c12               4654
+    x93       obj               1E-5   c1                   1
+    x93       c2                2255   c3                2255
+    x93       c4                2255   c5                2255
+    x93       c6                2255   c7                2255
+    x93       c8                2255   c9                2255
+    x93       c10               2255   c11               2255
+    x93       c12               2255
+    x94       obj               1E-5   c1                   1
+    x94       c2                7104   c3                7104
+    x94       c4                7104   c5                7104
+    x94       c6                7104   c10               7104
+    x94       c12               7104
+    x95       obj               1E-5   c1                   1
+    x95       c2        7534.7887324   c3                7744
+    x95       c4                7744   c6                7744
+    x95       c9        4404.6020089   c11               7744
+    x95       c12       5858.9893791
+    x96       obj               1E-5   c1                   1
+    x96       c2                2054   c3                2054
+    x96       c4                2054   c5                2054
+    x96       c6                2054   c7                2054
+    x96       c8                2054   c9                2054
+    x96       c10               2054   c11               2054
+    x96       c12               2054
+    x97       obj               1E-5   c1                   1
+    x97       c2                6682   c3                6682
+    x97       c4                6682   c5        2501.4582009
+    x97       c6        3124.5817884   c7                6682
+    x97       c8                6682   c9        1366.8979911
+    x97       c10               6682   c11       1810.9409546
+    x97       c12               6682
+    x98       obj               1E-5   c1                   1
+    x98       c2                3234   c3                3234
+    x98       c4                3234   c5                3234
+    x98       c6                3234   c7                3234
+    x98       c8                3234   c9                3234
+    x98       c10               3234   c11               3234
+    x98       c12               3234
+    x99       obj               1E-5   c1                   1
+    x99       c2                2842   c3                2842
+    x99       c4                2842   c5                2842
+    x99       c6        654.39121533   c7        2706.9888063
+    x99       c8                2842   c9                2842
+    x99       c10               2842   c11        1339.329068
+    x99       c12               2842
+    x100      obj               1E-5   c1                   1
+    x100      c2                3974   c3                3974
+    x100      c4                3974   c5                3974
+    x100      c6                3974   c7                3974
+    x100      c8                3974   c9                3974
+    x100      c10               3974   c11               3974
+    x100      c12               3974
+    x101      obj               1E-5   c1                   1
+    x101      c2                3624   c3                3624
+    x101      c4                3624   c5                3624
+    x101      c6                3624   c7                3624
+    x101      c8                3624   c9                3624
+    x101      c10               3624   c11               3624
+    x101      c12               3624
+    x102      obj               1E-5   c1                   1
+    x102      c2                5415   c3                5415
+    x102      c4                5415   c5                5415
+    x102      c6                5415   c7                5415
+    x102      c8                5415   c9                5415
+    x102      c10               5415   c11               5415
+    x102      c12               5415
+    x103      obj               1E-5   c1                   1
+    x103      c2                2246   c3        1997.6085385
+    x103      c4                2246   c5                1582
+    x103      c6                2246   c7                2246
+    x103      c8                2246   c9                2246
+    x103      c10               2246   c11               2246
+    x103      c12               2246
+    x104      obj               1E-5   c1                   1
+    x104      c2                8590   c3                8590
+    x104      c6                8590   c8                8590
+    x104      c9                8590   c10               8590
+    x104      c11               8590   c12               8590
+    x105      obj               1E-5   c1                   1
+    x105      c2                2633   c3         2373.137781
+    x105      c4                2633   c5                2633
+    x105      c6                2633   c7                2633
+    x105      c8                2633   c9                2633
+    x105      c10               2633   c11               2633
+    x105      c12               2633
+    x106      obj               1E-5   c1                   1
+    x106      c2                4655   c3                4655
+    x106      c4                4655   c5                4655
+    x106      c6                4655   c7                4655
+    x106      c8                4655   c9                4655
+    x106      c10               4655   c11               4655
+    x106      c12               4655
+    x107      obj               1E-5   c1                   1
+    x107      c2                2923   c3                2923
+    x107      c4                2923   c5                2923
+    x107      c6                2923   c7                2923
+    x107      c8                2923   c9                2923
+    x107      c10               2923   c11               2923
+    x107      c12               2923
+    x108      obj               1E-5   c1                   1
+    x108      c2                6318   c3                6318
+    x108      c4                6318   c5                6318
+    x108      c6                6318   c7                6318
+    x108      c8                6318   c9                6318
+    x108      c10               6318   c12               6318
+    x109      obj               1E-5   c1                   1
+    x109      c2                7440   c3                7440
+    x109      c4                7440   c6                7440
+    x109      c7                7440   c9                7440
+    x109      c12               7440
+    x110      obj               1E-5   c1                   1
+    x110      c2                4579   c3                4579
+    x110      c4                4579   c5                4579
+    x110      c6                4579   c7                4579
+    x110      c8                4579   c9                4579
+    x110      c10               4579   c11               4579
+    x110      c12               4579
+    x111      obj               1E-5   c1                   1
+    x111      c2                8342   c3                8342
+    x111      c5                8342   c7        5211.7323923
+    x111      c8                8342   c9                8342
+    x111      c10               8342
+    x112      obj               1E-5   c1                   1
+    x112      c2        3813.4002347   c3                5050
+    x112      c4                5050   c5        1365.1296074
+    x112      c6        3650.9002494   c7        1367.1828628
+    x112      c8        2259.9591809   c9                1582
+    x112      c10       4641.0618824   c12       1839.3216231
+    x113      obj               1E-5   c1                   1
+    x113      c2                6268   c3                6268
+    x113      c4                5050   c5                6268
+    x113      c6                6268   c7        987.77768697
+    x113      c8                6268   c9                6268
+    x113      c10               6268   c11       3143.4143401
+    x113      c12               6268
+    x114      obj               1E-5   c1                   1
+    x114      c2                8570   c3                8570
+    x114      c6                8570   c7                8570
+    x114      c8                8570   c10       2672.8901642
+    x114      c11               8570   c12       7847.8483115
+    x115      obj               1E-5   c1                   1
+    x115      c2                9838   c5                7799
+    x115      c6        7119.5646547   c7        8392.0859336
+    x115      c8                9838   c9                9838
+    x115      c10               9838   c11               9838
+    x115      c12               9838
+    x116      obj               1E-5   c1                   1
+    x116      c2                4876   c3                4876
+    x116      c4                4876   c5                4876
+    x116      c6                4876   c7                4876
+    x116      c8        1677.8517765   c9                4876
+    x116      c10               4876   c11               4876
+    x116      c12               4876
+    x117      obj               1E-5   c1                   1
+    x117      c2         418.3028169   c3        6800.7326017
+    x117      c4        1444.7264377   c5        4438.6399605
+    x117      c6        4376.4583031   c7        5896.5208271
+    x117      c8        2400.0713317   c9                4056
+    x117      c10               9861   c11       4486.3993937
+    x117      c12       425.53118192
+    x118      obj               1E-5   c1                   1
+    x118      c2                4922   c3                4922
+    x118      c4                4922   c5                4922
+    x118      c6                3590   c7                4922
+    x118      c8                4922   c9                3333
+    x118      c10               4922   c11               4922
+    x118      c12               4922
+    x119      obj               1E-5   c1                   1
+    x119      c2                3590   c3                3590
+    x119      c4                3590   c5                3590
+    x119      c6                3590   c7                3590
+    x119      c8                3590   c9                3590
+    x119      c10               3590   c11               3590
+    x119      c12               3590
+    x120      obj               1E-5   c1                   1
+    x120      c2                7152   c3                7152
+    x120      c4                7152   c5                7152
+    x120      c7                7152   c8                7152
+    x120      c10               7152
+    x121      obj               1E-5   c1                   1
+    x121      c2                7056   c3                7056
+    x121      c4                 805   c5                7056
+    x121      c6                7056   c7                7056
+    x121      c8                7056   c9        6684.7360005
+    x121      c10               7056   c11               7056
+    x121      c12               7056
+    x122      obj               1E-5   c1                   1
+    x122      c2                9136   c4                9136
+    x122      c6                9136   c7                9136
+    x122      c9                9136   c10               9136
+    x122      c11               9136
+    x123      obj               1E-5   c1                   1
+    x123      c2                7850   c3                7850
+    x123      c4                4655   c5                4655
+    x123      c7                7850   c9                7850
+    x123      c10               7850   c12               7850
+    x124      obj               1E-5   c1                   1
+    x124      c2                6863   c3                6863
+    x124      c4                6863   c5                6863
+    x124      c6                6863   c7                6863
+    x124      c12               6863
+    x125      obj               1E-5   c1                   1
+    x125      c2                9356   c4        6006.1685651
+    x125      c5                9356   c7                9356
+    x125      c9        7984.5952083   c11               4448
+    x125      c12       7131.2908497
+    x126      obj               1E-5   c1                   1
+    x126      c2                2933   c3                2933
+    x126      c4                2933   c5                2933
+    x126      c6                2933   c7                2933
+    x126      c8                2933   c9                2933
+    x126      c10               2933   c11               2933
+    x126      c12               2933
+    x127      obj               1E-5   c1                   1
+    x127      c2                2665   c3                2665
+    x127      c4                2665   c5                2665
+    x127      c6                2665   c7                2665
+    x127      c8                2665   c9                2665
+    x127      c10               2665   c11               2665
+    x127      c12               2665
+    x128      obj               1E-5   c1                   1
+    x128      c2                4063   c3                4063
+    x128      c4                4063   c5                4063
+    x128      c6                4063   c7                4063
+    x128      c8                4063   c9                4063
+    x128      c10               4063   c11               4063
+    x128      c12               4063
+    x129      obj               1E-5   c1                   1
+    x129      c2                7502   c3        7194.4958512
+    x129      c4                7502   c6        5805.6941235
+    x129      c7                7502   c8        2838.1593436
+    x129      c9         2973.398674   c10               7502
+    x129      c11       6324.7029047   c12       6844.4421296
+    x130      obj               1E-5   c1                   1
+    x130      c2                1966   c3                1966
+    x130      c4                1966   c5                1966
+    x130      c6                1966   c7                1966
+    x130      c8                1966   c9                1966
+    x130      c10               1966   c11               1966
+    x130      c12               1966
+    x131      obj               1E-5   c1                   1
+    x131      c2                4540   c3                4540
+    x131      c4                4540   c5                4540
+    x131      c6                4540   c7                4540
+    x131      c8                4540   c9                4540
+    x131      c10               4540   c11               4540
+    x131      c12               4540
+    x132      obj               1E-5   c1                   1
+    x132      c2                1370   c3                1370
+    x132      c4                1370   c5                1370
+    x132      c6                1370   c7                1370
+    x132      c8                1370   c9                1370
+    x132      c10               1370   c11               1370
+    x132      c12               1370
+    x133      obj               1E-5   c1                   1
+    x133      c2                9828   c5                9828
+    x133      c6                9828   c7                9828
+    x133      c9                9828   c11               9828
+    x133      c12               9828
+    x134      obj               1E-5   c1                   1
+    x134      c2                9376   c4                9376
+    x134      c7                9376   c8                9376
+    x134      c9                9376   c10               9376
+    x134      c11               9376   c12               9376
+    x135      obj               1E-5   c1                   1
+    x135      c2        3856.6326291   c3        699.33050054
+    x135      c4                6443   c5        2459.7239454
+    x135      c6                6443   c7        4204.3776127
+    x135      c8                6443   c9        5442.4805372
+    x135      c10       4223.2163061   c11               6443
+    x135      c12       4023.7207244
+    x136      obj               1E-5   c1                   1
+    x136      c2                1996   c3                1996
+    x136      c4                1996   c5                1996
+    x136      c6                1996   c7                1996
+    x136      c8                1996   c9                1996
+    x136      c10               1996   c11               1996
+    x136      c12               1996
+    x137      obj               1E-5   c1                   1
+    x137      c2                5320   c3                5320
+    x137      c4                5320   c5                5320
+    x137      c6        2230.8578076   c7                5320
+    x137      c8                5320   c9                5320
+    x137      c10               5320   c11               5320
+    x137      c12               5320
+    x138      obj               1E-5   c1                   1
+    x138      c2        3107.4788732   c3        2686.2422377
+    x138      c4        190.29012568   c6        35.415531264
+    x138      c7        3688.0699604   c8                6754
+    x138      c10               3234   c12        5299.145561
+    x139      obj               1E-5   c1                   1
+    x139      c2                1645   c3                1645
+    x139      c4                1645   c5                1645
+    x139      c6                1645   c7                1645
+    x139      c8                1645   c9                1645
+    x139      c10               1645   c11               1645
+    x139      c12               1645
+    x140      obj               1E-5   c1                   1
+    x140      c2        2890.0046948   c3        2194.0980996
+    x140      c4                1966   c5        234.37039265
+    x140      c6        6184.8933866   c7                 433
+    x140      c8        8057.6528343   c9        5264.9477578
+    x140      c10       7785.9167409   c11                433
+    x140      c12       5743.9670479
+    x141      obj               1E-5   c1                   1
+    x141      c2                4920   c3                4920
+    x141      c4        4276.6272259   c5                4920
+    x141      c6                4920   c7                4920
+    x141      c8                4920   c9                4920
+    x141      c10               4920   c11               4920
+    x141      c12               4920
+    x142      obj               1E-5   c1                   1
+    x142      c2                8107   c3                8107
+    x142      c5                8107   c6                8107
+    x142      c8                8107   c9                8107
+    x142      c11               8107
+    x143      obj               1E-5   c1                   1
+    x143      c2                6103   c3                6103
+    x143      c4                6103   c5        2850.6425595
+    x143      c6                6103   c7                6103
+    x143      c8        4014.9286683   c9                6103
+    x143      c10               6103   c11               6103
+    x143      c12               3705
+    x144      obj               1E-5   c1                   1
+    x144      c2                4970   c3                4970
+    x144      c4                4970   c5                4970
+    x144      c6                4970   c7                4970
+    x144      c8                4970   c9                4970
+    x144      c10               4970   c11               4970
+    x144      c12               4970
+    x145      obj               1E-5   c1                   1
+    x145      c2                1582   c3                1582
+    x145      c4                1582   c5                1582
+    x145      c6                1582   c7                1582
+    x145      c8                1582   c9                1582
+    x145      c10               1582   c11               1582
+    x145      c12               1582
+    x146      obj               1E-5   c1                   1
+    x146      c2                6146   c3        6007.6066649
+    x146      c4                6146   c5                6146
+    x146      c6        1807.4118259   c7                6146
+    x146      c8                6146   c9                6146
+    x146      c10        4055.643386   c11               6146
+    x146      c12       3889.5196078
+    x147      obj               1E-5   c1                   1
+    x147      c2                6295   c3                6295
+    x147      c4                6295   c5                6295
+    x147      c6                6295   c7                6295
+    x147      c8                6295   c9                6295
+    x147      c10               6295   c11               6295
+    x148      obj               1E-5   c1                   1
+    x148      c2                8177   c3              4739.5
+    x148      c4                8177   c7                8177
+    x148      c8                8177   c9                8177
+    x148      c10               8177   c11               8177
+    x148      c12               8177
+    x149      obj               1E-5   c1                   1
+    x149      c2                5339   c3        3384.6358405
+    x149      c4                8742   c5                3373
+    x149      c6        4547.1370064   c7                8742
+    x149      c8                8742   c9                8742
+    x149      c10               8742   c11               8742
+    x149      c12               8742
+    x150      obj               1E-5   c1                   1
+    x150      c2                9936   c5                9936
+    x150      c6                9936   c7                9936
+    x150      c8                9936   c10               9936
+    MARK0001  'MARKER'                 'INTEND'
+    x151      obj                  1   c2                   1
+    x151      c3                   1   c4                   1
+    x151      c5                   1   c6                   1
+    x151      c7                   1   c8                   1
+    x151      c9                   1   c10                  1
+    x151      c11                  1   c12                  1
+RHS
+    rhs       c1                  15   c2        157344.61033
+    rhs       c3        117845.82287   c4        121387.97778
+    rhs       c5         122529.5819   c6        124193.83991
+    rhs       c7        110802.52457   c8        111973.66667
+    rhs       c9              115941   c10       127089.14155
+    rhs       c11        112419.0906   c12             123188
+BOUNDS
+ UP bnd       x1                   1
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ UP bnd       x75                  1
+ UP bnd       x76                  1
+ UP bnd       x77                  1
+ UP bnd       x78                  1
+ UP bnd       x79                  1
+ UP bnd       x80                  1
+ UP bnd       x81                  1
+ UP bnd       x82                  1
+ UP bnd       x83                  1
+ UP bnd       x84                  1
+ UP bnd       x85                  1
+ UP bnd       x86                  1
+ UP bnd       x87                  1
+ UP bnd       x88                  1
+ UP bnd       x89                  1
+ UP bnd       x90                  1
+ UP bnd       x91                  1
+ UP bnd       x92                  1
+ UP bnd       x93                  1
+ UP bnd       x94                  1
+ UP bnd       x95                  1
+ UP bnd       x96                  1
+ UP bnd       x97                  1
+ UP bnd       x98                  1
+ UP bnd       x99                  1
+ UP bnd       x100                 1
+ UP bnd       x101                 1
+ UP bnd       x102                 1
+ UP bnd       x103                 1
+ UP bnd       x104                 1
+ UP bnd       x105                 1
+ UP bnd       x106                 1
+ UP bnd       x107                 1
+ UP bnd       x108                 1
+ UP bnd       x109                 1
+ UP bnd       x110                 1
+ UP bnd       x111                 1
+ UP bnd       x112                 1
+ UP bnd       x113                 1
+ UP bnd       x114                 1
+ UP bnd       x115                 1
+ UP bnd       x116                 1
+ UP bnd       x117                 1
+ UP bnd       x118                 1
+ UP bnd       x119                 1
+ UP bnd       x120                 1
+ UP bnd       x121                 1
+ UP bnd       x122                 1
+ UP bnd       x123                 1
+ UP bnd       x124                 1
+ UP bnd       x125                 1
+ UP bnd       x126                 1
+ UP bnd       x127                 1
+ UP bnd       x128                 1
+ UP bnd       x129                 1
+ UP bnd       x130                 1
+ UP bnd       x131                 1
+ UP bnd       x132                 1
+ UP bnd       x133                 1
+ UP bnd       x134                 1
+ UP bnd       x135                 1
+ UP bnd       x136                 1
+ UP bnd       x137                 1
+ UP bnd       x138                 1
+ UP bnd       x139                 1
+ UP bnd       x140                 1
+ UP bnd       x141                 1
+ UP bnd       x142                 1
+ UP bnd       x143                 1
+ UP bnd       x144                 1
+ UP bnd       x145                 1
+ UP bnd       x146                 1
+ UP bnd       x147                 1
+ UP bnd       x148                 1
+ UP bnd       x149                 1
+ UP bnd       x150                 1
+ UP bnd       x151             1E+12
+ENDATA
diff --git a/demos/ppl_lpsol/examples/modglob.mps b/demos/ppl_lpsol/examples/modglob.mps
new file mode 100644
index 0000000..fe9611e
--- /dev/null
+++ b/demos/ppl_lpsol/examples/modglob.mps
@@ -0,0 +1,1192 @@
+NAME           modglob
+ROWS
+ N  OBJ     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+ E  c7      
+ E  c8      
+ E  c9      
+ E  c10     
+ E  c11     
+ E  c12     
+ E  c13     
+ E  c14     
+ E  c15     
+ E  c16     
+ E  c17     
+ E  c18     
+ E  c19     
+ E  c20     
+ E  c21     
+ E  c22     
+ E  c23     
+ E  c24     
+ E  c25     
+ E  c26     
+ E  c27     
+ E  c28     
+ E  c29     
+ E  c30     
+ E  c31     
+ E  c32     
+ E  c33     
+ E  c34     
+ E  c35     
+ E  c36     
+ E  c37     
+ E  c38     
+ E  c39     
+ E  c40     
+ E  c41     
+ E  c42     
+ E  c43     
+ E  c44     
+ E  c45     
+ E  c46     
+ E  c47     
+ E  c48     
+ E  c49     
+ E  c50     
+ E  c51     
+ E  c52     
+ E  c53     
+ E  c54     
+ E  c55     
+ E  c56     
+ E  c57     
+ E  c58     
+ E  c59     
+ E  c60     
+ E  c61     
+ E  c62     
+ E  c63     
+ E  c64     
+ E  c65     
+ E  c66     
+ E  c67     
+ E  c68     
+ E  c69     
+ E  c70     
+ E  c71     
+ E  c72     
+ E  c73     
+ E  c74     
+ E  c75     
+ E  c76     
+ E  c77     
+ E  c78     
+ E  c79     
+ E  c80     
+ E  c81     
+ E  c82     
+ E  c83     
+ E  c84     
+ E  c85     
+ E  c86     
+ E  c87     
+ E  c88     
+ E  c89     
+ E  c90     
+ E  c91     
+ E  c92     
+ E  c93     
+ E  c94     
+ E  c95     
+ L  c96     
+ L  c97     
+ L  c98     
+ L  c99     
+ L  c100    
+ L  c101    
+ L  c102    
+ L  c103    
+ L  c104    
+ L  c105    
+ L  c106    
+ L  c107    
+ L  c108    
+ L  c109    
+ L  c110    
+ L  c111    
+ L  c112    
+ L  c113    
+ L  c114    
+ L  c115    
+ L  c116    
+ L  c117    
+ L  c118    
+ L  c119    
+ L  c120    
+ L  c121    
+ L  c122    
+ L  c123    
+ L  c124    
+ L  c125    
+ L  c126    
+ L  c127    
+ L  c128    
+ L  c129    
+ L  c130    
+ L  c131    
+ L  c132    
+ L  c133    
+ L  c134    
+ L  c135    
+ L  c136    
+ L  c137    
+ L  c138    
+ L  c139    
+ L  c140    
+ L  c141    
+ L  c142    
+ L  c143    
+ L  c144    
+ L  c145    
+ L  c146    
+ L  c147    
+ L  c148    
+ L  c149    
+ L  c150    
+ L  c151    
+ L  c152    
+ L  c153    
+ L  c154    
+ L  c155    
+ L  c156    
+ L  c157    
+ L  c158    
+ L  c159    
+ L  c160    
+ L  c161    
+ L  c162    
+ L  c163    
+ L  c164    
+ L  c165    
+ L  c166    
+ L  c167    
+ L  c168    
+ L  c169    
+ L  c170    
+ L  c171    
+ L  c172    
+ L  c173    
+ L  c174    
+ L  c175    
+ L  c176    
+ L  c177    
+ L  c178    
+ L  c179    
+ L  c180    
+ L  c181    
+ L  c182    
+ L  c183    
+ L  c184    
+ L  c185    
+ L  c186    
+ L  c187    
+ L  c188    
+ L  c189    
+ L  c190    
+ L  c191    
+ L  c192    
+ L  c193    
+ L  c194    
+ L  c195    
+ L  c196    
+ L  c197    
+ L  c198    
+ L  c199    
+ L  c200    
+ L  c201    
+ L  c202    
+ L  c203    
+ L  c204    
+ L  c205    
+ L  c206    
+ L  c207    
+ L  c208    
+ L  c209    
+ L  c210    
+ L  c211    
+ L  c212    
+ L  c213    
+ L  c214    
+ L  c215    
+ L  c216    
+ L  c217    
+ L  c218    
+ L  c219    
+ L  c220    
+ L  c221    
+ L  c222    
+ L  c223    
+ L  c224    
+ L  c225    
+ L  c226    
+ L  c227    
+ L  c228    
+ L  c229    
+ L  c230    
+ L  c231    
+ L  c232    
+ L  c233    
+ L  c234    
+ L  c235    
+ L  c236    
+ L  c237    
+ L  c238    
+ L  c239    
+ L  c240    
+ L  c241    
+ L  c242    
+ L  c243    
+ L  c244    
+ L  c245    
+ L  c246    
+ L  c247    
+ L  c248    
+ L  c249    
+ L  c250    
+ L  c251    
+ L  c252    
+ L  c253    
+ L  c254    
+ L  c255    
+ L  c256    
+ L  c257    
+ L  c258    
+ L  c259    
+ L  c260    
+ L  c261    
+ L  c262    
+ L  c263    
+ L  c264    
+ L  c265    
+ L  c266    
+ L  c267    
+ L  c268    
+ L  c269    
+ L  c270    
+ L  c271    
+ L  c272    
+ L  c273    
+ L  c274    
+ L  c275    
+ L  c276    
+ L  c277    
+ L  c278    
+ L  c279    
+ L  c280    
+ L  c281    
+ L  c282    
+ L  c283    
+ L  c284    
+ L  c285    
+ L  c286    
+ L  c287    
+ L  c288    
+ L  c289    
+ L  c290    
+ L  c291    
+COLUMNS
+    x1        OBJ                432   c1                -0.9
+    x2        OBJ                432   c3                -0.9
+    x3        OBJ                367   c2                  -1
+    x4        OBJ                367   c4                  -1
+    x5        OBJ            0.65392   c36                 -1
+    x5        c38               0.98   c98                  1
+    x6        OBJ           3.224038   c36                 -1
+    x6        c42               0.98   c96                  1
+    x7        OBJ            0.65392   c36               0.98
+    x7        c38                 -1   c196                 1
+    x8        OBJ           2.985518   c38                 -1
+    x8        c44               0.98   c100                 1
+    x9        OBJ           1.599959   c40                 -1
+    x9        c42               0.98   c206                 1
+    x10       OBJ           4.336906   c40                 -1
+    x10       c46               0.98   c110                 1
+    x11       OBJ           3.224038   c36               0.98
+    x11       c42                 -1   c194                 1
+    x12       OBJ           1.599959   c40               0.98
+    x12       c42                 -1   c108                 1
+    x13       OBJ           1.135649   c42                 -1
+    x13       c44               0.98   c200                 1
+    x14       OBJ           4.795188   c42                 -1
+    x14       c48               0.98   c106                 1
+    x15       OBJ           2.985518   c38               0.98
+    x15       c44                 -1   c198                 1
+    x16       OBJ           1.135649   c42               0.98
+    x16       c44                 -1   c102                 1
+    x17       OBJ           5.424316   c44                 -1
+    x17       c50               0.98   c104                 1
+    x18       OBJ           4.336906   c40               0.98
+    x18       c46                 -1   c208                 1
+    x19       OBJ           1.938308   c46                 -1
+    x19       c48               0.98   c210                 1
+    x20       OBJ           3.851157   c46                 -1
+    x20       c60               0.98   c124                 1
+    x21       OBJ           4.795188   c42               0.98
+    x21       c48                 -1   c204                 1
+    x22       OBJ           1.938308   c46               0.98
+    x22       c48                 -1   c112                 1
+    x23       OBJ             1.6951   c48                 -1
+    x23       c50               0.98   c114                 1
+    x24       OBJ           4.293357   c48                 -1
+    x24       c58               0.98   c122                 1
+    x25       OBJ           5.424316   c44               0.98
+    x25       c50                 -1   c202                 1
+    x26       OBJ             1.6951   c48               0.98
+    x26       c50                 -1   c212                 1
+    x27       OBJ           1.461269   c50                 -1
+    x27       c52               0.98   c116                 1
+    x28       OBJ           3.782818   c50                 -1
+    x28       c56               0.98   c120                 1
+    x29       OBJ           1.461269   c50               0.98
+    x29       c52                 -1   c214                 1
+    x30       OBJ           3.392878   c52                 -1
+    x30       c54               0.98   c118                 1
+    x31       OBJ           3.392878   c52               0.98
+    x31       c54                 -1   c216                 1
+    x32       OBJ           2.129257   c54                 -1
+    x32       c56               0.98   c126                 1
+    x33       OBJ           3.449157   c54                 -1
+    x33       c132                 1
+    x34       OBJ           3.782818   c50               0.98
+    x34       c56                 -1   c218                 1
+    x35       OBJ           2.129257   c54               0.98
+    x35       c56                 -1   c224                 1
+    x36       OBJ           2.294749   c56                 -1
+    x36       c58               0.98   c128                 1
+    x37       OBJ             3.3768   c56                 -1
+    x37       c64               0.98   c134                 1
+    x38       OBJ           4.293357   c48               0.98
+    x38       c58                 -1   c220                 1
+    x39       OBJ           2.294749   c56               0.98
+    x39       c58                 -1   c226                 1
+    x40       OBJ           2.068289   c58                 -1
+    x40       c60               0.98   c130                 1
+    x41       OBJ           3.107457   c58                 -1
+    x41       c66               0.98   c136                 1
+    x42       OBJ           3.851157   c46               0.98
+    x42       c60                 -1   c222                 1
+    x43       OBJ           2.068289   c58               0.98
+    x43       c60                 -1   c228                 1
+    x44       OBJ           1.222749   c60                 -1
+    x44       c62               0.98   c140                 1
+    x45       OBJ           2.622378   c60                 -1
+    x45       c68               0.98   c138                 1
+    x46       OBJ           1.222749   c60               0.98
+    x46       c62                 -1   c238                 1
+    x47       OBJ           2.252539   c62                 -1
+    x47       c70               0.98   c142                 1
+    x48       OBJ             3.3768   c56               0.98
+    x48       c64                 -1   c232                 1
+    x49       OBJ           2.510489   c64                 -1
+    x49       c66               0.98   c150                 1
+    x50       OBJ           4.276607   c64                 -1
+    x50       c80               0.98   c148                 1
+    x51       OBJ           2.449518   c64                 -1
+    x51       c244                 1
+    x52       OBJ           3.107457   c58               0.98
+    x52       c66                 -1   c234                 1
+    x53       OBJ           2.510489   c64               0.98
+    x53       c66                 -1   c248                 1
+    x54       OBJ           2.576149   c66                 -1
+    x54       c68               0.98   c154                 1
+    x55       OBJ           3.762717   c66                 -1
+    x55       c78               0.98   c152                 1
+    x56       OBJ           2.622378   c60               0.98
+    x56       c68                 -1   c236                 1
+    x57       OBJ           2.576149   c66               0.98
+    x57       c68                 -1   c252                 1
+    x58       OBJ           2.059578   c68                 -1
+    x58       c70               0.98   c158                 1
+    x59       OBJ             2.9078   c68                 -1
+    x59       c76               0.98   c156                 1
+    x60       OBJ           2.252539   c62               0.98
+    x60       c70                 -1   c240                 1
+    x61       OBJ           2.059578   c68               0.98
+    x61       c70                 -1   c256                 1
+    x62       OBJ             1.9631   c70                 -1
+    x62       c74               0.98   c160                 1
+    x63       OBJ           1.797607   c72                 -1
+    x63       c74               0.98   c278                 1
+    x64       OBJ           1.727258   c72                 -1
+    x64       c94               0.98   c182                 1
+    x65       OBJ             1.9631   c70               0.98
+    x65       c74                 -1   c258                 1
+    x66       OBJ           1.797607   c72               0.98
+    x66       c74                 -1   c180                 1
+    x67       OBJ           2.842138   c74                 -1
+    x67       c76               0.98   c274                 1
+    x68       OBJ           2.178839   c74                 -1
+    x68       c92               0.98   c178                 1
+    x69       OBJ             2.9078   c68               0.98
+    x69       c76                 -1   c254                 1
+    x70       OBJ           2.842138   c74               0.98
+    x70       c76                 -1   c176                 1
+    x71       OBJ           4.285317   c76                 -1
+    x71       c78               0.98   c270                 1
+    x72       OBJ           3.573778   c76                 -1
+    x72       c90               0.98   c174                 1
+    x73       OBJ           3.762717   c66               0.98
+    x73       c78                 -1   c250                 1
+    x74       OBJ           4.285317   c76               0.98
+    x74       c78                 -1   c172                 1
+    x75       OBJ           3.946967   c78                 -1
+    x75       c80               0.98   c266                 1
+    x76       OBJ           4.337578   c78                 -1
+    x76       c88               0.98   c170                 1
+    x77       OBJ           4.276607   c64               0.98
+    x77       c80                 -1   c246                 1
+    x78       OBJ           3.946967   c78               0.98
+    x78       c80                 -1   c168                 1
+    x79       OBJ           2.714838   c80                 -1
+    x79       c82               0.98   c262                 1
+    x80       OBJ              4.556   c80                 -1
+    x80       c86               0.98   c166                 1
+    x81       OBJ           2.714838   c80               0.98
+    x81       c82                 -1   c164                 1
+    x82       OBJ           4.397878   c82                 -1
+    x82       c84               0.98   c162                 1
+    x83       OBJ           4.060867   c82                 -1
+    x83       c242                 1
+    x84       OBJ           4.397878   c82               0.98
+    x84       c84                 -1   c260                 1
+    x85       OBJ           2.985518   c84                 -1
+    x85       c86               0.98   c184                 1
+    x86       OBJ              4.556   c80               0.98
+    x86       c86                 -1   c264                 1
+    x87       OBJ           2.985518   c84               0.98
+    x87       c86                 -1   c282                 1
+    x88       OBJ           5.672216   c86                 -1
+    x88       c88               0.98   c186                 1
+    x89       OBJ           4.337578   c78               0.98
+    x89       c88                 -1   c268                 1
+    x90       OBJ           5.672216   c86               0.98
+    x90       c88                 -1   c284                 1
+    x91       OBJ           6.280577   c88                 -1
+    x91       c90               0.98   c188                 1
+    x92       OBJ           3.573778   c76               0.98
+    x92       c90                 -1   c272                 1
+    x93       OBJ           6.280577   c88               0.98
+    x93       c90                 -1   c286                 1
+    x94       OBJ           4.728188   c90                 -1
+    x94       c92               0.98   c190                 1
+    x95       OBJ           2.178839   c74               0.98
+    x95       c92                 -1   c276                 1
+    x96       OBJ           4.728188   c90               0.98
+    x96       c92                 -1   c288                 1
+    x97       OBJ           2.384528   c92                 -1
+    x97       c94               0.98   c192                 1
+    x98       OBJ           1.727258   c72               0.98
+    x98       c94                 -1   c280                 1
+    x99       OBJ           2.384528   c92               0.98
+    x99       c94                 -1   c290                 1
+    x100      OBJ           3.449157   c3                   1
+    x100      c54               0.98   c230                 1
+    x101      OBJ           2.449518   c3                   1
+    x101      c64               0.98   c146                 1
+    x102      OBJ           4.060867   c3                   1
+    x102      c82               0.98   c144                 1
+    x103      OBJ            0.35136   c37                 -1
+    x103      c39               0.98   c99                  1
+    x104      OBJ           1.732319   c37                 -1
+    x104      c43               0.98   c97                  1
+    x105      OBJ            0.35136   c37               0.98
+    x105      c39                 -1   c197                 1
+    x106      OBJ           1.604159   c39                 -1
+    x106      c45               0.98   c101                 1
+    x107      OBJ            0.85968   c41                 -1
+    x107      c43               0.98   c207                 1
+    x108      OBJ           2.330278   c41                 -1
+    x108      c47               0.98   c111                 1
+    x109      OBJ           1.732319   c37               0.98
+    x109      c43                 -1   c195                 1
+    x110      OBJ            0.85968   c41               0.98
+    x110      c43                 -1   c109                 1
+    x111      OBJ             0.6102   c43                 -1
+    x111      c45               0.98   c201                 1
+    x112      OBJ           2.576519   c43                 -1
+    x112      c49               0.98   c107                 1
+    x113      OBJ           1.604159   c39               0.98
+    x113      c45                 -1   c199                 1
+    x114      OBJ             0.6102   c43               0.98
+    x114      c45                 -1   c103                 1
+    x115      OBJ           2.914559   c45                 -1
+    x115      c51               0.98   c105                 1
+    x116      OBJ           2.330278   c41               0.98
+    x116      c47                 -1   c209                 1
+    x117      OBJ           1.041479   c47                 -1
+    x117      c49               0.98   c211                 1
+    x118      OBJ           2.069279   c47                 -1
+    x118      c61               0.98   c125                 1
+    x119      OBJ           2.576519   c43               0.98
+    x119      c49                 -1   c205                 1
+    x120      OBJ           1.041479   c47               0.98
+    x120      c49                 -1   c113                 1
+    x121      OBJ             0.9108   c49                 -1
+    x121      c51               0.98   c115                 1
+    x122      OBJ           2.306879   c49                 -1
+    x122      c59               0.98   c123                 1
+    x123      OBJ           2.914559   c45               0.98
+    x123      c51                 -1   c203                 1
+    x124      OBJ             0.9108   c49               0.98
+    x124      c51                 -1   c213                 1
+    x125      OBJ            0.78516   c51                 -1
+    x125      c53               0.98   c117                 1
+    x126      OBJ           2.032559   c51                 -1
+    x126      c57               0.98   c121                 1
+    x127      OBJ            0.78516   c51               0.98
+    x127      c53                 -1   c215                 1
+    x128      OBJ           1.823039   c53                 -1
+    x128      c55               0.98   c119                 1
+    x129      OBJ           1.823039   c53               0.98
+    x129      c55                 -1   c217                 1
+    x130      OBJ           1.144079   c55                 -1
+    x130      c57               0.98   c127                 1
+    x131      OBJ           1.853279   c55                 -1
+    x131      c133                 1
+    x132      OBJ           2.032559   c51               0.98
+    x132      c57                 -1   c219                 1
+    x133      OBJ           1.144079   c55               0.98
+    x133      c57                 -1   c225                 1
+    x134      OBJ              1.233   c57                 -1
+    x134      c59               0.98   c129                 1
+    x135      OBJ             1.8144   c57                 -1
+    x135      c65               0.98   c135                 1
+    x136      OBJ           2.306879   c49               0.98
+    x136      c59                 -1   c221                 1
+    x137      OBJ              1.233   c57               0.98
+    x137      c59                 -1   c227                 1
+    x138      OBJ            1.11132   c59                 -1
+    x138      c61               0.98   c131                 1
+    x139      OBJ           1.669679   c59                 -1
+    x139      c67               0.98   c137                 1
+    x140      OBJ           2.069279   c47               0.98
+    x140      c61                 -1   c223                 1
+    x141      OBJ            1.11132   c59               0.98
+    x141      c61                 -1   c229                 1
+    x142      OBJ              0.657   c61                 -1
+    x142      c63               0.98   c141                 1
+    x143      OBJ           1.409039   c61                 -1
+    x143      c69               0.98   c139                 1
+    x144      OBJ              0.657   c61               0.98
+    x144      c63                 -1   c239                 1
+    x145      OBJ            1.21032   c63                 -1
+    x145      c71               0.98   c143                 1
+    x146      OBJ             1.8144   c57               0.98
+    x146      c65                 -1   c233                 1
+    x147      OBJ           1.348919   c65                 -1
+    x147      c67               0.98   c151                 1
+    x148      OBJ           2.297879   c65                 -1
+    x148      c81               0.98   c149                 1
+    x149      OBJ           1.316159   c65                 -1
+    x149      c245                 1
+    x150      OBJ           1.669679   c59               0.98
+    x150      c67                 -1   c235                 1
+    x151      OBJ           1.348919   c65               0.98
+    x151      c67                 -1   c249                 1
+    x152      OBJ             1.3842   c67                 -1
+    x152      c69               0.98   c155                 1
+    x153      OBJ           2.021759   c67                 -1
+    x153      c79               0.98   c153                 1
+    x154      OBJ           1.409039   c61               0.98
+    x154      c69                 -1   c237                 1
+    x155      OBJ             1.3842   c67               0.98
+    x155      c69                 -1   c253                 1
+    x156      OBJ           1.106639   c69                 -1
+    x156      c71               0.98   c159                 1
+    x157      OBJ             1.5624   c69                 -1
+    x157      c77               0.98   c157                 1
+    x158      OBJ            1.21032   c63               0.98
+    x158      c71                 -1   c241                 1
+    x159      OBJ           1.106639   c69               0.98
+    x159      c71                 -1   c257                 1
+    x160      OBJ             1.0548   c71                 -1
+    x160      c75               0.98   c161                 1
+    x161      OBJ           0.965879   c73                 -1
+    x161      c75               0.98   c279                 1
+    x162      OBJ           0.928079   c73                 -1
+    x162      c95               0.98   c183                 1
+    x163      OBJ             1.0548   c71               0.98
+    x163      c75                 -1   c259                 1
+    x164      OBJ           0.965879   c73               0.98
+    x164      c75                 -1   c181                 1
+    x165      OBJ            1.52712   c75                 -1
+    x165      c77               0.98   c275                 1
+    x166      OBJ           1.170719   c75                 -1
+    x166      c93               0.98   c179                 1
+    x167      OBJ             1.5624   c69               0.98
+    x167      c77                 -1   c255                 1
+    x168      OBJ            1.52712   c75               0.98
+    x168      c77                 -1   c177                 1
+    x169      OBJ           2.302559   c77                 -1
+    x169      c79               0.98   c271                 1
+    x170      OBJ           1.920239   c77                 -1
+    x170      c91               0.98   c175                 1
+    x171      OBJ           2.021759   c67               0.98
+    x171      c79                 -1   c251                 1
+    x172      OBJ           2.302559   c77               0.98
+    x172      c79                 -1   c173                 1
+    x173      OBJ           2.120759   c79                 -1
+    x173      c81               0.98   c267                 1
+    x174      OBJ           2.330639   c79                 -1
+    x174      c89               0.98   c171                 1
+    x175      OBJ           2.297879   c65               0.98
+    x175      c81                 -1   c247                 1
+    x176      OBJ           2.120759   c79               0.98
+    x176      c81                 -1   c169                 1
+    x177      OBJ           1.458719   c81                 -1
+    x177      c83               0.98   c263                 1
+    x178      OBJ              2.448   c81                 -1
+    x178      c87               0.98   c167                 1
+    x179      OBJ           1.458719   c81               0.98
+    x179      c83                 -1   c165                 1
+    x180      OBJ           2.363039   c83                 -1
+    x180      c85               0.98   c163                 1
+    x181      OBJ           2.181959   c83                 -1
+    x181      c243                 1
+    x182      OBJ           2.363039   c83               0.98
+    x182      c85                 -1   c261                 1
+    x183      OBJ           1.604159   c85                 -1
+    x183      c87               0.98   c185                 1
+    x184      OBJ              2.448   c81               0.98
+    x184      c87                 -1   c265                 1
+    x185      OBJ           1.604159   c85               0.98
+    x185      c87                 -1   c283                 1
+    x186      OBJ           3.047759   c87                 -1
+    x186      c89               0.98   c187                 1
+    x187      OBJ           2.330639   c79               0.98
+    x187      c89                 -1   c269                 1
+    x188      OBJ           3.047759   c87               0.98
+    x188      c89                 -1   c285                 1
+    x189      OBJ            3.37464   c89                 -1
+    x189      c91               0.98   c189                 1
+    x190      OBJ           1.920239   c77               0.98
+    x190      c91                 -1   c273                 1
+    x191      OBJ            3.37464   c89               0.98
+    x191      c91                 -1   c287                 1
+    x192      OBJ            2.54052   c91                 -1
+    x192      c93               0.98   c191                 1
+    x193      OBJ           1.170719   c75               0.98
+    x193      c93                 -1   c277                 1
+    x194      OBJ            2.54052   c91               0.98
+    x194      c93                 -1   c289                 1
+    x195      OBJ            1.28124   c93                 -1
+    x195      c95               0.98   c193                 1
+    x196      OBJ           0.928079   c73               0.98
+    x196      c95                 -1   c281                 1
+    x197      OBJ            1.28124   c93               0.98
+    x197      c95                 -1   c291                 1
+    x198      OBJ           1.853279   c4                   1
+    x198      c55               0.98   c231                 1
+    x199      OBJ           1.316159   c4                   1
+    x199      c65               0.98   c147                 1
+    x200      OBJ           2.181959   c4                   1
+    x200      c83               0.98   c145                 1
+    MARK0000  'MARKER'                 'INTORG'
+    x201      OBJ        15061.55078   c96             -17360
+    x201      c194            -17360
+    x202      OBJ        9479.636719   c97             -17360
+    x202      c195            -17360
+    x203      OBJ        3054.878418   c98             -17360
+    x203      c196            -17360
+    x204      OBJ        1922.719482   c99             -17360
+    x204      c197            -17360
+    x205      OBJ        13947.26953   c100            -17360
+    x205      c198            -17360
+    x206      OBJ          8778.3125   c101            -17360
+    x206      c199            -17360
+    x207      OBJ        5305.347656   c102            -17360
+    x207      c200            -17360
+    x208      OBJ        3339.149414   c103            -17360
+    x208      c201            -17360
+    x209      OBJ        25340.46484   c104            -17360
+    x209      c202            -17360
+    x210      OBJ        15949.11328   c105            -17360
+    x210      c203            -17360
+    x211      OBJ        22401.39844   c106            -17360
+    x211      c204            -17360
+    x212      OBJ        14099.28516   c107            -17360
+    x212      c205            -17360
+    x213      OBJ        7474.433594   c108            -17360
+    x213      c206            -17360
+    x214      OBJ        4704.355469   c109            -17360
+    x214      c207            -17360
+    x215      OBJ        20260.47266   c110            -17360
+    x215      c208            -17360
+    x216      OBJ        12751.80078   c111            -17360
+    x216      c209            -17360
+    x217      OBJ        9055.078125   c112            -17360
+    x217      c210            -17360
+    x218      OBJ        5699.203125   c113            -17360
+    x218      c211            -17360
+    x219      OBJ        7918.894531   c114            -17360
+    x219      c212            -17360
+    x220      OBJ        4984.097656   c115            -17360
+    x220      c213            -17360
+    x221      OBJ        6826.523438   c116            -17360
+    x221      c214            -17360
+    x222      OBJ        4296.566406   c117            -17360
+    x222      c215            -17360
+    x223      OBJ        15850.30859   c118            -17360
+    x223      c216            -17360
+    x224      OBJ        9976.074219   c119            -17360
+    x224      c217            -17360
+    x225      OBJ        17671.96484   c120            -17360
+    x225      c218            -17360
+    x226      OBJ        11122.61328   c121            -17360
+    x226      c219            -17360
+    x227      OBJ        20057.02344   c122            -17360
+    x227      c220            -17360
+    x228      OBJ        12623.75391   c123            -17360
+    x228      c221            -17360
+    x229      OBJ        17991.22656   c124            -17360
+    x229      c222            -17360
+    x230      OBJ        11323.55078   c125            -17360
+    x230      c223            -17360
+    x231      OBJ        9947.128906   c126            -17360
+    x231      c224            -17360
+    x232      OBJ        6260.652344   c127            -17360
+    x232      c225            -17360
+    x233      OBJ        10720.24219   c128            -17360
+    x233      c226            -17360
+    x234      OBJ        6747.246094   c129            -17360
+    x234      c227            -17360
+    x235      OBJ        9662.304688   c130            -17360
+    x235      c228            -17360
+    x236      OBJ        6081.386719   c131            -17360
+    x236      c229            -17360
+    x237      OBJ        16113.22656   c132            -17360
+    x237      c230            -17360
+    x238      OBJ        10141.55078   c133            -17360
+    x238      c231            -17360
+    x239      OBJ        15775.19141   c134            -17360
+    x239      c232            -17360
+    x240      OBJ        9928.796875   c135            -17360
+    x240      c233            -17360
+    x241      OBJ        14516.92578   c136            -17360
+    x241      c234            -17360
+    x242      OBJ        9136.851563   c137            -17360
+    x242      c235            -17360
+    x243      OBJ        12250.80859   c138            -17360
+    x243      c236            -17360
+    x244      OBJ        7710.574219   c139            -17360
+    x244      c237            -17360
+    x245      OBJ        5712.246094   c140            -17360
+    x245      c238            -17360
+    x246      OBJ        3595.249268   c141            -17360
+    x246      c239            -17360
+    x247      OBJ        10523.05078   c142            -17360
+    x247      c240            -17360
+    x248      OBJ        6623.136719   c143            -17360
+    x248      c241            -17360
+    x249      OBJ        18970.91797   c144            -17360
+    x249      c242            -17360
+    x250      OBJ        11940.16406   c145            -17360
+    x250      c243            -17360
+    x251      OBJ        11443.26953   c146            -17360
+    x251      c244            -17360
+    x252      OBJ          7202.3125   c147            -17360
+    x252      c245            -17360
+    x253      OBJ        19978.77344   c148            -17360
+    x253      c246            -17360
+    x254      OBJ        12574.50391   c149            -17360
+    x254      c247            -17360
+    x255      OBJ        11728.10156   c150            -17360
+    x255      c248            -17360
+    x256      OBJ        7381.585938   c151            -17360
+    x256      c249            -17360
+    x257      OBJ        17578.06641   c152            -17360
+    x257      c250            -17360
+    x258      OBJ        11063.51172   c153            -17360
+    x258      c251            -17360
+    x259      OBJ        12034.84375   c154            -17360
+    x259      c252            -17360
+    x260      OBJ        7574.648438   c155            -17360
+    x260      c253            -17360
+    x261      OBJ        13584.19141   c156            -17360
+    x261      c254            -17360
+    x262      OBJ        8549.796875   c157            -17360
+    x262      c255            -17360
+    x263      OBJ        9621.609375   c158            -17360
+    x263      c256            -17360
+    x264      OBJ        6055.773438   c159            -17360
+    x264      c257            -17360
+    x265      OBJ        9170.894531   c160            -17360
+    x265      c258            -17360
+    x266      OBJ        5772.097656   c161            -17360
+    x266      c259            -17360
+    x267      OBJ        20545.30859   c162            -17360
+    x267      c260            -17360
+    x268      OBJ        12931.07422   c163            -17360
+    x268      c261            -17360
+    x269      OBJ           12682.75   c164            -17360
+    x269      c262            -17360
+    x270      OBJ          7982.4375   c165            -17360
+    x270      c263            -17360
+    x271      OBJ        21283.98828   c166            -17360
+    x271      c264            -17360
+    x272      OBJ        13395.99609   c167            -17360
+    x272      c265            -17360
+    x273      OBJ        18438.81641   c168            -17360
+    x273      c266            -17360
+    x274      OBJ        11605.26172   c169            -17360
+    x274      c267            -17360
+    x275      OBJ        20263.60547   c170            -17360
+    x275      c268            -17360
+    x276      OBJ        12753.77344   c171            -17360
+    x276      c269            -17360
+    x277      OBJ        20019.46484   c172            -17360
+    x277      c270            -17360
+    x278      OBJ        12600.11328   c173            -17360
+    x278      c271            -17360
+    x279      OBJ        16695.41016   c174            -17360
+    x279      c272            -17360
+    x280      OBJ        10507.97266   c175            -17360
+    x280      c273            -17360
+    x281      OBJ        13277.45313   c176            -17360
+    x281      c274            -17360
+    x282      OBJ        8356.734375   c177            -17360
+    x282      c275            -17360
+    x283      OBJ        10178.75391   c178            -17360
+    x283      c276            -17360
+    x284      OBJ          6406.4375   c179            -17360
+    x284      c277            -17360
+    x285      OBJ        8397.777344   c180            -17360
+    x285      c278            -17360
+    x286      OBJ        5285.503906   c181            -17360
+    x286      c279            -17360
+    x287      OBJ        8069.128906   c182            -17360
+    x287      c280            -17360
+    x288      OBJ        5078.652344   c183            -17360
+    x288      c281            -17360
+    x289      OBJ        13947.26953   c184            -17360
+    x289      c282            -17360
+    x290      OBJ          8778.3125   c185            -17360
+    x290      c283            -17360
+    x291      OBJ         26498.5625   c186            -17360
+    x291      c284            -17360
+    x292      OBJ        16678.01172   c187            -17360
+    x292      c285            -17360
+    x293      OBJ        29340.60547   c188            -17360
+    x293      c286            -17360
+    x294      OBJ        18466.77344   c189            -17360
+    x294      c287            -17360
+    x295      OBJ        22088.39844   c190            -17360
+    x295      c288            -17360
+    x296      OBJ        13902.28516   c191            -17360
+    x296      c289            -17360
+    x297      OBJ        11139.66016   c192            -17360
+    x297      c290            -17360
+    x298      OBJ        7011.226563   c193            -17360
+    x298      c291            -17360
+    MARK0001  'MARKER'                 'INTEND'
+    x299      OBJ         935.779785   c5                   1
+    x299      c36          -1.197604
+    x300      OBJ          590.19458   c6                   1
+    x300      c38          -1.197604
+    x301      OBJ         586.431152   c7                   1
+    x301      c40          -1.197604
+    x302      OBJ         586.384521   c8                   1
+    x302      c42          -1.197604
+    x303      OBJ         585.222412   c9                   1
+    x303      c44          -1.197604
+    x304      OBJ           584.8667   c10                  1
+    x304      c46          -1.197604
+    x305      OBJ         584.592285   c11                  1
+    x305      c48          -1.197604
+    x306      OBJ         586.196533   c12                  1
+    x306      c50          -1.197604
+    x307      OBJ         607.073486   c13                  1
+    x307      c52          -1.197604
+    x308      OBJ         593.749756   c14                  1
+    x308      c54          -1.197604
+    x309      OBJ          585.37793   c15                  1
+    x309      c56          -1.197604
+    x310      OBJ         584.541016   c16                  1
+    x310      c58          -1.197604
+    x311      OBJ         585.455078   c17                  1
+    x311      c60          -1.197604
+    x312      OBJ         587.869385   c18                  1
+    x312      c62          -1.197604
+    x313      OBJ         584.969482   c19                  1
+    x313      c64          -1.197604
+    x314      OBJ         584.601318   c20                  1
+    x314      c66          -1.197604
+    x315      OBJ         585.421143   c21                  1
+    x315      c68          -1.197604
+    x316      OBJ         586.946777   c22                  1
+    x316      c70          -1.197604
+    x317      OBJ         592.529541   c23                  1
+    x317      c72          -1.197604
+    x318      OBJ         585.983643   c24                  1
+    x318      c74          -1.197604
+    x319      OBJ         585.921387   c25                  1
+    x319      c76          -1.197604
+    x320      OBJ         586.138184   c26                  1
+    x320      c78          -1.197604
+    x321      OBJ         585.365967   c27                  1
+    x321      c80          -1.197604
+    x322      OBJ           593.9563   c28                  1
+    x322      c82          -1.197604
+    x323      OBJ         586.775391   c29                  1
+    x323      c84          -1.197604
+    x324      OBJ         590.526367   c30                  1
+    x324      c86          -1.197604
+    x325      OBJ         588.990479   c31                  1
+    x325      c88          -1.197604
+    x326      OBJ         628.276367   c32                  1
+    x326      c90          -1.197604
+    x327      OBJ         589.911133   c33                  1
+    x327      c92          -1.197604
+    x328      OBJ         590.110107   c34                  1
+    x328      c94          -1.197604
+    x329      OBJ         585.704346   c3            1.197604
+    x329      c35                  1
+    x330      OBJ         994.519775   c5                   1
+    x330      c37          -1.503759
+    x331      OBJ         764.129639   c6                   1
+    x331      c39          -1.503759
+    x332      OBJ          761.62085   c7                   1
+    x332      c41          -1.503759
+    x333      OBJ           761.5896   c8                   1
+    x333      c43          -1.503759
+    x334      OBJ         760.814697   c9                   1
+    x334      c45          -1.503759
+    x335      OBJ         760.577881   c10                  1
+    x335      c47          -1.503759
+    x336      OBJ         760.394287   c11                  1
+    x336      c49          -1.503759
+    x337      OBJ         761.463867   c12                  1
+    x337      c51          -1.503759
+    x338      OBJ          775.38208   c13                  1
+    x338      c53          -1.503759
+    x339      OBJ         766.499756   c14                  1
+    x339      c55          -1.503759
+    x340      OBJ         760.918457   c15                  1
+    x340      c57          -1.503759
+    x341      OBJ         760.360107   c16                  1
+    x341      c59          -1.503759
+    x342      OBJ         760.969971   c17                  1
+    x342      c61          -1.503759
+    x343      OBJ         762.579346   c18                  1
+    x343      c63          -1.503759
+    x344      OBJ          760.64624   c19                  1
+    x344      c65          -1.503759
+    x345      OBJ              760.4   c20                  1
+    x345      c67          -1.503759
+    x346      OBJ         760.947021   c21                  1
+    x346      c69          -1.503759
+    x347      OBJ         761.964355   c22                  1
+    x347      c71          -1.503759
+    x348      OBJ         765.686279   c23                  1
+    x348      c73          -1.503759
+    x349      OBJ         761.322021   c24                  1
+    x349      c75          -1.503759
+    x350      OBJ         761.280518   c25                  1
+    x350      c77          -1.503759
+    x351      OBJ         761.425293   c26                  1
+    x351      c79          -1.503759
+    x352      OBJ           760.9104   c27                  1
+    x352      c81          -1.503759
+    x353      OBJ         766.636475   c28                  1
+    x353      c83          -1.503759
+    x354      OBJ         761.849609   c29                  1
+    x354      c85          -1.503759
+    x355      OBJ          764.35083   c30                  1
+    x355      c87          -1.503759
+    x356      OBJ          763.32666   c31                  1
+    x356      c89          -1.503759
+    x357      OBJ         789.517578   c32                  1
+    x357      c91          -1.503759
+    x358      OBJ         763.940186   c33                  1
+    x358      c93          -1.503759
+    x359      OBJ         764.072754   c34                  1
+    x359      c95          -1.503759
+    x360      OBJ         761.135986   c4            1.503759
+    x360      c35                  1
+    x361      OBJ              40996   c5                   1
+    x362      OBJ              40996   c6                   1
+    x363      OBJ        40995.97266   c7                   1
+    x364      OBJ        40995.97656   c8                   1
+    x365      OBJ        40995.99609   c9                   1
+    x366      OBJ        40995.99219   c10                  1
+    x367      OBJ        40995.99609   c11                  1
+    x368      OBJ        40995.99219   c12                  1
+    x369      OBJ        40995.99609   c13                  1
+    x370      OBJ        40995.99609   c14                  1
+    x371      OBJ        40995.97266   c15                  1
+    x372      OBJ        40995.99609   c16                  1
+    x373      OBJ        40995.98438   c17                  1
+    x374      OBJ        40995.99609   c18                  1
+    x375      OBJ        40995.98828   c19                  1
+    x376      OBJ        40995.99609   c20                  1
+    x377      OBJ        40995.99219   c21                  1
+    x378      OBJ        40995.99609   c22                  1
+    x379      OBJ              40996   c23                  1
+    x380      OBJ        40995.99609   c24                  1
+    x381      OBJ        40995.97656   c25                  1
+    x382      OBJ        40995.98438   c26                  1
+    x383      OBJ        40995.98047   c27                  1
+    x384      OBJ        40995.98828   c28                  1
+    x385      OBJ        40995.98828   c29                  1
+    x386      OBJ        40995.99219   c30                  1
+    x387      OBJ        40995.98828   c31                  1
+    x388      OBJ              40996   c32                  1
+    x389      OBJ        40995.99609   c33                  1
+    x390      OBJ        40995.99609   c34                  1
+    x391      OBJ        40995.98047   c35                  1
+    x392      OBJ           2184.375   c5                   1
+    x393      OBJ           2184.375   c6                   1
+    x394      OBJ           2184.375   c7                   1
+    x395      OBJ        2184.374268   c8                   1
+    x396      OBJ        2184.374512   c9                   1
+    x397      OBJ           2184.375   c10                  1
+    x398      OBJ        2184.374512   c11                  1
+    x399      OBJ        2184.374512   c12                  1
+    x400      OBJ        2184.374512   c13                  1
+    x401      OBJ        2184.373779   c14                  1
+    x402      OBJ        2184.374268   c15                  1
+    x403      OBJ        2184.374268   c16                  1
+    x404      OBJ        2184.374268   c17                  1
+    x405      OBJ        2184.374512   c18                  1
+    x406      OBJ        2184.374512   c19                  1
+    x407      OBJ        2184.374512   c20                  1
+    x408      OBJ        2184.374268   c21                  1
+    x409      OBJ        2184.374512   c22                  1
+    x410      OBJ           2184.375   c23                  1
+    x411      OBJ        2184.374268   c24                  1
+    x412      OBJ        2184.374512   c25                  1
+    x413      OBJ        2184.374512   c26                  1
+    x414      OBJ        2184.374512   c27                  1
+    x415      OBJ        2184.374268   c28                  1
+    x416      OBJ        2184.374512   c29                  1
+    x417      OBJ        2184.374512   c30                  1
+    x418      OBJ        2184.374512   c31                  1
+    x419      OBJ           2184.375   c32                  1
+    x420      OBJ        2184.374512   c33                  1
+    x421      OBJ        2184.374512   c34                  1
+    x422      OBJ        2184.374268   c35                  1
+RHS
+    rhs       c5                 1.5   c6                  69
+    rhs       c7               520.5   c8          495.299805
+    rhs       c9          754.099854   c10             1198.5
+    rhs       c11        2188.799805   c12              594.4
+    rhs       c13               51.4   c14               75.6
+    rhs       c15         563.099854   c16        1533.099854
+    rhs       c17         556.299805   c18              167.8
+    rhs       c19         975.799805   c20             1642.9
+    rhs       c21         347.099854   c22         262.799805
+    rhs       c23                 62   c24              395.9
+    rhs       c25              691.7   c26              936.7
+    rhs       c27         791.099854   c28              106.7
+    rhs       c29              393.7   c30              173.7
+    rhs       c31              466.2   c32                 34
+    rhs       c33              116.9   c34              103.4
+    rhs       c35         552.099854
+BOUNDS
+ UP bnd       x201                 1
+ UP bnd       x202                 1
+ UP bnd       x203                 1
+ UP bnd       x204                 1
+ UP bnd       x205                 1
+ UP bnd       x206                 1
+ UP bnd       x207                 1
+ UP bnd       x208                 1
+ UP bnd       x209                 1
+ UP bnd       x210                 1
+ UP bnd       x211                 1
+ UP bnd       x212                 1
+ UP bnd       x213                 1
+ UP bnd       x214                 1
+ UP bnd       x215                 1
+ UP bnd       x216                 1
+ UP bnd       x217                 1
+ UP bnd       x218                 1
+ UP bnd       x219                 1
+ UP bnd       x220                 1
+ UP bnd       x221                 1
+ UP bnd       x222                 1
+ UP bnd       x223                 1
+ UP bnd       x224                 1
+ UP bnd       x225                 1
+ UP bnd       x226                 1
+ UP bnd       x227                 1
+ UP bnd       x228                 1
+ UP bnd       x229                 1
+ UP bnd       x230                 1
+ UP bnd       x231                 1
+ UP bnd       x232                 1
+ UP bnd       x233                 1
+ UP bnd       x234                 1
+ UP bnd       x235                 1
+ UP bnd       x236                 1
+ UP bnd       x237                 1
+ UP bnd       x238                 1
+ UP bnd       x239                 1
+ UP bnd       x240                 1
+ UP bnd       x241                 1
+ UP bnd       x242                 1
+ UP bnd       x243                 1
+ UP bnd       x244                 1
+ UP bnd       x245                 1
+ UP bnd       x246                 1
+ UP bnd       x247                 1
+ UP bnd       x248                 1
+ UP bnd       x249                 1
+ UP bnd       x250                 1
+ UP bnd       x251                 1
+ UP bnd       x252                 1
+ UP bnd       x253                 1
+ UP bnd       x254                 1
+ UP bnd       x255                 1
+ UP bnd       x256                 1
+ UP bnd       x257                 1
+ UP bnd       x258                 1
+ UP bnd       x259                 1
+ UP bnd       x260                 1
+ UP bnd       x261                 1
+ UP bnd       x262                 1
+ UP bnd       x263                 1
+ UP bnd       x264                 1
+ UP bnd       x265                 1
+ UP bnd       x266                 1
+ UP bnd       x267                 1
+ UP bnd       x268                 1
+ UP bnd       x269                 1
+ UP bnd       x270                 1
+ UP bnd       x271                 1
+ UP bnd       x272                 1
+ UP bnd       x273                 1
+ UP bnd       x274                 1
+ UP bnd       x275                 1
+ UP bnd       x276                 1
+ UP bnd       x277                 1
+ UP bnd       x278                 1
+ UP bnd       x279                 1
+ UP bnd       x280                 1
+ UP bnd       x281                 1
+ UP bnd       x282                 1
+ UP bnd       x283                 1
+ UP bnd       x284                 1
+ UP bnd       x285                 1
+ UP bnd       x286                 1
+ UP bnd       x287                 1
+ UP bnd       x288                 1
+ UP bnd       x289                 1
+ UP bnd       x290                 1
+ UP bnd       x291                 1
+ UP bnd       x292                 1
+ UP bnd       x293                 1
+ UP bnd       x294                 1
+ UP bnd       x295                 1
+ UP bnd       x296                 1
+ UP bnd       x297                 1
+ UP bnd       x298                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/noswot.mps b/demos/ppl_lpsol/examples/noswot.mps
new file mode 100644
index 0000000..bf3f987
--- /dev/null
+++ b/demos/ppl_lpsol/examples/noswot.mps
@@ -0,0 +1,729 @@
+NAME           noswot
+ROWS
+ N  1       
+ L  c1      
+ L  c2      
+ L  c3      
+ L  c4      
+ L  c5      
+ L  c6      
+ G  c7      
+ L  c8      
+ G  c9      
+ L  c10     
+ G  c11     
+ L  c12     
+ G  c13     
+ L  c14     
+ G  c15     
+ L  c16     
+ G  c17     
+ G  c18     
+ G  c19     
+ G  c20     
+ G  c21     
+ G  c22     
+ G  c23     
+ G  c24     
+ G  c25     
+ G  c26     
+ G  c27     
+ G  c28     
+ G  c29     
+ G  c30     
+ G  c31     
+ G  c32     
+ G  c33     
+ G  c34     
+ G  c35     
+ G  c36     
+ G  c37     
+ G  c38     
+ G  c39     
+ G  c40     
+ G  c41     
+ G  c42     
+ G  c43     
+ G  c44     
+ G  c45     
+ G  c46     
+ G  c47     
+ G  c48     
+ G  c49     
+ G  c50     
+ G  c51     
+ G  c52     
+ G  c53     
+ G  c54     
+ G  c55     
+ G  c56     
+ L  c57     
+ L  c58     
+ L  c59     
+ L  c60     
+ L  c61     
+ L  c62     
+ G  c63     
+ L  c64     
+ G  c65     
+ L  c66     
+ G  c67     
+ L  c68     
+ G  c69     
+ L  c70     
+ G  c71     
+ L  c72     
+ G  c73     
+ G  c74     
+ G  c75     
+ G  c76     
+ G  c77     
+ G  c78     
+ G  c79     
+ G  c80     
+ G  c81     
+ G  c82     
+ G  c83     
+ G  c84     
+ G  c85     
+ G  c86     
+ G  c87     
+ G  c88     
+ G  c89     
+ G  c90     
+ G  c91     
+ G  c92     
+ G  c93     
+ G  c94     
+ G  c95     
+ G  c96     
+ G  c97     
+ G  c98     
+ G  c99     
+ G  c100    
+ G  c101    
+ G  c102    
+ G  c103    
+ L  c104    
+ L  c105    
+ L  c106    
+ L  c107    
+ L  c108    
+ L  c109    
+ G  c110    
+ L  c111    
+ G  c112    
+ L  c113    
+ G  c114    
+ L  c115    
+ G  c116    
+ L  c117    
+ G  c118    
+ L  c119    
+ G  c120    
+ G  c121    
+ G  c122    
+ G  c123    
+ G  c124    
+ G  c125    
+ G  c126    
+ G  c127    
+ G  c128    
+ G  c129    
+ G  c130    
+ G  c131    
+ G  c132    
+ G  c133    
+ G  c134    
+ G  c135    
+ G  c136    
+ G  c137    
+ G  c138    
+ G  c139    
+ L  c140    
+ L  c141    
+ L  c142    
+ L  c143    
+ L  c144    
+ L  c145    
+ G  c146    
+ E  c147    
+ G  c148    
+ E  c149    
+ G  c150    
+ L  c151    
+ G  c152    
+ L  c153    
+ G  c154    
+ L  c155    
+ G  c156    
+ G  c157    
+ G  c158    
+ G  c159    
+ G  c160    
+ G  c161    
+ G  c162    
+ G  c163    
+ G  c164    
+ G  c165    
+ L  c166    
+ L  c167    
+ L  c168    
+ L  c169    
+ L  c170    
+ L  c171    
+ G  c172    
+ L  c173    
+ G  c174    
+ L  c175    
+ G  c176    
+ L  c177    
+ G  c178    
+ L  c179    
+ G  c180    
+ L  c181    
+ L  c182    
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        c17                 21   c18                -21
+    x2        c19                 21   c20                -21
+    x3        c21                 21   c22                -21
+    x4        c23                 21   c24                -21
+    x5        c25                 21   c26                -21
+    x6        c27                 21   c28                -21
+    x7        c29                 21   c30                -21
+    x8        c31                 21   c32                -21
+    x9        c33                 21   c34                -21
+    x10       c35                 21   c36                -21
+    x11       c37                 21   c38                -21
+    x12       c39                 21   c40                -21
+    x13       c41                 21   c42                -21
+    x14       c43                 21   c44                -21
+    x15       c45                 21   c46                -21
+    x16       c47                 21   c48                -21
+    x17       c49                 21   c50                -21
+    x18       c51                 21   c52                -21
+    x19       c53                 21   c54                -21
+    x20       c55                 21   c56                -21
+    x21       c73                 21   c74                -21
+    x22       c75                 21   c76                -21
+    x23       c77                 21   c78                -21
+    x24       c79                 21   c80                -21
+    x25       c81                 21   c82                -21
+    x26       c83                 21   c84                -21
+    x27       c85                 21   c86                -21
+    x28       c87                 21   c88                -21
+    x29       c89                 21   c90                -21
+    x30       c91                 21   c92                -21
+    x31       c93                 21   c94                -21
+    x32       c95                 21   c96                -21
+    x33       c97                 21   c98                -21
+    x34       c99                 21   c100               -21
+    x35       c101                21   c102               -21
+    x36       c120                21   c121               -21
+    x37       c122                21   c123               -21
+    x38       c124                21   c125               -21
+    x39       c126                21   c127               -21
+    x40       c128                21   c129               -21
+    x41       c130                21   c131               -21
+    x42       c132                21   c133               -21
+    x43       c134                21   c135               -21
+    x44       c136                21   c137               -21
+    x45       c138                21   c139               -21
+    x46       c156                21   c157               -21
+    x47       c158                21   c159               -21
+    x48       c160                21   c161               -21
+    x49       c162                21   c163               -21
+    x50       c164                21   c165               -21
+    x51       c2                 -20   c7                  -1
+    x51       c8          -9.6000004   c18              -0.75
+    x51       c28        -0.66670000   c38              -0.25
+    x51       c48              -0.25
+    x52       1                   -1   c1                   1
+    x52       c2           2.0833001   c7                   1
+    x52       c8                   1   c18         -2.0833001
+    x52       c28         -2.0833001   c38         -2.0833001
+    x52       c48         -2.0833001   c57                  1
+    x53       c3                 -20   c9                  -1
+    x53       c10         -9.6000004   c20              -0.75
+    x53       c30        -0.66670000   c40              -0.25
+    x53       c50              -0.25
+    x54       1                   -1   c1                   1
+    x54       c3           2.0833001   c9                   1
+    x54       c10                  1   c20         -2.0833001
+    x54       c30         -2.0833001   c40         -2.0833001
+    x54       c50         -2.0833001   c57                  1
+    x55       c4                 -20   c11                 -1
+    x55       c12         -9.6000004   c22              -0.75
+    x55       c32        -0.66670000   c42              -0.25
+    x55       c52              -0.25
+    x56       1                   -1   c1                   1
+    x56       c4           2.0833001   c11                  1
+    x56       c12                  1   c22         -2.0833001
+    x56       c32         -2.0833001   c42         -2.0833001
+    x56       c52         -2.0833001   c57                  1
+    x57       c5                 -20   c13                 -1
+    x57       c14         -9.6000004   c24              -0.75
+    x57       c34        -0.66670000   c44              -0.25
+    x57       c54              -0.25
+    x58       1                   -1   c1                   1
+    x58       c5           2.0833001   c13                  1
+    x58       c14                  1   c24         -2.0833001
+    x58       c34         -2.0833001   c44         -2.0833001
+    x58       c54         -2.0833001   c57                  1
+    x59       c6                 -16   c15                 -1
+    x59       c16         -7.6799998   c26              -0.75
+    x59       c36        -0.66670000   c46              -0.25
+    x59       c56              -0.25
+    x60       1                   -1   c1                   1
+    x60       c6           2.0833001   c15                  1
+    x60       c16                  1   c26         -2.0833001
+    x60       c36         -2.0833001   c46         -2.0833001
+    x60       c56         -2.0833001   c57                  1
+    x61       c17        -0.66670000   c58                -20
+    x61       c63                 -1   c64         -6.7199998
+    x61       c74        -0.66670000   c84        -0.66670000
+    x61       c94        -0.66670000
+    x62       1                   -1   c1                   1
+    x62       c17         -2.9762001   c58          2.9762001
+    x62       c63                  1   c64                  1
+    x62       c74         -2.9762001   c84         -2.9762001
+    x62       c94         -2.9762001   c103                 1
+    x62       c104                 1
+    x63       c19        -0.66670000   c59                -20
+    x63       c65                 -1   c66         -6.7199998
+    x63       c76        -0.66670000   c86        -0.66670000
+    x63       c96        -0.66670000
+    x64       1                   -1   c1                   1
+    x64       c19         -2.9762001   c59          2.9762001
+    x64       c65                  1   c66                  1
+    x64       c76         -2.9762001   c86         -2.9762001
+    x64       c96         -2.9762001   c103                 1
+    x64       c104                 1
+    x65       c21        -0.66670000   c60                -20
+    x65       c67                 -1   c68         -6.7199998
+    x65       c78        -0.66670000   c88        -0.66670000
+    x65       c98        -0.66670000
+    x66       1                   -1   c1                   1
+    x66       c21         -2.9762001   c60          2.9762001
+    x66       c67                  1   c68                  1
+    x66       c78         -2.9762001   c88         -2.9762001
+    x66       c98         -2.9762001   c103                 1
+    x66       c104                 1
+    x67       c23        -0.66670000   c61                -20
+    x67       c69                 -1   c70         -6.7199998
+    x67       c80        -0.66670000   c90        -0.66670000
+    x67       c100       -0.66670000
+    x68       1                   -1   c1                   1
+    x68       c23         -2.9762001   c61          2.9762001
+    x68       c69                  1   c70                  1
+    x68       c80         -2.9762001   c90         -2.9762001
+    x68       c100        -2.9762001   c103                 1
+    x68       c104                 1
+    x69       c25        -0.66670000   c62                -16
+    x69       c71                 -1   c72         -5.3759999
+    x69       c82        -0.66670000   c92        -0.66670000
+    x69       c102       -0.66670000
+    x70       1                   -1   c1                   1
+    x70       c25         -2.9762001   c62          2.9762001
+    x70       c71                  1   c72                  1
+    x70       c82         -2.9762001   c92         -2.9762001
+    x70       c102        -2.9762001   c103                 1
+    x70       c104                 1
+    x71       c27        -0.66670000   c73              -0.75
+    x71       c105               -20   c110                -1
+    x71       c111        -5.7600002   c121       -0.66670000
+    x71       c131       -0.66670000
+    x72       1                   -1   c1                   1
+    x72       c27         -3.4721999   c73         -3.4721999
+    x72       c105         3.4721999   c110                 1
+    x72       c111                 1   c121        -3.4721999
+    x72       c131        -3.4721999   c140                 1
+    x73       c29        -0.66670000   c75              -0.75
+    x73       c106               -20   c112                -1
+    x73       c113        -5.7600002   c123       -0.66670000
+    x73       c133       -0.66670000
+    x74       1                   -1   c1                   1
+    x74       c29         -3.4721999   c75         -3.4721999
+    x74       c106         3.4721999   c112                 1
+    x74       c113                 1   c123        -3.4721999
+    x74       c133        -3.4721999   c140                 1
+    x75       c31        -0.66670000   c77              -0.75
+    x75       c107               -20   c114                -1
+    x75       c115        -5.7600002   c125       -0.66670000
+    x75       c135       -0.66670000
+    x76       1                   -1   c1                   1
+    x76       c31         -3.4721999   c77         -3.4721999
+    x76       c107         3.4721999   c114                 1
+    x76       c115                 1   c125        -3.4721999
+    x76       c135        -3.4721999   c140                 1
+    x77       c33        -0.66670000   c79              -0.75
+    x77       c108               -20   c116                -1
+    x77       c117        -5.7600002   c127       -0.66670000
+    x77       c137       -0.66670000
+    x78       1                   -1   c1                   1
+    x78       c33         -3.4721999   c79         -3.4721999
+    x78       c108         3.4721999   c116                 1
+    x78       c117                 1   c127        -3.4721999
+    x78       c137        -3.4721999   c140                 1
+    x79       c35        -0.66670000   c81              -0.75
+    x79       c109               -16   c118                -1
+    x79       c119        -4.6079998   c129       -0.66670000
+    x79       c139       -0.66670000
+    x80       1                   -1   c1                   1
+    x80       c35         -3.4721999   c81         -3.4721999
+    x80       c109         3.4721999   c118                 1
+    x80       c119                 1   c129        -3.4721999
+    x80       c139        -3.4721999   c140                 1
+    x81       c37              -0.25   c83              -0.75
+    x81       c120       -0.66670000   c141               -20
+    x81       c146                -1   c147        -8.9280005
+    x81       c157             -0.25
+    x82       1                   -1   c1                   1
+    x82       c37         -2.2400999   c83         -2.2400999
+    x82       c120        -2.2400999   c141         2.2400999
+    x82       c146                 1   c147                 1
+    x82       c157        -2.2400999   c166                 1
+    x83       c39              -0.25   c85              -0.75
+    x83       c122       -0.66670000   c142               -20
+    x83       c148                -1   c149        -8.9280005
+    x83       c159             -0.25
+    x84       1                   -1   c1                   1
+    x84       c39         -2.2400999   c85         -2.2400999
+    x84       c122        -2.2400999   c142         2.2400999
+    x84       c148                 1   c149                 1
+    x84       c159        -2.2400999   c166                 1
+    x85       c41              -0.25   c87              -0.75
+    x85       c124       -0.66670000   c143               -20
+    x85       c150                -1   c151        -8.9280005
+    x85       c161             -0.25
+    x86       1                   -1   c1                   1
+    x86       c41         -2.2400999   c87         -2.2400999
+    x86       c124        -2.2400999   c143         2.2400999
+    x86       c150                 1   c151                 1
+    x86       c161        -2.2400999   c166                 1
+    x87       c43              -0.25   c89              -0.75
+    x87       c126       -0.66670000   c144               -20
+    x87       c152                -1   c153        -8.9280005
+    x87       c163             -0.25
+    x88       1                   -1   c1                   1
+    x88       c43         -2.2400999   c89         -2.2400999
+    x88       c126        -2.2400999   c144         2.2400999
+    x88       c152                 1   c153                 1
+    x88       c163        -2.2400999   c166                 1
+    x89       c45              -0.25   c91              -0.75
+    x89       c128       -0.66670000   c145               -16
+    x89       c154                -1   c155        -7.1423998
+    x89       c165             -0.25
+    x90       1                   -1   c1                   1
+    x90       c45         -2.2400999   c91         -2.2400999
+    x90       c128        -2.2400999   c145         2.2400999
+    x90       c154                 1   c155                 1
+    x90       c165        -2.2400999   c166                 1
+    x91       c47        -0.66670000   c93              -0.75
+    x91       c130       -0.66670000   c156       -0.66670000
+    x91       c167               -20   c172                -1
+    x91       c173        -9.6000004
+    x92       1                   -1   c1                   1
+    x92       c47         -2.0833001   c93         -2.0833001
+    x92       c130        -2.0833001   c156        -2.0833001
+    x92       c167         2.0833001   c172                 1
+    x92       c173                 1   c182                 1
+    x93       c49        -0.66670000   c95              -0.75
+    x93       c132       -0.66670000   c158       -0.66670000
+    x93       c168               -20   c174                -1
+    x93       c175        -9.6000004
+    x94       1                   -1   c1                   1
+    x94       c49         -2.0833001   c95         -2.0833001
+    x94       c132        -2.0833001   c158        -2.0833001
+    x94       c168         2.0833001   c174                 1
+    x94       c175                 1   c182                 1
+    x95       c51        -0.66670000   c97              -0.75
+    x95       c134       -0.66670000   c160       -0.66670000
+    x95       c169               -20   c176                -1
+    x95       c177        -9.6000004
+    x96       1                   -1   c1                   1
+    x96       c51         -2.0833001   c97         -2.0833001
+    x96       c134        -2.0833001   c160        -2.0833001
+    x96       c169         2.0833001   c176                 1
+    x96       c177                 1   c182                 1
+    x97       c53        -0.66670000   c99              -0.75
+    x97       c136       -0.66670000   c162       -0.66670000
+    x97       c170               -20   c178                -1
+    x97       c179        -9.6000004
+    x98       1                   -1   c1                   1
+    x98       c53         -2.0833001   c99         -2.0833001
+    x98       c136        -2.0833001   c162        -2.0833001
+    x98       c170         2.0833001   c178                 1
+    x98       c179                 1   c182                 1
+    x99       c55        -0.66670000   c101             -0.75
+    x99       c138       -0.66670000   c164       -0.66670000
+    x99       c171               -16   c180                -1
+    x99       c181        -7.6799998
+    x100      1                   -1   c1                   1
+    x100      c55         -2.0833001   c101        -2.0833001
+    x100      c138        -2.0833001   c164        -2.0833001
+    x100      c171         2.0833001   c180                 1
+    x100      c181                 1   c182                 1
+    MARK0001  'MARKER'                 'INTEND'
+    x101      c2                   1   c17                  1
+    x101      c18                 -1   c27                  1
+    x101      c28                 -1   c37                  1
+    x101      c38                 -1   c47                  1
+    x101      c48                 -1
+    x102      c3                   1   c19                  1
+    x102      c20                 -1   c29                  1
+    x102      c30                 -1   c39                  1
+    x102      c40                 -1   c49                  1
+    x102      c50                 -1
+    x103      c4                   1   c21                  1
+    x103      c22                 -1   c31                  1
+    x103      c32                 -1   c41                  1
+    x103      c42                 -1   c51                  1
+    x103      c52                 -1
+    x104      c5                   1   c23                  1
+    x104      c24                 -1   c33                  1
+    x104      c34                 -1   c43                  1
+    x104      c44                 -1   c53                  1
+    x104      c54                 -1
+    x105      c6                   1   c25                  1
+    x105      c26                 -1   c35                  1
+    x105      c36                 -1   c45                  1
+    x105      c46                 -1   c55                  1
+    x105      c56                 -1
+    x106      c17                 -1   c18                  1
+    x106      c58                  1   c73                  1
+    x106      c74                 -1   c83                  1
+    x106      c84                 -1   c93                  1
+    x106      c94                 -1
+    x107      c19                 -1   c20                  1
+    x107      c59                  1   c75                  1
+    x107      c76                 -1   c85                  1
+    x107      c86                 -1   c95                  1
+    x107      c96                 -1
+    x108      c21                 -1   c22                  1
+    x108      c60                  1   c77                  1
+    x108      c78                 -1   c87                  1
+    x108      c88                 -1   c97                  1
+    x108      c98                 -1
+    x109      c23                 -1   c24                  1
+    x109      c61                  1   c79                  1
+    x109      c80                 -1   c89                  1
+    x109      c90                 -1   c99                  1
+    x109      c100                -1
+    x110      c25                 -1   c26                  1
+    x110      c62                  1   c81                  1
+    x110      c82                 -1   c91                  1
+    x110      c92                 -1   c101                 1
+    x110      c102                -1
+    x111      c27                 -1   c28                  1
+    x111      c73                 -1   c74                  1
+    x111      c105                 1   c120                 1
+    x111      c121                -1   c130                 1
+    x111      c131                -1
+    x112      c29                 -1   c30                  1
+    x112      c75                 -1   c76                  1
+    x112      c106                 1   c122                 1
+    x112      c123                -1   c132                 1
+    x112      c133                -1
+    x113      c31                 -1   c32                  1
+    x113      c77                 -1   c78                  1
+    x113      c107                 1   c124                 1
+    x113      c125                -1   c134                 1
+    x113      c135                -1
+    x114      c33                 -1   c34                  1
+    x114      c79                 -1   c80                  1
+    x114      c108                 1   c126                 1
+    x114      c127                -1   c136                 1
+    x114      c137                -1
+    x115      c35                 -1   c36                  1
+    x115      c81                 -1   c82                  1
+    x115      c109                 1   c128                 1
+    x115      c129                -1   c138                 1
+    x115      c139                -1
+    x116      c37                 -1   c38                  1
+    x116      c83                 -1   c84                  1
+    x116      c120                -1   c121                 1
+    x116      c141                 1   c156                 1
+    x116      c157                -1
+    x117      c39                 -1   c40                  1
+    x117      c85                 -1   c86                  1
+    x117      c122                -1   c123                 1
+    x117      c142                 1   c158                 1
+    x117      c159                -1
+    x118      c41                 -1   c42                  1
+    x118      c87                 -1   c88                  1
+    x118      c124                -1   c125                 1
+    x118      c143                 1   c160                 1
+    x118      c161                -1
+    x119      c43                 -1   c44                  1
+    x119      c89                 -1   c90                  1
+    x119      c126                -1   c127                 1
+    x119      c144                 1   c162                 1
+    x119      c163                -1
+    x120      c45                 -1   c46                  1
+    x120      c91                 -1   c92                  1
+    x120      c128                -1   c129                 1
+    x120      c145                 1   c164                 1
+    x120      c165                -1
+    x121      c47                 -1   c48                  1
+    x121      c93                 -1   c94                  1
+    x121      c130                -1   c131                 1
+    x121      c156                -1   c157                 1
+    x121      c167                 1
+    x122      c49                 -1   c50                  1
+    x122      c95                 -1   c96                  1
+    x122      c132                -1   c133                 1
+    x122      c158                -1   c159                 1
+    x122      c168                 1
+    x123      c51                 -1   c52                  1
+    x123      c97                 -1   c98                  1
+    x123      c134                -1   c135                 1
+    x123      c160                -1   c161                 1
+    x123      c169                 1
+    x124      c53                 -1   c54                  1
+    x124      c99                 -1   c100                 1
+    x124      c136                -1   c137                 1
+    x124      c162                -1   c163                 1
+    x124      c170                 1
+    x125      c55                 -1   c56                  1
+    x125      c101                -1   c102                 1
+    x125      c138                -1   c139                 1
+    x125      c164                -1   c165                 1
+    x125      c171                 1
+    x126      c149                 1
+    x127      c147                 1
+    x128      c151                 2   c153                 3
+    x128      c155                 4
+RHS
+    rhs       c1                  43   c18                -21
+    rhs       c20                -21   c22                -21
+    rhs       c24                -21   c26                -21
+    rhs       c28                -21   c30                -21
+    rhs       c32                -21   c34                -21
+    rhs       c36                -21   c38                -21
+    rhs       c40                -21   c42                -21
+    rhs       c44                -21   c46                -21
+    rhs       c48                -21   c50                -21
+    rhs       c52                -21   c54                -21
+    rhs       c56                -21   c57                 38
+    rhs       c74                -21   c76                -21
+    rhs       c78                -21   c80                -21
+    rhs       c82                -21   c84                -21
+    rhs       c86                -21   c88                -21
+    rhs       c90                -21   c92                -21
+    rhs       c94                -21   c96                -21
+    rhs       c98                -21   c100               -21
+    rhs       c102               -21   c103                 5
+    rhs       c104                 9   c121               -21
+    rhs       c123               -21   c125               -21
+    rhs       c127               -21   c129               -21
+    rhs       c131               -21   c133               -21
+    rhs       c135               -21   c137               -21
+    rhs       c139               -21   c140                 2
+    rhs       c157               -21   c159               -21
+    rhs       c161               -21   c163               -21
+    rhs       c165               -21   c166                 1
+    rhs       c182                 2
+BOUNDS
+ UP bnd       x1                   1
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52             100000
+ UP bnd       x53                  1
+ UP bnd       x54             100000
+ UP bnd       x55                  1
+ UP bnd       x56             100000
+ UP bnd       x57                  1
+ UP bnd       x58             100000
+ UP bnd       x59                  1
+ UP bnd       x60             100000
+ UP bnd       x61                  1
+ UP bnd       x62             100000
+ UP bnd       x63                  1
+ UP bnd       x64             100000
+ UP bnd       x65                  1
+ UP bnd       x66             100000
+ UP bnd       x67                  1
+ UP bnd       x68             100000
+ UP bnd       x69                  1
+ UP bnd       x70             100000
+ UP bnd       x71                  1
+ UP bnd       x72             100000
+ UP bnd       x73                  1
+ UP bnd       x74             100000
+ UP bnd       x75                  1
+ UP bnd       x76             100000
+ UP bnd       x77                  1
+ UP bnd       x78             100000
+ UP bnd       x79                  1
+ UP bnd       x80             100000
+ UP bnd       x81                  1
+ UP bnd       x82             100000
+ UP bnd       x83                  1
+ UP bnd       x84             100000
+ UP bnd       x85                  1
+ UP bnd       x86             100000
+ UP bnd       x87                  1
+ UP bnd       x88             100000
+ UP bnd       x89                  1
+ UP bnd       x90             100000
+ UP bnd       x91                  1
+ UP bnd       x92             100000
+ UP bnd       x93                  1
+ UP bnd       x94             100000
+ UP bnd       x95                  1
+ UP bnd       x96             100000
+ UP bnd       x97                  1
+ UP bnd       x98             100000
+ UP bnd       x99                  1
+ UP bnd       x100            100000
+ENDATA
diff --git a/demos/ppl_lpsol/examples/opt1217.mps b/demos/ppl_lpsol/examples/opt1217.mps
new file mode 100644
index 0000000..afc134c
--- /dev/null
+++ b/demos/ppl_lpsol/examples/opt1217.mps
@@ -0,0 +1,1643 @@
+NAME           opt1217
+ROWS
+ N  MINIMIZE
+ G  c1      
+ G  c2      
+ G  c3      
+ G  c4      
+ G  c5      
+ G  c6      
+ G  c7      
+ G  c8      
+ G  c9      
+ G  c10     
+ G  c11     
+ G  c12     
+ G  c13     
+ G  c14     
+ G  c15     
+ G  c16     
+ E  c17     
+ E  c18     
+ E  c19     
+ E  c20     
+ E  c21     
+ E  c22     
+ E  c23     
+ E  c24     
+ E  c25     
+ E  c26     
+ E  c27     
+ E  c28     
+ E  c29     
+ E  c30     
+ E  c31     
+ E  c32     
+ E  c33     
+ E  c34     
+ E  c35     
+ E  c36     
+ E  c37     
+ E  c38     
+ E  c39     
+ E  c40     
+ E  c41     
+ E  c42     
+ E  c43     
+ E  c44     
+ E  c45     
+ E  c46     
+ E  c47     
+ E  c48     
+ E  c49     
+ E  c50     
+ E  c51     
+ E  c52     
+ E  c53     
+ E  c54     
+ E  c55     
+ E  c56     
+ E  c57     
+ E  c58     
+ E  c59     
+ E  c60     
+ E  c61     
+ E  c62     
+ E  c63     
+ E  c64     
+COLUMNS
+    x1        MINIMIZE            -1   c1                  -1
+    x1        c2                  -1   c3                  -1
+    x1        c4                  -1   c5                  -1
+    x1        c6                  -1   c7                  -1
+    x1        c8                  -1   c9                  -1
+    x1        c10                 -1   c11                 -1
+    x1        c12                 -1   c13                 -1
+    x1        c14                 -1   c15                 -1
+    x1        c16                 -1
+    MARK0000  'MARKER'                 'INTORG'
+    x2        c1                   4   c17                  1
+    x3        c1                   4   c18                  1
+    x4        c1                   4   c19                  1
+    x5        c1                   4   c20                  1
+    x6        c1                   4   c21                  1
+    x7        c1                   4   c22                  1
+    x8        c1                   4   c23                  1
+    x9        c1                   2   c24                  1
+    x10       c1                   2   c25                  1
+    x11       c1                   2   c26                  1
+    x12       c1                   2   c27                  1
+    x13       c1                   2   c28                  1
+    x14       c1                   2   c29                  1
+    x15       c1                   2   c30                  1
+    x16       c1                   2   c31                  1
+    x17       c1                   1   c32                  1
+    x18       c1                   1   c34                  1
+    x19       c1                   2   c35                  1
+    x20       c1                   2   c36                  1
+    x21       c1                   2   c37                  1
+    x22       c1                   2   c38                  1
+    x23       c1                   2   c39                  1
+    x24       c1                   2   c40                  1
+    x25       c1                   4   c41                  1
+    x26       c1                   4   c42                  1
+    x27       c1                   4   c43                  1
+    x28       c1                   4   c44                  1
+    x29       c1                   4   c45                  1
+    x30       c1                   2   c46                  1
+    x31       c1                   2   c47                  1
+    x32       c1                   2   c48                  1
+    x33       c1                   4   c49                  1
+    x34       c1                   4   c50                  1
+    x35       c1                   6   c51                  1
+    x36       c1                   6   c52                  1
+    x37       c1                   6   c53                  1
+    x38       c1                   6   c54                  1
+    x39       c1                   8   c55                  1
+    x40       c1                   6   c56                  1
+    x41       c1                   6   c57                  1
+    x42       c1                   6   c58                  1
+    x43       c1                   6   c59                  1
+    x44       c1                   4   c60                  1
+    x45       c1                   4   c61                  1
+    x46       c1                   4   c62                  1
+    x47       c1                   4   c63                  1
+    x48       c1                   4   c64                  1
+    x49       c2                   2   c17                  1
+    x50       c2                   2   c18                  1
+    x51       c2                   2   c19                  1
+    x52       c2                   4   c20                  1
+    x53       c2                   4   c21                  1
+    x54       c2                   4   c22                  1
+    x55       c2                   4   c23                  1
+    x56       c2                   4   c24                  1
+    x57       c2                   2   c25                  1
+    x58       c2                   4   c26                  1
+    x59       c2                   4   c27                  1
+    x60       c2                   4   c28                  1
+    x61       c2                   2   c29                  1
+    x62       c2                   2   c30                  1
+    x63       c2                   4   c31                  1
+    x64       c2                   6   c32                  1
+    x65       c2                   6   c33                  1
+    x66       c2                   4   c34                  1
+    x67       c2                   4   c35                  1
+    x68       c2                   4   c36                  1
+    x69       c2                   4   c37                  1
+    x70       c2                   4   c38                  1
+    x71       c2                   2   c39                  1
+    x72       c2                   1   c40                  1
+    x73       c2                   2   c41                  1
+    x74       c2                   4   c42                  1
+    x75       c2                   2   c43                  1
+    x76       c2                   2   c44                  1
+    x77       c2                   4   c45                  1
+    x78       c2                   4   c46                  1
+    x79       c2                   4   c47                  1
+    x80       c2                   2   c48                  1
+    x81       c2                   2   c49                  1
+    x82       c2                   4   c50                  1
+    x83       c2                   4   c51                  1
+    x84       c2                   4   c52                  1
+    x85       c2                   4   c53                  1
+    x86       c2                   4   c54                  1
+    x87       c2                   4   c55                  1
+    x88       c2                   4   c56                  1
+    x89       c2                   4   c57                  1
+    x90       c2                   4   c58                  1
+    x91       c2                   4   c59                  1
+    x92       c2                   2   c60                  1
+    x93       c2                   2   c61                  1
+    x94       c2                   4   c62                  1
+    x95       c2                   4   c63                  1
+    x96       c2                   4   c64                  1
+    x97       c3                   2   c17                  1
+    x98       c3                   4   c18                  1
+    x99       c3                   4   c19                  1
+    x100      c3                   4   c20                  1
+    x101      c3                   6   c21                  1
+    x102      c3                   6   c22                  1
+    x103      c3                   6   c23                  1
+    x104      c3                   6   c24                  1
+    x105      c3                   6   c25                  1
+    x106      c3                   6   c26                  1
+    x107      c3                   6   c27                  1
+    x108      c3                   4   c28                  1
+    x109      c3                   4   c29                  1
+    x110      c3                   4   c30                  1
+    x111      c3                   4   c31                  1
+    x112      c3                   4   c32                  1
+    x113      c3                   4   c33                  1
+    x114      c3                   4   c34                  1
+    x115      c3                   4   c35                  1
+    x116      c3                   2   c36                  1
+    x117      c3                   2   c37                  1
+    x118      c3                   1   c38                  1
+    x119      c3                   1   c40                  1
+    x120      c3                   2   c41                  1
+    x121      c3                   4   c42                  1
+    x122      c3                   4   c43                  1
+    x123      c3                   6   c44                  1
+    x124      c3                   6   c45                  1
+    x125      c3                   6   c46                  1
+    x126      c3                   4   c47                  1
+    x127      c3                   4   c48                  1
+    x128      c3                   2   c49                  1
+    x129      c3                   2   c50                  1
+    x130      c3                   2   c51                  1
+    x131      c3                   4   c52                  1
+    x132      c3                   4   c53                  1
+    x133      c3                   2   c54                  1
+    x134      c3                   2   c55                  1
+    x135      c3                   4   c56                  1
+    x136      c3                   4   c57                  1
+    x137      c3                   4   c58                  1
+    x138      c3                   4   c59                  1
+    x139      c3                   1   c60                  1
+    x140      c3                   2   c61                  1
+    x141      c3                   4   c62                  1
+    x142      c3                   6   c63                  1
+    x143      c3                   6   c64                  1
+    x144      c4                   4   c17                  1
+    x145      c4                   4   c18                  1
+    x146      c4                   4   c19                  1
+    x147      c4                   4   c20                  1
+    x148      c4                   4   c21                  1
+    x149      c4                   2   c22                  1
+    x150      c4                   1   c23                  1
+    x151      c4                   2   c24                  1
+    x152      c4                   4   c25                  1
+    x153      c4                   4   c26                  1
+    x154      c4                   4   c27                  1
+    x155      c4                   4   c28                  1
+    x156      c4                   4   c29                  1
+    x157      c4                   6   c30                  1
+    x158      c4                   6   c31                  1
+    x159      c4                   6   c32                  1
+    x160      c4                   6   c33                  1
+    x161      c4                   6   c34                  1
+    x162      c4                   6   c35                  1
+    x163      c4                   6   c36                  1
+    x164      c4                   6   c37                  1
+    x165      c4                   6   c38                  1
+    x166      c4                   4   c39                  1
+    x167      c4                   4   c40                  1
+    x168      c4                   4   c41                  1
+    x169      c4                   4   c42                  1
+    x170      c4                   6   c43                  1
+    x171      c4                   4   c44                  1
+    x172      c4                   4   c45                  1
+    x173      c4                   4   c46                  1
+    x174      c4                   2   c47                  1
+    x175      c4                   2   c48                  1
+    x176      c4                   4   c49                  1
+    x177      c4                   6   c50                  1
+    x178      c4                   6   c51                  1
+    x179      c4                   6   c52                  1
+    x180      c4                   6   c53                  1
+    x181      c4                   6   c54                  1
+    x182      c4                   4   c55                  1
+    x183      c4                   4   c56                  1
+    x184      c4                   6   c57                  1
+    x185      c4                   6   c58                  1
+    x186      c4                   6   c59                  1
+    x187      c4                   6   c60                  1
+    x188      c4                   4   c61                  1
+    x189      c4                   2   c62                  1
+    x190      c4                   2   c63                  1
+    x191      c4                   2   c64                  1
+    x192      c5                   6   c17                  1
+    x193      c5                   6   c18                  1
+    x194      c5                   6   c19                  1
+    x195      c5                   6   c20                  1
+    x196      c5                   4   c21                  1
+    x197      c5                   4   c22                  1
+    x198      c5                   4   c23                  1
+    x199      c5                   4   c24                  1
+    x200      c5                   4   c25                  1
+    x201      c5                   4   c26                  1
+    x202      c5                   6   c27                  1
+    x203      c5                   6   c28                  1
+    x204      c5                   6   c29                  1
+    x205      c5                   6   c30                  1
+    x206      c5                   6   c31                  1
+    x207      c5                   6   c32                  1
+    x208      c5                   6   c33                  1
+    x209      c5                   6   c34                  1
+    x210      c5                   6   c35                  1
+    x211      c5                   4   c36                  1
+    x212      c5                   4   c37                  1
+    x213      c5                   4   c38                  1
+    x214      c5                   2   c39                  1
+    x215      c5                   2   c40                  1
+    x216      c5                   2   c41                  1
+    x217      c5                   1   c42                  1
+    x218      c5                   1   c43                  1
+    x219      c5                   2   c44                  1
+    x220      c5                   2   c45                  1
+    x221      c5                   2   c46                  1
+    x222      c5                   2   c47                  1
+    x223      c5                   2   c48                  1
+    x224      c5                   2   c49                  1
+    x225      c5                   2   c50                  1
+    x226      c5                   2   c51                  1
+    x227      c5                   2   c52                  1
+    x228      c5                   2   c53                  1
+    x229      c5                   2   c54                  1
+    x230      c5                   2   c55                  1
+    x231      c5                   2   c56                  1
+    x232      c5                   2   c57                  1
+    x233      c5                   2   c58                  1
+    x234      c5                   2   c59                  1
+    x235      c5                   2   c60                  1
+    x236      c5                   2   c61                  1
+    x237      c5                   2   c62                  1
+    x238      c5                   2   c63                  1
+    x239      c5                   2   c64                  1
+    x240      c6                   2   c17                  1
+    x241      c6                   2   c18                  1
+    x242      c6                   2   c19                  1
+    x243      c6                   2   c20                  1
+    x244      c6                   2   c21                  1
+    x245      c6                   1   c22                  1
+    x246      c6                   1   c23                  1
+    x247      c6                   1   c24                  1
+    x248      c6                   1   c25                  1
+    x249      c6                   1   c30                  1
+    x250      c6                   1   c31                  1
+    x251      c6                   1   c32                  1
+    x252      c6                   2   c33                  1
+    x253      c6                   2   c34                  1
+    x254      c6                   2   c35                  1
+    x255      c6                   2   c36                  1
+    x256      c6                   2   c37                  1
+    x257      c6                   2   c38                  1
+    x258      c6                   2   c39                  1
+    x259      c6                   2   c40                  1
+    x260      c6                   1   c41                  1
+    x261      c6                   1   c42                  1
+    x262      c6                   2   c43                  1
+    x263      c6                   2   c44                  1
+    x264      c6                   4   c45                  1
+    x265      c6                   4   c46                  1
+    x266      c6                   4   c47                  1
+    x267      c6                   4   c48                  1
+    x268      c6                   4   c49                  1
+    x269      c6                   4   c50                  1
+    x270      c6                   4   c51                  1
+    x271      c6                   4   c52                  1
+    x272      c6                   4   c53                  1
+    x273      c6                   4   c54                  1
+    x274      c6                   2   c55                  1
+    x275      c6                   2   c56                  1
+    x276      c6                   2   c57                  1
+    x277      c6                   4   c58                  1
+    x278      c6                   4   c59                  1
+    x279      c6                   4   c60                  1
+    x280      c6                   6   c61                  1
+    x281      c6                   6   c62                  1
+    x282      c6                   6   c63                  1
+    x283      c6                   6   c64                  1
+    x284      c7                   4   c17                  1
+    x285      c7                   4   c18                  1
+    x286      c7                   4   c19                  1
+    x287      c7                   4   c20                  1
+    x288      c7                   2   c21                  1
+    x289      c7                   1   c22                  1
+    x290      c7                   2   c23                  1
+    x291      c7                   4   c24                  1
+    x292      c7                   4   c25                  1
+    x293      c7                   6   c26                  1
+    x294      c7                   4   c27                  1
+    x295      c7                   4   c28                  1
+    x296      c7                   4   c29                  1
+    x297      c7                   4   c30                  1
+    x298      c7                   4   c31                  1
+    x299      c7                   6   c32                  1
+    x300      c7                   6   c33                  1
+    x301      c7                   6   c34                  1
+    x302      c7                   6   c35                  1
+    x303      c7                   6   c36                  1
+    x304      c7                   6   c37                  1
+    x305      c7                   4   c38                  1
+    x306      c7                   4   c39                  1
+    x307      c7                   4   c40                  1
+    x308      c7                   4   c41                  1
+    x309      c7                   4   c42                  1
+    x310      c7                   4   c43                  1
+    x311      c7                   4   c44                  1
+    x312      c7                   4   c45                  1
+    x313      c7                   4   c46                  1
+    x314      c7                   6   c47                  1
+    x315      c7                   6   c48                  1
+    x316      c7                   6   c49                  1
+    x317      c7                   6   c50                  1
+    x318      c7                   6   c51                  1
+    x319      c7                   6   c52                  1
+    x320      c7                   6   c53                  1
+    x321      c7                   6   c54                  1
+    x322      c7                   4   c55                  1
+    x323      c7                   4   c56                  1
+    x324      c7                   4   c57                  1
+    x325      c7                   4   c58                  1
+    x326      c7                   4   c59                  1
+    x327      c7                   4   c60                  1
+    x328      c7                   4   c61                  1
+    x329      c7                   4   c62                  1
+    x330      c7                   4   c63                  1
+    x331      c7                   4   c64                  1
+    x332      c8                   4   c17                  1
+    x333      c8                   4   c18                  1
+    x334      c8                   4   c19                  1
+    x335      c8                   4   c20                  1
+    x336      c8                   2   c21                  1
+    x337      c8                   4   c22                  1
+    x338      c8                   4   c23                  1
+    x339      c8                   6   c24                  1
+    x340      c8                   6   c25                  1
+    x341      c8                   6   c26                  1
+    x342      c8                   6   c27                  1
+    x343      c8                   8   c28                  1
+    x344      c8                   8   c29                  1
+    x345      c8                   8   c30                  1
+    x346      c8                   8   c31                  1
+    x347      c8                   8   c32                  1
+    x348      c8                   6   c33                  1
+    x349      c8                   6   c34                  1
+    x350      c8                   6   c35                  1
+    x351      c8                   6   c36                  1
+    x352      c8                   4   c37                  1
+    x353      c8                   4   c38                  1
+    x354      c8                   2   c39                  1
+    x355      c8                   2   c40                  1
+    x356      c8                   2   c41                  1
+    x357      c8                   2   c42                  1
+    x358      c8                   4   c43                  1
+    x359      c8                   4   c44                  1
+    x360      c8                   4   c45                  1
+    x361      c8                   4   c46                  1
+    x362      c8                   4   c47                  1
+    x363      c8                   4   c48                  1
+    x364      c8                   4   c49                  1
+    x365      c8                   6   c50                  1
+    x366      c8                   6   c51                  1
+    x367      c8                   6   c52                  1
+    x368      c8                   6   c53                  1
+    x369      c8                   6   c54                  1
+    x370      c8                   6   c55                  1
+    x371      c8                   6   c56                  1
+    x372      c8                   6   c57                  1
+    x373      c8                   6   c58                  1
+    x374      c8                   6   c59                  1
+    x375      c8                   4   c60                  1
+    x376      c8                   4   c61                  1
+    x377      c8                   2   c62                  1
+    x378      c8                   1   c63                  1
+    x379      c8                   1   c64                  1
+    x380      c9                   4   c17                  1
+    x381      c9                   4   c18                  1
+    x382      c9                   6   c19                  1
+    x383      c9                   6   c20                  1
+    x384      c9                   6   c21                  1
+    x385      c9                   6   c22                  1
+    x386      c9                   4   c23                  1
+    x387      c9                   4   c24                  1
+    x388      c9                   2   c25                  1
+    x389      c9                   2   c26                  1
+    x390      c9                   2   c27                  1
+    x391      c9                   2   c28                  1
+    x392      c9                   2   c29                  1
+    x393      c9                   2   c30                  1
+    x394      c9                   4   c31                  1
+    x395      c9                   4   c32                  1
+    x396      c9                   4   c33                  1
+    x397      c9                   4   c34                  1
+    x398      c9                   4   c35                  1
+    x399      c9                   4   c36                  1
+    x400      c9                   4   c37                  1
+    x401      c9                   6   c38                  1
+    x402      c9                   6   c39                  1
+    x403      c9                   6   c40                  1
+    x404      c9                   6   c41                  1
+    x405      c9                   4   c42                  1
+    x406      c9                   4   c43                  1
+    x407      c9                   2   c44                  1
+    x408      c9                   2   c45                  1
+    x409      c9                   4   c46                  1
+    x410      c9                   4   c47                  1
+    x411      c9                   4   c48                  1
+    x412      c9                   4   c49                  1
+    x413      c9                   4   c50                  1
+    x414      c9                   4   c51                  1
+    x415      c9                   4   c52                  1
+    x416      c9                   4   c53                  1
+    x417      c9                   6   c54                  1
+    x418      c9                   6   c55                  1
+    x419      c9                   6   c56                  1
+    x420      c9                   6   c57                  1
+    x421      c9                   6   c58                  1
+    x422      c9                   6   c59                  1
+    x423      c9                   4   c60                  1
+    x424      c9                   4   c61                  1
+    x425      c9                   4   c62                  1
+    x426      c9                   4   c63                  1
+    x427      c9                   4   c64                  1
+    x428      c10                  1   c17                  1
+    x429      c10                  2   c18                  1
+    x430      c10                  2   c19                  1
+    x431      c10                  4   c20                  1
+    x432      c10                  4   c21                  1
+    x433      c10                  4   c22                  1
+    x434      c10                  4   c23                  1
+    x435      c10                  4   c24                  1
+    x436      c10                  4   c25                  1
+    x437      c10                  4   c26                  1
+    x438      c10                  4   c27                  1
+    x439      c10                  4   c28                  1
+    x440      c10                  2   c29                  1
+    x441      c10                  2   c30                  1
+    x442      c10                  2   c31                  1
+    x443      c10                  2   c32                  1
+    x444      c10                  4   c33                  1
+    x445      c10                  4   c34                  1
+    x446      c10                  4   c35                  1
+    x447      c10                  4   c36                  1
+    x448      c10                  4   c37                  1
+    x449      c10                  4   c38                  1
+    x450      c10                  4   c39                  1
+    x451      c10                  4   c40                  1
+    x452      c10                  4   c41                  1
+    x453      c10                  2   c42                  1
+    x454      c10                  1   c43                  1
+    x455      c10                  2   c45                  1
+    x456      c10                  4   c46                  1
+    x457      c10                  4   c47                  1
+    x458      c10                  6   c48                  1
+    x459      c10                  6   c49                  1
+    x460      c10                  6   c50                  1
+    x461      c10                  6   c51                  1
+    x462      c10                  8   c52                  1
+    x463      c10                  8   c53                  1
+    x464      c10                  8   c54                  1
+    x465      c10                  8   c55                  1
+    x466      c10                  8   c56                  1
+    x467      c10                  8   c57                  1
+    x468      c10                  8   c58                  1
+    x469      c10                  6   c59                  1
+    x470      c10                  6   c60                  1
+    x471      c10                  6   c61                  1
+    x472      c10                  6   c62                  1
+    x473      c10                  6   c63                  1
+    x474      c10                  4   c64                  1
+    x475      c11                  4   c18                  1
+    x476      c11                  6   c19                  1
+    x477      c11                  6   c20                  1
+    x478      c11                  4   c21                  1
+    x479      c11                  2   c22                  1
+    x480      c11                  4   c23                  1
+    x481      c11                  4   c24                  1
+    x482      c11                  2   c25                  1
+    x483      c11                  2   c26                  1
+    x484      c11                  4   c27                  1
+    x485      c11                  4   c28                  1
+    x486      c11                  6   c29                  1
+    x487      c11                  6   c30                  1
+    x488      c11                  6   c31                  1
+    x489      c11                  6   c32                  1
+    x490      c11                  6   c33                  1
+    x491      c11                  6   c34                  1
+    x492      c11                  6   c35                  1
+    x493      c11                  4   c36                  1
+    x494      c11                  2   c37                  1
+    x495      c11                  2   c38                  1
+    x496      c11                  4   c39                  1
+    x497      c11                  4   c40                  1
+    x498      c11                  2   c41                  1
+    x499      c11                  2   c42                  1
+    x500      c11                  4   c43                  1
+    x501      c11                  4   c44                  1
+    x502      c11                  4   c45                  1
+    x503      c11                  4   c46                  1
+    x504      c11                  2   c47                  1
+    x505      c11                  2   c48                  1
+    x506      c11                  4   c49                  1
+    x507      c11                  6   c50                  1
+    x508      c11                  4   c51                  1
+    x509      c11                  4   c52                  1
+    x510      c11                  6   c53                  1
+    x511      c11                  6   c54                  1
+    x512      c11                  6   c55                  1
+    x513      c11                  6   c56                  1
+    x514      c11                  4   c57                  1
+    x515      c11                  6   c58                  1
+    x516      c11                  6   c59                  1
+    x517      c11                  6   c60                  1
+    x518      c11                  6   c61                  1
+    x519      c11                  8   c62                  1
+    x520      c11                  8   c63                  1
+    x521      c11                  8   c64                  1
+    x522      c12                  6   c17                  1
+    x523      c12                  6   c18                  1
+    x524      c12                  8   c19                  1
+    x525      c12                  8   c20                  1
+    x526      c12                  8   c21                  1
+    x527      c12                  8   c22                  1
+    x528      c12                  8   c23                  1
+    x529      c12                  6   c24                  1
+    x530      c12                  6   c25                  1
+    x531      c12                  6   c26                  1
+    x532      c12                  4   c27                  1
+    x533      c12                  4   c28                  1
+    x534      c12                  2   c29                  1
+    x535      c12                  2   c30                  1
+    x536      c12                  2   c31                  1
+    x537      c12                  2   c32                  1
+    x538      c12                  2   c33                  1
+    x539      c12                  2   c34                  1
+    x540      c12                  2   c35                  1
+    x541      c12                  2   c36                  1
+    x542      c12                  4   c37                  1
+    x543      c12                  4   c38                  1
+    x544      c12                  4   c39                  1
+    x545      c12                  6   c40                  1
+    x546      c12                  6   c41                  1
+    x547      c12                  6   c42                  1
+    x548      c12                  6   c43                  1
+    x549      c12                  6   c44                  1
+    x550      c12                  6   c45                  1
+    x551      c12                  6   c46                  1
+    x552      c12                  8   c47                  1
+    x553      c12                  8   c48                  1
+    x554      c12                  8   c49                  1
+    x555      c12                  6   c50                  1
+    x556      c12                  6   c51                  1
+    x557      c12                  6   c52                  1
+    x558      c12                  6   c53                  1
+    x559      c12                  6   c54                  1
+    x560      c12                  6   c55                  1
+    x561      c12                  6   c56                  1
+    x562      c12                  8   c57                  1
+    x563      c12                  8   c58                  1
+    x564      c12                  6   c59                  1
+    x565      c12                  6   c60                  1
+    x566      c12                  6   c61                  1
+    x567      c12                  6   c62                  1
+    x568      c12                  4   c63                  1
+    x569      c12                  6   c64                  1
+    x570      c13                  6   c17                  1
+    x571      c13                  6   c18                  1
+    x572      c13                  4   c19                  1
+    x573      c13                  4   c20                  1
+    x574      c13                  6   c21                  1
+    x575      c13                  6   c22                  1
+    x576      c13                  6   c23                  1
+    x577      c13                  6   c24                  1
+    x578      c13                  6   c25                  1
+    x579      c13                  6   c26                  1
+    x580      c13                  6   c27                  1
+    x581      c13                  6   c28                  1
+    x582      c13                  8   c29                  1
+    x583      c13                  8   c30                  1
+    x584      c13                  8   c31                  1
+    x585      c13                  6   c32                  1
+    x586      c13                  6   c33                  1
+    x587      c13                  6   c34                  1
+    x588      c13                  4   c35                  1
+    x589      c13                  2   c36                  1
+    x590      c13                  4   c37                  1
+    x591      c13                  4   c38                  1
+    x592      c13                  4   c39                  1
+    x593      c13                  2   c40                  1
+    x594      c13                  1   c41                  1
+    x595      c13                  1   c42                  1
+    x596      c13                  4   c43                  1
+    x597      c13                  4   c44                  1
+    x598      c13                  4   c45                  1
+    x599      c13                  4   c46                  1
+    x600      c13                  4   c47                  1
+    x601      c13                  6   c48                  1
+    x602      c13                  6   c49                  1
+    x603      c13                  6   c50                  1
+    x604      c13                  6   c51                  1
+    x605      c13                  6   c52                  1
+    x606      c13                  6   c53                  1
+    x607      c13                  6   c54                  1
+    x608      c13                  4   c55                  1
+    x609      c13                  2   c56                  1
+    x610      c13                  2   c58                  1
+    x611      c13                  4   c59                  1
+    x612      c13                  4   c60                  1
+    x613      c13                  4   c61                  1
+    x614      c13                  4   c62                  1
+    x615      c13                  4   c63                  1
+    x616      c13                  4   c64                  1
+    x617      c14                  8   c17                  1
+    x618      c14                  8   c18                  1
+    x619      c14                  8   c19                  1
+    x620      c14                  6   c20                  1
+    x621      c14                  6   c21                  1
+    x622      c14                  6   c22                  1
+    x623      c14                  8   c23                  1
+    x624      c14                  6   c24                  1
+    x625      c14                  6   c25                  1
+    x626      c14                  4   c26                  1
+    x627      c14                  4   c27                  1
+    x628      c14                  4   c28                  1
+    x629      c14                  4   c29                  1
+    x630      c14                  2   c30                  1
+    x631      c14                  6   c31                  1
+    x632      c14                  6   c32                  1
+    x633      c14                  8   c33                  1
+    x634      c14                  8   c34                  1
+    x635      c14                  8   c35                  1
+    x636      c14                  6   c36                  1
+    x637      c14                  6   c37                  1
+    x638      c14                  6   c38                  1
+    x639      c14                  6   c39                  1
+    x640      c14                  6   c40                  1
+    x641      c14                  6   c41                  1
+    x642      c14                  8   c42                  1
+    x643      c14                  8   c43                  1
+    x644      c14                  8   c44                  1
+    x645      c14                  8   c45                  1
+    x646      c14                  8   c46                  1
+    x647      c14                  8   c47                  1
+    x648      c14                  6   c48                  1
+    x649      c14                  6   c49                  1
+    x650      c14                  6   c50                  1
+    x651      c14                  6   c51                  1
+    x652      c14                  2   c52                  1
+    x653      c14                  4   c53                  1
+    x654      c14                  4   c54                  1
+    x655      c14                  4   c55                  1
+    x656      c14                  2   c56                  1
+    x657      c14                  4   c57                  1
+    x658      c14                  6   c58                  1
+    x659      c14                  8   c59                  1
+    x660      c14                  6   c60                  1
+    x661      c14                  6   c61                  1
+    x662      c14                  6   c62                  1
+    x663      c14                  6   c63                  1
+    x664      c14                  6   c64                  1
+    x665      c15                  8   c17                  1
+    x666      c15                  8   c18                  1
+    x667      c15                  8   c19                  1
+    x668      c15                  8   c20                  1
+    x669      c15                  8   c21                  1
+    x670      c15                  8   c22                  1
+    x671      c15                  8   c23                  1
+    x672      c15                  8   c24                  1
+    x673      c15                  8   c25                  1
+    x674      c15                  8   c26                  1
+    x675      c15                  8   c27                  1
+    x676      c15                  8   c28                  1
+    x677      c15                  8   c29                  1
+    x678      c15                  6   c30                  1
+    x679      c15                  6   c31                  1
+    x680      c15                  6   c32                  1
+    x681      c15                  6   c33                  1
+    x682      c15                  8   c34                  1
+    x683      c15                  8   c35                  1
+    x684      c15                  6   c36                  1
+    x685      c15                  6   c37                  1
+    x686      c15                  4   c38                  1
+    x687      c15                  2   c40                  1
+    x688      c15                  4   c41                  1
+    x689      c15                  4   c42                  1
+    x690      c15                  2   c43                  1
+    x691      c15                  2   c44                  1
+    x692      c15                  4   c45                  1
+    x693      c15                  4   c46                  1
+    x694      c15                  4   c47                  1
+    x695      c15                  4   c48                  1
+    x696      c15                  2   c49                  1
+    x697      c15                  2   c50                  1
+    x698      c15                  4   c51                  1
+    x699      c15                  6   c52                  1
+    x700      c15                  6   c53                  1
+    x701      c15                  8   c54                  1
+    x702      c15                  6   c55                  1
+    x703      c15                  6   c56                  1
+    x704      c15                  4   c57                  1
+    x705      c15                  2   c58                  1
+    x706      c15                  2   c59                  1
+    x707      c15                  4   c60                  1
+    x708      c15                  6   c61                  1
+    x709      c15                  6   c62                  1
+    x710      c15                  6   c63                  1
+    x711      c15                  6   c64                  1
+    x712      c16                  8   c17                  1
+    x713      c16                  8   c18                  1
+    x714      c16                  8   c19                  1
+    x715      c16                  8   c20                  1
+    x716      c16                  6   c21                  1
+    x717      c16                  4   c22                  1
+    x718      c16                  6   c23                  1
+    x719      c16                  8   c24                  1
+    x720      c16                  8   c25                  1
+    x721      c16                  8   c26                  1
+    x722      c16                  8   c27                  1
+    x723      c16                  8   c28                  1
+    x724      c16                  8   c29                  1
+    x725      c16                  8   c30                  1
+    x726      c16                  8   c31                  1
+    x727      c16                  8   c32                  1
+    x728      c16                  8   c33                  1
+    x729      c16                  8   c34                  1
+    x730      c16                  8   c35                  1
+    x731      c16                  8   c36                  1
+    x732      c16                  6   c37                  1
+    x733      c16                  6   c38                  1
+    x734      c16                  4   c39                  1
+    x735      c16                  4   c40                  1
+    x736      c16                  6   c41                  1
+    x737      c16                  6   c42                  1
+    x738      c16                  6   c43                  1
+    x739      c16                  6   c44                  1
+    x740      c16                  6   c45                  1
+    x741      c16                  8   c46                  1
+    x742      c16                  8   c47                  1
+    x743      c16                  8   c48                  1
+    x744      c16                  8   c49                  1
+    x745      c16                  8   c50                  1
+    x746      c16                  8   c51                  1
+    x747      c16                  8   c52                  1
+    x748      c16                  6   c53                  1
+    x749      c16                  6   c54                  1
+    x750      c16                  2   c55                  1
+    x751      c16                  6   c56                  1
+    x752      c16                  8   c57                  1
+    x753      c16                  8   c58                  1
+    x754      c16                  8   c59                  1
+    x755      c16                  8   c60                  1
+    x756      c16                  8   c61                  1
+    x757      c16                  8   c62                  1
+    x758      c16                  6   c63                  1
+    x759      c16                  8   c64                  1
+    x760      c17                  1
+    x761      c26                  1
+    x762      c27                  1
+    x763      c28                  1
+    x764      c29                  1
+    x765      c33                  1
+    x766      c39                  1
+    x767      c39                  1
+    x768      c44                  1
+    x769      c57                  1
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c17                  1   c18                  1
+    rhs       c19                  1   c20                  1
+    rhs       c21                  1   c22                  1
+    rhs       c23                  1   c24                  1
+    rhs       c25                  1   c26                  1
+    rhs       c27                  1   c28                  1
+    rhs       c29                  1   c30                  1
+    rhs       c31                  1   c32                  1
+    rhs       c33                  1   c34                  1
+    rhs       c35                  1   c36                  1
+    rhs       c37                  1   c38                  1
+    rhs       c39                  1   c40                  1
+    rhs       c41                  1   c42                  1
+    rhs       c43                  1   c44                  1
+    rhs       c45                  1   c46                  1
+    rhs       c47                  1   c48                  1
+    rhs       c49                  1   c50                  1
+    rhs       c51                  1   c52                  1
+    rhs       c53                  1   c54                  1
+    rhs       c55                  1   c56                  1
+    rhs       c57                  1   c58                  1
+    rhs       c59                  1   c60                  1
+    rhs       c61                  1   c62                  1
+    rhs       c63                  1   c64                  1
+BOUNDS
+ UP bnd       x1                 384
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ UP bnd       x75                  1
+ UP bnd       x76                  1
+ UP bnd       x77                  1
+ UP bnd       x78                  1
+ UP bnd       x79                  1
+ UP bnd       x80                  1
+ UP bnd       x81                  1
+ UP bnd       x82                  1
+ UP bnd       x83                  1
+ UP bnd       x84                  1
+ UP bnd       x85                  1
+ UP bnd       x86                  1
+ UP bnd       x87                  1
+ UP bnd       x88                  1
+ UP bnd       x89                  1
+ UP bnd       x90                  1
+ UP bnd       x91                  1
+ UP bnd       x92                  1
+ UP bnd       x93                  1
+ UP bnd       x94                  1
+ UP bnd       x95                  1
+ UP bnd       x96                  1
+ UP bnd       x97                  1
+ UP bnd       x98                  1
+ UP bnd       x99                  1
+ UP bnd       x100                 1
+ UP bnd       x101                 1
+ UP bnd       x102                 1
+ UP bnd       x103                 1
+ UP bnd       x104                 1
+ UP bnd       x105                 1
+ UP bnd       x106                 1
+ UP bnd       x107                 1
+ UP bnd       x108                 1
+ UP bnd       x109                 1
+ UP bnd       x110                 1
+ UP bnd       x111                 1
+ UP bnd       x112                 1
+ UP bnd       x113                 1
+ UP bnd       x114                 1
+ UP bnd       x115                 1
+ UP bnd       x116                 1
+ UP bnd       x117                 1
+ UP bnd       x118                 1
+ UP bnd       x119                 1
+ UP bnd       x120                 1
+ UP bnd       x121                 1
+ UP bnd       x122                 1
+ UP bnd       x123                 1
+ UP bnd       x124                 1
+ UP bnd       x125                 1
+ UP bnd       x126                 1
+ UP bnd       x127                 1
+ UP bnd       x128                 1
+ UP bnd       x129                 1
+ UP bnd       x130                 1
+ UP bnd       x131                 1
+ UP bnd       x132                 1
+ UP bnd       x133                 1
+ UP bnd       x134                 1
+ UP bnd       x135                 1
+ UP bnd       x136                 1
+ UP bnd       x137                 1
+ UP bnd       x138                 1
+ UP bnd       x139                 1
+ UP bnd       x140                 1
+ UP bnd       x141                 1
+ UP bnd       x142                 1
+ UP bnd       x143                 1
+ UP bnd       x144                 1
+ UP bnd       x145                 1
+ UP bnd       x146                 1
+ UP bnd       x147                 1
+ UP bnd       x148                 1
+ UP bnd       x149                 1
+ UP bnd       x150                 1
+ UP bnd       x151                 1
+ UP bnd       x152                 1
+ UP bnd       x153                 1
+ UP bnd       x154                 1
+ UP bnd       x155                 1
+ UP bnd       x156                 1
+ UP bnd       x157                 1
+ UP bnd       x158                 1
+ UP bnd       x159                 1
+ UP bnd       x160                 1
+ UP bnd       x161                 1
+ UP bnd       x162                 1
+ UP bnd       x163                 1
+ UP bnd       x164                 1
+ UP bnd       x165                 1
+ UP bnd       x166                 1
+ UP bnd       x167                 1
+ UP bnd       x168                 1
+ UP bnd       x169                 1
+ UP bnd       x170                 1
+ UP bnd       x171                 1
+ UP bnd       x172                 1
+ UP bnd       x173                 1
+ UP bnd       x174                 1
+ UP bnd       x175                 1
+ UP bnd       x176                 1
+ UP bnd       x177                 1
+ UP bnd       x178                 1
+ UP bnd       x179                 1
+ UP bnd       x180                 1
+ UP bnd       x181                 1
+ UP bnd       x182                 1
+ UP bnd       x183                 1
+ UP bnd       x184                 1
+ UP bnd       x185                 1
+ UP bnd       x186                 1
+ UP bnd       x187                 1
+ UP bnd       x188                 1
+ UP bnd       x189                 1
+ UP bnd       x190                 1
+ UP bnd       x191                 1
+ UP bnd       x192                 1
+ UP bnd       x193                 1
+ UP bnd       x194                 1
+ UP bnd       x195                 1
+ UP bnd       x196                 1
+ UP bnd       x197                 1
+ UP bnd       x198                 1
+ UP bnd       x199                 1
+ UP bnd       x200                 1
+ UP bnd       x201                 1
+ UP bnd       x202                 1
+ UP bnd       x203                 1
+ UP bnd       x204                 1
+ UP bnd       x205                 1
+ UP bnd       x206                 1
+ UP bnd       x207                 1
+ UP bnd       x208                 1
+ UP bnd       x209                 1
+ UP bnd       x210                 1
+ UP bnd       x211                 1
+ UP bnd       x212                 1
+ UP bnd       x213                 1
+ UP bnd       x214                 1
+ UP bnd       x215                 1
+ UP bnd       x216                 1
+ UP bnd       x217                 1
+ UP bnd       x218                 1
+ UP bnd       x219                 1
+ UP bnd       x220                 1
+ UP bnd       x221                 1
+ UP bnd       x222                 1
+ UP bnd       x223                 1
+ UP bnd       x224                 1
+ UP bnd       x225                 1
+ UP bnd       x226                 1
+ UP bnd       x227                 1
+ UP bnd       x228                 1
+ UP bnd       x229                 1
+ UP bnd       x230                 1
+ UP bnd       x231                 1
+ UP bnd       x232                 1
+ UP bnd       x233                 1
+ UP bnd       x234                 1
+ UP bnd       x235                 1
+ UP bnd       x236                 1
+ UP bnd       x237                 1
+ UP bnd       x238                 1
+ UP bnd       x239                 1
+ UP bnd       x240                 1
+ UP bnd       x241                 1
+ UP bnd       x242                 1
+ UP bnd       x243                 1
+ UP bnd       x244                 1
+ UP bnd       x245                 1
+ UP bnd       x246                 1
+ UP bnd       x247                 1
+ UP bnd       x248                 1
+ UP bnd       x249                 1
+ UP bnd       x250                 1
+ UP bnd       x251                 1
+ UP bnd       x252                 1
+ UP bnd       x253                 1
+ UP bnd       x254                 1
+ UP bnd       x255                 1
+ UP bnd       x256                 1
+ UP bnd       x257                 1
+ UP bnd       x258                 1
+ UP bnd       x259                 1
+ UP bnd       x260                 1
+ UP bnd       x261                 1
+ UP bnd       x262                 1
+ UP bnd       x263                 1
+ UP bnd       x264                 1
+ UP bnd       x265                 1
+ UP bnd       x266                 1
+ UP bnd       x267                 1
+ UP bnd       x268                 1
+ UP bnd       x269                 1
+ UP bnd       x270                 1
+ UP bnd       x271                 1
+ UP bnd       x272                 1
+ UP bnd       x273                 1
+ UP bnd       x274                 1
+ UP bnd       x275                 1
+ UP bnd       x276                 1
+ UP bnd       x277                 1
+ UP bnd       x278                 1
+ UP bnd       x279                 1
+ UP bnd       x280                 1
+ UP bnd       x281                 1
+ UP bnd       x282                 1
+ UP bnd       x283                 1
+ UP bnd       x284                 1
+ UP bnd       x285                 1
+ UP bnd       x286                 1
+ UP bnd       x287                 1
+ UP bnd       x288                 1
+ UP bnd       x289                 1
+ UP bnd       x290                 1
+ UP bnd       x291                 1
+ UP bnd       x292                 1
+ UP bnd       x293                 1
+ UP bnd       x294                 1
+ UP bnd       x295                 1
+ UP bnd       x296                 1
+ UP bnd       x297                 1
+ UP bnd       x298                 1
+ UP bnd       x299                 1
+ UP bnd       x300                 1
+ UP bnd       x301                 1
+ UP bnd       x302                 1
+ UP bnd       x303                 1
+ UP bnd       x304                 1
+ UP bnd       x305                 1
+ UP bnd       x306                 1
+ UP bnd       x307                 1
+ UP bnd       x308                 1
+ UP bnd       x309                 1
+ UP bnd       x310                 1
+ UP bnd       x311                 1
+ UP bnd       x312                 1
+ UP bnd       x313                 1
+ UP bnd       x314                 1
+ UP bnd       x315                 1
+ UP bnd       x316                 1
+ UP bnd       x317                 1
+ UP bnd       x318                 1
+ UP bnd       x319                 1
+ UP bnd       x320                 1
+ UP bnd       x321                 1
+ UP bnd       x322                 1
+ UP bnd       x323                 1
+ UP bnd       x324                 1
+ UP bnd       x325                 1
+ UP bnd       x326                 1
+ UP bnd       x327                 1
+ UP bnd       x328                 1
+ UP bnd       x329                 1
+ UP bnd       x330                 1
+ UP bnd       x331                 1
+ UP bnd       x332                 1
+ UP bnd       x333                 1
+ UP bnd       x334                 1
+ UP bnd       x335                 1
+ UP bnd       x336                 1
+ UP bnd       x337                 1
+ UP bnd       x338                 1
+ UP bnd       x339                 1
+ UP bnd       x340                 1
+ UP bnd       x341                 1
+ UP bnd       x342                 1
+ UP bnd       x343                 1
+ UP bnd       x344                 1
+ UP bnd       x345                 1
+ UP bnd       x346                 1
+ UP bnd       x347                 1
+ UP bnd       x348                 1
+ UP bnd       x349                 1
+ UP bnd       x350                 1
+ UP bnd       x351                 1
+ UP bnd       x352                 1
+ UP bnd       x353                 1
+ UP bnd       x354                 1
+ UP bnd       x355                 1
+ UP bnd       x356                 1
+ UP bnd       x357                 1
+ UP bnd       x358                 1
+ UP bnd       x359                 1
+ UP bnd       x360                 1
+ UP bnd       x361                 1
+ UP bnd       x362                 1
+ UP bnd       x363                 1
+ UP bnd       x364                 1
+ UP bnd       x365                 1
+ UP bnd       x366                 1
+ UP bnd       x367                 1
+ UP bnd       x368                 1
+ UP bnd       x369                 1
+ UP bnd       x370                 1
+ UP bnd       x371                 1
+ UP bnd       x372                 1
+ UP bnd       x373                 1
+ UP bnd       x374                 1
+ UP bnd       x375                 1
+ UP bnd       x376                 1
+ UP bnd       x377                 1
+ UP bnd       x378                 1
+ UP bnd       x379                 1
+ UP bnd       x380                 1
+ UP bnd       x381                 1
+ UP bnd       x382                 1
+ UP bnd       x383                 1
+ UP bnd       x384                 1
+ UP bnd       x385                 1
+ UP bnd       x386                 1
+ UP bnd       x387                 1
+ UP bnd       x388                 1
+ UP bnd       x389                 1
+ UP bnd       x390                 1
+ UP bnd       x391                 1
+ UP bnd       x392                 1
+ UP bnd       x393                 1
+ UP bnd       x394                 1
+ UP bnd       x395                 1
+ UP bnd       x396                 1
+ UP bnd       x397                 1
+ UP bnd       x398                 1
+ UP bnd       x399                 1
+ UP bnd       x400                 1
+ UP bnd       x401                 1
+ UP bnd       x402                 1
+ UP bnd       x403                 1
+ UP bnd       x404                 1
+ UP bnd       x405                 1
+ UP bnd       x406                 1
+ UP bnd       x407                 1
+ UP bnd       x408                 1
+ UP bnd       x409                 1
+ UP bnd       x410                 1
+ UP bnd       x411                 1
+ UP bnd       x412                 1
+ UP bnd       x413                 1
+ UP bnd       x414                 1
+ UP bnd       x415                 1
+ UP bnd       x416                 1
+ UP bnd       x417                 1
+ UP bnd       x418                 1
+ UP bnd       x419                 1
+ UP bnd       x420                 1
+ UP bnd       x421                 1
+ UP bnd       x422                 1
+ UP bnd       x423                 1
+ UP bnd       x424                 1
+ UP bnd       x425                 1
+ UP bnd       x426                 1
+ UP bnd       x427                 1
+ UP bnd       x428                 1
+ UP bnd       x429                 1
+ UP bnd       x430                 1
+ UP bnd       x431                 1
+ UP bnd       x432                 1
+ UP bnd       x433                 1
+ UP bnd       x434                 1
+ UP bnd       x435                 1
+ UP bnd       x436                 1
+ UP bnd       x437                 1
+ UP bnd       x438                 1
+ UP bnd       x439                 1
+ UP bnd       x440                 1
+ UP bnd       x441                 1
+ UP bnd       x442                 1
+ UP bnd       x443                 1
+ UP bnd       x444                 1
+ UP bnd       x445                 1
+ UP bnd       x446                 1
+ UP bnd       x447                 1
+ UP bnd       x448                 1
+ UP bnd       x449                 1
+ UP bnd       x450                 1
+ UP bnd       x451                 1
+ UP bnd       x452                 1
+ UP bnd       x453                 1
+ UP bnd       x454                 1
+ UP bnd       x455                 1
+ UP bnd       x456                 1
+ UP bnd       x457                 1
+ UP bnd       x458                 1
+ UP bnd       x459                 1
+ UP bnd       x460                 1
+ UP bnd       x461                 1
+ UP bnd       x462                 1
+ UP bnd       x463                 1
+ UP bnd       x464                 1
+ UP bnd       x465                 1
+ UP bnd       x466                 1
+ UP bnd       x467                 1
+ UP bnd       x468                 1
+ UP bnd       x469                 1
+ UP bnd       x470                 1
+ UP bnd       x471                 1
+ UP bnd       x472                 1
+ UP bnd       x473                 1
+ UP bnd       x474                 1
+ UP bnd       x475                 1
+ UP bnd       x476                 1
+ UP bnd       x477                 1
+ UP bnd       x478                 1
+ UP bnd       x479                 1
+ UP bnd       x480                 1
+ UP bnd       x481                 1
+ UP bnd       x482                 1
+ UP bnd       x483                 1
+ UP bnd       x484                 1
+ UP bnd       x485                 1
+ UP bnd       x486                 1
+ UP bnd       x487                 1
+ UP bnd       x488                 1
+ UP bnd       x489                 1
+ UP bnd       x490                 1
+ UP bnd       x491                 1
+ UP bnd       x492                 1
+ UP bnd       x493                 1
+ UP bnd       x494                 1
+ UP bnd       x495                 1
+ UP bnd       x496                 1
+ UP bnd       x497                 1
+ UP bnd       x498                 1
+ UP bnd       x499                 1
+ UP bnd       x500                 1
+ UP bnd       x501                 1
+ UP bnd       x502                 1
+ UP bnd       x503                 1
+ UP bnd       x504                 1
+ UP bnd       x505                 1
+ UP bnd       x506                 1
+ UP bnd       x507                 1
+ UP bnd       x508                 1
+ UP bnd       x509                 1
+ UP bnd       x510                 1
+ UP bnd       x511                 1
+ UP bnd       x512                 1
+ UP bnd       x513                 1
+ UP bnd       x514                 1
+ UP bnd       x515                 1
+ UP bnd       x516                 1
+ UP bnd       x517                 1
+ UP bnd       x518                 1
+ UP bnd       x519                 1
+ UP bnd       x520                 1
+ UP bnd       x521                 1
+ UP bnd       x522                 1
+ UP bnd       x523                 1
+ UP bnd       x524                 1
+ UP bnd       x525                 1
+ UP bnd       x526                 1
+ UP bnd       x527                 1
+ UP bnd       x528                 1
+ UP bnd       x529                 1
+ UP bnd       x530                 1
+ UP bnd       x531                 1
+ UP bnd       x532                 1
+ UP bnd       x533                 1
+ UP bnd       x534                 1
+ UP bnd       x535                 1
+ UP bnd       x536                 1
+ UP bnd       x537                 1
+ UP bnd       x538                 1
+ UP bnd       x539                 1
+ UP bnd       x540                 1
+ UP bnd       x541                 1
+ UP bnd       x542                 1
+ UP bnd       x543                 1
+ UP bnd       x544                 1
+ UP bnd       x545                 1
+ UP bnd       x546                 1
+ UP bnd       x547                 1
+ UP bnd       x548                 1
+ UP bnd       x549                 1
+ UP bnd       x550                 1
+ UP bnd       x551                 1
+ UP bnd       x552                 1
+ UP bnd       x553                 1
+ UP bnd       x554                 1
+ UP bnd       x555                 1
+ UP bnd       x556                 1
+ UP bnd       x557                 1
+ UP bnd       x558                 1
+ UP bnd       x559                 1
+ UP bnd       x560                 1
+ UP bnd       x561                 1
+ UP bnd       x562                 1
+ UP bnd       x563                 1
+ UP bnd       x564                 1
+ UP bnd       x565                 1
+ UP bnd       x566                 1
+ UP bnd       x567                 1
+ UP bnd       x568                 1
+ UP bnd       x569                 1
+ UP bnd       x570                 1
+ UP bnd       x571                 1
+ UP bnd       x572                 1
+ UP bnd       x573                 1
+ UP bnd       x574                 1
+ UP bnd       x575                 1
+ UP bnd       x576                 1
+ UP bnd       x577                 1
+ UP bnd       x578                 1
+ UP bnd       x579                 1
+ UP bnd       x580                 1
+ UP bnd       x581                 1
+ UP bnd       x582                 1
+ UP bnd       x583                 1
+ UP bnd       x584                 1
+ UP bnd       x585                 1
+ UP bnd       x586                 1
+ UP bnd       x587                 1
+ UP bnd       x588                 1
+ UP bnd       x589                 1
+ UP bnd       x590                 1
+ UP bnd       x591                 1
+ UP bnd       x592                 1
+ UP bnd       x593                 1
+ UP bnd       x594                 1
+ UP bnd       x595                 1
+ UP bnd       x596                 1
+ UP bnd       x597                 1
+ UP bnd       x598                 1
+ UP bnd       x599                 1
+ UP bnd       x600                 1
+ UP bnd       x601                 1
+ UP bnd       x602                 1
+ UP bnd       x603                 1
+ UP bnd       x604                 1
+ UP bnd       x605                 1
+ UP bnd       x606                 1
+ UP bnd       x607                 1
+ UP bnd       x608                 1
+ UP bnd       x609                 1
+ UP bnd       x610                 1
+ UP bnd       x611                 1
+ UP bnd       x612                 1
+ UP bnd       x613                 1
+ UP bnd       x614                 1
+ UP bnd       x615                 1
+ UP bnd       x616                 1
+ UP bnd       x617                 1
+ UP bnd       x618                 1
+ UP bnd       x619                 1
+ UP bnd       x620                 1
+ UP bnd       x621                 1
+ UP bnd       x622                 1
+ UP bnd       x623                 1
+ UP bnd       x624                 1
+ UP bnd       x625                 1
+ UP bnd       x626                 1
+ UP bnd       x627                 1
+ UP bnd       x628                 1
+ UP bnd       x629                 1
+ UP bnd       x630                 1
+ UP bnd       x631                 1
+ UP bnd       x632                 1
+ UP bnd       x633                 1
+ UP bnd       x634                 1
+ UP bnd       x635                 1
+ UP bnd       x636                 1
+ UP bnd       x637                 1
+ UP bnd       x638                 1
+ UP bnd       x639                 1
+ UP bnd       x640                 1
+ UP bnd       x641                 1
+ UP bnd       x642                 1
+ UP bnd       x643                 1
+ UP bnd       x644                 1
+ UP bnd       x645                 1
+ UP bnd       x646                 1
+ UP bnd       x647                 1
+ UP bnd       x648                 1
+ UP bnd       x649                 1
+ UP bnd       x650                 1
+ UP bnd       x651                 1
+ UP bnd       x652                 1
+ UP bnd       x653                 1
+ UP bnd       x654                 1
+ UP bnd       x655                 1
+ UP bnd       x656                 1
+ UP bnd       x657                 1
+ UP bnd       x658                 1
+ UP bnd       x659                 1
+ UP bnd       x660                 1
+ UP bnd       x661                 1
+ UP bnd       x662                 1
+ UP bnd       x663                 1
+ UP bnd       x664                 1
+ UP bnd       x665                 1
+ UP bnd       x666                 1
+ UP bnd       x667                 1
+ UP bnd       x668                 1
+ UP bnd       x669                 1
+ UP bnd       x670                 1
+ UP bnd       x671                 1
+ UP bnd       x672                 1
+ UP bnd       x673                 1
+ UP bnd       x674                 1
+ UP bnd       x675                 1
+ UP bnd       x676                 1
+ UP bnd       x677                 1
+ UP bnd       x678                 1
+ UP bnd       x679                 1
+ UP bnd       x680                 1
+ UP bnd       x681                 1
+ UP bnd       x682                 1
+ UP bnd       x683                 1
+ UP bnd       x684                 1
+ UP bnd       x685                 1
+ UP bnd       x686                 1
+ UP bnd       x687                 1
+ UP bnd       x688                 1
+ UP bnd       x689                 1
+ UP bnd       x690                 1
+ UP bnd       x691                 1
+ UP bnd       x692                 1
+ UP bnd       x693                 1
+ UP bnd       x694                 1
+ UP bnd       x695                 1
+ UP bnd       x696                 1
+ UP bnd       x697                 1
+ UP bnd       x698                 1
+ UP bnd       x699                 1
+ UP bnd       x700                 1
+ UP bnd       x701                 1
+ UP bnd       x702                 1
+ UP bnd       x703                 1
+ UP bnd       x704                 1
+ UP bnd       x705                 1
+ UP bnd       x706                 1
+ UP bnd       x707                 1
+ UP bnd       x708                 1
+ UP bnd       x709                 1
+ UP bnd       x710                 1
+ UP bnd       x711                 1
+ UP bnd       x712                 1
+ UP bnd       x713                 1
+ UP bnd       x714                 1
+ UP bnd       x715                 1
+ UP bnd       x716                 1
+ UP bnd       x717                 1
+ UP bnd       x718                 1
+ UP bnd       x719                 1
+ UP bnd       x720                 1
+ UP bnd       x721                 1
+ UP bnd       x722                 1
+ UP bnd       x723                 1
+ UP bnd       x724                 1
+ UP bnd       x725                 1
+ UP bnd       x726                 1
+ UP bnd       x727                 1
+ UP bnd       x728                 1
+ UP bnd       x729                 1
+ UP bnd       x730                 1
+ UP bnd       x731                 1
+ UP bnd       x732                 1
+ UP bnd       x733                 1
+ UP bnd       x734                 1
+ UP bnd       x735                 1
+ UP bnd       x736                 1
+ UP bnd       x737                 1
+ UP bnd       x738                 1
+ UP bnd       x739                 1
+ UP bnd       x740                 1
+ UP bnd       x741                 1
+ UP bnd       x742                 1
+ UP bnd       x743                 1
+ UP bnd       x744                 1
+ UP bnd       x745                 1
+ UP bnd       x746                 1
+ UP bnd       x747                 1
+ UP bnd       x748                 1
+ UP bnd       x749                 1
+ UP bnd       x750                 1
+ UP bnd       x751                 1
+ UP bnd       x752                 1
+ UP bnd       x753                 1
+ UP bnd       x754                 1
+ UP bnd       x755                 1
+ UP bnd       x756                 1
+ UP bnd       x757                 1
+ UP bnd       x758                 1
+ UP bnd       x759                 1
+ UP bnd       x760                 1
+ UP bnd       x761                 1
+ UP bnd       x762                 1
+ UP bnd       x763                 1
+ UP bnd       x764                 1
+ UP bnd       x765                 1
+ UP bnd       x766                 1
+ UP bnd       x767                 1
+ UP bnd       x768                 1
+ UP bnd       x769                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/p0033.mps b/demos/ppl_lpsol/examples/p0033.mps
new file mode 100644
index 0000000..7237e25
--- /dev/null
+++ b/demos/ppl_lpsol/examples/p0033.mps
@@ -0,0 +1,152 @@
+*NAME:         p0033
+*ROWS:         16
+*COLUMNS:      33
+*INTEGER:      33
+*NONZERO:      98
+*BEST SOLN:    3089 (opt)
+*LP SOLN:      2520.57
+*SOURCE:       Crowder-Johnson-Padberg test set
+*              
+*              E. Andrew Boyd (Rice University)
+*APPLICATION:  unknown
+*COMMENTS:     pure 0/1 IP
+*              5 SOS constraints 
+*              
+NAME          P0033  
+ROWS
+ N  R100    
+ L  R114    
+ L  R115    
+ L  R116    
+ L  R117    
+ L  R118    
+ L  R119    
+ L  R120    
+ L  R121    
+ L  R122    
+ L  R123    
+ L  R124    
+ L  R125    
+ L  R126    
+ L  R127    
+ L  R128    
+ L  ZBESTROW
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    C157      R100               171   R114                 1
+    C157      R122              -300   R123              -300
+    C158      R100               171   R114                 1
+    C158      R126              -300   R127              -300
+    C159      R100               171   R114                 1
+    C159      R119               300   R120              -300
+    C159      R123              -300
+    C160      R100               171   R114                 1
+    C160      R119               300   R120              -300
+    C160      R121              -300
+    C161      R100               163   R115                 1
+    C161      R119               285   R120              -285
+    C161      R124              -285   R125              -285
+    C162      R100               162   R115                 1
+    C162      R119               285   R120              -285
+    C162      R122              -285   R123              -285
+    C163      R100               163   R115                 1
+    C163      R128              -285
+    C164      R100                69   R116                 1
+    C164      R119               265   R120              -265
+    C164      R124              -265   R125              -265
+    C165      R100                69   R116                 1
+    C165      R119               265   R120              -265
+    C165      R122              -265   R123              -265
+    C166      R100               183   R117                 1
+    C166      R118              -230
+    C167      R100               183   R117                 1
+    C167      R124              -230   R125              -230
+    C168      R100               183   R117                 1
+    C168      R119               230   R120              -230
+    C168      R125              -230
+    C169      R100               183   R117                 1
+    C169      R119               230   R120              -230
+    C169      R123              -230
+    C170      R100                49   R119               190
+    C170      R120              -190   R122              -190
+    C170      R123              -190
+    C171      R100               183   R117                 1
+    C172      R100               258   R118              -200
+    C173      R100               517   R118              -400
+    C174      R100               250   R126              -200
+    C174      R127              -200
+    C175      R100               500   R126              -400
+    C175      R127              -400
+    C176      R100               250   R127              -200
+    C177      R100               500   R127              -400
+    C178      R100               159   R119               200
+    C178      R120              -200   R124              -200
+    C178      R125              -200
+    C179      R100               318   R119               400
+    C179      R120              -400   R124              -400
+    C179      R125              -400
+    C180      R100               159   R119               200
+    C180      R120              -200   R125              -200
+    C181      R100               318   R119               400
+    C181      R120              -400   R125              -400
+    C182      R100               159   R119               200
+    C182      R120              -200   R122              -200
+    C182      R123              -200
+    C183      R100               318   R119               400
+    C183      R120              -400   R122              -400
+    C183      R123              -400
+    C184      R100               159   R119               200
+    C184      R120              -200   R123              -200
+    C185      R100               318   R119               400
+    C185      R120              -400   R123              -400
+    C186      R100               114   R119               200
+    C186      R120              -200   R121              -200
+    C187      R100               228   R119               400
+    C187      R120              -400   R121              -400
+    C188      R100               159   R128              -200
+    C189      R100               318   R128              -400
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       R114                 1   R115                 1
+    RHS       R116                 1   R117                 1
+    RHS       R118                -5   R119              2700
+    RHS       R120             -2600   R121              -100
+    RHS       R122              -900   R123             -1656
+    RHS       R124              -335   R125             -1026
+    RHS       R126                -5   R127              -500
+    RHS       R128              -270
+BOUNDS
+ UP ONE       C157                 1
+ UP ONE       C158                 1
+ UP ONE       C159                 1
+ UP ONE       C160                 1
+ UP ONE       C161                 1
+ UP ONE       C162                 1
+ UP ONE       C163                 1
+ UP ONE       C164                 1
+ UP ONE       C165                 1
+ UP ONE       C166                 1
+ UP ONE       C167                 1
+ UP ONE       C168                 1
+ UP ONE       C169                 1
+ UP ONE       C170                 1
+ UP ONE       C171                 1
+ UP ONE       C172                 1
+ UP ONE       C173                 1
+ UP ONE       C174                 1
+ UP ONE       C175                 1
+ UP ONE       C176                 1
+ UP ONE       C177                 1
+ UP ONE       C178                 1
+ UP ONE       C179                 1
+ UP ONE       C180                 1
+ UP ONE       C181                 1
+ UP ONE       C182                 1
+ UP ONE       C183                 1
+ UP ONE       C184                 1
+ UP ONE       C185                 1
+ UP ONE       C186                 1
+ UP ONE       C187                 1
+ UP ONE       C188                 1
+ UP ONE       C189                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/pk1.mps b/demos/ppl_lpsol/examples/pk1.mps
new file mode 100644
index 0000000..283ea72
--- /dev/null
+++ b/demos/ppl_lpsol/examples/pk1.mps
@@ -0,0 +1,603 @@
+NAME           pk1
+ROWS
+ N  obj     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+ E  c7      
+ E  c8      
+ E  c9      
+ E  c10     
+ E  c11     
+ E  c12     
+ E  c13     
+ E  c14     
+ E  c15     
+ G  c16     
+ G  c17     
+ G  c18     
+ G  c19     
+ G  c20     
+ G  c21     
+ G  c22     
+ G  c23     
+ G  c24     
+ G  c25     
+ G  c26     
+ G  c27     
+ G  c28     
+ G  c29     
+ G  c30     
+ G  c31     
+ G  c32     
+ G  c33     
+ G  c34     
+ G  c35     
+ G  c36     
+ G  c37     
+ G  c38     
+ G  c39     
+ G  c40     
+ G  c41     
+ G  c42     
+ G  c43     
+ G  c44     
+ G  c45     
+COLUMNS
+    x1        obj                  1   c16                  1
+    x1        c17                  1   c18                  1
+    x1        c19                  1   c20                  1
+    x1        c21                  1   c22                  1
+    x1        c23                  1   c24                  1
+    x1        c25                  1   c26                  1
+    x1        c27                  1   c28                  1
+    x1        c29                  1   c30                  1
+    x1        c31                  1   c32                  1
+    x1        c33                  1   c34                  1
+    x1        c35                  1   c36                  1
+    x1        c37                  1   c38                  1
+    x1        c39                  1   c40                  1
+    x1        c41                  1   c42                  1
+    x1        c43                  1   c44                  1
+    x1        c45                  1
+    MARK0000  'MARKER'                 'INTORG'
+    x2        c1                  14   c2                  53
+    x2        c3                  48   c4                  33
+    x2        c5                  15   c6                  43
+    x2        c7                   8   c8                  38
+    x2        c9                  34   c10                 37
+    x2        c11                 25   c12                 42
+    x2        c13                 16   c14                 10
+    x2        c15                 28
+    x3        c1                  36   c2                  48
+    x3        c3                  34   c4                  34
+    x3        c5                   9   c6                  28
+    x3        c7                  30   c8                  42
+    x3        c9                  13   c10                 42
+    x3        c11                 47   c12                 33
+    x3        c13                  6   c14                 51
+    x3        c15                 47
+    x4        c1                  11   c2                  48
+    x4        c3                   8   c4                  36
+    x4        c5                  24   c6                  30
+    x4        c7                  18   c8                  24
+    x4        c9                  39   c10                 23
+    x4        c11                 25   c12                 45
+    x4        c13                 47   c14                 33
+    x4        c15                 16
+    x5        c1                  27   c2                  12
+    x5        c3                   5   c4                  34
+    x5        c5                  43   c6                  30
+    x5        c7                  16   c8                  46
+    x5        c9                  19   c10                 41
+    x5        c11                 29   c12                  6
+    x5        c13                 30   c14                 23
+    x5        c15                 32
+    x6        c1                  49   c2                  43
+    x6        c3                  49   c4                  19
+    x6        c5                  53   c6                  10
+    x6        c7                  18   c8                  20
+    x6        c9                  51   c10                 33
+    x6        c11                 44   c12                 33
+    x6        c13                 45   c14                 31
+    x6        c15                 28
+    x7        c1                  26   c2                  42
+    x7        c3                  21   c4                  19
+    x7        c5                  54   c6                  26
+    x7        c7                  21   c8                  11
+    x7        c9                  13   c10                 14
+    x7        c11                 22   c12                  6
+    x7        c13                 37   c14                 34
+    x7        c15                 16
+    x8        c1                  37   c2                  14
+    x8        c3                  38   c4                  30
+    x8        c5                  29   c6                  32
+    x8        c7                  24   c8                  32
+    x8        c9                  22   c10                 40
+    x8        c11                 10   c12                 24
+    x8        c13                 16   c14                 32
+    x8        c15                 32
+    x9        c1                  45   c2                  48
+    x9        c3                  11   c4                  48
+    x9        c5                  24   c6                  54
+    x9        c7                  46   c8                  52
+    x9        c9                  20   c10                 53
+    x9        c11                 21   c12                 54
+    x9        c13                 19   c14                 23
+    x9        c15                 15
+    x10       c1                  21   c2                  16
+    x10       c3                  26   c4                  32
+    x10       c5                  11   c6                  26
+    x10       c7                  47   c8                  24
+    x10       c9                  24   c10                 14
+    x10       c11                  5   c12                  9
+    x10       c13                  5   c14                 38
+    x10       c15                 11
+    x11       c1                   6   c2                  23
+    x11       c3                  12   c4                  30
+    x11       c5                  47   c6                  52
+    x11       c7                   6   c8                  31
+    x11       c9                  45   c10                 23
+    x11       c11                 10   c12                 12
+    x11       c13                 44   c14                 32
+    x11       c15                  8
+    x12       c1                  48   c2                  25
+    x12       c3                  30   c4                  26
+    x12       c5                  24   c6                  34
+    x12       c7                  48   c8                  45
+    x12       c9                  30   c10                 37
+    x12       c11                 35   c12                 48
+    x12       c13                 45   c14                 40
+    x12       c15                 21
+    x13       c1                  38   c2                  36
+    x13       c3                  18   c4                  39
+    x13       c5                  34   c6                  24
+    x13       c7                  27   c8                  50
+    x13       c9                  51   c10                  9
+    x13       c11                 17   c12                 51
+    x13       c13                 53   c14                 30
+    x13       c15                 33
+    x14       c1                  37   c2                  54
+    x14       c3                  23   c4                  47
+    x14       c5                  29   c6                  21
+    x14       c7                  10   c8                  47
+    x14       c9                  24   c10                 14
+    x14       c11                 20   c12                 16
+    x14       c13                 22   c14                 14
+    x14       c15                 15
+    x15       c1                  10   c2                  34
+    x15       c3                   8   c4                  37
+    x15       c5                  49   c6                  39
+    x15       c7                  26   c8                   6
+    x15       c9                  17   c10                 38
+    x15       c11                 33   c12                 48
+    x15       c13                 40   c14                 19
+    x15       c15                 54
+    x16       c1                  16   c2                  45
+    x16       c3                  55   c4                  52
+    x16       c5                  50   c6                  41
+    x16       c7                   6   c8                  15
+    x16       c9                  23   c10                 19
+    x16       c11                 27   c12                  8
+    x16       c13                 47   c14                 37
+    x16       c15                 22
+    x17       c1                  35   c2                  51
+    x17       c3                  46   c4                  33
+    x17       c5                  39   c6                  47
+    x17       c7                  36   c8                  53
+    x17       c9                  22   c10                 24
+    x17       c11                 39   c12                 21
+    x17       c13                 55   c14                 48
+    x17       c15                 55
+    x18       c1                  17   c2                  45
+    x18       c3                   5   c4                   5
+    x18       c5                  50   c6                  36
+    x18       c7                  52   c8                  20
+    x18       c9                  29   c10                 29
+    x18       c11                 50   c12                 54
+    x18       c13                 43   c14                 36
+    x18       c15                 13
+    x19       c1                   7   c2                  46
+    x19       c3                  10   c4                  39
+    x19       c5                  36   c6                  27
+    x19       c7                  14   c8                  24
+    x19       c9                  36   c10                 55
+    x19       c11                 17   c12                 46
+    x19       c13                 34   c14                 33
+    x19       c15                 47
+    x20       c1                  46   c2                  30
+    x20       c3                  50   c4                  34
+    x20       c5                  32   c6                  52
+    x20       c7                  29   c8                  31
+    x20       c9                  14   c10                 29
+    x20       c11                 11   c12                 39
+    x20       c13                 33   c14                 27
+    x20       c15                 19
+    x21       c1                  26   c2                  38
+    x21       c3                  52   c4                  42
+    x21       c5                  42   c6                   7
+    x21       c7                  43   c8                  40
+    x21       c9                  33   c10                 40
+    x21       c11                 25   c12                 23
+    x21       c13                  6   c14                 20
+    x21       c15                 33
+    x22       c1                   8   c2                  52
+    x22       c3                  45   c4                  30
+    x22       c5                  55   c6                   6
+    x22       c7                   7   c8                  54
+    x22       c9                  51   c10                 52
+    x22       c11                 42   c12                 11
+    x22       c13                 13   c14                 14
+    x22       c15                 35
+    x23       c1                  40   c2                  21
+    x23       c3                  42   c4                  33
+    x23       c5                  21   c6                  52
+    x23       c7                   8   c8                  10
+    x23       c9                  17   c10                 54
+    x23       c11                 50   c12                 28
+    x23       c13                 15   c14                 50
+    x23       c15                 15
+    x24       c1                  19   c2                   9
+    x24       c3                  43   c4                  19
+    x24       c5                  11   c6                  13
+    x24       c7                  26   c8                  40
+    x24       c9                  35   c10                 16
+    x24       c11                 19   c12                 27
+    x24       c13                 36   c14                 54
+    x24       c15                 44
+    x25       c1                  33   c2                  21
+    x25       c3                  19   c4                  21
+    x25       c5                  24   c6                  30
+    x25       c7                  31   c8                  30
+    x25       c9                  31   c10                 23
+    x25       c11                 40   c12                 21
+    x25       c13                 41   c14                 34
+    x25       c15                 55
+    x26       c1                   5   c2                  15
+    x26       c3                  25   c4                  38
+    x26       c5                  45   c6                  32
+    x26       c7                  10   c8                  50
+    x26       c9                  39   c10                  8
+    x26       c11                 37   c12                 30
+    x26       c13                 39   c14                 50
+    x26       c15                 39
+    x27       c1                  42   c2                  22
+    x27       c3                   8   c4                  40
+    x27       c5                  10   c6                  46
+    x27       c7                   6   c8                  14
+    x27       c9                  12   c10                 53
+    x27       c11                 38   c12                 38
+    x27       c13                 50   c14                 14
+    x27       c15                 28
+    x28       c1                  22   c2                  12
+    x28       c3                  27   c4                   9
+    x28       c5                  30   c6                  41
+    x28       c7                   7   c8                  44
+    x28       c9                  47   c10                 23
+    x28       c11                 22   c12                 52
+    x28       c13                 38   c14                 54
+    x28       c15                 39
+    x29       c1                  14   c2                  12
+    x29       c3                   5   c4                  33
+    x29       c5                  42   c6                  12
+    x29       c7                  12   c8                  41
+    x29       c9                   9   c10                  9
+    x29       c11                 20   c12                 18
+    x29       c13                 18   c14                  9
+    x29       c15                 23
+    x30       c1                  51   c2                  19
+    x30       c3                  41   c4                  48
+    x30       c5                  38   c6                  44
+    x30       c7                  33   c8                  42
+    x30       c9                  46   c10                 52
+    x30       c11                  5   c12                 43
+    x30       c13                 36   c14                 37
+    x30       c15                  6
+    x31       c1                  49   c2                  17
+    x31       c3                  39   c4                  35
+    x31       c5                  51   c6                   7
+    x31       c7                  42   c8                  29
+    x31       c9                  46   c10                 52
+    x31       c11                 16   c12                 46
+    x31       c13                  6   c14                 55
+    x31       c15                 20
+    x32       c1                   7   c2                  38
+    x32       c3                  52   c4                  42
+    x32       c5                   6   c6                  12
+    x32       c7                  41   c8                   8
+    x32       c9                  55   c10                 37
+    x32       c11                 22   c12                 42
+    x32       c13                 13   c14                 55
+    x32       c15                 36
+    x33       c1                  10   c2                  17
+    x33       c3                  33   c4                  26
+    x33       c5                  48   c6                  32
+    x33       c7                  37   c8                  24
+    x33       c9                  25   c10                 33
+    x33       c11                 25   c12                 29
+    x33       c13                 47   c14                 42
+    x33       c15                 29
+    x34       c1                  30   c2                   9
+    x34       c3                  17   c4                  13
+    x34       c5                   5   c6                  30
+    x34       c7                  17   c8                  16
+    x34       c9                  55   c10                 39
+    x34       c11                  8   c12                 23
+    x34       c13                  8   c14                 51
+    x34       c15                 12
+    x35       c1                  14   c2                  30
+    x35       c3                   5   c4                  23
+    x35       c5                  25   c6                  38
+    x35       c7                  55   c8                  27
+    x35       c9                  38   c10                 55
+    x35       c11                 43   c12                 32
+    x35       c13                  5   c14                 32
+    x35       c15                 48
+    x36       c1                  32   c2                  24
+    x36       c3                  34   c4                  55
+    x36       c5                  36   c6                   6
+    x36       c7                  48   c8                  15
+    x36       c9                  39   c10                 18
+    x36       c11                 50   c12                 31
+    x36       c13                 22   c14                 10
+    x36       c15                  6
+    x37       c1                  24   c2                  48
+    x37       c3                  11   c4                  27
+    x37       c5                  53   c6                  36
+    x37       c7                  31   c8                  31
+    x37       c9                  51   c10                 17
+    x37       c11                 47   c12                 52
+    x37       c13                 48   c14                 26
+    x37       c15                 35
+    x38       c1                  36   c2                  16
+    x38       c3                  21   c4                  37
+    x38       c5                  24   c6                   8
+    x38       c7                  20   c8                  34
+    x38       c9                  46   c10                 14
+    x38       c11                  9   c12                 33
+    x38       c13                 37   c14                 11
+    x38       c15                  8
+    x39       c1                  14   c2                  34
+    x39       c3                  16   c4                  30
+    x39       c5                  10   c6                  34
+    x39       c7                  17   c8                  42
+    x39       c9                   6   c10                 54
+    x39       c11                  5   c12                 51
+    x39       c13                 34   c14                 38
+    x39       c15                 33
+    x40       c1                  13   c2                  41
+    x40       c3                  17   c4                  20
+    x40       c5                  22   c6                  34
+    x40       c7                  21   c8                  28
+    x40       c9                  15   c10                 14
+    x40       c11                 12   c12                 50
+    x40       c13                 11   c14                 45
+    x40       c15                 46
+    x41       c1                  52   c2                  28
+    x41       c3                  42   c4                  14
+    x41       c5                  31   c6                  30
+    x41       c7                  11   c8                  53
+    x41       c9                  15   c10                 24
+    x41       c11                 10   c12                 38
+    x41       c13                 38   c14                 44
+    x41       c15                 15
+    x42       c1                  16   c2                  52
+    x42       c3                  23   c4                   5
+    x42       c5                  53   c6                  31
+    x42       c7                  19   c8                  17
+    x42       c9                  47   c10                 21
+    x42       c11                 10   c12                  7
+    x42       c13                 22   c14                 14
+    x42       c15                 37
+    x43       c1                   5   c2                  10
+    x43       c3                  43   c4                  42
+    x43       c5                  41   c6                  13
+    x43       c7                  13   c8                  18
+    x43       c9                  40   c10                 46
+    x43       c11                 42   c12                 42
+    x43       c13                 52   c14                 30
+    x43       c15                 11
+    x44       c1                  35   c2                   8
+    x44       c3                   5   c4                  49
+    x44       c5                  10   c6                  49
+    x44       c7                  34   c8                  48
+    x44       c9                  10   c10                 28
+    x44       c11                 22   c12                 34
+    x44       c13                 35   c14                 19
+    x44       c15                 44
+    x45       c1                  48   c2                  51
+    x45       c3                  42   c4                  47
+    x45       c5                  26   c6                  47
+    x45       c7                  24   c8                   8
+    x45       c9                  15   c10                 30
+    x45       c11                 25   c12                 18
+    x45       c13                 39   c14                 24
+    x45       c15                 48
+    x46       c1                  11   c2                  40
+    x46       c3                  47   c4                  24
+    x46       c5                  35   c6                  48
+    x46       c7                  35   c8                  19
+    x46       c9                  52   c10                 29
+    x46       c11                 20   c12                 35
+    x46       c13                 37   c14                 44
+    x46       c15                  9
+    x47       c1                  47   c2                  48
+    x47       c3                  55   c4                  45
+    x47       c5                  55   c6                  35
+    x47       c7                  35   c8                   7
+    x47       c9                  29   c10                 43
+    x47       c11                 45   c12                 37
+    x47       c13                 27   c14                 52
+    x47       c15                 11
+    x48       c1                  27   c2                  46
+    x48       c3                  32   c4                  25
+    x48       c5                  10   c6                  39
+    x48       c7                  55   c8                   6
+    x48       c9                  32   c10                 50
+    x48       c11                  9   c12                 35
+    x48       c13                 38   c14                 16
+    x48       c15                 47
+    x49       c1                  24   c2                  30
+    x49       c3                  47   c4                  24
+    x49       c5                  29   c6                  29
+    x49       c7                  31   c8                  35
+    x49       c9                  26   c10                 53
+    x49       c11                 15   c12                 33
+    x49       c13                 24   c14                 24
+    x49       c15                 18
+    x50       c1                  49   c2                  38
+    x50       c3                   9   c4                  28
+    x50       c5                  36   c6                   6
+    x50       c7                  44   c8                  27
+    x50       c9                  10   c10                 43
+    x50       c11                  7   c12                 28
+    x50       c13                  5   c14                 29
+    x50       c15                 54
+    x51       c1                  17   c2                  21
+    x51       c3                  26   c4                  54
+    x51       c5                  37   c6                  35
+    x51       c7                  29   c8                  33
+    x51       c9                  42   c10                 24
+    x51       c11                 15   c12                 18
+    x51       c13                 16   c14                 39
+    x51       c15                 10
+    x52       c1                  46   c2                  12
+    x52       c3                  43   c4                  11
+    x52       c5                  15   c6                  32
+    x52       c7                  19   c8                  20
+    x52       c9                  55   c10                 38
+    x52       c11                 35   c12                 52
+    x52       c13                 25   c14                 39
+    x52       c15                 46
+    x53       c1                  53   c2                  35
+    x53       c3                  50   c4                  53
+    x53       c5                  36   c6                   7
+    x53       c7                  46   c8                  25
+    x53       c9                   6   c10                 39
+    x53       c11                 44   c12                 34
+    x53       c13                 14   c14                 39
+    x53       c15                 34
+    x54       c1                  53   c2                  38
+    x54       c3                  13   c4                  32
+    x54       c5                  54   c6                  32
+    x54       c7                  33   c8                  39
+    x54       c9                  54   c10                 22
+    x54       c11                  9   c12                 42
+    x54       c13                 27   c14                 33
+    x54       c15                 20
+    x55       c1                  10   c2                  17
+    x55       c3                  30   c4                  25
+    x55       c5                  22   c6                  40
+    x55       c7                  41   c8                  55
+    x55       c9                  34   c10                 49
+    x55       c11                 50   c12                 24
+    x55       c13                  6   c14                 37
+    x55       c15                 35
+    x56       c1                  30   c2                  52
+    x56       c3                  14   c4                  19
+    x56       c5                  55   c6                  33
+    x56       c7                  22   c8                  51
+    x56       c9                  32   c10                  7
+    x56       c11                 28   c12                 51
+    x56       c13                 51   c14                 17
+    x56       c15                 33
+    MARK0001  'MARKER'                 'INTEND'
+    x57       c1                   1   c16                 -1
+    x58       c1                  -1   c17                 -1
+    x59       c2                   1   c18                 -1
+    x60       c2                  -1   c19                 -1
+    x61       c3                   1   c20                 -1
+    x62       c3                  -1   c21                 -1
+    x63       c4                   1   c22                 -1
+    x64       c4                  -1   c23                 -1
+    x65       c5                   1   c24                 -1
+    x66       c5                  -1   c25                 -1
+    x67       c6                   1   c26                 -1
+    x68       c6                  -1   c27                 -1
+    x69       c7                   1   c28                 -1
+    x70       c7                  -1   c29                 -1
+    x71       c8                   1   c30                 -1
+    x72       c8                  -1   c31                 -1
+    x73       c9                   1   c32                 -1
+    x74       c9                  -1   c33                 -1
+    x75       c10                  1   c34                 -1
+    x76       c10                 -1   c35                 -1
+    x77       c11                  1   c36                 -1
+    x78       c11                 -1   c37                 -1
+    x79       c12                  1   c38                 -1
+    x80       c12                 -1   c39                 -1
+    x81       c13                  1   c40                 -1
+    x82       c13                 -1   c41                 -1
+    x83       c14                  1   c42                 -1
+    x84       c14                 -1   c43                 -1
+    x85       c15                  1   c44                 -1
+    x86       c15                 -1   c45                 -1
+RHS
+    rhs       c1                 731   c2                 731
+    rhs       c3                 731   c4                 731
+    rhs       c5                 731   c6                 731
+    rhs       c7                 731   c8                 731
+    rhs       c9                 731   c10                731
+    rhs       c11                731   c12                731
+    rhs       c13                731   c14                731
+    rhs       c15                731
+BOUNDS
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/rout.mps b/demos/ppl_lpsol/examples/rout.mps
new file mode 100644
index 0000000..cf0541a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/rout.mps
@@ -0,0 +1,2038 @@
+NAME           rout
+ROWS
+ N  R0000292
+ E  c1      
+ L  c2      
+ L  c3      
+ L  c4      
+ L  c5      
+ L  c6      
+ L  c7      
+ L  c8      
+ L  c9      
+ L  c10     
+ L  c11     
+ L  c12     
+ L  c13     
+ L  c14     
+ L  c15     
+ L  c16     
+ L  c17     
+ L  c18     
+ L  c19     
+ L  c20     
+ L  c21     
+ E  c22     
+ E  c23     
+ E  c24     
+ E  c25     
+ E  c26     
+ E  c27     
+ E  c28     
+ E  c29     
+ E  c30     
+ E  c31     
+ E  c32     
+ E  c33     
+ E  c34     
+ E  c35     
+ E  c36     
+ E  c37     
+ E  c38     
+ E  c39     
+ E  c40     
+ E  c41     
+ E  c42     
+ E  c43     
+ E  c44     
+ E  c45     
+ E  c46     
+ E  c47     
+ E  c48     
+ E  c49     
+ E  c50     
+ E  c51     
+ L  c52     
+ L  c53     
+ L  c54     
+ L  c55     
+ L  c56     
+ L  c57     
+ L  c58     
+ L  c59     
+ L  c60     
+ L  c61     
+ L  c62     
+ L  c63     
+ L  c64     
+ L  c65     
+ L  c66     
+ L  c67     
+ L  c68     
+ L  c69     
+ L  c70     
+ L  c71     
+ L  c72     
+ L  c73     
+ L  c74     
+ L  c75     
+ L  c76     
+ L  c77     
+ L  c78     
+ L  c79     
+ L  c80     
+ L  c81     
+ L  c82     
+ L  c83     
+ L  c84     
+ L  c85     
+ L  c86     
+ L  c87     
+ L  c88     
+ L  c89     
+ L  c90     
+ L  c91     
+ L  c92     
+ L  c93     
+ L  c94     
+ L  c95     
+ L  c96     
+ L  c97     
+ L  c98     
+ L  c99     
+ L  c100    
+ L  c101    
+ L  c102    
+ L  c103    
+ L  c104    
+ L  c105    
+ L  c106    
+ L  c107    
+ L  c108    
+ L  c109    
+ L  c110    
+ L  c111    
+ L  c112    
+ L  c113    
+ L  c114    
+ L  c115    
+ L  c116    
+ L  c117    
+ L  c118    
+ L  c119    
+ L  c120    
+ L  c121    
+ L  c122    
+ L  c123    
+ L  c124    
+ L  c125    
+ L  c126    
+ L  c127    
+ L  c128    
+ L  c129    
+ L  c130    
+ L  c131    
+ L  c132    
+ L  c133    
+ L  c134    
+ L  c135    
+ L  c136    
+ L  c137    
+ L  c138    
+ L  c139    
+ L  c140    
+ L  c141    
+ L  c142    
+ L  c143    
+ L  c144    
+ L  c145    
+ L  c146    
+ L  c147    
+ L  c148    
+ L  c149    
+ L  c150    
+ L  c151    
+ L  c152    
+ L  c153    
+ L  c154    
+ L  c155    
+ L  c156    
+ L  c157    
+ L  c158    
+ L  c159    
+ L  c160    
+ L  c161    
+ L  c162    
+ L  c163    
+ L  c164    
+ L  c165    
+ L  c166    
+ L  c167    
+ L  c168    
+ L  c169    
+ L  c170    
+ L  c171    
+ L  c172    
+ L  c173    
+ L  c174    
+ L  c175    
+ L  c176    
+ L  c177    
+ L  c178    
+ L  c179    
+ L  c180    
+ L  c181    
+ L  c182    
+ L  c183    
+ L  c184    
+ L  c185    
+ L  c186    
+ L  c187    
+ L  c188    
+ L  c189    
+ L  c190    
+ L  c191    
+ L  c192    
+ L  c193    
+ L  c194    
+ L  c195    
+ L  c196    
+ L  c197    
+ L  c198    
+ L  c199    
+ L  c200    
+ L  c201    
+ L  c202    
+ L  c203    
+ L  c204    
+ L  c205    
+ L  c206    
+ L  c207    
+ L  c208    
+ L  c209    
+ L  c210    
+ L  c211    
+ L  c212    
+ L  c213    
+ L  c214    
+ L  c215    
+ L  c216    
+ L  c217    
+ L  c218    
+ L  c219    
+ L  c220    
+ L  c221    
+ L  c222    
+ L  c223    
+ L  c224    
+ L  c225    
+ L  c226    
+ L  c227    
+ L  c228    
+ L  c229    
+ L  c230    
+ L  c231    
+ L  c232    
+ L  c233    
+ L  c234    
+ L  c235    
+ L  c236    
+ L  c237    
+ L  c238    
+ L  c239    
+ L  c240    
+ L  c241    
+ L  c242    
+ L  c243    
+ L  c244    
+ L  c245    
+ L  c246    
+ L  c247    
+ L  c248    
+ L  c249    
+ L  c250    
+ L  c251    
+ L  c252    
+ L  c253    
+ L  c254    
+ L  c255    
+ L  c256    
+ L  c257    
+ L  c258    
+ L  c259    
+ L  c260    
+ L  c261    
+ L  c262    
+ L  c263    
+ L  c264    
+ L  c265    
+ L  c266    
+ L  c267    
+ L  c268    
+ L  c269    
+ L  c270    
+ L  c271    
+ L  c272    
+ L  c273    
+ L  c274    
+ L  c275    
+ L  c276    
+ L  c277    
+ L  c278    
+ L  c279    
+ L  c280    
+ L  c281    
+ L  c282    
+ L  c283    
+ L  c284    
+ L  c285    
+ L  c286    
+ L  c287    
+ L  c288    
+ L  c289    
+ L  c290    
+ L  c291    
+COLUMNS
+    x1        c37                 -1   c52                  1
+    x2        c38                 -1   c53                  1
+    x3        c39                 -1   c54                  1
+    x4        c40                 -1   c55                  1
+    x5        c41                 -1   c56                  1
+    x6        c42                 -1   c57                  1
+    x7        c43                 -1   c58                  1
+    x8        c44                 -1   c59                  1
+    x9        c45                 -1   c60                  1
+    x10       c46                 -1   c61                  1
+    x11       c47                 -1   c62                  1
+    x12       c48                 -1   c63                  1
+    x13       c49                 -1   c64                  1
+    x14       c50                 -1   c65                  1
+    x15       c51                 -1   c66                  1
+    x16       c47                  1   c67                  1
+    x17       c48                  1   c68                  1
+    x18       c49                  1   c69                  1
+    x19       c50                  1   c70                  1
+    x20       c51                  1   c71                  1
+    x21       c37                 -1   c47                  1
+    x21       c72                  1
+    x22       c38                 -1   c48                  1
+    x22       c73                  1
+    x23       c39                 -1   c49                  1
+    x23       c74                  1
+    x24       c40                 -1   c50                  1
+    x24       c75                  1
+    x25       c41                 -1   c51                  1
+    x25       c76                  1
+    x26       c42                 -1   c47                  1
+    x26       c77                  1
+    x27       c43                 -1   c48                  1
+    x27       c78                  1
+    x28       c44                 -1   c49                  1
+    x28       c79                  1
+    x29       c45                 -1   c50                  1
+    x29       c80                  1
+    x30       c46                 -1   c51                  1
+    x30       c81                  1
+    x31       c42                  1   c82                  1
+    x32       c43                  1   c83                  1
+    x33       c44                  1   c84                  1
+    x34       c45                  1   c85                  1
+    x35       c46                  1   c86                  1
+    x36       c37                 -1   c42                  1
+    x36       c87                  1
+    x37       c38                 -1   c43                  1
+    x37       c88                  1
+    x38       c39                 -1   c44                  1
+    x38       c89                  1
+    x39       c40                 -1   c45                  1
+    x39       c90                  1
+    x40       c41                 -1   c46                  1
+    x40       c91                  1
+    x41       c42                  1   c47                 -1
+    x41       c92                  1
+    x42       c43                  1   c48                 -1
+    x42       c93                  1
+    x43       c44                  1   c49                 -1
+    x43       c94                  1
+    x44       c45                  1   c50                 -1
+    x44       c95                  1
+    x45       c46                  1   c51                 -1
+    x45       c96                  1
+    x46       c37                  1   c97                  1
+    x47       c38                  1   c98                  1
+    x48       c39                  1   c99                  1
+    x49       c40                  1   c100                 1
+    x50       c41                  1   c101                 1
+    x51       c37                  1   c42                 -1
+    x51       c102                 1
+    x52       c38                  1   c43                 -1
+    x52       c103                 1
+    x53       c39                  1   c44                 -1
+    x53       c104                 1
+    x54       c40                  1   c45                 -1
+    x54       c105                 1
+    x55       c41                  1   c46                 -1
+    x55       c106                 1
+    x56       c37                  1   c47                 -1
+    x56       c107                 1
+    x57       c38                  1   c48                 -1
+    x57       c108                 1
+    x58       c39                  1   c49                 -1
+    x58       c109                 1
+    x59       c40                  1   c50                 -1
+    x59       c110                 1
+    x60       c41                  1   c51                 -1
+    x60       c111                 1
+    x61       c47                  1   c112                 1
+    x62       c48                  1   c113                 1
+    x63       c49                  1   c114                 1
+    x64       c50                  1   c115                 1
+    x65       c51                  1   c116                 1
+    x66       c37                 -1   c47                  1
+    x66       c117                 1
+    x67       c38                 -1   c48                  1
+    x67       c118                 1
+    x68       c39                 -1   c49                  1
+    x68       c119                 1
+    x69       c40                 -1   c50                  1
+    x69       c120                 1
+    x70       c41                 -1   c51                  1
+    x70       c121                 1
+    x71       c42                 -1   c47                  1
+    x71       c122                 1
+    x72       c43                 -1   c48                  1
+    x72       c123                 1
+    x73       c44                 -1   c49                  1
+    x73       c124                 1
+    x74       c45                 -1   c50                  1
+    x74       c125                 1
+    x75       c46                 -1   c51                  1
+    x75       c126                 1
+    x76       c47                  1   c127                 1
+    x77       c48                  1   c128                 1
+    x78       c49                  1   c129                 1
+    x79       c50                  1   c130                 1
+    x80       c51                  1   c131                 1
+    x81       c37                 -1   c47                  1
+    x81       c132                 1
+    x82       c38                 -1   c48                  1
+    x82       c133                 1
+    x83       c39                 -1   c49                  1
+    x83       c134                 1
+    x84       c40                 -1   c50                  1
+    x84       c135                 1
+    x85       c41                 -1   c51                  1
+    x85       c136                 1
+    x86       c42                 -1   c47                  1
+    x86       c137                 1
+    x87       c43                 -1   c48                  1
+    x87       c138                 1
+    x88       c44                 -1   c49                  1
+    x88       c139                 1
+    x89       c45                 -1   c50                  1
+    x89       c140                 1
+    x90       c46                 -1   c51                  1
+    x90       c141                 1
+    x91       c47                  1   c142                 1
+    x92       c48                  1   c143                 1
+    x93       c49                  1   c144                 1
+    x94       c50                  1   c145                 1
+    x95       c51                  1   c146                 1
+    x96       c37                 -1   c47                  1
+    x96       c147                 1
+    x97       c38                 -1   c48                  1
+    x97       c148                 1
+    x98       c39                 -1   c49                  1
+    x98       c149                 1
+    x99       c40                 -1   c50                  1
+    x99       c150                 1
+    x100      c41                 -1   c51                  1
+    x100      c151                 1
+    x101      c42                 -1   c47                  1
+    x101      c152                 1
+    x102      c43                 -1   c48                  1
+    x102      c153                 1
+    x103      c44                 -1   c49                  1
+    x103      c154                 1
+    x104      c45                 -1   c50                  1
+    x104      c155                 1
+    x105      c46                 -1   c51                  1
+    x105      c156                 1
+    x106      c42                  1   c157                 1
+    x107      c43                  1   c158                 1
+    x108      c44                  1   c159                 1
+    x109      c45                  1   c160                 1
+    x110      c46                  1   c161                 1
+    x111      c37                 -1   c42                  1
+    x111      c162                 1
+    x112      c38                 -1   c43                  1
+    x112      c163                 1
+    x113      c39                 -1   c44                  1
+    x113      c164                 1
+    x114      c40                 -1   c45                  1
+    x114      c165                 1
+    x115      c41                 -1   c46                  1
+    x115      c166                 1
+    x116      c42                  1   c47                 -1
+    x116      c167                 1
+    x117      c43                  1   c48                 -1
+    x117      c168                 1
+    x118      c44                  1   c49                 -1
+    x118      c169                 1
+    x119      c45                  1   c50                 -1
+    x119      c170                 1
+    x120      c46                  1   c51                 -1
+    x120      c171                 1
+    x121      c42                  1   c172                 1
+    x122      c43                  1   c173                 1
+    x123      c44                  1   c174                 1
+    x124      c45                  1   c175                 1
+    x125      c46                  1   c176                 1
+    x126      c37                 -1   c42                  1
+    x126      c177                 1
+    x127      c38                 -1   c43                  1
+    x127      c178                 1
+    x128      c39                 -1   c44                  1
+    x128      c179                 1
+    x129      c40                 -1   c45                  1
+    x129      c180                 1
+    x130      c41                 -1   c46                  1
+    x130      c181                 1
+    x131      c42                  1   c47                 -1
+    x131      c182                 1
+    x132      c43                  1   c48                 -1
+    x132      c183                 1
+    x133      c44                  1   c49                 -1
+    x133      c184                 1
+    x134      c45                  1   c50                 -1
+    x134      c185                 1
+    x135      c46                  1   c51                 -1
+    x135      c186                 1
+    x136      c37                  1   c187                 1
+    x137      c38                  1   c188                 1
+    x138      c39                  1   c189                 1
+    x139      c40                  1   c190                 1
+    x140      c41                  1   c191                 1
+    x141      c37                  1   c42                 -1
+    x141      c192                 1
+    x142      c38                  1   c43                 -1
+    x142      c193                 1
+    x143      c39                  1   c44                 -1
+    x143      c194                 1
+    x144      c40                  1   c45                 -1
+    x144      c195                 1
+    x145      c41                  1   c46                 -1
+    x145      c196                 1
+    x146      c37                  1   c47                 -1
+    x146      c197                 1
+    x147      c38                  1   c48                 -1
+    x147      c198                 1
+    x148      c39                  1   c49                 -1
+    x148      c199                 1
+    x149      c40                  1   c50                 -1
+    x149      c200                 1
+    x150      c41                  1   c51                 -1
+    x150      c201                 1
+    x151      c37                  1   c202                 1
+    x152      c38                  1   c203                 1
+    x153      c39                  1   c204                 1
+    x154      c40                  1   c205                 1
+    x155      c41                  1   c206                 1
+    x156      c37                  1   c42                 -1
+    x156      c207                 1
+    x157      c38                  1   c43                 -1
+    x157      c208                 1
+    x158      c39                  1   c44                 -1
+    x158      c209                 1
+    x159      c40                  1   c45                 -1
+    x159      c210                 1
+    x160      c41                  1   c46                 -1
+    x160      c211                 1
+    x161      c37                  1   c47                 -1
+    x161      c212                 1
+    x162      c38                  1   c48                 -1
+    x162      c213                 1
+    x163      c39                  1   c49                 -1
+    x163      c214                 1
+    x164      c40                  1   c50                 -1
+    x164      c215                 1
+    x165      c41                  1   c51                 -1
+    x165      c216                 1
+    x166      c37                  1   c217                 1
+    x167      c38                  1   c218                 1
+    x168      c39                  1   c219                 1
+    x169      c40                  1   c220                 1
+    x170      c41                  1   c221                 1
+    x171      c37                  1   c42                 -1
+    x171      c222                 1
+    x172      c38                  1   c43                 -1
+    x172      c223                 1
+    x173      c39                  1   c44                 -1
+    x173      c224                 1
+    x174      c40                  1   c45                 -1
+    x174      c225                 1
+    x175      c41                  1   c46                 -1
+    x175      c226                 1
+    x176      c37                  1   c47                 -1
+    x176      c227                 1
+    x177      c38                  1   c48                 -1
+    x177      c228                 1
+    x178      c39                  1   c49                 -1
+    x178      c229                 1
+    x179      c40                  1   c50                 -1
+    x179      c230                 1
+    x180      c41                  1   c51                 -1
+    x180      c231                 1
+    x181      c47                  1   c232                 1
+    x182      c48                  1   c233                 1
+    x183      c49                  1   c234                 1
+    x184      c50                  1   c235                 1
+    x185      c51                  1   c236                 1
+    x186      c37                 -1   c47                  1
+    x186      c237                 1
+    x187      c38                 -1   c48                  1
+    x187      c238                 1
+    x188      c39                 -1   c49                  1
+    x188      c239                 1
+    x189      c40                 -1   c50                  1
+    x189      c240                 1
+    x190      c41                 -1   c51                  1
+    x190      c241                 1
+    x191      c42                 -1   c47                  1
+    x191      c242                 1
+    x192      c43                 -1   c48                  1
+    x192      c243                 1
+    x193      c44                 -1   c49                  1
+    x193      c244                 1
+    x194      c45                 -1   c50                  1
+    x194      c245                 1
+    x195      c46                 -1   c51                  1
+    x195      c246                 1
+    x196      c37                  1   c247                 1
+    x197      c38                  1   c248                 1
+    x198      c39                  1   c249                 1
+    x199      c40                  1   c250                 1
+    x200      c41                  1   c251                 1
+    x201      c37                  1   c42                 -1
+    x201      c252                 1
+    x202      c38                  1   c43                 -1
+    x202      c253                 1
+    x203      c39                  1   c44                 -1
+    x203      c254                 1
+    x204      c40                  1   c45                 -1
+    x204      c255                 1
+    x205      c41                  1   c46                 -1
+    x205      c256                 1
+    x206      c37                  1   c47                 -1
+    x206      c257                 1
+    x207      c38                  1   c48                 -1
+    x207      c258                 1
+    x208      c39                  1   c49                 -1
+    x208      c259                 1
+    x209      c40                  1   c50                 -1
+    x209      c260                 1
+    x210      c41                  1   c51                 -1
+    x210      c261                 1
+    x211      c47                  1   c262                 1
+    x212      c48                  1   c263                 1
+    x213      c49                  1   c264                 1
+    x214      c50                  1   c265                 1
+    x215      c51                  1   c266                 1
+    x216      c37                 -1   c47                  1
+    x216      c267                 1
+    x217      c38                 -1   c48                  1
+    x217      c268                 1
+    x218      c39                 -1   c49                  1
+    x218      c269                 1
+    x219      c40                 -1   c50                  1
+    x219      c270                 1
+    x220      c41                 -1   c51                  1
+    x220      c271                 1
+    x221      c42                 -1   c47                  1
+    x221      c272                 1
+    x222      c43                 -1   c48                  1
+    x222      c273                 1
+    x223      c44                 -1   c49                  1
+    x223      c274                 1
+    x224      c45                 -1   c50                  1
+    x224      c275                 1
+    x225      c46                 -1   c51                  1
+    x225      c276                 1
+    x226      c47                  1   c277                 1
+    x227      c48                  1   c278                 1
+    x228      c49                  1   c279                 1
+    x229      c50                  1   c280                 1
+    x230      c51                  1   c281                 1
+    x231      c37                 -1   c47                  1
+    x231      c282                 1
+    x232      c38                 -1   c48                  1
+    x232      c283                 1
+    x233      c39                 -1   c49                  1
+    x233      c284                 1
+    x234      c40                 -1   c50                  1
+    x234      c285                 1
+    x235      c41                 -1   c51                  1
+    x235      c286                 1
+    x236      c42                 -1   c47                  1
+    x236      c287                 1
+    x237      c43                 -1   c48                  1
+    x237      c288                 1
+    x238      c44                 -1   c49                  1
+    x238      c289                 1
+    x239      c45                 -1   c50                  1
+    x239      c290                 1
+    x240      c46                 -1   c51                  1
+    x240      c291                 1
+    x241      R0000292             1   c1                   1
+    MARK0000  'MARKER'                 'INTORG'
+    x242      c1               -5.43   c2                0.22
+    x242      c22                  1   c37                 -1
+    x242      c52                 -7
+    x243      c1               -5.43   c3                0.22
+    x243      c23                  1   c38                 -1
+    x243      c53                 -7
+    x244      c1               -5.43   c4                0.22
+    x244      c24                  1   c39                 -1
+    x244      c54                 -7
+    x245      c1               -5.43   c5                0.22
+    x245      c25                  1   c40                 -1
+    x245      c55                 -7
+    x246      c1               -5.43   c6                0.22
+    x246      c26                  1   c41                 -1
+    x246      c56                 -7
+    x247      c1              -53.78   c2                 2.2
+    x247      c27                  1   c42                 -1
+    x247      c57                 -7
+    x248      c1              -53.78   c3                 2.2
+    x248      c28                  1   c43                 -1
+    x248      c58                 -7
+    x249      c1              -53.78   c4                 2.2
+    x249      c29                  1   c44                 -1
+    x249      c59                 -7
+    x250      c1              -53.78   c5                 2.2
+    x250      c30                  1   c45                 -1
+    x250      c60                 -7
+    x251      c1              -53.78   c6                 2.2
+    x251      c31                  1   c46                 -1
+    x251      c61                 -7
+    x252      c1              -23.36   c2                0.96
+    x252      c32                  1   c47                 -1
+    x252      c62                 -7
+    x253      c1              -23.36   c3                0.96
+    x253      c33                  1   c48                 -1
+    x253      c63                 -7
+    x254      c1              -23.36   c4                0.96
+    x254      c34                  1   c49                 -1
+    x254      c64                 -7
+    x255      c1              -23.36   c5                0.96
+    x255      c35                  1   c50                 -1
+    x255      c65                 -7
+    x256      c1              -23.36   c6                0.96
+    x256      c36                  1   c51                 -1
+    x256      c66                 -7
+    x257      c1               74.52   c2                3.79
+    x257      c7                   1   c32                 -1
+    x257      c67                 -7
+    x258      c1               74.52   c3                3.79
+    x258      c7                   1   c33                 -1
+    x258      c68                 -7
+    x259      c1               74.52   c4                3.79
+    x259      c7                   1   c34                 -1
+    x259      c69                 -7
+    x260      c1               74.52   c5                3.79
+    x260      c7                   1   c35                 -1
+    x260      c70                 -7
+    x261      c1               74.52   c6                3.79
+    x261      c7                   1   c36                 -1
+    x261      c71                 -7
+    x262      c1               78.87   c2                3.62
+    x262      c7                   1   c22                  1
+    x262      c32                 -1   c37                 -1
+    x262      c72                 -7
+    x263      c1               78.87   c3                3.62
+    x263      c7                   1   c23                  1
+    x263      c33                 -1   c38                 -1
+    x263      c73                 -7
+    x264      c1               78.87   c4                3.62
+    x264      c7                   1   c24                  1
+    x264      c34                 -1   c39                 -1
+    x264      c74                 -7
+    x265      c1               78.87   c5                3.62
+    x265      c7                   1   c25                  1
+    x265      c35                 -1   c40                 -1
+    x265      c75                 -7
+    x266      c1               78.87   c6                3.62
+    x266      c7                   1   c26                  1
+    x266      c36                 -1   c41                 -1
+    x266      c76                 -7
+    x267      c1               79.41   c2                3.59
+    x267      c7                   1   c27                  1
+    x267      c32                 -1   c42                 -1
+    x267      c77                 -7
+    x268      c1               79.41   c3                3.59
+    x268      c7                   1   c28                  1
+    x268      c33                 -1   c43                 -1
+    x268      c78                 -7
+    x269      c1               79.41   c4                3.59
+    x269      c7                   1   c29                  1
+    x269      c34                 -1   c44                 -1
+    x269      c79                 -7
+    x270      c1               79.41   c5                3.59
+    x270      c7                   1   c30                  1
+    x270      c35                 -1   c45                 -1
+    x270      c80                 -7
+    x271      c1               79.41   c6                3.59
+    x271      c7                   1   c31                  1
+    x271      c36                 -1   c46                 -1
+    x271      c81                 -7
+    x272      c1                84.3   c2                3.39
+    x272      c7                   1   c47                 -1
+    x273      c1                84.3   c3                3.39
+    x273      c7                   1   c48                 -1
+    x274      c1                84.3   c4                3.39
+    x274      c7                   1   c49                 -1
+    x275      c1                84.3   c5                3.39
+    x275      c7                   1   c50                 -1
+    x276      c1                84.3   c6                3.39
+    x276      c7                   1   c51                 -1
+    x277      c1               29.18   c2                4.48
+    x277      c8                   1   c27                 -1
+    x277      c82                 -7
+    x278      c1               29.18   c3                4.48
+    x278      c8                   1   c28                 -1
+    x278      c83                 -7
+    x279      c1               29.18   c4                4.48
+    x279      c8                   1   c29                 -1
+    x279      c84                 -7
+    x280      c1               29.18   c5                4.48
+    x280      c8                   1   c30                 -1
+    x280      c85                 -7
+    x281      c1               29.18   c6                4.48
+    x281      c8                   1   c31                 -1
+    x281      c86                 -7
+    x282      c1               38.96   c2                4.08
+    x282      c8                   1   c22                  1
+    x282      c27                 -1   c37                 -1
+    x282      c87                 -7
+    x283      c1               38.96   c3                4.08
+    x283      c8                   1   c23                  1
+    x283      c28                 -1   c38                 -1
+    x283      c88                 -7
+    x284      c1               38.96   c4                4.08
+    x284      c8                   1   c24                  1
+    x284      c29                 -1   c39                 -1
+    x284      c89                 -7
+    x285      c1               38.96   c5                4.08
+    x285      c8                   1   c25                  1
+    x285      c30                 -1   c40                 -1
+    x285      c90                 -7
+    x286      c1               38.96   c6                4.08
+    x286      c8                   1   c26                  1
+    x286      c31                 -1   c41                 -1
+    x286      c91                 -7
+    x287      c1               69.92   c2                2.82
+    x287      c8                   1   c42                 -1
+    x288      c1               69.92   c3                2.82
+    x288      c8                   1   c43                 -1
+    x289      c1               69.92   c4                2.82
+    x289      c8                   1   c44                 -1
+    x290      c1               69.92   c5                2.82
+    x290      c8                   1   c45                 -1
+    x291      c1               69.92   c6                2.82
+    x291      c8                   1   c46                 -1
+    x292      c1               51.45   c2                3.57
+    x292      c8                   1   c27                 -1
+    x292      c32                  1   c47                 -1
+    x292      c92                 -7
+    x293      c1               51.45   c3                3.57
+    x293      c8                   1   c28                 -1
+    x293      c33                  1   c48                 -1
+    x293      c93                 -7
+    x294      c1               51.45   c4                3.57
+    x294      c8                   1   c29                 -1
+    x294      c34                  1   c49                 -1
+    x294      c94                 -7
+    x295      c1               51.45   c5                3.57
+    x295      c8                   1   c30                 -1
+    x295      c35                  1   c50                 -1
+    x295      c95                 -7
+    x296      c1               51.45   c6                3.57
+    x296      c8                   1   c31                 -1
+    x296      c36                  1   c51                 -1
+    x296      c96                 -7
+    x297      c1              120.54   c2                5.19
+    x297      c9                   1   c22                 -1
+    x297      c97                 -7
+    x298      c1              120.54   c3                5.19
+    x298      c9                   1   c23                 -1
+    x298      c98                 -7
+    x299      c1              120.54   c4                5.19
+    x299      c9                   1   c24                 -1
+    x299      c99                 -7
+    x300      c1              120.54   c5                5.19
+    x300      c9                   1   c25                 -1
+    x300      c100                -7
+    x301      c1              120.54   c6                5.19
+    x301      c9                   1   c26                 -1
+    x301      c101                -7
+    x302      c1              125.43   c2                4.99
+    x302      c9                   1   c37                 -1
+    x303      c1              125.43   c3                4.99
+    x303      c9                   1   c38                 -1
+    x304      c1              125.43   c4                4.99
+    x304      c9                   1   c39                 -1
+    x305      c1              125.43   c5                4.99
+    x305      c9                   1   c40                 -1
+    x306      c1              125.43   c6                4.99
+    x306      c9                   1   c41                 -1
+    x307      c1              108.05   c2                5.71
+    x307      c9                   1   c22                 -1
+    x307      c27                  1   c42                 -1
+    x307      c102                -7
+    x308      c1              108.05   c3                5.71
+    x308      c9                   1   c23                 -1
+    x308      c28                  1   c43                 -1
+    x308      c103                -7
+    x309      c1              108.05   c4                5.71
+    x309      c9                   1   c24                 -1
+    x309      c29                  1   c44                 -1
+    x309      c104                -7
+    x310      c1              108.05   c5                5.71
+    x310      c9                   1   c25                 -1
+    x310      c30                  1   c45                 -1
+    x310      c105                -7
+    x311      c1              108.05   c6                5.71
+    x311      c9                   1   c26                 -1
+    x311      c31                  1   c46                 -1
+    x311      c106                -7
+    x312      c1              142.82   c2                4.28
+    x312      c9                   1   c22                 -1
+    x312      c32                  1   c47                 -1
+    x312      c107                -7
+    x313      c1              142.82   c3                4.28
+    x313      c9                   1   c23                 -1
+    x313      c33                  1   c48                 -1
+    x313      c108                -7
+    x314      c1              142.82   c4                4.28
+    x314      c9                   1   c24                 -1
+    x314      c34                  1   c49                 -1
+    x314      c109                -7
+    x315      c1              142.82   c5                4.28
+    x315      c9                   1   c25                 -1
+    x315      c35                  1   c50                 -1
+    x315      c110                -7
+    x316      c1              142.82   c6                4.28
+    x316      c9                   1   c26                 -1
+    x316      c36                  1   c51                 -1
+    x316      c111                -7
+    x317      c1               74.43   c2                4.99
+    x317      c10                  1   c32                 -1
+    x317      c112                -7
+    x318      c1               74.43   c3                4.99
+    x318      c10                  1   c33                 -1
+    x318      c113                -7
+    x319      c1               74.43   c4                4.99
+    x319      c10                  1   c34                 -1
+    x319      c114                -7
+    x320      c1               74.43   c5                4.99
+    x320      c10                  1   c35                 -1
+    x320      c115                -7
+    x321      c1               74.43   c6                4.99
+    x321      c10                  1   c36                 -1
+    x321      c116                -7
+    x322      c1               83.13   c2                4.64
+    x322      c10                  1   c22                  1
+    x322      c32                 -1   c37                 -1
+    x322      c117                -7
+    x323      c1               83.13   c3                4.64
+    x323      c10                  1   c23                  1
+    x323      c33                 -1   c38                 -1
+    x323      c118                -7
+    x324      c1               83.13   c4                4.64
+    x324      c10                  1   c24                  1
+    x324      c34                 -1   c39                 -1
+    x324      c119                -7
+    x325      c1               83.13   c5                4.64
+    x325      c10                  1   c25                  1
+    x325      c35                 -1   c40                 -1
+    x325      c120                -7
+    x326      c1               83.13   c6                4.64
+    x326      c10                  1   c26                  1
+    x326      c36                 -1   c41                 -1
+    x326      c121                -7
+    x327      c1               93.99   c2                4.19
+    x327      c10                  1   c27                  1
+    x327      c32                 -1   c42                 -1
+    x327      c122                -7
+    x328      c1               93.99   c3                4.19
+    x328      c10                  1   c28                  1
+    x328      c33                 -1   c43                 -1
+    x328      c123                -7
+    x329      c1               93.99   c4                4.19
+    x329      c10                  1   c29                  1
+    x329      c34                 -1   c44                 -1
+    x329      c124                -7
+    x330      c1               93.99   c5                4.19
+    x330      c10                  1   c30                  1
+    x330      c35                 -1   c45                 -1
+    x330      c125                -7
+    x331      c1               93.99   c6                4.19
+    x331      c10                  1   c31                  1
+    x331      c36                 -1   c46                 -1
+    x331      c126                -7
+    x332      c1               96.16   c2                4.11
+    x332      c10                  1   c47                 -1
+    x333      c1               96.16   c3                4.11
+    x333      c10                  1   c48                 -1
+    x334      c1               96.16   c4                4.11
+    x334      c10                  1   c49                 -1
+    x335      c1               96.16   c5                4.11
+    x335      c10                  1   c50                 -1
+    x336      c1               96.16   c6                4.11
+    x336      c10                  1   c51                 -1
+    x337      c1               48.09   c2                3.37
+    x337      c11                  1   c32                 -1
+    x337      c127                -7
+    x338      c1               48.09   c3                3.37
+    x338      c11                  1   c33                 -1
+    x338      c128                -7
+    x339      c1               48.09   c4                3.37
+    x339      c11                  1   c34                 -1
+    x339      c129                -7
+    x340      c1               48.09   c5                3.37
+    x340      c11                  1   c35                 -1
+    x340      c130                -7
+    x341      c1               48.09   c6                3.37
+    x341      c11                  1   c36                 -1
+    x341      c131                -7
+    x342      c1               56.24   c2                3.04
+    x342      c11                  1   c22                  1
+    x342      c32                 -1   c37                 -1
+    x342      c132                -7
+    x343      c1               56.24   c3                3.04
+    x343      c11                  1   c23                  1
+    x343      c33                 -1   c38                 -1
+    x343      c133                -7
+    x344      c1               56.24   c4                3.04
+    x344      c11                  1   c24                  1
+    x344      c34                 -1   c39                 -1
+    x344      c134                -7
+    x345      c1               56.24   c5                3.04
+    x345      c11                  1   c25                  1
+    x345      c35                 -1   c40                 -1
+    x345      c135                -7
+    x346      c1               56.24   c6                3.04
+    x346      c11                  1   c26                  1
+    x346      c36                 -1   c41                 -1
+    x346      c136                -7
+    x347      c1                26.9   c2                4.24
+    x347      c11                  1   c27                  1
+    x347      c32                 -1   c42                 -1
+    x347      c137                -7
+    x348      c1                26.9   c3                4.24
+    x348      c11                  1   c28                  1
+    x348      c33                 -1   c43                 -1
+    x348      c138                -7
+    x349      c1                26.9   c4                4.24
+    x349      c11                  1   c29                  1
+    x349      c34                 -1   c44                 -1
+    x349      c139                -7
+    x350      c1                26.9   c5                4.24
+    x350      c11                  1   c30                  1
+    x350      c35                 -1   c45                 -1
+    x350      c140                -7
+    x351      c1                26.9   c6                4.24
+    x351      c11                  1   c31                  1
+    x351      c36                 -1   c46                 -1
+    x351      c141                -7
+    x352      c1               66.02   c2                2.64
+    x352      c11                  1   c47                 -1
+    x353      c1               66.02   c3                2.64
+    x353      c11                  1   c48                 -1
+    x354      c1               66.02   c4                2.64
+    x354      c11                  1   c49                 -1
+    x355      c1               66.02   c5                2.64
+    x355      c11                  1   c50                 -1
+    x356      c1               66.02   c6                2.64
+    x356      c11                  1   c51                 -1
+    x357      c1               94.53   c2                4.17
+    x357      c12                  1   c32                 -1
+    x357      c142                -7
+    x358      c1               94.53   c3                4.17
+    x358      c12                  1   c33                 -1
+    x358      c143                -7
+    x359      c1               94.53   c4                4.17
+    x359      c12                  1   c34                 -1
+    x359      c144                -7
+    x360      c1               94.53   c5                4.17
+    x360      c12                  1   c35                 -1
+    x360      c145                -7
+    x361      c1               94.53   c6                4.17
+    x361      c12                  1   c36                 -1
+    x361      c146                -7
+    x362      c1               96.71   c2                4.08
+    x362      c12                  1   c22                  1
+    x362      c32                 -1   c37                 -1
+    x362      c147                -7
+    x363      c1               96.71   c3                4.08
+    x363      c12                  1   c23                  1
+    x363      c33                 -1   c38                 -1
+    x363      c148                -7
+    x364      c1               96.71   c4                4.08
+    x364      c12                  1   c24                  1
+    x364      c34                 -1   c39                 -1
+    x364      c149                -7
+    x365      c1               96.71   c5                4.08
+    x365      c12                  1   c25                  1
+    x365      c35                 -1   c40                 -1
+    x365      c150                -7
+    x366      c1               96.71   c6                4.08
+    x366      c12                  1   c26                  1
+    x366      c36                 -1   c41                 -1
+    x366      c151                -7
+    x367      c1               93.45   c2                4.22
+    x367      c12                  1   c27                  1
+    x367      c32                 -1   c42                 -1
+    x367      c152                -7
+    x368      c1               93.45   c3                4.22
+    x368      c12                  1   c28                  1
+    x368      c33                 -1   c43                 -1
+    x368      c153                -7
+    x369      c1               93.45   c4                4.22
+    x369      c12                  1   c29                  1
+    x369      c34                 -1   c44                 -1
+    x369      c154                -7
+    x370      c1               93.45   c5                4.22
+    x370      c12                  1   c30                  1
+    x370      c35                 -1   c45                 -1
+    x370      c155                -7
+    x371      c1               93.45   c6                4.22
+    x371      c12                  1   c31                  1
+    x371      c36                 -1   c46                 -1
+    x371      c156                -7
+    x372      c1               93.99   c2                4.19
+    x372      c12                  1   c47                 -1
+    x373      c1               93.99   c3                4.19
+    x373      c12                  1   c48                 -1
+    x374      c1               93.99   c4                4.19
+    x374      c12                  1   c49                 -1
+    x375      c1               93.99   c5                4.19
+    x375      c12                  1   c50                 -1
+    x376      c1               93.99   c6                4.19
+    x376      c12                  1   c51                 -1
+    x377      c1               22.76   c2                5.08
+    x377      c13                  1   c27                 -1
+    x377      c157                -7
+    x378      c1               22.76   c3                5.08
+    x378      c13                  1   c28                 -1
+    x378      c158                -7
+    x379      c1               22.76   c4                5.08
+    x379      c13                  1   c29                 -1
+    x379      c159                -7
+    x380      c1               22.76   c5                5.08
+    x380      c13                  1   c30                 -1
+    x380      c160                -7
+    x381      c1               22.76   c6                5.08
+    x381      c13                  1   c31                 -1
+    x381      c161                -7
+    x382      c1               37.97   c2                4.46
+    x382      c13                  1   c22                  1
+    x382      c27                 -1   c37                 -1
+    x382      c162                -7
+    x383      c1               37.97   c3                4.46
+    x383      c13                  1   c23                  1
+    x383      c28                 -1   c38                 -1
+    x383      c163                -7
+    x384      c1               37.97   c4                4.46
+    x384      c13                  1   c24                  1
+    x384      c29                 -1   c39                 -1
+    x384      c164                -7
+    x385      c1               37.97   c5                4.46
+    x385      c13                  1   c25                  1
+    x385      c30                 -1   c40                 -1
+    x385      c165                -7
+    x386      c1               37.97   c6                4.46
+    x386      c13                  1   c26                  1
+    x386      c31                 -1   c41                 -1
+    x386      c166                -7
+    x387      c1               74.91   c2                2.95
+    x387      c13                  1   c42                 -1
+    x388      c1               74.91   c3                2.95
+    x388      c13                  1   c43                 -1
+    x389      c1               74.91   c4                2.95
+    x389      c13                  1   c44                 -1
+    x390      c1               74.91   c5                2.95
+    x390      c13                  1   c45                 -1
+    x391      c1               74.91   c6                2.95
+    x391      c13                  1   c46                 -1
+    x392      c1               47.75   c2                4.06
+    x392      c13                  1   c27                 -1
+    x392      c32                  1   c47                 -1
+    x392      c167                -7
+    x393      c1               47.75   c3                4.06
+    x393      c13                  1   c28                 -1
+    x393      c33                  1   c48                 -1
+    x393      c168                -7
+    x394      c1               47.75   c4                4.06
+    x394      c13                  1   c29                 -1
+    x394      c34                  1   c49                 -1
+    x394      c169                -7
+    x395      c1               47.75   c5                4.06
+    x395      c13                  1   c30                 -1
+    x395      c35                  1   c50                 -1
+    x395      c170                -7
+    x396      c1               47.75   c6                4.06
+    x396      c13                  1   c31                 -1
+    x396      c36                  1   c51                 -1
+    x396      c171                -7
+    x397      c1               85.38   c2                3.99
+    x397      c14                  1   c27                 -1
+    x397      c172                -7
+    x398      c1               85.38   c3                3.99
+    x398      c14                  1   c28                 -1
+    x398      c173                -7
+    x399      c1               85.38   c4                3.99
+    x399      c14                  1   c29                 -1
+    x399      c174                -7
+    x400      c1               85.38   c5                3.99
+    x400      c14                  1   c30                 -1
+    x400      c175                -7
+    x401      c1               85.38   c6                3.99
+    x401      c14                  1   c31                 -1
+    x401      c176                -7
+    x402      c1               86.47   c2                3.95
+    x402      c14                  1   c22                  1
+    x402      c27                 -1   c37                 -1
+    x402      c177                -7
+    x403      c1               86.47   c3                3.95
+    x403      c14                  1   c23                  1
+    x403      c28                 -1   c38                 -1
+    x403      c178                -7
+    x404      c1               86.47   c4                3.95
+    x404      c14                  1   c24                  1
+    x404      c29                 -1   c39                 -1
+    x404      c179                -7
+    x405      c1               86.47   c5                3.95
+    x405      c14                  1   c25                  1
+    x405      c30                 -1   c40                 -1
+    x405      c180                -7
+    x406      c1               86.47   c6                3.95
+    x406      c14                  1   c26                  1
+    x406      c31                 -1   c41                 -1
+    x406      c181                -7
+    x407      c1               90.27   c2                3.79
+    x407      c14                  1   c42                 -1
+    x408      c1               90.27   c3                3.79
+    x408      c14                  1   c43                 -1
+    x409      c1               90.27   c4                3.79
+    x409      c14                  1   c44                 -1
+    x410      c1               90.27   c5                3.79
+    x410      c14                  1   c45                 -1
+    x411      c1               90.27   c6                3.79
+    x411      c14                  1   c46                 -1
+    x412      c1               76.69   c2                4.35
+    x412      c14                  1   c27                 -1
+    x412      c32                  1   c47                 -1
+    x412      c182                -7
+    x413      c1               76.69   c3                4.35
+    x413      c14                  1   c28                 -1
+    x413      c33                  1   c48                 -1
+    x413      c183                -7
+    x414      c1               76.69   c4                4.35
+    x414      c14                  1   c29                 -1
+    x414      c34                  1   c49                 -1
+    x414      c184                -7
+    x415      c1               76.69   c5                4.35
+    x415      c14                  1   c30                 -1
+    x415      c35                  1   c50                 -1
+    x415      c185                -7
+    x416      c1               76.69   c6                4.35
+    x416      c14                  1   c31                 -1
+    x416      c36                  1   c51                 -1
+    x416      c186                -7
+    x417      c1               87.17   c2                3.46
+    x417      c15                  1   c22                 -1
+    x417      c187                -7
+    x418      c1               87.17   c3                3.46
+    x418      c15                  1   c23                 -1
+    x418      c188                -7
+    x419      c1               87.17   c4                3.46
+    x419      c15                  1   c24                 -1
+    x419      c189                -7
+    x420      c1               87.17   c5                3.46
+    x420      c15                  1   c25                 -1
+    x420      c190                -7
+    x421      c1               87.17   c6                3.46
+    x421      c15                  1   c26                 -1
+    x421      c191                -7
+    x422      c1               83.37   c2                3.62
+    x422      c15                  1   c37                 -1
+    x423      c1               83.37   c3                3.62
+    x423      c15                  1   c38                 -1
+    x424      c1               83.37   c4                3.62
+    x424      c15                  1   c39                 -1
+    x425      c1               83.37   c5                3.62
+    x425      c15                  1   c40                 -1
+    x426      c1               83.37   c6                3.62
+    x426      c15                  1   c41                 -1
+    x427      c1               38.27   c2                5.46
+    x427      c15                  1   c22                 -1
+    x427      c27                  1   c42                 -1
+    x427      c192                -7
+    x428      c1               38.27   c3                5.46
+    x428      c15                  1   c23                 -1
+    x428      c28                  1   c43                 -1
+    x428      c193                -7
+    x429      c1               38.27   c4                5.46
+    x429      c15                  1   c24                 -1
+    x429      c29                  1   c44                 -1
+    x429      c194                -7
+    x430      c1               38.27   c5                5.46
+    x430      c15                  1   c25                 -1
+    x430      c30                  1   c45                 -1
+    x430      c195                -7
+    x431      c1               38.27   c6                5.46
+    x431      c15                  1   c26                 -1
+    x431      c31                  1   c46                 -1
+    x431      c196                -7
+    x432      c1               75.76   c2                3.93
+    x432      c15                  1   c22                 -1
+    x432      c32                  1   c47                 -1
+    x432      c197                -7
+    x433      c1               75.76   c3                3.93
+    x433      c15                  1   c23                 -1
+    x433      c33                  1   c48                 -1
+    x433      c198                -7
+    x434      c1               75.76   c4                3.93
+    x434      c15                  1   c24                 -1
+    x434      c34                  1   c49                 -1
+    x434      c199                -7
+    x435      c1               75.76   c5                3.93
+    x435      c15                  1   c25                 -1
+    x435      c35                  1   c50                 -1
+    x435      c200                -7
+    x436      c1               75.76   c6                3.93
+    x436      c15                  1   c26                 -1
+    x436      c36                  1   c51                 -1
+    x436      c201                -7
+    x437      c1               69.51   c2                2.13
+    x437      c16                  1   c22                 -1
+    x437      c202                -7
+    x438      c1               69.51   c3                2.13
+    x438      c16                  1   c23                 -1
+    x438      c203                -7
+    x439      c1               69.51   c4                2.13
+    x439      c16                  1   c24                 -1
+    x439      c204                -7
+    x440      c1               69.51   c5                2.13
+    x440      c16                  1   c25                 -1
+    x440      c205                -7
+    x441      c1               69.51   c6                2.13
+    x441      c16                  1   c26                 -1
+    x441      c206                -7
+    x442      c1               65.71   c2                2.28
+    x442      c16                  1   c37                 -1
+    x443      c1               65.71   c3                2.28
+    x443      c16                  1   c38                 -1
+    x444      c1               65.71   c4                2.28
+    x444      c16                  1   c39                 -1
+    x445      c1               65.71   c5                2.28
+    x445      c16                  1   c40                 -1
+    x446      c1               65.71   c6                2.28
+    x446      c16                  1   c41                 -1
+    x447      c1               20.62   c2                4.13
+    x447      c16                  1   c22                 -1
+    x447      c27                  1   c42                 -1
+    x447      c207                -7
+    x448      c1               20.62   c3                4.13
+    x448      c16                  1   c23                 -1
+    x448      c28                  1   c43                 -1
+    x448      c208                -7
+    x449      c1               20.62   c4                4.13
+    x449      c16                  1   c24                 -1
+    x449      c29                  1   c44                 -1
+    x449      c209                -7
+    x450      c1               20.62   c5                4.13
+    x450      c16                  1   c25                 -1
+    x450      c30                  1   c45                 -1
+    x450      c210                -7
+    x451      c1               20.62   c6                4.13
+    x451      c16                  1   c26                 -1
+    x451      c31                  1   c46                 -1
+    x451      c211                -7
+    x452      c1               53.22   c2                2.79
+    x452      c16                  1   c22                 -1
+    x452      c32                  1   c47                 -1
+    x452      c212                -7
+    x453      c1               53.22   c3                2.79
+    x453      c16                  1   c23                 -1
+    x453      c33                  1   c48                 -1
+    x453      c213                -7
+    x454      c1               53.22   c4                2.79
+    x454      c16                  1   c24                 -1
+    x454      c34                  1   c49                 -1
+    x454      c214                -7
+    x455      c1               53.22   c5                2.79
+    x455      c16                  1   c25                 -1
+    x455      c35                  1   c50                 -1
+    x455      c215                -7
+    x456      c1               53.22   c6                2.79
+    x456      c16                  1   c26                 -1
+    x456      c36                  1   c51                 -1
+    x456      c216                -7
+    x457      c1               87.47   c2                4.46
+    x457      c17                  1   c22                 -1
+    x457      c217                -7
+    x458      c1               87.47   c3                4.46
+    x458      c17                  1   c23                 -1
+    x458      c218                -7
+    x459      c1               87.47   c4                4.46
+    x459      c17                  1   c24                 -1
+    x459      c219                -7
+    x460      c1               87.47   c5                4.46
+    x460      c17                  1   c25                 -1
+    x460      c220                -7
+    x461      c1               87.47   c6                4.46
+    x461      c17                  1   c26                 -1
+    x461      c221                -7
+    x462      c1               95.08   c2                4.15
+    x462      c17                  1   c37                 -1
+    x463      c1               95.08   c3                4.15
+    x463      c17                  1   c38                 -1
+    x464      c1               95.08   c4                4.15
+    x464      c17                  1   c39                 -1
+    x465      c1               95.08   c5                4.15
+    x465      c17                  1   c40                 -1
+    x466      c1               95.08   c6                4.15
+    x466      c17                  1   c41                 -1
+    x467      c1               39.66   c2                6.42
+    x467      c17                  1   c22                 -1
+    x467      c27                  1   c42                 -1
+    x467      c222                -7
+    x468      c1               39.66   c3                6.42
+    x468      c17                  1   c23                 -1
+    x468      c28                  1   c43                 -1
+    x468      c223                -7
+    x469      c1               39.66   c4                6.42
+    x469      c17                  1   c24                 -1
+    x469      c29                  1   c44                 -1
+    x469      c224                -7
+    x470      c1               39.66   c5                6.42
+    x470      c17                  1   c25                 -1
+    x470      c30                  1   c45                 -1
+    x470      c225                -7
+    x471      c1               39.66   c6                6.42
+    x471      c17                  1   c26                 -1
+    x471      c31                  1   c46                 -1
+    x471      c226                -7
+    x472      c1               76.06   c2                4.93
+    x472      c17                  1   c22                 -1
+    x472      c32                  1   c47                 -1
+    x472      c227                -7
+    x473      c1               76.06   c3                4.93
+    x473      c17                  1   c23                 -1
+    x473      c33                  1   c48                 -1
+    x473      c228                -7
+    x474      c1               76.06   c4                4.93
+    x474      c17                  1   c24                 -1
+    x474      c34                  1   c49                 -1
+    x474      c229                -7
+    x475      c1               76.06   c5                4.93
+    x475      c17                  1   c25                 -1
+    x475      c35                  1   c50                 -1
+    x475      c230                -7
+    x476      c1               76.06   c6                4.93
+    x476      c17                  1   c26                 -1
+    x476      c36                  1   c51                 -1
+    x476      c231                -7
+    x477      c1               43.98   c2                3.17
+    x477      c18                  1   c32                 -1
+    x477      c232                -7
+    x478      c1               43.98   c3                3.17
+    x478      c18                  1   c33                 -1
+    x478      c233                -7
+    x479      c1               43.98   c4                3.17
+    x479      c18                  1   c34                 -1
+    x479      c234                -7
+    x480      c1               43.98   c5                3.17
+    x480      c18                  1   c35                 -1
+    x480      c235                -7
+    x481      c1               43.98   c6                3.17
+    x481      c18                  1   c36                 -1
+    x481      c236                -7
+    x482      c1                46.7   c2                3.06
+    x482      c18                  1   c22                  1
+    x482      c32                 -1   c37                 -1
+    x482      c237                -7
+    x483      c1                46.7   c3                3.06
+    x483      c18                  1   c23                  1
+    x483      c33                 -1   c38                 -1
+    x483      c238                -7
+    x484      c1                46.7   c4                3.06
+    x484      c18                  1   c24                  1
+    x484      c34                 -1   c39                 -1
+    x484      c239                -7
+    x485      c1                46.7   c5                3.06
+    x485      c18                  1   c25                  1
+    x485      c35                 -1   c40                 -1
+    x485      c240                -7
+    x486      c1                46.7   c6                3.06
+    x486      c18                  1   c26                  1
+    x486      c36                 -1   c41                 -1
+    x486      c241                -7
+    x487      c1               29.31   c2                3.77
+    x487      c18                  1   c27                  1
+    x487      c32                 -1   c42                 -1
+    x487      c242                -7
+    x488      c1               29.31   c3                3.77
+    x488      c18                  1   c28                  1
+    x488      c33                 -1   c43                 -1
+    x488      c243                -7
+    x489      c1               29.31   c4                3.77
+    x489      c18                  1   c29                  1
+    x489      c34                 -1   c44                 -1
+    x489      c244                -7
+    x490      c1               29.31   c5                3.77
+    x490      c18                  1   c30                  1
+    x490      c35                 -1   c45                 -1
+    x490      c245                -7
+    x491      c1               29.31   c6                3.77
+    x491      c18                  1   c31                  1
+    x491      c36                 -1   c46                 -1
+    x491      c246                -7
+    x492      c1               65.71   c2                2.28
+    x492      c18                  1   c47                 -1
+    x493      c1               65.71   c3                2.28
+    x493      c18                  1   c48                 -1
+    x494      c1               65.71   c4                2.28
+    x494      c18                  1   c49                 -1
+    x495      c1               65.71   c5                2.28
+    x495      c18                  1   c50                 -1
+    x496      c1               65.71   c6                2.28
+    x496      c18                  1   c51                 -1
+    x497      c1               68.29   c2                2.88
+    x497      c19                  1   c22                 -1
+    x497      c247                -7
+    x498      c1               68.29   c3                2.88
+    x498      c19                  1   c23                 -1
+    x498      c248                -7
+    x499      c1               68.29   c4                2.88
+    x499      c19                  1   c24                 -1
+    x499      c249                -7
+    x500      c1               68.29   c5                2.88
+    x500      c19                  1   c25                 -1
+    x500      c250                -7
+    x501      c1               68.29   c6                2.88
+    x501      c19                  1   c26                 -1
+    x501      c251                -7
+    x502      c1               71.01   c2                2.77
+    x502      c19                  1   c37                 -1
+    x503      c1               71.01   c3                2.77
+    x503      c19                  1   c38                 -1
+    x504      c1               71.01   c4                2.77
+    x504      c19                  1   c39                 -1
+    x505      c1               71.01   c5                2.77
+    x505      c19                  1   c40                 -1
+    x506      c1               71.01   c6                2.77
+    x506      c19                  1   c41                 -1
+    x507      c1               40.59   c2                4.02
+    x507      c19                  1   c22                 -1
+    x507      c27                  1   c42                 -1
+    x507      c252                -7
+    x508      c1               40.59   c3                4.02
+    x508      c19                  1   c23                 -1
+    x508      c28                  1   c43                 -1
+    x508      c253                -7
+    x509      c1               40.59   c4                4.02
+    x509      c19                  1   c24                 -1
+    x509      c29                  1   c44                 -1
+    x509      c254                -7
+    x510      c1               40.59   c5                4.02
+    x510      c19                  1   c25                 -1
+    x510      c30                  1   c45                 -1
+    x510      c255                -7
+    x511      c1               40.59   c6                4.02
+    x511      c19                  1   c26                 -1
+    x511      c31                  1   c46                 -1
+    x511      c256                -7
+    x512      c1                  52   c2                3.55
+    x512      c19                  1   c22                 -1
+    x512      c32                  1   c47                 -1
+    x512      c257                -7
+    x513      c1                  52   c3                3.55
+    x513      c19                  1   c23                 -1
+    x513      c33                  1   c48                 -1
+    x513      c258                -7
+    x514      c1                  52   c4                3.55
+    x514      c19                  1   c24                 -1
+    x514      c34                  1   c49                 -1
+    x514      c259                -7
+    x515      c1                  52   c5                3.55
+    x515      c19                  1   c25                 -1
+    x515      c35                  1   c50                 -1
+    x515      c260                -7
+    x516      c1                  52   c6                3.55
+    x516      c19                  1   c26                 -1
+    x516      c36                  1   c51                 -1
+    x516      c261                -7
+    x517      c1               64.59   c2                3.37
+    x517      c20                  1   c32                 -1
+    x517      c262                -7
+    x518      c1               64.59   c3                3.37
+    x518      c20                  1   c33                 -1
+    x518      c263                -7
+    x519      c1               64.59   c4                3.37
+    x519      c20                  1   c34                 -1
+    x519      c264                -7
+    x520      c1               64.59   c5                3.37
+    x520      c20                  1   c35                 -1
+    x520      c265                -7
+    x521      c1               64.59   c6                3.37
+    x521      c20                  1   c36                 -1
+    x521      c266                -7
+    x522      c1               62.96   c2                3.44
+    x522      c20                  1   c22                  1
+    x522      c32                 -1   c37                 -1
+    x522      c267                -7
+    x523      c1               62.96   c3                3.44
+    x523      c20                  1   c23                  1
+    x523      c33                 -1   c38                 -1
+    x523      c268                -7
+    x524      c1               62.96   c4                3.44
+    x524      c20                  1   c24                  1
+    x524      c34                 -1   c39                 -1
+    x524      c269                -7
+    x525      c1               62.96   c5                3.44
+    x525      c20                  1   c25                  1
+    x525      c35                 -1   c40                 -1
+    x525      c270                -7
+    x526      c1               62.96   c6                3.44
+    x526      c20                  1   c26                  1
+    x526      c36                 -1   c41                 -1
+    x526      c271                -7
+    x527      c1               29.82   c2                4.79
+    x527      c20                  1   c27                  1
+    x527      c32                 -1   c42                 -1
+    x527      c272                -7
+    x528      c1               29.82   c3                4.79
+    x528      c20                  1   c28                  1
+    x528      c33                 -1   c43                 -1
+    x528      c273                -7
+    x529      c1               29.82   c4                4.79
+    x529      c20                  1   c29                  1
+    x529      c34                 -1   c44                 -1
+    x529      c274                -7
+    x530      c1               29.82   c5                4.79
+    x530      c20                  1   c30                  1
+    x530      c35                 -1   c45                 -1
+    x530      c275                -7
+    x531      c1               29.82   c6                4.79
+    x531      c20                  1   c31                  1
+    x531      c36                 -1   c46                 -1
+    x531      c276                -7
+    x532      c1               74.91   c2                2.95
+    x532      c20                  1   c47                 -1
+    x533      c1               74.91   c3                2.95
+    x533      c20                  1   c48                 -1
+    x534      c1               74.91   c4                2.95
+    x534      c20                  1   c49                 -1
+    x535      c1               74.91   c5                2.95
+    x535      c20                  1   c50                 -1
+    x536      c1               74.91   c6                2.95
+    x536      c20                  1   c51                 -1
+    x537      c1               62.18   c2                4.48
+    x537      c21                  1   c32                 -1
+    x537      c277                -7
+    x538      c1               62.18   c3                4.48
+    x538      c21                  1   c33                 -1
+    x538      c278                -7
+    x539      c1               62.18   c4                4.48
+    x539      c21                  1   c34                 -1
+    x539      c279                -7
+    x540      c1               62.18   c5                4.48
+    x540      c21                  1   c35                 -1
+    x540      c280                -7
+    x541      c1               62.18   c6                4.48
+    x541      c21                  1   c36                 -1
+    x541      c281                -7
+    x542      c1               67.07   c2                4.28
+    x542      c21                  1   c22                  1
+    x542      c32                 -1   c37                 -1
+    x542      c282                -7
+    x543      c1               67.07   c3                4.28
+    x543      c21                  1   c23                  1
+    x543      c33                 -1   c38                 -1
+    x543      c283                -7
+    x544      c1               67.07   c4                4.28
+    x544      c21                  1   c24                  1
+    x544      c34                 -1   c39                 -1
+    x544      c284                -7
+    x545      c1               67.07   c5                4.28
+    x545      c21                  1   c25                  1
+    x545      c35                 -1   c40                 -1
+    x545      c285                -7
+    x546      c1               67.07   c6                4.28
+    x546      c21                  1   c26                  1
+    x546      c36                 -1   c41                 -1
+    x546      c286                -7
+    x547      c1               49.68   c2                4.99
+    x547      c21                  1   c27                  1
+    x547      c32                 -1   c42                 -1
+    x547      c287                -7
+    x548      c1               49.68   c3                4.99
+    x548      c21                  1   c28                  1
+    x548      c33                 -1   c43                 -1
+    x548      c288                -7
+    x549      c1               49.68   c4                4.99
+    x549      c21                  1   c29                  1
+    x549      c34                 -1   c44                 -1
+    x549      c289                -7
+    x550      c1               49.68   c5                4.99
+    x550      c21                  1   c30                  1
+    x550      c35                 -1   c45                 -1
+    x550      c290                -7
+    x551      c1               49.68   c6                4.99
+    x551      c21                  1   c31                  1
+    x551      c36                 -1   c46                 -1
+    x551      c291                -7
+    x552      c1               84.45   c2                3.57
+    x552      c21                  1   c47                 -1
+    x553      c1               84.45   c3                3.57
+    x553      c21                  1   c48                 -1
+    x554      c1               84.45   c4                3.57
+    x554      c21                  1   c49                 -1
+    x555      c1               84.45   c5                3.57
+    x555      c21                  1   c50                 -1
+    x556      c1               84.45   c6                3.57
+    x556      c21                  1   c51                 -1
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c1             2375.25   c2                12.5
+    rhs       c3                12.5   c4                12.5
+    rhs       c5                12.5   c6                12.5
+    rhs       c7                   1   c8                   1
+    rhs       c9                   2   c10                  1
+    rhs       c11                  1   c12                  1
+    rhs       c13                  1   c14                  1
+    rhs       c15                  1   c16                  1
+    rhs       c17                  1   c18                  1
+    rhs       c19                  1   c20                  1
+    rhs       c21                  1
+BOUNDS
+ FR bnd       x241    
+ UP bnd       x242                 1
+ UP bnd       x243                 1
+ UP bnd       x244                 1
+ UP bnd       x245                 1
+ UP bnd       x246                 1
+ UP bnd       x247                 1
+ UP bnd       x248                 1
+ UP bnd       x249                 1
+ UP bnd       x250                 1
+ UP bnd       x251                 1
+ UP bnd       x252                 1
+ UP bnd       x253                 1
+ UP bnd       x254                 1
+ UP bnd       x255                 1
+ UP bnd       x256                 1
+ UP bnd       x257                 1
+ UP bnd       x258                 1
+ UP bnd       x259                 1
+ UP bnd       x260                 1
+ UP bnd       x261                 1
+ UP bnd       x262                 1
+ UP bnd       x263                 1
+ UP bnd       x264                 1
+ UP bnd       x265                 1
+ UP bnd       x266                 1
+ UP bnd       x267                 1
+ UP bnd       x268                 1
+ UP bnd       x269                 1
+ UP bnd       x270                 1
+ UP bnd       x271                 1
+ UP bnd       x272                 1
+ UP bnd       x273                 1
+ UP bnd       x274                 1
+ UP bnd       x275                 1
+ UP bnd       x276                 1
+ UP bnd       x277                 1
+ UP bnd       x278                 1
+ UP bnd       x279                 1
+ UP bnd       x280                 1
+ UP bnd       x281                 1
+ UP bnd       x282                 1
+ UP bnd       x283                 1
+ UP bnd       x284                 1
+ UP bnd       x285                 1
+ UP bnd       x286                 1
+ UP bnd       x287                 1
+ UP bnd       x288                 1
+ UP bnd       x289                 1
+ UP bnd       x290                 1
+ UP bnd       x291                 1
+ UP bnd       x292                 1
+ UP bnd       x293                 1
+ UP bnd       x294                 1
+ UP bnd       x295                 1
+ UP bnd       x296                 1
+ UP bnd       x297                 1
+ UP bnd       x298                 1
+ UP bnd       x299                 1
+ UP bnd       x300                 1
+ UP bnd       x301                 1
+ UP bnd       x302                 2
+ UP bnd       x303                 2
+ UP bnd       x304                 2
+ UP bnd       x305                 2
+ UP bnd       x306                 2
+ UP bnd       x307                 2
+ UP bnd       x308                 2
+ UP bnd       x309                 2
+ UP bnd       x310                 2
+ UP bnd       x311                 2
+ UP bnd       x312                 2
+ UP bnd       x313                 2
+ UP bnd       x314                 2
+ UP bnd       x315                 2
+ UP bnd       x316                 2
+ UP bnd       x317                 1
+ UP bnd       x318                 1
+ UP bnd       x319                 1
+ UP bnd       x320                 1
+ UP bnd       x321                 1
+ UP bnd       x322                 1
+ UP bnd       x323                 1
+ UP bnd       x324                 1
+ UP bnd       x325                 1
+ UP bnd       x326                 1
+ UP bnd       x327                 1
+ UP bnd       x328                 1
+ UP bnd       x329                 1
+ UP bnd       x330                 1
+ UP bnd       x331                 1
+ UP bnd       x332                 1
+ UP bnd       x333                 1
+ UP bnd       x334                 1
+ UP bnd       x335                 1
+ UP bnd       x336                 1
+ UP bnd       x337                 1
+ UP bnd       x338                 1
+ UP bnd       x339                 1
+ UP bnd       x340                 1
+ UP bnd       x341                 1
+ UP bnd       x342                 1
+ UP bnd       x343                 1
+ UP bnd       x344                 1
+ UP bnd       x345                 1
+ UP bnd       x346                 1
+ UP bnd       x347                 1
+ UP bnd       x348                 1
+ UP bnd       x349                 1
+ UP bnd       x350                 1
+ UP bnd       x351                 1
+ UP bnd       x352                 1
+ UP bnd       x353                 1
+ UP bnd       x354                 1
+ UP bnd       x355                 1
+ UP bnd       x356                 1
+ UP bnd       x357                 1
+ UP bnd       x358                 1
+ UP bnd       x359                 1
+ UP bnd       x360                 1
+ UP bnd       x361                 1
+ UP bnd       x362                 1
+ UP bnd       x363                 1
+ UP bnd       x364                 1
+ UP bnd       x365                 1
+ UP bnd       x366                 1
+ UP bnd       x367                 1
+ UP bnd       x368                 1
+ UP bnd       x369                 1
+ UP bnd       x370                 1
+ UP bnd       x371                 1
+ UP bnd       x372                 1
+ UP bnd       x373                 1
+ UP bnd       x374                 1
+ UP bnd       x375                 1
+ UP bnd       x376                 1
+ UP bnd       x377                 1
+ UP bnd       x378                 1
+ UP bnd       x379                 1
+ UP bnd       x380                 1
+ UP bnd       x381                 1
+ UP bnd       x382                 1
+ UP bnd       x383                 1
+ UP bnd       x384                 1
+ UP bnd       x385                 1
+ UP bnd       x386                 1
+ UP bnd       x387                 1
+ UP bnd       x388                 1
+ UP bnd       x389                 1
+ UP bnd       x390                 1
+ UP bnd       x391                 1
+ UP bnd       x392                 1
+ UP bnd       x393                 1
+ UP bnd       x394                 1
+ UP bnd       x395                 1
+ UP bnd       x396                 1
+ UP bnd       x397                 1
+ UP bnd       x398                 1
+ UP bnd       x399                 1
+ UP bnd       x400                 1
+ UP bnd       x401                 1
+ UP bnd       x402                 1
+ UP bnd       x403                 1
+ UP bnd       x404                 1
+ UP bnd       x405                 1
+ UP bnd       x406                 1
+ UP bnd       x407                 1
+ UP bnd       x408                 1
+ UP bnd       x409                 1
+ UP bnd       x410                 1
+ UP bnd       x411                 1
+ UP bnd       x412                 1
+ UP bnd       x413                 1
+ UP bnd       x414                 1
+ UP bnd       x415                 1
+ UP bnd       x416                 1
+ UP bnd       x417                 1
+ UP bnd       x418                 1
+ UP bnd       x419                 1
+ UP bnd       x420                 1
+ UP bnd       x421                 1
+ UP bnd       x422                 1
+ UP bnd       x423                 1
+ UP bnd       x424                 1
+ UP bnd       x425                 1
+ UP bnd       x426                 1
+ UP bnd       x427                 1
+ UP bnd       x428                 1
+ UP bnd       x429                 1
+ UP bnd       x430                 1
+ UP bnd       x431                 1
+ UP bnd       x432                 1
+ UP bnd       x433                 1
+ UP bnd       x434                 1
+ UP bnd       x435                 1
+ UP bnd       x436                 1
+ UP bnd       x437                 1
+ UP bnd       x438                 1
+ UP bnd       x439                 1
+ UP bnd       x440                 1
+ UP bnd       x441                 1
+ UP bnd       x442                 1
+ UP bnd       x443                 1
+ UP bnd       x444                 1
+ UP bnd       x445                 1
+ UP bnd       x446                 1
+ UP bnd       x447                 1
+ UP bnd       x448                 1
+ UP bnd       x449                 1
+ UP bnd       x450                 1
+ UP bnd       x451                 1
+ UP bnd       x452                 1
+ UP bnd       x453                 1
+ UP bnd       x454                 1
+ UP bnd       x455                 1
+ UP bnd       x456                 1
+ UP bnd       x457                 1
+ UP bnd       x458                 1
+ UP bnd       x459                 1
+ UP bnd       x460                 1
+ UP bnd       x461                 1
+ UP bnd       x462                 1
+ UP bnd       x463                 1
+ UP bnd       x464                 1
+ UP bnd       x465                 1
+ UP bnd       x466                 1
+ UP bnd       x467                 1
+ UP bnd       x468                 1
+ UP bnd       x469                 1
+ UP bnd       x470                 1
+ UP bnd       x471                 1
+ UP bnd       x472                 1
+ UP bnd       x473                 1
+ UP bnd       x474                 1
+ UP bnd       x475                 1
+ UP bnd       x476                 1
+ UP bnd       x477                 1
+ UP bnd       x478                 1
+ UP bnd       x479                 1
+ UP bnd       x480                 1
+ UP bnd       x481                 1
+ UP bnd       x482                 1
+ UP bnd       x483                 1
+ UP bnd       x484                 1
+ UP bnd       x485                 1
+ UP bnd       x486                 1
+ UP bnd       x487                 1
+ UP bnd       x488                 1
+ UP bnd       x489                 1
+ UP bnd       x490                 1
+ UP bnd       x491                 1
+ UP bnd       x492                 1
+ UP bnd       x493                 1
+ UP bnd       x494                 1
+ UP bnd       x495                 1
+ UP bnd       x496                 1
+ UP bnd       x497                 1
+ UP bnd       x498                 1
+ UP bnd       x499                 1
+ UP bnd       x500                 1
+ UP bnd       x501                 1
+ UP bnd       x502                 1
+ UP bnd       x503                 1
+ UP bnd       x504                 1
+ UP bnd       x505                 1
+ UP bnd       x506                 1
+ UP bnd       x507                 1
+ UP bnd       x508                 1
+ UP bnd       x509                 1
+ UP bnd       x510                 1
+ UP bnd       x511                 1
+ UP bnd       x512                 1
+ UP bnd       x513                 1
+ UP bnd       x514                 1
+ UP bnd       x515                 1
+ UP bnd       x516                 1
+ UP bnd       x517                 1
+ UP bnd       x518                 1
+ UP bnd       x519                 1
+ UP bnd       x520                 1
+ UP bnd       x521                 1
+ UP bnd       x522                 1
+ UP bnd       x523                 1
+ UP bnd       x524                 1
+ UP bnd       x525                 1
+ UP bnd       x526                 1
+ UP bnd       x527                 1
+ UP bnd       x528                 1
+ UP bnd       x529                 1
+ UP bnd       x530                 1
+ UP bnd       x531                 1
+ UP bnd       x532                 1
+ UP bnd       x533                 1
+ UP bnd       x534                 1
+ UP bnd       x535                 1
+ UP bnd       x536                 1
+ UP bnd       x537                 1
+ UP bnd       x538                 1
+ UP bnd       x539                 1
+ UP bnd       x540                 1
+ UP bnd       x541                 1
+ UP bnd       x542                 1
+ UP bnd       x543                 1
+ UP bnd       x544                 1
+ UP bnd       x545                 1
+ UP bnd       x546                 1
+ UP bnd       x547                 1
+ UP bnd       x548                 1
+ UP bnd       x549                 1
+ UP bnd       x550                 1
+ UP bnd       x551                 1
+ UP bnd       x552                 1
+ UP bnd       x553                 1
+ UP bnd       x554                 1
+ UP bnd       x555                 1
+ UP bnd       x556                 1
+ENDATA
diff --git a/demos/ppl_lpsol/expected_int16 b/demos/ppl_lpsol/expected_int16
index def7b7f..935a6ec 100644
--- a/demos/ppl_lpsol/expected_int16
+++ b/demos/ppl_lpsol/expected_int16
@@ -1,79 +1,993 @@
-*** ppl_lpsol -e -m -oobtained afiro.mps
-*** ppl_lpsol -e -M -oobtained afiro.mps
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-*** ppl_lpsol -e -m -oobtained ex1.mps
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained opt1217.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -M -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -r -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained opt1217.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
-Optimum value: -3.75
-Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
-*** ppl_lpsol -s -M -oobtained mip.mps
-*** ppl_lpsol -s -m -oobtained sample.mps
-Optimum value: -733.3333333
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
-Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int16_a b/demos/ppl_lpsol/expected_int16_a
index 3b5becc..e702d59 100644
--- a/demos/ppl_lpsol/expected_int16_a
+++ b/demos/ppl_lpsol/expected_int16_a
@@ -1,67 +1,201 @@
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-x1 = 2.5
+x1 = 2
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-*** ppl_lpsol -e -M -oobtained sample.mps
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -M -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
-*** ppl_lpsol -s -M -oobtained mip.mps
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -r -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int32 b/demos/ppl_lpsol/expected_int32
index 7017f87..adad8a2 100644
--- a/demos/ppl_lpsol/expected_int32
+++ b/demos/ppl_lpsol/expected_int32
@@ -1,98 +1,993 @@
-*** ppl_lpsol -e -m -oobtained afiro.mps
-*** ppl_lpsol -e -M -oobtained afiro.mps
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained opt1217.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-x1 = 2.5
+x1 = 2
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-Optimum value: -733.3333333
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
-x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
-Optimum value: 0
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
 Optimum location:
-x1 = 0
-x2 = 0
-x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
 Optimum value: 24.07692308
 Optimum location:
 X1 = 2.615384615
 X2 = 2
 X3 = 0.7692307692
 X4 = 3
-*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -r -s -M -oobtained mip.mps
 Optimum value: 46.42857143
 Optimum location:
 X1 = 4
 X2 = 4.571428571
 X3 = 0.5714285714
 X4 = 3
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained opt1217.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int32_a b/demos/ppl_lpsol/expected_int32_a
index c147817..1c4bb38 100644
--- a/demos/ppl_lpsol/expected_int32_a
+++ b/demos/ppl_lpsol/expected_int32_a
@@ -1,96 +1,205 @@
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-x1 = 2.5
+x1 = 2
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-Optimum value: -733.3333333
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
-x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
-Optimum value: 0
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
 Optimum location:
-x1 = 0
-x2 = 0
-x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
 Optimum value: 24.07692308
 Optimum location:
 X1 = 2.615384615
 X2 = 2
 X3 = 0.7692307692
 X4 = 3
-*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -r -s -M -oobtained mip.mps
 Optimum value: 46.42857143
 Optimum location:
 X1 = 4
 X2 = 4.571428571
 X3 = 0.5714285714
 X4 = 3
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int64 b/demos/ppl_lpsol/expected_int64
index 7017f87..fec56d5 100644
--- a/demos/ppl_lpsol/expected_int64
+++ b/demos/ppl_lpsol/expected_int64
@@ -1,98 +1,1989 @@
-*** ppl_lpsol -e -m -oobtained afiro.mps
-*** ppl_lpsol -e -M -oobtained afiro.mps
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Unknown result due to positive overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained noswot.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained opt1217.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-x1 = 2.5
+x1 = 2
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-Optimum value: -733.3333333
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
-x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
-Optimum value: 0
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
 Optimum location:
-x1 = 0
-x2 = 0
-x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ppl_lpsol -s -M -oobtained p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0
+C132 = 0
+C133 = 1
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Unknown result due to positive overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Unknown result due to positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
 Optimum value: 24.07692308
 Optimum location:
 X1 = 2.615384615
 X2 = 2
 X3 = 0.7692307692
 X4 = 3
-*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -r -s -M -oobtained mip.mps
 Optimum value: 46.42857143
 Optimum location:
 X1 = 4
 X2 = 4.571428571
 X3 = 0.5714285714
 X4 = 3
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained opt1217.mps
+Optimum value: -20.02139037
+Optimum location:
+x1 = 20.02139037
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 1
+x36 = 0.003565062389
+x37 = 1
+x38 = 0
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 1
+x66 = 0.679144385
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 1
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0.3262032086
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 1
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0.3368983957
+x124 = 1
+x125 = 1
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0.3368983957
+x164 = 1
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 1
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 1
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0.4812834225
+x193 = 0
+x194 = 1
+x195 = 1
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0.8556149733
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 0
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 0
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0
+x250 = 0
+x251 = 0
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 0.3368983957
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 1
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0.6631016043
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0.6737967914
+x315 = 0
+x316 = 0
+x317 = 1
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0.1443850267
+x343 = 1
+x344 = 0
+x345 = 1
+x346 = 0.3943850267
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 1
+x403 = 1
+x404 = 1
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0.3368983957
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 0
+x430 = 0
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 0
+x455 = 0
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 1
+x465 = 0
+x466 = 0.6631016043
+x467 = 0.8395721925
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 1
+x493 = 0
+x494 = 0
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 0
+x505 = 0
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0.4527629234
+x516 = 1
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0.6631016043
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 1
+x527 = 0
+x528 = 1
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 0
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0.5026737968
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 1
+x583 = 0
+x584 = 0.6056149733
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 0
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 0
+x595 = 0
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0.1960784314
+x602 = 1
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0.5187165775
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0.320855615
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 1
+x643 = 0
+x644 = 0.6631016043
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 0
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 0
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 1
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 1
+x671 = 0
+x672 = 0.5026737968
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 0
+x697 = 0
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 0
+x706 = 0
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0.4973262032
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0.8039215686
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0.9964349376
+x748 = 0
+x749 = 0
+x750 = 0
+x751 = 0
+x752 = 0.1604278075
+x753 = 0.04456327986
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 0
+x761 = 0
+x762 = 0
+x763 = 0
+x764 = 0
+x765 = 0
+x766 = 0
+x767 = 0
+x768 = 0
+x769 = 0
+*** ppl_lpsol -r -s -M -oobtained opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 1
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 1
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 1
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 1
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 1
+x131 = 0
+x132 = 0
+x133 = 1
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 1
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 1
+x221 = 0
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 1
+x228 = 1
+x229 = 0
+x230 = 0
+x231 = 1
+x232 = 0
+x233 = 1
+x234 = 1
+x235 = 0
+x236 = 0
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 1
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 0
+x430 = 0
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 0
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 0
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 0
+x505 = 0
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 0
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 0
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 0
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 0
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 0
+x697 = 0
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 0
+x706 = 0
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 0
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int64_a b/demos/ppl_lpsol/expected_int64_a
index c147817..d46534d 100644
--- a/demos/ppl_lpsol/expected_int64_a
+++ b/demos/ppl_lpsol/expected_int64_a
@@ -1,96 +1,431 @@
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Unknown result due to positive overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-x1 = 2.5
+x1 = 2
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-Optimum value: -733.3333333
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
-x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
-Optimum value: 0
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
 Optimum location:
-x1 = 0
-x2 = 0
-x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ppl_lpsol -s -M -oobtained p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0.3428571429
+C132 = 0
+C133 = 0.6571428571
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Unknown result due to positive overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Unknown result due to positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
 Optimum value: 24.07692308
 Optimum location:
 X1 = 2.615384615
 X2 = 2
 X3 = 0.7692307692
 X4 = 3
-*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -r -s -M -oobtained mip.mps
 Optimum value: 46.42857143
 Optimum location:
 X1 = 4
 X2 = 4.571428571
 X3 = 0.5714285714
 X4 = 3
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int8 b/demos/ppl_lpsol/expected_int8
index 08d6efc..4d11bed 100644
--- a/demos/ppl_lpsol/expected_int8
+++ b/demos/ppl_lpsol/expected_int8
@@ -1,56 +1,186 @@
-*** ppl_lpsol -e -m -oobtained afiro.mps
-*** ppl_lpsol -e -M -oobtained afiro.mps
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-*** ppl_lpsol -e -m -oobtained ex1.mps
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained opt1217.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ppl_lpsol -s -m -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -M -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -m -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-*** ppl_lpsol -e -M -oobtained sample.mps
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained opt1217.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained opt1217.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained rout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
-*** ppl_lpsol -s -M -oobtained ex1.mps
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
-*** ppl_lpsol -s -M -oobtained mip.mps
-*** ppl_lpsol -s -m -oobtained sample.mps
-*** ppl_lpsol -s -M -oobtained sample.mps
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
-Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int8_a b/demos/ppl_lpsol/expected_int8_a
index 4cbf25d..0b1af35 100644
--- a/demos/ppl_lpsol/expected_int8_a
+++ b/demos/ppl_lpsol/expected_int8_a
@@ -1,54 +1,168 @@
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-*** ppl_lpsol -e -m -oobtained ex1.mps
+*** ppl_lpsol -s -n  -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ppl_lpsol -s -m -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -M -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -s -m -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained blend.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-*** ppl_lpsol -e -M -oobtained sample.mps
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained mip.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
-*** ppl_lpsol -s -M -oobtained adlittle.mps
-*** ppl_lpsol -s -m -oobtained afiro.mps
-*** ppl_lpsol -s -M -oobtained afiro.mps
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
-*** ppl_lpsol -s -m -oobtained blend.mps
-*** ppl_lpsol -s -M -oobtained blend.mps
-*** ppl_lpsol -s -m -oobtained boeing1.mps
-*** ppl_lpsol -s -M -oobtained boeing1.mps
-*** ppl_lpsol -s -m -oobtained boeing2.mps
-*** ppl_lpsol -s -M -oobtained boeing2.mps
-*** ppl_lpsol -s -m -oobtained ex1.mps
-*** ppl_lpsol -s -M -oobtained ex1.mps
-*** ppl_lpsol -s -m -oobtained kb2.mps
-*** ppl_lpsol -s -M -oobtained kb2.mps
-*** ppl_lpsol -s -m -oobtained mip.mps
-*** ppl_lpsol -s -M -oobtained mip.mps
-*** ppl_lpsol -s -m -oobtained sample.mps
-*** ppl_lpsol -s -M -oobtained sample.mps
-*** ppl_lpsol -s -m -oobtained sc105.mps
-*** ppl_lpsol -s -M -oobtained sc105.mps
-*** ppl_lpsol -s -m -oobtained sc50a.mps
-*** ppl_lpsol -s -M -oobtained sc50a.mps
-*** ppl_lpsol -s -m -oobtained sc50b.mps
-*** ppl_lpsol -s -M -oobtained sc50b.mps
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
-Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas74.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained mas76.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -n -s -oobtained modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_mpz b/demos/ppl_lpsol/expected_mpz
index 4b5e468..65abc71 100644
--- a/demos/ppl_lpsol/expected_mpz
+++ b/demos/ppl_lpsol/expected_mpz
@@ -1,209 +1,135 @@
-*** ppl_lpsol -e -m -oobtained afiro.mps
-Optimum value: -464.7531429
+*** ppl_lpsol -s -n  -oobtained egout.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained noswot.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained opt1217.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained pk1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained rout.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-X01 = 80
-X02 = 25.5
-X03 = 54.5
-X04 = 84.8
-X06 = 18.21428571
-X07 = 0
-X08 = 0
-X09 = 0
-X10 = 0
-X11 = 0
-X12 = 0
-X13 = 0
-X14 = 18.21428571
-X15 = 0
-X16 = 19.30714286
-X22 = 500
-X23 = 475.92
-X24 = 24.08
-X25 = 0
-X26 = 215
-X28 = 0
-X29 = 0
-X30 = 0
-X31 = 0
-X32 = 0
-X33 = 0
-X34 = 0
-X35 = 0
-X36 = 339.9428571
-X37 = 383.9428571
-X38 = 0
-X39 = 0
-*** ppl_lpsol -e -M -oobtained afiro.mps
-Optimum value: 3438.2921
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-X01 = 54.5
-X02 = 0
-X03 = 54.5
-X04 = 57.77
-X06 = 0
-X07 = 0
-X08 = 0
-X09 = 0
-X10 = 0
-X11 = 0
-X12 = 0
-X13 = 0
-X14 = 0
-X15 = 0
-X16 = 0
-X22 = 500
-X23 = 483.5955
-X24 = 16.4045
-X25 = 0
-X26 = 215
-X28 = 0
-X29 = 0
-X30 = 0
-X31 = 0
-X32 = 0
-X33 = 0
-X34 = 0
-X35 = 0
-X36 = 345.4253571
-X37 = 0
-X38 = 0
-X39 = 389.4253571
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+x1 = 2
+x2 = 0
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
 Optimum location:
-x1 = 2.5
-x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-Optimum value: -733.3333333
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+Optimum value: 3089
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
-x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
-Optimum value: 0
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ppl_lpsol -s -M -oobtained p0033.mps
+Optimum value: 5201
 Optimum location:
-x1 = 0
-x2 = 0
-x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
 Optimum value: 225494.9632
-Optimum location:
-...100 = 22.85454545
-...101 = 0.5454545455
-...102 = 4.62693727
-...103 = 0
-...104 = 0
-...105 = 35.10714286
-...106 = 4.793014706
-...107 = 2.942801288
-...108 = 0
-...109 = 44.40554954
-...110 = 0
-...111 = 9.884315099
-...112 = 0
-...113 = 0
-...114 = 108
-...115 = 0
-...116 = 0
-...117 = 0
-...118 = 0
-...119 = 0
-...120 = 13
-...121 = 0
-...122 = 0
-...123 = 0
-...124 = 73.92849567
-...125 = 51.29498565
-...126 = 139.7765187
-...127 = 0
-...128 = 0
-...129 = 109.3391662
-...130 = 3.803724425
-...131 = 3.920125575
-...132 = 134
-...133 = 0
-...134 = 0
-...135 = 0
-...136 = 31
-...137 = 0
-...138 = 0
-...139 = 0
-...140 = 0
-...141 = 60
-...142 = 111.7272727
-...143 = 0
-...144 = 51.90909091
-...145 = 29.86330761
-...146 = 4.136692391
-...147 = 0
-...148 = 0
-...149 = 41.5
-...150 = 0
-...151 = 15.4788166
-...152 = 0
-...153 = 15
-...154 = 0
-...155 = 0
-...156 = 3.1
-...157 = 0
-...158 = 0.6909090909
-...159 = 0
-...160 = 0
-...161 = 175.4447167
-...162 = 0
-...163 = 9.806141065
-...164 = 0
-...165 = 0
-...166 = 33.46836966
-...167 = 9.531630344
-...168 = 10.29307503
-...169 = 8.906924975
-...170 = 0
-...171 = 0
-...172 = 6.1
-...173 = 0
-...174 = 9.792857143
-...175 = 313.1973528
-...176 = 55.43167804
-...177 = 264.5552833
-...178 = 0
-...179 = 13.2
-...180 = 0
-...181 = 1.314479773
-...182 = 0.5032608696
-...183 = 0
-...184 = 0
-...185 = 0
-...186 = 0
-...187 = 0
-...188 = 0
-...189 = 0
-...190 = 0
-...191 = 13.5
-...192 = 8.737073136
-...193 = 0
-...194 = 31.2
-...195 = 0
-...196 = 0
-*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
 Unbounded problem.
-*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
 Optimum value: -464.7531429
 Optimum location:
 X01 = 80
@@ -238,7 +164,7 @@ X36 = 339.9428571
 X37 = 17.50496094
 X38 = 157.5682954
 X39 = 0
-*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
 Optimum value: 3438.2921
 Optimum location:
 X01 = 54.5
@@ -273,11 +199,11 @@ X36 = 345.4253571
 X37 = 0
 X38 = 0
 X39 = 389.4253571
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
 Unfeasible problem.
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
 Unfeasible problem.
-*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -r -s -m -oobtained blend.mps
 Optimum value: -30.81214985
 Optimum location:
 1 = 20.94480195
@@ -300,8 +226,8 @@ Optimum location:
 18 = 2.173256964
 19 = 2.018559906
 20 = 4.843256964
-21 = 0
-22 = 3.13818313
+21 = 3.079217438
+22 = 0.05896569207
 23 = 1.149909949
 24 = 1.396291081
 25 = 0
@@ -340,8 +266,8 @@ Optimum location:
 58 = 0
 59 = 0
 60 = 0
-61 = 3.079217438
-62 = 0.795583754
+61 = 0
+62 = 3.874801192
 63 = 3.874801192
 64 = 0.7749576722
 65 = 1.83076589
@@ -363,1085 +289,315 @@ Optimum location:
 81 = 0.8033012352
 82 = 26.03036862
 83 = 87.09497412
-*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -r -s -M -oobtained blend.mps
 Unbounded problem.
-*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
 Optimum value: -335.2135675
-Optimum location:
-PBOSHNL0 = 0
-PBOSHNL1 = 12
-PBOSHNL7 = 0
-PBOSHNL8 = 0
-PBOSLAX0 = 14
-PBOSLAX1 = 0
-PBOSLAX7 = 0
-PBOSSEA0 = 0
-PBOSSEA1 = 0
-PBOSSEA2 = 49
-PBOSSFO0 = 73
-PBOSSFO1 = 60
-PBOSTPE1 = 1
-PBOSTPE2 = 0
-PBOSTYO1 = 3
-PBOSTYO2 = 0
-PBOSYUL0 = 28.13380282
-PBOSYUL1 = 347.7678621
-PBOSYUL2 = 0.325
-PBOSYUL3 = 336.7733351
-PBOSYUL4 = 0
-PBOSYVR0 = 0
-PBOSYVR1 = 0
-PBOSYVR2 = 26
-PBOSYWG0 = 0
-PBOSYWG1 = 0
-PBOSYWG7 = 37
-PBOSYYZ0 = 19.03169014
-PBOSYYZ1 = 195.9683099
-PBUROAK0 = 11
-PBUROAK1 = 16
-PBURSEA0 = 83
-PBURSEA1 = 0
-PBURSFO0 = 278
-PHNLLAX0 = 104.0482353
-PHNLLAX1 = 33.04
-PHNLLAX2 = 68.20588235
-PHNLLAX3 = 98
-PHNLLON0 = 0
-PHNLLON6 = 5
-PHNLPAR0 = 0
-PHNLPAR6 = 1
-PHNLSEA0 = 0
-PHNLSEA1 = 157.7943925
-PHNLSEA2 = 0
-PHNLSFO0 = 35
-PHNLSFO1 = 0
-PHNLSFO7 = 0
-PHNLYVR0 = 94.20560748
-PHNLYVR1 = 0
-PHNLYVR7 = 39.79439252
-PLASSEA0 = 33.01327253
-PLASSEA1 = 342.9867275
-PLASYVR0 = 37
-PLASYVR6 = 0
-PLAXOAK0 = 32
-PLAXOAK1 = 0
-PLAXOAK2 = 46
-PLAXSEA0 = 0
-PLAXSEA1 = 0
-PLAXSEA2 = 0
-PLAXSEA3 = 546.0147059
-PLAXSEA4 = 3.720588235
-PLAXSEA5 = 139
-PLAXSEA6 = 66.26744186
-PLAXSEA7 = 0
-PLAXSEA8 = 75
-PLAXSEA9 = 5.415868673
-PLAXSFO0 = 33.04
-PLAXSFO1 = 260.8488372
-PLAXSFO2 = 839.9632721
-PLAXSFO3 = 87.90697674
-PLAXSFO4 = 168
-PLAXSFO5 = 98
-PLAXSFO6 = 1464.240914
-PLAXTPE0 = 8.581395349
-PLAXTPE1 = 0
-PLAXTPE2 = 0
-PLAXTPE8 = 22.41860465
-PLAXTYO0 = 41
-PLAXTYO1 = 0
-PLAXTYO2 = 0
-PLAXTYO8 = 0
-PLAXYVR0 = 0
-PLAXYVR1 = 153.755814
-PLAXYVR2 = 39.24418605
-PLONPAR0 = 0
-PLONPAR1 = 0
-PLONPAR2 = 2
-PLONSEA0 = 0
-PLONSEA1 = 151
-PLONYVR0 = 0
-PLONYVR1 = 0
-PLONYVR7 = 51
-POAKONT0 = 0
-POAKONT1 = 13
-POAKSEA0 = 37.89108456
-POAKSEA1 = 77.15303309
-POAKSEA2 = 6.955882353
-PONTSFO0 = 177
-PONTSEA0 = 23.10431985
-PONTSEA1 = 24.89568015
-PONTSEA2 = 0
-PPARSEA0 = 0
-PPARSEA1 = 68
-PPARYVR0 = 0
-PPARYVR1 = 0
-PPARYVR7 = 24
-PRNOSEA0 = 0
-PRNOSEA1 = 291
-PRNOYVR0 = 67
-PSEASFO0 = 0
-PSEASFO1 = 839.9632721
-PSEASFO2 = 146.6809139
-PSEASFO3 = 236.6
-PSEASFO4 = 0
-PSEASFO5 = 50.75581395
-PSEASFO6 = 145
-PSEATPE0 = 75.80232558
-PSEATPE1 = 0
-PSEATPE2 = 0
-PSEATPE3 = 1.61627907
-PSEATYO0 = 0
-PSEATYO1 = 0
-PSEATYO2 = 0
-PSEATYO3 = 138
-PSEAYVR0 = 164.8598131
-PSEAYVR1 = 0
-PSEAYVR2 = 0
-PSEAYVR3 = 392
-PSEAYVR4 = 0
-PSEAYVR5 = 33.01327253
-PSEAYVR6 = 0
-PSEAYVR7 = 50.75581395
-PSEAYVR8 = 47.16549296
-PSFOTPE0 = 0
-PSFOTPE1 = 0
-PSFOTPE2 = 6
-PSFOTPE8 = 0
-PSFOTYO0 = 0
-PSFOTYO1 = 0
-PSFOTYO2 = 17
-PSFOTYO8 = 0
-PSFOYVR0 = 260.8488372
-PSFOYVR1 = 37.15116279
-PTPETYO0 = 51.01162791
-PTPETYO1 = 0
-PTPETYO2 = 59.98837209
-PTPETYO3 = 0
-PTPEYVR0 = 57
-PTYOYVR0 = 91
-PYULYVR0 = 36.4084507
-PYULYVR1 = 134.1343917
-PYULYVR2 = 139.6904909
-PYULYVR3 = 4.766666667
-PYULYWG0 = 0
-PYULYWG1 = 271.3172923
-PYULYWG2 = 0
-PYULYWG3 = 178.6827077
-PYULYYZ0 = 0
-PYULYYZ1 = 266.6818464
-PYULYYZ2 = 0
-PYULYYZ3 = 431.9057717
-PYULYYZ4 = 1913.412382
-PYVRYWG0 = 14.67957746
-PYVRYWG1 = 271.3172923
-PYVRYWG2 = 138.0031303
-PYVRYYZ0 = 4.352112676
-PYVRYYZ1 = 241.2835753
-PYVRYYZ2 = 126.3643121
-PYWGYYZ0 = 14.67957746
-PYWGYYZ1 = 138.0031303
-PYWGYYZ2 = 0
-PYWGYYZ3 = 125.3172923
-PBOSOAK0 = 11
-PBOSOAK6 = 0
-PBOSBUR1 = 7
-PBOSBUR2 = 0
-PBOSONT1 = 4
-PBOSONT2 = 0
-PBURYVR1 = 26
-PBURTYO1 = 2
-PBURTPE1 = 1
-PBURHNL0 = 11
-PBURHNL6 = 0
-PHNLOAK0 = 0
-PHNLOAK1 = 24
-PHNLOAK2 = 0
-PHNLOAK8 = 0
-PHNLONT0 = 9.705882353
-PHNLONT6 = 6.294117647
-PHNLYWG1 = 3
-PHNLYYZ1 = 24
-PHNLYUL1 = 40
-PLASTYO1 = 5
-PLASTPE1 = 1
-PLAXLON0 = 13
-PLAXLON6 = 0
-PLAXLON7 = 0
-PLAXPAR0 = 8
-PLAXPAR6 = 0
-PLAXPAR7 = 0
-PBURLON1 = 1
-PBURPAR1 = 1
-PLONONT1 = 1
-PLONOAK1 = 1
-POAKPAR1 = 2
-POAKTYO1 = 7
-POAKTPE1 = 2
-PONTPAR1 = 2
-PONTTYO1 = 2
-PONTTPE1 = 1
-PPARSFO1 = 2
-PRNOTYO1 = 5
-PRNOTPE1 = 2
-PTPEYWG1 = 21
-PTPEYYZ1 = 13
-PTPEYUL1 = 6
-PTYOYUL1 = 7
-PTYOYYZ1 = 17
-PTYOYWG1 = 25
-PLAXONT0 = 6.294117647
-GRDTIMO1 = 0
-GRDTIMN1 = -49.01286158
-GRDTIMO2 = 0
-GRDTIMN2 = 0
-GRDTIMO3 = 0
-GRDTIMN3 = -47
-GRDTIMO4 = 0
-GRDTIMN4 = 0
-GRDTIMO5 = 0
-GRDTIMN5 = -47.24353963
-GRDTIMO6 = 0
-GRDTIMN6 = -81
-N1001AC1 = 0
-N1001AC2 = 0
-N1001AC3 = 0
-N1002AC1 = 0
-N1002AC2 = 0
-N1002AC3 = 2.355140187
-N1003AC1 = 0
-N1003AC2 = 0.1603208556
-N1003AC3 = 0.7214438503
-N1004AC1 = 0.28
-N1004AC2 = 0
-N1004AC3 = 0
-N1005AC3 = 0.0859375
-N1105AC3 = 0.8382352941
-N1006AC3 = 0.07582720588
-N1007AC1 = 0
-N1007AC2 = 0
-N1007AC3 = 0
-N1008AC1 = 0
-N1008AC2 = 0
-N1008AC3 = 0
-N1008AC4 = 0
-N1008AC5 = 0
-N1008AC6 = 4.65801495
-N1009AC1 = 0
-N1009AC2 = 0.07488107822
-N1009AC3 = 0
-N1009AC4 = 0
-N1009AC5 = 1.921947674
-N1010AC1 = 0
-N1010AC2 = 0
-N1010AC3 = 0
-N1010AC4 = 0
-N1010AC5 = 0
-N1010AC6 = 7
-N1011AC1 = 0
-N1011AC2 = 3.085065997
-N1011AC3 = 0.6951730225
-N1011AC4 = 0
-N1011AC5 = 3.897217245
-N1011AC6 = 0
-N1012AC1 = 1.510832058
-N1012AC2 = 0
-N1012AC3 = 0
-N1012AC4 = 0
-N1012AC5 = 2.417331293
-N1013AC3 = 0
-N1013AC4 = 0
-N1013AC5 = 0
-N1013AC6 = 0.9241727941
-N1014AC3 = 0
-N1014AC4 = 0
-N1014AC5 = 1.691245404
-N1014AC6 = 0.2228170956
-N1015AC3 = 0
-N1015AC4 = 0.7048194146
-N1015AC5 = 0.1595430366
-N1015AC6 = 2.135637549
-N1016AC3 = 0
-N1016AC4 = 0
-N1016AC5 = 0.7
-N1016AC6 = 3.3
-N1017AC3 = 0
-N1017AC4 = 0
-N1017AC5 = 0
-N1017AC6 = 0.1617647059
-N1018AC1 = 0
-N1018AC2 = 0
-N1018AC3 = 0
-N1018AC4 = 0
-N1018AC5 = 0
-N1018AC6 = 1.196428571
-N1019AC1 = 0
-N1019AC2 = 0
-N1019AC3 = 0
-N1019AC4 = 0.2345133807
-N1019AC5 = 0.7654866193
-N1020AC1 = 0.2228332753
-N1020AC2 = 0
-N1020AC3 = 0
-N1020AC4 = 0
-N1020AC5 = 3.200696136
-N1020AC6 = 0
-N1021AC1 = 0.664202377
-N1021AC2 = 0
-N1021AC3 = 0
-N1021AC4 = 0
-N1021AC5 = 2.453858782
-N1022AC1 = 0
-N1023AC1 = 0
-N1026AC1 = 1
-N1027AC1 = 0.476744186
-N1028AC1 = 0
-N1029AC1 = 0.523255814
-N1030AC1 = 1
-N1032AC1 = 0
-N1032AC2 = 0
-N1032AC3 = 0
-N1032AC4 = 0.8274647887
-N1032AC5 = 0
-N1033AC1 = 0.4860357966
-N1033AC2 = 0.500476922
-N1033AC3 = 0
-N1033AC4 = 0
-N1033AC5 = 2.061996183
-N1034AC1 = 0
-N1034AC2 = 0
-N1034AC3 = 3.174783885
-N1035AC1 = 0.6827679474
-N1035AC2 = 0
-N1035AC3 = 0
-N1035AC4 = 0.7269371829
-N1035AC5 = 0.2529831862
-N1036AC1 = 0.1083333333
-N1036AC2 = 0
-N1036AC3 = 0
-N1037AC4 = 0
-N1037AC5 = 0
-N1038AC4 = 0.2383968781
-N1038AC5 = 1.271450017
-N1039AC4 = 0
-N1039AC5 = 2.077705904
-N1040AC4 = 0
-N1040AC5 = 0
-N1040AC6 = 9.513243659
-N1041AC4 = 8.856901224
-N1041AC5 = 0
-N1041AC6 = 20
-N1042AC4 = 0
-N1042AC5 = 0
-N1042AC6 = 0
-N1043AC1 = 0.1725352113
-N1043AC2 = 0
-N1043AC3 = 0
-N1044AC1 = 0
-N1044AC2 = 0
-N1044AC3 = 1
-N1046AC3 = 1
-N1047AC1 = 0
-N1047AC2 = 0
-N1047AC3 = 1
-N1050AC3 = 0
-N1050AC4 = 0
-N1050AC5 = 0.0731874145
-N1051AC1 = 0
-N1051AC2 = 0
-N1051AC3 = 0
-N1051AC4 = 0
-N1051AC5 = 4.651904242
-N1051AC6 = 20
-*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
 Optimum value: 286.9746573
-Optimum location:
-PBOSHNL0 = 0
-PBOSHNL1 = 10
-PBOSHNL7 = 0
-PBOSHNL8 = 0
-PBOSLAX0 = 0
-PBOSLAX1 = 0
-PBOSLAX7 = 12
-PBOSSEA0 = 0
-PBOSSEA1 = 40
-PBOSSEA2 = 0
-PBOSSFO0 = 73
-PBOSSFO1 = 48
-PBOSTPE1 = 0
-PBOSTPE2 = 0
-PBOSTYO1 = 0
-PBOSTYO2 = 0
-PBOSYUL0 = 383.9469027
-PBOSYUL1 = 224.0530973
-PBOSYUL2 = 0
-PBOSYUL3 = 0
-PBOSYUL4 = 0
-PBOSYVR0 = 0
-PBOSYVR1 = 23
-PBOSYVR2 = 0
-PBOSYWG0 = 33
-PBOSYWG1 = 0
-PBOSYWG7 = 0
-PBOSYYZ0 = 0
-PBOSYYZ1 = 193
-PBUROAK0 = 9
-PBUROAK1 = 15
-PBURSEA0 = 69
-PBURSEA1 = 0
-PBURSFO0 = 243
-PHNLLAX0 = 0
-PHNLLAX1 = 126.296875
-PHNLLAX2 = 100.03125
-PHNLLAX3 = 104.4375
-PHNLLON0 = 0
-PHNLLON6 = 0
-PHNLPAR0 = 0
-PHNLPAR6 = 0
-PHNLSEA0 = 0
-PHNLSEA1 = 135.2523364
-PHNLSEA2 = 0
-PHNLSFO0 = 0
-PHNLSFO1 = 0
-PHNLSFO7 = 31
-PHNLYVR0 = 80.74766355
-PHNLYVR1 = 0
-PHNLYVR7 = 35.25233645
-PLASSEA0 = 365
-PLASSEA1 = 0
-PLASYVR0 = 0
-PLASYVR6 = 33
-PLAXOAK0 = 42.765625
-PLAXOAK1 = 0
-PLAXOAK2 = 46
-PLAXSEA0 = 295.96875
-PLAXSEA1 = 0
-PLAXSEA2 = 0
-PLAXSEA3 = 0
-PLAXSEA4 = 6
-PLAXSEA5 = 139
-PLAXSEA6 = 0
-PLAXSEA7 = 139
-PLAXSEA8 = 139
-PLAXSEA9 = 12.03125
-PLAXSFO0 = 164.828125
-PLAXSFO1 = 1090
-PLAXSFO2 = 0
-PLAXSFO3 = 20
-PLAXSFO4 = 68
-PLAXSFO5 = 144
-PLAXSFO6 = 1212.171875
-PLAXTPE0 = 0
-PLAXTPE1 = 18
-PLAXTPE2 = 9
-PLAXTPE8 = 0
-PLAXTYO0 = 0
-PLAXTYO1 = 9
-PLAXTYO2 = 27
-PLAXTYO8 = 0
-PLAXYVR0 = 116
-PLAXYVR1 = 0
-PLAXYVR2 = 57
-PLONPAR0 = 0
-PLONPAR1 = 0
-PLONPAR2 = 0
-PLONSEA0 = 0
-PLONSEA1 = 127
-PLONYVR0 = 0
-PLONYVR1 = 0
-PLONYVR7 = 45
-POAKONT0 = 0
-POAKONT1 = 11
-POAKSEA0 = 41
-POAKSEA1 = 57
-POAKSEA2 = 0
-PONTSFO0 = 155
-PONTSEA0 = 25
-PONTSEA1 = 12
-PONTSEA2 = 0
-PPARSEA0 = 0
-PPARSEA1 = 53
-PPARYVR0 = 0
-PPARYVR1 = 0
-PPARYVR7 = 21
-PRNOSEA0 = 255
-PRNOSEA1 = 0
-PRNOYVR0 = 60
-PSEASFO0 = 822
-PSEASFO1 = 0
-PSEASFO2 = 156
-PSEASFO3 = 224
-PSEASFO4 = 0
-PSEASFO5 = 20
-PSEASFO6 = 68
-PSEATPE0 = 0
-PSEATPE1 = 0
-PSEATPE2 = 42
-PSEATPE3 = 0
-PSEATYO0 = 0
-PSEATYO1 = 0
-PSEATYO2 = 117
-PSEATYO3 = 0
-PSEAYVR0 = 0
-PSEAYVR1 = 0
-PSEAYVR2 = 0
-PSEAYVR3 = 649.2523364
-PSEAYVR4 = 0
-PSEAYVR5 = 0
-PSEAYVR6 = 0
-PSEAYVR7 = 0
-PSEAYVR8 = 0
-PSFOTPE0 = 0
-PSFOTPE1 = 0
-PSFOTPE2 = 0
-PSFOTPE8 = 0
-PSFOTYO0 = 0
-PSFOTYO1 = 0
-PSFOTYO2 = 0
-PSFOTYO8 = 15
-PSFOYVR0 = 268
-PSFOYVR1 = 0
-PTPETYO0 = 0
-PTPETYO1 = 0
-PTPETYO2 = 99
-PTPETYO3 = 0
-PTPEYVR0 = 44
-PTYOYVR0 = 74
-PYULYVR0 = 182
-PYULYVR1 = 88
-PYULYVR2 = 0
-PYULYVR3 = 0
-PYULYWG0 = 161.3018868
-PYULYWG1 = 178
-PYULYWG2 = 31.69811321
-PYULYWG3 = 0
-PYULYYZ0 = 0
-PYULYYZ1 = 0
-PYULYYZ2 = 245.3018868
-PYULYYZ3 = 1997
-PYULYYZ4 = 107.6981132
-PYVRYWG0 = 194.3018868
-PYVRYWG1 = 178
-PYVRYWG2 = 4.698113208
-PYVRYYZ0 = 328.6981132
-PYVRYYZ1 = 0
-PYVRYYZ2 = 4.301886792
-PYWGYYZ0 = 0
-PYWGYYZ1 = 4.698113208
-PYWGYYZ2 = 245.3018868
-PYWGYYZ3 = 0
-PBOSOAK0 = 9
-PBOSOAK6 = 0
-PBOSBUR1 = 0
-PBOSBUR2 = 0
-PBOSONT1 = 0
-PBOSONT2 = 0
-PBURYVR1 = 23
-PBURTYO1 = 0
-PBURTPE1 = 0
-PBURHNL0 = 9
-PBURHNL6 = 0
-PHNLOAK0 = 0
-PHNLOAK1 = 2.234375
-PHNLOAK2 = 0
-PHNLOAK8 = 18.765625
-PHNLONT0 = 0
-PHNLONT6 = 14
-PHNLYWG1 = 0
-PHNLYYZ1 = 21
-PHNLYUL1 = 35
-PLASTYO1 = 0
-PLASTPE1 = 0
-PLAXLON0 = 11
-PLAXLON6 = 0
-PLAXLON7 = 0
-PLAXPAR0 = 0
-PLAXPAR6 = 0
-PLAXPAR7 = 0
-PBURLON1 = 0
-PBURPAR1 = 0
-PLONONT1 = 0
-PLONOAK1 = 0
-POAKPAR1 = 0
-POAKTYO1 = 0
-POAKTPE1 = 0
-PONTPAR1 = 0
-PONTTYO1 = 0
-PONTTPE1 = 0
-PPARSFO1 = 0
-PRNOTYO1 = 0
-PRNOTPE1 = 0
-PTPEYWG1 = 18
-PTPEYYZ1 = 11
-PTPEYUL1 = 0
-PTYOYUL1 = 0
-PTYOYYZ1 = 15
-PTYOYWG1 = 22
-PLAXONT0 = 14
-GRDTIMO1 = 0
-GRDTIMN1 = -105
-GRDTIMO2 = 0
-GRDTIMN2 = -91
-GRDTIMO3 = 0
-GRDTIMN3 = -47
-GRDTIMO4 = 0
-GRDTIMN4 = -43.5
-GRDTIMO5 = 0
-GRDTIMN5 = -87
-GRDTIMO6 = 0
-GRDTIMN6 = -81
-N1001AC1 = 0
-N1001AC2 = 0
-N1001AC3 = 0
-N1002AC1 = 0
-N1002AC2 = 2.018691589
-N1002AC3 = 0
-N1003AC1 = 0
-N1003AC2 = 0
-N1003AC3 = 0
-N1004AC1 = 0
-N1004AC2 = 1.0703125
-N1004AC3 = 0
-N1005AC3 = 0.0703125
-N1105AC3 = 0.9296875
-N1006AC3 = 0
-N1007AC1 = 0
-N1007AC2 = 0
-N1007AC3 = 0
-N1008AC1 = 5.28156777
-N1008AC2 = 0
-N1008AC3 = 1.986798017
-N1008AC4 = 0
-N1008AC5 = 0
-N1008AC6 = 0
-N1009AC1 = 0
-N1009AC2 = 0
-N1009AC3 = 0
-N1009AC4 = 0
-N1009AC5 = 0
-N1010AC1 = 7
-N1010AC2 = 7
-N1010AC3 = 7
-N1010AC4 = 7
-N1010AC5 = 7
-N1010AC6 = 7
-N1011AC1 = 0
-N1011AC2 = 0
-N1011AC3 = 0
-N1011AC4 = 0
-N1011AC5 = 0
-N1011AC6 = 0
-N1012AC1 = 0
-N1012AC2 = 0
-N1012AC3 = 0
-N1012AC4 = 0
-N1012AC5 = 0
-N1013AC3 = 0
-N1013AC4 = 0
-N1013AC5 = 0
-N1013AC6 = 1
-N1014AC3 = 0
-N1014AC4 = 0
-N1014AC5 = 0
-N1014AC6 = 1.909090909
-N1015AC3 = 0
-N1015AC4 = 0
-N1015AC5 = 0
-N1015AC6 = 3
-N1016AC3 = 0
-N1016AC4 = 0
-N1016AC5 = 0
-N1016AC6 = 4
-N1017AC3 = 0
-N1017AC4 = 0
-N1017AC5 = 0
-N1017AC6 = 0.09090909091
-N1018AC1 = 3.782713662
-N1018AC2 = 6.749720383
-N1018AC3 = 7
-N1018AC4 = 0
-N1018AC5 = 4.039001304
-N1018AC6 = 0
-N1019AC1 = 0
-N1019AC2 = 1.412371134
-N1019AC3 = 0
-N1019AC4 = 2.587628866
-N1019AC5 = 0
-N1020AC1 = 0
-N1020AC2 = 0
-N1020AC3 = 0
-N1020AC4 = 0
-N1020AC5 = 0
-N1020AC6 = 0
-N1021AC1 = 0
-N1021AC2 = 0
-N1021AC3 = 0
-N1021AC4 = 0
-N1021AC5 = 0
-N1022AC1 = 0
-N1023AC1 = 0
-N1026AC1 = 1
-N1027AC1 = 0
-N1028AC1 = 0
-N1029AC1 = 1
-N1030AC1 = 1
-N1032AC1 = 1
-N1032AC2 = 1
-N1032AC3 = 1
-N1032AC4 = 1
-N1032AC5 = 1
-N1033AC1 = 0
-N1033AC2 = 1.371681416
-N1033AC3 = 0
-N1033AC4 = 0.6283185841
-N1033AC5 = 0
-N1034AC1 = 0
-N1034AC2 = 0
-N1034AC3 = 0
-N1035AC1 = 0
-N1035AC2 = 0.04608448823
-N1035AC3 = 0
-N1035AC4 = 0.01051928536
-N1035AC5 = 0
-N1036AC1 = 0
-N1036AC2 = 0
-N1036AC3 = 0
-N1037AC4 = 0
-N1037AC5 = 3.220930233
-N1038AC4 = 0
-N1038AC5 = 0
-N1039AC4 = 0
-N1039AC5 = 0
-N1040AC4 = 10
-N1040AC5 = 10
-N1040AC6 = 10
-N1041AC4 = 5.793776249
-N1041AC5 = 20
-N1041AC6 = 20
-N1042AC4 = 20
-N1042AC5 = 20
-N1042AC6 = 20
-N1043AC1 = 0
-N1043AC2 = 0
-N1043AC3 = 0
-N1044AC1 = 0
-N1044AC2 = 1
-N1044AC3 = 0
-N1046AC3 = 1
-N1047AC1 = 0
-N1047AC2 = 1
-N1047AC3 = 0
-N1050AC3 = 0.109375
-N1050AC4 = 0
-N1050AC5 = 0
-N1051AC1 = 20
-N1051AC2 = 20
-N1051AC3 = 20
-N1051AC4 = 0
-N1051AC5 = 20
-N1051AC6 = 11.52971853
-*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
 Optimum value: -315.018728
-Optimum location:
-PBOSORD0 = 302
-PBOSORD1 = 0
-PBOSORD2 = 0
-PBOSORD3 = 0
-PBOSORD4 = 0
-PBOSLGA0 = 712
-PBOSLGA1 = 268
-PBOSLGA2 = 0
-PBOSLGA3 = 1372
-PBOSCLE0 = 0
-PBOSCLE1 = 142
-PBOSCLE2 = 0
-PBOSCLE3 = 0
-PORDBOS0 = 182.705314
-PORDBOS1 = 0
-PORDBOS2 = 0
-PORDBOS3 = 119.294686
-PORDBOS4 = 0
-PORDLGA0 = 0
-PORDLGA1 = 515
-PORDLGA2 = 0
-PORDLGA3 = 0
-PORDCLE0 = 12.29468599
-PORDCLE1 = 0
-PORDCLE2 = 458
-PORDCLE3 = 148.705314
-PLGABOS0 = 913
-PLGABOS1 = 458
-PLGABOS2 = 0
-PLGABOS3 = 0
-PLGABOS4 = 0
-PLGABOS5 = 1372
-PLGAORD0 = 712
-PLGAORD1 = 0
-PLGAORD2 = 0
-PLGAORD3 = 0
-PLGACLE0 = 0
-PLGACLE1 = 249
-PLGACLE2 = 268
-PCLEBOS0 = 0
-PCLEBOS1 = 0
-PCLEBOS2 = 0
-PCLEBOS3 = 131
-PCLEBOS4 = 0
-PCLEORD0 = 178.5972891
-PCLEORD1 = 249
-PCLEORD2 = 16.40271092
-PCLEORD3 = 268
-PCLEORD4 = 0
-PCLELGA0 = 409
-PCLELGA1 = 0
-PCLELGA2 = 0
-PCLELGA3 = 0
-BBOSORD0 = 0
-BBOSORD1 = 0
-BBOSCLE0 = 0.1616272102
-BBOSCLE1 = 7.026778587
-BORDBOS0 = 3.188405797
-CBOSORD0 = 12
-CBOSORD1 = 0
-CBOSORD2 = 0
-CBOSORD3 = 0
-CBOSORD4 = 0
-CBOSCLE0 = 0
-CBOSCLE1 = 8.811594203
-CBOSCLE2 = 0
-CBOSCLE3 = 0
-CORDBOS0 = 20.8115942
-CORDBOS1 = 0
-CORDBOS2 = 0
-CORDBOS3 = 0
-CORDBOS4 = 0
-CORDLGA0 = 13
-CORDLGA1 = 0
-CORDLGA2 = 0
-CORDLGA3 = 0
-CLGAORD0 = 22.5
-CLGAORD1 = 22.5
-CLGAORD2 = 0
-CLGAORD3 = 0
-CLGACLE0 = 16
-CLGACLE1 = 0
-CLGACLE2 = 0
-CCLELGA0 = 0
-CCLELGA1 = 5
-CCLELGA2 = 0
-CCLELGA3 = 0
-GRDTIMO1 = 0
-GRDTIMN1 = 0
-GRDTIMO2 = 0
-GRDTIMN2 = -76.79770851
-GRDTIMN3 = -10.27177739
-GRDTIMN4 = -21.60844089
-N1003AC1 = 0
-N1003AC2 = 6.724489796
-N1003AC3 = 0.4
-N1003AC4 = 0
-N1005AC1 = 0.01346893419
-N1005AC2 = 0
-N1005AC3 = 0
-N1005AC4 = 0
-N1011AC1 = 0.5855648822
-N1011AC2 = 0
-N1011AC3 = 0.2937198068
-N1011AC4 = 0
-N1013AC2 = 7.265306122
-N1013AC4 = 2
-N1015AC2 = 0
-N1015AC4 = 1.422222222
-N1017AC2 = 0
-N1017AC4 = 2
-N1019AC2 = 2.540816327
-N1019AC4 = 0
-N1021AC1 = 0.01346893419
-N1021AC2 = 0.1254559795
-N1021AC3 = 0
-N1021AC4 = 0
-N1002AC1 = 0
-N1002AC2 = 0.1254559795
-N1002AC3 = 0
-N1002AC4 = 0
-N1004AC2 = 2.540816327
-N1004AC4 = 2
-N1006AC1 = 0.5990338164
-N1006AC2 = 0
-N1006AC3 = 0.6937198068
-N1006AC4 = 0
-N1008AC2 = 9.316326531
-N1008AC4 = 2
-N1010AC2 = 4.673469388
-N1010AC4 = 0
-N1012AC2 = 0
-N1012AC4 = 1.422222222
-N1014AC2 = 0
-N1014AC4 = 0
-N1100AC2 = 2.734693878
-N1100AC4 = 0
-N1102AC2 = 0
-N1102AC4 = 0
-N1200AC2 = 14
-N1200AC4 = 0
-N1201AC2 = 14
-N1201AC4 = 0
-*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
 Optimum value: -73.36896911
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+Optimum value: 149.5887662
 Optimum location:
-PBOSORD0 = 277
-PBOSORD1 = 0
-PBOSORD2 = 0
-PBOSORD3 = 0
-PBOSORD4 = 0
-PBOSLGA0 = 258.2518987
-PBOSLGA1 = 686
-PBOSLGA2 = 35.74810133
-PBOSLGA3 = 1372
-PBOSCLE0 = 0
-PBOSCLE1 = 0
-PBOSCLE2 = 0
-PBOSCLE3 = 142
-PORDBOS0 = 302
-PORDBOS1 = 0
-PORDBOS2 = 0
-PORDBOS3 = 0
-PORDBOS4 = 0
-PORDLGA0 = 0
-PORDLGA1 = 0
-PORDLGA2 = 515
-PORDLGA3 = 0
-PORDCLE0 = 0
-PORDCLE1 = 619
-PORDCLE2 = 0
-PORDCLE3 = 0
-PLGABOS0 = 0
-PLGABOS1 = 712
-PLGABOS2 = 517
-PLGABOS3 = 686
-PLGABOS4 = 426.7481013
-PLGABOS5 = 401.2518987
-PLGAORD0 = 258.2518987
-PLGAORD1 = 0
-PLGAORD2 = 453.7481013
-PLGAORD3 = 0
-PLGACLE0 = 517
-PLGACLE1 = 0
-PLGACLE2 = 0
-PCLEBOS0 = 131
-PCLEBOS1 = 0
-PCLEBOS2 = 0
-PCLEBOS3 = 0
-PCLEBOS4 = 0
-PCLEORD0 = 0
-PCLEORD1 = 0
-PCLEORD2 = 712
-PCLEORD3 = 0
-PCLEORD4 = 0
-PCLELGA0 = 0
-PCLELGA1 = 0
-PCLELGA2 = 18
-PCLELGA3 = 391
-BBOSORD0 = 0
-BBOSORD1 = 0
-BBOSCLE0 = 0
-BBOSCLE1 = 0
-BORDBOS0 = 0
-CBOSORD0 = 0
-CBOSORD1 = 0
-CBOSORD2 = 0
-CBOSORD3 = 0
-CBOSORD4 = 0
-CBOSCLE0 = 0
-CBOSCLE1 = 0
-CBOSCLE2 = 12.8
-CBOSCLE3 = 0
-CORDBOS0 = 0
-CORDBOS1 = 0
-CORDBOS2 = 0
-CORDBOS3 = 19.2
-CORDBOS4 = 0
-CORDLGA0 = 0
-CORDLGA1 = 0
-CORDLGA2 = 10.4
-CORDLGA3 = 0
-CLGAORD0 = 0
-CLGAORD1 = 0
-CLGAORD2 = 20.1
-CLGAORD3 = 15.9
-CLGACLE0 = 10.4
-CLGACLE1 = 2.4
-CLGACLE2 = 0
-CCLELGA0 = 0
-CCLELGA1 = 0
-CCLELGA2 = 0
-CCLELGA3 = 0
-GRDTIMO1 = 73.01076
-GRDTIMN1 = -100
-GRDTIMO2 = 0
-GRDTIMN2 = -90
-GRDTIMN3 = -45
-GRDTIMN4 = -45
-N1003AC1 = 7
-N1003AC2 = 0
-N1003AC3 = 0.6856076556
-N1003AC4 = 0
-N1005AC1 = 0
-N1005AC2 = 0
-N1005AC3 = 0
-N1005AC4 = 0
-N1011AC1 = 0
-N1011AC2 = 0
-N1011AC3 = 1.314392344
-N1011AC4 = 0
-N1013AC2 = 2.635223456
-N1013AC4 = 0
-N1015AC2 = 5.275510204
-N1015AC4 = 0.9244444444
-N1017AC2 = 0
-N1017AC4 = 0
-N1019AC2 = 4.630082667
-N1019AC4 = 2
-N1021AC1 = 7
-N1021AC2 = 0
-N1021AC3 = 2
-N1021AC4 = 0.9244444444
-N1002AC1 = 7
-N1002AC2 = 0
-N1002AC3 = 2
-N1002AC4 = 2
-N1004AC2 = 0
-N1004AC4 = 0
-N1006AC1 = 7
-N1006AC2 = 0
-N1006AC3 = 2
-N1006AC4 = 0
-N1008AC2 = 0
-N1008AC4 = 0
-N1010AC2 = 7.265306122
-N1010AC4 = 0.9244444444
-N1012AC2 = 0
-N1012AC4 = 2
-N1014AC2 = 5.275510204
-N1014AC4 = 0
-N1100AC2 = 7
-N1100AC4 = 5.274621909
-N1102AC2 = 4.354572463
-N1102AC4 = 0
-N1200AC2 = 14
-N1200AC4 = 0.9244444444
-N1201AC2 = 4.094407129
-N1201AC4 = 0
-*** ppl_lpsol -s -m -oobtained ex1.mps
+I.001... = 0.02093301435
+I.001003 = 0
+I.002003 = 0
+I.002... = 0.00521189337
+I.003005 = 0
+I.004005 = 0
+I.004... = 0.06758373206
+I.005007 = 0
+I.006007 = 0.03879015721
+I.007008 = 0.04853041695
+I.008... = 0.04853041695
+I.008009 = 0
+I.010012 = 0.009654818865
+I.011012 = 0.1833561176
+I.012... = 0.1930109364
+I.012013 = 0
+I.013016 = 0.03964456596
+I.014015 = 0.002648667122
+I.015016 = 0.01324333561
+I.016... = 0.05288790157
+I.016017 = 0
+I.017018 = 0.0005980861244
+I.009018 = 0.002392344498
+I.018019 = 0.002990430622
+I.019024 = 0.02358168148
+I.024... = 0.0241797676
+I.023024 = 0.0005980861244
+I.022023 = 0
+I.020022 = 0.003332194122
+I.021022 = 0.06331168831
+I.022... = 0.06664388243
+I.024026 = 0
+I.025026 = 0
+I.025... = 0.1642173616
+I.026027 = 0.08962747779
+I.027... = 0.08962747779
+I.027032 = 0
+I.030031 = 0.002392344498
+I.031032 = 0.0534859877
+I.029031 = 0.0487012987
+I.028029 = 0
+I.028... = 0.007518796992
+I.032033 = 0.0534859877
+I.033037 = 0.05510936432
+I.036037 = 0.008885850991
+I.034036 = 0.001623376623
+I.035036 = 0.002392344498
+I.037038 = 0.06399521531
+I.038040 = 0.109278879
+I.039040 = 0.04545454545
+I.040... = 0.161226931
+I.041... = 0.04340396446
+I.040041 = 0
+I.041042 = 0
+I.042... = 0.05502392344
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 2.45
+F.001003 = 0
+F.002003 = 0
+F.002... = 0.61
+F.003005 = 0
+F.004005 = 0
+F.004... = 7.91
+F.005007 = 0
+F.006007 = 4.54
+F.007008 = 5.68
+F.008... = 5.68
+F.008009 = 0
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 22.59
+F.012013 = 0
+F.013016 = 4.64
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 6.19
+F.016017 = 0
+F.017018 = 0.07
+F.009018 = 0.28
+F.018019 = 0.35
+F.019024 = 2.76
+F.024... = 2.83
+F.023024 = 0.07
+F.022023 = 0
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 7.8
+F.024026 = 0
+F.025026 = 0
+F.025... = 19.22
+F.026027 = 10.49
+F.027... = 10.49
+F.027032 = 0
+F.030031 = 0.28
+F.031032 = 6.26
+F.029031 = 5.7
+F.028029 = 0
+F.028... = 0.88
+F.032033 = 6.26
+F.033037 = 6.45
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 7.49
+F.038040 = 12.79
+F.039040 = 5.32
+F.040... = 18.87
+F.041... = 5.08
+F.040041 = 0
+F.041042 = 0
+F.042... = 6.44
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+Optimum value: 964.30053
+Optimum location:
+I.001... = 1
+I.001003 = 1
+I.002003 = 1
+I.002... = 1
+I.003005 = 1
+I.004005 = 1
+I.004... = 1
+I.005007 = 1
+I.006007 = 1
+I.007008 = 1
+I.008... = 1
+I.008009 = 1
+I.010012 = 1
+I.011012 = 1
+I.012... = 1
+I.012013 = 1
+I.013016 = 1
+I.014015 = 1
+I.015016 = 1
+I.016... = 1
+I.016017 = 1
+I.017018 = 1
+I.009018 = 1
+I.018019 = 1
+I.019024 = 1
+I.024... = 1
+I.023024 = 1
+I.022023 = 1
+I.020022 = 1
+I.021022 = 1
+I.022... = 1
+I.024026 = 1
+I.025026 = 1
+I.025... = 1
+I.026027 = 1
+I.027... = 1
+I.027032 = 1
+I.030031 = 1
+I.031032 = 1
+I.029031 = 1
+I.028029 = 1
+I.028... = 1
+I.032033 = 1
+I.033037 = 1
+I.036037 = 1
+I.034036 = 1
+I.035036 = 1
+I.037038 = 1
+I.038040 = 1
+I.039040 = 1
+I.040... = 1
+I.041... = 1
+I.040041 = 1
+I.041042 = 1
+I.042... = 1
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 0
+F.001003 = 2.45
+F.002003 = 0.61
+F.002... = 0
+F.003005 = 3.06
+F.004005 = 7.91
+F.004... = 0
+F.005007 = 10.97
+F.006007 = 4.54
+F.007008 = 16.65
+F.008... = 0
+F.008009 = 16.65
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 0
+F.012013 = 22.59
+F.013016 = 27.23
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 0
+F.016017 = 28.78
+F.017018 = 28.85
+F.009018 = 16.93
+F.018019 = 45.78
+F.019024 = 48.19
+F.024... = 0
+F.023024 = 7.87
+F.022023 = 7.8
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 0
+F.024026 = 56.06
+F.025026 = 19.22
+F.025... = 0
+F.026027 = 85.77
+F.027... = 0
+F.027032 = 85.77
+F.030031 = 0.28
+F.031032 = 7.14
+F.029031 = 6.58
+F.028029 = 0.88
+F.028... = 0
+F.032033 = 92.91
+F.033037 = 93.1
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 94.14
+F.038040 = 99.44
+F.039040 = 5.32
+F.040... = 0
+F.041... = 0
+F.040041 = 105.52
+F.041042 = 110.6
+F.042... = 117.04
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
 Optimum value: -1749.90013
 Optimum location:
 BAL.3EBW = 0.8118235251
@@ -1485,7 +641,7 @@ WMO73PBW = 1770.361014
 WRO73PBW = 2009.742955
 WMO73RBW = 5651.99315
 WRO73RBW = 6262.646874
-*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
 Optimum value: 0
 Optimum location:
 BAL.3EBW = 0
@@ -1529,33 +685,2474 @@ WMO73PBW = 0
 WRO73PBW = 0
 WMO73RBW = 0
 WRO73RBW = 0
-*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+Optimum value: 834.6823529
+Optimum location:
+C101 = 1
+C102 = 1
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 1
+C108 = 0
+C109 = 0
+C110 = 0
+C111 = 0.4367816092
+C112 = 0.3367816092
+C113 = 0
+C114 = 0.2264367816
+C115 = 0
+C116 = 0
+C117 = 0
+C118 = 0
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 0
+C123 = 0
+C124 = 0
+C125 = 0
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0.6117647059
+C130 = 0.155
+C131 = 0
+C132 = 0
+C133 = 0
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 1
+C140 = 0
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 0.38
+C145 = 0
+C146 = 0
+C147 = 0.62
+C148 = 0
+C149 = 0
+C150 = 0.1
+C151 = 0.9
+C152 = 0
+C153 = 0
+C154 = 0
+C155 = 0
+C156 = 1
+C157 = 0
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 0
+C164 = 0.9043285239
+C165 = 0.09567147614
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 0
+C177 = 0
+C178 = 0
+C179 = 0
+C180 = 0
+C181 = 0
+C182 = 0
+C183 = 0
+C184 = 0
+C185 = 0
+C186 = 0
+C187 = 0
+C188 = 0
+C189 = 0
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0
+C132 = 0
+C133 = 1
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0.4643273602
+x14 = 0
+x15 = 1
+x16 = 0.9623071054
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0
+x22 = 1
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 1
+x29 = 1
+x30 = 1
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 1
+x37 = 0.839896525
+x38 = 0
+x39 = 0
+x40 = 1
+x41 = 1
+x42 = 0
+x43 = 1
+x44 = 0.09199314836
+x45 = 1
+x46 = 1
+x47 = 1
+x48 = 1
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 1
+x54 = 1
+x55 = 0
+x56 = 0.3536953199
+x57 = 1
+x58 = 0
+x59 = 0
+x60 = 1
+x61 = 0
+x62 = 0.2898890259
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+Optimum value: 7286
+Optimum location:
+x1 = 1116
+x2 = 0
+x3 = 1325
+x4 = 0
+x5 = 1353
+x6 = 0
+x7 = 1169
+x8 = 0
+x9 = 1160
+x10 = 0
+x11 = 1163
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0.3717008822
+x22 = 0.1692962317
+x23 = 1
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 1
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 1
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 1
+x47 = 0
+x48 = 0
+x49 = 0.01751673708
+x50 = 0.1466102207
+x51 = 0.3205265241
+x52 = 1
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 1
+x62 = 1
+x63 = 1
+x64 = 1
+x65 = 0.4427598921
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 1
+x73 = 0.6098932051
+x74 = 1
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+Optimum value: 10512
+Optimum location:
+x1 = 1324
+x2 = 0
+x3 = 1554
+x4 = 0
+x5 = 1429
+x6 = 0
+x7 = 1686
+x8 = 0
+x9 = 1482
+x10 = 0
+x11 = 1613
+x12 = 0
+x13 = 1424
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+*** ppl_lpsol -r -s -m -oobtained mip.mps
 Optimum value: 24.07692308
 Optimum location:
 X1 = 2.615384615
 X2 = 2
 X3 = 0.7692307692
 X4 = 3
-*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -r -s -M -oobtained mip.mps
 Optimum value: 46.42857143
 Optimum location:
 X1 = 4
 X2 = 4.571428571
 X3 = 0.5714285714
 X4 = 3
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+Optimum value: -43
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0.9583331684
+x52 = 9.1999988
+x53 = 1
+x54 = 9.6000004
+x55 = 1
+x56 = 9.6000004
+x57 = 1
+x58 = 9.6000004
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+Optimum value: -5
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ppl_lpsol -r -s -m -oobtained opt1217.mps
+Optimum value: -20.02139037
+Optimum location:
+x1 = 20.02139037
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0.003565062389
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 1
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 1
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0.005347593583
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 1
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 1
+x124 = 1
+x125 = 0.3368983957
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0.6631016043
+x162 = 0
+x163 = 0
+x164 = 0.6737967914
+x165 = 1
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 1
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 1
+x194 = 1
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.3368983957
+x210 = 1
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 0
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 0
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0
+x250 = 0
+x251 = 0
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 0.3368983957
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0.6541889483
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 1
+x304 = 0.3262032086
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0.3565062389
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 1
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 1
+x344 = 1
+x345 = 0.5026737968
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0.3368983957
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 1
+x403 = 1
+x404 = 1
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 0
+x430 = 0
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 0
+x455 = 0
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 1
+x464 = 0
+x465 = 0
+x466 = 1
+x467 = 0
+x468 = 0.5026737968
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0.6631016043
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 0
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 0
+x505 = 0
+x506 = 0
+x507 = 1
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0.7896613191
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0.6631016043
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 1
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 0
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 1
+x554 = 0.5026737968
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0.4973262032
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0.3458110517
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0.4973262032
+x584 = 1
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 0
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 0
+x595 = 0
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0.4973262032
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 1
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 1
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0.5026737968
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 0
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 0
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0.5026737968
+x670 = 0
+x671 = 1
+x672 = 0
+x673 = 1
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 0
+x697 = 0
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 0
+x706 = 0
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0.6631016043
+x742 = 0.1408199643
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0.991087344
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 0
+x751 = 0
+x752 = 0
+x753 = 0.4973262032
+x754 = 0
+x755 = 0.2103386809
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 0
+x761 = 0
+x762 = 0
+x763 = 0
+x764 = 0
+x765 = 0
+x766 = 0
+x767 = 0
+x768 = 0
+x769 = 0
+*** ppl_lpsol -r -s -M -oobtained opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0.853048009
+x3 = 0
+x4 = 0
+x5 = 0.9902413468
+x6 = 0.6585148486
+x7 = 0.2829608277
+x8 = 0
+x9 = 0
+x10 = 1
+x11 = 0
+x12 = 1
+x13 = 0.331125321
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 1
+x18 = 1
+x19 = 0
+x20 = 0.1009956211
+x21 = 0.6785106979
+x22 = 0
+x23 = 1
+x24 = 0.8947436612
+x25 = 1
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0.1242007274
+x34 = 0.557112246
+x35 = 0.429812324
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0.3510036592
+x43 = 0
+x44 = 1
+x45 = 1
+x46 = 0
+x47 = 0
+x48 = 0.5414381495
+x49 = 1
+x50 = 0.2173113881
+x51 = 0
+x52 = 1
+x53 = 1
+x54 = 0
+x55 = 1
+x56 = 0.9323580046
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+Unbounded problem.
+*** ppl_lpsol -r -s -m -oobtained rout.mps
+Optimum value: 981.8642857
+*** ppl_lpsol -r -s -M -oobtained rout.mps
+Optimum value: 2430.87
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
 Optimum value: -52.20206121
 Optimum location:
 COL00001 = 0
@@ -1661,113 +3258,113 @@ COL00100 = 26.37637065
 COL00101 = 26.37637065
 COL00102 = 123.0897297
 COL00103 = 123.0897297
-*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
 Optimum value: 0
 Optimum location:
 COL00001 = 0
-COL00002 = 50
+COL00002 = 0
 COL00003 = 0
 COL00004 = 0
 COL00005 = 0
 COL00006 = 0
-COL00007 = 50
+COL00007 = 0
 COL00008 = 0
 COL00009 = 0
 COL00010 = 0
 COL00011 = 0
 COL00012 = 0
-COL00013 = 50
+COL00013 = 0
 COL00014 = 0
 COL00015 = 0
 COL00016 = 0
 COL00017 = 0
-COL00018 = 100
+COL00018 = 0
 COL00019 = 0
 COL00020 = 0
-COL00021 = 27.27272727
+COL00021 = 0
 COL00022 = 0
 COL00023 = 0
-COL00024 = 63.63636364
+COL00024 = 0
 COL00025 = 0
 COL00026 = 0
 COL00027 = 0
 COL00028 = 0
-COL00029 = 163.6363636
+COL00029 = 0
 COL00030 = 0
 COL00031 = 0
-COL00032 = 163.6363636
+COL00032 = 0
 COL00033 = 0
-COL00034 = 45.45454545
-COL00035 = 109.0909091
+COL00034 = 0
+COL00035 = 0
 COL00036 = 0
 COL00037 = 0
 COL00038 = 0
-COL00039 = 45.45454545
-COL00040 = 272.7272727
+COL00039 = 0
+COL00040 = 0
 COL00041 = 0
 COL00042 = 0
 COL00043 = 0
 COL00044 = 0
-COL00045 = 100
+COL00045 = 0
 COL00046 = 0
 COL00047 = 0
 COL00048 = 0
 COL00049 = 0
-COL00050 = 145.4545455
-COL00051 = 272.7272727
+COL00050 = 0
+COL00051 = 0
 COL00052 = 0
 COL00053 = 0
 COL00054 = 0
 COL00055 = 0
-COL00056 = 100
+COL00056 = 0
 COL00057 = 0
 COL00058 = 0
 COL00059 = 0
 COL00060 = 0
-COL00061 = 245.4545455
-COL00062 = 272.7272727
+COL00061 = 0
+COL00062 = 0
 COL00063 = 0
 COL00064 = 0
 COL00065 = 0
 COL00066 = 0
-COL00067 = 100
+COL00067 = 0
 COL00068 = 0
 COL00069 = 0
 COL00070 = 0
 COL00071 = 0
-COL00072 = 345.4545455
-COL00073 = 272.7272727
+COL00072 = 0
+COL00073 = 0
 COL00074 = 0
 COL00075 = 0
-COL00076 = 272.7272727
+COL00076 = 0
 COL00077 = 0
-COL00078 = 9.090909091
-COL00079 = 181.8181818
+COL00078 = 0
+COL00079 = 0
 COL00080 = 0
 COL00081 = 0
 COL00082 = 0
-COL00083 = 354.5454545
-COL00084 = 454.5454545
+COL00083 = 0
+COL00084 = 0
 COL00085 = 0
-COL00086 = 354.5454545
-COL00087 = 454.5454545
+COL00086 = 0
+COL00087 = 0
 COL00088 = 0
 COL00089 = 0
 COL00090 = 0
-COL00091 = 369.6969697
+COL00091 = 0
 COL00092 = 0
 COL00093 = 0
-COL00094 = 354.5454545
-COL00095 = 454.5454545
-COL00096 = 369.6969697
+COL00094 = 0
+COL00095 = 0
+COL00096 = 0
 COL00097 = 0
-COL00098 = 100
+COL00098 = 0
 COL00099 = 0
-COL00100 = 20
-COL00101 = 20
-COL00102 = 93.33333333
+COL00100 = 0
+COL00101 = 0
+COL00102 = 0
 COL00103 = 0
-*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
 Optimum value: -64.57507706
 Optimum location:
 COL00001 = 0
@@ -1818,58 +3415,58 @@ COL00045 = 20.25950793
 COL00046 = 20.25950793
 COL00047 = 94.54437032
 COL00048 = 94.54437032
-*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
 Optimum value: 0
 Optimum location:
-COL00001 = 20
-COL00002 = 55
+COL00001 = 0
+COL00002 = 0
 COL00003 = 0
 COL00004 = 0
 COL00005 = 0
-COL00006 = 20
-COL00007 = 55
+COL00006 = 0
+COL00007 = 0
 COL00008 = 0
 COL00009 = 0
 COL00010 = 0
 COL00011 = 0
-COL00012 = 70
-COL00013 = 30
+COL00012 = 0
+COL00013 = 0
 COL00014 = 0
 COL00015 = 0
 COL00016 = 0
-COL00017 = 90
-COL00018 = 85
+COL00017 = 0
+COL00018 = 0
 COL00019 = 0
 COL00020 = 0
-COL00021 = 85
+COL00021 = 0
 COL00022 = 0
-COL00023 = 41.66666667
-COL00024 = 86.66666667
+COL00023 = 0
+COL00024 = 0
 COL00025 = 0
 COL00026 = 0
 COL00027 = 0
-COL00028 = 131.6666667
-COL00029 = 171.6666667
+COL00028 = 0
+COL00029 = 0
 COL00030 = 0
-COL00031 = 131.6666667
-COL00032 = 171.6666667
+COL00031 = 0
+COL00032 = 0
 COL00033 = 0
 COL00034 = 0
 COL00035 = 0
-COL00036 = 201.1111111
+COL00036 = 0
 COL00037 = 0
 COL00038 = 0
-COL00039 = 131.6666667
-COL00040 = 171.6666667
-COL00041 = 201.1111111
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
 COL00042 = 0
-COL00043 = 40
+COL00043 = 0
 COL00044 = 0
-COL00045 = 17
-COL00046 = 17
-COL00047 = 79.33333333
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
 COL00048 = 0
-*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
 Optimum value: -70
 Optimum location:
 COL00001 = 30
@@ -1920,7 +3517,7 @@ COL00045 = 43.923
 COL00046 = 40.9948
 COL00047 = 61.4922
 COL00048 = 102.487
-*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
 Optimum value: 0
 Optimum location:
 COL00001 = 0
@@ -1935,35 +3532,35 @@ COL00009 = 0
 COL00010 = 0
 COL00011 = 0
 COL00012 = 0
-COL00013 = 100
+COL00013 = 0
 COL00014 = 0
 COL00015 = 0
 COL00016 = 0
 COL00017 = 0
-COL00018 = 100
+COL00018 = 0
 COL00019 = 0
 COL00020 = 0
 COL00021 = 0
 COL00022 = 0
 COL00023 = 0
-COL00024 = 100
+COL00024 = 0
 COL00025 = 0
 COL00026 = 0
 COL00027 = 0
 COL00028 = 0
-COL00029 = 200
+COL00029 = 0
 COL00030 = 0
 COL00031 = 0
 COL00032 = 0
 COL00033 = 0
 COL00034 = 0
 COL00035 = 0
-COL00036 = 100
+COL00036 = 0
 COL00037 = 0
 COL00038 = 0
 COL00039 = 0
-COL00040 = 200
-COL00041 = 100
+COL00040 = 0
+COL00041 = 0
 COL00042 = 0
 COL00043 = 0
 COL00044 = 0
@@ -1971,10 +3568,1542 @@ COL00045 = 0
 COL00046 = 0
 COL00047 = 0
 COL00048 = 0
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+Optimum value: 10482.79528
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 1
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0.5347489362
+x15 = 1
+x16 = 0
+x17 = 0.2426314989
+x18 = 0
+x19 = 0.6876932386
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0.2651304012
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0.5013849046
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 1
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0.0325333004
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 0
+x66 = 0
+x67 = 1
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 1
+x89 = 1
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0.892553448
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0.01146190333
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0.6811784275
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6580158108
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0.973369113
+x150 = 0.5192990175
+x151 = 10482.79508
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1
+x8 = 1
+x9 = 0
+x10 = 0
+x11 = 1
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 1
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 1
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 1
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 1
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 1
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 1
+x92 = 0
+x93 = 1
+x94 = 0
+x95 = 0
+x96 = 1
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 1
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 1
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 1
+x131 = 0
+x132 = 1
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 1
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 1
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ppl_lpsol -n -s -oobtained mas74.mps
+Feasible problem.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+Optimum value: 38893.90364
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 1
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 1
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0.6025695449
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0.603337348
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 1
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0.0954968974
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0.9782647951
+x85 = 0
+x86 = 0.1119635585
+x87 = 0
+x88 = 1
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0.3920130232
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 0.1417811418
+x123 = 0
+x124 = 0.5090665575
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6649413368
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0.8642716954
+x149 = 0
+x150 = 0.03629410147
+x151 = 38893.90349
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1
+x8 = 1
+x9 = 0
+x10 = 0
+x11 = 1
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 1
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 1
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 1
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 1
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 1
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 1
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 1
+x131 = 0
+x132 = 1
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 1
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ppl_lpsol -n -s -oobtained mas76.mps
+Feasible problem.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+Optimum value: 20430947.62
+Optimum location:
+x1 = 0
+x2 = 23929.0382
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1.833067347
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 86.19157484
+x16 = 0
+x17 = 0
+x18 = 636.0743694
+x19 = 0
+x20 = 0
+x21 = 605.2785997
+x22 = 2113.676289
+x23 = 0
+x24 = 0
+x25 = 1009.494466
+x26 = 5449.255398
+x27 = 0
+x28 = 0
+x29 = 7316.944573
+x30 = 0
+x31 = 7529.08308
+x32 = 3525.611303
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 2780.728439
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 889.0673526
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 205.0591339
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 6351.319455
+x50 = 1183.360764
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 2530.715783
+x55 = 1726.033672
+x56 = 0
+x57 = 0
+x58 = 1176.727362
+x59 = 887.685932
+x60 = 0
+x61 = 0
+x62 = 838.4627168
+x63 = 0
+x64 = 126.3594424
+x65 = 0
+x66 = 204.7049903
+x67 = 0
+x68 = 142.8570486
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 41.54952653
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 569.7173314
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 212.2691988
+x81 = 0
+x82 = 481.1190763
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 11372.68699
+x101 = 8880.920376
+x102 = 621.3300236
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0.000105591437
+x204 = 0
+x205 = 0.004964952468
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.05815060286
+x210 = 0
+x211 = 0.03486627878
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0.03664022865
+x216 = 0
+x217 = 0.1217555466
+x218 = 0
+x219 = 0.3138972004
+x220 = 0
+x221 = 0.4214829823
+x222 = 0
+x223 = 0.4337029424
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0.2030882087
+x232 = 0
+x233 = 0.1601802096
+x234 = 0
+x235 = 0.05121355718
+x236 = 0
+x237 = 0.6551086973
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0.01181216209
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0.03579089998
+x250 = 0
+x251 = 0.5115737544
+x252 = 0
+x253 = 0.0681659426
+x254 = 0
+x255 = 0.3658594156
+x256 = 0
+x257 = 0.09942590275
+x258 = 0
+x259 = 0.1457785589
+x260 = 0
+x261 = 0.05113398226
+x262 = 0
+x263 = 0.0677838342
+x264 = 0
+x265 = 0.04829854359
+x266 = 0
+x267 = 0.02771423251
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0.01222748841
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0.03281781863
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0.002393405906
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0.00822909266
+x284 = 0
+x285 = 0.01179176211
+x286 = 0
+x287 = 0.007278769726
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 1.5
+x300 = 69
+x301 = 520.5
+x302 = 495.299805
+x303 = 754.099854
+x304 = 1198.5
+x305 = 2188.799805
+x306 = 594.4
+x307 = 51.4
+x308 = 75.6
+x309 = 563.099854
+x310 = 1533.099854
+x311 = 556.299805
+x312 = 167.8
+x313 = 975.799805
+x314 = 1642.9
+x315 = 347.099854
+x316 = 262.799805
+x317 = 62
+x318 = 395.9
+x319 = 691.7
+x320 = 936.7
+x321 = 791.099854
+x322 = 106.7
+x323 = 393.7
+x324 = 173.7
+x325 = 466.2
+x326 = 34
+x327 = 116.9
+x328 = 103.4
+x329 = 552.099854
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+Optimum value: 742543789.3
+Optimum location:
+x1 = 0
+x2 = 57866.66667
+x3 = 0
+x4 = 52080
+x5 = 16665.6
+x6 = 17360
+x7 = 17360
+x8 = 15985.088
+x9 = 17360
+x10 = 16665.6
+x11 = 17360
+x12 = 17360
+x13 = 15971.2
+x14 = 17360
+x15 = 17360
+x16 = 17360
+x17 = 13609.96224
+x18 = 17360
+x19 = 15637.888
+x20 = 17360
+x21 = 17360
+x22 = 17360
+x23 = 14283.53024
+x24 = 17360
+x25 = 17360
+x26 = 17360
+x27 = 9281.22263
+x28 = 17360
+x29 = 17360
+x30 = 8748.398178
+x31 = 17360
+x32 = 17360
+x33 = 3236.582794
+x34 = 17360
+x35 = 12622.80876
+x36 = 17360
+x37 = 17360
+x38 = 17360
+x39 = 13943.27424
+x40 = 17360
+x41 = 17360
+x42 = 17360
+x43 = 15290.688
+x44 = 17360
+x45 = 17360
+x46 = 16665.6
+x47 = 17360
+x48 = 17360
+x49 = 17360
+x50 = 17360
+x51 = 1887.314667
+x52 = 17360
+x53 = 5398.256436
+x54 = 17360
+x55 = 17360
+x56 = 17360
+x57 = 8980.850078
+x58 = 17360
+x59 = 17360
+x60 = 17360
+x61 = 12636.55788
+x62 = 17360
+x63 = 15985.088
+x64 = 17360
+x65 = 13603.01824
+x66 = 17360
+x67 = 17360
+x68 = 17360
+x69 = 14950.432
+x70 = 17360
+x71 = 17360
+x72 = 17360
+x73 = 14950.432
+x74 = 17360
+x75 = 17360
+x76 = 17360
+x77 = 14950.432
+x78 = 17360
+x79 = 17360
+x80 = 17360
+x81 = 17360
+x82 = 17360
+x83 = 15637.888
+x84 = 16665.6
+x85 = 17360
+x86 = 16318.4
+x87 = 17360
+x88 = 17360
+x89 = 16318.4
+x90 = 17360
+x91 = 17360
+x92 = 16318.4
+x93 = 17360
+x94 = 17360
+x95 = 16318.4
+x96 = 17360
+x97 = 17360
+x98 = 16665.6
+x99 = 17360
+x100 = 17360
+x101 = 17360
+x102 = 17360
+x103 = 16665.6
+x104 = 17360
+x105 = 17360
+x106 = 15985.088
+x107 = 17360
+x108 = 16665.6
+x109 = 17360
+x110 = 17360
+x111 = 15971.2
+x112 = 17360
+x113 = 17360
+x114 = 17360
+x115 = 13609.96224
+x116 = 17360
+x117 = 15637.888
+x118 = 17360
+x119 = 17360
+x120 = 17360
+x121 = 14283.53024
+x122 = 17360
+x123 = 17360
+x124 = 17360
+x125 = 9281.22263
+x126 = 17360
+x127 = 17360
+x128 = 8748.398178
+x129 = 17360
+x130 = 17360
+x131 = 3236.582794
+x132 = 17360
+x133 = 12622.80876
+x134 = 17360
+x135 = 17360
+x136 = 17360
+x137 = 13943.27424
+x138 = 17360
+x139 = 17360
+x140 = 17360
+x141 = 15290.688
+x142 = 17360
+x143 = 17360
+x144 = 16665.6
+x145 = 17360
+x146 = 17360
+x147 = 17360
+x148 = 17360
+x149 = 1887.314667
+x150 = 17360
+x151 = 5398.256436
+x152 = 17360
+x153 = 17360
+x154 = 17360
+x155 = 8980.850078
+x156 = 17360
+x157 = 17360
+x158 = 17360
+x159 = 12636.55788
+x160 = 17360
+x161 = 15985.088
+x162 = 17360
+x163 = 13603.01824
+x164 = 17360
+x165 = 17360
+x166 = 17360
+x167 = 14950.432
+x168 = 17360
+x169 = 17360
+x170 = 17360
+x171 = 14950.432
+x172 = 17360
+x173 = 17360
+x174 = 17360
+x175 = 14950.432
+x176 = 17360
+x177 = 17360
+x178 = 17360
+x179 = 17360
+x180 = 17360
+x181 = 15637.888
+x182 = 16665.6
+x183 = 17360
+x184 = 16318.4
+x185 = 17360
+x186 = 17360
+x187 = 16318.4
+x188 = 17360
+x189 = 17360
+x190 = 16318.4
+x191 = 17360
+x192 = 17360
+x193 = 16318.4
+x194 = 17360
+x195 = 17360
+x196 = 16665.6
+x197 = 17360
+x198 = 17360
+x199 = 17360
+x200 = 17360
+x201 = 1
+x202 = 1
+x203 = 1
+x204 = 1
+x205 = 1
+x206 = 1
+x207 = 1
+x208 = 1
+x209 = 1
+x210 = 1
+x211 = 1
+x212 = 1
+x213 = 1
+x214 = 1
+x215 = 1
+x216 = 1
+x217 = 1
+x218 = 1
+x219 = 1
+x220 = 1
+x221 = 1
+x222 = 1
+x223 = 1
+x224 = 1
+x225 = 1
+x226 = 1
+x227 = 1
+x228 = 1
+x229 = 1
+x230 = 1
+x231 = 1
+x232 = 1
+x233 = 1
+x234 = 1
+x235 = 1
+x236 = 1
+x237 = 1
+x238 = 1
+x239 = 1
+x240 = 1
+x241 = 1
+x242 = 1
+x243 = 1
+x244 = 1
+x245 = 1
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 1
+x253 = 1
+x254 = 1
+x255 = 1
+x256 = 1
+x257 = 1
+x258 = 1
+x259 = 1
+x260 = 1
+x261 = 1
+x262 = 1
+x263 = 1
+x264 = 1
+x265 = 1
+x266 = 1
+x267 = 1
+x268 = 1
+x269 = 1
+x270 = 1
+x271 = 1
+x272 = 1
+x273 = 1
+x274 = 1
+x275 = 1
+x276 = 1
+x277 = 1
+x278 = 1
+x279 = 1
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 1
+x284 = 1
+x285 = 1
+x286 = 1
+x287 = 1
+x288 = 1
+x289 = 1
+x290 = 1
+x291 = 1
+x292 = 1
+x293 = 1
+x294 = 1
+x295 = 1
+x296 = 1
+x297 = 1
+x298 = 1
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 1.5
+x362 = 69
+x363 = 520.5
+x364 = 495.299805
+x365 = 754.099854
+x366 = 1198.5
+x367 = 2188.799805
+x368 = 594.4
+x369 = 51.4
+x370 = 75.6
+x371 = 563.099854
+x372 = 1533.099854
+x373 = 556.299805
+x374 = 167.8
+x375 = 975.799805
+x376 = 1642.9
+x377 = 347.099854
+x378 = 262.799805
+x379 = 62
+x380 = 395.9
+x381 = 691.7
+x382 = 936.7
+x383 = 791.099854
+x384 = 106.7
+x385 = 393.7
+x386 = 173.7
+x387 = 466.2
+x388 = 34
+x389 = 116.9
+x390 = 103.4
+x391 = 552.099854
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ppl_lpsol -n -s -oobtained modglob.mps
+Feasible problem.
diff --git a/demos/ppl_lpsol/expected_mpz_a b/demos/ppl_lpsol/expected_mpz_a
index ffb6e8d..7eb0202 100644
--- a/demos/ppl_lpsol/expected_mpz_a
+++ b/demos/ppl_lpsol/expected_mpz_a
@@ -1,139 +1,127 @@
-*** ppl_lpsol -e -m -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -M -oobtained bgprtr.mps
-Unfeasible problem.
-*** ppl_lpsol -e -m -oobtained ex1.mps
-Optimum value: -3.75
+*** ppl_lpsol -s -n  -oobtained egout.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained ex1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained lseu.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained markshare1.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained markshare2.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained mip.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained p0033.mps
+Feasible problem.
+*** ppl_lpsol -s -n  -oobtained unboundedmin.mps
+Feasible problem.
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3
 Optimum location:
-x1 = 1.25
-x2 = 2.5
-*** ppl_lpsol -e -M -oobtained ex1.mps
-Optimum value: 2.5
+x1 = 1
+x2 = 2
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2
 Optimum location:
-x1 = 2.5
+x1 = 2
 x2 = 0
-*** ppl_lpsol -e -m -oobtained sample.mps
-Optimum value: -733.3333333
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.33333333
 Optimum location:
-x1 = 33.33333333
-x2 = 66.66666667
-x3 = 0
-*** ppl_lpsol -e -M -oobtained sample.mps
-Optimum value: 0
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 43
 Optimum location:
-x1 = 0
-x2 = 0
-x3 = 0
-*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ppl_lpsol -s -m -oobtained p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ppl_lpsol -s -M -oobtained p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
-*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -r -s -m -oobtained adlittle.mps
 Optimum value: 225494.9632
-Optimum location:
-...100 = 22.85454545
-...101 = 0.5454545455
-...102 = 4.62693727
-...103 = 0
-...104 = 0
-...105 = 35.10714286
-...106 = 4.793014706
-...107 = 2.942801288
-...108 = 0
-...109 = 44.40554954
-...110 = 0
-...111 = 9.884315099
-...112 = 0
-...113 = 0
-...114 = 108
-...115 = 0
-...116 = 0
-...117 = 0
-...118 = 0
-...119 = 0
-...120 = 13
-...121 = 0
-...122 = 0
-...123 = 0
-...124 = 73.92849567
-...125 = 51.29498565
-...126 = 139.7765187
-...127 = 0
-...128 = 0
-...129 = 109.3391662
-...130 = 3.803724425
-...131 = 3.920125575
-...132 = 134
-...133 = 0
-...134 = 0
-...135 = 0
-...136 = 31
-...137 = 0
-...138 = 0
-...139 = 0
-...140 = 0
-...141 = 60
-...142 = 111.7272727
-...143 = 0
-...144 = 51.90909091
-...145 = 29.86330761
-...146 = 4.136692391
-...147 = 0
-...148 = 0
-...149 = 41.5
-...150 = 0
-...151 = 15.4788166
-...152 = 0
-...153 = 15
-...154 = 0
-...155 = 0
-...156 = 3.1
-...157 = 0
-...158 = 0.6909090909
-...159 = 0
-...160 = 0
-...161 = 175.4447167
-...162 = 0
-...163 = 9.806141065
-...164 = 0
-...165 = 0
-...166 = 33.46836966
-...167 = 9.531630344
-...168 = 10.29307503
-...169 = 8.906924975
-...170 = 0
-...171 = 0
-...172 = 6.1
-...173 = 0
-...174 = 9.792857143
-...175 = 313.1973528
-...176 = 55.43167804
-...177 = 264.5552833
-...178 = 0
-...179 = 13.2
-...180 = 0
-...181 = 1.314479773
-...182 = 0.5032608696
-...183 = 0
-...184 = 0
-...185 = 0
-...186 = 0
-...187 = 0
-...188 = 0
-...189 = 0
-...190 = 0
-...191 = 13.5
-...192 = 8.737073136
-...193 = 0
-...194 = 31.2
-...195 = 0
-...196 = 0
-*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -r -s -M -oobtained adlittle.mps
 Unbounded problem.
-*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -r -s -m -oobtained afiro.mps
 Optimum value: -464.7531429
 Optimum location:
 X01 = 80
@@ -168,7 +156,7 @@ X36 = 339.9428571
 X37 = 17.50496094
 X38 = 157.5682954
 X39 = 0
-*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -r -s -M -oobtained afiro.mps
 Optimum value: 3438.2921
 Optimum location:
 X01 = 54.5
@@ -203,11 +191,11 @@ X36 = 345.4253571
 X37 = 0
 X38 = 0
 X39 = 389.4253571
-*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -r -s -m -oobtained bgprtr.mps
 Unfeasible problem.
-*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -r -s -M -oobtained bgprtr.mps
 Unfeasible problem.
-*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -r -s -m -oobtained blend.mps
 Optimum value: -30.81214985
 Optimum location:
 1 = 20.94480195
@@ -224,14 +212,14 @@ Optimum location:
 12 = 10.10117614
 13 = 0
 14 = 11.78035507
-15 = 0
-16 = 0.4067430357
+15 = 0.4067430357
+16 = 0
 17 = 0
 18 = 2.173256964
-19 = 2.018559906
-20 = 4.843256964
-21 = 0
-22 = 3.13818313
+19 = 1.61181687
+20 = 5.25
+21 = 3.079217438
+22 = 0.05896569207
 23 = 1.149909949
 24 = 1.396291081
 25 = 0
@@ -270,8 +258,8 @@ Optimum location:
 58 = 0
 59 = 0
 60 = 0
-61 = 3.079217438
-62 = 0.795583754
+61 = 0
+62 = 3.874801192
 63 = 3.874801192
 64 = 0.7749576722
 65 = 1.83076589
@@ -293,1085 +281,315 @@ Optimum location:
 81 = 0.8033012352
 82 = 26.03036862
 83 = 87.09497412
-*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -r -s -M -oobtained blend.mps
 Unbounded problem.
-*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -r -s -m -oobtained boeing1.mps
 Optimum value: -335.2135675
-Optimum location:
-PBOSHNL0 = 0
-PBOSHNL1 = 12
-PBOSHNL7 = 0
-PBOSHNL8 = 0
-PBOSLAX0 = 14
-PBOSLAX1 = 0
-PBOSLAX7 = 0
-PBOSSEA0 = 0
-PBOSSEA1 = 0
-PBOSSEA2 = 49
-PBOSSFO0 = 73
-PBOSSFO1 = 60
-PBOSTPE1 = 1
-PBOSTPE2 = 0
-PBOSTYO1 = 3
-PBOSTYO2 = 0
-PBOSYUL0 = 28.13380282
-PBOSYUL1 = 347.7678621
-PBOSYUL2 = 0.325
-PBOSYUL3 = 336.7733351
-PBOSYUL4 = 0
-PBOSYVR0 = 0
-PBOSYVR1 = 0
-PBOSYVR2 = 26
-PBOSYWG0 = 0
-PBOSYWG1 = 0
-PBOSYWG7 = 37
-PBOSYYZ0 = 19.03169014
-PBOSYYZ1 = 195.9683099
-PBUROAK0 = 11
-PBUROAK1 = 16
-PBURSEA0 = 83
-PBURSEA1 = 0
-PBURSFO0 = 278
-PHNLLAX0 = 104.0482353
-PHNLLAX1 = 33.04
-PHNLLAX2 = 68.20588235
-PHNLLAX3 = 98
-PHNLLON0 = 0
-PHNLLON6 = 5
-PHNLPAR0 = 0
-PHNLPAR6 = 1
-PHNLSEA0 = 0
-PHNLSEA1 = 157.7943925
-PHNLSEA2 = 0
-PHNLSFO0 = 35
-PHNLSFO1 = 0
-PHNLSFO7 = 0
-PHNLYVR0 = 94.20560748
-PHNLYVR1 = 0
-PHNLYVR7 = 39.79439252
-PLASSEA0 = 33.01327253
-PLASSEA1 = 342.9867275
-PLASYVR0 = 37
-PLASYVR6 = 0
-PLAXOAK0 = 32
-PLAXOAK1 = 0
-PLAXOAK2 = 46
-PLAXSEA0 = 0
-PLAXSEA1 = 0
-PLAXSEA2 = 0
-PLAXSEA3 = 546.0147059
-PLAXSEA4 = 3.720588235
-PLAXSEA5 = 139
-PLAXSEA6 = 66.26744186
-PLAXSEA7 = 0
-PLAXSEA8 = 75
-PLAXSEA9 = 5.415868673
-PLAXSFO0 = 33.04
-PLAXSFO1 = 260.8488372
-PLAXSFO2 = 839.9632721
-PLAXSFO3 = 87.90697674
-PLAXSFO4 = 168
-PLAXSFO5 = 98
-PLAXSFO6 = 1464.240914
-PLAXTPE0 = 8.581395349
-PLAXTPE1 = 0
-PLAXTPE2 = 0
-PLAXTPE8 = 22.41860465
-PLAXTYO0 = 41
-PLAXTYO1 = 0
-PLAXTYO2 = 0
-PLAXTYO8 = 0
-PLAXYVR0 = 0
-PLAXYVR1 = 153.755814
-PLAXYVR2 = 39.24418605
-PLONPAR0 = 0
-PLONPAR1 = 0
-PLONPAR2 = 2
-PLONSEA0 = 0
-PLONSEA1 = 151
-PLONYVR0 = 0
-PLONYVR1 = 0
-PLONYVR7 = 51
-POAKONT0 = 0
-POAKONT1 = 13
-POAKSEA0 = 37.89108456
-POAKSEA1 = 77.15303309
-POAKSEA2 = 6.955882353
-PONTSFO0 = 177
-PONTSEA0 = 23.10431985
-PONTSEA1 = 24.89568015
-PONTSEA2 = 0
-PPARSEA0 = 0
-PPARSEA1 = 68
-PPARYVR0 = 0
-PPARYVR1 = 0
-PPARYVR7 = 24
-PRNOSEA0 = 0
-PRNOSEA1 = 291
-PRNOYVR0 = 67
-PSEASFO0 = 0
-PSEASFO1 = 839.9632721
-PSEASFO2 = 146.6809139
-PSEASFO3 = 236.6
-PSEASFO4 = 0
-PSEASFO5 = 50.75581395
-PSEASFO6 = 145
-PSEATPE0 = 75.80232558
-PSEATPE1 = 0
-PSEATPE2 = 0
-PSEATPE3 = 1.61627907
-PSEATYO0 = 0
-PSEATYO1 = 0
-PSEATYO2 = 0
-PSEATYO3 = 138
-PSEAYVR0 = 164.8598131
-PSEAYVR1 = 0
-PSEAYVR2 = 0
-PSEAYVR3 = 392
-PSEAYVR4 = 0
-PSEAYVR5 = 33.01327253
-PSEAYVR6 = 0
-PSEAYVR7 = 50.75581395
-PSEAYVR8 = 47.16549296
-PSFOTPE0 = 0
-PSFOTPE1 = 0
-PSFOTPE2 = 6
-PSFOTPE8 = 0
-PSFOTYO0 = 0
-PSFOTYO1 = 0
-PSFOTYO2 = 17
-PSFOTYO8 = 0
-PSFOYVR0 = 260.8488372
-PSFOYVR1 = 37.15116279
-PTPETYO0 = 51.01162791
-PTPETYO1 = 0
-PTPETYO2 = 59.98837209
-PTPETYO3 = 0
-PTPEYVR0 = 57
-PTYOYVR0 = 91
-PYULYVR0 = 36.4084507
-PYULYVR1 = 134.1343917
-PYULYVR2 = 139.6904909
-PYULYVR3 = 4.766666667
-PYULYWG0 = 0
-PYULYWG1 = 271.3172923
-PYULYWG2 = 0
-PYULYWG3 = 178.6827077
-PYULYYZ0 = 0
-PYULYYZ1 = 266.6818464
-PYULYYZ2 = 0
-PYULYYZ3 = 431.9057717
-PYULYYZ4 = 1913.412382
-PYVRYWG0 = 14.67957746
-PYVRYWG1 = 271.3172923
-PYVRYWG2 = 138.0031303
-PYVRYYZ0 = 4.352112676
-PYVRYYZ1 = 241.2835753
-PYVRYYZ2 = 126.3643121
-PYWGYYZ0 = 14.67957746
-PYWGYYZ1 = 138.0031303
-PYWGYYZ2 = 0
-PYWGYYZ3 = 125.3172923
-PBOSOAK0 = 11
-PBOSOAK6 = 0
-PBOSBUR1 = 7
-PBOSBUR2 = 0
-PBOSONT1 = 4
-PBOSONT2 = 0
-PBURYVR1 = 26
-PBURTYO1 = 2
-PBURTPE1 = 1
-PBURHNL0 = 11
-PBURHNL6 = 0
-PHNLOAK0 = 0
-PHNLOAK1 = 24
-PHNLOAK2 = 0
-PHNLOAK8 = 0
-PHNLONT0 = 9.705882353
-PHNLONT6 = 6.294117647
-PHNLYWG1 = 3
-PHNLYYZ1 = 24
-PHNLYUL1 = 40
-PLASTYO1 = 5
-PLASTPE1 = 1
-PLAXLON0 = 13
-PLAXLON6 = 0
-PLAXLON7 = 0
-PLAXPAR0 = 8
-PLAXPAR6 = 0
-PLAXPAR7 = 0
-PBURLON1 = 1
-PBURPAR1 = 1
-PLONONT1 = 1
-PLONOAK1 = 1
-POAKPAR1 = 2
-POAKTYO1 = 7
-POAKTPE1 = 2
-PONTPAR1 = 2
-PONTTYO1 = 2
-PONTTPE1 = 1
-PPARSFO1 = 2
-PRNOTYO1 = 5
-PRNOTPE1 = 2
-PTPEYWG1 = 21
-PTPEYYZ1 = 13
-PTPEYUL1 = 6
-PTYOYUL1 = 7
-PTYOYYZ1 = 17
-PTYOYWG1 = 25
-PLAXONT0 = 6.294117647
-GRDTIMO1 = 0
-GRDTIMN1 = -49.01286158
-GRDTIMO2 = 0
-GRDTIMN2 = 0
-GRDTIMO3 = 0
-GRDTIMN3 = -47
-GRDTIMO4 = 0
-GRDTIMN4 = 0
-GRDTIMO5 = 0
-GRDTIMN5 = -47.24353963
-GRDTIMO6 = 0
-GRDTIMN6 = -81
-N1001AC1 = 0
-N1001AC2 = 0
-N1001AC3 = 0
-N1002AC1 = 0
-N1002AC2 = 0
-N1002AC3 = 2.355140187
-N1003AC1 = 0
-N1003AC2 = 0.1603208556
-N1003AC3 = 0.7214438503
-N1004AC1 = 0.28
-N1004AC2 = 0
-N1004AC3 = 0
-N1005AC3 = 0.0859375
-N1105AC3 = 0.8382352941
-N1006AC3 = 0.07582720588
-N1007AC1 = 0
-N1007AC2 = 0
-N1007AC3 = 0
-N1008AC1 = 0
-N1008AC2 = 0
-N1008AC3 = 0
-N1008AC4 = 0
-N1008AC5 = 0
-N1008AC6 = 4.65801495
-N1009AC1 = 0
-N1009AC2 = 0.07488107822
-N1009AC3 = 0
-N1009AC4 = 0
-N1009AC5 = 1.921947674
-N1010AC1 = 0
-N1010AC2 = 0
-N1010AC3 = 0
-N1010AC4 = 0
-N1010AC5 = 0
-N1010AC6 = 7
-N1011AC1 = 0
-N1011AC2 = 3.085065997
-N1011AC3 = 0.6951730225
-N1011AC4 = 0
-N1011AC5 = 3.897217245
-N1011AC6 = 0
-N1012AC1 = 1.510832058
-N1012AC2 = 0
-N1012AC3 = 0
-N1012AC4 = 0
-N1012AC5 = 2.417331293
-N1013AC3 = 0
-N1013AC4 = 0
-N1013AC5 = 0
-N1013AC6 = 0.9241727941
-N1014AC3 = 0
-N1014AC4 = 0
-N1014AC5 = 1.691245404
-N1014AC6 = 0.2228170956
-N1015AC3 = 0
-N1015AC4 = 0.7048194146
-N1015AC5 = 0.1595430366
-N1015AC6 = 2.135637549
-N1016AC3 = 0
-N1016AC4 = 0
-N1016AC5 = 0.7
-N1016AC6 = 3.3
-N1017AC3 = 0
-N1017AC4 = 0
-N1017AC5 = 0
-N1017AC6 = 0.1617647059
-N1018AC1 = 0
-N1018AC2 = 0
-N1018AC3 = 0
-N1018AC4 = 0
-N1018AC5 = 0
-N1018AC6 = 1.196428571
-N1019AC1 = 0
-N1019AC2 = 0
-N1019AC3 = 0
-N1019AC4 = 0.2345133807
-N1019AC5 = 0.7654866193
-N1020AC1 = 0.2228332753
-N1020AC2 = 0
-N1020AC3 = 0
-N1020AC4 = 0
-N1020AC5 = 3.200696136
-N1020AC6 = 0
-N1021AC1 = 0.664202377
-N1021AC2 = 0
-N1021AC3 = 0
-N1021AC4 = 0
-N1021AC5 = 2.453858782
-N1022AC1 = 0
-N1023AC1 = 0
-N1026AC1 = 1
-N1027AC1 = 0.476744186
-N1028AC1 = 0
-N1029AC1 = 0.523255814
-N1030AC1 = 1
-N1032AC1 = 0
-N1032AC2 = 0
-N1032AC3 = 0
-N1032AC4 = 0.8274647887
-N1032AC5 = 0
-N1033AC1 = 0.4860357966
-N1033AC2 = 0.500476922
-N1033AC3 = 0
-N1033AC4 = 0
-N1033AC5 = 2.061996183
-N1034AC1 = 0
-N1034AC2 = 0
-N1034AC3 = 3.174783885
-N1035AC1 = 0.6827679474
-N1035AC2 = 0
-N1035AC3 = 0
-N1035AC4 = 0.7269371829
-N1035AC5 = 0.2529831862
-N1036AC1 = 0.1083333333
-N1036AC2 = 0
-N1036AC3 = 0
-N1037AC4 = 0
-N1037AC5 = 0
-N1038AC4 = 0.2383968781
-N1038AC5 = 1.271450017
-N1039AC4 = 0
-N1039AC5 = 2.077705904
-N1040AC4 = 0
-N1040AC5 = 0
-N1040AC6 = 9.513243659
-N1041AC4 = 8.856901224
-N1041AC5 = 0
-N1041AC6 = 20
-N1042AC4 = 0
-N1042AC5 = 0
-N1042AC6 = 0
-N1043AC1 = 0.1725352113
-N1043AC2 = 0
-N1043AC3 = 0
-N1044AC1 = 0
-N1044AC2 = 0
-N1044AC3 = 1
-N1046AC3 = 1
-N1047AC1 = 0
-N1047AC2 = 0
-N1047AC3 = 1
-N1050AC3 = 0
-N1050AC4 = 0
-N1050AC5 = 0.0731874145
-N1051AC1 = 0
-N1051AC2 = 0
-N1051AC3 = 0
-N1051AC4 = 0
-N1051AC5 = 4.651904242
-N1051AC6 = 20
-*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -r -s -M -oobtained boeing1.mps
 Optimum value: 286.9746573
-Optimum location:
-PBOSHNL0 = 0
-PBOSHNL1 = 10
-PBOSHNL7 = 0
-PBOSHNL8 = 0
-PBOSLAX0 = 0
-PBOSLAX1 = 0
-PBOSLAX7 = 12
-PBOSSEA0 = 0
-PBOSSEA1 = 40
-PBOSSEA2 = 0
-PBOSSFO0 = 73
-PBOSSFO1 = 48
-PBOSTPE1 = 0
-PBOSTPE2 = 0
-PBOSTYO1 = 0
-PBOSTYO2 = 0
-PBOSYUL0 = 383.9469027
-PBOSYUL1 = 224.0530973
-PBOSYUL2 = 0
-PBOSYUL3 = 0
-PBOSYUL4 = 0
-PBOSYVR0 = 0
-PBOSYVR1 = 23
-PBOSYVR2 = 0
-PBOSYWG0 = 33
-PBOSYWG1 = 0
-PBOSYWG7 = 0
-PBOSYYZ0 = 0
-PBOSYYZ1 = 193
-PBUROAK0 = 9
-PBUROAK1 = 15
-PBURSEA0 = 69
-PBURSEA1 = 0
-PBURSFO0 = 243
-PHNLLAX0 = 0
-PHNLLAX1 = 126.296875
-PHNLLAX2 = 100.03125
-PHNLLAX3 = 104.4375
-PHNLLON0 = 0
-PHNLLON6 = 0
-PHNLPAR0 = 0
-PHNLPAR6 = 0
-PHNLSEA0 = 0
-PHNLSEA1 = 135.2523364
-PHNLSEA2 = 0
-PHNLSFO0 = 0
-PHNLSFO1 = 0
-PHNLSFO7 = 31
-PHNLYVR0 = 80.74766355
-PHNLYVR1 = 0
-PHNLYVR7 = 35.25233645
-PLASSEA0 = 365
-PLASSEA1 = 0
-PLASYVR0 = 0
-PLASYVR6 = 33
-PLAXOAK0 = 42.765625
-PLAXOAK1 = 0
-PLAXOAK2 = 46
-PLAXSEA0 = 295.96875
-PLAXSEA1 = 0
-PLAXSEA2 = 0
-PLAXSEA3 = 0
-PLAXSEA4 = 6
-PLAXSEA5 = 139
-PLAXSEA6 = 0
-PLAXSEA7 = 139
-PLAXSEA8 = 139
-PLAXSEA9 = 12.03125
-PLAXSFO0 = 164.828125
-PLAXSFO1 = 1090
-PLAXSFO2 = 0
-PLAXSFO3 = 20
-PLAXSFO4 = 68
-PLAXSFO5 = 144
-PLAXSFO6 = 1212.171875
-PLAXTPE0 = 0
-PLAXTPE1 = 18
-PLAXTPE2 = 9
-PLAXTPE8 = 0
-PLAXTYO0 = 0
-PLAXTYO1 = 9
-PLAXTYO2 = 27
-PLAXTYO8 = 0
-PLAXYVR0 = 116
-PLAXYVR1 = 0
-PLAXYVR2 = 57
-PLONPAR0 = 0
-PLONPAR1 = 0
-PLONPAR2 = 0
-PLONSEA0 = 0
-PLONSEA1 = 127
-PLONYVR0 = 0
-PLONYVR1 = 0
-PLONYVR7 = 45
-POAKONT0 = 0
-POAKONT1 = 11
-POAKSEA0 = 41
-POAKSEA1 = 57
-POAKSEA2 = 0
-PONTSFO0 = 155
-PONTSEA0 = 25
-PONTSEA1 = 12
-PONTSEA2 = 0
-PPARSEA0 = 0
-PPARSEA1 = 53
-PPARYVR0 = 0
-PPARYVR1 = 0
-PPARYVR7 = 21
-PRNOSEA0 = 255
-PRNOSEA1 = 0
-PRNOYVR0 = 60
-PSEASFO0 = 822
-PSEASFO1 = 0
-PSEASFO2 = 156
-PSEASFO3 = 224
-PSEASFO4 = 0
-PSEASFO5 = 20
-PSEASFO6 = 68
-PSEATPE0 = 0
-PSEATPE1 = 0
-PSEATPE2 = 42
-PSEATPE3 = 0
-PSEATYO0 = 0
-PSEATYO1 = 0
-PSEATYO2 = 117
-PSEATYO3 = 0
-PSEAYVR0 = 0
-PSEAYVR1 = 0
-PSEAYVR2 = 0
-PSEAYVR3 = 649.2523364
-PSEAYVR4 = 0
-PSEAYVR5 = 0
-PSEAYVR6 = 0
-PSEAYVR7 = 0
-PSEAYVR8 = 0
-PSFOTPE0 = 0
-PSFOTPE1 = 0
-PSFOTPE2 = 0
-PSFOTPE8 = 0
-PSFOTYO0 = 0
-PSFOTYO1 = 0
-PSFOTYO2 = 0
-PSFOTYO8 = 15
-PSFOYVR0 = 268
-PSFOYVR1 = 0
-PTPETYO0 = 0
-PTPETYO1 = 0
-PTPETYO2 = 99
-PTPETYO3 = 0
-PTPEYVR0 = 44
-PTYOYVR0 = 74
-PYULYVR0 = 182
-PYULYVR1 = 88
-PYULYVR2 = 0
-PYULYVR3 = 0
-PYULYWG0 = 161.3018868
-PYULYWG1 = 178
-PYULYWG2 = 31.69811321
-PYULYWG3 = 0
-PYULYYZ0 = 0
-PYULYYZ1 = 0
-PYULYYZ2 = 245.3018868
-PYULYYZ3 = 1997
-PYULYYZ4 = 107.6981132
-PYVRYWG0 = 194.3018868
-PYVRYWG1 = 178
-PYVRYWG2 = 4.698113208
-PYVRYYZ0 = 328.6981132
-PYVRYYZ1 = 0
-PYVRYYZ2 = 4.301886792
-PYWGYYZ0 = 0
-PYWGYYZ1 = 4.698113208
-PYWGYYZ2 = 245.3018868
-PYWGYYZ3 = 0
-PBOSOAK0 = 9
-PBOSOAK6 = 0
-PBOSBUR1 = 0
-PBOSBUR2 = 0
-PBOSONT1 = 0
-PBOSONT2 = 0
-PBURYVR1 = 23
-PBURTYO1 = 0
-PBURTPE1 = 0
-PBURHNL0 = 9
-PBURHNL6 = 0
-PHNLOAK0 = 0
-PHNLOAK1 = 2.234375
-PHNLOAK2 = 0
-PHNLOAK8 = 18.765625
-PHNLONT0 = 0
-PHNLONT6 = 14
-PHNLYWG1 = 0
-PHNLYYZ1 = 21
-PHNLYUL1 = 35
-PLASTYO1 = 0
-PLASTPE1 = 0
-PLAXLON0 = 11
-PLAXLON6 = 0
-PLAXLON7 = 0
-PLAXPAR0 = 0
-PLAXPAR6 = 0
-PLAXPAR7 = 0
-PBURLON1 = 0
-PBURPAR1 = 0
-PLONONT1 = 0
-PLONOAK1 = 0
-POAKPAR1 = 0
-POAKTYO1 = 0
-POAKTPE1 = 0
-PONTPAR1 = 0
-PONTTYO1 = 0
-PONTTPE1 = 0
-PPARSFO1 = 0
-PRNOTYO1 = 0
-PRNOTPE1 = 0
-PTPEYWG1 = 18
-PTPEYYZ1 = 11
-PTPEYUL1 = 0
-PTYOYUL1 = 0
-PTYOYYZ1 = 15
-PTYOYWG1 = 22
-PLAXONT0 = 14
-GRDTIMO1 = 0
-GRDTIMN1 = -105
-GRDTIMO2 = 0
-GRDTIMN2 = -91
-GRDTIMO3 = 0
-GRDTIMN3 = -47
-GRDTIMO4 = 0
-GRDTIMN4 = -43.5
-GRDTIMO5 = 0
-GRDTIMN5 = -87
-GRDTIMO6 = 0
-GRDTIMN6 = -81
-N1001AC1 = 0
-N1001AC2 = 0
-N1001AC3 = 0
-N1002AC1 = 0
-N1002AC2 = 2.018691589
-N1002AC3 = 0
-N1003AC1 = 0
-N1003AC2 = 0
-N1003AC3 = 0
-N1004AC1 = 0
-N1004AC2 = 1.0703125
-N1004AC3 = 0
-N1005AC3 = 0.0703125
-N1105AC3 = 0.9296875
-N1006AC3 = 0
-N1007AC1 = 0
-N1007AC2 = 0
-N1007AC3 = 0
-N1008AC1 = 5.28156777
-N1008AC2 = 0
-N1008AC3 = 1.986798017
-N1008AC4 = 0
-N1008AC5 = 0
-N1008AC6 = 0
-N1009AC1 = 0
-N1009AC2 = 0
-N1009AC3 = 0
-N1009AC4 = 0
-N1009AC5 = 0
-N1010AC1 = 7
-N1010AC2 = 7
-N1010AC3 = 7
-N1010AC4 = 7
-N1010AC5 = 7
-N1010AC6 = 7
-N1011AC1 = 0
-N1011AC2 = 0
-N1011AC3 = 0
-N1011AC4 = 0
-N1011AC5 = 0
-N1011AC6 = 0
-N1012AC1 = 0
-N1012AC2 = 0
-N1012AC3 = 0
-N1012AC4 = 0
-N1012AC5 = 0
-N1013AC3 = 0
-N1013AC4 = 0
-N1013AC5 = 0
-N1013AC6 = 1
-N1014AC3 = 0
-N1014AC4 = 0
-N1014AC5 = 0
-N1014AC6 = 1.909090909
-N1015AC3 = 0
-N1015AC4 = 0
-N1015AC5 = 0
-N1015AC6 = 3
-N1016AC3 = 0
-N1016AC4 = 0
-N1016AC5 = 0
-N1016AC6 = 4
-N1017AC3 = 0
-N1017AC4 = 0
-N1017AC5 = 0
-N1017AC6 = 0.09090909091
-N1018AC1 = 3.782713662
-N1018AC2 = 6.749720383
-N1018AC3 = 7
-N1018AC4 = 0
-N1018AC5 = 4.039001304
-N1018AC6 = 0
-N1019AC1 = 0
-N1019AC2 = 1.412371134
-N1019AC3 = 0
-N1019AC4 = 2.587628866
-N1019AC5 = 0
-N1020AC1 = 0
-N1020AC2 = 0
-N1020AC3 = 0
-N1020AC4 = 0
-N1020AC5 = 0
-N1020AC6 = 0
-N1021AC1 = 0
-N1021AC2 = 0
-N1021AC3 = 0
-N1021AC4 = 0
-N1021AC5 = 0
-N1022AC1 = 0
-N1023AC1 = 0
-N1026AC1 = 1
-N1027AC1 = 0
-N1028AC1 = 0
-N1029AC1 = 1
-N1030AC1 = 1
-N1032AC1 = 1
-N1032AC2 = 1
-N1032AC3 = 1
-N1032AC4 = 1
-N1032AC5 = 1
-N1033AC1 = 0
-N1033AC2 = 1.371681416
-N1033AC3 = 0
-N1033AC4 = 0.6283185841
-N1033AC5 = 0
-N1034AC1 = 0
-N1034AC2 = 0
-N1034AC3 = 0
-N1035AC1 = 0
-N1035AC2 = 0.04608448823
-N1035AC3 = 0
-N1035AC4 = 0.01051928536
-N1035AC5 = 0
-N1036AC1 = 0
-N1036AC2 = 0
-N1036AC3 = 0
-N1037AC4 = 0
-N1037AC5 = 3.220930233
-N1038AC4 = 0
-N1038AC5 = 0
-N1039AC4 = 0
-N1039AC5 = 0
-N1040AC4 = 10
-N1040AC5 = 10
-N1040AC6 = 10
-N1041AC4 = 5.793776249
-N1041AC5 = 20
-N1041AC6 = 20
-N1042AC4 = 20
-N1042AC5 = 20
-N1042AC6 = 20
-N1043AC1 = 0
-N1043AC2 = 0
-N1043AC3 = 0
-N1044AC1 = 0
-N1044AC2 = 1
-N1044AC3 = 0
-N1046AC3 = 1
-N1047AC1 = 0
-N1047AC2 = 1
-N1047AC3 = 0
-N1050AC3 = 0.109375
-N1050AC4 = 0
-N1050AC5 = 0
-N1051AC1 = 20
-N1051AC2 = 20
-N1051AC3 = 20
-N1051AC4 = 0
-N1051AC5 = 20
-N1051AC6 = 11.52971853
-*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -r -s -m -oobtained boeing2.mps
 Optimum value: -315.018728
-Optimum location:
-PBOSORD0 = 302
-PBOSORD1 = 0
-PBOSORD2 = 0
-PBOSORD3 = 0
-PBOSORD4 = 0
-PBOSLGA0 = 712
-PBOSLGA1 = 268
-PBOSLGA2 = 0
-PBOSLGA3 = 1372
-PBOSCLE0 = 0
-PBOSCLE1 = 142
-PBOSCLE2 = 0
-PBOSCLE3 = 0
-PORDBOS0 = 182.705314
-PORDBOS1 = 0
-PORDBOS2 = 0
-PORDBOS3 = 119.294686
-PORDBOS4 = 0
-PORDLGA0 = 0
-PORDLGA1 = 515
-PORDLGA2 = 0
-PORDLGA3 = 0
-PORDCLE0 = 12.29468599
-PORDCLE1 = 0
-PORDCLE2 = 458
-PORDCLE3 = 148.705314
-PLGABOS0 = 913
-PLGABOS1 = 458
-PLGABOS2 = 0
-PLGABOS3 = 0
-PLGABOS4 = 0
-PLGABOS5 = 1372
-PLGAORD0 = 712
-PLGAORD1 = 0
-PLGAORD2 = 0
-PLGAORD3 = 0
-PLGACLE0 = 0
-PLGACLE1 = 249
-PLGACLE2 = 268
-PCLEBOS0 = 0
-PCLEBOS1 = 0
-PCLEBOS2 = 0
-PCLEBOS3 = 131
-PCLEBOS4 = 0
-PCLEORD0 = 178.5972891
-PCLEORD1 = 249
-PCLEORD2 = 16.40271092
-PCLEORD3 = 268
-PCLEORD4 = 0
-PCLELGA0 = 409
-PCLELGA1 = 0
-PCLELGA2 = 0
-PCLELGA3 = 0
-BBOSORD0 = 0
-BBOSORD1 = 0
-BBOSCLE0 = 0.1616272102
-BBOSCLE1 = 7.026778587
-BORDBOS0 = 3.188405797
-CBOSORD0 = 12
-CBOSORD1 = 0
-CBOSORD2 = 0
-CBOSORD3 = 0
-CBOSORD4 = 0
-CBOSCLE0 = 0
-CBOSCLE1 = 8.811594203
-CBOSCLE2 = 0
-CBOSCLE3 = 0
-CORDBOS0 = 20.8115942
-CORDBOS1 = 0
-CORDBOS2 = 0
-CORDBOS3 = 0
-CORDBOS4 = 0
-CORDLGA0 = 13
-CORDLGA1 = 0
-CORDLGA2 = 0
-CORDLGA3 = 0
-CLGAORD0 = 22.5
-CLGAORD1 = 22.5
-CLGAORD2 = 0
-CLGAORD3 = 0
-CLGACLE0 = 16
-CLGACLE1 = 0
-CLGACLE2 = 0
-CCLELGA0 = 0
-CCLELGA1 = 5
-CCLELGA2 = 0
-CCLELGA3 = 0
-GRDTIMO1 = 0
-GRDTIMN1 = 0
-GRDTIMO2 = 0
-GRDTIMN2 = -76.79770851
-GRDTIMN3 = -10.27177739
-GRDTIMN4 = -21.60844089
-N1003AC1 = 0
-N1003AC2 = 6.724489796
-N1003AC3 = 0.4
-N1003AC4 = 0
-N1005AC1 = 0.01346893419
-N1005AC2 = 0
-N1005AC3 = 0
-N1005AC4 = 0
-N1011AC1 = 0.5855648822
-N1011AC2 = 0
-N1011AC3 = 0.2937198068
-N1011AC4 = 0
-N1013AC2 = 7.265306122
-N1013AC4 = 2
-N1015AC2 = 0
-N1015AC4 = 1.422222222
-N1017AC2 = 0
-N1017AC4 = 2
-N1019AC2 = 2.540816327
-N1019AC4 = 0
-N1021AC1 = 0.01346893419
-N1021AC2 = 0.1254559795
-N1021AC3 = 0
-N1021AC4 = 0
-N1002AC1 = 0
-N1002AC2 = 0.1254559795
-N1002AC3 = 0
-N1002AC4 = 0
-N1004AC2 = 2.540816327
-N1004AC4 = 2
-N1006AC1 = 0.5990338164
-N1006AC2 = 0
-N1006AC3 = 0.6937198068
-N1006AC4 = 0
-N1008AC2 = 9.316326531
-N1008AC4 = 2
-N1010AC2 = 4.673469388
-N1010AC4 = 0
-N1012AC2 = 0
-N1012AC4 = 1.422222222
-N1014AC2 = 0
-N1014AC4 = 0
-N1100AC2 = 2.734693878
-N1100AC4 = 0
-N1102AC2 = 0
-N1102AC4 = 0
-N1200AC2 = 14
-N1200AC4 = 0
-N1201AC2 = 14
-N1201AC4 = 0
-*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -r -s -M -oobtained boeing2.mps
 Optimum value: -73.36896911
+*** ppl_lpsol -r -s -m -oobtained egout.mps
+Optimum value: 149.5887662
 Optimum location:
-PBOSORD0 = 277
-PBOSORD1 = 0
-PBOSORD2 = 0
-PBOSORD3 = 0
-PBOSORD4 = 0
-PBOSLGA0 = 258.2518987
-PBOSLGA1 = 686
-PBOSLGA2 = 35.74810133
-PBOSLGA3 = 1372
-PBOSCLE0 = 0
-PBOSCLE1 = 0
-PBOSCLE2 = 0
-PBOSCLE3 = 142
-PORDBOS0 = 302
-PORDBOS1 = 0
-PORDBOS2 = 0
-PORDBOS3 = 0
-PORDBOS4 = 0
-PORDLGA0 = 0
-PORDLGA1 = 0
-PORDLGA2 = 515
-PORDLGA3 = 0
-PORDCLE0 = 0
-PORDCLE1 = 619
-PORDCLE2 = 0
-PORDCLE3 = 0
-PLGABOS0 = 0
-PLGABOS1 = 712
-PLGABOS2 = 517
-PLGABOS3 = 686
-PLGABOS4 = 426.7481013
-PLGABOS5 = 401.2518987
-PLGAORD0 = 258.2518987
-PLGAORD1 = 0
-PLGAORD2 = 453.7481013
-PLGAORD3 = 0
-PLGACLE0 = 517
-PLGACLE1 = 0
-PLGACLE2 = 0
-PCLEBOS0 = 131
-PCLEBOS1 = 0
-PCLEBOS2 = 0
-PCLEBOS3 = 0
-PCLEBOS4 = 0
-PCLEORD0 = 0
-PCLEORD1 = 0
-PCLEORD2 = 712
-PCLEORD3 = 0
-PCLEORD4 = 0
-PCLELGA0 = 0
-PCLELGA1 = 0
-PCLELGA2 = 18
-PCLELGA3 = 391
-BBOSORD0 = 0
-BBOSORD1 = 0
-BBOSCLE0 = 0
-BBOSCLE1 = 0
-BORDBOS0 = 0
-CBOSORD0 = 0
-CBOSORD1 = 0
-CBOSORD2 = 0
-CBOSORD3 = 0
-CBOSORD4 = 0
-CBOSCLE0 = 0
-CBOSCLE1 = 0
-CBOSCLE2 = 12.8
-CBOSCLE3 = 0
-CORDBOS0 = 0
-CORDBOS1 = 0
-CORDBOS2 = 0
-CORDBOS3 = 19.2
-CORDBOS4 = 0
-CORDLGA0 = 0
-CORDLGA1 = 0
-CORDLGA2 = 10.4
-CORDLGA3 = 0
-CLGAORD0 = 0
-CLGAORD1 = 0
-CLGAORD2 = 20.1
-CLGAORD3 = 15.9
-CLGACLE0 = 10.4
-CLGACLE1 = 2.4
-CLGACLE2 = 0
-CCLELGA0 = 0
-CCLELGA1 = 0
-CCLELGA2 = 0
-CCLELGA3 = 0
-GRDTIMO1 = 73.01076
-GRDTIMN1 = -100
-GRDTIMO2 = 0
-GRDTIMN2 = -90
-GRDTIMN3 = -45
-GRDTIMN4 = -45
-N1003AC1 = 7
-N1003AC2 = 0
-N1003AC3 = 0.6856076556
-N1003AC4 = 0
-N1005AC1 = 0
-N1005AC2 = 0
-N1005AC3 = 0
-N1005AC4 = 0
-N1011AC1 = 0
-N1011AC2 = 0
-N1011AC3 = 1.314392344
-N1011AC4 = 0
-N1013AC2 = 2.635223456
-N1013AC4 = 0
-N1015AC2 = 5.275510204
-N1015AC4 = 0.9244444444
-N1017AC2 = 0
-N1017AC4 = 0
-N1019AC2 = 4.630082667
-N1019AC4 = 2
-N1021AC1 = 7
-N1021AC2 = 0
-N1021AC3 = 2
-N1021AC4 = 0.9244444444
-N1002AC1 = 7
-N1002AC2 = 0
-N1002AC3 = 2
-N1002AC4 = 2
-N1004AC2 = 0
-N1004AC4 = 0
-N1006AC1 = 7
-N1006AC2 = 0
-N1006AC3 = 2
-N1006AC4 = 0
-N1008AC2 = 0
-N1008AC4 = 0
-N1010AC2 = 7.265306122
-N1010AC4 = 0.9244444444
-N1012AC2 = 0
-N1012AC4 = 2
-N1014AC2 = 5.275510204
-N1014AC4 = 0
-N1100AC2 = 7
-N1100AC4 = 5.274621909
-N1102AC2 = 4.354572463
-N1102AC4 = 0
-N1200AC2 = 14
-N1200AC4 = 0.9244444444
-N1201AC2 = 4.094407129
-N1201AC4 = 0
-*** ppl_lpsol -s -m -oobtained ex1.mps
+I.001... = 0.02093301435
+I.001003 = 0
+I.002003 = 0
+I.002... = 0.00521189337
+I.003005 = 0
+I.004005 = 0
+I.004... = 0.06758373206
+I.005007 = 0
+I.006007 = 0.03879015721
+I.007008 = 0.04853041695
+I.008... = 0.04853041695
+I.008009 = 0
+I.010012 = 0.009654818865
+I.011012 = 0.1833561176
+I.012... = 0.1930109364
+I.012013 = 0
+I.013016 = 0.03964456596
+I.014015 = 0.002648667122
+I.015016 = 0.01324333561
+I.016... = 0.05288790157
+I.016017 = 0
+I.017018 = 0.0005980861244
+I.009018 = 0.002392344498
+I.018019 = 0.002990430622
+I.019024 = 0.02358168148
+I.024... = 0.0241797676
+I.023024 = 0.0005980861244
+I.022023 = 0
+I.020022 = 0.003332194122
+I.021022 = 0.06331168831
+I.022... = 0.06664388243
+I.024026 = 0
+I.025026 = 0
+I.025... = 0.1642173616
+I.026027 = 0.08962747779
+I.027... = 0.08962747779
+I.027032 = 0
+I.030031 = 0.002392344498
+I.031032 = 0.0534859877
+I.029031 = 0.0487012987
+I.028029 = 0
+I.028... = 0.007518796992
+I.032033 = 0.0534859877
+I.033037 = 0.05510936432
+I.036037 = 0.008885850991
+I.034036 = 0.001623376623
+I.035036 = 0.002392344498
+I.037038 = 0.06399521531
+I.038040 = 0.109278879
+I.039040 = 0.04545454545
+I.040... = 0.161226931
+I.041... = 0.04340396446
+I.040041 = 0
+I.041042 = 0
+I.042... = 0.05502392344
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 2.45
+F.001003 = 0
+F.002003 = 0
+F.002... = 0.61
+F.003005 = 0
+F.004005 = 0
+F.004... = 7.91
+F.005007 = 0
+F.006007 = 4.54
+F.007008 = 5.68
+F.008... = 5.68
+F.008009 = 0
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 22.59
+F.012013 = 0
+F.013016 = 4.64
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 6.19
+F.016017 = 0
+F.017018 = 0.07
+F.009018 = 0.28
+F.018019 = 0.35
+F.019024 = 2.76
+F.024... = 2.83
+F.023024 = 0.07
+F.022023 = 0
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 7.8
+F.024026 = 0
+F.025026 = 0
+F.025... = 19.22
+F.026027 = 10.49
+F.027... = 10.49
+F.027032 = 0
+F.030031 = 0.28
+F.031032 = 6.26
+F.029031 = 5.7
+F.028029 = 0
+F.028... = 0.88
+F.032033 = 6.26
+F.033037 = 6.45
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 7.49
+F.038040 = 12.79
+F.039040 = 5.32
+F.040... = 18.87
+F.041... = 5.08
+F.040041 = 0
+F.041042 = 0
+F.042... = 6.44
+*** ppl_lpsol -r -s -M -oobtained egout.mps
+Optimum value: 964.30053
+Optimum location:
+I.001... = 1
+I.001003 = 1
+I.002003 = 1
+I.002... = 1
+I.003005 = 1
+I.004005 = 1
+I.004... = 1
+I.005007 = 1
+I.006007 = 1
+I.007008 = 1
+I.008... = 1
+I.008009 = 1
+I.010012 = 1
+I.011012 = 1
+I.012... = 1
+I.012013 = 1
+I.013016 = 1
+I.014015 = 1
+I.015016 = 1
+I.016... = 1
+I.016017 = 1
+I.017018 = 1
+I.009018 = 1
+I.018019 = 1
+I.019024 = 1
+I.024... = 1
+I.023024 = 1
+I.022023 = 1
+I.020022 = 1
+I.021022 = 1
+I.022... = 1
+I.024026 = 1
+I.025026 = 1
+I.025... = 1
+I.026027 = 1
+I.027... = 1
+I.027032 = 1
+I.030031 = 1
+I.031032 = 1
+I.029031 = 1
+I.028029 = 1
+I.028... = 1
+I.032033 = 1
+I.033037 = 1
+I.036037 = 1
+I.034036 = 1
+I.035036 = 1
+I.037038 = 1
+I.038040 = 1
+I.039040 = 1
+I.040... = 1
+I.041... = 1
+I.040041 = 1
+I.041042 = 1
+I.042... = 1
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 0
+F.001003 = 2.45
+F.002003 = 0.61
+F.002... = 0
+F.003005 = 3.06
+F.004005 = 7.91
+F.004... = 0
+F.005007 = 10.97
+F.006007 = 4.54
+F.007008 = 16.65
+F.008... = 0
+F.008009 = 16.65
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 0
+F.012013 = 22.59
+F.013016 = 27.23
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 0
+F.016017 = 28.78
+F.017018 = 28.85
+F.009018 = 16.93
+F.018019 = 45.78
+F.019024 = 48.19
+F.024... = 0
+F.023024 = 7.87
+F.022023 = 7.8
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 0
+F.024026 = 56.06
+F.025026 = 19.22
+F.025... = 0
+F.026027 = 85.77
+F.027... = 0
+F.027032 = 85.77
+F.030031 = 0.28
+F.031032 = 7.14
+F.029031 = 6.58
+F.028029 = 0.88
+F.028... = 0
+F.032033 = 92.91
+F.033037 = 93.1
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 94.14
+F.038040 = 99.44
+F.039040 = 5.32
+F.040... = 0
+F.041... = 0
+F.040041 = 105.52
+F.041042 = 110.6
+F.042... = 117.04
+*** ppl_lpsol -r -s -m -oobtained ex1.mps
 Optimum value: -3.75
 Optimum location:
 x1 = 1.25
 x2 = 2.5
-*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -r -s -M -oobtained ex1.mps
 Optimum value: 2.5
 Optimum location:
 x1 = 2.5
 x2 = 0
-*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -r -s -m -oobtained kb2.mps
 Optimum value: -1749.90013
 Optimum location:
 BAL.3EBW = 0.8118235251
@@ -1415,7 +633,7 @@ WMO73PBW = 1770.361014
 WRO73PBW = 2009.742955
 WMO73RBW = 5651.99315
 WRO73RBW = 6262.646874
-*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -r -s -M -oobtained kb2.mps
 Optimum value: 0
 Optimum location:
 BAL.3EBW = 0
@@ -1459,33 +677,926 @@ WMO73PBW = 0
 WRO73PBW = 0
 WMO73RBW = 0
 WRO73RBW = 0
-*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -r -s -m -oobtained lseu.mps
+Optimum value: 834.6823529
+Optimum location:
+C101 = 1
+C102 = 1
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 1
+C108 = 0
+C109 = 0
+C110 = 0
+C111 = 0.4367816092
+C112 = 0.3367816092
+C113 = 0
+C114 = 0.2264367816
+C115 = 0
+C116 = 0
+C117 = 0
+C118 = 0
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 0
+C123 = 0
+C124 = 0
+C125 = 0
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0.6117647059
+C130 = 0.155
+C131 = 0
+C132 = 0
+C133 = 0
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 1
+C140 = 0
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 0.38
+C145 = 0
+C146 = 0
+C147 = 0.62
+C148 = 0
+C149 = 0
+C150 = 0.1
+C151 = 0.9
+C152 = 0
+C153 = 0
+C154 = 0
+C155 = 0
+C156 = 1
+C157 = 0
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 0
+C164 = 0.9043285239
+C165 = 0.09567147614
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 0
+C177 = 0
+C178 = 0
+C179 = 0
+C180 = 0
+C181 = 0
+C182 = 0
+C183 = 0
+C184 = 0
+C185 = 0
+C186 = 0
+C187 = 0
+C188 = 0
+C189 = 0
+*** ppl_lpsol -r -s -M -oobtained lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0.3428571429
+C132 = 0
+C133 = 0.6571428571
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained markshare1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0.4643273602
+x14 = 0
+x15 = 1
+x16 = 0.9623071054
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0
+x22 = 1
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 1
+x29 = 1
+x30 = 1
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 1
+x37 = 0.839896525
+x38 = 0
+x39 = 0
+x40 = 1
+x41 = 1
+x42 = 0
+x43 = 1
+x44 = 0.09199314836
+x45 = 1
+x46 = 1
+x47 = 1
+x48 = 1
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 1
+x54 = 1
+x55 = 0
+x56 = 0.3536953199
+x57 = 1
+x58 = 0
+x59 = 0
+x60 = 1
+x61 = 0
+x62 = 0.2898890259
+*** ppl_lpsol -r -s -M -oobtained markshare1.mps
+Optimum value: 7286
+Optimum location:
+x1 = 1116
+x2 = 0
+x3 = 1325
+x4 = 0
+x5 = 1353
+x6 = 0
+x7 = 1169
+x8 = 0
+x9 = 1160
+x10 = 0
+x11 = 1163
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+*** ppl_lpsol -r -s -m -oobtained markshare2.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0.3717008822
+x22 = 0.1692962317
+x23 = 1
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 1
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 1
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 1
+x47 = 0
+x48 = 0
+x49 = 0.01751673708
+x50 = 0.1466102207
+x51 = 0.3205265241
+x52 = 1
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 1
+x62 = 1
+x63 = 1
+x64 = 1
+x65 = 0.4427598921
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 1
+x73 = 0.6098932051
+x74 = 1
+*** ppl_lpsol -r -s -M -oobtained markshare2.mps
+Optimum value: 10512
+Optimum location:
+x1 = 1324
+x2 = 0
+x3 = 1554
+x4 = 0
+x5 = 1429
+x6 = 0
+x7 = 1686
+x8 = 0
+x9 = 1482
+x10 = 0
+x11 = 1613
+x12 = 0
+x13 = 1424
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+*** ppl_lpsol -r -s -m -oobtained mip.mps
 Optimum value: 24.07692308
 Optimum location:
 X1 = 2.615384615
 X2 = 2
 X3 = 0.7692307692
 X4 = 3
-*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -r -s -M -oobtained mip.mps
 Optimum value: 46.42857143
 Optimum location:
 X1 = 4
 X2 = 4.571428571
 X3 = 0.5714285714
 X4 = 3
-*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -r -s -m -oobtained noswot.mps
+Optimum value: -43
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0.9583331684
+x52 = 9.1999988
+x53 = 1
+x54 = 9.6000004
+x55 = 1
+x56 = 9.6000004
+x57 = 1
+x58 = 9.6000004
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ppl_lpsol -r -s -M -oobtained noswot.mps
+Optimum value: -5
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ppl_lpsol -r -s -m -oobtained p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ppl_lpsol -r -s -M -oobtained p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ppl_lpsol -r -s -m -oobtained pk1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0.853048009
+x3 = 0
+x4 = 0
+x5 = 0.9902413468
+x6 = 0.6585148486
+x7 = 0.2829608277
+x8 = 0
+x9 = 0
+x10 = 1
+x11 = 0
+x12 = 1
+x13 = 0.331125321
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 1
+x18 = 1
+x19 = 0
+x20 = 0.1009956211
+x21 = 0.6785106979
+x22 = 0
+x23 = 1
+x24 = 0.8947436612
+x25 = 1
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0.1242007274
+x34 = 0.557112246
+x35 = 0.429812324
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0.3510036592
+x43 = 0
+x44 = 1
+x45 = 1
+x46 = 0
+x47 = 0
+x48 = 0.5414381495
+x49 = 1
+x50 = 0.2173113881
+x51 = 0
+x52 = 1
+x53 = 1
+x54 = 0
+x55 = 1
+x56 = 0.9323580046
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+*** ppl_lpsol -r -s -M -oobtained pk1.mps
+Unbounded problem.
+*** ppl_lpsol -r -s -m -oobtained sample.mps
 Optimum value: -733.3333333
 Optimum location:
 x1 = 33.33333333
 x2 = 66.66666667
 x3 = 0
-*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -r -s -M -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
 x3 = 0
-*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -r -s -m -oobtained sc105.mps
 Optimum value: -52.20206121
 Optimum location:
 COL00001 = 0
@@ -1591,113 +1702,113 @@ COL00100 = 26.37637065
 COL00101 = 26.37637065
 COL00102 = 123.0897297
 COL00103 = 123.0897297
-*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -r -s -M -oobtained sc105.mps
 Optimum value: 0
 Optimum location:
 COL00001 = 0
-COL00002 = 50
+COL00002 = 0
 COL00003 = 0
 COL00004 = 0
 COL00005 = 0
 COL00006 = 0
-COL00007 = 50
+COL00007 = 0
 COL00008 = 0
 COL00009 = 0
 COL00010 = 0
 COL00011 = 0
 COL00012 = 0
-COL00013 = 50
+COL00013 = 0
 COL00014 = 0
 COL00015 = 0
 COL00016 = 0
 COL00017 = 0
-COL00018 = 100
+COL00018 = 0
 COL00019 = 0
 COL00020 = 0
-COL00021 = 27.27272727
+COL00021 = 0
 COL00022 = 0
 COL00023 = 0
-COL00024 = 63.63636364
+COL00024 = 0
 COL00025 = 0
 COL00026 = 0
 COL00027 = 0
 COL00028 = 0
-COL00029 = 163.6363636
+COL00029 = 0
 COL00030 = 0
 COL00031 = 0
-COL00032 = 163.6363636
+COL00032 = 0
 COL00033 = 0
-COL00034 = 45.45454545
-COL00035 = 109.0909091
+COL00034 = 0
+COL00035 = 0
 COL00036 = 0
 COL00037 = 0
 COL00038 = 0
-COL00039 = 45.45454545
-COL00040 = 272.7272727
+COL00039 = 0
+COL00040 = 0
 COL00041 = 0
 COL00042 = 0
 COL00043 = 0
 COL00044 = 0
-COL00045 = 100
+COL00045 = 0
 COL00046 = 0
 COL00047 = 0
 COL00048 = 0
 COL00049 = 0
-COL00050 = 145.4545455
-COL00051 = 272.7272727
+COL00050 = 0
+COL00051 = 0
 COL00052 = 0
 COL00053 = 0
 COL00054 = 0
 COL00055 = 0
-COL00056 = 100
+COL00056 = 0
 COL00057 = 0
 COL00058 = 0
 COL00059 = 0
 COL00060 = 0
-COL00061 = 245.4545455
-COL00062 = 272.7272727
+COL00061 = 0
+COL00062 = 0
 COL00063 = 0
 COL00064 = 0
 COL00065 = 0
 COL00066 = 0
-COL00067 = 100
+COL00067 = 0
 COL00068 = 0
 COL00069 = 0
 COL00070 = 0
 COL00071 = 0
-COL00072 = 345.4545455
-COL00073 = 272.7272727
+COL00072 = 0
+COL00073 = 0
 COL00074 = 0
 COL00075 = 0
-COL00076 = 272.7272727
+COL00076 = 0
 COL00077 = 0
-COL00078 = 9.090909091
-COL00079 = 181.8181818
+COL00078 = 0
+COL00079 = 0
 COL00080 = 0
 COL00081 = 0
 COL00082 = 0
-COL00083 = 354.5454545
-COL00084 = 454.5454545
+COL00083 = 0
+COL00084 = 0
 COL00085 = 0
-COL00086 = 354.5454545
-COL00087 = 454.5454545
+COL00086 = 0
+COL00087 = 0
 COL00088 = 0
 COL00089 = 0
 COL00090 = 0
-COL00091 = 369.6969697
+COL00091 = 0
 COL00092 = 0
 COL00093 = 0
-COL00094 = 354.5454545
-COL00095 = 454.5454545
-COL00096 = 369.6969697
+COL00094 = 0
+COL00095 = 0
+COL00096 = 0
 COL00097 = 0
-COL00098 = 100
+COL00098 = 0
 COL00099 = 0
-COL00100 = 20
-COL00101 = 20
-COL00102 = 93.33333333
+COL00100 = 0
+COL00101 = 0
+COL00102 = 0
 COL00103 = 0
-*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -r -s -m -oobtained sc50a.mps
 Optimum value: -64.57507706
 Optimum location:
 COL00001 = 0
@@ -1748,58 +1859,58 @@ COL00045 = 20.25950793
 COL00046 = 20.25950793
 COL00047 = 94.54437032
 COL00048 = 94.54437032
-*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -r -s -M -oobtained sc50a.mps
 Optimum value: 0
 Optimum location:
-COL00001 = 20
-COL00002 = 55
+COL00001 = 0
+COL00002 = 0
 COL00003 = 0
 COL00004 = 0
 COL00005 = 0
-COL00006 = 20
-COL00007 = 55
+COL00006 = 0
+COL00007 = 0
 COL00008 = 0
 COL00009 = 0
 COL00010 = 0
 COL00011 = 0
-COL00012 = 70
-COL00013 = 30
+COL00012 = 0
+COL00013 = 0
 COL00014 = 0
 COL00015 = 0
 COL00016 = 0
-COL00017 = 90
-COL00018 = 85
+COL00017 = 0
+COL00018 = 0
 COL00019 = 0
 COL00020 = 0
-COL00021 = 85
+COL00021 = 0
 COL00022 = 0
-COL00023 = 41.66666667
-COL00024 = 86.66666667
+COL00023 = 0
+COL00024 = 0
 COL00025 = 0
 COL00026 = 0
 COL00027 = 0
-COL00028 = 131.6666667
-COL00029 = 171.6666667
+COL00028 = 0
+COL00029 = 0
 COL00030 = 0
-COL00031 = 131.6666667
-COL00032 = 171.6666667
+COL00031 = 0
+COL00032 = 0
 COL00033 = 0
 COL00034 = 0
 COL00035 = 0
-COL00036 = 201.1111111
+COL00036 = 0
 COL00037 = 0
 COL00038 = 0
-COL00039 = 131.6666667
-COL00040 = 171.6666667
-COL00041 = 201.1111111
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
 COL00042 = 0
-COL00043 = 40
+COL00043 = 0
 COL00044 = 0
-COL00045 = 17
-COL00046 = 17
-COL00047 = 79.33333333
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
 COL00048 = 0
-*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -r -s -m -oobtained sc50b.mps
 Optimum value: -70
 Optimum location:
 COL00001 = 30
@@ -1850,7 +1961,7 @@ COL00045 = 43.923
 COL00046 = 40.9948
 COL00047 = 61.4922
 COL00048 = 102.487
-*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -r -s -M -oobtained sc50b.mps
 Optimum value: 0
 Optimum location:
 COL00001 = 0
@@ -1865,35 +1976,35 @@ COL00009 = 0
 COL00010 = 0
 COL00011 = 0
 COL00012 = 0
-COL00013 = 100
+COL00013 = 0
 COL00014 = 0
 COL00015 = 0
 COL00016 = 0
 COL00017 = 0
-COL00018 = 100
+COL00018 = 0
 COL00019 = 0
 COL00020 = 0
 COL00021 = 0
 COL00022 = 0
 COL00023 = 0
-COL00024 = 100
+COL00024 = 0
 COL00025 = 0
 COL00026 = 0
 COL00027 = 0
 COL00028 = 0
-COL00029 = 200
+COL00029 = 0
 COL00030 = 0
 COL00031 = 0
 COL00032 = 0
 COL00033 = 0
 COL00034 = 0
 COL00035 = 0
-COL00036 = 100
+COL00036 = 0
 COL00037 = 0
 COL00038 = 0
 COL00039 = 0
-COL00040 = 200
-COL00041 = 100
+COL00040 = 0
+COL00041 = 0
 COL00042 = 0
 COL00043 = 0
 COL00044 = 0
@@ -1901,10 +2012,1507 @@ COL00045 = 0
 COL00046 = 0
 COL00047 = 0
 COL00048 = 0
-*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -m -oobtained unboundedmin.mps
 Unbounded problem.
-*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+*** ppl_lpsol -r -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
 Optimum value: 0
 Optimum location:
 x1 = 0
 x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -r -s -m -oobtained mas74.mps
+Optimum value: 10482.79528
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 1
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0.5347489362
+x15 = 1
+x16 = 0
+x17 = 0.2426314989
+x18 = 0
+x19 = 0.6876932386
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0.2651304012
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0.5013849046
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 1
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0.0325333004
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 0
+x66 = 0
+x67 = 1
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 1
+x89 = 1
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0.892553448
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0.01146190333
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0.6811784275
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6580158108
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0.973369113
+x150 = 0.5192990175
+x151 = 10482.79508
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas74.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1
+x8 = 1
+x9 = 0
+x10 = 0
+x11 = 1
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 1
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 1
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 1
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 1
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 1
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 1
+x92 = 0
+x93 = 1
+x94 = 0
+x95 = 0
+x96 = 1
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 1
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 1
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 1
+x131 = 0
+x132 = 1
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 1
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 1
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ppl_lpsol -n -s -oobtained mas74.mps
+Feasible problem.
+*** ppl_lpsol -r -s -m -oobtained mas76.mps
+Optimum value: 38893.90364
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 1
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 1
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0.6025695449
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0.603337348
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 1
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0.0954968974
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0.9782647951
+x85 = 0
+x86 = 0.1119635585
+x87 = 0
+x88 = 1
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0.3920130232
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 0.1417811418
+x123 = 0
+x124 = 0.5090665575
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6649413368
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0.8642716954
+x149 = 0
+x150 = 0.03629410147
+x151 = 38893.90349
+*** ppl_lpsol -r -s -M -c0.000123 -oobtained mas76.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1
+x8 = 1
+x9 = 0
+x10 = 0
+x11 = 1
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 1
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 1
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 1
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 1
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 1
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 1
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 1
+x131 = 0
+x132 = 1
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 1
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ppl_lpsol -n -s -oobtained mas76.mps
+Feasible problem.
+*** ppl_lpsol -r -s -m -c0.0000002 -oobtained modglob.mps
+Optimum value: 20430947.62
+Optimum location:
+x1 = 0
+x2 = 23929.0382
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1.833067347
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 86.19157484
+x16 = 0
+x17 = 0
+x18 = 636.0743694
+x19 = 0
+x20 = 0
+x21 = 605.2785997
+x22 = 2113.676289
+x23 = 0
+x24 = 0
+x25 = 1009.494466
+x26 = 5449.255398
+x27 = 0
+x28 = 0
+x29 = 7316.944573
+x30 = 0
+x31 = 7529.08308
+x32 = 3525.611303
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 2780.728439
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 889.0673526
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 205.0591339
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 6351.319455
+x50 = 1183.360764
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 2530.715783
+x55 = 1726.033672
+x56 = 0
+x57 = 0
+x58 = 1176.727362
+x59 = 887.685932
+x60 = 0
+x61 = 0
+x62 = 838.4627168
+x63 = 0
+x64 = 126.3594424
+x65 = 0
+x66 = 204.7049903
+x67 = 0
+x68 = 142.8570486
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 41.54952653
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 569.7173314
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 212.2691988
+x81 = 0
+x82 = 481.1190763
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 11372.68699
+x101 = 8880.920376
+x102 = 621.3300236
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0.000105591437
+x204 = 0
+x205 = 0.004964952468
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.05815060286
+x210 = 0
+x211 = 0.03486627878
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0.03664022865
+x216 = 0
+x217 = 0.1217555466
+x218 = 0
+x219 = 0.3138972004
+x220 = 0
+x221 = 0.4214829823
+x222 = 0
+x223 = 0.4337029424
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0.2030882087
+x232 = 0
+x233 = 0.1601802096
+x234 = 0
+x235 = 0.05121355718
+x236 = 0
+x237 = 0.6551086973
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0.01181216209
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0.03579089998
+x250 = 0
+x251 = 0.5115737544
+x252 = 0
+x253 = 0.0681659426
+x254 = 0
+x255 = 0.3658594156
+x256 = 0
+x257 = 0.09942590275
+x258 = 0
+x259 = 0.1457785589
+x260 = 0
+x261 = 0.05113398226
+x262 = 0
+x263 = 0.0677838342
+x264 = 0
+x265 = 0.04829854359
+x266 = 0
+x267 = 0.02771423251
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0.01222748841
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0.03281781863
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0.002393405906
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0.00822909266
+x284 = 0
+x285 = 0.01179176211
+x286 = 0
+x287 = 0.007278769726
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 1.5
+x300 = 69
+x301 = 520.5
+x302 = 495.299805
+x303 = 754.099854
+x304 = 1198.5
+x305 = 2188.799805
+x306 = 594.4
+x307 = 51.4
+x308 = 75.6
+x309 = 563.099854
+x310 = 1533.099854
+x311 = 556.299805
+x312 = 167.8
+x313 = 975.799805
+x314 = 1642.9
+x315 = 347.099854
+x316 = 262.799805
+x317 = 62
+x318 = 395.9
+x319 = 691.7
+x320 = 936.7
+x321 = 791.099854
+x322 = 106.7
+x323 = 393.7
+x324 = 173.7
+x325 = 466.2
+x326 = 34
+x327 = 116.9
+x328 = 103.4
+x329 = 552.099854
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ppl_lpsol -r -s -M -c0.000003 -oobtained modglob.mps
+Optimum value: 742543789.3
+Optimum location:
+x1 = 0
+x2 = 57866.66667
+x3 = 0
+x4 = 52080
+x5 = 16665.6
+x6 = 17360
+x7 = 17360
+x8 = 15985.088
+x9 = 17360
+x10 = 16665.6
+x11 = 17360
+x12 = 17360
+x13 = 15971.2
+x14 = 17360
+x15 = 17360
+x16 = 17360
+x17 = 13609.96224
+x18 = 17360
+x19 = 15637.888
+x20 = 17360
+x21 = 17360
+x22 = 17360
+x23 = 14283.53024
+x24 = 17360
+x25 = 17360
+x26 = 17360
+x27 = 9281.22263
+x28 = 17360
+x29 = 17360
+x30 = 8748.398178
+x31 = 17360
+x32 = 17360
+x33 = 3236.582794
+x34 = 17360
+x35 = 12622.80876
+x36 = 17360
+x37 = 17360
+x38 = 17360
+x39 = 13943.27424
+x40 = 17360
+x41 = 17360
+x42 = 17360
+x43 = 15290.688
+x44 = 17360
+x45 = 17360
+x46 = 16665.6
+x47 = 17360
+x48 = 17360
+x49 = 17360
+x50 = 17360
+x51 = 1887.314667
+x52 = 17360
+x53 = 5398.256436
+x54 = 17360
+x55 = 17360
+x56 = 17360
+x57 = 8980.850078
+x58 = 17360
+x59 = 17360
+x60 = 17360
+x61 = 12636.55788
+x62 = 17360
+x63 = 15985.088
+x64 = 17360
+x65 = 13603.01824
+x66 = 17360
+x67 = 17360
+x68 = 17360
+x69 = 14950.432
+x70 = 17360
+x71 = 17360
+x72 = 17360
+x73 = 14950.432
+x74 = 17360
+x75 = 17360
+x76 = 17360
+x77 = 14950.432
+x78 = 17360
+x79 = 17360
+x80 = 17360
+x81 = 17360
+x82 = 17360
+x83 = 15637.888
+x84 = 16665.6
+x85 = 17360
+x86 = 16318.4
+x87 = 17360
+x88 = 17360
+x89 = 16318.4
+x90 = 17360
+x91 = 17360
+x92 = 16318.4
+x93 = 17360
+x94 = 17360
+x95 = 16318.4
+x96 = 17360
+x97 = 17360
+x98 = 16665.6
+x99 = 17360
+x100 = 17360
+x101 = 17360
+x102 = 17360
+x103 = 16665.6
+x104 = 17360
+x105 = 17360
+x106 = 15985.088
+x107 = 17360
+x108 = 16665.6
+x109 = 17360
+x110 = 17360
+x111 = 15971.2
+x112 = 17360
+x113 = 17360
+x114 = 17360
+x115 = 13609.96224
+x116 = 17360
+x117 = 15637.888
+x118 = 17360
+x119 = 17360
+x120 = 17360
+x121 = 14283.53024
+x122 = 17360
+x123 = 17360
+x124 = 17360
+x125 = 9281.22263
+x126 = 17360
+x127 = 17360
+x128 = 8748.398178
+x129 = 17360
+x130 = 17360
+x131 = 3236.582794
+x132 = 17360
+x133 = 12622.80876
+x134 = 17360
+x135 = 17360
+x136 = 17360
+x137 = 13943.27424
+x138 = 17360
+x139 = 17360
+x140 = 17360
+x141 = 15290.688
+x142 = 17360
+x143 = 17360
+x144 = 16665.6
+x145 = 17360
+x146 = 17360
+x147 = 17360
+x148 = 17360
+x149 = 1887.314667
+x150 = 17360
+x151 = 5398.256436
+x152 = 17360
+x153 = 17360
+x154 = 17360
+x155 = 8980.850078
+x156 = 17360
+x157 = 17360
+x158 = 17360
+x159 = 12636.55788
+x160 = 17360
+x161 = 15985.088
+x162 = 17360
+x163 = 13603.01824
+x164 = 17360
+x165 = 17360
+x166 = 17360
+x167 = 14950.432
+x168 = 17360
+x169 = 17360
+x170 = 17360
+x171 = 14950.432
+x172 = 17360
+x173 = 17360
+x174 = 17360
+x175 = 14950.432
+x176 = 17360
+x177 = 17360
+x178 = 17360
+x179 = 17360
+x180 = 17360
+x181 = 15637.888
+x182 = 16665.6
+x183 = 17360
+x184 = 16318.4
+x185 = 17360
+x186 = 17360
+x187 = 16318.4
+x188 = 17360
+x189 = 17360
+x190 = 16318.4
+x191 = 17360
+x192 = 17360
+x193 = 16318.4
+x194 = 17360
+x195 = 17360
+x196 = 16665.6
+x197 = 17360
+x198 = 17360
+x199 = 17360
+x200 = 17360
+x201 = 1
+x202 = 1
+x203 = 1
+x204 = 1
+x205 = 1
+x206 = 1
+x207 = 1
+x208 = 1
+x209 = 1
+x210 = 1
+x211 = 1
+x212 = 1
+x213 = 1
+x214 = 1
+x215 = 1
+x216 = 1
+x217 = 1
+x218 = 1
+x219 = 1
+x220 = 1
+x221 = 1
+x222 = 1
+x223 = 1
+x224 = 1
+x225 = 1
+x226 = 1
+x227 = 1
+x228 = 1
+x229 = 1
+x230 = 1
+x231 = 1
+x232 = 1
+x233 = 1
+x234 = 1
+x235 = 1
+x236 = 1
+x237 = 1
+x238 = 1
+x239 = 1
+x240 = 1
+x241 = 1
+x242 = 1
+x243 = 1
+x244 = 1
+x245 = 1
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 1
+x253 = 1
+x254 = 1
+x255 = 1
+x256 = 1
+x257 = 1
+x258 = 1
+x259 = 1
+x260 = 1
+x261 = 1
+x262 = 1
+x263 = 1
+x264 = 1
+x265 = 1
+x266 = 1
+x267 = 1
+x268 = 1
+x269 = 1
+x270 = 1
+x271 = 1
+x272 = 1
+x273 = 1
+x274 = 1
+x275 = 1
+x276 = 1
+x277 = 1
+x278 = 1
+x279 = 1
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 1
+x284 = 1
+x285 = 1
+x286 = 1
+x287 = 1
+x288 = 1
+x289 = 1
+x290 = 1
+x291 = 1
+x292 = 1
+x293 = 1
+x294 = 1
+x295 = 1
+x296 = 1
+x297 = 1
+x298 = 1
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 1.5
+x362 = 69
+x363 = 520.5
+x364 = 495.299805
+x365 = 754.099854
+x366 = 1198.5
+x367 = 2188.799805
+x368 = 594.4
+x369 = 51.4
+x370 = 75.6
+x371 = 563.099854
+x372 = 1533.099854
+x373 = 556.299805
+x374 = 167.8
+x375 = 975.799805
+x376 = 1642.9
+x377 = 347.099854
+x378 = 262.799805
+x379 = 62
+x380 = 395.9
+x381 = 691.7
+x382 = 936.7
+x383 = 791.099854
+x384 = 106.7
+x385 = 393.7
+x386 = 173.7
+x387 = 466.2
+x388 = 34
+x389 = 116.9
+x390 = 103.4
+x391 = 552.099854
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ppl_lpsol -n -s -oobtained modglob.mps
+Feasible problem.
diff --git a/demos/ppl_lpsol/ppl_lpsol.c b/demos/ppl_lpsol/ppl_lpsol.c
index cc55b39..5e3fae6 100644
--- a/demos/ppl_lpsol/ppl_lpsol.c
+++ b/demos/ppl_lpsol/ppl_lpsol.c
@@ -1,13 +1,12 @@
 /* Solve linear programming problems by either vertex/point enumeration
-   or the primal simplex algorithm. Just a toy to test the C interface
-   of the library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   or the primal simplex algorithm.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,10 +21,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include "config.h"
+#include <ppl-config.h>
 #include "ppl_c.h"
 #include <gmp.h>
-#include <glpk.h>
 #include <stdio.h>
 #include <assert.h>
 #include <time.h>
@@ -33,33 +31,40 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
+#include <math.h>
+
+#if defined(PPL_HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(PPL_HAVE_GLPK_H)
+#include <glpk.h>
+#endif
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 # include <getopt.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
+#ifdef PPL_HAVE_UNISTD_H
 /* Include this for `getopt()': especially important if we do not have
-   <getopt.h>.  */
+   <getopt.h>. */
 # include <unistd.h>
 #endif
 
-#ifdef HAVE_SIGNAL_H
+#ifdef PPL_HAVE_SIGNAL_H
 # include <signal.h>
 #endif
 
-#ifdef HAVE_SYS_TIME_H
+#ifdef PPL_HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_RESOURCE_H
+#ifdef PPL_HAVE_SYS_RESOURCE_H
 /* This should be included after <time.h> and <sys/time.h> so as to make
-   sure we have the definitions for, e.g., `ru_utime'.  */
+   sure we have the definitions for, e.g., `ru_utime'. */
 # include <sys/resource.h>
 #endif
 
-#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
-# error "PPL version 0.8 or following is required"
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 10
+# error "PPL version 0.10 or following is required"
 #endif
 
 static const char* ppl_source_version = PPL_VERSION;
@@ -70,46 +75,58 @@ static const char* ppl_source_version = PPL_VERSION;
 # define ATTRIBUTE_UNUSED
 #endif
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 static struct option long_options[] = {
-  {"check",          no_argument,       0, 'c'},
-  {"help",           no_argument,       0, 'h'},
-  {"version",        no_argument,       0, 'V'},
-  {"min",            no_argument,       0, 'm'},
-  {"max",            no_argument,       0, 'M'},
-  {"max-cpu",        required_argument, 0, 'C'},
-  {"max-memory",     required_argument, 0, 'R'},
-  {"output",         required_argument, 0, 'o'},
-  {"enumerate",      no_argument,       0, 'e'},
-  {"simplex",        no_argument,       0, 's'},
-  {"timings",        no_argument,       0, 't'},
-  {"verbose",        no_argument,       0, 'v'},
+  {"check",           optional_argument, 0, 'c'},
+  {"help",            no_argument,       0, 'h'},
+  {"incremental",     no_argument,       0, 'i'},
+  {"min",             no_argument,       0, 'm'},
+  {"max",             no_argument,       0, 'M'},
+  {"no-optimization", no_argument,       0, 'n'},
+  {"no-mip",          no_argument,       0, 'r'},
+  {"max-cpu",         required_argument, 0, 'C'},
+  {"max-memory",      required_argument, 0, 'R'},
+  {"output",          required_argument, 0, 'o'},
+  {"enumerate",       no_argument,       0, 'e'},
+  {"simplex",         no_argument,       0, 's'},
+  {"timings",         no_argument,       0, 't'},
+  {"verbosity",       required_argument, 0, 'v'},
+  {"version",         no_argument,       0, 'V'},
   {0, 0, 0, 0}
 };
 #endif
 
 static const char* usage_string
 = "Usage: %s [OPTION]... [FILE]...\n\n"
-"  -c, --check             checks plausibility of the optimum value found\n"
+"  -c, --check[=THRESHOLD] checks the obtained results;  optima are checked\n"
+"                          with a tolerance of THRESHOLD (default %.10g)\n"
+"  -i, --incremental       solves the problem incrementally\n"
 "  -m, --min               minimizes the objective function\n"
 "  -M, --max               maximizes the objective function (default)\n"
+"  -n, --no-optimization   checks for satisfiability only\n"
+"  -r, --no-mip            consider integer variables as real variables\n"
 "  -CSECS, --max-cpu=SECS  limits CPU usage to SECS seconds\n"
 "  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"
 "  -h, --help              prints this help text to stdout\n"
-"  -V, --version           prints version information to stdout\n"
 "  -oPATH, --output=PATH   appends output to PATH\n"
 "  -e, --enumerate         use the (expensive!) enumeration method\n"
 "  -s, --simplex           use the simplex method\n"
 "  -t, --timings           prints timings to stderr\n"
-"  -v, --verbose           outputs also the constraints "
-"and objective function\n"
-#ifndef HAVE_GETOPT_H
+"  -v, --verbosity=LEVEL   sets verbosity level (from 0 to 4, default 3):\n"
+"                          0 --> quiet: no output except for errors and\n"
+"                                explicitly required notifications\n"
+"                          1 --> solver state only\n"
+"                          2 --> state + optimal value\n"
+"                          3 --> state + optimal value + optimum location\n"
+"                          4 --> lots of output\n"
+"  -V, --version           prints version information to stdout\n"
+#ifndef PPL_HAVE_GETOPT_H
 "\n"
 "NOTE: this version does not support long options.\n"
 #endif
 ;
 
-#define OPTION_LETTERS "bcemMC:R:hVo:stv"
+#define OPTION_LETTERS "bc::eimnMC:R:ho:rstVv:"
 
 static const char* program_name = 0;
 
@@ -117,11 +134,17 @@ static unsigned long max_seconds_of_cpu_time = 0;
 static unsigned long max_bytes_of_virtual_memory = 0;
 static const char* output_argument = 0;
 FILE* output_file = NULL;
-static int check_optimum = 0;
+static int check_results = 0;
 static int use_simplex = 0;
 static int print_timings = 0;
-static int verbose = 0;
+static int verbosity = 3;
 static int maximize = 1;
+static int incremental = 0;
+static int no_optimization = 0;
+static int no_mip = 0;
+static int check_results_failed = 0;
+static double check_threshold = 0.0;
+static const double default_check_threshold = 0.000000001;
 
 static void
 my_exit(int status) {
@@ -132,14 +155,42 @@ my_exit(int status) {
 static void
 fatal(const char* format, ...) {
   va_list ap;
-  va_start(ap, format);
   fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
   vfprintf(stderr, format, ap);
-  fprintf(stderr, "\n");
   va_end(ap);
+  fprintf(stderr, "\n");
   my_exit(1);
 }
 
+#if 0
+static void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: warning: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+#endif
+
+static void
+error(const char* format, ...) {
+  va_list ap;
+  fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+  if (output_argument) {
+    va_start(ap, format);
+    vfprintf(output_file, format, ap);
+    va_end(ap);
+    fprintf(output_file, "\n");
+  }
+}
+
 static const char*
 get_ppl_version() {
   const char* p;
@@ -156,17 +207,21 @@ get_ppl_banner() {
 
 static void
 process_options(int argc, char* argv[]) {
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
   int option_index;
 #endif
   int enumerate_required = 0;
   int simplex_required = 0;
+  int incremental_required = 0;
+  int no_optimization_required = 0;
+  int no_mip_required = 0;
   int c;
   char* endptr;
   long l;
+  double d;
 
   while (1) {
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
     option_index = 0;
     c = getopt_long(argc, argv, OPTION_LETTERS, long_options, &option_index);
 #else
@@ -180,7 +235,16 @@ process_options(int argc, char* argv[]) {
       break;
 
     case 'c':
-      check_optimum = 1;
+      check_results = 1;
+      if (optarg) {
+	d = strtod(optarg, &endptr);
+	if (*endptr || errno == ERANGE || d < 0.0)
+	  fatal("only a non-negative floating point number can `-c'");
+	else
+	  check_threshold = d;
+      }
+      else
+	check_threshold = default_check_threshold;
       break;
 
     case 'm':
@@ -193,15 +257,10 @@ process_options(int argc, char* argv[]) {
 
     case '?':
     case 'h':
-      fprintf(stdout, usage_string, argv[0]);
+      fprintf(stdout, usage_string, argv[0], default_check_threshold);
       my_exit(0);
       break;
 
-    case 'V':
-      fprintf(stdout, "%s\n", PPL_VERSION);
-      exit(0);
-      break;
-
     case 'C':
       l = strtol(optarg, &endptr, 10);
       if (*endptr || l < 0)
@@ -235,7 +294,28 @@ process_options(int argc, char* argv[]) {
       break;
 
     case 'v':
-      verbose = 1;
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0 || l > 4)
+	fatal("verbosity must be an integer between 0 and 4");
+      else
+	verbosity = l;
+      break;
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      my_exit(0);
+      break;
+
+    case 'i':
+      incremental_required = 1;
+      break;
+
+    case 'n':
+      no_optimization_required = 1;
+      break;
+
+    case 'r':
+      no_mip_required = 1;
       break;
 
     default:
@@ -243,16 +323,27 @@ process_options(int argc, char* argv[]) {
     }
   }
 
-  if (enumerate_required && simplex_required)
-    fatal("--enumerate and --simplex are incompatible options");
+  if (enumerate_required
+      && (simplex_required
+	  || incremental_required))
+      fatal("-e option is incompatible with -i and -s");
 
   if (enumerate_required)
     use_simplex = 0;
   else if (simplex_required)
     use_simplex = 1;
 
+  if (incremental_required)
+    incremental = 1;
+
+  if (no_optimization_required)
+    no_optimization = 1;
+
+  if (no_mip_required)
+    no_mip = 1;
+
   if (optind >= argc) {
-    if (verbose)
+    if (verbosity >= 4)
       fprintf(stderr,
 	      "Parma Polyhedra Library version:\n%s\n\n"
 	      "Parma Polyhedra Library banner:\n%s",
@@ -343,7 +434,7 @@ set_alarm_on_cpu_time(unsigned seconds, void (*handler)(int)) {
   }
 }
 
-#if HAVE_DECL_RLIMIT_AS
+#if PPL_HAVE_DECL_RLIMIT_AS
 void
 limit_virtual_memory(unsigned bytes) {
   struct rlimit t;
@@ -361,7 +452,7 @@ limit_virtual_memory(unsigned bytes) {
 void
 limit_virtual_memory(unsigned bytes ATTRIBUTE_UNUSED) {
 }
-#endif /* !HAVE_DECL_RLIMIT_AS */
+#endif /* !PPL_HAVE_DECL_RLIMIT_AS */
 
 static void
 my_timeout(int dummy ATTRIBUTE_UNUSED) {
@@ -375,11 +466,109 @@ static mpz_t tmp_z;
 static mpq_t tmp1_q;
 static mpq_t tmp2_q;
 static ppl_Coefficient_t ppl_coeff;
-static LPX* lp;
+static LPX* glpk_lp;
+static int glpk_lp_problem_kind;
+static int glpk_lp_num_int;
+static ppl_dimension_type* integer_variables;
+
+static void
+maybe_check_results(const int ppl_status, const double ppl_optimum_value) {
+  const char* ppl_status_string;
+  const char* glpk_status_string;
+  int glpk_status;
+  int treat_as_lp = 0;
+  if (!check_results)
+    return;
+
+  /* Disable GLPK output. */
+  lpx_set_int_parm(glpk_lp, LPX_K_MSGLEV, 0);
+
+  if (no_mip || glpk_lp_problem_kind == LPX_LP)
+    treat_as_lp = 1;
+
+  lpx_set_obj_dir(glpk_lp, (maximize ? LPX_MAX : LPX_MIN));
+
+  if (treat_as_lp) {
+    /* Set the problem class to LP: MIP problems are thus treated as
+       LP ones. */
+    lpx_set_class(glpk_lp, LPX_LP);
+    lpx_simplex(glpk_lp);
+    glpk_status = lpx_get_status(glpk_lp);
+  }
+  else {
+    /* MIP case. */
+    lpx_intopt(glpk_lp);
+    glpk_status = lpx_mip_status(glpk_lp);
+  }
+  /* If no_optimization is enabled, the second case is not possibile. */
+  if (!((ppl_status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE
+	 && (glpk_status == LPX_NOFEAS || glpk_status == LPX_I_NOFEAS))
+	|| (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED
+	    && (glpk_status == LPX_UNBND || glpk_status == LPX_I_UNDEF))
+	|| (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED
+	    && ((glpk_status == LPX_OPT || glpk_status == LPX_I_OPT)
+		/* If no_optimization is enabled, check if the problem is
+		   unbounded for GLPK.  */
+		|| (no_optimization && (glpk_status == LPX_UNBND
+					|| glpk_status == LPX_I_UNDEF))))))  {
+
+    if (ppl_status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE)
+      ppl_status_string = "unfeasible";
+    else if (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED)
+      ppl_status_string = "unbounded";
+    else if (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED)
+      ppl_status_string = "optimizable";
+    else
+      ppl_status_string = "<?>";
+
+    switch (glpk_status) {
+    case LPX_NOFEAS:
+      glpk_status_string = "unfeasible";
+      break;
+    case LPX_UNBND:
+      glpk_status_string = "unbounded";
+      break;
+    case LPX_OPT:
+      glpk_status_string = "optimizable";
+      break;
+    case LPX_I_NOFEAS:
+      glpk_status_string = "unfeasible";
+      break;
+    case LPX_I_OPT:
+      glpk_status_string = "optimizable";
+      break;
+    case LPX_I_UNDEF:
+      glpk_status_string = "undefined";
+      break;
+    default:
+      glpk_status_string = "<?>";
+      break;
+    }
+
+    error("check failed: for GLPK the problem is %s, not %s",
+	  glpk_status_string, ppl_status_string);
+
+    check_results_failed = 1;
+  }
+  else if (!no_optimization
+	   && ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED) {
+
+    double glpk_optimum_value = treat_as_lp ? lpx_get_obj_val(glpk_lp)
+      : lpx_mip_obj_val(glpk_lp);
+
+    if (fabs(ppl_optimum_value - glpk_optimum_value) > check_threshold) {
+      error("check failed: for GLPK the problem's optimum is %.10g,"
+	    " not %.10g", glpk_optimum_value, ppl_optimum_value);
+      check_results_failed = 1;
+    }
+  }
+  return;
+}
+
 
 static const char*
 variable_output_function(ppl_dimension_type var) {
-  const char* name = lpx_get_col_name(lp, var+1);
+  const char* name = lpx_get_col_name(glpk_lp, var+1);
   if (name != NULL)
     return name;
   else
@@ -402,9 +591,8 @@ add_constraints(ppl_Linear_Expression_t ppl_le,
     mpz_neg(tmp_z, tmp_z);
     ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
     ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
-    ppl_new_Constraint(&ppl_c, ppl_le,
-		       PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL);
-    if (verbose) {
+    ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+    if (verbosity >= 4) {
       ppl_io_fprint_Constraint(output_file, ppl_c);
       fprintf(output_file, "\n");
     }
@@ -419,8 +607,8 @@ add_constraints(ppl_Linear_Expression_t ppl_le,
     ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
     ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
     ppl_new_Constraint(&ppl_c, ppl_le,
-		       PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL);
-    if (verbose) {
+		       PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
+    if (verbosity >= 4) {
       ppl_io_fprint_Constraint(output_file, ppl_c);
       fprintf(output_file, "\n");
     }
@@ -436,9 +624,8 @@ add_constraints(ppl_Linear_Expression_t ppl_le,
     mpz_neg(tmp_z, tmp_z);
     ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
     ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
-    ppl_new_Constraint(&ppl_c, ppl_le,
-		       PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL);
-    if (verbose) {
+    ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+    if (verbosity >= 4) {
       ppl_io_fprint_Constraint(output_file, ppl_c);
       fprintf(output_file, "\n");
     }
@@ -450,10 +637,9 @@ add_constraints(ppl_Linear_Expression_t ppl_le,
     mpz_neg(tmp_z, tmp_z);
     ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
     ppl_Linear_Expression_add_to_inhomogeneous(ppl_le2, ppl_coeff);
-    ppl_new_Constraint(&ppl_c, ppl_le2,
-		       PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL);
+    ppl_new_Constraint(&ppl_c, ppl_le2, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
     ppl_delete_Linear_Expression(ppl_le2);
-    if (verbose) {
+    if (verbosity >= 4) {
       ppl_io_fprint_Constraint(output_file, ppl_c);
       fprintf(output_file, "\n");
     }
@@ -469,7 +655,7 @@ add_constraints(ppl_Linear_Expression_t ppl_le,
     ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
     ppl_new_Constraint(&ppl_c, ppl_le,
 		       PPL_CONSTRAINT_TYPE_EQUAL);
-    if (verbose) {
+    if (verbosity >= 4) {
       ppl_io_fprint_Constraint(output_file, ppl_c);
       fprintf(output_file, "\n");
     }
@@ -484,7 +670,7 @@ add_constraints(ppl_Linear_Expression_t ppl_le,
 }
 
 static int
-solve_with_generators(ppl_const_Constraint_System_t ppl_cs,
+solve_with_generators(ppl_Constraint_System_t ppl_cs,
 		      ppl_const_Linear_Expression_t ppl_objective_le,
 		      ppl_Coefficient_t optimum_n,
 		      ppl_Coefficient_t optimum_d,
@@ -495,8 +681,8 @@ solve_with_generators(ppl_const_Constraint_System_t ppl_cs,
   int included;
   int ok;
 
-  /* Create the polyhedron. */
-  ppl_new_C_Polyhedron_from_Constraint_System(&ppl_ph, ppl_cs);
+  /* Create the polyhedron (recycling the data structures of ppl_cs). */
+  ppl_new_C_Polyhedron_recycle_Constraint_System(&ppl_ph, ppl_cs);
 
   if (print_timings) {
     fprintf(stderr, "Time to create a PPL polyhedron: ");
@@ -515,8 +701,18 @@ solve_with_generators(ppl_const_Constraint_System_t ppl_cs,
   }
 
   if (empty) {
-    fprintf(output_file, "Unfeasible problem.\n");
-    /* FIXME: check!!! */
+    if (verbosity >= 1)
+      fprintf(output_file, "Unfeasible problem.\n");
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_UNFEASIBLE, 0.0);
+    return 0;
+  }
+
+  if (!empty && no_optimization) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Feasible problem.\n");
+    /* Kludge: let's pass PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+       to let work `maybe_check_results'. */
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, 0.0);
     return 0;
   }
 
@@ -533,8 +729,9 @@ solve_with_generators(ppl_const_Constraint_System_t ppl_cs,
   }
 
   if (unbounded) {
-    fprintf(output_file, "Unbounded problem.\n");
-    /* FIXME: check!!! */
+    if (verbosity >= 1)
+      fprintf(output_file, "Unbounded problem.\n");
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_UNBOUNDED, 0.0);
     return 0;
   }
 
@@ -570,60 +767,112 @@ solve_with_simplex(ppl_const_Constraint_System_t cs,
 		   ppl_Coefficient_t optimum_n,
 		   ppl_Coefficient_t optimum_d,
 		   ppl_Generator_t point) {
-  int status;
-
-  ppl_LP_Problem_t lp;
+  ppl_MIP_Problem_t ppl_mip;
+  int status = 0;
+  int satisfiable = 0;
+  ppl_dimension_type space_dim;
+  ppl_const_Constraint_t c;
+  ppl_const_Generator_t g;
+  ppl_Constraint_System_const_iterator_t i;
+  ppl_Constraint_System_const_iterator_t iend;
+  int counter;
   int mode = maximize
-    ? PPL_LP_PROBLEM_MAXIMIZATION : PPL_LP_PROBLEM_MINIMIZATION;
-  ppl_new_LP_Problem(&lp, cs, objective, mode);
-  status = ppl_LP_Problem_solve(lp);
+    ? PPL_OPTIMIZATION_MODE_MAXIMIZATION
+    : PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+  ppl_Constraint_System_space_dimension(cs, &space_dim);
+  ppl_new_MIP_Problem_from_space_dimension(&ppl_mip, space_dim);
+  ppl_MIP_Problem_set_objective_function(ppl_mip, objective);
+  ppl_MIP_Problem_set_optimization_mode(ppl_mip, mode);
+  if (!no_mip)
+    ppl_MIP_Problem_add_to_integer_space_dimensions(ppl_mip, integer_variables,
+						    glpk_lp_num_int);
+  if (incremental) {
+    /* Add the constraints of `cs' one at a time. */
+    ppl_new_Constraint_System_const_iterator(&i);
+    ppl_new_Constraint_System_const_iterator(&iend);
+    ppl_Constraint_System_begin(cs, i);
+    ppl_Constraint_System_end(cs, iend);
+
+    counter = 0;
+    while (!ppl_Constraint_System_const_iterator_equal_test(i, iend)) {
+      ++counter;
+      if (verbosity >= 4)
+	fprintf(output_file, "\nSolving constraint %d\n", counter);
+      ppl_Constraint_System_const_iterator_dereference(i, &c);
+      ppl_MIP_Problem_add_constraint(ppl_mip, c);
+
+      if (no_optimization) {
+	satisfiable = ppl_MIP_Problem_is_satisfiable(ppl_mip);
+	if (!satisfiable)
+	  break;
+      }
+      else
+	status = ppl_MIP_Problem_solve(ppl_mip);
+      ppl_Constraint_System_const_iterator_increment(i);
+    }
+    ppl_delete_Constraint_System_const_iterator(i);
+    ppl_delete_Constraint_System_const_iterator(iend);
+  }
+
+  else {
+    ppl_MIP_Problem_add_constraints(ppl_mip, cs);
+    if (no_optimization)
+      satisfiable = ppl_MIP_Problem_is_satisfiable(ppl_mip);
+    else
+      status = ppl_MIP_Problem_solve(ppl_mip);
+  }
 
   if (print_timings) {
-    fprintf(stderr, "Time to solve the LP problem: ");
+    fprintf(stderr, "Time to solve the problem: ");
     print_clock(stderr);
     fprintf(stderr, " s\n");
     start_clock();
   }
 
-  if (status == PPL_LP_PROBLEM_STATUS_UNFEASIBLE) {
-    fprintf(output_file, "Unfeasible problem.\n");
-    /* FIXME: check!!! */
+  if ((no_optimization && !satisfiable)
+      || (!no_optimization && status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE)) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Unfeasible problem.\n");
+    maybe_check_results(status, 0.0);
+    return 0;
+  }
+  else if (no_optimization && satisfiable) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Feasible problem.\n");
+    /* Kludge: let's pass PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+       to let work `maybe_check_results'. */
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, 0.0);
     return 0;
   }
-  else if (status == PPL_LP_PROBLEM_STATUS_UNBOUNDED) {
-    fprintf(output_file, "Unbounded problem.\n");
-    /* FIXME: check!!! */
+  else if (status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Unbounded problem.\n");
+    maybe_check_results(status, 0.0);
     return 0;
   }
-  else if (status == PPL_LP_PROBLEM_STATUS_OPTIMIZED) {
-    ppl_LP_Problem_optimal_value(lp, optimum_n, optimum_d);
-    ppl_const_Generator_t g;
-    ppl_LP_Problem_optimizing_point(lp, &g);
+  else if (status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED) {
+    ppl_MIP_Problem_optimal_value(ppl_mip, optimum_n, optimum_d);
+    ppl_MIP_Problem_optimizing_point(ppl_mip, &g);
     ppl_assign_Generator_from_Generator(point, g);
     return 1;
   }
   else
     fatal("internal error");
-}
 
-static void
-check_feasibility(ppl_const_Constraint_System_t cs,
-		  ppl_const_Generator_t g) {
-  ppl_Polyhedron_t ph;
-  unsigned int relation;
-  ppl_new_C_Polyhedron_from_Constraint_System(&ph, cs);
-  relation = ppl_Polyhedron_relation_with_Generator(ph, g);
-  ppl_delete_Polyhedron(ph);
-  if (relation != PPL_POLY_GEN_RELATION_SUBSUMES)
-    fprintf(stderr, "The computed optimum is NOT a feasible point!\n");
+  /* This is just to avoid a compiler warning. */
+  return 0;
 }
 
 static void
 solve(char* file_name) {
   ppl_Constraint_System_t ppl_cs;
-  ppl_Generator_t optimum_value;
+#ifndef NDEBUG
+  ppl_Constraint_System_t ppl_cs_copy;
+#endif
+  ppl_Generator_t optimum_location;
   ppl_Linear_Expression_t ppl_le;
-  int dimension, row, num_rows, column, nz, i, type;
+  int dimension, row, num_rows, column, nz, i, j, type;
   int* coefficient_index;
   double lb, ub;
   double* coefficient_value;
@@ -640,8 +889,13 @@ solve(char* file_name) {
   if (print_timings)
     start_clock();
 
-  lp = lpx_read_mps(file_name);
-  if (lp == NULL)
+  if (verbosity == 0) {
+    // FIXME: find a way to suppress output from lpx_read_mps.
+  }
+
+  glpk_lp = lpx_read_mps(file_name);
+
+  if (glpk_lp == NULL)
     fatal("cannot read MPS file `%s'", file_name);
 
   if (print_timings) {
@@ -651,8 +905,29 @@ solve(char* file_name) {
     start_clock();
   }
 
-  dimension = lpx_get_num_cols(lp);
-
+  glpk_lp_problem_kind = lpx_get_class(glpk_lp);
+  if (glpk_lp_problem_kind == LPX_MIP && !no_mip && !use_simplex)
+     fatal("the enumeration solving method can not handle MIP problems");
+
+  dimension = lpx_get_num_cols(glpk_lp);
+
+  /* Read variables constrained to be integer. */
+    if (glpk_lp_problem_kind == LPX_MIP && !no_mip && use_simplex) {
+      if (verbosity >= 4)
+	fprintf(output_file, "Integer variables:\n");
+      glpk_lp_num_int = lpx_get_num_int(glpk_lp);
+      integer_variables = (ppl_dimension_type*)
+	malloc((glpk_lp_num_int + 1)*sizeof(ppl_dimension_type));
+      for (i = 0, j = 0; i < dimension; ++i)
+	if (lpx_get_col_kind(glpk_lp, i+1) == LPX_IV) {
+	  integer_variables[j] = i;
+	  if (verbosity >= 4) {
+	    ppl_io_fprint_variable(output_file, i);
+	    fprintf(output_file, " ");
+	  }
+	  ++j;
+	}
+    }
   coefficient_index = (int*) malloc((dimension+1)*sizeof(int));
   coefficient_value = (double*) malloc((dimension+1)*sizeof(double));
   rational_coefficient = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
@@ -667,22 +942,22 @@ solve(char* file_name) {
 
   mpz_init(den_lcm);
 
-  if (verbose)
-    fprintf(output_file, "Constraints:\n");
+  if (verbosity >= 4)
+    fprintf(output_file, "\nConstraints:\n");
 
   /* Set up the row (ordinary) constraints. */
-  num_rows = lpx_get_num_rows(lp);
+  num_rows = lpx_get_num_rows(glpk_lp);
   for (row = 1; row <= num_rows; ++row) {
     /* Initialize the least common multiple computation. */
     mpz_set_si(den_lcm, 1);
     /* Set `nz' to the number of non-zero coefficients. */
-    nz = lpx_get_mat_row(lp, row, coefficient_index, coefficient_value);
+    nz = lpx_get_mat_row(glpk_lp, row, coefficient_index, coefficient_value);
     for (i = 1; i <= nz; ++i) {
       mpq_set_d(rational_coefficient[i], coefficient_value[i]);
       /* Update den_lcm. */
       mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i]));
     }
-    lpx_get_row_bnds(lp, row, &type, &lb, &ub);
+    lpx_get_row_bnds(glpk_lp, row, &type, &lb, &ub);
     mpq_set_d(rational_lb, lb);
     mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
     mpq_set_d(rational_ub, ub);
@@ -709,6 +984,10 @@ solve(char* file_name) {
   free(rational_coefficient);
   free(coefficient_index);
 
+#ifndef NDEBUG
+  ppl_new_Constraint_System_from_Constraint_System(&ppl_cs_copy, ppl_cs);
+#endif
+
   /*
     FIXME: here we could build the polyhedron and minimize it before
     adding the variable bounds.
@@ -716,8 +995,7 @@ solve(char* file_name) {
 
   /* Set up the columns constraints, i.e., variable bounds. */
   for (column = 1; column <= dimension; ++column) {
-
-    lpx_get_col_bnds(lp, column, &type, &lb, &ub);
+    lpx_get_col_bnds(glpk_lp, column, &type, &lb, &ub);
 
     mpq_set_d(rational_lb, lb);
     mpq_set_d(rational_ub, ub);
@@ -746,10 +1024,10 @@ solve(char* file_name) {
   mpz_set_si(den_lcm, 1);
 
   mpq_init(objective[0]);
-  mpq_set_d(objective[0], lpx_get_obj_coef(lp, 0));
+  mpq_set_d(objective[0], lpx_get_obj_coef(glpk_lp, 0));
   for (i = 1; i <= dimension; ++i) {
     mpq_init(objective[i]);
-    mpq_set_d(objective[i], lpx_get_obj_coef(lp, i));
+    mpq_set_d(objective[i], lpx_get_obj_coef(glpk_lp, i));
     /* Update den_lcm. */
     mpz_lcm(den_lcm, den_lcm, mpq_denref(objective[i]));
   }
@@ -764,7 +1042,7 @@ solve(char* file_name) {
     ppl_Linear_Expression_add_to_coefficient(ppl_objective_le, i-1, ppl_coeff);
   }
 
-  if (verbose) {
+  if (verbosity >= 4) {
     fprintf(output_file, "Objective function:\n");
     ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le);
   }
@@ -773,7 +1051,7 @@ solve(char* file_name) {
     mpq_clear(objective[i]);
   free(objective);
 
-  if (verbose) {
+  if (verbosity >= 4) {
     if (mpz_cmp_si(den_lcm, 1) != 0) {
       fprintf(output_file, ")/");
       mpz_out_str(output_file, 10, den_lcm);
@@ -784,19 +1062,24 @@ solve(char* file_name) {
 
   ppl_new_Coefficient(&optimum_n);
   ppl_new_Coefficient(&optimum_d);
-  ppl_new_Generator_zero_dim_point(&optimum_value);
+  ppl_new_Generator_zero_dim_point(&optimum_location);
 
   optimum_found = use_simplex
     ? solve_with_simplex(ppl_cs,
 			 ppl_objective_le,
 			 optimum_n,
 			 optimum_d,
-			 optimum_value)
+			 optimum_location)
     : solve_with_generators(ppl_cs,
 			    ppl_objective_le,
 			    optimum_n,
 			    optimum_d,
-			    optimum_value);
+			    optimum_location);
+
+  ppl_delete_Linear_Expression(ppl_objective_le);
+
+  if (glpk_lp_problem_kind == LPX_MIP)
+      free(integer_variables);
 
   if (optimum_found) {
     mpq_init(optimum);
@@ -805,52 +1088,82 @@ solve(char* file_name) {
     ppl_Coefficient_to_mpz_t(optimum_d, tmp_z);
     mpz_mul(tmp_z, tmp_z, den_lcm);
     mpq_set_den(optimum, tmp_z);
-    fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum));
-    mpq_clear(optimum);
-    fprintf(output_file, "Optimum location:\n");
-    ppl_Generator_divisor(optimum_value, ppl_coeff);
-    ppl_Coefficient_to_mpz_t(ppl_coeff, tmp_z);
-    for (i = 0; i < dimension; ++i) {
-      mpz_set(mpq_denref(tmp1_q), tmp_z);
-      ppl_Generator_coefficient(optimum_value, i, ppl_coeff);
-      ppl_Coefficient_to_mpz_t(ppl_coeff, mpq_numref(tmp1_q));
-      ppl_io_fprint_variable(output_file, i);
-      fprintf(output_file, " = %.10g\n", mpq_get_d(tmp1_q));
+    if (verbosity == 1)
+      fprintf(output_file, "Optimized problem.\n");
+    if (verbosity >= 2)
+      fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum));
+    if (verbosity >= 3) {
+      fprintf(output_file, "Optimum location:\n");
+      ppl_Generator_divisor(optimum_location, ppl_coeff);
+      ppl_Coefficient_to_mpz_t(ppl_coeff, tmp_z);
+      for (i = 0; i < dimension; ++i) {
+	mpz_set(mpq_denref(tmp1_q), tmp_z);
+	ppl_Generator_coefficient(optimum_location, i, ppl_coeff);
+	ppl_Coefficient_to_mpz_t(ppl_coeff, mpq_numref(tmp1_q));
+	ppl_io_fprint_variable(output_file, i);
+	fprintf(output_file, " = %.10g\n", mpq_get_d(tmp1_q));
+      }
     }
-    if (check_optimum) {
-      // TODO: currently checking only feasibility.
-      // Find a way to also check for optimality.
-      check_feasibility(ppl_cs, optimum_value);
+#ifndef NDEBUG
+    {
+      ppl_Polyhedron_t ph;
+      unsigned int relation;
+      ppl_new_C_Polyhedron_recycle_Constraint_System(&ph, ppl_cs_copy);
+      ppl_delete_Constraint_System(ppl_cs_copy);
+      relation = ppl_Polyhedron_relation_with_Generator(ph, optimum_location);
+      ppl_delete_Polyhedron(ph);
+      assert(relation == PPL_POLY_GEN_RELATION_SUBSUMES);
     }
+#endif
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+			mpq_get_d(optimum));
+    mpq_clear(optimum);
   }
 
   ppl_delete_Constraint_System(ppl_cs);
-  ppl_delete_Linear_Expression(ppl_objective_le);
   ppl_delete_Coefficient(optimum_d);
   ppl_delete_Coefficient(optimum_n);
-  ppl_delete_Generator(optimum_value);
+  ppl_delete_Generator(optimum_location);
 
-  lpx_delete_prob(lp);
+  lpx_delete_prob(glpk_lp);
 }
 
 static void
 error_handler(enum ppl_enum_error_code code,
 	      const char* description) {
-  fatal("PPL error code %d\n%s", code, description);
+  if (output_argument)
+    fprintf(output_file, "PPL error code %d: %s\n", code, description);
+  fatal("PPL error code %d: %s", code, description);
 }
 
-#if !CXX_SUPPORTS_ATTRIBUTE_WEAK
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
 void
 set_GMP_memory_allocation_functions(void) {
 }
 #endif
 
+#if defined(NDEBUG) && !defined(PPL_GLPK_HAS_GLP_TERM_OUT)
+static int
+glpk_message_interceptor(void* info, char* msg) {
+  (void) info;
+  (void) msg;
+  return 1;
+}
+#endif
+
 int
 main(int argc, char* argv[]) {
   program_name = argv[0];
   if (ppl_initialize() < 0)
     fatal("cannot initialize the Parma Polyhedra Library");
 
+  // The PPL solver does not use floating point numbers, except
+  // perhaps for the steepest edge heuristics.  In contrast, GLPK does
+  // use them, so it is best to restore the rounding mode as it was
+  // prior to the PPL initialization.
+  if (ppl_restore_pre_PPL_rounding() < 0)
+    fatal("cannot restore the rounding mode");
+
   if (ppl_set_error_handler(error_handler) < 0)
     fatal("cannot install the custom error handler");
 
@@ -861,6 +1174,20 @@ main(int argc, char* argv[]) {
   if (ppl_io_set_variable_output_function(variable_output_function) < 0)
     fatal("cannot install the custom variable output function");
 
+#ifdef NDEBUG
+#if defined(PPL_GLPK_HAS_GLP_TERM_OUT)
+  glp_term_out(GLP_OFF);
+#elif defined(PPL_GLPK_HAS_GLP_TERM_HOOK)
+  glp_term_hook(glpk_message_interceptor, 0);
+#elif defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+  extern void _glp_lib_print_hook(int (*func)(void *info, char *buf),
+				  void *info);
+  _glp_lib_print_hook(glpk_message_interceptor, 0);
+#elif defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK)
+  lib_set_print_hook(0, glpk_message_interceptor);
+#endif
+#endif
+
   /* Process command line options. */
   process_options(argc, argv);
 
@@ -876,9 +1203,16 @@ main(int argc, char* argv[]) {
   if (max_bytes_of_virtual_memory > 0)
     limit_virtual_memory(max_bytes_of_virtual_memory);
 
-  while (optind < argc)
+  while (optind < argc) {
+    if (check_results)
+      check_results_failed = 0;
+
     solve(argv[optind++]);
 
+    if (check_results && check_results_failed)
+      break;
+  }
+
   /* Finalize globals. */
   ppl_delete_Coefficient(ppl_coeff);
   mpq_clear(tmp2_q);
@@ -889,7 +1223,8 @@ main(int argc, char* argv[]) {
   if (output_argument)
     fclose(output_file);
 
-  my_exit(0);
+  my_exit((check_results && check_results_failed) ? 1 : 0);
 
+  /* This is just to avoid a compiler warning. */
   return 0;
 }
diff --git a/depcomp b/depcomp
index 011ebd9..e5f9736 100755
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2005-07-09.11
+scriptversion=2007-03-29.01
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
+# Foundation, Inc.
 
 # 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
@@ -16,7 +17,7 @@ scriptversion=2005-07-09.11
 # 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,
+# along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 # 02110-1301, USA.
 
@@ -91,7 +92,20 @@ gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
 ## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
 ## it if -MD -MP comes after the -MF stuff.  Hmm.
-  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
   stat=$?
   if test $stat -eq 0; then :
   else
@@ -201,34 +215,39 @@ aix)
   # current directory.  Also, the AIX compiler puts `$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
   if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
     "$@" -Wc,-M
   else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
     "$@" -M
   fi
   stat=$?
 
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
   if test $stat -eq 0; then :
   else
-    rm -f "$tmpdepfile"
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
     exit $stat
   fi
 
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
   if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
     # Each line is of the form `foo.o: dependent.h'.
     # Do two passes, one to just change these to
     # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -276,6 +295,46 @@ icc)
   rm -f "$tmpdepfile"
   ;;
 
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
@@ -288,13 +347,13 @@ tru64)
 
    if test "$libtool" = yes; then
       # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mecanism is used in libtool 1.4 series to
+      # static library.  This mechanism is used in libtool 1.4 series to
       # handle both shared and static libraries in a single compilation.
       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
       #
       # With libtool 1.5 this exception was removed, and libtool now
       # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # compilations output dependencies in $dir.libs/$base.o.d and
       # in $dir$base.o.d.  We have to check for both files, because
       # one of the two compilations can be disabled.  We should prefer
       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
diff --git a/doc/Makefile.am b/doc/Makefile.am
index bae44e2..ab34d14 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,8 +20,6 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-abs_srcdir = @abs_srcdir@
-
 # All the documentation in docdir.
 docdir = @docdir@
 htmldir = $(docdir)
@@ -30,6 +28,7 @@ psdir = $(docdir)
 txtdir = $(docdir)
 
 DOXYGEN = doxygen
+INSTALLDOX = ./installdox -q
 
 PDF_LICENSES = \
 gpl.pdf \
@@ -48,41 +47,316 @@ $(PDF_LICENSES) \
 $(TXT_LICENSES) \
 $(PS_LICENSES)
 
-HTML_MANUALS = \
+# Library Core Manuals (C++ interface)
+
+HTML_CORE_MANUALS = \
 ppl-user- at VERSION@-html.tar.gz \
 ppl-devref- at VERSION@-html.tar.gz
 
-PDF_MANUALS = \
+PDF_CORE_MANUALS = \
 ppl-user- at VERSION@.pdf \
 ppl-devref- at VERSION@.pdf
 
-PS_MANUALS = \
+PS_CORE_MANUALS = \
 ppl-user- at VERSION@.ps.gz \
 ppl-devref- at VERSION@.ps.gz
 
+USER_HTML_DIR = ppl-user- at VERSION@-html
+DEVREF_HTML_DIR = ppl-devref- at VERSION@-html
+
+CORE_HTML_DIRS = $(USER_HTML_DIR) $(DEVREF_HTML_DIR)
+
+DIST_CORE_HTML_DOCS = \
+ppl-user- at VERSION@-html.tar.gz
+
+DIST_CORE_PDF_DOCS = \
+ppl-user- at VERSION@.pdf
+
+DIST_CORE_PS_DOCS = \
+ppl-user- at VERSION@.ps.gz
+
+DOX_FILES = \
+definitions.dox \
+gpl.dox \
+fdl.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+$(top_builddir)/src/ppl.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+
+# C Language Interface Manuals
+if BUILD_C_INTERFACE
+
+HTML_C_INTERFACE_MANUALS = \
+ppl-user-c-interface- at VERSION@-html.tar.gz \
+ppl-devref-c-interface- at VERSION@-html.tar.gz
+
+PDF_C_INTERFACE_MANUALS = \
+ppl-user-c-interface- at VERSION@.pdf \
+ppl-devref-c-interface- at VERSION@.pdf
+
+PS_C_INTERFACE_MANUALS = \
+ppl-user-c-interface- at VERSION@.ps.gz \
+ppl-devref-c-interface- at VERSION@.ps.gz
+
+C_INTERFACE_HTML_DIRS = \
+ppl-user-c-interface- at VERSION@-html \
+ppl-devref-c-interface- at VERSION@-html
+
+DIST_C_INTERFACE_HTML_DOCS = \
+ppl-user-c-interface- at VERSION@-html.tar.gz
+
+DIST_C_INTERFACE_PDF_DOCS = \
+ppl-user-c-interface- at VERSION@.pdf
+
+DIST_C_INTERFACE_PS_DOCS = \
+ppl-user-c-interface- at VERSION@.ps.gz
+
+USER_C_INTERFACE_STUFF = \
+user-c-interface.tex \
+ppl.sty \
+../interfaces/C/C_interface.dox \
+$(top_builddir)/interfaces/C/ppl_c.h
+
+DEVREF_C_INTERFACE_STUFF = \
+devref-c-interface.tex \
+ppl.sty \
+$(top_builddir)/interfaces/C/ppl_c.cc
+
+endif BUILD_C_INTERFACE
+
+
+# Prolog Language Interface Manuals
+if BUILD_SOME_PROLOG_INTERFACES
+
+HTML_PROLOG_INTERFACE_MANUALS = \
+ppl-user-prolog-interface- at VERSION@-html.tar.gz \
+ppl-devref-prolog-interface- at VERSION@-html.tar.gz
+
+PDF_PROLOG_INTERFACE_MANUALS = \
+ppl-user-prolog-interface- at VERSION@.pdf \
+ppl-devref-prolog-interface- at VERSION@.pdf
+
+PS_PROLOG_INTERFACE_MANUALS = \
+ppl-user-prolog-interface- at VERSION@.ps.gz \
+ppl-devref-prolog-interface- at VERSION@.ps.gz
+
+PROLOG_INTERFACE_HTML_DIRS = \
+ppl-user-prolog-interface- at VERSION@-html \
+ppl-devref-prolog-interface- at VERSION@-html
+
+DIST_PROLOG_INTERFACE_HTML_DOCS = \
+ppl-user-prolog-interface- at VERSION@-html.tar.gz
+
+DIST_PROLOG_INTERFACE_PDF_DOCS = \
+ppl-user-prolog-interface- at VERSION@.pdf
+
+DIST_PROLOG_INTERFACE_PS_DOCS = \
+ppl-user-prolog-interface- at VERSION@.ps.gz
+
+USER_PROLOG_INTERFACE_STUFF = \
+user-prolog-interface.tex \
+ppl.sty \
+$(top_builddir)/interfaces/Prolog/Prolog_interface.dox
+
+DEVREF_PROLOG_INTERFACE_STUFF = \
+devref-prolog-interface.tex \
+ppl.sty \
+$(top_builddir)/interfaces/Prolog/Prolog_interface.dox \
+../interfaces/Prolog/ppl_prolog_common.defs.hh \
+../interfaces/Prolog/ppl_prolog_common.inlines.hh \
+../interfaces/Prolog/ppl_prolog_common.cc  \
+$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \
+$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+
+# OCaml Language Interface Manuals
+if BUILD_OCAML_INTERFACE
+
+HTML_OCAML_INTERFACE_MANUALS = \
+ppl-user-ocaml-interface- at VERSION@-html.tar.gz \
+ppl-devref-ocaml-interface- at VERSION@-html.tar.gz
+
+PDF_OCAML_INTERFACE_MANUALS = \
+ppl-user-ocaml-interface- at VERSION@.pdf \
+ppl-devref-ocaml-interface- at VERSION@.pdf
+
+PS_OCAML_INTERFACE_MANUALS = \
+ppl-user-ocaml-interface- at VERSION@.ps.gz \
+ppl-devref-ocaml-interface- at VERSION@.ps.gz
+
+OCAML_INTERFACE_HTML_DIRS = \
+ppl-user-ocaml-interface- at VERSION@-html \
+ppl-devref-ocaml-interface- at VERSION@-html
+
+DIST_OCAML_INTERFACE_HTML_DOCS = \
+ppl-user-ocaml-interface- at VERSION@-html.tar.gz
+
+DIST_OCAML_INTERFACE_PDF_DOCS = \
+ppl-user-ocaml-interface- at VERSION@.pdf
+
+DIST_OCAML_INTERFACE_PS_DOCS = \
+ppl-user-ocaml-interface- at VERSION@.ps.gz
+
+USER_OCAML_INTERFACE_STUFF = \
+user-ocaml-interface.tex \
+ppl.sty \
+../interfaces/OCaml/OCaml_interface.dox \
+../interfaces/OCaml/ppl_ocaml.mli
+
+DEVREF_OCAML_INTERFACE_STUFF = \
+devref-ocaml-interface.tex \
+ppl.sty \
+$(top_builddir)/interfaces/OCaml/ppl_ocaml.cc
+
+endif BUILD_OCAML_INTERFACE
+
+
+# Java Language Interface Manuals
+if BUILD_JAVA_INTERFACE
+
+HTML_JAVA_INTERFACE_MANUALS = \
+ppl-user-java-interface- at VERSION@-html.tar.gz \
+ppl-devref-java-interface- at VERSION@-html.tar.gz
+
+PDF_JAVA_INTERFACE_MANUALS = \
+ppl-user-java-interface- at VERSION@.pdf \
+ppl-devref-java-interface- at VERSION@.pdf
+
+PS_JAVA_INTERFACE_MANUALS = \
+ppl-user-java-interface- at VERSION@.ps.gz \
+ppl-devref-java-interface- at VERSION@.ps.gz
+
+JAVA_INTERFACE_HTML_DIRS = \
+ppl-user-java-interface- at VERSION@-html \
+ppl-devref-java-interface- at VERSION@-html
+
+DIST_JAVA_INTERFACE_HTML_DOCS = \
+ppl-user-java-interface- at VERSION@-html.tar.gz
+
+DIST_JAVA_INTERFACE_PDF_DOCS = \
+ppl-user-java-interface- at VERSION@.pdf
+
+DIST_JAVA_INTERFACE_PS_DOCS = \
+ppl-user-java-interface- at VERSION@.ps.gz
+
+JAVA_INTERFACE_JAVA_FILES = \
+../interfaces/Java/Java_interface.dox \
+../interfaces/Java/ppl_java/By_Reference.java \
+../interfaces/Java/ppl_java/Coefficient.java \
+../interfaces/Java/ppl_java/Congruence.java \
+../interfaces/Java/ppl_java/Congruence_System.java \
+../interfaces/Java/ppl_java/Constraint.java \
+../interfaces/Java/ppl_java/Constraint_System.java \
+../interfaces/Java/ppl_java/Degenerate_Element.java \
+../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+../interfaces/Java/ppl_java/Generator.java \
+../interfaces/Java/ppl_java/Generator_System.java \
+../interfaces/Java/ppl_java/Generator_Type.java \
+../interfaces/Java/ppl_java/Grid_Generator.java \
+../interfaces/Java/ppl_java/Grid_Generator_System.java \
+../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+../interfaces/Java/ppl_java/Length_Error_Exception.java \
+../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+../interfaces/Java/ppl_java/Linear_Expression.java \
+../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+../interfaces/Java/ppl_java/MIP_Problem.java \
+../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+../interfaces/Java/ppl_java/Optimization_Mode.java \
+../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+../interfaces/Java/ppl_java/Partial_Function.java \
+../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+../interfaces/Java/ppl_java/PPL_Object.java \
+../interfaces/Java/ppl_java/Relation_Symbol.java \
+../interfaces/Java/ppl_java/Variable.java \
+../interfaces/Java/ppl_java/Variables_Set.java
+# FIXME add the automatically-generated files.
+
+USER_JAVA_INTERFACE_STUFF = \
+user-java-interface.tex \
+ppl.sty \
+$(JAVA_INTERFACE_JAVA_FILES)
+
+DEVREF_JAVA_INTERFACE_STUFF = \
+devref-java-interface.tex \
+ppl.sty \
+$(JAVA_INTERFACE_JAVA_FILES) \
+../interfaces/Java/jni/ppl_java_common.cc \
+../interfaces/Java/jni/ppl_java_common.hh \
+../interfaces/Java/jni/ppl_java_globals.cc
+# FIXME add the automatically-generated files.
+
+endif BUILD_JAVA_INTERFACE
+
+
 MANUALS = \
-$(HTML_MANUALS) \
-$(PDF_MANUALS) \
-$(PS_MANUALS)
+$(HTML_CORE_MANUALS) \
+$(HTML_C_INTERFACE_MANUALS) \
+$(HTML_PROLOG_INTERFACE_MANUALS) \
+$(HTML_OCAML_INTERFACE_MANUALS) \
+$(HTML_JAVA_INTERFACE_MANUALS) \
+$(PDF_CORE_MANUALS) \
+$(PDF_C_INTERFACE_MANUALS) \
+$(PDF_PROLOG_INTERFACE_MANUALS) \
+$(PDF_OCAML_INTERFACE_MANUALS) \
+$(PDF_JAVA_INTERFACE_MANUALS) \
+$(PS_CORE_MANUALS) \
+$(PS_C_INTERFACE_MANUALS) \
+$(PS_PROLOG_INTERFACE_MANUALS) \
+$(PS_OCAML_INTERFACE_MANUALS) \
+$(PS_JAVA_INTERFACE_MANUALS)
 
 HTML_DIRS = \
-ppl-user- at VERSION@-html \
-ppl-devref- at VERSION@-html
-
-TEMP_HTML_DIRS = \
-user.html-dir \
-devref.html-dir
+$(CORE_HTML_DIRS) \
+$(C_INTERFACE_HTML_DIRS) \
+$(PROLOG_INTERFACE_HTML_DIRS) \
+$(OCAML_INTERFACE_HTML_DIRS) \
+$(JAVA_INTERFACE_HTML_DIRS)
 
 DIST_HTML_DOCS = \
-ppl-user- at VERSION@-html.tar.gz
+$(DIST_CORE_HTML_DOCS)
+# FIXME: should we distribute manuals for the "foreign" interfaces?
+#$(DIST_C_INTERFACE_HTML_DOCS) \
+#$(DIST_PROLOG_INTERFACE_HTML_DOCS) \
+#$(DIST_OCAML_INTERFACE_HTML_DOCS) \
+#$(DIST_JAVA_INTERFACE_HTML_DOCS)
 
 DIST_PDF_DOCS = \
 $(PDF_LICENSES) \
-ppl-user- at VERSION@.pdf
+$(DIST_CORE_PDF_DOCS)
+# FIXME: should we distribute manuals for the "foreign" interfaces?
+#$(DIST_C_INTERFACE_PDF_DOCS) \
+#$(DIST_PROLOG_INTERFACE_PDF_DOCS) \
+#$(DIST_OCAML_INTERFACE_PDF_DOCS) \
+#$(DIST_JAVA_INTERFACE_PDF_DOCS)
 
 DIST_PS_DOCS = \
 $(PS_LICENSES) \
-ppl-user- at VERSION@.ps.gz
+$(DIST_CORE_PS_DOCS)
+# FIXME: should we distribute manuals for the "foreign" interfaces?
+#$(DIST_C_INTERFACE_PS_DOCS) \
+#$(DIST_PROLOG_INTERFACE_PS_DOCS) \
+#$(DIST_OCAML_INTERFACE_PS_DOCS) \
+#$(DIST_JAVA_INTERFACE_PS_DOCS)
 
 DIST_TXT_DOCS = \
 $(TXT_LICENSES)
@@ -101,6 +375,7 @@ $(PS_LICENSES) \
 $(MANUALS)
 
 dist_man_MANS = \
+libppl.3 \
 ppl-config.1 \
 ppl_lcdd.1 \
 ppl_lpsol.1
@@ -188,7 +463,7 @@ install-txt:
 	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
 	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
 	done
-	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
 	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
 	done
 
@@ -197,44 +472,33 @@ installdirs-txt:
 
 uninstall-txt:
 	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
-	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
 	  rm -f $(DESTDIR)$(txtdir)/$$file; \
 	done
 
 PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
 
-DOX_FILES = \
-definitions.dox \
-../interfaces/Prolog/Prolog_interface.dox \
-gpl.dox \
-fdl.dox
-
-USER_STUFF = \
-$(DOX_FILES) \
-user.tex \
-ppl.sty \
-$(top_builddir)/src/ppl.hh \
-../interfaces/C/ppl_c.h
-
-DEVREF_STUFF = \
-$(DOX_FILES) \
-devref.tex \
-ppl.sty \
-$(PPL_SOURCE_FILES)
-
 LATEX_DIRS = \
 user.latex-dir \
-devref.latex-dir
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir \
+user-ocaml-interface.latex-dir \
+devref-ocaml-interface.latex-dir \
+user-java-interface.latex-dir \
+devref-java-interface.latex-dir
 
 TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
 
 .SECONDARY: $(LATEX_DIRS)
 
-user.latex-dir: user.doxyconf-latex $(USER_STUFF)
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
 	rm -rf $@
 	$(TEX_ENV) $(DOXYGEN) $<
 
-devref.latex-dir: devref.doxyconf-latex $(DEVREF_STUFF)
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
 	rm -rf $@
 	$(TEX_ENV) $(DOXYGEN) $<
 
@@ -244,13 +508,173 @@ ppl-user- at VERSION@.pdf: user.latex-dir
 ppl-devref- at VERSION@.pdf: devref.latex-dir
 	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
 
-ppl-user- at VERSION@-html: user.doxyconf-html $(DEVREF_STUFF)
-	rm -rf user.html-dir
-	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f user.html-dir $@
+$(USER_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+$(DEVREF_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+
+# C Language Interface
+if BUILD_C_INTERFACE
+
+user-c-interface.latex-dir: \
+user-c-interface.doxyconf-latex $(USER_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref-c-interface.latex-dir: \
+devref-c-interface.doxyconf-latex $(DEVREF_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user-c-interface- at VERSION@.pdf: user-c-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref-c-interface- at VERSION@.pdf: devref-c-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user-c-interface- at VERSION@-html: \
+user-c-interface.doxyconf-html \
+$(USER_C_INTERFACE_STUFF) $(USER_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ppl-devref-c-interface- at VERSION@-html: \
+devref-c-interface.doxyconf-html \
+$(DEVREF_C_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+endif BUILD_C_INTERFACE
+
+# (System Independent) Prolog Language Interface
+if BUILD_SOME_PROLOG_INTERFACES
+
+user-prolog-interface.latex-dir: \
+user-prolog-interface.doxyconf-latex $(USER_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref-prolog-interface.latex-dir: \
+devref-prolog-interface.doxyconf-latex $(DEVREF_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user-prolog-interface- at VERSION@.pdf: user-prolog-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref-prolog-interface- at VERSION@.pdf: devref-prolog-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user-prolog-interface- at VERSION@-html: \
+user-prolog-interface.doxyconf-html \
+$(USER_PROLOG_INTERFACE_STUFF) $(USER_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ppl-devref-prolog-interface- at VERSION@-html: \
+devref-prolog-interface.doxyconf-html \
+$(DEVREF_PROLOG_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+
+# OCaml Language Interface
+if BUILD_OCAML_INTERFACE
+
+user-ocaml-interface.latex-dir: \
+user-ocaml-interface.doxyconf-latex \
+$(USER_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; ocamldoc -I +gmp \
+			-latex -noheader -notrailer -notoc -o ocamldoc.tex \
+			../../interfaces/OCaml/ppl_ocaml.mli)
+
+devref-ocaml-interface.latex-dir: \
+devref-ocaml-interface.doxyconf-latex \
+$(DEVREF_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; ocamldoc -I +gmp \
+			-latex -noheader -notrailer -notoc -o ocamldoc.tex \
+			../../interfaces/OCaml/ppl_ocaml.mli)
+
+ppl-user-ocaml-interface- at VERSION@.pdf: user-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref-ocaml-interface- at VERSION@.pdf: devref-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user-ocaml-interface- at VERSION@-html: \
+user-ocaml-interface.doxyconf-html \
+$(USER_OCAML_INTERFACE_STUFF) $(USER_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	mkdir $@/ocamldoc
+	ocamldoc -I +gmp \
+		-html -d $@/ocamldoc ../interfaces/OCaml/ppl_ocaml.mli
+	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ppl-devref-ocaml-interface- at VERSION@-html: \
+devref-ocaml-interface.doxyconf-html \
+$(DEVREF_OCAML_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	mkdir $@/ocamldoc
+	ocamldoc -I +gmp \
+		-html -d $@/ocamldoc ../interfaces/OCaml/ppl_ocaml.mli
+	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+endif BUILD_OCAML_INTERFACE
+
+
+# Java Language Interface
+if BUILD_JAVA_INTERFACE
+
+user-java-interface.latex-dir: \
+user-java-interface.doxyconf-latex \
+$(USER_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref-java-interface.latex-dir: \
+devref-java-interface.doxyconf-latex \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user-java-interface- at VERSION@.pdf: user-java-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref-java-interface- at VERSION@.pdf: devref-java-interface.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user-java-interface- at VERSION@-html: \
+user-java-interface.doxyconf-html \
+$(USER_JAVA_INTERFACE_STUFF) $(USER_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ppl-devref-java-interface- at VERSION@-html: \
+devref-java-interface.doxyconf-html \
+$(DEVREF_JAVA_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+endif BUILD_JAVA_INTERFACE
 
-ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
-	rm -rf devref.html-dir
-	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f devref.html-dir $@
 
 %.tar: %
 	tar cf $@ $<
@@ -267,18 +691,43 @@ ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
 EXTRA_DIST= \
 $(DIST_DOCS) \
 $(DOX_FILES) \
-user.doxyconf-latex \
-devref.doxyconf-latex \
-user.doxyconf-html \
+README.doc \
+devref-c-interface.doxyconf-html \
+devref-c-interface.doxyconf-latex \
+devref-c-interface.tex \
+devref-java-interface.doxyconf-latex \
+devref-java-interface.tex \
+devref-ocaml-interface.doxyconf-latex \
+devref-ocaml-interface.tex \
+devref-prolog-interface.doxyconf-html \
+devref-prolog-interface.doxyconf-latex \
+devref-prolog-interface.tex \
 devref.doxyconf-html \
-user.tex \
+devref.doxyconf-latex \
 devref.tex \
-gpl.tex \
 fdl.tex \
+gpl.tex \
 ppl.sty \
-README.doc
+user-c-interface.doxyconf-html \
+user-c-interface.doxyconf-latex \
+user-c-interface.tex \
+user-java-interface.doxyconf-latex \
+user-java-interface.tex \
+user-ocaml-interface.doxyconf-latex \
+user-ocaml-interface.tex \
+user-prolog-interface.doxyconf-html \
+user-prolog-interface.doxyconf-latex \
+user-prolog-interface.tex \
+user.doxyconf-html \
+user.doxyconf-latex \
+user.tex
 
 mostlyclean-local:
-	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(TEMP_HTML_DIRS) *.aux *.log
+	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(HTML_DIRS) *.aux *.log
 
-CLEANFILES = $(DIST_HTML_DOCS) $(DIST_PDF_DOCS) $(DIST_PS_DOCS)
+CLEANFILES = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(USER_HTML_DIR).tag \
+$(DEVREF_HTML_DIR).tag
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 6eb3fae..a70b576 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -59,12 +55,30 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = doc
 DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/devref.doxyconf-html.in \
+	$(srcdir)/Makefile.in \
+	$(srcdir)/devref-c-interface.doxyconf-html.in \
+	$(srcdir)/devref-c-interface.doxyconf-latex.in \
+	$(srcdir)/devref-java-interface.doxyconf-html.in \
+	$(srcdir)/devref-java-interface.doxyconf-latex.in \
+	$(srcdir)/devref-ocaml-interface.doxyconf-html.in \
+	$(srcdir)/devref-ocaml-interface.doxyconf-latex.in \
+	$(srcdir)/devref-prolog-interface.doxyconf-html.in \
+	$(srcdir)/devref-prolog-interface.doxyconf-latex.in \
+	$(srcdir)/devref.doxyconf-html.in \
 	$(srcdir)/devref.doxyconf-latex.in \
+	$(srcdir)/user-c-interface.doxyconf-html.in \
+	$(srcdir)/user-c-interface.doxyconf-latex.in \
+	$(srcdir)/user-java-interface.doxyconf-html.in \
+	$(srcdir)/user-java-interface.doxyconf-latex.in \
+	$(srcdir)/user-ocaml-interface.doxyconf-html.in \
+	$(srcdir)/user-ocaml-interface.doxyconf-latex.in \
+	$(srcdir)/user-prolog-interface.doxyconf-html.in \
+	$(srcdir)/user-prolog-interface.doxyconf-latex.in \
 	$(srcdir)/user.doxyconf-html.in \
 	$(srcdir)/user.doxyconf-latex.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -74,56 +88,62 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = user.doxyconf-latex devref.doxyconf-latex \
-	user.doxyconf-html devref.doxyconf-html
+	user.doxyconf-html devref.doxyconf-html \
+	user-c-interface.doxyconf-latex \
+	devref-c-interface.doxyconf-latex \
+	user-c-interface.doxyconf-html \
+	devref-c-interface.doxyconf-html \
+	user-prolog-interface.doxyconf-latex \
+	devref-prolog-interface.doxyconf-latex \
+	user-prolog-interface.doxyconf-html \
+	devref-prolog-interface.doxyconf-html \
+	user-ocaml-interface.doxyconf-html \
+	user-ocaml-interface.doxyconf-latex \
+	devref-ocaml-interface.doxyconf-html \
+	devref-ocaml-interface.doxyconf-latex \
+	user-java-interface.doxyconf-html \
+	user-java-interface.doxyconf-latex \
+	devref-java-interface.doxyconf-html \
+	devref-java-interface.doxyconf-latex
 SOURCES =
 DIST_SOURCES =
 man1dir = $(mandir)/man1
-am__installdirs = "$(DESTDIR)$(man1dir)"
+am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"
+man3dir = $(mandir)/man3
 NROFF = nroff
 MANS = $(dist_man_MANS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -133,53 +153,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -188,56 +206,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -249,12 +241,16 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 
 # All the documentation in docdir.
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -263,31 +259,46 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = $(docdir)
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = $(docdir)
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = $(docdir)
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-abs_srcdir = @abs_srcdir@
-htmldir = $(docdir)
-pdfdir = $(docdir)
-psdir = $(docdir)
 txtdir = $(docdir)
 DOXYGEN = doxygen
+INSTALLDOX = ./installdox -q
 PDF_LICENSES = \
 gpl.pdf \
 fdl.pdf
@@ -305,42 +316,298 @@ $(PDF_LICENSES) \
 $(TXT_LICENSES) \
 $(PS_LICENSES)
 
-HTML_MANUALS = \
+
+# Library Core Manuals (C++ interface)
+HTML_CORE_MANUALS = \
 ppl-user- at VERSION@-html.tar.gz \
 ppl-devref- at VERSION@-html.tar.gz
 
-PDF_MANUALS = \
+PDF_CORE_MANUALS = \
 ppl-user- at VERSION@.pdf \
 ppl-devref- at VERSION@.pdf
 
-PS_MANUALS = \
+PS_CORE_MANUALS = \
 ppl-user- at VERSION@.ps.gz \
 ppl-devref- at VERSION@.ps.gz
 
+USER_HTML_DIR = ppl-user- at VERSION@-html
+DEVREF_HTML_DIR = ppl-devref- at VERSION@-html
+CORE_HTML_DIRS = $(USER_HTML_DIR) $(DEVREF_HTML_DIR)
+DIST_CORE_HTML_DOCS = \
+ppl-user- at VERSION@-html.tar.gz
+
+DIST_CORE_PDF_DOCS = \
+ppl-user- at VERSION@.pdf
+
+DIST_CORE_PS_DOCS = \
+ppl-user- at VERSION@.ps.gz
+
+DOX_FILES = \
+definitions.dox \
+gpl.dox \
+fdl.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+$(top_builddir)/src/ppl.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+
+# C Language Interface Manuals
+ at BUILD_C_INTERFACE_TRUE@HTML_C_INTERFACE_MANUALS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html.tar.gz \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@PDF_C_INTERFACE_MANUALS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.pdf \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@PS_C_INTERFACE_MANUALS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.ps.gz \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@C_INTERFACE_HTML_DIRS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@DIST_C_INTERFACE_HTML_DOCS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@DIST_C_INTERFACE_PDF_DOCS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@DIST_C_INTERFACE_PS_DOCS = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@user-c-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@ppl.sty \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/C_interface.dox \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@devref-c-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@ppl.sty \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.cc
+
+
+# Prolog Language Interface Manuals
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@HTML_PROLOG_INTERFACE_MANUALS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html.tar.gz \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PDF_PROLOG_INTERFACE_MANUALS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.pdf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PS_PROLOG_INTERFACE_MANUALS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.ps.gz \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PROLOG_INTERFACE_HTML_DIRS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DIST_PROLOG_INTERFACE_HTML_DOCS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DIST_PROLOG_INTERFACE_PDF_DOCS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DIST_PROLOG_INTERFACE_PS_DOCS = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-prolog-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/Prolog_interface.dox
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-prolog-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/Prolog_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.cc  \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc
+
+
+# OCaml Language Interface Manuals
+ at BUILD_OCAML_INTERFACE_TRUE@HTML_OCAML_INTERFACE_MANUALS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html.tar.gz \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@PDF_OCAML_INTERFACE_MANUALS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.pdf \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@PS_OCAML_INTERFACE_MANUALS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.ps.gz \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@OCAML_INTERFACE_HTML_DIRS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@DIST_OCAML_INTERFACE_HTML_DOCS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DIST_OCAML_INTERFACE_PDF_DOCS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@DIST_OCAML_INTERFACE_PS_DOCS = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@user-ocaml-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl.sty \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-ocaml-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl.sty \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.cc
+
+
+# Java Language Interface Manuals
+ at BUILD_JAVA_INTERFACE_TRUE@HTML_JAVA_INTERFACE_MANUALS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html.tar.gz \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@PDF_JAVA_INTERFACE_MANUALS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.pdf \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@PS_JAVA_INTERFACE_MANUALS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.ps.gz \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@JAVA_INTERFACE_HTML_DIRS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@DIST_JAVA_INTERFACE_HTML_DOCS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DIST_JAVA_INTERFACE_PDF_DOCS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@DIST_JAVA_INTERFACE_PS_DOCS = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@JAVA_INTERFACE_JAVA_FILES = \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/Java_interface.dox \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/By_Reference.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Coefficient.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Congruence.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Congruence_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Constraint.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Constraint_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Degenerate_Element.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Generator.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Generator_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Generator_Type.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Grid_Generator.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Grid_Generator_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Length_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/MIP_Problem.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Optimization_Mode.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Partial_Function.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/PPL_Object.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Relation_Symbol.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Variable.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/ppl_java/Variables_Set.java
+
+# FIXME add the automatically-generated files.
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@user-java-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl.sty \
+ at BUILD_JAVA_INTERFACE_TRUE@$(JAVA_INTERFACE_JAVA_FILES)
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-java-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl.sty \
+ at BUILD_JAVA_INTERFACE_TRUE@$(JAVA_INTERFACE_JAVA_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common.cc \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common.hh \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_globals.cc
+
+# FIXME add the automatically-generated files.
 MANUALS = \
-$(HTML_MANUALS) \
-$(PDF_MANUALS) \
-$(PS_MANUALS)
+$(HTML_CORE_MANUALS) \
+$(HTML_C_INTERFACE_MANUALS) \
+$(HTML_PROLOG_INTERFACE_MANUALS) \
+$(HTML_OCAML_INTERFACE_MANUALS) \
+$(HTML_JAVA_INTERFACE_MANUALS) \
+$(PDF_CORE_MANUALS) \
+$(PDF_C_INTERFACE_MANUALS) \
+$(PDF_PROLOG_INTERFACE_MANUALS) \
+$(PDF_OCAML_INTERFACE_MANUALS) \
+$(PDF_JAVA_INTERFACE_MANUALS) \
+$(PS_CORE_MANUALS) \
+$(PS_C_INTERFACE_MANUALS) \
+$(PS_PROLOG_INTERFACE_MANUALS) \
+$(PS_OCAML_INTERFACE_MANUALS) \
+$(PS_JAVA_INTERFACE_MANUALS)
 
 HTML_DIRS = \
-ppl-user- at VERSION@-html \
-ppl-devref- at VERSION@-html
-
-TEMP_HTML_DIRS = \
-user.html-dir \
-devref.html-dir
+$(CORE_HTML_DIRS) \
+$(C_INTERFACE_HTML_DIRS) \
+$(PROLOG_INTERFACE_HTML_DIRS) \
+$(OCAML_INTERFACE_HTML_DIRS) \
+$(JAVA_INTERFACE_HTML_DIRS)
 
 DIST_HTML_DOCS = \
-ppl-user- at VERSION@-html.tar.gz
+$(DIST_CORE_HTML_DOCS)
 
+# FIXME: should we distribute manuals for the "foreign" interfaces?
+#$(DIST_C_INTERFACE_HTML_DOCS) \
+#$(DIST_PROLOG_INTERFACE_HTML_DOCS) \
+#$(DIST_OCAML_INTERFACE_HTML_DOCS) \
+#$(DIST_JAVA_INTERFACE_HTML_DOCS)
 DIST_PDF_DOCS = \
 $(PDF_LICENSES) \
-ppl-user- at VERSION@.pdf
+$(DIST_CORE_PDF_DOCS)
 
+# FIXME: should we distribute manuals for the "foreign" interfaces?
+#$(DIST_C_INTERFACE_PDF_DOCS) \
+#$(DIST_PROLOG_INTERFACE_PDF_DOCS) \
+#$(DIST_OCAML_INTERFACE_PDF_DOCS) \
+#$(DIST_JAVA_INTERFACE_PDF_DOCS)
 DIST_PS_DOCS = \
 $(PS_LICENSES) \
-ppl-user- at VERSION@.ps.gz
+$(DIST_CORE_PS_DOCS)
 
+# FIXME: should we distribute manuals for the "foreign" interfaces?
+#$(DIST_C_INTERFACE_PS_DOCS) \
+#$(DIST_PROLOG_INTERFACE_PS_DOCS) \
+#$(DIST_OCAML_INTERFACE_PS_DOCS) \
+#$(DIST_JAVA_INTERFACE_PS_DOCS)
 DIST_TXT_DOCS = \
 $(TXT_LICENSES)
 
@@ -359,50 +626,66 @@ $(PS_LICENSES) \
 $(MANUALS)
 
 dist_man_MANS = \
+libppl.3 \
 ppl-config.1 \
 ppl_lcdd.1 \
 ppl_lpsol.1
 
 PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
-DOX_FILES = \
-definitions.dox \
-../interfaces/Prolog/Prolog_interface.dox \
-gpl.dox \
-fdl.dox
-
-USER_STUFF = \
-$(DOX_FILES) \
-user.tex \
-ppl.sty \
-$(top_builddir)/src/ppl.hh \
-../interfaces/C/ppl_c.h
-
-DEVREF_STUFF = \
-$(DOX_FILES) \
-devref.tex \
-ppl.sty \
-$(PPL_SOURCE_FILES)
-
 LATEX_DIRS = \
 user.latex-dir \
-devref.latex-dir
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir \
+user-ocaml-interface.latex-dir \
+devref-ocaml-interface.latex-dir \
+user-java-interface.latex-dir \
+devref-java-interface.latex-dir
 
 TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
 EXTRA_DIST = \
 $(DIST_DOCS) \
 $(DOX_FILES) \
-user.doxyconf-latex \
-devref.doxyconf-latex \
-user.doxyconf-html \
+README.doc \
+devref-c-interface.doxyconf-html \
+devref-c-interface.doxyconf-latex \
+devref-c-interface.tex \
+devref-java-interface.doxyconf-latex \
+devref-java-interface.tex \
+devref-ocaml-interface.doxyconf-latex \
+devref-ocaml-interface.tex \
+devref-prolog-interface.doxyconf-html \
+devref-prolog-interface.doxyconf-latex \
+devref-prolog-interface.tex \
 devref.doxyconf-html \
-user.tex \
+devref.doxyconf-latex \
 devref.tex \
-gpl.tex \
 fdl.tex \
+gpl.tex \
 ppl.sty \
-README.doc
+user-c-interface.doxyconf-html \
+user-c-interface.doxyconf-latex \
+user-c-interface.tex \
+user-java-interface.doxyconf-latex \
+user-java-interface.tex \
+user-ocaml-interface.doxyconf-latex \
+user-ocaml-interface.tex \
+user-prolog-interface.doxyconf-html \
+user-prolog-interface.doxyconf-latex \
+user-prolog-interface.tex \
+user.doxyconf-html \
+user.doxyconf-latex \
+user.tex
+
+CLEANFILES = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(USER_HTML_DIR).tag \
+$(DEVREF_HTML_DIR).tag
 
-CLEANFILES = $(DIST_HTML_DOCS) $(DIST_PDF_DOCS) $(DIST_PS_DOCS)
 all: all-am
 
 .SUFFIXES:
@@ -443,19 +726,47 @@ user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.i
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-c-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user-c-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-c-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref-c-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-c-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user-c-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-c-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref-c-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-prolog-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user-prolog-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-prolog-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref-prolog-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-prolog-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user-prolog-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-prolog-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref-prolog-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-ocaml-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user-ocaml-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-ocaml-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user-ocaml-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-ocaml-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref-ocaml-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-ocaml-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref-ocaml-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-java-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user-java-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-java-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user-java-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-java-interface.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref-java-interface.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-java-interface.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref-java-interface.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-man1: $(man1_MANS) $(man_MANS)
 	@$(NORMAL_INSTALL)
-	test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+	test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
 	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
 	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
 	for i in $$l2; do \
@@ -498,6 +809,51 @@ uninstall-man1:
 	  echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
 	  rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
 	done
+install-man3: $(man3_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)"
+	@list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.3*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    3*) ;; \
+	    *) ext='3' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \
+	done
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.3*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    3*) ;; \
+	    *) ext='3' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man3dir)/$$inst"; \
+	done
 tags: TAGS
 TAGS:
 
@@ -506,23 +862,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	$(mkdir_p) $(distdir)/../interfaces/Prolog
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -537,8 +891,8 @@ check-am: all-am
 check: check-am
 all-am: Makefile $(MANS)
 installdirs: installdirs-local
-	for dir in "$(DESTDIR)$(man1dir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -571,7 +925,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -585,11 +939,13 @@ info-am:
 
 install-data-am: install-data-local install-man
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
 install-info: install-info-am
 
-install-man: install-man1
+install-man: install-man1 install-man3
 
 installcheck-am:
 
@@ -610,21 +966,25 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am uninstall-local uninstall-man
+uninstall-am: uninstall-local uninstall-man
 
-uninstall-man: uninstall-man1
+uninstall-man: uninstall-man1 uninstall-man3
+
+.MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
 	distclean distclean-generic distclean-libtool distdir dvi \
 	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-data-local install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-man1 install-strip installcheck installcheck-am \
-	installdirs installdirs-local maintainer-clean \
+	install-data install-data-am install-data-local install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-man1 install-man3 install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-local maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-generic \
 	mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am \
-	uninstall uninstall-am uninstall-info-am uninstall-local \
-	uninstall-man uninstall-man1
+	uninstall uninstall-am uninstall-local uninstall-man \
+	uninstall-man1 uninstall-man3
 
 
 # Do nothing by default.
@@ -710,7 +1070,7 @@ install-txt:
 	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
 	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
 	done
-	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
 	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
 	done
 
@@ -719,17 +1079,17 @@ installdirs-txt:
 
 uninstall-txt:
 	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
-	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
 	  rm -f $(DESTDIR)$(txtdir)/$$file; \
 	done
 
 .SECONDARY: $(LATEX_DIRS)
 
-user.latex-dir: user.doxyconf-latex $(USER_STUFF)
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
 	rm -rf $@
 	$(TEX_ENV) $(DOXYGEN) $<
 
-devref.latex-dir: devref.doxyconf-latex $(DEVREF_STUFF)
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
 	rm -rf $@
 	$(TEX_ENV) $(DOXYGEN) $<
 
@@ -739,13 +1099,157 @@ ppl-user- at VERSION@.pdf: user.latex-dir
 ppl-devref- at VERSION@.pdf: devref.latex-dir
 	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
 
-ppl-user- at VERSION@-html: user.doxyconf-html $(DEVREF_STUFF)
-	rm -rf user.html-dir
-	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f user.html-dir $@
+$(USER_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+$(DEVREF_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
 
-ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
-	rm -rf devref.html-dir
-	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f devref.html-dir $@
+# C Language Interface
+
+ at BUILD_C_INTERFACE_TRUE@user-c-interface.latex-dir: \
+ at BUILD_C_INTERFACE_TRUE@user-c-interface.doxyconf-latex $(USER_C_INTERFACE_STUFF)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+
+ at BUILD_C_INTERFACE_TRUE@devref-c-interface.latex-dir: \
+ at BUILD_C_INTERFACE_TRUE@devref-c-interface.doxyconf-latex $(DEVREF_C_INTERFACE_STUFF)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.pdf: user-c-interface.latex-dir
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.pdf: devref-c-interface.latex-dir
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html: \
+ at BUILD_C_INTERFACE_TRUE@user-c-interface.doxyconf-html \
+ at BUILD_C_INTERFACE_TRUE@$(USER_C_INTERFACE_STUFF) $(USER_HTML_DIR)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_C_INTERFACE_TRUE@	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html: \
+ at BUILD_C_INTERFACE_TRUE@devref-c-interface.doxyconf-html \
+ at BUILD_C_INTERFACE_TRUE@$(DEVREF_C_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_C_INTERFACE_TRUE@	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+# (System Independent) Prolog Language Interface
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-prolog-interface.latex-dir: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-prolog-interface.doxyconf-latex $(USER_PROLOG_INTERFACE_STUFF)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-prolog-interface.latex-dir: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-prolog-interface.doxyconf-latex $(DEVREF_PROLOG_INTERFACE_STUFF)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.pdf: user-prolog-interface.latex-dir
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.pdf: devref-prolog-interface.latex-dir
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-prolog-interface.doxyconf-html \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(USER_PROLOG_INTERFACE_STUFF) $(USER_HTML_DIR)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-prolog-interface.doxyconf-html \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_PROLOG_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+# OCaml Language Interface
+
+ at BUILD_OCAML_INTERFACE_TRUE@user-ocaml-interface.latex-dir: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-ocaml-interface.doxyconf-latex \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_OCAML_INTERFACE_STUFF)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_OCAML_INTERFACE_TRUE@	(cd $@; ocamldoc -I +gmp \
+ at BUILD_OCAML_INTERFACE_TRUE@			-latex -noheader -notrailer -notoc -o ocamldoc.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@			../../interfaces/OCaml/ppl_ocaml.mli)
+
+ at BUILD_OCAML_INTERFACE_TRUE@devref-ocaml-interface.latex-dir: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-ocaml-interface.doxyconf-latex \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_OCAML_INTERFACE_STUFF)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_OCAML_INTERFACE_TRUE@	(cd $@; ocamldoc -I +gmp \
+ at BUILD_OCAML_INTERFACE_TRUE@			-latex -noheader -notrailer -notoc -o ocamldoc.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@			../../interfaces/OCaml/ppl_ocaml.mli)
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.pdf: user-ocaml-interface.latex-dir
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.pdf: devref-ocaml-interface.latex-dir
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-ocaml-interface.doxyconf-html \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_OCAML_INTERFACE_STUFF) $(USER_HTML_DIR)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_OCAML_INTERFACE_TRUE@	mkdir $@/ocamldoc
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamldoc -I +gmp \
+ at BUILD_OCAML_INTERFACE_TRUE@		-html -d $@/ocamldoc ../interfaces/OCaml/ppl_ocaml.mli
+ at BUILD_OCAML_INTERFACE_TRUE@	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-ocaml-interface.doxyconf-html \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_OCAML_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_OCAML_INTERFACE_TRUE@	mkdir $@/ocamldoc
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamldoc -I +gmp \
+ at BUILD_OCAML_INTERFACE_TRUE@		-html -d $@/ocamldoc ../interfaces/OCaml/ppl_ocaml.mli
+ at BUILD_OCAML_INTERFACE_TRUE@	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
+
+# Java Language Interface
+
+ at BUILD_JAVA_INTERFACE_TRUE@user-java-interface.latex-dir: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-java-interface.doxyconf-latex \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_JAVA_INTERFACE_STUFF)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+
+ at BUILD_JAVA_INTERFACE_TRUE@devref-java-interface.latex-dir: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-java-interface.doxyconf-latex \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_JAVA_INTERFACE_STUFF)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.pdf: user-java-interface.latex-dir
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.pdf: devref-java-interface.latex-dir
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-java-interface.doxyconf-html \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_JAVA_INTERFACE_STUFF) $(USER_HTML_DIR)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_JAVA_INTERFACE_TRUE@	(cd $@; $(INSTALLDOX) -l $(USER_HTML_DIR).tag at ../$(USER_HTML_DIR))
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-java-interface.doxyconf-html \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_JAVA_INTERFACE_STUFF) $(DEVREF_HTML_DIR)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) $<
+ at BUILD_JAVA_INTERFACE_TRUE@	(cd $@; $(INSTALLDOX) -l $(DEVREF_HTML_DIR).tag at ../$(DEVREF_HTML_DIR))
 
 %.tar: %
 	tar cf $@ $<
@@ -760,7 +1264,7 @@ ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
 	pdftops $< $@
 
 mostlyclean-local:
-	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(TEMP_HTML_DIRS) *.aux *.log
+	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(HTML_DIRS) *.aux *.log
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/doc/README.doc b/doc/README.doc
index 7dcd420..4d766a0 100644
--- a/doc/README.doc
+++ b/doc/README.doc
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 See below for the copying conditions.
 
 How To Get (More) PPL Documentation
@@ -108,7 +108,7 @@ of the above formats.
 
 --------
 
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This document describes the Parma Polyhedra Library (PPL).
 
@@ -121,7 +121,7 @@ of each distribution of the PPL in files called `fdl.*'.
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.  The license is included, in various
 formats, in the `doc' subdirectory of each distribution of the PPL in
 files are called `gpl.*'.
diff --git a/doc/definitions.dox b/doc/definitions.dox
index 00dd01e..600167d 100644
--- a/doc/definitions.dox
+++ b/doc/definitions.dox
@@ -1,4 +1,4 @@
-//  Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+//  Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 //
 //  This document describes the Parma Polyhedra Library (PPL).
 //
@@ -9,9 +9,9 @@
 //  Texts.
 //
 //  The PPL 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.
+//  under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 3 of the License, or
+//  (at your option) any later version.
 //
 //  The PPL is distributed in the hope that it will be useful, but WITHOUT
 //  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@@ -86,6 +86,331 @@ that are available to the PPL user.
 In the final section of this chapter (Section \ref use_of_library),
 we provide some additional advice on the use of the library.
 
+\section Kinds_of_Geometric_Descriptors Kinds of Geometric Descriptors
+
+The PPL supports several kinds of <EM>geometric descriptor</EM> (GD
+for short).  The top-level components provided by the PPL are called
+<EM>semantic GDs</EM> and denote a subset of \f$ \Rset^n \f$, while
+the lower-level components, which are called <EM>syntactic GDs</EM>,
+provide a means for describing a semantic GD and its properties in
+terms that are completely independent from the semantic GD's internal
+representation.
+
+
+\subsection Semantic_Geometric_Descriptors Semantic Geometric Descriptors
+
+A <EM>semantic geometric descriptor</EM> is a subset of \f$ \Rset^n \f$.
+The PPL provides several classes of semantic GDs.  These are
+identified by their C++ class name, together with the class template
+parameters, if any. These classes include the <EM>simple classes</EM>:
+  - \link Parma_Polyhedra_Library::C_Polyhedron \c C_Polyhedron \endlink,
+  - \link Parma_Polyhedra_Library::NNC_Polyhedron NNC_Polyhedron \endlink,
+  - \link Parma_Polyhedra_Library::BD_Shape \c BD_Shape\<T\> \endlink,
+  - \link Parma_Polyhedra_Library::Octagonal_Shape \c Octagonal_Shape\<T\> \endlink,
+  - \link Parma_Polyhedra_Library::Box \c Box\<ITV\> \endlink, and
+  - \link Parma_Polyhedra_Library::Grid \c Grid \endlink,
+
+where:
+  - \c T is a numeric type chosen among
+    \c mpz_class, \c mpq_class,
+    <CODE>signed char</CODE>, \c short, \c int, \c long, \c long long
+    (or any of the C99 exact width integer equivalents \c int8_t, int16_t,
+    and so forth); and
+  - \c ITV is an instance of the
+    \link Parma_Polyhedra_Library::Interval \c Interval \endlink
+    template class.
+
+Other semantic GDs, the <EM>compound classes</EM>, can be constructed
+(also recursively) from all the GDs classes.
+These include:
+  - \link Parma_Polyhedra_Library::Pointset_Powerset \c Pointset_Powerset\<PS\> \endlink,
+  - \link Parma_Polyhedra_Library::Partially_Reduced_Product <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> \endlink,
+
+where \c PS, \c D1 and \c D2 can be any semantic GD classes and \c R is the
+reduction operation to be applied to the component domains of the
+product class.
+
+A uniform set of operations is provided for creating, testing and
+maintaining each of the semantic GDs.  However, as many of these
+depend on one or more syntactic GDs, we first describe the syntactic GDs.
+
+
+\subsection Syntactic_Geometric_Descriptors Syntactic Geometric Descriptors
+
+A <EM>syntactic geometric descriptor</EM> is for defining, modifying
+and inspecting a semantic GD.  There are three kinds of
+<EM>syntactic GDs</EM>: <EM>basic GDs</EM>, <EM>constraint GDs</EM> and
+<EM>generator GDs</EM>. Some of these are <EM>generic</EM> and some
+<EM>specific</EM>; a generic syntactic GD is characterized by having a
+fixed meaning independent of its use while a specific syntactic GD
+has a meaning that is dependent on the semantic GD with which it is
+used.
+
+\subsubsection Basic_Geometric_Descriptors Basic Geometric Descriptors
+
+The following basic GDs currently supported by the PPL are:
+  - space dimension;
+  - variable and variable set;
+  - coefficient;
+  - linear expression;
+  - relation symbol;
+  - vector point.
+
+These classes, which are all generic syntactic GDs, are used
+to build the constraint and generator GDs as
+well as support many generic operations on the semantic GDs.
+
+
+\subsubsection Constraint_Geometric_Descriptors Constraint Geometric Descriptors
+
+The PPL currently supports the following classes of constraint GDs:
+  - linear constraint;
+  - linear constraint system;
+  - linear congruence;
+  - linear congruence system.
+
+All these classes are generic syntactic GDs.
+However, a semantic GD may only capture the precise
+meaning of a subset of the constraint GDs and any semantic
+GD operation that cannot capture the semantics of the constraint GD
+precisely will either indicate its unsuitability or apply an upward
+approximation semantics.
+
+
+\subsubsection Generator_Geometric_Descriptors Generator Geometric Descriptors
+
+The PPL currently supports two classes of generator GDs:
+  - polyhedra generator: these are polyhedra points, rays and lines;
+  - grid generator: these are grid points, parameters and lines.
+
+Rays, lines and parameters are specific of the mentioned semantic GDs
+and, therefore, they cannot be used by other semantic GDs.
+In contrast, as already mentioned above, points are basic geometric
+descriptors since they are also used in <EM>generic</EM> PPL operations.
+
+
+\subsection Generic_Operations_on_Semantic_Geometric_Descriptors Generic Operations on Semantic Geometric Descriptors
+
+<OL>
+<LI>
+  Constructors of a universe or empty semantic GD with the given
+  space dimension.
+</LI>
+<LI>
+  Operations on a semantic GD that do not depend on the syntactic GDs.
+  <UL>
+  <LI>
+    <CODE>is_empty()</CODE>, <CODE>is_universe()</CODE>,
+    <CODE>is_topologically_closed()</CODE>, <CODE>is_discrete()</CODE>,
+    <CODE>is_bounded()</CODE>, <CODE>contains_integer_point()</CODE>
+
+    test for the named properties of the semantic GD.
+  </LI>
+  <LI>
+    <CODE>%total_memory_in_bytes()</CODE>,
+    <CODE>%external_memory_in_bytes()</CODE>
+
+    return the total and external memory size in bytes.
+  </LI>
+  <LI>
+    <CODE>OK()</CODE>
+
+    checks that the semantic GD has a valid internal
+    representation. An optional Boolean argument allows a check
+    for emptiness.
+  </LI>
+  <LI>
+    <CODE>space_dimension()</CODE>, <CODE>affine_dimension()</CODE>
+
+    return, respectively, the space and affine dimensions of the GD.
+  </LI>
+  <LI>
+    <CODE>add_space_dimensions_and_embed()</CODE>,
+    <CODE>add_space_dimensions_and_project()</CODE>,
+    <CODE>expand_space_dimension()</CODE>,
+    <CODE>remove_space_dimensions()</CODE>,
+    <CODE>fold_space_dimensions()</CODE>, <CODE>map_space_dimensions()</CODE>
+
+    modify the space dimensions of the semantic GD; where, depending on the
+    operation, the arguments can include the number of space dimensions
+    to be added or removed a variable or set of variables denoting the
+    actual dimensions to be used and a partial function defining a mapping
+    between the dimensions.
+  </LI>
+  <LI>
+    <CODE>contains()</CODE>, <CODE>strictly_contains()</CODE>,
+    <CODE>is_disjoint_from()</CODE>
+
+    compare the semantic GD with an argument semantic GD of the same class.
+  </LI>
+  <LI>
+    <CODE>topological_closure_assign()</CODE>,
+    <CODE>intersection_assign()</CODE>,
+    <CODE>upper_bound_assign()</CODE>, <CODE>difference_assign()</CODE>,
+    <CODE>time_elapse_assign()</CODE>, <CODE>widening_assign()</CODE>,
+    <CODE>concatenate_assign()</CODE>, <CODE>%swap()</CODE>
+
+    modify the semantic GD, possibly with an argument semantic GD of
+    the same class.
+  </LI>
+  <LI>
+    <CODE>constrains()</CODE>, <CODE>bounds_from_above()</CODE>,
+    <CODE>bounds_from_below()</CODE>, <CODE>maximize()</CODE>,
+    <CODE>minimize()</CODE>.
+
+    These find information about the bounds of the semantic GD where
+    the argument variable or linear expression define the direction
+    of the bound.
+  </LI>
+  <LI>
+    <CODE>affine_image()</CODE>, <CODE>affine_preimage()</CODE>,
+    <CODE>generalized_affine_image()</CODE>,
+    <CODE>generalized_affine_preimage()</CODE>,
+    <CODE>bounded_affine_image()</CODE>,
+    <CODE>bounded_affine_preimage()</CODE>.
+
+    These perform several variations of the affine image and preimage
+    operations where, depending on the operation, the arguments can
+    include a variable representing the space dimension to which the
+    transformation will be applied and linear expressions
+    with possibly a relation symbol and denominator value
+    that define the exact form of the transformation.
+  </LI>
+  <LI>
+    <CODE>ascii_load()</CODE>, <CODE>ascii_dump()</CODE>
+
+    are the ascii input and output operations.
+  </UL>
+</LI>
+<LI>
+  Constructors of a semantic GD of one class from a semantic GD of any
+  other class.
+  These constructors obey an <EM>upward approximation semantics</EM>,
+  meaning that the constructed semantic GD is guaranteed to contain
+  all the points of the source semantic GD, but possibly more.
+  Some of <B>SHOULD WE REPLACE SOME OF WITH ALL HERE?</B> these constructors
+  provide a complexity parameter with which the application can control
+  the complexity/precision trade-off for the construction operation.
+  TO BE COMPLETED
+</LI>
+<LI>
+  Constructors of a semantic GD from a constraint GD;
+  either a linear constraint system or a linear congruence system.
+  If the semantic GD cannot capture the precise meaning of the constraint GD
+  then it indicates its unsuitability by throwing an "invalid argument"
+  exception to signal that the operation could not be performed.
+</LI>
+<LI>
+  Other interaction between the semantic GDs and constraint GDs
+  <UL>
+  <LI>
+    <CODE>add_constraint()</CODE>, <CODE>add_constraints()</CODE>,
+    <CODE>add_recycled_constraints()</CODE>,
+    <CODE>add_congruence()</CODE>, <CODE>add_congruences()</CODE>,
+    <CODE>add_recycled_congruences()</CODE>.
+
+    If the argument constraint GD can be completely incorporated into
+    the semantic GD, this is what is done.  Otherwise an "invalid argument"
+    exception is thrown to signal that the operation could not be performed.
+    For example: the <CODE>C_Polyhedron</CODE> class can incorporate any
+    non-strict linear constraint or equality congruence, but cannot
+    incorporate a strict constraint or a proper congruence.
+    A <CODE>BD_Shape\<T\></CODE> class can incorporate bounded-difference
+    non-strict constraints, but not more complex linear constraints.
+    An invariant of these methods is that, if they successfully add a
+    constraint GD, then an enquiry for the same constraint GD with a
+    "relation with" method is guaranteed to yield a "definitely implied"
+    result.
+
+    For <CODE>add_recycled_constraints()</CODE> and
+    <CODE>add_recycled_congruences()</CODE>,
+    the only assumption that can be made after return (successful or
+    exceptional) on the constraint GD is that it can be safely destroyed.
+  </LI>
+  <LI>
+    <CODE>refine_with_constraint()</CODE>,
+    <CODE>refine_with_constraints()</CODE>,
+    <CODE>refine_with_congruence()</CODE>,
+    <CODE>refine_with_congruences()</CODE>
+
+    If the argument constraint GD can be completely incorporated into
+    the semantic GD, this is what is done.  Otherwise the constraint
+    GD is used only to a limited extent to refine the semantic GD;
+    possibly not at all.  Notice that, while repeating an add operation
+    is pointless, this is not true for the refine operations.
+    For example, in those cases where
+\code
+      Semantic_GD.add_constraint(c)
+\endcode
+    raises an exception, a fragment of the form
+\code
+      Semantic_GD.refine_with_constraint(c)
+      // Other add_constraint(s) or refine_with_constraint(s) operations
+      // on Semantic_GD.
+      Semantic_GD.refine_with_constraint(c)
+\endcode
+    may give more precise results than a single
+\code
+      Semantic_GD.refine_with_constraint(c).
+      // Other add_constraint(s) or refine_with_constraint(s) operations
+      // on Semantic_GD.
+\endcode
+  </LI>
+  <LI>
+    <CODE>constraints()</CODE>, <CODE>minimized_constraints()</CODE>,
+    <CODE>congruences()</CODE>, <CODE>minimized_congruences()</CODE>
+
+    returns the indicated system of constraint GDs satisfied by
+    the semantic GD.
+  </LI>
+  <LI>
+    <CODE>can_recycle_constraint_systems()</CODE>,
+    <CODE>can_recycle_congruence_systems()</CODE>
+
+    return true if and only if the semantic GD can recycle the
+    indicated constraint GD.
+  </LI>
+  <LI>
+    <CODE>relation_with()</CODE>
+
+    This takes a constraint GD as an argument and returns the relations holding
+    between the semantic GD and the constraint GD.
+    The possible relations are:
+    <CODE>IS_INCLUDED()</CODE>, <CODE>SATURATES()</CODE>,
+    <CODE>STRICTLY_INTERSECTS()</CODE>, <CODE>IS_DISJOINT()</CODE>
+    and <CODE>NOTHING()</CODE>.
+    This operator also can take a polyhedron generator GD as an argument
+    and returns the relation <CODE>SUBSUMES()</CODE> or <CODE>NOTHING()</CODE>
+    that holds between the generator GD and the semantic GD.
+  </LI>
+  </UL>
+</LI>
+</OL>
+
+
+\section Upward_Approximation Upward Approximation
+
+The Parma Polyhedra Library, for those cases where an exact result
+cannot be computed within the specified complexity limits, computes an
+<EM>upward approximation</EM> of the exact result.  For semantic GDs this
+means that the computed result is a possibly strict superset of the set of
+points of \f$ \Rset^n \f$ that constitutes the exact result.  Notice
+that the PPL does not provide direct support to compute <EM>downward
+approximations</EM> (i.e., possibly strict subsets of the exact
+results).  While downward approximations can often be computed from
+upward ones, the required algorithms and the conditions upon which
+they are correct are outside the current scope of the PPL.
+Beware, in particular, of the following possible pitfall:
+the library provides methods to compute upward approximations
+of set-theoretic difference, which is antitone in its second
+argument.  Applying a difference method to a second argument
+that is not an exact representation or a downward approximation of
+reality, would yield a result that, of course, is not an upward
+approximation of reality.  It is the responsibility of the
+library user to provide the PPL's method with approximations of reality
+that are consistent with respect to the desired results.
+
+
 \section convex_polys Convex Polyhedra
 
 In this section we introduce convex polyhedra,
@@ -851,7 +1176,7 @@ the affine relation defined by
     \itc
       (\vect{v}, \vect{w}) \in \phi
         \iff
-          (w_0 + w_2 \geq 2 v_0 - v_1) \land (w_1 = v_1).
+          (w_0 - w_2 \geq 2 v_0 - v_1) \land (w_1 = v_1).
 \f]
 The same relation is specified by
 \f$x'_0 + 0 \cdot x'_1 - x'_2 \geq 2 x_0 - x_1\f$,
@@ -1016,6 +1341,29 @@ are unprimed; for instance, the transfer relations
 \f$\mathrm{rhs}' \geq \mathrm{lhs}\f$
 are not equivalent in general.
 
+\subsection Cylindrification Cylindrification Operator
+
+The operator <CODE>unconstrain</CODE> computes
+the <EM>cylindrification</EM> \ref HMT71 "[HMT71]"
+of a polyhedron with respect to one of its variables.
+Formally, the cylindrification \f$\cQ \in \Pset_n\f$
+of an NNC polyhedron \f$\cP \in \Pset_n\f$ with respect to
+variable index \f$i \in \{ 0, \ldots, n-1 \}\f$ is defined as follows:
+\f[
+  \cQ
+    = \bigl\{\,
+        \vect{w} \in \Rset^n
+      \bigm|
+        \exists \vect{v} \in \cP \st
+          \forall j \in \{0, \ldots, n-1\} \itc
+            j \neq i \implies w_j = v_j
+      \,\bigr\}.
+\f]
+Cylindrification is an idempotent operation; in particular, note that
+the computed result has the same space dimension of the original polyhedron.
+A variant of the operator above allows for the cylindrification of
+a polyhedron with respect to a finite set of variables.
+
 \subsection Time_Elapse_Operator Time-Elapse Operator
 
 The <EM>time-elapse</EM> operator has been defined in
@@ -1039,6 +1387,34 @@ the above set is also a closed polyhedron.
 In contrast, when \f$\cQ\f$ is not topologically closed,
 the above set might not be an NNC polyhedron.
 
+\subsection Meet_Preserving_Simplification Meet-Preserving Enlargement and Simplification
+
+Let \f$\cP, \cQ, \cR \in \Pset_n\f$ be NNC polyhedra. Then:
+
+ - \f$\cR\f$ is <EM>meet-preserving</EM> with respect to \f$\cP\f$
+   using context \f$\cQ\f$ if \f$\cR \inters \cQ = \cP \inters \cQ\f$;
+
+ - \f$\cR\f$ is an <EM>enlargement</EM> of \f$\cP\f$ if \f$\cR \Sseq \cP\f$.
+
+ - \f$\cR\f$ is a <EM>simplification</EM> with respect to \f$\cP\f$
+   if \f$r \leq p\f$, where \f$p\f$ and \f$r\f$ are the cardinalities
+   of minimized constraint representations for \f$\cP\f$ and \f$\cR\f$,
+   respectively.
+
+Notice that an enlargement need not be a simplification, and vice versa;
+moreover, the identity function is (trivially)
+a meet-preserving enlargement and simplification.
+
+The library provides a binary operator (<em>simplify_using_context</em>)
+for the domain of NNC polyhedra that returns a polyhedron which is a
+meet-preserving enlargement simplification of its first argument
+using the second argument as context.
+
+The concept of meet-preserving enlargement and simplification also
+applies to the other basic domains (boxes, grids, BD and octagonal shapes).
+See below for a definition of the concept of
+\ref Powerset_Meet_Preserving_Simplification "meet-preserving simplification for powerset domains".
+
 \anchor relation_with
 \subsection Relation_With_Operators Relation-With Operators
 
@@ -1188,7 +1564,7 @@ a parameter \f$k\f$ and only apply widenings starting from the
 
 The library also supports an improved widening delay strategy,
 that we call <EM>widening with tokens</EM> \ref BHRZ03a "[BHRZ03a]".
-A token is a sort of wildcard allowing for the replacement of the widening
+A token is a sort of wild card allowing for the replacement of the widening
 application by the exact upper bound computation: the token is used
 (and thus consumed) only when the widening would have resulted in an
 actual precision loss (as opposed to the <EM>potential</EM> precision loss
@@ -1224,7 +1600,16 @@ that their results cannot be worse than the smallest
 \ref bounding_boxes "bounding box" enclosing the two argument polyhedra.
 
 
-\section Bounded_Difference_Shapes Bounded Difference Shapes
+\section Weakly_Relational_Shapes Weakly-Relational Shapes
+
+The PPL provides support for computations on numerical domains that,
+in selected contexts, can achieve a better precision/efficiency ratio
+with respect to the corresponding computations on a ``fully
+relational'' domain of convex polyhedra.  This is achieved by
+restricting the syntactic form of the constraints that can be used to
+describe the domain elements.
+
+\subsection Bounded_Difference_Shapes Bounded Difference Shapes
 
 For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
 and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
@@ -1239,47 +1624,72 @@ A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be a
 either \f$\cP\f$ can be expressed as the intersection of a finite number
 of bounded difference constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
 
-By construction, a BDS is always topologically closed.
-Under the usual set inclusion ordering, the set of all BDSs on the vector
-space \f$\Rset^n\f$ is a lattice having the empty set \f$\emptyset\f$
-and the universe \f$\Rset^n\f$ as the smallest and the biggest elements,
-respectively.
-In theoretical terms, it is a meet sub-lattice of \f$\CPset_n\f$, meaning
-that the intersection of a finite set of BDSs is still a BDS; on the other
-hand, in general the poly-hull of two BDSs is not a BDS. The smallest BDS
-containing a finite set of BDSs is said to be their <EM>bds-hull</EM>.
-
-The PPL provides support for computations on the domain of rational
-bounded difference shapes that, in selected contexts, can achieve a
-better precision/efficiency ratio with respect to the corresponding
-computations on a domain of convex polyhedra.
+\subsection Octagonal_Shapes Octagonal Shapes
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be an <EM>octagonal</EM> if there exist two indices
+\f$i, j \in \{ 0, \ldots, n-1 \}\f$ such that:
+  - \f$a_i, a_j \in \{ -1, 0, 1 \}\f$;
+  - \f$a_k = 0\f$, for all \f$k \notin \{ i, j \}\f$.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be an
+<EM>octagonal shape</EM> (OS, for short) if and only if
+either \f$\cP\f$ can be expressed as the intersection of a finite number
+of octagonal constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+
+Note that, since any bounded difference is also an octagonal constraint,
+any BDS is also an OS. The name ``octagonal'' comes from the fact that,
+in a vector space of dimension 2, a bounded OS can have eight sides
+at most.
+
+\subsection Weakly_Relational_Shape_Interface Weakly-Relational Shapes Interface
+By construction, any BDS or OS is always topologically closed.
+Under the usual set inclusion ordering, the set of all BDSs (resp., OSs)
+on the vector space \f$\Rset^n\f$ is a lattice having the empty set
+\f$\emptyset\f$ and the universe \f$\Rset^n\f$ as the smallest and
+the biggest elements, respectively.
+In theoretical terms, it is a meet sub-lattice of \f$\CPset_n\f$;
+moreover, the lattice of BDSs is a meet sublattice of the lattice of OSs.
+The least upper bound of a finite set of BDSs (resp., OSs) is said to be
+their <EM>bds-hull</EM> (resp., <EM>oct-hull</EM>).
+
 As far as the representation of the rational inhomogeneous term of
-each bounded difference is concerned, several <EM>rounding-aware</EM>
-implementation choices are available, including:
+each bounded difference or octagonal constraint is concerned, several
+<EM>rounding-aware</EM> implementation choices are available, including:
   - bounded precision integer types;
   - bounded precision floating point types;
   - unbounded precision integer and rational types, as provided by GMP.
 
-The user interface for BDSs is meant to be as similar as possible to
-the one developed for the domain of closed polyhedra: in particular,
-all operators on polyhedra are also available for the domain of BDSs,
-even though they are typically characterized by a lower degree of precision.
-
-\subsection Widening_and_Extrapolation_Operators_on_BD_Shapes Widening and Extrapolation Operators on BD Shapes
+The user interface for BDSs and OSs is meant to be as similar as
+possible to the one developed for the domain of closed polyhedra: in
+particular, all operators on polyhedra are also available for the
+domains of BDSs and OSs, even though they are typically characterized
+by a lower degree of precision.
+For instance, the <EM>bds-difference</EM> and <EM>oct-difference</EM>
+operators return (the smallest) over-approximations of the set-theoretical
+difference operator on the corresponding domains.
+In the case of (generalized) images and preimages of affine relations,
+suitable (possibly not-optimal) over-approximations are computed when
+the considered relations cannot be precisely modeled by only using
+bounded differences or octagonal constraints.
+
+\subsection Widening_and_Extrapolation_Operators_on_WR_Shapes Widening and Extrapolation Operators on Weakly-Relational Shapes
 
 \anchor BHMZ05_widening
-For the domain of BDSs, the library provides a variant of the widening
-operator for convex polyhedra defined in \ref CH78 "[CH78]".
+For the domains of BDSs and OSs, the library provides a variant of
+the widening operator for convex polyhedra defined in \ref CH78 "[CH78]".
 The implementation follows the specification in \ref BHMZ05 "[BHMZ05]",
-resulting in an operator which is well-defined on the domain of BDSs
-(i.e., it does not depend on the internal representation of BDSs),
+resulting in an operator which is well-defined on the corresponding domain
+(i.e., it does not depend on the internal representation of BDSs or OSs),
 while still ensuring convergence in a finite number of steps.
 
 \anchor CC76_extrapolation
 The library also implements an extension of the widening operator for
 intervals as defined in \ref CC76 "[CC76]". The reader is warned that
-such an extension, even though being well-defined on the domain of BDSs,
-is not provided with a convergence guarantee and is therefore an
+such an extension, even though being well-defined on the domain of BDSs
+and OSs, is not provided with a convergence guarantee and is therefore an
 extrapolation operator.
 
 
@@ -1411,6 +1821,31 @@ application of the equivalent operation on each of the NNC polyhedra
 that are in the given set. Here we just describe those operations that
 are particular to the polyhedra powerset domain.
 
+\subsection Powerset_Meet_Preserving_Simplification Meet-Preserving Simplification
+
+Let \f$\cS_1 = \{ d_1, \ldots, d_m \}\f$,
+\f$\cS_2 = \{ c_1, \ldots, c_n \}\f$ and
+\f$\cS = \{ s_1, \ldots, s_q \}\f$
+be Omega-reduced elements of a powerset domain.
+Then, powerset \f$\cS\f$ is a <EM>meet-preserving simplification</EM>
+for powerset \f$\cS_1\f$ using the powerset context \f$\cS_2\f$
+if the following conditions hold:
+  - \f$\cS \sqcap \cS_2 = \cS_1 \sqcap \cS_2\f$ (meet-preservation);
+  - \f$q \leq m\f$ (powerset simplification);
+  - for each \f$s_k \in \cS\f$,
+    there exist \f$d_i \in \cS_1\f$ such that
+    for each \f$c_j \in \cS_2\f$,
+    \f$s_k\f$ is a meet-preserving enlargement and simplification
+    of \f$d_i\f$ using context \f$c_j\f$ (disjuncts' simplification).
+
+[EZ: should we drop the meet-preserving and enlargement requirements in
+the disjunct's simplification property?]
+
+Notice that, due to the powerset simplification property, in general
+a meet-preserving powerset simplification is <em>not</em> an enlargement
+with respect to the ordering defined on the powerset lattice.
+
+
 \anchor pps_geometric
 \subsection Geometric_Comparisons Geometric Comparisons
 
@@ -1499,7 +1934,7 @@ In this section we introduce rational grids
 as provided by the library.
 See also \ref BDHMZ05 "[BDHMZ05]" for a detailed description of this domain.
 
-The libary supports two representations for the grids domain;
+The library supports two representations for the grids domain;
 <EM>congruence systems</EM> and <EM>grid generator systems</EM>.
 We first describe <EM>linear congruence relations</EM> which form the elements
 of a congruence system.
@@ -1597,13 +2032,14 @@ combinations of the vectors in \f$S\f$.
 
 Let \f$\cL\f$ be a grid.
 Then
-- a vector \f$\vect{p} \in \cL\f$ is called a <EM>point</EM> of \f$\cL\f$;
+- a vector \f$\vect{p} \in \cL\f$ is called a <EM>grid point</EM> of \f$\cL\f$;
 - a vector \f$\vect{q} \in \Rset^n\f$, where \f$\vect{q} \neq \vect{0}\f$,
   is called a <EM>parameter</EM> of \f$\cL\f$
   if \f$\cL \neq \emptyset\f$ and \f$\vect{p} + \mu \vect{q} \in \cL\f$,
   for all points \f$\vect{p} \in \cL\f$ and all \f$\mu \in \Zset\f$;
-- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>line</EM> of \f$\cL\f$
-  if \f$\cL \neq \emptyset\f$ and \f$\vect{p} + \lambda \vect{l} \in \cL\f$,
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>grid line</EM> of
+  \f$\cL\f$ if \f$\cL \neq \emptyset\f$ and
+  \f$\vect{p} + \lambda \vect{l} \in \cL\f$,
   for all points \f$\vect{p} \in \cL\f$ and all \f$\lambda \in \Rset\f$.
 
 
@@ -1624,11 +2060,11 @@ then \f$\cL \in \Gset_n\f$ is a rational grid
 (see Section 4.4 in \ref Sch99 "[Sch99]" and
 also Proposition 8 in \ref BDHMZ05 "[BDHMZ05]").
 The 3-tuple \f$(L, Q, P)\f$
-is said to be a <EM>generator system</EM> for \f$\cL\f$
+is said to be a <EM>grid generator system</EM> for \f$\cL\f$
 and we write \f$\cL = \ggen(L, Q, P)\f$.
 
 Note that the grid \f$\cL = \ggen(L, Q, P) = \emptyset\f$
-if and only if the set of points \f$P = \emptyset\f$.
+if and only if the set of grid points \f$P = \emptyset\f$.
 If \f$P \neq \emptyset\f$, then
 \f$\cL = \ggen(L, \emptyset, Q_{\vect{p}} \union P)\f$
 where, for some \f$\vect{p} \in P\f$,
@@ -1642,20 +2078,20 @@ then \f$\card \cC \leq \card \cC'\f$.
 Note that a minimized congruence system for a non-empty grid
 has at most \f$n\f$ congruence relations.
 
-Similarly, a <EM>minimized</EM> generator system
+Similarly, a <EM>minimized</EM> grid generator system
 \f$\cG = (L, Q, P)\f$ for \f$\cL\f$
 is such that, if \f$\cG' = (L', Q', P')\f$ is
-another generator system for \f$\cL\f$,
+another grid generator system for \f$\cL\f$,
 then \f$\card L \leq \card L'\f$ and
 \f$\card Q + \card P \leq \card Q' + \card P'\f$.
-Note that a minimized generator system for a grid
-has no more than a total of \f$n+1\f$ lines, parameters and points.
+Note that a minimized grid generator system for a grid
+has no more than a total of \f$n+1\f$ grid lines, parameters and points.
 
 \subsection Grids_Double_Description_Grids Double Description for Grids
 
 As for convex polyhedra, any grid \f$\cL\f$ can be described by using
 a congruence system \f$\cC\f$ for \f$\cL\f$,
-a generator system \f$\cG\f$ for \f$\cL\f$, or
+a grid generator system \f$\cG\f$ for \f$\cL\f$, or
 both by means of the <EM>double description pair (DD pair)</EM>
 \f$(\cC, \cG)\f$.
 The <EM>double description method</EM> for grids is a collection of
@@ -1673,7 +2109,7 @@ intersection and grid join.
 The <EM>space dimension</EM> of a grid \f$\cL \in \Gset_n\f$
 is the dimension
 \f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
-The space dimension of congruence relations, generators and other objects
+The space dimension of congruence relations, grid generators and other objects
 of the library is defined similarly.
 
 \subsection Grid_Affine_Dimension Affine Independence and Affine Dimension for Grids
@@ -1903,7 +2339,7 @@ of a grid \f$\cL\f$ under
 For instance,
 suppose the grid \f$\cL\f$
 to be transformed is the non-relational grid in \f$\Rset^2\f$
-generated by the set of points
+generated by the set of grid points
 \f$\bigl\{
      (0, 0)^\transpose,
      (0, 3)^\transpose,
@@ -1913,13 +2349,13 @@ Then, if the considered variable is \f$x_0\f$ and
 the linear expression is \f$3x_0 + 2 x_1 + 1\f$
 (so that \f$k = 0\f$, \f$a_0 = 3, a_1 = 2, b = 1\f$),
 the affine image operator will translate \f$\cL\f$
-to the grid \f$\cL_1\f$ generated by the set of points
+to the grid \f$\cL_1\f$ generated by the set of grid points
 \f$\bigl\{
      (1, 0)^\transpose,
      (7, 3)^\transpose,
      (10, 0)^\transpose
    \bigr\}\f$
-which is the grid generated by the point \f$(1, 0)\f$
+which is the grid generated by the grid point \f$(1, 0)\f$
 and parameters \f$(3, -3), (0, 9)\f$; or, alternatively defined by the
 congruence system \f$\{x \equiv_3 1, x + y \equiv_9 1\}\f$.
 If the considered variable is as before (i.e., \f$k = 0\f$)
@@ -2000,7 +2436,7 @@ is the grid
 
 The library provides operators for checking the relation holding
 between a grid  and
-either a congruence or a generator.
+a congruence, a grid generator, constraint or a (polyhedron) generator.
 
 Suppose \f$\cL\f$ is a grid
 and \f$\cC\f$ an arbitrary congruence system representing \f$\cL\f$.
@@ -2023,11 +2459,39 @@ The possible relations between \f$\cL\f$ and \f$\cg\f$ are as follows.
   gives us a non-empty grid strictly smaller than \f$\cL\f$.
 - \f$\cL\f$ <EM>is included</EM> in \f$\cg\f$ if \f$\cL \sseq \cL_{\cg}\f$;
   that is, adding \f$\cg\f$ to \f$\cC\f$ leaves \f$\cL\f$ unchanged.
+- \f$\cL\f$ <EM>saturates</EM> \f$\cg\f$ if \f$\cL\f$ <EM>is included</EM>
+  in \f$\cg\f$ and \f$f = 0\f$, i.e., \f$\cg\f$ is an equality congruence.
 
-A grid \f$\cL\f$ <EM>subsumes</EM> a generator \f$g\f$ if
-adding \f$g\f$ to any generator system representing \f$\cL\f$
+For the relation between \f$\cL\f$ and a constraint, suppose that
+\f$
+  c = \bigl(
+        \langle \vect{a}, \vect{x} \rangle \relsym b
+      \bigr)
+\f$
+is a constraint
+with \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+and \f$\cQ\f$ the set of points that satisfy \f$c\f$.
+The possible relations between \f$\cL\f$ and \f$c\f$ are as follows.
+- \f$\cL\f$ <EM>is disjoint</EM> from \f$c\f$ if
+  \f$\cL \inters \cQ = \emptyset\f$.
+- \f$\cL\f$ <EM>strictly intersects</EM> \f$c\f$ if
+  \f$\cL \inters \cQ \neq \emptyset\f$ and \f$\cL \inters \cQ \subset \cL\f$.
+- \f$\cL\f$ <EM>is included</EM> in \f$c\f$ if \f$\cL \sseq \cQ\f$.
+- \f$\cL\f$ <EM>saturates</EM> \f$c\f$ if \f$\cL\f$ <EM>is included</EM>
+  in \f$c\f$ and \f$\mathord{\relsym}\f$ is \f$=\f$.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a grid generator \f$g\f$
+if adding \f$g\f$ to any grid generator system representing \f$\cL\f$
 does not change \f$\cL\f$.
 
+A grid \f$\cL\f$ <EM>subsumes</EM> a (polyhedron) point or closure point
+\f$g\f$ if adding the corresponding grid point to any grid generator system
+representing \f$\cL\f$ does not change \f$\cL\f$.
+A grid \f$\cL\f$ <EM>subsumes</EM> a (polyhedron) ray or line
+\f$g\f$ if adding the corresponding grid line to any grid generator system
+representing \f$\cL\f$ does not change \f$\cL\f$.
+
+
 \subsection Rectilinear_Grids Rectilinear Grids and Covering Boxes
 
 Consider again the  \ref bounding_boxes "boxes" used for convex polyhedra.
@@ -2068,36 +2532,38 @@ and, also, a covering box for any given grid.
 
 \subsection Grid_Widening Widening Operators
 
-The library provides a <EM>grid widening</EM> operator for the domain of grids.
-This follows the specification provided in \ref BDHMZ05 "[BDHMZ05]".
+The library provides <EM>grid widening</EM> operators for the domain of grids.
+The congruence widening and generator widening
+follow the specifications provided in \ref BDHMZ05 "[BDHMZ05]".
+The third widening uses either
+the congruence or the generator widening, the exact rule governing this choice
+at the time of the call is left to the implementation.
 Note that, as for the widenings provided for convex polyhedra,
-the widening \f$\cL_1 \widen \cL_2\f$ of two
-grids \f$\cL_1, \cL_2 \in \Gset_n\f$ requires as a precondition that
+all the operations provided by the library
+for computing a widening \f$\cL_1 \widen \cL_2\f$ of
+grids \f$\cL_1, \cL_2 \in \Gset_n\f$ require as a precondition that
 \f$\cL_1 \sseq \cL_2\f$.
 
 \note
 As is the case for the other operators on grids, the
 implementation overwrites one of the two grid arguments with the
 result of the widening application.
-It is worth stressing that, if grid \f$\cL_1\f$
-and \f$\cL_2\f$ (where \f$\cL_1 \sseq \cL_2\f$) are identified by program
-variables <CODE>l_1</CODE> and <CODE>l_2</CODE>, respectively, then the
-call <CODE>l_2.grid_widening_assign(l_1)</CODE> will assign the grid
-\f$\cL_1 \widen \cL_2\f$ to variable <CODE>l_2</CODE>.  Namely, it is the
-bigger grid\f$\cL_2\f$ which is overwritten by the result of the
-widening. The smaller grid is not modified.
+It is worth stressing that, in any widening operation that computes the
+widening \f$\cL_1 \widen \cL_2\f$, the resulting grid will be assigned
+to overwrite the store containing the bigger grid \f$\cL_2\f$.
+The smaller grid \f$\cL_1\f$ is not modified.
 The same observation holds for all flavors of widenings and extrapolation
 operators that are implemented in the library and for all the foreign
 language interfaces.
 
 \subsection Grid_Widening_with_Tokens Widening with Tokens
 
-This will be as for \ref Widening_with_Tokens "widening with tokens"
+This is as for \ref Widening_with_Tokens "widening with tokens"
 for convex polyhedra.
 
 \subsection Grid_Extrapolation Extrapolation Operators
 
-Besides the two widening operators, the library also implements several
+Besides the widening operators, the library also implements several
 <EM>extrapolation</EM> operators, which differ from widenings in that
 their use along an upper iteration sequence does not ensure convergence
 in a finite number of steps.
@@ -2114,11 +2580,6 @@ as in the case for convex polyhedra, a convergence guarantee
 can only be obtained by suitably restricting the set of
 congruence relations that can occur in this additional parameter.
 
-The <EM>bounded</EM> extrapolation operators further enhance each one
-of the limited extrapolation operators described above, by ensuring
-that their results cannot be worse than the smallest
-\ref Rectilinear_Grids "rectilinear grid" that contains the two argument grids.
-
 \section use_of_library Using the Library
 
 \subsection A_Note_on_the_Implementation_of_the_Operators A Note on the Implementation of the Operators
@@ -2144,8 +2605,8 @@ have been refined to achieve a better integration: as a consequence,
 the lazy versions of the operators are now almost always more efficient
 than the eager versions.
 
-One of the cases when an eager computation still makes sense is when
-the well-known <EM>fail-first</EM> principle comes into play.
+One of the cases when an eager computation might still make sense
+is when the well-known <EM>fail-first</EM> principle comes into play.
 For instance, if you have to compute the intersection of several
 polyhedra and you strongly suspect that the result will become empty
 after a few of these intersections, then you may obtain a better
@@ -2154,6 +2615,35 @@ since the minimization process also enforces an emptiness check.
 Note anyway that the same effect can be obtained by interleaving
 the calls of the lazy operator with explicit emptiness checks.
 
+\warning
+For the reasons mentioned above, starting from version 0.10 of the
+library, the usage of the eager versions (i.e., the ones having a
+name ending with <CODE>_and_minimize</CODE>) of these operators is
+\em deprecated; this is in preparation of their complete removal,
+which will occur starting from version 0.11.
+
+\subsection On_Pointset_Powerset_and_Partially_Reduced_Product_Domains_A_Warning On Pointset_Powerset and Partially_Reduced_Product Domains: A Warning
+
+  For future versions of the PPL library all practical instantiations
+for the disjuncts for a pointset_powerset and component domains for
+the partially_reduced_product domains will be fully
+supported. However, for version 0.10, these compound domains should
+not themselves occur as one of their argument domains.  Therefore their
+use comes with the following warning.
+
+\warning
+The <CODE>Pointset_Powerset<PS></CODE> and
+<CODE>Partially_Reduced_Product<D1, D2, R></CODE>
+should only be used with the following instantiations
+for the disjunct domain template \p PS and component domain
+templates \p D1 and \p D2:
+<CODE>C_Polyhedron</CODE>,
+<CODE>NNC_Polyhedron</CODE>,
+<CODE>Grid</CODE>,
+<CODE>Octagonal_Shape<T></CODE>,
+<CODE>BD_Shape<T></CODE>,
+<CODE>Box<T></CODE>.
+
 \subsection On_Object_Orientation_and_Polymorphism_A_Disclaimer On Object-Orientation and Polymorphism: A Disclaimer
 
 The PPL library is mainly a collection of so-called ``concrete data
@@ -2260,7 +2750,7 @@ R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Z
 \anchor BHMZ05
 R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
   Widening Operators for Weakly-Relational Numeric Abstractions.
-  In C. Hankin and I. Silveroni, editors, <i>Static Analysis:
+  In C. Hankin and I. Siveroni, editors, <i>Static Analysis:
   Proceedings of the 12th International Symposium</i>, volume 3672 of
   <i>Lecture Notes in Computer Science</i>, pages 3-18, London, UK, 2005.
   Springer-Verlag, Berlin.
@@ -2286,7 +2776,7 @@ R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
 \anchor BHRZ03b
 R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
   Precise widening operators for convex polyhedra.
-  Quaderno 312, Dipartimento di Matematica, Universit� di Parma,
+  Quaderno 312, Dipartimento di Matematica, Università di Parma,
   Italy, 2003.
   Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
 
@@ -2299,7 +2789,7 @@ R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
 R. Bagnara, P. M. Hill, and E. Zaffanella.
   A new encoding and implementation of not necessarily closed convex
   polyhedra.
-  Quaderno 305, Dipartimento di Matematica, Universit� di Parma,
+  Quaderno 305, Dipartimento di Matematica, Università di Parma,
   Italy, 2002.
   Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
 
@@ -2315,8 +2805,8 @@ R. Bagnara, P. M. Hill, and E. Zaffanella.
   the 1st CoLogNet Workshop on Component-based Software Development and
   Implementation Technology for Computational Logic Systems</i>, pages 147-153,
   Madrid, Spain, 2002.
-  Published as TR Number CLIP4/02.0, Universidad Polit�cnica de
-  Madrid, Facultad de Inform�tica.
+  Published as TR Number CLIP4/02.0, Universidad Politécnica de
+  Madrid, Facultad de Informática.
 
 </DD>
 
@@ -2353,7 +2843,7 @@ R. Bagnara, P. M. Hill, and E. Zaffanella.
 \anchor BHZ04
 R. Bagnara, P. M. Hill, and E. Zaffanella.
   Widening operators for powerset domains.
-  Quaderno 349, Dipartimento di Matematica, Universit� di Parma,
+  Quaderno 349, Dipartimento di Matematica, Università di Parma,
   Italy, 2004.
   Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
 
@@ -2365,7 +2855,7 @@ R. Bagnara, P. M. Hill, and E. Zaffanella.
 \anchor BJT99
 F. Besson, T. P. Jensen, and J.-P. Talpin.
   Polyhedral analysis for synchronous languages.
-  In A. Cortesi and G. Fil�, editors, <i>Static Analysis:
+  In A. Cortesi and G. Filé, editors, <i>Static Analysis:
   Proceedings of the 6th International Symposium</i>, volume 1694 of <i>Lecture
   Notes in Computer Science</i>, pages 51-68, Venice, Italy, 1999.
   Springer-Verlag, Berlin.
@@ -2393,7 +2883,7 @@ R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
 R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
   Possibly not closed convex polyhedra and the Parma Polyhedra
   Library.
-  Quaderno 286, Dipartimento di Matematica, Universit� di Parma,
+  Quaderno 286, Dipartimento di Matematica, Università di Parma,
   Italy, 2002.
   See also \ref BRZH02c "[BRZH02c]". Available at
   <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
@@ -2423,6 +2913,16 @@ P. Cousot and R. Cousot.
 
 </DD>
 
+<DT> [CC79] </DT>
+<DD>
+\anchor CC79
+P. Cousot and R. Cousot.
+ Systematic design of program analysis frameworks.
+ In <em>Proceedings of the Sixth Annual ACM Symposium on Principles
+  of Programming Languages</em>, pages 269-282, New York, 1979. ACM Press.
+
+</DD>
+
 
 <DT> [CC92] </DT>
 <DD>
@@ -2541,7 +3041,7 @@ D. Gopan, F. DiMaio, N. Dor, T. Reps, and M. Sagiv.
 E. Gawrilow and M. Joswig.
   <tt>polymake</tt>: a framework for analyzing convex polytopes.
   In G. Kalai and G. M. Ziegler, editors, <i>Polytopes -
-  Combinatorics and Computation</i>, pages 43-74. Birkh�user, 2000.
+  Combinatorics and Computation</i>, pages 43-74. Birkhäuser, 2000.
 
 </DD>
 
@@ -2562,10 +3062,10 @@ E. Gawrilow and M. Joswig.
 <DD>
 \anchor Hal79
 N. Halbwachs.
-  <i>D�termination Automatique de Relations Lin�aires
-  V�rifi�es par les Variables d'un Programme</i>.
-  Th�se de 3�me cycle d'informatique,
-  Universit� scientifique et m�dicale de Grenoble, Grenoble, France, March
+  <i>Détermination Automatique de Relations Linéaires
+  Vérifiées par les Variables d'un Programme</i>.
+  Thèse de 3ème cycle d'informatique,
+  Université scientifique et médicale de Grenoble, Grenoble, France, March
   1979.
 
 </DD>
@@ -2618,6 +3118,16 @@ V. Van Dongen H. Le Verge and D. K. Wilde.
 </DD>
 
 
+<DT> [HMT71] </DT>
+<DD>
+\anchor HMT71
+L. Henkin, J. D. Monk, and A. Tarski.
+ <em>Cylindric Algebras: Part I</em>.
+ North-Holland, Amsterdam, 1971.
+
+</DD>
+
+
 <DT> [HPR94] </DT>
 <DD>
 \anchor HPR94
@@ -2725,7 +3235,7 @@ F. Masdupuy.
 F. Masdupuy.
   <i>Array Indices Relational Semantic Analysis Using Rational Cosets
   and Trapezoids</i>.
-  Th�se d'informatique, �cole Polytechnique, Palaiseau, France,
+  Thèse d'informatique, École Polytechnique, Palaiseau, France,
   December 1993.
 
 </DD>
@@ -3031,7 +3541,7 @@ only in that, for a vertex,
 the (\f$n+1\f$)'st term is different from zero and,
 for a ray, it is zero.
 
-\subsection Double_Description Double Description
+\subsection Devref_Double_Description Double Description
 
 Let \f$\cP \in \Rset^n \f$ be a polyhedron and  \f$C \in \Rset^{n+1} \f$
 the corresponding polyhedral cone.
@@ -3206,10 +3716,9 @@ is equal to the set of constraints that are saturated by \f$\vect{y}_2\f$.
 
 \subsection Saturation_Matrix Saturation Matrix
 
-A <EM>saturation matrix</EM> is a
-Boolean matrix that represent the connection between constraints and
-generators of a polyhedron.
-There are two kinds of saturation matrix one having rows indexed
+A <EM>saturation matrix</EM> is a bit matrix that represents
+the connection between constraints and generators of a polyhedron.
+There are two kinds of saturation matrices, one having rows indexed
 by constraints and columns indexed by generators (<EM>sat_g</EM>),
 and one (that is the transposed version of the previous one) having
 rows indexed by generators and columns indexed by constraints (<EM>sat_c</EM>).
diff --git a/doc/devref-c-interface.doxyconf-html b/doc/devref-c-interface.doxyconf-html
new file mode 100644
index 0000000..7be9bab
--- /dev/null
+++ b/doc/devref-c-interface.doxyconf-html
@@ -0,0 +1,248 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         /home/roberto/ppl/ppl/doc/../interfaces/C/C_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref-c-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-devref-0.10pre27-html.tag=../ppl-devref-0.10pre27-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-c-interface.doxyconf-html.in b/doc/devref-c-interface.doxyconf-html.in
new file mode 100644
index 0000000..1014a09
--- /dev/null
+++ b/doc/devref-c-interface.doxyconf-html.in
@@ -0,0 +1,248 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/C/C_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref-c-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-c-interface.doxyconf-latex b/doc/devref-c-interface.doxyconf-latex
new file mode 100644
index 0000000..b57d2ca
--- /dev/null
+++ b/doc/devref-c-interface.doxyconf-latex
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         /home/roberto/ppl/ppl/doc/../interfaces/C/C_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-c-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-c-interface.doxyconf-latex.in b/doc/devref-c-interface.doxyconf-latex.in
new file mode 100644
index 0000000..856fc42
--- /dev/null
+++ b/doc/devref-c-interface.doxyconf-latex.in
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/C/C_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-c-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-c-interface.tex b/doc/devref-c-interface.tex
new file mode 100644
index 0000000..5f53286
--- /dev/null
+++ b/doc/devref-c-interface.tex
@@ -0,0 +1,130 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library C Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library C Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+C Language Interface \\
+Developer's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/devref-java-interface.doxyconf-html.in b/doc/devref-java-interface.doxyconf-html.in
new file mode 100644
index 0000000..c880f12
--- /dev/null
+++ b/doc/devref-java-interface.doxyconf-html.in
@@ -0,0 +1,285 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Java Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../interfaces/Java/Java_interface.dox \
+                         @srcdir@/../interfaces/Java/ppl_java/By_Reference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Degenerate_Element.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Length_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Optimization_Mode.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Partial_Function.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/PPL_Object.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Relation_Symbol.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variables_Set.java \
+                         ../interfaces/Java/ppl_java \
+                         ../interfaces/Java/jni/ppl_java_classes.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.java \
+                         *.h
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref-java-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref-java-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-java-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-java-interface.doxyconf-latex b/doc/devref-java-interface.doxyconf-latex
new file mode 100644
index 0000000..2018db4
--- /dev/null
+++ b/doc/devref-java-interface.doxyconf-latex
@@ -0,0 +1,284 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Java Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = /home/roberto/ppl/ppl/doc/../interfaces/Java/Java_interface.dox \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/By_Reference.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Coefficient.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Congruence.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Congruence_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Constraint.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Constraint_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Degenerate_Element.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Generator.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Generator_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Generator_Type.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Grid_Generator.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Grid_Generator_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Length_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/MIP_Problem.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Optimization_Mode.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Partial_Function.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/PPL_Object.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Relation_Symbol.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Variable.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Variables_Set.java \
+                         ../interfaces/Java/ppl_java \
+                         ../interfaces/Java/jni/ppl_java_classes.cc \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.java \
+                         *.h
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-java-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-java-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref-java-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-java-interface.doxyconf-latex.in b/doc/devref-java-interface.doxyconf-latex.in
new file mode 100644
index 0000000..dcb2a48
--- /dev/null
+++ b/doc/devref-java-interface.doxyconf-latex.in
@@ -0,0 +1,284 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Java Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../interfaces/Java/Java_interface.dox \
+                         @srcdir@/../interfaces/Java/ppl_java/By_Reference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Degenerate_Element.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Length_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Optimization_Mode.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Partial_Function.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/PPL_Object.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Relation_Symbol.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variables_Set.java \
+                         ../interfaces/Java/ppl_java \
+                         ../interfaces/Java/jni/ppl_java_classes.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.java \
+                         *.h
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-java-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-java-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-java-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-java-interface.tex b/doc/devref-java-interface.tex
new file mode 100644
index 0000000..ccc1dd3
--- /dev/null
+++ b/doc/devref-java-interface.tex
@@ -0,0 +1,130 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Java Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Java Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+Java Language Interface \\
+Developer's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/devref-ocaml-interface.doxyconf-html.in b/doc/devref-ocaml-interface.doxyconf-html.in
new file mode 100644
index 0000000..8b53e9c
--- /dev/null
+++ b/doc/devref-ocaml-interface.doxyconf-html.in
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL OCaml Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/OCaml/ppl_ocaml.cc \
+                         @srcdir@/../interfaces/OCaml/OCaml_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref-ocaml-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref-ocaml-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-ocaml-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-ocaml-interface.doxyconf-latex b/doc/devref-ocaml-interface.doxyconf-latex
new file mode 100644
index 0000000..90adaf8
--- /dev/null
+++ b/doc/devref-ocaml-interface.doxyconf-latex
@@ -0,0 +1,246 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL OCaml Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/OCaml/ppl_ocaml.cc \
+                         /home/roberto/ppl/ppl/doc/../interfaces/OCaml/OCaml_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-ocaml-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-ocaml-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref-ocaml-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-ocaml-interface.doxyconf-latex.in b/doc/devref-ocaml-interface.doxyconf-latex.in
new file mode 100644
index 0000000..bd1a944
--- /dev/null
+++ b/doc/devref-ocaml-interface.doxyconf-latex.in
@@ -0,0 +1,246 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL OCaml Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/OCaml/ppl_ocaml.cc \
+                         @srcdir@/../interfaces/OCaml/OCaml_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-ocaml-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-ocaml-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-ocaml-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-ocaml-interface.tex b/doc/devref-ocaml-interface.tex
new file mode 100644
index 0000000..fa51c83
--- /dev/null
+++ b/doc/devref-ocaml-interface.tex
@@ -0,0 +1,146 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ocamldoc}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+% This is a kludge to avoid the standard 2-columns index:
+% OCaml identifiers are too long for that.
+\makeatletter
+\renewenvironment{theindex}
+  {\section*{\indexname}
+   \markboth{\MakeUppercase\indexname}%
+            {\MakeUppercase\indexname}%
+   \thispagestyle{plain}
+   \setlength{\parindent}{0pt}
+   \setlength{\parskip}{0pt plus 0.3pt}
+   \relax
+   \let\item\@idxitem}%
+  {}
+\makeatother
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library OCaml Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library OCaml Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+OCaml Language Interface \\
+Developer's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/devref-prolog-interface.doxyconf-html b/doc/devref-prolog-interface.doxyconf-html
new file mode 100644
index 0000000..1fced5b
--- /dev/null
+++ b/doc/devref-prolog-interface.doxyconf-html
@@ -0,0 +1,251 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/Prolog/Prolog_interface.dox \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Prolog/ppl_prolog_common.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Prolog/ppl_prolog_common.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Prolog/ppl_prolog_common.cc \
+                         ../interfaces/Prolog/ppl_prolog_domains.hh \
+                         ../interfaces/Prolog/ppl_prolog_domains.cc \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref-prolog-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref-prolog-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-devref-0.10pre27-html.tag=../ppl-devref-0.10pre27-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-prolog-interface.doxyconf-html.in b/doc/devref-prolog-interface.doxyconf-html.in
new file mode 100644
index 0000000..5b84b94
--- /dev/null
+++ b/doc/devref-prolog-interface.doxyconf-html.in
@@ -0,0 +1,251 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @top_builddir@/interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog_common.defs.hh \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog_common.inlines.hh \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog_common.cc \
+                         ../interfaces/Prolog/ppl_prolog_domains.hh \
+                         ../interfaces/Prolog/ppl_prolog_domains.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref-prolog-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-prolog-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-prolog-interface.doxyconf-latex b/doc/devref-prolog-interface.doxyconf-latex
new file mode 100644
index 0000000..c35013b
--- /dev/null
+++ b/doc/devref-prolog-interface.doxyconf-latex
@@ -0,0 +1,250 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/Prolog/Prolog_interface.dox \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Prolog/ppl_prolog_common.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Prolog/ppl_prolog_common.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Prolog/ppl_prolog_common.cc \
+                         ../interfaces/Prolog/ppl_prolog_domains.hh \
+                         ../interfaces/Prolog/ppl_prolog_domains.cc \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-prolog-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref-prolog-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-prolog-interface.doxyconf-latex.in b/doc/devref-prolog-interface.doxyconf-latex.in
new file mode 100644
index 0000000..2df5815
--- /dev/null
+++ b/doc/devref-prolog-interface.doxyconf-latex.in
@@ -0,0 +1,250 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @top_builddir@/interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog_common.defs.hh \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog_common.inlines.hh \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog_common.cc \
+                         ../interfaces/Prolog/ppl_prolog_domains.hh \
+                         ../interfaces/Prolog/ppl_prolog_domains.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref-prolog-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref-prolog-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = CATCH_ALL
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/devref-prolog-interface.tex b/doc/devref-prolog-interface.tex
new file mode 100644
index 0000000..a0460b0
--- /dev/null
+++ b/doc/devref-prolog-interface.tex
@@ -0,0 +1,130 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Prolog Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Prolog Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+Prolog Language Interface \\
+Developer's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/devref.doxyconf-html b/doc/devref.doxyconf-html
index 4a11633..33bcf8f 100644
--- a/doc/devref.doxyconf-html
+++ b/doc/devref.doxyconf-html
@@ -1,1446 +1,467 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER         = 0.9
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
+PROJECT_NUMBER         = 0.10pre27
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output.
-# The encoding is not always determined by the language that is chosen,
-# but also whether or not the output is meant for Windows or non-Windows users.
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
-# forces the Windows encoding (this is the default for the Windows binary),
-# whereas setting the tag to NO uses a Unix-style encoding (the default for
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
+ABBREVIATE_BRIEF       = 
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
 INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
+ALIASES                = 
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
-# include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
 EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
 SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = Include_Implementation_Details
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from the
-# version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    =
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE           =
-
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT                  = ./definitions.dox \
-                         ./../src/namespaces.hh \
+INPUT                  = /home/roberto/ppl/ppl/doc/definitions.dox \
+                         /home/roberto/ppl/ppl/doc/../src/namespaces.hh \
                          ../src/version.hh \
-                         ./../src/version.cc \
-                         ./../src/Float.defs.hh \
-                         ./../src/Float.inlines.hh \
-                         ./../src/Float.cc \
-                         ./../src/Checked_Number.types.hh \
-                         ./../src/Checked_Number.defs.hh \
-                         ./../src/Checked_Number.inlines.hh \
-                         ./../src/Checked_Number.cc \
-                         ./../src/GMP_Integer.types.hh \
-                         ./../src/GMP_Integer.defs.hh \
-                         ./../src/GMP_Integer.inlines.hh \
-                         ./../src/Coefficient_traits_template.hh \
-                         ./../src/Coefficient.types.hh \
-                         ./../src/Coefficient.defs.hh \
-                         ./../src/Coefficient.inlines.hh \
-                         ./../src/Coefficient.cc \
-                         ./../src/Limits.hh \
-                         ./../src/checked.defs.hh \
-                         ./../src/checked.inlines.hh \
-                         ./../src/checked_float.inlines.hh \
-                         ./../src/checked_int.inlines.hh \
-                         ./../src/checked_mpq.inlines.hh \
-                         ./../src/checked_mpz.inlines.hh \
-                         ./../src/checked.cc \
-                         ./../src/Init.types.hh \
-                         ./../src/Init.defs.hh \
-                         ./../src/Init.cc \
-                         ./../src/initializer.hh \
-                         ./../src/globals.types.hh \
-                         ./../src/globals.defs.hh \
-                         ./../src/globals.inlines.hh \
-                         ./../src/globals.cc \
-                         ./../src/Topology.hh \
-                         ./../src/Row.types.hh \
-                         ./../src/Row.defs.hh \
-                         ./../src/Row.inlines.hh \
-                         ./../src/Row.cc \
-                         ./../src/Matrix.types.hh \
-                         ./../src/Matrix.defs.hh \
-                         ./../src/Matrix.inlines.hh \
-                         ./../src/Matrix.cc \
-                         ./../src/Linear_Row.types.hh \
-                         ./../src/Linear_Row.defs.hh \
-                         ./../src/Linear_Row.inlines.hh \
-                         ./../src/Linear_Row.cc \
-                         ./../src/Linear_System.types.hh \
-                         ./../src/Linear_System.defs.hh \
-                         ./../src/Linear_System.inlines.hh \
-                         ./../src/Linear_System.cc \
-                         ./../src/Saturation_Row.types.hh \
-                         ./../src/Saturation_Row.defs.hh \
-                         ./../src/Saturation_Row.inlines.hh \
-                         ./../src/Saturation_Row.cc \
-                         ./../src/Saturation_Matrix.types.hh \
-                         ./../src/Saturation_Matrix.defs.hh \
-                         ./../src/Saturation_Matrix.inlines.hh \
-                         ./../src/Saturation_Matrix.cc \
-                         ./../src/Variable.types.hh \
-                         ./../src/Variable.defs.hh \
-                         ./../src/Variable.inlines.hh \
-                         ./../src/Variable.cc \
-                         ./../src/Linear_Expression.types.hh \
-                         ./../src/Linear_Expression.defs.hh \
-                         ./../src/Linear_Expression.inlines.hh \
-                         ./../src/Linear_Expression.cc \
-                         ./../src/Constraint.types.hh \
-                         ./../src/Constraint.defs.hh \
-                         ./../src/Constraint.inlines.hh \
-                         ./../src/Constraint.cc \
-                         ./../src/Congruence.types.hh \
-                         ./../src/Congruence.defs.hh \
-                         ./../src/Congruence.inlines.hh \
-                         ./../src/Congruence.cc \
-                         ./../src/Generator.types.hh \
-                         ./../src/Generator.defs.hh \
-                         ./../src/Generator.inlines.hh \
-                         ./../src/Generator.cc \
-                         ./../src/Grid_Generator.types.hh \
-                         ./../src/Grid_Generator.defs.hh \
-                         ./../src/Grid_Generator.inlines.hh \
-                         ./../src/Grid_Generator.cc \
-                         ./../src/Constraint_System.types.hh \
-                         ./../src/Constraint_System.defs.hh \
-                         ./../src/Constraint_System.inlines.hh \
-                         ./../src/Constraint_System.cc \
-                         ./../src/Congruence_System.types.hh \
-                         ./../src/Congruence_System.defs.hh \
-                         ./../src/Congruence_System.inlines.hh \
-                         ./../src/Congruence_System.cc \
-                         ./../src/Generator_System.defs.hh \
-                         ./../src/Generator_System.types.hh \
-                         ./../src/Generator_System.inlines.hh \
-                         ./../src/Generator_System.cc \
-                         ./../src/Grid_Generator_System.defs.hh \
-                         ./../src/Grid_Generator_System.types.hh \
-                         ./../src/Grid_Generator_System.inlines.hh \
-                         ./../src/Grid_Generator_System.cc \
-                         ./../src/Scalar_Products.types.hh \
-                         ./../src/Scalar_Products.defs.hh \
-                         ./../src/Scalar_Products.inlines.hh \
-                         ./../src/Scalar_Products.cc \
-                         ./../src/Ph_Status.idefs.hh \
-                         ./../src/Ph_Status.inlines.hh \
-                         ./../src/Ph_Status.cc \
-                         ./../src/Polyhedron.types.hh \
-                         ./../src/Polyhedron.defs.hh \
-                         ./../src/Polyhedron.inlines.hh \
-                         ./../src/Polyhedron.templates.hh \
-                         ./../src/Polyhedron_public.cc \
-                         ./../src/Polyhedron_nonpublic.cc \
-                         ./../src/Polyhedron_widenings.cc \
-                         ./../src/Polyhedron_chdims.cc \
-                         ./../src/conversion.cc \
-                         ./../src/minimize.cc \
-                         ./../src/simplify.cc \
-                         ./../src/Grid.types.hh \
-                         ./../src/Grid.defs.hh \
-                         ./../src/Grid.inlines.hh \
-                         ./../src/Grid.templates.hh \
-                         ./../src/Grid_public.cc \
-                         ./../src/Grid_nonpublic.cc \
-                         ./../src/Grid_conversion.cc \
-                         ./../src/Grid_simplify.cc \
-                         ./../src/Grid_widenings.cc \
-                         ./../src/Grid_chdims.cc \
-                         ./../src/Poly_Con_Relation.types.hh \
-                         ./../src/Poly_Con_Relation.defs.hh \
-                         ./../src/Poly_Con_Relation.inlines.hh \
-                         ./../src/Poly_Con_Relation.cc \
-                         ./../src/Poly_Gen_Relation.types.hh \
-                         ./../src/Poly_Gen_Relation.defs.hh \
-                         ./../src/Poly_Gen_Relation.inlines.hh \
-                         ./../src/Poly_Gen_Relation.cc \
-                         ./../src/Interval.types.hh \
-                         ./../src/Interval.defs.hh \
-                         ./../src/Interval.inlines.hh \
-                         ./../src/Interval.cc \
-                         ./../src/Bounding_Box.types.hh \
-                         ./../src/Bounding_Box.defs.hh \
-                         ./../src/Bounding_Box.inlines.hh \
-                         ./../src/Bounding_Box.cc \
-                         ./../src/C_Polyhedron.types.hh \
-                         ./../src/C_Polyhedron.defs.hh \
-                         ./../src/C_Polyhedron.inlines.hh \
-                         ./../src/C_Polyhedron.cc \
-                         ./../src/NNC_Polyhedron.types.hh \
-                         ./../src/NNC_Polyhedron.defs.hh \
-                         ./../src/NNC_Polyhedron.inlines.hh \
-                         ./../src/NNC_Polyhedron.cc \
-                         ./../src/Widening_Function.types.hh \
-                         ./../src/Widening_Function.defs.hh \
-                         ./../src/Widening_Function.inlines.hh \
-                         ./../src/BHRZ03_Certificate.types.hh \
-                         ./../src/BHRZ03_Certificate.defs.hh \
-                         ./../src/BHRZ03_Certificate.inlines.hh \
-                         ./../src/BHRZ03_Certificate.cc \
-                         ./../src/H79_Certificate.types.hh \
-                         ./../src/H79_Certificate.defs.hh \
-                         ./../src/H79_Certificate.inlines.hh \
-                         ./../src/H79_Certificate.cc \
-                         ./../src/Grid_Certificate.types.hh \
-                         ./../src/Grid_Certificate.defs.hh \
-                         ./../src/Grid_Certificate.inlines.hh \
-                         ./../src/Grid_Certificate.cc \
-                         ./../src/Determinate.defs.hh \
-                         ./../src/Determinate.inlines.hh \
-                         ./../src/Powerset.defs.hh \
-                         ./../src/Powerset.inlines.hh \
-                         ./../src/Powerset.templates.hh \
-                         ./../src/Polyhedra_Powerset.types.hh \
-                         ./../src/Polyhedra_Powerset.defs.hh \
-                         ./../src/Polyhedra_Powerset.inlines.hh \
-                         ./../src/Polyhedra_Powerset.templates.hh \
-                         ./../src/Polyhedra_Powerset.cc \
-                         ./../src/algorithms.hh \
-                         ./../src/LP_Problem.types.hh \
-                         ./../src/LP_Problem.defs.hh \
-                         ./../src/LP_Problem.inlines.hh \
-                         ./../src/LP_Problem.cc \
-                         ./../src/DB_Row.types.hh \
-                         ./../src/DB_Row.defs.hh \
-                         ./../src/DB_Row.inlines.hh \
-                         ./../src/DB_Matrix.types.hh \
-                         ./../src/DB_Matrix.defs.hh \
-                         ./../src/DB_Matrix.inlines.hh \
-                         ./../src/BD_Shape.types.hh \
-                         ./../src/BD_Shape.defs.hh \
-                         ./../src/BD_Shape.inlines.hh \
-                         ./../src/BD_Shape.templates.hh \
-                         ./../src/BD_Shape.cc \
-                         ../interfaces/C/ppl_c.h \
-                         ./../interfaces/C/ppl_c.cc \
-                         ./../interfaces/Prolog/Prolog_interface.dox \
-                         ./../interfaces/Prolog/exceptions.hh \
-                         ./../interfaces/Prolog/track_allocation.hh \
-                         ./../interfaces/Prolog/ppl_prolog.icc \
-                         ./../interfaces/Prolog/Ciao/ppl_ciao.cc \
-                         ./../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
-                         ./../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
-                         ./../interfaces/Prolog/SWI/ppl_swiprolog.cc \
-                         ./../interfaces/Prolog/YAP/ppl_yap.cc \
-                         ./gpl.dox \
-                         ./fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+                         /home/roberto/ppl/ppl/doc/../src/version.cc \
+                         /home/roberto/ppl/ppl/doc/../src/meta_programming.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Float.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Float.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Float.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.cc \
+                         /home/roberto/ppl/ppl/doc/../src/GMP_Integer.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/GMP_Integer.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/GMP_Integer.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient_traits_template.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.cc \
+                         /home/roberto/ppl/ppl/doc/../src/checked.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_float.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_int.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_mpq.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_mpz.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Init.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Init.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Init.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Init.cc \
+                         /home/roberto/ppl/ppl/doc/../src/initializer.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.cc \
+                         /home/roberto/ppl/ppl/doc/../src/math_utilities.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/math_utilities.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/distances.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/distances.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/distances.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Topology.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Ph_Status.idefs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Ph_Status.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Ph_Status.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_public.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_nonpublic.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_widenings.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_chdims.cc \
+                         /home/roberto/ppl/ppl/doc/../src/conversion.cc \
+                         /home/roberto/ppl/ppl/doc/../src/minimize.cc \
+                         /home/roberto/ppl/ppl/doc/../src/simplify.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_public.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_nonpublic.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_conversion.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_simplify.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_widenings.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_chdims.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Restriction.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Info.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Info.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Info.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.cc \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Widening_Function.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Widening_Function.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Widening_Function.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.cc \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Determinate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Determinate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/iterator_to_const.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/iterator_to_const.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/iterator_to_const.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/algorithms.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.cc \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.cc \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.cc \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = *.hh \
                          *.cc \
                          *.dox
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
 RECURSIVE              = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
-# from the input.
-
+EXCLUDE                = 
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.  Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.  The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = YES
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = YES
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          =
-
+IGNORE_PREFIX          = 
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
 GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = devref.html-dir
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-devref-0.10pre27-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE               =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
 GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
+LATEX_OUTPUT           = devref.latex-dir
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = ./devref.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref.tex
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    =
-
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
+XML_SCHEMA             = 
+XML_DTD                = 
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.  This is useful
-# if you want to understand what is going on.  On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
+PERLMOD_MAKEVAR_PREFIX = 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
-                         PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = CATCH_ALL \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
-
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-#   TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#   TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
+TAGFILES               = 
+GENERATE_TAGFILE       = ppl-devref-0.10pre27-html.tag
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
-# powerful graphs.
-
 CLASS_DIAGRAMS         = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that a graph may be further truncated if the graph's
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
-# the graph is not depth-constrained.
-
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, which results in a white background.
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
+# Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/devref.doxyconf-html.in b/doc/devref.doxyconf-html.in
index e1a868b..c7802fc 100644
--- a/doc/devref.doxyconf-html.in
+++ b/doc/devref.doxyconf-html.in
@@ -1,468 +1,92 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
 PROJECT_NUMBER         = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output.
-# The encoding is not always determined by the language that is chosen,
-# but also whether or not the output is meant for Windows or non-Windows users.
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
-# forces the Windows encoding (this is the default for the Windows binary),
-# whereas setting the tag to NO uses a Unix-style encoding (the default for
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
+ABBREVIATE_BRIEF       = 
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
 INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
+ALIASES                = 
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
-# include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
 EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
 SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = Include_Implementation_Details
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from the
-# version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    =
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE           =
-
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
 INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/namespaces.hh \
                          ../src/version.hh \
                          @srcdir@/../src/version.cc \
+                         @srcdir@/../src/meta_programming.hh \
                          @srcdir@/../src/Float.defs.hh \
                          @srcdir@/../src/Float.inlines.hh \
                          @srcdir@/../src/Float.cc \
@@ -478,7 +102,6 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Coefficient.defs.hh \
                          @srcdir@/../src/Coefficient.inlines.hh \
                          @srcdir@/../src/Coefficient.cc \
-                         @srcdir@/../src/Limits.hh \
                          @srcdir@/../src/checked.defs.hh \
                          @srcdir@/../src/checked.inlines.hh \
                          @srcdir@/../src/checked_float.inlines.hh \
@@ -488,12 +111,18 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/checked.cc \
                          @srcdir@/../src/Init.types.hh \
                          @srcdir@/../src/Init.defs.hh \
+                         @srcdir@/../src/Init.inlines.hh \
                          @srcdir@/../src/Init.cc \
                          @srcdir@/../src/initializer.hh \
                          @srcdir@/../src/globals.types.hh \
                          @srcdir@/../src/globals.defs.hh \
                          @srcdir@/../src/globals.inlines.hh \
                          @srcdir@/../src/globals.cc \
+                         @srcdir@/../src/math_utilities.defs.hh \
+                         @srcdir@/../src/math_utilities.inlines.hh \
+                         @srcdir@/../src/distances.types.hh \
+                         @srcdir@/../src/distances.defs.hh \
+                         @srcdir@/../src/distances.inlines.hh \
                          @srcdir@/../src/Topology.hh \
                          @srcdir@/../src/Row.types.hh \
                          @srcdir@/../src/Row.defs.hh \
@@ -511,14 +140,18 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Linear_System.defs.hh \
                          @srcdir@/../src/Linear_System.inlines.hh \
                          @srcdir@/../src/Linear_System.cc \
-                         @srcdir@/../src/Saturation_Row.types.hh \
-                         @srcdir@/../src/Saturation_Row.defs.hh \
-                         @srcdir@/../src/Saturation_Row.inlines.hh \
-                         @srcdir@/../src/Saturation_Row.cc \
-                         @srcdir@/../src/Saturation_Matrix.types.hh \
-                         @srcdir@/../src/Saturation_Matrix.defs.hh \
-                         @srcdir@/../src/Saturation_Matrix.inlines.hh \
-                         @srcdir@/../src/Saturation_Matrix.cc \
+                         @srcdir@/../src/MIP_Problem.types.hh \
+                         @srcdir@/../src/MIP_Problem.defs.hh \
+                         @srcdir@/../src/MIP_Problem.inlines.hh \
+                         @srcdir@/../src/MIP_Problem.cc \
+                         @srcdir@/../src/Bit_Row.types.hh \
+                         @srcdir@/../src/Bit_Row.defs.hh \
+                         @srcdir@/../src/Bit_Row.inlines.hh \
+                         @srcdir@/../src/Bit_Row.cc \
+                         @srcdir@/../src/Bit_Matrix.types.hh \
+                         @srcdir@/../src/Bit_Matrix.defs.hh \
+                         @srcdir@/../src/Bit_Matrix.inlines.hh \
+                         @srcdir@/../src/Bit_Matrix.cc \
                          @srcdir@/../src/Variable.types.hh \
                          @srcdir@/../src/Variable.defs.hh \
                          @srcdir@/../src/Variable.inlines.hh \
@@ -595,14 +228,13 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Poly_Gen_Relation.defs.hh \
                          @srcdir@/../src/Poly_Gen_Relation.inlines.hh \
                          @srcdir@/../src/Poly_Gen_Relation.cc \
+                         @srcdir@/../src/Interval_Restriction.defs.hh \
+                         @srcdir@/../src/Interval_Info.types.hh \
+                         @srcdir@/../src/Interval_Info.defs.hh \
+                         @srcdir@/../src/Interval_Info.inlines.hh \
                          @srcdir@/../src/Interval.types.hh \
                          @srcdir@/../src/Interval.defs.hh \
                          @srcdir@/../src/Interval.inlines.hh \
-                         @srcdir@/../src/Interval.cc \
-                         @srcdir@/../src/Bounding_Box.types.hh \
-                         @srcdir@/../src/Bounding_Box.defs.hh \
-                         @srcdir@/../src/Bounding_Box.inlines.hh \
-                         @srcdir@/../src/Bounding_Box.cc \
                          @srcdir@/../src/C_Polyhedron.types.hh \
                          @srcdir@/../src/C_Polyhedron.defs.hh \
                          @srcdir@/../src/C_Polyhedron.inlines.hh \
@@ -628,819 +260,208 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Grid_Certificate.cc \
                          @srcdir@/../src/Determinate.defs.hh \
                          @srcdir@/../src/Determinate.inlines.hh \
+                         @srcdir@/../src/iterator_to_const.types.hh \
+                         @srcdir@/../src/iterator_to_const.defs.hh \
+                         @srcdir@/../src/iterator_to_const.inlines.hh \
+                         @srcdir@/../src/Powerset.types.hh \
                          @srcdir@/../src/Powerset.defs.hh \
                          @srcdir@/../src/Powerset.inlines.hh \
                          @srcdir@/../src/Powerset.templates.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.types.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.defs.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.inlines.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.templates.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.cc \
+                         @srcdir@/../src/Pointset_Powerset.types.hh \
+                         @srcdir@/../src/Pointset_Powerset.defs.hh \
+                         @srcdir@/../src/Pointset_Powerset.inlines.hh \
+                         @srcdir@/../src/Pointset_Powerset.templates.hh \
+                         @srcdir@/../src/Pointset_Powerset.cc \
+                         @srcdir@/../src/Partially_Reduced_Product.types.hh \
+                         @srcdir@/../src/Partially_Reduced_Product.defs.hh \
+                         @srcdir@/../src/Partially_Reduced_Product.inlines.hh \
+                         @srcdir@/../src/Partially_Reduced_Product.templates.hh \
                          @srcdir@/../src/algorithms.hh \
-                         @srcdir@/../src/LP_Problem.types.hh \
-                         @srcdir@/../src/LP_Problem.defs.hh \
-                         @srcdir@/../src/LP_Problem.inlines.hh \
-                         @srcdir@/../src/LP_Problem.cc \
+                         @srcdir@/../src/Box.types.hh \
+                         @srcdir@/../src/Box.defs.hh \
+                         @srcdir@/../src/Box.inlines.hh \
+                         @srcdir@/../src/Box.templates.hh \
+                         @srcdir@/../src/Box.cc \
                          @srcdir@/../src/DB_Row.types.hh \
                          @srcdir@/../src/DB_Row.defs.hh \
                          @srcdir@/../src/DB_Row.inlines.hh \
+                         @srcdir@/../src/DB_Row.templates.hh \
                          @srcdir@/../src/DB_Matrix.types.hh \
                          @srcdir@/../src/DB_Matrix.defs.hh \
                          @srcdir@/../src/DB_Matrix.inlines.hh \
+                         @srcdir@/../src/DB_Matrix.templates.hh \
                          @srcdir@/../src/BD_Shape.types.hh \
                          @srcdir@/../src/BD_Shape.defs.hh \
                          @srcdir@/../src/BD_Shape.inlines.hh \
                          @srcdir@/../src/BD_Shape.templates.hh \
                          @srcdir@/../src/BD_Shape.cc \
-                         ../interfaces/C/ppl_c.h \
-                         @srcdir@/../interfaces/C/ppl_c.cc \
-                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
-                         @srcdir@/../interfaces/Prolog/exceptions.hh \
-                         @srcdir@/../interfaces/Prolog/track_allocation.hh \
-                         @srcdir@/../interfaces/Prolog/ppl_prolog.icc \
-                         @srcdir@/../interfaces/Prolog/Ciao/ppl_ciao.cc \
-                         @srcdir@/../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
-                         @srcdir@/../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
-                         @srcdir@/../interfaces/Prolog/SWI/ppl_swiprolog.cc \
-                         @srcdir@/../interfaces/Prolog/YAP/ppl_yap.cc \
+                         @srcdir@/../src/OR_Matrix.types.hh \
+                         @srcdir@/../src/OR_Matrix.defs.hh \
+                         @srcdir@/../src/OR_Matrix.inlines.hh \
+                         @srcdir@/../src/OR_Matrix.templates.hh \
+                         @srcdir@/../src/Octagonal_Shape.types.hh \
+                         @srcdir@/../src/Octagonal_Shape.defs.hh \
+                         @srcdir@/../src/Octagonal_Shape.inlines.hh \
+                         @srcdir@/../src/Octagonal_Shape.templates.hh \
+                         @srcdir@/../src/Octagonal_Shape.cc \
                          @srcdir@/gpl.dox \
                          @srcdir@/fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = *.hh \
                          *.cc \
                          *.dox
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
 RECURSIVE              = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
-# from the input.
-
+EXCLUDE                = 
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.  Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.  The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = YES
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = YES
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          =
-
+IGNORE_PREFIX          = 
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
 GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = devref.html-dir
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-devref- at VERSION@-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE               =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
 GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
+LATEX_OUTPUT           = devref.latex-dir
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
 LATEX_HEADER           = @srcdir@/devref.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    =
-
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
+XML_SCHEMA             = 
+XML_DTD                = 
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.  This is useful
-# if you want to understand what is going on.  On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
+PERLMOD_MAKEVAR_PREFIX = 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
-                         PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = CATCH_ALL \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
-
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-#   TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#   TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
+TAGFILES               = 
+GENERATE_TAGFILE       = ppl-devref- at VERSION@-html.tag
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = @PERL@
-
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
-# powerful graphs.
-
 CLASS_DIAGRAMS         = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that a graph may be further truncated if the graph's
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
-# the graph is not depth-constrained.
-
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, which results in a white background.
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
+# Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/devref.doxyconf-latex b/doc/devref.doxyconf-latex
index 7aca310..aab8595 100644
--- a/doc/devref.doxyconf-latex
+++ b/doc/devref.doxyconf-latex
@@ -1,1446 +1,467 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER         = 0.9
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
+PROJECT_NUMBER         = 0.10pre27
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output.
-# The encoding is not always determined by the language that is chosen,
-# but also whether or not the output is meant for Windows or non-Windows users.
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
-# forces the Windows encoding (this is the default for the Windows binary),
-# whereas setting the tag to NO uses a Unix-style encoding (the default for
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
+ABBREVIATE_BRIEF       = 
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
 INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
+ALIASES                = 
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
-# include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
 EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
 SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = Include_Implementation_Details
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from the
-# version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    =
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE           =
-
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT                  = ./definitions.dox \
-                         ./../src/namespaces.hh \
+INPUT                  = /home/roberto/ppl/ppl/doc/definitions.dox \
+                         /home/roberto/ppl/ppl/doc/../src/namespaces.hh \
                          ../src/version.hh \
-                         ./../src/version.cc \
-                         ./../src/Float.defs.hh \
-                         ./../src/Float.inlines.hh \
-                         ./../src/Float.cc \
-                         ./../src/Checked_Number.types.hh \
-                         ./../src/Checked_Number.defs.hh \
-                         ./../src/Checked_Number.inlines.hh \
-                         ./../src/Checked_Number.cc \
-                         ./../src/GMP_Integer.types.hh \
-                         ./../src/GMP_Integer.defs.hh \
-                         ./../src/GMP_Integer.inlines.hh \
-                         ./../src/Coefficient_traits_template.hh \
-                         ./../src/Coefficient.types.hh \
-                         ./../src/Coefficient.defs.hh \
-                         ./../src/Coefficient.inlines.hh \
-                         ./../src/Coefficient.cc \
-                         ./../src/Limits.hh \
-                         ./../src/checked.defs.hh \
-                         ./../src/checked.inlines.hh \
-                         ./../src/checked_float.inlines.hh \
-                         ./../src/checked_int.inlines.hh \
-                         ./../src/checked_mpq.inlines.hh \
-                         ./../src/checked_mpz.inlines.hh \
-                         ./../src/checked.cc \
-                         ./../src/Init.types.hh \
-                         ./../src/Init.defs.hh \
-                         ./../src/Init.cc \
-                         ./../src/initializer.hh \
-                         ./../src/globals.defs.hh \
-                         ./../src/globals.types.hh \
-                         ./../src/globals.inlines.hh \
-                         ./../src/globals.cc \
-                         ./../src/Topology.hh \
-                         ./../src/Row.types.hh \
-                         ./../src/Row.defs.hh \
-                         ./../src/Row.inlines.hh \
-                         ./../src/Row.cc \
-                         ./../src/Matrix.types.hh \
-                         ./../src/Matrix.defs.hh \
-                         ./../src/Matrix.inlines.hh \
-                         ./../src/Matrix.cc \
-                         ./../src/Linear_Row.types.hh \
-                         ./../src/Linear_Row.defs.hh \
-                         ./../src/Linear_Row.inlines.hh \
-                         ./../src/Linear_Row.cc \
-                         ./../src/Linear_System.types.hh \
-                         ./../src/Linear_System.defs.hh \
-                         ./../src/Linear_System.inlines.hh \
-                         ./../src/Linear_System.cc \
-                         ./../src/Saturation_Row.types.hh \
-                         ./../src/Saturation_Row.defs.hh \
-                         ./../src/Saturation_Row.inlines.hh \
-                         ./../src/Saturation_Row.cc \
-                         ./../src/Saturation_Matrix.types.hh \
-                         ./../src/Saturation_Matrix.defs.hh \
-                         ./../src/Saturation_Matrix.inlines.hh \
-                         ./../src/Saturation_Matrix.cc \
-                         ./../src/Variable.types.hh \
-                         ./../src/Variable.defs.hh \
-                         ./../src/Variable.inlines.hh \
-                         ./../src/Variable.cc \
-                         ./../src/Linear_Expression.types.hh \
-                         ./../src/Linear_Expression.defs.hh \
-                         ./../src/Linear_Expression.inlines.hh \
-                         ./../src/Linear_Expression.cc \
-                         ./../src/Constraint.types.hh \
-                         ./../src/Constraint.defs.hh \
-                         ./../src/Constraint.inlines.hh \
-                         ./../src/Constraint.cc \
-                         ./../src/Congruence.types.hh \
-                         ./../src/Congruence.defs.hh \
-                         ./../src/Congruence.inlines.hh \
-                         ./../src/Congruence.cc \
-                         ./../src/Generator.types.hh \
-                         ./../src/Generator.defs.hh \
-                         ./../src/Generator.inlines.hh \
-                         ./../src/Generator.cc \
-                         ./../src/Grid_Generator.types.hh \
-                         ./../src/Grid_Generator.defs.hh \
-                         ./../src/Grid_Generator.inlines.hh \
-                         ./../src/Grid_Generator.cc \
-                         ./../src/Constraint_System.types.hh \
-                         ./../src/Constraint_System.defs.hh \
-                         ./../src/Constraint_System.inlines.hh \
-                         ./../src/Constraint_System.cc \
-                         ./../src/Congruence_System.types.hh \
-                         ./../src/Congruence_System.defs.hh \
-                         ./../src/Congruence_System.inlines.hh \
-                         ./../src/Congruence_System.cc \
-                         ./../src/Generator_System.defs.hh \
-                         ./../src/Generator_System.types.hh \
-                         ./../src/Generator_System.inlines.hh \
-                         ./../src/Generator_System.cc \
-                         ./../src/Grid_Generator_System.defs.hh \
-                         ./../src/Grid_Generator_System.types.hh \
-                         ./../src/Grid_Generator_System.inlines.hh \
-                         ./../src/Grid_Generator_System.cc \
-                         ./../src/Scalar_Products.types.hh \
-                         ./../src/Scalar_Products.defs.hh \
-                         ./../src/Scalar_Products.inlines.hh \
-                         ./../src/Scalar_Products.cc \
-                         ./../src/Ph_Status.idefs.hh \
-                         ./../src/Ph_Status.inlines.hh \
-                         ./../src/Ph_Status.cc \
-                         ./../src/Polyhedron.types.hh \
-                         ./../src/Polyhedron.defs.hh \
-                         ./../src/Polyhedron.inlines.hh \
-                         ./../src/Polyhedron.templates.hh \
-                         ./../src/Polyhedron_public.cc \
-                         ./../src/Polyhedron_nonpublic.cc \
-                         ./../src/Polyhedron_widenings.cc \
-                         ./../src/Polyhedron_chdims.cc \
-                         ./../src/conversion.cc \
-                         ./../src/minimize.cc \
-                         ./../src/simplify.cc \
-                         ./../src/Grid.types.hh \
-                         ./../src/Grid.defs.hh \
-                         ./../src/Grid.inlines.hh \
-                         ./../src/Grid.templates.hh \
-                         ./../src/Grid_public.cc \
-                         ./../src/Grid_nonpublic.cc \
-                         ./../src/Grid_widenings.cc \
-                         ./../src/Grid_chdims.cc \
-                         ./../src/Grid_conversion.cc \
-                         ./../src/Grid_simplify.cc \
-                         ./../src/Poly_Con_Relation.types.hh \
-                         ./../src/Poly_Con_Relation.defs.hh \
-                         ./../src/Poly_Con_Relation.inlines.hh \
-                         ./../src/Poly_Con_Relation.cc \
-                         ./../src/Poly_Gen_Relation.types.hh \
-                         ./../src/Poly_Gen_Relation.defs.hh \
-                         ./../src/Poly_Gen_Relation.inlines.hh \
-                         ./../src/Poly_Gen_Relation.cc \
-                         ./../src/Interval.types.hh \
-                         ./../src/Interval.defs.hh \
-                         ./../src/Interval.inlines.hh \
-                         ./../src/Interval.cc \
-                         ./../src/Bounding_Box.types.hh \
-                         ./../src/Bounding_Box.defs.hh \
-                         ./../src/Bounding_Box.inlines.hh \
-                         ./../src/Bounding_Box.cc \
-                         ./../src/C_Polyhedron.types.hh \
-                         ./../src/C_Polyhedron.defs.hh \
-                         ./../src/C_Polyhedron.inlines.hh \
-                         ./../src/C_Polyhedron.cc \
-                         ./../src/NNC_Polyhedron.types.hh \
-                         ./../src/NNC_Polyhedron.defs.hh \
-                         ./../src/NNC_Polyhedron.inlines.hh \
-                         ./../src/NNC_Polyhedron.cc \
-                         ./../src/Widening_Function.types.hh \
-                         ./../src/Widening_Function.defs.hh \
-                         ./../src/Widening_Function.inlines.hh \
-                         ./../src/BHRZ03_Certificate.types.hh \
-                         ./../src/BHRZ03_Certificate.defs.hh \
-                         ./../src/BHRZ03_Certificate.inlines.hh \
-                         ./../src/BHRZ03_Certificate.cc \
-                         ./../src/H79_Certificate.types.hh \
-                         ./../src/H79_Certificate.defs.hh \
-                         ./../src/H79_Certificate.inlines.hh \
-                         ./../src/H79_Certificate.cc \
-                         ./../src/Grid_Certificate.types.hh \
-                         ./../src/Grid_Certificate.defs.hh \
-                         ./../src/Grid_Certificate.inlines.hh \
-                         ./../src/Grid_Certificate.cc \
-                         ./../src/Determinate.defs.hh \
-                         ./../src/Determinate.inlines.hh \
-                         ./../src/Powerset.defs.hh \
-                         ./../src/Powerset.inlines.hh \
-                         ./../src/Powerset.templates.hh \
-                         ./../src/Polyhedra_Powerset.types.hh \
-                         ./../src/Polyhedra_Powerset.defs.hh \
-                         ./../src/Polyhedra_Powerset.inlines.hh \
-                         ./../src/Polyhedra_Powerset.templates.hh \
-                         ./../src/Polyhedra_Powerset.cc \
-                         ./../src/algorithms.hh \
-                         ./../src/LP_Problem.types.hh \
-                         ./../src/LP_Problem.defs.hh \
-                         ./../src/LP_Problem.inlines.hh \
-                         ./../src/LP_Problem.cc \
-                         ./../src/DB_Row.types.hh \
-                         ./../src/DB_Row.defs.hh \
-                         ./../src/DB_Row.inlines.hh \
-                         ./../src/DB_Matrix.types.hh \
-                         ./../src/DB_Matrix.defs.hh \
-                         ./../src/DB_Matrix.inlines.hh \
-                         ./../src/BD_Shape.types.hh \
-                         ./../src/BD_Shape.defs.hh \
-                         ./../src/BD_Shape.inlines.hh \
-                         ./../src/BD_Shape.templates.hh \
-                         ./../src/BD_Shape.cc \
-                         ../interfaces/C/ppl_c.h \
-                         ./../interfaces/C/ppl_c.cc \
-                         ./../interfaces/Prolog/Prolog_interface.dox \
-                         ./../interfaces/Prolog/exceptions.hh \
-                         ./../interfaces/Prolog/track_allocation.hh \
-                         ./../interfaces/Prolog/ppl_prolog.icc \
-                         ./../interfaces/Prolog/Ciao/ppl_ciao.cc \
-                         ./../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
-                         ./../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
-                         ./../interfaces/Prolog/SWI/ppl_swiprolog.cc \
-                         ./../interfaces/Prolog/YAP/ppl_yap.cc \
-                         ./gpl.dox \
-                         ./fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+                         /home/roberto/ppl/ppl/doc/../src/version.cc \
+                         /home/roberto/ppl/ppl/doc/../src/meta_programming.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Float.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Float.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Float.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Checked_Number.cc \
+                         /home/roberto/ppl/ppl/doc/../src/GMP_Integer.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/GMP_Integer.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/GMP_Integer.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient_traits_template.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Coefficient.cc \
+                         /home/roberto/ppl/ppl/doc/../src/checked.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_float.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_int.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_mpq.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked_mpz.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/checked.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Init.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Init.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Init.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Init.cc \
+                         /home/roberto/ppl/ppl/doc/../src/initializer.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/globals.cc \
+                         /home/roberto/ppl/ppl/doc/../src/math_utilities.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/math_utilities.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/distances.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/distances.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/distances.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Topology.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Row.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Matrix.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Row.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/MIP_Problem.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Row.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Bit_Matrix.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Variable.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Linear_Expression.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Constraint_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Congruence_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Generator_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Generator_System.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Scalar_Products.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Ph_Status.idefs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Ph_Status.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Ph_Status.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_public.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_nonpublic.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_widenings.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Polyhedron_chdims.cc \
+                         /home/roberto/ppl/ppl/doc/../src/conversion.cc \
+                         /home/roberto/ppl/ppl/doc/../src/minimize.cc \
+                         /home/roberto/ppl/ppl/doc/../src/simplify.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_public.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_nonpublic.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_conversion.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_simplify.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_widenings.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_chdims.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Con_Relation.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Poly_Gen_Relation.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Restriction.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Info.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Info.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval_Info.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Interval.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/C_Polyhedron.cc \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/NNC_Polyhedron.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Widening_Function.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Widening_Function.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Widening_Function.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BHRZ03_Certificate.cc \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/H79_Certificate.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Grid_Certificate.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Determinate.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Determinate.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/iterator_to_const.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/iterator_to_const.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/iterator_to_const.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Powerset.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Pointset_Powerset.cc \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Partially_Reduced_Product.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/algorithms.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Box.cc \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Row.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/DB_Matrix.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/BD_Shape.cc \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/OR_Matrix.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.types.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.defs.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.inlines.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.templates.hh \
+                         /home/roberto/ppl/ppl/doc/../src/Octagonal_Shape.cc \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = *.hh \
                          *.cc \
                          *.dox
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
 RECURSIVE              = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
-# from the input.
-
+EXCLUDE                = 
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.  Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.  The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = YES
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = YES
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          =
-
+IGNORE_PREFIX          = 
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
 GENERATE_HTML          = NO
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-devref-0.10pre27-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE               =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
 GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
 LATEX_OUTPUT           = devref.latex-dir
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = ./devref.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/devref.tex
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    =
-
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
+XML_SCHEMA             = 
+XML_DTD                = 
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.  This is useful
-# if you want to understand what is going on.  On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
+PERLMOD_MAKEVAR_PREFIX = 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
-                         PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = CATCH_ALL \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
-
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-#   TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#   TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
+TAGFILES               = 
+GENERATE_TAGFILE       = 
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
-# powerful graphs.
-
 CLASS_DIAGRAMS         = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that a graph may be further truncated if the graph's
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
-# the graph is not depth-constrained.
-
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, which results in a white background.
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
+# Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/devref.doxyconf-latex.in b/doc/devref.doxyconf-latex.in
index 51884ad..b634184 100644
--- a/doc/devref.doxyconf-latex.in
+++ b/doc/devref.doxyconf-latex.in
@@ -1,468 +1,92 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
 PROJECT_NUMBER         = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output.
-# The encoding is not always determined by the language that is chosen,
-# but also whether or not the output is meant for Windows or non-Windows users.
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
-# forces the Windows encoding (this is the default for the Windows binary),
-# whereas setting the tag to NO uses a Unix-style encoding (the default for
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
+ABBREVIATE_BRIEF       = 
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
 INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
+ALIASES                = 
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
-# include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
 EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
 SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = Include_Implementation_Details
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from the
-# version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    =
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE           =
-
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
 INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/namespaces.hh \
                          ../src/version.hh \
                          @srcdir@/../src/version.cc \
+                         @srcdir@/../src/meta_programming.hh \
                          @srcdir@/../src/Float.defs.hh \
                          @srcdir@/../src/Float.inlines.hh \
                          @srcdir@/../src/Float.cc \
@@ -478,7 +102,6 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Coefficient.defs.hh \
                          @srcdir@/../src/Coefficient.inlines.hh \
                          @srcdir@/../src/Coefficient.cc \
-                         @srcdir@/../src/Limits.hh \
                          @srcdir@/../src/checked.defs.hh \
                          @srcdir@/../src/checked.inlines.hh \
                          @srcdir@/../src/checked_float.inlines.hh \
@@ -488,12 +111,18 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/checked.cc \
                          @srcdir@/../src/Init.types.hh \
                          @srcdir@/../src/Init.defs.hh \
+                         @srcdir@/../src/Init.inlines.hh \
                          @srcdir@/../src/Init.cc \
                          @srcdir@/../src/initializer.hh \
-                         @srcdir@/../src/globals.defs.hh \
                          @srcdir@/../src/globals.types.hh \
+                         @srcdir@/../src/globals.defs.hh \
                          @srcdir@/../src/globals.inlines.hh \
                          @srcdir@/../src/globals.cc \
+                         @srcdir@/../src/math_utilities.defs.hh \
+                         @srcdir@/../src/math_utilities.inlines.hh \
+                         @srcdir@/../src/distances.types.hh \
+                         @srcdir@/../src/distances.defs.hh \
+                         @srcdir@/../src/distances.inlines.hh \
                          @srcdir@/../src/Topology.hh \
                          @srcdir@/../src/Row.types.hh \
                          @srcdir@/../src/Row.defs.hh \
@@ -511,14 +140,18 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Linear_System.defs.hh \
                          @srcdir@/../src/Linear_System.inlines.hh \
                          @srcdir@/../src/Linear_System.cc \
-                         @srcdir@/../src/Saturation_Row.types.hh \
-                         @srcdir@/../src/Saturation_Row.defs.hh \
-                         @srcdir@/../src/Saturation_Row.inlines.hh \
-                         @srcdir@/../src/Saturation_Row.cc \
-                         @srcdir@/../src/Saturation_Matrix.types.hh \
-                         @srcdir@/../src/Saturation_Matrix.defs.hh \
-                         @srcdir@/../src/Saturation_Matrix.inlines.hh \
-                         @srcdir@/../src/Saturation_Matrix.cc \
+                         @srcdir@/../src/MIP_Problem.types.hh \
+                         @srcdir@/../src/MIP_Problem.defs.hh \
+                         @srcdir@/../src/MIP_Problem.inlines.hh \
+                         @srcdir@/../src/MIP_Problem.cc \
+                         @srcdir@/../src/Bit_Row.types.hh \
+                         @srcdir@/../src/Bit_Row.defs.hh \
+                         @srcdir@/../src/Bit_Row.inlines.hh \
+                         @srcdir@/../src/Bit_Row.cc \
+                         @srcdir@/../src/Bit_Matrix.types.hh \
+                         @srcdir@/../src/Bit_Matrix.defs.hh \
+                         @srcdir@/../src/Bit_Matrix.inlines.hh \
+                         @srcdir@/../src/Bit_Matrix.cc \
                          @srcdir@/../src/Variable.types.hh \
                          @srcdir@/../src/Variable.defs.hh \
                          @srcdir@/../src/Variable.inlines.hh \
@@ -583,10 +216,10 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Grid.templates.hh \
                          @srcdir@/../src/Grid_public.cc \
                          @srcdir@/../src/Grid_nonpublic.cc \
-                         @srcdir@/../src/Grid_widenings.cc \
-                         @srcdir@/../src/Grid_chdims.cc \
                          @srcdir@/../src/Grid_conversion.cc \
                          @srcdir@/../src/Grid_simplify.cc \
+                         @srcdir@/../src/Grid_widenings.cc \
+                         @srcdir@/../src/Grid_chdims.cc \
                          @srcdir@/../src/Poly_Con_Relation.types.hh \
                          @srcdir@/../src/Poly_Con_Relation.defs.hh \
                          @srcdir@/../src/Poly_Con_Relation.inlines.hh \
@@ -595,14 +228,13 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Poly_Gen_Relation.defs.hh \
                          @srcdir@/../src/Poly_Gen_Relation.inlines.hh \
                          @srcdir@/../src/Poly_Gen_Relation.cc \
+                         @srcdir@/../src/Interval_Restriction.defs.hh \
+                         @srcdir@/../src/Interval_Info.types.hh \
+                         @srcdir@/../src/Interval_Info.defs.hh \
+                         @srcdir@/../src/Interval_Info.inlines.hh \
                          @srcdir@/../src/Interval.types.hh \
                          @srcdir@/../src/Interval.defs.hh \
                          @srcdir@/../src/Interval.inlines.hh \
-                         @srcdir@/../src/Interval.cc \
-                         @srcdir@/../src/Bounding_Box.types.hh \
-                         @srcdir@/../src/Bounding_Box.defs.hh \
-                         @srcdir@/../src/Bounding_Box.inlines.hh \
-                         @srcdir@/../src/Bounding_Box.cc \
                          @srcdir@/../src/C_Polyhedron.types.hh \
                          @srcdir@/../src/C_Polyhedron.defs.hh \
                          @srcdir@/../src/C_Polyhedron.inlines.hh \
@@ -628,819 +260,208 @@ INPUT                  = @srcdir@/definitions.dox \
                          @srcdir@/../src/Grid_Certificate.cc \
                          @srcdir@/../src/Determinate.defs.hh \
                          @srcdir@/../src/Determinate.inlines.hh \
+                         @srcdir@/../src/iterator_to_const.types.hh \
+                         @srcdir@/../src/iterator_to_const.defs.hh \
+                         @srcdir@/../src/iterator_to_const.inlines.hh \
+                         @srcdir@/../src/Powerset.types.hh \
                          @srcdir@/../src/Powerset.defs.hh \
                          @srcdir@/../src/Powerset.inlines.hh \
                          @srcdir@/../src/Powerset.templates.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.types.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.defs.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.inlines.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.templates.hh \
-                         @srcdir@/../src/Polyhedra_Powerset.cc \
+                         @srcdir@/../src/Pointset_Powerset.types.hh \
+                         @srcdir@/../src/Pointset_Powerset.defs.hh \
+                         @srcdir@/../src/Pointset_Powerset.inlines.hh \
+                         @srcdir@/../src/Pointset_Powerset.templates.hh \
+                         @srcdir@/../src/Pointset_Powerset.cc \
+                         @srcdir@/../src/Partially_Reduced_Product.types.hh \
+                         @srcdir@/../src/Partially_Reduced_Product.defs.hh \
+                         @srcdir@/../src/Partially_Reduced_Product.inlines.hh \
+                         @srcdir@/../src/Partially_Reduced_Product.templates.hh \
                          @srcdir@/../src/algorithms.hh \
-                         @srcdir@/../src/LP_Problem.types.hh \
-                         @srcdir@/../src/LP_Problem.defs.hh \
-                         @srcdir@/../src/LP_Problem.inlines.hh \
-                         @srcdir@/../src/LP_Problem.cc \
+                         @srcdir@/../src/Box.types.hh \
+                         @srcdir@/../src/Box.defs.hh \
+                         @srcdir@/../src/Box.inlines.hh \
+                         @srcdir@/../src/Box.templates.hh \
+                         @srcdir@/../src/Box.cc \
                          @srcdir@/../src/DB_Row.types.hh \
                          @srcdir@/../src/DB_Row.defs.hh \
                          @srcdir@/../src/DB_Row.inlines.hh \
+                         @srcdir@/../src/DB_Row.templates.hh \
                          @srcdir@/../src/DB_Matrix.types.hh \
                          @srcdir@/../src/DB_Matrix.defs.hh \
                          @srcdir@/../src/DB_Matrix.inlines.hh \
+                         @srcdir@/../src/DB_Matrix.templates.hh \
                          @srcdir@/../src/BD_Shape.types.hh \
                          @srcdir@/../src/BD_Shape.defs.hh \
                          @srcdir@/../src/BD_Shape.inlines.hh \
                          @srcdir@/../src/BD_Shape.templates.hh \
                          @srcdir@/../src/BD_Shape.cc \
-                         ../interfaces/C/ppl_c.h \
-                         @srcdir@/../interfaces/C/ppl_c.cc \
-                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
-                         @srcdir@/../interfaces/Prolog/exceptions.hh \
-                         @srcdir@/../interfaces/Prolog/track_allocation.hh \
-                         @srcdir@/../interfaces/Prolog/ppl_prolog.icc \
-                         @srcdir@/../interfaces/Prolog/Ciao/ppl_ciao.cc \
-                         @srcdir@/../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
-                         @srcdir@/../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
-                         @srcdir@/../interfaces/Prolog/SWI/ppl_swiprolog.cc \
-                         @srcdir@/../interfaces/Prolog/YAP/ppl_yap.cc \
+                         @srcdir@/../src/OR_Matrix.types.hh \
+                         @srcdir@/../src/OR_Matrix.defs.hh \
+                         @srcdir@/../src/OR_Matrix.inlines.hh \
+                         @srcdir@/../src/OR_Matrix.templates.hh \
+                         @srcdir@/../src/Octagonal_Shape.types.hh \
+                         @srcdir@/../src/Octagonal_Shape.defs.hh \
+                         @srcdir@/../src/Octagonal_Shape.inlines.hh \
+                         @srcdir@/../src/Octagonal_Shape.templates.hh \
+                         @srcdir@/../src/Octagonal_Shape.cc \
                          @srcdir@/gpl.dox \
                          @srcdir@/fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = *.hh \
                          *.cc \
                          *.dox
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
 RECURSIVE              = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
-# from the input.
-
+EXCLUDE                = 
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.  Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.  The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = YES
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = YES
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          =
-
+IGNORE_PREFIX          = 
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
 GENERATE_HTML          = NO
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-devref- at VERSION@-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE               =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
 GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
 LATEX_OUTPUT           = devref.latex-dir
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
 LATEX_HEADER           = @srcdir@/devref.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    =
-
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
+XML_SCHEMA             = 
+XML_DTD                = 
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.  This is useful
-# if you want to understand what is going on.  On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
+PERLMOD_MAKEVAR_PREFIX = 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
-                         PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = CATCH_ALL \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
-
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-#   TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#   TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
+TAGFILES               = 
+GENERATE_TAGFILE       = 
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = @PERL@
-
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
-# powerful graphs.
-
 CLASS_DIAGRAMS         = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that a graph may be further truncated if the graph's
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
-# the graph is not depth-constrained.
-
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, which results in a white background.
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
+# Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/devref.tex b/doc/devref.tex
index 749320b..16ba230 100644
--- a/doc/devref.tex
+++ b/doc/devref.tex
@@ -1,4 +1,4 @@
-% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 %
 % This document describes the Parma Polyhedra Library (PPL).
 %
@@ -11,7 +11,7 @@
 %
 % The PPL 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
+% Free Software Foundation; either version 3 of the License, or (at your
 % option) any later version.  The license is included, in various
 % formats, in the `doc' subdirectory of each distribution of the PPL in
 % files are called `gpl.*'.
@@ -25,32 +25,37 @@
 % site: http://www.cs.unipr.it/ppl/ .
 
 \documentclass[a4paper]{article}
-\nonstopmode
 \usepackage{a4wide}
 \usepackage{makeidx}
 \usepackage{fancyhdr}
 \usepackage{graphicx}
+\usepackage{multicol}
 \usepackage{float}
+\usepackage{textcomp}
 \usepackage{alltt}
-\usepackage{doxygen}
 \usepackage{times}
-\ifx\pdfoutput\undefined
-\usepackage[ps2pdf,
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
             pagebackref=true,
             colorlinks=true,
-            linkcolor=blue
+            linkcolor=blue,
+            unicode
            ]{hyperref}
-\usepackage{pspicture}
 \else
-\usepackage[pdftex,
+\usepackage[ps2pdf,
             pagebackref=true,
             colorlinks=true,
-            linkcolor=blue
+            linkcolor=blue,
+            unicode
            ]{hyperref}
+\usepackage{pspicture}
 \fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
 \usepackage{ppl}
 \makeindex
-\setcounter{tocdepth}{1}
+\setcounter{tocdepth}{2}
 \renewcommand{\footrulewidth}{0.4pt}
 
 \rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
@@ -100,7 +105,7 @@ Tatiana Zolo
 \maketitle
 
 \newpage
-Copyright \copyright\ 2001--2006 Roberto Bagnara (bagnara at cs.unipr.it).
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
 
 This document describes the Parma Polyhedra Library (PPL).
 
@@ -110,14 +115,14 @@ or any later version published by the
 \href{http://www.fsf.org}{Free Software Foundation};
 with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 A copy of the license is included in the section entitled
-``\hyperlink{GFDL}{GNU Free Documentation License}''.
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
 
 The PPL is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
-\href{http://www.fsf.org}{Free Software Foundation}; either version 2
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
 of the License, or (at your option) any later version.
 A copy of the license is included in the section entitled
-``\hyperlink{GPL}{GNU GENERAL PUBLIC LICENSE}''.
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
diff --git a/doc/fdl.dox b/doc/fdl.dox
index d978fce..b3bc174 100644
--- a/doc/fdl.dox
+++ b/doc/fdl.dox
@@ -1,4 +1,11 @@
-/*! \page GFDL GNU Free Documentation License
+/*!
+\if PPL_HTML_Tag_Documentation_of_Interfaces
+\page GFDL_different_HTML_tag GNU Free Documentation License
+\else
+\page GFDL GNU Free Documentation License
+\endif
+
+\anchor GFDL
 
 Version 1.2, November 2002
 
diff --git a/doc/fdl.pdf b/doc/fdl.pdf
index 01a1c3e..a3f8d67 100644
Binary files a/doc/fdl.pdf and b/doc/fdl.pdf differ
diff --git a/doc/fdl.ps.gz b/doc/fdl.ps.gz
index d00fa64..00ea989 100644
Binary files a/doc/fdl.ps.gz and b/doc/fdl.ps.gz differ
diff --git a/doc/gpl.dox b/doc/gpl.dox
index 42917c5..0d155d9 100644
--- a/doc/gpl.dox
+++ b/doc/gpl.dox
@@ -1,461 +1,691 @@
-/*! \page GPL GNU General Public License
-
-Version 2, June 1991
-
-<P>
-<PRE>
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-</PRE>
-
-<H1>Preamble</H1>
-
-<P>
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-</P>
-<P>
-  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.
-
-</P>
-<P>
-  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 software, or if you modify it.
-
-</P>
-<P>
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-</P>
-<P>
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-</P>
-<P>
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-</P>
-<P>
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-</P>
-<P>
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-</P>
-
-
-<H1>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H1>
-
-
-<P>
-
-<STRONG>0.</STRONG>
- This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-<P>
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-<P>
-
-<STRONG>1.</STRONG>
- You may copy and distribute verbatim copies of the Program's
-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 give any other recipients of the Program a copy of this License
-along with the Program.
-<P>
-
-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.
-<P>
-
-<STRONG>2.</STRONG>
- You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-<P>
-
-<UL>
-
-<LI><STRONG>a)</STRONG>
-     You must cause the modified files to carry prominent notices
-     stating that you changed the files and the date of any change.
-
-<P>
-<LI><STRONG>b)</STRONG>
-     You must cause any work that you distribute or publish, that in
-     whole or in part contains or is derived from the Program or any
-     part thereof, to be licensed as a whole at no charge to all third
-     parties under the terms of this License.
-
-<P>
-<LI><STRONG>c)</STRONG>
-     If the modified program normally reads commands interactively
-     when run, you must cause it, when started running for such
-     interactive use in the most ordinary way, to print or display an
-     announcement including an appropriate copyright notice and a
-     notice that there is no warranty (or else, saying that you provide
-     a warranty) and that users may redistribute the program under
-     these conditions, and telling the user how to view a copy of this
-     License.  (Exception: if the Program itself is interactive but
-     does not normally print such an announcement, your work based on
-     the Program is not required to print an announcement.)
-</UL>
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-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 Program, 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.
-<P>
-
-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 Program.
-<P>
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-<P>
-
-<STRONG>3.</STRONG>
- You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-
-<!-- we use this doubled UL to get the sub-sections indented, -->
-<!-- while making the bullets as unobvious as possible. -->
-<UL>
-
-<LI><STRONG>a)</STRONG>
-     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; or,
-
-<P>
-<LI><STRONG>b)</STRONG>
-     Accompany it with a written offer, valid for at least three
-     years, to give any third party, for a charge no more than your
-     cost of physically performing source distribution, a complete
-     machine-readable copy of the corresponding source code, to be
-     distributed under the terms of Sections 1 and 2 above on a medium
-     customarily used for software interchange; or,
-
-<P>
-<LI><STRONG>c)</STRONG>
-     Accompany it with the information you received as to the offer
-     to distribute corresponding source code.  (This alternative is
-     allowed only for noncommercial distribution and only if you
-     received the program in object code or executable form with such
-     an offer, in accord with Subsection b above.)
-</UL>
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, 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 executable.  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.
-<P>
-
-If distribution of executable or 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 counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-<P>
-
-<STRONG>4.</STRONG>
- You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program 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.
-
-<P>
-
-<STRONG>5.</STRONG>
- 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 Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-<P>
-
-<STRONG>6.</STRONG>
- Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program 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.
-
-<P>
-
-<STRONG>7.</STRONG>
- 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 Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program 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 Program.
-<P>
-
-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.
-<P>
-
-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.
-<P>
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-<P>
-
-<STRONG>8.</STRONG>
- If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program 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.
-
-<P>
-
-<STRONG>9.</STRONG>
- The Free Software Foundation may publish revised and/or new versions
-of the 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.
-<P>
-
-Each version is given a distinguishing version number.  If the Program
-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 Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-<P>
-
-
-<STRONG>10.</STRONG>
- If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, 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.
+/*!
+\if PPL_HTML_Tag_Documentation_of_Interfaces
+\page GPL_different_HTML_tag GNU General Public License
+\else
+\page GPL GNU General Public License
+\endif
 
+\anchor GPL
 
+Version 3, 29 June 2007
 
-<P><STRONG>NO WARRANTY</STRONG></P>
+<p>Copyright (C) 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p><p>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
 
-<P>
+<h1>Preamble</h1>
 
-<STRONG>11.</STRONG>
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
 
-<P>
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
 
-<STRONG>12.</STRONG>
- 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-<P>
-<STRONG>END OF TERMS AND CONDITIONS</STRONG>
-<P>
-
-
-<H1>How to Apply These Terms to Your New Programs</H1>
-
-<P>
-  If you develop a new program, and you want it to be of the greatest
+<p>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
+them 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.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<h1>TERMS AND CONDITIONS</h1>
+
+<h2>0. Definitions.</h2>
+
+<p>“This License” refers to version 3 of the GNU General Public License.</p>
+
+<p>“Copyright” also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+
+<p>“The Program” refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as “you”.  “Licensees” and
+“recipients” may be individuals or organizations.</p>
+
+<p>To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a “modified version” of the
+earlier work or a work “based on” the earlier work.</p>
+
+<p>A “covered work” means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays “Appropriate Legal Notices”
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<h2>1. Source Code.</h2>
+
+<p>The “source code” for a work means the preferred form of the work
+for making modifications to it.  “Object code” means any non-source
+form of a work.</p>
+
+<p>A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<h2>2. Basic Permissions.</h2>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<h2>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h2>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<h2>4. Conveying Verbatim Copies.</h2>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<h2>5. Conveying Modified Source Versions.</h2>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    “keep intact all notices”.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<h2>6. Conveying Non-Source Forms.</h2>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, “normally used” refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<h2>7. Additional Terms.</h2>
+
+<p>“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<h2>8. Termination.</h2>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<h2>9. Acceptance Not Required for Having Copies.</h2>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<h2>10. Automatic Licensing of Downstream Recipients.</h2>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<h2>11. Patents.</h2>
+
+<p>A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's “contributor version”.</p>
+
+<p>A contributor's “essential patent claims” are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is “discriminatory” if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<h2>12. No Surrender of Others' Freedom.</h2>
+
+<p>If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<h2>13. Use with the GNU Affero General Public License.</h2>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<h2>14. Revised Versions of this License.</h2>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU 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.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License “or any later version” applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<h2>15. Disclaimer of Warranty.</h2>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<h2>16. Limitation of Liability.</h2>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<h2>17. Interpretation of Sections 15 and 16.</h2>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<h1>How to Apply These Terms to Your New Programs</h1>
+
+<p>If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
+free software which everyone can redistribute and change under these terms.</p>
 
-</P>
-<P>
-  To do so, attach the following notices to the program.  It is safest
+<p>To do so, attach the following notices to the program.  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.
-
-</P>
-
-<PRE>
-<VAR>one line to give the program's name and an idea of what it does.</VAR>
-Copyright (C) <VAR>yyyy</VAR>  <VAR>name of author</VAR>
-
-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,
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02111-1307, USA.
-</PRE>
-
-<P>
-Also add information on how to contact you by electronic and paper mail.
-
-</P>
-<P>
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-</P>
-
-<PRE>
-Gnomovision version 69, Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-type `show w'.  This is free software, and you are welcome
-to redistribute it under certain conditions; type `show c'
-for details.
-</PRE>
-
-<P>
-The hypothetical commands <CODE>`show w'</CODE> and <CODE>`show c'</CODE> should show
-the appropriate parts of the General Public License.  Of course, the
-commands you use may be called something other than <CODE>`show w'</CODE> and
-<CODE>`show c'</CODE>; they could even be mouse-clicks or menu items--whatever
-suits your program.
-
-</P>
-<P>
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-</P>
-
-<PRE>
-Yoyodyne, Inc., hereby disclaims all copyright
-interest in the program `Gnomovision'
-(which makes passes at compilers) written
-by James Hacker.
-
-<VAR>signature of Ty Coon</VAR>, 1 April 1989
-Ty Coon, President of Vice
-</PRE>
-
-<P>
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.</p>
+
+<pre>    <var>one line to give the program's name and a brief idea of what it does.</var>
+    Copyright (C) <var>year</var>  <var>name of author</var>
+
+    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 3 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, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    <var>program</var>  Copyright (C) <var>year</var>  <var>name of author</var>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an “about box”.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>.</p>
 */
diff --git a/doc/gpl.pdf b/doc/gpl.pdf
index 27b7a06..8bb9884 100644
Binary files a/doc/gpl.pdf and b/doc/gpl.pdf differ
diff --git a/doc/gpl.ps.gz b/doc/gpl.ps.gz
index adbcd2a..668c66d 100644
Binary files a/doc/gpl.ps.gz and b/doc/gpl.ps.gz differ
diff --git a/doc/gpl.tex b/doc/gpl.tex
index 95d0718..1e867c3 100644
--- a/doc/gpl.tex
+++ b/doc/gpl.tex
@@ -1,380 +1,728 @@
-\documentclass[a4paper]{report}
-\begin{document}
-
-\chapter*{GNU General Public License}
-
-Version 2, June 1991\\
-
-\noindent
- Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc.\\
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA.
-
-\noindent
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
+\documentclass[a4paper,12pt]{article}
+\usepackage{a4wide}
+\usepackage{times}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
 
-\section*{Preamble}
+\title{GNU GENERAL PUBLIC LICENSE}
+\date{Version 3, 29 June 2007}
 
-The licenses for most software are designed to take away your freedom to
-share and change it.  By contrast, the GNU General Public License is intended
-to guarantee your freedom to share and change free software---to make sure
-the software is free for all its users.  This General Public License applies
-to most of the Free Software Foundation's software and to any other program
-whose authors commit to using it.  (Some other Free Software Foundation
-software is covered by the GNU Library General Public License instead.)  You
-can apply it to your programs, 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.
+\begin{document}
+\maketitle
 
-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 software, or if you modify it.
+\begin{center}
+{\parindent 0in
 
-For example, if you distribute copies of such a program, whether gratis or
-for a fee, you must give the recipients all the rights that you have.  You
-must make sure that they, too, receive or can get the source code.  And you
-must show them these terms so they know their rights.
+Copyright \copyright\  2007 Free Software Foundation, Inc. http://fsf.org/
 
-We protect your rights with two steps: (1) copyright the software, and (2)
-offer you this license which gives you legal permission to copy, distribute
-and/or modify the software.
+\bigskip
+Everyone is permitted to copy and distribute verbatim copies of this
 
-Also, for each author's protection and ours, we want to make certain that
-everyone understands that there is no warranty for this free software.  If
-the software is modified by someone else and passed on, we want its
-recipients to know that what they have is not the original, so that any
-problems introduced by others will not reflect on the original authors'
-reputations.
+license document, but changing it is not allowed.}
 
-Finally, any free program is threatened constantly by software patents.  We
-wish to avoid the danger that redistributors of a free program will
-individually obtain patent licenses, in effect making the program
-proprietary.  To prevent this, we have made it clear that any patent must be
-licensed for everyone's free use or not licensed at all.
+\end{center}
 
-The precise terms and conditions for copying, distribution and modification
-follow.
+\renewcommand{\abstractname}{Preamble}
+\begin{abstract}
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+\end{abstract}
 
+\begin{center}
+{\Large \sc Terms and Conditions}
+\end{center}
 
-\section*{Terms and conditions for copying, distribution and modification}
 
 \begin{enumerate}
 
-\makeatletter \setcounter{\@listctr}{-1} \makeatother
-
-\item [0.] This License applies to any program or other work which contains a
-      notice placed by the copyright holder saying it may be distributed
-      under the terms of this General Public License.  The ``Program'',
-      below, refers to any such program or work, and a ``work based on the
-      Program'' means either the Program or any derivative work under
-      copyright law: that is to say, a work containing the Program or a
-      portion of it, either verbatim or with modifications and/or translated
-      into another language.  (Hereinafter, translation is included without
-      limitation in the term ``modification''.)  Each licensee is addressed
-      as ``you''.
-
-      Activities other than copying, distribution and modification are not
-      covered by this License; they are outside its scope.  The act of
-      running the Program is not restricted, and the output from the Program
-      is covered only if its contents constitute a work based on the Program
-      (independent of having been made by running the Program).  Whether that
-      is true depends on what the Program does.
-
-\item [1.] You may copy and distribute verbatim copies of the Program's
-      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 give any other recipients of the Program a copy of this License
-      along with the Program.
-
-      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.
-
-\item [2.] You may modify your copy or copies of the Program or any portion
-      of it, thus forming a work based on the Program, and copy and
-      distribute such modifications or work under the terms of Section 1
-      above, provided that you also meet all of these conditions:
-
-      \begin{enumerate}
-
-      \item [(a)] You must cause the modified files to carry prominent
-            notices stating that you changed the files and the date of any
-            change.
-
-      \item [(b)] You must cause any work that you distribute or publish,
-            that in whole or in part contains or is derived from the Program
-            or any part thereof, to be licensed as a whole at no charge to
-            all third parties under the terms of this License.
-
-      \item [(c)] If the modified program normally reads commands
-            interactively when run, you must cause it, when started running
-            for such interactive use in the most ordinary way, to print or
-            display an announcement including an appropriate copyright notice
-            and a notice that there is no warranty (or else, saying that you
-            provide a warranty) and that users may redistribute the program
-            under these conditions, and telling the user how to view a copy
-            of this License.  (Exception: if the Program itself is
-            interactive but does not normally print such an announcement,
-            your work based on the Program is not required to print an
-            announcement.)
-
-      \end{enumerate}
-
-      These requirements apply to the modified work as a whole.  If
-      identifiable sections of that work are not derived from the Program,
-      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 Program, 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 Program.
-
-      In addition, mere aggregation of another work not based on the Program
-      with the Program (or with a work based on the Program) on a volume of a
-      storage or distribution medium does not bring the other work under the
-      scope of this License.
-
-\item [3.] You may copy and distribute the Program (or a work based on it,
-      under Section 2) in object code or executable form under the terms of
-      Sections 1 and 2 above provided that you also do one of the following:
-
-      \begin{enumerate}
-
-      \item [(a)] 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; or,
-
-      \item [(b)] Accompany it with a written offer, valid for at least three
-            years, to give any third party, for a charge no more than your
-            cost of physically performing source distribution, a complete
-            machine-readable copy of the corresponding source code, to be
-            distributed under the terms of Sections 1 and 2 above on a medium
-            customarily used for software interchange; or,
-
-      \item [(c)] Accompany it with the information you received as to the
-            offer to distribute corresponding source code.  (This alternative
-            is allowed only for noncommercial distribution and only if you
-            received the program in object code or executable form with such
-            an offer, in accord with Subsection b above.)
-
-      \end{enumerate}
-
-      The source code for a work means the preferred form of the work for
-      making modifications to it.  For an executable work, 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 executable.  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.
-
-      If distribution of executable or 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 counts as distribution of the
-      source code, even though third parties are not compelled to copy the
-      source along with the object code.
-
-\item [4.] You may not copy, modify, sublicense, or distribute the Program
-      except as expressly provided under this License.  Any attempt otherwise
-      to copy, modify, sublicense or distribute the Program 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.
-
-\item [5.] 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 Program or its derivative works.  These actions are
-      prohibited by law if you do not accept this License.  Therefore, by
-      modifying or distributing the Program (or any work based on the
-      Program), you indicate your acceptance of this License to do so, and
-      all its terms and conditions for copying, distributing or modifying the
-      Program or works based on it.
-
-\item [6.] Each time you redistribute the Program (or any work based on the
-      Program), the recipient automatically receives a license from the
-      original licensor to copy, distribute or modify the Program 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.
-
-\item [7.] 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 Program at all.  For example, if a patent
-      license would not permit royalty-free redistribution of the Program 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 Program.
-
-      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.
-
-\item [8.] If the distribution and/or use of the Program is restricted in
-      certain countries either by patents or by copyrighted interfaces, the
-      original copyright holder who places the Program 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.
-
-\item [9.] The Free Software Foundation may publish revised and/or new
-      versions of the 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 Program
-      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 Program does not specify a
-      version number of this License, you may choose any version ever
-      published by the Free Software Foundation.
-
-\item [10.] If you wish to incorporate parts of the Program into other free
-      programs whose distribution conditions are different, 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.
+\addtocounter{enumi}{-1}
+
+\item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a ``modified version'' of the
+earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices''
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+\item Source Code.
+
+The ``source code'' for a work means the preferred form of the work
+for making modifications to it.  ``Object code'' means any non-source
+form of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+The Corresponding Source for a work in source code form is that
+same work.
+
+\item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+\item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+\item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+\item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+  \begin{enumerate}
+  \item The work must carry prominent notices stating that you modified
+  it, and giving a relevant date.
+
+  \item The work must carry prominent notices stating that it is
+  released under this License and any conditions added under section
+  7.  This requirement modifies the requirement in section 4 to
+  ``keep intact all notices''.
+
+  \item You must license the entire work, as a whole, under this
+  License to anyone who comes into possession of a copy.  This
+  License will therefore apply, along with any applicable section 7
+  additional terms, to the whole of the work, and all its parts,
+  regardless of how they are packaged.  This License gives no
+  permission to license the work in any other way, but it does not
+  invalidate such permission if you have separately received it.
+
+  \item If the work has interactive user interfaces, each must display
+  Appropriate Legal Notices; however, if the Program has interactive
+  interfaces that do not display Appropriate Legal Notices, your
+  work need not make them do so.
+\end{enumerate}
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+\item Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+  \begin{enumerate}
+  \item Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by the
+  Corresponding Source fixed on a durable physical medium
+  customarily used for software interchange.
+
+  \item Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by a
+  written offer, valid for at least three years and valid for as
+  long as you offer spare parts or customer support for that product
+  model, to give anyone who possesses the object code either (1) a
+  copy of the Corresponding Source for all the software in the
+  product that is covered by this License, on a durable physical
+  medium customarily used for software interchange, for a price no
+  more than your reasonable cost of physically performing this
+  conveying of source, or (2) access to copy the
+  Corresponding Source from a network server at no charge.
+
+  \item Convey individual copies of the object code with a copy of the
+  written offer to provide the Corresponding Source.  This
+  alternative is allowed only occasionally and noncommercially, and
+  only if you received the object code with such an offer, in accord
+  with subsection 6b.
+
+  \item Convey the object code by offering access from a designated
+  place (gratis or for a charge), and offer equivalent access to the
+  Corresponding Source in the same way through the same place at no
+  further charge.  You need not require recipients to copy the
+  Corresponding Source along with the object code.  If the place to
+  copy the object code is a network server, the Corresponding Source
+  may be on a different server (operated by you or a third party)
+  that supports equivalent copying facilities, provided you maintain
+  clear directions next to the object code saying where to find the
+  Corresponding Source.  Regardless of what server hosts the
+  Corresponding Source, you remain obligated to ensure that it is
+  available for as long as needed to satisfy these requirements.
+
+  \item Convey the object code using peer-to-peer transmission, provided
+  you inform other peers where the object code and Corresponding
+  Source of the work are being offered to the general public at no
+  charge under subsection 6d.
+  \end{enumerate}
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, ``normally used'' refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+\item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+  \begin{enumerate}
+  \item Disclaiming warranty or limiting liability differently from the
+  terms of sections 15 and 16 of this License; or
+
+  \item Requiring preservation of specified reasonable legal notices or
+  author attributions in that material or in the Appropriate Legal
+  Notices displayed by works containing it; or
+
+  \item Prohibiting misrepresentation of the origin of that material, or
+  requiring that modified versions of such material be marked in
+  reasonable ways as different from the original version; or
+
+  \item Limiting the use for publicity purposes of names of licensors or
+  authors of the material; or
+
+  \item Declining to grant rights under trademark law for use of some
+  trade names, trademarks, or service marks; or
+
+  \item Requiring indemnification of licensors and authors of that
+  material by anyone who conveys the material (or modified versions of
+  it) with contractual assumptions of liability to the recipient, for
+  any liability that these contractual assumptions directly impose on
+  those licensors and authors.
+  \end{enumerate}
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+\item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+\item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+\item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+\item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+\item No Surrender of Others' Freedom.
+
+If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+\item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+\item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of
+the GNU 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
+Program specifies that a certain numbered version of the GNU General
+Public License ``or any later version'' applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+\item Disclaimer of Warranty.
+
+\begin{sloppypar}
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+ APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+ COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``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 PROGRAM IS WITH YOU.
+ SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+ NECESSARY SERVICING, REPAIR OR CORRECTION.
+\end{sloppypar}
+
+\item Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+ AND/OR CONVEYS THE PROGRAM 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 PROGRAM
+ (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+ HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES.
+
+\item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
 
 \begin{center}
-NO WARRANTY
-\end{center}
+{\Large\sc End of Terms and Conditions}
 
-\bfseries
-
-\item [11.] Because the Program is licensed free of charge, there is no
-      warranty for the Program, to the extent permitted by applicable law.
-      except when otherwise stated in writing the copyright holders and/or
-      other parties provide the program ``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
-      Program is with you.  Should the Program prove defective, you assume
-      the cost of all necessary servicing, repair or correction.
-
-\item [12.] 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 program 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
-      program (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 Program to operate with any other programs), even if
-      such holder or other party has been advised of the possibility of such
-      damages.
+How to Apply These Terms to Your New Programs
 
-\end{enumerate}
-
-\begin{center}
-\textbf{END OF TERMS AND CONDITIONS}
 \end{center}
 
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
 
-\section*{Appendix: How to Apply These Terms to Your New Programs}
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
 
-If you develop a new program, and you want it to be of the greatest possible
-use to the public, the best way to achieve this is to make it free software
-which everyone can redistribute and change under these terms.
+\begin{quote}
+  <one line to give the program's name and a brief idea of what it does.>
 
-To do so, attach the following notices to the program.  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.
+  Copyright (C) <year>  <name of author>
 
-\begin{verbatim}
-<one line to give the program's name and a brief idea of what it does.>
-Copyright (C) 19yy  <name of author>
+  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 3 of the License, or
+  (at your option) any later version.
 
-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.
 
-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, see
+  http://www.gnu.org/licenses/.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software Foundation,
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-\end{verbatim}
+\end{quote}
 
 Also add information on how to contact you by electronic and paper mail.
 
-If the program is interactive, make it output a short notice like this when
-it starts in an interactive mode:
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
 
-\begin{verbatim}
-Gnomovision version 69, Copyright (C) 19yy name of author
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-This is free software, and you are welcome to redistribute it
-under certain conditions; type `show c' for details.
-\end{verbatim}
+\begin{quote}
+  <program>  Copyright (C) <year>  <name of author>
 
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may be
-called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
+  This program comes with ABSOLUTELY NO WARRANTY; for details type
+{\tt show w}.
+  This is free software, and you are welcome to redistribute it
+  under certain conditions; type {\tt show c} for details.
+\end{quote}
 
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a ``copyright disclaimer'' for the program, if
-necessary.  Here is a sample; alter the names:
+The hypothetical commands {\tt show w} and {\tt show c} should show
+the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an ``about box''.
 
-\begin{verbatim}
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-`Gnomovision' (which makes passes at compilers) written by James Hacker.
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary.  For more information on this, and how to apply and follow
+the GNU GPL, see http://www.gnu.org/licenses/.
 
-<signature of Ty Coon>, 1 April 1989
-Ty Coon, President of Vice
-\end{verbatim}
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.
 
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General Public
-License instead of this License.
+\end{enumerate}
 
 \end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
+
diff --git a/doc/gpl.txt b/doc/gpl.txt
index 3912109..94a9ed0 100644
--- a/doc/gpl.txt
+++ b/doc/gpl.txt
@@ -1,285 +1,626 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
 
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-			    Preamble
+                            Preamble
 
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
 your programs, 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.
+them 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 software, or if you modify it.
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
 
   For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
 
   The precise terms and conditions for copying, distribution and
 modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-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 give any other recipients of the Program a copy of this License
-along with the Program.
-
-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.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-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 Program, 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 Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) 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; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, 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 executable.  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.
-
-If distribution of executable or 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 counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program 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.
-
-  5. 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 Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program 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
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
 this License.
 
-  7. 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
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program 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 Program.
-
-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.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program 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.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 Program
-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 Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, 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
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	    How to Apply These Terms to Your New Programs
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
 
   If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
@@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
 
   To do so, attach the following notices to the program.  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
+state 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 program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>
 
-    This program is free software; you can redistribute it and/or modify
+    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
+    the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
 
     This program is distributed in the hope that it will be useful,
@@ -304,37 +645,30 @@ the "copyright" line and a pointer to where the full notice is found.
     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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 Also add information on how to contact you by electronic and paper mail.
 
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
 
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.
 
 The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/doc/libppl.3 b/doc/libppl.3
new file mode 100644
index 0000000..e11109f
--- /dev/null
+++ b/doc/libppl.3
@@ -0,0 +1,77 @@
+.TH libppl "3" "September 2008" "PPL 0.10" "libppl overview"
+.SH NAME
+libppl \- the C++ interface of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B #include <ppl.hh>
+.sp
+c++ file.cc
+.B -lppl
+.SH DESCRIPTION
+This is a short overview on how to use the Parma Polyhedra Library (PPL)
+in your C++ programs on Unix-like operating systems.
+Note that the PPL has interfaces also for C, Java, OCaml and a number
+of Prolog systems: look elsewhere for documentation on those.
+Note also that the present document does not describe the library
+functionality, its classes or its methods and functions: see
+.BR "The Parma Polyhedra Library User's Manual"
+for this kind of information.
+
+.SH "INCLUDING THE HEADER FILE"
+The C++ interface of the PPL has only one header file, named
+\fIppl.hh\fP.  So your program should contain a directive of the form
+.sp
+.B #include <ppl.hh>
+.sp
+Of course, you must make sure you installed the PPL in a place where
+it can find it, either by itself or with the help of a suitable
+.B -I dir
+command line option (see the file \fIINSTALL\fP for information
+on how to configure the library so that it is installed in the
+place of your choice).
+
+.SH "INITIALIZING AND FINALIZING THE LIBRARY"
+The mere inclusion of \fIppl.hh\fP in at least one file of your
+project will cause the automatic initialization and finalization
+of the library.
+However, there are situations in which automatic initialization
+and finalization is not desirable (e.g., if the application fiddles
+with GMP's memory allocation functions).  In those cases,
+.B every
+inclusion of \fIppl.hh\fP must take the form
+.sp
+.nf
+.B #define PPL_NO_AUTOMATIC_INITIALIZATION
+.B #include <ppl.hh>
+.ni
+.sp
+When automatic initialization and finalization you must absolutely
+call the functions
+.sp
+.B void Parma_Polyhedra_Library::initialize()
+.sp
+before using the library, and
+.sp
+.B void Parma_Polyhedra_Library::finalize()
+.sp
+when you are done with it.
+
+.SH "LINKING WITH THE LIBRARY"
+To be written.
+
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at
+
+    \fBhttp://www.cs.unipr.it/ppl/\fR
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/ppl-config.1 b/doc/ppl-config.1
index 8841b90..7a0d00e 100644
--- a/doc/ppl-config.1
+++ b/doc/ppl-config.1
@@ -1,4 +1,5 @@
-.TH PPL-CONFIG "1" "January 2006" "ppl-config 0.8" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
+.TH PPL-CONFIG "1" "September 2008" "ppl-config 0.10pre26" "User Commands"
 .SH NAME
 ppl-config \- obtain information about an installation of the Parma Polyhedra Library
 .SH SYNOPSIS
@@ -98,7 +99,7 @@ See the file \fBCREDITS\fR in the source distribution or use the command
 .SH "REPORTING BUGS"
 Report bugs to <ppl\-devel at cs.unipr.it>.
 .SH COPYRIGHT
-Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001\-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 .br
 This is free software; see the file \fBCOPYING\fR in the source
 distribution or use the command \fBppl\-config \-\-copying\fR to
diff --git a/doc/ppl-user-0.10pre27-html.tar.gz b/doc/ppl-user-0.10pre27-html.tar.gz
new file mode 100644
index 0000000..675bb92
Binary files /dev/null and b/doc/ppl-user-0.10pre27-html.tar.gz differ
diff --git a/doc/ppl-user-0.10pre27.pdf b/doc/ppl-user-0.10pre27.pdf
new file mode 100644
index 0000000..1b6631f
--- /dev/null
+++ b/doc/ppl-user-0.10pre27.pdf
@@ -0,0 +1,92038 @@
+%PDF-1.4
+5 0 obj
+<< /S /GoTo /D (section.1) >>
+endobj
+8 0 obj
+(\376\377\000G\000e\000n\000e\000r\000a\000l\000\040\000I\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n\000\040\000o\000n\000\040\000t\000h\000e\000\040\000P\000P\000L)
+endobj
+9 0 obj
+<< /S /GoTo /D (subsection.1.1) >>
+endobj
+12 0 obj
+(\376\377\000T\000h\000e\000\040\000M\000a\000i\000n\000\040\000F\000e\000a\000t\000u\000r\000e\000s)
+endobj
+13 0 obj
+<< /S /GoTo /D (subsection.1.2) >>
+endobj
+16 0 obj
+(\376\377\000K\000i\000n\000d\000s\000\040\000o\000f\000\040\000G\000e\000o\000m\000e\000t\000r\000i\000c\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000o\000r\000s)
+endobj
+17 0 obj
+<< /S /GoTo /D (subsection.1.3) >>
+endobj
+20 0 obj
+(\376\377\000U\000p\000w\000a\000r\000d\000\040\000A\000p\000p\000r\000o\000x\000i\000m\000a\000t\000i\000o\000n)
+endobj
+21 0 obj
+<< /S /GoTo /D (subsection.1.4) >>
+endobj
+24 0 obj
+(\376\377\000C\000o\000n\000v\000e\000x\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a)
+endobj
+25 0 obj
+<< /S /GoTo /D (subsection.1.5) >>
+endobj
+28 0 obj
+(\376\377\000R\000e\000p\000r\000e\000s\000e\000n\000t\000a\000t\000i\000o\000n\000s\000\040\000o\000f\000\040\000C\000o\000n\000v\000e\000x\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a)
+endobj
+29 0 obj
+<< /S /GoTo /D (subsection.1.6) >>
+endobj
+32 0 obj
+(\376\377\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s\000\040\000o\000n\000\040\000C\000o\000n\000v\000e\000x\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a)
+endobj
+33 0 obj
+<< /S /GoTo /D (subsection.1.7) >>
+endobj
+36 0 obj
+(\376\377\000W\000e\000a\000k\000l\000y\000-\000R\000e\000l\000a\000t\000i\000o\000n\000a\000l\000\040\000S\000h\000a\000p\000e\000s)
+endobj
+37 0 obj
+<< /S /GoTo /D (subsection.1.8) >>
+endobj
+40 0 obj
+(\376\377\000T\000h\000e\000\040\000P\000o\000w\000e\000r\000s\000e\000t\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n)
+endobj
+41 0 obj
+<< /S /GoTo /D (subsection.1.9) >>
+endobj
+44 0 obj
+(\376\377\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s\000\040\000o\000n\000\040\000t\000h\000e\000\040\000P\000o\000w\000e\000r\000s\000e\000t\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n)
+endobj
+45 0 obj
+<< /S /GoTo /D (subsection.1.10) >>
+endobj
+48 0 obj
+(\376\377\000T\000h\000e\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\040\000P\000o\000w\000e\000r\000s\000e\000t\000\040\000D\000o\000m\000a\000i\000n)
+endobj
+49 0 obj
+<< /S /GoTo /D (subsection.1.11) >>
+endobj
+52 0 obj
+(\376\377\000R\000a\000t\000i\000o\000n\000a\000l\000\040\000G\000r\000i\000d\000s)
+endobj
+53 0 obj
+<< /S /GoTo /D (subsection.1.12) >>
+endobj
+56 0 obj
+(\376\377\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s\000\040\000o\000n\000\040\000R\000a\000t\000i\000o\000n\000a\000l\000\040\000G\000r\000i\000d\000s)
+endobj
+57 0 obj
+<< /S /GoTo /D (subsection.1.13) >>
+endobj
+60 0 obj
+(\376\377\000U\000s\000i\000n\000g\000\040\000t\000h\000e\000\040\000L\000i\000b\000r\000a\000r\000y)
+endobj
+61 0 obj
+<< /S /GoTo /D (subsection.1.14) >>
+endobj
+64 0 obj
+(\376\377\000B\000i\000b\000l\000i\000o\000g\000r\000a\000p\000h\000y)
+endobj
+65 0 obj
+<< /S /GoTo /D (section.2) >>
+endobj
+68 0 obj
+(\376\377\000G\000N\000U\000\040\000G\000e\000n\000e\000r\000a\000l\000\040\000P\000u\000b\000l\000i\000c\000\040\000L\000i\000c\000e\000n\000s\000e)
+endobj
+69 0 obj
+<< /S /GoTo /D (section.3) >>
+endobj
+72 0 obj
+(\376\377\000G\000N\000U\000\040\000F\000r\000e\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000L\000i\000c\000e\000n\000s\000e)
+endobj
+73 0 obj
+<< /S /GoTo /D (section.4) >>
+endobj
+76 0 obj
+(\376\377\000D\000e\000p\000r\000e\000c\000a\000t\000e\000d\000\040\000L\000i\000s\000t)
+endobj
+77 0 obj
+<< /S /GoTo /D (section.5) >>
+endobj
+80 0 obj
+(\376\377\000M\000o\000d\000u\000l\000e\000\040\000I\000n\000d\000e\000x)
+endobj
+81 0 obj
+<< /S /GoTo /D (subsection.5.1) >>
+endobj
+84 0 obj
+(\376\377\000M\000o\000d\000u\000l\000e\000s)
+endobj
+85 0 obj
+<< /S /GoTo /D (section.6) >>
+endobj
+88 0 obj
+(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000I\000n\000d\000e\000x)
+endobj
+89 0 obj
+<< /S /GoTo /D (subsection.6.1) >>
+endobj
+92 0 obj
+(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000L\000i\000s\000t)
+endobj
+93 0 obj
+<< /S /GoTo /D (section.7) >>
+endobj
+96 0 obj
+(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x)
+endobj
+97 0 obj
+<< /S /GoTo /D (subsection.7.1) >>
+endobj
+100 0 obj
+(\376\377\000C\000l\000a\000s\000s\000\040\000H\000i\000e\000r\000a\000r\000c\000h\000y)
+endobj
+101 0 obj
+<< /S /GoTo /D (section.8) >>
+endobj
+104 0 obj
+(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x)
+endobj
+105 0 obj
+<< /S /GoTo /D (subsection.8.1) >>
+endobj
+108 0 obj
+(\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t)
+endobj
+109 0 obj
+<< /S /GoTo /D (section.9) >>
+endobj
+112 0 obj
+(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+113 0 obj
+<< /S /GoTo /D (subsection.9.1) >>
+endobj
+116 0 obj
+(\376\377\000C\000+\000+\000\040\000L\000a\000n\000g\000u\000a\000g\000e\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e)
+endobj
+117 0 obj
+<< /S /GoTo /D (section.10) >>
+endobj
+120 0 obj
+(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+121 0 obj
+<< /S /GoTo /D (subsection.10.1) >>
+endobj
+124 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+125 0 obj
+<< /S /GoTo /D (subsection.10.2) >>
+endobj
+128 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000O\000\137\000O\000p\000e\000r\000a\000t\000o\000r\000s\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+129 0 obj
+<< /S /GoTo /D (subsection.10.3) >>
+endobj
+132 0 obj
+(\376\377\000s\000t\000d\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+133 0 obj
+<< /S /GoTo /D (section.11) >>
+endobj
+136 0 obj
+(\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+137 0 obj
+<< /S /GoTo /D (subsection.11.1) >>
+endobj
+140 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000A\000n\000y\000\137\000P\000o\000i\000n\000t\000s\000e\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+141 0 obj
+<< /S /GoTo /D (subsection.11.2) >>
+endobj
+144 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000D\000\137\000S\000h\000a\000p\000e\000<\000\040\000T\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+145 0 obj
+<< /S /GoTo /D (subsection.11.3) >>
+endobj
+148 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000H\000R\000Z\0000\0003\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+149 0 obj
+<< /S /GoTo /D (subsection.11.4) >>
+endobj
+152 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000H\000R\000Z\0000\0003\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+153 0 obj
+<< /S /GoTo /D (subsection.11.5) >>
+endobj
+156 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000o\000x\000<\000\040\000I\000T\000V\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+157 0 obj
+<< /S /GoTo /D (subsection.11.6) >>
+endobj
+160 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+161 0 obj
+<< /S /GoTo /D (subsection.11.7) >>
+endobj
+164 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000h\000e\000c\000k\000e\000d\000\137\000N\000u\000m\000b\000e\000r\000<\000\040\000T\000,\000\040\000P\000o\000l\000i\000c\000y\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+165 0 obj
+<< /S /GoTo /D (subsection.11.8) >>
+endobj
+168 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+169 0 obj
+<< /S /GoTo /D (subsection.11.9) >>
+endobj
+172 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+173 0 obj
+<< /S /GoTo /D (subsection.11.10) >>
+endobj
+176 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+177 0 obj
+<< /S /GoTo /D (subsection.11.11) >>
+endobj
+180 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+181 0 obj
+<< /S /GoTo /D (subsection.11.12) >>
+endobj
+184 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+185 0 obj
+<< /S /GoTo /D (subsection.11.13) >>
+endobj
+188 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+189 0 obj
+<< /S /GoTo /D (subsection.11.14) >>
+endobj
+192 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000s\000\137\000R\000e\000d\000u\000c\000t\000i\000o\000n\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+193 0 obj
+<< /S /GoTo /D (subsection.11.15) >>
+endobj
+196 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000D\000e\000t\000e\000r\000m\000i\000n\000a\000t\000e\000<\000\040\000P\000S\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+197 0 obj
+<< /S /GoTo /D (subsection.11.16) >>
+endobj
+200 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000D\000o\000m\000a\000i\000n\000\137\000P\000r\000o\000d\000u\000c\000t\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+201 0 obj
+<< /S /GoTo /D (subsection.11.17) >>
+endobj
+204 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000F\000r\000o\000m\000\137\000C\000o\000v\000e\000r\000i\000n\000g\000\137\000B\000o\000x\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+205 0 obj
+<< /S /GoTo /D (subsection.11.18) >>
+endobj
+208 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+209 0 obj
+<< /S /GoTo /D (subsection.11.19) >>
+endobj
+212 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+213 0 obj
+<< /S /GoTo /D (subsection.11.20) >>
+endobj
+216 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+217 0 obj
+<< /S /GoTo /D (subsection.11.21) >>
+endobj
+220 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000M\000P\000\137\000I\000n\000t\000e\000g\000e\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+221 0 obj
+<< /S /GoTo /D (subsection.11.22) >>
+endobj
+224 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+225 0 obj
+<< /S /GoTo /D (subsection.11.23) >>
+endobj
+228 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+229 0 obj
+<< /S /GoTo /D (subsection.11.24) >>
+endobj
+232 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+233 0 obj
+<< /S /GoTo /D (subsection.11.25) >>
+endobj
+236 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+237 0 obj
+<< /S /GoTo /D (subsection.11.26) >>
+endobj
+240 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+241 0 obj
+<< /S /GoTo /D (subsection.11.27) >>
+endobj
+244 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+245 0 obj
+<< /S /GoTo /D (subsection.11.28) >>
+endobj
+248 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000H\0007\0009\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+249 0 obj
+<< /S /GoTo /D (subsection.11.29) >>
+endobj
+252 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000H\0007\0009\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+253 0 obj
+<< /S /GoTo /D (subsection.11.30) >>
+endobj
+256 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000n\000t\000e\000r\000v\000a\000l\000<\000\040\000B\000o\000u\000n\000d\000a\000r\000y\000,\000\040\000I\000n\000f\000o\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+257 0 obj
+<< /S /GoTo /D (subsection.11.31) >>
+endobj
+260 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000s\000\137\000C\000h\000e\000c\000k\000e\000d\000<\000\040\000T\000\040\000>\000\040\000S\000t\000r\000u\000c\000t\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+261 0 obj
+<< /S /GoTo /D (subsection.11.32) >>
+endobj
+264 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000s\000\137\000C\000h\000e\000c\000k\000e\000d\000<\000\040\000C\000h\000e\000c\000k\000e\000d\000\137\000N\000u\000m\000b\000e\000r\000<\000\040\000T\000,\000\040\000P\000\040\000>\000\040\000>\000\040\000S\000t\000r\000u\000c\000t\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+265 0 obj
+<< /S /GoTo /D (subsection.11.33) >>
+endobj
+268 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000s\000\137\000N\000a\000t\000i\000v\000e\000\137\000O\000r\000\137\000C\000h\000e\000c\000k\000e\000d\000<\000\040\000T\000\040\000>\000\040\000S\000t\000r\000u\000c\000t\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+269 0 obj
+<< /S /GoTo /D (subsection.11.34) >>
+endobj
+272 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+273 0 obj
+<< /S /GoTo /D (subsection.11.35) >>
+endobj
+276 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000M\000I\000P\000\137\000P\000r\000o\000b\000l\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+277 0 obj
+<< /S /GoTo /D (subsection.11.36) >>
+endobj
+280 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000N\000N\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+281 0 obj
+<< /S /GoTo /D (subsection.11.37) >>
+endobj
+284 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000N\000o\000\137\000R\000e\000d\000u\000c\000t\000i\000o\000n\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+285 0 obj
+<< /S /GoTo /D (subsection.11.38) >>
+endobj
+288 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000O\000c\000t\000a\000g\000o\000n\000a\000l\000\137\000S\000h\000a\000p\000e\000<\000\040\000T\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+289 0 obj
+<< /S /GoTo /D (subsection.11.39) >>
+endobj
+292 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000a\000r\000t\000i\000a\000l\000l\000y\000\137\000R\000e\000d\000u\000c\000e\000d\000\137\000P\000r\000o\000d\000u\000c\000t\000<\000\040\000D\0001\000,\000\040\000D\0002\000,\000\040\000R\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+293 0 obj
+<< /S /GoTo /D (subsection.11.40) >>
+endobj
+296 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000<\000\040\000P\000S\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+297 0 obj
+<< /S /GoTo /D (subsection.11.41) >>
+endobj
+300 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000\137\000C\000o\000n\000\137\000R\000e\000l\000a\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+301 0 obj
+<< /S /GoTo /D (subsection.11.42) >>
+endobj
+304 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000\137\000G\000e\000n\000\137\000R\000e\000l\000a\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+305 0 obj
+<< /S /GoTo /D (subsection.11.43) >>
+endobj
+308 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+309 0 obj
+<< /S /GoTo /D (subsection.11.44) >>
+endobj
+312 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000w\000e\000r\000s\000e\000t\000<\000\040\000D\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+313 0 obj
+<< /S /GoTo /D (subsection.11.45) >>
+endobj
+316 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000R\000e\000c\000y\000c\000l\000e\000\137\000I\000n\000p\000u\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+317 0 obj
+<< /S /GoTo /D (subsection.11.46) >>
+endobj
+320 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000S\000m\000a\000s\000h\000\137\000R\000e\000d\000u\000c\000t\000i\000o\000n\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+321 0 obj
+<< /S /GoTo /D (subsection.11.47) >>
+endobj
+324 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000T\000h\000r\000o\000w\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+325 0 obj
+<< /S /GoTo /D (subsection.11.48) >>
+endobj
+328 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+329 0 obj
+<< /S /GoTo /D (subsection.11.49) >>
+endobj
+332 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+333 0 obj
+<< /S /GoTo /D (subsection.11.50) >>
+endobj
+336 0 obj
+(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000s\000\137\000S\000e\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+337 0 obj
+<< /S /GoTo /D [338 0 R  /Fit ] >>
+endobj
+340 0 obj <<
+/Length 1288      
+/Filter /FlateDecode
+>>
+stream
+x��W�v�6��+��)uN�  "���:�{\K�iKl(R�8���a�&+iv=^��t�M
$Q8�\"�3�T�N����mFs�=���@
+�E�I�$��	�(��4�DA��j:z~�iB$���dz����';�t�!�.�8�
��c��Ҭ�8��R�M�^�3S�����]�	R�(
�,�=�{m~
s����M�n���_R��r����1*
+��(����0����@.(l���I�s����M_wm���k���]��lo�J���C��+�]7��v�W�-!d8W	TOb��B�rFi�P�̟ܞ��I8�0$
ϕ�ȐZkꪎ�A����i�X��`��Ck��q��G�޶:Z���S�ޏ	N�V7͹��
+U<���-BrD(S�?�(�=vV�z
�
��"8���n���<�̧0+�>�{����KT(
�x��}�㮮��#�,w\?D���oB+ )�8ޝ��_um݆{2�X@$�bRz�E;7C�nu_ik#�"�=E/t�[>>v�.:
����¶u���.�̐����2RN���3��g��p�Fo����!"G9����Bu���F>�d�w#
l�Nx�	��MV#"
%V��d��^g�P
A��0����bhlLIW&����v at 7"��mAh��v|��/0[�qy���-�uil�
��f���,t��
(���Z;:a#���;���,^^]�[�Z���iV��ui�e��t�ʆ-�G�]�%����P����
f��~p�^7up� ���lGx1��(��������&��䋧7��&S�=��;��Ξ����v��[��[�-L�
+�נy!6 ��u�F�y1�)�uyz�Zm���G~�=
����5�|��(H�$۵vx�N�=�@��Is���֚��.�}��a��-�m_��#��
?�
y�0����Sj����oߍ�ٝ.{'$�p�3�k����:Џ�*�7��L�otU�7
rx�,:Sۥ
�2�����8]��ֆ�X��7� p(l�l[�����|2
e�+U�
�C��q;{�Q��c�
�Ġ��ǘ�9"��@G=
�Tك�R�:8���8g`�Fn��F/\�1䴯��	1���W�қCA�N
1"@|R
+�g}/V �T�#���O��U�6m�6NCPm�R��N�V��n{��_Ev�9"Ϫ����JE����;O�
�G�<~-
y��D^V�a�h=�QY�ͧhsR-��9�kG�����:`ѯ�����7�|��?��.���O��\�����/�_Cm)�endstream
+endobj
+338 0 obj <<
+/Type /Page
+/Contents 340 0 R
+/Resources 339 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 355 0 R
+>> endobj
+341 0 obj <<
+/D [338 0 R /XYZ 90 757.9346 null]
+>> endobj
+342 0 obj <<
+/D [338 0 R /XYZ 90 733.028 null]
+>> endobj
+339 0 obj <<
+/Font << /F52 345 0 R /F25 348 0 R /F39 351 0 R /F40 354 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+358 0 obj <<
+/Length 2947      
+/Filter /FlateDecode
+>>
+stream
+x��[Ms�8��W�TU����u;�����N�f� K���Ԓ�:���  
+$��q��A"�l<4
^0D
$Hq���G����P����9��m�w�����R�F4
+w��� A	
�����/'��ٟ�_N1�

p&�rYxt���������ߣ����`�r�K<�F$Mi�x�)3���w~TE����0O7
t�2�#�T7�������ٜ
+
�AQ�(��J#�LT�Uy�UM�
�-�e��oa�oU��V5����	���*��8A�I�"�U㋇�Vo����1+4�uV���6ӕ�C��\Έ�գn��<?dk��<�����
��幧i�6}�U�y]�e1�3�C	D~�Wˢ��򁄲��p��4�D��X���3��5�2[�e��?����Y}o
��}7��]��*c�}4�K�w�:~��Q%�U�u�"(Bq�v�l�~Q�y�ʊ:{#���?3BH�UuWOUU�,X2���a�l2]�?Yl����n��A�J>��W$��Y!,RD�@ID�"���+0�~��{cn����,�І�s]�5Or薕.9��(!�*F�<��q�`�uV�\o�?%�$|ʛ�v
�,5��X�֬��,�ób�1D�J���v�@�u��
����Qg}Z�E3_�^��Q���8�d���
�=#�z7��U6�ɻ��/�Gl�hj4�s�䱪�fH�H2W���
_6��ꡝ��Xmvk���y1����z ���F1O�eÁ$	E�RDBz%D
����͕5����~�
RׯD�NL	�0�S����
+Y%I���:�	��7	Bĕ
�)3�l9\�D�T_Zɂϻ�K��amM& 1K@&ʝ�Z-
���
e����)$�Ҫ7��5�QD���}�RD�%+�j��SI��R��JR�vC $\֪�2(n�
�=BF�~�� ���D�Bֽ1�_q���l	��
2�"�$��Ie�&йތ��|d dJ!� I@S`� P#�NK)V�Je�^6��Ui�r��V�r+�-�"��-�K��d�	$+&LJ���K�|j���Z҅��,m'��4�՚H����{��{���>�� ��^#N">!R���~��w
��HI`O.N���u�Ƨ
�˛w�g�l��?��>q6JP�8iԅU��a���6���m [����R-��[��/Bk]Y�J�B(x(��)jy'�U�o6�ۭ�����n�F*��ᷳ�ϟo����.��9��:�X|����0\e�Ҽ��Į8Z��K����v�+�⡖�V}V%j����������Y
+Dwv~���
*�yz��8�����ԗc�q)a
_�"
.��ߜ��˛����'H�q�iLZ"�ɻK�F��j�谕
+ۇ;������Y�ڻrW�W
��e�7��)� ��&/��G+�&G����&���
�w6_�C1OS{.
�Gi�x:w��2�0?�[�3���a�:3����������2�1؊��n7o��9��f̽�5�������To1y�aGf�	;���=�b�.�&�O��mS��3�mBR xV����gC9\iJ-�/g4)�
����*p�0I�>b�,� �9MP�!�+Xm>��=B;��F
���/L>-��4[6�*s��b�|Øh�	T�P�9f}X 7��u
��'�X�;����޼T��J��q�GD{�~)W!m��/�઱R\������Z��ٯM8�c�_���9Ҷ)+��B @M�K_c5��FR��C}Ut

�E��0�޾MDZ��#KA�E,���Y):2MǛ�^��c���*������l�M��3V�(�`Q1@�C/{

��v��HG>���w0A�a��A��嚠�SG�r��O��]'����r�O��jn�yH
+�D��>�9��

�E���޾Mݱ���Hd*M&�k�u���U���9N
$���u
C�Vc^Zk�	�4�P,�����Jı�YD
���MF,�q�����1��'�h�#M��[�N�
,�HQ�i�p<�Om5��[�`�
+�d U1cg5F�[;���ͱ�&,��u�1���D33���m��0[��y�_e�������a���ߙ�,�
zh�涙������I��M݆Hc��h9[�[;�~�
k�`Zb��1��"f2<R�,���SV�Yөf�T��w��`�؍{詭&0��i�|�����&b�zkw��Kϱ�'M`�F�ĉgg��Nd��@ڦD^H�K[c5���\�+K���n"9��H����ֲЛ�G<��1F��8���;���E���'�|�Gy4�YN�T��B�]N�V`�rr��5	�h��8
F��%�
P���
+���H����Ҕ$��W�5��*_��-�Q���nȽ`���$��]���d��tl0,9


�[�]���X��)  ��5V��Tq�[I���(ŰR�x�׫�&pR�"��Q�+��XP-n����rSx�9����{N��Yfg���7o꼸�1�����	�R�v����	\�|�)}�j`,��j`4��������c

� i��$���fg�Y�k�巛����ۇ��f���Rp؍xV�j
+�Y	���������`��v|0\or0�w;ڠ�����H���"1ES���^���#��{����y�T-��v=���V��1�A2�G`%!^��cж6
�i5#I��?P��0lP��������
�s_h@�0M^��cж�C�!۪�����5�y^7���(
+��DCu3Vh��aJ= 
䜼$ �����^6%t�?���&3w#��W��7G\`���\��F��^��PO��!�`��08$�:><�G�m���$�-0#��2+�� ��̿��M�U�����}�bg�H��a�s:
T��2��,���E��d�GW�g=�(��"6/̭7�%�}�
��y��c,�����;#K/�
�~2�I�疸u��������Rendstream
+endobj
+357 0 obj <<
+/Type /Page
+/Contents 358 0 R
+/Resources 356 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 355 0 R
+/Annots [ 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R ]
+>> endobj
+362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [385.063 672.7083 490.9468 683.6123]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.fsf.org)>>
+>> endobj
+363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4258 650.8553 322.5851 659.7019]
+/Subtype /Link
+/A << /S /GoTo /D (GFDL_GFDL) >>
+>> endobj
+364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [231.4645 619.2185 337.8767 630.1224]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.fsf.org)>>
+>> endobj
+365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [440.112 607.2633 513.9963 618.1672]
+/Subtype /Link
+/A << /S /GoTo /D (GPL_GPL) >>
+>> endobj
+366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 597.3654 169.8699 606.2121]
+/Subtype /Link
+/A << /S /GoTo /D (GPL_GPL) >>
+>> endobj
+367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [219.8063 511.2194 383.1936 521.1172]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 445.4149 244.6089 454.3911]
+/Subtype /Link
+/A << /S /GoTo /D (section.1) >>
+>> endobj
+373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 427.8105 204.1113 436.6571]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.1) >>
+>> endobj
+374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 408.1288 256.4045 419.0327]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.2) >>
+>> endobj
+375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 390.5044 224.216 401.4084]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.3) >>
+>> endobj
+376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 372.8801 202.0397 383.784]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.4) >>
+>> endobj
+377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 355.2557 278.9603 366.1596]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.5) >>
+>> endobj
+378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 337.6313 260.6992 348.5353]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.6) >>
+>> endobj
+379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 320.007 234.0287 330.9109]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.7) >>
+>> endobj
+380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 304.4399 237.0773 313.2865]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.8) >>
+>> endobj
+381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 284.7582 292.4192 295.6622]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.9) >>
+>> endobj
+382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 267.1339 260.5891 278.0378]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.10) >>
+>> endobj
+383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 251.5668 187.2445 260.4134]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.11) >>
+>> endobj
+384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 231.8851 245.9041 242.789]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.12) >>
+>> endobj
+385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 214.2607 199.688 225.1647]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.13) >>
+>> endobj
+386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 196.6364 181.3869 207.5403]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.1.14) >>
+>> endobj
+387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 171.0867 229.0868 180.0629]
+/Subtype /Link
+/A << /S /GoTo /D (section.2) >>
+>> endobj
+388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 143.4997 252.1306 152.4759]
+/Subtype /Link
+/A << /S /GoTo /D (section.3) >>
+>> endobj
+389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 114.0098 173.5459 124.8889]
+/Subtype /Link
+/A << /S /GoTo /D (section.4) >>
+>> endobj
+390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 88.3257 165.4464 97.3019]
+/Subtype /Link
+/A << /S /GoTo /D (section.5) >>
+>> endobj
+391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+371 0 obj <<
+/D [357 0 R /XYZ 90 463.9829 null]
+>> endobj
+356 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+396 0 obj <<
+/Length 2724      
+/Filter /FlateDecode
+>>
+stream
+x��\ko7��_1��F�4�c����#�6�����m!���jI�$o���̐��P��I�(`��st﹗璗�(���)
.�P�0.������ߜ���}~
���\|-Ea��T�7�I�����O�^��|�br}��仂��t�ܣ�����I�߸�b���N~�7��w'1�E���#b
-�'�2�����;����(8�
Y�3�����@�������sd8��S��<D.h����Q rf
|������vC&�"E�)b�=��� ��F�"����O
��3B�T2��
+����U2�=�$��i���b�*�_W��ĕ��6 

�4ks�b�,��yyvN����n��{V��E졯�����b�O�/5��>?�����׃�<���d���v�#eRR�6�n"<(C�(���-6O�9�T�!�W*8=[���vd�
+��T���y�H��g�-T��#��.����� ��>)��'�Hr*h�*ԣ�,�������6�3q�.Y�D��T�:T�S(Ԙ�Sm�Th�RG�o-�˪X!�GV+���;� pt�����
+d�OM�E�C%k#G���=q�?\�U%"U��U�Oi�!��T���Hj���T��W�����
����F]���+_!
ҜӃ� ��iʷ��բ}��?.��n�[�W]��
3���
�����(&%��:�Qb��:��@
{T��}
�ESų����6�v������q��1Q
���xT� �[ynS�f�T��f�GU
+��o-���J!�GV)��6��p�z��Cp���~
.T��V����T��>M1/yp�它���*_�1�p�T�W��������r6}��wW�lf����f�]��N�^�o�M��W/�68eW�6�N�*Ú1����M�OUb`
�%�o-�
Wb��p�I��>!�� �9ɈˣqѬ�./����|����z�=Rj�z5vŏ����Q����1�M;�O#(�H2`<}kծ8yN:
-iw�¨�d<��
�%���
'�0R����T݀2�B��"��38=q8��Iq�Z����
tx\����E��@%GR�"ڍ��q�ӌ�"v�8AjP6��9��gj�H$�f��3���QuB�
���X�����j�-wu�,
���
�hA:�t�t������1�N�Qk ��`�}k@%A;��`
1c�L3�'
ԨhHc���������ׄ�Nl"�R���VC:�ev�k�$aD#��n Ϛ��;9S��\>��v�e��p2�
�$�6m��S��&y��~�	�lUG|&�K0;#��m���\T#L6D�߾�/fӫr�[��1�
�ⴍKZ�]k����2��<��Lc����A�0z���$)��X�Hf7�"sZ
P�Z�H�\^^���M#����q���$��.�vA1�~�
���3����p+�?P � 
+�c�V-������qi?�MF
ՈB
���Բ&0��������Rf
�Z���Us��Ɍ�ԟ�<*�L�%bX�v6?���*̿k
�*�o�F5�TfN��Ѫ
�ի�C����ق��n�bb}yxT���[|�N>�:�^A`�=[����� ;+hL3G|�(H
Q�]9�����7���_�Mb֢n�\
��+~��Z���b^m:��F�I��;}��q
���Q�ts��`�h;�Y
���a�][���9���:�Ƶ0*snؠ�ס
����v�X
�'�
��;L�H4�����lӨ�h��\���Ѓ����lU㤒��o���@B�̹D at 522G�hz�n�+��m�ע��%7*D��hE�I��W
M�V��T
�o�b��h��� 
Z]+�����z��M���k�~8�v����ڏ߃���0BT+�q��	�r�X����wU���#ϱ�}��YQ�Ra�ɠ���6���Cp�ǔ�
&'	�:�a�I�-MX�6���r)�?�^J`�=[��xRL���j�I�3+��D�Qӈ����v��K,<5(�~݉c�$z������g���|@c�R���[x<�녍����<a�d1���Ӡ2Aq�0�
�{)�� ��ڪ� �J ��T��a�
��W?F	�����q�ﯻ�p�Z%����]�3�l������n����Co��D�
V����;�"؝�
+�����C`��c���#i"��q��=E at y���B��vNX.V.݉3e��d������4Z
T�֌�"�U⽑�I)��.���s��/d0� N�j�V-��
+�7v�ٮ=�x at yq��\/��5}�Y��+yzh
f�?ɼ%"��"N\4<*�_.%š�v���!H$��ѵ�hP�<�����!�H�9�	(/C���כ�rz�v������bu;u�y��q�a�E"��Y��D��[�|�

�c�0��-H3����*�����\~�׌�k�rul�͸@ʶE�*q Р2� �f��
 ���ܳ�	�7r21�{�ك���R���3#��Zb�߀� �m�[��>�d���b����*��� 謺�6H	�쫰uId�}����M��bۓӒ���b��ɸ��zw2�kڐ �peZ���6��Ͽ���/gB�6��a�z����	
�,~ۅ#�R���*���cĮ�e�%}�%2�vZ�`���鯅��?���ΣOԯJ�(�]��n�pyq���[4ߢ���a���������0F���fżz�A�qi���NT*�[\�����/}-V����=r���\���@v��endstream
+endobj
+395 0 obj <<
+/Type /Page
+/Contents 396 0 R
+/Resources 394 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 355 0 R
+/Annots [ 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R ]
+>> endobj
+398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 721.9695 163.7232 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5.1) >>
+>> endobj
+399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 692.4597 180.9283 703.3388]
+/Subtype /Link
+/A << /S /GoTo /D (section.6) >>
+>> endobj
+400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 674.7009 192.7638 685.6048]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.1) >>
+>> endobj
+401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 649.1512 155.4838 658.1274]
+/Subtype /Link
+/A << /S /GoTo /D (section.7) >>
+>> endobj
+402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 629.4895 192.714 640.3934]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.7.1) >>
+>> endobj
+403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 603.9398 155.4838 612.9161]
+/Subtype /Link
+/A << /S /GoTo /D (section.8) >>
+>> endobj
+404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 586.3354 168.4351 595.1821]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.8.1) >>
+>> endobj
+405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 558.7285 206.3926 567.7047]
+/Subtype /Link
+/A << /S /GoTo /D (section.9) >>
+>> endobj
+406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 539.0667 226.298 549.9707]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.9.1) >>
+>> endobj
+407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 511.6142 221.8745 522.4933]
+/Subtype /Link
+/A << /S /GoTo /D (section.10) >>
+>> endobj
+408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 493.8554 325.6744 504.7593]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.10.1) >>
+>> endobj
+409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 476.231 385.9875 487.1349]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.10.2) >>
+>> endobj
+410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 458.6066 231.7572 469.5106]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.10.3) >>
+>> endobj
+411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 433.057 196.43 442.0332]
+/Subtype /Link
+/A << /S /GoTo /D (section.11) >>
+>> endobj
+412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 413.3952 360.9814 424.2992]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.1) >>
+>> endobj
+413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 395.7709 416.0402 406.6748]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.2) >>
+>> endobj
+417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 378.1465 389.9025 389.0504]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.3) >>
+>> endobj
+418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 360.5221 434.176 371.4261]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.4) >>
+>> endobj
+419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 342.8978 399.9906 353.8017]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.5) >>
+>> endobj
+420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 325.2734 364.4485 336.1773]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.6) >>
+>> endobj
+421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 307.649 474.8194 318.553]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.7) >>
+>> endobj
+422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 290.0247 355.0239 300.9286]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.8) >>
+>> endobj
+423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 272.4003 389.3448 283.3042]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.9) >>
+>> endobj
+424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 254.7759 449.6675 265.6799]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.10) >>
+>> endobj
+425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 237.1516 348.3984 248.0555]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.11) >>
+>> endobj
+426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 219.5272 382.7193 230.4311]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.12) >>
+>> endobj
+427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 201.9028 443.0421 212.8068]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.13) >>
+>> endobj
+428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 184.2785 487.4416 195.1824]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.14) >>
+>> endobj
+429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 166.6541 427.1082 177.558]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.15) >>
+>> endobj
+430 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 149.0297 464.1893 159.9337]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.16) >>
+>> endobj
+431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 131.4053 394.0376 142.3093]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.17) >>
+>> endobj
+432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 113.781 346.715 124.6849]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.18) >>
+>> endobj
+433 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 96.1566 381.0358 107.0605]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.19) >>
+>> endobj
+434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+397 0 obj <<
+/D [395 0 R /XYZ 90 757.9346 null]
+>> endobj
+394 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+437 0 obj <<
+/Length 2817      
+/Filter /FlateDecode
+>>
+stream
+x���s۸���W��L
�7O�
ΗKs�8n����F��L�9Yr)����]��
YP�9vf:y�%��>
J,��e�fFb������>��/X}���
��:8�Q����ή��<hFg<��������Ջ�ˣ߮~�$�	e�g�so
��
+�����y���/������as�}��0kyvw ��/���
~�
��TH
+a(�

Ir
���K���m˜QI����
B��A��-��,X�$2��ѱ��GL
�˻��b��t[ܔ��ϋw��tz��X�|�.g��6�����z��lg�m���1g��fS���x_����w�� \��v��
�V	MR
+���]Q�	����g��ǣ��R��}��8��6K�������y��H�8�F�6����W�m�l>{
���<��Vd���_�
�]��������A6�`���*xL
�����ܐ�i���<=|=��fd�$
�"k4d�[%��~KY7�O�t��nd�0�c
ց[x{S�2nY�<���p�qp�Ίr���R~=�Ij<jО2���
Q�V	�h"]�ё�
 ��5 ���v �8 at h{]��h�'ʭ�8@��$� tzz�����5I����z��rD at s��
��V	=���= h�<⾯
+
mo�
#�B% �V
5����@��Y��x�S[%4�K[�3�]0q
<���/

����`6�8+���z3���
+�s�K�Fd�V	!�j"h��J�'���	
�Wʼn�r�wشUHYK��T �$XyN�DN�`ӭa�LU�x�
�QB�4�(�z�F;
��D }_�a726�x{��sB
M�Y���<=�7vr�-��vt�奶J��KG��//���T��W�O�,��7�-a���Y{#O��@ϴ�U��r����$���%�m1��o 
���"ZqA����$�,�Eee<bD�����?�8X,���k�1�����ʤ�:쾭�-�_?�n��V��xz�z���֜�T}��Lwud�aqw�
���U�X��Ή���:n�E0К��Lu�zO�@�x
}_�h{S��v�F$��V
��W���mq���!��!�Sbe����8ɉ2&�^{z�>��(g*kw�p
�U�W%ω�w��ϟ,�X�x�}_;>�hoo*�@�2<Q
+V�O���t'k����q7;�{W�����}��ͿB�3t�)iB�������l޻
�u�6p���*���w
�X����go�s��4X g&����YdH�$:g���l���΁:2a*�f�
�
+��&N2�Hlɂ��
+Ĩ��|�]���gW�ޔ�ɁsC A̿��KC?+-�vF*�U��Ci���c9D#
��}U
�(�h{S9�T��	
k#O�S���b^�^���,6��z�Ga t2�T֊mX�F��þ�
+֑�s"�AS����56���$�Z@��Č8�x��bvQ��-��/�
8��W��T[%�Oht�>
����8�U�G�AۛX��.��4�G
V
�G��g���cHE�-r�^[%43N[�SR��j�AE
|��
+$���i�V��)o�qpq���-n qkTd�d9a4������xĝ`$����K�@3�n���j�D�J�C��L�{����X����r���1�"��D��;ܰ�I}��,�8Mys��X����������%��=���2��
J�q�k��"O�VF�>�
+�=�N�~ɤ�G�ALD��U�=��ۛ���3/.M⡴`�A
q0S_�.���j~,n\v�&��R�F%'ҭ��IRq
�d��ۈW7��,w^yTiX������e 94�<QjY!E o���'5ذ4�/6*}O��WDW������Z��>*X���
qvv�^���b
�\
�cQ‹�Rb ��㗒��X~$��������k�|��Jtn�g:�;
C4��!
N�׎Dݑ��M]F a�R$vd�ʣ�Ơ���z+��E 	�����E�@�QB��n)mWÓL[���T��׎�<�4��ԩk7�yb/�</|$//�ɼ@~�.΋���^���LM�
�f��%�w�ۛ�
���X��/+ϋ����
��%l�5$�[%�"5Fu�n�*5`�+
��0�>܁�7#��0C�8�Va�#���D	���{|(���@<zՇZ•RMĻ��:n�E�2;�S�����<������\DA�{j"��_*H2�z+�#��ŵ���zY�^���{<&)�Cb
+����"'%�UBE8)��x>
����8��HD�ۛʑ��r�xD Xy�F��\��7�hٛSM��U�v��\���s�g�U��ó�


 A ��
mo*�\nM���(|�H�8s��-�%�=�2���[6�v����4歎�f�iLIBw}�V�Lk^��)T��W�T�셷7�)��6<���P�8<��c
�.�J����vdC��UB�+�(�fG�󮥢��P�_Wѳ���\�
>���(W��se��j�T�B��
b�4Q%���DG�SP��	��j�*j��,��������RV���QtOj6��b�ߏ��
³vx�_��Y%T�T�#���>�Ɔ#T���ڞ�'�h����Qh�i���Ǵv?��bz_��X:���R�����W��|��_z5|Ջm��/GJ
ִ���
����_��ճ�e�h&�J�˂��`��f�� N�bd�>�]/UW��_�hĆ
�>Q�̙iI
�u�o���ӓ��?��
yX-�K�؞��/O�����T����� �N�K��֢y'�����wk?�/V��ݮRM�_�
��?�X�Tendstream
+endobj
+436 0 obj <<
+/Type /Page
+/Contents 437 0 R
+/Resources 435 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 355 0 R
+/Annots [ 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R ]
+>> endobj
+438 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 719.9123 441.3586 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.20) >>
+>> endobj
+439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 702.2879 361.5194 713.1918]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.21) >>
+>> endobj
+440 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 684.6635 325.1461 695.5674]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.22) >>
+>> endobj
+441 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 667.0391 371.631 677.9431]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.23) >>
+>> endobj
+442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 649.4148 415.9045 660.3187]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.24) >>
+>> endobj
+443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 631.7904 369.9576 642.6943]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.25) >>
+>> endobj
+444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 614.166 404.2785 625.07]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.26) >>
+>> endobj
+445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 596.5417 464.6013 607.4456]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.27) >>
+>> endobj
+446 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 578.9173 370.5253 589.8212]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.28) >>
+>> endobj
+447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 561.2929 414.7988 572.1969]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.29) >>
+>> endobj
+448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 543.6686 457.7436 554.5725]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.30) >>
+>> endobj
+449 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 526.0442 422.0178 536.9481]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.31) >>
+>> endobj
+450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 508.4198 513.9963 519.3238]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.32) >>
+>> endobj
+451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 498.5219 169.2324 507.3686]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.32) >>
+>> endobj
+452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 478.8403 468.6526 489.7442]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.33) >>
+>> endobj
+453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 461.2159 382.1418 472.1199]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.34) >>
+>> endobj
+454 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 443.5916 363.3424 454.4955]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.35) >>
+>> endobj
+455 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 425.9672 378.8345 436.8711]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.36) >>
+>> endobj
+456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 408.3428 454.2268 419.2467]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.37) >>
+>> endobj
+457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 390.7184 443.1483 401.6224]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.38) >>
+>> endobj
+458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 373.0941 513.9963 383.998]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.39) >>
+>> endobj
+459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 363.1962 169.2324 372.0428]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.39) >>
+>> endobj
+460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 343.5145 451.2274 354.4185]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.40) >>
+>> endobj
+461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 325.8902 385.4892 336.7941]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.41) >>
+>> endobj
+462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 308.2658 385.4792 319.1697]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.42) >>
+>> endobj
+463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 290.6414 352.8222 301.5454]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.43) >>
+>> endobj
+464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 273.0171 410.2517 283.921]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.44) >>
+>> endobj
+465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 255.3927 367.0487 266.2966]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.45) >>
+>> endobj
+466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 237.7683 468.6225 248.6723]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.46) >>
+>> endobj
+467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 220.144 349.6939 231.0479]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.47) >>
+>> endobj
+468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 202.5196 340.0798 213.4235]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.48) >>
+>> endobj
+469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 184.8952 384.3533 195.7992]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.49) >>
+>> endobj
+470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.9477 167.2709 361.6685 178.1748]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.50) >>
+>> endobj
+471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+435 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+474 0 obj <<
+/Length 3255      
+/Filter /FlateDecode
+>>
+stream
+xڭZY��~�_��h�+.��I^⵷b�S����EB�����ק� A�����j�
t���������{��x~�˪'{w���O>���I𗗧�߄�.���
w/'9B�X�븻�����|p{�^ԢKK���>=����t(����pT���"7����//�>}��a9/tP�>���A�o�l�K�`�
+�r���UO��J�����z
� ;�M7p���:�-����YvxjŽm��3���J�@r �] ؍QK�xQ
�O

�d#�a잝x/zƙ4�á��#��A�`���	�)H�զ�^D�q�Cq���J����a�ǡ���_I��&]MM_}�Js�S�QaP쫴.ڱT�@Ks��z�DWdK�U�4�0;��
�3\�
w��5��~;�v�� r���8޾m�z詭�N}S	B�q
�з
�EAn�
+���DI����D݃�R~�W�Yd�D �i&,('1��A+Q��CZg�
V0����&���c�v�RC�T`R� Nd[6���0J�׋�2/���ضM�(`3*[	MlA���I�q2�=%�6�	������z�

�̙uf����K�.�}+���<?ug����IM0;Hǜi�v\��Ww䝬}!��V�:K��BS=�v4
+�
 �4f�L�P��v���y��i�j���*-�W�o/0 �t)a�D�S�<
+dN�
�{�^�xH
��ٶ�L�)�^�.E!P�y׾9
�OYS�`��uh�q�-�˚;�m[���.�3��}Q�Mr���/ܟ�:Ӗ�0أl�EFmmל����heZ���,z
���٥k�fd�`.+9�p}ݭ��q�F`64YSʱ}�Fiy :�g���
~|�
+Y����>��Ms�!�K3�/���GCO
p�U:4���@�J���@ �x3�r
9����ʮ�o�n(2�
5ô���pR^�R at s.��\SY��-dt�1 ڊ�$
"c�K�S�(w+� �Uu��F11g�+˪��B��Dq�ok�ulJ��$B0+Ӿ��4j�5�T��,�r�����@T�K������`Z�;x���<ȋ~N�e_Yi�M�9o�=	��F���W��rN1Xe+2�^���e� ��6���f�
�4�`ZE)�k�f����Ap���f�qѐ
��P���G�6��4�T~��յ]Ɛ�C�o(����b�L�p���9�:�/�q�k6��>�V�`oi����o�H at Y�<�$s,��׬'=*號OM	��
3�r%�����$�����ˌc�����4�\f\7X�rl�,!u�䨩
�8��pηXA�h�c
�B�yy�=V�f��׮8�
+����IĜ[��
B�����5w#�7DZ"��2(�
C�O4�ِ��!��w��3�oki${(Q�ie�Ȋ|-��I�h%�tm
v1���
��=+`�㚭ٞ�s��
�-[Sd�mm��ak�|���|��!�d7̯uZ�Z��b>�ez,�3-�aT��\���7��,�b0�u2���z
0��Lه
�5��q`ٰ߸��`C1��b69N�y�W)f�W)����0TD%ނ��-`\�gA�6��̌=l�WO3$�t��Ę��`���E����pǏ�k� �Ҍ"{��-��f��j͘|�.��wPQD�w��!����ٍ(����Q(�
k@?�B�w�o��T���`g���Tcg0]BG���M�Ч'�0��6���H?s7�#���t61QP��^�և��VY�����[�%5=��Rz3��6����l�� �R�"{��-����j=�|�������M潐m
*��
�+���չ!W)���t�5ɾ�8zI����Z���?Q5	��Vd����h ��W#m�]"
[�7�z�m���Gl
4l.i�/�m		
(I�Eaڇ���?F
f�k���@jh�O���+��o�� �f��5�*x�v�
��*�sm&#�APT��:+�\�J� ��B�cuTC���c�
#8
F�* 
+�����`K���8J�櫵`�I#;�]|:�bh���MV0�u�2�MV�v������M���Xʭ9�?d��v�x�/�>��+9��W<9�ai����&tb>j��1��	���а]��P�/{�c�k�pF�To���7\���1 d�:V��Z
i,�r�jm��v�@�)�����Z����vzF��rj�9#II�fRhL�;
��W5k�v�I� ��N`l9�"{�[

'�櫝��;�_
ش��˗���8by���F۱��߈�����1�[

0��j0M��`��`=����>��{7�,'��o�M�
�5�C�79N(?�P���?��g��y!�ȓ���WHk��R� [��߸�[�*�ǐnq4 ��!5�jH[
+���� �*~hE~r�ll��
����a������;qЇѸc
�T'�<�{?Z�]_]������z�h�@�o�5}Y
+w���E�\�VK ��R�R�b���������NIVtD�����L�No�BӍ��a%��9��9u��#�9�s�/�c�����^
��"����G���uQb���x�A0��#ں�F�
+|��9I`ٮ?�����í�ގ��������CI�C��5�Z:�\��
i��܎���5RDV	b��K	5�#E:�UJH�_���)E��=��,�ac��7޽�QW>+on<�B~s���:_�����H��藍��S~����
+�;
Y������,A�#�� ������8�S�IF�kWD�!�xn�o8��;�Ưv@,���l�M�i��
JCf�x���,�&��eG��a�̻#_�M�գ�@�$����� 
��J�@]���x�Q����t$ hܞn�8�W1����㑢?4)x��
ε\�S��o��]h%�������������

*�^����8��T+F�5 V�Wr���
+\Xo�`�A����a�m+L�s��ZiF8C�;8�x��p~C��H }S��枊d~Pൌ��Dj�X��_�
+��, +Xf�Bp].r���X�u�VOoH;�("Z�A��<S����<6���c�����pq2�{t���%�Z���������q'
��遤L��؊�d��Ovl1�+7�bu�y�`^��
�	��i���0�p��n�@T�q#Ax�I���6�0�u�(���;U��XmU��у�|FƔo�ʼn_��������W+뭱.��*��m[��ySfې�BF����&��e�o�V��L�kNG�ƫ�;�g�+��m��$endstream
+endobj
+473 0 obj <<
+/Type /Page
+/Contents 474 0 R
+/Resources 472 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 355 0 R
+/Annots [ 477 0 R 478 0 R 490 0 R ]
+>> endobj
+477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.3506 641.7246 427.8181 652.6285]
+/Subtype /Link
+/A << /S /GoTo /D (main_convex_polys) >>
+>> endobj
+478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.548 191.8697 337.1216 202.7737]
+/Subtype /Link
+/A << /S /GoTo /D (main_use_of_library) >>
+>> endobj
+490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6 0 obj <<
+/D [473 0 R /XYZ 90 733.028 null]
+>> endobj
+475 0 obj <<
+/D [473 0 R /XYZ 90 712.582 null]
+>> endobj
+476 0 obj <<
+/D [473 0 R /XYZ 90 712.582 null]
+>> endobj
+10 0 obj <<
+/D [473 0 R /XYZ 90 712.582 null]
+>> endobj
+479 0 obj <<
+/D [473 0 R /XYZ 159.6282 183.0677 null]
+>> endobj
+14 0 obj <<
+/D [473 0 R /XYZ 90 167.1161 null]
+>> endobj
+489 0 obj <<
+/D [473 0 R /XYZ 377.7576 89.4414 null]
+>> endobj
+472 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R /F25 348 0 R /F74 482 0 R /F33 485 0 R /F10 488 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+495 0 obj <<
+/Length 2827      
+/Filter /FlateDecode
+>>
+stream
+xڵ�n�F��_����h<w��b�M�M��n�ݗ�0h���J�BRqܯ�w��"p4�9י3�B���,��D���bs���Gx�����5̯C�����J�HP"�\�>h
� A	]�n]DWk�1^���z��/���>+YS��x�՛*?6e��$��~����_��ˡ`�(>]��^l���/0bI,O�I�8\p���������L�C�
+�^")eK����XYo�CZ4N�	1A��o
Ђ�)G�'Dc���x B�Q�
+��������3=F�r��
�#T�DđE��Mj~�Y���1�`7��� (	'BZ
�
����
+" Q�$\C��l���j-�X��2C���G38V劈��
D32��
+ ?��Y��
�f��uV{ލH�����U�/�t,�0_�	��}�v���R���* ��1Ͷ�����mvY^�ữ�2̈́�!{���eS>f m���f�1�5��O;qL+@�dU�Q�e�`�+���+)��x�-�J:�2��+FmǼ��O��<(��
I$9n�����w��)QD%�k�
8ǒ'��G=M��_{��8���"�RѥE0��pL�(r��D���ԛ��N}���(�Rp'��;�����u��e۪,z\�	�7���C�i��M�3d
+ �q��f ������0A��f��Λ!��
�xD�5��8�a5�I
�" �2��7�������y�{{uw�K���,��)v���
D
e�"�/��p�E�����73x�dZ	k4��.�1
�
����*�������W۸�ݰ�[���i�DzH���h)!T������D����P3F�c��L� ��[; ��������[��݈�C�ޖ_�CT M_l���oI�<�EO�`��t��f������YnZ1�Ohc��lm��M=N����6b耵�U���1
�IMx�}tq�3��3�r�p3��t6f�$�ti���fqP�f�"�zD�
�
��	�JݢD�n�S��I�y>��!��}W�Ya!e�8p	���Yć�w&
�����Z�7�$X/�<�O3��KQ��c��/��P�Pn+�ҏx1�]Y5h n�c�nϢɋ!$m�5�d��$�Q;W�{��b(Q^i�)K��p��~ �.����ee�.��:��_����]��A������<>�[����'u��e�锛t
�K��M��S&�8Pk|7�Y ��8[y�!�h"�����f�.�a`S�Wi%�`�
�N��r�\p$$
O[C�)����]����t�8����i [...]
+�x
&�
�ȳ�
+t�Ѷ�u��]_�Q�Ӧɶ���=�=]e�SU����Y�3�P�3J�{�Z���j1�5CA.ڮ�ۂ���}��8��Au0q�<�������P����)mqw]�?����|�*U�
��1A���\���!$���Q
t'�Ƥ
<Ԍ%����(�X�G-~��2�����8�כ��ڈ�֮Ӫ��$=�}ȶ�M����J
��
4�/5�yc"�+j���VP���ID��f�@����
+�|�?
�^�?.�z����N1���񘉣8��¡z3�]�6B�X������,�96�%�K�
�	�zeޞk�
��
+Č�vk������E�mBѪ�l��rW
�*��0۔ӊ��q���#��w��&�Cjw"�-V@h���<�^�#
=8�sнhUw#B�rn[f��s*r��A�1oM(��6�L�
�����yЁ0
6U+�G�wa1���z2�L�	@����
Qq�2��B���u�p;0��T7�S��Z�n]5���p�5m�Ku�
3
0�����8��X�ʾ��A�͹�i�=Y ��jg:�e��:6�#Av��vӓAD�p�[��m|�A�z�t��� a�J
h��K�<�륂�D�:N��@f��Xa���9����Yo��7��8f��<a���+G���V{D
��
�]�كG
<�����n���(<
��2�IU��@u�
�X6��mDN���>���q�x$:iw
$~ ��a���N�b�U>Ϻ.�
lG��{�l�"3��F�C��:��a�dy�H�i��YN���,�
a�o�(m �0�"A6�c�	;-�Z��'�����-��HA�\m�d�	��N$�$��e'��
��ե^k_
Ϫl� ���G��
/w�
+t��xQxo�+��hh�Yj]-�–�
N_'jV�ZM4�yq���5$p8"q[3O����S��j�f�w�\�]�2�0�.�%���+>����#���H@�v���jp�R�Vyk���+�t
�N������͍�p����BJY���ªO�cY�T�o*ZZ�_h%�y	����L0�&x��<a��.3C�� -��1u�m~Ȋ"�o��f
Q��F!���l^�)����t��!]S����C�� �T���	
o�� S
+q`�
+��(d��WHHwSfJp�r8+C'� ���N����jV�)rgi��:aC����R��Z���}/$Ti�
��#Ӽ�˟��-b�v�z��-`����u�P
�U�>3��?��UZY���:���bi
��⤾]3���6ԯswC ��B#U|C泯��_w�#�� �oi����p����[�V�r�Y�
^%��i�__^>==�M� �:V(o.!����1���ׄ��
��KK�
S��-^
�IL^�$Pgz�ˏ��s��?̀��endstream
+endobj
+494 0 obj <<
+/Type /Page
+/Contents 495 0 R
+/Resources 493 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 355 0 R
+/Annots [ 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 511 0 R ]
+>> endobj
+498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 646.681 190.1246 656.5787]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 626.133 190.3433 637.037]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 606.8304 187.6893 616.7282]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 586.9051 229.5324 596.8029]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 567.0745 169.7565 577.2611]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 547.1492 142.3039 556.9523]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9567 451.4073 268.2606 462.3113]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 388.9805 247.4651 398.7836]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 368.9606 337.1289 378.8583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+496 0 obj <<
+/D [494 0 R /XYZ 90 757.9346 null]
+>> endobj
+497 0 obj <<
+/D [494 0 R /XYZ 90 733.028 null]
+>> endobj
+507 0 obj <<
+/D [494 0 R /XYZ 496.0736 304.3618 null]
+>> endobj
+508 0 obj <<
+/D [494 0 R /XYZ 90 287.6347 null]
+>> endobj
+509 0 obj <<
+/D [494 0 R /XYZ 505.6068 211.9525 null]
+>> endobj
+510 0 obj <<
+/D [494 0 R /XYZ 90 195.2254 null]
+>> endobj
+493 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F33 485 0 R /F10 488 0 R /F67 370 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+523 0 obj <<
+/Length 2228      
+/Filter /FlateDecode
+>>
+stream
+xڥYm��6�>���ήZ3��x���d��.�T�n�>eSS2��T0p�w�����@0 &��J�P�u����7��M�61��4��&�ܡ�	^?�a3����+�����?#�I�4"���Yi�p�&����[
��
#���������m��Du]�gz�A�Y��]�H��dKw�<~���~
f�,������~�m�����P�	ۼ� 8M��rGIh�����z�Z0g��އ4H"X��	(b��#�'0�&tӋI|!�Mm�Vn\��{�5\L�E����Ԟno�CU�}ι(
0Ex�hG�g�[7ڇ����vq��0ۊ
J�]Wy�r'�=1
`"`)ej��Y�d�h��mE�F)۾���'x�$ؖ�~s��A
��Vv<����Ua�E�k+������aG���G��;�=Te�5
6m�ˣ�ȵ]���88&���1��/B�
�M�׺��N.��~���`�L�Z�@���5�w(	X�Yq؇��`;!�$�0� �Z�ε1�#NHǜ [...]
+��e8>X�u�
�q{�����(31kvhy�lG�g�[7ۇ�����vq��vO�W^�Q<�B�<�� �
��5
��[R`�bY�#���&-!��k]��h+
ef�@�0z��/���U�"Gx���
hn���Yޚ��KI�3EFqd�j,+̡�~��lՀ�����_ �
��җ�xTd���jk�U΍���e�鷃M1
�B�j�.�G�i��f�ڀ�&�g
+S8_r[eE�L�@ӛg�3!�w��^���w��yg��&�׵U�M���/;
��؋4�o����I�
;84���%�=�\�EADB6���J�_6��C�a��)�*#��sA8M�6_R)I�8����0L/��0^āaVp-Ìp몸�ű����C�z�Q��֎��.Wu�0h����d�GrX;��%A–;g��E#��D��C/h�B���Ƿ;o�
���
�<ͬ�|$�_�TB����v=�(�v#���@'_"�
�
S�Z����.�"�)2��
�$!�\5b[R�h`Ix>u3����	��T��B9�rB�$�����
�&pf�vH��x�e�h?u�Ar��ܟ.dj
3gb楧�Á�X^�z��3�1[M����b�8Í^����-MQ�f��N�=�Ij��$�����4	�K�$2�=9��9���0	R
���=�n��?-��>��h^z�B�H� B���P��
m�"#x�JXA��0B���kf>.95�ۊ�;m��	[yĥ�uzz�տ;O��'G���5�x�!�[8�`��$����2�
��b�d��^���+���#ԥ��>o�fN�ɤ��*�B��r���N��|����2"�
x�~�{jw�fl��
��
��^���
�\+�7�]\��$��1n�>�@�����
�Z
fi��
W5�A� j$@%d�W�
�q
Ĩ'�7i�*h[�4�Eq{ʊ
+�փ�i
+�E�� ̷��I�ed\
�90��U_%
H��⡺�G�
1l2�oU)�(\<�'���$�'U=����F)��@��E��I�g�h}ΔЎ���%�˧m���>Ov�i`��f�#��.+��]^�!���
���vUNj���T�
��p��B6��P����AWX�)8n`�btt���fʍj��fV�@�|
V����E��_���C�)t'����Cw�<�ދ�
��?�W��>�����h���,�_e�f+�_���I
�2�߳�&/[c=�*�^�K	<��7��F�
\a�:�9�Vh�M�'�Z����VU!����'��Uv�s�1�߿�QqVMxCy��pu�SV���[/�S܅0pqU����l��G8�p�֤�����7iޫ;\��^���FvN�Y�v۾��Ј�d���*y-�=�R=�� �O
c��Wg��E�o���� �Lu�'
+�8L�_��&�ߥ�Kxs1��i�����pK~�kE�
����yy�$)�^�/p�U�Iby|����Y��Hˆ
���g�ا����������`�+���s�����_^^��
���� ��뺸��"]~
�No�
������4����
�/+��b�l��g��3U�endstream
+endobj
+522 0 obj <<
+/Type /Page
+/Contents 523 0 R
+/Resources 521 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 534 0 R
+/Annots [ 533 0 R ]
+>> endobj
+533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+524 0 obj <<
+/D [522 0 R /XYZ 90 757.9346 null]
+>> endobj
+525 0 obj <<
+/D [522 0 R /XYZ 338.8742 665.5904 null]
+>> endobj
+526 0 obj <<
+/D [522 0 R /XYZ 90 648.8633 null]
+>> endobj
+527 0 obj <<
+/D [522 0 R /XYZ 510.4979 486.5654 null]
+>> endobj
+528 0 obj <<
+/D [522 0 R /XYZ 90 469.8383 null]
+>> endobj
+529 0 obj <<
+/D [522 0 R /XYZ 292.5682 359.3462 null]
+>> endobj
+530 0 obj <<
+/D [522 0 R /XYZ 90 342.6191 null]
+>> endobj
+531 0 obj <<
+/D [522 0 R /XYZ 90 316.7202 null]
+>> endobj
+532 0 obj <<
+/D [522 0 R /XYZ 90 296.6605 null]
+>> endobj
+521 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+537 0 obj <<
+/Length 3450      
+/Filter /FlateDecode
+>>
+stream
+x��ZY��6~�_a�˪�����#Y�b2�9'��LyHC��n�ʒ�#N��"��)[-���
Qd��W}��h� �.��D�'<��Y�C�WW�4/�}�
+|qw���P,?	Y���j
!��lq���Q�]/)!��./��z��->���NvM���w��4y�U��
)�=q��ݷW�wCL���oW?�J���+��$�=��&	[���Kq���_�
l�L
|��R��!|>%Ei�'$
aR�I(�aRs&F�s�� ����N�G9��Ӆ��Ԯ�:�F�]
�1
���4�Vm�n�*�w�l�lWi���n-�_� �GUώ���j�,�N(=7(2��?��1OZZ�OKƈ�8P3�'B�����r��tDp?Jb>��� a�H�?je��+s#
�{X�K
4rW�.O�:kf�'ጉ%���A2��mUdϲ�#?�a<m	vqL��.���~Is%b�-}S�Z�,�>^�#	�{�X�j�xЍ�
+
��k�.-;
���w�ca� ys����e��e���FEyd��e�v`C�3ݠ�
Oh�\�ػ�C��
`�&U���rS��ZT
�e��`��8�ٱA�hl��UX�6��2æ�hQ�
+�w��mL���k&��y�.���h
T���
4�v)�G�ؔɲ�p�@ ����ˆ��WB֯�l���A
���
���r�fۗ5���/��r��N-�ZK�`���^�_tGU��9�:-�\�!��v�f {;
��v�>�;
�#�����|�E�G�H�y��V�ݮx\]���c�(����[����U^v�mS�f�#�>��b�#0���f�G��M
��s�wXJ�nq
z�KKCҝ)m����b$�)��-��m1+v~���=l�c�Ol1�nW�UQ�直Xm�����9��g�d�<bs�E�x*�l	ٴR#�� &����5@�e
���G ��z�gM�*��2 X����@��Bd*7���yB�vX
��Ji�^�=�!$D�a@�9� �
l�4�m d6i'K��K0��}Z�A
����c	�,��`��������8B�0�,<8��
�
bgg�� 8'v�gd��3�'�~��
E��6k�nu�Y�k��/sA�L�dB�Z��ź�@���w����
?��������9m���=�V����\.�r^n�f��G�S�w�fs`��H����a��|E=5�?�
���9���	7ƙ(�R���դ��ԍl[�i�+�����H�b'�W�k�k�� ˃s^��y�;ﵳv [...]
+�� x�
���M:@�t}��N� �J(���P=X�ol."r�F�����!�(JCMJ@��l
hWu��(��6Rpb/r�`42�	��By���U�{�R��� �=Xmw몘�x�A
�e�.�*��8]E? z��=�2�)�� </Oc?��,�+6����Y쟷;`���i��M�M���*�^��F�FT���Y�p�c�*N�Z��;K��&Z2T
<ܟ�a�q�S��w ��Ī���
�_~�W|���7H��j����[Ͳ���T��h�}M��I����A�BO�x>�:E�
lR=�)�o=}�X
͉gɡ�¾�6
^N9<���Ы�Ҩ�D!n�(p�-�#�Ő�$���P Ws
��=��hK;G!�'b������Ikꨓv��p�hO'�a��BP2����^
+k��(��K
�	��Y�4y<|I5N'��j��k��W��{�ꛍt3a�
����
�l mx�U��U�=�>U;9�@�w/�|A��৯?����!�i4ПnA[ļn?�s-���T|��.q�×X��7w_c����X�����N�#�x?���l�����@M�`^>�$�K��.0j�ݣ�M�tg���������6�؄���_U���tX��m	-�
�E-sS#yqԛ�m7�	��
��L.+M����V_<��Ua��>��61���N���_�����?����}7��$�u<����
�Z1թ`S��9�:ou�T��S9C��^���uqx�.O�MGlȀtV�s,�
aґ��j����Q]��g�	J�^%,�F���Wx�l�Ұh��7�` Q��YV�-�]�ȣOq3��-���D݁�F@��
+���
�}��E��U���l��K�y�>
+mk��
����7�<�
�g����P�m#k� ���TN}Jі�{���/M/L_Ƃ3+��P'"�L$�)��Եx?�a����
b�7�i��w�3V����~�4��A�$a�/����m-#�u� �[���q�f�� v����
����i�>��~�q����?
�܅%� ����Aq���͉j���M!/��'7�
���M��rb���
�T�����1�
2���
+<�I�
'_��O�w
�@�J`~�*4=�b��>/7USW�����3n3$��Ѩ�ƶk���i�s�LSj��
b4i�W��=k�A>;�|6��9
�4�'��
���
�
�%
+TA�)<�P�A�}����?��
5�37?��p88Y'���oW���AfMUN��ՍHlɻ9*k��&�b�p��!��
�ьvD��'	jm���@y��8��>������{{bѭ����ƽ
4�W��S6'�g�Z�5��n���;{o&�=	�(�
�x����f}(u
>,'v��>�J�glf�nB��(��1y]��ٮ��^Uq<_�yM~x��x��{oV�l&�a�$d�{@s�ZQ�%\*(�����ᄃM��j��BȨ��D)ױ�<�˩�n����M�����5������Z�|��Z��a��� ����F:Eó������e�qhD6�Ua�O�����jk��9�%��x�$�O{�L�7�+'�j.�_ag�00åTjb�<b�x����5��+�s/�|�d��F}#۾���ONܱ86V�Og/`!��ZoQ�p�J,��˂�ڐ|��!l+�e�E�z�Duڶߙ���MJ)b�~�a��.�L)�bb���3���e
{mؖX]�Q4K
=
�p�m�;�k"Lٟ7؍rȶ��I��A�M����$议)�郍P��?�&0�4�~
�Ga�G4�.��������v��Ra�?�L����6|�����I3�[��M���$}��=�����m
������,R�b�.��<�G� ��Y���,l��`����
q [...]
+endobj
+536 0 obj <<
+/Type /Page
+/Contents 537 0 R
+/Resources 535 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 534 0 R
+/Annots [ 542 0 R ]
+>> endobj
+542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+538 0 obj <<
+/D [536 0 R /XYZ 90 757.9346 null]
+>> endobj
+539 0 obj <<
+/D [536 0 R /XYZ 90 399.1919 null]
+>> endobj
+540 0 obj <<
+/D [536 0 R /XYZ 90 321.0235 null]
+>> endobj
+541 0 obj <<
+/D [536 0 R /XYZ 90 266.7654 null]
+>> endobj
+535 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+545 0 obj <<
+/Length 3073      
+/Filter /FlateDecode
+>>
+stream
+x���r�8��_����b 	��>�
g3I�V*��I�h��Y�H
IE�~�v�^�)e�i+��F_�
M��b�Y�y���6g|v�o΄�>���.�����k�f��Գ���SR��r�e.��8�����>.׋s����B��v[.D8/~���N�
�"��s���|{�jِ�\)O
$��ٗ�|��ޞq�E���a™�"9ۜ��s�����

�0Ƅ�
�A2�,�p|
J�E\kP����o�dGB��SZ�0T�R��x�,�=1�"<����K��,��ߧ[&�i�|ۧ���U�Wu�y�W
�
�hȾ�1������
+X a�O�&)D��"}���8G@�#�_?�a�Rdn��]�K�U2E�
�E4A
�9޸|��|`��i�%�
�� 0�.o`_|^�'0�yl��n�I�Z����K�\�9-�أ�b�͒:�
h=�WE�-ʸN�n�.���R�l�NW���V�Le4�����
�#�7��"O:�� ��>��1�pЕ�(IŮBFqT�(���
ƕ�~�t��*Y5�Y'��-ᦹ̇�Q{�#ϛ�q�?�U��r5ϋ��c��e �����Jh�m������ifW�d�@(����.D�^Ӡ�&�
u�on8 eIUY��*`�~���;��
+)��%
HvtT��rŐ��FM�C����	���CWT�*����{����0�!t�Z���D8낻p&�¸�VL	
�XQ�k{��޼d��AH[=�2 �+��Ry��q��]���-�̪$��.�;rU��ہ��"6�k"��R�����f
�P3��FChQ��O�/.@��?��P��9l6

�8�.pc���7�+��/�y�!l��û˓h�V7EiG�2Y�U�c�.�+g�z��T���D����N���)8�_T��2��6]5� ���d��l]����;Z�M�m�oHw�f��=��
+�F��T���*�M�CB�O�>�J���ډ�O���g�]�'8���~mޯ�ʤޕy5�i�NWTFW~��d����Fa%e�T`�&_w��a��-����f�k�@
}Ĭ�`f݀
5�i��Y�
7�
]�b�A}XeI����'M1L�2�*�<)�+���m8��d�ط��l�ڏ��
Ko]Aam�ַ��G���[�K2+�D(Ŵ�
�]��I��#v���+vܮ&�v5���]u�IfR�I=�����R�y
_ at e��)fq���
+��~pہ�������5�hC
R1�ǯ]�/��y9��&��I����1��ч��
x0�˷��Cż�rHF�%A4!;벇�����]�7r��������>�|��/E��s��g�OWϖ��'PB(o*K�{��t8l\/�._,��
�^���~�b9EF��JF�d��w������@>�5����!ūi�h����¼�������	��c ���G�/��kW�����ƭ
+ZǨC�1
�`/::t�F��m�=�'��<ka~��9NM�"T�a�)
6�{��5
��	5.�*Y�v�̤��Y̧�ן~�60ɝ
�c��ֳ�t�!O�.
��8���.nk�������n*h��ta:�
���1z�ih�0����h�>��H��	
�H�?b���Ml��&��]zS���B�9��y@

ܲ

���`�h/�k������rsӷ��CVl�;�
>�	i�(Z�j
o9[��U��im�C
u��OӐ�h+��
+�^���|�;���
�k{5�I�G�nO���'�$��AG-8%�`�JGm�w:}?��j��v�Ib�
;�pǜGj��ƒ=X�0h��3w'��Ժ���~:]6�A&JWW��XT%vf�k)�%
wL��j֌��ƻ�@�#X�XyE ��0�z��@LD�R��>��4�ա:`�
+L>Mk{�]��7b�B��}�j�I���,���� Ѻ��~����"�=ZjS�؏(�܏tm��)�vT�-J;1�`�]6W6b�L�����[��c�p��\��
	o3.c�LYž�6 =�"h�����:�xw`�����v��?Nm?�Z�q8�L�Y�\�@$�`�4y`G
�F���W�
k7Kk�8�-��Xs���%\�'4������
ܕ������ ��윊Ǧ^4�:m
+Fh���ߧ���V�ǂERZZ��$��W��2vӧ��|��\��n �*��Q�c� F�h�<1�&`C�
B�P��m\���2�+0(�Iȼ�m�et]�LǃMu�d�i}kd�S�!����l��S�{T��I �G?qi�:N��U���`��/L�:>
+�_L���5<�@�[Hg��4�Z<waxԄID
��.rK�h
VӺr���i�[8�1�{��f�8H�1���5����-xCP��J
�)Hi�
C��&�~���`Z&[�N@�h��:

t�z�'����g��m��5�`�ˬ�>�	
�m��
Z�_t�
3�b��,���h5�����#J?nuX���r��
-�\RF����Ss�lR��dW%��/h��)z1�Dr����{�%g���
Kp��f����͈�b�L�����h����B���N�
nlcf�~-~����m��."���I�>. 07�Ѣ��7P�t
+|�kְ�O�ʔ�X̪!윃���)C�w�ct6�"
v��E���j<�Z�s¬�:N�&�|;堃��
?a9����
䉃k0�t�}��>�Tu۟����/�E<(�A�j)qe?��NygA������;�
��(��W���˛�<�0��0�+t��W�/�Q
%��Se&�#t����wߣ�@Z_�P�
5>����z�kTZ_DLi~��
�1��F������d6,'Ev at G�q�ȍ/
I���ũ�;�#L
��?c�I��;P���'
Ĥ�i����t��[
+�Gy��8�Z��g]��t��*�e�}�u�h�������M
��k�)��|�&H>�=�wqFc|�PX/�&l�
J
�׈�/�qO��^!�Z���37�G+ls�s���[����u�}zq���٪b�<ݖ,�/�\�8�W�Y$o����^z��9����./�_����;�����e�r�X�endstream
+endobj
+544 0 obj <<
+/Type /Page
+/Contents 545 0 R
+/Resources 543 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 534 0 R
+/Annots [ 548 0 R 549 0 R 550 0 R 551 0 R 553 0 R ]
+>> endobj
+548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.3533 93.3103 378.495 103.6564]
+/Subtype /Link
+/A << /S /GoTo /D (main_BRZH02b) >>
+>> endobj
+549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.4838 93.3103 415.5758 103.6564]
+/Subtype /Link
+/A << /S /GoTo /D (main_Fuk98) >>
+>> endobj
+550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [418.5646 93.3103 453.7524 103.6564]
+/Subtype /Link
+/A << /S /GoTo /D (main_NW88) >>
+>> endobj
+551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [473.6179 93.3103 506.7533 103.6564]
+/Subtype /Link
+/A << /S /GoTo /D (main_Wil93) >>
+>> endobj
+553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+546 0 obj <<
+/D [544 0 R /XYZ 90 757.9346 null]
+>> endobj
+547 0 obj <<
+/D [544 0 R /XYZ 90 344.3207 null]
+>> endobj
+18 0 obj <<
+/D [544 0 R /XYZ 90 339.7131 null]
+>> endobj
+491 0 obj <<
+/D [544 0 R /XYZ 267.9203 166.397 null]
+>> endobj
+22 0 obj <<
+/D [544 0 R /XYZ 90 149.6699 null]
+>> endobj
+552 0 obj <<
+/D [544 0 R /XYZ 508.2477 95.9055 null]
+>> endobj
+543 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R /F33 485 0 R /F10 488 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+560 0 obj <<
+/Length 4554      
+/Filter /FlateDecode
+>>
+stream
+x��\[s�u~ׯ������E.9����v�[�W�Se�aH
�������ˠ{� (�����AO�/��K�&���Ǯ
�2�'���Y��W��?^��z�y�����Z]9�4�Wn��������9_0J���M?�t�i���<_pEg���6�ǻv�k�
�
�33��߿���qUJh����՟�J����߿�D8��
�
%�9~�~%�H_V�~~���8��Ams����
B�iw����l
vv����a{?6�]w��[�/���7ͪ�E
+������f?����x6!ЛK"�c~�?�-L��v�l���?���c���o�"F
�
����W�8#,�0@%؉ �)�{��5"
7W������ñ�#��K�ℵ�q6�^,�u�ݦoVaC *�/lj�67q� :�������e踹
��6
�߯���P!
+�E:�uI��~�=�
��L��~��s5{h�a��nW�	ֻ7�%	�b��n��TP��f�Ym>>ε�x�f���ah��@�~�Y�›~�/���q�f;år����!<vC�M�eh���Hj]I
+}��
+�X��;8�/U�jf�U�+n�\�g'|i�����HA�".�
=x�t�(���pD	5�
�l)}Fk���T�1;��V��[�0�c�����J�i� ���@6*
��I
:|���X���^�B�>Ut[�5r�u��4����wAp�4�
�k�v ��p��D
+�ֹ@���n6��o�=~�^�٫6��*z�Yݯ{xb�e~����J�\I�	O���û�Br맩ᘂ��.3�i[�7���i����ã���0
+'HQ�.ǥ=��|�p>*	;���=���Y��9�K�J��+P�
�䤩�L�"h��� �����D�J��*�ѹN��3���y
��&a�R[Hh�Uf��o�����HN��N��	.Ǫ]����
+ �&g{ᰗͮ�����Xauf
���5��}�����G˕+�^��o��&|���m�^P9�.t:�����vRg���8���سY`��0�u�i����6Qb����}����`���^4����ρ�܂j݈���K�(U�j��"�C�;@?
���)=�Q�
a*��
+!aw}��_5~�����lvK���ch����c�(l�₏�W�w{���t
�Z.};H�Pj��_��i�1tA����#Q����f`k��3d^���C��Ʒ�s���'������!����:8f��s	�b�B�
�|����,4�p�K	bC�C�#�Hƾ ���@�T���R�إ6;�i��&(,U����&N
�x'��
抛��5
Ĉ8���`P���_�i�w��y++�)�,Q�����xp�➺�s�h
+��)�^�� ��߅v�[��r�.�Ku{��}��ft���
B���pM*�t��O��m�ұ�R��~�[Yt������u>'`�ƽU=Y�4R�(���
+�+�	"���o�PW���+�Ʒ�[ 6��
jp����C`���=�� :������1��-�}�_�I ��1yE���mJ?��p��|~3|��Q�-u������m
�_�_a/�p��9(9��R2
���LL�Ӕ�dD�[��C3�擦�O�����NQn�bw��M[�J��/�\���T��5{V
���Lo���%3=���\Tv^�U��is=M��2��
c�/�؅�x��`(����

�KR�e6ƫA�]a�>�J���B��"���L�#8A�VcN�ǜ�w�>�N�o��� 
nWM���m��]������!3�>���Wú��6�8�>��*.�&X�zNv
��fb�PaG��&����c&���ťԽ�}U1{�8���֌
f;I�e��h�U)$J�ę�"�[U.u$�m
1�{�YO����fU�<�h���
S�o�c<K�s�O�եS��a����A&��
a��Q�1en�7�es���d�|"����
+�f5I����MA�ͦ l��}
x at SԘm��5ՈM���E8�\?ѣXv�2�`�&�+��*m)fY���La%���֩�G�yxZ�D5����q�<� �\` �.��q�ui^<� 3ż>Q��}��i9���!� ��(�����/��4�Okv�ǩ�p����8�1ǀ��1�|Vi�v:SZcN(�pT�J;��Li/�ѯk� !:5̞����9iH�.Kù3i8?�(
��M����l������fHٺ���F�����Ȧ_
X�^�ϔ
!<+󕒃`\c>C�K��r?�v��Y�s�O�.s�܌���;r?��4�7۶!޿,�1>gF<
1��d��ِ3��rb��.$8�?����07Hn��m%�ւP at K��	��.��=e��� Y(}]M6(A��`	����^�R/C�?L����q� �D��/+ɻ�|N'��8����]��MA�S� 
+�ҭ��������N�}�c�:,��X*�<B1
+�]�v�j.��˶���A)
u����܌r�Ǵ 
߅3M�g�M)��
�
\}-[C�uI[�[f<
9T��/
+�L:�P<{4c8xW���\Z-��&1P�H���
����k�
��.�\�`��y��>���F��pW�>�	j2Kb���G����n��ݷ�`��V[@"�|7�}��y�P���jhӱ*��R����C�ǰ%4�[����p�Y��}Qi��?�7��*���0��:���IH�`JC�:ǃ�v�MN�V�I4�I���~,�I-��_�$&�\�{1��
�a�Y(l�ؤ�����SG"�Y�^�)L�2��'yB��D<�C��/t�[��C���
�!��H�i�9�m#���ym]L[��x�~(R+���g&����8�6XM�2�D0�ho�6�}�`��=Z$G����.�W��~�-�7��1�A ��#�+{��"S
+��E���|
���(
�hht|������q��q
��:�6�>�W
�������306RG
E�#��ҀT1�;:�_�؁��c�Te�r���?6�@b
'ޅt=aS�e�|���}�3�}�]<�|�-@Ӈ����Z�Rj�J��!h
+�
�
�������8�	a2av�.�ٟM�3�F��hZBR��� S���\p�D�t�r<\�p�V �ʟN*�`e�4�+���BhV���G%^`�@<�dy0Vxʩ
�9
v
��v��Ē�/��|ʋ�N�6�jY:!`d�I��X�lxJ�N�3x�n<�9��\�.x�g�
��8C���X�	h;@۩�m�0mx�5���hC��YǑ������@3t�C39���չ��uQnQ�eF��>��EJ�C"4��q�`�\�p�p��}�ZJ��W�6�z<��<.I�=³h�'__�%��%A�0����k���V��Fln�h;
���]Hd
+��e�
�ڊ'{(J�X��yEb��pnu?�'��\��L��!p'������,!ڌ~DD4q���8�q+�j��\�s����ͮMe�t^�I
��ET;\�Z��_H-��W�ٰ���a�������w?���U�N%���|���
+�!����݋6���
�a�֪��R�)痖�:Bl�aN��
�{�T�4dZ��7�]
,-g�[	�+n�$Z�5F�}�)��
m�,W�C�oR�MA at Qb1�W`����ٵ{<�
�n=��i�΁����,��3z�?���|����c*�����~�*�G�R�=!��.$	�}�>�����J	>5���O��,�{�` ?���c�1ë���R�E���R�u�R$���������@N
��N;�:�wb]@��v|얔D��⥤��j�����&��
���CO{��*�*
4#�w����f���
��
)4�q���f�To�pm�N�>���He�BR�&���3�@Xi��=��!�k��Y�pQu�Wݍ���Q7�A�/
!��f�f٢����І֌@�Ljx���6s&g��eȨ�t�ڤ�
�f��������?��<
y
�
)�~����Oe�4W��޾X(Î؂�OO��£+
�sfqg�9��z|��h�}�9^@BK>nV-�z��m�
��֠�O"��v��"5!��
�0
#bk���x)�
��_<�yh۩vs�ir
��㿠�W����2=�/�
����N���}O�6�7�V��/�
��Ĺ����d�Ri����\���^V{<Z���4S��Z�j�zaY�tdc�Mv����}�SG]�j�w	��sc�� �+/w��Ǹ��U:�d�ٵ�����s�_��?i@|\�ޝ�	��v�O�R��
�\�}=.S�k�F#uɹ��(���V�Q<�����S_l����5/�=g�(���ȇf����2����z������v���R��ǏM��G�����,�y�A���ٟk*�-
+*���\����u>�`��"��ͨ��Pw�߾}�����
���t�7`�
�4��j#�qo1v:ZKA~A�!���r��A���
+�k�G��k��R�� )�endstream
+endobj
+559 0 obj <<
+/Type /Page
+/Contents 560 0 R
+/Resources 558 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 534 0 R
+/Annots [ 588 0 R 589 0 R ]
+>> endobj
+588 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [287.0961 98.2435 457.6681 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (main_Topologies_and_Topological_compatibility) >>
+>> endobj
+589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+561 0 obj <<
+/D [559 0 R /XYZ 90 757.9346 null]
+>> endobj
+562 0 obj <<
+/D [559 0 R /XYZ 90 733.028 null]
+>> endobj
+584 0 obj <<
+/D [559 0 R /XYZ 506.2584 554.3846 null]
+>> endobj
+585 0 obj <<
+/D [559 0 R /XYZ 90 537.4418 null]
+>> endobj
+586 0 obj <<
+/D [559 0 R /XYZ 155.8601 360.6743 null]
+>> endobj
+587 0 obj <<
+/D [559 0 R /XYZ 90 344.0653 null]
+>> endobj
+558 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F33 485 0 R /F10 488 0 R /F11 416 0 R /F6 565 0 R /F25 348 0 R /F8 568 0 R /F79 571 0 R /F7 574 0 R /F13 577 0 R /F76 580 0 R /F74 482 0 R /F1 583 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+593 0 obj <<
+/Length 3914      
+/Filter /FlateDecode
+>>
+stream
+x��\[s�~ׯ�[���~q&�8��m�z�ę>�yXQ+k���bI��� �%�
��
��x�
�b��s��VlB��8:1�'��̗gt�n����3x>K;|����7ZM
q��ɛk?�fDq�'o�~�B�|�(������9��zS��նiW��Wt�^���vu.���9���>�{}Ρ��ᦾZWpK�����7ߞ��MOW$[	͐�_�~��N���o�(Ϊ�
���9�'�3�E�cq��ٿ�q��Bi�����O�Ϩ!�	51\���LXV��v��������]��b������[J���,
ε���l�bzW��-�K�cpg{�[^^`�N�x�ݭC���v��=�ã�f��v�NH�9��­۞��fX��1�b~)ۛj{>\N+\6�-�Ѿ��8��b:_���
+(R�+�*�n⫛�v��
+�ݦ�&66��vQ�Ï�vY}�
+�y��	��1��F$���Їщ&��"� �#�I�;Ʊ2�)��O:�
�`�7��] �ի���g���l<�f�i��6
ÂDV�.��y�\֫+�p���"

�Rl�k���ܶ��|�

�_���F�ن���v���!��|]W�n�j>߭��9�OT1σ�vg,*/,
�C�h���h�_��=��m�Y
+��%��y�
+�y6b�cc��SZ�&TiE�8����A�+�w
� �d�8�`�L�T�`�}cd��pH��.#?ƣ	C��6��$
��D\�(��6z��AƒA4W#X
�-��)���U�#��n���'�8
��/�9�=�ϟ
+��Q��g���t��0&m�4���|&��M�	��k��Tp�Q�l\8�Q.�4�MfI���`��ؓ�O�$
m#Q�s�Q	���=ղ�
+3:�=��+)�{��=)-(ب��	:}da
F�b�[�}a�h'\��-��4�'�ut��-�w�nץa@�c@$��z!i7ė���NK�d��
�v���8����b¥����� � ��Չ�f�[�
�&Z2;�xV�X˘�4�y��3�@:���^�Б������y��&�
��})�C��\w���%���:}�ǟ>X���K�@�5� C��S!>i��y�9�V�qY��涞7�={��C��f�M�wHI�
��4����֒�a
���q:��]W����*ڮCR3o�p�%��r���Oe�� �w�%�ն]G^��~T�jYo��<N�qLJx	H�!�P�E	�̖�J"=-� �d�Y�d���
ě ����4�]���ﮛm|�-�^����2t�
�>nV��#2|����~�t�����A�]�UQh�
�Q�
�
�<ԋ�/��{�E�F��߻��9��"�>�{q�hO��{>����
�-Q�/K����
•�Hal�@� ��9J5�!���g-zz���Au��;9�+F��Q\�8��>�\axN.�o�+-��u�+=����݆;!���M���g�98�ۆk�S
sHWfx�a����#�O|�����$��
+�GvGzW�v��((a������/FP�i!<�$4�8��Wmpu��Љ�/I��e�{7�Y�B3i:A@��࣐͈f�!fI�/��Dp��+��c��A��O����Y��E�����}1�b�<U`�EC¨�LU�����
��0H�/Ǥ@L�֕h�V4�%����@��`��ɟ����ݣݏ]#�kOYc6s�Ư~��b��8М�zWd�Oi;<_�
+0(l��0+G�O9 |2����}Xb��BS �k��
z&���
����$���|56�&$;P�zF��R�Ng�(0��(�������2O
ƨ�� ٝ��|�
+�Ĉ�j�V��P�Z
$I�ZCEL��D%��O���",�`�I7Ĕ�fY�r���`s���<�$ZI��=�mϋL��@_�����Xb�
C
+C2A����>��c�b���$�W6��v}�1���#�l
��v{
a�t���iLSo.Ig7F�����l���v�t��g���N
Rʤ���TV��,�S��e�J�=u�-�cyl`�w��T�2�y���P�
@��+.E\*p�#�4���c�����
+'�n�hcB8���V��,
(љ��R�U�
�
�Фʜ�w
�摎K
�� �,2*��!�,�Nx���s������נ�s��@�d��~�w<�q|Ù�f^-����2�5.��P�2�?��
���g�X��S��n��ӱuE
r��
��Y��J���}{6�p&
X6V�f`<T�x?6>����Jeu�l���A�

�1�����kθ4GK���;J">q�섃�[;P��q��-�3��
�C>#,�8m��C�mW�U^������&��iǚ�x:dq�/F�>;}<I��
 %3Ж��I����F���C�cVu��=Gy1>���&\qw�Fڡt\A)�܏㕅eI�b�ﳊ�3��N���_C��-IԫOAn�
���ŽA�
��
+v�R�n
��U3/i
�wϺ�w"��~���f�y{��b�
��Nv�8�`�b	P�:��!O��s'���yhmH>?UT:�t8
���	w��t�Y(,���DY@[M0�p��n�M�،�	
��7�t�jU�,�i|u��5
Ք,�S
�ہ�de����b5�x��0d�džL]�r���ƍhVʷ�
R_{��'
��X��
�1ѱ���:��{����
n�%������AU,\�yL�l�7ݶ7F�}�7Hߪ�Pު��Q���u�����PA�Ϲ��e�[R�vۗc� ��Y�����M���-u�SM����^enι��`��C_i<J8��pN��
+Oc^	��䤃��G��m��#�a6'�g~��Z� �H�W4�5�vN��2�9�a�K�絉G�M<rmh�
SS�ϫi��ϱ�/�g,ˆ�D��
+���*L��p���Y�}2���s|gV�JԿ�P.Ǝ���'TT<XD���JO�ē��<>=	'X
+`m*�s?P�g�z����;��"9�n��
+?P����k2�,oZ��*1Ua���z����G
+�o��T�	c����X,��p�.����>����c�S��d1in��
+C�����Oe�%]�e�Ы=�,����h���f���iCcou2Z]w?���j��D���dzr;Ԣl��5��H
�/C��0��@m��p
�OH����~�%���*�Br':Q�b�M�
�\w�6�.���S�^s���v^4I-�̭z��$	��Y�����V�x&�Bo��D:�t���@7<������%�s��H�N��{��1�Ij����vQ= 
��#\F�9�g�֟F4^}����pc
�B��b�6��e��U�;F$��y
�0a8�3���^R
�O������>�`�#�	�2����U�v����&��E�I��I�-Ԕ�
���3
���1X8r|�u�3��R�b�u�������۾�񢱡�`��%��[}j�,9F�:�_N�
?���v6��R�9S�8����L�O
+��R����� ���τ����{�pm/7�:Ď�p�

 $���"��J���i��p�
?�0���V��
p|���h�)�>�6��oCc{
2⧔�k�z�8�[��~���c#ZB��d�p�E_*�\�>��on�32c7�p�?����
+�*}\�<!�j�r�q�o�y<�7����}E^[b�ZRߧ9	��7]u�?�	H��|�?�k.��:*���`�t��4r�_�jW-�_��Zo��e �ޮkn:؎���hS�[<�2̸��2�Z��/�a���0@�3���v{��ٳ��;2ߐݪ�]�f���v�lH���8H0�Io�wђ�_R��unJ�u��K�8���|6��҃
�@�� O�~>endstream
+endobj
+592 0 obj <<
+/Type /Page
+/Contents 593 0 R
+/Resources 591 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 534 0 R
+/Annots [ 606 0 R ]
+>> endobj
+606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+594 0 obj <<
+/D [592 0 R /XYZ 90 757.9346 null]
+>> endobj
+595 0 obj <<
+/D [592 0 R /XYZ 90 687.0355 null]
+>> endobj
+596 0 obj <<
+/D [592 0 R /XYZ 90 682.4279 null]
+>> endobj
+597 0 obj <<
+/D [592 0 R /XYZ 282.0283 598.7756 null]
+>> endobj
+26 0 obj <<
+/D [592 0 R /XYZ 90 582.0485 null]
+>> endobj
+598 0 obj <<
+/D [592 0 R /XYZ 325.4343 528.2841 null]
+>> endobj
+599 0 obj <<
+/D [592 0 R /XYZ 90 511.557 null]
+>> endobj
+603 0 obj <<
+/D [592 0 R /XYZ 481.3177 371.7302 null]
+>> endobj
+604 0 obj <<
+/D [592 0 R /XYZ 90 355.003 null]
+>> endobj
+605 0 obj <<
+/D [592 0 R /XYZ 480.615 101.7763 null]
+>> endobj
+591 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F33 485 0 R /F10 488 0 R /F25 348 0 R /F74 482 0 R /F11 416 0 R /F6 565 0 R /F1 583 0 R /F79 571 0 R /F8 568 0 R /F7 574 0 R /F9 602 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+609 0 obj <<
+/Length 4389      
+/Filter /FlateDecode
+>>
+stream
+x��\[s��~ׯ�[�I���%�L'UOZ��:���$�&$�T
�����]pP���3
= ��gϞ�w.Ya�#+�WJ(d����^����/H�z
߯�|}��)VI���7�$HPBW���y	�Wk�1�|U�WD_�]�
�c�k��5�r��_�w�Ǘ��"����?{yEa���;T�)".�Տ��|�ב�@�`�X��u�������F�h�z0"�����S��\|�8������{A�9ۧ
a)X�}��^���}6��u�'�n���������7/���,�}#h�2�
�qC��/�DS�@Ja�혗Wk&�%�K�-����n�+��bڎ�k
� ��ݰ�@0�0�JF���������7�pλa ���p�R1�%7��pG�QD�D�i>�c���R1^�`�6�b
��.��`)�u+�wzqY�
w�Ce�_2�� ���
窑���T�?���$��� [��fS���<���1,������'��0
+�� ~)mD.U#qQ\�;��t��!E��L
~2`���aˇ?�br�����O�}������֔��?Uf�86�t�*�c�2$�XPe�Z'�~��z��To��DJp$1�'R0�2��	Φ9�ko_SJ2�t�T
w`�vo�lص�G
��Sq�Ւ��9�g
�Ĵ�'�$��,�s+&?�n��t]`31zA�����C��1A����3%�MJ�@��Q�/cs�s/��Aɹ�K?@g^��e�\�,��g�Ez��=�jܲ�WQ{_TQa�����U�%u�`ޟ�X`8D7�]s�#\�?Z��צ�c�6�GL�33��MȌ�� 4��_,	��M��9+�,�l�h���T�D�>��vJ�DT����1%�v�x�uv��@��$s�
p J!���#@�


+�`�	5�q��g���f�ήD
�����K�Ö�S�Q�5�s��a�扎S���i�+�b�O�j)�N!p��c�(��qW:`���Ö��܊���_7��tݧ�M�|@}({`��6� �
�fe���cnv��o)(�&:�m6
�o\���i�H+)�a\X)��
�h��";8�`��s�m�q%�$�@�F��˯�
(�#;{k=����)�#P?��@K� ��*n�
 ��XB
΅a�<�ۤ��ʥ#� �vo�;�w}8�6��s)V�1Ӊ0y~���G翢.�ϷU��½
��Z���Pw]
&�"��W1�#��p`#;�|��n{Ӵ�TĵK�O�C�������G@"ݱio��{�܈�t�3D���ۚcj�N�aRn�(�C�r(L	nYS27Y�ɜD	�

ּ�\�4̷s����*���s�ٶ�Ă
\�V4�In��
; FbX���
K/\Xx��Q���	\��Ýp�W���w]sl�����ϕJ���Sz��^�� En+EK
+{���� U��	-D���+J���%��	�h�%g��S߸�^�o{O
+�׺��v��
B3�P�K��Bp(�@.?;8� �HR,΀�b��2cm�(��K0�ɨ�
+���b2������_�ޢQ���.
$�i�K
+���!�KF�O1�GL��D#ͨ�M at 6�fl��6	�Z�78�n*dC���*�a����܁�+��>4�[���1��_
+��v ����7��S�����
�=�h��,�]��
��
��j; K�g@�!"/��[&D�X��6�n�CdTzZ�Z.������
����^ ��#��`hל�2�$�H��Oj8��pݺ*
��8
+j�kaӎ�����$N��
Q�\��}��.J4���A�&�i+C���xF�ʥ~�$'"�,MNdӁ88�?
�$�y �u����_�s��7vq��R��b�&��VR���o�>>�7uab���~���]�:��/m�F;�Q:zP��/@פ�C[��p��r�P=+t�E�t�Ò�09.iuU3a2J�� 	�1�}�
+�`
�=����;���m,y�+�z�VO�T�6ю�\�v��U��2A��o���Z�tŹ�;���U��P�P=#{���tF�Ԡ��Wp�0�f3!
`�)�@�E);
+f!;{����܂�@,a	�-Q����_hj_�Ηٝj[Kh�N�B\��Dg�_��_��@X�~�$"����� �6  *���B��P�$�q{�
)�O
+L��������|�'��!l���R�5�OV�w���~j>�ⲷې4��HY�'H�[�G�<'
+���zl HE�
~E�����	C��>[�D�82U��uE.4�4��1c����\�m�W။��y|�ţ�
�����sG�u��SC��'=>I"H�'=� $��<>X2�5�s��5��:��w�J�
+�q�W��)y$�����s
+g�CQu���q�o٤� 
xA�_�g��F

��)���O�N������'7a�~�aFg���r�O��&K~S��@D�5�m��}��l-@%-
X��X��C��
���8;�Z�H�;�ֱ�r-�<�x"ݹ��d+�Ԁ�]��e
���㦸���Cw6�ڗ�Bp[1������͔JI�
+,�������B�Ҁǡ��"�[K���o�6�1�C��tI
9M�<�F+%����
�o��������m�Ē-x
+�O�?~tGh�x�h����G�+�50k�^3�l��~~�^�q9���/
�/�ػ��%;	a�$��$��~��ȅ^~��vz�� �i�
{�z���a��Y%'������H��
x�<	����:�OȄ��'��
EC���
�wo�KB`�U�3'�I5�!���ݵ�z�?>�
�s��蹯ڝ�&�!�I� I��d���ؚX���Y��-����l�� ����f[-]uh�,B(5�J
+����R�G)xr��8�b�D�@�`8#
�BG�� n�*֟xn��>��b���sՏ��Q���P�v�
+P�۱��M��y����Ã����z&
�J��5Ѳ�&�pF	��V�&!_~�Xn�k�\�ޒ��_}  �����p�㡊ݷ���>"z��r���ɋ��1�=�k
�
�C��W
��b��!m���'�}�I�G�KmΆIL�4Lri�)�Dž����ـ�s5�Ēv��`k�C0ǃ�2��ݩĪv_C���T�Pit���әBm�
���*O$鼮Jc�!
X��G�#i�z}J���:��X�"�ؙ�
+�)�
,x���/D�,.�x����M�{���"7A6���l�T\���ޞ���A�u���S=�cP�N��������XMߗcQ�{���_�`�����1|���7a}	�v�`.K�B��C�bX.G3�'$g`g�lÝ�`aH3�/��6��N��3񪢈QM������W����iQ���m����y��Ţ�mr*
+�0
b
+�����D�J�pnB�Iտ�j�6N`�k3,f�m֖��"�m���
+B�Q��,x)$/!�31J�Ƴ)�1�����`�6L�?��u`Z�p��G_4
�Ch�tt!�^WK at cZu�� �*������V�M���
ض��>�`X;� BJ���ɂ�b��EtD8K� �Ue
+	
+�T�+�A4�������z�1KJc{}L�v
�r��D�a�J�f�WL)q�4&*
���L)
P[��tf�4E��ȺS�y�ϓ��$�t��y{��M�
+���y�&e�����{(�2~	kh�K�t��)��!|i[�ٌ��!������П��C��s$ð(ǧsj	�哾,OJ�RgMZ��zbNI�~:㠁'��ƴ�rCb.���G2J�H
�#��M)e�|j�
a_���OE��ŷD�$>��tN��LiI`3>�Q.E����J��<��L�N�-g��(�
�rBtD�;���C<��,�;�OSX�_5��W�T#Ft:"���"�݊3<���d �׻��M �_���ٟ�����A���
Η"��BeY��������O�w���D�Ҁ�Cb*������^˾/5�]��P*uҨaK�~��7έbl��3��9G�/�Oۿ�f
<�	
3
��S�u�f
��,G�B*p4�lu�K ��.� �����߯�
�."���5n����R-��j�H��Ͽ(U;�\���H�9�'3*l O�k-�!d_�4g1l[�w%tFl����$�_v�I��&�8~�Z� e���wT�
ץ���/���
C�7\˖�K���X]8lCT�2�/E����
��V���>��g�U�C�O$����C�	�T�?�T�Vv׼�}]��C5D��'����U��a����������y]'����ٳw�ޡ�=�������~�lL���P���[�A'�d��B��uFK|�|��[�
n]Z�鱯�H�/Gۮ+endstream
+endobj
+608 0 obj <<
+/Type /Page
+/Contents 609 0 R
+/Resources 607 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 534 0 R
+/Annots [ 618 0 R ]
+>> endobj
+618 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+610 0 obj <<
+/D [608 0 R /XYZ 90 757.9346 null]
+>> endobj
+611 0 obj <<
+/D [608 0 R /XYZ 90 733.028 null]
+>> endobj
+612 0 obj <<
+/D [608 0 R /XYZ 213.944 529.1766 null]
+>> endobj
+613 0 obj <<
+/D [608 0 R /XYZ 90 512.5267 null]
+>> endobj
+614 0 obj <<
+/D [608 0 R /XYZ 252.8958 267.8196 null]
+>> endobj
+615 0 obj <<
+/D [608 0 R /XYZ 90 251.1697 null]
+>> endobj
+616 0 obj <<
+/D [608 0 R /XYZ 175.2409 157.8632 null]
+>> endobj
+617 0 obj <<
+/D [608 0 R /XYZ 90 142.0155 null]
+>> endobj
+607 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F79 571 0 R /F74 482 0 R /F8 568 0 R /F76 580 0 R /F11 416 0 R /F6 565 0 R /F7 574 0 R /F1 583 0 R /F13 577 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+621 0 obj <<
+/Length 3296      
+/Filter /FlateDecode
+>>
+stream
+x��]���}žU
�Z~��tA
��&h�
�w�!Ƀlk��ɒ#�����9$Eٴ�E���[~�8�����-�� �J������o��,sC��
+�W!��
n�H
���ã9A�T0�n�?%0�[QBH�:�w4O��j�r��v�[1A�����ڻ�$��Q�T�q��
��eWm��8�"��oo���	�t
.�&�כ�~!�[�����"��0!)-
+v���w����Ϳ�9�a>�]_P
��`'�g<%Rpss�,O���Y}j�;&��V�I9L{���{�����ָ����M� L_
�f
pw���u����
����Zo�a-�vm�{��vk�
q�1M"�V����}`ȊҴ��{��S���nq.�Ǯ׃,�t��q4t���̱ ��@�2
t-�N
U��cɾn�}��"K��]
��l�2������s� �^_m��lG�n��/�v
��˱�ԟ�Rɲ̜����T�ٕ�Se��rO���2{
���X���ׇ�:�n���,�M�����d_��!���m���w�������*&`��7w��p�[��
����jS
�
+'C�7� h'p�
��v����8o KF�FӲ�
��}^���CoE�����s=���Җ�7�b����z�v�3!lSWZ̜�3^r�\ϻ����ZCcBf�P���p�u�\{B��_}��CY����+�
0�M��ʣ&�!�xsܯa
^q��e�pD�%Z��kZB$F�O|8���G�qօ��:񇻂�\��{�+�Qbb�	nj�Mx���z|A<3_	xX��@��:������Q�ֈ}
8C�'F�D`��5*�- at x#
oF
�I;y��}�(JҜ(e!jKS[m�a(��y��M�
�֑S�EGM��v�]�z��
��ӞĈp�O9�����MeY[[Y֣e�wAzJ����>vc�S)�����È��\ev��p���(AHJ��@Zw���KP
+)�w�<���𽝨��9����RjO 44"�r	
+�aHi/]M���n�1UO
S�!�S�f��(�1����6�DF
+P��f�Q�2� ����d*Ә�����`�#h�"�KG��S��2���4%B�e��NACs�|��ڔ=(��ι��)�)[����N��:43֖��F˕��B'�)��Ur��Ү�v�R��_����M��_�eS��\Q�Y�yυ4�+K1n<��4�

�gf�z
ǁ��9�7��]�=4j��a_6���zr����
�9.�8�-mm7�S��H+\MP�|
)�>��YZ��N����|����I���vz�$z�1D�S���]kܥ*-�������;�����
}&@M�9�L�F�Lѝ~��d�a�\��i���lƭ	�bS��������f�k�l A�d"H�q�g�"��pQg��d8}t��WkN�v�eJ2�dt@;�(�K
+��mbsr$iy*i6��ۨ��e�&��~�ǻ�$֟��T&�O��Fc������[������s��U�O	Gw�x�y
�	�@�����#���TQ�� -ȧX���T�brx�9�jB�3��c���Ԇq8�1^�VM[�r/83�!iU�W��W2�W�S��4 Z+�g�h[
�n��X���H�
F�h���W!v���ـ1؜Vω����;��	t8T�
�i%�
]�xQ�	���D���U�m�
@�&��5s���sm���Q���6�2C�""9���A���������T�Y�-��J'I���qw�=õ����S0�k��\?�e�R.��\�_�US�&�d	���&�0� Ǘ\�=!�y���f<ϦsL~��8�E!{*���=�5���D�9� �_џ��&
��[?�$���--�I�'q=�P��8_��1��TQ*.3= Xb����%�ӗ�z��xmp�O
L(l\|�T�0���f������=%wb�
"5�Tظ�G�eA�j [...]
+��G�
q�6^ې�jF�M	��6,��Q�4�Щ��P1
�H
s��
LqCͳMX�W��ډk�r�z��Ǿ��t��;K̝��Ӗ/@���M#�tue�wl���9@�n}�?Mͬ[��f�yEL�_�t�m���������
�$��po	�l=�&?�H
�y�}I>X"r�l=�HJ]�L.�6bə�R��['���.U!R����*�2�<�hJ��
+���
�s��I���6ϊQ���+v@��{�u�0}KM�'D�4�C-��sN���ocנ<�����~��_�"�ƸsW�Kq�hYqA��s��^3-r�r���(Ie�[���m.<�0q�U�:5@���
��&F�.�VG#$dP�0�X�!�a�DA�H�5��(�\�ƀ
�����+�
���gQ]C���ĸ���
�������;��>��
�����o�a��.��u	{}]b��0"��siZ
^w�ȯV)E�W�kE
+(e*��r�,�K
�j���qʗ��u��
�"�kl�2L�ԣ�%�T�T)v�B
�����3	c��e���!^�NÇ܈7`��m�rg5�8m�;_Fb����=^|9 ���|�� u��?@E0�Te$��+��r�{�9dt��R��厢g��������ɡ��$��d�|�3hϟ
(����Y)~�<�3j��2�g�j;D�C�#�_.�����S4"R���j(9�
+�"쏔�~1�.���.��B�>r_Z���ܴ33ۉ����`��ȥ��
��|�L���諣 {�1&���`�t�����"ڥ�y����I�� ꏉgO�ԗ�:�
�K���7 Xr���]�8�e���xm��w�"%��� �ȒA�^����h >�CE�
+�0��4��f��7
X��<�g:s���Qw�A�ʊE�E>�y8��<V
b!T.�>"X��7��i	ˆ�/�xkBiq�
�%3p`��`	c`�x��x�^���Z��fIu���yѭhP �:`j
{I'��I�p�uRYe�u�!��"��
�B�^-��
�>e�~kQ��y��.�ڰ�ޔNI��<��& 8*��]?5�(�hh1+&���L�w�����ޖ���wa���P��?ղ���l���Ts�v!���J}Ŕ�|��cU���
+$
�;��~�u�N����/��*��ٹ&�
�Û�����t3�Ƕ>�i=���)]!`n�/Io��h��?#,�
+r��H�~o����2M�|�G�7=R�
Kx�endstream
+endobj
+620 0 obj <<
+/Type /Page
+/Contents 621 0 R
+/Resources 619 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 627 0 R
+/Annots [ 626 0 R ]
+>> endobj
+626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+622 0 obj <<
+/D [620 0 R /XYZ 90 757.9346 null]
+>> endobj
+590 0 obj <<
+/D [620 0 R /XYZ 198.7513 645.6651 null]
+>> endobj
+623 0 obj <<
+/D [620 0 R /XYZ 90 628.938 null]
+>> endobj
+624 0 obj <<
+/D [620 0 R /XYZ 316.3298 331.3262 null]
+>> endobj
+625 0 obj <<
+/D [620 0 R /XYZ 90 314.5991 null]
+>> endobj
+619 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F11 416 0 R /F74 482 0 R /F33 485 0 R /F10 488 0 R /F79 571 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+630 0 obj <<
+/Length 3558      
+/Filter /FlateDecode
+>>
+stream
+x��ے۶�}�Bo�N-w��!I��i�:�;�L�J�K�BJYo����&�®�]�3
�X �˹߀e3
+����Y�
+b�Գ���na�/W�^���x�o�^~���������;hFg|�f��}�`���?�u_
��
�\�y׺�/�!���kF��;7���Ä���^��
*圱��|}��7
��!4�^��3��쯯(�T�;�PŒ�ݕ�"t�W�_}�q�
֊�
ڊO��P��E��M��p-懍m����V~l���vh,	��ݸ�뮀F��j��

(��m�"	�ޯ�U��p�w�̾�6����n
XU��Z�r�Uk7�nS�Hb�z�1J1�L[��z����)MD�ct�k�_����32|^Ua^k���o��T����������Y5���v;����k�H3���p�o
 ������$���?��n�	N�5,
G^�1^�?���R��n�W����_��#U�v�t�"��i�,�i\!���簢Ps��9Ԯ7�u�
�a`߁�
n7>��T�1V��o7�0����I?᝟0�����(�4ЏH#�����X���F�F�>i=�
+�{�f �@caR@�BR$��͠
QV�!��"
9w��gx��?����L �D3�v�1�$L��,F�ϒB��e`Hus�J���j�Rtȝ"�b��ղ�^�a1�F�9�$R�p(�A��Y����g�;��Е�MUT_�(PVȄ�9>R0+acB:�F7���3T�`?��Y=NjIh��l<�_�ޑ�c�4d`EI�ш1Jc*. at H�������ή�;�%z�g�3��o�yǁwQ�>˱�q"Kcf�H����r����&������������^���g�>�'�1@[�f�T���ũ��
P��� 9���
�ƞ3�� �e [��P�5�k���������S�p��=�j�� S�
TF��0
����RE�����hg�f�#�Q#���Lx at qf
�Ju��Tw�i%��J�^I-���]�l|ఫ�5���u��nY{V�@ ��k������:.Z�3��sE���g�D0�L�OLX .X� �9a�l�r΃Ĥ4^�Dx��c�.M���]3X���ay۵�z�?�g�
+�*��7�|	�2�X�܋�
���z�4�:2�$�i��Y�J�R$Ҙ��!�&�zS��I��8"qH��`5�[A�A��S�wIy�����_  ��@ˇ
7?9n��� ͝M]�����(E(������Ao��hNN�,�2%z� �E��b�
Y����; �MJ�#P/�p�Qs���ąF��A���L���6EJ�Tـ� c����D<&De�S�n��

ש������R�y_��-�yH�`��|Ш�.M��j7k]�L˥�0ɧ�8}�!nҹ�Q���
N�z�%ȩq�D+{
+9�њ3�E!���+'�V$GQ�<���L�O	�%(�Jp�	F�
�Գ'�\��S�	�%���i}�
�
[7�$�f�
�t.�E�nd\�ҩNlݯ�m&e
�۲
+,����qw�=l���&�k��'�E[
�}���t_]qg��Ǧ��EP�C�&���?�g�úZw��2�t���G�qB<cD�����@5)��I�j�P�A�+�$zA�r� �X��ie�D�{H�!�?[�
��Y�%����� 2c�Q�K���dz*����Ǐ���ϝXW4����i1 E)�D"˙��y2�9?m0����L���BzEe`/J��u �0	

�L�R9
+�@��(���aR	W$���8

��x#�KOw�27��
лk���
+��AA
R�¤����� ����q���n��R�����
��6�
+�/�]��@p�m��6h8c �1Ϭ�ն��֍;3�rk�
	3�#$BÜ
���l@>���h�P>�!�W��Y
�U��"�^;p]]fm*�~�F��:-�&H�S'�1��
�U��AӜz���= ���<�ٜKh~PBrM��^z��L��cl���cK&�%�2zF�5(KL����x$���F�b����q���S�$�/�cѬ�l�Q?T/r0@$t�FeW�;�!W(4�>djM{B5uؕw�)�lXpb^Rp`R鏙Y��Z!���!	�ʎ�ϓ`�Uc9�3'��˒��/�o���@�٨���//��{d̻G��R�M2��W��%�4<�O�\
e0��GGy�Y'
r��S�Ã����� ��y����V~A��tá�����"���n]�9J�p�^ʀ����Xx���<e�U�#}$:�V
z���x �/���:�=�f��
[æ�%w��b�P�	�+�H�B=W&`PGN�|�.}�
��搻e]��z��3����#m����`���
�n'o�� ?� [...]
2��c�[�����U�q�׬��k�p��

;�-
+�9cӼ��q�G�(�s6Wum���ߍ�y�
��.��خ�I����d�#K�5�$��}��%m��
��P�N	��G}�7H4q(8��&(r� xֲd<�)1��'�c��N��{�aЄy��'hE�]���=n������앵�лw�}��aWa`�8lD�L��
����������.�s
$�Fz�٪
����e��|~n�r�Ѥ����<
$
�:��5(�� 
�R
�)�	6!-�1O��$�0Ez��`(]�{
+�&U��Lx�y��4�����
�8�X��Ek
�
$���]�d��9f��h���]�����F�K�2`.�|��ޢ���N�e8aR���2X���%8�
7M��ۡ�OY�^�S��k�">6Ô��5۪�ƛ )
�F��eA���v���]JZ�o
A7y[�`�5� iC�
&9c
+$Q:Z &=�3���*�ߌ~����T>���5�>֠ B��Z��!�p
��:84��x�6(�G�~F+�����`�t��b�Pكư���j�)�f�p��v~�x
��<�ۜi8W���d%Q¾$��-/��B� ���F�p`uҧ�J�h
�N���Z��Ac��V�K�_���72���B a_rctCD�����`A
+���4j�$�V���52�9�j7؛p�⬔�8���J�)��QV��F>�N.��-L���e�b }n
+��

*�����LΉb��Y�st��NM�fc
�o#�Q��kr<��G�>��'y}�N3�� �\�	V߻=;���}rf9}�a����y���	��Ⱦ��H_8?�O�F�ް�u�	�ɋ���wC�컩Z�=S����p
"�9���=�

�x(TGs��}_��]�Z��}]O��K|�
	QB%���,��vB6.X�V������t_[W9
���|ywwGV9�;'���~�}9�KB|lx!
��"N:�%!����ưć����6;V0���$��f��endstream
+endobj
+629 0 obj <<
+/Type /Page
+/Contents 630 0 R
+/Resources 628 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 627 0 R
+/Annots [ 640 0 R ]
+>> endobj
+640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+631 0 obj <<
+/D [629 0 R /XYZ 90 757.9346 null]
+>> endobj
+632 0 obj <<
+/D [629 0 R /XYZ 155.5735 699.155 null]
+>> endobj
+633 0 obj <<
+/D [629 0 R /XYZ 90 682.4279 null]
+>> endobj
+634 0 obj <<
+/D [629 0 R /XYZ 90 401.8084 null]
+>> endobj
+635 0 obj <<
+/D [629 0 R /XYZ 90 397.2008 null]
+>> endobj
+636 0 obj <<
+/D [629 0 R /XYZ 439.6453 292.2729 null]
+>> endobj
+30 0 obj <<
+/D [629 0 R /XYZ 90 275.5458 null]
+>> endobj
+637 0 obj <<
+/D [629 0 R /XYZ 474.3552 233.7366 null]
+>> endobj
+638 0 obj <<
+/D [629 0 R /XYZ 90 217.0095 null]
+>> endobj
+639 0 obj <<
+/D [629 0 R /XYZ 285.4065 111.7478 null]
+>> endobj
+628 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F79 571 0 R /F7 574 0 R /F11 416 0 R /F10 488 0 R /F33 485 0 R /F74 482 0 R /F1 583 0 R /F8 568 0 R /F76 580 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+643 0 obj <<
+/Length 3678      
+/Filter /FlateDecode
+>>
+stream
+x��[Y���~�_��p+"4�!�
%v�I����v��$V��$� ����t�
����J\qm�
}��= ���3KfZ��r�f������o.h������?]]<�Zəͬbjvu�VP4�������9���B���+�-�ms�`�̫�?>�A�o/)�����K��Ū�ݐs�.����/W==�\�Ej~���g2[��^��[#g�pA2j-�m.�������W�:���A�kI�9l3�%y�v��'\��?�77E}Iͼ�.
���ג�
�g"��R���/��W5���y�ū��
�Ս?�x�<����gc&(��"���p��~����jnp�1�f
�	+���Ϣt��Ȅ�b6��E�q0���=�%�љъ��gq>�dD?���q�
=n�P���ZF���`-���AeZ�f3��Yx�2XB���5�)��,��*o�
��>d
�:�;�D$c�'���%����[�����V���ޤ��3��{ˉ
�Ԁ?�	�Sĸ��v�z�B�����0M�5Z��*~"�m�����0jڝ4�|�.��_-{7���W���;����ܾ�.W�
���-��P��(�$7S������
+����J��ț2��f��p�)n�E���M��\�F���
"�b���j��6A��,��� ���
x����y*�Q��d�3��F6PA�s��\��c�Qv�\W�s=Xz�#Ѳ]
�i}؉�~����uȽP	q�B [P�Y)Y@�>�I�cx���?C_��
+
8���K:/V��B(:$V�T�D]�M��8����"<kYm�v�sg?�h������%��]��0p���
+�(
N��P�.��~���: �b{S�]��'�8���C8���E�[����� �~��8|�8˼-�y�ǵÝD3?\*Ж��{/L���!R/7����F^���� .�s̋e�t
�۶�\�jTr^�_�aBSm �n���|�7�uX��G���\uu��_
 "R���� z
Wb~���X�8�o����y~>��
��co&`�J��~7�I�ղC�ʌ+���QQ���
�{@�Qॠ���$�Lpici��_�4h�S&ٹ���i �)t^{�I')\�){$�ܤP
�S�(��Ŷ�/�\���vN�ag�I�C�ދG.�`S2H��;ʧ�ּl
�:�]��crJ;q�)�f���p�08HB��"�քv��{d�h �Jh�f����̘
+�����20�Q؆�U�f5���-'�9g觡�x��Y�.��ۧ�AX3V9�,�R�gx���_�{��bPz�ҡT�h}(PIa �z�����a1�N�?�
�b l�6	9�4eգ�`���o�`)�	�yW	�0~a`1��Ɣ��!J�
@�����y�����9�`�,��M��2��u�YñD]��5���1�c�<�nu�L��eu.��L�

+?*uG�I���
�=�l�!��
�hC}���t�*�6cD�(V	�*H����Y�+D4V��%r&�'�+(�n
WaBрx��*�=����G�w���p����ʕ
�3����S7az��v����1�
T�'�p�a��
+�H(�_�.�*p��宖�������_�6Ru� 
r�'���=�����%T
�G0��πT�U�5
ͭ]���뇮���b����:��<��c.]�b���9VpQ5�Їe�h响(|„T��e|&�f]ݫ��W����ժ/x_�]#?h��Մ��VI�j�ީ�H���|��,=��xqWW(��P�b�
+���%����Tu�/o\cN�@:� �C�
{��
�E�(P&K,b���Bݙ0��FBq4�|����c瘗�8@�`xqjHiT0��������]�T�O
�u�m�r�
#�ǠYpx
��a�
���F�GN3#5*TI�!�� ��Tn碷�appCe�
�Bi㺹��5Dq��/���8�v]��jU�|_�S�A�F� ��x�^�b+��[1@�}ìj��m�ͫ��=����m��/��rY4Y������R�^H�w0�0�=6,Д坈��׎��S�!����(��c �s҅m7�I�j~�Ķ�塀)�i��9�HF���ˆ����at��M�E����O|,$>~4�i�i�&&h"��\��O��u�).m?��;��.�]�lN�`#��h���G��Вt��7�`������|a �������@I�1Q��2&�$cʈ#چ�/!��~���\��=Tp�1�;�K�����!���.��j�%�r9QtR�9���X��p�=Nv[t�%�R�ΰk��+V�m3l��Ѿ8,[���x�/}�
�`�������6�nm~FC
\X1l���O�%3�]�X\U�iQ� n**OlZ.F�z��0I��
��^����$�0�]�.
�c�w	�
��Rm��nbk��w!��d�/���P���'�+��A�h����X������X|̚�;G�v�6>Z��k^gP*��l
�

�T�
-ѿ
���ʋ0��
`��ߥ�V�D��c�KV�XNI˰
����>8:oZܬ�
�C(ʗp�����A�ҿt������z�rW_
+H
89��$T��GJ�J@�b���c����hlMNv�}�t�Ux�[�

+����<��1e���!S�8�2��BY��t`�����3�*-S����} �����
��ؠ��VE�jh'~f`9�'���И	������*(��1d�3-LG�{�Lw�/���n
��
wg��R\�=�
�B2{���
����7E�M�O
�Xc�/d�'���y��?
r�͝ 7x�춴�XE�u�Y�����-��Z>z7��1��Lu�d�
�z�
��$�Q�����7�3:#���
�=͉�
�;��A��
b���wl�;6�x�,nu3
3n�H� �`�[�V�wŦ¶�����o���k?��MG-41�v
3�v���
���n�u�a�v��@=��z�bқ��!a�Н�ߝ'���H[z藁0�o61�I6m�}���G�
"-�|=v�j���W�Z�}k�۴Ig�������9
 *39�b�|�J��{�����Ԗ��
��x�k�3!W	�o�2�ƽ.��#����6VB�teL�3����dV^����
��7�m���D
��%���x�z��b�jJIV��A1��s'Gl��=I2P��;�W��Z�ߵ~�e�@��U�}����$
Lۋ0�ގ�
r�� .�
T�^��7������=�w�$�!��~��o(��n,� � ͺ.�L�@r�E���� $W��U"-`��	
���0�(���\�
Z@�� ;��F�j_|*��!!���e�I���L�);�ݑ���->�K
�NBD©8���ߴEݿD�ޝ�ײmm���va#�
+���*��Z�)?��
+����)�8�}¾���ɚo����c'5W/��'@eJX
���Xd}�(�
Y�$|��,��>�_6�Ll
П%>H��ְm�����jTI�Aߪ�op�ɠ:���� ��[�=��d�'��& ������?)�WS���r
B�?���z-d�e
 �����>
 ��b*f��A�����_f���f�,F��ߎ5��.2~۶wϞ>���ϖM�ۖwuV�O���O�t	>�4?��E?i��H���L�K�cZn�����w��l�wٔ
�aM���]endstream
+endobj
+642 0 obj <<
+/Type /Page
+/Contents 643 0 R
+/Resources 641 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 627 0 R
+/Annots [ 652 0 R ]
+>> endobj
+652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+644 0 obj <<
+/D [642 0 R /XYZ 90 757.9346 null]
+>> endobj
+645 0 obj <<
+/D [642 0 R /XYZ 90 733.028 null]
+>> endobj
+646 0 obj <<
+/D [642 0 R /XYZ 409.4786 645.2264 null]
+>> endobj
+647 0 obj <<
+/D [642 0 R /XYZ 90 628.4992 null]
+>> endobj
+648 0 obj <<
+/D [642 0 R /XYZ 392.9378 503.8043 null]
+>> endobj
+649 0 obj <<
+/D [642 0 R /XYZ 90 487.0772 null]
+>> endobj
+650 0 obj <<
+/D [642 0 R /XYZ 90 228.6992 null]
+>> endobj
+651 0 obj <<
+/D [642 0 R /XYZ 90 214.1289 null]
+>> endobj
+641 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F7 574 0 R /F11 416 0 R /F33 485 0 R /F10 488 0 R /F74 482 0 R /F8 568 0 R /F1 583 0 R /F13 577 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+655 0 obj <<
+/Length 4035      
+/Filter /FlateDecode
+>>
+stream
+x��\[s[�~ׯ�LJML��
�M�iZ7v��%q=�x$ђH�������+
�XV�mF<������
0����%2�����
���o�H�zߏ�:9z�\��AFR989s=H�%tp2�qH�<
����E�
�����xD
�g���p����1������1�W/��r�
i>$����wGߜ$y���Ib�����7x0��;ˆ-�p�1���8e�����ѫԏ����5kAXcڂVӦ
a)�����c*���$|8�������u7[�F�
?'$�T�g$��]�&Ř#�LlqխV����8
9_�����U�r��C���$�����
�J��c2�_��ܭ"t��*��R�
�k/в����^L�/��ۑ��`�C�I:h,qM�N�&u��51�EַխW0̛)�'���*�ϲ>����Zև���7��&��������e��j�^͗�mТ�r�X2j�B�
K��⊅�x$�
>�s�
+��<��
��7�t�Z�g��]I`��k;�?�w�Hi����M}C�rY1����еP����=!�5�=A�p�Z�Ƅ�ܐA�j���1�u�m�p��ﺳ�2N��G�pv���nM����4�(�����/Z;�H�h�t�.H��*Ϡ/ãN���唄�~;���nus�N�mvGX1*'ʔ+v;����]�X'"A��T�m�!<F�}�_6ܟ�����	��I M�
�����F5���
+{��#NU�;z!}�	}pD�o�􅗈hPHe'
}i$�6��e�^A��r)���3�hC0Ci�`�5{<^.,0CT1��+0
-b�KQ��x����M��י[r��j�O��O����k���F
�rĸ�vw�|�a�����"m�z�x{��%ݸ�&�j���w:��h���\G	����ex
+����
�l%>�x�~���6�Fp3����p
%O�����Ib���1��*k6>=�/'~M����*�
�p�/�Sl�f:{�gP�?>������}a��*���0���'�w�����&.�YkM�rp���O
`�
+��?�]�n��a�r3���
s%m��B��."�I�j���'p;J���-t� H���Ӌ��$���4̌�ޠ�p�@k閣�	
+i-,k�m���c�br߂�r����!�� ��R-���8�,@���Ch�A��o��`����W�k�!��"��0/AQ�@ G#i!!��f�������i �2�n�.C-��&��g��>������g�����CJl#Mc�
�	�o�Js����F)��	
+�N��Bq������	�$Q;h�k�@��&XY��F�e�`HF
��"!}�!�^�$
+r
�W
��H,�}��2ot����x
�\�1f�@�n� %� �����D�o�L֡a��=N��/�.���n$nf7.i��ѿ��̚
+2��<��Ϣ�&���n9mry�l*�0ʤP�
�X�s_U��i��i@� ��v��*!}vݪ�e�����5R�-ud���)w
�Dݬ�yE�d��4	J�!�S`� 7 �,���(aa�
j#< f'd�ڵ�-
+�Jr��At��p
���~gz�CC�
i
+�5(Qkbj�Ac�r-	��� ��F�Y;����
<����-�H at O#2�$yu����$���5[
+�R��.�M�!
�Y`La�|�b��:�|
+�R�sfRB
M]��Y�Taނ(
˷&����� �pQ�&�6p;�=V��:��Vk�����
+����QiZ����v?ޞ�g�>��H��k	X�k��G�a��m�$��ϑT܇[�QAY8����4�6q�Z\��@��O�]��`�"&�
#�9��H��_�
�}?�9��Q
>|a���U�5�A��
B��I��JM��;7��
i�-���5�;��7a}�Q�D�؛�d�j�R �v��#1�-f���N����*�+�K;n��v
�T	�v0�MȌU梍� �)*��.pZ��@�ljA�f;�#��)O`��_�7&�
��+\��a̕՟��.=���(+s��dٓ3=jt! �*��%*X��
�7ttCu:�0'�FJDR�W��')�?��x�Q�v筌��x+G��Bڸ^�F�3���^��\��$��TI�L�A���e|�[PÆ �_n���b�5���@G�6�`��B���"OJ���`Y�H��M5*�λB��b
����z|u��X�h-U^�5�J� �r���ڄz��#��`+��_�g��2>#�0���
��Q����܋w�R;�
̵�,�
�M���.�8f-�0GW[���$��\7ϝ`�¦��h�	�r_�O��MB��x�`
n�%�|h�'�_�dE�	��67�ZTx�l�2�x�覱^�#e�r5�m��i
Z��%�v���h�
�#�K�(�1���+Э�ÙD�o�œ'�]����p�F �%N
��"��H���u8��Kj�m��V�sW;#xAI��-;cyҚCT���eNP
����oY��ZS�j��(�oLDa��њ�ݬ鲅H �k3�չ\�������s/�yc65�	���-����W���*�m����/[Aʲ��<�=�v��_�!% �1�$�m��u Ty���<~�*@
RQ9�)�;"!B��`�c
�4��X��o/ƫX�]H��U<ٙ��
+?�,S�2[6��ϳ�,�C��J��|���W��z�b����/���5�ozB���XQ	�F{����йU[�S��v0����� �
���.�;3M�

B�0�|�N�E rL@�
�qX

+�&m�Ŏ��P�s
E���BFL����6���4і�NC�<
	B�<l/.�g�A`[xW>H�$efi�HL��V���O$!
ٵr䒯zQl������|&>��fK�	"�R��]+ �M@|�є���fy�ʅ�����~ߦ��g_{d�v��Lyj.���U�ƵAv���:����L�:/;R"�I�
+`��l@�+[��'�b�:����iKbf

W��JR�X�rW�\S�K-��R'#
�s
��=
S��tU��dc�&�)����\�����j�T.

�N�[�!Ho�&�s��@GL2Ŷ�2Vb��Wt��t�}
zl�/	-�V�|F�ȷ-:��o�I�!
Ƥ�fo݁/�4�ۓmHpU��n��M�3ܦ��ښ��UcD
T��z�y�
@;�,p-���"�HI[g
�5�q�ᯛ���t��<

�_4���
��
�<�,
0*-�Cϩ�òu�S�~�Xa�,�옥��oL��VP{(	W�J�bЊj�X�/@�9Z(��="
e�{�Y)�O�pes�ߙ��wf�*�ᘩ�Tf���`��(
J�ZEPV����4y8AD��Q:`ja�0U�LZ�TݽsO�������{���&�}�+1���2�
D�E�
������A���q�`l��8�/�� N�5��4�d"�.m�ْ���L�Gj�Bl_=�
?0���C��
+�dw�Oo�}Z��{G���A������:q�4�k�\��&(�����M�S���¦�dP��y�z��틇 
+���e�Ue��0u0a׬ �Wʾ����_6��
0��c�ʄF�Zz5�)w�-���3�i�Tw����Բ+���<�2�]�cV�p(�VaZUK�%y,q���#��A���-y��5R��{;ޒk�E`�
��0c*�V�E�#0Qjx{U��曛D�ڌI7��7��r�tl_�
_M��
�9�1]�;{����
�T���pJ�h��ËdD3 �����;%�`.
�졧�Y�
���Ձ���[OIw]��NI��",tg��b_&R�O��0�?�H�sĐ\ԍ�ʄ�ԝ�aC�p��
����
��*����n��c!�a�_�g���8�8�{�)�Q�b�Q��q鯻��"ڦ�`Ņ�����x��lu�F�/����=u�_;��z������[t�B7��b���Nj���Z.�푝b�Vo��d)�o�V�º��,
h_�b��̕��mֳ#��pC�� +��endstream
+endobj
+654 0 obj <<
+/Type /Page
+/Contents 655 0 R
+/Resources 653 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 627 0 R
+/Annots [ 668 0 R 672 0 R 675 0 R ]
+>> endobj
+668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.6526 371.1639 296.8626 382.0679]
+/Subtype /Link
+/A << /S /GoTo /D (main_GDMDRS04) >>
+>> endobj
+672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.6526 86.2883 296.8626 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (main_GDMDRS04) >>
+>> endobj
+675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+656 0 obj <<
+/D [654 0 R /XYZ 90 757.9346 null]
+>> endobj
+657 0 obj <<
+/D [654 0 R /XYZ 90 659.5265 null]
+>> endobj
+658 0 obj <<
+/D [654 0 R /XYZ 90 645.6205 null]
+>> endobj
+665 0 obj <<
+/D [654 0 R /XYZ 90 516.498 null]
+>> endobj
+666 0 obj <<
+/D [654 0 R /XYZ 90 516.498 null]
+>> endobj
+667 0 obj <<
+/D [654 0 R /XYZ 90 502.592 null]
+>> endobj
+669 0 obj <<
+/D [654 0 R /XYZ 90 372.1602 null]
+>> endobj
+670 0 obj <<
+/D [654 0 R /XYZ 90 372.1602 null]
+>> endobj
+671 0 obj <<
+/D [654 0 R /XYZ 90 358.2542 null]
+>> endobj
+673 0 obj <<
+/D [654 0 R /XYZ 90 87.2846 null]
+>> endobj
+674 0 obj <<
+/D [654 0 R /XYZ 90 87.2846 null]
+>> endobj
+653 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F8 568 0 R /F1 583 0 R /F10 488 0 R /F30 661 0 R /F12 664 0 R /F6 565 0 R /F13 577 0 R /F79 571 0 R /F9 602 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+679 0 obj <<
+/Length 4588      
+/Filter /FlateDecode
+>>
+stream
+x��<Ys#�y���S��0����u���\v
E��O�S��唀�����'�gz0൫T���a����w_������RrYi���rs�.?��.��z���	�������_�J
".?\��8�����o3\��9F��{W��f�vWs��lۺ������F���������M��/�b3̮���O��!����T`��]����r`��UT+~y��
+kM.7�����⧋���/�J�昞slB+$8
Ǯ�?�7�O�?�]���M����}~{�3B����$��mw]���_��#�����$p }�(�؂��泭�
������+�0N��JX���gD��D�ӪJ"��
B�
J�9U

�'��o�./�*3C) xZ	̙����"H\Γi=�
r&�6�P�$��6��F��v�[����?>��u%9�$�tpSD�ψ��:�R�<�4\CTB�#�8.�O0,_�V%��J�
s���͓,ݏU�1��0���*�ªDT
v��o��W���s<�y������Xy�CWJDP�$'B�a]1
�ZҐ
�WFW�~gx�Ϯ���b�~�
�ux�9�
JY��(F���L��Y�Çvު�
��#8t2�(�E*L#���{ȥ��Ir9O&���qE�
�S�7
�I��KVaLy*48�
J�oAksᶦ�hs ���GJ�yH�4�v�.������
�we����ϛQ<;�O�v
+����M�BG�ɠɸ�d�*8m���BdP��C0�q�
�'�|���

�@�v�d*�����mA��D����(��X;|7�f������w�=��=ҲBG
���&��>���$�������@�Y�`��B2��IVB��H%5�Oo�/i
+ۢ�1���B!�`��WTZ��I����+�0��’�)�ȈPG�8\P"U����S�~�@���U��W��p�8���+YK�HE�
3�%�I��	���v.[���Y�1��o�k6��Z�'Xi��
��`�_�H�{%��ҏ���ršL{[r^������
�0B���?^�Ä��$�� �/kqЩ~¦h`��Ũ&�6>���	:+�{���G�h|^��~L�V20
���n�

P��ۮ	)%oE�z״�
+@`��4����<��PN�/�e��R9�89G�FJ|�	
͚ �Tho��鬉}z̆%��W,��$u}:�@eT%��6��4#戛�"�AW
�
ב����I�}n�C��s���
�GQ�h����b�D(
���ڬ\�I���	��]��(����b����x��Hf���G[��»)�.>ϭ��cF-����Q�#����F

�l��X�+@(�q�S�JI�@��Ұl��r����##M�12�)�j��%��U��=.�Q�
�"��ff�YA3�|3�c�,��6L��~Ǧ�S
/��$Y���Z��f�,
��VEF6�P
V�S�o�|�Ea7���P����2�G�kJ)Ip�E��(.�-�X8E�E�<��@�.	�X�-'�1λ���L0d�	F�8�YKk҆x"�d��S�2d�R�9�щ�o�,�fS2��Nvv��
p4�$�{����(�jY�(�Ϥ8S�'&XΊ9)��u4��{W�k��R$uV
+Y �v�]1's�9��P�=k�� P�i(�X���'�T
+l2.�A����m��}M��ԛXk�`���:� �Z��
o͇t�?��?��>��#3J�O`����Ƿ_P�A����x�^6��[.���0v���p"���T���t��S!
�*J?��m�,�ϩ{c�CE����x�T皪	(.j�V\SY
�̏�o��H�&��yĒ	��.+G�m�~pC�+�73㷌���a�|.V>dd���e�}QE��/o
��^��0qvx.��/G�]�>�
Z��a�/E���D��S/�y�yY�M&���R� �5H2m���_&��
tZɣA-���l<���v�|�!7G
!�X�G�B,��'V��)���!P�v����c6���&�Ej�g������p�3���`=y�L�n��?|g
�lw�/4�����r���s�U;|p/v�u�t~��&,
Z�̘3d0����x�
����yl3�j���a&j�*�,E
sܔ��C~����c�����T�6b>�
3������zxp�7���s��e�����er�*p̣W��L
A�)%Y�'�
Z D �=v���ɓ��wͪ^y_1i�r�y��
�(�G��~�Y�b����ݺ����v$d��+p1������W�
6��X�'`�BB�weK�$Q�c0���ߏ 5
+)0G8����xFe9�
O�a�I�2
�"G�>����}���%��A��=���m��z�
����?�
?�KӮ�j�1~j�`��/��6�	l��ە��zU���i�Sl�nh�uͧ��p\��pS߰'K�f`d��"��ӹ�i5�K��6m��&���v �C�t��eW��Gh��v�_uU<B��ˉY�?NW�0畔
���
+�lyK��|Ny���Γw!{
?�l�i��W��~n�E����>ww�݃�H�n�o
��T�J��z�/?�`�{�DT���
�Y���H��~E
JN�gM���#Pپά|:� �
\���}
:1���X��
k�0l<��%�̡�Tg�*��lw[����s|.R 
���d��=Ži�'�e ��||�#a��6e�dZ�����z��sx����V����<z�wF�-����ھ<b��#ֆ���k~8pU�z"�z~1���X�
t%
+^�U��
��(��א��ӽY���P3� rJ��	��:L��S;&B}z�(���#OsJ��$=A�5(q�E�@��$�LeY��&4� xEU
�>����
+	���rMhb�/�X
A�bO�Gr�^W�$g�V!tT��`�g��*Ą��;�@(�B��1�hC;D�1#F���D��	��CH��1s�
+��jD�����>�?P�$���(G%
�ɄS�#L���vL���}��H�=�j�甤nĵ�' ������:P�a�\���;��5����.�������H��blO��
�<8��e
2ҠF�����m��נ
��;�?ȸ�ッ)��s��Y
||�R��u3ѽ�g� |rAK�r�!&g$/��<l�b~�\�ҳRӯQ�:���5Q*��|	�	��?�9g��U���h�,�4�����
I����X�8��>&�9�@�����
A0�{Ո$k at D�D&R r)(�ԐB!�74()��F^�
_S�q
��5 ���Ao,�ß��!�����}s�qs��:ƻ��id��
��f���4~�o#��^�G|c0���K�@�mP��1�>����z_c\(
+5�~&�$ĩ>���)���f�A�S"��;'��bmrv��	�/��UY"l��~:-���֦ K$q$���=����'�?��x:ՠ���r-�~�?�Rg
+S��'l�SB��S4��m>�Q1MPr+����0ƃ�)N�-=��2&Xy!���
�`2�(4[�Q� S�8���8'
��G�Ćx�s�Y�q�}�PG

+��<OZ����l���V�CMl���w
+�����w���1�F|_⊙�C�jn5��CO���G
�^�t߭�*s�
+K�V�UJ��d���G�_��|�*�hB!(}dA�<���&
+���PPV���s��/����&��}{lZ�e����+�u��~#j=�v&��� f�f�+!��
��-�a��V��u��

���
��dҴ{�*���r�(t$@�2�
_��e󁩈o9�?�cSp���O�&]����R��cN)25��Ku�[}�=p<.a	��H�
tBe ��z�k�
�Ҟ����]�\Fs3�*��KE��K��z
�\pq� �`�Q�c56�5����_�ٺ��_��?��zk������SF�F�����
ؚ/|ƻ���t5I�E:7iN2��F$�;�l�I��n?.�Q�]��!ԛ����C�â
>r��7��k�o
+_o�`��/�4��+I�MqF�δ��'�z���jn6ɯE���wթ[���h��' R�,�q̯���(�V�q�2�
f��53~)7b#N��Q�E�ج+\瘅6T�9�̼�a���i��9��ܝ����?����x >
B�^؂�TH��R�."��
,�
��Ŕ�+6����,�gϛ̩ `%lA?I3����:e��e�vľv2���@�_�1s�NMR�|_n�?^4�z|���W��|���C��n�@�t?���.����
��wE�KJ�֌)��"�k\p�t�'O�Q�&u�k��W}�/D�ߛ�ވ���&/MQc�
�c(U9��|���*^�css�-޾���'F��s����
�s�CR�>�@D��h��b��
{?f����
]C���G���3/��hoC��!��~
]/ ��&��ticp|꺏�̻5��
K��_.��
0O~���ީ�k��{�����}��۶����f�[�����4Ur�z�8i K�~��%G*�%���ن�;��^t���{�
�
+�����gendstream
+endobj
+678 0 obj <<
+/Type /Page
+/Contents 679 0 R
+/Resources 677 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 627 0 R
+/Annots [ 684 0 R ]
+>> endobj
+684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+680 0 obj <<
+/D [678 0 R /XYZ 90 757.9346 null]
+>> endobj
+681 0 obj <<
+/D [678 0 R /XYZ 90 733.028 null]
+>> endobj
+682 0 obj <<
+/D [678 0 R /XYZ 395.521 176.7596 null]
+>> endobj
+683 0 obj <<
+/D [678 0 R /XYZ 90 160.5051 null]
+>> endobj
+677 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F8 568 0 R /F74 482 0 R /F7 574 0 R /F1 583 0 R /F79 571 0 R /F13 577 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+687 0 obj <<
+/Length 4957      
+/Filter /FlateDecode
+>>
+stream
+x��\Y��6�~�_��U�-6�=�X۱v��N���}�����XU�VI2��rϯ�L �0u��m;�QE� �H��e"A>a��'�M�����L.�^��
���O�g�|6l���W��5z�+o����=^i�����?��23���uS��]�^m/fB��z��M�_p6������`�ᶾj��SS�/���O���mOO"WKÑ��^��lrd����wz� ?XŽ��WJ����Տ������Yk.�ikQL[Ȋ-ôn�Fr_����5��VA��b\������
�qV	���
�L=�
47w��c2lo�8�D�p������gμg_���J�0�{�A�W�+=��t
+�0���Lqk�3���<y���DTV�q�x�?��Kܘ��vW
+:8�xD�֕RL�n����̸d���h��DTa���
x2�wΝ�@�2;?1�89������ܳ�^�	��e���瓟q
�`l���Z$.��࿒��th��w4���cS�3���1�
�'��f�U���
Z
'7�F�D8m��ΎS�.5��f@�v�N6����0]���L
IPљ3����՛-gg�qbXF0��pV�*x���U0�*:�n
\�J�K����稐���UHU�Yݫ����䴅[�����e�
"��� ��D��fQY���?�–�!lea�x悫_�r��
|�<�>�
��$��	�N��Y��g_���@�W���d�������I�P�U%���l1�>��6� �	�)
+������
Gd��
�c�(+�+���l�z6��ˀ�X�*-|�쉅���ę�x��;:��c�<���{S���H	3Ul� R!"��+��JNw�T�%9�x�=ι7���8���Ь����s
+T�;�L�%�PU�j�;
��4֗��m�lV��
+�˔���)񗕳�#�
e�F�	Y�#�f�-��Jk�qr�����
��=�
�r�v�Q+�� �
+}��f�m0�����q
q����u����y]]������m���~u���S
i<sPb�!q`Cz���7��������=^ח�uK�]ŕv�:��2����NxA�/<�,�x9�/"
yʛ�Wz��P#�Ɖ�@�{t��J�U��|�O�~�5���ޒ�f,�|�l�
���� f�;�Ӱ��)71�*2��GW���B��Q.D����2�C����O����p�ee�v T��ñ�k
��
ЗO�n�
���:t،b
 vDŽ�
 ����o�?\J
�5m�

��a_�#��̪��ו�Wy��YJ��"aJ�x
�i��4Q������R
��
xཊ �
2�Ǥ0� :0*������Щ��M��

B;����X�%wsLp߄,7�$p�O<�C�

Cx�r}������
 \0
�m1�M�\_����o���G�3&
��t��{���"�><�_]�-t����L������f�h ���
+�����È,���[�[-d�hN��d
���F�L�㙟	
�[�����{��
�:��)��
`�X1��E��b���
K4��n���[I���
�+�
.��qu\n8�p�
+~Ln�z��Η����];_m���]}4�l|9��t?oS��I���!��Q��`5"'B!��`�����^�v�->$�{��]���� j\�c
=�Q8�s������ˌ�f�[s ��A���x2�>���I�9hvj�!Z�D��"��'��f�O'�
����
d[g�

bIt�+4EZL�')��I�^mM�|�No�6��2=m��ٔ�V�67�v��]ke�,CF_��Q����
���
����It�ѻ�}�F��� j����
���c�!����qSE��f(�[t
��|G!o���p
��}x�%ȖRt���>h��TDk����=�a�H��ݨD��є�71�?k%�,�
�H���r!r�E���$K:�e�3��
z������r���|2��+�O�
@���
�xե���z ��f������^�o��
1.օ!�a���
o��*

�>
* D �,ċ @�� B�.ps�q�#���
Q����
��� �_�]�Sm������Ї:�>
��g����n������mR�ŽeҶu2J�q(���5c���U��1`]� 7�nF耭������x�36��u���lV�ƆP�bJ꧀�̖�
BN���Ҩ.csLȧ��"�-�U����`M��f��i��;��ߋ��d�A+�gD���jzC�U��
~G��/)�1�����}`r
,�������c�e
+��L��*����4+���ERi�&�~s�Q�U9�4F��
��7c�s������C/��E���'	�Y���*D$�~�kV7�����
@	�!���y��ʠ`:xȣ&��F��"�ޡ
ǝ�x���߬W��bQ�u�R��q
}�
�R`I�:����^G�|�P
�Ņ���TZ��}��a)v�O��)�ۅ����m�)b���hfVp���D�MHy*1�+n<���YT:1��?v^֟�˚cyY�wpvd�DVV��YYYY,�8��B쳲����_�:��p���w���C����ˆIʽ0"1{��g�
���@KW�Q�?��Y�>۰�t
��n�LO����䘻
+�AqK��X_
+g�����u�
�b�
�J�J`q� ���Aӫ�,	h;
����>73shH2~��@j)禼��|��e�����؉��	�����w")�#yH��&D�Cj�ms��.&�qj;�
�
+ek�dZ�3��w�j�����>�n�S�4�j��-�_h���F���(2$
�z�'Izd;�]�Ք�l��u�d��7��f�!	a
kN��ѕ���xD
I�
+���.PP�a{��b͘�/ ���,J�DF^��>���j\�����
 � �
 �!��&۷7��m6���b7��2�w�!EG
7 E��WWq����S��X�%
>u���P�@1���ܽ�jm�F ֓.G�]l���Jt~�6��o�š)�aPд��㲩W;ҫ�J8'N�C�G2
+}�\d�?b܌�f9ڎ�<B�;��q�J��Ǜ*�m��Z�f�����Y�$r�,c
�
��P��tG�Х�N&��]������#V��ʰ�j�$%
z��dY����¤u���5��@��
R�C��'$+��,��H��0�
9����e#> 3a�}������00Hź��}�#���!��
�B���C�����"�/ɺ<���Ctem��B�!ftn�����;f��1� ��}q�1��S�2쒬�����<�aW
+���7��,� 1��</7WC
/Rp'f
��S�a��T��������,�sxb�t����B�uF��󣘂"�l010{��A�@,��P9z�C�"Y�:r�[�-�C��f
bU���#$
5�b��T�S��9VA�*�J�>	���T��@G��
+*s���A����@�S�}>���7�Ր2
��f �cʳaߓF���Ȝ;��$m�
��);c�Gv822�jZ�XYf�3�I?MT�
+	f��8��(�=h��Ky��$�+Ag���ܺ�rG���Y�끖�x�~�c)Ômn��AV)�r�g೽ݓ,�e��X蒳#
�
J�c������K1��Cw0w�$���e�^
{�Y�?
��1�5�6;F��#	W\�e�
:b��a��1}I��3��Ƽdli�t���g>
+����h�e2Żtb�L)=��J�Q�t�q�F'

]y_�s��)�7D���W}�L��!d)d�.T�,�=?F���k��v�����8��4`�� ]�
*0��)1��r`�O`9�,
d<�<�XӃ�@
]��vK*
�PN�j���X��n߬
+��5�)�g�[ Z[ԓ�hK��0.�u���o�
+�+�2u-9��
������э!����z�?qE��N�_�2�zZ�bAr
c�_�)`�9�i
:��B�"�����䤘�gw1����+62E)�
x�}�K���-�4����n�>�m����f=���PEb���Y-��%
�~rJ7��++�8m���Ό�]�w����<wfD�é-�+��_<��ѽHD�ODt���
t���q!�N>;���r���яP��{

��
G���}� K`|p2�����DJ����XI8}W��y܊ax�T
:̍e����'�9�a�U�����OTU|
��x�e&��	�������L�i��
"�z�/��1�uy��
�3��
+R��O���EԳ����C�E�g nn�
�A)s��R��;D�� 
+��E܎��j�
U_�!ȁ_��r}
+�G��}���-�%nچN���p�m�S�������� ��+���mN��,J�%���z���
e?�p/�0g��e��/�0`�%V���0\��w骬��V�u(���x&} F
?��.>��m�����.�X�����j@�z�w�
܍Kb=~�8�
8��޵�e���(��P�g�b;��oc�w�6P�*=b����`2����鋈��A��Mö���-�
�$�Xt���K�
+ZӬBv �u�Р�{��nc��5���u� t�,"db����<L�Ɍ5d�M�C�ci_|�ľJ&�S�S�N���gzA07O6�
+��9���z�A��;e��y��p'2\�'�ڃ ���}��	
J����5Lz
��+j�H��;��x�nY_��
=4�Uhtq�=�����?�����҃
+{"�b��l�M�w)x�>�X��E;o?����]h=MQ�_����i�o���7��@˅�v�Ǻ.�#
~�%�R|�n�]�y?������	��k>e�!2��6o^�~xx�.����ٴU�{��,_�t��.�������F#Z2�+&*��kCZ�� Fݭ��S���X�0�#<|M���f��endstream
+endobj
+686 0 obj <<
+/Type /Page
+/Contents 687 0 R
+/Resources 685 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 627 0 R
+/Annots [ 694 0 R ]
+>> endobj
+694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+688 0 obj <<
+/D [686 0 R /XYZ 90 757.9346 null]
+>> endobj
+689 0 obj <<
+/D [686 0 R /XYZ 199.8867 368.1212 null]
+>> endobj
+690 0 obj <<
+/D [686 0 R /XYZ 90 354.0409 null]
+>> endobj
+691 0 obj <<
+/D [686 0 R /XYZ 90 256.2309 null]
+>> endobj
+692 0 obj <<
+/D [686 0 R /XYZ 90 242.2502 null]
+>> endobj
+693 0 obj <<
+/D [686 0 R /XYZ 175.5483 89.4414 null]
+>> endobj
+685 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F8 568 0 R /F1 583 0 R /F25 348 0 R /F7 574 0 R /F10 488 0 R /F13 577 0 R /F79 571 0 R /F74 482 0 R /F33 485 0 R /F9 602 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+697 0 obj <<
+/Length 3700      
+/Filter /FlateDecode
+>>
+stream
+x��[[s��~ׯ�K��Ą��
{ҙčۦI����!�d ���@��_߳W�+J����	.vϞ�wή��?���BrYV���jw�70��3�~^��˘�˫��7�/��D,�6f�KN0Y\�(p)Η!T������v��|I8*���|

��1*�v�� ���Y��R�������Ͼ�
+�8v9Xs���?�����
��R|q_P���,vg�P�e{����0������5��9�&�D�S��S����v���"+#�K+���ۺx�I4ș���
+��n'��!�W8-�d
^�o��W 鱯�}fz�J�$v��nw����2oH�΁Y�7�;���RT
+�FT��X+X�K�H�F"��˘ވ9�{6�f懿{%�O3DUR	*MY��6P=��ĥ���Kw+3c��88��
+�o�[��7áY�N%��FҠj�&_b\V�'���8�
+.BxQ�m}�m��|ɹ,ޜc^t���n�/^ )�F�杕�=���7$�`�@�+���%�� ��҈̜�`g����(+I���).�KV1�9#9R�0D,�p�����k;�u�x%�o�?�$�8�G���8;�8�bέ�5�A�z�h�_*H	v�S��괆Zj��>8�p쀪THy��A
ڄ# 0����ҩX�W*�

�,�J�:�WĄ(^�i?�7�[N+� �&�CsN̓t$83I��MF�d�x����n��sM7���NK�~x�Yj)�vk�|Q'�s�Bԋ�s'���cHH
+�A�����>D�)�ˈ�>瘸��ʠ׹aW%C�����`��X�1p
�5N��ƀ�;�͌C6�0������y`;�ICYe6�!]3o�3�w)�R3��X)�G½�s:5Ky���Oż���4��w)��X2%S��e&�+31_M\'�;I�S�qT"$���Bd�qn&*}��;
%,I�̙z�q������j�T�¹�R�+�t���8�!��H���L�� �$
xY�ʄ
�L��l���ݡ��h�;�_����~
�~lWwۺ���
�Ëv��
�Sct`tm�!��m��&�iE1�;��p�W��Uq�]��f?�}��6��z�oo�}���G��Q|a�B�6�B;O�べ����t
��suH?�dci�)
�j�zu�G[
|�t`&K���
C�<���M[o�D���`kNJ�����
�$��j[��)w�%�� �:Ҩ�o���	�Ή�G�r`	kG�n��
�0�����"!=2�<�C@�z&�/��e�|^[�\��伢�<�	�&���zb��lzi�{�T��j��K
+�\I��ݝ�"ߌ�>���!J8�^?�J�x�b'�. Km����s3�
+_�m{s;��f�m�߽���1\�t1^��JG
QC�_�%Z7E�
:Kv�;]����q��C?x��K�W�K.7��x�[�Nu|?��l��
t�T�=&=��#r���M
�8�X���	LħC�K!wDDZ�X:��)Ŏj���^{^�"(����d�
+R�~]�׹YD�>V��CI�
��F���|T�Dy,0�@ş�hs�S ��tzc�H
�2蒽�5��R�R
���R#Zu��n����س	a|^���R=-�r
�5	�.�

#y�|��S��a��J��K�[��T�O.|�s
+�Q�O��L�s��5��g�5�4��W���bK�.���%Gm�^EK��ǖ��
�*4(�͵!K��a.���1��
����v�ŠX�|�������"*�K �TP�xP~��ʠ��x����HR�Խ��j�
_CX
+��H��@?L,�g!�v���)F���(M�����A�������6�
+�:(�Ӹ�
�P_���t� �{�
�t7���3d�|1	��
Ǡx�G<�ϡn��!��
6/=�s��
z��i��e�1t34���C��j��)�iv��2<�n׻vw������7>c���K)����|�$
?9�ۓn�^}:�� �����+y�\A
P��_f���
+W�
��sp����q
	�
��Z�>=�b���;i6B�FB��ͻ]E�����Z��ބvڦ�9�Ʀ�=gΥ�nr��̣ul�����&�
+�cC�(
�l�=�	
<����3�&��eh�jK&��Sf�2]f�J�;��J�J�"6�3-6�!�'7�rV
bd�ʣV��ZO��՞Z1��麏Xm��s��G��\"��A5&��ޘcjy3���m�j���϶��F�mT?��@��~�2�zJ�:ȉ��R�'{Z��V�T?]����fU�Aj(�=Ŭ�s�&YR
+�����I�$l�ɏ���%� U�'���a8��I�E��V�/<�<��	�U @�PW�u>�:�X�R�4v��l�
+‚ �T�լ��'ᤢ�fk�ol�#�5b�u��_��n;��S�9`��ܾݵ��j�D
AɬĶ�'F���N���˦�'v
+�Iٳ���>��B��D���e^$����[�em��{��2��!T�|q��Z� ����$��Fl�4 '
����"b���
f�:�fPr�U�ƴvI���Z�
(��]�D`<�
H�����5�Ҏ���n�r�@��‘i��G���[���0�CqK܁� P��|�1�n�
+K@.��;j����_�.��O!5��k0[O5VMm�Q.`	�ʕH#���gr~�����o҆��H|bf���5�Cw�n�oY�6��^�Л9��Ҵƈ�sqQR
�]��x�/�wk��
c����vu���\O08�
΂���bs���"��
7��q�42�54 e� }?��!�v�M��j:qpie
��]��ٮ��:�����Q[���l����}Z.`ax���u=�+�h��Q��>�
̱-n�v퟿��=
��1Ut������
n�C3h4��x�4��q�g��'3�����u{d��O����Q�L9h��t��r�}XCo��O�_�/�q�|ި�+!}
�L,kn�.�zԈ���UD�IN� )S	~�+�������j�eέf�\9�w0?��ᯆ�m�fo���sC_�����$Ut�_��G�0�����q۬~u!�7��w��o��v
h�)��R�O�&P�#���
���:�y+�CS���R�=��	���>	"������ ��a	�t٨[��	H!�$RW��
rx at h�� ����f���V�@`��a���-���NH9�`z�;Nz���#T���ƝV!�Mp*QJ2=��]��"t�rǠ�Drrq�_�4Ƹ�ͱ��9���:�:d���x��C��
\��u&]B|��T��N d"�� x�tG0 �j
+4����|���H[�e��JT�	�;x\��n��A�"�R�����qm��Y̩sl�
��85T�
���+���1萝<N�5j�bХk�K���>k m

��N1�a�I��V�'^�y���W{o�\*�OC��ֺ;�
��)�����GӒ� r��%]�������qQ��%�\�W%�4�ّn�
+.>��$LH�~B�c\pl�GL$�p��p��\�L����昴Q�o E������zg�g�;K
�b1`!`A �Gݖ��q
+����:)�_]��FXȿ��ް�!�-��5�x
//.�����P���C_�����D����	�-ь�D�
�RH�^V�e��h��3
+֘�tɰ�_$9��endstream
+endobj
+696 0 obj <<
+/Type /Page
+/Contents 697 0 R
+/Resources 695 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 712 0 R
+/Annots [ 700 0 R 703 0 R 706 0 R 707 0 R 711 0 R ]
+>> endobj
+700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.6477 695.5631 370.3748 706.4671]
+/Subtype /Link
+/A << /S /GoTo /D (main_HMT71) >>
+>> endobj
+703 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.1506 547.5277 315.118 558.4316]
+/Subtype /Link
+/A << /S /GoTo /D (main_HPR97) >>
+>> endobj
+706 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [447.2673 208.2636 513.9963 219.1675]
+/Subtype /Link
+/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >>
+>> endobj
+707 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 196.3084 234.3668 207.2123]
+/Subtype /Link
+/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >>
+>> endobj
+711 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+698 0 obj <<
+/D [696 0 R /XYZ 90 757.9346 null]
+>> endobj
+699 0 obj <<
+/D [696 0 R /XYZ 90 733.028 null]
+>> endobj
+701 0 obj <<
+/D [696 0 R /XYZ 291.4623 607.211 null]
+>> endobj
+702 0 obj <<
+/D [696 0 R /XYZ 90 590.4974 null]
+>> endobj
+704 0 obj <<
+/D [696 0 R /XYZ 400.8484 473.0175 null]
+>> endobj
+705 0 obj <<
+/D [696 0 R /XYZ 90 456.3039 null]
+>> endobj
+708 0 obj <<
+/D [696 0 R /XYZ 90 197.3047 null]
+>> endobj
+709 0 obj <<
+/D [696 0 R /XYZ 90 197.3047 null]
+>> endobj
+710 0 obj <<
+/D [696 0 R /XYZ 90 182.748 null]
+>> endobj
+695 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F11 416 0 R /F8 568 0 R /F1 583 0 R /F79 571 0 R /F6 565 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+718 0 obj <<
+/Length 4347      
+/Filter /FlateDecode
+>>
+stream
+x��[[��u~�_1o�T�����⸼�
�q��jS��V�n�
�n�Evk4��97lt���<$���&8��\�����ۚ�j�˚
u��ݐ�'h���Wп���x��J��e�����hfP����ۏ��
Z��%���o���
�t�b�Co��A���()ڟm��
����v36���w?|����?����J�(��Ǜ� �X�oH��J޾�
)i]��ݍ`ܿlo���s��v�r���e��˳la�$J���"�P�J�+q�!s>1&�{��b����P
�N�X
���&J�t��?h���d�0=�蜐6��_C��ɖ-5a���q
vv�� F�Jj?h��F�aԓ}�#�=T��Z��w+ND�r+d�������֥f��;��t��*O���e�R�ʯ�Kˌ�ss�O��}h6���l\q�O-�m���̾Q"��)��LQ��j?੻c�H���q�
o�C��^��ޙ�З9�"������

���~�uu�D1R�%�3�
�=���n:����E�Բ }oG���]��p5�����D�/iu]��H���Z-%h�
+@�P���i�H�.)7-�`�r��o�MN�t����O�3|"��	
	�J����[���u��TID�V>��"U��[�V\��"X����#�E����L~�2�{|���no�.km���ۮ�nA�<��u�I�fܻ�Q9+V��L��}y<��aW��"�يO��8��v�����q�nrNK���w}F�R��.KE��00��wYɜ m�*���l��4o+��1]
��>D����l��duY�q���r4�.�a�u��H��t��rL��.W+��p
��͡�y ^�n4���\�?と��tVB	�� ���̜�{��'ތ/���f��p�ʯ 7
 �T��r�m��N��N��3�M�ھ��
�`צ���6�!�8�MRScV��R�
���T�{�ʶ4�įGC0p�ã]�
��yPQ���
P/�nz|E���q<�?
�mgB1x[� U nwot�Ns��e���A��p�2@���,�?g�@P�3�;
J��I��$KL�*�����A]�� ��
�"n��
+� �T������I�+�.x]_DwIe����x
��e%�Q
+�+��[)k!͠�F��#�
_�+A�5,QU�9:X=>Lǝ�N������
<���Dz�0f�"e)��RyʂpMg�?�)Ϻp^���[�)��z�bIE�����u:�;�<���������!�U��u���`"d����+BS�[q�\)5WC\
���z�,�� �.i-��:�T���7>�3%�f�C����>Q�ȵ
{�0a�骈QZ.j
��s��Qk"MX�O�6�Ta&��2�#�{��pF0�b�+��y�o��6
����
+<d��d at n�
Ҥ@}��ӘMfN�Y��8qxi�܌�
%�Yh�EP�����>?/��s"������Y?���-Y��Vl[k�,}�m��$���u��rU�Tt;L���-
P��k�(����E@�r�ȍ�Sf��" #T��o1���i/<������!�v�
Hhfh�34a�@�>O�؟�ZU� 
ע���~�!�像ݔY��P��������cw����m�����~�=�N�B��-,o�I��!
^��,�=���r)'é��s�����w�6ݮ�n�=�$���	d�0����z��>C��l%���2�
E�f�RQWy��85����0��7�^�rۯ]ӣX�ɲ��^}6������C� �G�J]_�^�G
{(p�Ħ�'�/�\�gB:w9�� D�eCZ
+�h�� �n~лO��?�}^�XW�]?z��snI�`���Y�@�8s���U]��ϧ�_:LJM;�����5��5aO�:�f/�s~Ӳ.+��ƶm���aY+Q�RI���nB9
�L6j~1IƇxK���0���ꀢ���/>�#�h�MS����5N¼s\��
*��D|B3����2�
��n�+��
�5M�XIBի�HCbR��YDŽ8��a-��n�A����FY�dɠ�2���R�p
Ti�޾̜ZA�
-�LiRE��`r���Sn�
��ҪJ��S��	$�Ƶ�B�9h�#��r�Q����x���R�vA��~��<��J�4=O�
H���;Z��~�:<Զt��`���Ɏb��|�0�ڮ�E��D XA��@p%T�Via��N�F�
+�
B)�A\����k0CJ�-��q��ԑl��!;�C�|�A5��ڽ��
�o\��\#���'g�i�9�7æ�D�[LJ&[����H��Z�<`I���S� ��
+R}���Ry-jTJ�9SF
x�!n�-�A�;G��@�$�y�uQ}7
ZU)h}�$5����	
�^+��q��dx
�aZ
+
%v��H�W�
����5����g'�Z�p�ڹ嚬'��ƾ���m!��H������w��y�%�Z��n�m�q�z��Ɏ 
SUx�Hz��1�v�ǀ/��
;�/����!g\�
;�/R�� #e� 
K FΛ<� �f�)��� �j^�� ��]L��y��j����.1�ش1�����9��X�{
��_��arq�,�s���p��y�>x;
���z��6��O�g��*��g�V�qs��GX�5�j9�~\��`�2M�j���([� ����:�`l�C�,�3Ǭn�bCe��F�l	�Bu�
�n
+R��\Q LR�E�w�.J��cq��v�&H���ZW,�
�~�e*<�GH���|��W�5�lE�3���8�{{�f�
KHD8���B[ضe���5�9J�
+��|ֹ$0
+�X}*����vcc
+

L$~�6&ˠF���Z|7i?]���dϦ����i�~����6�Fh�k�fHFW�쀍}X�
���L��1pS$U���]z
<�R��Tļ'�W����bP�55wpD����O�*wb�� k�������� +0�f�<��P������q����y}�y��
|�v�O+��"�5�QF�y!��t��}��7Z�rRw�<'�$��_�z֛� 0 qO��kn�)�̭K[�rU8ȧ���o�
.x�ش�#�m�'��q������B�Թ�
 A۷�}���>�7��iy�G(��[��t�{��3>�!�K�n�*
z��dVd���]�p�p��KX�F���Q>�-�����d�Oj\5�}��ܒ��c�bX�W�Ư�2��N�
��P��Q]C�\��t��r.wh�/�
h!u�������Nk��&t�2c8i΀瘔ͷV��L_
+��3�+��*�\� @!tp����N��>w�9vW_f�Jn���`Y,S�c at Hﺿ�Ϥ=����*)���~\B��_���1�
���h ����ۼ�N֘�
 s,�x�f�9(eM��.+!��+���1SsQA�U���ٵ~M�q�w@���B��~ۭ;w-]��;�.�:�^�0�S�<�
x�	K�ep���)&�����-a�wK���-
�>?�C�~�����_r#Z4�k�D�d���(�
2��


+{1�.�o�ę@c�L�$�CBE��7���$�1A�5Ư�rwS��̳<jNQO@\��æ�Xžu���l��ZrP
+�J�,{x��}�vgc�kw��l�y�� C��Uэ�Jy#"o`
�R;�qMJ~�O�fl �l]��5�d�~�.�,S�Zl�u���s��hI^캶m3���u!
��M�y�
!k��s�@Y
!R�D��i���9���f�a�74��ׅ�<	E�}����d�#�-v�P�Hc��������4
�M��W3�n��.CH���
+w׼��Ff
L��}��3?�
��a��T�׮?
�)
�:	�
G�9$3�⡙�\�:o4�	jdGy7�ٝ������L��~:�2U��V���p
G������Qb�O��@�)��گ
O�eV����~�&q",
ڜLD��AcU<����v�:ڒ	<�	��~ӹ&SԵi4�ٜ�X�O�*�IvhGZ.�q�L~6K ��	&r����x8�Y��I�˓�K�Dȭ�
^�n
+����ɩ�kyhcF��mc���u)Gr��%i_
:ٟ�a��<I��ܟTȺ��g��`������j�eT�Ǔ��c�hs
b����aܹ
�>�S��O^B��� Y����p���M����"��FX*�cچB���]�.��*���K��/���_�͆V����S��y�������w///�z*�}�������I��B���� ��$���
+�`㵄�n[5
+wF�O�H��R���3�endstream
+endobj
+717 0 obj <<
+/Type /Page
+/Contents 718 0 R
+/Resources 716 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 712 0 R
+/Annots [ 726 0 R 727 0 R 729 0 R 730 0 R ]
+>> endobj
+726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.8588 271.6294 492.8348 282.5333]
+/Subtype /Link
+/A << /S /GoTo /D (main_Hal79) >>
+>> endobj
+727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.7909 259.6742 180.7583 270.6313]
+/Subtype /Link
+/A << /S /GoTo /D (main_HPR97) >>
+>> endobj
+729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.3884 206.1843 148.9721 217.1415]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03a) >>
+>> endobj
+730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+719 0 obj <<
+/D [717 0 R /XYZ 90 757.9346 null]
+>> endobj
+720 0 obj <<
+/D [717 0 R /XYZ 90 587.7175 null]
+>> endobj
+721 0 obj <<
+/D [717 0 R /XYZ 90 587.7175 null]
+>> endobj
+722 0 obj <<
+/D [717 0 R /XYZ 90 573.1472 null]
+>> endobj
+723 0 obj <<
+/D [717 0 R /XYZ 370.7354 343.2814 null]
+>> endobj
+724 0 obj <<
+/D [717 0 R /XYZ 90 326.5543 null]
+>> endobj
+725 0 obj <<
+/D [717 0 R /XYZ 400.4389 286.7376 null]
+>> endobj
+728 0 obj <<
+/D [717 0 R /XYZ 90 236.7601 null]
+>> endobj
+716 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F11 416 0 R /F8 568 0 R /F33 485 0 R /F79 571 0 R /F10 488 0 R /F7 574 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+735 0 obj <<
+/Length 3787      
+/Filter /FlateDecode
+>>
+stream
+xڥZYo�6~���mc
I
��C$��f���6	����QK=:��ߺH
���X�x�d
_[���]�v6�Q'��p�R�h�ە��这�����7Y�+�"3����(d:J�6���/{
������|��{W~��o޻�
��)�����O����PΕ��:�������oú�VgW�x��ojw���RQ\���	**�Eav���ľR_�t�c��
4akw����:�R�&֛��4R:�p*�����A�E�Tlw�d���N�vp_�w���ll�nN�b�0�r������FV��D
�N7���;<:.
�^J�m��d�k��I��rh;��6�=���;v��aj��N�ڝ\3�=ˤk�����{��b~��s�ӵV0
�F�HSM
++���/�k��F\�禧jx���B���
���-:���k��A��uu �#`���:G^���(�
+�k����k��H���T�cst]?����o���a����{�qG��ɾ�瞹��dʁK�=�������EP�E�� ���x�CV��<+d0�E&��I���q�Jb�DF��R���6h(�	
�5+�`
���M�0Egy<�|e���ކ�W��;r��3�]�Е'
�^O�U�]
�G�dv��$��\�]�7XɣX�v}X
*�**�J���q�Z�fB���@	=����D�R?�ݔn�K�����vf@��b?F���w/ῗ R
�ә�s�F�4�
+�OU]�<�W&Eߐ
�E�����;��|�c<6�������?
��
+��t���?���
���b�Cy��:pY��٘u���C�zxp
�_>�TGF��e
������X

�����@��\��[3��
κ_�� �s5�VRt�
q�%

���EN *�-R��I��M;pé=�
�?��o����;�<�v�qւ#��+�ʯwh�d��L�!.�7 ������:Q�l�����,8
<�’��2P 
�I&iM�

T�
I�+n�#��Yo��/\����DV���P.E6��׻s[ʪ�ۏ��U
���@� ' �m��7�J\Z㛜�q7�,�d3����*��$C ���%Ș<�Yj���Pƕ
���M���M*���"5����>U�$
+ۃ@�6
_t�(�
�4ܹG�����7�

��
���;�r��\
+΍N�O��[܏p*��-/
v�Ȳ���A����
 �
�6<���s�&l}v�4LزBYd
+],�@>��\{���-4�%, �3��RScĤ s=�W湽�]�&\P"t?����~F���k����x���Ka
�N����0���\E�M���y��9ڍ��.��9.|�R���4"����
��]!1��iu9t�x�.���|p
0U�pw�b_
\��-�Q� 84���p4�H2�����S�
+V�o\3�g�(N
+f�g&ql8w���ɶ;G�=�x��-��͇�t
C� �>L��8v��x��A���;���<�}��K���:7
jw�+&1�6�;���2B��̺@�,�
n�x��YZ��YH1_dy$3᣸ò�`�x<!յ%!���X>a�
��k	�؁�j=���D���|�r7��� �j��a��h��^���a"�n�vߵ'.ɕ�8�6�T���M��Ve���]�,;	��4 at 4�ٔt"3I<A�TkQ�g��5B�T�
�g��zio���#�N�5�{,B�V�'}�2�V

+�&&o��c���f:���:��X��ʜ$6�R&��
+��=H��Ujg>�2�0�����շ�������F
X��f��:��G���%5���/AG����L�[�{�����=r�PvR�h�=���ȖZ
V�B��5X\4�K�a��pi�Tyl �N2���/���tvK`Ѱ�A)ʀ��v$��֙��-E6͟
���i$�-�"Xu�@��'����
%�Fc�j
��GO.,3�[�d.����ey;��Pr�P#�	���{@L3ӌ]uK�G1�/�܂���9 e'òP*0�QlF9JnL�l �<J��#��2BR��@�P#�=�


�R��X�G֬B����d���ȉ����s爵X1$�
�S�_4duE7O�If����
R��:K�ɺ�{����Ԍ�;�K$r��h<N�W��Sl2W�B�C�kXu�{t�. ,l�[L�:'��%�&�)h�:
��0�
B+Ul��2L�
o% �Bq`���K�9�
���H��Z
�y�e�0�[��#��7
�)�2��t(U2��
�9"��
���X	���(uǓ|�i�\�(C�
�Z�<��'�׾�� �Wl9��~��u	j�%�5J���K���4�U����A�gx5N��֙eOV��'_�#�	�0��Rz&ݻ)�ו[�����r�K�G�1�sAZ>��f���3ji
+�����
A`��{R�(�X��\B�§���*�5��
e�򝋽�>�fP
H����8:	�����'!(Q~	I�܍�t.�Ä�b��DŽ�A3X1��
��3GU4�PcBs����!4�c]���M/`�ch�q�
+��X�"����� ڝ�8��f;�
��%+��
\Z]�*�wM�^�4��E�KL��̶6����Rn��(It$���	��h��l�g��(.B�gf9��C�?�y���Z��h

<��

�
+D�) b�٠��\V����U�&�����
���'\�K����}���X:�i�2�˒��˥��җ�KcJ�k�Z8/?t0
!�0~�~e	��I��6��5z���A�	T�C��;�j�f`��y7B)P�"X�&�:Y��$|X_���Q
+��E��~y�\͉[�K��+��W�IM3��3�JSze(R����������}δY�f�w�E����A� u+���Ա;n!�;�JA�:V 3�u�
�Ou���S0�
\च3ح��RF
8�����"'�T2~~�X�.�O
+�������zp��R�����$���?�·nF�a�
:&��|��:���^YT ��p�K�
�#�/ذĞ	�bHX�UE��5a
A��"f�䔘�O,ؼDƉ������ح�e�=�
�$bb��E
f� ���PԻ�πRf���Y��v�΅������汤��
��4��&���di��Z���lb�=I�U�����1F
#����Џ@hp��p��J��h� '�6����"M "O����
+S�.�u��v��7�	.�n��׻��;)ܼ��;k��G��D�"m X0�
1��ĝȱ��K��
1�0�[�5��&���&�tn��_M��p,\���w�s�]!�<�%�N���(@Ƒf�P��8����	_)�/<6jylD�Q���c���b/�
�ᱚ�F�Y�	��0�Kq2ef�:
+_�$
*�?$"0d�x8��X��[pe�nqy�گs�������p���"� B���f�K���u
2���0�no�X�Ό�g�p
�;ɠX�>�#�2v������>�����)Xa8�Yʧ���=
F2��ڂ
tIp�	Q��Wi�p$)��r 
m���o�c�������A
Y
Y]�	����o���LLJ\����;�R��n
���lV�ݻ�/|$�ϲ��c�S a
���7V��l~rn}>&�pZ/O�{?�|��f��
����m��.ez����۷OOOѡ�Ʀ:wQ5�=�뷗.EE���K�w]�8~t#��4�

ԉ����@O�Cs~R�����1gendstream
+endobj
+734 0 obj <<
+/Type /Page
+/Contents 735 0 R
+/Resources 733 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 712 0 R
+/Annots [ 739 0 R 742 0 R 743 0 R 744 0 R 747 0 R ]
+>> endobj
+739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 475.3731 138.5874 486.277]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03a) >>
+>> endobj
+742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.0892 293.6084 416.0565 304.5124]
+/Subtype /Link
+/A << /S /GoTo /D (main_HPR97) >>
+>> endobj
+743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 245.7878 126.9711 256.6917]
+/Subtype /Link
+/A << /S /GoTo /D (main_HPR97) >>
+>> endobj
+744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [401.5296 216.2082 458.6151 227.1122]
+/Subtype /Link
+/A << /S /GoTo /D (main_bounding_boxes) >>
+>> endobj
+747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+736 0 obj <<
+/D [734 0 R /XYZ 90 757.9346 null]
+>> endobj
+737 0 obj <<
+/D [734 0 R /XYZ 90 576.4404 null]
+>> endobj
+738 0 obj <<
+/D [734 0 R /XYZ 90 571.8327 null]
+>> endobj
+740 0 obj <<
+/D [734 0 R /XYZ 233.4105 406.7952 null]
+>> endobj
+741 0 obj <<
+/D [734 0 R /XYZ 90 390.0681 null]
+>> endobj
+745 0 obj <<
+/D [734 0 R /XYZ 189.6058 207.4061 null]
+>> endobj
+34 0 obj <<
+/D [734 0 R /XYZ 90 190.679 null]
+>> endobj
+746 0 obj <<
+/D [734 0 R /XYZ 253.525 113.0043 null]
+>> endobj
+733 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F8 568 0 R /F11 416 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+750 0 obj <<
+/Length 3510      
+/Filter /FlateDecode
+>>
+stream
+x��[K���ϯ�-RՊ��r��q��g7�u�`���pF�%R!��'�>�h�$Hg�8�ŕ �D7��5��3|fجPEfd�g��
�=��n�{���ː������i53��B����4ϔ�b����9ϊŒ3���Xh5���7O�/�M56][mK���ݺ���K&䜛ŷ�?������KI͑�?o�����@��oX&M�f�p�2n��mor!������ߧu�}!�;��s�'dƴ�~{w|��ۻ����is_�
^��vUGۄͽ�L�`UЪ�3�n�l�ռ��%- at c�5���_8]�Fxb�(L���3�rX	��@D�g���@����;�/�����L!K$��[f���R����e1[dU{G{Vզr�s
�����p�o��P�\?�>��J������ݟj�w>�$��v���\����޲���eb��`��`)���a��f�[���"+�����<�EQ:�o�P	}p���X!㺦�n���z�Īk����vL�ZJYf��r��
�(��	�YY�2v�hc:�L�xc�
+��~HH�3��vM���yqd�%,�.�Q��r�f�0
���������T�k(�B{�n�
q��c��<!
�	������{�y]��i�i�fݓ�gs'X��5+�rb�e�!�5�� �i=�.�
+�2�tܢ8��Lt,�)y>��r|���.ӝ{�&�����887c�����d��<$�E^po�aos��z5�J'
>_3C[Tb7c:�e�ֱ{B
��
���.r��N��> &3
�F|�D�W���������蒙亜TΒ�5!a�<Z�dD
9!��
��=�ciDl�S/�q�)�%�g�����~~
X��!���(�����Lv�_V�"ԯ>��P�8������Ħs�Gő�$B-�:���ΆZ at p)�<��P��1�c�gB-���P���"E�����c*c,U��yP�!�����I�	>�����2��?r��-T�:���A=��@���#��
	@]Be
� Were�}�XJ.�,r�𳭖4��6O����R���aQz.oA�JO�8B0�x��)��������ΰqZ1�J�G�9$�s�}s�Ӫ8�
H��
� {���@��b2�7L�ן�{A/Y���~�g�dC�bek
׮�<Ѩ�'{��� ��u��&a
�*g�`���PŒ�sU!p�IMx%���z,���j�+�^ ­�:,��0��;R�@�m3:�v��������u-����0w ӎ{�ꇤ�Y^2�a��PB0Ո
���4�Lh�h
W�8��6��d�q"���>Y۠{)��=j���ʴ*@`	�����h
�h�Y��������V��Ւ�jy��֮���㶚_��/�W�g���Z_]�Z��km��?n��D����`��
��{)-$ i�毦��?Em~�.��m��& *x�y`<���=�UX���3M����o��/�>�r8v�r=&g}- ��l�캷]���1�3������ٛH��d)��J	�-j"�fI�ŭ��M���DBq5�
7��WaAh[aa����l��r*nq�������!�c��;F|�
8
#�ۊl��	��Gg{C�C.�3�3͡84�+�.�F��&�X�$8�����
<4�ZF����� {	ZF��Zƀ�����A����c�<5&� 3eɏO����j[ȯ��E
�� [...]
+\��*��v��-A�9�i[��;���.���G�r�U�x]-Ĕ%�L�<��TCsG0�xǕ���nSg���0@��������U��tN@¼�GU�?����/�6��#�#!��q�
�ҡ
E���$�����
��}��l:H0�
 ��+Э[Κ�a�[�%�zt<��fO6"൦}xk�>��(z�`ie˶
�^�ka����˜�߼|�Vsr	u�؛���!)���z��
���*�nʻ'��ج܆�7�b�䮷��頔D�`S^�Xx�X
��P�
+x���
��D��R*�>̈8
>�������y�Ʌ�a
f��ӕL�3���m���
����8�_3G��jw�x1 zo�!ʦ���
���D�o��[�q�U$ȶ�݃a��̈�}Jw
�	�j�3��y����,����
n֙q F���.u�vpc�
�.�`ԸkE�+�`��W//
A�羘 ]]
n��ngA
m��߭
����:�<Z�t@�
k�,��,��������	��t\z{7,��M�@G����0��tQ�d9!
��g��c2�����`$�=!��wi�+�=�Tn����F 	�=��Xp ��P�
~�Xw��n�n��u�&��`�
��#o�N�&Q#���Ȇ0�����{�}"�i��-�!���Ϝ-� "$�e�X�w�T׀M�t��lw�y��^�;{G���~tcHU5��vS���
*$rM
6	i2frs� $�p0�]=���pp��?��F?*w[5ä3lP�X��� �E�\��?b		.�ē]W�%��J.�T�Hr���� w�ןU7&����*'$�����r.r<(�
+_�����Q
C�}����^�}�:�L��>��O_�]p �>�:���[ˤ�4X

#�_���=���0�j�#�0Rar�붮ж8���z�֩
��l�|M�ah �įD���ݓ� 
n����
ʈo$���n[a_&Ei3:^�
��?T�^A������
��
�%
"��A�]	�~P|p���btk�
�Վ�S(N��|N���=�
+�݆ԓU<��������j�ٸ��k?�}{��[9q�i7�Kp�ZW=�����v
n�+t�t��|H��Н�ڭG����=����6�O�H״˔톱������=*�y��B�zj8u*��QL\]K��	�̳��6C��ײ�QJe��-�I��K�@9�,�w�d���o�����fk��[��T����3]
�M �˨U�:�0�Wx���f*�
A���Xu=���
�9k��Pkb_�7�|U
~�{���#�\��� -<��=X�Qho�c�g��4� ���^,�����mSg!�hF
+9�G ���0�<�dۍ�n7��'r�f˾w\W�v�mR���u�����hrxoL˃�x+�d�G6�•���Q
+$��ZG���O������`�dN?O���ձ��C koA�3JǧY��+�)%����f�����0�� Bk�
Kr��� �T�@�ESV�֝�=$m��ks�W���_Ay��BA|��U��U
ȟ8L%
De`QPScO�����~DY�9��DO����_��^Xo�?���Oֵ�d�ݫ�/�Ր��f�g��r�ۼ<�+g
�N!/Yo9���?g"�+#Y��X��{�K'~��'��?q���endstream
+endobj
+749 0 obj <<
+/Type /Page
+/Contents 750 0 R
+/Resources 748 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 712 0 R
+/Annots [ 758 0 R ]
+>> endobj
+758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+751 0 obj <<
+/D [749 0 R /XYZ 90 757.9346 null]
+>> endobj
+752 0 obj <<
+/D [749 0 R /XYZ 90 733.028 null]
+>> endobj
+753 0 obj <<
+/D [749 0 R /XYZ 138.1482 591.7365 null]
+>> endobj
+754 0 obj <<
+/D [749 0 R /XYZ 90 576.3526 null]
+>> endobj
+755 0 obj <<
+/D [749 0 R /XYZ 121.5512 398.6334 null]
+>> endobj
+756 0 obj <<
+/D [749 0 R /XYZ 90 383.9636 null]
+>> endobj
+757 0 obj <<
+/D [749 0 R /XYZ 121.2721 89.9637 null]
+>> endobj
+748 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F79 571 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F11 416 0 R /F8 568 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+761 0 obj <<
+/Length 4386      
+/Filter /FlateDecode
+>>
+stream
+x��;k�䶑��Wt>����-r�|��8A^���!@l�Yۭ�UܯH�7@��U�EJ��ٵc��� ���z�V����U�*b�ԫ��]����>c���o���y��
�V�X���ͭ��Q��՛��kF�͆QJ�o�57����
���
������?��t��
��� �����7���7��@��!��?��[����F��F���f-_
�I.ƛ�����+��/܄�:OY(�j%�B+"�R�r�̺�5��x�WWw��7?
]}>��Nx��������v|����M�����Ə�����w���7/�P<!
+��K"�e��/n�Z������z@����t��c�oN���ן~�:<q��ŗ���7I����mWw���swB�����S��?n�Z�][�I�>2ǽ
�`oG���	I i���b\#c�*�
x��]��7�f�|C)?6;�
�Ī��W�h������.
�*��q�&
�!c�*���g��̷s8��ᬚQ0��8�
+�%4�Ln6������y�
���Ys{��O�S���w.�s�m���d����)�Oee
eIK������O�j�N�)�Z\ag
u
��~���]�_���ȑ�a�rY#�$O���ߵ�w��E�KЅf�ߤb���d�%p�=u��|:�<zx���_CmIC�P���A�NN3a��4�Y͹9>��=M�V��g]s
+&r����z��t����&���������C�V�9��.Z�L�;4�w�qf�a�
��!�<^o�.���sO�:*���v:�!5�2����'�8�J����-� D�嫀Ly�����d����_H�do"�#�޿J����T9p��2��t�kyM���tBI��p�����K����U3�
+7���y-�/���+�b��\$��xM�6��=�uxhao����/�yx�~�-EQ�
���x!
��w��]���	�kj��OqJ�/F
�	NZtT=�zO[й6h��^�H\n�'���]����ݥ��+7�,*�]��M���.Q�AV��F D�
pሐ����ĂW�� ̬_���gu
�ૠ�63
�� #j�싨��#`n;B��GR=P�9@�f�9��C��i���g����:���)Hȱ)IAaQ��nC�"c�5�]���r�'����#l�a�2x����{}�=� ��\�dY0A��
�A*"���9�kS���

+'����4:���Mu�9\X
�Ì4:q&�
M��v�

�Aץag����V�o���s�ږ�@k�f�R���5C�o�	�8p��.��-D�V"��1��QWP/����5��!k��� ��?=oL�7���ZΟʛ8�
+�K�!��+�
��B���f
t
���r��h�<���Ee 2.|C��nO�����c���M�n�`Vz��c(��nL��f4Dfaz�I��:=�O�0֩���/�.��/���?0�GJ
�}�<P.���h���m3��+Y!g5�,/&7�]�����)I��N��i����dd2!X}eW�I �^��q�&_��9�ħ���)5st��g�"PS ��I]$%a��.`ys�Vt��`LTP�	��]/aOs�ӂ��vS"�Sx�A_���oo���_�~��g�Yu�l�I��08� %Kl���}���A�+	V���� =\�!}��/�����N�?8��]���Whlm�"�y�<��-V����}vˈ0��0
�q7|�C��J5���xM\0f�&�p:�8�g>�L�4�1�jX
�aq53m{��'���T*�*.2n
8`%Y���m
� ��%�8�9R� �5��̚��������&�Ks�F(Z �*)s�Ma���@���h��1�~���{���8�&ʪ��t�t7r5��q��|��U���
P`,��qA�)K$,p���R�!����ˋ�tj�N�0|UFF��\B2^[� ��~U t��-
#�
�
����Xs�a R�Ǫj�#S�G9�e�+�����Q��V�T�20�H
b�Q��0�K -�
lC
+��l�,�@6*e�yP
^�ݵ�}�:��]�F2��ج��4�|�<ˣwK��X.�4��)�Q����� �OU (GF�b�Ø΋Vu.\y���>R��]���p�,L�.�Qy
�z?�t[�
�hUI��#��`Ux���2�|x�Lp�, *Z��K�n����T���֟|�
( (.H�$�G�n���_M~B�n�L����pK	��p{,	XY��� P�f����V�%P��\�|\(��֕$N�Š.#��I`M-�\2�&�
�he�CK
QP
R��ˀ�����[�+U��%*Ḙ��Iw#cR,F�(���a��c|����
��>r�KH�!1��c��PqQ���1v	X���B]����	)�E������„�
�Uc֢s�qu��;���ːyu6V�C�~;v[,|���v�l���ȖÛ�P
Xʂ�v��6�&.��X.�Z
�Q���Ш���0k3�3qa�&\x]T�lȷEK�r?����)�
%�b�Iƕb�	�Ln����������<�Ep`«)��U��P��VL�At�,`2sx&賜�GA�$����x@}
+L�����'F�@�"�J䨴� �S�Ӱȡk�����҃�&�a������um	�]J�K�+�+�<2��M��l<f��"��$ڂ��J󘀔���ɏ�L=dI���a>D�K���5��|W
U`c���[�=�>J�����'b[�;rZ/5���z=e��-�'*��%D�LQ"��c5ȿ��
�e(eC��-��o�
+����o�(��HW,����=���p�
�Z�*
+t,h]u��3�?�3�1ă)N�M+R���o)"
c��t�ywb�}譀�Z!�H��AR��8�p�-C���
�,�a�\(����(�2�M+@��_D�X΂0���%�j�)_��.s�t�j�Kˤ���d`��9*ޘ_x�p��Q1۾<(c	9py��:��ۘh^ݱ{6	��
O����j�w�L:��Q� &�{餦PD���]�EM��釮���cMc�0y�%+�t�&�f;��9��lL,���k��īDA�d�g���x.�/
Ąao�]B�z|o�o�mH��'���f*�F.�U�:'��%A_��t�o]�U­�A�ϐJwz
y_O!�`VO��X�쏲>ϥ���#H�Y
���'ϱ�d�6��
+T5���
+>
2d
+�*�Љc/��
Z&͝�kݟ�K"���'|?�E�~&�;���OڒG��a�KEױ�;v���C�C{�'�ԏ-u8
�O�1{��!����j��1����ev��#���
O����C�j+IŢ���`�D��X/��5\�E$ま�Ỹ �y$��$:s�ѵ�E����S�8�T*����A�DҬ�
��phY��^��B����DA
�҈���zHa�O�3=
$`�ؓ���:<u��Pfùtxu�v�?E�J5N-�jގ�Y-���?|�x���m �
�b��>�m4��J
pH
c�*��^��
E�+��f�_c���z�_����O\m
��jaW�Q��\hyE��G���K+�&���r'rނ� )�w5��`=m�y��ZM�i{;;t���&�L�
&g�Oۺ��ȼ敂������ۣ/��6!���=�}��.��;����
&8.��?^����Ɣ+�U@^1R)��+�Ä�Hz�]ʇ�ھ$�L�̓�Q�1�hZX���}���"�k��=� d~��(B��3
�#��M:j��RD�e�:ľ�����4�	��>�6�Z�����a�8��8:槝���C�܁Ǽ��d�EJcV
��0r�mӅ��I�b��!�N�!�(
x'IJ����Rhe�Q�S�/á�@״�T���ꉨ��dw�eV�uEkC|�G�n���!^�O \�A�?�k�W	�s���3���� [...]
+����h�Z�
���6���nJG��u N�� r&�
x��gN��0
F��Gr#��u���km�n���a�9���_'#�O��)ȼ61;� ��*ȝ�z��¼�A���(PuΗ�?�a�?�0�ˊEu�&evr؎R��a��e�,�&�S9;}��;m/��?I�
�/�.`e�ֈx�
+�MY����'Nu�̵�����O��0��4񫤱1���ܵ ��)��D)Q��9`$����}��
�
�}�
���ȏ}#���PO��q�t����o�O��`��T/cN�R��>��R�kx5~	���{��:�`o�h�%����x���C�q�&��m�pq�����ŋ��{����؞;�/������vJ�� ���&ZВ�_���5-�X�!z��;��
��R����endstream
+endobj
+760 0 obj <<
+/Type /Page
+/Contents 761 0 R
+/Resources 759 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 712 0 R
+/Annots [ 765 0 R 766 0 R 768 0 R 770 0 R 771 0 R 772 0 R 777 0 R ]
+>> endobj
+765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.3898 683.608 208.818 694.5119]
+/Subtype /Link
+/A << /S /GoTo /D (main_CH78) >>
+>> endobj
+766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [414.2879 683.608 461.6599 694.5119]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05) >>
+>> endobj
+768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [460.9056 642.0733 492.7858 652.9772]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76) >>
+>> endobj
+770 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.2922 535.7163 232.932 546.6202]
+/Subtype /Link
+/A << /S /GoTo /D (main_Bag98) >>
+>> endobj
+771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.8959 535.7163 359.4113 546.6202]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHZ04) >>
+>> endobj
+772 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3496 511.8059 466.0769 522.7099]
+/Subtype /Link
+/A << /S /GoTo /D (main_poly_powerset) >>
+>> endobj
+777 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+762 0 obj <<
+/D [760 0 R /XYZ 90 757.9346 null]
+>> endobj
+763 0 obj <<
+/D [760 0 R /XYZ 90 733.028 null]
+>> endobj
+764 0 obj <<
+/D [760 0 R /XYZ 90 714.3182 null]
+>> endobj
+767 0 obj <<
+/D [760 0 R /XYZ 90 660.6939 null]
+>> endobj
+769 0 obj <<
+/D [760 0 R /XYZ 438.9586 621.316 null]
+>> endobj
+38 0 obj <<
+/D [760 0 R /XYZ 90 604.5889 null]
+>> endobj
+773 0 obj <<
+/D [760 0 R /XYZ 90 512.8022 null]
+>> endobj
+774 0 obj <<
+/D [760 0 R /XYZ 90 512.8022 null]
+>> endobj
+775 0 obj <<
+/D [760 0 R /XYZ 90 498.2319 null]
+>> endobj
+776 0 obj <<
+/D [760 0 R /XYZ 90 105.273 null]
+>> endobj
+759 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F11 416 0 R /F25 348 0 R /F8 568 0 R /F7 574 0 R /F12 664 0 R /F9 602 0 R /F13 577 0 R /F30 661 0 R /F6 565 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+786 0 obj <<
+/Length 3081      
+/Filter /FlateDecode
+>>
+stream
+xڵZY��6~�_��h�,7����6q��i��y�$Uˑ83t$Q&%�ο��E �9\.Wy(�	4���A2���*<SB��q9[n.����� ~z���w/��bV�JR9{wmW�	J�����9A��`��wM_��n;\.���n���o�����%�����^����yF�P|N���~����șg\0I
_.~��Vp�/0b��;���*:�\p���ۋ��	�B����� �S$@�R�� 8���`���A%�#�+b��e����`��|h����]��^�m����Ѭ��̗}{ո˓!�i�M�.ݏ.:��
+���.��6#��M���m���/���b��]5+Gtuo�)͹F�¹��U_��N$�]�
�Yŏ޴���f�񢽪�f�n��k7���9iI��*����� p
�-�<r�
,�T�WJ��<`d`)���K�[oW��
��=~�
`􌦝D�ώ˴�$x =
n��#Zr��[G�f�̴!�3Z�� ��o��4�tf������~D"%t����J���B�I5�R%���I5'g
U��*�rM���g_��f/@��˄����-�aۍ��tMJ�&�Fa�
YaiOs�� ʼ:a�!"Y���ͮ�K���e�#�"��Ѿ���0�#���
�2�8�:��?0	Z���� P0$�p�����""0m0�Y�;�X
Dk=#b<U~?�
�‘���!���`,IN��WS��)�ol,��,�Y�	�R�OO��q�𾰙 )�O?\��T��'&AIḯ5�
Y%��E)KlV`3�>+:<�MZ�+�U����(}��,
l�/�BV�M�����1�zs)���oV�e�gFp؎�?�CQE0��9�c��?����Q�
�k��(�CZq���үX,��A�uʑ�Z�t�s�c���rvcR���7�� �B�_JQ���c�r��j���g��V����~��U;�?l����]��}N�����f�l���	EUV��`�S*4$��䜪Ӑ�2�������s��a�&i��B��&h��
k� ;�
+��W�|��� U�,�{}����a�#D�T�u��""�Ǭ
�d�#�����T�C�1�9�%��v���O)�
Wg�ŧE���A��$
������n��wC
3ʕⷱ���&A2o�N��FD�H�S]���.�nv{��(�!��]��BAϼ}o���gU�ѩ���G?
�΍��;�
L���
�U�K�P�'^5��~�yw=�.
[h
+X8d��י�� 0
M j�f M�B��`��wi[`}۬���U���oWf�C�>�j~�r2#q����J����}
��@p
+�fI�(l�����q*���S�FCm
Qe��{:tA�����
lS%��@��y@��V�Uc�;9᚞�)���m3v}�n�P�H��)��6��T�i�
��F�E���]%���;Z�5�I��[S1��a$1ə�:j#��MW
���ՠ�_}�^�����7!��/���ؾx���>�`�S:������O�`��2��mO�s�
/�g&V�`x+7�zd�
c+ό�xQ�����r�
��X���p� G�E��T��u�<^g
%���a���h�,v��笖Hj�0���P\A�)Y�H���
+5YmD��m�v����nST���T�m�Zb�NZR���h��5O-����[���Y���(¡y�7��_v}�xi�p�$=�:��u���{a�������
3��
�� ������W�
� �����n��퉕�3��'�rb��l��m�gy`,�z��lzK���������u!�t��n���@��ڮ����C��&@=��S��|��-q�}����o�K�������#�y�n@�֢ꇮ
�x~n�E��+�sz�:)�$�I����fPЂ��ͮ�}'���{\��K�G�?㯴��d
+%1�"�pS�`�T�FT�g
��b?��F�gSF�f9����y��,)j �y)�gb��o� SIM�V*!����o$��{	���
k�CI�R}
ek�؇be�l��	"�W��T#����up�L1k_ j�L�����Z��P
��L�}RODY�TJ��
��4�|l�٬
�ե�@��<�jZ��K�l�
^

���bB�X���#� I����:��ak�0���W`�T� �̭}�+(��V��+���9yN��X� ��,��Y����k��L�5��=��֫/
/P�,e����"&(�L

���:�:�TL�-���`�w
���f�d2���}}+�p�aƧ5}�a?��)B���3�8

�q�0��k��B`c ����d`�
Cz�2"�s��
��s;F���Gˈ��P8�
I����7��f�OG�)V���I��ZL3uZ��9���%~n�H���
%
�� ���J�
+��JQB��'0ᯢ����+ج*�]��N�6�\I
��X��+H ���E	X�|[tw�9}ʥ�#���.���-]�X�r��FL�ͰL�q�@��	�OXI���b����e�IG���ʯ

���88��N�qu	�uk�ib�]�*
G
+ػ�R�0��O�RhN������Y�u5VE�PC
+hҏ;R�gHf��$�,;��_���}I4�=�& 2�j�^��(��Wo���`p�]fl�w;7�Z�04Q����1��F�`ozH�����إGcf ��K!�g����fϮ7������
gmo�u(~�����)�|�D/)�C3-
�Lrr�&i��
��6ܠ���Oپm�v?j�����kQ:���ۡtI��*�Us�W�;0=��F9W�m����p1m?�8����Uӏ�]�?����u�7jB��.*$+~ދ�PD
+�I_[� �@%�u�Uӑ��z�x|�o�_���9���
�
������
j�h|�_�
�r�U
�B��^�~�4�;m>��h�H���5
O?E�7�E��(:��������˗/����r@�m��Q��ۭ_N�0����9�-F�	/���V!�`��2~P��Bs�����7�3~�w�V���kXendstream
+endobj
+785 0 obj <<
+/Type /Page
+/Contents 786 0 R
+/Resources 784 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 712 0 R
+/Annots [ 797 0 R 798 0 R 799 0 R 803 0 R ]
+>> endobj
+797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.3819 407.6196 231.5975 418.6321]
+/Subtype /Link
+/A << /S /GoTo /D (main_powerset) >>
+>> endobj
+798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [417.9721 389.9952 513.9963 400.8992]
+/Subtype /Link
+/A << /S /GoTo /D (main_ps_operations) >>
+>> endobj
+799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 378.0401 163.7546 388.944]
+/Subtype /Link
+/A << /S /GoTo /D (main_ps_operations) >>
+>> endobj
+803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+787 0 obj <<
+/D [785 0 R /XYZ 90 757.9346 null]
+>> endobj
+42 0 obj <<
+/D [785 0 R /XYZ 90 733.028 null]
+>> endobj
+788 0 obj <<
+/D [785 0 R /XYZ 90 684.6042 null]
+>> endobj
+789 0 obj <<
+/D [785 0 R /XYZ 90 684.6042 null]
+>> endobj
+790 0 obj <<
+/D [785 0 R /XYZ 90 670.0339 null]
+>> endobj
+791 0 obj <<
+/D [785 0 R /XYZ 90 614.7751 null]
+>> endobj
+792 0 obj <<
+/D [785 0 R /XYZ 90 614.7751 null]
+>> endobj
+793 0 obj <<
+/D [785 0 R /XYZ 90 600.2048 null]
+>> endobj
+794 0 obj <<
+/D [785 0 R /XYZ 90 546.2762 null]
+>> endobj
+795 0 obj <<
+/D [785 0 R /XYZ 90 546.2762 null]
+>> endobj
+796 0 obj <<
+/D [785 0 R /XYZ 90 531.7059 null]
+>> endobj
+783 0 obj <<
+/D [785 0 R /XYZ 270.2223 481.2642 null]
+>> endobj
+46 0 obj <<
+/D [785 0 R /XYZ 90 464.5371 null]
+>> endobj
+715 0 obj <<
+/D [785 0 R /XYZ 456.6211 357.2828 null]
+>> endobj
+800 0 obj <<
+/D [785 0 R /XYZ 90 340.5557 null]
+>> endobj
+801 0 obj <<
+/D [785 0 R /XYZ 90 130.1425 null]
+>> endobj
+802 0 obj <<
+/D [785 0 R /XYZ 90 130.1425 null]
+>> endobj
+784 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F25 348 0 R /F7 574 0 R /F6 565 0 R /F74 482 0 R /F8 568 0 R /F12 664 0 R /F9 602 0 R /F1 583 0 R /F33 485 0 R /F10 488 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+806 0 obj <<
+/Length 3780      
+/Filter /FlateDecode
+>>
+stream
+x��Z_�۶�O���fLHH���i�8M�K�Nf�x<<��c#�
+I�r����H�'��CG"��b����.@�b��+�VE^�Ffj�9\��
4q�]w�IH������U�2�QB�^�,��\p�z�}��)g�	g��_�W׉����Z�u����]6]s�~�������x�TQ���~�ꫫ���q��Rq�旫�o�j
bu�Rit�z��rc��p�	�_�W�_};�; ����Y��)S�
��
+��/��P
]��U}�
�eW�m�ゞ���hXd��
�����E������
+4!M�
P�� zr
D(��.4��2��(��JM!�%H�f��43YF���,͔�Vէ�ـJ��&6�ijb���)�w���rF4RDV,��ƭ�M%Ҡ�P�f9W��U40�Ӓ�E
Fq�-dv�U;`��g�I&9n��V��v�|��\M
�Ok\�v��6:��M at u���M���떿V
���M�T*�>D Q�R�zGTg�PǶnzD3��{�
Y�)T��
�����9�Q��U3ح_k�.�oaH[B������`��0��]0�kx
+�;i�};��.��%� M ��@�̌琐��y�~��M��Ň������F��F#
m$j�y
+0^����l�����a��X�̗d\���wA(�3
� {/
dJ�߻
��
�P B2|zpq�"u��H�����"��Hb�`X±�/�r��Q
+��?u�
*"��RK�(� ��1dK�opҲ�
��-����c6`�1����\��"-8;�i"��c�P����.ʏ����~PG���YHP�3��9��l�,����V�J	���Xu��vnkʟ��m0�QӶ�
��b����*�LΡo��
��އ-�l��i�B�O�O�=h�H
+F�QaC_
*j*{j����&0�^ۮ�����6b� 0��U�}�����~���i����hH�<�jgW��j�=�m��
+6����:�(�6�	e���
��U��zq�b��8��
7��L)�^���o#��Xa��-%:[
+Jz
j
�(r
���U�i?P#�[��/�&"��V�%TYL��LW�7`�2��Z:��*�(���c�R�)�מ�R"Og�S��	�� j,7s���߆���& �?���G�dKK	f��o��&����q�U�,��j�����
�p��l�aj*����w�OQݶlm��ݱk�m����I�DJ�
4�s�������~7��CR[�N��B�~�ō1o�Sr�1���g��Hua�%7�
,w���Yd%E��0��
eE~[�;������9cn����Hj�>�[7-�ۥ/��!
�!�����;�-��!�3�Rc23���Xm�o
`�֊0���۲��}P��=f[8�l[�����)6��@Od���ea���V
��0!�һ E���ŗ���d
���
��eb|}[Qé����U��G;��Вgߨ��9G#NP�%Dq�1
.�fm���=��5CU��s��<,BF�q���lwӥ�V
�ܩ
p�_zH!i��t��@
+����ٜ�UG��q�P
{O�3�Og���w��	mx�p���]���״�U��4X�.�
�p��1�|	���e
LȠR �T�&�T�^r��c4L�̳]��܅�Ϫn�nW%/�������
�o������kJ���a����)`����t<��Kw�;�~a���_�g?�c����O�!TD
JG�T4b�4!�:��=l�$����_6���p�zsڗ
��)y�
9��ҭ����� ��'���
ӵ7�PZ������Jsc|�������yJ�=�;�LX�D�1K�����9��g)���=��u-�P�<��y��u�O�K�Y�
�U�.�U@Д
ꯩ3w
�.ͽ�6ft���3�E�������!�b�M=�J�F�
�5�o�
�8�1�4c�w��Y���X\Փ�
+o�
P��?`r�!
+�l���F�(���Թ���d�S�2�MO�<�
�g>y�]��:¶�ɠ"I�$��^�H���z��hw( ��2��%x'׉0�9x,a��o8�3�0�w�G�xyS��6G,��9�͖�����<
�r�n at Lv��Yh�]C���=�eOT 
���lC=ݼ4��6���{�a
-����x|EG�|�/��U�/�p$
d�VJ<�OH�$��3��ᣦ���
�L{���o��ld����S���,PTQ��Ӭ��{{{�� �ƽ�~/���%
�W
�Y ���mN
+
L��dK=6����)��Nnݣ�H_� �eg1�CF�<�@�4C��{t
��ڟ(y(�r�B�z]L����VZ�0���c���|��L���ɅL�
+5�h~��	,R-�S�?ǏC�r<Ъ-8�nc-����}[S=N
��_a;܅VW$6����5�
hF:n
�Y'�>@�,�kj��fi���E=RL�!U�S�[p|b�P2�/?B@��fg�K����.�|rv)&���;��0��#�[�8��͊�ftSs\y� ��x$Z
+�y'�	 ̦��W�i��y�C�}U�=Bjl�
o����#�
+ˆ����:t� ���y
�EZ0�V�Щ�$�Ty�$
��|�3�
�}7�3g2�r5�s�݀�� ]�T*��&ҹ�d��N�Z�*F��.jً��q���xrܣ!O.��4O�J�nG�$
9�Y��
 �
F�D�t�b&�<��T�Yr󗔀�/w$�m�Y
+��l�Գ�k�=�Q7ѨJ��{�¯q����x�p��n�<����5��T��e�ٱ��F:��'+��-�&:u��S)$2������ zbCG�����{�5�Xy6Z�%�>�R�(=>��
���2"
x\�  ��J{�ʥ
2
+.my���2@��P����'��,��w6�!�f)���
�f�?R]C�4�P�M�,��
2c֟��m
��k;��m��;5R(�wj
�����S�0_
��‹��V��ٵ�����a�Ϧ��JH��.U؞>	� b���
+��W]��)���.�m u�
9��}B0�U���}?�_`����@��[f���G�KS/��
 ��Ix�@_
��|�$�����}�
xygu�cCt����d�+���S��nq�r�/f#�>	�6a�<����dr<�x
+a��$��z�
rd��h��T���z<
����Qm�=.~��|IPA�&�����f���[��>��C�bz�� ��%����l�>	�N��|Q\�i�#
+J��8
0pT��0��1S!��A)T8��&�Ǎ����=�#�Ct�
���� �SO�
!.��G0'�d������5IHz��~�	J z�ܗ�M�D�mG��f��|
Q?��'/���<��7�S<wQ��%�żH���f��� g���w�@�X����]J"���+3���h'ɋ�E(6�)���4��������എK7Ty���΄��8��z�T
+c�y4��ӃB�y7^b�P��?�4��4`�U������֖����!Ł�r�c���J'G������";z�s
gii�~�@��O��% ��]_�ۛy�ӂ�	���
+�8�7��;�Nt�1�������/�{���z��lN��|
9���F�
�J��A��d[� mr>�����OP�H��a|�Q�/.�~��<���n�����.���P�<_F<����KF��,�gL��`z"�xoK�0���[��~�4��yT��3�Dendstream
+endobj
+805 0 obj <<
+/Type /Page
+/Contents 806 0 R
+/Resources 804 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 830 0 R
+/Annots [ 815 0 R 816 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 829 0 R ]
+>> endobj
+815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 522.6997 126.9711 533.6036]
+/Subtype /Link
+/A << /S /GoTo /D (main_BGP99) >>
+>> endobj
+816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.7602 486.8342 434.2755 497.7381]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHZ04) >>
+>> endobj
+820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [222.8108 406.3801 266.3075 417.284]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHZ03b) >>
+>> endobj
+821 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.7053 275.49 504.4528 286.3939]
+/Subtype /Link
+/A << /S /GoTo /D (main_pps_bgp99_extrapolation) >>
+>> endobj
+822 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.5825 263.5348 256.9279 274.4388]
+/Subtype /Link
+/A << /S /GoTo /D (main_pps_pairwise_merge) >>
+>> endobj
+823 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.1598 239.6245 379.3124 250.5284]
+/Subtype /Link
+/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >>
+>> endobj
+824 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.5662 227.6693 294.0629 238.5733]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHZ03b) >>
+>> endobj
+825 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.4377 227.6693 349.953 238.5733]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHZ04) >>
+>> endobj
+826 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.1511 210.045 402.1613 220.9489]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.1264 198.0898 292.7595 208.9937]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+807 0 obj <<
+/D [805 0 R /XYZ 90 757.9346 null]
+>> endobj
+808 0 obj <<
+/D [805 0 R /XYZ 90 733.028 null]
+>> endobj
+809 0 obj <<
+/D [805 0 R /XYZ 90 672.6491 null]
+>> endobj
+810 0 obj <<
+/D [805 0 R /XYZ 90 672.6491 null]
+>> endobj
+811 0 obj <<
+/D [805 0 R /XYZ 90 658.0788 null]
+>> endobj
+812 0 obj <<
+/D [805 0 R /XYZ 90 592.1949 null]
+>> endobj
+813 0 obj <<
+/D [805 0 R /XYZ 90 592.1949 null]
+>> endobj
+814 0 obj <<
+/D [805 0 R /XYZ 90 577.6246 null]
+>> endobj
+817 0 obj <<
+/D [805 0 R /XYZ 90 487.8305 null]
+>> endobj
+818 0 obj <<
+/D [805 0 R /XYZ 90 487.8305 null]
+>> endobj
+819 0 obj <<
+/D [805 0 R /XYZ 90 473.2602 null]
+>> endobj
+828 0 obj <<
+/D [805 0 R /XYZ 138.697 153.4222 null]
+>> endobj
+804 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F7 574 0 R /F11 416 0 R /F8 568 0 R /F33 485 0 R /F10 488 0 R /F6 565 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+837 0 obj <<
+/Length 4042      
+/Filter /FlateDecode
+>>
+stream
+x��\Y���~�_���q4�!�*Uvbǎ]%K�J����
�i������`̀C.e)�*����LOwO��Df����3%2������n����?^��e:�ˋ�_I13�H*g�7�
� A	�]�~�D�bI0��7վٶ�z��Ͽ�U�X2ʸ�S����ۋ�]ƥ<%�Ib���_�l}{�3Z�
�F�:�\p���ۋ�<���BiC���AF�D�R�s�y��9��F9bܐ��oZ��|���J������n?��f������v��q)xx�gT���.���kV��
�z

�)��UWu�
)�X���m���v*�9�K��"�:�ݭ�&a��L���x1��2�/������@0DS1!a"�8ꩥ\S��}��<
�V��j��A e�dҽ��� �����kv^b ����
+W��jZ4L�'
+Iʝ�\Za0E�0�����ݶ�����aA`Z���w]���~P ?b {ꦣA#�=��K���',�p4� ���\o���n�=I�c��7%֠���^ծ
+����̏��Yo�f��zV{���!�M���0�8av��0��v<�c��{/�AFWu�LőRZ���M[W�{)e���-���k��C��Hc�z�k��ܛ �M�	?Y��7 �>W����crkf�uI-��Q�@��<�$�җq6����p��d�7'v7�Z_Y�m�0������H�D��2(X�H�r~5�U��MwD��
�H��R��86A��H�
�p����h�Q"����?cJ�$x&�QL�U�� n<�o
+kY_Bgɠ��)�ʪn�� +�0�J��F$�r���R���@� ����WY�R��+�
�d^X㪋�'�YG��!����*�����1��?U��`f�$��)
h�Dq
g���p���3��]�/p�H8�,���XC���]2f��3	��
+:�CQ�ut^����c�ђ
��?�c&���
���,�f�w�6�g�A{M�A��;~�
�:jKI�@��
+�s6;�^����d���5�`<�a`�mR2]�Y`.�'��Z�ࡲ."u����j]u}�T�T8	K�2��0%>�iu�-x��]	Vi��m
��
�qW�9�|br��Jİ��7� S��$2:����Lw8MO�n��=SOo�6����A��c�M�6�K�!��Mٴ �}
qw��$ubQD���2٧!vɰUmaV[{<1D)���}pF��=3`/���� `�[g�KFq+APz ���weǥ��@01q�U�J�Hy�+
+1�� 
+���
�
�Hz�@w�ְ�/���U��\B���Ξ:�������1�Is$Q矆 W��6�"��
+����pF`����p50��T�_� ��4'�"�C��pW�
+��!8p��4  ��G�C�pd�RP|^��0�r�,.�>���`� ۻ}5��pg�uw���
�a�n�m��@��#b��EgOa����<
��J}lG��>���1�)
+��
+ܠyQ
Q
c3Q
}Tw�VX�8��@gЃ�0�o�պ�?���7,w���(أ���AEPsn�&��*!��� ��1@)�01�$���l`Ӧ���2i߻qH�7�=
KdR�h<y��Ԕ�lW���bZܭ� :&�r�Y
=B�"R�z��,pb�y������]���K{��p�
g���`� *Z�/��{8]LN�j(Q���*]� ��sLu!rɼ
.B�$ry6�qш� �)��[U9ZU�\8��X͙U�I�6
�Oa��fA��
vw�b�^m�����(����x\,F\<D�c�$��B�c�? ��!�����O���F��|d(
��'L<�����^É�t�S���@t�9�#�R����%��S�UU�����!<:�Y�<�'H�wә�/\������/�د�����E�]_R�1i{"���
C�U����n�M��T[x�=4}],�
�_���A��~L���(l��X��e{�|g�6�R-�hJ���3Ȏ2P�
՞l�|@aU�@���z��}g���� fF[�����e�m�~t�£���)Y:`�K`Q!t���*�q�
�|����K���aD1%f�������������Q�{��j��O
+B��%c��gI�0"2�X�,��	B-&
c��D�KD9��jC�D�y��Ի��{��XJq�D��@
�4�A]:�E6��*W:�X���*��Ǣ�_��Nj1�nQ�46q�֍Ҋ��s��Z�UɰH0g�
d'ۆ}�$�&-�������
+��ղ�:	eC�@>[F�0��z�
+
+�%�b�(�=��OJX� b�8g�1�h2��-I�����p�*��>�8Kɨ��Hc��Y�y��-Tԉ�<1X�0�O��X!�"��iU��]a�p�������fG�K3�:DQ9����` �bԉ� R��f���`�0���PI$N��mÎ0��BbTXog�
'm
����!��y���<�!M_<�J�M
��@�/�w��hG����
d����j�[��B� �L�a�

.�[����)
�4��̤5��@%|e>�0���e�ϲ ��v�$�L9����$Ia�i�����io�(F��bT�T0�6l��#����bnÕbB�՟Q��\��4�pZ��X�;QQ���e�1�gg(}!�2$�����Ϻ���0��U2|Fr0)���������=��<���0c��v�laȮ�O�"6�]��3嶷�w�B����,W~�+������]
+��+Qu~1xmA�w�G�s�q}��l�	������nլ��hN���I������e
+PT��;�*��f�_�������^ ��`B�7j�\����W<)v��ؔF�Aq����U������-����y!
1kTʣ:Ǟ�9K�ԙ����
�ӇN��#X�Eۡ\�
�e>�`/����������E�
���c�[�fQ1ms(�����Q=�C����7�
+���\ ��t����DZ[8�U��ۛ�aO"�;�qO�V�ˠ��.
��]P�A��N�d9�Ǎ1���
�R�ɌA�}ۼ�
��ĕ@�Dc��x���tp��p
(�v���ؾ�6��Rb
+\��-��,���
���@b&��36٪�SC!����H!�|
��v_߆i��n���ܖ�؃;�S
m��B��#�_�{���4BL at J���yx`�,`�
Tpix*4�/����^d�Jh��^b�����x��R��rQ������h���Zby��g'
=3�d�{��F9Tc�̄���#�
��H�`��c�h�
	��ţ
�Dq�iL6�5�\��O.��׸`�?
+���'gA�m�9���{ =�jRB�$ʒ����8�s�Z�-`���̤=|�Xo�B��k�C��;�K1?�VV%9c��A�
�
J�����+r�E�
=�6��'
+19X��&�ϯEKA��֙��ײ���*y�^7��d-���
�,`�
�ﴺ#�^q!��'�HO���~��`�kۧ<��
�pl�>X[�Mt9��$�mf�:$������cFjA�	D��7ƦQ�dLf��i������31���cv�u͕�<ۥ�:?�гm�� �$>�&+�ze[�6>�G�
�� ��ܢ���e#|��_8�
�N$q�n8���a1���� S���`
�;A��~ ��L[���؀��*���)����E���2;z�X�h8�nԸ�C��=t{��@#l��E��ւT]���N�=����Ng����	�#�Nz�
+�h��=�1m�[sa���7��F��}�g�×��~wlH�u��"b��� �n�V^o׏w���S�G���?���� �g��U{"����#n ﺚ*���A���	��*@�2.���������/,�7ܗ�*�8�y˰��^<���{qڮC���n�~~�}:F�*vJz�8耖��
S��)-7!��l�:
8�m�o���c�3�)�4���endstream
+endobj
+836 0 obj <<
+/Type /Page
+/Contents 837 0 R
+/Resources 835 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 830 0 R
+/Annots [ 839 0 R 848 0 R ]
+>> endobj
+839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [403.6137 695.5631 458.1788 706.4671]
+/Subtype /Link
+/A << /S /GoTo /D (main_BDHMZ05) >>
+>> endobj
+848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+838 0 obj <<
+/D [836 0 R /XYZ 90 757.9346 null]
+>> endobj
+50 0 obj <<
+/D [836 0 R /XYZ 90 733.028 null]
+>> endobj
+840 0 obj <<
+/D [836 0 R /XYZ 505.5668 657.1815 null]
+>> endobj
+841 0 obj <<
+/D [836 0 R /XYZ 90 640.5447 null]
+>> endobj
+842 0 obj <<
+/D [836 0 R /XYZ 393.4957 461.5733 null]
+>> endobj
+843 0 obj <<
+/D [836 0 R /XYZ 90 444.2429 null]
+>> endobj
+844 0 obj <<
+/D [836 0 R /XYZ 322.8747 245.2669 null]
+>> endobj
+845 0 obj <<
+/D [836 0 R /XYZ 90 229.2925 null]
+>> endobj
+846 0 obj <<
+/D [836 0 R /XYZ 222.1614 145.8949 null]
+>> endobj
+847 0 obj <<
+/D [836 0 R /XYZ 90 131.3154 null]
+>> endobj
+835 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F11 416 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F8 568 0 R /F79 571 0 R /F76 580 0 R /F1 583 0 R /F7 574 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+852 0 obj <<
+/Length 3977      
+/Filter /FlateDecode
+>>
+stream
+xڵ[[o�Ʊ~ׯ���
n�/6��${������DI�g��pt6:��T��lNsF��`�
^����U_}Uݢ���KK.�ԕ�B]�l/��=<��kx��6�����V��VV1u�����h%e��oZъҫ5%���և����՚I��n��Wkθ�+&�~~�׋�~��
+�H�(��~&�� �_/Hŭ���T�Zv���Ǜ�Ż�7���}P��^sQ_.Θ�()Ҍ%�̘U	n�ej������ω��I~9��h���ܸTT�(��[{���������Q���v�%̗J�a8�b�[��*�JKAC]j��޷�e����а
��7�f����:�/&_	VqNT��

����mw(�홌��wy)���24)I�*�il�M���� t�
+&
NYAlv�
+N�8����&+���V��Y+T٠����0���5�|���]\Ƿ�%�k���\��+E�[u����wñ�
�_�>>4��$:�(1湢+��Lޓ���л���qZ�(�f&S��?�<?\�_�%�����F��94��鋊��HK�o�'l�VŠ���]Y]���ŚVҚ��"W]f���PB
 c�B���-�.�!���d2i�5Q'�fG�A�"�>>�
+�(��3!3b ꤈�
+��b�5܁�y�l���� �
+Z��֔VVJ��a��d9V�gV)k>�N�*C� 6��c���� +M��2�68���Y >9��gƍ ��[���`Y1<��MA��İZGo�ܞC`�X,"����2@�H�
��Q�3j�c9~�i��0Jg��XN�
)?�gf�t�,ć	
Xs�Jx�S��S�T��4����E4A�8�hҦ@��h\*9:�,
#+C�>Þ�Z���+�R�H�4@.��4�X�4z�D� �����%a�bF�)�E����b���H:jkiR�\H{[.��oP�Y2����dGƂ+
S�J����C3�C��}}pn�6;�f�
Mwp)TA�G&*.����2d�:V��
^�ս�7<���MO��~����ȁ�t%� /�F�|WD
-
4d
˰�$���I��}�
�y	>º6
+=<^����p����xs� ,
+O��8�0%�������y�|��̊U��Q�J‰%dT<p���ׇ�O�����������>���(C���n��u��uu/ݼ��<���N��a�C���7
h��xn-����q�dF;2��	y���l|swŤ_�`�������kE�9��o��D�Y�\��
+� �
��*�z~_�G:�(�>H-�d�F��
I�R�%�7Xt�7K^��e?���,�IQ��hb o��f�`Pq s��xʎ�E�h 
Е��ceb�æ$����S
���3�G�n��@$)1J m2�HL��!43IAF� �p5�P�t%��	��?���Z���*���^1�R�/=�ץ�jm�t���
+d 袂�١��
S8<���i{�o��W��
�,g=3�p�|���m�������C��zE�U�>��_]I�
+���-rα}W������I,-r��X9�����@>5i�ak�3Fd�
��b<�dh¬�Aj�~�0�������Y��
K�:'>�߇�og�ִ�q�3�
E���̓�?�Y�,A�l�y�[�� S�О�כ��W����Z|����N�2)��gj&�?#�q�NK|��~$�HO��̨֧��Z��������Z�q���ׇ�ݦ)�3��!(a	hL���<�Cvl�:�-�
"}��(�P�a��_��0�R>
+�MR����
�I�+���
�
�	����i84�R:b+�F��]L�s0�|��+W	������=���n%��"U��g-��
T�/���UT�P�EJ�e�u
���;�e�k��Vx8�Gn�
+���K���bB/D�\P�N	0)�a�h��e�g��
U,!� (�J(�W�7
PJ�m��#�j�&�
�@��ܓin�W8��
 �/���E� ���n�
X�2��X�K
��B9h�|)�s$}��\
,H�Ҕ�`A��+N���DX*h���G6�h�A�)?���ی�슥"I��MZ�T�TFJ�y|R
F�w$�»X �miH��ļ�v�\^�"'��e��Q�AT֤ZeI�>�(h;/�)������#i*��w4��o���MH�L�/t�N� t���R,AJ.�s{8�&o��C�U
+�=���r� .h�c]N�u9�r�P�����6�X�;.�
��q�U *Nj��M���I�͗����?6�
r  �)W�5
�$D��OE"�e*�,���ܜ`3X�N�G���P�XV�.V�ph�I�R� g1f&%���A�2L��)��f@̎v0,�z@�YP��^�s`,���
.�
���L��TV��wE;�8㟠Sɰ�-
+U Xi&�����*��RCԛ*��5��q�
^�L�ML�=� �����b�oj��ݺ��O�6f�|�P�ak��B
�*M1�+:�)�N����1ㆂ��}��?�Wz����n�=�6%
�X8 �L�\N� }�YN#h,�:��ZD��d^���f+Մ�!��26����yX=�D���!��n��}PQ "A"A�X "���Uv�.����
+.�
<ϖy�'�8�+�
�����]3g�Y�������r��h}FC�>OŸ��!苣f�9"�P�?T�zDx���_��'@=�KP�p��QyFu&����Vx�b(�?jݒO
�����
�/\ڧ0�����)��n�x��lW.g+.��a�f��K��I�i����X��:;5�Om6&�&�1bKkc�_[�z�
�I�<�eq��`�27���>�(E�4��GqE�u���C�p�v�f��Hel:4֕�5AԼ2+Z>;%i�Q`�����e7;�~k�( ��긹9�DH!�!y�?^oBQ�U3���ݸ��\c��R�OB
�5^ ۹�0��o�|�o�
��}�T��� �\(�QL�~&S�#�r+

�b.�޺9^;���8�����m�:�=��'x#lZ�]H��Y��*!������Fe!�ǽ�93ry&�����\aZH�>a&��d�����ﶩ��_��#�be����T$��Ѱ��̰���nÀH�^���,��B67B
mVdS [...]
qG�H��M�P���GB��P���_ at -C>�!J�i��5�*�iC��Ɵh������0��U��6�������E%�g�Y�����
��aظ�!��^��m�C��)����*��C�������{��>�h� ?$Q	�=��	\�4�^�|
xT�%����x���ٗ��z���S=��Q��T�����ˏ?V7C�ص�}�
^�v��s�p�2`q'Vo�
ɒ�_@�41�,c���Զ�p�L�Ȏ$-���<�Izendstream
+endobj
+851 0 obj <<
+/Type /Page
+/Contents 852 0 R
+/Resources 850 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 830 0 R
+/Annots [ 856 0 R 857 0 R 868 0 R ]
+>> endobj
+856 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 501.9482 122.5378 513.9034]
+/Subtype /Link
+/A << /S /GoTo /D (main_Sch99) >>
+>> endobj
+857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.5489 501.9482 286.1139 513.9034]
+/Subtype /Link
+/A << /S /GoTo /D (main_BDHMZ05) >>
+>> endobj
+868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+853 0 obj <<
+/D [851 0 R /XYZ 90 757.9346 null]
+>> endobj
+854 0 obj <<
+/D [851 0 R /XYZ 90 650.9448 null]
+>> endobj
+855 0 obj <<
+/D [851 0 R /XYZ 90 644.3446 null]
+>> endobj
+861 0 obj <<
+/D [851 0 R /XYZ 393.867 463.9005 null]
+>> endobj
+862 0 obj <<
+/D [851 0 R /XYZ 90 446.4798 null]
+>> endobj
+863 0 obj <<
+/D [851 0 R /XYZ 116.849 329.9565 null]
+>> endobj
+864 0 obj <<
+/D [851 0 R /XYZ 90 313.2293 null]
+>> endobj
+865 0 obj <<
+/D [851 0 R /XYZ 353.5391 196.0125 null]
+>> endobj
+866 0 obj <<
+/D [851 0 R /XYZ 90 179.2853 null]
+>> endobj
+867 0 obj <<
+/D [851 0 R /XYZ 127.2696 115.5583 null]
+>> endobj
+850 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F79 571 0 R /F25 348 0 R /F74 482 0 R /F33 485 0 R /F10 488 0 R /F8 568 0 R /F76 580 0 R /F11 416 0 R /F80 860 0 R /F13 577 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+872 0 obj <<
+/Length 3662      
+/Filter /FlateDecode
+>>
+stream
+x��[Ys��~ׯ�[��9;���<8v��8�z���DH�� ����� ����7U)U�8���>��i��?�pta�!NH��ܞ��5\����+�����ً/�Z8�4׋�W~͈�/^�\2����QJ��ؕm�WMݝ���˦����bξl�5h�Ē��_}��׉�ȡ�!�>��g�X�_�Q"�U�;8��9��3��p�9���i�p�?���b┙rA�Vb�)#.��ӫ�(�u��U�.w%��/㕢^��)��ն��j���9W˦

���
�G|��pI�t̳�i 1r�*���D���W�v��gƒ�Fm���7">�8��P�[ ��|%�[�@(Ę�m���/�
M�)
1ҚŊ�
�eز�Zf#����̓)X/��
��sf�I��,�I��6zV[�(mx�Mfޖ(����é��f�a@���'Ö�M_��qQ��!�	���O��s�܂����p�)��ک���i�00�����Ȅ���4�7�)�@��UWa2�M������n�I}� [...]
+.������뷹�kbY%K�Ѯ��
�U��VAA)؁@��J%#A�eaAc����N����G�:�/Y�M

5�BP�j���	&7�p��z��4H�y0c�m5�(Jc]����o��84Mo���j0C	��
���]tM7�9���ΙZ�sE�J>!������r>����=����DK6gkj��8�\ZVO �"i�Ȕ
+"�:!	HZ�Kt|4|�;
+&���e�,/��Jp�(.�
+�D܇�u�]��E�ٌy���8l��	ήc���+�@Z�q�]۠��V��&�+�I�paS]�E{���
M��7q TO:u]��6E
�^����颺�a����>�� Upagz�)���x���$�F�` _��=B�,�lTd��:2��=\����ߔ�8�Yh����� ��
�u>�T�����!U6.�2aQ��
��C��l��yc�'���T�C�
��Sⲃ���3�&���������+�{[��qI��× #F�Dk�����
+�H���|�yPqc��2����s��S
 �H�;�R��#�v�b3�
݀O*\�sF����A�#*�mX�L̆�-�y�%:�[LN��ʗy�!TзZ���f*7�Š�E45"$
��Õjl.F�"&A�'	� �g&��Ą
 !3*�j+1#z��{h!!V+��ԇ��dD
�C�~]v}�Q�A�w��
!ğ�ߋ��ɉIR�PV�r'��O�(�����UC����Q�=b��,�
'p^P��+(��x��N�QZw�0�3٢q��
�>�d\�=6cy��Y%�����1
C�|
��(¢n[l6��
�C%�摒7���1S�X����h2x at Sv�V�xϢ$&?��(?C4�7G
�=TӖ}u��WhȦ�vہB��"��y{2�u�V�4
yK�7�n�.��<-.nx0\j����U��y��r�ۖ`���h��Ib6��w(N�4#<�Rn ln���:�g$�1N�)zz��:r2˞�d1/��}�b�y�
�~^]]�>����@-8�=�v �p9���8�XsU'��PP-�<�j%u�P�d�Q�<�� �u勊���
[^�Z���6ꝃ��ʕ:�}��;����B��N�M. \a�%ÅQ�Z
�_6u_T�*8
n��`U_���_%�
��W�`e�U���V%�{��ӧ.�@���5�S�`�<�DtS�5�eїu�'��XT��\<(Q [...]
���ty 4kC
~��矶n��x�*�z�U-�Z��h		�;s��p�

D�q�M��#����o�������wN(1�OS��ń\��
!�H�d�+��C�:}z����붙�$�RpD�
�ڡ�M��
VW�zZ׌�^�y��a[�
f {�?��
� ȧ��&Q�%+��Ҧ-��0��,��
R���0qy� ���a�f�!��Vj8Xgrc�D����9��$	g@��$��}>WE���&{V��jŴ^��~�Y��{Ft ���.���
��K���
����B�a�~>� .�G�y9P.TΞ&r 2���`�y��4
'���a��uv+�)���=�|_eM�o(��9f��i�x��%�~���q�Lq���I�w稵 �@��=j}��>q���]� r�lA
+xí��vAD&_����S|�}N�����������. <wvi���NM��&�Ljl�e�g!�F&!�`��йT7�RZlK��;D9�}8A8��
+]Yz���0;�]�-�@s�l6��Q����o�h�H^n��0R
io����}o�Ԥ�	N�
?��w�7m����u?g�`�hI�� GӴ_�Q��A�k�1b\ڌ�8ԋ��LN�$X�a�w=�����V}q��x�
r�b[�WŮhc�9���7��
f�\!�no��}[n��
���U0p�V��V
.�&�~��ˡEp�N����A`w��'��
T�w4x�y4yMFJ�f
2j��/��^nOʳL�
Eb]�����������V�gt�
�.S���D("
+%��X�"s�ﻲ�	[iG��u�*����%Ho(�[l��U��-���Q�.@��R���
+�ԡ�	�;��)���Ƨ��adn�d�NMg%�
�J���l�s�,���{�|P}�ZWƙN4B���iǎ	�6�ؙ䉱[(��(C�ٷ���d�[���Ǜ��&m�U���,;��F~�H�N(�,)�
+3V�5u��$������/�t	�+S�e�V
>ޓ�y��K��;b<�4@|P89L�ԍ�>�0`9))�L
�w��k �Yce�	�<ܲ
��*7i�%V�)�~L?��g��D>�R[����<������ͤJaLhw�b�	�@M��Ze�h��`����XB8��29PF�G�;1�.O�V������2��϶-�]SG��t��l�.
����6�7�q[cy�
V[�����PW at Q�����X�@O��O
\��6\/
cz� �Z:jVǩ�Dy.p��\ܫ�
�� ࣎C��d� �GՊ���3����_��]�&OE�������r�n����6�7�̕��鼠�`�2�Ԑ��\[�4 at g1űd�,3$�.g���2&��kA��R���}�p\��}��
+@���G!������N��ĜXNg!n!�^6��7��Kx#�G�}�
+�~k�-�
�TXl6T<�E��Y��X҆_!�gw�%�.}��k�%�v$�bI�N�V�A~ԗ��R=�@;��P�w@$!�k'�&8�ٔ����'�È�Q�)�:I $K��$@`
 %����
`/�<����&�
[���.����8�������@e
+bIrB?�����gy�aq(�9
E�����Ş��P"c��{�G�{&F)/]~��Z��Ⱓޟ~�O���_]���
R�����o�o/��ͪ�*ݵ%7�����-ؾ���H)�}���6��`x`5z"|�8�R�q}�����/^��ݑˎ��ծ%U�b�ۼ8�KR
+i
��Vo��f�L�/)���섗��N�m�rH�0���r�~w�a�?�`�endstream
+endobj
+871 0 obj <<
+/Type /Page
+/Contents 872 0 R
+/Resources 870 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 830 0 R
+/Annots [ 876 0 R 885 0 R ]
+>> endobj
+876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.2197 601.1781 370.0571 612.082]
+/Subtype /Link
+/A << /S /GoTo /D (main_Operations_on_Convex_Polyhedra) >>
+>> endobj
+885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+873 0 obj <<
+/D [871 0 R /XYZ 90 757.9346 null]
+>> endobj
+874 0 obj <<
+/D [871 0 R /XYZ 90 733.028 null]
+>> endobj
+875 0 obj <<
+/D [871 0 R /XYZ 195.9476 674.8059 null]
+>> endobj
+54 0 obj <<
+/D [871 0 R /XYZ 90 657.7617 null]
+>> endobj
+877 0 obj <<
+/D [871 0 R /XYZ 371.5515 604.3312 null]
+>> endobj
+878 0 obj <<
+/D [871 0 R /XYZ 90 587.6208 null]
+>> endobj
+879 0 obj <<
+/D [871 0 R /XYZ 245.1178 494.3142 null]
+>> endobj
+880 0 obj <<
+/D [871 0 R /XYZ 90 477.6039 null]
+>> endobj
+881 0 obj <<
+/D [871 0 R /XYZ 269.5716 425.832 null]
+>> endobj
+882 0 obj <<
+/D [871 0 R /XYZ 90 409.1217 null]
+>> endobj
+883 0 obj <<
+/D [871 0 R /XYZ 418.8174 284.6425 null]
+>> endobj
+884 0 obj <<
+/D [871 0 R /XYZ 90 267.9321 null]
+>> endobj
+870 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F11 416 0 R /F8 568 0 R /F7 574 0 R /F1 583 0 R /F13 577 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+888 0 obj <<
+/Length 3532      
+/Filter /FlateDecode
+>>
+stream
+x��[Y��~�_��<�[!����C*�ʊd;�&/����ڑ�Cz��Z��i
����ZN�s4�F�_7 at 2��!�'J(d����������Hx=�����o�g��I11�H*'�WnI���N.?N	"�|F0����uWm�U�9�Q�����v���{�5
K 1aS*��|q��ed!p(�$��_�~�O��3���br7c���S��,�~8�g
ǿp?(-TVX����R��̭���qu�M�OӶi��%<~FS))�0%沿|�)��%Ҋ�@��i�5˥�i���Emo��Z,�(AxY�z[-�I
8qr��u����hn�vc�F�����M��x.E?i��|�u�f�jaM  ��a .B��8f?�S1���z�t
pwu�p
��9̸�u������	�n�+=��"�f�윈��/�j��#{w]��
+
w[˩���V7�?�[0��b�%IM�ffT��O�RO�XBL��7����P�:��vj��2$I0ZT��aBU�A*V��*/s�("ܰ^��Ͷ�M���YW��_F�>��^�p��]n�u�*�zS��!��_�b
+<jF�,p�&�����W@��M�	t"БtPIq
D�ۮ(���qý�J�pĥ�G�
��>R��$�>JT�S���Y(Q��Iv'�H
���&
�e�5h
����ı!Gm/��R!ʤ�	�{5rgh�
�d�8_�DXk�D
+���zى���z��!��
�{��b�˂#Az�d�#J�d�i�b�P^x�,�Ψ��!�q���1#����fuN��+���)��_u�DO]�Lc���WxZϷ.�ƒ\��
g`8
��.� 
RͲy�U�G��V6�h6G�'�;���߬
TXu�ݕ��A�
�"po_�hDz\~�b����׾�OA��$1�����6��@�<h
+g^���m�-�H �?"Ќ(+�ՆA�l7�����4��@{5ل�޴.e�U�����$���	�_��"o
+��Bg�ug�W0p
+vKM/؛��`��
+��ya�Qٳ^�Q����K�hX�u�8����獕�kmRH/M���[���r49ⱩV���S��Rv9q��EY��P��,��Ę
�� Z�x�C���M`�eu�N"00�|t8
@j5Br�u=o,������8
+
+c��*�q�>�
03��)|�>m��hQۀ�0YM.(
+y��8x����U��E�{��D�@t�?	lYEsF�g
� %�sE_7o�
~��ۢ*&G�}�1�H®)d�(@�@s]��4+4 ��� o����]?ZT�g�
�ۗ��w+`���_R����x���ƴ@�/\ 6�
�M����Z������{�e6�i^H�H���n��I�
e%��SI�\�	���m���[�fٌ�g��r|5"��2���
+�h��]k,�E�KT��b� 4�|%�?-
"L�RȓUs�;�V�Ķ�5^o{M�V�D��gn��vO��%1�0Z�T�>F_R�C��^��ѤN�A�
�^�/��]xז@
��Au\	.c�
+�P8$�4�-��_�+�(���m)`��qon��1�l
��H
���Cn&ρ2�L�r���h�Bʼ0ݧ9vLs��Es,�\��\0�T�C
�\���X�>��n����>��2spd��Q0@�d��u)�aD1
{��,�r��ry�.��Yj� Dž�.�v�@"Y'Я�Z ����>9���Vf�%G*���HI)s���UYHHsY�<q�{9=��Xo�y�U6�ȡ��4�6�F��͖B�l)䡔�*p�KD*��Ԛ���
-c��a�z�d�GW9~��əq!�{
����,P����[�����"�A�/�B7��
�\�cE�>Z�P�b5��n5J��80��X���]ڒ��>Qڦ} ����M}���l2�r��� ���'�k��6u�,�@�*����Ag`�
S��!i=
+��8�$Z
6v��m�o�O�51�
O�(�(��P`�����2�*6��Q?��.���4#Ip
q���y<!q�VK��n2|��ҝ��c�u9Ja0Gjz؊a�u�� 3S�'9��3�t�����BA���� 
+���Jv�qAN�d���X� x��'o_|(-�������}FJ�6�%�;X��rO���
t�Q�zK�i�v�,���
Ҙ� v��*���m]%��v�e�_�!f� ]4��n��VU�`+DjX�j��q7��AGTbVlF�)]SP��Tx���Z,6�PJ�
D�P��2��mha�� ��f},�wnހ'�<\�����@�c:V5���(�{�
pW
{�Ԕ�~U@�T�F���$UO�tcE�x_01
w�r�k�I�S�폊�N�� y1*i�ݾ��N�h�GLQud����QH-�����������`�hϦ
)l�!HI3m��#
+�dN}
����
_�1�>?���o���jmO���e�]*
xõy96���P��(���z�:�]���*��G�Մ��ժ�I�nZ�
��<�qS�����-!=�W�_�
	Aڕҧۯ�g	��2��1���I�*��n��nvq��nK��b+���M���C[Bb	���0�D���
+�" �"\�5�|�|X��9�R�
P!�
1�����
�
/b�nw���]�����#{S�Ou�u��`��ɠ���9M=���
�Åj
�)uPD�-[rE(I�ˠ�{�xf�a&��wœT<��㼷O|z+d'�9�!=9�H�'�����{���T�4h��B#ɽ���X.J+b��Xܖ�I at pd4�ﻒ5A�}�5��0X����DF���>�ԫ���4 D%�֨.�k���p�����
+2Y�ܝ	��
��b31�?ݷ84�]$'Rv�
�}*�)!��f;��ߗzC��2(�Yh<����S�ʓRM�Oh&H��'@�$DwI?�:�	�YX�Z����������B���y�H�@s�Ǐ+X�i�lf��ãs
0�;� �۞��U��6��Z���+ڹA���jgz��=��C����	l����W(ک��>Z��,��8�vx>>�t��?ᄍ}cϭΖJ$��^7������NyР�
��'���d�wcc��F)�D�?���T
�M��O�C�&t?Bp�D7�����njd�I�N;�Se�N�=�&�mM;���� �%
gZ�Iq���i#@��i/�58$����z����K�6�>�����c�U4ã���(�䅿V��w��-VJ �ev��e�=�:����ڤfb���G���ܣ�R�ʾ
D/K�Dqb
+M��ߵ�-�Y�oV�h�B~�?�ܟҤ�lH�O��ӄ��Y���j��nB�����u������Ɔ�m���BL��_Um<�h���6�ПV񺫩�(04�~��|�Vv���R�o�O��
��?�%���K�bg\����v}�����
�o�m۬;�l����c�8���J=��Y$��%?���/W=���ݷ�u�7{������+��?�r�Pendstream
+endobj
+887 0 obj <<
+/Type /Page
+/Contents 888 0 R
+/Resources 886 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 830 0 R
+/Annots [ 898 0 R ]
+>> endobj
+898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+889 0 obj <<
+/D [887 0 R /XYZ 90 757.9346 null]
+>> endobj
+890 0 obj <<
+/D [887 0 R /XYZ 90 655.3449 null]
+>> endobj
+891 0 obj <<
+/D [887 0 R /XYZ 90 640.7769 null]
+>> endobj
+892 0 obj <<
+/D [887 0 R /XYZ 477.4943 527.6892 null]
+>> endobj
+893 0 obj <<
+/D [887 0 R /XYZ 90 510.9643 null]
+>> endobj
+894 0 obj <<
+/D [887 0 R /XYZ 90 339.3377 null]
+>> endobj
+895 0 obj <<
+/D [887 0 R /XYZ 90 324.7697 null]
+>> endobj
+896 0 obj <<
+/D [887 0 R /XYZ 90 191.7983 null]
+>> endobj
+897 0 obj <<
+/D [887 0 R /XYZ 90 177.2303 null]
+>> endobj
+886 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R /F11 416 0 R /F10 488 0 R /F67 370 0 R /F30 661 0 R /F12 664 0 R /F6 565 0 R /F13 577 0 R /F79 571 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+901 0 obj <<
+/Length 5142      
+/Filter /FlateDecode
+>>
+stream
+x��\�oIr�A>�B�q��l�
�]�f����>���8��L
�$e��ק��g�=SCR+�:�y4��������3��̳�ն�R����+6���߽����/����՛o����af�C�WZp1{���W\\,8cl���z��7�vw���7m��.<\���w�f�

�r.��_���?��$$
+�4
	��՟��f+���W�����#ܰ�{/fw������Տ����_�P�\3�b0S!+f�
3}���5���[�sD��q�qd3
�r63���aCS9�5���W*4���l֊�R󙭸�>�Z�ױ�ˆ�	���(�:
���>Fθ��4q�~b��q}>��8큼��1__iX}`#6���E�|��
���V��s)oS+��R�ʧn~#Y*����
1}V9"�e%;���q�-�W�<o�y�c{N��`*�Tˢ4yb4ȏri6�~\e
w=���^Ҋi��)���-6t�Z����B&��NtdC;Q��d-Δ�%�`��-��D!��5���r�U�r� ���B�J;��i
W�0[!�Y�A �#��U M&��:��Q
i�̪��+�� ����O�޵�]����B��Ul�#Ao)�@��T����M͌Gb���V,5h(��^	�&�6sN��|��]#JVu�#
+��@���#mU}����c3d+p5v&�B
c��ug�e��ЮpN
��`���� �u���fK�=g���� /�{A,ž����Hiz�S��!81!���-X!o`���Dc2�(�i��x̽ ;)l^�?�ǯ�>
;����W�\d�r�����gyx��
^>�g?���������"f�o���hf�c�VL[�+� x����W֫��|��T
0����W �0'-�_���1��=����J��l��\=?�Ö]�{Wq@oa�
P%/��| ��rƊ ��
=420�f����ʹ�`~Z�A� R�Ϣ&�,���5A�*y��#�P�{%~(z(���$ �
��}p����B2?���,)z��E��L���e940% 4���3.@@��}��)���5�[�uT���-o����^p7���n,�, M�|�o���5�����M{����5��)>�߬?�֫�2�"����0�&�ˈ�1q�qBb
_moR�wY��o��0��E� [...]
�׽���Q�?��Y^�k�b�Ų��O�;5^z�s<���0��U�/��n�z���b	
��`]	����Z�
�!�83i\�qo	8-!��ݒ4U��y_
 H Xrg Y��G �'�u
�+

�!��$]���(�N�@�|��}��k�t���JJ@(�
+r�*$T27�o����.dᩔ��A
��P�0�@C ����\ij�1`S���H��R�c�*�����4���O�
�Z����'qi�k=9�ϒ3��∜n�r�BA��`�8�������["��t [����wb�f�D�X̱3vƣ���x�b���r?P�]�_�h�>Ǜ�M��	��@��-
+M	|�
Y��x�@�2���g��T���7�������S�B��4����Ģl]����P��״i��IT
,�J����Rz ���9 ��N�����0� w����	FBV���1��Qi�I�<_F�
%�'
vo��*vy�?P��`5�� b�iA*�B�q��

�����;
+Y�>���ax��9W�	c�-��rK�'k���,7j�����v��v~�ea�eQ�yş�A�NYA@Ժ˟N��Q�L.k�I�͝`����T�b!<�`V CIâ���M�^v��>�x
B�
�I��g��51�û��u�A������a��ޅ�EJ>}q��t�����Ϥ5�ӽR����
a�2P� ȭ��v�$�sS��5N��v7�����x��AWO���U
����"��$�iw�e{U�N����AH�{���`�!�Q���ч�渼0.���~/S�=ުW�E�K/n�]l�u_<��1�Y�R8с&�>
{G�
a���]��xY���EM쨽�<�vW�㓠o�:���ؘa�.�y
ȹޠq2Q�8��®k2�r�EzY��Deye4"K}d:z�|f�N��"D�/@���9=���ɛ��P�� &���{tV-&��7 ���(�xq�iw
�sn�/�J�ĠrR�h����Z{<�Dm6�ΏsK9�kL���b��t<
��³��2Rw��}/y*����z�0 )@��/��:˭~Ґ��!�m%�N
�F!c���LCb�
+�Y��v�@��ag	���Βu��F@,k|����S+a+
�"�Q��üJX�7ԩ�
Y�;�%!����钿�$�$�eI��
�E\��� 8��c�^'�@��\>�
���xt,��˱@�D��P��| 1��bNzsp�:_��3�hȥ��P
+t�XA�<�x|�.
D�O�\�Y�r�v{�翁�Q�Ju�����q�9�-����'
�:���ܕ�񶹺�b�3���%���_D�&[N%;-�cV��Η��a� 3�.����s��A�r��.�p��p��`���0nP�U
#��U}�INw>�7/�����,��**6���/�{�Y�������F��j����X����8
+\ ���>�o����ݾ��7q�Xj�T��ze����J���
���PHS$��)����'�_+���Hۗ�}&'Ƙ���&F�0U�e�"=���a�/���Rr�E��5�0�I0]�Η�xY_o��
�BS��k2�`��/y
+�)�l���7I��|
���{��(�S"��
+l�
NMN�AS���4����=[�E���t�39�t1�>\+��/���PS
3K| � -(
�3�p��7�M��@��NJ�@_A
+���s+�YNPr�*X���im����m�
׏�!W�ٮpuz�ܦ7�<h��v�����߯cK
�4<����AL�������Z7uy�+O� b\n>�M�������D�P�7��v'1_mBu�J�{
��0G�d(Jizx�%��]��W]�
;E'2�
U����\��pG��n���T����UW92��}�,����R�@�!5��
vY��M`c�@��
��[*m�
��dy�
+<B�׏�^hx`
��"_�d�K��a�v#�~���.Q=���~��>�Fy}�ZK�fL?;�f+�{���P���R�+*�� �=U¥t%U��L���T��'{ʼj�Db��\��d� ��F:$5\�@ȧ���V��]���dA�d�s:@JP�{�˦“Ͷ�i�l|?�'($��=T��:V���ry�\		��o��ι���m|v��١�c�w�����$�6]�j�(�%��˔�E*�G���C�6<*�s1���
W�a����g�<��Ⴗ/��
Eb��@B_|ٓZjnA��9 �A��]�HfM�y����LfX_g���F3c���
J �\%\���>Irp��x��>���D�=Eg
��kr�QUY�o�Lm<�|�GL34ߜ��
��!�������d�/���� ��|Ҽ�m�}ْ�c
r��: ��u�+���\DAq�~����l
�
뜶�y���{W�WW��W�n�d�X�y=ؿ?Q�C8
_��DlZ�E����bU�$��� [...]
]�E��\è_�B�	 �<Հt�KE
�S
 �<��*)
�j�Z��o�[��#u���S
H]y�!,�#�"m�M�e��!�'�,Hw�AwB�1�
��.����o�bL���}j�
�F��C::�x{uزR�/,�<���
�'+��01��aK��*.� ��>n��Z��C��%n�"_���_A�O90V�?��Z�Iv�)5�!�j�4���,�����]m&kOEe=��Y�Si��-
��7X d6e��: �xȇ��
�,M��G���xܐ�Q����.M�(ʱ�'Ⱦ:��D����u�/,�'��Ёc�'��i\ћ�\�_�
1g��鄹�����µ��v�rd���l��ls4�@!�/
�/ųK�"
Vš0��F���GP��1�G*��̩�a�����ߚ�#��V�;H�K�oT!�;��H%�6V���>�4��ox�/g��Z��G*0�<�x�oy��)U�o3�D}�$�#�Y�+u�j=��J�r��.�@����'�1�����Bt���?(0'8Wo�st�ݺQ��o`�I�N��:��"ϓg�':l��p�zMw%ϣ� [...]
+!��*��gxL��3
f�)_ LY��6���P��
��[�ر��2�W.|D�a�[N

�`����6��!�Է�
^��=�FQ
+}����\+�2_�sy�Q%���ɓj��A�p�k!0l�ww�g�6�C�q@��[0�F1��$B�ߓ{�Iv�Ԩژ:;_9�[�k2�R,�
��4֢�5�#a�>1����r9!
+����	����IE^�l�ƿ��t�?_�u�� �N��1��p�ȏC�X� �S:�ep��Cʛc�k�ɸX��)Jt��7W]
+�l��A�۷ZnS�� _�Cd/��0�ʥ�
��G�%����oc� Y�뫂r}��ԧ��R%}� �c�F���(��3�`K:��C���:�x'��RB�0�"�ɫ�ptŠ�Q,������a����y�++9�o��������n�n��!��Ч���O�z�/Z�St������,1��"��T �o�E���"��?H����R|�a�]�W���~��~��\�f
���~��͛����jW=����j�o@��
�R

������-�F#Z
+�+&*c�+h�	5`�ݦ����B��?�L��3Eoendstream
+endobj
+900 0 obj <<
+/Type /Page
+/Contents 901 0 R
+/Resources 899 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 830 0 R
+/Annots [ 905 0 R 908 0 R 910 0 R ]
+>> endobj
+905 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5589 534.6297 333.5787 545.5336]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.3361 197.9604 346.9157 208.8643]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+902 0 obj <<
+/D [900 0 R /XYZ 90 757.9346 null]
+>> endobj
+903 0 obj <<
+/D [900 0 R /XYZ 90 593.8922 null]
+>> endobj
+904 0 obj <<
+/D [900 0 R /XYZ 90 579.7563 null]
+>> endobj
+906 0 obj <<
+/D [900 0 R /XYZ 225.3408 257.2229 null]
+>> endobj
+907 0 obj <<
+/D [900 0 R /XYZ 90 242.9874 null]
+>> endobj
+909 0 obj <<
+/D [900 0 R /XYZ 150.8083 89.4414 null]
+>> endobj
+899 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F10 488 0 R /F7 574 0 R /F8 568 0 R /F1 583 0 R /F79 571 0 R /F33 485 0 R /F13 577 0 R /F11 416 0 R /F12 664 0 R /F9 602 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+913 0 obj <<
+/Length 4106      
+/Filter /FlateDecode
+>>
+stream
+x��<َ#Gr��|1�
�9ydc%H®ex%�a�;��iVw��]�X�Z�w�Y�U�"{�� �:�2"���&

����
+�����/
��7$�^��U���͛�Xd$���7�$HPBw��.	"�vE0���7����u��
+��u��g�p��w?
ڍ���%շ����ww��@�`�X~�����b���#f�X��
F��x��ś��/7?�q�
�Am���kfJ�R�4SDH���-����Y}�]�����s`w��z��h�X�ㆸ���%b	��ug������-���G�,7�iSI�(�j��C��DF1m$Ҋ�Ŋ n8��{(B�q8�ҰE�U@Q�_��ֈF�I��B1��
qlH@�C�g�R\�[Wa�@V2�/��0�A�$���G+��
v:2׈�����4]e�L ���!���Od�m*؈
M�
�xMJ��J�
+�6M�;65�� 0f�!�� � ���
i��J7�NM�~ЇdkAݲ�W| נ�+�ڍ�
h2��"f���5���{0�AiD1���NJU�+
PQYA%�,��Z��"�E;��jgĀ����@����
1�11��[8��
�d�x:
�)p�<�86����ـR��RHD5�׹=^q{m�ۻ�ǯ��^IՊH��@i�
��ɵ2�Ϛ��t��+���0�4!�P�/=X2WԀ�# ��*��ӄ���ڄ`��
�ʸ�_�w�\�Yn�w���M����Ά���M��׻4�xp���?5�o�G��Q���n�	0:9x�f���po�3
�����{<���?�)�fA2B����B��qtM0F<�����'���X��n����
v
ܑ���PB,QB���ܧ0����]�i�
�LH��
/� Dc���zON������Lp�������aʢ�BF�?�k�^��v`�Gֿ�ͳwh���o��\�X4$�T��� ���JS�8���;u|Z+�
̃���{�����JPa� ���+�)Z�`{W�/!!3�m��` �#��
K0�H�Ew�{�	���Z���5�J� @�"e��P�I��RD�wSnqD���K�Z��F��S�/5��H\(&7{x�
REu
�^�m�?N�Û�ȧ��g�#6�8�`�T�f~��<L�s��9
� �UT�ǚ(`v�(
A� ,�1
8p�o�m�]�D�����0&CԌ!Cؓɑl*r��K ��+ѕ��(�����u�
v���K�*���4��Q��9�+AGNQ"�4�q,�T�q
_Y�6�1AM�4
��,��X��
b��YPp�B����F��^�0��{8잧� `�̜x ��L'���L�AK ��˷�qU1b�24���c�?0�Š���	"c@�窻r�l�ȡYc}���f�BZN�d K#�g�qW3'���j��D2���*�o6�j��O�B�y��5U�.8�?F�����
`�.�E���8��o�.
+�u� �F�A2����'�R�a4����c?���P�f�
+V���WF���
+R���ʪ�S�j���?V�����$p@�a�Wʨ�
�;$��i�o1�E+��BL+�Y2cђ���%S3gɘ���
+�W-��جg
���
�<�ߵ��D�l+	�e�
+����_��gJn���msHN��1FDQ})%)%�8����;�
`ΑD�ˎdc�H�x�8�
����M�ŕV"��*�]5|ѢH�4�U)[
г�:�@�e=����m=����f}Kq2��x�L���5����yl���r��O,s�9��`��~c��c�g�>�{Q����t�|]�J�d�ą��j�>Cy�)�Oi�)Ut���u���)$;�5d�N�
+16�Q���d�&����
[�e����z��Lq��}�jE��
��0\��͘'+�x�gjG���mrA��Ӝ|k\{,C[�r��e�C���*e�`"2ᾒ�!�RPi�t郺 �':E5
��
���o�ZV�?��
J�+�n찓PM�����)�S�TZ$����d�P1@�;��ӯk�b��",�ZQd��u2J��2�?�& V���3�R���R����To��U$>�}��wo��8܃�o���Uゴؘ�q�Q��M]��]$ kA��%.������H>��
� �S�ym�	�;bJ��B0�!$���,�!C��g���z*�2�=�ʇ7�~�DRH_8U1��~�ym��)C���
3�2U!=�	�˩bQ��z-����8F�5�����<r�$3���
��-��2:�_
����*X0�a첊�a�tl�����x?[!N�����u�l
^�ŠuԐ9IR�֜�d0'�vY�s3I��d��CJ�BH���S8�O�[� [...]
+�L=�U�-�DJ���Y�¬��׎w܅��RGo��d��q�}ui��P��m)����ֲ
��
CYk����@�ڶl�ի:Ā�Vo����X��tFo�������Wb
+���-;
3_�x'�����������	�Z+g����0<h�ەa�� B���.)KI�S+;HP�Ц���e�鲀2��و�;��l0�4����'+��fǵ�搝U+i7��W,<���V�܌�Ġ�f\�jPF�a�L�i�
ku���~�<������
qVcV
�E�m��,ۇ��^���t'�uW����t s%�TW��*	#iF嵥x��k���Y-�H��v����7D2��
�ы�_�2��҆��cky�>�G$
�����2�7�_sH��f�{sŦ�ow]�n�r�]�|��t���]�_$f0sȅ���.��޾:<���-¯�*��d\��k���dR���b������r:��@~ꛍ��!J]������8�����h}k�=��i�K>u,���21��6�s�q�c�.C��V�Ƴ4@�e]�mP�����O�?)͈"-�o�VDh�3c�9.V1c�lNOn��[�/
�XePnE]�;8*L����H�������Ssh�%
�>u�f�݄�pۍ ]��7�X[oc�8׬��gSP
+�5I�?]NtA���?n5XulHo���w�=�,x:�)��I_Ku!o&TG�DL�b@��ɂ��[/����f�6�j;�Êmʀm��
�;�F�&�؛rZ�Iu]�.�9m�y(Oɦ�q����l4���f���
#�m�,oi��ݺM at r��
6�#[��
��X.Ҁ9�xSA
E�
-_�ok�S�K�ўUN��Hp������l7�]{���(���:������n
�G�
��.��lT�z_�
䮾�T�
�ػƫU�>�C<0����r�
��z
����
zIo�vQR�N] f��_:
�+O~H	�ky��@��(�?�c��~׷qY���T����೰���~��H�L<��2�"�_���y�h��gg~U������ʼn�`�8
��H��b��Ś�~�����tjdփ@�JM:�u΃�®��0��y�1�x¤�.�
+����yք_�,�NbD�NV�K
�r8j��8{� �.9��~�@cE>�Q���v�&؄��j�)W��EiT��kAoOA5�r�������Ln߁\Zce��х
��3m?e�g��d�ZPCg��MgO��.,ح��˝]�q�����
�
? ��y
�x8k5
YN
��#����?S��]���z�.
�
҈�M�����'ƺ/��;�Y8g�S+w��+�
��
+��!�<�M��g����A?E�����L�6)�U�!!�)"�\\K@Ƨ��G
LQ;3� �C)���F���ijxi��T Tb��>=r���+�2�B�f��Y�A�W]��2�
��?��u��%fH^=�ʈNa;��j��s8���X#���M����9��
M
����(�eV��}�n��A2TY����4�n���"hq�%���x�/�d���
���
��q�Q
��/߼yyyA�=:u������~�fL� W�؜�V	hBK�~[�J�uA�C�=�I_���L���ɋ
+)��R
pendstream
+endobj
+912 0 obj <<
+/Type /Page
+/Contents 913 0 R
+/Resources 911 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 922 0 R
+/Annots [ 920 0 R 921 0 R ]
+>> endobj
+920 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.5302 185.8202 190.6161 196.8328]
+/Subtype /Link
+/A << /S /GoTo /D (main_bounding_boxes) >>
+>> endobj
+921 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+914 0 obj <<
+/D [912 0 R /XYZ 90 757.9346 null]
+>> endobj
+915 0 obj <<
+/D [912 0 R /XYZ 90 733.028 null]
+>> endobj
+916 0 obj <<
+/D [912 0 R /XYZ 90 654.8806 null]
+>> endobj
+917 0 obj <<
+/D [912 0 R /XYZ 90 640.3103 null]
+>> endobj
+918 0 obj <<
+/D [912 0 R /XYZ 491.2364 245.5171 null]
+>> endobj
+919 0 obj <<
+/D [912 0 R /XYZ 90 228.79 null]
+>> endobj
+911 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F7 574 0 R /F11 416 0 R /F33 485 0 R /F10 488 0 R /F74 482 0 R /F1 583 0 R /F79 571 0 R /F8 568 0 R /F76 580 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+925 0 obj <<
+/Length 3298      
+/Filter /FlateDecode
+>>
+stream
+xڵ]���}��*g
�$J	�p�&MҤM�
4����Bdɑ������pH���w��+�
���%��?�*�ʤ�Jg��鎯0��;�7���^�߽�"KW+2���,�L�T
+�����&�z#8�ɏC�
���d<V4����e���(��Ld�������I�Q�2������g_�q��<]=�
g�(��t���/��w�xh�nX,jA�T^I&�Y��d�T#2��
�/2&L�V��� fxrfd&
��P�
���z���_�vW
4���p.�jO�ۧ+
�����jݎU�v-Ӥl?Eϒ
}9�][6~��G��vL�^�*c�μ؟�yJd��z�ҕ���iO���LgY>�ct��B�B+����4�_+�Tgz
U;
<j�T.
����X�L}�_PA���瞳o"�̓�F�����HpxoxʗT�Y���n�,�A�D,��f84u��j�"M�H�g�њI�fAˬ$@�bk.X*<����p؅Q�=0ftn�,�.�km�+��5 ��lI�[
p��
�ん��ڨ����zO��
�LG���t2
��n�����~�n Z�"� �ir#
ˤ���قe���uk���U\a�q3��f"ͼ�/ ؒ
Ϝ���TՕ��]S���joB��M�ø��él�j=�‰K��t at pƲn��e.�e�=�gx���1�G����?�ͯP6͓��Q^��[��{G �y:V��|���	
�L���n�w��m�wpݹ"�
J5�z:_�ִ� ������
t}����
+��:�@77��;��^
_��_�Q3t/f�v$��7�G; I,�Q��� ��k�
+ �J2.��dB�d৵��b��j��<7��˔.��ߣ25�NIE|6��=�s�R�7�:�x�\,
�̃�u�A���鎞�}w*1��$^Y�C:�f���SL�YX�u�pld�BL�fn��%N�ىI ���5M�g�H�.�A�=W�S�]�W���W��9�9�X��b�R�R(\���(�
+�x�mFu�����߾��?<��
�Y��n��U&�>D�[��N
+�3
�~����`�1U5����m�M枋���sWpDւdFg����'���x0��+w#����41�� �@�vǮ���ѯ���>U��;[ڕ�q�0�IS=�K^
+����m�:�O�:A�f
+ֆ'����Õ#�'LR4E7�{�a�+�̍!�������[ZV���ȓ��"ø�'JQV����*�G
5��r������L1�&J�\
��.���0� �FPȒɗPB�,������䅊Q��DQ���!�2D�Ye�����K�-� �G��KsK�q�4/ğO�
������.u�̪
f�����FKu)�F�!Ŝ��Paͭ�0(������p)�g_*7�
����u�S�)@��P�,E���n�y�8�LAs�Ⅵ���k��Kf��'�n���
]�t��V�9�����CES��5p�},JP�JKO{5���m���(x<��XD���c�#�3�Dg)"@�
���r�e�F��G
��� �4#MZ:9��q����|n�'jׯ����l���(	
��QG
e�!�OsgBAI��npD��jM��"���Ӕe<7�:������x�Kw���K��wg8шd1IFgFJ���D��F[Z���ieu�����&�Q�[ ���5����,�.-�e
���@Yٳ���9�(�H����l�}�K���c4K���W�g|�B�O“�ip�����7��'7궃�
����k(�C�+
�!w�
�=YJ���*�S2�w��B�����nk�4��m�KH�i����w�2p2M�V9Lu�a
Ĕ�M�9�
�>�= �S���l���l��}O���������/��4N�-��]��~]Ȥ�IT�杖}�'�{�����q�Ti��a��@��7�B��‰L=>#�8,�LJ�(A[1gW�7����͙�b~B�c�K�F]��#��B�#sg���)\��u5ئƼ������xA�� 6�;6���s��=h?d��ӗ�BEH�L��e����
�h
��
S�캉��|<ֻ���Q? 
U��Z%�Yz�a����]�q�������ix*�MG��$��p9�+��ƀN~s�:��;*�s�H
��w�3㡔g��+�a��`�[H���i[9���a���O,t���
+��&��ݥ�d
�@�>[�ժD%���h��JyO�#�C!ƨ�u�0լ�P%!�Z�!љَ��e9�V�ԧ
��'
�d��`c7Q �v�3�T�N!�t-���
�~����X����Ď��r�����a ��A�H��協�rv�;x�K�
+����?V�c[��E�x������sy۞Ӻ�̡�V`YP���
�7�[Wy�׶������4�4T\)��W>:@}��
6�UA��|����
]|�޸�\��U7D at cI����K���u8=<�5<�Z�A[�����~?�y���I�EU��t
��!Lգ#߹���s���B�������'+`ꩮj�I�,�ϰa~C�Td��T��V�R�.�
��r��u��iF��T)�߱Do�Nj{sZH�Sr��CU��r4
閫
�Zàk�'�غ�n���
�Y��s��x:�y
+���׻1T�$ ���-����7�i��	
��ǯ�E�n���>c�P!?�-	s��ʝ��?E�΢��G��b�{
%

&
�W��
���^��ꪡ�� �9�O��
�aߝ]5�_�`��.�Ə��<;�0;v{Szo
5=��"^am1��ٗ‚O�|�X�f7i��������N3N?bV� ���D*�� ��q�����ߘ�Q�>gBm�
���!z��
7P�t�WF��(;l+���IS�{���tfa����i��#U����k�
�|
�9��@;��c;/
����:�
L��}I������
e��0g��
��X��B��^����O4C�c|��tZ��P9mq
s`)|e��B��`��j
��-L.����u��`H�0W�
�~�m����� ��w��\p_���y���
��o�RH	R��*w���O�L���,ˡF.f��.H�D��,g���>n�������ǡ����Թ�o���%ǟ�\�� �
.�4�;
f���PU7Ujn@���δD�����Q��7l�
ԥ�?7xQ��8�?y�����vi�s�����ܼ���8�������& ��2S�����x	�s6�����h����-��?� U(endstream
+endobj
+924 0 obj <<
+/Type /Page
+/Contents 925 0 R
+/Resources 923 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 922 0 R
+/Annots [ 929 0 R 932 0 R 935 0 R 938 0 R ]
+>> endobj
+929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.1056 580.48 371.6706 591.3839]
+/Subtype /Link
+/A << /S /GoTo /D (main_BDHMZ05) >>
+>> endobj
+932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.2396 374.4869 230.92 385.3908]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.5334 264.6342 486.5007 275.5381]
+/Subtype /Link
+/A << /S /GoTo /D (main_HPR97) >>
+>> endobj
+938 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+926 0 obj <<
+/D [924 0 R /XYZ 90 757.9346 null]
+>> endobj
+927 0 obj <<
+/D [924 0 R /XYZ 339.4435 651.9511 null]
+>> endobj
+928 0 obj <<
+/D [924 0 R /XYZ 90 635.4049 null]
+>> endobj
+930 0 obj <<
+/D [924 0 R /XYZ 90 422.8886 null]
+>> endobj
+931 0 obj <<
+/D [924 0 R /XYZ 90 417.4567 null]
+>> endobj
+933 0 obj <<
+/D [924 0 R /XYZ 319.418 377.64 null]
+>> endobj
+934 0 obj <<
+/D [924 0 R /XYZ 90 361.0938 null]
+>> endobj
+492 0 obj <<
+/D [924 0 R /XYZ 296.4134 219.9666 null]
+>> endobj
+58 0 obj <<
+/D [924 0 R /XYZ 90 203.4204 null]
+>> endobj
+936 0 obj <<
+/D [924 0 R /XYZ 90 176.8087 null]
+>> endobj
+937 0 obj <<
+/D [924 0 R /XYZ 90 176.8087 null]
+>> endobj
+923 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F11 416 0 R /F74 482 0 R /F8 568 0 R /F33 485 0 R /F10 488 0 R /F7 574 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+941 0 obj <<
+/Length 3709      
+/Filter /FlateDecode
+>>
+stream
+x��k�����
+�8�DJ��R��zi�$w�m�Ip�ez��
�$g���΋���m�h�����p8�7�V��U�2��E������V�0�ٍ��5̯� /�n��Nͪ�T���
aHUh�ҫ����
+U|�VQ�U{��&
+ƽ�Ɨզ���v
�(�A
��x�����-�"�
+7������(��&
+�"7��D�*
+�jn
�N}���
��K3*^8��W'�q�&��}���"p��+�c'~�U&p�Pu���ݎ�|d ��ȩ	��H�!�c�a<~U
t�۱�ك�
��v��t[�����VEAǝ�(��:��`y�N2����u�̎�<�b���NW��N
u����fvX�϶[\�Z�Y7�j�TX�޶
�*
��)A�,�������&̢�xL�3���
���v
��q��=��& �]km#��N�ոgB�lNH
�Q'B�{8���j����-Нe at w�ޮ�T����j��P;9D��'�cb�
�	Y��|XOw��J�pn�w�z˳�?n
[��hw��j�M0�	�����myp�xh���X�|h�[m���m��Բv�
��h+���ő6�oKgY w���ƶ%�z&�����X[,��8O\��
�����V�	6'����W�l�`���
p�R�a��`��{���K��drN"x�<#K��[�*�5^]պa�
���퐖_uW�D��S��q�h�[T㉇��3���#�6�:e�
��
�C�w#���뻆[s�,\[�\6���2iR244��f0���}[�|t����<�qN`{VM�N��4�n�r(~�U�/[ p`7���=��b�X����.����$��
 ��غ2���p����
�m/�6�g�t���hɠۓ�j:���p2����~3բ8o�� �s��	 
S�$�E>�)
�|�� ���Þn&OII��M
+�]�4
4��~��0Vu-��Y|�p�onV�6�Hxpu��&gɱ�EE����٪^#�z�
+X��H��%�0�g45	���^�&���ࡶdz@��D����Wj-
OGA���Sw�W�S
+�O���pk���T'(���mHZW��n��% %�q���8��]{_�xx8؉�@�F
fႡ�
�Z�>qt�I<�Y(�;�n0jyd��Ǣ0��d���\��H���B3(�=-����V��*?[Xu�hp��_t$l
�W_ �~B�W~��9��
ȕ��I ��Z���2
g:�]�~#���
�sD	D,p����VF�����p�w���	��P�Ns3�crӑwo04PtDX���X,��n#��w�L�G\�YbI�αؒ��y^��M��<g�k���(R����UI�Gf�@��	6z�d#7a��leT�Y�-�
+
h=�z��E�7�
+�0��;�� y-���5*�ak�4�c.���N�36�a�M:�L�جwv��%
+�Y��qn�ݦ�5,�(�)��9b�1\�<�X�S�������"J��Q�
+�M^��s^��T���{dȳ~�LT�.���ӑa��b�)�,!�Ü`�g8���@*��)��2 Q	Q;��[C
���0����%Z�i��m
�����.�$�Jc�	g
	ȗQ��N;*ў�����;����_�l%ʉ��v��0ă"R`Il�Lx_�{���KWY
�L��$s&��9C2�B���Nbt
+���ס* ��%�PK�⍠xK�ج���C�Zu�)�;	M'��	��o
���߂��ه����0����_y��",\ȳN�8)ԕ����x�x0z��5^m`���/�q��c��ޣ�UZ�r���(w~�	�~:��8�^�����ԘKA7q3�4�"�4
��5�c�i�-�$���^�~�=��b��"O���5E:�
��C׏�!Ǧ�.��"*�3>��!.$1fI�0iȌW��(>���L#v��
�m7r�6����8D/p��ڎ�uѿ��nI�
1v�m�������8ո����&�võ�|�kfय
`�(�u��I��D�ӎw�q�
/L"S�{��I
+Ύ�	ˎw�.��0-��#��LNwV�篕����T��h�y)l����n	��6��e�ԗ�ERx¤���
+�<����
d]\�?G��
§o��Q
+����7
XM
fE
?q*H�����WQ��]�I�
Z���`�[,��"QG�+Qǹkˉcd�^Ɠ�
���p�����j
g���^�\�Nȹ(��m�˓��m�g��d
KQx�<K��z>R,.��i	�`i
+^i�J�I�)h �]��t 1�o�l��#!/�_�;�8L�T�a����R@Q�(y
�WY�_��7�h��������-7�4��?�1wK��}�O���%ꓰȕW���>Jl�����/�Ob�]��~]�C����t.ƥ�eTn|`����*0}��	2���
�~��{�b�Z���*]ۛ˘�U5�������p�$-�c6�%C
D� 
�ѠH
+ږ?%�ũ }Nht0tk��)�
?h
�
��G�ikGA1�n ��7	&��e�ݪR5�!}J�k����x��k!b+k��
U��5v��-
{T��Q�B5<
>��i�Q�2F�6@.M�����	bIEax�;�
T�uم��|�p���pN�}��DU�"p�}(M)8'R�K|y[7�=8p�9_�N�.Y�ݢm�0(-�d���\,d�*̓X�r���Xa�L<�B�G+/e	s|�Pv<��\ t���K�[�ߠ3�؜Bq�J(�8s�/3[v)
W�XF�#
���*�
0n�w�tFQ���wFT��u}uNK�BL��kF)Ts!��9L|�AO(ظH6�V�qf�6a�t|)@�'������Ӡ�
Al=�s5&W-]��������H�[�J�l;
�K%C?SJ|�]�j���˂���#�6�y	”��"02sv���>PA�SQ��$2	fY_+����K�3�`
+�KH��%_
����9����g��0e�G�]
+:�B�����.�rL�|J
7TVڮ]{���tb)���S�x~Yr��*�P(��:Jr�>� x\����X�}�¼�t������ח�q;�x��'���|�ղ�ur_����r.�Qi��^``f+
V�D{ ��_�K����[X#�[q
9�'��
d2���8����+�o�ʂa�؟݉Χw���]~˽m�I8q�4/���=`	������8C u ��G1�
=�%:
^
�dZ��mwx�[����Y���^3{;F�/cx���
��KhG�2b��
�h	2*����G�0p�����I�z+0t��A��̯�^=3$���J��
~pC4�w�9�+�9|��}EQ� ܲ�J
h��������8Ǭ�h�^gв�
+�a�iJ�M~�#.��H��o��� Nb潞^'= i
|�q`8��
����	,x���
  �E�Y�w
$�<�	��s"����u���X��1��ߠ�0pX�
+E`WTj����i�˺�eU�yM)��R>���'�
�s��gc�;��^��N�g�'TM1�_��h�̎��R
=�l��s�?:�$
+�K.�쇕o��|�i�z��+y��ȏ�����xx�����CXᱭ}X���T=��+7UhpSO��zzD��1iO�(��e�
��TZ����xE��p��w �endstream
+endobj
+940 0 obj <<
+/Type /Page
+/Contents 941 0 R
+/Resources 939 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 922 0 R
+/Annots [ 949 0 R ]
+>> endobj
+949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+942 0 obj <<
+/D [940 0 R /XYZ 90 757.9346 null]
+>> endobj
+943 0 obj <<
+/D [940 0 R /XYZ 90 480.3449 null]
+>> endobj
+944 0 obj <<
+/D [940 0 R /XYZ 90 475.7372 null]
+>> endobj
+945 0 obj <<
+/D [940 0 R /XYZ 90 307.0885 null]
+>> endobj
+946 0 obj <<
+/D [940 0 R /XYZ 90 302.4808 null]
+>> endobj
+947 0 obj <<
+/D [940 0 R /XYZ 475.5513 202.2656 null]
+>> endobj
+948 0 obj <<
+/D [940 0 R /XYZ 90 185.5385 null]
+>> endobj
+939 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+952 0 obj <<
+/Length 3382      
+/Filter /FlateDecode
+>>
+stream
+xڥZY��6~�_������!�N�U��8���z&��
�@$a�"�<<����FIъ�R�@
���_��|���$JX&�x�����_^q;���Ր�����Wq��X��vk8ĜE���=�x�\q���gz]�jW��~�#�a����
�$�H.8�^���eZ�"s��߫��P��+��,����ϲ`q�
+�:���տz>4a��,�bfkQ0�Z �Ƒ0��{Y��r$���m�X{����1
���[��A��-�ȼ�dQ<PO�����/߫����,u٪�����������5�e��j��VF��ơ���Ä�N���+sp���,���U[�
�«ձV�*[ْ���%N�p��`����iR�
3��[?8�U�Q�.w#Fªt�N0+n��]�ۨ�����j�
���jA��y��o�6]��e˖�0���}׀��g �����,]uMa���p�z��ڪZ���n[���
��}<��� �����٭�%�����vF�إK�v�U�]U�W�ÅU����^��{K�LV��Ќ�Ƚ.
+j�}�
+�P�ĵ��=
�,�Yd��
�S�����.Dˌ-��yE����� ��P�*
-iGȎ��*�
+%ߓ� ���
�זL"�tz�6�Ϲ�`� m��-�uI_�#�����%쉹��'So�F��i��#pRa*����'9�Ր�\n� O������ O��z����~�Bؒ�X	v�V�wo��nZj
+�:�D�
��U�R�c��HO��ߎ�G��f��8��e���K�w7M���]C�/,�=;�a���
�)�'O��w�p��
1�5l�v���w�"��	�5�;��$:�*���ev��O��*��(�H+�=)�W���;sYN�xi0Z����NW<c< ���+�wst{������@D
S����Y�|1�N�����Dg�/U;�2�K-����?¾��k����@�%Kpj>������RG��~d��
�_3�o�Gdb`������~�����'���珪�ğnI�F�׍q�>9��4g��h;�~ Ƿ���a�
��Of�E��(����
���'DfO1��
�~��H���H��k��if���}
����q�VĔ7�+�4
+�6!�</�LBfG�XGk#FY��$&�Z%�.ʹ�RI̤"b���q*"BJEp��B�4'$\�!&��M�Æ
afO�n��%�V���ő�}�*'Ab(����L�Sd2~��ca��=#�r��G��!%�i4�p��~c
���< �nGh���ȕ�����5C]�j
��fl�!���}�i�Y��Ė=z��S��P6
;%��m�3O� K��8�<��!�-�gQ�=%s��� d��ǩ��U
�K�l�g�� I�b4
�a�1,�
+@�=��ʾ��u�ɫ#ZI�֩��ƍڨ±6�9H�Giq
��Ǥ�=D��*
���T�R�F���
1��@By��:VJ.K{f� n"���&���졔Di73<��b3��'�;`~�'�h�}��'Ѝ�\�Х
5�"����v)��`�!�<���w@<�����<���*/F�[�2��5ྱW�nTMn��) �b�MWTD�<@���:�k���k�����x��q\�:Q��T:BwPg`�D�!�s7�5��
#���J�wU�^ײ6�g֣D�������N��z֙�v�����K�C��ץ� �����e�S�<�X�ŗE:�s�#3��gq�����39�@~	
�2�=����{��B���	������ˆ:����T����%��,
�
�3�E���j
.hc�cĒ���;��ur�{�I8�pAdʄ�
7��t��S�a���gp�hq�M@
�V�!�C�t
o[t
���W"�	�(
�9�e)��EAf� ��-jH5kQ=Y��7Y6cQPN%��E�=չЉM�
p�E�.�cq�
�YW��<!ra�
_�z���x`���q�n�n��fy��Y�|��;��0
�w5DŖ��	b��thu�§
+ �
+^-
�|��x�C��ZB�o� $x��<
�Ua
�N���-AXW���`0���J�j| �gP�O1�,��e�Kn�.�kZu��<�l�l�1�<ڏ[4�IU^�p3�ʀ�̙�m�����7��g�G��,
�!��
�0Y%ivC�a0D>P_�	T�`p�/�~����!�Y9�e�=չ��9D
�B������ t.� �t�;3*�/!��7v
|����,�kK�.
+;��M�E��憐��Inт)v�@(	R
���$f�ϣ�տ�
	B:�qZ
$�elw�F�s�a��M�6�\�^c��QA���c��}w ���ޱ�o�EYt`_f��� ]X\�/O��Z���cU�S��PÃ5�x��
+��TR߹wP���P�S�[7_�R�"��^A-�8��
�@���x|���;�B�" ���̮x�2?��0�fE�w
��n`bn�j��%�
���#ٷ�������=ò��
&s��]���~}��
������C1�9
$"�<�BOt��	g��<� �9D�(ȒːR�B�' � �"�:+�,��:�:I`���H6">� �a��
�� I,�q������혁6ҹ�Yh��~�p�7�4��%�<eݸ���\��5yW<� ²�O'1�*L3?�����:Oט�Q��`�MIS�}��坶cB��
N����*q�
��F}��� ,
c�9
�N�P>�\�Ƹ
@ Ga�b�|�G�&��K���6$�
�[e0	 ���;�&�1I6�Il�)��"�"NbEE�d�	g�p)�+��]��g�TC�ͱ&��ճ	�r�Eq�c�;b�l�� ���$�$�<�a����s0t�4a��#V7G�=�}��ѫ��;K�
:���)KD���P�{G`��۟|!g��/��R{�s��NX���X�[
����n@@�xmI���v��sm�l���Y7 �
֯r�(�����V��#���|>�!��.��N�i��g#�'҄`�dR�$����lދ�Ly���cA�da8�4p@Z�M�!mh��!�O���]o����j���AY�0
1-x�qRk�q�D��a�XLc�<����i�]´`"�
�Ǵ��4."<�fBx7���RS�S��e��J--�7O�
�G$�,�.����f�H�&>�ʉ�/�������ȳQ��
�i��S�3�)�ꃴ]g��ڷ%r���af�ײ쌵E���[`T��j
���*5=� M�9�҅Ա_��p��i�g|��cúRk���㱸>K}�eA".�ު':�et��@z�#]���P���o
R9}fG��N3��3{�Jendstream
+endobj
+951 0 obj <<
+/Type /Page
+/Contents 952 0 R
+/Resources 950 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 922 0 R
+/Annots [ 955 0 R 956 0 R ]
+>> endobj
+955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [113.9104 211.9245 444.67 221.8223]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.comp.leeds.ac.uk/research/pubs/reports.shtml)>>
+>> endobj
+956 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+953 0 obj <<
+/D [951 0 R /XYZ 90 757.9346 null]
+>> endobj
+954 0 obj <<
+/D [951 0 R /XYZ 118.4032 384.5729 null]
+>> endobj
+62 0 obj <<
+/D [951 0 R /XYZ 90 367.8457 null]
+>> endobj
+781 0 obj <<
+/D [951 0 R /XYZ 90 339.5499 null]
+>> endobj
+831 0 obj <<
+/D [951 0 R /XYZ 90 307.9395 null]
+>> endobj
+849 0 obj <<
+/D [951 0 R /XYZ 90 264.2234 null]
+>> endobj
+779 0 obj <<
+/D [951 0 R /XYZ 90 208.9357 null]
+>> endobj
+732 0 obj <<
+/D [951 0 R /XYZ 90 152.5223 null]
+>> endobj
+950 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+959 0 obj <<
+/Length 4054      
+/Filter /FlateDecode
+>>
+stream
+x��[Is�F���W���]+��[K�n˖
I3/��DB�$��n��Ofe(,�ƞ�DG4�ʬ��_.U�+��ʰU���H���
�z��/ܑ7@��
��>GzeB�h��l%D<Ԃ����瀇\�7�1\�O��|������m����+�e�d�@>�K���
�1ݔ��8���?��V;���,�&ѫ���Bn�X
.���������
"�s+SV�p��H&t��Jt�x�&�v���MhpU?_~w��O��Ǖ��`T_�dԎk:�ް\�a��y0�}����K�V�7�d&�[s�G�u������rM��v�����QcK�)}^

<�9b�ߧ@P�wU��댸�滬ȋz+�Y�6eU��sY�ö,֊��jd��V?6R��E�	<4Z�R
���k��p8���t�UE	��Mr��͏i�䇬h��`��m�d��ɷ�c�G��Rh��Λ_�b�k�@�;��Ձ���I�o�HN�`L�	}\�w����i�ٵ��*�f�B��0���	�v�J� [...]
+Xxk
hs�V9���/���:۹�]�v߆��<���i
��l{�=�������ٰ�dz�Er���Ek�-p?as�m9�6
�/4�V�֡�F�k�]���ej�S�Ռ�HB.�x��踦�(�Tڲ%��H��;��q�[r��[�Ӭ%GQ"���N,9]
���,u���D����[���W�[�C�'�3kɑh�H�,���$4Vl��J�`��A�3H �A�v
+94そ�D��t]P�E'��J��D{1"�rm���O��Y�5�Fp����O7��Q�]�1����!
��>���.B���
+�i�e�5ɴp�׌xݸ�7%n�ˏY�V������ae�[�Z
���@��߫�p,
���Sj7���kZ�%|
j��n��پ<"VQ#-Z%�u��k
�B�#��m��kQ�i�oԗ"#7��f.� �N��g��|K���V>ִ�=6 �8r�
�>�/YM=!��p-
�6�U��!��1�
G��ѢM�J����xO�?�OYE�W7�w��d��v6����|��H�]�G\�|[ �Q�΁�`��-�oO���ڲ]���

}�Y��Q
֞���\�8�1t8%"��A��c2�|�1��6���8$qH3B2hd
<"$�v�j�q��j�,�rx}p�_�S�
1�#�2<���~!멛�q- ��I�b��E4��A�O�;4|�sZ�BЎ^F�5aP>�
NM	�R�	��*��x�~ �}��
�cO����!����zwp�
�
�#Gx(O�kz86e�Z���7�Wv��ܦU#���ˇ��`��}x��y��`�p�0	ߨ��������[�c�,x\��2��,ڇ/�Q�×��6|I�� x'�,%<d@��`��E�Sm�
�,2�܀^��tE d�� (��:l?�<��d
�v��yQ�$��}>r��J�MF��
+j�����qc!�w[֐z�R�� <B��T�f�/��6���)n^���h ��<56]��sF�C���(�@ڌ]:��&3X�m��l ���W%`�~#�U�A��ǧ���#6D��:�$:
��_�f����xM
�~4�9�h�~!0Akڟ	F�$��l��<�]dw�m�SR�=���螻�A,�\�dI(�qw<5-<ls��Ӊks�� ��z�U��@�����4�E��c�S�}ش�r��8�Kx��c��QȢ(Z��k[:�[�
�@����
�t�!����`h�
LqDL��[��p%b�tVKnqi��¹�F���
��|
�t�B��B���V_���R��6�Ұ��E2,I 뙒D��
ʊ���.|G
�
V�\E�T�
+
|���"�����
��L-q"��1L5�h��j���kTN
K[�B(.B!�)BxL���dg�?3�3�R��;�Ɉ#+!d-�a?�Fe�R�6���?��8�W�P��YQg-�+C at k�p=��tD��D��� ݘ�x
4��k�AN

�b�Z�Ey��o�/'�W+Jv^�ǡ�J
��#N@��� �sz�i��⨟�=&����-{pƘ
�?��ے��n��xb��s�ι�ֹ�Cdݺ��u�����X���0�,#&����3�1�k0���"��iދ��#3�E�����^mE�:J��(�Rg1/��q�cW�7Q⚇~f4 at 2���T���t�%��x�������b��>׬iw
d��?}7{R��"��ˣv\�a'�w"Q�pp��3��(�;����|N�k�:L׉�A��~F�I�El��஬���&�@��

�,��ٺ>�tY6���9��1��&I�ݫ'$1�M�T��U%�BQҸ*�������
+|���K�ߕ��
+��`߻S�D[c��t
�1��(Bd!m���(��/�e��8|�c�1� ���`��g�|��P��d�"I,B%zIX��DZ�C��$"�����y�8`�F��L}��D�i�� 
�)�;ɽ�5
-�

��������a���x�xH�յ�ق���C9�P=x�x�<�
�
x�!x�xL.X��8^�
�����C����>�G�Hle�E��
i���� s'��_aX�%}�s@϶��� �Ù�G_���xq_���u��8^�8
+ci\H�������
+��o�3
+4��i�v��B�P�Č�1�ގ����(z��g�qB�:����+�O�6<w
I�˧�FA�#�7�ezg�&��
�D��-š�5
k
âbp�!h�zyԎk:��`�"J��ۢ%dޙ����vw���YXCJ-��O�n⯃5��?UUڤ�L�<4����*9�V��z�t�����Q���Ϫ:�J� 
b�D'��	~�c�w�I�'����3R��
��rM�5T��4�z7��D4���&r2;���4����5xf�g^܏����Җ1 t�H)�� �k
Z�ҫ�8�)y �cy~qȎk:� DNDÑ;cE{U�j�2�ٚ3:��ѹ�6vG·ĭ��p�o�Ѹ%��廫������;1il��C�D_D�t�ޗOy��\�>��

>t�8s��@<�gO
☊�K�<�e�0.N at S�<P߂~�`{s����T0b	q��2
źk(��
Ǝ���nc}&C����J����
x�s��
2�s���ߎ��_s^���w2��F�ch[��g��#�ߞR%�Na]�	�]V�/=�T~����y%:$=C�;���'�N.U��y/\lu���펩%l�lz�����?��&�	��%�����WP|��Q	�Y^l��ަ��[�m�W\+��V
-
���έ%���;2�K>a����8�̮����>���^�M�ו[)�a���>��2E$�)M�\��28E7bAї��}<�E�G�]{��[E�Nѵ�Rh[WH+�����;��K�/sw� ��"۶�^b{��C�w��g�$�G���V��S[{Y�)
�ҁi�%{`�Kq�xXS�nΘ�:�e�b��W�=:��j���a�Xy탭?{����ڌ+ �"Cs$���
T��L
|�Z��ySC���Q����Q�̈́QmI���FBS��"���\d�-��F�S>[���ij'�Ч�|1M'�,�*_غP�d
��&V[Z�Af�v���DU[ۂ��l�_đ�[\��L�k��Clx[b�QJ����L
菱Pk9{����x�����p�EI�aj�&ar��O����r �DL�R��e
��Sg������p�|���
�q,A
�
+"������<�����.-��G�r�K��]ȸ���L��B�����tL��
�_A"�,̅��F
��}��ޢtX8Nt��T���yendstream
+endobj
+958 0 obj <<
+/Type /Page
+/Contents 959 0 R
+/Resources 957 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 922 0 R
+/Annots [ 962 0 R 964 0 R 967 0 R 970 0 R 971 0 R 973 0 R 974 0 R 977 0 R ]
+>> endobj
+962 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [123.5939 696.6246 340.7794 706.5223]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/Publications/)>>
+>> endobj
+964 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [211.9318 652.1663 429.1174 663.0702]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/Publications/)>>
+>> endobj
+967 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [113.9104 429.6258 331.0959 439.5236]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/Publications/)>>
+>> endobj
+970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.8314 274.1439 224.4151 284.4899]
+/Subtype /Link
+/A << /S /GoTo /D (main_BRZH02c) >>
+>> endobj
+971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [277.9238 274.1439 495.1093 284.4899]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/Publications/)>>
+>> endobj
+973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [188.7788 242.2634 405.9644 252.6095]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/Publications/)>>
+>> endobj
+974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [451.334 242.2634 501.4757 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (main_BRZH02b) >>
+>> endobj
+977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+960 0 obj <<
+/D [958 0 R /XYZ 90 757.9346 null]
+>> endobj
+961 0 obj <<
+/D [958 0 R /XYZ 90 733.028 null]
+>> endobj
+963 0 obj <<
+/D [958 0 R /XYZ 90 693.6358 null]
+>> endobj
+965 0 obj <<
+/D [958 0 R /XYZ 90 649.1775 null]
+>> endobj
+966 0 obj <<
+/D [958 0 R /XYZ 90 582.1488 null]
+>> endobj
+832 0 obj <<
+/D [958 0 R /XYZ 90 525.6408 null]
+>> endobj
+782 0 obj <<
+/D [958 0 R /XYZ 90 469.85 null]
+>> endobj
+968 0 obj <<
+/D [958 0 R /XYZ 90 426.637 null]
+>> endobj
+969 0 obj <<
+/D [958 0 R /XYZ 90 370.2236 null]
+>> endobj
+554 0 obj <<
+/D [958 0 R /XYZ 90 314.4328 null]
+>> endobj
+972 0 obj <<
+/D [958 0 R /XYZ 90 271.1551 null]
+>> endobj
+780 0 obj <<
+/D [958 0 R /XYZ 90 239.2746 null]
+>> endobj
+975 0 obj <<
+/D [958 0 R /XYZ 90 195.5984 null]
+>> endobj
+976 0 obj <<
+/D [958 0 R /XYZ 90 151.7628 null]
+>> endobj
+957 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+980 0 obj <<
+/Length 4134      
+/Filter /FlateDecode
+>>
+stream
+xڥZYs�6~���[�ڈ������g�;Im2y�%�b�"
q<�~�� ER��ɖ�,h�q|}���?��4
+"_K���'���ߝpۼ��e����ɫ�ap�}
����ތr?\�ޮ���b�c���.�ʇ*�m<���~8U\�LF
+�Gr)����m��N)�!G����;;]��>�0_�88}��s����D	�>򓛓�q��t�Z�����ӥT~
B�)�8��#��5�	� W����(�}�2.,]���`,;�C�����B��d0�|��{�b)���˶.,^R���m|��wO
μd���.R�;k�r�4ي���zU�������z���gE�TDZ�uS%Y��Ԗl�⁊.����.O��Pk ����,�P�ҮB�lq�,�.
$}���߂��m�t^�i�����t�Jx_�Ui��􍌅�^��o*��fC�gE�&�-/$��?����vW�Y���eA��UV���Y�~|��qK�އ
+7/�n3��\7��r���ML����\I��0���
X��%�;c�ԡ���	���,l�Y�}+��~q
Ÿ���l��:���0B��0Ҿ::.+}�IY�HV6i�&�%��8ώ��PX$�V��FQRx?/�8<��=�NUd�x�_C��e�5�-u�p�N_�O��'��ie�$@�m�dԑ�5EY,�>,�_�![�;"�˼m�����AV?�K+E�/y
aդ8� &� ���?��
�O���X�����o��O����mL�D�S�1��&�t��oq�כ��Q�~���y�+
��?��%� �e
�n͜LPw(�<�%t֊� �
�4�
A������y�t�}�F��Vw`��˳`� �Hk0�#����	�t`��fl�:0c�Q0#e̒�9a@�A���b%�(�:(����I s����I$� #$��$#�A2�Hƚ#HC?�RwH&�������
���[�D[�1
�b8��z3.N��>�$�;���<����c���4��
���a`:�� �B�@KP�Ʈ
��@Z�
�g*�<��>8�uV�:����&��M�$��
+\��6e�G��3J�
*Y6V��)Yv�d�
JV�"�1�0$�b)t��<퇠��cpO4
A�nx���D`
�
e�
p<�_K>��w]��k�y0��[�0up!C�⢘+gT���gF���75iQ�

W�/��
��=4��iC�g��T�jUgͳ�
���l�����у C���ԡ�?e�"
�/
s�j��
�9��:�8g�
��(ˎ��(NB����?� �{o��v�P�FH�Sl�uU��C#�.����i���
J%Ul�fS��Uj�%�Iצ���Ŵ}�#_���W"�ت7m�
x�
gC*����J��S�*� �zu��R{�:kʪ�~�����b��]V$@L�.�ۀ�=iE_7�̄U����4a��E ��z�*�J��H�t4��.�(;��F�o2B5�h`(��TY7�[�j�L�͟i<�
l=��o�<]��ᗄP:��0Ȥձ?��`0N`��v�� �
F
����˰�
+���
�*��e�
�sٸ�/+�v"��˝Մf�}�Z��Rs`�mdx�C�	�š�?��BZ�Ƀ��>���:��
*>c�
&�O5�;:�
�qS��Q
2=tS$�s�����#��bE �2ޤk�$����z���n��4F��<eu��u��~Y�M�
�X�apG��!%
L�v1/]m�2/�a`���^%m���a�Ҕ~mA�7�
��|�c.֦
+TR�  �+��i��`���5�*�ϕv��O]�c�$\�e�

�?���q6M���ի��'?���g�2��6���"�W_:���IF4N`&T��{s¯���4�|�d�$���p
�<N7:��eS<���dl�
S�����SM˘#02��������
+��6��/Ӏ0X��D2Gj?����$;��Y��#�����^�%�w%�
�07P��"��d�m��*Kgs%(�[�Nӂ��]m��1 �O��&y���J���gP��I����&����ӆJu��&U�-��]�"9�u���!�

���8�,Lx�9�u45�<����:���
���1G@�)�%s.��B�)�Ʊ�}�e(�b6s�5`��jW�
���:
;�
�%hqBM��0�nL�o<WХ���,�_`׊}�3� �]`���m�n��`LM���g�=C��;�8&���;�>���ަ7����:���t)����C��p0CQ�Y�
�X��5�\$�1SǕK�jR�t�\>06��ǂ�YvT�<�
8�1>7���ħ*�K�'{uAq�w��P�O]84J0<�LΝځ�M
��
":��s�~ ZG&� ��W�6�	`��z��FҠ���|��}�
+�L1�N�ro�]J�9�^��^�!F����w��c�'�芈����5�\^/B��h��e��5���
��$���A?�1���ҏd�K㔬 �8J�&�N�b��2n���q�U*��ݺ� �yA ��m~AzTӂ�� �#�p�eO�<g����	Aqh�1� +�׾R<�� M�H��ݮ*�Ն�5%�n�u���
+T��}CזUJ��gv �����
iP��zoQ�����W�֠K5s�����l�g���-�i(�g���@�Ȕ�n�����{A��4�ss��@�q6�*	��#�hg
!�
+���S�M�v_g�����^
��pV:D����t�ާ�����H��$���ez��s�4�
.҃��![�!*1�&���9p��E��۬�q�4W�`����-�MJn��K�'.�
�WY�c$�Ml��XWex5����L&
+yGh�<x��y�}��]%����x�q~�b|��s�SB
F>���'؟[P�Ä
���+��ceށ�rG�]V�M�
+M�5q�D_�[ԘM0��Y|l�"�Sߣ	��Ң����{�|�g-�
���m�)$'Ie�ݝ�yP
��Ҥ}�ipN���c
;3��>[s=���K1�������;k��P[?�MUbf�*�]���ҝ[&�e[���.m`$n"2Ƭ�A�y��DD]�����p�7Qbx�g�:����
�VF�
)���:��k &\�ý��uPE(X5�P&478'QԿ�p��0����t�0� �J
�Δ&��P��B�p/�n�\.1�l�!�N�ʛ�l�u����%�[�w"�YaI��d�����&��# a{��9Y;�����iYpu�T�g�Wy���m��&w
����{K��D�R��w�q�)���;|��j�6C���e&����3s�. ��fZ���,��,Y�w��B|�1�1L�B��{4��`ϊ�N
ss]!C��������妰Mg��sZ���T���*m�M�:��o��X�TC
EN��۵��(
A��S���W������¤�
@0rG�������5
l����ķ1�$�?�
��L��G5-��������@JQ-�]GyvT�LGy���€�����&	��������1-.�����[���ו�l�15���b�E���L��R0��r��Tu���Bno(+���*��)�\-�H����ho
+�x��|�ɀ�]��]��E+-<�Ϩ@��.���*�<f�kětrv�L�2`�(W-N�)'hm��#���U��R�N���y`B�,�P����W��~�S�n�o	q�Q�
�!�8��s��{���������c$��*�S�&>�6�,�xa�?�aAHe9n,��wU�;�(Һ!p��%"�oXk�
+2to�pcؐg .լ
,��C6��n��l���b�d�TC�
�c�,�.�\vA�y��*�u��\��Y�Z�/i��� ���R�
+
29y�N1s��דv�
?��������ב���\4	�Ul�Ү���H�~���+{
��i�
�P�.�I
(�����2�&D�EI����8���|�KGn��^w1�_����{�U�E����y����E$��޲#:��`��F,
̅�(بmY��6�-}ۀON忒���endstream
+endobj
+979 0 obj <<
+/Type /Page
+/Contents 980 0 R
+/Resources 978 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 922 0 R
+/Annots [ 987 0 R 994 0 R ]
+>> endobj
+987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [113.9104 445.5661 404.5981 455.8473]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.ifor.math.ethz.ch/~fukuda/fukuda.html)>>
+>> endobj
+994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+981 0 obj <<
+/D [979 0 R /XYZ 90 757.9346 null]
+>> endobj
+778 0 obj <<
+/D [979 0 R /XYZ 90 733.028 null]
+>> endobj
+982 0 obj <<
+/D [979 0 R /XYZ 90 693.0131 null]
+>> endobj
+983 0 obj <<
+/D [979 0 R /XYZ 90 649.8948 null]
+>> endobj
+984 0 obj <<
+/D [979 0 R /XYZ 90 605.7155 null]
+>> endobj
+985 0 obj <<
+/D [979 0 R /XYZ 90 573.4614 null]
+>> endobj
+986 0 obj <<
+/D [979 0 R /XYZ 90 543.5187 null]
+>> endobj
+555 0 obj <<
+/D [979 0 R /XYZ 90 485.7902 null]
+>> endobj
+676 0 obj <<
+/D [979 0 R /XYZ 90 442.5773 null]
+>> endobj
+988 0 obj <<
+/D [979 0 R /XYZ 90 386.1638 null]
+>> endobj
+989 0 obj <<
+/D [979 0 R /XYZ 90 343.0455 null]
+>> endobj
+731 0 obj <<
+/D [979 0 R /XYZ 90 299.2099 null]
+>> endobj
+990 0 obj <<
+/D [979 0 R /XYZ 90 255.3742 null]
+>> endobj
+991 0 obj <<
+/D [979 0 R /XYZ 90 210.8213 null]
+>> endobj
+992 0 obj <<
+/D [979 0 R /XYZ 90 166.9857 null]
+>> endobj
+993 0 obj <<
+/D [979 0 R /XYZ 90 135.1053 null]
+>> endobj
+978 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+997 0 obj <<
+/Length 4154      
+/Filter /FlateDecode
+>>
+stream
+xڵZ[s۸�~����
�*�q%�ysng�l�����d
h����H
I�����7���ڤ�"���_7�.)�g�	��J�D��r���������K(_�^�_\���eB��Ǘ��������_�1��b�(�����ȫM��
���ş��/%�
+-�}�^���t�.)3������5t��%"1��;�P’�_�.$᥸�����
W`+̍Lr�a�r)$11T��2�Pf4L�n�J��� ������{��
�	N
���6��IM�*�Sʄ&FS6T��,����]V~���"D��|�?V�7_��k��ڗ�/
�Һ�����[X��R�I��������u��|�f�h�=Ը�i�
|N��k�uB7���X�$�L߬�ʧ�n��wUQ@/}�wM���t���i�
�يa�#�R
��fd<�a1�@jdr~��R�+�	��|�șl�D���IM��V\��x����g�.-
���m�%�$���ID�o���B��E�"����-c�T�m����5��DG��EY�����6�JW�zt���,���v��P�k�R�
�k\���ei��D����R
�@��ѿM����(�����|g{�@'���M�*�$��C�~_mӺȳ[�1s
e뼭��)�9SD�:0޵�f�ں.���ؒ+����Ze�`�i�L�|��\oYӺ/7%@w�i��C����W�Q��Q,�{��&?�f��pB�u�~���a�@AU
v�]���ҵ���5NH,��M|�V�^
e���y������U��p(V��*��U6g�R��|��}��W�sF�}��tw8.
+LOi�b�eVl`:�
@
��%�7��n_�"�	�-ҍ�|	/yy�)�m�D�g�BOj�)��)�3N�ΞS+=����SP|��
:��8��uN^n��.-G �G����kpp���,-�m���{� ^
��{�
�K���7���z;�ۢ4%1�toah`��
+�~��m�n�K�ۻ��rϯ�&ߔsp1�Y���"�}��r��~aJ/�QGl��x��(�Ÿ�[Oj
oA����=��
	�)y^g��شbJ
5�/��(a�	� ���w�BZ"�e�����4�Ϟ�`�w��/��r��l��qB�,���"kp�N���v���\�7�6[m�w�y���H�/ 3b7�
��kL�S�/��;��
I�nݧ�<Xwϯ��1s
}��Z����*o����D��-[���%7���� @/�Xh���%%
����͛7a��H��
��5�
+�{��^`՚ƃ�Sz�a���X����	�B;�[d�� �|
+n`����:��D���Aa>���M0��Ce)�v�SM��,�b�Z2܉���-���m�v����{�\?ͺ
Ed,t��0%�fi��&�
��/Hm Ca
U1��B
�ǴF� �����
��D�Zm([�hm9��>X`ۧ��m�p��|��o)|����A��
�ʑÁ|��C�I��Z2h
_*����T���ex�����Ʋ_��I,x�2NĶm��\]}����uޤ䱾��
+�B[�	��We�}��$�vW��-% ����3HM�:X�ik.&:el�"���k�I͛[���b�U��c�����G �D�D
��6�U�@�#��{T"X�}�U���C^��A%>��
�
��c]��~|�j��|��:�(b��@	4�g�,C ���!���޲JKW�c
+q��@���f��:J
~[��?p�vz�8b�
g�����)xH#�����	͂#�[l``�j�9g��������	MԎܱ&1�  C�;�
�s�L��p��*�ve%/��
�@(��e�
�n��p��B)�DZl�:o���5�T���~><yGy�r��]9	�&-�	`�n�s����]�p�|���뻱����)>��D����x��/���ʎ
�����g�ѓ��Fpب�$���(œW��*G
��E��t1
��EЉնP��έc�	�
a��
��2�dX8�5�*�NM���u.� R�?`�����
�X��2�F�#[;��g)�8�]���p�D�3;��0
<���
�_��ى�v�|�o�a����<lp�ts�� 4H��%����TP'5����r+�_�+��ϫ�x�D[�w�Nj:��jNZ
n5����$6&��i�d
�ɊG��V��!ت2�P=�ө�Dؐ �^��1��5�
B0	D�i�'�/s�7� ��W���I��T� I͋DL̕��P�;2��N������I
�R=���Kͻ� ���/s�.���?Ϊ�zG[�kj��;߄����%�
ݠ.3���_�8��&31�nc��A�Ώ����d=�*\��1Odx�	�`�6GyLAbc��/U�?8N�8��s���A�K���EV���F���n\�n�r�q�H���
+�,�M�(��J&?�d:&"V�lq}�Y,uK�f��h"d��Nj�tB�!�j~�3�x�謚�a�9;d=�E�u�>��j�Ձ�
+.�$��^y�!��
p��%��-$�\=�Ԁ�Py���lJ^��m�&0�JaC�gR)H
c�R)x�c��6�ć3)��g�)���e�T�4ήp!-�ò����l�c
|<�0�L��'��5��y
���4U�t\O�
Mhj�����+���}G�fS��h�v|!�rڀ��h���
:h�3�>����yh�5wЖl��F��������U�)����˭�������Pz}�:���-��*a�����5���Xt���)�g~�50=�&��4s8�D�;��տ�~�6>�Z�#/1o��
��*[U��
�s�eO�mE�7$��@h��C����i�Q0V�<�Y�K�c,8��"����
Є!J����Nj�y��D)�
��L5�(���j�����
��Ηަ�;��'��W_��߂7i�P�m�P~��?z��m
����cx�\�:X���Y���D(�ك���6�@1q�P�]��K�֥K\��<\ψޣ>�lX�e�yB�1i3wF�4F�K;�
5P�F��M-�"�
0��fFL�Ѻy��H��_:)��3L�~s3kC�$:�{�D��.xc̀��Q��!0�
�*w��%�|�ٮii�8.U�
���:w����X��b
X^#�q�`nm����F��5.Y��1�n��
7!����Emd.����|���L�2�y3�K͚q'`���-���x�!\>�������R�P�5Z׺�I|���~��o��܋=<t6Ϸy�`ߞQ^�o] �/.K����u�
i�,�6�0E�\vk��ixԁ�3!苀`Eb�Ǵ��p�C��nY8����=
�}�3yþ�<h���cf@�g5����`�s%�z�Ӧ�9m�ֵۦ��z�6|�����;�,z�6{�#�;=P�C7ޝU��v9�֪�-��������)3G@
+�9ս�Q��a�۔9>�
/c`�f���`��;<
���a��Z�����Ǖ��z��ږ����|��p�X6��2�$�a�&��C��,�:
���v6%)	��g5z���IЯ4�
�CŽն���;�S	I%��$����1�?���ʞ3PÃƟ�������M	{
+�LV����F0�nG
9��Ks9�\��"
�v��%™� �'5�� �U����Sq^g'5U:BWL
ez�����d=p�3�M�;i��9�rwxh�}��#��
\�����H�K��3��a�r�!�@8bQ���C��%�ﹽ�� ��(Z.9 #M��

��n�<����A^�f.o�����[w),pQ��NN�UKb`�T
�N�Nb)m�I0�)�?91�����ї��[pp���	?F�y���T�/�C������^�C��n��/s&���,l�o��Ҹx���eŃ�ۢ���߷���2��{��:�ee�]�>,hB9S��[��2��O�=%�Q��Hء@O9���<*1���-���t���̏�HX2���l��}'���OԻ�C�e�?tTsT@���39w��f"�0��&�i at W�θF{	�2�lr�`4L'c�Y:s��UX�j�#��'��x�r(�}M��j�/&�M#J��έ޲��e0��r���
��o �hW�Y``>�SM� [...]
+endobj
+996 0 obj <<
+/Type /Page
+/Contents 997 0 R
+/Resources 995 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1016 0 R
+/Annots [ 1002 0 R 1006 0 R 1007 0 R 1015 0 R ]
+>> endobj
+1002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [113.9104 533.2373 450.6476 543.135]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html)>>
+>> endobj
+1006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [113.9104 437.5959 374.7102 447.8772]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://icps.u-strasbg.fr/~loechner/polylib/)>>
+>> endobj
+1007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.9172 425.576 217.0526 435.922]
+/Subtype /Link
+/A << /S /GoTo /D (main_Wil93) >>
+>> endobj
+1015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+998 0 obj <<
+/D [996 0 R /XYZ 90 757.9346 null]
+>> endobj
+713 0 obj <<
+/D [996 0 R /XYZ 90 733.028 null]
+>> endobj
+999 0 obj <<
+/D [996 0 R /XYZ 90 706.906 null]
+>> endobj
+714 0 obj <<
+/D [996 0 R /XYZ 90 649.1775 null]
+>> endobj
+1000 0 obj <<
+/D [996 0 R /XYZ 90 617.2971 null]
+>> endobj
+1001 0 obj <<
+/D [996 0 R /XYZ 90 573.4614 null]
+>> endobj
+1003 0 obj <<
+/D [996 0 R /XYZ 90 530.2485 null]
+>> endobj
+1004 0 obj <<
+/D [996 0 R /XYZ 90 497.8649 null]
+>> endobj
+1005 0 obj <<
+/D [996 0 R /XYZ 90 466.5822 null]
+>> endobj
+1008 0 obj <<
+/D [996 0 R /XYZ 90 422.5872 null]
+>> endobj
+1009 0 obj <<
+/D [996 0 R /XYZ 90 390.2684 null]
+>> endobj
+1010 0 obj <<
+/D [996 0 R /XYZ 90 346.3132 null]
+>> endobj
+1011 0 obj <<
+/D [996 0 R /XYZ 90 314.4328 null]
+>> endobj
+1012 0 obj <<
+/D [996 0 R /XYZ 90 258.642 null]
+>> endobj
+556 0 obj <<
+/D [996 0 R /XYZ 90 226.7616 null]
+>> endobj
+869 0 obj <<
+/D [996 0 R /XYZ 90 194.8811 null]
+>> endobj
+1013 0 obj <<
+/D [996 0 R /XYZ 90 163.0007 null]
+>> endobj
+1014 0 obj <<
+/D [996 0 R /XYZ 90 131.2397 null]
+>> endobj
+995 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1019 0 obj <<
+/Length 3547      
+/Filter /FlateDecode
+>>
+stream
+xڥZY��6~�_�o�T�hDR���Il�qof���$5�[e�������
��:��Ԗ��$� | �� ��Ml�(�3ƛ�xl�@~{%x��o]�o
�����&�Xƛ���
?�Bn
��{��VF����߸�k��u>
�UYP�Dz�u����0�Tt���W���Y�H������?��t��*�U�F�'���2�9^�R�Nuu��Q
�	k[
%l/js�B?�a�W��H8
�� ���O�2�i���:�<}Vџ��	X7
R�q%.�
��
G�YX(�'iM��޿�����4���s�T
+�u�����VK�M[rg�[l�ӵ����3N72�cZ5���ꬑ?�<�x�&	
Ť
+�Pe1l5��9ҲeI��a�cޗ���gm�F�t�a��4�,�Y�nY�ǁ��gQD����Yp�����Md*��+���z_�݁�}��]
+�6
��禒I�InX@��]��=���m�u',����>3Z+
+~��b"3ef~3r}E��4T��/j�?΄�J}9F\���Y����_\�#���cd�<ƈL�<F� �
�ƴ
�3�M�p���o�
C� 9�m���{�n�Jg�Lz�~��C�.�f�ޖ}Ӣԛ��R"��,�Ȫ��|��Й;V�� �ͫ$S� ����J;
+b����G��(��v\
G��n-He�Gq�Aj8�������dH�������hv�
.�
+���-u��D����V�x~Y�}h˺�}SӞGMx��(�[]^ˈ
�ve���ꮻ�m���5Ny��0�

w��(`xy�V�Ǩ��4�k��"�c84�d�8N�$Q_A�����_���9���"pv_�߮&�Di���~�~�����gl�>
+.Nm��σN��P����õ:��D�^Yejt �D�uG��³hȠ���տíK��ߏ�e���A��^�*[�
)�]�u۔���#�T�oNPk��gA?�]����;b���J��2�~i�K�M���
<��+Qb��
��B�1��o��3Nɫ�,*�,`��N�� j�L��I   �B�։�����w����w���j
(@�PZ$�*�3:�+k8�Z�`U*�(��������k���`D�b
+#o �
=F?n�����SK\��$
�������"�N��T=�:
+s�
E4��l
�X7�1l
�fJ$fk C$~,Ð-x�z�ܖ�CO�Q�-�'������,���O8�Ԓf
m�
��؀�xW��Y�Q�6P�@
+�3
+5�����NiegܺS(��%�q���?����u;�i�w
@N��3u楕�Z�01@N$�/R���9�΍��%�$��n�eO�Ȑ��o�� ����m�]=Kbяp�Gb�ɥɐ�T|�+V��
6ŀ��
bF�d���{�T��� ƺ� u�NИ|��NPXN�J�9�U>���:?>V�9:TFqGE�߼bbY߱r6!k���+��
T�D^ht
G'�@�Xe�Oe��̹ï�Դ�:-�hC���vԣe�ql��Z3�B
+@�*K����M�@`d\�gة[��Z�|�s���+��nE+��rnV
p�
�ӻ�_�
RT�CijS�)b��0½o�̌5-���1w�L�����M��EL���fM�Θ��
�����;����v�	��4���&�0uv�Ī�ƘG�0����m�m~�C��
+?^l�K
�G!PZ��K+nGx��S/�1�JitQ��y�ЁRx3�o at 7k�3'� J	��5�}36�}u����(��4��c����x�1�+�q
 	���-5�-�H�4��C��T!��d�5���x��~
��?���u0�leϠj�r�m+^:i�=�Ɯ5��
�D�@9�l�v�8Ս�Z�*���7�
W���x�7� �/x�I矈d�/�(������#G�V�t�R:H8�X
+Ϣ4 ç��M���Q>q#6q"��xA?yF
�
+CZ?�J�@��C�S�lN�
�_�
;�J:��^$[���5�s
�s
���
p2 ��=/O�i��ǵ-��R�� �'���"��Nb�I���"۩މ؁��.�-���H1
��fi��]�o6W�lF�dM�Q�����6
+M��Y���&b8�B�R�����v/껱F��̘�Yi
+/��u�8/Btk1.Rz��z�LrGL53
����c�`
�mҌC��&|aO4��Ť5K1�Q�<1��V�Q�F����]�Ű*y�ie+ q�b�l�� b
Q)�6 ��*#��a��B�}�V4Btw�DY>�UٛXCj���Q�<8�
Nl7<aTn�qJ)���T��
�m���%��RM�q��
�׳O�8^Lf\u J�-�E�O�Q?�(:a���%+��Թ
�|H��Ł(98DnhkO������`�*�[0�s_[�X��;�p��)�:�6�S������P��k�T�	&���G���α�ڠ�
�����M���j�[p6�L$��
���i�Yش��EhI�g�
+K�'#\�

+�
�n�,r����㔃�\&�,�
+n��]�♗�g�~0Vr�a�z�E�s���'��fVJ�\:�6�
+
(o?�H�
:B��Z#LA���,�*2����Խ��+�Z��!�
A}�2����4�xQk^={��yy���3�قq�Υ:�\F�� 
�E�e�X�s��ǁ��c�e|
��A/b�Rݝ��NAl�h��M_������L�F~�c	�0q���zlN~�	��d��+��nM�
T��S�7�p,lH�����f۳��ǂ��J��#	�c����e� ?6�� ��5���*��<�
+�] �v������#����A 5��]��Q3g��V
��j{���y��5���ʊ}n|�y�^�;�� 7�������x��s��8[��0�(�>W}�1@�)�%���1��bd�
ö "�1
�+ at D�2+(
��.��@YMy�PScb
`�Y8(���	`���D���d��-J+8�ap
��^;#��!#�ϔ�]c�>��g������e5^.�9� ����5����<�mH1
����1FB�q(䃆����
+�<�Ʊ3@��H}P�C7/e
h��
�n�b�T��z�.
��S9���P��ZV&L�KjYo��}�L�x
��o(�?
J��`&����1 ��Ґ�'�
�{
+��_O}V2�h1���J�&��I�FF��qg<�G/ �u�fL�P��3>~vd�e�g��c�=a���w��5`����3��b��K�`%�f�J��T�1<'��$�V �����o�D5[���=>2�bI���>�|R�$�C �D/�o7�TI���=$l���&=�)g�
�
�{����r�����ZE�Ej�o��M�8���?�2K�~"�ɧ�����&����
Z�
������i�*��:�u������
l!���݁��2�R���ɇ�4�SbzJ_�Ne'�:3�g�˖r��TOOO~��C]�Z���N��n��>����Kֻ
��L�?
�'A:�ew�
�G���Ѽ�.�(���Mvi�endstream
+endobj
+1018 0 obj <<
+/Type /Page
+/Contents 1019 0 R
+/Resources 1017 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1016 0 R
+/Annots [ 1022 0 R 1024 0 R 1026 0 R 1028 0 R ]
+>> endobj
+1022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.0821 707.9571 309.5354 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (main_Wey50) >>
+>> endobj
+1024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.9317 664.6199 405.3849 675.5238]
+/Subtype /Link
+/A << /S /GoTo /D (main_Wey35) >>
+>> endobj
+1026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [297.062 536.6539 388.7183 547.5578]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://fsf.org/)>>
+>> endobj
+1028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1020 0 obj <<
+/D [1018 0 R /XYZ 90 757.9346 null]
+>> endobj
+1021 0 obj <<
+/D [1018 0 R /XYZ 90 733.028 null]
+>> endobj
+1023 0 obj <<
+/D [1018 0 R /XYZ 90 705.2175 null]
+>> endobj
+557 0 obj <<
+/D [1018 0 R /XYZ 90 661.8803 null]
+>> endobj
+66 0 obj <<
+/D [1018 0 R /XYZ 90 607.5294 null]
+>> endobj
+1025 0 obj <<
+/D [1018 0 R /XYZ 90 574.8836 null]
+>> endobj
+393 0 obj <<
+/D [1018 0 R /XYZ 90 574.8836 null]
+>> endobj
+1027 0 obj <<
+/D [1018 0 R /XYZ 90 469.3964 null]
+>> endobj
+1017 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1031 0 obj <<
+/Length 3170      
+/Filter /FlateDecode
+>>
+stream
+xڥ�r���_��`���ŕ7E�]rt%��,?
�Y�XX �af���k�VR�b��������m�d~���|�>��7�,�a}��𷇛W?��m�i��>
	B�IF��/^��GI����g��F������6%�?�R7��A
r/Nw�>�t���].�%q�տ���kp[�?�~\���3
?,���|s�b;�o�o����
�zb�oL��7F��ILo��4��/�4��v�8�<���]�x���T�x]�>���3p;�z�F I��m�Q5cM�R�Q�q|ޅ��z-���8��= �ݏ0�é�j�״#w �qzf�rZ�h����}�E���^coJ<�^�xQ�vg8�
���3!��
���Wn�X���w�=V��nu? 	��{���In1t2z���IY�Z9�,K�f8ɦ���L*��kM�G��

o�tiP>q�R͓�yA�ٙx0���6�Bie���^
ԙ�0]
+�{VߐB������>�r4
�_
��7zT=	
@��
^��خ_����6�
ҙ�Z4���a�z�&^Vr�=�jH���( @*9�r��B���q��A�6{$��P��4:�^=�G�)�
@F΂	��6�
h��mo:$��4O��ʠ\�t��s[��A�j^<�N{��*Y=G�#b
�0Ϙ��������;o>z�����O��lR�|t��C������{����&�L�;��~����d��I�Ƀ��l�#�R�{m�
��Z>�W��K��0�7O�����lӀz���Y+� N�˽��8=�m�B��e�(&]���D�j�������#d��%�������7L�I@
|h�g��5�#�Ԇz���m�z�a�
$^
z_X���H��V5��
oX@=�Ȣ̣�)^�I�
A�@�1
b�S���Qkv�z���@�h������K;�{DTqF���,rN�p
ո3hE�
guY�`�=SM "��k��{ځGk̿լ�������x5���"�œ�fAN��aw���
<:��{�P�T7
+Ⱥ^��`1{Y"eB�$/�E��@�H^s8�J�D��L6l��Ʀ�iTi4zEj� �sT��g�
t�
1l����ME�_
+� 
:r��9D�XiX����AZ<F$� �D��w0F�=h����*	��
QtJ�
\��������E��Q9��n\�M؛��zZ��
+y�o/4@��1¨��S��ݥ
���Vﺂ+P��>q�O��C�ڍ�O��xy%����Q TҊ��BBG�������4LJ��I�W2
��J(U,C)�
�I�6`t0�ސ��B�y4�7
c��1lpq�hw��*�%��mboq���r>�VQ��e�@�u�ԝ��1�K9�"��r
��x����-@8ǹ�VO��3�r�$����<y��Iv@�L'S��LS�SE�F\\�Wq�^ᩯA�ad�[�7�
+��@x��o�V��s
�Z\�"��#N�Q�
�}ڳ���� �6�mg]T6�H�.+i�u]o��V� qas��6�"EM
+�3��f�դ �C��H��9�ʽ�S�+q��C؏�H6"�S���Ӆ
ª m{��/�ḿŦ��w�
d�g����bA��L^�NO�U'�/�����\c��َ���c�:!5$
{~t���@䶍=�)H�G.I�
�6��={)��+]�.x=�("(1�;N�H3q��[�̧v�H�QA�"��Iΰ)9�%=3�u�"��f��#�-�)*t@�;�Fs�"JbЏ��
���j�X
b�G
����<\�Qؑ�=]!yaPqoCT &&���G3��s��Ip�w`�6�uD<	�jb�.��T26^x��ja�x�������ǁs��Ȓo����u-h)�'Ћ�
S銭'y��
�� ��/)��D�h_8�
�r���w��™��@���J�v�1+i�
�a�5P�g_�A�G�?Z
����S
ħ���M��M�Vc�M`�Ί2�U>�Q
+"���ǥsP6�k��ՌS
�A�>�ݒ�^��@��0p�
�����]V�#?,�*�\�(�*�7m��[]���T
 ��q	�����/�8Z�:0i���r
:
e�
"3�3��
˝kX�&�u�@�^�rkFJ�9'���Ć�ZP�� }Nѥx���U������!v	CVB���8���Kl2����^K{f˕�s9�5W[�4���s�
+��+P� �i�
��$⺚��� ���x�m�/�`oh����֏A�T���a�VIE[� �
F�~
Q�SN��i�A�Yh`�V�Ӥ��E��|P�s�
�g0����������p��oV$\0;�-�Z��S-8{��
l?`��<�
+�X[�ȥ��3ס]�8���(�"}
d��펍�
�
WS��&,2�E�X<��0�ނ�E�{���3�ƿ$�<��&PA���$�c�bN3�*��'N�2�a�����\�y�f�V�;���#D�X*⽂
_�	.���K
�����mQfc�,$J<J
��[�=
���mC�V&��
��*}��Ib{f=I�2ę
���ي���k�R���+͹�%Fjˋ.�Y���WtXOaMh;W���[�wU�t3��9��eW��lu:�oH8�,v���w����d�sN��;�P�(���#U.��$x2Gt�ǥt��9��<m� ��>�i���(������3����
l��bd�́Yn%�kX�����
e>�Ԓ�h���"{�3B�
y^��.�k��
����M;�l��'���e0b3eD Sk���܂���RϷn��U6�ib�[$��9--.-���556��.���+��?C���!�9�c�h�y�Y~(�o3�T���;{枍
��r�:.��-f�X
n��ح򡢐��ެ���]�dA���<")�ZZ�i
�[��]���v=q�M=�طb���e�O� A�%���
�#��T�/��b�>�2��?DH
+?I��?�i��_�Q�Z����E��
B�Y��o,�O�_��
+��
��r�U��:
$|���_v��
T�d?�!�^|T��(C��TB�k���i�5�x�ۭ��}~�;�_���d�'���?�c��W�����r��t�o�W]W����~e����w�^�"�!��4
�.�󹝫_�|���k|�&���}iendstream
+endobj
+1030 0 obj <<
+/Type /Page
+/Contents 1031 0 R
+/Resources 1029 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1016 0 R
+/Annots [ 1036 0 R ]
+>> endobj
+1036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1032 0 obj <<
+/D [1030 0 R /XYZ 90 757.9346 null]
+>> endobj
+1033 0 obj <<
+/D [1030 0 R /XYZ 90 628.5201 null]
+>> endobj
+1034 0 obj <<
+/D [1030 0 R /XYZ 90 604.1949 null]
+>> endobj
+1035 0 obj <<
+/D [1030 0 R /XYZ 90 280.8185 null]
+>> endobj
+1029 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1039 0 obj <<
+/Length 3042      
+/Filter /FlateDecode
+>>
+stream
+xڥZI����ϯ�M`U��l%r�(�$��J�>�@s�%lFb����Bb�\���_o���������ߤq�;�Q�ɫ�
��
~�����o??���ě�d��D;$�.V��|.~���Qž��?JC׺�J�<
�����hr][
�}�0������?
��0	���
~�������.<���:�.8
Ԧz�T�:�ç���� -X�b
�+w���
U��8�;�M�w
�)����-���٪��jz��n�����IM� �t��|��$�L�K�F[h��W7B2u^�v�H�
|�龼�Ʊg���j{]����e

/4
�yf=<�C׎
�MSZ�;��1v�8膸*����b7�����p�̔ٱ�<��ii�]��e��闳��<�u�i�����j
+��+G15�iuwj����L�>
��#r5�<��\\�
�8Pi �F�u�R^sb
+KNʨ�4�>��H�0���߬jK�2NS�}�uڶM]�8�S3t�l&������p��M(4J��+553��ҭȬmr�� ��{]L2VA�Yw&��
���
$r?h���T�eu��/�ʛBZ�F�
�5��8^9�U\�29[O���n�
�����`�P=�s���3�X��V�dG�,q��

휩��m0
�-
���	��<~�rtd��W�̙Pd}�S򦪆����A
+
IX@"���)����5GBA�9	X��h@
7�ne�
7v�!�g��NMw��":�3�n~c�Hr�!�T�l��;Y�.p�ϲ:]��wg��g57:r�%���
}�u���N]Sq�/�b�]��
�ėzY�.�6�<jb)`�Q���wᵕ̳�Y�i\�Uk*�ɮ�t� �E)'W�G0��̺4���OC��
��&����hF��7%f��b��$Mh���=9&t�� [�&�XfL�:
L�����au�H]�7-��J��P}��] �S���P�t
+wo
�
,���Ih~_M�|�� �@}�;b��NmyLNK�J�(�� 6cdp&�TB
���p�	Ġԑ+ô+�ui*#''��D}�^�f�݀ÇP�?���C"8`7
+S1q 7C�=/b'C*lX��9cZ΢b�»�E�
ٔjmjH�l�2Iꀚ��
��ִ&('�	�@�0v�y��}0���̈́��M?�`^�?����
�G�\��n�7ɿ�
�K]<��E���?�/'x#3 (�]ׅ�Yl�%�
�_��bIQ���
�9ŝ�g��p�e
^t��g�
�*`��=48Oc�I��t�D�	L���8�p���0Ns�<�%	r&
$��>5�cވ�
2/� �i�c��Ve�Ii�"[:�-
����C:��Ɛ����֡�Ґ�f��8��E�Yta�ƿ�o�&
�@Q�Ȋ�)���Y�M)-��,
�0T{�̈���W�ӱ�$� �'��C�~;�A��0ȼ)R'j(J�� C3+ek
�2\�匁M��|�18!��JL
�NE��)�p��9@ ����<G.�F��,7əi�e�
����+:�
+S2ʵ�@(�z�
+N�x>���)���+�WK��
�ԙ�<2�YJ�$�@a}����D�N2K 0�ΐ(]	���X�+�H|)�`�E�j��
Oyъ���e/U`RG}��)x?"�(��( ���v�.�(u���nx�o:��9����5
-ɖ�L�t�x6�
*���i�ۊ�.�����40
�5@#FC�Kzrسi7��B
�[Ÿ�_0LЁ$f��6�q�HE^n�|� "�9�&b��*f���
TL!���m�.��%���G�cG]�3���bx�P�
mڍ0݁jq
�M�-�;A٣a@'��9��r#��4��f�uL�/��8	�?u[H7M��9�~�w�)u�g��9� ��L������!��+�XO��.���^�,����9���
��1Ba���кr��B�{N(@�'
�j·'��1lb4b8�M�<�ێI����ɸX��&);-Bh�*A߁�?:
%8JN)D�$���d<(E0/M�8M� �5'���
+�����n�`)��鬿�vEӒ�vT ����O`E�ѝ

	D���c�]1g
O�2��m�z�F�j�``��̬�}U �d3�̕�}ք]�?�5!
I�a�^�3!k
��5Ἰ��^Bϖ������K�ɒ�[q�'0HR��F\�=N!�⒅A���
+�ۤX���B�K��g�E�i�*�T.
���]*X}ܒŖ+eCzJ��I�#��	��cH� Z8f�M% �{t���
�06/3S��LQEs&vw �qy����Ϥ��g��Fi3vg
��
+kW=�"'W��5�v���j��Ⱦ��;��ӀkY�P�nݹ��+�J2��7�[�0R&�b^��hGt����2��y��%�Hrք
��c �7�t�T�@��{
+KӓHŊ�D�X
!H

OR��������(4�HS�M�U7%/e�c,?�zu�h�a
J	of�ļ.�PɌūb�jA0Rr�
+�њ|h��H\
+� ���Â>��� �g��a���ۍ�������� E�: `��*�
��xmv1X�
	�XV[� h�t��)O-#�Є
 �$�"mX?�j�"
�F��iqA�7l��Iy�tB�'$���
vR�����@�q��]�
.:�D�"j�0�1	#�0�+;Z]�z9:��}r�:��^�T��$�
+�ͱ`���������LbɎY�yLY�Pr�}zB�U��j�?߰���9#��,_�&O
+��j�w$�x�Vp74~X��]'�����A����T4y�|��K¢�,�ءm�����T֚@�������+�I�W�����a���wh�j���������'�]
����dwHý|�vL,��<� ������z�E��o����:�l�(�{���%�_�ؗ�nG� �~�i��h ��ַ�Q�
K)�藍k�m���q���C!�]�n_�����?�}{�\v��
�i����B�x{�W����J�״�8N��e!��W�$��
^F㩚N��J��`ѝ
�?,���?�=endstream
+endobj
+1038 0 obj <<
+/Type /Page
+/Contents 1039 0 R
+/Resources 1037 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1016 0 R
+/Annots [ 1044 0 R ]
+>> endobj
+1044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1040 0 obj <<
+/D [1038 0 R /XYZ 90 757.9346 null]
+>> endobj
+1041 0 obj <<
+/D [1038 0 R /XYZ 90 577.0467 null]
+>> endobj
+1042 0 obj <<
+/D [1038 0 R /XYZ 90 351.8444 null]
+>> endobj
+1043 0 obj <<
+/D [1038 0 R /XYZ 90 205.9452 null]
+>> endobj
+1037 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1047 0 obj <<
+/Length 3343      
+/Filter /FlateDecode
+>>
+stream
+xڥ�n���_�j�c
��5}J�&H���S�H��]�h��.q����
)J��A
9
rH�}��}�}��i
�2����]t�7w1?�����ǻ�_g�}������
+Y
�"���O�8<�4
+���Gn�N
UK�O��5��ӵ�F�B&E ��/����#�{Ke#�_�~�%�o`���BY��3t�0.Kq�K�����uh�L�;b�?rF!�(K�9c

d
_��!����V/�;����7��(����<
�"����0auߍ!
��ש�����$�Ir�>�@��a6\ԥz�F���
��ϸ�~�L�c5��@���tV��4��|��a3|���Մ�ў�\���k��}���r���� ���qX�)��S?\��'��p�������5j�&†.�f��q��I>�6�w��n,��s5Q���54�v�uQj��v�<�
�ֺF�[�bG���
�<ySѼq#�+���,Ld��U�~"��#�$@Ro�sH������lE��9Jc:uO���/�����]�Ew�㑮�� 0��	d˪�.��s��r��ܴ�T�T�� ��,�T�� Y� ���
�n�Ȣ�ϣ[=&ݦ���=�dQ�dQzlB0�	[�&lzl®cNwl�b���2^:�����B)� [...]
+g �h:�s�҉L��z$Ƞ~���.$����Ȋ��S���RHfl!t�����w�MU��"|�07�ɴL�$��M��n��C{W$oR\D�
�V$Wtk�
y����
��KT`�:@�
�
ZF
PdA5�"��s�*3�;�0+ ��Vz����r�B�_O�1�ڏ{�
�8�l1y�Vv�+��吥�e$�\���8x�F4���_���ښ��x��7��̙Ό��H �f�:���"���yBCz!�Α�75����Js�js�klf�
�1�Kii�tn�>�1R�Z
�(@�p����i�:	Ů\3����⺃��՟��j0D���d���:%X�<L ��Yj�_0�p�z �

⠣as�]�5���I�7��9
k��#s=��q6���A at p3Ѱ	�`F�/{���& D��j�j4e��3a����
���Ϟ+��%�N�X�}��V�m9�k�D
fY~�vy�l�E{�vݢ�ٮ�t����6l�D|��&J�X��gc�F��>`��"�y4��(OF �	 ��
Te�'���)�
��������u��p�nћ�P�'��g\1�����
(9�
+Ln����;t">
Bw�ܑ�Z&V��MO#��p���`X
��UI�&{
��`G�;e�T#ʊ<�
�9�hz�p�6��P�0-r�ޗ����
���ؤ&l�A��
��x��9Ís� $��9^����U�?�xK�I$�c]�jd�A���2��t�4�	����'0mqINw %e�0���x8��}��
�a�@{C�7i����#Ĝ�܉4f��ɞ!�H_B���)J
+�q��L�}2!'e
�w��c��
=ڰ���oh
�v�pLh��
�S?��᱁� �Ӡ�~�8�=c�+#h�`kp�6���%��N'�
N
+#C���VQ�� F�
/��uG5�-gZ�sP2��y"	�Ԙ�pPp��V_4�Vp^]��.���xk������
����*y�y���!M���d��Qq��[{F���3��b3S�E���	��2
���v�hnj�dž��}-��r� ���l�Qr�8��b
y��؋
��;*��d��MQ�T
�^08)��kS�ZP�"��$3T�ۥ����a[��� z{��%��/��%M�� �M�KR �
�\^I����?��df�),A�
Pв9���0[b�l�+114�i#4R�ؓm�	��Z�0��X�@�(�-�!�D<B�V�N���>
�j(�ǁ�����I�#*I�<lt-{Ē��ƌ0F�r����:@M�dn�w�
��52�LE�f��#܈
ڻ1�M�K��]3���Jؓ����efmy�"�Y��;�5rv00�r�M~#����4��Aq_F��ZB��,/
��4�5�U������c;l$��G��AG����h{��&�ְ`#�8f%����+ `����6t�y�d:�=�k��
�p��\][[��b	�=M$��,���;��
E��i��7��G�!��]��Iq�w�Z�]�=Z�om� ��
+'���J�"_h�2́�F�b_h�k��y�v����(+�-	�-܀W���+��z��P��oB!)��ư k�����*�el���J®s�KK��B^9
:��g�x%A������y�T����k?L�y�8�bߠ@�,o����`�u�
�Uq
�T\õ�Kfj�D��j�Z]JsH��"���
Wq38��?l���Z�n���<Ȓ�	e�%Y8_R�o���OvXx�T�
��𼮐�,� ���2Bg�XF���G�Z�H6P�ZtlhliKdy�7�{���M1
��µL�����@�2���V�A�zck�����a�v
�8��!3M�/�D�	~Ud=�z��$X�P;)��Fe{���[K���xz#]��:5�_� ۱��s/gL�ls�=��",��|�%y�7<��z�!�"����D�;��'�2��R;��hz�a�/my��*���m)Z�
r|-�]�*�c�QgqKΔ���W{(P:ތMVbSX��D
��G��Q���]�)/��O"m�u��f�]�/}]W���[y!@��<"8�Z�Q��[Gy�觽�z�~�xIK-#V���� �c�w^���
�	�<�м^�z�ώ8uWcDF"}�}�G��3�}��E�Ӛ�t���t�\-c��7�ڈtl�l�؀�#��+�� �փm2c�4"�F��RIU\۪�Ѳ�X���5��a�8M
+zAz'�����Y/��-?ߦKy
+ڤ��zm-5���..z�cu�}���O�7��&�vx[�n%�i
(��=�V�!ͥW�a*m��) �¾]�N��v�a�N�oܤd���m������O���*���Y�E�3#U!����Ka�������ق���;s���K)����|7jmF����Kg���M�i�Q>LS��s�43�������֤�\��,,sY�/��&���p>�I���1ŧ�}9�f��O�Ce��#\����֪n���CM�K�儭F�A�
���~?(��� q��%�|o[_�&<x3�Gx�w�W�����t�������
ù��!�������WE`Osy�{��^VןD"��X���8�5�	�SS�~�q�w�;[�/d/�endstream
+endobj
+1046 0 obj <<
+/Type /Page
+/Contents 1047 0 R
+/Resources 1045 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1016 0 R
+/Annots [ 1051 0 R ]
+>> endobj
+1051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1048 0 obj <<
+/D [1046 0 R /XYZ 90 757.9346 null]
+>> endobj
+1049 0 obj <<
+/D [1046 0 R /XYZ 90 714.3182 null]
+>> endobj
+1050 0 obj <<
+/D [1046 0 R /XYZ 90 375.4522 null]
+>> endobj
+1045 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1054 0 obj <<
+/Length 3501      
+/Filter /FlateDecode
+>>
+stream
+xڥ�r���-�*i�o�٩صN�l�r�`��!1f9$M�+O�>��X�>��V�F���&��_x���<͏*N���zܿ �ۻP��`�i����ݻo��^
Ue��g����4
+����C�������(
ӚA7��0�������Ҵ�@������_�����_\xK�,ĥ����
��
��*��W��P���z�D��4w����� M��b�;{L��
�09� ���(>Y�NO�7ҵ�M�As���Qz8���#�X3|~Ӄ�� 
�
�2��!�c޺I�
+�f�x�A��0ހB�F��v��n-�̯S�||�?��]��[ݾ0�����z��}�S �<��Q�iH;���\W�o�2�W]�#��^�=p��S�u�Z�I�6ro|�4/���?0Cu�@�fV��z��,��sDm���n��©�
��~즡4LJ�XE�����P5Ƣ ��Н�â$`h��0.�%i�-����4Ƌ=��'r��8�+�
1:��>���
n�[���|��Z�2Q �^7�Ԉ���J	^�9p�֘�i$q�Z��ڞo�+�T0�(�=�\�,ˏQ�;fe��s���E2��M�
E�v�0�Y���]�c�Ѻ�5r�T�>$(_T���Q�h�ʽ#����e}�fo@������<Э���•]���v8������*
���L�2ߕ]�!UMgF��1
+P�V��B��d�}�'��v�>1�
|22���a���|A��;
흳@�F���ޖ�
X���鬛S[9Sk��e;���"e�[��
d�i���xk����A>���|��dO�)I��y ��`؅Ԝ������oe3UN*硻n��g�wG*�>��h���=�
���8_yiubG�_�[���[~��ޓ0�輜L��S��g6?fQ{�
+/x���Ãއ���r`� |M-:�S���r?
��BX�����31ܻRpFuy���ѭ�֭���u�R�& 	�]]K��0
+&�9�9�
�Ms��dQ��"�
����?r~�Z7�ȸ�
 p���OC�f7X(��E�
�� ��C�����u��i��=;�B�Fko�pC4_�8F\������իiX�m���{���h�k�271�w>��\95�lc$��]`�RX��N�yjx�� 
�d/p{A�}
���`���$��TG�DĻ:)�d�dk��~��")��7a�q50��˩��w`dP	�<9E��B��	/
�KҀ���p�P�E�9����o�G
qT�:ؽ�u��
�|��z���	�

�e&8T6�������ך�aBv�����J�Hbg�|�?.& n�쒾-Ϻp�a���y�+	]����V��p��Qt�Æ��h�!SKFp�Gg�
�x�

�t,���RE��yH�1W�+�a/
���%E�8�`I!<\(�����
kv�!)�ʚ�
z���&;
��=��k�
��g���&�ۓA��p�9�Y9����m`��D�
��{-�7\<!+����5~߂�F,d�d`1z#���Dl-64�
�5��
`��{*����"�$t�JSA�� z���O����
�c�C�
��g�3�i@�=
+�2
h���2
E�ɨ��hx$M�w$�~Z�
B�8΂��u��g&�
+��9,-��,L�P��V��y���7$�
1�`��@
@s�	>㙕&�ׂ{�-;Q�L
+)؜��.
d�$�.ܑ�n'`wgO穥8�Kؒ◧Cc��d��$�
�U������v���q�gf�Վ���3�fpY �_!��8^C��'S��n8+�ӞV���ť�'ctՕٽ����RWsIwB[�떿sX�y��B� �S��9#DŽ�g h��peR�Ii��/ n����-(iC�s�{���1�"�%Y�VH�8]YN ��
C7�r� �BSX-[�qr�0�i�E��P�\6d ��mez�8
%�@v�*?�};�a��8X����
k���P B����W��Vq3�f�����ʅNJ�2EW��9h��t
J��p�$
+bz�5���B}#�H��R`�2`�!΃�T#��
mH
+q6�	A.����Q�b�R#+5�Rc��"�d1]���u[�,p������l�$�	�D���$��i�!�Z�Z��P@�od�Z 龧K��,c>��q6 4C �g���+4���(����u(fO
�	���4�beK��K���������B�" ���=�2�d��M}�
+
��O���f"�m&��G�U��z?����{T�]�*��؜Q*�ʹX�x`���~�'sw�0$��*��`M�#��d� ���s�
\sA7u�� �t��*J,9��}�G�8w&<g&��(�Cϝ˽���88J���	7��,{0 b�
%�fnެf����h�Kp�3$��y��
ߙق�#��We�Q|&�����Ӛq�M}s�ȝ7lf��,����c	qTA��i��e+
+Rs���D�Q���1)jJZ�:�
�!���5��j<]�0����V��05�
�g|cWv��T�1�ں�s��ˡsY��d
�����hv a��@
9)g	���3dqÑ̲���9>
���_�G��
(�;�3a�<ӎ��(N���ü��>�$���)�W]9]]�
}4���`���ZUp��+�)F|w
*�}�Q
�,
����X��;z0�\q;
Щ�R�uنO�\
X2b�?ݣm����֏��
r�qS���hɣ[EW�N<���$uۼ,æ������9Z
+@���j�c��AEp#�Vh��s*�lj
+}:�Plhx��b]�9�'
h`g��*-t	��/��կ�)âY�@����P?�l�-����S����v-^�X*�F���B�)6J��D���Z� "`���X�@
+��)p�7p�8��^��i�
��\u%�iWeG�y
�����nz�0
�p�Vް�f�W
+IJi&�^^��c��t�
%L�Nx��S �{z-
�|/[I1��_1(8�F��

+��TF�N�^$$~U�h��Ԣ��hL�&*w��!�)�I���J�%`�q빍�����0s��G
Nh�0j�]�^M�=�I
ɣ�呗e��) Jup"Fi
L�w
+�hv;��*�i
O�,���Q�
�z�S�1'1ly����?��12��Mm
��%�9��[(�ã�#���!]��e��ʘ��$����ᄥ��Ց�y2�F��)	�c~���}N��#:(�
+!5�1�A7�2Ј����\!ͅ��P�#�~1�2b�΍�5�0ř� �����[�T
�4���P �&�������
�8�
+�?KȎ*�
���cb�Z��E�5�,����T�^?�R��?=`q����vr>E�)n`5�����h�V>Q��r��ZJ<��޵�6o�OxZ����-A7~����޽��
K{������
�-_I
U�ǿwzO
�
^V�Sv��X��
v��H�(Yl��ߙ��?R��endstream
+endobj
+1053 0 obj <<
+/Type /Page
+/Contents 1054 0 R
+/Resources 1052 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1016 0 R
+/Annots [ 1057 0 R ]
+>> endobj
+1057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1055 0 obj <<
+/D [1053 0 R /XYZ 90 757.9346 null]
+>> endobj
+1056 0 obj <<
+/D [1053 0 R /XYZ 90 201.6924 null]
+>> endobj
+1052 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1060 0 obj <<
+/Length 3219      
+/Filter /FlateDecode
+>>
+stream
+xڥZK������[�*-��� �RN�8�K�ׇ��.� �����k�=�T%bzz^�_�fV݇�O��}�fA'���x�?��;%����3�����_w�}�hw���v*H#�?ֿo��C����M>t����Ƨ�Sc*��h*�y��$������_
�ⲷ4�)\������5��0��<��@#
TQD�ǻ$�m�����n
�kGLU�r�4Z�1��p��tF�®wɦ��Xr#�T��_Z�/ݙIǮ6�&�-|[n��K�9L��!N���[��3s
��<5e%�ʺ6��Z�)�t4� Y�k��Q��l�a3�q�f���5
�A��HSE�⽂fƎK����J7��?��@�[��}�
�`����6
+e�X�l���l�t�R�N}w����n�k����02i:z���(I�@�t�Ō�a,�ڴ�0&�m`EX�
����X��ip:����x0	f��y$���4��ܸT]��$P$�ϵ@��
�v�0�0��\qlr�y<t�����Ӌ����]S�~u��R���HΧS���
���j
3,�
����|�b�`aA�į;#���PU�
�8O�yP>��(]��B�=�\�q���J�"����"=0��P5�92
�@�.��lG2�mz�
_c�'�f�6�D�P���vl���#�g�I�[�d�=w����6*���B���I�+�B�����=F��8z]�
�-=Z���xkEO���uz��}�V�l����M��I�i�A��P%��~��
��pҕ�
�f��u9��~j43�/���-�n���F����%�o���؃b��Գ�&tY��p:y��a
�i��a�v?.��[�{
�Ħ����l���@)r�e�[�I
��y��
+
��x
ۛ๹��7ֵ��[M���w�d�5d�^�P� #���P*J�^ S��U'�:��z���u���L�l�^���l���P��R�/�y

�9�
勠�tX����|��$����oB*̓8�D�UHy
� e�ކԭ=H�^�A�_�����)X�2:ې��e�
G�ٟ�A/�v[
���|}�2��]�U��sp��H
'�n���K���:n,�i��NޢZt��t�X'���c<R�5����)�Dξ�5��4%b��
V �Jc�.@���/ϟ�A�q6M��0p$�,P�Z\ ��jC���4���,�ۚ�������:�����
+?�cӀv�-��J�2�Q���Y6)���|2
���.~MN[+y4U$]��}9t�Qs���	y;�+�s>9VT/��ù�����
+�
+�����@��ݗ�x����p>����p����@�k�1T�d�����[��l�\���*f
�aL;���
��93F�#�?�K�
i��8E��
����
+� ��!|h�

���j�>H���۬ԅ�YE�Mv���L-��@����~Z2ѱ7��Cg�TT!�̺g{ԥ��L�7�Bm�&|�I2�Qa ������L�	��rG�R4�_�`�\{g��jXe�2n*̣ͩ�G&w��䒲J�?�7����OY��<����~��m�_�HAe^AA=�t���V".�@d
@�I
ˤ?h�� 
�B�{
�[ b;z�^.����ˆ���y�i�PEvՙ*�}O�!ؔ�O;E��4&H-�
��8�^��W1x�
׮ͱH`��,v$N/q��X�LbAN�j�%���W϶�x�SW�p����F���
����`c��c�kc8w�����Ddw�T۹G@  	�
�]�3�	O
+��;�ʁm�+
���{�)��)kvK����7�E*�+05�H�m�"la�Z)j��$Բ���r�����J��
+7��M
���
t�*�<�-�
+����A�Н�J80�6�_��C�co�"�^�ˋ a��C�9W�L��)��l'�& �. ���"����
鐵��;��
�G�g��(�E֣��`0
�5w��^��Y(S�)������ @Q�� �f�92{*�8{R�Y\R�\
�(�p1h00��
�Ko�Q������&nY�|%��O�9��~Q�Os�M�9'�ep��6A�FL}*���tCR_<��
�(PE�Ym� <n�h��l)�����8�
&N
+������8�0a��*�*o��B�<��7�V�ϕ]#�d��2ILF��t�\����)�b�Dh= %N��,�|x=�,A�G\7J$U�2�D�V ϏK�=s�ל$�h��MB4�L��M"I
��b(3L(�� ΀}5�L2��d�z�p%#|ے�xu5�W�
z1h��\;�>%Yx	 �ً��jV�o�����`���җ�:�/�sC)�*
�/3�֡�_�d�=��I�1TCوyL��A�g�4���t�+�vRw�gd𲇄©p����i$�S̉�b6j�sS����{
+��=eM%
M�vȪ0���@*H
	�9{�"l��㦕%�˗���
Q3�AL\m��}�7�Ӣ� _QL�Q(P���.�k�>s�b��� ���٫s�u`���g
>Y͞{%�ɮ�}v���'Wh�A�u��1�
�9���1͝�@��
�7)�O���n9�Ɔ�Z�
��5���T���
/���]�}�)��~dr	SB��
҄C[ΰ��<�p�'z�����D�6�|�1�^��A�5�
+JPEtAh5šܓ���p1��Մ��&d𯓱�������0�7'x��Ƚ�9��F����u]�"�&X����@��Y�
�s�Ogl(��ep�¥XPD�4W���2g2�<��
+[�ès��L�ضy&v�q���U�
`)�)��W.�Y���𸅔m�`p
r���v~�����^�Eډ��!�Q&y
qz�7�|xA1���dav���9d�5xV�����Dj�d:~K(�/Fi2�lj�{���{�BQ&cV�\�
(O�""�h%Qs�CCbs�$�y�(8?R�[�H�-�ѯ�a��yх�de��L�=p8<
�Q��Qyi�<7	��7� M�տ
+!�V�t��Q?��A�
+�_Y�"�s��#�	�{�O(�� ͮy9�/��S_�"����i�/����l��(:
�������(�t�ʈ_�^�'�3иRs)q�{����n��7���,�|5/
�0���޿�\.A5�֜����Rz��W�Ae�-�=8����ğ�Q���|���c�k�ĉU�������l��d�endstream
+endobj
+1059 0 obj <<
+/Type /Page
+/Contents 1060 0 R
+/Resources 1058 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1064 0 R
+/Annots [ 1063 0 R ]
+>> endobj
+1063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1061 0 obj <<
+/D [1059 0 R /XYZ 90 757.9346 null]
+>> endobj
+1062 0 obj <<
+/D [1059 0 R /XYZ 90 285.0702 null]
+>> endobj
+1058 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1067 0 obj <<
+/Length 3326      
+/Filter /FlateDecode
+>>
+stream
+xڥ˒��>_1�p�v�$���&��qm��C���CACd)R���ק_ A
�٪�
4@w�ߚ�>��侊���~W�Yqߜ��� u���#�?�y�{�e��W��P��ӑN(�]�u�t�)R�*���~�Q�׶�x�~~�L���M��QäL�2ʒ�_������_.��i��տ���K| ���wiU���Ļ�����.S��tw�����ڰ�b���ãJwq���c�{xL�8z�4�<�}������Կ��>$e�
9>�<,O��q�ӿ������q�x�e���A�*ۥY����zH��a���4��Ɓ�z�!���;q6
�\�k��#/D1={�v���F��!�#���¹�;x�
���*XG^�Z���/�>��������^�qd5IvU��
��p�_
�̀�����
�̀1Y�4 /x�`?2��4��$h\
�NwW9dd�?
����1i���o?k����ix�1!N��ǓGO'�n�?�+A�}���}�
����3��C68�A��N� yo9�k#�g�D_t�^�Y
�A�
+iY� 80�Z�gS[�|&�
�s0<b?���q����2Q*!uRJ��y�����`�W
��@�zg�p�q��j"N���ƌ�f�#>�\��l�K;1�9��A���BFZ�|6x餕�S 1V�Q�Y=_�9d��%3�P�y�"���k�a�c]Ng���ӰXa`��u�`5�D���.O
���
���������R�7��	I�<�l��������}D
|�6 W�~��o�'�J���3��u���{P7sB;��,
�������z!�v˷�6���D
 [G�
�X�;r/������]����y��I�v��������t�w���-�O��W,gHi��%���צG���'^
M��h����Ys7H�Ѣ�E��R�R�R��3�y�4��ilq�{Xh�f4��ܙ%���F��JT=�v2�ar1S�1�U�����w��8��Co
���T
+/i&�
�sv"��1q�5O�`�Q�X(�n�
:�P0��r�@JNoћ�)ġ�S�^`�����`$�����-�5����{
+�l��9��+"��7�QE,��uiF�[7��h�i}s�+oC8mkFy��`m	�8홻mn�r���
+_��Y�ʶH���{�5T
�6ȗma���Vp6�:c�Β0��$}ȜMgI���n�ԙ
�Ң�a
�{�RQ����\X��
8c����l<���q
�\J�c�w'��������	�e�#d�9�D����0ü��@\
�Ź%?��L.'f!�6p��!�%p��˾�J$_ɥ�^[vA�����c#�k��Z���=�k�Hl�#�{þ�
�w��:m-n�H
�6�8z��cqzV�����dq��� �*��������N�uUK at bt�Jy��1L⏳�Z�ȷOָ�
!C�J����Xq㎼�
���A�%�1��51�s
+{rkN�R��ͨ0����ٗH�;�)�!̠�L�L��4s�H��j�G��N�q�v�XJe�u.��#��K'<��ۚ��;bM�Zd��,u�����M��D68���
+'
T���\�~s������'��<�ХӋ��n����?��|l�ڜ0=�7�6�JA>�wn���FQ\��LpY��)FC��$�����| ������ӈ%��
+���g�u�?�J�i\E��ee`+��Sqd&�h�I�K@�C����jB,W��
XX"�g]H]2h3}Nf�Hf�
u�$�9��;l�d�*Q^c�����r��ʜ
+H5nk-�h��U�)��<����Ni
 ����CQ�2��=%�8ʙy�p��}[H
+
\�tڗ�4퍣^=�K-��QD�O3L]�Y��S
�G`��`����H�K��I
FIY��],a>y<.Q"
���N`�����N������� �R
���S��#���T{R����K�ؠ���o�ũ3u��p�I�b����8�
���&�(��59Ł��o�1��g�k
N�p����Z�Hj�L
��맻	iQN��wd��Ht
�,#�g≙�W
+��@a�A�e,����jTJ��K��_�����*�׆g�Uk�k�!WIC�K���mȕҐ���#�ZS�Ʒ	E`�&	�`5ֱP�,�/��x?�#?�b{�F"0R�@�$0֡�2r�̓e�����j���—B9�:�B�H
t��Ӊ�T�TT��(A3������
~��x���
b��U��~Q���Ri�5L3״�(�Y�#g= �1�%(S)�c�s`�>̳
�Vk>ɇ�4]4��x��h�N�[���/�R-���S`7FU�.+1��.�
j��F*C�;�N
`�@ᄁ�����2H�
����j�����Qځ�x����W��ԈoP;)�<8���p������p��?jne���� ��bW�s��ȥPQ���
��qd ��I�yJ�N��	�3���v�q�!��遮�b�_*�M����f`��;0��y��j2�����

d� �_y�U_��D5)v,��*z�,h)g@]�VC�7X
gR�D�4, _��(BL�)+ʢ���Q���%_�c�o�=?ˑ*��\~;px�5or�5u�=�by

.�y}Q�� �
n�<��/{��{܍���8ӏ�m�O�CYxc/�ˑK����o�i�f�}ݴN׽\�g{op���N���TV�����

+\�`ɥ��}�ඳ�}g�
�O9�4��4�z
��s�H�B��nM�}
s�
�"o�e�"g
��&�w��8:�"��M�M�
x�ub�&,B�x��%��Y��ac�����n��7G�^".����[O�t (i���`
!�� a�k�ܜ~�]�
�d(H�"]��j��3���m܉\�'\q㴩�6C�O$7��U��
sp�D�Q毄@�,���PR�c5g���ܜy�g��u�$�,�cX+�K���{�ۦ��<��r
�8v^*��5f�K����h殶<_�r������L�?A��H�=���tQ�����
�

Yq��e�e�{BY��PZ/��R���x�
�SN1�� ��8Y�Q��Z~�}*)<|��S�G~Jb ���s9�X+�#���3ej0vޯ{�������y��!�}�K���������(w��J������j���%��o$�Gvj{���~训>��%���o�&?�o������
jV��1H�!�P{���ַ�Q�
� I�R�Տ�n��¬�������,�:o����o/�ˮwso�vg���s����,�w�ڧ�z�
�-+�g����\�rtY�i��
���j��-=�D����#?endstream
+endobj
+1066 0 obj <<
+/Type /Page
+/Contents 1067 0 R
+/Resources 1065 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1064 0 R
+/Annots [ 1072 0 R ]
+>> endobj
+1072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1068 0 obj <<
+/D [1066 0 R /XYZ 90 757.9346 null]
+>> endobj
+1069 0 obj <<
+/D [1066 0 R /XYZ 90 714.3182 null]
+>> endobj
+1070 0 obj <<
+/D [1066 0 R /XYZ 90 597.9986 null]
+>> endobj
+1071 0 obj <<
+/D [1066 0 R /XYZ 90 376.6021 null]
+>> endobj
+1065 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1075 0 obj <<
+/Length 3295      
+/Filter /FlateDecode
+>>
+stream
+xڥَ��}�b��
xzE�ʛx
;��&;x�������hS�ǝ�O]��
�b�`�YU"�b
T�� ��}�gIv(�8������	�?�)A? ��'���ݛ�ir_
�4L�O�B�I������]��`���_d��)[�|����x�NWM?60ɣ8�����ǟ�t�
oI�*����_
�k���yr�
�ࠊ"����0������?�:���DLT�!c��F� M"������4�M�r������<�$ޝc	��RNM?�e����0
q5��8���Wɮ�W�?�n�j@���f��^��|���Y�7�~2�}��h�lg�[v6M�/�f�$���3XljzP�P$�"��LX��
��K���%OoX*B!���ҟ
��ޱz;0�L7���֟� ,���X�#���l��愞�j'����]�\�i�*仦)ǡ��4��ش�هɊ�42�1e���!;�a
�?�@
Q��.���$;��Q���8GYp~�7դ����z:3�d��Cm h2e?�
5��0OM�����7�(�B
-73\ʧ=�5�V�떿 ]5��(�Z��+\ (��p��\�io<
��gYҾf�'Ê
X
@i�
�ZnA��8t
�Щ	s��4�nF���h4�V�`�
_yy��Y(�
��y0�?|�
:H
�ȗ
+:y(]��L���֧+ҁ(�-��d�x�󍇤bp5\�%��Iv�]l��.j�^���,
�^��#��
b0
�	A7CWN�*���(�OX�&N�4�8J�UH ���г
+��߀�-_>��}ݞ=m
���;-D��D����Q����N��4�+ at b�91��x^����}��u�P�#B�
�#[�
�z#Vz)��â
�B�^su6
�[i�.�*<�a&�	 2mZ����'����S[B��-j_R��$�ĭf�ә
���)�	z9�j�D`o��3��AT>�HYnK���p�「
�T]y��
+�g4�`��[��@���Ы݄�Y���%��!ALoI]���)i�)A.Soڮ�V�0"
೷��\AjF!!���|2Z�$�~ 
��Db�0�: �U6`�Ϻ:󐥆AW~Fz�e��P��p�

ECO
>���OfJއ��>�I�,��@0�rj`�[�j9��%32E!�;SN�k�
`���w��D�_�|-t��8��Y��
$��� ��6��
��A����ܱ��n���:
�1��!el �#!�!4�}
+�����
�"�:ڰ��}��B��3Fa3F��1�U�(6�k�W~J�+�S
+Y7�ve-��N���3�%E	�pW;��wd�qz��F��-6��oE	�(]����hU/ %$�z�(����g5tݖ���t
�O���Y���Vq[�@���#�X��"8 ��ᳺ����Ne�_�R�6�4K}��F�W�4���v
ɦa�Ͽ��N)�� ۬	����|+$6��h�#(��\� ��8�B ���Jy�C�nmk����K$��uw�~��tn��e`��aݜ/���e[��iu�5'C4�������M�
[$p(n�<
���FE|��W
�ʜ%
+��=
�����ƒ*��G�U�	
l�^��8�W��Yv������
O�2US�l��5�m���E(=
��K
�a6K8�#,2Pu�PjֲXZ2�>7l�� ���f��`�a�I�1����4bF���;�XL%�A�X�jb�W2�Z
+N,'&��s�
q����q��O.ca ><Sh�������zk0k
+9���͚U��ƛ���-
+��j�
U~n��8�#?'��&Ǔ,7�nn��o�yl�E�<�V�!��U��	�0���.

�wKc�l3�e}��Iު����TO1�̽&�I�Xd[;@S����)�������
R��r�a��o�J
+p-��>����f�{�T� ��QB�j�+*��dٓ|��\³1�fg��ܓ�޵)0�m�TcK������z2��> 8�Y䨹y�!Eoa�=�#��mY`�%H�Ͷ�l�� ��#�d�ulC�^������x��.��'�ar(s�CҮ���Eskz���n�]A*TӜ
�
+Xp��6M+�����bz�*B.�Y%_�"� ��@�D���hw:5������bnP�0�
G�	����K�钌S*�(
�+�T:�4��O/���M�@ps�	�:=.K�Q�����,n�ʽ��|��˲n����ª7��,n�R��L�Z��n!� bnk�q�+GcaU�g���
�)3>�
1"�*NA[R�~j�c_5v��8��r�f��"�S1B�oX�COM��#�e����d�PtKL%�
Y?��#���k&'�
6�[����*�
e�}��Y@�+�����D�˛�~��`b �@D��z��醞�
����
gm{��_oU�B�<gz�^�aGb��9P�a~:ۂ�
}3�=c`m ��u]�zוx��emۍ�su�b<˘�X��?����_�M 'h\���5�S�"/TE�pC�p�ѻ�
er8�"¨B@�
e<3���fpj�`�Aʞ�ό����&�9
� �:"���0�����O4,bAG�~P�~��  �1��
�����(
Bݎ�	�?^���(L�
����Wk0��Yy�)��0��=��:�v�>��um�'_��Q#
�SӍ��Z�ȸ��~_��"���8����w�$(��!���!
�\���l-����L��{H���_�!HI�w�ь��� �ߏ  ��%Ʋ�vv[�s��b��D y#
�7"�z#"�:
�U�ڵ�k�q�B�j���T> 1��$P���@M�R�n����q:\�SaLuņ{��$
�8��b�MG�Myq�j��h)fb�>� ��0rz&�:��r潸"0��7����l�������Q9�a��iX �c} �����n8�7��/�
���Z3���Մ
nw�̷�krW�n���=�^���T�a�5�����Y�
U9��vѮ��D�x���g�R������0��0�=��7��֡��FL����2���"1��Jײ�-e |���8���@
˗&�6@#�ĕq�g��_�$�!I��_��wU���׏_�<i~�T�����"�r�q�e¥t�dP��tR�|�+�֔�F8�҈��m2�#t�϶!�{������
o��V�ؼ�O�g�J������v�EX�ƒ��f)�D~�.��c�.y�����P����s����on����P�Y�%�=8�����!͂|���fT��I�& ��x���O�6X�/@�%^endstream
+endobj
+1074 0 obj <<
+/Type /Page
+/Contents 1075 0 R
+/Resources 1073 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1064 0 R
+/Annots [ 1080 0 R ]
+>> endobj
+1080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1076 0 obj <<
+/D [1074 0 R /XYZ 90 757.9346 null]
+>> endobj
+1077 0 obj <<
+/D [1074 0 R /XYZ 90 451.8258 null]
+>> endobj
+1078 0 obj <<
+/D [1074 0 R /XYZ 90 323.551 null]
+>> endobj
+1079 0 obj <<
+/D [1074 0 R /XYZ 90 219.1865 null]
+>> endobj
+1073 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1083 0 obj <<
+/Length 2878      
+/Filter /FlateDecode
+>>
+stream
+xڥ]s���=�·Ū���}2J�͂&'��1R��<
ﯿ��
���=U�|���
fT
+�ԁ�
lӖ
ݰ��J| ��Je�
�o�
w˫�{�
8�ci�`�,U65U,�H��F3�a�b ��"Li�|xO���Y�Y�d�#�Ї-�r��欛�[*n��?�Rk��+E֝�98�D�U���+C��Iz\���!�X�g���=6�څ��.+��
�0�5Kz�i<���@]��mXr_��O�
MS*Q[pY�U��3��74�Q�0��
<��m��R\��P��p��؅HJO�{��y��'�mO���*�1��98
�

�QU�1MU��Ct���6����6�`�G��F�-[�aA3��UEJ�8+N[lI�]x"�#j&33)�p�N*X"��9�^�6�l�K��C�Rl!Ʊ��
y��y�bh(FL��,��.���)��ж�.���`W$�=xtM��c�$�Չ'"(��c�ϩH>���m��c&�%�4qyH�M���Z�4�>8Fy
�4%�;�R�N7�"��
�T���Q
t�&e��ɮS+�:��aEf�ih+��T��
Y7
r�����፡j��8_��:T5E��x�|#���' ���c,���1��
�#iq��~]��%/q�'o�t�4�c����w�W���
���H�����h����:q��D}}t�]�Vh6�W/���r���x���$@��k^}o��)4G`�x~��%1=.fS���q<�ޢth
����
�C
��0�\7���xS���/���c������{`
�_���b��I7nB�{��>Ϳx��5�gI��Z#���w���dI
F{O(�^��'�����;,*�
+L����<{-���װ��}IжJ��P-a�%����G ���y3��˜ǽ���-��42;ᙬfc&?���E��4C-{�y�a	�`��_�)J���qd&�>B׌IU�UE*�(�4�O\���uN��En �
��y@���
+�O� re�i6W(
���vғy��;Yz/�5�y���`��v��P=Pr�F�ٌ��;����M�/���kcBم
�w)V�O�����j��?�Q����}t��J
0�>:K��$M~�����A4��S�G��"�
�V�H;�}��2%F�}H���
��6'���Ȅ�x�]Z�4��<�M|�ۨp[�h�6�Ro����Ff��-
��aq��
�S�^)I��H;�_�7&|*(�f7�-�x0���qr^�Υq��y����p���X� �NE>�s݀e5]�5������3\cR��N<��(�:��q�=mᅀs���KU�w
=��@��"pOK~ГV��s�>p����skDT��~j1#�"@�S1��W un�09�zGi����f
,��}_��t>�Q�I�^����ߝC�����&��_�]��S����?�9�ЩF�tnv���Gϟ�E��o�
KC�qz?��z��8>�~Ot� .JAo�3tT���EH���;`�
+����� "�^��h/�3
+��=��j�H�������A�%�
�%�P�"�/
}^�ދ�G9��X��;&�nض/��gN�O/�or�����T���T��g��O��}Rl�3R\���r���GB�
GT����.I[�V{IڜZb
+`�]|K�1/
�	×<d��t�W�3�}�x�<�{��%F���1&�;`T��Ң(/�t72T��
���cyM�V�-1ñY�M�*ie�
Ӕ��~/�� ��Ȑ��ᑅӝ�]^2�p]��
+�(���.e%K�x|/��P�}VQx����F�m��nIBEDDē�
#`K2�ʳ����Ǥ�� ����b��C��eI���t3�a�²<��g�d[���¸��a��݋p}m����_̳��\
�˗
�����7
?��'�=�K8��5
ҩ�_}AS�M���
Y
���
?v��c
�n��K�d�m
S���Mt���?�����8�����M�Y 
׭�\,�!Ѳ�~D�EYs
h����PX�^7�h|�aP�S��<g(t��(b,�����2yO�v^A�s�2�xVcu�;�1���WD�K�h�ĝ�'�Q	{>���.�e֏?�(�)bƔ���b`�q�D[ۯP�<czR�
+
�*��!\6���=>چ�#Y�VT��F4����g�%^f�ː�b�AUt�%ZU�P��D��ߏ�
�u��z�wun��xa��`,�
E����bv,0o0��
+
�&�hq�o	��v�?EKũ�	�8R��un��hz"6�B�+�
���{�
J>�4>��N���u�y�����)��!e�m��>����+��qXVj�CL��P���&�eq���I�<�y}��E|�N7���)�݊�䐄����Ȕhz�Pd�2�����������-��
m0��eؾT��9м64Pԏ�(l)Bh
�ɷ�e��󗒦Y�c�� hx/�
��
#s�
Ł.h<�󸬿���7�
�#0M���H�I��_|q-�j&�!L�;6��rl
��
Oq�RGp~�5�����B�dG5��
D����;�PeSu�P�[D�l9�=�H���}�W��S� h�h~m7C�n��Fx���͹���[ssw�$@E�i�q
M�c%��+���X!��c%���E�rs��z��2
�4�޿�8�U˴�����t�H�UGm��eɐ=#��V��U,a�	�
w��<=�)EX�B�a�&�2.��`�f��=L�O���ʾ�5��o9A
_�G�<U�z��j����f�MkE��g�?�E÷U�����x<�Q)�d_�Iu
�_��z
+$���ѻi�>��q��b�ʨ�K�
�˛��2@����SS��){T�/��X:endstream
+endobj
+1082 0 obj <<
+/Type /Page
+/Contents 1083 0 R
+/Resources 1081 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1064 0 R
+/Annots [ 1092 0 R ]
+>> endobj
+1092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1084 0 obj <<
+/D [1082 0 R /XYZ 90 757.9346 null]
+>> endobj
+1085 0 obj <<
+/D [1082 0 R /XYZ 90 640.5888 null]
+>> endobj
+1086 0 obj <<
+/D [1082 0 R /XYZ 90 500.3589 null]
+>> endobj
+1087 0 obj <<
+/D [1082 0 R /XYZ 90 348.1737 null]
+>> endobj
+1088 0 obj <<
+/D [1082 0 R /XYZ 90 235.7431 null]
+>> endobj
+1081 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F92 1091 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1095 0 obj <<
+/Length 2837      
+/Filter /FlateDecode
+>>
+stream
+xڥYQo�8~��e�q-�r�٧v���^���
�
��(�1����f��)�q���

+�EQE�1��O
0Q/	�h0[��� 9<<��q��bzrv�A�%��Ӆ�	OI!����`4��~�}��U9�Pk����6+]�i���H7�L�G~��a8�}����Q�uTA$P�?N~���A�_N|/Hb5�B��D����$����'�'�h�Ѐ�зU%���N1�5
+q�B�FE
&2��Hv����|ܪ�֣Y�۴tt�)�vǧD��)������;}̂��d�O7%��

�KT�X5~��ı3oָ.�	�ŎyZwT𺆏��x2�������vd>�<ns�c†
u�.��tY��LW�q�yV�e���������f�
�!��6�sj=3ϦҋM~�gEX�x�u=���iJ���oL=x8��~�ɉ����Я��V�Z�S
�L�zלq��_/>�

�_\�\O�5�M~t=��||����F�����秛s&�?=��=^z����Z�u�Y��W
��
]�l���s��|�:
���8/��:���m/��燱�A/jq��E�
���lH�
+%g�/�WV��3����H�33�����M�c�47���I�莛�ӹ�
S�
���2
+��pAÏa�֒4�}�Z�[��1nO96g �R�%��u��tv��n��b���,�
Wg]�‰ i�ѭs�
�_�s,
���uv�d+���؉��"b
+'�ye(���95�\v�J;�4#��[��<mf E�j��Э�񼣯���.M�n`)x�u�Ƙ����q���0���Q�D��a��x��ù���r��u��
+�F�C���Gt����n���P2�
�Vʳ�|�Llm���2�:-���A�Ӣ��u$�p�`�v�+3ן�
+
*���cq��l��|;,D^�$��k;�Z�9t��SJư�}�HPf/K��N?ۼi'
��^�L���)
���hX�+}M�
d��g�B�$9�od™Y�N�/
�n���7�'n�z�T�9Bs,ڹ��o�-������R�h�N�P���yA���V�
^޸��O�M��Q��+3]�>
+g�b�ᵨ~zg_�����
)�sK;�L��[��p�6p{�*�픾��Y��+b�u]L���#})J wg|��.i!�!G�O���2KkM|k��8��bV���T�ZW���0�DA��w(eÎ6�ś2V�&�$q>�q�@G���
z+�@�D��s�����%�~8$	aÞ2����tM�6�,00����ĵE:	x7�h@!E_��M� }���o�'P�ޘ�m$�dTN��)eh��l�$j at wu�٨c4�E�G
R���+�҇-��%at��_͖� L
~4tba�ew�H
y�&-d�^��h�7VC�l=��o��* �A��5��`g��`dO$&]�Z �����ڀ��^�z4ߡC���ߑ��bX��/& �N%n�fT��@��&1
+�>�m�/{QS�~��9�V�
+ʻ8���j�k��&��3
�ه�#��-�
+��J�
�:ɲ�:V� �
Kk`��	iߔ)���
��Hu��M��
�5� .��p��3S�M	���Y6%�e�$ LC�Pq���
惠� ��qw��"ދ�"�y
�)u��s	�#+4���d7G���v�*�d�*�I�
+���7@`�ź��֟Q
6���N �Z��Q�|�9�>��5KH��I[}��5�d<�}��~�1�"�l<.�l�x�h� �8
^/f� �
�k$6�H�
�25@��U��9���#t:�v��saC��(�˲��z��NI���;wJB	��$

+	��/o{3cܞr|ݏ%�q���,7�Y/wg��n
Wd���soY���T�AG��c��:V� 
KkUZ���
�HZ\�Ff��
�O�����w
�|���@EV�?!-��1�*<�Q��`���c��.�2C��"H~��hs����n�`���
+�ĩՏJ�~,�.f���I�*��{���{@���N�ʍ)�|a�������%  �H at E�<=���z��˝)�a9 at A�y�s�~��Ҕ]��a�M��� Q��qk����9�o�yś-��%s/1�EЉ��Ȫ��f��{�����|�5
�.Ͽ^�\�;�QƔ!�
d��;����ea܊�!㐓D���}쥎XlR���S�U��~6�;�,�/=6�"�Ma�lFIA�	��R�ْz���Зs��$�O�8 ���I�Hd�ĹY}BP6�� 5��Mɜz�r��u Ss�p��Ж�X�û�����2s$��f	�� �s&*^�׽��䟕��fGy�Gͫ���t9���vT����0�� �d���ٴ��hđ�I�Cl%�!��9x�)��x��|��
3��q�z�T�q�b�
t�i'��Z�&"/�pѬl͆�甠�v��?�4h�
6�5�P5�I�i��I�nR�
+�
��,%���֔���{�� Uo�G/2�(���W0���C�es"X���j�^�p�� �:[�J��E1�&�D�$�1�K;>
ō�õ�D���	�զb����t����ı
 ���
�0��H�±Q��+
�V�P�_�4
+^
P
+��q�GJ�� 
r��
+d䌄L�J��mR�;O쭃�k�x5����(�4e+;L�֓K������gA﯁>t�������z��D$�
�"/�1���>W���x�)���5�n��e� �y�y�0м�@���
+�F
¡u��@U��� @�t�x\C�S
qh��P��0n�p�i��#�
L<��M��K/�Ϡ�9���T W��7LG�
�?�M��@�Ƒ�t;���ȏ�g�
U�QR
<endstream
+endobj
+1094 0 obj <<
+/Type /Page
+/Contents 1095 0 R
+/Resources 1093 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1064 0 R
+/Annots [ 1097 0 R 1098 0 R 1099 0 R 1101 0 R ]
+>> endobj
+1097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [314.9562 612.7123 472.9634 621.8196]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.gnu.org/licenses/)>>
+>> endobj
+1098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [152.0867 402.8929 321.4516 413.1741]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.gnu.org/licenses/)>>
+>> endobj
+1099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [225.5616 348.7803 508.5005 359.6842]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.gnu.org/philosophy/why-not-lgpl.html)>>
+>> endobj
+1101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1096 0 obj <<
+/D [1094 0 R /XYZ 90 757.9346 null]
+>> endobj
+70 0 obj <<
+/D [1094 0 R /XYZ 90 334.0855 null]
+>> endobj
+1100 0 obj <<
+/D [1094 0 R /XYZ 90 302.157 null]
+>> endobj
+392 0 obj <<
+/D [1094 0 R /XYZ 90 302.157 null]
+>> endobj
+1093 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F92 1091 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1104 0 obj <<
+/Length 3765      
+/Filter /FlateDecode
+>>
+stream
+xڥ�r���_��K�KˋH��������i�&y�H�B�"^�_�s	Qtۙ�gL��� 88w(���/�N��m�]��&��NW��#�?\2���������$�N�i&����8
���g/Z����>|���e�����*�O��Tg��AM���?��M���ừw�&d�q���߮~�տ�a��]��(���O���A��ק�M�Nqu�ׁЄ���A4s�8��5��~Gtֿ/w�;�v�wT���~_���5��ι�
M˭���1%�&׍`V������J0N��U�N��F˄�:tO���T�o��M�z{����<&�
X�
+�u����:�u��N
+�^.��
<��o`�$���n��F��
��ȹ�U'ͭ'�
y<�a&2�w���A�Q���$�q��:�Au�G`���(hgg]����5���c�ӹ`B��0\V

+s2
^.M�^ZB��g�"�dJ�/��j�]'� X�,
h���-
�U����ܑ�~\ư���-r.�:�����Yǝ��:�<D���Qפc�����=�\�
X�hc�Ύ��+�7�
��F� � 	�h�,�g�f�VE��
�d9!��t���}SWg�߲�>폥��nt��5�?�r���:	7�M Rs���ǻ7���>�=��dn?�S����织��?�3�3S2!��<���u�v����h!� �A0�����+�ã���8eksAB�?	i�d�i��`\���Bet���
-T���˪7�ܘ�#���;VY<��V=��#�\E ���j���
�l/����R��D�IW�S�0�xG�"����#�ՠ�t>��*��lX�Y�9�{29��0a�輪�Wl�] 6���
m�.���o�7dUk'��d���7�-{�Lܲ�P�07H��~
���
<�mJ`��O@��܉�_/n�uQ-��NbO`�8(&�6
+
������AZJ���
;�|��<��^

Y/\�
�φ(c i��]a�����0��H����$1&e����s�/�?Q���
p��`d��;n3��Q
�:���g;�j�囿�NUn�<LF��B>Y��o\���8�J�5���4�S3�Z�~��

�
hN�������^�
�u�h�Op�_|?$.Ɓ�7�X�`�:
��
<��."9���9���,����Yb�`�w�q,��z�
Ն,��2|"�5{���͹��0�!lȔU;r��+�ځUi
QC�G6xP�nf{�ثG�ϣ ��\5�܇n���
�|J�r��58_��b���� �WCT �V���k�
Ǡ1���JZ��h�
�dE?k5[���K�
��3�V
4���4!'p�hj�M�X�!8A{�}�::Ҿ;V
���������!b��D at Pˆ6���_�د���؛Б�'c�����)edt�⡎��_ at H]c�@���Dn­��aƚr:��0��0�)����p��
$�����|��P�9������j:�(���E
 1�):=j�g2\9
+�v�+��?�(M(�a���-��	
�Ț�?s�6‰�� ��v`=
�I��"���"��jLF�|��PY���
�4�v?�u
��ވ7�Ѱ$1˷�[\|F&�1M(n������ �����
+>� ��@����* ��x���%$��>��7bv	��\n��8�(�(��u�
�R�AL���;f�AD�9ܓ4���
+�N(q�|�:�<g���;�c�)�Yh�vm�����E��&
��pc
*@!Hn-��
S
���D�
�(����y�gQ�x8�b���P%K�`����(4��I��
�wl
�r���HBH���^#d�tI0V
��7�#m������F� .n�T?x)v
�N싄�,n��n*n�\;b�k��{G�Fl	֣�EBa0¹� 
H/ʎCF@c����F������
6D)�(�r{D�nB��x�
�=,��ێ�`�R��sp�
7kն�H1��B�����?��E	�+ �S���v�$ �}����)s�%@^��w��zFN�
�5�=�ɔ�{�H�L������h�d#7�i�e���q��>/�R
C�Y�W6*�Zi�g�x��
��j�s�$�dHZ=�W�.�
�����-�y��%�0��!����kC��ő�X� �c:��&%��� dҫF�\�
m�#��\�N��4RK�
p�ڲcB[�X��,��g.�u�$Xg��_)1��c$\�vp�B�D
/6
u��
w8S���V�d ���Iqa-���sӲ�N��z>
+-·�F�)��
���	�,a����=
�����Mǡz(
 1��М�\�\J�_.��֐�P>a��p�.	`�:�K�Z��5�!�i8	F8[�bϸF,�[���ڄ.A��C�
�a���5���{] �M�pY�ָT��0�1%:�>O
G
+�$U
�T/" ��j��-�Zߣ�g��j3/�2pܻ
1X��M&������Qc���n'h�r�L���+���>��P����;
� �3
Gͅ�

�yR�׾�(Ηr0q�b�1�S�#9+��58�R
l��P�hX�u�4/b�r���������� ,��	zf�rm�
�4��D*�/�F�O���f`���O�$c��P��?&ûGb���[�(
��p�Y'u�z[>�U
+8�D^ٲ�u5�Y`xיq".
$8�-�,���}1�ü�C�j�+|�:~�ʿ�uT���8
�Q*D	�)��'I�!��z��o���"��Q���uæ<T�"�ߌ���m rœD6*m�q���ç�
�������K���î�x��
s��o)΋��
 �
+H����
����%`�z�>|���{_ Ƹ��u�TR����{�Ϸf��?����5
�z8�x��YʶtP �ړ�
{�8��5����8�|� ��߼�%ӜǾ��a� O��6�����lS�u�j5%�o��Dkl<&k���RU�KLc�=�f�n1
�`8�m[I-Ê�䫈Y�p������4��
�
Uؑ:���NU��F)PJi�ܕHdE�	w�"��“Ж�1�d\�0�%�$4�d2�
��$ `�y�ٙ{�"�rX��p���+GX�;*�
 ƗSA�����G�16�XK���1 �
�R`}������Gc��U�W�*`�H����kuq�JW]����E���g�-x�~���u�
+��`ʍo��,'�3�/l
+�Oz����lR�M�q�> >�� ��J��m�	�:��M0�,#�Y���j�o��K�㻯��9�Q���d�9nb;x�t�
r�s:��r1 $�n}�	J:�s� W8���O"�{s�W �̓�?"H�� �� ض�����0
&#,3��ua�Pޏ�&hK����|pڋ��c��
8U������𪖌8�,ޕ�-
+�����
ܣ�
~䱇H���X��: h#hs2���g?M{�Д2�hd-�
D�d�
��f�'�+F`��d �ƣf��ʋ�K�D�
+J-�����e
:��y_L����;��PC���>��giq���h��d�u��8��~�F?�Kv�m��/Ғu��v�4����p�~��K�*���N�eӾw�{?��qE����c�#E�����݇[L��)���'�m����K<��ڶ�2
v��rf��Α/����]W������:k� �u�6ݫ�.^M����un��t{��b/g����:�����

�T�j�)��R�8���pf+���JYendstream
+endobj
+1103 0 obj <<
+/Type /Page
+/Contents 1104 0 R
+/Resources 1102 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1064 0 R
+/Annots [ 1106 0 R ]
+>> endobj
+1106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1105 0 obj <<
+/D [1103 0 R /XYZ 90 757.9346 null]
+>> endobj
+1102 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1109 0 obj <<
+/Length 3732      
+/Filter /FlateDecode
+>>
+stream
+xڥks�6���_N���I�[�4�{m�^����~�H��"U>��})��̍=#`�X`�‚����λN�t�
��:?]y�� ��ʗ�
�o\�7wW/�%��n�K����@~p}W��
+כ �V߼���ڵ������&N��U_65��/s]w8�xa�����w�]}}g7!{����-�q����u{���ۆ�,�~����w���t��TW?]�h�� MXb5��^�`�kn�$�W�βUw�y�����u.�A�V'�-ۭNk�È.��U����:�W/ �KWݐy����u��f�J������[]�9�S`����h��"�<�ō�owq��Λv�	c��m��M�x��͋��&	���:�V
�����t�e��+�S��4��p\e_��7�e��`䁝����c3�"��(�3�FS�wҪ�
�`�OYcl�I���ʥ�g<�xz�v��}��� �y�e}�ݾ��c)�
+��\�Hkk�N�IE��ݑ���}��W�
.�
+����U۪���e�W�<�c@�Q��2���c!�nz0
>
KR
hv`^�k�AG�q�9�M�n����=�%S_�LGƶpi�
@������
+n�Z��3H=��^�EN2�dh�0��-�Lf� "\�XR��:�ViN�j��[��*�(��5@ڢ�B�O����oXy�Z�� %�q��k at P-7�H5WF�c���"��S���Dj@�Y`訐#c���FM��@S�~�ZG%�(�>�S9�mp���GVg��{j"n��YT�v��2 at u����?ެCo�z��Ww�?0��>|�t��&3q�3������
�dUa��6��`
L�"��oK9w̓�^`�q/ FU��,��u8�O��`�K9Y�ʛ�N^���FFꦞ
�[_8�s��B_J��,1F
+�D� ��
^
0���`
�����32��N��Љ��Fe-
�[��z�3&l^;u
���`���S/y
G�^���V�Ő#��'�#BUqX*i�!ٔ���@���(d
���y	���3H��p���55�m�ʍY��d��TvK�f�}A�
�1���w!��!I �Ώ5x�J0�ꆖ�	=�& 5{P�!���O�
��mS	
:J��ZI�����0�,���1b
F
����Є��_}F"�����;�*�E�f�o9=�H(�i&�P
%"i����3
�
b5� ����/?��^6q0��
����u4r����R���
T��p'9��$N��1a��"'9t�?UՉg=4���
U�1�IY/$(�bn���J�6Y����[[��P�����҅
a�`2#�g/E�bM
/vr
��d*��ϕ2��L�`&C	&$������#���k�X^������\��C����Р=vG�eM�bǚ �!�H�fpRL��Ƞ�)�O'�+�h�V%�v�{#�9�2˸��0�:�F�b
����5�|�{!N�N.�L.7��[C����&R'���V�1�춠���F�[��d�N�d%����@
���>�uGp�l!Q0��IЄV)ԣ�EE�*��jIa*sX'y�rq)19Nfa��/B�V-#LX|���]
>z3��
�A���' �N&�y.�2�a�z����U>[A�V#�)h�a.�����G��b*b�b�Y|��b�C���	lv�
+� ��@�|�����p��R��V˙�/�`L��1
$pbwG��x7��
+F�
h��k0{;{��Zt]�ч�$@eF�V�ȭ!����N@��H ̈R�������
�J��
Hcm�yn����ؔ���$��{p�x *�A�
ػ<�Tb/��k�&���
���EH������G�P2��(8�h4Ɛ�c8X5�ՠe 8��s�'u�	]9-lR�vǜ{yh
40�������4�v9&�V�/�j��A퍌���2'�
�����	,�!/��
mA l��ƕp��	$q†��`{f8�o�H�i����j �l��
�/VCz���ZC����
��*�}
��֑N�	��ֲ
�<K�PbO-*��^�\����U��
+v�qv��~�
=��\�4�����=��eoҦx����\
+A�"�{��q��ɾC��T$�v�WZ@�pV
���dE�qFʈ��� ������8w@�a��J|�H
0�<�m�G`]���o/p���ت�;�ꑘ<߹�	��d���j�
��������#�@�-c��yf�Y�
��T@A��%N�œ�Ժ���aև�wc�@�
Q��-��a�O	p�u�[r� u(m��
��is��:��Su
��-�
+���U����24!Uc�S]��`��j��ɛ�����Tsd�ũ2�X�IX=M�c���@��V�)&�$�ȅ	s[N��3Ʊ��Dr�cc�1�����,���x4/&sb{��I�
P��8
=�C!�
9t��|�J�΍S,ͽ�Ț�cF�X��/٨�q��B3��
+�
+,j[�OL�:���
�.	3����.X`��(%��q&�uCb�z%5��"��wfn�
g7�F��pW�K\	��A�W�I`fSk�=B��-u�s4i
Ͱ ښtи(P��cVș�
+ F0�\�HcWm�f��,zD��u/�����Wee/�
+��x�9���Gh��=
'r�E~�%a��� �Xh���cA<��Z	"f�d��P��T.P�
4�@�ɦ���ɼ���I�|̢|m�ŧ6An�K�_ҟi��͋��˱Ve�z��0���t�S���A$�ĢNXx9c&h�\{��aϞF�B�$�*��޾��J����������$I5�ȭ���D�Ut����=�G ����I� &#S��ܲ;�Mi*2�"J�)��T��v.�ݼ~f��{hJ���Do���h3.�	�П�
�O�qA�e��]��q��r���
њ��
�Kl��IJIoU��$F��h��	��ɐu���|:
p!�ҺVe�ݓl�:�$�\k��'|��M�8�ߓ%6]��j�N�m���`nk�����x��[�ζ��1��Z��}��W
_4�q�_4dO~u�"\~��{�6
+�h���-��Z���8|~E�u����~��yI2]��v����6
v�G����%�?��y��w?�!�{�ѵ�<Q�%�ԋ
+B�Y�+�
��z����q-Tj���
���^b_�$�
��]{��po�����2�b��W� L�C�R�|��'Ft��웇}@�[4�V�I�VH?H�2o��,���x�T����� �����z�B�n9�UP�XC��֩S��>�
J�����cD8VnB���/#O����� :wS��9M[B�MW),95D�
1�Z���"^�	�8��nOeי�A����p�<�]����?���Vt,|�����	
�h'�}I��r��+wZb��5&N6��QRH�	�p��
�B-�{���0֕{.~�>����=����ʱ<���5`bfZ�;�o�&��n%d����p� =�c��^�wZ�4*� ;o��pUl���$��%�\��}2S����3L2
+��z��>S�x���p�8��O�����T=ɶ���]MO��4��:���*0/V��$��cS=
u�*��ɾU�z�.�}��h�j[�CzaͰU|J������'}!� KA|*%
�|mZ��6�
6��a��.}����W/_><<l�n;��ݖ���z9�W�y`�i���m,��^&⏼`��^6���\S�M�R
 �T�����Ʌ����G�endstream
+endobj
+1108 0 obj <<
+/Type /Page
+/Contents 1109 0 R
+/Resources 1107 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1112 0 R
+/Annots [ 1111 0 R ]
+>> endobj
+1111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1110 0 obj <<
+/D [1108 0 R /XYZ 90 757.9346 null]
+>> endobj
+1107 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1115 0 obj <<
+/Length 3476      
+/Filter /FlateDecode
+>>
+stream
+xڥM����~ś�T�Yk%�=%��d�l��}i��� [���Hr^�__� %J��C��H� �/����?f�c%n������=>��>�� ߚ_?=�yG����"~|:�bߍ�/
��_�`���|��/�x�n�ԑ�zo���$�>�˦��˽�;��^9a������wO�&x�Q���?
~��{,`��?xn����
t<��2�xzE�;��燿�@M�
5��Y#a���C7���1���Q�N�ϴ�"t~�"/�*�4�/��綬��9gx~�M۽�^(�r���cγr#"�E���y��yAn�ȑ@�WKΥ�d�it��+�ZY�
ٍ�ksa
+ms��e� �l}�͢�W�l����xP�"�8�]?
�E-2,��b7
�p\i�&D4��{0K �W)X�t'�;HtB�u����'!��B�
*�:���O�㲯�{Ο�
��Oz�a:_vU�
Q�V�Ǧ(Q철�?6��;���B��!T��5�ȱJ/�]e�6�DX��F�/�5����t�g�}��c� �s�,�O��dK7����v¸}s���sm��cϢkz0X݂t�-�29�� .�2�
�5&k��L^�h0yNw��&�w

�C�߯
+�P�w�X	O8���6` �� `�]"�R�д4�TKC'V���
�_�;�+�����I$hz�L6�B��*��wC/��e ��K�ݗ�EC^s�
�2�3�p+<�:��ڇz_]
+��$���t�
+��!����bf�1�al�U�1W�*���`58��x.�+�����n�i�,�S�u6 
�^j���Ί���"#��3�)�f�F.u��f΂ÞP�������
�8p�C
+`U=�
�{�Vwl��f�L�)�..����ob����
­t�X�+z9����U��^�е���V���*L��Nq0�1�idԭ�0"�60x�(�p;
�pP	�>ԛЃ(
+؞��R����^�@��

+��M�;���I<G]�єX�V͚˧�hnY/x����f�3�vpHVE�7S��(š�h����F�P�9�E1�~��%�S��Μy��
+�������ﲛd#Vv����
�k��h�ٹF�`��;M�l���4�R�
”t
�
�$λ��X� Ы��v5��&"���B�4�0�Q��B@^�4�r�€Z��w��$�
D�
����hr��(��8dG2o�p�����,
@��i�
�.���H=��.'�@
����|G�
�Iv?!2$�f�>8Ls�᤭‡��T
ւ��a�!��LF�D�EB~��۷REtjjIȣ\`t�90
��
G�ylI=����Q��M���Ƙ�#X�A0:㮚YH�"6̔
���9�8J��TS5x%RE
)d�o�
G1îS,2�"F��<�f��-�[IASs��ppY�=A��%O�e�e"�����Z�8���v�5���b~�A3^�_��z�Z�/���
�Cm(� y��'�BL�2U8�@�!�
+He=Y�3�A	g1����Zx���
�+#�c�4����
��
�\u���/0���%��4���l�`�*��4�ue''�ČM��
�v�̀��^ M=b4&�k��
Nu�XB> �Վ���Rg�w�j�xS�)
!�z:J:I��+�����L�'�V��db�<vr_/,��JU�Ƶ���*	€�6˅�LĴ�9"�P%I��=p<
��
,xjO���x�
��v���$P�zeIp�f�h�:Y
TJ'oy�0��@�WB\e;޽��!Y6m\Xi�A��r�п�a
�@����P�)�_3s�u�ʭ�3�܌肍3����F�`��#S���x0T�IF׎�ѵ#��W�/5e�0�����+��k�z
)?�s��D��S��o
���ƕ��x��n^��3LT�+e&�^ș�V=h��(�&���f����ʽ�L�E)_��|4G�EB��u�
��Wlhn�M��䛆��9y�ϣGoeiU� N� ��Em6V�y@��ϫG���k��	�T:������
2�аd�A��:")h�2
`��9!B�' ��&g-z��M0Q��~��[�g����l�r�
fN��`
��@���,cH؎ɾ�c�,Ƽ��~��v&}c�sm
b7�W^pL�5m�h��m���ms�
�f��hնЅ���oe%U%:�L����a?���]]@��v�E;�/ʒ�2�T��

�wL��rE�{%���<m���/fV�z�a�,TaM��P�(B��]�I���P����ۆc����V��4Cg3v�C^
�;����;Udȋ���H�1\��ǂ�93�[
+"
�}?�9�=���q�;mIԱ&Ҷ�)�N����Q7Y� |E����ȍ�����$�����9o�����&E3
+�U�#o�n_��	.[� ]KSܠ�	�
����+��Y��d��#��zC%	;�B��)��+
+N�Dž���|�uA�D
c|l�q�+�JW�d
Ё�.��:tiY{��
P���TY�Taast��(�\L��]
+†�WE����ȕ���	Z�Y;�K&�s��*6'n�c��l�NMQ��Β0vF���"�
����`*�'Ԇ�p��p���ȸ �0��
'�6���@ 
+&S��B:yQ�8�5֙�R��\� `�(m���{:

?�O��Mǎ�
 �G��gwH����jkp�DH�ș�Ι�A^l��hv��̊��U��Đ(УKYh4�f&�:�Q�q$�
�#�Ui���IHU-6)�zἜ
#�+�k���
`pV�Lg����O~:SEԧZ��!�?
��R�
]4�ӈ�02Ԓ��XOM�۔�7�����5��8��]��*����y������\7�Pe�Ă����Z��l
��C	�ZqO�B����@(݂�9�:��)���Qg��
C0���`\�):^�����^�������?�l��
ƹƖ�Z��-���݆�j�J��!K�ݓ��S�dt��.L
�n��{�!���<qHE;��\!�O��m���uueZ���ځEc���ɮh�������2Ϻ��"�
#�9�����6�Bl���q1y
/:.WH=���
���q��!B, ���>�I�
+W���,����U+��J�1NQ ���^��iF�GˑD�t�1��dz�"�T{+��,�=�x��A6
�wW���
�����5j�$� �%�f�%B0Hy56�=?ܤ�8�a�1�<�j�i8N�@��%�~�r���`�����TM�H���D=3�MU�O
���G�$�3� ��:�Pf��W
�fU[�;�!f1-m����E�5� ~��(��>䥏�R7��^�n�)��7�\}�;�w�����SS]��hs���kU��_ �0����ח��Ļ}Sdž�z�X����볔s��4qCf7�A�<���a�	[c�M�q�u��Ǿ?��͛��w߹��<�nٿ9��7�}���Y�Io; ��e���n�x�d/]�:5��U���TnM^�sl�V�^���endstream
+endobj
+1114 0 obj <<
+/Type /Page
+/Contents 1115 0 R
+/Resources 1113 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1112 0 R
+/Annots [ 1117 0 R ]
+>> endobj
+1117 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1116 0 obj <<
+/D [1114 0 R /XYZ 90 757.9346 null]
+>> endobj
+1113 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1120 0 obj <<
+/Length 3184      
+/Filter /FlateDecode
+>>
+stream
+xڥ]sܶ�]��F/��Dg�l�
Kv��Rj���$y���5?�/W���b HQ�;
͈�r�X�7�����\��8��a��v͙X=�ݙϯ/����������$^�<	���ASH�M
��j[��� ޻�O4xۯ�̫*�]v�cS�C1Ȯ%�{��Z���^�����tv��L0�q���—����x��Ll�<�W'�������9���L곻�X:�B/X:j�
g���Y�p#�8�g��5ہW
�}��.b���@�+ڒ�
���T�j�x�!����ʎ�m7����T4rd�{�r
�ޟk?��ޡ���v�yT��Tɞw)�J��A�����ׇ|�zR�>�NO4�p����Y(U���l5��ڲ�U��D�^�"���+��BUI��}���
�A6gf�L��$�"�t�Y_�����~������
���O�n�wDa���������k
+�K�ޮk�e[�Gq�s�Þ�
`�4,EN_�U�����-

+PX���
�2A1��~��PZ-\P���A�jG~����P��l�5���Q.!$�l���
zZ.KB
+��b��J���Dz""�}
+
�H
��Tׄ��1A�nב 6�΋^^L�J�@-�~���a�""���h#����FM`�.<g���Ga0H�7��
,��`�l�
LY_�2d�"�\�t8�>���-���.��Tj�Am�L ���{�iL�t�#�+��}�k�b�Q��
]g���
찗R��B6`
˺�'7V��{�9g�Y[x��x�&��BN�-��|b�=�y`�8OfB1k�� 5�mA,�s�.��VE

+�q!�#ᄁg_
�b�}f'���N��
J��5c�S$�+��M צ�3Va#�8[�( ;d(!�

�HO�֎�ׁ���K��[< ;�C��
�6�g<EE3�N8�C�C
+�W�=��юLP�ɱ�_�zQ@�`EY��x<�6�Ȕ�-��\I&y(��=X5�K�X��$� N�VjvI�؀3���B�d��s
+�q�
3�$���v(�S�9�,��V�sA��\�=6��O�M�G�&;���Y����1����
�˪ -�i�����$��C 
��:�BՔ��\����C�wɌ@��M4(�<樗a\����$�7
+|y< �Z-��p�at��9M�3cC 02鎊 �Q��p����� J8F��(�:�D7�yfAsè���x��=od-Vތ�띱]�=�jN�O�m3�Sߩ�A8�av~Y����s.�r
0X]0*����į��Sm����Ll)���՛����
Q�}�?�ἨL#.*!�84�y����~��U�S���8���)B�Jk2)נ sk�4rkP���I�јF�	+�<19�&�
|K�%]HdyD#Ǘ��$
#��@*Zao3F�q���ѝ��{�t8*�a-o������wQf7]�.�-�9'�P8��Ep���m��"8�k���Em��G
`q��?�N2�ʄH�4�B�
|�1<��yXR𤔋(�B�s�É�֩�
�J�@-�]���
+�m<������
}��MA�%
��Ê��k���(�j 2�v$.�K.g*–���"u}�����= �f�Smñ9��@�|��ȍ��-T#�u�w�"�
+���d
��&r3�1�p����
�,B#��_܇y��E��r�¨�(
�y\�#��L̬���c��<n.
��p�O9�ƚ�ݻ�W�^���1�m�z�#�7�W�\��������ۏ?Í�5�^�O�6
��uĬ8�f]o�L ̉;1��+��"�S T���[�=�(Z
�ȵ^ẩ�}�G-�:��Pc�'�
z�����G}|

_c!Q<VSG��`���`X�S
\,�~5IF</

k�s�Kޚ������@ �I��m-x'G�̸P�4
+o�O��:k�q�,��:zֲ���� l�&�fJ�6�q�h�}��n
7e�뙅{M�ky�9��-���V�ɬA����iN�?�l��}��if�	�L�*�	ʋ���s��:3!&srb��6w���Ё�� #1����\�
l��0�W�%�/ݞ�^a�6��G��u�KN��Ƴ{ɥΞ�D��T0x���zmש0�� }��({n�"�c2c&!=���$c���k�	�[+�"�%i9�
sK��
�#
�[

��C.��c�"��`����}Q?0�� U��L�hKf'b�ڝ�������h�|K�&�5��u���%�� 眆�
Y�*�a
4�xl�
� �ΰ=,���UX��]+w<C����PH
+�g���Ģ]*�K����
���-��I��<�o}�
�*��ִ
��1��g<O����]G<�����
�FƧ�~|}s�~,3��f�]�����y&W#AW7�0T�	*
��Y�
��P؆��d
�AO�ypa���M��5
�ռ F^�t�,��p�Q��s
+
�[��!����H�d��>�� ]D w�M�n�26%�O�w
y���]z�a��f�b.������5v��%�y`4p|��7�P�M8��2�<~�����_�����q�~���>�ͧ�'K���b
�6�O:��䃍��ʉ��
.��r�
zD�M09�^"FY �`�?�s��i��q���R{�|1ˌ}� �>������v
�u������.�;d���K�^9��E��H��
T��Ca4�$HF��f�uw`����U�AE�S���+��v�y��S֔���
+�	����sC�w�<�
+��+�
+R����r�p�t=�6�g&��OTN;{ڃ�I�~0�dc���>=���
s�V�xX��ȿ`�.3b�
$!i�&��3��_,A�#2��+r�k��o���S3W� uz� }�;
��Iw�aZ��t�nwuk�5�6�_
"����y�g�J�<��"�?R%;<
�ӝ�Ys��T����0�v���L��*��TW?\�`b�T����&������O����
��AN�mR?��ߨ$�<
3���ab���G�}S𴫟�U��G8PQ�,�O�'SM��b��晹�
=HQO,�����'�R0ߟJ��~^����a�
g�)u���.
|?
���zu:�6;�9���o��
+�G��|EBl� 
���
�􌗉�#l�Td^�Oe��X�l�f�^���DZ`�D�1iendstream
+endobj
+1119 0 obj <<
+/Type /Page
+/Contents 1120 0 R
+/Resources 1118 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1112 0 R
+/Annots [ 1122 0 R ]
+>> endobj
+1122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1121 0 obj <<
+/D [1119 0 R /XYZ 90 757.9346 null]
+>> endobj
+1118 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1125 0 obj <<
+/Length 2818      
+/Filter /FlateDecode
+>>
+stream
+xڽ�r7�]_��CvXe��>�O>d�Y�X�NU*I� H�f��!����Fs��y�r�t7����������E�f�z�b�_X�=��]���jL�jsq�6��N�����6}�v���[�
�2��^ڑ����	�nӦ]���q�ٮi��{�%1B/n6��R,�
l����_~�	���e�q�/�`b�v
;���s\5�.�.���!�X�;�o������xH�����m[F���B����Q�-A�e���2�
+��L�� ��{��-/.)ʚ'��:}X:�ѵ�8�N�7��y!��K�7���%2֌�U͛&;��K>��0@v��ctE�ka��m������!���ф��r偤/
duDT`� [MT�my�� �-	8Ӆk�S]�p�A�����\��@�
+�����e�ȭX��)Ͳ��SYז9k�-�PUn`-��`bC?6�eW�N���!()��IM�5RS�F��r���ǿ��1X�Y��QhT�nS.>
J
�OԴQͷ<
X$DZ�ŒUY�NFҢső���
F�8"u��	pt�̀BgL�
��|������aC���6%������M�n{ \��<gi�sL��\�넀>�#���[P>,��'\
���yb�m��
���������������;�~zK���k	�]���xwC�'�a�~#����5���+w���UX�
��ʂ�(� ��xh-�=��Ḡ�i#T
�һ��ТrGJ
 x���\(@�ao~�Υ9�3͹
�
+��4�~�Z�qG��
&�\H at K��уdؤy���&����:m�I��A��$G�Й�U�چ�
�&�� �
+�㳝޲T�&ľ�,I0��d8
L �>d<�(�[�_�K�E#
��y�s��
B�^v`Z�/K0�_�ѿ��կX��PQGny�Orh����������Y��+H&nj�ګ�l�����3�f��:�g&��P
����*&�P�a�JP�Ǧ% z��z �>u�Ddd�ݏRgA
a���ž�8K1!i7)�����A̕��zG�~�Q�Mŷ鯖��Fѱ�FLT"�m;���i?��� @�y�8�(_#���lX_�a�A
+�O^J�
+Ҧ�B�,Bi+
����$D���j��ibgWf�B��H�/E�!�j�A�$iKi<�-���Q��x��P3#��M B�E�xB;0Q��-T�`�k��y�;���B�ԯ�o����ֱ���4�ٮ��G’J @	GӪ!p���>	+�O:�$θI��¾0�%:�
'b�O��T	P�}*.�׷
}(�
W��L���
ʒ�
+pN���
��nI��T��j����~F�E�ܝ� d��D�{���)\�^(@��d-Pբg�U���G5Xؿ�aU�8�I'g��a��7
�w$�l��
ֻX���-�;n���B]А:n��a0k� �E�墰z6��m�%|ªo��Lx������(�=ֳfr�d���k����T8M.TsI
� ˲]��g6V?�L�a��5�x'R�M0m39�؞_�+e䛖
�
�sM?��q�<)��x5�V�;3
��v
�	�x`�'
�Z�,�(�l��m�?߼�����~!��/?ܘ�-P#pEf��Go(��}�5+D��f��6�
��L\�p��B?Ʊ���҃�؛W#�����Q
�#Mp����3�f�,������T���m::9�	X!ŗ��������Ӈ�L�A.�gD��>��S��:",����#��Z#�}Ƿ�.��R��ˢ]�.���g���돩_���X#�XjJz9����i�=27$j6[��)h6��Jt�\�O��45�s���4�~D!DS�)�q��
��^�1�( xd ��R�xYQ5
�6��0�� ���pR����
j^elˉ���q��b��d�yI�,-���K�o&0քV�~_Sk`}�=���{�������"�
K��6���߬er۬7�7w�ۧ�5>���N� �>��g�i�ӑ��;�����J�
Ԇ�Pڲ����!���,�	��7|�"_��-�|ϡV-�o
�j�b��@�JV9/��
U6Z��.Lݮ3ȷ���6ӎ���vV����.mx�qu�Մ^�p4j4�C�T(
�_0�i��e#
��ʄ0�Mĕ
+e�%��

|�t5��V	Q�<㬡6�nP��o�Q�h����,�8
+�Sx�z�D t��T�	�
����Mޡ�>��7hO�ąti���Y]�������x�%�턕�PT�b|��K�Y�ܿ��hޑ�Cnc�8��MGfJ�e����{��E��>ߍ��_Az��w�َ����z�-U�%͗��=�3���

�.g����xv���f���C������7�wV��k�$���A@������H��'�V
�U?p��j멞���J.:[�������?P�;̇L��^���T�I����b+��,Ӌb�КG<ۅ��@��M�j�@#�	_�%i�c��)�YN\c*���ԻM�>Ah�����i\�2C�`z��{�g�pʭ���嘱�L�4� $����h��	�3��y�����
/����L+�Ϫ��9+�>�L*��ڸ�+��{�d�i�2�c.��-���\�)���������Q�ngp�Kl$~l����$n?;�g����]��� 2C;�Ǣf
���T%���
���!�9Ua����
�|mx�|��m�V [...]
+endobj
+1124 0 obj <<
+/Type /Page
+/Contents 1125 0 R
+/Resources 1123 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1112 0 R
+/Annots [ 1127 0 R 1131 0 R 1132 0 R 1134 0 R 1135 0 R 1136 0 R ]
+>> endobj
+1127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [258.6759 612.9325 428.0408 623.8364]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.gnu.org/copyleft/)>>
+>> endobj
+1131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 149.4262 433.5586 160.3053]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b464aec35ab7fb9fe0a8a50e05ad6f99) >>
+>> endobj
+1132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 137.3366 321.7588 148.2405]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 99.9214 439.0879 110.8005]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c20541d40c7629b278584406ce554eaf) >>
+>> endobj
+1135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 87.8317 321.7588 98.7357]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1126 0 obj <<
+/D [1124 0 R /XYZ 90 757.9346 null]
+>> endobj
+1128 0 obj <<
+/D [1124 0 R /XYZ 90 497.7436 null]
+>> endobj
+74 0 obj <<
+/D [1124 0 R /XYZ 90 203.8829 null]
+>> endobj
+1129 0 obj <<
+/D [1124 0 R /XYZ 90 167.157 null]
+>> endobj
+1130 0 obj <<
+/D [1124 0 R /XYZ 90 167.157 null]
+>> endobj
+1133 0 obj <<
+/D [1124 0 R /XYZ 90 128.3702 null]
+>> endobj
+1123 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1141 0 obj <<
+/Length 1858      
+/Filter /FlateDecode
+>>
+stream
+xڽ�_s7��������/�ߚ��4Mڴq��
C`���
������%��N��!�
�{�vH��T��#U�+%���d9��̼�j@�������\�(EU�ZRY�|�9H�%���~��C*���f�^}�L��f���|���x��!�75�!w�~�qu��������G\MM���X�E�`�`D�V���>Y
�~s>����85�iª!�HK3<��a���jbK��'�
+���6�OM{��5˜��7�jg��^q��T�}�
�.	������%�w���fڎGo��q�x}������x�\_�����n�ٶ��j��W��r��/��6�Mp&gJ
5q<�V��
�u�����쯝�]����ͶY�_�f�1Br
P(�$cp>+��	��,��RV�D�_��hV#HiF���Sk�C@"@���n?��m���������ᅟ��E�lV��vn�}>��n�����
w�(F�Kvs4�N��!v�z@�E-jR	D9W0��*ɣ��,��
�>���;��dќ ��Hr�D����Y8O$RKD	Ϥr�8U�I)��Y&���I �d�lL���2	���L�ŒS�A�I�&�p�H�^	�P���y�㬽oV�& '�.<aV�>vJ���Pe$kgs�(\�D .��3h��
z � �c0覟A���
dP�Il�, ��*I�`�,��
���b��"���'ѩ2}�n޺�&r�DRb��0K
˩�Xi(�Tf���ͪ�B� �
�
ʰ�^(�
b7�]�4�Y�Ui(��ʠd	�`���D(�&�i7ͤ;w��f3��2Kd���%<wN���%J�@�cry�
	*�TV��!��Ȩ�[T',&� ��8�A7�$�=�n �\�n(
�'Jrh�`�+�,
�����ft{�X�DŽ�8͎�1'�sG^υ�aD��LNeJ��5�*�{S',�� �8|a7���=�n0|L"�Ifo���YA	A� ��o������"LaH�

8cV��
y���V4ɟa�H!�XN��!��Z�<�VXL�7 "�p>�n�	{��@���
�0��*I��, �
�~]�s™#/��H �Hv���XN�JȔD�C6G��� 
�����^�
b7�@����g%i�vGK�{�TB]�#�y��G�Y�ڟ
�9S�R��Ir(�O��.��
u n����W����(SkT#�y~��Ŭy �� �c-覟5���
d��IUg���*I�@�,��
�>{��|�I�XsxΜ*;v;�D�[P!)b�g:U�0�#�撢<��t�R
� �A���vӋ#�C���9�Bg6��*�����,��
�~u
�9�pc�n_��A��,sR�*�C#���oD���Fo D��|4������4�Zu���a}U�F'(�1,Y@#\=�=����$
+i�(<�N��!v{�MB��Q-4
˩�Xi Iw%h�߭:a)��  � �ـ
���!v����S
Q�ݪ�Ji%@%K��Ǿ��@H���홿f�
+1-2��*N��#S�J�߮:a1�� �G?��x
����!v�y��Zf���*ͣ���,��
���]��<H ֈv�<pʜ*�:v���K"�m)0�S����qNx�A�+E�����`�J/`�W���g.5"��ƏH!��O>v�"5R��)$����6�]�;O
�C��Բc�xe�������R��������~��?��:��ݸ�b��u�P�]��r�
����j�jAH8K��U���OͺCoĞ:�
�v��n��뫫��4٠��|ݢ��j�^\���Ԭ_��:Q�%�~���n��|���.���阯̋�݅��{��(��K�endstream
+endobj
+1140 0 obj <<
+/Type /Page
+/Contents 1141 0 R
+/Resources 1139 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1112 0 R
+/Annots [ 1144 0 R 1145 0 R 1147 0 R 1148 0 R 1150 0 R 1151 0 R 1153 0 R 1154 0 R 1156 0 R 1157 0 R 1159 0 R 1160 0 R 1162 0 R 1163 0 R 1165 0 R 1166 0 R 1168 0 R 1169 0 R 1171 0 R 1172 0 R 1174 0 R 1175 0 R 1177 0 R 1178 0 R 1180 0 R 1181 0 R 1183 0 R 1184 0 R 1185 0 R ]
+>> endobj
+1144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 720.0467 437.4339 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea) >>
+>> endobj
+1145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 707.9571 321.7588 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 672.226 477.6428 683.1051]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1cb059d74161d8458f18b02e33efe434) >>
+>> endobj
+1148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 660.1364 321.7588 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 624.4054 442.9633 635.2845]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ad77221c9c10713c4a2c8ef2b43cb617) >>
+>> endobj
+1151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 612.3157 321.7588 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 576.5847 483.1721 587.4638]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_794dad01f1995c73b887effa026ac32e) >>
+>> endobj
+1154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 564.4951 321.7588 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 528.764 450.1559 539.6431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4882da0200ef4201f3adb0f6d7731526) >>
+>> endobj
+1157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 516.6744 321.7588 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 480.9433 436.9057 491.8225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_021a24b47cf2b3da92a78084ed0a4d34) >>
+>> endobj
+1160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 468.8537 321.7588 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 433.1227 414.7293 444.0018]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ccb5584441a7c7c84de73810cc6afbc4) >>
+>> endobj
+1163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 421.033 321.7588 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 385.302 414.7293 396.1811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0c4e43825536be038437e5570ae60b46) >>
+>> endobj
+1166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 373.2124 321.7588 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 337.4813 430.2211 348.3604]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_880be9febc6dab2cdccbec8814c9a952) >>
+>> endobj
+1169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 325.3917 321.7588 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 289.6606 418.6046 300.5398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_726484f44f6e6653f9c0126e94e51ab0) >>
+>> endobj
+1172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 277.571 321.7588 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 241.84 418.6046 252.7191]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe235ba8acd485f2334e6eedcb1c53a2) >>
+>> endobj
+1175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 229.7504 321.7588 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 194.0193 458.8135 204.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c587faeb0edfd2582564b9a8fa3335bd) >>
+>> endobj
+1178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 181.9297 321.7588 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 146.1986 458.8135 157.0778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8dfa03483c9b2cb3fca3f8724d6eba83) >>
+>> endobj
+1181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 134.109 321.7588 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 98.378 409.2 109.2571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fa7b390fb34934e419263a5fc694c946) >>
+>> endobj
+1184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 86.2883 321.7588 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1142 0 obj <<
+/D [1140 0 R /XYZ 90 757.9346 null]
+>> endobj
+1143 0 obj <<
+/D [1140 0 R /XYZ 90 733.028 null]
+>> endobj
+1146 0 obj <<
+/D [1140 0 R /XYZ 90 699.8328 null]
+>> endobj
+1149 0 obj <<
+/D [1140 0 R /XYZ 90 652.0121 null]
+>> endobj
+1152 0 obj <<
+/D [1140 0 R /XYZ 90 604.1914 null]
+>> endobj
+1155 0 obj <<
+/D [1140 0 R /XYZ 90 556.3708 null]
+>> endobj
+1158 0 obj <<
+/D [1140 0 R /XYZ 90 508.5501 null]
+>> endobj
+1161 0 obj <<
+/D [1140 0 R /XYZ 90 460.7294 null]
+>> endobj
+1164 0 obj <<
+/D [1140 0 R /XYZ 90 412.9087 null]
+>> endobj
+1167 0 obj <<
+/D [1140 0 R /XYZ 90 365.0881 null]
+>> endobj
+1170 0 obj <<
+/D [1140 0 R /XYZ 90 317.2674 null]
+>> endobj
+1173 0 obj <<
+/D [1140 0 R /XYZ 90 269.4467 null]
+>> endobj
+1176 0 obj <<
+/D [1140 0 R /XYZ 90 221.6261 null]
+>> endobj
+1179 0 obj <<
+/D [1140 0 R /XYZ 90 173.8054 null]
+>> endobj
+1182 0 obj <<
+/D [1140 0 R /XYZ 90 125.9847 null]
+>> endobj
+1139 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1202 0 obj <<
+/Length 1943      
+/Filter /FlateDecode
+>>
+stream
+xڽ��r�6��z
+�Z{!w���i��i�ҌF�G�u)%��>}Q@ <�b�&�H�s�s�O�H����G��� ͸
_/Fx|k����9?	�^�.~�b���T��>�"H�%t|u�O��g߷���z�mo�c�������cN¬�&�
"�=:������L���ѻ�x|c�
aĴ��#�5
/F�2��n�v�ӟ�
�Uǩ�L6�0��4�s*%&�1��ƶ|�N`�z�.>��ae�j�1��0X���k~�{}!{�zxsN�٬[̦o�)>[�=~jo�����C7�
//_t�������z��l��|��Lg˛�b��/����pBn�����E�I,��O,��L?i��o7�v���zc���\"�p��ԟ�aS	GK9nA��~��m��FP��,,\U���2����7}
~Ym���j�����?��b}�.��v�������_�m7ۮ��a5�b�Xq5M�B
i4[:L�(��@��F1TeQ�
+�(��ӸG����|��k��RPD��	l�WjH�94���,
J��+�J]�y��{Zy��Z
� �����W3�#\C
�Ѭ�����Ey��k`
�հ�N�
I�y5�m��
�"�|�A
�"�w+�0Z���[
�m
FM��
4�4���@\*U�	�A
@ �NbT�0�`
i4D�h$1c0��*��T�����}��x�
C
k��NT�"���<
H�D��/�J���1
��n�
k�
 PFNe\� �p
i4�]ɴ�[
Uy(���(e
�`�4�P�]`�m�k{ݦ��f~��9��{6&pۜ�`<�5�F�	|�ȵ����W�� $Uy{��   C�0�f@��4 W���
DY���
+��|���G���j^�
�:,�F9
��0җ�f��IB���E��h�p)�МD~2���
��p{q!s
�1��1{�s¤2�v����ɣ
E�sa�$�L$�ߏz�$��e��`�D���~4T��s����5��ӸG�w�6We�auoثY�E��&��9Q�w�
H��(]F�J
�W>�(%Iq���ڕ/
 �|����|q5�+\C
�)��	����yAq�
+���i�*�����h��k���
>̀��Q�9�K�*��Fg����ۦ��f‚Ƽ*5���51)��R/��3
 �8�q5�t�5��`:9F�����ܝ���s�"��
D|~
�h�Ff�*�u^�q�ɏ%f���Vþ���� �T!�y���VS
�(

��¨�a
+��h �TS$]أ��,�^P�c���H8{�������u[�uj;��K�*��F��w��
A
+��X�N��C��;X/��3
 �8�q5�t�5��`:9GJ��6T��t�:��5t��Ӹ�Og������L�*ԓF�Z>
XlG<dЫR�������V�
�1
@��N�iT�0�`
i4S��k=
c���zA�q�
+L��i������ �d��^U�)��A� �=$�B����U��<��NE�[_/��6
 P8�q5���5��`j�F�4��o��S�5�F)k���q���?l/�Z
wO�I$qC�zU��4ڗ�2sX�`c^�@�5�JZ��za5�� ���鐌�F�!�#�	bZ���*��� ��A̞�}���;"�Te��?�*��F�==q���w�@Re�����W
H��ف�"�NW�c�h
��
ƨ�A��XY�Om4"���&
�B>�ONv2#�5':�ԐH7L����MX�W�O#��h��q��xfS��M�}}.�٦�z�������T�׆2�<Q�U��Z�؉��'���\T5H
B�.�g�
�W?ϖ݀I0���	JN���?m��ˋ���t�A����C���z}w�|`�45kp�&^�x��ϱ��U��C}����c�4����#A�V��+endstream
+endobj
+1201 0 obj <<
+/Type /Page
+/Contents 1202 0 R
+/Resources 1200 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1112 0 R
+/Annots [ 1205 0 R 1206 0 R 1208 0 R 1209 0 R 1211 0 R 1212 0 R 1214 0 R 1215 0 R 1217 0 R 1218 0 R 1220 0 R 1221 0 R 1222 0 R 1224 0 R 1225 0 R 1227 0 R 1228 0 R 1230 0 R 1231 0 R 1233 0 R 1234 0 R 1236 0 R 1237 0 R 1239 0 R 1240 0 R 1242 0 R 1243 0 R 1245 0 R 1246 0 R 1247 0 R ]
+>> endobj
+1205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 720.0467 413.0753 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7704df6970b9563ef9e51793126c0ae2) >>
+>> endobj
+1206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 707.9571 321.7588 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 672.226 453.2841 683.1051]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2a66994a33d910d0fe8daccc6cc017ed) >>
+>> endobj
+1209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 660.1364 321.7588 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 624.4054 434.0965 635.2845]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1522764599cd8547bfe4ef7e88d8baec) >>
+>> endobj
+1212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 612.3157 321.7588 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 576.5847 474.3053 587.4638]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_4d6e94fc9839cd5d455f195f46fc2dcf) >>
+>> endobj
+1215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 564.4951 321.7588 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 528.764 425.7972 539.6431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_59af9a947f610641fe02639f76cfc90e) >>
+>> endobj
+1218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 516.6744 321.7588 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 480.9433 392.6023 491.8225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_29da6d634667414bb52904b7a4f298d1) >>
+>> endobj
+1221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.7137 480.9433 513.9963 491.8225]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 468.8537 273.3408 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 433.1227 433.5783 444.0018]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0757c1c1df607bf422c16b8733f53b30) >>
+>> endobj
+1225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 421.033 321.7588 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 385.302 466.2357 396.1811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a04426c5a10bb84d277c580d8377a8ca) >>
+>> endobj
+1228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 373.2124 321.7588 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 337.4813 470.1111 348.3604]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1773f4a296b1e34a24fc238f84d615c7) >>
+>> endobj
+1231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 325.3917 321.7588 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 289.6606 471.765 300.5398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f6ef577d2302b2baac4689f8766cfb2f) >>
+>> endobj
+1234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 277.571 321.7588 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 241.84 475.6404 252.7191]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ac2ae1578a08e1613a4e7ddfa0f4b711) >>
+>> endobj
+1237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 229.7504 321.7588 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 194.0193 482.833 204.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_aaf96fa77980ed96433261f5dd4c8f5a) >>
+>> endobj
+1240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 181.9297 321.7588 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 146.1986 437.6035 157.0778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1c64e09d6022054690f7d2bdf4e02138) >>
+>> endobj
+1243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 134.109 321.7588 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 98.378 435.9299 109.2571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_ec640128c6492defc09c4d6ad5d3ea19) >>
+>> endobj
+1246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 86.2883 321.7588 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1247 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1203 0 obj <<
+/D [1201 0 R /XYZ 90 757.9346 null]
+>> endobj
+1204 0 obj <<
+/D [1201 0 R /XYZ 90 733.028 null]
+>> endobj
+1207 0 obj <<
+/D [1201 0 R /XYZ 90 699.8328 null]
+>> endobj
+1210 0 obj <<
+/D [1201 0 R /XYZ 90 652.0121 null]
+>> endobj
+1213 0 obj <<
+/D [1201 0 R /XYZ 90 604.1914 null]
+>> endobj
+1216 0 obj <<
+/D [1201 0 R /XYZ 90 556.3708 null]
+>> endobj
+1219 0 obj <<
+/D [1201 0 R /XYZ 90 508.5501 null]
+>> endobj
+1223 0 obj <<
+/D [1201 0 R /XYZ 90 460.7294 null]
+>> endobj
+1226 0 obj <<
+/D [1201 0 R /XYZ 90 412.9087 null]
+>> endobj
+1229 0 obj <<
+/D [1201 0 R /XYZ 90 365.0881 null]
+>> endobj
+1232 0 obj <<
+/D [1201 0 R /XYZ 90 317.2674 null]
+>> endobj
+1235 0 obj <<
+/D [1201 0 R /XYZ 90 269.4467 null]
+>> endobj
+1238 0 obj <<
+/D [1201 0 R /XYZ 90 221.6261 null]
+>> endobj
+1241 0 obj <<
+/D [1201 0 R /XYZ 90 173.8054 null]
+>> endobj
+1244 0 obj <<
+/D [1201 0 R /XYZ 90 125.9847 null]
+>> endobj
+1200 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1264 0 obj <<
+/Length 1796      
+/Filter /FlateDecode
+>>
+stream
+xڽ�]o�6���+t�%(��C�G�b�ֵ]�fW]a����eO��e�~�%��I
2M`h$��9�9�#J�H��?��8�y�J�f�|=��R|�jB��Sq|j
+���\���DeF����!#�SB����
~9�
_��,�����]��^~�y���!��T?j��t�ÍN8��,#2�ߓ��p��^O0be��{��)K��')ejg5�0�M��
��J�(� ,����S
aR�T��x:�%�U��ן��2BK�1K3X�[�ߍ�Z��ƕ
�_|Qu�j�������^t��M󹫺��k��KR\l���j��-�F�W�uW�7ݬj�u�6�����T���줢�V+U�7���O��|����Lz%ݽR��ϾY
+�{��
���O�r}rj�����Y�� Bp?�?�N{#(/�"
�p���<����w}�m�t�����S���z]��jߨ���ѯ۾���j�(��jN��U��h�t�T��9bbj��"/��x�V�B��N�'�)f��;���L)"L��Z�EpN,�/���yO�-��k;�
��E�-?�YƑ��A�0Ds  �e�l �Ռ���F�A�%c�H4T~� �E+e
�`v7�Sq��i�� ����3�A�
+�F�#9X�}x���"s�%3O����
j�kp�MR�<
s�M%�f� �i8�V5�l�5��@6y�ɍ�����l�)#؄��q���q��?�W�#@-0�J���Ԫ@En4�#�,1��
��*ו�N�3$���X:� �����iW3J'\�
�S\��E�NC�S	b�R��	fw�>�AS=�xd*p	�O�8�|O�����r9�hT���U��,i!n{q
�R	��4@X�·�U�8�`
n4˴74�qKS��R
"��SF`	gw�>ߢ�h.,qWvS�����c��Q�c
+��*ה�Mq�-V��!bS
c�4 lZ�Ʀ]�(�p
n4�ʹ@eNH�MC�gS	bشRư	fw�>�w?��My�GJ��Z(~�sr;�
��͏�C��u8'˅U^��T�h8������iU3'X�
�3D�M

���é1pZ)c���q��i3�T�F)�S��ь����a�,lK�\[~<YI��/˂xja,��  O�����������i���Ty�Ԃ<�x��ݸ_�g���nW��Y�U�]�l?l��SwQ����<�k{ ���|r�2�N�V�G�L��&�_4�0�Oc ħi�||ZՌ�	��F��$�4
��E�s8
��/�M(����܊���a���2 �����Fz:��@���7-r��qk��������8� 
-g�ѮfG�7���8D�Y�Q)�R�Oi�^c"���ԇ��c,�3:<�rD�ѻ~�eP�
��qꧺ�4��o��Y5jF�VV�U���_;�P��,
)*���."�r&�}]�S���)�f
υ 
].f���Z^�x�|S��C�����m5w�1�Ǘ�؉��y��wn���ɝ�����J�7�1��嘈+��>M6̀wպ�m�y���LO�� o����N��� ��~���]���k�a��ͻf+��LD,
���

�$�ٓ��;���('���@�ʜ�G����̍����׫aW-X���U���cWw�^r~1t�m�
��kr��G�w���'��mW�\��R\��N�\�B�.�G�J��/_���ƈ~2�F�N\Y��~�������G�
:�ͶC��j�]]9
-�b&
+p��7�"Nj��S�帰�ܪw��=O[����r �
+�7�ʎendstream
+endobj
+1263 0 obj <<
+/Type /Page
+/Contents 1264 0 R
+/Resources 1262 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1298 0 R
+/Annots [ 1267 0 R 1268 0 R 1270 0 R 1271 0 R 1273 0 R 1274 0 R 1276 0 R 1277 0 R 1279 0 R 1280 0 R 1282 0 R 1283 0 R 1285 0 R 1286 0 R 1288 0 R 1289 0 R 1291 0 R 1292 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R ]
+>> endobj
+1267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 720.0467 458.6246 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_aceb67cef4a0d79b9a80bf214ade8132) >>
+>> endobj
+1268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 707.9571 321.7588 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 674.3643 443.1328 685.2434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_eb30e6558c9efffc62d5765b3bfe5e4f) >>
+>> endobj
+1271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 662.2747 321.7588 673.1786]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 628.6819 441.4788 639.5611]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_304e74729ca34fc67648cbc995e1dfc7) >>
+>> endobj
+1274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 616.5923 321.7588 627.4963]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 582.9996 481.6876 593.8787]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e6eef0ed4aa8b3690f01f774dd0722fc) >>
+>> endobj
+1277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 570.91 321.7588 581.8139]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 537.3172 439.8053 548.1963]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_be643d7919aa34a2c1112702878f5536) >>
+>> endobj
+1280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 525.2276 321.7588 536.1315]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 491.6348 480.0141 502.5139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7a8abcefdfb125b7c9ef5f96d352c1df) >>
+>> endobj
+1283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 479.5452 321.7588 490.4491]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 445.9524 447.0082 456.8316]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7e4bbfa6f481ead40e3ca6231e0f69be) >>
+>> endobj
+1286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 433.8628 321.7588 444.7668]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 400.2701 487.217 411.1492]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_2aaf9117efebc52a8b45b787075a9647) >>
+>> endobj
+1289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 388.1805 321.7588 399.0844]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 354.5877 454.2007 365.4668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1956a63a72283d208851d3fe2b11989b) >>
+>> endobj
+1292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 342.4981 321.7588 353.402]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.0071 308.9053 444.2682 319.7845]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_97011210c7f0b2efa0f837ef2da6c5b3) >>
+>> endobj
+1295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.7869 296.8157 321.7588 307.7196]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+1296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 183.7089 513.9963 192.6851]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.9.1) >>
+>> endobj
+1297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1265 0 obj <<
+/D [1263 0 R /XYZ 90 757.9346 null]
+>> endobj
+1266 0 obj <<
+/D [1263 0 R /XYZ 90 733.028 null]
+>> endobj
+1269 0 obj <<
+/D [1263 0 R /XYZ 90 700.9019 null]
+>> endobj
+1272 0 obj <<
+/D [1263 0 R /XYZ 90 655.2195 null]
+>> endobj
+1275 0 obj <<
+/D [1263 0 R /XYZ 90 609.5372 null]
+>> endobj
+1278 0 obj <<
+/D [1263 0 R /XYZ 90 563.8548 null]
+>> endobj
+1281 0 obj <<
+/D [1263 0 R /XYZ 90 518.1724 null]
+>> endobj
+1284 0 obj <<
+/D [1263 0 R /XYZ 90 472.49 null]
+>> endobj
+1287 0 obj <<
+/D [1263 0 R /XYZ 90 426.8077 null]
+>> endobj
+1290 0 obj <<
+/D [1263 0 R /XYZ 90 381.1253 null]
+>> endobj
+1293 0 obj <<
+/D [1263 0 R /XYZ 90 335.4429 null]
+>> endobj
+78 0 obj <<
+/D [1263 0 R /XYZ 90 282.4649 null]
+>> endobj
+82 0 obj <<
+/D [1263 0 R /XYZ 90 250.5364 null]
+>> endobj
+86 0 obj <<
+/D [1263 0 R /XYZ 90 167.4552 null]
+>> endobj
+90 0 obj <<
+/D [1263 0 R /XYZ 90 132.652 null]
+>> endobj
+1262 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1311 0 obj <<
+/Length 1950      
+/Filter /FlateDecode
+>>
+stream
+x��ZYs�6~ׯ�[�i
 qy:�i�
I���ڇ
�a$��T"U�j�_�W "`��t�`�\�~��b� �"(�P$`�"Nh���`t/o=C��+��J�b9����H A1��o
����_�lq�	���������d��/_D	��Y"u+Q���/����)R�����;�6֋��$z'/ @B�h?Kp�_�fw�=���W	�q�DWq8��;�����M�"��խ�{�ZC0��X����$n�AL�j��<������y�{�f�*]}������=�!���H�e!�<�0ƀp���~�.�Y٬��j�����u����
��,~�٦�������(�}v<��N�4��]#�ɜ�̵���
'm��IJ,�(
g�CJab��H)� J��T/�R77�_�^
�*���h%g �#ݲ�`�� p�e&@�`��v����y^
N�uy���N9`k.�>�ԅ�i�ZeZ�_e��?W�!� �?d�i+�cҏr!�
O?�����]�g����
`���oS�
�͹oQ  �]�)�Y�d,�0�U�X��&��rt��Ǐ�B&Ԑ4m�m� v��KJ�i
%@�ป�e����6��=c���c�4r�U�n��~��\��fX��
D��"���J�B$P�g9Ly�ͪ\h=L)�ڜO�eU�sIU��%�O�;oTU;u�e��A��.�3C4�
�雬���n�pc�"	�H�
+Bd��4y��B�u�B��*�XP���x�
�E}���jz���pm���u���h�P�4�ebr�}�h
���g��mz��FH�(GYQ��~:��&���ݥC�P�Y'����i���o�
[�2υ3~��I�eM"���׋���׿�xu�Uu�Z�uZg�n&��v�F:��{q`K�‹0r�lX���S���q/�d�onne��{�
|kXB�
�~��%�Y�
��rM�/D���^,���Ų�P�������5ra�ar�


k~n�K�X�
˓�.���fށҋ��v���PB�f��i�&�\��w,
n��’���
����Y>0ox5׃�;J���	/a���'
��t&�/��XXx��:e�s�D�f6��Q��ֆZ�aL�SRKT1E�C� �HjWw�:�_bX�
��8ZKk�0w1lZ��aFA����p/�4�on�eq�Wy�~o�ȸ�&��Q�ֆq��
bZ��q� ��o&�B?�U*�n���Q;
+���R�8�5,OJm���7�b���W.4�A
����6

w��'eX�
T@�\7�=���r��	b|���e�:7,O�8�Rþ)p{$����lsZ�yY�zx� d"�}|����v��p
��g�=��8C��6�ΞѴ<iT)�$�iw
��L��}^t�%��� J�;��h���{A!
���چ��9��'
a�ȵ���XX˽
��W�ǎR
L窎�Da�o���oPLG���*�:���Ic�6e��5�XPL�j��_ݖJ�f�^�������d[C��(rK�ۆ�I�V;���1� ��Ί�A���(JK����sf�C��gϕʁ �_`�U#� ���&W�wI4��1[囕�^�t��P-�
�������-�.q��E���v��%�g��"x���!�	6,O��1��GӗD���w�ci �
� [Z�$vn��'�a�&b_�bO����
�t4a��·��i�\˙��Lk� A�N�
i�K==��i� �>ꀥ��9�	��)DZZ�A����j�����t6gQ�
OH|�Pձ! X̻�-D Bbҝ*��mD��t�}L����C�?
��!����iqJwÉ ��R�UG��nnJ��Pe���B`�>X���urN��� �ڧD��o�Ct�
W�m�沥W9��������w���NE~�@^_�k+� ��G��qY#����'� 7������/��?�#o�S�8��m(���endstream
+endobj
+1310 0 obj <<
+/Type /Page
+/Contents 1311 0 R
+/Resources 1309 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1298 0 R
+/Annots [ 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R ]
+>> endobj
+1313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 720.0467 221.094 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library) >>
+>> endobj
+1314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 721.9496 513.9963 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.10.1) >>
+>> endobj
+1315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 698.1289 288.0521 709.008]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators) >>
+>> endobj
+1316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 688.1961 513.9963 697.0528]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.10.2) >>
+>> endobj
+1317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 664.2559 117.9015 675.135]
+/Subtype /Link
+/A << /S /GoTo /D (namespacestd) >>
+>> endobj
+1318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 666.1588 513.9963 675.135]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.10.3) >>
+>> endobj
+1319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 550.6706 513.9963 559.6469]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.1) >>
+>> endobj
+1320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 528.7528 513.9963 537.729]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.2) >>
+>> endobj
+1321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 506.9545 513.9963 515.8112]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.3) >>
+>> endobj
+1322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 484.9172 513.9963 493.8934]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.4) >>
+>> endobj
+1323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 462.9994 513.9963 471.9756]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.5) >>
+>> endobj
+1324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 441.0816 513.9963 450.0578]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.7) >>
+>> endobj
+1325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 419.2833 513.9963 428.14]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.8) >>
+>> endobj
+1326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 397.246 513.9963 406.2222]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.9) >>
+>> endobj
+1327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 375.3282 513.9963 384.3044]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.10) >>
+>> endobj
+1328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 353.4104 513.9963 362.3866]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.11) >>
+>> endobj
+1329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 331.4925 513.9963 340.4688]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.12) >>
+>> endobj
+1330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 309.5747 513.9963 318.551]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.13) >>
+>> endobj
+1331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 287.6569 513.9963 296.6332]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.14) >>
+>> endobj
+1332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 265.7391 513.9963 274.7153]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.15) >>
+>> endobj
+1333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 243.8213 513.9963 252.7975]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.16) >>
+>> endobj
+1334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 221.9035 513.9963 230.8797]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.17) >>
+>> endobj
+1335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 199.9857 513.9963 208.9619]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.18) >>
+>> endobj
+1336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 178.0679 513.9963 187.0441]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.25) >>
+>> endobj
+1337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 156.2696 513.9963 165.1263]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.19) >>
+>> endobj
+1338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 134.2323 513.9963 143.2085]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.26) >>
+>> endobj
+1339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 112.3145 513.9963 121.2907]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.20) >>
+>> endobj
+1340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 90.5161 513.9963 99.3729]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.27) >>
+>> endobj
+1341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1312 0 obj <<
+/D [1310 0 R /XYZ 90 757.9346 null]
+>> endobj
+94 0 obj <<
+/D [1310 0 R /XYZ 90 649.5611 null]
+>> endobj
+98 0 obj <<
+/D [1310 0 R /XYZ 90 617.4981 null]
+>> endobj
+1309 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1347 0 obj <<
+/Length 1854      
+/Filter /FlateDecode
+>>
+stream
+x�Ś�r�6�����4S�X����E�M
�V{�d8��X�h+%���\D�@I��n$��?� HA�A���
H�h�
��N
~9@��:?��M'/�$�
�h�T`P�p4��0� ��B8<[���h�)
��gy���Ng#D���1��!�G�&o�'Mʺ"J*�3��	F���7�4zP? @R�h9�1��X
�6:Չ����H .d
�I
S�D!�LL��U� B�"�	���vB�8NpԄ�.G�|�&�#
����,������F�z<=}��2y��ewY~�(�@�"=ou&��C����:
բL��av��A�N����.�s�c�
c��o;�j	��:
4TK�Z��2�	�q	0���	
���e�n�B<MwYb=}bw��j��Y�3��X
ba�:�������jd��TIlWᇚjlE���4�j����>,��+.���=��ZC�̙p+s��j\">���o#
֙�R�p;K7T+��)���O�T���.�MX�b)�A_��E�ē�ʔ��%
K�ߪ��� �>WG<[߯n������J�������"�8�H���rXo}��nZ����v�^
f�r����0����,�~)�[��
�1
�wb�E��D��A&:�����:÷3�jb�W�	�����d�&�\�/o�ۉU��j.�=���K��V�1c��&e`wo�H�'yC��[Z�{�-��o�҄����t7o��,y�{�Vm��G
Z��lu"2T+[���V�^m��}K�&,�ַ�U����7�bh���W���
+�(;+6T]�[���

���oEԄQ~��2�,�oٲ���;���VC��+l|ۙ{�ˠ�
+�6Y�� ���*������{8E��.&�Ё�
��9��5�a�|c��� 7�d
�"7�֫���W7�P߈ow�	
r��t�ޭW�"�����:�s�z2�3��� �D
��E�F;s�."������<�v�t�x�.N�(����J��b8��\���+�lL�����!�g�C��eb�V��}���,�o��	
��:���W��E�s,�
+B�+6TK�"�Ang�g"���4a�Q~�P�*���P�([w	ۙ{�L���þ�	;�rq�
��k�;�5T+��}�v�C���1�0څ
@��;���q�̮�$�:Ԅ!>K�!�H��O�[��[���uTn��3d��s
��8��Sa�]��M���z�>�
,b���M}M��E����̶�Aj
.
� 9�.S� �e*��6��b��cLlF�s��$ÀK�^����7�y����|U?�3�^)`L��|�6��Q�l�z��
S�ՃZ��
o��
�	�
�M�=h�کޓt'
�
:����W��a�:���z�Z��ڹ{
���Էф�z�M��,y����k�� ;k5u�
�X�*�s�	��s����A5aA����v�޻�P�ݻC��� O�xL]���ܽz�����IQ��dV�8�0�Ydݐ��a�����d�
+���WȔ 
��M���*`��e��,�ԭ�Zw/۹{嫮i��=�iŽ����2�`;�6u+����v�^aC	c��I���ao��{��ӇAv�k� �rBV=]��m,
70ʾ�E��
y��D�i�8RK_^<K(_��j����.�Y�q�҂��ރ�gmD��m��R�fU�P�.]ݧ���GH��BJ-l��<�J��<�\�E`4&���̸P��j��&�}�%���h�폧�6k��<�Z�
ݢ��nszr��� �[p��or0ߝl6��o���Ĝ��2nA� ���b�8�Z>��
+�r��v�W������ÌR�C�endstream
+endobj
+1346 0 obj <<
+/Type /Page
+/Contents 1347 0 R
+/Resources 1345 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1298 0 R
+/Annots [ 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R ]
+>> endobj
+1349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 722.0691 513.9963 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.21) >>
+>> endobj
+1350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 700.0318 513.9963 709.008]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.22) >>
+>> endobj
+1351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 678.114 513.9963 687.0902]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.23) >>
+>> endobj
+1352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 656.1962 513.9963 665.1724]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.24) >>
+>> endobj
+1353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 634.2784 513.9963 643.2546]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.28) >>
+>> endobj
+1354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 612.48 513.9963 621.3368]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.29) >>
+>> endobj
+1355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 590.5622 513.9963 599.419]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.30) >>
+>> endobj
+1356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 568.5249 513.9963 577.5012]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.31) >>
+>> endobj
+1357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 546.6071 513.9963 555.5834]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.32) >>
+>> endobj
+1358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 524.6893 513.9963 533.6655]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.33) >>
+>> endobj
+1359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 502.7715 513.9963 511.7477]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.34) >>
+>> endobj
+1360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 480.8537 513.9963 489.8299]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.35) >>
+>> endobj
+1361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 458.9359 513.9963 467.9121]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.37) >>
+>> endobj
+1362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 437.0181 513.9963 445.9943]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.38) >>
+>> endobj
+1363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 415.1003 513.9963 424.0765]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.39) >>
+>> endobj
+1364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 393.1825 513.9963 402.1587]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.41) >>
+>> endobj
+1365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 371.2647 513.9963 380.2409]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.42) >>
+>> endobj
+1366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 349.3469 513.9963 358.3231]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.43) >>
+>> endobj
+1367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 327.429 513.9963 336.4053]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.6) >>
+>> endobj
+1368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 305.5112 513.9963 314.4875]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.36) >>
+>> endobj
+1369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 283.5934 513.9963 292.5697]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.44) >>
+>> endobj
+1370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 261.6756 513.9963 270.6518]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.44) >>
+>> endobj
+1371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 239.7578 513.9963 248.734]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.40) >>
+>> endobj
+1372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 217.84 513.9963 226.8162]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.45) >>
+>> endobj
+1373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 195.9222 513.9963 204.8984]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.46) >>
+>> endobj
+1374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 174.0044 513.9963 182.9806]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.47) >>
+>> endobj
+1375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 152.0866 513.9963 161.0628]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.48) >>
+>> endobj
+1376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 130.1688 513.9963 139.145]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.49) >>
+>> endobj
+1377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 108.251 513.9963 117.2272]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.50) >>
+>> endobj
+1378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1348 0 obj <<
+/D [1346 0 R /XYZ 90 757.9346 null]
+>> endobj
+1345 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1381 0 obj <<
+/Length 2742      
+/Filter /FlateDecode
+>>
+stream
+x�͛�o�����з���LJ�2��]��5p��h�]����h�����P$u�J+��b��Lj
�~3C��$��G2�3�%�,�rs��;���q�/��E(���ٛo�4҂����kA�)�����:��
/ޮ���
�P����^���!�dmQ��ճ\��9u8�����Ͽ�lj�x�ӊgp�њf���2�>�x��
{�{`lT���a�
���EA]���x|`�Y�4�ݳ`4
+�ʙ����}k��g���<j�Ф{���)�|��{w�4�����پm�֟
�j[���ze��-��s�����P����SS���pU�M�kM��w�#J0�D.����Y��у��8Tv��ܹ{1�sD$��E�Ր�^�3�����l���s����}�j���է�h
//�^?�[`�}�
��* j:9Ћ^*�$Ua�u��/�c��Z���=�y��3�!Ǻq�9;��){����v���
�'l�,9QH*����-�TϤD>�p
�i��ċ͢�w7�]i]���E!Q��
f�A�'�L�pw=҆F�q��6 at P+$��‘
	tB��3LQJ��� t��=@<s�bU�ޖ�9Q��^�x���0��H�9LN*>l���z��)C����r�&��<&����nޖM[��1]myl
�LҠ��x���
� ��HM�ε�EJ��r[��x�Q�p�w��f�(\���s����7�L.(؃2������jU�U}g϶��)Z��)&s�
�E�5AX��^�"��cЪQ�P2Fd��+ �
�9����ŞM�����fW� 2����(���
��R	���0
4��v�-'z�n�bm�ͪl:���
���� �Bb�2'1������b1�@~9/e�M�qϯ9�U*�������XNf I���qH�%~���H3`����0���ktb�I%�o&��Q߱�X����;(a־/�j�h/,��}��?�|Q�[���
eoߟ�x�i]p�^X��y
1̅|�ݺ�������X�X{�)���_�0�;��^l�o��6D
 �H��5
5�I%�f�*'�����b��<��/W"e�EZ�@hR�A�
B|<O��%ʥF��:�P/6��r�[��V7?
6�`>6(5
3%�R1ѯ^d�0����Z>���c�֧�'
)ʳp�#��
+%
� �k��@}�䋇��A ��s�;�aӀ�=i!J�}��rz
��n]n ��s��������;Խ;�$� �yNg�A(�
z)�r�
�_��
��-�^l�l��ЭB��T�hȲ��a��R	���H(�c������h���Ji7�I5�v���89i�r�Ē� �bO����-7�54C�� Y���"�I%�dD ����
8�[%������K�X��L�;h��F��2Ћ �
�d)`��󀹼���oo��"��Ѐ�J,Tg��Jh�`E����ֶ�l�Y�z�]l�����/�}O;��P����,���H�|6~��i�z�?E��{~����&"�_/6�}�U=�T!)RP��HBsR	��䰆�"V�DB+?�u�
_����$6��3��T~�&�f�Z/�
�]�>ZNa�Ş�ͩ4��d
+S��0Jy����`ĥ䱖�4�t�g"5g 3���=
g�
�"��
^
+N� z���Ls2G����3�K%�fR )`�
i��
e8Hs��4g��_�@��K$ru���P>�@~?/e���E=�����)�z�'ⷿ�P�K�
a�FK�/+�%����E���Hk�!nX;U���
�2���JX����$����V��*���
��Ζ�:ΫU��} �-�^��
�
��1�ފ
ܛ��ߺz^_�v�����vnZp�������~�����P����R�OF�qϯ�O�@��I?�b���]	apS����q}&q�l
�ܝ�u�8�9i���W c�+��
Y ;��
��h�s��x���bg"3�6�
�WΝ��k��6Z�����9RJ汛���`�bwNs�64��z>����^�b?��{~
�S�rA��{�y�w�'
+Kc�m�r�U"9pȥar��dr\�.is
+��,
��
�T�.�sx��[d� 9���'8���֘Ȟv����CuN��L at d�2�����&�M0�rY����M/k�O��qW���~+!tc��
C�
�Ԗ��C�^��j��ub��~�̸)
�~�=�?"J��D���b���[�@�������nܗ�8�
Ͱ�
U	�N*�1�
9�8X"��]��5�J�U��i��N�2i�aE$��r/5����z|�G%��`Y��H��	M�F%C���fG%'���)
�9_|
앍�O�{��m;:���(
�
���s��B�{�`!9Km������@9	�
�A9����V�1S���ԝWqN�����ʤ��V;Z�h	j�>/�
�R�]׽سpIW��u�xj3�<wR	��430����
+
P\
��~a�}�L(34�ؓ�#������y)��h�)���=j��Ĩ��b��]ؽ7��]O�{$��e<`C�T����׈s���ڗ4��f8��;����|�Sgs�}��Ť�2�Uԇbݿ��i�l�}ATŻ��Ҽ6�n@�cY�m��
^��J��o�?�g���{�"x¾B
yЮ�}��.߼yxx@�=:�ծAU�f�[���!CC���:~�^h�Kd�
SHfXE���̼��1U5\��(�ƷMT�y�;�endstream
+endobj
+1380 0 obj <<
+/Type /Page
+/Contents 1381 0 R
+/Resources 1379 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1298 0 R
+/Annots [ 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R ]
+>> endobj
+1383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 643.8516 284.5355 654.7307]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+1384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 645.7545 513.9963 654.7307]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.1) >>
+>> endobj
+1385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 621.9338 299.6943 632.8129]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+1386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [502.0411 623.8367 513.9963 632.8129]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.2) >>
+>> endobj
+1387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 600.0159 315.7182 610.8951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+1388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 590.0832 513.9963 598.9399]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.3) >>
+>> endobj
+1389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 566.143 362.0143 577.0221]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) >>
+>> endobj
+1390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 556.0907 513.9963 565.0669]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.4) >>
+>> endobj
+1391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 532.27 284.2016 543.1491]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+1392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 522.2177 513.9963 531.194]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.5) >>
+>> endobj
+1393 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 498.397 288.7897 509.2761]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+1394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 500.2999 513.9963 509.2761]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.6) >>
+>> endobj
+1395 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 476.4792 364.8213 487.3583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+1396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 466.4269 513.9963 475.4032]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.7) >>
+>> endobj
+1397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 442.6062 279.1955 453.4854]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+1398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 444.6286 513.9963 453.4854]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.8) >>
+>> endobj
+1399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 420.6884 314.6124 431.5676]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+1400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 422.5913 513.9963 431.5676]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.9) >>
+>> endobj
+1401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 398.7706 381.0027 409.6497]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+1402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 388.7183 513.9963 397.6946]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.10) >>
+>> endobj
+1403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 364.8976 273.6662 375.7768]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+1404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 366.8005 513.9963 375.7768]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.11) >>
+>> endobj
+1405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 342.9798 309.0831 353.859]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+1406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 344.8827 513.9963 353.859]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.12) >>
+>> endobj
+1407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 321.062 375.4734 331.9411]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+1408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 311.0098 513.9963 319.986]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.13) >>
+>> endobj
+1409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 287.189 378.5995 298.0682]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction) >>
+>> endobj
+1410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 277.1368 513.9963 286.113]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.14) >>
+>> endobj
+1411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 253.3161 312.6549 264.1952]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+1412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 243.2638 513.9963 252.24]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.15) >>
+>> endobj
+1413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 219.4431 353.0664 230.3222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Domain__Product) >>
+>> endobj
+1414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 209.3908 513.9963 218.3671]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.16) >>
+>> endobj
+1415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 185.5701 317.0038 196.4492]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >>
+>> endobj
+1416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 187.473 513.9963 196.4492]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.17) >>
+>> endobj
+1417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 163.6523 271.9926 174.5314]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+1418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 165.5552 513.9963 174.5314]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.18) >>
+>> endobj
+1419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 141.7345 307.4094 152.6136]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+1420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 143.7569 513.9963 152.6136]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.19) >>
+>> endobj
+1421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 119.8167 373.7997 130.6958]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+1422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 109.7644 513.9963 118.7407]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.20) >>
+>> endobj
+1423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1382 0 obj <<
+/D [1380 0 R /XYZ 90 757.9346 null]
+>> endobj
+102 0 obj <<
+/D [1380 0 R /XYZ 90 733.028 null]
+>> endobj
+106 0 obj <<
+/D [1380 0 R /XYZ 90 712.582 null]
+>> endobj
+1379 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1442 0 obj <<
+/Length 2880      
+/Filter /FlateDecode
+>>
+stream
+x�͛ms�6���S���35�����\�6�6I}����hh�q4�%����Ѐtr={:�H�_�b���I��?R\)��a\VW�G����/���}�Ob��G�?HQd$��Ň�I���V׿�4"�'c<{��w��*���b�
�~�c�	C�)�[������}�� �$�������qu
��x�3ZTw�#b
�n�8e�����ѿ�v܍��qq��҆W'�#-���QR��]c]��M{i{�kdsD��G
+c������z�u��1��z{[�Ϗ)������m=���������o��Vms�l�]I�@�cR�
�ѫ
+�Q��4�ľ߰���.ןV��5<k�f��1�u�܅����
=[����r9��wwۏ�� #rW�����"
J[gd�p�upx�d��h�����L
�)�Ob��
�V�%����a{=�˜��� �6*�`/��vq= �+D	�)�qH^P
�� ��a����cM(���RaܨA�
�@�“� ���PF !�&�0�l��oӫ�mX�0֬��bT3fH1�R3-6�HH%W��1�lcM����iVW�M1�JL��������MH�()0M�=���允
Z��ȅ��̸�zU�1T�(x�B F�C�2�j��q��4ۺ�
)FWhdjtE���M�2]I��!�C0��+Ⱦ0���^�o7u7�He�!���bcC�U�dj��֢
����^�Gi |��m���
��kB�,;LL�l
�{0�$GR�q�Q�WX�0�I�k�Z��	�(�&]�؇��Y at .s&GV����r�E�����
"KXR]��^6=�^6+��s�D\bQ�}g�,�*�H��F���]�,������m�Ƨᐎ���bՖIJ�P&i|,�VGHuޓ�s�$X�H
+�/ i��~�6�����J�*6a����`)��I��s68n>�ssl���Rs'�3j��U���3�'�V
Ұ;^��蜝�v��m>71p"�uk4$)�����
F�;�V����}sU�_WwWj� �'=�	L�to��_����_M�1ҏ�T
��giLz~4BW��`t�I,�K�R
�e�z�93!:ɨuv֔X�غ���>\�u7��,-��վ��_܎|��꡸q�J�W���v
��G`������#
�cPfLz~
r
W���(,�;	&HY�)w�h�^[
solo�R�P�؏��X[�tW
o�!�b���H9T����$����q%�1�L�,��W9β;�i�ρ3a��I	� �D��>���<Z����H�Z�����ߝd�sp�^�����B�`ϸ��Z��i^�')'���­#���3t{U�K HH&S/y��n
^\y�W��]^5W�nWo�{w�j��5��x�u�b�L7��nq����.tw-4�6~�_�;��v9��==
"�H8�X8$=?�p�QL��d��a7����v�s��(����`��?���4baB
$
3`Ԉ*
�Й
q-E�a(���G!v��M�1���n��Y�(�eO�B�����K��r�UX�1e�#�R|��J�sV(m��a��8$.%��bW�?-5�MGn��Y�X 7f�� �$bR�rA6��u�x(/�?o
R[=(I��|$�

��1��9Қ�G�1��
�؁PUg��+�!��8`q��*��l
������K��b���aH
vl�p�TKYWja [...]
+jL�� ��˛W��sw��r9܊�P�q
+^�y怌Wl�HJ�6R8��Y|�V��1�؁/��8�:V:���f[�޺�.nҡ�

����%�-B���E������%=?��	��q�lqo߾Hnu,����P0�؆L�򪂩
L�vG!15JQ]	�}�K8{��p�s���9�XJ�QLh�x�x�l�j���n��z�I�Y1S��z�4���w������{�
]� �c5y%�
����h�9��bypQ�lb��C
xUb${Ċy�q=���Nrcv=
0�jJJEZ/����Wm}�^���������?
+*��~�|����ٯ��8�hAU�}���d�'��Q��Q��ٍ����&�8j�U�b���[�EX��J�[/�����z��w�
+�|���i+W�qX���ईbC�ō���?��4+0�b]������*�C��xU�]v7��Sw�G9��
�s����Vh8
�-˸�y~�<��<m����K}�k�u77Lx�J�f���X��#�T],�|ZNz~�@�A��R,��`//V�i�����
\
`
��]
��������R=�#�ؔm���gΞ8Q�/�D4�����C���c4d�bf݁��_�t�\�Wm8�O)EX��Bݿ/�������.#Otw�v2��0�C^d����瀼�UD>�
�<d��d�e�f�g��d���}��`)��Aq�RK T§Zo��r�]6�]Ӭ���]ۯt�[�kw���aܼ�w(�z�	<"Let:��~������c+i�ρ@X�Q{��@`�=���M�@Q�&
"P�,��Y���؟���<DHÓ��������Ӟ�PqR<�T�����UIi��p�1��m�J#��Nl칳$\ֻ&�����pD���3aBMFQ�it8�m:����ǜg��"i� [...]
+endobj
+1441 0 obj <<
+/Type /Page
+/Contents 1442 0 R
+/Resources 1440 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1298 0 R
+/Annots [ 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R ]
+>> endobj
+1444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 720.0467 286.9364 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+1445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 710.1139 513.9963 718.9707]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.21) >>
+>> endobj
+1446 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 686.1737 248.2118 697.0528]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 688.0766 513.9963 697.0528]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.22) >>
+>> endobj
+1448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 664.2559 298.0046 675.135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+1449 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [476.0787 664.2559 498.5541 675.135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 654.2036 513.9963 663.1799]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.23) >>
+>> endobj
+1451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 630.3829 344.3007 641.2621]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare) >>
+>> endobj
+1452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [443.1849 630.3829 465.6603 641.2621]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 620.3307 513.9963 629.3069]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.24) >>
+>> endobj
+1454 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 596.51 297.4567 607.3891]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+1455 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 598.4129 513.9963 607.3891]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.25) >>
+>> endobj
+1456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 574.5922 332.8736 585.4713]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+1457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 576.495 513.9963 585.4713]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.26) >>
+>> endobj
+1458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 552.6743 399.2639 563.5535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+1459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 542.7416 513.9963 551.5983]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.27) >>
+>> endobj
+1460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 518.8014 295.2352 529.6805]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+1461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 508.7491 513.9963 517.7253]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.28) >>
+>> endobj
+1462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 484.9284 341.5313 495.8075]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) >>
+>> endobj
+1463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 474.9956 513.9963 483.8523]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.29) >>
+>> endobj
+1464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 451.0554 349.311 461.9345]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+1465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 441.1226 513.9963 449.9794]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.30) >>
+>> endobj
+1466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 417.1824 304.5658 428.0616]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+1467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 419.0853 513.9963 428.0616]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.31) >>
+>> endobj
+1468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 395.2646 412.7549 406.1438]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) >>
+>> endobj
+1469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 397.1675 513.9963 406.1438]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.32) >>
+>> endobj
+1470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 373.3468 354.1694 384.2259]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+1471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 375.2497 513.9963 384.2259]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.33) >>
+>> endobj
+1472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 351.429 308.3657 362.3081]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+1473 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 353.3319 513.9963 362.3081]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.34) >>
+>> endobj
+1474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 329.5112 288.4209 340.3903]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+1475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 319.4589 513.9963 328.4352]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.35) >>
+>> endobj
+1476 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 295.6382 303.1757 306.5174]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+1477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 297.5411 513.9963 306.5174]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.36) >>
+>> endobj
+1478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 273.7204 338.4189 284.5995]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction) >>
+>> endobj
+1479 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 275.6233 513.9963 284.5995]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.37) >>
+>> endobj
+1480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 251.8026 329.5819 262.6817]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+1481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 253.7055 513.9963 262.6817]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.38) >>
+>> endobj
+1482 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 229.8848 416.7301 240.7639]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+1483 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 219.8325 513.9963 228.8088]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.39) >>
+>> endobj
+1484 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 196.0118 338.9123 206.891]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+1485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 185.9596 513.9963 194.9358]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.40) >>
+>> endobj
+1486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 162.1389 309.9999 173.018]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+1487 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 152.0866 513.9963 161.0628]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.41) >>
+>> endobj
+1488 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 128.2659 309.9998 139.145]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+1489 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 118.2136 513.9963 127.1898]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.42) >>
+>> endobj
+1490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 94.3929 276.6154 105.272]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+1491 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 96.2958 513.9963 105.272]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.43) >>
+>> endobj
+1492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1443 0 obj <<
+/D [1441 0 R /XYZ 90 757.9346 null]
+>> endobj
+1440 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1511 0 obj <<
+/Length 2601      
+/Filter /FlateDecode
+>>
+stream
+x�͛�s�6���W��4������L�47�=_��K���m�*�*E��
��A��$n:y�M.w��. C
�Hbp��B�q�,6'8����<!��ܟ�//NN�H�d$���U�A$(����׉�Ψ������:��/n7ٶL�U����G'BM���䇋�X�`�XS���;N��ӏ'1�Er`D����S��X�|8�O���Q=04$N4R��d�8�
�"0@*@�pT�蕻i/�ͽ���
�(��2����!l�Z1��)���ؤ��)œ|�p�-�t�nuY����Y}�J�g�>+m<O��k�A
�GV�w�ȁq��n^�Xb"�
�5j8�,U⏱�V*
+j�B�n(~�_� M����rue�o�eq�h�+�gZ��L��
h$brg����e>�Á7�4�B�{� #D��&]mk��r8pn�32Q�!�F`p�3_���V�}h]v`�(���
0��@B���(��g���:����n�
}Z#"�J|�}��T�Cj0��G�CK��5ez]��X��}���Wq6����Vl0<�F0
_�
�U�f�G6��(6>l����}�l��z��
	V@©����
x��N^�u� ɫ�
C&����m/v�T$(L$15ݠ��pe�� ¯�bJt=!ܭ�Yu�LJ[7���)x�L"��a��ʛ|Y�}5�b�
�7̈́^����g5֗����)a\���Y����I���c���!ng�HV8�QYqq�H�}z	�a�Tn�z�h6B��3��>ZH���p���e�r@�������[w�s|G
�Gp
HOk��(���$0�L�8rb�8�ej��*V�I���:�-�rR���Ԋw
�&��
+������:`�n��+U�]��F�q~A�Q���A�Ba�	h��"'�d~��^�]ZOB�iW͊I<'���
+��lSl��jIz�ڂW�&�T�-W����` ,�
ڄ�j{]��h��2/�u}-/�Ya%�E��+v0{:D���T��)
+��$x4���q[��D>Db��߁D��#��z2����l`
!fL$��eD#v�j��^
�Z֠�/�gg��կe
`��������(||�G���Pg��@���!C�#�%m����c���8�y��6��،Z u���H��շ��*ޥ����Q�v[fŕ�
*e��q�V�uϐJׅ�^y�����֙��58�۝�c��q����׼��bU��ֽ��'� 
,X�KF��qUy��. ��vǰn���Ξw�z;�X
��y��˜Rqh��&�C�Z��Q��`�ھ�zs�g�A}g0�v�
�/N<���֦�����k�����M����@�CKP��n�}7�
�@)�"[K\
��ʴ>��h	�	�����^~
pVI^�<�E+�W #bסѱa�ky
zz�z<<m�o7����+��Ӛ<�9�'/\�pR#-k
`%��S��&��k��q5���@tbq=�!�v[}�1;�ǀ���w
�?äe7t�\6�wA�B�%��Y�FJ`~5T7R��%5�̵�!����x
+CȄ���v뽻
16;8=0
 ������%fT�!�!����R��W
����^�F�:Nt�ˆ��Ү����Ap�5L�#��+���վ-��1���FJ^��P��NZ1�������۹-�+�S�� �
���u�m�Y�H�J�>^��\����{�
+1A}~"�e3N��B?}��
;�r0p!8�������0�ra�m��v#)�1<&��.��FS���m����C�n���p�lR;�|�A��ew�z'f��i[�\L�{[
�ӌ�~�c�B4� +
�9Z�(;� �����H�ѵ<�������M�o����
z�{6��s&�f��І���ڞ[(!I�V�+�ej��?	>
+,�
)��s+�\��N,��0l�n
�o7l��`�>��F�}������~V��
hI �/*�"
Չ}"�T���<'�V���;����)
��ۂ��
�	]�#���
=��Ŝ�ļ��B�
j�9�I��9ޔ��o�K�))����n��Ւ"E��\D5S�CE��r>??�ݮ�JD����Z�lm��
z�7���l���i�Z?������k���ե�UL��dP�V�2[�-\����ф#Z!��|Ƅ#��
+J�Hµbф�.b�%\�n8ẆG$\ą��h��2%�
=
����R
ih���.k�A��<�G�ctX_���p��CoHu=5�0vbq�=�!��v[�}���kyD���i
�C���<tZE"E��0!_g����pvbՔ���E��-��y�88���v������L���N��A�q����*��:v㤢�{�̇�:�}���ݱ:�n��j���n���b���]�ys���!��]	���Fhh%�
%R����
Ջ�6�LgD)�=Q}dn7~��P?���n�|c7
�]�������B�R�"�U
��~����x�!��%��VQ����������7̼'���7�^;�ܝ����ߣ�
�nW�����n}�;���j����C'��~�)�
+�/�^���3h��e�o��}W�gjxendstream
+endobj
+1510 0 obj <<
+/Type /Page
+/Contents 1511 0 R
+/Resources 1509 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1298 0 R
+/Annots [ 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R ]
+>> endobj
+1513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 720.0467 295.0629 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+1514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 709.9944 513.9963 718.9707]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.44) >>
+>> endobj
+1515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 686.1737 289.1579 697.0528]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+1516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 688.0766 513.9963 697.0528]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.45) >>
+>> endobj
+1517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 664.2559 354.2058 675.135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction) >>
+>> endobj
+1518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 654.2036 513.9963 663.1799]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.46) >>
+>> endobj
+1519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 630.3829 273.9453 641.2621]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >>
+>> endobj
+1520 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 632.2858 513.9963 641.2621]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.47) >>
+>> endobj
+1521 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 608.4651 263.893 619.3443]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+1522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 610.368 513.9963 619.3443]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.48) >>
+>> endobj
+1523 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 586.5473 310.1891 597.4264]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare) >>
+>> endobj
+1524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 576.495 513.9963 585.4713]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.49) >>
+>> endobj
+1525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.1769 552.6743 286.0297 563.5535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+1526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [497.0598 554.5772 513.9963 563.5535]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.11.50) >>
+>> endobj
+1529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 404.1099 325.1121 415.0138]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+1530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 391.1584 427.7622 402.0624]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) >>
+>> endobj
+1531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 378.207 371.7468 389.1109]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+1532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 365.2556 377.3558 376.1595]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+1533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 326.4013 291.652 337.3052]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >>
+>> endobj
+1534 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 287.547 336.5536 298.4509]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >>
+>> endobj
+1535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 248.6927 309.5647 259.5966]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+1536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 209.8384 360.28 220.7423]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+1537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 170.9841 282.0379 181.888]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+1538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 132.1298 326.8693 143.0337]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare) >>
+>> endobj
+1539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 93.2755 324.0999 104.1794]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+1540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1512 0 obj <<
+/D [1510 0 R /XYZ 90 757.9346 null]
+>> endobj
+110 0 obj <<
+/D [1510 0 R /XYZ 90 537.9795 null]
+>> endobj
+1527 0 obj <<
+/D [1510 0 R /XYZ 90 505.9166 null]
+>> endobj
+114 0 obj <<
+/D [1510 0 R /XYZ 90 505.9166 null]
+>> endobj
+1528 0 obj <<
+/D [1510 0 R /XYZ 90 423.0837 null]
+>> endobj
+1509 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1550 0 obj <<
+/Length 2054      
+/Filter /FlateDecode
+>>
+stream
+xڵ��n�F������D�=��@[4E�h�7ia02��%�����;��ziJ;tL�������տ#�e�X�hf�!NH�-n&4���?OXsy�����WZe�8�uv��Q�������6�3J���/fs���m���ͯ����z_���?�F�����/�L~�a������w��o�]Avo&�gUv�0�xv3�\�������O}�����$U�
+�ͅ$V������À�A�KB����P�d(����"i�ĸ#�8�3_��났��"/��Ō���ru)v��fM
�QC��a�0���E�4xp���O^;x�J�1)
=x�M��2k�����\����Y�_��	�$qT�N��*��zQ�&FKލꯔ׍ɻ8~k������m��4/o���6����U�_�]~,�������z�/��z��~�/n
'* 	mO���U
��H�
T���3���ZE�����כO��E5�� 0��QZ���"�lZ�qZ5�uJ
�kk��9L�����"�va6�B��ө=?�����|�){.�
+�.7�X��(KE���5�@^���QT��#�y�1:�R4G����{J�9#Rj�ߚ��GS�������C�O�����'ɭ#BS�:ލ���
ONQ�i�`vLK�{��������,�畚
�W9E���*(�r�!�3��a_$n�o'n�n��")��������gw�
+ޱ#G�� ������Q�	N6�/�<�p�������S���t�
��ښ1�,�DK�	�`M��f߼( ��r�j��b��W/�9���7岀��U}����(kU���vfU��q|�(
��kv�g�vO�=�>{"��ٓ�fO
�=��CfO:���!��uy[��1�.����uP݀�g�1
+���� o�p�ތ�bQ��vX�SBKa�m��
f8������8.m'�h�)��>
ZT�;J4w2]4n�hb	��	����x
�]H�R}Bإք��M {0Ca�
&`Gⶰw�a�
 ;�B��`��s��8,R
k���7Պ�"R
��5;"�(MJ	))a\�S�
+2��z�O�ښ�FS���P����C at M����O]���U�_n��v�S1�.�
O6
+������5�c���t�k��
�:���ź�
+o�B̤��v���c�m�
�
�ܜR9
X
��=�����#q[�;qӸw�
I�����b]����mF�3&]#c=2��PA���=�!��ڋ?ȠE�����Ɍ9%�ҁ@C�~�
�7r��7
7��E��
�o:���'�w���X�kƍ"LU���8����`6��~*���U���B�`���na0ñ�
��O�
��q�;��`�N��w8��^�!�h��R�j1���h3/�=�
˗�R�#���/[U�����o��֚&�9�5��z�>
7������Z�4ױY��N�4����FR��
&���� ��E�ķ	�[�g�4�
m����
:c�w�\*b�I{�\�E{��
?r�?
7��E��
~:��_|A/�W���g�%��Bqa�H;J��3
���`�iq�W��)=i���E%��
f(ͱ��Hܖ�N�4���hFR���:�1i����
ǝ%��Q�*�8�(�
fcI�L[��I;�L��ǡ��`�ς�aj��Y�EfA'�Y�N���������@w
��d�8^挲e��k#�h1@��f��5�7ž%����%��O����3
��a
+�t� u
��x��z~)t�/͹T�dHu�&��q�oʈph�0�u���|W�[J_�����g;3����܏T�/�Q�
���?�X+N
+�ie���������}ˇ�߿T?	P�(�(�P�@Fs����J�f�>�cW����|S�_��m��_�E��]�.� U�-
n�*#3�3��/�C
�?}i��T_�'k_�
��0��a�!�������ggwwwd�#���$���v�:�Xιݼz�Wh�z�t�/)'�P��%�y�)����p��[�pT�`*��S3endstream
+endobj
+1549 0 obj <<
+/Type /Page
+/Contents 1550 0 R
+/Resources 1548 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1569 0 R
+/Annots [ 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R ]
+>> endobj
+1552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 696.0019 324.6774 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+1553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 657.1476 385.0002 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+1554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 618.2933 290.3566 629.1973]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+1555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 579.439 302.527 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+1556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 540.5847 331.3029 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+1557 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 501.7304 391.6257 512.6344]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+1558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 462.8761 296.9821 473.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+1559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 424.0218 327.4473 434.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+1560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 385.1675 322.994 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+1561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 346.3132 383.3167 357.2172]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+1562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 307.459 288.6731 318.3629]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+1563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 268.6047 327.4374 279.5086]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+1564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 229.7504 346.2366 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+1565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 190.8961 406.5594 201.8]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+1566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 152.0418 311.9158 162.9457]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+1567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 113.1875 294.7803 124.0914]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+1568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1551 0 obj <<
+/D [1549 0 R /XYZ 90 757.9346 null]
+>> endobj
+1548 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1572 0 obj <<
+/Length 2463      
+/Filter /FlateDecode
+>>
+stream
+xڽ[ko�8��_�okc6
ߏb��L���v�m�X`��@���X�FV�ɿ�KKd)��U[{P���{.�s�xI��(�c#GGF�ԣ�������|	�/S��n.���j��\�n�v
4#�3>���:v�M.�t��o&�\���bu�Xܗ��O���?�F��r��n~���M�m�RB3��ů���
�����=�%�9>Z^H.�����ſ�����C��/�$VÝG[��Z��zœ�3��V��������61
+wq%F��
b��p�$�j�ŝ.��,41Z�=`��omަ!{,��_����qQ-��������U��������_�x����u���(��Q
+*	�a��
a�a��g�
�b�
+
��]pI�gĥ��0�>��ȑ��i�k
w�gG��7�ۆ�o���Ot�H:��0:.���{��b�*�
+~���u5�j��f�ծ����꾹�i.��!}�@�5i�x���Y�&3�b�ɮ�$�0��=��dO
fȎ��wp�d� ;B�/J���l?<�5��tH�(��T�$,����AX
���C
�����j��F��4ec0�٘8̱1�٘�"l� ac>��_��߽�}�PlJ������pQQ1x7kL���p�dkqs��%@
�����<�-��� #��Ix/(QZ��f	�?�W���g�	��;H�0W)W�v���&��q�0G4�gUh@[�1�3\!�ÜB�Q!).�����C��E�2�\����-��g	�'�r
Z�,��h��w�Xo}����|,'���h'm;wS��Q��`��1?#�6�Zg�F3����
���n��]��EB���3��o�K��˲���)�Ӣ.{<�lg�D�����Ͳ��0
����c�.�6S영����Nݭ�	x
<4���~���U�r�7e3
��&���D�$'��sޭ|78e1
3\�Ü�Q)
�u_�u�J9#��
������ �}��U_F�����GaN���,��Z%y�^�Ţ%�N���D�U��
�l��
+�g_Mpq���Q(�F�h�<u�!8����'�.�D������G�,����|'q���!����k8-AF�Z��:��������!_�ॖD�Ë���bD��@0��8�	 ���"��< �#1��~���w��`0@������:Iz��h�$*����|d���.9<��$7�-�+�ڟ�嘝��N@�Ğ���Y�}���
��΁1�e���JU�Ӭ

+UD�P9��nn�Q҈2��&���&
\�5�/\ɽ�{?Xa�F��.�>����J&�X�#��2D��
�x�0�q7����Wyx�̑z~Q���Kv��9b���
����.O��$�j��<�%�պn��r�-�����kPBZB����P�q�1n3�ۉ�
���).���n�C��E�����j9_�O���
�7����
r"����F�DK�
�@ҧY�
��CL>�����&�o���v���u������^w�fIu��}���͉�m].���}��fL�R�Qh��\\p�-��BK
f����up�B�B�/*������SYm���H�!B)7Xj�8q~��
��c�9Lv�"���4�Qn��T�ҢYg:�Y?�	h��S�@�;�U���ڇb[^.v��X�u�l��
�7�H��9e�{3�b�V4�e�8��(�e��"2� �Q>��_TF�����m9kYp at I�7���Jbm��p'��꣢� �L~L�0��Y����\boAE�FT�m�I���~�G�d�{�t���,�۲�ֳc�z�شoM���	zXku���,1Rb��D3\��Ü �Q�)."���C���7�w9�O\�Yr
+�5��
-(�2����
�qRA����*��O�����r�قd�k�9߂aFVQL��
d�0#H7���dx� �z~�Չu�q�
aQd疡R��׍�m�+?�Β�a�%y�ȒaIxK�!����Gs����sC�r�_ힵG���_�ؗЦ����W)�����Oތ��@�:FI�O�ř�1�U(Ѭ[�����am��y�wm�~
+KB��������ox��La�ˆ��MD3\n�Ü��Qn)."����C��
P��GoY�be��^�+l�]ȷ:?
\*��ҧQD$8��F4��'���Z
W�\\���t\W0M���hXC�~��PU%�2�ʃM��yIuP(*����ӷ+��6���/#N�|�p�]��!(���j�bk������z�a5��)G�_��p?vB{z��,�����۲��D�q[0�)V��]�5�G�
+�N�
�J7Uɍ�‰L�9
+%{�߹��n�_B��^j��o~�3���.�;��M��_��޼��zzz"�-y\�7��W���79��mD7���Q/�N�KP�6�vb���r]�!���e��N/�(v0��� �'endstream
+endobj
+1571 0 obj <<
+/Type /Page
+/Contents 1572 0 R
+/Resources 1570 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1569 0 R
+/Annots [ 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R ]
+>> endobj
+1574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 719.9123 305.3006 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+1575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 681.1183 267.1042 692.0223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 642.3244 318.5767 653.2284]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+1577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 603.5305 306.4067 614.4344]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+1578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 564.7366 331.8606 575.6405]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+1579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 525.9427 376.6919 536.8466]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) >>
+>> endobj
+1580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 487.1487 312.4834 498.0527]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+1581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 448.3548 357.3148 459.2588]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) >>
+>> endobj
+1582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 409.5609 313.5891 420.4649]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+1583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.5439 394.9704 273.4737 404.8756]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 370.767 320.7926 381.6709]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+1585 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 331.9731 329.6446 342.877]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+1586 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 293.1792 312.7882 304.0831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+1587 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 254.3853 371.159 265.2892]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction) >>
+>> endobj
+1588 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 215.5913 389.978 226.4953]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction) >>
+>> endobj
+1589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 176.7974 356.7633 187.7013]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction) >>
+>> endobj
+1590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 163.8762 419.7065 174.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+1591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 125.0823 353.7639 135.9862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+1592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 86.2883 302.9395 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+1593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1573 0 obj <<
+/D [1571 0 R /XYZ 90 757.9346 null]
+>> endobj
+1570 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1596 0 obj <<
+/Length 2081      
+/Filter /FlateDecode
+>>
+stream
+xڵ�mo�8���W{��"
�_���K�M��.p�.
%VR�ْ�VZd�
-��$��
�$k43
�C)�
��
ΔP�0.����
���H{�
?M�.�J�d$���~�A$(��d��� 2>'�ћ
�S�G����1(����.�����Ԋ�����'��.'�l�`�X��;��w����wg1�E�
.0"��ly�)s���g��z��v5�c�4��9�HKxz���vh0ީ�P��U�(CX
+x�!H�� jVFg^̆�u�Ԅ���}s���e�)jԏ�
+I3E("��ϻʜ���"�v�4ЅB���6�F�i�9)ێ/�����,
�
��F	GK�1z��7��U&���v��;�V�Sh߉'���Z�7c"F�z�Oo����b�Χ���|�����n�6ϭ�C���0E\�Dp�@��m>��d��
QB��l�~)o��rV̚Ĝ��p<z<���Ms'o�����Qe�|���n�
����Cd��Ī	��X��ތ��!
+��Q�t�
�$'
����|YlV0 at mv�K�hPh�@ ƏK���
+햮��0�LM��~��|ʍ��J}Ǩ�Hr���0�?
:�!εH���l�&.ۋ����0�äo�j鹫�/��qSW�'��W$B�0vd1�����Mp�
�̚&܋%<TI�]��
���? �n
�&犫����X�u�

8�B�	��%)�N��Br$
��t�b�:f�p��걾�
k84�T��Ixh]8i�P�,�C�A��`�s��f&��N,����X������
��
��~܍�^�Ʀ�

P)jH��R !9IRS�3&��N�3�o꼜5	�&�_�
��� ��*`;��)Z6ˊ
N��.lJE2<�d�Kfx��s�'�
���۬m��8���B�t���p'�rc�w;�߼��z���������?
����$���K%��p!���:��e�:���'��Nju�Y�������qy[���}oe�����ż*�2��M�x���SX�(A�K�(����I�
@B��!$���
�p�q7	��D,�T�	X�!E��:A�� }F(;j$u�Ppb]���Q`F���D
+OD	�	�X�Pa��]�B�n���PH�1��G���W�d��eH�0p;ipR	?(LƘ�{a`R!*�>�PG/ց�]@��mn��\�6�%��
1�S{=^,�E�0�Eܮ�"�{ 
�pwc����O���a��.���q=/��r�T5�pP�7o�F�pq��N�
cF�E�7g
8�� �ډ50�I(
%�ڮ��;�Q�۳۫��Y)�#�w�|���p�(�M�>
�֟�ܣhր\,�ղ(���M���m�!<����nׄ_�z�\ˍ�����T�lD��bIpC�pv
�
�ip�� 7��@o��n̉�G�K%�Ê	F{���uA���*�$&�pC
p��v�������Ҫ�y���
Faބ�[�c��eq���y���iŮ�]��
��S�l�
+b\9�4W1�Wq����nݴ���Ŵ
nT1���y��V<�N_kr�x6�Aզ��:=�$�
+)NH<X�c$�9�~1ʾ8O�}^�y��D��P�+6���>�۳{�^jf�Us���*��fn{��r!Z"�^�*��kh�*�bIB�v

���i��&!X�j�4m�܅��épm�
8;ɻ" �u���b/�A��t��{���@�5�T��[C�
V<��Ћ��Ơ���P�v;Pغ����۷Wo�.?N���\�0�
+BzN�e��'��MR�ǩhkz[��|���}4���Z	���`	éW�^,�$_��&�X��O�
̰�z榺�]w6<~��@9D9�u"7H�s>���D6����ۚN4R�t�H�;�t[���(�}��s��t��~��~|���eS��n?�i��C^>��
��UU���p|�w	�HԹ���xM��C�n����o���P�
8�hjZ4y��6�k]�^]\|��
�m�c9_�Ѽ�X�@0�T�b]���B_:��"�`�
}�
����e^�Z
�ӕ��T�endstream
+endobj
+1595 0 obj <<
+/Type /Page
+/Contents 1596 0 R
+/Resources 1594 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1569 0 R
+/Annots [ 1598 0 R 1600 0 R 1601 0 R 1602 0 R 1604 0 R 1605 0 R 1606 0 R 1608 0 R 1609 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R ]
+>> endobj
+1598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 696.0019 303.4776 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+1600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.1066 615.2394 267.6425 626.1433]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library) >>
+>> endobj
+1601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.1066 576.3851 327.9556 587.289]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators) >>
+>> endobj
+1602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.1066 537.5308 173.7253 548.4347]
+/Subtype /Link
+/A << /S /GoTo /D (namespacestd) >>
+>> endobj
+1604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.7309 457.7446 251.7824 467.6722]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ge19dfe022c51c874d905e2a7c81c18f1) >>
+>> endobj
+1605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.7309 418.8903 251.2245 428.8179]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g8458e58a5e857de11c35ce3076a70ab8) >>
+>> endobj
+1606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.7309 380.036 264.5047 389.9636]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gbadfeba0a415d210cdd6d7309365e800) >>
+>> endobj
+1608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.7309 341.1817 243.1052 351.1094]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g7a529f51bfebdd4b3e69c866dced9bc1) >>
+>> endobj
+1609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.7309 290.3922 213.038 301.2961]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g79bd3696a302bb721ef8168fa5d650fb) >>
+>> endobj
+1611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.0118 209.6297 348.7373 220.5336]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+1612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.0118 170.7754 360.9016 181.6793]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+1613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.4548 131.9211 421.5541 142.825]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+1614 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1597 0 obj <<
+/D [1595 0 R /XYZ 90 757.9346 null]
+>> endobj
+1599 0 obj <<
+/D [1595 0 R /XYZ 90 632.3103 null]
+>> endobj
+1603 0 obj <<
+/D [1595 0 R /XYZ 90 475.7421 null]
+>> endobj
+1607 0 obj <<
+/D [1595 0 R /XYZ 90 359.2987 null]
+>> endobj
+1610 0 obj <<
+/D [1595 0 R /XYZ 90 226.7006 null]
+>> endobj
+1594 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1624 0 obj <<
+/Length 3436      
+/Filter /FlateDecode
+>>
+stream
+xڵ\�r�8}�W�m���;�ysb%�[�Xrv��Rl�q�ey$y�٩��m����Ǖʃ#�y�8� @�C
+�ء���ʈR^���
|��U�Gp|�^�^������>�,,hFg�p~���6
1J���7�
G\������qy�*?M��������g"h6�m���x��VQ)��u���/���k��J����g�@	3��$�������Ny�8!vq��>W��Z��������v�����bQSJ$���KPxS��ƨ&R��Ɏ��+��Q8�CPI���e��u��
+�5�+
��Z~��M���#��X�]�����r�^.�7w_>��������r���o/V�ǻ};@�iBs���8�r�2��FX����\�)�X��#���}q0���oӳ�ӣ���
�<Ӽc���DZ���3pjɄ�}�qx�}`'fq24|0o�(yN`�di^

+	,��E
+I(�y_^

s���edC:
	z�(�9I�R�	
i��X�H�e�#�DѸ�:��CE�m+��)ɔaM�ݣ��#��V{����vl�e��$�Ƥ�i[�S�Ai����+�wBJijX6��`�+F��^[djTh-.2�D��ޜ8<�>��GdN$��!�Ns�PHP�5D`�q�	L�}`����w
��DS�1��`)��a��4������n�$
+IЅ�\�4)�DZC�ʚ�F�W�԰>}��dz9[L�o'����� �R�V�A
+�0�%Hh
+mL#z����n/9~W�:.���2k���!L�ޏ/ޞ�
��;���@��࢙&�<>�j�ȇEnr`-�cYu��;�j<�>��'��OR)�Y-��(ŏC!���)�Ü���/?����H�:�2��3����M1ÉV��Riu1�a5h�"w�m+�a*�I���
�BB�
���̲r4
Z
��H+�v�T���Bk
}�&���Bc�[6{�ԛ���l~���~t1 !�I��š��Bk��	ƥ0Z�%��1���&9uäa斛�tG�;��_�<�J
+�
t�0;(ܑ\
�щW���u�mk�Ҍ0������n��_

ۿ�-�9�J"�8]h
"[ܹ��L�'�����$ǦO�
n20�ٌ��95
+�.��r ��/9����$���83C�q($���F����q߶�R5*X�<�V��-a&�`����j��b ���]��L��v+R�Gݷ��̫���"AG%���9�DZCIB�3:�'|J�*Tf`�u�
�y�2ތ2��
+��-����X������1�-�=x��p1�t0�s��
�N��@��[���œ���՗
+4��r�1-��؜DH��s۵rFh���C�|X����Ӻ��
�:�}`��O��� ��>S<.
ɥ�sj'�Y�5j��"�&���2it���e�		1s�
t^N�.�o�N��6���l+�v��($8�@!b����g�i-'\��O��Z���r.	���#�F[b�,��r��O�J�r:��v��- ����f��U�>���+K��Ր���CF�����v�i���^U����q_�œ�k��Y|sC��E}Ɍ�X`�K�RI"��Ȓ���K���Ē>��%��7��/!ym��
:5
� ��/�o
�o�oǷ�p�����2M�C!���6C�h#��‡�9��/7���������xq\�q;X�(�Dȡ�Ck��JN���Cz�T�V�g�sy
>��9c��-!(
Y`�c�!�F�d���m��`e���8�C���$3��Nf��,3if\�׏��
�ݲ��
�6�|d�����a9�1b��IA�d]�c���X9��7�V����)"un^T�=�r^�l@�H�E��Zd��U�%����f�V�]wɦ�G��[ula��U�B
+����7�(؈�Z�~����z]�1�m���
��ћս��Z��V��}�!OM��y�%�B���Lg���mE�!f�/G���,]N'0Y��;�u���j�,����v�Q�g<��OH%o
Cy���+�\�)�<7�
V-*�P�$�h#�NA��A��Ɓ����H��ـ����nM��W����^��j���ۗ�\��oV���T��(U_qT
Li&�5
U�`JT�~]^�~���~{llF"����|W��������.��Phq�H��.
+�OpNre�ُ�{���T��3V��R7����g���_�E�<7�cd��@!�������m6������n?b�.�&UЍK� �6�B�"�+;�(CkH�a6�D�?{�R�S��"�.�h�)?
+�.�ֱh.	aor

s�E�yw1>2����I2��b�R&�r($��Z:�������'$2���GVL��|fM�k0;�PH������H	�EO�

u߶�Tϝ�,ʥ@Hr($J�C�"oF���Y�7ڼ艸o#��9X1��*|پ�2�ݽ�e
+
�W�޸�[X
�
�����
2ݽ��Ԡ��F��
.�ü��7����cvѬ�Y?�3����,��-w�pz�i��'ir($HaJ�f�u�Г��W��C�/{�����~���N�N�u�����<�p��Ԅu��W�F
*��l������-���
+<�;��&�lRp�n����E��f7q�n=�Pl9�;&;�@���� i[�x��$�y�p�xâ�c��(}Gӟi%re���4;��'r(�VA��+�
N�
��6R���R���j�u�a�z�ތ�����	:.����	CĞ�:Z�|������S�o�<�Rɛ~��cv��?{�߮o�[>`8�\��WZ�
+
+��$G�D(�hn�<5"�M=	z�Mi��ݗ��v:�NN'?W}��,|���
�ˡ(Ce�פ5�a��X�� 9�
��{Y�Q�m�hz�
��&HZ^i�

+�P����f���
+�@ #_�׷�PW���
��5��n�e���}E��vuTaOp

Y�`Jd�~���~�"��k��[c+8�m����v�z����ǰ�׊h�ei�

+�PH
-y3Ą���Ǔؤ����$�r�v|4��>/
+&˵x�x���(C�	N7����P#� ��u<_�O"��4�&��Tx�}h����k�Ga|\U�k_�3B��	���
m3�S�2�u��Y�F>,6\���s���<k9M
�
+��o����X�	�$��(�8K�PH��f(*y3���U����*�g#U�j�s�n�?U�K�J5(�zµ��ӮbBO�Y�$ڮ���'T�bQ`�i���פ�*	� c�e]&��ע�!JU_�5).��uV?�U�b��r���c�Ԡ"�ty���+��+U�Okj�ݹ�B����(#C�W:��Vџ�Q�� 
�ʣ������K@���wF�Y�wɁ]{����o_����3�ڑ��ۇ-�ݿzx�{�*��Q&�q���4藔CA�����H�Ͷ�
����:�q��&X$���Rendstream
+endobj
+1623 0 obj <<
+/Type /Page
+/Contents 1624 0 R
+/Resources 1622 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1569 0 R
+/Annots [ 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R 1670 0 R 1671 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1679 0 R 1680  [...]
+>> endobj
+1627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 697.2473 277.0768 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+1628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.3071 288.9724 692.211]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a896b8890edb38e9960c455aa178e508ba) >>
+>> endobj
+1629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.743 681.3071 429.25 692.211]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8b30277f972f730fe26f6cfc39098cc77) >>
+>> endobj
+1630 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 681.3071 513.9963 692.211]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) >>
+>> endobj
+1631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 669.3519 176.7741 680.2558]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) >>
+>> endobj
+1632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7629 669.3519 318.2922 680.2558]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) >>
+>> endobj
+1633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 653.4117 252.4397 664.3156]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8d5e386c6a05c9656eac42fe9e2cdd8b5) >>
+>> endobj
+1634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.0184 653.4117 411.4419 664.3156]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8c77955fc77a169347da8820b46c3247b) >>
+>> endobj
+1635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 653.4117 513.9963 664.3156]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) >>
+>> endobj
+1636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 641.4565 176.7741 652.3604]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) >>
+>> endobj
+1637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7629 641.4565 324.3794 652.3604]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80d808c2d0d6514c33e06445d7aa34270) >>
+>> endobj
+1638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 625.5163 326.0431 636.4202]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd640c30f757e4ecccd08ac527536ca6) >>
+>> endobj
+1639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [359.975 625.5163 513.9963 636.4202]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) >>
+>> endobj
+1640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 613.5611 170.3982 624.465]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) >>
+>> endobj
+1641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.7179 613.5611 380.1098 624.465]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd) >>
+>> endobj
+1642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [385.4295 613.5611 513.9963 624.465]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) >>
+>> endobj
+1643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 602.3232 193.6509 612.5099]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) >>
+>> endobj
+1644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 585.6657 267.0349 596.5696]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89606fc251d767040929d3e2645dbb446) >>
+>> endobj
+1645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.2238 585.6657 470.2111 596.5696]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e0c660bfcbcd3d10c3e764e22f41d0a1) >>
+>> endobj
+1646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.4 585.6657 513.9963 596.5696]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) >>
+>> endobj
+1647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 573.7105 257.1721 584.6145]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) >>
+>> endobj
+1648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.1609 573.7105 449.0511 584.6145]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a1bf7bec2cb0d949e45c3cd0e25874a6) >>
+>> endobj
+1649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 557.7703 298.9251 568.6742]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a85912e00d1de38a643d48af1f0e5dd35f) >>
+>> endobj
+1650 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [303.9011 557.7703 473.424 568.6742]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fda2f32e2fc3f61357ce0d9d7813f5fc) >>
+>> endobj
+1651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.4 557.7703 513.9963 568.6742]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) >>
+>> endobj
+1652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 545.8151 282.6364 556.7191]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) >>
+>> endobj
+1653 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.6252 545.8151 472.3136 556.7191]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd1bad185f4622d07b171767dafc78b6) >>
+>> endobj
+1654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 529.8749 292.9975 540.7789]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a0f28596ac7d4a43766fab174c28ccab) >>
+>> endobj
+1655 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.9136 529.8749 473.4839 540.7789]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8261922c7bb53bf71459671df868e55da) >>
+>> endobj
+1656 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.4 529.8749 513.9963 540.7789]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) >>
+>> endobj
+1657 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 517.9198 346.0185 528.8237]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) >>
+>> endobj
+1658 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [385.4295 517.9198 513.9963 528.8237]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >>
+>> endobj
+1659 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 506.6819 250.8461 516.8685]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >>
+>> endobj
+1660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 490.0244 307.7917 500.9283]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fdd3365de1a07c7f7bdd1dc330bba8f4) >>
+>> endobj
+1661 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.154 451.1701 312.7927 462.074]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+1662 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.7958 451.1701 511.5056 462.074]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2beee33de6f8542b0228161d044640eaa) >>
+>> endobj
+1663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 439.2149 279.7173 450.1188]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2a57b0c1a34eced57ca8437eea92a4328) >>
+>> endobj
+1664 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.5432 439.2149 473.2466 450.1188]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb20f182c5824807f7bc66d2d2033810feb) >>
+>> endobj
+1665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.4 439.2149 513.9963 450.1188]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >>
+>> endobj
+1666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 427.2597 301.5955 438.1637]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >>
+>> endobj
+1667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.6697 388.4054 337.1411 399.3094]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+1668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.1757 388.4054 511.5056 399.3094]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e757308990edf84fcb94023ff4a7183bf3f8dace5) >>
+>> endobj
+1669 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 376.4503 260.7484 387.3542]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e75730899c7753e1dd51e1b7b3fdfafa9f8332370) >>
+>> endobj
+1670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 337.596 321.3604 348.4999]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+1671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 321.6557 282.8854 332.5597]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae556cc08f48e769b9c15bea83d5d883a1) >>
+>> endobj
+1672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [318.1221 321.6557 511.5056 332.5597]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312aed8db7109fb4bb50360b05800dd245416) >>
+>> endobj
+1673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 309.7006 260.2405 320.6045]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae3e4424ce8e7ebe86e125541b561fc300) >>
+>> endobj
+1674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.2293 309.7006 478.1918 320.6045]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae079e4b80f17b0095497103a52cffa3ab) >>
+>> endobj
+1675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 293.7604 304.4644 304.6643]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae94cf20719046117aece5acba61dcae4d) >>
+>> endobj
+1676 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.4532 293.7604 478.8394 304.6643]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae8191bdbdcd041a9859ed465d16062ab1) >>
+>> endobj
+1677 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.9257 254.9061 358.4741 265.81]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+1678 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 254.9061 513.9963 265.81]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) >>
+>> endobj
+1679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 242.9509 285.3561 253.8548]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) >>
+>> endobj
+1680 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0027 242.9509 513.9963 253.8548]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) >>
+>> endobj
+1681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 230.9957 180.1017 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) >>
+>> endobj
+1682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.0905 230.9957 386.9246 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) >>
+>> endobj
+1683 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [169.4815 192.1414 363.3624 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+1684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 192.1414 513.9963 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) >>
+>> endobj
+1685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 180.1863 222.1435 191.0902]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) >>
+>> endobj
+1686 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.1323 180.1863 412.9065 191.0902]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d6540e1a601a53491f60c89282fde55b5352) >>
+>> endobj
+1687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.8178 141.332 366.6899 152.2359]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) >>
+>> endobj
+1688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 141.332 513.9963 152.2359]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) >>
+>> endobj
+1689 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 129.3768 286.5316 140.2807]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) >>
+>> endobj
+1690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [306.8447 129.3768 513.9963 140.2807]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) >>
+>> endobj
+1691 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 117.4216 162.5576 128.3256]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) >>
+>> endobj
+1692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.5464 117.4216 406.6304 128.3256]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a278fc3e83d58f3eb97a8041b600870a05) >>
+>> endobj
+1693 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1625 0 obj <<
+/D [1623 0 R /XYZ 90 757.9346 null]
+>> endobj
+1626 0 obj <<
+/D [1623 0 R /XYZ 90 716.2211 null]
+>> endobj
+1622 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1748 0 obj <<
+/Length 1641      
+/Filter /FlateDecode
+>>
+stream
+xڽX�s�6
�_��
f_k���֦ɖ.M���ݮ��d�I�Y�'�Mӿ~�Hɲ-'���`~� ~ �"�	4�PH3.�8
����=��q���dpt*E���T�뚃$HPB����P#2������ј
+<<���Utc��,�Lq
�v*����>M^N&�X��`�X�
>|��
�{=���Pw0��hM�t�)k&�����-�Q�';
eK�jt�G��"�f
S���1��������#X"�B��c�~�Tl�"NQ��A�-�cr	GK�)7γ�rN������݈�o�9:�][���p�\+�1sD�@Nfw4�G�ET%�a ��aH� ڭ���\u���@��k5�
~M��e���5�"��'�"*�?�fQ6ϳ��D_�&+k��vj�q�.W` km��`)�~�K���5�
��{���(����~�
a�c
+ą\�W<<�X?S���aВY�/���yb���T���2�o����fiq��|���+��
+I�8�Z��B���{9%��a6��M>�LAT͝��L��}7&�Z�D�5��Ln}����t�0�ɜ�=�ko����!?m�'AM�_����g��ț�Q�^D!I�s�;���Ë(5�2�3��l�sb�u|����R(��ܑ
Cp�f�ds�u䖎�:/�n4�'�cb�a+��k��|U�=ŷnT&���8�yTE��i!�E���A��2F!qs������B3o�Wy�Z��K���>�:������������wgo/�o^�~{�q(tMކB�������YsKvc���
\r(J��P�-���?�h�'�϶�O��^���W'�����= W��ܤl/�
Dv��G���'�u�e1"��P��q4>ӖU��I2�I��G����T
��t	���B��G5���'�	���BJ*�i�=L��s��ML;�7^*�jT�y�D���v�V��sC�Kc���
+<�
1

��lS at r��ԩы��C4K�\D��岛
�:~�چ��$X��E
�P��
K��'���
�B��7˫[�@�%�4��}:M�nڭ�G�@Z)��c��<�|
�9&H	�����˓�H3�
���`�����!�D��Z�_M�?�a��
�^
���0~�O�fH�������oi�c�r������PC/u����5+� ���
��$\#Nێx�f�����t#K�K������k��p4�^OkOd�,�{Q2V,��(q�mf����_�!3	$��Mz�� J��
+�<�V�~�uG�4�쁵������Ch�����66U�l�|5Ӫ�=���7��f�������J��
+�dMm6���I�˕�V����V����ͪ�z�VcֶE�
|jҼ���3�?|'~��f�?��Lyh
���a
��oONOώ�N.&���'��87׶lj��񆲱K�H�r
���d�afQ��Ѭ��_o�81�a�u�J�z����`�/J
:)�w}/�����]M�_൪X蟜���7��~+M��J��ߛ([5�d+l���]r�dB�i
'41
\j߂�LBy��M+��?�f�K�Is`�9�^٪y��~[U��GGwww(.�*K�J���rq��
c��byo���a~��T8�Х
�t�^_?]w��~��Q�oB|1�endstream
+endobj
+1747 0 obj <<
+/Type /Page
+/Contents 1748 0 R
+/Resources 1746 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1569 0 R
+/Annots [ 1751 0 R 1762 0 R ]
+>> endobj
+1751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.8919 697.2473 469.6632 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g00a906832c41c42a70a5c9d194e07a7d) >>
+>> endobj
+1762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1749 0 obj <<
+/D [1747 0 R /XYZ 90 757.9346 null]
+>> endobj
+1750 0 obj <<
+/D [1747 0 R /XYZ 90 716.2211 null]
+>> endobj
+1752 0 obj <<
+/D [1747 0 R /XYZ 90 659.9272 null]
+>> endobj
+1753 0 obj <<
+/D [1747 0 R /XYZ 90 571.647 null]
+>> endobj
+1615 0 obj <<
+/D [1747 0 R /XYZ 90 549.3353 null]
+>> endobj
+1754 0 obj <<
+/D [1747 0 R /XYZ 90 549.3353 null]
+>> endobj
+1616 0 obj <<
+/D [1747 0 R /XYZ 90 512.0492 null]
+>> endobj
+1755 0 obj <<
+/D [1747 0 R /XYZ 90 497.4789 null]
+>> endobj
+1617 0 obj <<
+/D [1747 0 R /XYZ 90 464.2874 null]
+>> endobj
+1756 0 obj <<
+/D [1747 0 R /XYZ 90 449.7171 null]
+>> endobj
+1618 0 obj <<
+/D [1747 0 R /XYZ 90 414.4684 null]
+>> endobj
+1757 0 obj <<
+/D [1747 0 R /XYZ 90 399.8981 null]
+>> endobj
+1758 0 obj <<
+/D [1747 0 R /XYZ 90 271.5978 null]
+>> endobj
+1619 0 obj <<
+/D [1747 0 R /XYZ 90 246.4069 null]
+>> endobj
+1759 0 obj <<
+/D [1747 0 R /XYZ 90 246.4069 null]
+>> endobj
+1620 0 obj <<
+/D [1747 0 R /XYZ 90 211.0237 null]
+>> endobj
+1760 0 obj <<
+/D [1747 0 R /XYZ 90 196.4534 null]
+>> endobj
+1621 0 obj <<
+/D [1747 0 R /XYZ 90 161.2047 null]
+>> endobj
+1761 0 obj <<
+/D [1747 0 R /XYZ 90 146.6344 null]
+>> endobj
+1746 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1766 0 obj <<
+/Length 2935      
+/Filter /FlateDecode
+>>
+stream
+xڽZ[w�F~����J'QO_�f�
�3lj-{ly��&9:H�6;(��8�>�t75sɮ�������*a�'��|yb�ڞ���~B��)\�6?�O޼|�PP1�?V#�8%t4_�<�L	�x|��w�)�x|�O��)VG�i��J
>�ǂM~��xr1��j�8D����_�h
��x�
>z��H���ģ�
lN�O>��
�
}�	�y:N;OG‚���n���We�c2�
ն|��j�,�'������8-��(�������Lm��nokd��GJ��	��<ڨ3�ˁ��ތ���2^�V�<O�'e2I��M��Q�������q1��SBP�9�
�H���
�������_y
��Oq�Q���Wy�k
h��ӵr�8�C���
��t����f)�Lf��x7��R�U����笈�IpN>��
���Ϣ���BI��q�� �M,�E��9
�QIpwqz~}���c��
m�p$<����^��ԦOpz�jت�G��>Z�o{�A�
��

��u[�
���G����w

7Qк�\
0J<b!ZF�ϱe�Q�0l۔W�'
�kZ7���Q���׷�KXqny���=�~z��>��մ/���'�/���Y�r��-���K
+���q�I"}�1�5��O���Q�F��ݟ��&*�
�r�(
}��9L7�J4pb�z�X���.CmJ}��t�
+�*<N����*S�V
;0jg�,�(=�g���h5���u�F�otu�_F�?�bǣ X
�O�
��F����Դ{
+�`\��(�T̸W,ϖ=�z�1/�8u<�
~�=k\���s��$g)^/f��Ҏ2*�)
�$ը/��債�P�W�Ġ稄�
+�}8~I�gM`Y(�Z��Wv�&Y�
񪎥,��Z��sJ8G̃@j��a��m=�Yo�u����Ǚ��^��9țer�x��|��#�VE	��2۩�U���H
��n5�6׮,��*�/�4�P���d-7�6౷X��UK��daW�������]�g��yX㟕�j��0ň?&��cF���Vxj�%L���)��cOe�<:{�ja>��%��b%[ڜ����j�X=sbl��ڼ��n��@%��9�
�j�h���fj�يGf��QM\�\{���"���ȜX6|�\#��4[X
T‚i at 8 �i��[��t��u�V�;���X��γ�^B���A!��a����a4u�mk�6Z��g�6���:�Wjuy��..dx۫�d�G�z^e�6+�Di^.[�r�m
)f�U]Kъ4��m\�b����ճ�n
8�PI�<�	�T_4�iew`Pi�&`,�C9S�a����"E��(�ݳXi��D�*<�a�5F�n|<[�n�O�,'|E6��(�x{)�ą���orh#��"W
+P3#�t��g��:�zׄ4`.B
�"dq5!��*��Gl�m�͇G
}޶=7u���m����JU����vjв�3��w=�� "�s�h`���=Bch��v
ʶ�!���`�e��'p�2yꠑa�6���E��)/>�4��pȮA�v;42D<��~�5���J�)�Y�"��A���9�
��=BP�����8E�#̼!
5a�j��g}��9L�ۮA�v�P���\��gPT�^Y�[Rc�b�[�b��tR;.6��Zl��~�����
�nL@>�|P�
��O���!����[t6(�p��Q(�ۆ��PYPu����s�e`�N���=�/.g�.g��[M;a�]
�d��n�I �Tk-f�!�@���*~�{�4)5o�4���k�+���Tx

+)�8o���E���E���fN|��{wU����s���vĀl?:|�И��8UD�.Z����Z�3B�v�H1I"
"�s�h`Z��W.93"��s�P�l,��}�V0�?({(�A%6`.
L)����3��`Y�T�<�Q�'m*q =�����⮗�o!��bH�M���f��	��әe
�!���
ʶ�^F�@�E��,+[�R�2�K�Ee
M�!}5a.~
L����|q?�[<�~��:S���
�v���G!�bmβt�a��R�f�<���D�T!�DQ�_F
tq0Ct5`.�
L�u~�q�;��M�
@�����l�"DAۃs{ɺfj��؟q�9H���pPC
��S�@�_���˭�!�|��
�v��!.Q���l�/�u^�I�y��|?]%�]��t+����T �1X�\�)Ё=)�>�����t�6���sy��L�Z:ʞ�x&_�AZ01v�����4��Q���m�h\�����'��OjLK����;�>9�J
���Y�B�> ��rpfP
�
��&)�1b��Nj��B�R ����5�j�n�Z�C��-⇈dH^M��*;pu��C���
0(��wV, ��
��/�
�ůM^�$�h��`2�j�qy@���(�$�cY
�+�ۼY�;�dȋm�?����L����tm�*l�ϒ��/���k�\<�"��Ý�G�ô���
�J�
��A�*�� ӶG�Z�۾��0�L�����ى��;�
����wE
��Y�R�B�:S����wA	�*
.� ˥v
���.=t��fſ�k��:��8����9�k�~��C�G�lP�
��}������(
��W5���3
�o{��3�E���zXOC�
��
��z3��ܝ/�n�o��:-�S�۾A��;�X 	�[��,�$k^���Q�=���x�C�y�\c�D���L�$a�!
+}���cӉ֋�[9���}h>?�_?7�p{(��2��e�:J��' ��7����@\Ż<����b�`��������B!'�͒��id�~jD��aڸC}[�7
�W>�sY�޾y���Vڧ�.GI�f�ۼ����醦�5{�d�Ң��
-_�g6��ׯ�����
��w�+Dg�endstream
+endobj
+1765 0 obj <<
+/Type /Page
+/Contents 1766 0 R
+/Resources 1764 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1569 0 R
+/Annots [ 1768 0 R 1769 0 R 1775 0 R ]
+>> endobj
+1768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [131.8436 670.9089 188.4709 681.8128]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+1769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [193.3385 639.2792 267.7191 650.1831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+1775 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1767 0 obj <<
+/D [1765 0 R /XYZ 90 757.9346 null]
+>> endobj
+1770 0 obj <<
+/D [1765 0 R /XYZ 90 577.9973 null]
+>> endobj
+1694 0 obj <<
+/D [1765 0 R /XYZ 90 553.7826 null]
+>> endobj
+1771 0 obj <<
+/D [1765 0 R /XYZ 90 553.7826 null]
+>> endobj
+1695 0 obj <<
+/D [1765 0 R /XYZ 107.7135 477.4818 null]
+>> endobj
+1696 0 obj <<
+/D [1765 0 R /XYZ 107.7135 461.7923 null]
+>> endobj
+1697 0 obj <<
+/D [1765 0 R /XYZ 107.7135 446.1028 null]
+>> endobj
+1698 0 obj <<
+/D [1765 0 R /XYZ 107.7135 430.4133 null]
+>> endobj
+1699 0 obj <<
+/D [1765 0 R /XYZ 107.7135 414.7238 null]
+>> endobj
+1700 0 obj <<
+/D [1765 0 R /XYZ 107.7135 399.0343 null]
+>> endobj
+1701 0 obj <<
+/D [1765 0 R /XYZ 107.7135 383.3448 null]
+>> endobj
+1702 0 obj <<
+/D [1765 0 R /XYZ 107.7135 367.6553 null]
+>> endobj
+1703 0 obj <<
+/D [1765 0 R /XYZ 107.7135 351.9658 null]
+>> endobj
+1704 0 obj <<
+/D [1765 0 R /XYZ 107.7135 336.2764 null]
+>> endobj
+1705 0 obj <<
+/D [1765 0 R /XYZ 107.7135 320.5869 null]
+>> endobj
+1706 0 obj <<
+/D [1765 0 R /XYZ 107.7135 304.8974 null]
+>> endobj
+1707 0 obj <<
+/D [1765 0 R /XYZ 107.7135 289.2079 null]
+>> endobj
+1708 0 obj <<
+/D [1765 0 R /XYZ 107.7135 273.5184 null]
+>> endobj
+1709 0 obj <<
+/D [1765 0 R /XYZ 107.7135 257.8289 null]
+>> endobj
+1710 0 obj <<
+/D [1765 0 R /XYZ 107.7135 242.1394 null]
+>> endobj
+1711 0 obj <<
+/D [1765 0 R /XYZ 107.7135 226.45 null]
+>> endobj
+1712 0 obj <<
+/D [1765 0 R /XYZ 107.7135 210.7605 null]
+>> endobj
+1713 0 obj <<
+/D [1765 0 R /XYZ 107.7135 195.071 null]
+>> endobj
+1714 0 obj <<
+/D [1765 0 R /XYZ 107.7135 179.3815 null]
+>> endobj
+1715 0 obj <<
+/D [1765 0 R /XYZ 107.7135 163.692 null]
+>> endobj
+1716 0 obj <<
+/D [1765 0 R /XYZ 107.7135 148.0025 null]
+>> endobj
+1717 0 obj <<
+/D [1765 0 R /XYZ 107.7135 132.313 null]
+>> endobj
+1718 0 obj <<
+/D [1765 0 R /XYZ 107.7135 116.6235 null]
+>> endobj
+1719 0 obj <<
+/D [1765 0 R /XYZ 107.7135 100.9341 null]
+>> endobj
+1720 0 obj <<
+/D [1765 0 R /XYZ 90 89.4414 null]
+>> endobj
+1764 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1778 0 obj <<
+/Length 1945      
+/Filter /FlateDecode
+>>
+stream
+xڥYms����_�o�gkE/H@��nܽn;M��{ێ��J���q���##@Xdogg�`z���7	2��
C<�B��z;��'��Ӏ��x>���
�}'�0D��b�|<� ���r��(Dd<!�������*J�ѓ,�fi!��h�n��#�_~?�.+��g�(�~�
7���F,
��n0"aH�ہG��Iw��q���&�	{��(CXpff�<D�
ezؖ��<��m��S<ʒ�g�ɣ�U��G����mvH7q����s5ݳ�8������J3]��s�.�,ݗ��Y^^Dy\<oe���u��
��EmQ�0	��

�:%1�I
e��cc�.�)�!����m�)�%��-�f�5�`D�W������ru��(?�-6�5��-E��Y4��B�0�b�V�\�"S>z)=dS.>���� ������H����F/Q��^�{Ro��`.i
�)���e_p�^�cߠl���brѶ�5hkj$��!:�遣��.��W~��
B&�^��5�Knk�=�4_�N-!$#�P� �AS�P �b�b��C��?��1ᣧ1E�|[���I�2R�(���_
+/4�0X�[�?$�
4}̚���O�
��O����u,�k1(�{L{}�s-��5c�P���|:��^��P"*<�ͥB�\�B)T(NM*���fZ�Tʍܜ�R��X��)]�����M��C�-��E�Sy
�H{a`�D����(	�J��̌��%��zy)�d�X��4�[5�ު�C�n4��Ѹ��Q�P�j>�
f�'U�~�^r���ほ^�Q��%��)yw��2�pl�E�cW0E�~>�iz{gg}�}�S�
+e�n� ̅h�^�;��[�����6�j7D}��ԗ�,ї���4G�
�S�bB��TQ��5���^�,?[�=H��{
�m�)'?fu�4\�)�������{�
�B[ӱMj�����L��eu��}�W`�2�_�$�o�X�X�
8��:
�
Uy��wl�q�{Y,�ݫ�)Wӻ���v_+`IԫN*�m�Ղy��94�����O��/v�'`6���
�`���������
]\ٽ+��n"eiuG���&������#�<D�i�
2	�O��%��
��)�}x��coe"���%M�(�q�7��5}S
>�N/Ɯ����^g��#!7
�ٴ:6
�@ȕM6���#����)�!�Yu�K.k�ՙ[`�p��p0(���۠!�[
�"9�`>b��:N
�R��
�޻�G�O��#bP6�V��H�|�E�4�w��s���������v��/q���D��z
t��q{�^b���M6Y���jM=��|w���NWk
+�~�E��j�e��N�nw�`����j������zvq��������2�D�;��B�p*R�l2�4
b�i����@%�}1YG��ށ��66.�n��s�M)G��}�s�f`����(�K0�
ud�dQ�lM��mLD��%��m�.K��.U�����
Tx
��x���(I��
++�#�+������\<�}�U
�����l/�]zc�Ra�fP�lM��@���M��������#ud?���o�+�m�w�C�VG&���&��㇤:=y@��(�3 !
vW�pg�:�t$
f
��=�˸ë,�^U����|v=�_�^�
��
��-����[mF��д���0Z9TV�/��t�A�/xHz���r�bPGR���0 ���YZ�P�fM�ї�%�C
"�Y��4<T�J.����GaL��(�Y����#��'T\�[��d����^��(������j�~�
�S�J��w��><%�
�NJ+A���4U*��14W?�r�yaR{�
n�6ek\5��؝�������

�x���8�풳6/CJ}�Z�I��4������ԹT$��9KV���ʽ,?R�];���T��endstream
+endobj
+1777 0 obj <<
+/Type /Page
+/Contents 1778 0 R
+/Resources 1776 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1786 0 R
+/Annots [ 1785 0 R ]
+>> endobj
+1785 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1779 0 obj <<
+/D [1777 0 R /XYZ 90 757.9346 null]
+>> endobj
+1780 0 obj <<
+/D [1777 0 R /XYZ 90 733.028 null]
+>> endobj
+1721 0 obj <<
+/D [1777 0 R /XYZ 107.7135 664.6414 null]
+>> endobj
+1722 0 obj <<
+/D [1777 0 R /XYZ 107.7135 649.8619 null]
+>> endobj
+1723 0 obj <<
+/D [1777 0 R /XYZ 107.7135 635.0824 null]
+>> endobj
+1724 0 obj <<
+/D [1777 0 R /XYZ 107.7135 620.3029 null]
+>> endobj
+1725 0 obj <<
+/D [1777 0 R /XYZ 90 611.0853 null]
+>> endobj
+1781 0 obj <<
+/D [1777 0 R /XYZ 90 597.0373 null]
+>> endobj
+1726 0 obj <<
+/D [1777 0 R /XYZ 107.7135 523.1458 null]
+>> endobj
+1727 0 obj <<
+/D [1777 0 R /XYZ 107.7135 508.3663 null]
+>> endobj
+1728 0 obj <<
+/D [1777 0 R /XYZ 90 499.1487 null]
+>> endobj
+1782 0 obj <<
+/D [1777 0 R /XYZ 90 485.1007 null]
+>> endobj
+1729 0 obj <<
+/D [1777 0 R /XYZ 107.7135 411.2092 null]
+>> endobj
+1730 0 obj <<
+/D [1777 0 R /XYZ 107.7135 396.4297 null]
+>> endobj
+1731 0 obj <<
+/D [1777 0 R /XYZ 107.7135 381.6502 null]
+>> endobj
+1732 0 obj <<
+/D [1777 0 R /XYZ 107.7135 366.8708 null]
+>> endobj
+1733 0 obj <<
+/D [1777 0 R /XYZ 107.7135 352.0913 null]
+>> endobj
+1734 0 obj <<
+/D [1777 0 R /XYZ 107.7135 337.3118 null]
+>> endobj
+1735 0 obj <<
+/D [1777 0 R /XYZ 90 328.0941 null]
+>> endobj
+1783 0 obj <<
+/D [1777 0 R /XYZ 90 314.0461 null]
+>> endobj
+1736 0 obj <<
+/D [1777 0 R /XYZ 107.7135 240.1547 null]
+>> endobj
+1737 0 obj <<
+/D [1777 0 R /XYZ 107.7135 225.3752 null]
+>> endobj
+1738 0 obj <<
+/D [1777 0 R /XYZ 107.7135 210.5957 null]
+>> endobj
+1739 0 obj <<
+/D [1777 0 R /XYZ 90 201.378 null]
+>> endobj
+1784 0 obj <<
+/D [1777 0 R /XYZ 90 187.33 null]
+>> endobj
+1740 0 obj <<
+/D [1777 0 R /XYZ 107.7135 113.4386 null]
+>> endobj
+1741 0 obj <<
+/D [1777 0 R /XYZ 107.7135 98.6591 null]
+>> endobj
+1742 0 obj <<
+/D [1777 0 R /XYZ 90 89.4414 null]
+>> endobj
+1776 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F97 1774 0 R /F25 348 0 R /F8 568 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1789 0 obj <<
+/Length 2470      
+/Filter /FlateDecode
+>>
+stream
+xڭ�n����_��R at 5�+�4� ��n�$k;��h�4�إH��Vq��gn)Ҥ�~0g�̹_Gd��,b��B���p��_��l������ o�/.߇b�8�����`	���������
+
�${U��F���bsث�I���a+��X�v��Ż����G��hr����7��_�_`��H,�����1]�/8e~�]|����c̅1�a���2�C��\1"�#�\�q����
+v�$8H�}��[R
��Nm�d�c�P%���Շ��]�$QP<dj��:8�Z����v(���D!��]Q�)ܰd�C�)@�n�h�7;u�A�0^H,��ʯO�'򱣉|Ձ7���6��9���ι�<B4���8�B
4ME2��.�Ⱦ.�T�"@��#�0��"
)�Dģ�=Ъ
5�(F3�ad�PU�����1JF��h��\IJk�ż�U������o?]�����X�����1
��*i��ܜ�D"� �{����+�"uN{�Ub\��2
")�x2ꨪ6�*fU������wo_��HFt��j��@S��E��9M=�|���bR�9Eu����4o�w�����
+Eq��3̴PCfaNH��̌+j�8M%�K�e���. 7
t�A6���yEBGf�(T.��.\n�yS��i�&�~��:WS�#���#�l��n�+.�o3�.G�аD��
+�
�_!ٌ0
#.������9�tf�P���"_��K�ש7X��Jy���U�!1
+%�,Mc$$x�f�[g�"����}�(��ߨ��|m����M��m��6�ONH����w��K7;{��<m�$K�P[�a�����\�Z�J�*i�6{���Nm���N���=�kXJ����\%���
�"�
���
Hx����M�Մ�<��\��h
�cX��i
+�ʤ�ٯ��0S��Ff��
u����_;宥�����Q'���֍�w���H

����	o�L �17,D�u��Ft��B

��V�Z�-��}�%5J56��N�����o���lÑ6Kb��E�m��-��!J�s�5���`�Ce- ��πQXx�����ifR��kUn�!
4U�l�H�N�f�2B�wR�Y�1���$bЀi���ó��o�;������9�=U9������aI���K
Oi=&���Y�F���!�8c���Pa�25D�ݲGޟa����?�OOJ�U�¤{��^Zu��VM�H�S���v�51��s��"�l�Ϋ�ł>p��I�����3��|�rM���ӫ�E�q8CB�/]��fa�A!�b���B���B#��y���h��}�$�S�1�۟ ��F���Sy�
_���!dk�%m�ՙ��g�0� 	�S��s�L�N
+��ل�Ǫ�;�����đl�y��
����6���N
���\�2O�R���{
|�a
�BW��v�8� �x�Q���x�uUg��c|�v��'�
+f���FJ�j��	��:%�Ū�n����B]_1iJ��J��Ԥ�C���
M
��mar��P�ܖ�N�e��
{Z� I
���rҧ ��
��`٬��*�
�p��g��p�L�7=O�#�J��i�6�c��+o[����t� ��6Q��W,�������4��o%-:�j�R �XL#��Ҷ�3}����G��L�������mG
��Tj��	�,�M���S䞓�V
�[��z�ш�^/�au��RS�8���C�6�R1̈Z�M�k�f��{�8
{D[}
(�A����_~���3<�c�<\߮oKW�0���#�"   �	I�b����۰~���
+~'O�B�/"`>�y,�h��X�e>�AG}Y
�w*�:[h�t��	�Z2�#�Y�ըF�s��<tʈJ���

�ϓ$"�i���2�У�AD� o�c�
0
-�ltLR<��
]=�Ј
��;�
�(��(�


~��^ ���� y�K�
+%�ѻ{CV'�������A͛�n�2�D[�t��٥K�5f�d�
�Q.�ҹ�u�1���:��aX�
D�����1D*)bQD^��~)�o��F���x|�X�o��
+����/�@�.U6�q8�c
l��:��l�n�f]�s~֣�G��a�׹�
�f�y}[Meʘ��tF/�A��K?������˃�۫�p�^�t[{u�ntY�+D2���
�

�/r�@ "tVЀǘ�?�9��әΦ뼸
mS�~2{�ӥ�E*ݸ���?��2Sz�hG�Ľ_�_U�'�,�<����{��!��i���>('�3�Pȿ���Pw�q�C�;	Al�&!-��2wF�06�����7<}�U�Έ�����Ã~�rSs�>y������HO���Ԡç��aOZ���闅�������U�meG�^-��iʫ����65:�iY���,���/�1Ŀd}��L�
x驟cH�G=^Z��~�Ls��'�o8]~�O�#�����?endstream
+endobj
+1788 0 obj <<
+/Type /Page
+/Contents 1789 0 R
+/Resources 1787 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1786 0 R
+/Annots [ 1792 0 R 1796 0 R 1798 0 R 1799 0 R 1800 0 R 1801 0 R 1802 0 R ]
+>> endobj
+1792 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.8406 703.2641 249.2909 713.1918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+1796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.1066 236.1619 216.8732 247.0658]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators) >>
+>> endobj
+1798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 156.3756 187.4637 166.3033]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+1799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 143.1652 316.6798 153.3519]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) >>
+>> endobj
+1800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 130.4727 234.0985 140.4004]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+1801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 117.5213 210.1485 127.449]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+1802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1790 0 obj <<
+/D [1788 0 R /XYZ 90 757.9346 null]
+>> endobj
+1791 0 obj <<
+/D [1788 0 R /XYZ 90 733.028 null]
+>> endobj
+1743 0 obj <<
+/D [1788 0 R /XYZ 107.7135 662.7159 null]
+>> endobj
+1744 0 obj <<
+/D [1788 0 R /XYZ 107.7135 646.7756 null]
+>> endobj
+1745 0 obj <<
+/D [1788 0 R /XYZ 107.7135 630.8354 null]
+>> endobj
+1793 0 obj <<
+/D [1788 0 R /XYZ 90 614.1083 null]
+>> endobj
+1763 0 obj <<
+/D [1788 0 R /XYZ 90 591.7965 null]
+>> endobj
+1794 0 obj <<
+/D [1788 0 R /XYZ 90 591.7965 null]
+>> endobj
+118 0 obj <<
+/D [1788 0 R /XYZ 90 371.9543 null]
+>> endobj
+1342 0 obj <<
+/D [1788 0 R /XYZ 90 335.2284 null]
+>> endobj
+122 0 obj <<
+/D [1788 0 R /XYZ 90 335.2284 null]
+>> endobj
+1795 0 obj <<
+/D [1788 0 R /XYZ 90 253.2328 null]
+>> endobj
+1797 0 obj <<
+/D [1788 0 R /XYZ 90 174.3732 null]
+>> endobj
+1787 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F97 1774 0 R /F25 348 0 R /F74 482 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1805 0 obj <<
+/Length 2143      
+/Filter /FlateDecode
+>>
+stream
+xڵ�ms�F���S�.P�����.�$��^ʷ�7I��A��D$����� �x�`�䠶ʋ���=�==#��l���(C��z4_������u��p}�|ss��V#G��zt����Q�����1��M��R:��0:.�u1��p:�Vo��.f�uQ�M�\���źl�żl?��e=av\n�)f��c�'���t��}
��[	�|X����
- ��n(�+
@(����FrV7�o����_86|y*$��y2?\����Q<���Ha�(��,�ʹ:
��-��(u8P�V�.��Q����U�4a��ђ�K�Sg�)
!�c!
����j���uO�ê
�c
QF�|

'����Q�� .�J�g�KB���j��7��ȑ�Qh�w�gG���_
P��z�O9�5�������c�a^l¥z"ոz�9&�{o�|��!psٟ��a
p��$��J �s�h��:���\{�ͮ~� B��
��=�������ZϾ�&L���?e��<;��8
�O�H�$�"��������Z��h��������:J}Y8
���t�PJE
s���任
�Y�d"��ʞ�c6�C�>�O��3�6_��7ۗa,P@��Y1�S
��2
+
+�Vi
�`�d��
�#hO#RT*��`�C�8�Q�׍���i�/|�4��0��C�q�+�/~"/V�H4@蓞M�
+�}���qh�B(�f	�O
�re}�u{fS��l��^���US.:�m�4ˇp��3.�@,�rў[�sT�Nb�,#
�p�ʪ�%�p�`
�P�S��݀uO7�u_�
��~}��0�`Ѳ<ڙ�<�Cr�91Έ�p�Q
��Y��b�.7Ͳ�����E�mk�5��
&�ӤJN����h�s
+#5��&s��u#��.BjO�
R�!
��>.7eQϾ�c[C�������S��<xJ݅p�>d�&���\W�ᴟK�] �jK��i.� �~��@:y���>��\�3\"��˞n�˾�\"!
����60
0��>�5�r}�K�`5��AA^����h�
VE�UBeӎ�WA���j�y�g�Z��5��Rq"�����
G3q�C3��Lu4{�砙aා�p��n��'�0˜���]
+�#;l�
�N���_��r�5�a>�p^e&u�5Q�^sa/� �R��pB�9B��T!�'|��~}G���v¯�#��p�.��p�X�
�f4K�<s�l�iU/�M\*=�m˺���b�ʷ�����+�+�"�jl? ���3�"��ܞn�ܾ��"!
�v���~�OmNN��p.�<��U�˴�BS?lW ��7�ӓ���0'��Q�~c3��`&s`�u#��.fO�
0�!
���
�a}�B�`
1�B�gDZ*1 �ىI�
�|�d�?�UW,���5���
e1u�a�
,�t�,���`	a�w����>�G���d6��|���-�aj�g��lOd����>4�_%���}z�E���TM���V\�Tò[�G3���a�Լn$5�EH�	�Cj>��_�]�z�A�}*W����"�<7X
`]��\�U)	X�
V�e�;ߍd�ܽ�ewP�
������pi����W����0��� �)L
+��`��8��׍D���=�s�·0��C��?�)vU}�?��1<
�%.ӟr����
��
�O㓬=�~s�O]hS����5�YF�d��?����3�"��Оn�о��"!
��
�Ni��T��k��y��4h
��U�ס�z��P�߀��W�́��F'6��U�Xn��+�
�����
�Yшm"�P���mV��kl��|���M�g�¢�B]��I셔hv�>�H1���4�
�W�\�SI��(��
�:q��:��Nu�{�瀝a�w_���b�6
�}�,�
+7�]f�f���݈<��
+k`��u ��#��R;
�BNY�*�_~#�{Gտ�֛<!?���<�A�~�w���u��
������_�)�{o���X����v/z��=��m]rW�L��s9�Q���`~�e����Q������/L�o�/ٛd��~�ϻ�������+�7�e���d���nW��qI
+�-7"w���hK/��r�
��X
�L���2����z_I
)v4���!Vendstream
+endobj
+1804 0 obj <<
+/Type /Page
+/Contents 1805 0 R
+/Resources 1803 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1786 0 R
+/Annots [ 1807 0 R 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R ]
+>> endobj
+1807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 721.9695 180.5696 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >>
+>> endobj
+1808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 681.2391 225.4712 692.143]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >>
+>> endobj
+1809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 642.5659 198.4823 653.4699]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+1810 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 605.9501 168.4948 614.7967]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+1811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 567.2769 170.9555 576.1236]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+1812 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 526.5465 213.0175 537.4504]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+1813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 487.8733 213.595 498.7772]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+1814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 451.2574 179.2742 460.1041]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+1815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 412.5843 154.3681 421.4309]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+1816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 371.8538 220.2205 382.7578]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+1817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 333.1807 185.8997 344.0846]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+1818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 295.4838 192.5442 305.4115]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+1819 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 255.8344 216.3649 266.7383]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+1820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 217.1612 211.9116 228.0651]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+1821 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 180.5453 177.5907 189.392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+1822 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 139.8149 216.355 150.7188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+1823 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 101.1417 235.1542 112.0457]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+1824 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1806 0 obj <<
+/D [1804 0 R /XYZ 90 757.9346 null]
+>> endobj
+1803 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1827 0 obj <<
+/Length 2246      
+/Filter /FlateDecode
+>>
+stream
+xڽ��s����W��L
���o�%�$�]�;w2�\�CK���$��
��]��V���_dq��X����P�cG'F�ԓ���N
���|	�/S��n.���������ܷ4#�3>�Y�2e���%��N�g�N�z]�^�8�V���rQ�?,��~�]rE��u�����Cy_�3f���Ō�r���כ�/�����~+��w���J'
���
J��j���+����Br�Y]|��1��
�/��|I��N.�$V��/1
с��5���k�d�8���(��I�b�O�̨&RX9�b>֟8W��a��JLR�#�Q
+��$qT������F��&FK�g�?�z��
A
sa�׻�^.nߖ��.��
��
�a� 8N�Q�h$�n�ý�x�^�ႊ�#'ڠe��5�N��o��;��)ݧ�rS�1����m#AMa�40&گ�z��m��4dL�!L󉶒p�����Ն�(G��b(���
��� ��n
ܡ�#�E\��.\�i�ڌ����L> FA�s�4�*�9Zb�1���c���]���j��> :��I:�R���[@�kz
�ad�"�uNd'Ji�!�pd�9d�v#��]ف�c�ͻ0��]x����u]ݭ��8�
+�9s�XM�r�4�2C�C�1ĒD�n�[�g��6M��|��6$�OTQ���>���z&մ�b}6^/7=��C��8M�
+}F�t��\"8G1�Tag�n�y`7����8#.������J�.
��+O��2�Xi5�q�[0
�Mip��q���R�|XY`�1��Da�����[j�m`���.��z�����c�-G^xSp�o��E�
+NÜ���%�\'fR��ϛEȞ��/�|�&L_���wm3!I
���pʞ�N�e���
b8���
�y����.B���1t�]��.��ͬH�$��|����D���`|������<�kO?ao�)
%�2{��ֶDX�>��g�0�'b7�9���sh�>Fz�
��7�C�)V/'Q
G%��l�v���I�Rs"���Q��tӗ�Иv)�tlΔ�:�ɤ�DYm0&��d�0�d�nd2��090|
�yFz���?Sq�����'J��h�`2G��H$�c��O�%D�0,�ؠ����л�(���A3�e~4t!�>?-�&Iն�
+'�O�ˀ�8�^��D`
��Q
�<U��
�8��s>4|�
#�ޅo�C ��H*m>~�@³S`��
�<H�
�W#�x
����s�)q�:
� ��(���O�"�
xޅ��x���/�*�N�m���p�	��a���%���+E��ԣLWDy�	c��ve8����{
�.Jav����
���cY(¸>牠�p*ѱ
��(̍��8�S��X
>f,�]��.��+e9����
v�c�U�@�ql�d��TM�����]Q/W�'�r��D.�/��H��f)�D]�ܼ� nj4��������k����G���慙��Sjm����>�ҊkK�3��Xw4�S�.���_��\�0:\n�j �H�
��5�>���]S������7Er�2o��XyN��$�� �ӝ(�᝷�N�"�
Cxޅ����{���we3��
+c�!�
+V��4g�
86T`5��`y�����,����fY�=�� sL~�j��R�{>�j
�F��\%�9
a�/6q�]ڈb8‰�
�y���.����1�]��.|\����������[6�'��l�3�u�Ս(�a�܍�����/�����	�"|]6���P�܅�?6��
�|{��9/}0m����P�S������<�C�G ��0�۞
����Ļ
��B�Fb�BnO��Q�v�#��i�,_v|HF���( ��P��}Ç@�07�v�H�"C``��!�wa���(�����QX�8,���V�`���(�wM�0�5y��kR�H�

�5yFz�5e;��fY�V�]/�
I�
n�YJj���t>&R�����X�1�^�b�Ufh�^&
+��v?�T�}.z
+%�]HE-���I�:"嫎\�)־|8I��V�U7�
�~��
�
�Q�
�RB
��3�Ei��A���G�ޕ�_fJM�Y�]��
h���/^0q* W�.��7��R�,�
o�Z��݃�m������O�L�2�
��ݏ.L��^��Ǧ��������w��f��ɲ��nWW�~s0���5��C/4�e~I�5z7�/qz\Wu�w�r]x
G8*��+�*�endstream
+endobj
+1826 0 obj <<
+/Type /Page
+/Contents 1827 0 R
+/Resources 1825 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1786 0 R
+/Annots [ 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R ]
+>> endobj
+1829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 707.9673 200.8334 717.8949]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+1830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 668.1971 183.6979 679.101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+1831 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 630.3794 194.2182 640.3071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+1832 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 592.6666 156.0218 601.5132]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1833 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 551.8153 180.9283 562.7193]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+1834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 513.0214 195.3243 523.9254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+1835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 474.2275 208.0363 485.1314]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+1836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 436.4098 220.7782 446.3375]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+1837 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 397.6159 201.4011 407.5436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+1838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 358.822 202.5068 368.7497]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+1839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.5439 343.2552 273.4737 353.1605]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+1840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 319.0518 209.7103 329.9558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+1841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 282.3152 187.0051 291.1619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+1842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 243.5213 174.034 252.3679]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+1843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 203.6463 210.2678 213.574]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction) >>
+>> endobj
+1844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 164.8524 229.0869 174.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction) >>
+>> endobj
+1845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 126.0585 195.8721 135.9862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction) >>
+>> endobj
+1846 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 112.161 247.189 123.0649]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+1847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1828 0 obj <<
+/D [1826 0 R /XYZ 90 757.9346 null]
+>> endobj
+1825 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1850 0 obj <<
+/Length 3431      
+/Filter /FlateDecode
+>>
+stream
+xڵ\Ys�F~ׯ�ے��xN�̾9�U���(oe���`�
Z��K���
30�4���&�_���9 at 6��
,
h��2ܭ���#���+/���*���ѫ��Xb3�
�
#�3>���2d���1��'#F���j>��8
n�O����|v���ηO�c���b��w��z�ȷ#f�����ii�03�ߦ?
��A�Ro%2�����/���=���%�5�
_@k�`u$��_�G�G?����6���c!����N�pAh�d���0�)�
��ү���M��]\�A�0�P�\&��YV�{���v�`��I��.m?����
+
���:N6��b=�l7��w��.���k�ju�&0�*�h�t�e���ݍ\�
����fu�Aˁ����-�ښA�9���"^
�
>�?����bX
C����Ňϋ��t[�v$�0_m\���{ا|�L���K���!��?��v� z�i%ɛ�#q�i�2>���"���](�'Z	֙ ��$�Z#	`h�T		���	R��N���
	���:&��z�����f���s��/Q��:�
�|�]$�I�,�P9�'
U�I��Ϯ�C��%E�lֻ�
+�b���������<���2��y�b9�VwD+P����KE��SX< <�Y*�SC$?KD�"�O��78���k���f>�#=,��6e�$�ƾL�
+F$�
]+lx�����;�8%R�Y/x 
+z������W!L�_Zn��\$k��aZ��ש��|2;]��	��*P���~6�(�\d/��BA�Y�Db�9#nַ������H:���iYU�.���a;�jXt�p�m�{_��9Ň%��]Qj���0b��:T8Z'J�W]��Hˡ�y�)��0��v�K�H� C�%)�9]�>]jr�ޮl���gq���C�Vע;wJ8�N��is�X��

�3�W�}@��0�@8K��ɜCi�X�`�8t��#X�q
%P���ֺ����Jk�P��ˡ7Y,��58jם7�C����4`��
	� C�J�tD���/�x�#�4Y�6+�{m�f�
m�.
1�[�#���u4/�RK"h��j� ���^���a�g��O��;�e&��<����(Q�b�x��_!L~Zn���Z�C[9{s9~������b:��<G��)"c
�:� ��b^�ޛ
��_)�w
���:��Zɴ�8�9/�8#�"� �
+��Ra�\��(�y>�-�e4���)z΍͇F����̳���5�ޖ?S��IZD�s0y�~\�۹�L��IB�Ą��,�Y`h%%>g"�gQMn�Ƴ
+K���!71�(����*�=.�1+m���
�I�4�
oM���"%� ���
\�!�zs�߿�]\^��>���
iZW�i�Ga�#6'��P�J�Xo�=
�
l���,�I�`�`�� iz@!�c�V���7��cxL|�[��.6*����aR�\�6KJ4�Dv���􈷰y�S<
g�i�Dy at ar#��(�(`�cF����
�
���싨
a� �A�P� �K&7bk7[*�:��f{<*��[&wlvfIfQ�=
+����
=}���l���G�eb�='u
�I�
P�ܘ�=���1���~f<*��[>��ݒ����
�	�ؐ���A��]�!��
V��7׳Ӌ���ӟ�aE �T
u�>�(D���c,Ie�� �Q�M^_���.G�Ͽ_�=�
	5�W4�a���ڴ#
+�$fku���U��uD��⛼e0L�� ��6<킀Bt��Z] a�/�U}]��������5

+�\3�vD@!��lHa �I!e��P�!U<�������
ЛXZ��h�
�I��ڍWp�����xT|����7麟������Ǹ鄹�J[_b�M��
f>����<*��[X~r�~���["��W{ e)@���A��Q!=��}
����p T������1�;0����or���[�#U勞ސH� {6�E@���@��L6Ti�Ga
+Dl���Uõ�m��c�#�g��/O�V��V&m{@!�c���W�p�Y_�
�Vl�9��~a	�	��B���ڳ_JU� xL|������@2M��<m@!
+�lH�
+J��/ �R��
+�!�;��&.��KTJ�A�ֱ�g	�Z�v�ǣ⛼���et8u��8#ݩf��(D����
X�	f�: �Q�M����\m�E����0�R�H$�P�V1[Ǭ@����N	xL|�;����Bn��)����*�0���I��3�ۮS�
u\��/#�ِB�F%����ܐ*$
�=vyu2{sy>��tE4��I�|���[�J�����k�
A��k��
�
� ;��
:��v�ۥ�L|��mV����8/7�����ν$���TW�}?�.��V�~q�w W���6_��#�(i�7�s��m�Av

�-�&v
�!6�r[w
%Lܹ�����r��4�x�����b�qv�h9��KS�x�����N&���� �"������x�������IYS#}
$�qI�rB at aZDl���|=t=������I��fPʬN�P������V��Td}�xL|�[7��
��ڻ�
��.(D)`�ix��@¤ �P}]�����h-�k9}W#�fn [...]
+G��y�S�����17����΋��5���n_��|�./�%Q�`~�i�-�Mb�@��t
���
+a�֥�bW���v5�}�]Z���8D�<�M����f����դ�P�
+
z
��T�>M��Lˆ����R��Ü�����l�ϖMGM��0����&,Q���䍛7��v�G�7y��W�$��K��T%W�^�8���(�����A�Ҷ�
�
��~+��#�{�@��11�q�I��~�G�7y/(^�_�c���
+�I��(p��(����%R��+�|�"xT���`9��J�u�VKJ�A��cKҝ[�}�/ј�:�a�WN
+�z��1<e~ ����@_`kJ����%�]
���XV���� K�n
+\;'
-�ƿZ*Q�M�I���\D����)��~c�f�o��^m-{����ѿ
�+U�G�ow�@U��͹�����<��<~7�h���^*��>�~�v��
Ǖ;��;t����i��ǫW�?&w;�^<l�b���a�*.n���2��(ҥ�~Ia����]¤{�ن7�����i��Ӣ�� DQ[endstream
+endobj
+1849 0 obj <<
+/Type /Page
+/Contents 1850 0 R
+/Resources 1848 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1786 0 R
+/Annots [ 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1857 0 R 1858 0 R 1859 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R ]
+>> endobj
+1852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 720.8885 205.8346 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Domain__Product) >>
+>> endobj
+1853 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 682.4308 211.1243 692.3585]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+1854 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 642.9969 191.8571 653.9008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+1855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 604.5392 192.3952 615.4431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+1857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.0118 524.3518 237.655 535.2557]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+1858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.0118 485.8941 249.8192 496.798]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+1859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.4548 447.4364 310.4717 458.3404]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+1861 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 367.6226 165.9944 378.1529]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+1862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 351.8807 177.89 362.411]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a896b8890edb38e9960c455aa178e508ba) >>
+>> endobj
+1863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.8788 351.8807 206.3035 362.411]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8b30277f972f730fe26f6cfc39098cc77) >>
+>> endobj
+1864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.2923 351.8807 236.7393 362.411]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) >>
+>> endobj
+1865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7281 351.8807 267.1751 362.411]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) >>
+>> endobj
+1866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 336.4824 141.3574 346.6691]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8d5e386c6a05c9656eac42fe9e2cdd8b5) >>
+>> endobj
+1867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.3462 336.4824 170.6873 346.6691]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8c77955fc77a169347da8820b46c3247b) >>
+>> endobj
+1868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6761 336.4824 201.1231 346.6691]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) >>
+>> endobj
+1869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.1119 336.4824 237.6461 346.6691]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80d808c2d0d6514c33e06445d7aa34270) >>
+>> endobj
+1870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 320.7405 214.9607 330.9272]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd640c30f757e4ecccd08ac527536ca6) >>
+>> endobj
+1871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.9495 320.7405 312.0662 330.9272]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) >>
+>> endobj
+1872 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [315.055 320.7405 408.3645 330.9272]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd) >>
+>> endobj
+1873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.3533 320.7405 503.2681 330.9272]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) >>
+>> endobj
+1874 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 304.9986 155.9525 315.1853]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89606fc251d767040929d3e2645dbb446) >>
+>> endobj
+1875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.9413 304.9986 242.8463 315.1853]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e0c660bfcbcd3d10c3e764e22f41d0a1) >>
+>> endobj
+1876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.8351 304.9986 308.3006 315.1853]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) >>
+>> endobj
+1877 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.2894 304.9986 389.0973 315.1853]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a1bf7bec2cb0d949e45c3cd0e25874a6) >>
+>> endobj
+1878 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 289.2567 187.8427 299.4433]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a85912e00d1de38a643d48af1f0e5dd35f) >>
+>> endobj
+1879 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.8315 289.2567 249.272 299.4433]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fda2f32e2fc3f61357ce0d9d7813f5fc) >>
+>> endobj
+1880 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.2608 289.2567 340.1907 299.4433]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) >>
+>> endobj
+1881 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.1795 289.2567 418.7855 299.4433]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd1bad185f4622d07b171767dafc78b6) >>
+>> endobj
+1882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 273.1711 181.9151 283.7014]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a0f28596ac7d4a43766fab174c28ccab) >>
+>> endobj
+1883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.0314 273.1711 252.5193 283.7014]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8261922c7bb53bf71459671df868e55da) >>
+>> endobj
+1884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6357 273.1711 409.9476 283.7014]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) >>
+>> endobj
+1885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [416.064 273.1711 513.9963 283.7014]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >>
+>> endobj
+1886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 261.5596 170.3982 271.7462]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >>
+>> endobj
+1887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 245.474 196.7094 256.0043]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fdd3365de1a07c7f7bdd1dc330bba8f4) >>
+>> endobj
+1888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.3004 206.6427 200.8567 217.5466]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+1889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.1526 206.6427 286.78 217.5466]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2beee33de6f8542b0228161d044640eaa) >>
+>> endobj
+1890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.5314 206.6427 347.256 217.5466]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2a57b0c1a34eced57ca8437eea92a4328) >>
+>> endobj
+1891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.0074 206.6427 432.6285 217.5466]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb20f182c5824807f7bc66d2d2033810feb) >>
+>> endobj
+1892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [443.6303 206.6427 513.9963 217.5466]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >>
+>> endobj
+1893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 195.0611 155.7434 205.5915]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >>
+>> endobj
+1894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 156.2299 223.9268 167.1338]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+1895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.6976 156.2299 282.9451 167.1338]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e757308990edf84fcb94023ff4a7183bf3f8dace5) >>
+>> endobj
+1896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.9339 156.2299 321.6896 167.1338]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e75730899c7753e1dd51e1b7b3fdfafa9f8332370) >>
+>> endobj
+1897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 117.7722 210.278 128.6761]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+1898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 102.4039 171.803 112.9342]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae556cc08f48e769b9c15bea83d5d883a1) >>
+>> endobj
+1899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.7918 102.4039 257.0929 112.9342]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312aed8db7109fb4bb50360b05800dd245416) >>
+>> endobj
+1900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.0817 102.4039 295.3295 112.9342]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae3e4424ce8e7ebe86e125541b561fc300) >>
+>> endobj
+1901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.3183 102.4039 402.1983 112.9342]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae079e4b80f17b0095497103a52cffa3ab) >>
+>> endobj
+1902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 86.6619 193.382 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae94cf20719046117aece5acba61dcae4d) >>
+>> endobj
+1903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.3708 86.6619 256.6746 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae8191bdbdcd041a9859ed465d16062ab1) >>
+>> endobj
+1904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1851 0 obj <<
+/D [1849 0 R /XYZ 90 757.9346 null]
+>> endobj
+1856 0 obj <<
+/D [1849 0 R /XYZ 90 541.2244 null]
+>> endobj
+1860 0 obj <<
+/D [1849 0 R /XYZ 90 386.0245 null]
+>> endobj
+1848 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1907 0 obj <<
+/Length 2896      
+/Filter /FlateDecode
+>>
+stream
+xڵ[ے۸}���[��

yw��l<���u6[*�
�V�[(�^o*��I� A��S.��r�}���n� �`�G&O�P�0.'�3<� �匴_����!�����WRL
2����SmA$(����_�#2;'�����\/�3���՗��c���^ޗ����
+<�^���n�P4o�OE9#zZl�GDqͧ��~�����'��LK��g���'����3���b�� c�d}�)soVgo����4_�?�|��LO�GZ¯@DBt $x��
ak�\Q��܇Q�0Jn�H�AX=�0�7�jQ-��&6�/���j��� X!"�D����g�
I�`�a�sA��P�_���\ �3�'
f/����2��
+6	
��s��_‘�Rv���:��1✋�_�U��ż	8|�Ad�2�a�ޭ��ߖ՗���~�gD	C�h���GexP�#�ty�'rJ��c���9��]����5d<}}su���������/��{��ńMk��Ge���,��"�R�����`x|�}d׺{Y_|"\)Dc>���P��� p�����Ϲ��Z�/����-M�(�F��U�ht�;X��4\
I
t
�T��p(!e]�w,�JE���"�H
�TP�E�R��������(�xE�P�&��@�+׈A��U�W��`�"�����
��&	Nz~�+���Dv-��]�\/����j�X�I:

�!ƒ��.��
0h�0�����s�#����������_�!ӻ˛�(!c
��2S��2$bk�U Z=��<6
�u߷[���ϙh�d8p�!hA9
+��A�=
+�y�1�a�N�s��T�s��M�iX$����U��ji>Y�d��;�?g
	:�l�s�|�

��]گOw���tàe�m"�5����F���r
������!�}a�(�h:
�!A�D�
+�e1��`���dž��s�#�����W/_������y
�73��7��*nC5��ff�Ge��ֆ����A�c���9���&�߼���叹X��W&
�ʐ��
�‹H�W9i8�y�OHӡ�6��Φ�| (�|ms�S_ �fB9�G0d��h�Bm'u���D�*p�
��b߾{j�Vۯ�43�bZ��v�d��d�����V
��\�T�B�{c�@.�����a�`k�~`;K�K��h�	���a�ʓ����d���
�=l����1�-b����q�9|�Edײ�dw^�ro{����2�{�H)�	�GeH�=*Uo���NBL���9��DJd-��V��f�R��%4�E9"����͋Za�5��ȸ�HL��%�;
�g��aYa����u����
+���adXDv#a,7C� �1�	�GeHXah
+s�;ep	�n
9E���6<,!�:L�Z
�"��Ȏ�����
69q8X^
���8�~�8B�yqt|#�4��n_
e1�b�ii��1V�&
��p�ҳ⽈d53��5�Hi���5RΘ�ַ;ڈ}k�@
!��e|7�c�(ϭ�
*/���RZI:�R	��:>F(I
+}�}���"����H:
�&@!��n�3�`Z jN�e�HH��ƥQG�ˁ)n7��3Vf���

*+��\Bi�N��XRUM�
>.�n��
Wb�ٛO
+\5s����8A��t
<C�o�'����HXD$C�@����R���Ɇà�e�H���"ٴRy�q��	�S;*��-d��ˍ������s�&c�"�IVJ��R`0%��_���﷕S��1zJ3��Z��ͦ(c1Q$�t�
*���U�Qw�rz��˜�6�B)=9س�
urg���
?�}��&�'��)4��"��w�3�
���M�?���KLa��Gm��y~�"-m����p
~�Y��ӗ�@��'���-*�[	�����*>�u����;|�A������UH����Q�P�Ft=���B�F�~Jz	m$ҋ�YR/�\鷺�<iO�,��w�u���iC���U���t�+h�	�eF�Ͷ\/V��=���b�:���Dt���
����p<]	e7l���$�
iNr�&=,�������Q��~�]ŷ����{~��[|�Ad�2X���]�\�<`��1U��w��w%�6���d�a�	a=��
>� ��J6IP`��=*�b
�_��>�l hsb�	l������L�A��"&d� ��P
$� �@�в]s/6�m�ج�|�|Oe�r8�AH�M`���f[�6���%��v���%{:�����R`0���~}^
+�~�"Xƛ^p�P,E�w"7��
�Ȯe�;̡A� 9-/�a.����ح]*b8��j
*É��G�;��,BLT̍8E����p=���q�7	�n�}]p47�W�>����9�~��dA$��ed�aYY����u������
6��h�?.ˢ߼����B �� t�$�>��
�خ#����E��8Lf�F�Ee�0���
ON#���N�H`#��/~8��ݔM�L#�&��'�Z�v\5� ʿ�j���հ�#<�˫&0�RMگWM�7[L���(&�]'��Q���`i(�1�

+��Ί�X�DR��Ͷ��2n�I2
+l�d�`�c5E5Zc2�i�
h����Ү��?�{<�,Œh1��1��3�-m �e��PY���K;u�
�v�k�>�]�m�8\� c2�p��x�r�4�Ȫ���f��6�1�K��
ĨҜ�"���
��i�$�l\׫�S
�m�k�H�VLjŴ;ْ��s�w��=$X�o�#����s���E����V�W��a���6>�M��C��ɮ,�j�~�̯�E<����ƥ���Mܫ�����<�Es�S�
ٵ���v�����3zأ�f�+Ѳ���V�y��{Pĥ~�G*�;\����z[n�ɮH�A���em�endstream
+endobj
+1906 0 obj <<
+/Type /Page
+/Contents 1907 0 R
+/Resources 1905 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1786 0 R
+/Annots [ 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1923 0 R 1925 0 R 1927 0 R 1929 0 R 1931 0 R 1932 0 R 1934 0 R 1935 0 R 1936 0 R 1938 0 R 1939 0 R 1941 0 R 1943 0 R 1945 0 R 1947 0 R 1948 0 R ]
+>> endobj
+1909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.4482 696.0041 214.9143 706.908]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+1910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.5059 696.0041 360.535 706.908]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) >>
+>> endobj
+1911 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.4342 696.0041 478.2267 706.908]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) >>
+>> endobj
+1912 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.1259 696.0041 513.9963 706.908]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) >>
+>> endobj
+1913 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 684.4225 180.1017 694.9529]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) >>
+>> endobj
+1914 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 645.199 221.3364 656.1029]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+1915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.1072 645.199 301.9236 656.1029]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) >>
+>> endobj
+1916 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.9124 645.199 381.6042 656.1029]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d6540e1a601a53491f60c89282fde55b5352) >>
+>> endobj
+1917 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.9897 606.7226 225.7794 617.253]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) >>
+>> endobj
+1918 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.454 606.7226 369.6585 617.253]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) >>
+>> endobj
+1919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.0992 606.7226 511.5056 617.253]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) >>
+>> endobj
+1920 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 594.7675 243.912 605.2978]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a278fc3e83d58f3eb97a8041b600870a05) >>
+>> endobj
+1923 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.3758 513.6377 211.7726 524.5416]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_0adf6106892886dc859985042b8a7433) >>
+>> endobj
+1925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.3758 474.7877 212.3305 485.6917]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_f9dd9190c5f29dbbfa3d6e442dea7e7d) >>
+>> endobj
+1927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.3758 435.9378 220.3802 446.8417]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_5604f97d216583cdf012a50d2f8cdbde) >>
+>> endobj
+1929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.3758 397.0879 205.1276 407.9918]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_f127b16b1a8e300aa97caca515284b6f) >>
+>> endobj
+1931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.5401 358.6115 195.713 369.1419]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_99e9dc5df3cf7c0ab581e602d1176e41) >>
+>> endobj
+1932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.5401 319.7616 193.6408 330.2919]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ee4e9b54e65780ac3010fda40ea235a6) >>
+>> endobj
+1934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 280.538 141.3669 291.442]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+1935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.8651 280.538 174.2929 291.442]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_4bef34d0d723e765fc4ae7dbd2d195b5) >>
+>> endobj
+1936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1085 280.538 205.5651 291.442]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+1938 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 241.6881 175.399 252.592]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_215d809846aabbfafa5754ce051d1603) >>
+>> endobj
+1939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.2146 241.6881 206.6712 252.592]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+1941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 202.8382 264.3047 213.7421]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ce0cdceaa0c7eea84cc1c38cf5bea680) >>
+>> endobj
+1943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.1723 163.9882 346.9547 174.8922]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_9c118832fed4c0b9b40547578459dad4) >>
+>> endobj
+1945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 125.1383 246.5918 136.0422]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_d31eeb0067d6cad2eb2ea5ab5bd0a2b2) >>
+>> endobj
+1947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.3343 86.2883 370.2974 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_74074a5ed3718745a4d82bacd5b381ed) >>
+>> endobj
+1948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1908 0 obj <<
+/D [1906 0 R /XYZ 90 757.9346 null]
+>> endobj
+1921 0 obj <<
+/D [1906 0 R /XYZ 90 532.6093 null]
+>> endobj
+1922 0 obj <<
+/D [1906 0 R /XYZ 90 532.6093 null]
+>> endobj
+1924 0 obj <<
+/D [1906 0 R /XYZ 90 493.8789 null]
+>> endobj
+1926 0 obj <<
+/D [1906 0 R /XYZ 90 455.0289 null]
+>> endobj
+1928 0 obj <<
+/D [1906 0 R /XYZ 90 416.179 null]
+>> endobj
+1930 0 obj <<
+/D [1906 0 R /XYZ 90 377.3291 null]
+>> endobj
+1933 0 obj <<
+/D [1906 0 R /XYZ 90 299.6292 null]
+>> endobj
+1937 0 obj <<
+/D [1906 0 R /XYZ 90 260.7792 null]
+>> endobj
+1940 0 obj <<
+/D [1906 0 R /XYZ 90 221.9293 null]
+>> endobj
+1942 0 obj <<
+/D [1906 0 R /XYZ 90 183.0794 null]
+>> endobj
+1944 0 obj <<
+/D [1906 0 R /XYZ 90 144.2294 null]
+>> endobj
+1946 0 obj <<
+/D [1906 0 R /XYZ 90 105.3795 null]
+>> endobj
+1905 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1952 0 obj <<
+/Length 2844      
+/Filter /FlateDecode
+>>
+stream
+x��[ms�6��_�o'Ϝ����M��^�Χ���%:�D�����.H_أ��&��M.w.�Y� �a�GfϔP�0.g�������_����/B��]�z#�� #���=4$A�:�[�6'����o�	�g�6[�\S</7_?��*[�T�WY��zA��Ͷ�a�������!�����;{�(��\��?�~�����p
&�����?�l
��ˆ-f��@1�ζW�2����׫_���F����s,�fz�`
i	OO	���I
�r�����
a)�w��3
n�ܺ�P��2z�Ŭ3��C��C�77��_�k.��q�.v��+뢺fj����u���s0d�gK!���ֈ}��҈iB:�l�vV���X���xV�n�n�
�e�x�j��&b��(��ME��xh�����t�E\��AanL@�D�
}i
"B�!4�|��8�|椬�~�T��CT�Y�n
(N(a�pd��=����\�l�^n���}e�^�_���2��A�w����m ΋����:p��&��v8�'�xm�.�����b�
��lU�r&�T�D]��(9��᪏�w,pύ

B�QD9�0@bEPG�y�\�>PBNE�T�H �3RH�#�B��S
+a��L��4)�i at Y{k�B��&S#�=
� f��?AU��&�*���Q��ӣ�!���

�yhUn��:k0��*���
>����YoҘ��Kc=��|҄ �0<
+�G!t��
'7)`Z�|vr㧓S��aX٭��HoN2���X�
�~n
+�b=�
okd�퓉�˧P���<�겚�bS9V2P���J ��#Bm��0mMg�6@��R�9Ug��@G,=91���;����yq�1��
����2��q*�a3�+�N�fn+���U
�.�	�vb,MW/�k(�k�n��}�Ϡk�Ho@�xeA��Z�;�T��\�X���'4�wZ�s�ꈐϋY\�����x2fQ���d�2/:
��Uo2>�"���F\�E�@��Ϋ1�b� Q'��ГT�B��b7�T۶�d��i�8���VǜՇ|�1�
�Tm�
���h�����9>EΑb��E�@G�6N����WE
�
��*���
c��
zI�P
o�t�3N,M�@��"pA� ��nG�:O�ݭ+��m;�
JHB\a
E	"�4J֡6H�tr=��+p�5W�|��/�s� ,��uV�A��B���fO/
8�$����@پL�����V(e]ѹ�I��vu�f�s�O�#��X[3O��uђ���E�m������D���~���jؕ
�?�{������|�݄6!e����C���ooև|�m��zQl.�#�&�B&�T�Œ92T�,v]���=���]>��CLQ2�}:�9���^��j��l�<|���
���`W��Y�m�:��` [...]
+q�C
�{�Ӕ��Z�u�lA/��RS�?��K
V��{���uKVA�(]��mV�M���J�
� ��%Yu�y4�2'�fY�0Ʋ�]ϲ�n���~F�@1��T�����iZ!ɤ���K%�YFB�1
`�
+©�0���(�r�jD9k3.��;��F@�%�+1GTb�"�K0Pxv+�@�i�[�|w�[9�f@��1��id'L403�$N'�ù+�e��hG��o6&
+t����x���ȴA�ȳ��B
bz��䘵?>g�c�ؚu,Z��k�9b�s�w�:>]�ݶ^��c#L\r�T �O�U8�y�$�B��i/a��g��2����U���e]eP��~�d�eex4�;�,l�uX�����'`��N��3��!&F����üT	�
	E��b���[
�*�c�;Ū`�n�*{X��ܹ�;u�{�q3�On�6g��È��4ØA3uI�Q�Npr�S̉�)(�Q,n�S,��7P��9��
띆Y�F��=gdώE��@�]�!D�)�0B�Ě�Ű@G�aN��0r�a#�
� Úv����T�_����F
�B��FdS��@�5�M��
��p'� 3�ڬ ێmd�D��q8��UÐҘ��|�pC�ۗ���H���19��j(�t
���%C׈�{���PJ��{1_&�/bR =桀�$� ����x�4��1���z��v��#}��X
I����#n�z����O�9�
+$5qox�������(cHs��PG�YN��Ǐ�v����[�����nWA��S���̯����X���̾,�$�;n��� �cY}t�h�N2n�^��� ��/ٿQ�mRGw�X����3�v=3C�if�l?��q#���@w�n�!d<K��
��!��=�X(vUA
F"�Nb���i/�a�;����m�u�q��2�
�]Q٦�3{�����>I-������y
H��0�:��Œ�
+F����ճ��V��3��@1�۞*�Fu��)
�	�2)���]?��=E$!ԭg��	uĈ��,��G�|���
U����2z�C8�~��q��b�@�=n�zh7
�=��	�8���6�0ݝt�('$�'��n00����Nbv��`tĂ݉Y\o��P��
w�6��%�S at _ʩL
�pR�`ԝ�����Bh��c��|�S
�
An�/��C��&ds��>� ]x�8��]&x�i "�'�I��)�Y_����h�`Z�o�q����z�+��2�nA��}��������!��a��1�?���6���~���j`��W��B	CݗOm��H�K�ݏ3�ۿ�{������^��H�}�u������#Z
�qW�+Tԯ��ͫ�g{�����
�����1ERa���7Է�-��.n��u������{�endstream
+endobj
+1951 0 obj <<
+/Type /Page
+/Contents 1952 0 R
+/Resources 1950 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1987 0 R
+/Annots [ 1955 0 R 1957 0 R 1959 0 R 1960 0 R 1962 0 R 1963 0 R 1964 0 R 1966 0 R 1967 0 R 1969 0 R 1970 0 R 1972 0 R 1974 0 R 1976 0 R 1977 0 R 1978 0 R 1980 0 R 1982 0 R 1984 0 R 1985 0 R 1986 0 R ]
+>> endobj
+1955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.3149 696.0019 436.6722 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_3e6dcd6f5d8e3ea263c9205b21a83e48) >>
+>> endobj
+1957 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 634.2335 262.6315 645.1375]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6a54c55d8b52ef353df7cefdfa632d8d) >>
+>> endobj
+1959 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 595.3793 206.5821 606.2832]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_5e801a56c2c3dcec13d2d87adf07ac47) >>
+>> endobj
+1960 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 556.525 204.0118 567.4289]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_19b0ebdb3476fe1feb0f51d9328fd384) >>
+>> endobj
+1962 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 517.6707 173.4667 528.5746]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+1963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.9648 517.6707 204.1813 528.5746]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_56eb4e32ec57658bc9e7823cd42ecbae) >>
+>> endobj
+1964 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.9969 517.6707 267.5532 528.5746]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+1966 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.3758 478.8164 291.0441 489.7203]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_03c487cbbb8731e1c7c9131a7a1faeae) >>
+>> endobj
+1967 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 439.9621 288.633 450.866]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_fbd401e5de5c3b3b7bcef22ffbfd6fb3) >>
+>> endobj
+1969 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 401.1078 179.5535 412.0117]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+1970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 401.1078 250.6762 412.0117]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_20874a85120477d5cf11da451870d497) >>
+>> endobj
+1972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 362.6271 322.077 373.1574]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_93c37cc32a1f50c36ec15d67fdbec3aa) >>
+>> endobj
+1974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 323.7728 319.3174 334.3031]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >>
+>> endobj
+1976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.58 284.5449 192.2857 295.4488]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_31f5a518ab35f859aafd220bc3e38dfd) >>
+>> endobj
+1977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 245.6906 226.6768 256.5945]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_63bd7c7767faf3c219f9c2762095e2dd) >>
+>> endobj
+1978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 206.8363 243.8223 217.7402]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) >>
+>> endobj
+1980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 168.3556 170.7762 178.8859]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_03ed91fbbeb6d32952c5d2a30bfd3830) >>
+>> endobj
+1982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 129.5013 165.2374 140.0316]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_05dd6b345e96427a50b45f9756e302ab) >>
+>> endobj
+1984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 90.2734 179.5535 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+1985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 90.2734 272.8029 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) >>
+>> endobj
+1986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1953 0 obj <<
+/D [1951 0 R /XYZ 90 757.9346 null]
+>> endobj
+1954 0 obj <<
+/D [1951 0 R /XYZ 90 715.0952 null]
+>> endobj
+1956 0 obj <<
+/D [1951 0 R /XYZ 90 653.3269 null]
+>> endobj
+1958 0 obj <<
+/D [1951 0 R /XYZ 90 614.4726 null]
+>> endobj
+1961 0 obj <<
+/D [1951 0 R /XYZ 90 536.764 null]
+>> endobj
+1965 0 obj <<
+/D [1951 0 R /XYZ 90 497.9097 null]
+>> endobj
+1968 0 obj <<
+/D [1951 0 R /XYZ 90 420.2011 null]
+>> endobj
+1971 0 obj <<
+/D [1951 0 R /XYZ 90 381.3468 null]
+>> endobj
+1973 0 obj <<
+/D [1951 0 R /XYZ 90 342.4925 null]
+>> endobj
+1975 0 obj <<
+/D [1951 0 R /XYZ 90 303.6382 null]
+>> endobj
+1979 0 obj <<
+/D [1951 0 R /XYZ 90 187.0753 null]
+>> endobj
+1981 0 obj <<
+/D [1951 0 R /XYZ 90 148.221 null]
+>> endobj
+1983 0 obj <<
+/D [1951 0 R /XYZ 90 109.3667 null]
+>> endobj
+1950 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1994 0 obj <<
+/Length 2850      
+/Filter /FlateDecode
+>>
+stream
+x��[s۸���)��3+w��NgڝM'��M��}����2��[t�e?}H�	�,���
?ؒ�9<��h��2��H	�2��h�������_/H��>�����z!�(C��rt��� 	������c�������%��|�̧�/)
�_��m>���f�o�\N����e��䳢z��xWl/�
+�Q\�"��^��u�X��`���>\��+
�B��_`�2-F����et�������o�T��n�c�4ӣ	�HK�:`D$TJ��
��E�R𦌊�4�QrSFB3�U�G��)�bخvUi�wu������^8���/��n�^Y�y}�
+~Iĸ)�,�m����0��n�	V�H:R�"�~�
��H6�HH�`#А�`=�
43���	,�M�`��btԘU�[�{(F��n�զ������	�x�Ƿ��&��w�l/���n�Ć�Z
aa����5+��M�($)�Go&�_(^\J@�L%�Z�`\��
+���Ih��
v_,7P�„�z��cO�\Kb
�XY�<J$t�JO_6�
+�tU�k�M��o�@ 
�\�~��:���G���LA�q�[�7�b��]u	!�%,CTS�f�*�RHI
�
	U���h���y���O�
�z~M����O�$/�4]����N��+f�P���"�1E:�u�o���Z��u��@Dx�*�5	ԕ@�&�DĂpm�|�����|q���
?{ֽY&8����R4�	)|����s�MD\��*!��-.�R�^)��7���Q��v��Y��`#�yRw�D3
��j!F��&V|8䋀/3npf�������-��g�kƸ����/p�9#R w�b �fi�G�
A
� ������@N�<�� r�ȭ�y oe��nN= wsz� &�����@
��yT
+����j����
VBR��`.2�)��f�7fI���60��a�
+��g�BC�Q�Q~4���6:
�n^��dF��������
+��Y莔��X���
��
���6 �v����[	�a��
�%�y,M��1��ۚ��
�{�w n��n���[`��	 ?��^[��p7�~�wꁸ��#�� 
��D���c"x����e��._�B��3��8l$#)�;f1�[�4ǣq�
�
p�
��7U�
!�p��c
���㸛Z?�;	�p�I�r|��c"x^��xD��1<_O��b��M�%
v��1�g
a"S
w�"
o̒
��m
��3����Ź&0?��`��D(ޘ���vv�
�r
+�����#�@)�(�K��=
�Q)�4�K�{{�{,%�{&� �Q��0W )%H�〔�?~㺈<~Ә��o�9�'�{��} �wء	�ej�q�bÎ5K;Ѹ�a'70�a�ڰp�Ҧ��� ���AG�1(G0J
Y"��������{�����
�.����7���E�F��,�BDà}�?
i�D�����m���f(�
���5Ve0(�Pa����_�C�������r�JL#�Y\Ak���9tL
�j�6���o�?_���"_B}�?�ٱ�H��=v���N��t��h´@
���dHV�I�>L�
]�qx|�ð%9m�,�l�Z?jj[��n���XAW�X�ľ73�
+:�i]u�B���8���d=~S�jJ
��g��K=H٘%y�:��>��}+�������Fe
朠��O0Ex_�O�
B������)�ɮ�{k����筏��X�po�tO�S��IK�g�����z	�hc�P��{�b�������fT:k���a/����>�)�%�Ȳ�y��x��:
䎏ɭY�e�
��"L��o��6����rX�1q�*�fګ`�UFcf��c�\�jx;������nS��}��J�cr��5��D�Yr$��mF�P\$j��\yt�
�8��,��"�S#ƄN��Q�gX���moF��'
)�Ĉ�������~�^�7C߯�dY���:�48�
D������ܬ��C�҂�4�t,7�#�n� ͆�~�������͗}�
�IQ�9�V��������zkvd����q
+0�%q��pa�Ҹ��=�"7�
7���HI����I�+}�i� ��P�R8� �J���O�
����y��࢕L���A���,'����
+-+;#/>���W��Qn�H��u�eac��
h;�Q���	I3�_��p��e	r�*�\(�Z�UR�&�M7x[\lf�R��O��4�׾��>�-���n�G�%0e0�&�u�"7fI�cqO9�\m��m����
��R�����
m��eR<��*C�q�R�1��n�ҪG➬z<9����p�c�qT�У���Cu���
K*�I���1��m��rG�,w<9+���p�c�q���#���w�
�;����|ͪMj3�5��y��q�����.p!��Ҥ�
�  ��3͏~z���R��T\�)6uw�6+�V`�
s�(v�7>k�J��[N��k3
�T
 E�ҁ)+e*Uk�'A[[K̦{�ʏ1
}Yo;�����3�L�)R�a	3�b�}�b��rc�&_ݮW��(��s
��m>[/7�}
�+��\�K	�t��
+�3=�OB!0q��NBi��
�n���B����
�Q�.�
�g����W1���m�3Xڒ{
m��@�:�o�A4"�A���4%=��=�����;"CB0Qw�z���:�e��/��;���<���?\
+1���c�:�SS
G�V�=�,��Ͷ��P]*��m�w
H�4	�U�>�md���]��L�+��B9���57~��o�_]}��	�v谚o�h���lW�w
������;��6�ri���Ɇº�K�1�V-�|o.�.�FA���玂�endstream
+endobj
+1993 0 obj <<
+/Type /Page
+/Contents 1994 0 R
+/Resources 1992 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1987 0 R
+/Annots [ 2000 0 R 2001 0 R 2003 0 R 2004 0 R 2006 0 R 2007 0 R 2009 0 R 2010 0 R 2012 0 R 2013 0 R 2015 0 R 2016 0 R 2018 0 R 2019 0 R 2021 0 R 2022 0 R 2024 0 R 2026 0 R 2028 0 R 2030 0 R 2032 0 R 2034 0 R 2036 0 R 2037 0 R 2038 0 R ]
+>> endobj
+2000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.7724 651.1403 272.3333 661.327]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.2168 651.1403 448.7777 661.327]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.7724 616.6373 272.3333 626.8239]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.2168 616.6373 448.7777 626.8239]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.7724 582.1342 272.3333 592.3209]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.2168 582.1342 448.7777 592.3209]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2009 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.7724 547.6312 272.3333 557.8179]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.2168 547.6312 448.7777 557.8179]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.7724 513.1282 272.3333 523.3148]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.2168 513.1282 448.7777 523.3148]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.7724 478.6251 272.3333 488.8118]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.2168 478.6251 448.7777 488.8118]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.484 407.4223 272.0449 418.3263]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.2095 407.4223 439.1392 418.3263]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_9bfba21dd2d808e2eabd2348e92cb96a) >>
+>> endobj
+2021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.1831 348.1151 269.744 359.019]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+2022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [377.2248 348.1151 419.6152 359.019]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_3504c6384a7e40501e2cfc49ba870ad5) >>
+>> endobj
+2024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [272.7712 254.8179 350.5786 265.8314]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.8129 220.3148 358.6203 231.3284]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 197.7669 202.9022 208.7805]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 187.1743 202.9022 198.1878]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 176.5816 202.9022 187.5951]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 165.9889 202.9022 177.0024]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 111.825 182.2336 122.7289]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >>
+>> endobj
+2037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.8919 111.825 358.5808 122.7289]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g00a906832c41c42a70a5c9d194e07a7d) >>
+>> endobj
+2038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+1995 0 obj <<
+/D [1993 0 R /XYZ 90 757.9346 null]
+>> endobj
+1996 0 obj <<
+/D [1993 0 R /XYZ 90 677.0904 null]
+>> endobj
+2002 0 obj <<
+/D [1993 0 R /XYZ 90 642.4529 null]
+>> endobj
+2005 0 obj <<
+/D [1993 0 R /XYZ 90 607.9499 null]
+>> endobj
+2008 0 obj <<
+/D [1993 0 R /XYZ 90 573.4468 null]
+>> endobj
+2011 0 obj <<
+/D [1993 0 R /XYZ 90 538.9438 null]
+>> endobj
+2014 0 obj <<
+/D [1993 0 R /XYZ 90 504.4408 null]
+>> endobj
+2017 0 obj <<
+/D [1993 0 R /XYZ 90 434.0897 null]
+>> endobj
+2020 0 obj <<
+/D [1993 0 R /XYZ 90 376.8048 null]
+>> endobj
+2023 0 obj <<
+/D [1993 0 R /XYZ 90 281.4852 null]
+>> endobj
+2025 0 obj <<
+/D [1993 0 R /XYZ 90 247.2213 null]
+>> endobj
+2027 0 obj <<
+/D [1993 0 R /XYZ 90 212.7183 null]
+>> endobj
+2029 0 obj <<
+/D [1993 0 R /XYZ 90 201.752 null]
+>> endobj
+2031 0 obj <<
+/D [1993 0 R /XYZ 90 191.1593 null]
+>> endobj
+2033 0 obj <<
+/D [1993 0 R /XYZ 90 180.5666 null]
+>> endobj
+2035 0 obj <<
+/D [1993 0 R /XYZ 90 130.4326 null]
+>> endobj
+1992 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F37 1999 0 R /F11 416 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2041 0 obj <<
+/Length 2030      
+/Filter /FlateDecode
+>>
+stream
+xڵX�o�6�����NFW
�z��^�=loۦ�)p�va(6

�%�
Iӿ��OS���
��9�g~3$Y`�#�
/R����d��_��
L�������7����Q��dq��
�%tq��
��2&��zIpTt�bu��8j����t��Cy�������W?��+���18���˾-��|~�[�-I�ZM�&,J������x5��%D)�����؀5?\`��L,
�#��t���������/��Y��!{�7(C8�y� b��
���c�w�_we;�M��|'h��N9b<'����zD�C��qe�h>J��uS��1������;GQ;##wb �e|�Ӄ��<ߍ�Z�k�o��
�)��:���zP�����3�i(;Kc">j;X�fLO�%9`�E]C i��a���8;��p�-b���r�������i�A�b=8����w<
o�wd����j#D����<�1!�ךШ�%�C���Y-�m&ۃ���342a��	3j��z�~� [...]
+'o�q��IP.��#����o�Q~۷���
{
�0ҁ
��hDzrӆ�џ�H��!;n�Q'ۦBFw�Y)j���b~W�4�f�6K۱�V����!��y�ˢ��Yp6z��Z���~U��w��@N�@2MJ�<���+��e.�=�$�eW���zgʃ�<C�e�����q�P8�1Ē$��{�{�
1aPE��$!�Y��O
�[�CAM�2��	�ެn��r�ՓY�*H��8,e��-�
p�f�(ӧ|�#F�=f��ײ��A�7��P}�
���bPC����荘��eOSn�2gï�êӺժ��
����u��d���B�O���x�9�ܩ*���ө�!$�3�p�gPm]%�
v�Q"^�$x��n?ɡ?B궳��σ��
zWS
*����V��c�js�4.!�j=V��?�}��3�e(ṫs�QЅ��%�
ȭ�J��]Q����H�v�]l�$f��Թ��O7���gF0�sF,�ñ7�Ԃ����3a�:Fƙ0��8:g��L�❹���I�[��	�9G�f�Pաr7s�(OSR����$K,IMs>�+:�8�:��
A��2�R]�����k�����X6����Y�'Jx�S-�GR�&\
:o���Z��*7����
߉R9D�j�_�:Uf�|8f�0O���A#���q.i8`]��Nb<�h�5�뮓��r�8��E�r��?�
s
�D�YM
�����	V��U�X����
�t��rVӭ|��B��0�N�q/!�'� �
��������|훍%�����k��[h�
}��]
�Aء��'4�ND���
���]-u5o�{צt�OC���g�q$r�pUU��( M�84�V&UOvj�;�旐3hH��r�:f�<
�VU��d����� ��r�5�bB?L at .r��^��d)�	���;K�1HEO�NS�rL'{��K��*6���0D_8Ǖ;�0�&�!8JE�A�
+�@n�b���C�S�!� ۡ]�dJ�]�G��Wz}[)����|����l�&��\w%�ZƚVJyR\o��N
2�|��=���=�F�l�:��C�\7C�X�i&��ݞ&�lg�vk`9���=���
Ly���]����Fӱ��Z��A2O&�{��q\B�R���c���Τ����
�z�W�Z�
�
l?�1�2��ǚ
e��:�}�
u��s�޻��
+ �
+�M�3�a���#�֠�=�C(ƧP���ߖ�v
�.Ž�����,��?c�}�{[U.y�Z{ٌC;Zk��
����~G����B��WO
z�D$�aU�#'4�9	�z��e���)1y�V!��o?�������^v�P�k���ztW3�L�S��U1��4���I�c�P��sA��Kf�~�F�>�7�������'|u���������{4�eۡr�l�����)��/�^�Nt����M!Iq6��_s��O_�B}To?��?�@�endstream
+endobj
+2040 0 obj <<
+/Type /Page
+/Contents 2041 0 R
+/Resources 2039 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1987 0 R
+/Annots [ 2049 0 R 2050 0 R 2052 0 R 2053 0 R ]
+>> endobj
+2049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.8935 286.7203 513.9963 297.6242]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) >>
+>> endobj
+2050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 274.7651 155.753 285.6691]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) >>
+>> endobj
+2052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.4728 207.3217 424.8693 218.2256]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_63bd7c7767faf3c219f9c2762095e2dd) >>
+>> endobj
+2053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2042 0 obj <<
+/D [2040 0 R /XYZ 90 757.9346 null]
+>> endobj
+2043 0 obj <<
+/D [2040 0 R /XYZ 90 733.028 null]
+>> endobj
+2044 0 obj <<
+/D [2040 0 R /XYZ 90 681.9891 null]
+>> endobj
+1949 0 obj <<
+/D [2040 0 R /XYZ 90 659.6773 null]
+>> endobj
+2045 0 obj <<
+/D [2040 0 R /XYZ 90 659.6773 null]
+>> endobj
+1988 0 obj <<
+/D [2040 0 R /XYZ 90 583.0134 null]
+>> endobj
+2046 0 obj <<
+/D [2040 0 R /XYZ 90 568.4431 null]
+>> endobj
+1989 0 obj <<
+/D [2040 0 R /XYZ 199.7272 503.6148 null]
+>> endobj
+2047 0 obj <<
+/D [2040 0 R /XYZ 90 488.9449 null]
+>> endobj
+1990 0 obj <<
+/D [2040 0 R /XYZ 90 355.16 null]
+>> endobj
+2048 0 obj <<
+/D [2040 0 R /XYZ 90 340.5897 null]
+>> endobj
+1991 0 obj <<
+/D [2040 0 R /XYZ 267.991 277.9182 null]
+>> endobj
+2051 0 obj <<
+/D [2040 0 R /XYZ 90 261.1911 null]
+>> endobj
+1343 0 obj <<
+/D [2040 0 R /XYZ 487.7735 198.5196 null]
+>> endobj
+126 0 obj <<
+/D [2040 0 R /XYZ 90 181.7925 null]
+>> endobj
+2039 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2056 0 obj <<
+/Length 2135      
+/Filter /FlateDecode
+>>
+stream
+xڭX�o�����BH��B��
�!�llw��s��u?�.
�[D(�!��N�����A��ݴ�ah�7�w��lI�-��dD�e�_��,�`n{
��!��n�7J.�(��7���bDrƗ7���D�֌R��v��?�{��i���'}���]��(y��Ǜo��;ݤP
E��x��.���
���ry�	%,I�r���b�n񏞏�0�L�L|��\���6rœ��u��v���m��u�W%ڳy#��x��D�	3|^�=�����T�~�JU�&��Ӵq�˪��������rGZzgT E��(
�F䍡!
�/�U��J[ٕn�vv��i�T�wM�<�e%e�ϏtF���H�u�ʪ�':���;��|��̪�����,��r\1pG���1�Hi���Ql��Y�UW�]�7G��b����e��݁��юe����ڬ��;��r�d��F{i[�r�yk�
vv��q�
�dk)
J����S�;)�'+r=5�&ZZ�E��i`g���-�I�c
�
+F(��`��[�[0ջ<Z�r_��]��&�������F�p�ٙ��}]V�w:K�Z:ms��)�
�P�"=�t�N�[�	*O�7�{���'�J�u�/�i����u����W�q���tZibI(����P@İJ�U
O�>��z-��D�a�3��c����6/ 
� C��:m���uU<��Io���vyy����O��f�ɚ91PB��P�ɏ�P���
��
����{���Uȴ�9�����6�v<��`c��
�P1�o��T	C�>ϻC�g�ۓ��P�
t�+
6S��Ƕ��?������?���|<&$T�t���TҬ%w�!/q
���3!�ܞ�t��Q1b�mt���;{�/NZ}m�C�t,���DX~�����Ch@"V���̜��ѐ(�K	���
�[̓��i��~=<`|>���ư��ߩb
�&��D�I�T�P��ڞ��)�@c�~�}��]z�5�T?:�M�u���QS��gm�tQ�2�(*L�c{�T܇�$�?��
�����lb�3��n�n [...]
+3�9�FρE�6Ӎ�<��
������=�^Ԁ
���#�ib�s4�(�����
+�@zS����%n�dia�g�E�9�m��<-��<T�E��3`��;�n�Y��L�ef��̼����ØP����\&��%=�zx�ױA�>㋊�Ǵ�]�L�X�8���X�i��T����#V$%���[.;��BLp�P�`/��*:�b��B�H�%�9�~2���x �}��
��	7z�[2@
/ȶy4��K*�8���G�>l�
�1Q`�ժ<�u�g�E�ϻv���T<0����u��7�2p��D
�R��p����7�:��	�T �Hb������9 �$�=/��:�;�=���'n}uJ�
���5�bZ
�Wl�%/.�g
��T���ӗ�H&�Ͼƈ��>z�K
���Y
#�޳��m�	� \�ݏʊ��<# �ċ�I
t��6�ظ[qxPtv��QG6�C���C��p�V��P5
�����[�s;�"<����e�"�����47A�$��=2ԭ��t��ˠ���O*���Խ��h��{1}� ˶���
+z�~u�g7�?����tr���w�1��a8�/�	c,8���B94�ra-���U^����*��(��TƸ
�
+�ʙ���k���b
�?�_��n
�h������,~5�l�鸓�8� �?�eV
�N��Sq�b�84�}6�uAv�>о�>����P*K1���#����������"��a�T�6��F���!~�c��~��?e�/�8�!-��s�@"��OP�֍�Q��h�N�s� O(	

y������8�
XNxs2��/���r�9
�$kɡ�����v3�+��t�����{�3]F������#]_z�ǜ�@t��p�~	�Q�?�eendstream
+endobj
+2055 0 obj <<
+/Type /Page
+/Contents 2056 0 R
+/Resources 2054 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1987 0 R
+/Annots [ 2059 0 R 2061 0 R 2062 0 R ]
+>> endobj
+2059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [103.6686 517.7775 211.2045 528.6815]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library) >>
+>> endobj
+2061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.0329 307.6728 284.8909 318.5768]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9a28ec8161898b61530de9bbb4a3251d) >>
+>> endobj
+2062 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2057 0 obj <<
+/D [2055 0 R /XYZ 90 757.9346 null]
+>> endobj
+2058 0 obj <<
+/D [2055 0 R /XYZ 90 733.028 null]
+>> endobj
+1344 0 obj <<
+/D [2055 0 R /XYZ 90 456.6014 null]
+>> endobj
+130 0 obj <<
+/D [2055 0 R /XYZ 90 451.9938 null]
+>> endobj
+2060 0 obj <<
+/D [2055 0 R /XYZ 90 392.1773 null]
+>> endobj
+134 0 obj <<
+/D [2055 0 R /XYZ 90 213.4111 null]
+>> endobj
+1424 0 obj <<
+/D [2055 0 R /XYZ 90 181.4826 null]
+>> endobj
+138 0 obj <<
+/D [2055 0 R /XYZ 90 181.4826 null]
+>> endobj
+2054 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2066 0 obj <<
+/Length 3281      
+/Filter /FlateDecode
+>>
+stream
+x��\Y�#�~�_������yp|�7٬7O�!�H=3BtEǎ'�>�n�b"{F3��alk�S��b�ǣ�&#
����#%2���lu�Gw��﯈�=����׏Wo��bd��T�>�V$A�:�8�eL"��1
��&x\�V���5�������O��]�{��˯֏��b}ؗ��	x��������m��&z\�g%XeR��׿~���ۏ��k�`�X�����W<�Ck~�ˆ-F�#b

��8e�����;���
}��
�eK��h�?�,��1���
����
����)#��9�!�� hD�`�8��d�����`��)�

���=��ݝ��!�E ��Yv
�`�����1$�O�6Si�,�tP9� n�iE

��n�"���HS��\	9���yQ��M�Il���H/�+^�+�O�,�o���t�1��9쎳�ʂ�1:�Vq�%Og�<YB���PJ
+@&2Y`�,�
^��v
�`78
SL�,�p�Y،da��
�F#��}>�#Ѷ:$TPĩ��8T���8�yL�"W@�^T�'�Jt(K��k�����._�����d1���Ys�eF
�T"(�ޡ��*�`
�wւ�j�n��_sD�7�l������p��ͦ��o��w���������1�w��

II5��A���WHR�O��
+�)
6*�ףr~���!M���ñXv<C�
�ڞ����8t�Z�Ū\�驪�m�)j��'� 
���aJ1RP��
�`���r�vhj���a)�Y�c`�\�V����iȭ/���rG2�
��v���Z��$&���Il�G�8FTrzre�~(�ݩ]���W}�ܶ�*+�����ח0�^n����m���&���
+H�1¬F��N �$V
s�_�kL�!2A
s t>��!��xzH�/UX���B#1�����BL	Iگ��mVH��I�C��S�$�'
I�f��eq{M��S��艔B��,�rD
����Yz�4��޽HO")=�XO��5&�3X2�����=��(�/�&.n{�� ����ZsZ8
,W��㟝����
��nF8R�D�-���`�^J�l���T
�Lػv]�풵-�mb��X���RdP9:02��l6��f��
����
+�^_�a��%9�����GS�����?v�����!���бkI|]�x
+��O~��UGT!�9�,��C ��mrT�Au�vvڨ��i���ʹW	�
+Գ�C`4�	d#%�
֙HnjX�ncYG�n�Q=-�t
�)-^J���boղܟ�n�4կ�\A
0*3�`Y��
>w'̩G���5���,�P���8�M�����$:���Y�נ�s
���}����;/)�����i,��xn���2raZ�����s4:v��ܝ�@R	#�A��wƠp at 7�����*w�&��
c�u�m$�-��/��y`�A���f9�
���Myx(�u�[�h���H�F?��3�b=o�h�p�h>�ͯ
�z\��0	O訐*�"
����<��\�i�騇�u42x����y
��U:�}��Qmu4A��Q5LG�̆1�T�:�㯜�Q<� �2Ҵ�1��L��󴎲JG�4:v-
�rWؽ���R���$
���8�rk�l���2
+�])�E������z��)�wv[�vz�����J
+���ܝ�Q��Qjw=�x}
����t���:L�g3~�D�n�z�Γͦ�����F���z��96
��Ҵ�;��i�f�HT�7��ִ����1�v�
�62`�M�F�47	�c�ߴs
�P����1�y�DO���<,��&bS���6�1M���5Y��4��3���
L�vƯ������0��3l:v]m�
�L���r��yta at _u&(��A)
bҰVg<��%���yd#U�
���y���';���
\��%�|�j����VD����`���~}��n�P�
C�=ͦc�U�a��,7w�Y��u�}�]λK��s�	L at e�PE�ou�s*�
+y}�>Il#U�
�G��:/lŻ�p
S'H��}�	Ǒ
���$!������0E���c� ˋEd0%i�^,b�O��!b�fӱ��b���v�gJ�NJ��P�vꠍ2�Nx�@P
���E��b	���^ �$��d��*���?
��EM%,,�T���lQ�E��늺�vxQ79
(�
��]W�7��z�3��DžX:��N!�(\6��9%-(��=��D��
�2��48��� -y��fU��\m{X��#���N���
�}Bm78
��4��]w��P,��)�e��w�nZ�lw�/��H�ƃ2\�Ԉ
�Z=�R'I�xI�G6R��a�m��dpl\�e�;b���U�����.��`�=�[��Tb��!{TV
"s	)H;uJ�
.
t M�m�r�t}?��mV��fcu�����`I���dP(̈́
+
Sxʚ=q��%d#l`4<ám�r�i�.����߶�r�{pTb��j��B �0��uLL�M�����jH4AL��0��P� ��aS�bXB�Ok���5�;�W��ݢ��{��"��
�%
+C]	z�cO�Pa@#un�`y	�
�44�׋h��	*��0DF�l:v�BzS.7�!�CWD�ɨxP�����!Ψ(,��VC��9
����B�CP G���h�x��r	�s��Pl#%�
����-�����9�<TK������>BB�@�f`y-�
��4��ki�������RN�nqHji�ϱ�صtV�o���=ɐ~��t$*�ۮ�0&��g�SHŇ� �s4:v�	(���N�"�2$=´�A@��n�/�(

H��t�֧���c�٢�9�m2˜L@<*G�H�hd�NםHT���9ȁ��
���A��J�'�4
��ʑP��B��H̫H at P�f��?'�L��nF�q��7UAWO
������f�6R㰇e�afE;7�I<+��a�p�0\��Ɀ��/��ΘǾv��^.�p���sf�"L����I��iB �	�u����IC�ɗ��_�*i]VL
�3�o�.����/�Fw�r�M�Ÿh	��!���[���av�<������j{<�s��n*��
+���
uG�����~��F����I���Q�~Ö'a���f{�w�r{�������c����ݟ����+�a1f�P>,�?�b˨�"��ad�����a��4�T����_��S�&�7귲���
�������˷o

�l����v������mGS�=g�X��&���?� �
+��[
b�م���:��#�
�
*�L�endstream
+endobj
+2065 0 obj <<
+/Type /Page
+/Contents 2066 0 R
+/Resources 2064 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1987 0 R
+/Annots [ 2070 0 R 2072 0 R 2073 0 R 2075 0 R 2076 0 R 2081 0 R 2082 0 R 2086 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2097 0 R 2099 0 R 2101 0 R 2103 0 R 2105 0 R 2107 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R 2113 0 R 2114 0 R 2115 0 R 2116 0 R ]
+>> endobj
+2070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.4298 169.9995 708.3337]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_00a22399f16a18c79f9bb770b2cff2e9) >>
+>> endobj
+2072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.9404 169.9995 669.8444]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_940a01acbce1e96ff137412e7f4b5009) >>
+>> endobj
+2073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.3367 658.9404 253.4259 669.8444]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5974 585.1751 219.2406 596.079]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.7388 585.1751 290.3532 596.079]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_c0a9230a10727b81a9f1399a18233b61) >>
+>> endobj
+2081 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5974 549.0432 219.2406 559.9472]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2082 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.7388 549.0432 290.6621 559.9472]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_feeba588c9c9b23b00f13ecf6361a42f) >>
+>> endobj
+2086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.2253 535.7837 390.0817 545.689]
+/Subtype /Link
+/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >>
+>> endobj
+2088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5974 512.9114 231.4245 523.8153]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.9227 512.9114 277.0826 523.8153]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_fb7ea6d89400663cf4aef4a148c962c2) >>
+>> endobj
+2090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 476.7795 205.6917 487.6835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+2091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 476.7795 261.3124 487.6835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_d33b4a481450193ae7d8ba0d2c7e1503) >>
+>> endobj
+2092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 476.7795 332.1558 487.6835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2093 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 442.2753 205.6818 453.1792]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+2094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 442.2753 261.3025 453.1792]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_963282bba5b001cd48eaa67ab805ea53) >>
+>> endobj
+2095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 442.2753 330.4624 453.1792]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+2097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 407.771 212.3266 418.6749]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_aadbabf60a8c0bd3aeb81089d1da06da) >>
+>> endobj
+2099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 372.0127 220.7749 382.5431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_b5a41234349d3e901131848b59ea7f8b) >>
+>> endobj
+2101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 335.5073 270.438 346.4112]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_fe16d3f83ec19e54ca0e9da40a230d42) >>
+>> endobj
+2103 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 299.749 218.4036 310.2794]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_f746286a58d47073353baf95a40ccf43) >>
+>> endobj
+2105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 263.6172 221.7316 274.1475]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_73469cfdf1361974a63141faf6ad310d) >>
+>> endobj
+2107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 227.1118 266.9613 238.0157]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_19de0ee134b4fcb18c92768529cd3352) >>
+>> endobj
+2108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 190.9799 257.3979 201.8839]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_e0814b788919c541ffbf20dbb186ab41) >>
+>> endobj
+2109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.735 190.9799 361.9846 201.8839]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2110 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 156.4756 258.0053 167.3796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_74e0194b78d0db72f89ef8d48ab9a4c7) >>
+>> endobj
+2111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.3425 156.4756 362.5921 167.3796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2112 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.4155 121.9714 214.7001 132.8753]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_c6f8b67862809fc13eec7be898ba959f) >>
+>> endobj
+2113 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6512 121.9714 318.9008 132.8753]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2114 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.9393 121.9714 394.9562 132.8753]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2115 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [431.6396 121.9714 477.6565 132.8753]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2116 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2067 0 obj <<
+/D [2065 0 R /XYZ 90 757.9346 null]
+>> endobj
+2068 0 obj <<
+/D [2065 0 R /XYZ 90 716.2211 null]
+>> endobj
+2069 0 obj <<
+/D [2065 0 R /XYZ 90 716.2211 null]
+>> endobj
+2071 0 obj <<
+/D [2065 0 R /XYZ 90 677.8513 null]
+>> endobj
+2074 0 obj <<
+/D [2065 0 R /XYZ 90 600.071 null]
+>> endobj
+2080 0 obj <<
+/D [2065 0 R /XYZ 90 565.9615 null]
+>> endobj
+2087 0 obj <<
+/D [2065 0 R /XYZ 90 529.8297 null]
+>> endobj
+2096 0 obj <<
+/D [2065 0 R /XYZ 90 424.6893 null]
+>> endobj
+2098 0 obj <<
+/D [2065 0 R /XYZ 90 388.5575 null]
+>> endobj
+2100 0 obj <<
+/D [2065 0 R /XYZ 90 352.4256 null]
+>> endobj
+2102 0 obj <<
+/D [2065 0 R /XYZ 90 316.2938 null]
+>> endobj
+2104 0 obj <<
+/D [2065 0 R /XYZ 90 280.1619 null]
+>> endobj
+2106 0 obj <<
+/D [2065 0 R /XYZ 90 244.0301 null]
+>> endobj
+2064 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2124 0 obj <<
+/Length 4040      
+/Filter /FlateDecode
+>>
+stream
+x��\Y��~�_����j��pU

�v���ƻɋ�Ri%�c
����קA��V3���ڇ�H��
��Ef����3%2���j{�g�㯯H��
|�6����7_I13�H*g�o+� A	��_�8'���1���&x�<l���������l}X.��?
����>�|��|���"+�o���/6ˢ�/�n��5��l���+�
+ϕ����7W_��0��L
�?W?��gkx�o�0bF��#��1�ζW�2������߽���ꆡd0C���GZ��V�!ɵ��A�
l�
�4jЈ`��bRO(��(�zA[�'D!I��y3� ���� B��m����*�J�
	�>���@�12���ozG���`�:|ll~h�q�)4=��v�K����uQPh���g�[%bS���wZ 
���S�
�OM��O����0��w�����CV�~ׅà��E<�*�Q�(��n�*�&b�9���!�p?rjB�}
+Kϯ���>�����U��z��
CF�H��J�0�U����x���2�4!fj&�}D��Lp%����3�R ���)3��u�	H��@��
+��.&�T��U5���^��g����4A+���}� ���Z at _g��,����fQ)DF�W�U"8�)!i�ս���.��I�1����K��Lj��X��aQM�M�>*��5ФR�*U
F���ʢ�!+��]aq�dP-{�d�����1���פ1�o�9�/w��b��<�W�Uu7��u;�H(n�ۡ�� 
I���q�i
E
t�/�l{_>���cH�0����,�����?��Y�@�b��6�>쭶z��x��R 4��|�
��#�5F�mHiCVH
��e��f3m�+}c�6�-�e��ݴ�k.`�����
��'�ͱ��nd{Q�Wu����.��x"`p�N���u��ٲ~��Q�ylلj���Xfk4>Ф@Bk�gU�Rp�4d9�
+�YR�
FTa"n�
+��^2�GT��
�"���O����Ta�U�C��f�[%b[U(�Ӆ
0.
+9�M���)=�E�AP�E<�*x
q
+B, ���!̉��o����;Q*��Љ�8��0m:	�w�����a25�>��w�(����Lx�
�*1���(�S�qQh��q{�$���I����$rfiIDN�8"�X��p_�"���<���@��E����d�"��D�U��?&��ڼ�
Q=ČH
+�|g�ݐʋ�kD�/.@`��T��7K
+��È I�mHv� 	1L 	4=��H4'��H� I21'�@��{� ���$@� � 	@L r 	,=��	�xB� ���$LHB�L��I�$@���'@��8	�'@��8W�
�J)�4�j�'���M���U���ĪP1�qFoU��J� j�,
�i�RBQ�#T\"��>"̛�!���`�$�>yA� �)�-H	��zy=�
�#2!��<����hP�[1O;���P*�t �AY�'�t�V�o�+�y�Ca���Nh�9�F���&��j����
ޛ'0t�Z
��l�~Z�u��](��f34�g� `9� x�tv����`
+qQ�j���+g�,W��p��U�[�zզ��^��z� e�<K�j�hw��SQ�
+��i�(e�VI���μ"��C�JIS������r��x\��g`�a
+����Z8Ey�W��i1J�0$�0:�o� A9CD`�i�Q>�p��01�>��w
+%2
+si-I<�*�	%;�q>+r�ky)�\D8�Y�n)э��1�)���ig��R�K$W؞�	��fI�l;�d"nC�A��b�@�	4=���k�΋[JX�
`�5ď�M4#�*���G�E�%��h���
+o����;��E<�*���G-M���ў��⢣7m1�tf�[�
^� ICh�-���̠���$��p�_�$�DЖ����,M�-�1���u$�{I��d
Mϯ��o{�AD3�ȁ�JE�y�T\tr�x6حsٮs�G�
�Y��~���!��
?j����V��~���/�e֜�e�v�,���	(
�?aiW at w#�A��Q��p��i�`#

4*L�a�ia������f6Q��A��o�]�;U���~	��/#@�������������[�pGᒺl���ˆ.�߯�ۧN�{�@t����{�HZV
qVI��,ڐH;f�!�ӯ�x�u2���<��*
���će�Xc�
+
M����0��*l�q�EA�(51�<����z{xf��}�!���(
�a�U��}���i�7��
B�%����MoVi�����W��f��o[���ԥ�#OL%a��Z��I�}*�l
Z�/����~n)f{�c^��
�5�</z�u�(��j�p�f�j��Z���y�A:�4C�
�(2
�qd;�$�’qD=�}�,��c<�o��`_���w�b�,%⒑����)=�!_.��C��fE�(O��J�`�
��,�jU���3!xu�|Ĩә���Ia���WS���,Ƥ�)���Cg�C�
��`�h�_
Y
�>c�ŧ֝����d���t������S&���Fo��_mfSЫ��&�̞ʲ� |F_~͏j��<���,ɲm��M�mX6{
ˆ8&�lQϯ�	G/=���H��x�Dx
+e]عm���q��7���y2~ǫ
��kB���A?l��$%�'S$���*�Ja�T�G�3h�C�Z��/�kz	��}D�՛Օ�:�ai�1G
��3����0r�O����H�i��և�:��,�sR�
ȡv�2v�(`�"
U0D1�ֶ������X������}�*������Bct��
	C�
#��[�|X
"(ۈ�Q'&�|Y��]]
 H]�N��x@y������*�l�"����2���i0��To�. at -����
+P;�(�1� ���N.@���
+P4�� 
1��a�s�ϩY��)=��BT,�
�:a�SF�x2�U��+�2!�W�~�![��$[�J��fX^t���#V��YX�Wå	꽝Ƅ#���O����X��r�&��x�
+*�!�$el"��=�qym��)�E��M6�Am\V��5K�A�{;�;�>�����W��=D�f���9��7@sPX��;�
vǗ)�:�k��N%ndE��b���e}A���q��a{�F��Q[����x]sVɲ�r�j�MQk�<�� &��8���j{Wf�"��gu��-FM�7�c��!.�
+�a��i�XÕ7O`�z�t���<���%��0V�r�1�3��E 6���%���#R��Y���S1N�UY�g_Lo���b�Qc
�R"��3d��3 5<?�����u��x\��o��l훠>`�;
�}guDP��G~��HQ�:����,�r��x\���gq�c
+���Vj��>;,�׈F�X!l�C4/�*�z�tPD�X"��'�ۧ`��N"dn9J�x*�U��n0J�C���@�^���rc���7B��v���_�z�
��?+
+���g+G4?���y^�k
�
H�u�Ԋ?�ܜ�*I�x�}��Z
�Р`���{�JA���`�R8�t�h9�U�x\W)�aϬ�)�"����BZ���������X��нx���[%��ehb_�d�X(��,7S���S0z~�
����d<�*��1��4Đ.� &�Eg��>b�™��i9R/8����,��s^��1OՂiռ"L�u��T���nh
+��v#�;�o���0#�	�����SW
+,�S)�ã���Zߗ��٢��`�F�5 ;���c��޹���O�a�H��Ջ�x��q��
gwj�T��
�`tDֵ�����n	���@�A�+���JX4o3����j�u�6��޺���l~����Ev�ӵ�l���a9�����s���"�U���j^�.���j=���R���3w�m[t77ܴ���#����+���޼y||D�
w������͛��`����!�n
;�
� �
S$���}sxx�?�U �p[-W��� �P�Pt��endstream
+endobj
+2123 0 obj <<
+/Type /Page
+/Contents 2124 0 R
+/Resources 2122 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1987 0 R
+/Annots [ 2126 0 R 2127 0 R 2128 0 R 2129 0 R 2130 0 R 2131 0 R 2132 0 R 2133 0 R 2134 0 R 2135 0 R 2136 0 R 2137 0 R 2138 0 R 2139 0 R 2140 0 R 2141 0 R 2142 0 R 2143 0 R 2144 0 R 2145 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2157 0 R 2158 0 R 2159 0 R 2160 0 R 2161 0 R 2162 0 R 2163 0 R 2164 0 R ]
+>> endobj
+2126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.4155 709.1066 214.7001 720.0105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_751c98b69efb282a0621161fad19947d) >>
+>> endobj
+2127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6512 709.1066 318.9008 720.0105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.9393 709.1066 394.9562 720.0105]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [431.6396 709.1066 477.6565 720.0105]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.439 697.1514 240.2618 708.0553]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+2131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.9664 651.6297 214.5971 662.5336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_595a1e24f87721180098f0627dbbcdb7) >>
+>> endobj
+2132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.0992 651.6297 320.3488 662.5336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [352.0452 651.6297 398.0621 662.5336]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.6338 651.6297 479.6507 662.5336]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.9664 594.1528 214.5971 605.0568]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_2498c398da0586cf04ae6fb39fc9784a) >>
+>> endobj
+2136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.0992 594.1528 320.3488 605.0568]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [352.0452 594.1528 398.0621 605.0568]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.6338 594.1528 479.6507 605.0568]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.7852 582.1977 238.6079 593.1016]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+2140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 536.676 208.9991 547.5799]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_0355b5aaf4c371be1776ea8a4d3c9b14) >>
+>> endobj
+2141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.3363 536.676 292.4255 547.5799]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 502.1132 241.656 513.0171]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_d781777754894733c23dcfe6c0c34c31) >>
+>> endobj
+2143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.9932 502.1132 325.0824 513.0171]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 467.5504 241.6661 478.4543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_15b8de95c17452ac325ae0a0242b691d) >>
+>> endobj
+2145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.0033 467.5504 325.0925 478.4543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.8016 433.3612 190.1801 443.8915]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_797e5ee5e80baa0bb02224d3095623d1) >>
+>> endobj
+2148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 361.6315 234.2543 372.1618]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_2f85549feb9d19cb93abb267b65a7d6e) >>
+>> endobj
+2149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.5914 361.6315 305.0977 372.1618]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 326.6951 238.1296 337.599]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_456531b4f71a667f04172dc87272e313) >>
+>> endobj
+2151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [265.4668 326.6951 343.2939 337.599]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2152 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 281.547 222.0801 292.0773]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_f99d08b226ddd742461c7f26801d61cc) >>
+>> endobj
+2153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.8957 281.547 261.0833 292.0773]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 268.6984 248.8445 278.6036]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+2155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 236.0253 222.0801 246.5556]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_86bf2db672a161c2c201ef1d23ad6364) >>
+>> endobj
+2156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.4173 236.0253 306.1935 246.5556]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+2157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 223.1767 252.6774 233.0819]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+2158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 190.13 251.9674 201.0339]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_1b5e398d14c06bac64dc480c5d1a76e7) >>
+>> endobj
+2159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.3045 190.13 335.3937 201.0339]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 155.5672 258.0552 166.4711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_ea798af67f0a5fe7c40ce7b8ee9a524c) >>
+>> endobj
+2161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.3923 155.5672 341.4815 166.4711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 121.0044 245.6115 131.9083]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_3214880a916c79f0487be700329244a7) >>
+>> endobj
+2163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [272.9486 121.0044 329.0378 131.9083]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2125 0 obj <<
+/D [2123 0 R /XYZ 90 757.9346 null]
+>> endobj
+2146 0 obj <<
+/D [2123 0 R /XYZ 90 449.9351 null]
+>> endobj
+2122 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2180 0 obj <<
+/Length 4777      
+/Filter /FlateDecode
+>>
+stream
+x��][o#��~���SGFl�/
�!�dd`2��K&d���Ė���{��>�Ti�UEV��\v�
����C�����lA�?�pta�!NH��}������o�X��
+�_ŀ�x��[��8�����ւfDq��^2F���QJ��]3��
6��9]
���q�����9>�{���S��n>5��Wt�����Խ����
��]6���
+m���뿼��կ���S(�����?��.��4���D8�_�
%�9�x��\�7�W?\�!��h0�
I-�\��JHb5�|
Ũ$���P�dp���3Dsn����s�?
��S��"68,ףj�rM�ci��w���������U�v��*��d�����|3����]���p���GJ��Y�
6���X�T�/Ua��$���UtP��� 0�_e��E�f�A7�mn�.�P���*.�

\����
6�kI��\CD�����t����J�WH
�"��������?
��iw��t$�D:�ʞ	�
+	�%�܉�ě暩%P�|��C��ٟ�+���,a�
+��8��py>nv�ӻw�K�G�w]���m����~s>
>�{�7�:��?�cqC���V֎��	�%|Eǃ�P�[��m��1ra�?Z�]XRµ��E���j��
b�Ply> ���2ʢ��Vv��FE��&M��1�ݩ�$
���:��]�2�yc��z|�чv���V������G�ߐ���ȊU�
+�%�	��„���X0	9e���O�-��]�ߵ
�����g��������c��s߲�����gȑ™�f*�gx�JNj�퍂[b��0^Co���?lp���,̲+mG<=6�;�y��>�yaj�!8�=Р�7	b4�L7���#+�
�E�{ʁ����t0�pɾ>�*��ʚ:3
V�<=�.y<��x"Դ��
z0���>�H�N��ɭ�
i�zGj���@e\qвΥ51&v�&LB��� ��Y��t
m�,=�UJw
+|$�&��
�ٔ��`���#�ˌVgj
�f+%�P���^͒'
r��^�8�RB)̊z����d�0�o���l���%�üt\���_�(	
�LOSoN��<���P�����fY��0��[T�����d�l\� ҉�WC/s��G����d~
d�)�
(��2����dNR���l��gdxH*�__�PGkj:���B'2XR:�r�ԉ�
ZG�Bn���T��Ǵ�����]���7������zF��Rb��eT��l�2YՌ)k!��wI�W	�v��G@�+
}�聀�\��C
�4�X�
DO���銀�1�E&�7�
���
n�C�#	�7[vF at U(�<�#S
+����� �G>�%4l�^��.	����H
+z��
�vi*iZ'2�(_)�����ac]�Xh��I�6�?�t�5�`��
g/Q����
�T
ҩt�0�e."C�6R�m������
Ž���4�/��]Ǥ�(�
�V�P6�\1
��Ag5W
/-�RMC����:g�
K��A�c�IZ��=D�@@�|n���jH&ߑ��E1
+'���Z��W��.�
ӏ��[bi'ꨯf�&�%4��3�\3Öo;�БI.�b�,���D�%ϭAJ[j�)�)�Ȓ���/�Y'p�
_�C���n�`r�l��0|.���N���zŖ��Q��@C�J�a�o�H
+1&<��_��\
+
�r!��ܙ
+�3����
�]GUY���w7ص�!&
�E�8'�q߁��j���x��pV�m�xu�
�F
�.�XU8�
¹Rn/��b�p�EQ��,�Q��
��'�ZT͓	CG�↕}PN�	
]V5c��i8��듀�����"�eT��mԕY3)
+g��b�+��d`w�p,Օ�P
+"��YO
��[Y��3=�+tv/��A�MyM7G��n��5�

+�җ-�6J����,A�L,C�3���)^bьE�&.�;��� 0α˲�3�I�3�@�ܺfD9�Z�B�����W*jhwR9#�T9#�r�f̀t
�<jH5U��L��X8[b,t�Y�����v6)�aD'R�fa�k��˥s0��m�sT4�G2�%ҹ�:e�
�
��<��o��)p��k����$�k�V�ȱ��D���K��g�
�}I"s�lƣ��[|����O�-��Z�Q at U�9h���w|)��U	�d�_��bhw�j��@ʩ��"�j$,4��	�7�w�o��"�j���`hw�F�Tн�N�p�pL��H�5��
�L5�h{a�l5�x�C��vV�G
��0ҏvg���fq�!��w
����
���HI�9ޝ*�UjC(W�%�5�QP��f{;�6��OgI�Za�d/�'{��J�¼�S~a
}�7�=��m��2�X#���J�m:�y|���v�s��,���b�t�QŶ��!�,�

���
��8&VA}1)�Y^a�t�7)
�����_8ލU3hd����fe�����(�&R��dG�j��W�~^�h�3!�<�.�"�%�W.�K��� �Di
�ф1
#
���k�vb��E�.�)�*����@^=��c7�|�o�Bchw��sи*��/�BBR_BWBb\���C3(xZ�y|����
��T;%-:��j
nZ�Y��`�ӑfՖ�T���Sm�"�0��()�'t�G��U���
�۝'!�Kes:#��[T��x�#MLb���p���D`d�$=,=�"��	��z��X(n(�n��v���o&�������� �!Q�ȣ=���Q��ʰ�$8
=�R[C��j�e�u�sQ
jE����V5���Am��\�TKzP��&����҃
�M�W���_:�c�� 蹔�.�
����� ����`A
V���aRl�J�����e<
+lz|���.R�9�f�y9A
+��e�T�
nfWFd]7��;p��#�
r��us��DU�H at Ufaҩ�&����tb��菣����V睷��\	Wv�U���ư�›��u� <���$�QQ�==|�
�٣��@
+#��9���xT���-Ro>
\c����r#ee������SY>]�Ea^�Ec-`iBRLn?�DA_$�lr�-5�H���Sk��4�>%)���~*&���	c�bZs�M:=�RMC��8Ա�Ґ���A�����!�t/�䘗ǧD���	>~��Q�p�{=�s����ف���D���
���2�-�"�#O
+0ՌM/{g
�=��u�)�#��C��;���~��R�=��Ђ����U�����T^�:���*�
�Z�mv-�ù�Z(�w�}����*"�3�%��au�
,��r�~���}��ڂ|7�p�eƣ����5F���}2�kq1�xET����He>�:2�K=�%_e�۝ud
�C��T� 
c
�X�L	/A�MHx
����J��H
��T��qsR�3U!��yO�'$Ft��{|���R[7W����~
P_��S2�:�������?Mdz���xێ�\�D��6
+:>�Ҝ�,䔕��12��Ȱ��
��>�S~
>}NY�9e����DN����dX�)��Jm
�&r
�dyd�Y��
+���営
+�!��pt6��
HM����P�
����D3i.q�7��m�=�/Z+��:;[�\19CҷY$�ۻ�8a��`S�OR�x�Ag/
ś��V��$��J1Q�+�9��
�{or�
��E
������
*]J��78L4�嵍V��������E@\��]E
�
oÄ�Oy�}��1�mG��C��(�xj֛v�^C�	�]�E�T�W�B����N
�(HԂ3��5����Gu���ߊ��o�.n�-�"�*

Iw¥
�<���5!؋n\�m�đ�e�.�t��B�Hn�萤��O�����A��5

?���~�����o��I�W����+����j�u�a�S�ٚr5��V�t �`�N��i�_�f?ZCЈp�t�*�2�
{�[W�[��H�
W�>�0���'7���$��cIl�0�T��ǒ����C"X����V�
_#1��]��x�?|��n�׷��ӧ��0�~WvI at U�pe�S�iU���Ɇ��]k��Kbgl�;�;a
�KŚj'�X[}�l���5#�tD�`�Os
+Z
�8jPt��+�:io"
�B��ˀ���4�
?t� ���}�p�^�m;\�ղ金�o������S���W���7��1'|�'�)L�o�����
7����L�F�eY�H�J���ꑨX�s$*��#Q\�שڔ�
U[a4�ێG����հ���;�a�Zcs��\�*U�A>����d53���Q��|�G��``���y?��O�#��qI�ڊ
<�� ��L�

*��A ��Ek���Rd�Qm`�nO#q���ڄ�c[԰�1��n�F�/�*�M�
 4��=ʤn�
6�|w����1��
�}�KJ�
���r
�
|e_�$�c�
��/��F��\!x�
�cW\�ׅ��Č�U��[-ƭ��ᯘ�
D.K$�dJ�	�2!��i�I��.	m��<x���Ꜩ�g�Q��ރ*�;J$��
?�
�KQ��͏�U�GwZ��{8����2s��&7>v�Ǔ@��}t���a}|��o������ �{��Ss�ٵR˓�A����?�����}�*}<6ܠ_�5�,P;��0�\��/�R������Y������3�#��ߝϏ [...]
+endobj
+2179 0 obj <<
+/Type /Page
+/Contents 2180 0 R
+/Resources 2178 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2238 0 R
+/Annots [ 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 2194 0 R 2195 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R 2206 0 R 2207 0 R 2208 0 R 2209 0 R 2210 0 R 2211 0 R 2212 0 R 2213 0 R 2214 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R 2225 0 R 2226 0 R 2227 0 R 2228 0 R 2229 0 R 2230 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R 2237 0 R ]
+>> endobj
+2182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.0979 719.9123 237.8557 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_0c9a846ba1d6b7870ee1335688d01b01) >>
+>> endobj
+2183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [246.9191 719.9123 282.1067 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [340.2375 719.9123 417.4871 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.3057 695.3289 269.9387 705.2341]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+2186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.1044 662.1289 247.5845 673.0329]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_9c7aa455b13c8687a9f87a8362bae2bb) >>
+>> endobj
+2187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.1511 662.1289 290.3387 673.0329]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.6052 662.1289 420.8548 673.0329]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4006 637.5456 277.9276 647.4508]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+2190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1383 604.3456 281.7947 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_55127eb7ecef6bfc2bf81bab2150d974) >>
+>> endobj
+2191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [287.3783 604.3456 322.5658 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.0978 604.3456 415.838 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 604.3456 513.9963 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 592.3905 171.3608 603.2944]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.3043 578.5532 439.3345 590.7183]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.1448 546.5623 291.5234 557.4662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_281d2dcd6a197d164b1dd95ba4442df2) >>
+>> endobj
+2203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [295.6103 546.5623 330.7978 557.4662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.9622 546.5623 420.7024 557.4662]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 546.5623 513.9963 557.4662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 534.6071 171.3608 545.5111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.2371 521.9789 480.8696 532.935]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.2796 488.779 278.936 499.6829]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_6ac5494c15a8c6c1629fd960945be928) >>
+>> endobj
+2209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [306.9504 488.779 384.2 499.6829]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.8183 488.779 481.5584 499.6829]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 476.8238 225.8659 487.7278]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0047 464.1956 446.0713 475.1517]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.1233 430.9957 292.5019 441.8996]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_e3e17e7df39d901bfff06dc46ff9e04e) >>
+>> endobj
+2214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.36 430.9957 398.6096 441.8996]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.1771 430.9957 496.9172 441.8996]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2051 419.0405 247.4547 429.9445]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2222 406.4123 466.6702 417.3683]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.2196 373.2124 272.2701 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_a16de3cb0a7077eee1639aa0a0b9cd45) >>
+>> endobj
+2219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.8944 373.2124 314.082 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.2857 373.2124 441.5353 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 361.2572 202.3443 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 335.4648 432.0923 348.6229]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+2223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.2262 302.271 281.9988 313.175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_08e62b5f2126cd9c16b641b731e09499) >>
+>> endobj
+2224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [287.1264 302.271 322.314 313.175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [367.6533 302.271 444.9029 313.175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 290.3159 202.3443 301.2198]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 264.5235 456.9923 277.6815]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+2228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 231.3297 253.0732 242.2336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_d173e0ba7f7ef5f9be7c140709f4eeed) >>
+>> endobj
+2229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.4104 231.3297 336.4995 242.2336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 218.7015 347.8694 228.6067]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+2232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 196.4605 255.5641 207.3644]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_9de23b9fa5643c3bc2624ba84af28214) >>
+>> endobj
+2233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 123.0453 318.3683 133.9492]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_7e872aa58d37eb2b590b9e191bb193d1) >>
+>> endobj
+2234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.1839 123.0453 387.8271 133.9492]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 88.1761 319.474 99.08]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_d3cd16aff3b907a862c4fd7e2c60765b) >>
+>> endobj
+2236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.2896 88.1761 388.9328 99.08]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2181 0 obj <<
+/D [2179 0 R /XYZ 90 757.9346 null]
+>> endobj
+2231 0 obj <<
+/D [2179 0 R /XYZ 90 213.5613 null]
+>> endobj
+2178 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2252 0 obj <<
+/Length 3534      
+/Filter /FlateDecode
+>>
+stream
+x��\[s�~ׯ`_\i&�q�x��4m:�6�k�}I2���vB�˕e���`wa/V���C�ID��9�p���$+
����+%2���f�W���� �����u�û���K�2�H*W�n[
� A	]���tI"W�c|����ˬ�g��W_V�ǻ|[g�7uV?�z�m�ؿU��1o��������{�&���+�/�r��U&�T��w?\���o�`�� �}��/x����p�3Z�
���1t����_vo/���to��#���^q�%||E�\kx=g�0���`BQ��ܳ��J��[V	LjJNW
f��v�=ڶC� L�1�C�-h�!����
P�WD\>t
�e־���<Uٓ�T�ϻ
ptSVn��Uy�������7y�n���(G�a|�7MU�!�{h�τ$'+E("@��;�Azb��'02b>�	�@(��I�
�I��O��ꕇYz�T�޺

N�:T�/�2t�����l���
��$ő0Z��o��{̛0"�OE4�kC�T�&k��[Ð.ޗ�x� ����y�DT0d�Q`�!�c3q�1��,���SA������
b�F�(�b��q
<*c
+q*�0�����
TRkD11�Zh#�j
֒ӦƓ��E0	>�4Ґ_����1��A�$V��4w�qFAM��ƃ�IR��J�!����M��
���I(� nx�_�
(�^AÙC���
�Qϟ�k;]L���c
g�Ĕ����$�~��E^�����"�J����ځ��<"�Bf�/<�H)a|��,�P�I$0�C�N�)$���dĂ	$
�ت����������-
�A�2�s�T!i�
��C5t
�f�'�&f� �i!'

�ab���6����nv�q�vf*��]"K<(����
Bx�T�|=�mjn���1-Κ[����l�o�(m}�+C�ۍ���!� s�U��:�����ڏ>�̒B�J&��� 
�12%6�V��`Ln�~�ބn�)8�8�(N<���͹+���uRz,G�u&ΕG%"c"�T���g�V�K���I��ֱo��y<L�%�*N��G�܃�b+�A�R��R|ꀔ����,�	l����&bÌ�¾��{
ʋ�
��!�	�}�/�ۗ��e��m���wMQ��|�"�V��H��(���
�b�M��35��
d�
<���HH���-���Ą%4�Ò�h`�o���'e�[0��Cקe��SAL��(ڹ��j��M�,��D�)�D4 �H��aW�H
йl)=:�}hsR`MKL������sm��BM�A��+�a�3�Z,�VD-%���L�.�}����ǩ�T�:���[�?-%�B!O�9ڈh��٨���;�Ч��;���P���N��t�3�����^�U�m%?�:.�!x%���rk�0�H뷄����dA1 [...]
+��/'���kqIg
+)m�Y�
؈I���ؾ��
����q�����b���~[4����Y"e�梜�oPf���QoHR�0>�4�Hfw�̆�8�T���vإ/�WT(3�� �M��8n��.+����G{��o�|_n�9�{���$�͋O;!,2�xXrډ���N�o?�
ܺ���ga75����Y��1�A�L�vb�p����ahq?R'_����y���C%��,4�>�I)�<\2ı<��+�Q
���1?6�}�ڏ�SpA�g�]nXj@��$O*<,=����F@�6Yx
]/(�AL��(��
��$
+Pw.A��8Tʷ-r���E�-��Rbq�
>�bw�Іnc��|��J� y�4d�0��P����g��6b��lXo��q�l�
+D���?���C�܍��̘�{2z�Y+��'U>��-�[�9%
.��~�|3�ޮ�rS�YS�*؞����.�;����
C
��)�u���c���t7t��z�r���<n�b���fj ���A?A��3�G�3�U���!,¨�%����&����~)F���ի
+*�<��._
��aXR�d9��Xv�4�Q�O,��:�C��Y>Ԡ�3��+�I)k��J��bd:X�̨�'2�~
��ۛ���I1'�t�U�v�M

+I'�Z̤�IZ%A��$�,F���i��}�5����M�ꆞ��1L춻�������?���?ePa-�<�r�`���ӻ|�"m�a'"��A�M�d�uoQ�o
�]��F�e<�.
��A�1cf�.3bо�
R3��
�v�B���úC��.�[]-���t��^]���)E�~��fs(�5����K���
�
	İ�c�)�^�\<3�!�$$%4���`Lh�~�Єn�B3�Dh�1L�>Oh"<<_h��>	Miw<��u�@o8�W�L��<*�y�J,GY�)zI��yϬ�6bz�`����Ef����sy�� �j
ѰH�B��Z�az�&����
+M#��xXRkB��I��f�vp�JkF��RY
Ĉ��0N
�ç�ص�eǻ����\�W�)L�lxT�9��$
��'�]�"�Z>c�6"c��&c7�~0z}��D�vl��z[ճc�Z()��́�;��qhc��G;_`B
]��q�48�e�7���I��V5�k����w�������}pv�|���	C�.^��g<C��0�E����N�	��
=*����!i~g�5���[�0"�=>��n��!����=�1���믧�#`=�L�/�J�g�IP=���^�W��
F)�4t1�
��pjw��q@;�0^�,yT*�����^
��w�������95��┚؍#�H�uhcF�a��v���lX�o����yf��N�h���y�G�|��
Q
�e$%=*�O�bru��"p�v�NA�a>�C�������VCi�曩D�� �-w��k�Ȍ�!�'�ba��bla�=<
���#B	Yf�A1<(��ۥR���Q��4��tf [...]
+endobj
+2251 0 obj <<
+/Type /Page
+/Contents 2252 0 R
+/Resources 2250 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2238 0 R
+/Annots [ 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2268 0 R 2269 0 R 2270 0 R 2276 0 R 2277 0 R 2279 0 R 2280 0 R 2281 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R ]
+>> endobj
+2254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 697.9973 252.5055 708.9013]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_ae6ac4022470a8234b7e1e86a1eb3f6f) >>
+>> endobj
+2255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.8427 697.9973 335.9319 708.9013]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 685.372 272.4902 695.2773]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+2257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 663.1339 282.6525 674.0378]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_11563a258352c86f08252826a259760a) >>
+>> endobj
+2258 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [309.9896 663.1339 366.7659 674.0378]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+2259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.6024 628.2705 313.0881 639.1744]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_7292b29de516a6dc260ad119a3681443) >>
+>> endobj
+2260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.9038 628.2705 382.547 639.1744]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 582.4482 249.3181 593.3521]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_25fea68c1848479c5abf16311c5e6989) >>
+>> endobj
+2262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 582.4482 288.3213 593.3521]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2263 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 582.4482 371.5186 593.3521]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 547.5847 240.6204 558.4887]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_87a5f6bf64562514c28843c03b170bd0) >>
+>> endobj
+2265 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 547.5847 324.7339 558.4887]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+2266 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 547.5847 425.7242 558.4887]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5974 474.1957 217.4354 485.0997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_0e22a9934d3c8e61cbf4e47e3324c971) >>
+>> endobj
+2269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 437.3456 167.4656 448.2495]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_dd7cc7c803cb802958ba23967ba98788) >>
+>> endobj
+2270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 437.3456 227.3704 448.2495]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5974 358.6581 231.4048 369.5621]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.903 358.6581 328.5395 369.5621]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_49f897835acdb6102194eb513e714e5b) >>
+>> endobj
+2279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5974 321.808 231.4048 332.7119]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.903 321.808 342.7662 332.7119]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_dc8ff9607995657db54897e58ef75f36) >>
+>> endobj
+2281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.3219 285.3314 228.3664 295.8618]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_e29bb002e970c807feec0ae9c0989492) >>
+>> endobj
+2283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 178.9264 226.0342 189.8303]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_61bc610f9453fc7f6a989d25fa5ad4c2) >>
+>> endobj
+2284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 178.9264 377.2651 189.8303]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 140.0779 180.5399 150.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_7fe2c2d47f438bd189266d09a961c703) >>
+>> endobj
+2286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 140.0779 263.9662 150.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.6993 140.0779 361.7885 150.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 101.2294 178.2386 112.1333]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_99a644cd061894829c2ae998c0743bf5) >>
+>> endobj
+2289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 101.2294 261.6649 112.1333]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [303.398 101.2294 359.4872 112.1333]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2253 0 obj <<
+/D [2251 0 R /XYZ 90 757.9346 null]
+>> endobj
+2267 0 obj <<
+/D [2251 0 R /XYZ 90 491.1741 null]
+>> endobj
+2271 0 obj <<
+/D [2251 0 R /XYZ 90 419.58 null]
+>> endobj
+2272 0 obj <<
+/D [2251 0 R /XYZ 90 406.6016 null]
+>> endobj
+2273 0 obj <<
+/D [2251 0 R /XYZ 90 395.6456 null]
+>> endobj
+2274 0 obj <<
+/D [2251 0 R /XYZ 90 384.6896 null]
+>> endobj
+2275 0 obj <<
+/D [2251 0 R /XYZ 90 373.9728 null]
+>> endobj
+2278 0 obj <<
+/D [2251 0 R /XYZ 90 338.9059 null]
+>> endobj
+2282 0 obj <<
+/D [2251 0 R /XYZ 90 225.1672 null]
+>> endobj
+2250 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F52 345 0 R /F101 2079 0 R /F25 348 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2304 0 obj <<
+/Length 1699      
+/Filter /FlateDecode
+>>
+stream
+x���n�F����J%�Z���6' M �q��@���MT"U���>}g�$E�+Jq��Ha� �ٙgg�]J$��G"�#%2��h���>~="��)<��
~����"2�H*���҃$HPB��Ň1!�L�c<��<��U<��P<Ζwv�dz��u
��翤գ$-6��L�����x�������6�[�ʤ�c�'�ތ^^52�Y&�����G
-`6oF1�E����14Z�8e��r�~�{��?(����@��h�8�F���\A�p�
����Pd�sN@ a�ɹ���,g�G���������
��`Q�a/bcu,.��`)�q?�\�b3�(Uf/�{��V6�m��1=�N�f[Vۺ�B$1�G2P[
�-4⸗y,p/.4����������:�j�j�P����ju��Ie���
�FG�1j�t�=��s/&WHS|rz�c�{~�:=�
igpj�H���yy��!��U�HI�%\9f�9��Q�R<ҠJ�R,VF�B9U��v�����qҀ��5�S��r�ˮ+�盭o�=�
Z�@�xKtp��"*���i�|�(�1²�E5��
[���.����n�y�.�,�3�"�B2nH�*
?��⭿XWe��䉮F [...]
+�BMki �A��c��'�̧ĨVJ8�
0����y i
��\�Q�0�3��HS.`3SВD!I9+�]��>O�cEqg�E^ͫ��.[.����\�bkm�7b݂��+��I1�2�Q�Y�?��
��6�]�	LP�q�'N{ʙ����+�崛ώwH�R�P[j�0>q@��<|D���m�~�i�
f*��>6�����ܖ
�9�#�"�(	�Z*뾊N�9�(84�6�J�	��O ��,�o�.�bK����4V}1ݥ�TH�K�b���lB�x[�[r�/ /��|���*�fg�@U쥮�.ΫR]$��
,�4I��j
�v��!4�9w$�#L���h��h{m�� Tm6��,?L6f�m�9�
���X��
�;Q5��G�[�VY
��@	b�M�#�ƤD�C�
��mulLK$�	�T������"
���q`��l=1a�u���6TT�Z���z�Qx#1��os�U\����}��;b��:���GP�:�O��MI�l5��3���g+�;�u�揓o��������f�
EC�3����Y7����d��YK�u�0��.�r���!>�
pQ�0 A��
J���c5�[�nj+K����G�I�K�@�
+��"�o%7y����n-Ÿ*�$
���jD
��r���1�RnÔS�mu��Tx������P��"L���qT
�Ȏ�=1a�v�
�jwq;T=��\UJI"��zj:?��
C�`eB'D�'�6
I�~
+�^�e��m�� E�EQvE�7�(y:��
��B��|7��#	Fh��0B� ����
@hOE����:��
B{b���� t�W2a�p 
�C"�����߮���7�ՀS�b��.�ᗡ�C�
}u[���V��7ll��D�q������vD���|�[��׹���K= ������Z��H7K��_Q}��n�̀ik��I՚rϯ��]Q���ζ�-�o�}��s�g���l_���9�z�ƨ���~
,�
-7���,o�����~	H�Z<�endstream
+endobj
+2303 0 obj <<
+/Type /Page
+/Contents 2304 0 R
+/Resources 2302 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2238 0 R
+/Annots [ 2306 0 R 2307 0 R 2308 0 R 2315 0 R ]
+>> endobj
+2306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2317 706.9608 156.5976 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset_053e0dfb6c9a7bc465b90583172a919f) >>
+>> endobj
+2307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.7296 706.9608 327.9012 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [346.8247 706.9608 513.9963 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2305 0 obj <<
+/D [2303 0 R /XYZ 90 757.9346 null]
+>> endobj
+2309 0 obj <<
+/D [2303 0 R /XYZ 90 657.6856 null]
+>> endobj
+2310 0 obj <<
+/D [2303 0 R /XYZ 90 598.985 null]
+>> endobj
+2117 0 obj <<
+/D [2303 0 R /XYZ 90 576.6732 null]
+>> endobj
+2311 0 obj <<
+/D [2303 0 R /XYZ 90 576.6732 null]
+>> endobj
+2118 0 obj <<
+/D [2303 0 R /XYZ 90 471.865 null]
+>> endobj
+2312 0 obj <<
+/D [2303 0 R /XYZ 90 457.2947 null]
+>> endobj
+2119 0 obj <<
+/D [2303 0 R /XYZ 90 354.5239 null]
+>> endobj
+2313 0 obj <<
+/D [2303 0 R /XYZ 90 339.9536 null]
+>> endobj
+2120 0 obj <<
+/D [2303 0 R /XYZ 90 237.1828 null]
+>> endobj
+2314 0 obj <<
+/D [2303 0 R /XYZ 90 222.6125 null]
+>> endobj
+2121 0 obj <<
+/D [2303 0 R /XYZ 90 119.8416 null]
+>> endobj
+2302 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F97 1774 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2319 0 obj <<
+/Length 2365      
+/Filter /FlateDecode
+>>
+stream
+x��ZY���~�_��XV=}��İ�8�����z1�H��T(jǓ_�j^b�MR��Fb,�j�Ū��:�!�a�GfϔP�0.g��
�}���ݑ���/�~���V��AFR9{�
$A�:{\����bI0��
��Q����.(���׭]g���se�J^�Gq�m�XR��_��\�h76[=���W&�+�x����7����.��)��w��l
���#f����F�:��q����Owo���B��]b
���5�@��"�,?E;�"X͟Ӵ^^m���}�k���c
z�
x�&Ǽ��C��({Z:[��p!H��7�
J�
�q�,����
���F�v~5�����{� �L4�����b������/�Ul�|X��Hi-�w���S�@92D�IX�%0^�$��b�"�����}�5wg���DJ���J�6_�������)��
�̀DO*W�ǭ���%'�y�䜮����?���%ǐH�������dܨ'��(��.0�Gɺ\���\���mڶ���L+`�ܬI��|��8�2�4/v�_Ϫ�e�x����xNO��V��d��.��t���I�K$	170�p��1
'��m��V�)��s��g
m�\�m��S�Y�����hw�
�U*^���)�k�M�Z L��I��"�:k�e���>��Hd��
$�҅�Un��6���+�
+)�
)�S���k�
oH�H&�\��ɧ�����\Ϲ�a�$����U�"��k�B��x�Ӵ�}���"��=��O���@�(oN����n#	#h���Zdc�ɼ��	f����k�����;����+9�m�i�ts����0i�鄵�d#�jȼ�صV��q�5U_p�ZX0�
n���I�����KC��m�^-�1{�d����Q�؄蚪/�;iDpD	40���͛v-�lW��˜E�.r��Y��i��޳o��� �߂5^�T�5A@�͍�U���
��H=	
��!P�G&_?<@��`�h������$�)e4�n~�HC�W��3fH2X{�<n��y�%i�
���Kl&�s
5}�_'��*�n�еdeu&�����-��u
Q
?��8�-)�H����B�,���&�u�ƞ�@MH��vO�x�n*6O� gA �
��v�u���s�	w��V^��& �W�I]�7p�C9�1W�:³bV(���NZ
+����n��
�Z��Y
�q؁�h�Z��Yr
�Qo>�3�%���1Ս���T��)���j[������_���i{ܗ��q���}�\p܇������0����� �X]4��I�l��͸?��}n��rܯXg��

�`�4�!hOk��� �@�{�B9�
�
+�e�6
����
�KWp5h�;��;��ŝ���.4*��.�/[��PS+~E���vվ��&�OBL���oW�T��*3A�H��0B
+���=M�-kC6	a��
a��!
O��2��r�Rfj(o����&��0�7FOp��9�A��JL��m�1k�d�Ƹ���	C��/	a�������dc���.�0�E7FOt��D�� ���
��fS�o����&�;?k�g�k���N�2P�����u�V�:�Fy�C�V֮�oܥ��Ļ]IZ$d�� Y(�CG^�n�
�E�ó�.=�f��P�g��4�NH"M�䗽�`H`��U��8z��
+�k��
��T�� U
i!���UH�H����_C�i�ըE��UO�0|�)�
_�a�� 4n��@���R#1��q�ia�
����6]����6���[�:n5
]a84���� tE �)ё~Ʈ�
+���R\]��#���@��0��0^��7 �y�-�A?�[(�o at 8M��A�����;5B��C`
�K�IX�40� 0��
+�bӂ^
�i���H�D3R��&
�9$�q��JX�$ю�BB�
0���
o�9#�1�xi:_� ϑ/^TC������]�Pc�"�8U��ݦ�\E#
+����NE��$n>Y^�j
K�E���
^�ĩ�2j�^�C����n����ݕU�]�!�
+F$hѾFE
+�ʩ���c�U����ߺ@S�9�n�/l
���V�0uL?�v�7�5�$F4��3D�F��B?
 ��� �����U|�!���0H�^/`-
��
����j񅮄Y��6�?0]}�Z+���3�+��e]��˪
�?m��B�yu>�%EMwkW��N.;�T��4�\�G����O�v�C��8 ķR��_�z���f���7j���
_��m�
��_^^��NI|�P�����^
C|R�	ǰ��
QO��
ΡTX{�ljth�fMf���b諾�Á�*�Q���endstream
+endobj
+2318 0 obj <<
+/Type /Page
+/Contents 2319 0 R
+/Resources 2317 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2238 0 R
+/Annots [ 2324 0 R ]
+>> endobj
+2324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2320 0 obj <<
+/D [2318 0 R /XYZ 90 757.9346 null]
+>> endobj
+2321 0 obj <<
+/D [2318 0 R /XYZ 90 733.028 null]
+>> endobj
+2165 0 obj <<
+/D [2318 0 R /XYZ 211.8424 499.5909 null]
+>> endobj
+2322 0 obj <<
+/D [2318 0 R /XYZ 90 485.1527 null]
+>> endobj
+2166 0 obj <<
+/D [2318 0 R /XYZ 216.7638 216.9495 null]
+>> endobj
+2323 0 obj <<
+/D [2318 0 R /XYZ 90 201.1315 null]
+>> endobj
+2317 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2327 0 obj <<
+/Length 2311      
+/Filter /FlateDecode
+>>
+stream
+x��Z�o���_���N���p�� 
�&�5qч���%��V"U�:���;�%W�X�>�I��Ýٙ����$���GV��P�0.W��^}����"��
<�t�z{u�7)VI��v_� 	�����]D"�
�Go�Gqq��ޮ)����C�+�o��".�nn�Ȟ�GiV�I��P��/qY����>)�DGI�M`U&�4^�����[of�
�$�F����{���n��ˆ-V�0��CW�+NY;9\�p�O��{P�r'Q��j�8�^IL�b���(CX
+�
gT�q+�+/fݗf��l�?B
��d�]q���+���Z��@��C�|���IWy�������i�#��x>���5Q|8'Y�
Vc�(�j�]��؜�Z��]����X�+n�ƊGɾb�]���4{U�I�t�_
�w�R�h�3�v
�r8;��y���H���		`��[��*
x�JıUPG�q[��?f��Ɓ

M��e>�lw��<z@
�	DV
+���a,l�6]�1 j�0f��)B\�|��69Ui��7�Q(�
�Њ���b֌���ܤٚ�3�C����pܳjd��H
+��=������
�=cn��F�1�a�s��O�"&�i�$��T,%�M�Z�v�B$�
+Vv2�>,�

�q2��Ւ��E��XB|7i�͏��J�.�V�0�	b����J�C��}�Ll��_�L
�~�	a�G��T=�a^Va*ɂ��Kgy���9�%;7����89�h����t�Q�6�����i��T"�
�Iu.�V�O��) r��M[h���"�U�p!C%4;\u��-�6há�H�� d��kr�cj�{�d�tN���[h�P�M�5�oA
++��5D�nZ��iQ���7��
���r77�Fҟ�f���[ ����fI\�m�3�[�.O��+홂�q���r#,�8_{'P��?/o�nh�e��m٦�@�
+�`cm�9��@)"܃��j؅4@����kp�Z�i�m�eUoif�Fc�K�d�	�2�v����Ɇ=l8�
�!��DN
�����.?�'�(ǭ�ߝ�6��%_�N˦}i�")wm��5P�!

�ng�c�CݗӴ,0hZ�!p��3��/֠���Y#�
4(ߚ6���PF-�KƵ:<�ۉ��c�0Ր��Ҧ�A�+�6��E2�bu֦<>���cLS�x��-۸L�١:���s�^�"	�2	�Li�	mK�Ā�M'�6�{��=Źj�=Թr���>۹v��;W��Rjaj���I�3�kȀ��udI�{�b]7��z<�����X�இ!Q$���w�C]��8Y�A�Dلj����T�&����m�eg�H����H+4}��
+�kj�jޑ�
V#��c�j�4�Pk���j�I
.`�p�Y�TGl�U��2�1�ؓ#�a���%18\ݴdr�a
�9��b��1�U{"c�:�d�T�ڨ��S
p�x�/Rs�o�z�^?[5R��y���H� W'dO��d���
+��q� /h�n�dW�q���pp#�4��?d�����R�Y��F�C^�]�e��t��Z��-Wz*��3[�IT6

�6_a�o����d/��@���+5�
0#��>��
+)�ɿ���b/c�f=ra�FƄY��1�[�L�X���W�Ϲ��
�;�\o�0Hbq���K'2�t}�"�{��
һ�L�X�
d��E���
+�L^�$FDQ�

+K�0X
P��k���!�ap�!M��;�gx�U�����z��L�AԚb�̐	��3-0z�ͳ*N��-С��4�(cA�z]�ړ]O��q�2��
+��̵p����T��]�
�k��d`GI�I��J��Z�c�vC�$:_��Rӵ���`�ٵ;�|�v���n/���=�K�
��=c��.G����+�\�,�A7
~<K�\n��>kx���C��W��#U7�V�Rۛrad�7=rlT���� JX�+i��.t<�NAy�����`gY�:<�]@Ԯ�Q;��
�G�
y5�qIYb��Oֆ���P 
�9�gB��_Sp���6�ށS�*�A��|6����jP�RӀj�A�y6���� �Ȋ0�z���G.�:2&
�=c� �
��0�~�&
�R�3��~�V��Oj�ҍ����t��ֈ
'�����i
�n�`����L�?�����8s�3�-T�K%Ņ(S�H��X��88�!I���Z�'	�{�=��
��Y�¦�FK�]�<Z�n���N7�׏��h[�s��
+�Vק��zh���\�6^hdK��
�FZΧk˾�a�y�B��XS^�<��5`��@�2endstream
+endobj
+2326 0 obj <<
+/Type /Page
+/Contents 2327 0 R
+/Resources 2325 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2238 0 R
+/Annots [ 2332 0 R ]
+>> endobj
+2332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2328 0 obj <<
+/D [2326 0 R /XYZ 90 757.9346 null]
+>> endobj
+2167 0 obj <<
+/D [2326 0 R /XYZ 211.8424 613.6232 null]
+>> endobj
+2329 0 obj <<
+/D [2326 0 R /XYZ 90 599.3861 null]
+>> endobj
+2168 0 obj <<
+/D [2326 0 R /XYZ 216.7638 338.3803 null]
+>> endobj
+2330 0 obj <<
+/D [2326 0 R /XYZ 90 322.7634 null]
+>> endobj
+2169 0 obj <<
+/D [2326 0 R /XYZ 90 212.8325 null]
+>> endobj
+2331 0 obj <<
+/D [2326 0 R /XYZ 90 198.7497 null]
+>> endobj
+2170 0 obj <<
+/D [2326 0 R /XYZ 90 89.4414 null]
+>> endobj
+2325 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2335 0 obj <<
+/Length 2079      
+/Filter /FlateDecode
+>>
+stream
+xڵZ�r�}�W�i#U-a�/~�L�j7���q�2�R�m3�H-I����4x@��oS~/
࠻q� 4Yb�#K��J(d���a�����o
Ҿ��}���fq��K���rysW� 	�����ˊD���>�	^��!�|\S���Oɮ�7Oo��x���){j_�YU&�:��>��l.?%wI�&z�d�zeR�&�7�.~��a��L
�ŗ�x�������-��p�1�.
NYw�_|^���Ӽ���!{�7(CX
+�{QD:�|K���ב�tu���Ջ=u}���]Z���o�j処�c��yVVͭmY��$"�c� 5����fW��̈+p��ضyj,�9s~�
N�����!��smZ�/�S��g�|m�괉�FTr�QHR�붟��Tdeh
��� U�)	�I&�Mz׀��]s�g���
+^Ս�;g�e����,��#�!eZiy	�
}�
�H+x�E��D#.u&������@���D����jM���E��8�A0y�K�,���n�c�B\�&�"�(	>�[�QxIJ�B�0q���(�
��l�!��}������d���H��=��j
�)fH2����<����c槕�11������P�k�T�1���OQ�m��1���}�*/����X�H!"�K��`RD(��5�o��tg��k81��65�1<j:u���~ �>�6W�6�<5�.4�)
d.bC��D�����(�uG~�'���"w|{�
kY+�sX��Z 
�HɞƶS��sX�f�C��SY%����Ř@	�T�F�3��h?��C~jCyH���/��Ћ�<�+�I~
#�1��G�j����C�=�C����E�{����G��8�G�ˏ
�p��P�%L�=���

��]-��b!ff�@���.��N'x�aY�59�j�M%e��Q9�p�
@�rِr����\�o'ݲ��L���Лo>;
�]�aJ�
Զ
L����9�+^ƻ� =
+.��KTM�D��
k��
������ @A"F
&�8�0����v y&c�h�	2�]��#g��<��0��Ʈ����
h�p5OƎ�4sJ��_�
�3>>$UR��q`�:
��qgu��749
urv��hH?u ��
��eXAj���8*��C�V��t�o�n[cX�ɮӏ�(,{"�s�_HH�
�]�N&���^�.�j:��RP�yv�
>�[#����^W�g=r.�#0�R�qK=Tԉ
6EP.��)	���g�L@FQ1K�&@�[�-���$���5wP݂��~���G�)��v{���~���j�P5��km(��v��}�z��巸L�0D�|Ŏ8x
v��w��J7�K���J�q`��4�za��$_R��z���om>����Gn� ��m�#��}���ncKCL����C,����>3A|
Z Q�ˎ*���������P�ɶjC�7��1��̰�j	�$	�9��s{>�g׏kX/z�ez�պ�K�
�
��
�
���~��1uE�*���Z����ZMW$�@#�������4B�J��@o�N��ο�;�=��k؛^�4i�l]�<+&���,o`�9?�j:~�؊���Eh�؍P�cכ�NQ�z�(F`Š����0y@�83�V�fy�
�M�M�R	�J��wQ�#� To�_�:A
u���	�7�ۣs�jo]�Pn>'�C���
����ws�l��:���>��y �pS
����xB\@�J��]pZqQ\���� $.���D\�0@����
+�6l��^	
,�{���e_Cqa�ߋ
�I-.�������݌��v
�w�:}N��.`ν<l�<Ӱ� 
~2���[D��<���]�"%pT�o��n��d��6������T�

)�>���q 5
C�t�PǙn?�w �b��&����#��e���eR�e-Ī���YC�pm���
+�QO� ����
+H�>'��N5hOA�������o�
+�DN�F(gʣ~����x}u�����%:e�@iuu<�8��?��7a��{;$!w=,w��C�}ML3xx��g�G���1���0b�endstream
+endobj
+2334 0 obj <<
+/Type /Page
+/Contents 2335 0 R
+/Resources 2333 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2238 0 R
+/Annots [ 2341 0 R 2343 0 R 2344 0 R ]
+>> endobj
+2341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 270.6976 212.1242 281.6015]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+2343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 99.7024 216.2973 110.6063]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+2344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2336 0 obj <<
+/D [2334 0 R /XYZ 90 757.9346 null]
+>> endobj
+2337 0 obj <<
+/D [2334 0 R /XYZ 90 733.028 null]
+>> endobj
+2171 0 obj <<
+/D [2334 0 R /XYZ 90 635.7621 null]
+>> endobj
+2338 0 obj <<
+/D [2334 0 R /XYZ 90 621.1918 null]
+>> endobj
+2172 0 obj <<
+/D [2334 0 R /XYZ 90 506.4658 null]
+>> endobj
+2339 0 obj <<
+/D [2334 0 R /XYZ 90 491.8955 null]
+>> endobj
+2173 0 obj <<
+/D [2334 0 R /XYZ 90 333.4681 null]
+>> endobj
+2340 0 obj <<
+/D [2334 0 R /XYZ 90 318.8978 null]
+>> endobj
+2174 0 obj <<
+/D [2334 0 R /XYZ 90 162.4728 null]
+>> endobj
+2342 0 obj <<
+/D [2334 0 R /XYZ 90 147.9025 null]
+>> endobj
+2333 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2347 0 obj <<
+/Length 2132      
+/Filter /FlateDecode
+>>
+stream
+x��ZK��6��W��k1��G{�� ��Mzs�
j[nkז
Y�N��oQ�dR�՞�6��=J��b��I�)��<UB!ø���<}���NH�z�����&7�H15�H*�w��I���N��f� 2_������YR���9ųb��M�e��>�/��������y���1��
*���]r<���MZΉ���*�V�Tx�����w�ww
�f�IbA�2��O�0��&1���	n0"���~�)kov��&���q/�b��
�	�+�4e$j��D+�ֈ"�~�a��TQ��d�v^�d�Viy�폓`��t�7� 鬇H����"L�[�P�by�.O��ȏU�dy�
�1
a	C��9�h��0�a�H��6u��G�i

�U�n���������Ic���v��1
����igNJ�Vl|z}���+5E\R^�ݯ��Pґ��u>2����,�c�����9dz�d���I�pV�	�H
+�Q�tVC0�S̐dp
��ۖŜ��S=}j�m,��o��Mn?����'��:#����t6�6;:��D
"�1ʎ��.����T��.uj뮊�y�bPAi�c
�S� �}U>46?���ڿ�a���s��,�p�P �(z|�:�� h���,P��']U���
&"\@@d�pr �V9��n8q�@��vv
��xt��C� ����5j��eA�FKn)р�ʄ�^6���)�
!���2o����'+��'K��
�%X�`Z2�V�k�qM�/��p詡�ō-�h�@��iF�
=G c�KA"
�~5%�?
N%��<��c��
i�WB���ќS��G��uU�r�#���Ť�Iۈ:����!
+e�b�(�'�H�u̻i%e8GA#H�.�
­Ӻ2=�vMd�g�y�p�� ��&�<P�}�g��u�AƿP�xF��M�5�u�Fb]_�62�W���u�6挳����e�G⫚f2�j
+#�>?1P8�!I��Ĩ��$
1���XB����P슇�2j2X:��z:
�0�
�z!�7��(i3n���g�>g�=�6¼��O�CZ.�S��(�6|��O�-1�V�Pɗ��_���ӸZK�0�>��.=6.;4��+
����^�ׁQJ'�!m4}c�c�����/�k��j�s_ at Q)
9(�S�.�	�3hlTO|�˂ɀ�4�jA�u>�(qI��^�)�
9�� L\U0���ʊ��
+�ʓ��kde�m�m�NYl��b�6�&����P�F����z����:T��S��F3�0J��[�Q�S��3\ �C~
�q�U�2f��
�Ϫ9�m!Bg	\4C�t�	
r7E�V��=�(�Ta#b�M"E6��Dnw�� =#H�.@~w
/I���Lf\r|�˒q,w�&����
@��3{��:�80q�	���8o�8��8Dr%C${�R&ـ�i�.�}�6�Z��yn��E�
���<&edH�ę���t֨�bd�}��I�|������m��W1�"���@j��t���,��~]��8W�����W�������E�V
�̴K�u��,O�"A�+֎�o�`\p v�s�:��E��
�"O�,x��$�6��@C
+ �1o��
+͌���
+��7Ph����S�>}�"�J!A !�ꅽ��~�9H�[A��.I��]��@Q�����G���
@(����� H|-
̧�]�7��)_C>���6�ޜ�f�����!��ͣuQ�a
�KޭO;�@"`E���^��4�c(I���s�tN�
��%w旮2�i��y�
Ai��=���[ �"hN
+�DWg_,\�
!��x��[].\��&��;7&Q #�� I�z�̼���6|�h��Z
�
ӛ�*B<��=b8�"�f�mo�)d�$x�.�[ɥ�//:�H��ȅB��g5�����Э�#F;m���N�h2B���Χ9��e
����^�2�
PW!X�/�K��_���+R�j1$	����� �Ѿ��m��ܶ嗻mj0w�cZ�u.Ĭ	��ܝ(
+W|=ڦ #�H��B������t�BZ�tzɽ�ﴽ���H�
�
G
��];�mU
non�����Nyv(QV�
����2�0���Eg4���C:H{�cٴ1�/��
�+Yb��p�P��!�endstream
+endobj
+2346 0 obj <<
+/Type /Page
+/Contents 2347 0 R
+/Resources 2345 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2356 0 R
+/Annots [ 2349 0 R 2354 0 R 2355 0 R ]
+>> endobj
+2349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 659.3542 483.2121 690.3229]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.2694 164.4856 238.0203 175.3895]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+2355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2348 0 obj <<
+/D [2346 0 R /XYZ 90 757.9346 null]
+>> endobj
+2175 0 obj <<
+/D [2346 0 R /XYZ 90 639.2794 null]
+>> endobj
+2350 0 obj <<
+/D [2346 0 R /XYZ 90 624.7091 null]
+>> endobj
+2176 0 obj <<
+/D [2346 0 R /XYZ 90 509.1363 null]
+>> endobj
+2351 0 obj <<
+/D [2346 0 R /XYZ 90 494.566 null]
+>> endobj
+2177 0 obj <<
+/D [2346 0 R /XYZ 90 379.84 null]
+>> endobj
+2352 0 obj <<
+/D [2346 0 R /XYZ 90 365.2697 null]
+>> endobj
+2239 0 obj <<
+/D [2346 0 R /XYZ 90 239.2112 null]
+>> endobj
+2353 0 obj <<
+/D [2346 0 R /XYZ 90 224.6409 null]
+>> endobj
+2345 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2359 0 obj <<
+/Length 2779      
+/Filter /FlateDecode
+>>
+stream
+x��[Ko����W�H@����A��$�fLv�\fG�-"�P�x��>��&�M6)��yb��(vUWWW���&3
df�L	�
�r��]��\���p
+�����R�
2����}3�$HPBg���sBY,	�x�vA�<�v�������y�������c�U�77ߕ��VQ�Ǽ^,����������jA�</W9�ʤ�s�n�zsۙ�g!�$��\���gk��W1���	N0"����S֞l��]����h
H9���Tz�d
i	����H1J�q�!,�
gT�8�R��Y'fݷ����(�z_�gI$؆����շRC����@&������
ͅ����[��~A��g�i��
"�U~<��]�
�?�p�m�s͂><���/�SQoZ��M�<n��OVG�}�
GP�1Z L��Ief&�x��2�������XF#c �W�|^��
�7�Eq�M���b�$�H�F'f�8�뛛�\p�K�-�wY���7
+����i�tRCc�H��!��82�vS���<�Bs��Ž��΃
ĄԠ/�=5� ũ-�n�_r�Gdn�pT��0���9�`BUHm�PV��

��h������f�Y!��mN�ހ�g�U��~]�z�ݱ��@"�1��AF�C�r��
�����������CZ����%�$7
x׎V��6������������ J��+x�!Cp+��(��%�Y
+b��,l��
��b_r>U�h3
!�C� ����S�����&�w	����P�[�-2Ƚ����0F.2�`���v���vK͐0���������
X"���Ǣ̳���go�ϱ�֯*�����
!{�Ne�6����y3�U�宮��>��4��9�aQN��+�

���	� ���]"~��*9��N�V���}��U��!5KL�$�^
�"�	Ҕ/���h��<�ԇD؂A
q�9
)$)g�����<���1�z��9��ė�~6�`md'�J����	(�Tp�J��U=x��¢��/���`�&�E=��>t�.{�E�J�
b�z%��:c
�P��ѱ5#I
q�e˯����5l
+��?���rU7�Ԟ�á(܉�k„���
+-�tN��Gډ@��ʣ�p�Fq�0P%�>".5$���!_��|�.||Ni��r��Jջ_s��JH]�:�$@<����v���o옓�`(5�	
+n��Q�+H��뼚hS�'���!�f�
b"RUޘP0���RC���[)R��(�
2��v~S�6/
m_r|�x�����׿
�1 ”�aַ�ؔo[�0�c����J
���e�B�Xo�����+�ׄ�0FB�u�Ij�g^�R�:����}�i�����\H��NU��x��
+����bКR>+�qщ�
�Nz�ZƤAkd�7��
��'A��@+�V�y¬�/��y	�c[���^k�
@V@��
oF
!�[�
B
���q�l��jnY�mf�ݻ����61��̡DxU�=>�cC|B���cd��FfZ�12��$�X�Fnw	�HǨݾ@s+O�e�*��S�Y#"M;�j��R�m��P3�Q3�r5s$�ᯀ�e�;�@s��o{��
ʠT��f�-(�h�
�W�y��1=la���?&�$޾����2|`X3��Z��|�,��P��n��
��Ր0bC��UZ��y:�,�VI!�#�>-�����2��~Crw�Hh�
D����	i�5��Z���NX#�{��
��>hSH�C�*�`��|����UI��K-�!�ᘍ�BO��l΢�aIKTd����������Ȅ��c
ʰ��G�=m�*O�ӆ�ȕq#��2��j{קw�J���_�6c=�K&�4�$�I
�y	q�K`���|�A��t����Ȅ�M���t�މ�#&�"j�dB��n���7u��E/֣T� ��I*	�ڐ�Ɛ\�4p
�b��� �4��Ȍ�3�[���
�`�Gǚo��Ԅ/�FXPu��ؔ/Z���ʴގ]�M�+�ދٕ�x�L�����T.��95�rj+v)�2��#`��
L���-1*�`��]�[�޻��y�
9�ڣػ�J����b��y.bh��X9�N
��͡N
+;װ5�"چ�*@�9SB��@�C.�� �|*��V��S+�2�f�#'�f`L�����F���h�y3{�#���͠9����_ֽv؆���f���6�J��4�y�
3��
g�@n���m��2P���ҩz.���?�
6�@j�`׊/C������Ҧ�绷�w}S at Xط��-}��J�3���3!�: ����{��6^�}OzH�%�X��
P��S
+�+�&���K̢/M���v�W'�
z����ۓf�𼈳�\���DG�\����=gG��w-�V���
�*��X�qv�����9;�"�Όpv����@�P�8;h��!ig�vߗ4g�ʡ(ҧ���$
���K�����%y;)ay�i�	J�<�۵���o7w��Y����>��A��6�Gv�S��v#e�ȶ�e툥��6���[�(�7
��Qj ���9�o��
F
�v��� z��_@��o0��
��O����c�Bv�+�9�헃B�$e�a �������hE1$�w����������ߟ��ߝ�
�����W�^1�.�sV>��
�D���W�w�`*��G�C�K�ƻ|�y��
F��G^rw�>k��|i�>�
�p�5����ډo��ps}���VG�X�
+��᰽
d
؀*6�z�Nh`K�~ W*�Ρ-�-���W~9�.
đ��	S�	��5�endstream
+endobj
+2358 0 obj <<
+/Type /Page
+/Contents 2359 0 R
+/Resources 2357 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2356 0 R
+/Annots [ 2362 0 R 2364 0 R 2365 0 R 2367 0 R 2368 0 R ]
+>> endobj
+2362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.0888 582.1018 246.7668 593.0057]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+2364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.8986 358.3167 431.9768 371.2345]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [440.4878 192.0282 496.577 202.9321]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Any__Pointset) >>
+>> endobj
+2367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.6167 98.2435 476.6033 109.8826]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2360 0 obj <<
+/D [2358 0 R /XYZ 90 757.9346 null]
+>> endobj
+2240 0 obj <<
+/D [2358 0 R /XYZ 90 656.5433 null]
+>> endobj
+2361 0 obj <<
+/D [2358 0 R /XYZ 90 642.2571 null]
+>> endobj
+2241 0 obj <<
+/D [2358 0 R /XYZ 90 434.037 null]
+>> endobj
+2363 0 obj <<
+/D [2358 0 R /XYZ 90 419.7508 null]
+>> endobj
+2242 0 obj <<
+/D [2358 0 R /XYZ 90 172.685 null]
+>> endobj
+2366 0 obj <<
+/D [2358 0 R /XYZ 90 158.3988 null]
+>> endobj
+2357 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F11 416 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2371 0 obj <<
+/Length 2321      
+/Filter /FlateDecode
+>>
+stream
+x��ZMo����W�H������&�I�����fǢ,"�
+%����S�nRl�Iَ&�a1Q�cW���z
Ä�?�X:�R˅��o�������s�?o�z{u�7%'�X���vY���Hlr��4 0��t�at�����Ì��n���ev�c���盛w��p��
�q6g�N�_g����9_��
�4���*W�N��}�����m�f�Br��_}�L'
��+J�5r�_(k�ds%����>^�Ԭ�oT��
�0����8$QF
+F#o� �iތ%�r=�LP�T�ƲM~���M7N��h�ؤ�t�@ϑ����'@5���iU��׬�g�X���oP}����2I�&6{���֯�eȇU�]��C�w�ΘD����:��[��c��C���l]������{�WJ�6@�|�
���/D�DYF �IGZ��m��
�E��ϛ�e.��x��-ר��c���Dǖ����ϛ/��ZLz8�E
6�E
s
����c�n����0�Y)�v&��L��
H��xX��c?���)F��	�(a��s��`c��0�"��6Ŷ��k
q�Ju�|�ꛏ�U�0�ll������~p��c��KϮ��캫�]�K̮��W*�n��9[����[�
�?�U�Բ����#g2�(�b�f���̗��c�T@@�d�_QN����
��8���
}��}^�5� ez,�:>
�R at 9���M��	��XRwYh�zd
҈uf����$J+�7��'��r�6�	w]�Q,�
�c;!	�ʠ��9�XQ�h��8�U��
+^����
)�

��X7
M�56�\zW��x0�k��<3�����
W��Yce�_�Y��C�3F�2��b{���#TM�
��LF��TZ�V��� ��@�^��vw����B��������2����"la}���ld�ԥm֌d����w[W�p,�G�j���,5��a� Υ�	$�hU8M
?�qg��3U#
��X���!��m��g%�9��Լ��a�
��kQ
]���������۫���Mkƻ˖�C���!�K��p����H�t����Yy��
['1B/FN���
+#-Lw[�	 #7"@�s!�"�x���.�4R�'�,Z
S@���>���WF���:�tH
{��M�KH�
�
���O�G,<��X�*tڪO�ω�t{��b§�;
�a�S��q�8�k��/)���Tx �m@�7��]&���-.P"�~RqVq����a���U�m��	�
�VI�����*��Vn����6�_���+�3W����qT0,=�f�hOlT�=�f�z-xǻ�j�@�FP"8�]
P��DH�
+P��S"1��	Ff���ڃM��TY՜���� \5��;ǐ�>�rP:�9�x�
+��hѹ ��u����%QƒL��������抴�l'�����3�p�T�3oNڨ�)Y�j��xsIFF�'�Y���ZCd
��r<��7�ys��V�}ᛓ�KU���RyN��ac�հ�
�ܼ
�YN�
�,��]��0p��h�Ƹ�a�6
�
+������7��f����^�U����
+5��.<z�ۨ��
�@�
��}�y�޷�6�<��I$��I��ș�Lf�O
lK��Gu
+�]dzaL�e
�ٖ�s��p��>��Μ�	����U��x
J�g��e*���K3&��Q�D���QLc�7q#j,�
+�QL�?�[J��c������+ �r�R���KI���자~']8g�
�&w+����k�
��B�(A�k�V�n�& �����Ą�Q�?Ԃ�b-(:ZiZ
bc�P-�#%�&���b���R�4��-�DNb]�Ġ�"!�<�������`��`���H��޺}1�
u��uP
�Tƌ���Ղ�w.����2vm\	�����\J���&;�j�5!�=m���B
+
� s|I���6jx IJF�Z�*-�r`d(�y�

+�9-8�I
�̦�`d��kA��u qF��a#�5�h�qˍ�YNk���� h�=��9.Z�1.j�9-8n�т=�i-���Z8'R3;~�ۨ�Q̼X
+�l�m[׉�m�ao������`ϙ����C
+�!����1��DJ����vAI�_��^�g���ɳ�+��t�r"*h
yN`�����_���_~9��gRN�̶�nu�N?~uK�|��R�|L���s�B>�ќ�ۊC^Ē���I}��S�����
�VȽu]��qs}���D��q[�KR
����uo�����ݛ7��/�˧��D�,뿮��ʰ
��T9��#W����(Fendstream
+endobj
+2370 0 obj <<
+/Type /Page
+/Contents 2371 0 R
+/Resources 2369 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2356 0 R
+/Annots [ 2374 0 R 2376 0 R 2377 0 R ]
+>> endobj
+2374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.631 492.3496 429.2969 504.8288]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [334.8835 263.5611 440.2823 276.0404]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2372 0 obj <<
+/D [2370 0 R /XYZ 90 757.9346 null]
+>> endobj
+2243 0 obj <<
+/D [2370 0 R /XYZ 90 567.0752 null]
+>> endobj
+2373 0 obj <<
+/D [2370 0 R /XYZ 90 552.5049 null]
+>> endobj
+2244 0 obj <<
+/D [2370 0 R /XYZ 90 338.2867 null]
+>> endobj
+2375 0 obj <<
+/D [2370 0 R /XYZ 90 323.7164 null]
+>> endobj
+2245 0 obj <<
+/D [2370 0 R /XYZ 90 109.4983 null]
+>> endobj
+2369 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2380 0 obj <<
+/Length 2530      
+/Filter /FlateDecode
+>>
+stream
+x��Z�o���_��F��~��C\
+�)pM��\m�6Q�R)ʎ��w��R�䊒Ϻ�-�É�pfv��w$
���
+���n}�'p�/W�}����'�����wRL
2����}�A$(����)!���1���<M�u�x?�x�Y�<f�2]��ߖi�2�S�����e�,�O�]��]����>+gDO��.�L*<�b�����w7���)��*����d	���
+#f��<�F�:Y_q����ꧫ�w|��
1c�αeK�:k ��hM��>]���>Y�l�"���|~���l�H����"_�Y��,�?f��<�]e�f���)
������)-��D�!���R|mO���nS��Y\��y����ݯ��O�]�)�G��$L#űj�n�}s(�ad
�K���`��d�'��MV��.ϊj���&		��3c� U���n>�u]4��Q<��hĴ1��eVl�y�V��z k�h��R��4"Ұ���}�7Zo���%1?c�$ю�G�� M�sˇ�p����ؼ�8��PU+-�N
+I�y��7ే�&���jӼH}�8������F@��;n���"P���#��.[��n�#�CLHsi��y��(Pf�mvW5*�	S<f��ƨAX9�*-�m���ʇ��G�Pu��B]���|�~mUi�I�gTL����Yf�����S�SH�iO�^
����DF1][�	D��[Z�M�V�ζJ��=Ac�EC�sb��·.�C�A�����Ap��ZC at .�m$�X&>��!;�J#l�2��*O
dZ�rj�: ǃ2�(�
�3�(�
�4�Ӗ!��A��Bk�'�hG�JDm�H<��X�l	��q��
���-�j�1�o�#B�3�;�Q��@�1�Y��ɕ
1%ǽ$
T6�
������uP�4#<�N�(�c��<�
xq��f�3ځ#]gUV��}�pl��nL��"
�P��c���ޑy�G �����;�����Ħ��:{Sw�3�l�s�R}g�]�U]������r�w\U��q3b���)9z���<�1�9����3�<�[���Ѐu�h
+�
X��YY�,�%���`��5�s�>�[L^<
�f6#b
+'j���6�/�	�zT#uT��0��	�J�q��h �gP��P&�{�=����mi�4��)czdc�td��6/�:ch���
�P|hT)`[�f�����w���z�)����@�������k^��7�b��o�`
�PSN��C'��l��2�
2�Jf+J�-Z��+�F�.�� )�!��b�_U~A[�� ��G;������v���T�;�`@�eS_��z�m�F�KL�X���8~�̪����y^�8�%]�/���J�&&�[�騆ʄS?����w���cل�]V!(���Ra���ca Fh��-��l������
磂G�b[�ÁŶOC�!��
�:�v
+Ι�-�!KX%9#��Y�i�k8x&��Lo�~�RƱ��m�,s
��I^@��BS�fW���$
�E)ݠ���
�
+��{������ڴ�g�M���t}`hB��e�{*?a�
��(��`��v^��B�Ka.
�\�"0W
�th�Ю���0P�@`v|�\��6��I��P���p(�(�C��|= v������{��L��[ز��_����>�v($� ��[+
�_ ��A��K��`P�\J�
:
0P�F��5"����ŏ4������6�"`�Mo�=�#`
I)TO��R
U
0Q�-W�(ן������-�q�e��<#��L�m��5d�$>
�a$�$�A`ʜ���f�%��LI~A
�gy����@0��`n�W�����4��
yS`dMh_S:�S ��� �@l

��� ��%��|�1�9�3@�q���`���c
fo;V���G6fSGv6.����HX �����0?��dcud�Ba��;(l >����0�BaT��`��3>��>C
(ʘ������h���Ӡ�Q�
���2q(,P�
�
+����� 
+��_p�	PXFX����e��F,+֖�
���Ql��]
,�����%rx�;�`���شX	�a%���T�jv�O������]?q�M�}�M��?���D�
+̨>Zt��B���6
r�%Mh
��I�.g�"�b�Q��lnpLC�Y��eE�7��k�/��A�r�1�9	;��a�Ll�V����
@��?�
h7�T�� b�ձ{��s at L��
0�">td�6�Z�0
����2�
 v�J��@�q��gP�9
"
+�%F���O:IuǴ�W��f�yx�5LhHuô$���̺��0�
���(�0H�5a��o����[jk� 8�p������N�������5�mgk.~�e�W3!�ma�[Z�݄o�ٓe����o?ł���f������a���~PAB+5O�9q����]�B���u
�ڃ?V�v~}�����vh_�����v��
��#CaL�^�
t	��v
�]��T�޸./��eqT�G�P�� �^i�endstream
+endobj
+2379 0 obj <<
+/Type /Page
+/Contents 2380 0 R
+/Resources 2378 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2356 0 R
+/Annots [ 2383 0 R 2385 0 R 2387 0 R 2388 0 R ]
+>> endobj
+2383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 677.0988 422.9245 691.8143]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+2385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 417.3723 425.662 432.0877]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+2387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 170.8797 322.4458 181.7836]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+2388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2381 0 obj <<
+/D [2379 0 R /XYZ 90 757.9346 null]
+>> endobj
+2382 0 obj <<
+/D [2379 0 R /XYZ 90 733.028 null]
+>> endobj
+2246 0 obj <<
+/D [2379 0 R /XYZ 90 493.3767 null]
+>> endobj
+2384 0 obj <<
+/D [2379 0 R /XYZ 90 478.8064 null]
+>> endobj
+2247 0 obj <<
+/D [2379 0 R /XYZ 90 233.6501 null]
+>> endobj
+2386 0 obj <<
+/D [2379 0 R /XYZ 90 219.0798 null]
+>> endobj
+2248 0 obj <<
+/D [2379 0 R /XYZ 90 104.3538 null]
+>> endobj
+2378 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F7 574 0 R /F8 568 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2391 0 obj <<
+/Length 2365      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo���_�O����L?]������b+�z�쓔��~}gHꅒ�${��wQ�p�pf8��6[P�c
K�J�R/6�
����_�0���U_�7Wo�ZXb5׋�;�A3�8㋛�%c�]��t���eZ
���KN����.ۖ����m��O���Oa(/�*�/W\����iU����.+/�Yf�&�B'ti��Ǜ�.��ia�](������G���n���DX���B	��/���e��ſ[=~�M�2�b�%��P�Dk
�	7�$��~H��+�����o�;�Z���v��N�&[o�CVT����i�]��B z�[��Ò
n����T�vʺ~:e8��Mz{aTE�=8��E��&$Q� (eA&RÈ�L���<�;[|�s��Y14b"��,!�K�&��V+�,�_��"��A��.�Z>zK8��fgC���
g��Y��qFOQ���@.Z
<��٦>����0��"��d�%<�v2�U_j
��J�҆�}$�PKY����p}F9IPv
+�H+=F2'�&T���V�8S�,)�w�J��
�8%R*
/z�:�\|q�����a�=�)����zR3�� %�vH����N5������s^�8�F
aT���z���n��%��Lb �1�h�� b�N��,q�+��,��z���'8&/�'�B���B��h��(m�4���(�i���ޤU��
�9���p�g�"�]Hɘ��n�Dr#�ݮ=6� Z(�PV.`�38��A�}d� ��O�Q����.�<�h�
+i2~��0�� �1��=#]��x{qT�q����`
�;_�K���,�%=���o݆���X��.���W
+Zv��.�jߛ[�K��錦D�X{e��W
�]�مya�f�����E�n m�?�e.[�>�g��S��:;�.�i�����2�U}���fin,���H�2Oo�Y/�›^j8����%�ӻ
���Zt�:ޑ/[|�ؕ�r��鎏@kVu
+�|E{e���v���<
|�Dh���;�\EU#T�&=�C_`e���Y��L��K@�&6�WB��f��0����7�$x�zb�� �!��v���
�M�fk�`ܬ?ZÎ��l[f��>T'>ܱu�
��R��$�Z lcBa�eԋ��
�	�
+`k��0ȱ�NД�����1�D�c�t/���v.��|\n���˅$
/1�&|o�<б�My�	��Y������H]�b%J66a�9
+�%:�7
.5x+�]fi�6
i��Ih�|-3BBN�4����"
+�&6�@z?��'�.D�����$�E�����������B%�*ޥ�����.(Vû��K?ǻ�+yWSp�SSL˶�,��[�cj��}B&,�Z=_���Η���Q̼��M�)�GH�K�Vl����#d�E�	Y��,!{A��q3�8�N˼�zR�&�Rh�싹���s�8�F�u�l�
7���f��7�/�fBRp��/�f�	3ܬ�Bn�:��F`&�Y��n��f�xnO�f�v�
�
7�g�͠��3�Ҧ�jG�
�:n�n��2�
���m�f��=�͐�)wJ���+����+��CjI��)�cq8�cq/�št��P̳8��kx�\��$�m�ʎ�)��9�U���<.!��1�C�
�í��>�ƹ�v&\�E����
ʖ_���$&��p�
�c��DN�!rc�u�mkR:�=�'(��A�~7�bP*$��s8A�
��>���8
$�MZg��Ӫ��
�}⒝׌'Y���?M�8�aY�ў&6�5��_��i,@M�ݙ�iW7�CAJ5N��	@�X�~f��� �5
:��d���P�DT��,o����U�Ti:����R�
E4�h eX5R� ����"X
 .���TMƪ_��x
M��T��8#%.�5`��'��VV
yt
��Xn��)�<K�{<�X's�v1�5�
�Kh�x��5 at 0M��PK��
Na�Ϸ봼�[�
���a�G3vhe�0b'S<�����(:h*��������Y�5��;}2:
����U^l���S(n�y�2�?ј�f��NjΫA�u<zAK���YtAߣ�$�D
�+vĩ�u5���m��ab�yq�a](s�"=���ϳ[n!1�)~�ß�ލ��?a�ݎ��*��l���1�8�G�Z�;�鑲D)1��!�pDX��_%�aikYkW��@D���C�bq^��ȿ�ɿ����?c2��_i�+�𩵏������Tf<AW�v��g���(�Ԇ���菋�����	�ތ&Z�-����wu}���z||$��<��$y}u:��$x��D�yo�
+��D旐utBM���H�pl]^@��
�Q
�0����endstream
+endobj
+2390 0 obj <<
+/Type /Page
+/Contents 2391 0 R
+/Resources 2389 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2356 0 R
+/Annots [ 2394 0 R 2396 0 R 2398 0 R 2399 0 R 2400 0 R ]
+>> endobj
+2394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 592.7078 300.1613 602.9891]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) >>
+>> endobj
+2396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 338.2052 300.1613 348.4864]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) >>
+>> endobj
+2398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 170.0957 236.6587 180.9997]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+2399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 97.9124 256.1568 107.8101]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) >>
+>> endobj
+2400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2392 0 obj <<
+/D [2390 0 R /XYZ 90 757.9346 null]
+>> endobj
+2393 0 obj <<
+/D [2390 0 R /XYZ 90 733.028 null]
+>> endobj
+2249 0 obj <<
+/D [2390 0 R /XYZ 90 502.6906 null]
+>> endobj
+2395 0 obj <<
+/D [2390 0 R /XYZ 90 488.2094 null]
+>> endobj
+2292 0 obj <<
+/D [2390 0 R /XYZ 90 234.9338 null]
+>> endobj
+2397 0 obj <<
+/D [2390 0 R /XYZ 90 220.4527 null]
+>> endobj
+2293 0 obj <<
+/D [2390 0 R /XYZ 90 89.4414 null]
+>> endobj
+2389 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2403 0 obj <<
+/Length 2559      
+/Filter /FlateDecode
+>>
+stream
+xڵZ[o�~ϯ�Sk�5û�(�.v�n[`:���� Pl%Vז\I����
�"-J���E
����s?�&+
d��*	Ҍ���t�W���o7�{����>�_�on�b���T��Z� A	]��߯	Ad�%���
��:�o6����C��҇�UZ}���K�{�M�5�-x��1�k{�6{ʪ
Q��e����U��p�����
f��Ib@���������x��J�^�#�5]�n8e��x���ߞ�}�.�	Cv�4(CX
+楁(bN$�yI�p'8[4*�}{˿\^wwV8�Ҭl�e�9�e���u^���-ia�����N�?m4�������"~g������jP�P���iʇ��j@���]�
D&�u�`w��Y@E��ޟ_*P���]#ho͖$ m*��B�r�.~ �)=
�Es��E}�v��S �>�I�����`�e�k��� q��E*�0Q�Jr��b�䈶}��M)�0f�K&H��_��Jzʚ����LQ�(���c$��	NPB��p�5� ���XD�K�S��j'	G,a$r���,�|�D��
�z�H�� 9�<#��OB�s��TZϋ�-�. �(��ۗ��3�
yWVUV��b�ϝE�#oHwY�
�c�~��i��
�ɂ���f̟�����vٹ1 gL?����QL��#30�fw�q!=����z~�5#PZ!i�ǬD<�L�p̐dp
��?T冊�ka����'0i_��"����H$�H+�us��H���D��vOo8ۼؕ� [...]
+K�`8D$aUC�U
�I���[�+U5����U]q�
k[xc��q�����9��3�R�T�t2(��K��c8����c��5M�R
�D��\[�؇���}�Y@���n�.�ë�t��f�
+��˱�9�P�E��-���!5ʳ�`"�a�!B(�I|�Y�{���W 5�P��:&��iF�P�j:
�UJ^��b��d��x�d_��f%r�B#0�,�	��>
�	��E��b�t
E��8?WYڴ�OZ��6��
�X��bD-qˌD`$L����Ȑ&P
��UNa3�'�*sq�I��
+�٧sZ�-�eg�c��DG�F�v��1�"�B��
�������D��
+�P�s�\,>E���渄�0�BZ�D�HjE�]k,u, ���"ᮡ�X�#ؕ��u��|Y(��
+�H��%\�������d�cP�pM�|��SM�=�;��]L������}#$����z
+��ӺO�r�j�m(k*�N�
+���� �9��Vk��:�
���O�bf
��%�(�G6'^G��!ؔ�p��M
�xӁp1�\�pS/����U��u�hLw��O7�T��@�w�>ՌK��4�][
+�6���E\_���J�Y�\J��x)�	R<Q
+���l�3VB�K����ߢl�>�E��Qؾn�w�cB� #��[�lN�������!��r
�e��G5��Zc��&��[�?ݷ!m�CX�9c�).���Z
�p�0�P���帷�w�K�QZ��E���[k�?3$���0֤������iC[O%FX��1�'���m
	�?��
+.�4,�L���`|�5"�P��aG3B�ր��(`
v
 �+��
+�5�n��(���LIQ����yͼR�r�
BOt	2I��~2�־V�2��Tj�
���g�e��l	U��nS
�4��M�(����"(�K�P	O�m"�%�J,��<���a_�^+h���"�}�
#�8
�
�
+�
��
&�O�%Ms>��6	�#�
t
�7�t
n��}�H`
�4 at l 2
Y�xDA�'�

Q
ú�Z�]At1���}����r?�Zl~.�{�`�X�h�C�	s	:ȡe�=���BD3�����u�3$��3���s�;��!����]��i}}]�+@��^�	���HB/��w	���
X0,1���~�h�
>
Xp��fb�d
�<���ؖ���:r����	����N;)j���#l5NB{1
b�zi~IJ���	&
3
��\��x�Q p}�I^�؀P���Y��FO�G�7��E
���+����4��f����O5ݳ�3�J��1b f���x��ɦ
0<>Lj���0<�C(x)L
�!����=7��	qL��;�Dc�W��C������Z`�)? ��������X��
�B4ci
�ҸlnC?,l��6�F��pP��H�@����?t4���u\Kb��=�,ʬn�"m:Z�
��(��M��9�Zb�]�h{��T�m��7�����T�(

�H�$�'eD�oL�7ɵ�u���v)����Ϊ�o�Xw�����ǵ�1��K�
P��hb���
�һl�f�#�^	�d���rW��y�[��p���G|�^�i�w�����hW��"?W(on������
cs��洷�D#,��9��4?t�cyr��SYe.���S܎�-���Hendstream
+endobj
+2402 0 obj <<
+/Type /Page
+/Contents 2403 0 R
+/Resources 2401 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2356 0 R
+/Annots [ 2406 0 R 2407 0 R 2410 0 R 2411 0 R 2413 0 R 2414 0 R ]
+>> endobj
+2406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 646.6313 250.8953 675.6971]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 601.027 483.2121 631.9958]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 257.5226 300.1613 267.8038]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) >>
+>> endobj
+2411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 217.3577 182.1636 228.2616]
+/Subtype /Link
+/A << /S /GoTo /D (main_expand_space_dimension) >>
+>> endobj
+2413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 111.8821 241.6898 140.9479]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2404 0 obj <<
+/D [2402 0 R /XYZ 90 757.9346 null]
+>> endobj
+2405 0 obj <<
+/D [2402 0 R /XYZ 90 733.028 null]
+>> endobj
+2294 0 obj <<
+/D [2402 0 R /XYZ 90 580.9523 null]
+>> endobj
+2408 0 obj <<
+/D [2402 0 R /XYZ 90 566.382 null]
+>> endobj
+2295 0 obj <<
+/D [2402 0 R /XYZ 90 452.8116 null]
+>> endobj
+2409 0 obj <<
+/D [2402 0 R /XYZ 90 438.2413 null]
+>> endobj
+2296 0 obj <<
+/D [2402 0 R /XYZ 400.6899 220.5108 null]
+>> endobj
+2412 0 obj <<
+/D [2402 0 R /XYZ 90 203.7837 null]
+>> endobj
+2401 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F11 416 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2417 0 obj <<
+/Length 2602      
+/Filter /FlateDecode
+>>
+stream
+x��ZYs��~ׯ`��U��܇b��I��8���$�-D�"b�p%�ק3�P���lU*�ᘣ����$
db�D	�
�r2�\��
<����3x?������k)&I��zٮ 	�����]B"��'?L	N�j���0�8)��U��қ?�UZ��)��U^4u�LgT��봮��l�US����g�*�
+'ZO�_��u'��B0I��?_�{�'
���
���br7c�ds�)
7닷��q/�	1cp
+�ЄMf� E����a��
KD1\E�
˜����tk�o�ٶ�ˢ�:֑`��t�_6l>�=�¨�+��U�u���ʋ)�ɇt�/n��n�Ɋf$��H
+�HL��0a�XA{�P̐dp=�zU�S*��b:c�%��Jq��������?�a��ו���~L��k7f(�B��9�A0��r���5
�,/��f�6��:s���fٌ0j��v�*�A�?��z
�We��(����F'@
�
l+
GT0��Uu�Ǽ�E?�O��x]+�ߧ��<���"�5ޱ(��F�@
+$
�_��3�7
�L�eѤy�-�H�_�Ǡ��\��˛��fY�0g|
+��?Mg���u]�ݚ���-#�I��� �ءc����S���R��63;n2c�B��`_���O���R�N�v
%7ROf�H
+����c�f :���&WB�A��E}��S�lS
���
>� !���H��"Ed
��2!�^�M/d�Q�� D�ͨ�ɯ�@��L���ǑM�Kaӱq E�.�O�	7�
m���%��)r�q,Iw��GV!p��������"�
��j�z����F��v��"�6F=@���We�M�I��n�GMپɽ#�.��	,�5�ԏ��m�d?�ҵ{Ԕ1�2q"�s�T���=)E�kz�uVf`G�e���d�۬���
@���:X�<EAF��2��	m3X{�o/;��lK@aUe��,yq秕�����GQ�� p�t {��4'apZ�2�@.�PȈHj��$�n��?a����Q�/��O��kK�
�x��R
�t
+��tD�3�#�#��C9r\�q0���E>
.��$
����5�� ,�e�[F���-���ꪾO�n�X�x��o@��|.M���
A��;$b��n
�Q(����}�ȶ�`3����I�8�#�V�mP=�׀��K��X��&1���1�H�5�3Ԉ�"�H+�
�l*;�;���(>�G��C1Tx�e
�<^�G�.Ò=�
$��O��$"E�
솽�
|�"�2p$L�

�/�E�7ؐ8d��s^�I\��
���\�w���`���k
�5"���ɀ{yմ̂b��ћ�ݼ �@�n��"�+��m�]��:Ps�x4D޻���FK���	����
��M���wyR����m��؊뮜��jYV�!���}
X2df�Vn��VE�=
"�W?��ջ�*d�4���J
�>Lg<�������UG�t
�
����9����E� � vX5�,��X!��|���XxO��X���:m2�zW�O�q�rނ\�����.h� Rz�w]�%˺q}�t�H엎��۬J����
+�5�
��꫈��t�f�uj�1{"��~~n
Y���	~8a)���v�1Q�Ŷ"��t����E	�5
™ݟ M;&��r��>J���BH��qe���e�lw
C:�
����Q�MJ=_�eS"���Wt:��-#�;�Ϣ�dO��
]��
‰��H"	��"����e��B4��@�AN(��A�&���$��"伨�h�ԯ�m���].��X��Fg�MS��NSzB	�m`!!�Qɟ�A������P50�q�oL�+rK2>X/Ȫ�m`�:�q07
+��7��Z��z_7��-�v#�YMUjg�mZ ����Q̳:�x�-�%�
�÷b ^W�y��
+]B
�!
+�t���/��X
�F�����l�V�ݻ�_�\�E
�q
��Pz[��a�ڔ
+7MǟZ�Q�(,��!Z�
�u3�h��e�6�/(_���9\�]�
9	�*�V
B��Ǯ�ʗ����Y��#��V�L��ĿW�
��lX�2��/�G�����v��9ŝ j�
+�G��T$�.�	�,V3��V�E6���td
Յ��M.�/Fp}���
���ֆ�kɵMQ;d��Ym;u���
<t��up�acP)a-�>6�HR�LuQ�{h�Z'�qZ秌�B��uc���Gc6H��G�(�M��:�V��8X��
	<|�U��1 ��Z���ŧC�'9�S��ψA5�5�"�
�W(^�;5�.�`�π`'�d7'|�%P�i��;��(�@	!��{�C�dj�Q�{���t
�9�;t��Ѐn����"�h���
)��(H at ex�wضk,u���
�?��)b�L�����Y��pM̬��!�3����ݭ?\w�:�~ikX
J
_��Tj����b(Z�r��A�6}Ԣ�~݃*p`%���I���A�n¬7�u�UO�Ѻ����^]^��ߣy����V(o.�����cƶ�a��ެ4�e`~YV*��,݇[�lʐ
�
n��>�ED�7J©Fendstream
+endobj
+2416 0 obj <<
+/Type /Page
+/Contents 2417 0 R
+/Resources 2415 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2429 0 R
+/Annots [ 2419 0 R 2420 0 R 2428 0 R ]
+>> endobj
+2419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 691.1004 163.8226 702.0043]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 628.5326 513.9963 639.4365]
+/Subtype /Link
+/A << /S /GoTo /D (main_fold_space_dimensions) >>
+>> endobj
+2428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2418 0 obj <<
+/D [2416 0 R /XYZ 90 757.9346 null]
+>> endobj
+2297 0 obj <<
+/D [2416 0 R /XYZ 213.4267 619.7305 null]
+>> endobj
+2421 0 obj <<
+/D [2416 0 R /XYZ 90 603.1626 null]
+>> endobj
+2298 0 obj <<
+/D [2416 0 R /XYZ 90 514.1164 null]
+>> endobj
+2422 0 obj <<
+/D [2416 0 R /XYZ 90 499.7053 null]
+>> endobj
+2423 0 obj <<
+/D [2416 0 R /XYZ 90 421.0886 null]
+>> endobj
+2299 0 obj <<
+/D [2416 0 R /XYZ 90 398.1542 null]
+>> endobj
+2424 0 obj <<
+/D [2416 0 R /XYZ 90 398.1542 null]
+>> endobj
+2300 0 obj <<
+/D [2416 0 R /XYZ 264.2149 309.5351 null]
+>> endobj
+2425 0 obj <<
+/D [2416 0 R /XYZ 90 292.9672 null]
+>> endobj
+2301 0 obj <<
+/D [2416 0 R /XYZ 170.2884 230.2957 null]
+>> endobj
+2426 0 obj <<
+/D [2416 0 R /XYZ 90 215.7303 null]
+>> endobj
+2316 0 obj <<
+/D [2416 0 R /XYZ 164.3108 151.0564 null]
+>> endobj
+2427 0 obj <<
+/D [2416 0 R /XYZ 90 136.491 null]
+>> endobj
+2415 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F11 416 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2432 0 obj <<
+/Length 2914      
+/Filter /FlateDecode
+>>
+stream
+xڽ[mo�F��_!��
D�}	.$MZ�פ��9\�-�6Q�R)*����,ɥ�"�+GM[�������}��Y��ÿdb�D	�
�r�X���
\��4_����o����ٷRL
2����u�A$(����/SB=�����9�ӤX'���O7���tY$���")�?�z~q�l��_/x�-!�[b8RF3�a���6�D&Qfxcq9�� „l
�u��*���gT`�f�4]oWI��W>��iqN�4�pI&��X�go.ۄ5�L����~�O����0bF��
|��C'�3N���:�8�w����ahXa�"���P�����m� ��b�N�2)�M^_����m�$`񐋻j�7i���esg�Y�[S�l�ڜS1�����'��*}>�,i�
#3:�|��C,g�?�����Rq�`��B.�[�X\‘�Rv�n�+t{�N3`�p��hc?c
a��T���y��!�
��φP�a�t��ud���=������I�J
9�T��0nH��e}��f�/�$[f�v>���{���&5���
QHR�+���j�
����Ѓ���R\��������R���̌B�P�	�2|��Ze
�>ŧ��t7@!AO4!��
i͢	F|�H$��H'n	�L��S"�JS���~U�46|,�>����bYl�j^YuZd��s�n~���C`�Sĕ�d&#0���
+�2"$[ڹ2�����πoHc�{
�'@)yMC�0��Ik�Q�
�pS�z�Z�����[��w�`G��v�v�_Kc�*7dO�
�-V��٪D����t"8A�s��|0��
�E�6!���Y����q[
+�q
Cs���ǧ~c
�p��"x��
G\��S�Y�@(	#*��sv
dÔ챑b��&�Q"���S�>�&*�Gg���',pji�G�Zz�g2��~n�j�,�ݬ7�F����l�o�X��z���}����1w����ma���{��b���!FA;Oɞ�c���
+J!�toa|���Ҧ8�v�/l�:�Hr�a���H���>8��<��5aq�8m�@sf>�u����]��t��`�(�D��U
�a:;���|��LV�l�ϯ��~�C���Y���Fa��Y
�#��p
�>��T�v��0x'Lu�G@(Z3
�CZ�|w��*}M�
#�(ݬ�U.�i_g��r��o3��_�7�+&
(j�?׮7 �`m-�`ő�J56U�X�t
�$`*4F���m_�)�����P,Fxgg���tʇѵ���
O� �dz>�����4�%,uE
�?��ij��g�U�
���`\�W f��F�� ����f�
+��_'y�P-�O���
+���x���d��Q�3('`��[�(�}��v ��7�KF����
:�n�@?���@��Z���v��,��+�ԌD2�b�A��b� ��g�5���Q�G��ά�Ϧhftv����6�2}�T
��()�:������s�9�A5v�)!����a� b�p�(gt� ��0/ �3���L(��rS��9}��e7�ݽn.\�%�fT�F�^��~F�0�@=I9
�sc5�͆�l���i�FeF
+DB�
[D�X`C���6��OBօ֑�8�Xh�mn�A^�佸J ,�2��y4��W~����A�8����_ *<@��*�rhf�f]���[��i���V
�LGk���kἮ�4�6g�f�ZV
b�XC_�#�i�"HlU�$6]$�e����w���͇�7�:0@ɸ�adٰ�1$����YZՏ����P5J��*��ղ���<�l�m@��6l�-�t�-��=��Bm�M�݇q��n����
A�YP��iL
����̎��2&�{�DL��Y\�<�'�_��?[\��|�
�n寓�����h^�A�@k���`���R`%K	`A0�U$6�r�
���\�iO��$������<���k]O����9���y���P���P��`"Z�
��]
��/��<�槷�|���/
��H`�NR@�GH��E�S��g��k0���l�P��CY;
h3Hpƿ�fQX��1�rfq��
4�P\������[���UeϔgO�ݐ��7�
��-�+g[��ɺYB>8��
��+���6��PFȣEس���:N�;�E8
D�H�ٝ�����&���`���E(g�r��V�؝S	}oݹ䟒�v�����Qa�=��wඏ�t
J*Y�ǥ�������h���k�q�U��l|0�'H=H&X�$�����;��r�R&->'%T���}����*6�n�s.��?��w�ls=��A��U�
������]���
�&�
i�'/,*��M����ҚE���p\c����>O�#�]1��K��?�����}�_J���_��`9�i�RN	碵���J"C��
y��u�f����
�}t�5с����y~x�sW'����%�@��ݐ��j�R}1��i)*�����q&�|}5�
+)Jc;��Y\
<�'�A�S[\
�|5�nՠ���t��a=���{{�mL
4A�V��\�VT3$��]O79���0u�<��Ac�8-H�J��w 0eг诿�e�-b{[�Y���Ó	
��c�8��'p8tK�N^��?��a=��w�^��]�)4���S�ZE0P|b�u1<��c�1>i��"�3�Wsw��^Ыm0
\�5�J���f|QW�E]CU��l
��
+C-ö��uS��?֩�b_��t���r�:�e�LtO���Y��1y�~�Ql~��l�@��s!��0�M�;f�ٺJ�]�xT�-R��D砐xz��C�~���T�������a�ꆙwG�NWy���[�3(���g�����b��y�-PV>�nW��������uq��<5F=,��sLa:b�����i�)�c6p�n^{����j ��K�"�endstream
+endobj
+2431 0 obj <<
+/Type /Page
+/Contents 2432 0 R
+/Resources 2430 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2429 0 R
+/Annots [ 2439 0 R 2441 0 R 2442 0 R 2445 0 R 2446 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R ]
+>> endobj
+2439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.8565 564.428 243.4733 575.332]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cfed8bc19e046453778c9d99d84df283) >>
+>> endobj
+2441 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2787 525.9063 155.4642 536.8102]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 525.9063 221.8944 536.8102]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_12dc6df3a06f4c97c6bb2264bbad05ac) >>
+>> endobj
+2445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 445.6259 191.7178 456.5299]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2446 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 445.6259 288.8524 456.5299]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_033967c42f02b6029fc4d6153eb8072a) >>
+>> endobj
+2448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 407.1042 191.7178 418.0081]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+2449 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 407.1042 303.0791 418.0081]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_25c5ef784f17646705c76a5be6c724a3) >>
+>> endobj
+2450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.6348 368.956 188.6794 379.4864]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e0a1b4b4a344cad01c58e8e006a7ff16) >>
+>> endobj
+2451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 294.6711 170.2551 305.5751]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ab3964a5c29992e6476852c9d246fe6f) >>
+>> endobj
+2452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.0708 294.6711 239.7139 305.5751]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.8775 294.6711 409.2665 305.5751]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+2454 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 260.1344 170.2551 271.0384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_3825b4905d72422089bf28d3c95c2964) >>
+>> endobj
+2455 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.5923 260.1344 242.7526 271.0384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.3168 260.1344 335.7828 271.0384]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+2457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 213.6425 170.2551 224.5465]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_fad498a5802a7928442fd0d4b8c6183f) >>
+>> endobj
+2458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.4282 213.6425 241.5885 224.5465]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.612 213.6425 360.0781 224.5465]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+2460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 179.1058 170.2551 190.0098]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_128b2fafec11e096e41f78710ba2ff0a) >>
+>> endobj
+2461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.5923 179.1058 275.4194 190.0098]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 144.5691 170.2551 155.4731]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_15b3e8152862a6b98ecf1c4f4a142634) >>
+>> endobj
+2463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.5923 144.5691 282.0448 155.4731]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 110.0324 170.2551 120.9364]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_dbf2609849c95cfb7277df1edc69534f) >>
+>> endobj
+2465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.5923 110.0324 273.7359 120.9364]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+2466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2433 0 obj <<
+/D [2431 0 R /XYZ 90 757.9346 null]
+>> endobj
+514 0 obj <<
+/D [2431 0 R /XYZ 90 688.674 null]
+>> endobj
+142 0 obj <<
+/D [2431 0 R /XYZ 90 681.5584 null]
+>> endobj
+2437 0 obj <<
+/D [2431 0 R /XYZ 90 581.3327 null]
+>> endobj
+2438 0 obj <<
+/D [2431 0 R /XYZ 90 581.3327 null]
+>> endobj
+2440 0 obj <<
+/D [2431 0 R /XYZ 90 544.8333 null]
+>> endobj
+2443 0 obj <<
+/D [2431 0 R /XYZ 90 464.4335 null]
+>> endobj
+2444 0 obj <<
+/D [2431 0 R /XYZ 90 464.4335 null]
+>> endobj
+2447 0 obj <<
+/D [2431 0 R /XYZ 90 426.0312 null]
+>> endobj
+2430 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F23 2436 0 R /F67 370 0 R /F74 482 0 R /F101 2079 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2476 0 obj <<
+/Length 3433      
+/Filter /FlateDecode
+>>
+stream
+x��\mo#���_�OW�x|I�M.	���s�I`��-T�*�|>��w��䑻+r��P���㙇C�3C.%2���<QB!ø��Wgxr
/}Fڷg��,|~q��+)&I��⦶ 	������SB=�����9��b�*.ߞS<���w�����nq�-���~����wwŦ<�����_�%�#e4���H�`D��-�b��A�	���5�Ų���gT`�f�\m�žl^���)��DO��
^R������ٗ>`m<�Ć돳_Ǔk��g1���~��C'�3N��ey���_�N�F�C�±F�J=�1���?B�Q��R���O��a�B�R=�0��(��J�FMB�]�
M�����W���[?��Dؐ,�q
N�OD��I~3�ʹV)nD'.X�y���{΍F`Ut����h��Zo�t��]
�sHG���e|S�&Rž_m�>�y��*BF���s
zv�T� 7�s"����&s;�g��ʰ`\ 	�
��G,>���\~�� [...]
+��
�G��F�Rߚ_Q�SM�2b�
>7�]뾻B#&�XU�L�G�o2�����*\&H�0���>|�/; �tt�<>��ݱ��Sj�8I�ʣ2<8��T���x
�™���)��"Y�F�F�I)bP�O����D��\������ͦ)�+P�k#Q�]��=��:j'R�
+���
]`���?C���[�$��� ��u�q\���|D矡ѳki|�]\�ˑD��
�Ge�Rb����-8��� K�R>v�
��г;�*���£2<�k)c
��0
��$E
l���r�Vݷ�V�D ;�	
�	,�k�0�W�e4�òL4�C~��z������
2
u�o�v�BSX蔌�X�=j�(�
�r�5� ʱ��
:��	�����
��]K��������r8Ti�!iҁ�>��[�Y�WT2a�7����1+GRi��Mhg�U��7��8i1>�
��t����W at +Gh:�
���ވ����
��
+�wK�gN@>���F�<x�qCź�����웗v�ڇ�
.�Cp���_4 
J*�+�/��S�
9��!���&���v������S�W��af�-<�k���6��W��z�J1�X���@ϔ2D�P��p����j��=>G�g75��0�0�e:��m�]���cZ��=6:I����R5��1�;��_ܮW�ڵ��xNL�Zi^��ז<h�>��O��mE�
c6p�
uC
�^�n�8ԆE�$v��X_
�
$
q�q��"�N��N]��a^/`��E��-ֶ���ղ����XPH-	9Ec�ʕ�X�S���h��e564�h�3~[��ܾ��@�7΄[0�bׇ���s$zv-��C�H|�q�S3< ����vuu��&C�UQD�����9�=�I��\d��Qߔ��
+��gT�kn;��t,��P2���=�ݐBAcJ�O�P��ݐDA���J�!Y��=����J_TUa�݉a'�*ɩ��sNs��`yU

�ڹ��Q1$�7����RA���4�n�B�
05��G�b�
��RQ���i}�F%Oړ�6R��`�؛r����mCCIl�8S�7�?���>�a�:lm!�,@ �`,����B��;=|M�/o�#��\]�m����z����u����������7��k
+W�s̴���mT"�
*�z	��f^�Y�
+�y���g��-��$I���<E��Q���`!�ݦ����j�V����gσ������&�=���"~��Ҍ)�_v�NЁ�FB<�r����o?�E���G������o��(7?�����-ַC5�@d`��E� A
���a0'�>�y=L���j
�
�#�"�[����M���;Mӧwȳ���7`%�u2�!���$ߙGe��D��ug�L�����'ez`#��fz�P�x�û�x 墴����f0�!*ؘ��^,Z�*W���_[U9�>,v�������LM���}� 㥔��L
~�������v�vŵK
2
C�I.��G���U1�jpҌ��^P�Au4�{~e&���s7T<,�́���9M�)s��
�,�b��_�{���U��$�
�L
)��ȉ̆��"�sOu׿֡��,
͙G��
���3��(2�O}�>I�)Ev�^��>�5��]M(��:������
j��@�H�r9MA�����s�>�ư+�䴇es:4xjNgȵ�����N=:��L=.��Z������Tv���"Iw�Q9"F�Gt�
�ݐw����L$rۡ�����f��3��Se:�g�`�D��Qxh]r��`�L
���ir.�Cn���{����no��$�:�U>�!����2D=.b:�Lw��&��)�3�ʹ��&� 0��cқ*��v�;��Jp;�x۱�����1�p��~��y����q0ۍi�/W׉DT��4aK�8w��a�l
���ir.�Cn�=���lO���!Ө��{l9�mg��̣2D��hEe'd��=1�S�'��D�{X��J�y�x�����E ިE@�!�Wc x,�j/
r�4�C!t�
���
�֌�[�v��9��c4'h�>�s����������4/�b����O
����&w��aY

&��d�������Еh�I�m��J����mܯ�w�7�juY\U��}o�׿��W��e2
�!C䳆N=���7��S-����s4zv-����^~�a�-w�����\����
	Ơ*�b���Ǜ�h5�
	�O��Ih#���;Ԏ�#>�ރ����'T�mV����aw,P�~Q��WB�F�c�+ߵz�;�6�#���z�Ė"��	�	��?��xĹO�xX^=�)�L�u��M�g�v�z�	��v��\V�a�C_9�� OG£2D�r�0�Y��L�����8t��TMs�H:
���@��f��x�jB�,�>��9��RM�?UM� 9Ŵ_y�b�iR�]?~n����N@�~���/����
ce�� X�:X��p	�T&�
�o�#��=�p����~W���]��˹�}Q{��X߻��X�h����&@CS�\������~K�TB<�:Jͻ�����~_C���/��d*rϮ
��~����뇇4ߡ��b�E����f����0���*��}�V [...]
+endobj
+2475 0 obj <<
+/Type /Page
+/Contents 2476 0 R
+/Resources 2474 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2429 0 R
+/Annots [ 2478 0 R 2479 0 R 2480 0 R 2481 0 R 2482 0 R 2483 0 R 2484 0 R 2485 0 R 2486 0 R 2487 0 R 2488 0 R 2489 0 R 2490 0 R 2492 0 R 2493 0 R 2494 0 R 2496 0 R 2497 0 R 2499 0 R 2501 0 R 2502 0 R 2504 0 R 2505 0 R 2506 0 R 2508 0 R 2509 0 R 2511 0 R 2512 0 R 2514 0 R 2515 0 R 2517 0 R 2518 0 R 2519 0 R 2520 0 R 2521 0 R 2522 0 R 2523 0 R ]
+>> endobj
+2478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 719.9123 170.2551 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_faa5d6b3c1b3b83161b619c28c5f9936) >>
+>> endobj
+2479 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.5923 719.9123 245.5223 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+2480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.7152 719.9123 344.1813 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+2481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 673.0878 170.2551 683.9918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a07f93a685253eb04edab43b5ebd27b2) >>
+>> endobj
+2482 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.2216 673.0878 232.8217 683.9918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+2483 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.3832 673.0878 282.1101 683.9918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+2484 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.5462 673.0878 423.0123 683.9918]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+2485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 626.2634 170.2551 637.1674]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_25a2d683973c6c6901e47c4fe90cf2b1) >>
+>> endobj
+2486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.5923 626.2634 217.8461 637.1674]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+2487 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.1261 626.2634 322.5922 637.1674]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+2488 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 579.439 170.2551 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_df78023ac662762ffc808902b970597b) >>
+>> endobj
+2489 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.5913 579.439 279.8597 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+2490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.8614 579.439 426.3274 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+2492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 532.6146 170.2551 543.5186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2493 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.9947 532.6146 221.8013 543.5186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_bee6d42dd6f94979bcc7fb3d51102864) >>
+>> endobj
+2494 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.1385 532.6146 294.2988 543.5186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 495.7529 167.4656 506.6568]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_9bf45a32e428970068f654258dd7fb0c) >>
+>> endobj
+2497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 495.7529 216.4416 506.6568]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 458.8911 178.0039 469.795]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a78a6abbbb3c425992ca644f732e69e8) >>
+>> endobj
+2501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 385.4759 190.7379 396.3799]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 385.4759 261.8505 396.3799]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8101d965bc32e4ab1df6aa445730769b) >>
+>> endobj
+2504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 348.6142 190.7379 359.5181]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 348.6142 262.1594 359.5181]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d09a9ccc89ace499a888b6b1a1f4ce44) >>
+>> endobj
+2506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.2253 334.9897 390.0817 344.8949]
+/Subtype /Link
+/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >>
+>> endobj
+2508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 311.7524 202.9218 322.6563]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 311.7524 248.5799 322.6563]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1e645f35cbeedf3341428988157f71ab) >>
+>> endobj
+2511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 274.8906 202.9218 285.7946]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 274.8906 296.1808 285.7946]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_24fbe68af11e373092f23f59b6cfd3e1) >>
+>> endobj
+2514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 238.0289 209.5473 248.9328]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 238.0289 261.8309 248.9328]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c7f89b09f6755cdcd97daa3a92522b00) >>
+>> endobj
+2517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 201.1671 209.5473 212.071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 201.1671 309.4317 212.071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8f0bdfca2a6993bfa08358319d589ab6) >>
+>> endobj
+2519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 153.3464 228.8952 164.2503]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_79a586ca093d218e5603380ac0475717) >>
+>> endobj
+2520 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 153.3464 333.4819 164.2503]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2521 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 118.4772 229.5026 129.3811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_641b55dd6c26bce06bd8041b38aec873) >>
+>> endobj
+2522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 118.4772 334.0894 129.3811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2523 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2477 0 obj <<
+/D [2475 0 R /XYZ 90 757.9346 null]
+>> endobj
+2491 0 obj <<
+/D [2475 0 R /XYZ 90 549.7154 null]
+>> endobj
+2495 0 obj <<
+/D [2475 0 R /XYZ 90 512.8536 null]
+>> endobj
+2498 0 obj <<
+/D [2475 0 R /XYZ 90 475.9919 null]
+>> endobj
+2500 0 obj <<
+/D [2475 0 R /XYZ 90 400.5543 null]
+>> endobj
+2503 0 obj <<
+/D [2475 0 R /XYZ 90 365.7149 null]
+>> endobj
+2507 0 obj <<
+/D [2475 0 R /XYZ 90 328.8532 null]
+>> endobj
+2510 0 obj <<
+/D [2475 0 R /XYZ 90 291.9914 null]
+>> endobj
+2513 0 obj <<
+/D [2475 0 R /XYZ 90 255.1296 null]
+>> endobj
+2516 0 obj <<
+/D [2475 0 R /XYZ 90 218.2679 null]
+>> endobj
+2474 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F37 1999 0 R /F101 2079 0 R /F25 348 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2532 0 obj <<
+/Length 3486      
+/Filter /FlateDecode
+>>
+stream
+x��\[o�~��Г++��ˢ��^�v
�I���0ylO+K�$����
ΐ#�E<#+N�� <�Μ����7
ΰ	�l���(C��z��;�����3~�����wg�~�j��\O�]W
4#�3>yw��1�/f�R:}}��t���_���t�^>�W���O���|�����|w��v~_\��~`,q˜$�Y0��?�&�Ȍ.�
��8„���/��o����b�o�O����|W�߼)�����b����j��y���&a!�Jh��������+��_�(Ϊ�#|��9�'wg���ay�������ꄡn��˵�̄$V��CV�JŒ�Ѕ\��l�P�4
�͹�4f>�p���c�F����q��kB
k�}�^/{a�&��NT���&��I�s,|׫7���+�[� XM �
iy��B[G�p�ؿPE��v�
� UN�M at c�����0~*W�|s��o��b�-׫

�	���h�0Namg�LM
�ӯ��
�
���
���[�º���
+���EY�z�#
�b2���
+a��NB����^&$P��ڎ�Dc����
�	���Cʤ��@���r=����.f(8��W0b��S�S���Ϋ�~���b5�V��,-$�hg	7f7DKk�x���"�B��RU���B���i&
-�>�����=lV�0G��^P?l��v��0]��B~��,���T�U}�^-��#���')KN��(#]8
zW
 �DSc"��r����AW�]} 3��i��CsB�R������ �����"��hCM�w!���W"�Ln�\
��	b�� -�\�-_��ڇ��<ޖ
�k�q��[�gj��U�,�� 9v�� ��BH��]�͇��!�Xn㸾��W���6����c[�	
�ZI"7�Vu�r�1C�F�0#7��An����F;*.7��]���F���@BG���8*7F&`/7�0�~���\��"ʍ��rcdB�r#����8��M�^n  ��h'�#3��y}��ɍl&�r�F?�ʍ^�qp��*A��
#�h?KO(�_��bUl���_���:-�Z�VHp�';����f��%�"N�Z���֊f_����|�Uw�?��ܯ�ծ>|�-����)�x���q`���u����l
B�~�W	����#D�E3\�%s�/7
+�4��3�0a;a3�/�c z~+�W�h?P(�U�mFXdP~\�S~X��((��	h�}�����9��h�Ap�h�:��t�%Bj56
�=���w���T��磱�@�� ��S���zP�y�3>�=��w��S���L4V�g�3�u�䶥��0�c]��y�2���@	�S�O�##}3\������>��|h_�Ќ�QR~$��]K���C)�9����
rP��O�r���
G�{ݣ��G��sD��+_n��0)�,��Y==Rh(E����
+������
"#�����#$F>z����mu���Q^�2���qMߋ�,��ף�E.���Ǐ�"�?RW�K�^Vd��
'*r��k�<�()Z�@Ÿ
�EA��qr"�����#�b���c����tc`�	K�a]C
+���5��_d
�I����!+$�_k���v��H�+8p'	�����
+V_d��,���#F�����x�(����^Z�I�n��u���R�Y��
����]C�ˡ
6{۰�� ��V#o���˚���
@���
+�m}��n�
+�j[�scS��#0�~=�t�`
��
���[IC\�c�?�������e�&��Gf�j��)*�yx�J����R
+
s�:8G�?�}�9*����n�8�C�_�i�\�oe
�;�
��|�,�Ң|�p�K
��.7�]6�w��c�.���#��6�b�|�<D|0C�
�g��B at p�S���A�
HB۱�h�1=�Y� ZI�� Za��!L�um+��'�L�F|��
�E�ϖ���o��է1�#Р�yO�O@��R�4J��
���a��q#
�a�4�
+;�� z~��˫r�/�py��K�!��k�$4V����&?˂�F����`���,܍� Za�=
��v;�,�76Yy
&>r,�>[
^�`�h�x��<���`Һ���t��s��^���VZ�3�S�ݸ~a"?LV�1p������ڷ���b9�
-�CӵS*
�C�S����jicׂ�	/��m��Kz�ga�+
���H�ѱݏ)�:b�u��C��`���
� a3/���췎g��X!��uo����cI��g`��<O\d(5Z���^�ɤ
>����\����Ǣ\�d��]a'��MX�
����/ƾ��"���W�B+œ�l���?��e4��2qx2[��E�L�
���dze�-S�#�23e�<��-[���e+������
ly��?�cKJ,�U�h�����2����7��?9�+9���~�L��i'�������7��W��<	*\i�	x�9b8Ey2��<�8<�'��"O��*���@x�z�� �xҌ�I��46v-�8O��<IG  �4�
+�ݏY��u��yRT<�����H �#Rk��Ac����)���7@���椝��
WF��9[��G=|�V�2�pWZj������
K�؞�����[E(�
—�ʗ���j$7Pa+lv5�
v�j$��7�F֛Dz
A�q�5>Za��VDfE'�@ncK��̞$�R��n�>�E��x����mBp��wo3
s�<���f�0���ʰ��4fx	's%��K8
�/�V�1%���J�aU�ݑ<��m��c@�IC0�@8?���d��Z�oI9i�N}�j9�}��\�����O�t���+�KB?��-Vό���
��j޻�s6h��$f��Әc*9��ucp�)v��������G#$6��pJ��}D�2ga�>�Q�}��>2�ۘ}��[�|u����;8\��B�H�_�f��r]k�h3�jS���E↺m��n;��E ����ݭ����M��/�
��z[\�o�S�˧"!@�D�4�G��޷r��N}�
+9��Q��z4�y8���!���)x�-†��u��C�����|����v�V�Qʜ	G�@�
՘ᬐ8̱B>nd�4l�ZaǰB
@�o`���DO�C=87��h�E�oZ�Bt�~
pUa�IT���QA4��P��AL�3V�
+ֽ��N���_�1Ë8q�+�|�X�i�|�Ž)�<���t��e����M����������ȧ��B�p�e/�۽pDM�7�Iv�k0���V��3
5�0g/��6N߫��1#2.�o�����{���������Z�^A]��[[`�z��������D��(?^W�6w��^���ۿ����?](5
���|�0_��~��E)������M������N��@
���Y���$
�-��N�%g�o;7I�{~}�ow���_�z||$�-yX��R�^��/_��4� Ϲ��p���
�V�%�DWOn'X���[o�a_�Uw�z�H�A(����endstream
+endobj
+2531 0 obj <<
+/Type /Page
+/Contents 2532 0 R
+/Resources 2530 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2429 0 R
+/Annots [ 2534 0 R 2535 0 R 2536 0 R 2537 0 R 2538 0 R 2539 0 R 2540 0 R 2541 0 R 2542 0 R 2543 0 R 2544 0 R 2545 0 R 2546 0 R 2547 0 R 2548 0 R 2549 0 R 2550 0 R 2551 0 R 2552 0 R 2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2568 0 R 2570 0 R 2572 0 R 2574 0 R 2576 0 R 2578 0 R 2579 0 R ]
+>> endobj
+2534 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 719.9123 187.2643 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a7b3a5c12ea008b78eed88a621c1fab1) >>
+>> endobj
+2535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 719.9123 293.2128 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 719.9123 371.1477 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 719.9123 455.7274 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 662.3661 187.2643 673.2701]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e61fdcc22d1e0fe43b94194f2eadaa1a) >>
+>> endobj
+2539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 662.3661 293.2128 673.2701]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 662.3661 371.1477 673.2701]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2541 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 662.3661 455.7274 673.2701]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 650.411 220.0576 661.3149]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+2543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 604.82 186.3482 615.724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_33daeddebffc6eb847edd92c3ba045dc) >>
+>> endobj
+2544 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 604.82 293.7723 615.724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2545 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 604.82 373.3671 615.724]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2546 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 604.82 456.8371 615.724]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2547 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 547.2739 186.3482 558.1779]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1d00782cbab77286295552af7dba7ed8) >>
+>> endobj
+2548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 547.2739 293.7723 558.1779]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 547.2739 373.3671 558.1779]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 547.2739 456.8371 558.1779]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+2551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 535.3188 218.4038 546.2227]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+2552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 489.7278 180.4964 500.6318]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_6a3dd351c33d66250d2b4ac639768f07) >>
+>> endobj
+2553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 489.7278 252.994 500.6318]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 455.0958 213.1533 465.9997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8a87935278cb7b1290301e96cb82fcb1) >>
+>> endobj
+2555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 455.0958 285.6509 465.9997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 420.4638 213.1634 431.3677]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5e972fbb672e9b2faec34b949c9a2918) >>
+>> endobj
+2557 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 420.4638 285.661 431.3677]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 385.8317 205.6917 396.7357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+2559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 385.8317 261.3124 396.7357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_75188bcee0bfc88a4c8571acc04a1826) >>
+>> endobj
+2560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 385.8317 332.1558 396.7357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 351.1997 205.6917 362.1036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+2562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 351.1997 261.3124 362.1036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4aef1a4f6e9bed5d473e98320401e0e5) >>
+>> endobj
+2563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 351.1997 338.7813 362.1036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+2564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 316.5676 205.6818 327.4716]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+2565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 316.5676 261.3025 327.4716]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_16f61fdba7e14a67990a84e93be00efb) >>
+>> endobj
+2566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 316.5676 330.4624 327.4716]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+2568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 281.9356 183.8239 292.8396]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_caa538c9c00b2f69301365d916bb49e8) >>
+>> endobj
+2570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 245.9219 192.2722 256.4522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_620d5cdb01b8b20848ca01f4e4c05b4f) >>
+>> endobj
+2572 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 209.5345 189.9009 220.0648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_242d9bf0b5b215d4aa771e9f8595baea) >>
+>> endobj
+2574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 172.7735 241.9353 183.6775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_54f33edf5fdf4c6f606136b882be9f1d) >>
+>> endobj
+2576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 136.7598 193.2289 147.2901]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8c73e2c464d5e93dc55862d00d5478f8) >>
+>> endobj
+2578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 99.9988 238.4586 110.9028]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_396bd79b5d57d54685d9c1b9d970c00e) >>
+>> endobj
+2579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2533 0 obj <<
+/D [2531 0 R /XYZ 90 757.9346 null]
+>> endobj
+2567 0 obj <<
+/D [2531 0 R /XYZ 90 298.9178 null]
+>> endobj
+2569 0 obj <<
+/D [2531 0 R /XYZ 90 262.5304 null]
+>> endobj
+2571 0 obj <<
+/D [2531 0 R /XYZ 90 226.1431 null]
+>> endobj
+2573 0 obj <<
+/D [2531 0 R /XYZ 90 189.7557 null]
+>> endobj
+2575 0 obj <<
+/D [2531 0 R /XYZ 90 153.3684 null]
+>> endobj
+2577 0 obj <<
+/D [2531 0 R /XYZ 90 116.981 null]
+>> endobj
+2530 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2592 0 obj <<
+/Length 3304      
+/Filter /FlateDecode
+>>
+stream
+x��[o����)��@��~Y��n�������va(��jK^IN�~�
j�49��G��E���_�

��9�sa3
+l���(C��z��=��kx��'���
>?O__���V��#Ns=�x���Q�����ϧ�~v�(����=�on痯�8=]�||�\m�?,�l曏_}��7����_.�{�-c�Y�$1�
+�[�C+�<3J�p�S\
q�	�;�Q��o�g�\Q���is{w3�5�;?5o�����jo'ԩ����_.bº|*��Oׯ'?�BgW���N(Ϊ����
�ݞH.�?7'�O�
��04,�1"�r�J���*&�����A�0���
�)5h�Qf�I 2�(�� ����9��(���窟 �;����oPa~�&Ա�����p+5�N��[�������X �]�b���6��j[�a5�N0�����
����N-�:N�%:��=Aa�G��3������M�&�8-�)�*$ �t��� ޟq�!�]����ZH6��(X*�^E��-����؇i��B�Z��H�%p������o�I`2�^�]��}���(�h�:��m�S竫��zu�}�.�!�k�}��|3�Y",
��6I&�R�\5���0e�82X
F��I�P$DSc�o}���V8�0d|(��<u� ��C��
�|�
���\��u�

S�Uf>'���oջ����sM��S����q�
�e�7y�k1
qкOl��}�}�u���|��&�8���r
�x�ab~sӅ��FFH�Q���v��"VP�)?.
+� �G
X
��a��
�J�XppHu�,�
+T���7� �|^����7��f�]�W�~Ֆ�[_>¯_����ln��{���ޯ;�F��ݻ��ͻ��q}�|�1|��i�e2FG9
���Y�fA�����gu�h����Vby5D5�$�]W���cAv}��X���X�`�U�UH����e077
��ab�
��ou�/�'�(X~�Q�97�C��y��c~�!p'�|
+C
؞ڨ�=�|X��
+�
���nٮ��O���=X�Q`1�^� Y�[w�
����6w�f}��
+���3�w���;�.��|�5p��p�0�W�)zǔ:z9�����
%`j�B@�oG��m����N(� 
+�%�.��]������ݞ��I���|D׎H�|FQ� x39'A��зZG��+m=Q�8�9F��;�B��A(Ll�Pd_P��(�p���B���
�A��01XCa�o at a�-s��A$��n��k����p�B
�Km=
Q�D�a���<��?�@X��Q55Q��Q��(8�k���\�*̻���T��_,������
���F
�A6
�I��tD(e���� 
~�|p�����Z��� ??,w���]����q��������U�G�)�
�|�Y™�6��
%_j�B>�oG��m���N(� 
+�%��E�j[�GT!�p�PF��a
��7�N��Y�z$��n
�f8
+�Q�yW�,`M�
C�� 2=\�NE`j���(�D`����d���'�q���H"�s��]!-�Ce8�54��4�nѢ0w=�(D�(�=��"�0��CT!!��r&z��#��QS95Q��Q��{����*�f�q��sUH����*��b���Q��-�Aۅ���,'c\�yO��O�f̱
Ly��(�g���u�R��!{��B�-��a�Q��01Xa�o a�a�z
+�Av7���珋��NEi�
+IJT!�p��5$�7��p��`�L�H�cv���>&s5
Q�!�?�ڟ
(���򃀘ب1�~�@
t?R*����:��=�y;j	<Sډ��R8��"��2���
+.�
.3�Ֆ:w;��F(�ԌHOM�eIHT!����L����	rjZ�
	��;��FgY=A��`<$��C�h),%zd5L�ej�B�(�R>>]�(�#�o����H��/F��`
�u����:
3�S`X���ՍU2
+꠿b����B��_��eoT�He���Ӊ�z4���iPt~'Q*$
A���~#���bQ*b�3a1�Q�b�})"���(��&��㓒�Os:��A��21X#e�o e��s��l$��ny6�l��!\iV�CT!!pȿ�����а���S3�X���
�hwm����u�B���۽T
ċ�5BF�8=h�1�Q#c��ȸ
���S_
>��������M��ň
+f�'hy��0��xvh�����
5w~J���?r���ñ��(Cɘ���ۑ1s[�!s�jH$��� ���)9�'$��x��ע��Z��11-Q��Qڝ�HPsQ�ӟ�A�5���:
�
����
��F��Q6�\�c��a5b��򈧯�o���Z6��!��WP�b�
2����5�~5S�h=���PO"AvǺ���RA�#`�V�UH<P��Y/��6���S3�h}�Ӡ)9$��?q�
+	B������@�J.a�Yv�Fdj�F� �'���
_�?+��^�#ԗ��
�dΏ.�Ee8(�5P��P�n��e�vJyY���A��E��}�0�ى*$8͍���Feh��m(S��X��I��g!�-��!�� ��ս1‰	_���A{���1��
1�QM2��P�����J"��huHF
+��`�����[���]O�&� 
+�>�M{�����ڍӰ���HB�
+��
��$z1�M�c�ԔD=Fa�c��gpVOBT!��y.j�ɽ#w
2�B
���F��Q���Ƕy�;���w
��i��s��
+~�{�{�V��R����Ӆ#d��L
�Y����	���B�z��AB��H�0��UH,�
��Q�
�(!a�*�ԔD=Fa��
+<+E=A��
R%��}c7�0�5����F
�A6
��i,�
+`��i��ǑS
F���5���k_<k��]�(�Q��7P1u�S1s=��� 
+����܂r'�		"$OP��8����r
a�f$�0
+��.��kE=Q�!����7*ؙX΀�Ê�54v��d��k�
D�f�����E=���w�	��0��/R��^�
�?�A��'�J2�eO��(8�+��4�ytF��~~ln���*<����{�q�̽��Δ:݆��������<7�{S���p*��4ܴ���J�����S�C^���~��Yx�}� ��
��7ڇי�'v����}����bK�W˻
Y�^��ݼ,���%F�q�v���%K���h�����v�=�v�i��7o��!y�|Tl0���c%�endstream
+endobj
+2591 0 obj <<
+/Type /Page
+/Contents 2592 0 R
+/Resources 2590 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2429 0 R
+/Annots [ 2594 0 R 2595 0 R 2597 0 R 2598 0 R 2599 0 R 2600 0 R 2601 0 R 2602 0 R 2603 0 R 2604 0 R 2605 0 R 2606 0 R 2607 0 R 2608 0 R 2609 0 R 2610 0 R 2611 0 R 2612 0 R 2613 0 R 2614 0 R 2615 0 R 2616 0 R 2617 0 R 2618 0 R 2619 0 R 2620 0 R 2621 0 R 2622 0 R 2623 0 R 2624 0 R 2625 0 R 2626 0 R 2627 0 R 2628 0 R ]
+>> endobj
+2594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 708.3307 187.6893 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d369744c43a49ebac904bc3e17de0478) >>
+>> endobj
+2595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 708.3307 226.6926 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 673.4614 161.6774 683.9918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_29212d49685544d8a3c71993bd30f467) >>
+>> endobj
+2598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 600.0463 205.7516 610.5766]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_20814dec69b3a6602b70a9ad50db9b2a) >>
+>> endobj
+2599 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 600.0463 276.595 610.5766]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 565.177 267.9376 575.7074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b464aec35ab7fb9fe0a8a50e05ad6f99) >>
+>> endobj
+2601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [295.2748 565.177 338.781 575.7074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 529.9342 212.377 540.8381]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cf4dc2de16f4a54ca03daa6ac1d31ce2) >>
+>> endobj
+2603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 529.9342 289.8459 540.8381]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+2604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 495.065 274.5631 505.9689]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c20541d40c7629b278584406ce554eaf) >>
+>> endobj
+2605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.9003 495.065 352.032 505.9689]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+2606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 460.1957 209.6269 471.0997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_28b268e37d25a0cfa2b5bf39e85c758d) >>
+>> endobj
+2607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 460.1957 314.7912 471.0997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 425.3265 248.202 436.2304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_535090b407c713681228d6ab2b835e36) >>
+>> endobj
+2609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.0176 425.3265 329.8447 436.2304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 390.4572 271.813 401.3612]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea) >>
+>> endobj
+2611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.1501 390.4572 376.9772 401.3612]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 355.588 310.388 366.4919]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1cb059d74161d8458f18b02e33efe434) >>
+>> endobj
+2613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.2037 355.588 392.0308 366.4919]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2614 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 320.7188 216.2524 331.6227]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0cc08ca5d72d5cf465eb7812ffbb156a) >>
+>> endobj
+2615 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 320.7188 328.0421 331.6227]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2616 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 285.8495 278.4384 296.7535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ad77221c9c10713c4a2c8ef2b43cb617) >>
+>> endobj
+2617 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.7756 285.8495 390.2282 296.7535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2618 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 250.9803 254.8275 261.8842]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a85819690f928a46e3f437bfe629e976) >>
+>> endobj
+2619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 250.9803 343.0957 261.8842]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 216.111 317.0135 227.015]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_794dad01f1995c73b887effa026ac32e) >>
+>> endobj
+2621 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.8291 216.111 405.2817 227.015]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2622 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 181.6154 236.7449 192.1457]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8ede75fbd470fa30f11d4c02672883f5) >>
+>> endobj
+2623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 181.6154 307.5883 192.1457]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 146.3726 243.3704 157.2765]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ce010a880cb8574335f1be294907de89) >>
+>> endobj
+2625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 146.3726 320.8393 157.2765]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+2626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 111.5033 240.6203 122.4073]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8e13e7d3536de2745bc9e58a25b75b77) >>
+>> endobj
+2627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 111.5033 345.7846 122.4073]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2593 0 obj <<
+/D [2591 0 R /XYZ 90 757.9346 null]
+>> endobj
+2596 0 obj <<
+/D [2591 0 R /XYZ 90 690.1886 null]
+>> endobj
+2590 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2641 0 obj <<
+/Length 4157      
+/Filter /FlateDecode
+>>
+stream
+x��]io$���_�O	�py�$@|q
����b�Y�%
2WfF��}����}��ic���
5U�E��#���
�灟;�XPڞ_����
|��3Q=��gm�Oߞ��Қ�������m��
+f���oo����˙�_|s)��b�^̿���b�z�/n�����w����͛O?�_�/v��o�z��-�"h�W ���2I"
Τ
+��x;�$0���
�L��l�8
.g�p��E�ޭǢ�����_
+Ql��#��
+}�}�6&�ΧQV`��s��������g*xs��p&B���3-U�fuvu�������P�h֟ϔf��χ��L8%�
�b�
���v�cVJ
�0?Hi��R0��;o;��m����2
D�}9T�7���M�Ư�w�ͷm�=��Q�8��b�ay��_o7w���C���K
L>#ъ #�gNs��	n8 at 8
{��a�95'ў���[N�������X��p��
�N.�BY�:
���� �C#�*
�	�*
��Y�=�

��0�%�������
�Y]�`
��S(�ݡ��cQ����
�W�����h�zO��MMN�
GW����I�x����q[��_*wQ��N�C�s	�wۇ�MqS��Y�"�!١�'�7����fZ. �i
�`����宱9�/��
i
�ʈ�v�
@����~V
;A�����{`��3��H�l;�p'���$,ɝi�	�I���E�����jT'@�d�k>�>Ɲ��
ز�IP��ؓ�~��.� |��w����0���:��hE �P��3�a` |�&-P��ڝB�m��fUY�
��)J���z]lo`^�3]U�Spz~KV}\-77�%R����n��1�A��26�V
+ R�$/AD<@���\?�jf���F(h��W��Ǻ7����n�W)	�`]luZz�	ʟw
S�_�
+�
§���}2{yWV�2HY�Z�
VO��2�Pk��0�����(��Ŕ���k��L��'JNmEW�'w���
�ԛVL�ܴ�N�6Y]��kM��O�&;V�v�Ge9�4�'�?��1��J�a~U
�,�V�4D#����6�W���]1o�Dq�/=20-�9��|�JOc��
��p��{��a������߉��@�����,Z(��0�e')åG���P{,�2���`���c�-kO�-���X}����*�G�*
��TVo��k"
�34V8�]Z8��;�
@9�T��E�S	K�W�V~1X�<B�ϵV�P��c:x����P7*P�+�����0S���u�J’�+
=�| z~�rs,��0��ՠ�ɴ�:��hE�� E'�
��/�f#�S0z~F{C8A ���I7�;�l0֦�_=f���
+���S�V�G�jE3���rL
rl�<�Ix�V�Y
�Q��N
q�_��4�

`��n�scYln��ހj��_�^
S.ff���@L��7�����[�3�[s�����c;��v5č�&�	���Ҟ��;s��r�\/��e��'%Z��wL�.�Q�T0N�דS�	}�9�T@��h���&�ȇ�Id�&�CqM�|�h�1��&?M*�����$��BQ4٘�4�r���|܆&�ai���"#� z~K��9��V�1		iW\�|
�A
+	��t1.!U��ϴLD{
+F�oVBz	F��@mDE���
Ȍ��3�
�:�t0���c���WŒ��b�*����ϯ�1���E4|q������O�g�Rq�6�5N�0���z�
)U����1f4#)��0C�DܚR��Y噆��<	 =�t�W��vЁ�|B��G:X��n^����
�%0�ĴD{F�oVuj��h����λ42�����O:�l��pk4��[�ܪ�g\
+���
++*ne�ȵ1�ɵ�0G���
��Òz5
=A� z~�=�ݮ���
�Fw==3��|*������vPdv=
�~z2�=��7K�@��(�OA�"b+���Z��)bՊ	�+8�X[>r�ژ!��źhZ��Ғ���J2a�:e�C�1���VK@���3zҷ
�&}>n3��a�*	;EQ���)�������q�-u�'$Zx���P0��kj-sF۩i��������K)u>ъ���lH�N�PS�;�f�4M������^�*�`|Cg�C�ٱ�4Ό��Y��S�D�3��1%�W�CՎJq�x�#d�.������jf���b��A�����팎�Ũ#�iku
~|�C{��n�C���b �
�(�
��.V��P��0�+�9�_
�G�U���<�J}M�`%�
�	�Y
�3偈[��$l�<�a'�@��
�W
Kgm>'ъ�$a� �S���x1�jjf�=��7[!`a)
�g6ъ����a�u�#Q!�
-O�m�
+�&��j��l��P�>�R(nj���ƌ����
��6T�K.�������F-�(��(�-G#�D�Y at 6�f$Z`�BI)M�'F��j��L�I��`���W�:�|
+�[q��id��ss�Pl���@c���|�mW ��H���跶'���� v����V-��v�d�h�((���B�P��] �~cۅx����#HC.�� �acF׃��\=��m�A;,]��S�A
D�/��V
�^���F�"�H�a0 at o��0Z
4��(��|D{
+F�o��@
"�
7��.�KT��u�'	¶�L%�fグϏ�ޡt�9e^~��&�sj�0��
�v�a "n� I���0
;aqH ��E��z�Z�>���
ލ�V��1&p�	T>+ъ %ˋC;}1�8�5����4�����i,�!��hE��=�&�M���K�$l��Ac�J�`�$a`�s�,�U
+'�#�E��=
��4�#��'�����Eq���O������P͝�{���|�aP��fъ ��cA萂��V:���P�b�-On1R��!�`

Z��8���
���LyImb��pà�]�6ۥ��J�� ��^'�<6����N�M�b�;>^���Rq�����j�x\a�]�Ɗ.yO�r/�)x��㊷��C�q3%�6't��dR���	4���/�8gN�MB4�C�
1��f~�)
+�CR^L�@4��w�ҏP�ҥ`De��5��x�
� �N�˙�b|#�35�9���}�������v��p�q3�����Fy
+���.
�*ɵkg�mG����
�x����M���K<����q\=b�^�5���l��������w�)pD���
+��FmmN�K��##<�Y"<`�4.<\P�Y
+���~���(	5�w��ي�̉����LK��IC�x�+,Fw�O���YX|��i�(D����Q��7�<s��I������>l�:��֋ݮz��y�"��xPg��?L�3�]<Wޔ�h�N�����!U��H#Q4�X*�b�0�w�P=��Q��S6���"�!@D�[x 4��9��ZFXɄm��a1�H5�v��3D�Z�$a���ӝ�AS�S�^{�Jذ����0�TD+�����C�����MMD�'t������'R�XQ `qcu;�}q3yL� �)'g���@��N�70�t���D+�r����	�����L�8x;��ݔ��8��Z��;,�>r�1K�V�?nS�?�q��Bg$(Sk�)i62s��'����W9���v�Ŏ��7B+r=6�V2<}SʤȆ��2�ٻ�;e���yx;�.�
|�;�i
��;0�M"v��Cb�?/k�3�
;E����v�
+=H�˫
�{[���vZsj'�Q;�K���MCg�,J{
+D�/��+6�~�Z�\��'���Yp%�i�V�R
`-J�cH��@�F��9��$��_Z�x�Ϗ5D
++
+@P��
�'�ӻ�Ś�SS�	$}����bU��ϯ
����k�yf�%�C�� x�T�/�����+s�����2LMH�'���N�F�|6�`"_�>�Z
�|X(����.p${c��g8>��{ҳ�ˇ���#5�!~,8���3����o07� ��m���m����w�b�<g��
���<,V�kl�{tU쟪/@����aV�m�PW� /8(PB�Y����y���m��0k�����V�{~���������>|`���Y��ly|�ۭ^����)����,��$��x��c���n�U���}<��%q���1 ��š�endstream
+endobj
+2640 0 obj <<
+/Type /Page
+/Contents 2641 0 R
+/Resources 2639 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2429 0 R
+/Annots [ 2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2652 0 R 2653 0 R 2654 0 R 2655 0 R 2656 0 R 2657 0 R 2658 0 R 2660 0 R 2661 0 R 2662 0 R 2663 0 R 2665 0 R 2666 0 R 2667 0 R 2668 0 R 2669 0 R 2671 0 R 2672 0 R 2673 0 R 2674 0 R 2675 0 R 2676 0 R 2677 0 R 2678 0 R 2679 0 R 2680 0 R 2681 0 R 2682 0 R 2683 0 R 2684 0 R 2685 0 R 2686 0 R 2687 0 R 2688 0 R ]
+>> endobj
+2643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 719.9123 247.2458 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_35f19d0e7190c5a18aebc9ced95d554e) >>
+>> endobj
+2644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 719.9123 359.0355 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+2645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 685.4166 193.5774 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_668cbd7cea86f47c4e2b303468083712) >>
+>> endobj
+2646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 685.4166 232.5806 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 672.4148 248.8445 682.3201]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+2648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 639.5885 193.5774 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_93728c0f0afcd949c391940be93455a8) >>
+>> endobj
+2649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 639.5885 277.6909 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+2650 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 626.5867 252.6774 636.4919]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+2651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 593.3867 223.4647 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_86dd59c40a3c9867c2979ff24ba342c2) >>
+>> endobj
+2652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 593.3867 295.9622 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2653 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 558.5175 285.6507 569.4214]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4882da0200ef4201f3adb0f6d7731526) >>
+>> endobj
+2654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.9879 558.5175 358.1482 569.4214]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2655 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 523.6482 211.3007 534.5522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a20b890bd40d3e19f5798e4a0fa8766b) >>
+>> endobj
+2656 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [238.6379 523.6482 283.7982 534.5522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2657 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 488.779 273.4868 499.6829]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_021a24b47cf2b3da92a78084ed0a4d34) >>
+>> endobj
+2658 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [300.8239 488.779 345.9843 499.6829]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 453.9098 229.5525 464.8137]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0442c5079b3de8dcac61c224ee7a2e6f) >>
+>> endobj
+2661 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 453.9098 302.05 464.8137]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2662 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 417.048 248.4211 427.9519]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5e2d5b240cb26e67582d23aae4e5b25f) >>
+>> endobj
+2663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.7583 417.048 320.9187 427.9519]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 371.2198 266.6729 382.1238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4b7615a8ec5120dc083f368ecfe2d1da) >>
+>> endobj
+2666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0101 371.2198 339.1704 382.1238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 334.3581 235.9281 345.262]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b58b6cc872ba1f433070c2b4d004331c) >>
+>> endobj
+2668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.2653 334.3581 308.4256 345.262]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2669 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 321.7299 275.4757 331.6351]
+/Subtype /Link
+/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >>
+>> endobj
+2671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 299.4888 217.1088 310.3928]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_894e92407922be006a76577cf47b8589) >>
+>> endobj
+2672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 299.4888 289.6063 310.3928]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 262.6271 271.1256 273.531]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_84a9c57aa31433a277d9be6b0077065a) >>
+>> endobj
+2674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.4628 262.6271 343.6231 273.531]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.8625 249.9989 326.2592 259.9041]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+2676 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 216.7989 201.7419 227.7029]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4e04c3a6c835332c31dfbb928b31144e) >>
+>> endobj
+2677 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 216.7989 243.6294 227.7029]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2678 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 216.7989 371.3288 227.7029]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.5617 192.2155 267.7587 202.1208]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+2680 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 159.0156 212.7678 169.9195]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_07cc48290e435dfb739fb565ff1aa3fa) >>
+>> endobj
+2681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 159.0156 252.9591 169.9195]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 159.0156 375.1455 169.9195]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2683 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.6566 134.4322 275.7477 144.3375]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+2684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 101.2323 250.0993 112.1362]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e0ba85e8cab7e4e95ec001bde5bdd99d) >>
+>> endobj
+2685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 101.2323 289.4458 112.1362]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2686 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 101.2323 379.5123 112.1362]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 101.2323 513.9963 112.1362]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2642 0 obj <<
+/D [2640 0 R /XYZ 90 757.9346 null]
+>> endobj
+2659 0 obj <<
+/D [2640 0 R /XYZ 90 471.0106 null]
+>> endobj
+2664 0 obj <<
+/D [2640 0 R /XYZ 90 388.3206 null]
+>> endobj
+2670 0 obj <<
+/D [2640 0 R /XYZ 90 316.5896 null]
+>> endobj
+2639 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2702 0 obj <<
+/Length 4952      
+/Filter /FlateDecode
+>>
+stream
+x��]ms㸑�>�B�&rU����T���^r�\R�ٙ܇˦\���N�
I^��ק�$ � �H�nMR��ң�f����	BtA�ta�BK][.����
Y|����
�?���*���w�Wrak��Z|��JP�����ǻ�-)��UE	!�o�(Y����o�Y�6/���~u����~�y����~��~��\�������@,����p0����D�)���G|
bkʥ��)��f�:
�*&	H�l�<<nVǦ{��S���f�lo�-m�\Z�2���wX�O�Ew�����Nw��?�!5�F.��RSk���`���y���_����
c��-���^��(����Z	c����L�
��()��j�0�"%Z	�l�a�;
֟��,͗�]�{B�/r[3M� ~O�@ Q+�u�9ޯ
&� ��K�AM�u�������׿��4f��5!�^ڐ���S���z�

�ۣwH��}3
.Y-������G��=�p�
�0L�\�q�	#.�m��V��n;�MV+k���A�xTj�x�Ț
+=������yW������\d�T�.xm�m�č&	��Zqi�1
V_QM��:0W�H&jK�VSӂ��{�'�
S�j���� ���(7u��8u���x�V^d�l�Y�&5��y�lw��
+‰.w��P0�QxV`*�/��.��n�ǜ�L���}G���W�\j�y��V����>;vs^D�Ծsxy��m�א)ww�]����Ȭ��A�cΠ}������?��� RF!*]hB1�ԏO�
�H�n�W3Ⱦ�9�
-���%0�$��*YXV�������19fy�7��u��^�jbi�������՘
�9V=��<�dD"���l��j�������}V��4�9ɒL�ZK(
Y�xT�"� �<X�=��v�=
�B��L4�1
_2#��f�i�mV���A^j���YL�ͻ
+&pi!m�A����~��5�P7�z��K&$rф��$r����
-�� �:��
+&i ]��%Ȣ\��h`��M-4a�	�ë���5+*d:.�И�
q��
�@9�F�F���`���t��Jh9���PF�}zX�>9�-ϊ^��	AC��Z�ߚ`���^ܐ�}�ڈ}���
c����
\�|v�� %RS�y2t�z/�𹐪<*5(���%�Vdd�1�	3�
+Y����Y��ԃHI�'5�c�	l�1�1�u+p7�
b]�n@`�N��C�� �jbfw6�#@�4��"rJ`B� �c%"�9�� �&�����\ 0G��z]M�N9	9������%#�Y"�j���
�03y�xT�(�� 6�r�^
����/Z0���������&M���4!����B�#�!qa-�2�r
t:�y��K�$r�p9����� �
�*� (&
+90�s9��8�@t�ł3�%
_�'�йꔂ�ރ,�VʎmMs=�I͕�r��CMp=��B�ȴ�dP���\���r�͑6��L�ͮ��v�l����j}<�ߺ�z�-Ѯ
�pߵ���~u�mp�"��sJ���Y�2���w4���hR"/�H4�ۨ�	Z�*<ll��Ʀl������j�,ь���ƙ��p��
�o:�8|a�R�#}MU �7����V�Q�Er)a�3
[t��&�1����0ž���6�`�B�js���Y�2G��^5�̞��T:ύ�=A�:&��
�!�k��}WS�8ֵ�_�
K�6��?N�=�H�C�2\�ۓ�H�tW�քb,F�3]�
_2"���dX�ܖ<�Q���v�p@&���B&z�k<�dE"w^_S��ɻ£
+Fp��r� JF;��E`
3���R�sذֵ5���Q%
�0KEl�c�=��5'D��s��	1�(�1�_@	�1�Z|~a|.�r�<Y{�[
��
�*��A���Ŗ����Tp=
ed詇
�)����0q>�"����)�/l��l���)~
+kk3�,?m��J��SV��(�
�ʣR�~*9��Т���@ᤢ3��@
��V3��L)$xWt��w-��'�~�QD`��H��ϻ�)������2>
+k���s�2�
�_^�c|���}lˬ����n�%#�h���i{7�
6�q7��]�Qk���N���Ѿ',�� ���/Z0�[�{2
����zPI�xs7
�S׳��3�j�l�x|��T�,&#p����L@�)��d�������7�
߲��S+�`Y"���PI`M
.*�BCX��a����d�Pa��2�ϡ���
��nr:E7�
C�����C�	Z�<���;����^ڐ�gr:�`G�3�1#<S�"Pr=��L��aJ�ը�f@:9ɓN���U6�*J�t���0\u�����x��
+�8wAs=�ۄrhܢa|��@�(A�%��Nb�
۫�����dOs���\˰��=ab�<[�l> 
-e1�ڣ�W�``B�~�]X�{
���Դ�>�
��&��

�� �S��b珞Y�2��;�ƺ�(�Q-i
��4qPy4�����B���x��y{(0��
z{�
����
+��Pu�������I�>٥ŝ4��(qu��A�����1F�q�Գ]��E
�r���XXn�B`xT� 
+~C���;`&�;�i-�\�x|��T�L��AÂ%��*�[մ�������4{�{N�`Y"���] �!L�}a��a?;�$�S ����@F��;X�AV��
���O;o_�"��wdA�x����}��u���ɂA�>Y��E���x
�Չp:�8|a�R��Gk�fEak��cU>�*�J͋�2��Z�,D�Я��a��
���
PA/�
+e�]�W�
Y�g3y	AJ�
&�>A%��'�XM5_�M�H=�\:y~��4�7���9NQc-�a&qè� �w"�P��?�&�,����i����>�'�B�%J߁ʄ�
����FG�O
+sT�Xi#�Y"ߢ��2ی�~h�!>
��U[��{ļ�����{LV?��W"�?��x�%|�<:o�@&>0o� cq��.�a�Z��<������K��pc�!
~�	edH���=JI�{�F��܂֊�;6�N������
Ԧ��v���t\o?�v�%[��.-x&��4�p���R�n�T��I��6�燱�za��@�D�o��s�lGG���T��Fh���M�;7���)������ ����^��0i++��P`�0���!R[,���`D"�����n����]m�o7���~�TH�NۼK<�`
��E�H�$	��ZsV�
d�r�������N+�T�8���g;d�
X�gf�`�
bϙ�P�
ե�xi�3���30���y�n�j�30R=g�H䶧�|�U߀9�W0���ǩI�py�+
U0�I<�g��s�����
]�` 3G�8Ck��_�G4�b
+u�}�Rҵ���8M_Yx�D��Y=M��#+A����ׅԆ+P��Y�-��Km����{sha�U�\7U��LU��~��
1|�D�F��5��B�1_I$�t�|�����ӊ���b�
+fJԘ^
��.(Q�ڣ;S��3� ��[¨���H���Q.G
_
��ꡟq86{�Տȕx;�oC��H^���A�Ř����.��4C
-V�
_�_��C�_PMm̈́�Ӓjڣ
+�O�60(�x	L.�g���Kf$r�E�+
B�w�Gt#�$��X�/�R�S�U���o����7�ñ� S�+9�*�Ѡ���L��C���a_OU��7�*�]���ª�ՠ*��rd�WW���0�-��
�
n����`�
�U�^W�C�Ņc�z�±`D"�M�����!��y}�la6fV��X�w�G,ik�!j0
�KFUSj�\�x|ɌDni����
<��׋Z�AH��
G��쬅c(#W�
�+*Q��攨��R���Z��:�h��Je���	P�5���E�>6%.5>fFIb(IT�~��B^E�
E+��@`�$�����ͭ��f�:��j�%#��֗�����]��i�:
W�}��ǣ
+�q��%��T��5����!�/�����(�CЂzPI3DkVajbg$�5Ń�gz��
��r[ڎ&�W��������<
���j��h���7W�e0�T_�o3
+��ޱ�`�ݝ6pF�ed
+���ax���r��<��9�
�	��(g]
Z>�Zt�L�9�/؝ʝS5	1�y֯�GL��8�
�p�9�On^�g�6�]�f�i�z���v�޷�<�����۱�h�X��`��x�p~z�kutۊ
D18}|���φ�8`�%x.��w��
��y���ʩ'�(`a�%~��֒Z^,��L���Ϸĥ���t���K~(0S�
z]
�W����Ђ�\�pݮ��
n�~�,DdK<<!��*���⑘\�wn7���Ǘ�H�f�<���1ϻ��
+�9��s
:�]�|F9�K��z at 6���A-��<��A. ��юG���Y��9!�SX����}����
mumN��
�&��C�I
蕏m귰^�*.�ձ���

+���
���S:"2h�x
e3M
�
�\����,
���٬�.5B�.����{U
�
+a#�
4ZR�w
�V������U��+�
�^�^��`q�^9X�^s�*��իPm�@	m�:{ I�/��
��?�F!�~����a���F
Fer�
+�7�f���
F$R��Ka{����{TI5>�3 ��ק�O�A
�SI��3=��{R��֧�X���0e<�d�����)�w�25���7�3
X�N+y�N�%��r��F�g�Tw���~[��y�4�Q�]�Vs��n�3���:�Z�����U���ռ�����?�zh����r�/n���>���8�~@Q�����gd
�
���
+r3Y~hF���0"��^�>�߅{�_�m��
U��upɉ\��������w�����~ڮ�����һ��[(�x>Bf�*Jl�������3x[p��:�a��c���6��c
�S�	�
endstream
+endobj
+2701 0 obj <<
+/Type /Page
+/Contents 2702 0 R
+/Resources 2700 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2759 0 R
+/Annots [ 2704 0 R 2705 0 R 2706 0 R 2707 0 R 2708 0 R 2709 0 R 2710 0 R 2711 0 R 2712 0 R 2713 0 R 2714 0 R 2715 0 R 2716 0 R 2717 0 R 2718 0 R 2719 0 R 2720 0 R 2721 0 R 2722 0 R 2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R 2728 0 R 2729 0 R 2730 0 R 2731 0 R 2732 0 R 2733 0 R 2734 0 R 2735 0 R 2737 0 R 2738 0 R 2739 0 R 2740 0 R 2741 0 R 2742 0 R 2743 0 R 2744 0 R 2745 0 R 2746 0 R 2747 0 R 2748 0 R 2749 0 R 2750 0 R 2751 0 R 2752 0 R 2753 0 R 2754 0 R 2755 0 R 2756 0 R 2757 0 R 2758 0 R ]
+>> endobj
+2704 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.4301 719.0265 403.6961 731.1915]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2705 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 687.2722 250.7476 698.1762]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0acf1147e3f81830606dec4cc8faddd4) >>
+>> endobj
+2706 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 687.2722 357.3173 698.1762]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2707 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 687.2722 456.1447 698.1762]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2708 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 675.3171 202.3443 686.221]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2709 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [356.4617 662.9255 409.1851 673.8816]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2710 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 629.9623 266.586 640.8663]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_988ff507806fa8126649f463ef6a1f31) >>
+>> endobj
+2711 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 629.9623 309.697 640.8663]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2712 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 629.9623 408.2337 640.8663]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2713 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 629.9623 513.9963 640.8663]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2714 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 618.0071 171.3608 628.9111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [362.1406 604.4066 414.3239 616.5717]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.0173 572.6524 265.396 583.5563]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_79acafbe4f67eb7e2710287bcd60db96) >>
+>> endobj
+2717 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.5684 572.6524 375.818 583.5563]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2392 572.6524 478.9794 583.5563]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+2719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 560.6972 225.8659 571.6012]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2720 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [362.0115 548.3057 414.1831 559.2617]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+2721 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 515.3425 239.9836 526.2464]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cda762f8c081fed2862260211618fce0) >>
+>> endobj
+2722 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 515.3425 280.8203 526.2464]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2723 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 515.3425 405.1043 526.2464]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2724 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 515.3425 513.9963 526.2464]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2725 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 503.3873 171.3608 514.2912]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 489.7868 432.0923 502.9448]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+2727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 456.8297 251.209 467.7336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_178a6a88143f44b43939d36024af6162) >>
+>> endobj
+2728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 456.8297 290.549 467.7336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 456.8297 409.9686 467.7336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 456.8297 513.9963 467.7336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2731 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 444.8745 171.3608 455.7785]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+2732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 431.274 456.9923 444.432]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+2733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 398.3169 224.5705 409.2208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5a66e6f883c7310ddbc312f78bb0970f) >>
+>> endobj
+2734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 398.3169 297.068 409.2208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2735 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 385.9254 347.8694 395.8307]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+2737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 363.9211 255.5641 374.825]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d80989353ea3738abdb6b605d27cc8fa) >>
+>> endobj
+2738 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 328.0061 257.6366 338.91]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_9507085c5b0efd13c80f08a22b0f5529) >>
+>> endobj
+2739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.9737 328.0061 330.1341 338.91]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 315.6146 378.4537 325.5198]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+2741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.7057 281.6551 260.2426 292.559]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_24d2b69146ab1b2216e437468a818cea) >>
+>> endobj
+2742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.7917 281.6551 337.952 292.559]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 257.3084 378.4537 267.2136]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+2744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 235.304 257.7862 246.208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1a02b17cbccf348192f3e7f776b3b3fd) >>
+>> endobj
+2745 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.1234 235.304 330.2837 246.208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 222.9125 375.7729 232.8178]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+2747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.6985 200.9082 308.9421 211.8121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_eda87d46bc3b54b420a475934e0e1cb6) >>
+>> endobj
+2748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.4769 200.9082 386.6373 211.8121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.1692 200.9082 513.9963 211.8121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.4892 176.5615 302.7196 186.4668]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+2751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 143.5983 245.9108 154.5022]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_df3cfc56df68bc8063e6e9eb3d0ad3f1) >>
+>> endobj
+2752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.248 143.5983 318.4083 154.5022]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [488.0906 131.2068 513.9963 141.112]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+2754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.268 120.2478 189.266 130.1531]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+2755 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.5761 98.2435 292.3278 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_2af430cd70ac416ca0907312b65812e6) >>
+>> endobj
+2756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.6177 98.2435 367.7781 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2757 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.6619 98.2435 491.489 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2703 0 obj <<
+/D [2701 0 R /XYZ 90 757.9346 null]
+>> endobj
+2736 0 obj <<
+/D [2701 0 R /XYZ 90 380.7852 null]
+>> endobj
+2700 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R /F52 345 0 R /F25 348 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2774 0 obj <<
+/Length 3862      
+/Filter /FlateDecode
+>>
+stream
+x��\m�����Ÿ�^����%h
4I�6m�k��/i`hm��rm�m��w(�4%J�RߦApY�~<3�<3|��
�df�L	�
�r�����x��7��x�/B���o�~%�� #����%H�%t�~���Doc<wK�8��[�����\���7������g���{,���~�!�Xb8RF30�J�]�h&Qfx�x? � „lȊ�b[�N�
*0H3t^���\6�|[>��[���~o)���+��O��Z
+&�u�n�����ׯo0bF��3���Cg�N�{��������|PahX�!�Ia�#-��(�Z����
���E�Rp?���4�H��E
|$9�y�u�_w��-�����2??��B̏�L������|P=\ =�Q��$��B3���Z̷��
��;�[�J.J�?�a4ż8T0ƛj߷�ac�Q����Ce�a�"ɤ�Z��v��s�����K�b{��w��CU{s��pN�Nes�����>6����f�F�
+�Q$1sɰ:5���
�Zd �!:02B�{~,�M͸6/N`��_�rݼa��Q�msQ���8T�u�B�ITLB�FR3�� �
��[P�Ŝ7C7A��$DB�a%�d��&�p%~�0�"6�v����3��bt������C H)ճT�;�b��Z�EX��a��DؐP�ǚ�7�H)�P �P�h^ztZ}O���e�ϛu��_o>�c� �„���c�Դ`��x

\gR�Vr�n��y����dZ�:�� k�������V�
+�B�o^n����I˧��{�n2��ER0�ĩ�Q���
s>�
�S�h�Iek��ה�PF�ly�5�ut�Lt����i��џ��Rj�0,�-��ZP����(�@�g���G�ϸ*��f��eed��Hs�
ƅ�
���.����<?��~p� �('�z���z�l
+�N�ˀ����2^n��Hh�����U)�r���%'�*:i���j󅧣zJ�IɵV�J�
'i?xT�
+%��� q
+� ��z��sfDrSe�j0Z�L(xTN��
��tt��b$&#6��3Ԕ��Q #U�
�vW�ښP�i����r+�k�{/	��t!
��g@��Y�!0�!@��q�<�S<���x&T��J�N�L��ɵVl7�͹\/� �v�3P?�
#͐V�mK9ǣ2vQ-�լ;(c�� ^� l�{<>cF,7�C!�.����n���.�]�1�a59R<>cN,�^��g�vF��{9��]d��P�����4p�=��N�G��
k�u2E�KQS����Q�� S�)�Z�UAI�5T
�HP��
/wQ�ڞ
.|OK��歺�o1�d��h޻�ĊW�Ϙ
����dS�(���£r�54�v����Y�
����o��E%�q5n�׸�e��e�
Y����H�Z�(!D\feE;^ni�	t�m����`�v�
2_�g�/�(������܊	�
�4�%�5lD�1�b�϶����]x���o��}yl����~eC�M����7E;�T���Ko<���J�)�
����� ��\��V�ݡXE�{1�r$��{�"��D��a�)�׷H�m��Q���uUO��e����s��zy��_�݀��01_�X����K�ţ2�zK�7�EZ�ܤ�j9�#
��ߗk-�~X�_�z#��$���X�$F��^@��:=�U9��*�V/�ק��R���`K�s~�r_���M�_B�e�}K�u�z�Qm�O?�� Ưz���:���ECQP�W_$��]S�a&�2S(0�L�-3u�f���z3e���&��p��
u#�&�2$s�/���h��P���&�������ZЗ;��
��
<*cA�3I��Z��&�"��k�)���&���)b�B���Uق��9 ���Ύ�R��1�&��Q�^K�
�8ɲW�ʓ�E\���J
u:���B\I
�R���~U��=�����I'xP��1�FѮ�G׶E���b�<<cC_jraxM`N�7�@�F!cx7�޼��S$��j4��b(��o�F3a��7���3�
��f����0O��r��8��~x1���b����t�ŏv�����ƭr��'k{D��T��۷B��>(������A=,_%��2����D�6_(:��T���\kű�U����+�n7�o��`"��ʘD�4%�<���ڡ�%��i�����\k�wuL�Mq�-O˻2�*a
+h6#���1��������\-��ew����5�������Tuq0k귵�n�|p}�t(W�p)�g�����b�٫S���~nk�ò�
+LPGFoK

�Y�語@
#"�����X
�
��&�
��Xf77��[�a�%�b�M���g-�˝2K�Κ�

(���g#���	
�	�e
����k�WΙC	��A��T���4�T�����#u�
��|�8Jz,>�=�Csw
=�����tP��f-�h�"�KL�� He'��糋���Ja����
�,�yv\�
e*�S�8
@�i��@{�N��4�j{��]�yx<o���m 
�16F���"
O��a��n|��I]ҥ;�7���/�H����␧\H>KP
{���`26P�̰T׆K�6����7�x��"�s���(���"k��8�Y��<�b�Tִ>�U;3���mI��kLX	c�;?o��ی���<4����dE�܋D&���XxTƐXZ�
	�9&���
D
�m�zX� �)�L�u��sMG��IɵV4��v�G91���G��.�5�H��C1��	\6�-:��+3�Ɲ����{oA9��]j"T�ao9��6~^@"������X˝��*
��iWxT�h
q$қAv�~�Fu(#QM<�>��4���
�	��b���	��æ
�@A�Yw��@	j��C�����AE��A��[��$����j�8���M�=M�r
��e	<� �ޖ�;j��U=��3FDr��v������Ft�
�1�>s@����wo�M����̈�N\ⳋ�
�IgxT�
+�AD���"�
�r
�!0���=��9["����)G*L����e�s��A�Q��–�t����ŊPF��
����-�ž :M���1 [l�����?�� �2��
+��F"��
#����:���*�2<��5���w���<>�o�������^j$�-�0����p��E�h���yפF�������{j����4��1=��u��s6Dr�]
�a�E�
q��
�q��b.�/Yd������L��#�
���	���ڲV7T��
RV�H��>���̉Y��5�sp(��>{�`,h)�epk�4�O�}���i���.�>���;l�*�nu�ގ�r�n��\��[g��)􂘌'���˹�%���;�J�^�ܡ�S�t�U��lH��L�����/��U��\��{Ym�����ѩ~�h`�F��!"� ��U�ܳ*�J��q�L��H%R�
+�(��
��5�PlO��
���P���7�"|������U��]�N[�@��|̈́ne�M�:�Ɍ�!��y�<$vZ�riآ�Yx�J¤R�����)Ꟑ�ICz2G��������h��u&��q��=��%Tw4r��1�xd#~j�2R��`���k�l<��8yvqZ���"��m���3)�U�:Vg/̏	�ƀx��m�.
�DO��k��-�]�!�s��ּl�y��Sy��}�����?�}y�!��� S��XR�<��`�����V#��^j>�q���]x������QTpˑ\{���᳷o����ꄞ���m�o��ۡg�
U�kW��҂"[:���pK�uǖ�ﴫ���m›���c����S�
���endstream
+endobj
+2773 0 obj <<
+/Type /Page
+/Contents 2774 0 R
+/Resources 2772 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2759 0 R
+/Annots [ 2776 0 R 2777 0 R 2778 0 R 2779 0 R 2781 0 R 2782 0 R 2783 0 R 2784 0 R 2785 0 R 2786 0 R 2787 0 R 2788 0 R 2789 0 R 2790 0 R 2791 0 R 2792 0 R 2793 0 R 2794 0 R 2795 0 R 2796 0 R 2797 0 R 2798 0 R 2799 0 R 2800 0 R 2801 0 R 2802 0 R 2803 0 R 2804 0 R 2805 0 R 2808 0 R 2809 0 R 2811 0 R 2813 0 R 2814 0 R ]
+>> endobj
+2776 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.6217 720.2355 310.5328 730.1407]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+2777 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 687.1868 236.1973 698.0908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5d71f71f50ba04fe5f810acf0cf1e294) >>
+>> endobj
+2778 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.5345 687.1868 308.6949 698.0908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2779 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 674.7099 357.8403 684.6152]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+2781 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 652.6202 214.0604 663.5241]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_00b832cc0784b7b30f4d4a2f738a3032) >>
+>> endobj
+2782 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3976 652.6202 286.5579 663.5241]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2783 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2208 616.3636 284.8756 627.2676]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ccbd8986577794cea90edef63e859ab1) >>
+>> endobj
+2784 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.4551 616.3636 357.6154 627.2676]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2785 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.0949 616.3636 476.9219 627.2676]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+2786 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.9021 591.9316 286.1999 601.8368]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+2787 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 521.3961 289.8656 532.3001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_9c0703b2311336754e28a7f739b7e685) >>
+>> endobj
+2788 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 521.3961 359.3244 532.3001]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2789 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 486.8295 290.9713 497.7334]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_fa8a10ff4b09f8a87e3c558a39f5888e) >>
+>> endobj
+2790 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 486.8295 360.4301 497.7334]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2791 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 452.2629 224.0028 463.1668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b0a670aeef72d808d620bbc33a5e8cd7) >>
+>> endobj
+2792 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 452.2629 296.5004 463.1668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2793 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 439.786 272.4902 449.6912]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+2794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 417.6962 254.1498 428.6001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_f8cd5fb701a14bc509872aeb3617b0b4) >>
+>> endobj
+2795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 417.6962 338.2632 428.6001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+2796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 383.1296 284.5854 394.0335]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b054f67fb31ea4e860dd7c24c0b56676) >>
+>> endobj
+2797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 383.1296 354.0443 394.0335]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 336.6078 241.7263 347.5117]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c65231748a66ac5c074502cc8e652e10) >>
+>> endobj
+2799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.6171 324.1309 407.6577 334.0361]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+2800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 302.0411 249.3181 312.9451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0badc932380dcb7f72ea50ca922d9d4b) >>
+>> endobj
+2801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 302.0411 288.3213 312.9451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 302.0411 371.5186 312.9451]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 267.4745 240.6204 278.3784]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_bb521f4ff8e2e40318bd06b0ff4d7617) >>
+>> endobj
+2804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 267.4745 324.7339 278.3784]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+2805 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 267.4745 425.7242 278.3784]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+2808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 189.1433 203.0748 200.0472]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+2809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 189.1433 296.3242 200.0472]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) >>
+>> endobj
+2811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 150.5916 287.8558 161.4955]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e748c3f5082b158453fbb3ccf57c8f70) >>
+>> endobj
+2813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 112.0399 294.4813 122.9438]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8c89ddcd2fc4311af0e358477630d7d9) >>
+>> endobj
+2814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2775 0 obj <<
+/D [2773 0 R /XYZ 90 757.9346 null]
+>> endobj
+2780 0 obj <<
+/D [2773 0 R /XYZ 90 669.5697 null]
+>> endobj
+2806 0 obj <<
+/D [2773 0 R /XYZ 90 207.9658 null]
+>> endobj
+2807 0 obj <<
+/D [2773 0 R /XYZ 90 207.9658 null]
+>> endobj
+2810 0 obj <<
+/D [2773 0 R /XYZ 90 169.5336 null]
+>> endobj
+2812 0 obj <<
+/D [2773 0 R /XYZ 90 130.9819 null]
+>> endobj
+2772 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F52 345 0 R /F25 348 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2827 0 obj <<
+/Length 3054      
+/Filter /FlateDecode
+>>
+stream
+x���s۸���W�/9y���D&ׇ4��\��4q��n<��$�ӯJt��]�$$ �uN���!���]}	�~��H&����%Ҍ����
O���;#��3x}�<�<�x)�D#-��\�;z�	J��r�ӔD�gc<}uN�t�_ϯ^�S<ݮn?��������|����Wo>�w��/��_�$�qK4GJ
�0^��&^d�e�7�N4"L���/I]����i:-׻ռ*�g^����9)����R�������w�V�FO�$1r���_�d�~�Ӆ�|�?0"Z����S���:{s�/�~�x��i�����
������,C	c�8�||8�@�zJ�Y�;?&�ϔ�~,��(
+�D#Z�T\‘�R�q�n�� .�\�⚗����n�}*����`�+��j���� ���L&�k��^P�g=ݱ���͡���@�b,Wk�H#�k�p�l/
Is�H�X�0�w}�ޜZ�[��ZQ �T�׊��'��\ׅA���1�rŶ�	�C�1��H`�Xo�*!v���}
˚��D!"�Dq!�
�P"�.��K�r�M���>�o]qHRKx�dC5�Ѝ�P&��eu��
���
{���S�o��9��$֍��]���E�`�Y�֏�0W���4G𯐤�Uи
�����]��&��ϙ�6����<8��ͣ�/ޠѓ�8�Z���$֞#B�d�MI�!�n��6e͒m�uiS��m���
��ӧ�C�/��Z�'a���q��1޵Z�TB�_�k
\����v�<{�t*�)
��Z%ң�=�L[��*�D�l�}"��o�3
צ�	������)�����%����_�G���f&��T���)�;��bz\����x
f���e��o��
L�6a6MUy����۶kx�C	���n����l��W��
�'����fۼ�.�oA���wm,4t� M!tt�G+�k���,YQ���:�:
+��zq�v�v�)� �(p6����\J$��?z�ݕ��.
2h�\�.��"� xW�� �͉���������Ě�e�O����v�y���*
61fS���M�(�+Ak��!�ݘp��.�o�Z����I��d6&�0 at T���>�u�7�
R��Z�V	�Co'�1Դ+Q<�׸>"�њ��7&�o���{�O�	ɥ~����ޕ�nښ����0�M�uS7��u�VPS�ҍ�`PU(�5ZB��t����H��f��	�)�Y��6�3���N��k2ؗ _�妜��C5�\�W��a�~�
[
8U~bA�i��PE��J��1�7
��p�s���
�������W�@����戩As�P\)��`��,��xm
)��m
��
O��T�������v��6;�ۡ�,L֒���1T[؞��!Fj�_۫���B$� ���= 2��f�~MDm��^���Z��}�o'G����:Wlk�;�%Q�:�t\lk�;����\
+X���

+�R�l�*�~�,���,���W/�a�QQ
+~Tik��[#]׏�X�c�ȁ]
N
4�p}Dњ
��v����C��j����~Ҵ�m���͇y�����O�ͭ��mY},�� �Q�#���x42�)�7�=.(l�){D��
é�IcV�y�Z�y�5����xOa�9���		�����Ҡ�@��m�ܥ�6jB�O��1l��M�^b�4M��A7�8
�	��`<���]i0��C��,Fh��⋥A(Q�b�O��1l��h��b���GhЍ=(�p
k=(�����A�T�+��O�
��Ӡ�q��֭QB����Sz)A�h�+��OH
�M��a6���Z��I�9�P���͚k;#�U�'�z�^Q�W�Q98�R�N�
+��؛�D��Ɛ�J
�u	�G9���i����?�W �GĔ��W �4q��q�t�"���rNjq��c�!*�� ʣ��=`(}�&���z�\��M')��(zi8�X%��
����0Nb�6S�+��Oe���Ix�p)�u�Va=��{��+��8��]qR!&�:��:�T*����0V�8�
�Ik���~�8�
�I/�)
3�q�C�Y�Ũ��p1.v��d���*w�Ÿʡ���bT�n��������"�
(R=��
1�k�"�g[�� ����K㷆8pĴ*
�0���[X�4�9c7w��ܸ_�ܐ�1�j��nG���
�<kv?���żx2�d���)G�y�
�wļ�
�Y
c��ŗ�y6��/Ӳ0�= �y�,
��,F1/�=�y^�S�f��M
�b�~s��Q���0.u��d���wSøġ��aT�nj���N
��'254��Hv���u,�����5��Y�rX���4
+�%�Y%]��
�;��^ܯ�+�p��ot)��H��Ǎ��=`�~M����g��fYݦy� �
_y���X%�
^��Og9\����<A�}2���\\$�*�2X�0�
.��Ep���3f���i�qV���>+�@	V�
D�|Vt��bk�NJ^�؏=Šn�S	f�ݍ�b�~�F�Q���`\���Ɍ3U�F�q�C��#����H0�
	z�#AR��5��ko
ƹ>"g͆1�>���dF�vc�Cm�1ДVJ�m�*x�3�4�P�of �`]�x�3�%D�ܯ��ƀh~m���?"!�͊J bk��C�]�С��8gl� R8&
�"�h�~f��ϧEG/�(:f
+ҡc*���;�cT�
�,�����DGg
ʸ�FG��:Z�,t�E� �0:z�Oi̘)v7f��
��3F��cƸԁ��3fJ܍��~�njQ��1c"~;f����nj�>cFs�q���9|����ik��ޛO���=��S�`1���96�o�
փn�X�
+�
���;d�X�ܯEh$�W�e;b~u���~=o�lo_Y���ò��߇r�͹Ӄ����|�}����U�?,�ͼRŻ}I���9�9��M��Bz'6��J���N�Gwjm{��9��E�r�r�׼�U�{zq���Gt}@7��n����n�����1�\(�~^�Sl��\<���ٹ2�)qry�~�w�moq����빹�M�
��0R�'�tendstream
+endobj
+2826 0 obj <<
+/Type /Page
+/Contents 2827 0 R
+/Resources 2825 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2759 0 R
+/Annots [ 2830 0 R 2831 0 R 2832 0 R 2833 0 R 2834 0 R 2836 0 R 2837 0 R 2838 0 R 2839 0 R 2840 0 R 2841 0 R 2842 0 R 2843 0 R 2844 0 R 2845 0 R 2846 0 R 2847 0 R 2848 0 R 2849 0 R 2850 0 R 2851 0 R 2852 0 R 2853 0 R 2854 0 R 2855 0 R 2856 0 R 2857 0 R 2858 0 R 2859 0 R 2860 0 R 2861 0 R 2862 0 R 2863 0 R 2864 0 R 2865 0 R 2866 0 R 2867 0 R 2868 0 R 2869 0 R ]
+>> endobj
+2830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 697.2473 180.5399 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c91aac77237c2405df039c4fcfa08ab0) >>
+>> endobj
+2831 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 697.2473 253.0374 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2832 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.3365 697.2473 366.4968 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2833 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 658.393 226.0342 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e9346ef05b6be7a0841810c22a2860da) >>
+>> endobj
+2834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 658.393 366.3363 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 538.3967 178.2386 549.3006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cdc537f0aa5117fe3749d3c50b7dc4fd) >>
+>> endobj
+2837 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 538.3967 250.7361 549.3006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [319.0352 538.3967 364.1955 549.3006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 487.5872 245.5216 498.4911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_f4b0f891a6911d7784216f537fa3e473) >>
+>> endobj
+2840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 487.5872 325.2287 498.4911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 475.632 159.0707 486.536]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.3698 475.632 272.5302 486.536]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.6603 475.632 376.2166 486.536]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+2844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 424.8226 245.5216 435.7265]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_221657648a7e456dba61589e37765cd4) >>
+>> endobj
+2845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 424.8226 325.2287 435.7265]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2846 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 412.8674 159.0707 423.7713]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.3389 412.8674 274.4992 423.7713]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.2233 412.8674 379.7796 423.7713]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+2849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 350.1028 243.6051 361.0067]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_47a21a1c8a88c306877d15d4dbc697b4) >>
+>> endobj
+2850 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 350.1028 323.607 361.0067]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2851 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 338.1476 159.0707 349.0515]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.3698 338.1476 272.5302 349.0515]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2853 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.6603 338.1476 376.2166 349.0515]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+2854 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 287.3381 243.6051 298.2421]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e5c66812ab981ee2d1ab96ce218a7782) >>
+>> endobj
+2855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 287.3381 323.607 298.2421]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2856 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 275.383 159.0707 286.2869]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.3389 275.383 274.4992 286.2869]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.2233 275.383 379.7796 286.2869]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+2859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 212.6183 242.189 223.5223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d0a9267e420144cacfb867076d00a803) >>
+>> endobj
+2860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 212.6183 322.4088 223.5223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2861 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 200.6632 159.0707 211.5671]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.3698 200.6632 272.5302 211.5671]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.6603 200.6632 376.2166 211.5671]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+2864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 149.8537 242.189 160.7576]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8d6c186583503c4394603550b50edf59) >>
+>> endobj
+2865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 149.8537 322.4088 160.7576]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+2866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 137.8985 159.0707 148.8025]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.3389 137.8985 274.4992 148.8025]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.2233 137.8985 379.7796 148.8025]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+2869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2828 0 obj <<
+/D [2826 0 R /XYZ 90 757.9346 null]
+>> endobj
+2829 0 obj <<
+/D [2826 0 R /XYZ 90 716.2211 null]
+>> endobj
+2835 0 obj <<
+/D [2826 0 R /XYZ 90 596.6043 null]
+>> endobj
+2825 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F37 1999 0 R /F100 2198 0 R /F40 354 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2881 0 obj <<
+/Length 3953      
+/Filter /FlateDecode
+>>
+stream
+x��[��
���?���Ǘ��>f����5M�k�4����Ub[�����/ �2)Ѳ��v:7s�� � �lA�[X�Ѕ&VH�X�n��
����+x��	>{��
U,,��������b��/�o��d�����.��etY���×��.���c�i���ڲ}y���?|�X
������/��2+��F�0��/
I"�Q
���}��%L���"��lˮ�]�7˗��-��{��jo�YV�5<�VK����o�
+��,�b���n��/�؀^�pC���X<�
%�Z���H.���櫛�|܋���Y��JHb|y�n\�
+9ح�������@�*���b<'F�+^�E�p"q���Ҕ�r�$�*��=]�6:��k"�Q�#$,)
��
_վ�U��S�B#�I�"��J3b�fň-
+����N\o&��Z��@���W탧�[��@��?�Xh�G�=���0Ea����(�V
+T�d+��JdM
:���R��g�/�`�G !��!e>��C�k��W�@5
XT��R��
��L���5�=�O>��LN[�
����
���F�+
�b��&-y����a�^l�,��"��UD55̈́�Y�\L
�Z�ň��O^`m�i�Ԅ)�PF�XnjLAn�Wv�\�I`���%
�*%��pK(d�AP��C���m�C��̧�O$'��4���ݻ��E�si�d&L�����{�i��xd�����B� �c�ϫcYo��
��Wݺ�Ǻ��	��iY&ۤ�[�&���
���s�&aXP���W���	�|~2��ԏ���D) ��������&dS���b	��'|���I��Dq)�X
�D�A�8٬17s�υVfF&43W�8��ꗶ��n��s�Fwߴ~�a"U?��)����ö:�U�e��ͽ{W�����c�Gx�m�߸7@��iX
և*lp�������
j���� ��k�
pU
�t�&3apcn��0\IA6����C�Q��=��-'�giE��S�z
+�l�B{���zo鲦�XM���Ͽ���g›�v�M{� Mn9s�c��/_�|��:��mv>�b� ?�9�*f�D�Gww|,�+O��_������r{����ɍ9��W-�
���
�����S:��s
��^<m��*���V^?1{����d��o����!5l .0%�YEI���	 ��w*��
V���t�@����DD�5�2��a�3��ٕo-
~��塍->}�T�T���4e��W	�&�&����4�%:�!��q����{�
����5վj�|����D
+鈚kMS{v�����ܺ�����CQ84k����|q���t�oŲ_)�׍
.Bb�g��"��-� r��:��U0�@E3�P�k)�,2R��ZEj�����Ʈ��.���u+�X�xh���k���!
x��G�t���4����W�C�|�џA`����z��e1c�jo��e?X��m;��
FY7e;�r45xr���A���M����(Ifb��<��a�U����ۄ
�	?�,�
��Y��ڧ�,;7��j�uWe��{R�R
�I{+!���ê|.]��H�R��E�� T�F��S��p�.3�eL[���#�گ���dX�d�S�9�1����$I�Ws+�h"9�[0Pi(�ʮ|�@��n��b�� M����d��lq�U�������9q�>ټ��&���d
�c]w?�!��/���
��QE
ț\4+
+B�����1��/�
eДW�A���yV�)�	����L5�) ޝ�]D0g�@v�zs#���
�˽€ D+{��_7u_/\oJCɀ���+�{H���j3n���m.6��U���,�!��V���.[qNbd�y��c��7��>1�d�5m��=�*��C���|��ݟ�<Y�&U��P��C`�
~���M�(�e�����w癉x�ƕV}֐|�P�'R0���
@J�W��X�K(���c�k8���wU�+_"��Gw���sϻ U٦M��������
G���O6Q��64E2�c����V)q��e��堵��	�� �����V��_��
+�|����I�S2
u��#��@uI�����
+ʗ�>:�
f?ޮ������@��M �D�(X"�e��e�?���u �ʖ}(Ż��j}�!��G�2�IC@�Z�ꂁ0tŤS�ļz�
��9�e�[SٓV��� w�
���I�e��~L
+�S[�Dz����˫=$�G���F��"�R
��g�\-̕��;m�� gGT�Zɛ�V�gG�r�|�G�L��7�^�- at n��˷Xf(%3m]�tL��: S
*� �S-2�% L~
���L��C8+D��ϧe��
�g~y��dRi+� �(
r�EE�
����θ�&>���
�B�����d�Ʉ�(���"E�;+-��.۵Q�
��)��f���s���|���
zz�S�I
��L"�_:�9�k�F��_(u�]��S�d���J���ޕ��m�.h���s�4f9h��;��u9h�d��ʃFx�NK��
(��Hq
�w}�͌QR怬�f|�;]
+Oc���~0M�S����H<���c�Kҵ%P��t����jld��v���l��2��b����`ݴ���>S��/
ڷ+�#���bo����J���P�=�[�D}��:�j� <!L���:G��h�X��=6]x��xW���
���+�p��|M���}/��6M�%u�.�6t
 \+x���o�[N
+iF'.e{��OXI:�c�7�b�J�x��n{� �k6��p�s����a���TԺ�5�(﫭;F� �þi��h��E�/�~���a:%H
E��d���i�zA��R��W��=�{�[
��
�cRry�K��$W,�
��`/\�h��> ��"Pk�V��l���>8l�B^2B
�Ԟ
*��[~,�P�=�;�Ω��� s��.�VL0���.6�f%�X��f����}�A��7�5�%n�f�/3�*�Ͳ��'�JZ�=I�
+�d��E�(�Tϵ99�B��is�s^�.{ɜ��K�r�xI,��%:‰��4c
+j"˹:�J�f L�j���\s�ڣ�����q�t�����P���n��
�ij��4������Z���]�H����:]���z?�x������`���ey�X��������Y�#<wD#�
cx������T[���U1��8����p�->y�

W1�ɢ�K¹P������l�r�����{�]mR�69�:�SSq!q���Jjи*؏g��㼭"���U��$LA���*n���•�{p��U�.��@c
�)4Dmca�����@��?Ȅ�	�
�<C�i1Ǹ�T�slQ�T�P�Ff� ��'�+~)
R���D��a�w�A\e�}U�o�+��
�+b�J{C��u���&Wu
�Tʴ:�=v
D�0�"=��
���Gy:��N���
��Ӯo���㈩
0B��}�pOn��%����

+p�INDG;�8`_�϶uwt�~���Da
I6c�b<
]�S��
Ej��n��!3��?��x��2e�+@������@q8g��E&��r�7�$1:b	��}��#<�w*K��{u��B(eF���&�&'A'�bj�C��t��)
d8�x[ݮ�ˏ8!:
��=���bӇ��h@Z~�Ia!����+��fP����e�(V�MR{J}� N�dp��p?���Ay����p7���x�՛����)�x��?�w:2C�����]~UM[�LX at pN���~�W�rP�`}�!�"c�8����������g���Ӿ>��>�=
�o'0�R��f���&cI�/)'JS���>����
N.�Ft��&�h*Xv(�m�v"endstream
+endobj
+2880 0 obj <<
+/Type /Page
+/Contents 2881 0 R
+/Resources 2879 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2759 0 R
+/Annots [ 2883 0 R 2884 0 R 2885 0 R 2886 0 R 2889 0 R 2890 0 R 2891 0 R 2892 0 R 2893 0 R 2894 0 R ]
+>> endobj
+2883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.7425 707.9571 159.1085 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_f6351727d099ad178db8b8e742507f4c) >>
+>> endobj
+2884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.7513 707.9571 321.9941 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.7845 707.9571 513.9963 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 696.0019 140.2514 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+2889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [132.8863 379.2317 192.4426 390.1356]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+2890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 369.3338 132.51 378.1805]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.9749 311.4858 276.4812 322.3897]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.7255 269.951 193.2317 280.855]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4174 178.9115 214.9236 189.8155]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+2894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2882 0 obj <<
+/D [2880 0 R /XYZ 90 757.9346 null]
+>> endobj
+2887 0 obj <<
+/D [2880 0 R /XYZ 90 658.6818 null]
+>> endobj
+2888 0 obj <<
+/D [2880 0 R /XYZ 90 607.9612 null]
+>> endobj
+2879 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R /F10 488 0 R /F8 568 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2898 0 obj <<
+/Length 2061      
+/Filter /FlateDecode
+>>
+stream
+x��Y�r�F}�W�)K&�h��qU
+�dsq,zkS�����
+	0 d����`f@�� Z��iK�FOO_N�
���
��P�0.���GW����_��>�
+����~+Ed��TF��F�$HPB����D�1�O^M	�$�:���R<)V��tY&���2)�O��x9?�N6�����o	�%�#e43��gN��2��2ý�l@�A�	��?��URUӘ
+
�
����*�S��uz��S�'i��G�011��<9����L�?O޾�����	F�h��
F��O8e�fur~�k�ǽh>
+
�MX
�fPJ
��VA,���`�A3)*�L7�8�K`�~�d�S��QW����ԡ������H�5���_�U1�br��W�ѢX��6�n���.q�/σdY�զȗ��u�]�\x]Y�R���q�3�5�r�Q�DFY_]F
+(XĐ$p�B�	�6���{▽����O�����wSm�:]���˰����$�����Z"�I/�F��wyY�Ĥ	��D�6E��1?�fJ��E���
+V�
�;�E���J��w,�|���bxF�����
���1+m�҇Ǭ��ȕ\>�=w�K���j?�˹� R јd�r�}�5�$��j������?�d�{p��"{������6��E�-��eQ���KwM|��^AA���/��|�.��2��k��)�����i!BA&e��l����|[3�ch�,��М��Q���m�Z����JU�N����ڋ���h���)C)z����k�@y	�I�6��
`u��W���_H�(5����+����G��_�˞�~]�
�9=uՑ*cw��[`8X1���C
4}1IL�� 8�e����|�B���4
�����<�0�A���g���\��@��e�-�u�������g��2�?~Y,n�)�e�y��qC:Z�z�@>Y��-0�~f
pǁE9�z�I���R�4|�-�
��
+qM��'�z�����.5T��4f��f��?}s ��+��z����2� U��u��kTW/�cʃ_�����2�9}�+/�U���x@� �Ua���@Ӑ[Wi���
�Uj�j�X�
Q<D��
ɡ~�@H��m
�~����9{}~6��CQ
mI
k�
+���U��OBdXl9������n��Y�n�	@	A�Hʹ���9�&���3%�X��k�_��&]d�cL�ex�,��6�h��ً1`+����+u��Ƹ�H�
+��k���`Ȁ
+p`I?�¤֊
WB���P���h�-�ϊ��� Az��"�r���HvL��ˎ
Vw
tUT���z������`�H�{NTZ��+6�� �-�޺P����u���}�_�����y[މ��)8��s�x��bCuw
�s�/�&�
uh9�N�X����a/�
+�R�JN8s����?�L{k
�AGa�h���d�Gp�����֑
pn���C>u�!�gC��4�+m��7�]
��'dwY�����C���a������$̨|�kD����������ӫ�����u �RK��n<�h�z

���/�2�!K�,��ɼ�
N,����ճ�ܜ3`4��C�=�j��v���;x��#��a�>� -�0H$9'c))���x�m
ܮ��x|��������m;�bW�Z8�L���}�O%�{:
+^M)�J���Ǡ笃^p��p�6EXH
m�ak%֣H��1�T@
�����
R�
֎"�H��4dld�م*�!
V!�r�n�1a�R�<j�hf���!���Q��1�fIZ����
��t7�[W&~BH6�����n��s�n�x���3�7 :$���p��������
��mەB~ҏ\ͯ�RCF�%���V:F����΢��
��n=6��7��6���S��$�ݩl�m��T�)S�l��)�e<9O�}�P� ���{^ro�����m�� �|NYw[>�k7~]כ������hQ!`ٛe��f�:ݷ�c`���H��V�����9�*Raݳ�2��uўE������<dД� qhzendstream
+endobj
+2897 0 obj <<
+/Type /Page
+/Contents 2898 0 R
+/Resources 2896 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2759 0 R
+/Annots [ 2904 0 R ]
+>> endobj
+2904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2899 0 obj <<
+/D [2897 0 R /XYZ 90 757.9346 null]
+>> endobj
+2900 0 obj <<
+/D [2897 0 R /XYZ 90 456.7871 null]
+>> endobj
+2468 0 obj <<
+/D [2897 0 R /XYZ 90 433.5458 null]
+>> endobj
+2901 0 obj <<
+/D [2897 0 R /XYZ 90 433.5458 null]
+>> endobj
+2469 0 obj <<
+/D [2897 0 R /XYZ 90 302.7452 null]
+>> endobj
+2902 0 obj <<
+/D [2897 0 R /XYZ 90 288.1749 null]
+>> endobj
+2470 0 obj <<
+/D [2897 0 R /XYZ 240.2453 225.5034 null]
+>> endobj
+2903 0 obj <<
+/D [2897 0 R /XYZ 90 208.7763 null]
+>> endobj
+2471 0 obj <<
+/D [2897 0 R /XYZ 240.2453 134.1497 null]
+>> endobj
+2896 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F33 485 0 R /F7 574 0 R /F67 370 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2907 0 obj <<
+/Length 2191      
+/Filter /FlateDecode
+>>
+stream
+x��ZY���~�_��D����Ab���.���� Yx�G�HD$RKR���jv7E�-�|!~0� 
���j�L0����
+��d����\�����s�?�
+�����N��AFR9��kF�	J��z�vJ��9�O_��&�6�y=�xZl
��Ln~�nˤ|��z��͛u�Kg�����ΰ�p��f Î�w'қ�`D��^�:2�A�	��=9�7���fs*0�f�4��6I��+��wi9#z��
��
Sc�/�[�y{
+&�5ןo������F�h1����1t������ś�����e���.�!,k�~ܯM
�ZM�	�#�WHq��@��K�dkͤptF��'ց7*7�7R!�ɸ�t抻
c��=;�0PNc�?���"�j��d�8C
�j2�0B�jV�L���y�X�b8'���̨.�$��϶�"x4��]��x��00��Dx��Y����o��gHv�l����s�v����
8RHRΛ^���K��^|��
ܕ�ק^��:Jw��ڠ��հN�
����,D�3811-y�u@Ң��uZfuu�t�,��2ۦy�y�;SJ�0��	��3�@���I&����B��0�A3K0D��x��Ӳ�:��`��$
+` ��
"�-�%�~�
�ӛ�HЌ�q�[��}SS��9��9, �'��9!\�8�\1�疍h�Nj'�������
�v��԰wʕ���PB���V��b�/ӥô��fTL��,1
�� $6rܼ��Sp i-d�7��f��(
0����B��`M'R���j

��[�.n��
+�B�t��6ytѷN,����Q�٭����Ym
gijM�'�P��cî�HbK6ҩ��a��j�~$c���� E<[1
���WWY>�`�d�-o�r��
<����4F-�J
��\�b<�=0�벰>r�slv�����DF�fd�"�[G��<��٢
���#�YZ���0��!fд[j����'*�ԇ�Z4�Z�ro�㓥,"��d��[�!�?W�E!B4�څ�G����7��b �)�Vթ�ˡ^�܌�܎���!"
&�*���#Y�G<�����ʘ��`Σ�G qқ��Y� EU�֯k�I-��o��6x at r�n�5O����<"���&F�51~	���4Oˤ.ʧ[P
+�8ooA�,�|-��t�?u
�
+&�JC�ԑڑ֎
w�R է���Ĵ�&�MZ5�
�E�H�|u$���Ү�.�?0���~���1��CP����ТΡR
� ����Z
Z�E=�<`���
+��6�}@��F�D��IW�4�0R��[��&���8��bV��Z�P���
�
�*�;a�
����v$��Ձx\��V���
+�D�%
8����+}	��]��ֺ�j��(A"��s��q��!�Xb��X��!�o���phv�>�h�#3p0�&a
�Ic��Z/����o�����?������c�	JiI?m2"@1[=R��2�Ch��8�^��J
����P�JNU�"����k�1ɺ�#h4tKqq
	��C陼\��6�Hm��3߯�*u���S�
�e�z�&]�'�H-
���x����A�K��� ej���X��>_
�dO-a�R�
��6}eX�0k}stPI��훳��:�d\�8zo�����R��<1�{��C��6�;�
��Np�ؙ����^2�T!
�T߼�z�`�����.��OF0z at 0�U�hƖ��E���M9bD�p
�ª��߃�p��ھ+m�k!�lb�B �gc=ņs�/ XУ�9�)�
���q�Ċ���pd>�(�%�B�+
b��`���:�2$�3��$��}�Ԉ��2��AධS=���P�pv}��Y�
�y�<g�U�R�ˋ8?iؗ���V�J����7Q��nW���/{[<�l�1�c����e�X١��k�->��T�Q��3,�w�6

-\o*|��>�-�ǫ�j�ң��
��f�L;8�z��j}��(�~C���!��>�3���	�GL﵇�	��F ��i}mK���iHh��g.w�*-�:�����$�CL7�6{�wb�a/�b�*U�=W���&M��C�BV�Y����$
�xP�}`�y��Ϊ��`\����wW�����hQ�}��J�՗�����znH=#�7o�Xz���iK�u�]Q��͢L�~7\�h��y6��?F

endstream
+endobj
+2906 0 obj <<
+/Type /Page
+/Contents 2907 0 R
+/Resources 2905 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2759 0 R
+/Annots [ 2910 0 R 2915 0 R ]
+>> endobj
+2910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.0217 631.9522 393.6059 661.018]
+/Subtype /Link
+/A << /S /GoTo /D (main_Bounded_Difference_Shapes) >>
+>> endobj
+2915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2908 0 obj <<
+/D [2906 0 R /XYZ 90 757.9346 null]
+>> endobj
+2909 0 obj <<
+/D [2906 0 R /XYZ 90 733.028 null]
+>> endobj
+2472 0 obj <<
+/D [2906 0 R /XYZ 90 571.3168 null]
+>> endobj
+2911 0 obj <<
+/D [2906 0 R /XYZ 90 557.2766 null]
+>> endobj
+2473 0 obj <<
+/D [2906 0 R /XYZ 90 444.6748 null]
+>> endobj
+2912 0 obj <<
+/D [2906 0 R /XYZ 90 430.6346 null]
+>> endobj
+2524 0 obj <<
+/D [2906 0 R /XYZ 90 304.7973 null]
+>> endobj
+2913 0 obj <<
+/D [2906 0 R /XYZ 90 290.7572 null]
+>> endobj
+2525 0 obj <<
+/D [2906 0 R /XYZ 107.5342 192.2202 null]
+>> endobj
+2914 0 obj <<
+/D [2906 0 R /XYZ 90 176.6459 null]
+>> endobj
+2905 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2918 0 obj <<
+/Length 2337      
+/Filter /FlateDecode
+>>
+stream
+x�͚�۸���_�O=��|?m��u�kr�^
��4X(�vW�-���l��%R�$Z�^Z�@�Lj3����(��0����3%2���zw�g�p��+�n/��2x���~-�� #����$A�:[m>�	At�$������%��ϋ�ׇtS&�o��eR~��y����C�O�V?^�&$����
̰����i&Qf��XE1�0!����C��&U�XR�a4C��n�M괽�Kz��
��i��K�31�Y�A�^�:�9�
+&��׿�>~³
8��+���b�N0"����S�O�W��֍��h
�ŅS��&
�
Ҕ���� �X#B���P�1S3E%"���.x�.�Ӳ�Γ`��t�
�I�-1����8�5�samy
�@)B�	G�^j�Z�P5�Q3��z�����8�,��g��A��˴J�U�'��|��!?�M�C���	���4
.�9�I-C�	gvbvF�Vu���_G��5%��^j���O!�X����C�2,i�����W���>/�t�Ī�[��}Qf�î==T^�������.K��y;��f�R�G���"�Vc9�M���l�ʆI�fޯ
��Ί�d&�����8|/fͨ����6���۴,�rd��`��Ӟ��F�׀��L�F�
�bA��K�X2A�ٝ���!��}�N�k�
�G~k�w�����m�wU��f#�3��9D��iW�:M7U;�����1�
v��d�m-�k���,�`�Ҫ�-)Q���@fѶAg6�4�%3H2[���Ǿ	����7�qWSqB�Dg��s��Zݧ9�qH��mR`�9=�'yӑ������T�c2��]��XG�N��;(0���?��kHĺ
�
1h���}_f����
��\�!%��V42
�$V�	�q��]�mac<��H��W�
+.�
���
�
hdP}��_~�����o߽y��V�F��
I-�7�X��
��1˷Y���$�.}�o�uV��ߒj�
+�6M���f���7�#
�fqp��>�o�
+�p��Y3�`�J��E�^n{\vil���iT����%��4𡶡�]Q9��uV���+�������I����E�M<ֺ�CVLv�@�t��	9��a ����]C;��K�Y�@�N���
��
E'Tٱ�}W
���A�[
�1���;nbD�3x�M���例wx7�
ǻ���9�q�t�1�#���
�
+����]D�T�6���z�M9�vC
�\Z��:�{��G��}�ç�0I(,Gm��u��r
�\�C��C��G��=���� -��o�:�σ��Rey:�)��`'�=v
�};���)���x�m����m�	��#��*�����
+”�)"��IA&��`a�oARؕH
+�|��N�<�NP4@����~Z�F����1	E:���a%d�TG6�]��h�1qk W�'@x��&��_�g$6	���D|W�/&�Cc�T��ʮ�	6����Y��W
����,�c8m�8��ۇ[�PH�Qc��GX
�`���ˡ�
.G�8��%N�&���&ؘ3�
J���=�� ^
+�1&adI
:�cz���.z,��~'5�:�h���wO�j*
�U��
+6�
�4V�bS��bb����G��X���;�jʠ��s{�P�t�P�؀���:�|*�C+Nߋ=��'=q��q���5��k��
��^j�aX���^�JS�Zw���ї�=�
\ۓ
\�
�9Ғ
ޛ^ װ�4B�9�~��>�e�z_�u�
��/�u�1Is�u�b 6��8��_��N"��
1-�P :�^o�v�o�����ZO$���ԫU7�
����VyLg
+�����k*\��M��~����*p�=}�����
��٪�"
eU
NwМ��"�ֈJ�C�s�н2
������/��†�b�~I�C�W�����.i|�{|���פ���E���C��(����	
U�1�w� JmĄ�����vL��ϡ'���1�����n��F�cȐ���lPF!B!��):ݞ��`�/nO��ihC�9y��7��9dJ��6�I��`h��]� �N9�Y�w;��38-�7�k�C���<a���
YBJO������U�e�5�%�- ��q|ގ7��`џ
`��)�7�����x�{k�����]hD���4�������kg�$ړUZ~�b���m�<ښ�fty,���'�Ѩ������F�Oӡ�7����ڻ�����
'�=�
�h�QS
�k'�P�����/_��u�y�/QV_����]
C���MEo�	�l鹟C�J�uϖ��qȮ(�Jw
��֑͸�)��`��endstream
+endobj
+2917 0 obj <<
+/Type /Page
+/Contents 2918 0 R
+/Resources 2916 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2925 0 R
+/Annots [ 2924 0 R ]
+>> endobj
+2924 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2919 0 obj <<
+/D [2917 0 R /XYZ 90 757.9346 null]
+>> endobj
+2526 0 obj <<
+/D [2917 0 R /XYZ 90 635.2015 null]
+>> endobj
+2920 0 obj <<
+/D [2917 0 R /XYZ 90 621.43 null]
+>> endobj
+2527 0 obj <<
+/D [2917 0 R /XYZ 90 432.5729 null]
+>> endobj
+2921 0 obj <<
+/D [2917 0 R /XYZ 90 418.8015 null]
+>> endobj
+2922 0 obj <<
+/D [2917 0 R /XYZ 90 209.7422 null]
+>> endobj
+2528 0 obj <<
+/D [2917 0 R /XYZ 90 185.3731 null]
+>> endobj
+2923 0 obj <<
+/D [2917 0 R /XYZ 90 185.3731 null]
+>> endobj
+2529 0 obj <<
+/D [2917 0 R /XYZ 90 89.4414 null]
+>> endobj
+2916 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2928 0 obj <<
+/Length 2391      
+/Filter /FlateDecode
+>>
+stream
+x��Zێ��}���S����_&�v�]d���yp�G�,&�P���ק�ͦ�b���c�H<�X�S]]]�#��df�L	�
�r��]��{���+��^��EW໻����d$���u�A$(�����9!�^/�x����yR����ϋ�M�*�����2)?��~���7�d�^�����B:j��H��
���N$@&Qfx#qQbaB6/'U|�M���:Ow�mR��_�uZ^=O�%|�8s��Uz���X�P�$������wx���t�3Z�
�F�:�]q����՛���z܍��ؾ�.������X�9�_]�m� N�
q�B�k�T��i���)���>��bl#(����~(����e!���zl
���xM�v�/�|�Ano�c�:�/��l��BXP=[�"#���u ���t[�>��;xY��}�9�Ӥ��q��pȊ����3Ĩ����j�_Mj�,Y#*��4 ���:��V&��4�o�|
V�s�๓�R���
֪� [...]
ʺ,v��v���ە�N
S
+��K�:��iv�H��Mv�YƐ!��:�4Z L 2%�
�D�Zt���Bv�.	RX�L���2�Wr��sl�)R��(xψV�oE��d�VkơZ�ނ�9�H���>)�wi^��2I�G=�J��	���
�c�6���|$�8�Y����Ft$�$�
�.�$6IV�T�U^�)e���b�O��a��H�XP��i�3
N��$�(�+Vn�PE�b4-Cj��M/��Xm_ZQ�����:PP�h���)W���.�w�
� WB>n
+
+�i�6\87��A9�̨���2��t
�I��=�5x
AD���
���<� f"�
aG`B���ƐbUʴY�ތ�.���
��n]�7����u�
V[8g
�
������r��TLV[C��[��+��•[{��^���D
R����������4S}:���P),'�o�������5�tib����6
��~�$!�\P�~~
+T�Y�7�rӤM�T���M�����j�\��(S�����%�csӷ=�
+
�t5�kl��z���J
��B��ؕ�&+Cί�r�߈0�o�,���X7`|*���<�V��l.��k�$!�ߪm���ujC
���U�Q�������˪������Q��س����
+/
+w[�]]���jłb 3����	`/�>�/e�5	���ʡ-��h��X_v�F��4"��)ou�Ƽ�ł�x�-� m�{�>p�[X�� ���*͋]�?��$��
�	u�������} �
���M@{�>tp҈
T��!�O�cn�)?�
�3A�����5�C����	]�����iƋK���X�[1^����Q���Ϟ1��30��d��N��&P�D���Ѯ�6��̄4�������b󢌱LBܰ	oGU����N���;�*�;_D�	����J���
����u^ֳ�e���������2m��c���l�ʸ=
���
S�P��0�1��#o�����W�q�iZ�s��?���G��]փ��z��X�g=� �!� �a�S9I��b$�
+��2��K.�<$m9>�y("�9�
�A!\0$�`$�1ͻMr
��l����>��M�����d������
�"<�"̷ͦ<闔���YlJی'�Ͼ���<n�2��q%X�'�le�@�j�����V�I&��:��x�ޕ���r��<�ɉ0ҹ�,�w��$�3���Í39��2��<"�ЉY�+6�]^l��n��
p��	��
��
bZ�)ou�Ƽ�Ŧ��q���Ǚ� �k29CGa$��WGl�_^�&g
�erz�q&'��Ƙ�a�H�Oy�#5�|/��r��
��QD/�C
���lJ� �o���Xc|NM*7
`��2MW�� ��l�u7�4
�$��߻�{o�׾�å�x{o�-�2�o���
��ȶ�
���0�+�U��U��Z
v�n�
��֎��]Wj�
 P�4��;
�s+�΋}
w7�w�3&�������ͬ��
V��7���YiFش8q�Rz�ӠW�s���d�����M8�j���ph��S�
AZ*q�~"�	�
�y��N��v
	E�m7��j��:� �A
+	sZ|�a|���ӈ˖�������	��,��k�R�/z��~�ZjHY&�!�N�y}�t]�mPY&���<��h��=��o���7
Ÿ���lO����,O�����Pe�d�#��I�s�P
S�}#.��ϙ���i�����{:-���.|SU�ۛ���G�<�c��K�U7�����.�a�Х��ޢ����Cݑ
+�����tw���,�/wuwы#[)"����Pendstream
+endobj
+2927 0 obj <<
+/Type /Page
+/Contents 2928 0 R
+/Resources 2926 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2925 0 R
+/Annots [ 2933 0 R ]
+>> endobj
+2933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2929 0 obj <<
+/D [2927 0 R /XYZ 90 757.9346 null]
+>> endobj
+2930 0 obj <<
+/D [2927 0 R /XYZ 90 733.028 null]
+>> endobj
+2580 0 obj <<
+/D [2927 0 R /XYZ 90 636.5011 null]
+>> endobj
+2931 0 obj <<
+/D [2927 0 R /XYZ 90 621.9973 null]
+>> endobj
+2581 0 obj <<
+/D [2927 0 R /XYZ 211.8424 377.9235 null]
+>> endobj
+2932 0 obj <<
+/D [2927 0 R /XYZ 90 363.2653 null]
+>> endobj
+2582 0 obj <<
+/D [2927 0 R /XYZ 192.8535 89.4414 null]
+>> endobj
+2926 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2936 0 obj <<
+/Length 2424      
+/Filter /FlateDecode
+>>
+stream
+x��Z�o���_��F��~�A�^��)pɹ���`�e��H���}gI.�%����ڦ�Iq�3;3;�H�����
+��|}���#��݌ԏW�|���nv�s���r~�-W�	J��n�~A���/�.	^D�!���x��w�&��H
�(�������v�1^~����[BZ�Ñ2��vկ*O3��2�k���"&d-��%��G��rE��
]ć�>*�ꗟ�m�/�^��~R����.:{s�x�v�`�X�s���o����0bF���`D���ÌS�n��w��u��
��®	
eK��� �D
����6e'D��^!ŵ���c�Fp��2��f4
N�$
�l_�����j�R�S2
��5�#�{���=$irH�U4_1�V`�
+2B�R�g,�:KO�r�
[���q�߿��X%��d�}����-�J�*c�Z`kQI\j�\i��d��g��:��bX�b�`��$�ާ��R�@ii؄4 at Y�Z���Z�
ġկ��8K3��4.5 
��'IM��WUӪXU���1�$���t��P	«���\�$�|᧸8��)�0CF�]�9�	Y��r[H�P��YD馺���su�ʷi�rH��0
���t4)T�Ӵ�Jg��T���bZ_��H(�z��W�;:
�s����n��P�
�%�'{�!��'��$���C�n
3F��Y��Kֻ�h(�����S�^�]}����ج-o�[��g���O��p<�u��(G`
�PA���	��R��
��Z�#��.M�+2��"�O�]���bpC�
i����%⥠�_Vm'���
+8:`���^/�έ��z�\��eᮮ�%
0�U�2�Y����w�aSݞ���E#�S#$�z�<uB�@".!�A�]��
���/[��b'�W܉G����&^���Q��!˶W��aw	��Rq3᮶؈�1�+v��0`�q�N����.���7���i)��SJ����Ej�]�T��{z9`q�ظ^'���
3"(�v[�ps昴{3����֏Uo�������u$ݎ}�6�BJL�B[j�! ��sś_�񱀚7�
B���ߵb �N̚q*6���x98#�'��(��=��F��O�
i���������g��.�0Hڄ9P�Hl&��%��7	 GJ�F��t�
+$�E��VIjaGT$�*��+j���X��Bôj���6���v�+�	�	�B�Lq4�e�Va�&�
\����A���B���
� `_7tpԙ�ضp�CE�fa��=/��5
�%�=������δ�z�P��?���6h�1��
�9ʛǼ5-�dLusookxtN���Ո�S�V�����J�&<�o��Г��$<�ᡯ$<h���Ä�$<�Q�ƒ��E�|�
�# �G3
/�p
�
㡇���H��˚�0}c�9���i&��Z��7��1���J��
\��=\�+�h�0�9&���I�}��S�_M��O�R4
U��Y����i�q��K��J���ly
AתQ|R���I�AgB�q�ޖF�LC3���ch��#ȽgI�7b�4Ψ.4NOo�����/�8���fsv[l,\Nl��W��8=�a�S�i
V�	8�j���ˉM�8���8L�x�?+�� mܜ�q�bcsb�09�*��:��x���Ȝ��ؤ����k����il-
U��J�d��MI�+��.�����FE5�D}:��q�9YD` �$�}���c�J������]��n������z���y�{ [...]
� "d��	������rq��R�wƹ	R��3R��0���0LR�Q�v��Q�I���_
�
�l�vr̫)�u�Q��f�aڂas���
ك��%����/���#3�
�s�����_��"�<��\Orq��&Y�kQl��	�I�����7�-	@�M�+�ѿ�=!�P�4�㐩-5
�)��Ր)�|2��C�F�� ӨG.��gL2y�
A&/�|��jP犦�|u��K��}���?��.�UH
+����/�����J�~�'��|�����2Y��Է��T�u3�n�z��/�F���/Qz��յ�ۿإ��ˆ�����T٪�,S�����4 B|/UO�1wW�l�ya�z�M�-�ֵ��������	�O�&�
%������1t(��X�V�P���
��TX{�l
�r��
��X�ˣ�k��)�*�O�endstream
+endobj
+2935 0 obj <<
+/Type /Page
+/Contents 2936 0 R
+/Resources 2934 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2925 0 R
+/Annots [ 2941 0 R ]
+>> endobj
+2941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2937 0 obj <<
+/D [2935 0 R /XYZ 90 757.9346 null]
+>> endobj
+2938 0 obj <<
+/D [2935 0 R /XYZ 90 733.028 null]
+>> endobj
+2583 0 obj <<
+/D [2935 0 R /XYZ 211.8424 494.4965 null]
+>> endobj
+2939 0 obj <<
+/D [2935 0 R /XYZ 90 479.8399 null]
+>> endobj
+2584 0 obj <<
+/D [2935 0 R /XYZ 192.8535 208.1143 null]
+>> endobj
+2940 0 obj <<
+/D [2935 0 R /XYZ 90 192.078 null]
+>> endobj
+2585 0 obj <<
+/D [2935 0 R /XYZ 90 89.4414 null]
+>> endobj
+2934 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2944 0 obj <<
+/Length 1838      
+/Filter /FlateDecode
+>>
+stream
+x��ZKs�6��W��J�x?4�
�&��c&M�^Ҍ��h��D�
���K���� Y�����$�\,�o��1����}%2���t���9<~�#��#�}T7xqݻz-E� #��_��<H�%�=�0 ��`�o��tL�)
$��E8K����M����&��:
~����5!5��p��fF��;k�h�`D��ŵÉA�	Y|���e��
GT`�f� \��A�'���0
=�)<R���,w�{u]e�H�`�������#�� �?�0bF��n0"�����)+o����_+?���
�q��20�!,�1������uӦ
�hO�R\�� �_�q������ ��j�@0 *�&I���� D`�%�A�Ѭ+tB��z#��&K�i����r���)���
����I�Q\��,0<�d���'@��L=~Z����7�¨���F�
�K�Ab�f�i���D�kS���e����5�Q>�F��$�|g�.��RȦ�/C\� [...]
+���H����He�
�9����u#��E�
�lc�8���扁�ú�H��T
iĥ.Q
��(�"H�w��d���f"
��g��@�r_��E�\P���nQ�Hs|�:�
7E)��(Q���?�C��K�I~L�t�I�f2�6&Q�U�$98x�d���]���
*KF"�����*)՚����S����AQ
�����+Ju�â$$X	 ����j�#J�(ܢT��'Jތ�E��[��
�&b����P?)^�d�,��}Cl�ِ>X� Cc)KA�uA"��"i`P��9��*��G(��j�R���eOޅ&tܺ�DQAs*�G$JQ�a��QfB4����]c۾L�Q�pj���2����w�,;	�%�M�M9�� /��BXC,�vӢ���E��E���܄�6
c��{,<%�7�S���b��f��X~p
+o(w/�׭3=�&�'3��q�w�p3}ev
�{3�g�N0n�o��Q%��U���"�(�f�������?��y�{��D�����
�Òsu	���.��<
�珥�2���Kn�9n�/pD 1�4����0�3��hz2�;���;7��V�q�/{�oG�f�z$τ��I
+D57^<A�ƫ
���_*��ᙓ���~�p�^���s�~�q�Y��s3?�7�JV�;��|����H��>�W\�ϫL;x� a���e?�DJ?�׭�>�`/�����=�߉�����y���Ȟ�;��ɿ�s`����x@�U?E��<� ��ϘrS?�e�d>�'�	�i�B��
w
+��/�7�u
�c�x��~4^��6��8���T��{��E�FA���ex抖@�������0!_r��9kv������Mk	
-E.��bIn�`���!ձ�AI ��
YԌ
!1-�ɂ�hڣ��rPZ���d�Š
�[
ꑜ���d�IQ���f
L�d]�ۥA�G.R3uq��	��Y��HR
+���v_�I
`0�O@���wZevh�L��
��%��ۂ���o�0�v(Ġ��/A|,����U�����uR�3#=)y���P�����Y����/�~�w�zaT{��PU�r�o��E���WW��M7�.��)����zyՎ�C�m`���Qeԉ��~Z*��ܖ�URVQ
W�������\7� \p��endstream
+endobj
+2943 0 obj <<
+/Type /Page
+/Contents 2944 0 R
+/Resources 2942 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2925 0 R
+/Annots [ 2952 0 R ]
+>> endobj
+2952 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2945 0 obj <<
+/D [2943 0 R /XYZ 90 757.9346 null]
+>> endobj
+2946 0 obj <<
+/D [2943 0 R /XYZ 90 733.028 null]
+>> endobj
+2586 0 obj <<
+/D [2943 0 R /XYZ 90 642.0233 null]
+>> endobj
+2947 0 obj <<
+/D [2943 0 R /XYZ 90 628.0165 null]
+>> endobj
+2587 0 obj <<
+/D [2943 0 R /XYZ 90 531.5069 null]
+>> endobj
+2948 0 obj <<
+/D [2943 0 R /XYZ 90 517.5001 null]
+>> endobj
+2588 0 obj <<
+/D [2943 0 R /XYZ 90 420.9906 null]
+>> endobj
+2949 0 obj <<
+/D [2943 0 R /XYZ 90 406.9838 null]
+>> endobj
+2589 0 obj <<
+/D [2943 0 R /XYZ 90 310.4742 null]
+>> endobj
+2950 0 obj <<
+/D [2943 0 R /XYZ 90 296.4674 null]
+>> endobj
+2629 0 obj <<
+/D [2943 0 R /XYZ 90 199.9578 null]
+>> endobj
+2951 0 obj <<
+/D [2943 0 R /XYZ 90 185.951 null]
+>> endobj
+2630 0 obj <<
+/D [2943 0 R /XYZ 90 89.4414 null]
+>> endobj
+2942 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2955 0 obj <<
+/Length 1899      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n�F}�W評�j���Q�
Moi�>%�A��MT"U���~}gEr�%W+%qZ���;ڙ�93sf-2��L
�*��a\N��	�����'�]^���/�����;)�I���z��$HPB��!��c<{:'x�T�����Y�z���*��)��������o.��&�l�����w��%�#e43쮟7"�f�e���M
"L�V��[|�J����
+
�:�֛URg͛g�uV͉�e�^)�Č`n7�|{�<�:T0I�����x��)8��#f����F�:]O8e��j�|�ۧY�}!A�)��
a)�

b��6:uw���4͌D|���Z���&+���
+��@�8�<	�.���)���� D��<� aH'��!'�V��<I�˅�.������n� ;�eYl�*ɋ���K,��]���`��F�Q�Q�L��j��#�NwjPAZo����ȋU^d�AA{�
��O
+I���_�i�(I�߲��H=4O�u�֝(`�
���G�kĥ+u�lZ߶�}��}�W�]�fi���s*f��6g[���%ƴȋ�F!� a��u��,`9GFg�m�
��g�аLh�0���^����$�}�q�k�f��TH3��jl��Ϊ��P?�)FIЀ�!Nzl��N
)%w������P(�R�O��J=O &!��J/:�
����U�Y��h�`�Z�l�b�(k��}��p��V��me�͓��(+��: E���:zRtPn�a�
��k�m�
\AF at y
C+ ��fl���</�
�^'�<�L���u֔
�(���=/�'56��M̐d��3��*m �
 S3�@p��a��~�>(D��ZlR���hŔ�)�1�;�I�5��9�t
�^�Ų\o�:�ZY�2afee��;�_��A�cr�J�0VcҶA��� >�
��e�aE��
��~�Kє�~��B�lP9��|2#
��� ����
�q2c�vU��f�we3�&r��xjqE�1N�"��w��Ns	 �\�E����ޞ�@���Fp(x�)��;�C?`�Ï
�$4e�=���R�[��P3�S�,��`
�X
�*߷���`�rbV�u��f� ?gJw��ۨ���.����׃hW��n5 
P�z�1�_#�Gd_*�_A ��|#2 ��%a����2z�=�
)
HO���@2�����KE���Lғ	dHy#+��pboG �
�ȑ1a��@�wIO!��D�����%'42(��4
+v�uuӮ?��L�

æVP\�9㤬��d��q	D5
!�)$D����
(�2�B�g���
;P�\Nub���Y6�
fGaN<�V�����;�����t-�A��j_f<��ǧFN��MV%uYm��1	ix
'u���
�0�v[����F�_��u��Mu���o98�p;S��of�5��v%+"X�nbao8�tG
+�@�qP��B��̲׹u
�j�����=���Ć�>�o˻6`��ig����?�"� �5;¤�R��>�1@�?=�	���#K�|ɉ�#�S��F���ZE
�̘��>����C�����*ݗ:
�A��өtHy#+��pboG��
�S�1a*�ӧ��
���<%6�p�ѯ)nT�VJ(�Tssz��q��!.
f
�n׳B�A�W������ ']}
eD�>����}2�8��}~�L¿��ģ����H
+�$D�
| T)�����~-���PE�:+�QL����Z�S{�j�}��yl��y�}�U�΅����9)`������
+���T��2�޵k��jI��y�Y�c�}�qX��E�����ȣ}��o�zs~vv��[tW�
+���f�:���uPu#�[8��-��9�f���l��W';D�]w�
x��
�#
�n0�y\�,endstream
+endobj
+2954 0 obj <<
+/Type /Page
+/Contents 2955 0 R
+/Resources 2953 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2925 0 R
+/Annots [ 2959 0 R 2960 0 R 2963 0 R ]
+>> endobj
+2959 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 346.8581 138.5077 357.7372]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000028) >>
+>> endobj
+2960 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 326.7685 314.5657 357.7372]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+2963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2956 0 obj <<
+/D [2954 0 R /XYZ 90 757.9346 null]
+>> endobj
+2957 0 obj <<
+/D [2954 0 R /XYZ 90 733.028 null]
+>> endobj
+1137 0 obj <<
+/D [2954 0 R /XYZ 90 580.1055 null]
+>> endobj
+2958 0 obj <<
+/D [2954 0 R /XYZ 90 565.5352 null]
+>> endobj
+2631 0 obj <<
+/D [2954 0 R /XYZ 90 317.8022 null]
+>> endobj
+2961 0 obj <<
+/D [2954 0 R /XYZ 90 303.2319 null]
+>> endobj
+1138 0 obj <<
+/D [2954 0 R /XYZ 90 156.7596 null]
+>> endobj
+2962 0 obj <<
+/D [2954 0 R /XYZ 90 142.1893 null]
+>> endobj
+2953 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2966 0 obj <<
+/Length 2093      
+/Filter /FlateDecode
+>>
+stream
+x��YY��~���Sb1����3��5�q���ACm��Bl�+��q~}�"%���A��C[d��X���#E�����
+��rw\��
�aA���7]�o����Xd$���� 	���6~�"���`�Wo����=�YS����$.��?��ET\������stJ��?��@HG-1
)��a��މ�,�(3�KlJ
"LH/��M�
��\o�����Ur<
�*q#o�}R��^%��gbE��J�oۈ��
+&���/���2������-�/�1�.�
NY�pX�[����&�By�r�	�_i�HPJ
��V�B�!D�S�
˜����t

���TIQ��I0E�Q��n
9�J�=1�����պ�{Y'
+�5	Z�Zm��V�Z�acV��>�<{*�.������G�
�q���A�~ܻ����=���D�����[�!N�k*V�/k�w}
/��зW��ˋ�z���Z�ɼ�
q�o��+5
�)��::o��
�A��Il�y�T�|��������\2���M�vt��e>�y�F�OUM���<i�
+P]�R��L4�X��H��i������S���
؞
�Љ��kŬe�ߧٚ�����Q�t>&Y5r�h$�ـ�RcgzY��!��wϙ�s�ۍ�Av�)�@���C���X_����x6e�z�t��Ő�(r��j0�
5D4��Z5��5]-*���O�!�l�l�OQ�>
�)��
'�� ��Z�J�=hh�P��u�����Я)�<�"�l�!Ʃ��p����v��q�b"���JYG�KN�����#41h�2��<B����@��I�w�
h
�[1��$�F9@��8#/}��@�5��+A��g���#��n��
+/4,k=%ET�E9\#
		�g�V��
+���P�sr��""ky#b�hO
��}�i��@�����J@���rJ2�1@ڨ�D!ǘ�Ŧ�|��(Oc���.������omZ��������=Д_;���{�*[YQ�U���������ûK	�qÿq���DAf	m2�+�A%4m��	�SpO�v����fɇ@Y��hB����H���q\��h���Ɔ��
��߲@F8�Y��|`��D�ٓ3���'аh�fO��F,���
�<�M���>h���s���t���*1�ق
�)�#O�������28��.��[
Tv
|dh�>[0A�hd�BƢ�M9�o�
�psА�w6��ŚUء��aGZ����ƈ7F�S���ـS�ƍ�Ph�c;]����
��db
2>���aܴb���F�J�G΄�qϙ.1f�Oc�TJ�`7�X{
t%Ɓ�mҘ�P��2�K���W���p(�X�d�)�.�o�?�\�Ѧ<��`
��r�#����t�9
f�/g�y�d8�8�@��ۙ �1�g8�#��O
��!��t�5
G�>0���8�J��7
�	�Cn�
��3������rc��/P�$ �Z�~I������1��c�oK�B�=6%�-�J��l��u��[U���Oȁ�66�$��Z��gv�W�3��?=��1Pǀ
+^��SHq
ghB�<=�ov���\� .�+6�1���[$;{�Z�i�BC��ܸ��J�`����iV��
>�^L��u4k6"W�5r&L�z�ti�����"h7��
#��gi�榨�E�A�եY���G%ݍ��8b� ��q�r���iWj�D������R��}��"?��Y�
��#l�9B���+*����n�!��
fvQ�~<���Qܾ
b
+�l��H-��A���{�y�r>x��&��j�w�'
�Aǿh?��W�Ӿ��1����Te�O�-q�2�-�(d/ T��'<l?�J!?�Sj�[jȜ�mw	{�~��w�赧76P���dž��GO����ˤ��Z��o
+��st�ˏVt���\ŧ"��q���n�)�Lc
P/Jn�������m_�t�h��]�<�k�\U�������+�9KOJ����p7�
N�P8��do�
+�|酟���
+�/���py�4���e�G��\����endstream
+endobj
+2965 0 obj <<
+/Type /Page
+/Contents 2966 0 R
+/Resources 2964 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2925 0 R
+/Annots [ 2968 0 R 2969 0 R 2972 0 R ]
+>> endobj
+2968 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 578.1829 138.5077 589.062]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000029) >>
+>> endobj
+2969 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 558.0933 314.5657 589.062]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+2972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2967 0 obj <<
+/D [2965 0 R /XYZ 90 757.9346 null]
+>> endobj
+2632 0 obj <<
+/D [2965 0 R /XYZ 90 549.1269 null]
+>> endobj
+2970 0 obj <<
+/D [2965 0 R /XYZ 90 534.5566 null]
+>> endobj
+2633 0 obj <<
+/D [2965 0 R /XYZ 90 364.1741 null]
+>> endobj
+2971 0 obj <<
+/D [2965 0 R /XYZ 90 349.6038 null]
+>> endobj
+1186 0 obj <<
+/D [2965 0 R /XYZ 90 133.617 null]
+>> endobj
+2964 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2975 0 obj <<
+/Length 2105      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n��}�W�)��U��#X {
��dgg�av`�b�&"��G��T��)R-�ڛ�C0�Xd���N]%2���
�)��a\���+<{���"~y	�˾�W���落d$���}��$HPBg����DK�1��Y<O�mr�fA��

mZ&���ʤ<��|����dgV�_GHo[b8RF30����Vd��`D��^b5��A�	�����כ��K*0�f��nw���흷�ޖ
��6_�-ř�,ݦW߮�ǼC�������x��c��ˆ-fOp�1�ζW���bs��꧰O��<0A�sC�R���>:uw���4͌D|���Zy����y�u^�r2B �1�E�#�q��(6�n/�E3��@��!�H
D_��$iz�tb�%0�|��!H#�.�.�,���$Oo�Y�m�{���n$�˯���C1ko���è�
�)�igȺ�0U#j����x��6`�����|���C+(hO
�s厧���7O�1M}Տ�L��7�|B1d<֒��?P	� [...]
+���u��%uv��_,�
�yQ:!8��	"8��Ү�@�ՐBU�9�#�v�p�>�e��
+gn?�!��&7�����xCc��ML��p������,>
`��
��Pb��3��k'�5����0�B�����
h�����ܳ��?�D5�)�93�Y;�
:�0'N<�#/}I�ɞ�����oE�Z���g��u����3
��Џ;[&uQ�Z	�iXH@\
� u����dt�%�aK��PCJC�Oi�W��-(>-�Mo/��!5(,��
Y�x�Q
�u�j�o�ՌtSM�9 /F�6y�������`~��0%��C�NS}��
�	���)NT����O�QA�Dqsh�₃{R��J��"9S�|}j����.���Dg�u��
����?N�.��l�t��D���א�c��IS�1 at +�S6�
+�2�K�k�
��-��%a�
�b�j�(�4�ѾT�@F��ٔjJy�#+���~��z�H�F�LS��1}J�$��T�"��������������� ���S*g{]�M�p0*�DB�D���
Z(�Q�KzB�{ϟ�)�K�/��'u
��\�+��*x�v+���,�a�Ԅi�Ď/n�
�}J�j�ݵ܀ҽ���u����C�$
�OM\n��p�8�ŒtH��
+��گ׶�����l���]]~'~�t]�?�z��{4;�߼j at A4̍T�j��ۮ��e�Z�!RȈj�:{5fL
AX�
}9H}3���Rf�?voA,Ό�N�Ȍ/(?��ʌcp�1��	ƻ�BfLUf��1c��̸���\rY�n�Rb
SZ��
�����XG(��
�}�k��{~�"&*�
+���a��	�~5��6*j�r�1�1�$#�0�J 9��
���>s��'�_���>�ͣd�mJ"��0�{2U!N?�?e�c���E�]8��
8�MVc�~� �|�o�_oH
��
��I�������7�ϺL�]*��>ۋ�W���B��w�_�|�:s�On+ �����xWZ�Z�4e�1P� � I^jW�9�>�p<lx`�{�c��#��u��������ZWh�g�e��n��>�
J2�l$z� 4�e�~�T*���ܻa�AUQ��ps����/cƦ��y{�endstream
+endobj
+2974 0 obj <<
+/Type /Page
+/Contents 2975 0 R
+/Resources 2973 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2985 0 R
+/Annots [ 2978 0 R 2979 0 R 2981 0 R 2982 0 R 2984 0 R ]
+>> endobj
+2978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 507.9006 138.5077 518.7797]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000030) >>
+>> endobj
+2979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 487.811 314.5657 518.7797]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+2981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 188.0378 138.5077 198.9169]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000031) >>
+>> endobj
+2982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 167.9482 314.5657 198.9169]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+2984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2976 0 obj <<
+/D [2974 0 R /XYZ 90 757.9346 null]
+>> endobj
+2977 0 obj <<
+/D [2974 0 R /XYZ 90 733.028 null]
+>> endobj
+1187 0 obj <<
+/D [2974 0 R /XYZ 90 478.8447 null]
+>> endobj
+2980 0 obj <<
+/D [2974 0 R /XYZ 90 464.2744 null]
+>> endobj
+2634 0 obj <<
+/D [2974 0 R /XYZ 90 158.9819 null]
+>> endobj
+2983 0 obj <<
+/D [2974 0 R /XYZ 90 144.4116 null]
+>> endobj
+2973 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2988 0 obj <<
+/Length 2048      
+/Filter /FlateDecode
+>>
+stream
+x��ZY��D~ϯ�$���!$X�\�� 
�U䉝
���C��T�mǎ�N�a9ڇ�Q��꫚�)�dj�T	�
�r��L��
1!���/���L�>�bj��TNoև$A�:�	_�At� �ً9�� ��s�gY����<X~
��A��������`���<����ֲ�p��f`�]��J���`D��N�Ƴ�A�	�>:�ij$(���
+
�:�6�$(����h
�s�gQ��G�31#X�E'��4
sL�_&���i�}>��-�p�1�N7NY}�L^M�o֩^
>�ŅS��&
�
Ҕ��� �X#B��P�1SSE%"��3\�MTFyq}�O�)R��i{�ڀ�!�t��:�PHA̎�ZSVwEO=�Ș��o��T_��m�T ���}��e���*K��EA�&(���8I��['
�a:��d�b_�Ѧ�����E��ֲh^
`K�c#� �n��9p���+�T2�}\T2��S�
��@�n�$%GL21����0ʤ)+o5~��*ږ1�zaī|a�c�a��5�(���8�s<{$q�
��&J˞QF#)���
i���t���
�;����ٜ��C:_H-g�� ,4}:@��:Ii�Y�BN��^�
�ӽ@�V����Qe|�m�$��/�t�m�A�&�Wj��H��
���.;]P,�[�	2BTu��=��3�K�sfJ�T#� ɻ�T�9�_,,,
##�ÛCW�Q
+�J���#b�9[��c�k��Y�T�=�pRd�9)�
�>�	CZ�������5乥
0���@s̚K �r��&�ͥŸ����W�>k���ZI�ʎ�y�\#�Emɪ�ت5�d)��`����+��q��i�ƃ��p����)$)�>C���:�om���>\D �x���
�'���.�8�F�E���[d�@��%)�_Rd���A�� N�N,Σb����Hp�|D��RԖ.EB���/�r�N��JѨ�c	�k���F��_I��3�/�k`�.�6OW�K��x�u�{�"
��ϥ.�� kVD���-5�_8"��G�I��?��!�j߈
�QG;��1ৣ�o��ZO褣�
����3�ǜ�et�Ci��
�ZR��J��/��>�c ;�b `�����
9�ɞ1~:�1�M']��C�C����	� %2�&�i%�����dҚ~d�=6�u	ݸϩ TH��T
� `�w���6"
����
��*�����h[M
V�:�^��B�@�l�܋?���0
���Èmmۓ���b��WQ�o�9^�u⠏��9�'k
�S�o�zҒ�'��K��=>�=���m�e��r;�HH�G�h��젿Z��NJ�%}
	�
�
�H8
�Hj��֖�,�Şڐh���q�1��`+�GZ��$�yܯ�(\�*�mE
��ܬէ�qw��c������u
�NZ��vv�D���.�]yl��>ە�6&�uĎۨ~4JW�R�Ł�����>F
+@�?ei���XG������g�
�7}��U��ς=��<G�|�Q(�g�����4h)LJg��Z�&�w7�G+ۙ
2� J����gPږF)Up�
a�j������#��c�z�#GR�3�O�;��wI5%D�����-53R�U0�ю%�jizkc�0vj��7bM:b�����
+�b��Vē��s�f��ŭ�h���)��l��?F�@I��SQ�V�e��.q
+�ʚȺ�>��{��Q���~��G���Ě`KDkD�R��m��z�FE	��sM��N9/q^�R^�Q^����!���w`"��1�� \E���KH���C!R��I�;���9����%4��m���
�.����>���r/����	cv��� !�9��'+R�'�t��
	m)1��'��w��FtH�
���m��[�����(.����� ��1w��KAS�
l�T��#��V���=S'��+ȃ
/Uo��W_
7�|�h}Q���޺v��e����zxx@���x�����n��S�8�C�ޢ���q?�J�uǖ�-�Ӛ��,N���0����2W�)�����endstream
+endobj
+2987 0 obj <<
+/Type /Page
+/Contents 2988 0 R
+/Resources 2986 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2985 0 R
+/Annots [ 2991 0 R 2992 0 R 2995 0 R ]
+>> endobj
+2991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 428.6122 138.5077 439.4913]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000032) >>
+>> endobj
+2992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 408.5226 314.5657 439.4913]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+2995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2989 0 obj <<
+/D [2987 0 R /XYZ 90 757.9346 null]
+>> endobj
+1188 0 obj <<
+/D [2987 0 R /XYZ 90 642.1452 null]
+>> endobj
+2990 0 obj <<
+/D [2987 0 R /XYZ 90 627.909 null]
+>> endobj
+2635 0 obj <<
+/D [2987 0 R /XYZ 90 401.4125 null]
+>> endobj
+2993 0 obj <<
+/D [2987 0 R /XYZ 90 387.1763 null]
+>> endobj
+1189 0 obj <<
+/D [2987 0 R /XYZ 90 190.5698 null]
+>> endobj
+2994 0 obj <<
+/D [2987 0 R /XYZ 90 176.3336 null]
+>> endobj
+2986 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2998 0 obj <<
+/Length 2030      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�~���Sk5��%X,Н�-v{����� Pl%jK^I�����E�%O2)v�.�]�x>�|<�#i2��G�ϕP�0.���
���fĽ^��U������R�
2������I����o6�� �\�����ER�۷K�����n���/�]�����o��}����凛��'��,1
)����~՘�	F��,n"�D�����M��&U�\Q��5C�n�M�y�Sz��K�i��G�3� X�Fg���s*�$v�~������g1���	n0"���n�)ko��w��v��bq�b�	�+�4e$j��D+!ֈ"�!�a��\Q��d�4.x�.�Ӳ����`��t�m�0 ⭇H�
+⡐���[�P���=�Ș�a���j�VЮ[*�Q\�no
]��E�P
�����X�鮹�����{�l6�ƿ:1��Q"����0��q�Mp��1�� 4e��r-W
����?Z"�e;C�8��`dl��c��2]/�X
��t��aj	(%GL�
,�Z��Tj�b��6��g����GJ���J"(�
�fFUo��a�9^|L���6)�4���FR at h'G�[
��BÐdp
��y,�%���E�>�CN�ؼ
%�8�$�D�!i�)���B8�\趙ґk�� V�U����>���m:N3���i�f
�	�q��N����PY��Y�0��)
��!���9֚�t�]���\A�:�N��B��͛u�7w�]���B��~a&c(I�þp.���Lu�:e�&�����Ľ,��P��O��g�Y�X� �NkD��聾0B4��J�ӭ�G��������H�D1">� �B�%ƶ�
�������K&ǒ��ldd�I2y+���t��5��̀J
�!|�my@%�HfSE�(ߺݞ�7�0ߥ��r
	qt���%�6��?6!�[ъ�¥��-o?�4Km�M����{FߧeR�@=0������Vz0l�)�C����m��S���̈!*�n�[�9T���F&T1���6���}���[BDT"
D�dJ#3(-����
+�M���)|�6��䫋�c�	ET�2����nf
�;����&�0͐6���Տ��� �$��~���5�oz�����H�v���������g*tic [...]
+
s~��U��V�O�2�:��F0�ڀ��®�5�ү�Zi\����ή�n������
�1�����M�ረ�� ���U�?E\3/�G�	��"AL
���x����c��/0QH��֛�8�a�&�t���i�����h:�c
#�
+�G��͹�#/��T�C��S�݆k��!/�	��gZ^Z�t�&�N��˙���Q���5{�rfrD�˙��r& �+/g.�Ea{�7�F�"}��f��$�Ft��M7|y�!�1��uT7H(���U�C#T;�ի)Xc�r��v)�

R�������D;��A _������H�
���V�Ń	�gj���2@/ ��
�P4�2?�}o5��[4R���y�l~��hh���
� �G���2�fuuqW�k5����9��1�S,�aAk�219"g1 ��/DF�'I)��|z�|����B0<sBBBB�&$�!AbՅ
��w��F@}b���f	���ꄙ=~{����+���,� ��~���N��Rw'g��KJ�k5^_�$��g*���3@�1��
�Pi �@ Lw�[
����;B�F�'.
*�Nz�M����iR�Y�k�˴��\R
� ��4�6l `ğ�6��'x�Cg�3z�Θ������k����sW��� !Xt�a��)�g���
$�!�ܓ�(�K��.�`j��ǏV��V4�N 47P���/�X����$?$�s��h��L珚 *ޗ)U�F�9
9/�ZA=��R����������V�/�i�:]
�k;�X��뫫��'���!��%���~{���1$5��T�V�h�%~�V*�,��
�Ԯ�)����q݀Gv�E��{�
3endstream
+endobj
+2997 0 obj <<
+/Type /Page
+/Contents 2998 0 R
+/Resources 2996 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2985 0 R
+/Annots [ 3000 0 R 3001 0 R 3005 0 R ]
+>> endobj
+3000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 581.8956 138.5077 592.7747]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000033) >>
+>> endobj
+3001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 561.806 314.5657 592.7747]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+3005 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+2999 0 obj <<
+/D [2997 0 R /XYZ 90 757.9346 null]
+>> endobj
+2636 0 obj <<
+/D [2997 0 R /XYZ 90 554.7115 null]
+>> endobj
+3002 0 obj <<
+/D [2997 0 R /XYZ 90 540.4781 null]
+>> endobj
+2637 0 obj <<
+/D [2997 0 R /XYZ 90 399.6215 null]
+>> endobj
+3003 0 obj <<
+/D [2997 0 R /XYZ 90 385.3881 null]
+>> endobj
+2638 0 obj <<
+/D [2997 0 R /XYZ 90 244.5314 null]
+>> endobj
+3004 0 obj <<
+/D [2997 0 R /XYZ 90 230.2981 null]
+>> endobj
+2689 0 obj <<
+/D [2997 0 R /XYZ 90 89.4414 null]
+>> endobj
+2996 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3008 0 obj <<
+/Length 2217      
+/Filter /FlateDecode
+>>
+stream
+x��Z]o�6}ϯ�Ӯ
�~��ٶ@�f�/Ӂ��J��-��<i��^��,J��L2�>,�`K�"�<��4�0|Hdp��B�q�wW8z���]����/�_/����"2�H*��}݂$HPB���ÌD�
�1���<��]�z?�x�o��M�~Lx��������x��?.�����^��p��f ö�wg��L0����bh� „l
�:�Ļm\��Z3t���۸Jܝ�����=K�5�R����6z�Ͳ�X�P�$������G
m���_aČ�\`D����S�^l�n��ݵ�
�/��"�$0�!,�����N�o�7͡gF&|���Z5��>��
xEH
�`H)M�"����͜<ݸ_�G0lL�T
y]�����f�珛�(�bL�d���тi��Q�a� ��SZ=��y�P
l^5��+n���|�=_�>�7w�/4y�A�DF����
��Å�Hc�o0jJک�!Ͷi�|t���
�Q�0.�$�~��
K����F��]���zL���Y�H`#���Q [...]
1Q4��������C��b�p�!2�J�7��D�!�*�y�H�}���P����u�2��A��#8���s����os�=�e�3+��h�
�G0cw@��{RS��
Sk2~N�q	ceg$Y��ty�@�ZK�"E�~��q�KlkՋ]P�M
��Ɔ}��X��e��]�yE���q�dzJ��F�7�=V��E�B�������&"�I47
�P�Sa�8����ѤG��h&��<0��?)=y&
_���*�ֽ%��	S)�P���"븡db@��P�L����O#�z�2}�T�n���1HP�y?_�%+���DLt�|�F
10hL��6W�W
	iD�`a�
5g�Uc��W�v_"��#� �H\9�38�e$�#�
,/��9'"�g�!�����ĕĤWmH�eR�;v��~7|f�u|VQl��s/��MI�Q?����W6��<���e�"��bkEZ}3$�
�9{��eڌf���t��[�����?�g/Rg! u~�$\�;�	��+<GX��Gg5��Og`8< qTl-5�[�_R�Q�e�Lt�F��
�p�^,�]O�u��DX��SoS�8��!��v�#�:��%0o�����;ubG�=s�j�Ys��
+�8ԏ)
���יO;nԪ�˜��r�phX��'����
�R�y��w��S6�/"\�R0�*G��aA�0^=)�]��bT�&��vC&�~雩_=V�ZӠ��
O���MJ���6�L1��
��
��w���Z>����s���b�d	L�����C�)/��2�˳���
�����@��n|��%�
+"G���}XN �R�`��	@'���X�*�
c�`�{�9��#�5b7��<'���0���b߷:]���6���P��~�"\�;��+��
9V��p�����O�BY��Pi�����_y,�


b�PR�W�˧�?E���o���t�/��'��ۅ�-0�e[a�eSf���eR�u.Ĭ���!�
I��m
+�����EB�eDdϞ��6��TB|/���E�z+���E�
7!Uoȣv���js}����%:d�@iu��o�G*
+ֻ�*6�Eg4�⹟��Vz����s�./:����z�b�G�y�S	_�endstream
+endobj
+3007 0 obj <<
+/Type /Page
+/Contents 3008 0 R
+/Resources 3006 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2985 0 R
+/Annots [ 3012 0 R 3014 0 R 3015 0 R 3017 0 R ]
+>> endobj
+3012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 517.335 212.1242 528.239]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+3014 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 346.3398 216.2973 357.2437]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+3015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 245.079 483.2121 276.0477]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3017 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3009 0 obj <<
+/D [3007 0 R /XYZ 90 757.9346 null]
+>> endobj
+3010 0 obj <<
+/D [3007 0 R /XYZ 90 733.028 null]
+>> endobj
+2690 0 obj <<
+/D [3007 0 R /XYZ 90 580.1055 null]
+>> endobj
+3011 0 obj <<
+/D [3007 0 R /XYZ 90 565.5352 null]
+>> endobj
+2691 0 obj <<
+/D [3007 0 R /XYZ 90 409.1103 null]
+>> endobj
+3013 0 obj <<
+/D [3007 0 R /XYZ 90 394.54 null]
+>> endobj
+2692 0 obj <<
+/D [3007 0 R /XYZ 90 225.0042 null]
+>> endobj
+3016 0 obj <<
+/D [3007 0 R /XYZ 90 210.4339 null]
+>> endobj
+1190 0 obj <<
+/D [3007 0 R /XYZ 90 106.8163 null]
+>> endobj
+3006 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3020 0 obj <<
+/Length 1814      
+/Filter /FlateDecode
+>>
+stream
+x��ZYo�F~ׯ�S+�z��(
+4MR$���}J��h�(E�$������j)�I`�A G$��s���Hd��<VB!ø
ϗ#<���?�H�8��A[�����c���r|~�� 	�����݄D��O�L	���2���R<Y%���"
g��Y�ݞ�>{>;������듗���Ñ2��V���Hge�e�W�%&d%�à���0ϧ�:���$,�����2ʦDO�t�g|�V���y�*��Ib�����{<^@`_�0bF��
\`D����SV_$��џ�����W^a�$�2��`MbC�U�)j��q�
Vf�{�ת(n�Q.!*D+�̄�H+�K��+Z��b�J*u�"��'B{<��=�D"&�8�!�A:Q9=��"��h^īt�_��b���x�W��X��*͋���
�3J������0�+���ĭCGP��
+p�T2
-iJj-��4���})(h;��P�g4$@!I9߾��6�U���Eڱ�#�k���aGF����:�
������Noygu�B�`s��V@
�bj�L�nf:J2J�AG���CӍ%7�b�k海��T�����K*�eW|�E�$�O�'�"�(��H9��)t#��N�]�2L��[��u\��2�6�eb��Jz����,�7IջqU����S)<���hLܒ��r���.���<Zۊ��ױ�/��Vw�k1kF^,��7�x�!L��,̮6�(-zF��E3oD��1��
I�;Ɯ_g�)���ɡc��
+�����F\�z����1�0��q:_-�a_$��"B#��q��!K-�)m+`ogW���z�
+-
+��r����ϣuə�@4��3 J6ߖ�^��@e��������s�>�bmĬ�gQ�3
z
+�v#x0@����{:� V&��UM3k(i��W��"�9ag�B��,,VY��#
		h��𠯭A��b(�UBc��
�FʈtAk�� �1�
+?Xڹ���
e�F�0�����v�6=�o���y��gכ$�VR��F��IlyX+I�]y(��Fcȗ<�=
J�y�+s?
�?1�4͟/�$�vy;+?@.�N���f��liXd�|,�oR?�%F!�ԣb�r��r�ʸ����ad� �0�h��Z܃]=+�D����FdG�zƸ�Vǘ�@�z at G }+7Љ�
+t��QM�N�n�Y���P�Ә
�Z�
@9%�ʩ!�S.�{��H�$i���>za�@�<f�4�J�j�c_!��C
�’Eᇼ��a�c�!m;���w�
���wb]#���7Tۑ=�� ��<� �?�S��Ĺg��S4b��ވ�8E�7���T�7@���jpxC�
�P
+��������yh~C���۞�M#��t�88�X|O����ʡ5��{��v����Jk
��/g��p^ܙ�2����Mq�D�o:���mIE������格r�����Ӑ\	f�aG!l�ŽԲ��-��K�
��V��(����"���..�[A���S���"�D��}�,?_*WW���&�)cg�;ʛ�A� v0D�ťv��L�^� �[�b\?QlK
fBA
+sr4Qt-�ޞn�؈ݏ(z#�#�=c�D�c�S#���AB0�Q
ۭY
+��!m�%5d�t�p�pe���QmD��ʇ7v۱�[]֘[^V�[^��GٷS!&UW���0١Yyh��=��x�ETY(@ⱋR��e�:Q*��3�?��s�y!h�Q�Mw.��Zǯ�b}zrrss��9ڤ�:Cqq�^''�vq�N
B��^��l鄟C�J�uǖ�UVj�ʚ����喁���6�Ô�l
m{endstream
+endobj
+3019 0 obj <<
+/Type /Page
+/Contents 3020 0 R
+/Resources 3018 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2985 0 R
+/Annots [ 3023 0 R 3024 0 R 3027 0 R 3028 0 R 3030 0 R ]
+>> endobj
+3023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 575.5123 138.5077 586.3915]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000034) >>
+>> endobj
+3024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 555.4228 314.5657 586.3915]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+3027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 251.5244 138.5077 262.4035]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000035) >>
+>> endobj
+3028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 231.4348 314.5657 262.4035]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+3030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3021 0 obj <<
+/D [3019 0 R /XYZ 90 757.9346 null]
+>> endobj
+3022 0 obj <<
+/D [3019 0 R /XYZ 90 733.028 null]
+>> endobj
+2693 0 obj <<
+/D [3019 0 R /XYZ 90 546.4564 null]
+>> endobj
+3025 0 obj <<
+/D [3019 0 R /XYZ 90 531.8861 null]
+>> endobj
+1191 0 obj <<
+/D [3019 0 R /XYZ 90 429.1153 null]
+>> endobj
+3026 0 obj <<
+/D [3019 0 R /XYZ 90 414.545 null]
+>> endobj
+2694 0 obj <<
+/D [3019 0 R /XYZ 90 222.4685 null]
+>> endobj
+3029 0 obj <<
+/D [3019 0 R /XYZ 90 207.8982 null]
+>> endobj
+2695 0 obj <<
+/D [3019 0 R /XYZ 90 95.2295 null]
+>> endobj
+3018 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3033 0 obj <<
+/Length 2620      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���S+�x��-��f��n�t��%
ڢl����
���
�s�!��� (�}�I
�s�̹|ߐKf�#3�gJ(d��������\���%���
+|wuq��3���rv��5H�%tv�y?'�Œ`��oϓb���.(�vOw�H�?g�ER<�V��y��.9��W?]�@HG-1
)��a���	,�(3����(1�0![�?�T��.)�Œ
+
�
����.����/�6-D���n)���X�o�|�ڀ
+&���.���
��
���b�c�l�)s��w�z��b�";gc(CX
+�71�T�;�[�0n��eF&b���Z���1͓��J
��B!��dr'����~��s�6�Ɨ���
:�G����#B��p?��ju�)�K+6[B ��|��
0B�Zd�m;鴆��n�&����9�e�\N��k�0V/�uv����0*�Pڸ�<Etp��T�I+h!HSⴼ��]��Aؿg�%�1n$�TA^q^?�:�m�V��Ax��
70�����>����x@%�x������eX�$l>�B75l*n[�_:�������Z�PKH�sH��?�
�� n��9�k*^��3$�q�FB
��k�<�7��H+��4
�d�r]�����X
+�(E�9�eWj�|�A�VХ("���⛏7�ʠ�W���)FI���	/=�W�З����Z7�j�Ze����C��6뤸�ߧy5p�h$����:� fH2�;p��8��}l�_�"�Kb�d�F\j7P����
BX��.���?&Uv�KQ�.*!E�o/�B�B0���8��0��L�!55��;F�[���k��h6C�@�&�W`6:�a<Q�Ο�eqͶO~@+���ޗY~��9\��ϝ�r��%1�W1�)���|f��L��|�A_�ʱbNQ2hk
+*M���^.���s+���Gfs_���O�jy,�2-
 ���7	�7���am(�).z����:�52H�~��j.}%�Z���Y8���Ta�%p!�I�#
�`�?nc�
+`Oj���dW�u�B&.��9Z�y��
\Rn^��
+�h�B�+,l�t���%�]m�xzy���b
up�AW�F
]�q�!�5�碎��	�1�"�:��硎Ɉ<���3q�8�E
��8�
��zy9�a�Q�@��3: ��j�a
����O�?���hD��I����a.�
>	Z��8�x�0��1�P4�Y҂����D���|�`5��L��z!��zmZN�
�'���-�֎�<��E�'dx���[ۍ����?�9VRd�M�!2Pf:w6
�"��$�!J���1�@@R��|<6�e��>��"T#
�՗��"&5��'{k��CZG�&�����$��ժve���
�EL
���ݤ�a��X���D�T��w�C%(��"�a�'`��f�ׇ<���AX� &H�Z0�p	�G��c6zL�i�E/�
+�fS�$��{3�
�9㜤�_v������M�>!i��Y~S,}��`1�;Շ_N�+�i�
��_ �}~NŝJ���
�E��w���|{�� ���'�c�N�Ń
R�1��Ђ2�o���o��=��V4(�a�kA7KD�?Z ]zHe1d���Ms��)�'�^��j�g^v
�4�Nc����4j�1c�6�H�+5��8���=KigLM
C��^́	�7�$���X'/�#c��Q\礆f���	��
+�^9$
d�;��}��n��[N:�
5^�$����a@�A�V�BA�ρ�M։u39���Ť]'5�F��IB�>�9���.��:٧�r"j���T�:bSQsb��
��d`Դy'54z �҄�}�~�R�|W��Q��Nt���xWa
�Jz6���¾#[��>�?NF�?������.�Q��c8�a	��
�>�
CX��M�
+�Ej.7jx*��Q��6��g
��n��|��5fɪ���D�^`1b���ER���@?Gp�xӵ��О�&�|_��i������!C<D��%����o	8�Ƹ���ߖx�<�xC"Q�?�w+�
�6Fx��)ʻxL
=�w���y7�N��}��&�/.��=�
6��-�@Ri��o�`�,M���ƿO���W9����%�	H�}}FN�q���1���;$�v��f�ܛ3�Q��k�B+u�ʡ]sઁ7c�>�u��}˽�"�jA�5�S]�m��������@�R�杤�%IC��s�c�[!nt��/�7Qv��/Z�R�@��
���ẃ	�<�$���)�=��g�=0�߁�/B����ʪ�j���W�Rcr�KvŦb��N2�i�����x`�
0p" )�S1�BSk����S�=������/��	6�lN4���D3� ��٤;f{j��N���<�=�g�=p&N�g���o���Iw��}a�,z2��X���������ھ�z?��t�վs"�aom?�칽t�l9ts�2-~�b���oI~��?^{�� �����:
U��  ��cޥCp�$
P� Jͯ���������e牦��Βz���긺�|||D7%�ϳc����x�]���,n����-���� �
ڥTX�l]-����n� [...]
+endobj
+3032 0 obj <<
+/Type /Page
+/Contents 3033 0 R
+/Resources 3031 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2985 0 R
+/Annots [ 3036 0 R 3038 0 R 3040 0 R 3042 0 R 3043 0 R ]
+>> endobj
+3036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 690.3327 242.4868 701.2366]
+/Subtype /Link
+/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >>
+>> endobj
+3038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2748 582.4205 293.9708 593.3244]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+3040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.3316 438.6427 235.5982 449.5467]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+3042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.1511 227.0685 244.3447 237.9725]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+3043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3034 0 obj <<
+/D [3032 0 R /XYZ 90 757.9346 null]
+>> endobj
+3035 0 obj <<
+/D [3032 0 R /XYZ 90 733.028 null]
+>> endobj
+2696 0 obj <<
+/D [3032 0 R /XYZ 90 644.4124 null]
+>> endobj
+3037 0 obj <<
+/D [3032 0 R /XYZ 90 630.6207 null]
+>> endobj
+2697 0 obj <<
+/D [3032 0 R /XYZ 90 512.5899 null]
+>> endobj
+3039 0 obj <<
+/D [3032 0 R /XYZ 90 498.7981 null]
+>> endobj
+2698 0 obj <<
+/D [3032 0 R /XYZ 90 301.0157 null]
+>> endobj
+3041 0 obj <<
+/D [3032 0 R /XYZ 90 287.2239 null]
+>> endobj
+2699 0 obj <<
+/D [3032 0 R /XYZ 90 89.4414 null]
+>> endobj
+3031 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3046 0 obj <<
+/Length 2822      
+/Filter /FlateDecode
+>>
+stream
+x��[mo����_�O�T�}1���]��H/n����h��D�����w��v�%���ݡ��z�������xLf����3%2�����
+�
��]���%|�
�����V��AFR9�}�W�	J��v�fN��%��_-�g�6�{��x��<��U��}_������櫿޽^g�|�����o		�%�#e43�lD"�#�
o%n�D�����'��z�
�%V3t�o���7���?�Ղ�y^��G�3{�vѫon��Z�
+&����޼ų8��+���b�o0"�����S��l�^_�ӯ�|Q?�:A�9C�R00�!N��9�����9hfd��
+)�U+p|��e���i�$�D�(1rT"n�;�6tvŪ]�%�D1솒��ĺS�/9��	1[��dp�gnn
�2��M�s���
~��]��
�[����X��`˪"{�i7`T�#-�[�CV�"�!�[�?@x2
�[�ʻ���w�Mbe-U��*�
��)�(D��~�+�f�e�Uw���o.�� Z��~�к�F j�q�lGnOlL#*	;)�_��ڗ�E^
�UV
77�Iw�
�eM�TH�v���ݶ(��.e�k��?���ƙhm{(�ven��d�!Hm���V�4%.��)�
��m#�
��A�r~UH�����q<�6�):?�ih�TK!930K�����e��8$,�{$!�z��Qچ;Ul�{H�Ծ<G?;C���8��U~������@�u���
]bȸRCAc�-���걕�!H�^~>Pg�Ȭ��־�aAż��������
J�
�:%�K��ѡ1Z ������r�
�Y"ȇ�M,B+3c���(�H����B�
�ЂH5�n�U�$�����r�ƨ���9�|­�
. =���z�d��.݊�p��A�u^���6ӻ
��� 2��	\���m‚;Z�U�81(Ʉ��y,Z� &�ݬ&�}Q"q"m�
�,>��w��
+ԯ!-�V��y��9�u f��2�
ql
�MB�
t�
�0�A�E�q�D�'�~3�
�� �p(�6m��<�yu���&�"�?��g���Z�

�
ZJ�bP�#�#cNb�]{����ة�W6O
+o��n�c�j���Y
�U���]\SQ�����#�M�:)��VYy���~�𾼷��]
	�I�{>99s��C0����������c3�48=�|;v�F|�]I�|���‰
��S���uR}�
O@|
+Ib����-���ҡU����Z� b�j��a�B-�
+�لSC��z�D���a����T_}�[	�/t�z��Ў_ƻ.
^�3��C��L- �1B���O���ޜ�,�R>v�]+N؉Y3���MQ.8�G�{�ȪG���3�h$-�
��������#cn������xHu�
�z�Dj��IO-B���9h�Wdn�iP��n�C�'(�CA���
�~/�S\^����A�T[�*�l/��Q�4q
T@��C�>��.%w��
Դ��;g�8e<�n�w�5�ګ����! �XJ~���ʌ�Ĥ������F:{l�v8V��q�vr��a��I�)�-�
�(z1&J_��������L���(nD�D���};@�دR���\J�,߬)ƒ"���ʁ�pMe �*bΣ�Tg�fKM��rK��䊁���Nm�0d���Uz���3g�:�
^����T��a��:A��L.�Dub�:^�y
���b�$"v�VO�.��"I�@��
+�
�4�ӛ v��2| A����;��Ď��ki�خ.����DĎ���9��٬d~H�:QFjF9���
��P�Q�8����"�� 
�ER�n)��az���1J�@�+W
M$�l� 7��8g��
�i#ԅ��AP9A��RÍ7��H(�?�"I0�|�,I7�^,(	�zHlu1
ݿ���%�~�^ R{&]�鈔@}t��b#.�bgP
�=��Ӝ�<"͟Hy0%��O�"�
*m�x�lB����sm��X�����̞���7?��
@�&�|ĝP=vh
ά��4�=���Z�ۡ%!֦�x��K J�5����
�"r�Ӻ�I��:(��}S�G�F�p`b
����5����$���k
�}KơoÌv��%p��3�C!+�X�rXI_+[(� g�9([�=�r֜��6�9�N���cvq7�@�q�,!��M�`�ࣽ��8������,3�#f
̯;�p6f�]�a�f
��y`���${.y4� J�1 ��@D\f�,���p{
:���Bǖ��bF�S87�踕_���qw���Cm�:fpW c�v��q+շ&F��&I
31����
$,{�ԃ��oj�Ґ���%9�.0��\�k�N�1�0��'hw��;�!Q�ʇ�=&��Q*�E\f؁�[<Q�R0O "1�`>���
� ��S�4�=Kҝ���z��i6=���M�>@� �{��bc�vbg�=�Ӝ&"͟H	��a1�@l�Nlr�a\��}��M�>Dz��",F�rʩ�ؘS�ع�����CO}z�!R��} �W�
+Oe�@j8k
+R���?��I);�'��>���ȉ����c"c��>|�}��}���0H�,D��a��E T�i��p�M4�x��#�
��&D�5�o
�Լm��Ϳy��`������Y�V[���.�����!�Re�=��	���{��j��@�����ܫ��6�XO4	8�X�u�����������	�����W�8^����
��P��bc���B=["�sH�Ra
���bu����(J�p�%{�z�o�� #a)�endstream
+endobj
+3045 0 obj <<
+/Type /Page
+/Contents 3046 0 R
+/Resources 3044 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3055 0 R
+/Annots [ 3049 0 R 3051 0 R 3053 0 R 3054 0 R ]
+>> endobj
+3049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [326.6123 677.0988 384.1894 690.0166]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.6792 452.6838 395.1716 465.163]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [337.3823 239.9131 394.782 252.8309]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3047 0 obj <<
+/D [3045 0 R /XYZ 90 757.9346 null]
+>> endobj
+3048 0 obj <<
+/D [3045 0 R /XYZ 90 733.028 null]
+>> endobj
+2760 0 obj <<
+/D [3045 0 R /XYZ 90 526.6272 null]
+>> endobj
+3050 0 obj <<
+/D [3045 0 R /XYZ 90 512.8391 null]
+>> endobj
+2761 0 obj <<
+/D [3045 0 R /XYZ 90 315.1352 null]
+>> endobj
+3052 0 obj <<
+/D [3045 0 R /XYZ 90 301.3472 null]
+>> endobj
+2762 0 obj <<
+/D [3045 0 R /XYZ 90 89.4414 null]
+>> endobj
+3044 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3058 0 obj <<
+/Length 3001      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���S+�x�5-ФI�4��n_6
��h��n��u�_�3$g8C)o���>�$
�9s�ܾ�4�`�G&O�P�0.'w�+<y���"��9\����\]/�� #����W+H�%tr�z?%�ٜ`��ofO�r�-��(��7��|Uf˟��2+��o��|�����͏��,K
G�hf�U��E"�#�
o$n�D������.��&;
gs*0�f�4�
6�)�y�����i����g���W��x�5L�_���'+p�W1���	�`D������}�\����_��Pݐ:A�K�2��`�`C�7�sr���Ms��Ȉ�R\�F��|�w��B��ɓ�i���QP��Q�?����f��DŰJ�v�N�?�D"&�dn4B��}D�Y,
�]^f���|���Ƙ����b�=T�d�?c�����	�B��T��\~�K#y<�]-��Z�Q��
+Ι0�u�>�b�"�]������!`�����~�XbbF8������M�P!B���x�b$�a�mu�h6J�7j/�6J�F�s�Io�!��id����WB����,�P
����ΐPF�cHRΫ;�
�>�Z0̦�}}#
��1.�7��
M��i]
@tF�L^�<�.~���}�H:����Y�_`q
}*N�چ2?
�Sm8�v�:�E.TD����)nz��T>42o������
U����k���gTL�Tsv�Q޳�$	�
�:��K��ѡ#1E��AE�l�32m|
+
�TL7�H�O9�6��,NN�w� �Z14#RM�ka
g8���h5G^��`R��0��O�LUO�m�#���,s��c
`>&���WL�s��X���34��*_�_n��	L����
֥8FҐ�~��*'�kIANq�� '4��
W�Ta	ai���nӺ�=�����'5
+�SҀ�!^�oI�hC�٧]5�
�zb��<�/�W�pU�X�ͺ�6�}S��ٮ9�c�j��i[���)t��+�a�a0�A�%mo]���̉�aif�O�f'����G�.�
��k�$��2��3��F|�łn��Ć<;��I��v�G at 3�*V�:�xX_2~\V
�ӀFS?�N}!A
+ƥ���~����F�>�|�ܺV
���f
O�Ţ��8�~�I����q��N=���I�ԨG�Tߘxh�071�
s�.�����x&�"5�p *���
.
���8�:W�ކļ�6�=@z�n�����D��)�ew���qj��/S�`@�Bw���2�]&rT��Gy��=*��f�h/��5�t*��ә�Ӊ{��m0���b�).5uj2,�HM��a�H= ��!=�i|c�!/<�����4_!�T#�G�X,n��;����z�b
+����S����J*��OKqde���O�>��)+��V;HJ�
��Z����w�N����.s{g_+ö;�
�u3���'�
 3V��:` S*I��������]�vy*��t\,*S��m!��0MH���4����~[��>e��V�����D�ЈH��km�/j���܆D���%��b��A�*
�ӈ�j9�����/���𘠂�Vi� T�4� ��4��_�ik������+W$�4D,�p�

8��𴓟�7$�to]k_Sejk:S�9�9L}�BZ�Fv�	/�7Mh��#v0
9)p}�ۊʚ��}��¥�/i�.�c�a
���f��ճD.
;D�d��/9����k���1�U���L�� �2�
0da�~؞�)��<�@�TT��'�P�A���^�lSc!?sL�VDM ֪
��6�4d�ATq���	j���y�����	���?@��<\�w~^/D��J�_�z�"g��,�p�9�+��0\�22͠�R�"�~�t�H'�1�lZ��ֽPOge��� �-on*�~y<�`tm�����zu�z��a*hĘ�3=s��
M1aa�:���+��We
+�i�b��
@˲�P���Hc�mj��7׫�R�
^��G|*H*��4�k¤O�p�h\����x��P&V�b�>
�(XD)e�<��yԉ%��H��⌡��wR}��W� ��"R_y��<u�n��j���pd[%t�>��mA�;*.���
���
B%?����!
[s��{�`9[W��"�*��09-wQ}Z��U1ܜ²�ylb����j��`7�`B��ðE���|XJ�H���HG��m|بCZ>�gL���	�01��y����P`�F��F��]��
�T�l4*
�)
O+���Bl�
�*�$@
+Ιn��В �'��|�v��ꏝPM�;'����:LƱS��M��Q����9f��y2��'}��񈞄Z�?ż�!����@�5�`;ɪ
��
�Y��G�I�XE���?�_5�����9�O���d�W
�u� ̿�$��o�)4�����8��80 I�A�p�ħӀ��;�Ʀ��qIy
�ϐ���
�_��3~P�4�at��P�٤?���_��Se�C;�)Wt?�?�A^�
�dQ����K4���h�7�2�C��
-�&T���F��
�B�%� ,�8G�9�yxC����~`MD��ä��F���=ү���~
+a�a��S`n>+�gߥ�~M�ey����,9�L�~N��l���n���9?�T��q~���~p���MҏH�H���/D��K�~*��B&ҏP�$9���Rà�p<-.��/e�2�Y�Ff^�
�7�����Ms���*�G0 
Jΰ*�Ԙ��0�j
��՚��B�_��3��3�
�F��^������_Wo��
�~�����L�d����(,�x�3TF"!� ����hkD�7�v
Ț�����+XV��1/?b���e�GǕ�Q��]
+*�G�`*�PU�aS�.��]TC��^���k�>��ݬ�a
�Q�o�ֵ_�N�������;��]q(Qq�>
6׽�Cͣ�����
�l��_��� C[�]�m��)v�㶪p�FU�8�7�?��Wcendstream
+endobj
+3057 0 obj <<
+/Type /Page
+/Contents 3058 0 R
+/Resources 3056 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3055 0 R
+/Annots [ 3061 0 R 3063 0 R 3065 0 R 3066 0 R ]
+>> endobj
+3061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [342.7227 678.3775 400.6078 690.8568]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 448.3104 422.9245 463.0258]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+3065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 176.6287 425.662 191.3441]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+3066 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3059 0 obj <<
+/D [3057 0 R /XYZ 90 757.9346 null]
+>> endobj
+3060 0 obj <<
+/D [3057 0 R /XYZ 90 733.028 null]
+>> endobj
+2763 0 obj <<
+/D [3057 0 R /XYZ 90 524.3147 null]
+>> endobj
+3062 0 obj <<
+/D [3057 0 R /XYZ 90 509.7444 null]
+>> endobj
+2764 0 obj <<
+/D [3057 0 R /XYZ 90 264.5882 null]
+>> endobj
+3064 0 obj <<
+/D [3057 0 R /XYZ 90 250.0179 null]
+>> endobj
+3056 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3069 0 obj <<
+/Length 2531      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��~���S+���/F[ ��ݶ@�q���A[�E�Dq%*���{�á8�h��IQ$E
,��s�9s.�9!�`�G&O�P�0.'w�
<y��� ��9<�������Q��AFR9��oV�	J��z�nJ��9�O���f�uv�fF�t�zZ�mv���v�m��������eV���?]�HHoYb8RF3�aW��	4�(3����,baB�:���U����T`X��i��VY��;?���vF�4/���L�^�]����b�A���뷋w��d���#f��<�F�:Y_p�������?�u܃�عp�\*=�3����cRS��p��!,��Ш�

+)0դ��X��f]�Y��wI$`�`���c�^j�^оz)�M�ꯗ`fF��,��f�ޔ��{8�����m��Q1}̷\�����[��;\�C+qo_�cZ�K�3"��m���rw�����$`}���;�7B��A8[9���yد�vw
�z�~-��&B����
 [�[�#v�hh{-&ZM$XM`a���B��8x�A3X
�9x�E��ǻ��[�]������>�}$"�}�����WWE9�`�lU,n�mk�!(��
K���	|�b�$������yS9����M&�}p�
D��d=5� ��he��[��9�i~Yo>�H at j�ؿ�����G#J �Q����[��
+}Y��9ӭ����i��aI�p��j�i߽欩
���!�b�CF���%e��JıW�m�@Y�6D�E	�����v�>�����$�!&�*�!��b٘��ʮWnڠ�ܟ]��
��#�!��A��,y�$��I2�-�H��c�i
�SD�b]�F
qՖ��׻q!���=V�!����������`�X�2�
kс��f��w�6Mn��[�e��"�x�U��Ɛ�N�K�H����n|��|K� 
�UV���
�C�2�䕻��Rb�!C��y�:�'��I
�8R���Y��(b���GH/�x���(WE���8��h�
���($)w.���a��&w����se��tX��`�jq���i_74���̇%�*�5p
+
 �-a�������W�:�y��H1����:�;��j
u�
�
ji'uB=���c�����</#gcɔ�3�ĠJ��z�DZI�k��-�J��j���G�fa}��,
�$"���iXLy���P�iX'�<��ȁ����iX �O��5=�p(j��
�)/R	/���5=��Dk7�Ֆ�
���
�n!I�v3�����HbF�ۮ���M @�I�@u��C�d�������{'J

+��z�U�?��s�d�&��y�
�_�;8Tp�}i���z ����8�Z�P�Puu8���#�h��8�D�ϓ�C��?���|]��C� '������k�lPs7Z��͈�@� xs�iHE��	$@o��J"9EE�W�H���Ш*Ex���S�4Dse�M�P�|��#1 	:2B�#�Xg�@9�s-|z���Xi8��`&D�P�+�����jwJ�I��
|f���1 ꬍw��܇hYg�M����\R�Qџ�%��?�N���Ф3BR�e{�=��1z�C���N !���z����
�̆������Ve;\��	-��jS����G����Y+��殛�n��M�����l]f��.
��r���+6Yخhَ[�X
�7���ʛ�b�18�y���
  �K��l��б�4�m/���S*̓c�i��0Cm�9��;�yO>b���c����a����I�
2N np��P��U�
 -��}jQ�w˲�m�'�+D���i_�x>e �R��n�b�A8B�N�y�]�"��n&��`���
[;�[;}l,
��:�@��xǢ��-�������?N�-ۑ�<�P�zO��
�����TƠ�;�1�l }�H7oH�y؜�KUؗ
i=�n
+ɌL}�	w��5�6_z������L�;E�ݧ�w1����D��-���l�5X�CW���%��%�ل6;�b
�UWe�����
4���5����_EM��
e��
t��D݉=��1
m��H�:@�u5Д mT��	__�8��~4��'5�1 	�7B'}�X��N���@����@�7�@[�k�>�@��R����,P
��j/5V=�5R��P�+��}
l��}��˻ K�3p�}%Qo�y�q7D��O��/�0['�/ɡ�����'�z��ށ� O<�{��6ek�*��̸�>Ɇ��9�E�l�K�Ћ��ݤ�v������&����n�'�n�G�p����M����{��&�wt~�F�
pT�<�!�c
�i�����t��A��=��)O��őP�bϛ�$-r����'8�oa�3��[@�+X�ձ
s)�>o>��P��	J�:�t����}3m���vv��^�Q��lG��_�|����|����{����h�R@[��mDVۜ*{ͷ�o�qOd
� $��{�����[/9��7\@�ޖG�ڍ/뺺��|||Dw;�/�j��������X����K`~�+��{_���RE	7�M�6�曙1�� �࢛endstream
+endobj
+3068 0 obj <<
+/Type /Page
+/Contents 3069 0 R
+/Resources 3067 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3055 0 R
+/Annots [ 3072 0 R 3074 0 R 3075 0 R 3077 0 R 3078 0 R 3079 0 R ]
+>> endobj
+3072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 578.6608 322.4458 589.5647]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+3074 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 461.3197 355.5118 472.2236]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 389.7229 268.3399 400.6268]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3077 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 260.4266 355.5118 271.3305]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 156.9494 268.3399 167.8533]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3070 0 obj <<
+/D [3068 0 R /XYZ 90 757.9346 null]
+>> endobj
+2765 0 obj <<
+/D [3068 0 R /XYZ 90 641.4313 null]
+>> endobj
+3071 0 obj <<
+/D [3068 0 R /XYZ 90 626.861 null]
+>> endobj
+2766 0 obj <<
+/D [3068 0 R /XYZ 90 524.0901 null]
+>> endobj
+3073 0 obj <<
+/D [3068 0 R /XYZ 90 509.5198 null]
+>> endobj
+2767 0 obj <<
+/D [3068 0 R /XYZ 90 335.1522 null]
+>> endobj
+3076 0 obj <<
+/D [3068 0 R /XYZ 90 320.5819 null]
+>> endobj
+2768 0 obj <<
+/D [3068 0 R /XYZ 90 102.3787 null]
+>> endobj
+3067 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3082 0 obj <<
+/Length 2881      
+/Filter /FlateDecode
+>>
+stream
+x��[m�۶�~�B�Zi&����͌�&MӦ���/u<7<���D�d��|��
���r�|H�3�H.���b�y4�`�C&O�P�0.'������_�x��C�o�/.��bb��TN�?�#H�%tr�|7%�ٜ`��ofO�j�ݼ�Q<ݬ
��e����������꛿ݼ�϶������2����
̰���	4�(3�I\G1�0!���g�x���z6��h�N��v�5yw��C^͈���n)��U�A/���
sL믏����
��F�h1��F�:Y_p�����ۋ��q��
�u�=fa(CX
+�1$�[�����o��fF�WHq��@���lm
�Lt!� 1*�����d#gS,��G|$O��@u<�0"a}������7s+9�3��z2�0B�Vh_,�(�n 䊻�������MY7�ejZ\ l��7�
�$`	�M�
A(�C|5�
�]i�/;q�kD�w����V���}�mO�Io�_��p����G��(%�
�D��ԫyW�����w���T�\�	�}�U��.�4��;8�ڻ���
��&�\����X@%�x�Ԫ�ޭ\�m>t�.6���tf���9�*��"�!��eUwN�A�����
m�
+m
�k��6Ӽ�0��0���0Nh�Q��RgL`�R����	��҄��Z�����e,�$�J�p��኎��![@&�HAӒF}�
͇R㺢!bcI�8��d5�
E�ɫ��X?�)FIԀ�!^zl�Q�
)�0��N��PHtR�g��JG���h*}�g���ɚn��Tt�i���X<�<��m�o˲�
+�4�ˢ���dp�~�l��!��
+��r2����
=,�@,����!���(�����K����H1�
�_�����DL7ۦؔ��^��vS���#����̉�b���4�6B�ݮ��y�l�.���.���r���Gl3�
Ѣ�n�bu���bwW�
+�(�3Bt��vug�����64lu�B��#�nW���
X^�ہ�3���χ/D�=w�:s�EsߗB?���X�q&��;�/u�*
+)
�+
�Z����/����.� �dV�E�$�U�R���1D#�ʷ�y���S�؊#+�[ыY3�fyu	�Ctf�by�Uw�u^6#���U����fH2�
s}_m��;�\�j3�#�yaؔ��*Q�5$$��լr	}Y�
kX�yQZ̕5ly����a�(� � l���#_���
G
���4�
(:����>�/ �C(�">V33	��#T�s�NyB�*�E�/=�S@��ɕ��M�����V���;�z�8I�;
+�+AS��90�`���C����1��Ҷ���w�ʩ�$���?+ .��ۇB��
�Ŭ2�{}QG�iD�_�mW���Ek�3�5�$դX�7�� b�n���z
i��'�Wn��2����w�F���P	s1��iF=�z���:���g�"�
s
z�3&P�����&t\��ɝsn��U��~��M��@L�M휺����c�`a)���qԇ��P�١Tu��V
�P�0�
+S��5�5�Ií�5�ju@���־a�T����n�-�9��m�CQ�UC�Ӡ�K(���'Q՘	`5�$��X��&g��#�q�(��RUNaB��a���":�Æ
QڭB�*{���K5�H�u�kkWQ���0��
G
�c� a18Jm��_�(I�� @WL���@,��^�
�Ok���5����[�O�������h�h�?|!����3�h�I���ʳ���'��2V2e�P
�N*(D*�h�ӝ؉##�;ы�:�tȁ����������~��3@䜼ti�*2�@�����`����V��O�?�:0�x�>��R�

+U2 Ō���t%���
��i�I�e����/���
DM�0�b�m0`a��xk�~�ֆ�$��` O��
�.��QoÎ����q)���@u�����Ϊ_�V��54̝(.h�U�;��3ά�|�_t���Ț=����
�BZ���r
��O�_?	zHs��g�Vi���o�Aܽ
���(a5���o�Œ
0iB��������8T=�t�f��+g�jS�{�#
�����
�Ui�K���v<f��l�ynQ��ixl�-��%�����
��Lh�`�h��'�
v
��a�P�4��=i��i��1�fdI
�x�4O����GJ�
<P���+ӑ��l�����>.������3�:
<����$4,�)O�Ȋx�x�_��
9��1qX
�G8��X��:d�D��3�����M�'�+�vV�z���ê�`8��M��tm���j��C���ـDK۸ȫ
*x���6�7��
"�	
y�"�
&���3s�ge��t���M�:�ҵ5V�~
m[��Y�UQ
���P
+V�0t
A�|*6;���i���v�y�`K�[;o�l�ʳ�D[H!_de���i;úyÏ���������bWUy�O�
&���u�,�
�:.
s"4R��� l�/�SSp�;N9F(��VC
0#S s���
2�M����tF���i��HR����[?��zXv��
+;����
̋i
+�/�s
0ξ
+��9[{<
��3����:�ϧ�{�ǒ��𤨣-X��QF�A+��a}&�a`��zF?
��"�
���7O�eWvk<���
H?~�!m�Z;,�4��Xl����sw��sw��:��<b�Z�?f�.[
�h�׮�.x�&��!P�B׆��|�ak��8d��K��_&��Z��
��]�Q�)�Ƶ�o�����~�G���b[���d~9�##CK���
�l	�ϡ>IQ5��+'���/Ņ=�\��b�$b���=�nendstream
+endobj
+3081 0 obj <<
+/Type /Page
+/Contents 3082 0 R
+/Resources 3080 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3055 0 R
+/Annots [ 3085 0 R 3086 0 R 3088 0 R 3089 0 R 3091 0 R 3095 0 R ]
+>> endobj
+3085 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 690.3327 355.6614 701.2366]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+3086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 620.9785 268.3399 631.8824]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0082 495.1741 276.1434 506.0781]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+3089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 398.5652 268.3399 409.4692]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0107 272.7609 513.9963 283.6648]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3083 0 obj <<
+/D [3081 0 R /XYZ 90 757.9346 null]
+>> endobj
+3084 0 obj <<
+/D [3081 0 R /XYZ 90 733.028 null]
+>> endobj
+2769 0 obj <<
+/D [3081 0 R /XYZ 90 569.6115 null]
+>> endobj
+3087 0 obj <<
+/D [3081 0 R /XYZ 90 555.3295 null]
+>> endobj
+2770 0 obj <<
+/D [3081 0 R /XYZ 90 335.243 null]
+>> endobj
+3090 0 obj <<
+/D [3081 0 R /XYZ 90 320.9611 null]
+>> endobj
+2771 0 obj <<
+/D [3081 0 R /XYZ 90 89.4414 null]
+>> endobj
+3080 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F25 348 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R /F108 3094 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3098 0 obj <<
+/Length 2578      
+/Filter /FlateDecode
+>>
+stream
+x��[[s��~ׯ�SK̈́��_4mgl'n��3n�>9

D�&�� ����,���%9iZg� 8�s�ܿ�0�`�G&O�P�0.'���|��� ��<��	^�\\��bb��TNn>�+H�%tr�x7%���O�\<-v����%�����\��Tw�b�x}���۷�Ŷ�|���kBz�Ñ2��v�?9��3��2�;���"&dG�K�Zu}9��j�N��vY4���m���]=-�s��8�Wi���&h�S�`�X}�p��=�,@��\`Č���1�NV�2�cy���_a
��}!eA�9��
a)X0
b Yg��oo�7́3#�+��V
A�-��
+��[ՍI�i�,�
�u�M�p
>ύ0�B��Y��d�4G��I���zY���\��,�dƔFD���d� ��^)y[�����Pmַ�~��5������ͺn�O>��!�5χ��!ҡ�5�P�-�Ga�@M�p{L��?��˙�j�(���宨�������m=ɋj�(���7��	F���V��‘�>9�I".$�fr��;�YB ���
�l��
4��BE�i|�É%2*l��$Q5
l�U�e�.�;B�Ao{�!����)$)��
[mw�K"lȉii����p_��]Y��|8<
$=b��2` 	w��>�}�h��e�@?��H��>pf���<C���.
�4ȣ��$T)�!ǒ�7��q�[��=��Ų޸�r�a��W�^y����<x�պ2�j��/��z�8z�&(�܇Us_4.�p�ao��i��u��k�n
+���h�V���pn �M'�h�`
;�*�	%�W}�D{��hr��J�*�!�GZU����i�IҨ�h֧Hm�	kAd*]��
T�����#O�)M	0$P�%�����jȠs(U�I��}�3��� !��L_8+�����NW��R�-�/��}ݤlI���w�3��7�����G�$��I��p'v�;�c�t0'�wl�����=��=�!dc;J-�WO5�ۑbd̐덏��WRѥp1L=pc_{s4��,qa$��jQ
��
W�����'�'�(6�
�n�XH��'�z�1בb941�6ՃJ6[��
�*	w�A���!�,:��t�w��2LU�-K��n6;W!��1�]�Ww~��pvE� ���a�f�M[�vd�wtBvp�31�y�/ۘ��H�AWZl��G'�H�z(�R�kBS���'�k����_Hh{���u� �C��{7
;
�}��`�X�a��T'���@ݷ
՗jQ.��X6��~]��/mv�\
D��l��S
/WBHĴq�꫟�e눙R�b�
šGBѓY1�fq}
���w�jq[�>�W�w�з[��H�
[CO��:��
2�ȃ
?çU�c��=0����*F�bX-�_��"�惻�0
9�j(�~��̓�/*�C

2�ֶ_����
iek(f��\�ϳ��[���/�HcMbT姚7�(؃�4��R�=p�3`g�#B�
�
4$h)9Ѐ��g9�̑���&v��M4(��
ڏX''�6I�h|�Lf�� �Ȟ>OF`�����o��>�$�W��%�
+)
�z�
/3T���q#�?>K�P�i��
&��|�ھ�dB

Q
����
�
�@ӵ�a\����:;��j ��DG�g�R3��VX�Y�j�@�@X�%T�@u�?�.@����y(��jy�t��6Gʙ�)U�&��*N�8@
̱��U}��}�3
�)@���	�n�Y~
+���a
+0b��DL?�) �Z�S`�O�1c ;V�\X
qM�Ո��-X�O�
.���g���
�Ȟ	Vc���ռT�FR=��u����>��ʠQ�F�VS�s�8��H(z��V�9�Ց0i�	�U��`p�Ŀ�Ҭ!!���p��ƙI4G�6)�UΉ�ϧ���ӡQ=r<��c;�G��N[�@�����Jc;�+g�v���BO9�VXN�i�t��N�b�N��SN�-���@T
�k?��iF�k:��ٛ���i�c&��憜<���g�R���uO�;
+�P)(��$�r�N��o���}t$mbOu��ܑ���;�vk��-Mt.d�
9��
+`
�d�I�
�rэ� �*��X�S�IC�d"��/&m�V ��|�ԧ:�7Al3�~M	��F��{�@�G�����i�FL?S4J4$iA�	4�'˙ѓ�8��s
g�#��3��o�L�H���*'�#�)֓���y�揸�a~��w���q"lΗ�l��!��3a~,�Q���*��H�'�|�%R� '_�zT��`���g���\(�8�������F0$L�G���0��t��i�Ƥ���0d+��Y��[za�,�T`�+����̾�R���]�p�t��"�aol
�����a���a���u��㥀��~��X���ԕ�]�>#�� *��J�\ �������
+����ZrO������2�a�{�E��my����}�l���


мF�u�ݡ����|5��c��T���f�h$K�~�;�З�C��(j��.UYP�jq�ȏ��MƢ�D��Pendstream
+endobj
+3097 0 obj <<
+/Type /Page
+/Contents 3098 0 R
+/Resources 3096 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3055 0 R
+/Annots [ 3101 0 R 3102 0 R 3104 0 R 3105 0 R 3107 0 R 3108 0 R 3109 0 R ]
+>> endobj
+3101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0616 678.3775 276.0472 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 578.8854 268.3399 589.7893]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 449.5891 334.0726 460.493]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+3105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 377.9923 268.3399 388.8962]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.2237 248.696 256.77 259.5999]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+3108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 149.2038 268.3399 160.1078]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3099 0 obj <<
+/D [3097 0 R /XYZ 90 757.9346 null]
+>> endobj
+3100 0 obj <<
+/D [3097 0 R /XYZ 90 733.028 null]
+>> endobj
+2815 0 obj <<
+/D [3097 0 R /XYZ 90 512.3596 null]
+>> endobj
+3103 0 obj <<
+/D [3097 0 R /XYZ 90 497.7893 null]
+>> endobj
+2816 0 obj <<
+/D [3097 0 R /XYZ 90 323.4216 null]
+>> endobj
+3106 0 obj <<
+/D [3097 0 R /XYZ 90 308.8513 null]
+>> endobj
+2817 0 obj <<
+/D [3097 0 R /XYZ 90 94.6332 null]
+>> endobj
+3096 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F25 348 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3112 0 obj <<
+/Length 2647      
+/Filter /FlateDecode
+>>
+stream
+x��ݏ۸�����S�".�?�E��w)p�i���\`hm�Z=[�Ir6ۿ�C��EK�w�����J�h8
g~�Lf�#3�gJ(d�������o�?N�y�xusq�Z��AFR9��k5H�%tv�z?'�˄`��o.	���6]���x^n
�٪J�o��z��~����:�e�n~�zMHO-1
)��a��ىD=�(3�K܌(1�0!��˳*��I��2��6C��v�I�̵�����yV,�Iq&`��*����w�`�X�~������?]`Č����Cg�
NY��\���g��=h_�A�S&�2��`�� ���ӄ�
��9��Ȅ�R\+/�<�"�Z�P=:B �1��	�~�AS�+���B�"M�T���!
i�I�<������j�X�Y k
��%�u#iE�]���|�u^�"-V�l{��\����.�W]�F�:�X &T��v�.��]��x���K�nt��b��'(hO0��C��H���V�/�U=��
���i�6����
�%�7��[�=��]���گ�r㟾�᝻ȋ�<���G��U
�	�+r<��'4\n���3Ф02D�d���F�U��q�S�%c���vD�A0L?��Ng7Q�V��lr�Р�hN	ňsȳ�
o�I���U~����:�
� ��W�@�	,DO'�����M�
����^���o�e�/שM#��><
+��uV7�&/V�%�O�Y
��f�
+����u�\�W����W�iѮskףkNݟ���\܎������K�o�=X�r7����
��V��5�����9\�e  ��xZ���&�W��p>h�r�Vo�	�ڼԾXBcS��=`�V^+�x at .� ���/�|?��¯�&�o��U��h-�uަ'p
+*C�`
)�R'�X�9��xٷN,2�i�7��bɐ$�fґ��=�.SA�vCH��y�:
+�GC��z�i�G\���mv��"�p�	�2���>��duT���� 	���T>(|�7�O��� �
b��y{���j���%
V���[�|��	�Wx�I�/А��Ʀ� Rrf6i�36����#x�	�!t(S2j�-���	D�����@#�\&��ZnL�R�L~��n��E�A��!M@�E�#b�����\ɘA�w��
JO3��ؔ�ΖͳHT!�1��$*mL����<��s,ʞ¢�쨳���2��E�����i u
+Q?���l��)�
+d\�d־�ih�"c�x��0A�KƱ�������u��8�F�~G��BWr at Wcz�
+7Ct���8�:7�N�8FWh:�k+�5��pQ�}�|
�]�E�k���WT��x;%����]���%_%;�m��
E׳.<�.�yֵ�־�q֥T#F��.7�kxW�ΰ.?ɺ ���$=1���ʎv�u��]��h��
��n�T��T����e`�!��"
fj��4������� u��x
�4�B�����B��r(k��~�W�_�5
EI)%�J]qp�[����h(�M����	'��g_����5��%8����������m���4�C��R�o�-�#�m��ڄ)|
����9�̶�1>�m}x�����
Q�Xgf#f piL��Q�X`���_�"pL�#� [�M
��

�Gս�y��� ��_�^k�!���
�B� _A�M9�N��1��#��F�����r6{��m�	
�!J�8 #%m�Ƅ���7�<�Q�a�� *�`��{
 ���vz�ӗ:�ס�/V�����2������u>��X1�����]y����d�}�^dU�O#c�
��褆F
�w��#�7 �-8�1�� ��Wz���x�Mm��o.�|��}����2������˔N�mZ�Y��t�8�5H2f*1�
�sk>�'�\xD3��n@�O��#[7Bj�2��HH�a� H
͉W�@�5���A%d
a�l6�W�
�2z�=�ޏ;���kX��u��\c��Ju۵�:u�+A�~��~�-���X��N�F��F������]��|�( nj��rq�-��
���jd� ��A�� P�ӹ����n��u�z�-s{Ґ
-�O����N����@�5Dճ��
�(
K�
C'69��A��&z�#��А�8(H��ؐ�P���h$ʀ�
+�c3Nf� ~ƞ�Vk�/����:vpH�L�#���eF�ݗ����G󲬪�ޕ�������Ա�m�
0���1�
��:�=�����'8�O��Χ��؊�
�:B�H�M�Z���
\�
�2I�+�I�tRCc�Y�
�?\G�􁈊�F6;	����.96�qP��r����>{ț��*
�䎩��f�C�c��c�������n������������ ����Ȁ�D]�4ŏ���6����K�5�ۯ�Ǖ�c���q)�4�a��F~(�B�FӇ���~6��`SjXY&b���Yψ(�����R��
��n={���Y�G�_���i��=ĸ$V���6��xWeTYȰg�P_�eü���X�%��Y������
I��!�ځ��fw}u���5���Bys��m��12T���K:��-��9�Gi�yߖ���o[VY�Fhܶ;�A
ل6b�

r6endstream
+endobj
+3111 0 obj <<
+/Type /Page
+/Contents 3112 0 R
+/Resources 3110 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3055 0 R
+/Annots [ 3117 0 R 3118 0 R 3120 0 R 3121 0 R 3122 0 R ]
+>> endobj
+3117 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 312.1557 236.6587 323.0596]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+3118 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 258.3005 256.1568 268.1982]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) >>
+>> endobj
+3120 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 148.9573 250.8953 178.0231]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 106.4346 483.2121 137.4033]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3113 0 obj <<
+/D [3111 0 R /XYZ 90 757.9346 null]
+>> endobj
+3114 0 obj <<
+/D [3111 0 R /XYZ 90 733.028 null]
+>> endobj
+2818 0 obj <<
+/D [3111 0 R /XYZ 90 566.7777 null]
+>> endobj
+3115 0 obj <<
+/D [3111 0 R /XYZ 90 552.762 null]
+>> endobj
+2819 0 obj <<
+/D [3111 0 R /XYZ 90 376.5283 null]
+>> endobj
+3116 0 obj <<
+/D [3111 0 R /XYZ 90 362.5127 null]
+>> endobj
+2820 0 obj <<
+/D [3111 0 R /XYZ 90 252.4157 null]
+>> endobj
+3119 0 obj <<
+/D [3111 0 R /XYZ 90 238.4 null]
+>> endobj
+2821 0 obj <<
+/D [3111 0 R /XYZ 90 89.4414 null]
+>> endobj
+3110 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3125 0 obj <<
+/Length 3115      
+/Filter /FlateDecode
+>>
+stream
+xڵ�r���]_������_�N�&m�tƵվ�
DBb`@0���g��%X���fD�88��_H����
+��b��‹��oW�{���>���W��ba��T.n�[
� A	]�n�/	A�zE0��7�/�z���\S��vϏ����?wuV?��|������_�������Ñ2��
HD�`D��
�m�A�	���"��v��x��6C����˚�}�6���k��y���gΪ-ҫ�o��:�
+&��ׯW�?����F�h�x���1t������ջ�<�A�BJ/���(�2��`A1�!�;�4�xc�i����B�k�4χ��� NER(kB�4A���c��ZNUl
�/�#m��\��QKZ����V�ΰ��ã��q���,��Y��ʾ�X1%�! ە%+i�x,

�z}<d�|�-�yy,�����b��wk+lǀQ�9R2��̟�x�J�(	�H�b�hJ���/�]Q�
 H�
lZ)k	�RHR��7޶Vb�w�i
;�rgv��#+�5����x�5E��AZ��˧b��Pg�N
���1�'��]tX��Gu�h �@��
� HQc���V}��
��b� �"H��V�������͐6�)FI���� =�"6-
'�@z�j�86ۛ���� �lWl�Y�p�5#��F�ƫY��13��)���:b�����!R<�N��}B�
����j�mX�
Rt��P�2�`���:{�xF��V
K4
+=4�<�!f)�!>�</cv!��Y�*ƴ�`�Xkc��D�(-��1-��t^�H9��5�D�s�0g�
+�K��4s]�i�l���Tn�`q"�
	��2��D�'�̧Hᐢ�ON'�����f�%P3�r.́)0�/�9��>;$r���Y�k�mR��o��2ȷ8���
�H0&�q��D�7;��"	�$3��I,;
s�0_�s� .�l��
Ņl���mH`M��a�dp>��q��5:6���y�
�|Ճ���V�N5�����G���
Jy�� ��
\
qͦR� QQ9�I{@ӉT�����Z��  }&�&����!�T�"���3� �ϝ�ÌhF�&L"n�	�Ӽ���V}g����>[j����������l�8p��
�xX��)�L4Q��9�ao,�QܰO��cW
jWd�|��}�۹� �t�Xm����
���pN��������H�0q�JF
���
+�-��R�k8x��T�j����m
k������;��0�9��1Y�"F}��ԧ<U>@˪��1�|ZA"Xf��^�eU��W�Q+d���P�Cݗoݓ`Q��lQN������٦Z9!�'V��+�5jY4
�����O�?��A1a�K?�me-�,���$[�
J��ü`F=c�J��.�{י��Lז0��L�O�r���v�V� w��Wu���3\t��!:þ�bٹ1*c2Htwp���RmK�Wsu2K��R����IBq-B���ɨ��8.�2�ȹ�ֺ�q�Ѡ;��q��t( �՜���
�\(�`�H���u�}�i]�_5"�R����e
+(۝�a�m�W>
�%���jRɤ2)h���¼L�}�A�8��Z.1Oi���g����/�����&UjK���p��?���mk��KX�8�Re��
����^�g{��D�Vz�h�Z�d�
+
�
V$hP�:�O ����)v�&��2j[tm��.޻ۢL�#�&3�H�(�he�BF�F�O
��ץ�T�
+S��)
�

u:�II�@PIA��c�A��l�I6���aj
F
%�E�
�
�AL��lD^1H�I��̲��6�y�#{Խ*�K|)EJ�������l�
(�
2�}�;�%9Sa�8�D��)@q
+t��j[=C��&���3:p� �
�x����IfÆgr[�
����%䫎��}��@��U��V�ͣ�r�
ᶆ?���

Ʀ.���~�oaX#�}��l��*�:�����m��7Yӟ�
���
{��v�6)��/A�1��$�.0:�69�#<��f
���
�S� >�
+��L�� �� �.����HO��
�ߗ���O������Tőt0C;�}�cאY]dw����-��s�[V��� ���AK�j�j��:��}��"l�f7H�%$H	 9�qߵ��da��!��Ӊ@�
צ:�԰nzh��j������u�sZ7#E�ݑ��RuiqD1���iWhz�E�2Q����]	�3Ӯ!�i����&�M��L.9��@#���֗�O��<��l�O3~�}xл��<�
+���O�&
�+�>e�llF�,�ADjh.9�@�C��d����B "�[��w~5�}��1-�M���-8�W�y_�CM;Q �|�5E|N_C.&���>o�:+��u�Lz�1�;�t��VB�,ѕ�nt�
}n��X��`����h7��K���ӟ
����C���z\������g�C����OS���LDz������lۆ��`����	4,��
��P��L
+7׬N��{��N��i."���Z��܂�w��n��8X�fq�-�c�[����/z�)��
~����C���O��g:5 �@s)|
��h�L�`C\���ɱCџA����AB0�~y 
?
�v�O

�����,��B ��'QN̋�9��
s�B&&1A�~��B�]�J��?� �
��D��J�?����Z�UD�1�J,�
��<��g8T�/t;�h9l
S=�HjN_:2Y���|t�i0 -�
�����9]���9ᗼ��zЉ�c�\�`d�7�"��)�0��
�i
��K�v���Pw�~j����*����,
+�b�Pt0��M�}�
{�FP?z�(]&�I��3s��w�����~��M
+��Ca�XO�⸽��C�86��G���DHȥ�#1���	/�!�����0Mj(�
雴��q�4�D�$t�}W��
wۍq�Ϳ�y��k!�]��Ϭ<���M��:�
%�U|�s��M��"��G#C����HJ��Dž��G/-�V�7|�p>�o��p������
ѩ,5*�ׇ����/��6(��Ј�H�
�Z���x���]/�98|�ϒ�9�I$X��1�
endstream
+endobj
+3124 0 obj <<
+/Type /Page
+/Contents 3125 0 R
+/Resources 3123 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3135 0 R
+/Annots [ 3129 0 R 3130 0 R 3132 0 R 3133 0 R 3134 0 R ]
+>> endobj
+3129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.3762 569.4259 385.5187 580.3298]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+3130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 305.4295 239.8565 316.3334]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+3132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 122.6048 300.1613 132.8861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) >>
+>> endobj
+3133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 86.2883 182.1636 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (main_expand_space_dimension) >>
+>> endobj
+3134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3126 0 obj <<
+/D [3124 0 R /XYZ 90 757.9346 null]
+>> endobj
+3127 0 obj <<
+/D [3124 0 R /XYZ 90 733.028 null]
+>> endobj
+2822 0 obj <<
+/D [3124 0 R /XYZ 90 643.4588 null]
+>> endobj
+3128 0 obj <<
+/D [3124 0 R /XYZ 90 629.5812 null]
+>> endobj
+2823 0 obj <<
+/D [3124 0 R /XYZ 244.4393 308.5825 null]
+>> endobj
+3131 0 obj <<
+/D [3124 0 R /XYZ 90 292.5481 null]
+>> endobj
+2824 0 obj <<
+/D [3124 0 R /XYZ 400.6899 89.4414 null]
+>> endobj
+3123 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3138 0 obj <<
+/Length 3078      
+/Filter /FlateDecode
+>>
+stream
+x��[Y��~�_�����,,�c|T�ڔ����N��͖�#qvK�Lr<3�>
�:ƻ��!�U#
M��h|�uK&����%2���rs�'o��/�{=�����WϞK11�H*'W7]
� A	�\�^O	At6'���Ӭ�d�3�����6_����u�Տ��_�xu�m�ٛ��='d�,1
)��a[���z&Qf���J4baB:�/O6��:k�ٜ
+
�:�7�u������M^ψ���
)����F/��
+sLk�_.^�����
���br7c�ds�)�7�W���/�R�";gb(CX
+&1$����ol7͡gF��^!ŵr��6/���
+�ɉ1���G�c?ݿZϩ�U���EJrz̏��S��4#���=�����Qz�s+;�3C��JM�0
F��5�l�/V�&/��*���
�������zbV��:o�r���^	��j*�����V��|q�Yr��W	�E\Q�>�t68�0�	��P�m�kV�,��ƀ�'�J��D8��E�.��M/(�@p�0�
�
�N!I9�x>#�����[�L;�����-ʔ
1D�F,RFqDi.ʶJ5	��P�o��!+Â��>�h�0��%a����x��Pj�� ��� �43]�nI��m���`X5
l�R`�H�
k�'�e��k���F�H H-�qc����@D*�p�ǯ��f_
+�s�DZ
�U��ɼ
h�Oh4n�j�ӌ2\��*
#i�<n� uJ��t �����e�β���V�(ߺW����{߯��{
S�*���L�m v�ۼ�`9F�R

v(���K���
�
+d ����D6�
~Z�	
��:{��['�m
ςm�H��2E}�y�e�:Yj}:����:��ۼ��� NFc��h(u� �b	^o����2�ڮ� Q��#�1�"�A���������&�b���w`�v���HZ
+v�"Aj��
 XVב2W�ue}�
&�ش���
Z�
dy����%��M<�mo�M��q��Gc�I���j�\V�-xG���}�ަb���
~6�r�:�z�`wU�������h����M�?'�8�χ�V�~�'��Hj����(>9�S
+@|�����XK���̀,��H�
���i����fsN��uS���7캻It'5����S)=t�s٥�*���Ws�yB��xuo��Cei)Đu�,
+¯�/�@�ս�>��
�����$�n���m�EI=mfd�c�
�|2?�$X�Ltac�{*�`�F����`*46���]���L
+	
���vcg�ӱq D����	ߥ��6jG.�b��s��$�!�tx���|��I���׎8sN��>�6��8��B:�
iE���j��6�C����ϓ�����~��h�=��,`�'�/wٺ�Ӡد�A�H�/����*aOJ暞r
���쨧e��J:�n��u^����
@�3�Y*OAQ
+$w6n��Mhϸ�3��
�d�8�<�����f�>J"%��&��i��<��Y=�l\+X��Dl"�9d��|��8ƍۍQ{�CDz��S����<� b����!y{.p)�Qd�q�^`n�ˡ
%�#s�A[���Fp������t��s����
+��
p6MȮ����|��
�qJ�
%��*��jO�<e��K+��Bh�
FH���j���q]
�%¶0��(�G�Q��Q5�e���>[��F�ׅ�FX����D׉�F )�)߅�0dH(�:�D��9��H��S8
+
���!��bM�>�H�Pl|<�H�kw�[�³�|	k��U
fs	+�/��Ǔ��� IB��}@��ى��R�]B U14��ZM������*��"/}��r�77,Ҹ��w��
���j���}
�:��%ĸ�$��aKYB@��a�
+��- j��Nl��*��U��[�
Um�
+
���؆�HH�OlL�:=�1%
9[�d�C>���5�����i"?6D�Ǧ��>���4n������Ti#b�*������s��7�:H"4��
CI�
7��%�i��@ʇC�q@�_U��
E
+I$,$-�3���n)bp�W>
�nr/��X��Q�e�IJ�m�Ǹ}��Սծ���R�n��
�����?�3O���~�� Q�=n �J9	�N���<�;��Wi���)������� K~��$%���J�U��;�٦o�c���$������$+�� ��5F
���C��$Zg�{b �|���c�*�<]��:�p]��Е?i;�$��1�~�n��Λ�u!
��^�����.ڮȡyǕ�|����H��:�B2
hK�,��0b�*�!���KbG��GF�t�����vV�������i��
�+�y�����5
P�>��[��U�g�a��6�d\�t��:��lf�D
���/�Ã.Y(1
��R:
^T`�+

ĿZ���=
u�x�7]9�p쯻�B�e\g�⺶--Ǵ�U�׷U�T��Q� ���
+�t���.=��c¨ؔ�����6�w��ź�\��(<p2h�������%=��4u��
`�'���x���y<�Xu�|٠�4���g���_�
B�Sx�����&���P��~BMݧ��ǚSL�O���W��lG��O,�i�g���g���\�<6P ^�
�
��
+���kfДF�t���m�j}�L�2�R҃��'�˶�EҬ^�����e�Ț�x[�}Z$��6_�l��y8II!
b#���wݦN��/�{P��4��
�"��
 <���u_�.���#��ή��婞�%B��
|
�>0.���#�!Yd�&���0�sb����t�T����ۗ�]�������*bW��UQ�� ��o��{Gم<b�#�+b
+�N�ܻ�_ �6�2ܻ�\M��;�DtP�%�v����]���m=�7�l���M:�[V���~w��
+��
�bH���C}�x��Oaj�OLHl��������L��|�EDN
�<j�;	Ѷ��g����ѲA��lkT�϶���Ѷ-dn��ٛ��.����� 
G���G �tS�*aQ��M��`Pn���A9�endstream
+endobj
+3137 0 obj <<
+/Type /Page
+/Contents 3138 0 R
+/Resources 3136 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3135 0 R
+/Annots [ 3141 0 R 3142 0 R 3143 0 R 3150 0 R ]
+>> endobj
+3141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 649.0786 241.6898 678.1444]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 579.0051 163.8226 589.909]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 517.9998 513.9963 528.9037]
+/Subtype /Link
+/A << /S /GoTo /D (main_fold_space_dimensions) >>
+>> endobj
+3150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3139 0 obj <<
+/D [3137 0 R /XYZ 90 757.9346 null]
+>> endobj
+3140 0 obj <<
+/D [3137 0 R /XYZ 90 733.028 null]
+>> endobj
+2467 0 obj <<
+/D [3137 0 R /XYZ 213.4267 509.1977 null]
+>> endobj
+3144 0 obj <<
+/D [3137 0 R /XYZ 90 492.9111 null]
+>> endobj
+3145 0 obj <<
+/D [3137 0 R /XYZ 90 414.5757 null]
+>> endobj
+2870 0 obj <<
+/D [3137 0 R /XYZ 90 391.6412 null]
+>> endobj
+3146 0 obj <<
+/D [3137 0 R /XYZ 90 391.6412 null]
+>> endobj
+2871 0 obj <<
+/D [3137 0 R /XYZ 491.3508 326.9324 null]
+>> endobj
+3147 0 obj <<
+/D [3137 0 R /XYZ 90 310.6458 null]
+>> endobj
+2872 0 obj <<
+/D [3137 0 R /XYZ 203.8219 224.064 null]
+>> endobj
+3148 0 obj <<
+/D [3137 0 R /XYZ 90 207.7774 null]
+>> endobj
+2873 0 obj <<
+/D [3137 0 R /XYZ 485.3732 145.1059 null]
+>> endobj
+3149 0 obj <<
+/D [3137 0 R /XYZ 90 128.8193 null]
+>> endobj
+3136 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3153 0 obj <<
+/Length 1933      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo�6��_�O�
�
�_�a��n�^ѭ٧��i�ڒ'�K��w�(ٔi)i��|�HQ������|"c
dl�X	�
�r<_���-L�0"��
���<;�}/�� #�
�_U$A�:>_����tF0Ɠ�S�'I�J.^N)����k�(��_��")n�>}����u���7�?�}OȞXb8RF3P�I��^��`D��~�yD�A�	�|3(��2�l�3*0H3tbW�eR�z�{e�)���aJq&&�b't��y�1�P�$q��{��

/��?�0bF��

0"���j�)k�ѫ�ﭜ�F�@l_a����1�!,���W�mi��嵷���2]��M�z�/,p�M��,�
&I=�H70���/mycm�]��^O�
����}�$�P#.5�
�l�B$�
+f�5�!��� �`<�R B�ψB���?^Mg�-���"0�M�ls��~����f�P\�����-�n���/�ifO`��dS������_���}�J�4�S��>-����cJi�Qƿ���iޙ��6�3�b�� �QEYlmD:��!����� =&�	�I W�r�(bJ7H�C7���p1)
8ᣅ�x�$�"�����
�����M�>�6k;O�nمO��X�`�8�M
��"�`aTw��
�;��o���k2�W_鵩g���k[\������M���/��R���ri�S�d���]�ǟ_��;��vq��vui��2�"D��(� �T
��
A-��|���٢�~1�
f� ��Hz�/����&�-��'�p�fH
�Y怓�0$N � 9�� �� n�w�dJ&N57�1�]v0�MU��k
qWw�L��F�
Dv�ͅ��Gax�t�*�����܁
+D�[��eđ�lH�
+�@��È���d��tKh�x;�����Z�n�[�X�ɗ�<_��jݢ�E���ӷ��J-�R�B�w��N1���J9P9h#ۘ��S!"�W.�<@1�6�T�W}Q�0*\�Y����`��۳�
��Ajf�ҩ,&=U�&!����"J
=h�4Q��] ��IFX��M�J����
R���T�1KI����k��j�����A��{�
+��-6l�G����/@�*��
��4�+�m� \�uT_��O5�Q��8"�b�5�0�|'�
M�G˦CjWem���)i"�ua
"/�D@�� 8��RGk �>]�͇jmv�Z[���Tk�j�Uޫ���B�\�Zx��jm7�<9�˱���&ZC�
�B �QM �gw�D�T��!�R T1�p�p�G�8? ��VE	�|D���ڱ@�2�b�O! o��
�d�"��N����N
�
�jE��z�C�c�s�x�T���#?�ZL�4�)rO�@
>T��t�")�2���`�iC!p�X0
�{8"b"Fش��,<J����p��t��tM�~�+	�Dx!��/q�-�Ax?�޹
+�sE�����d�co�� %�|��!r�c?tR½ep�o
�,�:��2ी
�����eb�c�CB*B���nP����k
��	��8X帛�nJ �)��n�U��+8�a�1z7�V�"�.#q���
"�m�|��	&�'&r�
�����i���7M��4�4y\,��_,�CX">���ы%$,�>K,Q��I��pmX=�?�My(��C���
�O8��ͽڱ{�H�ĸ��y1!!���	Hk��X�� �ũqrj�
6N�qrj�|F�񿪬;��
+0N�SN�pB
+�Q_�V��B�+b��נ�_
�(�����v���a�n=�_�փ?7��r
+��iV�d�kd��D�bӲ0P�
K��4u�a��ڮ�j% :/�wߍ���wƶ�����LV{&�u�_��������
�o�6K�J˳�zy�Ջc�
�l�ٽY��@���
x�Tp���rմ�Vy�+H3�
++�xG�߈*��|e�endstream
+endobj
+3152 0 obj <<
+/Type /Page
+/Contents 3153 0 R
+/Resources 3151 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3135 0 R
+/Annots [ 3158 0 R ]
+>> endobj
+3158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3154 0 obj <<
+/D [3152 0 R /XYZ 90 757.9346 null]
+>> endobj
+2874 0 obj <<
+/D [3152 0 R /XYZ 125.5542 569.4985 null]
+>> endobj
+3155 0 obj <<
+/D [3152 0 R /XYZ 90 552.7713 null]
+>> endobj
+2875 0 obj <<
+/D [3152 0 R /XYZ 438.9984 418.9856 null]
+>> endobj
+3156 0 obj <<
+/D [3152 0 R /XYZ 90 402.2585 null]
+>> endobj
+2876 0 obj <<
+/D [3152 0 R /XYZ 125.5542 191.6894 null]
+>> endobj
+3157 0 obj <<
+/D [3152 0 R /XYZ 90 174.9623 null]
+>> endobj
+3151 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3161 0 obj <<
+/Length 2183      
+/Filter /FlateDecode
+>>
+stream
+x��Zms���_��δ�Lc��3�K�6M;�;�K.7
Z�mN$R����_��DR %�n�i=�`� ��ų�B�	�?�X:�R˅�,�gtr���:�jx�����חg�Urb�ULM.o
+	
+�d�&��S �gs��N�΀N�l
]��1:MWwn�EW���Y�=\\��ۻ�(�z�<��R��r7�3I�oV�v[6߹���L]�p�dA��`����//]+S$W�5��ه�t�D��>��[#'�ء�e���`���ޟ���S/�<"�\"Y�%��$/\����4�se���x颤�.�m
�1��k��;�x��պ%8'�0��x���)��
jD5!J�!)�HP���pLH���t~���
�
��<�\5Vm6Y�)^Gy�V�қҪ8/�q��!��$joZ6��l�V��\�˒m@�P�W�
y�s��M(�&}�gL�Q�8��9��J�W�GR�+�D�mh)�׍)Cvo
)�T
#W��&�	QL�����2�ܢr*v
����
�;
����nܢ8\nY>�~��(!Xm�� |�3]ͩg`�.���Y����z��
�*���Rz㲛4[�z�qr۳+w�M걢��8cߏ��
m�!���|���{^��g��!� �K��E�c'��&.P;�
�Ĵv�@C$�[

a�ZF1�zW�<~ Z�%�TK�
+,������a�h�[`(�^�,��x�-�n�p-`xN����s`1�D�I�f\������c�����+��mR���J���-~��-��Ur �r]��2�k��vY at E.�

 ���]Kk,j
�5L����d�K����/
B�@�,��/�+���`uw�����Ŏ�A&��<ׂ�K��8��_\���6��0���t7
��w͟ϾO�������"+z;pB�Z\�1C}ʰb�RJ����w{�"�h��c�.�%Kƫ/jH����l�� [�&��V1
j�>d�c��c ���O�n�$9o
+�w�=�z��3դ�o�|�F��3���,H��RI|ї���5�E�|�$Q����a%Tshǐ]�p(�&i�M��5�p/�{rȹ�C���<���i&�
��x
�	�f�c� �=�)�8&ij�U�ur����<��\�ɏJo�!�:}�ut/�v�u
�V�a��l�x�u�q��~}���X�0�c��I�:}��:}�b���e��#o���yO�jӏa�
�NvSOǨẜZ0
��è8g�˙
�y��
��!�

��&�C-L׳������8��1�b/ ��2�@J�~AJ�R�w]�@ʌ�߃�R�IR�Q��
�^5���)���T��/qʷN�)ʰ@��t��(p�)�!6U�Δ�>{v�ңUr\�.�u�H���"Y�.k��1B��`:0(�,j,��0PUY*x����F+�2$-,xD�j�_W��;�p�Wu���_;3�����Xd`�Ď�\��j��2��c�s��D���%�r��D.���x�+�U���M<�~>4�>�� [...]
+܀����⟂`!4V�
/��ˋ�"0
�m�VSDL :x�.vk��-DF������#��b۫έK\歭���uo��*�pxߠ����|�+���0�'
~�����S�c��P|��a]��ul]�SC@;�n6+rw��T��}T�1�nԿ��V��B
E���
	,)g�'1��R��kh��p�V�TOJ��x��.i�>��x��^%�`��0�C�,V�e�2(��� D݉�w��
�QR�q��k�<��
��TO�L��l�Y��v��{K��N��[���ցRv�h);�n]�'��*8�%�hUHI���6(���M���Gf�.p�޹��A�%ѣ
/��?L��?��6/�[o�#��r��wy��8?���'�-�%�&#q~�{{��KP,���#�7o&
��q���(MMG�&��iM����II_�mB@���H�endstream
+endobj
+3160 0 obj <<
+/Type /Page
+/Contents 3161 0 R
+/Resources 3159 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3135 0 R
+/Annots [ 3166 0 R ]
+>> endobj
+3166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3162 0 obj <<
+/D [3160 0 R /XYZ 90 757.9346 null]
+>> endobj
+2877 0 obj <<
+/D [3160 0 R /XYZ 438.9984 675.8614 null]
+>> endobj
+3163 0 obj <<
+/D [3160 0 R /XYZ 90 659.1343 null]
+>> endobj
+2878 0 obj <<
+/D [3160 0 R /XYZ 125.5542 448.5652 null]
+>> endobj
+3164 0 obj <<
+/D [3160 0 R /XYZ 90 431.8381 null]
+>> endobj
+2895 0 obj <<
+/D [3160 0 R /XYZ 438.9984 298.0524 null]
+>> endobj
+3165 0 obj <<
+/D [3160 0 R /XYZ 90 281.3252 null]
+>> endobj
+833 0 obj <<
+/D [3160 0 R /XYZ 90 182.9324 null]
+>> endobj
+146 0 obj <<
+/D [3160 0 R /XYZ 90 176.3322 null]
+>> endobj
+3159 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F97 1774 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3169 0 obj <<
+/Length 2373      
+/Filter /FlateDecode
+>>
+stream
+xڵZے�}����F�Zap9oY�ǎS���%�k�#Q#�%J&�L�ߧA\^j"oMM��f�A���$�a�#�ϔP(e\�V�;<{���#���/C��w����(�T�
7�I����
׿�	Al�$������g_>-(�v��|]e_�Q<UY�����������7y��bLWY�/�T��7������|�W
���r���9�J�=�p�ݣ�j�"�$�w���gk�w�4�8���)���8e�dw��ݿ�
s�}`�#��k\B�R��%�`�z
0�(MIr���@kH���q��
m�WJE���<Q�^j�.�(�Rv��MuZ5�,�9aIϲ�U=[��!'?�a��u�a̪| BI�LRt�2AI�`�	::�D�ă"<�@�֑�$�,e
���Kނ�)�*Mf^L���	���d;sx�L��yU���Ji~M��U�?5νBDҙT���
|�A�NƧ�ӮX�?��'H����\5š
�I	J93"�d��̈�E��
OŬˇ)tN��n��hS 
�y�?^j�,�D��r1|�W [�=g���RԷ�&;��2-�@ZB�#]�:�y;V����%Q$
Qe
D�ЋMa��� �@��:���1�A�q� �:	����mJ��������S(z[沵
+�m�bP4���|०��tJi����6��B���L
uDRы��է��bɈN���K�]����zd.m ea8�^��O%-\m�52],)�g+r9�~�����
8��wb�)(�=���|ʇ�ޖ��a�Gq���8i:�;��I�8���k�1Y
+�M�^j��S�����5���"�o[�C
��wb&���o]����)f_/#1�f�Me����@���GG�hFv�a�
v����Ib�8�����F��R��p�H�zX��"O9J%�Dj�#�^�T�ׅ'O�$I�Zxr�/��Hxz���
FZ�	�.�:v�rطK��7��^�|'?`�WX]��%pI��؝Ԕiɑ�)�����
<��	8�)�W終@�����&pP��H��aן3�_L !u$ݴ�`u��wb�/3ۘ)j�%���
+��-�#�C/����ƐH���'6�����z>�F��c�>�轊�c?�Aܴ烎ϧ��J�� c�w�e
+�D$q'x�	������Xw-�4@��c��D��
8��N��
5;��	&�S,AJaf�&�6Ҁr����2Ͷ�GPʠJǩz)��u�n{p����bnf����"�Oh�9�g��f"�1����*�%�]"�mϷy��|meت*�-+Z�C=n��>��
���]17/}��[�)?����_�u^�wΏy��P�C��($u�j�7.OTo1�4A���
v�̛��R@�deS�p� ���|p���}��b��_�
������Ȭ�3��sm��z����\�FP*�iކ^j΋�C
"�����(�����f4����[_Nf
#)���
4�p-e�������
]2�$j�

��Yh�^���]���&)�
}$�����[=C�@ϐ�}��&
̝�
�^�3C
Z"s��i�;7����K����Ks
��)V�
0  ~?F	f�z/����_��
�Į�Hc��
6�����!JI�ű�ʀ)6�}����ac~�~)%+׽�߫��6����;x�"^2�$pΙ@�%бWd�L��>/���i�@�
Oź|[�����Ã)�ڗ�Vѹ*2����ߌ��g|���'"�E��e�u�k
qʸ_��H/*�P�	��
����.8z' )��s`(u��$H�m��ys�t���e*�?s��zw
�����݂J�;P�N"#���cZ��PA{����
t���r/
�\��TD0h��_�Ǽ\ޚ�l
�w�58�Ua�\�0�s�ح����NOa_���l���*����a��ɽ�o��;�����!�gF �aВus���Z����V[���
�_/��w�
�ʢ%�AU�1��*���
q
��m�5N�yl�yh�ou���P��Qo3";�m4@��_�c��`	����B�x��$Їz�#
gJ0M��^7Ze�f����Ca�6�ϕ)����i�L0��ūÞU��Fx)Z�ֳ��֝壯������U[�f�I]���~S
�=D��ng��N�i7,栁)��~��a
+��Ϸ�G"��A[
� )ݶlB
7}ҙ��J{�KsjWLs��:����2룟��'�^)m�Q{T|�r��*���ӟ��_� ��x���}�~
�|��2x¬4*�@�
��i���///hU�SY
+T4�����Ϧ�b��[z����9�ORᤃ����P��(J��ocv�
+��F����7�endstream
+endobj
+3168 0 obj <<
+/Type /Page
+/Contents 3169 0 R
+/Resources 3167 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3135 0 R
+/Annots [ 3172 0 R 3175 0 R 3177 0 R 3178 0 R 3180 0 R 3181 0 R 3183 0 R 3184 0 R 3185 0 R 3187 0 R 3188 0 R 3190 0 R 3194 0 R ]
+>> endobj
+3172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 697.8387 177.0528 708.7427]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) >>
+>> endobj
+3175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 619.165 198.9206 629.6954]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_67b4e0eba7692bced073431cd3cc22ae) >>
+>> endobj
+3177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 581.12 198.9206 592.024]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_5ebec8f5ff32009c4cf98dead90f4a3c) >>
+>> endobj
+3178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.2578 581.12 274.1878 592.024]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+3180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 543.4487 198.9206 554.3526]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_f2ec3c62388f9aef1414a527e82cd1a7) >>
+>> endobj
+3181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.2578 543.4487 311.2681 554.3526]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+3183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 506.1509 206.6694 516.6812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_97b2101d371edae52746a53cf34e4b67) >>
+>> endobj
+3184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 468.1059 163.2149 479.0098]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_35ea0c10995c89f8a11a2e8bb5dc7f17) >>
+>> endobj
+3185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.5521 468.1059 275.5624 479.0098]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+3187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 430.4345 163.2149 441.3384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_6ab41afc79135511037718442fcad4d4) >>
+>> endobj
+3188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.5521 430.4345 238.4821 441.3384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+3190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [106.7172 266.8328 191.7275 277.7367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+3194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3170 0 obj <<
+/D [3168 0 R /XYZ 90 757.9346 null]
+>> endobj
+3171 0 obj <<
+/D [3168 0 R /XYZ 90 716.2211 null]
+>> endobj
+3173 0 obj <<
+/D [3168 0 R /XYZ 90 637.1738 null]
+>> endobj
+3174 0 obj <<
+/D [3168 0 R /XYZ 90 637.1738 null]
+>> endobj
+3176 0 obj <<
+/D [3168 0 R /XYZ 90 599.6219 null]
+>> endobj
+3179 0 obj <<
+/D [3168 0 R /XYZ 90 561.9505 null]
+>> endobj
+3182 0 obj <<
+/D [3168 0 R /XYZ 90 524.2791 null]
+>> endobj
+3186 0 obj <<
+/D [3168 0 R /XYZ 90 448.9363 null]
+>> endobj
+3189 0 obj <<
+/D [3168 0 R /XYZ 90 394.2382 null]
+>> endobj
+3191 0 obj <<
+/D [3168 0 R /XYZ 90 253.791 null]
+>> endobj
+3192 0 obj <<
+/D [3168 0 R /XYZ 90 231.4792 null]
+>> endobj
+3193 0 obj <<
+/D [3168 0 R /XYZ 90 231.4792 null]
+>> endobj
+3167 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R /F101 2079 0 R /F97 1774 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3197 0 obj <<
+/Length 2346      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�~ϯ0P ��1�;��(Н��v��3�>tg(��#K�,O&�����fѝt_����|:��ṑ
Y`�G	^(�P¸\lvx� ��rA��5�_w��\\}'�"A��rqso%H�%tq��eI�5�/߭^��.�}��xYϏٶNo����i�|}��_��
�۷Y��1���ɮ��V�}Z��^f�5x�������~��g�r��bI([�z��şoq7.�$1��}�˯x���}�K�X<�
F$I�bw�)�7��������`�<���q�%|y�~�!,��c?�%�L�E�+~�T
�D0|E[t�4TL/�(�R����z|4��4�d&>��:�/��7�m%H�ms��6S˵��`i%
���+e)XG��{�[0g<!��֋��I�����Y���l[����K���qTGL2QHR��wy�)�[NJ�R0�
>e������Z9 at w:zr� ����&�3�D!N��� `-�|w�+�M;���
X�^w,7M^���@J#�(v��������j|q�^��=�wUU��5	�z�׼�
�}�������>�Ӧ�?b��?�Q����
(�@�02��Ѽ��n��)�*��5D�Gh��S�`�H+Du�y��P1
:AJ%������S6a� LF�q�&�2�{�M886fD��$�"<8�P�!O�m�l]�YV�H��!"�d-�	�&IM�0�el
+�+�T|����ևi�0$�U����9�m��	�Ϡ�3!]j�b��pO(�<%q�@�};Ҵ��2P<�W�j��+��$��/�M5 �6�.;������lJl����yB�@����S"l������ɞO�M���q}��Y��E�,�mv����Ԗ�"���<��7��1?�˻��V�����6��eo��Rf�����sW���
+\���Ϟ
��c{�I
�8 ��1sbP��'٥�0߅νһ���C�8���'�}�50sq����
wY٤/b����Z͈���O��s/
���2?��u���f^ZQT+*�Oa����z���Z6AO7]�L�`�FcV�K�����ޯ��ٝt�r����
��j�]��
+�|������A�
=�.Gr|�{[��7��.�ݾh#k�d���)׈A2��e�
��6��ֹ�̛��@r�;?Tk� pe+�|�V��6MZ>��O�~�R܌m�Y�	A���d
u31`����C�>�zz�6s)��j����I6�p�q����\�%�s՟M2K�[CmԬ���<b����f̜%���TI���tN
���v���0-\$�:e
�@Xg�^
��]��d7B� HȫFّ1ٍP��\��¤`���a�̅����fNc'l������m�4��r
;���
�	�
#4�j�<d�m7x�q#`�=o���P���E��skޑ^��zg���c��R���W�P����
} ���Ŵ
X�%L�շ���\ӑD"(@�Z at te�d� ������iKn����
�����)�Xn���DcA��V��i=�ЂQ���J�h�R���b�NZ*r:�Ex>��
#���y�
��;=��m��o��k�&D
t��9|��H�aq�d�	"\�%<*�A3$�&���6DK�=˳���QC��)�,�MP�=�6r�rV
/{�k���On���
+QE�QG�\"�0��CXOC�3N!�
�P�����\�A���Tţ��CKK�W���TM3�j�T�����##���KU]��� }�g
D�����m�d��u���x�=o����	Xc1������#�s���1�C�F�6���������ZF
�Q1�
+,a}��� �\`^����I �H'��k����˵[*,|�;�~����ѐ�ߞ7N@�H���c5 qY���!��(?�
+!0�{��`P�AҬ*FB��b@�r{n�L4�D�jEߕ1W�<�n�<a��L�+�� ���S�\a�<���Զ�p��ܺ�lx|,m޲�p{�Փٛ2!E}�~꜆(X�	��ާ�a�FBp$$Է5M��Gi����ϼ"��P*z �i�:m��
�fʢ�+P�O��t1!�A;������I�����FH�Z�Z���N.m�L�Doc�R�fӞEm��x^	q�}�eO�f't
`\L.�0D �B��/ul
"5R$�-�@�bڟZ%H&�a�VD��vw����[������տ7�r��iy���������>�����uF�� ༌`�.'������R����_���m?Xw�h��Tg�#�f�M����zzzB�:���Fys��W�d^i¢�k�\=hĥg~�a���_Ct��Ӧ]U�.ٞ~����;
+2I�?�ÿ endstream
+endobj
+3196 0 obj <<
+/Type /Page
+/Contents 3197 0 R
+/Resources 3195 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3135 0 R
+/Annots [ 3201 0 R 3202 0 R 3203 0 R 3207 0 R 3209 0 R 3210 0 R 3211 0 R 3212 0 R 3213 0 R 3214 0 R 3215 0 R 3216 0 R 3217 0 R ]
+>> endobj
+3201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 574.9442 175.9373 585.8482]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare_98c515b16e12424b273eaff073b31f3b) >>
+>> endobj
+3202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.2744 574.9442 288.2847 585.8482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+3203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [330.0178 574.9442 415.0281 585.8482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+3207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.367 288.6789 219.6827 299.5828]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_cbf26ad2a67dbfbd24eb9c89448a793b) >>
+>> endobj
+3209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [166.7617 207.9163 216.096 218.8203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_9e6044d3d1b8cd66b7e150763a0cce2a) >>
+>> endobj
+3210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.9117 207.9163 255.0993 218.8203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 169.4356 182.1437 179.966]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_d02ce2da26b1d9dcd0d45042b9f5c3e5) >>
+>> endobj
+3212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.9593 169.4356 221.1469 179.966]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 130.2078 205.5861 141.1117]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1d8eb71bd67ae50436968e7323bbeb7e) >>
+>> endobj
+3214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.4017 130.2078 275.0449 141.1117]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.8961 130.2078 389.913 141.1117]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [408.1246 130.2078 454.1415 141.1117]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3198 0 obj <<
+/D [3196 0 R /XYZ 90 757.9346 null]
+>> endobj
+1425 0 obj <<
+/D [3196 0 R /XYZ 90 712.9384 null]
+>> endobj
+150 0 obj <<
+/D [3196 0 R /XYZ 90 706.3382 null]
+>> endobj
+3199 0 obj <<
+/D [3196 0 R /XYZ 90 593.9181 null]
+>> endobj
+3200 0 obj <<
+/D [3196 0 R /XYZ 90 593.9181 null]
+>> endobj
+3204 0 obj <<
+/D [3196 0 R /XYZ 90 537.6242 null]
+>> endobj
+516 0 obj <<
+/D [3196 0 R /XYZ 90 412.7253 null]
+>> endobj
+154 0 obj <<
+/D [3196 0 R /XYZ 90 406.1251 null]
+>> endobj
+3205 0 obj <<
+/D [3196 0 R /XYZ 90 305.7498 null]
+>> endobj
+3206 0 obj <<
+/D [3196 0 R /XYZ 90 305.7498 null]
+>> endobj
+3208 0 obj <<
+/D [3196 0 R /XYZ 90 226.8902 null]
+>> endobj
+3195 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F23 2436 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3223 0 obj <<
+/Length 3545      
+/Filter /FlateDecode
+>>
+stream
+xڽ\ko�F��_�OY�&�~�}�E�}d�آ[�D;B,J��8�_�wH�x(�3Td
=�=��s�
��0�##�GJ(d�����n��.H������o�.^|/�� #�
]ݔ$A�:�Z�9&��rB0��ח�g��l��������.[lgӟ�������߬?^�u���		")�������`D�q�WW�w�����U2ȷw���rB
_]:�V��Y�U���n��%��,��G�=&�۠/�|��j
+&�-����G
��1���
�`D�����̽��x{�o���ܠ�د'�#-a�ޣF�Rp�m�D�i>�0[��R*���`؊
+6
+�2zT*/��`)�y���V^&!X�_mok̛��ç��Z�Y1�o6�vz���c20��f&^J�X!F�:*=��F��-�ǧ��Z��*�w�u>-���Eq�u��b�$R�w�������P�z6�[���c6��A�D���'x��ְ�n.��c��|��E��6�H�
�"a��X#��V8��)L�V���qU�
��y�
+
�"!�rD���B��1_绢mW
+�
CkD(��@$�g0�n+�
ak��0FIP����FB
���T�\t��z�Q�60'�t=弯��*o
`R����63;�ؗ^�������ƕ-���뵝|?d���Q��%S��o�]5� 5�����n�u�icH�B��񯰷��宦O��-�#�}g;H��A��ޭ]VtU� C���et�dQ�M
{�$
+�SZ�	
`
�;�)$)���
+$
q�Z�q����r�e~{w���3�����0y��fnp
+;ح����!*(M�5������M�&�Q��]�0	�E���o�_lg˼��=�lբj0R
��U���*M�@FL���5��=�]k"f�a���xT"=e\�
����@��B�mhz�φ1">�a���_J���]uT��뛀<��b\U��p��I,���
0�	�	`D:q�u��#�����r��bp.D�����CG���j$3ʤ�\�� 5;䣨9Ss��5G����8U���j�/W��e�iL��%���;�
+�>:�'���9K�A���
�O׾~�+s(%�?�%s��9�܈'T�0	�dB�
�Ty�l�'�9\�
��:�|���
�S�!�Q-U.�� -KRu�չ���67pF�i��ģ�a���Tl���pm
��0F���0FD�
v��+Ya7��%����jV��Y���U��5m
	Nj���I]u1A;XZ�A��
g�
�;A���
:N�
:�ژ�{�
t� Q�JР@:ut<O6'@���
Ĉ	��Λ�?A�0$(�|2g�GjɟR�D!�DJ�5*-�p�k<J�K<���V��a��c�y%�����S�rBi����4�u1���d����Pt�[�B�׉�YP�oƥn
�č)҆���1iר���5�ꅭ]�k8�իe^_�/
��߰*w��|��,�?\:�n�>�
=)vn���';W�JWmCD�
��{�l�'�9\��`�ǘ�,�S�k0����"��i�3���DYO<*��a���G�u����Ƥ:G�a��xX�|��W�|foJ��?q����B>�
���X��*S��=,�� `�|"��u��C�jc�hߚ4�zn�ܚ��)����.+��jS
Z4�@Z*�(�C���.����N�}#�
+D4=�6c#�J+O�f�]v,���G7?�d�����*���&��f��77���m��v�.o3G���W
(J�'\��v���J����A�
 N������(��s�C&�ё�=\U�ϋ�vWW���ny����o�g��|%����m�.�K��H�M<jºtjoR�����@�*�whw@%
U�$W���%^
j�"i�J�ġRY�
{��,I�r�5X꣼����I�q,��y�%�5�
+j�\�>߯����K��}�,�09� 
��ӊk�|W��m�g�Y�M_�e�Υ46����$X�4�(ƪ���2_|��/�~����Ng�HƁ��,Ru_La�޺�ڙ@��	�
�3
L4�!U����nѼ��ϗ��C�u��mٱw�V���d��/���I�=7 at P!����
+�j�)�S�憧�����<������ܢ��z_<���FI���O%��P�.������S4Zq��
zi}!��5(��ԡꪙ���R�q���-C��=���vܪ�Xm�S�eq�V+�[W�@]:�h-<*���i�<�

_~���o���O/���ꏸ���K�e}!b�W�,�_�꧙;W��7����%�$��#F�t�=��
Ө���i¨<,iTa��3Ǯ+�B�.�
<���p��˓b�<4؜k�\f߈(���`l����D��o�W�7K������;]��p�M�P�
����@)�m��5�xJ�a�k�q�Q��mg����f
Ej���g+�K#"�H	�iDb�9<��@5��

/p+�P{g�[
'F��I08���h�}��S�V=kG�{#��
���Z�d��b��Pٶ���Y5t�\���Z�
;t� ����	���O&px�:5�8Xz2	���&�9�
�E}7B-4�xV-�����|���i��Z�H�BZ�����	�b�rH��|� +d���

b�,��z,����T_
��X�׵�^�ʉS��� �S=<51��B<�@4��L���� x���9#�E� B-4�xVo������|��i��h�ZF%�`!	0��N� ���2x|�A+nu�pn�z��e�W�f߾�g��I/�G%H0М��hH,���!��g�s
1�sDK9buf��+�N}С��}&D��)ʤ)���`%}rS���8Q,a�
�4�0๦� W��b���b"�3�fI���L>�4Zq-�����m�'J8��K�Q	�'���D�ó�xsD�@�>�{��1"V�a��
U�*򬲂� ;{$;P�ڪ۳�@p$�ӟ+ΐ�7�n�`i7��qr�
BnQ7�P
� �ջA�$i7h$�q����A��D9<�A�ܠ�C}��8�
+
�bЊ;�C҈B�e�	f�3cr$�t�D�}�C�u�(��E��鑼zY��e��x�>�9b;�u�B����1x�9��9s
�E�1B-4�xVo����ͱ�|�9�i��zP�œ�u�α;:T���
��{z%7�B����
P�q�P�aIzꨌ3�Q!�ؘ���xJ7"�H�F��1��8�i�1V���e��bH���D�)2�Ё��D���fi��
g�xP����۹#d�;E<	ѽ���_
�g� Y�ڒi��81]�
�#a�^�i�u9�nW�����\���%���o�l��B�����{�����*���
 ��7ی*[t	�%
�Ͳ��x��ΨQ����#��_�z�
&��
+R�r+���wE���ŋ��{4ߡ}��lѲx��ܽh�|
Z>F�{�&
���(?��6����ƭ[��~�>|X�Dku,�tR�?�$t0endstream
+endobj
+3222 0 obj <<
+/Type /Page
+/Contents 3223 0 R
+/Resources 3221 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3274 0 R
+/Annots [ 3225 0 R 3226 0 R 3227 0 R 3228 0 R 3230 0 R 3231 0 R 3233 0 R 3234 0 R 3236 0 R 3237 0 R 3239 0 R 3240 0 R 3242 0 R 3243 0 R 3245 0 R 3246 0 R 3248 0 R 3249 0 R 3250 0 R 3251 0 R 3252 0 R 3253 0 R 3254 0 R 3255 0 R 3256 0 R 3257 0 R 3258 0 R 3259 0 R 3260 0 R 3261 0 R 3262 0 R 3263 0 R 3264 0 R 3265 0 R 3266 0 R 3267 0 R 3268 0 R 3269 0 R 3270 0 R 3271 0 R 3272 0 R 3273 0 R ]
+>> endobj
+3225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 719.9123 205.8353 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_a7961325727c376428ef2f9431e0c204) >>
+>> endobj
+3226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.6509 719.9123 275.2941 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.1454 719.9123 390.1622 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [408.3738 719.9123 454.3907 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 670.0991 191.7375 681.003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2356 670.0991 237.3955 681.003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_b76731fc33f60619d339fd146af90e7f) >>
+>> endobj
+3233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 631.2448 191.7375 642.1487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2356 631.2448 284.9964 642.1487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ac61a0c0f3a687ef1d79d9014238554c) >>
+>> endobj
+3236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 592.3905 198.3629 603.2944]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.8611 592.3905 250.6465 603.2944]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_319084c6ac93db482a8742a58e2e01f3) >>
+>> endobj
+3239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 553.5362 198.3629 564.4401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.8611 553.5362 298.2473 564.4401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5f1ce9b2af5f6ba550cd9080ff83077c) >>
+>> endobj
+3242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 514.6819 191.7178 525.5858]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+3243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 514.6819 288.8524 525.5858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e627d4ce07125a5bf6dbe4c4464bfacf) >>
+>> endobj
+3245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 475.8276 191.7178 486.7315]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+3246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 475.8276 303.0791 486.7315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_dcd50fc4fa1b8e5533d7af0513d1a833) >>
+>> endobj
+3248 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 436.9733 176.8637 447.8772]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_beb3e0b3cafb96de2ab53e985c574bb7) >>
+>> endobj
+3249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 361.5656 143.6949 372.4695]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_b4b097033191e38bbb59add2ebba3e70) >>
+>> endobj
+3250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.5106 361.5656 213.1538 372.4695]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.3173 361.5656 382.7063 372.4695]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+3252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 326.6964 143.6949 337.6003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_cddbfcdd0e7dd70c2258493ef67d0911) >>
+>> endobj
+3253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 326.6964 189.6323 337.6003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.1964 326.6964 282.6625 337.6003]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 279.8719 143.6949 290.7759]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_91546e88fe3474f55bc6f0eceffa7251) >>
+>> endobj
+3256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 279.8719 189.6323 290.7759]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [271.9389 279.8719 347.4049 290.7759]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3258 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 245.0027 143.6949 255.9066]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3f2210364b954a8d532905d09bcb7149) >>
+>> endobj
+3259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 245.0027 248.8592 255.9066]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 210.1335 143.6949 221.0374]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7fff251a8cd2ecd8b928175af94d7069) >>
+>> endobj
+3261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 210.1335 248.8592 221.0374]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.3882 210.1335 330.3329 221.0374]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+3263 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 175.2642 143.6949 186.1682]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7ded037fa4c26b2e12565d3aa2c6b70b) >>
+>> endobj
+3264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 175.2642 247.1757 186.1682]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+3265 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 140.395 143.6949 151.2989]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_9de293fc5ed59d0122ccd78839b1a668) >>
+>> endobj
+3266 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 140.395 247.1757 151.2989]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+3267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.2627 140.395 329.2074 151.2989]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+3268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 105.5257 143.6949 116.4297]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_04732c1c89db2f6d76b3b9479ec2fb99) >>
+>> endobj
+3269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 105.5257 255.4847 116.4297]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 94.5668 143.6949 105.4708]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ddca3baab772ce17fb5133b0c4e60c33) >>
+>> endobj
+3271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 94.5668 255.4847 105.4708]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.995 94.5668 341.9397 105.4708]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+3273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3224 0 obj <<
+/D [3222 0 R /XYZ 90 757.9346 null]
+>> endobj
+3229 0 obj <<
+/D [3222 0 R /XYZ 90 689.1924 null]
+>> endobj
+3232 0 obj <<
+/D [3222 0 R /XYZ 90 650.3381 null]
+>> endobj
+3235 0 obj <<
+/D [3222 0 R /XYZ 90 611.4838 null]
+>> endobj
+3238 0 obj <<
+/D [3222 0 R /XYZ 90 572.6295 null]
+>> endobj
+3241 0 obj <<
+/D [3222 0 R /XYZ 90 533.7752 null]
+>> endobj
+3244 0 obj <<
+/D [3222 0 R /XYZ 90 494.9209 null]
+>> endobj
+3247 0 obj <<
+/D [3222 0 R /XYZ 90 456.0666 null]
+>> endobj
+3221 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3287 0 obj <<
+/Length 3334      
+/Filter /FlateDecode
+>>
+stream
+x��\ms���_�O.5c�xI��$u�qjǮ�v�I2�<I�R$KRV�ﻸ`���L��IFD
�.��.p8��?22x��B�q9�ݜ��\�ᄸ�'��$|{v��{)FI��첖 	������1�ק�1
�9%x<��L�ߜR<^/ﯫ�vz�rq��n�����o������{B"�DJ$$�`����RJ0��xċ������
�ע��-����
+<>;5t\�l��}�\y[]V�S���j�
zL��BO�;
�r�L�����+
���?�`�;x�1��nN8e������?����
}�±F�J=�0�������(Fa)CX
+
&P��
D!I�
�u�/4

�l�(����^�J
+�Z/��V��n����O�\�vT�$B�h�����T��M�4����8Bڣu�AD����'�+y�v���
ow�Z�.Z�9E�h�Q���G��
+��V���,�l����A���Cw�]������n��	������Tu�
i�����
��>z�+��"���'�������ӄuq�|�ʭ�m
YU�1�m��?o��k��/������	�1b�2��7�_By���?�~�⛗�k̨d�
AE�����՛������{Y�GK�q2�Z"���3�0$���ޛGL ��Mb��i����C͐�~TU���b9w�c������_@~��buռ�_;F���;W�T��X�)OJ:
�m��/�
���Ya��5R
a
+�B�S(0V,0��L��ӛ�����#�-�
Z`b��P��V���rh{����FI�17����%3�֌׳��j��.��
k���Ԅv�I�
,5�Z�/5^2�+5�
�Oֳ}Zj,	C�:��_�u*wx��HJ�����p��e�(5@�1zT��d�J��}r����ڥX�ͥ�O�n��a��
(��1��Jqvt�ѥ��2�Y-�ꏇ��O$���#�	���q��c۲t�1-��V.цu\r��!*��
��v���\k��Q�^%L
3i��y'TA;����P�����iZ!���

��,H��PH-Iy�U��A�Il_߲�â����| ;
+Kz�
����
;�'��ƅ�)�&亜�$�Evs�G�)ad����iB��"���O�)1x,%�s��m9J̙QbA��ĶK���V>�
f$r�?l��)�Mi�
U�k(R�:����!�+A��<�
�r��!Ր��U���Y7
+-�Pbq��#�HF�=쓉��]�E��u\w�=�y�榏�CK$
e%:�2
F3;}z�
����ڡxN��	n_������'�t�-mh
+K7�|@9��r�Q�r�R�
�
+������̎�FL�bx��=�dF"��-M���t��?[�og����v
/Ө����{�aRc�[
I76,��(�ÎP%�H�W�WKx]����u�b��7Ie�F�o�$|aR�C+����	����hzdk΍A�1yL�ed*P�}zk�c�y�=ej����i�}�w
��0ma�l�9�P�[�V\=z��TW�C
�*���*xl�^0��Z��:gZD���oo�}�(�]2�;J���K����٦�N����i���^�G���T�N8
*R��BVq1�_0#�{`�)Pє�GP%�6BT7����O�k��G�_$#�
Vo�{N�*��Z�T��ۜ�ؓ%P�!\�+v�\����`
+e	�YƬ���pOa��ӥ$64]�v����}��
)���?=3��
��a�0��b��,V�ZM���ee�&C���:��5�d�C�� �	iJ��6`o$ ����X���T��[0��mՇ���KF$r����$�&�BJ�-(� �*�6�:nw���z������%���C�6���G�����x+�,5U�(�d�h�ìY�]9Q��"��l�t��_����	����t�Q)�?��P� B�_�P���
$X�HX���տ�A ��`$@�O왋	3����@M�
�#� ��U�\T�~���a�;�6����|���i�.�Z����c6=�tJ��I�\İL��b���}hK^0��Z��H:�[>)�(�$o%E��K��A�������tV�k�fR�/Lc@L���֡=�@
5�uj�ΏO6�Ñ��u,#C�fm|[�o�ӣK�˼�|������vt�Z͖�]��Х�hJ����P�H�A>�_0!Hh�
�!d�"ʹ*e���3< [...]
w�}�!�L�D�.Z � +s,0�R/�u��R{�^/�V���Q�]������&����J���\i�
Uҭ�ݤa
�?�?�!B�Q��c�
��?[�������*�k��b�!���M�ϫܮ�%y,^���&����L����[+* t�)�VV��H`.��z}�j��R;$��$r]߮�'�`����.mޠ(��y78P�cCIʎ���0
b�QǠc�T���*7� >�[�>��$�u�=���	
F�Ҡt�&��	
	�%t^�O�Xm>�[j�$tހD�K��z�^������]]W��b�yWxP�{���دNjlׇ���
��%���Q�����a�&"܄4a����^���m��I)m�c��
+a�u��H
+��
)�:Rh�͒B[� R(��u�0_�f�j_��Y2����=���. �`
�?�
+`va �RT>RA,#C����z�m�R�J�����W`$
)=,�`jz@�7�e�7V�Oߖ�!�7 ����b}��W='��MNY�G����
������L6 ����\�z����(7�
+�
6���^��C�VN�H`.��z}�j�I�R;$��$r�������bՐ�U�=߬�]қ3���,*X+4TW��,<$�1F
��*r$#��
���i��t/�����~˿]�m��ф:^'�6�s�	ś�U�AZ���TD
+y��L�?�%a� �b
�Ŵ�u/a�L�O1�'n
�Gv�[�_͛��N�;7���n�c�6��VW�W
��Ͷ��9�4����g����&���Kͧ��W� s_�D�h���hȉ\;���~�ճgwwwh�C���f��g���Y�������J~�ˁ[Z���
q��=���/ o���p�fj�ɠ�gRS�5<endstream
+endobj
+3286 0 obj <<
+/Type /Page
+/Contents 3287 0 R
+/Resources 3285 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3274 0 R
+/Annots [ 3289 0 R 3290 0 R 3291 0 R 3292 0 R 3293 0 R 3294 0 R 3295 0 R 3296 0 R 3297 0 R 3298 0 R 3299 0 R 3300 0 R 3301 0 R 3302 0 R 3303 0 R 3305 0 R 3306 0 R 3307 0 R 3309 0 R 3310 0 R 3312 0 R 3313 0 R 3315 0 R 3316 0 R 3317 0 R 3319 0 R 3321 0 R 3323 0 R 3325 0 R 3327 0 R 3329 0 R 3330 0 R ]
+>> endobj
+3289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 707.9571 143.6949 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7e3ffa1dd9894e6418bd153a4cd2de12) >>
+>> endobj
+3290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.8287 707.9571 227.9891 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+3291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [306.6852 707.9571 382.1513 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 649.3837 143.6949 660.2876]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_db355a57fc1949b2ef9627d45be5f9bc) >>
+>> endobj
+3293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.8086 649.3837 248.077 660.2876]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+3294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [310.1952 649.3837 385.6613 660.2876]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 602.7654 143.6949 613.6693]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_f623edfed6d4816ac5573f42a6a1e801) >>
+>> endobj
+3296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 602.7654 218.9621 613.6693]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+3297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [242.155 602.7654 317.6211 613.6693]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 568.1023 143.6949 579.0062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5c02cdac1cee4eda75e568ef9f550da9) >>
+>> endobj
+3299 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.0321 568.1023 191.286 579.0062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+3300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.4789 568.1023 289.9449 579.0062]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 521.4841 143.6949 532.388]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2f516cd923f94296daf57c8ace328af9) >>
+>> endobj
+3302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.3652 521.4841 298.7863 532.388]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+3303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.5302 521.4841 513.9963 532.388]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 474.8658 143.6949 485.7697]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.4345 474.8658 195.2411 485.7697]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c8a2f81fc1c5b99600d406300792119f) >>
+>> endobj
+3307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [222.5783 474.8658 241.1784 485.7697]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 438.4163 167.4656 449.3203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_df00a3a6522cd0b27a52ba3e2ab5c8ab) >>
+>> endobj
+3310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 438.4163 189.8814 449.3203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 366.135 190.7379 377.039]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 366.135 261.8505 377.039]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_286412c3f05e82abdf69c5e5562ff949) >>
+>> endobj
+3315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 329.6856 190.7379 340.5895]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 329.6856 262.1594 340.5895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7e1a00f36570e89ee95817d898587743) >>
+>> endobj
+3317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.2253 316.2672 390.0817 326.1725]
+/Subtype /Link
+/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >>
+>> endobj
+3319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 293.2361 183.8239 304.14]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c86971c152fbb8d2d486d7396ad6b142) >>
+>> endobj
+3321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 257.1602 192.2722 267.6906]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_901382835b88fb9969d88eea101ae7cf) >>
+>> endobj
+3323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 220.3372 241.9353 231.2411]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_339a341a2f7d60de83e4feb3e8986558) >>
+>> endobj
+3325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 184.2613 189.9009 194.7917]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_70638e55ff0529f6f481db703645be05) >>
+>> endobj
+3327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 147.8119 193.2289 158.3422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_bd6b88d6fd6e0259faa544106b08aeaa) >>
+>> endobj
+3329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 110.9888 238.4586 121.8927]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_055f3030915a1b7de0cc50761d9a3245) >>
+>> endobj
+3330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3288 0 obj <<
+/D [3286 0 R /XYZ 90 757.9346 null]
+>> endobj
+3304 0 obj <<
+/D [3286 0 R /XYZ 90 491.8635 null]
+>> endobj
+3308 0 obj <<
+/D [3286 0 R /XYZ 90 455.4141 null]
+>> endobj
+3311 0 obj <<
+/D [3286 0 R /XYZ 90 381.1104 null]
+>> endobj
+3314 0 obj <<
+/D [3286 0 R /XYZ 90 346.6833 null]
+>> endobj
+3318 0 obj <<
+/D [3286 0 R /XYZ 90 310.2338 null]
+>> endobj
+3320 0 obj <<
+/D [3286 0 R /XYZ 90 273.7844 null]
+>> endobj
+3322 0 obj <<
+/D [3286 0 R /XYZ 90 237.3349 null]
+>> endobj
+3324 0 obj <<
+/D [3286 0 R /XYZ 90 200.8854 null]
+>> endobj
+3326 0 obj <<
+/D [3286 0 R /XYZ 90 164.436 null]
+>> endobj
+3328 0 obj <<
+/D [3286 0 R /XYZ 90 127.9865 null]
+>> endobj
+3285 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3338 0 obj <<
+/Length 3702      
+/Filter /FlateDecode
+>>
+stream
+x��\ko#���_�O�
�\����&A�,�ݸA�40d{lOkI�$����^�
)΋wl�7�b +KW�
^��g8�����љQ�8!��bq at g�������>?I�<=x��V3G��zvzUeЌ(������#��O����1�G��b~���ӣ���Mq����P�����ׯ�\�z���_^}�X��iM�����CZ��.\����4
bh�����fs|�=:=v��X��ηE�λ�X3{T,/�-ǔ=b\��_��r5�TB3_��
��
�]BU�r@�pV�
�J�s|�8�\�?n~<�[�SP}a�S$��rmg'B���CQ�JŒ�Ё\���
�xZf����b�/�?9W��1����҄}���rM�cm����+5�N���h}�ļK	�x�@/�gp�Zn��y���xXM�
i~��Э#�
+�);U���8Q�����x�A/�g��1c
fm9?�-�T`P@�ȗ F!`�A	�kx��C%X=��
�ZH�
�ƌ	7Ą	����z���"�r4�
M#ghjY�
+-���|Wl��� ]1I��(�t�+��}Q��B����	*��Η�������~�!����o����%²Sn�b��A��eѠ��F?)K��[

F��I���1��7�f���$0'� 2ڕ���P��=)��@9e
���¸s�Fg�0��z�&��J�,����m�#ׄ����������]KV�Z��-4];�l�('�Q����I�2�q-����C����԰�1ͳ4ObF at sb���#젠p�c-�뀏�!�c4zy+�V�
��r:_���
GQ�F?����ڀFJi�Q�4GF]cX����Mc����
5#���fu{Y.��?΋�CQ
� �N��f�r�&(*v$�R�� �6Dh\
@("���^j	%V��S	"�v�`�0\0��{
f�\̔�3C�邙e�̔�D���L3O 
+f�q�l�O�<�^�F0��I�˯�`bl��NB�-��%\���z�^Ba�}�d�Lr��2����2����>5Zy=�s)1�\-�#��`/�yKe4��!
W�$��j�'�2�V����֫e�h��f�Z��1Ƶ��jIӯ��%�@ ��8P�v?f�R(�ϫ���2O���Ӏ�*���j�K?	�f��(ܻP�tg,NWK����G-�
9�
a�s���{��w+���p�`jXĚ
�Ϸ��I��/.��
+����'c*�i���$��ha
6�?ن��?����//7gW���l~�������^�!�A�ՈQ.@-\p�{aT�!�gzjMb<F������\���׿ޭ��f`������B��k�h�8,|7 ���
�{]Z')2���϶-
��(q5��~���X��բA���
�/r�������T
+Vec��K���0�1�
a�t&	sҙ�
ҙ�楳;E:�zy��y^ܮ�����lZod�1
+!�eӥeEU�
+=�!
���:Q2�`�:�(�� ���ħK&�1�짙I��h��OT5�x��߁�x��%�Ծ�v��lV:l;3�ᢙ$̉f
7�f
+;&�`?:�Y���|7��_�-���[�\[��<Da�p
+��`��$�ʩ����~�IB�a��Wu�1
+#������0�By,����zM7ljAb<¥��މ-���	��/�b��M���$Fa$�߉�ndsw��UB��@��=�1
!��;�RIbC�I��H��aQ�*q��1,�*�E}��2��=�,�Մ�_L]oAr��B�ަ92�m
C�[��[o��,]o
k�[xѬ��*���,�2�}�͜�Ǧ]����bq�}�q����D`+?�t0v
?��,�
*�\2����,�^����CVL
n�
�k7a��[�[ū-����l������` �?�އ���;������
�RB�G���T��k���a��Hf���؍l�n�Qq���w�N���G��@�Ѯ8j7&`g7�4�y�f7����
�D�-����F�K?���F� ;���v�]�nL���n�I��>�nd+���`7��x����Gx�T�J2�n�����
S��7{7�3-�C�E�;�B��bﴰ��
�~Y�{9��!���.��z�ˊ[W�������[��ᦨ�7��`z2����U'��M(wW6`�j�壀/9q�'��9�\�
[��Z�4a��!���k�[>C
���|M<F���r}�r���7�����a����f�S�q�g`FA7O,@�Gh��N�|�r�!����N���DH���#�#\�y':>N���|=bF��e���iqX.�
��9�+���
�"Vb��Q	�g�+�
�����/��O�ڎ�O��L��6z�:i���a��a�7c}D��о�����:޺��}�Cǜ�K�;�
Ȩ���Y��
G�{ߣ��G��r���K?���[�9b>�рѭ0�Q��#����
\0-�,vhSlE��q��oit�h%vu�}Ą�&&b
���i�a�� [...]
�X�q
+��O4
��O�B;ڄ]�1�0�݉A��d|�5mw�
2�����TG0�#�Q�*,��j�O�/
�u�"{@�HjT�Fo��B��^�u����o	��rb��G�
9?�>���~�Y~�ٻ@�P��o�
ġ��(���
�#X���d؟�0Ԣ�	3.
�m�Z
6���6�g"zy�s7���nG
@��!
+ö~��n�G�[uҊsSK����Fs
N��
)`�ɶ>Fa��!m�é��`���q�4Gfq�a�ů/;�S��{?��eL�{�U
��|�<\Y�D��?��}�����a��%	sJ��
J��敮;E��zy=��v]^lo��$�3N�2,_����
�4�S�Qɓ�H���Z�x�F/������`��!
+��p�b�]0]��	[n���I���5Q��ޅQ�>�~�z����;ua^�!
?���C81
W�$aN��A�Rؼ��`��_�@/o}�tvYn��/�'q�O�/B�B8T�L��Y��uO,E��h��f��BZ�0X/~N�6���d���P��ݙ4GN�B�'+��[���xF�z��9Һ�
�h\�^5����aƏH�=R�P	Lf$�m$����6�	D��z���U�����Q��-�[n���i�X����Ksd&~
�t��|[n�
Zط��ކ
�M|O���u9_n7����?������#9aJ(�PB\��
�pF�\}��fl�<�	1���ǻ�Eq��rQ,�;TU���G�n�a��x�ƛbq�U���_^$rlo�ͦߛyӗoV���cg�r`i�����$,'i!
��,�N��A�R������听Q�\:+kU<F���Z�./�.F�5��+[��0���p�;��upqE��Z��q�f��ȍ��b�q�0p�vPv�Fov
�Lj�|����QQ���{w���h��B�'$�L�v�
��vY
�;x%���O4�[���o�~
�~+��oB����M'��å/����������ų���s�����B��8~]�$|�NC���zk�h��
g��6��@��p���&��~�,x~�֧լw� P�w�?v�b�X�ϳ����2�R��g����Z�N�o�
�I����~��޽~����\l����[�r�����U�F;\�8nD��NbP�K���r��/R.W�f-\���
���N��#�����(~endstream
+endobj
+3337 0 obj <<
+/Type /Page
+/Contents 3338 0 R
+/Resources 3336 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3274 0 R
+/Annots [ 3340 0 R 3341 0 R 3342 0 R 3343 0 R 3344 0 R 3345 0 R 3346 0 R 3347 0 R 3348 0 R 3349 0 R 3350 0 R 3351 0 R 3352 0 R 3353 0 R 3354 0 R 3355 0 R 3356 0 R 3357 0 R 3358 0 R 3359 0 R 3360 0 R 3361 0 R 3362 0 R 3363 0 R 3364 0 R 3365 0 R 3366 0 R 3367 0 R 3368 0 R 3369 0 R 3370 0 R 3371 0 R 3372 0 R 3373 0 R 3374 0 R 3375 0 R 3376 0 R 3377 0 R 3378 0 R 3380 0 R 3381 0 R 3382 0 R 3383 0 R ]
+>> endobj
+3340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 720.2859 187.6893 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_573ac186b0da77408bcb80531ca0090c) >>
+>> endobj
+3341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 720.2859 226.6926 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 685.043 205.6917 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+3343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 685.043 261.3124 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8e45baf04a16a09cfa25bac864515832) >>
+>> endobj
+3344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 685.043 332.1558 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+3345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 650.1738 205.6917 661.0777]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+3346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 650.1738 261.3124 661.0777]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3c8e578089e8420dc286b27411fde2fd) >>
+>> endobj
+3347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 650.1738 338.7813 661.0777]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+3348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 615.3045 205.6818 626.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+3349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 615.3045 261.3025 626.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_36e39f75a5b973533a044d606444db4f) >>
+>> endobj
+3350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 615.3045 330.4624 626.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+3351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 580.4353 228.8952 591.3392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ce7b6bb6c1aabdf57f1643e88a834aac) >>
+>> endobj
+3352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 580.4353 333.4819 591.3392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 545.5661 229.5026 556.47]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_bb6e0e38bda55fc988819da21f2689eb) >>
+>> endobj
+3354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 545.5661 334.0894 556.47]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 510.6968 187.2643 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_40ab06947d065a171792da1ce6ed2505) >>
+>> endobj
+3356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 510.6968 293.2128 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 510.6968 371.1477 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 510.6968 455.7274 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 452.9135 187.2643 463.8174]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_90cc17398be6745eb507339397381d7a) >>
+>> endobj
+3360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 452.9135 293.2128 463.8174]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 452.9135 371.1477 463.8174]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 452.9135 455.7274 463.8174]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 440.9583 220.0576 451.8623]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+3364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 395.1302 186.3482 406.0341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1039be5680ea8eceb903367e1e7aa13f) >>
+>> endobj
+3365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 395.1302 293.7723 406.0341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 395.1302 373.3671 406.0341]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 395.1302 456.8371 406.0341]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 337.3469 186.3482 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_9ffb692c7f3bd8af9b81135e38b38dd7) >>
+>> endobj
+3369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 337.3469 293.7723 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 337.3469 373.3671 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 337.3469 456.8371 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+3372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 325.3917 218.4038 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+3373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 279.9372 180.4964 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_84a324ad469ad76c235789823cf4e0f4) >>
+>> endobj
+3374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 279.9372 226.4338 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 244.6943 213.1533 255.5983]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_94dd083371c61a3f54521caed75e2820) >>
+>> endobj
+3376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 244.6943 259.0907 255.5983]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 209.8251 213.1634 220.729]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2ebf93b52454102cd99eaa211ad6ff71) >>
+>> endobj
+3378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 209.8251 259.1008 220.729]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 175.3294 161.6774 185.8598]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2f964d43c2798bde1924e82d88971ea2) >>
+>> endobj
+3381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 101.9143 205.7516 112.4446]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c5eb33b72a86a33d7ae4685d376b50a6) >>
+>> endobj
+3382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 101.9143 276.595 112.4446]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+3383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3339 0 obj <<
+/D [3337 0 R /XYZ 90 757.9346 null]
+>> endobj
+3379 0 obj <<
+/D [3337 0 R /XYZ 90 192.0566 null]
+>> endobj
+3336 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3400 0 obj <<
+/Length 3522      
+/Filter /FlateDecode
+>>
+stream
+x��\ێ�}߯�B�V�/B ��N
8��`Eή�p�͐+y�>�3ӽ=��I(�2l�A��aՙ��S�=6���
�e�R���Wtv��vŚ����������/��9�4׳��ʂfDq�g7��
>/��t�͂����_-�Yp:?���r����M�*�^�����⧛�^~�Xb�iM��x��!-��.\@|y��� F��u�:
�\�����yq��[���ȷ�mQ.���5
rL�9�����&������`��ꇟ�lQ��ᬚ��?(a������"���z}��h�����РLj���'I����� ZZ
�M0¨33(�u� F%aFpH��UL��@2C4�va>�?r��b����
(�/ׄ:�v��J���Zz0���U�5�oS�����,V��r}�O�j�?
�d8�D
��!�
+
�
�Lt�O�(�
�����HD<F�g��W1
+��O�Sqߥ# S��.��BH�	�J�I�X!
l(
��l��#L��}
1��
Z�����3
�����FK

yR�
u9�m>��`j^gMup�o��$-�d�Ѯ����}
+B)$E
9
jk�B�y�#�|_4�IY�+%EE���hjL��v;�
B�HS
"
A:���}���p��p�����|,|���Y
�Y��E�OU�pD�"
U��`F����ܢ��v=A�=�A��b��i�+�2(�T!A�(���h��

���_s����x�A��4�X	�>��BH�p!�Ɂ*��^7�Y���i`��.�g� ����]^%���bؠp	|6�S��� ��O\�R�S�/ˠk5i��`��B�+;Ч	Km6 �w�
���v�G[>�{�Q51�p�Zm�n��0d�#q�@����뻼�qG$��y����ب�%A��D�gY��5��ʚ��6pf�T���@QC��S� �%*1�Ө�� R�[\�Z���T�D�n_����|�ښ�CD!8��Hݍ��XI�|01����m��hwf����ug
+!!@� ah� �ʷg�wi�9ҕ��HW�aҕm�4,s
�6؛Y(t�S�0ed���0e8�����"
հ�`F�����ܢ�v=A�=�c+�QA�V�
+��٠D�Do��3�҄5��d���Gt�N�2薨���&n@!$�TG;Ɂk��n�Zi&&rJ֠~�*��B��.�e��{M�-�Å,1���� d�[\�Z��Y�DϮgQ6i�|�=�M����
+�(�$�.\X�Ktb�+ӊPupbH"
�ѳ��3�I� :��Q�wA
�����뼀qI`�~��%6r`S��Db��A����F&?y���
�]~�KQNl-�9�jP�t=��)W�i��'�[��)��e�~�%�
+s�
E��yp�K��
�q��4�i=1�p�Z������Vd�Ay�_1���v����
��Q��FF�"췷�?}���\\�$$'�
ۨ�0T�R��B�6�r�*X��	CH�����ֵ�e6��Q�ea�;1*d�C�����h�����sP�E>��
B%�i��6��"=k,���� �Mo�K�T%���%��9��a�r%sʕ��+u�+W���ʓ���)��=�p�T>"���~A�2�=�ҥ�2�O�I�c4zv�m)ѣ�M݀BH


+w��A��duc*cg�Xb#'b��XyX�C�����Y(!5�0T�R�5C�6j�r��Y��5CH��z�����q�(�����;_�Y7�;���������Gt�z�/���W�v�f��>�L�R�CQ.$�@�� VdeV��Uг����RኰZ��
O^��c�ԫ7T�M)�:
3C��1:=��>��M��¶^�����m�V�B>��BX��+ x-��!Iu�
��+�$
+J`�-F
�Zҏ��Ԍơ�����F���}�?6a��fP��5��}�*��	
�H��#XUr�:
�w����vRհ�����@\�9��ip�#�
�a1�h�8,:�qax�I
�JN�o(9�[��\O)9y=��KN6�%'�>��V�G[f�c�N�B�#4�v{u�|]
��h'u>��0 �X�8
�o�e2$�&_���e�*E��\)
+�v)R�
�"M���m3̔����ٝX�D�J�LĮ#
+a��{P�w�2\�#��+O�(�&��A����j����EaX���T����J�C�J
��,/����3>;�=�G�Og�.$��
8��č~.i~}���ֲ,-i��%�z���-��e����K��c�r^Ǟ���X�i�b�O���~�԰,��UOa�?���xY'S����j+�Q��<M!Ph�a����g��8D8¡k�sh�"�^������y��@��+J}�x��'+m�Y��R��a��_�,8�tCX�
�!tY�&\a�����&3��5Bk�f��j�u

+
Ξ�����Ȍ+!
1L_�r^u�F�r^�����6��-��
�]O�C�DϮg�������n7��ГHo>�P�O�8��ڎ�
I��HD<F�gwL�!B��}@an�#VX�v�ɢ����w���,�'"����VXMK���O�4��@�b!��]�'V~�#z�
'�i�k�j'�\~���j�]e�0\P�9A��
������z���I��V뚇��\�9<�7�
�%Ji�ED!,�
6���"�dB�����x�F�I�9����臬�m���B��$=kW>���� �^�����V��|�
+
M�YKI����;��r��%#
����|��
�=u��p�
�u�����
+���
h����e���ϫ�@3�YP�HD!|���r�:1~S�NM�԰D<F�gwl�;��
9����:�kW'
�YϬ����R�Yaի�na�3��)����gM���2���f�'�F������;޹3a?�z�0��,Hu�9��|{�����IQl�_cW����^�_�<��E`�¹����Χ9�
h�~{
������C�nW�㐫k!�tgg4��"�9^�V�fu�N�)��F*C���!5��
�ߦ2��f+C��ʀ��
���Q��1�(��ߥcڈ�X��ͯ�&F&�1=�#�A at k��̟| !N�o�n;�J�nE�Y�!��+
6�!����ٌp9�/�
�I.��D.�����	Hݢ����	�A�D�nh7�[��mQV�Y��	a�B����DB�?��8,��#�{N������h��u���(��}@an��"U'1	�$Vɳ$ ���� �D��|�2��j8�׵f.@�����. at 8�����#�|���/��{Ѕ���_[�6XW���������yk�r��z��&
�7Փa����3�3���yqp��wǢ��B�y�o_����]�٫�;o�(�q��҇���ϝ�]l����T(�E�U��o�=
���N����/�%��{v���=�
^�|���{�>�����$��ˇ���./	�C�a�Z��#
@=.��Kʡ���y���Pց�?��b

���,饣b�T�
p��eendstream
+endobj
+3399 0 obj <<
+/Type /Page
+/Contents 3400 0 R
+/Resources 3398 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3274 0 R
+/Annots [ 3402 0 R 3403 0 R 3404 0 R 3405 0 R 3406 0 R 3407 0 R 3408 0 R 3409 0 R 3410 0 R 3411 0 R 3412 0 R 3413 0 R 3414 0 R 3415 0 R 3416 0 R 3417 0 R 3418 0 R 3419 0 R 3420 0 R 3421 0 R 3422 0 R 3423 0 R 3424 0 R 3425 0 R 3426 0 R 3427 0 R 3428 0 R 3429 0 R 3431 0 R 3432 0 R 3433 0 R 3434 0 R 3436 0 R 3437 0 R 3438 0 R 3439 0 R 3440 0 R ]
+>> endobj
+3402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 708.9533 209.6269 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_acf7b2a7e0bb5007ce8cd9506d06137d) >>
+>> endobj
+3403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 708.9533 314.7912 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 674.0841 248.202 684.988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_a366a38561684a64bc0a042702534a07) >>
+>> endobj
+3405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.0176 674.0841 329.8447 684.988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 639.2149 212.377 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_b85f80c281c840eedb4f228757b8515a) >>
+>> endobj
+3407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 639.2149 289.8459 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+3408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 604.3456 216.2524 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_92ef9a99d160f55e3fc44a4bd1ae78f2) >>
+>> endobj
+3409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 604.3456 328.0421 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 569.4764 254.8275 580.3803]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_736577ec65f40b0637f13486e64f051a) >>
+>> endobj
+3411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 569.4764 343.0957 580.3803]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 534.9807 236.7449 545.5111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e862a635387c2458da51889c20465f0c) >>
+>> endobj
+3413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 534.9807 307.5883 545.5111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+3414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 499.7379 240.6203 510.6418]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6d2f7819b7359865679b24e683231303) >>
+>> endobj
+3415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 499.7379 345.7846 510.6418]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 464.8687 243.3704 475.7726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_944e2c41213d3ea40e74930a90de97bf) >>
+>> endobj
+3417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 464.8687 320.8393 475.7726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+3418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 429.9994 247.2458 440.9034]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_22f9ceb879f1c8d892f60fb3d9577d81) >>
+>> endobj
+3419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 429.9994 359.0355 440.9034]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 395.5038 193.5774 406.0341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_87e906459b095e23114ee8f0025086cb) >>
+>> endobj
+3421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 395.5038 232.5806 406.0341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 382.502 248.8445 392.4072]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+3423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 349.6756 193.5774 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4b050985a103d89eaa5627c16f4f4257) >>
+>> endobj
+3424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 349.6756 277.6909 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+3425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 336.6738 252.6774 346.5791]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+3426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 303.4739 223.4647 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3daaa36a6bf749e0b4d66ce57878e2d0) >>
+>> endobj
+3427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 303.4739 269.402 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 268.6047 212.4067 279.5086]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4fa25e2eb21002cdc4c883dfe93acbc1) >>
+>> endobj
+3429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7438 268.6047 258.344 279.5086]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 233.7354 229.5525 244.6393]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e70fafb10013762e436a434564d7e931) >>
+>> endobj
+3432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 233.7354 275.4898 244.6393]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3433 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 196.8736 249.5271 207.7776]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8fcea2415bbaf4d987e4cb446ffeeb4a) >>
+>> endobj
+3434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [276.8643 196.8736 295.4644 207.7776]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3436 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 151.0455 266.6729 161.9494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_d9dba7a094763a47be44e246c1120fa7) >>
+>> endobj
+3437 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0101 151.0455 312.6102 161.9494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3438 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 114.1837 237.0341 125.0877]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_0af2f849fc2bfd051057f229d750609b) >>
+>> endobj
+3439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.3712 114.1837 282.9714 125.0877]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3440 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3401 0 obj <<
+/D [3399 0 R /XYZ 90 757.9346 null]
+>> endobj
+3430 0 obj <<
+/D [3399 0 R /XYZ 90 250.8362 null]
+>> endobj
+3435 0 obj <<
+/D [3399 0 R /XYZ 90 168.1463 null]
+>> endobj
+3398 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3458 0 obj <<
+/Length 4963      
+/Filter /FlateDecode
+>>
+stream
+x��]ko#9v�޿B�:0b��hdd��>Lf:�ewa��r[�,9���ίϽUE�,V�5m9���X�ѽ�.��ç؂�l���(C��zq}��.>��������u
���7�~�����^|�m-hFg|����K�֌R��a��rs��\���ty�=�57�����������>|]���������"Ӛ(-%0@���A��.�G��ßF�p�P�����w��i��.?�
_6��͹�����m�+f����rL�%����͇�>�Jh����7�+]�@T���Z|��0������¿ؽ��Ϳ;���
+ERK,�v��X
_C1*	3�CrA�V2��q�!�s�0
�_8W��c�F�Y�s�
U��5���n?�e{���Vn�?:~�1?�$<�F"��,n��+��P�X�WP1���CJ�i�W�hT�g�h
+���U���?�3�R)9�������"���&4'T:Wyz���Ւ(IU���<?��ZH�8�Ah�����Z�{��
+E��H+���2ra���]��%v��~���ia�'����WXg A`�f�2� �Y������A�uJ���r�Е`�,$���>$n?
���ϝb�����k2��അ̿�}�z<m�����A/����y*H�܉rT�B��1(��4�
���f��k�V'r���F��T���x��2"u[����/���B0���mM�����|��e��#�BJ�}R�k�$$}H+
�|�=u���f
�m�~H�Y$��t%��ʃ�v��}Ӝ�]�;5���D� t�
�_o��C�J�xk�w���U!'8hR&]J�p;VP<��b��e{�랼�Cs}�7T��������~���0�� �ZKi���
1�$��z��fwj��:hN���s=?
���w�%9t&�	�
t&��1h�]�ul!
Qҟ�I���w�>���i�Բ��)�$�|I�S��w�f�Q���u��7 +�]+�w��i�
%i��.�y=�F"��& [...]
+	a
�ܸ��P�`l�
(#�{�|5�����KDNl� r,�t1tz҅3n/��
+�%��Y�� ���+����E>�u�����LKl
P5f�!�L�M͹'.^
��i�����.�:�v�:��(u�;
'�N;!�"��x
�:�
Ac�_�:М���յH^K#>�u<��u"�%�S��N춴�)v���"F�����"�O;9nv��jn�fL�� �Q��a	�
+�V
`O�ǘ�y��Tsc�UC�u�c-�ҩJ<�F�1
%ɬj<랡��(լ����0��"��];I�����|�M�|LW�C@�(X��eqlv����pRZ��?)
1���	�
+���,���-EC�
�|�8��/p
$v5��*�N:`J_���(�� KU
����"sF���	���T]�5Q8�=!k���	��D��$`��%Qک��� 6�R=(����b��=J�=� Ak{���@���!v�ˀRX"������sq��F1�C)��+e�^�I�PP{L����-��N�Q_�4Y�����FV̰�
-��$�x� X T
��HK�[�$����T#�~��u7��_04��H7����ul�
R�0�Ӑw�N�j͖�"PB�6P���w_�K���T�~������*��BI�3q
+��Y�j/A&5��]�-A�7E1�8'�q߀�^h���x�� �0�w�`ESjC(��hXU �
������X��H
]O
`�������ܟV���#PR�. ��JdL�H��|���nU�Z��J��
+N�FjǴ�~^�E0ݡy|�Ifw���. +�P
+��j@!�`�Մ
+��
���!	���n���E�8*����Df���%����T���Zǰ�fmP$�[����%4p6��g���FI-{X��%h���^9�so
+7"FR]�N;�'vB1k���]�M���N�����64#z�B�.���tz��JA�v'�22K�2r.�e�5�a�j��-�T�2}�\�� ��͒˸H
p܉�ɰI��@~J�JE��/���:��
�g���o���朲4���z�4�_����7����%u0Z�������82XR�e�^�nK���b�L\��[|�Df�ۦ�
�m�PF\	L�F���-#���|�Ffw�
+��DpV�U('�
+oww�\[E$�vn�F!�;G�c�w1U� ��
�j�)Y
�z\��%
n�0��ң�|��zЬ*)�iL�]�=�L �0F�Oco�w���@��%B4�Q��N�v�k|1�2�.2[j�Ifm��p�V��Y[
} ���O���'m�F;i�a�
+R����tc��J!�v�'m��`�8E�l���ڃr��)[C��
9!
+yoL��)�ӵº����=�
+p�7
�Ɗd/�g_oQ�iV�pkuL��
ψ�R�9��Dↀ�sX���F/�b.��b.6Xs��g��N�9�z0�H]�\�����~�4g��������Ṵ@J���fnh��"�;{C
m9U!!,^'@�dT���}.�����P���t��`�(T��Pq�L)xA�O+\^����kn@
 %����R�_�_oK��yb���-��a��
+	�!���D]�A2�����FI�yXz�D��&
5��
pP�$�O��=�l�?��{>�_�O'�0
��C
�q�ψ�3Uf� ����WJ+�;)���ഌ�e��g 
�n
P9�T�i�Y�4�Z�~�&�41��,��p���,�����I���Wׁ܁5�jVXU�
:��ׁ��Ҥ��N\'�Z|�Df��6�FϚ�x ؈rH�†K���lF׹�Q8���x|���n}�'��pY�@���x���":�"-
�7x4�*:;&_!�۝�o$�?j�q�
+Ԣ�A
+ow�+���	K�3���]a�ٽ��7�,�v���
�
+K����1���l��������DA�zT:�(&7���p3��f��M���^�S���Q��.M��s���(*&6��^�II�����reV�~��2�d���
zW]�[k�ɘ�
%�kwaI����c�3TC�'��ƶwB74���N!Q2��(��֩��uls�9�k���:��v���T�P���fv`7Ծ�F��yZV�V��u�I@+TA
�;�5V|�P�����
k�
��0��f�,l3�UQ���7o3���x��c���
O�YW�d2��=2X��e�^��n�G���u�����NJ��i[��������QBXᨤ|P�'�4�3;$_e0�;�^h�+#�j
�M�y͈t;`&t��0%�F%�+�r�3u;$��Rd�BB���
�fD�O��Ya�
O����2��T�
������#XI�{�ߝr�w�肢�FI�{X:},
��J��\ԧiz�
��o]RNO��~�X���G;},'����c�u�,L��Ji�v�lS���(��C��5m
P9���%���A�4��H�%��a���c�b�8�՛\�6Ǟӻ��,|��Wxِ�!��Ϯh<Tr�if�}��7�zf��셓rӢ��
+ҔD=��� 
3�pe�{���ulsD�?���
_���gV���o�e�U|���6���>6X����O�Vo�O]ϸ9�B"��� ���
+2��i��x��1�`���
+
���r�bz�#G��`|�Ffw��x�����{T�-޾��~��+���W�E
+(�QP@6�0I��/�r��6��0�8XO<=���k�=�������ޜ~�1;}��Ȥ�+\O��+����V��ZQ>���K��Us�W�0iR���ُ�T".٥K�tc�ϸ2z����`����/���'��G�{�gs�΢�����zW���S
�v�I=
v�O�����zw8=
'�
:BW
F ��peUV�%��k��Z��
G��R��m„A��������lٖW�����;gЀ
7��߃Q���3PVox��R�+��M/v[o{��9��L"������F_}ق,ǟ��hx ɹ��
������G-i!L
+5C�W
��p|�FfwJ�Y<خd��=����B�
ԅ�O+��l��

���A
�P�B���[w��A��`��rNs�PN_�#���Q�
��n� ,�)��[�ڷΌ(5��U�p
@���S
+3��KQ��5�J���z���
�o�����q����[
m\���=	$�����}���M���6`������ſ���?���
�_7�G�c�������@�>
n0�t�t�Sӌe8��4Jݧ����!Mv���7�D4�#gv��������}��\���~�p$�󻇇ݻ|5��j��[P�%	���h;�r{8v��?
�O�����|.��.���W�eXendstream
+endobj
+3457 0 obj <<
+/Type /Page
+/Contents 3458 0 R
+/Resources 3456 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3274 0 R
+/Annots [ 3461 0 R 3462 0 R 3463 0 R 3464 0 R 3465 0 R 3466 0 R 3467 0 R 3468 0 R 3469 0 R 3470 0 R 3471 0 R 3472 0 R 3473 0 R 3474 0 R 3475 0 R 3476 0 R 3477 0 R 3478 0 R 3479 0 R 3480 0 R 3481 0 R 3482 0 R 3483 0 R 3484 0 R 3485 0 R 3486 0 R 3487 0 R 3488 0 R 3489 0 R 3490 0 R 3491 0 R 3492 0 R 3493 0 R 3494 0 R 3495 0 R 3496 0 R 3497 0 R 3498 0 R 3499 0 R 3500 0 R 3501 0 R 3502 0 R 3503 0 R 3504 0 R 3505 0 R 3506 0 R 3507 0 R 3508 0 R 3509 0 R 3511 0 R 3512 0 R 3513 0 R 3514 0 R 3515 0 R ]
+>> endobj
+3461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 719.9123 217.1088 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_161c87c94b78fd1111365e185d0a3ae7) >>
+>> endobj
+3462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 719.9123 263.0461 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 683.0505 271.1256 693.9544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_fb683aefdda7a1c5dcf92ee2a03daf81) >>
+>> endobj
+3464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.4628 683.0505 317.063 693.9544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.8625 670.4223 326.2592 680.3275]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+3466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 637.2223 201.7419 648.1263]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_06c2ce3f0789aba0294da43628b50226) >>
+>> endobj
+3467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 637.2223 243.6294 648.1263]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 637.2223 371.3288 648.1263]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.3057 612.639 269.9387 622.5442]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+3470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 579.439 212.7678 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e1509738a054a1ffeb070a35c41db257) >>
+>> endobj
+3471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 579.439 252.9591 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 579.439 375.1455 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3473 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4006 554.8556 277.9276 564.7609]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+3474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 521.6557 250.0993 532.5596]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_bd266a7d827fb77e09de63dfea2f9d58) >>
+>> endobj
+3475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 521.6557 289.4458 532.5596]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3476 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 521.6557 379.5123 532.5596]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+3477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 521.6557 513.9963 532.5596]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.3043 495.8633 439.3345 508.0284]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3479 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 463.8724 266.586 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_17182f3f0d9242d5821ba59b2773ae55) >>
+>> endobj
+3480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 463.8724 309.697 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 463.8724 408.2337 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+3482 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 463.8724 513.9963 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3483 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 451.9172 171.3608 462.8212]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3484 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.2371 439.289 480.8696 450.2451]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 406.0891 250.7476 416.993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ace7b1f85601837554656295b9c90dce) >>
+>> endobj
+3486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 406.0891 357.3173 416.993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3487 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 406.0891 456.1447 416.993]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+3488 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 394.1339 202.3443 405.0379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3489 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0047 381.5057 446.0713 392.4617]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.0173 348.3058 265.396 359.2097]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e8b96392adb007f1c59758cba8cbc886) >>
+>> endobj
+3491 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.5684 348.3058 375.818 359.2097]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2392 348.3058 478.9794 359.2097]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+3493 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 336.3506 225.8659 347.2545]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3494 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2222 323.7224 466.6702 334.6784]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 290.5225 239.9836 301.4264]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_fd20bc6142cb1206b51b0b449ebf4273) >>
+>> endobj
+3496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 290.5225 280.8203 301.4264]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 290.5225 405.1043 301.4264]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 290.5225 513.9963 301.4264]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 278.5673 171.3608 289.4712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 264.7301 432.0923 277.8881]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+3501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 231.5363 251.209 242.4402]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3d107d8f8a78a3925031545c8e1d1a73) >>
+>> endobj
+3502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 231.5363 290.549 242.4402]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 231.5363 409.9686 242.4402]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 231.5363 513.9963 242.4402]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 219.5811 171.3608 230.4851]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+3506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 205.7439 456.9923 218.9019]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+3507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 172.5501 224.5705 183.4541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6d5097ef9a821f98cb97571eb52a49aa) >>
+>> endobj
+3508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 172.5501 270.5078 183.4541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 159.9219 347.8694 169.8272]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+3511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 137.6809 255.5641 148.5848]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_96038eb89649898faa9a4355206b72d3) >>
+>> endobj
+3512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 100.8191 242.2944 111.7231]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6df8193213c66dcf70814c097d7b2fcb) >>
+>> endobj
+3513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.6315 100.8191 288.2317 111.7231]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 88.1909 363.3276 98.0962]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3459 0 obj <<
+/D [3457 0 R /XYZ 90 757.9346 null]
+>> endobj
+3460 0 obj <<
+/D [3457 0 R /XYZ 90 733.028 null]
+>> endobj
+3510 0 obj <<
+/D [3457 0 R /XYZ 90 154.7817 null]
+>> endobj
+3456 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3529 0 obj <<
+/Length 4049      
+/Filter /FlateDecode
+>>
+stream
+xڽ\Yo�~�����b�c�ȵ�&Y`�3ٗlА��q'}��
��}�$�MJjR������uU�H~u����];zm�!NH}��^��O��X��
|~�����Z];�4��Z	�������
�׷w�Rz��-�7�q[-����f�yy�W�j�����:�|����?������X$�iM��,@��� �RF	�#���Ä�!�)
+���j��;����[�o��aS������x��M�[�G�){øC�W���{S	��Y����?��
+���+J�����Pœ���+Ʌ���p�� �����ԠLj���+I���O�� ZZ
�'E0¨3�0P�Z=��QI�
� ��ʺ0�
�
ќ�� C��ȹ:��^o,p�ף&��d4��z�&ԱT��\;��Dxn��V��*���N/�zWm�)�ͩ>V��qB��D
+eө�x���ˆ��pJuK�s�*֫��$^���0E9�j��_
?���cy�]���q�m'��^<�W�n����E���Z�%#�Y6�h0nU��KA��&��G��r�kN#���2v�;�d�H.��sRb�5�J�ޣJj�#�k��}�r���/s�}�#��؜&��:����B�B�k
V	)�ϧ&�ì�e��c䵅�Ѳ�UpZ�*��߶�'�Ӿ�gX/�
+K�r~��U���M�DSc��|\7
&���tҰ�<�_��[an��is������������7�
zOP$�I�wq�|�Uc�~��82Es"ف�
��Ze`L���s]�&��,�/=F�n5!�)�
��^&�("L�1��7�
���qQkE�s�{�,�ŀ���6������b�IU�6#FrъR��ѡZ���`�	��
��b������s=�%3Fr/���L�ޣJj!+���Ag�v8u�y�
+d*�F
?Q!	D{����4��p�kjv(�d�B���aBW��h*��i�r��oN��
ǀ.#�~
�0b%��p��9���
	�qL^��X�e�QPA;P��
_2b$�ج��S�Z��\�2u���X
�P���K�Y�v��Pø�r��r�y��0���'�
f��^`


�<�UR+`N*jR�g恴l�
j*%�l7x|ɞ��6�B��zwZ|xi�l
�#U[��P#$T����\}�lz�d�
Oq:Y_>�")�٤
<C��"�HF��=���l�[�n��#�\1
���]��q�_`�����7���a��
v��d�F�RAn	�2."
v�t��wU�F0�rbMW�t�[�ܿt��6;���=�[o.ۊ�s⾩���:�B��x��JΑ���ݓ�T�u�O���շd
����q��4`w��-L��4�Em6�Ҭ}q�w��e�D��`�h+��TQ��b��,v��|�"C
��|
�b
�$ �}��-��EF�������U����+(92m- KH"�
	��1\")|���嶖$ ���I���ɽTn8�~0�
W�Q%�N!�Jվ{�F�,�̹�D�XF&�Xҝ�J^�NAѦ5_�O6�EܝB�q��
��p�����k�j����<�,qDJ�zG��+�p�v0�A�tAu�ly�}<@#6�����e��A�V�����X�0=�rC�Gp���a� [...]
+�v3u0�����5�#_�?��?,prTZ Y	nY�U�@h���C��l��dhk�kw,#��
ܫU3�8��'}��N� \s�*޵]��nɟ�\_}��r��|̀1�_�@Bվ�(��������)ZjA
��ե�,1���b�V`&+3S$0�Ly���b�efJT�a��#�Yf:
����1�Ft��s~�E�D�Z��pLr�"�b��瓀/Z0�;�� ���]P
چ�*���M/^����q�����i�4��k��u��O��du򤕣��QF4��8�HI���,a̲}yX��"�9������-�W�z}�����;��
�����N�+�`�j
�Cp����T3��%3Fr/�@4�BXą����ZÀԤN�Z �*<��^�V��
[yX�+Z�]CX��
+��
�����>u��.<|pz:l�
���>�o�>-^�/��o*�h�o�-�
+��@�A��t��ȭ�vSa`vWA�e��/����T�q'�}��"p� ���7�

�ɨ�=
�k׃_�z���s��UE�-n��Z�/}�y}z,Y��P�X$�W��V@��ě��p\��z�G,08
+z����-�T���Q0b$�8��=���O=J��D.S�e�P��R0�@X�x\�"P����L����E3~�e��T�uud��P�����&V�
T�A@�i�ѩ
�N��}�Hi�
3�p+�^�i�ed�L���߷6�[�ӛ{͡^��}��<�P��D9��)'�S{���

Vf�H`�9�z=s�j�̑���
y#Fr'��q��>�	"�T�wO@,�,� ��T�
��pF��M�-ʝS9C�-m�
T�/��{֤����
��8�)�)�g _C��
ex�$e��&�ti��[�áﮪm_>�=#=V���z�B�c5�z�ωTH;<�fʹ����E���8�KEt��-�c�	��{y�ou/�w���6
��4��9mr��0N	lp2��ĸ� ?�M�>��
����C�t�#��1��-$o ���95��t���o�

�}����zZ��Z$"�C
��Pu2АuF;���Y��,�}x��dQ
�D3!�˾|
+����8���x�F�3�!Z	��;�Dk ��0�Pފ��<)B�L���I�+MִyR
�")�3�X�ۓb��L.��9�7b$�;���2��1��6$�y�T����2�C1��)\1�=��=�9*�n
����
DPI9䔖)3�H��{O�#�r
+f�:!�
�����n
%�s�wE@�,0�G"�-�QJ��再(�D2ra����D]�	i����)v���rXחbOoV��>}|��4q��pbT8I��:N�4���Y-vM����;|
��Z^�K&��
	�x^�'�Xm���s<o�H.Z�߬��px�'�{#�
+��p���(\��ᶋ���%3Frg���m�w|e�P+L
��"������ԫ1�C~��푀/�2�[
l7[�5����z��
�գe��-���C�x�G2r��ah�׷�*<
�̠�&l	M�-uD��25��^�&ƅ'���&D�.e��͜!FJ���2&ô�ʤom��Y�}��t������� �RL .=�&Lp%�gyXy�s1P���kVc@��2I
�1�ަs�P���]����q��K6�䖳:N9�ƪ� p�I�C0W�4����ع�~*V"NA�=r�膇
U2O�#k�S��$eQ�d5�̱��'5q�mYM�
x���.�1�Xx���u3NO�ݐ��i��Ӷ�>F7pM
�e�"����_����K��/3�mֳwUP+ ��r��="�u�w�ͅ�P~���μ������]f0��F��`-L� �
X�3*G_��&����~32 at Y�2<���zt����~��z�����ԋ���ߦ��wb7J�iT�5����	R45����a�5$��p�G�(��4�O\V�]&��wX֍?u�������]�D��� [...]
+endobj
+3528 0 obj <<
+/Type /Page
+/Contents 3529 0 R
+/Resources 3527 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3274 0 R
+/Annots [ 3531 0 R 3532 0 R 3533 0 R 3535 0 R 3536 0 R 3537 0 R 3538 0 R 3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R 3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R 3551 0 R 3552 0 R 3553 0 R 3554 0 R 3555 0 R 3556 0 R 3557 0 R 3558 0 R 3559 0 R 3560 0 R 3561 0 R 3562 0 R 3565 0 R 3566 0 R 3567 0 R 3569 0 R 3570 0 R ]
+>> endobj
+3531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 697.0706 242.2944 707.9746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_fb9fe84fabd3625d37c47e517034d88b) >>
+>> endobj
+3532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.6315 697.0706 288.2317 707.9746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 684.5149 363.3276 694.4201]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 662.3463 214.0604 673.2502]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6919ec5aef8459ad9c65bc36e8100d58) >>
+>> endobj
+3536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3976 662.3463 259.9977 673.2502]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.9416 625.7743 290.6933 636.6782]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_f5edabe0fbfa14196208041ded356c65) >>
+>> endobj
+3538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.7143 625.7743 336.3144 636.6782]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.9574 625.7743 454.7845 636.6782]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.6217 601.2633 310.5328 611.1686]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3541 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 568.1358 245.9108 579.0398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e1186868176c9fb31d7293bc2fe55e52) >>
+>> endobj
+3542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.248 568.1358 291.8482 579.0398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [488.0906 555.5801 513.9963 565.4853]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3544 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.268 544.6212 189.266 554.5264]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3545 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 484.4137 289.8656 495.3177]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ba476c1ff2b0f1cd58f6e76b981cafac) >>
+>> endobj
+3546 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 484.4137 359.3244 495.3177]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3547 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 449.6894 290.9713 460.5933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4aa52c6b939cf0076740afb33dd454e5) >>
+>> endobj
+3548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 449.6894 360.4301 460.5933]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 414.965 224.0028 425.869]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_070e05c80af78d7c91bee958b9848080) >>
+>> endobj
+3550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 414.965 269.9402 425.869]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 369.2818 254.1498 380.1857]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8ed22a325737be112cad6864b2a7ef59) >>
+>> endobj
+3552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 369.2818 338.2632 380.1857]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+3553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 334.5574 284.5854 345.4614]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_929caef76be87459ac964105f4c75cf4) >>
+>> endobj
+3554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 334.5574 354.0443 345.4614]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 287.8779 241.7263 298.7818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_597f9740fbc8534391d2c8cb6381660c) >>
+>> endobj
+3556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.6171 275.3221 407.6577 285.2274]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+3557 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 253.1535 249.3181 264.0575]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_0cb0abcc152d2d7c95a116efd3ea989a) >>
+>> endobj
+3558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 253.1535 288.3213 264.0575]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 253.1535 371.5186 264.0575]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 218.4292 240.6204 229.3331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_d4d12fdbf775bc0ad0bb248bbaa19370) >>
+>> endobj
+3561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 218.4292 324.7339 229.3331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+3562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 218.4292 425.7242 229.3331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 139.8693 203.0748 150.7732]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 139.8693 296.3242 150.7732]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4e6787c98290a49ce80b90c008aac5a8) >>
+>> endobj
+3567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.1979 125.321 309.133 135.2262]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 101.1599 287.8558 112.0638]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5659d55fb93c1fe31b82a674e2630c13) >>
+>> endobj
+3570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3530 0 obj <<
+/D [3528 0 R /XYZ 90 757.9346 null]
+>> endobj
+3534 0 obj <<
+/D [3528 0 R /XYZ 90 679.3746 null]
+>> endobj
+3563 0 obj <<
+/D [3528 0 R /XYZ 90 158.7707 null]
+>> endobj
+3564 0 obj <<
+/D [3528 0 R /XYZ 90 158.7707 null]
+>> endobj
+3568 0 obj <<
+/D [3528 0 R /XYZ 90 120.1807 null]
+>> endobj
+3527 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3584 0 obj <<
+/Length 3050      
+/Filter /FlateDecode
+>>
+stream
+x��\[s��~ׯ`_
r�\���q�6�4MS�Q��d40	ɜ��
+B���{� �
,�
I#Wv;
�y�p�����|{ ��0�#3�gJ(d����
Ϯ��?����%|���^����bf��T�.��$A�:�X�<'�z�$������e�o��ۻ����.ؼ+�����o��^|���"�	�9D`
��!
�#�L����?�P���M�����XR��
C���f�Uy����*/D��b"�0l��}w��j�LKֿ�~������g1������Cg�3NY�f{���ߝ����C�±@��ْq�%
= "�
NZ����$A���I�0��^��q����,��P*��
GQ�f����C���
����Pe�fUػ�~� 4���B�ߔ�
�LO�ҷjCYe�e��D��V��r�/��[;y.w�*�
��Q����ӂ!Q#����,0��ph"��$
E�����d:Y8Ƥ�LCL�i�aet��F�6�nˢYtW��Ь�M�ެ`,���}�>��W����MѾΛO�},L��%���44ʀ��(
+N&S�ab)��]n�b}�"�b���u�"�����2��.~�u��;���u���bl��6��M^fվ��� e��L&οE��k]�Y�wXx0�U��FZ16��O�ڵa4Ŷ �O����C�n�7�����L�o�B�^��Xy���n��T3XT32�j�OP
�
��Q���*N�C%��=�j6��h
�$���J���X-ia~5�����
� ����2P�:F)CJ��A��z2eź~�/�wMu�p��T�������
Z��"�4 �k�]�H]���ؼ8d���@�K
%���彤�x�#nI�(K�(�`�D%��%���P�_���2�v5y/�J!�`��x�j��~�X����A���ի����2q�
*
�����Ǘ-i�
�)rQt2���0�;���Fʦ�(1��
C��'�v��cIX(��`�Ҳ��Hv0��n���F��9lw@�yL��f#��#a8}T���A�-�-��M����&���-V�f�֎�����4��Wy�1���KV���.߽*�mN�


��ACr1ލ�d��L�1w��:�T��NJ��Vm��H)S

2
+�
�m�t,J$�qȏ��n��5�|:&9�0�id�,5�c�3!P�MoM��H`x1uk�ٚ8���7�5Q��NP7�`kҠR�a
c�
瑝	
��S)h����(q
+Vj��
*��ۖ�=�m	CF��s��L�vG�%�h�T;T�����ٖpa˔ԏ�1��HEt���mI�ՂA]|��s[˕y��	gI.E����t!�
�*�ߡR��}�Zz��0���4��ް��Yb�@
+f��:+�s���%�l�_�
�پ]A����n�<+/כC��^|v8l������w
�N`��Ӣ�P�'M7
[y�� 
S*!�� �{���>_�f/����o�5�

�+�q

*��W��FkAJ�6�I
+3o���*/�.��7���2T?(L#����Mm/��h\
�����L����9���������ky���O7-*t�e(��I�uTQ���^)�H��'�펪P(p�ǙnA	�[�T��-��i�??mU���	n�)��G��-֛���0�pP�DN�j�J�g
�
+!���ޔ1u�
E��Gu |u�`�,����V��K'��˗mŪ?�5c߼�kV��*�bǓ���6U��Wy�!ϋ9g�0nv<�(��ӭ�R�i(N��'�zLj�5I���`I���H�!�R���餞����A�wo
H8pu<*5!��a/�I5Y�Dt��=TvՁ�p��Ձ	9��D��{��('
D1�;Q|�:�����@5A�Dt���t`7�Q
�
ց
�#c�OwՍ�-����Y9�@����\C��J��'���@� Z&�T;T����'�zD
+�$1J��
��ǁݤ	�u�l�J�g�!Mp�l�������������jw��1�oH���=�
�L[��+EO���h��Q�I�6b����_rZ����=��p�*u%%�o0"9��HΎ�/��h�F5EK3AU
�K��aUٵk#�oW��:ϊ���H��V�)T"
+:�`��̰�ĈR������S5%�!,�8F�׵6ZT)�\�@S*u_M�.�|�tuҔ�*�)�NQ�5�@DS:XJSvՔ��aM�q��z��>��T�v��(Ӯ�':���z�S	v�����ɽ�(է�bܿ�-v�'z�T�.��QW�}��`��j��4
����p��J�)�SH`
v/)
W�&<b�	
��b���Ŷ
��9��;�&
<�kax���^4����
�itx/
A`��/ƃ'��Q�<?��V�A�:}�I�y�^
K
+�N ���vD��n�Y�p"է�a���n�i���4�S
Z{NMé
��a�����a��S�0��5
;���iH�5
my�QR�3Q�-�K�Dpf�
+I"$�J���l`��wȸ��a!���97cZ�>�K`۠�ڤVl�K��!�طk#�^n�_0�Ŧ�K�E��yՍ,��
*��ªΠZ��=��Oз;U-�p�x�ip�0��Z�[��E*�+�����xA�~��KE�(.	�HI�&KE���Tt��T�0*��R�����'R}�Ʃ�&z�Q�]/0Nt`�9���z�	���{�Q�O����
��O�	�Od<�v7O�y6b
+��
K�z�1�A
�
�5���5%�
+O�e#c�+ɀ�y�타
l�:�̿�-A�i�KT�\A��}J
�������TT�k0)b:��N1�>�j��u�h���㳹�.k޶?�U�m~��~�C^~�b~p��f��-������7{ߔ9Uv- ��@��)��Ԡ�t&.�#K�����W�sCs��;�~�Wy�
ص'���n^�������ܔhS���l��qq
3�*֍+���ҡ�c
+��N,W�M�}�~�>�e���`>
+2� $��endstream
+endobj
+3583 0 obj <<
+/Type /Page
+/Contents 3584 0 R
+/Resources 3582 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3624 0 R
+/Annots [ 3587 0 R 3589 0 R 3590 0 R 3591 0 R 3592 0 R 3593 0 R 3595 0 R 3596 0 R 3597 0 R 3598 0 R 3599 0 R 3600 0 R 3601 0 R 3602 0 R 3603 0 R 3604 0 R 3605 0 R 3606 0 R 3607 0 R 3608 0 R 3609 0 R 3610 0 R 3611 0 R 3612 0 R 3613 0 R 3614 0 R 3615 0 R 3616 0 R 3617 0 R 3618 0 R 3619 0 R 3620 0 R 3621 0 R 3622 0 R 3623 0 R ]
+>> endobj
+3587 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 706.9608 294.4813 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1d20ad17015746b2d9e0290631fc175b) >>
+>> endobj
+3589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 626.1983 180.5399 637.1022]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5b6323dfa423ea57b8d845237d9b576d) >>
+>> endobj
+3590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 626.1983 226.4772 637.1022]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.2868 626.1983 323.887 637.1022]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 587.344 226.0342 598.2479]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1915597423b1aa0dbed55312b2308efd) >>
+>> endobj
+3593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 587.344 339.7761 598.2479]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 467.3477 178.2386 478.2516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_025c54a0d06e882346b74c0624ee6e71) >>
+>> endobj
+3596 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 467.3477 224.1759 478.2516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [302.9855 467.3477 321.5857 478.2516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 416.5382 245.5216 427.4422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8653fd3779f7a28930872b1f885f25ee) >>
+>> endobj
+3599 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 416.5382 325.2287 427.4422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 404.5831 132.5105 415.487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [211.3201 404.5831 229.9203 415.487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.5609 404.5831 344.1172 415.487]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+3603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 353.7736 245.5216 364.6775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6592baa6045a08fe1eb0ba33e8ed2942) >>
+>> endobj
+3604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 353.7736 325.2287 364.6775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 341.8184 132.5105 352.7224]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.4196 341.8184 234.0197 352.7224]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [291.9788 341.8184 351.5351 352.7224]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+3608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 279.0538 243.6051 289.9577]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2d20e2dc8d4d0fbbdf87bd01a51dc01e) >>
+>> endobj
+3609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 279.0538 323.607 289.9577]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 267.0986 132.5105 278.0026]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [211.3201 267.0986 229.9203 278.0026]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.5609 267.0986 344.1172 278.0026]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+3613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 216.2892 243.6051 227.1931]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_438eaa92ba7d9f7d8ec085fe9b00ec0b) >>
+>> endobj
+3614 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 216.2892 323.607 227.1931]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3615 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 204.334 132.5105 215.2379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3616 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.4196 204.334 234.0197 215.2379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3617 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [291.9788 204.334 351.5351 215.2379]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+3618 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 141.5694 242.189 152.4733]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_852ebcee0de832c12a87ad15d37570a2) >>
+>> endobj
+3619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 141.5694 322.4088 152.4733]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 129.6142 132.5105 140.5181]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3621 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [211.3201 129.6142 229.9203 140.5181]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3622 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.5609 129.6142 344.1172 140.5181]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+3623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3585 0 obj <<
+/D [3583 0 R /XYZ 90 757.9346 null]
+>> endobj
+3586 0 obj <<
+/D [3583 0 R /XYZ 90 726.0541 null]
+>> endobj
+3588 0 obj <<
+/D [3583 0 R /XYZ 90 645.1721 null]
+>> endobj
+3594 0 obj <<
+/D [3583 0 R /XYZ 90 525.5553 null]
+>> endobj
+3582 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F37 1999 0 R /F100 2198 0 R /F40 354 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3635 0 obj <<
+/Length 2808      
+/Filter /FlateDecode
+>>
+stream
+xڽZms���_�OWi�����f&��Υ��z�d�I2Y���I�JQ��� � !JN�?X$���b�yv�	�?21x��B�q9Ym/��n�ゴ���|�xyy��k)&I���S�A$(�����S�gs�1���<]V������i������r�.������/˻ٯ��<����F"%�s��*�‰D��(3^���	5d���W��~?�S���3C��v�Y֙��!��U3��Y��[�=%�X�o.��Zo
+&�u�/~�O���o.0bF��-\`D������_l.>^�+�q�R�b�GZ›GW�2���a���.g�O����/�������`�����A*9.ď¤�pd���wv�HLu^�
+q�e

�J
����]V,��_H��B��]�j���P�)���81qHEn��W
+~d�p)qU���[�B�qp+H�ۅ����V�C��^~�}!���ւ�"/~��y}�X��z	q���ϯ��e�Ë���e�R'�\ �Ul�/X��a�>�!A��}�M��d��������
+��g�qBŸ��Њ����p�, ET�6�B�
+̧o��X���M��1�O�($�#�ڌC}0?�f
OہVe���3W����Ջ�;�p�k�ƴ��
�
+���F������R�
<�2� 
�;:����̸N;�� �3�
�ǝ<�z�ɔ&S&F�
�Ɲ<���:�~&Ds~��
r�w��	���Z
>��b�׋��Y�A�Q7����`H
�y��l���I���>��;�xb�'��L�K�!I��Y��S at r2���$�HE�)I�"Ұ����L9¶��wu4�W|�H�
��+��j����u�s�M[V at I�yU���6`�9�'�RIWWP�a��m�XlF�
(P
�<�:���6ˊ� U�W%CJ 8������^�"�4�+�O(�Y9tt���W��?�Z

�N��) ��
+��z�o�����l���]����`
�{ĸ!�z1&Z��H��D���b}줰>��X=4���h�����U�5R��Ȼ_9㋲nd�l�_V����Xm�}�n+�|_��*ϊ�/��
J�]VU�
+��z�!����3��(��� 
+!;���S����]�!@�
+0 �
�� 
��^�Ĩ�h��f����%�$B�U���=xm�-L�:}5#2 _��pwvU�>���OɀH�׺H�5أ����҂�xi�[Z���3��F�ʋ
�+Kn^*���~�Q1]n�-_`�	m��
Va�>N��prniS��Ƙ�"wݲ�#J��G~�~�a�
�ۛ�J"q
:�;� )y�W����C�:�f�ނV4� zUޡD2C�H���
�(�:�H[||e��
+ ���g)�ۯ�����ǰ�i
�;��@�H�㡔	s
J����R�e��Z��
�
�!���F�
P�B��Sp�4��
n��ܥ�i
+��Q�mN�Q1x+��+�EP�O�A���D�h��]%Nhh랐1�����*��śMf�*a���С����"E�f#�������|��&��CWK����>�M����b��Iœ��
t�y�k���`��1S�<�u��K��P��~��wV����9)U߇�?��]��힌���
�5-&q
R�k�ތ�B�԰
�P<c�8�V⼓q�� ���j2�Q�4 �+�J-�b�֠�@���QY���(4H��RC
b��ЮLb
.�bn�(ZɎi�v�� ͝�
+K��	�o�]���:�7`��;bc��bݴ�ƥ�	���z�ḽ}Il��1$�>�48��e<݂X*�n���Kߎ��-�@f�IF歵s`A��R'}J�4�u2���N)����
%NI��M�0wK�ng��L��a����A�N�q�9'z��@�Pڈ��y
q�xL�v�b���-�W�n�XK����Ux!5����R�W���x����߽���˟� ����M3+T��`3���:/ ے��٠���:���d���9�"C����Y�uS�.��]�U�N�<��w7���:��
Kv@
�G�
x�S��O�!Ҙ��E�E�Hh�
G��<I�<K%qu|�L
5�V@�Z�q�n�#�J`م+{y�b�ʳ�
� ��b��.=�V
���#Њ -�WF at +M�Ype#������
��8"���i`�7�
�c
��
+�/Rw��v3ⰻu����ݮ*��k�}=���0����E&F����9�\���F{
�	A�ȣ۶<�?4�S�
��S4�
R�J�Na��1����
�J�ay��q�G˼����~)��
I�}��R�
Q������̞+a��O����T��~sݙd�Q
>H�+J�Lo��C�����
+�2r$���y��׏�=L�)��*
	�kfj
��
�܌o!t��o!؃8��-��#}���t_�
���K����R�Q{Q�c���� E� ��MJ�
���0
�e#Z�,k'��2w��������

+�x
G�K���
�6�ޝM~gR/�"�
F�k6�� u� `<�d���5-�

���΍�My������3�l���n��~����0��r�u�1���hN[�D��T��%O���2���S��[@K�Đ��%T	L�Dzވ���y[>l/=!�˖��P��Ŷj-�}�,M�GO~�&`��wUF�s
D'�~̲�
�OF^rO?O��v>��/�;o8�R�)�ډ������緷�h�G�"�U(���v��}�8�����#�7B["�s 8iϗ��|�{[۲�<�MW�H��)��2qendstream
+endobj
+3634 0 obj <<
+/Type /Page
+/Contents 3635 0 R
+/Resources 3633 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3624 0 R
+/Annots [ 3637 0 R 3638 0 R 3639 0 R 3640 0 R 3641 0 R 3644 0 R 3650 0 R 3651 0 R ]
+>> endobj
+3637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 707.9571 242.189 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4b5e1306956d46f1ee477428b451b44b) >>
+>> endobj
+3638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 707.9571 322.4088 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 696.0019 132.5105 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.4196 696.0019 234.0197 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [291.9788 696.0019 351.5351 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+3644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.3004 560.4744 116.9005 571.3784]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3650 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [313.8701 108.1318 391.8446 137.1976]
+/Subtype /Link
+/A << /S /GoTo /D (main_bounding_boxes) >>
+>> endobj
+3651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3636 0 obj <<
+/D [3634 0 R /XYZ 90 757.9346 null]
+>> endobj
+3642 0 obj <<
+/D [3634 0 R /XYZ 90 647.5745 null]
+>> endobj
+3643 0 obj <<
+/D [3634 0 R /XYZ 90 596.8539 null]
+>> endobj
+3645 0 obj <<
+/D [3634 0 R /XYZ 90 535.3468 null]
+>> endobj
+3276 0 obj <<
+/D [3634 0 R /XYZ 90 513.0351 null]
+>> endobj
+3646 0 obj <<
+/D [3634 0 R /XYZ 90 513.0351 null]
+>> endobj
+3277 0 obj <<
+/D [3634 0 R /XYZ 90 399.5444 null]
+>> endobj
+3647 0 obj <<
+/D [3634 0 R /XYZ 90 385.3757 null]
+>> endobj
+3278 0 obj <<
+/D [3634 0 R /XYZ 240.2453 322.7042 null]
+>> endobj
+3648 0 obj <<
+/D [3634 0 R /XYZ 90 306.3787 null]
+>> endobj
+3279 0 obj <<
+/D [3634 0 R /XYZ 240.2453 231.7521 null]
+>> endobj
+3649 0 obj <<
+/D [3634 0 R /XYZ 90 215.4266 null]
+>> endobj
+3280 0 obj <<
+/D [3634 0 R /XYZ 90 89.4414 null]
+>> endobj
+3633 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F100 2198 0 R /F40 354 0 R /F67 370 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3655 0 obj <<
+/Length 1963      
+/Filter /FlateDecode
+>>
+stream
+x��Z[��6~������
�/�E�f��i��K
�c
kK�$w��CQ�EI�=	���<X��x>��Gq���<UB!ø���<���R=^��E[��rr��S���r�|,g�	J�t�~=#p=_�����Y���s�g��,z�1~�E����E�~�v���7��f$R"!9n�y�@)��2SK|����4dp-���I����|��ϖsCgv�E��#��G�͉��dC�=#��I'_/sU�Lg��&�������#f��>�
F�:�O8e��n�j�s3�P�0�A�-^�
a)X�D����fSqB��R\�J�8
l�Q$��	��R��W(İ1�ć�
3�HE��&�s!n�R�N` ��\�,�*M�½3]0�A�N`|#�a�gQ��N9���?���>�H2x��Y�H4��A���B`���jg�K�b`ZE ���^Z�����
#�E�3X���S��4%���8�ʼn}�m	.(����c($)$�{��1ޭ�����;gLw��՜�,%N6�H޲[��W�Y�!�Z �	�2��T[y�����[�'[��E���~��Uu���6��4ip��:��τٮ@�PL "$��
�
֏Zhі��m�
�P(	e�܄�/l��w�L�b�
�i��H��%�@�8�z�O�
�
JǗ�H�����bLW�W�@��A�eJ�����1
�e)Zl��
G��CIZt��GZJ�Y�{�m*�_Z+j䯬�?�[����s*f��C�dS �`��f�&n��2
q%;&nLo�4�k㪫u(wu�&ތ�6=n��qmY2|��S� �����>:�
�F�����Rd�;7|,J�.��rڕGt90����p0�S [...]
=f�c���v�?��4��@�Z�
+�CP	0 ���e
�g�6�YλN�(\⚩l�	�R} K�$!
���.^�� i!���v�2�CleS�`��(�m�?��Ɋ��*#k�,��Y
+.�=���]+⼂��V@����-�"��/p��o0�IY$���uP��P�u,��-
��:��M)v�Z�
+n��^#.5	�q�4��M��j�f��.�,�@�B�q�~����3B�����
���҈9y�����9�N���C�m�`�
c!F#����i��`�S��0�m���Tq���y��_�~
�*/�U��Z�I�{H
l8�P��P�Q�;�߶�|�-7���ɛ�����x����6f�f����ۘK~͠ ~ncVcP��"r����.�1�x��g}-0��zH�[Y#v�O�k�P��/���k�|-�r/HGk�ɕ~:�m��}g?�pm��Uϣ�!K��{h*���Oj � ԕ�g[lĦ������z��S;��
���m?�2�
+�0UW����.g �)��)�|���bF
G-r&�=0��0 ��C
y�����?��dGw�w���`=�&^�Anަ�S}��3�#�蜮�ݴi
W�N���-���j"���
D���F�J#�&�L8D�F��Z-,�� ��{b�n�
|��x�ޱL�C�
z�ɋ�3~L}�K��ؕOm�˕�@Ր��s������C2\������a��������@^�j]ߧ�
��
+Ck��=��00K������
�Z#I�,2
E¤<�1��:[�h�$�=I}H����"
EW��S��+���ݟw
a�T��l�
+���k!?���q
6m�B�*�#xl���K�n�e�ۺ��۪���_s�}1bV�២�X�L���M��3
��Cf��f
�g���ڇjHp�'����i}��y��
��>�Ukɽy�·Eq���{zzB�

������;
vw]\
:����yo������Ra
`y�7%�4��y6
��t�ő�iP� ���endstream
+endobj
+3654 0 obj <<
+/Type /Page
+/Contents 3655 0 R
+/Resources 3653 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3624 0 R
+/Annots [ 3658 0 R 3662 0 R ]
+>> endobj
+3658 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [313.8701 629.007 391.8446 658.0728]
+/Subtype /Link
+/A << /S /GoTo /D (main_bounding_boxes) >>
+>> endobj
+3662 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3656 0 obj <<
+/D [3654 0 R /XYZ 90 757.9346 null]
+>> endobj
+3657 0 obj <<
+/D [3654 0 R /XYZ 90 733.028 null]
+>> endobj
+3281 0 obj <<
+/D [3654 0 R /XYZ 90 592.1452 null]
+>> endobj
+3659 0 obj <<
+/D [3654 0 R /XYZ 90 577.5749 null]
+>> endobj
+3282 0 obj <<
+/D [3654 0 R /XYZ 90 445.8472 null]
+>> endobj
+3660 0 obj <<
+/D [3654 0 R /XYZ 90 431.2769 null]
+>> endobj
+3283 0 obj <<
+/D [3654 0 R /XYZ 90 239.9076 null]
+>> endobj
+3661 0 obj <<
+/D [3654 0 R /XYZ 90 225.3373 null]
+>> endobj
+3284 0 obj <<
+/D [3654 0 R /XYZ 90 100.559 null]
+>> endobj
+3653 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3665 0 obj <<
+/Length 2417      
+/Filter /FlateDecode
+>>
+stream
+x��Z]s۸}���S+�T0�?<mg����k;�d3E�%N%RKQu��{A!A��ĝ����\�{p��%I���SB!ø�MW�7���/H��~�;\�..���g��T�F��� A	�f���C�1���O��d|;���/ɬ��_��I�xuu�|�p�
!���HH��;�]�`R�e����=2
�>�w���A�YN6���
+�

�'��rR&��mr���I6�&C����ߎw��L�_/���x��
��Ѣ� 7chou�)�7ˋ����q�����Ή
+eK��� �L
�ү��m� N��p�B�kUw(�I6YY�H|$R#�`-
�P�ac�
��f��t�&��n�Ru'p���Z�/X�i�mJ�Lo�$���7�!��Y�͋�����qqp ���ƨ � �d=�t����!����P`
���t��o������@��ag���120Ès�K#u��D�4%���4[�Y��u��qH��S�
�$��m��ަ˙�u
+0���M��f5Y.�b���z�6�g�I���|���Hg�i���1͒����k���zCS~�
Z�cY
FD X����]
���"���C
���#s���O
�


-�.�!�@�
^�}�� Pi�H�����
+.6�ɴ����$ۤy�n�#��r����
;uc�
)j�0��"���4�i��uHk� ��%��k��P�����uH1J�
��>�dos
&v��
L2��1����ᴡ��@�'�����
��v �����Ř �U�r1)]�I���,�[�<	�
+��d�ڒ_��eZ>����1+��I�Y^�^�peH
+�d�UK��"��;��=��
���]ٍ_�m*���\�g ے:
ne��㱃A�[
|��S���FD��֝�
a ��p��i_��fw��Cm
�D�e:�}��P���de�H�r���gu�}���ܞ�Uф	����y�A��2��CNa�*&�V&�C�b��ʄc}L���	I�C�@����<n
�G���<�F�E�p�m_��h��CN F��l��#�"!�|ҡ|⚴��������b����`���K���bp���Q}��P����<Ӭ�π/h@@Q�	(t�N
�c�Z{:m
�L�!'�FJ�%��A�Iը�7������͋W�a-T�&)x3��7o^߾��7�w�9�E/�g�C�m�|Z/�iZF�"TI�KEJE���;�H�6=]����2\���u���S<��9�b�nj{�S���2��@��䖥8L:
��
[�.�M�h;���[����Uj�uռ�� +�B/ f�V�
\`������Iu.�o!��kM75���8�=�Z��X���
�M�����$5`[橩�
+�N
�������3�h7ұ�2�#C��<Q?ڍ?�[���j>-�i�(NZGx��B�ge�۸���2�F�L�GR-�wp
+-U 'u�S�`0�HWN��$��a���A�1a0n�%
��Q����\�����y�p1�Q�D.��oq1����T��X���2u_l��%
i�ޢ�"θ�b�;��J�*����J%��
~�?�w�fHjI����C
��o���"\���E
:7�)�؄�W�;�?`j�9�353�"!�j���n���>�T��vP�B�ѝ����5����&��ZP��S�ʨY��
�z�mr=��-1�
{�U�Ķl��4�ehׅ�*��J`w�R���>�Q�Su�
�E�&^�E�4���f˗
z�&
+xc}|0^x[
g�z)k���r^�,]�(\TE�]G�Ӣ��kp�(��ʐRp�Q{Dt.t�e���7��
��X��,O��
�E0��馚�;� ��O�8�	QL��
��
��%�	,�Q��N&-�ݙS�; A�ǾzR��
+��J�f.V�H�&�̋��	�H�W��t���V��V^M��jZ"��RZ�.���K.�ii���U���:����9^���\7��=-�B-
�<]K����3r�4G�������45G��(�X�^�1ʘ�f
+��ze׬M�m���tѴ���})�_A$V���<�#8���I��2�/��o��v��Ʒ�4 7el	�W곗P��S��)���k�eg�� ����t��:��J=~!�+��aWWo������n
�������r
+��h��y�R���c��?�
~C=�`�o߰��J!����F�Q1��~]"8/���9oDU
����~��\�zRv�53���7I�ǁ�ۯ'�֗-G����p�T�.��g
C�y�$���Z����/�_���W�-�y`�z�}Z�ZK>��۔�������M7h������z��ܷ�c�
��VG�M�[�sLa�a
�r����"�9A��8� G��DĔҟ�endstream
+endobj
+3664 0 obj <<
+/Type /Page
+/Contents 3665 0 R
+/Resources 3663 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3624 0 R
+/Annots [ 3673 0 R ]
+>> endobj
+3673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3666 0 obj <<
+/D [3664 0 R /XYZ 90 757.9346 null]
+>> endobj
+3667 0 obj <<
+/D [3664 0 R /XYZ 90 733.028 null]
+>> endobj
+3331 0 obj <<
+/D [3664 0 R /XYZ 90 597.8144 null]
+>> endobj
+3668 0 obj <<
+/D [3664 0 R /XYZ 90 583.2441 null]
+>> endobj
+3332 0 obj <<
+/D [3664 0 R /XYZ 126.0147 496.6623 null]
+>> endobj
+3669 0 obj <<
+/D [3664 0 R /XYZ 90 479.9352 null]
+>> endobj
+3333 0 obj <<
+/D [3664 0 R /XYZ 126.0147 393.3534 null]
+>> endobj
+3670 0 obj <<
+/D [3664 0 R /XYZ 90 376.6263 null]
+>> endobj
+3334 0 obj <<
+/D [3664 0 R /XYZ 107.5342 290.0445 null]
+>> endobj
+3671 0 obj <<
+/D [3664 0 R /XYZ 90 273.94 null]
+>> endobj
+3335 0 obj <<
+/D [3664 0 R /XYZ 126.0147 198.6907 null]
+>> endobj
+3672 0 obj <<
+/D [3664 0 R /XYZ 90 181.9636 null]
+>> endobj
+3663 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3676 0 obj <<
+/Length 1723      
+/Filter /FlateDecode
+>>
+stream
+x��Z[��F}�W��ƒg�~AU�&Q�DJ��4B^�V���d����=
c���XV�JU����z朱'd��<TB!ø
��<\��7R}
��A���tp�Z��AFR9�ޔ
$A�:�.>�|
c<z?&xf�p�~L�(]��F�,�����0��L^���_��]�&��H���
2(
�dMZA	F�g����
�L~~���U�ݎ*�h:6t�7�0���M���
E�
n"�0^8
����)�$E��|���
��o���bxc�p=�������ڏ����o(��S�B�R�z*�Usy������׻d��ib�~I�u��ay
����qC~�<�K��+�8!�g�
+)�Ue��o�$\Cs�0G&*9R뾑2�(�
��teݝ
D�`
6 �"CT3ٓv���<M�y�ɶ
A�E�1
��F����*�fqx��f`T�/sU��k��+��BpI,�*�G&��T���d'�ky�
a� ̓���[~��]f�:t��n-��.���
�^�76�0Y�i�����n �a�Kr؋v �`�,�m��8�*R����f%
�pSw3O
M�*o�/	�
��2B�
�`�"�N0ʽ
ጂ�U�%�A�'��E��(#��6�6���NcL�b w_�N�u7�J	��&�^�4��b2�Ns
�ZŋY�-Kn�$e4�%�v���&s k
>����f阊�]҃0N�؜��$�+0���p^)�"���5A�7
�P2��z�
@&`D P,h$�K�j�
�O�
�G D��@��A���i2���ؕ��
+
+�d��B���_F�� .����'�ݚ�Bfwq~k�R(�%�������b�N�C���fO��d0�界2H~[-�������q���Q~E>�.���
+{`�4����:����]���3�X�{��
+SJ>� K�<B��
+д:� 
+"\���G:Y��6;Oz;�W�N2~h%sLZ�j+���Ջ*QTW?��P����.�&��y�����ͤ��)���Q?����5�/aO��]���A�~N�/=�a�����~B�I�8��ߓ��c��������
��; <��Lk�&��ߴ:��
��^�����=��������y��ۑ=�w��+���{q7.�c�_�Ӌ&^��Ϛ��!���.�����O.��Pn��y���?|`GMK�ο��������/��?�?n翬;�!��F���?G����Flj����d�������
����c��f�I�0?�73y��&�������ij��������
$U�t�9�����
����3 m����V�#g 
)�Cg ����t�,���� (���ǃ�����,�N��E^x
�f�W�6V0��W�^1P
iM�d��g��5���j�0�

�N;z"T�T��

�d�
+\LLnb�S�9𹹄n��v�C�BD�T���4���K�"BO����Q�N~y���ӗކ����_aZɜq�p
+�
+P{�$�VR]Z�N���rK[0��6�0@��Q����Y��oZ�x�����p�%a�P��X��DT�N#
��Ba/��Fُc!F�2&�p��^���=�B�x�ET4����E���Z��t��d��{�>��/��A���]��Qr�oQ�m�o&WWwwwh�E�$�d(ί6���a^
v���gzAm�ɥ�~+X*�[�ܸg�u�Մ7��f����mo7��bgendstream
+endobj
+3675 0 obj <<
+/Type /Page
+/Contents 3676 0 R
+/Resources 3674 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3624 0 R
+/Annots [ 3684 0 R ]
+>> endobj
+3684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3677 0 obj <<
+/D [3675 0 R /XYZ 90 757.9346 null]
+>> endobj
+3678 0 obj <<
+/D [3675 0 R /XYZ 90 733.028 null]
+>> endobj
+3384 0 obj <<
+/D [3675 0 R /XYZ 90 716.2211 null]
+>> endobj
+3679 0 obj <<
+/D [3675 0 R /XYZ 90 716.2211 null]
+>> endobj
+3385 0 obj <<
+/D [3675 0 R /XYZ 90 611.4129 null]
+>> endobj
+3680 0 obj <<
+/D [3675 0 R /XYZ 90 596.8426 null]
+>> endobj
+3386 0 obj <<
+/D [3675 0 R /XYZ 90 494.0718 null]
+>> endobj
+3681 0 obj <<
+/D [3675 0 R /XYZ 90 479.5015 null]
+>> endobj
+3387 0 obj <<
+/D [3675 0 R /XYZ 90 376.7307 null]
+>> endobj
+3682 0 obj <<
+/D [3675 0 R /XYZ 90 362.1604 null]
+>> endobj
+3388 0 obj <<
+/D [3675 0 R /XYZ 90 259.3895 null]
+>> endobj
+3683 0 obj <<
+/D [3675 0 R /XYZ 90 244.8192 null]
+>> endobj
+3389 0 obj <<
+/D [3675 0 R /XYZ 90 142.0484 null]
+>> endobj
+3674 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3687 0 obj <<
+/Length 2385      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo����_�O�
D�}q�~�C�л+�޹�40h���J�JQq�_�Y.��KRN4hb�
����33"�a�GfϔP�0.g�������_����/���]�|'�� #��ݭk
� A	�ݭ��	
_/�x���yRn��7�ϋ��c�*�����2)�oo�)>^�����;B:��HH�����N$ %Qf����QCA{�?L*�v����
*�����y��m�*uW~N�iyM�<͗p���	����]�ƛ�Ib�������l^��
+#f��=�	F�:�^q����ꗫ?�z܍��آ��Y���������T���nSqB��R\�F�zޥy��H�VB
+$�cK��Z�F�(6N�'GC�p9A�@qD�#v׮𾺽}(�j����S
+aA�l�7B�Zj]�Q��H7�}�'b�/�|_�ӟ�<M���w.�����ݭ�8C�꾎��hJSR�X�5���	"q
���jeq����f��z��.(5H��]�6�}��:��>��!��֫�CQJ
�F&[;S�|��|���V@��2���B���EL�uYl��v���˕�N
3
+����u0f��J����}�2�
�~��i��a{����h��B��T?Uh��N�%A
+K��_\��
+Bn{�M0E�Q��J���^��z�j��W��[p5���&[�'���6ͫ�QF#i��GZ��1��1�Jǁ1w����|$�8ELb󂸳
	%����Hb�`�
��2�M)�,_�]Re�ErƂ2
N��Yp�%��/I(D

+0�#  �IH(��3EH5�!� ��
3S|�Z>�&�m���� OB:n���,�y�
��&��q`�z	o��^(P�m��!.�2����!(�����aw�G�
C�Vq&�\`
)�@R�M��b
��ܖ�Lwi�^0N�5l� $[�f
�3��K�˵
<�dk�
�e�:���m��zA�1���V]3�3/*w Y�z>���P),'�o��}{�h��y�"M�?����q�Hb.����1P@g��~z̖�M:�v�e�n:X&�&�W���2��[�}��l�M_�X8T�j��؀k�D�ѕ.5�D'�c�&%Cʯ�r�܈0Rn�,���X7`|*���<�V��,.��k�$!�_�M���qjC
��U�Q���ʯ��?�e��F��@�x�i.��\6n��Pq����Y�V, � �QH�FO {�>��z)��IܮW�h�TE�d����7�-���My�#6�-/㩷���5���=oaw��[�4/�Y~QI�����ꈍ�ˋ��} �
t��M@{�>t�ӈ�S��!��7�cn�)?��A�Ρ�9�C������0'�:v����3>�V
�����s�#���gL��
��?i?�
'�	�(�:�u��E=������ݚP��Tl^��!�7l��Qծ��Ǻ�6u'
u�6!�ɉg�5��X�`���	xY�
+�
TҶ�6"ҷ�/g��ʴ�jD��i@���a+��,8��Cx�LMY��C�ǘ:��M�n�C^��cS�N=��
�>B5�=�C���Ѓ�
bp�!���Ø��<$�$��@�� ��y|�y#Iۑy("�
G
��y��v�ߧy�F�����x�W���9��?\ %��W7K!�
��a��aʋ~G9�B>i������+��a��ǴLc4�$ +����L������-�Mr(�C^��]��
,G�
̋91F
+��%�½�
�:�8����9��� �yD4��vWll���� g
�
��ボ ��
r�oALk=孎ؘ���� g
�
��ボ �Kr(���H>寎ؘ���9��q�v�Ӄ�r�l�3�~�_�)�w�F���Z.@$�_
��QD/�C
���lJ� �o��ͱ����T���}�e���u
@�O�f�n�i
I E�w�1�ބ˞���F�����C޷ׇx����V��<�
�=����7�
+��P���
�p�U ����u��� (�9�ˑ�X؝Z1w^��Fw�
9��z��Gw�1����f����M�� �W��->��)=�iЫͩ�{�z��^u
�=�
�a�4L˩�
AZ*q�~��Y�v��s�vzdjǑPTLL����Y
�_�� ��9-��a|���ӈKMϝ��|�+
6�#Y �V~ַ��'�RC�2A����ͷ�ވ��zc�ʎ�S?�����<w�}Z��Z�yS!�)���������؏���*;[A�
���4=���u���/�������/�>��<᫧�+�����������Z��!�v%ʪ��nssj�ЍQ��FVo�
+�l	�ρw��:�e�+�m��)��ⶮ.zqd�"b� a"M�endstream
+endobj
+3686 0 obj <<
+/Type /Page
+/Contents 3687 0 R
+/Resources 3685 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3624 0 R
+/Annots [ 3692 0 R ]
+>> endobj
+3692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3688 0 obj <<
+/D [3686 0 R /XYZ 90 757.9346 null]
+>> endobj
+3689 0 obj <<
+/D [3686 0 R /XYZ 90 733.028 null]
+>> endobj
+3390 0 obj <<
+/D [3686 0 R /XYZ 90 636.5011 null]
+>> endobj
+3690 0 obj <<
+/D [3686 0 R /XYZ 90 621.9973 null]
+>> endobj
+3391 0 obj <<
+/D [3686 0 R /XYZ 211.8424 377.9235 null]
+>> endobj
+3691 0 obj <<
+/D [3686 0 R /XYZ 90 363.2653 null]
+>> endobj
+3392 0 obj <<
+/D [3686 0 R /XYZ 192.8535 89.4414 null]
+>> endobj
+3685 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3695 0 obj <<
+/Length 2446      
+/Filter /FlateDecode
+>>
+stream
+x��ZKo�F��W�+Q��'�C�I�y �Ļ{�

Z�,�J����q~}�I6�&���� �|0)�������@2��GfϔP�0.g���=���\����/�_�^]-�� #���n�$A�:�]���^,	�x�vA�<�������l����yt�}r�G���͗ه���o��&��"�	�9X`����(3N⯷,CA;��L.��.:
K*��va�<�vQW��o�|A�<NW�!B�	�vѫ7���jo
+&�uֿ�޽dz5x��+���b�7c�l�)s7����~l֩
�/��"�$*�!,k��2ud
+���۔A�=�|�ת(�q��)��HH��Rr,
b�M-q�e�j�ggC�46~1�q �8"Ҍ����f���>��t�lɔBXQ3[������
���c�X2���'i
�wo>
��:
�,����O�B��fS�W�V���ӈJ�2���RC�~�ś_0��$N�a
�!�]��ts�P
+VH���a
� 	���5T�1�0�C�_)cq��fii\�!
��'IM��WUϪXU���1�$���t�|_	«g���\�$��f_�).Nyz
-
�T�]�)�	Y��r[H6P���G麺���Su�ʷi�rH��0
����M
+��8mƱҙfEuE�x:��ס0ʨ^2��莎�씮�z��<��?ǻlA����jH���	�c)��`�lb�)�[njbu��<n�ն.�"��
�*:�ݥ��IjϏ����W��hwrO������S�Q��h�0�r�!*h��;�e[��@�A�X�s�0ץ�u9�r_��񦫟`��2�gH#ݷ�/y/E�8��NO?pt��Q4R}�^t	�[#$��޺X���]]�
"�`���eP���}-�zú�=�����F6��F"H(�Zy�> ".!�A����
���/[��b'�W܉G����&^�i�Q��!�6��aw	��p3᮶؈�1�+v��0@�q�N����.���7�Z�i)��SJ����Yj�]�T��{z9 at q�ظ^'���
3"��I��w�9sLڽ�S�f�Ǫ7[Nx���hw�:�nǾ�� L!%��
�-5�� )R�o>��C5o������k�@���5�X�on��rpF�K�wQ� �=-zF��
�F=�H�����)�kϘ�m^a��	s�l"��L"�s"5�o ��|�
���]H����-��Ž�H�wU�͖�[�XRe�)Q�R� ���`&@h&T

2�
д�Y
XY�a ��vp��ڋqڛ
+q�?7�S
+��}���aNgnb��i
�A��������0���cJ���;ӆ�!C%���X6bfؠ%�p~`v��(o
�ִ�1�ͽ]����)-��j[#�N]Z�ח
�R*E�� x����a��	1Lx at GՄ�

Q �
�!^BxPd0�c���q�� �)N^��}�C
f��F�K�b
��z������x�D�e�hp��
b<Z�ڥ��g5�Aa�ƦsL���6Li�
'o��C@��
�K=�P)�{x�ōQ)ИatsL
+�?��3)�&���?�J�ϣR4
U�Y����q�q��K��J���ly
AתQ|R���I�AgB�q�ޖF�LC㶇�ch��#ȽgI�7b�4Ψ�4NOo�����7�8���fsv[l,\Nl��W��8=�a�S�	i
V�	8�j���ˉM�8���8L�x�?)�� m��x��ؘÜ�%Lθ���s9��?�3�� ���[bc�wb
������xT���+����6%����� R���H ��Z���h�0��v�[��+��jB�w�ú��_l����]v<�q��P�gԖ!�'9!��{�pR
k��1�[�}�2t�� ��*=��R�h����ы9�����YN�F�y
ިG�
^Ϙ0���?���a�r:�4��QG m(oM!�<��� ���2�M8;�t9E���C�I�x������@vOQxi��}&����&1"��K<=��q� ������i�\F�(��W
� "d��	�����rq��s)@�;�܄)@�	)@x:����S�F7|s�����o��|�li
� 
�b��
���"JR��4L[0lR�6��
p�<��/��\��_�s�Hi�,y
+\�6,�k\D�%�.�����
ץ6 at q�|�$y���Κ�`�&K�+���a=�P�4�〩-5
�)��ŀ)�|0���F�y�i�#g��3&
�<c��>L��
z��Ždu>�Ƃ�৷�)䋾�-?��Bj<P*!�aL���uFx��[KP��Pߺ�P��
����1���0AU�?D�)�U׶
�j���3���C
Se��,��
�]�P����{�z��������e�
7����[�n|[������G�:�S�
r�ׇ��k��x�bc�[6B=[<�s8�Ra�ٲq
�>˛~ܗ�j/�ʏ
���/Cpendstream
+endobj
+3694 0 obj <<
+/Type /Page
+/Contents 3695 0 R
+/Resources 3693 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3701 0 R
+/Annots [ 3700 0 R ]
+>> endobj
+3700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3696 0 obj <<
+/D [3694 0 R /XYZ 90 757.9346 null]
+>> endobj
+3697 0 obj <<
+/D [3694 0 R /XYZ 90 733.028 null]
+>> endobj
+3393 0 obj <<
+/D [3694 0 R /XYZ 211.8424 494.4965 null]
+>> endobj
+3698 0 obj <<
+/D [3694 0 R /XYZ 90 479.8399 null]
+>> endobj
+3394 0 obj <<
+/D [3694 0 R /XYZ 192.8535 208.1143 null]
+>> endobj
+3699 0 obj <<
+/D [3694 0 R /XYZ 90 192.078 null]
+>> endobj
+3395 0 obj <<
+/D [3694 0 R /XYZ 90 89.4414 null]
+>> endobj
+3693 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3704 0 obj <<
+/Length 1919      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n�F}�W評�j���P�!AR�m�4Q�i`�
��(�����;�ri��\Ɏ�m����pfv��C�d��<TB!ø
�W<|������O�Of���R

2����r�A$(��������`�G����b���S<Z/wW�H��.���M�O���f?�='��H���
2�
~kM��#ʌ�x1�5��
v&�
u�t�l��	x4:JW�eR�����2-�D��|�
zD����͚r��L��X
޾��T��F�h1����1t�p���r�f�s��^��j� 씮P����
+b�к5�[^�n�CdF"�WHq�j�r�I�dU��Brd0g�^0ęp>/���woUkQy{ Ġ*����6�N�e�����|R�'LiD4�j�7B���|��I��`�


g��=
�GSĥ1�wG|e-� ���F���� ��,��u�%Z�C&�ڭ�m�/�<}g
mN��H.�_HR��
���Z<C��K�,�ӀS
+ѱ�zviSM���Η;�
.�o��
+Ւ�Y*f�, ��8�W��XCM�,V���@Z���+�QJ��pXi�0lJ��:8i�ͤe�
6� X<x�`D�E����tSf���ad�)R��P�N
+�q'�`�^$L4>m-�i��9
}H���<)�_�Ҽ�dd4��X��1�d�w3$�ng2�*�c*F7�(+1�]G?:�a
h��
+�]'D"�����wR��Ƞ0[��$����&)��e�;|B��K9�p�&>ŰG�jX�P�Li|�IɤG1��{S
0�`4>�[{g���
�m����u��
� �2��i�
+�˽`Y��@3R!����
�
<�
�g����/�g�	<���3��!�M֝
��,#�
+	J7J3m�~�!��k�)<
+
!�Na�i��G5ъ�rM'�0�x���؆?"�hH��m`2h
��Q�<;|�8f�-��{3(>ltl<{Q{ƳDDiv�qT�8�b�0���%��f?s
��e�k�
\�{F���
��I? G^�8e�sS=
s7�-�~���,��������y���~��
�F8����gq"�<Q0df��0@����|6u����O����SQX��� z����U��L�j��P�	�weZDFy(��(�d
�Y�I/8��%(����nP�7 G�&~�Y p�
5l.���E�����ʞ^&� r�ꇊ��a�o|7�r�G�f0Z�@y���*~>��#�-�~t��
3z2�BG�q�C��~
+�-�f��v&}��������)*`�*���R��
+���/Hl�Ȁ�7�-t*��RB@m�iDM�ާ�XR�.NV�=�@X�� �d� (.�?&
��K*	L
�⳿m�?��2v�w��"
��$L��m/}m ae�Ɨ�Xu����su�
��8x�1�J�,p��lL lBP� ��^3��"�``��9Y��ǐq�E2����A�"��LXx�|���D��D��ഠD��(��hp( �y�I�EG T
�-�<
W1������2��q�6y`�B>�͗�V���%O�
+w\!�{� Oz+
� 
��+�Gxy N���9�m������N
+!�@�:��y�1;��˿U��a��E�+�σ#f���Em�� �W�E��fEj��w�:�+�`,��ќB���lNɔ�����m��n
)#[��U���K���D���
+>��*p�

Q�AL~�W>�����n�DF1]���
+�ʻb���Q�=���
��*�

1�K�2ɯ�ī���l`X{Rś"����������ZA�3�*٫ݯo��0i�a��j-��Z�UYn�gg777h�E�y�)PV�m6˳ü8��A�uo�ur���aH����庰�Z��F�r8�J*����/=�T��mZendstream
+endobj
+3703 0 obj <<
+/Type /Page
+/Contents 3704 0 R
+/Resources 3702 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3701 0 R
+/Annots [ 3711 0 R ]
+>> endobj
+3711 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3705 0 obj <<
+/D [3703 0 R /XYZ 90 757.9346 null]
+>> endobj
+3706 0 obj <<
+/D [3703 0 R /XYZ 90 733.028 null]
+>> endobj
+3396 0 obj <<
+/D [3703 0 R /XYZ 90 636.5349 null]
+>> endobj
+3707 0 obj <<
+/D [3703 0 R /XYZ 90 622.0342 null]
+>> endobj
+3397 0 obj <<
+/D [3703 0 R /XYZ 90 520.0362 null]
+>> endobj
+3708 0 obj <<
+/D [3703 0 R /XYZ 90 505.5355 null]
+>> endobj
+3441 0 obj <<
+/D [3703 0 R /XYZ 90 362.225 null]
+>> endobj
+3709 0 obj <<
+/D [3703 0 R /XYZ 90 347.7242 null]
+>> endobj
+3442 0 obj <<
+/D [3703 0 R /XYZ 90 204.4138 null]
+>> endobj
+3710 0 obj <<
+/D [3703 0 R /XYZ 90 189.913 null]
+>> endobj
+3702 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3714 0 obj <<
+/Length 2022      
+/Filter /FlateDecode
+>>
+stream
+x��Z[��~���Sc5��ˠ�C��h� ۮ�>l�,�Blّ����P�d]hyf2M-�a$�<<��|$M�����
+��4�O�t��߽��E[�����)�I�t��F�	J�t��0#�<_���ݜ�Y�ws�g��y������1�������_����}CHkD"%�s���'ҙ�`D��%���w`
+2����A��EE1_P�g˹��d�Ee�Z����|N�,�bh2D�a�:�z٘�[S0I��~�|���+�����b�/c�t?��/����?�q\G�A�)��C4aӅ HQa�RZ L��a	������A35UT""�����/qr,�CV���H0E�Q:m[O>P��
jaT�
+)��eT�FQ����l���S�KWQ�9퓬
(e4�,R�L-5TF�N�0$<w�Yn�Ü��S�b"]���mkr�����ԏ`Yx��r�='Sn���tu��c�e�l�H��8�84
+�s��arΫ�X�{i�ǨLw	�[�� ))2��GYK�z�I
BؐJ��̥ ��D̲4�\����/�W�k�:�j)�Q�#tv�vg�p�W�o�	x'*]O
e�����V��!�(�$̨{�x���9
~���IQ�O;?A�I���Ԍ|g�����T����v�'V}P
�5�T�� ����h�X[TQ�%�<`�9Y� �.�7��4WM@�v�@Y#��5�cd�a�k��c�E{���¨/�Z�1؇�&�N�Ov}�t��|u�Hcc�*V5�
�X��J����
�����j��p�d�B��pǝ�!��'W��K�C[Q�ׯz�rSv��3�(Q>�7�
`�
�	��4%�Ї4ۥY�1�
kM�!Gm|I�]��Px%˭h-n8�&
�{Z��cyp��	�6͒ �3�8�o�
�k���+8�`�z
x�RבW
8)�	}�C&�I>R�C� �@�p�o�.���N'D���7R�Y�>����f]B�Ŗ�G�~*,�nܬ}����z��
|CT�g�<��mے�O at _ʳ-x�E�# Jx�xe�����F!N5���Hx�=�f��'�$�E86�ױ�Q�\��@�0��(󹳿͛��~��lf���
+�;^�Y�W/������f�WϨ��Tx^Wxҫ�ō���\��F*����	�xS�V��Mh��z�Z�+D5ϯ�~�i�s ���z�
I���[�������zK�:�s
��������#���#
�T�+���'ƴ��]

��|�
�PgN���FL������
��/�leN-�6U UA�}�j���W}��~꾇��d��W����)T
���Ѯ�
N�m�
i�
�c��K#�m�d}�W
�C^�����$�C��.�ފŖ��`d@A(�l��|,�Z\	�Z�u
c�"�1P&�0:�|�
�6���bP��&L1��b@�lP0�Xn�Es1 v�W

+��j�`T��;��`5n^z��ε�s�K.\�
,%��&���K�A��ś�$ ��\Ț]�߉]���
����o�.(����Ʀ�-u
�)d��]��EH�Xh��F��]��c
�
��δ�,�S�
��Y�}l�
���M�e؆��`
AT}�޷�
3�t�Q$.�W�� ��u��>�f��[,�;�<��qz�{WӅ�CSr#]�R�Ӆ(�TJ>��&I���Ti�^ǀF-ra@e�
����	
+�D&�R܈���H��$�@����k�
+��
+�k�F�rܪ��g��t��l�C=�S]T٦�
�=��<xφ���fYVX��E�
� �<Ŝ̚+7�Sm�`�����ܬ@��R�Y�v'Ľ��+7C�E��ʭ��a�,�$
���o��A����������m���D�(��5����&��ճ_�,�b.�̳���T�[J��$��ӂ���'TYF����'I�>��F �t��z��O��,��`���%�j-y0�]��,��wwOOO(.�)K�9J˻�qw�׋c��o�{�Fh�K��
2Q*�um]����P�O�A�b
+�8� 
P�W4f�endstream
+endobj
+3713 0 obj <<
+/Type /Page
+/Contents 3714 0 R
+/Resources 3712 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3701 0 R
+/Annots [ 3719 0 R ]
+>> endobj
+3719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3715 0 obj <<
+/D [3713 0 R /XYZ 90 757.9346 null]
+>> endobj
+3443 0 obj <<
+/D [3713 0 R /XYZ 90 641.229 null]
+>> endobj
+3716 0 obj <<
+/D [3713 0 R /XYZ 90 627.0816 null]
+>> endobj
+3444 0 obj <<
+/D [3713 0 R /XYZ 90 487.6582 null]
+>> endobj
+3717 0 obj <<
+/D [3713 0 R /XYZ 90 473.5108 null]
+>> endobj
+3445 0 obj <<
+/D [3713 0 R /XYZ 90 322.1323 null]
+>> endobj
+3718 0 obj <<
+/D [3713 0 R /XYZ 90 307.9849 null]
+>> endobj
+3446 0 obj <<
+/D [3713 0 R /XYZ 90 89.4414 null]
+>> endobj
+3712 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3722 0 obj <<
+/Length 1541      
+/Filter /FlateDecode
+>>
+stream
+x��ZKo�F��W��J�w��B�C��h� i���#�6Q�RI:��}��C|�V�k�*�>�3��73�2�A`i��&�
,7\��&P��~�5x��\�V2��*���ՃD2`�b�a
+x<
�R:}7:��Mt�n��t����WYt�k�9�������������k��GP�H%"(
�P��%�����ş7
mhc��Q'/�Q��B&�t1�lov먈�+��Wq63��%^� ��-�N^-�t�ٔ\A���'>�`�Y}3��[#�;<��e�f"oN֓���Z?Ս�\�Hৰ�8�J��1!55E��qތ��
<��D
�k��~�ѦL���SDr�
K
W�6�R��6YU.�ZE������ԍ
ІR�A�K�|^U�GJY_�%��eX>�\QB->"VJxx`�M�"����
+�#���Zu�rp��
+��]��è�!,
f�7��!������I�N��Se(Y�0a��x��bب��u�7�Agm�p��dmt/�!B��f�m�3�S[ٳ�"�$�iWI�#� �@���&�
��o,�&26���2�$m�u�hcv��mj0���/U֢�j�.x�"���0>PF4g�0�Z���b!�{�-/���p̲w���8h/Ӏ`�t�(����"�\߿��Uut��������0sԐ�a���<�1C@ъ�W_��H���qhe
��J
y��ϓt&��K�NV�Qv}[&c���J!�%�5!�7
�Dq<�"Y�d��ӻ�b&�r�`�=�g���UD�F��t�p�������'Y]e��#�a�.��]T$��1q�Y�+d�Q�
\H��^���g��l����|�#k

��7���rXl
ۂ���:E�-÷W~��k��0k
���Υ�� �ZH�X9~��>M��D+|��N����.�|��(9v����po�����X���/��G퓌{&k�Q��Y�����w
���	�V���%����������7#{Y
�q�r̹
����4iƜY���̾I�I�uv[}lq+s�S�Dz�����ڹRA�z6IV� =i_ܠwH1*���I1ǀZ
�w�s.�D
+�QB���C
�q�X�I�p�����5�
h0���
G�<�3KQ5��sֵ�eK[{���{�pS֚=M���+��[�{`�]������L8?"��7džа�4����s)1+�Ci~��6�U]3>D?����3�X
7tT
��ٵ:<��OZ�(Qv�����o�:���7Z��[�q؁4Kb���a�����Kv��F��C^��ԧo�]�}�
Q
 �1{�8{3���8����8�?����gk�$)��=(�����W�h?�!�2H��.
+����D��p����O��Nk��Np�g�Ϥ����6Jo��^����pJaB����Rq�,�7���8
��ˆ���Ru���9�e������DՓ����r�7E��_\��ݑeNn�d�������C\���*u��^�����/�����.�vLm�MI%)^�D���Q�s(� ���endstream
+endobj
+3721 0 obj <<
+/Type /Page
+/Contents 3722 0 R
+/Resources 3720 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3701 0 R
+/Annots [ 3728 0 R ]
+>> endobj
+3728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3723 0 obj <<
+/D [3721 0 R /XYZ 90 757.9346 null]
+>> endobj
+3724 0 obj <<
+/D [3721 0 R /XYZ 90 733.028 null]
+>> endobj
+3447 0 obj <<
+/D [3721 0 R /XYZ 90 596.0855 null]
+>> endobj
+3725 0 obj <<
+/D [3721 0 R /XYZ 90 581.5152 null]
+>> endobj
+3448 0 obj <<
+/D [3721 0 R /XYZ 90 439.0678 null]
+>> endobj
+3726 0 obj <<
+/D [3721 0 R /XYZ 90 424.4975 null]
+>> endobj
+3449 0 obj <<
+/D [3721 0 R /XYZ 90 278.0253 null]
+>> endobj
+3727 0 obj <<
+/D [3721 0 R /XYZ 90 263.455 null]
+>> endobj
+3450 0 obj <<
+/D [3721 0 R /XYZ 90 116.9828 null]
+>> endobj
+3720 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3731 0 obj <<
+/Length 2289      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��~ׯ�S+�x�c�)�"i
l��lm�[ITI:��}��&9$e[�}H��������9�7�$s
����
+���v?��{����np?h|��]� �� #����$A�:_m>-
/�1^�_��}�~��x�잷�&
���o�0}���.yZ~^�t�!���HH��
�]i�LJ0���?�>z��`�k�o'��.̲e@^���.��q�Qy���.J�D/��-\2D���:�~ո��`�Xg�o��3�o��?�0bF��#�`D�����SV��ff�j�)o?�EvNT(CX
+�D1Dy��~���4���B�kU������+���PH��bl<�z�_m�$�
��i�7͘�&g
L#-�
������p�
�<
�5�L
+���<�(!Ha�
��M�0�Û]	�Zs0W��N	S�#@PueC�ʤ=
̪)�ѧ������PЖa Š) ��������yk��|u�����ϥa�k�ˤ�������V�6�A�E;p��Z8�K"���4�cz�qr�b���
�Bꬣ�h�aasp$w��
+5G6�����&�Zȷq�UHU��1η���(;F�y���?;��(��]l�}t�*tӀI�'�tr}n�J�P�,N�
+c|�����<�N`���{RשO���
i�:�]C��E`�
T
_�k��m�/�� �	cA�"\�bƪA�ˣ4��-L�b�x�4�}$N
 J
a�4j+���P��i�����O��P�v�]m+N���
�Ү8ͷa^
=ƻ]ytS���c������r"~-���Q��ժ���6:ڂ1;��c���]mfad�����c�.ެ���|��@����Q�4V}0���
I���6M�T,
���w��	.�-
�W�\��Wj�T�N卿�IK��E��S;X�vtR����0e�A:�I�!���x��x*
��i�l�!�.�ɣ�����h���o��S�<�D��|�ʒg�,b�1��b
���/�8l�����aNŤ̪��|2�;�Kd,
L:�z2�4��A)AԦ���_8XRq�el;2�z��Y�Bf�!).dQ^^l��UE�����yQlKY��-�/��\��0�y��L���Ԭ�o�:{�k%Wն�k�E�\3
I���z�J��N��8˷��Y^ �Ic�T��������1�0.ǃ��S�h��0��
w [...]
2]c?�����%!�݅q�h���<���� �R)�\ ���l�����M�W�-/KG)�}�{A�R8ܒF���3�ë���Hcۦ�iay1-�{Zr\
Je@�b2"(��7ݮ�.}�wIB�԰;�|��@�H���S��u�d	,�u��e*t�� |���o�O��o�P��Nz����;�7�3)��3�Rx/�A
ԥn�xS�lr��a�X��{�u�1���Q���ϣi%�g�	RrJ�1~��	�o[
3>�v��Ϧ|��#������u�?�����)�3Ե�R~�ks�T
K"5�DJ���0��NG7x)�_A�>JR_�=c���bȌ�E
+����;��3I�H�w���t������̉�n����a�kv�
+���ڋ	Jo*��R�:Ee�p���A�˃J��;
p�(��g�?O�>q��k �
�׮O瑜mgѩ]m�h��(#���
�z���
W[���Ɯq�.?�����n]v�_�����qv��o&�I�]9�[�M7]�w�33�`/x�0�l��l��n
=���K�`0
�D]���oAr�b$�4xPw����HY�
@{��D���2
,!�_�
+a��芗
�v

��?HۍWd����~�BE+�>���a�C����s�3
�����8���Q��“T�@$��8�<�Xƃ_
p�2�,�D��v��~�\�7��F���L|��2ff^�����O��#����g���u�<�3w��������̝o:�AB0�k
�Ko�ܳ��Vj��!�HH�;���5�}�{[l,�V�5˖�Ֆ'�΢��K!�j�gxxw'+�{zzP�1������x�!�uȩV�T��
/�w�;����z
\� h��\���Ƚq�o��x}u����n3ۋc����x�]�:�PD
Ul,zAc��⸟ۗ���G�]����'i�ڃ���My/��r�@�?t%�(endstream
+endobj
+3730 0 obj <<
+/Type /Page
+/Contents 3731 0 R
+/Resources 3729 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3701 0 R
+/Annots [ 3734 0 R 3736 0 R 3737 0 R 3741 0 R ]
+>> endobj
+3734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 690.3327 212.1242 701.2366]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+3736 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 532.8894 216.2973 543.7933]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+3737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 440.1518 483.2121 471.1205]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3732 0 obj <<
+/D [3730 0 R /XYZ 90 757.9346 null]
+>> endobj
+3733 0 obj <<
+/D [3730 0 R /XYZ 90 733.028 null]
+>> endobj
+3451 0 obj <<
+/D [3730 0 R /XYZ 90 594.8928 null]
+>> endobj
+3735 0 obj <<
+/D [3730 0 R /XYZ 90 581.0895 null]
+>> endobj
+3452 0 obj <<
+/D [3730 0 R /XYZ 90 424.3386 null]
+>> endobj
+3738 0 obj <<
+/D [3730 0 R /XYZ 90 410.5354 null]
+>> endobj
+3453 0 obj <<
+/D [3730 0 R /XYZ 90 315.441 null]
+>> endobj
+3739 0 obj <<
+/D [3730 0 R /XYZ 90 301.6378 null]
+>> endobj
+3454 0 obj <<
+/D [3730 0 R /XYZ 90 207.3901 null]
+>> endobj
+3740 0 obj <<
+/D [3730 0 R /XYZ 90 193.5869 null]
+>> endobj
+3455 0 obj <<
+/D [3730 0 R /XYZ 90 89.4414 null]
+>> endobj
+3729 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3744 0 obj <<
+/Length 2646      
+/Filter /FlateDecode
+>>
+stream
+x��[�n��}�W�)������3	�]�{	0�u�e20h���H�BQ���SM�)6�$=�f� �y�(����O����df�L	�
�r��]��
|��
R���ߗm�o�/.��bf��Tή7�� A	�]�?�	|^,	�x�aA�<�w�͇��l�|�����6��竫o��ŧ�.�#�5"�	�9D`|W�xN	F�g�����a(�`g���A��F��bI�_/
�ǻ�6*�ꛟ�M�/����
+�2D�9��z���IW�M�$������Ox����p�3Z�
�#b
��.8e�b{���ߛq��B�"{ɪP���Y�5��nz��i�ɾB�kU��8�v�-��RH���BH�̩�x�U�%�j�Wא@����ԐDT��ؽ\\]�fO7Kk6[2Cm�RA��4Y'�V)�@�%wiUd�����PT����R���9~WY�[(mDm�
�#(d7̎�6�(iJ�(�t����PЖ�h���P�D!I�
)Xo�"�n�^
ְf�082����>9"�b�4654��.��âV�`��6�8�FX�$
�aD�:�T����_o�
J9��1-&P�RP(:�B�hٶ�#�6�
+c)��$����i�����`��$�Dcݏ�S��Q	�Qm�b}u��
���6Y�D��q�E/(����;��ƪ����!����}��Jz�� 	��Il�\�cU�F�Hi�ɛ
)<��.�t���Q��nc �%��(�"b
+a��f��lV\ӡfš���F v�xmq�e�j�W�*��l�w�
 
l�!S�J7��@Z��sӰ�]ê���w7З���xE�b6��?�W/��0\�b�~E�@�p����X17Pԃ4EUd& Džb5����w���ml�͗m�>��F��wq\,�y|��(�j�U����*����d�
;v �������~\�6M,�����L��j␇}�*�
+�F� 
+�f/oߐ3�~*W ?R�r�D�C
�Q ߆w$hq��x����2��
+a���@�0��"?��V���
p�x^H1�8�� ��G�j�q�]
��KG����Ef
����hFN��L�qx���f2�8�C�޾
�1m4}�p@SČ(gFO%㰁�>�fw�
�?�y�W&'RR�0�ed�WÓ��ȣ�w���/�W���+�F�Do�}ym�|-e�lt
�ӑ����K���"�o�]t�`�P0�d��&��c�(O"[
}> TZG^�<4ұaɀ���yMy��G����}�����
�j�(�%%���j���k��fq9�UXqS�QR
���Pn*����ka�¸n���l��Q��"u5���N]r�4̞�x��F�I��4��ТQ~u$�6g;
���
���1L��mp����\�N���%���3�a�����_�o0�޸%4���n���l�dY��S�c�F�P���G�^ a��@1v��5l�j���io�iMD��.��Kj/
l�<|�:��r��~ P�X9��{�P�,���‡�xA���R�CC�,K,�q\c��s J��uR�vd��o8)��P [...]
s9�5�u}RR7-苖h�P #|�I��5f����S�چA���n��M-ׇ��^;��հ;-�>�'���+g�B�����z������ {ধĶ����ڕ�g��bԯ����3�`�$��&�)��� �H��r9�5`,�s:����X֜Y`�z�AUg��U߽�<� ����7�k�����R�E�����Ԛ�*�JY�^7%2
�E{wl��bi�0\��T �&�e5
W
z���b�r>V�(jÙ�Nz�f�$={����L[zr|:�� �6ќzN�$R��N0����
|"�

��
�@M�P��!�M�
�����5-gV���"��bf��a[����ţp(:�rp�d���4��Y�K��>y
F@!J���Ő!���H�A��
	
w���4bH�K(�F��;0PuҨ�r�c��a�=l2�n��t��9��KwW����̓k
]i�%�%B�
+ ŧ��IQ+�>�d<���
"���D�3��e<�g�崎�lr{ڢ���`L��J�Ɉ�׈H�<}��?����е2Cž
	{����
��/��cž���b���')�~پ!$���=LSX�C
+��d'���wV�P���F��
 ;��(o낭�;uO��&��'muO^�����՞AuO�'���C�޾kbg���[Ž:��W��Di�(x�AM�j�-#����,q
+`�1�"	3��lJ܏��$�{n���s�U���x{(��X��{K�= W�m���:�I}?���=�a}���
+��B
WS9k��2V�Tُ9nt}�qXշ
�Okz�
"�	�jY��+._,�C��
+��@I8��I�ф�$}/������M��&鿤��h/
��1
D��|�;��}�ھ��5�*
+fX�c���=���K'ͫ�Z�W�8���B����-J�-N>ء�5i�P1�)U���_�>��
+�������ܧ[2�ݰl�Qa�jM�7���}Q�./�ꀎi��QR\����n\P� �[�ecԋ�K?�
+k/����,o^G�/w�;f�:*_���_<�)�endstream
+endobj
+3743 0 obj <<
+/Type /Page
+/Contents 3744 0 R
+/Resources 3742 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3701 0 R
+/Annots [ 3748 0 R 3750 0 R 3752 0 R 3753 0 R ]
+>> endobj
+3748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2748 582.4205 293.9708 593.3244]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+3750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.2694 438.6427 238.0203 449.5467]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+3752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.0888 227.0685 246.7668 237.9725]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+3753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3745 0 obj <<
+/D [3743 0 R /XYZ 90 757.9346 null]
+>> endobj
+3746 0 obj <<
+/D [3743 0 R /XYZ 90 733.028 null]
+>> endobj
+3516 0 obj <<
+/D [3743 0 R /XYZ 90 644.4124 null]
+>> endobj
+3747 0 obj <<
+/D [3743 0 R /XYZ 90 630.6207 null]
+>> endobj
+3517 0 obj <<
+/D [3743 0 R /XYZ 90 512.5899 null]
+>> endobj
+3749 0 obj <<
+/D [3743 0 R /XYZ 90 498.7981 null]
+>> endobj
+3518 0 obj <<
+/D [3743 0 R /XYZ 90 301.0157 null]
+>> endobj
+3751 0 obj <<
+/D [3743 0 R /XYZ 90 287.2239 null]
+>> endobj
+3519 0 obj <<
+/D [3743 0 R /XYZ 90 89.4414 null]
+>> endobj
+3742 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3756 0 obj <<
+/Length 2655      
+/Filter /FlateDecode
+>>
+stream
+x��[�n��}�W�S�
���e2O0�	��y���$"�(�e����f�Ev�V0b��\�=u��]�JlF��
�e�RϮ�gtv��;c���7�g��i5s�i�g�7����].���	���_/���:�z��t�]=�e�"��1_�����7ۏ�w�?��XgD�5QZJ ���	�2J�p����?G�ᐡ��_���*��	Wt~�p|���W�>�����dł�y���#ǔ�3���g�.[s��TB3o����}GgKX��3J��j��J�s|�>�\47��7g�lǩ^��E1qʪpA�V�]"�����
�f%4
6a}C����?�g�t
�0�F����sk�vp�J���m����T/R�p
K��#PG� ��@^����&+�U�k��J��,@"4
-�*8�X)���B)�dW�:��nF��������"O߯��q����T���"��3�%��H$�p`�v��\�yZ�߮"[F,�Ͳ�j�����
a��F��nv�j
+?�,-�^}����n����.���I��x��,2!K�n��V��6+Mx�g�}kk�	UF5��bҾH�����yU�n舙-���e�ٮ�M����)E�m
��Z"�-a�5�=B��d~��E#�5 :B��n�5�6߬��*AL� �pS��1DsX��_�B�����Շ�
CJ�ͫZTD`H��m��"8�r��*�����&�_qb�9E�<E-���*�E��Ϯ����wY?�
|o��3����3�U��2?u�t+�t?(cu k8���	$��f�ռ
+
�jS��JAa
��e�Vj�v
+�����P at T���&�`W�G!
�#�*�������0鈑�f~^	�Έ0�1�a���������"ZP��)�����
+
O�I;d�
�4Q�A����:�7AY��*6/">��e
�� R(UǷ2�I0���A({�ˊX��>�]��[�P�ǛM��O�qѺTy���Ey�@�]�����O�H$4�����߱�H�-��:ZD)��Bs�ɢ��%]�ad
A��XXg�uU
�j�}V�.��E�X���Vz�$Lt��	u����Xv纂���RC��r�3>�t�^6˽�n���]���v�/�|�iJ��	�s�/a�ƒ^����
MX����
�)7b��v�@�7���jm,
�0t��rjK��B9�V�EWl���X�l�cZo#5�۳�Ri�m-�yX�Y|w�"���pǡke
��UUeN��e%�1�vĦ�ڈEJ�@�FơJQ�H
Շ�E��V�P}i[�L��|����ں��������B��'�u�g�Z��{wNW�we}���ԣW�Uꦌ��}�
+�vJ�)�
+3��zQ�/tG��B�����
+JR��M����묜�DF�)��>�j�<��~yq�o�quy��m��Тh�LZ���	Kc�B�h�����y��KJ��M��VD(m�Z�@�v�y�����A
�����
%	�t��<
Ji۔7�͇��Ia�~�~&T���D�̱^~�4=)�h&e�'�QO��ɵ����ԟ�����Ʌ�v�m
R�:�ާ׵�h�#�B���׾���ݲ��/ѡ�y`~�HN�2!w%�rW�9w�C�&y�^3y
+��kWd=�
�IFO ��"�
�l�
�f��,FX,�*�b!:���X�h��Z���m=��b��/���'X�K�2�16B`!r�X&6�$L�.�啢D�w����QÉU\�@
 T���ڒX��/	�$�F�θ�I��_�
!����A���; �<��ʬ���X�"�}���a�BCp�e)1����Fa�Q
+�y>�ٚ��
VQ��L�8jG;2�|�80�L����Y�fĤ;��j����ܙ��ʒb������*�?$�^���ݪ#\UWj�+V��Y\U
�Dg2@�LZ�c\���\�@m��
+�~a\�P(�<�UuŦ
܈��UMkn����8Wh�D�J`I*�1[tĦlш
媦��\�@o��
+���\��m���Q;bSFm�N媦շ\�@}��
+���qU\��1�WՕ�
+�B
+i�d�*�|Ÿ(��Ԋ}W5i�W5 �0_���\՗�U��\՗�U5�L�.3Csf	�C�g�敫�m����m?���������sjɘSbq��]�g
��蓓��Q�Ѡ:7 ����<9�^�`��T�
;�$��$$P�"�P��\�6�˱sIL��_L����������$	��h���QN��O��&��

L�^�[�t8�E^
��I�Fj/<�DD��{w#u8�'���n�\���A,`'l��C!t�
D%��K=E�.�Qb$�
k��%�/�"a
�i_�b�+5^
�ލrÞE�� L�$���@=2�uFMϿ���Q$�jC
ԞH�|zO�4�c!p�XGj�`��	�Ǥږ�諍�
]�ϣ;
���PJD{b
+ehw�g��/��B[��X��=�f�گ�/��ۦj�n�ҭ���.+~�Pj^Lj����� ���j����M��&��M6�>� �B+Uo�=k��~�l�A����������~�w��������#�ޑ�M~_�|~�:$J�C�>�zI+4��_�ɵ�6�r�4A�mQ/G���u�S�@X��B�/<�1�endstream
+endobj
+3755 0 obj <<
+/Type /Page
+/Contents 3756 0 R
+/Resources 3754 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3765 0 R
+/Annots [ 3759 0 R 3761 0 R 3763 0 R 3764 0 R ]
+>> endobj
+3759 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.8986 677.0988 431.9768 690.0166]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3761 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.6167 422.0673 476.6033 433.7064]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3763 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.631 164.4783 429.2969 176.9576]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3757 0 obj <<
+/D [3755 0 R /XYZ 90 757.9346 null]
+>> endobj
+3758 0 obj <<
+/D [3755 0 R /XYZ 90 733.028 null]
+>> endobj
+3520 0 obj <<
+/D [3755 0 R /XYZ 90 496.7929 null]
+>> endobj
+3760 0 obj <<
+/D [3755 0 R /XYZ 90 482.2226 null]
+>> endobj
+3521 0 obj <<
+/D [3755 0 R /XYZ 90 239.204 null]
+>> endobj
+3762 0 obj <<
+/D [3755 0 R /XYZ 90 224.6337 null]
+>> endobj
+3754 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3768 0 obj <<
+/Length 2917      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���S+�x�7
��"i
+l�n^6
��h��D���ͯ�ΐ���w�E���$
�s�̜���&3
df�L	�
�rv��������_^��e(������R�
2����}�A$(�����9�ϋ%��_/�g�6�y��x��|\�*���������շ��w�?^~OH��H���
<�
+�v"�Q�e�������
+2��椒�6��XR���
C��v������s~�W
��yy?"�pf�^�����)�$6X��x��V�/0bF��|��Cg�
NY�es����
w��!�)�z.��-GZ��))�)R�R�@���whT�ab։�pT����%c�f����VjhV��,�h�b��k�xX���:+W�ӡX������������/���W��P�Jt��fR)�%!I�[�e(5<����.RD�s���]�����j8�$i|l�H‹�ub֍C���*����٦X�d���6/�SF#)��H'5t&�M��
>G�\���ݧ���Qq�Ґ���1��OC�R�s5\,��^8�z]
�L�D
/S�\^�x{"�Ey�����#�T��-Ba�Z(�i�N���-
�*�#���"UR
���j/�Ujɤ�B� �!RD(֕Y� r���m�B͡�02QN� qݮ�����l
1"F��V(�D3Q\
�:�xo��X9����A�?_�2�����t��&�\]=�e^A&���n�V
v<a:�v�XmV4�w��f�:E��
� *8��Ae��ן�2Ϫ�W�dS�ܥ?8��D7�#�Ǹ�����q�j=B@ׂ�o�|���6	՚@4x�*�
>nʩB�(
k?� +�dJűJ.3�.�*
��
+ARyG���U�(7�޻D��F"���,!
%�.���?��|0:�w���g�W��^(w&����C��R%Sr��p��
M=l|�.���j����b�7���0
)H>�D�����
��N~�0l'C�ֿ �GGS �Z�#�(g�x�#?��*/4tN�q�Pz�F�m�
2��=Ŵ�K���np!D#�eI��K��bhA��_:a
�o,����
��
�쓖2���J��%t�0
�i�C�
��Ps�m�n|k���m���9
��*����T�2	u\�DU�	���a�LM|�i�^TLO|����'�DD��j-�>����/����7�$=�ubAO��C��F���wRC�G�: 
m12�M�������CG��@�86d��T�Z��XE�-�b0CL[n����R�k�Y��J��X`(֌�
+E/5	/u
+�M��ޱ�4�
m~q��%�LF�ɤ�Ɠ�k���Z�\��2>�e/�{։}
̛�H�Τa^���a��y�
�<N��c0gv��7i؁�p����� ���Y
����������\ Oa�j��
�Aw�X�0��̞����5�8e����5�T�����h/%���]�{�����C�
�i�8��n
�
o�xr���x�8E4��pV���n�7ѿ+����UVԇ�����[H�&\��M��^��n[�Y�Ky �G�n��s"�a�]nX��
�ٮ���i�:��&��� E9�Z��X�����c%�1�! 0�bX-�V at UҜ۾ǰ�@�a����P$0,�X
���)�m
2��m��
	
;�k��U�ys4ހ���Ֆ3
+i;y
`[��k*��
���1��/]p{QiٲC�8�P4�mb�̱�0�I8�L���>��L���Ñe�r�
�����e=���P�y�J����1�Ŕ'�8����6�J� ��X�O:p��A�4���z��ڠ��┆��(HS;���]���
4�D��3;��_���e�q�{�Ua`���F7/J<n��!���f;
�1�B�q������ȁ�Xa�I+tb��<��'��I
�!
�R��㽷E����_
�+�a{(掆�������Q#O��T�Z���)f
+4R0�L[�BC�q ���a-2��dW5sJ��i
��C_��޴��|x)�
ʶhr"���DL;1?&c�	 )O�n�����
+HQ(�~vT���G0'œ�h 6�V,1�F��3
]|�|+54G��T�1"�MT!�Q�v�+��~Ño��}��no
��������~��~�h��x�;�}���M3�u%��t��O��܁c����?n갬m
� v��}�d�B��>J���@��l>*e|��
{1r�Z���&#��Qg�|T�L�G�'�-C
{���0���i{��rNV�o9�i>��<jHp�g�ú��c�m��sE�-�A_%T���
c���;J�%��Ӧ�p��y̾�eH� ��*?�յ�8I��#����X�	Ʈ�˝���S����؝�
CC�}����2df�L ��L��@�;2���	T'�@���=����DXH�&���j��P^[jN��Gb]HRs�n��N	��������
 ��ؾ}��h`_���p�4�(�쟄B��N��3�����X�
��`֕G�֣��p!��7�tO����K,،�����9�
G ����BC �h�^b�� [...]
+a��h_������4m;8
+.�9@�r�L��e�'�W�LP!�!sO�	ҽ�r� T�ؼ$�K��!�a��
4�2�Z#l
?3h�L@�,I}a�Fl��[��?OH
h)~�-Xb�DDM��P��K�k;0��~jr_�yȫ?.���A��Y���Yۇ�[Uy�Ϸ�*��L�ë
�~��"Ր<�(J��f����nXw8��@�]����W��OOO��
�b_�����7��r�a8�0O�޲����
+�ȗ��lw-`)J�q۔��9� 5�� .�endstream
+endobj
+3767 0 obj <<
+/Type /Page
+/Contents 3768 0 R
+/Resources 3766 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3765 0 R
+/Annots [ 3771 0 R 3773 0 R 3775 0 R 3776 0 R ]
+>> endobj
+3771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [334.8835 590.616 440.2823 603.0952]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+3773 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 372.504 422.9245 387.2194]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+3775 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 100.8223 425.662 115.5377]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+3776 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3769 0 obj <<
+/D [3767 0 R /XYZ 90 757.9346 null]
+>> endobj
+3522 0 obj <<
+/D [3767 0 R /XYZ 90 665.3416 null]
+>> endobj
+3770 0 obj <<
+/D [3767 0 R /XYZ 90 650.7713 null]
+>> endobj
+3523 0 obj <<
+/D [3767 0 R /XYZ 90 448.5083 null]
+>> endobj
+3772 0 obj <<
+/D [3767 0 R /XYZ 90 433.938 null]
+>> endobj
+3524 0 obj <<
+/D [3767 0 R /XYZ 90 188.7818 null]
+>> endobj
+3774 0 obj <<
+/D [3767 0 R /XYZ 90 174.2115 null]
+>> endobj
+3766 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3779 0 obj <<
+/Length 2614      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���S+�x�7
�Y$E��&n_�
���5�b$j����Cq��P�u�6
���|�s�̹|g4K����
%2�����/���?]��u�>����o�Xd$����zI���.��o��W	�/߬^��mz�fE�r�yz�����/��>�?]]}���zw��巄�F$R"!9
�_6O(��2��]�#0

v��fy�I�UB^^�
]f�r�VY���>ۯ�^f�
<2D�%��z��ug�֚�Ib�����wx��~�3Z,
�#b
]l/8e�fs���ߺq���E�DWi�H��D+X?�!D��O�1S
E%"����ʥ۬�����<	�H1J���#E:�X���PH&N�ZU>���xXZc����;�X��}�T ����^?�K�aE�"Oo7�c��X77�O�����{��?1�E�d��#��f$
i(�܄C�C%}X�|
��cs{�},�&d)�f$���`߀�!�5�w,��l�V�}s��l��{�����c�΋�S��VD,aF�����@�j֦=X̦f�v��)'�+)gD;�X���q��/�l�
���-*)bT�9��`1�:���:+vۼ��3/!b!g�;�X�oU)����k�2B�,���]W�>Þn5��]T
�/�b�<o�^��Fx�`���p8��+k�E����*����6���ve�
+�

���'�y��\���:�7U?�m��;_4��+!�/Jb�u����3p�8i���ǻ��S�,1$(;�}C%&�����j}u�+fI7��&ݷV
*e4�ިA:�X�)�����S��a�xS�J8�D~�R��<��0"E�@����h����_����7O
+
)��ǽb2�m

��߂'����� ΁g�a.
I��0r�4z��Ѵ�^	�I�!~|@������
]=�Q��b'>ݷ����1l�&y���������$�!&��Қ�K �~��Vu�ߵA�6ez7T�+c� � Xu��6	�1	C�`7�԰

1mIj
4�k
+�ߴ�A�����k��t�
"��\��TOeV O]%ʈ�N@*T&�
+@<I .���T���͘��b���c]L-UŻ�P�#���p���
+<�ƕ
H�T@��b�hy�n���߷~�Խ����Č0GXh����~� i
�SJ{
+���qT�@DB��č�6/6y��
�}BAJ	m�`9x�ԯj�1Z���9���/��:�)��� ڜt�:�g��"F��D	z
+
+�������W��-�^9��I��@9���m�4
7T�5T3TdPM;Ԍxf����U�YV���)-�
$E�N���{�D�R~�_�Al�T��XC<�k���3�~5��Q�l"
!b#-�D��=��E-r"b#e�D�S�O��Uݏp�"$6/
�1/R/�@#5=���7%��p�����R��-f��
+GB�q��c>�zs�ǰ���:Q������������ F���ct��3�u ���\��b�@�Z

;�,���FD�q2��*ĕs���P�w����b��d
����;(x��<�w��m/�;8�PI��
�"������H����`��2d
5� �NUJ�˟#
�-%�vX1G<�Sب��>j�x0
혢�~h A"�c�I�|t��:�p(�Z���;�X���!L�&��W�-�[H�m�U�f��Eʼ[���P��h�6t��0-�4/ܯy�A�ݨ �
��.�S�uZ\�Pq>��܇���Ny�_U,���5�:��Cw"�/��-�vk���g	_�����Myxy�~��Ю��O?:��C��7��L
O���֍Xgb;��9� ��4@����ZV�Y��(!�g�C� �އ&w�T��Q�&��e�y��zps�W���h0T�x���I����G���pϻ7�a)�
+1��@��t����ae֣�Z���u�
fwE��1�n�S��1\�slɱ�l
7���.$<�#-¡�����E-rj�Fʄ�;O�ߚ;!��ܑ_��d��Ha���
&�Ɯ֎)���ԮjM
̚X��s*�q�	�N���Ń%ђ?���&�E��#�
���q���S~5g��5
u�L{ݧ���>���$f�V���?�`�I�
��SS9po at h?)��(��q2_5��0珛0��$�-�M
݆�P/�|"j�U{���a&��=�Dz�v~��2�{�p��'���{
e���>j�%]|R�aF#=�̨��;���O��Hh�����y���L�γ�-��
��v�!����Pcу�S#%8�E�r���������S��9���ծLjxĆ���̜
{��

�_�|��cCg�:�X���@�

����1�2uV;
mL�0�Ka�H	�E�\�r�

nw�����#+9�!�����/f�S�7�$���5���'�!3��n�H!?�z�$�!b�
r	��
'��+�a}c�<�樽u�Qs�vA������+!�m��5-��ܣm?>ء��w'�@U\�3��=����٘j�:
�J�۟���=f�>Hz_4��zS
�k'�PU������#�;�c��{�W�e��
��1F�*[���t���!r������e��ιT^��m}T}�G6����
��endstream
+endobj
+3778 0 obj <<
+/Type /Page
+/Contents 3779 0 R
+/Resources 3777 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3765 0 R
+/Annots [ 3782 0 R 3784 0 R 3785 0 R 3787 0 R 3788 0 R ]
+>> endobj
+3782 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 521.6176 322.4458 532.5216]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+3784 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 407.973 340.1696 418.877]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3785 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 338.7502 268.3399 349.6541]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3787 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 213.1504 340.1696 224.0544]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3788 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3780 0 obj <<
+/D [3778 0 R /XYZ 90 757.9346 null]
+>> endobj
+3525 0 obj <<
+/D [3778 0 R /XYZ 90 584.0829 null]
+>> endobj
+3781 0 obj <<
+/D [3778 0 R /XYZ 90 569.8178 null]
+>> endobj
+3526 0 obj <<
+/D [3778 0 R /XYZ 90 470.4383 null]
+>> endobj
+3783 0 obj <<
+/D [3778 0 R /XYZ 90 456.1732 null]
+>> endobj
+3571 0 obj <<
+/D [3778 0 R /XYZ 90 287.5708 null]
+>> endobj
+3786 0 obj <<
+/D [3778 0 R /XYZ 90 273.3058 null]
+>> endobj
+3572 0 obj <<
+/D [3778 0 R /XYZ 90 89.4414 null]
+>> endobj
+3777 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3791 0 obj <<
+/Length 3208      
+/Filter /FlateDecode
+>>
+stream
+xڽZYs��~ׯ�SBV��܇rT�]�8�Qή�ۥ�H��2	� h���Ӄ�g�!(��)=Gs��ϯ{���B���2Ӕ��f���/Wؽ^��uH�����[�:ӂ���~�3N0Y�n�_b�^�1Bh��
+�e����V-���c�m򻿗�M�<��|Y\�x���[�����f�?Z��)F��S���?�e� O�狋|���v�&
-oW�,��a�w�}��P4+��E��Gs��E���
��ɩ�FY?_}�#ZlA��^��j�Op�2�5Y���fw���_�:�E���Q8�/�
+��V�hƈ3M�7՛b�����L2%
A�|(�|Zᒞ1�`�&fO�m���
�/�q�rk��d7��3*��(�zƍ���#m����}�ۻ�!]��T��~
&Мc�l_IqW|��P�ʺ��+�՚2��q����3�jy>L(AznB@���a����I���,��1���K�X���Q� _�֒�e�ï�e��Uw���]a��M�
%Ƴ�[n�&����*��2*.�����
�C`�	? D|�
�
a%�1m��g���o��(d$!ګ%����$ljE@E6ߗծ��-!��NXQk]f�@v�]bh��&���0�OArx,�ES��]g����������z!��"WJ̫��Ѽ
��@��'�H��>vօ�7���LDr�-�4ʤ�I����|
K����cg�������][۫��P7��z�ʫ[�����F�R/�*a_�x�$�#W��� � �
��f
��Y��q��W�Z��G'��^xn���
�pq����w�i�`"!.��O�(
+��,S{�l�1�Q������?��G�M=�: �H�3�Vb��Hv��YW4�����$�m&�O��'rĹ
A���k4�I��P��&
cw�����7���8�[7�~+YhB�A��iul��
qƆbp�|ܽg���=r#(؀��
��~���  K�FY��9
z�S��6&H���j�5�"�[��\o}ȶ�m_B]�z

[o��vf���(<��b� ��y�rm����(v ;U�X��#��z�)׉b�"���dxPI}0�>73��1�_�:���#
�F���Z��~W��mW7�0�k�cxZ
��~��pfE{���@W�d�UQ��̠F+�aϜ����c��
l+.c��g+
O�x�{��ϸ28��B�����	mO�5��6��Tv��M�
�˽�e �c����S]��
��xT(ն��Fv��*>���R��{0�/S!��:�ɔ�Lh$����
q�F��υ�X�3��Ɍm����L��;�]��˛�㾨�)@T`e�ڳ�����A4�#an!sA�<���lY��
+�P�~�
+�b�
+�8t<ω%T���]U^mS�
�+z�)%� ���%ءY���� �l�АV�XC1K�D0�r����v�ܵ�`���'��r�yP�|��W��=r�5�`gL�
hY4ɠ��$C(vn�ՙ"2�-���<M2̚�<�`�xv�q=��33�S�Fje�S
+?�P2 ��ȠU��c��l�	2�0�0&�����ɸ��_�}ɱʤ�����VG�5��,n���
+�h�MPΓI
��L���x�N�
����7���g
���d��`1�gR������"X�x&zH
�W�0G���N���	��[��~҈1ʠ
���
0ȓ�C�iE����9����0�a�<{��#�@�
���]{ܘ񂀈�7!�ypÈȄ�W5�)f �D�4������ݟ�	�t'
1}3a
+�Q�������_b?YװwY: 2C�;�w�.�e
�����4�
���x$�C�I͈�6�;"T���”* : �v��`=cҡ�>
��)��ǒ��(I��
�L�~�Q�^c�$���<h�Q�C�L(Av<
��;�9$Ņ�2��q/�&�6����bƱ��
5�����<�E>������7����uW��caF3E�Hi�0���˼��'�
��M��vNL���N�}�W����@��s\
{�7���Gh�Oe஬N��q6�������V�����;Q˲3��'DB<�oJ͠�)��̘�
.^%
��~!�m'��7\��	�}����4E�O��6����+�Q�?��5�*��ڸQ��fE�c
f�#& ��1@� +��n�
�ہϚq���܃�)�3R
�4�'�� �s$�Z?f}oeڧ:h����O}E
3�/�����i at 8�S�����[���������[}<��h�MrN�y��2<��R#���
eD�J
���8�
l
��$�VI����̀S�N����>߹rI�d�@>g�����z����m�9���?�ȷۻ��o�a� (4�D��՗��j�]����&B��wF��F^������\
����E&���N~�mS���1���;�U���F����_�*jGqYﶣc=h��Q�~o�����U*�!GHu
r`
}���W�|)f@�D�4�
�{$O�fw:]�0M�.EL�c���'H�c�{
B,e.�ܚ�8#�`M�3//]�7���� �
���EX�+��|x,��
<-���R
�� E_�ßR`��0V�ͣ��i[��������>��;�4�FqҰ��e$���}|�$��箤��EDu��9Vf*�Ԛ����oܯNۃ�H�po!>\
�A�bkP�˷Fm�h�
��\mn1FfN�l�vy�
�c�z?
+�{��c��T��0���
2��KLi��1ѾB�sPk!2m�B�B!�����6�D.zp̀hHY��r/�lG^��hk!q�k6\�� 
�(p�-
+��\��h�I����Z��V�L�D��dž	��? � <NKŲ����NW��G	2-@�����q��H�6aT��Yʜ��f�k����O‚Z �3�̼������E�Ե5�~
�O��dEȺ� �o��5��d�l�b�Ɖ}@��@z�M�an���[d��M��9���q
�F����Lv2���z�io
ʴ7�n���+Η�N�#������'%Mk�*x�"hl�t=����O ;�m0��d����W
N����/,	�b����c�
n������M�
���dew}8�'Ge�H:g��@4�%R?�"$ �P;� E�k?#*������R'	Q�ƽc�endstream
+endobj
+3790 0 obj <<
+/Type /Page
+/Contents 3791 0 R
+/Resources 3789 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3765 0 R
+/Annots [ 3794 0 R 3795 0 R 3797 0 R 3798 0 R 3800 0 R ]
+>> endobj
+3794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0616 678.3775 276.0472 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 583.0558 268.3399 593.9598]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+3797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0107 458.8104 513.9963 469.7143]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+3798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.8055 405.5953 144.4057 434.5366]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3792 0 obj <<
+/D [3790 0 R /XYZ 90 757.9346 null]
+>> endobj
+3793 0 obj <<
+/D [3790 0 R /XYZ 90 733.028 null]
+>> endobj
+3573 0 obj <<
+/D [3790 0 R /XYZ 90 521.1638 null]
+>> endobj
+3796 0 obj <<
+/D [3790 0 R /XYZ 90 507.0106 null]
+>> endobj
+3574 0 obj <<
+/D [3790 0 R /XYZ 90 278.3514 null]
+>> endobj
+3799 0 obj <<
+/D [3790 0 R /XYZ 90 264.1981 null]
+>> endobj
+3575 0 obj <<
+/D [3790 0 R /XYZ 90 89.4414 null]
+>> endobj
+3789 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F25 348 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R /F108 3094 0 R /F8 568 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3803 0 obj <<
+/Length 3173      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s�~���S+MWX�/Nڙns���L����&�%�f+�
+I�W��H"D9���t<
��!pp��9 �a�#3�gJ(d������`��
�/��2$xsu��)fI��궛A$(�����9��Œ`��?,�g�6��aA�����u�]_��Y���|S}Z�|���o	f$R"!9�_:�hQ�e�������4hpO򧳓�e�5�bI�_-
����&ks7�6�����\��!B�	�vҋ��qyi
+&��/~Ƴ5H��
���b�7c�l{�)�o6�.�1��
t/��"{�V(CX
+6h1�{մ���r�
VfdB�
+)��'h���̶VP��P��s*�u!Ӟ�5��X�9�mF [�̴��4#�4��=��e�^_7�l�_/-�l�$CJ��`� 
���eSTes����]g^�?�U�L�',�@sm��6*܀2�I���4w�[�I����!HS"=ч��e��#4 \�����E!I�I�^��Ĵ`�T�\4�F\��2_P1t�?��ݷ����.yJ�. at z��*��e兘oor���CEy4Q�,X������w�D�~��T.9l�Q��ҞhR�=U�1��$�38����x�6�����	�H1J����njĶ��T�Y�E�J�lz��x�� ��BƋ^
�y zUT�Ӗ~����9�T!�@�99	��i<<|,6��Ɠ��U�����Ɵ�Ey�?�w�yӺѢ\�֊>u��8����W.���W����սų��˜��
[��n8s�;�X����%�N^������ݬ�[�.d3��7�1���p������<���fӓ�e�d����]�áOuk2����sg���b��:+ʞM�ibG�J
x�/Y�&qʇ!�K���+��y�u���`��,S����t`�n������~�{��M�Qh誔Jİ���V3���:b�Bb�$�}�}�(�͑��
�����	Fi"B*� �/*�Lg�~��
jE�R���V��æu�B!3s
!:JM�	l��Q���Љ9�	�[6��l��	v�:�W�

���>%�Dڅ��'�O_ l�r������� �̓�C�
���<���r]LH(Y�
``���kdž��n0

N ��#&x/
�{�0���p�k���bA��gHs,G ���Zw��ş%F�
+�fl@�� ~DVAHbi���\&0�]�.K�0Q��c&N I�j�':�$)�f
�`;�sa0�B��}yv�4�K��'��<
�}B.��J��< �.���3 at Q���n-�����L/�}b��n�OA��	H�‚�X����<��w1���}s��&o
A`�}ع
Ν�q��(��r�ʁ
+�&O�r�q*��i.��b��-DKz�@nj��J-�uD�>� s!��}ֺ�UV�݃/�=iu��H
P�so�脔m.D����D�P��
��ظ*���'��Pu,2�"��'����}lz,��s|D+ at Y
EcC������^n,W��
���d�
%3�LJȂ��wEAY�cE�$�*�E�T6n
a�T�D�
.�U�o��˳����� T��o��U
hS�9�/3������r�̙q@å{��m�_H1��eگ	T��e�T�ݗA�q4�~�=�v�P�����%��(�#l�ׁ�N��RV�ʧ�}�wU
+��)�b���w�
a����9	��Q��p�=Jd
k}�D1D��xV�a�t`��Y$: �&��摉�z�{Yd���eFel�A!�
+NNa�^I�
]�	�
�cf�@��H��Pɭ�2���
�w&7�=	���~
x �7�A�K@����Q�g���>%�.���+� �������;0��>���
`
+�F��6U�
+�t��D���W:6n2��"nV�j;;ҳF�cFDMʊ��x�9�cT���l������?+�}*4j�������b�*X1"�kF�*u���8�^�J'&��U�u	��� �����bzooXW ���W��
�g�
k�3�{[m6U��l at +�)�	hݴ��rU�Y�{�.��i�s764��m�V �cZ�` :
����n\�p<�i�����3�;�x�nq0�8�܈���^��
+����[ד��l{��z�UX€�qw�}1;���fx�(S�եy�2���0sk�]�gݟ�)
D��
�j���Hc@}�NUp�)b�����;n�n��z� l�2Q�L}�����91GR���Vp
��C�����sb(��P�}yr��e E��cb�9���Lw�8�+Ą���%v�&�D{o�\�Ok���~8��R����V�7�u�1ԗU��.$�e��K�'SA$�*����;���ip[6��G��<��J ���'OlC��'�jCm��UG�)&�lG���l�IUF
I��6�LJd�3�|�@132
�6�!�p�f�8t̆}R�y��C=�~F�Zv�/!�w����i����[]PĴQ��Ս����}Ш9�é���P�Hçm�a`G�36PMؼ *�
����*���ɔ�'���c.N�{O�E�v}yY�
@�M���껇�m�
3e4���I�
Tcfb-c�$�눙�����.ūy��%�"��x�������5�Y
����-n\KX
�b5�J?�P�k*
I�s
�
�t���uP�)�D�i�
T� � ��
�.�Ұ��zgaȵ��;*+R�R���>���`�XOC5�g4��,fӔFPM�T��7P�?��χպ���Ӑ���}�!%���0O
+�q�z�rg��
>��/	ˆl����\Mtt����(C�u��<���wWݲG
$�ɈF�p���9�K%Q���	��I4�:�D	�+}��)I4��D
q�N����DIt�L:�F��II4Ώ �$6OT��>�fQ���:��Y�Y�J��
����#^�@�A����a�SVi�
\T�̂&"R������H<��.h������Qmp��}tw�>Ļ�����B����߳�}����c��]�Sec
Z,�w��k��~$%��_���o��_Xo8���y�h߶��ׯѪAe��QѾ��6�G cd�bS�[D#^"�s�wi�_��m����
���6�!fdG�C���:�`endstream
+endobj
+3802 0 obj <<
+/Type /Page
+/Contents 3803 0 R
+/Resources 3801 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3765 0 R
+/Annots [ 3808 0 R 3809 0 R 3811 0 R ]
+>> endobj
+3808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 272.6884 250.8953 301.7542]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 227.2324 483.2121 258.2011]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3804 0 obj <<
+/D [3802 0 R /XYZ 90 757.9346 null]
+>> endobj
+3805 0 obj <<
+/D [3802 0 R /XYZ 90 733.028 null]
+>> endobj
+3576 0 obj <<
+/D [3802 0 R /XYZ 90 556.8297 null]
+>> endobj
+3806 0 obj <<
+/D [3802 0 R /XYZ 90 542.2861 null]
+>> endobj
+3577 0 obj <<
+/D [3802 0 R /XYZ 237.5353 381.142 null]
+>> endobj
+3807 0 obj <<
+/D [3802 0 R /XYZ 90 364.4416 null]
+>> endobj
+3578 0 obj <<
+/D [3802 0 R /XYZ 90 207.306 null]
+>> endobj
+3810 0 obj <<
+/D [3802 0 R /XYZ 90 192.7624 null]
+>> endobj
+3579 0 obj <<
+/D [3802 0 R /XYZ 90 89.4414 null]
+>> endobj
+3801 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R /F10 488 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3814 0 obj <<
+/Length 3055      
+/Filter /FlateDecode
+>>
+stream
+xڵZY��~�_��D�XX�&�<��M�8U{�ۥ�H�
��P�w�ߧA
"H��횪�f����I��B�E&2�����/��������>�wo�J��HK*���$HPB���Wk�1^�[�̛c�y��xY^��]�o�)��y����������7o	�q$R"!9	
��-I�(��2�)���}�
�I�v�ɗ��|^���ˇ����x:�ma�|[�fEԲ��pI���g���WA]N��Ib����~‹
h��;��Vb�N0"Z���S�Ow���'�7�RF���*�!,
VA
q�L�����8��Ȍ�3�q�9���TT�����0�̐�@�[H0
:��ұ
�
�O��9d[���K�m�Y֠�e��CJ�B�Z�_
���E����͓�5q��b
��B��_X ���

�s����H6��H������9��m�ٕǢ:�u�$���[8k�iJ�ue	�dW�Y_N��uN{x"!
�����V$���k͉FRQ�k�臲:�U�}.^� d#���P~[�.
 ��.���5��~@ &�b�֍=�d��nve��
���!h0��@p� Hv at ln5O���^��u������vJ�ֱ�콉�"�]�@�
�[���A�pQ%&�tB\Q͒kz�u�j
J#��)E����9
ڢ9��'���Q�`$H�
K�8�K&bY�� 
�C��<�x�H�I { �h��i/p
\l����oC,綬�����P���A� �x�	����j�
m�a����ά1s�x1@�m��
�/�����zE��C���ޝ'=N��B�<x^��z^x�3L:���gdfӏu
ʖ�x���6޾l���>�ee ����1Z�����eS���i
��%�j��K�`iȩ��ɤZ���
d˺:��K�V�cs�)NMq.����;����՟
-l�3�����m��:�w�&JT���Tg˲u˟-5� ��E���z�PHc��>�_�]�#ƴ*vF�h���
o�(�Q�C����X�>�Tx-[/Q��;e05���X��m~8t��b_7��3
8��ίWR,]�M�dD�%�?,]a��լ8^~f��9V�������\J]!�
�dH�9���*&��5
W
u��
����N��H��"y
�����-�ܘ����1��)��b%��x9���.7������
W+�G/T��Hf�I=s���R��s�zFρ,F\S���4_~f�{��D#|S�ɮ��̻�>�LAA��2�sX�
��L��6�6��jaL\{�R���E��K�)��%���2�� [d�
�}J\0�PrSG&1)���2��	@)�g4���GeFU���Z�XN�ׯ�T�TF
�S
@:�y"�%���2��*��. ���C�׺N�5���kb��%8Y�<[e2��P
+bҗU`W��
d�'��l��Op���^
��^ʐ�@'�oz����+d��B7�s��)E0�L�IMty����-jW:C�������:��h�ݍT��ㄌ[�XHf`�
��
�HU�U�
+���&�?�Nz5 1�x�l�liC�)�O<�9Cw�m�� |u�٘�(���)��e�t�&�y��v͏��6�v
�\��
�����1)S�������
�n:�z�A�&<���h.�@��?n (@
@
��i
Q��:H�7��)t�xvV�:1,c�D�o
�T�O��a��¨C
Ӭ'�L�=�M�?
��Č �rJ�m~ɛ�]�+b�Q}�`�I�� zL�
+��!
lQQ�5>3{[S�@9 �/�\2�<�QlH��t�ʛr[�:dI�ooF7���n ZOu����l�Gf�#3��Y({&Ja����>��j
m?S�jܕ`f�5�$=�
+d=E�S���&�]�j��	55&W��)�)c]T�X��~�I}W	�����Q��:�f	����T��
ٜz=Y�hQ(����Ƣ�j��@�*,��E�r���h�Xs
+9�յ��|�
�D�
"g>"�D3���t���-Nݰ`&�K�k Ä�
U����
�N���&o�.�[�H"
��y�7��@4�$.
0C��q_���ƎJ�����]�gq�x
cD[+کM;��ᛐTl��
�� l�ku+�zds��d�x��zj�7Eӌk>�)�;���Tc!�S��X��nRv�Y��:(�0�V�36�:���8U�h��C 
F�¤�#��r�����rv��rpY.��� ���ع�&��M�ǣr��"#����Ȋ�[�������)�s��o�����5h0U���	@R,װ�wDca� �
+��� Ǣ7�m4�>@B0
�7�Rю�">������
��n�O5
����X��B �e~�jbV:�" s�>&*s���с�
�
t���;�X��8�M�:��)���J����}ҔX�/ ~Ĕ����k�
6:	��Tg�1dSN_;.Y����u�A�����o��Σ8�Ѕ�4
��hq+�-��O���O#��#ӿY@�dPfX���Cp�T�VW�0`�˧�
�(M�d�3����0, 
cR̻˵�LxF?��q
*h��g����e�m0�L�Zɇ��jM �t?��>��4á:�
DO(�
E���ʹ$�a.��U"&�F%?

D��n�E��~h��?�*4�_�`���ǰ���F���֢���L��$�7qWv�D���WLM ��:�q�Q������p�S�P����o��7��fߩ��@l 6 φ�s'�������|H�f>�u`7�=�[ϰ��+:�s<��� ��8��	�qD)	/�4JgP��WW�4�x!�2-�Y���o����K�����36�����|�Q��5m�|0�S������J��3������
Gw�$\�	�SS��}�a�}W��T��i�%{�����W_�ֽ'|���oW�����͛>��]��Ԡ�}s:
�
���

v�z�@4�%R?�Uf��}Y���=v��X����<���
����endstream
+endobj
+3813 0 obj <<
+/Type /Page
+/Contents 3814 0 R
+/Resources 3812 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3765 0 R
+/Annots [ 3817 0 R 3818 0 R 3820 0 R 3821 0 R 3823 0 R ]
+>> endobj
+3817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.3762 678.3775 385.5187 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+3818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 383.594 239.8565 394.498]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+3820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 189.3012 300.1613 199.5825]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4e6787c98290a49ce80b90c008aac5a8) >>
+>> endobj
+3821 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 149.1364 182.1636 160.0403]
+/Subtype /Link
+/A << /S /GoTo /D (main_expand_space_dimension) >>
+>> endobj
+3823 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3815 0 obj <<
+/D [3813 0 R /XYZ 90 757.9346 null]
+>> endobj
+3816 0 obj <<
+/D [3813 0 R /XYZ 90 733.028 null]
+>> endobj
+3580 0 obj <<
+/D [3813 0 R /XYZ 244.4393 386.7471 null]
+>> endobj
+3819 0 obj <<
+/D [3813 0 R /XYZ 90 370.02 null]
+>> endobj
+3581 0 obj <<
+/D [3813 0 R /XYZ 400.6899 152.2895 null]
+>> endobj
+3822 0 obj <<
+/D [3813 0 R /XYZ 90 135.5623 null]
+>> endobj
+3812 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F8 568 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3826 0 obj <<
+/Length 3246      
+/Filter /FlateDecode
+>>
+stream
+x��[�s�~�_��T��p�o�I:�d�Υ�4�s�d<�D�l$R��8׿���"H�绗N����X�~�����&3-5�\��jw�����߮h�x	ϗ]��n�^}�������l�%�Q6�Y�4�p�X�$I�?,h2O�]z�Â%�r��![W����]�Vﮯ�*�X�r�ݫo)�H�"R	��;�ޤ4!�[/�����0
d/�׳�|�M�Œ�d~��l���۴�ܝ7�&��̳b�,�fN��A���	�j�)��h�߮~�%�����]%�[#gO�%!�Z6�]	�����۫�q܃��M
6�PW��iT�H�P�a�C(�2�ƒ$�z��"Tq��ݹt��Yu�>]'Mќ�Ywh��@� =����~h�)��QQ�����n7�P�]g�.
+Lh��r��K
u���{��U_����Y�.�ͩ

��c}=�Qu�ʼ�h��h4
5�q��Cyz�����(�մI��9�	�W���O��ۀY�U�
�e�΋{w�.��`�}�j/��.+yY
��w��M�џ�x
�)�O�ﴗZv�&�-��~O��� $�v��z��}c�X-LZ�`��_0�mA��~>�2޶p/�֋������dv��"�[Y�>ݗ�}h'����j�ɩ�<�(������#4�E
+�1G(�����8�(���S�q�È_�R�á^__��B$�!�|}�V��`�z��5DI��)c��&'�ω�p����*�G�`Ӹ��|㘍u�($A:v��3��e��:R�'��ܣ��k��^`��zN\l��r��h��=��Cd2�^���(;��#l+RV����h�@?�O��A�Z0��
�(�g at 8�/�?�E��gA�*��;Ue�K��9���f���l�DQ�y	_�
�u�
�y\�%�@�'3j
+�B[Y�X
+��_n����a3�&2�2$Q��LmzB�6]�t1�t*�io5K��-���T�A6j�t at 2�T.�QR��6ch	��
�$$t���X�YH3��M��i�
҆
����sO���Äנk��)�z���OqDۉ�~�,	� �~�%���͢M�1-�",?�L*\��'
�A���ȁx�6��S<�0�F���(���XY��r�Y����
����)���t+��N<�ar�f�v��Ck�]�G�{ܹ�QS6O��S�pk�Az�J!^���t�nA��+k���<�K�l��ؓ1��ι�L����̋�vJ��e���j��2�(�$3���� 
+K�
m�!wS�-�h������4�k~V�ϓ��[Q�d�o��=�wFP/�Vb QH=��:*-?ñA~�������A��&O��Ox�ɮ��b]Jo�&/�5��s!�QR�>��8�L/�ļe��!�vĒCy%��
�
�С�B8�Y�S�}_"
+s�щ�	d�`e���Y>�~� �
+E�D�b��>�>��ᚋO�C�w+�
+�p9�&T���Np�E��g������ ,��|�AP
4�ں��9�ɏ�;꤄'Յ�b^u�X��di&9�����F��C� �7�Oy���闈B����4��&���{�Տ���S�Qa��5�zU|�p<[�(m{"w�c�>IJȥ�1t�)6��&a�"SH	�9���J���Bs�
�����'�́�B3��_�9i�c�9P&^k������ǘQ0�Ur>c\�H8�$
�.���v�I�F1#3!G}I�͉�	��� ��D�AC2�i�Cg���g
�����lq*��l����n����C�&�����f
�΃
�g1�L���v ���"Y���1T�V3v
��	
|�9�KGsp�Idx�Ir��<28 ���
���!�Dwl���C��f���I-�<�G�5�X,�K��*ds�!x�C��'�y�+5�\���b
�M>�-�<�ޏ&-r䁁2q
�)�'\���@2���p��,�n�p@�>?;�($V��9 ��m�:?eU�������

���G�h�Xc�
+*L���)��
�)���
�}�-���Ӏ$B
+���2ۀ+�U�A?N2��p�]DF���[�_�ل�R�K�9�s��
ė�����F'
t����8Z
7Ԫ.��(�|,w�v4J�e[�
%�U��`rET��-�&�
��XbL�S�p�'��z���c|�+mZ�u��B#C�
[jn�Y=���4���D�<������� -Υ�U�h��.91�jUV�:۾��j{�
j
@'�\���f�C
ĦV�M�XÌp�e/?b�����A.k�
�g����rh
��'�ݎӒC����-G�;�D�em�Y���w7U�ko�F	S�C���=w�
s&!��j�8p8�c
�X�W��c���q��:0�1yγ����� �y��ikg���j�e��!�۽�
�v������4��0Gf��|�va"|c	�khz��o
+)!x�;'\Ɯ�ބie��2��&0�sc�M�\7�Ș��"j (3�M�`�n.
�R�
��f!.)1�G,�g�p5�G�A��]����-���T������gT��T�|�ʚ���ՃW2�O�]�EY�� �k����N��tU��
+��x	[�ELjq�U�z{\oaT{>#���W��3��
OLJ��㓨S
Ʊ�p�u��
+�I0���"
tb����c�t�Z�v�y�?Z���)��{���w���(�T'�geѐA�����hC�o	��s�u&a�
@�>�X��
����紻��C����e����!���ҩ}9�/y���85>
���
>*L�����[��xąî���^�o =�o��?-�C@)��&k^�����l�.& �dR��/
?�:â�aP�>`��˛��
����#���
�ׯ�2E?�
�*�|硽η/|�q�o�I?ț#�-
'R���Eyiۂ�G�"�m
&u����uH^ڶ�����P�L�Xޙq��r-(}^��q��,0a4'	��jY��,�-��,�e-
�q��-
yQ����%-
��ֲ06��T˂�g�,��?lY���	��R��k�	
K�T/�����~d_��΋8#��Ȧ�D�$~@Cdn�zhv_[|v_�}Ȫ�,$l�����x�I�|�:�(��@��4-��@o��?|Q
�g%��י��{�!���_��"�Y�`�&]�����WOOOdu ��+�ׯ����{SIB,�|j��Ah�K���_i(=����kWV�S��k��;TCU�~TAendstream
+endobj
+3825 0 obj <<
+/Type /Page
+/Contents 3826 0 R
+/Resources 3824 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3836 0 R
+/Annots [ 3828 0 R 3829 0 R 3830 0 R 3835 0 R ]
+>> endobj
+3828 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 704.9584 241.6898 734.0242]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 631.4588 163.8226 642.3627]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+3830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 568.0063 513.9963 578.9102]
+/Subtype /Link
+/A << /S /GoTo /D (main_fold_space_dimensions) >>
+>> endobj
+3835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3827 0 obj <<
+/D [3825 0 R /XYZ 90 757.9346 null]
+>> endobj
+3218 0 obj <<
+/D [3825 0 R /XYZ 213.4267 559.2042 null]
+>> endobj
+3831 0 obj <<
+/D [3825 0 R /XYZ 90 542.477 null]
+>> endobj
+3219 0 obj <<
+/D [3825 0 R /XYZ 90 441.7087 null]
+>> endobj
+3832 0 obj <<
+/D [3825 0 R /XYZ 90 427.1384 null]
+>> endobj
+3220 0 obj <<
+/D [3825 0 R /XYZ 90 326.37 null]
+>> endobj
+3833 0 obj <<
+/D [3825 0 R /XYZ 90 311.7997 null]
+>> endobj
+3275 0 obj <<
+/D [3825 0 R /XYZ 479.1574 171.728 null]
+>> endobj
+3834 0 obj <<
+/D [3825 0 R /XYZ 90 155.0009 null]
+>> endobj
+3824 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3839 0 obj <<
+/Length 2687      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo�F��_���J@���7)��M�^�ͥ���-Q6Q�TI*����r�I-E�b�\ ^�h83;��3�K&����%2���bs�'7p��3R?���y��o/��_I11�H*'��J�$HPB'��wS�ٜ`��ofO�|]��Q<�����2��~J��(����6�8{���+BZ��HH�A+�{��Q�eƿ����1����oF��\GE1�S���3C��f�����y��|F�4Np����+�����]�7��:돳w��d	^��
#f����F�:ٜq�����׳6r܃��I�fE�ެP����
yZ �8�ntot�(��p/���
0�IZ����h��,�<��m�.����"�2s�쯜�U��
�/��E�
��@F)�¼�u�m���X&�8-�,E�9�x{�
+�h�X�SmL
+';�J7��v�2^:�Vy�q���lF���/��ޓ�"���w����i�p�'�4L�d�b� �wWѺ��QxY+SkW*���O󻤨>��'~v;_�
il��.�Yf
~�	���k_�

q�^H"4b\{F�24�)!�l.G��i`z������]q�L"��
5QC�KҞb�m�V
 RE3���|�
��n�jqU�����V��箲P���[T�#�

]�u't�wC5���<tF� h����$���#&���uh�ĺ�Gc�b2;��B|�Fy\_�M�]Q���˦�M�!�Ѐ�����d_�^
SY,��.v�[�dT��]Di�&
@Z��W��np��hQTa�
���2D#ɔw�
��XA���N0X�QQ���mQC�� �Iq�"�����J�
+�*$)w��EZ
��7���e�C|Y��!�j��ڈ캌��d
+4�!�?R�4�R�vƁ��<��{'E�r^���]U'C���L��Yׅ��Y :����,��F7�P�&E�2��G(@��L3�@�a	o�j�
�5�{�'q%/�俍-s�/^�R���w�bV��VP J@�!-��(=
;�&e'Da�
+)����i����x�2J�],�q��λ�:��N^I�Y�����

���*I��]�hB9=Nt[�$�cu��_�7L'�	º�͏UP�%̡8NG-����t�9PY�����#��W�>h)�o֤� !� Hӆ��[Uy�>�g�
�435|��o+vX�h��棬���̊�M+:�q�[.D�3}q�Y+��N<"$����2�*k�'��hX�����Q��2����m�{_nz�=O�E���]��V]0X�v�{������
�o{�n�v�扂� �O�iLi�+V�3��a��i�*���>!(=eMn�7b[ogQ./.��t�z�q���h��!4�aѰ�gA�2@�U
����G�l`�P��t��J� V)�!��
�X}�6�j�G��'
c�d
am����@_����THȉz��+����6s/D���`г�d"F=�M�?0��e" �[�����D�r����j̳��
������ ����A&��i"ɞ�5�&12�D
������{�BE��)I��X]���f$�1����$>r���,��	�Y�z ���1�Gax���\����+�k �@��S^'i
�Wˤ(�t_�E,x��
+�_�Ƌ�mI��W�z�>+����w��8Dt��Hs

+����Ը�A����2���WN���I�A؅L��s�֧
+�&
��O�Mbϛ�M
k}�
+���#�wJ����#�d �D������^d��~kW����$�jb3�YiM�0��RqJ!5 ��6I��@vW�E5�}R�6����?�J$z�S��.�=��wq
�Gb���⩫Lgί�Ja�I�D����>��vб��؛f��M#܂��GL3Pm���Ӡv�&7�DŽ�rT)�ד-�i�d���3��[��n��c�q��խ��>)�ip��h�i�}~�i�3�h����Ħ�^C%�Z��`�u�9`U+ԃ�
�:Z
����-��
O�⤵��͟���+��6^$v�����P�`@NE!� ��Q��z0`�����5�l��tQ%|�W��T�\v =�*�7V/{�+�]q;t$*O" c������enԮ��e
���w4�-�����ej��찊�D�
�$����Ɩw�C%�
+�E�ߌi��&²��j��g ��@�@�
@�= �w* ��@fdjU�wj
��
��[U��_�!vt�`�
7�tQ؞���:#�R��xzt9�=�ZE�"7�92f�U��C��#{���2|���}ER5����V�`���F��.��&�1u�d�i�J��7�澑n$�CZ�h����!�$�7ZlpeT㌜��F
+,G
�c��4��}.6 h�;j��ۡC�Hb%�vvG�S�Qtl皍m\��5�ξ5m))��<����zp;�!m���d����)��OM�N4
�
��f��#]�D��3F��-6k��	-�|P��;T,��c�C �>�qu�[j��!���c�>O�萯7���#���?��.����_E�i�ފfb�cQv��Q�| 
+T��<���
r+տ�q�?��+
/���O���{c��[�p�U�����۲�^����ݡE�vi��QR�o���^
cd�b�fo޼t�K��
�r�uG���M��W$�e��<�#�
P�?Y��endstream
+endobj
+3838 0 obj <<
+/Type /Page
+/Contents 3839 0 R
+/Resources 3837 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3836 0 R
+/Annots [ 3847 0 R ]
+>> endobj
+3847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3840 0 obj <<
+/D [3838 0 R /XYZ 90 757.9346 null]
+>> endobj
+3841 0 obj <<
+/D [3838 0 R /XYZ 90 652.8483 null]
+>> endobj
+3625 0 obj <<
+/D [3838 0 R /XYZ 90 630.5366 null]
+>> endobj
+3842 0 obj <<
+/D [3838 0 R /XYZ 90 630.5366 null]
+>> endobj
+3626 0 obj <<
+/D [3838 0 R /XYZ 490.9725 565.8278 null]
+>> endobj
+3843 0 obj <<
+/D [3838 0 R /XYZ 90 549.1006 null]
+>> endobj
+3627 0 obj <<
+/D [3838 0 R /XYZ 90 501.8967 null]
+>> endobj
+3844 0 obj <<
+/D [3838 0 R /XYZ 90 487.3264 null]
+>> endobj
+3628 0 obj <<
+/D [3838 0 R /XYZ 484.9949 424.655 null]
+>> endobj
+3845 0 obj <<
+/D [3838 0 R /XYZ 90 407.9279 null]
+>> endobj
+3629 0 obj <<
+/D [3838 0 R /XYZ 125.5542 197.3587 null]
+>> endobj
+3846 0 obj <<
+/D [3838 0 R /XYZ 90 180.6316 null]
+>> endobj
+3837 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3850 0 obj <<
+/Length 2039      
+/Filter /FlateDecode
+>>
+stream
+x��Zێ�6}�W�)+1����b�dr�f�`�x�e2h�m��[rd9=��%J�dJ���'3�
?X"�RU�u�H2��#S��J(d���f��o���	��s蟷|��\}#�� #��.nK	� A	�.V�#׳9�G�fGq���_�(����ή�����&��Ë_f�fo�]}CHK"�	�9h����y)��2S����1��z�?�
+y��w�ٜ
+
-f�Fv�]Dž�Z~��6�
�t	M�
����׋�]ޛ�I�����<]�W��`Č�{���C��	���YO~���ȩ:�B�"
̊��Y�
a)X���
���;[]�vY$�$�q^5��]�ֹ�[�[�z����8���v����ˑP\�q�
+I�5�~�ᜐd畴�bLS��
vE�[����ͳw�&.��7e�����i����
+I��i~�iޙ�>Ow�s�b��
�A�'�|o�a�
�̋�{����3�8��j�m�ޅ�2���ҏ�`����"7� ����v
+A�-���_%�:q~t�Ώ�{�vM����.7[vU5�
&PL�Tx��}
�ba���W�v���h��z]�m�m�����+�^��o�|S��%�۞]D�0���cF<��7k��8��kXl����~
��!(?J!!)qLƃK"��<ʡg�A|�� ���+
+0XS<�Hz�/j�<E`e`}=��
+A4�
�8lmo`
+�v	�ĹT���{��l0%��
�׎�ɲu%���de��F�kH���u��W,��;����3�����"L�:�����~sc�~U����F�����L���w�MW��J|�P��a��(=�Ϋ>�F�
�Iy@�U&��2���Kwd���]�$a�/��@n�1��G4�]@F����sN8�;��=-����
+쟳}�h����tE\p�>p�u��:"!�H�`
(�
y�[�&�7Ț�������ڼ,���z��t��jzS�az#
‚�z���^��j��d��������:)�Q7J��
.ږ�m�2��,�⚎[F���,G;�R��d��QJ���jC�d�J�V9���H
Mˇ�m���
s+H}��&�^���Y��`Xt�n��A	 �l=��� ��������,N^����,�k�cq��dq���ܭgq����&g��w<��j���
�AH���Q
��i\fl�N3�'
 �na���x�R���(��'x/��j����ULv��3�<c�{b	�d��
��q���Rb���X2#�S͵x8q�=8qM������]]'�"Í�
Ovߡ��"
+�H�OEO�('�a�/Um�ڵ�z�ڐ2�|�s �I�3+�p�k�p4P�N�?�u�pt�
�jE���ݏ?�rrp�h7�M4�|W��~�H�|ς���f�t.�D��)��it�[E�.�
���)�"}�j�h64���m?�y�T��i
5oα��H�H��o��*mD7)�b�˭#�J!}9�MS�
��uDC�=T2y2�tH25����ڙ(9�ݼ�	�"X<?�g��Lx?�-~n
�}�-~���\��4��H�ѽ��-��3[ @)M��:���$-Q&)�� n��.G��;��.��� �/�$x�y�M�?�	2������H���ޏ`S	l�i7B���SP�x�!���0�hkإ
Qa��ɿbw�(LN7W�
� V�ɺ�AJQ��{��ǀ�`�G��0l���6�4‡!!�}܆u�'@��
��'c��
����*�۰a�����*�ĴR���`g�ƣē?�:{�q��<�ٛ�]���ƪB�6ⴈ}0H�
A�?!H�O��9�b/H=W��?�A���� �:E��5D
+������p�ֳ!��G�i)�Y8�
n�����>
^�����v6��L��/��t�o
�(�É���Ya�*��*G����E�X��հlLI�KU�o����Gc��'��e�\g�]Ql_\]��ߣ���d�����n�W}�8~M��y3�D���9�1������r�&�?%�[�e4��>�y@�?,	��endstream
+endobj
+3849 0 obj <<
+/Type /Page
+/Contents 3850 0 R
+/Resources 3848 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3836 0 R
+/Annots [ 3855 0 R ]
+>> endobj
+3855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3851 0 obj <<
+/D [3849 0 R /XYZ 90 757.9346 null]
+>> endobj
+3630 0 obj <<
+/D [3849 0 R /XYZ 438.9984 675.8614 null]
+>> endobj
+3852 0 obj <<
+/D [3849 0 R /XYZ 90 659.1343 null]
+>> endobj
+3631 0 obj <<
+/D [3849 0 R /XYZ 125.5542 448.5652 null]
+>> endobj
+3853 0 obj <<
+/D [3849 0 R /XYZ 90 431.8381 null]
+>> endobj
+3632 0 obj <<
+/D [3849 0 R /XYZ 438.9984 310.0075 null]
+>> endobj
+3854 0 obj <<
+/D [3849 0 R /XYZ 90 293.2804 null]
+>> endobj
+3848 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3859 0 obj <<
+/Length 2570      
+/Filter /FlateDecode
+>>
+stream
+xڽZko�8��_a`�Y��)vg��� �B���)
�V����I���RiQ�)iR˺����>)�	�d��D	�4�r�ڜ��-|��in����-���������rruSi�	J��j�iJ��9�O���.��r�nF�4O��u�\��\�����
�ƌD�<�ͩ�Ӌt���?�7qu/�V1h���)d����7Wk��$1H�>��Oְ���0b:�{���hM'�3N��H�>��wz��C��(�C	eK�*J��i��1}4�����1�#PnD�[Kx�R<���`Ό1&�E��f#�H7�Qƛm�,�J#N������
+�j��m�-7�T���L�)�~���̫[�s����(Df��O���`�i$��<Ok��"���G��|\��]�Y�%��Q3�SM��4�p���
�/,��]��b�5^/~�o�����"���2@|�5��S9}�P���i�~���\�P�(�!*KV�Z@�K�a)T0)������lW�d�*�ƍ�K=ƁEvl���J~��=
� Ϗ{�����


�����/S�yx�*Ң�x
\(d��>
+��>['���uR
(U��݀u2�
&�SI}�6���<��sH��r���)l^Ğ��<�fzL3��9ÚW>gu�~*b�pןr��
+&�DќW�\����W�
ekS�$�
�k#�&i�"#!�e0�*�e�(&��4�[b6m�����>����*

e�?Oy���,��l=Ė�
$��ڞ�H�<��$N��'>o�73(��cPb��j�1:�A
+*�0c�~�1�Q�1�v��cP����UJl $��:��b���`BNwe^�ͽef���v[��fY&yV��o�[IY_'Y����^�P�,��W���v*y�t��,��R�4�V�?�wpj2*~�?n�A
(�
��e�2mS����ˊ�d7
)ak�p
Y�|WwMAv�W5��Ґjc���!�|�4��ƫ�l]�n�q`	�;r*����\S�h��B̔`~,�����U��*\
�eр���M^l,��jMg]���M�__�3��dE��N㡍 �֑^���C�p
S�y�J�Z$���${5!��!��t�|R��8+[�
LZ����}5D5�q��4O��C�M������m��4~90/	E�G������9�,�=Um�Ttm
OQ�E'5f��.c�
��v���;W�]�C���<l�G��1���W8׵��N�;��Оθ	c�硉��p��Wž��+�V�~=�90��+��U����&�����EFֹ�"Mh���� q&��
�2
+c;����7̍ⶑ���+=?��HGg5�N�}���;Gr
U��ڃ�q]'���nk"����ty
i�-���Xn:�#����aqCi�C/�8�
X�BTT0�
+I�C�����@f��
`
+G�����l�>�|q~�!���������N���-�TG�����

=�2��Ԁ����9��h�-�f����}��k]�!
+
/�
+rB[ �(��h�
Yl

+�&��Y9]�iz(���
+�0/Nj̾���;X��Qӈ�v�3`�Gt�֝�
x�œ\���

���I� ������� �o����
Z:����
%�ɏ���5p^WE�� �7il:�.&��G$
+�F�pM������d������7>��øG
+	�#�T
nC��Y��z/$l��m
@�a��Rr{X���
L���I�n�81C�O�g�?�]�.��&�@]6���̸�6������.���fv͐z#��7���4
#�Ί�绖§�0:����N�w��|������|��h`�����Ə���G`���
@(�0�/>>�`��wCП0��\8�1�Wo�����.��ĂR���n����2�v8��6�����;
+�v��8�}w<��0'��F)b$�1>
�N�[�u[Y �=t'�ue+�G�۰��	�1��ژ1]��E����0��I���B"�Y䃀�~q4��H�!�� ��5>��+�U/.��g��"�:L���tPJ	�z��<�R�9ݎ�xJfk�$6+��y��15�W@�;a�ɍH�"!�S�[t<�	�IFc#��m-�O�mat.��ѝ��(۹-l��6��і�7~B����k`�T$yq�cH
B�T8�1
�d9�j>��n�

a����-
���b�ر�V?���:���j�9
�0Ms��|�M��x��'6
�-�O��0:�mt��v e;���]l{����)}���ޓ�Z���Va����h����z�m1/x4=�'?����Ķ�#.Ɉ38��A<���c�'
dm
��f�q��
iS�2��
+�hx6ðCD
+���5V�R�7��+m�_A�7�	����ҽ\h.����y�P_����τ�6���2�/S�
R���V�s�3̡޶��2��fs,�����2ՙ8�K��/�M�/����[O�/Tk�=�f�we�}y~~�V;�ϒm���|�M�{����*���uZ�
�~�aR01�����lr��=�̻��P�
ͯS�����cendstream
+endobj
+3858 0 obj <<
+/Type /Page
+/Contents 3859 0 R
+/Resources 3857 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3836 0 R
+/Annots [ 3862 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R 3868 0 R 3869 0 R 3870 0 R 3871 0 R 3872 0 R 3873 0 R 3874 0 R 3875 0 R 3876 0 R 3877 0 R ]
+>> endobj
+3856 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1C__Polyhedron__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 3878 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 742.00000000 150.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 3879 0 R
+>>/Font << /R9 3880 0 R>>
+>>
+/Length 3881 0 R
+/Filter /FlateDecode
+>>
+stream
+x���K�1
���9��4���
[U{i�}p[U#
+K��mE?}�!P����0�';����E[��U��F���z<W`�O�3��庻V�M$g5xku[�{eM�d)�]�
+�d5�ig�p�suq��;_���E��<�~��
�
�Fj�6hOh����kԛ�~�����
�����k�o�WW6�����7���n��x1�~�
d�Jv��9"��6
LrO��؜��b+aJ"3a��w2Zx�Fy.MgzG��b
�r�'�L"��9���'����'���FT^;Ii����=CYp&�
:��M狶?�.���|Q7�t�����,��>Z.r���)I���	El�e������%�Z����9���N�썃,� ��x�ExSY�@&ŕ�%�
7��O��Q4�{��D�
̦�|9?K8i�L�� EO^
�
B�
+�f4��!�e�Q6
�CXo�,�/�i�s�W6 ��4��t�|`pմ��vV
'MU7ϋe��{<�)$��H�c�����|��i����"zDNt
=��cz��x(M@�(z��Ɏ}��A`%rW,g3��F�G.���$���AǯN�q};�A�
+9���pCklpM
�
q��L���U��~���
�w!4�d�^����>���B�V�w���endstream
+endobj
+3878 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142738)
+/ModDate (D:20080908142738)
+>>
+endobj
+3879 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+3880 0 obj
+<<
+/BaseFont /ESHNRP#2BFreeSans
+/FontDescriptor 3882 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+3881 0 obj
+650
+endobj
+3882 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ESHNRP#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 3883 0 R
+>>
+endobj
+3883 0 obj
+<<
+/Length1 56840
+/Filter /FlateDecode
+/Length 3884 0 R
+>>
+stream
+x�����V���eB!=K !
X˒e�*��H(!�xw�������{���{���{�<Y:��|���G~xF��=sۜ{�eB�A���M�Θ5Q#�?o�>�o����of���}a��M
x����LWa�3���!����:�X��� �y�3&�=�J��o���{�v�V��
��J�����	b��{s����B{:�������/<��=_� ��J��)�Nh%�w���?/~񵿧���K���F��,
v�Yb���q�h�'(�F�^[�jA���*�z�s	�:Iĵ�)�#
�N뒫@g��	�%V#O��yt�p��Lj��g�W"6�;��HF�:��k:I�@�
�"�6�4��4t�X��
:K��.�9b��*q4�8�1�:�J����c��c�I�U�P�"�?���L?�&JD1@��k�h!4���O#6��D�nx�K�=G��=�����ڽ�O��R%z��"1� ҥ��B��ڢ��j�>�������Y���\9����
�jO��=����*�����=m����O�z����^��.z�5Y&��x�
z�''-wPb`׈$1��
�:&��JŪ[*w�[�Z[&!J�ӵ���x/�$ѤD"���w��قVh!�3=�B�:�MB���Y���=�/W�귌��_�S�&y!�ɖ�-�m��������k��/-^[t�h-�U�6-������ZC�x�~����]��^UϿ��LL'��2����g
+����w�+�ݻ��˼R��۳��-��|K�����Si��Z�œ]�\���h���ϷW[������L���\�e���BO{˴��|������¨z�s1��o���/�?�<уn
�=k�w5���ӈ�j�o�ĉ�-��U��u��v�ȉ]}�	����`��_��Oo�@J
lm�ؓ��a��c���Z�m]{��ў^8-^���P�
{���/hi+���X�2�����RZ�/{m�o)��
h�(uy�E�����O+y�#ピ�������C:��o��fͺ���~
��/�tS����/���_o����=�m�c��缚��Z�y>����+����ȑj���^�9�VA|~>��,y��$���M��?ER$�e�Kp
w�HH
_*^��ü<=�X�ˏ#�����(bbUb5bub
bMb-bm/���:�o��K�G�#�'6 6$6��x/��^�{�$A�^�Lzs;EX^�mBlJlFlNl�1�M8^��YoJO&�S=��k�m����u�v^����9^�K�@�H�D��qޮ�n�<bw��W������G�W{�z$�&qq�#�q
qq8��.�q.q%�
�3�+q!q
��ǃm^�
�5�S^#>N<I<�q�3ij�^
�D<O�@\�5���	ī���+^W|E|C
�uS��5��,�{ݲ��ae?�T�n\D|�͔�,؋؇؛����؏��[�
@|M|K�I�$G�@��D�C,!eR!U2F���0rr8I�+�+�#ȑ���(rrUr5rur
rM�w�r-rm��
M�C�!ǒ������
�
ɍȍ��ğ�k�r"�J�I�L�:i�I�$S�EN"7!7%>$>"7#7'� �$m�!�d�̒.9��BN%�"�&�'n ��ې����v�Lr9��C�E��e>!�'�;�;�;�;�����������
�F��
d��$��n���O. �"
d/Y$Kħ�gd�Y&+d��'����� �'��7��/��?y y q)yy0yy(yy8yy$yy4y
y,y
y<yy"yy2y
+y*yy:yy&yy6yy.y
y>yy!yy1y	y)yy9yy%yy5y
y-y
y=yy#yy3y
y+yy;yy'yy7yy/yy?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7������MR��)�b)��)�)��)�R�5�Z�N�H�D��FR+S��U�U�ըթ5�5�����j4�5�K�K�G��֧6�6�6�6��S��T+�4*A�A%)�JQ5�ڄڔڌڜڂڒ�)�JS*K��dj
+5�ڊښ�FmCM�fP�R�Q3�Y�lj�=5�ځڑډڙڅڕڍ�G�N�6����T'�EuS=�|jU ^'>�z�"U���=���e�;����{T��PU��ZH-�SԞ�^���>Ծ�~���ԁ�A���!ԡ�a���ԑ�Q���1Ա�q���	ԉ�I���)ԩ�i���ԙ�Y���9Թ�y���ԅ�E���%ԥ�e���ԕ�U���5Ե�u���
ԍ�M���-ԭ�m���
ԝ�]���=Խ�}���ԃ�C���#ԣ�c���ԓ�S���3Գ�s���
ԋ�K���+ԫ�k���ԛ�[���;Ի�{���ԇ�G���'ԧ�g���ԗ�Y�W���7Է�w���ԏ�O���/ԯ�o���ԟ�_���?��_/a�4E�4C�4G�@��D˴B�t�
F�@�W�W�G�#��Q�*��j�����Z��t
=�^�
C��ץף����������	�D������uڠ��I�h��DoBoJoFoNoAoI۴C��
��]z2=��JoEoMO�����3�m����,z6=�ޞ�K�@�H�D�L�B�J�Fϣw�st�Nw�y���
z>��.нt�.�}�
t���U��^H/����^���>��~�����A���!��a�����Q���1��q���	��I���)��i�����Y���9��y�����E���%��e�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_�`H�bh�aX�cxF`DFbdFaT&�
cV`�3+2+1#�����(ffUf5fuf
fMf-fm��ͬÌa�2�2�1���
�
�������f"����I0:c0I�dR��Lb6a6e6c6g�`�dl�a�L��2.3���Le�b�f�1�0ә̶�v�Lf3���l��ev`vdvbvfvavevc�1�39��ig:�<��t1�L3�Y��^�Ȕ�>f��T�*��,d1��fOf/foff_f?f� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�f	�/K�$K�4˰,˱<+�"+�2��*c��+���ٕ��Hvev�
+�*��:��&��6�Žf�aǰc�u���q�����F���xv;�me��&X�5�$k�)�b'���������[�[�6�i6�fY���Na��[�[���m���
v[v;v&;����a�g�;�;�;�;�����������
�ƶ�
l��d��n����.`
l/[dKl�[f+l��g����� �'��7��/��?{ { {{0{{({{8{{${{4{
{,{
{<{{"{{2{
+{*{{:{{&{{6{{.{
{>{{!{{1{	{){{9{{%{{5{
{-{
{={{#{{3{
{+{{;{{'{{7{{/{{?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����#8��8�c8��8�8��8�S8��qø��܊�J�n$�27�[�[�[�[�[�[�[�[�k�Fs�pc��ܺ�z�8n}nnCn#ncn<7��ȵrqN���\�3�gq��M�M�͸͹-�-9�s�4�Ნ�M�pS�����i�6�tn�-�
7������p�ss�
�
�����]�]�ݸy��\�k�ڹ.�ur]\7����p��+r%��ۃ+s���s
�E�bn�ۓۋۛۇۗۏ۟;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�����������������������������������������������������������������{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{��������������������������������������������������� [...]
+�p~E~%~?�_�ů¯ʯƯί��ɯůͷ��u�1�X~]~=~
�>��!��1?���O�[�8��	^�
>ɛ|���I�&���f�������;|���Y��'�S���V���4~~:?�ߖߎ����g�s��������N���.���n�<~w>Ƿ��|��;�.������
����������
+_�����"~1?������������������������������ϟ��ȟğ̟ŸʟƟΟ��ɟş͟ß˟ǟ�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_���������������������������������?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?Ͽ��ȿĿ̿¿ʿƿο��ɿſͿÿ˿ǿ�������������������������������������������/���(��8�A$AAb�0aa�����0B)�,�VVVV����Z���:�a�����0NX_�@�P�H�X/L&
+�B\Є��
��L!%X�$aaSa3asa
aK�
!-d���
+��)�Ta+aka���0]�!l+l'�f	��9���\aaGa'agaaWa7a����ڄv�C�
�B��-��BA��BI���B����I���
����-�#�B�@�A�0a�����xT������#�%��$���������NNNNNNNN��������........'���������nnnnnnnn��������







��������^^^^^^^^��������>>>>>>>>�����!N��#.�~~~~~!�~%� �~~��$.�"N�����q�H��H��Ȋ�ȋ�(��q
q2q�(����1q���8\\Q\I
!�WG���������k�k�k�k�-�hq
q�8V\W\O
'�/n n [...]
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_�PH�Rh�QX�SxEPDERdEQT%�
SVP�++*+)#�����(eeUe5eue
eMe-em�E����Q�*�*�)���
�
�������e�Ҫ�MI(�b(I�TR��LR6Q6U6S6W�P�Tl�Q�JF�*�2Y��LU�R�V�)�(ӕʶ�v�Le�2[��l��UvPvTvRvVvQvUvS�)�+9�MiW:��ҩt)�J�2_Y��^����>e��T��ү,T)��eOe/eoee_e?e� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�e��J��J��ʨ�ʩ�*��*�����S��+���Օ��Hueu�����������������ڢ�V�QǨc�u���q�����F���xu�:QmU㪦&T]5Ԥj�)�R'���������[�[���i5�fUW��NQ��[�[���m���
u[u;u�:K���Q�W�;�;�;�;����������՜ڦ��
j^�T��n�G��.P
j�ZTKj���ZV+jU�W����ꀺ�������������z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z������������������������������������������������������������������������ [...]
b�6�m
��k��cZ,�cF,3c����$�il���-b[��K�2�l̍M�M�M�
+}�Z R��Y���|��{s��R��������y.�
�.u���|.�r�������Y�/��u)�Q�����Ū�
�\�=W+�#��\��0�l ����
,(�|a��e��'��U�����"U��^���᢫�B�RWN���Li˕�nZ�)t�
_�SQ�
�djP����"�@RS��z��[�a�ԕ��Z�p�U�狅\������k�湂/�i�~��
nZ�@_0Ӽ�3
<_
��^�|������Š���ڻS�7`�l������|	��T��
uFw�+W��-���j�����Pb�YC�>��A
�@�
+���B�U׌�A��/��Ɠd��
<\
�av�#����tdБsP�~�eNP�~_�s�=�.�����i�W�?
ޏ�2�.�Eu��u������pO_H;
�=#�-��]��v�V�8$j�J@�d҄LAZ�6����@f!�@Z���o��\
�p-�Z���k��\
�����.��l���l���
l�6�m`����m��
l�v���c�b:��l��
`;�v�� ��l���}�h�4���K/
�4���K/
�4���K/���Q�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?kp��Y��
X��z�Y�g��z�Y��@w����
t�w��Z�]��$�E*og��lF���tziP�K�Z[!�dR�4 ��&d
+҂�!
�4d2
�^�?�8����?�8��2�>�W�/f�_T�.�,b�#
04`h���:j���:j���:j����5��@
�cuL����o��G|�3���
�g >q��@<�I/	<���^xI�%��^xI�%�
I�?	�$�L��3�g��	<x&�L��3�g��&�i��	|����_�Ki�/
����4����_�Ki�/
����4���,��4����_�Ki�/
����4���,�����
��a8L�i�
��!�k�����ebW9�0�M�6��)5Ϳ�h�D�Sg�!
�$�	�R�K�������lH2
���B1'�O�'	��I�$�|�@>I�E<iA?�8���G.I �$4�k�⭥��Ң�� �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I$Pn�&Pn�&Pn�"!%�hH	L�&l2af�j�X��
=�r��S�$��ם�U1W,U�|ON��Uz�5�o�UܟZ��������9u�Ҍ�|W�4��so�b},��Ws�䜗�����<f'��ᱳ�=���[���rގ���#Gm�OM�v���m=��������ѳs�<��������m+=�m)S�"��Z�E
��뫟��VD�A��癶Z�j�c;�j�GY̞���nV���
+c�U+�U
�t�T��Z��������W�U.����zu>��կ���]��Z�+�m>l�0�R}����Z)�5�+	+��@zk����鉷z�jF<ҴH��G�i�H3#-iV�%#4
l�5YB��
��J�G�ţҴ�أ��(b-�S��Ӣ8��d-*Y�JND%'��Qɉ�-F"�HD�#a$"
=��#
=��#
=�l=��#
=���;z"=���HFO$�'�(*3�Ōb1�X̨d3*ٌJ6��ͨ�TTr*�o*�HE�#a�"�T���0R�aX�aX�aX�a`5��m1XZ��f��_�Ec�5iz����43�R�f?��x��!
�|�ױ*ұ*ұ*�Sn4�' >
+#
;|
+$=,+$=l��9Ĉ������������������������]��]��]��]��]��]�n��<��u��u��u��u��u��u��u��u��u��u��u��ӱ�ӱ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ2Ա2Ա2Ա�ױ [...]
+	|
�:�u���G�:�u���ׁ�_�|
�:�76�5�76�76�76�76�76�6
�aOl`Ol��������J����������������������������H7	\�
�
�
�
�
�
�
,�
,�
�
�
�
�
,�
�
�
�
�
�
�
�
�
�
�
�
�
�
썍���T/.p����F��%"M�4#�R�fF�&#[2�Ew!nRKI�Q�=�GZA')F:��LjF�%#͌�T�E�fk��#M��Ռ0�Ì0�Ì0�#a�"�T���0RF*�HE�#a�"
�_����Cj�	H
ҀLB��)H
҆t Ӑ�5��7��7��7��7��7��7��7��7��7��7��7��7��7�!^2�&��|
��7��7��7��7��7��7��7��7��7�m7��M�x9�D�7��M�x9�D�7��M�x9�L�8�'r��
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qba�X'Ɖ�qba�X'Ɖ�qb���9�i�
d2���qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qc���1��c 
���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
��
+��
+�
+�
+����������5��5��5��5��5��5��5���s
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k�L�ڊ��sŎr�����/{��bea���<}aO%W��153[��՞���SS�kj��Y��ߜ��}�䫾ǂ
W������/��}Q��m��E{�0߿��_T�9����ÿ��S����t��Ep��7��6��-���?�ϲ�Y�oW��+�|v�Z��
�9���ʹ��҂\�\��SSD��BShꏴ�����r���"S)2��t�*�b5��N�����\y��G^*0���R�B���XXX!PkM�g�\����y�1��M��|�vg��w��Y�߯�,�ݯ��~�=]�՚C��������)_m�)�@����Z��E���X�h�/�����x��V���Ї�]�Z_F�׋e����c�l�
ޱ�;6x����
�b�Wl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x�����a�?l�
���6����
�a�/l�
���6��/���`�l��o#����6�<o#O���6�<m#?�ȳ6�<k#��ȳ6�<k#��ɰ
č<k#��ȳ6�<kc�dc�dc�dc�dc�dc�d��D{&�'��>�Ɖ���m��m|h�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l�c���)��S2�d6N�l���8%�q:f�t�Ʃ��S1�b6N�l���8�qf�4��i���0�a6N�l���8
�qf�4��)��S0�`6N�l�~�8��q�egC��p�d�����3&gL6Θl�1�8c�q�d�����3&gL򞃼� �9�{�|�`}� �9�s��� �9�o�|� �9�c�<� 9�G򎃼� �8�;������ �8�7�|� �8�7֡�u����$C;�G�p�7
�
y�A�p�7
�
y�A
p�
�y�A
p�
�'�濃���t���w0�
����<w0�
�k����u0
�S�9��楃y�`^:8�v0?
�O��橃��`~:��桃y�`
:��N�
�7���i����`�9�oN�
�
;8vp6��l��p��F���?i�O��F���?i�O��F���?i�O��F�������i��4�-�~K����4�-�|�F>N#�џi�g�8�|�F>N�����4�1�~L���Ki�4�Ry)���F^J#/�����K� /ų���'�dR�4 ��&d
+҂�!
�4d2
	�8����?�8����?�8����?�8����?|
��5�k�׀�_�|
��5�k�׀�_����O ?���O ?���O ?���O ?|
�:�u���ׁ�_�|
�:�u���ׁ�_�|��
��7�o � �|��
��7�o � ��$��O?	�$��O?	�$��O?	�$��O?	|�&�M��7�o��	|�&�M��7�o���rs�ĸE���w�����qQ�ϥ��~
+�)ী�~
+�)ী�B�-��B�-��B�-��B�-�[���o���rm�k�\��(�F�6ʵQ��rm�k�^vX>�e�^6�e�^�
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~ȫ.��8�c0�|+�]��@w��=��9]��
�v��.X�K�`i,킥�ְ<ҁLCf ��Am\��
�v��.X�K�`i�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,삅]����x�X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
Vu��\�u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X��� [...]
+x)ी�
X�k�`M��5]��
�tS!
�
�t��.X�k�`M��5]��
�t��.Xӵ��t-�[���o��]]��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.X���`U��U]��
Vu��.X���`U��U]��
Vu��.����`Sl�M]��
6u��.����`Sl�M]��
�t��.��{�`O��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]����
x�?��G������

8�����:�Ns�oE�4w���'�RgOW9ߑ�t��V�^N�{����?˕|\�@j�X�X�ur�X��:�����s�=E�G���R�I2	iB:b~q{!���V�%H
O�xB�x҂t��7F���|���`̸R��(4*�/��
�ҳ8�U�k�����(z��RtQ��)v%x����Ȯ�_R�W~�^�3^�3~ѕA�P-����W��\P?;z#&�d [...]
�
��C���
	,
X�RC�K
O�!�H^�U�{�
��v�R	n� �H�{��"���V�6�\ke�߰��s��'Z�%Z�ڞ�!O�$O�$OM�DS$�I4E�ڞ�	|�&�M��7�o��	|�&�M��7�o�t�\�\ZT���y_��|Y�5Sp����hm^�p�(��=�'��eol����P+L
+/���P����j�F~�^D��+���=/�T{r!��W
�ƹ�m�
x���
�����������7�J�׹�������kMO�J�+��SYЛ�v�h)}�R_�\�_`�
+l��U�K�RWO{���
�P�I�S�ֲ`{͓�
~c���~a�ɬX��Z��T��ޞB𝯦�^M
V��� !R~��Ʉ�����E,��}�R�G�|_�?֚�����B���0�z�}�ڿ��Ɛhm�j�P�Զ���:�
Lfy����`��k�x�!�C�IH2iAڐ�W`k}��,�[sH
:{/Oj����V��!n�
�:�G
q?�T�b�#P��ᾆ4���!X�h��@�4�,

 i�A�� D�!
 ��Uk
�Z{ҏ�
, �w�5�k��]k
�Zkx�ړ~F]� �/[kx�Z���^��𲵆��5�l��ek
/[kx�Z���^��d- ��gO�t(F<T4(	+�	-Z��s+=tN�B�H1C%�DJxK!�hX���G�a�z�
ƣ�%���FT��
�о�B�}A�()4r
+���:�����)4r�d�ShboWU謿�.N���]U��/T+��Z��?����,t�l
�:�B[@��
�<���t�;{<��h+-�x�
�3�P�6�)�7�������N�}ВZZ����u�%|^ ������ ��	��� mH2
���B��
�Ǔ�
��<	�0

q�C��
�%!���tĥ#.
q�KG\:�����
��7�o � �|��
��7�o � �|�I�'��~�I�'��~�I�'��~�I�'��~�&�M��7�o��	|�&�M��7�o��	|�)ী�~
+�)ী�~
+�)ী�~
+�)ী�~
+��-�[���o�\
����g��F�6���8m�i�<q�a���F�6���8
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~�.�]��w����
|�.�]��w���~pD��
�Y� ��
�n2X8y2�v Ӑ�,�Ȁ<:J�ڋ���������V�
Tg'������O@\���(�.y2��(�֧.^b����!C�,O=��
�YM�
+|&
�(����\� �IĐ@
	�~@F�@	���
���v��x���+T.^�r��'QK
�ꨝ��u��G?k
K����!RP7������)�T�W�U\�w����n������7����.���Gfo���J�
����#�⠿��t�k
�:��ZT���΁�=h�4wu�ŮA��As{U�ו2�e~})�z���z�SG���
�O랮��cP-�}��}u�m��:s�:0�����s��8*�A�:�Σ\�����a�����Ht�x_�ކ"��
�̽u�@���^Uȸ�t{Z�N�t��v�C�|�UO}�����>�w5���ᝎ��P��&�5C
}�G
m���߷.p��1U*�S	
�#5%zݿ��
=�`���d	Z�Z�=��{��^..��!R�E�rd,}�ZPJ��BP�7��0�bq0�����z0�5�
"�W�,B���]
ھ˫�e^0T}ՋA
�������Є��ka�ր�P��=WaҨ)h��`�����1���%y�������
x��P�C���4��֗r�
��p0wa0��L�F1|��� �zw���=-.�*�Y��#���"�����2U,�Ƀ	n!{q�[EG�� ����R�m�������Ӂ���ǎ`�Ƀj<��
gs1Tz1�1c�RF�P�ݰ��G�AJ�����͢��R
ۣ����
�bX�bP�H
�O2
MY�
����ty
+dd/d� Y�C��W�&��|� ޶(ʶy�zڱ���&���^��ް���: ��Q
�c����P+�	t�����ڢ��mH����

aa��PN�@
^b	d0"
�(
νB8
+�`���
�O7
}0��A�(�K
+��c� !Ԕ��T
�b��J!� ��T?�{:*hq9T1�C=
��<H��
K;��v�`}uD��F����IQ��J�����P	B	’U�9b�T��V�n�p�U–
Z��.�@���T�J��5
+�
Vw���e/d��
z�� �ٵ���
+i
�2m��0緅	�-L�mȬpL�ma~C��)�x84��6�h

�ų�ђ�f�K�)
�޶p<���`�a�C��sm
�j3]E���
+�(�
+75���U��U��5����
OU�oU�[j�tu1Uc��������":��h,?S��N~�곭R�x
Ұ��(���0���U��U�4m�O�5<�V�T[�
��z�u7<�[_dot+ֆD>X�޺8�-�`��XG�

���JC��eÆ�a�EY+��B�uJ���s*u�S	;'���t��ҕ�J�#��
���;�R�
�薿E��q�J�� �[x���ж�C
�PƊ
�(���1qLź[]��WŮz���[�
e̯�5�����+/	�ʟ��W/1�ݬm���)�V
+m����Ȇ[
E����5����jk��[1PQ��(ԗPi��7z�
.��冫�{r4��cik�m�R
v���m�HZB���vՄ8,f�h��S)�6v�����'*�Tk���4֞����r��2�.j]�Â	�o�����x�'.�N
�4�O�RaU�D�R���Dje�f3TR�YL�����V?� �Ĉ�������e"=���F���<�魡�ZS�[�6!׶�u�x��i0����
3�OX�����^1�k!f���R���
+�*k�F�
+�r
����n���7GM��ct΃qB_9_i�H�F�
p焅�j�H6)#nוz��2F]�3Tڐ
Fv�2�!#M-�cD㝸�EK5�8z�~�o�T]���ڥ�#�l
�d8��F4C��lfL53�
F �ƈ��^�#�f�l�qy����ڐ-�
ق��l$�D���
+nD�x&,'�Fc=Z���R��9����f�8͌�zDk�#Z���m�M��C�
+3�֤�D��M4k�D��h6��1�l7&a�l�59�Y{5�[�55�Y�5i�!Gk�<�8ߛ��ϔq���GrHsH��H��G<=�܌={�Cz�Cz
���#;��;�G���f��塵֣�.�V�/�h
���fs�I5�{ԇ��G5�� F��|
WK-f���7���ȵ��k�[w
f�x�����.���,�h�a�x�h��=T�PI��*�P�6Xj*��������p���MX�뻡ɢ%|.����k`�50�V�hX��&�̄r_w��k�0"]4��#�V��N$��a��0�db���
%�[����-��-l3D4CD3D4S�,{0G��&
_���V+��LԖ���,7�sI���1��،���[�4��r|���df鱜�v#
-�c�%}|ȍC8����c����Kcr_�G|����jpM,�u���ƥ�rbrۧ-c�y
9�!�F�o��7�C�MbȾ	��i2�4]"4N�z�m�siX/4�hX
��T�`Y�{��
M3~��������%�p��a�fa.o��#�
�a��tO����Ru.ci��Fi���3�(�֟�%�
	}�lܭ�+.���xF���a7Z
a�^r,6�
�	C��;&Q3��
���{�?�cp��ݍ�uG��p�cjm�x���M��l+�;]�t��d3��̘jf���͌�f�l��hfԛ���n��,x�Y���جFv��Mk�61:Z3c��;ͪ�4�8�Yݝfuw��K��y(npzNh�
�����ݝ�����
����Z�N�D�n��)����
�C���ͽY��q���{�?�/57�t�oUm�M�q�oU��cU3��=��ܝ�kU���BC�꾋�S�fF���n0�^j^օ`՝KE
ˎ+
>NvB_�ZY*S���э�MʂGf�
k
Q�C�u7�i��ݴ[�w3�����n֭m;9T�vr�dz�e/}3����rn:���Ͳ�-�S�Uՠ1��j�bɻl/u��'��Ƿw`��_3��I��e
F
rDz�R��Р��p�J�͘`9�ץغ
і�.�~l6�@tWs֫�P}��Y
��n��r���
�
�!=�!벜��!㰇 [...]
�g9�ka��_��Az"
*Z�$B��d���

ߝ��n\��w�2ïM��k=��D�6����0Z#D1�h�0Z#Ѹu��[�d3��̘jf���fF��1�̘if�63�M��ph0ƛ�f�D3���ج=�f�i7kO�Y{�͚�n�tv����5�ݬ��fM�4k:�Y+9�Z�i� N�q�5�ӬA���AC-os�Fco6�
��џ]������2ZM�8����<{<�vq#*z���
st�Hp|-j�<�5�FC�d|y�kC�t��u.eH�-��e�@��u{,|ei׿.h�Ռ��Z�&�x��
U<k�˱��V3����43f��͌n#N|�2j͌�fF���Y���RF���Y+i�_$-el� Z�њ5H�Y�$k�!l����f��ڬZ�5Bk�Fhm
+ԬeZ�U-ެj�f�o֭a�
_�k�a�h�L͒DS����4d���!Q��CG}/�A<A��GgGM���S����C��_�}"���5�<�[�x���1�J�_��W�?�.��B�Dۿ/���o�1��n��n2Ѳ�ʣƬ7n�1����F���j�Ujt
�
�^[�DrҤ-�
�
�>4��i���;p�/}ݙ\���?�,9"I���#��%gm:��-V��%�-y��Sn����'׼�Fx�;y�W{�q�bĨ�Y�JnF�6F3��1-�<Ha�
�
A������<������*
L���u�,��7Vrǐ�3w%�+�-�=e�1�
wK}����p{
�
S7���}i}�e�鳾��\u��7.��ʙ�ιp�wB-��	�ɰ����#G'ۨ�ޝ}�ϗ.��^���y|�
+1������^��h�
��E:��~��K6���!GU�A
s�V�/r;�T�����a�+7�,��c�g��'��`~��D���%(eܺc��fc�Gz�5�]y��#=��^+�K�L���:�G\2q�%�,y��c>'�Ƕ��P��
�q�-�6����Z��%7,����[����'��M
�B�4r��ο�z�S���޵��v�:g����o9��ߤ�v��E��KKNg�_��O9r����Wbɒ�N�5����l����8Bw��ڵ����4~ν7��W!@����4�0 o0��L_�#؊,��,R�������K6[�]��v��>�q��]���a�N��v;�m��:�l�;7A��ζcgv���7�=�������ޙ\���
1_*���
�L�`^�1g�0����i�x��6J
�˅��dLo�,��9co�����������FwR��=fy�Q�6N��^]��ՙ@1���aчż=��cR8?0$^"��F�Eƻ��WH��jK�!�g-X��x�P4X��~�D�!ģ�\,�^�k�᭵={A"��l}q���{fO�n��i�--���M�><LM
ι�zꘝ��
���kAc��FC	��n~���E��7��D���-A�G��#mq�gs�����Qڅ��>mm�:4u˲��2�2\����tL�Vm
F�Xtj�l9�L
R�,X�2�}����-��
�lO�������+�j�}�XinUasOaVM���hd�m�p�X��O)]3-������R{�sk
H- ��m�$v$�*HX�L� ^‹�
h��:��K���
+���.�����������
1J�W��27
���?
�

+��2���]����Xpr�9�����w��tO1h���
֢T�x$����DV�V#Y�UE����A��!�X|Ǿ�3l|�����4=��4��V�.��GNG)���=ِ:��xc�s�9�7�Z��.��%��^cx���
	�i��I�Pٹ���`��N��v��{�Y��l2Ɇ
��7!N��x�!������~�Jۗ�a���I/~{{����7A���~��J�L\�]��;���y���/���'y�ׯ����C/�C2{
�
N����
�j�_�z*B�UC����G��eω
+k���se�k�U�Jeju��^�&�
j��W)�W

/q�P7�&JK��]f��X\0����� ]�+�QM�.T�m�Z#�x��_+��Z뜦�hJ�d=�Ȇl�`��V/�5��}�O�c�;G���U/5_9Y��k�/ܸ?��{o`�����w�j��ċ��}m1��z�U�c��;�Q�
���6�,�
+�v�	�޲�H�o'�R)Vz�G_�6K�;����K�����ߎ
�H�\S�Oi�;�džR�P7��c�B$q�l�:��s��'���������߻�2�wO+E|�� =�wj at Kɢ>*
�i�l�}[R�>m�3Y>���;��-J�ҵ̔��?w����	Ɋ��Ч�g��Wy�M�}�uV�*[��'�5��S����g�tNLB�2d�<ђZ�rE�s]:ɺ��)ʏW�ցXv�3D
�KA�9"Dʤ����K��l����Y�Կw���hZم��O�v�s
xE�m|Z�����Y�/�u9�DǠ�;��5t��R�]��N�KD�x�	/���*�7�K8�.2j��4\��82 �yZV�Ö}�-+��W�E�����
XȨ羾�r$(I���h�o�O��S��O|��D
oEt���qQ�\�PDN��M
�[�䡠x Oy�˻xߋop��V�
��ZAQ��h�`�D?O��1|���g����?���
���
8p���
8p���
8p�����+د�0�X
��W���i�#ba� �#
5����6!Ö̬ld��E(������m7=��y�����N�G��g�i~
���{��yw(�s��3j�e�)�ߏM@�e�,�
k#�A��/�� �"T
�RT��#z��Ōv�p/���;�{��hv���< �u���Z�>�oĻ�*}��
��'Ɗ�����C�߇��5��Z�S���Ki@=�2��.�$�!灲����I�
���pط3��� 
��n�k�so�~�[j�'`������ܠe��}��/`�m�endstream
+endobj
+3884 0 obj
+21241
+endobj
+3862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.9298 444.7769 280.9422 455.6809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+3864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 266.947 173.4667 277.8509]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_4b841053fdf5718c17a018ff650b550a) >>
+>> endobj
+3865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.2823 266.947 242.9255 277.8509]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+3866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.0891 266.947 412.478 277.8509]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+3867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 228.2397 173.4667 239.1436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_33d58476db85f48e4ad680c69bca524f) >>
+>> endobj
+3868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [200.8038 228.2397 278.6309 239.1436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 189.5324 173.4667 200.4363]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_2b220dabc613a89a062968101429e58c) >>
+>> endobj
+3870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.2823 189.5324 255.1094 200.4363]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+3871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [276.6384 189.5324 336.5831 200.4363]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+3872 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 150.825 173.4667 161.729]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_c98ed1378829f72aee73c40dff16f269) >>
+>> endobj
+3873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [200.8038 150.825 276.9475 161.729]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+3874 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 112.1177 173.4667 123.0217]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_8a6c3f01edb04382620066f17b63b20c) >>
+>> endobj
+3875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.2823 112.1177 253.4259 123.0217]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+3876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.5129 112.1177 335.4576 123.0217]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+3877 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3860 0 obj <<
+/D [3858 0 R /XYZ 90 757.9346 null]
+>> endobj
+3652 0 obj <<
+/D [3858 0 R /XYZ 125.5542 723.0653 null]
+>> endobj
+3861 0 obj <<
+/D [3858 0 R /XYZ 90 706.4044 null]
+>> endobj
+512 0 obj <<
+/D [3858 0 R /XYZ 90 531.8159 null]
+>> endobj
+158 0 obj <<
+/D [3858 0 R /XYZ 90 524.9879 null]
+>> endobj
+3863 0 obj <<
+/D [3858 0 R /XYZ 90 285.8473 null]
+>> endobj
+3857 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F13 577 0 R /F74 482 0 R >>
+/XObject << /Im1 3856 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3892 0 obj <<
+/Length 3078      
+/Filter /FlateDecode
+>>
+stream
+x��\ko7��_�O^����@��E�m�M��ma���V�Jr����Ҥ8CN"k���3g�=�C�C�P&#
?dd�H	�
�r4[���

�ጴ�'p~^\�=�^��AFR9���#H�%tty�ۘ$/&c<~{A�x�]N��^P<^/
>T7���O���t�����������bB
�\Lw���w�mU��V�
+"S�٘z���g�]z�mS��2���?�����F�h1�`D��������8{�O�9Q_�U{z�8���-eK�}�
JF�D�i>�0[��)�m"����€�92� ��=��kO�
x@,e���E��V��	n�!KEW�gYN<��_A~I�Au����j�?LN1Acr���

_��ƭ˰^�m�mO�z���W˄��ʄ�A-<�DBK��1�����A�ޢ�t��F����D�X�����۞?	cԼi�%y}��AX����zq?_ܴ�vڎ��c�8~��6-#��)j���������P_���?��7�����.Z=���g��˜na�!�O1��X�
R4�3��O�FsT�iR���2N��v/�?�:lK�;�r8�
(πJ�(5,b`G�W�tD9+����Qm�w�삈��lQ]�^m�Ue
Ɠa*[�3`�  ���_.r"&%�
#ba���y������q5�B�WwO�dB#�5=��q�����dV�� ��Z�g��,d7L�2,C9���
+%��''T"��9��?�
��"�ki�y���4¨|
<���A'E
�.���	�i
eC���%I�Fޗ�Ee���|�p�,%q�@��ã
+<8�HSr�c����7�^M,h�"�l��j�f������ݿ__���E�ą�G�b#������i>v�j��q��jYÅk�D��Ϧ�V!��}sU,��2��i�\�2UA;�10�����<4���p�lC@�$�'7Z�P���H ق${XQ�ÀiOp�μ�7,MB���m�}�����
+��0%j
+����H�\u��M��.�;�z���]P1�ސƶk{�\�o��{���P2�p�
2��a�
'f�k8��pV3������"8�C���i�Z֟�牀Y^��
����A�$��XQRAaG��V;|��I\����Ɠx�zx��Uj�a�'Z�����*�&���i3:ίן:\�O
1�H
_(Rw�
S��k�@ރ#��`�� i�1
��8�C}��aMh{	t�^�v:�89��1�����sV�� `��:�v�\��T>����L�ʋ���\���\�37nn�~s���

��g�M#�a�>�

_��ƭܫ����*}:D��K�Qi�X�hq��$�i꦳m/�b��i�M؋�1ίo:]B�k���q?�%`�M�����G�y��'�9����a��Sx��YŋW퓬z@iz��k(�4�?}���%4��
Y9T�6�p��H�aa��Gπ%<��P�/�x��
���I�g�+�Q�3��a�22�

_��Ƶ4~��w��t�c
0P���V£R
+�u$�z�&vFd��#ʄ�YG�|���`�Zb�����B�ӸíC �8��ۣ
+<�uD<Nd

�'SGYG#g
���N�8��ٱ0�F��)����N�^ژ�ae#	
����
o�n��fX�›��^���)n̈�ؘ���Ƶ4~��oҷ/�))4ߣJy�}�A��A��U� �1f���K
��C���*h
��l-<����d�B�yt(�0�c���Q��0FF�<���ɶ�j�1�O�1�I��1��)
VԴ0�њV`�p�A��chZ!�Ӵ�:EM��д<�4n�
T�$(A�

U�/!���D���m.U0�(����%I���f'���|1<���	A
Ӷ�Ǘ���ϯ�QY�9qs�z)R�F�������d�0����~�_o/!��1�	�P�S*�Hp^Z�{XY����+W��W���0�ʰ
�+��+W��<I�̩�<H��|�/�O����M��B��:��A� R���Q��v����
�^�
1.��x|�F��X�� �|<�����]�] ���^#1�G�Q#�FfY]�� ��ղZ�������� ��=�Ͼ��x
o��s�^t��1����!�R�Iڇ��c�eHI�gLW7
q�}��ߪv� QH���
`斿�mco����|���W�@���uc"�ޤ~��IX�P{�Pi�(h���7
x���9\�n���X�[��7�߯�q��[H��
��ٶ?jo>��޸g�w`

��@#�[��(�
�[�
U``��J�\ĝ ��:��R
��a���z�e�m-�;��KW����
�d�����G����a�v?�c_�/�a9\|F�5s��:XY|��Nj�!;*:�7b��xi C�kW�@k�(14ے�G�*�)R؎�������҆ңFg#7:
��zU
[�Y�6��SvL��BS�V�A�̛�B^��¼��u���@]	�9g����;|�A�2��t��~��jf�W�۫��t�:!�B�|I<�@�r�!&%�aG΅
Z�/�H��@`��>�͖��
+�
(a�E��&L
�#8f��12����m��۔n�M���Ll�i���u����M��,
�l�w���1\��;���|�0�췸�>_�k�o7�M��n��wN?`�Aߞ`�Q7SF3A{�b ��f����B{��CZ��pC�绪#�}Co��t;]�RM�}�l�7�K��cN�e�&g�9
+E�)7oBH�K�7=�ha��9�:s��f�!�;�

+
�����dW����� {
q;#�ţ
+���[n7��7��
4�;���x|�F�h� ��ʗ��
+�gV��d�
�B�DG�c����,��~��t���I����{��}�D�DT�c�S(���N
e&Rȣ��F��zH��v���ߋ�x�D��m��p�l���������v�ܮ���B�q[֟��{� �U�ˆ���1]s��Ͷ��)o�8�}ձ��~U�~7�%XW�9������i/�W4�QEMN�چ��7ϟ=���#����j�٢���f�x�lz��!T����'J�D���A�i
���B�.�r�mo�|��=�0鏂tR�/�sUendstream
+endobj
+3891 0 obj <<
+/Type /Page
+/Contents 3892 0 R
+/Resources 3890 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3836 0 R
+/Annots [ 3894 0 R 3895 0 R 3896 0 R 3897 0 R 3898 0 R 3899 0 R 3900 0 R 3901 0 R 3902 0 R 3903 0 R 3904 0 R 3905 0 R 3906 0 R 3907 0 R 3908 0 R 3909 0 R 3910 0 R 3911 0 R 3912 0 R 3913 0 R 3914 0 R 3915 0 R 3916 0 R 3917 0 R 3919 0 R 3920 0 R 3921 0 R 3923 0 R 3924 0 R 3925 0 R 3927 0 R 3928 0 R 3929 0 R 3931 0 R 3932 0 R 3933 0 R ]
+>> endobj
+3894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 173.4667 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_e46f7a91b9fac1a62ef875ec5c72aab6) >>
+>> endobj
+3895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [200.8038 719.9123 285.2564 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.058 173.4667 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_c3126925bcd3349b150771d52c19639d) >>
+>> endobj
+3897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.2823 681.058 261.7349 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+3898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.2452 681.058 348.1899 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+3899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 642.2037 173.4667 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_9720487deabf813a31afd4e9cfe695aa) >>
+>> endobj
+3900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.0136 642.2037 298.9559 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+3901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.756 642.2037 419.2221 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 579.439 173.4667 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_68e25304a250a8c739927adfb90043d1) >>
+>> endobj
+3903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5472 579.439 235.1473 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+3904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.2659 579.439 283.9927 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+3905 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.9892 579.439 423.4553 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3906 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 516.6744 173.4667 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_e9a2b78be6811d666fb9d145078d796d) >>
+>> endobj
+3907 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.0908 516.6744 262.2512 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+3908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.7174 516.6744 423.1835 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 453.9098 173.4667 464.8137]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_6b286c9e001bf126a0ab85aac675786d) >>
+>> endobj
+3910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.9168 453.9098 282.1852 464.8137]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+3911 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.3044 453.9098 426.7705 464.8137]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3912 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 403.1003 173.4667 414.0042]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_c86d25d06285c9a2e890770fed084574) >>
+>> endobj
+3913 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [200.8038 403.1003 221.0577 414.0042]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+3914 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.3376 403.1003 325.8037 414.0042]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 364.246 173.4667 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_faae25a26dbecf9341c7fb2c2575f81f) >>
+>> endobj
+3916 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [200.8038 364.246 260.3602 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3917 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.9243 364.246 353.3903 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+3919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 325.3917 173.4667 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3920 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.2063 325.3917 225.0128 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_59d06e9b429faef7a632d58e4a0b12bd) >>
+>> endobj
+3921 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.35 325.3917 311.9063 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3923 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 286.5374 173.4667 297.4413]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3924 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.2063 286.5374 225.0128 297.4413]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_6f581bf46ab0488f444977453ba2ea2d) >>
+>> endobj
+3925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.35 286.5374 326.2923 297.4413]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+3927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 247.6831 181.2154 258.587]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_09726be54fe2a591787de59eeffdd2ea) >>
+>> endobj
+3928 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 208.8288 241.1122 219.7327]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_5eb7f86790ada6549123a0225d68a4de) >>
+>> endobj
+3929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.4494 208.8288 328.0057 219.7327]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 159.0156 255.4885 169.9195]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_6424da8931d774f6a2e403c1e2f0d09a) >>
+>> endobj
+3932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.8257 159.0156 342.382 169.9195]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3893 0 obj <<
+/D [3891 0 R /XYZ 90 757.9346 null]
+>> endobj
+3918 0 obj <<
+/D [3891 0 R /XYZ 90 344.485 null]
+>> endobj
+3922 0 obj <<
+/D [3891 0 R /XYZ 90 305.6307 null]
+>> endobj
+3926 0 obj <<
+/D [3891 0 R /XYZ 90 266.7764 null]
+>> endobj
+3930 0 obj <<
+/D [3891 0 R /XYZ 90 178.1089 null]
+>> endobj
+3890 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F37 1999 0 R /F11 416 0 R /F101 2079 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3945 0 obj <<
+/Length 2355      
+/Filter /FlateDecode
+>>
+stream
+xڵY�s���B�j&��  ~�=�I��\�N��r�$�fC�
+I��������䶓��3,�}�v"

��B��)���fw��0��+�W��������^�BJP��{�
A����~NAb�"����$ov���%�I]�<�m����X7y�rs�v��$YRW��8y[�m놟�k��h�Le�����ݏW��*�	b$������•~�ˆ��/��#�]�R��Gyu{�S���9�p�^���E� ��NwyQꭻ�;�n�b�pq��������i�X�����gS�mؿ�})N~_�h��W7��:�+d�ND"A��q5�4M�����3c��n�{�n��6i�d
��
��QNIf�y�4�z������U�|��� �"cIh
+�i�F����.��A��jx~���nuյN%�3�L{;9X���`���A��q��b���KХ����G����3��~4��UQ�l�vl����^QE���+p>Ź��v�CY!\
	�rB|r/R�e�BB��73��΅���#<�
����2.�N��'m�A��A�CQn������Opu3
�&m�7]���Ի�����r�͒͒$5�aR�0ꚼ �~kB$�g�Ծ�.&�TѺ��SS/)O���C��1Ȭ�]�F	�4����Z�5�F�#&3�m�vMa��J�v�ˢ{�Q���ފ
��u�B��$�-vE�7��'�\����M�Q^��M��ٙ
+F#S������᠅��'dC����@��~���όr��g��~�t������V#�9���x��AC �Y��{�m��2E���h�>&nI&
pKa<�=ѪO5��B3�ب
�fN�Pw�f���"�(9l���;�\,�$����o�'P
��8
+%j�(f�(K���n�^Sؼd���8P�;L��
Yf"&��)��o�~�
��w�@�< V���7��!�a�տ`L+�C����-�z�� M?&UXn�Vwnl%�u'� �#6�j"
��@�!+ 8X���jN��%��n&c��u3}�C��"��e�&�K�m.M�D�$�|��{�0����Z��Fo�6�:7�\tOndq�a�wy���^���2~	�w�Q��>`Ũc�R�gƎH��}$�kw1}]��1�;#��=�q���$$�����o�y6
�`a0��z������_
���e3j2;~pk�UD6_�Q%�t�/�R]*���O?S��ZT�p�$cB!*I6�dO�� SnF�
5ڦh�G/��⢹�n;_
��Poh)j��!9��nvz�\���)f,|��
+��c�O}���:���0�&����w�氃23����w\c�?uV��-"0���-@�$��^��NT�o�QSiu�ݯ|}�����R@�Y��S���y<ÂCu*�' �ර�B߿/�Q��5T��
+��ע��p�IA_+��~���O���n*QF�����@o%A
�����;	����/�M�}��R�� �ǥ�Q�H� �����
�☠����c2����
�lc9W1�{�
�$����P�8u
���|�;��tY49�Lm4�a� �0r4�ه=@f�,;s�H2:x�c�I��`
�`
�
+�D��h�A�b�j�:�V
c�
�L
����;AG�]�B�d�
��Q98�B�giv��@5=w�k�a,���[(o
+SAj�R�����_=yu9x�5��C�
��Pat��
ҍ�_�
��(��:���5���9����R�0} s������c�t���=iL�
�h;��H5bsR&C!�z
�1
T�SԆ6�	�z�p��o=)B�	]�@
#p�-v����$<��B8��Y(5��L%♳�����"�z�M�\k����Z�v�v�,�
JS�������c�D �ӏ|�K�K!�G�B���������3=ƒ$������1��T��l3We���+
0"��UA~�.�z��u_���1sM�^�����
�DZ;
��$b��"��Hӧ:��[�f�U]2'�ԜH2�����c��	�M:��׏T�S�0	.����h�
 ž�Lk�WT���T�
+�>�iT (��zs����X��
d1���?/��}�<
B3
+�a~�:��H5f��c���@���7��ט�����{�+�E��+��!�+h��l^� <\�_����5EfP����
=!~���5�n�g�7��'
��s��o��'^�ȫC�L�	)2�
�����ҿH�\|���'��Zjɭ�����
|†Uo��ٻ򄯹�S��o�����ѦE���
*�����
˕2**�9�"�D���S�%!e��<�
+{W�ʥ����}6�����Q����endstream
+endobj
+3944 0 obj <<
+/Type /Page
+/Contents 3945 0 R
+/Resources 3943 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3836 0 R
+/Annots [ 3948 0 R 3949 0 R 3953 0 R ]
+>> endobj
+3948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.4842 677.9388 242.0406 688.8427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+3949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [296.3257 532.9268 370.268 543.8308]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+3953 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3946 0 obj <<
+/D [3944 0 R /XYZ 90 757.9346 null]
+>> endobj
+3947 0 obj <<
+/D [3944 0 R /XYZ 90 733.028 null]
+>> endobj
+3950 0 obj <<
+/D [3944 0 R /XYZ 90 507.3976 null]
+>> endobj
+3885 0 obj <<
+/D [3944 0 R /XYZ 90 485.0859 null]
+>> endobj
+3951 0 obj <<
+/D [3944 0 R /XYZ 90 485.0859 null]
+>> endobj
+3886 0 obj <<
+/D [3944 0 R /XYZ 465.7073 305.1685 null]
+>> endobj
+3952 0 obj <<
+/D [3944 0 R /XYZ 90 288.4414 null]
+>> endobj
+3887 0 obj <<
+/D [3944 0 R /XYZ 90 124.3448 null]
+>> endobj
+3943 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F33 485 0 R /F10 488 0 R /F97 1774 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3956 0 obj <<
+/Length 1639      
+/Filter /FlateDecode
+>>
+stream
+x��Y[o�6~����&5Ëx��Z�E�
�Z�-Ufa��J�R��
��,J����y�D
�\���Xd���5�K.�f���������q�K�_v��f/�k���u�A���W��!H,�c
�Y
%�6�z��8�m��f]$Wd���8^^>
6DE�|��
G�6IY�˷��4{&O
��ʘE�Nj��׳��V�
+g�Ԗ~�����kp��
#����
FDk:��b���f�n�W�
��<0N�CBB‚�6$�"�=a9,�E�s�l��U�dyu��XVfk�~��t�Bˎy1��,��ں��2�

+Q���xR
̗1ňc
�C�s�l�5�1ݘ�W��P�h
i����a�=��c�1�N
+
"N��*P�(�B�|����#q�(!�J"A�y��!۬]U%��쿽��/�¤
�#p,�o�J��zwm��m�KԄ
+�zW�f\M�ߚ"��I�+�I�.����e��[ѓ�y�6G�@>��LF+�
-�R��Va��]
CQ[⮦���LQ^��L�d��00��
Z��I��魧z��Q:�~+5��c�u_k�c&I[ L�t�k��
k�c�7�U�W��n���RH���F��w�E�I
+�
9'T�I�o�}�0��"�d~2ir(��5�/���=��p�s�-܃_��:��69ڋO���V[�;'Q�Y}${5ݍ��:�1�"��<�OGl�~�X Q�b���
�Nh�6,��!c���
�F�
Hr�<�U�VY�l6G��
�#�&���2>����.wK��n�
���.�@&wEy=8WH����ѕ:�
\�į}�%5�
+Pn9ƔOd~`�x�[1[����,_�8�7�d뫤�9 �V�4<U�Ɉ�RCc�z��!���-vuj�|��C�=��]�����^�V�����ʌ�x/QpʝY����e�e���2�ц�X��[�4�)�ʚ�, (k��1b�Ch�'6@��7�'������diV���
B*����tD'�ƍ�H�k�����Q��rĵT�`ѕ:1 ��_E4��O����q�h�N��'\b2�|+5��#0Vq�Ӻ�:���p)���X�&��9�	�J�O Ӱ+�`�S>�����kž
�'#rB��1�h�E{&t��5����ֺ�n9"�;�`��WG�fɖ[�MZIO;����޵!�,�1$��d��nv%pA_c�D��-LC
�W���(c�fMk	����5;3%�9��Vq����)��<S2{�)�l���EY���r��R�q�r�0U_չ��O@���q�k���\�ޟ:�@�x�
+��Yu�L�Y��L�&d�'dٛ�u�&d�&d��OMNȐ���mbBn }0!+?!�pBo!?ĄL!�X��9=!wŦ�Nj�;!O���@���
��	&d"��������y� 
+���U�!�iL�D�V�g��6�4�g3Ιc�眩�m�k��q�!TDp�]�=�O=BA�u� Δ������j��n=S����ٛ�KS���<r����dc�kz�o�*�m/S�0T�d �A}gL?>TI/ o%����_�~r�}`�yžE�qy����۪�_^\��ݡ�D�<�(�.���E߮c�)�ۉ�-[��-A�c8�Bb�r�I�v�K(�aq��`1���7��)��}ۯendstream
+endobj
+3955 0 obj <<
+/Type /Page
+/Contents 3956 0 R
+/Resources 3954 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3962 0 R
+/Annots [ 3961 0 R ]
+>> endobj
+3961 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3957 0 obj <<
+/D [3955 0 R /XYZ 90 757.9346 null]
+>> endobj
+3958 0 obj <<
+/D [3955 0 R /XYZ 90 733.028 null]
+>> endobj
+3888 0 obj <<
+/D [3955 0 R /XYZ 90 546.5409 null]
+>> endobj
+3959 0 obj <<
+/D [3955 0 R /XYZ 90 531.9706 null]
+>> endobj
+3889 0 obj <<
+/D [3955 0 R /XYZ 90 355.9189 null]
+>> endobj
+3960 0 obj <<
+/D [3955 0 R /XYZ 90 341.3486 null]
+>> endobj
+3934 0 obj <<
+/D [3955 0 R /XYZ 90 137.4014 null]
+>> endobj
+3954 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3965 0 obj <<
+/Length 1982      
+/Filter /FlateDecode
+>>
+stream
+x��Ymo�6��_�Ow2pf�"Rd���b{��^�\�]��8B���&��7�HY�h%��@���G��p�y�2Yb�#K����b�X&�/w���1�k_�o6���_*���}7� �SB���$Vk�1>�⺈o?�(����n����쮎�����3�"2��՚r
��q��?��i7��I
+3�(d�|�y����f��,�3A���[|���[Xҷ
���|�7��X��ٛ|�q��a�~�{�N�KBB‚�!$����\
�"�O��*�V���*w�AG���Y��M�~�O:fW_�h�,l0��8'��ɮ�AΊCTT#�1��<0��DЧ�i�gI�~�����`��I�
��7�,ߚ=�M���f�69��ppͱ����}�?�� �C�Б��C�=+�:k�'��5�81�۬H�&�/X��dz�
:OX�&2Z
+F�x�͂�c�4�B3��c���I��H۴n���LQ�(�:0qd at O=q��E��Ӭ��r�S��}�PS�NN�)��5;l�3b�5�	cZf��lCO)�<űf��:�<r�>�=���+z�һ�!_���-�*f���2�KW4�$�8��
K�$�C�
�<�}W��ǚ`He�`{(���
�(
9��K*DLp�Z���dEx ���*�`0�����<k�Q�Y��I;�%��s`�5&��Yc�=���?��Ĭ�5
��&+y����
���
ր�־=f�u�Y��2�fY�v�$��t�U*#�"ٺ�d~Z%@z�
jPwi�F���J��뾪�G$t��i�C�
jˇE|�/���Z_��
B����y��'RD����h�K 
s��1�$дzƮMͺ	2�
�\�_�����wn��c��I�%q�-Aܯ(��M�6����23�Q��y4���z �~'����7>��J�
z�
7������P�~A�biŧ&!�Ν�D�n�b��OY{�� [...]
+��N'�I��j�?.(
����tm���
+�ݭv֤I;��pQ!�3L�+�uY!YĐ$�|�B�
�!��'~�`Ct
�j�	9��55�қn
�$���܆��`� Fۿ^��
�L<# c�\|,lZ��u� u�f�[�Ժ(.�Z��f��#��Z��4�f$ەH������G��54(�\�E�>!g$�g��o

�P�ޢ=����b!ޕ��_�t�=��BT���Z|�C-�բb�
+�H9U.�{eDrGq��TO�%:�T|1S\*K�/�
+��7�f��N铻�>����J{��"��zk��K�MA�^�o�_$$3�'����C� F��u�SV�1.�u
+H�9�ï���к�e�w���w$y6Q�� .�a��	c
�=0.���̝-
+�����Cs�5�
�[�E��i3��f�u��e�"
�
+�(N�_=��)peUd��wI��]"	~Y����
�+�uY�)��
N�e�90�<O��3��j�=�R�y$�c0����ί���"��A�M��p�Iw����SV���H8�REp����as���J���A�'���X�R	��;%�a���t�.�;01tǤo�>%��Ku��
:���YX��`{}���}�M뺪'�D��r>jꄻQ��Ja�:�y�+}|~���i �i���D�
��g#��#@��#V�Kp�;�=8��a�l{ӓ_��Zi���6
�*�P�O���{�)U��Q�l��0A�Z
�6����A�9�~��1\���ź����Wη��H�
��N8,�A�Ew}�ֶ}�������4i��灩����`�E�s�詀ه���*j���#���~L����h�C��D��yi��yZ���z�F_��hɓy���v}u�����
�l_������s�B-^���[��/N�C�aa��r_��BEe��Y	��}y����jfW�endstream
+endobj
+3964 0 obj <<
+/Type /Page
+/Contents 3965 0 R
+/Resources 3963 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3962 0 R
+/Annots [ 3971 0 R ]
+>> endobj
+3971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3966 0 obj <<
+/D [3964 0 R /XYZ 90 757.9346 null]
+>> endobj
+3967 0 obj <<
+/D [3964 0 R /XYZ 90 733.028 null]
+>> endobj
+3935 0 obj <<
+/D [3964 0 R /XYZ 90 620.0406 null]
+>> endobj
+3968 0 obj <<
+/D [3964 0 R /XYZ 90 605.4703 null]
+>> endobj
+3936 0 obj <<
+/D [3964 0 R /XYZ 90 459.0826 null]
+>> endobj
+3969 0 obj <<
+/D [3964 0 R /XYZ 90 444.5123 null]
+>> endobj
+3937 0 obj <<
+/D [3964 0 R /XYZ 90 327.7041 null]
+>> endobj
+3970 0 obj <<
+/D [3964 0 R /XYZ 90 313.1338 null]
+>> endobj
+3938 0 obj <<
+/D [3964 0 R /XYZ 90 99.2888 null]
+>> endobj
+3963 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3974 0 obj <<
+/Length 1846      
+/Filter /FlateDecode
+>>
+stream
+x��Y[o�6~����fû�`�$�Ю]��V����J,̖<Y^��C��%�V�6�P`�I�����H�
1��P�a(B����j���������M�����C���r8�)9H�%t8����8 ����Q������Q��_��<��L��(�?==o-��e�8���fS
�o�r-Ng1p�!g#"��������՚"�$F�?�>��
Lz1��i%�w0��hM����M�����5�j���� ��P���v	��`�"^��Q
N��ت8HfF���]E�b
������8�V�-D��G��H��G�Վ�g��@$A�0 !X�8xܠ� ���X�Y�n�q���]L���瑐#˜���
+�T> �Z�����|SQ�S@&����
&vTQ<���y��?&�����.g
Š�}�z�GW�(���{K�b��}��/o��_]�|����[?� 6��K���|���$��T�e�@$��E�����2�%Ň�<�q�&%�����g�d9��
�گ��6�\Kȶ�
ܴ��.���I T�U˨�o���,�t�Ia��l��fv8OVq�Ij
n�H�.��2������6V�u
ϒM�֣�i1[n�����8%&P��BUc��
�M�n�RàS���4�ZJ��}�S2J�
+t�����K
CS#L��J�%�������+����R$E��R'��n7�
m�U�צՙ�݋�.��a�a���_���d}sd��ђ.�8�T���ێƊ��O.���n�r�vM$�i�;oF�	-o3���j��
Gj
�f�$ZV���1��j)F���i�
8�p�A��ʮm7 at Yr=z=+��,����c2��3�I�{����3�����
^l�(��Qd�!%j�l&\�c�r��֮��2
��sy���A�9�+RQ�f��P��8Df_��n�e�ad�n�d�5��
�‘9d�a�aZ��$m�`v���rXA����B�ѧ��r=*�Z��-
��}��>$�<�B'a?�7�#9�1��c��'��:��q�&��c�%!&���T]�{@�wA��N�����Ąя�M�>:�#��_z��
�~doI�Z��~�k�C/'U�	�0'���dn�|��1C
+���[C�9 R
��J��p6x�~un�qJ�Q�J	��Il��Sj����>|
+(�����
��X��n��=>���yJ}��ؤ:
4
r�q�Ϯ�>z�dG��ɚ�ՒO��~@�N�%�J�C���-uҍ��"
Uܭ>ugl��y̑
�,��kd�H�#KK�׊,�1�EH�3=L��J��M���{P���#�
+0�m�(x�0�u>OR�˚���}PF'�Ί,
�;�7���q��KG� �}�R�K�W��:�+϶鬨��"��b��U�t:�I�r�@��
�$��s���t�].��2`�4����Ya���MF��4�ݣ}����u����Tig �PZ����@7������X�)@{Ɋ���
+��{h�IM-�>��vu�������Y���!�T���-.
+I�sg�g�x��eT�4q�v�
+]�G����J
nŒ��V:aP{�AFb��<.�9���L�(�P�w�<��@p��F`�DˍOL�4�
��u��!ϧI�AA潞a@��_�ղ�R+@�&M
��_%��&ui��Ժ��b����ɛM�kڞ5�U�n
����˰�C`݁@U
gX��C�A[���}�P�7�<��R���Ѝ~�[o;��j�0����(�������
�m�6M�9J���zy���i
+����&���r?�s�
�j�r���ȟ��lWe������Q�o-��Iendstream
+endobj
+3973 0 obj <<
+/Type /Page
+/Contents 3974 0 R
+/Resources 3972 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3962 0 R
+/Annots [ 3982 0 R ]
+>> endobj
+3982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3975 0 obj <<
+/D [3973 0 R /XYZ 90 757.9346 null]
+>> endobj
+3976 0 obj <<
+/D [3973 0 R /XYZ 90 733.028 null]
+>> endobj
+3939 0 obj <<
+/D [3973 0 R /XYZ 90 592.1452 null]
+>> endobj
+3977 0 obj <<
+/D [3973 0 R /XYZ 90 577.5749 null]
+>> endobj
+3940 0 obj <<
+/D [3973 0 R /XYZ 90 419.232 null]
+>> endobj
+3978 0 obj <<
+/D [3973 0 R /XYZ 90 404.6617 null]
+>> endobj
+3941 0 obj <<
+/D [3973 0 R /XYZ 90 270.2292 null]
+>> endobj
+3979 0 obj <<
+/D [3973 0 R /XYZ 90 255.6589 null]
+>> endobj
+3980 0 obj <<
+/D [3973 0 R /XYZ 90 176.2603 null]
+>> endobj
+3942 0 obj <<
+/D [3973 0 R /XYZ 90 153.9486 null]
+>> endobj
+3981 0 obj <<
+/D [3973 0 R /XYZ 90 153.9486 null]
+>> endobj
+3972 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3985 0 obj <<
+/Length 2704      
+/Filter /FlateDecode
+>>
+stream
+xڵ[mo���_a����
�_��@{w)p�k�{��!Pl%֖]پ4��
J�LJ2��X,`�Ù�Ùg�C&����%2���b}�'O���W��y��}���]]�J11�H*'w��I���NL	Aj6'����ӬZg�gO7���|Ye�+
��z����9_|�B�����C^�~������ �
+1&
 ���ЈF��J���~�ͩ�j���uD33���aJ*�v��v�޻���|�]e��y�)�DO�r�tJ��J����<�:\0I�?�s�˯x���p�3ZL^�
`�N�W�2�eu���?;=����u��4�	����Ii�0�
+�KD1|]bm�LM��H�kg|��E���rwӟ#�)F��W�@t�CFk��"L
�Z����(g
O�V��>����@�� ���:�qRC0��A��
>`͌��K��D������)b�p�7x�
<��Y�Ff�\���D
�V&+�#j�DZI�#J4�RS��j�yY�
w���\l��l_<�rd�O��R��f�0����Y�
���h
=n��C=����K/5M�_��2� ����j�vCs�l�j�\�O�#p"]�7#�&C�Iu��|��2X]�4?�׌R1�yE�[�Rv	 �2��ݮ��sGS��F�0���V~�8"\��xv��HcF\��߆��X���9��
a�jڣc�
�q
�
d)W
|ΐ��`H��l�3�$�u(�0
;��m�V�v�W��.!ثb���6o� 4�̓.J�6�
��͈ ͣ�u�}�:�b�F"�($)�5��AZ��|��A�(�Yo�|]@�\;?�1G��"R
�F!N�۬׈`��?

V�
?�u ՟o�.#Y*�F�4q4K}�H�vb�,�Z<fi®�����f��o�uϮ��zje>��|
+�@�E���A�@���RV��0Z�������wX�a
�N�����i�h�	%�0i�n"�%�M���QC< J�0�,�GS5c �Y����s���U�ȸ��*�r�JgՌ�i+���u'_���Զ��4��dn��b���lbpi�fT'�K&���o�kJ���"����>��j9
�]=G
���2�:0-m�����|u�R<�*���g3�N*e[	���ٶ)V�KSy���ꐷ[��E�8�îxj��5O�;?vQ�z:by�ĺ�^���6���(&�$�
Z�@5G+�Ч�C��?����s��4��5���=�����T���-����.i҉�~��W
�M�N�
�W yb�I�}��\���a'v�I(A�&*j��L[
lH\+`oh�;B��q�v��T�>���∗$�`[�0�F
:Wɵ>�bP���:���ꤒӣ)
��1�<{$�&�f��):
Wa���emT at u R�$�BCK�M*�X:=�Gc
��F�9�A�Gc�1A4��=c�X����S0z��
���qgtR	
S$�!�o^�	�N��%��#��N��������d
1f��IS	�$��N,���‘������Ǡ!��7��N�o��e'�ȹ���8�(���m{�~���m�[m�������M��.�)ʙ������pA�y3y�*rR�RQ��4EA
��G�*z�+<*���=��b�𨨏"<Uh
��ԫ/�F�-0b�<:<��(��>v�П9'��&�Jt���}�C�,ʧ���p%��נ�J�W�� "��,�h=�F )��
�:"�����9vX����٪���^͸����l�R


���tJ9����%�VP�9
��u�I%�0(SZCa��w"�G�4��<Yo��M�Ӆ�j������L�c�(��X���
+/mu�Z� ��%�ԫ/q]}	=��
w�I��=�
';*�%��t:G�|
+�@o��1�aP�N'��o#e�	�'�e�����<
1�sb_Jv��V��6��後�F���
�/	0�j
�	8�4	x
+/&�88G>�sH ��'�(�#	
���yS��,�����@EX��O��M� �k
_�y'���(ط'���$
�vf/~\���
8�wco�/� H`ؠ�~��(��tbI
+�^J	p�X��

+�!�( ����C=
+(�8�BU�
����S�z�m�=�����I�fl�wg��T�-�}�Kr�SI}'�n��-�EyO�����Ի�~"��:����y�)�8���\������R?� �yx�����[�S�� �{�"���O��}K��mdD��I%����;���d�C�k8�����K'�n�\����+��}��o�����	pbi�^L qp� |l�@�O QG<t� �T�)��q��48�΁�$@�`�X�O�T�>�`_*�OR��H)�EG��8��@�E
+��c�� ��U�$u
ऒ�੻���Z)�|���AA��o�
�Y灊���
��
����Z�� Rr6�N(n�A*�E`�D��K�	1~�A+�M|�_�4��5R�/w%2���ɣ"�
��6G�e������|m��7_��˫�τ��w8��C�r5 ps
��u�P�ʩ�^A3H[<�9χ5�AH������G�H��ވ林�<�k'���oo��_^^�b�e��P���nW׃7e6�)Ԃ���;����ܾ|Q�r�������T�]Yx��iy@��OiF���2�endstream
+endobj
+3984 0 obj <<
+/Type /Page
+/Contents 3985 0 R
+/Resources 3983 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3962 0 R
+/Annots [ 3989 0 R 3990 0 R 3991 0 R 3993 0 R 3995 0 R 3996 0 R 3998 0 R 3999 0 R 4000 0 R 4001 0 R 4003 0 R 4004 0 R 4006 0 R 4007 0 R 4009 0 R 4010 0 R 4012 0 R 4013 0 R 4015 0 R 4016 0 R 4018 0 R 4019 0 R 4020 0 R ]
+>> endobj
+3989 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 505.8166 150.493 516.3469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_33a5462cd5398fdbd61989d17aeeaa72) >>
+>> endobj
+3990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 466.6797 141.3669 477.5836]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+3991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.8651 466.6797 174.2929 477.5836]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b74908b692bc6f8112f5d27b96141431) >>
+>> endobj
+3993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 392.0551 199.4753 402.5855]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fcba1dd5e579752d6dcc40ef4d5799b8) >>
+>> endobj
+3995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 355.0018 199.4753 365.9057]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c0ef828e81a5c7625db3abadcafc8438) >>
+>> endobj
+3996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.8125 355.0018 301.1931 365.9057]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+3998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 306.3669 199.4753 317.2708]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f2441164b4c23a8203f399f561c9a7c7) >>
+>> endobj
+3999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.8125 306.3669 301.1931 317.2708]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [417.6912 306.3669 477.2474 317.2708]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.6725 292.8334 303.6396 302.7386]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 269.6871 199.4753 280.591]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4bed59d493c4fd91537602efb267c938) >>
+>> endobj
+4004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.7452 269.6871 320.3015 280.591]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 233.0074 199.4753 243.9113]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_80f6de87ec43c33fac3832b14a507c0b) >>
+>> endobj
+4007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.5247 233.0074 323.081 243.9113]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4009 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 196.3276 199.4753 207.2315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_298300b8f88eb674c317b99ad09a474b) >>
+>> endobj
+4010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.12 196.3276 313.6763 207.2315]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 159.6478 199.4753 170.5518]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2024878c4c26cb836d454e2e93f40c8f) >>
+>> endobj
+4013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.3131 159.6478 320.8694 170.5518]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 122.9681 199.4753 133.872]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4f3206ab2d3c47e2014e5b306167c7c0) >>
+>> endobj
+4016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.5172 122.9681 341.0735 133.872]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 86.2883 199.4753 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_cca11ef67e39b711f96604b6bf806feb) >>
+>> endobj
+4019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7078 86.2883 330.2641 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+3986 0 obj <<
+/D [3984 0 R /XYZ 90 757.9346 null]
+>> endobj
+1426 0 obj <<
+/D [3984 0 R /XYZ 90 643.4918 null]
+>> endobj
+162 0 obj <<
+/D [3984 0 R /XYZ 90 636.7505 null]
+>> endobj
+3987 0 obj <<
+/D [3984 0 R /XYZ 90 524.3713 null]
+>> endobj
+3988 0 obj <<
+/D [3984 0 R /XYZ 90 524.3713 null]
+>> endobj
+3992 0 obj <<
+/D [3984 0 R /XYZ 90 408.6173 null]
+>> endobj
+3994 0 obj <<
+/D [3984 0 R /XYZ 90 372.0571 null]
+>> endobj
+3997 0 obj <<
+/D [3984 0 R /XYZ 90 335.3773 null]
+>> endobj
+4002 0 obj <<
+/D [3984 0 R /XYZ 90 286.7424 null]
+>> endobj
+4005 0 obj <<
+/D [3984 0 R /XYZ 90 250.0626 null]
+>> endobj
+4008 0 obj <<
+/D [3984 0 R /XYZ 90 213.3829 null]
+>> endobj
+4011 0 obj <<
+/D [3984 0 R /XYZ 90 176.7031 null]
+>> endobj
+4014 0 obj <<
+/D [3984 0 R /XYZ 90 140.0234 null]
+>> endobj
+4017 0 obj <<
+/D [3984 0 R /XYZ 90 103.3436 null]
+>> endobj
+3983 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F23 2436 0 R /F74 482 0 R /F101 2079 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4024 0 obj <<
+/Length 2550      
+/Filter /FlateDecode
+>>
+stream
+xڽ\�nG}�W�)!�U��c��]/����(OI ���""�
+E��|�V���j^�E7iF�ᙪ35u�t�4G
8�'��q,(m��
>��q!��/��K
�����;k�+����*��H!�w?�`nt)8���#����t|�~$�p��r��-�7��|\�/o޼��n�����?�ӏ�b���W�@	�tL)�P���5�� 8�*�
q=rz��ѥ4��*���eOd�����������i
�z䰛>>���zˇ��~��na�F��1��߯sE��eE���?��wP�.8S������X��酖*}x����9�����Λ
+�)
E�T�y
��A	Ŭ�
��B(ä��IŸ5:7��5�zU#
E�Z2,��o��H�aw�\�g2�,'����d>[o��i3�Oן��������[�
	3�/�߼��yv7�}^o��ﺈe�R0��8!� �ǗB	�18��`�{��^\3ᔄzq�Hp>��H�S�1+�dX��/R�}�Wyq��/T"
�,>�_}��e<�*�
Vp�/ӂi�L;���
+%T���o��ǽ�7�썧���o���5��-Z�i���[�)�kw�F��~�����D)ɸv�.PFU�+�Q[
t7Y@������2
�mq
�p�
;����d�(�sg�ksP5��j(\���z&v�4��
������2��o
�·��a�'x��vԪ򥄞����� :���	�T���{
�
M�G1(�'�)u�Os��U��C��mM�0\������{�Y�4��|���L��I��Q��<��C�~���)�ҿ���mG��?0�����Q��q������U��	�hr �r�;�lNu�p�4���~8���dX�p�V
���a�#,�b�,�&�-��aU3pꝕ[��A�ט�ĭ��ጫ�JeT%�2Ʋܖ�k~`�e.췢���A�A���N�
u^	}���1����3$X�P�fg��%g�܎q�)v����
+�3�¹���	�Rp��AK*�M �k�v��L@ƻs�DdQ2��?@~�C��jQ�R4��1(H��4����3�&wmIA�  ���������7ᚵN2KRGĎQ�a�X����qm@�w��
�r��B�4�<�+���V��p��	C�V
R[c��Uu�N�ȦI?�A�;��ԍOl��5
�lP��kϙ��6�ϰ��q�V}W�����
+��"��$���
+��7��W��*��\r"n��������>
O�:Uɯ$�a�j���1�u�L� d�aM����
�X&�9�4_k͔��i~��
 l6 �\2 �� �b Il
����|��w�������s����LK�M�
$|��Nܪ
h�B��8Y����W�{9��.�83�4��q
���Q�+��� 3ƞ:��cNW�gX�P�f��%�܎q �)v ����
+m;��r �^�R#
���(��}�h"K�Q��J�ꤲe����X�m��q
�2����XS�Яi>����S��Q^����c� �j���j	(\�#��z&v�4�
�
��)��6.[�ӓx�^�3�_���AE�\��94� 2a��!&=�r`�Q�0�!U�
��+h$L(�W��8�\ۚ
��kA���-��<Xٳ���R.+��2��(�nބڛ��̔��
p�eZﺒ�r/
���X�[D��x��˗�n6����w���_�������z7���=y���I��޲*�q��5ƈW;%�V�P�ze��Y�$6n�Yl�r���A;�ז"�k4v⾮�ާ���Ȩ]�J�he
ZэZoo�I<\_.'��B{,���Qm
�bP
�`_�;O�<�FB�1O�z|��n��Lq���:�Ⱥ^fT��n�Ȥo������a��W@4����"=���PV������
+�
Vp;�c)��ci�c�
+��?Q�?O��Z;�M�O1p
B��4���;
!��t c%�:��L���p�&��
lM.	s;FS,��FE�����A+�ى��A���bPJH��)au�'S����
.B����nKdX](`�hrI��1
+ �b�$6
+(*����O��!0���^Ԧ�q
��3�d��x���3������XLy.*ݟa���[��B��܎�~�)�~�D���B[ݏV���o%3�7�|p
���d�:H���4`�yv�*0/Dm*�au���
+��%`n�(�`�@��(���A�Z
��o����Z8�*�aP���
D\]�emf�au]��ͺ��%]`n��`�uA��袨��o5^;I�
.�h����,/+8�$9���޹�S �ЖwH���a=̏Bqݷ,8���{$�7k�w�q��b�{���j�����
�?=u��G�
����
Ϟ�*��&�����S.4P友N��'l����n���c�QVi��o���?��~�K���}&
�N�x����㛫�/_���'�<�<.�dy���p��KGAH���w�A;\���x�q_p�4_��Yt�_a�tլ;}Mt��͏P:endstream
+endobj
+4023 0 obj <<
+/Type /Page
+/Contents 4024 0 R
+/Resources 4022 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3962 0 R
+/Annots [ 4027 0 R 4028 0 R 4030 0 R 4031 0 R 4033 0 R 4034 0 R 4036 0 R 4037 0 R 4039 0 R 4040 0 R 4042 0 R 4043 0 R 4045 0 R 4046 0 R 4048 0 R 4049 0 R 4051 0 R 4052 0 R 4054 0 R 4055 0 R 4057 0 R 4058 0 R 4059 0 R 4061 0 R 4063 0 R 4065 0 R 4067 0 R 4069 0 R 4071 0 R 4072 0 R ]
+>> endobj
+4027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 697.1447 199.4753 708.0486]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b4d4a0ebee3fcc93490aa029028a810b) >>
+>> endobj
+4028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.4873 697.1447 333.0436 708.0486]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 660.5759 199.4753 671.4799]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_1bdc1023fb4478270594d0e965eb90c9) >>
+>> endobj
+4031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0826 660.5759 323.6389 671.4799]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 624.0072 199.4753 634.9111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_461dbfcb8f68886137794e4a408fc55e) >>
+>> endobj
+4034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [271.2758 624.0072 330.8321 634.9111]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 587.4384 199.4753 598.3424]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_74b0a8cfdec7831e7a3e296b3e3751dd) >>
+>> endobj
+4037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [291.4799 587.4384 351.0362 598.3424]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 550.8697 199.4753 561.7736]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6957dba3dbf92459a364893d7ecfb897) >>
+>> endobj
+4040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.8102 550.8697 292.3665 561.7736]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 514.3009 199.4753 525.2049]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f47ee9cf59cfac8a346660698c61d113) >>
+>> endobj
+4043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [242.215 514.3009 301.7713 525.2049]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 477.7322 199.4753 488.6361]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_bf60cc7fa60d33c4fe958126d55cbac2) >>
+>> endobj
+4046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [262.4191 477.7322 321.9754 488.6361]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 441.1634 199.4753 452.0674]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_77a2c5c27e9c0838fea6e6447b20c320) >>
+>> endobj
+4049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4309 441.1634 347.9872 452.0674]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 404.5947 199.4753 415.4986]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_404beea19c04f4e7bbcfe81aae0d6a7d) >>
+>> endobj
+4052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [287.8729 404.5947 347.4292 415.4986]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 368.0259 199.4753 378.9299]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_3de2c410fab852f07f89df5be3d4c118) >>
+>> endobj
+4055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.7452 368.0259 320.3015 378.9299]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 319.502 199.4753 330.406]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_ed795d57d70d782ccf2a584cce183050) >>
+>> endobj
+4058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.8125 319.502 301.1931 330.406]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.6725 306.0241 303.6396 315.9293]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 282.9333 199.4753 293.8372]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a3de5a2fe7f06d0aa3e4972be2023933) >>
+>> endobj
+4063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 246.3645 199.4753 257.2685]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fcb46dd5c0701130f067f577f99ef27f) >>
+>> endobj
+4065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 209.7958 199.4753 220.6997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_24e90bb8bb38d248aca79c76a1717d9d) >>
+>> endobj
+4067 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 173.227 199.4753 184.131]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_55e9dfdf5da9a55b7523bda6b7f56c78) >>
+>> endobj
+4069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 136.6583 199.4753 147.5622]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_8abdf2e292960e1fb216ce3c2c0816ff) >>
+>> endobj
+4071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 100.0895 199.4753 110.9935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f9d7eaecf113e25020c55ed0bf79eb03) >>
+>> endobj
+4072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4025 0 obj <<
+/D [4023 0 R /XYZ 90 757.9346 null]
+>> endobj
+4026 0 obj <<
+/D [4023 0 R /XYZ 90 714.1722 null]
+>> endobj
+4029 0 obj <<
+/D [4023 0 R /XYZ 90 677.6035 null]
+>> endobj
+4032 0 obj <<
+/D [4023 0 R /XYZ 90 641.0347 null]
+>> endobj
+4035 0 obj <<
+/D [4023 0 R /XYZ 90 604.466 null]
+>> endobj
+4038 0 obj <<
+/D [4023 0 R /XYZ 90 567.8972 null]
+>> endobj
+4041 0 obj <<
+/D [4023 0 R /XYZ 90 531.3285 null]
+>> endobj
+4044 0 obj <<
+/D [4023 0 R /XYZ 90 494.7597 null]
+>> endobj
+4047 0 obj <<
+/D [4023 0 R /XYZ 90 458.191 null]
+>> endobj
+4050 0 obj <<
+/D [4023 0 R /XYZ 90 421.6222 null]
+>> endobj
+4053 0 obj <<
+/D [4023 0 R /XYZ 90 385.0535 null]
+>> endobj
+4056 0 obj <<
+/D [4023 0 R /XYZ 90 348.4847 null]
+>> endobj
+4060 0 obj <<
+/D [4023 0 R /XYZ 90 299.9608 null]
+>> endobj
+4062 0 obj <<
+/D [4023 0 R /XYZ 90 263.3921 null]
+>> endobj
+4064 0 obj <<
+/D [4023 0 R /XYZ 90 226.8233 null]
+>> endobj
+4066 0 obj <<
+/D [4023 0 R /XYZ 90 190.2546 null]
+>> endobj
+4068 0 obj <<
+/D [4023 0 R /XYZ 90 153.6858 null]
+>> endobj
+4070 0 obj <<
+/D [4023 0 R /XYZ 90 117.1171 null]
+>> endobj
+4022 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F52 345 0 R /F25 348 0 R /F37 1999 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4075 0 obj <<
+/Length 2300      
+/Filter /FlateDecode
+>>
+stream
+x�ś[s����)��H35��e��L��v&ig�<%W�ך�JZ���{@ J�dJ���ux����
\H��?20x��B�q9�o��3
��
q?��﷡��n�>H10�H*O�I���
&?
	AjtK0����â���#�����s9���O?UE������r��5*'����?��藇o�>4@�B�	����4&��e�;�����?�n��ꆧ����A�P�N�k���Y�^7~F���jVl�����	�=,c8D��C"�uz�χ6�.�Ib����O�����
F�h1x�/�:��p�����7߷~���31	A�e
i	��"
I�5|>� ���� ��A��
�(d	�Q�i�%���$
+I�yКـ�L�������~�
M�n�T��OCuT"lHV�3��
��H�ш���Vc�
^w
!,�v��~^��&����j�||�_ɡ�I�� |�����<a� H��G-Y����q〇�tה���i5bjX����b������f�\4Ǟ����V��.�a<)����9l��.&�����|9)GD
��`h�83��Hő� g��,�A�/q�,�v)�i-q�:L�A 1R��^>Rx�KB �y1�A�-��0�/()rx�<�����yBm� �P"��C �P���w~�
+=å��@�#ŀ7�$�uB�/\4�J_
�0�eo�!p���8B��
JC�"v DJ�p*B��b���G����H\�$���!9R��
�Y���a_62�Y��
6RJ6�"Z6�?c̖�I�#!0�o��\� pVod���.�b�����Mu�!_�ɥ�7˧z�w����T����	�a�'E�R=���d��4+O�t�!߲
�z�#��ެW��K�de�
1������H&�[�l����{F�3�����)�A��E��
G�}7쟞�\A�9c}2?���֬W�w.�
p)�Ԝ_����*�ښ�
�f -�3j;���Ґ���
Q����r�v0_��8����)'�k��H���z�P�\����� `a��� QJx o� p���8@��
 JC �"v D���s ��a���

}� �f}��l~����a��7�����
C����2M�0"�;ښe�
�##ΙE�� #�4 #-�#�P
���p��ix;�KhB0w;׮'���6f�&M�
+))t�B	�Z�^C�{wkmSM/�mĄD�7l����H6�����
*����'6�0�	u�1�@gd����\����W
Wg�C
��|i��B��\x�k�Hr�f)�Y��D�gS���-WeUl��b_&d��
NG���W1��^p�.`��F�XrR1�ם��G�֬.�.��Pеh��5s�e�n�e���V�u�x�zu'=5�7ϥ
'e5{m!]l�e5
7_��mY�9�
_��8UQ�r��[�l���z�\�.��f�D��4�n�{'q�����9
�VEU؞{y�2��$�#��hЎe&�('Aø
y�����1�zM&C)����� $
<��+��~��&eyib�B����)�H(��#�fyb�)b��zb�f�I�Qx$d#zO�qx�}NO��I�Pl��`�
Jk�A	���ދ�Y�|P\��=�H��͎����
*���Z��3Gc��d掭Y={\�;���?��
�+I��Ek���,Ak��?��sŌ8gi;c���P�BL�hW���NY��9KB���hZ�\�
����
��)����*׸�Ha���]
�7���[��c��s2:~OK&l����e4@�P�~�W�k
D��B�#Q�[�C�$\"��\�
(aR�^
o�&Z���Y�.��C���0�JN���?�_o�@��)�Ḗ���G�����l^W墘���C���-�����E�k��%T��4X��A
w
��1���
�'
+��:� Gj�䤈]AU$
+�i!
+r����
r�ڃ��n�-�a�'�c�+�i
�g�T,vy_C��;��co��
�,jCC�q��Wz�s�d.Ǹ�p�H
ެ�p�
�7�рﶺБ�8�8�l���ͥ��2X�)b���J%��2�/���ԃ_j��!��n�r�_(k���ʚ/?��꫑C���O��3�
��_��fo�9R�*�����M����QCE�r^`
���_�ӷ�����f���K�����٬��ݽ����m�U�����jv����K�u���7�h���1ERa
iy�{��eU��pp^�r褣 ��$O�endstream
+endobj
+4074 0 obj <<
+/Type /Page
+/Contents 4075 0 R
+/Resources 4073 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 3962 0 R
+/Annots [ 4078 0 R 4080 0 R 4082 0 R 4084 0 R 4086 0 R 4088 0 R 4090 0 R 4092 0 R 4094 0 R 4096 0 R 4098 0 R 4100 0 R 4102 0 R 4104 0 R 4105 0 R 4106 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R ]
+>> endobj
+4078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 708.075 199.4753 718.979]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fad3fbdebb1ba319083c56fa2ae679e6) >>
+>> endobj
+4080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 671.4492 199.4753 682.3531]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_79f64d099a652834da74cc8fd68f2452) >>
+>> endobj
+4082 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 634.8233 199.4753 645.7273]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_164f8732d5fe6b526a34e168145a95ad) >>
+>> endobj
+4084 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 598.1975 199.4753 609.1014]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_98dae78cdd16f7127a4b3e18c3976562) >>
+>> endobj
+4086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 561.5717 199.4753 572.4756]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f9daca45c3c1d0d1afd57ab47c6cacd4) >>
+>> endobj
+4088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 524.9458 199.4753 535.8497]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f0647cd431d30a9658d4bdc77e32d9e4) >>
+>> endobj
+4090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 488.32 199.4753 499.2239]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b19be1f26efb21370e8460b325a7f57c) >>
+>> endobj
+4092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 451.6941 199.4753 462.5981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_65b1cc4ac0c0c8a2efcbf3d36d4ac0ac) >>
+>> endobj
+4094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 415.0683 199.4753 425.9722]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6afe848ad84ff68d48142caf0599760a) >>
+>> endobj
+4096 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 378.4424 199.4753 389.3464]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_91459c49e4f7d7fc2dea0347e0489ce5) >>
+>> endobj
+4098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 305.6761 168.8603 316.58]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_00f887bfb5c61faba29a67def563c786) >>
+>> endobj
+4100 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9141 269.4238 187.0022 279.9541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_268aa30d717cdc7d07e60cf7c56712e6) >>
+>> endobj
+4102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.4356 232.798 210.5237 243.3283]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_627ac77a4752fde3c10792ee9f1673a4) >>
+>> endobj
+4104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 159.658 199.4753 170.5619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 159.658 251.0215 170.5619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b45faf2ccad8057c7b27e0c999eb063b) >>
+>> endobj
+4106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.3587 159.658 352.7393 170.5619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 111.077 199.4753 121.9809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 111.077 251.0215 121.9809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_074982242d6e2389d8f0bfc99eb1f88a) >>
+>> endobj
+4110 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.3587 111.077 352.7393 121.9809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4076 0 obj <<
+/D [4074 0 R /XYZ 90 757.9346 null]
+>> endobj
+4077 0 obj <<
+/D [4074 0 R /XYZ 90 725.1169 null]
+>> endobj
+4079 0 obj <<
+/D [4074 0 R /XYZ 90 688.491 null]
+>> endobj
+4081 0 obj <<
+/D [4074 0 R /XYZ 90 651.8652 null]
+>> endobj
+4083 0 obj <<
+/D [4074 0 R /XYZ 90 615.2393 null]
+>> endobj
+4085 0 obj <<
+/D [4074 0 R /XYZ 90 578.6135 null]
+>> endobj
+4087 0 obj <<
+/D [4074 0 R /XYZ 90 541.9876 null]
+>> endobj
+4089 0 obj <<
+/D [4074 0 R /XYZ 90 505.3618 null]
+>> endobj
+4091 0 obj <<
+/D [4074 0 R /XYZ 90 468.7359 null]
+>> endobj
+4093 0 obj <<
+/D [4074 0 R /XYZ 90 432.1101 null]
+>> endobj
+4095 0 obj <<
+/D [4074 0 R /XYZ 90 395.4842 null]
+>> endobj
+4097 0 obj <<
+/D [4074 0 R /XYZ 90 322.5984 null]
+>> endobj
+4099 0 obj <<
+/D [4074 0 R /XYZ 90 286.092 null]
+>> endobj
+4101 0 obj <<
+/D [4074 0 R /XYZ 90 249.4662 null]
+>> endobj
+4103 0 obj <<
+/D [4074 0 R /XYZ 90 174.6774 null]
+>> endobj
+4107 0 obj <<
+/D [4074 0 R /XYZ 90 140.074 null]
+>> endobj
+4073 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F37 1999 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4114 0 obj <<
+/Length 2744      
+/Filter /FlateDecode
+>>
+stream
+x��\ks[���_�/u�i���iӸ��I�X��d4�Dǜ��JQ���wq�
�. at QLe�
�P������!M6��

e�R�.�'t�3���'l����ƀ������j��\���54#�3>:��a�1�)���_O
�V����	�㛫����������������/��/~����w�˷��䧳oN_19��!�B��7����
'������/&S�<�����Dzp�9n�/�s��W����ݳ������j��o~���
�gv<���_1���iꍞ|u"�
���x��䇟����	%�Y5�?P ��hy"�h�:ys��`g�D�}��˵
M�$V���P�JŒ��\��
{�x
f��܎̇�G�Uwy�3¨3��`�E����f(k�rM�c��u�f����pR��:=)�EM��
� �����r���V7�
�
+��b,>$邷��3F�q�Ϭ~�B�OV��Oc|O��V��כ-	g�4�n�[T��
���Y��:��,��!���̮ws;_��7�?e4`�(W_{@��+N���8��*zqs}��NL���<���A
�FD�5�-�L-��ǽ{%ᖻ�4���5rd���́�pL��;W��_��?_/��[�>x��>��ؘ
S��@��)�6�!rR�B��(�)� +�� Rx���'q{��s��7)�7=�$�b
�Z�aq�����P{֠��`
�I����A�!�ՠ���n\���S���,,>�Jޕ%L���wE���J81�V�ŗhdv�N��9�
�#�r鰖YKS�f�ʹċ�P��KGB�z��KG�p����
+
k
+���fų��A�
+�o�Hˎ�|��E�{��\�)
e�DK��F���ۧBӌ
$�`W#
+Hy�=�TG�w�jmmD�
�F�u���H�����
��3R
���
,C[��f(��S��)�
\�U�

�b���A��o>�%n��7�Nt��A�ռ	�Sjs���z��j~���~iΖ�y&A��T6A4��	�r���
z�1���}w��l��p5��O���_���e�����)�n����S��d֐�O�۠�v+5'�5Z"�e���U�^����=����
8��
�݅�/�Bn���H�
Sh����Z]���%���ZP��Z��=6��c7}Fݟ�6�^Vk81~x8(�=2C��ɲâ[[Tɹ�]A���c�
��
8{�~�@�d�=i�TR����j�����fX�IF�&�㷧I�n����\h��V3b<��-j�Y=e38��$´��
�+C���
�3�qI��L{�vA�@@���^�D��W�<��h�%��ZEÿ��
���Yt���O@�PTa�A�Flk-��zs�v�����	����ܱ[���G��ZT�!D��6pf[TLl�r�Ќ�%� ˘�p�L<V�J�w��
�[��N���2�
����ϋ�$o�6�t
�#��rp�G�9`򁃯K:G��362��p}~�.q��9 g qX��� �9� �#e7�sd��u��ӳ�9*wa�s໐��S�@��9���>w�Cr(vV��A!�#�B�*�JG�r!;L���E�4�G�
+uH��� �#��5�v��)�#�
�0Y�c
+k!��O��w� +v�� �1���
3q��Ea�ΣU���S3����S6�c<N"��	��A�2�I��>��ԧf�x��O#�t[G�詶�]�-ǽouR
+��0�J+Pp4�� ���ݤ6�-�D#�[+�hb�x0*g�M��>�DhN��4�M%��4� 󴾽�Z/n�
���(?�]C����k�)7��ԡR	Ʃ����>v�`\]�}�Jkp��՝����xM-���t0\Q-E��B�;>�U��B�u�*�
,�[�ҙ5�肊�Gఘ�-��ՑAl<���3
�nC�
+w�h������`	*)�AA%��/�$����R�
;A߅�
+�����=���
*�R?�V
*1~x���wX�
�w��L�٢J
0ܿq�.ూ
׆p#dbH�
��o�
�-���1\Jb�-�1V춱A����ͻm��ً1\�]��j1&�#iݢ��+�l�
8�pcHX
_*C��7�gv��v�3�sb������]���d�
��	�0��ŗhdv�?}�Wx0*g�}�$��	)�9(�� !%��5��i�m�aq9�V@!U�:z'`��"��M'�b'�

*��ma	�=J%�4*�8�P*å2uZQ*
�3���]��T���2=
�QK��AjIl�� {����F�j�����
�r�F���o>�%n��XžL,a��A�bI�D,	��Ē�ݠX�q�KN�J,�܅�X��BnwO���N,��[�������bI�GF��wI��;���;e�	
[Tɹ��i�y���*
�'���i��
�Q��'o���_�c���(#���`�>��d�ߞ>�}�2������|����؂�
�*�s;� ��1�᩽n�
�ݵ�������I_v \k
+-�e#�$��v�-���k�R� �T2��!�2
+i���z����#�#��Ak�}I\��}0���7������D����{�|�_-g��������������~?Qj��j�og�����c 7���nq�m'@�ޮ�����	T~:~3���Q�'�$J�g����������/,4ђ3�~����ۗ��?~$w��zq�"������i6���aPCvo@�$���wȨM���.�jy��n��~�����u�{��?Æ��endstream
+endobj
+4113 0 obj <<
+/Type /Page
+/Contents 4114 0 R
+/Resources 4112 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4168 0 R
+/Annots [ 4117 0 R 4118 0 R 4120 0 R 4121 0 R 4122 0 R 4124 0 R 4125 0 R 4127 0 R 4128 0 R 4129 0 R 4131 0 R 4132 0 R 4133 0 R 4135 0 R 4136 0 R 4138 0 R 4139 0 R 4140 0 R 4142 0 R 4143 0 R 4144 0 R 4146 0 R 4147 0 R 4149 0 R 4150 0 R 4151 0 R 4153 0 R 4154 0 R 4155 0 R 4157 0 R 4158 0 R 4160 0 R 4161 0 R 4162 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R ]
+>> endobj
+4117 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 707.9571 199.4753 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4118 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 707.9571 251.0215 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_80993a2a72759ec030dd3cde21c8a00d) >>
+>> endobj
+4120 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 660.1364 199.4753 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 660.1364 256.6403 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_08ceb442794b5f60c1ad09ce744371e1) >>
+>> endobj
+4122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [283.9775 660.1364 358.3581 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 624.2709 199.4753 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 624.2709 256.6403 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_8772f767006f16e376d8eca9b1578b73) >>
+>> endobj
+4127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.4134 576.4502 269.9743 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.3309 576.4502 415.7115 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 564.4951 171.5201 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_59638854527a5bebee3676750668c63a) >>
+>> endobj
+4131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 516.6744 199.4753 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 516.6744 254.1398 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2857ee1039a41cfab001c0ba21c69ac3) >>
+>> endobj
+4133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.477 516.6744 355.8576 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 480.8089 199.4753 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 480.8089 254.1398 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_02949da26a3761489d2fb98018010990) >>
+>> endobj
+4138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.4134 432.9882 269.9743 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.3309 432.9882 415.7115 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 421.033 169.0196 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9c4298d04019ab7b5233ddceb430be03) >>
+>> endobj
+4142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 373.2124 199.4753 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 373.2124 256.0028 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_761744f24a8e2faed19912950cf13baf) >>
+>> endobj
+4144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [283.34 373.2124 357.7206 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4146 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 337.3469 199.4753 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 337.3469 256.0028 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_7ce6dfd81e04c3eb8d196bf13a96ebe6) >>
+>> endobj
+4149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.4134 289.5262 269.9743 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.3309 289.5262 415.7115 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 277.571 170.8826 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c95c1fbaee07d3a9cead4d07683f6168) >>
+>> endobj
+4153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 229.7504 199.4753 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 229.7504 253.791 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_72ef8379745ed9575b39216ba1e51d18) >>
+>> endobj
+4155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.1282 229.7504 355.5088 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 193.8849 199.4753 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 193.8849 253.791 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6a2d561ac8088ed64a0bb51d8fffcd9b) >>
+>> endobj
+4160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.4134 146.0642 269.9743 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.3309 146.0642 415.7115 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 134.109 168.6708 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fc3433d8ec297e2d1fbdf559d93f9080) >>
+>> endobj
+4164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 86.2883 199.4753 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 86.2883 259.3203 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_7e90d52413515d81ad9b68fb1740d869) >>
+>> endobj
+4166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [286.6575 86.2883 361.0381 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4115 0 obj <<
+/D [4113 0 R /XYZ 90 757.9346 null]
+>> endobj
+4116 0 obj <<
+/D [4113 0 R /XYZ 90 733.028 null]
+>> endobj
+4119 0 obj <<
+/D [4113 0 R /XYZ 90 688.9433 null]
+>> endobj
+4123 0 obj <<
+/D [4113 0 R /XYZ 90 641.1226 null]
+>> endobj
+4126 0 obj <<
+/D [4113 0 R /XYZ 90 605.2571 null]
+>> endobj
+4130 0 obj <<
+/D [4113 0 R /XYZ 90 545.4813 null]
+>> endobj
+4134 0 obj <<
+/D [4113 0 R /XYZ 90 497.6606 null]
+>> endobj
+4137 0 obj <<
+/D [4113 0 R /XYZ 90 461.7951 null]
+>> endobj
+4141 0 obj <<
+/D [4113 0 R /XYZ 90 402.0193 null]
+>> endobj
+4145 0 obj <<
+/D [4113 0 R /XYZ 90 354.1986 null]
+>> endobj
+4148 0 obj <<
+/D [4113 0 R /XYZ 90 318.3331 null]
+>> endobj
+4152 0 obj <<
+/D [4113 0 R /XYZ 90 258.5573 null]
+>> endobj
+4156 0 obj <<
+/D [4113 0 R /XYZ 90 210.7366 null]
+>> endobj
+4159 0 obj <<
+/D [4113 0 R /XYZ 90 174.8711 null]
+>> endobj
+4163 0 obj <<
+/D [4113 0 R /XYZ 90 115.0952 null]
+>> endobj
+4112 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4171 0 obj <<
+/Length 3283      
+/Filter /FlateDecode
+>>
+stream
+x��\�r7}�W�e�d%�p��v�a�x+ٍ��ڧ8Ţ%�bE���,��1���V�eW*e�<�}�}��
`��


(��a\.gx�
����
��c�ϋ��R

2����ueA$(����_�� 5���Ո��t��N^�(
�nnfW���?�w������onf��Y��j��n�n��z���
B<�*Ę0@����
p Qfx��)>�z4��R�
�/��A�PU����on���������l����f�o^Ϯ�>�����"D�!��=���E��`��x�~�˯xp���
#f����:X�qʚ?n�ޜ�����H������GZ��	aHr��s�aQM���
a)� �4�H�*F
�$9
8X��b}��f3b
+�5�/� F�W��U�a���_�?��6�b8ݭ�_B��
>B	����"�v�y1'H�����c��bN
��a|����($)��'��R�b^��
��rd4a
q���}��k�
�R$W�n�
����KF�AH�/��?o��Y�)�l����3_rٵ��@���/�x�兓w��w��&�u�o�����v�hI�ϳ��tx�%b���B�md
+����B�J ��B��!Δ(��
�7�mPI��P&~�nwMg�:S

�!�Z��0�(�Р�{��a=[Nu�^lV��My��}0��XsB��c-���-��ng��ӽ�
�yA���*�� n��k�c��D#��������n>�b��������H$T�ҤŮ-
*�N`"ka��f��A;d+4ǐV�g���⺙�<������n�u�<� c��͂�����y8�H��)w�*�=��/�n��`�h�v�$�h�E&��g	B�M[ѱ$�"U'��}�>�{��P��	*
-����.6��s(di���:gU!��'kT����g#�<��<a�Ki
q^rK`d��AC��i�tP�:,{�D 0Bki,}}���U����_,-f�]+�΢�~�G�6���.a΢�(L|Xf�`�I@�ﱳ��p;b6������I��|��{6:�1�/�������W�l
�����;T�;��	㭓���!(�AN�FF|
�{�����Z%=������⎤'��u�4���üT�
�\����K3O�)M��1��a
+	5X���,P=��5SA�N���
DZC��s���r
d*h��勈��I�X��\	ը��Fje�;��`�+�ȓ�7i�u�t	9X��|���P�\

�
QB9�^w˓p����n��
ݭ�>��צ]ɆdɸBa"��ȇ��J
�ZI*��P�q\A)���מ�Ly6(��]�N�N��c��
P�ι
���l`���
�\�yrMu�܎��
ӣ\�ꡆ}��"b0���3
;T�̙8S-}�
\��UՉ����UR
:݉�%A�:���D�f#��b]�ez=�ˤ�u㋻��n�Zn�(�* b�������|w3�5�f������\�?.f��>_7�P*�@��EU�����D�a�,��B֩��J�zt��_o9��p`)C�O�
}�0�`�ȍ�-F+�4`��hz�b��Sl�o�Eq1����I��>j1��~7R��Eװ5*��
G�2���M�8�	�ti�R����[�nf�
��vSK�L$6}s���v-��v21�N��um�*�i�k7�݅R"B
+
7?v��Aav���S+�SΣ�O	�)}��~1�M���j��O�9}j`��S��[�ڜ:����9�S��z���il�֧�|y��̗o1����!�(��Y�Q5�@�j�2-�J���[�<@N�XY�r
=�J�MI���K�(���
�_��2�`'ITȮS�"Ni�
+8}��3����4�[K����P�S2�E�*��#�5
Y
)QT	$
ם�2�`E��z<HT�oB��_�DI�$3��Dy�$���&Q�n�js�(�ӟ#Q��.a��m��=g=��0I�"@�)u�BJc��Be�	S�����9T� �Q)YH�Xq)B3��r�������S�oJ�|����D>�8�E (����
��v�8�ũͩC�|N����_N��S6��]�NP����(��4L�3�P
F=ќ�
��'*���]���r��������S�oJ�|�O'O��L�*\_�XV���0��O9�R�Ƒ�-Ȣ�FU��@Z�B���(����RnXT̩�Qmk���;|�W�ϗ!lo��]���A�z���
y���o�m�nw��q�X�|�
���f:��X��
q)U��4�Rx"���~��$��]"�Ha8:T�7'��Ho���z���.
>ۭl[3x�Ȱ&�˛i�T%��j��TM�ì�%��6X��h 
��ȡ�g�
~���
+Ѷ[
����j�|?�v
o4P�y�I���F��+�o/N�W�MG'#Z�uO�}@��9X��e=
:Y�o��~����Ӯ�O����o:+��=l1&pQ)��v<������(e�(w�?�Hu����=�����\��
3j=�Բ���(�T�b����Iڝ]�3��M����ʹ;�d�B�|�
�l��@�hy~��Q0�%�
�_
+Od7����9, �*��L �L˷��Tľ�	Żz
�+%V���8�
��O2
z�@��9X�
2��q�M�
�gz
\���r=���{\��~S=���t=����lo3
R����j$%ag�P��b
5��	��~��e
~��Hbdײ��W��XG,����&��c
*ye��M�V�
�J�{�{�/1����K\5hB�ap��E��߶��Kg�+Q����'���?��~+&���Ӿp�Bb��2����Y>U�@l���@��W��͛��
7�#WB���,��*M�Fb?15veC\YVo��z.��
"ܼ��
س��Isr���MŠ�*opzHX��r+��3:�
�x�D6:�
�C2s���
X��b+�E�`�-&��ڢ��3i��5�7)D�
1΋7�6�Ow���e���󻟸
��C�Cg	�$�`�@y��� �>�ú|�7AV���g
���m��L�}��l
(�jh�֓h�>�Kv̪������c�ssy�[�*	�)b��-�6e�{�}Un�ʬ���,�.
�������������#!����~�.醴��v��36���~�P��͌*43ofQaP
Z`�KDi��o��ӿ��
0���?D��S����������������-��
��������^�U,���E\���
R�H��\��L��!���\L�#'Q7$I�Y�nUendstream
+endobj
+4170 0 obj <<
+/Type /Page
+/Contents 4171 0 R
+/Resources 4169 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4168 0 R
+/Annots [ 4174 0 R 4175 0 R 4177 0 R 4178 0 R 4179 0 R 4181 0 R 4182 0 R 4184 0 R 4185 0 R 4187 0 R 4188 0 R 4190 0 R 4191 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R ]
+>> endobj
+4174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 697.0475 199.4753 707.9515]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 697.0475 259.3203 707.9515]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_1a79ab4c49d7ae4406b56dc2b3d94463) >>
+>> endobj
+4177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.4134 648.3293 269.9743 659.2332]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.3309 648.3293 415.7115 659.2332]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 636.3741 174.2001 647.278]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e179c684a9ed7eafbbac1825d17f7daa) >>
+>> endobj
+4181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 563.2304 199.4753 574.1343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 563.2304 256.6403 574.1343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_3cb9b031ec4e6fd7e53e53da5b0f04a1) >>
+>> endobj
+4184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 526.4673 199.4753 537.3712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.9735 526.4673 246.3988 537.3712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_de4a5582f82333f20fd6a8be13ff8d7f) >>
+>> endobj
+4187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 489.7042 199.4753 500.6081]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.215 489.7042 250.1848 500.6081]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_06c0a4ba25cbc3d59797bf1c73c49497) >>
+>> endobj
+4190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 452.9411 199.4753 463.8451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.9735 452.9411 239.9433 463.8451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_0803532e7523865597c394e1371d2b16) >>
+>> endobj
+4193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.4321 335.1323 258.993 346.0362]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5546 335.1323 439.7272 346.0362]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b65697a5fab14ca76c391a3aa523e3f6) >>
+>> endobj
+4195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.4321 310.2504 258.993 321.1543]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5546 310.2504 440.3047 321.1543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2b39d89b5938161bd8922b7c1f28f637) >>
+>> endobj
+4197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.4321 285.3684 258.993 296.2724]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5546 285.3684 432.5538 296.2724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4cca5e272cecc038189aac8b2fc8ace2) >>
+>> endobj
+4199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.4321 260.4865 258.993 271.3904]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [361.3615 260.4865 403.7719 271.3904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_356bd3ccfaa76c0ef4452a34ce767897) >>
+>> endobj
+4201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.4321 235.6046 258.993 246.5085]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5546 235.6046 409.6899 246.5085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_0acb1530838a14041c43002dd8ee3541) >>
+>> endobj
+4203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.7491 210.7227 259.31 221.6266]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.9479 210.7227 348.4045 221.6266]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+4205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [382.4704 210.7227 417.668 221.6266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d6c64cb3cfad6b8d7fb952e3f85347aa) >>
+>> endobj
+4206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 198.7675 173.4667 209.6714]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [166.0194 173.8856 261.5803 184.7895]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [330.5968 173.8856 358.0534 184.7895]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+4209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.66 173.8856 431.8576 184.7895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_cdce8391d61c3090aa51f9d0656524a2) >>
+>> endobj
+4210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 161.9304 173.4667 172.8343]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 137.0485 156.2812 147.9524]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9a28ec8161898b61530de9bbb4a3251d) >>
+>> endobj
+4212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 137.0485 234.4775 147.9524]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [308.8139 137.0485 383.1945 147.9524]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.2512 86.2883 199.3393 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_dfb768d4ea63e2eb5d58aec03b999f17) >>
+>> endobj
+4215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.6765 86.2883 301.0571 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4172 0 obj <<
+/D [4170 0 R /XYZ 90 757.9346 null]
+>> endobj
+4173 0 obj <<
+/D [4170 0 R /XYZ 90 714.1236 null]
+>> endobj
+4176 0 obj <<
+/D [4170 0 R /XYZ 90 677.3606 null]
+>> endobj
+4180 0 obj <<
+/D [4170 0 R /XYZ 90 578.2841 null]
+>> endobj
+4183 0 obj <<
+/D [4170 0 R /XYZ 90 543.5434 null]
+>> endobj
+4186 0 obj <<
+/D [4170 0 R /XYZ 90 506.7803 null]
+>> endobj
+4189 0 obj <<
+/D [4170 0 R /XYZ 90 470.0173 null]
+>> endobj
+4192 0 obj <<
+/D [4170 0 R /XYZ 90 393.2412 null]
+>> endobj
+4169 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F52 345 0 R /F37 1999 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4227 0 obj <<
+/Length 3035      
+/Filter /FlateDecode
+>>
+stream
+x��\ێ�}��Г#!���$�8�n6q�٧��@�i���--���ק��lRd{d!c
/�����9����db�D	�
�rr����[���.H��
>����\^<}.�� #��\�i,H�%try���fs�1���<]���Ջ�����muS/���|]/��gϾ{[]�fA���?�֯�z����O��9�T!Ƅ����?�� �e�w�˙��?��T������ef1Tu���h���b�o�^�
�V��jq�ڿ���@�DO��5��A�DRk�⯗.�]�����??��'7���/0bF��{x�!0C'�
NY�fu�����N�As@�n��9�HK8�ha)CX
+�
++hp�q����l~�T
ω`8�
+6�
F

*�ZLa��%
,e���'�)S���k�G`R"���-�p��6�u��c�����m3#bz��i8�j�9A��j$�'N��v���~��1�(4�4!�+�����0/�d���@���]E������݌��buWE�(h
J� �aE{T)+�P�
8�1�Ԩ�i��"��zNҏ�+�D�|

*�"d��Zذ�mЕ!�iD�̵eh��(��2�JXR3�u�<gҭe�&K���7K�
�:�
��j���۳}��o�������r�i�?��4��1�FA�$>JF
j���C4��
%A
+5��by�=*��#A*6$t��p�
�zu��'�	�S�IQ^�=~���`d�I���X]��V�Zn�^����(�z�p���B �kȁVa �����|P%�2@#���0"�㨐A�D
�O�C�Q�LY;
���.W�l�0���:Ʌ
I��.$L ��%C�F��'�R�&
�HN?��a��w���t
�v˲�����1�cƶ����7��
�n���v��?���*/&j��\�9��B��b��iF��G��1��?�&�
��)�9�
�&%6�Pe2�h.����{>=����N S`R�K����>>Q��U�#�V! ��1���lKX����o��	=à�K�:\ies��P՛��0�p*�F=w�B<��Rʄ�
��)���U����Z
'"��v0�fу���l=�ʹc@�.��(�o#� v\A
.��fak|�:�
Dk��Ɵ�
B�!D�Oϝ �!����{���2�����[2����3�s�<�]Wh�&M��U�Ⱝ�-��	V� [...]
�aHpA�>KqM-����8XQe|��I��U&p�E�
W*J�X����Uơ>Qe�h��LDZe�(�*32�U&��خ�2�&�<V�8օ�:T) P$m�
+d��"��/��
�4{*�
�*tYl�q+
��ʨS�Ʒ�Q(�z�y��p����R�$�%��ae��
�&�7!5�ۯ�.̻�Ɉ�M�An�ٮ-ʐ���
������Fv[�l������vk��{K�M
��O�n�0��64�@+��MA/������(2��sЃ��;�C[���
���z�����fk��4��_3�&�m��jar��,c��<W�z�Tw�
Ժ��$���e��λ�y���f�!o��+ ���2�ؤ��AX�Jz�7ja��ީV�gbc�t��������oL��ۯ��,^�'LId4-ހ��s����!~��2��D�ߡJ@33I�0��S�{2cs��b�c�_ 
���Pq�Z;J�Q�̀���y��d����`��kU�iz��1���b8|��ݑ7�CJ�.0[
�*#��/���ŀ
"Ӟ �9��}V���+!Oe�FF�
�+��D����:�(3��P�i��ʢ�̉r�oB�}���4ƈ��L��i�? 3�9���Z��*2
5tH��
���P�T�O	M	�elz|1��ݑ�,�|���l

*�"T����
���=��=9��ag���z�Z=���}��	�D��G0
+\B
=�F5C����`E��
f�>�7f���70�	��
lQ�
3�5��@z
�ٞ؇�� ���;T�=�i�H�O��A�}Bz|1��ݱ�A
Z=�����_Ck�-��ю߰����㗴�7~qj��_v� �
Y
�/�"�;v���{M�U�El-[
e
V
3b�b�4~5_7��t��62�`_��0pQ����.J9��.+K�g0'�	�		��~+%�	g=~���
\֤���\�`X}0

"�4�C���~�h���5PX�jl
�Alw�s$U�<8T
�@���
��ew.�����md�����Ʒw���W��M�h��%�T�U����&��d�_���'�����]���V*�(���>�.�>�De��`~+й���7���ߘ��� �
�#�0�(�F�y�����<�[�s��
aID�
���>K�(d!�s���c3����v��9�/�������Zf
 ��3S�sxIHᖖg���%��[Z���,����
;SqB���p�B1bk�b��_��
3SY	�R��|�o#'�=�,3��YopھI��x�f�)�[ϸ��
A���ǥ���ok��)EB�&��sN�{XY�=�9]O�M���[��lF�i��1��l��o3��(�dK��X�*E`(R�0�c��0�E<6=�����[c� {d��Pqѭ����~�:
s�N��DFAz�Ydy��|ސ����J���0��P�
cxb%�}����o��@��"&�*�}���>����h. ����g�ڷ�oϵo~�W��fBL���q���/=��Κ����!��*�
+v,�
^U��h`>�d���I��oQ�̽#�o+�#����
�gO���
]���f�����t�[=��{05�X�zs�b	�ϛGڀ��X�l;-_ok��r��:�G�$C���Īendstream
+endobj
+4226 0 obj <<
+/Type /Page
+/Contents 4227 0 R
+/Resources 4225 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4168 0 R
+/Annots [ 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R ]
+>> endobj
+4229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [132.7297 707.9571 175.8178 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fed617fd6598839b510b46a3857387d4) >>
+>> endobj
+4230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.6335 707.9571 254.0141 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [150.8278 646.4971 247.4643 657.401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_bb6ca6c02bde2f04d412129e4be9743e) >>
+>> endobj
+4232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.8015 646.4971 349.1821 657.401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 599.6727 202.9022 610.5766]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 599.6727 314.2635 610.5766]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2f03dea4f9d5f0e15e18785cf3dd58a3) >>
+>> endobj
+4235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.6007 599.6727 415.9813 610.5766]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 514.3024 199.4753 525.2063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.0983 514.3024 296.9049 525.2063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e6fa6e27a794dc71b88169df7f08fcac) >>
+>> endobj
+4238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [324.2421 514.3024 398.6227 525.2063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 467.478 199.4753 478.3819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.0983 467.478 294.4044 478.3819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c62afeb287031d74441101af60be319a) >>
+>> endobj
+4241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.7416 467.478 396.1221 478.3819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 420.6536 195.7991 431.5575]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a8f66682c527ff5a5a2496de0e3fb2ec) >>
+>> endobj
+4243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.6147 420.6536 273.9953 431.5575]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.1341 373.8291 196.8335 384.7331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2f9c525f46f4ff5707b505a88c82aee0) >>
+>> endobj
+4245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.6836 373.8291 276.0642 384.7331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [380.3875 373.8291 454.768 384.7331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4247 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 315.0496 191.3655 325.9535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_da7d59af059bdfb2e485d341213e6d19) >>
+>> endobj
+4248 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.1811 315.0496 269.5617 325.9535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.5282 268.2252 192.794 279.1291]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b1b19ff2b88ffca75ac27208cdd877a2) >>
+>> endobj
+4250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.0382 268.2252 272.4188 279.1291]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.2052 268.2252 453.5858 279.1291]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 209.4456 197.4528 220.3495]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_798df1392d067294fc936bcfa19745c4) >>
+>> endobj
+4253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.2684 209.4456 275.649 220.3495]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9871 162.6212 198.3402 173.5251]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_3f5e732694ad7d879ac7eaef0668073a) >>
+>> endobj
+4255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.0433 162.6212 277.4239 173.5251]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [380.8284 162.6212 455.209 173.5251]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 103.8416 191.2164 114.7455]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d3d8562d66aeed544d8ef75b941e807c) >>
+>> endobj
+4258 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.032 103.8416 269.4126 114.7455]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4228 0 obj <<
+/D [4226 0 R /XYZ 90 757.9346 null]
+>> endobj
+4225 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4274 0 obj <<
+/Length 3574      
+/Filter /FlateDecode
+>>
+stream
+x��\[s�~ׯ�KNB�K��L�i:Mon�>%-�2'��$e[��=�
,� ���,��~8{��
,d���<QB!ø�\m.������~���s��ˋ�_I11�H*'��I���N.�����lN0��3����f��Ō��n}�fy�_�����~����/�,�~������m^-��.�~�!^�*Ę0`���}
	l Qfx���)>�|6�š�4���O03������E�/׋á彜:]nn׋����k0���r{_"�HfI/�r�<�9\0I�?�^|��\�㿾��-&���
�l.8e���ŷ�q<����1C��9�HK�<�"
I�5��� �`�&Kd�6I�
�(�B/��%���$
+IJ����C��T

Dh׮O�ۣ��BU�4�R��!a��>pM������8�2�k�DBO
8��.��Ͳ�
/���3"���6
G\
za�<�[��2�E �
i���<�m�F����Zڟ�7
�ߗ=~�_��a�k��.�}ݼ�����F�@?����-�h���F a8-�


���!Q��>��E
�����|{�"�S�C�V�Sb��V�!�afgFfD�%�8A�b��!����^����+%��_F�[
.(ܨ|0
����,�`�	�)He�p�xvC��&X�8�H%�\=>5Wj
+���h\��F����1 JN��f���)�Dz�uiWy�1��0���-"`�ل������fa.�xz�8�v���������'��� 4�A��B�=�J��������O�I��v��4��O���AXI�LUL�
~�_�J�C^k���a,�jC���
�H��R됀���o=�X�P{�=�h���2�J�T¨�
*�"L���\>^r��r���:�X�g�S8�]ns�)S�Ǒ��{�Y��ձ#�
�[��Eջ���ї�9&?.���s0��	�R��`�9�#����vs���'P�4��Z ���)p�ܿ ]���9�`�

�Ў���P���W�ՠ���P����-��7��x�[1(n�l=��
�i�YQOCL
+ōG�7��7 �
��6_F�[_�P�e>UF̖���7�Qō��~|Rq�sd2�����Ie��GI�l�9��B۪��5�.�(-�8V̯>a&��ڍ�k��'P�@'CAIUS�4��A��	y��z}�rs�
ɱ
�`xh�0�t�B�0�ט��2,�ަ
 *=��E
���4�B�Уb+�
�e�
�$f�b�U�ʁ�S�B��7�ѱ�C�`�@IT
�/#�̰R��S"
�*#f���1g#iW̓�_Q{�Ϥ解dddC�$AҤ/e�'�
?�/HLo�0�1,�
GI�mɐ�,+�~%ৼޱ�Cr���8rz���W�
+'�ghb���@�����zG�
�] V����1f	Vp�V}V����%n�l���
+D�p�
+r���r�'�ȥT��\
+��䒲��Ӗ֤B.5��AZ.��֊�ݫ�\���t`K��:T�+�0���-LL@�Q��/Z0��� Ź,��G�V�� b��hI�ɀZL
r{A0=w�I�
&�!eU��
��y���j4
�*#f��=6�`�b��O~y�do3V��<|F.��ǩ���1�44 ������T�kZXq�T�92R����T�?�d��(��J��a�$�zXY*y�9��h7!��f?����LA4�X����?�/yz
�Z+n��3On���=�#��A�Z7
+l�A��'7`'
�����������5b�7�|Ѓb�\�@lF
� ^H�'K��=�FQ�F�TH	�k���8ļ����`���CB��c��BA�cѩ"��g91�T(��Z	D��
/
KD�Ź����
RsŐ�r�P��ت����x�Q��]�C��-���g����<��d�Q�UL7�S�%dZ�x�^�l�]�׫w��n�y�F�3�ׂv����i������Q�9��b�@��iAIu0RVR�WR>l\I���+)R���&
��C���>���
0k'��=X�c�N���D�2�{P�
+ӡf0
��W�l��S� /4?d�]n�H0�w@��
,5�L������ׅ��QA�{_<b+�"��`꣪���w|�Z)���)���
(����c���y<ov3
�Sn��F}���Ĩ����n�*�&*�:TlD��-#�@����E=�
�ˡ�gG˩F�|Q�@:Y�R�/"歋�;�(e�H8T!1�G��[T
�{
'�6_�F�;�Ƽ+j8�U�22h�F@�],�N�v�Ps�4��ޯ^�"��R�VFx
�:����ӣ��|��t!!��m!d�B�v���PH���B�3F�����h%!\I^,$�*O��q��I9 �a
�0f+�����;�5��M�7���:���E��;G;�}��~�r
S�D"��� ���
�Z��'mE�U��3!z7C#S����f�/�}�ex���a�"�#�q�vE���o~9\������v�-Vq
~�_�*ㆼ֊��&�"��;�/2 �ԺaPCq�>�
�%����
y�Wĵ}�6�������C��B�}�c���*��j�Da%���]gf|U�p%j���`ļ��� kD>UF�����X��Y�v��ݜS�,�_�Yw�G.����.�GV���+��8�
T���Z�##h
�+���"�$��[W���+'
��hz"��TP��Vg�S�{Ď.�)+�)�0��R��z*h��^����B���W�ܿ �� �V��⋫���Ռ���=��= $�*ړ١
+��
��n
lI��S
Ӥ�_� �}��B��D/�t�؊�K,C��*�4j�)+f
+a-�S=��J��+���
�U
�/#�ݓ)�<�
TEĕ��|l$�
�f
�o��ae���ſ �%��
�'34glSfdCrWf`��R 0�'���s�T�f�-��,R9	���w�<$X �J� ��%��鋢���q�K�������Zn�NĵM�?���� ������9�a{��~� ��#�f �p�
+
+?�0#�R���/h�8�+n`�'A���������!o�T�v
]I�v�%C���Uj�H�jB�ͧW�
�:e�z|т!o�y� Y�[�w��؃�?|4�ˏ�=�"�!���7��������p�B0b��#A����`8T!1ۯ
��wޡ��`>>��##0
�k5Ʉ}x{�hJ���3.���1��a:R��N8,�q�U��v����}�� ۤm��Ӊ��
�lp%����q�.{;���o�����ź�ҿo���q��%�����ns�د�
��n{e�;$�y	���
Ol��������ș`�

+�f��k߈f ���
y�\n��ۃ�ۏ�����
����g��'�����N�y蝥Z��]��/�jv����o��xÜ�I`�^j�q���w�\w�ܻ�
��n9�7��x�������ߣ��ۮn�hu|~{�~
M�ؾ�X.zs�l	��1ERa
���V����(�/7M��F�=N6a�� �%��endstream
+endobj
+4273 0 obj <<
+/Type /Page
+/Contents 4274 0 R
+/Resources 4272 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4168 0 R
+/Annots [ 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R ]
+>> endobj
+4276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.5415 696.9982 192.6582 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c32024703f8ac04b6b68ff1761575d2d) >>
+>> endobj
+4277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.9156 696.9982 272.2962 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.1654 696.9982 453.546 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 638.2186 190.2598 649.1225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_307453961ae9779ce9e1e3ebcc94496d) >>
+>> endobj
+4280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.0754 638.2186 268.456 649.1225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.6265 591.3942 191.7866 602.2981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a831d9698f64ff610fa1b3341025603a) >>
+>> endobj
+4282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.1291 591.3942 271.5097 602.2981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.9103 591.3942 453.2909 602.2981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.6682 532.6146 212.4172 543.5186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_be0aef8acc1101523cfbf50ebce7528e) >>
+>> endobj
+4285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.8014 532.6146 291.182 543.5186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.5932 532.6146 466.9737 543.5186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.9217 520.6595 250.3023 531.5634]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.7217 473.835 211.9227 484.739]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_95ac9759a14fe23bf8d02a621e4e9e5c) >>
+>> endobj
+4289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.3603 473.835 290.7409 484.739]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.4862 473.835 466.8668 484.739]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.9217 461.8799 250.3023 472.7838]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0153 415.0555 191.2814 425.9594]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e4bfe4a80fb074c50ec17657eee225e8) >>
+>> endobj
+4293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0127 415.0555 269.3933 425.9594]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.7621 415.0555 441.1427 425.9594]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 403.1003 222.9969 414.0042]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0739 356.2759 204.3648 367.1798]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d5ff0dd1267079af85d9938bb4a975de) >>
+>> endobj
+4297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.1547 356.2759 283.5353 367.1798]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [362.9864 356.2759 437.367 367.1798]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4299 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 344.3207 199.4753 355.2247]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [296.238 344.3207 370.6185 355.2247]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [468.9455 344.3207 513.9963 355.2247]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 332.3656 159.7346 343.2695]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.9681 285.5411 191.7918 296.4451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_1d723d4d200b4a6a694b141c7b6f408e) >>
+>> endobj
+4304 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.4759 285.5411 269.8565 296.4451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.9512 285.5411 441.3318 296.4451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 273.586 222.9969 284.4899]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.33 226.7616 215.546 237.6655]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9b45abd63e1255df8341775c8f42b842) >>
+>> endobj
+4308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.5919 226.7616 293.9725 237.6655]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [393.2697 226.7616 467.6502 237.6655]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.9217 214.8064 250.3023 225.7103]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4311 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.4786 167.982 193.3024 178.8859]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f1952cf5da3ecbadd8401b948e899a31) >>
+>> endobj
+4312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.497 167.982 272.8776 178.8859]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.354 167.982 453.7345 178.8859]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4275 0 obj <<
+/D [4273 0 R /XYZ 90 757.9346 null]
+>> endobj
+4272 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4327 0 obj <<
+/Length 3591      
+/Filter /FlateDecode
+>>
+stream
+x��Ks7���܋��
+a��d�ĩd��7ў����F6�THʎ��oc
 0 �!)��r� K����@���3d��<RB!ø
]ޞ����7'��x
+�O}����x)�� #�
�_�
$A�::��eLR�)��_M
�V���W��˛����jv����j�z8;��mu��5��.~��}]�&����%!^ JbLH����1	r Qfxkq>Q|��dJ�M�<�|HxfCU{�?������׍������f�����T]C�D���%��A�Dr����s7��
&�
�?O~�
��`�;��-F��
�:�=�u�ܜ�|����> ��i*�h�8�OY�Q��Ɣ!,w
�QHR�G��ǯ����J�F�|�q��*f�¤�K%†�a7ݰ�r1���L�\�p�
%n
6w�bv�
+xN�9��3M�0
��fN0d�9Jm@XF�fu|�����.��NOG�)���ViD4�!!���~�z����rg?�H����]_�0��'T��M�W?�.���ώ*X���^v=�U�S��#o��^�i����'�q%�IF,�ם�gg��Y�n�a�ǧ���eB ��*��/H�=D
+�
,b�R8�����R�å�	)�Rb�9�,���_���z�
��4��
QZ.��ԳO����V��
��9,� ����E�����)�v"�.`���.jS�WJة�t���{�?@�Ø�j8��ײ
3�ɳj8�����j���H,
���t1*ǯ�˛�o!�b�
Wږ�h[���Ct�y#�6��]��m��/������
��zΨZq�gw���b��%�]8��4�T�����"C{D�
����K��$�d$mp(q� 
�F��N���ظ}��A~N&d=� ^%��P5��y?��o
�$�@ےb{B�|��%Cf��	��` l�PT
+��椀�ά����
����(�}�(J

E%�1;���g����(
Rۉ�����'��A�0�
�!�z��D�hV��׳�O������
���l
rٍ��
v0��AR{�mTd!��Ƞ�(��/H�
��p���
+�D��AS��B��I�
+Q���՗�P���b��ξ�a��ѿ%@v##I^@gU��F��at�E�
X�X�x4��e�Q(�u�#������|]
ʢ�0.A��E����wKǢάȢ��
����,���YT�Z��z0��dhԙ
��av;y4�)
�AN��b��y)b�GAiV�-�楈�=7.B#a�
̥�.uf{pi��N.�2Hsi���v�$�ז^
���>���ko�
���$��k�r%L^gU�$�6P����hJ��4H)�G7H��
�Cet�c�>��*&��[��&������>��"0vA�
�R���T�Gc[�a�����#C��̦��j�Ը [���v�hA��K������R f�����QJT��;�2{s
���``?�'�� ��\�b8{��3;����v3p?�

���2�0)<�J�=��sRx
��"��10���1B�`��0�3ۃ��\v2p�A���
v�)uݸ]�Y��j�9�����/h�
֜�4qVMbo5���IנU,Ӡ��c)���
+>TGg_�1��?������Y���^��2���u ��F��C.� |��c ����\gV���$�ER��2�"YR Y�U�p,
+$�̊$�;̐l*nL�A�O�d�r7Z��$��!YgvɆ��$�(�4�9}|$;P�-�楈�
E�Y)�$��"���H�@Ma�/�oI�; G���>$䲛d�� Y?����
(ɶ���$��G77+ɶ���$��)tsʸ���e���ű����΁m7��~��
��P�\ q�fǀ��#��̦�}�=���m\�)b��'�_KaX~�Y~}��Mō�7���/)�}cy ��d�י
�av;�7�)
�AN��b
�y)b�G�oV�-�楈�=7�e�:5��׳Ϡog�����~�4���Uw���mV���
�ۜ��mV���'Ѻ
��s�U0�?�&��9u�m�|j]��O�C5mY�P�!G���#Dz��N��X��z��q�Ĕ.=�����9�k"nX��O�/W�ۄO�
+���S�a�H��h*�
��j�:���~��BӾ߃�T \X�av}4��B4��e�
��A�j��8�ʈ��vk�/6	�ܾ׃�㞦`p����@Y�}A�د�a�f���R�W�Y�r,`Q�a��D���
���M��¥�j6�>2�3���Tm�W�u�9,��
]�n7�c�X�)D��lZ,
��`�ͷ�
�sѮ{�
 ��w]\إ{e&���U���|�Gm]z��ڼ��\l��w͕[m��eR���
M�f�W"�-
�3���pQM8
����]e7�v���b�
�>w���g��
]�U�������BJ��2h�����5'Ɗ
+�3+R�a����ƅ4���4������?@��
ų
 .7��<^�S�
�
 6A�
��~����}��5��
����@�U�S��������&���R�/�T�����������p�1b���l�^�Ϊ F�m��Kݺ�Ø����ا
��ܥ�މa�c��XY�Xt�S��D�"�ks�����Ϝ�z	�TgU
+
�R� 	�&؇t�_�6r�x�D[�:��%��
uf>������*�T�e�Ҧl��+��o
I�}�_k��:�)�گ
+H7�Ҕ��{�ϼ��f��j���m��]$Y�E�)�Vo�oY��%��aߔh{� F�f
+<$��l�#���}�@/�™���z`�)CK������ؾ6Q؁��)
9�z�]��o�?�o�Gs�?���ut����3U -�,ZάZ���Rqc�
+�>�-��C��@�:GRM�1��P��e��T��
��vEm?�H�+B��+T�0�T��Z�9���[�]A��q���xX5����d��ӓ}k+gd�ξ�@�)
���M|���"�qvV�q���}�Z��Ƌ�E��Nk^�������������0�U!0' �0�������l�ެ���p6>]�mŁ�ܐG�]�
m	y�|7��p[��/�[�ng��O�o7�%�\`O"�Q����ԷO W�k=��5E\|5_E�[2�X�����Ϊ����
	�_�WIps�̾g�V*e�Y��uf�R���-e���R�}�R�}�t��+�Bi;�
1�}�^�{#v�����[(v*G���HP�""e�=��O�rF~��E�_
+� �,�%�/p�U!=� \
�K�-vȚ��m��K	 ߡ��
�~�ׅ'�n
n������9���}_�nZ/K���Ps�H��:.4�u�����9��\>vV6'��˷<

	��`��;0�9�B
������NoL-	ۉ}	Ե�D-W�U�u�I׼\���}�~�������j�ms�{�p�X�˨a��z�u�!U|����
+"�"T<����'�m{2���?F����-�wDsݦ�S�����ܝ�x���{t�F����
+�7/��n^������sN��3�r	���y�
+����uw�v���6�u
!0��<$����n}3endstream
+endobj
+4326 0 obj <<
+/Type /Page
+/Contents 4327 0 R
+/Resources 4325 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4168 0 R
+/Annots [ 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R ]
+>> endobj
+4329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1875 708.9333 272.7484 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8773 708.9333 450.4382 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9139 695.6681 192.8401 707.6233]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.0066 695.6681 304.9327 707.6233]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.9646 695.6681 472.3899 707.6233]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b733c7c83da19667a83c2a3abafa5d05) >>
+>> endobj
+4334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1875 638.6521 272.7484 648.5798]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8773 638.6521 450.4382 648.5798]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9139 625.3869 192.8401 637.342]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.5042 625.3869 305.4303 637.342]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [427.7683 625.3869 471.8923 637.342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_79a5a323f582c4260790552d3be140fd) >>
+>> endobj
+4339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1875 568.3709 272.7484 578.2986]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8773 568.3709 450.4382 578.2986]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9139 555.1057 192.8401 567.0608]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.5461 555.1057 304.4722 567.0608]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [424.2952 555.1057 472.8505 567.0608]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_dda98cdf0bda436acac3193162fa53b0) >>
+>> endobj
+4344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1875 498.0897 272.7484 508.0174]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8773 498.0897 450.4382 508.0174]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9139 484.8245 192.8401 496.7796]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.7609 484.8245 305.6871 496.7796]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [428.6991 484.8245 471.6356 496.7796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_76b5e4c5b9628c14a7d227517b8fb349) >>
+>> endobj
+4349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1875 427.8085 272.7484 437.7362]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8773 427.8085 450.4382 437.7362]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9139 414.5433 192.8401 426.4984]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.5461 414.5433 304.4722 426.4984]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [424.2952 414.5433 472.8505 426.4984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_16b12775a696c6e304cf9ee7ffe2213e) >>
+>> endobj
+4354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.1875 357.5273 272.7484 367.455]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8773 357.5273 450.4382 367.455]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.9139 344.262 192.8401 356.2172]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.7609 344.262 305.6871 356.2172]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >>
+>> endobj
+4358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [428.6991 344.262 471.6356 356.2172]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a355ae6b2a2a704e88060541fbaa6562) >>
+>> endobj
+4359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.6165 286.2698 270.1774 297.1738]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [388.0476 286.2698 403.8781 297.1738]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d5c5cd5266cf95dcdc0f03d0108168b5) >>
+>> endobj
+4361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.9227 240.8752 274.4836 250.8029]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [377.3196 240.8752 472.8805 250.8029]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.6385 227.9438 229.7866 238.8477]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2ee8a6019070192609b3ea6e5dfa3018) >>
+>> endobj
+4364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.5496 133.6555 270.1106 144.5594]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [326.3468 133.6555 353.8034 144.5594]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+4366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [387.1017 133.6555 414.5585 144.5594]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f9af63978105e142642222864ce7c3be) >>
+>> endobj
+4367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [272.4407 121.7003 331.997 132.6043]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [186.5333 99.013 237.2186 109.9169]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4ced0eee2a4a2c50779c2d01ef022500) >>
+>> endobj
+4369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [337.3416 99.013 411.7222 109.9169]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4328 0 obj <<
+/D [4326 0 R /XYZ 90 757.9346 null]
+>> endobj
+4325 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F25 348 0 R /F74 482 0 R /F101 2079 0 R /F99 2085 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4383 0 obj <<
+/Length 2572      
+/Filter /FlateDecode
+>>
+stream
+x��ZKs����W��U�h�%q��^�v�u
�r�],�%�I�@��_�=� � #����!.
D ���_3 
db�D	�
�r�ܞ��5���q���|�%�����k)&I��j]q�	J��j�nJR�9�O���F�6Z��Q<�6w7�*��L>�Q~wq��M��d�����~�1�g�~>MHG �
+1&
(d���&�t Qf����)>}>�SaU�'˻ gf1T��^
e��&*������i��m�2��\�kP��i�.�!�N���ُW�E������g�>��
+
��F�h1��

�:ٞqʚ��ٯg�n���B~c� &�hsƑ��z��0$���;Ȃ ����/����(F%��-J��($)Փ���=���v�6TA��W�I%�J�
�Ŗ��*�3ա�q���5��DB������i��P
2�47�ǘgX�@�"`hQ�яi�q/~Z�qK5�]%=
*	��(
������kGqٵdM=����i�T,�De2�b�yF�4^�+_tB���)�yO��g[��F~Zp�=��&R��ahP���)��n8\\|�k�6��y��a�ũ�w�Gl��iu�����
H	�ɸ�[�#fB֩/��ؠhf(�!�'[��?f�_�C����pHJոqZ�#�9�<{�{������g_�1J�E���H�2���{�χY��SRk���6��#�w�Q��ZA'ۧ�$�^�J�J�ວG?�6T��kH\p_�*��N$��%TJ%�\=�b&lb�d��Q��D�^�Wzq(�Ӄ�*�U���z�.�$K��JJ����eU
+��#e�%;ZV�
G�jHzb�]Y=�s��������. �pĕ+��B��%���X+��0LbD��9�Y��c���ϻ/����*���<*�Po���p�|1(���a��W�_r�#�Q^ ���Mz��
$?D46����?�אoխ�
O���f�8
�P�}^#��}�J�=��09g��/�I��)f_�d;<ƒlC�K��v��	!ӑl
i�K¿J���+ �����bqs쫸��
4��ޯ�b�';[�� gN9bܐ@�}�VX�
�^'��uZ���O���K�@�ZtȕD4R�n�1O5�S���{G�Rk[h�8��?E����0�c��!�
��v�m
�,2�F s?��6�!:�"��pv�����NT����Ei}kw�o)j�[�T%
:�j�7�S&�A
{���G
[d���I)��V��
w;-�|]9r��I�7�i�2�.��6so�����?>%��	����e����cL���,��i�[4u�&�c��+��;��߶fk-��O���2[��Ey���K��I�����hSd=��OT�q
+���xw��V�ڃx�����v�vQ1	�	�^��{��k'ة-�C���)�?�<�)���.���˨4ט��u���,/P �`e�B�;9����K\�s��C���ro�ݗk>m�
I�� N�~xBdĴ	�Q�{r$!J��2�	�0�d7j;�Ȉ�:�Qjw�|ݛ,�\q"G�:��֬�?p*Ǘ�)���U���*���]��6y32��e��U��JHa�۽�Fi�=�v�nc�4u�ۅ1D7e��C\��
n��O+�j��E��	�Cք�(�>�9E+� �
i�\mE��<����v��%䯢
�3�
?zi�]�n�4�(���U�'�&@y��iWh����� K�&�K���5I���˸��i?�C�̳]�t��6�.o K/!I'�AI�l�CÉ�&���.A`��q���Ͻ#9���`�[�cr�S2��ɽ��m�
xp����
�/x�A6帍1�73&�/߸ڟ�C����~��yc
?0�9D�!zck7�
r9����u��9�Q
������G������8�5l�B�"�
���c{�zfG�Q��*��6w�IY5�c�!��0'u?�?
+>���1�`H�
����!PCv
Ac;��b�+�M�Umj��@6H	*� T��~���4��9
+ѧH����B��=4s���
F��
����p�
q�m�ٷm��	��	�3���"ܙr[���LhF��#�r�W�����Us
8i��-�8YDh�0@�����R�>�f������u��
���M#Rm]tlj�X�Y����0�ل\�zn����kI	@L�J��/�����Y쇧Ei���mV|��%e�

�E7������ѽM�}���F8C����A8̻�~�0,m�����w������Dx�� g� nd���R8x[�1��/���b���J�W����� 삛ReOBKW��Ȝ
3�+� �ݖ�=
5����n]}�u
������s�����
b;>�z*��L(5R�x_�Hd��q�S�=�?g���6jO��
����B��)��O�$���D�>�
,�N
�v� U�.����s��ƃ/��V�o=+�O?M�_��|]м0�Q���Β|��o�rwq~~{{��ڧ�.GIy��m��wa�
Ul�{�h��g~�)�
+kO���j�
c%�=����
+�o����
+�]endstream
+endobj
+4382 0 obj <<
+/Type /Page
+/Contents 4383 0 R
+/Resources 4381 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4168 0 R
+/Annots [ 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4400 0 R ]
+>> endobj
+4385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.1938 696.9982 270.7547 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >>
+>> endobj
+4386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.0538 696.9982 356.5103 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >>
+>> endobj
+4387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.0969 696.9982 413.5724 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6133c234bff425e6feac34cef06b74b2) >>
+>> endobj
+4388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 685.043 184.651 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+4389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.3215 638.2186 235.0067 649.1225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a7885d402d5653321f316029ca0af517) >>
+>> endobj
+4390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.1847 638.2186 381.5653 649.1225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+4400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4384 0 obj <<
+/D [4382 0 R /XYZ 90 757.9346 null]
+>> endobj
+4391 0 obj <<
+/D [4382 0 R /XYZ 90 602.8911 null]
+>> endobj
+4392 0 obj <<
+/D [4382 0 R /XYZ 90 540.2153 null]
+>> endobj
+4393 0 obj <<
+/D [4382 0 R /XYZ 90 466.3514 null]
+>> endobj
+4021 0 obj <<
+/D [4382 0 R /XYZ 90 444.0397 null]
+>> endobj
+4394 0 obj <<
+/D [4382 0 R /XYZ 90 444.0397 null]
+>> endobj
+4395 0 obj <<
+/D [4382 0 R /XYZ 90 285.2035 null]
+>> endobj
+4217 0 obj <<
+/D [4382 0 R /XYZ 90 262.8918 null]
+>> endobj
+4396 0 obj <<
+/D [4382 0 R /XYZ 90 262.8918 null]
+>> endobj
+4218 0 obj <<
+/D [4382 0 R /XYZ 90 231.6983 null]
+>> endobj
+4397 0 obj <<
+/D [4382 0 R /XYZ 90 217.128 null]
+>> endobj
+4219 0 obj <<
+/D [4382 0 R /XYZ 90 187.2595 null]
+>> endobj
+4398 0 obj <<
+/D [4382 0 R /XYZ 90 172.6892 null]
+>> endobj
+4220 0 obj <<
+/D [4382 0 R /XYZ 90 143.1097 null]
+>> endobj
+4399 0 obj <<
+/D [4382 0 R /XYZ 90 128.5394 null]
+>> endobj
+4221 0 obj <<
+/D [4382 0 R /XYZ 90 98.9598 null]
+>> endobj
+4381 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F97 1774 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4405 0 obj <<
+/Length 1745      
+/Filter /FlateDecode
+>>
+stream
+x��Z�r�6}�W評������L����m�&�S���-sB�*E�Q��
�DJ��V�6
?��b���2��G��P�0.��� ���/RvO��
�����g)�I���*� 	����������1
=<�Ӆ�=S<J��u0K}��2�������`��
+f޳��2H�o.���LHcJbLP�����ҁ`D��刋��o�*�
+���t��
"����
+~��U!�bl�(X,#?
�_^W�>ѣ ��O�:"RZ����EK�
&���߃�o�p�:��-�7�A1C����z�/�r�����a}
G�R��q�!Q:/�V�o7e'Dw8D!�ue�l�
bFaҀ��
+�4��q�+G<���(�\9dq��"�
-�,Q�x���YhQ�.���G�5���Ĉ��p-�ň
Kn���<WΏ� �3�L��eJ�$3�\]˵ޱ�� U#��
x���#•�Y0p�8�

<M�UV!��U1L�0xU�Fx�P�#��� L�1�mJMI%�uXP��8�n5�R��p�ĵ<!��.#B��U�.O�1�[�[���ຉB\�["\iu��2��	1�U�T�w�
�9`!����k��\�a8S$	��P��g���B �\�^�e��ͷ�5(Z� 3��`�z�Q*�S�H��,���Oa�I,�+OϪ1��
Z�Ee�R	�҄W�M��{���O=J�P�p��]^g�@�ATby$M&�-Mme�,Mm�8��	'Q�iO�i'��"� �%C��L[��n�R035���/�	
%�+��SfX��޶�=ݴe�M[n��J�E�Hҍ�
+�	�f��I�G^����&
VE�D,�H�.�v
+�^{
�ؗ����60Bis�z"K���
+�4�����}�E��Ӹ܇e�e��S4��V�
_���j��£e�t�^�L˷
�S
|!M�
+-�2JUpC�,Ƞ�fP�hdN���ƌm�{�iD%�醐1�
���#x��m���D"�>�����Z��?�fP�VF�� b�6�;|�B�CȮ�� 
+qAk�p�vz�d"�93�
7Ph	Q9��,Y�����n�?�.g�R.{k�,��ϒ��8A�v�vg
�"w�U�W
\F늪�K�B8y���!����kj��s�?������ԧ��*v�sL]��������M*
+Q����#3h�w�=!���[i��s��H�����P�w�I8+d��m��^��.f�p�A!��u��1�v���*b��g���
� )�?.|~qZ �!�zU�%�8GT3�QZiĥ�*��ϿX̓*�ؓ~[���j3�nLE~�S<�I9r�~V}Ȯ�ص^���n�
6�F�,c,�5�D_��ϔe��=S!잕��\�qڀӚ�w�4�I���
5�X�a�"�lNj�)C
��Ķ��9z,ÛE�!�a��C
�4
�hg��q�ڕ8F����v.	�^{�lv��Ic���)��'�ܫ�E�����&(�y��&m
+����x �@��%g���
"��+��#����;��AB0�57
r��N7��;�R#E
�oʁ�c��)W)�C�:�~n�d�7����ⱼ�X<�Z�������~���k#�;+*HWaR����x�TY��q^��}�V at l z�JE��a��u����I��r�j,yO�]�u�-���nnn�t��q�LQ��-��ٮ^
clc]ޛԃ�ti��C6�
+�.WIY.���T?.�
l��#{ҡʿԵs�endstream
+endobj
+4404 0 obj <<
+/Type /Page
+/Contents 4405 0 R
+/Resources 4403 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4419 0 R
+/Annots [ 4418 0 R ]
+>> endobj
+4418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4406 0 obj <<
+/D [4404 0 R /XYZ 90 757.9346 null]
+>> endobj
+4407 0 obj <<
+/D [4404 0 R /XYZ 90 733.028 null]
+>> endobj
+4222 0 obj <<
+/D [4404 0 R /XYZ 90 709.0878 null]
+>> endobj
+4408 0 obj <<
+/D [4404 0 R /XYZ 90 694.5175 null]
+>> endobj
+4223 0 obj <<
+/D [4404 0 R /XYZ 90 664.938 null]
+>> endobj
+4409 0 obj <<
+/D [4404 0 R /XYZ 90 650.3677 null]
+>> endobj
+4261 0 obj <<
+/D [4404 0 R /XYZ 90 620.7881 null]
+>> endobj
+4410 0 obj <<
+/D [4404 0 R /XYZ 90 606.2178 null]
+>> endobj
+4262 0 obj <<
+/D [4404 0 R /XYZ 90 558.8795 null]
+>> endobj
+4411 0 obj <<
+/D [4404 0 R /XYZ 90 544.3092 null]
+>> endobj
+4263 0 obj <<
+/D [4404 0 R /XYZ 90 497.1053 null]
+>> endobj
+4412 0 obj <<
+/D [4404 0 R /XYZ 90 482.535 null]
+>> endobj
+4264 0 obj <<
+/D [4404 0 R /XYZ 90 435.3311 null]
+>> endobj
+4413 0 obj <<
+/D [4404 0 R /XYZ 90 420.7608 null]
+>> endobj
+4265 0 obj <<
+/D [4404 0 R /XYZ 90 373.5568 null]
+>> endobj
+4414 0 obj <<
+/D [4404 0 R /XYZ 90 358.9865 null]
+>> endobj
+4266 0 obj <<
+/D [4404 0 R /XYZ 90 311.7826 null]
+>> endobj
+4415 0 obj <<
+/D [4404 0 R /XYZ 90 297.2123 null]
+>> endobj
+4267 0 obj <<
+/D [4404 0 R /XYZ 90 250.0084 null]
+>> endobj
+4416 0 obj <<
+/D [4404 0 R /XYZ 90 235.4381 null]
+>> endobj
+4268 0 obj <<
+/D [4404 0 R /XYZ 90 188.2342 null]
+>> endobj
+4417 0 obj <<
+/D [4404 0 R /XYZ 90 173.6639 null]
+>> endobj
+4269 0 obj <<
+/D [4404 0 R /XYZ 90 126.46 null]
+>> endobj
+4403 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F25 348 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4422 0 obj <<
+/Length 1823      
+/Filter /FlateDecode
+>>
+stream
+x��Ys�6���+��J���F&�L�i:�
�&�S���-k��eG��]�)Q$}�v<~�H���b�[ �K���v���r���Y�v�x����
�{�
+�
:Go��ZbS��i,A�
Xw0�� ��������3��]���b�9
F����$��͋�ς�gW)
����a������B�i¹�����2�R�(a܊�Ơ�E�ǾǤS!nx2�TH斀e:}�U���S�J������r�GAr�}p����!���J;��_�ES�K������O�;Bÿ�P­��
����e�YG0�]L;:�r�����q���

�*��#��JG/ʺ�o8#�e5#��&�l�Ys�
%�vx�w�D�0A�U�a��6i�s�X��(m)\χ�8~��<��/����4�rg�Z�Z�: ����su=n%�X��X)!��Â(%Lk��.�au��6V�5�T��Ⱥ�&��NI
+� ���0pn1��Ԕ�Pӓ�7H
h�������B.��}Ԗ�+�3D(�i-�H��Ґ�~���b2GW��&���d��q�L���d�����=�3���TX���
���
�Q�R����V#u�8���<��v��m���i�6�T� �hC
ن�+b$�T��ϱ�	��	!3����n�'���*ٖ0�;��l�V
�Q��W#��	�I�U�NQE
�L�%�6�����x��u�N�+p
+�����=N5��ǍB3�.]��#���
s�pMᘅ�$Ze��C�:�,�n�
-�W�[�j�-y�u���~N���hY
=�#���J�]�n#T*[�n%�Zg��N}���U�`��f�j���,�5�Zi>�/��qjP���%�ph��+yx�^�	N�C�}�}������2��ˁ
�����s|�Y�@��dC�T���Y6�(�����C\p���2b��
+erY�Pv�
[\8��ht<[Osd���#Csb�m��B�i�}*�6���s
+�}e�(%E}WQ&��
  �_�r~Ւ.DE���l�F5�Âj�km�F~<P��A��5��_�2�B:���S�H���K��ܗ��#���)�ɿ��d	��.en
+ʫL�!/M�0��&��
��(V%�D1��e�b�].i@��Y���M �@�Q�j݇�I��x�J4���ƥ�+h,��p+4f�����H��i|3?x04�����qyb,
���L
G}3�եiꡃɛ�[���:�7�-t]����"�4�Z��UC���
ڀ���ຼE|[�����\
x�}��a�:d�?��l�m��&���"��Yp
lF%oz��U�+O�rc��0,�0��ΐvoH�0,�À��-����
3b����Dבb�����D9�]��A��pa�A�Z�v*��hn�Ց�膘�*�Y<���¤��02Y�m=�P=�c�D��2?���Qps�WM,��~�k�na�󠫐����N�P��

4;k�Vvшm�Ils�l�_<��z�
M�����g���٭��t�WAM�㪥
.�pNTF�͔�����ó����sU�lDdQzo�X�\��oa?��+d�!|��62/a?%����0�,��+����y6��6@�jK��3��%Ս>�?�P�h��`�����2%b<d��Ν�ps����
�e�IGr��*��K�K#�O����og�s'*W��T�.À��,
G�}�]�0�1! �JVJJ?w�_�o;�?��H��Ѕ.��u
?��勣���
2\��|�
�$:Z.�G�z	�^
�ڼf�Ҟ.%�
�)XSS [...]
+endobj
+4421 0 obj <<
+/Type /Page
+/Contents 4422 0 R
+/Resources 4420 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4419 0 R
+/Annots [ 4434 0 R ]
+>> endobj
+4434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4423 0 obj <<
+/D [4421 0 R /XYZ 90 757.9346 null]
+>> endobj
+4424 0 obj <<
+/D [4421 0 R /XYZ 90 733.028 null]
+>> endobj
+4270 0 obj <<
+/D [4421 0 R /XYZ 90 691.329 null]
+>> endobj
+4425 0 obj <<
+/D [4421 0 R /XYZ 90 676.7587 null]
+>> endobj
+4271 0 obj <<
+/D [4421 0 R /XYZ 90 629.5548 null]
+>> endobj
+4426 0 obj <<
+/D [4421 0 R /XYZ 90 614.9845 null]
+>> endobj
+4315 0 obj <<
+/D [4421 0 R /XYZ 90 567.7806 null]
+>> endobj
+4427 0 obj <<
+/D [4421 0 R /XYZ 90 553.2103 null]
+>> endobj
+4316 0 obj <<
+/D [4421 0 R /XYZ 90 506.0064 null]
+>> endobj
+4428 0 obj <<
+/D [4421 0 R /XYZ 90 491.4361 null]
+>> endobj
+4317 0 obj <<
+/D [4421 0 R /XYZ 90 444.2322 null]
+>> endobj
+4429 0 obj <<
+/D [4421 0 R /XYZ 90 429.6619 null]
+>> endobj
+4318 0 obj <<
+/D [4421 0 R /XYZ 90 382.4579 null]
+>> endobj
+4430 0 obj <<
+/D [4421 0 R /XYZ 90 367.8876 null]
+>> endobj
+4319 0 obj <<
+/D [4421 0 R /XYZ 90 308.7286 null]
+>> endobj
+4431 0 obj <<
+/D [4421 0 R /XYZ 90 294.1583 null]
+>> endobj
+4320 0 obj <<
+/D [4421 0 R /XYZ 90 234.9992 null]
+>> endobj
+4432 0 obj <<
+/D [4421 0 R /XYZ 90 220.4289 null]
+>> endobj
+4321 0 obj <<
+/D [4421 0 R /XYZ 90 161.2698 null]
+>> endobj
+4433 0 obj <<
+/D [4421 0 R /XYZ 90 146.6995 null]
+>> endobj
+4322 0 obj <<
+/D [4421 0 R /XYZ 90 87.5405 null]
+>> endobj
+4420 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4437 0 obj <<
+/Length 1789      
+/Filter /FlateDecode
+>>
+stream
+x��[[s�F~��p_�<So�~ɔδ(���O�x[![rd%!��=��-g#)��C����s���#i��<TB!ø
Ζ<|
͏��
C�x{�o���#)�I�pr�I�	J�p2���hL0�ދ���,���^��<	�?}
%~ryx��$����������(HFo&O
�5�
+1&
(d�����@0���b�d����hL�U!�8�]:$3������V��z�˝�
���j�A��Op
���
��#R[����ʣ������t��

���O1���.0(f�p9������ߕ��#��7AX��Q���
+
b��"zii�U�i33��ץg��U�K�(�6�����`���4G
K#��6��p��^̖S�^�6ʯ_c�;� ��ۚw۾F��LKĥ�C�d� �[
L��g���0��
D=��!�#�I�ʠ�fʛ��:
�"���
A��69��j�
�E�38AZI������X7ߑ�s�`0�('�e@�1�RƜ$5ej���*	,"���@�� 
+����gC��Z��i옃sDu��V�.�MO
+�]����9���8�/�i�Z��cnj���r��uS���K��Q�uׄd�* G�3�8 ��Z�F`u����4��iA`�$V-|)x�4�d�Y:����|�ŠCw,V�Ey3oiPX
+�lJsP��:�6ZL5�R�f�Af�$��v`fP���D��
+J��
J��l��`��M�!�}Dt�;����V>��O�15H��A���L�&`
X�F�:>?q$쇩P
�VCdX�Tx��<X;d�a�5`m
&����N�g2��5�.k���iDiE�
ew�ὅ��J��aI0nJ��!�zJ1Q#ʸ��Ii�Qp�ۜ>�¤�p�Y4^cL�`^t����9⠐�i݇��!_2H6��懓F�z��H7�껤QB7���=-4ʐ�L
Ғ8���>M�
wB�
��A��1�W�c�=Y#�֬[{9�d
+�p������) ��ĕ���B�Z���A�]F\~�
��]���Iљ�q����su;ܐ� 
+n�0w��KoBl��n3ue*��m�zD��-F<���E0-�^_R�QMY��*1��z��O�
{���%ӭ��Ĉ�S�JL�
Q8��)&����|x���/�����޽{{�@��o��RU��

T*B4�-S]_��EvP�EYXF+�]Y���.?gC��P
+�c�\��9�	$�ʲf!
�4Y�m�[kw\8"D�=�bq����8^8d

k��n� P`�*H�4N��ϯm�X
���w��Օ"�s&8�Z�B!����ddx8�FF�!azY��H'�c'�3����-�ˏ�
��m�������� v��2Ջ�.�t�l`mcu`�=\�I��=����c�g�v�T	�)��*��� ��u���M?@��}�8	��|T�⋖�7��S�!ڕ<hO
=y��ѓ�g&��K�І�H
¿�`Hja���~����_�� ڿ
蹡�NX����YP~��U響��虣g���9�����pr�.1��	��'����V
+y�C`��<�!�
�y�1����W�D�����+{4��,��������u��h-,��ӏ*��9rnE��CYP���*
+4n��� ���
+��h�Ky��a�돍��
�;�smj��+r��'i�:<8���@�5:��U���`�Z
���1F��)z�j�]j�� �Ra]���j,��"�@0qt%���U��Mרendstream
+endobj
+4436 0 obj <<
+/Type /Page
+/Contents 4437 0 R
+/Resources 4435 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4419 0 R
+/Annots [ 4448 0 R ]
+>> endobj
+4448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4438 0 obj <<
+/D [4436 0 R /XYZ 90 757.9346 null]
+>> endobj
+4439 0 obj <<
+/D [4436 0 R /XYZ 90 733.028 null]
+>> endobj
+4323 0 obj <<
+/D [4436 0 R /XYZ 90 679.3738 null]
+>> endobj
+4440 0 obj <<
+/D [4436 0 R /XYZ 90 665.2304 null]
+>> endobj
+4324 0 obj <<
+/D [4436 0 R /XYZ 287.7769 590.6038 null]
+>> endobj
+4441 0 obj <<
+/D [4436 0 R /XYZ 90 574.9262 null]
+>> endobj
+4371 0 obj <<
+/D [4436 0 R /XYZ 90 527.0996 null]
+>> endobj
+4442 0 obj <<
+/D [4436 0 R /XYZ 90 512.9562 null]
+>> endobj
+4372 0 obj <<
+/D [4436 0 R /XYZ 90 453.7971 null]
+>> endobj
+4443 0 obj <<
+/D [4436 0 R /XYZ 90 439.6537 null]
+>> endobj
+4373 0 obj <<
+/D [4436 0 R /XYZ 90 380.4946 null]
+>> endobj
+4444 0 obj <<
+/D [4436 0 R /XYZ 90 366.3512 null]
+>> endobj
+4374 0 obj <<
+/D [4436 0 R /XYZ 90 307.1921 null]
+>> endobj
+4445 0 obj <<
+/D [4436 0 R /XYZ 90 293.0487 null]
+>> endobj
+4375 0 obj <<
+/D [4436 0 R /XYZ 90 233.8896 null]
+>> endobj
+4446 0 obj <<
+/D [4436 0 R /XYZ 90 219.7462 null]
+>> endobj
+4376 0 obj <<
+/D [4436 0 R /XYZ 90 160.5871 null]
+>> endobj
+4447 0 obj <<
+/D [4436 0 R /XYZ 90 146.4437 null]
+>> endobj
+4377 0 obj <<
+/D [4436 0 R /XYZ 90 87.2846 null]
+>> endobj
+4435 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4451 0 obj <<
+/Length 2998      
+/Filter /FlateDecode
+>>
+stream
+x��ZIw���W� /F����s�c��IlGbN��7�"��yf ����^�4�e�
�@�LMUw-_UW7a�OF��P�0.G��
����"���Os�?�^]��bd��T�n
I����n�ߏ	Aj2%��w��U��P<�,��yS��mq�T���͗���'KT��٭��f����ׯ	�P�c���,�?x��
F�
(n'��?�L��Sp���gf1T���x��˪m=�ۉ��z�]V]퟼�`�D���

"�Hc�^}u�4.�$V�?_}�#
�A�__aČ�'`������,�W������a��2��`�p�!&�����c�i���B����y[��h�3>~�Y�J�80
2EXQ(�ZW�����C���D
y��%ś�[Xo��\����.sЂc#R��;�rj-%��ʝFu ��qs���
�k<^���)S
i�5B�a�*��&�~ݾ_�?`�g�u��aZ���,���Wt�_
+292����$���)�����K���l��1$%��K!I9w����]�n�4�\��c�i�)���P��谟
3��
+q;i� )m��r�"m�X��V��==��#���/��Ä
+�B����~ ���[�'_#.u��"�㺞1~?S �
���]7� 4Lj�i¦n��,�|�H1Fo�R*�����\�0M�$�I�����L�����hL�0�1���!x�$�M9�
+(z��TJ�I2��Oa�d�0�z�+VB�FDr6\U(��ѯ@�[�*�7(�zs�I��Ũmu2[m��
��po�2lS�$f�R�v�v������j��0��!%���&�E�P��KR��$eh
+
+��1���qe��!<c&��;<���x��
D9Z�[���8���ʨ��p�ј1nr4�ˍ��2 �
�u�y��Zz���9~�Ԡ��
�II�#0��[�7!��Rr�W<F|
��2�
���+f��c�B�O��
����z���'��d!���jU��R�[�
VP�4��a�r�PS���-�����f�v~wV���"�O	��7mA�FZH��y���(g���a�܅F�
qW�IްE�����
쫻��@1DM��ê+Y�!��r�������?/�cX
A�����w
�� 1RI?��?(�d��D��_��c���c���`�JD
��@Q)
+�
+2^y��m�Tݦ�(!�H��
���ũ�<
NZ��
	�/���Qi=�.j���#WZ��?��m�1;͟���`^aL�U|��ۀun/]C|T�4�ϙ��9���b��Ȃ���]	�Xn>"���w(��Q�$0'5Y?�X�D��g��"���'x�du���5�G웽�vk(w7kt�$��M�� �8 at z����9�q�W��n�c���>�Cg
b*���P>Z�()N�h"��x&�	�G��s�[�'� �����ձԞ��eF��fV �L�mbߩ�5����#5ld�g�3��%#�K$K��W
�(����Hu,�@-�J��А��6�]��6�=q{�_:س�s
=�U@{���"�gU��2z��f��mv˽�!|T-�6���TC�T�5
]fHf$:���37ͦ�
���W�y���}W��rQ�O��2K�8���CFu
�����w@���C�0$=�ȡ��z�I"���R
(�x���mm��ʄ��!(T�f��;�-%�.�?Zt�� [...]
+��
ܣ
e�,�K<
A}�q�r�ux�m�.b�6�v�t�s\�q:��ND�
p��C\�,�GUg��.�
Qiҵ���.��.��u�+�qE\3�Y�'�H|�t�f�p�E����'U�kg�	����s�a\����
�*��v��4����07I�
V����=�m��x�` 
�4��
"
K4
�v��n���}x�Ӹ~��D ~���Ev�mg�J�����No�
��y�U���Ћl�%eϪ�.Y���)d~bO�N]X�	J�#�3�=W�Q*����P�JLT���[�!��–+&�{H��-�o9�t��)�H[*M݁���ȸQ]:�TP�b�?������S�
+L(����E��T��DZ�>��	;
�
n�(e��s��'����7����=�{+3}`ex���{����E��|t�M�Feo �ؤ�
DԴdD��NǏ'���JGТp�
�]:K���B1��1$I�r�4�^J(C�-�s�-��H���A��Z���K
۱s�P,_)��
f�d��U�LG�F���_,�L��*���+
å{
���.K��v�
������Ӓ9T���
�8: Is.����f�e�p
�+����H1$�#g
�sH2�! �d�dHb$�r��r{�—�ղ�+bzyh��>�fr2��/i�U��kVF�ʟK
�L��
�Z�!�q�8Q�N0d�Hv�|C3�
�M���&��&<3�
%�A�v��������'[�QіT��S��% B)�lkXg�zP�@�zC��
�n�E7�2G0��@¡/�7SvMM}/�E������d��u~��3�DŽƸ�\��L���!�� ���N�:7Ⲱ��&�����
���4��������c���޴��)h�
4� m�FJT�-Y�z�᩼P��%
':)9D(@�sK,�mO1�g
+>
5���~6�F

3
���>�G\�4Ԕ�|fX-<���%8����cE$+v�10#R�O���Nj��b2��J��$z����^�^��x��õz?�g[7��'��
+�{������,���T�T񶩩�j��4�����P?TC�g�#�����4����_l�`�}���y�|��.���7��OOOh֢�z�mТ��n�ׇ�
�ؐ����h.=�ۣ�����!^U]m���xp�0JG8�~a*�W��endstream
+endobj
+4450 0 obj <<
+/Type /Page
+/Contents 4451 0 R
+/Resources 4449 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4419 0 R
+/Annots [ 4458 0 R ]
+>> endobj
+4458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4452 0 obj <<
+/D [4450 0 R /XYZ 90 757.9346 null]
+>> endobj
+4453 0 obj <<
+/D [4450 0 R /XYZ 90 733.028 null]
+>> endobj
+4378 0 obj <<
+/D [4450 0 R /XYZ 90 691.329 null]
+>> endobj
+4454 0 obj <<
+/D [4450 0 R /XYZ 90 676.7587 null]
+>> endobj
+4379 0 obj <<
+/D [4450 0 R /XYZ 90 605.6444 null]
+>> endobj
+4455 0 obj <<
+/D [4450 0 R /XYZ 90 591.0741 null]
+>> endobj
+4380 0 obj <<
+/D [4450 0 R /XYZ 90 549.9628 null]
+>> endobj
+4456 0 obj <<
+/D [4450 0 R /XYZ 90 535.3925 null]
+>> endobj
+4401 0 obj <<
+/D [4450 0 R /XYZ 90 487.7652 null]
+>> endobj
+4457 0 obj <<
+/D [4450 0 R /XYZ 90 473.1949 null]
+>> endobj
+4449 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4461 0 obj <<
+/Length 2984      
+/Filter /FlateDecode
+>>
+stream
+x��ks���&_,�'o���3����i�='��\rCK�͉D��|�2��]�(@�(ۭ�
},����d��G9
d"C9�r0���5L8 ny
�������{)9�%���+s�$HPBӟ���l4&�����a�̋��#�������6���˦h�''oo��o��~>��_��藋o�� �4C��
���тD4�(˹��e|�j4�B�`W�u�d�#���m��ރ�Ί���^�r:,��Y�*��?�+ ��aYO`�A�$��Ѓw�D���D��?��S���\��
<` ,�����?�>
��;�.�
)���1�HIعS��!,�+hĻD�)>���
>Q*�y"vQ��0vP���r,e���hK8b��aS��E]����rZ�T����l`��Z.�ze��IU֫
+ �ĝ� �
W#24[��u���(sĨT�"(�@�����a%�����E��1�*%H�܃�0T3�v���(Wğ p��� �8
�i��1�$"2��
a
{
̂W;�h�&<C�b�
��c�
$�3�:"��!I�NM�`�s v�
��p.�.����o��E���+/ 0Ǣ
)�
��q���@�!B������n��u{1n\w^�^p�rD���:����`@:Gv�Z�Ɓa|���\�<�h �

���ڰT/VG�^-ˉ)��rm�o[g?�ud����r�L�q�Z�J�bR���d��@;h����,�zĆ�-�?�nw:�p
+�7ɄG	e2��qF�~��e�B�"��E$�$&��\��	�����^�I#9��d�S��g��{�S�2E��cc c�^e��@�)'�@ =R�G?&
~w�!�<Z�Ir����$�%*��:W�ˌsL��y&
<��}�
n�e�ȃ�OJ�dv�čY����<>�EQ��AK�_4
�ӷ��H��
�
�
;�0�^ ��Ћ��M�r�i�ʟ�6$�2H^�[D��B�@q.�ïR���b�P��
S�xVf�k �� {�a
����[�q��^�(#4)��}3�G

+��_X�)[�Hr��h'�D��*U�#�zL<|
���:�ӕv� �*Vz�-=�31;eRA
��L�y�\�e��[�
+���iS�[�x�T�UY�,�d�e�H�T���i�Ħ<��A�kW]�j8�k���	H �n���)�A������Vk;=/�n�����r�����Y�o�D�����u��BPb{]U��fٔ�r�2!.��"����A
+�7����k��
�o��.ȫ2�9=y�l��4m�P��GzP1B���Bβ]�^$W#*�Wec��L
𐃌i�zY�$�bM����5;M���>]�T����"ϑ�jwo3詣;��ut/�M
����#�������"T?���VL���떘����}�< 9g�����6W�E���:�=�ђ���Q�(MW�X?�i�[�{h�I��r$1��;-# �
��2�0�я�����h�s9���N1�-[�<�l�=y›B����Q��.j���&},9�q�DL�G�?�rz��]�[��&�
+n�7���ϡz����i�B�5�炠�l�h�@w⯋z��B"�|��
�F�t�q�]�6I�JS�,
u�N�����wv߻s���MUO�B1���.^��zU����$<f�[���!��};�\-f��6��$��`{\����؃���>������8�
)C,�Pb>
�2ս˭���;��#��궞�7
��|twI�]��٦�����G�
+�<�H0��i
�۫�^�U���U�5���	�*`l�	�V�����n�]�3��>�=:rۢ� &�?lm�g����Y��	�N`{�k�v�����<�oz�z�E��e�z&U�w4�n���n��3[3���k�\4`�>��OlJk)��ms@��y��6ׇ1��~��ͅx�bu����*�V���s���P\.4���-E�q"!⧣�W�PO�ݑ8�S�ۯ�>��*��v��n2*`;ʨR"NߗV�?�!��E0HZ}
�c�",���B��g��!�����U=�,��$�~!z��'.��$�*{��6MT�S�M��������3
+���+��ʽ\O�ec�jF]3F�>
��ج��M0��ʽ��x��
A������o4t�j\U_R

i��>�3A�$8CeV�u&�qR���h�Ɋ�Օ�o�9�pz��*ȳ$��"���}h�v�T�v�]ϖ2�{�֨ ƣ���qm�}3K
+�e�"L�p���fvƼ�ts[� V	�R�J7�`6�~�u�K�v��H#!ㆂ����kD�ݕ(L�
M�h��:���rV�+����̶J#۴�	��V�OW�E�F�U�ɺ[��n:|qK�l�����/���
^���$�t�a�@sU.'��p"RQ�	ӥ�a�TP��
�P�d$ʝ
Q<��7`ay����ؔ�1�OFc	g_��$�wa�g�!����!�^�F��bT���6�����@O?�ّ�O���k�
�k���@���QU�ឭz���K�c�HN vQ-Y�(�����
�ќG�SH��-��
}�GO�ۯ?xqt��}D�j��x����s��w?�o��L� C����$K���즜�7������?�%�_���_��8�*�%ٶ�U��|��]̇�O����N�.�ހqԧ��f�I�ڶ�
�Gw�
�K^J�R
�)��`#5
;A[bY�q���r�Gk�wΥ	��>ҝ��
c"4=ߟ���qK��
��ZS|��M�����w���O��%
�u�
xE�l���d��-�މ"����>F�Mr$v4x�?��?�T�~���$��77\@D�b:�����=�/�����>�Ж��H�a��!�����]�ҋ�+D�T
�
+��-	�(�,��C\s��XJv����u�l�a
��W���j�oV�������
��趮�
�V����x�.P&D��io�=�%?��
���.��ʼn}`�]
<H+I��oeQ
+�endstream
+endobj
+4460 0 obj <<
+/Type /Page
+/Contents 4461 0 R
+/Resources 4459 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4419 0 R
+/Annots [ 4463 0 R ]
+>> endobj
+4463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4462 0 obj <<
+/D [4460 0 R /XYZ 90 757.9346 null]
+>> endobj
+4459 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F8 568 0 R /F25 348 0 R /F13 577 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4467 0 obj <<
+/Length 1975      
+/Filter /FlateDecode
+>>
+stream
+x��Yݏ�6�_!�@�*.9��;h�6H{���}J�@k+k����v���CQ�%�����8��9���o8C���E�FZjb�P�b3��
?��j:���M��|r����%V����K�	
���͔1bf1��N_��&�&y�bt�]?��e���Wv[$�����m~W
�|��b�t�t�����U�>-f�L�,㚪)�l�v���y�a��s�}��yK�%n�	%���
%�Z�6�~YO^O^6|�D� d�x�:�MYm�*�KC�.����Qh���ͷϟ=��v,���_������~�r;��! �B��,��i:|�
�Q���U~�YF���L�kMKz���W(�he+:
jU�XT\A�F��ݴ7�W�����#4��!�WIџW�l׋��&�J��Z�a�	'�V�H7�urH=�Z
��8�.���d� atEpxإy�q0�ϴ�~��3|Za,[<d2DH
n��P��P���?,on���c0�x�O��v��a [...]
+�DR
�(+��UOW��w����7�ihG��퐻�r��I:�n1�
vI�q�
H���M�� A����ؚU4
.����\�����[O��jE?S�
��EB�K����o��
)�$�"�aZ�n��č�'�h՛��$B��HX<�<�.���ҳ��';/�����	�`8�P"���V0ܔU��[	�[,� x�A�#6
w�Aa,ѹ�� ��H����Cp�XJ�O�7��3�����ei�����S�C7%t�"�2u��g�U�
����>;L0L���|��bH"^�x�ψwEY�=#x�0��P�p�������C-��{�����]�
�����%��
:h��"K0, Q|瘺TV0e�o��n�1 �
����Q�d[|�Ό
0 �HV�&�����
27���FhL�`FN0g'�؞bnak�N�M*
�f�XW	�7s�Uբ.���&��!��~�=;��a�U������L]�ܥ����e���n�i�l���@b^���Я��:�	t������o^j��e���*�
+qaĉOiA ٗ��$�`PbC5&�K������d�j��D�k�*��
�Q��|
��@K�

�R��~�:�Ӥr��aN�G�'�Y�X���#�`��_��~��۶W�T0J�Z�n�[��~�J������M���ʇ�LU5�i�ޗO1���m�B�2K�dӃ̠���B��
S��
'\*S��m�>q�?�&�a�(���d���]��T��7}����D/[8 F87����	Hh��{5f,6��_0�8�b��V�)-sz���1_8+�&b�-Se�E���!�C�v�#�]5���E��0�]M�Ѯ���
x�Z������t�=�4^_�µ�=ᗍPӏ�q�w� 0���6BC5"
�N(m��<�w�)܍��"&�:�'�[E�3*
��L�
m��Q��v5V����T�PL�'QN���ט�r�-u��=ĥ����]Y0�|>
ꍵ93���z�Fm at 2���T�18z2x
k�O��!8��{

tl�qXzǎm����8�qƷ2�X��gz ��
�Fh�F�W��v�?Y
��Y�(4�x
��&�6ico_W��n��#V��;-5�J噐Ӻ\N?
�uvhp��W�XIT6.릖
+����Q^x����Yδ�3�֢ο��� <�`b$�T����@_5�!�wT����N
;�"4�~˯�M�
ш�4'��nO=IC�@?H��‚"[�7ꣾ7��V�}��{
"�MU �Jt:Цd�^�ٿVų�e�W�"���OI��9a��*-�M����]��vV!��c_�:=�"���
�������M}�c+��
�֊��i�g|��W���������,��g��d�kl��z	J1�5�^����1�@�+MMG��o�l��
Y�����9K�q@���@�endstream
+endobj
+4466 0 obj <<
+/Type /Page
+/Contents 4467 0 R
+/Resources 4465 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4419 0 R
+/Annots [ 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4480 0 R 4481 0 R ]
+>> endobj
+4464 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Congruence__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 4482 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 327.00000000 44.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 4483 0 R
+>>/Font << /R9 4484 0 R>>
+>>
+/Length 4485 0 R
+/Filter /FlateDecode
+>>
+stream
+x��QKO�0
��W��'M������GoUe}���X6�Ư��
+B��49Q>ٟ���0��l����B��SHx���e[<��"h�j��X�P[8����g�Č&�@.v
\�A�ܱ��Y
p��8ώ�'�$K%ޤ��|W�2
e1���u]��x�^C����vӆ�z����7q���x��t^�PE�d>���.����1�s�U!�C��)Aځ��Z��H��P/&Ȍ�c�9���	ͬ�I�SM��1�+&��г�x�ԉEK��&8i�0q����K/ڸR>Ɍ��q�_u�U7M�����;�4��`"
��N�9�m(��p<1�G��7+�Gendstream
+endobj
+4482 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142732)
+/ModDate (D:20080908142732)
+>>
+endobj
+4483 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+4484 0 obj
+<<
+/BaseFont /XCPVZZ#2BFreeSans
+/FontDescriptor 4486 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 556 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 0 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+4485 0 obj
+335
+endobj
+4486 0 obj
+<<
+/Type /FontDescriptor
+/FontName /XCPVZZ#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 4487 0 R
+>>
+endobj
+4487 0 obj
+<<
+/Length1 56564
+/Filter /FlateDecode
+/Length 4488 0 R
+>>
+stream
+x���|�����eJ��A�P(�@,K�E�d[@KK�(��I�����{���{���{���O��Rl~���ރ9GGG�{�:�{��@�A��M�N�9Q#�?o~��ء�7�\��>A���/����Ş�
��UX�ܿ��~���:�X��� ޮ�Ov{�a��n��x��v�V�omꕷ_�Ԟ
��9� F�Л[�7dW��P�o)�z�
��a
ϗ!���R�z�sZ	��� ��ԏŋ_|��m�E�����j��?sk��d��x�8��	ʳ��ז�Z��sUr\�\��Nq
t��G��ĺ��B$g at g��ɓ�s�@�]%\j�1b,��a��t�WɈ�U�_rM'���s�S�B��&�"���+��Cg	��:G�D^
]%�!��
#�P�BF�H+�>�+?F�
]%�/���3AF�b��4Q"���D��{�V�B#Z���q�'�t��\��y�=m��t�Dη�~�Htx�*��]�	�.�-.�;�-Zk��q�g��i���|�ef���0Wη���bG��S*z�83���D�3x�3sEO��3wx����E������
jM��.?������I��
��5"I��<ǣ�I��R���]����֖I�҃�t-9>>ދ=I4)��<����){��Z���
ϲ��m���a��x����-cg��ԴI^f�el�
+d�7�kq�{暬�K���>Z�w�M
����r��֐-���h#�yW�W��o!&��}��|��3�z;߻���]M�e�)_��Y����J����R�tz���ɮr�X�w�T����۫-�R��mg�L���\�e���BO{˴��|������¨z�s1�����;�
���O@'O���D���]M���4��Z�4q�

't�'x
;�
#rbW_aBw��0І{z��j4���<��[D.��<����X����.A[מ.xm��N�׮%/�Ǟ�=��[�ʥ�E�=��������^�[
+���t��<�W��_������AJ^���F��!���B�
�f]�w�|?��n�H
���d���N���7�=|�
���1��s^�J~-�<��@��ލk
�K�H�V{r?��_� >?���>MtM��&���")���`�%8�;B$$�//Wƈ!^�
J������bb$�*��:�1�X�X�X�
d4�1ƛ�������
�
���,9�
d��A�^&I��-���N��h����[x
e��y3D֛ғ�)�T����|�k�{
���)fz�q��C�;;;����{̷�W�k���C�C�{�ӈωÈ㈣�s�+�K<V=�x�8�8�����8�8�8�x�x���8�������������x�x���6��N��i�� �"����Y�9�
�_&^ ^$����{�D�U�b��_�Gz���uM�;��^���uX��"U�_z3�6
�&�%�!� .$�'��V$_�w�,ɑ<)�")�KI�TH���z$>�\�
J����0r89�\�
I�J�F�N�A�"�$~'� �"�&[���:�r,�.9�\�\�܀ܐ܈ܘ
O�I�FN '��d������$M2EZ�$rrS�C�#r3rsr
rK�&
2Mf�,钓�)�Tr+rk��Fr�
�-9�܎ܞ�A�$g���������'��
rGr'rgrrWr7rwr.��#��v��̓�d�M�������d��%�d������#�$�d�����r!��\L�E�M�C�K�G�O
@
H
D\F
L
B
J
F
N
A
I
E
M
C
K
G
O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O^@^H^D^L^B^J^F^N^A^I^E^M^C^K^G^O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O>@>H>D>L>B>J>F>N>A>I>E>M>C>K>G>O�@�H�D�L�B.!_%_#_'� �$�"�&�!�%�#�'? ?$?"?&?!?%?#?'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!���R�IJQ4�P,�Q<%P"%Q2�P*��P+QC���a�pj�
+5�Z�Z�Z�Z�E�I�E�M�P��u�1�Xj]j
�
�>��!��15��@M�Z�8�Q	J�
*I�T���I�&Ԧ�f���Ԗ�M9T��PYʥ&SS���V���4jj[j:�
�=5��I͢fS;Ps�
�����]�]�ݨݩ��
T�j�ک*OuR]T7�Cͣ�S�u���*R%��ړx�x�x�x�x�x�*S�J�S
���"j1��7��/��?u u uu0uu(uu8uu$uu4u
u,u
u<uu"uu2u
+u*uu:uu&uu6uu.u
u>uu!uu1u	u)uu9uu%uu5u
u-u
u=uu#uu3u
u+uu;uu'uu7uu/uu?� � ��0��(��8��$��4�
�,�
�<��"��2�
+��z�z�z�z�z�z�z�z�z�z�z���������������������8���������������������������������������ZJ��%l��h�fh��h�h��h�Vh���C�����0z8=�^�
I�J�F�N�A��פעצ[���:�z,�.=�^�^�ހސވޘ
OO�'ҭt�������M:E[�$zzSz3zsz
zKڦ
:Mg�,�ғ�)�Tz+zkz�
�-=�ގޞ�AϤgѳ�
�9��N���.��n���\z:G���t��;�.��������K��G�I��
+]����Bz��ދޛއޗޏޟ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�����������������������������������������������������������������~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�^B�J�F�N�A�I�E�M�C�K�G�O@HDLBJFNAIEMCKGO�@�H�D�L�B�J�F�N�A�I�E�M�C/��e�d(�f�e8�gFd$FfFeb�f%f(�23�Ό`VaF2�2�1�3k0��5�����f4�3�ˬˌc�c�g6`6d6b6f�3��L+g4&���$�I13�لٌٜٔقْ��I3&˸�df
+3�يٚ��l�l�Lg�c�gf03�Y�lff�#��3�
�+��;3�ك�1mL;���N���fz�y�|���2E���1{2e��T�~f��Y�,f�b�f�a�e�c�g`dbfaecg�`�d�b�f�a�e�c�gN`NdNbNfNaNeNcNg�`�d�b�f�a�e�c�g.`.d.b.f.a.e.c.g�`�d�b�f�a�e�c�gn`ndnbnfnanencng�`�d�b�f�a�e�c�g
`
d
b
f
a
e
c
g�`�d�b�f�a�e�c�g^`^d^b^f^a�0�2�1�3o0o2o1o3�0�2�1�30213�0�2�1�3_0_2_1_3�0�2�1�3?0?2?1?3�0�2�1�30213�0K�Y�%Y��Y�eY��Y�Y��Y�U�;�]�
ʮ�c��#�Uؑ��j����(vMv-vm��
ͮÎaDz�������
�
ٍ؍���v"���Y�M�:k�I�dS��Nb7a7e7c7g�`�dm�a�l�Ͳ.;���Ne�b�f��۰۲�������Lv;�݁�����������������e�`sl��v�y���b��
v
;�-��l�-�}�l���U��]�.d��ٽؽ�}�}������ك؃�C�C�����#�#٣أ�c�c������ٓؓ�S�S�����3�3ٳس�s�s�����
�
ً؋�K�K�����+�+٫ث�k�k������ٛ؛�[�[�����;�;ٻػ�{�{������ه؇�G�G�����'�'٧ا�g�g������ٗؗ�W�%��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?�R�_��H��h��X��xN�DN�dN�T.�
�V�r+sø��nn$�*��:�7�[�[�[�k�Fs�pc��ܺ�8n=n}nnCn#ncn<7��ȵrqN���\�3�gq��M�M�͸͹-�-9�s�4�Ნ�M�pS�����i�6ܶ�tn;n{n7�����v��p;r;q;s�p�r�q�ss�=�
�Ƶs
\��亸n������
+\/W�J\�'W�*\���p
�E�bn/nonn_n?n� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�n	�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����'x��x�gx��x�x��x�Wx���C�������0~8?�_�ɯʯƯί���������[���:�~,�.?�_�_�߀ߐ߈ߘ�O�'�|�������M>�[�$~~S~3~s~
~K��
>�g�,���)�T~+~k~�
�-?�ߎߞ����g��
�9���N���.���n���\~>Ƿ��|��;�.��������������ɗ�
+_����B~��ߋߛ߇ߗߏߟ?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?��������������������������������������������������������������������������������������_¿ʿƿο��ɿſͿÿ˿ǿ�������������������������������������������/���(��8�A$AAb�a%a���0L.�VF
+�
+�	�
k��5�����a���0F+�+���6666�
��B�4!!�!$SH	�0I�D�T�L�\�B�R�GH
!+��da�0U�J�Z�&l#l+L��f3�Y�laa���������������0W�C�	mB��!�N�K�z�y�|� �
+E�$�	{
+e�B�D�,T�ۈۉG�~��V�Qaq�q��PXD\M<&,������'�#�"���������NNNNNNNN��������........� ��������nnnnnnnn��������







��������^^^^^��
+�	�
oo
+o	o
��
+�	�

+	
��
+�	�
__
+_	_
�g�
+�W�
??
+?	?
�g	�g�	�	�
�
+'	
�K�E�8G$EJ�EFdEN�EA��E�8�8�8U�EETŘ8D\I
*�,��#�Uđ��j����(qMq-qm�E
-�#�NJ�������
�
ōč���q��*�EML��h�I�S�%N7777��m��bF̊�8Y�"N����ۈۊ�������Lq�8[�A�#�(�$�,�"�*�&�.��sb��.v�y�S���
q�8_,��bQ,�}�bY��U�_\ .��ŽĽ�}�}������Ńă�C�C�����#�#ţģ�c�c������œē�S�S�����3�3ųij�s�s�����
�
ŋċ�K�K���ˉ;�+�+ūī�k�k������śě�[�[�����;�;ŻĻ�{�{������Ňć�G�G�����'�'ŧħ�g�g������ŗė�W�%��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?�R�_��H��h��X��xI�DI�dI�T)&
�V��J+Kä��ii���������4JZSZKZ[j�FK�Hc��Һ�8i=i}iiCi#ici�4A�(�JqI��.RR2��dI��M�M�ͤͥ-�-%[r������+M��HS�����i�6Ҷ�ti;i{i�4S�%͖v��H;J;I;K�H�J�I�Ks�=���&�K
R^ꔺ�n�G�'͗
+R�T�JR���T�*RU�H
�E�bi/ioii_i?i� ��A�@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�i�����������������������������������������T�W&dR�dZfdV�d^dQ�dYVdU��C�����0y�<B^E
)�*�&�.�!��הגז[���:�y���<N^O^_�@�P�H�X
/O�'ʭr\�䄬ˆ��M9%[�$yySy3ysy
yKٖ
9-g��ʓ�)�Ty+yky�����<]�N�^�!ϔgɳ�
�9��N���.��n���\y9'���r���;�.�[������+��'�)��\����By��X�K�[�G�W�O�_>@>P>H>X>D>T>L>\>B>R>J>Z>F>V>N>^>A>Q>I>Y>E>U>M>]>C>S>K>[>G>W>O>_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_~@~P~H~X~D~T~L~\~B~ [...]
�
Սԍ���u�ڪ�UMM��j�I�TS��NR7Q7U7S7W�P�Tm�Q�jFͪ�:Y��NU�R�V��۪ۨ�������Lu�:[�A����������U�Psj�ڮv�y�S�R��
u�:_-��jQ-�}�jY��U�_]�.T��սԽ�}�}������Ճԃ�C�C�����#�#գԣ�c�c������Փԓ�S�S�����3�3ճԳ�s�s�����
�
Ջԋ�K�K�����+�+իԫ�k�k������՛ԛ�[�[�����;�;ջԻ�{�{������Շԇ�G�G�����'�'էԧ�g�g������՗ԗ�W�%��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?�R��#cT��116����cRL�)15�
��[96,6<6"�Jldl��j��ck�F�֌�[;�
['6&66�nl\l����
b�6�m
��k��cZ,�cF,3c����$�il���-b[��K�2�l̍M�M�M�
+����@$�J����i�"o���˥"�
$g���
�\��]�*���\ �t{O������_$��R��T͵��U�=R�L{�VdG 2^��*�`
�� 0�
);PP>R�,����%�}!O�
��.��euE�2���ۛ�EW݅<������Җ+3��nj��Б�z|�OEMzP��AMz�����{IM݊�'oU�1o at W���j~�EW9�/rŎ�vnZ�����
+�P����.�iA|�L�j��ܶ�����m�/�?�m�|1h�b���T��
:[���.~:*_B��/�B���_�ʕ�{
���Z���f1��f��P��aFC93��*��g�5ce@���=����fW�v�U��j�#g
�t�lԥu�
ԥ���rO����Tg7ԫ�������\�S��:}�:}���
�p/_H;
޽"�-��]��v�V�8$j�J@�d҄LAZ�6����@f!�@Z���o��\
�p-�Z���k��\
���N�.��l��3�٨�
l�6�m`����m��
l�6��,;����tP_��
`;�v�� ��l��
��A��Ѿiु�^xiु�^xiु�^uM��iু�~��g��~��g��~��g��~��g��~�Y�g��~��&����=
�,г@�=
�,г@w����
t�.j�ϵ$��)�I��T��2�2��J!W��Ҁ��B�!5��i@&!M��iC:�i�
d2��~
�q�ǁ~
�q��Mef}>��_̪���]�Y�G
04`h��PG
u�PG
u�PG
u�PG
�k(?�:&P��@

�7p��}#���
�g >���@|�2��x
ē^x`1-	�$��K/	�$��K�=��xI��3�g��	<x&�L��3�g�D=M���	|��/
����4����_�Ki�/
����4����_�Ki�/
��Y�i�/
����4����_�Ki�/
��Y���k
���4p���
xAC>א�5�s
�Y�$ĮrnAޛ`m��Sj�/Ѫ����΢C�IH2�v�J�sm��Oِd2��
bN �$�O�'	��I�$�|��#�x
+҂~
�q�ǁ�\�@.Ih��4�[K��
���A�I �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�D�H���M���M���EBJ �$�0��	L�&d�̲�R�TQ;z��|���_Iv��;�b�X��
������xkL�,d��?�M���S[!�뜥����ih��ހ��X������9/��y3
x���-��cgu{Sd�����
Oo[G�ڦ�ڶ�ڱ�G�v=��;���7G����ޮ��N{����0��L��h
�k)5����~>�~OX�������g�j��U����9
e1{ժV�Y��V+���W��W-�IS�~jQ�����G��K\�V�8�
����t�W�v�wɖj
�Է��e�TJ���_�k����L
$��X魭b���'��c��H�"m�
iF�%#͌�T�Y����0���Ld	��zTn<*-
��J�b�"֢��(N-*O��Ԣ���d-*9���JND%'��HD�#a$"�D���0�C�0�C�0�c�]�C�0�Ch��d�D2z"=���0���(3�Ōb1��ͨd3*ٌJ6��SQɩ���#a�"�T���0RF*�HEV�aEV�aEV�aEV��Հn
��@i!V<�9��H��pk"��H3"-if��"�~87��+�C<��p7�cU�cU�cU���h&�O@|:VF:v�:VHzX&VHz�&�s�+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
�|
�|
�z
�z
�z
�z��
<x����������������������������������
�cE�cE�c��c��c��c��c��c��c��c��c��ce�ce�ce�c��c��c��c��c��c�c��c��c��c����L8Szx����������5�
_�
_�
_�
_�
_�"�,p�� �|
�|
�|
�|
�|
�|
�|
�|=d8��u��u��u��u��u��u7�3��3��3��3:���4!S�a96����@f!��
��:�u���ׁ��1t���ׁ�_�|
�:�u�col`)j`ol`ol`ol`ol`ol`/l�Þ����0�����������=��=��=��=��=��=��=��=��=��n��#�#�#�#�#�#�#XrXr�#�#�#�#X��#�#�#�#�#�#�#�#�#�#�#�#�#�)۟�^\�&/20RMk�4-�KD�
iF��"͌�MF�dd��&Bܤ
��ңt-zB��0�$NR�tx/�
ЌHKF�i�H����H�G�i�a��a��a�F*�HE�#a�"�T���0RF*�HE8�0[C�� �:���4!S��
�@�!�1jb/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/o�C�,d0'L��M
��5�c;ob;ob;ob;ob;ob;ob;ob;ob;ob�n"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qPO�x9�D�7��M�x9�D�7��M�x9�D�7��M�x
���8�0N,�
���8�0N,�
��j
�s Ӑ�,dP
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
���1��c 
�@Ɠ��da<YOƓ��da<YOƓ��da
YGƑ�qda
YGƑ�qda
YGƑ�qda
YGƑ�#�,�,�,�,�,�,�,�,�,�,dy
k
k
k
k
k
k
k
���
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+������
�\[O��_�.s��ʂ\9'y���J�ܕcjf���W{jjOOM���ϲo.����%_�=����n��.�����.���_����ypX�j5��"�vt��

p*�Vנ���1���������_������ϲ���߮�W*�-�ٝj%�ϯ��V[��*�s��J�s�r�vOM��
+M���?����Z{�ˑ_>���L���>Н���\�:���{s���_�y9���=��(zD����
+�Zkҽ��RͧT�����$�mZ��k�;K��[g��~�gQ�~%� _�����
�=�|�h/�ޞ`L�j[N��ߗ��B�.*=]��E{��/�/��_h���
}H�E!_���e$�
�x�X�ǽ
���?6�����
�c�wl�
ޱ�+6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��6�����a�?l�
ް�6��_��	<a�l�
^��
6x�/���6�<o#����6�<m#O���6�<k#��ȳ6�<k#��ȳ6�
�A�ȳ6�<k#��ȳ6�L6�L6�L6�J6�J6�J6>O��g��y���m�����������6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��;06N�l���8%�qJf���)��S2�c6N�l���8�q*f�T�Ʃ��S1�a6N�l���8
�qf�4��i���0�a6N�l���8�q
+f����闍�/�^v6�(gL6Θl�1�8c�q�d�����3&gL6Θl�1�8c�q�� �9�{򞃼� �9�w���<� �9�o��� �9�g�<� �9�c�|� �8�;򎃼� �8X�:�;�|� �8�7�|�`
� �8X�9�N2��|�
y�A�p�7
�
y�A�p�
�y�A
p�
�y�A
ppR�`�;��N�
�����w0�
�s����v0�
�_���<u𮚃��`^:��楃�k����tpz�`�:��槃��`
:��桃y�����|s0�
�6;�o曃�����ٰ��ag�Ά
���?i�O��F���?i�O��F���?i�O��F���?i�O�9���F~N����4�-�~K�����i��4�q��F������i��4�9�~L����4�1���F^J#/�����Ki�4�Ry)����R<�y2�A& uH2	iB� -HҁLCf ����?�8����?�8����?�8����?�8���׀�_�|
��5�k�׀�_�|
��5�k�O ?���O ?���O ?���O ?���ׁ�_�|
�:�u���ׁ�_�|
�:�u���7�o � �|��
��7�o � �|��
��O?	�$��O?	�$��O?	�$��O?	�$��7�o��	|�&�M��7�o��	|�&�M�.7�A�[�9�{�
}!�	��Z�\
+�)ী�~
+�)ী�~
+�)��B�-��B�-��B�-���|
��-��(�F�6ʵQ��rm�k�\��(�F�6�e��^6�e�^6�� ��|��
�;�w�� ��|��
�;�w��~�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y���ߍs;l�/`�
t�.�]��0�]��
�v��.X�K�`i,킥]����gC:�i�
d2��
�v��.X�K�`i,킕]��
Vv��.X�+�`a,삅]��
v��.X�
�`a,삅]��
v��
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
vu��������.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q [...]
+�J�â�B��,
+u���(��?;�
�}�]�0z��A	^�#��0����T����A�A�At�G=T� ����|5�ώވI$�l���E��7�L2�*L�,��W��0o�$㉀=�	�3\�%�'�,9<iCKV������“qH %��|��r�赝�T�[�7 i � d�ƞ�E�������"�Z��7,.�\0��I��DhI���'uHēD<IēD<IēDS$�I4EM��'�o��	|�&�M��7�o��	|�&�M��7]1W.��~
?�k�}�/˵f
+nv����
n
�X���亼����8�j�I�E��~��W����/؋��]r9����%�jO� �{����q.x�o^���B���5��K:��¤������un.4�ŷ75|[ӓ����/�T����0ZJ_��W*��
�\���
+y�P��i��~ـ՛�=�j-
��<Y���;��a����̊�n�u:K�<_���)��jZ��մ`��I
"��;��L��y��m^[�‹ڏ|U�}i���+��Z������_�����c_������R�"^��}���]"Xgx�i�Lo�S����x��3$ uH2	iB� -H��
+l�/0��tk��`��I
2Qs��
B
!�͚�^��!�ǐ�s@
q� �34����4?k� 
! YH����!$MC�#H��4D�!dQ�j��UkO���`񮵆w�5�k��]k
�Z{ҏ��+ `��ek
/[kx�Z���^��𲵆��5�l��ek
/[kx�Z��֞�����)�ň��%a�>�E
}4#tn���ΉT�)f�$C�H	o�!D<
K��P��9,Y���x�d=|܈*����V(��%�FN���}UG��>9�FN�l�]4q
+M��
+�����)t���*W���j��[˱�O�c~ }/

l�������-�{*O�!�n�r��
�>:�J��)^��
;� �
nJ<�
8)�/{�8�l����{�+�|]c	߆H5�@�5z(5��iB� -HҁLCf ��n ��$�#"O'�GG
:��ᧇ~IHĥ#.
q�KG\:�����t�e .��
��7�o � �|��
��7�o � ~�I�'��~�I�'��~�I�'��~�I�'���	|�&�M��7�o��	|�&�M��7�o�~
+�)ী�~
+�)ী�~
+�)ী�~
+�)ী��|
��-�[(�By6�l�����8m�i#Nq�(�F�vX.���8m�� N��
�;�w�� ��|��
�;�w�� �~�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g���
|�.�]��w����
|�.�]��w�
�d�t/@g���
N�
�
�4d2
�2�Oƅ�R��b�<��v��=�j����;;{��	��W�\����%Ofï�
����KL�� �:d���'S�_����c�Ϥ!E�Bu񂔋�<��!���¨�"t���v��Z�R�x���+T.^��$j��\
��Q�����k`�aI@�Q7=D
+�溙ڛ�=Ş��J���\�r9��-����u{�F9x��%�u����S}]���r�~x�_
��K�ܶ@�s)���{��
���sW��^�pi0�Qz])�\�՗�x@�V��A�s���Q{a~��b����w
���o���ιm��Vg�
P���0�\�.�Je��N��(���:��Ź!�����H�w�x_�ކ"��
�̽u�Ł^���q_���ڝ.��
+
�0���y0T��"�J7L

0y}�j�
"U�;
�C��CM�k�>�B�6ں��+�o/\å�T��N%4���<��u���6������{�%h�j���U�{��(^�H�ˑ�
�I�jA)E��
Y@�ޠ��h�Ł�B�
+z�
�#��pR�/��^���v1h�.�����P�U/u at G�׮���Br���]ZC%
���`\�I����ڃ���F�_����I�[�n(����+\��
�慦y�����Cm`X����
����`B5��EL)ԻC�����iq9T1�B=
�D�Etp_���c)�L
Lp�ًh�*:�V!��0t����Efb8b:FLFG�
;�I'����7���P��tƌ�KACw�v�
Ak)��#�b4��rJ1l�"jW�j7�g�a�A�"5�>E�0l4e�;T~
+���)�}���E�d��K_�j��
+Hd� �xۢ(���mhǶZ��B���Bz�vz�����,�F1L�}>L��RC� '�ao�g[[h�:��!��¯74��BC8a-x�%���,�â00�
+�`(�!�Bv�>�0���
+���.) .�
��PS�CS5T���*��;�lXS�P����D���P�,�x��� ��/,!윚�
���Yox�^
O
$&Ee��+an�CC%%K
PQ^��S��[e`�U�W	[.
h
���D��Se��*a��(t.Xݵ�
+�:����gw�Y.� �Gd��[(�-\ʴ�K�œ�&��0��!��e !���
��� S���Їg�p�-,���FK��%.E�x0z���؆�!����ϵu\��Xt}��+���*����V��V��ּ���5<U��U�n�A���Tm��c ���":��h(���|MU�:=�~�϶^H��uHC.�0����[�V��V}Ӵ�?���T[�Sm�Sj0 ������\o}��ѭX�@z���|-R_`!
r0���+
aT�ھ�
n�e���Ju�Q(�:ĺΩ�uN%�ࢮҕ�JW+]��.4ޮ�J}/T�[�m �n�U+���n�u�C�2mp:`@+7X���ߋ���U0�nuu�_��
��o�7�1��ּ�2�_yIW�4�6�z���fm{W_N�
��PhC,

E6�j(��ޯ�����V[í��������B}	���x��α���\n�j��8B�F@�,m
�-U������&��%�{koWM��bF�*:�2kc�m�(< �|R�bAI��JX`Jc�	���7��-s���8,�P�����X
/��˿9-�'��R�êX���
��[����f��j�0�
a����~�A����E�����e"=��k
���`

���P�n����U��k[P	��	c���4�r�PI���'��_�L�Z�޵��pw�G�	m���Q��z�B����"n�oƳ���A���sa��W�W=����9aA��x$�Mʈ�ue�
����QW��
V�6���
�
{�HS���x'�w�2F�7�^���[?UW�x�vi�H-�*�F���`4�S͌v���1|��W�H��1�`\�謯�6h
j���f.��"�$�e��,�	+��X�֬�T�vN�g5��#N3c�
њ���mft�u�=��Œ�5)4Ѭy͚7�l'���D�FL4��I-�hM�n�^M�hM�n�`MFZb���46��fe��3e���
��
ԣ!�f�O67����
�
�ơe�������qq�Y{��yh��(�����հ�K$ZC%>��\hR��
�!.3�QM�>���l6���2�� ����Q���>xMx뮁�o���1�%�0�em=�
-T����*�P1C%*��Le�4X�5�ó� [...]
��FX�j

˖�dݓ�P����c�
F���ud��Vԉdb2
1��
C
=�B���p��05������b��f�h��fj���h�Ѥ��[?�j%R���
+�uÛ%��}N#i�63ƛ���2y�����P�/g�_���A=V��n��x
����q��
+<2�z
��X�`iL�+�6��V
��廎ZQ*n\z� �A�}�rF@�Ǡ#@�o�A�F|c8h�$훐�&��N�%B㤬��f;���BS��Հ
O�
+��w��4��)�O��g
+H�Y�	W!����k�V0��<ڠ
F}PM�D�
*UW�r�f�m�f��?���h��X�шёЗ�V��z��2٪�G�`��v��v�%�ra�+�0����c5s_� �?����;�����_wd��
+:�ֆ�'����{Ͷ:��uK�J63�͌�fF��1�̘if�61ډfF���Y��f��͂��o;͌�jd7��ݴFn��536��Ӭ�N��s���iVw�j0n�����61��f�1����,��i���.�Q(�n���DIt�V����{��>����ܛžw�������2scP��Vզݴ��VU�?V5��ܳ�����V5�X)4d��(;�jf�����e�e]VݹT������d'�U��e2u�o
��٤,xd��1*�2
�
���M���ݺ���en�Wt�n=h���B���<��/{ٛ��4Wpө﶐l��mѝ�����GU+K�e{�#?>1>>�����6XA*
(c �;�?@�a��]��;Xjo�+�.�����Lwi�c�9����^}��5͊ntCMV0��0�H
�aZ�d
x
�=h
��q
���d,xd
ԃF�
�
˙dMz���H�?1h5C%<:h��/Z�7<X����Z��k�4�[�#j恔�\���k��
�챰>a����A�0�5�
��rt�����hэn�?+�_
�-� H?��P�B%*F�$C%l�DX`�wg�t�z%��~l������&z����G���!�Fk����ݨ��ߢ&��f�T3���h73:͌�f�L3c���mb��C�1�̨53&��f�f�i7kO�Y{����n�tv����5�ݬ��fMg7k:�Y�9�Z�i�JN�q�5�ӬA�f
�4�
�hE��Q���x3(Gv�Gn6�GX�h51���f��H��p�ōD��b�J2T���"�E|൨e#h�Ҹ
q���
Zxӥ�ֹ�!��4���i����]����
+T3^�?j���fFtT��ǖ1Z͌v3��̘if�63�M�8�]ƨ53&��f�fu�G��f�f��5k|����Y�h�Dk� �f
�h����7ο�GZ�5Bk�Fhm�����)P��imV�x��śuk�Y���7|வ�I�135KM=fz�\�4dE	<�E
I�}��M�A
=�
=t4}��OS���5������G�a�|?�<nc��#�ü�mK�?�K�$����<�[b
A
�͕�M&Z��2r̸�ƍY�熮4r��V�T��-�8z\[�$rҤ-ȋ��><�i�����_��3��#��Yz��
D�z��G�5'�K��t�[�q�K?[��e�޴���@�y)
�#.!&�.!X�
#F%ۨ�ރ]���Wxf/��<��=U!Fz>�yn��c��n�
+9�
�н G3��W�i�F�S=��J��#�co�j��n��
+������9�]rc���=7�svz}��_^zs�ҥ^���s�_��K;;=�
�}���lGĉ-����b�*#���`7f��ƭ��4��[���m��jW�ύ�9T"�d|�HWRV
6e��c$�Sƌ{`wg�������!�n~{|{��97u�9��vN�~&[�c����
9E��W�}��CF����0-�&��4~�1���(}���S�-=��F�\#�۷��Z���L�Zl81֫Ab�_B��R�z#Ɛ��%Ѐ���o[e�;������%
�Lrɉ3'�ߦrœ���%�<}�����\���'_�qG�7
X���E{��Ne�Z?n���O��
���Ϲ����A[�! �b�tW�(X&�U���P�q
+)�G��CG�0y*��UEc�s�F7]H�-(�6%�1�
�J
k˾{�J�d.s���=�|�}���}�m�K�C�|����w�-[7��u���cI�����R�{׺�{;+kv�?�.!��绵�^��ᢘ�4�=�4
�e"��ʈ=2,�_Q-�9r�pwؒ�ʫ+�J(�rkvrQz�!=�$	h&�����s���6C��!5V���Y��,=�@��i�O/��1���Y�{d�ݼ��o%$xAy�
�I��:�[7����
�Tm��}�zUl���+�!4��ƬH��q.SߟFܹ�Jy�ل��*���sx�=��3!���o	� �h9C>0*c>�p;�c0��PY��fJVcҐ�k.�.�9��Оdra�&As�!
����0�sZ.p�d
'Xn
��c�1�n�Axĸu�T�c�g篷�d{�f8h�
Q�OO�%��
Y]
�բ^�%~��$Ŏe�;�
ExR��Y�wд�2T�+��&�|��+�Lx�lW��^��i��v�1��n8�(�!Xk��m)B��t�������螞�����WD��滿����
���7��L�!�j�"m֎�tAЅ�Fc7���;��?��	Vk`�>��K�Í
G�N�z�4�� T���x�
���㇆�<݂��
OQ~�"e v��P�(V��e̎�5W��ϔ���7.�2
C���Y�e�|b�-ĕ=���g�.v�>��~��B��'�N�����
s�E	����C�B63�
0�t����7�F�_)!b
�o_ٺ���w
��;��ܜ��=��m*J�U��ށ��#8�eK�G�O
kc?,�6G���M��
���6���Єb-m�㋕�T|ӭ���ڃ�S���h�o�WO�[F-���i���~^��	�7���<2T
&�٨C\�-�D���c��y�x.�F�g~g�EɮuJ=�`f,�#̔���qBq��ɳ
���|1<&d^F~ȨkT���с)���q
w��2���.�
��k�Dq�?�oϦ/,G�.�҅��$
���`y���&�5~m�;�8_-u�
�U�
�K5�
ɰ�g����r�:��w|�L�� ���
��ꈎ�)��=P�f���i�|f��
l����
q�A����I��"��`��2e�g�,��Cq5UKD�	%d��ڴ��X���Rk
��M4�#
+�)�u��qU)��M��2Uii���)���=[]g�P��K���>	Z���0� ��?M֘��VS3���
�a25��D#���$�f6�p�/q�Ʈ8
W�O�s“�-�)����A� N�#�7m���
8p���
8p���
8p����W�_ba�,��|/��d�yFo0|���
�~��e(vy\�*!1)�Դ�L���Bw�
����7(��n)&?���1�*�-�S�!�C2�̶�'�q
�@b�r��
+%�D����;�(
��
�	��(�@ۜ|T���똯����|:���^�`����J�E���w�N(
:�(�,t�
+��
+�)?�`O���?��� 1���Aj������b�ݨ���<8��� 4����]|�p��̥��ψ)օ�b���G���]�9�q\�?�DAtendstream
+endobj
+4488 0 obj
+20990
+endobj
+4475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 163.9158 164.0421 174.8197]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_ba7dbedd485eab91821f129132a04723) >>
+>> endobj
+4476 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3792 163.9158 241.5109 174.8197]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 125.1021 164.0421 136.006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_3a4c3af6146717b3302f467368eafe46) >>
+>> endobj
+4478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3792 125.1021 234.8855 136.006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 86.2883 171.7908 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_b45e800217e1c61d8595e2ffc51a83ad) >>
+>> endobj
+4481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4468 0 obj <<
+/D [4466 0 R /XYZ 90 757.9346 null]
+>> endobj
+4402 0 obj <<
+/D [4466 0 R /XYZ 90 636.6114 null]
+>> endobj
+4469 0 obj <<
+/D [4466 0 R /XYZ 90 622.0593 null]
+>> endobj
+2063 0 obj <<
+/D [4466 0 R /XYZ 90 573.5753 null]
+>> endobj
+4470 0 obj <<
+/D [4466 0 R /XYZ 90 559.0233 null]
+>> endobj
+4224 0 obj <<
+/D [4466 0 R /XYZ 90 511.8194 null]
+>> endobj
+4471 0 obj <<
+/D [4466 0 R /XYZ 90 497.2673 null]
+>> endobj
+4260 0 obj <<
+/D [4466 0 R /XYZ 90 467.8222 null]
+>> endobj
+4472 0 obj <<
+/D [4466 0 R /XYZ 90 453.2702 null]
+>> endobj
+1427 0 obj <<
+/D [4466 0 R /XYZ 90 372.5295 null]
+>> endobj
+166 0 obj <<
+/D [4466 0 R /XYZ 90 365.8664 null]
+>> endobj
+4473 0 obj <<
+/D [4466 0 R /XYZ 90 182.8693 null]
+>> endobj
+4474 0 obj <<
+/D [4466 0 R /XYZ 90 182.8693 null]
+>> endobj
+4479 0 obj <<
+/D [4466 0 R /XYZ 90 105.3614 null]
+>> endobj
+4465 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R >>
+/XObject << /Im2 4464 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4492 0 obj <<
+/Length 2873      
+/Filter /FlateDecode
+>>
+stream
+x��\[o�~���SW*��K�>�iS`w�f�/�
a,�m!��h����pfHq."�(�C� ����o�
�
��dd�H	�
�r4_]��|��+�\���i�����;)FI��澲 	������cB��L	�x�aB�8+V��Ä��f��������m��o޼ݬ�}���)x�v��v�Ǐ�}^L�
�W	SX����_o���Ǎg�<�`�X~�]��+
���|�3Z���/c�hu�)s�,�>]���������@��єq�%�= "�����[�SE�RpO�G�)��'�ae���lT����b?/7Bƨ�"�����]/��
=��57G��4QJ�AР;�sę�#���T�)�]T�Qh��#�	s��7�Cs�c\@,e��õ�ݰ�QBp��
�
��.����O=�J ��>�?{O9�Z��7ۼȠS��ˁB�t��s;P�3%
+aM;A�
<߬we�5g�/�:��=>E�g7���P�6�8Tʻ�X	�m��ā
S��
1���6��H��0K믻��a���e��m7�1Β�G*��Q�����#1�T�q�t�	
����|�	��- Ի�f=+���
�4�
�I�i��@�R&���Z<w�l��<۾p
����ѩG%(P#���톄�Q)�ꗃ��wE.����%��FL<f)~��}�n�1�c3�9D�V�}��S^
���*��GHL��n�~�Oy��`��)��t
�j|u q$�r��q��1��0#�5�����
��*J�����
�7�C��zن~�n��	6�t��d9+�lQ�޼��嬰S���E�9jD�����4�v-�y�f��H1J���j|���F�ۮ_�)
�S���	}�����++���"���	
�G�0
!���E��Լ��������X�jPǓV�u�;t
���y��54{�C����
IxX��2t
�ث%4a2�k�����P��DB�dB

FZ¯Kh-��'�6�Z�f�n�u
7��C��7�ݬ̋UOΜ *E<V����lP0��4���!5"�s
ڈ(�ÎK��]�y�?� 6ɖ�;�
p#1�'O��PrIur�z��)u:XZ����:�~�:C��@�-r��3J�o��\m�����GBCnX�#�Q)�0�(NH�e^ J��\}�(1Q:XO�YH��XL�W+���.Zn:*vA��ģ�Я�V�m�f.)W
u�$%�v�Z�(�[1E�NXv�
V
�ݢc���c�az�1�c3\p�
XqT�I"���Aqϔ�%� ���
Z)�slq�
Հ�礐�F$�x�}���e��.�n@�PyH�e����Y�פ'�s_+�pel�.�Y��Hn��Ò�%4�$�����{��,{~�4%���
+v���ݪ����XX!=-�%|��S��F�x 
*E�0�����\P�!!�%��FL���J����B��
vs�Qk�h���y���ʹ~P�\!m�!�j�G{�]�vG�z�"n�#""o(Ġ����7��2hJ���w`0&�_/��o\�-���;Πgw@���6�r7�q���&
�Jq1�
+ʉv+�@�����,�6bw��S��W��E"��j�"g�ZT%D�aI��#"O�u"o�������'��6"�v:>���>!�&�HxT���;<^ p�8�k6�mD�a�����^�ʼp��:���b�9*5�!=��R� I����1���z��~�Rk�=Ejq=�������rQ>m�k{v-
 �J��1*;�_�0��yNB1�9�%6T��-9u�a��og
�J��
�a�!�C2
�h`0&и_/��o\�-��4Πg7�,+#�[`��ؓx(<*A��Ua%:D���)�H�N
�ǧ���"�C ��DPʿ�����?G�n2��`x|�L�n|����tB
��%��P"���Á�M
���;�ڈ�m��Hە��
��c0�K�v�Ę�é��i���â' ���L��Z�p�
�:~ڛ*�t�I�_��@<{�%���Z�V�jS<�v�?���vM�eZ��Ti�vݒ�CS	��bZnJ��������6Ṿ$�ҝzT������;
z�
�
+�89k��%�ulWu���j���ޭ��;�7�.�G�C͍U��l���\����E~��JdT���X�T���pS$9 ƭ��	K'�����!��'�����!����!��'��i���{��t��'"�=�c=������v}A� 0���ND�6bY������zٯ�uv8IU�=���+�ƠX��K�� *x�R�1<,���`��L�u�n��֘m�'Ԙ	=����~���P� ��v��WA A�n�OW%��}�.�A����*=�*�
�}=���os���r�;�8�x�d�p�K7��
����r��g;�� 
+�묓_���7b	�閒u|*�ּf�a�t���[7Ey�_�K�v�"UJ
b �	���B�y
��������I&sT���|�C��	k
vT�̱(�8�S;T�ׅ<=��s��>K�sbg���VdT����N��
rLQ#�Y�
+l���
�!h��~�{���V֋�Ҷ��<��m�	�=��e%�5�,өG%��uf,�i{�����l}����ڍ:N��I���Z
NC0�<"�<����1����]u��J�� !X��v�:ʇ��b�ԋܟ'�m�FA�˿wy�]�o:��l�׍�:����8�.���EN��
�LL?��P�n�=����T_�<r�~h���
��zR�#���,����/_����׋m���v����)^�6�ޟDh@=.��ۍ�`�
�ܻW
a2�w�r��A��
��_`ϖ�endstream
+endobj
+4491 0 obj <<
+/Type /Page
+/Contents 4492 0 R
+/Resources 4490 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4531 0 R
+/Annots [ 4495 0 R 4496 0 R 4497 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4504 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4514 0 R 4515 0 R 4516 0 R 4518 0 R 4519 0 R 4521 0 R 4522 0 R 4524 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R ]
+>> endobj
+4495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 696.0685 164.0421 706.9724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.7817 696.0685 215.5882 706.9724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_2c93e938cd478716c7c9e5e9988f7a98) >>
+>> endobj
+4497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [242.9254 696.0685 293.0571 706.9724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 657.3474 179.5535 668.2513]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 657.3474 250.6661 668.2513]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_584cb5084fe5479b0c373e3d17fe5ffd) >>
+>> endobj
+4501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 618.9999 297.7285 629.5302]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_79c648d88214174287e3763b804f4aaf) >>
+>> endobj
+4502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.5441 618.9999 336.7317 629.5302]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 579.9052 342.2613 590.8091]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_3c9879f0c9dcb81fe1bbf78828509ef6) >>
+>> endobj
+4506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 541.5576 290.2467 552.088]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_39b6f38fff55dd953ec509b3739dd17d) >>
+>> endobj
+4507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 502.4629 164.0421 513.3669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.7817 502.4629 218.3577 513.3669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_a03b119140132112557907b772102b33) >>
+>> endobj
+4509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 464.1154 191.7574 474.6458]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_84b1c4be433c931ee781fdc62998fdcc) >>
+>> endobj
+4510 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 425.3943 194.9751 435.9246]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_ade56a6155b9b869d0280b01fb7de54c) >>
+>> endobj
+4511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 386.2996 224.6344 397.2035]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_29c6deef0eb3911adbb08d36a8f0b3f2) >>
+>> endobj
+4512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 347.5785 179.8324 358.4824]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_6609e54e84d50cd074c2dd65f38b47da) >>
+>> endobj
+4514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 308.8574 227.9814 319.7613]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_d67d37524d1fb7f31766c0b02cb8591a) >>
+>> endobj
+4515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.797 308.8574 297.4402 319.7613]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.9428 308.8574 392.0746 319.7613]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 270.1362 191.7178 281.0402]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 270.1362 288.8524 281.0402]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_484373d269a31c21efae44a83f8be6f0) >>
+>> endobj
+4521 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 231.4151 191.7178 242.3191]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 231.4151 303.0791 242.3191]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_0ff04e47054c14b2edf29096ecc95ab7) >>
+>> endobj
+4524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 193.0676 150.493 203.5979]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_33e6005a1fe40cb202eb619912c25c3c) >>
+>> endobj
+4527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 112.1246 203.0748 123.0286]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 112.1246 296.3242 123.0286]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_5a207ecd92e9fd8f3b1937a5064746a9) >>
+>> endobj
+4529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 97.5705 322.8246 107.4757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4493 0 obj <<
+/D [4491 0 R /XYZ 90 757.9346 null]
+>> endobj
+4494 0 obj <<
+/D [4491 0 R /XYZ 90 715.0952 null]
+>> endobj
+4498 0 obj <<
+/D [4491 0 R /XYZ 90 676.3741 null]
+>> endobj
+4503 0 obj <<
+/D [4491 0 R /XYZ 90 598.9319 null]
+>> endobj
+4505 0 obj <<
+/D [4491 0 R /XYZ 90 560.2108 null]
+>> endobj
+4513 0 obj <<
+/D [4491 0 R /XYZ 90 327.8841 null]
+>> endobj
+4517 0 obj <<
+/D [4491 0 R /XYZ 90 289.163 null]
+>> endobj
+4520 0 obj <<
+/D [4491 0 R /XYZ 90 250.4419 null]
+>> endobj
+4523 0 obj <<
+/D [4491 0 R /XYZ 90 211.7207 null]
+>> endobj
+4525 0 obj <<
+/D [4491 0 R /XYZ 90 131.0319 null]
+>> endobj
+4526 0 obj <<
+/D [4491 0 R /XYZ 90 131.0319 null]
+>> endobj
+4490 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4540 0 obj <<
+/Length 3067      
+/Filter /FlateDecode
+>>
+stream
+xڵ\mo7��_���J@���%@�\�
��
rm�S�0Ti��V�JN����.)�8k�F�Hʎf
g�r�b3
+��љQ�8!�l����{��\���
\�I�����;�f�8����]�A3�8��_���a������e�[޾_p:�o�>�jy���jY=�}���
�rU,n���o��áy�SqWT
f��U&
�sf����_}�!"l��f
��W��Jgk��W�g��
|��9�g�+�E������?QOs��˜��!���ͳ��P�dt�≣�D
++gQ̻������oq%f��(��e�8�u���<nV��?׳�Yp(
������V�Q��
�zD�rs�,��?�'��_y)̺S�8�z�@��l8�0
��%��Q�LC~@R�q\\���&�Q�2rf��5.�5ΞLy\��^i���M��Or�v��z>^�2N�q
��J�cH��bx��|�'R�XO�>+�; &Dz
N_ki���qn
1�˼'�b�Q�:uJ�k�׆]㩎L�G1���B*H��D98XP�_3ʥ"Bi�Ey��<Q������4�W��p
��J�=��<�cpz=����ppF	�V����ze�0w�_�rN,�f��<f~�כ��������vS
�S��
+���G% ���.�(�`�d ��^\��/(��ۋ?ёK� �q�T
�R^(5_6/�B�y���׺��q̏��rM
����
xۓ��<^��;l�vxX��z���o�9�`���$�58���VϿi^@�T���`�
t�s@��|
��������!1
����5[>_n�p>��/e;��i��
�ؓ���d���XֵMS7�B�wF�d�.8�Z@�I��l�aJ
+�kC�5U�!V�n ֎����1�X8��5���Gb�X?O�"V��@o�X�����0t�<L".hd0V`�
�N�rN_B���
�F���0]6/#tZ�W�^�uW;�~{�O���Oǘ�ǧ��'|ʭ�|ʻ|��X\C�|N�)tz�Z��4�ZŒ�"q)
+�F\A
'�Da���v#q�v[��[@�ܸ���l�1
�y�b�^ʯr
�P���v
���PƠ�\�*��66��&J!�9���[ۋ
Ȁђ�%��6v�$Ey
�@���æ,���w<Tš��~��
̭ty_D)�`�^�^��L��܅r$&�m���
�N��
	� �@������?x��Hh.�ՙDG���A�9��{��Q���TȖ��ʅ$P�C�`�X����Y'�TU���;��3�т
c�|͂Ie���M+�����\����&1�՚��R���:�М���L`,3	@��d&&)29���F^b&�MRa��Z�Y_2^H�K���$����|�/�\���MQ
o��rs<�}[;����U.�LaZ�E;���
�R�ǿ��R��z�x��Z
+�Z����[Eb
���V�*|�1�t��"��L+
����!C�Q
��Ta�l��m;v��Z�����މ�����)��:���Љu�#�v#2�d��
�r��Fy�P��W�0*�.�R	
wG낸.r�+5$����Mud�7��5<ƞ�0f-J�9�D�
�*�0�$Hu�
%�
�K~�䡼�����X��X�~+�����ru��<��	�B�nϟ�H2L�P��Z<1=b70}��ٛ�P�
c�g;���<�b���7����W�3g44�J�A
+C W!
+X��Ⱦ���@~�K"4Ց��(�q�;8���e�o^
É`/Y�O�g�rDh�(bx�'
+sQ���<��Gy���(ϣ證�l�I�bqA�ŒC�?T�u=�RB-u� Ot�<��x
��m�r�
�M�q�������(��cH��ڝO!�ԯ��
(.P�;�Q
φDa.�vc6�v�l�؞�
y������<�s*	/�(�`�>8�\w���
+Vꢻm��\R�z��n۸>����=����f
Rg�x
��n��-W�}�|�ZpN���������k�Og4��*X��ǚ+.������DK2���D�Y���L�Ȑf� �A�Y�jhi��Y��B����?�� ���(�%�ћa�2H'����E)�8��8�lo���1
+�����A
�1Ћ����JC� �Y�
�Li�����e{��r�!-m2�:2��
'X��CF��f)	l��!*�jLXJ��GV��B����@�W�{�
7ۧMy?�U��j��iD�!ڟ���H�~�2x�j!�^[s����1õL����<V�)���ر�(�Sd��r�̣����B��ϧ�<�H�)�	���Rd���";ӇSd������m���ɨ
��
R)5� �Y����w�_�^Ɛ�
C2�������TG�!�X���T��X�Y��\�]s�j7�m�&n
��>�@ܝk��es�8��sŒܺØr�߯�xѯn�}��s2/�B��nvG1�S��5b70^��o��v�>S�1j{v3�V
C0��7�
�+\s`1?� �Y���=��%4j�5BLuB�G`
�"=�2�Z��0�
+�団���?��l�����4�Q
�2ԛ����sI�(�YW�݋��,ECG�TQt�#G�A,mb�d	��*�e�8��/� F�����ަ׾ܶ���n�q�\�{��|\�G�0E�c�
����I
���������yN���+r:x�Y��k�b8�'
+s���9=�����)��G0Лr��F8��4Ώ?Haց�k.��<�kX��.���V��%1���f
x:����|�SO�(�a����;N�
��Bqj���t��Kzѭ�TG�΃�s��.<��sG����/�s�W�9{->w�~��r:�3]LQXY��~j�}x
r�u"�AK��D�^K�'�>���{����A��c�E��c��͇�
�꫅Ra���e��ܞ
p��U����J���dq#��\�<[d|�c`���Yx���A��
7�7��w�
y��������͛/_��Ձ<����l�o

��

	
���:��gq�� K���lD�K)��}�U��w�o|�3�pTl��u���endstream
+endobj
+4539 0 obj <<
+/Type /Page
+/Contents 4540 0 R
+/Resources 4538 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4531 0 R
+/Annots [ 4543 0 R 4545 0 R 4547 0 R 4548 0 R 4550 0 R 4551 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4558 0 R 4559 0 R 4560 0 R 4562 0 R 4563 0 R 4564 0 R 4566 0 R 4567 0 R 4568 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R 4575 0 R 4576 0 R 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R 4582 0 R ]
+>> endobj
+4543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 720.2859 194.2975 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_b917a480b6afe7e2750aa2862c6783cf) >>
+>> endobj
+4545 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 681.4316 188.7586 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_2ca2446f563956eb2b92ddd17e5c0b2c) >>
+>> endobj
+4547 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 642.2037 211.0848 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.8245 642.2037 307.2332 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_d07dc0dabac5685f9db8d9dc11e513f1) >>
+>> endobj
+4550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 592.3905 211.0848 603.2944]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.8245 592.3905 285.1363 603.2944]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_8aab82f7118966662582f88725ce4735) >>
+>> endobj
+4553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 553.5362 187.5633 564.4401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.0614 553.5362 213.8344 564.4401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_7facb7a06ac72f1af2bc514c788f1a38) >>
+>> endobj
+4555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.1716 553.5362 318.4212 564.4401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.5776 553.5362 441.8272 564.4401]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 514.6819 187.5633 525.5858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.0614 514.6819 213.8344 525.5858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_57362a4d56c397575a6d043cdbcec0f9) >>
+>> endobj
+4560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.1716 514.6819 318.4212 525.5858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 475.8276 187.5633 486.7315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.0614 475.8276 213.8344 486.7315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_5b3db7ba1765b3a04f8d320968f70447) >>
+>> endobj
+4564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.1571 475.8276 468.4067 486.7315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 395.0651 197.3367 405.969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_6a24743a95176da13995bb6c17151c9b) >>
+>> endobj
+4567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 356.5844 175.7479 367.1147]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_29c63b939ed830a0395170835e60beaf) >>
+>> endobj
+4568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 317.3565 205.6355 328.2604]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_fcf86304f17dc474e1e5bbe0486c1b59) >>
+>> endobj
+4570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 236.594 164.0421 247.4979]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.5402 236.594 202.4974 247.4979]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_a948df90fc7880e7e52ceef297ee9bbf) >>
+>> endobj
+4572 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.8346 236.594 279.9663 247.4979]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4573 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 197.7397 164.0421 208.6436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.5402 197.7397 202.4974 208.6436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_2cb39e7c88e9e724e7970d0e953f2c81) >>
+>> endobj
+4575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.8346 197.7397 273.3408 208.6436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 158.8854 180.5399 169.7893]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_deee840f3313b6050d439dbe5fe2fdd7) >>
+>> endobj
+4577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 158.8854 258.0087 169.7893]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.7419 158.8854 349.8736 169.7893]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 120.0311 178.2386 130.935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_af7dc46b2cfbd6650ac1d2035d331f15) >>
+>> endobj
+4580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 120.0311 255.7074 130.935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.4406 120.0311 347.5723 130.935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4541 0 obj <<
+/D [4539 0 R /XYZ 90 757.9346 null]
+>> endobj
+4542 0 obj <<
+/D [4539 0 R /XYZ 90 733.028 null]
+>> endobj
+4544 0 obj <<
+/D [4539 0 R /XYZ 90 700.1513 null]
+>> endobj
+4546 0 obj <<
+/D [4539 0 R /XYZ 90 661.297 null]
+>> endobj
+4549 0 obj <<
+/D [4539 0 R /XYZ 90 611.4838 null]
+>> endobj
+4552 0 obj <<
+/D [4539 0 R /XYZ 90 572.6295 null]
+>> endobj
+4557 0 obj <<
+/D [4539 0 R /XYZ 90 533.7752 null]
+>> endobj
+4561 0 obj <<
+/D [4539 0 R /XYZ 90 494.9209 null]
+>> endobj
+4565 0 obj <<
+/D [4539 0 R /XYZ 90 414.0389 null]
+>> endobj
+4569 0 obj <<
+/D [4539 0 R /XYZ 90 255.5678 null]
+>> endobj
+4538 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F99 2085 0 R /F100 2198 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4592 0 obj <<
+/Length 3149      
+/Filter /FlateDecode
+>>
+stream
+x��[M{����W��zb��
%9�I�6M��v{I�	Ih� �,���`����(���A 0�y1;���f3
+��,��D%$Rϖ�
:����`��\_�x{q�J�YJR����]�A3�8㳷��s�`����W�γr�������n�����w�m��O77_���!�.�Wt��:�*{�:���+f��*	�s�ȫ��~{��[��} %4C|?_�����A���D�F�
�%,M�ls!�p?�o.����
�
1?�児�h�󤣸 T+�
�x�(F5��șCw�ȹ�?�pWb*
X�RSv�$)պk��W77��.�lc=~9��h"$����K�}+�:�� 
�"��>/�zW"��W�7+����>Pp!�"I���&�q��M�_?RE#>�^ڃ�n[�}\�s�~���¡^DxL�wo��:���H*�8�HwR $M�<킸\�W�*6
i��`�"Sjb���n��p�PL�E����ș\Z6��SB��
M!������k��v�Լ�6�؜�B�Sd�~<Z��2N�9M�@r�4��
/6I��ʘ��(�c���ċ���0�XL�l��	'?�b��!�Ǧ��(,7���Ԕm

�T��@�:!B������ӊ�o������t at C�(%ոg��2!�|�b]h��_�*A�$
�	�s�S z���&R���4��q.��xPc
r*���
�b���>_ٺ��W���$�GrBM��B۔��ѦZO��
��J�&P���|�c:��f�(����|����2���vYP��tV
�L�2����m#Z?d�;ʫ�dV��]{q�on��4�w���;�T��Ly��#���MւQ��Z0a�Ew��Ǵ�]g���z��q�_��q
�o�����L
��q�C���q�#���`�?^j�:���=��1�T
+�(e��H�c�,��x�H��I�S���u�
+�23E��4G
���A��~t*o
AL@�<@;
tL�T!�ȱ�O�j��j
+�
:Z��k�:i��zp��Ms�`��h@QV�^)�Uh��;�	�=��b�g�o��˼���
h�%��˘��8 ��H¡	\�l�
a��Q�LOx�	$}�g�BJ
+���}��H	�Jp��eHH.�O=�!
c
��l�U�m�[%�\AVC5�4�d���µ����AsI���`�Ө�1U�h��3U�T����
j0��P�
�E!Ŝ9��]F8��T��� ��ߑ���C�� /6����g��:'�AwF���`���`<��a
�����
+tWo�
t-Oׁ	}�W	F�p,�|-耸��Z��.���
+<C��ȷ���̊���i����W
+�1ڔ8JpÞC�����b�mJ�Z�(_�cdžۈ��h��co��Z��'	R m�7�Rbm=��lw:���=���E־��:��b��ΫeY��6��7�����D�/V�xķ��4_n۱��?�ҍw�o^w
�fC
S�L�
������_�7����q��
VDA#��1��[�	�
�@"�w�m
+d}��D�O
����du
F��������'�&V�:f���V�gi�S���@:���f�ʐ�i"�}�0�P��74���2��Li����&���7[CSP�	S�]���C�rCE������l�`爇
:
c��,bP �
��ަS��!�H��*өHc��U²�}��
�'�
jI�a�<1s
+-��G*�^s�X�"��{�f�ِDz�>�p'��ˆ��j��
Flr`+�-
u)�+�Lb�B�Z�B�W�&�6�@s
�
O��ռ�g��e,8���.NN�?�-Y��ZeD�f�Ŷ�q��
7i�ʲ�<X9
_�.|�Pd��<���\>}\�u{�A��|�!�|5����%d	;�F��/��ES���R�6�;�e���>��jҰ�y���d�mcakL�,v��˹
��� �.H at k \��V����
������5��I&��AB�=�1l�<�[Ah.E�@�Url\'
+�
ц{�ƙ-sl�!��O��|��E�dO�0��W��\ k�~�R`�KA2]
+��K��*� ��w\�]�3N4�!
+S����U�Հ@𩡇���<w"�Y�6�ۉY�S��P�FӅ*
��VY�v������;
�l��c
x����f	xLC��,��"�N�7*@W*I��
�?���c+~
q(֫=���$�;�K
q��[�:��ڋu��*�0�	�Ν�Eg;�[�����Z|+
+ ��ӾXf�����܁%�n���~�~*���=�́���is�[�k��o��.�Jq��/bA�V6+򢵸kqX;��(퉦��0�)4���L�V�)]~O�"W
�x���cQ?�s�-�4
�1�c��'����1��+f���òy��o�
>6��mx�w�����W��g��}l�$��c�C�؆Ӳ�6���_Б
��5� xԌ� �n��]�ۓ؜4���[���j�7��,�%���c+`�_�f�i�<��D�,�
ɷ�
o���~��:�FAYK
�vb ���P@�倷�ᛞ�
����I�Y�'LF�]��^��7o�-���������\k���������
S(Sԕ�^	�����Rj~�0�߾$�
��0�����]/���ܯ�w��z���h���G�ٯ�6��YU�OV�OR�)%�
���r:z^��m���S4�9���%�j3��#&���k�0k��waus��2E��Q9Xӑ���ڟ�0�(��C��r�BS:�|H�?s��T-UD���<�(˽l,�
n�ſ�:v7������`��;��ؘ�Ng'==f����x�8�#]�Sf�[�f���~����TN����GĶe0	d7��M~JW>���U|�I�H���i�"�g�G�14F�+[��

����coLG���Y�
+3n�>��}�օ.T���2=L+�����~f
���0
�sa �����������l?.�?�Y��
�Dm8�5�B�cLd��m
�� �B��ph
�o��&<�R��0�x�^���
�%؏w7,�;
�z_/>�C]�o��ɲ"�m�/IQ_C�~=�����*id�^h���~	d��B,w�v���\Y(�pr����7�YU	-endstream
+endobj
+4591 0 obj <<
+/Type /Page
+/Contents 4592 0 R
+/Resources 4590 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4531 0 R
+/Annots [ 4594 0 R 4595 0 R 4596 0 R 4597 0 R 4598 0 R 4600 0 R 4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4610 0 R 4611 0 R ]
+>> endobj
+4594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 719.9123 226.0342 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_339fab488002bb5b341e1bb82edee103) >>
+>> endobj
+4595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 719.9123 405.6285 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4596 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.0352 681.7969 159.4011 692.7008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_c8652f34bdfa731c02c1900f62bd5e88) >>
+>> endobj
+4597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [166.3367 681.7969 327.5508 692.7008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [352.7822 681.7969 513.9963 692.7008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 563.9803 226.0342 574.8842]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_e0c9395c1ac4d96e245be43fcd76424c) >>
+>> endobj
+4601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 563.9803 371.3076 574.8842]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 525.8649 164.0421 536.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.5402 525.8649 213.6456 536.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_7415de7b412a5e297810ff35a97a2849) >>
+>> endobj
+4604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.9828 525.8649 318.2323 536.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.3888 525.8649 441.6384 536.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 487.7495 164.0421 498.6535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.5402 487.7495 213.6456 498.6535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_54cdd6074f90a5623c8ae7ddcfedc5c2) >>
+>> endobj
+4608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.9828 487.7495 318.2323 498.6535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 388.3804 227.9514 399.2844]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4593 0 obj <<
+/D [4591 0 R /XYZ 90 757.9346 null]
+>> endobj
+4599 0 obj <<
+/D [4591 0 R /XYZ 90 608.755 null]
+>> endobj
+4609 0 obj <<
+/D [4591 0 R /XYZ 90 451.1314 null]
+>> endobj
+4590 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F100 2198 0 R /F99 2085 0 R /F8 568 0 R /F1 583 0 R /F10 488 0 R /F13 577 0 R /F7 574 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4619 0 obj <<
+/Length 2662      
+/Filter /FlateDecode
+>>
+stream
+x��Zm����~�B�Tj��}��H
'm�n|��8�u"B�2I�N.��;�F.%�ֹA�ƙ�rvwv�W��0�#��"��q9[���
���"���/C�on����b�XR9�ݘ$A�:�]����bI0��
��I�K�^.(���q�������m�TǛ��eq_
�b�.�T���<�k{�S�I�Qs����9�����W/n[��D�����<[�A~�ˆ�J�
�#�t�����������u�
3aH�`De�fKƑ�0=�:�&���Q
+��
a)x'�hҌ0Ѳ#$B4��%�
�"A�黻���X`�Ǵ ��H���N�2Wf����"E�,��|a/F�3�.&������|�����^5K��^#_ꥮ�4�	��!����Ҭ~�u�ߔy^.��?dŽ
Z�k���!��
����DevT��D�}L@�f'n)	H8�UK�x��B\����4Rs:���w�GKAC+�B9���8�7sw���Œs>�*����}�^,csb�~.c
kC�|<�2�&Zz�[������:ۥE��ŀ�0 �P�2
�-��ͩa: 3	`%�ǗX
܅�Ӓ
Y̮\g3�ڋ@��{���`��l���6n�����&A�M��O�D,"9��$�)��d#&A�0b��4��'
��XG����Cvы
t�R��So)�,�uauv(��j�M���v`����P>�U���
 �0�X� e��D���O�$�I�S�$lƐ$p�Dx� @/!��V���m�9HW�>I��I}�
�	`Q�(�W
��
��6I^� +�����h!߁��
�C߰��P�G�}�w�L����/�Ӣy���>���I/+
kj�m�_1�b|0���	3��Ag;.`���P�!���[�)o�?fE�Tw/
�UZk�Z1{��͔Ldh�-H�K>�1��6�OR���֎�*��⛋��:�&T�^�Oq�
�ڪ}�a�

�:ŕ�b��<ٔ���4v��W0������
���T�V�Ed���4ˀ�U1˜�J����c����a��^B{Y�<���iX1,�8���
�Si
_���ioU%9�3����f[��N?wŨ��R����گ�W�L�����d&jI;
��,U��	`ZZfB�6&fH
+mQ�>+6%��6{HĤ�gM���V�C��W�p
{}��u�Ol۹��ݛ��Y�����k/��9ڲW���
�N��R�H
�ơ�#�iiC�
���:
+���;��?
��,(
Ĺk�k�z������̽ܗ�杣�|@1�UZ;���hT���M5��9O��֎X�+�调�����Z�[�˜0=G��雭��M�T�>�Y7
.3nDP1���OE�E/�$p��`H(�	���������;Z�5�ЧK�t�^�[Jd�`;��"�ꙮ�")|U(ƪ“bN���B��_ Ø�د
+!n��p��RLE��u����5����QD�t�$�
��,�t'R��
4^�q�uS
L`�G�*��E�
D���~v��ij�:ٹ�〠
+���0"ڢ��u��۴JO�l�-�Sx���
(f�D
+�q��
o
�A�n	�z�"�H$>�	���B��I�ZuX7gC�<������
4%4�)��a ǜ���Y}�i d4
X���Kk��|"mlɆ�Ơ&y�����݅c�K͂.5�h�I����Oѕ=]+:�~V�61M��W����yoܫ>%����:*����Ur��d&�}�Z4�*�D΃�����%w]1�@�9oڟ����p\{�C���2�~�8$y�
�gc�^�B�a��9��Y���
:8d����D�9��.ٙ8Mfz��vb��K��?8�}ٮH����P��1�ܹ���
+��fk�!A���tuj� �y� a&�|��Ǿ�5(�~�sdŶܕ�i�����I�]�KA���}��A�!�ط�ݘQ\n:f��)��ץ�����!�]esh���L��~3��)* $+u駖�|"�d#1���돇���7
�󟟄������аv��`bA/�/��<��Q_�_kOd��ep�Z�*lr� �-
�8
&���������WI�F-Hax�TM�:�&�����m��s_�'��f�
�cр]d�$Ϗvh��jp�n��T���k��~�NwI�dˡj�/(L�:�%[�2��q:[��k��wѓ�+���������><��D�:��˷i��ru�pԘ��? ���"��T�^A�ZZ.1ϖKP�
���9m
+P�Bu�,t5 ��<(�@ͳ�$��EE?K�>�s~͛pb#jI�oZ{}�㲭�\?�fԐ+��4k1��o��N�����p�����9�������&��\ ��5D�&B��9���t�3�)h`�Pp�Cm��S�6_���q�[@�뻤�7P>�(�'�N�FKt�IO����>��v[�����8�U�)b��_��GyV���U�
E??������?�e��
�T����U�=L�2������{���>:�a�^��o�=h���m����u��/��*�,�F�*O��ҳ�9U�PB�R�o���?w�m',�>9�|��>��i�7��hU�C��+�5��}~}���$���޲%:�'~V$#�z�l��?N�
�3
i���o�
�Mendstream
+endobj
+4618 0 obj <<
+/Type /Page
+/Contents 4619 0 R
+/Resources 4617 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4531 0 R
+/Annots [ 4623 0 R ]
+>> endobj
+4623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4620 0 obj <<
+/D [4618 0 R /XYZ 90 757.9346 null]
+>> endobj
+4621 0 obj <<
+/D [4618 0 R /XYZ 90 202.277 null]
+>> endobj
+4489 0 obj <<
+/D [4618 0 R /XYZ 90 179.9652 null]
+>> endobj
+4622 0 obj <<
+/D [4618 0 R /XYZ 90 179.9652 null]
+>> endobj
+4617 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F8 568 0 R /F11 416 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4626 0 obj <<
+/Length 2167      
+/Filter /FlateDecode
+>>
+stream
+x��Z�r�}�W�%	U�`�/N�!�줲�TMv���N�h��YC�Z����� @�!�.�s��~%5э�����
�?�<SB!ø�-7xv������bh����˷R�
2���ͺ
A$(���Շ���
�1N��	N�z�޾�S�T�ׇlU������zu��*��}V.���
+��)���]����zNt�%La�%�o����O at 0Il|?_|��g+���1����`D������{S\�x��~
�E{C,���$�2��`}"�x�m�`>�����e�W�{��j��de������rĸ!�q�#����O�e7�6u�7���eU�[��0q��,�
j�
�0B��	
����0b�����|k� 
��p��ᳳ��d�{��l������D�k��?�e���Gga

�"͹�������!k�u��<d��l=�"9̶��ZG �!ʈ
+��ֈKͼA^:
*�A�D��,�#�I7L��"� g��.}�(�@�h5�T at ep
�tg�Z�a�
�8a,.7���,�������3�)FI��(��z
�	���"L
F�a������sZ�۴�oKi��H�
+��Go5&�= A2��i
��b�ʚ	��k�ڂ���\es"�/�V� ��� �L`� 
�vn��:K�.�a�C��'����p^��(��6]��U�۵��޽� �
+(PB!zF ���# .�����)"B
�ў��PΓ_���y�Wm�:m���ڏb�.��E�ϑ�jL���>E�r�c�� 	���)R$D@ӣ�cE���n_4��ȳ]l��B�0�)���
+�uS���~�j '
|(�!^�"6DLd	V0נ�	
+�B),Ӣ�V68�<��C$<!��O�k~&<�^Fu�]g�:�������Sfl��p܎BH����V��a�	03�Z�],���	��{���8
+Hv`t
�4B>�
;�HE��lQm,Vt����\Q�/�&6�⊍*#H8C�.����M2�I.]��ƽ�Up��H9�@�n
Q?�_h���
���P�	(
��̺�� �
p|
���
�O�!	)��3`�-D@�gT��b�v�N��UU�V�Y�$߁<��
���__;���
��q	���Ԛw�Ժ�S�l�8���r�ٹ,���<�ӂ[��o��A�5�
��+P6W]0��
J�#w��3v��9�����Yߠ|*��r\WE�ݡT�V���f��a;ȉA�
+~rg=4
M�![L��8m��j���.
+��I���9�P[M~S�_m�d�|��e;D�AZPn�r����e8N����@ݎ�o��DP�� �{��1� KP�m�Hė%Z"��/@����n<��V�
t��t��%�k��q����	H at Se!_�cov_�r�5$�R�J'���Uu!��Ck��
�u����JJs�C�	x�fg�9�� �3~;x~-��lk+�����#X�1�$��T6
T�M�*�ˀ
+}A*
u�
Z�1������z��
q����@�ɼ�Dj�0�h�&��(K
���a^:��
^
��
[��n�~�:%\l���í~�++V �P�D�/2�7�ؽ��������u��>m/S'�a<�vI?ۃ��Hot�広��Ч�}h0A��Yb��x �3~;b����`��
O�
cg��$�+�y˔P�)&�L;v�������]�7���8
܅4�x�d[�'H&�S�3�����Teuf�+k�㠲����5�
sT����X�
�tN��o*����Kk땔�
(%@ĩZd�X �gj��g��c��� � ��9�O8
+bSGATA�.i"i6X�Vi��y�ݝ�.�O+����}�!��c�����Q����[�#)g�5�du�e��lkABU�����=�
ʸ�G
�+C�6Ei
j��Q
��1�|�B��N
�!�I�S����董q$�R�u(X�X2賀
.����‚�]���j�g���
���E!�aBD
+����B�C����lA������
�E��Aҽ��to����_ͅH|
ޥe�|���ۜԻ�**��U�h�` ���8?��n����4��|�l�bp��B�ȏǵh�������#Z�о̷5ʛ��<��c
�C���[�F�X��sL�T�LJ����C_w���vs���g�#��H(����endstream
+endobj
+4625 0 obj <<
+/Type /Page
+/Contents 4626 0 R
+/Resources 4624 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4531 0 R
+/Annots [ 4635 0 R ]
+>> endobj
+4635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4627 0 obj <<
+/D [4625 0 R /XYZ 90 757.9346 null]
+>> endobj
+4628 0 obj <<
+/D [4625 0 R /XYZ 90 733.028 null]
+>> endobj
+4532 0 obj <<
+/D [4625 0 R /XYZ 90 716.2211 null]
+>> endobj
+4629 0 obj <<
+/D [4625 0 R /XYZ 90 716.2211 null]
+>> endobj
+4533 0 obj <<
+/D [4625 0 R /XYZ 90 603.4626 null]
+>> endobj
+4630 0 obj <<
+/D [4625 0 R /XYZ 90 588.8923 null]
+>> endobj
+4534 0 obj <<
+/D [4625 0 R /XYZ 254.2147 512.2633 null]
+>> endobj
+4631 0 obj <<
+/D [4625 0 R /XYZ 90 495.2023 null]
+>> endobj
+4535 0 obj <<
+/D [4625 0 R /XYZ 90 386.8079 null]
+>> endobj
+4632 0 obj <<
+/D [4625 0 R /XYZ 90 372.2376 null]
+>> endobj
+4536 0 obj <<
+/D [4625 0 R /XYZ 90 264.3414 null]
+>> endobj
+4633 0 obj <<
+/D [4625 0 R /XYZ 90 249.7711 null]
+>> endobj
+4537 0 obj <<
+/D [4625 0 R /XYZ 308.5385 187.9316 null]
+>> endobj
+4634 0 obj <<
+/D [4625 0 R /XYZ 90 171.2045 null]
+>> endobj
+4583 0 obj <<
+/D [4625 0 R /XYZ 268.9672 120.4882 null]
+>> endobj
+4624 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F11 416 0 R /F7 574 0 R /F8 568 0 R /F1 583 0 R /F10 488 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4638 0 obj <<
+/Length 2045      
+/Filter /FlateDecode
+>>
+stream
+x��Y[�۶~�_��!�f,,� 4�C��;ͥI������p%h�c�TH*k��� (��^g:ӎ�6
��w��
�2�x��B�q9[m/����~A���_
	�r}q�F��FZR9��t
$A�:�^�OA�|A0�ɏs����f7?�)N��po�uv�]~[g�a���ʻzoʕ�/���U�5�{|k6���4qo	SX&D����o.�v�k�
L����?��
��#�S1{�FDk:�^p�¢�xw񯞏{�� �A�K
A�R���!��uF���yg�f�l�򦬀�����	

��(��0*�MAs���]]�f՚�G,�x�S/�B�r��?�4���˵�4�2��'���uG¤#��"�6n�
�V��̩ �1]�l���k���2/�mugJS�=Qk�'��#イ~e7tR��:���v"�u�eU.~5u�VVҢ�� -��Q<�~����UM����X$��
����v��4�χ���
i��
Q�G!��"D
] �H�о� F���nW�C�G���ٖ�6�����H�O����0�1�M~[�x<�n���BA"yy|���mWa��J)�/
u�
E�
+
���x(��M�:��ڷ!W���Sm:�WmU�
ǻ����|�d�[���
�ܻ���$�罏��]f���l���W�[�Ǡ��ݨ� Խ�ִ�vT͡l�O��{���?����s{��YU�L����儌�P!<_}�
+�k%<Ig�f�?؜1(.x���* R
�=
��P��>d_��}k��5~�f_��<D��j��fݖ7�rĸ&��x�s��/�/.��:rU�6��rL͓/�Uzi�	�H��]�r�8��U�J
+�ͦ/�7m��m�\v�o\1�3N	uZ�@|���H��

"u��
N4�)������D,-'9�ִ����!�v6�>�6��"ͅ�xm�4�O�6�l�/�|W
�)z�U at iSR�}2b
+` k=A^��ߠ��mA�Vm������ \�$
�%��I0˜?i�@�Xk��M�z�R��}X
�x���H� �1�$j&�,u@�,ՠ0����B:rM*�
�^ǤA�r*�F�´"Ca6��6
i��ȅf�j
м�qT\��}�n���QL�Cc�n
qh�Ŝ$mX���(Иi�����,,�a }.,P L
K Đ*�}����|	G�+���.��#N(�� �FJ��bX���o�^�G��e�^�K�uűXEK-�ilP�m���^!�)c~$W!%�>�ē3K�Um�����񀼩�m�j$xJƮ	 Q%�U�!o�#ܨ@$�pZ�A6mŇ�|
+-�5"
+�5�-�u[U�?�<�^�>6�
V�}��=QXa�a!���;��7w�?G��(�2��
v���훜'���H�B����%�F�����0���q0�vģ��5�ݨ;���;�ӳ�)�1���Jʱ�`2h�'�#���o��㏂�O�>@���|�E����x��
�6Y���!a*����}3!:rW����k��rY���d[ ���e��3�e��V��r����
�J���S�A��Db�n�
+1<�!
ɖ��7�Mk�FA�,��1y�!���L�w������r��
�]��O���;r��D���/�y���S>)�d071.0
��?���LXb���0�V��i����C�t7:�$N��
��̀��J�q�'�A0
#����jx{ӱ����f��e������gE���e��
�+��v�}���첺���L3
�Sx��B�o��x��ot�ȓ?(�I����r"��
�����3�`�xL��;������~���.������
+(k0�ɥ�άrW}��^.t�`�H�̐��h\�|~�{
�l���B~֗������h�y
�C�@��w�,�`�e��[���ſS/c���}V
�
w�Z7�� ��a^����
+\�3f��B�
+8�F^ro?��ӷGc�,�pۆs�	_k�}��hՠ}��j����]q9Ջc�4�B�D�=щ.#�sl�#��C]6pP�i��?Ql�ݶ�C=����Q�7�w�endstream
+endobj
+4637 0 obj <<
+/Type /Page
+/Contents 4638 0 R
+/Resources 4636 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4531 0 R
+/Annots [ 4650 0 R ]
+>> endobj
+4650 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4639 0 obj <<
+/D [4637 0 R /XYZ 90 757.9346 null]
+>> endobj
+4640 0 obj <<
+/D [4637 0 R /XYZ 90 733.028 null]
+>> endobj
+4584 0 obj <<
+/D [4637 0 R /XYZ 206.1632 675.8614 null]
+>> endobj
+4641 0 obj <<
+/D [4637 0 R /XYZ 90 659.1343 null]
+>> endobj
+4585 0 obj <<
+/D [4637 0 R /XYZ 507.7687 608.418 null]
+>> endobj
+4642 0 obj <<
+/D [4637 0 R /XYZ 90 591.6909 null]
+>> endobj
+4643 0 obj <<
+/D [4637 0 R /XYZ 90 512.2923 null]
+>> endobj
+4586 0 obj <<
+/D [4637 0 R /XYZ 90 489.9806 null]
+>> endobj
+4644 0 obj <<
+/D [4637 0 R /XYZ 90 489.9806 null]
+>> endobj
+4587 0 obj <<
+/D [4637 0 R /XYZ 136.9029 413.3166 null]
+>> endobj
+4645 0 obj <<
+/D [4637 0 R /XYZ 90 396.2556 null]
+>> endobj
+4588 0 obj <<
+/D [4637 0 R /XYZ 90 349.3856 null]
+>> endobj
+4646 0 obj <<
+/D [4637 0 R /XYZ 90 334.8153 null]
+>> endobj
+4589 0 obj <<
+/D [4637 0 R /XYZ 90 299.5665 null]
+>> endobj
+4647 0 obj <<
+/D [4637 0 R /XYZ 90 284.9962 null]
+>> endobj
+4612 0 obj <<
+/D [4637 0 R /XYZ 90 249.7475 null]
+>> endobj
+4648 0 obj <<
+/D [4637 0 R /XYZ 90 235.1772 null]
+>> endobj
+4613 0 obj <<
+/D [4637 0 R /XYZ 118.0547 160.5506 null]
+>> endobj
+4649 0 obj <<
+/D [4637 0 R /XYZ 90 143.8234 null]
+>> endobj
+4614 0 obj <<
+/D [4637 0 R /XYZ 90 96.6195 null]
+>> endobj
+4636 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R /F97 1774 0 R /F7 574 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4654 0 obj <<
+/Length 2183      
+/Filter /FlateDecode
+>>
+stream
+xڵZ[o��~��P4��j����
�M��=
�&>Oi`�m�H����ߟYr�ڕ(҉�!�v83��7���
�?23x��B�q9K7gxv
_�rF��֗����g篤�d$��˛V�$HPBg���sB�Y,	�x�fA�<�6�՛��r�p��������J�����eq[�"ͮ�=�M�Y,���뤮��o���Z=�BV-dN�^|�������Q��$�n~<{��V����0bF��=<`D������?��ޝ��������=���y<4�H9L�fuqQ�M�����Y�_�ͪ�)+���W�j	��hl�����N&2M�/���

|�Z��Q��
+#�A[�n=��!�w�/�v��EݸC���#��8
����~�ɄZ,��xW�W�:i�ՇNR�@r�A�3[6���H��5�]C^�o���M�
+�R���v,y����Y������"K�����v�Q�yYtKCXQ�V�c���
�|�	��ϷH�D
+�-�)�'�gɉARS�C2�N
��m��¥���1*��}
@-!������$�>|hTz�b(�4��#�Œs�
5��V�|�X2��dP�[��W��!�-��H
+H1C�3���F�������'�`��gℛ��`
2�X�W��_�4ϊ檩���/.Z?��V�lI�@�i��*L��Nq+O}L>	��~�"
b6�mv*�+��
�%F��8� 
+$��%��"#jKHFK?���6o�.�NWe����&M�N��Y�����}���۬�4�V�ͪ�
 yS��傊�}^�v_YB�����/D�b�d�
+��:�=�q��^O�
�������>j����K ������v���zV��D�N~�8����Z�I�`ܐ���[u���9������l�뛼H׻�P�f+�����R�/Y!~�
 947>��3�B��5+p���.� �u�������IS��vtP�^���
+f�'������5pt�C� [@D
���”�;��
��4�idf�#��.���Nۿ�8�u�f?��S��
�HĄԀs��p�����O5�mKg
h����� �M2~:/�#y���
��ya®�
��.�
fЮIN
ۥ��ɼ
]��S.
�m]h
x����h��hH
2��"gf��&�v
+����j2P�~��4�@�5�:pNj��ʅ��Cg�����2��<>��<P�@	g�"��Ӷ�

+�`�
+��]����u���y�+R�q�ƒr�
�'�#	�^l2<�,��f��>8���r�w���
+1	�e�^j�	c��
@}�o�C��7Z�'�'�1
�����&٭���uS�R�
h
!8�mO���+W	K�f�<<-^`<�
��
3�a�yF~���AL��[)e
Ae/�E�
(�r��'Py�Ր��N�T� ����JȺ�?�E/?�Ʊ��#?�1�Qz�)�
+������g��X8��n/q�́��`�R֧�@퇪f�u���3�V8�&ɋ~�*����L
T�ۦWq�T���L�FJ�h�
�	�>B��9�@�$rr
tbr:	�_"	��F�@������A�p�'���$Dw�X�â�WMűR#J0�����
+c[��� !@�QOJ���,�����f h�e���|�K#�����Lͳm�_�vfBuY�9�)�ݴ�
o�}�9%�S7�C�[D��T��1��f��L�L�@�Ő=bæ��

 �#����v8�Z� 
f���eXS�a�Z�a�i )�Hh�;���!#{K�
L���Ct3iڛIN�x3� ��?Y<C
�����A1b���щ�G/�E�G�l�x��}B�q5,
�N��#�h�xD�S<F�8��X�q\0lƱ�&�`X L���<K��"/q,œ�H�c��x��^2�n
�r�gu<&��&���d�7�@^
(��B(�_����J��O�
�A>ؖb8Q"�z�_��ZELt� �)��]�0H&��`��b�诋�Gwg�=��Ϊ�B�
쯓����"�?VUV���4���UF�%$�. �e��V6k����n���F��A�������
+�|��n��i������(�Ѯȷʛ��v}~��P�(�ȯ�#|����Ra
��_�o�*�T�/7���
�ߌ
���P%`endstream
+endobj
+4653 0 obj <<
+/Type /Page
+/Contents 4654 0 R
+/Resources 4652 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4673 0 R
+/Annots [ 4660 0 R 4663 0 R 4665 0 R 4666 0 R 4667 0 R 4668 0 R 4670 0 R 4671 0 R 4672 0 R ]
+>> endobj
+4651 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Congruence__System__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 4674 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 346.00000000 34.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 4675 0 R
+>>/Font << /R9 4676 0 R>>
+>>
+/Length 4677 0 R
+/Filter /FlateDecode
+>>
+stream
+x��Q�N�0��W�3v�$=����V�($��.n
+_�Lz�8T�G�,�=J%�m8�S/�GP(�A�7�59��8'3�7)�
Pz����:HK�,Z:�hs}����q6<R��
G�cI�
+�(p�K����PN���u�u5�m�UhS]��?R����i�]���mB5뎧��Ox.asQ �w��[X�KR�&w��
YψQDЖ�hv�,p%4p�(��|?��5�w1��)��p��Q\�-�
0��$���hoH�� ����E��co�][+����'�]ծc���U����J��endstream
+endobj
+4674 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142731)
+/ModDate (D:20080908142731)
+>>
+endobj
+4675 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+4676 0 obj
+<<
+/BaseFont /NYWWBE#2BFreeSans
+/FontDescriptor 4678 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 0 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+4677 0 obj
+310
+endobj
+4678 0 obj
+<<
+/Type /FontDescriptor
+/FontName /NYWWBE#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 4679 0 R
+>>
+endobj
+4679 0 obj
+<<
+/Length1 56656
+/Filter /FlateDecode
+/Length 4680 0 R
+>>
+stream
+x���|�����e�@�m(��eɲ�l
h)���M���8�� ��{���{���{�I�,}���
�����


���|v� 	����	�h�5g�F������}kw�7�~�`� �n]\i"�P���n��(��o:� �ٝ�\�k�_�;�y�d�g>w�&�~��3�����o��5\��3A�>�;��w�.�͞�c里���/>�5=_� �z{ʕS���L��q�%~,^��k�$��������Z��,�ZbS�&�q�h�'(�F�^�Z2��^��=� :���@\
�"8��41�\
:C��l�,�y"t������Km=F��>�>�ؘn�J#ѻj�K��$1�8:E(�m�ib+�i�
�
+�9t���]�s�P��*q4�8�1�:�pbZ��q^�1�$�*q(}tϟ��pb.�G��
���'
+Dދ�B4���Ո�#=Q���%�;�is���O-!r��z���#�D�g�]�U��D���B��Ҥ57kW'��F�[����W��J�&���ؖ�t���B�9^YE��<�9���m�ۼ���n�"����M��E�*KD�O�Co����J
��$&z�QǤWTO����:�M�I�MS���Zrb|�{�hP"yzsͻS�lA+4�ٞe�w
ڦ B�ì�o�
ʗ�^�����/�jS��dӸ��6�\o|W����UY�&�-:}�&�*h�&\wxE�|K�!�<[�B,�Z}����DL%f�|��|��3�z[߻���]��e�)_�����r�������Unj�Z�ɓ
�\��ok*��,̷V�*=MSg�k��/�K�BӶ}-��֦]��b9���Q��b��w��w�zу��N��A��ɞ�׻��?��iDg��;e��%K�L�(�M�:vr+F���¤�Jwa�
���h���x =
lm�ԓ
�a��c�ן�v	ں�t�k�=�p��v��BA{���պ���Գ���Ҧ�}ݽ妞����F��Bn�����ϻ����i�
/}d|�
��~#������[!�Y�.�;r�B�w��
�	�T}���K������>j�?D[���D�9�f=~-z=��@\�މ�
�M�H�Z{r_��_� >?���=E�
�Ħ���")���`�%8�;B$$�//Wƈ!^�
F�����HbUb��:��&1�X�X�X�
d
�.1֛��	�z���Ć�F^���2�� q/�$�˖Ion��k�M�M�͈͉-<��	�˼"�M��4b��[{M���5������s��8��!�
�
�����]�]��<��ݫ���E���!�=ĩ��ġı�Q�9���
�
I�I
D�D�H�D
C�F
N<D�K�@�K\I�B�L�J\H\C<A<��`��|�{
��׈�O�y\�
�,�ׂ/�/�y��=q�*�2��_�Gx���uM�;���^���uX��"��_z3�:
�"�!�&n'. �#��V$_�w�,ɑ<)�")��H�TH���z$>�
J#Irr89�
I�J�"W#W'� �$G�k��k��M�r]r,9�
ON �#�'7 7$7"7&'�����d3'52A�A&I�L�9�܄ܔ����܌ܜ܂ܒ�I�L�2K��Tr9�܊ܚ�����AnC�$g�ےۑ��9�\r
�񷷖��ܞ�O�@�H�D�L�B�J�F. w'sd
�J��y��� ;�.r!����,��d��!>%>#{�=�Y&+d��\B.%��=ɽȽ�}�}�������KɃȃ�C�C�����#�#ɣȣ�c�c������ɓȓ�S�S�����3�3ɳȳ�s�s�����
�
ɋȋ�K�K�����+�+ɫȫ�k�k������ɛț�[�[�����;�;ɻȻ�{�{������ɇȇ�G�G�����'�'ɧȧ�g�g������ɗȗ�W�W [...]
+5�A��V�FQ�Q�SkPkR������u�&j
�.5�G��&P�Q�SPRQS�I�d���S��tʠ��I�(��BmBmJmFmNmAmIٔC��
��\j*5��NmEmM͠��fR��m����
j.5�ڞ�O�@�H�D�L�B�J�F-�v�rT
�J�Qy���:�.j!��*�P�T��z�=�����w���7���U�*T��ZB-���=�����}�}�����������C�C�èé#�#�����c�c���������S�S�Өө3�3�����s�s���
�
�����K�K�˨˩+�+�����k�k���������[�[�ۨ۩;�;�����{�{�����������G�G�Ǩǩ'�'�����g�g���������W�W�רש7�7�����w�w�����������O�O�Ϩϩ/�/�������o�o���������_�_�ߨߩ?�?������eԿ^�&i��i�fi��i�i��i�V�=�
J�W���#���(z5zuz
zMz4��6��D��ץ������z=z}zzCz#zcz"=��L7�qZ��Nt�6�m�S�M�M�����-�-i�v�4����KO��������6�Lz�-�
=��Cϥ������
�
���]�]�����t�n�[�6:O��
t'�E/����.�=t/�]��t���K�t?�'��7��/��?} } }}0}}(}}8}}$}}4}
},}
}<}}"}}2}
+}*}}:}}&}}6}}.}
}>}}!}}1}	})}}9}}%}}5}
}-}
}=}}#}}3}
}+}};}}'}}7}}/}}?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����!���a������Q��1C���0ff83�ɬʌbVcVg�`�dF3k1k3�0M�f]f,3��L`�c�g6`6d6b6f&2���L3g4&���$�I13�لٌٜٔقْ��I3&˸�Tf3�يٚ��l��df1�2�1��9�\f
�=3�فّىٙمٍٕY������ic�L;��t2]�BfS`��"���2{0%��T�>f1��Y��3{2{1{3�0�2�1�30213�0�2�1�3G0G2G1G3�0�2�1�3'0'2'1'3�0�2�1�3g0g2g1g3�0�2�1�30213�0�2�1�3W0W2W1W3�0�2�1�370727173�0�2�1�3w0w2w1w3�0�2�1�30213�0�2�1�3O0O2O1O3�0�2�1�3/0/2/1/3�0�2�1�3o0o2o1o3�0�2�1�30213�0�2�1�3_0_2_1_3�0�2�1�3?0?2?1?3�0�2�1�30 [...]
vMv4��6��Ďa�eDz����v=v}vvCv#vcv";���6�qVc��l�5�k�S�M�M�����-�-Y�u�4�a���Ne���٭ح��6�Lv�-�
;����e�۳��
�
ٝ؝�]�]�����l�ma[�66϶�
l'��.d���-�=l/�[b�l��c�Kإl?�'��7��/��?{ { {{0{{({{8{{${{4{
{,{
{<{{"{{2{
+{*{{:{{&{{6{{.{
{>{{!{{1{	{){{9{{%{{5{
{-{
{={{#{{3{
{+{{;{{'{{7{{/{{?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����#8��8�c8��8�8��8�S8��qC���0nn87�ɭʍ�V�V�����Fskqks�pM�n]n,7��M�����6�6�6�6�&r���\3�4.���%9�Kq7�ۄ۔یۜۂے�9�Ks.˹�Tn7�ۊۚ��m���fq�r�q��9�\n
�=7�ہۑۉۙۅەۍ[������k��\;��ur]�BnWູ"���r{p%��U�>n1��[��s{r{q{s�p�r�q�sprqs�p�r�q�sGpGrGqGs�p�r�q�s'p'r'q's�p�r�q�sgpgrgqgs�p�r�q�sprqs�p�r�q�sWpWrWqWs�p�r�q�s7p7r7q7s�p�r�q�swpwrwqws�p�r�q�sprqs�p�r�q�sOpOrOqOs�p�r�q�s/p/r/q/s�p�r�q�soporoqos�p�r�q�sprqs�p�r�q�s_p_r_q_s�p�r�q�s?p?r?q?s�p�r�q�spr [...]
~M~4��6��ď���������~=~}~~C~#~c~"?���7�q^���|�7�o�S�M�M�����-�-y�w�4�᳼�O���������6�L~�-�
?�����������
�
�����]�]�����|�o�[�6>Ϸ�
|'��/����/�=|/�_��|����K��|?�'��7��/��?  0(8$4
,
<"2
+*:&6.
>!1	)9%5
-
=#3
+;'7/?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7����W R�Z`V�^Q�YPU�	C���0aa�0B)�*�VV��F
k	k
�M�a]a�0N/L��6666&
+���B�4!!�!$SH	�0E�D�T�L�\�B�R�GH
!+��Ta�0]�J�Z�!l#�f	�
+�	��9�\a���0_�A�Q�I�Y�E�U�MX �.��Uh�B��!t
+]�Ba�P����#�
+{%�L�H�$T�[�ۈ��>�f��a1q � q��DXJ\E<*�
{
+{	{
��
+���	�
w
	
��
+�	�
GG
+G	G
��
+�	�
''
+'	'
��
+�	�
gg
+g	g
��
+�	�

+	
��
+�	�G
WW
+W	W
��
+�	�
77
+7	7
��
+�	�
ww
+w	w
��
+�	�

+	
��
+�	�
OO
+O	O
��
+�	�
//
+/	/
��
+�	�
oo
+o	o
��
+�	�

+	
��
+�	�
__
+_	_
��
�
+��
�
??
+?	?
�g
+�g�	�	�
�'
+
�˄E�8[$EJ�EFdEN�EA��D�8�8�8E�EETŘ8D
*W��#đ��(q5quq
qMq��������$��NJ����q=q}qqCq#qcq�8I�,6�qQ�.bR4Ŕh�S�M�M�����-�-E[tĴ���+N���ŭĭ��6�Lq�����8[�#��ۋ��
�
ŝĝ�]�]�����bNl[�61/��
b��%.��[,�=b���X�bE��Kĥb���������������x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�xq�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x����������������������������������������������������������������������������������������������������������������������������L�W"$R�$Zb$V�$^$Q�$YR$U�IC���0ii�4B)�*��V�V�֐֔FKkIkK�HM�i] [...]
yMy��������$��ו������y=y}yyCy#ycy�<I�,7�qY��.rR6�l�S�M�M�����-�-e[v䴜���+O��������6�Ly�����<[�#ϕ������
�
���]�]�����rNn�[�69/��
r��%/���[.�=r���\��rE��K�r���������������|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|����������������������������������������������������������������������������������������������������������������������������L�W!R�ZaV�^Q�YQU�)C���0ee�2B����RVSVW�P�TF+k)k+�(M�e]e [...]
uMu�������ڤ�Q�UǪ����u=u}uuCu#ucu�:I��6�qUS��jR5Քj�S�M�M�����-�-U[uԴ�Q���NU���խԭ��6�Lu�����:[���U�۫��
�
՝ԝ�]�]�����jNmQ[�65���
j�ڥ.T��[-�=j���ZR�jE�S�Kԥj���������������z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z����������������������������������������������������������������������������������������������������������������������������L�7F���cL��q1>&�Ę�cJL��bCbCc�b�Ć�F�F�V����[=�Fl����Z��c�Ěbcb�� [...]
+�`
�� 0�
);PP>R�,����%�}!O�	��&��euD�2����;����
yZM9�:3�%Wb:�_��JW�-�u�����t�&Ӄ�tM7
1w���յPުcီl]բ���R>_,�m]�܌\k_%�|�̨�+�\p3�*����՞)x�����������k��<_
����;U��
�-v��b?
��A�g���:���ؑ+�ur}�����
�P
+b�]C�6��A
�@�	�*�B�Sӌ���+v5Ǔd��<\	�an�#+Վ�td_Б�P�>�e^P�>_��J]����[�WW���+~
:�se~M�Kj�
k����)�ើ�v�{F*[�)v��ڥ�!㐨u*�C�IH2iAڐd2��ti��\
�p-�Z���k��\
�p-�Z.;���Td{����:����m��
l�6�m`����m�β�|̾L�u�� ��l��
`;�v�� �A=
�o�^xiु�^xiु�^xi�Q�4�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g
nj0�;|+г@�=
�,г@�=
t�.�]��@w���.�\K���"�ĹH��l s� ��*r��@���R��f�8����!
�$�	��� mH2
���B�����?�8����?���̩���ڋ����
<��A�

ꨡ�ꨡ�ꨡ�ꨡ|
�'P��@
������o�����
�g >���@\�2��x��K,�%��^xI�%��^xI�G�O/	<x&�L��3�g��	<x&�L����z��7�o����4����_�Ki�/
����4����_�Ki�/
����4
��/
����4����_�Ki�/
����4
�6pm��4p���axA/h���|�!?k���Q�-�{�E�sJU��%�5�_��XtH2	iB��Ξ�E���ŵOِd2��
bN �$�O�'	��I�$�|��#�x
+҂~
�q�ǁ�\�@.Ih��4�[K��
=K*�D�@�I �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�@�	��@�	��@�	����@�I a$0a��	LȄ�e+=Ş��֕/��]e�J�
��9_sŞJ����)��r�����B����{�)����+��b^��4�;�8
����X�q�
;5��� 0o���ɻE{x��NOc���ֹ�ޜ���ni�Q��Q3��
�xD at m�E���a�tut�蹹>
���vv�i�g�rW c[����1��rQC(������w���W�hP9�y��Z��j�ض|���Q�g�j՛�j���E~�
+~Ղ �4U죖vy�)�~t���+W+g}AW�:�������x�lO���6�\�JOm����ZO�k�W&Vp	����f1���o��1Ԍx�i�6pW�4#Ғ�fFZ*ҬPKFh�zs&��Xq=*7
��J�G�i�GkQ�Z���EqjQ�ZT����JND%'��Q[$"�D���0F"�HDz��Gz��Gz�1�.z��Gz���w�D2z"=���HFO�QTf��bF��Q�fT��lF%�Qɩ��TT�T���0RF*�HE�#a�"
+°"
+°"
+°"
+��j at 7�b��+
�
�o�Ec�9iz����43�R�f?��x��!
�|�ױ*ұ*ұ*�Sn4�' >
+#
;|
+$=,+$=l��9Ĉ������������������������]��]��]��]��]��]�n��<��u��u��u��u��u��u��u��u��u��u��u��ӱ�ӱ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ2Ա2Ա2Ա�ױ�ױ [...]
�
�
�
�
�
�
,�
,�
�
�
�
�
,�
�
�
�
�
�
�
�
�
�
�
�
�
�
썍���T/.p���5G��%"M�4#�R�fF�&#[2�Ew!nRKI�Q�=�GZA')F:��LhF�%#͌�T�E�fs��#M��Ռ0�Ì0�Ì0�#a�"�T���0RF*�HE�#a�"
�_�͡�Cj�	H
ҀLB��)H
҆t Ӑ�5��7��7��7��7��7��7��7��7��7��7��7��7��7�!^2�&��|
��7��7��7��7��7��7��7��7��7�m7��M�x9�D�7��M�x9�D�7��M�x9�L�8�'r��
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qba�X'Ɖ�qba�X'Ɖ�qb5��9�i�
d2���qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qc���1��c 
���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
��
+��
+�
+�
+����������5��5��5��5��5��5��5���s
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k�L�Z�
ZsŶR�����'{��b_yq���<}qW9W��1U3[��]U�����U�>�w�7|s�w��
_�=���N����������_�
���p��E���}X���˶68�+�kPJ[�\�{}So`j�/Z��n�w�����.���A��o
~w�j�}�*9���:J�Μ�Ң\�T��UUD��BS_hꋴ���ޥR���"SOd�
�̕s�J.P
�^݃�ݹ�"�/Џ�T�?hE�*
+�.�ﱰ�B�V�t�|����S�����G�۴��Wo����n�]���宥�����|�����Ru(v�բ�0���1�-9�H_o>_
5�(wu��}�R������j/�����B�\Vk�H�=P�z��{�c�l�
ޱ�;6x����
�c�Wl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�?l�
���6�����a�7l�
���6x�?���`�l�
^���m�}y�F����m�iy�F����m�gy�F���gm�Yy�F���gm�Y;����gm�Yy�F���gm�l�l�l�l�l�l|�hc�d��D�'�81���������m���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍w`l���8%�qJf���)��S2�d6N�l���8�q*f�T�Ʃ��S1�b6N�l���8
�qf�4��i���0�a6N�l���8�q
+f���闍�/�_6N��l(Q
Θl�1�8c�q�d�����3&gL6Θl�1�8c�q�d��A�s��
�=y�A�s��
��
�;y�A~s��
�7��A^s��
�3y�A
s��
�#��A�q�w
�
y�A�q�>u�w
�
��A�q�o
����:�A�q��s�7�dhG��򆃼� o8�򆃼� 8��<� 8��<�����w0�
��;��濃��`�;��淃y�`^;��毃y��]5����t0/
�K��槃������<u0?
�O���<t0
�C��������`�98mv0�
�7���i���ag�Ά
�
;8N���4�'��I���4�'��I���4�'��I���4�s�9���F���oi�[��F�������i��4�3��L#������i�s��F?�яi�cy)���F^J#/�����Ki�4�Ry)
�x687�d
R�L@�d҄LAZ�6����@f!�~
�q�ǁ~
�q�ǁ~
�q�ǁ~
�q�ǁ�_�|
��5�k�׀�_�|
��5�k�׀� ~�	�'�� ~�	�'�� ~�	�'�� ~�	�'��_�|
�:�u���ׁ�_�|
�:�u���ׁo � �|��
��7�o � �|��
��7��~�I�'��~�I�'��~�I�'��~�I�'�o��	|�&�M��7�o��	|�&�M��7]n����$���B��5".	���S�O?��S�O?��S����[����[����[��|
��-�[��Q��rm�k�\��(�F�6ʵQ��rm���G�l��F�l���|��
�;�w�� ��|��
�;�w�� ?
�4���O?
�4���O?
�4���O?
�4���O?�
�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?
�,���?
�,���?
�,���?
�,��y���v
&X�/`�
t�.�]��0�]��
�v��.X�K�`i,킥]���
�gC:�i�
d2��
�v��.X�K�`i,킕]��
Vv��.X�+�`a,삅]��
v��.X�
�`a,삅]��
v��
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
vu��������.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E��R�K/��R�k�`M��5]��
�t��n*�C}��.X�k�`M��5]��
�t��.X�k�����|
��-�]]��
vu��.����`W��]]��
vu��.����`W��]]� [...]
+��.��g��g��+?��j�כ/�+��~v�FL"�d�J=�9XTk�`y��t �����RnQ��C�6N2�ѳ���0��5Xrx��Ó6$�4`K
-
,-<�P"!x�W��*��^��J9�e |� 
@l�I[��S��<��r���+~���#8�DhI��Dhk{R�D<IēD<IēD<I4EM�DS$�k{�&�M��7�o��	|�&�M��7�o��	|�s�Rϒ�?���Z_���R����m=K����u���b��S�r
^V��FQ	�[
+�¤�W
U��ȫZjt��ET�.���_�U��I�+W�ݽ�~o�
ަ�ۀ+|���~
<��N7�0�ys@(��z��

Am��M
�����K]�EݹJ'���[���)U�
�\��;
+y����՚��c"Tov+�,�Z�d�����j����oXz2+V:��i�)��rWwW!��WӂU���\Oj���
�A�d��C�k��"^T�+R�K�|o�/֚����B���Яz���꿘�Ɛhn���P�Ԗ���:�
L�x����`4ǫ�x�!�C�IH2iAڐ�W`sm��,�[uH
8{/Oj����V��!nV
��G
q?�T�b�#P��ᾆ4���!Xh��@�4�,

 i�A�� D�!
 ��Uk
�Z{ҏ�
( �w�5�k��]k
�Zkx�ړ~FM� �/[kx�Z���^��𲵆��5�l��ek
/[kx�Z���^��d5 ��gO�t(F<T4(	+�	-Z��s3=tN�B�H1C%�DJxK!�hX���G�a�z�
ƣ�%���FT��
��ޖBO뢠QRh���W�kSh����E���ޮ��^{]�B{��R%�_��;��
����������-`[�`

l�z���d��-Wl��裭�g)7��\Пa����M���'�%/w�탖��rw_����,�����H�F���4 M��iC:�i�
d�
d@?�^pD�I���CG
:���/	��tĥ#.
q�KG\:�����
�e � �|��
��7�o � �|��
��O?	�$��O?	�$��O?	�$��O?	�$��7�o��	|�&�M��7�o��	|�&�M��O?��S�O?��S�O?��S�O?��S���o��|
�Z(φ�
?~6���8m�i#N�و��E�6���8
�� ��|��
�;�w�� ��|��
�;�O?
�4���O?
�4���O?
�4���O?
�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?
�,���?
�,���?
�,��w����
|�.�]��w����
|�.�#�,^����,^�v���ɓ����@f!�@��ɸ��S���P��W_�;���J%�F�����]ޏ��(�D�xuɓ��+F�G�>u��'5�����`y�����j���X�3iHD�P]� ��)O"�bH �D��0��H 
-젅
���ƫT.^�r�
+��W�<�Z�(WG�t���|=�XsXt�M����n���oW�����"��\��vJ��彝޾Q��u�
<2{�T_Wj�
�
����cAK�׸��€꿀��w��sǀ��s@/v
���[������.
kK��+�v�k���nT_�x�X�t�5�mjq@�
p�qn0�Ԙ����4��+��Q.�Ԩ5
�R�^c���
	u��^
D��s��{k�
��f at d�1�zu.�"@�}��Ӫw:p�#4����P�x��+�0������+�w�T	ﴅ��"
U�za�
=Z`h������p�K9��\Ɲrh�z(����-��EO/�&K�b�
+��
ܫ��rq1P��"-2�"c)�@ՂR�(���R�A%�����~e�\d[Ѓᤨ*^��d�;��b��
^=%(
���^
ꀎ�^u��u�&�
_
��
+$�J<W���
+�FUA���-��%������/ɓ��h�P<_��+\��������վ�Cm`Xw�������`B5��EL)�;C�����iq9T1�B=
�D�Etp_���c)�L
Lp�ٍh�
+:�Z!��0�����Dfb8b�FLF[�
ۂI'����;���P��tƌ�IACw�v�
Ak)��#�b4�jrJ1l�"jW�j7�g�a�A�"5�>E�0l4e�;T~
+���)���ݐE�d��K_�J��
+Hd
!�x[�([��-hǖj��B���B��v���w/h�,�F1L��>L��RC� '�aw�g[Kh�:��.�vï;4��BC8a-x�%���,�â00�
+�`(�!�@��>�0�€
+���.) .�
��PU:CS%T���
*��;�lXU�P����D���P�,�x��� ��7,!윪����Ywx�^
O
$&Ey���an�CC%%K
PQ^��S��[y`���W[.
he
���D�
�Sy���a��(t.X�Ն
+�:�ݐ�gg�Y*� Ed��[
(�%\ʴ�KZœ�&��0�� ��e !���
��� S���ЋgZp�%,��vGK��%.E�x0z[��؂�!������u\��Xt}��#���*����V��V����ڧ�=U��U�n�A���T���m ���"��h�+���|MU�=�~�϶^H��5HC.�0zk��]�V��VmӴ�>�R�TK�S-�Sj0 j���Y�\wm��ѭX
�@�k��|-R[`!
r0����ua�;�ھ�
�n�e����(�r
bM�k:�
vNpQS�r]�����E
+o�o�vP����-�6c'⪖�}AT��Ρe9�8
0��U�,Q`���Ec��*��5�::k��
�����Z��XX{ka}��W^ĕ?M+u�^b��Y��ՖS���ZK[]�u������k���Rw�������T{Q�-�\Wo��8�]���JuWu��#�h����RW۞r%ؑ��ۄ���|w��IqX�H�BE�Rfu�

�@�O*T,(��P	
Li�=����溿e�^T�����~�=׏�q�O\��8ȩ?\���êX���
��[�T��f����0�
a����~�A��}E�_)Y��DzR��5�Zs�1x\ӛC%
�5��fmR�eq90�&��Z�Sg
�1B%*f��=3�k�bx�B�N���
�'���G�F�
+��r�:�������7�M��b�/�qRo)_��H4G�
p��ŹJ_�H6(#nהz��2FM�3Xڠ
Fv�2�A#M��cD����E�5�8f�~�m�TM��ڥ�#�b
�d8���F4B��ldL52�uF �ƈ��^�#�F�l�qe����ڠ-�
ڂ��b$�D���
nD�x&�$�zc-Z���R��9����F�8���zDk�#Z���m�M��C�
+3�֠�D��M4j�D��h4��1�h�'a�l�99�Q{5�[�95�Q�5i�AGk�<X?���͔q���GrPsP��H�G<=�܌>{��z��z
���#;��;�G
���F���5ע4��V�/�h���Fs�A5{Ԇ��G5�� F��|
W�-f���7G�V�Z��5᭻�n�QVZ�X���X�K���z<T�PI��
*F�$C�
�T�X,7�Q�`�V���k�F���&-׌���`�>��k`�50�a

�~4,_n�uOfR�����Uw�.�VԑQ�YQ'�a��0�db2
1\�D
���-R���j�6�"�!�"��MV<��}G���m�p��Ha&j+Y֍h����9�����odlD���zZ�B9��EM23�X�b���V�1�>>��!�+��
�1��ce��>���#>�Lכ5�&V�:ze��~齒X��i+5
�� m�m��}��oBfl�
�;
�����j�\��

=�Vz<*X���Gӈ��8��i( �F	'\��/�J��Q�+[�$�Hh�z�A5���-�TM�+X���Q���"J���c�z#FGB_.[wk��e�
��nd�ۍC��
+����cҠ����I��}%����O���gw�ݑ�C*
�j֟$.w��5�
+��N�,
l+��h62��F�t#c��1��h'�F�F5�o7
+�n��426��ݨFv��
����ب�N�j:�:�iTw�Q�
�θ�r#d��Ą��uǂFFo�bw�92F��|G���V�%��[�
+�g��G����so�J�����O��͍A��[Uv�J��[U��X��s��'w��Z�`b�А��Ϣ�T���jd��c���5!X5�R�NJ�
+�����[�����;qL�g���Y����#�x6���7�暛v��nƗ�_�͚��m'
�N.�x����o&Wv�\�M���B�Yq�Ewj>�0U
-�x��=m�����m���
��JR�@Q�ܱ��
��5��<��R{#&XI�5)��G��K�
��)�՘�j;T�iVFpc�j���7��9�GjP{к�$��c�8�A��cЌe�$c�#;�
4Rg��X�$k������Fz�A�*��A�5b�����B��V^����\Q#����<V�\+y,d�F���	���

+���9\p���c��
G+�nL]�YI�Z�m�Az�A�����*�P1B%*a;$��wgt�;c���+�ݰ��c=��D?6�ÏMt=*<��Q�0Z#��H��F�t�5��h62��FF���idL72f���nc4
��FF��1�Ȩ726jO�Q{ڍ��nԞv���5�ݨ��FMg7j:�Q�9���i�JN�Vr5�ӨA�F
�4j�~�mP�G+�܎�����A�8��k?r��>�rF����U���Gb���.n$BE#T��b�i	.��E-A�ǐ��h�����pm��.u���
�栥q��=H��f���,����f����Q���O42��j�gm|8���jd��F�L#c���m`ĉ�rF��1�Ȩ726�;>"X�h626j%�Q���匍Dk� Z�I4j�D}�0�-�~��=�ܨ�5Bs�Fhn��
��Ls���U-ި[㍺5
��w�9L���Q�h�Q7��̠� 3(J�Ax(�����_ h�'rؘa�ac�{�~����w���
�O�_8������q+|Ǐ
k
�~�[_���
+A-���.d�%��p�\e|2�4|�Qc'�7a�<7l�UZ��Q��4��	-��)S� /�{����g���o�	��u{r��������$��ߏ�kM�����O�X�K�}��KO�q�����\�nR�F\LL�}�`�z�
3�l�>�{w��?_��3{���y|�
+1���sc�
;lLӨU�1^P��9��~�ҍ�6���"G��A
s�V�/qۗ��u
�[��a�+7t-k�c��g��'�3�{5ּ6i
+JYo��a��U}�@�G��.�UG�:�
��9%�&�nrݩ#.����c��u�1���c[�[�K��߸˖[�r�[��rڲ�}|�I�-�B���æ��2�
��⅗Un~`����][����[�L�^�-�
��t�.���}i����˖y}F�#���%�-ko�Zc{/�i̶D����+������{h$7v]/D����W�s����H=�?\�^yA�����1ʕ�U�O���X�9�����Y2���
�4����o�a�<+�N?{���I��d�z�z��#�Is�*��
w�H�����g$�┡�O��
���Ϲ�����hUD,UZ�KwEa�E�%E
� *���R(N��C$���]7p1ƙM��.�e
*1��fQ�͑���ڲ����e[\��q�/߹�>����ۤ7P$
��M,�Z�ً�?�,{+���<�x��� ��'��h�O
6�۴�yI���*{xu���E�ۥ�=ۮ�o��6�_���)�KO.H�[�
r#�����4���*��\�;�O.)�]��F;b�����‰chU�
*��hw�
�%Ӥ��!�4!�؍
+�G׆�;�e�;��hW�縷������%
mh{
i:��Zƀ��#�aZʼ�ZL�j��5wW�{ۊ+ˮ�(�(���􄼔�ڔ�
��f��Ÿ
����B!��
�}|�8�L�sO�R����`�b[��$�Xƌ�	$�r-(o�#B>�iY
�Ƶh��K��SEIͮ[�*�f*�?�Df��)-
��n���w\���W����1}��42�8C�;+}S*hf�$�(!CNfH0'�Q�����T6�l9H:z�]揟��VM�;J�;;��$;�d�<)��ѤN?�9��5���m�
Kb7�ׄ�X
T^�����ju:I	���[�W������}S�;3zBjf��w������
ǰ��6j�{އ8����/h)��HK��[����H�1g]x�aF�A�
��W7Zz!��^�qy�~���������xa���-�yӚ����|Aj5L!�sln�8��Ɨ�q�F�ɜ�"��j�Gա
�
]�
���]ұ|�('7tٍ�i�\Eh~\��h��=Pʖ
+?:g��h�G��4� qo�8-�ȒC�?0ۍ[���#H;J#ʰ �t�ژ�ă_���� ���:s?��0O�y���	�ܸZ�>Z�lF�_I";m_վ������^9���_ؑ�h[
��EӠ�Nk٩��8����
���Q��w[�#�.b���@�$�5
j�,z���)4]��)۴��n�X���Q��L�d���y�D�u����^�x��OP`k �ž���C5 ���
+���e��QD}oB������8�<@Ʀ~c�N)/v*<��3
+z�	v�@KѨ>A��֠�@;�$_l�Hٷ͐[D�ֆș����7b���}hΚ�O	�D�kC���C���O߽�S�Q�
�#�AAq�2�E�JV�dj�c�5{���s`mh���$��l��
�N�
���/�C�^*�©��S1wjb�A�	��FJYm�,�'8׹n�A*���z��
�
�D^���#A�U�@۪"u�'Y\5 at q5W�E�K
�0����Ս�*��,�'�B�-Tf91
�
����t��2�7~��D���4���C�oOiw��5�H1�ϸ�Y�>pqf���ӂ����T��b����lnn'�&�G��c�v
6�q�����,8�⫄��
".�qxH�H
YN��SR*��ٱ�����
<x����
<x����
<x�������W^��_ғ�b !<������
Y�GJ �y-FQ�1�q(^��PRr��T���"��|
��ޠP'7S�
��0��3�S���C>��~d�yޘ���(
+E���`
�4(�����Q
+Z�Ra��2�
+�iߓ�V�z�:����9�^>
D��/]��k\�E�|t��Hp��Qztԑi������7l�Ҁt�g
�d;���˨ҁ��ݨ����"�Q
�;|�|�K��,�k.�b��ޞ�+��zFL��uh��q�9�����cT� E��`endstream
+endobj
+4680 0 obj
+21062
+endobj
+4660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 326.4579 192.5442 336.3856]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+4663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 244.7191 198.3629 255.6231]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_b30ab523e337d72baa4edc802452e532) >>
+>> endobj
+4665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 205.8648 198.3629 216.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_044dbf593127c9e8cbbbe2a0d169c30c) >>
+>> endobj
+4666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.7001 205.8648 275.8318 216.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 167.0106 198.3629 177.9145]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_535895e2351f7618e9107a38d9285d73) >>
+>> endobj
+4668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.7001 167.0106 269.2063 177.9145]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 117.1974 198.3629 128.1013]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_6b5016000dff8b0c774381316acc0a11) >>
+>> endobj
+4671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.7001 117.1974 303.5272 128.1013]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+4672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4655 0 obj <<
+/D [4653 0 R /XYZ 90 757.9346 null]
+>> endobj
+4656 0 obj <<
+/D [4653 0 R /XYZ 90 733.028 null]
+>> endobj
+4615 0 obj <<
+/D [4653 0 R /XYZ 90 703.2841 null]
+>> endobj
+4657 0 obj <<
+/D [4653 0 R /XYZ 90 688.7138 null]
+>> endobj
+4616 0 obj <<
+/D [4653 0 R /XYZ 90 641.1761 null]
+>> endobj
+4658 0 obj <<
+/D [4653 0 R /XYZ 90 626.6058 null]
+>> endobj
+1428 0 obj <<
+/D [4653 0 R /XYZ 90 528.5468 null]
+>> endobj
+170 0 obj <<
+/D [4653 0 R /XYZ 90 521.9466 null]
+>> endobj
+4659 0 obj <<
+/D [4653 0 R /XYZ 90 344.4555 null]
+>> endobj
+4661 0 obj <<
+/D [4653 0 R /XYZ 90 263.693 null]
+>> endobj
+4662 0 obj <<
+/D [4653 0 R /XYZ 90 263.693 null]
+>> endobj
+4664 0 obj <<
+/D [4653 0 R /XYZ 90 224.9582 null]
+>> endobj
+4669 0 obj <<
+/D [4653 0 R /XYZ 90 136.2907 null]
+>> endobj
+4652 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F8 568 0 R /F74 482 0 R /F100 2198 0 R /F36 2201 0 R /F99 2085 0 R >>
+/XObject << /Im3 4651 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4684 0 obj <<
+/Length 3119      
+/Filter /FlateDecode
+>>
+stream
+x��\�r�}�W�i#WE�/��C��Tv��d�y�l�82�f�DjIy&�קA0x@��lek
F����ƅ"+
����
+��j��«{x��W��x�oB��o���I��AFR����Z�	J����5!�\o�x���uV��w�����C~Wg�->�Y�����Uy_?��6����
����
+��z�5M��}�)���^[�5KYe������7�h��$�4���{����|s�3Z���c�j�)s�>\����>h�0��q�%|�d�(CX
+��%h/�%�L�٨��R1n��-*�*48�ȑ�8w��w�����/B ��L�s��i?�����*Ju�Q)� -�
����8vN�D�H>r~2
��1��(
���	�Q,<*A�A>I��
���72
1
+IW
+kD(��L$$3d0��"����hi)��@
(�.�ae�+����5S뻢����w[
�6m�Տ�c�L���-M��x9o�h���oy��RsD�D"9{X:7
�5R3��R�b.3�0Öڨ
+)�5�_4`)��cm�xЄ�0g�'%
�86\�4�JE�����p�0����a)4bX�KK.R������e`���g�Gf�n����	n���j2�	�=�GNO��p?�k�W���`x�vB���$T���Q)� ��
���҈r*���S4&v�͗#����£$�dP�1:�	S2����9
+؈)��Y^�k����屛.퀹&b��5��3��$P
���8�I�֤����g�5)dwW@���*o�O�|�Ưh%$“"v�<5A�+���p��!�t�l��aLd:Jt�Q	
+TPQX�:���}7�#n(
+�?��9�ڈ$��Y����c]�
��C޽x�Z�Q�F���	�}�ƹ{	�������)Xh���F
+� ܇�o=�8>�a�E�a
�@ԩ�Ln�1��
&��P�񮦉$��%�;48�h�J�ui;����v��֣X���NH�O1�ص
��6��1��
�	��� x=H��
	�G8=�C����K���	S��V�"
ߋ�£R$
��T�!	?�/&P6�9=K�1ar�P��s?
0�D�9'
��
T���w����~q
͈WHSI^A��<z���V޿��ѱh��j�t
���ޛq�A�I]�V� #�E
+Ro��*������`L�~�.�~�8�D�
&v-�����e�՝>�"o�"kn�I<
� BaU��Q��\!
in�Y�؈����bU"}�
+W�Ue_M�k_�;����H	T�
.��
�<a���kW��D�{X2�C��dO�u�>���=B)�	hB��w$�{|���n��;ۃc
+�#*�L4ߡR��DJ6
+{b�+�k�<'�C����.���=����9��v��֗M�(i��8^�K��J&��|2a���0��
f��:Vw3p,c
,�1��X�����	��3f�{I��YL�J]6y=��TE\�D�
*�Y�jУ��Z5-mu���S4&v���Ia D�c�@	ߔA��
X,DE�A��	;K41�p0K�/��S�(��k(���5]�����T����v�[#��pc����~���V�]-�k��mWd���c�����C:s*����Z���w���B��)�����I�C����\L�N�N�2:^��Q
+c�K40��g	���
+�;-�˚��Qc���5�J�k
ʖ�"�|�����`�ҁ믶1�cF!��9���(�C
�����G)c��|�c(��^�RCD�C�F�"yr@�o�YL�w#
+0ơ
+�N�3
�UK
H!%P��e�8���3�Ww���{�=��Pa��TK���k)P������M6Bw���SX��}'�A���2I'*u*�aI�

FD6�ש��oRf���l��������Km³��aܓb�4 ^m4&v��QKmw�u<
� A�{ԣ^H
73�W����FL}
����
��.��'
6���^�2(�A�.yD� �B�����20ȸ_/��ߴ@|/�8��]ˢηvR��`ܞ�K�I`���C%xPL�!l�
 �Ӌx
OVX�E��
�v�)��L茕ҡR$�A
+�Qw$�k$�9�nAh#��6���`k��N��X����
5QB�5/8_��$��Z at J|ɋ
�^g��

����`D~�$�F�~
�%L�Z�� +�1�&�$��P)�P	�Ð/?��0•g
�6"�a������ز����P
cy�swʡ�<u��a�

��6�קm�
��ű��;�FH�dD�t������V?r[��崂��q�x
*��H$$�0�/�`H1?+��
v��
A�i;�M��ۇjF�"]��S\�V�c�����<��b��xT�D�qh˭�C�L;ٷ��#Ӿ ����k��lߘ�@AOy��̨}����q$���E�3eջkg���k�����M�+W�}
+�0�(��f�!k��l�r��P�@���z��i��7~��GV����'dHf��=(Nab+z��B�k
��-
+���vKJ{h0"�	�N�~�I��@Z�L�V��lf�j	
'�h~J���J���\��
�F�u~ڈH�����
Kt���)G������݅���z�DC�����h�
�{�Lw��J=��a�t
��=�ק{�7� �]� K0��m��v�ø26ϣ�v��WA������D�Q��z�8�Ktk��
��1�a��0�_�/���Y]d�۲��{�Mv,[�Dv&#��|��K^�tb�~�*�ΧO�n����)���?Qe0R��(���*�fj���$S�0=V�lw��-�ۏOǙ��jf!i��ƣD(4�q�G
����
��t6ȼ�F,�
���F��'�o�z��]8�Ov���n���"�sߚ���6������
�@��9�fi5�È ��S��������
6`�
��bOeE��~����B�} � [...]
+endobj
+4683 0 obj <<
+/Type /Page
+/Contents 4684 0 R
+/Resources 4682 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4673 0 R
+/Annots [ 4687 0 R 4688 0 R 4690 0 R 4692 0 R 4693 0 R 4694 0 R 4696 0 R 4697 0 R 4699 0 R 4700 0 R 4702 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4712 0 R 4713 0 R 4715 0 R 4717 0 R 4718 0 R 4719 0 R 4721 0 R 4722 0 R 4724 0 R 4726 0 R 4727 0 R 4728 0 R ]
+>> endobj
+4687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 198.3629 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_cf4cf2f1d8c3e1d339b1eddc94139272) >>
+>> endobj
+4688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.7001 719.9123 310.1526 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.058 206.1117 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_9d7fe3b07d9e1d35c04fa2d81e32bf34) >>
+>> endobj
+4692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 642.2037 198.3629 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4693 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.1025 642.2037 249.9091 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_39867871dd0a4fbe2f3cef2695881345) >>
+>> endobj
+4694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.2463 642.2037 361.6988 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4696 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 603.3494 179.5535 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4697 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 603.3494 250.6661 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_fefca839fc7b4d2d166e7a1fe6196fd5) >>
+>> endobj
+4699 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 564.4951 182.0442 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_ddf5f330215fb1878018673eff609704) >>
+>> endobj
+4700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.3814 564.4951 293.8339 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4702 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 525.6408 220.2203 536.5447]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_e4a4890ceb257496b788e0d31dbf6d7f) >>
+>> endobj
+4704 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 487.1601 155.2649 497.6904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_3fe60e1a76b2a92143004e52ccfcb7c7) >>
+>> endobj
+4705 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 447.9322 158.0444 458.8361]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_0a4f8e3f3469f021594ea9311c21aadd) >>
+>> endobj
+4706 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.3815 447.9322 235.5132 458.8361]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4707 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 409.4515 158.0444 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_067b4c27cf8643f8ded50ebda77da8aa) >>
+>> endobj
+4708 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.3815 409.4515 228.8878 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4709 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 359.2647 158.0444 370.1686]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_37857f2dfb7b17609b671f9070be15ca) >>
+>> endobj
+4710 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.3815 359.2647 269.8341 370.1686]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4712 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 320.4104 199.9469 331.3143]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_99161b46c175aa485608154dbcc866cb) >>
+>> endobj
+4713 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.7625 320.4104 288.2151 331.3143]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 281.5561 161.0133 292.46]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_0bf701759fc56f8fb215c273e53b46ae) >>
+>> endobj
+4717 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 242.7018 195.1648 253.6057]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1685b5eb65ba36a9e715a8e3344dbcd8) >>
+>> endobj
+4718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.0688 228.0811 225.7385 237.9863]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+4719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.1476 217.1221 227.8174 227.0274]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+4721 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 193.2622 187.5633 203.7925]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_5c85932f5fb67a78d1faf8165783d5d3) >>
+>> endobj
+4722 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4816 178.2679 271.1514 188.1731]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+4724 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 154.4079 150.493 164.9382]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_562fa08178e809398402920e5e674ff8) >>
+>> endobj
+4726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 115.18 191.7178 126.0839]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 115.18 288.8524 126.0839]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_77c72d8473dc3e9856d7ff6c05ce7b07) >>
+>> endobj
+4728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4685 0 obj <<
+/D [4683 0 R /XYZ 90 757.9346 null]
+>> endobj
+4686 0 obj <<
+/D [4683 0 R /XYZ 90 733.028 null]
+>> endobj
+4689 0 obj <<
+/D [4683 0 R /XYZ 90 700.1513 null]
+>> endobj
+4691 0 obj <<
+/D [4683 0 R /XYZ 90 661.297 null]
+>> endobj
+4695 0 obj <<
+/D [4683 0 R /XYZ 90 622.4427 null]
+>> endobj
+4698 0 obj <<
+/D [4683 0 R /XYZ 90 583.5884 null]
+>> endobj
+4701 0 obj <<
+/D [4683 0 R /XYZ 90 544.7341 null]
+>> endobj
+4703 0 obj <<
+/D [4683 0 R /XYZ 90 505.8798 null]
+>> endobj
+4711 0 obj <<
+/D [4683 0 R /XYZ 90 339.5037 null]
+>> endobj
+4714 0 obj <<
+/D [4683 0 R /XYZ 90 300.6494 null]
+>> endobj
+4716 0 obj <<
+/D [4683 0 R /XYZ 90 261.7951 null]
+>> endobj
+4720 0 obj <<
+/D [4683 0 R /XYZ 90 211.9819 null]
+>> endobj
+4723 0 obj <<
+/D [4683 0 R /XYZ 90 173.1276 null]
+>> endobj
+4725 0 obj <<
+/D [4683 0 R /XYZ 90 134.2733 null]
+>> endobj
+4682 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4734 0 obj <<
+/Length 2582      
+/Filter /FlateDecode
+>>
+stream
+xڵ[�r�6}�W�iV��`�/~�M�LmvS5;�}ʦT�D۬�(����|}$A�7@^ŕJ��Q�A�� 
0d���0x��B�q��
���>�tEگ����������
���rq{_[�	J��v�˒dVk�1^~^�L�C����xyܿ<��"��+�+������c�P<��6�|})��ZS��?l^~I��bE�҂�Y"Ȓh��������vD�q&�����/������F�h�x�7c��p�)so�W_����i��0���q�%�r6^�!,��%�/�%�L�E�Q�/�b8&��WT��op�#�	pn����W_<^� Ke�p=v��p,^6e�=�T/�t��`�(A�q�U��ar�F�:\�i�"b��J�<�oZ�Y��{��rȚa���&�zݡ"|�H(&��I���c^V�iV�HֈP2ɂH�@(;<I�P��Mٵo����BE��Q��2�Օ��%�������1m^عn^ey�a��x?@7�n_'yb
���'ݹ�a_��	i
���
�&���Hb�ZL���
�74
+
+т�\������ǘ���������搗�D���ŋ�����lJߧ��i^f�|��F�>D�.{'�	�\�I�I�O�M��S�Ϫl\�ÊD��\w��{�9�Ĉ��_�RD�"�Ըo#P�
l��!nw���J�5��E$4b ��YD\ &����ū�3xy��uu�;��<�^Ia�])�<m-���)-6�nw6�)H�ZoC|�
*„j�06&o)+��,����<��r���թXq��a��b;_g� .�y�:�J�YCu�`�:�
���P1�]�~�{�l7�
�56�}�����1#��E�\75�
!�"��
��Rb0~[#��ya���cw���]�`ܮ��Z2�h8
+
*B�r	�t�ć�CY��L�[A��%Z��hA���>'�rj�K"ˆ?a�ː�ش��z�0D���2a$֒�씅�H#�Q|����Għ�E��7��_'>=�Q���>C|",Fv-�d��<�Y�)�+*���&�w�N��x���5D��ҡ"������l0
�D�z[
煤�G
���U
�B.0ǠCE0�@�a�?d$A�œ^$H��� 9����ݮ�+5�	�%?%5
i-[L�uy�mSb	7a�)h������m�]Sr�=m|���ձ���Z�IUd�~X�9V�
*!�f�{�?
pP(���~�c/�Ik�
j�~a��r�B�!B6Ӧ��־�|�^ ����Jˋs|���@�`�j֟*��mC����޽�9}ݍ~|ʷ�J9q|ʕ }�I��k�����W���ur��[6���F�B���
��0�W&j�Ls(
+g
�R{�hO�#<;\��!��)O	l�:�#�6
��
����0
+i�Sֵ{3�%T�����md����x�����W��k^���~��"	�>��a4�3��#�GV�ڭ3X�)�]0�����E��>�m�F�֍}}:?���#Lߵ��Na�w[�W3
2�a
,�a������ �a�>�yEs���]˨[p'.�b��H<
*�
�D�N��!&�"B/k�|!�p0��]T�"������N�}�����h������
�{įK���7�{���
a4�۶�4�Nw
���<��y7��{N�3�U�u��@�w0��ݠg����LQ���
�]�d���������
�{�o��_?ߧ�%t������^����=�l�#�GtFg{-*Bž��e��0u�@8��Ơ��܏�Z��~
�&x�
N���,�#)�
+�CE�F��1V�������=��w��3�3;��Uۊ���e<�i��`��l��c�����q
���'�2��4�v$�D��lOY�M���:�31yH .D�d5����T�*�V�Ɍs�l�!1a����������*��N|{~����t@ b�����@��1٭�Կ�;���$�}�I{d/��P:�i�f���r�\����86�ܨt���]K�S��6��<-��X�X#�)
�CE0����3��p�3��
+�E'|���w0_�'�`1�\s�dS�)������2
�a†B�><���ܞy���}���TP$�eݛocR
)�H`�
M|,�4�MI
�TL�Y����`Q�
z|���_'u=���
����=/wc1��6�O)A:�Ђb����dj��ks��E={�e0�[/��ԫy
��G����)��դ�9T���1���o?
�r�t��
Q��۝
Ѻ��a�����
�!��Ώe�����6Dӫg�Z����S�^��X
���(
�e�%���,
��:�[w.5���}�Y���jwsS>7�9��̉��1Fc}I{���G�\�1L�B^�t��.R��
�zʮ
+�"��5g{�n	��}벴y�fc��?eZ�e%IJ]N�]��nM���%Pŧ"��fZA����t|c��=� 
�:Jͷ�[�W���k��~Ѭ���Ȯ
�cU�n�����ѶDOyv*PV]�N��R��;k=^��qF\z��Vp�u����mOǢ{&
><$�W%� �T� �>�endstream
+endobj
+4733 0 obj <<
+/Type /Page
+/Contents 4734 0 R
+/Resources 4732 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4673 0 R
+/Annots [ 4737 0 R 4738 0 R 4740 0 R 4741 0 R 4743 0 R 4744 0 R 4746 0 R 4747 0 R 4748 0 R 4749 0 R 4752 0 R 4753 0 R 4754 0 R 4756 0 R 4758 0 R 4760 0 R 4761 0 R 4762 0 R 4765 0 R 4766 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R ]
+>> endobj
+4737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 191.7178 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4738 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 719.9123 303.0791 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_a341843d5eadfc196441cad0af63ac9d) >>
+>> endobj
+4740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.058 179.5535 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 681.058 242.9251 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_548ae200545f7d25b875f190b5611368) >>
+>> endobj
+4743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 642.2037 179.5535 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 642.2037 285.5155 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_ec5860620ae92988c1740dc393064fe7) >>
+>> endobj
+4746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 603.3494 156.2812 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_dd39af06cea8afa45c772e94db8a1309) >>
+>> endobj
+4747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 603.3494 244.5494 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 564.4951 252.9879 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_7f5a110ccdfd8efa5e0eac984f90d753) >>
+>> endobj
+4749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8035 564.4951 322.4467 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 472.7737 203.0748 483.6776]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 472.7737 296.3242 483.6776]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_21f1586e66349acf7aa0d70c77f92b60) >>
+>> endobj
+4754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 458.1529 352.2071 468.0582]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 434.293 194.2975 444.8233]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_6e742d7ffa4f4b7037760cf3ebf62348) >>
+>> endobj
+4758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 395.4387 188.7586 405.969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_f97f2d43a487ec81e040aec36bbc6ebe) >>
+>> endobj
+4760 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 356.2108 245.4057 367.1147]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4761 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.1453 356.2108 325.654 367.1147]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_11de7a0cc309058d6aee273d613c9432) >>
+>> endobj
+4762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.844 341.59 367.9963 351.4953]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_8aab82f7118966662582f88725ce4735) >>
+>> endobj
+4765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 275.4483 237.3759 286.3522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_a83361b2264ca8ed30599dca32447874) >>
+>> endobj
+4766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.713 275.4483 329.7785 286.3522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+4768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.8393 194.6857 170.2053 205.5897]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_5cd2538767045bd89360588c37d2aedb) >>
+>> endobj
+4769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.945 194.6857 383.4799 205.5897]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4770 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 194.6857 513.9963 205.5897]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 182.7306 233.7796 193.6345]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4772 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4735 0 obj <<
+/D [4733 0 R /XYZ 90 757.9346 null]
+>> endobj
+4736 0 obj <<
+/D [4733 0 R /XYZ 90 733.028 null]
+>> endobj
+4739 0 obj <<
+/D [4733 0 R /XYZ 90 700.1513 null]
+>> endobj
+4742 0 obj <<
+/D [4733 0 R /XYZ 90 661.297 null]
+>> endobj
+4745 0 obj <<
+/D [4733 0 R /XYZ 90 622.4427 null]
+>> endobj
+4750 0 obj <<
+/D [4733 0 R /XYZ 90 491.7475 null]
+>> endobj
+4751 0 obj <<
+/D [4733 0 R /XYZ 90 491.7475 null]
+>> endobj
+4755 0 obj <<
+/D [4733 0 R /XYZ 90 453.0127 null]
+>> endobj
+4757 0 obj <<
+/D [4733 0 R /XYZ 90 414.1584 null]
+>> endobj
+4759 0 obj <<
+/D [4733 0 R /XYZ 90 375.3041 null]
+>> endobj
+4763 0 obj <<
+/D [4733 0 R /XYZ 90 294.4221 null]
+>> endobj
+4764 0 obj <<
+/D [4733 0 R /XYZ 90 294.4221 null]
+>> endobj
+4767 0 obj <<
+/D [4733 0 R /XYZ 90 213.6596 null]
+>> endobj
+4732 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4777 0 obj <<
+/Length 2554      
+/Filter /FlateDecode
+>>
+stream
+x��Z������4��3�/Q���� �׻m
49
�wW�m9�|��_�>d��C��%j8
��73��l��E��$R-6�+�x��ﯘ�������۫��T��H��Z��[���3��-~Z2F�՚QJ�oV�.�z�x��tYmO����.��>��|S���ȯw��5�՚'t��6o���ܛz����-Kؒi�z��շ���~�P
�����tQ�~~��Dd:Y<�
%,��bw%�/۫wW���v”:&>E\���0��צ�˭)��^�fS���������
1�sI�̘��G7���Tݻ�M�Ɔ #��R���n�~��/��_̦����}4�ac�>P+Ӝd���ҌЌeN+��~�4o#�t��x�URooc�(��
�p����30RG��\i�R0SO��q���O�w��H߯`$˒����qۖ�h�Y�� �6���i��Դa'L�t�x�P�K�	��x„aF|��ɡ ZX�r
,�Q�����NVkI��?
�1נ�}c��?�k�
����gB0�ز9�$8^�;�o ������c[��������
�K�
����vj*��c޺'�
��(R݀5����	���R��Q�&�;��qŒ%�XU�/�]2��Ne��9TM� H�Dϓ����s�h�c¢Գ��PU?��dP��|w�v��,�;�q4q���O at ae~�3-���Ĉ��%����yp5�J�|_LqQD��,���"��~/��v[��O��(����BQIR�{F��<��.;�
�W)e.�S��T������[�l�|��&���U�&�J&�'�e
픓A|�g�!�c�qR��T ��H3m%����S%������z	0��
Jp��lH�J6�
����c�-�R&um�C�/:ƭǙ| ��Q�`|�?�eѡ��P!���� 2�o
	�8��H�BeYH�|�'<]�Odr����8�h��':qL~��;����z�桙rc&.��?;������:�in�@S�!Q+Jh*��� [...]
+�e���u�A������
���溗�)͂{@��T�'�&1h�CM�e�e�Xr
�	K�R�<�y��P!%��x^2gD~";�1|E�����}@�y�=^��Y���X�A�;�Y�Y
+���;�J;WF�,W�f<T0�}����#�9N�ฤ�E���ka���+r�oU�0#MR��e����aF`��L����ϋ��r$�4�td�:J�Q
%�PG��^
�#������_GY.�:
+h,��[<

	C�u�P�8�k\7)!�_���S8FJD֋ X�G �ԝ
W�.GE�'�]V+�J�?���
M��а+�ק�WL~�:�ߦ����z�H/6?
�@�j��j>h9��"IuW>Λ��g3�֝�Վ�
&޷���w#\_?�/|s9�l�?�8���F�6+d�"���þr�Ǽ�!
_$ l��BT�Q��o���
b�s�i�rZG�c��`=��	���xE�)!@M�wCw��֦�Ks.'
(���V8���
į=?L!h�'7>)?��GH
�7����o�~j�K��b
�X�Mp�'1�h:GŸ4Un���p�C9
���Pȿ,[Vu�P�-
1=0;|��'���W@���;c�`Vm�� ��D�
�Z�ӟ#��,��3"
|򬝏 л+6�v�Sq<l�M�vº�`�O��͝/�+t�Q�����m�7y�=��

��i7�cp
��pʶx����+�
 ���>����.z���6�	�
ǵ����˙����������K
�����N
Y�z�$�Y
uBQ� ��\h�k0P!g��O�
-�ʡ�yF�����8�)ĉ��K���H���\��@P�vc�H�]K"����M	�3 OP�2C%4���q{�{�0.��I��L,Ɖ�B��X��/
ETg�.�E[��l olM�5
+��C����!|����� �
������[C�
�̀sA�����K:�^�\2�1�<d�$��ː�h�
+afI"�o
6��_^(
'��P�
e���@e�]���r��l�o��C^?X$
I�a���EetD#I�w��wϱ$���k^����H�nE�
b��p�:�}���}!��n�.݄� W�I�&��)��J��tkn������e,��9"!z�o0mc�!
�W����ߡ���*I�^#�����`���>+�� ��9s]�3�+L,��b��%��ߋ���~9LXG3Bs��/n��m7��OOOdӐ�<Ԥl����P.I)�x*.Yo��d�_B|��%��>����NY`pgK��aPL��_ɶT�endstream
+endobj
+4776 0 obj <<
+/Type /Page
+/Contents 4777 0 R
+/Resources 4775 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4673 0 R
+/Annots [ 4780 0 R 4781 0 R 4784 0 R ]
+>> endobj
+4780 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.9103 677.9388 266.3628 688.8427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4781 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [111.1844 665.9836 161.3161 676.8875]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4784 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4778 0 obj <<
+/D [4776 0 R /XYZ 90 757.9346 null]
+>> endobj
+4779 0 obj <<
+/D [4776 0 R /XYZ 90 733.028 null]
+>> endobj
+4782 0 obj <<
+/D [4776 0 R /XYZ 90 217.0446 null]
+>> endobj
+4681 0 obj <<
+/D [4776 0 R /XYZ 90 194.7329 null]
+>> endobj
+4783 0 obj <<
+/D [4776 0 R /XYZ 90 194.7329 null]
+>> endobj
+4775 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F33 485 0 R /F7 574 0 R /F8 568 0 R /F11 416 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4787 0 obj <<
+/Length 2286      
+/Filter /FlateDecode
+>>
+stream
+xڵY[s۸~���S+MK��ߒ����L�q�Ҍ��`�S�Ԓ�*�_�� A���?���s��w@���G/�P�0.��^<��_���
~�b���W��Xd$�����$HPB���KB���`���W/�z�߽_Q����OvS�w�,��~����*�-����s����ͺ*���hm��U�ʨ���y�t���[��^�I��h�$��>��t���xo�`�8����	/6`�OW1�����1t��┅����տ�u����{a��eK��
b��~��{���P�ۢ*��ߪ�ag�6���:�0�
1nH�"�J�;WW�f�qͿ��E�غ���
��
Gi7�?9�����	FT)
z:�֏����c�z	؃�2�:'IM�"s&
+���cQn��~�f��q8�($)�
�oG���&�X
f5�
z`�Ѓ#�!��L�T4�����:y���;�?w����>�������S�,7'>���҉�5���m����v�aXХ�����Mk a�]�Hi��n��]F�@Dr���η�E'�����Y
q.���b��ֻ�wi�<��w)+�����n�q��+���ѽ
'P�$XI��A�h
'�%�[�[��͏�ʓ�{���ǩ�b�CӐ2�!�7��,�&�͘.������BșL�Hl^�)��L��(U`�90��$����v���AxpW"q�FD=��D�V2Jb���e�i�{��lWm۪{���}p�d=�9��s���
I�
��Wf�	�
8h
�xF3~�
*.���h��@���b��Xj^0�A�3X�Ã0�����ݻR�ܜ��HS1����3%�fJ�
+)�ĸ�S�i7.�W
�ܵ���G_�gJ���.zd��+3�
�"x�(s�TW+*��r�L"9)br��Tbhġ��E����v��|;��O�$�B��ňr����q�3�<#�2P�[H<��[n&=$�O��uJ1-t/J1��&a�ʠ_`ZhѰ4�
�rq�%!���
�2A����F�}�GX����
K��T��hZ�]+<�8��rʔ��Cwi8
'����E&�	�
i��u'���^��͗Rb
+�8�8�y�@��*���ݡ,�;ک�
+��./7w�j{ؕ��4�^�k��6u
�e�xOb
�Q��
+�!�Ӳ�f�i��xh��]��U����
�Ÿ^�驜��7J��e�����Wu���{���+ۿk��ǩ{��ۺ�
hf����p��x��YB�
�ܻXw��
�k:�E���㊸Z�7

g�/��ϣ�r�����_��w����,�jpJ�
5x�I�bq�'�� 6X\v� 5�wJb�"����{{�L5��W�r�
j�PVM�ƣ�p ��
± "�b�2�W
����"��'?�+
+2�p���v
y���Jy�����0��C:։���2j�ib��P���<��.��@��e�M��`ǜ 
Hub���)jL�CN�ɐV�O
�������'^�B��������
+�g��g�z�A��")*��1h+	ͪ"��'B�]����]
+�0��^mE
�,���+X�#���&d�BZ�H�s�I���]� ��ل��P:���E��
+�$I�3
+zF
�l�J>�2��m�
w�gS��
+r9
�d ��_��g�i�1��k����<�
Yw����z��j�c�Ŋ���Tw�8��냢0���4� ��SY<W�]w�W�
z��"�QG���<rG8]Y���P&���
��a����5o��:��Q�
�@=T������$]T�
khW�Յ-7�roB���
���_s;�S�ӌ/�c�wO�3ٗ7��*��2
+eM��ڟ��eѽ.�tF���y�UY8XB�:m�.�w�>�@���\}~�}��Q
i:�|�RW�RK���>��ڷ�6թs 2BB��W
>b�;5� ���1A�3q�j3�N �@!C����*�����_��|��݌a e|36��c���I|#"�˕9��+H4�X"�4��A�T�d�E�L.�8H��/c)����[��4 at j�jw+��3�"F���RG��?�9 0
$˙/��Y��9�|����b6yn�&_+G�
��CҴEw
(a��t�#R�o����$��!��1
K[��$_�;]d�aM7���
�����+!�}�����ps瘶�U3$
�������L_�>X{��@	:����_��O?���hFwҌ��l]g�S��o����#Z7ڊ}����}}��oD�b���
B3]&��p&��ыu�iW��}�ka<y�p��{��p��7endstream
+endobj
+4786 0 obj <<
+/Type /Page
+/Contents 4787 0 R
+/Resources 4785 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4673 0 R
+/Annots [ 4796 0 R ]
+>> endobj
+4796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4788 0 obj <<
+/D [4786 0 R /XYZ 90 757.9346 null]
+>> endobj
+4789 0 obj <<
+/D [4786 0 R /XYZ 90 733.028 null]
+>> endobj
+4729 0 obj <<
+/D [4786 0 R /XYZ 90 716.2211 null]
+>> endobj
+4790 0 obj <<
+/D [4786 0 R /XYZ 90 716.2211 null]
+>> endobj
+4730 0 obj <<
+/D [4786 0 R /XYZ 349.8132 651.5123 null]
+>> endobj
+4791 0 obj <<
+/D [4786 0 R /XYZ 90 635.181 null]
+>> endobj
+4731 0 obj <<
+/D [4786 0 R /XYZ 90 519.3087 null]
+>> endobj
+4792 0 obj <<
+/D [4786 0 R /XYZ 90 505.1343 null]
+>> endobj
+4773 0 obj <<
+/D [4786 0 R /XYZ 285.395 442.3383 null]
+>> endobj
+4793 0 obj <<
+/D [4786 0 R /XYZ 90 426.007 null]
+>> endobj
+4794 0 obj <<
+/D [4786 0 R /XYZ 90 271.0551 null]
+>> endobj
+4774 0 obj <<
+/D [4786 0 R /XYZ 90 250.0735 null]
+>> endobj
+4795 0 obj <<
+/D [4786 0 R /XYZ 90 250.0735 null]
+>> endobj
+1429 0 obj <<
+/D [4786 0 R /XYZ 90 153.162 null]
+>> endobj
+174 0 obj <<
+/D [4786 0 R /XYZ 90 145.1983 null]
+>> endobj
+4785 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F11 416 0 R /F8 568 0 R /F1 583 0 R /F7 574 0 R /F10 488 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4799 0 obj <<
+/Length 2452      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�۶�~�B�ΤR]���r�;��q'i3���Oiƣ�x:��PR/�� 
+| W�o�����pw�x��a���

)��a\���+<Z���"���OC��ﮮ?H12�H*Gw�I�����?�	AO�c<��<������	�����1[������Y�|s�ͦX����g�?=�����f�)v���>+g�M9�R��߬f�]����!+'D��M��jL4��t��շwM���Ć��Տ?�����+���b�_0"�����S濬�>]���S_�nJ� l(?�����U��]^�W�Ef#��@H 
)��a|S#Z�R\+�nW��q�HK!
�O�N8hS�'T��� n�����U>���C���\�?
��>�qȲ�IMO�'T�4�`�8��h��/JE��p�$�<rd4�	���_ʥ��1�� b)��y\+�C�qZ��<����@QD4�

�H?E
+IG0�Ha�<	\�§��[�OCUX��4�%y5W��l\ﳇ�a��ISe�<�m�!ct2ZΑ�˃e>V9R��� ��ijR�4��S0
]C�0�s)�3�`<O�Vz��U�`wD���(G�F��q	G1�z�
��儩�"/`��o���>�P��*�@X3��kK�54x1]{�Q1D�vt��zj=J5�i7M%(�`�b�D�eڠR9T63@�N�qY#C������eX-��QS at A��KRZ
��HQ����

���Q)�
�B����
DS�!�N ����S!��ڐ6�:���0(%���	��Ѡ�)�*��K%[p�$��"�6b��0���._�p��,N���S�ʼdEP��f:U
����`�"�~���֣�u�40�������zvm�_�%R��Q)��$t�y���A�q��{|�{�nX��Lؚ6��'���RqoAKLmJƳ�A��(��²�J?�
��d]�Q�"%lĔ��꙰�ު- �Yo|�$�b1��
JdfN������HB¯���߸$�
�!	�zvϔ�xI�yo��N�y(5b� ;��kt��;6Sz `�/|k��'�d���xbT"6ʡ4��e�l9��xb(�K� ���fC��X��]k�v�v�*K7�\h�
+�z�Қ�
xXZ�1=��m� ��eMs;�3��DH=�a��~��%�B�xBT�;��]��8$ք��`�y�1�{X�U[�
��R�R^�����F�C#���/YX#��JU���� 0���ߦ
+B����zC�
�i�;x*����aX$a&���pN�A�N,��b�?3
qrђ00a�GU�h �n�[����Dž!/�~�`�S�&
��~`.B��S�����f��w��u�i�t��������~�$8��'���k�f0㬝�wG���	��EU؈����g���e���zox�3� ����{h�kP˨�5��8P�P?�X�z*Vn�
.�/
1	n�.RSI:k�N Бb�_`��]2�o�@�l�_0?XQHR½�Z
\�
Ј|>[�.mG|ySHO
,��R��aiI
�4!���o\Z~ϑ�x=��0�z;�b�ڷ������wP�X'�4�D����_
mĤ���/
gK��'z��/�OK4J�.�/�����
+�e����D�њ��~��27 �ݼ̷����{6l�`mc���U���+����/�gn
]
�q����n�fWeȺ 6�n��6�C�@A��!�]���7
	e���������
&�JE 	Ҝ�v��)7b|��!��7�S��e�i���
e6[L�
+�_gsH�.�Fd6��>&��߁�w�Έ��������n
���WE�c�����d?	�����;�5��Z���$����v�X߽��a+���������ԃ�!�_�v
35�� i'
+���_f��*��b��
7����\e�hͺ�{t���Y�6*�Oy��5�p�%�������#Q�N�
����ܽ,����4Z�~Y�Ș�CnNgMB��o�c�
���BF�<T9���^m`���9�1�����rW���X�(H��
��k�6�zA�`���bAg�s�м�
|��l���+7КpNBg ���ٸs;�v�1t���7���_�~�oeb��~6��7o�`4�¾�&�}�^����‘�v���͝�'�]}=@�)�`Z[�v��X�����v�?�&;G���3wĝO�>U�PݗeV؄�y�ܬ;�
�$[��f@>
Až�<���#M�G%{���c�w�;����$i��,���ixxh����xm}<O�f���
+S���%� Z4���vʵkRn�����;`\��.+?b�8�ì8�V~hvMϮ����eF�-4���?e=��F��R}�?#��_��8�4�Ë��{v�?��ۛ�맧'4ߡC�oK��a䮻qq��	�M��ћ6�^,��sX��n����zS�5u?����M����@(��F�endstream
+endobj
+4798 0 obj <<
+/Type /Page
+/Contents 4799 0 R
+/Resources 4797 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4673 0 R
+/Annots [ 4803 0 R 4805 0 R 4807 0 R 4809 0 R 4811 0 R 4812 0 R 4814 0 R 4815 0 R 4817 0 R 4819 0 R 4821 0 R 4823 0 R 4825 0 R 4826 0 R 4827 0 R ]
+>> endobj
+4803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 666.9031 170.6866 677.4334]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_e7c03963759dfdb937135a7f99165361) >>
+>> endobj
+4805 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 629.2298 170.6866 640.1337]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_12f3d0ee3885355092a65262f24d46af) >>
+>> endobj
+4807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 592.3037 178.4354 602.834]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_f0ea51d59b5026db43b2edd4cee928ba) >>
+>> endobj
+4809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 554.6304 222.2328 565.5343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_dca809f9ebacacf70bc610d41bbaff47) >>
+>> endobj
+4811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 517.3307 187.5636 528.2346]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4812 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.3032 517.3307 238.4723 528.2346]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_e575efc6c01c4bf9968c7e27bb94951b) >>
+>> endobj
+4814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 480.031 187.5636 490.9349]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.5337 480.031 245.6654 490.9349]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_400c02f876d8f4e3f6aef2bfc5fb16cb) >>
+>> endobj
+4817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 442.7313 227.8516 453.6352]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_192ff11375b59075c9ea19a8c2b5511e) >>
+>> endobj
+4819 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 405.4316 217.6102 416.3355]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_70e56452f6edfc1943b555156e6bf828) >>
+>> endobj
+4821 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 368.1319 180.5399 379.0358]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_97586e332fd16ccf6e7d642bb4bbf83e) >>
+>> endobj
+4823 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 330.8322 178.2386 341.7362]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_0ac88c873a13c4afa6f99d3d436e13a3) >>
+>> endobj
+4825 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [101.1279 232.2381 157.9042 243.142]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >>
+>> endobj
+4826 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 220.2829 173.4563 231.1868]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+4827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4800 0 obj <<
+/D [4798 0 R /XYZ 90 757.9346 null]
+>> endobj
+4801 0 obj <<
+/D [4798 0 R /XYZ 90 684.726 null]
+>> endobj
+4802 0 obj <<
+/D [4798 0 R /XYZ 90 684.726 null]
+>> endobj
+4804 0 obj <<
+/D [4798 0 R /XYZ 90 647.5458 null]
+>> endobj
+4806 0 obj <<
+/D [4798 0 R /XYZ 90 610.2461 null]
+>> endobj
+4808 0 obj <<
+/D [4798 0 R /XYZ 90 572.9464 null]
+>> endobj
+4810 0 obj <<
+/D [4798 0 R /XYZ 90 535.6467 null]
+>> endobj
+4813 0 obj <<
+/D [4798 0 R /XYZ 90 498.347 null]
+>> endobj
+4816 0 obj <<
+/D [4798 0 R /XYZ 90 461.0473 null]
+>> endobj
+4818 0 obj <<
+/D [4798 0 R /XYZ 90 423.7476 null]
+>> endobj
+4820 0 obj <<
+/D [4798 0 R /XYZ 90 386.4479 null]
+>> endobj
+4822 0 obj <<
+/D [4798 0 R /XYZ 90 349.1482 null]
+>> endobj
+4824 0 obj <<
+/D [4798 0 R /XYZ 90 294.989 null]
+>> endobj
+1430 0 obj <<
+/D [4798 0 R /XYZ 90 84.5805 null]
+>> endobj
+4797 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4831 0 obj <<
+/Length 2326      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o7~ׯ�@*+��K�]��6��i�:�C��,���J#e$�0���
�
G��T�>��C,ͧs>
��
�C2��

+��a\���
���_�H�x�g>�?���k)�I�x~WX�	J�x~��D�tF0Ɠ�S�'�|��~?�x�Y==$����mz�/�/_m��>_��~:�O^��]��Ur��S�'I�L�
/�������W�b5�$�?�~��oa$oF1���>`D�����S�>�FF��v���!���A]((CX
+�����_���)�9�
1nH����W�4Ky�w��X����Ӧ� �{)&��,U�2QHR�
��H���p[q �C
+�����y�-�תl�+���c�	����=���8��Q+c}�=$y��"�U���~[��j3�b�X�=�W��jq���t��fo��}�X��\�Ύ���'s%�H����
!�T��s�)&>�
��hb���GHd9)���߅@�o�/..�|���0>�aFlFQi �e䇪�P1A�`u@�%���?ܬ�e��T���6���	↊a�
�p���%�L�
��'JE���+
+�
z�Q1�&K��d�u�/3P�8i�����
+s�3p���]�`>�؆��BD	��ޡb��(�r�kǧ��(&O
��G���Z�_}g
��S�'_�����fC�F�J�@��p�Z�
��q
+]BceN
A����ص��}����������],
Pp4��ӵ�&0Œ�
�9o[��O�IcT85*


+k�"�[�)D$

(_��ޢK$,A�(kwW�P��]��|!�� )y!j$�>�*��CR��eѵ��V/H��~��Y���F �!g��m�v.,Һ��d}�T
��![ڦ��X8�
w��
�J���a_~��>�N¼
���&;%_��D�ݬƄ�
+�'B������%��sx�%6�a/<bJ���ЈkL�+�(X��~_,a�dPxjI�҄g#��fY}�O���j�P'��Ӭ��a���+!$�e�)M���
mBacD���0AvT1�9X\n���fWK�gw��
}م�;�5B�^�s\|a-�����ۢ6�`Y�a�

}����
6
ʘ�������IK��M���kX_u���.�r1٬����F�-��C@�ٙ/w������I��
8SV�T?���jLK@@�5,*p���ﰣ�O�Mv����dCW	aiHp
����Hډn18��!K?K���
���29��0���3�?+-�
�"��t�xZz�O�0�:-}v'�G��D�W}���E7�
"����3����1�
���f��
H�u�d��FE�S(�\(�J���K!������������Wi�1��p
*�]�0ne_x�@%������P�q��|�K�u�v�6O��l�Q�a+��3� 
+�'F��(A5,Z�|�g��;�k��M!�;�s_���!��Pa�q��	I��=
��t���v�L�k�
���
	�":�Q
+Ԟ�H,Z�Z��e0FLjs�x|��0K�*��Z��ݡ�1j���Z�I��^�]ĹZ�f��f�f�b�`���)�V�?a�z��
IXHT��C��Y�R�1,��� ~��v��� ^�c�%jX\ڞ��
fWK�g7�� b"4$u�a!jg}
+&�

������V�R$7s��WX)bZq�
3�����\�FH�6����]'�>�bh�X��tJ�ז�9�
+�$�4�T�+�3x��[k��{�٬���Uº�7��
+cбk��������k{�"
 �����L*[�?Al�P��#6�F at l5�[W
#�t��I�04Bl*PZ5�Ev[�2[U'Di�@��/
ɟ �&���1pX�U�A1�)U��g\Qۗ�*�t+PT�Gc=:{
��=� ���J��]�����>���� a�ڪB5�)����Y-�3m���h֛���o'*Ia�����<]��ŲM6+��S:�vN������Υ6�WG5,�x�`H�a���}�a�7����0���J�Y1�0s�:@�
�
+�"D(�䤪�O�6���5��P=p��~Ah����0�s̐1����#��
$����3yةӸ�4(��
v߶Z�;.nb�
�C�0a
+���k(��Ǖm/u�ӱ�%D���_�.r�.>`]�^�v�Q+��N��ꣻ�[~�.���%�gS!&���Yd�c�ŚJ��9P��<���3F��C�}I��iF�|�������r?�y�(�L)o�
�v���������#Z��!K�9J����sc[�Yh�f5�å~�a�� }}.�=��&O\E�/����N���{�����endstream
+endobj
+4830 0 obj <<
+/Type /Page
+/Contents 4831 0 R
+/Resources 4829 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4865 0 R
+/Annots [ 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4845 0 R 4847 0 R 4848 0 R 4849 0 R 4851 0 R 4852 0 R 4854 0 R 4855 0 R 4857 0 R 4859 0 R 4861 0 R 4863 0 R 4864 0 R ]
+>> endobj
+4828 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Constraint__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 4866 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 314.00000000 80.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 4867 0 R
+>>/Font << /R9 4868 0 R>>
+>>
+/Length 4869 0 R
+/Filter /FlateDecode
+>>
+stream
+x��Q�N�0��+����3v� ��>rC(
+M���&�|=�4 �"�jmy�]Ϭ�\ ���M�nVl{&>��'�%��8Jh�]��
y�
��A�eĔ�p��
K��	�nd�S�jAC����p�<.₝�0ŵ����fW����d�V�]�ui�X�viw���ڦ��l������lɞ�cX/�(#+ƛU��w�Yd�:�J$˚T�
A�
�
��a#T��NEI�)�dH��{�<
�݃������XL�*(��K�^�#�)��I�����AO�z�ĥ@�z'L�3��$+�d���P���1ه;nѐÙpg��EZ���33�X�R��˪m�m~HƂ��8���"V�L��?]�/�ѥqendstream
+endobj
+4866 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142731)
+/ModDate (D:20080908142731)
+>>
+endobj
+4867 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+4868 0 obj
+<<
+/BaseFont /FKHBUV#2BFreeSans
+/FontDescriptor 4870 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 556 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 556 556 278 556 556 222 0 0 222 833 556 556 556 556 333 500 278 0 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+4869 0 obj
+367
+endobj
+4870 0 obj
+<<
+/Type /FontDescriptor
+/FontName /FKHBUV#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 4871 0 R
+>>
+endobj
+4871 0 obj
+<<
+/Length1 56532
+/Filter /FlateDecode
+/Length 4872 0 R
+>>
+stream
+x���|�����e�@�m(�N �%��l
hii��:�3��S�at���{���t��
���W��ϐ�{�I����������k� �8�����3'i����g�_;������7�yO��j
1�Z���~����������~w>��Ś���9�1�������?�����.
+��畷�Pj���
@�O��-��+}�g���i)�z�
��auϗ!���R�z�s[	��� ��ԏŋ_|��m�E�����j��?��,��t
�q
��g#}�-k� X��*����
�$�:���B��u�U�3�H΀���'A����J���c�8�3�É��N�4���N��NC�s�S�B��&�"���+��Cg	��:G
%���ǐO@�S�s�'v�_��O����C���
�'f1�D�(}�b�@�X�D
���_��(�u��i.Q���6�{���B"��j�JD?Q$:<K����D�H������Uۨ�;��6Z�r>�2��Y]�+�[�R�#W�)��B��^YE��<ߙ���m�;����^�"����K��E�&�D�O�Co�����
��5"IL�<'��I��R���]����֖����ZrB|�{�hR"yzsͻS�lA+���e�w
�6F���Y���=�/W�귌��_�S�6�B0�-�ZV� ���]���3�d�_Z�����Z���mZp����-��l�l�D1ϻj����
1�ؖ��˼���)x������v�j�/�~H�Zo��η�W�-�ΖjwO���k�Ov�s�j�����6/�^m��Z&o;�er��/�
+-���z�[���狕�WN�F�����
���Ћ
�Dt�$�qO�}��D��^O#��վ�'MZ�p�Įb�D�c'�cDN��+L���pO��Z��{z�R�`�h�E����>�
K^��%h��������i�ڵ䅂�س��}~K[����Ǣ�y��}��҂|�k�|K!��▎R��]�
+X��txZ�K��<�o�B��}~+�0k�~G��C���x����jO������z���G��h��^�?�լ�ע��
��^�݈�֠�D�Tk�'��J���
+����g��D'��Ol���)�"i/
�X��C DB��R�re����a�J^~
A�$V&F������5�5���@�kc���1�X�X�X�؀��˒�@&y$�e��{�2���ay��	�)��9���P6�x�7Cd�)=��BL�8`k�ɷ�f���{�b�7
g{9d�#��3���y��s�=�j_C\L
B
J�K�F|N
F
G
M�K\I\��Qě����ď�Oı�����Ļ��y�U�/��į�Eĵē��
�y�w�װO{�����E��_x-�2��"q����'��K������8��
�kj�Y$.�eO���~�zݸ��қ)�Y�7�/�qq!�?���"9�������dI��I�I���XJʤB�d���#�!�PrI�+����Hrer�
+�*��:9�\�����\�\�l!ǐk�c�q�:�xr]r=r}rrCr#r�'�9��D��qR#�Nd�4�i����������[�[�6�i2CfI��LN!��[�[77���m�m���v���
r&9��M�E��e>!w �;�;�;���������s�=�
�F��
d��$��n���G�'�&
d/Y$Kħ�gd�'Y&+d��'�
�E�br/rorr_r?r� �@� �2�`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�r	�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7������MR��)�b)��)�)��)�R�5�J
�V��S#�����(jjUj5juj4��&��B��֦�R�u��Ժ�z���Ԇ�F�j"5�j��F%(�2�$eR)ʢ6�6�6�6�6�����lʡ�T��R.5��BM������Q�P�Rө���Lj5�ځ�C�H�D�L�B�J�F�Nͥ��rT�NuPy��ꢺ�
j
5�*�P�T�*Q}Ԟ�[���;����{T��PU��Z at -�Q������}�}�����������C�C�èé#�#�����c�c���������S�S�Өө3�3�����s�s���
�
�����K�K�˨˩+�+�����k�k���������[�[�ۨ۩;�;�����{�{�����������G�G�Ǩǩ'�'�����g�g���������W�%ԫ�k���ԛ�[���;Ի�{���ԇ�G���'ԧ�g���ԗ���W���7Է�w���ԏ�O���/ԯ�o���ԟ�_���?�R�_/a�4E�4C�4G�@��D˴B�t�
B���+����Hzez�
+�*��:=�^�^�^�n���k�c�q�:�xz]z=z}zzCz#z=��D��qZ��Nt�6�m�ӛЛқћ�[�[�6��i:Cgi��LO���[�[���m�m���v���
z&=��M�@ϡw�w�w�w�w�w�w���{�9��n�;�<�Iw��t=��O�^�H��>zO�LW�*�O/�ҋ���^���>��~�����A���!��a�����Q���1��q���	��I���)��i�����Y���9��y�����E���%��e�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�z)�/C0$C14�0,�1<#0"#12�0*c�0C�a�J�pf3�Y�Ŭ¬ʬƬΌf�`�d�bZ�1���Xf
�3�Y�Y�Y�ـِو��Ld&1�L�ј�3�dL&�X���&̦�f���̖��8L��0Y�e&3S���V���4ff[f:�
�=3����bf3;0s�
�����]�]�ݘݙ��
L�icڙ&�t2]L7���c�3��)2%��ٓ)3���3
���"f1��7��/��?s s ss0ss(ss8ss$ss4s
s,s
s<ss"ss2s
+s*ss:ss&ss6ss.s
s>ss!ss1s	s)ss9ss%ss5s
s-s
s=ss#ss3s
s+ss;ss'ss7ss/ss?� � ��0��(��8��$��4�
�,�
�<��"��2�
+��y�y�y�y�y�y�y�y�y�y�y�����������������������������������������������������������Y���,�R,�2,�r,�
+��J��*����!�Pv�;�
��dWfG�����������5�5ٵ�v
�6;�
ǮÎg�e�c�g7`7d7b'��Il+g56���&Y�M��1�	�)��9��%k��f3l�u���v*��5;�݆ݖ��n�n��`g������
vGv'vgvvWv7vwv.��c��v��ͳ�l�������l��e�l��c�d�l�����v!��]�������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾�.a_e_c_g�`�d�b�f�a�e�c�g?`?d?b?f?a?e?c?g�`�d�b�f�a�e�c�g`dbfaecg�`�d�b�f�a���rGrGs
�r
�s'r's
+�r1n7�ƭ�
�Fp#���Q�*ܪ�j���hn
nMn-��í͍��q�p�u�����
�
���	�Dn���9�Kp:gpI��R��m�m�m�m�m�m�m�ٜå�
��\n27���m�m�M���s�q�s3���,n6�7�ۑۉۙۅەۍ۝�����6�����\'��us=�<n>W�z�"W���=�2W�\?��[�-�s{q{s�p�r�q�sprqs�p�r�q�sGpGrGqGs�p�r�q�s'p'r'q's�p�r�q�sgpgrgqgs�p�r�q�sprqs�p�r�q�sWpWrWqWs�p�r�q�s7p7r7q7s�p�r�q�swpwrwqws�p�r�q�sprqs�p�r�q�sOpOrOqOs�p�r�q�s/p/r/q/s�pK�W�׸׹7�7�����w�w�����������O�O�ϸϹ/�/�����o�o���������_�_�߸߹?�?�������ܿ<��<��<ó<������˼«|����+����H~e~�
+�*��:?�_�_�_�o���k�c�q�:�x~]~=~}~~C~#~?��ķ�q^���|�7�o������[�[�6��i>�gy���O��[�[���m�m���v���
~&?�������w�w�w�w�w�w�w���{�9��o�;�<��w��|?����^�ȗ�>~O��W�*��/�����^���>���~������A���!���a������Q���1���q���	���I���)���i������Y���9���y������E���%���e������U���5���u���
���M���-���m���
���]���=���}������C���#���c������S���3���s���
���K���+��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�~)��@�@	����	� � 	����C�a�J�pa�0RXY%�"�*�&�.����Z�1���Xa���0^XWXOX_�@�P�H� L&	�B\Є��
��L!%X���&¦�f���–�-8BZ�Y�&
S���V���4aa[a�����0C�)�f
;s�
�����]�]�݄݅��
BNhڅ!/t
+]B��#��
�W(
+%�O�S(
�&�f�J�F�N<"����
+
�������"�j�1a������������?qq�p�p�pq�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�pq�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p�p����������������������DxUxMx]xCxSxKx[xGxWxOx_�@�P�H�X�D�T�L�\�B�R�J�Z��8C�V���B�^�A�Q�I�Y��8K��8��N�M�]�C���T��8I�[�GX*�+�9")R"-2"+r"/
+�H\.J���)ĩ�,*�*��!�Pq���8\
!�WG�����������5�5ŵ�q���8V
'�#����777'��Ib�51!�!&ESL����������������h���3bVt���q�����8M�F�V�.n'n/�g������
qGq'qgqqWq7qwq������v�C̋�b��-�����bA��bI���bE����q��H\,�%�-�#�+�'�/
 
(
$
,
"
*
&
.
!
)
%
-
#
+
'
/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/^ ^(^$^,^"^*^&^N�)^!^)^%^-^#^+^'^/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/> >(>$>,>">*>&>.>!>)>%>->#>+>'>/� �(�$�,�".___��������????????����������������J�DJ�DK��J�� [...]
�FH#���Q�*Ҫ�j���hi
iMi-�E#�-���I�H�u�����
�
���	�Di��*�%MJH�dHIɔR�%m,m"m*m&m.m!m)ْ#�����\i�4E�*m%m-M������K�I�K3���,i���4G�Q�I�Y�E�U�M�]�+�!�6�]��R��%uK=�<i�T�z��T���=��T��R��@Z(-�K{I{K�H�J�I�KJJIK�H�J�I�KGHGJGIGK�H�J�I�K'H'J'I'K�H�J�I�KgHgJgIgK�H�J�I�KHJIK�H�J�I�KWHWJWIWK�H�J�I�K7H7J7I7K�H�J�I�KwHwJwIwK�H�J�I�KHJIK�H�J�I�KOHOJOIOK�H�J�I�K/H/J/I/K�HK�W�פץ7�7�����w�w�����������O�O�Ϥϥ/�/�����o�o���������_�_�ߤߥ?�?�������ҿ2!�2%�2#�2'� ��$˲"�rL
"���+����Hyey���������<Z^C^S^Kn���k�c�q�:�xy]y=y}yyCy#y�<Q�$��qY��. [...]
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�y���B(�B)��(��)�"(�")��(�S�(C�a�J�pe�2RYY����������V�P�T�RZ�1���Xe���2^YWYOY_�@�P�H��LT&)�J\є��+��TL%�X���&ʦ�f���ʖ��8JZ�(Y�U&+S���V���4ee[e�����2C���Rf+;(s�
�����]�]�ݔݕ��
JNiSڕ%�t*]J�ң�S�+�W)*%�O�S)+���+
���"e�������������r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r����������������������DyUyMy]yCySyKy[yGyWyOy_�@�P�H�X�D�T�L�\�B�R [...]
+��J��*����!�Pu���:\
��TWVG�����������5�5յ�u���:V
����W�U�S�W7P7T7R'��Ij�W55�ꪡ&USM����������������j���V3jVu���u�����:M�F�V��n�n��Pg������
uGu'uguuWu7uwu����S��v�Cͫ�j�ڭ�����jA�U�jI�S�T�jE����u��H]�������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
���������������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�ޠިޤެޢުަޮޡީޥޭޣޫާޯ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�����������.Q_U_S_W�P�T�R�V�Q�U�S�W?P?T?R?V?Q?U?S?W�P�T�R�V�Q�U�S�WPTRVQUSW�P�T�R�V�Q���ƈ�bt���1.�DŽ��brL���XlHlhlXl���؈���ʱQ�Ub��V [...]
j�4�T��Hj�VT�<y�:�y��u}T�.���|��+v�s�r���<W�2�ޯPw�M
��
f�W{����
�/�o[�|���m��As�w��%o���b�/v��Q�*?=�|�����bW���[��W�R�7#��
�0�>�r}
3�ʁ�<U�<��+:�_�i�'5�7+x��ìZGVk
9;����#g�.����.��`g�{�]l�:��^��W�ltx?�ʜ���;��tn砆{�B�y`���l�T��K�B�!Q�TR�4 ��&d
+҂�!
�4d2
���|
�p-�Z���k��\
�p-�Z��\vzw�\dK�߁�F�m`����m��
l�6�m`����mg��>f� ���:�v�� ��l��
`;�v���7��M/
�4���K/
�4���K/
�4�ҨkuM?
�
�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�,���?
�,�79��]���Y�g��z�Y�g���
t�.�]��@wQ{x�%ٵLL�\��v6��|���W
+�Jw��t���2�A& uH2	iB� -HҁLCf ��A�8����?�8����?n*3��y��bV�E���"�8bЀ�C��:j���:j���:j���:j(_C�	�1�:&P��hཱྀ���}�g >���@|�3���
�c �$���iI�%��^xI�%��^�D���K��	<x&�L��3�g��	<x&�i��&�M��i�/
����4����_�Ki�/
����4����_�Ki�/�>�Ki�/
����4����_�Ki�/��
\��0

���4p�^��
�|�!�k��Z&!v�s
��k��R��{�VM�W<u
ҀLB��)��T��k+-�ʆt Ӑ�,ds�$�|�@>I �$�O�'	�D
Q�S�$����?|�rIB��)�Z�-_(-
�
M�&�D�@�I �$�hH4	$�M�&�D�@�I �$�hH4	$�D�&Pn�&Pn�&P.R�&�����M`�&0!f�������ѓ/�+=�J�
}�9_s�R5_���l_��[c�f![���%h��ޞ�
+9��]�,M��wN�z<�,��b�|5�N�yy?̛i�cv�n�

;��Ә �u��/��xz�:r�6�Զ�Ԏ=<"���gt�ؙ=]�9zV��G4�v�=t��ٮ��ؖ2�.�!p
��\�J������=a�G�7>T��i�U��V9�#_��x���U�Z�fկZ�0v�_��_� H'M��E=�~ʯ]�.q�Z��/�WG��}^�ڽ�-�^�o�!˄���{����JQ�1^�HX�%��[[�\gOO��#�P3⑦E��]=ҌHKF�i�H�B-�a`뭙�b����xTZ<*-
��
�
E�EkQ�ZT�ũE%kQ�ZTr"*9���JNDm��0F"�HD�#a��
a��
a��@���
a��>�����d�D2z"=aFQ�Q,f��bF%�Q�fT��lF%���SQ}SF*�HE�#a�"�T���0�Ê0�Ê0�Ê0���h���B�x4s������D��fDZ2��HKE��pn��VT�x���n\ǪHǪHǪHO��L
h���t��t��u���L���M��#VH:VH:VH:VH:VH:VH:VH:VH:VH:VH:VH:VH:v�:v�:v�:v�:v�:v��
<x�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ��
�;�NJNNJN�N_�N_�N_�N_�N_�N_�N_�N_�N_��P��P��P�N_�N_�N_�_�_�
+R�_�_�_�_?�p4������ױ�ױ��3!2j�=��=��=��=��=��EY�dv�:v�:v�:v�:v�:v�:v�:v�z�p������������������n�g`Ig`Ig`Ig$tH2	iB� �rlH2
���Bqz+$�u���ׁ��c��ׁ�_�|
�:�u�������R�����������������^�0��=��=�a {c{c+{b{b{b{b{b{b{b{b{b#	�$p�G6�G6�G6�G6�G6�G6�G6��6��6�G6�G6�G6�G6�$7�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�76R�?S���M^d`���iZ䗈4=ҌHKE�=��l���M��I=,%�G�Z�
iaI����^29����43�R�᛭��4-�"T3�0#
3�0#
3�0#�T���0RF*�HE�#a�"�T���0p~a��2�A& uH2	iB� -HҁLCc��^��^��^��^��^��^��^��^��^��^��^��^��^ތ�xY�`N��˛�5�k��v��v��v��v��v��v��v��v��v�Ķ�D�7��M�x9�D�7��M�x9�D�7��M�x3⠞��&r��
o"Ǜ��&r��
o"Ǜ��&r��
o" [...]
ޱ�;6x����
�c�Wl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�?l�
���6�����a�7l�
���6x�?���`�l�
^���m�}y�F����m�iy�F����m�gy�F���gm�Yy�F���gm�Y;����gm�Yy�F���gm�l�l�l�l�l�l|�hc�d��D�'�81���������m���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍w`l���8%�qJf���)��S2�d6N�l���8�q*f�T�Ʃ��S1�b6N�l���8
�qf�4��i���0�a6N�l���8�q
+f���闍�/�_6N��l(Q
Θl�1�8c�q�d�����3&gL6Θl�1�8c�q�d��A�s��
�=y�A�s��
��
�;y�A~s��
�7��A^s��
�3y�A
s��
�#��A�q�w
�
y�A�q�>u�w
�
��A�q�o
����:�A�q��s�7�dhG��򆃼� o8�򆃼� 8��<� 8��<�����w0�
��;��濃��`�;��淃y�`^;��毃y��]5����t0/
�K��槃������<u0?
�O���<t0
�C��������`�98mv0�
�7���i���ag�Ά
�
;8N���4�'��I���4�'��I���4�'��I���4�s�9���F���oi�[��F�������i��4�3��L#������i�s��F?�яi�cy)���F^J#/�����Ki�4�Ry)
�x687�d
R�L@�d҄LAZ�6����@f!�~
�q�ǁ~
�q�ǁ~
�q�ǁ~
�q�ǁ�_�|
��5�k�׀�_�|
��5�k�׀� ~�	�'�� ~�	�'�� ~�	�'�� ~�	�'��_�|
�:�u���ׁ�_�|
�:�u���ׁo � �|��
��7�o � �|��
��7��~�I�'��~�I�'��~�I�'��~�I�'�o��	|�&�M��7�o��	|�&�M��7]n����0s����B��5".
���S�O?��S�O?��S����[����[����[��|
��-�[��Q��rm�k�\��(�F�6ʵQ��rm���G�l��F�l���|��
�;�w�� ��|��
�;�w�� ?
�4���O?
�4���O?
�4���O?
�4���O?�
�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?
�,���?
�,���?
�,���?
�,��y���v
+&�b_�
+t�.�]��@>a��`i,킥]��
�v��.X�K�`i�5,φt Ӑ�,dP,킥]��
�v��.X�+�`e�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,�j!
�v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
�u��.X��`],�e]��
�u��.X�˺`Y��U]#,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���)ी�^
+x)ी�t��.X�k�`M��5�T����5]��
�t��.X�k�`M��5]��
�t-�=]
��-�[���`W��]]��
vu��.����`W��]]��
vu��.����`W��]]��
Vu��.X���`U��U]��
Vu��.X���`U��U]��
6u��.����`Sl�M]��
6u��.����`S��=]��
�t��.��k�`M��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M���s��t��.��?�!?��q������h����m��w��U`�͓q��������U��w+j/
��=�K�|����J��n �D�T�};9_,�s
�r`NĹޞ��%�|{������4!
1������h+��	��'t<�㉀<iA:J��J_��SB0f\�}N�ڇE�\�Y���Qt�v=T� )��a�;���GzuadW���+?��
/��/��?��ʏ z�Ax���+�j.��
��H2��r)0�j-
,o<�d�U��Y�ͯ��a��I�#z�f4�KO�!Xrx҆��`��Ń��'� J$����=��k;_��
�o � �Ȁ�=i�^~Su+~�zE��2t�oX\�`Ǔ-�В-`mOꐈ'�x��'�x��'��H�)�h�$�"`mO��	|�&�M��7�o��	|�&�M��7�o�b�\.-��s�����I�,ך)��QZX
�6�sD�uc�ړ��76�J��V�&��}j��EF^�R�
�`/�Zv�������L�=�����.�ƹ�m�
x���
������/���
��7�J�׹�������mMO�J�+��S�ߛ�v�h)}�R_�\�/0r6W�*�B���=W��D��$�)VkY����z߱��
K
߰�dV�v{��Y*��JOoO!��WӂU���\Oj���
�A�d��C�o��"^�~�R�K�|_�?֚�����B����X�
��1�?�!��*�*�5k���mA�%�u��&��6=�?��h��
�:CR�4 ��&d
+҂�!
����3�YH��p�^�� 5��!�Bܬ9�u�!��~
�:�G
�:C�}
!hA�C�
+����di Y"@�44?�d]�@C"@ū�^����9P �Zkx�Zû�޵��'���+^��𲵆��5�l��ek
/[kx�Z���^��𲵆��5�l��Z ��Ϟ��P�x�hPV�Z��G3B�V(z�H�>�b�J2��
B�#аd-
U���0
=�GK��Ǎ��Q9�}m�R���QRh���Wu�Sh����E���ޮ��Y]�B{��r5�_�V���
���;�������-`[�`

l�z���d��-W���裣�����u.�ϰC	`���Sހ������;��AKji���R��5��mx�T�
�^��R�L@�&d
+҂�!
�4d2
�2�O/8"�$p�xtġ#
~z藄D\:�����tĥ#.
q�KG\�2�o � �|��
��7�o � �|��
�'��~�I�'��~�I�'��~�I�'��~�I��7�o��	|�&�M��7�o��	|�&�Mী�~
+�)ী�~
+�)ী�~
+�)ী�~
+�)�[���o���r-�g�φ�
?qڈ�F�6����l�i��"Nqڈ�F��t�� ��|��
�;�w�� ��|��
ু�~�iু�~�iু�~�iু�~�i�g��~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y��w����
|�.�]��w����
|��I/@g�t/@��`����ځLCf ��n ��d\�(Uk/�Γ��՗����Z�wP��tgg��㟀�x%��+Q.^]�d6��Q��O]���I
2�C��(1X�z29��+9V�LQ+T/H�xAʓ�!��!}�*�*�(@G
;ha-젅�*��W�\�B���)O��:��Q;
��(_����
u�C��n������S���D���E�*��}ݒ�zy_��o��7�}]�_���>�ו:=.�G���_���u.��0��/`����{��5`��
Ћ].��� �@�+eހ˼�R�ժ_;�uN

7j/�<]�{���:��8��
8��9�
���̽���<�����Q�
�ԩu
�r�^g_�87$��z�u���
���0@$�����μ8�k�p�W2�+ݞV�Ӆ;]��
���0�j�SD_醩�&���]
�C�jx�#|(4a��x��C_��C[7p|����b�T˜*ܩ��𑚇��_ц��?��|o�-V��� ��jx/��)�"c92��>	T-(���z!
(�TrM�8Y�WA�uAv=N����+@!{��.m���S�27���Š�h��Uw�\WhB��Kk at b�ăq�
��0i��Z{0ڂ�^���~���<�y
��
����{��P�CӼ�4��֗r�

��p0wa0��L�F1|��� �zw���=-.�*�Y��#���"�����2U,�Ƀ	n!{q�[EG�� ����R�߶H�L
GL��������cG0��5
�����*��Θ1u)#h��n�N�#h� %TCD[�fQ]N)��QD�Q��L1�]1�]��٧����}���B��<���Y���!x�Z
Y�l
do[e�\T�
��Vk��P�_PH/�NoX�޹
�E�(�ɱχ��Sj��:�
�l`k
mQg�6$�^������Bh� 'L�/�2��pX�^!

�`0�UȎЧ�>P�� Q�%��A�jJwh��J1TzC�rG�
k
+����=
���
���
�|�Y
$r@�%��SS�C��:"�
o��kቁĤ�
Pz%��~hb��a�*ʋ
1}*�t�
L�J8�*a˅���VW�h�U�~�
�S%l��΅ ���P[��2��=�e�����Brk���K�6pI[�����&�6dV�
$Ķ0�!�d
+<
��Ln�������hIS�ĥ�Fo[8
��\0� �0�!�����
������_vw_��^��*��*�ݚW�Լ�������-5h�����1u
��Q_DGC

Et4���ʁZ��O���
)z�i��eF_}}��*�ߪo������j��-zJ
D]�ں��/�7�kC"�Bo]���o�E�
,�#@UTx�!�JwC�ײa�ͰC���
Zw
�R�C��J]�T��	.�*]i�t����H��B������B%��o�b�F\��/��^�78�-���a��R�%
+l~��h�_\S��VWw�U��ޱ��V{C��o�k,cq���q�O�j����nֶw����
�6���Pdí�"�������o�5�ꭿX\Q��(ԗPi��7z�
.��冫�{�#�h�����P�R�����m�HZB���v��8,f�h��S)�6v�����'*�Tk���4֞���s��2�.j]�Â��O���[���b���;q���p}�,�8���Xj�`����H���l�J�6
��V?������_������L�'��Y����6��5�5T�[k*pk�&��T�n��7:
ư
#T��b�	+��3��+�w-��4�]�}b[aaet�i����917�����ƛ�sL�z=F�\'���F�Dk��wN\���
�d�2�v]��,#aԕa8���
�ad-�
4���=F4މ�]��Q�c����O��:ެ]=R����J��nD3�f�T3��`�i�Xf��?�if�6W4:�k�
ڂڠ-����@�H4�x��F4�g�
+Bh4֣5k|-լ�S�Y�n����جG�f=�e��f�d:�0�iM
+M4k�D��M4��f#8Ѭ�FpcF�&Z�c��W��%ZSc�5X���t�6̓��Y��L���y$�0�h��Y{�Ӄ����79��9�Ǡqh�A=��z��y4p\�m�
�`
Zk=J��=0`5,���P��i6�T��G}��LqTӪ a$���p���b&���ys4nE��^޺k �ƛe�e�uI,�e�D[��CE
�D��b�J2T�PI����2S5
�m
��l��k��
m�2�X�
M-�sa
��FX#�����Gò�6Y�d&���;��Xs��aE
��u"��
CL�!&��EO�Po(!�"%L
n��na��!�"�!���d��9�w4i����Z�f���e݈f	�q��Hڭ͌�f�f�L�j���/���Y��%3sP�,�ih
�.��n
����̠
�n>V4X��
+<��t�U�kb���W����+�e�m���P�1���mо���7�A�&dƦ� ��t��8)멶�Υa��ԣa5��S��e���_~4��q�������o�p�U��⮀隅��Lb0��6��QT�=��߂J�����r����,�4Z>�h4bt$�e�Up�
��L�j� �fƆ�h1�]vɱ\��
+<&:o���D��W0��������v7��
?����a�I�27�^����t�����͌f3c���nfL73f��M�v��QoflV#�Y�v���f��N3c���jd7�����h͌���4��Ӭ�fuw��ݱ��/3B梸�ML�9�Yw�mf�G���wwZ#cį�v
+��k�;Q]����F�^v��n�7�f�����o���������U�i7����U���U��7��rw��U
&V
+
���,�N���fF��8f�yY�Uw.y,?�p�8ى}�je�L���4z6)

��{�<���`�n~�n��i���f|���ݬ[�vr����2�g��^�frE7��t�-$��w[t�c�Q��bɻl/u�'$&�'�w`��_3��+H�e
D
r���2��Р+�pK�͘`�ץغ
і�.�~l6�@tWs֫�P}��Y��i��
+���
�
�A=�A벂��A���
<�A3�����젃z�H�A�c9��I�>>���'�f��G�ֈeC����
���[

x͖vk}D�<��+�X~s�౐!�=�'��3(&~��@p�~X��Qt
� �1
�g�ka����Az"
*Z�$B��d���

ߝ��n\��w�2ÏM��c=��D?6����0Z#D1�h�0Z#Ѹu��[�d3��̘jf���fF��1�̘if�63�M��ph0ƛ�f�D3���ج=�f�i7kO�Y{�͚�n�tv����5�ݬ��fM�4k:�Y+9�Z�i� N�q�5�ӬA���~C�hs;��7oe��Ϯ�������&F
׌�R
�=
N���=T�PI��9�Y$����l

CW�!n2��µA
o���:�1$Z�����X �ֺ=>���_�[�j���G�vc<�̈��?�����2F���nft�3͌�fF��'���f�D3���ج���`���ج��f
���16k�Y�h�$ѬA�5�������Hk�Fhm�����Y#�6j�2�ͪoV�x�n�7��0��ܵ�0I4f�fI��G�Lo�
2��̠(�����#	�����	� �ac��c������i�ޡ��/�>���?����mL<�]g�Xc��C޶��C�d	Am����c�%��p�\i�d�e�ʣƎ_w�صyn��Q+'����J�i������'�o�y�>#Շ'�4�����x��_w&Wy$��;K��q�HRo��(��Dq�ٛN�t�կ�t�gK߸�ԛv?��5�!�^`�%�d�%��c�ad���{�K�|�
+������*�(�gύ
3l�1-�V&�xA������7-��~��
UI�}$y�[����\Za�z��?��Kn�Yڹ��s�N�����K�`.X��k�
9�`.�+�tig���ÿ/2S��8���~[�Zy�~��Ʈ���u9ޗ�^��ck7#�����Z��s๑�3�Jdzb��O�J�JçL��Ĝp�����,���:��2���o�a�:;��8g��Ή��d��uz��#�Hs�J��
w�H�����%���V
;����7f�?����
XuԨ��}���Xɫ�$��F�$�y�%4�C���
9�\;�.�,]�}�ʣ�٧|�~O/Y�0g�KN�9y�6���(n�.����P�����/<��;�����
o�g,��w*;�0���]k�i�
+���{��"�A�jE�jj�
+ZT,S�Q�y(�1��_耑RP at E��I�c��t�Ԙ-[P�1�%�1��dJ6�^���vTI�2�l���w��|���~�I�`7���Y��Q"���\¾���W�+|��-�U7z����'+iu�fSZ\q"@n��z�`
y����F�m�*֞�Y�[Q���L^S!S�� D&U�'�
T�r��I�T�(�#*t�{r=�����c�Ɵ*7wݽZ,�>�r��
CS�
��΅���
Cݹ�T{b����7��g�ܫ��e �!yo�=$&<�1ej�8�� Ly�6�Le�B⻁Q�Zs��g[fMi��'I��d�4��
�qG��U��G:!*{zv�Ѯ����-�jF�m/zx|���[���M��4zd��mC/h�.+�߯��1����m��~������bD�[�ު.?�&�x�x�
ٝ��I^������q���Hҳ&P�^�kҏ���!�!��2z�&��Ac6���q!'�L=������F[��A&.�_m�
�W�(*ͮeD�`,��X�E�����~��
���*����ő��|Dnc�
+�Ŏ0$C�.a��E�oM�WP�I`)�k���Z�+ɆQ�L]��47�z��
�d���P��z�{�z��%�އ�2�֝�ך��	P�Lc�x���m�a���
T#
�
cy�@H,h�k	#$/�5
�o]Ҳ��߶�>����4톄�ִ7��3�+M}���*�4�c�������D�ޚvۚh^#�F~X$��Y|�N�֬%�|�b]����e	��ա!+Y��ň~n��a+7�=;X����u����`(���<��0����Aƾ؝j�h�:�����$�l���s�>Nޘ�l�}"C�4J�@�����΋5mwHCqGo��p�i6�D�Yx�:&�j�Jʵ
ZV8M-	��q_�n1��mr_7x2��O��2~C!)�d���!;_�$�@
��ɫ)�7�
�iOLp�D����3��|l͛�ψ���5i���j�w�	�^�)w\�I��2�">4B�z��R�%Gs[�V6�Љ��ur�1!�zM���sHV�ݔ�(��=�׷��ht!���+���:4yTC�4�&�ώ��*`-��!�]2�/�ch.7��2���*j�'\�%
��3Jk
��s��@�b�I͗$�!����_�*�&y��r�g��
x�ݸ��3��~F|��0��Ë^��j��VI�X [...]
�
rI��%t��c�
v�u���:ţE(%�$�J
+JEi(
e�L���Q�[�_)@�$.\O�.�����}�o�v
��j�+�f��/3�5T�2c��qWe���Ԙ��
��L����R!�`�F���5T�b�n��D΃�;��ڑ���1����h�����TW��B�YϨQ�	��
�wn�Z�<�x�q��? ���endstream
+endobj
+4872 0 obj
+20965
+endobj
+4834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 518.3394 160.2066 529.2434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) >>
+>> endobj
+4835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.9774 518.3394 219.8228 529.2434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6abb5b32713c840499d9e29facf95a17f41) >>
+>> endobj
+4836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [222.8116 518.3394 346.0489 529.2434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6abc1539389d3643cf986ef5bb99697d1cc) >>
+>> endobj
+4837 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.0377 518.3394 450.696 529.2434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab7491a8ba26958c3e27bed23b7eef1a7e) >>
+>> endobj
+4840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 437.9505 157.4166 448.4809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_36a0c8ccab7923610bd27f637af63e1d) >>
+>> endobj
+4841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.7538 437.9505 228.26 448.4809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 398.7226 157.4166 409.6266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_8fb8b2fe343e5afa80edc06bfa31460b) >>
+>> endobj
+4843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.7538 398.7226 234.8855 409.6266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+4845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 360.2419 165.1653 370.7723]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c7bf9d127644aa14a09eab633e87f544) >>
+>> endobj
+4847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 321.014 157.4166 331.918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [168.1562 321.014 208.9628 331.918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_9dc926136daee1f47975434ee45298ec) >>
+>> endobj
+4849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.2999 321.014 279.8062 331.918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4851 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 282.1597 179.5535 293.0637]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 282.1597 250.6661 293.0637]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_3c1dcd74ba0b2509f45aad45a5d922ce) >>
+>> endobj
+4854 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 243.3054 135.5791 254.2094]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) >>
+>> endobj
+4855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.0772 243.3054 155.2252 254.2094]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_239b0622fbcfe1638b4246deab2caa29) >>
+>> endobj
+4857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 204.4511 179.8324 215.3551]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_745ac1cdddf74c6f387cfbbbc566dc78) >>
+>> endobj
+4859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 165.5968 187.5832 176.5008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_b6976f576e6e50941ee7a7b1a737c0eb) >>
+>> endobj
+4861 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 126.7425 227.4332 137.6465]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_b3186208850238a080373f035cd532cc) >>
+>> endobj
+4863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 87.8883 212.4893 98.7922]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_442aecbe0ce384a7c1add146fb125ed6) >>
+>> endobj
+4864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4832 0 obj <<
+/D [4830 0 R /XYZ 90 757.9346 null]
+>> endobj
+178 0 obj <<
+/D [4830 0 R /XYZ 90 733.028 null]
+>> endobj
+4833 0 obj <<
+/D [4830 0 R /XYZ 90 535.4104 null]
+>> endobj
+4838 0 obj <<
+/D [4830 0 R /XYZ 90 456.5508 null]
+>> endobj
+4839 0 obj <<
+/D [4830 0 R /XYZ 90 456.5508 null]
+>> endobj
+4844 0 obj <<
+/D [4830 0 R /XYZ 90 378.9616 null]
+>> endobj
+4846 0 obj <<
+/D [4830 0 R /XYZ 90 340.1073 null]
+>> endobj
+4850 0 obj <<
+/D [4830 0 R /XYZ 90 301.2531 null]
+>> endobj
+4853 0 obj <<
+/D [4830 0 R /XYZ 90 262.3988 null]
+>> endobj
+4856 0 obj <<
+/D [4830 0 R /XYZ 90 223.5445 null]
+>> endobj
+4858 0 obj <<
+/D [4830 0 R /XYZ 90 184.6902 null]
+>> endobj
+4860 0 obj <<
+/D [4830 0 R /XYZ 90 145.8359 null]
+>> endobj
+4862 0 obj <<
+/D [4830 0 R /XYZ 90 106.9816 null]
+>> endobj
+4829 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R >>
+/XObject << /Im4 4828 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4880 0 obj <<
+/Length 2868      
+/Filter /FlateDecode
+>>
+stream
+x��[�s۸�_���4S����L_�i:��ͥ�ۗ덆��I�}���
���r��:���p���b���$3
����
+��l����O��� ��%\_����|'�� #��]�6$A�:���yN"d�$�����l��V�����]~��V�,�����͛�宪�Y��K*���&�����6�/���u�X�-�\}�+��`�X��^��
���H����-f��#b
�m/8e�����ſ���BsÔ#8H3=[2����'��?�s�B9�V�RQ���;T��Jn
J�AX=�b֭����Uv�0*�g0
&$�r����B=��JIl:���q��i����S�
.5wL�۹B�J���_���$V��+�4�n���B�Xw�P��_٦�;\�&RD�m��a��t�E����anv@�D
Mi
"B��4���8�|�Q*ƀ�&*�,P7'�0J82Xʞѷe~���N]��^�D��7oW��6��� ��Q#�����N�C�ы�1��Z��!�#�b�F���"���
<4�0E�c~��x��H�5��!�Ȯ7��`L����
%�3
��
�?��I�^ǒJj�(!�P^�"�xN*$�^}�;�1�Px����n'���5u\�0�F
+IJ�#���A�ž��#���(I��g���ŏ��
�*E`N,�`�����z
�~�;�Ţ0�z�й+��|���jU���(�9AT����P��B
����|�AŠ�J�@G,����n�g+�O�O��N�z�����f�"�ۥ'd3J�fz�%O��K�g�ph�Y� ���)t>�Ct�|[�VU�{����G�J
F�B�CJ7X���O��q�N���.�l������S�W#j�P

I�p�^*���am���d����9�Kf'6J殀ߔ��fk�^�����A�7n�J~
+Gݍ��]��olg���^����5�T��ߌ�P�1�� 4ԑ��?x�$?�
+��:'�Cw2?Đ��H�\inן��Si��	[�c[~�P/�T�
�tL
��t��]��*�C
��bǟ�_���l�=�
+��'Z�o�7�~!��_�:=�m�ǔNe�Kg�0R�'����^��fd���`=�{<_�|
+�Ho�_Z�١.7�b���@��&b�NpR)F"��8�)J5R��U��:b)���_Z�]4����3S���џ
��s�=9β��hA�I=�FŸyM&�'��,Շ�bi&Ƙ n�3Ah7�=��0A
�Ho���N`Q�}Fb`]� ��NpR)��j6p��L�5(cF����x�?<���%
p�m��S W HOwz��N�a��
+�bI
+F( a�Q@�n��vO����ގ�_�m'>�?٦�'���=ƈ+����R	,
+|#��D�$P�K��8�%^>c��m����!E#�&��R�����t*
B�A!�΢�@G�������
"�4�v2O���l�`jޑ�ͪ�&��H�:ΐ
�H%M��`J�uX�!�X�!�1����
ڍ3d��)
G0�k����>7������T�*$��j���E0ߔ���T�h��jH�._��+�+��]���d,8�?��\��N*̔*����e�7dzXF�� �1���bɬF�"a�eE��Csp��gHH���Hft�)#�E�؜d��Q-�R��BJ����(	)�y�؝|
+�Ho�H��Fb����R	�
���#� �`J�s!��/fQ}|���
�Ua��~h?���S
���S[ f�S�K&)�D��y
+uL�dP4QG�k��uˊ�����|{��
v�(w�đ?ȅ�ng�
�8Ή�9.f1ุ]�q�ݪuƈ�4��X�0\'��0�k1��
V��nr
��0V��"^8q
�ڭ
{�2����pn��V�}��W
���D��q�Sc�T
+��:�������HF�I��:&��;��N+���(E���
�^�h��d0��3ۉ'���>?eܢa��>������R	 �dm��=k����%Ҧ�
+
�^M,��+.]��Ha����bI
F,a�X�n��тM���
���ɧ��'����6v�qbӇaX����RցE�!f0)v��1g�C�#�N�������\�=x<�9E�׌v۟�&������
(�E{ܮ����ˢ���h�#���L���v
�
+Iy�N*e�@	:��`o�(���uĂ݉Y\�\ |I�c�
����֓����x��Nh�{�x��b�x��
�}�=�F�
���G�����z�!.�;�K%���(̐�[�nd"�ث'�˧̏�Z����V��ۦ!a7�F5���˄�T
+��P�
Q�R�(���Y
�PG$彘�u�������
+�����P.�oS���j��
<CóE
+V;̭�1ܦ��/�C�ɑ#D���J�H���5�GPDxja�J�Z�^2�<�X�yB�/`�
�S�'g��T�9#`���g�	�G����7?��c����*��F�o�M��+w��JA1I��A8����9�)���O'���C_�p��B,<�L�
���s��	5)�\�p��z�Iw(bSuG�?��G�,躖0_A��y���
�y��=F��
SI��v���Y�H{Rs��g
NVg�Mܾ�KB��t�.���0H��t���M��������g��t���U���B�yW�����`����*�?
@�������ʒA
�1ϧ�p�G� /�W?�ܷ�/;47,�;�&�
+�<�k~W��o./ѺB�]q�GE}y��
��j�X��E�Nh���~nw%�=&`�-�����==��mf�Уx�e������endstream
+endobj
+4879 0 obj <<
+/Type /Page
+/Contents 4880 0 R
+/Resources 4878 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4865 0 R
+/Annots [ 4882 0 R 4883 0 R 4885 0 R 4887 0 R 4888 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4897 0 R 4899 0 R 4900 0 R 4903 0 R 4904 0 R 4905 0 R 4907 0 R 4909 0 R 4911 0 R 4912 0 R 4914 0 R 4915 0 R 4916 0 R ]
+>> endobj
+4882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 696.3755 297.7285 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2679da4dbd5b8c33ef607aee49690c2a) >>
+>> endobj
+4883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.5441 696.3755 336.7317 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 657.1476 342.2613 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_9960963fb1f8fb56631e0402557065ae) >>
+>> endobj
+4887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 618.2933 191.7178 629.1973]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 618.2933 288.8524 629.1973]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_78c24741e21a4406ea8ad1588c768147) >>
+>> endobj
+4890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 579.439 191.7178 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+4891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 579.439 303.0791 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_0ab383f3930179982937f7733a283a03) >>
+>> endobj
+4892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 540.5847 194.7761 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_29202eb817eb5c9d59433abeeb4f2eea) >>
+>> endobj
+4893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 502.104 195.3339 512.6344]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_ea0fedb82a525e6ada13cd7fd2d03225) >>
+>> endobj
+4894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 462.8761 201.4711 473.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f8fcee7f8582b0afc9115eb1304c24f9) >>
+>> endobj
+4895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.8082 462.8761 272.3145 473.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 424.3954 150.493 434.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_6742bd7f3f2cb079b96900dda0147940) >>
+>> endobj
+4899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 385.1675 156.2812 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_fa6ba487c08199e83a970fc49b53d3d0) >>
+>> endobj
+4900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 385.1675 203.6031 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 304.405 203.0748 315.309]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+4904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 304.405 296.3242 315.309]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_09c8fc0753a389cc42f84c12f7920832) >>
+>> endobj
+4905 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 289.7843 317.2295 299.6895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4907 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 265.9243 194.2975 276.4547]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_0ab38d6ea061e7c2cb1595ba9cf2fd42) >>
+>> endobj
+4909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 227.07 188.7586 237.6004]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_af207e746f4a3dc2722e254612dab3b3) >>
+>> endobj
+4911 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 188.2157 204.4594 198.7461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4912 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.199 188.2157 278.5108 198.7461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d) >>
+>> endobj
+4914 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 148.9879 204.4594 159.8918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.199 148.9879 297.2005 159.8918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_bbde4b86cfca3e29a917650f4c9c62d5) >>
+>> endobj
+4916 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4881 0 obj <<
+/D [4879 0 R /XYZ 90 757.9346 null]
+>> endobj
+4884 0 obj <<
+/D [4879 0 R /XYZ 90 676.2409 null]
+>> endobj
+4886 0 obj <<
+/D [4879 0 R /XYZ 90 637.3866 null]
+>> endobj
+4889 0 obj <<
+/D [4879 0 R /XYZ 90 598.5323 null]
+>> endobj
+4896 0 obj <<
+/D [4879 0 R /XYZ 90 443.1152 null]
+>> endobj
+4898 0 obj <<
+/D [4879 0 R /XYZ 90 404.2609 null]
+>> endobj
+4901 0 obj <<
+/D [4879 0 R /XYZ 90 323.3789 null]
+>> endobj
+4902 0 obj <<
+/D [4879 0 R /XYZ 90 323.3789 null]
+>> endobj
+4906 0 obj <<
+/D [4879 0 R /XYZ 90 284.6441 null]
+>> endobj
+4908 0 obj <<
+/D [4879 0 R /XYZ 90 245.7898 null]
+>> endobj
+4910 0 obj <<
+/D [4879 0 R /XYZ 90 206.9355 null]
+>> endobj
+4913 0 obj <<
+/D [4879 0 R /XYZ 90 168.0812 null]
+>> endobj
+4878 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F52 345 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4923 0 obj <<
+/Length 2898      
+/Filter /FlateDecode
+>>
+stream
+x�Ŝ�o����W�)�����Ar
�
+\�@�s�r=�D��eWv��ߡvI�Zi��l�!�5~8\~g8ޕ�q�'f�Ϝq,(mg�O��w��_OD��9�^�������
V����+��B�.>�r*��\p�Oߝ	~:_]�?�;�����/�O����.[�W�z��fyw��_.��Υ�o��wwݏ���3�Oˏ
�`�S��ٯ?�|��eE���/���'�ɏ'�������L� g�'Z������d?���
+��%R1n�ZG���b��n0�Ls����0Xdd1��i���O
��R���OI��F�,x�
�ދ�Y�޿���
��$]��芕�f40�qF�t�f4�!H�ެ"��]���7�7o�	�)8�nي\rü�fk���c��+ɬSfk�!����o���r���>|��������f���x����V����x��D`gD\0���lO�
�6ED+����H�" �R�K7���
D
��c�ʙ��icw�,,��߉%�f<j�y�c���
v����
#C���
��/��`�Y��mN�v�t�3/��>*Nt��I=
�(��ҙ���ɠB�!w���X�΄�
�� .Ό�J��#�˹�	Rw	
+��lF�y�p��tɮ�k�s�q����YE� �a!���Y���9��������ޜ
�k
�_gB��.�]-
Z�̜ 柬���;W<��oks^���'{
+`��@�
�#"��(� �*�\��e�K1I�
�b'��)���a�b+ìV�-�:
+�S���h�.
NWl�.+vIע��h���b��-������Q�j���
�� '0~��h,68�
�
+�Ţ����,>�I���#�f�?�K���իu�>��!�;�G�%*y���O���&y��pE��r�J��F�[��`����܁"B���rg��I�r��H�+
N�;�.�Ut
r�1��;�7��#,�<�]�z wcw7z(��&�-����dO���
�c�NX��0[�Ƴ��5ċ&w�z�2S���]6;��-'����r��%w:jPW at br��h�+
N�;�.�]I�"w�h���ܕ�I���-��b"�tt����<�t�]y��z	0���y�"�e,���^���!�9l�zp�<��)��߶�
+:n��c��;�8�Ud����d{
+f෱?��x^n����ފ��p�
�
"�����p� '���
����������v�
a�9@בC��a�
3c at N��������Q8��1p��1J����0��8b�%�d
d�e�@�7�Z�]-`!��"l��?Y${�`෡
�ar��@oD
�a���پ
�q�m���=0���6
�-�dE�@��V��`��0%+�>�����>nVx����L�c
#�uL��v��I!��I�t89)tɮ�kH
+�ؤ@ �f�S$l�ER��sR���<Fԃ7
#���q�4�c���Q���H�b�{��>0QMf��2ךZ�]�K����Z
�*}�2��&3ZQ
���ˊZҵ(*�8ZQqĤ�%�(*2�RQQ���V��F�f��cw���k[�‚��
+��e+�A[o�u5���P�ig�$9-|`r����>��>�ϭ9,�p��r�|`�R�i�"Ŵp7YKq�dV�5()8VHq�ު�k��׏�Qd~����YD�U'��j䆢g��:�$Ţ��HQ�\���m�Xl��8ɶ�q=m,��6J�;�u,�օrdtR?�p�$�d��������VV1k�8f^0�"�J
K
Ɍ�
����˹��kI���#��P>I~@�X&�~�!��SD5xK��1~Gf	,E�@!6y��8J�B�
��C����LT��6.^?c�B�x)yLE�������銊�eE-�Za
��8bRԒ�I�b��(�FQ��?R�F�8�����M�gȍ�
+o\� [�I�ĕ>9�fOظx���
��A�9�bA���)����rJ�%���AN1ƱrJ �f�>p5�`[���<[p����V��ן�
��vk���g��0~��Lk(�Xd+B��֕N6*@.����lO�
���阏c��V�V����'��w
o"��

+X2Hf�q�]�%0̓8 at CBj�
+�c�=X
+��������z��e�/�Z�
a
��8b����z�̠�{n�����|��t��z\�	�ޞ$��K�=�<L�K<ي�Y��V ;���P�I�
�dO
��� 0�y"Ɋ�RQG Wu����+}`��̞�����>��8��8��1�*
��JSOf3R�K��U��Kv]��c�cU�@��*��:6�B�q�����U|=xCO`
�����Xl�x
"W��Q���Cyl���K�&f����m�">�I,l`*�c�/��ͩ�������z��e=,�Z�a
��8b�Ò�z�̠�Cn����
��@�
8�����=A?���6�ta�"  z��.�xX at e���$=,|`z�̞��5���x=T���P��o��������z��e=,�Z�a
��8b�Òp��v�!2�RQ��
V�Kׇ��-�!�1�;�>�bQԇ(Ħ>,!Z����ty	���q]^4"�./���[A�.)�Ť~@���d�
��
���~��+� >;O

0�5v�4w������ �ſ�w_�l3��&����֫����/��Pw/�/��^��n��ә1��r�}��:��~���]-V�
��%�r���+���;�N^�薹�
E\G�{�?������Y�����wN�b��q�_��o_�|���7��}]^ޮ [...]
+���:�+�ϐjց��Y��q��_^��!���1~������endstream
+endobj
+4922 0 obj <<
+/Type /Page
+/Contents 4923 0 R
+/Resources 4921 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4865 0 R
+/Annots [ 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979  [...]
+>> endobj
+4926 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.2473 157.4166 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 697.2473 204.3401 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_dba3d929f4317a38ad387c5b45a91199) >>
+>> endobj
+4928 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.6773 697.2473 308.9269 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.0833 697.2473 432.3329 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4930 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.393 157.4166 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 658.393 204.3401 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_047a99eb91872d19730f4fd14a81f55c) >>
+>> endobj
+4932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.1558 658.393 243.3433 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.7854 658.393 293.973 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 619.5387 157.4166 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 619.5387 204.3401 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f2eb5d22ef23937a261cfe3f6bc435e6) >>
+>> endobj
+4936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.6773 619.5387 308.9269 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 580.6844 157.4166 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4938 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 580.6844 204.3401 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_448b4387171ec166085eb46aacedaad9) >>
+>> endobj
+4939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.6628 580.6844 458.9124 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4940 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 541.8301 157.4166 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 541.8301 206.47 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_61bc4f536e4c04b9594e1b6c7e13d76e) >>
+>> endobj
+4942 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.8072 541.8301 311.0568 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [357.2133 541.8301 434.4629 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4944 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 502.9758 157.4166 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 502.9758 206.47 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_600a652347fb8718e0bc05f7230b8d8a) >>
+>> endobj
+4946 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.2857 502.9758 245.4733 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.9154 502.9758 296.1029 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 464.1215 157.4166 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 464.1215 206.47 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_e3cacddb2450b8b685b8f39936a2b69d) >>
+>> endobj
+4950 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.8072 464.1215 311.0568 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4951 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 425.2672 157.4166 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4952 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 425.2672 206.47 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_e615df068adfbb40a0b0b7a993579d22) >>
+>> endobj
+4953 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.7927 425.2672 461.0423 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4954 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 386.4129 157.4166 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 386.4129 206.47 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f06b2331eb3d080794682080b7f7eb1d) >>
+>> endobj
+4956 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.8072 386.4129 311.0568 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4957 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [357.2133 386.4129 434.4629 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4958 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 347.5586 157.4166 358.4625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4959 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 347.5586 206.47 358.4625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_423e3bb0d9886c630c3c227def9f2073) >>
+>> endobj
+4960 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.8072 347.5586 311.0568 358.4625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4961 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 308.7043 157.4166 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4962 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 308.7043 206.47 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_bdd61469bc5c6dfc6e97f306a751035c) >>
+>> endobj
+4963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.7927 308.7043 461.0423 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4964 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 269.85 157.4166 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4965 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 269.85 200.8512 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_cc5c5125e7237c5913981b99a502f332) >>
+>> endobj
+4966 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.1884 269.85 305.438 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4967 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.5944 269.85 428.844 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4968 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 230.9957 157.4166 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4969 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 230.9957 200.8512 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_61208276a246a505bd753ffbb568bfe7) >>
+>> endobj
+4970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6669 230.9957 239.8544 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.2965 230.9957 290.4841 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+4972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 192.1414 157.4166 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 192.1414 200.8512 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f245f065572b31c8ca97e196e45f9cf9) >>
+>> endobj
+4974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.1884 192.1414 305.438 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 153.2871 157.4166 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 153.2871 200.8512 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_89943bdfa5424bf7acecc51a7b6949c8) >>
+>> endobj
+4977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.1739 153.2871 455.4235 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 114.4328 157.4166 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+4979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 114.4328 200.8512 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_852f422dfdf14a1e8a97b4dad77f7e36) >>
+>> endobj
+4980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.1884 114.4328 305.438 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.5944 114.4328 428.844 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+4982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+4924 0 obj <<
+/D [4922 0 R /XYZ 90 757.9346 null]
+>> endobj
+4925 0 obj <<
+/D [4922 0 R /XYZ 90 716.2211 null]
+>> endobj
+4921 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R /F100 2198 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5001 0 obj <<
+/Length 3254      
+/Filter /FlateDecode
+>>
+stream
+x��\koܸ��_1���
����,��ݴ�n�4q�e��c9Q;������IS�!�Ӣ@�HG�
^�
>2��L
�(��a\N�<� �B��<�ŀ�]����bb��TN.oj
� A	�\^�4%r6#���3����j��������cq��������w�n��j7/��ٌ
+<�v9���7�M�;#zZ��c�eJ�:����/EW�$�9��g<����p�3ZL��F�:Y�p�����ۓ�;̓���@��3Ƒ����HQ��<DJ�(RKę� ��zG�薉`x�
+6�
v=rd4��3{g��=z�"�X�,;�k��*��Q at i(Ns����
�F��,Ek1�l�ݼ��,��W���T4X�5�^	�AZp�,�,�2�(��qщ�;,��ư�R�����`�>G�g����\����?mw�~_n�]:
s�9Q�XT���n������MqsF�EY�����U���:T�w6�����5��SD!"�Da��u5��X Vx�b)Gئ�,�QF�	�4)y�� �X����MQ���N����j�TKL}ʀZ�Ș&Hc�\�,\��8�($)�q���0�cC
`� Z�b�o@�"'�
O�
�#)��A=��#�XF=*������0M��bj#�0A�J���P1�g���H�̂
+�*D�9�"J��X)�8�i����x�z��(��$�*�
^ �@ܠZ�i18-R�'%�~��	�k0Ϧz��U��|ճ��	9*f���1\YK��l9���&T�n׋
+�Ѿ)@��A0��PJ�5�T���
+a߻��O��{�*VW0l��o�/4Ԃ��P
+iQ>��1 !��U�ǀ������{��,{~����
�����s
zvc~����Ep&3����wMf�u�~p�	��������M���$�*
��|+��}�)�kPáҨ
��q��MǁA�Wy:��Θ��@<��
!a<��:Fc��#����
f�

�vW��!}�����8Py�$p�u�^>4W��Cx���ǧ��
�t}\��my7_~���
������&��p��
���l?�s+6bL
�E�`)E�����w�����Ɗ��EW��5�t�=*�
��V�V�
�D�#C��=�5�a-T: �s�/��4���è�6:
��ҳ��s�$
���x���I
���,9j
$��t�_�0R
��
+C^rs��(+��U��ʎ12��ݡ��h�赖4����k-	�O]kI�s�����Z:ԣV�/�q�t�|� JS�����Z�n��D51m�����3�V����B`�Zί�E�S�P.�.��d|s�*����ȋ�GIl�ʱ%�����|�
�?��݃2ލB�(�.;M� \KD�Q
I��D��Q϶�tG�V�@n1&�,�tD*ga�
��y忣&t��s% 
0����%E0^ȭ�XV�c�G���ǵ؍� R
��d(:X��3���J-��Ʌ�v��<�R2��88|�A�n^�i�A@�p!кM`H��PC��x|�@�n>��Z�L<*G �,F�T�#��|;���e��FJ�=�!��w�Ru&��J��Saw��� ˫zd0�V���:�{W��)���50_Ԃt|'�k
>Ǣgײ������>C ,lz$#�Q9�B�T�f{+��K$F�c6��
�cгk����>m�<i�]����L�tp*C��`��i
v%g`��ѡ�����#õ]�7$
���0G�t��v@�S�����FJ�=̲z�-�|Y��Z��a
������b�$]�:׈�sZʌʼn/y��ZR"#�
�U��\BH�N���N�`n�=�U�/��W��
��6�Ò��6]�O�~�?�ZʔIF*���(��,��HY�
��>yn�RD
� O��Y�,Kf{�td(�ZJp�iC����0����E�L$ţ,���V�[��jU�Ƕa�� [...]
+���n65�#�fٌ"�7�Ӝ,�����;�
77� Q*�*
p5�Y%�=���Q͖A�7�$��ix�3��p{Ia4�u��Q)m�7.�ʡ�
1"�$B}4&����1
ق�2�*�����)�UߊB����ɘQ��x at n`b΍���vL����p)�ڻ��|�c���~C�����~�zSz|ρ$0
Qh#OIj��Y��)	̳$�
���� ��
n�\�QSm2� ���c~�>��'Dc����I
H�I�e�$��1O2~}����<�#�
���(ȸ
1�
���)��%uW��@&�H��`�u��v�cV%p3���qS1@�jDxH�����f��,�i32e�L��U������ۑk�N����x1T��X�*�V
���9�Ch
�
C�vB��~la�,��7����g�V`�� 0��}�md;I2����A��v5`GÌ,$K��u�`�ؽZ'��Q�r�q��|(����o��Uo�ASljl��r�St�Ũ��
�f؞8'� �E��1tN���^�=��r�&k�x#r���H��0M3��<;��B�0�h�=!���}��ö\̗��H)��yz������\p���~�Tg���X]m���& [...]
U�2lҀ�-���E؃�q�������?�gC�
��F[���][�U��8?���G�=�]��
*�s���.�=DH�i�õ7
�
�V�9h�T�+��ˍ_�Zm���n�j����
R�7��*<endstream
+endobj
+5000 0 obj <<
+/Type /Page
+/Contents 5001 0 R
+/Resources 4999 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4865 0 R
+/Annots [ 5003 0 R 5004 0 R 5005 0 R 5006 0 R 5007 0 R 5008 0 R 5010 0 R 5011 0 R 5012 0 R 5013 0 R 5014 0 R 5015 0 R 5016 0 R 5017 0 R 5018 0 R 5019 0 R 5020 0 R 5021 0 R 5022 0 R 5023 0 R 5024 0 R 5025 0 R 5026 0 R 5027 0 R 5028 0 R 5029 0 R 5030 0 R 5032 0 R 5033 0 R ]
+>> endobj
+5003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 157.4166 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 719.9123 200.8512 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_3c920e734593812d8529bc12be6f503e) >>
+>> endobj
+5005 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.1884 719.9123 305.438 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.4799 157.4166 692.3839]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 681.4799 200.8512 692.3839]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_54742578f3ff98e32e7e15d6b554f13f) >>
+>> endobj
+5008 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.1739 681.4799 455.4235 692.3839]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 574.6836 180.5399 585.5875]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_340e8b886fb185bed798dcbc1391c126) >>
+>> endobj
+5011 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 574.6836 251.3833 585.5875]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.1164 574.6836 336.6226 585.5875]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 536.2512 178.2386 547.1552]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_e86d21a6490f299af6229d70cf20c3ba) >>
+>> endobj
+5014 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 536.2512 249.082 547.1552]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [290.8151 536.2512 334.3213 547.1552]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 497.8189 157.4166 508.7228]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5017 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 497.8189 206.47 508.7228]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2fb9117b8937e3d9a9b4d3ae397bb79a) >>
+>> endobj
+5018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.2857 497.8189 245.4733 508.7228]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+5019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.9154 497.8189 296.1029 508.7228]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+5020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 459.3866 157.4166 470.2905]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9147 459.3866 200.8512 470.2905]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_4b4c0277d3b6c85ab6633ae9f5e235c6) >>
+>> endobj
+5022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6669 459.3866 239.8544 470.2905]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+5023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.2965 459.3866 290.4841 470.2905]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+5024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.6889 420.9542 156.0548 431.8582]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_66a2134e0f7fc74d62b14f46631dc2c7) >>
+>> endobj
+5025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [159.644 420.9542 314.2327 431.8582]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.0367 420.9542 486.6254 431.8582]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 382.5219 226.0342 393.4259]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_182ea33f63c0eea708e02a32b0904f30) >>
+>> endobj
+5028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 382.5219 364.6822 393.4259]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 344.0896 226.0342 354.9935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_cedadd7f7742a18d941ded77da69ba9a) >>
+>> endobj
+5030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 344.0896 389.8974 354.9935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) >>
+>> endobj
+5032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 244.4194 221.3259 255.3234]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5002 0 obj <<
+/D [5000 0 R /XYZ 90 757.9346 null]
+>> endobj
+5009 0 obj <<
+/D [5000 0 R /XYZ 90 620.0921 null]
+>> endobj
+5031 0 obj <<
+/D [5000 0 R /XYZ 90 307.1704 null]
+>> endobj
+4999 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F100 2198 0 R /F1 583 0 R /F10 488 0 R /F13 577 0 R /F7 574 0 R /F8 568 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5045 0 obj <<
+/Length 2745      
+/Filter /FlateDecode
+>>
+stream
+xڥZ[�۶~�_��K����B���v��8IӴ��۾�
MQ^N%R&)�ʙ��
�(�)�f�@8���3?<K�,aI��(���+4��?\a=
�|`�����>f�4Lc�n�r���`2�]�:�8�x`�����y�l��A�zs�+VM�����d����M]�]��U�C�7��m��_�u�,0�U^�zv�c����t���gQ���
?_�����$?]��������8M�l{jn6W��ݯ�&�>A0L=��ؒFI�`�f	�!���x)�����"��‚�b8\���
���x��\�]�ۢj˺R��Z]3u�mR6/[�T�!R+M��;��6{(���`76�[�\&U�iT]+NBQ�	@�)cX�I>J,;�M��>��f��<
j��aX%�t�`��/�*#&��Y`�!��Ⱦ�RO&�{��T�?�z�������*����nS��x���� ��Y*��_�:YSfœqb�Dp
�O�ă1,L�$��<kDa�����Y��Q��Y��l�$6��zv�F�� [...]
+l�Sw��!
+k
�N/8y�P��e=��%�!#�c��v��+=�QD�}�Y�k+>�M�
lg!��� ��O�f�)PE��a�
N��P�����%!s�Y�BM]�"�Y)b��~
!�*��cS.7�r3��I�
yL�0Jֻ )��LH�K/j�ɅQ���T��&ܕ���#�q�eib����k�OXoO&6�Sag��e.LMr=NR�<�<RO�U�Da�aOk�A-�H�� R� ���?�m���ⅺ
=�@�&QH)��/ge����

�i�!�k00ә����
+ at 4eމ��xYY�
L����ޝG��c" �a>��
���M�	3�!�d��̸ce���`��IJ
:��
�ۄ��LM�A7�!cF�7"�„�ѥFd�O�!����2#�uH�C�R�3z��O�
A,HI�;�t�r(��$��hwu�:z?i
:%�
Sx�Ї�

�tb2{w%���?�����B���*��a���cxR��p
+����ȧ0j�|U�\�j�S�dj��U���Gc�ۏ_��8	i"�/����.*�U�ue+�d�/ ��3�@�M
��X�%�]˕�PRF
l~Q$�%30*a��`F!eӅ�/� �
ܑ(���
�A���$O��!',�F6��z2��٦-�����r���b^����P�lT�)d�vu����V5���gv�����M�TV�HV��
�ET�F���Yr0��y�_�N��� E�\*b�|JĆlBĢPB?��f������ ������4��V#;��wx��
��;���\�0�� ���+�EՓ)�
B
�]�V(P��B�|�A��86�*
لFe���
�B.�Q���W��8����ަ��
#DՑ~��O�� ��>X�5�e7^
L2y��	���'l�/�ά�6� B�|[tw��[h��7���d_ʕp{bJ
K̘�؞�Լ�d9\��0����F/y��(*a=+uSV�ق��=/ ���;�=�J�U���lC*Ot?3I��a�I��T3fsMy,����
�����]�YŤrܴ7�B�>+7}V�J'��hܣ�
+���B������vb)�<���E5jȹxJ�i����uj
�CF�jȎ5MO�-
iw
��;���-�l}��d�W\[u��'��;i�p��h��E���ua/Cy�5���j�	������hp�&�|�v� Nݰ�#	޲Rsݝ<
��Y[��a��\D��v f�,^0
+	JM�`�j���c������(��1��
����cGvI�a��/��sP������
[��\K<S�Ua��U�fn�R̰�������0Nx�:-�M���ma"�Pqw�o����N9LU(��2���D�&��q��<��v�C)
+��	09}�
*�aɪ�u/�����
J:�OY���
u^��y@��EP�^�3��9SO�˙T�����!���N��>��ֹ�s�{E���Z�|^�5�ϟ��7���3.a����Zm|�B�V�B:9�vikYȠ-����2�s��V��Y��ة
�o�x<{�V���}���rG���PGI���R�C�O��Y�ljٓ

lE
n9�]��%N�
I�븇��RP��y1'���
̒�#�ktj�X�'�&P�A|���������*�}��f�4�ԣ9
+@g��\�)��
US�6dݜ
+�k^�
���vľ�c���hMܦK���/
+���n?x!���	&�3痖�6������.W�.x�y?�
+#	�%E�k�o�G��z��N�H㝊��:�W������������=�
��*(����P�T~���D�J0$L�Z=� û���|��u��O�?v��N6Q)�MThU�-s(YjhU�B`]4*s��uSo�s���j�b
�Y�JW��z�>hL���
�P�7�*�|^���~�@�8f���J~ds(�R盝c��b�1�w�ߗ�[󁙺�_�����E����
�̪�s���ű��"�$1�gAN��(��2
ď�+%5�������a��	�<�G>YW
���v7�����aކ���5a�]�v��!_8��$tJ{AOt‹#�
^� ��"3�ao�ﰜ�H|?�a����endstream
+endobj
+5044 0 obj <<
+/Type /Page
+/Contents 5045 0 R
+/Resources 5043 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4865 0 R
+/Annots [ 5047 0 R ]
+>> endobj
+5047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5046 0 obj <<
+/D [5044 0 R /XYZ 90 757.9346 null]
+>> endobj
+5043 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F8 568 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5050 0 obj <<
+/Length 2011      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�۸��_�OW��|��"����]�K|�\��z�]�^�'����P"eQ�eo����~�D�8�gf�RK���T�
+i��tu?��[�nB���G]��/'���j�%��庞A$(���͇!��yD0Ƴ�s�gIy�\��S<+6�w�M�\��]�I��X\��*�,��xv�Iv���]�N�9�gi�Ja>Zf$����'/���v�Ib
�u��#���J��`�t,�p�њN�'�2w��������<�_!;	���
�@�b�cz

���2�ߧeReE�
��X�H^5C�BPQ�פ;rȦ0C��0^,�s�g��Ԩ�x%h�zPH���Z��.m�_�\T���X Lb5�L�X�p,9��+5�1�cs	`��6�!V���n�)R�������
+�:V�ż3km�O��\̾����?[ ��'�h��6x.!R"�7�c2�8�����}�ɪǹ3t
4
+A��1��� 5��2f��כ��w�/�W�ߜB�2��TtԘVh`��eqI�5�4f�O^�<�V�q~&�Xs`~
+Ŏ��N̘~>���8��1���F�XB�yƜ��	
{	j�E
|���P
��װ�~
����e��>�I����+�)������� p[�m�2�4
�<͍����4c��6 
+D1��J�be��D�h$c* B�(������M�ʪ��i��ؚ�?F+����,�{<�<�84�(������|R��6"G+	WA.��Jҕ:^I�P�E����W����x%	)��~^c��a�V̘��n�,�s<���\%�m
��t���t�Vjh��ט!���3fyWs*f�td�s9ELb=�[�h.\\�Ha[[� 
�(L
+#�4
�S������o)�H׿`LW�ue��-uF\5-�ߊbI�F��gQ7e
��{�)̘%כ4HH+���S 6 �d�2\
�'��P:~��
Pu�2�j��g�wi�/s���Pҵ���j��"Pb�2��%y�c(����,o$��&A�Ѯ�P�"
��T�A`UA�	�x	��59�K]��Ġ�3$.-�t�����0-�b_FK��
hi`L��<c�-1�
-տu���M:'b�n�(Ӑ��� �P��萖���L���K�0�&v�.��֪�Y��&+{y�v����ׁ���]��L�Q���}��1��M���{�}Zt;���|�
3�]Uɾ*6�m�J�
���4֜8�	pC<v
��%����o��݄N�9����o
�b�9E 
L�߁V<+���`z<`���������C�GǷfɽN��[�@�	�z��mP���K�o?�|�s��t��J[*�)]l6M�f��*�<�1D���#gM]���6#���[��;��!g�[T�q���)���hӆxz��E�~ҍ�bA�T!�h�eo����^��1A �"
+��9<���� FP
b72�#"��UTPe8�(���V
�fÉ��J�L��j�{�����qsHc�9�#�	$53܇����
�A<3��
�?�������
���+(n��W�e(:�1���htvƢӉ���1���
��FgW��#�@�j�
+��5\�#\���U��:P�������޲jW��
+oE��< �����#-�G��P�c����V�d>�j<��	�.=��Gc�\��9��,
�\ԧsQ~��:����
+6
���m\�)��
?ePp�3g�Bx-?��-��N4�U���-?;��'���g��� ������
����������W2{���;���>��@��J
�w�~��?�T��EC�!B%�(�
m�
��j�X�$�yV�#*�	��7��D��2F�h�M��?;Fx_
�J15�޺���������K�?ͅ�Y�1��ݳ����]{���m�R�0bĀ0ߧ��+i
1/�{
J���N��?;L�
Q��H�˕��f�wU�]\\<<<����l[����n7}�8Ɛي�y/j��x�sL�T8�lY���E���`��J28�6g�S�Q��0endstream
+endobj
+5049 0 obj <<
+/Type /Page
+/Contents 5050 0 R
+/Resources 5048 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 4865 0 R
+/Annots [ 5060 0 R ]
+>> endobj
+5060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5051 0 obj <<
+/D [5049 0 R /XYZ 90 757.9346 null]
+>> endobj
+5052 0 obj <<
+/D [5049 0 R /XYZ 90 733.028 null]
+>> endobj
+4873 0 obj <<
+/D [5049 0 R /XYZ 90 716.2211 null]
+>> endobj
+5053 0 obj <<
+/D [5049 0 R /XYZ 90 716.2211 null]
+>> endobj
+4874 0 obj <<
+/D [5049 0 R /XYZ 107.7135 637.8796 null]
+>> endobj
+4875 0 obj <<
+/D [5049 0 R /XYZ 107.7135 622.135 null]
+>> endobj
+4876 0 obj <<
+/D [5049 0 R /XYZ 107.7135 606.3904 null]
+>> endobj
+5054 0 obj <<
+/D [5049 0 R /XYZ 90 589.7513 null]
+>> endobj
+4877 0 obj <<
+/D [5049 0 R /XYZ 90 567.4395 null]
+>> endobj
+5055 0 obj <<
+/D [5049 0 R /XYZ 90 567.4395 null]
+>> endobj
+5056 0 obj <<
+/D [5049 0 R /XYZ 90 458.6008 null]
+>> endobj
+4917 0 obj <<
+/D [5049 0 R /XYZ 90 436.2891 null]
+>> endobj
+5057 0 obj <<
+/D [5049 0 R /XYZ 90 436.2891 null]
+>> endobj
+4918 0 obj <<
+/D [5049 0 R /XYZ 90 324.5088 null]
+>> endobj
+5058 0 obj <<
+/D [5049 0 R /XYZ 90 310.0266 null]
+>> endobj
+4919 0 obj <<
+/D [5049 0 R /XYZ 90 179.0112 null]
+>> endobj
+5059 0 obj <<
+/D [5049 0 R /XYZ 90 164.5289 null]
+>> endobj
+5048 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F97 1774 0 R /F67 370 0 R /F25 348 0 R /F1 583 0 R /F10 488 0 R /F13 577 0 R /F7 574 0 R /F8 568 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5063 0 obj <<
+/Length 1879      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n�F}�W��h���ZhӸ@�n��%	
Z�#�2�P�
�}g�˛��$�Q($\q83;sf�,a�C"�#%2��h|���G���
�p���wv!Ed��TFWw�I���FW���� BC�1�_���}|}9��?��'�m
_�No�8_�F/f٢��4+C*p��4^,���.�D��l��>V������W��W��~�Ib
��{�G���W=���"z�F���8e�b�{�����n��aoGZ“;#E�R�:R��"E�D�i
�b6^�)�{"���Em�[k�Cv	GKٵ�0g�l)H�>i�|Z�ӴX��Wg��k���:R�+��K/�#��b��	"i4��KV�e^����)�5l����ɨ��D�J�EH��ТM!@�(S
+�ۊ(�DW�ν%ݎ_�"؟.żi |ְ	��s�!��a�B�p�v�mM \��ZB���+g��	�v�)�9��`���2���
u����3���I�'��0bQ{4�J�X�r�Q��wFgy��1AK���Z�*�;\q�,�*n�ݺ��v}�
]mJ �?�ڈ�6j���9\n��rk��|����9t�#'��C�0�F���t�\7�
A��<��ͦ�� �K&�h�.��}dU>7M�⺘9U��c+�mJ`��8w�j�D�$�;�)�u�D	g�
1Hj����Օ3�
7h0�nI��bo�b�g
o��c���Z�/��2
+�W.�wqv��_6]��p@���:�P�,�E���tq�
k}[
�H���J4T����K��
S9���
���uF�e�(@�
��+�&�@�Il��J��v���P
���mE�زCw�>�)(q�J��l慷
D�1����
+/[Lb/<�z�7���}�.���<�d�>^�t+)&�4�h����=��P�
O
��{=7�b�T�����l:��VFa��!c��.�r�ۥn3
+�~S�—�E�&٭��c��7�4.��Xf���V?��KHD�?��P��zm�G�!�]�
��l��q1���횴����ff�_��<w��Ţ4m%C��*���`MH  J���aKA��E��"Z$� FM5jz�b՝6�pG�zwWf�þv�;��F5lj�dDn��m��rQ���<Ill����H�Z;���h ;%�[رk����B����4	�Kk$y=
W;"�0}@-��4g��ׂ v�)���'�C*�=��c`u
�N��� 
`@*���]���]�f{+�? 
�a`�.���{DH
^%w0��8-��W,F�ҏ롛���P�JV��ڣ���#�@�V&��O��z*l	�hP!'�.��=WY@�����{QEत�	����L��T��Eվ
�F�Ce�:6��-Ep=���0�Kt�����+8�0R�i؇�M�NG����=N��I��!5�GB�	8�W<�y��B����[m���4�J1 Q)(?H�ZSPb��E��B��&��&u����nl$��y�
��X��)� <�-t�%�<��	������)�vL�����ؓ�l�$(S!���~�I�FB�jPf5����ْ�d�%qh�M8��z�
��
i�
=5�#���]��N��:)�
��C�+� ň2�`A����w`z3V{uL{�OA'��I��
�d
�/��I�7 ~��'�]:�NJ'����͍/bP�B��7j
z��Q��˯jR#E
i�j�����N^U����'�'���	���0�.��ہ}����lO�����|Q�TW�<O��hA����$ٌ�
+�	9�D���;��~m6[?0l=���C�{֦^��IQ�Gggh�@�,��(-����٦_
cd�b��7���|鄟c���Q���z�{?�^��x_���‘ AW�NRL�endstream
+endobj
+5062 0 obj <<
+/Type /Page
+/Contents 5063 0 R
+/Resources 5061 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5076 0 R
+/Annots [ 5075 0 R ]
+>> endobj
+5075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5064 0 obj <<
+/D [5062 0 R /XYZ 90 757.9346 null]
+>> endobj
+4920 0 obj <<
+/D [5062 0 R /XYZ 90 690.6478 null]
+>> endobj
+5065 0 obj <<
+/D [5062 0 R /XYZ 90 676.0775 null]
+>> endobj
+5066 0 obj <<
+/D [5062 0 R /XYZ 90 585.5558 null]
+>> endobj
+4983 0 obj <<
+/D [5062 0 R /XYZ 90 563.244 null]
+>> endobj
+5067 0 obj <<
+/D [5062 0 R /XYZ 90 563.244 null]
+>> endobj
+4984 0 obj <<
+/D [5062 0 R /XYZ 90 516.0052 null]
+>> endobj
+5068 0 obj <<
+/D [5062 0 R /XYZ 90 501.4349 null]
+>> endobj
+4985 0 obj <<
+/D [5062 0 R /XYZ 90 466.1862 null]
+>> endobj
+5069 0 obj <<
+/D [5062 0 R /XYZ 90 451.6159 null]
+>> endobj
+4986 0 obj <<
+/D [5062 0 R /XYZ 90 404.412 null]
+>> endobj
+5070 0 obj <<
+/D [5062 0 R /XYZ 90 389.8417 null]
+>> endobj
+4987 0 obj <<
+/D [5062 0 R /XYZ 90 342.6378 null]
+>> endobj
+5071 0 obj <<
+/D [5062 0 R /XYZ 90 328.0675 null]
+>> endobj
+4988 0 obj <<
+/D [5062 0 R /XYZ 90 280.6284 null]
+>> endobj
+5072 0 obj <<
+/D [5062 0 R /XYZ 90 266.0581 null]
+>> endobj
+4989 0 obj <<
+/D [5062 0 R /XYZ 90 230.8094 null]
+>> endobj
+5073 0 obj <<
+/D [5062 0 R /XYZ 90 216.2391 null]
+>> endobj
+4990 0 obj <<
+/D [5062 0 R /XYZ 90 169.0352 null]
+>> endobj
+5074 0 obj <<
+/D [5062 0 R /XYZ 90 154.4649 null]
+>> endobj
+4991 0 obj <<
+/D [5062 0 R /XYZ 90 107.261 null]
+>> endobj
+5061 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F1 583 0 R /F10 488 0 R /F13 577 0 R /F7 574 0 R /F8 568 0 R /F11 416 0 R /F25 348 0 R /F97 1774 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5079 0 obj <<
+/Length 1360      
+/Filter /FlateDecode
+>>
+stream
+x��Yo�F���+��R@���{
;
�i
+����0h���ʔB�v��;�K����j�
R\����H
�?,
���r����
�@�8��Q{�ϧ���J�X�TpzSHP@$�^�� `�4<
��.�82N�O��u_�]fq�tx�z���,
��0b�����lV^~Hn�l&Lҫ�q�������������8?��ip���P­��#�Pֲ�n �oƃ���9��_ $�u"�8�J�y$�$��F�Y
�d�dq>ɜGoZ��s�J����rIG�&Z]-8.%~��^9-�Gigo�L�@�f�IZ����huG)%��d&��j������0R��[hd�0!k7�J#:X[Ֆ	�D&�#n��b��M6J����
�Zo ֠�bB+?$�}�V��Iyq5OآN��
Գ`u�(��t��1�H�i���B����鈨
.�Oq�0$�� *.0�m<�z���/�S���]��ܵBb�OiX-n������:�N�7�bN'n#�n%7�(eW�B~�
�g���� ��Hm��OiT�
+-�$�zW9�7R�MK����VàN�l#i	w�h��z2l��
�3tS���Z���2J��\�V���b� �6 �It�.�h
T@�3��uYA~�MuE+��� �cD(0�%ػ�(�f^RV��e�P������M^Y��rd�IjQ;�ʣ�� �)�O��'����UV덆 �(4�
+u�������ʷ�
1V�n�l9x���
;�nE�4�{�kY��shN���r��.5��xX.�V���pc�:
_
�5M)�5Ț�~
v��Ë�#<�(iW͈F
XƏ�i�S���*�dO��P��&ӡdkN��
+F/�ø����Rm<
�=M�������P����H����V*���%�(�fr�ObC��ܧ����h��G
b/���78��=�}k4ؗ�Qm=�
}��֜���s
���;{����}���/�1�o�1���6|�?��1��������k�G�Nc�_.'�q�+��qy�n�r��/ẻMM��͙5��_c7�b�F��i7`d�8�?
Ge���"��9'�4�$��}��%h�ftS���U2��Sy��5H��(�ƹ#��ب8�|?2>��8���O<:�v�D�i-�
@by��{)�%�Vg��1�28
Zh�
�D��qS�=�F8#O�
|2Y��V��ly[�Ö7̒�ǡ�a����>
��ȃ�d�Ї��t�%L;򈫈4��$��Ì��������A}����慨�Fyܪ[./�u����������\��}:�fd�L���v	J�e�/�^�,Z��~AQgݶ-7��@�M�*
�?��s��G��c�?G�áendstream
+endobj
+5078 0 obj <<
+/Type /Page
+/Contents 5079 0 R
+/Resources 5077 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5076 0 R
+/Annots [ 5092 0 R ]
+>> endobj
+5092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5080 0 obj <<
+/D [5078 0 R /XYZ 90 757.9346 null]
+>> endobj
+5081 0 obj <<
+/D [5078 0 R /XYZ 90 733.028 null]
+>> endobj
+4992 0 obj <<
+/D [5078 0 R /XYZ 90 693.0963 null]
+>> endobj
+5082 0 obj <<
+/D [5078 0 R /XYZ 90 678.526 null]
+>> endobj
+4993 0 obj <<
+/D [5078 0 R /XYZ 90 631.3221 null]
+>> endobj
+5083 0 obj <<
+/D [5078 0 R /XYZ 90 616.7518 null]
+>> endobj
+4994 0 obj <<
+/D [5078 0 R /XYZ 90 569.5479 null]
+>> endobj
+5084 0 obj <<
+/D [5078 0 R /XYZ 90 554.9776 null]
+>> endobj
+4995 0 obj <<
+/D [5078 0 R /XYZ 90 507.7737 null]
+>> endobj
+5085 0 obj <<
+/D [5078 0 R /XYZ 90 493.2034 null]
+>> endobj
+4996 0 obj <<
+/D [5078 0 R /XYZ 90 457.9546 null]
+>> endobj
+5086 0 obj <<
+/D [5078 0 R /XYZ 90 443.3843 null]
+>> endobj
+4997 0 obj <<
+/D [5078 0 R /XYZ 90 396.1804 null]
+>> endobj
+5087 0 obj <<
+/D [5078 0 R /XYZ 90 381.6101 null]
+>> endobj
+4998 0 obj <<
+/D [5078 0 R /XYZ 90 334.4062 null]
+>> endobj
+5088 0 obj <<
+/D [5078 0 R /XYZ 90 319.8359 null]
+>> endobj
+5034 0 obj <<
+/D [5078 0 R /XYZ 90 272.632 null]
+>> endobj
+5089 0 obj <<
+/D [5078 0 R /XYZ 90 258.0617 null]
+>> endobj
+5035 0 obj <<
+/D [5078 0 R /XYZ 90 210.8578 null]
+>> endobj
+5090 0 obj <<
+/D [5078 0 R /XYZ 90 196.2875 null]
+>> endobj
+5036 0 obj <<
+/D [5078 0 R /XYZ 90 149.0836 null]
+>> endobj
+5091 0 obj <<
+/D [5078 0 R /XYZ 90 134.5133 null]
+>> endobj
+5037 0 obj <<
+/D [5078 0 R /XYZ 90 97.4973 null]
+>> endobj
+5077 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5096 0 obj <<
+/Length 1740      
+/Filter /FlateDecode
+>>
+stream
+x��Y[��D~ϯ0B�D"�s�D	
+E-�h�
/�Zyﮅc������9�;�3qZ��*�v||.���e\a�C"�#%2��h����~�uB��9<�w~���=�"2�H*���Z�$HPB��՛)!��ٜ`��/gO�r
_��Q<-���dUƗ�ӫ2.��E���8ͫ��m��gs*��qo���ur��3��I�L�Z��:{{�l��E�D0I���&o��h=�`Č�=�`D���z�)kn����U��=�_�!{@(CX
+�� �=*WE���MR�UQ~����

���xZt��76�'Fu�Q���B�{��?N��GF��N��\�h�ĈT^�C� ǽ �A�LW
��)^�M�dq���:IA;�sF�"�$̉B�r��ڕ�6��1�uc�*wI@)��c�e�km��|.���]��C�#j�Ճ��^#.us��
���.�Q1���YҠ]cJ#
�}�{�2J5IG�|̡N���Z,��\��H<��o(�T�MSHcڠ�(`U!ŵ�
R�93A_eI�^J��ĸ#�r�e��'�r	��%�
=�U}2�RE�6��=ֺ|�&�b��Ц�K(� �l@�q����3HF�
+"؈>=������º���~�
�h:���8�(=�0�Y&߇a�&%R
+d�/��
�a�At�AИ�:֨�'Н�%���!l���7��&��
�Rh�1��B(rj��=E�-��K��*������d����AώN_�$��M_B��>��7�2����$4����4l�V�ŢNR`v1��
���?��Q�( �z=��
�'��������`��
Ok�i0Ǭ
�Ka��l�o��J|����{y���mdB i+������6�aK"�U|$��h>�6����|J�La1�OJ�m��|:k�|��k��h>;}�H#��Z���.3ŧ��>1A{�
�q;��P8HI#�s;�
״�<�d��$w/��E3vV�r���6��"w?]�{~65��rĻ����Irk(�[�uY�c�Ȳ�n��i~Ӭ��f�"p&d0�`�
?�v�\z��
,Z�p
+�
؂M
+
+E=j��:ef���gw����mK�6�v/��s���

�77n�����v����d��
0��4_f�U(��(	�(�%�
`O��N4�C���8������6)��
��!���<�K��\�=b�WE�)�Uߔͬi�h��A
CeA%E�h")����d�
�u%������E�'���u�9�y��p�t-���ɫI�S
`���?V�0ؐ1�
�Ca�И���9얖z;a#�+0�
Z���a��=��۴��]�R��
$���Qy�e^w]h�O�p��v���2�����
,-��q
4�m�7"ga�J8�H�t"4!l�[B34T� �5D y
5C��Z��k�ʳ1�eV5UW�z����Tw�_n;\�

+	�A�"�
+��#X���o�/wWY�t^�H�WM0Ov��6�P�(I���
+�<)�F�d}��붛17�qµF����<�0��H�(,��	��
4�
8��6
� �@Se��Ґ&�����N���u�����a�O����
H���J�֏&w��6)��K���/�|g�/�wVURn���M�PeQA38O��y�
�Nl0r�(�����}��
����T'��6�۪�,������r�vy�)QZ��zq6�c
�Vl,{�V���
�
S{��=_ڭ`]�>
i?��5�������I5�endstream
+endobj
+5095 0 obj <<
+/Type /Page
+/Contents 5096 0 R
+/Resources 5094 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5076 0 R
+/Annots [ 5105 0 R 5108 0 R 5109 0 R ]
+>> endobj
+5093 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Constraint__System__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 5110 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 338.00000000 34.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 5111 0 R
+>>/Font << /R9 5112 0 R>>
+>>
+/Length 5113 0 R
+/Filter /FlateDecode
+>>
+stream
+x��QKO�0
��W���i��B\@ڣ7���u[ѲGV	�_��U�L
������Bm��z�a���
�7�Ʒ�+2�ɲ��*5� ��h��5�8��<n�X=P��c�+O�@dT˨
K�Q�႗a�.�v��p7�S���a�o�U����3թ�L��s��v�U���5����f����~+�'��L(	�-
��+
+�L�;e�"�eE
�,�'

�+\LIȸ��,*�)ˁ�?g��y�~e��蜌�Z�Q��Ձ�0�=z��y�
�n�t��/��z�_i�iҡZ��j������ă�endstream
+endobj
+5110 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142730)
+/ModDate (D:20080908142730)
+>>
+endobj
+5111 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+5112 0 obj
+<<
+/BaseFont /WTICSI#2BFreeSans
+/FontDescriptor 5114 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 556 556 0 0 556 222 0 0 222 833 556 556 556 0 333 500 278 0 0 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+5113 0 obj
+310
+endobj
+5114 0 obj
+<<
+/Type /FontDescriptor
+/FontName /WTICSI#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 5115 0 R
+>>
+endobj
+5115 0 obj
+<<
+/Length1 56300
+/Filter /FlateDecode
+/Length 5116 0 R
+>>
+stream
+x���|�����e�@�m(t�eɲ�l
hii
�nj'� �ImH��{���{���{O�d�+��gȿ�=�$����~�]�{�
I�L�O�D��Y�5�����ޯ��zr}���-A�ݶ��B��<����Y
���t>A��wr�_�N~Ao���]�a��y���τ������M�+o�bo[.���x�{|Onq߰]�ڳ{?-�\Oa�1?���2����[����V��~'��/�c��_�{kr�zɟ?�������ϼ�%6�n!
'�&x��l��y���^�\;z.AtA'	��:Ep�#�ib-r%�
!��Ag�U��s�@�]%\j{�1b��Ćt�WɈ�U�_rM'�����)B!n�N[OCg��M���N��#���@W���ǡLji�9�G;Њ�O�ʏ�'AW�C鋠{���G��~"M�}� Q$
+^�U��ЈV�Fl�:��4�({�O��=]{j��m�{�D?Q"�=K����J�$�H��


���U۰�;��6Z�r��2����(W.������\����=����*����ʕ<m+����O�x����
��.y�5Y&:�x�
z�'�,wPb`׈$1��:&��zKU���Yh�Ojm��(=hOג��ؓD���ӛkޝ�g
Z���@l�Yzסm
+"4=��}oFn_(W��Lخ����M�B0�-Z�� ���]���3�d�_Z�����Z���mZp����-��l�l�D���]��^UϿ��JlM��e��-����m|�WV�w5×?�B��gwZ�+��ގ�jWw���k�Ov�s�j���ҟ�_h��T{[�n=�ej�T(�-����m-3��
+�J�+��
��
�)�d��"��$/�?	�<كn
“=k�w5���ӈ�j�o��ɋ-��Y��u��6��ɝ}�I]՞�`��_��O�{ �
l	m�ؓ��a��c�ן�v	ں�t�k�=�pZ�v��BA{���ݶ�%_�]T��cq�����JK��B�k�BK1��@K{o��]�
+X���{Z��>2>H�W�|��s~Ag�����¬Y�
���ݻ��҂n�=����S���
rw���y?�=ΫY�_�>ϧ6x�w!�Z��9R�՞��+9��*������%O
D�?��~��H���,Xc	���	��K�˕1b���G+x�q1�X�C�D�L�B�J�%V#V'��G�I����Z���:ĺ�z���^���2�� q/�$�˖Ion��k�����M�M��<��	�˼"�M��4b��[zM���53��������8��!s�
�
�����]�]��<��ݫ���E���!�=ĩ��ġı�Q�9���
�
I�I
D�D�H�D
C�F
N<D�K�@�K\I�B�L�J\H\C<A<��`�k�㽆}�k�lj'��<.z�x���k������f��8�x�x�x�늯�o�#�n����֝%�|�[��:��g��׍��/��R�{�{���z+����o�;I��H�H����%�L*�Jƈ=F'G�$�9�
E�&W$ǐ+�+�����c�Ո߉?���5�r
�&9��@�E�M�C�K�G�On at nHN$�$^#'���V2Njd��I�L�&�"-r
+��1�!��	�)��9i��&3d�tɩ�4r:��%q=q9�܊ܚ�InCnKnG�"g�s�������'���\rrGr'rgrrWr7r
�;�#�d�N����"�����.�H��%�������#� �d�����Br��
 �$�"�&�!�%�#�' $.%"&!%#'� �$�"�&�!�%�#�'O O$O"O&O!O%O#O'� �$�"�&�!�%�#�'/ /$/"/&/!/%/#/'� �$�"�&�!�%�#�'o o$o"o&o!o%o#o'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!�%�#�'_ _$_"_&_!_%_#_'� �$�"�&�!�%�#�'? ?$?"?&?!?%?#?'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!���R�IJQ4�P,�Q<%P"%Q2�P*��Qé�
+�Hj5�Z�C�D�L�B�J��V�V�֠Z�qԚ�xj��6��.�
�>��!5��DM�Z�8�Q	J�
*I�T���)�F���&Ԧ�f��M9T��PYʥ�RӨ��Ԗ�
j+jkj&�
�-�
5��M͡���R;P;R;Q;S�P�R�Q�ݩ
��ڨv�@uP�T�MͧPE�u���*Q�T���6��>��
U�*T��R���� �'��7��/��?u u uu0uu(uu8uu$uu4u
u,u
u<uu"uu2u
+u*uu:uu&uu6uu.u
u>uu!uu1u	u)uu9uu%uu5u
u-u
u=uu#uu3u
u+uu;uu'uu7uu/uu?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%q��5�
�-�
�=��#��3�
�+��;��'��7�����K�$M�4��,��<-�"-�2��*
������
+�Hz=�^�
C�D�L�B�J��W�W�נ[�q��xz��6��.�
�>��!=��DO�[�8��	Z�
:I�t���)�F���&��f��M;t���Yڥ��������
z+zkz&�
�-�
=��Mϡ����;�;�;�;ӻлһ�����
����v�@wНt�Mϧ�E��.ѽt�]�+t��ҋ��� �'��7��/��?} } }}0}}(}}8}}$}}4}
},}
}<}}"}}2}
+}*}}:}}&}}6}}.}
}>}}!}}1}	})}}9}}%}}5}
}-}
}=}}#}}3}
}+}};}}'}}7}}/}}?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����!���a������Q��1Ø��ff$3�ͬȌaVbVfVaVe�2�1�3k0-�8fMf<3�Y�Y�Y�Y�Y�Y�ـِ��Lb&3�L�ј�3�dL&�X�f#fcffSf3fs�f
&�d�,�2S�i�tf
fKf��53�نَٖ���f�0�3s�
�
�����]�]�ݘy��L��3mL;S`:�N���f�3
�"�Ô�^��ك)3���3
�E�bf�ًٓٛهُٟٗ9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�����������������������������������������������������������������y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y��������������������������������������������������� [...]
+��J��*����a�pv�;�
ŎfWdǰ+�+�����c�����5�v
�&;����ŮͮîˮǮ�n�n�Nd'���V6�jl��Y�M�&�b-v
+��1�	�)��9k��f3l�u٩�4v:��%;�݊ݚ��n�n�n��bg�s��ٹ���N���.��n�<vw6���6��-�
l'��v���l��aKl/������
+[e�م�"v1;���������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾¾ʾƾξ��ɾž;þ˾Ǿ�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.a����(����8��N�$N�N�b�0n87�[�ɍ�Fs+rc�����U�U���j���\
7�[��M�������������6�6�&r���\+�4.���%9�Kq7�ۈۘۄ۔یۜ�9�Ks.˹�Tn7�ۂے��m�m������fq��9���\nnGn'ngnnWn7n
�;���\������⺹�����p%�������\��r��Bn��������������������������������� [...]
+��1~?������G���1�J���*���X~5~u~
��ǯɏ�'�k�k������������I�d������u���ɧx���o�o�o�o�o�o�ۼç�
��]~*?���o�o�����g����������
~{~.��#��3�
�+�?�ߝ��y��o�
|��w���|~_�{�����{�e��W�~~!��_��{�{�{�����������������G�G�G�G���������'�'�'�'�����g�g�g�g�����������������W�W�W�W���������7�7�7�7�����w�w�w�w�����������������O�O�O�O���������/�/�/�/�����o�o�o�o�����������������_�_�_�_���������?�?�?�?�����������K�B J�F`N�AI�EP��0L.�VF
+���Š�a%aeaaUa��������"���
�����u�u�����
�
���$a��*�MH�`I�R�%L666666l��BF�
+�0U�&L��f[	[
3�m�m��Y�la���0W�A�Q�I�Y�E�U�M�'�.䄼�&�
�C���na��@(
+=BI���=��P!n$n�ĭ�m��B?q3q
񈰐8�x�8LX$,&�"
�=�����}�}���{�������������C�C�ÄÅ#�#�����c�c���������S�S�ӄӅ3�3�����s�s���
�
�����K�K�˄ˉ��+�+�����k�k���������[�[�ۄۅ;�;�����{�{�����������G�G�DŽDž'�'�����g�g���������W�W�ׅׄ7�7�����w�w�����������O�O�τυ/�/�����o�Ӆo��˅�������_�3�_�3��߄߅?�?�K�������%¿"A�-�"%�"#�"'� ��e�D
G�L�"ʢ"�bL
&G�+�#�Q�hqEq���������8V\M\]\Clljk���	�Z���:��z�����Dq�8Yl�&&D]4Ĥh�)���������������i1#fEW�*N��[�[�3ĭĭř�6��v�,q�8G�^�+� �(�$�,�"�*�&�wsb^l�ł�!v�]b [...]
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_��H��h��X��xI�DI�dI�T)&
��K#����(i���4FZIZYZEZU+�&�.�!�H�5���i-imi
i]i=i}iiCi�4I�,�JqI��.RR2��dIS�����M�M�ͤ�%[r������+M��Iӥ-�-��V���Lii[i;i�4[�#m/͕v�v�v�v�v�v�v��I�K9)/�I�RA�:�.�[�/-��R�T�z�>i�,U���/-�I��iOi/ioii_i?i�~�� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�i��LȤLɴ�Ȭ�ɼ,Ȣ,ɲ�Ȫ
������
+�Hy�<Z^Q
#�$�,�"�*��W�W�א[�q��xy�����������������<Q�$O�[帬�	Y�
9)�rJ��)�F���&��f��-;rZ��Yٕ��������
y+yky�������<K�-ϑ����;�;�;�;˻Ȼʻ����圜���v� wȝr��-ϗ�E�G.ɽr���\�+rU�ʋ��򀼧������������|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|����������������������������������������������������������������������������������������������������������������������������D�W!R�ZaV�^Q�YQU�)Ô��ee�2J����QVRVVVQVU�*�)�+k(-�8eMe�2AYKY[YGYWYOY_�@�P��LR&+�J\є��+��TL%�X�e#eceeSe3es�V
%� [...]
+��J��*����a�pu���:R
��VWTǨ+�+�����c�����5�u���:^��������������n�n�NT'���V5�jjB�UCM���R-u�������������j���V3jVuթ�4u�����:C�J�Z��n�n�n��Rg�s��չ���N���.��n�<uw5���6�]-�
j�ڥv���jQ�QKj�ڧՊZU�Յ�"u�:��������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
���������������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�ޠިޤެޢުަޮޡީޥޭޣޫާޯ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>���������������������������������~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.Q��12F��cc\��	11&��Sc�ذ��؈�
+���Q�ѱccb+�V��[566�Zl����ظؚ��	��bk�։�[/�~l�؆���I�ɱ�X<��1=fĒ13��Y�)��b�6�m�,�y̎9�t,�����ش�t��8�ץ"!Uz;�]�V(�vO���[�s���|�����|�۽����>H9��]n���(�m���n����
+����\�-W+�=��\��� �l X�
,��|a�e�
�����Y����:#U����ӓ�Eg݅<����A���ϕ�.�7��]l/pݾৣ&ݨ��&�A�MG�݁��oAuϗ��Ø?�+[�G��ᢳ\(���R{w7#��_-pE_(3���u܌����`fx�g��/n���R����ϗ��:x�4p)W{w���
:[�
�N~&*ߋ��
*��
ufW�3W��)���jo��]C9�a����1l�PĬ੊/�Yu�X���Rwk<�A&����ՠ
f�:�Z��9AG�
9u�G]�u��;��]�d�k��9
�꯿����1W��Ÿ�N߱NԹ����
i����g����Rg%�]�2�Z��:���4!S��
�@�!3�YH7��-�[���k��\
�p-�Z���k���3�z�%���;�٨�
l�6�m`����m��
l�6��,;����tP_��
`;�v�� ��l��
��A��Ѿiु�^xiु�^xiु�^uM��iু�~��g��~��g��~��g��~��g��~�Y�g��~������=
�,г@�=
�,г@w����
t�.j�ϵ$��)�I��T��2W2��J1W�
+��A�/Ekm��Cj�	H
ҀLB��)H
҆t Ӑ�,dP{-�8����?�8�����ʬ�|^���]Q�����!�4`h�Ѐ���ꨡ�ꨡ�ꨡ���P~uL��	�1�:�oཱྀ�Fx���@|�3���
�e .��'	�$��bZxI�%��^xI�%��D{$Q�$��3�g��	<x&�L��3�g���z���	|�&��_�Ki�/
����4����_�Ki�/
����4����_�K�����_�Ki�/
����4����_�K��k�.8L�i�0

��4�|�!�k���I����‚7��Sj�/Ѫ����΢C�IH2�v��.��{�?eC:�i�
d2�9�|�@>I �$�O�'	��I"�(�)H
�q�ǁ>rI�$�_�o-�/{
V�&�D�@�I �$�hH4	$�M�&�D�@�I �$�hH4	$�M"�r(7�r(7�r(	)�D�@�H`�&0a��	3�V{K����P.T�+��d��r�*�J��B�НS�}�no�雅l���BSf�t�V��Ŝ:gifO�3p��7`�>��9vj���A`�L
��w�����]��� �-s}}9o�ӓo�Q[�S[�S;t�ڦ�ޮ�����ٓ�g��yDCo��M���m*��m)��"��Z�E
��_��
VT�A���|�r��ʱ�b5ǣ,f�Z�j7�~�j��
����A:i��O-���S~��rW/W�U.����zu>��կ���.��Z�+�m>l�0���^��ި��L
$��X魭b���;��c��H�"m�
iF�%#͌�T�Y����0���Ld	��zTn<*-
��J�c�"֢��(N-*O��Ԣ���d-*9���JND%'��HD�#a$"�D���0�C�0�C�0�c�]�C�0�Cl��d�D2z"=���0���(3�Ōb1��ͨd3*ٌJ6��SQɩ���#a�"�T���0RF*�HEV�aEV�aEV�aEV��Հn
��`i!V<�9��H��pk"��H3"-if��"�~87��+�C<��p7�cU�cU�cU���h&�O@|:VF:v�:VHzX&VHz�&�s�+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
�|
�|
�z
�z
�z
�z��
<x����������������������������������
�cE�cE�c��c��c��c��c��c��c��c��c��ce�ce�ce�c��c��c��c��c��c�c��c��c��c����L8Szx����������5�
_�
_�
_�
_�
_�"�,p�� �|
�|
�|
�|
�|
�|
�|
�|=d8��u��u��u��u��u��u7�3��3��3��3:���4!S�a96����@f!��
��:�u���ׁ��1t���ׁ�_�|
�:�u�col`)j`ol`ol`ol`ol`ol`/l�Þ����0�����������=��=��=��=��=��=��=��=��=��n��#�#�#�#�#�#�#XrXr�#�#�#�#X��#�#�#�#�#�#�#�#�#�#�#�#�#�)۟�^\�&/20RMk�4-�KD�
iF��"͌�MF�dd��&Bܤ
��ңt-zB��0�$NR�tx/�
ԌHKF�i�H����H�G�i�a��a��a�F*�HE�#a�"�T���0RF*�HE8�0[C�� �:���4!S��
�@�!�1jb/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/o�C�,d0'L��M
��5�c;ob;ob;ob;ob;ob;ob;ob;ob;ob�n"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qPO�x9�D�7��M�x9�D�7��M�x9�D�7��M�x
���8�0N,�
���8�0N,�
��j
�s Ӑ�,dP
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
���1��c 
�@Ɠ��da<YOƓ��da<YOƓ��da
YGƑ�qda
YGƑ�qda
YGƑ�qda
YGƑ�#�,�,�,�,�,�,�,�,�,�,dy
k
k
k
k
k
k
k
���
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+����K��r��r.�]j�\���0W�I�����+w昚��������]S�kj���웋���;�j���

r\�w�_T����R�ok�/�����|8
��Z������e{;�J����5(�=p
.��}��/0���|p���
����E�v%(�R�m�ﮜP+�A5���\g9ו�VZ�˕k��k��Vh�M��V�o�ڻ\��
+��\d�L��]�J�T�j�ë{p�'W^������
+
���D��-�=V
�Z��Y(��|zK�1�
+~��
����~߭�{��ҽ�v�RXX(��wwvUk��R�V�fOw0�|5�Sj���
+�P��Jwg�v��_.Jm��
��"Q���(*�����������?6�����
�c�wl�
ޱ�;6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6�����a�?l�
���6x�_��
<a�'l�
^��
6x�/��y�F޷��m�yy�F����m�iy�F~��gm�Yy�F���gm�Yy�F���a9�y�F���gm�Yy�ƞ�ƞ�ƞ��^��^��^���6�L6>O��y��3��X�����阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���x��)��S2�d6N�l���8%�qJf�t��阍S1�b6N�l���8�q*f�4��i���0�a6N�l���8
�qf�4��i��S0�`6N�l�~�8��q�e���Ά������3&gL6Θl�1�8c�q�d�����3&gL6Θ
�=y�A�s��
�=�����A�s��
�7��A~s��
�5��A>s��
�1y�A>r��
�
y�A�q�w
��Sy�A�q�o
���A�q�o
�C
�
�8y�I�v���� o8�򆃼� o8��<� 8��<� 8�N�
����鸃��`�;��湃y�`~;��浃��`�:���Us0_
�K����tpz�`~:��N�
�S����t0?
�C���<t0
�:;�o曃�f���|s0�
�;8vp6��l��ٰ�3�4�'��I���4�'��I���4�'��I���4�'��I#?������i�[��F���oi�[�8�|�F>N�?���4�q�8�|�F?�яi�c��F?�����Ki�4�Ry)���F^J#/����A^�g�s#O�!5��i@&!M��iC:�i�
d�q�ǁ [...]
��5�k�׀�_�|
�	�'�� ~�	�'�� ~�	�'�� ~�	�'�� ~�:�u���ׁ�_�|
�:�u���ׁ�_�|
��
��7�o � �|��
��7�o � �|�I�'��~�I�'��~�I�'��~�I�'��~�&�M��7�o��	|�&�M��7�o��	|����/�q�17x�|�/�[#�P
�K?��S�O?��S�O?��[����[����[����[���o��\��(�F�6ʵQ��rm�k�\��(�F��|��F�l��F�
�;�w�� ��|��
�;�w�� ��|����O?
�4���O?
�4���O?
�4���O?
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,���?
�,���?
�,���?
��W]�qn�`�
�V��@w���z�	s�K�`i,킥]��
�v��.X�K��ay6����@f!�ڸ`i,킥]��
�v��.X�+�`e�삕]��
v��.X�
�`a,삅]��
v��.X�
�`aW
�P?��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,�u]��
�u��.X��`Y,�e]��
�u��.X�˺`W��a��,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X�M/��R�K/<��
�t��.X�k�`M��B<���5]��
�t��.X�k�`M��5]��k��Z���o�>����`W��]]��
vu��.����`W��]]��
vu��.����`W��]]��
Vu��.X���`U��U]��
Vu��.X���`U��M]��
6u��.����`Sl�M]��
6u��.����`O [...]
���

8.p\Gkmu���n����-C at l��K
ݝ��B{���[Q{i8����[-Ծ�Y����RK�zK�o'J�B��P̉8��]�Zh�-ᡀ@<i@&!MHG,,n+�z��EX2���'t<P�'-HG�}bT��+��{�Wj��F��aQx!W����l]��
E�>@�.jݥ�����^]�U�C��ʏ`�‹ zƋ zƏ ��#�
�E^p}�J��
�gGo�$�L�����E��7�L2�*L�(�T��0o�$㉀=�	��5�KO�!Xrx҆��`��Ń��'� J$���]��v�k;_��
�o � �Ȁ�=i�^~Su)~�zE��2t�oX\�`Ǔ-�В-`mOꐈ'�x��'�x��'��H�)�h�$�"`mO��	|�&�M��7�o��	|�&�M��7�o�b�\�]T���y_��|Y�5Sp��wQ)��^�pk/��<�;��eol���9_�&��}j��EF^�R�
�`/�Zv����L�ݹ�P��x�\�6
��T�
�BO�k���tz�I͛B�����\hj�ooj���'u%�_�,��U�`���ro_o��_`�l��Y,H����\��z���T�e���'�=
|�V�7,5|�ғY���NGo��W�{���g���z5-X�zR�D�He��'~p
j�k�XxQ�U�J�/�
}��`XkV2�z������9�j�bBC��U�U�k�b�/R�A�%�u��&��6=�?��h��
�:CR�4 ��&d
+҂�!
����3�YH��t�^�� 5��!�Bܬ9�u�!��~
�:�G
�:C�}
!hA�C�
����di Y"@�44?�d]�@C"@ū�^����9X �Zkx�Zû�޵��'���+^��𲵆��5�l��ek
/[kx�Z���^��𲵆��5�l��Z ��Ϟ��P�x�hPV�Z��G3B�V(z�H�>�b�J2��
B�#аd-
U���0
=�GK��Ǎ��Q9�}�boۂ�QRh���W���Sh����E���ޮ��Q]�B{��r5�_�V���
����������-`[�`

l�z���d��-W����=߻���u.�ϰC	`���Sހ������;��AKji���R��5��mx�T�
�^��R�L@�&d
+҂�!
�4d2
�2�O/8"�$p�xtġ#
~z藄D\:�����tĥ#.
q�KG\�2�o � �|��
��7�o � �|��
�'��~�I�'��~�I�'��~�I�'��~�I��7�o��	|�&�M��7�o��	|�&�Mী�~
+�)ী�~
+�)ী�~
+�)ী�~
+�)�[���o���r-�g�φ�
?qڈ�F�6����l�i��"Nqڈ�F��t�� ��|��
�;�w�� ��|��
ু�~�iু�~�iু�~�iু�~�i�g��~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y��w����
|�.�]��w����
|��I/@g�t/@��`����ځLCf ��n ��d\h��^
�/���/�
lGw�Zh�::莎n��?q�J��W�\����l���#X��x�ɓdR�
�Qb�<�d
+r�k5�Wr��4$�V�.^�r�'C1$C"�UUQ$��v��Z�A
�U*�P�x��ūS�D-u���v:��Q�
}
�5,	:ꦇHA�\7S{ӷ��]�_�Vq���U.��$���.o�(o����
��}��+uz\���K�����1/�u.�A�8��/`/��k��9h���K��.m�� �@�+e�����R�jկ
�:�������.�=]�@
p��ZT������|��gP
T˃jq�J]
�ʠK�Z�Q.��u���ܰP�
��A�
�{��N�c�H�7"sO�y �k�p�W2�+]�V�Ӊ;���
���0�j�SD_邩�
&���]
�C�jx�=|(4�`��x��C_葇!�
_�}{�2 �JS��;��>R�P����/����O/�&K�b�*��
ܫ��rq1P��"-2�#c9�@ՂRJ(���R�A%�єJ���~�\'d{Ѓᤨ)^��"d	�'��R���^=%(��^
ꠎ�]u��u�&�
_
��$�J<Wm��
+�FMA���-��%�����7�/ɓ��h]P<_n�+\���懦�]����CmpX��������`B5J�%L)ԻB�����iq9T1�B=
�D��%tp_���c)�L
Lp�كh�*:�V!�]0�����#
31
1�#�
�=L������x����R��`:c�ԥ�����a;
f��5��P
�m)�Eu9��G	�+E��3��v��v�f�d6���
*?
�_���>�
�d��९j5LdE$���A��(��<T=�v��>0��҃��־g^;d	7Jar��az��jE8�{�<��-�잆d����V

�	��%�@#�����+���
���
+�
�t��*P
$�"����<6BM�
+M�P)�JO�C��aMA;@�S�����C�<��O0˃D�����sjjW�WGd=�m4{-<1���AJ����M
� � ,yPEy�#�O%�n���V	\%l�p�U0���
�J�O��~��->X�й`u�*`�P�@�]�g�
\�]>$�<($.e��|���a�χ�7��
+������gMA��á���q#҃g{�%M��"S<��p<��\0� ]0�!�����
������_vw_��^��*��*�ݚ_����������-5h�����1���^_D{C�
E�7���ʁZ��O���
)z�i��eF_}}K�*�ߪo�|�S�����O壧�`@��+���\O}�=ѭX
�|�
+=uq�[���/�� 9TQᕆ0*]
m_ˆ
7�
+
��Vp{x�uJ���s*u�S	;'���t��ҕ�J�#������;�R�
�薿E��
q�J�� �[x���_�!����B�%
+lA��h�_\S��VgW�U��ޱ��V[C��o�o,c���K���i���K�u7kۻ�rJ��ՆBbio(��VC}�~}
~��[��[=�����b}	���x����\n�j�7!G#��?�|Cm{+�`G��oF�
+=���&�a1#E
�J����<$
+�"�T�XPR����X{Rk���u�\��u1
&�>��{n �����;q��@�> K
�U�K

�����
��PI�fa09��'[[� �P��K��R2ϗ���?k��c𸦷�J<pkMn�ڤ\~a%0�&��z��`
�1B%*f��=3�k�Rx�B�N�ݥ
�'勋*cO#�D��I�]%�L7ތg���&��1:��8��\�4z$Z#O�c��\�?�H$�����=�c	��
��
mH#;d������1��N���o
�T�շ~����f���Z�T2
P�p��!�h63���#Mc�Rc���L3c�����Y_{m�ԆlA�\�E�I�K7�Y<��B��
�Y�k�f�B�jv�G�f�f=�5�-���6�&{�!h�OkRh�Y�&�5o��N4��f��h6��0Z6њ
׬���-њ׬����Đ��i
l���ʈ�gʸ���#9��9�GC���#�
jnƇ���!=�!=��C�
�
��
ʣ���n��p���Z�QZ���a��H��J|\��Ф��=�C\j���V} 	#�l>����3A�
ϛcq+r�}���]�Y7�,+-e�Kba,K%�zX=
*Z�$BE#T��b�J*T����ʨi�lk��g�5\��eh��j��nh�h	�
k`�50�a
����8�.�ɺ'3�����?ƚ;�H
+�Ȩխ��0�db2
1�.z��zC	�)ajpK5u
�
��
��F�
�Ѿ�I�׷~��J�0��,�F5K����F�nmf�736���V#
-{�
_Ƣ�.��Cz,g��HC��rIr�ο�xd��r��Ҙܗ�j��\�v
��Tܸ�^N,Cn��e��:�!G�6d�hC��6��pȾI
�7!36M���K��IYO��v.
녦

�=�
+,
t����iƏӖ� ��4�|���B�w9L�,��`Cy$�!=�������T���e,͖�(��}f����D��#�/�����p���U� �H736�FK!��K�e�Ɨ�1i�y�u�$j澜�vO�'w
��������!vL�
O�����mt`����lf4�S͌v3c��1�̘mb�͌z3c��͂��o7
�v����nV#�i��&FGkflVw�Y5�f
�4��Ӭ��`\o�2�
nbB�Iͺc^3�?��[���#~]��Pp�\�݉��ҭ�?7��ң}Hw�7�}9��sO�'���Ɛ����M�i9������j濹g�����j0�Rh�T�gQv*��h53�
�qK�˺��s��c�q����N�T+Ke�V�8�ѳIY��,�cl�e<Pw�vk�M�uy7�K݌/�f�zж�C�l'�z<[_��7�˻i.�S�m!�,�ۢ;uU
�����z�˶�������Ķv
��kXo9�t����C�X� Y�]ty
�P��,'��[�#�RݥՏ����j�z�
��4�#�q
5Y����
�#5��=d]��u�1d
��q�C�1dƲ����
rP�3d{,c�5�����R#��Ġ�
�����th����`!�?wk�����n����R~ry
�n��<2D��������ㆄ�ď�
.8���1J�C���D7�!�,'~-�� =� HO�CE
�D���
��
a��3:ޝ�Ӎ��nXf���
~l������&�

Fk�(F�Fk$w�N�~��lf4�S͌V3����43��3͌�fF��1
�x3��̘hfԛ���ݬ=�f�i7kO�Y��͚�n�tv����5�ݬ�fM�4k%�Y+9��i� N�q�5��8��k��mn�6�f�͠l
�����xa)��Ĉ���[�#���i7����*�P1�5���ע����cX�j4�MƗW�6d�M��Z�R�Dk��8\�

��Z���G�v��v+P�x����nb�'��Q�dz6>
[�h53�͌N3c��1���61��w)��̘hfԛ��
,e4����֬A�A�R�f
�5k�Y�$�5H��F–�8�
im�����Y#�6k�֦@�Z��Y��ͪo֭�f����&����,I4�h��MsAf�\�%� �?qA���/4�9b�v܈q�?E]��;�x���'�/
�]���󸕉�k�
o��~�[_���
+A�_`���	b�n��V2�2r�1��^g��k�܈�cVLh��G��B�M��/�HN��y�ޣՇ&�8���}N8९;�+=���%�ݰP$�7�~�\m��䬍�~�٪�\��%o\zʍ������jw��(/0�b�`2�+��c�d������W�|�r������*��gύ7b��q-cV$�yA��8��}�7.��>��
SI�}y�
[����XRa�x��?����н�c�M瞕^�j����X�ڤ%(e��&��M��c�>z�w��8f��
��)Q3Qw�kN
u��M�
��s�����F�B]2{��]6�Ҭ�
_�b��iKnX���'ѷT��O6�:jx~9����/�����v�w��Q�Ι>���[�9�7�]�x���Ғә�,��� G�3���J,Y�����^�Әm�8���W~Oy�����hn��^�
�KC��綵���zP
~�V��
��
"��I	2>c�+)+��6q��s���׾7g��G����a�nz[|{�Y97u���tL�~&[�a����
1M��V�m섃G��m_?#��
��5����0��s�m�S�;hE�Z��Z��V�"
��((�̸K�8
�
s>�FAd�ϸ�u�[�1fs�e.�e
!ƹE��l�?&�X[���V�dq�K�?���;�����=��?z���$����$��jed���~Qɧ<PA>���@Â}�d�a�����	���|��Tv�ɺo�� [...]
+."v�_��}T'=�U�+y��퍻��
�1�o�1����^�S��l�/w��E��
{�XL)�7�>��X�l9}�ZZ
�i
�*���C@�&���z�H�/d�����H%>V��>s-ەp�|𧖭m��ޢ�Wz~�*��R[GY���5�3^��F�iO
�`�HgSVUc�(lO�qS)T�
��
�����<�Ag��m*�Q��t�6d�^X���/�zu�A�B{Ŧ���k=���nXE����$�ָ\���_�_C���0,�Gb��e./��y�ij &�I�%3d��!fN^����)�{KfKM5iC���e�F����&'F}�e>k���0/���2�
���dYYQ��D��Y�_��=h��j��ʶ��l��Y��B\`�3Kj_�x����T9��
�
kE�8pl�d���
)'*	��x�{Ǘ��=�t�H�vKn}o���z��Q߷]�g:ư��־}���uom��n����/�Q�
��j�]lp�L)\K�
�k޴��~�L�����0��|Y�_�_|��7�߳�,��
�������7�F�P�t�^!�&�j	�r��+\}/U'q��t�S��w�Q_:��Ó:�c.xRVJ'�Q��V�':����@_U��:
����@V|�|��К��-�{*��3��Y�����i'2������6�™V�J��R���'h
Z˱���
�Qt^��B�̈�ds��TU���
Ru�T�����Cݒ�n��
A��㢕)s
+��Nw8����+_�N��
�J�Zي|��Z�|Y4�
��݀�
�l&�[:�OQrQ�N��]>C��<���������S$s�
������߅U��0��qX�ѭ���s�z��%��tv�T��K���)���� �xF�/�b��h�t�����.Qct����
�E�&                          ��	��P4��!<��[���
^$/� 
B�!_Z�t�(G�P^>BE��Rd,_K>1U?���`�q~dH|Fm0�����#qʌ:p��1u���c�eØ���L
���EȀ�Q	*�k#*Gk<cB��.�N޶��G�÷�ht�	
���WB-G�
'�˨�q�X��P���!R�O��N
���XBĎ/��!�*�Gv2�>G��6�S~�>*0���K��_��>}�:���t�>��	����GL	�ꟛ+��endstream
+endobj
+5116 0 obj
+20776
+endobj
+5105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 176.9598 192.5442 186.8875]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+5108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 95.221 191.7375 106.125]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_257775ae01cfcd011aca9bcbccb03da7) >>
+>> endobj
+5109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5097 0 obj <<
+/D [5095 0 R /XYZ 90 757.9346 null]
+>> endobj
+5098 0 obj <<
+/D [5095 0 R /XYZ 90 733.028 null]
+>> endobj
+5038 0 obj <<
+/D [5095 0 R /XYZ 90 703.2841 null]
+>> endobj
+5099 0 obj <<
+/D [5095 0 R /XYZ 90 688.7138 null]
+>> endobj
+5039 0 obj <<
+/D [5095 0 R /XYZ 90 655.2324 null]
+>> endobj
+5100 0 obj <<
+/D [5095 0 R /XYZ 90 640.6621 null]
+>> endobj
+5040 0 obj <<
+/D [5095 0 R /XYZ 90 605.4134 null]
+>> endobj
+5101 0 obj <<
+/D [5095 0 R /XYZ 90 590.8431 null]
+>> endobj
+5041 0 obj <<
+/D [5095 0 R /XYZ 90 541.8719 null]
+>> endobj
+5102 0 obj <<
+/D [5095 0 R /XYZ 90 527.3016 null]
+>> endobj
+5042 0 obj <<
+/D [5095 0 R /XYZ 90 492.0528 null]
+>> endobj
+5103 0 obj <<
+/D [5095 0 R /XYZ 90 477.4825 null]
+>> endobj
+1431 0 obj <<
+/D [5095 0 R /XYZ 90 379.0897 null]
+>> endobj
+182 0 obj <<
+/D [5095 0 R /XYZ 90 372.4895 null]
+>> endobj
+5104 0 obj <<
+/D [5095 0 R /XYZ 90 194.9574 null]
+>> endobj
+5106 0 obj <<
+/D [5095 0 R /XYZ 90 114.1949 null]
+>> endobj
+5107 0 obj <<
+/D [5095 0 R /XYZ 90 114.1949 null]
+>> endobj
+5094 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R /F74 482 0 R >>
+/XObject << /Im5 5093 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5119 0 obj <<
+/Length 3068      
+/Filter /FlateDecode
+>>
+stream
+x��\�s��_���4S���q�>4��4i�ל��f<<��q"Q
+I����]�
� ��<tn�,[���[����?�0x��B�q���n�����ҿ���ס�W�7o�*�� #�\�>�$A�����~I"t�&����ˬ�ew�W/��������Q|���������n��(��Ǻ�w�5x��6����w�C^��^��&�j)�Kb���on�r��L�����{�771���~��C�N��e{����^O�F��)p,�fz�f
i	O�"�>�'5���׊2���ޯ�/4�Ur�WB
������s��=m��7��{O�f_�[����u�S��w���|wh���:���!T�"bi��Fc���t�E��~��
4H���`�� n]�"hl`
q��‹Y���R1�
OQ��±E��&�A��
���
��� �2���
�Mc|
�`�8�'u�R 
C�=r���qJ1�6#�g}��0�z����9Dsw��JY�o*�}k���@���@i��
J�:"��b�W_�Oy�Ң|��;�����@O�r{<Ec;N��*`$b�؈��7�� ���8��bH+���`�)�*��X:
+�'�8:�Bt�H�a"���`�t"�$DaL���x���~�
SX�'p��� ,ۘ�ф��<�ь�%��ج��e'6�Y:l��"��+zV�9!��)��(ʓy�#A8wy�>�`Ą�L
L ��fj�f$��X:5
+秆8:�Bt�H
�aj���a�tj�$5DaL�^�
j�P�/�T
+��P�C�0 �f�

RX��
��Xfpbֿ�S�����ɓ���!�<9�Q�"�HN(ϐRD$��Œ�
�&�
��9D����`(
+��]�t�5�ژ�p�^*�F�1�
O�
+
�Z���e�̉�PG$j�X״^�� ���ft�:+��OE�KGg�p~t����
�]�tĠKG�[: �Lr4f�+6���%��'�O�Z��C^e^���QhT�c�R)�ܒm4��"HE.v��O���(
��E\w��J�`
^۽�a
���_5k�,�K?N̢�S]��./�m3-m��NHP���5�]ޱ������	)P8?!������/��u�/��!��T	��8)�7�S��2I�Nn��>d�}z���a��6�"@�^*�
+
+U�p"݂��}s.9�]���C�PG�<^�B�.o��r�=��A�������}׺Z?��h�����VWN�E`_k��-Žk0;ѩr蒕�i>�UJ����\g��5E�HuErse
)��bIr�
+��Rv
mv?��ۉ]��	�zd�<!�|
+�D�E�)��`
+6�]Q��n�#J�;�K%�P*tWj4	� ��s>��/*b��BVN	�l�-�cH���b�A��	~��~��
o�`*��J��:���k����O.���m��6��@q{Z}�
_w�ބnK�kf (D4O5�N*��u1�G�z�F?�dz��4�0��r`8��^<a����m�U�X,���	%�
+`�0l��D�̉�4B�,z:b�vb
�w{{x����f��h�
Ey�LJj��r���N��=���i*܋`�
-�;���3
"
B�_�a�V+��żX�c���v
�v�4ھ�g	�m�/뼚�gBA��Ib�N*eYh
�
��\�L�=�T�b8�����)4���L&bR[�R	�c�)
Z��B3菌ƳN�C
����,���A1:$.�P����Y���i���}��H
k�$+����ڿw��tEV��4o�|�}̫!�S���uR�X����g�!��
C^�؜A��4I
�{�t:
��aܮO���h�1�{Aˑ@0�kt���$tv�->t'�2,)�C�_�`0nwfgm�*b�����m0���i�]���E��k6
+
���Y/��Wcl̢����YwE�m�O��("�zL�'m/
�0��&����cQN�88L�96r'�j$��Ё�_AV{!��Y���]��`��qݮb���+5��^>�f�w*~���&�Є�
��R	� 3m��8�����:eo�n����B+�c�l�f��bg��,��/Q
��.��
���C�.P��F-� �z.�܂��u�t��w�B�%��<2�?�=du��u^N�%��,�!�L���_������KcD�2@��$Fz������0�	c�yS�J�ZaRIߋ%�~�0��v]�ؽ,����Xk[���[��/>�^(eSCvJ��~� 
F��Y�Z�#� x���41�Sb�Is�����O�꽐��ʈ$�µ�J��h�ӝS��5�nkH�L��N,��@a��q����hc6�{Ac�@0��^t�vb�CXK�踝Tʪ ��+C���D�ċY�B
1�;�v��S����?�v
���P%s���UE淇��J����"; [...]
+�z�}f��?;w����޿��<
���=u�堖\���~��5���k3�<u?‹��(�O�8:O���ԏ }=��H=�C��V��P���
`�j����^{�
k�PL����i$٬�7P�/u������l#�h��S�ތ�Z�ߎ�T!��5�;�-j���N*M�u�Z8n�:0�<�
���6a������~��0=��jz/�0+R����������酸�p�N<a~���O1D
+��#�
�2���ef�1����
uIJ���><g��d} m�ݯ��g&�E���'!A at q�

��58��9_( ^��d�a���Q������F��AA
���`���u{E�.ٿo7:�]���}�E�k��/����w+!����Ϭ|rU���g�*�^n� T|�r�l���>�����B<��Kݻ?.ܫo�E|��:x���
y��=]k�û�o���ѦFOeq�PѼ=
�oǸ������C\����&X��PuH�� �CpiЯ���
���r�����?0U�endstream
+endobj
+5118 0 obj <<
+/Type /Page
+/Contents 5119 0 R
+/Resources 5117 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5076 0 R
+/Annots [ 5122 0 R 5123 0 R 5125 0 R 5126 0 R 5128 0 R 5129 0 R 5131 0 R 5133 0 R 5134 0 R 5135 0 R 5137 0 R 5138 0 R 5140 0 R 5142 0 R 5144 0 R 5145 0 R 5147 0 R 5149 0 R 5150 0 R 5151 0 R 5153 0 R 5154 0 R 5156 0 R 5158 0 R 5159 0 R 5161 0 R 5162 0 R 5164 0 R 5165 0 R 5166 0 R ]
+>> endobj
+5122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 696.3132 191.7375 707.2172]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_50423c4391d0c3064787f19661914973) >>
+>> endobj
+5123 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.0746 696.3132 262.5809 707.2172]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.0816 191.7375 668.9856]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_61e02a6ed1b9dd0d6d306d76f5da55a2) >>
+>> endobj
+5126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.0746 658.0816 303.5272 668.9856]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+5128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 619.85 191.7375 630.7539]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_92333180e0163e9c87f2220dceef012d) >>
+>> endobj
+5129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.0746 619.85 296.9017 630.7539]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 581.6184 199.4862 592.5223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_964e4bcbbfde58f43977d0a8e686ec35) >>
+>> endobj
+5133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 543.3867 191.7375 554.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [202.4771 543.3867 243.2836 554.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_dfa7b03e2ac3a6666a7538431f1bdee9) >>
+>> endobj
+5135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.6208 543.3867 348.4479 554.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 505.1551 179.5535 516.059]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 505.1551 250.6661 516.059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_809a4546135123a08f12c0a65fb22241) >>
+>> endobj
+5140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 466.9235 225.2114 477.8274]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_6aec148aa41935a4072c64a43c51c577) >>
+>> endobj
+5142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 429.0654 155.2649 439.5958]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_3410a53827de9155ac7d6cbd84263364) >>
+>> endobj
+5144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 390.8338 158.0444 401.3641]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_8388d0d6d7ff68c627d516ec17f56b4c) >>
+>> endobj
+5145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.3815 390.8338 228.8878 401.3641]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 352.2286 161.0133 363.1325]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_314eb5fed86c6bbe4a7223ca8362f0a9) >>
+>> endobj
+5149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 313.9969 195.1648 324.9009]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1097cf7cb41f29a02ba271abd2f00f5e) >>
+>> endobj
+5150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.181 299.6875 225.8508 309.5928]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+5151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.1476 288.7286 227.8174 298.6339]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+5153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 265.18 187.5633 275.7103]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_cd7d1ed2a688f0c6af96e1cff336f933) >>
+>> endobj
+5154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4816 250.497 271.1514 260.4022]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+5156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 226.9484 150.493 237.4787]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_d350b84c25b7c37693d2e7a08d3165ca) >>
+>> endobj
+5158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 188.3431 191.7178 199.2471]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 188.3431 288.8524 199.2471]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_2b451e6b09162c7c19b0a2ad36545c69) >>
+>> endobj
+5161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 150.1115 191.7178 161.0154]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 150.1115 303.0791 161.0154]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_78a4d5f5e4702a16d6aae656293ec7ad) >>
+>> endobj
+5164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 111.8799 156.2812 122.7838]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_c92d2324f8ddea454926272e5ccc6dad) >>
+>> endobj
+5165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 111.8799 237.924 122.7838]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5120 0 obj <<
+/D [5118 0 R /XYZ 90 757.9346 null]
+>> endobj
+5121 0 obj <<
+/D [5118 0 R /XYZ 90 715.0952 null]
+>> endobj
+5124 0 obj <<
+/D [5118 0 R /XYZ 90 676.8636 null]
+>> endobj
+5127 0 obj <<
+/D [5118 0 R /XYZ 90 638.632 null]
+>> endobj
+5130 0 obj <<
+/D [5118 0 R /XYZ 90 600.4003 null]
+>> endobj
+5132 0 obj <<
+/D [5118 0 R /XYZ 90 562.1687 null]
+>> endobj
+5136 0 obj <<
+/D [5118 0 R /XYZ 90 523.9371 null]
+>> endobj
+5139 0 obj <<
+/D [5118 0 R /XYZ 90 485.7054 null]
+>> endobj
+5141 0 obj <<
+/D [5118 0 R /XYZ 90 447.4738 null]
+>> endobj
+5143 0 obj <<
+/D [5118 0 R /XYZ 90 409.2422 null]
+>> endobj
+5146 0 obj <<
+/D [5118 0 R /XYZ 90 371.0106 null]
+>> endobj
+5148 0 obj <<
+/D [5118 0 R /XYZ 90 332.7789 null]
+>> endobj
+5152 0 obj <<
+/D [5118 0 R /XYZ 90 283.5884 null]
+>> endobj
+5155 0 obj <<
+/D [5118 0 R /XYZ 90 245.3568 null]
+>> endobj
+5157 0 obj <<
+/D [5118 0 R /XYZ 90 207.1251 null]
+>> endobj
+5160 0 obj <<
+/D [5118 0 R /XYZ 90 168.8935 null]
+>> endobj
+5163 0 obj <<
+/D [5118 0 R /XYZ 90 130.6619 null]
+>> endobj
+5117 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5169 0 obj <<
+/Length 2639      
+/Filter /FlateDecode
+>>
+stream
+xڵZ[�۶~�_�'W��`\	`�<��t�6�koۇ$�Õ�6S�BRYo~}�	����x�?�����\ ��d��B
+�4��b�������_nH�x
��>��w7����B#��lq��J�������%!��՚`��oV/�j�߿YQ�<�?�*��{�P������C�Tyyh��=�M�_����/wy]�˷�cQ��Z�Ma�R�-��ᄑ���g�
D���?�|�#^la@��`Ĵ�'���hM�N���ݼ��W/�>h_��� ��P�p&Xk�wMޔ;�7燝����?����o·MS�1���1����� -
A=:g�3�/r
�(c]�[XG5���^‘�Y6�[[c�53�8�z��<��w��>�Oq��r_
j��}�|*�\(�K���(�K���#���%x���}��>��g
����p�)�Q)Z"E�h�~����D$��L	�E6��d�P`u�iW�
a��־����
��3�TÔhuQex�-�su��D�`�r��Hk={y1a{���
+aLF�����`
H5�m�[��߈�eDȨy�=*��q�Y!ِ�&��!?lw�a�fgYr�y)>}���dB�d>�e&�p�#q��%�/0�z]
譽��K���m�C@�aT�x�G5�O1
+�F�l�|W�D4�b�s�
���Dj�G�
+<C��EA“
fx����8PlL�1��
��twJQ��J������s�����}����
׸{�Q �:
��iwWɌ�=
*�]c40�U�%��E��Ɉy��^߬��@��]�
I�����B1��� �aI�F�=����@������4�|Db��
>E'�{�"�e���M�@	
+���K>�ȫ@��H �k-��S��F��Eu4e�}�?5�A�D��b4�=*��Q`@�
�bb͋L!��xɚ�eD�|�/����~W4�ܭ����W��?
v�a_n�2���:|b�ܰ ����6��N�c���9�3[�B����G%؅�
����8�z�S[	�I����UY
�S�3�
1|/�c��C�CoD�y�J���)}8
w��@�`5T���	�c�F��TTys�>�< !5�,��܁��8�����ᓙ�b�E�ؕ���q�T��M�A7�� 8R�
��%T��C�1�W�ɶT+��ǯ���'����m�8t���6�Aqհ�ᚋ�
�c��+�{Q剈d��
p��$�X�$2PapMu.,h���Xw���{9l���^��P�ٳ����8!_���#Y�
+!”��<'�T+&��8�����ԹG�����K�+_���2&S_�R�ݰ]�ۉ���A2 ��K���cӏ8o���ݏy�]
��ý�u��t�)��L
wL��&IN=,���/�)��姁޺���
�Z)�z��
�
��4��çr��eg*+/�0D�p���gAT�F��q{��=J%Ojd/�^6�cўA�
��{|�a(��ފi������zT�7[�Z���զ��~�0�J뗄_F$��0C���t�ּq��D7�F���Y�[��z+̤�R�®�g{d"bx�X����o��cF(��#�e
>�"��ƭ��(�+
)�Ā�
*�J���&�{�P
�A׎��S
�mQ�:n{}��8 HX'2#q��C�dj� C���
��f9w�3Q�O�Ιhm(�}mZ%���w!l�p��(=��,��CJ�Z���<�P�!J�t�� �Q�_tD�ˈ�Ok��O�Ɲ>LԷ�J�.?�Y�~�Kt$�+ĉr5�|�%
+1J^��˘�:!�#B3u����s���&/w����7Uyj�c�x�E�Ou|�j�ֿ���y������/�
�"���OŦ��_[��E��
�@��-@�
tÉ ��k���08�{�&�Y�z�!����P	T��hF�$���#�z{{6��m�4��%*P{��{��)�bdm;��L�q(
�M��}�ؗ54x��D� L�t��C%���*]3�-���0��Բ<�E��mW�}3���on�۩1f�0O+��e�G��
ݛ�A���9���&ߵ͵�u�ӹ��!����k��뻝
�܍��y;��Ҁ�i��6�[�}Ӹ-ڣ����g{�_L
+:V��A�SP6%a�1�Y;�H <H�f�
�H2�/�2���NL�'�� �jÑ�P|����;|+�ڹ��a����^JD�{��a�%
+?�H�gÝ�WH�b;!��R2ˆ;!!3�wcy<�vGC���
Rka�uڼ2X_s�ў�]�6�ȅ��
+[_KD��.R
��t�[�3HAM��
���
+
��bkJLz줓��_L��
h�œ��2��-4�9�k�&֒d�|1�����g���
�;絗y�O�6�m���4/�r�u|U�v?TUQ���m/�9��|��S^�LRзu.��+�P�H�9��;�M�f��������L��`�S�(	1}��A�D��oK�g�"=���2
��`��꼻u%���Jq{�o�2X	����pλPe
�F���)
Pŧ��Ҭ���Q|W��EB���
�d��o���*��[՗!r��?4����맧'����P�*T6�O���M��s�b���A���9,�L�c�ˣ�G���Y�G�h'����T���
 endstream
+endobj
+5168 0 obj <<
+/Type /Page
+/Contents 5169 0 R
+/Resources 5167 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5076 0 R
+/Annots [ 5173 0 R 5174 0 R 5175 0 R 5177 0 R 5179 0 R 5181 0 R 5182 0 R 5183 0 R 5185 0 R 5186 0 R 5187 0 R 5189 0 R 5190 0 R 5191 0 R 5192 0 R 5193 0 R 5194 0 R 5196 0 R 5197 0 R 5198 0 R ]
+>> endobj
+5173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 697.2473 203.0748 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 697.2473 296.3242 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_c3223cf8c7d19b02b5e3c04038024b47) >>
+>> endobj
+5175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 682.6265 346.6119 692.5318]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 658.7666 194.2975 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_70e9ad42674d62ed9bd73268e3af7064) >>
+>> endobj
+5179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 619.9123 188.7586 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_ea9a4fb9807eb61cda3eedf8e5a7acae) >>
+>> endobj
+5181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 580.6844 238.7802 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.5198 580.6844 319.0285 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_6293b813e42a59a9795cafe0efa762cc) >>
+>> endobj
+5183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [290.9649 566.0636 397.522 575.9689]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d) >>
+>> endobj
+5185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 499.9219 180.5399 510.8258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_f882ff84afd3c2507e17ffa62ffd20a0) >>
+>> endobj
+5186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 499.9219 255.807 510.8258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+5187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.5401 499.9219 345.4701 510.8258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+5189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 391.8807 226.0342 402.7847]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_dd9738866968b13e938d5669dd94a55e) >>
+>> endobj
+5190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 391.8807 399.003 402.7847]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.3983 353.0264 171.7642 363.9304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_3badc2f43376aa26f481af4800a3515b) >>
+>> endobj
+5192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.0628 353.0264 379.9723 363.9304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 353.0264 513.9963 363.9304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 341.0713 227.1542 351.9752]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.363 241.0003 257.1901 251.9042]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 229.0451 132.51 239.949]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5170 0 obj <<
+/D [5168 0 R /XYZ 90 757.9346 null]
+>> endobj
+5171 0 obj <<
+/D [5168 0 R /XYZ 90 716.2211 null]
+>> endobj
+5172 0 obj <<
+/D [5168 0 R /XYZ 90 716.2211 null]
+>> endobj
+5176 0 obj <<
+/D [5168 0 R /XYZ 90 677.4863 null]
+>> endobj
+5178 0 obj <<
+/D [5168 0 R /XYZ 90 638.632 null]
+>> endobj
+5180 0 obj <<
+/D [5168 0 R /XYZ 90 599.7777 null]
+>> endobj
+5184 0 obj <<
+/D [5168 0 R /XYZ 90 518.8957 null]
+>> endobj
+5188 0 obj <<
+/D [5168 0 R /XYZ 90 438.1332 null]
+>> endobj
+5195 0 obj <<
+/D [5168 0 R /XYZ 90 303.7512 null]
+>> endobj
+5167 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R /F33 485 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5204 0 obj <<
+/Length 2376      
+/Filter /FlateDecode
+>>
+stream
+x��Y_�۶�O��C+M#
�����L�ƙI�Ƶ����H�-E�$eY���% �� ��<t<����bw�]��(�c3Mg���2�e�:{��o�[^��rL�����H�4��f��CĈ����7s��%���_.���&}�r��.�&o�w?�&mww��U�5iQu�^��lK����2m[;|e֦Y�dn�� [N�9�j������M�A�������[:��@?�P"t�f{���i�g�Ʌ�(o^��s�c�
!{HF	��d��$lQ�Q��$��
� 4R�h�xV�)C2
��l CK��Q��<<HXj"#�z�%E՚���*��R����Ka�}�gn���M�/�t�$�����*�hGM"�E��uq D<�
��n�����������N�h^���1igr��/�G��n��qɋ��ڢ���囹��aB��~��7mg��U�U*��Lg@�Vʢ�$�0/*Ԫ5�����G:�$�5X2��4I4�AX�ĀIc"c��Q� �đg�,$�	��k�Mcڭɺb���Â��)�H��)LE(K�Y8<�A�y���<�$�P*�� L&܆��Ͷt6��
 �u�չK0��	u�|�ͅ��y^Tv��w
��
b��:;[T��.-��0���ڿ}  �8�q��3���	�1��z���z
+Buo�J�VvИM�T�mv�?�6�C\����n�PΌ
�uSoN����86�
+��j$�\�J�R�OI�0�_I�٥d���g�/H�S���s8,C
>+;;/p�SAD��u�c���T�Oɓ�
�ⲿ����T�0>2����eY#`��0�չ[\a��+��Eu�"yT����7y��~���XW������cZ���
+�>��D+�H}�#"$����%�|�,�͡�3��W������Hvw��R
��'mL~h����9��g��.�����8y��S]���
�]����S��
9�TnM
+�v�A}����C^0�����]����$bg'���'�&u
|[��
&x��
+�&=�
�yUۉ�iҪ3���"юR��X�1� :d�0f�Ӭ
U���N��-v9x�����Qō��-L���h
��
+�
jX��
Я?��4i��5��uU:�A���zMh���]�!-M�_
+G�9�Ia܇����Vg
^�xՃ�iQ�+[M�v����%��(�����z�E����L	�7���<:	��E�ʮ5�nr���B���%�D�bm�b�K���<` f��3n4�w۲��Ή�KX�
Ux�+�Y��PQ4:b�U�%wi����6+��ݢ�2b=4A��9�A��8���P�R��ة���m��.��-
~��UY74
+��
t]�O9��Bj6�O������]p[Įn�?��h����s��c��%��
Mǣ�A�d��c��}���j�|iZB��<*Aa��{a�6G3��I J
ћuo���� ��(lFF\ڂ��v
4x眅 2�
�]�3�p�����5R�q��vX$(� >�L�=a�@.K�Z��&���I&�Y��n�h�<WWĦ
&�G%15�k����*Il�8�z.�
��p��=8���>I�N�^7�

�~8,�4��ԁ�K_BG_o���U�y��h�����cݺSgikZ�� }٧X�y��A29�2V$J��f�uZ�����8�/Z߼c��<�������礶���jH��;]�������D,s��~PP���{�ٳ�
�%�@�����B
���6�]@�+y�9

+U�t�k�T� �I �f^Z����zց���R���̛Ʀ�P��
D���u�mw�4�/�{�9[���):�Q
|�c�d�q��I�OB���V�����6��J	��l;��(��_���C%��]�[��q]�PI��ᵫ
�/lJ��q�M�
�йbF�W���w|)�i_Z��/��y��6�ud}��A�`s����^�0�:��
z*��4L�r�W!0�`aA����c��H)��>����K^�qo)���`�Q
�_�1ai�!�"�rj��~i"Y@#&�x�|��R>�ȿ��%S
�d>���ɠV-~��O��o\��ػ윽���3G��_
+އ���`x�'U�{.i���o���;;����-�P�^o/�,X�7���4��p���z�m�:
+Z��K�2��y�
��W�
DO���iM�n�%y|
��A�D�'8<a����oZ���z
���
�FJL��%�Q�9��Ag?
��ǿ���3^3.~I�]Z
�P|�T�����I
�1���	��
+ꆉ���g~���a�
���6u<�_<�c�m�no��=�Z���mC��<w{���"!׼�
��t��_RN��&]�mj_XLnzL�=�+T��`�endstream
+endobj
+5203 0 obj <<
+/Type /Page
+/Contents 5204 0 R
+/Resources 5202 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5076 0 R
+/Annots [ 5210 0 R ]
+>> endobj
+5210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5205 0 obj <<
+/D [5203 0 R /XYZ 90 757.9346 null]
+>> endobj
+5206 0 obj <<
+/D [5203 0 R /XYZ 90 372.2993 null]
+>> endobj
+5199 0 obj <<
+/D [5203 0 R /XYZ 90 349.9875 null]
+>> endobj
+5207 0 obj <<
+/D [5203 0 R /XYZ 90 349.9875 null]
+>> endobj
+5200 0 obj <<
+/D [5203 0 R /XYZ 170.2884 285.2788 null]
+>> endobj
+5208 0 obj <<
+/D [5203 0 R /XYZ 90 270.9678 null]
+>> endobj
+5201 0 obj <<
+/D [5203 0 R /XYZ 108.6898 194.3387 null]
+>> endobj
+5209 0 obj <<
+/D [5203 0 R /XYZ 90 178.7426 null]
+>> endobj
+1432 0 obj <<
+/D [5203 0 R /XYZ 90 83.3102 null]
+>> endobj
+5202 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F8 568 0 R /F33 485 0 R /F7 574 0 R /F74 482 0 R /F97 1774 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5213 0 obj <<
+/Length 2232      
+/Filter /FlateDecode
+>>
+stream
+x��Zk���>��A��F`ߤ�i6[4M����S,4�fG�-;�����\J�L=Lz�o�Ům�����s"�a�Kf	�)�P¸���Wx�	.����K������~'�,A��rv��X�	J��n��D�bI0�����ܦo�w���l]���˴|���vWTu��E���sUgۛ����1��2�w�bI��I����>{����Xe�%��I"��}��]�m�`������<[C���ˆ%Z̞�F$I�l{�)s?6W����io4L�G6��B"u	�
a)ث$�s�d�B��&3��
�#
%\�ƹ�;�\���]��
�
1���o�6��.�-�������+i�Q5aZ�C���ZQ�֯T�_�QHR��_��jsX�	�!�h���	[
+)������8a�	���kǧ�2Q�* )��k����M�j�c��wmw(Vu���$Q�����
z�B�D�i~�c�7�b�`x��B
9J41	l�+�'{�! �RF�s�^t��	�	���t�X
+�G�Az���S��t&�wǓ�G$T�.Eð�4����o�	K񙆰$o¢	��գ+���!=lj�*+�"B�
��VK�4Q/���`!9� �9(�a�`�r�7x1#�9\/�39���`$��~z��M^oƵ���$q-�E$�l�H�`&��S�u^��b�?/ϧ+�����W�+ �I����g�r���b����0�Cr3�i;NE(�`�b0h�ڲ�P�
*�C�~�]%P0�^�أ�a-��3y�5���W�%OR��/;X����q�
*��1��wR�F�h�88�t8|,��]�n��f�Q�`*
*��t\QE�p�^s���?��߷�k&�U�*�Ya#7Y4�4Z
�7M at _^�"����b��p�xExC��U�����cXq
+�{���
+p�X#�&��zo,��,'I$�nꏙ���?� ���[x��Ъ_�� �1�X��N1�ðr�"�����C��+��w���u�a�O�H	<!%p�v$l�n���l�H^(	��DN��>�$�0�*�E��h.�A��
xN#j�{=G
���Vϕ�PӏJ0pݟ�vB��{�Ĉ��0���#-Z�I�@R�d���/�: V8S��t�ph�c��_ �l�%�"�l�D��L�/�y[�+;!�z;UU���Se
+M���
�I�V�`Q
�
� ��)A��˦��@Θ*GB��k���se����t��w
+
3{��~�,���/��o#@��l϶�����M�b�^���L0D��B�EU�OW�
�ѽ_
�gT�CF��������~h����f���"Z�p�E���С"�)�c>H�!?
�A�S����"�{6B�w���

����V ���|��q�x�0rF8d� <X� |����f<!f�������"��m����
+�d���cf�
�~�I|vD�Dˋ�
+}��`�
��P���7�G<,| ��N-��`_@����#���3��7�bmK���-s�վv��
�
+i*�`%;�#��{�Y?�U4�l��\9!n��<ażt�ڴFZ���A.�U�9�
T	��b��
TR$��.���6tȰ6���6������
m�D0��k�o��
Ps�!�~��y
Q�
��9��D
+�\$
���48��p�4�!~���
S}Z"̳���_z&&�
Q
3s"�;Y��=[�6��|���ͪU���!���l�Տ�
�|3NFVe��+ʣb��K��)�
�=c./��Џe�K�@h�L�CQ~�]�����2]d�ջ�s_���1�\�2K�˶~��t�ʪ��L��
�o��w���s���t�f�
i?7�
>������=�5
ǜ,
f�9zv
�AFB&v���?�j\�����
�:�
�
h��%�AX1[PN	�˒�~K��M6f<������5�<�B
+T�h͸�{�����lv
*�Oy�ɕ���ܗ�N��{"R�V
�͆���=��g�����1�ZD8y�?NH�;A�Bn&�	��
6���`H'/:��
NӐդ�L �VL[�� zɾm������;����������O
!�6�?��!ݴ�ͤ��met����}�Qef�����lD.���\�~�ڻ���o��6�K��k�Ȯi�c]�o�����ЪB�"ߗ(������Hf@�
+��@�-;�(�^�96�Ѱ������t��.nS3��)���w��Mendstream
+endobj
+5212 0 obj <<
+/Type /Page
+/Contents 5213 0 R
+/Resources 5211 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5242 0 R
+/Annots [ 5217 0 R 5219 0 R 5221 0 R 5223 0 R 5225 0 R 5226 0 R 5228 0 R 5229 0 R 5231 0 R 5233 0 R 5235 0 R 5237 0 R 5239 0 R 5240 0 R 5241 0 R ]
+>> endobj
+5217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 609.505 170.6866 620.0354]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_641015af4c3d3b84184e8ca8dd128b10) >>
+>> endobj
+5219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 570.2771 170.6866 581.1811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_f3c5bf7dd0135194b6c180dcb232ef54) >>
+>> endobj
+5221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 531.7964 178.4354 542.3268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_fc81dafc5cf15ca9acd8f6a03f66c788) >>
+>> endobj
+5223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 492.5685 222.2328 503.4725]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_a02f5903786b4da29daecddcb0db6cbf) >>
+>> endobj
+5225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 453.7142 180.9381 464.6182]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6777 453.7142 231.8468 464.6182]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_311a973ff993328d8cb3627f3af31129) >>
+>> endobj
+5228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 414.8599 180.9381 425.7639]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.9082 414.8599 239.04 425.7639]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_3e8a8932563dfdc292fde93931f0bf2e) >>
+>> endobj
+5231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 376.0056 227.8516 386.9096]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_4fa3c4bbfb1c6905d95c08c2d90af526) >>
+>> endobj
+5233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 337.1513 217.6102 348.0553]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_b404db5180176140a7600b31616f9a07) >>
+>> endobj
+5235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 298.2971 180.5399 309.201]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_6ba82ff86685d87dd34f4d441a7d769b) >>
+>> endobj
+5237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 259.4428 178.2386 270.3467]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_d8c2dc06b66e812182f2b1445940e7ff) >>
+>> endobj
+5239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.2264 159.3717 156.0026 170.2757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >>
+>> endobj
+5240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.1692 159.3717 513.9963 170.2757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5214 0 obj <<
+/D [5212 0 R /XYZ 90 757.9346 null]
+>> endobj
+186 0 obj <<
+/D [5212 0 R /XYZ 90 733.028 null]
+>> endobj
+5215 0 obj <<
+/D [5212 0 R /XYZ 90 628.1053 null]
+>> endobj
+5216 0 obj <<
+/D [5212 0 R /XYZ 90 628.1053 null]
+>> endobj
+5218 0 obj <<
+/D [5212 0 R /XYZ 90 589.3704 null]
+>> endobj
+5220 0 obj <<
+/D [5212 0 R /XYZ 90 550.5161 null]
+>> endobj
+5222 0 obj <<
+/D [5212 0 R /XYZ 90 511.6618 null]
+>> endobj
+5224 0 obj <<
+/D [5212 0 R /XYZ 90 472.8076 null]
+>> endobj
+5227 0 obj <<
+/D [5212 0 R /XYZ 90 433.9533 null]
+>> endobj
+5230 0 obj <<
+/D [5212 0 R /XYZ 90 395.099 null]
+>> endobj
+5232 0 obj <<
+/D [5212 0 R /XYZ 90 356.2447 null]
+>> endobj
+5234 0 obj <<
+/D [5212 0 R /XYZ 90 317.3904 null]
+>> endobj
+5236 0 obj <<
+/D [5212 0 R /XYZ 90 278.5361 null]
+>> endobj
+5238 0 obj <<
+/D [5212 0 R /XYZ 90 222.1227 null]
+>> endobj
+5211 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5245 0 obj <<
+/Length 2578      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�۸����E���;s�Nj�h�͡��!M���`���X�-�d9����M�^,'�CQ
+Q��3t�
�d��
+e���jw�ga��+>/��2�����K)f�$���N�$HPBgw�sB�%��_-���.���x^m�6f]��/
�~��yQ���΋�9ܿ6��)�r���뗄$F�`�
%�)k���A0�,�A�|�XR��tD
#HS,��/j{����n�ѹ��yc��k���
��\��bxN2eU^��2�,�$Ɵ�޾dz5���F,�b�/�,����,�l��\����?�	c�ŭ�R�ْq�%LO��S���Ŕ!,?m����+L
D!����b��ݻ�R�>�����ӡ1�o���������o������?yf����
��CU�)Vh���Ʃ�/S�M-:�V�`>e��� ��Hm���\�'����T�oZ;-|����J:K )#�w�Tǀ�������6v�k'�{��#�)�%�E;����g>fMbv�2��5L!Ҩ7|�	a��Vǝ)�ܥ�r(ۇfS��^�"��%ox�hJ��Y��u��SMT��V
*�E���Øn��H.HN���,�$�]8 [...]
+q, ���f�^
��ʯ�G�{0a�/���0��<�HJ��\���ڊ]��)��W�X �7;R
�^�i
���wQ�����K݅
+��io�Q�k���N�!P
+Ig\8��L$mRD����m�Lu8��i�Kr����'S�?̇��
i�t�2�2Gg�U�@�/��Eg�v2��D(�4�.����@LN�
�!����X�Xl�b3BD���@���u�	��1�����4Q�Y�����C��J߬��=�б���-����D`*���`��������ѐ�x�
9#݉��Q�Y�eOcM�4���()$/W��%�V��_�]��)�b��>���������휙�ԡiu�H�oM��Xp�׫���ʹGZ5�#
�����c�s��h����w�b*�
��ǚjbQ2��I,Sc��~�kΐߗsk�-�xjs1T��캠W����2�_��f�a�ZbXy��;�[^?z<��CM��`2/�"od
TY���Q-1P|G�k~�[�e:a�hz]Ik��k�j�}��a�-$=��U�Mt]��Q�C
N4�`ǟ�?TV,�@�q at x�>t��v��NT&�%ak�m�˶�6�j㟪��XU�}UB��E
��'\�Sݛ�F�w�	OX4�X;��s�0B_AQ�}t�aZ��/�3�C [...]
+�
��#:!F3��ܚ�S�˔^'N,$�y[�ۢ4��؟J����˶uaBZޝҲ��=ί��J����M^�Y?��`�Gc�^R���
,��z�+�bW�ǕR%��烻o��
�:�Iސ4[c3}M*(���nt�(��b����.��\C�\%e�ݞЛ���
+ ��m�h��4-���'�(=��	JCO3�(��W�2� �F�q
�4Qr��A��!��m�$
$�~��%�k�J��1�5L�
���	�ei8��r�B���;�S\�nF���|k_�M��3x�"�T�Ao��ȍ���}`�*(��7�]*��s
+���c�_?'��e at -^�5�&8
e�fU��.��RHR� ���]�t�/y;>
�����ێ�K�;Y��*��U
�Cx����K�����5,Ϯ��K�in���}�w���څe���Tw}4]�0�~�dg�Y3
�H�F9Wc�$�	�̀s��K�u_&�#�_����z�2Fi�$4p
��~/
+]0��Xg�y�F�|��[^Im(
�����g�lK
���履^
+s8��	g+>���VW���_��f�fO��
+M�fP�0E���suY
����)�܃���o�&
wV�#u(�)fz�9�V���p�Fn��s�
�"��(���q��H��#�[
"��/P�9n}�

�F 
��12ތE�e"4�L����)w}�bkh�p(�Sn�W=��o2f�܏�d�G����@��N�tL�j��,8��Vh`��1��Jث����mCe��t���;�����ժȐl�_`��ꓯ�G
�'^A�u��e
�Ƣ��C����kl��k���?���B�y(��ˣ-(bS�ɪ��hKop�kC�ml}��ƌ\n(ih�:(����ŧ��$&,��Y��<�k�i�������#Z
б,�5*���~{���c�����-[��/
�9��:�
_�fdW�a;�Җf���� ���]
�xendstream
+endobj
+5244 0 obj <<
+/Type /Page
+/Contents 5245 0 R
+/Resources 5243 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5242 0 R
+/Annots [ 5249 0 R 5250 0 R 5252 0 R 5255 0 R 5259 0 R 5260 0 R 5261 0 R ]
+>> endobj
+5249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 493.8891 207.2293 504.4195]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction_87f25b7a2988f918a20b3d09047b08ab) >>
+>> endobj
+5250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 454.686 197.875 465.59]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction_383574ff4028da9048235b061a613b99) >>
+>> endobj
+5252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 442.1206 214.978 452.6509]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction_898fefd81641cf4f6b854e85412a415c) >>
+>> endobj
+5255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.6126 305.3953 397.0336 316.2992]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+5259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [159.512 141.8829 179.7659 152.7868]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+5260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.9769 141.8829 329.9069 152.7868]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+5261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5246 0 obj <<
+/D [5244 0 R /XYZ 90 757.9346 null]
+>> endobj
+1433 0 obj <<
+/D [5244 0 R /XYZ 90 631.5246 null]
+>> endobj
+190 0 obj <<
+/D [5244 0 R /XYZ 90 624.886 null]
+>> endobj
+5247 0 obj <<
+/D [5244 0 R /XYZ 90 512.477 null]
+>> endobj
+5248 0 obj <<
+/D [5244 0 R /XYZ 90 512.477 null]
+>> endobj
+5251 0 obj <<
+/D [5244 0 R /XYZ 90 458.6711 null]
+>> endobj
+5253 0 obj <<
+/D [5244 0 R /XYZ 90 404.4505 null]
+>> endobj
+5254 0 obj <<
+/D [5244 0 R /XYZ 90 342.0637 null]
+>> endobj
+5256 0 obj <<
+/D [5244 0 R /XYZ 90 279.8772 null]
+>> endobj
+5257 0 obj <<
+/D [5244 0 R /XYZ 90 257.5654 null]
+>> endobj
+5258 0 obj <<
+/D [5244 0 R /XYZ 90 257.5654 null]
+>> endobj
+5243 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F67 370 0 R /F52 345 0 R /F23 2436 0 R /F74 482 0 R /F25 348 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5264 0 obj <<
+/Length 2756      
+/Filter /FlateDecode
+>>
+stream
+x��[ko���_a���j�o�Ӣ@��)��Ӧ3)�aw(�2QG���������D�z�t�I?,���ѽW�<�����d��B	�4�r��]��g��������k�����R,4Ғ���]cA$(����KB�5�/�V/�r�\�(^��>ٖ����m�Ƿo�%uR��<���O��^�'�1Mq�0�8�b,���
��(�q�i�
+��!~��,��՚
+��^i�Lv�̄�|�1�K���I�����bItd�^|sݧ�˪`����|��Ox���~{�ӑX<����t�����ŧ���v��s��M�RE�5�(���
�`���2���}Cj5H�B�0��a&
[:~9H&���
��ԫEM�
+�z�I�����t�4���n?m�]���u�%�$�k����l�)$=R�����>�9l\�E��]Q��}ڵ����^�}���I	��,��}4�Ʋ�XQ�|L���W?bL���L��R�(b�$�\�L��D�#z�y�)�V����G���4�r�w����}�(`���״Û�I"�5���x�\C�Gd�
�P�A�F�0�C$�
�<�4�
}hl
�#��C�פ���2�w6�������~	\(����\�U]I:�TǪNv��Iy�d}���=]�C�3������|�
�s�,R:��Ի�@Ixu ��
�0�%�G��Z!N�h(N4o��!��&
���!veYw�����_���6�;����єoZM�a�`D��Iֺ k{X��^�O�
���
�m:I��>���L���H��0���
��Ň"��5%�'�t�@2,*�ZKD�F����g�&
+A�
�+sQa�������
�k�F"
Z�(y+4��-̄�1�e>��
�S�Fv��,izx1��3ۭ
Ǻ���/
��%V�Yf��X����m��㌅�9��q������(��_�/Bp4�{�#�`b�D�V7u��� 4�F��[Tȳ4�
��O
	Sñ�Pĵ�Hs)b�'<�H2[$���6�5�u��n�fP�����(��h����b�8�C!ae'P���88�O���
�Q��7��M���Π0_�u���[4��y���i�%�~_�d��ȺˇdSC�ܔ؄1$�6D�>�`��Z��:�%C�+�:
�;ɀ�XTPE
s
�;��:�J���
+�w?����mQ�0{Ǡ XJ�}q

+xVP�I2��3�"����cç�H�
T kG@��:���V@�|^@��$_A@�qT�
+�k�6����s�'
y�O�&�Q0��k�
�e�b���������'�������s(�`b�Y�I�JD��Iv�1K iV�#�z�Yh�f�G����Q���
��Fzn2,<�ت�a��0�"����f3`Q!�7��(o�gJ �i
+�*z��6<��~��t��-*�.=
g,	�L�Z�I�cP����W�<�(����aA�s
z$/��J���W�~ϐ�@�]�3T���Y�}0?�
ẓ&
+�A14tojzT 0�� �&9)�E9=7?=>��n@%H�(�g�G�3�#�x�:��:h�O8/�AdžO-������HjB=h���]����n�h����4r	4�����OK#���R
K�cp��."̆|Z�H��ᏮP7�]�+��M��'����d�&���0Z�"�i�‘j�(1��H-ni]�qv�ś�7��:��th!�7�u�
+b6O�WE�=~�H�d��Dű�
;����v�8X��,�6i�f_�)�^N�`���	]�2����O����qNz��H
}�!H@�	�Nf��a���@5GJE���
����!��
�;[|�>[�Z� �fu��Pl�a�`�"
Q�zݣ�0̑PL���|��J��q��pmxd���P&�wm��ylv�?��0�5kf�/��2B�z�
+�
+����
VǠgr��s���\
��1�
+D0�k"��w�\��@���ۢB^��i3U����
��Ѻ6|̵��P�}�1�X�T}uߒ8�F�zr�|��4�kKu����:��6ٞ��E0%�5�A�'f!b��3J�
 ����[��]+�3$P�A�8
�4G:x(��U�}\��E^��C
+c�ci�57����d0I��ٱ�@@TiH�F�b�3s�����xMۙ���M��Q��K�F%4Js���`_����RkpOtw���gM	��DA�{XC�f��`�*��|�]b�L��5<��F'�e�Z���~i��p����
}�ە�﹥$��f
��
b��^��J�?5�5
6JM�6<���]u�3�8iބq1�?S����l�f���
]3�n���>�2��%�W�i��2���>i7Ơ_�]���[���4�V-��N���޼��P�7��0T.۱����9_�X/F^n�*YgM���4��
�s��3V3�ZTڂm����u�,�*���a
'��ԥ��&0��ᝧ�E��{)��u(7�sh��a�ߵ%� )'W�!�Ҝ�x>� m��&V���0��SK��
+��QkozP ��
�� �7�jNs̩O���_��`�H!_t��=�
!C�0p�E��V� Gگ�(w���==�~�P��Q%�WB,���C�삒� �TRV��x�˄��\p/?%���
�d�����n���<�v�h�x���nSU��������#�T萧����~�]���Dψ����=h� �
S$�9������ L���
��5_0QGAfC�/%�zeendstream
+endobj
+5263 0 obj <<
+/Type /Page
+/Contents 5264 0 R
+/Resources 5262 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5242 0 R
+/Annots [ 5268 0 R 5270 0 R 5272 0 R 5274 0 R 5275 0 R 5277 0 R 5278 0 R 5280 0 R 5281 0 R 5283 0 R 5284 0 R 5286 0 R 5287 0 R 5290 0 R 5292 0 R 5293 0 R 5294 0 R ]
+>> endobj
+5268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.2424 536.084 194.7761 546.6144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6e192bab4a848124e98adc8e04f1b780) >>
+>> endobj
+5270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 496.8561 160.4653 507.7601]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_f724448826bbc00406f8f680b31fcaad) >>
+>> endobj
+5272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 447.4165 175.967 457.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_7698afbb74c4d9ef4a404fd200b9226c) >>
+>> endobj
+5274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 408.1886 204.7386 419.0926]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6a570635ea948e8b83a131c1433f558a) >>
+>> endobj
+5275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.0758 408.1886 283.3129 419.0926]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 369.3343 244.0907 380.2383]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_162dc548ba77c3b8b0c09b83740b0add) >>
+>> endobj
+5278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [271.4279 369.3343 322.665 380.2383]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 330.48 191.7178 341.384]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 330.48 288.8524 341.384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_68155a8dd4748908068c4f06816ced9e) >>
+>> endobj
+5283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 291.6257 191.7178 302.5297]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 291.6257 303.0791 302.5297]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_97f31ca582bbc0a736ce5f3167021638) >>
+>> endobj
+5286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 253.1451 150.493 263.6754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_766f30dae23752bf497bca855ef8b259) >>
+>> endobj
+5287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 213.9172 264.4243 224.8211]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_c7a892d14bca002fc1a03f9b8a950850) >>
+>> endobj
+5290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 137.1397 176.3319 148.0436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6d81efe6a6302e1b6296be157faeb73e) >>
+>> endobj
+5292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 89.319 176.3319 100.223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_8a354fa2b600043e51e8556864b69dbf) >>
+>> endobj
+5293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.669 89.319 281.4961 100.223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5265 0 obj <<
+/D [5263 0 R /XYZ 90 757.9346 null]
+>> endobj
+1434 0 obj <<
+/D [5263 0 R /XYZ 90 659.7569 null]
+>> endobj
+194 0 obj <<
+/D [5263 0 R /XYZ 90 653.1567 null]
+>> endobj
+5266 0 obj <<
+/D [5263 0 R /XYZ 90 552.7814 null]
+>> endobj
+5267 0 obj <<
+/D [5263 0 R /XYZ 90 552.7814 null]
+>> endobj
+5269 0 obj <<
+/D [5263 0 R /XYZ 90 515.9495 null]
+>> endobj
+5271 0 obj <<
+/D [5263 0 R /XYZ 90 466.1363 null]
+>> endobj
+5273 0 obj <<
+/D [5263 0 R /XYZ 90 427.282 null]
+>> endobj
+5276 0 obj <<
+/D [5263 0 R /XYZ 90 388.4277 null]
+>> endobj
+5279 0 obj <<
+/D [5263 0 R /XYZ 90 349.5734 null]
+>> endobj
+5282 0 obj <<
+/D [5263 0 R /XYZ 90 310.7191 null]
+>> endobj
+5285 0 obj <<
+/D [5263 0 R /XYZ 90 271.8648 null]
+>> endobj
+5288 0 obj <<
+/D [5263 0 R /XYZ 90 178.0313 null]
+>> endobj
+5289 0 obj <<
+/D [5263 0 R /XYZ 90 154.121 null]
+>> endobj
+5291 0 obj <<
+/D [5263 0 R /XYZ 90 106.4198 null]
+>> endobj
+5262 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F23 2436 0 R /F67 370 0 R /F74 482 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5298 0 obj <<
+/Length 2957      
+/Filter /FlateDecode
+>>
+stream
+x��\Ys�~ׯ`^
�j	�>\�T%�u*�8�X��G���a��}3 �����J���*{����h4�n\&
���
+���ns�'���/�{=����Ǜ��wRL
2����}%A$(�����SB�9�O�fO����Ռ��v��X,���[����o�)��~�*�b���w���DS�暃)V��jHC;��2�W�=RG�(��}VƟ֋�a6�Oof�N��nmͫ��P���Ӣ�����bJ��B/��	ns^L�_|�#�,���]`Č�'����N6�2�a}q}� �~Q���s�!�Ia�#-��=(�Z�s�����E�R��ˊO4�H�ډ�$��$����R���;���l΄�nw�9b�8n�o�;�Lom��V�塆
��a���I<�ۖ�c��Uy�A��ñ���ź�Ջ
+��Ϙ��ݶ\��'}��r�8�ua�~*ֶ�����m�&��{k�;'�.����g7*��HqL]��
jH�m)a���v�J�d�L�Q��
���(h�F	���ƀbt2��@�ї^�_D#�($)Փ �f�@�購�
l���h¼�����{�!��J�
��`
�Z�0Q	Ę�I��Ӯ�T��k��UඕS𸔂��� �3ft�V��-�'�I��!�6G+Dhǜ�/*g��D6mxs�p w����iʹ:��b	�
+�_I�ER�,%yI��,q����Y�CbSD�X���,	<����y��m�R	c�Jk,�pM���ǰTҌ�܌�t��Ƥ�P9�B"��l��'��'����""ENU��
�5��f���(��ʥ �?
+�IXwgF���Ga$��Q�6���Qذ
3\�_�!
+�rYn�j�|5��f�*�>-�P�m��� #^?'Jc�0
��-#�S((
0c��@�� s͡�@w� ���I�c�b[<�!�'�!�̶�}��� ��NeU0�i��q�R����������&��l7P��ߺ���S�
c�3C0�%�`�e�`Z�G����P���ᯖ
�܂a��T=<�=>gDG��ⴃ�����T.?�<~�PvR
�H@`�]P+�}�eˊ�+ ?�����
�2cJ}�E�
�Q�0�z� �P�I����,.�d���ìY���[1�$�!���s����J
�����q�WYS���&�
STQ�v������eW��ܶ,�e�
"�4�8�s��CU�L"`�ShM_�H�[�dң���K�cZ�c�Xg�
zGpcڂ�Tk¦(��H
�a�l�et`"T�p� R�\����xچ����C���r�l et+�Ή
�&�Ƹ�
&�e$�0��&�Q�b?��	-��үG�=��� �
%����>Lpi��<,�����z���)��z
���ȵV<���TQ�ʇ�
+����3*c�	��f'
2"��Ǻ#�sft��H��.��@�
c
���s��┉�X1��bE�BXѭ��/�X�ۈ�>�44\T�(��.�V��>���7��dq����"9��خ��
_zX�/#�)�L��|���eC��Lё[ml�; K��i�0�2튀�X�F�(����4E�I6��3�#7;���
+6i/TF=��Ŋ���
_”KH����HF�/=��ϗ�hĖ�L����g�ޕ�

v{�3� �<�/sʩ�ɇbvV��/�
�D�/r��+$>����ieG���,r��
���ߐd�JS�
� ��X`"od��P{u]��M7q�/1�JSw"q8|Ί��x˺����i�
�S
o
c����.
+���Y���G�kχ�x�{�\��=Lf���9�l�)�]�����;�&��Hq��{�
�e�3���"�i�~@�j�B����1��9
�9�f:�b@�J
/�
q���y��r�C��7��n��-�.�
s�!�p�!��n�uwiNkSM��8�j��nK�����cD_w���&:�� Jk��@
+��
+����o�xT�<cC[j��*
ʔd�(���A.U��ӥ0���Y
����{�K)�rT+>k�+e�y/�_ɐ�
+�[2t�[&�f�6L+
��)pS��)pƈ�\k��:ž�X!�9
����ni߶���K�Q���{|NGnn}Юk�_��TF�ݲ��
w�aN���7��_�y,#1�̚u���
��^T "`����^���F8_�J�XF�%�)��
�n�*���ބ�h3M�6J
�	c�s�Z�
�v���*��@�e׷zo��uG/���[z����,��m�(_w�� ��̴ߣr�5E�q�����S
Y���N��]�ك���2i/TW}��RGZto���{K
	i���2���Ut��S�1f�Ī���ûrs�!��aP�w��
ޟ��)		���>N��0)�8զB{�k
���M01���,^l�

ba+��?�ijr�N�pD�\�S�����VM��r��=�muI����M!�Jk��ظ�et*sp��u�g6nǤ;��>#�p�ӗ]ڲ97��<*��"q�ܕV�SW�4��JG$�����8m��'m)D��d�=(���M
o�,���#��i�2��
+f�$��\�@
խTՒ��d*{����;R�i
+�'=�1iG�%})	�NL�Q��HD"=yԯ�i	f=
����
uNQ0n!E���-��;W#�h�w}f�/�W#��g'g
bܼ0�߷Ǣ}�r��}�ػ�r{��_�a�{]�/��Ls�@�]D
+y���*aK�1
Z7+������7����V����s���������<��΄�
�
��X��օ���b�.��/�Q�ݾ��z����uQ�]��J�4�T��i��ڼ�[�`
��5�#�6��xܽ��|zzBwt*W�=Z
/w��e�.�- at U�X���Ա��~���WP;Ķ�o]�l�>�V%|��v�;��=���/��endstream
+endobj
+5297 0 obj <<
+/Type /Page
+/Contents 5298 0 R
+/Resources 5296 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5242 0 R
+/Annots [ 5301 0 R 5302 0 R 5304 0 R 5305 0 R 5307 0 R 5309 0 R 5310 0 R 5312 0 R 5313 0 R 5315 0 R 5316 0 R 5318 0 R 5319 0 R 5320 0 R 5322 0 R 5325 0 R 5326 0 R 5327 0 R 5329 0 R 5330 0 R 5332 0 R 5333 0 R 5334 0 R 5335 0 R 5336 0 R 5337 0 R 5339 0 R ]
+>> endobj
+5301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 686.0393 176.3319 696.9432]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_de012d0e50f285077169741e9940f414) >>
+>> endobj
+5302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.669 686.0393 288.1216 696.9432]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+5304 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 638.2186 176.3319 649.1225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_46a0e4adbfa5f07c11b1cefeaeab50a9) >>
+>> endobj
+5305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.669 638.2186 254.9062 649.1225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 601.7304 184.0806 612.2608]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_12f9c11414ff84c5f98e089fe1671e4b) >>
+>> endobj
+5309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 527.9417 229.5525 538.8456]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_947140ae6a3b18452b6e69dfcf3daf51) >>
+>> endobj
+5310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 527.9417 308.1268 538.8456]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 491.0799 196.3468 501.9838]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_b482b0092b8947168a9cc650e7f5a666) >>
+>> endobj
+5313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.684 491.0799 274.9211 501.9838]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 454.2181 220.038 465.1221]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_a894183e37c6f3614ed4938d94a3a7ee) >>
+>> endobj
+5316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.3751 454.2181 298.6123 465.1221]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 417.3564 224.0028 428.2603]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_a76dc794cd0a663bebbf8fc0d11d9714) >>
+>> endobj
+5319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 417.3564 302.5771 428.2603]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 403.7319 272.4902 413.6372]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+5322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.9052 380.8682 182.439 391.3985]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_81788a9e6af2cd17a632e4008b4b5634) >>
+>> endobj
+5325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 332.6739 176.3319 343.5779]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.0715 332.6739 227.878 343.5779]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_ebaa837f2ff5fafb87e1e9ceaa9ccfa1) >>
+>> endobj
+5327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.2152 332.6739 306.4523 343.5779]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 295.8122 167.4656 306.7161]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_d56183741949b698e9781549d3da5fa5) >>
+>> endobj
+5330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 295.8122 222.5184 306.7161]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 217.0422 180.5399 227.9461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6e1f5c74ae6b2a7fda7094889aa46300) >>
+>> endobj
+5333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 217.0422 259.1142 227.9461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.4044 217.0422 383.6415 227.9461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 178.1879 178.2386 189.0918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_c8977c97bf04a9145308585bf0f79110) >>
+>> endobj
+5336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 178.1879 256.8128 189.0918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [330.1031 178.1879 381.3402 189.0918]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5299 0 obj <<
+/D [5297 0 R /XYZ 90 757.9346 null]
+>> endobj
+5300 0 obj <<
+/D [5297 0 R /XYZ 90 703.1401 null]
+>> endobj
+5303 0 obj <<
+/D [5297 0 R /XYZ 90 655.3194 null]
+>> endobj
+5306 0 obj <<
+/D [5297 0 R /XYZ 90 618.4576 null]
+>> endobj
+5308 0 obj <<
+/D [5297 0 R /XYZ 90 543.0201 null]
+>> endobj
+5311 0 obj <<
+/D [5297 0 R /XYZ 90 508.1807 null]
+>> endobj
+5314 0 obj <<
+/D [5297 0 R /XYZ 90 471.3189 null]
+>> endobj
+5317 0 obj <<
+/D [5297 0 R /XYZ 90 434.4572 null]
+>> endobj
+5321 0 obj <<
+/D [5297 0 R /XYZ 90 397.5954 null]
+>> endobj
+5323 0 obj <<
+/D [5297 0 R /XYZ 90 360.7336 null]
+>> endobj
+5324 0 obj <<
+/D [5297 0 R /XYZ 90 347.9915 null]
+>> endobj
+5328 0 obj <<
+/D [5297 0 R /XYZ 90 312.913 null]
+>> endobj
+5331 0 obj <<
+/D [5297 0 R /XYZ 90 236.016 null]
+>> endobj
+5338 0 obj <<
+/D [5297 0 R /XYZ 90 116.3992 null]
+>> endobj
+5296 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5344 0 obj <<
+/Length 2150      
+/Filter /FlateDecode
+>>
+stream
+x��Z�o�����B��J�i�+����;4M\�C.i'�*I������c�%W�R7\��ٙ�y�ffWd��,
^*��a\.��^~���� ��
���	�t��~)�� #�\��k� A	]��ޮAD�7c�z�&x�����5ū��xgwE����C��77����4K*�~w���KBz�)�s�A��ECH'Qf:�Wo"\G�����<�|H�r���n׆���tp��߼�{[��^�l
_	�Ŋb�.�r���ZU0I����x�/w`��1���
0"���q�)�
�7�x>͋zA�9���q�%�<�=���{�	�]"��Ğ���'J�pO�**ز�p$�SE�B
)Lj����
�V��k'1�[@�\�0�	
~m�Ǔ͒c�..�� �� 0�@�#���md�h��v77yY696�F�R1�s�@p�
����Ҽ�[����D�5���O�H����>cV@�Z��PQ�3�L����z��(8IPpR��OX�;i�o󬬆j1�5R_j?O?���Sp B�"v�	������1�����CB���
y\��8�"�.���_FwG$��W�|�
a�O�>�z�/5(#y�
5+��D9��~_��&\��XՑLY���j�(V��e���B>~4���
+af@ӓ͂f��h��F at 3��� �Ou�Ow#q�$���
+
�j);�MA�E#�5t?�
�i�������C7uTs��B�C�d;
����ɋw���i0�[�H�^u76ۉ �1�w���Tc�B
q;
��Qq5��<P��
+L�~�f�;�@�\
��~�c��|�q*�"f��$�%���
�Yr���x��6}�����~�*�8Y����`�g��
��2Ց9�ޜ�6M�lَ���S���0��tʇc�����q�|}�`��gm��#:�	���idC�
� В�`wM�Ζ�"=Ui��a
+��0nH�������XN
o
+)��d�	8
+�$%OrۧI(10�j�Ѱt2ׯS"B��HN�>�v;�~h��-�Y�D�ޖ�Z�"��|,�}~�-����E�~g�	�z!Cې��
?@�Vszy�m�hi�'��mV%��e�o"�4,3�|~@��3!ʕ��(��
�}��C�����MT 9
P�	:�}m����%�/6�!�0
�M�gU���}�{�`��݃���c�O��t]�`?
4~��6�ifa̓���E��],��:�!�ys��V�EVF�8d� Z�6”J��-M�o�"k1-��mط����M�]~�
i>����j�CEm�滈��<.�*�Jv �$���k��e��l�J�c��k�2c��<c_4��g�

+���3�2�y��u�������_sd �d5�e�m�L�$��2(������j(��AFu��K�Lv�t�4�b�t8��%b
+�vz�������ǧ��c���:����9e
�s�����-����#
+�8��(��)c	���$	���
��
8�H�I)C3N0)ln�ҷW}���#�T��G�<�U���b	��D���8�NG*��D<a��
�`	��� mwt7	%=��\����u?%S9%�%B�P"\�!�b(a�@�����^ %jJ�Jv��?{[�n��@I9�%,�%�
�%R�3Xb\4񩈄p�J��{w�Q_��
����3S�0������=�@
�D�����d m���W
e�w 
%�� � �;��}L�m�.k/���>
+0��AP^fL� 8��
&���
+���9F���ɍ;�(�fYu�'Y��s/��y��/fu9w�5��j�7�?&���K:w��>
�ʼn�:;��Ԣ
 Y0�V� ���B�
?�
�b)�d�@��e,�D����o���u��>/�����掩}�h3��о/��)��C��C�Ӄ�����pp�$���'����d����..g�v�������"���
�y�W"�|��j�+^�`�&}�a�WL��F� ��M��%v��fw�����w��FIv�
9���X٢�Q��Sa�rY��a�Ǝ.{�V�Vj����>����n�����P�-�����U�������mKt�����5x�zt��1ĂbS��x��.��9��tR���;�];�f�����m� QU�
<�1qendstream
+endobj
+5343 0 obj <<
+/Type /Page
+/Contents 5344 0 R
+/Resources 5342 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5242 0 R
+/Annots [ 5346 0 R 5347 0 R 5348 0 R 5349 0 R 5350 0 R 5351 0 R 5363 0 R ]
+>> endobj
+5346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 707.9571 226.0342 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_bdd1d97c66bb40b6b396982cc6dfc182) >>
+>> endobj
+5347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.3006 707.9571 368.5377 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.6505 657.1476 166.0165 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_e1b84de453a8ba7224dbc5e378011e9b) >>
+>> endobj
+5349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.5674 657.1476 341.8869 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 657.1476 513.9963 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 645.1925 200.5642 656.0964]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+5363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5345 0 obj <<
+/D [5343 0 R /XYZ 90 757.9346 null]
+>> endobj
+5352 0 obj <<
+/D [5343 0 R /XYZ 90 607.8724 null]
+>> endobj
+5353 0 obj <<
+/D [5343 0 R /XYZ 90 557.1518 null]
+>> endobj
+5354 0 obj <<
+/D [5343 0 R /XYZ 90 524.8226 null]
+>> endobj
+5295 0 obj <<
+/D [5343 0 R /XYZ 90 502.5109 null]
+>> endobj
+5355 0 obj <<
+/D [5343 0 R /XYZ 90 502.5109 null]
+>> endobj
+5356 0 obj <<
+/D [5343 0 R /XYZ 90 438.6993 null]
+>> endobj
+5340 0 obj <<
+/D [5343 0 R /XYZ 90 416.3875 null]
+>> endobj
+5357 0 obj <<
+/D [5343 0 R /XYZ 90 416.3875 null]
+>> endobj
+5341 0 obj <<
+/D [5343 0 R /XYZ 90 367.1463 null]
+>> endobj
+5358 0 obj <<
+/D [5343 0 R /XYZ 90 352.576 null]
+>> endobj
+5359 0 obj <<
+/D [5343 0 R /XYZ 90 305.3721 null]
+>> endobj
+5360 0 obj <<
+/D [5343 0 R /XYZ 90 290.8018 null]
+>> endobj
+5361 0 obj <<
+/D [5343 0 R /XYZ 90 243.5979 null]
+>> endobj
+5362 0 obj <<
+/D [5343 0 R /XYZ 90 229.0276 null]
+>> endobj
+1435 0 obj <<
+/D [5343 0 R /XYZ 90 130.6347 null]
+>> endobj
+5342 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F67 370 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5367 0 obj <<
+/Length 1617      
+/Filter /FlateDecode
+>>
+stream
+x��Xmo�6��_!`fc�W�
�k��: m=�C[���B���r����HJ�d�.�X 1����G� �/	4��H3
�l��{�~6!~9���+�d>�x�@#
�(��Y
A��Wo�� �B�1�����e/nfO��qmVe�x�ܖq�xyy]dq�/n�Q�b�[V���O	�X�T"E8�j�8��#�4����YH�^�u� Eq�e=��*��[�o>�tj�MW�ͼ6w�:o�%L���bR+��>o���,XD�(~��}�����#��
`�њلS�
�ɛɫV�[�Ʋ%O$E
A�|Q�p$ط���1A%CLJz���
a�$�݌qNی�r��� eG���q��9��A�0G�{a��Ki��3i-��=(B���rĸ&v�|�xl,�0i�*0[ԁs�8_�I��O�
F�Ɋ�O�ӈ�M�W��\��1+s�=�l�ۀ٪Q�x%W?��|�d�\P�D��rn�C�/��ʌ�`Hj5�jW�D�+�6���c(���8Q����* �� ��"��kS�I�
��l�e���"�I�M�
)U
 
��˖��Ş�AV
�<� �LF
�X���8�J�Z�"
�h<�j3߈G�Fk}�G�ԇ�D�A6\ [...]
��|t�5#��VL�;�
��+�!N!�:9��y԰9n
�b�о@s҃�|�a�*����Ul��N����X�=Xj�{��2nAWY��4����0����;�ij.GZ
�4����eW��*��
!��멏��R1���4����V�]�(���o�{��[��ˬ|�8"J��`��}�SG��⪨E?�L	!^<)�qa~S���]�!np�_�I��;���{�y�����3��G�5��$�TPU��Y���m_1C�Jh��cQ4cQZ/��^�u��|��0�������du���Ia9�`X'��9�Z�H“�gwٹ�˖$n/�|k�ܰ�.O>�'7��ʯa�m�R�Kz�Z����Qz�
+���V�,������3vz���zS�Ko�\�Tu^�_�di���/��Y$�~�)��g�1�L��4���1��{���4�<_C]U>~7u�����%�).�}�a�]�Ʀ,�[�C���!�C$�9�j���$
���#լ���i�(#�遣�Bi�����P[���M�|y?�1�
�oبT�iJ�A���o�a���Uߗq6���h"1�OD�
e���)nˋ�OWh(
��H}*�	>	��]�|�_k5;����,
+��ɫI�x�*�Eh#7z	D�B�%_��l$���.�Rt��$�t�!-��_�	� �
տ�ڔ�a�7��q�����q&����q����f�ߓ��*ޔ�JX%��@�o�A/�
 h ��A%���M��ö�Ύ��#����������Zn\؛%�P���/����d}��
+
��
?���z��u�
�'9Lf���П��W�ӝ�endstream
+endobj
+5366 0 obj <<
+/Type /Page
+/Contents 5367 0 R
+/Resources 5365 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5242 0 R
+/Annots [ 5372 0 R 5373 0 R 5374 0 R ]
+>> endobj
+5364 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Generator__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 5375 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 333.00000000 44.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 5376 0 R
+>>/Font << /R9 5377 0 R>>
+>>
+/Length 5378 0 R
+/Filter /FlateDecode
+>>
+stream
+x��QMk�0
��W�
����
��
���!k�6�iZ�ct�~R��AaP
aEz����HJ#��E
�3��h�O���ְə�A0�ZB�c
s �] ��҉+`TF�CBhҾb�� iv��I��
9õh�!gr��%��2-��,�y
7�2�e1�6�u]Ųxj�bO�Ѹ�ֱ<v�6��
��"��{�>�d�'+Rd���
ނ{
U�1��
��Ƴ�6��1�zW3�/Љ���$9�o��!�q�*JS��["��2�V;��sd���_Y���yxѫ7�+��Y���]Q5m���؉�w:��Cv0���������-��
*�Bendstream
+endobj
+5375 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142734)
+/ModDate (D:20080908142734)
+>>
+endobj
+5376 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+5377 0 obj
+<<
+/BaseFont /PZZAMX#2BFreeSans
+/FontDescriptor 5379 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 0 556 222 0 0 222 833 556 556 556 0 333 500 278 556 0 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+5378 0 obj
+330
+endobj
+5379 0 obj
+<<
+/Type /FontDescriptor
+/FontName /PZZAMX#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 5380 0 R
+>>
+endobj
+5380 0 obj
+<<
+/Length1 56356
+/Filter /FlateDecode
+/Length 5381 0 R
+>>
+stream
+x���|�����eJ��A�P(��@,K��-��Rh��:�3�qR�ҽ��{���{ӽ��{�'K_)6?C�}��'9GGG�{�:�{�e H� d� �&�gΞ���7�{�vh���ׯ�H�=��*M�h��3���0
�������0�3�k�b
�
�x�kϘ��
��
����~�vvW����W�~���\p}�1��ܒ�!�ҷx�����b�;�����|�`��)WN}nR3Ap��5���x��=�\�^���0j�j��3�j�M���'�c��<�{mU��z�W'�E�%�N�$!�A��x:M�O��!Drt�X�<	:G���U¥v�
#�R�AFlL�{����]��%Wu�X�8:E(���ibk��
�*�t���]�s�*��U��	�1b*u.�a���c��c���U�0�b�?��a�
��H=D/�O��k�h"4����Gz�F7<�%J�w��f{OW�ZL�|[�^�G�6�R!���"1� �=���|{�Ikn�6��N� [...]
+X���yZ��>2>H�W���s~Ag�����¬Z�
���ͻ��҄n�>����S���
r���-~L{!��W�
���Ou .�J�D���&r�Z�=��WrίU����?˞&ډbS��O�I{Y����
!�Ǘ��+c�/O%V���pb�1�X�X�X�X�E�M�C��2�X������q�xbb�!���%'z�L�2H��$	B��eқ�)��mSb3bsb
bK��l��2o��zSz
+1���q�6^�o�u�L�#��2�lo<��r�<bGb'bgbbWb7bw����}
q1qq(q/q�9qq
q4q.q%q�ǪGo'??��G�?�W�?��O�{<��5�	^�>�5��S��
=K<G|����
ċ��^3O�H�J�B,���+��H������vg����=�+�Y��u�b�Ko�Tg��ľ�>�
ą���~ފ�@�k�[�.�%9�'R$%�b)�
+��1�_���CI�\�
F'G���#���5�5ɵ�Q������:�d9�\�
C�%�'Ǒ��
�	��F���D�O�5r9�l&�F&H�4�$i�)�"7!7%7#>$>"7'� �$�"m�!�d�̒.9��JN#�&�!n n$��ے3ș�v���,r69��K�E��e>!w �;�;�;�����������=�
�B��md�l';�N��\@.$�&
d7Y${�O���^rO�D��
+�G."�K�~r/rorr_r?r� �@� �2�`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�r)�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7������NR��)�b)��)�)��)�R�5�Z�J�J
��S#�ը����Ԛ�Z�(jmj
j]��M�G���R�S����jCj#jcj"5��L5SqJ��NT�2�eQ�P�R�Q�S[P[R[Q6�Pi*Ce)��BM��Q[S�Pөm��Lj;j{j5��Cͥv��Q;R;Q;S�P�R�Q�S�=�
�B�RmT�j�:�N��Z at -�
+���T7U�z�^jO�-�m�
�}�
�=�D��
+�G-�SK�~j/jojj_j?j� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�j)�*��:��&��6��.�
�>��!��1�	�)��9��%q6��5�
�-�
�=��#��3�
�+��;��'��7�����K�$M�4��,��<-�"-�2��*
���C�U�a�pz�=�^�^�^�^�
E�M�C�K7ѣ���1�Xz}z
=�ހ�@oHoDoLO�'ѓ�f:Nkt��i�N�&��-zzSz3zsz
zKz+ڦ
:Mg�,��S��4zkzz:�-=��IoGoOϢg�s���<zGz'zgzzWz7zwz>���[�V�����t�Iw�
�t�t�K�I��2]���E�bz	�O�E�M�C�K�G�O@HDLBJFNAIEMCKGO�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O_ at _H_D_L_B_J_F_N_A_I_E_M_C_K_G_O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O?@?H?D?L?B?J?F?N?A?I?E?M?C?K?G?O�@�H�D�L�B/�_�_�_�ߠߤߢߦߡߥߣߧ?�?�?�?�?�?�?�?��������������������������� [...]
+�21f�
+3�Y��
gF0�1#�ՙ5�5���Q���:̺L3�Y�Ìe�g�1�
�	̆�F���Df3�if��$�1�$c2)�b6a6e6c6g�`�d�bl�a�L��2.3���Lc�f�a�3�23���v���,f63������cvdvbvfvavevcvg�3{09��ieژ<��t0�L��Y��n���0�̞L�)3��Y�,f�0��^���>̾�~���́�A���!̡�a���̑�Q���1̱�q���	̉�I���)̩�i���̙�Y���9̹�y���̅�E���%̥�e���̕�U���5̵�u���
̍�M���-̭�m���
̝�]���=̽�}���̃�C���#̣�c���̓�S���3̳�s���
̋�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�f�/K�$K�4˰,˱<+�"+�2��*c����C�U�a�pv�;�]�]�]�]�
Ůͮî�6�����1�Xv}v
;�݀��n�n�n�Nd'���f6�jl��Y�M�&�b-vvSv3vsv
vKv+�f
6�f�,�Sة�4vkvv:�-;���n�n��bg�sع��<vGv'vgvvWv7vwv>��c[�V��ͳ�l��v�
؅l��f�l���ɖ�2[a��E�bv	��������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾�.e_e_c_g�`�d�b�f�a�e�c�g?`?d?b?f?a?e?c?g�`�d� [...]
+�r1n�
+7�[��
�Fp�q#�չ5�5���Q���:ܺ\7�[�Í����q�
�	܆�F���Dn7�k���%8�3�$gr)��6�6�6�6����l���\��r.7���M���s�r3���v���,n67�������v�v�v�v�v�v�v��s{p9��k�ڸ<��up�\��[��n���p�ܞ\�+s��[�-�p��^���>ܾ�~���܁�A���!ܡ�a���ܑ�Q���1ܱ�q���	܉�I���)ܩ�i���ܙ�Y���9ܹ�y���܅�E���%ܥ�e���ܕ�U���5ܵ�u���
܍�M���-ܭ�m���
ܝ�]���=ܽ�}���܃�C���#ܣ�c���ܓ�S���3ܳ�s���
܋�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�n�/O�$O�4��,��</�"/�2��*���C�U�a�p~�?�_�_�_�_�ůͯï�7����1�X~}~
?�߀��o�o�o�O�'��f>�k|��y�O�&��-~~S~3~s~
~K~+��
>�g�,��S���4~k~~:�-?���o�o���g�s����<~G~'~g~~W~7~w~>���[�V�����|��w�
��|���|���ɗ�2_���E�b~	�����������������������������ϟ��ȟğ̟ŸʟƟΟ��ɟş͟ß˟ǟ�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_���������������������������������?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?Ͽ��ȿĿ̿�/�_�_�_�����������������?�?�?�?�?�?�?�?���� [...]
+�@
+�@
��
+��
� 
+� 
��
+1a���0TXU&
F�	#�Յ5�5���Q���:ºB�0ZXO#���	�
�	†�F���Da�0Yh�&$]0��`
+)�6666���l��BF�
+�0E�*L���
�
+3���v���,a�0G�+� �vvvvvvv�
{9�Ehڄ��.t�B��@X(�n�(��žBI(77
�6�v�������xTXD
D<D
.,�W�	��^���>¾�~���}����A�=���!¡�a���‘�Q���1±�q���	‰�I���)©�i���™�Y���9¹�y���
�E���%¥�e����1•�U���5µ�u���
�M���-­�m���
�]���=½�}���ƒ�C���#£�c���“�S���3³�s���
‹�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��
�[�;�
+�{��G�'�g��,�W�L�;�7�w��O�R�/�$�o�a��H爤H��Ȉ�ȉ�(�"q�(������������C�U�a�pq���8R\]\C\S\K
%�-�#�+6�����1�Xq}q�8^�@� n(n$n,N'���f1.jbB�ECL���-qqSq3qsq
qKq+�
1-fĬ�Sĩ�4qkqq���8C�)n'n/�g�sĹ��<qGq'qgqqWq7qwq����[�V�M̋�b��)v�
ąbA��b��+�)�IJX��E�bq��/�%�-�#�+�'�/
 
(
$
,
"
*
&
.
!
)
%
-
#
+
'
/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/^ ^(^$^,^"^*^&^N�)^!^)^%^-^#^+^'^/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/> >(>$>,>">*>&>.>!>)>%>->#>+>'>/� �(�$�,�".___��������????????���� [...]
�FH�I#�ե5�5���Q���:ҺR�4ZZO#��֗�I�
�	҆�F���Di�4Yj��&%$]2��dJ)ɒ6�6�6�6�������lɑ�RF�J�4E�*M������K�J3���v���,i�4G�+� ͓v�v�v�v�v�v�v��K{H9�Ej�ڤ��.uH�R��@Z(�n�(�H�ҞRI*K�OZ$-��H��^���>Ҿ�~����ăҁ�A���!ҡ�a���ґ�Q���1ұ�q���	҉�I���)ҩ�i���ҙ�Y���9ҹ�y���҅�E���%ҥ�e���ҕ�U���5ҵ�u���
ҍ�M���-ҭ�m���
ҝ�]���=ҽ�}���҃�C���#ң�c���ғ�S���3ҳ�s���
ҋ�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�i��LȤLɴ�Ȭ�ɼ,Ȣ,ɲ�Ȫ
��ȫ�C�U�a�py���<R^]^C^S^K
%�-�#�+7ɣ���1�Xy}y�<^�@� o(o$o,O�'ɓ�f9.krB�eCNʦ��-yySy3ysy
yKy+ٖ
9-g���S��4ykyy���<C�)o'o/ϒg�s���<yGy'ygyyWy7ywy�����[�V�M���r��)w�
�rAr��+�)��\���E�by��/�%�-�#�+�'�/ ($,"*&.!)%-#+'/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/_ _(_$_,_"_*_&_._!_)_%_-_#_+_'_/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/? ?(?$?,?"?*?&?.?!?)?%?-?#?+?'?/� �(�$�,�"/�_�_�_�ߐߔߒߖߑߕߓߗ?�?�?�?�?�?�?�?����� [...]
�	ʆ�F���De�2YiV⊦$]1��b*)�R6Q6U6S6W�P�T�Rl�Q�JF�*�2E��LS�V�Q�+�*3���v���,e�2G����SvTvRvVvQvUvSvW�+{(9�EiUڔ�Үt(�J��@Y��n���(�ʞJI)+�OY�,V�(��^���>ʾ�~���ʁ�A���!ʡ�a���ʑ�Q���1ʱ�q���	ʉ�I���)ʩ�i���ʙ�Y���9ʹ�y���ʅ�E���%ʥ�e���ʕ�U���5ʵ�u���
ʍ�M���-ʭ�m���
ʝ�]���=ʽ�}���ʃ�C���#ʣ�c���ʓ�S���3ʳ�s���
ʋ�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�e��J��J��ʨ�ʩ�*��*�����S����C�U�a�pu���:R]]]C]S]K
�������6�����1�Xu}u�:^�@��n�n�n�NT'���f5�jjB�UCM���R-uuSu3usu
uKu+�V
5�fԬ�Sԩ�4ukuu���:C��n�n��Rg�sԹ��<uGu'uguuWu7uwu����S[�V�Mͫ�j�کv�
ԅjA�V�j�ګԲZQ��E�bu�گ������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
���������������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�ޠިޤެޢުަޮޡީޥޭޣޫާޯ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�����������.U_U_S_W�P�T�R�V�Q�U�S�W?P?T?R?V?Q?U?S?W�P�T�R�V�Q�U [...]
+5��
+�`�{�g
+�/nF�|1x~F�����g��.��N�z�Cg�
t����D�{P��A�{|����+v�J}݅\_E��f1��f��P��aVC)���ʾ�g�4cy@���]�����W�v�S��J�#�
�t�\ԥu�ԥ���RW����V��ի�������\�W��}��@�vj��/���^��z�
�v�f�8$j�J@�d҄LAZ�6����@f!�@Z���o��\
�p-�Z���k��\
������)ٞ���f��6�m`����m��
l�6�m`�����\�o �A}
`;�v�� ��l��
`;�vPO�F����^xiु�^xiु�^xi�5�����~��g��~��g��~��g��~��g��~�Y�g��~�Y����_�
+�,г@�=
�,г@���
t�.�]����
<ג�j�&q.Ry;�\>�`3˅\�3�{t���2�A& uH2	iB� -HҁLCf ��A�8����?�8����?n*�k�y��bN�E���"�8bЀ�C��:j���:j���:j���:j(_C�	�1�:&P��hཱྀ���}�g >���@|�3���
�c �$���iI�%��^xI�%��^�D���K��	<x&�L��3�g��	<x&�i��&�M��i�/
����4����_�Ki�/
����4����_�Ki�/�>�Ki�/
����4����_�Ki�/��
\��0

���4p�^��
�|�!�k��Z&!v�r���k��R��{�fM�W<5
ҀLB��)���ga��gQ�S6����@f!���'	��I�$�|�@>I �$�"��� �~
�q�#�$�K�5M��R-�B��� �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I$Pn�&Pn�&Pn�"!%�hH	L�&l2af�JO����u�K�rWٿ��Bog�W�\���/�rJ����1}������
h����
+9��[�,���wNC�<�:,��b�|%�N�yy?̛i�cv�n�

;��Ә* �M��7��x�[�rԶ}Ԍ>j�.
P�uѳ:{��]
�9zN��G4�v�]t��ٮ��ؖ2�&�!p
��\�J������]a����?T��i�V��Z9�-_��x���U�Z�fůZ�0v�_��_� H'M��%]�~ʯ]�������Y_�����{���z?�%�Smx��͇,��S�k}����㕉��\k ��Y̵wuś=r
5#
iZ�
��#͈�d�����4+Ԓ�ޜ�,!V\�ʍG�ţ��Qi�@�Q�Z�ũE�iQ�ZT���E%'��Qɉ��D��#a$"�D���0�
a��
a��
a
��
a��
a��
=���HFO$�'��f��bF��Q,fT��lF%�Q�fTr**9�7a�"�T���0RF*�HE�Ê0�Ê0�Ê0�Ê0�Ѝ��(-ĊG3��i�nND�
iF�%#͌�T�Y��F<
aEu�G=��u��t��t����ā�	�O��H�_�
+I��
+I�$z1b��c��c��c��c��c��c��c��c��c��c��c��c��c��cW�cW�cW�cW������ ;{
;{
;{
;{
;{
;{
;{
;{
;{
;{
;{��|��t��t��u��u��u��u��u��u��u��u��u�
u�
u�
u��u��u��u��u��u� u��u��u��u��u�	GcJ� {|
{|
{|="�����������������YD�N`��c��c��c��c��c��c��c���
�]��]��]��]��]��]��x�t�t�tFB�4 ��&d
+2,džt Ӑ�,d��7C_�|
�:��?�|
�:�u���ׁ�_�|�
,E
�
�
�
�
�
�
x���76�76�0�'6�'6�'6�'6�'6�'6�'6�'6�'6��M{d{d{d{d{d{d{dKnKn{d{d{d{dKr{d{d{d{d{d{d{d{d{d{d{d{d{d{c#e�3Ջ
��EF�j͑�E~�H�#͈�T��ѳ�Ȗ�l��D����RRz��EO�F��I���%��i�H3#-i��
i�H�"-B5#
3�0#
3�0#
3�HE�#a�"�T���0RF*�HE��fs(�dR�4 ��&d
+҂�!
�4d0FM��M��M��M��M��M��M��M��M��M��M��M��M���x���
愉���_�|l�Ml�Ml�Ml�Ml�Ml�Ml�Ml�Ml�Ml�M�x9�D�7��M�x9�D�7��M�x9�D�7!�
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��
oa�X'Ɖ�qba�X'Ɖ�qba�X�ayd2��
�ca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X8�p
d���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
���8��q����������5��5��5��5��5��5��5��,oa�`a�`a�`a�`a�`a�`a�`����Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z�2������\���k�*����e��W^ [...]
NE��J���8��^���Z���������.��
��rP~��ۂߝ9�Zb��J�o�E��R�3'���0�+UowU�o�����"��߬�w���û������:s�\��
�B�W��~w����
�#/�Z�C��B�K�{,,���&�+_����~c.��6-�����=}�[{�"�~�kI�~9�(_����T
�]�|�h/��`L�jKN��כ�WC�.�]
��Ek_��/���k/�ڋD�>�梐/���2�~��^,�������c�wl�
ޱ�;6x�����b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x�����a�?l�
���6��o��
|a�/l�
���6x�/���`�l�}y�F����m�yy�F����m�i��F���gm�Yy�F���gm�Yy�N�� n�Yy�F���gm�Y{&{&{&{%{%{%�'��3��<���6N�l|~hc�m��C�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�
�d6N�l���8%�qJf���)���1�c6N�l���8�q*f�T�Ʃ���0�a6N�l���8
�qf�4��i���0�a6N�l���8�q�e����闍S/;J��3&gL6Θl�1�8c�q�d�����3&gL6Θl�1�8cr��
�=y�A�s��
�;�k��A�s��
�7��A~s��
�3��A
s��
�1��A>r�w
�
y�A�q�o
�O
�
y�A�q�o
���A�q�u�w
��
�
'�Q>򆃼� o8�򆃼� o8��<� 8��<� 88)w0�
���濃��`�;��湃��`^;��毃��`�:xW��|u0/
�K���鵃��`~:8�v0O
�O����t0
�C���<tp��`�9�oN�
�7���|spZ��l��ٰ��ag�΀��4�'��I���4�'��I���4�'��I���4�'���F~N#?��oi�[��F���oi��4�q�8��L�?���i��4�q��F?�яi�c��F^J#/�����Ki�4�Ry)���F^Jy)�
΍<�� �:���4!S��
�@�!3�YH�ǁ~
�q�ǁ~
�q�ǁ~
�q�ǁ~
�q�k�׀�_�|
��5�k�׀�_�|
��5�'�� ~�	�'�� ~�	�'�� ~�	�'�� ~�	���ׁ�_�|
�:�u���ׁ�_�|
�:�u��7�o � �|��
��7�o � �|��
�'��~�I�'��~�I�'��~�I�'��~�I��7�o��	|�&�M��7�o��	|�&�M��� �-ļ��ž�o���C-x.��S�O?��S�O?��o���o���o���o��|
�pm�k�\��(�F�6ʵQ��rm�k�\����Q/��Q/�r�� ��|��
�;�w�� ��|��
�;�O?
�4���O?
�4���O?
�4���O?
�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?
�,���?
�,���?
�,�C^u��ƹ��	��
X����
t��'�q,킥]��
�v��.X�K�`i,�6��ِd2��
jゥ]��
�v��.X�K�`e�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,삅]-�C���.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
�u��.X��`]��e]��
�u��.X�˺`Y,�]]��k��"~��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q7��R�K/����.X�k�`M��5]���
+�P_��
�t��.X�k�`M��5]��
�t���|��k��|
�`W��]]��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.X���`U��U]��
Vu��.X���`U��U]��
6u��.����`Sl�M]��
6u��.����`Sl�=]��
�t��.��{�`M��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]x.���.��?��G7�G8.p\��q}
���av�7ckz�y[���<�ڻ:�J��\������pJݳ����~��Tη��
������N�
�\[��q����I5��S�C�xҀLB����_�Z�u��`�R�:���D@�� 
���Q��7_��A0f\�~N��E�\�Z���Qt�v=T� )��btۃ��GzeqdW���+?��
/��/��?��ʏ z�Ax�����J.��
��H2پRO`�Z<X�x2
�x�0���[X�+�����'F�,&�#̪s
�
��C���
	,
X�RC�K
O�!�H^�U:�Jm��v�Rn� �H�{��"���T�6�\me�߰��s��'Z�%Z�ڞ�!O�$O�$OM�DS$�I4E�ڞ�	|�&�M��7�o��	|�&�M��7�o�t�\�Գ�������+��Tm��f[��b��x�#­�k�Ԯ\����QT�B�0)���UC�/2�]�{U�K� �t��dR���|wo��炷i�6��
+�/仫_��Ӎ/Lj�
�}�^��BCP[|{S÷5=�+9��RWyaw��	���zz{J��#W`sŎB^*�tt���؀՛�]�J5
�V=Y���;��a����̊�N�u�{Jy����U>�մ`իi�*ד$"D*�w=���P�Z�����_��T��|!�[�
��f%c����P��-�co��/&�1$���jE�f-Tz#�%h�D���ӄ�ަ���7��!^cH@�d҄LAZ�6���\[`2
�V
��˓d���8 �8B��U��1�C܏!U��Tgh��!
!h~�@B@�4�,
$KCCH���G��) h�@CȢx�Zë֞�#0
+ ��]k
�Zkx�Zû�޵���QS "�`���^��𲵆��5�l��ek
/[kx�Z���^��𲵆��=Y
@���S4
�
J�
+}B��hF��
E���'R�PI�>���C�x�����sX�
ƣ���a�z��U0*#����Ӻ0h�9�F��Um���h�9e��w��)4���*���G���ޮ�T	�*�No-��������,t�l
�:�B[@��
�<���t�ۻ<�hk�Y�M�:�gء�mpS�)o�I������`��%����W���*K�6�@��R��C�A& 
H2iAڐd2��tЏ'�
y8a<:���?=�KB".
q�KG\:�����tĥ#.q�7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�&�S�O?��S�O?��S�O?��S�O?��-�[���o�B�ʳ�g�φ��8m�i#Nqڈ�Fy6��r��8m�i#Nq:�w�� ��|��
�;�w�� ��|����O?
�4���O?
�4���O?
�4���O?
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,���?
�,���?
�,���?
�,�]��w����
|�.�]��w����
��$���x:���d�p�dx�@�!3�YH7��x2.��T�/�.�k�՗����RɷQ��t{{��㟀�x%��+Q.^]�d6��Q��O]���I
2�C��(1X�z29��+9V�LQ+T/H�xAʓ�!��!}�*�*�(@G
;ha-젅�*��W�\�B���)O��:��Q;
��(_���
�
u�C��n������U���D���E�*�򽝒�zyo��o��7�}]�_���>�ו=.�G���_���5.��0��/`/��s��1`��
Ћ
.��� �@�)e��˂�R��Jů
��������.�<]�@
pۀZ
P{�{k�[�-5���@-
�����5q��.5j�G�T�����sCB
/��_�.�
����D���k���^
�
���q_�����
�0���0T*�"�J'Lmm0y}�J�
"U�;m�C��CUƫ�^zC�Z:��+�o7\��Rc*�q�
�G�
J��E
zz���
���X��{~�*�\\
�C�H����X
+�$P���"J�,�ToP�a4��@d�_=���`8)��Dp� Y��{��}�WO	��`����:����W��s
�	9���.����Uk0�¤QU�j��h
n{	#�/b�-�K��-Z'�ׇ��
+�t���iA'�m�/�P���`��`��#�P�b�hA
+��С�-4zZ\U��P�G>уEtE
\�e*�X
+&��*Bv�Z�����Ad'
mA���-�������ӆ���Ƕ`��j<��gs1T�1�1cjRF�P�ݰ��G�AJ�����͢��R
ۣ����
�bX�bP�H
�O2
MY�����/ty
+d/d7d� Y�C��W�&��� ޖ(ʖ��z
ڱ���&���n������� ��Q
�c����P+�	t�
����ڢ��K����
aa��PN�@
^b	d0"
�(
̽B8
+�`�+�m�O'
�0���(�K
+��c� !T���T	�b�t�J!� V�T?�{:*hq9T1�C=
��<H��
K;��v�`�5D�
�F�W��IQ
��r�����P	B	’T�9b����V
�n�p��Ö
Z��.�@+��T
�r��5
+�
Vg���e7d��z�J ��ٵ���
+i	�2-��0緄	�%L�-ȬpH�-a~C��*�x84���h	
�Ƴ�ђ�j�K�)
�ޖp<���`:a�C��su
|k3]E߿��(�
+75���U��U������uOUjoU�[j�t51U�cj�������"��h�/_S��F��곭R�x
Ґ��(���0z��U��U�4-�O��=�R�TK�
��z�t�=�][dwt+ւD>P��8�-�@��XG�

���r]�κ��fú�a�DY+��J�uJ���s�5�S;'���t�����J�"��
��k;�\�
�薿E��qUK�� �[x�W�в�C

�Pƪu�(�����1qLŚ[
��WŎZ���[�ue,��������+/	�ʟ��:W/1�ܬn�j�)�V�
+�����Ⱥ[uE���������j���]{�_{Q��(ԖP���7zk
�.��J����{�r4J�ci��mO�����m�HZB���vդ8,f�h��S)�:v[����'*�Ts���4֞���s��2W/�]�ÂI�O�������'.�N
���O��R�aU�D�R��D�e�f3TR�YL�����f?� ��������e"=���F���<��͡ܚS�[�6)ײ�
u�x�ѩ3����
3�OX�����^1�k!f���r��Z
+�ˣO#�D��I���E�L�ߌg����&�k1���8���/�{$�#O�}Ң\�/�H$��k�=�c	��
��
mP#;h����V�1��N��匚o
�\�ն~����F�R�Z�T2
P�p�!�h62��:#Mc�rc���L#c�θ��Y[{m��mA�\�E�A��7�Q<�VB���Q�k�F�B�jv�G�F�F=�5�-���6�&{�!h�OkPh�Q�&5o��N4��F��h4��0Z6ќ
ݨ��-ќݨ���Ġ��a
���ʈ�fʸ���#9��9�G]���#�
ln����A=�A=�C�
�
��
̣���n��p�КkQ�W��a��H4�J|t��Р��=jC\n���Vm 	#�h>����3A�uϛ�p+r�~���]Y7�(+-g�Iba,�%�ZX=
*Z�$BE#T��b�J*T�	�Me�4X���ó��Q�2�I�5cm74X��υ50�a
��FXê
˗�`ݓ�T��l�c�
F���ud�jVԉdb2
1��
C
=�B���p��05�����b��f�h��fj��h�Ѡ�k[?�j%R���J�u�%��}N=i772���ry���V�P��`�_���A=V�خ���x
����q��J<2�z
��X�`�O�+�6��f
����ZY*�_z�$�A�}�
+F@�Ǡ#@�o�A�F|c8h�$훐&��N�%B�����F;���BC��Հ
O�
+��w��4�ǩ+N��g
+H�Q�	W!����k��V0��<ڠ
FmP
�D�
*US�
+�f+l�F�+>���h��X�ވёЗ�V��Z��r٪�G�`��v��v�%�
+a�+�4����c5r_� �?����;�����_wd��
+:�چ�'����{Ͷ:��5K�J62����FF��1�Șid�60ډFF���Q��F�ۍ��o;���jd7��ݰFn��526��Ө�N��s��iTwǪ3NXn��Gq���sR������	+vw�#cį�w
+��k�;Q]����z�^~��n�7�F�����o���������U�a7����U���U��7��rw��U
&V
+
���,�N��FF��8z�yY�Us.y�8�p�8�I��Jy�L��G�{6(

�{�
+<���`�n|�n��i7��f|���ݬY�vr����r�gk�^�fre7͕�tj�-$�w[t�棪c�Q�*�
ﲵ�-?111>��
���&�$��1u�
+
 ˱K]����
,�7b���_�bkzD[���ڱ٘�]�Y��C���fe7��&+��{��z�����J�<��
4{�8�X�J2<���A#um�L��?��Xn�מ4��

4[�z�
,���n5p�5Z�͵5�@�O��c�͵��B�h�XX���Z|�P��њ��a9:FI|�q���F�埕į��~���x�h��#T���C",0|wFǻ3v�~��
�
?6�ÏM��c=��Dף��h���5�h�D�n�I�nQ���f#c���jd��F�t#c��1���60Fá�od���z#c�����ݨ=�F�i7j:�Q�ٍ��n�tv���5�Ө�F��4j%�Q�8��i� N�q�؄�>Z��vT}o��
��џ]������3Z
�8����<{<�vq#*z���
st�Hpx-j��<�ԯFC�d|e�k��p���/gH4-��e�@��5{,|di׾.h7Ռ�쏚��x��
U{<k�ñ�V#����42f���n#N|�3j���FF���Q���rF���Q+i�$-gl� Z��5H�Q�$�k�!l�����F��ܨ�5Bs�FhnԨe�U-ިj�F�oԭa�u�k�a���L��DC����0d��AQ��CG}�"A<A�CGeG
M�����5��C��_�}2���U�<�ۘx���1�0m����u�R�$v��E��["����%����99�=t�x���4�G�3ts��������
3n��1��
=�\c�#�
x��C�e��?�������o�X�
K6�ڍ4�*5=<���~r��,�ɋ����OL�p��?��H���ɑ3f� �ƖCoZt�U�69��e�	^8�%�dإ��t��d
���{�K�|�
+����.��{OU�����`������$G{�0t/������nZ���T9����H����`�۾�̬�x߂g��ص�}�-杝��+�ߗ���\�l��n9b��\�Wbٲ�vo�_d�2�y��A
C���5��l#�1��7�'�K7'����aZ��s��3�JdzR��O�JʪæN��Ĝpʘq��,������4��-n�a�:;��8g���I��d�x�:=�ϑS%�9p��G�=d[�~�
ӓks�*W3����;z�?����Xc�ȵ�ݽ�U[�ǫ�d�ņc�$�z�%4��Q�1�\/�.�칪��F��O���^��a�$��8{��m�'̛Uܞ]�����.>��e�_x�5�O��
���Ϲ��+S���""��]P�teZ�
+�B
j�ǣ�i:E��`i�!
�k�E�sf���m$�C
�e��,�
ɦ�X[���V
+n�6�l���w�=�{���]�^�x/ݿ��?R��Z�����Q9>H���a�M
�i��[�
�
�e��
q�dz�M�/���ң;o�o�5�S�2j��0������4L�����B�8�p��bbR�{-�l7����j}������nm�m��b������yu�̪,H3y˾H��X��1w�Ŕ�9R_}�J���x�V������`["�"���q^�!�HwB�L��[*�1IN+�ĕ�����m�7lmi�~�A
-w�@(���^���ڝ�?�� j��:ՉNfvԥ���${�
7���f���nR
��P�e����9�6�f+ݐ��pM���Ӛ }q]��8`�
+ޤ)w\{��K"ps��3�N�ۭ�k�î�_�`H�@�0%��_�8�N�E���H<|��dX�G
ل:����澒�����BJק�
�����S*4j{u��,���a.[:'�:B��L�c���o�� ��YJ��
�<����|�?$ʴL{�De+�V�_������嫌�k�
ӒH�3�

D7x�1Q'$��)�D-’
k�w|����Cu�T/��ԛ��v
���}�u�@����8�kk�k�oޭT�ZauV(��t�3� �E��5
j�,�[�%��ׄ��o�S���F&�rw=Z
+s*s]��\<��s���W)��
U�
Ҵ�ԗ���i�B����qe��6���+[���=t��s�UFq�<H
'�Pcv8�Z�L���
h���Xp��-3�Tn۟
�3�;4����[��8|Ft4d�9%��ؔc�i{���:�򧰲&>^���a�cu*�aCVw�)������Y\��;Q��x*�d]�� %�u
5�'s�
�"(Ix�<i�6�o�4���(���+�i~�����f
�Nx5��#���+�A#ဃ7l"=ҵ�Z���O��P\
M�!���T�Rh˺6j-���N�
!�PY�p�x
J
[:�+*��J��z��t���,�2���7fu�'ϱ1����BV�\��u^�
���fg���v9�P
GG7M��P�#!����<8����.�l�-�SʏG�����P�R��sJ��~���
+ @�  @�  @�  ��
+��%��.D�@�"�=�Gᾛ82)���-G����������Qa�����Q��{�AG��!�5��ÜBf�3h���F܃+�g�~�A�X�F+Q�D�N���\�Cy(���5��9S�ʈ^��|���d�v��O���b��������K��0��t̗D��?%�f|�M� �z*a�t>d��&j[������(+j��j�;
�����k>�����S����GMs�kl�w
�ّ��7��� ��N�endstream
+endobj
+5381 0 obj
+20807
+endobj
+5372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.9231 336.0606 197.177 346.9645]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+5373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.9124 181.4323 316.0602 192.3362]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+5374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5368 0 obj <<
+/D [5366 0 R /XYZ 90 757.9346 null]
+>> endobj
+198 0 obj <<
+/D [5366 0 R /XYZ 90 733.028 null]
+>> endobj
+5369 0 obj <<
+/D [5366 0 R /XYZ 90 651.0397 null]
+>> endobj
+5370 0 obj <<
+/D [5366 0 R /XYZ 90 591.5309 null]
+>> endobj
+1436 0 obj <<
+/D [5366 0 R /XYZ 90 479.4156 null]
+>> endobj
+202 0 obj <<
+/D [5366 0 R /XYZ 90 472.8154 null]
+>> endobj
+5371 0 obj <<
+/D [5366 0 R /XYZ 90 397.2774 null]
+>> endobj
+1437 0 obj <<
+/D [5366 0 R /XYZ 90 285.8679 null]
+>> endobj
+206 0 obj <<
+/D [5366 0 R /XYZ 90 279.2677 null]
+>> endobj
+5365 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F23 2436 0 R /F52 345 0 R /F67 370 0 R >>
+/XObject << /Im6 5364 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5384 0 obj <<
+/Length 2772      
+/Filter /FlateDecode
+>>
+stream
+x��\ێ�}߯�Bf��ypِ#[��8��V���!��&�zf�����Y�V
�K��tM���
M&�!�'J(d����On���/H��
>����\^<�N��AFR9�|_Z�	J�����)!��ٜ`��ofO��f�x3�x�[�}Ȯ���U~U,��gϾ϶Y�<�ٜ
+<}�^
՟o��Y1#z�mW�c��)�t���/.=�z �Ib��v�˯xr
��#f��|�c�ds�)s/��.���T�_苃 lH (CX
+V���j����\����C}��R�� (�
+�%X"�4��c���R��E0|���G�J�%
,e�o�=m:~����I˯����1oC�bбk\�4���Q�S�w��o��
+�\���Sjd��G��I�m�����?��00IΎ�Q;T�oǚ��MשD�4x��t߶kݿ������͂@S��C���﮵ޡS
+�r�\������2ż~��e������I�ۡR�;���-2D���v����]������~~�b�;~��D%��Q	�iD0T��߻�U!"�Dj�6}.a�K�r�m��&J:�O@�R�R� �@U��YUfnl��%uF��
m:�w�Y֊#!0E;��[
%��)C:���ls��T�;mW�|��+���8�g
e�JKʘG�~���m�L��9\��}ԩf
A0�xT�946�*�
+
x���q��ːk"��ѱ��nK��1�sJ%b�
�'7rV7�#
����FL�fY�.fLM��-4ѕnV��ݼ|X�iecE9�wa &���f�6�V"���uC��VKj148Z�
vT�i��3lٵ��`�h
�z�q-dts�J�OA%Y�����*�D��J��\u(K���)	�
�Oa7|JB",9#kTzBޛ?���t
��+C�_P�]]=?��m�x�ad�S��[6��ݾ�;� �
��'2w��[�5R
+>m̂su��=$UG��	m��"��<1�����kN�x��1lTJ	l�r��YV�
��v�m�U��3÷��4���o>W��
�ꂥ�L��C~�L�����u�>@W�8�m�(
����v�<5A��UY���5x
��U��l;R�Ii�R��ܣ� �H,Z���+���]�D�1�	mD��a�~Iv<�z��薎�Q�����m����2�՟�v��
��M�X�����3�C�Y����A
I�
��!?T��@(A�j��7�
ƅ��(n�������%�

-�;�k�;�_
+1��(�R�*͐)��L$:\�aoҁ�R%7w��W!�"���(٦
"�(%6bJv��J�m9m��������4�B��T+���R�������$�z
�~�v�uW��	�-������]� ?,���+5I��X&�P)נ1�k�b#i�G-cC1�9X(��&�vYH'�����A)Ħ�uy]n�kMn��NNޫN����|q6y��cY��|���bf
Ң�s�L�e��	���5�aI͆#�M�u�m��j��w�f
:vk�˻��N.
I�ݡR�Aچ���H�)�0�o�dC�z��"٪���DL�� �`�1U�5"T��^j�Z�L�6��T�����w�j�
:vk��w��ط�F�1��;Tʷ4������[��e�Q����n
�k�m���+�Rr@C�+4Ĩ�)�:XZ����b�~�bC�q�6�Ql�A�n�X��q*�~�R�퍜x
(��b��d�<@��pı
u
!�ѭ�}-��f�=~͆�.�X�Xx��HPn2����C�' [...]
+^ΦEm�d�=b;����0LB"�
����'q�^mk
�K{���	��p7]izS����
�����e�����χ���=|��܏��ɵ�6O�ZSYq���}�QeU�fsQ~�e}�#��(U��{���[siR~a
|��
�
+�ܱk��x�?{���Ǐhu@�m�/P~|�߯��yq{�C�e�W�{P�K#�
��T��C.�����M�����Ydg:��/A�? ��4`endstream
+endobj
+5383 0 obj <<
+/Type /Page
+/Contents 5384 0 R
+/Resources 5382 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5428 0 R
+/Annots [ 5387 0 R 5388 0 R 5389 0 R 5390 0 R 5391 0 R 5394 0 R 5395 0 R 5397 0 R 5399 0 R 5400 0 R 5401 0 R 5403 0 R 5404 0 R 5406 0 R 5407 0 R 5409 0 R 5411 0 R 5413 0 R 5415 0 R 5416 0 R 5417 0 R 5418 0 R 5420 0 R 5421 0 R 5423 0 R 5424 0 R 5425 0 R 5426 0 R 5427 0 R ]
+>> endobj
+5387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 697.2736 160.2066 708.1775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >>
+>> endobj
+5388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.9774 697.2736 192.6547 708.1775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed54312979a12cae5ebb0791496e1ccce7a) >>
+>> endobj
+5389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.6435 697.2736 217.621 708.1775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed505abaa6ff4aa204c25c94719e8a2b6f4) >>
+>> endobj
+5390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.6098 697.2736 251.9322 708.1775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5b7fe867b1243e111ef4364e3ef5b5329) >>
+>> endobj
+5391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.921 697.2736 336.6141 708.1775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5bed2d3fff60e7c0b8fc325bf46f9725f) >>
+>> endobj
+5394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 616.5873 155.7331 627.4912]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_3f29f8b40d09b17eaa4cbaac069f72a0) >>
+>> endobj
+5395 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.0703 616.5873 224.8931 627.4912]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 578.1592 163.4819 588.6895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_b339ccb929a7255295ad19a5b168d5d0) >>
+>> endobj
+5399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 538.9838 155.7331 549.8878]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [166.4727 538.9838 207.2793 549.8878]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_4fb7d78e7b37d7f4b99babdc5cc84783) >>
+>> endobj
+5401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [234.6165 538.9838 276.4392 549.8878]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 500.1821 179.5535 511.0861]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 500.1821 250.6661 511.0861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_1c884f5152f75040139ec3d9ec8ac293) >>
+>> endobj
+5406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 461.3804 135.5791 472.2843]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >>
+>> endobj
+5407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.0772 461.3804 155.2252 472.2843]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_7c502c8d46ed2f68679404fdfdf8e0bf) >>
+>> endobj
+5409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 422.9523 162.6769 433.4826]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_d8cee05f88ad5aea288c1f6b8bf7cdc7) >>
+>> endobj
+5411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 383.777 160.4554 394.6809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_e5902ab7e2d3304037a56ecda7fc22a4) >>
+>> endobj
+5413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 344.9752 168.2162 355.8792]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_f1827b1f7a42393a2526944530559c5a) >>
+>> endobj
+5415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 306.1735 201.9692 317.0775]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_2aba27eb7310045e1a35c7e68af01ab2) >>
+>> endobj
+5416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 267.7454 297.7285 278.2757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_fceefab91d648d188e42e5a75a3a977e) >>
+>> endobj
+5417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.5441 267.7454 336.7317 278.2757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+5418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 228.9437 283.3526 239.474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a) >>
+>> endobj
+5420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 189.7684 191.7178 200.6723]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 189.7684 288.8524 200.6723]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_de98f4e320d7d21e223afb83240b3800) >>
+>> endobj
+5423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 150.9666 191.7178 161.8706]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 150.9666 303.0791 161.8706]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_77fc44f44b1bdda486e19e30310634e2) >>
+>> endobj
+5425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 112.1649 201.4711 123.0689]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_42867df59ec40173391b76074f9f0fb2) >>
+>> endobj
+5426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.8082 112.1649 270.631 123.0689]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5385 0 obj <<
+/D [5383 0 R /XYZ 90 757.9346 null]
+>> endobj
+5386 0 obj <<
+/D [5383 0 R /XYZ 90 714.3182 null]
+>> endobj
+5392 0 obj <<
+/D [5383 0 R /XYZ 90 635.5348 null]
+>> endobj
+5393 0 obj <<
+/D [5383 0 R /XYZ 90 635.5348 null]
+>> endobj
+5396 0 obj <<
+/D [5383 0 R /XYZ 90 596.8526 null]
+>> endobj
+5398 0 obj <<
+/D [5383 0 R /XYZ 90 558.0509 null]
+>> endobj
+5402 0 obj <<
+/D [5383 0 R /XYZ 90 519.2492 null]
+>> endobj
+5405 0 obj <<
+/D [5383 0 R /XYZ 90 480.4474 null]
+>> endobj
+5408 0 obj <<
+/D [5383 0 R /XYZ 90 441.6457 null]
+>> endobj
+5410 0 obj <<
+/D [5383 0 R /XYZ 90 402.844 null]
+>> endobj
+5412 0 obj <<
+/D [5383 0 R /XYZ 90 364.0423 null]
+>> endobj
+5414 0 obj <<
+/D [5383 0 R /XYZ 90 325.2406 null]
+>> endobj
+5419 0 obj <<
+/D [5383 0 R /XYZ 90 208.8354 null]
+>> endobj
+5422 0 obj <<
+/D [5383 0 R /XYZ 90 170.0337 null]
+>> endobj
+5382 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5439 0 obj <<
+/Length 2671      
+/Filter /FlateDecode
+>>
+stream
+xڽ[�n
7}�W̓2X�!yY#
+6�k+OI �G-���mOˊ��[�nR���@
��Hs��XuXds��?�0x��B�q�Xo������3Ҿ}�_��ݜ]^K�0�H*7��I���.n�~_��^]���݊�eVn��w+�����C~Wf�?ˬ|���!��eV���x�v�
�����}^��^�u昡fI1[�y����7�a; �$���{���xq��
#f�X<�/c�b{�)s�l�>����iި?0���HK��d�(CX
+�%h(�%�L��p�A�菉`�l
x�_‘�Rv�~��7�L B����o��Z����ç
�Z��4��
�F�ĸ
*�Ud���

�I�e���X
ï�t��F��QDBI@
�q��#lS�"�QS>(J^S�ae�+K��C����W[
+�}�3�l��C޾�[q����E��ZtV��Z��cV�?0��
��4�O���dn��"#�U��
QBH�0ZX�.
0^*R��ϵJw�� 0!��8R-<A�o�R8>՚yPQ-�Co1	� �J���mY
\��c���Q;x�}ߪu���8P�a6��ۃ�a�@�t������ҐQ��)
+ڈ(��YV���ђ��&�p
+B*�u�LZ�
Š�G+�b������
��$6-詨
F
����=���Y�
`Za�F
kzR�M��E��&�ߺ��w�7��/��c�6׏�uU�0�RH�*|��- ���Ғ�hZܯ���	�@�4�T��爨�����h���D@a�����4E���Z'):\����vF@	���
�J�5��kFzi�;ڇ@� L)�;C
��1�ki�
������>���uѧ�@ea^i<
� �02�49�cr,�F��T��Hh#"�
fY�ϫ�rw�5_u�ԯ�m�vW4�W-+cz
+cb��e�Ղ*�x�P�ز	ɑ0�%��Ѵ�yd\�BXD�:~��<C�
v�	\, _,p	�סXf�C}��S$19-(�T�Hқ���Q�1
z��x|����,u����*

+�J��*(x�>��Z)0;I�1us�iu+WD,!a�P�0�F��jL���z�8XUꨦ1X����	y
`1y
�N��`X�<Ok�ç8
���MSط`

 D�06C�4R��$E��P<��Pe �)��J8�ľ��y1)q\"�(�;E
��1�;���i�~Dc�Q	�†
*�K�<�n���ꟼܻ��7�
%���>�_Qa��t]����� �K�
,�
qUfEu����|[����`��������y��.A�
���
mDD�æE�I����W��JF�v���\�
(�]z��͵BZ������D{XR�C��N�u��;%�0
���D����݄D+�ߘ� �MaI�m
"6AR

��q����v\�E]�:>Q
� @��Gꦗ SZ�0���3���4�v�i����D<
�"
&aFuI���F���0{��Hr��5��D�C��N{ڈ���M�t���C��jH�89Y�������f_�!�Pw)�nQi�~1��S/ف�ęA��#�8���z�m��%w[=�a�Ja� ޑ��<4�����u����$��߷�C��o=���Ro����%8�*��Δb;��خ4�$qx1ӆ5-
�b��m��ڸ�}�
^��*P
L�C���
�ݷ�[�zc?�&0��P�gї�;gZIT��:k�����6��1)T
�eJ4yE�b�"�J(��%�*4Ѫ�_'V
���y��Cj*��
�i�r���]˨�U�m��3E�zh"
��ʡ
�q�yHhS�nNO��FD<�����ʰkȎ��t1��k�;��&4u��a�t
��=�ק{���ҽ�cN��
춏��n<�aw�$�x8Tʻ���Y����>�?mIJ��,�� _��#��k�9b�J�jD=,���X����|���>~%M�Ƌ�#��S�Stv�qR��x,<*��v�Ta�u~>p
+!��c�����]��nm�;qD�`�f
��P)C2�I��vj(���t�&��v�ny�e��u�7!�V"���6as��p��VIE�#��
�I����A�*�
i�
:��0�`ra<jR��&H
+�N���BTj��b�aI1
+
F�(�׉Q��|1꒘!F	:���(�1�;�b�q>-F3��"F	��
1���2B*�J0aJ��^ ��$R˜�D)�%
D�M��vw�c'uo^Y�(�gl\�?��;']S
L�^��Ú&�+�e����.N�>�p�&�0D��ÒJ����	�N	;~������X�y֞�o�H�8��Ҙ�B�Oص���)��#a�2Dl+�$ݷߎ^&d����Q	z��E��^��H���U��sJQtv =>�ph7��0Il�x<<
�r.���@���?��"c�I���FDA=���cuxl_���ǃ��i�!6L����M�"�K"���_�����'Hӹ��]�jY������wu
�m���s�[k~m������1/�Y	�lW�_�ݣ[!l9|��������C�Ses�`Y������&��G��R��_
�ꧠr�.�O4J��!�ځ?T�������	���qW
JTT����ϋ�_�P�˫�e9p鄟CHe�\��w����	���읳A>
+2J��Jaendstream
+endobj
+5438 0 obj <<
+/Type /Page
+/Contents 5439 0 R
+/Resources 5437 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5428 0 R
+/Annots [ 5442 0 R 5444 0 R 5445 0 R 5447 0 R 5448 0 R 5449 0 R 5450 0 R 5451 0 R 5452 0 R 5453 0 R 5454 0 R 5455 0 R 5456 0 R 5457 0 R 5458 0 R 5460 0 R 5461 0 R 5462 0 R 5464 0 R 5466 0 R 5468 0 R 5469 0 R 5474 0 R 5475 0 R 5477 0 R 5478 0 R 5479 0 R ]
+>> endobj
+5442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 720.2859 150.493 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_f1bf8c762c6f36b30f2abcaffe591acb) >>
+>> endobj
+5444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 681.058 156.2812 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_775a8cec41b0fcc88689a171f5be8546) >>
+>> endobj
+5445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 681.058 201.9196 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 600.2954 179.2544 611.1994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7525 600.2954 196.6887 611.1994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_584f3fd5a19536644a66818169b16ac6) >>
+>> endobj
+5449 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.0259 600.2954 301.2755 611.1994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 561.4412 179.2544 572.3451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7525 561.4412 194.4672 572.3451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_b36bf020da4fb4583e6e1a6b94197cb4) >>
+>> endobj
+5452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.8044 561.4412 299.054 572.3451]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.4343 522.5869 183.257 533.4908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5454 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.7579 522.5869 210.2334 533.4908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) >>
+>> endobj
+5455 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.5759 522.5869 322.8255 533.4908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.6471 471.7774 188.4699 482.6813]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.1835 471.7774 254.412 482.6813]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) >>
+>> endobj
+5458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [300.1802 471.7774 377.4298 482.6813]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 420.9679 203.0748 431.8719]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 420.9679 296.3242 431.8719]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_d593d3aa49a632911d8d49c83b3f4985) >>
+>> endobj
+5462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 406.3472 316.2164 416.2524]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 382.4872 194.2975 393.0176]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_3bc88b2886b0b86865186d142e5ee414) >>
+>> endobj
+5466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 343.6329 188.7586 354.1633]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_ebb212a14f52ed934059925c1f5f2010) >>
+>> endobj
+5468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 304.405 202.7759 315.309]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [213.5155 304.405 278.6008 315.309]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_600c942b0a2e94b550ccd84ef9c30928) >>
+>> endobj
+5474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 265.5507 202.7759 276.4547]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [213.5155 265.5507 312.3539 276.4547]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6804f93015ae6e1dc0c2e42e726380c4) >>
+>> endobj
+5477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 184.7882 226.0342 195.6922]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_303b4ed4262469c1834228e0f88dba74) >>
+>> endobj
+5478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 184.7882 362.9987 195.6922]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5479 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5440 0 obj <<
+/D [5438 0 R /XYZ 90 757.9346 null]
+>> endobj
+5441 0 obj <<
+/D [5438 0 R /XYZ 90 733.028 null]
+>> endobj
+5443 0 obj <<
+/D [5438 0 R /XYZ 90 700.1513 null]
+>> endobj
+5446 0 obj <<
+/D [5438 0 R /XYZ 90 619.2693 null]
+>> endobj
+5459 0 obj <<
+/D [5438 0 R /XYZ 90 440.0612 null]
+>> endobj
+5463 0 obj <<
+/D [5438 0 R /XYZ 90 401.2069 null]
+>> endobj
+5465 0 obj <<
+/D [5438 0 R /XYZ 90 362.3526 null]
+>> endobj
+5467 0 obj <<
+/D [5438 0 R /XYZ 90 323.4984 null]
+>> endobj
+5473 0 obj <<
+/D [5438 0 R /XYZ 90 284.6441 null]
+>> endobj
+5476 0 obj <<
+/D [5438 0 R /XYZ 90 203.7621 null]
+>> endobj
+5437 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F104 5472 0 R /F36 2201 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5487 0 obj <<
+/Length 3332      
+/Filter /FlateDecode
+>>
+stream
+x��\ko#���_�~��@��C#	���i��n?%���ǻjdI��q�_�˙!�
�Hz
�uP0$�彇w���;2��GfϔPH3.g��3<{?}F��
8��
�����WR�4Ғ�ٛ�փ$HPBgo�~��Hu� ����ϗ�������w�����ay����ay������ևe�;�/����7�������礚��U
zN1?���7g_�q�&�����?��t�3������`D����3N���9{}��;�6�ʃ �$�!,k��,�����W��U��m��˯�B�)G�kҶ�
�ݮ�����ec?���������o꛷u��k
�+2�0�8R�:}�}���^�%�⃟6�b
�`hE!Ɉ�*�p���a�_ۑ���b3�&D�b�C�w��+��ϡ��ǻv��#B Z�Lz�\d~J�Q��p��„Ě��[�
�ȯA �\�<5�G�cQ�S�2��
��hL���(,��b�KS��s "��^1D`:�S�2�x%�$��Rs?E+D$�J I��T`"�����X*ú
̞���
+P�I2C�j����P��}�Z/7��=QJ��0*e"�S����8�usn�W�`����&׈��^2�I�BPz�I�DR�*Ǥ�,Ϥ�����:&����61�
+D�Fq,���D~
�ݾ��|�P	�d���*����8�
�t�f3Nq�*�Xi�}F���8I
F��L�s�r�5�i�0f+"��)��8�>�%�LD˵B�t"�U&8�ɬ&�D���R�գ�qp�b�ު���a;E�
(��0��9����TI�{��u/%��B�m7��'84��
+UT���o���X�]�2���v��rSo���M�]��6���-3��ѹ�{M��υ���Rg�ܙe��w���L\��A�$��q
�<� �����&�\!j�\��[�\t�}ãa�OӹDB��X�
��k��a�`J��wV����l���9.ҠJ����D~�\L�EE҉pV���9�F�0�墂�/��|)��>l�̞+��zC�+
���G�P���0����a"!9^�fy^�
�x}"�BZ�
	xݏ��7{SZ��ɔ׀*3������
 �J�-Ts���˛���漂q3���X��Ӊ�B	D�K��L' it	8Kh�_�z���`j�5��Yo��zy��Z��vU_.����m��
����"F�2p
#

+�����
^qP?�	q�9�_������gS���.��mk�!��T&��b0J=B�����0F��A֍EX�8��/k��Clj)땩��D$���
�](�[�8�C�>��R9LC3�8V�1k�~��l�fɥ�ب03�Q1����M�a�f ��rIEq"�}K�7-�X�`��҉pV���2U1>J������
+
'׼4�>"��J����j�}w��z�~*7e�d�U&>#@��Ua���!��`s��|�p\�tSo�2��f��GwQ��p8gj>�}���[{m�o���e+@ۣ�'�"t����]]o't
5�Ak^����������ǫ!��e�)w�
�#h��.יeՐ�0����N�� �ө!��;��B��%H%rR*���A�r���Zk%�AB+9��J!��Z)
�i� NR+&d�J��j�d
����J�窕��H*.���� ���Y�V
+a��J��x�Ra�N*1rJ*)P�����D~3R	V&KW2�*�2�*0�D��J)Ί3��s "�y��ù��2�,�B�����O
3$��ߨ��hn��=�'���mhJ|qsݔ�G]��}$�3���2����S�/�@�J��5��/�aJMĝ�_~�g_��p�R2Q��Z���`Za�~
��v�Y_��m^_Q$qU�`E���ʀ1W4��0��
+�)�-sa:�}A�T_Aaޥ��b#}5�vR_�v�
�+�
��b�Qʧ�P���P}-(�W^����f��*�qZ_���ZT��U�W��`���բ��jQ��&"S�*��P�ʀ��ע�IjQ�����Ԣ�6"٣�Q���
rf	9��aJ��`2T�J�U0-1WO�t��Ђ���qfY��;L(���J'���4�z�IX#��*�A~��rf��BX'uP��A��*LǠ�2"��A�<
:(B1���U1ȩ�b
+t�� ���Y�
+a��A��}�)�]Xg*̓�3e�D~��L�<
u�tpWg
+��3f`�3e at D~��L�$
u�t|Wg
+���u&��B������#%���^XQS��������$�	+k�V�Ô���;%���ϼ���<K���ݍd	��/�S�i�� �\��?bL���>��L7���E꩷��\�fL�p&���
֥	q�Y c�������t�U�b$����������کi�D%�c�d���*��,N�}B7Y�2�`8��ґm�ȏ\X;*L�+
������R)�F�Ȯl� S5*��P4J#{-.��?T���]����Qe.��G����H�g6-k�)���"(D���3�ԅn�gV=j.A-0Ґ����	9B��U��9��*&��
��e�D
+
�Oy�ٛ+�sw�;��`�
&�T�	���CW�z�c�OIQ��<����V��X'�T�UR>���*KŠ�2�G^��R	D�´��!<O	E%����5�� %��Y��
+`��Q��}�)�]X|*̓+>e�D~ˊO�<
ŧtpW|
+�)>f`(>e at D~��O�$
ŧt|W|
+����'��LA
��<)�f͞J��2�ƞ�J�&#�>�J#F�
�i�+�1�Y�E�o��� n�~�ݱ9�˛�4������q��8͟�>(��?�=�B2�E�����Q�0
�t��U
�֑��(_FM���țKYD��:�
��o� ]\�b�q�\2���r0*mn�`!�M�2��mb�����#A��̠��m��?|�7�n�v�BNS1;s+�c�z>&_�F�ћ��"�����P�E�,����/���ޛ������Y������ò	��nm������6��}w[{�M��L
O����g�ō���+��zt!dվ+/"�
+UD�

]��Io����d�5�� ��ù
0����#Sj�u�U�>����'rs��lv�T��@,]L�OhXf�o'��H!�6���O0g�6�0���aiA��
ݽ1��j_�}��
�}��>��\����a}��
w^�j\Շ��� �5U�?�9�A<]G
F���y�<�Rw����W�d�
�E7���ȯ�����_�|yww�VGt�]�hݼ��7/�עaHT���[8�K�~�)��}_ɀ���ӛ����-�x�4�q�y'��� �(Y*endstream
+endobj
+5486 0 obj <<
+/Type /Page
+/Contents 5487 0 R
+/Resources 5485 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5428 0 R
+/Annots [ 5490 0 R 5491 0 R 5492 0 R 5493 0 R 5494 0 R 5495 0 R 5496 0 R 5497 0 R 5498 0 R 5499 0 R 5500 0 R 5501 0 R 5502 0 R 5503 0 R 5504 0 R 5505 0 R 5506 0 R 5507 0 R 5508 0 R 5509 0 R 5510 0 R 5511 0 R 5512 0 R 5513 0 R 5514 0 R 5515 0 R 5516 0 R 5517 0 R 5518 0 R 5519 0 R 5520 0 R 5521 0 R 5522 0 R 5523 0 R 5524 0 R 5525 0 R 5526 0 R 5527 0 R 5528 0 R 5529 0 R 5530 0 R 5532 0 R 5533 0 R ]
+>> endobj
+5490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 671.5655 156.2812 682.4695]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_10cab5245f80aacd8000d0312730ec03) >>
+>> endobj
+5491 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 671.5655 313.002 682.4695]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [331.2136 671.5655 484.1188 682.4695]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5493 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 633.5097 180.5399 644.4136]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_d7552a414d66f92897d12767579fa3ca) >>
+>> endobj
+5494 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 633.5097 249.6998 644.4136]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [291.4329 633.5097 333.2557 644.4136]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 595.4538 178.2386 606.3578]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_0c26ae11a4146369ff86288347cc54db) >>
+>> endobj
+5497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 595.4538 247.3985 606.3578]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [289.1316 595.4538 330.9544 606.3578]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 545.4428 245.5216 556.3467]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_e6206985cd5536c4dac181de5fb21247) >>
+>> endobj
+5500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 545.4428 325.2287 556.3467]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+5501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 533.4876 155.7331 544.3916]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.4662 533.4876 239.289 544.3916]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8531 533.4876 316.4094 544.3916]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+5504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 483.4766 245.5216 494.3806]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5363ddeed325652ee6c064a8936cfe57) >>
+>> endobj
+5505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 483.4766 325.2287 494.3806]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+5506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 471.5215 155.7331 482.4254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.7929 471.5215 238.6157 482.4254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.7469 471.5215 315.3032 482.4254]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+5509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 421.5104 243.6051 432.4144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_a98511973ca14e8904e4e2c1f774bd3a) >>
+>> endobj
+5510 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 421.5104 323.607 432.4144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+5511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 409.5553 155.7331 420.4592]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.4662 409.5553 239.289 420.4592]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8531 409.5553 316.4094 420.4592]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+5514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 359.5442 243.6051 370.4482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_f4abff14e1b88cbb929f0733432477ff) >>
+>> endobj
+5515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 359.5442 323.607 370.4482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+5516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 347.5891 155.7331 358.493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.7929 347.5891 238.6157 358.493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.7469 347.5891 315.3032 358.493]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+5519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 297.5781 242.189 308.482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_0fb144e5f3fb6815e4c28c89883607be) >>
+>> endobj
+5520 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 297.5781 322.4088 308.482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+5521 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 285.6229 155.7331 296.5268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.4662 285.6229 239.289 296.5268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5523 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8531 285.6229 316.4094 296.5268]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+5524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 235.6119 242.189 246.5158]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_e67eb83f2626818420b3201db09e3d58) >>
+>> endobj
+5525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 235.6119 322.4088 246.5158]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+5526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 223.6567 155.7331 234.5606]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.7929 223.6567 238.6157 234.5606]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.7469 223.6567 315.3032 234.5606]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+5529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 185.6009 226.0342 196.5048]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_75190def344d4c1ba6c59a6f0fcf7420) >>
+>> endobj
+5530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 185.6009 388.2139 196.5048]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >>
+>> endobj
+5532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 86.2883 219.6424 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5488 0 obj <<
+/D [5486 0 R /XYZ 90 757.9346 null]
+>> endobj
+5489 0 obj <<
+/D [5486 0 R /XYZ 90 716.2211 null]
+>> endobj
+5531 0 obj <<
+/D [5486 0 R /XYZ 90 149.0393 null]
+>> endobj
+5485 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F37 1999 0 R /F11 416 0 R /F100 2198 0 R /F40 354 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5546 0 obj <<
+/Length 3228      
+/Filter /FlateDecode
+>>
+stream
+x��Zݓ��
��Bo�ڈ�o�ړ�4��i�f�ε}H2	O�8�D��|����A-E�:�ӷ��
�\�������2�d�.�l��!�Gx�����/b�/�n^|��̤F15�{�
M%�lv��1�4�z�����vNI������9#I�9��U���]y_�����7���
&I�z�7��-
�zNuR��㆙�9���ۛ��:	�$W����ǟ�l�����h9{��Rc�l{#7��n���q��1=��T+x�O���S�d��(Q��Z�:2T�O�
�D	��$��
+vT�֥"5D����S������3��D��J,��Q�@���0���t���QR��
	��_
8��k$�)S���Ra��n��H�2bQ��P*y���]�;?痣$Z�e� �������Ƅ�r��<]���̓С��2���Ou&8\�E�;G�;I��rGd�F�A��,��4&��ӎ쪝N�x��+�;���Ώcf�Rʔ������)�L���+fJ�o��YfJ��iFR���l������f:�bd���vf���t_��v�PM�uN`?f����vAe*�4phD�,�V����8�rF�lARc?YkO1ʤ�
T
K�&�9�SFL6����"fi���CY��r��J��N�Ո;e)�@1
�ȯ�ӈ�s!Q7T�X_�\_����l�O�35p�X���d�l����D�tN!3���;�W��X܌*=6F�0��:�
��PK\���AD0��p0�b����A���M�
�b:6@�L%	��

G�������� ��c ��2Ն�O�
��"�8f�PJH�� !��§����)a�����}�¯�����9�l������
0�I9X
+���)�i]�ň �f�wMo%�����]��]{�\��bה���Vg��>_�a�[}�F�^�.�tӗ���|Lr)S�� ����_F;P:$xdd��(f���L&����2I�-O˔P��$`�"�%�E�@����� mRB� �a�TԥFur��K�����U���8��P2JX���M��Q
e;�,�Ю:2+�U�L�����ͩL��{RZ)U�C�l�>8� =W�L8��=��71H{�+b���o�}]4Ů�Q� 󃻾�I���s�6�[�e��(U�ڙwTW$
rC���dh��d���2o
+�p띧t��]ի�vör�w�p�	�ҖE�
p5T
�j������!��f�q�y�#
E!�R|�Д�G�׻�N
]�jN
t�
��؎,��g&��7C7� �ް�22�@��G���x
���,y=R�A ��ê��g�8�R��p�+��h>�n�9��p�'A5k"�*�]�z��hG6��	c��{�hƃN
���"
+͂��
OEj\�M,h�]�c�$�$R$�F�4
��GH@���[��Һ� �B^iX�ގ��L�P\��'Yr�.=Ӧl6l����\e4�V�Ca�.~?8��;tRG��ܪ�͹N��:�6�����ɹ���߿BN:�ݭK���6����S����"s`.���am���]M��B��~�_�Q|���kU��Ӎ�L�E3��I���@�5���Ÿ]�Z��N�����&� ��`��P�'�����c��Pn���6y�Z�L�郎'�
;�
J�U��U[�
��!���$��E��t{i���������h��r[{f˪��W�U7�p�9<�w� 
��2�Lt��S��������)���t-̾f��Jע��$*"�[�L��	��>
�?���\ԧ��\�
~��b�Xp%�u�5Nj�:�k�ș?f,�Y|p��:�0�(��Q��ڧX���W{�8�)8��`4<�!/w�C
+ﳃ l?9�������p�g��
+�V�L�7=�7��@�
�W�H�L炪p�W�n���
�H�铣XZc�BA�q
�O򻧹{��6��`CL�{�u����:x���=:�%���`3x7z*7G�x—[�I��|\�wC=H��
+-
+�-��?h8D0�g*��8����9Z'
+�5��ܳ��hW��ѿ��=d�,-�Y~�3��a�=Y��q/��Ӱ%B��β�nC���
�,�*]56��$�L�(�2��$��5����|+�#���C];K2������
+�]��&c��
=��W�S��3y��s|��
J�oJC����Tnס2����z0y���l�sO=��)���c�c�:2�o�Tu'���fS���_��
̾�*�6�7
l{X�~�)�.�{|s��M�����
����K���oD9��x�D�@�>6�A�]���*���S��i������K�U��'�4$&w9S j2ȟm�6K�#C9��U?_(Ȅ�c�#�^��L	5B{DZ:��#���u�cV�
wD��0���r���
�_9��^vQד�t<`ܑ:2���e�*�2զ����ˎl���Z��1s^#� �4}� RC��G�
?��!��0�0Z�IEM�wv{�
U��Qԇ<e
�V���C��#����e�c���Z�g�]L>�v
�태�􏍻|�����a޻ۅ���݇Ι��N(��M�TSC�NȚ ��,��m~��Vn�>p�
fD���lG���.
�A���K'�S�{��ү��;�����m��B$� O94}9�ӌf
����y�ɷ~�r�𛉃gg���̃�ȧ>��1�.v*�iv�/�=L*[W��4V��c��/�푞�+ϳ����}V$l׵���u!�1��Ml/�"�0L�g�bL>q�
ٳO�Fę�)
��_ [...]
+B�T��*9�AHvY�S�G�<`
!;�OFH�-���G�v��u�'�
��O
&�
0����EL>eo�l��ꞽ���x�`>j���!!o�ȕ6�[�a�f,
�R�n�Ų|pM)���cwR=�����F6�Ą]���{���.
�Zg�j��7M��D�釺..��~�8S;{��<v��PWۏ���oG$
��?� p����~
�~��kM�Nj��ޑ=g�EU�/��m��[�;hw󯦨?�O�^���w�ܗ�hܾ�|�X
�� ��
+�%~(���J
�%!)�i���6
��G�*�
����������m������S�l�î��iپ��7/��� �d|��
�@�����ݓ��=�6��í�2�#IGE�/3��endstream
+endobj
+5545 0 obj <<
+/Type /Page
+/Contents 5546 0 R
+/Resources 5544 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5428 0 R
+/Annots [ 5548 0 R 5549 0 R ]
+>> endobj
+5548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.4103 569.4536 353.6649 600.4223]
+/Subtype /Link
+/A << /S /GoTo /D (main_representation) >>
+>> endobj
+5549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5547 0 obj <<
+/D [5545 0 R /XYZ 90 757.9346 null]
+>> endobj
+5544 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F79 571 0 R /F8 568 0 R /F11 416 0 R /F7 574 0 R /F10 488 0 R /F13 577 0 R /F6 565 0 R /F9 602 0 R /F12 664 0 R /F25 348 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5552 0 obj <<
+/Length 2915      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s��~ׯ�[��\�}��䥙8M�6N�>%
DB& @`d����
\Җ��t4#�g�^�w�
���G/�PH3.��^<@��w�������
���rqso9H�%tq��eI"��`��o/	^��6�}{I�*��M���=�������۬�괭��x�u�6�{�9���K�,�r�;��^R,/���⛛n�~�Ib������b��#��x����t���������O
�a���p	a�� HQ�G��0I
��bx=�D#��Z(*�,���͇t�+2�{v�M�)R��E�y0G5\���VH&��
+n
���UQT�T,����5����3�����
�
�vU^�f�Wo��'�
	!,�̲s$I|
H	N|�W�M%�_���dI
5!1C��"��=���+�����<�◡ief��
I"�;?GD{�FZ@�*"����X��:�����@$qa��'VX�Լ7��$�dǞ�1F@�TL�
���abEB�J�W3y������|��
\����º0
:@rE@
�c�g�Ł#���?8q?V�
ʐ&��5��7�F����x�G���#XE��Z	
HO��t럲{�_�ٺ����^�<Auצy�m|���7�F�'�uF�`�8S�\�G�s�d�K�È
� �s�8#�P�� a���ۼH���R�嫣c���!/���X�)bG��HŹ����
���l�_1�
f"�d9l��ت
�?
� ���O`�p��U����|[�l[Nnl
a�4�! ���m��o[
v	�	�$3ۿM�v�x�(��j%)��$�o��Z�G�����㒈e@]�����-��d"�j_x,?�&�p
G�������:+�(,��^����8sA�ҧ�<y��3��<�2���+:?��!���s�-&�Ѷ�ln�i��4�8���dĕ2=@K�u�q��r�vc�L�C�y���G�`��-6�`b�\Tk=���]��7�6+��*]�Ǭ� r
�7	9H� U���&!G0J�d3���_�߂�

�v�ّ��d�Z6ٺ*7�q�6�{z��������8�����kN[7�#0r�ߟ���a��jl�{
��5'n�H��#���"JLz����Hx��qFR@$9QA<.��vf��@Ӻ��������.�I]�=]�H��
o���~
\
>�R�K���r_.L��|�
SM'�\�"�%�|R�������#;&'S]N�Z�3�
cH]���unpo�cb����U��\[zW�
+>�4�А�ES��;?�>��'PG�|t/m����Ȋ�`%�v1��O4z~��V; �׉�}���niy����U��dN��������b�E�Q\,�eԳ�Q�
�� |~�@���`D
�;��F2yS��Ӟ�S�>7���gt?P��PѱTZM8`uf�;?���pW������+����R;���C\�o��
�Œ3
ܧK�s�)�Mv�/��7ݑ�1%����jz��^�Y7nL
X�j�y��e���	��Y�@�y�
+9�(�4�괢V#�z��i�5���7���t�eӦ��(-�A1f��ؤ�
�~�
'L"?�Ǎ�(
d�E�;ف)�I��L�ゖ^��H��K�y��S+���p������%I~^I�����Z$T��dN�r�@�A�`�]L
����#�B�2�כ���
Q��V:&�1�
و�~?n�WDxK
'� �O���W-!XՔ����cM��J������t�_]C�MQH���{(w9K��lD��>�&%�
+O�� ^���Әj:<e�G�ȑ�1�����,`<<���
+�.�fo6���Oq�M�ƾ�qiN��4�P�
+5<�d:5�ȕ��Lc\u�&y�h��1�6փ��w� �4y}���{���i��ڨΈC
Q�q����4ҏ
`
��󘻝�qM�i^���$��o��Ko�������qZ��'
z{T̻{�V��Z�i�c�ޑ���uτ{L�
�^10�����
+�?�����.%�7B��;R�^�d�K�6_��w�R��q	ZG����z�h�$RL

+l��O���f�����6*�3M�i�����

������K
aLG��Ź����ƀ�vn�g �3�=G�
�>�|��+�`Tȉ�OD4�]IFLJWz�[e�ѓ��Ug�w�
��-
��M�pn��
/q��*{��z�,���6k+���8?
qt�Z�H(��ۼ��y�>�1��&�ok[Y�=����!)צ�s�"`g�ɏ����ޚ
���͗y����nDK:-�֍0yޅ�O(�tn���
+8��~�lo����
"��h�����0��jo
����hNNcin�L�
�@S ���ÛF�Mt6�ƭq
����<sѱ��UM��~d[��t�ΚƵe����
%�Ñ؊�a�^��
AL�?R�װK��d�uD=��x!I�R$�s
ɑ뀮�f2
�I��8����a
%��U�èG *��P��h�ޭDT�A��$~����|����h>� 
�7��z�9
� |�\*2��%���"�
/!��ƣL{D|$�<
+�H"h/�3�C���J��N��t��.P��(�����72�C@�0v�J8JHG�K2��B��
�9���!��֔�C0�
֮("L��m���!�$�!��R���)$9�xO�Fv��.����D�-�&4�%�?Q^4�
�0_m��og1p#R�}�k?D�`K݋�ۉ���-�7��5|��^�����_MV�ɸ/��#-�6��g[�5]�	��wuF�9a_�x�e���

 �wJ���Ex���n�*���#
�ƭmw�WWOOOhݠ}��j��W�]qu�.�1�M�9�:��Zz��!ؑ
+'��t�{�*�a��s�#AF��o��endstream
+endobj
+5551 0 obj <<
+/Type /Page
+/Contents 5552 0 R
+/Resources 5550 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5428 0 R
+/Annots [ 5554 0 R ]
+>> endobj
+5554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5553 0 obj <<
+/D [5551 0 R /XYZ 90 757.9346 null]
+>> endobj
+5550 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F79 571 0 R /F8 568 0 R /F11 416 0 R /F7 574 0 R /F25 348 0 R /F33 485 0 R /F67 370 0 R /F76 580 0 R /F10 488 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5557 0 obj <<
+/Length 2243      
+/Filter /FlateDecode
+>>
+stream
+x��Ym�۶�~�B��Ԕ8�����$�9��Iܳ�N����$�ĉD*$�����RIQ��~�x���b��ų
�L0�#�O�P(b\N��+<y���]�:��A[����
)&�$��ź� 	���b�fJ"�, ����8��w�fO���F����er����|��Nu
�Y>
����۸(��V�u>#�T�K
�XD�)�j�v���͢��9 �$ƾ߯޼œ8��F,
+��n0"QD'�+NY}��z}��F�}QM��T�$`
����z�S���
eK��ة	��01��UJN1�`����
�@PR��$-�-��g�e��P�M��\T�١�"_~i���2*�����C_���:]m�UK`O��$�q~w�~��H�ԉɮMhkgV�N�f�]����yb/_�&�b/�]#Z{�̉�
��^�F=9�A=�J_|u�ĭ����f���HA!xXM�c��s�u���:Y&�F�oq���[]�Є��&��0
+/���bq
(�R�y��6P���\n���c��?58��wI���
+�@*=�Z�ݾ�W�D^�Sy
�����B@�wAqy���fnB�r}v������. "4�(�	B-�-6:א�_�^��ʍ��S��
O���
1A�%�����4bC�B�Li2��|�Q,�@�B��K��V�ۘO��bv�
�E���R�6ً�T�)��<:�M��ە����8I;�Xg�m6�b���N�P���d��
QH��0Bm�5bƃ!�޻���"%�xt�_{Q�����D�6��B��ۋg�a��`�k��Gxd@݌�淧�D:��@/)C���l%��7��
�.-��l™I��#�cj[���
+���	����>\��2����h�
�̽����p�6׭XU�)S�lmMW�e:��;A
+[>�k�w��1�*ۀ��94R���'�E�La
��aS�`!!,2��@���H4� Y�ի$�K=d춨�2��j�n�ǹ����������d�|�}r�a��戕�bj��^w$�qkx�&��%���́���Ш0�C"��3��{�Q��[�&=�
}�Pƒo�%<I˸J&t�G��
�M�;��|>_���f��>�4&)gu	����޴z�K��@��j�	
W�=w-����0B3�=qcL
�p�ч�
a��jg�9`��Zu���t�[�I�#��}o���zA � ����=�:#c{�B#�N�1�P���;��å3��~=Sx��>4�'
4Ǘ���K�� �L��_�Bh��i&��4:
�3T�9t�b#�4bU���?-z
��ř�k���	!P���/���˧���
�E�%6�L-V��?�����n��#,�s�R}|�"���g��-�>ȇ˸�����
�ou��o��s���$�'!R68lr�]�:Q�*p2�mGk��=a�ў�*gD�1P�duw<Ot
e��t
3;Qp2gL�j2�
�Rʝ����V�c���!]^THI[QSH;߬
����,-\�o}&��c�O%����	/�)���a��=�'G
������Ɓh���z���>w�*��˷C�+X��
"�^'fy�Ӣ��
=�[�U��e�_� �h�������1�`J���dy�������I�N� �
��3ۤ������?Tw����.�P�x���P��|��Zn������t�����u�uvy[�o���:4Rg��kk�?�)Rℍw�m�ӝ��j2�6�n�/���nq�U
Z|�����KVpRd�՘Q���
X���x
��/��\���Y��4R}c�(P
P0{�,6��<b�
+�拴�Z
+��&�e�f��>��yiG���'hSC��i��D5,�k���}�Y8˓�$mV�_�3E
���f��>%
	ns^�I�0�^�h`
�7=���)
+� 爞�o�
J%���m��w/cy
+mU(?��o�$�h�'
C��.g����o�.byߊOd�3�r����O"y	�p��)h��X��6J�@Z�����i�7�E̗�K)~`����0L�����Gz�Z2��mK��Ƚ�s�0����Ipޑ��Kq��8�"i�.�߀9�O�ޡ�9T���dUo��xeo~)t���S��?��!�
ˏE#?V0�T�M����Zw��X��I�Cɾ�mR��rt���fԿh
]��5�o�r?��~||D�
�d�������]��7��*6�������a�J'��-�/r��>�')<�U�^
��5`� �"��endstream
+endobj
+5556 0 obj <<
+/Type /Page
+/Contents 5557 0 R
+/Resources 5555 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5428 0 R
+/Annots [ 5561 0 R 5564 0 R 5565 0 R 5567 0 R 5568 0 R 5569 0 R ]
+>> endobj
+5561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.8284 343.9664 340.9762 354.8703]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) >>
+>> endobj
+5564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.5575 252.7868 188.3803 263.6908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.8784 252.7868 371.2624 263.6908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_584f3fd5a19536644a66818169b16ac6) >>
+>> endobj
+5567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.5575 137.2008 188.3803 148.1047]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.8784 137.2008 369.0409 148.1047]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_b36bf020da4fb4583e6e1a6b94197cb4) >>
+>> endobj
+5569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5558 0 obj <<
+/D [5556 0 R /XYZ 90 757.9346 null]
+>> endobj
+5559 0 obj <<
+/D [5556 0 R /XYZ 90 512.7715 null]
+>> endobj
+5429 0 obj <<
+/D [5556 0 R /XYZ 90 490.4597 null]
+>> endobj
+5560 0 obj <<
+/D [5556 0 R /XYZ 90 490.4597 null]
+>> endobj
+5430 0 obj <<
+/D [5556 0 R /XYZ 107.7135 415.0347 null]
+>> endobj
+5431 0 obj <<
+/D [5556 0 R /XYZ 107.7135 400.4568 null]
+>> endobj
+5432 0 obj <<
+/D [5556 0 R /XYZ 107.7135 385.8788 null]
+>> endobj
+5433 0 obj <<
+/D [5556 0 R /XYZ 107.7135 371.3008 null]
+>> endobj
+5562 0 obj <<
+/D [5556 0 R /XYZ 90 331.0053 null]
+>> endobj
+5480 0 obj <<
+/D [5556 0 R /XYZ 90 308.6935 null]
+>> endobj
+5563 0 obj <<
+/D [5556 0 R /XYZ 90 308.6935 null]
+>> endobj
+5481 0 obj <<
+/D [5556 0 R /XYZ 90 205.0275 null]
+>> endobj
+5566 0 obj <<
+/D [5556 0 R /XYZ 90 191.0702 null]
+>> endobj
+5482 0 obj <<
+/D [5556 0 R /XYZ 90 89.4414 null]
+>> endobj
+5555 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5573 0 obj <<
+/Length 2137      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�F~ׯ�S+�x���"-����ۗ40X����I���d����
9�d;
,�$��9�͙s��
m�`�C�%2��ds���gx��t�Sx��?\/�~�"1�H*���փ$HPB����%!��UJ0��w+��Y}�ݼ[Q��v_��m���Z�Yg������묩�UJ^���w�>����˼���j��է�_o�������k��N���_1�E�7chr���7�Ň�??�E; A�%��
a)�1�!��[+Wd����q�`�7Uy�n-�<�o�~ٻ 
EU�W���_�d�7/}�8 ����$���3�[g�� �t�ug�p�������„�$2�qfd��5IRN1�@� FҾ���o���n��ln�:+��zݮ��-����z�\�k��Wtf�	���ph�2�[%&Hm���U�� MI�cQ� �oV��
84YSl>�Q�z�R� Y4�,�$�
�>o
겫��.w]��ˬ��#�e��lq�� \E<D%�a���E"�ߐ�H��
+>�Uus��[�K���T„K�%S�T.wh_՟;��^-��?�-� �ԯ�s,�1
-d����"
���Z#͌8
���C\�۝����pR����ri��R�&���"��P|�/�m���j[x:��!�%�w��(���+�������Us�S
+�g�3��s���H�¾c�g�=tR�*�lY�~�sQ�Z���p?�;a�O�n�naKl/|�5n�ݡl���Qf�l��
I�_��9�k�}��F|��B���q�f�m���@�r�VJ���=
+&�qMե������AX>���C�kq��� �z��Nn����MSXď+`�|�u%�+%����(�˜�(���RG��%V��TJ�H�~��mE
�j�)FIt�	��z�"X!E�8z�0�v�.����lWlo���P���n6"��L�u3$\`������S�uq�N��������e�"*%%��=Q6e�r�O�(�4����]7��������	u����)crJ�y
+���|F�A�S
n}���`�:����W�#h"b�����u*�0��ѩ�É��)U�5�T=�TSN
��!�\*Y�%RեՅ��
+�'�_�\�9�*Gʕ�,�[{�tR'\Ù�3�9�j�S�	��=/]��CS�J�eʕ���
��.�
+�m���
+V\�`ӣrm��
�W�m�E�,a
+iY;84�8��V�o	�ě�Y���.f��@P).���1;��B̆�N��y@��
 ͉�
#r�g L��\���(f�M���4�l1�1�ȼ���N�Y
	��^,fc�ψ�	���
�^&fg#r�0q1�����Uщ��i��P����֓��`
v
[R���e�"�sӃ
���Y,���q�u�m��P���|�٩��EM�	qq�^�{\�F�3D���%��k�ȭ
�*�|�\
+ӲXV��&���8D�6s_��(�jp��S�ou�2�Hk&.����3�1A����e�1�#eL��)# �Sc�RF��n�r�[���n�if@�Pff�� �8�(���\�YU�M�u��I�׃U;��*@%��}�� n
��;�� iHR
+n�cN�����R#a���*䨫��~�����ێ���FK��C�s�������O��;�k!����h5B�5$��c
c�\�`��9m�i�⸽P��1h.����ȗ5���[��5~,63!5��<;�׃O��$��^�[��ﱴ6�P��1C�N�}���4�w?��&_����#�w]�=
��;�9�FT̨G�4�R���:�
+��ٰ���V�|�LP�[�`��V0�c+����� �)��\�
�uΕ�IW�ͺ�k�V�)�_A�d
8��T�������Pq��C{��3�a�,z�Ė�������WY��*b�S�U�t�

=����a�n�X��.���_����rN�q�ee�2쵥uw�����*��9U��h
h�|

+g!a���'��?��
���^�[�į]�]���WWOOOhs@e��Q�\������
8
+����K�	� �
�N�_B���5y_��X���>��_0�P�
���Gendstream
+endobj
+5572 0 obj <<
+/Type /Page
+/Contents 5573 0 R
+/Resources 5571 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5592 0 R
+/Annots [ 5576 0 R 5577 0 R 5578 0 R 5579 0 R 5580 0 R 5582 0 R 5583 0 R 5584 0 R 5585 0 R 5586 0 R 5588 0 R 5590 0 R 5591 0 R ]
+>> endobj
+5576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.8674 672.7083 187.6902 683.6123]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.8432 672.7083 513.9963 683.6123]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) >>
+>> endobj
+5578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 661.1268 99.2951 671.6571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) >>
+>> endobj
+5579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.0861 643.1288 422.6553 654.0327]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >>
+>> endobj
+5580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.4864 643.1288 511.5056 654.0327]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >>
+>> endobj
+5582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.8605 484.253 187.6833 495.1569]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.8329 484.253 513.9963 495.1569]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) >>
+>> endobj
+5584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 472.6714 138.8364 483.2017]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) >>
+>> endobj
+5585 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.0861 454.6734 422.6553 465.5774]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >>
+>> endobj
+5586 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.4864 454.6734 511.5056 465.5774]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >>
+>> endobj
+5588 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.8284 242.2331 340.9762 253.1371]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) >>
+>> endobj
+5590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.8284 107.2676 340.9762 118.1716]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_cdc0aeddab3d98e336719f42e6e5b06c) >>
+>> endobj
+5591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5574 0 obj <<
+/D [5572 0 R /XYZ 90 757.9346 null]
+>> endobj
+5575 0 obj <<
+/D [5572 0 R /XYZ 90 733.028 null]
+>> endobj
+5483 0 obj <<
+/D [5572 0 R /XYZ 90 576.7275 null]
+>> endobj
+5581 0 obj <<
+/D [5572 0 R /XYZ 90 562.1572 null]
+>> endobj
+5434 0 obj <<
+/D [5572 0 R /XYZ 90 388.2721 null]
+>> endobj
+5587 0 obj <<
+/D [5572 0 R /XYZ 90 373.7018 null]
+>> endobj
+5435 0 obj <<
+/D [5572 0 R /XYZ 342.4706 245.3862 null]
+>> endobj
+5589 0 obj <<
+/D [5572 0 R /XYZ 90 228.6591 null]
+>> endobj
+5436 0 obj <<
+/D [5572 0 R /XYZ 342.4706 110.4207 null]
+>> endobj
+5571 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5598 0 obj <<
+/Length 2093      
+/Filter /FlateDecode
+>>
+stream
+x��Z[�۸~��p_�6sx9�]`�lݶ�4�>e��Ʀg��%�$g2��=�ɒM{<M�m`LR���P!c
��X�q&2����z�Ƿ��ӈ��3x>�o�����c���r|�t$A�:�Z�������x�zJ�$�����)œj�pgu~������˟Li꼭��
+<y�ʛ�ߘ���DML97@�i�'�����G?^u
�������{<^� ?�0bZ��=L0"Z��z�)������

����҃ �
EP��l��P�qSU��L(��\^͵�}[�7>��V�l���S�
<�ʦ�Ӟ:��&�Xe]��Y�KN�B[�,�~�@�@<l���3�q��TT�g �����tGD�
��!I9w�ޘv[�M8��c��xZ[oM�����r��
��
?��Ճ�#�2�#8�L�N
�\p��8pqW4�qaO?$C$R�
�; �%F"��;S&�?��~�6�A�$�HY}
���=�]n��CQ����!�:��&���tmʦ C�F�ʪ=�
J�
��0��=����_Յ)���ޘUޚ0y�-�-��g/���js�d���#�5��G$�д��˪i}��מ�7�G6!0
ۄ�m&�����ϟ'Dek��.&��#,�����&A��ӈx�3�]�&D�%��$Sg(M�"�ɠ�9x
�}�%HQ"¦wKg��	'�����7����l�=�
19�Y
�t��*vJ䤹�7n(��+����H�,��cJ�PN���=��F:S:�I���/Řg�D=5C�6f�#-iMB ��
������̋|U�ˤ�6�#
�.���
�@��S�`m��I� h߹����{0xf�P
:���S��
��C!D��������d��C@�j.��xu���B�촘]�
�jp<�y��Q��'x E�a����������s8���'f
+aݕ���'R,����=QOl�zc���gdL��<U�d(�*���Ɣ�J�����T�I��*48
+�T�O�H�B�Ç�%�+$��VS2)J��׋�is�뮡�+nK�φЋ;3���Y\��]ߘT�F)�U������
�,�1X
i1��?�P�t�Fh/����K�N*�Lt��
+M8�a]�>V�]�K�b�3L���ҕE\(�X���g<�b�o�m�����eQ�jf�(fQ}�"�
P ����u�k=���:���Z�B{z��y�s�
�T�����[pq�Uh����ٍi�)
Sf�%,
KX����D�G
+(��Y��|U,L^>M<"5‚�/"��c�2��e�P  �dv0��]��fg'd�
a�ElJ6� ���Ͷ���
�X�rL�_1��Y@�1��"�j�Y#��ͦ�>k�R��*H_��LQ�1��a�:-ZP�1䟱
Z���c5 C����1x�����A���Ie�A� �����1�]�"̰��h���.M���ۊj�{�v�I�^���֊7�D�mEJ�~
H`��Q����P��+�c��wЎ�Ư�
;��vY�k˗�nw�d������fe�[Vd�k
?:
�aHH1�P���j����`� �c�MK	ˆ�������I
+�)4J�s����_;+�0�%d�t��8n��w
^
C��1pO�S֙��K՚��S	�
H{��n��C�� #abG�
�2d;묊;�p��x?�Jd�
�V�	߄��1v�ɓ�Y&�w��� ����`SAfj�vH.ia}����pӷ�V��e�R��n\�ɽy��I��8:���!�:���"���Pk
+���W��
+9�g�øڃ
����@khY�+u�pu��
���cG��D͵:v2 ��X���Q�6O�O�_
x�)�R������C�z�+u�<v<禁���x>3��}"�s
K~��@�H!?���R�U5��\BA�T�:
�$��6P�ה0��S�4|6�6������t]�6_������.��xS��6
Mm�N���
+H�D�@K��o�8��N��Y�
^YO��V��\^\��ߣy��e��Q�^l6��}�8�f��fݦ^���2�j��2�W���ɷ(m6v�����}V����vendstream
+endobj
+5597 0 obj <<
+/Type /Page
+/Contents 5598 0 R
+/Resources 5596 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5592 0 R
+/Annots [ 5607 0 R ]
+>> endobj
+5607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5599 0 obj <<
+/D [5597 0 R /XYZ 90 757.9346 null]
+>> endobj
+5600 0 obj <<
+/D [5597 0 R /XYZ 90 733.028 null]
+>> endobj
+5601 0 obj <<
+/D [5597 0 R /XYZ 90 659.8431 null]
+>> endobj
+5484 0 obj <<
+/D [5597 0 R /XYZ 90 637.5313 null]
+>> endobj
+5602 0 obj <<
+/D [5597 0 R /XYZ 90 637.5313 null]
+>> endobj
+5534 0 obj <<
+/D [5597 0 R /XYZ 90 600.2452 null]
+>> endobj
+5603 0 obj <<
+/D [5597 0 R /XYZ 90 586.3837 null]
+>> endobj
+5535 0 obj <<
+/D [5597 0 R /XYZ 90 539.1798 null]
+>> endobj
+5604 0 obj <<
+/D [5597 0 R /XYZ 90 525.3182 null]
+>> endobj
+5536 0 obj <<
+/D [5597 0 R /XYZ 90 490.0695 null]
+>> endobj
+5605 0 obj <<
+/D [5597 0 R /XYZ 90 476.208 null]
+>> endobj
+5537 0 obj <<
+/D [5597 0 R /XYZ 90 440.9592 null]
+>> endobj
+5606 0 obj <<
+/D [5597 0 R /XYZ 90 427.0977 null]
+>> endobj
+5596 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F11 416 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5610 0 obj <<
+/Length 2013      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo�6��_�O=�߹-�����Ŷ�}�.�f6Bmɕ�f��;�(Y�)ŋvoq� ,RԼP3����`n�\KM,j�����-N3�p{��W����]�Kɹ%V15���%( ��_o^/ ��
+(��WK����%7���.������w�m��/^|�2W$U^,WL���mR���O��K0
��
����|s���������
+�}��^���
:��n��?����w3�x;��~����in���A�l�d'�8�J�z#�}���XT���p��6ݸ$k������9|q��2�
n���Ή0��!^�f�@�!@�
�l���eÚǧ��e0��B)���s
3X���\��:���E�.�%U������*��q�Uy�(-�:�V�Y%{���
+W
�����p�*<P����a�~�|%%�S9_a[)��iT�8���t�l˘*�ם9C񐖎4:��EM+�D1!�E�u�`l�­æ��T������SiH�r�֩un�L�>F\`����E< �L�5�p��HX���v���,��n�j��f&)\s�w�]^얰���C�fo��ߗL��4�ݺ����V�� ��[��+����p�ݺ`5���0b�5��/#�i��i��^j��c�s�_��\��ܬ�9P�|��ȫ|��� ۴�$�h����
����g$��f*ƈP<^��E����Zm,���,A�H[k�!�܋S��ۧ9�i�ݪs����#py��
+�Y#��7G�ޣ�l
D�mc�
c�֖��d5b�Š�x۞7Agu�TG���>�bU6˱�\�gί�yy.�cO��vI�<���6�\�y$�V��6!��{�6Ǜ��6$��镤��!���;�� *����6�\$h�����0y
+��s3Kvu~ZL%˺T��yD%`=5Z�0Q:�ƺ`���m#��	X)�v'�M{�� �H�f͢_����2�qA� f�xY�D
���� #��ʊwwBX~VT(J׏���S�Q�j���f����u+��
��.�h�5
+�wVbZ!=�&���xn�Nɻ���	�/T�U�;�%�|�f?�l�g��W�7Х
p{v(��"^��K�
�&=cn�i�>U��4"M��Y���$�1ɬM
L5��= �A���
���M����@�����5�p�	
*���L�To)��I�5
�AmT�U
���hxc4m�
�o���)�m���[��:�WJ���#�@��x�/����k~4�)�/�b�5K��`ˈk�

g�
��s�6��)��
���<�����O��{�)��Nap�@�	Nq�Z��1��ǘ&
�Ȱ�\H.zgu�F�'���F�a�h*�G��a�i?��mH#j[�`t��]�C
���&�}�f8�/2	f�:O����;qV��R.���NX3�
�`$
y�4w��B 
+S
.��j���Lo�;t˞�����rm�8=P�ۢ��H�ِ
x�]��hk�x���9C�
�:��F�����"��'�������I�D��
֎Bi ���p�L
�9e}����:,�|i�S��/�1�Nt<��5�ڱ�K���]	�,�
�0K�P/������f��*�(`����������o�=��/����0pl�L�!�E��a ���9���i���˚���T��޸�uKr;�g�K���g��2;�n����-8�Iy	��T{D�gz��[��n?
�5�
+j��q!t�f�3��d����N�}��	��o����p��x��=qx�z=�O�%�g����,��k0i��W\%���O}(V�
�6
}L�0��	��F
��+���pa�~�
�7q�࿥+���rQv��:$���~��\Qv�M���1��
Y�U?;w�?� Y�x�v���뼽�����U�>��gr���U�qu���@�%9d� iu��o�N����i>��Vݢ3[�/z+M����������B�y�U��Y
�ZĔ? �:sendstream
+endobj
+5609 0 obj <<
+/Type /Page
+/Contents 5610 0 R
+/Resources 5608 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5592 0 R
+/Annots [ 5615 0 R ]
+>> endobj
+5615 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5611 0 obj <<
+/D [5609 0 R /XYZ 90 757.9346 null]
+>> endobj
+5538 0 obj <<
+/D [5609 0 R /XYZ 90 602.6502 null]
+>> endobj
+5612 0 obj <<
+/D [5609 0 R /XYZ 90 588.4864 null]
+>> endobj
+5539 0 obj <<
+/D [5609 0 R /XYZ 90 403.3974 null]
+>> endobj
+5613 0 obj <<
+/D [5609 0 R /XYZ 90 389.2336 null]
+>> endobj
+5540 0 obj <<
+/D [5609 0 R /XYZ 90 192.1894 null]
+>> endobj
+5614 0 obj <<
+/D [5609 0 R /XYZ 90 178.0257 null]
+>> endobj
+5608 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5618 0 obj <<
+/Length 1917      
+/Filter /FlateDecode
+>>
+stream
+x��Z�s�F�_�֞A���LgZ��Rʤ�>�Q�
�`K�$��wO'ɒ}V� )L3y�IZ����oo-2��G���P�0.dz������F�~
��K�����W)�I����� 	�������D�4"��ٔ�I�/㋳)œl����<�x�\�q�9=�ͦ6��,�FT���E\~��^�|J�Ħ3
옡fB	��=6zz�jX �$N�F����

y6ˆ-�7p�1���#NYs�������B~�
!�#(CX
+V9���zS�Inge���2�����y�Z���doi��
��Β7S;�7.7���#�b�8�5��<O�S�8ݩ�i��G��(
�cI������K�e�պ����Z�ͯ�|��.��ݎ]�]�2����Ô
+x?�/�Y!0�T�Z�r��3�Æ`^=���hح�
	q���FR��l�DZI��Co�����R2D#��j��.�~�i�0f�KDu
c/�Ҟ�J%�"�(�R����
VH&�ܜ�'IQƐ�.,4�¢��W�Dxy�d�b
+KXj�xpn]��UT�K[�X�rB�ɻ�V�2���J��,I�“î�Tu��Y��=�F
*�UC�Ǜ�osg���X��.�9�� �,t�_ŋ�
d2
��7�I�ܖ�
�D5��NG�
+T�]A۪� ����rk��@B����-���� �P��JPnV6���
���|j�$
p�	��t�)��0�z�e
�rq�L�$�66)7�:t.��'�RO�
�����;İ����zPʑ2bȼ�"ޢ��ql�m�io�~,m:o�6`��6�H�ֿAO`�D[�~��W\b�4Q�x0�>b[�"I5��(]��I8�QP����6�>dT��
��e ���x���9��œ�zL���.��]L �dS[ zH(Q9T�i�ݾv�έK���@��	yE��@[l�m? \�!Y��5Kd�U� �1�3����@	��;dM���_��}KF�2���
s(
�#O�7��D�Im
�[�l1���w�q�<F�mE>�c)��
s�<F��Bx
:#l���
4*=ొ	��U�r�L�I9f�gq���ݦ�=ʮ����� cYH)h(8m�ʏ1���1)Ԛq
v�ը����^�a]p)����Ò4�B6�4��M fe�MR�:"%l-����y7.����p7η�8�d�ww���-:ݸ���q��w��-g���߯�B^F�nͣ�Q���|����H0����7�OlU?:�
�N��lµ����{X��-9�&
r�
��]��-9TV8NrDK>(vے��
��-�}K��[�mGE����a�EXc������na�3db\����S��a
��N5w�F6��A6w�
+%��ͭ�C6���}<�)`�\�8W� �A?/�<���͉6
���֥:
n���Ə �A�[pۓ���
���y�G
�\zs~��I�
��d~<S��C�( q�

a�B��ԏ�
��E20�b��͢�|�� ]pw�p�� \h��T%�Μ*�}�D��>q,��Q��C)�N*?e"e�l�E��s��5M+��H�}A!gR���Gt�z�^��2���0#?aR��C�MM���
��9�
��-��T�}.g��8�C��
܁�4%�_��u��",)���}ss;v?��?���8����_��]���n;�(�vi�Tӥ:|�!p��n�r��fP��T�'7|�i��O5�S
��S��WA€�X�k

���>�>�����ޞo���D������*��l>����Q�����?N������.+�����yі<P�rK���ԝ�'�����P��{�K���q��ckl�B�yç�꘼��~]��ӓ���4+�:MV9Jʓ�jq�����Pņv/j��t鹟CjJ�uO���S�e���$u%�*�{q�~���/����endstream
+endobj
+5617 0 obj <<
+/Type /Page
+/Contents 5618 0 R
+/Resources 5616 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5592 0 R
+/Annots [ 5622 0 R ]
+>> endobj
+5622 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5619 0 obj <<
+/D [5617 0 R /XYZ 90 757.9346 null]
+>> endobj
+5541 0 obj <<
+/D [5617 0 R /XYZ 90 642.6544 null]
+>> endobj
+5620 0 obj <<
+/D [5617 0 R /XYZ 90 628.3529 null]
+>> endobj
+5542 0 obj <<
+/D [5617 0 R /XYZ 90 290.3625 null]
+>> endobj
+5621 0 obj <<
+/D [5617 0 R /XYZ 90 276.061 null]
+>> endobj
+5543 0 obj <<
+/D [5617 0 R /XYZ 90 89.4414 null]
+>> endobj
+5616 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R /F11 416 0 R /F97 1774 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5626 0 obj <<
+/Length 2228      
+/Filter /FlateDecode
+>>
+stream
+xڵZ[o�~ϯ0P`j5��%���v{���d�f�b+�P[�Jr���
J"M]L�u�y���x���s!yDf����3%2���j{�g���+Ҿ^��e������3���rv�PK�	J��v�eN"f�$������&w�w�קt]$w?g�ER���|H�H�]q������bI��Iʲ��S��
��i�J�T��
T-���x��[O���`�X�^}��gk�ϏW1���
0P3t��┹����߼��E=`�
��s�A�R0o�8"�5JY�onve�L+�9+����v��
v~��		)����r����t�S�
!-�,�)e�P���
+�d�I/G�3���-�o0��|��˪�����v��O�
1��p�(N_56���ɐ�Yrb��T̖`h#��_�t�T��k3�
��G�$弆�z�����6o}!���o���ޭ�4��*���O0���z�Z�]

����ᱱT�nG���:a��nA��%������nқϗ#
+f9����_;� X"�4�RjkS*���A�:�΃&��
���t�ߠ�'��z�z�i
_2$��>ӌ�
�`�4
��fT�=tVwW�h�c{
��,_m�t$�C�h�#�R\���#�	��p�􏑹-�B��AP�!J��j������9��ę�9,�\��u�^
�k��H
�&`��xl1�BOs�e8`��r-��l>��n�0=��	�F�������,;+9�V��}�=C�Kc�w�vU�/a�tm�
$��~W�j�%�E��e��Uz�D�	�܌ق�Ca
�b��!�5����O(ɐى�_�ץލi��a�f��~
܅bInY�t��
+"�2v��s.�Z6���#-G
��
�"�@$){�dV�j<��	�./w�6e���I�Ϝ���W���0�[S�ی;�~w��b`
+�����
붴S�
7��@R4n4�!�l7�K�!��9N@�	H^O��!4g
V׋6���(�\��l�zNۧ$RW,���M��z�BD�3I��%3
e���
q)����p��V
�_����C���g,P'Hc8;�
+�	�
���0��|�
�#Qv�a7UY�J�m�QS
���[�nK=�<T�2D/r�@F$L<���>}H�v;^}qX�#�jl���m��$i�*����_��Jek�=y��N� &?�� \�)�v�i�^��qvޫCv�{u�i��qޫ;�n�=��
L+�S~�
?Ac(�c�
�%J�m�QS�%F
+k�U��1�Tk�HsI\�2"q�a�շA��Cn	g�MZ�=i���U�����7��bٝ�6iZ�vs��@:4b�d�{
5l���Y8;Pi�TN$�L����;��;;�`��K]
M&���3A��P�9����
�$j
+��� ^�F�
�=�ф Oµ�(!2b	���k�b�
Cs8[��߿.��� �D"���#�-C�Ba�M���M�f ���쳣b44;�0�#W	�k���#��`��l�
5eEc5��y�w��`��ENȈ9��5����Ί1�u�hi/�&|ӡ&]3w�gƩ9XH���T�8W0B����1]��˄��u�Zݮ�������Dg�A�9���'���� &ϝ��Op�K=g����<��
'��DB�^/�k,�E�e�EG	�,ӂꋢ��
s�[:�����hց� ׄ�e��
+	j�n-=l:�/O<qv>������v�]e��}�J#!T�'E
�N����L�t��r���;�v�+
��zR��ң&(PA����-����˙���`˪��(p��q0K�SZ
���<Z�s+��?�+[۹�T�W��=��=5LB�p�Up�t�i�FΡ
R�r��-<<�R(G��(
��~���I%&�6
܁�HKbB��P�s����î�_@���HW��O��m#i2lF�`����
jJ��H	�zf�� �#խ@D$�
�	�m��p���M/��/b�W
.�/!�C�EI�v���u�}�:��^�v���52
�}6��Ű:D
+y�wF�w�B`;.<,�b�m�8�/O|��}t�����6��i�W�-Kk�_���l��$?[Qiq4	P��"���j��?���H����t�Լ��o���
7`�pM��r�ğ�js}���V%:�پ@Yu��o���8ƐR�ZGVo�A.
�sL!ܰ�p���h�#���m�Y���Zl�� �
�endstream
+endobj
+5625 0 obj <<
+/Type /Page
+/Contents 5626 0 R
+/Resources 5624 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5592 0 R
+/Annots [ 5629 0 R 5631 0 R 5634 0 R 5636 0 R 5637 0 R 5639 0 R 5640 0 R 5642 0 R 5644 0 R 5645 0 R 5646 0 R 5648 0 R 5649 0 R 5651 0 R 5652 0 R ]
+>> endobj
+5623 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Generator__System__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 5653 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 329.00000000 34.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 5654 0 R
+>>/Font << /R9 5655 0 R>>
+>>
+/Length 5656 0 R
+/Filter /FlateDecode
+>>
+stream
+x��Q�n�0��W��^\�q�c��K+�ȭ��4	�
+C1���Ά�
�֏�z��P2�m��@3'�{J���D�`w�l�1qL�=�DliNJ:�+��%�KB��)�g,���]>·Gd��p�A< ��Q,�������kE�nR�P�����j�X���{��q4��6V�m,����
��=4�W�q��P��8�ϜJY���`���X�\�7�6\�
�@���N��Js �Ү�R��]��uj�E�T�r+�ՙk&`����H�
<

p�~c����7ɮM&}f�e�m�l�P~m����,�� t��endstream
+endobj
+5653 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142733)
+/ModDate (D:20080908142733)
+>>
+endobj
+5654 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+5655 0 obj
+<<
+/BaseFont /XQGYTO#2BFreeSans
+/FontDescriptor 5657 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 556 556 0 0 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+5656 0 obj
+312
+endobj
+5657 0 obj
+<<
+/Type /FontDescriptor
+/FontName /XQGYTO#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 5658 0 R
+>>
+endobj
+5658 0 obj
+<<
+/Length1 56440
+/Filter /FlateDecode
+/Length 5659 0 R
+>>
+stream
+x���|�����eJ���Ph�bY��nɶ�h��:�3��S�ҽ7�{���{���{�'K_)6?C�}��'9GGG�{�:�{�e H� d� �&Z�Ϝ���7��_;�������o&����b
5���~���@gp���	B8�;���bM�
�x{KϘ��
#f
�����~�u�V��ǽ�J����q���E}�v�=,�c痢���/X��j�/C�}�J��g'��;A\}��������E�%����j��?��,��t
�8q
��g#}�Z�
�z�W&׍�K��IB ��N
�t�X�\:C��
�,�*y"t������K� =F��>�>�؈��J#ѻ��K��$�q6t�P�۠��V���bErs�,���B��k���1���c��
�#�
i���y��蓠��a�E�=fC�#�YL?�&JD1@��k�h!4����Ez�N7<�%ʞw��fzOמZH�|[�^��'�D�g�=�U��H�R�@!�Ym�Z[��j��o��-��-3K�Յ�r��-�;r՞R�{(ę�U$*���+zڶ���+����.�
=����]�Pk�Lt���=�VOn�T�A��]#���s��*�n�ܕo�Olm�QzО�%'�'x�'�&%��7׼;e��B
1���YxסmcDhz���-�C�rū~˸�=5mc/3�2�e�
2�ߵ8�=sM����k�n�Ż
+ڦ�]^Q9�Rk���O��v߫�����i�l_�=߼�L�����.xe�{W��2�����|K%�R�l�v�TZ:��l�dW9W��;Z*�m���Ֆj�e��-���|9Whٮ����޲MO{�X�{�t{aT��11�����;�
���OD'O���$���]M���4��Z��xҤ�
N�*�O�:vR;F䤮����joa�
���h���y %��6\��y����۱��g�]���=]��h//��]K^(h�=�{�練�K
�^{,j����Wi)-ȗ�6ʷr{
�t��<�W����J^��� %��y~#������[!�Y�.�;r�B�w��
��T{���K�����
>j�?D����B�9�f%�}�Om ��J�F���%r�Z�=��WrίU����?K�":�&b���O�I{Y����
!�Ǘ��+c�0/O'V���Hb�1�X�X�X�X�X�X�X�X�
d
�61֛��������
�
�,9�
d��A�^&I��-���N��h����[x
e��y3D֛ғ�)�T����|[�k�{
���)fz�q��C�;;;�x���;1��ë���E�!ġ�=ĩ���aı���9���
�
E�I
L�D�H�D,&N#� 
"�%~ �%�$~!~&~%.$�!� 
�x��k�㽆}�k�lj'��<.z�x���k������f��8�x�x�x�늯�o�#�n��֝E�|�[��:��g��׍
�/��R�{�����y+����o�;I��H�H����%�L*�Jƈ=F�@'IrEr9�
E�D�&W&W!W%W#W'� ~'� �$�"[�1���Xr
��.9�\�\�܀ܐ܈�@�I�FN$'��d������$M2EZ���&�ć�G�f���䖤M:d�̐Y�%'�Sȩ�V�����
�6��4r:�
�=9��I�"g{k�O�
�9��N���.��n���\r2G���d�';�.���!����K��)��G�I��
+Y%���Br9@�E�M�C�K�G�O
@
H
D\J
L
B
J
F
N
A
I
E
M
C.&�%�#�'O O$O"O&O!O%O#O'� �$�"�&�!�%�#�'/ /$/"/&/!/%/#/'� �$�"�&�!�%�#�'o o$o"o&o!o%o#o'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!�%�#�'_ _$_"_&_!_%_#_'� �$�"�&�!�%�#�'? ?$?"?&?!?%?#?'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!���R�IJQ4�P,�Q<%P"%Q2�P*��Q+Pé��Hj�5�Z�Z�Z�Z�Z�Z�Z�Z�j��PkSc�q�:Ժ�xj=j}jjCj#j5��D�RqJ��NT�2�eQS�P�R�Q�S[P[R6�Pi*Ce)��LM��R[Q[S�P�RӨ��v���
j&5��M�@͡v�v�v�v�v�v�v��R{P9��j�:�<�IuQ�T5��O�׉�^�H��>jO�-�m�
�}�
�=�LU�*�O-�R��j/jojj_j?j� �@� �`��P�0�p��H�(�h�j1u,u
u<uu"uu2u
+u*uu:uu&uu6uu.u
u>uu!uu1u	u)uu9uu%uu5u
u-u
u=uu#uu3u
u+uu;uu'uu7uu/uu?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%q��5�
�-�
�=��#��3�
�+��;��'��7�����K�$M�4��,��<-�"-�2��*
���+�����Hz�=�^�^�^�^�^�^�^�^�n���k�c�q�:��xz=z}zzCz#z=��D��qZ��Nt�6�m�ӛЛқћ�[�[�6��i:Cgi��LO���[�[���������v���
z&=��M�@ϡw�w�w�w�w�w�w���{�9��n�;�<�Iw��t=��O�^�H��>zO�LW�*�O/�ҋ�z/zozz_z?z� �@� �`��P�0�p��H�(�h�z1},}
}<}}"}}2}
+}*}}:}}&}}6}}.}
}>}}!}}1}	})}}9}}%}}5}
}-}
}=}}#}}3}
}+}};}}'}}7}}/}}?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����!���a������Q��1Ø��̊�f$3�Y�̬ͬ¬ʬƬά��ɬŴ0c�����8f
f]f<�
�>��!�3���LbZ�8�1	Fg
&ɘL�����M�M�͙͘-�-�q�4�a���Lf�0S�����m�m�i�tf;f{f3����fv`�0;2;1;3�0�2�1�3s�=�
�ƴ3
L��d��n�����g
+L/SdJL�'Sf*L��g0
�E� ��7��/��?s s ss0ss(ss8ss$ss4s
��9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�����������������������������������������������������������������y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�����������������������������������������������������������Y���,�R,�2,�r,�
+��J��*����a�
+�pvEv;�
ŮĎfWfWaWeWcWg�`�d�b[�1���Xv
��.;�]�]�݀ݐ݈��Nd'��l������dM6�Z���&��f���얬�:l�ͰY�e'�Sة�V���6��4v:�
�=;����bg�;�s�
ٝ؝�]�]����ٹ�
l�mc��6�v�]l7���c���-�%��ݓ-�����
؅�"v�݋ݛ݇ݗݏݟ=�=�=�=�=�=�=�=�=�=�=�=�=�]�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾¾ʾƾξ��ɾž;þ˾Ǿ�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.a����(����8��N�$N�N�b�0nn8�"7�ɍ�V�Fs+s�p�r�q�skpkrkq-�nmn,7�[�[�ϭǭ�m�m�m�M�& [...]
+W����Bn7�������������
�
�
�
�
�
�
�
�
�
�
�
�
�-����N�N�N�N�N�N�N�N�����������������.�.�.�.�.�.�.�.���������n�n�n�n�n�n�n�n�����������������
�
�
�
�
�
�
�
���������^�^�^�^�^�^�^�^�����������������>�>�>�>�>�>�>�>���������~�~�~�~�~�~�~�~�����������p��O�O�
��
��/�/�
+��1~�?�_����G�+����U�U�����5�5���~
�6?�ǯïˏ�����7�7�7�'��I|+�5>���'y�O��1�	�)��9��%o���3|�w���~*��5�
�-?���o�o���g�����
~G~'~g~~W~7~w~.�����v����|�������|���|������|�����~!�����������������������������������'�'�'�'�����g�g�g�g�����������������W�W�W�W���������7�7�7�7�����w�w�w�w�����������������O�O�O�O���������/�/�/�/�����o�o�o�o�����������������_�_�_�_���������?�?�?�?�����������K�B J�F`N�AI�EP��0LXA.�(�F
+��������*ª�j���š�ZB�0FX[+����
�	�

+	���$�U�
��t���)�K�X�D�T�L�\�B�R�GH
!+��da�0U�J�Z�F�V�&L��f3�Y�laa���������������0W�C�	mB��!�N�K�z�y�|� �
+E�$�	{
+e�B�H�$T�[�ۈ��~�f��aq� q��PXD\E<*
{	{
��
+�	���	
+w

��
+�	�
GG
+G	G
���c���������S�S�ӄӅ3�3�����s�s���
�
�����K�K�˄ˉc�+�+�����k�k���������[�[�ۄۅ;�;�����{�{�����������G�G�DŽDž'�'�����g�g���������W�W�ׅׄ7�7�����w�w�����������O�O�τυ/�/�����o�Ӆo��˅�������_�3�_�3��߄߅?�?�K�������%¿"A�-�"%�"#�"'� ��e�D
G�L�"ʢ"�bL
&� WG�#�Q�J�hqeqqUq5quq
qMq-�E
#�-�lj��������
�
ō�	�Dq��*�EML��h�I�S�%n,n"n*n&n.n!n)ڢ#�Ō�]q�8E�*n%n-n#n+N��ۉۋ3ę�,q���8G�Q�I�Y�E�U�M�]�+�!��6�]��b��%v�=�<q�X{ŢX��=ŲX�b��@\(.ĽĽ�}�}������Ńă�C�C�����#�#ţģ�c����q���	��I���)��i�����Y���9��y�����E���%��e�
�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_��H��h��X��xI�DI�dI�T)&
�V��K+J#���(i%i������������������"��֖�J�u�u���z���҆�F�i�4Ij��&%$]2��dJ)ɒ6�6�6�6�6�����lɑ�RF�J�4Y�"M����������Iӥ���Li�4[�A�#�(�$�,�"�*�&�.͕��rR��.uHy�S꒺�
i�4_*H�RQ*I}ҞRY�HU�_Z -�I�^���>Ҿ�~������ҁ�A���!ҡ�a���ґ�Q���1�b�X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�i��LȤLɴ�Ȭ�ɼ,Ȣ,ɲ�Ȫ
���+�����Hy���<Z^Y^E^U^M^]^C^S^Kn���k�c�q�:��xy=y}yyCy#y�<Q�$��qY��.rR6�l�˛țʛɛ�[�[ʶ��i9#geW�,O���[�[���������v���
y�<K�-� ϑw�w�w�w�w�w�w���{�9�Mn�;��)w��r�<O�/�^�(��>yO�,W��//�ʋ�y/yoyy_y?y� �@� �`��P�0�p��H�(�h�y�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|��������������������������������������������������������������������������� [...]
+J�RTJJ���RV*JU�W(
�Eʀ������������r�r�r�r�r�r�r�r�r�r�r�r�r��X9V9N9^9A9Q9I9Y9E9U9M9]9C9S9K9[9G9W9O9_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_y at yPyHyXyDyTyLy\yByRyJyZyFyVyNy^yAyQyIyYyEyUyMy]yCySyKy[yGyWyOy_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�GY���*�R*�2*�r*�
+��J��*����a�
+�puEu�:R
����VWVWQWUWSWW�P�T�R[�1���Xu�����:^]O]_�@�P�H��NT'��j\�Ԅ����TM5�Z���&��f���ꖪ�:jZͨY�U'�Sԩ�V���6��4u�����:C���Rg�;�s�
՝ԝ�]�]����չ�
jNmS��5�v�]j�ڣ�S��W-�%�O�S-�����
ԅ�"u@�K�[�G�W�O�_=@=P=H=X=D=T=L=\=B=R=J=Z=F]�
�
�
���������������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�ޠިޤެޢުަޮޡީޥޭޣޫާޯ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>���������������������������������~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.Q��12F��cc\��	11&��Sc�ذ�
+��c#b#c�b+�F�V��[5�Zl���5ck�Zbcbk�����։�[/�~l�؆��bbc�b��xL�%bz̈%cf,�b�6�m�,�yl�ؖ1;��ұL,sc�cSbS���@_���T)uV�=-_���\{�T�s���r~A�����K]�b~>�
��n�)���v���A]Jw�����|�*�G*�i�Պ�D�+?W� �0 �}!e
�G*�E�@r٠ļ/��uAu�5y���HU&��z{s�誻��ԕ�=�3S�re����M��:�\�/���Ij25�IO�tSsO ��[Q=���0�
����Q�o��*���B�����m�k�湂/�m��
+u�6A|�l�՞)x��i�����i��럟<_
����;U.y����|����ʗP��A�K�P�w��r���B����꯸A
� ��1��c��P��੊/�u�X���bOk<�A&�Y��ՠ
f�:�Z���AG�
9u�G]fu��;��S�b�k���
�꯿�g���1W��Ÿ�NߩNԹ����
i����W���R���.�
+�D�S	H
ҀLB��)H
҆t Ӑ�,�H
��-�Z���k��\
�p-�Z���k�r��ݥr�-�~6u��m��
l�6�m`����m���eg������� ��l��
`;�v�� ���z:h�4�7
�4���K/
�4���K/
�4���K��i�5
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,�����`�w�V�g��z�Y�g��z�.�]��@w���E�]๖d�2E0�s����@��A�^)�*݁^��R��V�8����!
�$�	��� mH2
���B�����?�8����?���̬����Y�պ
<��A�

ꨡ�ꨡ�ꨡ�ꨡ|
�'P��@
������o�����
�g >���@\�2��x��K,�%��^xI�%��^xI�G�O/	<x&�L��3�g��	<x&�L����z��7�o����4����_�Ki�/
����4����_�Ki�/
����4
��/
����4����_�Ki�/
����4
�6pm��4p���axA/h���|�!?k���U�-�{�M�sJM��%Z5�_��YtH2	iB���Ri~�����)ҁLCf ��A�	��I�$�|�@>I �$�OqDOAZ���?�8�K�%	
���xk��|��p�2H4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I �$�h	��@�	��@�	��@�HH	$�F6�	���L�Y�Z*�*jGO����T�+�.�u�|U�K�|!ߓS�}�
o�雅l����)�{{j+��bv��4�7�8
����X�q��
;9��� 0o���ٻE{x�nOcj��ֹ������m��Q��S���
{xD at m�C��.�3{�zs�\?�h��{���]�'��-ej]D��^K��!�|}��a�{���o|4���<�V�\W�rlG�P��(�٫V��ͪ_�Za�|�j�jA�N�*�S�z���_?��]�*���Y_�U��������{?�%[�5�R��Ö
+S)��Z}���^c�21���K`
�����Ξ�x�G��f�#M����z����43�R�f�Z2B���[3�%Ċ�Q��xTZ<*M�=�X�"֢8��<-�S�J֢����DTr"*9����"a$"�D���0F"��#
=��#
=��#��v�#
=��#
}���'����d�D2zŒ�2�X�(3�ŌJ6��ͨd3*ٌJNE%����"�T���0RF*�HE�#aX�aX�aX�aXV�1����X�h�x#-í�H�#͈�d�����4
��܈�#�����ݸ�U��U��U��r��8�>��X����X!�a�X!�a�D�!F��t��t��t��t��t��t��t��t��t��t��t��t��u��u��u��u��u��ux6�
�ag�cg�cg�cg�cg�cg�cg�cg�cg�cg�cg�;�w���������������������������������������������������
��
����
��
��
��
�~�3�hL��
 c��c��c��gBd�
{|
{|
{| [...]
e
R�L@�d҄LAZ�6���
ƨ������������������������������������������0��75�k�׀����������m��
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��f"�A=��M�x9�D�7��M�x9�D�7��M�x9�D�7��-�
���8�0N,�
���8�0N,��5,ρLCf ��A},�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
�@��,
YOƓ��da<YOƓ��da<YOƓ�qda
YGƑ�qda
YGƑ�qda
YGƑ�qda
YGV8��V��V��V��F��F��F��F��F��F��F���-�,�,�,�,�,�,�,��[X+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+Xf2�V�۞+v�sm=Ŏ~ٻ��+
r���
z*�rW���� [...]
+M���?����Z{�ˑ_>���L���>Н���\�:���{s���_�y9��@Њ
JM
+=��caa�@�5�^�r��S*���\X�6-��۝�~߭�g��ҳ�v��_�/���tuWkŞb�V�foO0�|�-������k�F���b��\����Z�E��BVwQ�W*j}I�*^/��qo�l�
���;6x����
�c�wl�
^��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�
���6�����a�7l�
���6x�O���`�l�
^��
6򾍼o#����6�<m#O���6��l#��ȳ6�<k#��ȳ6�<k'�r7�<k#��ȳ6�=��=��=������������m�l|�h��D'f6>?���������1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
����S2�d6N�l���8%�qJf���阍�1�b6N�l���8�q*f�T��i���0�a6N�l���8
�qf�4��i���0�`6N�l���8��q�e���Ʃ��
%����3&gL6Θl�1�8c�q�d�����3&gL6Θl�19�{򞃼� �9�{����|� �9�o��� �9�k�|� �9�c�|� 9�;򎃼� �8�7֧򎃼� �8�7�|� �8X�:�;�q�
�(y�A�p�7
�
y�A�p�7
�y�A
p�
�y�A
p�
��;��濃�q����w0�
�s����v0�
�k����u0O
���`�:��楃y������t0?
�^;��槃��`~:��桃y�`
:8uv0�
�7��曃��`�98-vp6��l��ٰ��ag�i�O��F���?i�O��F���?i�O��F���?i�O��F~N#?�����4�-�~K����4�q�8�|�F�џi��4�q�8�~N����4�1�~L#/�����Ki�4�Ry)���F^J#/�����F��Cj�	H
ҀLB��)H
҆t Ӑ�,$����?�8����?�8����?�8����?�8�5�k�׀�_�|
��5�k�׀�_�|
���O ?���O ?���O ?���O ?��u���ׁ�_�|
�:�u���ׁ�_�|
�:�
��7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�����_�bN���B_�s·Fą�<�~
+�)ী�~
+�)ী�~
+��P
��P
��P
���o��|
�6ʵQ��rm�k�\��(�F�6ʵQ��z�a����z٨��z9�w�� ��|��
�;�w�� ��|��
ু�~�iু�~�iু�~�iু�~�i�g��~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�!���w��N���@w����
���
�v��.X�K�`i,킥]��
�v[��lH2
���B�q��.X�K�`i,킥]��
Vv��.X�+�`e,삅]��
v��.X�
�`a,삅]��
v�®�~`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
�u��.X�5�r?X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]���^
+x)ी�^
+x`M��5]��
�t��.X�M�x�/X�k�`M��5]��
�t��.X�k�`M�>�ӵ�o��|��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.����`U��U]��
Vu��.X���`U��U]��
Vu��.X���`Sl�M]��
6u��.����`Sl�M]��
6u��.��{�`O��=]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]��
�t���
<x�I��]��

8.p\�>����0;ϙ���C at l��K�=]��|G���[Q{i8���_��k��,W�
pu�%b�b����b!��ȗs"����/���KE<�'
�$�	��E�\oG[�L u<��	
O�I
�Qj�U�����1�J�s��>,
+/�JϢPW����+�����H�E
������?ҫ
#��H^�
^xD�xD��DW~�C��
�/_�WsA��荘D����K�9XTk�`y��t ����rn~��
C�6N2�ѳ���0��5Xrx��Ó6$�4`K
-
,-<�P"!x�W��)w�^��J%�e |� 
@l�I[��[��<�+r���+~���#8�DhI��Dhk{R�D<IēD<IēD<I4EM�DS$�k{�&�M��7�o��	|�&�M��7�o��	|�s�ria���}��O�e��L�͎��b��y�#­�k�Ԟ\����QT�B�0)���SC�/2�]�{ղK� ��T�dR���|o_u�炷i�6��*�/�{k_��Ӌ/Lj�
*��^��BCP[|{S÷5=�+9��rOe~o��
���K}�r����\����
+����\��z���X�e���'�=
|�V�7,5|�ғY���Ng���+=�=��3_M
V���r=�A"B�2|ѓ	?8���k�XxQ���J�/��}��`XkV2�z�
՞�€�9��k�bBC��U�U�k�B�/Rۂ�K�
/0M��mzj|����u��i@&!M��iC:^���f ��n�!1��<�A&jZ�B�#��Ys��
C
1��Ru�!�@u���B���`
�!$K��@�44D��ih~ɺ��4D�,�W�5�j�I?s� ,޵�𮵆w�5�k��]kO�u 
V�l��ek
/[kx�Z���^��𲵆��5�l��ek
/[kx�ړ� t��=Eӡ�PѠ$��'�h��f�έP��9�
+}"�
�d�)�-=��G�a�Z�
9�%�a<z�
����Q�r0B��
+���A����)4����(��G#���)����&N���]U���>�8�.�vU�jp�P�t{k9���w���e��-`[����:���`O��4$�-�[�����GG[i7��\Пa����M���'�e/w�탖��ro���k,�����H�F���4 M��iC:�i�
d�
d@?�^pD�I���CG
:���/	��tĥ#.
q�KG\:�����
�e � �|��
��7�o � �|��
��O?	�$��O?	�$��O?	�$��O?	�$��7�o��	|�&�M��7�o��	|�&�M��O?��S�O?��S�O?��S�O?��S���o��|
�Z(φ�
?~6���8m�i#N�و��E�6���8
�� ��|��
�;�w�� ��|��
�;�O?
�4���O?
�4���O?
�4���O?
�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?
�,���?
�,���?
�,��w����
|�.�]��w����
|�.�#�,^����,^�v���ɓ����@f!�@��ɸ�Q��^
�'���/�
lgO���:;���
��?q�J��W�\����l���#X��x�ɓdR�
�Qb�<�d
+r�k5�Wr��4$�V�.^�r�'C1$C"�UUQ$��v��Z�A
�U*�P�x��ūS�D-u���v:��Q�
}
�5,	:ꦇHA�\7S{ӷ��S�_�Vq���U.���%���no�(o����
��}��+uz\���������1�-��\ʃjaP�_���;j���k���=��]���AT�^WʼA�y��

�ժ_;�uN

�7j/�>]�{���:�A�8��
:��9�
���̽����Z
T
��U��T]��:�r�N��
䆅:^@o�"��=��}uz��3 2�֙�6
+�{U ���i�;]���ah
�`�V=E�n�::`��
���;D��w:‡BC����
}0�
m0�u�W|�^�
���T��N%4���<��u���6������{�%h�j���U�{��(^�H�ˑ�
�I�jA)E��
Y@�ޠ��h����B�
+z�
�#��pR�/��^���v1h�.�����P�U/uPG�׮���Br���]ZC%
���`\�I����ڃ���F�_����I�[�n(��7�.B�M�BӼn��Z_ʡ68�{��܅�\�G0����"&��ݡCGGh�
�g�
�|���":��/�T��L&&�U���
�n
]���n:�Jy�"
31
1
�#��#L�
����x����b��b:c�ԥ�����a;
f��5��P
�m1�Eu9��G�+F��3ŰvŠv�f�"d6���
*?
�_���>�^�"d��९j5Ld$�y�A�mQ�msQ�6�c[��C!L~A!�H;�a�{�v@q�&�>��O��V��7ȳ��-�E��ېl{����
+���0����`D�aQ�{�p0���W!;B�n�`@
+�DQ@���AB�)ݡ�*�P�
�B�
A6�)h�~J�tT"��r�b��z<�	fy����vNM���ꈬ7��f��'��2H�07������%�(/r��Dӭ28�*ါ�-�
+Z]]��V	��2�O���k:��ZCl
�^���;�,�A��#�k
ɭ
�.e��%ma�o
|[�|ېY�2������YS�)�ph��3m��ҋg{�%M��"S<�m�xlCs�t��P���:.��f,�����Q|njxQw�P�Pwk^�S����ߪF�Ԡ��b�6��1SG}

Et4��X��*j�
|?�g[/���:�a��Q}�a�-u�P��i��jkx������)5u�j�nx������V�
�|�
+�uq�[���/�� 9TQᕆ0*�
m_ˆ
7�
+
��Vp{���(�J
b]�T�:�vNpQW�JC�+���G
+oo�wP��*�-�6c7⪕�}AT����m)�68
4��,Q`���Ec��*��u���믊]������ʘWk^c�W^ĕ?M�
�^b��Y��՗S��6�KGC�
�����k�k����p���b���\Q�/��Po��96\4���
W
�"�h�����P�R�����m�HZB���v��8,f�h��S)�6v�����'*�Tk���4֞���s��2�.j]�Â��O�����x�'.�N
�4�O�RaU�D�R���Dje�f3TR�YL�����V?� ����������e"=���F���<�魡�ZS�[�61׶�u�x��i0����
3�OX�����^1�k!f���R���
+
+��F�
+�s󻋸�n���7�M��ct΅qb_9_i�H�F�
p���j�H6)#nוz��2F]�3Tڐ
Fv�2�!#M-�cd㝸�EK5�8f�~�o�T]���ڥ�#�l
�d8��F6C��lfL53�
F ��ȥ�^�#�f�l�qy����ڐ-�
ق��l$�D���
+nd�x&.'�Fc=Z���R��9����f�8͌�zDk�#Z���m�M��C�
+3�֤�D��M4k�D��h6��1�l7&a�l�59�Y{5�[�55�Y�5i�!Gk�<�8ߛ��ϔq���GrHsH��H��G<=�܌={�Cz�Cz
���#;��;�G���f��塵֣�.�V�/�h
���fs�I5�{ԇ��G5�� F��|
WK-f���7Wǭȵ��k�[w
f�x�����.���,�h�a�x�h��=T�PI��*�P��_j*��������p���M\�뻡ɢ%|.����k`�50�V�hX��&���r_w��k�0"]4��#�V��N$��a��0�db���
%�[����-��-l3D4CD3D4S�,{0G��&
_���V+��LԖ���,7�sI���1��،���[�4��r|���df鱜�v#
-�c�%}|ȍC8����c����Kcr_�G|����jpM,�u���ƥ�rbrۧ-c�y
9�!�F�o��7�C�MbȾ	��i2�4]"4N�z�m�siX/4�hX
��T�`Y�{��
M3~��������%�p��a�fa.o��#�
�a��tO����Ru.ci��Fi���3�(�֟�%�
	}�lܭ�+.���xF���a7Z
a�^r,6�
��C��;&Q3��
���{�?�cp��ݍ�uG��p�cjm�x���M��l+�;]�t��d3��̘jf���͌�f�l��hfԛ���n��,x�Y���جFv��Mk�61:Z3c��;ͪ�4�8�Yݝfuw���K���(npzNl�
s�����ݝ�����
����Z�N�D�n��)����
�C���ͽY��q���{�?�/57�t�oUm�M�q�oU��cU3��=��ܝ�kU���BC��>��S�fF���n0�Yj^օ`՝KE
ˎ+
>Nvb_�ZY*S���1��MʂGf�
�
Q�C�u7�i��ݴ[�w3�����n֭m;9T�vr�dz�e/}3����rn:���Ͳ�-�S�Qՠ1��j�bɻl/u�'$&�'�w`��_3���I��e
F
rDz�R��Р��p�J�͘`9�ץغ
і�.�~l6�@tWs֫�P}��Y
��i��r���
�
�!=�!벜 [...]
�g9�ka����Az"
*Z�$B��d���

ߝ��n\��w�2ÏM��c=��D?6����0Z#D1�h�0Z#Ѹu��[�d3��̘jf���fF��1�̘if�63�M��ph0ƛ�f�D3���ج=�f�i7kO�Y{�͚�n�tv����5�ݬ��fM�4k:�Y+9�Z�i� N�q�5�ӬA���~C-os�zco6�
��џ]������2ZM�8����<{<�vq#*z���
sL�Hp|-j�<�5�FC�d|y�kC�t��u.eH�-��e�@��u{,|di׿.h�Ռ��Z�&�x��
U<k�ñ��V3����43f��͌n#N|�2j͌�fF���Y���RF���Y+i�$-el� Z�њ5H�Y�$k�!l����f��ڬZ�5Bk�Fhm
+ԬeZ�U-ެj�f�o֭a�
�k�a�h�L͒DS����4d���!Q��CG}/�A<A���
g�
C���S����C��_�}�‘�5�<�[�x�Ψ������+�$��/�W��q�w��X-���c���1Ƙ�c�s<7�e���n��N2�2z��c�
��صy�
I����z<��!���*
L�����.��7Rr�����ƕ喇Ɲ2o�'ǝ�R��p�/��w���/���G_M_u9z��/�'W�b��
n�r���\��;�
��� �
�
+��5
5f8�F}��
�+�t�g�jx���*��Z�^�^���xQ�c�z������7.��>��
]I�}$�����[�v.�0k=�?���Wn�Yҹ��s�J�W�m���w�M4��Z�RƯ3n�n6���^�ٕF�4�
���D�D�M�=y�%�6_�x�[�.����N�B]2k��]��ڬ�
^�j�Ӗܰ��O�o�.�d
>y�
+mې+��`�e՛�����nm�����9S�����~�.�u�ݿ/-9�9��W	r��9��Ē%��^k���=�����-	b�k�p/&�SGqc��B�u�'��L7#��:��v�9U;T"�d|�Ѯ��8bʄ��J��'�]��ݝ��
]g�CZ�
Ժ�m�a�g����go��9���l
�^����ڵ����0~ν��(�+�F��RKWD����<�S�%��
���
2T���P�3nt5v��^�-�e���2��l�?��X[���"g2��{~��=�����}���?i>��YX���G�-��/t�
�뗹VKí��u)�I$����^$�:�@��FA`����`��]��@�p��^��
b����]�Gw0�<ڑ�X�Z۞����Z���N�L�~:�i
+���=:�^[Wc�]�Kd�����21�r����
��se��5G��������H�؆;��ʳ
Y�U������R7��X���z�BJf
o�9w���Qw��>�j�R_��?")'�," 	��M�
��D-_��T�<Qz;��f�)�de�/Mumͷ>oJ�Y~�
+������X���$7��ݩ��-�Ӈ,�=��_T�/�+�ۖYn�Nr�&��`��3�t6�^�S��Ȉ7����|�)�H�k_��ږ.�\{�>ЧZSn{Z������5�
+M�A��ؘ���
i1����s��,^m"�"��i$\>YIb��PC2�����0P���П�X\\�>���T&���$�j���(5-c����,��~!�2N�=!�ͬ�Sw��<���?�t����Dկ͸P�6�R�/��|�J��:�(u�>J�y����z/ �-��`Uɜt�±hwi����S~����,������u�4L�g��o7��~��G�T�w�2ᭊAkE
W/�xFrX$�YPd����X�������m��
�K$Xf������L[��W��M�
�
���Y�U�R��>�Mm
x�
DvpV!�&�lq8��0��^,	WIV�}tr���aFq���[o&@���M%h)��G���[h��
}�|}B&=��vv��/S
I�zCw�R��
N��}_
+�>5�t���l��n�����Ȍ�-D�U���&o��S�We�<�C"*����2-�Œ���D�|�|guKt%T%2x�"�2b�/��02�V�t�����U� Z֊Cl��f�s

xI5p���Ǐ�֨s>(䒨���%T\������ ��o�J	/oR��KHxa�
VRI�Z�� ,��(,�����
+[<
��
���D����aK�^�f_Q+bR��\ն�
؋QL޿���-�g��QY>&� ��w��
��O�
+��t����
�޴BY,=�4�
���	�O��Ghq�
~�p�� �*�C
+Uʡ�:C
���X�fz��A?`D
dL<
<x����
<x����
<x����
<���NEar8
+y�S������F��&�L
+ BQN�ף�D��A(5
�LmVv���T���g��
��f��g�~j
+�h2ÞAs̜5�
��������Y2�%�D�������Ҹk&Ң,��r`����&T�6s���n'�����N���Y7�y@���_�}��$\�
+��G��I��.9Q�������9H�u"��8Q�p�} ��{� j;@o�73��V�8�����}��K%
�?����m�o�:��%���e�9�S�rendstream
+endobj
+5659 0 obj
+20888
+endobj
+5629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.9124 535.7044 350.3811 546.6084]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+5631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 420.3868 192.5442 430.3145]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+5634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 338.6481 190.054 349.552]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_605b7611d045e0ea0ff47c2ec36c2268) >>
+>> endobj
+5636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 299.7938 190.054 310.6977]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_9db5a39fe27d6c659e9c6ce626e83dfa) >>
+>> endobj
+5637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.3911 299.7938 259.2139 310.6977]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 260.9395 190.054 271.8434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_ed024de0dc1ad69e380f706d25740cb0) >>
+>> endobj
+5640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.3911 260.9395 293.5348 271.8434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 222.0852 197.8027 232.9891]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6135986b7669c295a1855279a9347433) >>
+>> endobj
+5644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 183.2309 190.054 194.1348]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [200.7936 183.2309 241.6001 194.1348]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_804b0e848b19f18d99664d5bbd57a3f1) >>
+>> endobj
+5646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.9373 183.2309 345.0809 194.1348]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 144.3766 179.5535 155.2805]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 144.3766 250.6661 155.2805]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_af6afcf59d181946f02b27418d9b651a) >>
+>> endobj
+5651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 105.8959 155.2649 116.4262]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_a33b89d7143376193110dde339707b0d) >>
+>> endobj
+5652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5627 0 obj <<
+/D [5625 0 R /XYZ 90 757.9346 null]
+>> endobj
+5628 0 obj <<
+/D [5625 0 R /XYZ 90 733.028 null]
+>> endobj
+1438 0 obj <<
+/D [5625 0 R /XYZ 90 640.14 null]
+>> endobj
+210 0 obj <<
+/D [5625 0 R /XYZ 90 633.5398 null]
+>> endobj
+5630 0 obj <<
+/D [5625 0 R /XYZ 90 438.3844 null]
+>> endobj
+5632 0 obj <<
+/D [5625 0 R /XYZ 90 357.6219 null]
+>> endobj
+5633 0 obj <<
+/D [5625 0 R /XYZ 90 357.6219 null]
+>> endobj
+5635 0 obj <<
+/D [5625 0 R /XYZ 90 318.8871 null]
+>> endobj
+5638 0 obj <<
+/D [5625 0 R /XYZ 90 280.0328 null]
+>> endobj
+5641 0 obj <<
+/D [5625 0 R /XYZ 90 241.1785 null]
+>> endobj
+5643 0 obj <<
+/D [5625 0 R /XYZ 90 202.3242 null]
+>> endobj
+5647 0 obj <<
+/D [5625 0 R /XYZ 90 163.4699 null]
+>> endobj
+5650 0 obj <<
+/D [5625 0 R /XYZ 90 124.6156 null]
+>> endobj
+5624 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R >>
+/XObject << /Im7 5623 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5662 0 obj <<
+/Length 2892      
+/Filter /FlateDecode
+>>
+stream
+xڽ[]�۶}�_�'W������橙:Ӥi��}J3;����D�T�������$� A�ew�`iux��Ž H����
%2���f�����H��~_������~-�� #�\���Z�	J����/KB1�5�/߬^�}q�fE��{~(�N��߷�O�������*OEs8ݾ}��r�ZS���튺�>�\~(O+��e�)�U�������W}���!�$���~�/��~~�ˆ-O�5C�+N����z{�/o����`*


��^�GZ�� "!Z"<i.����Pd�Q'@�0�.hu�%�L�����R1�
�pl�<zT�/��`)�~?�����|��79�m:����C�cٵ,�U]�����d�ߡr���$�zw,��Pձs-SJ�
 ��ш�Z���4(��b��e\S��4Z
]����8�"�.���O/B]��Xh)���H�6� ��vn,����Ћȶ�Į_L���r�A�:�T�#���1�ö�0��!%!n
��\n�����C��Pv�(ڑZ�t�5�Ę�&�'�
+~�|~�nssZ1�,�z[ݏ�V����r@�>�����-�po��TeyWޡف�
QB.�A>+�RD���
�2���dp���ᰋ%r�@z
�&$���Dv-�rl�#
+#L�ܺC�
K��-�a�A[�J
]��."�Er�H	��Y�?��㩪'����1@�e~z,g��� WEu��T�{��3�6\!M%�Rr�x<}�V�9u���|sP!�׬`F�M,W�����`���~}�~�Ľ�6��(Q���K��瘌��RR���f��a� ��(8Tη�H
+�c����b&
+qI�E�
�H���żf���\4T�O���X��
���0m�9}؁Y��Il�Q�c��
Y
۪ig�6(���@sh�M��N*Vd9P
Bl?�
�2B),���h�8R�Q���`V��^;��y���,p��m]Z�-=��z�8
 �֣��V
@�tע
��Yf]V�BEID8��H`ʳ�����S�2�{n�H�.�����[T�ElͲ���т3�����0�d���	��Ĝ���愁���!����a2��6wy
�@;{�o��|jZ��(����I���`.m$���O��)1������y|�_l��rWЁ
+�T�
�cYK�;4�R���D�shZ�%S��/��`���~}��~�����3q�]��?F�9䕱u��o��y���h5��':��0}Q�6R��`��w���4�6ڤ(v�Q�C����cq���*�����(�mm;��憀�
+:
�5
s�u7զ
+���
{�l��*�\�ȱ���ۗ�������Q�6�Ǹ17)JD�)�E
Vy��!
+�h���
�6�����|����禬#e֐B�$ݵGe�P�yƥ

����a�6�\�w�HT���O�m�z������߅sz
�
z��f�xܖw5����._s�� ҡ͖>Wp���+>��R"L�i7Q�
�-���ť�a�pvg�~��'�~���
���+�CCV��a���&�z�Q>

+_(&F��	
+ �7��
��FJ
l^>���EU��|�	��~�����ϡ������J���]�W`0�g����f��}��t7�"�kY�O�a�c�|W �E& =(�Y(��ݿ����
+Ԇa��{w�
������;&1�R`
A9�� xT�e��8�zN=���]��L�D�GYJo��c=�/��J��<m��	C�L����9��v^v0AT�˂ؘ<�ä
�� �6�
�t������}��|yX����4����
�d~}2�aY�Kz|���_'s�u�H�4�:0#�	���9�]��?��l��m2
s*
+g6P�6"�S���
x��o����qD�@�ǁk�C�hXa=2�7�Tcq��%�H蒇�7K���q?��ߧ�w��}������
�Ȫ�h�.��døUN�Tt�
��a�S�Ii�cS��x(��]ۮ��&�	�9k⳻5��й�
����`J��~���~�@�g;7�è
�5��1��v��Ͷ�٥B�"d�aB3�p��w�e��CF#`
�$���m$4�új.*c���㯳�N5AR|���t�R#�Yn��ò�
L�{ƯK���OJ�!�3�=�(�۷���Nw
���<��y7
�{V�
�h�1e{`#��fy�^qB�9��)Ҙ|�tƚ��&����=0�J��_���0ݧ��`i��#Ʌi��щ잷0��`,�!�

+=�0�
9���r�4���x|�}d׺��<
l|�XmWT�E���I���2$!�%F�+�6�.;s�H����v
��]ٸ��^���n
+h����Xe���T�6
w5?�����n����p[)놼=q5{%�	N�Qr���^�
�U^t�>�1��@���H�����
F	l�#��K{��C�(=�O��tn��C�7�����
M
�eI	L z~�"$��ò�������N�~�����P7���+���Y6��֐F�,[����ZB��˹���P<�T1-�;���Sg"1��2^
��G)4�T��e�k"f�7�)�Q���g��3
c��L��@�)�d�G�8���K;�����aK at K�/��Fb��� �cs|�K�������*��ӋЎ01� �J";���w
�S�д3X�9e��V[�{f�? ��M�o����KFo�
�������˿����~����
��z[�����T��TRe3�֌��۲�:�4��(u���p�~
��h/XWtӉ
+n9�۾��4Ǜ�맧'��4X��6����z̋c
��ؐW��f��
��1�ӕ=�p�p�'����y����}�ld��� W��Cendstream
+endobj
+5661 0 obj <<
+/Type /Page
+/Contents 5662 0 R
+/Resources 5660 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5592 0 R
+/Annots [ 5665 0 R 5666 0 R 5668 0 R 5670 0 R 5671 0 R 5672 0 R 5674 0 R 5675 0 R 5676 0 R 5678 0 R 5679 0 R 5681 0 R 5682 0 R 5684 0 R 5685 0 R 5688 0 R 5689 0 R 5690 0 R 5692 0 R 5694 0 R 5696 0 R 5697 0 R 5698 0 R 5700 0 R 5701 0 R 5702 0 R ]
+>> endobj
+5665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 706.9608 158.0444 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_cce6ad80815e7d09970ed92968967585) >>
+>> endobj
+5666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.3815 706.9608 227.2043 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 668.1065 161.0133 679.0105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_ad63aea0771a124cfb70c8e8e80779a3) >>
+>> endobj
+5670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 629.2522 195.1648 640.1562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_2b29f5668213f9171cfdc666ef4142ea) >>
+>> endobj
+5671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.4421 614.6315 226.1119 624.5367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+5672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.1476 603.6726 227.8174 613.5778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+5674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 579.8126 187.5633 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_b174d3f8d008aca83801ae0de294528d) >>
+>> endobj
+5675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4816 564.8183 271.1514 574.7235]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+5676 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 540.9583 150.493 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6b57cf93153051d3aa63c33e34ee4127) >>
+>> endobj
+5678 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 501.7304 191.7178 512.6344]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 501.7304 288.8524 512.6344]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_b0063024b3761b3ff89c3f259ebac6fe) >>
+>> endobj
+5681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 462.8761 191.7178 473.7801]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 462.8761 303.0791 473.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_7072dc2f1979eb1198aea49e10bcd59d) >>
+>> endobj
+5684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 424.0218 156.2812 434.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_02e5a05e31a64af8bb2652645f74190d) >>
+>> endobj
+5685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 424.0218 236.2405 434.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 343.2593 203.0748 354.1633]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5689 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 343.2593 296.3242 354.1633]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_d53075833d1bde0c9e36dd70afb4b967) >>
+>> endobj
+5690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 328.6386 345.5988 338.5438]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 304.7786 194.2975 315.309]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_071ec60375df0a0f5051dc431f445e37) >>
+>> endobj
+5694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 265.9243 188.7586 276.4547]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_02b52b4ef5b1806566495cb7b6d35abb) >>
+>> endobj
+5696 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 226.6964 237.0967 237.6004]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5697 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.8364 226.6964 309.9031 237.6004]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6e9c19c25562f9d1a71523d00b337450) >>
+>> endobj
+5698 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [290.9649 212.0757 398.0064 221.981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_600c942b0a2e94b550ccd84ef9c30928) >>
+>> endobj
+5700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 118.6553 226.0342 129.5592]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_dcd147a1c5474a820c7379514f629fda) >>
+>> endobj
+5701 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 118.6553 397.3195 129.5592]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5702 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5663 0 obj <<
+/D [5661 0 R /XYZ 90 757.9346 null]
+>> endobj
+5664 0 obj <<
+/D [5661 0 R /XYZ 90 726.0541 null]
+>> endobj
+5667 0 obj <<
+/D [5661 0 R /XYZ 90 687.1998 null]
+>> endobj
+5669 0 obj <<
+/D [5661 0 R /XYZ 90 648.3455 null]
+>> endobj
+5673 0 obj <<
+/D [5661 0 R /XYZ 90 598.5323 null]
+>> endobj
+5677 0 obj <<
+/D [5661 0 R /XYZ 90 520.8238 null]
+>> endobj
+5680 0 obj <<
+/D [5661 0 R /XYZ 90 481.9695 null]
+>> endobj
+5683 0 obj <<
+/D [5661 0 R /XYZ 90 443.1152 null]
+>> endobj
+5686 0 obj <<
+/D [5661 0 R /XYZ 90 362.2332 null]
+>> endobj
+5687 0 obj <<
+/D [5661 0 R /XYZ 90 362.2332 null]
+>> endobj
+5691 0 obj <<
+/D [5661 0 R /XYZ 90 323.4984 null]
+>> endobj
+5693 0 obj <<
+/D [5661 0 R /XYZ 90 284.6441 null]
+>> endobj
+5695 0 obj <<
+/D [5661 0 R /XYZ 90 245.7898 null]
+>> endobj
+5699 0 obj <<
+/D [5661 0 R /XYZ 90 164.9078 null]
+>> endobj
+5660 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5707 0 obj <<
+/Length 2740      
+/Filter /FlateDecode
+>>
+stream
+x��ZYs��~ׯ�SB%����O���8���U�۵��
	0 �����=88x8�J��������ϯ��[�ta�!��z��^��#L{���<_�����F�EJR�����rЌ(���.�q�a���QJ�?\3�̚m��kN�����ț�ß��&k^oo�-��ɺ���������+�|����
�Es͒eQ�
�*�\r&������^P%4C1�u���t��y���D��Z<�
�R��^I.������_{>�]0�|��$V
��j%{})
�QM�H�'C��Ĺ��QXŕX�
';�T��e��T�ᾟ�]�|���� �ho|�<z�w�����(E�l
e7�€3i��h P��;I�AD2�<Ut�o�I��������(D��QrA��D&!4��i�Tg)8��#�����x[	A@�N.�POF�)�cZ�Hp2��(#0�*�����\i$D#�-�3���j�M��\�X�7��W�16�n^�T�M2k7�d[:�� �L��yX��\$ ����xJ�I��V(��]�.�M��E� ��h���/w���巷�
�w�ɀ��$G��(�R�ü�l!�JH��P��諢��M����UѮ�rוu�40#�p�SȔYF_�5mT��w}
��ڃ�Jf������
+��tY�,֝�RuO��X�j7V[�א�5
�+��e�@�����1_��l�(F6f$�8J��J\�
�P�N
��m����a��7�eI
+b�<,��7]����o���T���3�NJQN�q�zbr�D@��;	OtzO& ~�l����mʪ@�qn�M��z����ꇳeV�n����)܍��DF����TT�QY�Eӕ�#��1
{���
��mw��o��ۢj! [�إ?���.3+�f���f]��6�W��?�u����vOY�l6n�
��j/iLЇ<.o�d^�D)��F�dQ��B~²��vO�>)!��|��~?�}W�C!����\?�a駶EVun��%�t���Tu�*������|-�'@6�>ϸZo�yX�'7E�ׁ���[te0s��9
I'0\�Q��G�Xt��appA���UQx��]��nW/
�n�����a��rNl�*>���l�z�Kҡ/�!6�+1��c�գg<"�N�B:�A
��ѵg���ӓ����4��E�(�@�,1
�l���&�bʉ
sO�c���lz2T��9]�'(0L^��nS�t���!?﷡v{�4/
��~����")<6y�)� ^t�3f�h������,�`�8O�3��C���(�s{;KV� �-�il�c�@t
�;`dг�\�g �}�r��+�z�!��`�Pt�/���p*�fh�R���9�������UL5�sЭQh�R�^���Jv\����6`ޏ{2���V�&
! ]չ�ߺ��-r��M=e�z�k#W?,���m�:�ho�a,FU� RJ}��A�
z@�/�����A�
�|$z�5]іY�3�NV*0� �#O���fe"�0���k'�;�P,�0Й�
)�D3���@?�q���D41�Tq}i4E䧢)��"h)��\4=��A�P����V��]��E���
u
x
��g�Hb5��=f�#m��D���p�F��ؔ$���܍����.X��?����CbO�~]7M���*�� �ʱ
 �덛�/�پ-¾��u1����3��Y�c ��,�-×w�	O7�#�C a��p�Y�
��YԶV�����v��Q*�$���%I$q��n�^>{q�V�(w�v�`��
R�@+�<e��S8
+h҆+�d;*�uS>�2�
�G�-���"��L�ˆ��ODdO6�2+�-qVS�c��$���Ꙋ_#0�E����d_V멊�ɩ: �q3�S�z3��Ig�ﻬ��
��j��j�q��4!
ځ
-���lO��,k�X�Ϳ��L�|㌉ BtVu
�CX2_�nc�OY�����
+�1n���³
+,��z��G�l^v3��;�E|��w(6~�� �LVJ(�T�ʉ 0a�r �q�d���O#?r
��D���=�soɑ���R��)�܄�����!��<"�p�� v�9`b5 
����
��1،
-�p0sihE�B+����5H�l&i�^?L�s
��p���
FLu����Iʓi���������w=Y�a�M�����&�&� �/��󨿈Kx�mٕ(@H<v:�)
�I*Bԑ�dRaI߱���h���f������v)L��OD\O�Y��h�@!ӥ�
+<��p����XZ
���	O*	F΋�n䀡�Z�ݶ�Ń�>'��E�'F�"��L�!�_%��4|�
;.6����L�aJV��d���a���6�]m�bʅ
��F���
+p��@?S��'�0=�
ԉ$���?�&�ё�f����
*��y�TT��
�GF�blF&E�������#�෩���o?�W�6m�Ctmִ%:�5 ���Q��������|<#J��Ͻ
ôҟ�G
��MCM`)���!&"!U��3��
�(p�����o���^+��>�ڇ��sW��/� *�57�C���E1�����8�@K��?a���jX��Vw9
y���u�ۛ���g�nɾ*w
)���ns3�W�t�!���ު'��2P�׆&Y
�0PԶ�kY�$v�u5���W�Q���A�endstream
+endobj
+5706 0 obj <<
+/Type /Page
+/Contents 5707 0 R
+/Resources 5705 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5717 0 R
+/Annots [ 5709 0 R 5710 0 R 5711 0 R 5712 0 R 5714 0 R 5715 0 R 5716 0 R ]
+>> endobj
+5709 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.7944 719.9123 172.1603 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_71a39e295673dabbc4661c7c0a2c3445) >>
+>> endobj
+5710 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.8551 719.9123 379.0811 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5711 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 719.9123 513.9963 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5712 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 707.9571 225.4707 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5714 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.2703 608.0991 256.4139 619.003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 596.1439 130.8265 607.0479]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5708 0 obj <<
+/D [5706 0 R /XYZ 90 757.9346 null]
+>> endobj
+5713 0 obj <<
+/D [5706 0 R /XYZ 90 670.8501 null]
+>> endobj
+5705 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R /F33 485 0 R /F7 574 0 R /F8 568 0 R /F25 348 0 R /F1 583 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5721 0 obj <<
+/Length 2383      
+/Filter /FlateDecode
+>>
+stream
+x��Z�s�6��B�wT/��&�뗶Ww��K.��}H3
Z�mN(R�#���[p
+�(%i��t�&�!
���b��](lF��et���dB��r}Fgw0����
�_��]��_j5�H���]�
4#�3>�Z�L#,�/�4y6g4ɛu~�l�iR���v��׿7M�<^\�h+��]�\�xl;��/����e޶�|nom3g&���:�"�	gj��꧳�FE�>��̩����+:[�~~:�DdF�
�CA����g���)�^��k�Â)sH�0L�����l��(B�I�rTN�5i9�
+���\����û|�)-�^�o�QNR��,�| �:T@�HFS�2��ܜW���,��˲�s�<�
-��0i�w�}Q�Z���ӎǘ%�-~��!���>wkߎLo��֦.�.0�VAf��vSW+��$]�+�M�7^�r6;�"�(81�e���s$Ig�d����,g�YA4Sr �H�c0��

��F���y��ڷr�;���s[7�خ���Fa�U�5�3�`G]A���E�
+'\"&G�;���K���4�[�n���T��k��r�͈�R
�w-)��6���p��AJ�wf^0�b
��aF��p��v�

+�~p=$�����j�� ���AY�9�&ˊ/l���Vu�:
�1�q(�
��чP.��ߓ���@�i(ɜ�=�B��o�t�eY��K!���'�Q2y��"�����Q�+O��
+aS�rSt��t��|�T��@On�yR���K��,������l��@��^�����Z��ʮP��O���+\�z;g*�:/@��T�t�
�
+��]#���j/0�� ��Y�}�#։G ��*�g�ٰ,�Q�E��M�t���
6
ϯ���W��8�-�`2��p��bî6}��[��ǥ�i����XǦ����/Wؼ��XT�lcW�KB�F���D
+T���
%{(v���2�{񁱌��͗�\%��^��/�>^k�Z�?��D��
+�Wu�f]Lu<����T͢�"�I�[h8P`:Ѝdc���~�"4�5���k�ϑ d�nh��k׏k��{p����P�
<]��(r�7��
�ߡ�1���#���xcH������& �Du#3����Ӌ��]��?���\�j��A%&?UF���6�,�
�•���b*\O�d�D2v�"���&R�	��.i;�n
s_�4�*'����6!�u�x����+�lSW�
[��h���s:
���
rI�.m�Sp��ʤ�=gH���s�p)�a] �t�����]��&pg1��@߲�8�u�Iq� ���G�L�!�����N�m⿺���(��1~�%�Ur��U�YO�ϙ&4�2���/�業�6 N��� �1��EY�(�l�*N�(��t,P4#Z�{&y����)�*/����F�u�3|�{���UD��غr�'���
��
U��ӷ�C
TY���X�ݨY`��U>��"l�$h��{�`�,�P%��!�p����]߄b岯�]Q�}��^�k8�|��%2�1#�<����v���鋋�?o
3�ۈ6�t؛��Ѿ�������U��
��2xES��E4�x
[m]9�뱭�i�m�7U�-���RE���5����5�P����=6�
ׂ�a5�@L�,�|̅���=H����j�^
��u����KQY�h�\�'/�1�
��6_�c��
�o�¯? 
�,�ܽ� ̀
b�!)5>$�����<�I�x�at8�;f-�e�"
�b�P� r)"3�I8�7U<;�<�"&��]�ܜ\�&�#��m�Fwa�`R���V�p	liF7�=�
��	u�:��9TC�@��X]$�{���9=5{��u�z����F��'7�%"g��pw	Q�Zy
��Z���|<�T���V5���u�ˡ�I��>�{�k�#�_Bz
�X6:$	�|3�EΉ���G�c҆�Y�2�!�����NpĤ*0� ��<�\'��#��L��<𺛒f�Q ��V�2. �6 �;W�e����T�A��w�޿��W*�
x
�����
�s
+����v*T��b*�	�o��[)��R�@otbכn(�	$lp�O]v�P�Kf���u5!�9H�����H6�'�l
C��dS��ԶRJ���}���˩����
2���nct0fA��H��ME��Pz����xǍ�ɾ�y�Wd��q�
��f��5`����·�+�!H�l'�m�!"%����}7�0v=c��P
��y�dz_�Y�L^�v3P�n�Sw���d|/�ݷ7)��b�J8�zZ?o7;.XD+£�v�|�W���\��?<<�eK���4���7��� ���d
n؉�[�D���hH!vt_l�u3�0�
�����T�a�\�endstream
+endobj
+5720 0 obj <<
+/Type /Page
+/Contents 5721 0 R
+/Resources 5719 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5717 0 R
+/Annots [ 5725 0 R 5726 0 R 5727 0 R 5730 0 R ]
+>> endobj
+5725 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.5469 235.555 513.9963 246.4589]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 225.6571 106.488 233.378]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.8284 205.9755 375.2971 216.8794]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_6a5f64baba3ae5704d9645db684434d3) >>
+>> endobj
+5730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5722 0 obj <<
+/D [5720 0 R /XYZ 90 757.9346 null]
+>> endobj
+5723 0 obj <<
+/D [5720 0 R /XYZ 90 313.7735 null]
+>> endobj
+5703 0 obj <<
+/D [5720 0 R /XYZ 90 291.4617 null]
+>> endobj
+5724 0 obj <<
+/D [5720 0 R /XYZ 90 291.4617 null]
+>> endobj
+5728 0 obj <<
+/D [5720 0 R /XYZ 90 192.4014 null]
+>> endobj
+5704 0 obj <<
+/D [5720 0 R /XYZ 90 170.0897 null]
+>> endobj
+5729 0 obj <<
+/D [5720 0 R /XYZ 90 170.0897 null]
+>> endobj
+5718 0 obj <<
+/D [5720 0 R /XYZ 121.1431 93.4257 null]
+>> endobj
+5719 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F33 485 0 R /F7 574 0 R /F67 370 0 R /F74 482 0 R /F25 348 0 R /F11 416 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5734 0 obj <<
+/Length 2254      
+/Filter /FlateDecode
+>>
+stream
+x��Z]o#�}��PP ����7�F�@�6HҠ�]�i�0dil*�ԑ����
�crfLj��-؇��;�
^�{x�!�`�G&O�PH3.'������__��
~�����|+�D#-��\ߵ
$A�:�^}��(��	�x�nF�t�l7�fO�맇r�,n�U�6������.��a��|x�����r[�7��~=�S��_/�{����lf������͙� ��٧�o/�y��v�L���?��
+���FLb�0"Z���S�?�/>\���chˎ ��P��̧�h�u)�Ѥh[�fs.�t��ؙ���X��N�u����[�
�J�9�6(~�&R�t�2�zq���d�(Gc5�ø��}8����>�b��.��(>�
? Hq6��
+J�3�ؔ�š\}����s�!#�	�K!I9o��+��b]�\�G�s�!�s�?�����
)]Pg�l���'q���fe�]
7e}X
�mm���px�
��ϥ��N��po3]�ܓ�v�-���z;�b�X����0���j�x�����_��������	����w^�	�T�
Q(�T��(� ��Q��n�

:.Y��v��3�3�H�^E��^�̟�]�lX�
+�aD�!͕���[�G 7����_
Ob��Έ0�"������o���.�Ͷ٣�㘫�����r ��}�{���/�/�3'&��*�����Th�8�����~(�����Ӏk
Ä �)�
�Z����{g�>�������n���yg�o�3B��Z�d���ϡ
V���W,��u,do�^��G�O�	ZO�a1fH`Q�e9ny��x���vZ�/7���o���H�~D~�(H�DK$�3�*P*b�0f�(���E�ҳO$,V�tf:�
�S�^z���j�"�����Q�
�L$t at R��a�fa�B�C-,�'����E5�@��P�?ʻ�q}p˟�Rs\�B,G�BK�Q���y���jA��
���
�Y�����9�F�q0Dw*8C�xF�� �����|J���BIvI)�z3��͌�骪A�=����t�R Q�5�jh&����d}vw>W{Ш�j
3<�H�=�o�3lV�F0MR�wF��)�ÉbZO�SzS	�z++���� [VF^���u����!:�,#C��]D&�g[wT�@
+
+;T�n
�e�{�
��_i��`��aP
+��`,�U&8���Q�
��p�N3!���b�#Eo�����6�l�
ڙm������� .�X�6Sa�TEx�|ES���UD��~?0�R9�E=�rx�
��_��A
�� �0S���r�

���c�_�6Pcq�н}.��oX�v	��K�J��;&�l(�I���� �� )��bZ���Y^,,b�?K
+))�fv)l{��<��ߞ'�&@I2��+j�
ql�&tfYM
&4!�kB7�	q�4!a��4MH��ӄA�'u��}��H��w湱���4A Y�4዁ 0���4���*��G�x�����$p��9��HBgf�W�����6�qվ\����J���5Ap$�mDR����8L)B:n�a���c '��H�a�|��p]�@\��	�2���i^
+���Rf�I��,�>R��f���y�{�P/�w��W��@��5����i����� p���tܮ
+¸��{x���<���5�}�I�N�����zG�{i0��C���U��Y�|��������?�V@
+��&�
�(�!�i� :�l����
 �{�ݮ�}�@��7�:�
�����Ͱ�4�3���{�\tXs0㬗���K����	}$J�33cx_
�M�|)�ٞaI�77�ѽ���c$�}
Z��ϋڽ���kwn?ٷ˜�s�
+*IoW�b��(����2��a����Eh|%�b^<eau��_�\T���em��g���60�ta�ߔ6x��6Sڐ��iC7�
Q�S�!�`�7Ԇ/ތ�#��
+Xz��*
4D1�K�o)
�'�,i|�����.
'K�
+�bڝ7
^�(p\���"A�h�'�`Oȳ�E�K`RDG� �N���{�f
+&�kn����_���
������L�������>.�����Ӿ�/P�)�2�fsF��CY��B�$
�6K���M�_�}�`
<�/�<y��
��p�]]^>>>��

�jנ�p�ۭ/�W|`e��2D�7|�� K�~h=�T u!��>�f�����/7��
���(� {̜endstream
+endobj
+5733 0 obj <<
+/Type /Page
+/Contents 5734 0 R
+/Resources 5732 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5717 0 R
+/Annots [ 5737 0 R 5740 0 R 5742 0 R 5744 0 R 5746 0 R 5748 0 R 5749 0 R 5751 0 R 5752 0 R 5754 0 R 5756 0 R 5758 0 R 5760 0 R 5761 0 R ]
+>> endobj
+5737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.9124 539.3811 410.7038 550.285]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+5740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 484.8951 170.6866 495.4254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_47e2d2f9114f640ca24b3dc68b701152) >>
+>> endobj
+5742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 445.6672 170.6866 456.5711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_2f74f2b935a0e1900eafe79b7a305a02) >>
+>> endobj
+5744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 407.1865 178.4354 417.7168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_16e25a87d3f2f1a0a454883b84bcf177) >>
+>> endobj
+5746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 367.9586 222.2328 378.8625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_fbb0b8b086aaa82499371c7faee19c3b) >>
+>> endobj
+5748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 329.1043 179.2546 340.0082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.9943 329.1043 230.1633 340.0082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_83d49cacc2666db32082dabdac76acc4) >>
+>> endobj
+5751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 290.25 179.2546 301.1539]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.2248 290.25 237.3565 301.1539]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_a2b418d948cce672416e77deb99b45b8) >>
+>> endobj
+5754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 251.3957 227.8516 262.2996]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_b2c21b4ce7f4f822e98343689525f1b8) >>
+>> endobj
+5756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 212.5414 217.6102 223.4453]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_032aca0bd08a3c854d46b4a7c567b41b) >>
+>> endobj
+5758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 173.6871 180.5399 184.591]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_ead8142c94d4974534e7f0fe10ed63a7) >>
+>> endobj
+5760 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 134.8328 178.2386 145.7367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_28cff68f198562b6921add86c58008af) >>
+>> endobj
+5761 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5735 0 obj <<
+/D [5733 0 R /XYZ 90 757.9346 null]
+>> endobj
+5736 0 obj <<
+/D [5733 0 R /XYZ 90 733.028 null]
+>> endobj
+1439 0 obj <<
+/D [5733 0 R /XYZ 90 640.14 null]
+>> endobj
+214 0 obj <<
+/D [5733 0 R /XYZ 90 633.5398 null]
+>> endobj
+5738 0 obj <<
+/D [5733 0 R /XYZ 90 503.4953 null]
+>> endobj
+5739 0 obj <<
+/D [5733 0 R /XYZ 90 503.4953 null]
+>> endobj
+5741 0 obj <<
+/D [5733 0 R /XYZ 90 464.7605 null]
+>> endobj
+5743 0 obj <<
+/D [5733 0 R /XYZ 90 425.9062 null]
+>> endobj
+5745 0 obj <<
+/D [5733 0 R /XYZ 90 387.0519 null]
+>> endobj
+5747 0 obj <<
+/D [5733 0 R /XYZ 90 348.1976 null]
+>> endobj
+5750 0 obj <<
+/D [5733 0 R /XYZ 90 309.3433 null]
+>> endobj
+5753 0 obj <<
+/D [5733 0 R /XYZ 90 270.489 null]
+>> endobj
+5755 0 obj <<
+/D [5733 0 R /XYZ 90 231.6347 null]
+>> endobj
+5757 0 obj <<
+/D [5733 0 R /XYZ 90 192.7804 null]
+>> endobj
+5759 0 obj <<
+/D [5733 0 R /XYZ 90 153.9261 null]
+>> endobj
+5732 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R /F74 482 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5764 0 obj <<
+/Length 2342      
+/Filter /FlateDecode
+>>
+stream
+x��Zے��}߯`�*���ٹbk�UIl��X�"��,

��HH @��_�
̅���()Պ$p���/�{@��d�����p��p�����p������E !
+,nw��� A	]�nZ�(Y�	�x�zE�2*�����e�zH�e��!�+������כ�:�O�՚
+���>�*��M���D-�,N@ �4\R"W?�~���nA��h
�}���x���|�
�X<��H���S�>��^���17�c��]�
+�� U��$u���7I�iQ�y�7t�BЖ$�:��4����Ei��Q�[_�+"����{�y���:9X�μ�'�Y[!�Ok �s�a��1��"Pᐄ�'�Nyo!o�yb��6��Pg_�Zw�gU��{�BG�Pڳ�
��1�� Q���:�_
�&:��:7W��89�&�B�D�u��
.�㤲��F?�+���#�2 s:��\��k~��$��=�Z�
<�HI
^��q�P���Kg�f�d˚I'�:���[�h���2
�"BDX �#�P�6l$biZ3�+Ua��"���Q��n��u�B�1Y�!��h4~�!:�d�YL�d�L+�����f�D�0q��U�>$��w�~���X>�ٽ��[{�(Ӭ��Y��Tн���
5��O&R�S`"nl+
F��刁ܜ������-�M��7Q�
�c��Q*�28I�䲂����&o�����y��y)
��A���G�r�"(�;]�z��e���X�A�
M��K���)�C��A�IP�Vu_m�l�_
�N�����c�2{��/S�4�
��;J��h
����D!*� " ]8S�~���H*H�z�W6��v��Hb@�#�
@����]E�.��4�B�i
�xg���R�t����C�U�����c�+��%Q},�se�����+�� P�n>��
�yS7΋'}��#�e/�U
���3����k���c�_�#�g_�ހ~
P�a�F(�M�m
	4�f:��W��6^�iT|l�̪Co.5ve~�v�F�aL����l�%A�buv<n�=@����az��(�ԂUhkR�G��%
�����(���26�<��wͼ��א��#?�0?;������l�b�-�sH��\�[ڶ[�>�`�y�7��aƇ^c�MĿM�x�Zc	i!C2T��=�]�+�Zd��
9L �I��ai�I('��
�)�7����/�Y�뤚���ӿ�u�
��U��9n�r{�
�\@wNr����2D4�
bZ%��Kl���r�	O��불�|Ft�^=ij�0�,�x��n���4�S+>7�Yк�+2�0TyYgk�
T��V�@3Ji���N�*�x�lZ���o
+�
)��1��9�ç�H�V������{͵��8���P�9�t��X��T��X4�I����3T2u�
|Ɔ���,ei�X�8�*1���Ϙ
�z����X��d
�v=���F�@y��F���*������*�`p�&a9b��ʐ�^Y�yp�J�r��i��y�PU�cw�%���o�M��0�n�x�}�|D
��'70��L~���Z����p�PD�5�9Fq�yJi	��i��T�j稄(��i�k��*��9cr/c�+OM{ģf���I��N$�P�za�eX^�����/�:��衂�8���LP0>���s�¡^c��(-S��`��N#0�I=B~�����̟�~��D�@�I>3<y��ݫ��vr~��b��]VI|:��UD181��
	�a$�a�$8��E��γ���9�,�cۡqߦ�m�bHMNZX��vR�C�v<;�AM��s�IC=�ci���~c�M���S�
�I!�0��t8=j����^8ύfz�a������93 [...]
+endobj
+5763 0 obj <<
+/Type /Page
+/Contents 5764 0 R
+/Resources 5762 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5717 0 R
+/Annots [ 5767 0 R 5768 0 R 5769 0 R 5771 0 R 5772 0 R 5773 0 R 5774 0 R 5775 0 R 5776 0 R 5777 0 R 5778 0 R 5779 0 R 5780 0 R 5781 0 R ]
+>> endobj
+5767 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.3322 677.9388 155.1085 688.8427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+5768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [463.8747 677.9388 513.9963 688.8427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 665.9836 120.3358 676.8875]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+5771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [202.8522 288.3509 245.9403 299.2549]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_6e613e3f02e896503d38da788ad593b8) >>
+>> endobj
+5772 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.2775 288.3509 329.9047 299.2549]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5773 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3307 253.4817 222.4188 264.3856]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_b8dbbfce1fd68d57df6b05d5cc74c012) >>
+>> endobj
+5774 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.2345 253.4817 282.8617 264.3856]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5775 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 180.0665 202.9022 190.9705]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5776 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 180.0665 300.0368 190.9705]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_aaa520f25230108e6839b82747cae794) >>
+>> endobj
+5777 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.374 180.0665 384.0012 190.9705]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5778 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 145.1973 202.9022 156.1012]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+5779 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 145.1973 314.2635 156.1012]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_b2dfd07539bfb516c7ca2d04460064fa) >>
+>> endobj
+5780 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.6007 145.1973 398.2279 156.1012]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5781 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5765 0 obj <<
+/D [5763 0 R /XYZ 90 757.9346 null]
+>> endobj
+5766 0 obj <<
+/D [5763 0 R /XYZ 90 733.028 null]
+>> endobj
+1493 0 obj <<
+/D [5763 0 R /XYZ 90 461.5938 null]
+>> endobj
+218 0 obj <<
+/D [5763 0 R /XYZ 90 454.9936 null]
+>> endobj
+5770 0 obj <<
+/D [5763 0 R /XYZ 90 356.5212 null]
+>> endobj
+5762 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5788 0 obj <<
+/Length 3768      
+/Filter /FlateDecode
+>>
+stream
+x��\˒�6��Wh�QW�a��e�8�̤��8�$�%Kt[5z�%���
��H�
Gє�
���{�s ��P��&�N�2�	�'������?^�������7W�_j5q�i�'o��4#�3>y��}�����QJ�����v���kN�����j����k�v7�=}�폿���is����
Wt��j��7������N�ͼ��\r7��^�����D��)(��G����?�d���%�Y5y��0��d}%�VW�^�;�i~�cBRK,�vr#$��bTfָ T+YS��c�h��$�y���\���8#�:3�&
�
QX]�	u�_�c}q��Ai郕KJ��vwm��.�����(6�5Sӻ[h ˻� ���s�B��qbM駊�VnE1!
E���B���֟��nA�yB�+A����' ���A-$�Ϡ�0��
+3A���
�2Bn�o�
5,#'`iٴ
��Z�c)뻺M��p�z| C�s��ީ����?5�̾�1�,m2hu�N�f��vCN��v�R_~�"tK8��CDC[
��YF4b*݄�@궢�+��F�t�h  y�@4�4D�@��ӟ�R�h`Ҽ_ Y�h�D��x���Mg�o7�à��DXkJɈ��A�2�t���y6bA(�0���Pm@�4�Hh7GFBc�E$��Jh����Hz���4�I��0�~F��
���Ck\;L�C�Ɲ�95��
j�-��q�t��A
�z���SJl
�I�
+BV�1b�o�=�G�Xj�)>��"H�(1Ȋ��ֳ$�(W
D�$
�i�a�G����ɑS�v�
������j���ꡦ?#����a0�,��hL>B.��9���
��-��G�t�|�A
��G���|�G��Q�����?�� ��E�#�#YG��B��r�H�K���4k�8�¤U#}"F!�~�22��QE��,)���Ii��@nLJO����L�?�S0�W҈�
���(k�%��
+r7aF���� �ʢ��/] ��A^�bW�Oά�R�)QXuP �UJ�� �:03+=��"H�ͬq̲<	1
+���$�ZӇ�	2L��0�t�x
� o�&��rce���@�OF����ӵV�
%ڒP�K���x
� o%0�&�1��$F!$P'-K:��Y�R��g-7tRdL*D]֣v��L��l�Y�{F�NM��X~\���I� 3�ի��i,	T�
>���m,��€�0�1
a�v�
0_78`�,�%�1��Q����e��B(QXulj�4����230D-=��"H��-[�(KB�B ��eAE����-%#�c@Ҭ�+��p�K�(�_Y�ZȄ���~,�
1
�3�[�~�X�t���@�@�00	�S������<�����_���58;Tp�ۆ�^���o��:'��l�K�C��_�|\K����d��ak�1
w�Nœ������9�V�%���W�c y[�����	���*�D�B at p
+LPhv�+0b���0��4�xA��� 5�\��	!
+��
�Х48`Z�*"�0�
�x
� o��QB��ybAH]ˆ�����a6D�.� �c yK���.�Q�
Q�,�V'=���_��/�����t�x
� o
�!L(&���2b]{1��\J
�CT2��t�3�["����������_T����
�8)�9#�n��(�yX?|:T0G_4����_�
Hc��D^| ����9��  ����n��  ��6�^Yt��/]0�E@
�z��:3�u�p���U����I�?1�5���C<� �[� ,�V�� ������_
_��KfJ����A���T�ɈQ��
����/L't)%1
�3�[��+�
f)�Q?�uB$
%	5��%��
9�a������ؼw��:,�W����*mh���|�����	N��3���^'a���u��u���+]bzy����_,n�=����Vq��!F!8\j��$<�N{�?5ե
�xA����
#`!!Da� �&��'�L��R2B8 [...]
PPp~�/�5U�����z�V�}=��+2�[~�
�[]��4��Ԥ�ꒄ�._T��r
x|Q���}�'R}��N�6���5>�������������&'��������4�طO��
zj��L�ɦ_� #{f2�9a�c�~�n谷vsH��_/� H/I�B�3	~���A�
[PSL����V�Y��;߆�w���b���=#�xf}��v^�H:�����2
������R���ǗYn��������o�o�U޽�wH�����x'X5��һ�7���K�ﶦדd�1�Ǡ���ݨ�v�{p��z���o�jh��/��1ХlX�n~��$��ϮŶG�ti:��Yl���{8������#�?n?��v��n}�|`.
.��)��\B�����t�u:1o;���4��m�ma+�h]����f~����v���6�Y��Ǿͻ��L4f�<��W��Y�z��ۏu���o
�D���w�}ִOgzk�
+NR&S�
�8���\�KLj�,8�ﻆ�?G:Dm���F=��"�G�c�Ms�~��f��v�ӗ3/���S�}mlo'�5O՘�)G��3F
+Йnn���{����{[j�
�H���ƛp^��I���ۏao��c�Ar��}�������_f�ƙۖ�ѧ��m���]ō�� ӯ���A4�b��R���n:G��~<�Aޤ����a��ߑ�����j��%��wD���Ġ�
���$�=,��
��IF_fB�/?�/endstream
+endobj
+5787 0 obj <<
+/Type /Page
+/Contents 5788 0 R
+/Resources 5786 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5717 0 R
+/Annots [ 5790 0 R 5791 0 R 5792 0 R 5793 0 R 5794 0 R 5795 0 R 5796 0 R 5797 0 R 5798 0 R 5799 0 R 5800 0 R 5801 0 R 5802 0 R 5803 0 R 5804 0 R 5805 0 R 5806 0 R 5807 0 R 5808 0 R 5809 0 R 5810 0 R 5811 0 R 5812 0 R 5813 0 R 5814 0 R 5815 0 R 5816 0 R 5817 0 R 5818 0 R 5819 0 R 5820 0 R 5821 0 R 5822 0 R 5823 0 R 5824 0 R 5825 0 R 5826 0 R 5827 0 R 5828 0 R 5829 0 R 5830 0 R 5831 0 R 5832 0 R 5834 0 R 5835 0 R 5836 0 R 5838 0 R 5839 0 R 5842 0 R ]
+>> endobj
+5790 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 719.9123 191.2164 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_9a22818e12d0abab8d8a8e0d3346f51a) >>
+>> endobj
+5791 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.032 719.9123 251.6593 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5792 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 685.043 191.2164 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_cf54a358f4ddf09f56364da87de68a49) >>
+>> endobj
+5793 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.032 685.043 251.6593 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.3924 685.043 350.0196 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 650.1738 190.2598 661.0777]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_4039bbdc92a28fade431cb98f20b0fa6) >>
+>> endobj
+5796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.0754 650.1738 250.7027 661.0777]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 615.3045 190.2598 626.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_11810ad660a4aa63766e8ebb0334b7d6) >>
+>> endobj
+5798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.0754 615.3045 250.7027 626.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.4358 615.3045 349.063 626.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 580.4353 192.4714 591.3392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_29b14636d21c90e28ee1821666dc1d64) >>
+>> endobj
+5801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.2871 580.4353 252.9143 591.3392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.6474 580.4353 351.2747 591.3392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.3603 580.4353 448.9875 591.3392]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 545.5661 191.3657 556.47]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_2f220b5f73e79a2e6feab3a97a7e2445) >>
+>> endobj
+5805 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.1814 545.5661 251.8086 556.47]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5806 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.5417 545.5661 350.169 556.47]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.2546 545.5661 447.8818 556.47]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.6579 510.6968 203.9488 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_7f9dc23eef0ab2ef9d07f4d53177afce) >>
+>> endobj
+5809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.3226 510.6968 264.9499 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5810 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.4175 510.6968 341.0447 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [359.4063 510.6968 416.0335 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5812 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [457.369 510.6968 513.9963 521.6007]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6823 498.7416 222.3095 509.6456]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 463.8724 191.9234 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_952922658abcdfb880fcf0a8483c9620) >>
+>> endobj
+5815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.7391 463.8724 252.3663 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0994 463.8724 350.7267 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.8123 463.8724 448.4395 474.7763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 429.0032 211.8487 439.9071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_83b02e8cbb5d14a2ebf2843e6551391d) >>
+>> endobj
+5819 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.6644 429.0032 272.2916 439.9071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.0247 429.0032 370.6519 439.9071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5821 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.7376 429.0032 468.3648 439.9071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5822 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 394.1339 211.3007 405.0379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_38ab8dc3ca19cacef112ca316bc7ce09) >>
+>> endobj
+5823 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.1164 394.1339 271.7436 405.0379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5824 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [313.4767 394.1339 370.1039 405.0379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5825 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.1896 394.1339 467.8168 405.0379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5826 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 359.2647 215.3157 370.1686]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_01c5bdd401e8bc17ea983d941be2aa49) >>
+>> endobj
+5827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.1313 359.2647 275.7586 370.1686]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5828 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.4917 359.2647 374.1189 370.1686]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [415.2046 359.2647 471.8318 370.1686]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 324.3954 191.9234 335.2994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_84565fd9471a52f83618d0d5ce461c3c) >>
+>> endobj
+5831 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.7391 324.3954 252.3663 335.2994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5832 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0994 324.3954 350.7267 335.2994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.1057 289.5262 157.2538 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_6d5c75bcc32f8aea006e8da4b3f736b2) >>
+>> endobj
+5835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.5909 289.5262 241.2182 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.9513 289.5262 339.5785 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 180.4888 145.631 191.3927]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >>
+>> endobj
+5839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [179.2045 169.1563 324.659 179.4376]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.swox.com/gmp/)>>
+>> endobj
+5842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5789 0 obj <<
+/D [5787 0 R /XYZ 90 757.9346 null]
+>> endobj
+5833 0 obj <<
+/D [5787 0 R /XYZ 90 306.627 null]
+>> endobj
+5837 0 obj <<
+/D [5787 0 R /XYZ 90 243.2398 null]
+>> endobj
+5840 0 obj <<
+/D [5787 0 R /XYZ 90 155.5823 null]
+>> endobj
+5782 0 obj <<
+/D [5787 0 R /XYZ 90 132.6478 null]
+>> endobj
+5841 0 obj <<
+/D [5787 0 R /XYZ 90 132.6478 null]
+>> endobj
+5783 0 obj <<
+/D [5787 0 R /XYZ 90 95.3617 null]
+>> endobj
+5786 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5857 0 obj <<
+/Length 1538      
+/Filter /FlateDecode
+>>
+stream
+x��Y[��6~�W��4hu�d�m�d�63�d��d���`�mv���=�

2�K�igX����w����"]
�kpW	�
�;�upw�o:�x<�����t�^K�5�H*�7��I���vo�{� J��1�]�	��,^�)�ͧ�;;����8�W/^�yw=�-J������r$I��{{
�D�l4�`�rjz���盷�W7�����y�O��g�
�R�v0bF��40"����)+�·Ο���A��	AX((CX
+��QD
8f���h��g�O
<
�3��K�w}��@��-��Q3R*�ࠛ�1Ps�#�I9 ̒b̦pSS"�Ac;
R;���tc�rX
ġ; 
+Ihe����2��UŪ\��ȹf:/~e4��tF��
�R�D������ A�e+� rU��@��<^
����բ�!
���Y
��R��ͣ$͛��g���}�5�r��]�+|����:J��ߍ��o�^��)
�F�Eh��[
�������B�o��R���2�㢌��E�7F�	ҳ���	ы|�u#6�뚵�opuR`�].�� ��4
��=�==�� 
+&�
+>��y%N'��T�To
�Dv2m
'ё"H
H,U��Ŋb�0ò��?g�'���N�9���=�jĥ.�iRB�Ic1
�r �D��Q~_ğ�f?Va	�H�J[V�i`۾��
������
+,-T���*�wg��وm(��JB1R�$/G��#���T�$��LV�vY	 k�N��������O��mQ�lgg]��E�?��
+q��>���V���=Y�X��yY
+5�4F����rEA����fk�(_T_�
��E������4
����r�Y�<�0��8@�'A�CE��C�
d'�ʲS�2�� t���ro
:�އ��
�PWsW�W�����sQ���Z+ؕ����`�8NF�S�Q�a�ڞ��#iG��j�Ef�?�}[�e4��JRW4��{Y.�T%�!���h�"F�9 at s��H�U,?���U��p����v��:�߆CKr��K�z�lk�8�% I��7�zLC)%����3��P�pid�ͭ�A���J�ZmQ�N�������r��}��Z�G
+E}��׌�͹-ycn
!��ܖ��Zn���ܖl�����ј�Z+�7�7&n�m�0i��=w���T3 ��SYώ��J[�ZU�Ik�
�����d%��SQ�4�'���
+k�v�?��@�
]��yn
�'�f�ӄ����`�����†��t�Q�C{���Φ�Fi��{nx%^`uk�(^
S}Des�4�ҥ
m_�|�o?S���r����S&�EQE�%�yT�u�&
(?�ޗa�C��g]�e׏R#E
����E	�1]\��N8'oJp��w5w�X4˫ǼY�?捿���W�]-˫�}�Δ���)p/bK�#
�J������P��q��Qʟ��-��}������-��X�]��4]���zxx@�-�p�0�Z,�W�~q�����ޠ��K
~HQ8mc]�嶬�g󸺦�������?�b��ʿۢxendstream
+endobj
+5856 0 obj <<
+/Type /Page
+/Contents 5857 0 R
+/Resources 5855 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5717 0 R
+/Annots [ 5870 0 R ]
+>> endobj
+5870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5858 0 obj <<
+/D [5856 0 R /XYZ 90 757.9346 null]
+>> endobj
+5859 0 obj <<
+/D [5856 0 R /XYZ 90 733.028 null]
+>> endobj
+5784 0 obj <<
+/D [5856 0 R /XYZ 90 703.2841 null]
+>> endobj
+5860 0 obj <<
+/D [5856 0 R /XYZ 90 688.7138 null]
+>> endobj
+5785 0 obj <<
+/D [5856 0 R /XYZ 90 653.4651 null]
+>> endobj
+5861 0 obj <<
+/D [5856 0 R /XYZ 90 638.8948 null]
+>> endobj
+5843 0 obj <<
+/D [5856 0 R /XYZ 90 591.6909 null]
+>> endobj
+5862 0 obj <<
+/D [5856 0 R /XYZ 90 577.1206 null]
+>> endobj
+5844 0 obj <<
+/D [5856 0 R /XYZ 90 541.8719 null]
+>> endobj
+5863 0 obj <<
+/D [5856 0 R /XYZ 90 527.3016 null]
+>> endobj
+5845 0 obj <<
+/D [5856 0 R /XYZ 90 492.0528 null]
+>> endobj
+5864 0 obj <<
+/D [5856 0 R /XYZ 90 477.4825 null]
+>> endobj
+5846 0 obj <<
+/D [5856 0 R /XYZ 90 442.2338 null]
+>> endobj
+5865 0 obj <<
+/D [5856 0 R /XYZ 90 427.6635 null]
+>> endobj
+5847 0 obj <<
+/D [5856 0 R /XYZ 90 392.4148 null]
+>> endobj
+5866 0 obj <<
+/D [5856 0 R /XYZ 90 377.8445 null]
+>> endobj
+5848 0 obj <<
+/D [5856 0 R /XYZ 90 330.6405 null]
+>> endobj
+5867 0 obj <<
+/D [5856 0 R /XYZ 90 316.0702 null]
+>> endobj
+5849 0 obj <<
+/D [5856 0 R /XYZ 90 268.8663 null]
+>> endobj
+5868 0 obj <<
+/D [5856 0 R /XYZ 90 254.296 null]
+>> endobj
+5850 0 obj <<
+/D [5856 0 R /XYZ 101.5566 179.6694 null]
+>> endobj
+5869 0 obj <<
+/D [5856 0 R /XYZ 90 164.9996 null]
+>> endobj
+5851 0 obj <<
+/D [5856 0 R /XYZ 90 115.7384 null]
+>> endobj
+5855 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5874 0 obj <<
+/Length 2153      
+/Filter /FlateDecode
+>>
+stream
+x��Z�����]�����{�~E�4u
�	`'ן\C�<��D�(�
��;|-IqIJ���
p"9�ٝ��y���1����s%2���z?��
�~;#�c�{m����n~�bn��T�o�

� A	��� J�
�/�/	^���_�_R�Hv/�0H��O�]�/�_�M�`�Q�������Kx�K�a�A�dD.(��O�?�����UkL�|i����<�=�8È-�Op�1���3NY}���:�`���\.�]����Y�/"�r�c�+��jڭ`��&.��

�����wqn`���o�-��`T�%�,.7�\�t�ÑфW��
�z�N�cVj=3C�ffH*�*-/N3�����s�1�(�z���x�m
)mD��?�
i%�Ł�H%��B��DVB�p�ga��%�Q���
V����o|W��e�8,p���.xvh��B+�l��
�T,��)t�d�[{^z����O��@Z
+a]���
�Mס��
+d��}�

��3P�A
��
uއ:Nj��
u�:�:��Ы���� ?����90��)����TP��Հ�/�� �����
�E�쯳U�7�c�;�;�N1�Q�)��qy��!���
����5�}،�������w(ͫ�P#�� 

�~����6A��/S(|U�ş�!��zo��윅�$��8+����B�8�P.�X�����Q�w
a�3�#��Ǐ�	��*�B\
p�Ȱ����;�
�~�p>FI���r�)BH
4��3r�p�j��hH�J�d]��'���K���R&ON�f)��R���`ULJ4k��p�b1P$������I�&k��Z,�k��������Q�����*�=�
N~Z=L�$c
�n��k���L�� [�d}�Cz�3����7ٶfκО����؄q��ޭ�L��Y~�Ov�$g�Soj�a�
_;&:.
�J��i�-PLb��
)�i��)PB�8�E0�E���h���B�0�X���Cۭ�pY
iY�*y�A��o3;��
ˌ�r��U1Uȁ7�E̟�x�;���6�RƂ�/]
+)���vLGO������F�C�M����=`̿K����ߤ��
��s�nu��J��i�]Q�J�RV�ѹ�͏ 3�c$��������(�~��q�n��Off�-p�<�:^�!���|F at t�/(5�I&
+W�y^��ƍ��OIǧ0=:��&�C�'�Z#��b��
��pv�n�َ�ǂmQ�<Пc̍��-Ǭ�S�E�p����]��	ڔ.�*�뭟:����S�wꩧ��3��l�Ea,6�Q#8��p�m
�D͊MFm�b�	�u�:v?3jQ��U���`!����
:�L�BZ����#�:|�ߘ�<�JuD��?&��0�1�Y�c�Ŧ!2f��q�"m���؞3u! ��|����*���UZ	S�&��`d
P�VW����bڀ�?v�h��U���W�a����y��G馒��0+?���rƮ=�U�
\C�
��3d/���'�����ABY�x�P�R^[́'�ѠoӍ��O��
x$���f�F��1UR�$1��ШQK���q1Fؗ3s�*���0��Q�*QC���@X+~�65{ZΉ�( ��n��yT����5_M1&��7i"�(R�ЄQ(ÒQ�1��&�'s�-(E���� WgR>L���[j�i��Yl�eܮ%L��c��K	��8��� _`>eJ|N;�)[L� B"��
k�4z|�y�n�b5B�J~"j}��z~���OmՑ�lKY�o�ix,NH�q%
3L�:(T5'�j)�-���n�!�F[���L�J�a"�ƈT�Mi�b�H�v-��v�K�Q_�w�Z;��� ��/'�g�)��6�	 D^����&Rc�G$`�	��"U�Q��-Oe�Mz�<�P4��>��vo��
+��I~����J�%����\+�� �z3�
����7���"Y����O'��T�t]	`f�:���9��'X�e}�U^VgY��?�a��R�Eu:����]s����
+��{
X*��FU� T��� Q� ��t�T>��=��G�Y���z�<�R�-����f�������Z�)�)����aw�C7�\��ȑ�yV�����9�e�m��
#�Ԟ���}q��ד��c)�^�
endstream
+endobj
+5873 0 obj <<
+/Type /Page
+/Contents 5874 0 R
+/Resources 5872 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5895 0 R
+/Annots [ 5884 0 R 5885 0 R 5887 0 R 5889 0 R 5890 0 R 5892 0 R 5893 0 R 5894 0 R ]
+>> endobj
+5871 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Grid__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 5896 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 758.00000000 150.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 5897 0 R
+>>/Font << /R9 5898 0 R>>
+>>
+/Length 5899 0 R
+/Filter /FlateDecode
+>>
+stream
+x��UMo�@��W챽lwwf�#�VU.��nUeQp��$���Y������
޼y~TF[e���Q]|�	j�,�Q
���9�S���B�	��d�j��0:`4�렙��(��η��6���������B�ȗQ�>��$
��b]�U�8ޕ��u��j����j1[�W�fX~��j����ⲙ�?~_�u�[�������Typ���\�ڸ�����W��iє���SUo������O�9f�)Q0 �K��I�1���5�Y|	�#O�<���%�����G�g���x��&N�Nf���)��Q�@�r�E���	��КE֋_����;���r�<�8 ~�:#�����I�2�ds4*b���I�P�Hd�!СI�#
���e�+���柑t�=v�"ϣ��E����W5�r<�����O��z�(O���a:�x�(Y��Qzk��%�wNZb
A�̍��� �w֡�.;� ���<b(m
 ��r��z�{�
��������j7t�M&k�Z�Q��N�6 at V.�>Z [...]
+endobj
+5896 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142737)
+/ModDate (D:20080908142737)
+>>
+endobj
+5897 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+5898 0 obj
+<<
+/BaseFont /ESHNRP#2BFreeSans
+/FontDescriptor 5900 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+5899 0 obj
+704
+endobj
+5900 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ESHNRP#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 5901 0 R
+>>
+endobj
+5901 0 obj
+<<
+/Length1 56840
+/Filter /FlateDecode
+/Length 5902 0 R
+>>
+stream
+x�����V���eB!=K !
X˒e�*��H(!�xw�������{���{���{�<Y:��|���G~xF��=sۜ{�eB�A���M�Θ5Q#�?o�>�o����of���}a��M
x����LWa�3���!����:�X��� �y�3&�=�J��o���{�v�V��
��J�����	b��{s����B{:�������/<��=_� ��J��)�Nh%�w���?/~񵿧���K���F��,
v�Yb���q�h�'(�F�^[�jA���*�z�s	�:Iĵ�)�#
�N뒫@g��	�%V#O��yt�p��Lj��g�W"6�;��HF�:��k:I�@�
�"�6�4��4t�X��
:K��.�9b��*q4�8�1�:�J����c��c�I�U�P�"�?���L?�&JD1@��k�h!4���O#6��D�nx�K�=G��=�����ڽ�O��R%z��"1� ҥ��B��ڢ��j�>�������Y���\9����
�jO��=����*�����=m����O�z����^��.z�5Y&��x�
z�''-wPb`׈$1��
�:&��JŪ[*w�[�Z[&!J�ӵ���x/�$ѤD"���w��قVh!�3=�B�:�MB���Y���=�/W�귌��_�S�&y!�ɖ�-�m��������k��/-^[t�h-�U�6-������ZC�x�~����]��^UϿ��LL'��2����g
+����w�+�ݻ��˼R��۳��-��|K�����Si��Z�œ]�\���h���ϷW[������L���\�e���BO{˴��|������¨z�s1��o���/�?�<уn
�=k�w5���ӈ�j�o�ĉ�-��U��u��v�ȉ]}�	����`��_��Oo�@J
lm�ؓ��a��c���Z�m]{��ў^8-^���P�
{���/hi+���X�2�����RZ�/{m�o)��
h�(uy�E�����O+y�#ピ�������C:��o��fͺ���~
��/�tS����/���_o����=�m�c��缚��Z�y>����+����ȑj���^�9�VA|~>��,y��$���M��?ER$�e�Kp
w�HH
_*^��ü<=�X�ˏ#�����(bbUb5bub
bMb-bm/���:�o��K�G�#�'6 6$6��x/��^�{�$A�^�Lzs;EX^�mBlJlFlNl�1�M8^��YoJO&�S=��k�m����u�v^����9^�K�@�H�D��qޮ�n�<bw��W������G�W{�z$�&qq�#�q
qq8��.�q.q%�
�3�+q!q
��ǃm^�
�5�S^#>N<I<�q�3ij�^
�D<O�@\�5���	ī���+^W|E|C
�uS��5��,�{ݲ��ae?�T�n\D|�͔�,؋؇؛����؏��[�
@|M|K�I�$G�@��D�C,!eR!U2F���0rr8I�+�+�#ȑ���(rrUr5rur
rM�w�r-rm��
M�C�!ǒ������
�
ɍȍ��ğ�k�r"�J�I�L�:i�I�$S�EN"7!7%>$>"7#7'� �$m�!�d�̒.9��BN%�"�&�'n ��ې����v�Lr9��C�E��e>!�'�;�;�;�;�����������
�F��
d��$��n���O. �"
d/Y$Kħ�gd�Y&+d��'����� �'��7��/��?y y q)yy0yy(yy8yy$yy4y
y,y
y<yy"yy2y
+y*yy:yy&yy6yy.y
y>yy!yy1y	y)yy9yy%yy5y
y-y
y=yy#yy3y
y+yy;yy'yy7yy/yy?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7������MR��)�b)��)�)��)�R�5�Z�N�H�D��FR+S��U�U�ըթ5�5�����j4�5�K�K�G��֧6�6�6�6��S��T+�4*A�A%)�JQ5�ڄڔڌڜڂڒ�)�JS*K��dj
+5�ڊښ�FmCM�fP�R�Q3�Y�lj�=5�ځڑډڙڅڕڍ�G�N�6����T'�EuS=�|jU ^'>�z�"U���=���e�;����{T��PU��ZH-�SԞ�^���>Ծ�~���ԁ�A���!ԡ�a���ԑ�Q���1Ա�q���	ԉ�I���)ԩ�i���ԙ�Y���9Թ�y���ԅ�E���%ԥ�e���ԕ�U���5Ե�u���
ԍ�M���-ԭ�m���
ԝ�]���=Խ�}���ԃ�C���#ԣ�c���ԓ�S���3Գ�s���
ԋ�K���+ԫ�k���ԛ�[���;Ի�{���ԇ�G���'ԧ�g���ԗ�Y�W���7Է�w���ԏ�O���/ԯ�o���ԟ�_���?��_/a�4E�4C�4G�@��D˴B�t�
F�@�W�W�G�#��Q�*��j�����Z��t
=�^�
C��ץף����������	�D������uڠ��I�h��DoBoJoFoNoAoI۴C��
��]z2=��JoEoMO�����3�m����,z6=�ޞ�K�@�H�D�L�B�J�Fϣw�st�Nw�y���
z>��.нt�.�}�
t���U��^H/����^���>��~�����A���!��a�����Q���1��q���	��I���)��i�����Y���9��y�����E���%��e�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_�`H�bh�aX�cxF`DFbdFaT&�
cV`�3+2+1#�����(ffUf5fuf
fMf-fm��ͬÌa�2�2�1���
�
�������f"����I0:c0I�dR��Lb6a6e6c6g�`�dl�a�L��2.3���Le�b�f�1�0ә̶�v�Lf3���l��ev`vdvbvfvavevc�1�39��ig:�<��t1�L3�Y��^�Ȕ�>f��T�*��,d1��fOf/foff_f?f� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�f	�/K�$K�4˰,˱<+�"+�2��*c��+���ٕ��Hvev�
+�*��:��&��6�Žf�aǰc�u���q�����F���xv;�me��&X�5�$k�)�b'���������[�[�6�i6�fY���Na��[�[���m���
v[v;v&;����a�g�;�;�;�;�����������
�ƶ�
l��d��n����.`
l/[dKl�[f+l��g����� �'��7��/��?{ { {{0{{({{8{{${{4{
{,{
{<{{"{{2{
+{*{{:{{&{{6{{.{
{>{{!{{1{	{){{9{{%{{5{
{-{
{={{#{{3{
{+{{;{{'{{7{{/{{?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����#8��8�c8��8�8��8�S8��qø��܊�J�n$�27�[�[�[�[�[�[�[�[�k�Fs�pc��ܺ�z�8n}nnCn#ncn<7��ȵrqN���\�3�gq��M�M�͸͹-�-9�s�4�Ნ�M�pS�����i�6�tn�-�
7������p�ss�
�
�����]�]�ݸy��\�k�ڹ.�ur]\7����p��+r%��ۃ+s���s
�E�bn�ۓۋۛۇۗۏ۟;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�����������������������������������������������������������������{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{��������������������������������������������������� [...]
+�p~E~%~?�_�ů¯ʯƯί��ɯůͷ��u�1�X~]~=~
�>��!��1?���O�[�8��	^�
>ɛ|���I�&���f�������;|���Y��'�S���V���4~~:?�ߖߎ����g�s��������N���.���n�<~w>Ƿ��|��;�.������
����������
+_�����"~1?������������������������������ϟ��ȟğ̟ŸʟƟΟ��ɟş͟ß˟ǟ�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_���������������������������������?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?Ͽ��ȿĿ̿¿ʿƿο��ɿſͿÿ˿ǿ�������������������������������������������/���(��8�A$AAb�0aa�����0B)�,�VVVV����Z���:�a�����0NX_�@�P�H�X/L&
+�B\Є��
��L!%X�$aaSa3asa
aK�
!-d���
+��)�Ta+aka���0]�!l+l'�f	��9���\aaGa'agaaWa7a����ڄv�C�
�B��-��BA��BI���B����I���
����-�#�B�@�A�0a�����xT������#�%��$���������NNNNNNNN��������........'���������nnnnnnnn��������







��������^^^^^^^^��������>>>>>>>>�����!N��#.�~~~~~!�~%� �~~��$.�"N�����q�H��H��Ȋ�ȋ�(��q
q2q�(����1q���8\\Q\I
!�WG���������k�k�k�k�-�hq
q�8V\W\O
'�/n n [...]
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_�PH�Rh�QX�SxEPDERdEQT%�
SVP�++*+)#�����(eeUe5eue
eMe-em�E����Q�*�*�)���
�
�������e�Ҫ�MI(�b(I�TR��LR6Q6U6S6W�P�Tl�Q�JF�*�2Y��LU�R�V�)�(ӕʶ�v�Le�2[��l��UvPvTvRvVvQvUvS�)�+9�MiW:��ҩt)�J�2_Y��^����>e��T��ү,T)��eOe/eoee_e?e� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�e��J��J��ʨ�ʩ�*��*�����S��+���Օ��Hueu�����������������ڢ�V�QǨc�u���q�����F���xu�:QmU㪦&T]5Ԥj�)�R'���������[�[���i5�fUW��NQ��[�[���m���
u[u;u�:K���Q�W�;�;�;�;����������՜ڦ��
j^�T��n�G��.P
j�ZTKj���ZV+jU�W����ꀺ�������������z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z������������������������������������������������������������������������ [...]
b�6�m
��k��cZ,�cF,3c����$�il���-b[��K�2�l̍M�M�M�
+}�Z R��Y���|��{s��R��������y.�
�.u���|.�r�������Y�/��u)�Q�����Ū�
�\�=W+�#��\��0�l ����
,(�|a��e��'��U�����"U��^���᢫�B�RWN���Li˕�nZ�)t�
_�SQ�
�djP����"�@RS��z��[�a�ԕ��Z�p�U�狅\������k�湂/�i�~��
nZ�@_0Ӽ�3
<_
��^�|������Š���ڻS�7`�l������|	��T��
uFw�+W��-���j�����Pb�YC�>��A
�@�
+���B�U׌�A��/��Ɠd��
<\
�av�#����tdБsP�~�eNP�~_�s�=�.�����i�W�?
ޏ�2�.�Eu��u������pO_H;
�=#�-��]��v�V�8$j�J@�d҄LAZ�6����@f!�@Z���o��\
�p-�Z���k��\
�����.��l���l���
l�6�m`����m��
l�v���c�b:��l��
`;�v�� ��l���}�h�4���K/
�4���K/
�4���K/���Q�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?kp��Y��
X��z�Y�g��z�Y��@w����
t�w��Z�]��$�E*og��lF���tziP�K�Z[!�dR�4 ��&d
+҂�!
�4d2
�^�?�8����?�8��2�>�W�/f�_T�.�,b�#
04`h���:j���:j���:j����5��@
�cuL����o��G|�3���
�g >q��@<�I/	<���^xI�%��^xI�%�
I�?	�$�L��3�g��	<x&�L��3�g��&�i��	|����_�Ki�/
����4����_�Ki�/
����4���,��4����_�Ki�/
����4���,�����
��a8L�i�
��!�k�����ebW9�0�M�6��)5Ϳ�h�D�Sg�!
�$�	�R�K�������lH2
���B1'�O�'	��I�$�|�@>I�E<iA?�8���G.I �$4�k�⭥��Ң�� �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I$Pn�&Pn�&Pn�"!%�hH	L�&l2af�j�X��
=�r��S�$��ם�U1W,U�|ON��Uz�5�o�UܟZ��������9u�Ҍ�|W�4��so�b},��Ws�䜗�����<f'��ᱳ�=���[���rގ���#Gm�OM�v���m=��������ѳs�<��������m+=�m)S�"��Z�E
��뫟��VD�A��癶Z�j�c;�j�GY̞���nV���
+c�U+�U
�t�T��Z��������W�U.����zu>��կ���]��Z�+�m>l�0�R}����Z)�5�+	+��@zk����鉷z�jF<ҴH��G�i�H3#-iV�%#4
l�5YB��
��J�G�ţҴ�أ��(b-�S��Ӣ8��d-*Y�JND%'��Qɉ�-F"�HD�#a$"
=��#
=��#
=�l=��#
=���;z"=���HFO$�'�(*3�Ōb1�X̨d3*ٌJ6��ͨ�TTr*�o*�HE�#a�"�T���0R�aX�aX�aX�a`5��m1XZ��f��_�Ec�5iz����43�R�f?��x��!
�|�ױ*ұ*ұ*�Sn4�' >
+#
;|
+$=,+$=l��9Ĉ������������������������]��]��]��]��]��]�n��<��u��u��u��u��u��u��u��u��u��u��u��ӱ�ӱ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ2Ա2Ա2Ա�ױ [...]
+	|
�:�u���G�:�u���ׁ�_�|
�:�76�5�76�76�76�76�76�6
�aOl`Ol��������J����������������������������H7	\�
�
�
�
�
�
�
,�
,�
�
�
�
�
,�
�
�
�
�
�
�
�
�
�
�
�
�
�
썍���T/.p����F��%"M�4#�R�fF�&#[2�Ew!nRKI�Q�=�GZA')F:��LjF�%#͌�T�E�fk��#M��Ռ0�Ì0�Ì0�#a�"�T���0RF*�HE�#a�"
�_����Cj�	H
ҀLB��)H
҆t Ӑ�5��7��7��7��7��7��7��7��7��7��7��7��7��7�!^2�&��|
��7��7��7��7��7��7��7��7��7�m7��M�x9�D�7��M�x9�D�7��M�x9�L�8�'r��
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qba�X'Ɖ�qba�X'Ɖ�qb���9�i�
d2���qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qc���1��c 
���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
��
+��
+�
+�
+����������5��5��5��5��5��5��5���s
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k�L�ڊ��sŎr�����/{��bea���<}aO%W��153[��՞���SS�kj��Y��ߜ��}�䫾ǂ
W������/��}Q��m��E{�0߿��_T�9����ÿ��S����t��Ep��7��6��-���?�ϲ�Y�oW��+�|v�Z��
�9���ʹ��҂\�\��SSD��BShꏴ�����r���"S)2��t�*�b5��N�����\y��G^*0���R�B���XXX!PkM�g�\����y�1��M��|�vg��w��Y�߯�,�ݯ��~�=]�՚C��������)_m�)�@����Z��E���X�h�/�����x��V���Ї�]�Z_F�׋e����c�l�
ޱ�;6x����
�b�Wl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x�����a�?l�
���6����
�a�/l�
���6��/���`�l��o#����6�<o#O���6�<m#?�ȳ6�<k#��ȳ6�<k#��ɰ
č<k#��ȳ6�<kc�dc�dc�dc�dc�dc�d��D{&�'��>�Ɖ���m��m|h�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l�c���)��S2�d6N�l���8%�q:f�t�Ʃ��S1�b6N�l���8�qf�4��i���0�a6N�l���8
�qf�4��)��S0�`6N�l�~�8��q�egC��p�d�����3&gL6Θl�1�8c�q�d�����3&gL򞃼� �9�{�|�`}� �9�s��� �9�o�|� �9�c�<� 9�G򎃼� �8�;������ �8�7�|� �8�7֡�u����$C;�G�p�7
�
y�A�p�7
�
y�A
p�
�y�A
p�
�'�濃���t���w0�
����<w0�
�k����u0
�S�9��楃y�`^:8�v0?
�O��橃��`~:��桃y�`
:��N�
�7���i����`�9�oN�
�
;8vp6��l��p��F���?i�O��F���?i�O��F���?i�O��F�������i��4�-�~K����4�-�|�F>N#�џi�g�8�|�F>N�����4�1�~L���Ki�4�Ry)���F^J#/�����K� /ų���'�dR�4 ��&d
+҂�!
�4d2
	�8����?�8����?�8����?�8����?|
��5�k�׀�_�|
��5�k�׀�_����O ?���O ?���O ?���O ?|
�:�u���ׁ�_�|
�:�u���ׁ�_�|��
��7�o � �|��
��7�o � ��$��O?	�$��O?	�$��O?	�$��O?	|�&�M��7�o��	|�&�M��7�o���rs�ĸE���w�����qQ�ϥ��~
+�)ী�~
+�)ী�B�-��B�-��B�-��B�-�[���o���rm�k�\��(�F�6ʵQ��rm�k�^vX>�e�^6�e�^�
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~ȫ.��8�c0�|+�]��@w��=��9]��
�v��.X�K�`i,킥�ְ<ҁLCf ��Am\��
�v��.X�K�`i�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,삅]����x�X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
Vu��\�u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X��� [...]
+x)ी�
X�k�`M��5]��
�tS!
�
�t��.X�k�`M��5]��
�t��.Xӵ��t-�[���o��]]��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.X���`U��U]��
Vu��.X���`U��U]��
Vu��.����`Sl�M]��
6u��.����`Sl�M]��
�t��.��{�`O��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]����
x�?��G������

8�����:�Ns�oE�4w���'�RgOW9ߑ�t��V�^N�{����?˕|\�@j�X�X�ur�X��:�����s�=E�G���R�I2	iB:b~q{!���V�%H
O�xB�x҂t��7F���|���`̸R��(4*�/��
�ҳ8�U�k�����(z��RtQ��)v%x����Ȯ�_R�W~�^�3^�3~ѕA�P-����W��\P?;z#&�d [...]
�
��C���
	,
X�RC�K
O�!�H^�U�{�
��v�R	n� �H�{��"���V�6�\ke�߰��s��'Z�%Z�ڞ�!O�$O�$OM�DS$�I4E�ڞ�	|�&�M��7�o��	|�&�M��7�o�t�\�\ZT���y_��|Y�5Sp����hm^�p�(��=�'��eol����P+L
+/���P����j�F~�^D��+���=/�T{r!��W
�ƹ�m�
x���
�����������7�J�׹�������kMO�J�+��SYЛ�v�h)}�R_�\�_`�
+l��U�K�RWO{���
�P�I�S�ֲ`{͓�
~c���~a�ɬX��Z��T��ޞB𝯦�^M
V��� !R~��Ʉ�����E,��}�R�G�|_�?֚�����B���0�z�}�ڿ��Ɛhm�j�P�Զ���:�
Lfy����`��k�x�!�C�IH2iAڐ�W`k}��,�[sH
:{/Oj����V��!n�
�:�G
q?�T�b�#P��ᾆ4���!X�h��@�4�,

 i�A�� D�!
 ��Uk
�Z{ҏ�
, �w�5�k��]k
�Zkx�ړ~F]� �/[kx�Z���^��𲵆��5�l��ek
/[kx�Z���^��d- ��gO�t(F<T4(	+�	-Z��s+=tN�B�H1C%�DJxK!�hX���G�a�z�
ƣ�%���FT��
�о�B�}A�()4r
+���:�����)4r�d�ShboWU謿�.N���]U��/T+��Z��?����,t�l
�:�B[@��
�<���t�;{<��h+-�x�
�3�P�6�)�7�������N�}ВZZ����u�%|^ ������ ��	��� mH2
���B��
�Ǔ�
��<	�0

q�C��
�%!���tĥ#.
q�KG\:�����
��7�o � �|��
��7�o � �|�I�'��~�I�'��~�I�'��~�I�'��~�&�M��7�o��	|�&�M��7�o��	|�)ী�~
+�)ী�~
+�)ী�~
+�)ী�~
+��-�[���o�\
����g��F�6���8m�i�<q�a���F�6���8
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~�.�]��w����
|�.�]��w���~pD��
�Y� ��
�n2X8y2�v Ӑ�,�Ȁ<:J�ڋ���������V�
Tg'������O@\���(�.y2��(�֧.^b����!C�,O=��
�YM�
+|&
�(����\� �IĐ@
	�~@F�@	���
���v��x���+T.^�r��'QK
�ꨝ��u��G?k
K����!RP7������)�T�W�U\�w����n������7����.���Gfo���J�
����#�⠿��t�k
�:��ZT���΁�=h�4wu�ŮA��As{U�ו2�e~})�z���z�SG���
�O랮��cP-�}��}u�m��:s�:0�����s��8*�A�:�Σ\�����a�����Ht�x_�ކ"��
�̽u�@���^Uȸ�t{Z�N�t��v�C�|�UO}�����>�w5���ᝎ��P��&�5C
}�G
m���߷.p��1U*�S	
�#5%zݿ��
=�`���d	Z�Z�=��{��^..��!R�E�rd,}�ZPJ��BP�7��0�bq0�����z0�5�
"�W�,B���]
ھ˫�e^0T}ՋA
�������Є��ka�ր�P��=WaҨ)h��`�����1���%y�������
x��P�C���4��֗r�
��p0wa0��L�F1|��� �zw���=-.�*�Y��#���"�����2U,�Ƀ	n!{q�[EG�� ����R�m�������Ӂ���ǎ`�Ƀj<��
gs1Tz1�1c�RF�P�ݰ��G�AJ�����͢��R
ۣ����
�bX�bP�H
�O2
MY�
����ty
+dd/d� Y�C��W�&��|� ޶(ʶy�zڱ���&���^��ް���: ��Q
�c����P+�	t�����ڢ��mH����

aa��PN�@
^b	d0"
�(
νB8
+�`���
�O7
}0��A�(�K
+��c� !Ԕ��T
�b��J!� ��T?�{:*hq9T1�C=
��<H��
K;��v�`}uD��F����IQ��J�����P	B	’U�9b�T��V�n�p�U–
Z��.�@���T�J��5
+�
Vw���e/d��
z�� �ٵ���
+i
�2m��0緅	�-L�mȬpL�ma~C��)�x84��6�h

�ų�ђ�f�K�)
�޶p<���`�a�C��sm
�j3]E���
+�(�
+75���U��U��5����
OU�oU�[j�tu1Uc��������":��h,?S��N~�곭R�x
Ұ��(���0���U��U�4m�O�5<�V�T[�
��z�u7<�[_dot+ֆD>X�޺8�-�`��XG�

���JC��eÆ�a�EY+��B�uJ���s*u�S	;'���t��ҕ�J�#��
���;�R�
�薿E��q�J�� �[x���ж�C
�PƊ
�(���1qLź[]��WŮz���[�
e̯�5�����+/	�ʟ��W/1�ݬm���)�V
+m����Ȇ[
E����5����jk��[1PQ��(ԗPi��7z�
.��冫�{r4��cik�m�R
v���m�HZB���vՄ8,f�h��S)�6v�����'*�Tk���4֞����r��2�.j]�Â	�o�����x�'.�N
�4�O�RaU�D�R���Dje�f3TR�YL�����V?� �Ĉ�������e"=���F���<�魡�ZS�[�6!׶�u�x��i0����
3�OX�����^1�k!f���R���
+�*k�F�
+�r
����n���7GM��ct΃qB_9_i�H�F�
p焅�j�H6)#nוz��2F]�3Tڐ
Fv�2�!#M-�cD㝸�EK5�8z�~�o�T]���ڥ�#�l
�d8��F4C��lfL53�
F �ƈ��^�#�f�l�qy����ڐ-�
ق��l$�D���
+nD�x&,'�Fc=Z���R��9����f�8͌�zDk�#Z���m�M��C�
+3�֤�D��M4k�D��h6��1�l7&a�l�59�Y{5�[�55�Y�5i�!Gk�<�8ߛ��ϔq���GrHsH��H��G<=�܌={�Cz�Cz
���#;��;�G���f��塵֣�.�V�/�h
���fs�I5�{ԇ��G5�� F��|
WK-f���7���ȵ��k�[w
f�x�����.���,�h�a�x�h��=T�PI��*�P�6Xj*��������p���MX�뻡ɢ%|.����k`�50�V�hX��&�̄r_w��k�0"]4��#�V��N$��a��0�db���
%�[����-��-l3D4CD3D4S�,{0G��&
_���V+��LԖ���,7�sI���1��،���[�4��r|���df鱜�v#
-�c�%}|ȍC8����c����Kcr_�G|����jpM,�u���ƥ�rbrۧ-c�y
9�!�F�o��7�C�MbȾ	��i2�4]"4N�z�m�siX/4�hX
��T�`Y�{��
M3~��������%�p��a�fa.o��#�
�a��tO����Ru.ci��Fi���3�(�֟�%�
	}�lܭ�+.���xF���a7Z
a�^r,6�
�	C��;&Q3��
���{�?�cp��ݍ�uG��p�cjm�x���M��l+�;]�t��d3��̘jf���͌�f�l��hfԛ���n��,x�Y���جFv��Mk�61:Z3c��;ͪ�4�8�Yݝfuw��K��y(npzNh�
�����ݝ�����
����Z�N�D�n��)����
�C���ͽY��q���{�?�/57�t�oUm�M�q�oU��cU3��=��ܝ�kU���BC�꾋�S�fF���n0�^j^օ`՝KE
ˎ+
>NvB_�ZY*S���э�MʂGf�
k
Q�C�u7�i��ݴ[�w3�����n֭m;9T�vr�dz�e/}3����rn:���Ͳ�-�S�Uՠ1��j�bɻl/u��'��Ƿw`��_3��I��e
F
rDz�R��Р��p�J�͘`9�ץغ
і�.�~l6�@tWs֫�P}��Y
��n��r���
�
�!=�!벜��!㰇 [...]
�g9�ka��_��Az"
*Z�$B��d���

ߝ��n\��w�2ïM��k=��D�6����0Z#D1�h�0Z#Ѹu��[�d3��̘jf���fF��1�̘if�63�M��ph0ƛ�f�D3���ج=�f�i7kO�Y{�͚�n�tv����5�ݬ��fM�4k:�Y+9�Z�i� N�q�5�ӬA���AC-os�Fco6�
��џ]������2ZM�8����<{<�vq#*z���
st�Hp|-j�<�5�FC�d|y�kC�t��u.eH�-��e�@��u{,|ei׿.h�Ռ��Z�&�x��
U<k�˱��V3����43f��͌n#N|�2j͌�fF���Y���RF���Y+i�_$-el� Z�њ5H�Y�$k�!l����f��ڬZ�5Bk�Fhm
+ԬeZ�U-ެj�f�o֭a�
_�k�a�h�L͒DS����4d���!Q��CG}/�A<A��GgGM���S����C��_�}"���5�<�[�x���1�J�_��W�?�.��B�Dۿ/���o�1��n��n2Ѳ�ʣƬ7n�1����F���j�Ujt
�
�^[�DrҤ-�
�
�>4��i���;p�/}ݙ\���?�,9"I���#��%gm:��-V��%�-y��Sn����'׼�Fx�;y�W{�q�bĨ�Y�JnF�6F3��1-�<Ha�
�
A������<������*
L���u�,��7Vrǐ�3w%�+�-�=e�1�
wK}����p{
�
S7���}i}�e�鳾��\u��7.��ʙ�ιp�wB-��	�ɰ����#G'ۨ�ޝ}�ϗ.��^���y|�
+1������^��h�
��E:��~��K6���!GU�A
s�V�/r;�T�����a�+7�,��c�g��'��`~��D���%(eܺc��fc�Gz�5�]y��#=��^+�K�L���:�G\2q�%�,y��c>'�Ƕ��P��
�q�-�6����Z��%7,����[����'��M
�B�4r��ο�z�S���޵��v�:g����o9��ߤ�v��E��KKNg�_��O9r����Wbɒ�N�5����l����8Bw��ڵ����4~ν7��W!@����4�0 o0��L_�#؊,��,R�������K6[�]��v��>�q��]���a�N��v;�m��:�l�;7A��ζcgv���7�=�������ޙ\���
1_*���
�L�`^�1g�0����i�x��6J
�˅��dLo�,��9co�����������FwR��=fy�Q�6N��^]��ՙ@1���aчż=��cR8?0$^"��F�Eƻ��WH��jK�!�g-X��x�P4X��~�D�!ģ�\,�^�k�᭵={A"��l}q���{fO�n��i�--���M�><LM
ι�zꘝ��
���kAc��FC	��n~���E��7��D���-A�G��#mq�gs�����Qڅ��>mm�:4u˲��2�2\����tL�Vm
F�Xtj�l9�L
R�,X�2�}����-��
�lO�������+�j�}�XinUasOaVM���hd�m�p�X��O)]3-������R{�sk
H- ��m�$v$�*HX�L� ^‹�
h��:��K���
+���.�����������
1J�W��27
���?
�

+��2���]����Xpr�9�����w��tO1h���
֢T�x$����DV�V#Y�UE����A��!�X|Ǿ�3l|�����4=��4��V�.��GNG)���=ِ:��xc�s�9�7�Z��.��%��^cx���
	�i��I�Pٹ���`��N��v��{�Y��l2Ɇ
��7!N��x�!������~�Jۗ�a���I/~{{����7A���~��J�L\�]��;���y���/���'y�ׯ����C/�C2{
�
N����
�j�_�z*B�UC����G��eω
+k���se�k�U�Jeju��^�&�
j��W)�W

/q�P7�&JK��]f��X\0����� ]�+�QM�.T�m�Z#�x��_+��Z뜦�hJ�d=�Ȇl�`��V/�5��}�O�c�;G���U/5_9Y��k�/ܸ?��{o`�����w�j��ċ��}m1��z�U�c��;�Q�
���6�,�
+�v�	�޲�H�o'�R)Vz�G_�6K�;����K�����ߎ
�H�\S�Oi�;�džR�P7��c�B$q�l�:��s��'���������߻�2�wO+E|�� =�wj at Kɢ>*
�i�l�}[R�>m�3Y>���;��-J�ҵ̔��?w����	Ɋ��Ч�g��Wy�M�}�uV�*[��'�5��S����g�tNLB�2d�<ђZ�rE�s]:ɺ��)ʏW�ցXv�3D
�KA�9"Dʤ����K��l����Y�Կw���hZم��O�v�s
xE�m|Z�����Y�/�u9�DǠ�;��5t��R�]��N�KD�x�	/���*�7�K8�.2j��4\��82 �yZV�Ö}�-+��W�E�����
XȨ羾�r$(I���h�o�O��S��O|��D
oEt���qQ�\�PDN��M
�[�䡠x Oy�˻xߋop��V�
��ZAQ��h�`�D?O��1|���g����?���
���
8p���
8p���
8p�����+د�0�X
��W���i�#ba� �#
5����6!Ö̬ld��E(������m7=��y�����N�G��g�i~
���{��yw(�s��3j�e�)�ߏM@�e�,�
k#�A��/�� �"T
�RT��#z��Ōv�p/���;�{��hv���< �u���Z�>�oĻ�*}��
��'Ɗ�����C�߇��5��Z�S���Ki@=�2��.�$�!灲����I�
���pط3��� 
��n�k�so�~�[j�'`������ܠe��}��/`�m�endstream
+endobj
+5902 0 obj
+21241
+endobj
+5884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [462.1911 177.777 513.9963 188.6561]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 165.6874 133.0584 176.5913]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [471.5582 152.736 491.812 163.7495]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+5889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 127.9638 513.9963 138.8429]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 115.8742 160.1764 126.7781]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+5892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.7984 102.9228 513.9963 113.9363]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+5893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 90.9676 134.1543 101.8715]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+5894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5875 0 obj <<
+/D [5873 0 R /XYZ 90 757.9346 null]
+>> endobj
+5876 0 obj <<
+/D [5873 0 R /XYZ 90 733.028 null]
+>> endobj
+5852 0 obj <<
+/D [5873 0 R /XYZ 90 691.329 null]
+>> endobj
+5877 0 obj <<
+/D [5873 0 R /XYZ 90 676.7587 null]
+>> endobj
+5853 0 obj <<
+/D [5873 0 R /XYZ 90 629.5548 null]
+>> endobj
+5878 0 obj <<
+/D [5873 0 R /XYZ 90 614.9845 null]
+>> endobj
+5854 0 obj <<
+/D [5873 0 R /XYZ 287.7769 552.313 null]
+>> endobj
+5879 0 obj <<
+/D [5873 0 R /XYZ 90 536.2086 null]
+>> endobj
+517 0 obj <<
+/D [5873 0 R /XYZ 90 449.1482 null]
+>> endobj
+222 0 obj <<
+/D [5873 0 R /XYZ 90 442.548 null]
+>> endobj
+5880 0 obj <<
+/D [5873 0 R /XYZ 90 220.6164 null]
+>> endobj
+5881 0 obj <<
+/D [5873 0 R /XYZ 90 220.6164 null]
+>> endobj
+5882 0 obj <<
+/D [5873 0 R /XYZ 90 207.9041 null]
+>> endobj
+5883 0 obj <<
+/D [5873 0 R /XYZ 90 194.7135 null]
+>> endobj
+5886 0 obj <<
+/D [5873 0 R /XYZ 90 169.6724 null]
+>> endobj
+5888 0 obj <<
+/D [5873 0 R /XYZ 90 146.8231 null]
+>> endobj
+5891 0 obj <<
+/D [5873 0 R /XYZ 90 119.8592 null]
+>> endobj
+5872 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F11 416 0 R >>
+/XObject << /Im8 5871 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5905 0 obj <<
+/Length 3033      
+/Filter /FlateDecode
+>>
+stream
+x��\Ks7��W��U!���U�$븒�lym%�$����Ċ�Ȑ�K�~��y5F�|H�`J�����_���&�����
qB��r}A'���w�~{��S�����j��\O.o�4#�3>���}��|6g������E�^\��q:��?�����?�O�||��]���͹����}��CqS�3f��fY�%-��r�f^�|��2���+���������5���
J��j�~��9�'�
�E������������B�ߞ
I��Oƈ
B��1F�'1bT)��D��������Oq%&���Lj��e�8�u����\@��wk29%�ʂ<�
�a�g����j]l����j�Yn׻�a�龨�4�
+C�0��T��v�?�����nQV�gi�a.~��
�0�D�Y�����`��i޾��ʄӰYc�W�źh8hM�4�H�ۓ��*ok̇4�>3m]����B�Xm:<���N0c��%�
�d��}�,a��Am� D���񤍌�0�_L�0�ٹڰ�*��ڐZM�36���7]���,V���sd�X���ՀL��^�wpdrrЖ��3�lkކe����|��r5�
�j���
���T���MQ.۲�`J#��h�̩�_#j��z
�&΍:Y;*�v��� \���&`�
+���0���p�QQ�_|�1R��W�4�Ym�DV��V)�y���H��sdtr�Ymaڧ{c��զ�g��k�_K�t9.6c3:G�l�2�%f{X	 SF�啁yL�����M�bʀvS�3�!��I��0b��+M�P�	mRT�Uz�w�1\�'(cy��8�hOW
�����\'�����X݉ݖ~wr��q(�
::`�M�N;{*G�9��h�xq!h�`�
���}L.5*��]"�i
y���"Е�ۖIh��ӊ,�
j�sV'hԊ�ZQ�s�)Z�R9y�
+�
a�K%� 6o�ܴ
J�7���t�R�r$��p�l�ī��(h",�RI�V",+��I-�!�
��^t������R�4]i���9z��L�� Z���OK�����9]#v/��u�>q�2$(�U�L8��z�����>A�&§u�U��AA
��>H��,/(�c"(�oT��ڜ��q̘�]�a�����<AQ�1�
+
+�Np�AA��tQ֪jKIS"8T��D
K)�3Sֵ��6c��բy�
+,
+v=x�DT� tr�:����R*A[
7MA���0��9`�	��~0��~p�Q?���)�/q
+`%�;0�~({֡s+���Φc�;�3����$NA9<

�&3��a 9���ɠ,�~X����~��MJ��	����$�&�2>��OX�X>�1�I��~c��~�$�T��$_mf�‡���{X�oӣ�΀a�0Rt����9�$��6��
s`@H\�'w�h"%����H X~X>?0�I~�~c~�~_:?�}	���#��M��ՙ�3į��€�2$ a�
A=�2$�7dH��� +ܲ0�-����p�$�k�����)J�
+�{�|)��W��X췛�
�7~�N�+N��U��?|�a��9�uuߗkx��3-���Y�gٰ�$�0�1�N
}�p]�t�J�_�j�
>������(
CG
�ȗ�����5�s��9���l�P��.ð�$�m���W��:A��}��


�2
�+��`�&�$�_I��
���9�0
-��఑7�N"��򮨲y�.ʐ���
_mo� a�P;������0�5�����8a�P�7�������b��(��?>l�(m}
+�nͰFS �����
��#�
��k�;ޡj������@9��
+ʶ�������h�r;<��2h��o�8��U&4�a��"���
 ��B���v����jc��������t�U̘���aq���X�TYa`�3O�yDe�#	,�

�6����ߟ~{���۰�������,Ɩ��R
#���au]_6\T��Ƌ�w�ϫ�m]0C����ɢF�ʙT��(�b�h
+���J���0@ơ"2��
���)P��
Zb������-e�4�\R�p���5b޶k�cZ���9
���-s���va
�
	�������PZSK���p�p�p
n�M�
�t��U
[MO�p����ܿ�p9�:��ܳ��
+75x�p3���.F�$܌� �fL�N��vD'�cж;N���d��¢Q
��xӠ�nr|��Ɔ!�s�V���ҷ��������x���c� DT��`VV�"q��^?b��kG�P���R�*_�ʙ0�b	�{��,4e�}��%��Ǖ;���|�J
�_�pv�x���⅐K��5�FL�]G����#C�cw�5
����"�2$���rؿ4H�k:CY-(lz�9K��
L���MD�WHeD��Ah�=[���8�����ay�&��.�.j7e�j!�h��ۈ	�x4܎i<2
�v���e!��(DT�g��#k�����r1.
I��t�j=����	C@�H8K�Q��ȶ
�x�6yN�Jm �+¾B�1��1K��Q_���l	e:��7²U,5xv˰
�;��a�NU,�5T�fL�
H���$C�c7^|��m���́��Q"
�Xk�D^
�q��0%@i������� {�^�t�y{|.�)*I�+'�3"kM�	�5e
ㆩ�]
+�������ge��Ce��Kd�{��n�kN�nG4'9m���ȵsx$"*CķVS�$��`DS"��cC�9
���F�%J
��ʐ
�W���|��
-�=��%6��`/ݠ<��Q��E��(mRC���O'~"�9��TT_����v����
Q�>w�� �cP���������k
����R�zB~Yl
��k_S>{SE�xV��tW���"�o0��Ǣ�<����2	
�T���$��w�,���<�Dui�$C����;
vo^����
Y���f�+���z��ݹ.K�S���lʫ}[6�:\��i�����f[_[Xo�z:V��z��0�����P�?z"��endstream
+endobj
+5904 0 obj <<
+/Type /Page
+/Contents 5905 0 R
+/Resources 5903 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5895 0 R
+/Annots [ 5908 0 R 5910 0 R 5911 0 R 5913 0 R 5915 0 R 5917 0 R 5919 0 R 5920 0 R 5922 0 R 5924 0 R 5930 0 R 5931 0 R 5933 0 R 5934 0 R 5935 0 R 5936 0 R 5937 0 R 5938 0 R 5939 0 R 5940 0 R 5941 0 R 5942 0 R 5943 0 R 5944 0 R 5945 0 R 5946 0 R 5947 0 R 5948 0 R 5949 0 R 5950 0 R 5951 0 R ]
+>> endobj
+5908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [470.49 720.0467 513.9963 730.9258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+5910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [485.4435 695.0057 513.9963 706.0192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+5911 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 683.0505 155.7331 693.9544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+5913 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [472.1735 670.0991 513.9963 681.1126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+5915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 633.2373 198.3629 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+5917 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 608.3307 191.7375 619.2346]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [485.4435 595.3793 513.9963 606.3928]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+5920 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 583.4241 190.054 594.328]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+5922 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.3256 570.6071 494.5132 581.4862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+5924 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [360.9903 545.5661 426.6335 556.5796]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5930 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2787 439.8969 192.2956 450.8009]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+5931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.7937 439.8969 258.7257 450.8009]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_092f5c04d267ab5709dda2d3e51aaeb9) >>
+>> endobj
+5933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 359.1344 134.1642 370.0384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0262a2b32220536d8bc60d84ad8dac4c) >>
+>> endobj
+5934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.9799 359.1344 203.6231 370.0384]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [287.7866 359.1344 373.1756 370.0384]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+5936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 320.2801 134.1642 331.1841]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_727dc2405cfc5f2252e6f21aa0f18074) >>
+>> endobj
+5937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 320.2801 245.954 331.1841]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+5938 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 281.4258 134.1642 292.3298]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_31603d81a2b0571a82c4c79b8c6e4564) >>
+>> endobj
+5939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.9799 281.4258 222.4324 292.3298]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+5940 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.9427 281.4258 308.8875 292.3298]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+5941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 242.5715 134.1642 253.4755]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0c02302b6281fa91ef9275bd37e43efc) >>
+>> endobj
+5942 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 242.5715 239.3285 253.4755]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 203.7172 134.1642 214.6212]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_527ffa31e1581a8beb83a832244dada8) >>
+>> endobj
+5944 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.9799 203.7172 215.807 214.6212]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.336 203.7172 297.2807 214.6212]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+5946 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 164.8629 134.1642 175.7669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_732d3b59f8a0ba21a72877d5fa4b98a5) >>
+>> endobj
+5947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 164.8629 260.8877 175.7669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+5948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 126.0087 134.1642 136.9126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1ba0bd59426889233904d052224cab76) >>
+>> endobj
+5949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.9799 126.0087 237.3661 136.9126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+5950 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.4531 126.0087 319.3978 136.9126]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+5951 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5906 0 obj <<
+/D [5904 0 R /XYZ 90 757.9346 null]
+>> endobj
+5907 0 obj <<
+/D [5904 0 R /XYZ 90 733.028 null]
+>> endobj
+5909 0 obj <<
+/D [5904 0 R /XYZ 90 712.3157 null]
+>> endobj
+5912 0 obj <<
+/D [5904 0 R /XYZ 90 687.0355 null]
+>> endobj
+5914 0 obj <<
+/D [5904 0 R /XYZ 90 662.1289 null]
+>> endobj
+5916 0 obj <<
+/D [5904 0 R /XYZ 90 637.2223 null]
+>> endobj
+5918 0 obj <<
+/D [5904 0 R /XYZ 90 612.3157 null]
+>> endobj
+5921 0 obj <<
+/D [5904 0 R /XYZ 90 587.4091 null]
+>> endobj
+5923 0 obj <<
+/D [5904 0 R /XYZ 90 564.5598 null]
+>> endobj
+5925 0 obj <<
+/D [5904 0 R /XYZ 90 539.6532 null]
+>> endobj
+5926 0 obj <<
+/D [5904 0 R /XYZ 90 524.6445 null]
+>> endobj
+5927 0 obj <<
+/D [5904 0 R /XYZ 90 511.6931 null]
+>> endobj
+5928 0 obj <<
+/D [5904 0 R /XYZ 90 456.9679 null]
+>> endobj
+5929 0 obj <<
+/D [5904 0 R /XYZ 90 456.9679 null]
+>> endobj
+5932 0 obj <<
+/D [5904 0 R /XYZ 90 378.1083 null]
+>> endobj
+5903 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5961 0 obj <<
+/Length 3550      
+/Filter /FlateDecode
+>>
+stream
+x��\ko7��_�OY���m�m��6m��[��!Kc{��H���_��3$�y�
[q�(P�4g�=�$Ͻ�P!
����%2���|u�'7���3�nO��4|����k)&I���umA$(���_�	A�^L	�������jv�������Xlg�ߗW�������l��Ŕ
+|�j9��˟��b{A�yQ�
�$�����ỳo>r��`�Xj�����,�
ߝaČ�{��1�NVg�2�ay����Ns�~`(���q�%<y4F�!,14��q��$�l�~�Tt�D0<E��{
j�/�¤�K82Xʶ�}��,g���~������Z�
�[�h��Hh�����lU4��m�/�/�8�-lۮ��������F!������8�Oq
<~?0��]�
x]�!"u�@7��������_���u���\K��Qjt�=>G�g���j�G��2�`;���[Bb�=ka8��j���[��V��Z���3�#�L��
�i<(
t���e�K�, �
w3������z�$F\�8.D�	Q߮��j
�P\q�G��l4�È�0B�t�*Ã1PF1h�x|��~�|���w���o?�
���eS���i$���!NDB��kphS��M��FMX�’�}F�
�ઞQw�r��׬�sR��n�.�[�ot�!Z �}|C�o��q<�KE�JfRV�eSVl0���������JY�0�4R��l��0���|t��H� ��6�cy*��穖�|�����24zv�Y�����٦�"�R�t�ﻭ�=k�tL���i�2HjLx��/��/4�tt�>���O�1���
P


+�i�x��s����$ŏl���NP��jQ,���ڮo�2�)�̱�w�h� 
�
=����*/PX�iho&/xX>/DSya��P^���_�h�
��1y!z �<,�Z�慴W�
\����
D2��
��ѳki�8��n��ly$=0H&��t �O��
z��+�`S�AN�������z�O�!��
��D�owtz��=&���
P
L�ڍ�J ���� 
G�JqJz�m$�C�=!=T�3
l�eV�)A@�)9\v�� Fv���
�M��D>p:�b�ϕ
�~I�$����4�^�H=:�$�A���A���|����	-��u��ƇuB�F�nn?+�����q���0�����𥊒�
�
��]K��v��|�������ؖ���@8(h%���P92F"��n�YܭVI-�
��IZ
�Hi��=�T��:\T��g�7e�8[N�f��==_[��:��M
s
S��S�)F�$'�
����`�#�&�S
�livA�bvIeK���-�5([+&yek�
�li=���;��l]��FCW
+��A at e�S(<��u����m_� ��b9���cг;���م
�D"�2<
|�y'O�?�@�U�H��DJ�
*<F��3��<{u����|�j�޸qVߪ���v��ը��z[�oW����zW4�.2בi�[�
����A̋±�ߺ�ו��m�y�+��C�
��K����V��͂����\c[�P�
4�X��z�*��R�i�an����kQF|��
*�@�(��5�
+WͅOY�����x�|,w
�n5[.���]�^���gee;���B"�$i�ws;� J�zd��z߰g�v
��0��v��v����]��ǵإ�]��!�e��l׎I6۵}��v=�G��іi���J��۶�R�T�&��c�
�}�c
U h��t,*�C��U����D�y�1}R��m$R]��{�����f�_�o
��h������!$�R��{���9T��\M
`y��
��RivA�bvI�J��T*�5�T��E�%@���������]�~�)�3O_�%�#e+�t�=*�\+(�c
+M��0���1�
���c
o7�������_�VP�u��Hn,p�}=�`d"�<e)}�u�����M�**��������=Py�
�;Z�F� �=���@}Ƒ�ʗ\�[_w�hR���ͪ�P�
��l��U�
#����L_��.Jh�\WӲ��b�/��|�l
�Yf7�%��
{͈��
q{�jȂ�a
� b�&bB�წs��p�0����
+��n��j���������u�����k������~�0�A�
NAs��#��5�aCjm{�ꃵ����D%���%�D�d�9X�[O�v�}耠�$��V�X�Y
+��,o��ǵx�6�yq�
�ӂg�1�2�d����t#�G����*סW%�͑
)��daHr��I"�^��itx��1�Ҷ��,ǟ����0?����i
�?u�ּﲁn.�j�\��z���Dk����&A��=:
R�Gj8��#��L��
i�Dn�c�4U"7�=,?�#�'��49?�cncgx���gx�f��1�ٵ=l7���D��BY��;
�
;ѥ`��|�D��l� ���
�HL� �'z=�`��
#0����k�J�r�zp���1��4*�@����N�@���宰/t
��tVG�z�� <��NO

��	{߮�D�A���.1�Y�Mr�L*G�{��f=�iQP�?O����߳+3U��3��QY]�̝*�if{Uo���j��a�/V��/bKj�b9R�a1��]�iX�s
x�wøB�
�M0�PƷ��8kw�cdX�Mv�
+L�DءzŖ{m�kz�Ug��͖�˙Аf�Z��y
�q;��^�=
]0ȅ�Tz�
���vJ�]8|��<��
�J)�PY��:c�*��"�1�
�9!�EO��49�E1�G�Q����(�� G1�UY�����2�LF ��HҝT����T�C�Q�T���s���)���'k듮_4�?u 볍�!�\�b#��l@��c-���XY.&�� GX��Ɖ�v�B+w�+�&+
+ۉvۭ���O�,b�=ئ�]�l�P�ьfXV�b����]گ�������
��̶�ī��1��u�x����
9���B�&�a�
	��.$�m�xѯ�8Ҙ��1����]�
.��ӌ¨\�=*�
��
�G,
qE&=E`c	�
��mC%`̄H[2i��b jg
�91�DSb���� v����1b�fг�H1H�!�$���$b0.�������c��8,ތ��8T�"Rw�ãd�)D��'�Bd#%

�dY�g����2
>\����j��!�)�
����J�jxX^5"�)�H����ͨF���H3���o�/����=�1�%+ƒ�CP"�p#M�H_9�A�
x��Ϲ�ٵ������fP
+3�e"P
+
�
+Jt<J20F
���$#���
{�d��E
�8 �<h�)�'������{
�'�9z�����ѳ��ϴΤHd`8��
+ƖL�O~��c�]��7X�}t�ȕ�A����B�s㷳���
 ��;�]-��7ۂ��XE}��}���+ԬF�Qj��g���
�=0��hC���=�������/����|��r�E���f�|��#

+���n{P�K+�
S$�-.����j�-|�jfOh�ƣ �T�)��^endstream
+endobj
+5960 0 obj <<
+/Type /Page
+/Contents 5961 0 R
+/Resources 5959 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5895 0 R
+/Annots [ 5963 0 R 5964 0 R 5965 0 R 5966 0 R 5967 0 R 5968 0 R 5969 0 R 5970 0 R 5971 0 R 5972 0 R 5973 0 R 5974 0 R 5975 0 R 5976 0 R 5977 0 R 5978 0 R 5979 0 R 5980 0 R 5981 0 R 5983 0 R 5984 0 R 5985 0 R 5987 0 R 5988 0 R 5990 0 R 5991 0 R 5992 0 R 5994 0 R 5995 0 R 5997 0 R 5998 0 R 6000 0 R 6001 0 R 6003 0 R 6004 0 R 6006 0 R 6007 0 R 6008 0 R ]
+>> endobj
+5963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 707.9571 134.1642 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_19623ff8cea2239d66331f29c1d0268d) >>
+>> endobj
+5964 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 707.9571 180.1016 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+5965 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [188.3484 707.9571 221.0753 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+5966 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.4889 707.9571 334.955 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+5967 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 657.2193 134.1642 668.1232]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_470e6a581b91bc6d5a4a6388d1ddde99) >>
+>> endobj
+5968 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 657.2193 206.6618 668.1232]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+5969 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.5265 657.2193 332.9925 668.1232]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+5970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 606.4815 134.1642 617.3854]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_df002bbcc4dcae5efdb56bae2971a64b) >>
+>> endobj
+5971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.1628 606.4815 233.4312 617.3854]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+5972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.5465 606.4815 358.0126 617.3854]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+5973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 555.7437 134.1642 566.6476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f306aa1f4e34bf045cd07e5ac11d8f68) >>
+>> endobj
+5974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 555.7437 180.1016 566.6476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+5975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.2758 555.7437 295.2094 566.6476]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >>
+>> endobj
+5976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 516.9611 134.1642 527.865]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_36cc3783cdc92ab5fc69904c298ed12c) >>
+>> endobj
+5977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 516.9611 209.4314 527.865]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+5978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.6243 516.9611 308.0904 527.865]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+5979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 456.2606 134.1642 467.1645]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a28d735beef86789b73b41dbbde71abf) >>
+>> endobj
+5980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.5014 456.2606 181.7553 467.1645]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+5981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.3194 456.2606 274.7855 467.1645]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+5983 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 417.478 134.1642 428.3819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+5984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.9038 417.478 185.7104 428.3819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1ba97c180500b43954b09532151f6c9d) >>
+>> endobj
+5985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [213.0476 417.478 233.3014 428.3819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+5987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 342.3928 190.7379 353.2967]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 342.3928 261.8505 353.2967]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fc06f600e94b7bedb91d0371a51f4c38) >>
+>> endobj
+5990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 305.6744 190.7379 316.5783]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+5991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 305.6744 262.1594 316.5783]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_90ca2b1613fda31a2ac7e79d9388680d) >>
+>> endobj
+5992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.2253 292.1216 390.0817 302.0268]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Affine_Dimension) >>
+>> endobj
+5994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 268.9559 202.9218 279.8599]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 268.9559 248.5799 279.8599]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_53b24395ac61f8b2b2accc5a3900bf69) >>
+>> endobj
+5997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 232.2375 202.9218 243.1414]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+5998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 232.2375 296.1808 243.1414]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_880344de195aef75a6b3f2a4db4787b4) >>
+>> endobj
+6000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 184.5602 233.0688 195.4641]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.8085 184.5602 295.5939 195.4641]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8688fd38682b19e97422816d72524790) >>
+>> endobj
+6003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 147.8417 233.0688 158.7456]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.8085 147.8417 343.1947 158.7456]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_453e51570268eb4d63fc529130a54440) >>
+>> endobj
+6006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 111.1233 248.0025 122.0272]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.7422 111.1233 323.2596 122.0272]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8865893c48cc07adae5dca6b35081751) >>
+>> endobj
+6008 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+5962 0 obj <<
+/D [5960 0 R /XYZ 90 757.9346 null]
+>> endobj
+5982 0 obj <<
+/D [5960 0 R /XYZ 90 436.5355 null]
+>> endobj
+5986 0 obj <<
+/D [5960 0 R /XYZ 90 357.4354 null]
+>> endobj
+5989 0 obj <<
+/D [5960 0 R /XYZ 90 322.7393 null]
+>> endobj
+5993 0 obj <<
+/D [5960 0 R /XYZ 90 286.0209 null]
+>> endobj
+5996 0 obj <<
+/D [5960 0 R /XYZ 90 249.3025 null]
+>> endobj
+5999 0 obj <<
+/D [5960 0 R /XYZ 90 201.6251 null]
+>> endobj
+6002 0 obj <<
+/D [5960 0 R /XYZ 90 164.9067 null]
+>> endobj
+6005 0 obj <<
+/D [5960 0 R /XYZ 90 128.1882 null]
+>> endobj
+5959 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F37 1999 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6017 0 obj <<
+/Length 3363      
+/Filter /FlateDecode
+>>
+stream
+x��\mo����_�O�
�{����
� i
+\.�~IA�i[�,��|���;Kr�K�4KE�pAp��h��p���
�&�cG'F�ԓ����Ÿ�?c�ח��e
+��dzw�i5q�i�'o
���|��e����QJ��/�����������������W��~��������%Wt��j�ݶ�����`vZ�X҂�)���׏?�}�1��+����ϳ_~��k8��(Ϊ�|��9�'�g���au���O�N�E�}!��˵�\
+I����C1*	3�C�� T+åx.�
ќ�I�����s5<=�aԙIj0�P%�\�X��b���2��͸��_շ
�C� �K
2���π��պ��M=��y���4�R-�PDT�"�i�'r�9U�a��8D|�}f׻�_����U׳[���퐖��Pr<U #
'B�a:RE�����,���BBBQG��f
&��������p�
pLl4
��X�e�8����s�P�
�u'���=�al?n�tj�77�^�|x/�����[r�����
�"�&h�c�J!¡��x0S�+
+Gjp�Wg��w'%r
���=����z��Z�w��:�08u�B�r�U��D95�Y]dq=�u�p����e45�
��(�ˈ*МX���*no�q
�)�8?
��/���zp�n���;�
a�����
��o�
n�}��۱���j�Nќ��9vXs�
a�]u��mV���m���=UU���c��n���C* �f-
D�UB��0������|Mm�����a
+�
ڴ���c�Qb��
Eh�$���E��Y[V� +�bb�dQ��QL�5��.�֋"B�E3N�.�1�zTˢHӟ
E:� ���-Y�:��(�8�EQ4������-j&�
+�Sk�@DT��P�QT���xe}S֩��1��)c��9e�'�
+�Ζu�%����E	Ť*�b��u11x�.��.�܎�E���2}�Ŕ�H]Dh�����ػ�e]�9��8��n��%��vi��DT����pJry�$*�Y
+�O���"��E��[C�4����(�uE���"�OU����6~��=z��3��
�q�g�f2|.���u,���G
�
42���y�����.>CR����*x
+GQ��~�-�D�9?I�$��?� ����x}M�0ixI����Ad-��7�]��j�Y�K�p���-���K2���r;��v�

��M�����B�0+A?b�]q�Aa�I՛���7����
CP�ìѮ~�V��@�n6�WZ;=�^=�G�՞R�Ư±�U��6�h�m3�](�q?R�Ln�����-t���\ÉA��q���S�x
�܎�a�@f�������'��S��l&�9N�ЁJ$�O&��?��!M�T'��$&�R��_��?���vm�S���*�^�����f�j�@�Z~1�T2걫��!Zũ�5��
���w�yج6���|��j����
�^��~���D�8
]����8i!*���o���p����\�.H�����ն������S��sS-�a���
�	֝���d�,�?\"#]Q���ALp�AR���܎��@f�Ӄ����R�n�M�3�q�44�h"���CO������L��hd("�D#�����QR�t�U�
cu.�����h5�̜ܵ4Ӛ���0�ެ���x�c����H;�����h ������#%P8��+
i"�(��AD
~;	�E%��v�dv_$pQW�|(=��R�?�J�a�1��퐰�8kN�
��@ ��|;�\���w��o���ׯ_�����9��������7u��o����	dv����<���Q
sp��[�����Ib���S��/�P{R�&6��
�7_�ݵG�V@�p�^}�ApI-N=DX�j�X��~Cզn��
S�8��n�h�n�\og�05�{[ճ�͞�=.
��
<
U`�
+1�
+�1�ϲ����RX؛-�
�n�aUͷa�a�5�M���tA7����9"�}�e at n
Q�Z��ʏ�b���/��*�������_ �ٍE��U��m
�/�
+�P%���-P�Aء���	�¨o��|�Af�3��c
F����*q at R��i�� �
+ ��n�'��/��뱂Ǎ$�Qq��6����������w��������ؠiӻy�i��˽�+���V�� ��(�Dq_�p���>��~2���C����
���� ��O\
S�c��>�ں��u�L���W�2�j.
+���:4�3�P<�:���Xe�w�zd4"��ah�s��e^Ͼ����=���DZ�gC�
���/�	�����zIИ�V�R�2���2V�c�j�$*J�fc�L��$��-�������Q׬4:���(&1U��YL���s;Fq�ݡ4^U���X�rY��^��F#Q"^]֢0Z��F#�K
�VG
+��k(
��*p�cGb���k#$���Iژ���1��h���F�������4B+-WEXQS��4�v��s{H��xE���K�V��X�k^��o�̵e�3��k��M���a-d�T956 _���
%����3��XDT��S�/�AD9�SR_��gi¸ac�.��������A�bY�y6€�)����	#�� ���lf�,�?��&��/��펊�T��
+eQ%��M��=����n�*�E��eL�S�Ju
7�x?��ʔ%Lʓ���6��j��‹s���ֺ�jXwW���
+G&���3�}���Ƕu���ڃ�7������0���wp2��r{�7 j���\]5��>��ns��wb�~晢��K�]6L��
�kw!e
\[��ŕm���<l��!���sH�nk�|��������[�c�:�~��u������
a�v#1�����n�n�v��uD���Z
�n�g��n�c�ыx�����@i�v�l7�X$�N"�)���Ƹ�$��%�{d��$i7p�����n��D�n�$r�G�X$�v'ۍ,�v��ڍ,p�8����B�W��2������/6���}��hd��;T�9�7;�K��y�f<�ߢ�Hz��Wj��K�������V���'[$�ç��ۮ�o�3*�꘩��ؼ=���󖝳���͟�p�����
�bfZ��>ۼbW[b��ʷ;�vo�
$�i}
q~�,���]$߇���w�����?\(5�����q�j�}#
���C�G�J����+��;��?W�ʟ�W����~��I8�S�~����/ڗ
+��3����v���߽{zz"�-y\/j�ܽ{xX���l V��]��ʸ��/)'�P��r�,���q��y�A�G���oL
��endstream
+endobj
+6016 0 obj <<
+/Type /Page
+/Contents 6017 0 R
+/Resources 6015 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5895 0 R
+/Annots [ 6020 0 R 6021 0 R 6023 0 R 6024 0 R 6025 0 R 6027 0 R 6028 0 R 6029 0 R 6031 0 R 6032 0 R 6033 0 R 6035 0 R 6036 0 R 6037 0 R 6039 0 R 6041 0 R 6042 0 R 6043 0 R 6044 0 R 6045 0 R 6047 0 R 6049 0 R 6050 0 R 6051 0 R 6052 0 R 6053 0 R 6054 0 R 6055 0 R 6056 0 R 6057 0 R 6058 0 R 6059 0 R 6060 0 R 6061 0 R 6062 0 R 6063 0 R 6064 0 R 6065 0 R ]
+>> endobj
+6020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 719.9123 248.0025 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.7422 719.9123 370.8604 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_6ae1850664122e9917f174d10fd3bf06) >>
+>> endobj
+6023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 683.1286 205.6917 694.0326]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+6024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 683.1286 261.3124 694.0326]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d14942b33fb82bb3e6a13e5e92ada475) >>
+>> endobj
+6025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 683.1286 338.7813 694.0326]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+6027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 646.345 205.6818 657.2489]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+6028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 646.345 261.3025 657.2489]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_803035024ab9670971868f4b1092f7c5) >>
+>> endobj
+6029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 646.345 353.7051 657.2489]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 609.5614 205.6818 620.4653]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+6032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 609.5614 261.3025 620.4653]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_6f703ba611b9e5ff613f4df35347ee95) >>
+>> endobj
+6033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 609.5614 330.4624 620.4653]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+6035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 572.7777 205.6917 583.6817]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+6036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 572.7777 261.3124 583.6817]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ce98c3e57a1237e6dd5042b5a0919193) >>
+>> endobj
+6037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 572.7777 332.1558 583.6817]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+6039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 535.9941 183.8239 546.898]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2f31170286d3abc2f4867d0b193ae8bc) >>
+>> endobj
+6041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 499.5841 192.2722 510.1144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_59634a195948ff0617177d0a41e30602) >>
+>> endobj
+6042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 462.4268 241.9353 473.3308]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_dc7cdee1981f44b5db23f6c28c79d0a6) >>
+>> endobj
+6043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 427.5967 213.1634 438.5006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_621d377682c2c67051c24b1cc8a03497) >>
+>> endobj
+6044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 427.5967 260.7545 438.5006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 393.1401 189.9009 403.6704]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2528b5f433e743dda827b1028b6c74cd) >>
+>> endobj
+6047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 358.3099 193.2289 368.8403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1a5606b64a035977b9d76b1932227246) >>
+>> endobj
+6049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 321.1527 238.4586 332.0566]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0047a6aa4f26d9133b9d741f68384f38) >>
+>> endobj
+6050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 284.7427 187.6893 295.273]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_3ac47497148e61f3d7a3da09d17a03bf) >>
+>> endobj
+6051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 284.7427 226.6926 295.273]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 249.5389 228.8952 260.4428]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a033cfca735240b3699b523d60ad692a) >>
+>> endobj
+6053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 249.5389 333.4819 260.4428]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 214.7087 229.5026 225.6127]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fde364ce088f82cf2b9a231e7d9f2abc) >>
+>> endobj
+6055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 214.7087 334.0894 225.6127]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6056 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 179.8786 187.2643 190.7825]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_042613c3f4ad30b298d70143c935d7cd) >>
+>> endobj
+6057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 179.8786 293.2128 190.7825]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 179.8786 371.1477 190.7825]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 179.8786 455.7274 190.7825]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 122.1343 187.2643 133.0382]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8fa02815bb561135934f91c9adcd0cb5) >>
+>> endobj
+6061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 122.1343 293.2128 133.0382]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6062 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 122.1343 371.1477 133.0382]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 122.1343 455.7274 133.0382]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6064 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 110.1791 220.0576 121.0831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+6065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6018 0 obj <<
+/D [6016 0 R /XYZ 90 757.9346 null]
+>> endobj
+6019 0 obj <<
+/D [6016 0 R /XYZ 90 733.028 null]
+>> endobj
+6022 0 obj <<
+/D [6016 0 R /XYZ 90 700.2099 null]
+>> endobj
+6026 0 obj <<
+/D [6016 0 R /XYZ 90 663.4262 null]
+>> endobj
+6030 0 obj <<
+/D [6016 0 R /XYZ 90 626.6426 null]
+>> endobj
+6034 0 obj <<
+/D [6016 0 R /XYZ 90 589.859 null]
+>> endobj
+6038 0 obj <<
+/D [6016 0 R /XYZ 90 553.0754 null]
+>> endobj
+6040 0 obj <<
+/D [6016 0 R /XYZ 90 516.2917 null]
+>> endobj
+6046 0 obj <<
+/D [6016 0 R /XYZ 90 375.0176 null]
+>> endobj
+6048 0 obj <<
+/D [6016 0 R /XYZ 90 338.234 null]
+>> endobj
+6015 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6076 0 obj <<
+/Length 3656      
+/Filter /FlateDecode
+>>
+stream
+x��\mo���_��\�y|	�M�Mr�5�����[��"����wq}��ȥD-G>�MP.Z�h��|�pD-�Q���
�e�R��:��?uº�/����೷'���j��\��^7
4#�3>{{��c���
F)={s���|��_�9��l�z���v��o��v��ç�~�[^�_pE�>_������ڝ3{Vmx҂�3����o�>��m�aWB3��~��+h��'�g��|��9�g��E��:����O�Es�X
+�cDh��J���+&������
FufY!NY7jĨ$�	g
쵊	W<I8c�h��,�����s5L�]��a
7Xaq�&Ա~�w��*
+
1L�AX���.�1 �_�`��,���T
+�����m������*��n��04�
Rp��D{F����v����/~��U��r���8N���L#
��D[5��iu�� 8���a|�-�PS��,�_���mu}���e��zGN�����h��0�pK��t����d��@��M�D�G@�~'eB*E��2�0��F3q�����6��W a*� JT��q�L��5�,֮���3��ʹ5�����	��aʥ>�F9��(-[Ρ0�%?��8�����f�q�jh{
	3�x�zw_�F=�\'Eg����X&7~%4�l�Y=�����$�p��D))�ۡs�I4=��]���t8�m�ͶnqT���-���s�u�W~�O
�n{����_m�����Zm?t�ߌ�߁Gj�3�T
s�>�1��ـ�p�\xR�
��!�:,����|_�㴾�.�?�`
���W��}�����"LJ�n��
�$\0DgD3Tg�
:���^آ�臝�3 ��):����3��Ag�S�ꌉ	8�2���tF1Qg ���A��3&��3�Xr����|
t"�~B�11�Q��}��(f�3Ag�x���K7Q�����-�b��/��i=��1|Um�ݼ���f��F�1
�Q0*G���`)I#��m��z���H6�
'k��GIc��5���4V�����_3������\��j�%L1B-�h���!)��yۀ��v�.ؼ
5U�Q��ΚW|
+�U%�E_4C_갠������
W|����[P|�= �ی��/[
+�/�(�H���)N�I?���%��nj
+�=#��,R�>;D���-���
+�
��,�=}��<)+�~+��<�>
+�S4C�'p���)�f}J�[�����@gi�,�S�#
��Vq���a��p����q�S�{r���Nm�Ƹ.��\�8,q]9n�4l��za�p]@��#�׻�^=\
#=�zʰr��3�ҘA����dDZm��"�c02�GI�o:�Ś����.� �#H�a�=��%�
f����~L�1
+�k�}
+�
 ^����l,e��`�S`�D�#q
q�3��4l
[�ռ0�=(		��K�[��GP��]�?�U��������/O�W#���cm��?G߇,]8�5�M���y���gW��`8+5��ڍ�Ez�8k��z7U
��w ��?�n���|��e��`��}P#%o� �
���G�;���$�<1�
E0��|6�l 1��C�
������8
�+�?K���V{�ՙ_~8�{H`gsM#�VX�A�j��~���ą
œS���5ʈu�<i]K|�ֵ`�1�k���>V�Ģg�I���Ϭ��z�[�����l+�rSoǪ�0'�z�M�a{���Ǘ$�`Aʾ��$a[�vȒ��%)uXX���ݒ�
[T���T9 �����,��D[Ɛf+,��-l�n����4��?]n��eS���us�k���Nj�
�\=����(L�h�<� �~��iEe�7W����'����M������r�k��"�T0��֏o�����ȑ* �W��	������Q�8
�����w�E�ο.�զy��||Ӟ����x��ȃ���;�[s���fQ�
�=�]	���Sԯ�W��A���Xx�f��ĬD%�
��b����*Iâr�z�\D at d~=��Օ�����̟��D"#�R[NC�Bp��09H��
>�m&US�1������$X
�
�
+�J*��O7
w
#�ҢO*i�>
+��<��\]�{OOۻn�n�#�'��`!�TP?��19"�,<g	�f���ND>ף'�Ja9ъ�|AR��8V���&
덖e�J͎�U/,�W���
+��}_�p�2��W��|51�B`d~;��׻�2?Z�
v�~&����VBt9��E���%F�'#S%�
+f}�jzh�+ !E�ʝ�0B�h1B~�1���%
�?�~q^�X.�*a4�y)qX�r��Ki�▬v–
���9�r���<v2�����|D+7�eԠ����X��ԬD{F�,��?Z!2(�]A��
+��1��
�?�x�DP����S�]��a_W�c!����D�X\�|�����E�/F<�W��U]�=Ɖ��G}9_b����z�����KÖY�v
+�d~?��J�HX���z�~�YoZV�+����e���HFy9	�
+�}�(u���q��~
+�>
+�ͦ�^Y�����Kz�yI�K�/�����X�,��,�:,�
�c�^Xt��=aω������-៣�9$��I?��Y!(8�B��t��}' )����h������0�G�
�af(YND�B�ID���+e\A��xR�,�Q�`6��n��7�x�s�^


��u���-��L`<\����@�
`–�H�ܤY B�@ɗ/�q�a=PX�-��D�8,a9n �4lQ���N�{���8	�%��N�-�$Z!�|q�X�}qT�1�O���������F�e�P���DD+
�?����o0Jd�B��j\�D���wJ��t$�DP��5B��F3�>S��D�v��
���~�	:���w�#ǩa�)��y�V������x!���N�D��`d~������)���
�Of
3
��
+!�
%��=���}�7��D8��"a����l"o��̲�a8�2B��,M����1Bb�
�����;=�����Ls"����
��a���q��aq>녞�ge��G�Y)	�!
����Ϧe"�2��o��w��(���r.�Bp_g�Aq�@�L
r���������������jY?�V
�`�(�ڋ�o��~��{�8�5+����F3���%�+�
���	�z
+��Ad~��fh>,VU��`�YC���h��F$6S��{�B9FNN�H�G
�Nn�C"38�S��
+ំ(G�n�UB��TL}��.���.yc`�hu��
�2|�4���ɘ�@Lr����������JK��+��v���D9�w%�
�~4!��q�"�HG�>(�Ѵ\
�	?�:Ms�\�F�b�Q��
���!8"�
���*%F'�L�����y��7x��e]��c���'x�m�7��ڭ;)�&��n������?����J�b���tY{���{���n @�w���r,@Ͼ�FJÐK�X?K�?���7i����"��}��$M�������ݧ�^}��,��~��ۑe���n�*�I*
+d���l�{�"eXz闔���m�E�I�z��;u��z�ߖ�xX�Q(�V��endstream
+endobj
+6075 0 obj <<
+/Type /Page
+/Contents 6076 0 R
+/Resources 6074 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5895 0 R
+/Annots [ 6078 0 R 6079 0 R 6080 0 R 6081 0 R 6082 0 R 6083 0 R 6084 0 R 6085 0 R 6086 0 R 6087 0 R 6088 0 R 6089 0 R 6090 0 R 6091 0 R 6092 0 R 6093 0 R 6094 0 R 6095 0 R 6096 0 R 6097 0 R 6098 0 R 6099 0 R 6100 0 R 6101 0 R 6102 0 R 6103 0 R 6104 0 R 6105 0 R 6106 0 R 6107 0 R 6108 0 R 6109 0 R 6110 0 R 6111 0 R 6112 0 R 6113 0 R 6114 0 R 6115 0 R ]
+>> endobj
+6078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 708.9533 186.3482 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0d8ed7a0e48fe76e7221842c780192b0) >>
+>> endobj
+6079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 708.9533 293.7723 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 708.9533 373.3671 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6081 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 708.9533 456.8371 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6082 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 651.17 186.3482 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_53f980fb1ac8fa21265bec985bd1382f) >>
+>> endobj
+6083 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 651.17 293.7723 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6084 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 651.17 373.3671 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6085 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 651.17 456.8371 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+6086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 639.2149 218.4038 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+6087 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 593.3867 180.4964 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d743f8b71eb68f6b41f7ea7b5d21dc22) >>
+>> endobj
+6088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 593.3867 228.0875 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 558.5175 213.1533 569.4214]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8d2cc5d18d050975101f2860f2919da8) >>
+>> endobj
+6090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 558.5175 260.7444 569.4214]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 511.6931 218.7333 522.597]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_87e253a2b1d8e1696c2ebf3feb11dc5f) >>
+>> endobj
+6092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [222.549 511.6931 241.1491 522.597]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+6093 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.396 511.6931 282.1229 522.597]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+6094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 476.8238 161.6774 487.7278]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8edc85ba3e8a09593959814eaad72499) >>
+>> endobj
+6095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 403.4087 212.377 414.3126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1287b254a91451368e7e2e456f448114) >>
+>> endobj
+6096 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 403.4087 289.8459 414.3126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+6097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 368.5394 212.377 379.4434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f08eeda3b9d3ad843efe1887e4e567ed) >>
+>> endobj
+6098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 368.5394 283.2205 379.4434]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+6099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 333.6702 274.5631 344.5741]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ccb5584441a7c7c84de73810cc6afbc4) >>
+>> endobj
+6100 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.9003 333.6702 352.032 344.5741]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+6101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 298.801 274.5631 309.7049]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0c4e43825536be038437e5570ae60b46) >>
+>> endobj
+6102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.9003 298.801 345.4065 309.7049]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+6103 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 263.9317 225.1091 274.8357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d09e4e3f9a9da562c6cdb73dd7b47fbe) >>
+>> endobj
+6104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.4462 263.9317 317.5116 274.8357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 229.0625 287.2951 239.9664]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_880be9febc6dab2cdccbec8814c9a952) >>
+>> endobj
+6106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.6323 229.0625 379.6977 239.9664]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 194.1932 216.2524 205.0972]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a26f672c32271db69ed68fc60eee8cff) >>
+>> endobj
+6108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 194.1932 328.0421 205.0972]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 159.324 216.2524 170.2279]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9afbfbe2916aa166c49f599370b85036) >>
+>> endobj
+6110 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 159.324 321.4167 170.2279]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 124.4548 254.8275 135.3587]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_85b2560352485ac05d10aab0ee483252) >>
+>> endobj
+6112 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 124.4548 343.0957 135.3587]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6113 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 89.5855 254.8275 100.4895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_434cd24b05bc92b3667a9fd80e995002) >>
+>> endobj
+6114 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 89.5855 336.4702 100.4895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6115 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6077 0 obj <<
+/D [6075 0 R /XYZ 90 757.9346 null]
+>> endobj
+6074 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F37 1999 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6131 0 obj <<
+/Length 3170      
+/Filter /FlateDecode
+>>
+stream
+x��]o[����+t��@���#w�]`���{�]ZY��ڲW�7���%�&��r�t7H֫�WC�GC��#F
��Q�#g

J���������ߞ��˯��ץ��'o�n�(�`�
�XG��)�����S!��g����ݙ������ݙ�w7�������?g?/ƋOo�~��]�����~s3^.7��~�.΄?��'S�d���R���ο;��y6��n���/'?��G���;�LoF�	g"9�=�R�'7'�O���l^X�aW	TLY�f���w��bV{�w��0�%�pR1n�εtz䡖V�Z
+͙�Z��,V�/���ʬ����_
�7�էͳ��|������l��jg�X/,W&��h��#O�MmRs̍du��.
+M`R��6��p�v���r�R��ٮ\&�j+b��UZ���L at A�^z%���p�%�=��L8%a|8L_�����b�
ᘕҏ�l��w���|��
��M**���Q�����I�-���A����j���4��&nt0�����w�x�G��b<�����g��ߦCg�9���xA���#
<V�@p����0��9'BoY����ƍ6��%�x�i���6v<
?��3��IE� >9	�+�&WK���{HY�vP�hV�@h�e5�Ɖ^�[��}`��\�$�1�"��wQ�3�x�Z�i���F�
^��B!43F����7IgʝN/&���������j?9-
QF�p09
ANk-��&��2��e@��D�-9��(9�
�$
4q�MN� ����dr�A���,���m�q��F&61{�)�8���EVQ&����c�jB��(�=W�����3�:�9
ObxM7�N!��Z�=�
QQK�П��*6���'���b�"�7Q�L�S�J�CE�@7Qq1]O�O��i?"a�ȸp�NV��
+��0@d���%,�:˓���&nW_�a�A��2daB�mcD��|��+�
�l�*��}

p�dG��"��`=��
e����G�����&@�=�fI�2 B@"UZ��u���/C@�:���e֣���<�$
4q��CP[Ka�!
hX0�����x�h�9�7,c ��2|�p���]�z�)�������S
+r�0�h�1��y�ʴ��w�g��`����(��z�D�Xo��f�
�u�݈�!��;&�
TߪW*͸7�eHr��0j��v�o�	��YE%w
�]g5�qf ���=�2��$�q6X��X1>�0�`;��;���/I��0*@�y�M9#c�Gn�eͤ" �$<obR�o���=�n����ߓ��
�
+�GVv�
L�p�ðN̻�$9�a��R�9�=^��"��Hgt���� ����������j�x\�
aM��ő�hYF��
���ȻY��l���
�a����l�vW05'�U�)�^R�A���W��uo%������[4�LuA�YE��kl鍭MP
G�9te�횕1�e�f��b�ꅮ7����U����&���9��6�	*rw,�h�1��y�ʴh�V��h�M�
L#ΚB��%
+�U����@�?k����-K�6ڸ}��5b�/EQ\��C���7O%�+c`xK�?<�^���0 �
a�LK�%5��e4
+��
+�	�eZ�ūR��x��&{�=�
Q��"�H
�
�C�`�8? "���Ίd=堉�GBX_��"CːU�	3\��� YͲS�m��10&��ˈ7���O现���
��w�2�ee@�eD�-˪�h[W��h�M\�c�IO

~
�NV�
,�K=�]'=a��Boy��t0��y�S0��!ʐT�	X�	�LPPS�Agz�f\�Z�����2�
4rL�#��)�Fr�.�h 1 �y ˴d3W��h�M��b1��"�Ӌ���uq�G��I��xA���"u�I�
�ލ;�W��$YO�h��׻� Р)�ID�VJ���s��\ἃ}�~]�]�E_?,�����N�IX��L��
�����]�R�����6��#l�)	�%7벌�Z��7A�LKC�J�5�D�ڎ�)4�:�"YE���3��
��~�f\��5�z�F���a�C���Nݤ"L Ѡ�
��!��U�A�w؆]�[�=�o����B�?��:
��9���'=���܊�2te@tD�-誴$���
�#L4qw�n�5]pp8퉂d� [...]
+���;l3����-���/���i�r_(�c�g
���S$�߲�]
�7��LK��J�:�D7���Z���|���-�`���EV6��Lc�r�1/��F�S6���F�-�ŷ�{ש�0!,^��"�(O=KUyE,S�z��
W��H�dO���U�	V��vP��
�g��Ĝ���SO�E*�cϝM`e�6�$h�G��^�;~Q�`���,"�$�nY�%Y�� $a����$-EK
�7
�F
�U���
	n����
N\<�_��U�z�A��`�Y#�RdaD�i�`nR�������(�l���'�����4�K�p��^��oC���`!�<'��&]#
�7��L�^�R���0�����WǛG�8鱢d�I�`��`��F&n�t�&�	m�n�ih�|p�GVF4Qq�\!Q�44����10�%�מ�˸�%����;�B�F��I�2��E@��x�D�2-N�*mUqMܞ���OƓ�A��*�`�V@�#��"?�3��DYO:��+�����*ˆ#Z��$%��9�����2F�$��H�
}�#���S�͒��w;��Gq��؃�Ž�ḅcYQN[˂S~{�q�M�̺0���[�q���}�n6�y���������OgƤQ��x�0��<�(�5��.� [...]
+endobj
+6130 0 obj <<
+/Type /Page
+/Contents 6131 0 R
+/Resources 6129 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 5895 0 R
+/Annots [ 6133 0 R 6134 0 R 6135 0 R 6136 0 R 6137 0 R 6138 0 R 6139 0 R 6140 0 R 6141 0 R 6142 0 R 6143 0 R 6144 0 R 6145 0 R 6146 0 R 6147 0 R 6148 0 R 6149 0 R 6150 0 R 6151 0 R 6152 0 R 6153 0 R 6154 0 R 6155 0 R 6156 0 R 6157 0 R 6158 0 R 6159 0 R 6160 0 R 6161 0 R 6162 0 R 6163 0 R 6164 0 R 6165 0 R 6166 0 R 6167 0 R 6168 0 R 6169 0 R ]
+>> endobj
+6133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 698.1328 278.4384 709.0367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_726484f44f6e6653f9c0126e94e51ab0) >>
+>> endobj
+6134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.7756 698.1328 390.2282 709.0367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 663.5403 278.4384 674.4443]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe235ba8acd485f2334e6eedcb1c53a2) >>
+>> endobj
+6136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.7756 663.5403 383.6027 674.4443]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 628.9478 317.0135 639.8517]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c587faeb0edfd2582564b9a8fa3335bd) >>
+>> endobj
+6138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.8291 628.9478 405.2817 639.8517]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 594.3553 317.0135 605.2593]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8dfa03483c9b2cb3fca3f8724d6eba83) >>
+>> endobj
+6140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.8291 594.3553 398.6562 605.2593]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 560.1364 205.7516 570.6667]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9e87405c740d202951ba788f9e52cbf7) >>
+>> endobj
+6142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 560.1364 276.595 570.6667]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+6143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 525.5439 267.9376 536.0742]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fa7b390fb34934e419263a5fc694c946) >>
+>> endobj
+6144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [295.2748 525.5439 338.781 536.0742]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+6145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 490.5778 209.6269 501.4817]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_943c42b0d1b3580e54b3ab60aa55255f) >>
+>> endobj
+6146 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 490.5778 314.7912 501.4817]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 455.9853 271.813 466.8892]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7704df6970b9563ef9e51793126c0ae2) >>
+>> endobj
+6148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.1501 455.9853 376.9772 466.8892]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 421.3928 248.202 432.2967]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_145cc7c23d407576222e5af347f401c1) >>
+>> endobj
+6150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.0176 421.3928 329.8447 432.2967]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 386.8003 310.388 397.7042]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2a66994a33d910d0fe8daccc6cc017ed) >>
+>> endobj
+6152 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.2037 386.8003 392.0308 397.7042]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 352.2078 243.3704 363.1118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_953a608f6f9d413870fb3eee5cc6ad1e) >>
+>> endobj
+6154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 352.2078 320.8393 363.1118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+6155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 317.6153 247.2458 328.5192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f1ab967a6606266f7e583fc9752667fe) >>
+>> endobj
+6156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 317.6153 359.0355 328.5192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 283.3964 236.7449 293.9268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_82b76e3f18679ea161b53bfa80349009) >>
+>> endobj
+6158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 283.3964 307.5883 293.9268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+6159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 248.4303 240.6203 259.3342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8f97dbc7a7c307fa72f7e904b2cbf21b) >>
+>> endobj
+6160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 248.4303 345.7846 259.3342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+6161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 213.8378 228.9844 224.7417]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_19422844125a988daaf489cbaff3835b) >>
+>> endobj
+6162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.3216 213.8378 355.7079 224.7417]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 179.2453 267.5595 190.1492]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_214e376adb9dc271c61b58f8b2c927f0) >>
+>> endobj
+6164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [271.3751 179.2453 370.7614 190.1492]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 144.6528 291.1705 155.5567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1522764599cd8547bfe4ef7e88d8baec) >>
+>> endobj
+6166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [318.5076 144.6528 417.8939 155.5567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 110.0603 329.7455 120.9642]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_4d6e94fc9839cd5d455f195f46fc2dcf) >>
+>> endobj
+6168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [333.5612 110.0603 432.9474 120.9642]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6132 0 obj <<
+/D [6130 0 R /XYZ 90 757.9346 null]
+>> endobj
+6129 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6181 0 obj <<
+/Length 4025      
+/Filter /FlateDecode
+>>
+stream
+x��\�n#�}�W�ɡ�������
�&/�Ap��v�THj��קjf�5׮YS����Z������O��̈���"�3����j{����W���
+~�j����ŗ�,
V���ʂ�H!���_
+���\	����K����v���R�����mq}ج�)�
6�Ǘ/�:�ח+i�����X��]qS
.�_��,Y%�RJ{���/�x��kb7�
+
�����І�/8S���{���A.�Z�������?������@sϼ�~�R�y
>�\3ᔄtIŸ5:���V��p�J�	�I�AJ�o���	
ܢmp�7�(��2
D��W�
��5�M��_
n�w� "�
+b`�x�]�w��aS��Ɍ��ADQ�a܉~��C��)��D<A�.F�K!̓r���"L.�u>	E a
sg���{H��Vi� SĪ1�B1����G;G&�ı�d�
+�酇����g�j�
a`����xA)�<�-���0�t��tS'b�[�X�
�������sy�9���`��1����j�@���W��v�t��K�E
���5X�3W5ȺF3˝k0����t]jf�
+
�}yz[��p�ܲ8�W��������g�����c���o!�u����w�Èsa�P�4�?�U��P��]����`��#z�{
+h$/+�
| 7@�,���1
�M��=����,*�9D�x�D���1��R�`d�i̔�oSj:n�R�u=��A
��-5�
�RC�����{(5U �����,$<����
ׯ�a<�2@�e��PT. �W�(>;��o�u�K��l	�r��*A-�Q�d�/A�y��	/S�8K���d W� ���*��!Hca��n:�Kh~��d�����5�ީAF۪���8�������N�U�NDZ��
�F��T����b�- �;�
_9�T�pM�*e��
+h������c���;��iń�LI�9]�"�.`-����
X�-]�:���|�E�;�#L��zP
k	���\$�YQ�1]Ȁ[\�bn6�
+c`���xT�#��������c�P� ���B�d"W����j0
s4�<�Hx�V�Y
�!�jp�O3@�o�K��,p+�;���z��
��=�X1L���
1rϜ��#t�\-	bL0��3�H�m�����~7F�2�s�%�
+O0�;A�k�m�+����-�h�OJB1I����&R�8	^�NM�a
�N1$�����䛟P�_�A�۞_�!
(��?�"�62
�`��䳒�����*�m�	�8
F�;?:�Z�f��5�hBm�j�o$Զ[Riv]�P�D�ſ���A0� rQ�� ��L?��[%�y���,$<����TV�V曟P�_
�2k{~)�4
w}�Y�ٲ������'��
g�Pi�7&,
���_R?�e E��E���
	f�Fl��kʶ�9�2�o��}y!i�k���4$P>�nV�r?ɂ^�x��9/	N�з:)!� v���'Pީ�0� �qJ����`�⿖�
�E����kь
��_R�>�+u�,H
�L0�-�3tI�m���Ԍ]�34#��n�5~_
�o���S����(���"��[\�^��IǼ������؝ޜ��N͏(ʯ��ӫ뗠N�A�;q��d�F�:
�z���,�ɚa�]V�==����ϙ��qԤ7/PG	FO���ܤ�����햞�
�s&}>����I��L�Q+��KB!I���������[`޵���|k�DC�ӛo��j<皟P�_�jV�_���9� �L���"�g���D�O�
�%(%�EF�A�`�
�~#��f�L]�3�LD ��USy�..�Y���:�i 
�5���"b�4@@E�鄜�ȹ)Ix*��ݬ��B4?�(���v]�/� P	��,
+h��q@�aX����[�C��	nb1�=�0؞�r��R�3�q�Z��
D�e\��:��p5Ϋ�e���zB�M��#���q)̜�-H�8<��f��:=
 T�~��r�tx_
�O��������8�*0P���U}��ZX�޽�v �̯0W�0?�j�]$�'��m��'�6��q�e����O0�;!�����es�PDH҂V��Z���d���ܪ��Ix*���I	UZG
��"�*a`6��_� (�m���󃶍LH0ZVc�!�*˂6�c�����DM-�9*���T�vK���g�� v1�[����+�)���v�»��S�PD4x�f�B�+&� ��
������؝��
�Nh��E���������@A9�V��-9&����N�ș�
��f#{�\ቦ�����!<N�J����u^�����UBQ��zBJ�
e�"	��;A��`�3_� *�9�
D]Zs� �7���[�
t\�)� v1�y��^��|6�D
+�<@
+���d%Іi-��|$<���d%�
+o�Z��E���y�{~�J��Z/Ωm�J�`�0�.A�?+�*&�le(.@���K�*K0�
�3\@�m���6�J캝�J$��������y\?
���f�^"��8�q&dP��$^已�ӫ� ��&&©�V����9|*��"�*�!R�z�b�0��m96���.
vJ����<Ϧ ^�i�ɰ$�cW��n.�A�
�E�ۢ8�����]}7�PO��g��4x�&d�l�PDpJ:���t��)����S���S�'㻧ư�'���Jk�[�#bT3��pnWӈ�����6O
+����}NX~�z�^Ư��M5,����Kc2�W�u��z�*w88$]�"�.w-��r���]����\�\gJ^���ح8�R�8wwź�nn��<����S�PD���z]0�	�P+/��!���v�7�h(�
+�W>E�gF���p�W�\j��Ь����ag��D<��.�M�+6��?���q��A�@����PD���78>�5�};7��4p��bwZ��Χ�˗U����RC�C��|ȉ�ANѬ�j��.v�m�ۜ��?
��w�y?J��
��Ϻ�ٶ��#֑#�O�gD
&�P�RA3��6,'
�n62�T
�h��n�]�����n?V�[���
+�s]�J(*$��
O~;!�G�6g�{�!�}�]C����mӸ��]S|!��vs_�x~��E\}�(F���ۀ`�w��7
�<w]+��ڞr��F�D<&���҇E�.�7�c'��mBz�N�v�ٱ�j�5�ǔW�v�{wƒR���?� `�YEm�E)_Z�2�%�/m������یr�ф��́j��4.\��&����+"m��f~L�Թ�)Hp�}�*-Y������G�
0V�9�+0q��g
J��|D8Q��L��L��I�#P��f~�D�W*���J_�l�JE~<�"4�G]8�@�m#�T��q���Ɖ�yԂJ'D�J= �w��}�U�'�>�;T*���H��B+@��zl�PTdx�B�o;�M훨���QSu��`CK���I�����2E8!j�
gZ���yD�(�ܨ�5v���\Ԁ��<����)#��)	F˚�������¦�6w �֎���AD���ح�]q�ܕ?��;4��\�|Z���X���1�u@H��ܜ$<A�.-w�ZC� �� ���҃��x���@�zn*��dh#����6�ׯ
�o��f��	K����B��O�/���q�K5���r��U�	Ix"���Y��`�e�Tt
_���Q��Փ��%뀬�|]W;p#jɻ�q�+��������8�����)�����F��pH��ƞ�����ƾ��B�:�~�V�6�u<������|��t�?6�u�?��X
����9��7���]�3��
�*O%B�0¤���
��b��
��n����g�[���?X���~��k5y`��t��������Ց=���+O/���^
�$Y#A�ezo�@�X:��\2���r�?ıuH'G��b+66)GB�(�!gendstream
+endobj
+6180 0 obj <<
+/Type /Page
+/Contents 6181 0 R
+/Resources 6179 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6229 0 R
+/Annots [ 6183 0 R 6184 0 R 6185 0 R 6186 0 R 6187 0 R 6188 0 R 6189 0 R 6190 0 R 6191 0 R 6192 0 R 6193 0 R 6194 0 R 6195 0 R 6196 0 R 6198 0 R 6199 0 R 6200 0 R 6201 0 R 6202 0 R 6203 0 R 6205 0 R 6206 0 R 6207 0 R 6208 0 R 6209 0 R 6211 0 R 6212 0 R 6213 0 R 6214 0 R 6215 0 R 6216 0 R 6217 0 R 6218 0 R 6219 0 R 6220 0 R 6221 0 R 6222 0 R 6223 0 R 6224 0 R 6225 0 R 6226 0 R 6227 0 R 6228 0 R ]
+>> endobj
+6183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 720.2859 193.5774 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e5dc5003b3652660bc4ff4a15e4060af) >>
+>> endobj
+6184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 720.2859 232.5806 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 707.5331 248.8445 717.4384]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+6186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 674.9558 193.5774 685.4862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_26f845c3192c71f59cf1c81cd35072c5) >>
+>> endobj
+6187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 674.9558 277.6909 685.4862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+6188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 662.2031 252.6774 672.1083]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+6189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 629.2522 223.4647 640.1562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c9d9eaf8b76024bc20ce524e13bf86a6) >>
+>> endobj
+6190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 629.2522 271.0557 640.1562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 594.8811 285.6507 605.7851]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_59af9a947f610641fe02639f76cfc90e) >>
+>> endobj
+6192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.9879 594.8811 333.2417 605.7851]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 560.51 192.4814 571.4139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_5527db9204239e40b6d893a1bc2f5ae1) >>
+>> endobj
+6194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.8186 560.51 240.0724 571.4139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 526.1389 254.6674 537.0428]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_29da6d634667414bb52904b7a4f298d1) >>
+>> endobj
+6196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.0046 526.1389 302.2585 537.0428]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 491.7678 229.5525 502.6717]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9831db06919c6ee05360b08e84cccbb7) >>
+>> endobj
+6199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 491.7678 277.1435 502.6717]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 455.9023 291.5393 466.8062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0757c1c1df607bf422c16b8733f53b30) >>
+>> endobj
+6201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [318.8765 455.9023 339.1304 466.8062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 421.5312 229.6018 432.4351]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e697d90302e516961a2a5e5bae974017) >>
+>> endobj
+6203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.939 421.5312 277.1928 432.4351]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 376.2012 266.6729 387.1051]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_68665d093308c111817eca341b98d70a) >>
+>> endobj
+6206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0101 376.2012 314.2639 387.1051]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 340.3357 238.1398 351.2396]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ce27a6a2d10a8c30e30961b1f529f2ff) >>
+>> endobj
+6208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [265.4769 340.3357 285.7308 351.2396]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 327.9565 274.9825 337.8618]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Difference) >>
+>> endobj
+6211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 305.9646 217.1088 316.8685]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e5955a311fc4fde1edf2d5460f0a8356) >>
+>> endobj
+6212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 305.9646 264.6998 316.8685]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 270.0991 271.1256 281.003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_071aa57e439ba4f358c7fd43b03a6a49) >>
+>> endobj
+6214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.4628 270.0991 318.7166 281.003]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.8625 257.7199 326.2592 267.6252]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+6216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 224.769 201.7419 235.673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_bb10ea556dd34e0c1e13f7e99b9efe70) >>
+>> endobj
+6217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 224.769 243.6294 235.673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 224.769 371.3288 235.673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.4576 200.4347 271.3786 210.34]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Affine_Transformation) >>
+>> endobj
+6220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 167.4839 212.7678 178.3878]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_90e87cbe8ae0717fa09ff51b70d64b47) >>
+>> endobj
+6221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 167.4839 252.9591 178.3878]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 167.4839 375.1455 178.3878]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4006 143.1495 277.9276 153.0548]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Affine_Transformation) >>
+>> endobj
+6224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 110.1987 250.0993 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d42265530a9e3b2f3bda9ab40d4a835b) >>
+>> endobj
+6225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 110.1987 289.4458 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 110.1987 379.5123 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+6227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 110.1987 513.9963 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6182 0 obj <<
+/D [6180 0 R /XYZ 90 757.9346 null]
+>> endobj
+6197 0 obj <<
+/D [6180 0 R /XYZ 90 508.6195 null]
+>> endobj
+6204 0 obj <<
+/D [6180 0 R /XYZ 90 393.0529 null]
+>> endobj
+6210 0 obj <<
+/D [6180 0 R /XYZ 90 322.8163 null]
+>> endobj
+6179 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6242 0 obj <<
+/Length 4810      
+/Filter /FlateDecode
+>>
+stream
+x��]]o#��}���SGFl~40� 	6;	fg:y��ڮv
+K^I����ު"E��걜��-���S���ق�l���(C��zq�pE����X���~~�����Z8�4׋�[
��_����1����QJ�?^3�\
�7?^s��o�?5w��������ݻ�6w�+���7������S�9\3�lv�
X҂�%���o��p����\�]	͐��]��otq��+J��j�^Pœ㋇+Ʌ����꿃����B 
#B+?Ib5||���Z�y��p����P�d���

��c�$%\K�0��
���
���i�ax�;FY�Aa��C����Tt(m"�$��cN�6��0 ��)@M�u�Ʀ����o������V��#�es��19\
�l������\
DHC��lG���������W�)��
�����z��Gs�1[��
��>v�Clק�~7$-�X���=*�r��š�
pL�T?_+�
��
E�1�hf�(-�BK]��
*�
+�
C���%td
<:g
�r������=�aDC���"�A�����f�f��3�F:�W��*��F'a���rޑ�kv���n

�-����_	s��~�`��{����Z^H�|h-�;vy���OG@���S�sa�a���
e�I��~ʌ:�%�	>>SQI��_���D
+y�W�G�>�#g�F�s5Ƽ���zT�/ׄB������d�Z�tJ��������n;�q�w���<W���y<40�g�׊(�l92U!�
��`��E�Of~
X�jvX��`h��1��f�a����Ci�sT��`01��ޡp��t�]�_�L�7�t�����.2����o~~~���f!5�
����
+	���9*�ph����WF���~w<�ӱ%�Y77$_��E>?lv��p�B^�Q�-P�NAzC�o!i4���\�
�
�T�qi ��-
��a#�ڂxqC�o�瘷��bV��o�Mᷛfw�9
֛��ݻ6�7���|US���}�����q���.�A
 1�q��W8E�����t
�����}:M6ZAb�x��mo�%�WB��/������D��Y�x��c���3.|5��*s)><��6�}\�G��g�4�������N
+_d�
+��CL_
]��P,��U@�TS�k%��aR�/��X)\M��<��V��lR�2ɈT���
��˥o0��m����Z8��v3�/,��D%7�ҽU٫A�:� �.{Q�b��^����`I���z������<��X�zZ�z|�Df�({�5�t�(&�a	�
+#c�
1`��qT�p�`

�wf`�F#�I�i�"�&��r(<�BA�b�T
zț�c�yA�HJ��(|�Bfw��U�>�0;�P
+R��T����<�y�����{�*��G��
�B�!���
+X��*�������O��i��6/�����
�TTr�<]c�וW ��q03�DW�㡠��
J��	{i"��&���@�ò��
є��(
����6<��X��iM�
�TS��ДZ%a
(u�U@�TS��.XJ��1=	�IUՓ0"5	3
]
:�]E�lՋS���
+��`��Ŋ�U�n,eۊ�
+���
W�o?y'n�
��(�ׅBc�������B#�C����T���+�a�L�.A
a�ɹ�	�
+���<�KX�*�"�j$
��x��&e���'
�s��
+��9���U��.F!�j�����d�/�X-Z��rV��$��
�dbx.N�Z�	�U���1�ٝ'�`I�B
�,\ZT�.\`̦
zU��
+U&�*���p6s���ظ!�8�"��()6K�PS��9C�%�n �x�,���xP���o
|���ө6$���J�6>#��@k3�
8=�z|��r���
���
9�%$|w�q�֣r��d3�Xi
�%�M��@��B,�l'A�-4����%[E�I�S��`�^���Z�i��b���� 
���X
�0ZE
+�O��yu1a�T,���2.td�R���
+:�Hx���ju�%�\����T|[����#�7�qa\p�Vѹ��2���,�!q�Q[��ǔ�Kj��b������`[s2,a�v^X���eZC���`>w3X�x�N��fp
��
�
�
+�6pOY�~Am�npQ�I
l���
TYl���,=�(��qDS�eN�G��㈂NG���K�#���,�h�#��]Y �͠�
+�{|��r�Q���
� Ϣ9@�.������#vx ��JX:�؇�3T��-|��;P�~|Et�(��D(����T]�(�7��m�<gp�e���~ꠋBX`
�n�r9�<
1<t��N��U젼�
�<{
nfkb�nh	�Oc�ga�O�K�/�IK��2�\r;<�Y��JcE�$h2��c�ӵ���s	��j�^��
+È0U=�`u�
,i�_/�c��*]�n�.��
_#�ٝ��T<�����
+V��jKA��Ak��u�
+VfvH��`h��ح# �*
#�j
'�ҼgD�
0�]J̍J�WH�vg*w�

.fJ�	�
+		��87h��>���H���ev/���.�T|+)x��S�
K�B�H�G6J
+��Һ�T�uU�ԅ�4d���
+^'�RN�U_�O_WBi]x�uU��x]�1�:i�-��Z��D�#�A-x����t���*��J\ma2j�)"�]�ג���
���
�iv)�M�b�c��]c�?�>G�+�L�ZpBɯ^��V�x"L3�KO��BQ���:{�jִ���v4%M��9���Ē���ޛ\�6G4��	��A�paM/�4�c@�h�j�$���c�M_��k��mI�S�.u]��-�F"��&��Cs�㱹Y�/S�X�10`���
+
���Rf���QA
9*f#�k42�H��h��ݡ�5(���{Tͯx�w���sQ��a(_TÌmP��5LE�k����C�ir����i{�^��i���?<>�6���܈��
+O�A�
+'jz|%T�]?�V�0�
��X#�͸
+��{�@�H���М�4�n����d�n���n�ûa�;{
�� ��RH
+�E+��	C
+
!��0<��0"���Q��F춞0�sF�Df��
���v��]oon����a2q(	z̸rH�†+C��j��
+r�#q���Esgd�4wzط�;a=�bK�+Gl�~�l���Uq}_��~�6/:&�P?����H-�&F���G`d�4�~����G`�z�,���"
J��',��|ـP�,855̢Z�#�A.x�U*�m�����(u��
I��hdv�����`�]|x�xL�2G��y����ƞv�M�y��?
+�oᦥBX#����?����3�3�rt���(�k
�Nk�LMk�j�E�P�J�HB�HBx�JBgI��>�~���n��"���8eVC�ly�!���ّ�b;��B� 5Z%J��h/r}�m"]ք�*HB
d����t
-x���B9�⁉�����xj
�Ӊ
�����kKI�!��T�GU�Xd����N�$�����Vf0�z��q���
fN�$�PxL�W�_L��+�0;af�"�+
�V'3�
�T�=���F���ץ-5#m��I[���iM�(oE6J����9����;`�>�
��vN���5f.�7�\-����8�x�&��t���J�r���T�����P��\T����ӔMY��ātᆚ�_꼺O`�\��F/=�����8
+V����)�~�<Ol�}�C��3Yd����~}.��֓Y�zN6+���v���,��K%+�!�*8�
49��d*�xGOع�����d]S,y���{T�/�V�T��8��С\���Wl���<�ߧ>�FoF}�
��n�
*�)
�$'�Bc�<��OQ
+�S�vEz�p�z����⵫TVMH��BB���Rⶔ�����.&�_#��mO�l
6���&�v��N��㾿�<��P*+1
+�
+=�:��m3y

�J[]�������N.�0
��t��=�����S���s�2b�8"t}!�������vߘz�ϭͿsN��&�rP�F�:"�U������ul��~�^| �����Q���
�z���v�b��
`��?�̥Z�;7�\�j��Z�t���� ��Y���x:ywFg�8L� i��-������FKK]���9��J�_T���k�|��S'�a��̇�.v��q߽��>��P�v˹6��c_��;��[�.�Α�5�f7�~�Vj���G0�0�߶���պ߸k_
���86����hQ��Yu�?<�7;�+8~r�	�Ѭ�D՞ .
`�#���m�XM=xX]=DK��׫��m�2��J
\oc����n�
�e�������
����ԁx�v��A�_��fn��F#�;)
`yi+��Bj
�y�/��̔h��1�y����6�ݙ���7����
U#DC�i����h���Q�H4D6J���&D��&�2
Tv�!����v|(Ќ\
�� "z|�as��� *�"��qLYl�U@�XX�3"l�"@��o/"ৡ�h�wВ���늈o�"ī�G
+o͉�b"�
�_����?�w9�K�$M����cH�ӏ�:<����:u/���Խ��9��Z�e�?�wO��&��h�9����7�*}<4��,D�K�����yh�G1�F����.�O�oa�XE������
9����tz|���/_��<�6��9�}|ܾ�s�t��]h�U e\��ú�hCm��[���Əx�
�Y?�oO
����=Mendstream
+endobj
+6241 0 obj <<
+/Type /Page
+/Contents 6242 0 R
+/Resources 6240 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6229 0 R
+/Annots [ 6244 0 R 6245 0 R 6246 0 R 6247 0 R 6248 0 R 6249 0 R 6250 0 R 6251 0 R 6252 0 R 6253 0 R 6254 0 R 6255 0 R 6256 0 R 6257 0 R 6258 0 R 6259 0 R 6260 0 R 6261 0 R 6262 0 R 6263 0 R 6264 0 R 6265 0 R 6266 0 R 6267 0 R 6268 0 R 6269 0 R 6270 0 R 6271 0 R 6272 0 R 6273 0 R 6274 0 R 6275 0 R 6277 0 R 6278 0 R 6279 0 R 6280 0 R 6281 0 R 6282 0 R 6283 0 R 6284 0 R 6285 0 R 6286 0 R 6287 0 R 6288 0 R 6289 0 R 6290 0 R 6291 0 R 6292 0 R 6293 0 R 6294 0 R 6295 0 R ]
+>> endobj
+6244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [346.4678 719.0265 441.8914 731.1915]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 687.2813 266.586 698.1853]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_b602d97b867b5d2ea800ea7ceef4c6b5) >>
+>> endobj
+6246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 687.2813 309.697 698.1853]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6247 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 687.2813 408.2337 698.1853]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+6248 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 687.2813 513.9963 698.1853]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 675.3262 171.3608 686.2301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.5912 650.9886 481.2881 661.9446]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 618.0345 250.7476 628.9384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a9c12ecd84df4ed86b5676a09fa39208) >>
+>> endobj
+6252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 618.0345 357.3173 628.9384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 618.0345 456.1447 628.9384]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+6254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 606.0793 202.3443 616.9832]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.4813 593.6969 465.5437 604.6529]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [150.5422 560.7427 267.9209 571.6467]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fb9d83c4e182f640833116dc2f725076) >>
+>> endobj
+6257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [306.1432 560.7427 383.3928 571.6467]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6258 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [420.495 560.7427 492.2351 571.6467]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+6259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.0109 548.7876 250.2605 559.6915]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.9232 524.45 468.6804 535.406]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 491.4959 239.9836 502.3998]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0441c9c3b0ab0d55165bb6b4fd107f64) >>
+>> endobj
+6262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 491.4959 280.8203 502.3998]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6263 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 491.4959 405.1043 502.3998]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 491.4959 513.9963 502.3998]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6265 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 479.5407 171.3608 490.4446]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6266 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 465.9493 432.0923 479.1073]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+6267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 433.0013 251.209 443.9052]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9e4e32230b187284ac0b9ca8efba8f82) >>
+>> endobj
+6268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 433.0013 290.549 443.9052]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 433.0013 409.9686 443.9052]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 433.0013 513.9963 443.9052]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 421.0461 171.3608 431.9501]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 407.4547 456.9923 420.6127]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+6273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 374.5067 224.5705 385.4107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c009459805692e582a00d4b5954ab8e5) >>
+>> endobj
+6274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 374.5067 272.1615 385.4107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 362.1243 347.8694 372.0296]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Time_Elapse) >>
+>> endobj
+6277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 340.1291 255.5641 351.033]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2581586de73769088ece60dc01409a08) >>
+>> endobj
+6278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 304.2505 264.9592 315.1544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_b6bba83ceaafdb71df04b77e43bed022) >>
+>> endobj
+6279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.2964 304.2505 312.5503 315.1544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.9328 291.8681 362.4074 301.7733]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 258.9139 256.6603 269.8179]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e8d42fcd571a9c9d64f0e7ffe67e995e) >>
+>> endobj
+6282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [283.9974 258.9139 304.2513 269.8179]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.5002 246.5315 366.4207 256.4368]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 213.5774 214.0604 224.4813]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_596fc5b3ee0d04895aca9139cb6cbcb6) >>
+>> endobj
+6285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3976 213.5774 261.6514 224.4813]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 201.195 358.5933 211.1003]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2843 179.1998 313.7009 190.1037]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e47fdbff76383891b3896ac5fc213d5d) >>
+>> endobj
+6288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.4073 179.1998 361.6612 190.1037]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [403.3469 179.1998 487.7994 190.1037]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.6296 154.8622 376.664 164.7674]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.429 121.908 306.5466 132.812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_323efbe5d43695cc65f8cd5935da94dc) >>
+>> endobj
+6292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.5424 121.908 356.7963 132.812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [402.2022 121.908 486.6548 132.812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [324.6268 97.5705 379.1617 107.4757]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6243 0 obj <<
+/D [6241 0 R /XYZ 90 757.9346 null]
+>> endobj
+6276 0 obj <<
+/D [6241 0 R /XYZ 90 356.9841 null]
+>> endobj
+6240 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R /F40 354 0 R /F36 2201 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6309 0 obj <<
+/Length 3815      
+/Filter /FlateDecode
+>>
+stream
+x��\k�۶���B�\i&
�A�<mgڤ�4u:n��K��p%�.�TE���_�
���� n�u'㘲��=��8�x�d��?��x!�D�%b��_��
��W�������x����
���b�� ������KB��k�1^�_�L��t�~E��=�g�c�~��
��ӛ7�
���r��z�VU{�Cv�
WD-�b��%��XR�V�|���/
��;g�j�������=|w�ӊ/
�FDk��_%����W�pv�/�L��i������|E�Rp=i� ��\@TPB��� "��j�qpN��"��p,
̄����a�����~-*�
+�5��Դ+4��u"�$�\���w
�����H���|���v��_��>��r��yY�!��bȎ
+�hB�p`
*‰
+��$�7�xSU=r�9R����q���]C��a�$K�÷�P��(D�㫧��˯V�	g��80AMgPs���1>#����eqw|0����T��~H'I�w��AP
*B"I�J�AP6wU���$fִ���W�kF)RZ� HsN��¬E�=��`�����w�{dJ
K�B(��J��b�q��I�Ds�2Y��
+��]#*�
b����/K3"|ʌ�K���3s����ˬz����mX�%`�=�X�����d�a�#���4T
�mV��݈�H�D��z�@
+J#�X�¦�
�F�Z&7Om��]U����e!x�\Ye���.�yѦ$��r���]2A���~�*H#e��>m�5�,WH��5c��J7ߧmö�z�PAӬ����ݮ�h�.e^�]9 �а ��4@��m�:G�L�B'�d��~������~#�m���a�*Ҡ9iz4����p!��%%J'ӵ�+!
������
+�&�o��ɤ�<�۫�Ӯ1�/���Ӡ=���V��m���	�5^f����|8��Q�=�3%��*R��@
�`�:(���A�]
�s{�2`(
��uP����m��v��L��[�`�:-�0�
؎�K�z����PF�)��5и��N)%�����5
\
���a��F�U$
��0`C�	����慣�g#4
[�a����K
+$�X-�O���sP���)�;yo�|syʾN�N�<��Q�o��l0/���O�д^���͵D(~�-�W\I�Q�+��o0�W��^��F���z�^EH����p,��<V,�]<
�0��	��AsL*��
<3&e0�;G��BdL�C�PLS��>��bq�[���m����b��@�N���l[f
�(kO�:	�_B���a��R���"&e�2�`H��~���n�R�s=G��$Fv�YZ�I묀?��(�l"

+����X���j�&8���)b
� 3���1#�����F���[T̯�0)5���),]0+�Dы�˳�.
k��ɇ��LLg�\��0�eH
+�
h�x�)4 ��8�	����~�0��QJ�,&��v����{H�8ﻟ^;� ��玵&�T8D���4a�#&]��%I��Y(ˊ���E�faek�I	

�k��{�h���

���Ѐ�k
�m|�蹞3`�I���l_�����_6*���ጇ��PJ�CZ&F�z�qv�PP+7���8|��Ȯ��S���1OovY���������E80���f\�9����M��7�6<�`i�������ҡ
��vI}r-�:d��_v
ֺ����~�g���(�	y��4QН�d�q����J��)M�mTi��g(M�������w��1.8�!�4
�ǡ"��6�\�Y�f�0}g 3c��QC�sf�Pe&*

����q�d�?L)LO���D��$�%������T�؊��h����u�|6�=�Us�ͽ�����fD��}�fck���|E�F�&�l�c�
����"�B?Q�	h?�����q�'���-#,*~?�`H�&�J�%ܲ/~��:�vP��ae��S��ta����>!������Y��n\zod,=�y�[��	�#m��[��9���3����qѦ�$\����� $�֬d���DCg5���3��@�`'�
N����7߼:���t�t��E���I��uҕ
�;�
+h��9�}��j��&^�>��P��������[,>r�c��6m�t��+zG\�@B
l�k��[�h$�
��zq�dF�h}hQQ���2��G�gTfz~g�L����
�;�
��Ԍ��l�
���@�"E(��T%ȡE��8t����ds\�J�#
���
է"\S��*�˯F��KI"g޾��i��Ψ�͊,�iq(qoVm
�mb0� ��K�
�F`�p��`[yB�2�����!��Ӧ<�ٹ�fj��cMW�
ʢ7�L,3J�$g��'Ȫ��[�_�h5��ʼn|�EC��(U�O�3��"#b��j��u��
���5,n��6^2
q3
��CE� �
[��R��|�lv<
>Fcdw�R�Y�gR���P
R2��Yt���q��X�5��?�
��qٍ�g	M��;�d�ׁ"����`/F��
iaMO`�!�H�=!M�0���`nNU3$�r;/b���Rnw�k��5���V��bZ�A�5#�G������zP��'���AUk���&���"+��O�]=w��j��rB#Î

;
vB~���ȸ�
:cr�g,��
3<��!�l��ܖ<� 혐H�,*7(��&ø�@T�0t&yQ������b�dU}|h���-T*̡|ua5Uw,+�B����A�g�g0P
E�ڄ��F�����P��ȮaQ=6�
F, at q��E�|��C
�>1[585��޻��������

�o����^�ͩٞ��	����e��̞�Pg�0C�ãY�8�A9"܍����c^�{��&ͣ��U�chb�]^
�B!���5�
+
�Om�n�z3,����<��ֹ)D�ֱɜ��B�$���e��LEd���2�
�lد�Y߭/����\��
=�6y��>�e �b�S7
wK
S�S9qO�sK���z�PD-,
Ѡ�SD�~mD}�/Ѫ޾ySBA���1�W��(cZ�y,�
,e
�G9���_e���(�0
�05O
�ߒ�DS�;""��a�`:X4�a�.��]0{no�r7
H��K�]�n����\�Q���z6�
+� :����Ba��xX~�;��������}y|ZW��ɵq�	���Oj�S�Q�К�is�;L��zL�Nw�o^�o������,��ps:T��f���As��v�'0�b�]t
۷�
�����p�	a� 
�?y��sz��z��f�pȽ��jR,����=�L���)�Kk�Xqe^��1�W ���&g��6_ <�/ A�'�v�>ɎE\̢P�X_;T��)��RZ�9:`޼��EgC|!
���:��;�>-R�$qל�j Q0�S\}A
���PX���ֱu,�k�g0T[��������81�0��|����X|��Ȯ!q�V��M�
�.A�'�%���"΍T1�� ������n��uS
uӴ�������	���y��[C��H!�\�3ot1�zv��
��:�W��}���ן5�x
+I�{�Ғ��o\#n�+17��sߵ�{�~��c����ÏUv�݊���I�[m�
lϦO��*>
3*�U�fy�C6yBGsB
�&J�.�����u�\{�h7��w�#�MO��ÛׯѦBE~8��~}8�^���a�)
�=^��v
hĥ��tP�r�\n��D~�p��o���#'�T����endstream
+endobj
+6308 0 obj <<
+/Type /Page
+/Contents 6309 0 R
+/Resources 6307 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6229 0 R
+/Annots [ 6311 0 R 6312 0 R 6313 0 R 6314 0 R 6315 0 R 6316 0 R 6317 0 R 6318 0 R 6319 0 R 6320 0 R 6321 0 R 6322 0 R 6323 0 R 6324 0 R 6325 0 R 6326 0 R 6327 0 R 6328 0 R 6329 0 R 6330 0 R 6331 0 R 6332 0 R 6333 0 R 6335 0 R 6337 0 R 6338 0 R 6344 0 R 6345 0 R 6347 0 R 6348 0 R 6349 0 R 6350 0 R ]
+>> endobj
+6311 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7199 709.4954 264.2377 720.3993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9bdab8408169307fbd899ec3670cb2bf) >>
+>> endobj
+6312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.8153 709.4954 315.0692 720.3993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [361.4205 709.4954 445.8731 720.3993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+6314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.6134 685.4541 287.9211 695.3593]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 618.0447 289.8656 628.9486]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_10e3116398b920cb137cf576a073cc68) >>
+>> endobj
+6316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 618.0447 359.3244 628.9486]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 584.2596 290.9713 595.1635]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c4e1b49845e553ff84dc73e710def76c) >>
+>> endobj
+6318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 584.2596 360.4301 595.1635]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 550.4745 224.0028 561.3784]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1b528a2e8d4d096f62535454e05b74ba) >>
+>> endobj
+6320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 550.4745 271.5939 561.3784]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 538.3883 272.4902 548.2936]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Concatenate) >>
+>> endobj
+6322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 516.6893 254.1498 527.5933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_75df0f78d7598dafa946251a04cb5d90) >>
+>> endobj
+6323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 516.6893 338.2632 527.5933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+6324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 482.9042 284.5854 493.8081]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7ff92e5d40e6faf667a0b1f6b8fad791) >>
+>> endobj
+6325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 482.9042 354.0443 493.8081]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 426.205 241.7263 437.1089]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_60138f2b5d41fd62c862fdcd7c4a1e61) >>
+>> endobj
+6327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.6171 414.1189 407.6577 424.0241]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Map_Space_Dimensions) >>
+>> endobj
+6328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 392.4199 249.3181 403.3238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f6df34e5e4ab9beab41cd76897d64c72) >>
+>> endobj
+6329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 392.4199 288.3213 403.3238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 392.4199 371.5186 403.3238]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 358.6348 240.6204 369.5387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_18ec2da355442e02ae67313ed5b48933) >>
+>> endobj
+6332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 358.6348 324.7339 369.5387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+6333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 358.6348 425.7242 369.5387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 290.4717 153.0974 301.0021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_07bdac3717a59f64634da7d9b1cfaefd) >>
+>> endobj
+6337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 255.4046 167.4656 266.3085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a598904833b374d50efc72c51914112c) >>
+>> endobj
+6338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 255.4046 191.5351 266.3085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 179.0437 202.9022 189.9476]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+6345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 179.0437 300.0368 189.9476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f39e1b0519a47aafb9dba4121dc41a9c) >>
+>> endobj
+6347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 144.3502 202.9022 155.2541]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+6348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 144.3502 314.2635 155.2541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_eb9b562373b4d288c03549bdba93fede) >>
+>> endobj
+6349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.8192 110.0302 199.8638 120.5605]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_5f6fcc1dab2b08eff20b41d1412d1e2d) >>
+>> endobj
+6350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6310 0 obj <<
+/D [6308 0 R /XYZ 90 757.9346 null]
+>> endobj
+6334 0 obj <<
+/D [6308 0 R /XYZ 90 306.5374 null]
+>> endobj
+6336 0 obj <<
+/D [6308 0 R /XYZ 90 271.9633 null]
+>> endobj
+6339 0 obj <<
+/D [6308 0 R /XYZ 90 237.2698 null]
+>> endobj
+6340 0 obj <<
+/D [6308 0 R /XYZ 90 224.8306 null]
+>> endobj
+6341 0 obj <<
+/D [6308 0 R /XYZ 90 214.4137 null]
+>> endobj
+6342 0 obj <<
+/D [6308 0 R /XYZ 90 203.9969 null]
+>> endobj
+6343 0 obj <<
+/D [6308 0 R /XYZ 90 193.8192 null]
+>> endobj
+6346 0 obj <<
+/D [6308 0 R /XYZ 90 160.9089 null]
+>> endobj
+6307 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6363 0 obj <<
+/Length 3103      
+/Filter /FlateDecode
+>>
+stream
+x��[ݏܶ��b���^�ߒ��!�� i����)�]ݝ�]i+i}���
~.��K�P�R�pf8��͐ԑ�d��U"�1.W��^�C�wWľ���mH���7�J��P&�\]�i� A	]]�^�(�l	�x�~C�:o����
�����P����m�7Oo�~ה�͖
+���!o[��P�͆����I2"הf�_�����W��.�$J�]��
^�a�_aIJT�
�#�etu�┹���OW�|�
=`����؀2��`�?uyW��lޟo��Cq�������jוu�NM
c$��$ ���C�D����G)��R1�E0�����DO�K8ʰ�}��1�P2K�I6��^5���C�����0�tؗǢj��7�ө�B1E8��_�E<�	4����#!��"zz������M{�wō�x�l&n�d�*�F�����%����d�.	"��d*P���x!^�iW�
aiې��+��\/#�`I��"J�����Mea�{(L�V
�G�g����p0�Oe��<��a�%4�qv�=}dBc�jB��0 #�ɢ���*&�Q$I�rw�5�C^�ņ�5�]�D ������&ɔ�Ù�1���̓E�,d� g��zr� �o��0�A�H2:Pa
�,yL�!W��7M�S���;7���o�*k޴OmW
�1x0�aE��"*)�� /�% [...]
+�
,hu�@%�\�������>^l��
�};
��ٰd]�Ժ�7~q��PcA!��PSV��H�T�@��[��E�>��ώ�P�3�lQ�ϙk�ܡ�
�T�Tdb�4�hY#�fY��R4���
|�E�X�0G��a�6j����G�ȠD�}��B
��!!�Db��MY��c\�

ը�x
	֓E#vQ�%d#r]���N*���.���>����Ҡ>M����_��H2$8���;���v
����!2��7)JƞkOQc�w���|_�_��br dϙ��W_^�8� �(���6p�1]F|gm hJ(���Q��fIB�6xZ�fvci��y

���Bh� ��p{�a��!�N��&�1�
% ��������
�����b�݄��R*�
�e�?�iJC�؎��dF��y�21�a�Ql�m݃{������/Y���d~�P�$�v}yW�'�N	D0�]J��g֢��ycUݹ�z9��s�Д�*5ؕ�d6?�
�ɓE�Ӣ�K~��u��'���o��P#�=-x5N�
��j̧+GSh�7LWf�		0�H&�������<[�������_ at Q:X'p�	��K0�(E$��6���h8�;{~�1�
˖�T1������W���sP6��E�X�yO���۹;�m�+�ҵ��/B��'e)�~�]'� a,"(�ɢ(2\@��\ [...]
+���bb��$����WP(��|	��<@͓��x݃Z$]�Q�Yu�v���%
I�$�%�K
IC��;�8�
�}Y�G�P�g}�<)�ꢌ1����>�ň��>�m�i|�)ME� �(&Y$(I�`�
+�GR%��f��sw�1
F|��u%�?��`tQ��3�-[�SE���*���(���a$�����#�G\�+�p
S(@M�":q�ky"� 
61 �/� ��
�����bW����T���4<�~�}4a6��aONR���	E�E��!���?�
q
E��f��̻��˃;xW���<u�S���o��=QɅ���ƞ�׷�,v������8��3E)�B�!�4�~���ဩt�w� "Y�����%pT1�P��
�6ũ)ZȲ��!�W
�2~ZW�%��Z��U�RөVb�,��0������R�KxQ��
��3]��*;7R�:�r�\-����r�/*��h����!���u��SFP��4�
�^Iǫ��5�78��Gy��!9@�LҁCwpT��l�$F]/�F���־8��nR���;�m[ުk)���淾��%�j�eVm�sz�h�����Y���]���G��SUo� �Fʃ�˫�S�ɫ
�#Ԛ3LB�Q3��宪�U��]SM��۩V�~��(=�r=�
��־��X���2ч�z��Ϳ����ξ���fѴ�����
�����]��/
aҝ�jl�����U�`ԝn�����ѭ��
~�TV��A�]�
@�C����&�w]Sުz��uk�e	�������t�5���j�g����#�/t�
KB�����j`�
���u
~�H]l0�ۗ����n���Y�]�VEOR���	X"��
0�y		6/�,�yY�xټD��KO��lMo�^�t<uOn'[8W ۝�����
+���2\m�0�KtS��)
sؠg��[8 X��#�[xIb`�e��¡�c�j���M߽�g
�u�ɺ!T�77?.
+�;O��[�6�+r_f���{����L��u��8,�p��j�n
+5
+��Tm2�
��FyUbt;s۳�8

m��\��^���ˮ0��*�܈�4,b�ؗw��@�m� }��˶��x۫�ٛ���$�3	�B��Р%)I�[ZK�
Lmi�|ͦć�;7�vp��n4��P�x�sX6Y�0�c��$��
�k
Ud
+cn����nL���G)!�Rt;�xt/I
�{Y���P�q�4�'},M�j
�u�������1U3ȥ�DGX��P��Hm���n���C^���� %MA�ۢ��~a��3�BU_N�rWv)T]&$��;HvNPs���Q��Ax���'�{�����养K�㮔O�������/��3o���:)#?m�X�1P�WG��y��1o��CS�KA]2�3�`�T��?1�HBmC�^
+�]�R�i�U����<�q�}tg:��
옇�E���kk����
+F�s���u��a�@�H����1��
+�����O+��KxY`l��"	�<�&��u��o�<>>�]��UyjPٽ9�oFW��7��z[O4ҥg~���3����w�c���\��vG5�G�Aτ*��H
+ at endstream
+endobj
+6362 0 obj <<
+/Type /Page
+/Contents 6363 0 R
+/Resources 6361 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6229 0 R
+/Annots [ 6367 0 R 6368 0 R 6369 0 R 6371 0 R 6373 0 R 6375 0 R 6376 0 R 6377 0 R 6379 0 R 6380 0 R 6381 0 R 6382 0 R 6383 0 R 6384 0 R 6385 0 R 6386 0 R 6388 0 R 6389 0 R 6390 0 R 6391 0 R ]
+>> endobj
+6367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 697.5173 203.0748 708.4213]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 697.5173 296.3242 708.4213]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >>
+>> endobj
+6369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.3766 683.1666 331.3064 693.0719]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 659.2031 294.4813 670.107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7fc86a6331f34f34a506ab2b0609ac37) >>
+>> endobj
+6373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 620.8889 287.8558 631.7928]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_3628b6d6e250d4c6b8301173c6ecc777) >>
+>> endobj
+6375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 540.9095 180.5399 551.8135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_87d004db7f8febf6f9c96b4a2a1c85e5) >>
+>> endobj
+6376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 540.9095 228.1309 551.8135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.864 540.9095 290.1179 551.8135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 434.4616 226.0342 445.3656]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1cb88a546d32e7b5c07dc25055e33235) >>
+>> endobj
+6380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 434.4616 341.4298 445.3656]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 396.1474 178.2386 407.0514]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9e17201a9a12235a9a96cc31cfffd38f) >>
+>> endobj
+6382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 396.1474 225.8296 407.0514]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.5627 396.1474 287.8166 407.0514]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 357.8332 156.2812 368.7371]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d452407f89cb560e83fb81938c12a585) >>
+>> endobj
+6385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 357.8332 291.4331 368.7371]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [309.6447 357.8332 440.981 368.7371]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 258.2753 198.0735 269.1792]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 228.6957 150.064 239.5997]
+/Subtype /Link
+/A << /S /GoTo /D (main_sect_rational_grids) >>
+>> endobj
+6390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.8188 117.6287 398.978 128.5326]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Space_Dimensions) >>
+>> endobj
+6391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6364 0 obj <<
+/D [6362 0 R /XYZ 90 757.9346 null]
+>> endobj
+6365 0 obj <<
+/D [6362 0 R /XYZ 90 716.2211 null]
+>> endobj
+6366 0 obj <<
+/D [6362 0 R /XYZ 90 716.2211 null]
+>> endobj
+6370 0 obj <<
+/D [6362 0 R /XYZ 90 678.0264 null]
+>> endobj
+6372 0 obj <<
+/D [6362 0 R /XYZ 90 639.7122 null]
+>> endobj
+6374 0 obj <<
+/D [6362 0 R /XYZ 90 559.6133 null]
+>> endobj
+6378 0 obj <<
+/D [6362 0 R /XYZ 90 479.6339 null]
+>> endobj
+6387 0 obj <<
+/D [6362 0 R /XYZ 90 321.0262 null]
+>> endobj
+6361 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R /F25 348 0 R /F33 485 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6398 0 obj <<
+/Length 1733      
+/Filter /FlateDecode
+>>
+stream
+x��Y]o�6}���K1y�~����/+�b��6�K[�M;�lɕ�&ޯߥHʔ-+Y�vZ�H����{,��H��@r�R�`���`	��O�
�`<�?^LΞ	
�(T�vA���7!!��iD0���)�aV��˗S��r��V�*��%���jw~����ӈr
>Yeum���BUS����)XI0"B����ŋ�Ӌ�8k;g�h��O޼��
|x1���	n��IS�'1e������ޭc�	C!�
ĀӃP��଍�oe�S���:kl�F�4�y��R
���h�i�OCp;��Ͳ�4��bs�cZ��閅{�
�[Ue4�ת�s7Xo��:�F��=P�7��4�f�����E���0%<TU��@L"��sҺ�·�g��"B�c
qmA�
B��% ��	�
P/�1�E�C�4H8�$��e
k�rh�D�0�
&�"�(
"��m&�.���A?���je&~�P:p��z�R��yc���߮������
��ʳ+=�
����J'�
��@��\� zkV(�BX���E*�OC��
�\+7���w�Aw{[�9 ���\�jUjgo���}��B�9�ecO�!�|�)WؖJLZ��
+TJ�_U���
�4P�n�KX[���|
+��� v����CyL�p�u��G
W�$E3X��Ӥ���	%9
���{q;4��
L[p�R=��F��R�ᬜ��+]����-l0��۶�ЪR��,�v�
��^�$SW�
+3�MK�%�E
�dyU�1Cg�<�(�"
�J$�:Ӗ���SU�٪d`����$\�GVf}��]ݨ�i���^Nƒ�
�,��VK�Hjp�a&��L
>�
L����]�~����n���U������౹bSt��\�D;^k��k����J�v=�]��A��RM���#��-Kth����ͪ��mY�C+����|1�y�/���MV5��U���c��Q�)�PU֔�}F�Q�|�Ӌ�4��dk�+e��Y�ӰM	i6��*M!���@>���������a�x�~�z�V�N�P�9X��bSM�o�b$0Իo	��r�E�������|���>�
� �|1{闵���{��^��u
R��]z�N�uL��
�5=�Rc��R�Ѐa��`_B�;�*/ԈӘ ��Ob�M�Ҟ_����gNz��J9�����u����D���|�F�n���
+�$��H��>|�Bv�O�h�~��9k.�}�����RO3O:��Na_��N���)��2ƃ�1���RM�1��p��F���;��2�Q9.
>�pP(J��������|92`X8:X��LY��Q'
z��W����䨁��C���^������Vf��5m}��Q�3�U��(����?"I�C;�p�N?
�aAJc
���$��0(t�4%�
BG�s�a����9(Xd_�x��5�n��qg4W�8Ʃb[��)��m�ʛ�A��)�~#(�
>F
)ƈ�s��U6>R�:����k<����UA7Y
4�:M6B��
+z�WS>B����h��#�)80����0�.>�SO�=K$PMS��߾
{FxY�~���,�u߲L�~�2�? ^�M9�!��Y��V��rW1�7�	��M���aA k���:��:�r��^���_�k��w��y3
��.��
�n�������
��j��Bys�٬�튡��T��݋:Б-��ǐ�B�gˢ�L�֥���ps�5ãB��݀)� *��Uendstream
+endobj
+6397 0 obj <<
+/Type /Page
+/Contents 6398 0 R
+/Resources 6396 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6229 0 R
+/Annots [ 6400 0 R ]
+>> endobj
+6400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6399 0 obj <<
+/D [6397 0 R /XYZ 90 757.9346 null]
+>> endobj
+6396 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F7 574 0 R /F67 370 0 R /F33 485 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6403 0 obj <<
+/Length 2605      
+/Filter /FlateDecode
+>>
+stream
+x��Z�������|S�C>��%h�+��A�
Z[�UkK�$g��}�/�z��ˡ�(X��p8��o���
��i<SB!͸��vWx���\?���eL�绫����i�%����� 	������9!��Œ`����j��XP</�ǧl]����UZ
oo����bI��e�ֵ{�>�dՂ$�Xe�I2"甑�/w�^��k��
&��׫���5���+��N����lw�)
���W�h��;aJ����fKA��BOR%a�(���bx��V��L��6�X��{Iw�m�vχ�$�"�(�ŜG�Tc� X!E��	���r�-T̟���u�ʵ|0F<�۵7Tf=�f\�U����X���=S��o�"�;�IU�6
}�z(r#�o
"�YU���
������ǤłN̶�wj&�VFٛ�jPC�f��#�i�#.5�-#�ۓv��D*!=�9c���9�ȇ��Q�*%;�fq'���S�G�N��HH�Q�4QId]�F�e4X{օ���� [...]

��C(��`ds(VV�6� �"A�Q��Äj�OW��:߁/Ü�
P�>�=���c�(�U��8]
p͡�M؅
��A�l
+�_�$����`�i�bn�W_�'}e�i-����~2 b@���0M_��q�g�]l�q
e��l�s#V�������+zR��� �	F��z��~EP��H]���zA��mn Ōt��vهRj��z�P�	�k���l7��P`[�r@�j�B��5n�4����a�G��j`mj
�Q=�
�
���d1�S��Hk��Y�y:�Ӧɪ��������}�j��w��)\qù�oP�a�
8�E�D#q�
�{H��	
�K!�X6��B'��'�2晠D��o�WΏc�I�	^d\�T�s01 k�u�R	�
:�ٔ� ��&���c.���,DL���`xwt^�$��q����8�%�5�{竛�@�z�"dB �'�خ��r6S��Qp��c��9�(s�!�9[��>g���H��ݒ}�9�`��V�T��ф�W�6�:
΂�f��L�nɾ������y�.�o[g3�q{v
h\���Q�U6�P�J�&����>Y��n�=6Pˏ��r��b��m/}&��2�D�G�8Q�KH
��R�}]B
+������ԣ?�{��Q�͐�cl�"�CZ���Dv�@�
��Da��
+i	O�%�#�b�K/Il>���^�d�Z'

����{톨w�ǽ
��|
+A��xp
�c�ӐOAL12�|u�ή�A�H�i�oɾ
��l ���]��M�e��A�k�\�1�po��ivV|��-�gk��w��#��߽�!��ïY-��/ܣ/
;�Q��r�c�I��_M�<�b�/�BRǡ���Ӏi�#.�p3�4�n3�i� �ʏ����E1
O8
�2!x�T
0�z��8'��8Ɂʐ '?U@�П�
+����)���}+�$��m��p�5^4�L���
;S���
���$H�1�&���v�U	[֔�ѥ��u�E�����/���2�6�@/5�>_� ��u��ܕ1���Uh�>���I��C�V(��*�E�c�7a�tc�15�-a��~�'W&�I��˔����Yc>V�9�:�@�A5�
+W�g���"���Q�g8�"�<��Pt9W
��*-�m��ڡ�<�Έ�]9`[�O�{�_�L�� �z���{��O(�ߑx՞�n�1���e��P��=���g݈&c��M.����P{sI@-I0�t��C�QkZ6:�=D�lj�4�NHr�"���Se��Kǒs6_VY�ѸZp<7�v�����,�)3d�
���X����iVP���Z�!�z�0�B�����.+�� �n�tJ�
��\���3՛	�����W�a-����Z8�>S
+��_�
�N��ζ`�ɻ,
'R���ݏ�qD�"��Ǣ.KGB��C���5�f�a�k�_7�ƏuV�a!������8�����CG��DŠ;�|Ș���l���!�HOKn�߳���n��e4#�����S��oon���ѪF�"�W(on����P.Ł;g�eK4���~~(
�bY6���ٕU���1]�IQ��i�)endstream
+endobj
+6402 0 obj <<
+/Type /Page
+/Contents 6403 0 R
+/Resources 6401 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6229 0 R
+/Annots [ 6405 0 R ]
+>> endobj
+6405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6404 0 obj <<
+/D [6402 0 R /XYZ 90 757.9346 null]
+>> endobj
+6401 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F33 485 0 R /F7 574 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F1 583 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6408 0 obj <<
+/Length 2920      
+/Filter /FlateDecode
+>>
+stream
+x��ZY���~�_����8�3R��d�
�J�6�J�.�w�� 
��}z.p �\Jvb���93==}|� �a���ƳT�H3.g��
����W7�O/`~|q{��K)fiI��vcW�	J��v�}B�t� ��ݜ�$k���ݜ�.�
�u�-�-yz�ꫦX�T��/eֶ��]�ɛ9QI^�rXI2"�����on����y��İ����?�����
FL+1;@#�5�mo8e�S޼��[����L�@6!A#���01K)CX
+f%�= �T�I����+�{�Uɽ;4L����T$�D$y���|UW���r3y�d����0�&��v
�vC���/	���
#�5���

��(JQ~��%����O�b ��'(�*,�49�C`.��L�c�7b��a����f��B,�.@���n���kv"7����n	��4Zx +��#�����H2����\!Ixn�X�h��L'_Wm�gk��<)6n�C�Y׮_��(�6�T��
��u�]��&��M
F�u�D�BTp��,��A9E�F�m}�	�)2X���ɭ�
���/�m�s?`L�<&ށ������Q	&ыpJy����Wc+'���Q2��!Et鉱�ԋ��y��hi���X�"�����[�̬Y�9�g!����w������S,4�
R��Б 9�> ����+� ȡ.��
+> ����%x��3��Z"�{���x.	�l�Hr��A�2�x4�9%&*�I�W�Oz�@���N���ckq�b0ev}�ԉB�W�K�G
+3f`���d���p���,ks����W�:�݃�jG��l
��3�}��z{͍/׈"�]�ـ藠��6�ϧ�x0����5"܅�k�+"�d^��l1���,0}�zo޾��'
kV����]�}���zi
fy�Wy�u�}ڎX�0=l%�"�1N!�seW������h������s
@�����2,�^�Ò�Oa������O�;�_�Ї̰sz846s���{f�	
_�0�t�EJ�a7L�n��Ƈ6�1��8ʃK��5�P at r8�{��o5
+�05
+���u^�ۢ2��f���x
��y��W&��
�Mb�R�M���;�4H����P�!���8�rB+LX��H[l�2k\��d"��QX0UZ�i'���c޴��
mZ��
5��r4�ˊ�=
�LQDR
�yv"�$I{L����@2a5���I�
#S��1A�P:��!o&Ӆ����W�>�;�eɂ��]��#�*
�
l�m��9Ir7`�����z���8� I8 ,F�=�ƈj��
��*y[7ym
�� r���8@�XPo6�
� f	��������ԠS��B^�=8���O�ї	q
��-
���l+�$z���=���CO���
+�.#�����-�N�w'&CsݣW�N�b�S��_������?�6 �6GI]�O�dt��qs�V�sW0�2�	�!5��׌�{��>�����x4�Q�{ς�� b��g;A�*�Q-��*�ٲ	θ�˖v�2�]�

��a�Y7�Ζa��ڀ�%�*�m	��
��	�d�!"��`��8
����;�qj}
�d�0����o?�pC��!�^����3
W�km:"�dӁ�w�p��#h�*�I���{^�
���zS,�'�}6Q=Hs��3y3K!�W��9":�53[��4k�go����Ko?�3*���F�����6b�
�Pr*�z�.�w
[k{^��$�3ɵ�����"�d�T�>ê��6�=��i��}T��W
�|[ȗ�.[��u��+c�������
�^�#`��k��H}�<U�=,�
+���ě�/F���^����`r��2�킩���O�v�|ϥ��o!_��Ͽ0k>��fE�D�#��>��ܷϩr�|�w^��K�!�g����mr/���h�yl����
cqBnz.���qf����Q�w&��.�ŌAb�#¦/Zy�E�)hH�[
�:��BJ��c^�.��0z�O�PҦ�y������1wMg,���
I�����OB@�����Azd
+�bc�|$?J
)c1)d����)g�$k�0g|B��'��0#2��%u
���D��(�@�N���qkE����k����L������s�Gc����3e)�/̅a���&��Kӡ��R��q-�h�F�r�q�L� ��`8H��V͜�I�t A'�<�	
���
NLjZM�gy�u93���dE���y�
+���6L͚�����$d)����$�V~p�+a��aI_L�G�<��"p����Lj1�s�s���ʈd_��(_u�egV��H55Pz�#��b�4��2��k�pF��B �2��7z�`U��{
��{0I��r
o��[67��p]�ݜ�S�)M��:<�_ T=��?������|,'�D�����ϱJ�e��ʸ�~��ֿ,`�(k�r�
Mf6�L;���6��FN�RR�vQ�O��pn���!��GE~z]��,�"|���5��u��6�����U�B3

P��� ���{TA��p�sXK��z��b��At�����vxt�?-�
��
��XX<Lyy����
+�E�
ꦸ/*�A�6j
NZ�D�
�#���k�֕�_��T
+���
Ƽ>�L� %��Z�R���M���i�:���<�	��F���Pذn����gW��D�9I!���(�YŊ���ձ*.����(kC8�y��[��׾
{B�D_�	�y�M~}��
)�/���~�z���+UG���XޙC�}7|���3F��;��?̅H�H�f�>�5C�)�(�����wMNS�����y>�U�����f�=
��
�?���A�x�u���n������V-�WŮAE����1_
c�i�.�ޢ':�e ~�N@��{c^��Ѷu��՗�O��|�9�� rU�2endstream
+endobj
+6407 0 obj <<
+/Type /Page
+/Contents 6408 0 R
+/Resources 6406 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6411 0 R
+/Annots [ 6410 0 R ]
+>> endobj
+6410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6409 0 obj <<
+/D [6407 0 R /XYZ 90 757.9346 null]
+>> endobj
+6406 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F8 568 0 R /F67 370 0 R /F25 348 0 R /F1 583 0 R /F7 574 0 R /F33 485 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6414 0 obj <<
+/Length 1728      
+/Filter /FlateDecode
+>>
+stream
+x��Yɒ�6��+tJ�*
�� �I��c���
�8ۥ�P�
�������4p�q��rp� .Mt���5H2��#c��1��b���
����#�n����+��jt�J�BJP1�Z
VqJ��j�qB�t:#�ɻ)���X'�wS�'���V/�d�[v]$����u�-�3����*)K{�^/u1%r��T�J�1��M?_�
]\5�9�9����g<^�oG1%��N0"J��zQV��F��?�u��!8a��2�g-�F��&/�b�V��:���{���/7�n��*��Mn��3!)�]���[�Lh
M>a�()Aż�o��s�J�
oa�pi 0Z��z�<SZy�{	�cN���N��"��	��J��
�8N����YD1�XE�8�8���R��\I��+m�
+���$�n�/Y���c1d�DD(�>��毋�����I�c'��H���,_e�~6�	���]eiV}�ρ��s3+ĕIB#A#�b�w�j�
+&�7M1�&&�f��=�n�=(�:�>aL�����.�L�踼$
e<���Af����u��"���"�"�
.}���tQ��'���Q4�gH#ݷ��
�c��U�9�YK����P4R}
��S/߂�:D`ʵv
a���
Ӽ�M\�N	�趕��$u����6e?L��ts�P�8	{�b�º�V���P2��譥�z}��cA|��M�;�n5�Q
�˳)�ѢtW7�bz�����sKW��M=B�V'��
���r�ʺR���C�Ɉ����R�5�2Pa!�Q�Y�z#f�(+`���o�۹.
+�3Td�g�F�o�Q�Q�&�W����.�aɖ�F
Q +����$"���F���uݛ��Y'߲�n�:�je
��p�`m(@53Jͬ��,
{�O�
<`���)�F��bg��徬��^�!4-p�p�pmz`���I�x�X�d��I`�5���=L7[�׾i�N�t�w[n� c���}��
+Y]&��
�C~���J����%�?I%
�%]�ӽ$�$�G�b���gI��4b�<�Iھ�
+�I�I���
ĐM
d�m�{On��j�7y�|O����L
��+5>|��3AH�@�zF�#׈=�	�h��gD�	<#�{&`Oa.�ڿ�l�
ू<��?3[QEa���ӕ��ɷ��n�mD� ~�_���}@iq��	n� R
+�>�D
+����O�
�Py%�=����>Dc�(a�Q42`��,	7�F�>����0�xjmx�ls�*/�����hl@ᆥ���MU
'U2�/�v�]AB��ۻ�No����w[�SoUA]'CŠX)�o��
+Q-�U���I�y�
�N���Q��0����j���Qr����}^%i�����u	.M7_�B�U�T�.��޺��Ҳج��s�nG�����73Da$��g�ؕ(P����'������G�{ܤ0�D;)�O
+����=eR�"��ͩ}͝dy�

T���`*��4�VQ%�Nu�5*0���4!����1t�����2��cNs�&"��WQ_���*V^��~L��$�

�L���s�u��S�}��C����O
d�'�.Y�c���K�00o
Mc�@�)!��Z�Ce
&4~%{�˸>��u�y`�y�6׸�ro]��mUm������PZ�]�m
�Ug����خÐA�^�7k�z�x�GЊE��g˲~����NJ��>|����0�oܟendstream
+endobj
+6413 0 obj <<
+/Type /Page
+/Contents 6414 0 R
+/Resources 6412 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6411 0 R
+/Annots [ 6421 0 R ]
+>> endobj
+6421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6415 0 obj <<
+/D [6413 0 R /XYZ 90 757.9346 null]
+>> endobj
+6416 0 obj <<
+/D [6413 0 R /XYZ 90 733.028 null]
+>> endobj
+5952 0 obj <<
+/D [6413 0 R /XYZ 90 716.2211 null]
+>> endobj
+6417 0 obj <<
+/D [6413 0 R /XYZ 90 716.2211 null]
+>> endobj
+5953 0 obj <<
+/D [6413 0 R /XYZ 90 551.7713 null]
+>> endobj
+6418 0 obj <<
+/D [6413 0 R /XYZ 90 537.201 null]
+>> endobj
+5954 0 obj <<
+/D [6413 0 R /XYZ 90 373.1044 null]
+>> endobj
+6419 0 obj <<
+/D [6413 0 R /XYZ 90 358.5341 null]
+>> endobj
+5955 0 obj <<
+/D [6413 0 R /XYZ 90 178.4973 null]
+>> endobj
+6420 0 obj <<
+/D [6413 0 R /XYZ 90 163.927 null]
+>> endobj
+6412 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6424 0 obj <<
+/Length 1686      
+/Filter /FlateDecode
+>>
+stream
+x��Y[��F~�W�Ԃf���[�Q�VJ��D�1kj�n��=�/�2
���$ڇ���7�;s�3��1����c�%�,�(��>~5"��3�~�<���~|��T���A�:�/�OA�Ngc<y;%xfI�x;�x��

�2
�Ɵ�0;�߿���tF9��؄y^^�aV&�51id�M�1�,�~����7�*�	b��=z�����7#��V|�7��8��7�ѻ���{�/��RPX�"
�4R�'Jq����-�!����4˜ɱ����1eU���&����$�"�(
�_]i�C&Z��,�$���j�D� :��3�OQk�0*��#��Q���>?�I����mӼ��8-��X��4N��}Q?��jB}��0Bp(R�zm�y��"�#���#�+b`y^9Wp�rn��������I����d�6��
+�+��D���
+�(�I���!�N)�<��"�ʲ�,��1�5ij���d����6�%�I�N�BUp3%|7˼�~~��}U<�fS1U�waT�h�"זxF�mf���SWC�[:[��$ד��M%/�U�.���P��h�C��:IQ�P�%���B���,^��}�x�T	�g��n�O��#�(8���"�C�Y�
+HЀ
����)<m�g�ef"�$pm�qxU8�|�XA���C����E�J\uЍ�@OA���6���b��F�o0�
�4�7ك����
���L�`���a�m��_�
f
����E8���Q��L^w�Cy���n'ŶB��o
�+:)E�%�ۙ��B-�O���ȝ��M����h�+Q �)����*���e*�u7U�!-¨�#�͇z�l��qϤE
��b\)�M��V�6�x
WY�@�m��ݟ���O_؟m�gb��
+���+�G�
��
����� 0 �
 :$��@<e �
 �u
+���/�Lj����,�9� Q��$
_�X���r��
f�H(ʻS��8;6`�(�ϻM
��G�&����;���5N2�u�����W9>�R�ގ�F��(LR��79�����
���J�WZ�Ciԟ�5��3�
Jz���*��r*d���
g�6�#!��HK�6Wp�|}g�a�)��4���
��0[�aR�
'̟�5$�ѓb����9�v�:ףA���r��C{�>d��m�N9���i�/Lem�G�v�7�I4�< �����ЛeǛ�S������g
�����
�
+�A������h
Ѕ W��9E��vf��yGSx����M���3P��
�����o�݉�Hʀ����:o
DA-�����.��4`��K
�T���<����ߠ�Q{�yد��~I_���`pP
pt�G���]<������AX�q��8�������=[(��d��X^=������8�|
{�����ir�qOn
2_��f׆ť��ByD�Q��m^���g�
��
�����-�� �i#H�������'j�@<�9����}u�&�q��v�vL�n�9���������d?N9�T9�-L�ᦼ���?�U`���T�.3Tڑ�r�w���C����n��o��W���<0k=Q66�Z��v�E����{||DQ��i��P\��v��>� c��d>�f
h���~8�è�U�˪
’mf��>L��UG�q9��
���gendstream
+endobj
+6423 0 obj <<
+/Type /Page
+/Contents 6424 0 R
+/Resources 6422 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6411 0 R
+/Annots [ 6429 0 R ]
+>> endobj
+6429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6425 0 obj <<
+/D [6423 0 R /XYZ 90 757.9346 null]
+>> endobj
+5956 0 obj <<
+/D [6423 0 R /XYZ 90 656.2957 null]
+>> endobj
+6426 0 obj <<
+/D [6423 0 R /XYZ 90 642.2571 null]
+>> endobj
+5957 0 obj <<
+/D [6423 0 R /XYZ 90 472.2638 null]
+>> endobj
+6427 0 obj <<
+/D [6423 0 R /XYZ 90 458.2252 null]
+>> endobj
+5958 0 obj <<
+/D [6423 0 R /XYZ 90 288.232 null]
+>> endobj
+6428 0 obj <<
+/D [6423 0 R /XYZ 90 274.1934 null]
+>> endobj
+6009 0 obj <<
+/D [6423 0 R /XYZ 90 89.4414 null]
+>> endobj
+6422 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6432 0 obj <<
+/Length 1970      
+/Filter /FlateDecode
+>>
+stream
+x��m�۸�����j.�_��@7�;�z�K�C,��v-Ԗ]K����%R%���5@>�$5�9�Gv��?21x��B�q9Yn������"��
���7���o��d$���}�A$(����ÔD�lN0��w3���a�ݾ�Q<�m>���!����;d�O�^}w(V�9x�z�UU��G~�fDO�r��&Ɉ�R&f�_�Yt�9��ĺ����dk��
+#f��<B#b
�l�8e���z��NO���
� �P���D�vq���~�չ]�����j��5f'����+��VN�����l
a�FMߖ�����zѯ4�7���#����h˺���^�ʪn�7����hD��e�n�-�Vf2�0N�2�9�A�0<�l��J��M��
���0j�6�I����&�4����a6��w���SQ�m��X��HÙr�݄�	.��^�ON Ѕ�4ޅ�����?���7�|��%�N3$��N
v�DTB�5%~��rS�9�N�����X��v���ys�m6	[����7
+n��f�2<k?
���
k׸$�vO�98T�X�
�ҫ�VQ��CQWm���>[����eU�ʶۘ�6�����;��x=�6���UNhȗE5�^g��t�9�����	�+�_xZ 
�z"���ו����W�6c�8lqau��
$X�jh�`��$��ȑNz�� ��#L���-pd���NƠ���*��|�nw�=}m�æVyY�C;R{���wn����:G,;��S�NR��9��]�pƴ�i�^hd:�����$0�X>ɛ�p��s����e� ���a��޶�c�%�^tU��m
���~���f�RLϦ��p��ҩӗ:�:Bc$�ͺ�<-�}
�K"mb��>�"��u���8o��^����0r� c�ӑ��N�G at Sd
&���a7�b�7-tZ��O�n�
p��
�]��	\ʑJ�m:w���#F�
+%����4,�ܖ
���f�m�Tl��v4�lZO��O;�(x��B����=��m)�sf@+`#8N �(4_
+��ӟ#
+0�B�� ���C@�������l[�p�$�)
|�-J�@�p?�'���(q���]|*5\��x c����*_�WpA@�[_��g�U�%�Ou�鳟��=��X���I�H_����
Z��>��ֆv
��Љ�`��h$�k<���iد=ʍ3g
+���?�~=���
^{�n�.%���D�/`^ꔁ�i��J���;����Q$���� �_��^��/�{}�D�:�
�/m�C���8�ֿr�c�#*�H'M_�|�0	RĎ]}1��zqf���A_2'�9����>�Ayh��~�->������œ�>'Ma>(͡'
^�x���
��N�|1�<�a'�
��e�G��gS�?}z}��8�qDx�"��/�>k��}��Ӳ�
ve��u$�*

�;K�aJi�
B�D�
�E
I�w��AN�bW��
+j�T=�Ss	
ڼ��B4��$B��<$�Р|�w}��
Å4�	e�Kh�t}�.#@#�Rh��p��0�S��;��q�t�<�ng���
o�H���
��		�
F���b�>��M��% ��'Y��R��
1
�K��,J�9��y#O�5�;%g�N &��wRc�Tl�CV�����H�m����/����
��;x
Y��c`�+�GURin�I��T"�H��1f:��C�l��<tL�ᄎ#'��8�����
?bC2��L��c"��M�o7?�K
�oH[l��v�_{'�[�
�EB��L�v
�������������ʣ�6
��ZUP4���)��ᦤ�"	Z��}��C��� �
��>��ķ�zZl7aޛѦ��-y��.|]��W�׏��hY�cY���������/�120?�{�Nh�K~),ց/���M��p�[���mV�Α�_
+W�
n�(endstream
+endobj
+6431 0 obj <<
+/Type /Page
+/Contents 6432 0 R
+/Resources 6430 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6411 0 R
+/Annots [ 6437 0 R ]
+>> endobj
+6437 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6433 0 obj <<
+/D [6431 0 R /XYZ 90 757.9346 null]
+>> endobj
+6434 0 obj <<
+/D [6431 0 R /XYZ 90 733.028 null]
+>> endobj
+6010 0 obj <<
+/D [6431 0 R /XYZ 90 538.7003 null]
+>> endobj
+6435 0 obj <<
+/D [6431 0 R /XYZ 90 524.13 null]
+>> endobj
+6011 0 obj <<
+/D [6431 0 R /XYZ 90 322.2402 null]
+>> endobj
+6436 0 obj <<
+/D [6431 0 R /XYZ 90 307.6699 null]
+>> endobj
+6012 0 obj <<
+/D [6431 0 R /XYZ 90 91.7676 null]
+>> endobj
+6430 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6440 0 obj <<
+/Length 2885      
+/Filter /FlateDecode
+>>
+stream
+x��Z[��~�_��

sy�x�H�$ȥ�i�E�`���pl�G�����
^-ɴ��EQ
�)q8
�
g���0���³LdH1.g��
�=��on��^���O������R�R�����r�	J��~��D��`���n	�ͮxxwK�޾n�)
~(��y}����\�.���/�Eۺ�z��[��u���I2"���_��>
+�eL#ڇ��ų�������
0"J���S
�7?��5�qvAJ��kt@�R��E�xEtz���6G������\!�q{��t��x�{��u��bza�Q�$X�9r,�_�K�s(�2S0���,���<b+�}���Je��(�*��6���d�(�y�7�b��#�X DVe&���Q�
���~3�tSVOQ!A�³^
v�ׄ 
�RD���x�l����p���j[V�WG(h�pAG�Q�
I
+&6+�8�ەw��}<�KP:?X)t�[�qOe���[*��v�X�گ^�2�Q�p�po�du����o���!��3��M���,��Vw�ي���
n��+��{���t��=�{Y�ut��O�b�q�U��U[�O����]y���AJ��ʭ�B�UWǃ���b��t��
a̰������g
?��
���%L�;�ѰI�n敗^�����۸Q]m_
U]��`5
�_0�/V)�#򒪡�
��#(�~��vj��A�6���E>�2~y���B�j,�Y1P7��
R�9X>��,�QB�h4tn^�c�j̾��F�7ϛ�:
7E�ȃo�;�0��fؤ
J�?
ׁ��(�-�+�2.�U
1*��^U0**c2cV�[o 
	���� =�긢�
�U��v#P�[�W͓=1,-��*�*�������a۵!8�nLﺹ��`����:`��^
�ឝ�t憶69���sᖎ������@���LH�2��f�#:���1f�)�|2�ϴ "��};ޝ`�2y9�����D�A�#�a"�
e����Z�����G��}��P��{��grU��O�8�v4�
(fU��/�^�O��U`��J��
ٔF� U
6f9"B]���n;T(g�p̆�~�}����R<
��+�[�Y����ò�}�j_���
����AD�p��	�d��=�QM\
+TTH{��^�z��ݝ�$�ͧ�:��Q��� �nu��m
tӀ���d9H�|R��T���s���d(���qI�2���˵�d�J�
Ƙw��gf :& ,7X��_�
+��h���`mR�a��f�\/��socz4���F�(H�p����M
�H��ͳ
�L�
W�O6a�H�
��C)Ql��C�<
@��D�#i��iaթ0Cc�$��@���mBM�,�$V��r��`e��]QV�� �Ɖ}����׾��*�d��
�?��	�3�
�� ��"�E[Џ�@rH�+$��+�L5O��Ǿ*��� qqN��Z�>�p9C�CV
+0�`���-����|����v��4W��UƺW%f8��ګ:k9�H(�O��s��.�f�
�
���b�E�G�6����`�
�
�}��gL�o+c;�z �ڗz�}?itwh�1��8� B/G
K6��ۺ�BF�����ڛ��Sf`D-����Ч�0C$s׹�:�������OcÀ:d�d Щ 
�>Q�U �U��Z�z��vٔ�S���y#�(W��H<eO5����
�5T�6C�n��7��,��[	|S�\�`�!�)�%w�|Y���\��~I幜ά��>�
+�#{��Aw�!������6�
)a�g�
+�����7L-�nھ�V�ֆ�v��-�C�J�:�E�뼺��'D`�,�����=�ؠ�;�@<�v�8���L\{d��a����&��6���uS���Q�0~+����]�%��Wvr��*g��\ʄ:��N�u�m��R�<�B��
31�
X�y.[m��L�F���Q��|4�(?6Lߤ�
�qUR� U8��	��Ж���؄�^�t��X2�pdz��`n�d����u7����8bR��9�1)��q�����'Ɲ[���2$հ�T���t�%f�ޜQ�?
Y��s��K7����ɳ+����d
4+�:��)3	�LLx�2��i�8ΣP�K<���|��"|)㢚�WO����9��2���>y���`9
wi��i��)����]2H+*URˢ�+捇e�LI_W	Y2��,W��,%
�G(FU�"B�o
w�ͧ�o	�KC	`0�
x{�0L�5� ����k��%���'}���Y����8k�h;��9Ыt�g��x24���*|)�x K�L�]@����#�§b�]�L�1_�9�Maf�9��	��w;��a��-K�[Gtfg�O`
y��.���
|��:�\�:��
D�؜��c2�,���Ւ�hp)�8�
�aX@<�����XU��[�_iń�SB�A���ςY؄a��*4ۧ�������oE���,��g�<+?�n��\f�:���Y���x����l��+��Y�ˏ �8�� ��z 
Ґ��2E'�.UX^�R�䲺��fz
�%�*$�
���,=�d�yv��cE���\����U��X�Kz5���q
+�±��8��ǚ����pB.a;�2�ı���b#j����
�
��S�ЊPH�����/ڀ�,�5>D
+�o�����O�m�4�%$'���!��wƧ̯��c���{�sku�[!�^�.�C���
���
�b U43���D�'����9x� ���f������a�EoE at M�#�����o��ѲE  �
*���~{7��
R�k�z�Ht"�@����p>�e
�߻������ďLg&!�?�`qendstream
+endobj
+6439 0 obj <<
+/Type /Page
+/Contents 6440 0 R
+/Resources 6438 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6411 0 R
+/Annots [ 6443 0 R 6444 0 R ]
+>> endobj
+6443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6452 446.535 184.2454 457.4389]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+6444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6441 0 obj <<
+/D [6439 0 R /XYZ 90 757.9346 null]
+>> endobj
+6442 0 obj <<
+/D [6439 0 R /XYZ 90 733.028 null]
+>> endobj
+6013 0 obj <<
+/D [6439 0 R /XYZ 353.1687 124.3843 null]
+>> endobj
+6438 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6447 0 obj <<
+/Length 1968      
+/Filter /FlateDecode
+>>
+stream
+x��Y[��~���Sk5�w�
�!���l�M�"�fa�2�V��#əu}E�BK���&hQ�Ð�y����9��
��+<D��r
g3<���/gĽ^��������s���r��oF�	J�|�{� Q�\�����ETf����E��zWF�o�m��/�,��rE^�L�����.�$\�<�0�dD.(
���_�^�;��Ib\�u��=��`
_�0b*��`D���l�)k;����ߺq��)aO��2��`=�"�Q@�ppA�`��"�j�
~e�)r��O���*8Ì'
�{���`m<�	��a�L��xI/���I}��p�_1ƐP��W�H%iF��/'&����>s�ACD�b����~޼����o_������B�d(�3��Đ�\HI��w��1M�~oM
.��8�H� I�y���$�B�`�{KVhݗE�:�ؘ����J�i�E��2����PT�6-jK"
rͳ]��a^Զa-b�����}_�Q
u��!lM��	Lp3:3�P��ᇖ+���~
+i[GJgysPIf�eBRMRAa�oP�ЧИ���k��l#��f#Ahk�M*��̢4�����S������u�6X�(P!��E��<�[�Z���8�n�E�w2��
lrJY��1�]s�d:�����-������RGC�0	��U��M'��h5�+a��
�<��Y�S�(ӵ.���LQ�(�t`�Hg=��S*�&�Q��x��1u{���xV?� ��;̟�
�(t�
+��\M�ѭ~hvc���xwz�
 `(�Gfo�Ƴ�(	���w(�t�<3	�*5ak���G�9��NM���O�@W�5�����V`.����̸QՐ�S����F�eQ��	B�>
o#�Y����R�&��CY,�X<8�H��S�$VN��S����Rh�H �<�g�KˢIv�l$�:�w��
M� æ
  �P(H�c�9��xX��n�b� �a � i��dI����}���'T_00��J���`@� �?!�q՗_R)(��~:���%9�ۊ��D�jp-Oq
��%D|%NIGԔ���v�u�J�yQ��U`Nr�i��Fg[8�4c�>�qݥӿq3O�<r�Rn�B�
�-��~�D�%զ. O�$��p��)�n#
6�;0
#��w�����>��T��<[B
��`T"��j%q�D�;��<=�jA�(
Ys�̦$r
+i	X��Q/\x#'"C��l�cV�����j�ӝ�
�tý^iښ�
$�`�����$k�IM��(��G\�EI��~�vI��"��ͽ=5f=�Z5���i5c�"@Hç����\1!�������>q^�(
d����L�e�:�]⳱�Z#� �l!�k�����*��0=�F���F�4�b�F�̺)ɗ
vm�&�MT:ͿtJ�H�[���tVcg��b�x
ڞ3Ϩ�><�ߙ/�PZ%�ɚ��������=ĦV�US�	�4��U^�������4�'HFk�l
�8�r�qe���I��확5���i�Qn���(�n���>��
:�e��Bӭ�U�3k�pH��^�8,|��h��=m�5�cw���A=�>t�Z
����<��ؖy}��b˃�}
_�L^��[����..�m=kj�����i��ʱ���
�-*��l�?"������	��ԭ�Bl��DˍQ�x�S%$
���SR���T��)qp;��6�s-�@	Iɓs�x���ƒ�<댞�eo����
7�3���g�׏a��[�7�O�T#�)�8�67�B�ɟ�0
D�����W��
��
�#�
+X�~�j����o��=t�Vmש�����������&�OQ��=��=��*>��F��� �?j}���jQ�%��_��M�����
�7���G㚅���������:�ɱDI}w<�w�~q�����Ug4�Ń��^�=_��kV�_��ì������	W���^
+endstream
+endobj
+6446 0 obj <<
+/Type /Page
+/Contents 6447 0 R
+/Resources 6445 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6411 0 R
+/Annots [ 6456 0 R ]
+>> endobj
+6456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6448 0 obj <<
+/D [6446 0 R /XYZ 90 757.9346 null]
+>> endobj
+6449 0 obj <<
+/D [6446 0 R /XYZ 90 733.028 null]
+>> endobj
+6014 0 obj <<
+/D [6446 0 R /XYZ 90 541.229 null]
+>> endobj
+6450 0 obj <<
+/D [6446 0 R /XYZ 90 527.0104 null]
+>> endobj
+6451 0 obj <<
+/D [6446 0 R /XYZ 90 447.9635 null]
+>> endobj
+6066 0 obj <<
+/D [6446 0 R /XYZ 90 425.6517 null]
+>> endobj
+6452 0 obj <<
+/D [6446 0 R /XYZ 90 425.6517 null]
+>> endobj
+6067 0 obj <<
+/D [6446 0 R /XYZ 243.4229 372.8981 null]
+>> endobj
+6453 0 obj <<
+/D [6446 0 R /XYZ 90 356.5227 null]
+>> endobj
+6068 0 obj <<
+/D [6446 0 R /XYZ 90 269.6148 null]
+>> endobj
+6454 0 obj <<
+/D [6446 0 R /XYZ 90 255.3962 null]
+>> endobj
+6069 0 obj <<
+/D [6446 0 R /XYZ 335.6167 192.7247 null]
+>> endobj
+6455 0 obj <<
+/D [6446 0 R /XYZ 90 176.3493 null]
+>> endobj
+6070 0 obj <<
+/D [6446 0 R /XYZ 90 89.4414 null]
+>> endobj
+6445 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6459 0 obj <<
+/Length 2183      
+/Filter /FlateDecode
+>>
+stream
+x��ZY���~�_��DV=}�����l �;y��DYL$R!�
O~}��M�M�(�w
��a��Q����CCf����3%2���j�g����_/���O����菱d$���M�A$(�����9!��Œ`���ϓr�<�_P</v��t]&?f�eR>�ݽ+��bI���%U�.?���\=O�U
+�$#rN�^|�����}���]0I�j����	��p�n0bF���`D����
������t󷎏{�|3� �P���dĐ�vx,��b)���"ww��1_W��
��!y,쇿��R�I������
��<Mʇ�_�tU���
b	�!H���������O0R� �����$QI�'��)���L�D�k��?f�T���.�@�
z*$)����X�U�1C\s���1�0� 
�4�Ʃ��>ڊ|����X��ڨ�cB����q�����3�7�����,?c�"
+pdtg�z�U1�
��'B����
+$

��~��O�mѪ����]T��_%���8�|Lwł���B
+'���Z L��A��\F���-�T�t��Y�� \Qڝ��Uz�!����l�)R����
�X�AR(�'�V�����r��d�����q���H)����1i��j�L�l̐dp
(s�-�K�`�D��M�q���Η�]�@V�Cn��-h-�|U�I�=�R�%e��Yr0�Q!���ү�&���'˅��K�\�?����7nS�-�b��\�5�Ӏۧ:�B�3�յ�>�#-�ۑ}
�NZ��#e�(�
p#����kw�|��ٿ�>������kCCT�)�Z^����[,�4�7���2�0p�C�N7`z��l�5����
+a�ZW��C
O�[0Μ�
0ۛ�*	R"�
�IX�%0�E(�;�
c�OY˸��qa��y���*�Ѡµ ���b=2�+�� 1��MA�� ٫6��E��.g~M�ը�̼��E�?��'��2t
+X\����4���~Y�&��M�!�y��	A�@4�ld?m�����a*m�����J�u�x(S���/���1
��Ŵc���VN�@
+�F�>���	EC]�z���^��D��)0Q=G�īgG��@>�,Fq=m��j,7p.��`�$����U���ujC������okº���?�U��F��(���d�m,���lG) '�f;��G6宖,(
�`F�]��R���lZ�Pp�
z�2�
�bs]�MX�CQUD^�V�l�Z-YP���
+`kZpK5<����;k�Ӽ�g���
J���b]�W�l�^-٠�����
h�E�Tc�A�;�-C�C��J��ek<O�8/�.4�<t�y�&��ٕ�P7	���es

X���s� ���ѦD#���!YRO�McJ�� S���d875FxX'����=�F�n7� ׮1ez�i�0/��Mc�U�޵3D��lKc=e��ѯ��� �����(%�[��}U~�4z!��/���v̷��~
)F ˠ�
[�� :�K�G�|�C9�>/[{����

+�h�m�6<�w��3a�K���|M��P
F�O������Q��N�B}��U
+qů_"ĄO �H�8�ud_�D���i�0R&�D���,�k�����7�a�֊W�R!-)�OBFuS��󢌭�
��cGY�I��-x��
9#L�
�����"\��X��hcS?†1��1�����"�
�R"��
o;B5
�Z�Kj��J#��
FyX�8��$<�
�]F��s�X���y�n��q���h���>��
:D(�:L���a�A���4"
����$3�u�9	� ��y�:�Jp�9�:��/܆y��Ҽ
���
� ���Mُ�M��vm���]��1}Ů�)�N���� ����k��k�������=߀�xn.]���������q��_�e���|Иrv��m{D�[[�\r�ԋ�|���P�xs�R]\�M����
+�/��B��{�@��W#����H!�_�5N'5���#@���0n�Jf~oMk[����7���UZ�~!��'�_�����lS���<�T��4�l��S?��Oi:���AHh%������/��v,{_�
�ӑG|���u}���}zzB�
+
��P���=
v�C�l�b�bS�[vD#]�s�C����uٴ˽}�bN���}b��ع0�� ���Mendstream
+endobj
+6458 0 obj <<
+/Type /Page
+/Contents 6459 0 R
+/Resources 6457 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6467 0 R
+/Annots [ 6464 0 R 6466 0 R ]
+>> endobj
+6464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [338.2472 309.479 386.1772 320.3829]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+6466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6460 0 obj <<
+/D [6458 0 R /XYZ 90 757.9346 null]
+>> endobj
+6461 0 obj <<
+/D [6458 0 R /XYZ 90 733.028 null]
+>> endobj
+6071 0 obj <<
+/D [6458 0 R /XYZ 90 619.8936 null]
+>> endobj
+6462 0 obj <<
+/D [6458 0 R /XYZ 90 605.3934 null]
+>> endobj
+6072 0 obj <<
+/D [6458 0 R /XYZ 90 486.7541 null]
+>> endobj
+6463 0 obj <<
+/D [6458 0 R /XYZ 90 472.254 null]
+>> endobj
+6073 0 obj <<
+/D [6458 0 R /XYZ 211.8424 218.3674 null]
+>> endobj
+6465 0 obj <<
+/D [6458 0 R /XYZ 90 203.7129 null]
+>> endobj
+6457 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6470 0 obj <<
+/Length 2708      
+/Filter /FlateDecode
+>>
+stream
+x��[[�۸~�_���
�٧6H�nw�4;E�A��Z[rey'�_�CQ�E��<I(�`
,JG<��峇�0����3%2���z�g����>^��eW�w7/�$�� #���m�$A�:�ۼ��(],	�x�fA�|U�W�,(�����lS�>���W�����u�oK*���nu<�˷�6�Dϳb��L�9��,���p��.��.�$ִݼ{�gX�71���c�l�)����7
��
)8��J�gKƑ��zJ�`���
a)x�˨\+�� fA;�����HR�g�����P��]�L!I��=d��ϪU]VnXn�gퟃ�U�?�������}?0�� j`��
+2�\u����b
�M
+-���P쥆�ha�X�8��Ɋr�_/i"��	��b#x1k�~�)���Us�(SlB�����j�%Zƪ��Y�=x�D\�.�F(o��
<�'���zU�
5�ooT�j
q�
�©�m�
aJ���!?��b��Z!�X2��������cbn���p���zi+������
�儍p��ؤ�Z2�
��������ӡ�j�X��T�1+j@�����sf �:��
66�g�rX��}���'w�1����	�=�c
\�[/UpA��dz�����ێ
�e���
�k��M;� �2-�S����; AjJ�`6��;�����kW
O~p(�c�U��p�?�jk�
|ZX���F態+�^x���ۧ�q,���l*�t�Ƣ��66K(�)㊽�Pq/J30P�X����Z�]���
�Y�w���:�6G�-X���v�
&��5�X�hҌ�h���q�:�q!I{�.�4�4g�r���&��7�?;
+[��P��a��Lb �t��Bˮ԰��a
vI0P���^}Zg
�����$���Qߊ
~�Śl_ono��9��j�o>���P�$|�h���	RCc��
Iב1wUiw�=����� ��$6� �
{wY'BE���V�{�/�C)e�h¦��YW勘
P<��.����3�;
L6�R(��r���6a�FZh�U�$��,�ۨH�<����e��Y��CN�
S���EY��&�6�H�X���%�b��9E�w�Y`�=�[��@
���-���SU����SE�K��Q
��x��4H�`Ť��"��i:�jo"��PU
+i|
$��{�s��B���띊]���թ�˓�,Q���K[�t��[a�:7���m���rg'׵·��T،���~��!��n�c^d���+��=>
��f�Ιh�ʔ������hhn��BZ��_�K�I89�2r
��sW
R)�
(�‘+���"���a��z@�ey�)��hؤ4_Z����'�2S�'n��;e45�iiΑO7�۲D� a��H�./v���S�N!�(���t�-l�6�;ل��)2كt�b�sӜ��,vO�*OyT3�`l���t�.|�oM�P	����>��
�a���}{;۹�n�:t�q*��ːf�$�5	�s�!��S
��C{�4{����^
�
Ӑ��
��������p��X�*#�3��VedW�r��hB'�(�6����#�dʀ�Rr`I��
b]o�;g��q ��Po�#��Y��zo�k"���D���s�M-��}+���ƓJ����u�M�����
�/�S/t����4�S�UWll��X�4�� [...]
࢚�X�3h�� 
Éb�O�̋�2{̋ڎ��	�^j��NjB� ��U_��
+qMu'G3a
zL�&��7�p����o�6���������wS���熋��0�XJ&��Rh��"�
+�KT��^�LiW���<n.r�
����+�L�-&S�wL)#�ϔ�g=��J9��y�dJ8�����.fO0�^~�}!�U�
gJ9,\8��
�oʼԄ��l���3���)�H�L�#'
��Ά��6j�h˟��YL���J1ĕ�(��R��#&@�2
ײl)�#�p`E:��c�F9�lc�,[d��-�v�d#خ�+��d��
1�}�e/�,� �O��ɩ���^���\����I��YH�LLQb�I����3%fG(1GT�3�,�Dr5�#F�L%
ң]"""�ܶ�곩����ʒ�Ep�e	���e	i�\����e%�$n��k���[�I	#�M/W�)&��Р�P��g�X�
5�4�����}=�%�'�.L�1�HJ<��j�~���d��E
�C��
���1E`�Pd
+�k(2��Tv_�`
+e�7�,�����Ɛ��{.�/{��/{	�Zs����#|����"�$;g�"�D���\|@MbF���%ԏԟ};�姗�$���~���JӴ\W��2+G�-  �&]����bӬܸ���
�Y�H�o��5?�TXN���ˋM�r�+7P�f�"ſ)+G�kR
O�n�+6����W
X���4+����}c����H)A�f�/��rA�JV.��"+7�}8�
+�}���F�2'�%cX�B~�4�� 5����Po0���7"��ol	a��v��c7l�d7��1�~�b��?��Ӫ�e�m��SAeJ0CqB�m��/u������P�
+Bb������_΋
/,;o��y^�`^��>ܾx�����Gt*�C�����{1�X�
Ull��Ah`K�� ��Ȗ��q��
+�
n�߀�k�P&L���
fendstream
+endobj
+6469 0 obj <<
+/Type /Page
+/Contents 6470 0 R
+/Resources 6468 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6467 0 R
+/Annots [ 6472 0 R 6474 0 R 6476 0 R 6477 0 R ]
+>> endobj
+6472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [338.2472 676.0766 386.1772 686.9806]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+6474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.5798 385.8282 424.5098 396.7321]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+6476 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.5798 101.6221 424.5098 112.526]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+6477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6471 0 obj <<
+/D [6469 0 R /XYZ 90 757.9346 null]
+>> endobj
+6116 0 obj <<
+/D [6469 0 R /XYZ 216.7638 566.1879 null]
+>> endobj
+6473 0 obj <<
+/D [6469 0 R /XYZ 90 550.0834 null]
+>> endobj
+6117 0 obj <<
+/D [6469 0 R /XYZ 211.8424 293.9369 null]
+>> endobj
+6475 0 obj <<
+/D [6469 0 R /XYZ 90 279.2122 null]
+>> endobj
+6468 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6480 0 obj <<
+/Length 2512      
+/Filter /FlateDecode
+>>
+stream
+x��Z_o�6ϧ���b��E�>��+�w�)��]�M�Beɕ�f�OC��E����>�ᐇ��hf83�
gd2��G&O2�!͸�,�7x������<��������J1�HK*'���$HPB'�SB��9�O�<͛m��Ì�i]�l̲��]<5y�r�]S,gs*��e޶n�ެL3#jj��N�9�
�>>|���]0I�j��|��'K���71���&��d{�)
���Ǜ�|�B�B��`De�&sƑ��z��`�2F)��2����t62�����mWUw�?B�g�1�S���T��c����BƂޘ�Y}[TŶ�#��?i���1���M���t�'���NJue�s��mŽ�1�����ۀr�2,l��`>�G)L%�x��䋍�RtaP��1��n����i^�
:6��Md�!.	IZ2��T��4˜/
TD����������7�� I���$�H��@f�h���}Q�8#/��cެ�[��-���]��@u�L�*̐d0��y�4��ȳ��b��N�X�!�j�H��+D"�gGa�RV�G�m����Ƈ�� +���yQ-����S��l2�
���s
+pd_}�Jh	�$y�����)M�����lw݋�M�3
;-�['YWu�O��Z�#o'����Ǧt��I1�M�&�
�����$�3n<�ݘn�TA�����d�h�ZQ�
���4R*��m��"�|�ey�K�����V��SFs�"Bj8ii!h
�� Ʊ��8eJ
�oiV
��UW�J�����kD�s�C4�
1D�O�Ou�3����������<j���'���p��S)�9fE�aG/	�9�
·C%���D��G<��Z=C�B�/�MX
'WÁl��j й�X���U�c`�
+�#�$���5=�#��Ylӈ�@:ˤ'8�N�7�B^N�c���TH�8{u:M	��NO�H�Ӂ����E�
��2�t)s.�F���/�_�H�(RpP�
�����@����ƈ�X
H4$��k��bѕ/�d�o��Ia��.$�����m�d���)2(�
P�eq>�PTeQ��	�a���a_�j3�"�i@�s�&��"��ӈ���C�mLu
�8ܷ��#_�h)��D�4�
d��h-r@�e҈)�D�kb�h�#Zw�2��1��*
+/v���=!
χ[t��3U�M9a�wUg{+�V�@Y&�g
��u�?h
�-���T[��^	�k������֏sWN� rA�GAWM>՟��o`r�9ː&�OYƶr��{�1�Du��WY�PdJ��S��O)N
)>��E6�th��ɸ�%�g+"�l�sSt���mL6#�D8���O0�*�q�
A�@�>�P�ԩS
+nփO�B(��.۲�j
�v��oqd��~�Z�[��������H32m�0wK��ܼ^���ʑ�y���8<zT�[��l��=���:��`���%Nxi��3x�3}�_F��MWmJ1Ҝ�Qu�0�vEiKs�\�w��w"���
�ֽ�ԇz��
��U�ѯ�u�G���iM۹Yc@q�7�n�X?-�K��\.�K�&�w���e�6ѥ���`�fq�Q��S"�zCTxC��%�zD�5a�֣>|�baQ�3�i<;Vk�eg�&ќԢ�[B�σV@�:���n�Gt����&E��h�uS�����*cHa�ő�\t��bn���;t'�� -�u��]c�)��	�3]
_0qhK\��}^�W8U�2X���

�pZG���R at P����Ժ�&��v�j��? (0@��5�iQ�(�]�t�b_�cd��i�:�vM��FM��:|�p�3
+d;u�
��;~V0d� �$�A�^�{��$P
��8{C��v�9�
)��#�Gle��s�5������V�G��+��=���0�̶��GbQ�Ͳ�r�ƹ����>„k�r�\��\�u�r�b�5s��ŭ��a0��}�!��Ͻ��z�*����E[]�y
��3!�������,�1)�k=���
��
9_>�|��C`䃲uu1mB;
�y[�]�l�'}d
j�a���

؇
cP�Pr�\�W#jZ�B�;��Ӽ�q���)~���%6t��K�1���h(��v[��:����M�e�@vtɏ��
�L]��@u*:�
���i�~p����~��Gb�R��4��
+�k
+��
+��,R at B�K5���@uM��p��:�_l}r/���5��wq>���^ix��.�.*
n~m{(%�R�
kq&n�絇.Z��
:Q&�
�������Q��5
����
`�v9D����k��'=�vXt�5_"�A�~��8���c��[;~z;n�<n�Sk��fBL���O^���п	�bH#�*�K:�l�æ8���	�Q�P[ɭ�:	�
6;�0���d6��	_��M�����ѢE��v
*��ݮ�;֋�-CC�r�{��D���
N�̰�t鯌��t�REe����:'q��:U��Aendstream
+endobj
+6479 0 obj <<
+/Type /Page
+/Contents 6480 0 R
+/Resources 6478 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6467 0 R
+/Annots [ 6485 0 R 6486 0 R ]
+>> endobj
+6485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.5254 170.0038 163.1255 199.0696]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+6486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6481 0 obj <<
+/D [6479 0 R /XYZ 90 757.9346 null]
+>> endobj
+6118 0 obj <<
+/D [6479 0 R /XYZ 216.7638 637.9189 null]
+>> endobj
+6482 0 obj <<
+/D [6479 0 R /XYZ 90 621.8144 null]
+>> endobj
+6119 0 obj <<
+/D [6479 0 R /XYZ 90 530.3761 null]
+>> endobj
+6483 0 obj <<
+/D [6479 0 R /XYZ 90 515.8058 null]
+>> endobj
+6120 0 obj <<
+/D [6479 0 R /XYZ 90 413.035 null]
+>> endobj
+6484 0 obj <<
+/D [6479 0 R /XYZ 90 398.4647 null]
+>> endobj
+6121 0 obj <<
+/D [6479 0 R /XYZ 90 115.4332 null]
+>> endobj
+6478 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6489 0 obj <<
+/Length 2058      
+/Filter /FlateDecode
+>>
+stream
+x��Y[��~���Sk+��C�&A.m���S
46�֖
I�����P��ll7m�b
F���ܾsH�%�?��x��B�q��
x������{������+)�iI��aW� 	������!��uD0ƫ�k�WIqL
߮)^��g�-���ӧ")^��.��:���8$e�
ߙ�)�$^�lc`%Ɉ\QNֿ<|����
&�����_�r
:|����X,_�#�5]
�����q�v
���2� �P����b�po��<?8�n2����9���d���+�z�R�QL��[n�Ϧ���1˫Gs<U�n� �bH��O��
�����%��V�ű�^
+`x�ge����GLI$�ED!I��� ���{�s����U�l��l���Ú
+0]�d���^�L���cj�h
&�@��j)%CJK
tr#�����5˜�Z1A1פ�ᝩ��b�����	�H1J�wo���=C�B�0ѭf����	X�JK��Gm\�VIfN�U�
^�|�gӾ�B"�1k��Y R8�1id�紼Cz��Q���
(��a$���Z��Z��"��p�Uq�6���0��)��o,���z�
�U�p��K�E���̥ ƀ
�̈́k��W-�1�י ������	�!�9�x>!zR3	`��c��s\r4�)�r" `.7�Ht87�+�8��b����m�J�2�3K�d�r�ܺ�NS�
.�m�piJ-=��u�8��6��ٜܿ��c
�i���Ģ!}�S�%/�i2����\VǓ����1[;2�V��0C����p�`Z(��];��*�h�7�GU��
:�b�Gؽ
.s7�����i��7��������S^�����u$8]}�s�ճ�;��F��m���<��xJ
���zv��9�j
qcWw��hM�	 (MaC�� lm�plm�p�2E�T

MY&��{���)@

�N������k��iX��e����bڄF
���&)�[>H�}0���T��G
+�`�J!�K�j�OD%� RΥٝ}ﰫU�7�s
�/��5��ɶa����KB�&�F�� �'��a�'|����v��7�}�ӏ�B�+���][�:���?zCC
+H�e_���W�.Ե٢%c>��>�n����NV�סq{�*5�i2�8؞pĹh�3$䔮F4��C���.M�5D
�E�/u�hr	RD����os�s�r�
m>S0'(��kS��hrH��I�?MVM@�I{6��H+53�>�S	�����"�D�'�ip�:��'�W]?�
+� �Q8�
��e
䝕��(�,�C_\��i�F at tPHa,U�P�3���������
�P���at���2~�nb����
�ͦ�t�c
��c�eL�Wtb��
d�M���k謮��-���lؙM��&����J�&�FWB)u����I����
�r�td�(�Q�Dۗ�L��ۦD���6��
�NP����8���HG�0a�
������V;}sn�
+� �
4��Wy�#)��}<�YzL�e1b=�[��w��߹�J�

�
̮q�D�Pu����
߰%/_��
/�Y��S8�3qk7Bo�z�ٞ7��Aa���_�J{={庱/u��(��mt�|�8�{G\���Պ]�c*
�7
+ܥwWŚO#K����W�6_��y��.��<�2��@�6���E�@�bW f-��	�p�����ăaG4�X񐑁= @�����p�����#ԇ^D����^9+�R�_���@��%�x`p��np�_y�#��
�>���S{4]7b��L�Q(�zdċ6���6�Y�+�ۿ�UsᓍH���`l:%]˝��釓)�*/ʱ
�0�l��p�Z�+LW
�Ah��Q��
Ű ���~
��18S�>V��b����18���%�vC��i�����ݧ}�gi�?��Xy��[����;|~�K��l�P�0Tٞ��
B�.+eB�Vr_�/���:e�	QoFS;�'�Zş��tw���6%:g�@iuw:
�Ƹ8�H�+��E�����
2R*
����Ǽh2�w�ulO��V� �
l��endstream
+endobj
+6488 0 obj <<
+/Type /Page
+/Contents 6489 0 R
+/Resources 6487 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6467 0 R
+/Annots [ 6495 0 R 6496 0 R 6497 0 R ]
+>> endobj
+6495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 136.5439 138.5077 147.423]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000013) >>
+>> endobj
+6496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 116.4543 314.5657 147.423]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6490 0 obj <<
+/D [6488 0 R /XYZ 90 757.9346 null]
+>> endobj
+6491 0 obj <<
+/D [6488 0 R /XYZ 90 733.028 null]
+>> endobj
+6122 0 obj <<
+/D [6488 0 R /XYZ 280.9426 544.6878 null]
+>> endobj
+6492 0 obj <<
+/D [6488 0 R /XYZ 90 527.9607 null]
+>> endobj
+6123 0 obj <<
+/D [6488 0 R /XYZ 90 437.145 null]
+>> endobj
+6493 0 obj <<
+/D [6488 0 R /XYZ 90 422.5747 null]
+>> endobj
+1192 0 obj <<
+/D [6488 0 R /XYZ 90 314.1347 null]
+>> endobj
+6494 0 obj <<
+/D [6488 0 R /XYZ 90 299.5644 null]
+>> endobj
+1193 0 obj <<
+/D [6488 0 R /XYZ 90 107.4879 null]
+>> endobj
+6487 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6500 0 obj <<
+/Length 1776      
+/Filter /FlateDecode
+>>
+stream
+x��YYs�6~ׯ�S+͔0N��[�&��i�>�
-A2���T\��w!��T
�әf�`
�=>,�����*<�B"�x8]�&x���/'Ľ�}���fr�"S�TH�����!$HPB�7��3B��`�g����|/^�)�eۇ;���ŏ�m
���/�d5���g۸(��k����D3�.5h
+	g������'�oj�ĸ�~��
�� ��'1��=�`D���݄SV�l'o&��z��>a�`@¡`'
C$r@�f�v
Hr!$���j�Xf�&?q�Z�4�%"���X`(J��Y�p9 �Jr�(�8IK
�F�ꅒ
�9,
f
+�3�K+�
+�# �;0K���
��
����D!��(��j�4����ބ�`�u�4�ܴ֛�̑
C�v�e<B<��(3+AEK	���:�<�8R���%��,����W��\��$�ػ�NW��öD�U	��|�ltS��r'e����]d��a��T��zY��#
�P�'�/D
'��=Z"$$�1��r%������C�Mʇy(f���#�0��4d
1I"�n����TGF
+
+�KH_��k]
�W�,-���	�H2J���R
��H&Nڌ�u�-�1�!#qB�A��&A���bZ��#��(BJ
�۔�G�-���\�I�|}�p�y��8�b��@�t���d�j��N[zi9�"zD���;��;����u˙��<3[�>�װ���!��x��4H��D���;:�]������t���q��n�����QX�@
�
+�O�-[G�8߸�����/!(�c���2�����Xƥ^���A/T:mj�e�r$�)tMw��o#�~ʜ�3n�Ѻ�����Y�����cŶk�sV�|:���n��f3ŧz�uy闽��2ˋn
�0S��`:��H}m&��aJ+�
#I�h�i��iL{����	�1����ڸ��٢mFx�)"�
Y��Y�x[��mɬ�c:�Mݖ�B�f� ᱊n6c��Y;M���Ի���`Q?�4<��=uCw��8U(�$.�M���9HqJ/.�>�����_2k�Ǖ�ADN%�猿d��i�L�ٙ��P4�����͚i�%>�L��{uRi*�Q鯘0D�����%,B��
,��B\ n-����
�C�<� ����*KiV�xh�Aw�en��QΙ��)nM؄q�x��٠�5H�5][ܺ�~n��0�
�>��#	R�W:Jg�)�	gt�3,p�ȤԔ:O���߃\�^4�Z?�}߼��k���(JC�Ӝ�a��R��d����u�g| ���Z�=��"r��=g�u��� [...]
+��
��ҡ��L�
�k��ʛ�dž�1�l�=0��b�Cy�ѡ|�xG�:��Cc(����⡜�[;��)l�G
���ն1�U�N,o��
_0�/7�' ��F#=��y�P���]�{�������ʙ��N6^���ÝO<;��ell�V6@Ć;���y�!XA�Ķ�ri�t���c~�I�~�[�J��m
�P�r^���z6;�!��<jل</�$-:���
�7��
��vk�nO'T������ro�� "�9���Qx
+Z�=�Š��"��c��Yy�����
�I�c�ʉ���+3	Js���[Gl��B�_΅�9T��C�ʰ��
+�.�*��JCH��D�W˨�-�жQ�o��VW?���?_T��)�^�]Y����Ѳ@�4��()����U�/��=X
X����҂�ö
%�Z����}��5���ݱ����xZ�w�o[!� endstream
+endobj
+6499 0 obj <<
+/Type /Page
+/Contents 6500 0 R
+/Resources 6498 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6467 0 R
+/Annots [ 6503 0 R 6504 0 R 6507 0 R 6508 0 R 6510 0 R ]
+>> endobj
+6503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 561.5231 138.5077 572.4023]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000014) >>
+>> endobj
+6504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 541.4336 314.5657 572.4023]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 221.3314 138.5077 232.2106]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000015) >>
+>> endobj
+6508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 201.2418 314.5657 232.2106]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6510 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6501 0 obj <<
+/D [6499 0 R /XYZ 90 757.9346 null]
+>> endobj
+6502 0 obj <<
+/D [6499 0 R /XYZ 90 733.028 null]
+>> endobj
+6124 0 obj <<
+/D [6499 0 R /XYZ 90 533.6789 null]
+>> endobj
+6505 0 obj <<
+/D [6499 0 R /XYZ 90 519.3267 null]
+>> endobj
+1194 0 obj <<
+/D [6499 0 R /XYZ 90 407.0242 null]
+>> endobj
+6506 0 obj <<
+/D [6499 0 R /XYZ 90 392.672 null]
+>> endobj
+6125 0 obj <<
+/D [6499 0 R /XYZ 90 193.4872 null]
+>> endobj
+6509 0 obj <<
+/D [6499 0 R /XYZ 90 179.135 null]
+>> endobj
+6498 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6513 0 obj <<
+/Length 1766      
+/Filter /FlateDecode
+>>
+stream
+x��Y�n�6��+�j��޵���-0m\t1
�%'Bmɕ�I�����E�v&(
+��"uE
^
�sD�)�?25x��B�q9]�&x� ��'�=^��E7�����S���r��T=H�%t�
+?�A��c<�8'xd�����Y�}~��,��1�ς�y�|���|A���yn/�6Q6'z%�z����l�y�a�vՀs��������g<
a&1���	n0"���n�)�o�����M?�A��/���5aӅ HQa�QZ L��la�(�+o��A35UT"���R���u�/�4ɗ�s$�"�(�v���h��(�� X!E�h{-a�E�\�ɜ�ٗ`�wA�p�EI1 e4�2�Ղ���`퀡�!��f���s*fO�%E�)Qܼ��lr����+_�
2k�dw�ܮ��)
����1H�1q1Az�!i-6f���# ���"�=�!�9��"N��n��6Bn���r$p
h��P��S���K���r�0��
�f�9��v�r���:M
�C���
�������̂8)�n��"�٨o,�
��@ <#���=�҈��eē��
Z�$�v�߅�+
+���N��d��]����`���< u��:���#Q�[X��Y��oa	G�
]�(�p�`D9p���"C����x�ՅF���|�u�NW#�5Ҵl�
��]TD�HE��H$��Ԅ�k�
�!&'FoG������6�1ǣ�
��>�.)���1�)�n��}��a�EN�6i��qY�]iݕ{/w���������1N��H�
+��B�q�e�v�r��Ӕ�( �T }�����	��a/�ь�8 ��
���@�@6@�0��hZ��r���FG:X�T
+ᛦ�nQbl5�Z��Ζ�I"g at .1�To�&��(��P�D#��H��uʯsj
i��J�z�
��dQ�Ԁ�Vg\u7�tQ�
����*
�),$��҄ur������7Q�a��L �������ԂT��Z���/�D��R
ި΂����#���R^��]�ܟp��D̪�p��Ls�+&�Yڍa)�+��s^��w�S
%
~�6a/��ь��7 㗾
����B�D��4c	b��u�Nӌ	�����\
+ at U=�����!�p�B?
�갶
)3K�m���y~��;�'�`Óu��m
+
� t���𭒦Hjq֡(��þ
9?�����l>���j������\�U�0��C�ޏs�V� Z:3)MĢ$;3P�zf�.Cy����4�|��Շ��I�6���]�$
+��UL%��HG'=�d%�g��>(m��^���� ͵���
st�D`�*QmM�?u$p�R��
rO�
Pv�NW
+F�(M��R�
`��
����	;s$0:��H`0��H�7jו�N���Iq(����?2�;)��Q#�������2E�_�}
�h7�4E	�s%��>�7�=(��l�^�F3���������(�`�:s8ڍ�3��^�Ft8v
���q^�(���(�w.�����{���Q�K�|��kjؙebZ����>ku�:���?�O���'���Sy�8�͠�Q���P<�>j�?
�n(
�y��0K�E�~R�~7����$|��?�m� z�LTi��m��쭳j���<ʾ�
1su�� 9�T��h_ʮ@���g���YDU驜J�F�q~�V�VB�Y�O���W?��m^XtްJu�<跜�cQ�77OOOh��C�37����� �����-���^�9�@���ai��wi]w�wA�����!��Vk[endstream
+endobj
+6512 0 obj <<
+/Type /Page
+/Contents 6513 0 R
+/Resources 6511 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6467 0 R
+/Annots [ 6518 0 R ]
+>> endobj
+6518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6514 0 obj <<
+/D [6512 0 R /XYZ 90 757.9346 null]
+>> endobj
+6126 0 obj <<
+/D [6512 0 R /XYZ 90 694.0892 null]
+>> endobj
+6515 0 obj <<
+/D [6512 0 R /XYZ 90 679.5189 null]
+>> endobj
+6127 0 obj <<
+/D [6512 0 R /XYZ 90 533.0467 null]
+>> endobj
+6516 0 obj <<
+/D [6512 0 R /XYZ 90 518.4764 null]
+>> endobj
+6128 0 obj <<
+/D [6512 0 R /XYZ 90 314.4447 null]
+>> endobj
+6517 0 obj <<
+/D [6512 0 R /XYZ 90 299.8744 null]
+>> endobj
+1195 0 obj <<
+/D [6512 0 R /XYZ 90 95.8427 null]
+>> endobj
+6511 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6521 0 obj <<
+/Length 1676      
+/Filter /FlateDecode
+>>
+stream
+x��Y�r�6}�W評f*��6M2M�4q�Ҍ��`�S�RH*����A�
َ�d�`R<�=��D�����
+��x���5|�rD��<��?\��^H16�H*�W�$A�:�X���(���x�zJ�$�W���)œ�rwcyr�K�!O�����<]LgT�ɳeR��{e�)���-�$�����ū�󋆜�.�$���ѻ�x��=�aČ�[���Cǫ���Y�ގ�h֩
�_�@vP��������%\*����d������|�P\&��r�f�*���W����� )J��:�F���y���(���7{�¨{`����poί�
+��"��h� ä�ڂ�}�8��fD!	ۣ�_,|`���|�q>�Uw��yc��ͮ������@Z1�'�aD1��֘rݳT�
S�X���i�TC:@�k�`�ȑѤƔ7i�"C���]e3���<ͮ{|s[l�%�ׁ�ƒ�4x=��5h�F
3Y{���B��n
�7��BA�IV���L�b�ĭ7���n**��՜��dY؀�Ԙ���|��B���eK�c�UГ���]m��T��qc��f'�{ E�K9"�w
���-m
���|��=
&�g�j�P�6T�1-\0�5h`�-B2��MhSe�fũ
P�$>\��rY]}�`h�և�K���8��J��BG�KH�VJ�xz�Q��Kh at 1f���3��2]Ǫ7d<�\��j`�FQ�X�^���S�L�I~�]٬
�2I7u�
iPC2���dp�!sq���0�o��C
S�C��<BHH%�1�?�DZ�'wgI�s|��
��,����&)�K{<�S<(v S��S�=�}�_��o�)�sm&,H�<��5�q��n*�7OJ�$ UG�W
$ <S�0�	-��S���@sjR��9�o�
vD���9�<���ޚ{�T���ui�i�km?�6K��'q�}DL���yR��Agg�Մ4<��ub�՚V�K����P^D��b�_ at 1�zeè<��
��Ҍ�yH/kD�V�3d�a�<H0�d~�>n����f��}�䳂o<����i�A�
}P�
��D<���,̌��'i|��QǛ��p���ep���
�h��d0v��	�P�
���Ƚ�p�@��}&a���ѱJ��oPC����5s��q5�+�
�a
Ӷ�ОZ
3h-�ay"�Z�H�1
_8����%X�ő�aS�Q�
��LX
w�|�j��tz�������0��K��+
�
b�������#b����p׉'��	�5�W1
K����`��C�a����I��/mD�����:?f.1�#�K�$!�
f=9|�#b7�H�N����k�{D��ǿ�Csњ�'fu�?���]�F���|pT6��I�,�@8��*�`<g��K���|�g�%
��pt��C���)p��Ű���WgX������D>�fu"+�9֍�;��
�h����ܕᾡ����� !X�$�"���J��K
icH;�"ʴ�!�&�	�k��M-[����Ϯ������N��xg��d���q��[
+ʤ�@orK�+>6�B��	å���������f�f�7�u��`]��ܜ����ޢy��Y��QZ�m6˳>/S�P�����ЀK��
j_*�;\��y�պ�i��Ri�G���!�� "ֆ�endstream
+endobj
+6520 0 obj <<
+/Type /Page
+/Contents 6521 0 R
+/Resources 6519 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6531 0 R
+/Annots [ 6524 0 R 6525 0 R 6527 0 R 6528 0 R 6530 0 R ]
+>> endobj
+6524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 531.811 138.5077 542.6901]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000016) >>
+>> endobj
+6525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 511.7214 314.5657 542.6901]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 281.4628 138.5077 292.3419]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000017) >>
+>> endobj
+6528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 261.3732 314.5657 292.3419]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6522 0 obj <<
+/D [6520 0 R /XYZ 90 757.9346 null]
+>> endobj
+6523 0 obj <<
+/D [6520 0 R /XYZ 90 733.028 null]
+>> endobj
+1196 0 obj <<
+/D [6520 0 R /XYZ 90 502.755 null]
+>> endobj
+6526 0 obj <<
+/D [6520 0 R /XYZ 90 488.1847 null]
+>> endobj
+1197 0 obj <<
+/D [6520 0 R /XYZ 90 252.4068 null]
+>> endobj
+6529 0 obj <<
+/D [6520 0 R /XYZ 90 237.8365 null]
+>> endobj
+6519 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6534 0 obj <<
+/Length 1879      
+/Filter /FlateDecode
+>>
+stream
+x��Y�r�6}���)���ȺK�-�\*�ͮSyHR.
��
3f
����p`oR�-?D#�n
u�aH��!�P(d\�a��{�jE��-<�v
>�Y]})E�PR��$A��$��	A�n�c�~�!x
�������q��`�<��.�ˣ�����<M6[*���>*���ٙ|C��d���$#rM���~��ꋛ��.�$ڟ�_�A>|�ˆ�Z�p�	C
V���f�z�����~P��
��&,�
+���J
��V-,�p卖�L�J��*d_��S�
��z�#�)Fi�Y|��
�U�
+)��eV
�(���4�p�~���6�����#P�FR at D|�.`�1A;`(fH2�yȏ*֏YM�tgQ\}I���1�CXϾ�D�6�]gy�{�M���M�D
ge�g"�V0R����i02�f���ؓ�X��n�,>
NQ���
�����I��<ϺV�<�#!BQ�e#������~�l�.$A��%YkV�
�
+��l�d����P�~R>De�$��Н�Q�^���ҷM�"���>)���Y�8DZ)��y_/w��qcC�
��=�My�݋iQ�5�a�� ���
�(��P�:[�9���T�t1E	���d�i��|To6b at ya�i�Pea��{g�˨�*��Œ�9F頵��?7�:S�Qi��dgBxНy�'ƑR���=�Ӥ��=G����|k��Ry?��1r�K��KZ�������%���
|}8�M��;�h70��d�<���F2�|ضV

�g�> wκt�R�L	Y��.�1D�k�G{^�zf7p}
%ɭ#�S�7�m|���m�[�ͷ�4K��Ֆ�{�����2�Ҭ�}�T��P��ڋ^!
��
��dQx
Ո�Z�%FO>W�t	,�J!Iy
�O�����
��L�{�f�
G�`���T�s�T���)�#ʉ��#���Oj�I�1���)��r2iq
��R͗���ti�pC�k���ɸ*l�=�_���,��Z3��.��;�A�fRw�m��A��ӝ7��c��2�d��t�9ll!�
�� si��{wx��)M>c��X������r z�Cs�	T�Y�[��4�QW�i6&nӋ+ݝ
��ߔu�e&iy�(�P1 at 9-R��C�6����Ҏ���B��v�C��w77�=�Uڞ�(-�&z���
��H�B�g�(�[z��C
~j6V易�qPC$~��E�˧er��zb@�Tb�V�c��
_���<�����lkvIB�7��z�	���Z=�ŝ{ɩ'�ҔzRpMC��ML
�O0gO<Y�y�,�`�Op]U�
�J<q��Q$��!i�����'
+�M�'��ȳ�����C���[�h���ډ5ډ,P���
�Z�y���vZX|0��������N�
�g{_�:������|!}�|�(VUc�[��O1%t�MR�=np���-(#�����7ʈ�Q�8
I��>���q���(�x�a�	�P�"�{m���^�Y��^��l�ޙ��A�T
4a�q�nz���DB�_�#���!�_�k
&1=_��Vә��aMɋ���L�
!�7��Y��4�Τ����/�ϒ�2B4�/�&ӛ�0tYj�G����&������o�
��؀���Z�و\z���w�K���=x�"!���4
�)�����ERj�����$
+��9m��;
�mj맻m
+h}�h}�sa�7B�]��>��U��j�;;��6�T|�
U�
:��i����7�~���շg���7�oR�G�Z���t}u����������:��WC\
�"
m���m[��^�9
_���a�Ub u86�J3<T}ۈG��y��; 
�endstream
+endobj
+6533 0 obj <<
+/Type /Page
+/Contents 6534 0 R
+/Resources 6532 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6531 0 R
+/Annots [ 6536 0 R 6537 0 R 6539 0 R 6540 0 R 6542 0 R ]
+>> endobj
+6536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 619.9814 138.5077 630.8605]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000018) >>
+>> endobj
+6537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 599.8918 314.5657 630.8605]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 312.0738 138.5077 322.9529]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000019) >>
+>> endobj
+6540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 291.9842 314.5657 322.9529]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6535 0 obj <<
+/D [6533 0 R /XYZ 90 757.9346 null]
+>> endobj
+1198 0 obj <<
+/D [6533 0 R /XYZ 90 590.9254 null]
+>> endobj
+6538 0 obj <<
+/D [6533 0 R /XYZ 90 576.3551 null]
+>> endobj
+6170 0 obj <<
+/D [6533 0 R /XYZ 90 283.0178 null]
+>> endobj
+6541 0 obj <<
+/D [6533 0 R /XYZ 90 268.4475 null]
+>> endobj
+1199 0 obj <<
+/D [6533 0 R /XYZ 90 118.3285 null]
+>> endobj
+6532 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6545 0 obj <<
+/Length 1654      
+/Filter /FlateDecode
+>>
+stream
+x��Y�n�F}�W𩕀r�w���M���-Mܧ40h���J�B�qݯטּ�/I�
� �,��3�gfg�V���G<��@H3.��~����rE�c��]���RxiI�wq}� 	�P�"z�&Q��	�x�zC�:�����
��l�pGyx�Kr�������<�6>x�lE��M|
���q����dD�)����V�/��l�IbB��z�
{���
+#�����#�5��+NY}�[�]��ة

_pQ ;�����
 ��D\e�n�+-N���<���m�e
&iy���>I�}�ol���_X�#�2�,K}���w-9Fb
T�~cg/t�	�C�0��o+Doq
A��-�0�v0>H� �"���#��(�)m�b
tC���BϼB\*jeV!h7H��D4Qb�pđV�Lk�6)
� ���:����8��&�MuU�����nW�#��:E
է��BB�2�R�Gh?d����7T���m�Z
�HH�>��$�XLr�����l$6����w�.)6R��p�*�0Q�'EJA�p��wQ�=�4����3YE��]�>.�8�'���Q�
`H�
G��B( L�V�zΡ@�j~�
j촗UF�"}�M��n2	BC����'���I�{��� ���
�o�Ng20�e~���|3���];��b�m���[�~4����-�xX�r��9^��.j�`!%�ڎ���l�i&s�:���<��]�
��-0��t���#���2�o��q��{Ai�����4�q0������`.n��4����ḍr� (�O�EM���T O�ank-J����'�6��2����E)$"p1
+�
��h�,��v~c��閣�3_�p�
�T�5ʄ�c|���6,�h�|
�׵<J>�(���p�˵]��56�jQ&ȷq<���P�}'	���}�G
Te�����63h.?���l���ٰ�~����b�F�Q|��4�ȖY rHB��� �G�%��^be�G3�3#�fO��E�nG�rP��Zi���(�}�r	܁ ���(D�
+$�M*�C�kD�`6[<�PW�'�nD[WU�9H��/�'�S�'豳C����2
K�8#��v� f:�(��k`m.��N�ʠ��.�A���HZ=���v�~ ���W�w�8��|W�
��
uP�b滛�dY�r>��a٩aO�%����d�[����e�rW9E���δb��NE(0���089Zj'E�8�*Q�ܘ:�
��逨Ǐ
S̚Q]�u��OT\��2��-
�.j�uQ��$�>j���i_�H��-
����e��=\z^?�p!#���p�f2�M�U��C�Y�mZ��ii`_ҡ��P����i�	Lo(r��v9��y����Ӧ�,#��
�޽`����,3��bZ-�+�S�L�	4_����s���s����Y���B�?Y蓸x���|`�
.̕C�ta~ck�o�{B#!���8
�o������gM� ����%�S��:��x|mF�ѩ���եU��şE��bm{��a
+b��lD�Gc
+�F��FJ�
�]�EU �LH�����^���v��
~�z�K
�5
�-�������=��.M9Jʳ�aw6��CV���d�o@�Xz�sؑ2���u�WD��%)��k{TG��q(�=
(endstream
+endobj
+6544 0 obj <<
+/Type /Page
+/Contents 6545 0 R
+/Resources 6543 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6531 0 R
+/Annots [ 6548 0 R 6549 0 R 6552 0 R 6553 0 R 6554 0 R ]
+>> endobj
+6548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 519.0935 138.5077 529.9726]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000020) >>
+>> endobj
+6549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 499.0039 314.5657 529.9726]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 117.7763 138.5077 128.6554]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000021) >>
+>> endobj
+6553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 97.6867 314.5657 128.6554]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6546 0 obj <<
+/D [6544 0 R /XYZ 90 757.9346 null]
+>> endobj
+6547 0 obj <<
+/D [6544 0 R /XYZ 90 733.028 null]
+>> endobj
+6171 0 obj <<
+/D [6544 0 R /XYZ 90 490.7587 null]
+>> endobj
+6550 0 obj <<
+/D [6544 0 R /XYZ 90 476.3182 null]
+>> endobj
+1248 0 obj <<
+/D [6544 0 R /XYZ 90 334.0318 null]
+>> endobj
+6551 0 obj <<
+/D [6544 0 R /XYZ 90 319.5913 null]
+>> endobj
+6172 0 obj <<
+/D [6544 0 R /XYZ 90 89.4414 null]
+>> endobj
+6543 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6557 0 obj <<
+/Length 1794      
+/Filter /FlateDecode
+>>
+stream
+x��Yے�D}�W�	�*<;�˾A����!�\ZkvW�-If1_O�4�u�NHA��aGRk�L���32�b�#S��J(d���v��p��	��|�6�l9��B��AFR9]ޗ3H�%t��_�A��c<{1'xe�h�bN�l�9>�8�V�&wY�
oo�̒x��Ϟm�<��/���D�l��0�dD�(W�7˯'ϗ
8�]0I
��&���i
k�z�3ZL��#b
�n'���b3y5����zP�
+� �P����c>��@��Z��ׅ��6��U��q���j�K�"���ȫ�~�?kn�^
��n]� �@!H	�#w��
�Z�	FJ��b�W&�uiD�V����FЖ͂���0PHR�K�O��g�x����v�6Iq��:kq7���`�I%Ld �s��I��L��.�r"��`�őѐj?�c�I6so����a�6���-U-�VCNi+f0�4.����mma����`��$` ��
"�E!E�8�z�E�;��2JǗ�X
�v�J12��uY��ğ�:��_QnW��󶰑l�<
+Ѓk$
ԯ�����5�X0�ײ�;FytVF_��mt�.7��9��f���K���E[V#�� D�p�����"���3�|��}g�Y�9y̡�B��U�=
���e�ĸ?��j�K ̐d0�Y>f�9���'�>�B
Cb�
��D
o�q��J��Tד,�<����CzI��m�Q��m�Y�		;��
4k[����
Aê
+��s) �#z���6��ı�n0j�5f�b��l�n��D�a[ҿ�.
���#�ο��b?��v�"�%cj؅41-��v�׎��zm�������u��h�f�8d��$�#O�����1`S�s(��֨`
�ۍ/I��"�sM��kQ/�N4��]p�0W�����Ow���j`��M��&i�M��]�Dk��U�BJʀ6D�}%�%�!�ުU~R�������[of�æ8[d8pp��"Ӷ:_d`��%�Jn� �Ԛ�p?k�.ȭ�����kXnu�~�[�In�����S�m5BQH�о:�t���#�
�~���}�����mr���t]'@�T�H=1|Ǭ�Ph���>uz��u��
��KnY�0RH�g\�gC����G���ٻ��ш��� LX�v���,d.p�6!�H��f�V��}���q
ְ���n6�
+*}�BɁe��j�����
��my~,���5�@��ʡ���ލ
+H��i{���q�Zt�%[{�#|k�
�W��Qz�ij1�֗���,�t���w���P��|��o�+��� Ψߟ~��,*v�@�1����a�X]X�p��c�
Ei=e�%��1��
Uq
+�7M��))
�A�!;T���D�T����Y�q���;n��2P����ԭ/i�
F^'�&I��ъ�`��#u�n�ki�*w_n�3�o�<t��Zb`�;k?_y�S�7�C�@���?��p`��z�õ��W'
Hr�V����4 R��)1݃�B�h2���j�Wy(���.
*��H_1�1U��h�$*:�%m��H"��y���Mώ�$g�H�j���_��+��jn�/,o+n
�
+��`����)������!Yj��4$2�i�j
��a^8������Uu�Uu�<�x.��W���P*D�.���
+�O��*�g�*�_�烀@���>�n����N��7��6/,Zo�'�Ӓ�?�������	�stH�}���f����qq
B�*6��Ec4��	?��,�
,���@mw5��nnK}4�ۀ(�!��endstream
+endobj
+6556 0 obj <<
+/Type /Page
+/Contents 6557 0 R
+/Resources 6555 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6531 0 R
+/Annots [ 6561 0 R 6562 0 R 6564 0 R ]
+>> endobj
+6561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 272.0652 138.5077 282.9444]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000022) >>
+>> endobj
+6562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 251.9757 314.5657 282.9444]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6558 0 obj <<
+/D [6556 0 R /XYZ 90 757.9346 null]
+>> endobj
+6559 0 obj <<
+/D [6556 0 R /XYZ 90 733.028 null]
+>> endobj
+1249 0 obj <<
+/D [6556 0 R /XYZ 90 541.654 null]
+>> endobj
+6560 0 obj <<
+/D [6556 0 R /XYZ 90 527.4056 null]
+>> endobj
+6173 0 obj <<
+/D [6556 0 R /XYZ 90 244.7975 null]
+>> endobj
+6563 0 obj <<
+/D [6556 0 R /XYZ 90 230.549 null]
+>> endobj
+6174 0 obj <<
+/D [6556 0 R /XYZ 90 89.4414 null]
+>> endobj
+6555 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6567 0 obj <<
+/Length 1695      
+/Filter /FlateDecode
+>>
+stream
+x��YMo�F��W��J@����Z#	��@ڨ�$h���J�B�q��;��\R�c�&��;ogf��d��L
�*��a\NW�	�n��	���m�/���[)�I�tqw�A$(����ӌD�< �ه9��0ۇ�s�g��q��p�{|�������,^�*��f�yu�Wtes�gQ��`&Ɉ�Q��_�'o
9�]0IJj_'������~�3ZL�#b
��'���f7�8����8��s� �P��������JG��Z9�������g�i-�b�\��&�/ݒW3}��ü�no��ePz
 #9����Ѿ��%��Q�up�
+^+ѫM^a�����0O,�=
�ԔH
�'�8��T at A[�@j����$�����yd3!����C���.���ۨ
ny�|'>RL#���.�!D1�l�S��|�
B�m{�	ĉ4�?0���hH";�6�Zf�\�P7׵@�h5�� ��Q�L�AA��Vm��B��Ң��pQ�_w�L�b�x	�4�>'�V�pL�fm��1�1�
�A��:�&T ��v�.��>����
�ə��P#��b����w
�v�H4<�Ǣ�e1�V��
(E��8T�p��a���GI�#e4�e�
�H����D�$�k��b��s*f���w�=ɡ�J�{R"��ń��WU$�J�'�0�i����9�7��U�?�E|������B*a��
+tGeTOe�Vߥ2y��1�&�m�)�q��_H�@T��w+Ϣx�)'!q������� ��z?S j�>������T
q �zE�k��j��Q�%H`����I��#0R�zL�e��5qq��
+L���7��QW 
��5��dPK���f[l�b��Ij��VE_�~�s)f?��<Ļ]uuk
ƛ$͢�`��F��g"�B
G�K8�8�]*:>�c���v
{��z�$:=2~�qȼv�9W���8�o�j at qtOq�/�8y5SKr�ۓ�t�������hD�Vg�HP�Yp\��
+�N5oW��ҼC٭Y �\�׫K����9Ӭ�Q�U�q�� �I��#0R�zL�����"�
+���Q:��շ��UlO�X]
&SK�n�c�6�5�.	�JYu��\�\%
2հ)�8���Q#A�P�ΧK���H�{,�n`ϓ�Q����G�/E��.E�����|f4#�o8�T���z����&J�,,�,/��N�ӕ���2��ː��vd����I2�^�
+)�;�/���N�rJM�k;��qY�$��䊟�+"%lMy��j��+�
)l��F��T�
5k`�v�J(LƗߠ�V;rE��c�� 
�Ϥ�I��
���~*x��#�%��R
܃=ӷ�Q#)����X,}��ҫ�b �j���r�#'���C�K��R%.� ~V,�4l\-"\�)�
+�%P��e�+��4+Aҿ>�$�
{��@k�ǟ9�Y�?�G1���Z��Xz�I���

D41��P�G���闗��Lpo�a����Ќ<
���Ƽ
+1�!P��[��Ԑ�9B��[cM��@d��co�OukO=�
t�ُs!fv��	
������
+�
+�zT�!��*O$���E]�P� ^�F���W��ۼ�ި*�j-�7o��mQ
���


�*G�I|�P\\
��./����pl
�^Ѐz\
�s��Ra�p�;nAp�>mڦ
�ò$��h
*��1y�endstream
+endobj
+6566 0 obj <<
+/Type /Page
+/Contents 6567 0 R
+/Resources 6565 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6531 0 R
+/Annots [ 6573 0 R ]
+>> endobj
+6573 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6568 0 obj <<
+/D [6566 0 R /XYZ 90 757.9346 null]
+>> endobj
+6569 0 obj <<
+/D [6566 0 R /XYZ 90 733.028 null]
+>> endobj
+6175 0 obj <<
+/D [6566 0 R /XYZ 90 592.0607 null]
+>> endobj
+6570 0 obj <<
+/D [6566 0 R /XYZ 90 577.4904 null]
+>> endobj
+6176 0 obj <<
+/D [6566 0 R /XYZ 90 431.0182 null]
+>> endobj
+6571 0 obj <<
+/D [6566 0 R /XYZ 90 416.4479 null]
+>> endobj
+6177 0 obj <<
+/D [6566 0 R /XYZ 90 269.9756 null]
+>> endobj
+6572 0 obj <<
+/D [6566 0 R /XYZ 90 255.4053 null]
+>> endobj
+6178 0 obj <<
+/D [6566 0 R /XYZ 90 96.978 null]
+>> endobj
+6565 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6576 0 obj <<
+/Length 1855      
+/Filter /FlateDecode
+>>
+stream
+x��Yێ�6}�W������;�}k�$hzK}HCkӻBmɕ�lݯ�P�d]h�NE�����8��3�34c�#c��J(����v�����券�3x?k|3ݼ�b���T���bI�����wB���O^O	���6\��R<I6��J���]���ۗi��Ψ��g�0���7fm�)	&&^I2"'��������y
�aL
��ѻ�x��9�a�t Əp�њ��#NYu��
�R�S�(>�@vI
(CX
+v�b�c�6I1W��eq��
W�E��a�1��=<^ܛؤa��6\8��߱�����F@����X^V拷�,7�2�_XӛZ5gA�K�~w��&��(R9
�KJA60c�� jD!I9/��^������h��ع��vQ�<�8�3ɓ���1�d�w
���	�H2ɪ�"�wXxMpe��,
�$Pc)0
�
��fM�>��0f0�
 �(
:.�[��4��'�"�(���ᨭ�@ZT!X!E Amv\��w"�P�
Ͼ��{m�3�:#H��G���W��s��YfU�*֔��$,�:2
3?8���
�fnj�rͯ� ���
��f9%bR���)%��6�J��Q���_K�ˣ$
"���9� N��2�0�
**ėC57P-��~�5q��!�l�
Hm��^� U�f��&S*&��[����
���pP�ND�M�|�N"����ca긵� �,�,���v���Ɯd��iE�I�0:�1���.��T
+�dY
G��i�
�?�
�
��_�ձ
+q>I�͡�A���/��0/���{t�>چ+w�%�ܷ@
+��fgV�B8���r��K�e���AL��Ɔ���нLM�O݇Q�E
�YkVt@>�sƒJ|����k�q�he�
X���Pga�\(�:㠟��m-E���K�J��5:�#���mG��o�F�:j	e*o˨F!�.�R��S
|���
+� �<'�XGL��e�+"�V9�)-�@�).�%���p�R��6ܯ�
p�_B]��MM���'kg8
�)VM��Պ
�����9VԪ�=q���T��{�����_���xb� �TP r
hw�r��*���7��[h��`��� �B܋3nZ
�`ĥbW�b��X���uGmvFN�(�{^�����Y�a��\a���h���O��Tc`I�^X��������X��4ŘTHHW�/��>�C��8A����d�`D����/k[`��ftB�2hgy(D��úV,P��&R7u���׵��0�UP�	v�Q��B�Aok�
�����b
��������������m�*�q�w*��^��ڻ�am^��%Q�g'3�(	ܿ�A��vDty�U���{����.Km�
5��K�����[�smanV��a�"����Ƚ�a
�;mO��pO&{s�=Fmfa�5���r$t'�'c��9�Y(�r-JrS�����6�V�е<>!�����<aP[5�ì�:3��h�&�m:(���v
��u����v��8�c�+���8��Ԯ�a`��,Op?�e 
+ʺ���F��t�"Z ��K[�A����w�����e Pf)W�ܰ���j-�j| �b�E��t�ٙ�ap�ǖ����2�����4���.�A,
�a4�O��R^�ox\P�������㚍�`
{�.��D��
�k<Җy���H!?����~��떮�
V,p?tW Z%�M
���m%��[��ʛ_3�~9b�R��0އ���J�v(�����x���Xq���4P����jE�|�Ǹ���8���Y�j;<N�7���C��non
�2C�8ڥ(�ov��M��g
+���7��zXZ�琻R᠅e]�mRQ*�����=
ل�@���
]endstream
+endobj
+6575 0 obj <<
+/Type /Page
+/Contents 6576 0 R
+/Resources 6574 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6531 0 R
+/Annots [ 6580 0 R 6581 0 R 6583 0 R ]
+>> endobj
+6580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 307.7846 138.5077 318.6637]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000023) >>
+>> endobj
+6581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 287.695 314.5657 318.6637]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6577 0 obj <<
+/D [6575 0 R /XYZ 90 757.9346 null]
+>> endobj
+6578 0 obj <<
+/D [6575 0 R /XYZ 90 733.028 null]
+>> endobj
+1250 0 obj <<
+/D [6575 0 R /XYZ 90 537.6948 null]
+>> endobj
+6579 0 obj <<
+/D [6575 0 R /XYZ 90 523.2682 null]
+>> endobj
+1251 0 obj <<
+/D [6575 0 R /XYZ 90 279.527 null]
+>> endobj
+6582 0 obj <<
+/D [6575 0 R /XYZ 90 265.1004 null]
+>> endobj
+6574 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6586 0 obj <<
+/Length 2143      
+/Filter /FlateDecode
+>>
+stream
+x��Z�r���+�J����û�d2�ɫ��L3S*Z�l&��!�v���	R	RN�٥za>����8� l�`�G�%2��ds���#<����+x�������wR$Ier��G�	Jhr��qA�t�"�Ň%���8��K�����n�t���H�����l�\Q���Ӳl.?ڝ-�D/�qca$Ɉ\�������|{߁����A���ǟq��5|�3Z$�p�1�&�NY{���t��n��E���
8��k’� HQa�VZ L�oa�(�����A3�(*,L�.��R
+pӒ��1;>�
J0E�Q���
!���A X!E����0�?��)���i�  �é��cs_=�Us�I����C��W�C~��`�?��kj���t�ec"�i!����N\�7[����C,���y�_L���V���0+�ȳ�/
V @�{&'\�AF�&��tgkw at ZnmY����E�����8D�B� ���4��y��
>����#�AT��NZ#���Ԕ�&��v�L
J����
��H)(�U�u2����I��̡�d���+tᤃ����c���n�缲�U�h�z�~8���
�ԧ�3�
��r�EZ�E9\#
	i�l2�:�++��ր|���aEi;$'�)�/������g��y˼�"黻�q������',�KC�Y���
 ��aƍ����qc԰<���I"İb���h�$pm�M~8�+
E� ���0���u�a�Pr-�Z�U������l

����~˜n��`�
!
r�5���`
��D�]H/S�zٹ�G��56�S�hh���������~a˓�T>y�<���3��
ʩ���&��
�$�!]�|����]��
]ϼ�@�漿��cŀ4���c��	��h�?�_�"1+"�V�"BUNB�e�
le�rJC�(�)j'$A�w�ޙ�R;F��
�
��O; u���f
L{��O��iwi繻p�����Ճ7��L��T]р=���AI2ƛ����13��L=�!�x�Z�Z�T@���
:D�϶�x<�&8Bd4�
+b���IX6�!�ຏ��	��g�l+J���̒����(3��8�>	�k��R�����d�_���Ö΀�a��&Z:�ta��th!uK�5��{��d��_�:=DOH�qd�~��U#��w��Y� u��q\x#�
+�@H<�
+�SI���@z����z�1M0����㘄xF����A�%5\ �I����wpٵ�F8�wz at bR�6���V�'��__��]W�eŮ�8���!h�L�Y�_b-/��&���$�+�1]�H�t�n}��`R���d�����
q��r"`�+����Rgv	�(�aG��k���0�R6�����U��_�
��XO
L]�۳�	/4Ι|�ވM>�!��жf_&9f=r�
#0q��	U��TGP�:�����\@<�4Q�
Ze� ��
����5����䠊u9�!�sh��u�W|7
���aI�P4l>����묮��pJ�@��h7���1"\���jȣє�����Aw)�!�����oDj���:�o9�Ɏ��aՐ.�c]Nf��s��C��r���x��/�E𾆞<�Qa�78���FU�4L:D�FS=a���6��Hz��h�;(�>���vH����ÃA��V�k��b�@�_ي���{�
����{���3�a�"�:�/�
�
���xo�L�H����#}�\��"5�E�L�v�b(Q�?M&��#D�Kz�z�s�6L�7���>d�lI��߶��c��1��8$���]i#����j���9��I�]I�v;�=o�vY��gԥf��3��=�
pn�G���;�{ss_�n4y��Z+7�.ݗ6�5��t�Ǚ�r��W���l7�Um���T����(�-]$�j3
���M����K rH�$$�����\\T
��ۖX�[�.���J[�z)�¯�O���/��
+���
��O���Q �
+�|��Z�z�y�Ϥ��CF�����6.K
���TU������g�)����
+�U����v$�1F�*6�Ug4���C�J�%�c����Q����

ꓬQ
���9tendstream
+endobj
+6585 0 obj <<
+/Type /Page
+/Contents 6586 0 R
+/Resources 6584 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6598 0 R
+/Annots [ 6588 0 R 6589 0 R 6591 0 R 6593 0 R 6594 0 R 6597 0 R ]
+>> endobj
+6588 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 666.2483 138.5077 677.1274]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000024) >>
+>> endobj
+6589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 646.1587 314.5657 677.1274]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 587.159 212.1242 598.0629]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+6593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 418.2709 216.2973 429.1749]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+6594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 318.3354 483.2121 349.3041]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6587 0 obj <<
+/D [6585 0 R /XYZ 90 757.9346 null]
+>> endobj
+6230 0 obj <<
+/D [6585 0 R /XYZ 90 637.855 null]
+>> endobj
+6590 0 obj <<
+/D [6585 0 R /XYZ 90 623.404 null]
+>> endobj
+6231 0 obj <<
+/D [6585 0 R /XYZ 90 480.9221 null]
+>> endobj
+6592 0 obj <<
+/D [6585 0 R /XYZ 90 466.4711 null]
+>> endobj
+6232 0 obj <<
+/D [6585 0 R /XYZ 90 298.9233 null]
+>> endobj
+6595 0 obj <<
+/D [6585 0 R /XYZ 90 284.4723 null]
+>> endobj
+1252 0 obj <<
+/D [6585 0 R /XYZ 90 194.1351 null]
+>> endobj
+6596 0 obj <<
+/D [6585 0 R /XYZ 90 179.6841 null]
+>> endobj
+6584 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6601 0 obj <<
+/Length 1637      
+/Filter /FlateDecode
+>>
+stream
+x��Y�r�F��+pJȪp4��[�e�I
[9�.D�`@P�����`% ͨ|q�ci����y�O �$08PB!ø
�n��)^O���i������AFR\�
$A�\/ߏ	A�N�c<~3!x
f�p�fB�8]?�E�,���o�0{��^d�r2��\����|��lB�8Jx���1d������u��.�$�ߣ�q��^�0bF��n0"��`3┕7�ѻ�����_
+8��5a�T��0^+-&ZA��DÕ7[� ��
+�Ӈ�=����y�&��q�S��A�m�xDe�EaT�
+)�D�������,N&
���u�����~%y��H
+ȈT
�����b�$����,�P1~H\Q�+���9mf�S�$6����Ȭ3��`��=g���;g�� Ǥ�	���
�H+x�l
=N4�R��I9��R��͝��"�l�<�YG�8�e�H��Ĝ�R� aӏ��Y���ma�Y��J��Tj��0b� uPYY�?E[w a
-;����ƒ����3����6m��-�f���
+�2�0�EQ�Nh;��9*�O-~��.����_Ӽ�洨���x�r�]G���dF�#�߶Q�i�;����4|�
��Չ��l
���f9L)-]��"B���C\�~o�=-��,����L�d4����^ �����8h-�bPQ\��l�����
\�8JŔ1m2H������婏k8����i������H<�Cg�Ο��� �	d�*
z�L�(�|�_6����P�ę��x��A��e�r0#u��������_v����Q�z�J\u���Kyj��7qo��KH�����%-v��8�1��OZODZ�9�Y��/����-g�n��{��[!��
[Ӫ�ظ4H���Q���K���mp��Ѻ�{�2����.��yR �\��b��Q�>�NJu|�,^�m���D����A	FN�6H/�֒��7<K%���k�V�5��d�=���e4�|�
+
�A�Jݫ�>K`A!2�A\3\���g���
���Xּ����̆V;�'։ŏ|~Q�5T
�5
A�ۥ�t!ʜ;����&����
`��	�A���V�#�S"
)y�kt�4%e;y'�8�>��
���(�
{ޅ�bw�]=��ⵁ>Z�d at aF!Z�Sd@�%*�!�z�
*�� ���Sd at O�A3�2�̆ɠ�ēdpb�#�_�
�ʡA�t�]H?���W��S��/Q/�
+,C��|aJAt0X���K�Ƶ�{�䄽��	#���	f�l�z����t`1 n�.g�
���e������k�%p�]�oa8�B��!��>:�ęY!8A&A
�Sآ�!.�Ak�W��WA0�'�2��L9�|̎.Er�i�x/i�E���AӪ��	�Y��l��[|�i;(��2�L#
f�	
0~�����a�2�g

��������R��`��(�Ip��� ��_
迸-���M������o'B���0ه�	�[WQ���%@��,��
L��S
�I;K��_Ay�s
l��i��_$�;~m�wy��]]=<<���x��8��n�WǸ8��P��7��:XZ��p|��Q��e�f.Q��,�8�����ѩ���{�P�$�T4endstream
+endobj
+6600 0 obj <<
+/Type /Page
+/Contents 6601 0 R
+/Resources 6599 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6598 0 R
+/Annots [ 6603 0 R 6604 0 R 6607 0 R 6608 0 R 6610 0 R 6611 0 R 6613 0 R ]
+>> endobj
+6603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 677.5408 138.5077 688.42]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000025) >>
+>> endobj
+6604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 657.4513 314.5657 688.42]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 377.4633 138.5077 388.3424]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000026) >>
+>> endobj
+6608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 357.3737 314.5657 388.3424]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 260.1221 138.5077 271.0012]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000027) >>
+>> endobj
+6611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 240.0325 314.5657 271.0012]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+6613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6602 0 obj <<
+/D [6600 0 R /XYZ 90 757.9346 null]
+>> endobj
+6233 0 obj <<
+/D [6600 0 R /XYZ 90 648.4849 null]
+>> endobj
+6605 0 obj <<
+/D [6600 0 R /XYZ 90 633.9146 null]
+>> endobj
+1253 0 obj <<
+/D [6600 0 R /XYZ 90 543.0989 null]
+>> endobj
+6606 0 obj <<
+/D [6600 0 R /XYZ 90 528.5286 null]
+>> endobj
+1254 0 obj <<
+/D [6600 0 R /XYZ 90 348.4073 null]
+>> endobj
+6609 0 obj <<
+/D [6600 0 R /XYZ 90 333.837 null]
+>> endobj
+6234 0 obj <<
+/D [6600 0 R /XYZ 90 231.0662 null]
+>> endobj
+6612 0 obj <<
+/D [6600 0 R /XYZ 90 216.4959 null]
+>> endobj
+6235 0 obj <<
+/D [6600 0 R /XYZ 90 115.7823 null]
+>> endobj
+6599 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6616 0 obj <<
+/Length 2529      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n��}�W�)�������<$��Ev7�d���fa�e�H���v�>�l6�&��f�$�`�1/Ů꺝:���?�0x��B�q�X���.wE��+���
�����[)I��n۬ 	�����%!����/�_�L�}r����e�{}J7er�c�P&����we��^Q���쒪r�?�۴�&z���V���%��׻���uƵ�
&�5�_W������W1���N0"�����S�OvW?_��[��h
��@v�(CX
+v�bH���#
+�׋�r{���o�m����1w��
�.�v�'_��z��[�z&2M�Kؓ��Չ��<�ZX�8A{2+�b��Ŋ($)w�ccV��p�`q��f�[
��X`4��OY��J�1�d�aV
�dX,�s�bj��O��v⫞|�@�hU��h��b	Aj�u`
ei*uh� �:�y(��"�6ۈ�	FJ���N�Md"�Vp%ȫ`��R>��-C�0΄O#�ܼ�p��Q�g�\���}H��4�O���}qW���������k�z�Ov����@S�dy�?�
�v�}R.E�ו��-��;zq7�z매nv
=:��uȤL]����
emI��ai�0�j!��2ѥ�Ъ/5nS� HXK���`�y��Nu}�vTJ�"�(�*�I��:�
+)��ĬU

���Y&;h|I�xܧy=2�h$mO��H'56&Lp̐dp
s�T6�۰d�"��(��)2����/�3l��
+�*��������.E��	���AEzOtH�!��(lQ0u)�U���˶���
+
+���X�R���� �`���(d�D�!瀌�2N
�A�	e� Ȉ� 2H�6QNJ���Q�+�"
!!��s0֊����ju�Ӵ^
ʴJ�����]�`t���06��b`�ټ����0
�5m\R�����'�q��!]�a�K�"�f�#
��,����5LER{��&�*�,�(�$�	�U���X���wpJ�Ũ�a+j{_u
�5XS�e[�QuW��-���k)��(
����(ԗ�F!�@�\�B1�3(4�"�B�ا�ЬGN(42&�B�1}��&�(d����/�1;�́ ��S�t�C:3�ijP�^�bW<� do�eQ:�P��!��a � �ς
�����\^�c��6�<����cjU
p���Px<K�"��a�m]�!)#fCЩn%��	�d����c��Iy�z�f����߽

G����c�i[�`^Wj�����)u�
�o��q�:�j���$������{��O�ǚ��H)�Wݤy���.b�$��?DrQC
6ޫֶm�,+��F����0A�hsn6�:.(� ��M��u�����R=�r��t��.��9Ks����@l@��Tr��\���"�T#�a�
��^�)�����"
+��*����o _](ddt�=�
��>9
�8'��*�2@ɰ�]
W��
(�>vrzM���Nf]�s$�Pa�J�N.�̖�o�
^c�A\t5pj�FJ�TE�I���f���¾�fj�狾��|����Gm�O��
~�g��33�Ȓ��щ��#P�aL_0:Mx��ڰ���?�����/He�®�������K^z��vJ첲M��ե��O;XBG�T�wxrlOlα^��ɡg�/f�z���г �FH��<�èX6�^�l?җ3^
-�9������"u��q��Q���C�A���C����v|��Noŋ�J$���f.i�x���5Z�Mg8��~u쎭bG��vm����vՓ�nW
�f��_�Ŕ���Њ���b�F�f=r�C#c�t(0�O���wt(
�bB��0��
B{�ڮ����i�ɤ
�]�
�
UH�h;��a�)�#c��r/k��X1K��}#3E���+�W��=
+��e���{	��!/�2K������*��8�z��/��-��IG��/D���הNC&EH&��L2�>�L����v��8%�ZP�1�ؒ�VˀSB�#p�+��������3A*d��C�
k#�>�2���%�6���V~� ��t��T����y%� �,v
y��:c
�nth�D�A\u���s��-�l"�����=�Y�=��9�)�)J���18�=�(B�:�����#���8��͠z#Ωޒs6�����!�/5=��	��>�s�
��F���N�
����s���9g���p���P�Y}��h�%� ���؜o��Y�9����#�q������\ ,�;㵞؜׼إ�s^}G;G��3P�M;	悵:ӱzR3
�@�/��1�s�1�b"7�ا��Y��h�Ș8�
��J;����&�
��U$��?��t3�Y?vm~�+���@�$�]`�7"��m׳Զ=��֝�ם��J��^
�l���$?��h���D���T
��*��`(�˟�1�
+����K��?��
'��zO�f�z[
�k7�Tׇۛ���g���1�%���aw3��R;C��ު���C��}[��.�E���.�����a�ؔ� �
�endstream
+endobj
+6615 0 obj <<
+/Type /Page
+/Contents 6616 0 R
+/Resources 6614 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6598 0 R
+/Annots [ 6619 0 R 6621 0 R 6623 0 R 6625 0 R 6626 0 R ]
+>> endobj
+6619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 702.2879 240.823 713.1918]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Difference) >>
+>> endobj
+6621 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2748 563.6673 293.9708 574.5713]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+6623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.6427 430.716 229.7369 441.6199]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Affine_Transformation) >>
+>> endobj
+6625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.0888 229.0361 246.7668 239.9401]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Affine_Transformation) >>
+>> endobj
+6626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6617 0 obj <<
+/D [6615 0 R /XYZ 90 757.9346 null]
+>> endobj
+6618 0 obj <<
+/D [6615 0 R /XYZ 90 733.028 null]
+>> endobj
+6236 0 obj <<
+/D [6615 0 R /XYZ 90 625.7525 null]
+>> endobj
+6620 0 obj <<
+/D [6615 0 R /XYZ 90 611.8675 null]
+>> endobj
+6237 0 obj <<
+/D [6615 0 R /XYZ 90 492.8012 null]
+>> endobj
+6622 0 obj <<
+/D [6615 0 R /XYZ 90 478.9162 null]
+>> endobj
+6238 0 obj <<
+/D [6615 0 R /XYZ 90 291.1213 null]
+>> endobj
+6624 0 obj <<
+/D [6615 0 R /XYZ 90 277.2363 null]
+>> endobj
+6239 0 obj <<
+/D [6615 0 R /XYZ 90 89.4414 null]
+>> endobj
+6614 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6629 0 obj <<
+/Length 2640      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s��~ׯ�S
���_�Ƀ�q2��S�V�d4�����
+ at R�_߳��� 
�I:u2	A��\�={��O$

����
%2�����/���7�?N�y:������R,
2����m�A$(�����	!��eJ0���%�IV���K�����&_W����]�U�W�o�b�L���W۬����6��D'yy��&ɈL�`˟���xy�;�}L��.~�/�÷1���	�`D���������x{�]��=h_�A ;���
0@
	�x�@�m��Q}
.��]^�U�-~�����O�2�.v�]��Q�OX�����"{��-B�_5p�c�����1��P�?a�j/�7�|�r����^
+�!H��M�͚b_^�}�{��F�i�6�SV����.b�*D�R�͔"��}Y7�T��*�<��_�r�R����}$��D�HAUx��}-�FT>���>o��)�n��h�ժ��:uhP��R�wh�Tw�
�5��@��M��r�+ʬ�����b��Ka���Y�o
����m6�$8&Hm�N�#?'8"
�J�v�_?l���iب���X��V��׼�φ���;H���#��HI��J!I�۰/ ��J[4K��{��s�
g�׎Y�w�Ѥ��u�*�b��ɝM�����6b^�
z�y�柊f�Vy}��4= �s��k.T/��d
	K/��%�>��̛A�����
m
ܚ��
+��(�]BںJ�9�*��Q� 1"���Qm復��!�L"̤
�{\
+�t��]"����Th�`��|G�Nj�T"���R~?��*X/������OP܂p%��!\%�<�#�i
.D�bګL�:[l�
,K��e�L�L$���Lu4
+�߷x��_k�K�oK�l��j�����
+a�4�I
����
+`�L4):�t(5m���CX�j����h��g��ɫz5�O0��GIԁ�#��ԓ�
C�S����A��CS7f(�����
�&T@p
��jK�q���qW���S^]���G������u��l:����w����Q�����H{��b3 �b�pXf
i���Njj9���r�q_�
�n(k��6y�^~g���%�ɋW�VQ��
�z
��}�<pW=�a�L�5�A
��	�bs�wbNJ_���v;�����B��ny����l:�&Y[w�����p���r#�
�Ph�����9P;��X���9��'�wRS�!�R�
Y
�o��?�C�>h�D����е7
��^��}��]�8,�h�
+J���ζ��vʽ��-����g�;0��
q8�f�~��fXն����̺r8=K�O��@ln];��@
���O>e����הCg���~�����= ��-bT[x����������.O^̨�GwU���&k�z�n��O�vq�d(��ux�
����n`�������:xt�p�����P��0"�@p�j���M�93��l�$�ĉx�b֍�Y�VEi��#t��uVyH�N
;
�Y at z��3�A�t��:p�j�K���14���9
+0�D>vfN��^ԶU���#�$���
�a�`5�,�8���nk��t����p8
��	�z�.`�l��t���"�.Ey����^8�t�IF�W
iMǼ�h
����Z�}�'�}֍&�����q(�
{�	$2��Ab�iP�a�a(8��|��?9����E�y*�sZ����퇥�=���OL��4�$�Ӏ
aq&
�@|s, FT�� 15�@B�̜$a��~3��J9Q��(�>	؉y��H at L���
�\,�����62`�(��
�q��PYx_�?��.��|80��B�be����)%B�d;�t�B�	��2�x<�[_�3�p��
9:a��Խ�	�:*`�}$(�YP~�	�k�3�@5X�L�P�q&�)����s��w��0�
�'������qj���c���O�3x/v�
����N�ƹ��쟌
d��4�h���
���\��
�X�s���?;H
�F�}(6z/v�
���s��q.0���s�ʥ��8��;�
�7�s��q.00���RA`� �����ܺvb�p��{.pb:�����@�{r���$?���#��=�
+�������
��~8�ǁ
+�8�g>S���
+���@���g�j�3@����
���$ϙ��=i�V�+3f��Q&MJ�'���dkg�m����F`���
CTs
7�G�}���#�ై������d)PcFFC���|y��	���Ϡ������S�P5ǟ}��QA���֌+y�5�H���$�r/�5�F�V�����A?B?����s�jO�y�SE)3� a�Xf�<E�u���e6�;�̬g�@�
?B�	m�Z G��)�Nj�^@�Ij�Z<�n�iٛcF���#.���"�tZ&�ER0�I�,���
���G��I�ӲJ�|�EiF
���#?������@
%Ä8`8p"8����K�p�׮㸯��/��y��%Lɾ��3+2O
+X���:4Xp�ъ*��������'{�jes��(���^tW�8ۿ��pCo������7Ms���|zzB75z(��
+�����r������V/�&��s���i`�KϤ��
S�ps���I
ٱ6�� ��endstream
+endobj
+6628 0 obj <<
+/Type /Page
+/Contents 6629 0 R
+/Resources 6627 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6598 0 R
+/Annots [ 6632 0 R 6634 0 R 6636 0 R 6637 0 R ]
+>> endobj
+6632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.79 665.1437 434.2122 678.0615]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [331.4766 375.0767 436.2559 387.9945]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.9555 98.2435 459.2259 110.7228]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6630 0 obj <<
+/D [6628 0 R /XYZ 90 757.9346 null]
+>> endobj
+6631 0 obj <<
+/D [6628 0 R /XYZ 90 733.028 null]
+>> endobj
+6296 0 obj <<
+/D [6628 0 R /XYZ 90 462.7801 null]
+>> endobj
+6633 0 obj <<
+/D [6628 0 R /XYZ 90 448.4659 null]
+>> endobj
+6297 0 obj <<
+/D [6628 0 R /XYZ 90 172.713 null]
+>> endobj
+6635 0 obj <<
+/D [6628 0 R /XYZ 90 158.3988 null]
+>> endobj
+6627 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6640 0 obj <<
+/Length 2732      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��~���S+�x�y�� ��d��$�A[�ET"UJ�w��{�3C��&m��,���s�|sn�Pd���<SB!ø�=l���	�����K����~{u��3���rv��h�	J��v��D�bI0���
��Y����/(�W�O�|Ugw��:�?��|W�Œ
+<�f�������1�D���!M�9��/~�����m��]0I�k����W<[���ˆ-f/�#b
�m�8e�������
w�y`Na��0�2HSF��@�hha�!b-m�L����<L�6?�����N�)R��Y�:8�s���{bT�	�
+)��I�ue����X�Qb���l��46K9�J����:w{���j��>4�����
T������|A�������*�td&
E��F�
����d�����7�O۞e�d�Ӗ�T�r�t	�XnQ�����i{_m���:����l����x�����w��G�ڣ��<T�S}t9��8�J"�F&=�=�5��)%6���A�o�������	��i����H
+f�a�MaĬ��ju�
��q����L���7i�OM{�D�|����}yw��M5jn|�����ŒQ>3���UQ������z������m,8�X��MUCF�ز�'=
�y�w��8��~��ˎ�j
Y��>>�(�6G�A�8؋��@$fЋ�t����{�� $����LJ�Y�h!C��B���Hz)������)J[���M���jg�#�!v��N��
+�<I��M��:��v
!{����x�.\Kc
9ELb��#���	�x���N�.�N&u*&^&��U+��`Y��vQs�ɣ���"V���|���@ý
��=)m���;�Q�e��ódR �4/N�xN�bHh?>۶S�9��l$��y�˼��-�(yt��n��b�=�V��M�����+�<��M�4}�~�7x����▕D���=Jt1N�N(":@�� ����û���U��"!�NsCG;̛�(�Q�i��˼tE�����.	|��t�~S�
�d��u����|]k<�Yq���4~�9��9~ ���dԝ:�1E��_4�
iBZ�
籭�6F�?Z4T)a�hS<H%� )I�1
����7�o ����c>?TCDA����������M��Fa��`?UC5Lp��W�a�
�
��g��@��-
+��:�t )i�L@�’��n��O^�Ǩ����H�_�{Z�sQ�p�Ә���
/90Y($:��K�P�7
�
+�Q2a�6��{xm{CFY�T�(�B6��I�$�9��H
+!�t�
�	e�&��f�֎Ez�0����
�
��d,�B��8:�p�S�NO/�����5�N&�gPd2���
��dx�i��Q����(r��0EN̾E
gk
&w!��IM�.�Ǔf[z�5;̎c����3{!�9�#�)���9r<m�%�=���81�Z�x3�Hy�Hl
+� v	9�6ݒ��ar����
_L����;ǎc����H��\L���ODaϋ�(l�~C�D�D�{�
s�ę?I�O�M�$C�:O�aZs<��:���#{B`�ؑ��
CAS�Y���)�����
+��z���P�Fݼ	y�1�H
+�G�rTH
+�l��r�� ��&"o0��s�>�.a�lS�
�
3 �v
��8���-Sc�a���K�1��4��*/�mQf�j�=�O���Y
�*�I�
d��s
K�j��0d��C��`(����1dk�g�b�

{B*�k���
h�u�Py(�1��dI
UA�U��q�_�
�^럯Λ�8~��c
մ�d�}��껦"�˙�̃vM5v
�e~
�ITBO����	Ī��Đ���0�Jm�qh�����5����e���ʓe��64�eK�mP�y=�
1L�]
��Ly�\ 
+
Q4 �r

+yz�`Oe5�D���!=2B��uEb'��ږ
�┆�7�*[ǡ
Զ��/�AK��	y�-����

+�����Va,"jz뒴��CHG[7:�R;EP==�FB�-e�������Cm׏�6HE3EJF}�Zz+Գ٧�
+���f�D
���O��q���9�����S��D����
��Ŧ�
b�9(=;�H�D1m�
�
w(�M�R�-�%����9���q
!����R�O_J��u�9��M`ڊuF����0�i�A�o��*��Lj�bT��ݫ#���(��g�Ħ
b�ib^Be�л�����U˥l�H�7�2B����*�1�Éo��c�8�Ǣ�O4V�{�	��	�D�	�~�	��;ծ}g�f��#�S��(���)���a������b��ݴ�K�w4�H-/>32>~]/F�/���3�IDNg&=g��Lg�3A�LRBa���1b��x1vlѹ�U�N��
�QC���b�U����H
��}5������J�4g$捍�6��3�5?!5����u���p�?u��� �6���݃��S�p�UV��U�~�=t�i�@B��c�+�Ef�����<�1W�������_�6?'�0����.��ON$
󽭰�D�
Gb�?s~���_B�=����c��6���*�[��U
��*WF��!�Qt��3*�����g��qZl��2z��֘d��څ��������
zأcY�jT
�w��u��bl��vo�
+�|I��P���:�}׵�B
%|�m�^
��9��� ,��endstream
+endobj
+6639 0 obj <<
+/Type /Page
+/Contents 6640 0 R
+/Resources 6638 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6598 0 R
+/Annots [ 6643 0 R 6645 0 R 6646 0 R ]
+>> endobj
+6643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.7728 516.9089 462.606 529.3882]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+6645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 271.8929 422.9245 286.6083]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+6646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6641 0 obj <<
+/D [6639 0 R /XYZ 90 757.9346 null]
+>> endobj
+6298 0 obj <<
+/D [6639 0 R /XYZ 90 591.5801 null]
+>> endobj
+6642 0 obj <<
+/D [6639 0 R /XYZ 90 577.0643 null]
+>> endobj
+6299 0 obj <<
+/D [6639 0 R /XYZ 90 347.8428 null]
+>> endobj
+6644 0 obj <<
+/D [6639 0 R /XYZ 90 333.3269 null]
+>> endobj
+6300 0 obj <<
+/D [6639 0 R /XYZ 90 89.4414 null]
+>> endobj
+6638 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6649 0 obj <<
+/Length 2841      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�6~ϯ�Ӯ
T
�"�؇٢-Н.f�t_��P%jˮ,O���{H�2)Q�;��-�X������\(���,4^�"G�q���^�����t�3x�������Z��FZR��}�#H�%tq��ӒD�*#���ˢ��+�����s�����]S4�77�4��*�/������}�X6+��e}_�H���B�~�����
\�]0I
�߮~�/
`�^aĴ����hM�+N���\�p��~
����2� �P���dĐĝ!>C��\���,77w�c�P>��ǟ1�u��;�T��t#����JS�*�6�1���:��\!����h��	E 
Q�I|��$a��]}h��"c�"*a�
&�� V�}U�E������P��U�]�%�C��J6w�Ҽ8��0Қ�0�������%,G�P�
x�V�P.
(�rWZ��Weݮۦ���͍��Μy��HQ�{�}����<�ƍ��>��CY�U]��<!V�"���GS�H�3�+�zW��Q�?I�=&H�'!��I(�X�$�I�HRέ�;0�Sm�-V�v�^���!.$�G�,����/�>W�*@(�P��~?`��=& HX؜�
 �K x���}v��/�[���\	���1
+�#&�
�G�S'�}�<�|�`�'�5
����á)
W�Ѕ���)7Ekv� $�
I)��)�Rch�&�9Sn�s�ZE`0�
�����mO�I!dgڵG7R�;���1n�Њ�*�J/�	�ъ�t\��!�p��${�@�Xw��w3��	�lR�6���cBtJ��T�.E�H�Y|%��39�`r�r
J"�&�	�		7�@�7�\ƱY9_#��c��*�0柱���2�d끩���#fᐣ��J�X.�/�y�#06	�
g���}�e(U4���PJ�
����!"+�4v�D�-۲9�
�ôQ��wS F at z�1�8��
��t/d�z�����Rc�����`C��[
�ɳ��|.d�
�E[vI�ݫ��z�-�
O��6#G�<��8�/�3�dE�j�P�ż�Nh�86��0��BŽ��llb/!�����^�1U�4e�rE�f䒴i�
+
;H
+zƦ�،M{�A���܋�R�Q�ƪV��� �F�/��q�s��X��9/
��,��yj�^Gc�����X}lU)�� dD�U!����m���&�pGجУ����6o����-��yZ+-�y
/��g��j&\>��W�M���.xǨ[w��'��ģ���
ims�|���N��đ���ǙPj:���K����˽��L�I)�s�!�	��bơ�ڸ�W
�Rl*���ΌCPZ�"@v4k�^j
&N�1'�����ƹ��@�)��Tma���Se^�FB-��/s�
����5��q�IE���b�����QMO%6%
�"1$Ոs�R�s<$8
+g$�"-N����g�l�H�x�|Ny�����v�C�a�hV�@{�}f��8iIbJ*H,�]��K nJ��ZY��u��p��~��c�����/W��)�D�� �2Y��k��ȸ}%��&��lj(ׅ���
m�v��<� S�&M���¾&&��E�j_��"���lо0�8پ�,S������]O�>+0~zl� �G�9�opr�Qq����g�
	���ֶ��:�@���!���Rg�3�
�X�]پ�e�Xc�x��N�
��b>�&��
�A
��2�l��̱q?1����l�BarqhN����C
���>-.����H�Q9D���

'�~�=�=���(��,|%��jb�����^����O����/Պ�
�'u3R@��ґ:�2I�
쁕<��o�۔�S;1�
�ڀ(SIBj9�K���{�O���D�Ҿ��~|�>1J
������Bi=��AJ� ��tW�!�a�2:}�b\� e�A��J),2c�����Q�x�'��pT���6��R9�
*�/�d�f����$�9܊P�*��T��g�jr���
T��
��
�5<�r_�B��������d�3
DM���p��t�c� F��C]���87B�t�Xo�H9�/�ra~���Xi�� ��R�X�;��t�}.ڮ�·�f�$��M91D��]�3Ϻ-��wK�:}���[��eD�s��E�P�Pe���ͭ�;�}��1�V/5�:hV�s!c��LVb*�}�"|��Uuk���Ȟ!�͢태�;hr��C�k\� �]qw���Ώh�
3���n�js���j�Wik!3�܁�;���� @^��h�J������~�: [...]
+f�ٹb!���R��@�;ۺ�ZH)��~C�ϋ}Z�0k�S�0�."0�
����jAȥ5�SY�#��߇}� �޽�̥�� -��^x�z��j�����o���Q�`��]��
4�
+�+���ș�Gs]�ٮV'��/��Z�qO5��2Y30�d�1�a��	���p��$�0���2go�B�%��ir��d0��7�����S����\��A���.��u&�pݝ^Z6$�τ�!�t��R�5���O%�Pc�b5��
/�FB�dv�M�*�������6�Q�|It} ��
���]���.���.~<��_W�zw�]Q������P���)���iߔ4wɤ=���L�c��$��{�����gؑ�^Ȃ7ܮ
?��k&�ܶ���뗗t@Ǻ�7�j��4�
}��1��nf��^h�%2?�
*s�",���o��9RU�ͭ��g�G��x
����endstream
+endobj
+6648 0 obj <<
+/Type /Page
+/Contents 6649 0 R
+/Resources 6647 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6598 0 R
+/Annots [ 6652 0 R 6654 0 R 6656 0 R 6657 0 R 6659 0 R 6660 0 R ]
+>> endobj
+6652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 677.0988 425.662 691.8143]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+6654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 448.6794 322.4458 459.5833]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Time_Elapse) >>
+>> endobj
+6656 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.3898 334.3833 343.1979 345.2872]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6657 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 252.7869 268.3399 263.6908]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >>
+>> endobj
+6659 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [276.7777 138.4908 336.8843 149.3947]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6650 0 obj <<
+/D [6648 0 R /XYZ 90 757.9346 null]
+>> endobj
+6651 0 obj <<
+/D [6648 0 R /XYZ 90 733.028 null]
+>> endobj
+6301 0 obj <<
+/D [6648 0 R /XYZ 90 499.2433 null]
+>> endobj
+6653 0 obj <<
+/D [6648 0 R /XYZ 90 484.9244 null]
+>> endobj
+6302 0 obj <<
+/D [6648 0 R /XYZ 90 396.9023 null]
+>> endobj
+6655 0 obj <<
+/D [6648 0 R /XYZ 90 382.5835 null]
+>> endobj
+6303 0 obj <<
+/D [6648 0 R /XYZ 90 201.0098 null]
+>> endobj
+6658 0 obj <<
+/D [6648 0 R /XYZ 90 186.691 null]
+>> endobj
+6647 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F7 574 0 R /F8 568 0 R /F13 577 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6663 0 obj <<
+/Length 2373      
+/Filter /FlateDecode
+>>
+stream
+x��Z[��~�_��b���C$A�m��N��`��5c!��H��N}EJ"%Z��4-��;u�����>Yd��Yh�PB!͸\lWx���^�x
�׾��n����b���T.n�$A������$Q�Z������eZ
һ�+�����.ۖ�ݫ��L�盛o�|�ZS��_�Ӫ��?dY�"�2+6�$�K*���﮾���9�Ib��v��/x��=|w�ӉX<�
FDk�8\q�ڛ�՛�u��̈́�	8��J�,֌�D���)F)��2�������E�B�0��Č���ps��%g
���Vj�UP_+ňs!C�_`p"��S��to���t̋�yT�`�D�E�?�֎�]Q盧���>��c���q�s���p߮x|p+��
��~����q������X`
B,�3;v�, �|�e��
l�$B� -����t�?[0�U���	AR�4�����yT>:�|k��kB�ڣu
��|�
����9`������L�
|���AE�F	3
��f����6�"�휁�	�I�$Q
)R��(�Vh�K�sF��
�y	�
���m�����A��"Q�B�DP�C�30�z{s�+ޙ���]Z>�YQ�@�N��i�tRc0��`�$�� ��<�y*����7Է&��I�A���3X�
+I�
�PX�z�WVf�!�c�d�bY�H�(�2ϑEHH	m)3
|��	+8�u^l��SZ���i�wq
�G�2���/+l�]myk��ؔ�^Vinn���by�̵)fnWۥ\M����a�G)Z �GPQZS�Zs���9>eΛ��/P
!��h����Z at 9�� 	�5r�	"R� ���W��Nh�Y�J��Y�EXiH=D!I!�4e��m�f�ؖ9���>���r:ˬ:�k{ݔ�k��\OU�t1�Sh�$3ՠ�_�"�=Z׀�;��.
�0�3���Njc%\$!���~�l	

�Cv�I*i��h���9D�LX�|�e��x
�~��;��x��iF(v.C�{���6����
�"+Ӻ����:;����)+���c������
=
�
�W�2�_7��a�v����1�k.\�����řM�i�
�
�"?��ζk:4�29]�=��]0
ޕ�M���
2�''�zD�DQ���V�󨰹��0�Ln�i
�=�>
_��Kk��.��]Z[�V� �2����p��X�݆�}�&��Nsۊ�� �r��P�� n�A��/�O
���(�9BOl�
[��4���H#�q�h��"9*�5C�q�b��O��H��GR��E�4���H���H�'�d��S_�rB�fa�
��"ŔO��E<;��H��)�L�"`��H#�$�I2�R���f�ζw}Kt�����tܧ��Z��Z|&;�{���) �A�n�^��W=�7M_uY�6pKm
��6 s	�M�6C��d���)FI�y��͉����>�����'��o�M���+KJ�T
+��c�
�f%�ZW�3������)�$�so�Z�/�
�U=�0.2,ΐҜ
�
V+5�q���%!
+�;���F���l�x�N���B̊�c����1��l8�S�bξ"r'P�m`�����
:� ��X�]�K�Ϩ`
�9m������}��\4�Q���q����K��ҋ*
4?\Od_�rAf��0Eދ�� L��xQ�ĦI���{�3R�9��ϕ�0�X�fx�/6u�����Z�N�}���Vj�v at t����jo�譼Rڿ<+�4����!�� %4��b��i)�TΘ��0m'6C!��vr�5N!�PHG��2?�*�b
+�O�����GR��E
+9��������Vb^nNV,_�r�Lq)��)�
+�!�
�؊}���HO!G`�2 �;SȠ�|1��<�|
�ĀӅ��cx(J!���y�
�P��?ՙ~x���x��v/��dV�ȋp�i2ʠǗl���O�E���dTϓQ�/6�g�(5�[�t8f�К�
+g.Z6j�M�

z?՘ۀ�'
� ������P��ړ��᪽
Y�0<��̐��B3Lg�1	 �� 1T���t�\ytԚ��QKB�[1�Q�塒"A�g�C	t���tU��.Wu��н���R
0Q�GH╽�桓��y�Hi��J?W
jx'|�+yR��J͑�I�

�SP_����j���*�~�
�q?M|���2{��30	�`������ٓi��m���޺����Xe�WX���GZ�S�M�d�SV��$
T|*3�,#Y3�%o���1���OHh%���E{�����MX{3lBSޖG뚍���ts}���6:��Dy}
\�z��C��P��No�	����3R�$���|�a>�8�U(7��Д�Q�74$�?ѿ��endstream
+endobj
+6662 0 obj <<
+/Type /Page
+/Contents 6663 0 R
+/Resources 6661 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6675 0 R
+/Annots [ 6665 0 R 6667 0 R 6668 0 R 6670 0 R 6671 0 R 6673 0 R 6674 0 R ]
+>> endobj
+6665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 707.9571 268.3399 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >>
+>> endobj
+6667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 591.1287 334.3515 602.0326]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 490.2816 268.3399 501.1855]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >>
+>> endobj
+6670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.7108 373.4531 344.7903 384.3571]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 274.3843 268.3399 285.2882]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >>
+>> endobj
+6673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.628 157.5559 360.6294 168.4598]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6664 0 obj <<
+/D [6662 0 R /XYZ 90 757.9346 null]
+>> endobj
+6304 0 obj <<
+/D [6662 0 R /XYZ 90 653.8568 null]
+>> endobj
+6666 0 obj <<
+/D [6662 0 R /XYZ 90 639.3288 null]
+>> endobj
+6305 0 obj <<
+/D [6662 0 R /XYZ 90 436.1813 null]
+>> endobj
+6669 0 obj <<
+/D [6662 0 R /XYZ 90 421.6533 null]
+>> endobj
+6306 0 obj <<
+/D [6662 0 R /XYZ 90 220.284 null]
+>> endobj
+6672 0 obj <<
+/D [6662 0 R /XYZ 90 205.756 null]
+>> endobj
+6661 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6678 0 obj <<
+/Length 2620      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s�6~����V��`�	��ٝ��mv'��OmGCK�ŭD�$���{@�0 at B�Ӵo��D$���9��,0�#
��Ȑf\.6�
�����.�{�������R,4Ғ���]?�$HPB7۟�� J/Wc�|{I�2o���%��z��+�M�~S�6y�x}�]Sn/WT��?�y���w�]�\�,�M3IF䒊���/����
w�$1�~����������i%p�њ.���f���~
��!�N0�2S��HIx=�"���Q
+�
a)�W��u���0��0���8^
!q��"�n*u at M�
+J�q.d,�U
+'bY������c]V
���v0w�SՖ�U���.� �����ۮn���>�vn�:
n��;7��;A����5NST�����$��c��ˇ]Q��R��Q�BXȌ���%^eȌu��^��5�:6��{�yj{���ڞ�k�<�ۢ�t
�n�=�x��1����<�VTj���ն�珎H��U�o�tNИ��-��HJŒ\�*DMc��cs)@Q�
�ɷ7E����Pvs���s[�$X����m���.�Kޙ���:o�O���&��+6��������
�#27��6[䡲&*�
���4�&��I�A�y�g�p�
i,,�ە���
�s���Y
S(G�:@^ms�T#�I!�D+5L�v���Ђ���jS�yWB�@NF���ԞA8�e
+"��M������� �������}y(�b�.>vM~���q�5�/��f��Zp���k�������!�`%c�F�mP�B��� �
�Y
��>���}s2)t���튃
N1 ��L{�ܷ	�!�<�� ��d��I��TS���f�g���
8�	��� O8������7o�X�f�� 	�[Qf`T�B3Jܦ�
��!�|0�&)1�\4E{�w��Ol��$T )BK�0#��_��D��j��
+x�|3�*ܡ�#6�2��!AG�똄ٜ���������mm���n66
�J�[�Ӎw\��J�bmL��>;
+���w�]�Le"J���*W9�"K��-�,-\qz�2d��?�E_,���NgB ���sљ�$:n|6?
N���<�����,
��L�bc~(�6���	�3	z�#�����q�LaR�.܃&�
[�@�I|e�{�[�ޏz�d<�����#
Nm�2"A\i�@�΋�廼�w
>r$� ��gg�o�[�ŽfL͵;ƄlΆ,ح�XثZ����5;�w�W�؛a׶AB�ö�Av`�u}���'�Q(������BbS�L��6�ͩv�=�I�K���Dj����~�$]�ǡ�ט�w��
3���}f'�;�Iγ�d��;I��Ḑ�u>W�
PD�w�)�3[q�"�=�u��y�$'dҝdD�K'��t�j�I
+��K[�|�]��
z4Ϩ]�b���~��<
+E&�y�{<��
+�V�Ay�IJ�_VϴD
+ZL��
ѫ�M�㮎�$N�9�*z_t��(`d������^�(����6+�&�d��2K �l|bPB����)D��O
ji�Y�j���5a��Q
�-��fW�T-L����H���|6갱

�l�����6˞izBԌ�\h��D��=c�	���<�'�}Q�w�u�4�c2��J�+£�$FE�"��D�@�4	����C�QH� Ĺ?�J����� �!.#�a����x��Z��{
.�m
��{��uAvE�9dS��4/{�p�c!�P
���s�ހ_�/X'��?���]�q�%L�vT���_Ǽ�u�M��I|<�?w�7�0��q�kN[���-����T t��9\�l]o���Qa���~W�ǜ0ZV[kK>�Zd� D�l񵹤P����{ǽ��Ad�@`.g`{:��#������u$����[B�y�<�t�*�֧��l�⃍"F���vp����F��T���P���ońX�6�l`W
e�v9,T�(��Ҋa
a)o��<
��]S�x��
�i9q$&��d�>� XI(B(�`��B�E�PI�s�.
	���M%C��t��ҵ�&BM�D�����0|]�)���fkG���Q�l�
+�P폁
����ujp�����o���}��
+WP��PVJ0W�l�jr����.��E��2�f���ʏߘO��8���&[�>�����4����
��
�>��$�����U KY\#��	�9��P��/C�Ad�	>������P&��x�拌I��4Ξ�)��t2#LL��L�+�e�7	7ʐ�P(��AHb
)(�"/�N�Cl%��g�9��vHO�!����v���=H�?H�_���"�=�S����m=
cVu�P�K���nIC������ t�'�t�X|R��?S��y���5�(�-��OKL�I���.��j�4^@#*K
1�E_����k��OƤ
���S�
HD�|k��	w;D	{�B����-��.�nqk�w^�r�m��Mk?@� P�Ǧ��=�\1����
ה�Z@`��d����~J��U��P�?-y2�Y����WWhӢSU
TvW���j̋c�4�؜�V
4����.�Ĺ��ݰ��pFV�/���#�ď�1d���#���endstream
+endobj
+6677 0 obj <<
+/Type /Page
+/Contents 6678 0 R
+/Resources 6676 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6675 0 R
+/Annots [ 6680 0 R 6682 0 R 6683 0 R 6685 0 R 6687 0 R ]
+>> endobj
+6680 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 707.9571 268.3399 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >>
+>> endobj
+6682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.9698 593.15 252.6748 604.054]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening) >>
+>> endobj
+6683 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 495.7503 268.3399 506.6542]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >>
+>> endobj
+6685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 284.6523 300.1613 294.9336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >>
+>> endobj
+6687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6679 0 obj <<
+/D [6677 0 R /XYZ 90 757.9346 null]
+>> endobj
+6351 0 obj <<
+/D [6677 0 R /XYZ 90 655.7113 null]
+>> endobj
+6681 0 obj <<
+/D [6677 0 R /XYZ 90 641.3502 null]
+>> endobj
+6352 0 obj <<
+/D [6677 0 R /XYZ 90 443.5045 null]
+>> endobj
+6684 0 obj <<
+/D [6677 0 R /XYZ 90 429.1434 null]
+>> endobj
+6353 0 obj <<
+/D [6677 0 R /XYZ 90 195.7022 null]
+>> endobj
+6686 0 obj <<
+/D [6677 0 R /XYZ 90 181.3411 null]
+>> endobj
+6676 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F74 482 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6690 0 obj <<
+/Length 2832      
+/Filter /FlateDecode
+>>
+stream
+xڭZm����~�B�Z	����r)
+�E$M׾�m<�wb#�
+�����;�ݥ��R���0�/������<�Y`�G/�P�0.��
^<��n��������n^}/�� #�\�=t$A���۽[�(]�	�x�zE�2�������eux��:��\��Y�r{�C]�Vk*����i���!�WD/�r��&Ɉ\R�W�~����
&����ͻx��5�t�3Z,��#b
]
o8e��p���߽
���2��|M�b-RT�����ZX"��*i-m�L-��;�}�i��ڢ*���	�H1JC�a�	�^z�¨
+�R���V
�iw����|l�����zFi@�u�D���tBSd
&1��}]��X>�
R.��7����"�ע(✁��G'M�\P/P�v��9e6���8�ec}`��n�tع������_|\�̷-j�����܊�w���a
q�!�`�!ܖ���!Ʉ^H���}U?z�7���z8�Ea�����v٧M��M�=��10j
���B����3�e� g/��
+*�|keN�丷><�|	������D����lj�h�˿ʝ�x��M������y
:�6�,!�}c/��y_l�~���gu�m���
��t����|��?�K��Gw]=��۪|��l�l������hhY]d�� ^?��_� ��zz
�����
+�j/�9�v���Ίr�&�ݶ��7�=eo����՚a�����Y���6�ev�d���t/�q���{����#�	.%�a�� F��I�gVz�
C��!�
��j
d�8	���(��!AU�ž�N�&ҐDZ��z ��;��'7w
°�w��-a��6�Pil�:o��+�~�D�\�mD�9�C-��C��`����`'��)qSCڗF{9���P'hR<��O���.��L.���%)C���Pl{��j�!>u�%���(�`=Ky� �
���65�B�I��	
�Ax��ǔ���x�A�e�`�;�9��@L��AYŒ�.���[G���&NQT�X�@�����s�
�pr;��f����3�D
)�I�Ǯr^�Y���6k��o����nM�%5w{�r#ZŤ� ��Kb��3>qE�(�
8�E��w�n��`y�
�r�
T�T�=�_���e� �
�^&��
|�a���:HgWxI�_�(�X�p�M�"Q&�����H���2�`$ �vjl���F|���ۖ���CI�U��K+�7>F�_m��>��2���QU��±��UC7#`�
q��Jͷ<��gX~f�C��ϵ<$�"���b_��\�Ĺ噀H�<�a�ô�Z
�}�a��{ړp/�:{��
�}�D'S9�A��=��E�}Љ�7�X�ٵ=����^d��K{!�G��g� 5��Ɖ��
�#hL�J�����
�i=b�s�;�8VV�S���a�03}��@hݓ_V��D�6oSL<U���V��|Sw���]�
� �4�R�l�bqE{)�I)
<���)��`i�kod���8&�ͅ�гi6�M��r�Jͧ9��
+���
s��.���
�n�$��z���� I��!��Ez�)�8�) ����]��ܳ*W_�=
O��a�� ~�D���ˊ��7HCt�
A���҂6*����/���mUC�v�J�:�7�
�L� :�����Z=������g���]�S�_
+�1���b}������P�6Y���k'� �K��Ez�)���؞��u&:�]�O0y��?�\*���#~�"�.�mu<���߽{.ڽ��J��;o*�	p�}L�8�fwj/�vS�W�*rE�З��K]�9�F�� �n��\��
+\ąjq�ο�:N(�rZh?�!��<(��
��K>�D脉��WP��h��2�Ѱ���ش/�<�<�
(-YD���h�q@�%Wa
+2�h6C9��Iw�[��1�n�p��DL1���^5UP���Q�LΥw+�pB��t�&M�0D%�}��7�_�m$D��M;[0(��"gz�`
��
�)�~A[���B���H�^����9�	�t���D��`ĵ X8�{��Re|�)!ò ��
�LΤ�]?��]��J��p��D`$l���*Ɛ!�_J�BP2�\
+d>���t�E&�!! �=u��%1	�
+ס��TV���+Lȥm�
6�?�۶�_�
�1<��kb��4#�眲�\����R �`_!��D+9=�L.i���_��:=������zHlB��� �(PP?��<�
+	�ɤ��N͈7�W�H͵����[`�SN�����1��0	�Q\cC��z8`��z;;��
xt$�1�`i��z�k@&چkM�dPqL�+=�P�X����K����]T
�o&ܝ�P����xb^���y3�!�TW�Uʘ�8�������u��<�D
�?ڳB����jmoY�� ��s>������K�v��$�:�A���*�#���� �
 Uϖc'AGi��@Q�J)#/l�0a����x��q���+��	3¾��ЙFthP��
�������mpxt8�r�%a�k;���2s���0H��
/��rȯ��V��4�vԛa�:�
��N�^�mek��
����
+�n������w��e�Sȳ�H�JQ��
P�����6��|z��D��J��p����R�
�G��%O�څ���t�����3�6�,N5*�W���դs���%�{�	���
���)u��!��cU�a
���I
Y����N���endstream
+endobj
+6689 0 obj <<
+/Type /Page
+/Contents 6690 0 R
+/Resources 6688 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6675 0 R
+/Annots [ 6692 0 R 6694 0 R 6695 0 R 6697 0 R 6698 0 R 6701 0 R 6702 0 R ]
+>> endobj
+6692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 691.723 300.1613 702.0043]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >>
+>> endobj
+6694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 550.8323 236.6587 561.7362]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Concatenate) >>
+>> endobj
+6695 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 495.5199 256.1568 505.4176]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >>
+>> endobj
+6697 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 383.0001 250.8953 412.0659]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6698 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 339.0202 483.2121 369.9889]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6701 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.3762 133.4922 385.5187 144.3962]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Map_Space_Dimensions) >>
+>> endobj
+6702 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6691 0 obj <<
+/D [6689 0 R /XYZ 90 757.9346 null]
+>> endobj
+6354 0 obj <<
+/D [6689 0 R /XYZ 90 603.512 null]
+>> endobj
+6693 0 obj <<
+/D [6689 0 R /XYZ 90 589.2341 null]
+>> endobj
+6355 0 obj <<
+/D [6689 0 R /XYZ 90 488.1779 null]
+>> endobj
+6696 0 obj <<
+/D [6689 0 R /XYZ 90 473.9 null]
+>> endobj
+6356 0 obj <<
+/D [6689 0 R /XYZ 90 320.5699 null]
+>> endobj
+6699 0 obj <<
+/D [6689 0 R /XYZ 90 306.292 null]
+>> endobj
+6357 0 obj <<
+/D [6689 0 R /XYZ 90 195.9703 null]
+>> endobj
+6700 0 obj <<
+/D [6689 0 R /XYZ 90 181.6924 null]
+>> endobj
+6688 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6705 0 obj <<
+/Length 2911      
+/Filter /FlateDecode
+>>
+stream
+xڭZ[���~�_�'bWpo��=T�!�R��	/@�4�<#�%G�w�����R[�e)jqK::}�\�s����B�E&2�����/���7w�=^������wヨb���T.
�=I���.
v?-	A���c�|�"x�7�|�~E�>�>�&�|W>6y�z�MS�Vk*���C޶v�}�/�Qˢ��I2"�T��/��}��s�
&��w?��;8÷w1���.0"Z���S�/w?��'��R*�����F�2��Ra�2�V�"��Ra̲EF%���^eNM��芦���`�2F�b��
0$PO%��@�3�&.\�(����N``_“�_�uD�m
n�$�Z�xۇ�����7]�셑�+��^��b[�_���^w��]�ve�"b�jo�{�[��g�n���屨Z��1��N�5�Y�#q��x:䝻�^|���ʺ�:�xn;w��6T�]1�x_����K8
���޵h�{�WRĩ���N8��N.�t�Io��Ԕ_��C?�5�]B�>��޽n���>�e�3��|[WpFtd�5u|��l���T�%�Cd=j@��t]s.<�S&�rD%X��l�W;���ë]�G��͢)NM�UW8��[���[�
+N�����v�u`��&JT��W 
dYvnw�����KЯ��0�U�	��V��jW��1���Q,Z�E&{Ǜ*Jj�a!�f�3U�i�N���2�i��Sc��������C�@�{,�u��[5��9��p~��b��h� �E|�X�����	�|����h cN� ����a��KB�R�pI�4�������"F�K�;Ws�q�Qi�`8��U~	D��b\�
	��3H�̑Dn��Sac����)�?�<VIf����h/>��s��ή��'�n=�q�Tse�=�o.�Q � �_	<�	D2�M�t��~

F~�o�Q	UA
��۷C���e�c��J
e�u� 
j
�F��������1?��)g)?������_���|W8RB��
���)s�`����
ֈs
+F�(K1L
&�C�Il
+8�I�w�-�+
�q}mׁ���u
+�$C��g��
l����
������d �ު�>��X!CY�!���C�j9�	�p��%c�("�
�b���pr������
�T�y,��&͕ ͠F�#]@�W>U �L
�fRA��1 ��tE����b3c2�ɍL$�E�i{�P��� k��G�2A��Ԙ�h17D�% ߈��#\�j6p�H*�
�>?�)E0�y(���ó ל��
�
�z�5tu���
#���
+U
+�8��E��
��`xy.�"
PLk2�\!��a��ݐ��+Ո-��]�LZ#�u;m���Kw�
t�JB���I
+:�	@��k8���R`G�@��І���@���Յۤ�ݮp�z���ϥ쟠�K�=����S/�mS>�
�t
�A>B����͓{��h�2$�v�C^�}�k��ͻ릅�|
+�3�ȍ�GbR�#!�baG%B��!蔛�E����ǚpϒ���e\�L�s3��
��X�0��m�t_�~
��μ� �}��q�)�)�ǃ��h±��P�}ț��4P�N(,���h�
tt\*���^�������uB-�h��)�Hv7�h�H��Z��8��O}$}-5Qq�k� ��jwA�T�g��
*�;73z
J�Z��� ə��
����
��Sd1�#I���HB��h.�
mާ��09��T�mG]�)(���}�$S�����[�ē��*�C	�V쾸�f��
3�>�E��9�z�ѦJPÍM=�tӑr1�
RW�iPnu>>M
kN!mZ]�>̯�	��DX���]��Hp
�_��-N�4�z0$��1�X���<U�
;@|��
�2?��M�<�����D�0Aج2�D�8�a-
���<<7v�S�ͭ
솆"�s�;(�Qac�J�8�bw�?��C�-(� L�q6$���'
�;�S��)�fZ��
�(
��Bx��q�)
+�I,Dd7)����w=�Mm�Q�^�fS',|�
+?��
a�d�+�������>����QZ��"�\̭��-
	�e�sW��X�ZQ2U��l��b�\�(_�z�� 
s�����ʴ�,*U�F )�k\�:��0q��y�z�Ğ�e��f��	�t(�0KE��c����ɾ]QM/�l�{��22֨C�Y�g:D�ǵ
�\0��Nr�����`��ߦs (ŵ�'6����Ѧ����y
� �OQ�oISb��1�F� �g[��A�i$�r����㑵iQ/G��g��J�k��g��8�Тq�%,nD��^��:�i�pd�1
H�
�@�el$��=խ� 
 L�}����r"���\��J	�&

�
cazy�]��q����1��mf��_A"J��?w#��|xܛo,��ɖ�)���
�ɟ zByv�'
+X����2��x�KĄ�¨䔂a���;=��)��C��q��0S�Q'����E�g:�X��
+w���8{$ .6��fߋxpA8:��z&���Yޚ�@��R�
������iU��\�����ܾ��t4ejdL(p�!w8m
4�9�6
��*
���aT��Uh L%�|_6 �ޗ-B9C>jP��~��ˑ��=�5ߋ�P�+�f��&��¤		Z��B34.,Arn������
+��8�F�W`�aPEr�Z at 39��@tcw��M]1ܽ~�Z����5W6��H��E_''�Qxї��>���R���ci	՘��n?"�	����u��=R�K���m��e%��
��yu���v�\
+.���f�{
!�C1�����"-٧�-��_��փ7|�u9�o_7w���ݻ���mѹ*O
*�w����X.�!�R��f��DY"�s �A
ʲ���c���o�y�;�5�P
3�I��~mJ4endstream
+endobj
+6704 0 obj <<
+/Type /Page
+/Contents 6705 0 R
+/Resources 6703 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6675 0 R
+/Annots [ 6707 0 R 6709 0 R 6710 0 R 6712 0 R 6713 0 R ]
+>> endobj
+6707 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 429.966 239.8565 440.8699]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Map_Space_Dimensions) >>
+>> endobj
+6709 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 235.6732 300.1613 245.9544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >>
+>> endobj
+6710 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 195.5083 182.1636 206.4122]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Expand_Space_Dimension) >>
+>> endobj
+6712 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 90.0327 241.6898 119.0985]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6713 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6706 0 obj <<
+/D [6704 0 R /XYZ 90 757.9346 null]
+>> endobj
+6358 0 obj <<
+/D [6704 0 R /XYZ 244.4393 433.1191 null]
+>> endobj
+6708 0 obj <<
+/D [6704 0 R /XYZ 90 416.3919 null]
+>> endobj
+6359 0 obj <<
+/D [6704 0 R /XYZ 400.6899 198.6614 null]
+>> endobj
+6711 0 obj <<
+/D [6704 0 R /XYZ 90 181.9343 null]
+>> endobj
+6703 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F8 568 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6716 0 obj <<
+/Length 2649      
+/Filter /FlateDecode
+>>
+stream
+x��Z�s������MgZr�<���:�I�8����j���h ѐ @�Կ�{�;�D�v�/
��x,v�v�:��0����3%2���j�gWp���o/��rH����WR�
2������ 	�����ݜD�bI0���
��Y��.^/(�W��m����?�uVߝ�}W�o�-~����6_,���ovYӸ�7�&�D��rw	apL%^�?�����^U��$���t��=��aEߟ`Č�8��Cg�NY8ٝ�=�{����
H���Tz�d
i	����H1J�x�!,�g��x+���̚�CV�WG(F�
	�b�T��C�T ���Şo���XPn+��]w��WU]�͡*�Ey����n=Ms�V�����eSTe �ZGS4�C@�7mQf����j3��T� �
�#Fci�0�j&�B\��O Z����à�*"
���]�+�9�8�y�$�?�
��"���̪Ѵ볳�\p
0�A�d��5X��(e4����-�SM��C1C��q�����,Vn�y̰y��Z���Ckr�ln�������Z92�pO�n&
M��B���
�E��CmY��j tt���n�v�F��A����4�47���
����2,^���$f
��z@
+$�0��V}�i�D����R�;�ku���G�XI��ƪ����) w�����������%䋲͊2_�S1�Nݠ�PT�ϫ�����:<3��"2�Ӣda5�z�TNZ;�a'n�'5d:��s:FJ�!Ğ���R*�fi�l���QH�/AF�N
\*PV�����Pq#��@H`��S�f�X|�`��+�=�6늱�7
2�i
���|� ����
I��L��%Ȅ{a9�A�F̠\1	90[RC�_9B=�A����	���Y/tj
����Qf�mT_��e�>ԈcIzR��]�m�t�
Y��㈚(��g
y�n��l#�w
Ȇ]E�ݽ�o�}v[���zҔݝ�1s�W���m�����^���v��+	\c
�~J%$�r��'�sM�AG`e";�yY�NIo�}���k��T.��-��:X�<;��R�6�m�&�5\���
�ƷŖ�q�=V�ߑw�d���ߤ�s�q�iNqVO
+א��^
�*,?Rc{���i����P��Ɋď��
�Ӌ0a�]�e�_����r���B�8���+`��K۷Xn}d�{�"�&!L#"�
+SW�lGCJ��d�u
�4흝A��^���W�,0�w��i�av��_ϻ��AE~�X��']���c�o���.�L��F���W�jT�m�:��	�@���Y�
�,.�D�0�����Q��d�\��	PId�h:k������Q&��Ms���f)�	k����.  ���/������E��d�"JU��E=����KL � v�5
6}a,Sq�}P����\{�}]��>�.ks��\����P��΍�:=�7d�/Ცv�Q7W�]i�&Cݩ�8w���x������#(Z�_ZBN�?���
�笻${N�#)�%F(Lb���6�u��O%L���8tB�'�
+C
0�����q�)6>��V���
%�}����B�������+����8M��j�GÚ��a(�EW�ϼ�/ǥk4�%6g���)���� ެɛ#��e�����h<S(�l���Qc��u�|�N%�

x*� �C��署�m�f�mQ�(#0��|�P
o�	���il+hVt?4	�
|,�G��������1��Q�
�@�`���������pݎ�-�/�8��Eۍ6�t-�@41�m�
B-$�B�ɾ#J����Ԇ�LW,(	��q����Z�	�5�As	���<�����^�d��\"�|���u���C{�,d�w�

��<��	�?��
Є9��x���s8�\��M&����:��5��t��,���� N���������t/�`��*�"l��iig�T���M~�L1=����� )�7E�����vh��;Wu�at4��>���9_��CV߷A�>���M*S�!e�!ك�Я��fHi�p���
�O��(H�
&�guC?{3D?O3�� �����J�;��!��n�	�ГP�^HX�+���0X}�
�
2FԼ�������6
y*:����/���T�Ç�P&Ν�hRz,9 � �f��!_��R�.�������b����1L��504�$n������o�x\��
+��
�O��2T�M]�G��T���C�UrW
0��g��4�(y�!A���6��{>��(�����q�=�1�P�
Gr�
�n{@�0�t;

����h�K|�1��h��G���
��,�+�Hws*r ��&1eؾ0��c���&qO�
>�x)>�k�Ѕ�Xӊ�6<�`���\��f#�7�:/{xO���+"=�(�J��z��r���e��B��Pdž�����}��IQ��R6�v�S
+�Q��tA
�"&�%~lw
��*_[8ڈ�!$ܩ�
w�&�k���/Y�_F��4L}�U1̆T��\�~�O����hd%w��Y8�� U���	�ы,y·{�ٶ���ӛ��j�6��)��t�&cHSP��޲'����c
+�
֑.}����%\ܧ?�/]��ۍ��endstream
+endobj
+6715 0 obj <<
+/Type /Page
+/Contents 6716 0 R
+/Resources 6714 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6675 0 R
+/Annots [ 6718 0 R 6719 0 R 6726 0 R 6727 0 R ]
+>> endobj
+6718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 662.3528 163.8226 673.2567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 598.9003 513.9963 609.8042]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Fold_Space_Dimensions) >>
+>> endobj
+6726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.6352 105.3827 249.8891 116.2866]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6717 0 obj <<
+/D [6715 0 R /XYZ 90 757.9346 null]
+>> endobj
+6360 0 obj <<
+/D [6715 0 R /XYZ 213.4267 590.0982 null]
+>> endobj
+6720 0 obj <<
+/D [6715 0 R /XYZ 90 573.3711 null]
+>> endobj
+6721 0 obj <<
+/D [6715 0 R /XYZ 90 506.5503 null]
+>> endobj
+6392 0 obj <<
+/D [6715 0 R /XYZ 90 483.6159 null]
+>> endobj
+6722 0 obj <<
+/D [6715 0 R /XYZ 90 483.6159 null]
+>> endobj
+6393 0 obj <<
+/D [6715 0 R /XYZ 498.3147 430.8623 null]
+>> endobj
+6723 0 obj <<
+/D [6715 0 R /XYZ 90 414.1351 null]
+>> endobj
+6394 0 obj <<
+/D [6715 0 R /XYZ 199.7376 339.5085 null]
+>> endobj
+6724 0 obj <<
+/D [6715 0 R /XYZ 90 322.7814 null]
+>> endobj
+6395 0 obj <<
+/D [6715 0 R /XYZ 489.2487 272.0651 null]
+>> endobj
+6725 0 obj <<
+/D [6715 0 R /XYZ 90 255.338 null]
+>> endobj
+1494 0 obj <<
+/D [6715 0 R /XYZ 90 156.9451 null]
+>> endobj
+226 0 obj <<
+/D [6715 0 R /XYZ 90 150.3449 null]
+>> endobj
+6714 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F11 416 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6730 0 obj <<
+/Length 2391      
+/Filter /FlateDecode
+>>
+stream
+xڵZے�6}��Г#UY�/�q��&�-Ǚ}�8��H�Vt
E����6�o�lm��Rlv4�O7 ��df�L	�
�r��������
��|
|{s�^��AFR9��5H�%tv��mN�l�$������f�?,(��7�����>��x(����X~��U�	c�ʪ|����m���]~��rA�<߭�)!
��$���������G"�$�7���gkя71���n0"�����Sn67�����q��
"��#�!,�=R&?�i�ٸ�#�ڐ��!�%�L�
k���k�`x����Fj�.��`)�v�UyZU=����0ݱl�O^�c�!�Oa��]��
�2�Pa��
��H. G\3$D$L<(���
a9�
�sހW|���5xjVF�1
�o.�}�m��\05_�e�{��zc3�
��L98�Oa��m�vP����o�	��D$'m���#���
+^�3��\���.�1�ܒ3$�r�>�
6��M�������~ڭ�b�J{I	�Z�Ѵ�i߈M�}�"�R�Sq�~
+]�k� �^�$5i�4RS(4E���OX`�OF��b2l���t�2?�Y\���iS��YA��T
+�O���0���W;
`	E\
k�Qh���C/4�geW�`W��p}A�����/i?�^��z^{܉!64�-��h�� �:Gy�*D9K��I[��V��,�y*S�&$�<�&��i�\o����bɈʹ������g�|����#�"
j���p���Y�����i#�HA�z��\�5�<������T6��|�^��itMN��$�X�N�h2����n�$��0�z/sU
)�'��HM���z5�F��5��
�x���i�H%~s�x���J1WW'�x�'���M%d�N�H��	�EG�`B��a�
��\kO�$�V���
ϲ���6�����4�	r�5æ/��XG"R1�	^�
�������,����L�g#6������x-��� ������x��) =���td�AR I�&�
��LK�6����C
A��S4�3��`��^XT
�e���
+
+
�Ң�
_�\?�@B f�U�<��T�1
��2�)���o1������7���sHG�V+�>�>6b�t)L�A�nC��$
��^Bi =��Ar�g:H�n���i:��g:H���
]p¤jl&��HMإ�
�ݰ케4�_Ռ�:R
��{�vcם	ܾ'�Do1�5��o� ���ғ#���2�sq
XzRh�-/:���z�l�[_<����5i;��W�
CP��r�cp��)H���d
+6�]^e�&_��Bߵ*�CM���l2nH��w
���]1w�TO�jʻv
+���0����p�4�Z
�����4��
MOn@�� �g���+b�u��|w>�8�ef{]!\�X����
I��ߍ:Z�N�t�Y�/N�z���W{�K�����
+���.��� ����2��
*�/�s_��~>z
�7�t��:��w^O4H�
��SԆ�t%\(�"���!b�D^
s�=��o�b�K+-�5�*����AhK�VL�:��(`v`b��_�*��'3E�Q�6�H��v�X���F��>[q��Ӎ�M7+�l��^�i���

+��)ח��q��ȂE��x��A ̬�k��:���=����iD������.����A~���`�t�
�?3����'�RS(�u����B��v1>�&�zYx�R�4���zG�PP$�N{#MY��(ݱ	��p�e	����D���5t��K�~u��*
��\�h�����[^2�U�k�-���u��7Nѹ�o���`��߸�C@�ω@T�ۇ���Yd���&���
̇=`�	�i�%=.0��eY Z�1d��#�q.&��R���W�Ҳ��8N�)�gF�o��:	R�#��|���R2��f�
+��+���Y
�E䊄n6���Z��	
V����!߭�+�/Ϯ
�/���
L5��GFq��ی`�kz
+�t�f�M�4���<��A����ߣ�}�;����KI�Χ
��R���Z[�9��>\�ݼ.dӥٞSj)ҕ�N_�nQP��
C^�?򪻬��@Q�u5���~��
���k�������7(���S�ǿ���'�5���F��yW#m4lj�F�
z~
�0H6ج��a�%�UĹ/R`Q
+
�/���~�@���

[O�m((��Ww��c^~c�(?g�&�m5�=߱�'��eN�- ȝ����{	�����{��,\�U���2z�Ѳ����k�\U���ۗ��:�Ӯ8���na�n��8�	��fo�����ρ̥º��ɷ���Q���m����e?k
��?<o`�endstream
+endobj
+6729 0 obj <<
+/Type /Page
+/Contents 6730 0 R
+/Resources 6728 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6675 0 R
+/Annots [ 6733 0 R 6734 0 R 6737 0 R 6739 0 R 6740 0 R 6742 0 R 6743 0 R 6745 0 R 6746 0 R 6747 0 R 6749 0 R 6750 0 R 6752 0 R 6753 0 R 6754 0 R 6758 0 R ]
+>> endobj
+6733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 697.7213 177.0528 708.6252]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare) >>
+>> endobj
+6734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.989 683.5745 217.9188 693.4797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 618.7069 180.6492 629.2372]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_c03d43b46ab7f9e5d0ea3c46a5eab7b3) >>
+>> endobj
+6739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 580.4269 180.6492 591.3308]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_cf34edb23c376600051bbc563e4122c4) >>
+>> endobj
+6740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.9863 580.4269 228.2402 591.3308]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 542.5206 180.6492 553.4245]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_67cbe06cd666025c2ff64652d5824a2f) >>
+>> endobj
+6743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.9863 542.5206 274.7251 553.4245]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+6745 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 504.9878 188.3979 515.5181]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_df9fc5ac7e45f36bc03af31b98b31a72) >>
+>> endobj
+6746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 466.7079 163.2149 477.6118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_869306ea4afb6453b8e9cee36c96f46e) >>
+>> endobj
+6747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.5521 466.7079 257.2909 477.6118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+6749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 428.8015 163.2149 439.7054]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_3b727ab728f8758af9fb217eca9d791a) >>
+>> endobj
+6750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.5521 428.8015 210.806 439.7054]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.6352 347.2554 249.8891 358.1593]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [106.7172 264.3892 173.456 275.2931]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+6754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.4304 264.3892 253.6843 275.2931]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6731 0 obj <<
+/D [6729 0 R /XYZ 90 757.9346 null]
+>> endobj
+6732 0 obj <<
+/D [6729 0 R /XYZ 90 716.2211 null]
+>> endobj
+6735 0 obj <<
+/D [6729 0 R /XYZ 90 636.8331 null]
+>> endobj
+6736 0 obj <<
+/D [6729 0 R /XYZ 90 636.8331 null]
+>> endobj
+6738 0 obj <<
+/D [6729 0 R /XYZ 90 599.0463 null]
+>> endobj
+6741 0 obj <<
+/D [6729 0 R /XYZ 90 561.1399 null]
+>> endobj
+6744 0 obj <<
+/D [6729 0 R /XYZ 90 523.2336 null]
+>> endobj
+6748 0 obj <<
+/D [6729 0 R /XYZ 90 447.4209 null]
+>> endobj
+6751 0 obj <<
+/D [6729 0 R /XYZ 90 392.382 null]
+>> endobj
+6755 0 obj <<
+/D [6729 0 R /XYZ 90 251.2417 null]
+>> endobj
+6756 0 obj <<
+/D [6729 0 R /XYZ 90 228.9299 null]
+>> endobj
+6757 0 obj <<
+/D [6729 0 R /XYZ 90 228.9299 null]
+>> endobj
+1495 0 obj <<
+/D [6729 0 R /XYZ 90 83.3672 null]
+>> endobj
+6728 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R /F101 2079 0 R /F97 1774 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6762 0 obj <<
+/Length 2072      
+/Filter /FlateDecode
+>>
+stream
+xڽZko�F��_!�@W���b�l^H۴�����,�6Q�T)������w�j�ǩ��  %���̽s_#�9�dn�\	�
�r������~;#�u������)�I����� 	�����!��eB0ƋK��r���aI��>ާ�r����\����o�l��eZV�g��zU���/��~U.�^�˄
+��T��u�<_��i�._�kI5[PI��^?{}��v�L����/������
#f��?���1t��q�������c+�yQ/�� l�<`#���
a)���>`��7@��-p'�qCj2/�UUQ���cQn�2��ܧ�oY"5v+�F�H�ƾ*�
�*0Q�O���:Ćr-?��-ѐ@�3
Ӫ
bL���C�PcF��u�q������������qv'$X RF�a�����Z9�~�E��#r�@Z
+�`�prD��B�P1OE�bQ#?
o�ٺq��tw��~~s��UV䇑�H��&�0b[,g���X"�)�bXE!>&5���^‘�֧�ޛ���5	�����Y����\ˠا�*��X`�Ol��$b�1Pp���j^����j�9�
+����Gh
����&�i&j�
㠠8a�3ŷ~���=��T>�
->�e(�i�`֝Z�i���
�ʈ�E
�Cy�(+d3��
+��ac
��R(mz=�Pz���I(�&��\A���K���.O�,���:�M��S�	Ϡv3!]R�j�2pG(�`%�q����*��J�}l���PWHSI��?G��:@���]zh�ݤ�E�dj���5�K��G�
+Ĭ! :���6�?�%���.O@��ҝ���A��1��j�mSg�W�a]f{[V��
��
�N�.O�@�
H
�u ]�:��V߁t��t gz����
4h�o�
z��y_����$��Mje����t�j��6��������6�l��2��,V <>	�$��s6gPJ���g@�he6Lü��ڵyc���l}�<z3�93>ܧy���zk�,��߭��c�.i�P��)��i?��K�KKw`�v��͜�]׿)��]�W���+�h�hj�
����^ܥ�mG|�ޖ�ίM���XR�xh��Zg�^��\Q�M3m���!`�Wla�^qR�W����bGo�}w�9��j|� oF�d(�j�{�X����vu8<g���y�fy�Z�W���Wv��,�����s
��5�/�5���暐ڻ�
W5_�p �m��jiAbE��p�ȁȭ��%��#o}�O��!�`��r췹
a6�ֶ
�y!a.y	i�
R�&[�������u�Xr`
�Lf��
���0�R�im�`>MX����c$�f�~>�7>~�������_��������
A�]mHu6}Q譙��lwD9�j����}�T|�O�&l
+�IK|~�Y��E���S֌��Y��7͏��m��0�v�NL�c0�[�ƥ����h
۽G�tK����X�j�O޹�G���Z�?������!H��t��ڣbzҬ��J%�
���n����r��k���Ջ���__
ҫ�
)��ߢ"��F��aٞ��S?�[���w?](��T*�o��)6�v�����D)����Y����ˁ�i��l�e�Q]����i�9;Bh/� ��C�E�H���/_�N!
+��^�&
+F
��)�a9��q_.b�<�î�/.MUs�5i�c�1�
+Ӟ}�_�BS�
�)��6u���ܸ!��x֔L�E��8��]�ލ�[��`d���"(�1�-̲���]��ۏ��r���
��/�
+�̉ȷ�1_ϛ�h#%�wqs��Ă���A|~P��Q1�
v���3�EW
lz/I���Pk�ݴ�<�K��6����@��y�(K�U:},�M+4�����a�PE�~�n~��?x��0)mg��u�#ѩ�� �>�i���F��ÿi���
w��~���u�VTZ
����}�Re]��	�B�)
�6�!�!]+5ok'�»H� 	V4�Y[
ȵ���������Z�1��%ʪ��~{���1��Tl�{I
p队cȺ
+z��K;��ҹ#�j
�#��	#T�
�]�
endstream
+endobj
+6761 0 obj <<
+/Type /Page
+/Contents 6762 0 R
+/Resources 6760 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6786 0 R
+/Annots [ 6764 0 R 6767 0 R 6768 0 R 6769 0 R 6771 0 R 6772 0 R 6773 0 R 6775 0 R 6776 0 R 6777 0 R 6778 0 R 6781 0 R 6782 0 R 6784 0 R 6785 0 R ]
+>> endobj
+6759 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Grid__Generator__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 6787 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 347.00000000 108.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 6788 0 R
+>>/Font << /R9 6789 0 R>>
+>>
+/Length 6790 0 R
+/Filter /FlateDecode
+>>
+stream
+x��RMo�@
�ϯ�#
l�w�Hh/��vsC(
+�l�4�*�
;��EKY-h���{��ߣ�5�Z��A}�	��I!��
+�%�
��nVJ�@#DйUkE�lЇ �*
�B⏟2�S�j���e�3�����ǒ�%	�[5f^���F��A����PWWc�z�6��.���ί���5ժ�os�<���7��T��N �.�p3.� FI�Fπ[�1
+_��@�
� #�� 
@�f�f(]Q��rⴵ���5�C�KF��M�+uz���4E[
�2�����w;�����9W3_4���j��z����a'��.���jat{F�S�
@�`�����ϳ�6�,��I� ˂�c�F�=A�������:�<x�_GZ��9*S<zD�u�U1��)MV�+�&���'�
+�Øش��E�f��:����˅�
��3����I��'�}ӓg���
t��
����Kn
|�~O�*endstream
+endobj
+6787 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142735)
+/ModDate (D:20080908142735)
+>>
+endobj
+6788 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+6789 0 obj
+<<
+/BaseFont /PZZAMX#2BFreeSans
+/FontDescriptor 6791 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 0 556 222 0 0 222 833 556 556 556 0 333 500 278 556 0 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+6790 0 obj
+477
+endobj
+6791 0 obj
+<<
+/Type /FontDescriptor
+/FontName /PZZAMX#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 6792 0 R
+>>
+endobj
+6792 0 obj
+<<
+/Length1 56356
+/Filter /FlateDecode
+/Length 6793 0 R
+>>
+stream
+x���|�����eJ��A�P(��@,K��-��Rh��:�3�qR�ҽ��{���{ӽ��{�'K_)6?C�}��'9GGG�{�:�{�e H� d� �&�gΞ���7�{�vh���ׯ�H�=��*M�h��3���0
�������0�3�k�b
�
�x�kϘ��
��
����~�vvW����W�~���\p}�1��ܒ�!�ҷx�����b�;�����|�`��)WN}nR3Ap��5���x��=�\�^���0j�j��3�j�M���'�c��<�{mU��z�W'�E�%�N�$!�A��x:M�O��!Drt�X�<	:G���U¥v�
#�R�AFlL�{����]��%Wu�X�8:E(���ibk��
�*�t���]�s�*��U��	�1b*u.�a���c��c���U�0�b�?��a�
��H=D/�O��k�h"4����Gz�F7<�%J�w��f{OW�ZL�|[�^�G�6�R!���"1� �=���|{�Ikn�6��N� [...]
+X���yZ��>2>H�W���s~Ag�����¬Z�
���ͻ��҄n�>����S���
r���-~L{!��W�
���Ou .�J�D���&r�Z�=��WrίU����?˞&ډbS��O�I{Y����
!�Ǘ��+c�/O%V���pb�1�X�X�X�X�E�M�C��2�X������q�xbb�!���%'z�L�2H��$	B��eқ�)��mSb3bsb
bK��l��2o��zSz
+1���q�6^�o�u�L�#��2�lo<��r�<bGb'bgbbWb7bw����}
q1qq(q/q�9qq
q4q.q%q�ǪGo'??��G�?�W�?��O�{<��5�	^�>�5��S��
=K<G|����
ċ��^3O�H�J�B,���+��H������vg����=�+�Y��u�b�Ko�Tg��ľ�>�
ą���~ފ�@�k�[�.�%9�'R$%�b)�
+��1�_���CI�\�
F'G���#���5�5ɵ�Q������:�d9�\�
C�%�'Ǒ��
�	��F���D�O�5r9�l&�F&H�4�$i�)�"7!7%7#>$>"7'� �$�"m�!�d�̒.9��JN#�&�!n n$��ے3ș�v���,r69��K�E��e>!w �;�;�;�����������=�
�B��md�l';�N��\@.$�&
d7Y${�O���^rO�D��
+�G."�K�~r/rorr_r?r� �@� �2�`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�r)�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7������NR��)�b)��)�)��)�R�5�Z�J�J
��S#�ը����Ԛ�Z�(jmj
j]��M�G���R�S����jCj#jcj"5��L5SqJ��NT�2�eQ�P�R�Q�S[P[R[Q6�Pi*Ce)��BM��Q[S�Pөm��Lj;j{j5��Cͥv��Q;R;Q;S�P�R�Q�S�=�
�B�RmT�j�:�N��Z at -�
+���T7U�z�^jO�-�m�
�}�
�=�D��
+�G-�SK�~j/jojj_j?j� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e�j)�*��:��&��6��.�
�>��!��1�	�)��9��%q6��5�
�-�
�=��#��3�
�+��;��'��7�����K�$M�4��,��<-�"-�2��*
���C�U�a�pz�=�^�^�^�^�
E�M�C�K7ѣ���1�Xz}z
=�ހ�@oHoDoLO�'ѓ�f:Nkt��i�N�&��-zzSz3zsz
zKz+ڦ
:Mg�,��S��4zkzz:�-=��IoGoOϢg�s���<zGz'zgzzWz7zwz>���[�V�����t�Iw�
�t�t�K�I��2]���E�bz	�O�E�M�C�K�G�O@HDLBJFNAIEMCKGO�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O_ at _H_D_L_B_J_F_N_A_I_E_M_C_K_G_O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O?@?H?D?L?B?J?F?N?A?I?E?M?C?K?G?O�@�H�D�L�B/�_�_�_�ߠߤߢߦߡߥߣߧ?�?�?�?�?�?�?�?��������������������������� [...]
+�21f�
+3�Y��
gF0�1#�ՙ5�5���Q���:̺L3�Y�Ìe�g�1�
�	̆�F���Df3�if��$�1�$c2)�b6a6e6c6g�`�d�bl�a�L��2.3���Lc�f�a�3�23���v���,f63������cvdvbvfvavevcvg�3{09��ieژ<��t0�L��Y��n���0�̞L�)3��Y�,f�0��^���>̾�~���́�A���!̡�a���̑�Q���1̱�q���	̉�I���)̩�i���̙�Y���9̹�y���̅�E���%̥�e���̕�U���5̵�u���
̍�M���-̭�m���
̝�]���=̽�}���̃�C���#̣�c���̓�S���3̳�s���
̋�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�f�/K�$K�4˰,˱<+�"+�2��*c����C�U�a�pv�;�]�]�]�]�
Ůͮî�6�����1�Xv}v
;�݀��n�n�n�Nd'���f6�jl��Y�M�&�b-vvSv3vsv
vKv+�f
6�f�,�Sة�4vkvv:�-;���n�n��bg�sع��<vGv'vgvvWv7vwv>��c[�V��ͳ�l��v�
؅l��f�l���ɖ�2[a��E�bv	��������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾�.e_e_c_g�`�d�b�f�a�e�c�g?`?d?b?f?a?e?c?g�`�d� [...]
+�r1n�
+7�[��
�Fp�q#�չ5�5���Q���:ܺ\7�[�Í����q�
�	܆�F���Dn7�k���%8�3�$gr)��6�6�6�6����l���\��r.7���M���s�r3���v���,n67�������v�v�v�v�v�v�v��s{p9��k�ڸ<��up�\��[��n���p�ܞ\�+s��[�-�p��^���>ܾ�~���܁�A���!ܡ�a���ܑ�Q���1ܱ�q���	܉�I���)ܩ�i���ܙ�Y���9ܹ�y���܅�E���%ܥ�e���ܕ�U���5ܵ�u���
܍�M���-ܭ�m���
ܝ�]���=ܽ�}���܃�C���#ܣ�c���ܓ�S���3ܳ�s���
܋�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�n�/O�$O�4��,��</�"/�2��*���C�U�a�p~�?�_�_�_�_�ůͯï�7����1�X~}~
?�߀��o�o�o�O�'��f>�k|��y�O�&��-~~S~3~s~
~K~+��
>�g�,��S���4~k~~:�-?���o�o���g�s����<~G~'~g~~W~7~w~>���[�V�����|��w�
��|���|���ɗ�2_���E�b~	�����������������������������ϟ��ȟğ̟ŸʟƟΟ��ɟş͟ß˟ǟ�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_���������������������������������?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?Ͽ��ȿĿ̿�/�_�_�_�����������������?�?�?�?�?�?�?�?���� [...]
+�@
+�@
��
+��
� 
+� 
��
+1a���0TXU&
F�	#�Յ5�5���Q���:ºB�0ZXO#���	�
�	†�F���Da�0Yh�&$]0��`
+)�6666���l��BF�
+�0E�*L���
�
+3���v���,a�0G�+� �vvvvvvv�
{9�Ehڄ��.t�B��@X(�n�(��žBI(77
�6�v�������xTXD
D<D
.,�W�	��^���>¾�~���}����A�=���!¡�a���‘�Q���1±�q���	‰�I���)©�i���™�Y���9¹�y���
�E���%¥�e����1•�U���5µ�u���
�M���-­�m���
�]���=½�}���ƒ�C���#£�c���“�S���3³�s���
‹�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��
�[�;�
+�{��G�'�g��,�W�L�;�7�w��O�R�/�$�o�a��H爤H��Ȉ�ȉ�(�"q�(������������C�U�a�pq���8R\]\C\S\K
%�-�#�+6�����1�Xq}q�8^�@� n(n$n,N'���f1.jbB�ECL���-qqSq3qsq
qKq+�
1-fĬ�Sĩ�4qkqq���8C�)n'n/�g�sĹ��<qGq'qgqqWq7qwq����[�V�M̋�b��)v�
ąbA��b��+�)�IJX��E�bq��/�%�-�#�+�'�/
 
(
$
,
"
*
&
.
!
)
%
-
#
+
'
/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/^ ^(^$^,^"^*^&^N�)^!^)^%^-^#^+^'^/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/> >(>$>,>">*>&>.>!>)>%>->#>+>'>/� �(�$�,�".___��������????????���� [...]
�FH�I#�ե5�5���Q���:ҺR�4ZZO#��֗�I�
�	҆�F���Di�4Yj��&%$]2��dJ)ɒ6�6�6�6�������lɑ�RF�J�4E�*M������K�J3���v���,i�4G�+� ͓v�v�v�v�v�v�v��K{H9�Ej�ڤ��.uH�R��@Z(�n�(�H�ҞRI*K�OZ$-��H��^���>Ҿ�~����ăҁ�A���!ҡ�a���ґ�Q���1ұ�q���	҉�I���)ҩ�i���ҙ�Y���9ҹ�y���҅�E���%ҥ�e���ҕ�U���5ҵ�u���
ҍ�M���-ҭ�m���
ҝ�]���=ҽ�}���҃�C���#ң�c���ғ�S���3ҳ�s���
ҋ�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�i��LȤLɴ�Ȭ�ɼ,Ȣ,ɲ�Ȫ
��ȫ�C�U�a�py���<R^]^C^S^K
%�-�#�+7ɣ���1�Xy}y�<^�@� o(o$o,O�'ɓ�f9.krB�eCNʦ��-yySy3ysy
yKy+ٖ
9-g���S��4ykyy���<C�)o'o/ϒg�s���<yGy'ygyyWy7ywy�����[�V�M���r��)w�
�rAr��+�)��\���E�by��/�%�-�#�+�'�/ ($,"*&.!)%-#+'/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/_ _(_$_,_"_*_&_._!_)_%_-_#_+_'_/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/? ?(?$?,?"?*?&?.?!?)?%?-?#?+?'?/� �(�$�,�"/�_�_�_�ߐߔߒߖߑߕߓߗ?�?�?�?�?�?�?�?����� [...]
�	ʆ�F���De�2YiV⊦$]1��b*)�R6Q6U6S6W�P�T�Rl�Q�JF�*�2E��LS�V�Q�+�*3���v���,e�2G����SvTvRvVvQvUvSvW�+{(9�EiUڔ�Үt(�J��@Y��n���(�ʞJI)+�OY�,V�(��^���>ʾ�~���ʁ�A���!ʡ�a���ʑ�Q���1ʱ�q���	ʉ�I���)ʩ�i���ʙ�Y���9ʹ�y���ʅ�E���%ʥ�e���ʕ�U���5ʵ�u���
ʍ�M���-ʭ�m���
ʝ�]���=ʽ�}���ʃ�C���#ʣ�c���ʓ�S���3ʳ�s���
ʋ�K���+�R�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�e��J��J��ʨ�ʩ�*��*�����S����C�U�a�pu���:R]]]C]S]K
�������6�����1�Xu}u�:^�@��n�n�n�NT'���f5�jjB�UCM���R-uuSu3usu
uKu+�V
5�fԬ�Sԩ�4ukuu���:C��n�n��Rg�sԹ��<uGu'uguuWu7uwu����S[�V�Mͫ�j�کv�
ԅjA�V�j�ګԲZQ��E�bu�گ������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
���������������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�ޠިޤެޢުަޮޡީޥޭޣޫާޯ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�����������.U_U_S_W�P�T�R�V�Q�U�S�W?P?T?R?V?Q?U?S?W�P�T�R�V�Q�U [...]
+5��
+�`�{�g
+�/nF�|1x~F�����g��.��N�z�Cg�
t����D�{P��A�{|����+v�J}݅\_E��f1��f��P��aVC)���ʾ�g�4cy@���]�����W�v�S��J�#�
�t�\ԥu�ԥ���RW����V��ի�������\�W��}��@�vj��/���^��z�
�v�f�8$j�J@�d҄LAZ�6����@f!�@Z���o��\
�p-�Z���k��\
������)ٞ���f��6�m`����m��
l�6�m`�����\�o �A}
`;�v�� ��l��
`;�vPO�F����^xiु�^xiु�^xi�5�����~��g��~��g��~��g��~��g��~�Y�g��~�Y����_�
+�,г@�=
�,г@���
t�.�]����
<ג�j�&q.Ry;�\>�`3˅\�3�{t���2�A& uH2	iB� -HҁLCf ��A�8����?�8����?n*�k�y��bN�E���"�8bЀ�C��:j���:j���:j���:j(_C�	�1�:&P��hཱྀ���}�g >���@|�3���
�c �$���iI�%��^xI�%��^�D���K��	<x&�L��3�g��	<x&�i��&�M��i�/
����4����_�Ki�/
����4����_�Ki�/�>�Ki�/
����4����_�Ki�/��
\��0

���4p�^��
�|�!�k��Z&!v�r���k��R��{�fM�W<5
ҀLB��)���ga��gQ�S6����@f!���'	��I�$�|�@>I �$�"��� �~
�q�#�$�K�5M��R-�B��� �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I$Pn�&Pn�&Pn�"!%�hH	L�&l2af�JO����u�K�rWٿ��Bog�W�\���/�rJ����1}������
h����
+9��[�,���wNC�<�:,��b�|%�N�yy?̛i�cv�n�

;��Ә* �M��7��x�[�rԶ}Ԍ>j�.
P�uѳ:{��]
�9zN��G4�v�]t��ٮ��ؖ2�&�!p
��\�J������]a����?T��i�V��Z9�-_��x���U�Z�fůZ�0v�_��_� H'M��%]�~ʯ]�������Y_�����{���z?�%�Smx��͇,��S�k}����㕉��\k ��Y̵wuś=r
5#
iZ�
��#͈�d�����4+Ԓ�ޜ�,!V\�ʍG�ţ��Qi�@�Q�Z�ũE�iQ�ZT���E%'��Qɉ��D��#a$"�D���0�
a��
a��
a
��
a��
a��
=���HFO$�'��f��bF��Q,fT��lF%�Q�fTr**9�7a�"�T���0RF*�HE�Ê0�Ê0�Ê0�Ê0�Ѝ��(-ĊG3��i�nND�
iF�%#͌�T�Y��F<
aEu�G=��u��t��t����ā�	�O��H�_�
+I��
+I�$z1b��c��c��c��c��c��c��c��c��c��c��c��c��c��cW�cW�cW�cW������ ;{
;{
;{
;{
;{
;{
;{
;{
;{
;{
;{��|��t��t��u��u��u��u��u��u��u��u��u�
u�
u�
u��u��u��u��u��u� u��u��u��u��u�	GcJ� {|
{|
{|="�����������������YD�N`��c��c��c��c��c��c��c���
�]��]��]��]��]��]��x�t�t�tFB�4 ��&d
+2,džt Ӑ�,d��7C_�|
�:��?�|
�:�u���ׁ�_�|�
,E
�
�
�
�
�
�
x���76�76�0�'6�'6�'6�'6�'6�'6�'6�'6�'6��M{d{d{d{d{d{d{dKnKn{d{d{d{dKr{d{d{d{d{d{d{d{d{d{d{d{d{d{c#e�3Ջ
��EF�j͑�E~�H�#͈�T��ѳ�Ȗ�l��D����RRz��EO�F��I���%��i�H3#-i��
i�H�"-B5#
3�0#
3�0#
3�HE�#a�"�T���0RF*�HE��fs(�dR�4 ��&d
+҂�!
�4d0FM��M��M��M��M��M��M��M��M��M��M��M��M���x���
愉���_�|l�Ml�Ml�Ml�Ml�Ml�Ml�Ml�Ml�Ml�M�x9�D�7��M�x9�D�7��M�x9�D�7!�
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��
oa�X'Ɖ�qba�X'Ɖ�qba�X�ayd2��
�ca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X8�p
d���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
���8��q����������5��5��5��5��5��5��5��,oa�`a�`a�`a�`a�`a�`a�`����Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z�2������\���k�*����e��W^ [...]
NE��J���8��^���Z���������.��
��rP~��ۂߝ9�Zb��J�o�E��R�3'���0�+UowU�o�����"��߬�w���û������:s�\��
�B�W��~w����
�#/�Z�C��B�K�{,,���&�+_����~c.��6-�����=}�[{�"�~�kI�~9�(_����T
�]�|�h/��`L�jKN��כ�WC�.�]
��Ek_��/���k/�ڋD�>�梐/���2�~��^,�������c�wl�
ޱ�;6x�����b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x�����a�?l�
���6��o��
|a�/l�
���6x�/���`�l�}y�F����m�yy�F����m�i��F���gm�Yy�F���gm�Yy�N�� n�Yy�F���gm�Y{&{&{&{%{%{%�'��3��<���6N�l|~hc�m��C�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�
�d6N�l���8%�qJf���)���1�c6N�l���8�q*f�T�Ʃ���0�a6N�l���8
�qf�4��i���0�a6N�l���8�q�e����闍S/;J��3&gL6Θl�1�8c�q�d�����3&gL6Θl�1�8cr��
�=y�A�s��
�;�k��A�s��
�7��A~s��
�3��A
s��
�1��A>r�w
�
y�A�q�o
�O
�
y�A�q�o
���A�q�u�w
��
�
'�Q>򆃼� o8�򆃼� o8��<� 8��<� 88)w0�
���濃��`�;��湃��`^;��毃��`�:xW��|u0/
�K���鵃��`~:8�v0O
�O����t0
�C���<tp��`�9�oN�
�7���|spZ��l��ٰ��ag�΀��4�'��I���4�'��I���4�'��I���4�'���F~N#?��oi�[��F���oi��4�q�8��L�?���i��4�q��F?�яi�c��F^J#/�����Ki�4�Ry)���F^Jy)�
΍<�� �:���4!S��
�@�!3�YH�ǁ~
�q�ǁ~
�q�ǁ~
�q�ǁ~
�q�k�׀�_�|
��5�k�׀�_�|
��5�'�� ~�	�'�� ~�	�'�� ~�	�'�� ~�	���ׁ�_�|
�:�u���ׁ�_�|
�:�u��7�o � �|��
��7�o � �|��
�'��~�I�'��~�I�'��~�I�'��~�I��7�o��	|�&�M��7�o��	|�&�M��� �-ļ��ž�o���C-x.��S�O?��S�O?��o���o���o���o��|
�pm�k�\��(�F�6ʵQ��rm�k�\����Q/��Q/�r�� ��|��
�;�w�� ��|��
�;�O?
�4���O?
�4���O?
�4���O?
�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?
�,���?
�,���?
�,�C^u��ƹ��	��
X����
t��'�q,킥]��
�v��.X�K�`i,�6��ِd2��
jゥ]��
�v��.X�K�`e�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,삅]-�C���.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
�u��.X��`]��e]��
�u��.X�˺`Y,�]]��k��"~��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q7��R�K/����.X�k�`M��5]���
+�P_��
�t��.X�k�`M��5]��
�t���|��k��|
�`W��]]��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.X���`U��U]��
Vu��.X���`U��U]��
6u��.����`Sl�M]��
6u��.����`Sl�=]��
�t��.��{�`M��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]x.���.��?��G7�G8.p\��q}
���av�7ckz�y[���<�ڻ:�J��\������pJݳ����~��Tη��
������N�
�\[��q����I5��S�C�xҀLB����_�Z�u��`�R�:���D@�� 
���Q��7_��A0f\�~N��E�\�Z���Qt�v=T� )��btۃ��GzeqdW���+?��
/��/��?��ʏ z�Ax�����J.��
��H2پRO`�Z<X�x2
�x�0���[X�+�����'F�,&�#̪s
�
��C���
	,
X�RC�K
O�!�H^�U:�Jm��v�Rn� �H�{��"���T�6�\me�߰��s��'Z�%Z�ڞ�!O�$O�$OM�DS$�I4E�ڞ�	|�&�M��7�o��	|�&�M��7�o�t�\�Գ�������+��Tm��f[��b��x�#­�k�Ԯ\����QT�B�0)���UC�/2�]�{U�K� �t��dR���|wo��炷i�6��
+�/仫_��Ӎ/Lj�
�}�^��BCP[|{S÷5=�+9��RWyaw��	���zz{J��#W`sŎB^*�tt���؀՛�]�J5
�V=Y���;��a����̊�N�u�{Jy����U>�մ`իi�*ד$"D*�w=���P�Z�����_��T��|!�[�
��f%c����P��-�co��/&�1$���jE�f-Tz#�%h�D���ӄ�ަ���7��!^cH@�d҄LAZ�6���\[`2
�V
��˓d���8 �8B��U��1�C܏!U��Tgh��!
!h~�@B@�4�,
$KCCH���G��) h�@CȢx�Zë֞�#0
+ ��]k
�Zkx�Zû�޵���QS "�`���^��𲵆��5�l��ek
/[kx�Z���^��𲵆��=Y
@���S4
�
J�
+}B��hF��
E���'R�PI�>���C�x�����sX�
ƣ���a�z��U0*#����Ӻ0h�9�F��Um���h�9e��w��)4���*���G���ޮ�T	�*�No-��������,t�l
�:�B[@��
�<���t�ۻ<�hk�Y�M�:�gء�mpS�)o�I������`��%����W���*K�6�@��R��C�A& 
H2iAڐd2��tЏ'�
y8a<:���?=�KB".
q�KG\:�����tĥ#.q�7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�&�S�O?��S�O?��S�O?��S�O?��-�[���o�B�ʳ�g�φ��8m�i#Nqڈ�Fy6��r��8m�i#Nq:�w�� ��|��
�;�w�� ��|����O?
�4���O?
�4���O?
�4���O?
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,���?
�,���?
�,���?
�,�]��w����
|�.�]��w����
��$���x:���d�p�dx�@�!3�YH7��x2.��T�/�.�k�՗����RɷQ��t{{��㟀�x%��+Q.^]�d6��Q��O]���I
2�C��(1X�z29��+9V�LQ+T/H�xAʓ�!��!}�*�*�(@G
;ha-젅�*��W�\�B���)O��:��Q;
��(_���
�
u�C��n������U���D���E�*�򽝒�zyo��o��7�}]�_���>�ו=.�G���_���5.��0��/`/��s��1`��
Ћ
.��� �@�)e��˂�R��Jů
��������.�<]�@
pۀZ
P{�{k�[�-5���@-
�����5q��.5j�G�T�����sCB
/��_�.�
����D���k���^
�
���q_�����
�0���0T*�"�J'Lmm0y}�J�
"U�;m�C��CUƫ�^zC�Z:��+�o7\��Rc*�q�
�G�
J��E
zz���
���X��{~�*�\\
�C�H����X
+�$P���"J�,�ToP�a4��@d�_=���`8)��Dp� Y��{��}�WO	��`����:����W��s
�	9���.����Uk0�¤QU�j��h
n{	#�/b�-�K��-Z'�ׇ��
+�t���iA'�m�/�P���`��`��#�P�b�hA
+��С�-4zZ\U��P�G>уEtE
\�e*�X
+&��*Bv�Z�����Ad'
mA���-�������ӆ���Ƕ`��j<��gs1T�1�1cjRF�P�ݰ��G�AJ�����͢��R
ۣ����
�bX�bP�H
�O2
MY�����/ty
+d/d7d� Y�C��W�&��� ޖ(ʖ��z
ڱ���&���n������� ��Q
�c����P+�	t�
����ڢ��K����
aa��PN�@
^b	d0"
�(
̽B8
+�`�+�m�O'
�0���(�K
+��c� !T���T	�b�t�J!� V�T?�{:*hq9T1�C=
��<H��
K;��v�`�5D�
�F�W��IQ
��r�����P	B	’T�9b����V
�n�p��Ö
Z��.�@+��T
�r��5
+�
Vg���e7d��z�J ��ٵ���
+i	�2-��0緄	�%L�-ȬpH�-a~C��*�x84���h	
�Ƴ�ђ�j�K�)
�ޖp<���`:a�C��su
|k3]E߿��(�
+75���U��U������uOUjoU�[j�t51U�cj�������"��h�/_S��F��곭R�x
Ґ��(���0z��U��U�4-�O��=�R�TK�
��z�t�=�][dwt+ւD>P��8�-�@��XG�

���r]�κ��fú�a�DY+��J�uJ���s�5�S;'���t�����J�"��
��k;�\�
�薿E��qUK�� �[x�W�в�C

�Pƪu�(�����1qLŚ[
��WŎZ���[�ue,��������+/	�ʟ��:W/1�ܬn�j�)�V�
+�����Ⱥ[uE���������j���]{�_{Q��(ԖP���7zk
�.��J����{�r4J�ci��mO�����m�HZB���vդ8,f�h��S)�:v[����'*�Ts���4֞���s��2W/�]�ÂI�O�������'.�N
���O��R�aU�D�R��D�e�f3TR�YL�����f?� ��������e"=���F���<��͡ܚS�[�6)ײ�
u�x�ѩ3����
3�OX�����^1�k!f���r��Z
+�ˣO#�D��I���E�L�ߌg����&�k1���8���/�{$�#O�}Ң\�/�H$��k�=�c	��
��
mP#;h����V�1��N��匚o
�\�ն~����F�R�Z�T2
P�p�!�h62��:#Mc�rc���L#c�θ��Y[{m��mA�\�E�A��7�Q<�VB���Q�k�F�B�jv�G�F�F=�5�-���6�&{�!h�OkPh�Q�&5o��N4��F��h4��0Z6ќ
ݨ��-ќݨ���Ġ��a
���ʈ�fʸ���#9��9�G]���#�
ln����A=�A=�C�
�
��
̣���n��p�КkQ�W��a��H4�J|t��Р��=jC\n���Vm 	#�h>����3A�uϛ�p+r�~���]Y7�(+-g�Iba,�%�ZX=
*Z�$BE#T��b�J*T�	�Me�4X���ó��Q�2�I�5cm74X��υ50�a
��FXê
˗�`ݓ�T��l�c�
F���ud�jVԉdb2
1��
C
=�B���p��05�����b��f�h��fj��h�Ѡ�k[?�j%R���J�u�%��}N=i772���ry���V�P��`�_���A=V�خ���x
����q��J<2�z
��X�`�O�+�6��f
����ZY*�_z�$�A�}�
+F@�Ǡ#@�o�A�F|c8h�$훐&��N�%B�����F;���BC��Հ
O�
+��w��4�ǩ+N��g
+H�Q�	W!����k��V0��<ڠ
FmP
�D�
*US�
+�f+l�F�+>���h��X�ވёЗ�V��Z��r٪�G�`��v��v�%�
+a�+�4����c5r_� �?����;�����_wd��
+:�چ�'����{Ͷ:��5K�J62����FF��1�Șid�60ډFF���Q��F�ۍ��o;���jd7��ݰFn��526��Ө�N��s��iTwǪ3NXn��Gq���sR������	+vw�#cį�w
+��k�;Q]����z�^~��n�7�F�����o���������U�a7����U���U��7��rw��U
&V
+
���,�N��FF��8z�yY�Us.y�8�p�8�I��Jy�L��G�{6(

�{�
+<���`�n|�n��i7��f|���ݬY�vr����r�gk�^�fre7͕�tj�-$�w[t�棪c�Q�*�
ﲵ�-?111>��
���&�$��1u�
+
 ˱K]����
,�7b���_�bkzD[���ڱ٘�]�Y��C���fe7��&+��{��z�����J�<��
4{�8�X�J2<���A#um�L��?��Xn�מ4��

4[�z�
,���n5p�5Z�͵5�@�O��c�͵��B�h�XX���Z|�P��њ��a9:FI|�q���F�埕į��~���x�h��#T���C",0|wFǻ3v�~��
�
?6�ÏM��c=��Dף��h���5�h�D�n�I�nQ���f#c���jd��F�t#c��1���60Fá�od���z#c�����ݨ=�F�i7j:�Q�ٍ��n�tv���5�Ө�F��4j%�Q�8��i� N�q�؄�>Z��vT}o��
��џ]������3Z
�8����<{<�vq#*z���
st�Hpx-j��<�ԯFC�d|e�k��p���/gH4-��e�@��5{,|di׾.h7Ռ�쏚��x��
U{<k�ñ�V#����42f���n#N|�3j���FF���Q���rF���Q+i�$-gl� Z��5H�Q�$�k�!l�����F��ܨ�5Bs�FhnԨe�U-ިj�F�oԭa�u�k�a���L��DC����0d��AQ��CG}�"A<A�CGeG
M�����5��C��_�}2���U�<�ۘx���1�0m����u�R�$v��E��["����%����99�=t�x���4�G�3ts��������
3n��1��
=�\c�#�
x��C�e��?�������o�X�
K6�ڍ4�*5=<���~r��,�ɋ����OL�p��?��H���ɑ3f� �ƖCoZt�U�69��e�	^8�%�dإ��t��d
���{�K�|�
+����.��{OU�����`������$G{�0t/������nZ���T9����H����`�۾�̬�x߂g��ص�}�-杝��+�ߗ���\�l��n9b��\�Wbٲ�vo�_d�2�y��A
C���5��l#�1��7�'�K7'����aZ��s��3�JdzR��O�JʪæN��Ĝpʘq��,������4��-n�a�:;��8g���I��d�x�:=�ϑS%�9p��G�=d[�~�
ӓks�*W3����;z�?����Xc�ȵ�ݽ�U[�ǫ�d�ņc�$�z�%4��Q�1�\/�.�칪��F��O���^��a�$��8{��m�'̛Uܞ]�����.>��e�_x�5�O��
���Ϲ��+S���""��]P�teZ�
+�B
j�ǣ�i:E��`i�!
�k�E�sf���m$�C
�e��,�
ɦ�X[���V
+n�6�l���w�=�{���]�^�x/ݿ��?R��Z�����Q9>H���a�M
�i��[�
�
�e��
q�dz�M�/���ң;o�o�5�S�2j��0������4L�����B�8�p��bbR�{-�l7����j}������nm�m��b������yu�̪,H3y˾H��X��1w�Ŕ�9R_}�J���x�V������`["�"���q^�!�HwB�L��[*�1IN+�ĕ�����m�7lmi�~�A
-w�@(���^���ڝ�?�� j��:ՉNfvԥ���${�
7���f���nR
��P�e����9�6�f+ݐ��pM���Ӛ }q]��8`�
+ޤ)w\{��K"ps��3�N�ۭ�k�î�_�`H�@�0%��_�8�N�E���H<|��dX�G
ل:����澒�����BJק�
�����S*4j{u��,���a.[:'�:B��L�c���o�� ��YJ��
�<����|�?$ʴL{�De+�V�_������嫌�k�
ӒH�3�

D7x�1Q'$��)�D-’
k�w|����Cu�T/��ԛ��v
���}�u�@����8�kk�k�oޭT�ZauV(��t�3� �E��5
j�,�[�%��ׄ��o�S���F&�rw=Z
+s*s]��\<��s���W)��
U�
Ҵ�ԗ���i�B����qe��6���+[���=t��s�UFq�<H
'�Pcv8�Z�L���
h���Xp��-3�Tn۟
�3�;4����[��8|Ft4d�9%��ؔc�i{���:�򧰲&>^���a�cu*�aCVw�)������Y\��;Q��x*�d]�� %�u
5�'s�
�"(Ix�<i�6�o�4���(���+�i~�����f
�Nx5��#���+�A#ဃ7l"=ҵ�Z���O��P\
M�!���T�Rh˺6j-���N�
!�PY�p�x
J
[:�+*��J��z��t���,�2���7fu�'ϱ1����BV�\��u^�
���fg���v9�P
GG7M��P�#!����<8����.�l�-�SʏG�����P�R��sJ��~���
+ @�  @�  @�  ��
+��%��.D�@�"�=�Gᾛ82)���-G����������Qa�����Q��{�AG��!�5��ÜBf�3h���F܃+�g�~�A�X�F+Q�D�N���\�Cy(���5��9S�ʈ^��|���d�v��O���b��������K��0��t̗D��?%�f|�M� �z*a�t>d��&j[������(+j��j�;
�����k>�����S����GMs�kl�w
�ّ��7��� ��N�endstream
+endobj
+6793 0 obj
+20807
+endobj
+6764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5884 695.5631 187.8422 706.4671]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6767 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 623.4467 175.9373 634.3506]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare_92edb0b8b1e2097c5d20795e576517cf) >>
+>> endobj
+6768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.2744 623.4467 270.0132 634.3506]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+6769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.7463 623.4467 378.4851 634.3506]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >>
+>> endobj
+6771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5884 541.3676 187.8422 552.2715]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6772 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.3054 523.7432 305.5593 534.6471]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+6773 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.9298 375.732 274.8349 386.636]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+6775 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5378 219.7077 160.2066 230.6117]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) >>
+>> endobj
+6776 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.9774 219.7077 192.6547 230.6117]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66e9cf46c5e08ead7689807e1c8ba30642) >>
+>> endobj
+6777 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.6435 219.7077 257.0529 230.6117]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec664ac3b90df83c2e43249ccfa2702640de) >>
+>> endobj
+6778 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.0416 219.7077 291.364 230.6117]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec6625b86c6f0633416506503de2bf693876) >>
+>> endobj
+6781 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 139.5062 178.9758 150.4102]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_b1db3272b7beca7b1d9d17f23d22ecbd) >>
+>> endobj
+6782 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.313 139.5062 271.3784 150.4102]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6784 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 101.4124 186.7245 111.9428]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_00017ad58d66a7948b0355b3e02c750b) >>
+>> endobj
+6785 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6763 0 obj <<
+/D [6761 0 R /XYZ 90 757.9346 null]
+>> endobj
+230 0 obj <<
+/D [6761 0 R /XYZ 90 733.028 null]
+>> endobj
+6765 0 obj <<
+/D [6761 0 R /XYZ 90 642.2271 null]
+>> endobj
+6766 0 obj <<
+/D [6761 0 R /XYZ 90 642.2271 null]
+>> endobj
+6770 0 obj <<
+/D [6761 0 R /XYZ 90 586.4942 null]
+>> endobj
+1496 0 obj <<
+/D [6761 0 R /XYZ 90 463.1429 null]
+>> endobj
+234 0 obj <<
+/D [6761 0 R /XYZ 90 455.9431 null]
+>> endobj
+6774 0 obj <<
+/D [6761 0 R /XYZ 90 236.5852 null]
+>> endobj
+6779 0 obj <<
+/D [6761 0 R /XYZ 90 158.2866 null]
+>> endobj
+6780 0 obj <<
+/D [6761 0 R /XYZ 90 158.2866 null]
+>> endobj
+6783 0 obj <<
+/D [6761 0 R /XYZ 90 119.9387 null]
+>> endobj
+6760 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F25 348 0 R >>
+/XObject << /Im9 6759 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6799 0 obj <<
+/Length 2922      
+/Filter /FlateDecode
+>>
+stream
+x��\[o�~ׯ�SJ�h�}h��@� ���%
������,);ʯ�ݝ��sVa�,J�xηg��河d3
+���љQ�8!��v{Eg����W�}{	�/S��n����j��\�n��4#�3>���i��j�d��������7
N���Ӈ�*V�\�����ի���n��ܕUq�W�%Wt��8
��o��e�`v^�nK�Ʉs������~i�W��f��/W?�Lgwp5�_Q"�U�O�
%�9>�^I.�/�����4o�+���XagK!�����P+(
� �>��q�8�k΀��,�\��j"�����/���*�(|�+1K�3J�,pi)��T��[o^��j��
��^S�y�cƩ,�eDa
,%�P�e�� ���0fzIO ��>������ip�@>��=���\pB���
���~w8�+K�Rrj
"
�1��w�tV��ˈB.�d��:�=��
eb�|��"\P�re3
��ƨY9��
+���
hFj�}N�Y��pX�������+
��u�csr����&��"~ҋ�aD(�/�0ԋҀg{�.�:�&zQ�g�E��E
����t�!�q�yQ�ڟ�(�<zQ�o�^4��^��ĭ;�����m�FjPHrAaF�^��mHyMiy�
%1r6`gڐT�ˍ��
AgRJ
̆
��$��6�gm(ew��R������Pm���yr"!.��2B�q(π��<<��*�
�E:���K�ˈB(pšGQ�kH�Z1u�
u���!Zru�x�9�����<>V�v�r�P6/���(�}����m\��un^‚g�?�w��*��c����%F ݔ��zI��	�����t.fR�9тN������r.�KD���;
x��v�aw��t>&k����fֲ68Ca�#
+�2
��Q�Q0��.Kn@XVZ
s���@�
+
�J��Qr#��;��{����
qDl��U
�
��]�s�UiC�u悻0�VUk��jM3���Q�i�w��f�AmBm/oFg-
c0�����z7��f�T#PXj-a��D��/���*i�[#'� K�6Ԅ�e�P:��z,�Dᭅ��n��bw�jr�yj^�G�)A+\�?@�]
�y͏���5Nk֗�){I�B
f��4`�f��9���Fͦy��䝢�<�A�V�EUl�c9�����"hAXv

��������%��y�l�9���"[��X�����kV���SdX^�G���#
p0#`$op'oV�ݼ�0�M�վ:-d�
1��|%"
+��9y����ӥ,5L����H9���r�}U#pç��W0��]R����PL��k<	��x>o�x�7��N�)�3�
��~�
+
+V@�Z�\}@a�5�J߫�
t
=S���u#�� �j�h���
z��1�s8n�F*�4`F�H� �Nެ`�y'a0�۟U�#�z�:D0��(���)g�&��^h>b�Y�MBd�P_�t��T���&s�f^>4?�z��Y�
#@)�]R���ä`��9���F�y�ݗ�\���k���X���ի��*Ъ>d5�%
�S=r�[�-
�9��i��io�jb�ų��(�X���6o�L��(I��2D<�`�3�O=-�u�n3h�j���DF �4�k�C��To��P��Y��ȹc��ޠ�{�I��l�w��1"-��qĻ
�
�����|z3�m��6e�¼�&��kX*QO
0�Ӓ�9O�獞���<�Cn��ei�67�=ɏ���Aˉ�w��U�(,��?H�k�Lt�'w��%�$FN���oޔ,sg����2����!�����D2��o@��K}<O-�Rj�r���V��o��4��>Cs�p'������`)���XlV-��n���X
�R�9��<�uAy�� [...]
y��R��m�_a
��=�O機T�X/#
+�#�$ʟ���
l���Q�gI��M������~[�
+�9�U�?��Ϩ~f���;��?t�v�>�p�'3Sr$o�u�7����;a�a0���0��<6Sn�_����xN��|i�Ո(�
M;�T�N�s�X*�ԒD<Fc؁;N�1)D at a
�"B[�e���D���;��{#cY��n����8L��i�'l�h6h�Cɠ����N����'͒���)z�g�==�
��@��f�̘%�7�e'o�,�y'�%�`��,ab3��� @� �$=,t`��+�id�@2FO�B�#4�q'���5���BD��(�$t����蟍`�G�9
�K���f�߆6��[\���-n����~��T�y�5�����	� 2�S���N0n	�[����yI�����F�K��=��w���
�v<�8f�h��4�fC����2iT���m&���qBL-E�c
q����n�_��KЂ���6� �����		
_86�����G	*�޶s� $���(�M7�7��S&��쬧b��A ���A �|� t���ߏą [...]
+endobj
+6798 0 obj <<
+/Type /Page
+/Contents 6799 0 R
+/Resources 6797 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6786 0 R
+/Annots [ 6802 0 R 6803 0 R 6804 0 R 6806 0 R 6807 0 R 6808 0 R 6810 0 R 6811 0 R 6813 0 R 6814 0 R 6816 0 R 6818 0 R 6820 0 R 6822 0 R 6824 0 R 6825 0 R 6826 0 R 6827 0 R 6829 0 R 6830 0 R 6832 0 R 6833 0 R 6834 0 R 6835 0 R 6837 0 R 6838 0 R 6840 0 R 6841 0 R 6842 0 R 6844 0 R 6845 0 R ]
+>> endobj
+6802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 706.991 178.9758 717.8949]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.7154 706.991 230.522 717.8949]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1177f236d8c66c01bbb43b37ff90bc7d) >>
+>> endobj
+6804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.8591 706.991 322.9245 717.8949]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6806 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 668.1971 178.9758 679.101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.7154 668.1971 230.522 679.101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c05ff6bef376a2835adbb0ca123a8e79) >>
+>> endobj
+6808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.8591 668.1971 299.6819 679.101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+6810 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 629.4032 179.5535 640.3071]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 629.4032 250.6661 640.3071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_60d9658ef91fbd3a1b0064253246f36b) >>
+>> endobj
+6813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 590.6093 135.5791 601.5132]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >>
+>> endobj
+6814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.0772 590.6093 155.2252 601.5132]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1aabacaac0806d617f53db4b34b3349e) >>
+>> endobj
+6816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 552.1889 162.6769 562.7193]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_2a0bc130f7cf6a0678ee3b982fcc7ab6) >>
+>> endobj
+6818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 513.0214 187.5633 523.9254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_41227446c918730e97998799bfe04da6) >>
+>> endobj
+6820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 474.2275 220.7685 485.1314]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_76fce1702224700691a26cf5e780a1dd) >>
+>> endobj
+6822 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 435.4336 168.2162 446.3375]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c915c8d26a7dbcdbbd0c4985ec5b7d4b) >>
+>> endobj
+6824 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 396.6397 226.3077 407.5436]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_811f6f947785240bcb76bfca023fed17) >>
+>> endobj
+6825 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 358.2194 297.7285 368.7497]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) >>
+>> endobj
+6826 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.5441 358.2194 336.7317 368.7497]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+6827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 319.4254 283.3526 329.9558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_cdc0aeddab3d98e336719f42e6e5b06c) >>
+>> endobj
+6829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 280.2579 191.7178 291.1619]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+6830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 280.2579 288.8524 291.1619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_13419c5d820bde20af5eabd23e479ec8) >>
+>> endobj
+6832 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 241.464 191.7178 252.3679]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+6833 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 241.464 303.0791 252.3679]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c3e03bc2df621903d136c689c38bdb6f) >>
+>> endobj
+6834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 202.6701 201.4711 213.574]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_ba6b40a4b9708e94d6cd10f54144ed70) >>
+>> endobj
+6835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.8082 202.6701 293.8737 213.574]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6837 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 163.8762 182.0442 174.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1f0828932daf26d10e94120c1f4a4d6b) >>
+>> endobj
+6838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.3814 163.8762 274.4468 174.7801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 125.0823 227.9814 135.9862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_68e8cef74c6b4b5a56e2c791f41566e4) >>
+>> endobj
+6841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.797 125.0823 297.4402 135.9862]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.9428 125.0823 407.0083 135.9862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 86.2883 272.7831 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_77a904793c99cfb1d61fadd277d59471) >>
+>> endobj
+6845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6800 0 obj <<
+/D [6798 0 R /XYZ 90 757.9346 null]
+>> endobj
+6801 0 obj <<
+/D [6798 0 R /XYZ 90 726.0541 null]
+>> endobj
+6805 0 obj <<
+/D [6798 0 R /XYZ 90 687.2602 null]
+>> endobj
+6809 0 obj <<
+/D [6798 0 R /XYZ 90 648.4663 null]
+>> endobj
+6812 0 obj <<
+/D [6798 0 R /XYZ 90 609.6724 null]
+>> endobj
+6815 0 obj <<
+/D [6798 0 R /XYZ 90 570.8785 null]
+>> endobj
+6817 0 obj <<
+/D [6798 0 R /XYZ 90 532.0845 null]
+>> endobj
+6819 0 obj <<
+/D [6798 0 R /XYZ 90 493.2906 null]
+>> endobj
+6821 0 obj <<
+/D [6798 0 R /XYZ 90 454.4967 null]
+>> endobj
+6823 0 obj <<
+/D [6798 0 R /XYZ 90 415.7028 null]
+>> endobj
+6828 0 obj <<
+/D [6798 0 R /XYZ 90 299.3211 null]
+>> endobj
+6831 0 obj <<
+/D [6798 0 R /XYZ 90 260.5271 null]
+>> endobj
+6836 0 obj <<
+/D [6798 0 R /XYZ 90 182.9393 null]
+>> endobj
+6839 0 obj <<
+/D [6798 0 R /XYZ 90 144.1454 null]
+>> endobj
+6843 0 obj <<
+/D [6798 0 R /XYZ 90 105.3515 null]
+>> endobj
+6797 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6849 0 obj <<
+/Length 3041      
+/Filter /FlateDecode
+>>
+stream
+x��[Ys�6~ׯ�'����>T�˺b��Z��}ʦT�X�k9�e��o�$ ���!�r<c~������8H�#
�J(d����
/��ߟ���
+��B�߯�.�I�0�H*W��I���.�n~='Q�\����%��Y�ͮ?,)>�o���2����\f��������~���2���rE>�Ɏ�����6/�D��u6	S�J���ꇳ�<Ͷ�IbI�������Z��F�h�x�/c�b{�)s_6g�����4���c�4Ӌ�HK���H��Z �#lͯeK�}P_h��6�����
����W��h[��<��0!���U�Cހ:F���ش�ⶉq��i>�w�����4����p���m����A��ڞ��r�~��6�	&a��@\s�z��l�

I��k�}qL6#+�L���5&�Ƞ��nqx�R��'�
+I�PD��|o3��`A3N&G�4QE��A�`��sę�
�#Ha�
(ï�`���0	
*�pd��]������/��{~���|
8|����e����A�@&���P)�� �U?�X`�C�$_�w�j*c��saNч�FD<�R|{�����~L��b����KVٮj�n$�_�YU
a���fr`H�`H��
#)�I�
K���`l\���q��R�p��pl ���
->�b`ײ8>�S�a��j�@
Jy��V)�k�
�P`���;|����e�+&z\(
-v�X
(�R	O�ބ�_=��05Z8P��$
+���(8�e��1;
�fd
+�*��OȏEu?b�($
v��ӈ��%���e]{)~��L��3���
,-:������z�	��E��{���Y
�Z�}~����]�����!��g��C�@	.s$��EdL�(�V�̍��'��ΐ!��� 4��w;�r���"S�SD(�!������ٗbw7F�1D(y�݊m_w�.k
�uv��E��bZ*al ��)}
�]�
	��m'WP4��
>o�����]ܿ{ح�b�,b{Kx�	��s��
"��aIe�z|V�_��
��&]ֈSez�#���S
vg(&H`X\Ţ@ań�˓�b2d
�H���;�sS��Ef*I��<*�Ck�Խ�	ct5G%����s���S4v-����Yy���C��0B�t��
5�XxT��
+a�D�ī<6y�z�>QP�����m�� ���6��o�f[
̘�C]������\�
+b��oY�ϭAP�q�Z�zXZ��1����J��P:�Q��xZ�Zx�A��
����0E�B 
��i�#i��R4=����6��!E��"J�{ɣRΥ���^�&e�Yd�ܞ�����y2�4��8�]+�J��fz
�*3�qy�G^��&�kK��
Qf�#��\4'
o˝�̊�xyY����͉E-Ko�?��r�*��\A��u��6"��aӊ
��$���?'����h�^(�)q��?�8�c�
1���f�
�z^���K�� �崜
(;��	-�����#Z��봼�wZ�����9*�5>�a`w��KXsE�``�E�,9��K��Ϻj=�ݰr)��
W
���"5�eȴ��fi,�v��'h
���s����£R$��wH�u�
+$�'�y`#����:w���jDdm���s5�bt�C1�t��
nb%��/(Ұ֜ʔH;XZ��1����"
�Ml-t=��ZHpح����;;ή��C>�ͫ �(�[
j���he=�Dyz\��6�z}<d���3
�5������ڡR4�B��^����g��D��
���,8Դ*@Ċ�ö-�l�\����(�pc[#�I�)ӽڢ��6��A]����I$9�T���<(΀1���]
+�
�=ԩ���.�����t1iu���tyXR�B��J�u���{
��'Ϯ`���=
�B��)F��5�]Q٦]ftx���A<
�������)]�1#O*B1ep0��>*}yX��y����X��Dͨ=Na������
�e{ܯ�������9�
g4�۞P��x���)Iy"
��n0�wV�C��R'����X��(K�ݒ��b�
�N��3�
*;��S��a�\
Fr=���z�o����$,���=ѻ@5>Eg`w�] �0�p< 
�` �$$ ��
^
�`�>; 
�r?�k��կ�y�w(�P���9 �J0�[��� ��;U�N��B��a�eos�����!�V&�+_����@not|C�'�����B�����W	�`Hc��L�}�Qӂ$�v}�*"�1z�O�F�n�ɪ�f�h��!V�8b�<��/�*wa�*�c�n��v���6�Fp�|��
�V�ވ����VKjk�㳶&�:m��=V7���cU�Y�.��M7��V�ƴ�:|����%�?<�*$>	��A�����w��k�"/�JЫ���^�lz����:2=1JQtv =>�ph7==1�Q���ȣR
l��@h:
^�Ŵ��FoNP��DD�
����P

��n3̯�	!ӪGQ�`F8�K�T�ai�
Ƥ"��KE�w�B�A��]�uds���8�Ư��j�h�C�\K�~���
��%t����n�ç
�Zꬭ_yK��6r�G���=&R�������	�@ |n|<>E``w^|V�Y
T"\�w�³���AD@�$�+P�`���phQ�6���-��Z�n-!�p��t�?�SM��]
�۫9��k���zV<>6��_ijĉ橳{�
+"��i�8O^�t����"jw��6t}��tƋpq�}�a���P�@�9��;Pµ���9�{��$�H+�f6���
V�\������xP½�q�}+��j�����

'2�:����Oq��q�{M at uDw�k���
�%بL`0JdS�~��ͻ:�J��L@ A�iw?�%a�^�ռ��گn
j���Q���Ǽ���d�n���
����/�T^>�U|(s�lT�z�ʇ�P����D�y���}�1HU��U�f���&�چ�W����������aW
JTT���ϋc
r�X��V
4��	?��B*{�<�r�����K�.*��6�����#�(����sendstream
+endobj
+6848 0 obj <<
+/Type /Page
+/Contents 6849 0 R
+/Resources 6847 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6786 0 R
+/Annots [ 6852 0 R 6854 0 R 6855 0 R 6856 0 R 6857 0 R 6859 0 R 6860 0 R 6861 0 R 6862 0 R 6863 0 R 6864 0 R 6865 0 R 6866 0 R 6867 0 R 6869 0 R 6870 0 R 6871 0 R 6873 0 R 6875 0 R 6877 0 R 6878 0 R 6880 0 R 6881 0 R 6882 0 R 6883 0 R 6884 0 R 6885 0 R 6886 0 R 6887 0 R 6888 0 R 6889 0 R ]
+>> endobj
+6852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 696.4929 150.493 707.0233]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_081718c23b5785da17c63ffec13536cc) >>
+>> endobj
+6854 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 657.4998 156.2812 668.4037]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_0fafb66fa4df451fd3e2f0392329f27b) >>
+>> endobj
+6855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 657.4998 225.1623 668.4037]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6856 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 618.8803 203.0652 629.7843]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_e1887d907ab06bddeaa2682bdf94d268) >>
+>> endobj
+6857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.8809 618.8803 271.9463 629.7843]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 538.4583 202.497 549.3622]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [202.9952 538.4583 240.9624 549.3622]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_edf9116549ffcced7a39f4596e65e5d0) >>
+>> endobj
+6861 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.2995 538.4583 345.5491 549.3622]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.8798 499.8388 209.9452 510.7427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.8914 499.8388 259.7141 510.7427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c061731c4fec7f60c48e02ed9806b4bb) >>
+>> endobj
+6864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.9475 499.8388 379.1971 510.7427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.543 449.2641 209.6084 460.1681]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.2179 449.2641 260.7244 460.1681]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_065895a1428f9dc6b3002818686eff0f) >>
+>> endobj
+6867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [302.2843 449.2641 379.5339 460.1681]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 398.6895 203.0748 409.5934]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 398.6895 296.3242 409.5934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c74dafaa0b06e9cd3d15ea0d2af1b213) >>
+>> endobj
+6871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 384.1861 337.6368 394.0914]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 360.4436 194.2975 370.9739]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_041afb1a2cc7277572fb7235cf08cf64) >>
+>> endobj
+6875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 321.8241 188.7586 332.3544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_e94a99f8e8d290b5791baa01fd540a14) >>
+>> endobj
+6877 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 282.831 226.0185 293.7349]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6878 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.7582 282.831 301.8435 293.7349]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6) >>
+>> endobj
+6880 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 175.4825 226.0342 186.3864]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_082a74ad0ce931ec2e517bf0f009daa2) >>
+>> endobj
+6881 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 175.4825 386.2414 186.3864]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5988 136.863 160.9647 147.7669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1a15765e7fd1f486a9ee12a061dc4c76) >>
+>> endobj
+6883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [169.4639 136.863 345.6117 147.7669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.3612 136.863 513.9963 147.7669]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 124.9078 155.7331 135.8118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 86.2883 180.5399 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_3075c67d9868fc0b483db13256fb4e0c) >>
+>> endobj
+6887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 86.2883 272.9425 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.6756 86.2883 379.741 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6850 0 obj <<
+/D [6848 0 R /XYZ 90 757.9346 null]
+>> endobj
+6851 0 obj <<
+/D [6848 0 R /XYZ 90 715.0952 null]
+>> endobj
+6853 0 obj <<
+/D [6848 0 R /XYZ 90 676.4757 null]
+>> endobj
+6858 0 obj <<
+/D [6848 0 R /XYZ 90 557.3147 null]
+>> endobj
+6868 0 obj <<
+/D [6848 0 R /XYZ 90 417.6654 null]
+>> endobj
+6872 0 obj <<
+/D [6848 0 R /XYZ 90 379.0459 null]
+>> endobj
+6874 0 obj <<
+/D [6848 0 R /XYZ 90 340.4264 null]
+>> endobj
+6876 0 obj <<
+/D [6848 0 R /XYZ 90 301.8069 null]
+>> endobj
+6879 0 obj <<
+/D [6848 0 R /XYZ 90 221.2653 null]
+>> endobj
+6847 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F99 2085 0 R /F52 345 0 R /F104 5472 0 R /F36 2201 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6899 0 obj <<
+/Length 3146      
+/Filter /FlateDecode
+>>
+stream
+x��Z_�۶�O������/���$i�6M���I�CK�$�����w� (��(�n;��݃Hb��X��v �Q�g3KgZib��f��
����oo�^��"&������fjf��x6{���1�8㳗���n�R:~��<����緜Ϋ��X������u^?��}[��W���Λ��]pE�_o���]�(��-3�b�,�'Z�y�n~���7/;5�,��*���ǟ�l���a��=�
%�Z>��H.���懛?w|�@�B��*b��-�$&��D,[��h��Pd��\�)�U˙�f�ʸ%T[3��д/��X�8{X
�
��PA��>���X�ZOT�q6�w+wQ�6��
+��"�&�g̿�>�_��3��%,�
�w���5�a����oE�����3�	��L3N���F�u���l0d�����M�(@8���YG���Ĺ�
oq%f1ñ��Kr�$�fY_��ڌ�
+E�f ��{O�"� �_�`�5��.���H�	�x����$][����*��v�f(��*)ͯ5A ��È+�0 ��"�%��v�
�%4GP}
>{��E^��	�,���EGA�1����G
+9m����`$��5
�+�9�Ȍw��S�=�1�
��*���#^S�Oi?�3-7��^�G�
J E�%�d�>b8���r;���
���]uh�"�:�6ڌ	��j��@I����3���
��
+��
��*@�i{uT��
�An�”���a"9���W������"��^�:�C�$�Df�wuTt���U����J�df�IX���@�Z����
j��n���
���
�������x$���r�SD�o�~S4y�)< ��8,�rߔ���Io- �@$�%k}�޹�pW�rWx��u�-��wN��:��r״FA�
�ܧ�/w���/���>s4���Cۊ� �Ô�)t��E@�����
�^Q at IF
�
tbF�������k^�+�M��T�\����]�9U�C�7��D�	T�S���M,4?��+�B��m
$m���Q�� �a�
`�M�ʉ�*Km���	oK�Al/�ֻu�F-�Q=��̲�
�h����1/��H
�IU_��`&":0
����	��zF8�ɑ����:,���h)�'c~��eR2�
�
�=K�)�գ����iD0威첧NI�\uZn竱�|�	g���n�ގW�%�8묱o0ET�+�Ա��3k�?�UXH/(�6'����pk� u)
xxŎ�B�Noj-:���ek��,%
G�̌m\%"JC�Kp:����JDt����a������{���dF�Q�ņ����í_y2B�TerH�֊s6�X^�9���k��y�P���6� y ��� 5�ڳ�L BGv&%� �� =�q�j�"(p5fB��O!�V����eh
C����!p\�,S� -
+�Ԡh؆��@� �>�����`s]��F$m�F�D� Β�(�;��Էa�.��3�ކ.?��"5��I]-�*��Q��>��e�mp=	x=
��`����Oi-	��!կ\`�:at�>3�d���A�����a��<��J��U�eF�$}t�>�
D��jܐ�)���nR
����
+��
�����5
�
ˍ7U>�"��
��T��A g�ZwTc�IC���:2���|��Ŭ:op3��j}~��C�m��aV��r����u��o
�W�
מᲪ�Ⱟv�n��q�l�7��	�v���p"�3�>�z�S��?{�`����@���J���*l��x- � �X0F�R��`��l-X]���h��s�Z�[�_^���`���v����V���p��
��i��ү$�V ��]�}���
�%,
j�i�������L:��l��p��Q7K��ϒ�.����

��U�[�o����
Y<sxzXW�ͪ۷���5�'����m�/UG$!,�7�
���(���
w��|h����=C^��Pn���6:��Uu�¥�Y��[;��W�5�:�����xݢ.��Ej'(^\Pd�aE�M	jT��
�6���U�qE/������ǭ"�����<p�o��I�n��vvߠp�c�U�pR�*
X��D0�xW*�����n�D
�?8
s.���V�屮���n�A�u�k��\�~`���8{��2������7�b�F�u�\}��v6y	j�pI����N�,C"
9�#C���۪]��t��rp��O�
L0?
`ګ�*�٬.���f"�����>�Bm���
Ж��òa
�uY�m���`�t4.2�;'9�mk��	wg
 �5���N1��_4�OVS�8M8ک#C=��M�� _�#�QD�gg,�ѫ-��Rv
���
m��� �(��K���|�ƥ�MVWv��G�y[Oɏl<T 
H
Y�L�ͲZ���p�llK���l֡ �����_��2�}"��^qm�
�����^�
�H�>�ɇd��2f�l����(�:kE�ʩ�7�~E7q��C�� �oP�ͮ
��|* Y�@�
������t�/�{�l�c�w��
��l!0U&QAF���_=� �D/z2 ��.��+Z��G
��l�P
���*,�u�q2t�q�Y���d�"J�+W0&�X���_X�6<fL
+ �V$V��_�Cб�����$r2N�ǡb9c����$%�U	���M<%?2�P�4rvd
r
+6rA�w
��G��Vt���ۚ�y���Ї ?��in9�s�3��!>ڼ�m^�$cN��%`T�Xlz ���r
�� ��SHz��̕v{`"��	cJ�^�踣�O��	�|1�ݗ.�N!
+
(���.q�}��� ��[��7�{]�)��*��N�8 at d��8JmR2y%&E����!��
"u�q}N
nZg�D�SX@�쓾
wߎ �b�8yE�D��z�~�Ro}z
>�w��[yw�CQ�w���1�
s��e
@ԧ�SP�B;ȵ��я~(F_q���ַ���,\�!��/,�7�jG��C�8�u���>}xx �9��}M���~�y:�ʉR<
S���F���/�A3MMO����Vu
�p�7�&�@Œ���pQ�endstream
+endobj
+6898 0 obj <<
+/Type /Page
+/Contents 6899 0 R
+/Resources 6897 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6786 0 R
+/Annots [ 6901 0 R 6902 0 R 6903 0 R 6904 0 R 6905 0 R 6907 0 R 6908 0 R ]
+>> endobj
+6901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 696.0186 178.2386 706.9225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_8ab7b9abebd48fe0ad129a237338aa96) >>
+>> endobj
+6902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 696.0186 270.6411 706.9225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.3743 696.0186 377.4397 706.9225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 657.1977 226.0342 668.1016]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_6fb154017052c68b63121cef49c568ce) >>
+>> endobj
+6905 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 657.1977 411.4566 668.1016]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) >>
+>> endobj
+6907 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 557.1584 242.8851 568.0623]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6900 0 obj <<
+/D [6898 0 R /XYZ 90 757.9346 null]
+>> endobj
+6906 0 obj <<
+/D [6898 0 R /XYZ 90 619.9094 null]
+>> endobj
+6897 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R /F79 571 0 R /F8 568 0 R /F7 574 0 R /F10 488 0 R /F13 577 0 R /F6 565 0 R /F9 602 0 R /F12 664 0 R /F25 348 0 R /F33 485 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6913 0 obj <<
+/Length 2662      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s�~���[�v��
�3}h:�N�6�fݧ$�%��"�$���{p�@��d��fg��YR��p��9$�a�#3�gJ(�����
+��a����K�_�_�\��Z��FZR9��X� A	�ݬ���X,	�x�~A�<�������xz��uz����N���wu��}��Y��U�XR��-Ҧq�?d��^�d���
x�؜J����۫�n�m�S&���ǫƳ5���+��N��~`D�����,�(�>\����&�C��
HC�H+�3E�R0+���O���i������,�_���T��Y��6VR�wi�n�6��L�ȳ�}p�i㮏YQ�#�@���l��U�~V��?�낈9P���lWgMV����=�� @
H
A����U��w�W^�ߗ�O�UZ�h�dpԛ�}c؀
�Xj�#�
�
ӏ��'�q�0O�{&�dž�@��S�U;���1%���{"vw��{7��h�ذcaS�Њ
q.O�Ό<J+R`�D2�);��"Ny��=v�˘ܹ����*L�x�J�W��cߓ�p{���t��	
L?����Ч��߀�|1 ��FBr�$%��&��_����
$7�i
�(/z����>/���]�$��f��<��7��۹��>���e�̛*�I=q�ܦ*�jA�����
y��T���k�~_��O�lgp=�MAA�_�͈|J��lT����֙	g�VfIQ����G*��h�S�����@�$j�$�|0p�eLu�J�0f��&H$��fٯ>��]�ݑ��xj�H����
���M�&�
{w&���b}
B�A3>�Ty���r�V>H�
E�
~J��@�T%s�����CH�O#�H:_��,�<
���N��5��5�`�,q��C�/HGD{:�\ˈ�:2�qp�X	�p���t�����Pۖ��wZ樹��g#�	�
Tc
��y���[k4F�Ļl�(�Ի�qY7�#�����<�M0������4z��=?>�(��V0'���|�m��m �xw���x�'���4�����A�3�;��N��� "�)
d/1�O� R��z�BHB �%����6/ҺxZ �{s$O���'�أ)bG�����ы}�9_g����{�#:��#4M��1}9R�����e1|�����(����"�)#
dcF��&L�bdR��
~y�#fP
`H� >���^�iў��P�q}Z��}qB���W�`/Τ2�+��`wi{YLsw������7�� �q��S?���[C����%���i��c�J�w=��ey���q��DKv���ؑM�
}�N���xx�ф&�j�c3�P�9�q�!�����`f0rW�.����sܫ�xrC
	���E�v�ۥ_Yv�
L��mV6�g!�eue�P�q+��t�
+��*ل� {<m���&M'z�
��)ߝaJ͛lU�k7�J���=�YWe�*o{ρ�l�m�
��{�#0�?��^��~k=��u��K�%:mw0��R]3�SC�P}�:5 
'������i�Fݓi�5嗂��|�=;�i��=��H���%ނu
���{�9��9��6��]Q5]lGD�6��S&
*�jm>����#]
-?\i�C@�IT����K��w�
C
+n�	�]���H��`�X��� s��2ץJ s�����ww������FCo�a���a��D2F� 4�"���W ���~�uW�M�!��t]V�r��8�/|���,��&�G�!�˨���xT�hl4���6<�)�D�#�VX���Me�Sd<_3 ~����1�T@d/���Pa~��v*����� TN����o|����;g�վ9Ԅ���,��h�������z
+����Z��<�i+��M��5��/cl
�lZ����&\�u�=�\lwʒ���^�e�f
��p��k�0�J^6mZ��7�o�a�O:;�
�a&C
�)�
�8�A��wN��);��<9Zn��w}� �I���c�/l��v�; �M���A0�-v�	�Ǩ����$_�Z_�c�8ݑ��i2��D��EB�w&��7A�j�_�D%�f�5���PT��~��M)�z�l��l#���q/�J�MW����X���**���y;S�#VJ"!W������Vx��a�ڑ�
�7����3l��ݛ}ݥ�D��l}ҙ�Nc��'!L��&
���g)
�f��ֽ��0
w��?��:
�F�!�0A��+���I1�U�>��MJ
��^G�L�6�*ĄT'����q��> 9�L��W"��a��ט|"�vd/x�L_�J���!�h��j]-�(������(�€/�/;�
#��� }���K��
���pw
+�{���5;���r�;X8�҇b�p�`���~θ�]�k�ײ�p�7|q�P�ռ���O��@��8ڡT���%
�A���P:�Rϼ� �2�i
+��;C�τFB���>���P
+��/K퇴2��I�.Vm��1�Ǘ[/���#Z��I�~����?�����ܧ��7��_'6�l
t��UFe��Yv,���
*=)��_f��o��v,�'��
�|��
��mw�o�>>>�U��e��Q޾�튷���#M!�Lho���'~..Nz{��۪_��0����Ď���[�7����endstream
+endobj
+6912 0 obj <<
+/Type /Page
+/Contents 6913 0 R
+/Resources 6911 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6786 0 R
+/Annots [ 6915 0 R ]
+>> endobj
+6915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6914 0 obj <<
+/D [6912 0 R /XYZ 90 757.9346 null]
+>> endobj
+6911 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R /F79 571 0 R /F8 568 0 R /F11 416 0 R /F7 574 0 R /F25 348 0 R /F33 485 0 R /F76 580 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6918 0 obj <<
+/Length 2695      
+/Filter /FlateDecode
+>>
+stream
+xڽْ���}������903�N��9�����AVmA$H�L4 j�����9 bp�n�J���t���
���)<�\"�B1[��l�_^����E��������R���jk0�8%t�ڼ
A��c
��
��1�{3�8���ɦ��~L?q�y�|Y����I�q���8������M�I1'Q�d�p&Y@���_�pu�j�t��L��W����N��FLE|v���xRV?
��^���c̆!a�6[p�$�j*��H�ܰ@�ݠ�"�0fr&�@D���O��ؽ=}��k���d]ه�^v 8w�H�#�)���Y��
�
T�]N[�,�$�_�i~�&sʃ�s�`�9��cR��Mi�"�7*8���n��]�������c�%n���g�Zg4��l��Y���<8
�����;�
+$�
$8�U�g���Q�U�E� C�sk��)^'Vě�d%���)�r�Y}>9��	c
+H&>��c���M�ʰ�K�ݯ�d����1]�IV>u��I�
�i�y���Q[���2$�f܆7c!�*+�������9I�b�=�
��
��,	���kyݧ�ξ���pP��Riܓ}H+w--�)/�����5�
�x�NJ�=��{{W����S�1J����:k��Q݂�0x��2�����b�1�F؜xG,�'�E�ٶ=���eC\�!Sˠ
������#/6ڨ����J`!8�y�sl�is�"�&� `9HI
��3��Z�(T ���Є(*����Cn"Xꋴ��ɭ9r��A81��M0sp�"Eè9�}�!&B^r �/�>� #��cD��"�p��Bƈ4�-0
�BH
I�������)ӆ�จ!>'ŀA��$�=�� �4E
⛈�6�c�S����2�*k��A,&�O3���m�QJa�	>��qp$.:~z�4 [�p�E$�
�󠁓��L1"�'zl6D����ǹ���.�
���h<1�6�
+�J�-p�����0�n-�R\�5A�P�k3���w&��G}LsT�/S
)�E�%����� _m�_�4�DߺD�owd�}�
�lsx^Wb-:?B]w7�N�Z��
��.�c5e۝�����^��Y@�̻k@��?w��������
zr�
�xp��}s��Q}f/���8�J[3S�m~���z��Rb��"Bc�{\�1T$�B�4����D*z�
+W
!���yg��kF�ԓi�a4��FЛ�cZ�E���48`Uo�����
��ŀ��=@;9�ɘV'��+gٺ���,w[c��	�b��n1G"��B&UTՕn���'�9��}t�\zE�cQ'�$h
=2��'�N6j?��I
��"j�3��`Πeˠ�H#:k��d�8���y
�[ ӝ������6���	%
�H�{�{'�{���烓���Ӭ��n������\-�5F�#���T
|JS5X���P~rn��0�8�6���
O=ߎ�G�!#ml�i�\�&�-��}w,�x��em�cC��A4p
��2������PO��9?`��	�����}�m�*g��/�����;4����5�v�_֢+u�a,��؅u
��|�&���.��<۞K�MZ�/s��ʰ]?����i�LKM�VK�?;��w;̹����#�j�.�qƆ;W��(Ċ5�@���v=Cl����'b<���F��I~=�v�fF;vL�y��](�Z��<v�N�n��FF���{�@��(�fE�no浈�������
H�d�ԍ@����MV�W.jg	i�B�aK ����I�r���0�e[_�zP'���*_5yΟ#�ot�E�ҋNO�Z@�/��$t�/'28�h�
 =��<(�cLjb�Tj(S/���G�	hc8�<w [...]
+�ɩ6%����/�~Z�CX%
��P}�
K�! ��M��6�s���u��x��z
�CW��l���W�D�
�8�rƜM�;r뙁_�����j��pB��
F�@�s|;�o�
`���Jt3e5�~�`���s�~r�`M��*hڂ��Dd�j3㴏���\��z�K{ ��iD�'Quu�
�YYx�����)�j���.�4�c(�q��[҄r�Oc�Iu.����/'���l�"Yג
����\
uE���eP
R.����}^T����v�
c��BY;<�&�!����
Cq��w�w��B!�	=��y�}�B~�z�7�'�B	���!>�	>���r�m��뗮���}��I]����[4P0��68��
!� ���Z�3^*��P��o����\���>�$���Oq�GBd>�V������(.v&N����)940]6|��
	�-6V��v���f0��6��>?�:��Ҿ�ڠ�w��wA]�E!�&� $I�D�"��7�	�E�K����h���m|�g3GE��J��`���%"��M��0Q�Wy_�/�^}�$a�Xg��=M:�+��w�s��u����
l*r���d
`�X��Όl��6IzQ
�Q(
�/%��ˬ��s+4��
�L��e���|���������
�Kt��S����t:\��
��*J6��E���
*$�<^�)�1�[`��
�ό�
i�`�?np�\endstream
+endobj
+6917 0 obj <<
+/Type /Page
+/Contents 6918 0 R
+/Resources 6916 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6786 0 R
+/Annots [ 6922 0 R 6925 0 R 6926 0 R 6927 0 R ]
+>> endobj
+6922 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4448 231.8263 329.3499 242.7302]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >>
+>> endobj
+6925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.5575 140.3623 211.623 151.2662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6926 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [212.1211 140.3623 438.7787 151.2662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_edf9116549ffcced7a39f4596e65e5d0) >>
+>> endobj
+6927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6919 0 obj <<
+/D [6917 0 R /XYZ 90 757.9346 null]
+>> endobj
+6920 0 obj <<
+/D [6917 0 R /XYZ 90 390.4795 null]
+>> endobj
+5570 0 obj <<
+/D [6917 0 R /XYZ 90 368.1677 null]
+>> endobj
+6921 0 obj <<
+/D [6917 0 R /XYZ 90 368.1677 null]
+>> endobj
+6794 0 obj <<
+/D [6917 0 R /XYZ 107.7135 291.162 null]
+>> endobj
+6795 0 obj <<
+/D [6917 0 R /XYZ 107.7135 275.9518 null]
+>> endobj
+6796 0 obj <<
+/D [6917 0 R /XYZ 107.7135 260.7415 null]
+>> endobj
+6923 0 obj <<
+/D [6917 0 R /XYZ 90 218.5807 null]
+>> endobj
+6891 0 obj <<
+/D [6917 0 R /XYZ 90 196.269 null]
+>> endobj
+6924 0 obj <<
+/D [6917 0 R /XYZ 90 196.269 null]
+>> endobj
+6892 0 obj <<
+/D [6917 0 R /XYZ 90 89.4414 null]
+>> endobj
+6916 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F8 568 0 R /F11 416 0 R /F7 574 0 R /F10 488 0 R /F13 577 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6930 0 obj <<
+/Length 2126      
+/Filter /FlateDecode
+>>
+stream
+x��Z]o��}���SJ�x�?�%A�@��]�/���H�MT��������RCr4b�-��0$�ws﹇���Y�PB!ø\����
N��"�r����뛫��Xd$����փ$HPB7�O!��eN0���%�YQ?��g�헇rS�?T?�E�e�zWW��w宬�f_/s*p�Ͷ8
���]Y/���ݺ��)�Q���o�������W!�$�/W�>��V��F�h�x���1t�x�)��W�~���
�X0as�A�R�S4C�Gd�`B�E]<�M�Y�x��
��jW��
\0��j��׾����Ψ cI��b(�� 'Q����_�E�h�dg���n�3%Q��3B����s�V���zoW�$6;��2��g�m�d�;��	c���]s��E�
W�6�n�a:L�M4FF+��nb3s�^��ĺ�Zw>,����������q�Q�<��FSх��̧j��C
$�ȱ)�j��
��p(F�8I9o�}(��z�k�y(ݗ �����}n��\76q"k��!R�f0�F
p{�b�qN��oe��H
���D
[F}"�Ycĩ��:]}|���C;��&��� 
򙙅�
,��_{���6�J���p@[�C��Ϩ�GX(��h(�!�!�DV�5��R��P���.�s�:e�2�icDr�[] 3��+“�xra����ݻ����߀�Nd5��!y�2
�����7
�+�ȶ�1-�,��N��-�f	�bD��]l��2���[|�o
"�
+�T��|b$*?�I���wN�e�l��Tl��Ӗ��
!Ƕ'�����
�Ȫ��m�?ېۧ�8�(X6���%D�Q�z!�:�<
ɨ��hFM�� � �R��qzy�
�@� ��
�{4���j��F���`�k��|
��� 	lX: ��@SoN`���i�$�-�k�-��%Y����µ��e@�Z%��*N
�Q
ZMu�6c�
XQʽ�Z�mE
W��)R�������P0�S���W
��lV�j��8{.��B����ѐ� ��魦`�=
3$aˆ`n
�ݙ����.�?��V�&�?�|��d�e�"R.'��=Q6ej���y-ϲ{{�v���쬘wR!��q���jy6O�������g)1�2�~-����ng��:����4Q:� C��ڊF(�1��t��J�s
���Jw�yh�#�s4�@�+3B2��6C�c�e�%��]�j��X�0l� Ib�{�
h���"]bD(Ws����c�w�H"�D�c�[] 1�։tH�V��
H��n�7�t��*�9�O+�g��p at B��fo�Cl�DzP/��R"} [...]
h�-!���D:Ӡy1i�
Z��
k��J��豹}"��{��i�d at N}&��`�
5:�����
ʔ�|k���
�i�����n-����4�D���mT�2
������aٔ�P�����=~+���X/Ncz���z��ѥ�1{��#���-�t^�V�5
*rD9��1���1��M�P
#S@��PEA�2����<PVTϿɏM� �	�8��f�#�dDN2'���@S�@��6���MiY�WwM3��2��2Ho�Y at 0��}]��7a�!����'+}ڋ�*�
���T;w'�b\`F����s���$0m7	�|
W��mi���on����d�����c@��\�;��y`
�9��p�ۭt!�s�l�B���Bx�w�(�j⫏߸�P�9d�f
��6#��mfSY7�ձ{}�K�dW ڱrN[�Lg�{�8�vB-�Z=�����v
�����<�F��L
�:A�c
q
�^G�`�X|�$N�!�s"p��C��U��H+��fr��J+�����>�u2�
��l��l8�w�
��&���d�¾Q,�;xaB �~������
+8�*�T���5
�t�x� ��.��Ї�
��X�Z
+����[�k[|G����v�ܞ��P�T��69��X��g��kF2�����E�����n@
�pܣ�%O�څ?4�au}����G�5����a{=y� �j(�%v/�&X��@URa=�rב����Q���ca�M�%D��
U�yendstream
+endobj
+6929 0 obj <<
+/Type /Page
+/Contents 6930 0 R
+/Resources 6928 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6949 0 R
+/Annots [ 6933 0 R 6934 0 R 6935 0 R 6936 0 R 6937 0 R 6939 0 R 6940 0 R 6941 0 R 6942 0 R 6943 0 R 6945 0 R 6947 0 R 6948 0 R ]
+>> endobj
+6933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.1176 660.7532 217.183 671.6571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4612 660.7532 330.8957 671.6571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c061731c4fec7f60c48e02ed9806b4bb) >>
+>> endobj
+6935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [358.5223 660.7532 435.7719 671.6571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.0861 631.1736 422.6553 642.0776]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >>
+>> endobj
+6937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.4864 631.1736 511.5056 642.0776]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >>
+>> endobj
+6939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5788 472.2978 216.6442 483.2017]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6940 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.653 472.2978 331.7713 483.2017]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_065895a1428f9dc6b3002818686eff0f) >>
+>> endobj
+6941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [359.1285 472.2978 436.378 483.2017]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+6942 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [316.0861 442.7183 422.6553 453.6222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >>
+>> endobj
+6943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.4864 442.7183 511.5056 453.6222]
+/Subtype /Link
+/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >>
+>> endobj
+6945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4448 230.278 329.3499 241.1819]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_fceefab91d648d188e42e5a75a3a977e) >>
+>> endobj
+6947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4448 97.3149 329.3499 108.2188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a) >>
+>> endobj
+6948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6931 0 obj <<
+/D [6929 0 R /XYZ 90 757.9346 null]
+>> endobj
+6932 0 obj <<
+/D [6929 0 R /XYZ 90 733.028 null]
+>> endobj
+6893 0 obj <<
+/D [6929 0 R /XYZ 90 564.7723 null]
+>> endobj
+6938 0 obj <<
+/D [6929 0 R /XYZ 90 550.202 null]
+>> endobj
+5594 0 obj <<
+/D [6929 0 R /XYZ 90 376.3169 null]
+>> endobj
+6944 0 obj <<
+/D [6929 0 R /XYZ 90 361.7466 null]
+>> endobj
+5595 0 obj <<
+/D [6929 0 R /XYZ 330.8443 233.431 null]
+>> endobj
+6946 0 obj <<
+/D [6929 0 R /XYZ 90 216.7039 null]
+>> endobj
+6846 0 obj <<
+/D [6929 0 R /XYZ 330.8443 100.468 null]
+>> endobj
+6928 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6953 0 obj <<
+/Length 1850      
+/Filter /FlateDecode
+>>
+stream
+xڽY�o����E��j�o��n��c�k��&��]:���ʒO�7���
�ɦ
�n� ��p8�E���T�
+i��t����#��0!az�!���'7菱j�%����� 	�����ӌD�|A0Ƴ����f�?|7�xV���j��7y�|{��)VLe�������3���
+<�s����h֦��lf���/T�T����o&��
gL+��O��tg�f�ә�>� #�5�n'��8('w��|��[�R� ��P���׉@
E�|_�%<��j����a_�e_���T�CW[~J���^�U��n�ª
+��WH
A�P=O���Y���Z
�a�ə��v�����#��7�̼�\�����-�$�ܭ�h�}S���P ��"��ٛO*�$�k/@^��C]���	��b:�_pD���0KH�����A�MѾ&����
�(S�@�#&�2����;sS�����c4`��}A�eV_#��v޴�-оգ�@1�\����򥉳[S��3(6JU��)�P( >F���e�
��G8(ׅ3��)��Y��貰��>�;ˈ:o �9�
��T
+g�+ �@y ����
j�&PH��]�B~
+��n��C1���A�@Z)��\��
��$����EN~�{�	���ⱨ�2D�
pZt�s)f��
u���Vp��)
��k�h��6x�_4�ֳ�Z����7o�����#?��t�6/KHYq6eq@?�C��1�B���|��;w�Qø�N�3+YW����x5C�� �/��ɷ�3M

.,mL1�Ҝ)�)A�jXhyi�,BT��_$�s�8#+���
+�X
�Rr�F�R�J
����*
�]�qM�w����ղ�x�G��{{�ܽ
+U �qM��	;�����n;_o�P�)m��S�Bu�2Jn �#�޼I
���zѦ��v;͙Mm",m�$W�_���:�1
���Α�4
�
�9``�
0ł� �b�"�o��	��q�����#:�⅘�ͮ#� z�]%�3�
%e�W�Z�"�8FR�D��5�Yqv:�/B��|��c�Ǔҝ*e	��c�Z)��UA�����1���>�Dw;�,��Ѥ�]���=��:�3V"GC餳��`��KC��Z��
co��񠓠J
��%I)�2ѥ��K` T���D������W�)�j'0Ђj$��/���/�
|�B��~=_�j)�:�CR���1
FM�Pv&��G`d�%���
�!��!D,I����^	���'ld
�L�_�XT�a��"��g��3�Tº��a�b�@Ҙ'
"�m<�}� �B��-�0<bz� �
#NI�Y_o]TQ�c�r=l���Ϟw��DdH�^�.u$����F����^�}�}�w �bؽZǚ���|�x�]E;�n�u����
ƺ.�ڢ���\����M\UR
��:y�:$pW�#� �g��=�S8��p/�a���=�k���X��]�6�
�U׮�p��3"��_�8��a��.4�fux�M�Jް
�� f���&
|���M*�!ųX�
�9��$�돩���m"�X��U�]{
J��P>X�Ҍ�o v�y
4� ���H��Z)��":a�C�
�� nDhq ��{�W<��g�7�\K~	���H!����2C
+*������DŽ(�(���
èS?
����������W��W�x�f����4mmմk
U6�������s��){�F�Z���Ƨo_�/X
V��'jp�#��������<==�e��U�kP�݀��
��1$V��9�-z�#YF�t����H�>ml�x^T�r�R���'��(��0�tendstream
+endobj
+6952 0 obj <<
+/Type /Page
+/Contents 6953 0 R
+/Resources 6951 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6949 0 R
+/Annots [ 6963 0 R 6964 0 R ]
+>> endobj
+6963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.9298 111.1305 309.1558 122.0345]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+6964 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6954 0 obj <<
+/D [6952 0 R /XYZ 90 757.9346 null]
+>> endobj
+6955 0 obj <<
+/D [6952 0 R /XYZ 90 733.028 null]
+>> endobj
+6890 0 obj <<
+/D [6952 0 R /XYZ 351.1081 675.8614 null]
+>> endobj
+6956 0 obj <<
+/D [6952 0 R /XYZ 90 659.1343 null]
+>> endobj
+6957 0 obj <<
+/D [6952 0 R /XYZ 90 567.7806 null]
+>> endobj
+6894 0 obj <<
+/D [6952 0 R /XYZ 90 545.4688 null]
+>> endobj
+6958 0 obj <<
+/D [6952 0 R /XYZ 90 545.4688 null]
+>> endobj
+6895 0 obj <<
+/D [6952 0 R /XYZ 90 496.2275 null]
+>> endobj
+6959 0 obj <<
+/D [6952 0 R /XYZ 90 481.6572 null]
+>> endobj
+6896 0 obj <<
+/D [6952 0 R /XYZ 90 434.4533 null]
+>> endobj
+6960 0 obj <<
+/D [6952 0 R /XYZ 90 419.883 null]
+>> endobj
+6909 0 obj <<
+/D [6952 0 R /XYZ 90 372.6791 null]
+>> endobj
+6961 0 obj <<
+/D [6952 0 R /XYZ 90 358.1088 null]
+>> endobj
+6910 0 obj <<
+/D [6952 0 R /XYZ 90 310.9049 null]
+>> endobj
+6962 0 obj <<
+/D [6952 0 R /XYZ 90 296.3346 null]
+>> endobj
+1497 0 obj <<
+/D [6952 0 R /XYZ 90 197.9418 null]
+>> endobj
+238 0 obj <<
+/D [6952 0 R /XYZ 90 191.3416 null]
+>> endobj
+6951 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6967 0 obj <<
+/Length 2424      
+/Filter /FlateDecode
+>>
+stream
+x��[ێ�}߯���޾_�Clǂ�Q�͓m,F�,E�
�C��}�g��=��Y�
���
V���:}
2���
�)��a\�<[��ooH���_��o
nbf��T�
�*
� A	�=�~�%Q9_���9��Y��
��)��oϟ�U�=�k�������r�z|�y���������
*����x�_�ϟ�rN�m^,��BixI������?
<٦-�Ib��v��x��6�x�3Z̾���1t��ᔹ7ۛ7��v�/�
�D6A;1�
a)X�o��m�q��싺M�M�.���O��~M�&�~(
+�	E�����\C;���@]0GFCk���~��.���
_W�v�i>��aG��=�uv	����6��h�%��
� �Ѥ��B�	U�&K~
���2�QG!�ߓKę�;��/���/��W:<�ѣR~	�
K����j��I�$�
���r�`އ
>E�g���/���ͩN�
J �������@93�Y*�����p)Gؖ�B(���ڷ@�H^���$������@ۆ��N���V�>�ͻ��s
4i�T�]C%6��OlIzK����ɡ�J	EG�uml
V�`r��r����v������>��}�\,�
�
h�����L �Ռ��k&�1�XZ��I���
�:ta�C
c
�G%�P �
�D	

��Xq�I9�&�B���0���){ޞ�ܩ4�|^B���
���ϛ��������t���˪�k
+���/o<sm��1���̆1
�L"�=,�١��3;���Z�^��1�Aflj��nG	2�J��oN�d�t|����S,zv���ra��x�-
(�٬��l������.TW��+�d�|T��S���Xo󓛫��
]x�6 �R.��b�F��BF ��������H
+�T5���q)��!&����0���))p�����8;/!�JA�n(Q"^
+ZQ)���&��v\
>I�k�2Xmvyq�����|�{\4AJ��0
�J1��.���D� ��q�6bb�`]9�joc|��4����o3�
+�#3<)
X "���+�3Q,XB<,)
���e!���Z�^&
1��,ĉ8YhG)9Ch��0CH��ٝ
Ơz(��pxT�"�p�&�f}�IS
+QI�5ڈH��YZ�.�LA�Yyvs��y,
+�00��(�r��׬Q�$U�
*]�s�h���R�
׊�j�B�k7O�V�#�mՍ�g�A� RJ�`65ZL�W�4�X��26��X��3�*����E���3z��`�j$5
,�����3��gg�G�n8zD���#���a���9>j8|�{Ϯu�?��[��dHs)Mw��s+�L�N�����!�$�
�O��ٝ>r�`��F�I�`�
��N>�9�$�����	
+mD$�êM��q�.`�l��t�̗c�D�F�|�6�dQ�J ��9"J
����բ�`�p-v��
QR��<)��i��
+�\�$O�k�<
�e��Z
�'�I{�#��*(d��t��ekw4%Fr�Xtr�6b��`�����\�M�K�ZKM���|�Ov�87��b���
�zNE`��E�^�jfU�`��
I�
��is
X�R;�7,�^�]�����U��O'�j<,]܁���f¯/������f�?�4�	�w䈳��X��֧�y�?�
�@Z&��P)�Bڽ#�	{b�L!�4���
l�������5G�ngh��[l詜sq��%��bʊ���������+����_<^v#�{Ų#�^I
$5�	}���]��]�o��ھ'�]�EϮe�)�y�{��qS�D�
*�Y�{	�ln�}l�L4̶�ғ��)=��);Tp�U<
�`@A��N��������
����x�e�C���
(�S�+�{��
f �4���52͘r�a�e��C����.���<;��6�x�\�p���E��y��W��H��-yMYU��<,-����,��zY
��e��{�,�Y��Ze���u^n!

GD�@*	,�p��	✰N/

�ٓpa�tZ$<>ɠkw�>J�4#*
�J1P1J;���G�aB^�����>:���/�Aawu����YY���^S [...]
+?�
+��
�n_�.���]��L/
�8T����wendstream
+endobj
+6966 0 obj <<
+/Type /Page
+/Contents 6967 0 R
+/Resources 6965 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6949 0 R
+/Annots [ 6970 0 R 6973 0 R 6975 0 R 6976 0 R 6978 0 R 6979 0 R 6981 0 R 6982 0 R 6984 0 R 6986 0 R 6987 0 R 6988 0 R 6990 0 R 6991 0 R 6993 0 R 6994 0 R 6995 0 R 6997 0 R 6998 0 R 7000 0 R 7001 0 R 7002 0 R ]
+>> endobj
+6950 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Grid__Generator__System__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 7003 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 357.00000000 98.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 7004 0 R
+>>/Font << /R9 7005 0 R>>
+>>
+/Length 7006 0 R
+/Filter /FlateDecode
+>>
+stream
+x��SMO�0��W�H/����T��ͭ�����T��j���&	
�.eA��qf<���F�ҒxL��ϣ����o������L�7�G�9�,��
R�%rQ>�R8�x�',a�X
1��=?�O���
xLۢ�'��l�Vb�i9E&y���zqtڔ��O7��U�,M���(M�
�J��g�u[��M���ۻ��P}�*q&��L�|C�%j�EZ�%'� *
+)q�&p֘= |�����4Z�Z.�s\*���_�՛`5���W�/Ӵ���w9)²Bc�:^�(��{�&Z�����O[6�����ݯ�ǎ�Q=��Q{H̘}��Y� �q.3�/
a����
!�m~  G��'�� !q9 ����8́��q
�|-�5��{��O�k)փ�44
��Z�{r�@�e#� ���p8��U�u٫h3bK|;g=(�k��������ds|�d}
$;�d�d��_���endstream
+endobj
+7003 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142734)
+/ModDate (D:20080908142734)
+>>
+endobj
+7004 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+7005 0 obj
+<<
+/BaseFont /XQGYTO#2BFreeSans
+/FontDescriptor 7007 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 556 556 0 0 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+7006 0 obj
+473
+endobj
+7007 0 obj
+<<
+/Type /FontDescriptor
+/FontName /XQGYTO#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 7008 0 R
+>>
+endobj
+7008 0 obj
+<<
+/Length1 56440
+/Filter /FlateDecode
+/Length 7009 0 R
+>>
+stream
+x���|�����eJ���Ph�bY��nɶ�h��:�3��S�ҽ7�{���{���{�'K_)6?C�}��'9GGG�{�:�{�e H� d� �&Z�Ϝ���7��_;�������o&����b
5���~���@gp���	B8�;���bM�
�x{KϘ��
#f
�����~�u�V��ǽ�J����q���E}�v�=,�c痢���/X��j�/C�}�J��g'��;A\}��������E�%����j��?��,��t
�8q
��g#}�Z�
�z�W&׍�K��IB ��N
�t�X�\:C��
�,�*y"t������K� =F��>�>�؈��J#ѻ��K��$�q6t�P�۠��V���bErs�,���B��k���1���c��
�#�
i���y��蓠��a�E�=fC�#�YL?�&JD1@��k�h!4����Ez�N7<�%ʞw��fzOמZH�|[�^��'�D�g�=�U��H�R�@!�Ym�Z[��j��o��-��-3K�Յ�r��-�;r՞R�{(ę�U$*���+zڶ���+����.�
=����]�Pk�Lt���=�VOn�T�A��]#���s��*�n�ܕo�Olm�QzО�%'�'x�'�&%��7׼;e��B
1���YxסmcDhz���-�C�rū~˸�=5mc/3�2�e�
2�ߵ8�=sM����k�n�Ż
+ڦ�]^Q9�Rk���O��v߫�����i�l_�=߼�L�����.xe�{W��2�����|K%�R�l�v�TZ:��l�dW9W��;Z*�m���Ֆj�e��-���|9Whٮ����޲MO{�X�{�t{aT��11�����;�
���OD'O���$���]M���4��Z��xҤ�
N�*�O�:vR;F䤮����joa�
���h���y %��6\��y����۱��g�]���=]��h//��]K^(h�=�{�練�K
�^{,j����Wi)-ȗ�6ʷr{
�t��<�W����J^��� %��y~#������[!�Y�.�;r�B�w��
��T{���K�����
>j�?D����B�9�f%�}�Om ��J�F���%r�Z�=��WrίU����?K�":�&b���O�I{Y����
!�Ǘ��+c�0/O'V���Hb�1�X�X�X�X�X�X�X�X�
d
�61֛��������
�
�,9�
d��A�^&I��-���N��h����[x
e��y3D֛ғ�)�T����|[�k�{
���)fz�q��C�;;;�x���;1��ë���E�!ġ�=ĩ���aı���9���
�
E�I
L�D�H�D,&N#� 
"�%~ �%�$~!~&~%.$�!� 
�x��k�㽆}�k�lj'��<.z�x���k������f��8�x�x�x�늯�o�#�n��֝E�|�[��:��g��׍
�/��R�{�����y+����o�;I��H�H����%�L*�Jƈ=F�@'IrEr9�
E�D�&W&W!W%W#W'� ~'� �$�"[�1���Xr
��.9�\�\�܀ܐ܈�@�I�FN$'��d������$M2EZ���&�ć�G�f���䖤M:d�̐Y�%'�Sȩ�V�����
�6��4r:�
�=9��I�"g{k�O�
�9��N���.��n���\r2G���d�';�.���!����K��)��G�I��
+Y%���Br9@�E�M�C�K�G�O
@
H
D\J
L
B
J
F
N
A
I
E
M
C.&�%�#�'O O$O"O&O!O%O#O'� �$�"�&�!�%�#�'/ /$/"/&/!/%/#/'� �$�"�&�!�%�#�'o o$o"o&o!o%o#o'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!�%�#�'_ _$_"_&_!_%_#_'� �$�"�&�!�%�#�'? ?$?"?&?!?%?#?'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!���R�IJQ4�P,�Q<%P"%Q2�P*��Q+Pé��Hj�5�Z�Z�Z�Z�Z�Z�Z�Z�j��PkSc�q�:Ժ�xj=j}jjCj#j5��D�RqJ��NT�2�eQS�P�R�Q�S[P[R6�Pi*Ce)��LM��R[Q[S�P�RӨ��v���
j&5��M�@͡v�v�v�v�v�v�v��R{P9��j�:�<�IuQ�T5��O�׉�^�H��>jO�-�m�
�}�
�=�LU�*�O-�R��j/jojj_j?j� �@� �`��P�0�p��H�(�h�j1u,u
u<uu"uu2u
+u*uu:uu&uu6uu.u
u>uu!uu1u	u)uu9uu%uu5u
u-u
u=uu#uu3u
u+uu;uu'uu7uu/uu?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%q��5�
�-�
�=��#��3�
�+��;��'��7�����K�$M�4��,��<-�"-�2��*
���+�����Hz�=�^�^�^�^�^�^�^�^�n���k�c�q�:��xz=z}zzCz#z=��D��qZ��Nt�6�m�ӛЛқћ�[�[�6��i:Cgi��LO���[�[���������v���
z&=��M�@ϡw�w�w�w�w�w�w���{�9��n�;�<�Iw��t=��O�^�H��>zO�LW�*�O/�ҋ�z/zozz_z?z� �@� �`��P�0�p��H�(�h�z1},}
}<}}"}}2}
+}*}}:}}&}}6}}.}
}>}}!}}1}	})}}9}}%}}5}
}-}
}=}}#}}3}
}+}};}}'}}7}}/}}?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����!���a������Q��1Ø��̊�f$3�Y�̬ͬ¬ʬƬά��ɬŴ0c�����8f
f]f<�
�>��!�3���LbZ�8�1	Fg
&ɘL�����M�M�͙͘-�-�q�4�a���Lf�0S�����m�m�i�tf;f{f3����fv`�0;2;1;3�0�2�1�3s�=�
�ƴ3
L��d��n�����g
+L/SdJL�'Sf*L��g0
�E� ��7��/��?s s ss0ss(ss8ss$ss4s
��9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�����������������������������������������������������������������y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�����������������������������������������������������������Y���,�R,�2,�r,�
+��J��*����a�
+�pvEv;�
ŮĎfWfWaWeWcWg�`�d�b[�1���Xv
��.;�]�]�݀ݐ݈��Nd'��l������dM6�Z���&��f���얬�:l�ͰY�e'�Sة�V���6��4v:�
�=;����bg�;�s�
ٝ؝�]�]����ٹ�
l�mc��6�v�]l7���c���-�%��ݓ-�����
؅�"v�݋ݛ݇ݗݏݟ=�=�=�=�=�=�=�=�=�=�=�=�=�]�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾¾ʾƾξ��ɾž;þ˾Ǿ�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.a����(����8��N�$N�N�b�0nn8�"7�ɍ�V�Fs+s�p�r�q�skpkrkq-�nmn,7�[�[�ϭǭ�m�m�m�M�& [...]
+W����Bn7�������������
�
�
�
�
�
�
�
�
�
�
�
�
�-����N�N�N�N�N�N�N�N�����������������.�.�.�.�.�.�.�.���������n�n�n�n�n�n�n�n�����������������
�
�
�
�
�
�
�
���������^�^�^�^�^�^�^�^�����������������>�>�>�>�>�>�>�>���������~�~�~�~�~�~�~�~�����������p��O�O�
��
��/�/�
+��1~�?�_����G�+����U�U�����5�5���~
�6?�ǯïˏ�����7�7�7�'��I|+�5>���'y�O��1�	�)��9��%o���3|�w���~*��5�
�-?���o�o���g�����
~G~'~g~~W~7~w~.�����v����|�������|���|������|�����~!�����������������������������������'�'�'�'�����g�g�g�g�����������������W�W�W�W���������7�7�7�7�����w�w�w�w�����������������O�O�O�O���������/�/�/�/�����o�o�o�o�����������������_�_�_�_���������?�?�?�?�����������K�B J�F`N�AI�EP��0LXA.�(�F
+��������*ª�j���š�ZB�0FX[+����
�	�

+	���$�U�
��t���)�K�X�D�T�L�\�B�R�GH
!+��da�0U�J�Z�F�V�&L��f3�Y�laa���������������0W�C�	mB��!�N�K�z�y�|� �
+E�$�	{
+e�B�H�$T�[�ۈ��~�f��aq� q��PXD\E<*
{	{
��
+�	���	
+w

��
+�	�
GG
+G	G
���c���������S�S�ӄӅ3�3�����s�s���
�
�����K�K�˄ˉc�+�+�����k�k���������[�[�ۄۅ;�;�����{�{�����������G�G�DŽDž'�'�����g�g���������W�W�ׅׄ7�7�����w�w�����������O�O�τυ/�/�����o�Ӆo��˅�������_�3�_�3��߄߅?�?�K�������%¿"A�-�"%�"#�"'� ��e�D
G�L�"ʢ"�bL
&� WG�#�Q�J�hqeqqUq5quq
qMq-�E
#�-�lj��������
�
ō�	�Dq��*�EML��h�I�S�%n,n"n*n&n.n!n)ڢ#�Ō�]q�8E�*n%n-n#n+N��ۉۋ3ę�,q���8G�Q�I�Y�E�U�M�]�+�!��6�]��b��%v�=�<q�X{ŢX��=ŲX�b��@\(.ĽĽ�}�}������Ńă�C�C�����#�#ţģ�c����q���	��I���)��i�����Y���9��y�����E���%��e�
�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_��H��h��X��xI�DI�dI�T)&
�V��K+J#���(i%i������������������"��֖�J�u�u���z���҆�F�i�4Ij��&%$]2��dJ)ɒ6�6�6�6�6�����lɑ�RF�J�4Y�"M����������Iӥ���Li�4[�A�#�(�$�,�"�*�&�.͕��rR��.uHy�S꒺�
i�4_*H�RQ*I}ҞRY�HU�_Z -�I�^���>Ҿ�~������ҁ�A���!ҡ�a���ґ�Q���1�b�X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�i��LȤLɴ�Ȭ�ɼ,Ȣ,ɲ�Ȫ
���+�����Hy���<Z^Y^E^U^M^]^C^S^Kn���k�c�q�:��xy=y}yyCy#y�<Q�$��qY��.rR6�l�˛țʛɛ�[�[ʶ��i9#geW�,O���[�[���������v���
y�<K�-� ϑw�w�w�w�w�w�w���{�9�Mn�;��)w��r�<O�/�^�(��>yO�,W��//�ʋ�y/yoyy_y?y� �@� �`��P�0�p��H�(�h�y�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|��������������������������������������������������������������������������� [...]
+J�RTJJ���RV*JU�W(
�Eʀ������������r�r�r�r�r�r�r�r�r�r�r�r�r��X9V9N9^9A9Q9I9Y9E9U9M9]9C9S9K9[9G9W9O9_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_y at yPyHyXyDyTyLy\yByRyJyZyFyVyNy^yAyQyIyYyEyUyMy]yCySyKy[yGyWyOy_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�GY���*�R*�2*�r*�
+��J��*����a�
+�puEu�:R
����VWVWQWUWSWW�P�T�R[�1���Xu�����:^]O]_�@�P�H��NT'��j\�Ԅ����TM5�Z���&��f���ꖪ�:jZͨY�U'�Sԩ�V���6��4u�����:C���Rg�;�s�
՝ԝ�]�]����չ�
jNmS��5�v�]j�ڣ�S��W-�%�O�S-�����
ԅ�"u@�K�[�G�W�O�_=@=P=H=X=D=T=L=\=B=R=J=Z=F]�
�
�
���������������������������������^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�ޠިޤެޢުަޮޡީޥޭޣޫާޯ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>���������������������������������~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.Q��12F��cc\��	11&��Sc�ذ�
+��c#b#c�b+�F�V��[5�Zl���5ck�Zbcbk�����։�[/�~l�؆��bbc�b��xL�%bz̈%cf,�b�6�m�,�yl�ؖ1;��ұL,sc�cSbS���@_���T)uV�=-_���\{�T�s���r~A�����K]�b~>�
��n�)���v���A]Jw�����|�*�G*�i�Պ�D�+?W� �0 �}!e
�G*�E�@r٠ļ/��uAu�5y���HU&��z{s�誻��ԕ�=�3S�re����M��:�\�/���Ij25�IO�tSsO ��[Q=���0�
����Q�o��*���B�����m�k�湂/�m��
+u�6A|�l�՞)x��i�����i��럟<_
����;U.y����|����ʗP��A�K�P�w��r���B����꯸A
� ��1��c��P��੊/�u�X���bOk<�A&�Y��ՠ
f�:�Z���AG�
9u�G]fu��;��S�b�k���
�꯿�g���1W��Ÿ�NߩNԹ����
i����W���R���.�
+�D�S	H
ҀLB��)H
҆t Ӑ�,�H
��-�Z���k��\
�p-�Z���k�r��ݥr�-�~6u��m��
l�6�m`����m���eg������� ��l��
`;�v�� ���z:h�4�7
�4���K/
�4���K/
�4���K��i�5
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,�����`�w�V�g��z�Y�g��z�.�]��@w���E�]๖d�2E0�s����@��A�^)�*݁^��R��V�8����!
�$�	��� mH2
���B�����?�8����?���̬����Y�պ
<��A�

ꨡ�ꨡ�ꨡ�ꨡ|
�'P��@
������o�����
�g >���@\�2��x��K,�%��^xI�%��^xI�G�O/	<x&�L��3�g��	<x&�L����z��7�o����4����_�Ki�/
����4����_�Ki�/
����4
��/
����4����_�Ki�/
����4
�6pm��4p���axA/h���|�!?k���U�-�{�M�sJM��%Z5�_��YtH2	iB���Ri~�����)ҁLCf ��A�	��I�$�|�@>I �$�OqDOAZ���?�8�K�%	
���xk��|��p�2H4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I �$�h	��@�	��@�	��@�HH	$�F6�	���L�Y�Z*�*jGO����T�+�.�u�|U�K�|!ߓS�}�
o�雅l����)�{{j+��bv��4�7�8
����X�q��
;9��� 0o���ٻE{x�nOcj��ֹ������m��Q��S���
{xD at m�C��.�3{�zs�\?�h��{���]�'��-ej]D��^K��!�|}��a�{���o|4���<�V�\W�rlG�P��(�٫V��ͪ_�Za�|�j�jA�N�*�S�z���_?��]�*���Y_�U��������{?�%[�5�R��Ö
+S)��Z}���^c�21���K`
�����Ξ�x�G��f�#M����z����43�R�f�Z2B���[3�%Ċ�Q��xTZ<*M�=�X�"֢8��<-�S�J֢����DTr"*9����"a$"�D���0F"��#
=��#
=��#��v�#
=��#
}���'����d�D2zŒ�2�X�(3�ŌJ6��ͨd3*ٌJNE%����"�T���0RF*�HE�#aX�aX�aX�aXV�1����X�h�x#-í�H�#͈�d�����4
��܈�#�����ݸ�U��U��U��r��8�>��X����X!�a�X!�a�D�!F��t��t��t��t��t��t��t��t��t��t��t��t��u��u��u��u��u��ux6�
�ag�cg�cg�cg�cg�cg�cg�cg�cg�cg�cg�;�w���������������������������������������������������
��
����
��
��
��
�~�3�hL��
 c��c��c��gBd�
{|
{|
{| [...]
e
R�L@�d҄LAZ�6���
ƨ������������������������������������������0��75�k�׀����������m��
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��f"�A=��M�x9�D�7��M�x9�D�7��M�x9�D�7��-�
���8�0N,�
���8�0N,��5,ρLCf ��A},�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
�@��,
YOƓ��da<YOƓ��da<YOƓ�qda
YGƑ�qda
YGƑ�qda
YGƑ�qda
YGV8��V��V��V��F��F��F��F��F��F��F���-�,�,�,�,�,�,�,��[X+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+XX+Xf2�V�۞+v�sm=Ŏ~ٻ��+
r���
z*�rW���� [...]
+M���?����Z{�ˑ_>���L���>Н���\�:���{s���_�y9��@Њ
JM
+=��caa�@�5�^�r��S*���\X�6-��۝�~߭�g��ҳ�v��_�/���tuWkŞb�V�foO0�|�-������k�F���b��\����Z�E��BVwQ�W*j}I�*^/��qo�l�
���;6x����
�c�wl�
^��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�
���6�����a�7l�
���6x�O���`�l�
^��
6򾍼o#����6�<m#O���6��l#��ȳ6�<k#��ȳ6�<k'�r7�<k#��ȳ6�=��=��=������������m�l|�h��D'f6>?���������1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
����S2�d6N�l���8%�qJf���阍�1�b6N�l���8�q*f�T��i���0�a6N�l���8
�qf�4��i���0�`6N�l���8��q�e���Ʃ��
%����3&gL6Θl�1�8c�q�d�����3&gL6Θl�19�{򞃼� �9�{����|� �9�o��� �9�k�|� �9�c�|� 9�;򎃼� �8�7֧򎃼� �8�7�|� �8X�:�;�q�
�(y�A�p�7
�
y�A�p�7
�y�A
p�
�y�A
p�
��;��濃�q����w0�
�s����v0�
�k����u0O
���`�:��楃y������t0?
�^;��槃��`~:��桃y�`
:8uv0�
�7��曃��`�98-vp6��l��ٰ��ag�i�O��F���?i�O��F���?i�O��F���?i�O��F~N#?�����4�-�~K����4�q�8�|�F�џi��4�q�8�~N����4�1�~L#/�����Ki�4�Ry)���F^J#/�����F��Cj�	H
ҀLB��)H
҆t Ӑ�,$����?�8����?�8����?�8����?�8�5�k�׀�_�|
��5�k�׀�_�|
���O ?���O ?���O ?���O ?��u���ׁ�_�|
�:�u���ׁ�_�|
�:�
��7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�����_�bN���B_�s·Fą�<�~
+�)ী�~
+�)ী�~
+��P
��P
��P
���o��|
�6ʵQ��rm�k�\��(�F�6ʵQ��z�a����z٨��z9�w�� ��|��
�;�w�� ��|��
ু�~�iু�~�iু�~�iু�~�i�g��~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�!���w��N���@w����
���
�v��.X�K�`i,킥]��
�v[��lH2
���B�q��.X�K�`i,킥]��
Vv��.X�+�`e,삅]��
v��.X�
�`a,삅]��
v�®�~`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
�u��.X�5�r?X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]���^
+x)ी�^
+x`M��5]��
�t��.X�M�x�/X�k�`M��5]��
�t��.X�k�`M�>�ӵ�o��|��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.����`U��U]��
Vu��.X���`U��U]��
Vu��.X���`Sl�M]��
6u��.����`Sl�M]��
6u��.��{�`O��=]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]��
�t���
<x�I��]��

8.p\�>����0;ϙ���C at l��K�=]��|G���[Q{i8���_��k��,W�
pu�%b�b����b!��ȗs"����/���KE<�'
�$�	��E�\oG[�L u<��	
O�I
�Qj�U�����1�J�s��>,
+/�JϢPW����+�����H�E
������?ҫ
#��H^�
^xD�xD��DW~�C��
�/_�WsA��荘D����K�9XTk�`y��t ����rn~��
C�6N2�ѳ���0��5Xrx��Ó6$�4`K
-
,-<�P"!x�W��)w�^��J%�e |� 
@l�I[��[��<�+r���+~���#8�DhI��Dhk{R�D<IēD<IēD<I4EM�DS$�k{�&�M��7�o��	|�&�M��7�o��	|�s�ria���}��O�e��L�͎��b��y�#­�k�Ԟ\����QT�B�0)���SC�/2�]�{ղK� ��T�dR���|o_u�炷i�6��*�/�{k_��Ӌ/Lj�
*��^��BCP[|{S÷5=�+9��rOe~o��
���K}�r����\����
+����\��z���X�e���'�=
|�V�7,5|�ғY���Ng���+=�=��3_M
V���r=�A"B�2|ѓ	?8���k�XxQ���J�/��}��`XkV2�z�
՞�€�9��k�bBC��U�U�k�B�/Rۂ�K�
/0M��mzj|����u��i@&!M��iC:^���f ��n�!1��<�A&jZ�B�#��Ys��
C
1��Ru�!�@u���B���`
�!$K��@�44D��ih~ɺ��4D�,�W�5�j�I?s� ,޵�𮵆w�5�k��]kO�u 
V�l��ek
/[kx�Z���^��𲵆��5�l��ek
/[kx�ړ� t��=Eӡ�PѠ$��'�h��f�έP��9�
+}"�
�d�)�-=��G�a�Z�
9�%�a<z�
����Q�r0B��
+���A����)4����(��G#���)����&N���]U���>�8�.�vU�jp�P�t{k9���w���e��-`[����:���`O��4$�-�[�����GG[i7��\Пa����M���'�e/w�탖��ro���k,�����H�F���4 M��iC:�i�
d�
d@?�^pD�I���CG
:���/	��tĥ#.
q�KG\:�����
�e � �|��
��7�o � �|��
��O?	�$��O?	�$��O?	�$��O?	�$��7�o��	|�&�M��7�o��	|�&�M��O?��S�O?��S�O?��S�O?��S���o��|
�Z(φ�
?~6���8m�i#N�و��E�6���8
�� ��|��
�;�w�� ��|��
�;�O?
�4���O?
�4���O?
�4���O?
�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?
�,���?
�,���?
�,��w����
|�.�]��w����
|�.�#�,^����,^�v���ɓ����@f!�@��ɸ�Q��^
�'���/�
lgO���:;���
��?q�J��W�\����l���#X��x�ɓdR�
�Qb�<�d
+r�k5�Wr��4$�V�.^�r�'C1$C"�UUQ$��v��Z�A
�U*�P�x��ūS�D-u���v:��Q�
}
�5,	:ꦇHA�\7S{ӷ��S�_�Vq���U.���%���no�(o����
��}��+uz\���������1�-��\ʃjaP�_���;j���k���=��]���AT�^WʼA�y��

�ժ_;�uN

�7j/�>]�{���:�A�8��
:��9�
���̽����Z
T
��U��T]��:�r�N��
䆅:^@o�"��=��}uz��3 2�֙�6
+�{U ���i�;]���ah
�`�V=E�n�::`��
���;D��w:‡BC����
}0�
m0�u�W|�^�
���T��N%4���<��u���6������{�%h�j���U�{��(^�H�ˑ�
�I�jA)E��
Y@�ޠ��h����B�
+z�
�#��pR�/��^���v1h�.�����P�U/uPG�׮���Br���]ZC%
���`\�I����ڃ���F�_����I�[�n(��7�.B�M�BӼn��Z_ʡ68�{��܅�\�G0����"&��ݡCGGh�
�g�
�|���":��/�T��L&&�U���
�n
]���n:�Jy�"
31
1
�#��#L�
����x����b��b:c�ԥ�����a;
f��5��P
�m1�Eu9��G�+F��3ŰvŠv�f�"d6���
*?
�_���>�^�"d��९j5Ld$�y�A�mQ�msQ�6�c[��C!L~A!�H;�a�{�v@q�&�>��O��V��7ȳ��-�E��ېl{����
+���0����`D�aQ�{�p0���W!;B�n�`@
+�DQ@���AB�)ݡ�*�P�
�B�
A6�)h�~J�tT"��r�b��z<�	fy����vNM���ꈬ7��f��'��2H�07������%�(/r��Dӭ28�*ါ�-�
+Z]]��V	��2�O���k:��ZCl
�^���;�,�A��#�k
ɭ
�.e��%ma�o
|[�|ېY�2������YS�)�ph��3m��ҋg{�%M��"S<�m�xlCs�t��P���:.��f,�����Q|njxQw�P�Pwk^�S����ߪF�Ԡ��b�6��1SG}

Et4��X��*j�
|?�g[/���:�a��Q}�a�-u�P��i��jkx������)5u�j�nx������V�
�|�
+�uq�[���/�� 9TQᕆ0*�
m_ˆ
7�
+
��Vp{���(�J
b]�T�:�vNpQW�JC�+���G
+oo�wP��*�-�6c7⪕�}AT����m)�68
4��,Q`���Ec��*��u���믊]������ʘWk^c�W^ĕ?M�
�^b��Y��՗S��6�KGC�
�����k�k����p���b���\Q�/��Po��96\4���
W
�"�h�����P�R�����m�HZB���v��8,f�h��S)�6v�����'*�Tk���4֞���s��2�.j]�Â��O�����x�'.�N
�4�O�RaU�D�R���Dje�f3TR�YL�����V?� ����������e"=���F���<�魡�ZS�[�61׶�u�x��i0����
3�OX�����^1�k!f���R���
+
+��F�
+�s󻋸�n���7�M��ct΅qb_9_i�H�F�
p���j�H6)#nוz��2F]�3Tڐ
Fv�2�!#M-�cd㝸�EK5�8f�~�o�T]���ڥ�#�l
�d8��F6C��lfL53�
F ��ȥ�^�#�f�l�qy����ڐ-�
ق��l$�D���
+nd�x&.'�Fc=Z���R��9����f�8͌�zDk�#Z���m�M��C�
+3�֤�D��M4k�D��h6��1�l7&a�l�59�Y{5�[�55�Y�5i�!Gk�<�8ߛ��ϔq���GrHsH��H��G<=�܌={�Cz�Cz
���#;��;�G���f��塵֣�.�V�/�h
���fs�I5�{ԇ��G5�� F��|
WK-f���7Wǭȵ��k�[w
f�x�����.���,�h�a�x�h��=T�PI��*�P��_j*��������p���M\�뻡ɢ%|.����k`�50�V�hX��&���r_w��k�0"]4��#�V��N$��a��0�db���
%�[����-��-l3D4CD3D4S�,{0G��&
_���V+��LԖ���,7�sI���1��،���[�4��r|���df鱜�v#
-�c�%}|ȍC8����c����Kcr_�G|����jpM,�u���ƥ�rbrۧ-c�y
9�!�F�o��7�C�MbȾ	��i2�4]"4N�z�m�siX/4�hX
��T�`Y�{��
M3~��������%�p��a�fa.o��#�
�a��tO����Ru.ci��Fi���3�(�֟�%�
	}�lܭ�+.���xF���a7Z
a�^r,6�
��C��;&Q3��
���{�?�cp��ݍ�uG��p�cjm�x���M��l+�;]�t��d3��̘jf���͌�f�l��hfԛ���n��,x�Y���جFv��Mk�61:Z3c��;ͪ�4�8�Yݝfuw���K���(npzNl�
s�����ݝ�����
����Z�N�D�n��)����
�C���ͽY��q���{�?�/57�t�oUm�M�q�oU��cU3��=��ܝ�kU���BC��>��S�fF���n0�Yj^օ`՝KE
ˎ+
>Nvb_�ZY*S���1��MʂGf�
�
Q�C�u7�i��ݴ[�w3�����n֭m;9T�vr�dz�e/}3����rn:���Ͳ�-�S�Qՠ1��j�bɻl/u�'$&�'�w`��_3���I��e
F
rDz�R��Р��p�J�͘`9�ץغ
і�.�~l6�@tWs֫�P}��Y
��i��r���
�
�!=�!벜 [...]
�g9�ka����Az"
*Z�$B��d���

ߝ��n\��w�2ÏM��c=��D?6����0Z#D1�h�0Z#Ѹu��[�d3��̘jf���fF��1�̘if�63�M��ph0ƛ�f�D3���ج=�f�i7kO�Y{�͚�n�tv����5�ݬ��fM�4k:�Y+9�Z�i� N�q�5�ӬA���~C-os�zco6�
��џ]������2ZM�8����<{<�vq#*z���
sL�Hp|-j�<�5�FC�d|y�kC�t��u.eH�-��e�@��u{,|di׿.h�Ռ��Z�&�x��
U<k�ñ��V3����43f��͌n#N|�2j͌�fF���Y���RF���Y+i�$-el� Z�њ5H�Y�$k�!l����f��ڬZ�5Bk�Fhm
+ԬeZ�U-ެj�f�o֭a�
�k�a�h�L͒DS����4d���!Q��CG}/�A<A���
g�
C���S����C��_�}�‘�5�<�[�x�Ψ������+�$��/�W��q�w��X-���c���1Ƙ�c�s<7�e���n��N2�2z��c�
��صy�
I����z<��!���*
L�����.��7Rr�����ƕ喇Ɲ2o�'ǝ�R��p�/��w���/���G_M_u9z��/�'W�b��
n�r���\��;�
��� �
�
+��5
5f8�F}��
�+�t�g�jx���*��Z�^�^���xQ�c�z������7.��>��
]I�}$�����[�v.�0k=�?���Wn�Yҹ��s�J�W�m���w�M4��Z�RƯ3n�n6���^�ٕF�4�
���D�D�M�=y�%�6_�x�[�.����N�B]2k��]��ڬ�
^�j�Ӗܰ��O�o�.�d
>y�
+mې+��`�e՛�����nm�����9S�����~�.�u�ݿ/-9�9��W	r��9��Ē%��^k���=�����-	b�k�p/&�SGqc��B�u�'��L7#��:��v�9U;T"�d|�Ѯ��8bʄ��J��'�]��ݝ��
]g�CZ�
Ժ�m�a�g����go��9���l
�^����ڵ����0~ν��(�+�F��RKWD����<�S�%��
���
2T���P�3nt5v��^�-�e���2��l�?��X[���"g2��{~��=�����}���?i>��YX���G�-��/t�
�뗹VKí��u)�I$����^$�:�@��FA`����`��]��@�p��^��
b����]�Gw0�<ڑ�X�Z۞����Z���N�L�~:�i
+���=:�^[Wc�]�Kd�����21�r����
��se��5G��������H�؆;��ʳ
Y�U������R7��X���z�BJf
o�9w���Qw��>�j�R_��?")'�," 	��M�
��D-_��T�<Qz;��f�)�de�/Mumͷ>oJ�Y~�
+������X���$7��ݩ��-�Ӈ,�=��_T�/�+�ۖYn�Nr�&��`��3�t6�^�S��Ȉ7����|�)�H�k_��ږ.�\{�>ЧZSn{Z������5�
+M�A��ؘ���
i1����s��,^m"�"��i$\>YIb��PC2�����0P���П�X\\�>���T&���$�j���(5-c����,��~!�2N�=!�ͬ�Sw��<���?�t����Dկ͸P�6�R�/��|�J��:�(u�>J�y����z/ �-��`Uɜt�±hwi����S~����,������u�4L�g��o7��~��G�T�w�2ᭊAkE
W/�xFrX$�YPd����X�������m��
�K$Xf������L[��W��M�
�
���Y�U�R��>�Mm
x�
DvpV!�&�lq8��0��^,	WIV�}tr���aFq���[o&@���M%h)��G���[h��
}�|}B&=��vv��/S
I�zCw�R��
N��}_
+�>5�t���l��n�����Ȍ�-D�U���&o��S�We�<�C"*����2-�Œ���D�|�|guKt%T%2x�"�2b�/��02�V�t�����U� Z֊Cl��f�s

xI5p���Ǐ�֨s>(䒨���%T\������ ��o�J	/oR��KHxa�
VRI�Z�� ,��(,�����
+[<
��
���D����aK�^�f_Q+bR��\ն�
؋QL޿���-�g��QY>&� ��w��
��O�
+��t����
�޴BY,=�4�
���	�O��Ghq�
~�p�� �*�C
+Uʡ�:C
���X�fz��A?`D
dL<
<x����
<x����
<x����
<���NEar8
+y�S������F��&�L
+ BQN�ף�D��A(5
�LmVv���T���g��
��f��g�~j
+�h2ÞAs̜5�
��������Y2�%�D�������Ҹk&Ң,��r`����&T�6s���n'�����N���Y7�y@���_�}��$\�
+��G��I��.9Q�������9H�u"��8Q�p�} ��{� j;@o�73��V�8�����}��K%
�?����m�o�:��%���e�9�S�rendstream
+endobj
+7009 0 obj
+20888
+endobj
+6970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.768 587.3539 192.5442 597.2816]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+6973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 505.6151 213.2966 516.5191]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_6c21214d11e4dc9738dad1f72501a286) >>
+>> endobj
+6975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 466.7608 213.2966 477.6648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_642db539e09ba9a9746d490390097d73) >>
+>> endobj
+6976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.6338 466.7608 305.6992 477.6648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 427.9065 213.2966 438.8105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_72f8cca084e83cace83223ea0ea42bca) >>
+>> endobj
+6979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.1123 427.9065 282.7555 438.8105]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 389.0522 213.2966 399.9562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_998804f094e131a7f06d05c6e9eb5f5c) >>
+>> endobj
+6982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.6338 389.0522 340.0201 399.9562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 350.1979 221.0454 361.1019]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8f29bc3aa01b8f5c67a3323189f9cf9e) >>
+>> endobj
+6986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 311.3436 213.2966 322.2476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.0363 311.3436 264.8428 322.2476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8a0c95f43fd48c07a63db5efa3564769) >>
+>> endobj
+6988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.18 311.3436 391.5662 322.2476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+6990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 272.4893 179.5535 283.3933]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+6991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 272.4893 250.6661 283.3933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_c485f37c083be7bc0238a3f5c6c112e3) >>
+>> endobj
+6993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 234.0087 155.2649 244.539]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_023dc725ab60578fb2161f06211fa023) >>
+>> endobj
+6994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 194.7808 158.0444 205.6847]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_465d046e2570dea82e57ab6af9b179e9) >>
+>> endobj
+6995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.3815 194.7808 250.447 205.6847]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+6997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 155.9265 199.9469 166.8304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_2d0bc3adc78e64aafdab0dd9a292db1f) >>
+>> endobj
+6998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.7625 155.9265 268.828 166.8304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 117.0722 199.9469 127.9761]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_a2e9eec4ddeaf5dca3afa1976d36b703) >>
+>> endobj
+7001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.7625 117.0722 303.1488 127.9761]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+6968 0 obj <<
+/D [6966 0 R /XYZ 90 757.9346 null]
+>> endobj
+6969 0 obj <<
+/D [6966 0 R /XYZ 90 605.3515 null]
+>> endobj
+6971 0 obj <<
+/D [6966 0 R /XYZ 90 524.589 null]
+>> endobj
+6972 0 obj <<
+/D [6966 0 R /XYZ 90 524.589 null]
+>> endobj
+6974 0 obj <<
+/D [6966 0 R /XYZ 90 485.8541 null]
+>> endobj
+6977 0 obj <<
+/D [6966 0 R /XYZ 90 446.9999 null]
+>> endobj
+6980 0 obj <<
+/D [6966 0 R /XYZ 90 408.1456 null]
+>> endobj
+6983 0 obj <<
+/D [6966 0 R /XYZ 90 369.2913 null]
+>> endobj
+6985 0 obj <<
+/D [6966 0 R /XYZ 90 330.437 null]
+>> endobj
+6989 0 obj <<
+/D [6966 0 R /XYZ 90 291.5827 null]
+>> endobj
+6992 0 obj <<
+/D [6966 0 R /XYZ 90 252.7284 null]
+>> endobj
+6996 0 obj <<
+/D [6966 0 R /XYZ 90 175.0198 null]
+>> endobj
+6999 0 obj <<
+/D [6966 0 R /XYZ 90 136.1655 null]
+>> endobj
+6965 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R /F101 2079 0 R >>
+/XObject << /Im10 6950 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7013 0 obj <<
+/Length 3026      
+/Filter /FlateDecode
+>>
+stream
+x��\M��6�ϯ�)+U�`|tn�Z�6�T���)I�h
=ÊD)$Ǔɯ�I`�/@��
�R�hF�ݏ�~�Y`��,�PB��q���o��
~���t_�������ͫ7R,�H*��
� A	]����$Q�Z���݊�eZ��ͻ�����!�+�Ϳ�eZ>�~����6o�"+��Pn><Wu�_�����viU��g��rE�2+��j�4|���~���柷�lw/�Ib��~��xq���
F,�b�?`D��.�7�2����������悩���׌#-��٘Q����LP/fKę�
3���R1�'��**��78��P1���K����p؍�2��z��|U�w��>��1�5
���~
Q�a�H��-*�XR$�R��c��i�l{(�z<
+��
�5J�L� ���)G�d�ڷ�PT|���7i��J�+C�}V?�Eeh��g��LHpbpu�����Q�[%qҁ�O흦�]��P��O�Us5�Ļ�+��$��`�&�p$Md;
y��v�.���M�0u`E����s��C&a�c��P
+��ɬ�������
,*`�`@��V�=�M�n򺭢#�"�ɀ���;x���jSI23|�y1�p7�{8
+�H$T�~�OײTi��K���h��|-CBɦ��k~�`p�|���n?m��|(��H�ڡ",@
��j�,������
��%8�(9�-u���JA����K�X�<R�
/P0^]��ƨ8t^�����ȕOy�&��rŠ=q�+^n�V����@1�-L��;J�N:>�:�z<��%
+�p	����_�L��� ���Z�
s��",��
��z�A�J�k|]n7��
+���
�g0T��~]����X�{N(�a&C�M�6��Z"�
�~���PE�R���Q�A՚I~Q��l�
+��
+=�� ��`F�$�+��gG��#��vO����R
�ڡb,F��r�j��5�1Ҙʘ�-,.w���#hXC��1%Z��ع�೻��YQ�bS?'Z
��Pa��%��8OM�M��iq=���~S
VT,��q�o�	!�k���7
D
F���!��
��|�6������#�]�u
�r�����AͭM��^n��٪�t�բP)%��($�^֢�E���X�v�cw�C<��b����x-
�2�g0����5
�\;T�5=
�
�?�g�
H��Ej�l��ha�B٨�	g��/�
�H�(�ki��:&�W�5u�����
�SE6G�|��9y9zF[���&'9!��g�v��O3�aA{�t�� C���6Bj��������	��W�
+H���҄'ZE$�`Q��ň_�������	�#��~����2U��`
���y�QJ� �C����Lw�*|U8���.?D�Ns��C�i���|�Z��q�
����:��+N�\PĒV�!I[X\Ҟ����~��}�aI���"�0���v�t�����6�a��M�� �y5�^3�=�  FӓJ�#
�S���c�����%9���x8T�"�(�����ZKvYysBŭ]��M�/E_��]�r�|�eE�o�]׃
&�
�eI���	���=_�/sT��k�9"M�}��YX��yCe.�ו9�o�����R��
Fv
��~�禵��߷EżB�@�2��

���ju��=!Q[����C�5�z~�\g�6
�ݠW������S� �(��:�̃��nV,1U/�� +F��� �
+�7x��8���z���Xϛ*�3�^#CP%"ȴY&�8ӄ!J(�2��
��PC+��͋���zbᬡO��
*B���3.�`@OW
���Pu��%�F at y6��n"��	ƻ�nn��[]�
۠w_n���<��WMM���k��[X�C:��D&X{,���0����-,.}�����s��ٝ.� ��f��3m�
�Qge� 
�@j�Y�
*‡anv��`\Ϩ Эa*/z>��U 
�� _.�}Z�f��}vT?�b+�_�~$��ϟf(Ih�������
t��N׾���A�||��6!F�=߁����X���Ss��8>�M�� t��ga��bp�F��|���n�1#�'/��Јk��#�P"�
�2�!zD�5��n�6i�/:����&3�><��j�o��H��^�?���ԡ?�d���
r���0z6&_�0�P��mq�P�rh���w�w����#�7�Ŷ�E5��y,����ʝ�E�]��K������j�1*v�����@���1#����4
+�9�)j�ZI����x��?6�1�f�xD6��nX�,*F#��у!s�Ӝ�A
+sz��<��da�M-�?v�
5�k?���ݯ���>���̏l�0Y�O8�H��>��V	&�P��a¤FTr٧�M�x<��ݮ���+'�슍�iF%��T2�V2�`��E��J��[ye}��3� �z�#x�����6��E^��άF�C�&4��y�r��
�!R&�2� �h��mʄ�^�rQ���y#q6݉dH�k>�4[�P�c�$9X<�=��l�u���=/�{<N��0��ݮ��t�kXhH�#񰨘w�Q���dg� br�a
�F(�-��zc���ŗ�;�H@�t�|���R�X�[X<�=��|�u�����}z�֒	O��Dp���ctFv�X�&�qX���P"�hsd�G�q�Ԝ�b����c�Gv��?��`���c���G-��pX�c�P
r[rL9?4J
���߳���v��]V�Ʒ�^����t/�uNJF+
�GI������#�0�;��~
c�
�oƽ9U47 ������
*�pl-��`�qrI� ����
���H!/�;�{�H��\�9�l]@u���Pnm�kF�ܧݏ�?�?v����UV�m%�=*�cZ<��Xf�>SY����XfT�E�5#x�!˦�&��l��~���~���ذ�`�]���(�Gv��u}|������VjͱDy��xܽ�
$GBͱd��0�,hĥ~�4���=.���u�q �r��
�Q:
+2I��
Ʊendstream
+endobj
+7012 0 obj <<
+/Type /Page
+/Contents 7013 0 R
+/Resources 7011 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6949 0 R
+/Annots [ 7016 0 R 7018 0 R 7019 0 R 7020 0 R 7022 0 R 7023 0 R 7025 0 R 7026 0 R 7028 0 R 7029 0 R 7031 0 R 7032 0 R 7034 0 R 7036 0 R 7037 0 R 7038 0 R 7040 0 R 7041 0 R 7043 0 R 7044 0 R 7046 0 R 7047 0 R 7050 0 R 7051 0 R 7052 0 R 7054 0 R 7056 0 R 7058 0 R 7059 0 R 7060 0 R 7061 0 R ]
+>> endobj
+7016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 719.9123 161.0133 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_9e847f0bfafeac6438cecb2d2114e665) >>
+>> endobj
+7018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 682.811 195.1648 693.7149]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_ce4c05e99016850c16c2bdaff5914afd) >>
+>> endobj
+7019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4917 669.0667 224.1615 678.972]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+7020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.2151 658.7758 209.8849 668.0131]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+7022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 635.1244 187.5633 645.6547]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_bba3cc93433c6564ba34c1fdd360bde9) >>
+>> endobj
+7023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4816 621.0065 271.1514 630.9118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+7025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 597.6495 179.5535 608.5534]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 597.6495 223.8571 608.5534]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_a09a1ddc7936a5377e838cb44610548e) >>
+>> endobj
+7028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 560.5482 179.5535 571.4521]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 560.5482 248.4444 571.4521]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_c53b2bea17ae404e291cbcb7033dbaf2) >>
+>> endobj
+7031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 523.4469 179.5535 534.3509]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 523.4469 223.558 534.3509]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_102ffa79248502b4998a70fba5f13d98) >>
+>> endobj
+7034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 486.3456 178.7267 497.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8cf170e729ac4e4576624d6ed7d4b44d) >>
+>> endobj
+7036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 449.2443 182.0442 460.1483]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_494a5dcf815a292978b1864d2d7f77ae) >>
+>> endobj
+7037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.3814 449.2443 308.7676 460.1483]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 412.5167 150.493 423.047]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_6a5f64baba3ae5704d9645db684434d3) >>
+>> endobj
+7040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 375.0418 191.7178 385.9457]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 375.0418 288.8524 385.9457]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1f0983add75d3a9c3663fbf925739212) >>
+>> endobj
+7043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 337.9405 191.7178 348.8444]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 337.9405 303.0791 348.8444]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_4254da492e5eeb1c12d8d87b997cd229) >>
+>> endobj
+7046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 300.8392 156.2812 311.7431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_a8e33c8dd37c45144bf92a6984c7706a) >>
+>> endobj
+7047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 300.8392 259.4831 311.7431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 222.6185 203.0748 233.5225]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 222.6185 296.3242 233.5225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8530a0719104225bd022dbe9529ae527) >>
+>> endobj
+7052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 208.8743 367.0193 218.7796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 185.8909 194.2975 196.4212]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_62e7b71f72659356d1d732236ed5f330) >>
+>> endobj
+7056 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 148.7896 188.7586 159.3199]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_864a52992178820135a7ae3a75e65377) >>
+>> endobj
+7058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 111.3147 260.3394 122.2186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [271.079 111.3147 333.1458 122.2186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_90e26e60ccfbe3c6ab8d91b5bf06dab5) >>
+>> endobj
+7060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [290.9649 97.5705 419.4269 107.4757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6) >>
+>> endobj
+7061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7014 0 obj <<
+/D [7012 0 R /XYZ 90 757.9346 null]
+>> endobj
+7015 0 obj <<
+/D [7012 0 R /XYZ 90 733.028 null]
+>> endobj
+7017 0 obj <<
+/D [7012 0 R /XYZ 90 701.0278 null]
+>> endobj
+7021 0 obj <<
+/D [7012 0 R /XYZ 90 652.9676 null]
+>> endobj
+7024 0 obj <<
+/D [7012 0 R /XYZ 90 615.8663 null]
+>> endobj
+7027 0 obj <<
+/D [7012 0 R /XYZ 90 578.765 null]
+>> endobj
+7030 0 obj <<
+/D [7012 0 R /XYZ 90 541.6637 null]
+>> endobj
+7033 0 obj <<
+/D [7012 0 R /XYZ 90 504.5625 null]
+>> endobj
+7035 0 obj <<
+/D [7012 0 R /XYZ 90 467.4612 null]
+>> endobj
+7039 0 obj <<
+/D [7012 0 R /XYZ 90 393.2586 null]
+>> endobj
+7042 0 obj <<
+/D [7012 0 R /XYZ 90 356.1573 null]
+>> endobj
+7045 0 obj <<
+/D [7012 0 R /XYZ 90 319.056 null]
+>> endobj
+7048 0 obj <<
+/D [7012 0 R /XYZ 90 240.7159 null]
+>> endobj
+7049 0 obj <<
+/D [7012 0 R /XYZ 90 240.7159 null]
+>> endobj
+7053 0 obj <<
+/D [7012 0 R /XYZ 90 203.7341 null]
+>> endobj
+7055 0 obj <<
+/D [7012 0 R /XYZ 90 166.6328 null]
+>> endobj
+7057 0 obj <<
+/D [7012 0 R /XYZ 90 129.5315 null]
+>> endobj
+7011 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7064 0 obj <<
+/Length 2895      
+/Filter /FlateDecode
+>>
+stream
+xڵZY��~�_�'GJ,,n�c�ac{]q���$y�][
	3C�"����קqQ�D*٤�j	���F����!+
��*�+%J�����
a��>o���K�ۻ�Wo�X%(�T��

I������?�	ATn�c�~�!x�V����
��2y2�*���J�����l��;S�*m������1�͖
+��:O��ߙSm�^�bg6[�aH��t��ͷw��a/�IbU���?��
���
F,�b�
/�$���
�,��7�o����܂)�®�	eK��M�T�)����#�1�l��$hG�q�����#�b(�`XEA�Y�-Ւ\�Q���˽/�|$�	D���S�h�u5��K��Z
ʣ�����$8�
��TK�5E�q6�;xWu3N�FZ1v�Z�5�|��A5P���P�����`�������}�N��qX�Pu�IZ�%]F|�6	�
+1-��MZ�E8(��"�����qp*D$]I-rR0��p ��iǥ
a���]
N+�W���4AX%�,�j��4��p�	2���3ȐLHb��d<Q�)�:%q���i�����_�>�E�=5�$��8�_!I	��	H&P�<��"�j������h�]����8��t.

�Cr��:�H�6&�ͩ�5Y��fP"@x=iSП�&�yJ�82u�L�0(���`�P`��!�BS�
+j�Ԅ�.V�.�L�j�+֬�s�Z�+VOn��oo˺�L`�g��!����������0҄t3�"�����P5I%��j�ԣ��{Y���Y=��)EDѫ
��/h8�{}�'P�X0UK��E���g��\��r�8������1��[2�֟O����:ۆ��s8B��b������Ee	E� ���
	,��F�ZNgvs9cVh�2:Bq�L�	�1Jt_��,�TruI�ٵUǑ
+�A�Q��
�+�DU�gp���PMPB��vߑ|A��������&��$��(��N'j�B-Ѽ�
3D�=z*Z�;�56���1Z��C��
����� �A���y"��Q���( 5E �
+�>��2Y`"նK6Q`FC�В-�cA%�X�OJ�

sI3�Y���.K��_f
+#n�Z�P�]y��}x�s
�XGz9�Z4�e�I��𘄛\3H�si�H����4i�G����wUv��p��k��EN��G�0��V;X
��s��f�X�.�6�&��S[
�'v�zh�� &Yb[9���j1�mw�T:�jP��d���*
�&R-(B5�/�E���$��h|k/o�$ߍZ�hc��3dP�S�d�i�,�q�>��$(�?}w�	�D~ᔘ���!p `Q&�����`�Jh�w|J����l���x"Ղs� �lO[6�0����i�
Lc��[�7�`�c��C�h� Y����SVԦj���/9�ϊ��S{��c�3��HЯW�����/�NC���:=5�!u������ϧ�7�@P�~6�vI�ǩ���*|p��|  �\��7?���D��hX�O�b�
8�?[�K:{s�k
+Hk��a���m�cx��e���S�{�DY�:��h��)�3��	S?Y���
��K�
dp��:�ϊ]~���6�sn�z�oea���|�H4V�r
-Y�L����>������z��A� 0|+�	S��O�c�Ϯ����um/?���5�b>��}V�p�������:�^d�n�����7�h�gu���Q���%�,D��d�G,la
+�H1۔vyL5*�MKf������
��z���p�M�s��,�C=
b->_�@b�^���
P�-Y��i���j=]�H�&��:\$�J����
�x��
_��p�T�yi�o���Y��$�&�s�t
��LZ)�(L|�UJ��Z=�
��B6\�^�m��":e��b���SLZ�)'��X�7��#ѶK5�gP(f�+!�)�8M��~�MI.�oV��n#���%��y��:�cP��}�����q���Sj��_���O��9��kZ{K9���r.g�

J��~�1
��� H�"v���@�uZ5����WQ�P@�	��.���.>zVf�wc�<�7x�B��D���w�!I���tb+
��J�]�&�1¶a�.���3�Ԓ]��.\
멐z���3���,~��a_>�e��w� BK	{U��pv�8R��:Ӯ{l�s`7 �
Ac��6����k^[W�|��g
8���i�#
�Ժh�"~��-��
j��]YU�>��G_G��e]���
���P|�N_ߛ]z�W�n�S���4p,G����ZK���d[���n�����n���s��� ��B�X�&̝7
h�H;��*˒����	�Х<�0
�b���$٢@ �1�d�����>$� �|�Z�����Ǭ����G�{�.�� �.ŧ��cD�+�K>�-�t�9�\����X�KF�!6��A8a�?�P��޶��b7�s�m���5l[�Th[>
۬G��M�C7���nv����㵦Q�����
o$�?
����\���c�-�\�+��J���)��`;���O�� ^M�
�!�p��&��,��wy�����.O���t��C��	���s���Y��
���l
Bk0��*|��Fa��}���<=>
��7S���0�E(��۳
hⅈD_�� R�*�
oV��#�耉;OD{���14�!
(�8!
 �]pXO��%|�M^�c�9P~�߁����
��.J>o��D
����5����p��_�
+�����g���4t��ؽsWu�킪�X��=��xo���Q���H�J��?Vq���dX��9��_��9޾z����v5:ٱBY��x�_�~�%T���۶D#]z��7�º��C���PƂ�0i+BY����5߄*��P��endstream
+endobj
+7063 0 obj <<
+/Type /Page
+/Contents 7064 0 R
+/Resources 7062 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6949 0 R
+/Annots [ 7067 0 R 7068 0 R 7069 0 R 7071 0 R 7072 0 R 7073 0 R 7074 0 R 7075 0 R 7076 0 R 7078 0 R 7079 0 R 7080 0 R ]
+>> endobj
+7067 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 697.2473 180.5399 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_e64d3d01d4baab5102f00046f941188f) >>
+>> endobj
+7068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 697.2473 307.2633 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.9964 697.2473 448.3827 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 589.2061 226.0342 600.1101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8e247a33c9eb40439c706a98c5d363d0) >>
+>> endobj
+7072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 589.2061 420.5622 600.1101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.3255 550.3518 166.6915 561.2558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_d85c523fefc56e289bd9fdf878bb339a) >>
+>> endobj
+7074 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.9173 550.3518 391.386 561.2558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 550.3518 513.9963 561.2558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 538.3967 248.7133 549.3006]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.2428 438.3257 281.6291 449.2296]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.6092 426.3705 202.6746 437.2744]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7065 0 obj <<
+/D [7063 0 R /XYZ 90 757.9346 null]
+>> endobj
+7066 0 obj <<
+/D [7063 0 R /XYZ 90 716.2211 null]
+>> endobj
+7070 0 obj <<
+/D [7063 0 R /XYZ 90 635.4586 null]
+>> endobj
+7077 0 obj <<
+/D [7063 0 R /XYZ 90 501.0766 null]
+>> endobj
+7062 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R /F33 485 0 R /F7 574 0 R /F8 568 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7086 0 obj <<
+/Length 2587      
+/Filter /FlateDecode
+>>
+stream
+x��Z�s۸�_��V�E0>	О>��K殽���>]n2�HۜR����}w���R;i;��@`�X,v�
�-(�c��.��$2Zl�tq�o.�^��zH������H-bG<Z��Y#�3��IY2Fx�Z3J���ˤ�&�Zq�����,����o�~��zS���7Y��I[���>5m�]����?IӸ���]V��Yf�&[���&�b�����t���(1���_~�����%"6j���8���"|o/���qvœJ$��Cmk!��`��jB�('Zpj��H�^�z�Ք�ӄk
-:2T�}C����
U�
�����~Q���QE8U
+�����`�$ц�Š��j
��|�~����bF����O�,��ׇ�7�Pf�"2��H�Y����jjO&&�
+P
*Ν
���lwE�́.�u�N��QMP|  ��h&T�
%�y�թX�UEQ��Z>����T��E3��E��K�2q�M�khWw��>X}��u��2�����
k�8ƛ�l��Hפ(怹d+�`nR�s���r�j
�;ZU�_�
���(F��D���R�Tg3�� ���f�u����7�\�	
��
M���ݓۙ��6`����A ~�Y� ��t �f$,�#'�Ҋ�2�H͐�H
�i��b���ټ FK�~=�k1δ���'���\� ���bh`֮
� �t�dܑ	1D^"i
����b�
�g�e�+�E�	%��
���`Ұ�@/�ƈŚS=���r�T$����-ڶY�9
!�Vܱҩ�R4��cs&J
c��<�����4:�5�'�#�ŏ�7����:h2�j
+���N�Y���1o��,&J1���
38�)�R�.���
���FiAt,��x3�:
oT
T�D�x#�Z���{˙0o:�>ްho��G�F���h�� C�x�	���1m��s��خ5K0l��&����u����Ö��>la��;	
������6�cI�G������6��., ��C��H��3a`H~:�τ��Y~����>����y��D/ÍϑW�w��c����`L��qnHu
�d
T����򨋜\�w�� �8ב��>A��r�XP�f������.I�ѡ�}�ڲ:�D��)F��1s���t�4{G)/��9
,�
^a+i&���i���2B>�k�)��y�GN`
����j-U��{�fn̯b[��8��3v���S�t�,i����cv���L!��C$���qsw�z k	`�%
+��zv��N79�w��b_�&J�M�?�ݤ�]� ��*��e��8
qvZ�G!g����\��&)�'J�8wu�=X�����s�q��q�%������.ſof* &��ʄ�Lgذj��g����
4ǃ��ᆊ3�א�D���^���%����;�K	h�9�c�8k�T^�<�s/�~�O���!��
�~��Sy�I��C
y֎��G��
�٧͞�-�8K�hHsi�`�8�N��T�� !F�i������{��0�ud}�����b�>(�������=��=�
�{���C����q޲+���"�
�RP�Rp&�骹��nt	9)����"Ϻ�����pxF��
��:/�:D�ofX��#x�20`
q���#n҄[�I|6&\�����
>H�>y?'HĔ���fM�¸:3��OD�@���<{ižv�7�:�옹������sC n��P7�:u\FD)�|����fvjف}
�;�p
.��;$
� ��'�m���i��uZ
���Ulk���|N}No
&�C`i(�x�8�FY�y{0�'{��;0B��Wk9��D�
+�!�~L6�
F�;�:n�
V0Xfi�񚡈[�c�T�%t�Y[箎�/*��cJ8U���y�ʁvU�����
+�S���}�!)���ـ�"� �^�݂N� g~8D-���]�A铼Hn
(6��r��

_���0��}^�x1���K�\�6��s�eex"�j[{�
+��
+	�
]'b@~�,_/����*��$
��}�&��_"k7��|C_\3��
�HҸ+'ܿ���mo�-��}���[��/�f��3�޻���^�lȈ0�ꃭ�񼘌�3�ᯮ��Z&��	���3�s�s�}��s���50��K���3�`���h�J^G�ؗ2�nĥ
��[��.�f^�����q���u�H{g2� �.iH�pY�9���˅F�Kƒ@
��j-�_�
����M�%��ɴ���hvIxAMs0�L*(˓�Y��}���b��h��.����
�	~Jxp��#j
����e�Y���Y]��p�{�-���[>tYb\u�-�10l=+��>x�Gw

L�ҩlj:B@��#x����Cux�ܵ�=�SH̕
{�gl��ƨ���6Ff��F����E+�T���v@̘
s�>w
їO��ő�H�?ԹO�w�� �_)���1)�!� ֹ Q��Q�θF4"xeJ�o��P?�V�
+���������~�݄�`F���-O����vwuy���H6
ٗ��&y{����rI�pc�ũ�[wDYFꗐ
+F2��,w�U�:�[�&v�ج(��Nseendstream
+endobj
+7085 0 obj <<
+/Type /Page
+/Contents 7086 0 R
+/Resources 7084 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 6949 0 R
+/Annots [ 7090 0 R ]
+>> endobj
+7090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7087 0 obj <<
+/D [7085 0 R /XYZ 90 757.9346 null]
+>> endobj
+7088 0 obj <<
+/D [7085 0 R /XYZ 90 188.4172 null]
+>> endobj
+7010 0 obj <<
+/D [7085 0 R /XYZ 90 166.1054 null]
+>> endobj
+7089 0 obj <<
+/D [7085 0 R /XYZ 90 166.1054 null]
+>> endobj
+5731 0 obj <<
+/D [7085 0 R /XYZ 195.6329 89.4414 null]
+>> endobj
+7084 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R /F1 583 0 R /F8 568 0 R /F7 574 0 R /F25 348 0 R /F33 485 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7094 0 obj <<
+/Length 2005      
+/Filter /FlateDecode
+>>
+stream
+xڵYmo�8��_a�w6P1|'t�k�ž�o9܇n(��+K^In.��w(�2%1v��!HlI���3g���C�)^*�Pʸ\nv
���ۯ�=N�y��jq�J�e�RI���� 	������D�:!���5����e�o�����>�6��/�M�5�����b{�:��&�����c����M]��u����
+�zQfmk���o�fM�*�69LE_Q�ן�~Z��j ��M0I
�??����F,�b� �4��݂S�/�ŇŻ��}���H�%1�
a)�#�(�.N7u]�W�ֈ��َ�


��^�q4a�x%h��($)�p^���]l�[���Qw��'՚���5 �Ȫ΍�g�f]���1ͷ�Lz���ӼϻCS��T
Ɛ�
+���u�!����qɽ��)WY�5_Ԫ��G{

��i��#�ai�h@�"88J5�
�}�>	�;*ZÂ��)����KQ�_�	�<���[MmF=8�}��.Wm0�Φ�l2�m�|�$v)�B�H���Qs�l�
�p@��ѻ����L�OX�=�S!�&
|�%4E�a��J -!��
���lo��L�<2�#d������|�W]��,�m��
�R�s��B#�9No����S��pI�I�Oq2I�T\L�N�9X��7�6�s�o	U�%� �\2ǜȽj���:����z-/�!��զ+��^��7�2Y�	
+����h��꽍��ߛk�ˢ��qTD���K�(��{a�O$�rxmz�N$�������}H�&j�I�ѹa�⃲��ϕ
|hJ�3�xۯŧ��%6&��i���n��y��d$��
!
��=� ��DZ�� ����חH+��� �pⷴb
�+6Ye=���Ϣ�6���^^�mg+�
֜kb �uOH��lYL��>
�@RX#q��~j�9�CLb�6�A�?�:%ē�8}"������D�yp�Q#-`W9Ie� �ZS>Ό��U�O��7�n�
����V-�n��16����6+����)z$�ܑ
�|�9��"�9�\�}���7�D��@��<m���
+Tyokt��S�22��$-4��P��۝_t�=�Z
+#Axz���

3�m�])�cw�

%�
)���������c�R�&�q�g�3���'�
%���>�ڼ6���C�7�x�v�V�[O�da�,�X�~ɖC�EA��
2	�Ʌ
���@��E�E�cX�e�ݛN�qB��J�q�~�����F�D��=ɍ>�k7w/���!uu#��3��+�mGE�� }��w�;6��
+�
�H��s�u��eii_Tw��ô�/#�.��WI�קZ�� R�bS��n>���F���FQ�fO�8X���-Š��y������{���}�8"Z��
����p����l�$�+�J��0"��aTX���2>�M�����ݝ̵�A&֮��k��E �(���~�]Qm��6�T
c�?�i:R\��!\��f�/��ﱠ���*�I�cXѵ�.��$�BR#̠�>�y�$
��~���Qf֑Aa�)�@�ud��
๷@���N��~����M�O�"�k��D�N����KL�(p�a=\$�*�� �&FFS�a���K�-���k��G�?/�Ż��]��uL_���UOJ&�>�bƞ<�#
#��U������؈���n|
�ζ�Ĉ�zAqB`pB����}j�0Чr�k�9t�n��t�	~����
V��M&��礳)D�S��4:3�J-�C4;�����$��Â�j}	��;�� �ǩ
���mv(����9lL��^�)�)A�c��`���  [...]
+endobj
+7093 0 obj <<
+/Type /Page
+/Contents 7094 0 R
+/Resources 7092 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7109 0 R
+/Annots [ 7097 0 R 7098 0 R 7099 0 R 7104 0 R 7107 0 R 7108 0 R ]
+>> endobj
+7091 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 7110 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 324.00000000 96.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 7111 0 R
+>>/Font << /R9 7112 0 R>>
+>>
+/Length 7113 0 R
+/Filter /FlateDecode
+>>
+stream
+x���Mo�0
���>nfB�J�M�w�(m�HQ�Ŀ�L��M�&'�+�q
;� D�����6�c!���ʻ��m��ω�$4��հ
+b����V�#p&�(�	�|�0� _��p�
�͋'���*g8��f^Ɗ�{����u�lY��v<�{W/͛+ݘ��k�EV�kW�+vc?�6M���E3����
�s�,
3���
'
]��S��B��
+���_�)PR!��P��<�P
BŴv����D�|	n��>��:~&*Q�u�$Z�j��~@�RN��>�S�Eendstream
+endobj
+7110 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142735)
+/ModDate (D:20080908142735)
+>>
+endobj
+7111 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+7112 0 obj
+<<
+/BaseFont /FQJGXQ#2BFreeSans
+/FontDescriptor 7114 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 121
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 0 556 222 0 0 222 833 556 556 0 0 333 500 278 0 0 0 0 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+7113 0 obj
+283
+endobj
+7114 0 obj
+<<
+/Type /FontDescriptor
+/FontName /FQJGXQ#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 7115 0 R
+>>
+endobj
+7115 0 obj
+<<
+/Length1 56276
+/Filter /FlateDecode
+/Length 7116 0 R
+>>
+stream
+x���|�����eJ���Ph�bY��nɶ�h��:�3��S�ҽ7�{���{���{�'K_)6?C�}��'9GGG�{�:�{�e H� d� �&Z�Ϝ���7
�~��ޛ�
�_W���}A��C
x�����0�ܿ�|������:�X��� �:�3&�=ÈY�7�����qݽ�E���-^y�J����}b��{s����J��>�~Z������?���2���W�TOyvb+Ap��՗��x��=�\�^���0j�fi�3�f�M�[�ljc��<�{mY��z�W&׍�K��IB ��N
�t�X�\:C��
�,�*y"t������K� =F��>�>�؈��J#ѻ��K��$�q6t�P�۠��V���bErs�,���B��k���1���c��
�#�
i���y��蓠��a�E�=fC�#�YL?�&JD1@��k�h!4����Ez�N7<�%ʞw��fzOמZH�|[�^��'�D�g�=�U��H�R�@!�Ym�Z[��j��o��-��-3K�Յ�r��-�;r՞R�{(ę�U$*���+zڶ���+����.�
=����]�Pk�Lt���=�VOn�T�A��]#���s��*�n�ܕo�Olm�QzО�%'�'x�'�&%��7׼;e��B
1���Y [...]
�����6b�w��{U=�b21���˼���)x������v�j_����ޞ՝o��[J�-��JK�ך-��*��|GK��m^���R-�L�6�er��/�
+-���z�[��i�+y��n/��7<7&&y�'z�=����I
t���Y������FtW�}O��p�‰]���^�NjLj���W��]�-
��^����6���ц�<9�v}~;�����K�ֵ�
^����k�
�gO����ria�k�E-��{�*-����F��Bn����R��]�
+X��txZ�K��<�o�B��}~+�0k�~G��C���x����jO������z���G��h��^�?�լ�ע��
��^�݈�֠�D�Tk�'��J���
+����g�SD'��Ol���)�"i/
�X��C DB��R�re�����Ċ^~
I�"V"F+����kkky��!�&�z�u
b]b<�
�>����%'x�L�2H��$	B��eқ�)��mbSb3bsb
��l��2o��zSz21���q��^�o�u�t�#��2�Lo<��r�
bGb'bgbbWb7bw����}5qqq(qq*�9qq,q4qqq�ǪGo'??��ӈ#���w��s�+�_���_�
�k�'��<
l��x�a���q�I�9���!�%��Z�%�y��:���'N ^%^&^��+��H��z���ug�8��=�+�Y��u�B�Ko��f��ľ�>������~ފ�@�k�[�N�%9�'R$%�b	)�
+��1�_�ć�+��I�\�
A�$G�+��ɕ�U�U�����5�߉?�5ɵ�r
�69�
G�C�K�'�#�'7 7$7"'���Id+'52A�A&I�L��1�	�)�!���9��%i��&3d�t���r*��5q=q�
�-9��NnGnO� g�����_���Z�rr�#��3�
�+��;9�܃̑md;�A��N���&{�y�|�.�@��E�D|J|F��{�e�BV�~r��\D�{�{����������������������G�G�G�G�ǐ��c������ɓȓ�S�S�����3�3ɳȳ�s�s�����
�
ɋȋ�K�K�����+�+ɫȫ�k�k������ɛț�[�[�����;�;ɻȻ�{�{������ɇȇ�G�G�����'�'ɧȧ�g�g������ɗȗ�W�W�����7�7ɷȷ�w�w������ɏȏ�O�O�����/�/ɯȯ�o�o������ɟȟ�_�_�����?�?ɿȿ��%�Tm�RM1KqO	�HI�L)�JŨa�
+�pjEj5�E�D��V�V�V�V�V�֤֢֠Z�1���Xj
��.5�Z�Z�ڀڐڈ�@M�&Q�T�Ҩ�S��L*EY���&Ԧ�f���Ԗ�M9T��PYʥ&SS���V���6Զ�4j:�
�=5��I͢fS;Ps�
�����]�]�ݨݩ��
T�j�ک*OuR]T7�Cͣ�S�u���*R%��ړx�x�x�x�x�x�*S�J�S
���"j�ڋڛڇڗڏڟ:�:�:�:�:�:�:�:�:�:�:�:�:�ZL
K
G
O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O]@]H]D]L]B]J]F]N]A]I]E]M]C]K]G]O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O=@=H=D=L=B=J=F=N=A=I=E=M=C=K=G=O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O}@}H}D}L}B}J}F}N}A}I�E}E}M}C}K}G}O�@�H�D�L�B�J�F�N�A�I�E�M�C-���6IS4M34Ks4O
�HK�L+�J��a�
+�pzEz=�
E�D��W�W�W�W�W�נפע[�1���Xz
��.=�^�^�ހސވ�@O�'ѭt�������M:E[���&��f����M;t���Yڥ'�S��V���6��4z:�
�==��IϢg�;�s�
���]�]������
t�n���:Ow�]t7�Cϣ����.�%��ޓ.��J��
��"z�ދޛއޗޏޟ>�>�>�>�>�>�>�>�>�>�>�>�>�^LKGO�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O_ at _H_D_L_B_J_F_N_A_I_E_M_C_K_G_O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O?@?H?D?L?B?J?F?N?A?I?E?M?C?K?G?O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O@HDLBJFNAIEMCKGO�@�H�D�L�B�J�F�N�A�I�E�M�C/��e�d(�f�e8�gFd$FfFeb�0ff8�"3�ɌbVbF3+3�0�2�1�3k0k2k1- [...]
+Se���Bf3�������������
�
�
�
�
�
�
�
�
�
�
�
�
�,f�e�c�gN`NdNbNfNaNeNcNg�`�d�b�f�a�e�c�g.`.d.b.f.a.e.c.g�`�d�b�f�a�e�c�gn`ndnbnfnanencng�`�d�b�f�a�e�c�g
`
d
b
f
a
e
c
g�`�d�b�f�a�e�c�g^`^d^b^f^a^e^c^g�`�d�b�f�a�e�c�g>`>d>b>f>a>e>c>g�`�d�b�f�a�e�c�g~`~d~b~f~a~e~c~g�`�d�b�f�a�0��K�K�
˲
˳+�+�
+��1v�;�]�
��dG�+��ٕ�U�U�����5�5ٵ�v
�6;�
Ǯîˎg�c�g7`7d7b'��Il+g56���&Y�M��1�	�)��9��%k��f3l�u���v*��5�
�-;���n�n��`g������
vGv'vgvvWv7vwv.��c��v��ͳ�l�������l��e�l��c�d�l�����v!��
`�b�f�a�e�c�g`dbfaecg�`�d�b�f�a�DzDZdz'�'�'�'���������g�g�g�g�����������������W�W�W�W�װײױ׳7�7�7�7���������w�w�w�w���������������������O�O�O�O�ϰϲϱϳ/�/�/�/���������o�o�o�o�����������������_�_�_�_�߲߰߱߳?�?�?�?���������������K�9�#9��9�c9��9�9��9�S�7�[�έȍ�Fr��������*ܪ�j���ܚ�Z\
7�[�ˍ������s�q�sprq���$���s��t���ɥ8�ۘۄ۔یۜۂے�9�Ks.˹�dn
+7�ۊۚۆۖ��M���fp3�Y�lnn�#��3�
�+��;7�ۃ�qm\;���N����z�y�|���rE���q{re��U�~n��[�
p{q{s�p�r�q�sprqs�p�r�q�sGpGrGqGs�p��c���������S�S�Ӹӹ3�3�����s�s���
�
�����K�K�˸˹+�+�����k�k���������[�[�۸۹;�;�����{�{�����������G�G�Ǹǹ'�'�����g�g���������W�W�׸׹7�7�����w�w�����������O�O�ϸϹ/�/�����o�o���������_�_�߸߹?�?������%ܿ<��<��<ó<������˼«|�Ư��W�G�#�Q�J�h~e~~U~5~u~
~M~-��ï͏�������������
�
���	�D~���y�O�:o�I��S��o�o�o�o�o�o�o�ۼç�
��]~2?���o�o�o�o�O������3���,~6�?�ߑ߉ߙ߅ߕߍߝ������6�����|'��w�=�<~>_�{�"_���=�2_�|?��_�/������}�}�����������C�C�����#�#�����c�����q���	���I���)���i������Y���9���y������E���%���e������U���5���u���
���M���-���m���
���]���=���}������C���#���c������S���3���s���
���K���+���k������[���;���{������G���'���g������W���7���w������O���/���o������_���?��_�H�h�X�xADAdAT!&
V�
+
+#���(a%a������������������"���
+�u�u���z���†�F�a�0Ih�&$]0��`
+)�66666��l��BF�
+�0Y�"L�����	Ӆ���La�0[�A�#�(�$�,�"�*�&�.��rB��.ty�S���
a�0_(�BQ(	}žBY�77	U�V�6�a������xDX@
D<H
.,W�
+�^���>¾�~��Ľ�}��A�����!¡�a���‘�Q���1�b�X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r��
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��t�[�;�r�{��G�'�g��L�W�
�;�7�w��O��/�D�o�a��Hg��H��Ȉ�ȉ�(�"q�(�'��������+�����Hq���8Z\Y\E\U\M\]\C\S\KlLjk�c�q�:��xq=q}qqCq#q�8Q�$��qQ�.bR4Ŕh����������[�[���i1#fEW�,N��[�[�ۈۊ����v���
q�8K�-� �wwwwwww�{�9�Ml;ļ�)v��b�8O�/�^�(��>qO�,VĪ�/.���q/qoqq_q?q� �@� �`��P�0�p��H�(�h�q�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�xq�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x������������������������������������������ [...]
+R�T�JR���T�*RU�H
�EҀ������������t q?�t�t�t�t�t�t�t�t�t�t�t�t��X:V:N:^:A:Q:I:Y:E:U:M:]:C:S:K:[:G:W:O:_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_z at zPzHzXzDzTzLz\zBzRzJzZzFzVzNz^zAzQzIzYzEzUzMz]zCzSzKz[zGzWzOz_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�GZ"�+2)S2-32+s2/
�(K�,+�*��a�
+�pyEy�<R
%�$��W�W�W�W�W�אהג[�1���Xy�����<^^O^_�@�P�H� O�'ɭr\�䄬ˆ��M9%[���&��f����-;rZ��Yٕ'�S��V���6��4y�����<C�)ϒg�;�s�
���]�]������
rNn���9/w�]r��#ϓ���W.�%�O�S.��*��
��"y@�K�[�G�W�O�_>@>P>H>X>D>T>L>\>B>R>J>Z>F^,+'/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/_ _(_$_,_"_*_&_._!_)_%_-_#_+_'_/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/? ?(?$?,?"?*?&?.?!?)?%?-?#?+?'?/� �(�$�,�"�*�&�.�!�)�%�-�#�+�'�/ ($,"*&.!)%-#+'/� �(�$�,�"�*�&�.�!�)�%�-�#/��U�T(�V�U8�WET$EVEUb�0ee���2B��RVRF+++�(�*�)� [...]
j�4�T��Hj�VT�<y�:�y���u}T�.���|��+v�s�����y��
e�z�B��M�@_0�x�g
+�/nZ�|1x~Z�������.�j�N�Kހ���.:_�⧣�%T~zP��/����Ů\����믪��+nFC9�aF}
��f1�13x��
yf]3Vu����Oj�	nV�p5h�Y����:rvБ�AG�F]�Q��A]�}��.�����ouvC�������~̕9u1.��w��un砆{�B�yp���l�T��K�B�!Q�TR�4 ��&d
+҂�!
�4d2
���|
�p-�Z���k��\
�p-�Z��\vzw�\dK�߁�F�m`����m��
l�6�m`����mg��>f� ���:�v�� ��l��
`;�v���7��M/
�4���K/
�4���K/
�4�ҨkuM?
�
�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�,���?
�,�79��]���Y�g��z�Y�g���
t�.�]��@wQ{x�%ٵLL�\��v6��|���W
+�Jw��u���2�A& uH2	iB� -HҁLCf ��A�8����?�8����?n*3��y��bV�E���"�8bЀ�C��:j���:j���:j���:j(_C�	�1�:&P��hཱྀ���}�g >���@|�3���
�c �$���iI�%��^xI�%��^�D���K��	<x&�L��3�g��	<x&�i��&�M��i�/
����4����_�Ki�/
����4����_�Ki�/�>�Ki�/
����4����_�Ki�/��
\��0

���4p�^��
�|�!�k��Z&!v�s
��k��R��{�VM�W<u
ҀLB��)��T��k+-�ʆt Ӑ�,ds�$�|�@>I �$�O�'	�D
Q�S�$����?|�rIB��)�Z�-_(-
�
M�&�D�@�I �$�hH4	$�M�&�D�@�I �$�hH4	$�D�&Pn�&Pn�&P.R�&�����M`�&0!f�������ѓ/�+=�J�
}�9_s�R5_���l_��[c�f![���%h��ޞ�
+9��]�,M��wN�{<�,��b�|5�N�yy?̛i�cv�n�

;��Ә �u��/��xz�:rԶ�Դ~j�

P���3�K�̞��
=+��#z��
:��lW�	`lK�Z�08��R.j%__�|X����#�
*�?ϴ�*�U�
ۑ/Ts<�b��U�v��W�V;߯Z��Z�����Ԣ
o?�׏.w��J�rq�tի#��>�~�ޏwɖj
�Է����TJ���_�k����L
$��X魭b���'��c��H�"m�
iF�%#͌�T�Y����0���Ld	��zTn<*-
��J�c�"֢��(N-*O��Ԣ���d-*9���JND%'��HD�#a$"�D���0�C�0�C�0�c�]�C�0�Cl��d�D2z"=���0���(3�Ōb1��ͨd3*ٌJ6��SQɩ���#a�"�T���0RF*�HEV�aEV�aEV�aEV��Հn
��`i!V<�9��H��pk"��H3"-if��"�~87��+�C<��p7�cU�cU�cU���h&�O@|:VF:v�:VHzX&VHz�&�s�+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
�|
�|
�z
�z
�z
�z��
<x����������������������������������
�cE�cE�c��c��c��c��c��c��c��c��c��ce�ce�ce�c��c��c��c��c��c�c��c��c��c����L8Szx����������5�
_�
_�
_�
_�
_�"�,p�� �|
�|
�|
�|
�|
�|
�|
�|=d8��u��u��u��u��u��u7�3��3��3��3:���4!S�a96����@f!��
��:�u���ׁ��1t���ׁ�_�|
�:�u�col`)j`ol`ol`ol`ol`ol`/l�Þ����0�����������=��=��=��=��=��=��=��=��=��n��#�#�#�#�#�#�#XrXr�#�#�#�#X��#�#�#�#�#�#�#�#�#�#�#�#�#�)۟�^\�&/20RMk�4-�KD�
iF��"͌�MF�dd��&Bܤ
��ңt-zB��0�$NR�tx/�
ԌHKF�i�H����H�G�i�a��a��a�F*�HE�#a�"�T���0RF*�HE8�0[C�� �:���4!S��
�@�!�1jb/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/o�C�,d0'L��M
��5�c;ob;ob;ob;ob;ob;ob;ob;ob;ob�n"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qPO�x9�D�7��M�x9�D�7��M�x9�D�7��M�x
���8�0N,�
���8�0N,�
��j
�s Ӑ�,dP
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
���1��c 
�@Ɠ��da<YOƓ��da<YOƓ��da
YGƑ�qda
YGƑ�qda
YGƑ�qda
YGƑ�#�,�,�,�,�,�,�,�,�,�,dy
k
k
k
k
k
k
k
���
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+������
�\[O��_�.s��ʂ\9'y���J�ܕcjf���W{jjOOM����o.����%_�=����n��.�����.���_����yp�E���}X;:�ˎ8���kPJG�\��|S_`j�/ڂ�^�������.��+A���o
~w�Z���9���ʹ����\�\��SSD��BShꏴ�����r���"S)2��t�*�b5��N�����\y>��G^*0���R�B���XXX!PkM�W�\����y�1��M��|�vg��w��Y�߯�,�ݯ��~�=]�՚C��������)_m�)�@����Z��E���X�h�/�����x��V���Ї�]�Z_F�׋e����c�l�
ޱ�;6x����
�b�Wl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x�����a�?l�
���6����
�a�/l�
���6��/���`�l��o#����6�<o#O���6�<m#?�ȳ6�<k#��ȳ6�<k#��ɰ
č<k#��ȳ6�<kc�dc�dc�dc�dc�dc�d��D{&�'��<�Ɖ���m��m|~h�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l�c���)��S2�d6N�l���8%�q:f�t�Ʃ��S1�b6N�l���8�qf�4��i���0�a6N�l���8
�qf�4��)��S0�`6N�l�~�8��q�egC��p�d�����3&gL6Θl�1�8c�q�d�����3&gL򞃼� �9�{�|�`}� �9�s��� �9�o�|� �9�c�<� 9�G򎃼� �8�;������ �8�7�|� �8�7֡�u����$C;�G�p�7
�
y�A�p�7
�
y�A
p�
�y�A
p�
�'�濃���t���w0�
����<w0�
�k����u0
�S�9��楃y�`^:8�v0?
�O��橃��`~:��桃y�`
:��N�
�7���i����`�9�oN�
�
;8vp6��l��p��F���?i�O��F���?i�O��F���?i�O��F�������i��4�-�~K����4�-�|�F>N#�џi�g�8�|�F>N�����4�1�~L���Ki�4�Ry)���F^J#/�����K� /ų���'�dR�4 ��&d
+҂�!
�4d2
	�8����?�8����?�8����?�8����?|
��5�k�׀�_�|
��5�k�׀�_����O ?���O ?���O ?���O ?|
�:�u���ׁ�_�|
�:�u���ׁ�_�|��
��7�o � �|��
��7�o � ��$��O?	�$��O?	�$��O?	�$��O?	|�&�M��7�o��	|�&�M��7�o���rs�ĸ����w����qa�ϥ��~
+�)ী�~
+�)ী�B�-��B�-��B�-��B�-�[���o���rm�k�\��(�F�6ʵQ��rm�k�^vX>�e�^6�e�^�
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~ȫ.��8�S0�|+�]��@w��=��9]��
�v��.X�K�`i,킥�ְ<ҁLCf ��Am\��
�v��.X�K�`i�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,삅]����x�X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
Vu��\�u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X��� [...]
+x)ी�
X�k�`M��5]��
�tS!
�
�t��.X�k�`M��5]��
�t��.Xӵ��t-�[���o��]]��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.X���`U��U]��
Vu��.X���`U��U]��
Vu��.����`Sl�M]��
6u��.����`Sl�M]��
�t��.��{�`O��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]����
x�?��G������

8�����:��s�mE�<g���'�RgOW9ߑ�t��V�^N�{������?˕|\�@j�X�X�vr�X��:�����s�=E�K���R�I2	iB:b~Q{!���V�%H
O�xB�x҂t��'F���|���`̸R��(4*���
�ҳ(�U�c�����(z��RtQ��)v%x�����Ȯ�R�W~�^�3^�3~ѕA�P-����W��\P?;z# [...]
�
��C���
	,
X�RC�K
O�!�H^�U�{�
��v�R	n� �H�{��"���V�6�\ke�߰��s��'Z�%Z�ڞ�!O�$O�$OM�DS$�I4E�ڞ�	|�&�M��7�o��	|�&�M��7�o�t�\�\ZX���y_��|Y�5Sp����hm^�p�(��=�'��eol����P+L
+/���P����j�F~�^D��+��E=/�T{r!��W
�ƹ�m�
x���
������/���
��7�J�׹�������mMO�J�+��S�ߛ�v�h)}�R_�\�/0r6W�*�B���=W��D��$�)VkY����z߱��
K
߰�dV�v{��Y*��JOoO!��WӂU���\Oj���
�A�d��C�o��"^�~�R�K�|_�?֚�����B���0�z�}�ڿ��Ɛhm�j�P�Զ���:�
Lfz����`��k�x�!�C�IH2iAڐ�W`k}��,�[sH
:{/Oj����V��!n�
�:�G
q?�T�b�#P��ᾆ4���!X�h��@�4�,

 i�A�� D�!
 ��Uk
�Z{ҏ�
, �w�5�k��]k
�Zkx�ړ~F]� �/[kx�Z���^��𲵆��5�l��ek
/[kx�Z���^��d- ��gO�t(F<T4(	+�	-Z��s+=tN�B�H1C%�DJxK!�hX���G�a�z�
ƣ�%���FT��
�о�B�}~�()4r
+���:�����)4r�d�ShboWU謿�.N���]U��/T+��Z���
��{Y�`
��-t����n=�Sy2
	t
�+v�x���VZ�M�:�gء�mpS�)o�I������`��%����_���K�6�@��R��C�A& 
H2iAڐd2��tЏ'�
y8a<:���?=�KB".
q�KG\:�����tĥ#.q�7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�&�S�O?��S�O?��S�O?��S�O?��-�[���o�B�ʳ�g�φ��8m�i#Nqڈ�Fy6��r��8m�i#Nq:�w�� ��|��
�;�w�� ��|����O?
�4���O?
�4���O?
�4���O?
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,���?
�,���?
�,���?
�,�]��w����
|�.�]��w����
��$���x:���d�p�dx�@�!3�YH7��x2.t���C��u��Km��S��;��N������O@\���(�.y2~�(�֧.^b����!C�,O=��
�ZM�
+|&
�(����\� �IĐ@
	��@F�@	���
���v��x���+T.^�r��'QK
�ꨝ��u��G_k
K����!RP7������)�T�W�U\�w����n������7����.���Gfo���J�
����#�⠿��t�m
�:��ZT����΁�=h�4wu�ŮA��As{U�ו2o�e^})�z���z�SG���
�O랮��cP-�}��}u�m��:s�:0�����s��8*�A�:�Σ\�����a�����H�w�x_�ކ"��
�̽u�@����^Uȸ�t{Z�N�t��v�C�<�UO}�����>�w5���ᝎ��P��&�5C
}�G
m���߷.p��1U*�S	
�#5%zݿ��
==����d	Z�Z�=��{��^..��!R�E�rd,}�ZPJ��BP�7��0�bq0�����z0�5�
"�W�,B���]
ھ˫�en0T}ՋA
�������Є��ka�ր�P��=WaҨ)h��`�����1���%y�������
x��P�CӼ�4��֗r�
��p0wa0��L�F1|��� �zw���=-.�*�Y��#���"�����2U,�Ƀ	n!{q�[EG�� ����R�߶H�L
GL�������cG0��A5
�����*��Θ1u)#h��n�N��#h� %TCD[�fQ]N)��QD�Q��L1�]1�]��٧����}���B��<���Y���!x�Z
Y�l
do[e�\T�
��Vk��P�_PH/�NoX�޹
�E�(�ɱχ��Sj��:�
�l`k
mQg�6$�^������Bh� 'L�/�2��pX�^!

�`0�UȎЧ�>P�� Q�%��A�jJwh��J1TzC�rG�
k
+����=
���
���
�|�Y
$r@�%��SS�C��:"�
o��kቁĤ�
Rz%��~hb��aɃ*ʋ
1}*�t�
N�J8�*a˅���VW�h�U�~�
�S%l���΅ ���P[��2��=�e�����Brk���K�6pI[�����&�6dV�
&Ķ0�!�d
+<
��Ln�������hIS�ĥ�Fo[8
��\0� �0�!�����
������_vw_��^��*��*�ݚW�Լ�������-5h�����1u
��Q_DGC

Et4���ʁZ��O���
)z�i��eF_}}K�*�ߪo������j��-zJ
D]�ں��/�7�kC"�Bo]���o�E�
,�#@UTx�!�JwC�ײa�Ͱâ��^��:
+�R�X�9��Ω��\�U��P�Jc���ۅ���
T��Jt�ߢ
�؍�j%`_�-��oph[ʡ
�
(c�K���{ј��
+�bݭ����bW�c{����2��ߚ�X�@���q�O�j����nֶw����
�6���Pdí�"�������o�5�ꭿ��(�_�K�4T��u�

~�r�Uý�9����5ԶT�;r��0���ﭽ]51�)Z��Tʬ�ݶ�C�� (�I��%�*a�)��'����\��̵�Z�`b��/���:
�˿9
����@X+�Ԡ�@;{+�Z١�
�Tm�#�~���251����+%s}�HO����Qkm0�kzk����T�֪M̵-�F݄1^ot�a9F�$C�
�V�g&z�W
�Z��i���#�Ķ���ꁧz�B�����"n�oƳ��1A���sa��W�W=����9qA��x$�Mʈ�ue�
����QW��
U�6���
�
{�HS���x'�w�RF�7�Y���[?UW�x�vi�H-�*�F���`4�S͌v���1r��W�H��1�`\�謯�6d
jC��f.��"�$⥂�,���	��X�֬�T�vN�g5��#N3c�
њ���mft�u�=��Œ�5)4Ѭy͚7�l'���D�FL4��I-�hM�i�^M�hM�i�`MFZb���46��fe��3e���
��
ң!�f�O57�C���
�
Cơe��������qq�Y{�Cyh��(�����հ�K$ZC%>��\hR��
�!.5�QM�>���l6���R�� �����q+r�}���]�Y [...]
����8�.�ɺ'3�����?ƚ;�H
+�Ȩխ��0�db2
1�.z��zC	�)ajpK5u
�
��
��&�
�Ѿ�I�׷~��J�0��,�F6K����F�nmf�736���V#
-{�
_Ƣ�.��Cz,g��HC��rIr�ο�xd��r��Ҙܗ�j��\�v]}y��q齜X���i�u
C� mȾц�m��}��oBfl�
�;M�����j��\�
M=Vz<*X���eGӌ�,;��i( �f	'\��/�r��Y��[�$��HhCz�A5���-�T]��X�-�Q��/��"J���c�F#FGB_*[w��Ke�&
��nfl؍Cإ�
˄�/�c�����I��}9����O���gw�ݑ�C*
�Z6�$.u��5�
+��N�-
l+��h63���f�t3c��1��h'��f�f5��o7
�n��436��ݬFv��M����ج�N�j:�:�iVw�Y�
����R#d.��Ą��u��fF��lw�52F��tG�ູV�%ѥ[�
+nd�G����so�r�����O�K͍!��[U�v�r��[U��X��s��'w��Z�`b�А��Ϣ�T���jf��c���u!Xu�R�Dz�
+�����W�V��ԭ�qL�g���Y���G��l@��oڭu7���݌/u3���u�A�N��\��l}�K�L.惡��N}��d��n���}T5h
>�Z�X�.�K
�	�	�	�
���
��rR�`�Q�ܱ���44��<ܡR{3&XN�u)��G���K���)�՜��;T�i�Gpcj���7��9�GjH{Ⱥ,'��c�8�!㰇�cȌe/'c�#;�
2Rg��X�$k��C���Fz��A�*��A�5r��j����B���^����ZQ3����<��\�y,d�f���	���
	���9\p���c�ć
GˉnLC�YN�Z�m�Az�A�����*�P1B%*a;$��wgt�;c��+�ݰ��c=��D?6�ÏMt=*<��Q�0Z#��H4�F�t�5��h63���fF���ifL73f��͌nc4
��fF��1�̨736kO�Y{����n֞v����5�ݬ��fMg7k:�Y�9͚�i�JN�Vr�5�ӬA�f
�4k�q����G��ܮ�؛�7��q�g��f�}���V#��kFo)��
�]�H��
*F�$C�
�,\�_�Z:��a���7_^�ڐ�7]�j�K�AK�p�{,�fk�

Y���
ڭ@5�u��V��1�hfDG����pl)���h73:͌�f�l3��Ĉߥ�Z3c��QoflVw|D���lfl�JZ��IK�5�֬A�f
�h� ��a[z��kx��Y#�6k��f��ڬZ�5k��fU�7�Z�Y�ƛuk|��Zk�$3S�$�ԣa�7��!sAfH�����PđA�˿@�O��1��1������u�?�Pc�~�Ŀp�v����V&
��3j�1��!o}��C���+I���
���D��
9z%VKh��u3r�1f���
ύm�.����+��L��^i��uǯ;vm��G���x�
�?zȁ"�ĢJ���k�K~��捔�b�u�n�qe��q��[��q'��'/��
����1u�����їF�W]F��6����U�~�[����9.�N��!.&&þB�~MG�N�Q���ʟ/]��y|�
+1�����1^���
��E:��~��K6���!GW�I.�a����K*�Z�����p��z�t�������p��}���k�k������������hv��+���x�4>Q3Qw�kO
yɤ͗,^�ֹ�?'�Ƕ��P���q�-�6���Z��%7,����[����'��O
�B�6�
+�-�wY�������[�1~��u��9��߲��ߤ�v��E��KKNg�_���U�
5�`��+�dIg��;xqOa���rK���5܋���Q�ص�k
�I�;����H=�?B�]yA������f�+)+��2a��s��c׽wg�G�����a�n~[|{�Y97u�ٛ�vN�~&[dz�����]�i���{�
*ji;ED(X�,]��@G����@�d�s����:T��  LQ���u�3�,f?]\B\��b�n�,n�fH������^
6��l�}�{w}��������>���b����
rv��9sR"��a�"I�5&�::�m-ۘ���8B^U�J��iA$�x��Xd����S$#�|ZK��w��^����"��������2L/
�0eV�kۋ���8c��C���)��.��l�8'�ƺ���B
m�w�
A^�B���*�
+���a>=�k���R��S�_��9�;{�45��>�K�zjxhMXo�ۓ;�!5Y��T/���s��2%Z��e�/QΛZ̟o��D����w�׶4��b��΢�
+S�͔�K�6���X4��&���'m}\.%sO4�\�Q[�h�p�j@��?#�m� 'v4�U
Za�2���"N�o� -�׏T�SA[���od:��U�j�k;t�Z�6N���*�J
+�
+��7�x���P�7�k��� �twCFYm1'�pi���]:��!����O/D[t6�|	�v_��Ða��w�|�u���߾F����n'
+�p�DX��p�!{Z�,
+4����'�
*
�!������|��VT���a_�a��
��F�%�'�q�	�j�g���9{i�/��l>��Td.Wm�.w��T�:��&N�F��
�7/��Y!��P蚠�
K�ո�Խ�	���ߣ�Ł��e�����e{�2��}��ja�s�u�>-��
�E7
�����}��*��NT"
:�|߁/~o�8�0|ڤٛS}ʴq��1|�5�s��R�C��[���U�7*�ܕj�6��
�: l���S
��G�
�����I:��K�MF~�-Y8=�EY�@O*���Y]��J�ĺ>p�EA�y��:ҩP�z_gFܖ�Ѭ��,�J�%Πh�M�b���H���{>���(��&%��S
R>O�0j,%���
�Z�� 

�&W�����\Ϥc�"�#T���L�d�)�D�S�r�
+rF��R����\��ag�����E
�CvF�ҲV(���s��d��l���	�
J�X5D]:�}�$�S�|]TN,/X��
�|���}��r;�t}���'"��왡��E
|T	AX���S�,�N��[�K�X��s��
�@ �@ �@ ��/쿍 �,	��wt �R��<A�
+�$�J�D	@Z��&������� �h���x+���$k���gؚ�������Z�k�g�<3甄�+��U�u��܋�&$Z�	�@6б#z�˶y�L ��.�`��3fV �����a	�۝��9�<��
���Z
�{\�%󅱂���)W��q��zG}
+�X��j�*��?-��
6<�D7-�hC�k�ޑ���bc ���s^��-��ߨE��}�Z6�N����,���h=endstream
+endobj
+7116 0 obj
+20757
+endobj
+7097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [485.4435 684.6635 513.9963 695.5674]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 674.7656 130.8265 683.6123]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4448 655.084 363.6708 665.9879]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6b57cf93153051d3aa63c33e34ee4127) >>
+>> endobj
+7104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.9298 264.8811 369.4786 275.785]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >>
+>> endobj
+7107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 114.5642 170.6866 125.0945]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_41cb3496510a68512516cf65f8d214c2) >>
+>> endobj
+7108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7095 0 obj <<
+/D [7093 0 R /XYZ 90 757.9346 null]
+>> endobj
+7096 0 obj <<
+/D [7093 0 R /XYZ 90 733.028 null]
+>> endobj
+7100 0 obj <<
+/D [7093 0 R /XYZ 90 641.5099 null]
+>> endobj
+7081 0 obj <<
+/D [7093 0 R /XYZ 90 619.1982 null]
+>> endobj
+7101 0 obj <<
+/D [7093 0 R /XYZ 90 619.1982 null]
+>> endobj
+7082 0 obj <<
+/D [7093 0 R /XYZ 90 569.9569 null]
+>> endobj
+7102 0 obj <<
+/D [7093 0 R /XYZ 90 555.3866 null]
+>> endobj
+7083 0 obj <<
+/D [7093 0 R /XYZ 121.1431 480.76 null]
+>> endobj
+7103 0 obj <<
+/D [7093 0 R /XYZ 90 464.0329 null]
+>> endobj
+1498 0 obj <<
+/D [7093 0 R /XYZ 90 365.64 null]
+>> endobj
+242 0 obj <<
+/D [7093 0 R /XYZ 90 359.0398 null]
+>> endobj
+7105 0 obj <<
+/D [7093 0 R /XYZ 90 133.1644 null]
+>> endobj
+7106 0 obj <<
+/D [7093 0 R /XYZ 90 133.1644 null]
+>> endobj
+7092 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F97 1774 0 R /F11 416 0 R /F74 482 0 R >>
+/XObject << /Im11 7091 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7119 0 obj <<
+/Length 2451      
+/Filter /FlateDecode
+>>
+stream
+x��Z�r�}�W���!�����S��W6��b+O�[*�
I��Cf��V�� ΍ 
Zo)W��LO�A��A
2��L
�(��a\N��
<���/��=�����/��I��AFR9���=H�%tr��iJ�j6'��Ռ���,n�fO���lU.n~�o�E�|y���W7�"+�my����g���嶨�7��]�ͩ��?�U�����e��iV,3E�R%f�\�p��uޏM0I,�_��
��`�?\`Č�'��1�N6���e}����w�~`,E���q�%<y4��!,or(h+�Kę���f�gJc"���M��92� fw�^)���O-\��!�2�.�u��樏S$
�Q���*�@QD4�
\�p��̷�`D�9T�H:QX#B�(4"���s<��r�-�m5n�'pK^�ae�!���r��t�P��y^�|\Z�):�[��S|9n`��yMW�9� "AWo�fk0�dm���Q1��4̰���B�k
�O��R0bCb�7F�=2ۤ )��qUB�P��9\m��p�1��>d'rRhİ�/�I.R�8�Ҥl9
�-X��6�k�
�M�= �K ا 
�ZH۝��RX�Y{c�h��)H������\��
#N�>��-1�3
�}U���&+<r���E�"�A\0���-��f�h9�UD<nS�n��������
|��}
+�����m6e����$��`��O1C�Ս? h��=u��}*��o[ �J�Y5��\`_��
�
+�lT"=�*PX��>5�xЈc�%
̃��
9h���Ac�úw�����|�.��0F��.���n1��Bc�ԅ�È.$�]�č�B7�	���0�{�.Ds��� ~��]�~��`�%S�f��Od`�7%
I-���WC]�

�&��`�B')P��~~N� �9=KZ>b��,�?��)��7
+�ls��֦��Y���������j���Ib�����r�x�F�q����9��N@�m�����
Z"-�'��JD��1{�֝��Q�47�,�|Ĩ�,�+�{1�����X�k�K�
� ҆�`p
�fF&��1KA�a�qCt�N%ܱX�q�{�����aZ$�F��X%�S�5�{i��ϋ}��\A����п�#B�Ƭ��L�����?���I�� ��-4�f�h9�@<nS ���z�

+Dֽ����ۧ
�v�M�
�� ��L�?X��Ò�g���|p�n� "���J��#V"�̎�S�,��5���=��.}s�/3g�qj�$
h~�F�(V����?E�[�����\!M%��m{@8��J
y��a���
	��/������
�
+�"_.�ǵ�A5�/�
`@Y��?X����.&
Ѡ�.���e�
�U���{mk«wc?P��`t��(�C1���W�f �V��A�ED
�����d1X~���9���(0-�g�Lc���/�Lp�
���#������:��!��e����b�7�ɸqd~_����wk������y��������}����� ��Sec�_�@��#���0(/�읃��`>&�]�'��B .��m���S����+�D;6Pw� 7�����t�uWv�K3,:�B�-VsW>�n�\f�:<�-��n�kw�
(�u��>������>an�z��.*V%N���:�����o^Sd+x.!�9`�=��;
P�P*�(�G~8
V���|
�Y
�2�a�i��%�����h޶2l�@��l`����]lv�lX
J��a�^a(�@��l���vw��z;�b���a�Z����~�͟}xbT
�^o
��"�tk��!/�	����r�8���ٲ�b�+�����/��Q�h�Aa�TJ
�
N������Sߺ{���|翖萟p��]PJ�`���pg��>a�N|?˚��p����"D�]
�jX�u�
	�.�݇��d�����>��~���ȮA�j�	��>���}[[1����f�
w��o�;
)
SӺ�7O֟v��E��j�4���t���b����,���¯���Ǥ� ��I�̚nn�WYhqn��c�T���.[@��
+���?
'1���r�H�y�čY��_��a�w��C�p�_�V{X�6
��vy�{�u?��7?Ƌo��E�
ԏ��!|��pa�]>�áE�'y	,��~Җ�7
��)���~ܕ�MovG�ԞO��ˑw$���
��
"���,�+�F<l
qþ�w�[����Q
+K
]�0xrʳ^����*g:�9��Ӿ� :d��ˍ�r��[��U�}�G����	1�L��x\��
��a@Ż2���A
4��
{؜�c�͒���I��/�������D��Ð~������7OOOhY��"ߕ(߿��{3�
�52T������N�9�D*�;X��;g^��M]��fL�Q(�4�rendstream
+endobj
+7118 0 obj <<
+/Type /Page
+/Contents 7119 0 R
+/Resources 7117 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7109 0 R
+/Annots [ 7122 0 R 7124 0 R 7126 0 R 7128 0 R 7129 0 R 7131 0 R 7132 0 R 7134 0 R 7136 0 R 7138 0 R 7140 0 R 7142 0 R 7143 0 R 7144 0 R 7145 0 R ]
+>> endobj
+7122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 170.6866 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9af54d524de94ada872d460c1dbd5cc0) >>
+>> endobj
+7124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.4316 178.4354 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_a82cf61e903a201fe8892501b209ab8e) >>
+>> endobj
+7126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 642.2037 222.2328 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9571074ab0249afc1e440c8c5eb5d429) >>
+>> endobj
+7128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 603.3494 202.4973 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [213.2369 603.3494 253.406 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_61b27b2ed8bbc9a128f9001d160b078d) >>
+>> endobj
+7131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 564.4951 202.4973 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.4674 564.4951 260.5991 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_2be2c8b9d00f81fc24dcbc36ad05afea) >>
+>> endobj
+7134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.4263 525.6408 227.8516 536.5447]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_a6e183ba7e931dc88e16fb9ecfa8b3c7) >>
+>> endobj
+7136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 486.7865 217.6102 497.6904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_47def4dcb522c046a6f3a432d72008ed) >>
+>> endobj
+7138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 447.9322 180.5399 458.8361]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_ffa77e724493813cddf9740767c2473e) >>
+>> endobj
+7140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 409.0779 178.2386 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_26673943182a6efc6cc6e3aad8c731a7) >>
+>> endobj
+7142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.6796 309.0069 156.4559 319.9108]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >>
+>> endobj
+7143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [485.4435 309.0069 513.9963 319.9108]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 297.0517 165.1473 307.9556]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+7145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7120 0 obj <<
+/D [7118 0 R /XYZ 90 757.9346 null]
+>> endobj
+7121 0 obj <<
+/D [7118 0 R /XYZ 90 733.028 null]
+>> endobj
+7123 0 obj <<
+/D [7118 0 R /XYZ 90 700.1513 null]
+>> endobj
+7125 0 obj <<
+/D [7118 0 R /XYZ 90 661.297 null]
+>> endobj
+7127 0 obj <<
+/D [7118 0 R /XYZ 90 622.4427 null]
+>> endobj
+7130 0 obj <<
+/D [7118 0 R /XYZ 90 583.5884 null]
+>> endobj
+7133 0 obj <<
+/D [7118 0 R /XYZ 90 544.7341 null]
+>> endobj
+7135 0 obj <<
+/D [7118 0 R /XYZ 90 505.8798 null]
+>> endobj
+7137 0 obj <<
+/D [7118 0 R /XYZ 90 467.0255 null]
+>> endobj
+7139 0 obj <<
+/D [7118 0 R /XYZ 90 428.1712 null]
+>> endobj
+7141 0 obj <<
+/D [7118 0 R /XYZ 90 371.7578 null]
+>> endobj
+834 0 obj <<
+/D [7118 0 R /XYZ 90 92.6619 null]
+>> endobj
+7117 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7148 0 obj <<
+/Length 2129      
+/Filter /FlateDecode
+>>
+stream
+x��ZYo��~ׯ`#=���a2�q�l��:/�]
h�
���������j^�24��!CRŪ��뫪n6�c�G�ϕP�0.���
Ͽ���H��
+~_�
f7wR�
2����S�A$(���O
B���/�/�b�|�_R�8l_��M�|�[�X$����Ge>�e�3�t���rE^|�M����S��K��~
�"�\P%��<|?��C�
D0I,��~��70��g1���n0"���n�)ko��g�pz����!w
�A[�P����=n����	��
1nHe�O�[��~���?K"��_j�V?
>
���|n� ���%ۤ�l���;�i�� -��p���!
+I�y�w�~�=m�x��!e4���È.�ת��-z~
���R�F쏍
?fWF!N���� ��������Hd�k�2J')�
Tљ�%�L�
k�gJE�����	ZtR1��#����=��i],3�a�g��T|id>�Z�����Շ]�� ��
����F�p�<;<�"��҆�����2|%+n�3v���K^a�aɹ�U
�d�P�X2�ؤř�
g:
;��+D$�K
��v՘<
��Z�	����q��k�?��Ǵ���i�.��~��
ĥQ�t�tpbQ:�,Bh�Z�LlK��V��n���������b 4A�)�s��T���
uM��:�pb�w�Srږ���XAYLƺ ���oG�Z��B�%|:!�$<��X<=���<fZ�I7�|�e�˷M`��1�@�Zq-����R"�e[���<�'��l�
��L��~�쌷E�
GRbz1���rbo�V�$�" Znu at XnU��V��M�
b
W)"��׾� �X]?
�n�+F,�v�	JK�i�����ʳ�
���P�4V],)h��Ibs�/�"�w$6��a�u-%L��N�k�_Y�>�7p  ��@��@�E�=�fV+iz�'}��#0�z���YA��KM8;�IŬ
�]�1�s
�
z��*Bto�����
f�=�n�k'1y�[ɯBwOY��>�7�= է{��{�Eq�w�_B� ��ދ|AA0�"�
'� �&]߼Y�)���j�}
!޷b5���7v���Ts��]5���Fź�F����$�
}e:*���E�
�I����&9NY-5PFB�Y9�!�
e���C�� ���
v՞��#�N�^^���o��
J��Q(:[�xtz
+k��]w��l?܇�Ş!J��N~+0�k�'��$��@���[��iɑ†�|>U}d0��)�x����转�@wd4a_8�*����>�L?�`)5�\�oOG�߭���:�*`�c����l�>\���C�c������
��A+O��P:�;�Ա�[o���R
+Q�����ǭH΢P�8c����YN쒜�1��"�ۜ�1
�$��*��6���:�ub��-�+E�}��@��b�l(�~zⲑE#G�6�M�=gǑE#eHI�Z�%+�/[�Vy��_r����e�����
+�V
+� V�z(,��2,�z�X4��
+�'b�M=
�AVw�^��0��ދX

���aӎ�
�G;�K=�:����ȶ��!W��"�)t
FAxw��!�$W�y�:B9���	@*��j����Zl��k��GYi�|��I�M7��a
�.����R�os*�|�}A���U�}����T]��Ո�^���IlI�eVÄ5:����_���Sa�1*/�С��~|lt$��Z�^lRk���w��n`^6tQ�(k]�*iqL�6fs�%�~eZ ls�Hs>�ͭ�YyB�(�@g
�'�v:Q����Lo��M�b��:���^�UH&���B&y��ˢl�4
�d[�#\=������k�LH���yx��8��Z�?|��^�r�
�	
�
+���c�(	� �F��0����8_}:
*1�9dG�t{ ��	�{��^s�
իo��z��?�i�{�i��1?$�S{6�6M�
�:��H��%՟t~L�[Z��t�T��뼽����/��7j>*o��v��e���ܼ������Y^������� R`�j`}���`���wK�u��a�C�LG�����V�A
�C�#P�
}�s�endstream
+endobj
+7147 0 obj <<
+/Type /Page
+/Contents 7148 0 R
+/Resources 7146 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7109 0 R
+/Annots [ 7151 0 R 7154 0 R 7156 0 R 7158 0 R 7159 0 R 7161 0 R 7162 0 R 7164 0 R 7165 0 R 7166 0 R 7168 0 R 7170 0 R 7171 0 R 7173 0 R 7174 0 R ]
+>> endobj
+7151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 623.0791 177.0528 633.9831]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) >>
+>> endobj
+7154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 542.6902 179.5435 553.2205]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_061c4c3b4f1eef970794b274dae62504) >>
+>> endobj
+7156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 491.5071 179.5435 502.4111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_51b29c5dffc073c2d350471ae9bb879f) >>
+>> endobj
+7158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 452.6528 179.5435 463.5568]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_b8bee5e53740adc193668686030bb4bb) >>
+>> endobj
+7159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.8806 452.6528 254.8106 463.5568]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+7161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 413.7986 179.5435 424.7025]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_ab939414cdbcf1ba174334859443a72c) >>
+>> endobj
+7162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.8806 413.7986 272.5137 424.7025]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+7164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 375.3179 187.2922 385.8482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_517f4965fd423413531cd1d2058748de) >>
+>> endobj
+7165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 336.09 163.2149 346.9939]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_7e6d252ce9557b9d73833ef594f6276b) >>
+>> endobj
+7166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.5521 336.09 256.1852 346.9939]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+7168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 285.2805 163.2149 296.1844]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_efeb88699fb82bb331a2d24ce724bb07) >>
+>> endobj
+7170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.9214 246.4262 163.2149 257.3301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_553c3b19a36235d228039a6bb3452918) >>
+>> endobj
+7171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.5521 246.4262 238.4821 257.3301]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+7173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.8214 92.6912 440.8317 121.757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+7174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7149 0 obj <<
+/D [7147 0 R /XYZ 90 757.9346 null]
+>> endobj
+246 0 obj <<
+/D [7147 0 R /XYZ 90 733.028 null]
+>> endobj
+7150 0 obj <<
+/D [7147 0 R /XYZ 90 642.0529 null]
+>> endobj
+7152 0 obj <<
+/D [7147 0 R /XYZ 90 561.2904 null]
+>> endobj
+7153 0 obj <<
+/D [7147 0 R /XYZ 90 561.2904 null]
+>> endobj
+7155 0 obj <<
+/D [7147 0 R /XYZ 90 522.5556 null]
+>> endobj
+7157 0 obj <<
+/D [7147 0 R /XYZ 90 471.7462 null]
+>> endobj
+7160 0 obj <<
+/D [7147 0 R /XYZ 90 432.8919 null]
+>> endobj
+7163 0 obj <<
+/D [7147 0 R /XYZ 90 394.0376 null]
+>> endobj
+7167 0 obj <<
+/D [7147 0 R /XYZ 90 316.329 null]
+>> endobj
+7169 0 obj <<
+/D [7147 0 R /XYZ 90 265.5195 null]
+>> endobj
+7172 0 obj <<
+/D [7147 0 R /XYZ 90 209.1061 null]
+>> endobj
+7146 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F37 1999 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7178 0 obj <<
+/Length 1996      
+/Filter /FlateDecode
+>>
+stream
+xڽYm�����_!�@J�޾/���q� �}���Z��R�BRV��w��K�"%^���Gr������3Yb�#K��J(���t���'x����kX_�^?,��I��HK*��V�$HPB��#Bի5�GVGI�O>XQ
����l���?��*����S��S5�O�4i����rH��#�ZS��OMuLw��l�[+RX�B��*�������
:�}T�Ib��e���x���_`�t,�'���hM���,��O�uz�B��8����C�R��Q��f�񴡽;i����{[�ǽ)��}��5�qM��� �|�is�p�8-���
��
c
�{�U/`N�B[����Nd�	G�+�`���9�H�T,��¥��UO�J ����������B�� �v ��h��hjt�@�@��j)�@���MmZ���)k�1]�!
+����4G \DE}i�`����Njl�����"L��9�1v��=Y��ΐ	�9�1$�x5VЮ���
+�h/ �1�@0R�7|�*�_ߘ�)6Y��v5l�ig����hh�0�I�|��UעhvY=����$Z��>��p��]R�r��c����2�2���w&
"CВ
����R�ۙV[eꃁ�_Q}��f��r�	
`PH`
+��ݾ�ʯ�'��
Q*�
�c3�A��8�B���M(��S8Q�C�
�ױn���<Jܿ�l,�, ��T��i��;wi��{E n�2�`�Pn�2[f�E���l��SUZ�O�W��ia&
+�zX�*�'u�	u
J���lc
+P�B�,{�A����3͓�_��6�o�La����}�*��l�<wAv��b�����+8ERqv�Q�ڊ5�W��l�g=m�Q*ƕޢP�nZ���H^,���ᐣݮkc�
n�~�ʯG����g�+�I�_C�iB�9�~��m�-^
�.yk�OY��Ǎ�����dH�8T�o't��&��>�=L�X�Pv�2A(�z�́!��U���<K]\SD���\�TM_�ܾ�����f3���s���
�;��X���.�I�/�ڥ���|�{��<�m������t2��7
+��d/4灂$`��3��0M�*S��K���g��n�	�;�Bf򡓚sBa�N�Љo~}8� ̊2�_
+H'?��X� a
+�l�& �Ԝ�
J����6)�cb�3�tɴ=��0���h2u�c;=��Z�_���m�R��T3�|P�]�<K3�T��z����0r*��ζ.Ƥ؄�D�����	�PLe ��N�
�c�0rO$
�e
LEfJ�
tA�Zb'��n�]J�߶
=
�C;�IH��-���ߚ&����ޚ:��C���~|ف
�� ~V ���$:Tf��ɊDvX�O6��z���
��@��]��}�{�Sh�
�8�-2�
�
+'VC
�g��~�]�ϋ�����Nm�V�O�C`P��{��d�T�Q1��)�78E'6�)nZ<s���S
�~f��l�}aa��J�~e}30��XtU��)W�s�C�y]
��=B�!QP�/�v��)��DLS>b��Կq#W4zXi��!��
��
Ś�я�Q����$
����d�h�3K}'/J���IM]'U
+{��p_�sS��cX��]�g�/�$�=(?����(�����]{_� �P5>�O
.߮����6hb��a��_=Qh� "����[�q����ѿe�|�o
�o�K{b��x��������q�R�u�vE�0rA ���н̌Y��0r;A�LJD���F
�g�_ju)}�ӑ� QS3���j
���=A��£�
�I���@ӄ�M?��GC���5��
�N��s��Ġ�w��߆��n��w7��M�g�|��!)�ϴv��'Ӫ�H���XQeQA+�p�Ɍg��4K.(���,��?zc]xa�{��R�
y���k������tBi��Ev�P��Ai���c
�_�[���F�
���~"�y��KG��eeBo��ވ�۟�&\�/|5�yendstream
+endobj
+7177 0 obj <<
+/Type /Page
+/Contents 7178 0 R
+/Resources 7176 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7109 0 R
+/Annots [ 7184 0 R 7185 0 R 7186 0 R 7190 0 R 7191 0 R 7192 0 R ]
+>> endobj
+7184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 408.5009 175.9373 419.4048]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare_bf5e694ab674c48a452893f021986318) >>
+>> endobj
+7185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.2744 408.5009 268.9075 419.4048]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+7186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [310.6406 408.5009 376.2737 419.4048]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+7190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 90.6634 156.2812 101.5673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_b5160fe536bd1bc8d42c12de33f40493) >>
+>> endobj
+7191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 90.6634 192.8237 101.5673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+7192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7179 0 obj <<
+/D [7177 0 R /XYZ 90 757.9346 null]
+>> endobj
+7180 0 obj <<
+/D [7177 0 R /XYZ 90 733.028 null]
+>> endobj
+7175 0 obj <<
+/D [7177 0 R /XYZ 90 716.2211 null]
+>> endobj
+7181 0 obj <<
+/D [7177 0 R /XYZ 90 716.2211 null]
+>> endobj
+1499 0 obj <<
+/D [7177 0 R /XYZ 90 532.5473 null]
+>> endobj
+250 0 obj <<
+/D [7177 0 R /XYZ 90 525.9471 null]
+>> endobj
+7182 0 obj <<
+/D [7177 0 R /XYZ 90 427.4747 null]
+>> endobj
+7183 0 obj <<
+/D [7177 0 R /XYZ 90 427.4747 null]
+>> endobj
+7187 0 obj <<
+/D [7177 0 R /XYZ 90 371.1808 null]
+>> endobj
+518 0 obj <<
+/D [7177 0 R /XYZ 90 246.282 null]
+>> endobj
+254 0 obj <<
+/D [7177 0 R /XYZ 90 239.6818 null]
+>> endobj
+7188 0 obj <<
+/D [7177 0 R /XYZ 90 109.6372 null]
+>> endobj
+7189 0 obj <<
+/D [7177 0 R /XYZ 90 109.6372 null]
+>> endobj
+7176 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F23 2436 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7195 0 obj <<
+/Length 2904      
+/Filter /FlateDecode
+>>
+stream
+x��\mo����_�O�
D�}	���R��-���t=�M'�J�+�q�_�Y���%W\9��1�$5;3;�3��,I2��L
�(��a\N.�'x�.���t?���YH�����k)&I���� 	�����/SBç3�1��9%x�ج�7�O�����j���e�~��ܿzu^���}j(W��^�t����?�an4�c���%�T QfxG�Cu[^�S!�/OgT��yy}JŴJ��
+a�i7�Y�Z-�ۖ�ũ��b}�Z�E{�mqm���Eyi/QL�Ti����
o���Ibm��_~œ+0�O'1����`D����	��}Y��;������
H��c�4ӓ�HK� "\
��I�r�-���
a)�_�O4�H��D|��G�̚����fۙ
���
+D��E��1�̮"�$V���?.;N�\��$6
�ݲ��`D�;��'�Ĕ_`��-�"�N����
nF�
� bo�Ic�2�Y�h
Ję�G��R1TQ�&��k
QF(��`)#���`^^
�D
��E��/�
��PG�Q�ϵY�M��>,/�����n�9��C�W�r��fb��h\�!�'�
����[7RsD	9&�#�稬Rll�%��JE!�H
��-
+���j]d�z��b�S���)��M*�(`�������܉��E�#ˇ[��/��&̩�?$\���aj�.���~�]�����7�@S���6�F4����p�4����4����wY�����v�Z�
+�tTݙ��(Ba�P��C]𶫳*���%	��08&�
c��Ȭ�o��v�C�c᢫v1e��~Z����9���uo`k�����ۛeq�F%�����T��
r8+!��Q�)CT�\�\�;�|�
��q�|��

�#�><��5��j����P���
�0EXS3���Se�a�#����� ����
c���� _
��E�hp��3
�Dk������}��'�~�)��L�{�l�
G
+�\�Y+0xב���/�2
���e�#����t�,��ź[�7�:�S�^W�#��l��-��F��n�,�W���:��fP>�30�@J
'�|;�,?���*�@E��Ȳs[��L#6h�ze�LR\�E���'�AX�n;WаE@%l��
��~Kp�U͸�M��|t<�qX�w�3K���
�����p9=��-���:�[cX^D
n�$.�U/4���Q2
0�����p�l�@���6h�l	�pC��kG�S�SN�����B�.�O/>�m%!1"��Q%h�c�<��w7�C��b�*���M��MeU֋e	I��E=�/U�ᬗ��e�
��ˠ����Z�L��"F4y�-ʫT�J i|����*�(RJ���Qb��*׮�dy

��hBn
+GC�O����2�	q�ʅ�cK8�&�� %���9�Uc1�B��1
+��v
LL�r���i�Ǚfmm��� ��?��5}.��!^e�.V�r����{�YZ�ؿ⌑�rHIۛ8?U1
U����6�E3吧��[�߃�!.�X��J��&G�Q�Cd8g�"A9Ĉ�ŗ#@#�e��_��� ߶E��Xť�G~��P���Q}�T�s��J�4
+�)�Pѣ���
+��<������ȓe
���Ha���(�"��G�����C�Nd��
i�
R
|-�z�,� �ETA�ҧa>�����5�$
	�CuF�
J{�Y8 d�V�

���|�����I#^�m
|����^�މ�
�T����*�h<�,$K��w3���w ���������8���mS�β*����贈(#�Jp�<UF
+NR��X�M�J���b8�qȺG
�<�
+	G�ڭ]b��jD�t5�+3b�
�t
F��-�_�� ���#X����[��T�vy

�RE#�=
t�Η�Cԛ��<W`�g�sO�������&`?��
�ϰ�]�>���2�~8`�=��[.�>Y�/6�������S�;�YH�~fa���~!퍢�'w?�;��}�� ?mҋ
7��ʨ@
U,V�(�
� ��j �<F�ߓ=:�o=�/\C��
��ZIE��X��ڻ�����?5>�|
e ��<�M��$���\���e@�p�
H�M����c��c��c���ܹ���8!�Ȝ���4ǝ�p2z��D�#�E�{�f9
+�8)5ɝ�8�Y8 q.2���Ly��w��v��
��G���mz������ͺ�j>�c����B�A	'‡
� PQ�`�
��`�<Y�F%�,%7d��g {���h.�+B�7|�O�֑g���
2�F�
6������P�%@.���YG?
���Ϸ=�o{��C��u�YG�� � �R�`f��8!�1 ?�1Qe���C��\w_(l��A�����������m�s�a���i���=ջ�#�Vx�]\l�eU�;������|�d�=�KEJ�9ѵ����'˂��
���&�7��T����I�༼���a��C�FDq
���O�jd�� iL�v�p@���>ߦ9s�<
3��:"{Z
��
UN��>5�N�
�8x�>�@����m���
�� N��J0�ft�:�j�\�(n#�����>ЮY%D�Jc<!H)>�C�9w	���1��P�x��g�|�y�5�	��`���F�=p�LB�F��;�vT��l�!��S/���K#�/���G��q޻��0"��n��C�O:j��D�-!O2ݽ��)a5�p�^����v���j���b�;����Y��Ey��6����n.���fSPe����~x��(R��[DDVj���}�9~
�0
F�o+Q��|��?��ͫ����;t�E���f�������lq�Ul�{3O4�%2?�I�u��uՕ�j���>�k
�T���@endstream
+endobj
+7194 0 obj <<
+/Type /Page
+/Contents 7195 0 R
+/Resources 7193 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7109 0 R
+/Annots [ 7198 0 R 7200 0 R 7201 0 R 7203 0 R 7204 0 R 7206 0 R 7208 0 R 7209 0 R 7210 0 R 7211 0 R 7212 0 R 7213 0 R 7214 0 R 7215 0 R 7216 0 R 7218 0 R 7219 0 R 7220 0 R 7221 0 R 7222 0 R ]
+>> endobj
+7198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 696.0019 244.3797 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_fb730d60db4b7e1ddd4c9994ec077cf6) >>
+>> endobj
+7200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 657.1476 191.7178 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 657.1476 288.8524 668.0516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_348c6523b219aee93545bb401dc0b813) >>
+>> endobj
+7203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 618.2933 191.7178 629.1973]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 618.2933 303.0791 629.1973]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_aeb70a45d5ee0c7fac5f5d6c659fc69e) >>
+>> endobj
+7206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 555.5287 185.9195 566.4326]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_e34390c17dbd12de9906817c4b6cf479) >>
+>> endobj
+7208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.7943 492.4302 456.8034 504.3854]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_241f107b045949a58b49469a6a09caf9) >>
+>> endobj
+7209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.0202 429.6656 513.9963 441.6208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_6a869e3c010e87dff868fb410d4f0a20) >>
+>> endobj
+7210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 418.0443 156.7091 428.9482]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_6a869e3c010e87dff868fb410d4f0a20) >>
+>> endobj
+7211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.5248 418.0443 232.265 428.9482]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+7212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.0202 366.901 513.9963 378.8561]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_c3abadf1d96bef1880657113014d46dd) >>
+>> endobj
+7213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 355.2796 152.027 366.1836]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_c3abadf1d96bef1880657113014d46dd) >>
+>> endobj
+7214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.8427 355.2796 227.5829 366.1836]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+7215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.029 292.1812 436.4107 304.1363]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_1c76acbe653414cc28fac54c69622446) >>
+>> endobj
+7216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.0686 243.3642 435.4318 255.3194]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_f3699ea93d8ec71859566480bede9332) >>
+>> endobj
+7218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.942 137.6494 160.3079 148.5534]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_79370159de3dc1738441b20eff866329) >>
+>> endobj
+7219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [168.1502 137.6494 311.9595 148.5534]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+7220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 137.6494 513.9963 148.5534]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+7221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 125.6943 182.0539 136.5982]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+7222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7196 0 obj <<
+/D [7194 0 R /XYZ 90 757.9346 null]
+>> endobj
+7197 0 obj <<
+/D [7194 0 R /XYZ 90 715.0952 null]
+>> endobj
+7199 0 obj <<
+/D [7194 0 R /XYZ 90 676.2409 null]
+>> endobj
+7202 0 obj <<
+/D [7194 0 R /XYZ 90 637.3866 null]
+>> endobj
+7205 0 obj <<
+/D [7194 0 R /XYZ 90 598.5323 null]
+>> endobj
+7207 0 obj <<
+/D [7194 0 R /XYZ 90 535.7677 null]
+>> endobj
+7217 0 obj <<
+/D [7194 0 R /XYZ 90 195.8571 null]
+>> endobj
+7193 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F52 345 0 R /F37 1999 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7230 0 obj <<
+/Length 2441      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���SJ��z��h��>m���
+$�A˴͔�T���f�%ER+��lA
C�Hg�>�,M2��GF��P�0.G��
���
wy�'M�_Ώ�O�d$���낃$HPBG�W�B��	����r^�S
̓���j^�+�\�ˇ���4����[A�����v|JH�?�an4�c���$i�@0��pG��|�^�����
+
���c*����TMݽ����I�e%��A4[$a
�g>D�V

D�Ԟ��T����ymUgt�$�6��ѧ/xt���#f���F�:�
qʪ������5��Bq��w��!Σ
a)��y�8���a�DW�r�F�t/�x�Z�`�	�qC�[���6f`c�e�R\+G�?,�4���Q]w�Z�ϹD���}�Hjn
Ŵ�]�qb���)��|�A* y&`|#}� N�e*����Vr���hO�:�<w?�i�e�2N
��d�EW�l1ϲ������
X�U���8߬�a��p!
+I�y����޽=)��y�}���n�y�"���
��
��x�.^�E�KpI��t�N�P-cw>]͢47��6ա���Sf�?���e͘_t�+����Ŷ�p"�b������HP+�iQ��3_H?�?}"n��o��2�.ή=L9a���R™��,���7I����	C�Nv�=�R	m����ŒU9:9q�c�|B��� [�
ʯ_=����p����Hs��QW��+�;�<8��e�$��
C�)=��
HHt�U{R���	m[�h��J�m�D�>B�\�sM��8�ഽypD���3�4�.��8�:�ǠɄ3|����
+^||�]Ν�F5W�
T4UJ,�ħ$�P��ץ�9�H`��ƞ��̵�:���W��-�����{V��hR�4"�F��Ӵ����4��苯/*�%�jN%
��,�yXC��ج��
��#�E�p:�/����]~�]4&"hz��Iݫ��A4��
�{Z"�# 
V1x�
N at D�8��pȨ�|�m|B�D�Yh�l�緑OTm3A����&l CH�Y��p��I0/^F��̖*y�Z=Ng���/�+���9/������Ij�ې`~��(8p��
+q�� �+��+:I�u;
j�gQ���Z���J`^����
+��XU���u�#����B;�����t`|%��S�ȥ�`
N�`i�}
Īȕ„>N �XW�:5:�
Ar�
�!�Y�э��6+�Iw���"m5�L � ?|�YE4iRm�gv��а�`Hiȭ�:嫥
�4�X�v
���js�vrbh/B�&��y�Ƈ䈣�p� %DW�\���_p�
�>
Wk��^\-�����`ņ[���Wi\+-3
a��5 \�~zp-~(��t�j4
:+��;?dv�(� n�>�o��:���
+�����!� � �
�����!�ގ�=��vɎE�K�L�c�8�
0�^(ޤ��!�! �`(޻��o,��5��Bq��P�p��tf���B�ө)�������n�ս�	�xY_4A�@�i���P��d
+�2�&�|.z�
��8�A��f���.H��^ߒ�6���P/�Q�k�AxLv�x�� ~��S$���Z�],�z�j���&x�r�����/,��A�O�gP׺�~�.%}S�#��5
+�S
��� ;C�#<� i����[>����!�C
�p�V�E�e�
 K�pQ�ܤ�i�^q�7�@��59:��;dў)
Fx�;
��ʍI��)K�����?��]}Z�;O�/��*�47�	U�=0�[8��: q�z�y��$$��
5��^�k��+�w�R�ޕzXyw"�኷3�IĠí1@
��C�_'ʐ�j�i�.����~��q dXt������r��k~9��g��-�ׂ�~ki^���z�ѷ]��T]1:W�J at vmriհ�����ׇ�M�'�k�J[Y�=U�ن�����A*��e'�A��z�
�%b�C6X�=���Zb!����;Q�`ѬWL('�c�n���gG�xG�V��R?b��CqK �"�����&�9<O�*%��;M�;X
�KO�R�B��<�v�A� k�����, u��<�o�ޗ�-�-�6[2^�MX�i�Ӿ�oy��K��]�����|X·T�ũ���
+Ә�AŹ� ��h!Lc|�x/�t���5爬7g��v�5���GC�d/3����C צ����,�˞C"��W�.����~�0�!�}���D
+yЫŋ5R~1���/�QL�W3*!��}Ŏ�{�������j��<t{@����h�'�S㞀�
�U���M���7y/��|��<���QԵՐ�
+s�J�����_�\+[�0i�Q>bQ
�7�Z�o�|qr||ww��Z��b���x�H��rq�����yoRm��2?�I%�)��ܽ]0�/��E89+

��<�
�( �nԶendstream
+endobj
+7229 0 obj <<
+/Type /Page
+/Contents 7230 0 R
+/Resources 7228 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7109 0 R
+/Annots [ 7238 0 R ]
+>> endobj
+7238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7231 0 obj <<
+/D [7229 0 R /XYZ 90 757.9346 null]
+>> endobj
+7232 0 obj <<
+/D [7229 0 R /XYZ 90 733.028 null]
+>> endobj
+7233 0 obj <<
+/D [7229 0 R /XYZ 90 678.0139 null]
+>> endobj
+7234 0 obj <<
+/D [7229 0 R /XYZ 90 630.1177 null]
+>> endobj
+7223 0 obj <<
+/D [7229 0 R /XYZ 90 605.7487 null]
+>> endobj
+7235 0 obj <<
+/D [7229 0 R /XYZ 90 605.7487 null]
+>> endobj
+7224 0 obj <<
+/D [7229 0 R /XYZ 90 427.6648 null]
+>> endobj
+7236 0 obj <<
+/D [7229 0 R /XYZ 90 413.0945 null]
+>> endobj
+7225 0 obj <<
+/D [7229 0 R /XYZ 90 234.9906 null]
+>> endobj
+7237 0 obj <<
+/D [7229 0 R /XYZ 90 220.4203 null]
+>> endobj
+7226 0 obj <<
+/D [7229 0 R /XYZ 213.9548 89.6298 null]
+>> endobj
+7228 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F25 348 0 R /F97 1774 0 R /F67 370 0 R /F108 3094 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7241 0 obj <<
+/Length 1945      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�X~�W��m}8�Kԭ��6�t/�6�S[!
+Npk
5v�����6
̥��*B��0��f�8���t
�*��a\v'������;�x��s�N�b�\J�5�H*��ی�$HPB����
!���G0ƽ�>��q<������̟��џ��x
?^\\�F����'K�O���ԸS̑��c�?�I
+�(3��:�D�P��,n�8�$}�
+
�
���e8N����֏�D��h�$�G5�\;����
+�
+&��������;��`�{���C�����;7�*>������	eK�� ���AJJ�
�9Hfm�WHq]�6y\��x^!��[�^,�h
+��
�{
+��;(���>��+((̔h	"P`�X��n��BXay�U@���&�a�
��A2��,#sj�j�)�p��:�!D"*�l�N����U4����[3.PD
j�;,��@��]�'���UD�j-����3\�HH�V�

/.�d�E i#�åb?:��8�uAv^E��^�+���(��T;��
�
+���H�n�޶D�<9 L
�Ee�SqSQ[Z2�0'���w0׆�~��%%������
L|��� D
+�1�d3��w��N$B"��u�x�"M��.PZ
 ��~rL�O�L��x�
+�"���0YD��^�Z�eO��LAH=Ҙ���ˑ�.��^�#�
kB}!ڎ��.]���t�S2�x�F�Fd� �4���m�A��	!jx�)84�6�$�<���� �ky�
GF����G�|m˸
����H}(��ԙ����gP�����.;�M2�O�R�Gg�X!�43�5ԡ������:j��Zb�(�_\�{
p��41ͥ���P�!
<�O�A�
��!.d[h3fe�Y6�,=�Y������\3z�
� �������4/g�auP���L���Lu���^�l at v�X )5?>ơ�A�����
����mt���#��U!**����'�'�6X��<U���UYs��U���
��v�C��T	��ޥY�I_ƁMW�4�k4-
�
Z\\��$	`~Ϯ^.&�܏�qv˦I0$qC��9ۮ��vu�Eoc�3�o�Mu
+#��i�`�eKS�,�F�4缺/�ov��5�zy�Q�a�"��4�x�3�j?O�
+��aԴ�B�zL���&�>|pN�&�J��a�Wê'�>�2 !N�}h��s<&`(Ռ�_��rN/��8�`
�Ꜭ�BT1]N��Y�pV�
+N��ݺ]���d�0	a�ɿ�gQ(.��ȏ� q/��O��Y.�c��.����пp
<
+p��xׁn�yv\؜[��9�+.E;���Q�Z�UD{��i
�^�\�h6�"[��m����;��L'ϔՅP4�z)|�R��3G�q��d��z
�����
yJ5T�F��f~
$E��sD�m�\f�
5������K?a��/��$��:���Yq|'�=�8����_ �j��W�$E��|�06�	�� ��n>��K�bP[��м
��-U���V�k��#�����Sp�~g��3�*+��p�w:� ���k�A7��
��@���B!h��B��nD�Q�@϶*� n�9��ik;�}&zqz(2�o��ǿ��q
��Ɠk�Y-8Kr��	��h�
���/�M�Mh6��s�X�oPL��f=�7_Mq"�0��3O�#.�z-���
c7����MGX���e���+����*q��{��ݐ�F��	� !��;��X
+�Uo�3O����!u�%2v���ڗJ4���Ⲭ���(���ߕ�dW�"�G)�}E��bY��J+P/c�*�-!(eH�����
+�	r����n�폵����/�TP5���Z�gI��
����d��(X�(H���^�b�hm��*�-]��"��n�R��|�"�9�Jm�c�7á�
X�Oendstream
+endobj
+7240 0 obj <<
+/Type /Page
+/Contents 7241 0 R
+/Resources 7239 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7251 0 R
+/Annots [ 7250 0 R ]
+>> endobj
+7250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7242 0 obj <<
+/D [7240 0 R /XYZ 90 757.9346 null]
+>> endobj
+7243 0 obj <<
+/D [7240 0 R /XYZ 90 733.028 null]
+>> endobj
+7244 0 obj <<
+/D [7240 0 R /XYZ 90 616.649 null]
+>> endobj
+7227 0 obj <<
+/D [7240 0 R /XYZ 90 594.6711 null]
+>> endobj
+7245 0 obj <<
+/D [7240 0 R /XYZ 90 594.6711 null]
+>> endobj
+1500 0 obj <<
+/D [7240 0 R /XYZ 90 499.9101 null]
+>> endobj
+258 0 obj <<
+/D [7240 0 R /XYZ 90 493.3099 null]
+>> endobj
+7246 0 obj <<
+/D [7240 0 R /XYZ 90 434.7735 null]
+>> endobj
+7247 0 obj <<
+/D [7240 0 R /XYZ 90 386.2097 null]
+>> endobj
+1501 0 obj <<
+/D [7240 0 R /XYZ 90 334.8863 null]
+>> endobj
+262 0 obj <<
+/D [7240 0 R /XYZ 90 328.2862 null]
+>> endobj
+7248 0 obj <<
+/D [7240 0 R /XYZ 90 255.8021 null]
+>> endobj
+7249 0 obj <<
+/D [7240 0 R /XYZ 90 195.5721 null]
+>> endobj
+1502 0 obj <<
+/D [7240 0 R /XYZ 90 143.9598 null]
+>> endobj
+7239 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F25 348 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F23 2436 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7255 0 obj <<
+/Length 2201      
+/Filter /FlateDecode
+>>
+stream
+xڽZio����_! �D�v߇�\��#;;���� %��.Ej)���ק���I�)��`�D�^��i2���
�)��a\�V�
<����\��v�#W�����{)fI���� 	������9!��ED0��
��q���?.(�ٗ�d]��ߧ7e\~Y.?���S+�`�K�,���'�߫o�ůW�^�'ıGG� �5��ZăD0���F�jD�A��V��&U|ޗ��~Q�A���d���}R_���&��y���re�T����U���ՂIb=���Ͽ��\��F�h1{�/c�ls�)k�d�/~���7��"&�AۘQ���b 
�

D�͑!QX�5_
|�
ҏ�Q-]�$�O�"�	R�YD2\��?��	P���H
^�
1nH�ԇ�>)��nq&�E�ġ_E6��D
+�9b|y�aqX
�H��Q��FI̓1�� N4�����©MI7&��׭����b��C���eG%�R�
��m*�]5!�JCRi�Vl�?a�!pS�CΙ���R��}��Lq�2T;��8f>)$)gn���+��R��ʨ�i~�%�"���&��/���
���ll�
�K+3�h�.�G�Ui�$dB���iX�m��Ӭ���d�*��>�W
+ʽZ�;,����
+�@s���l�<�$mk*IfNoU;�U�H�Π��ϻo�b���Z��W������I�}\E��t[����}��?��x�\�ܸK򤌻�-�M�l�j˲���#d|}��i�,G���)L�o�\����B"�4�c��
��o�`x�B�Z줦��
�ҷ��f��~���PT��h����n
�O�$.���{[7�ݮ�ߛ,����S���U��맲Jw�9�<Fj-)(_G͇���4_e��XE
����HO�WѮ�|f��D��#��
C?�=m,&�q�:sR4M ����;�)J�z�i|Wƛ^)�b�]��Ҁ��
+t��D�
���Q�'W�/
���e
����_!��M�s��n�i.\~��h�-��'�L�P ֨
+�:Z��@��F
�~���Q'���M��j���ln�ƕ��ʺ{7�$J{��
� tb����z��R�5�>�,C:6�k�<t��@50�H���餦@��ݲ�.���I�V:c0"1-GM	��������
�"WG�Kq�)y�DŽ�vy2eq�Mn�C�4��L�NJr��l�`j��e�pB�Jn�m\q�_����5
�n'?����^t+�5=,���ż8�w&��8;>�&�
�u��`���Shj�6kc
���2��-�[��;��2v�]��Z9��e
������}A:UU2Hz�+�0�3~<�[�	C�'�����<�Nj
+l('��*	�
�g��!4WG��:1��NJ�i�'��
j[B��&U
�hj^�6��KZ�AB�يMצ������M�j�C���O�_�
?�����p#�؞E�>�p�\ ��8+k

��m��6|bvB�)��Kf'%Hɺ9�����NG���F�e����# ��
a]��\���Hn�d��U����}ø�\V�t]�a�>طĕ3�)�ge��#����]��C��w�#

�q�ۍ�4\6׶E��:�EOW����N�w��P���^Rn����
+D#�s����[�@L��ņ�ع"�r�E4��e&����.W���5����Н^]!�NuM�h��wT�Ю@Fӳ{�
��$��^��_q�e�
.{�1(%"�	���� @�^

BlA$tM��9l���E'�a���}Z i�۪�zZ
+a��AR�3�Nl�
��B]G
+.�g�B �K
+a
)x.�
�|�'
kaC���
=�4�a�H�	�Ԕu���Ҿ�W� /X�!\��
��/�b/�
��W
%7���˦�W_O
+D#"�zIZ�^6E
��4-8
+ϧ�0��\tϠ� T�� :Z�\4M
��Sh!c�����~1_�0�Q&�>褦�{h�����1V��
��οؾK�B��EUbK
C���ϡb��[���
�{A�|m��_�WE�����
!�
���8k_�
+\��J��* CJRe������p���X�{���{��;'H���D�bG9K
�
��������G�ڡC�nK��/��첏�c
�X(zQ'4�⹟c��&K��nS�ݘ7�k�G�?
��_���endstream
+endobj
+7254 0 obj <<
+/Type /Page
+/Contents 7255 0 R
+/Resources 7253 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7251 0 R
+/Annots [ 7261 0 R 7262 0 R 7264 0 R 7265 0 R 7267 0 R 7269 0 R 7270 0 R 7271 0 R 7272 0 R 7273 0 R 7274 0 R 7275 0 R 7276 0 R ]
+>> endobj
+7252 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Linear__Expression__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 7277 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 283.00000000 34.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 7278 0 R
+>>/Font << /R9 7279 0 R>>
+>>
+/Length 7280 0 R
+/Filter /FlateDecode
+>>
+stream
+x��Q�n�0
��
�ťhE�3��@
ފ�p
;q�
m��%
7K�!�d�)��;
���cث�
�'0�_`�UV+K�����0����%P�m ���5�-��^>��h���n�ád
���a�:|΅\����
_�e�@��8�;x���+��~{�ԫX��#��<
O�]]�b�}�����w��'Lr��f��]�D�(yJՒ,����Rf+�Y�w�3믨E�QS��c}��T�g���l�H
M�rN[i.��J�&�a6��%҈�
�;7W�����w�>�l�|���8\=��/��}endstream
+endobj
+7277 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142729)
+/ModDate (D:20080908142729)
+>>
+endobj
+7278 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+7279 0 obj
+<<
+/BaseFont /QKRRCU#2BFreeSans
+/FontDescriptor 7281 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 556 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 556 556 0 0 556 222 0 0 222 833 556 556 556 0 333 500 0 0 0 0 500 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+7280 0 obj
+304
+endobj
+7281 0 obj
+<<
+/Type /FontDescriptor
+/FontName /QKRRCU#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 7282 0 R
+>>
+endobj
+7282 0 obj
+<<
+/Length1 56044
+/Filter /FlateDecode
+/Length 7283 0 R
+>>
+stream
+x���|�����e�@�m(t�eɲ�%�Z
+-�tS'q8vj;����{��ޛ��ރ>Y�J����{>�9::��s���{-A!4�:}�D�������k���\_p���A�Ӿ��B��{�{�����3����ݝ�u|�&�A�y�gLv{�᳆m��x?�{���7���+J����sb�	��E}Cv�k�~���s���������C_�R=��	�
��qͥ~,^��kO#�������Y��T��&�-��1OP����Ղ`�߫��F�%�n�$!�A��x:M�C��!Drt�X�<	:G���U¥v�
#�Q�ANlLwz����]u�%�t�J��"�v�4�5�
t�X��:K���9b(y-t�8�|z��L�
}8�#���8��}2t�8�����l}81��'�D��#"��Z%Z�h��j�Ƒ���
Os�������ӵ�9�V�W"��"��Y�D�wU$&D�Է��זּh���Ƶ�	������������\9����
�jO��=����*�����=m[����O�z����^��.z�5Y&��x�
z�'7Y&����Ib��9
uLzE��U�T�ʷ�'��l�(=hOג���ؓD���ӛkޝ�g
Z��G��,
��ж	"4=����|��U�e܌��������lײ����Z
���&k���E����]mӂ�.���o�5d�g�'ڈy�U��U��[�I�4b�/�o���]o�{��ڽ�����!�k�=�;��_ɷ�:[��=��N�5[<�U�����Jۼ|{��Zj�4mvˤ|1_�Z��o+�L�i�+y��n/��7<7!&z�'x�=�	��
t���Y���	��FtW�}�L��p��	]��	^�NlLj���W��]�-
��^����6���ц�<9�v}~;�����K�ֵ�
^����k�
�gO����ria�k�E-��{�*-����F��Bn� [...]
q1qq(q/q�9qq
q4q.q%q�ǪGo'??��G�?�W�?��O�{<��5�	^�>�5��S��
=K<G|����
ċ��^3O�H�J�B,��+��H��z���ug����=�+�Y��u�B�Ko��f��ľ�>�
ą���~ފ�@�k�[�.�%9�'R$%�b))�
+��1�_�ć�C�a$I�D'G�#ɕ�Q�*��j���hr
�w�rMr-��
C�M�%Ǒ���������?���	�D����� u� ��I�H�܄ܔ܌����ܜ܂ܒ܊�I�L�2K��$r29�ܚ܆�����JnKN#��ۑۓ3ș�,r6�񷷖��܁�C�H�D�L�B�J�F�N�%� sd�Nv�y���"��
r
9���,��d�,���}�d���U��\@.$��ɽȽ�}�}������Ƀ��ȃ�C�C�����#�#ɣȣ�c�c������ɓȓ�S�S�����3�3ɳȳ�s�s�����
�
ɋȋ�K�K�����+�+ɫȫ�k�k������ɛț�[�[�����;�;ɻȻ�{�{������ɇȇ�G�G�����'�'ɧȧ�g�g������ɗȗ�W�%��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?�R�_�6I)����8��J�$J�J�b�j(5�Z�N��FR+S��U�U�ըթ��Ԛ�ZT
5�Z�K��֥֣֧֡6�6�6�6��S��T+ [...]
+�5�
5�ږ�FM�����fP3�Y�ljj�#��3�
�+��;5�ڃ�QmT;�A�N���z�y�|�@�N|@�RE�D�Q{oo��o�Qe�BU�~j��ZD-�������������������������������������N�N�N�N�N�N�N�N�ΠΤ΢ΦΡΥΣΧ.�.�.�.�.�.�.�.�����������������n�n�n�n�n�n�n�n���������
�
�
�
�
�
�
�
�����������������^�^�^�^�^��P�R�Q�SoPoRoQoS�P�R�Q�SPRQS�P�R�Q�S_P_gS_Q_S�P�R�Q�S?P?R?Q?S�P�R�Q�SPRQS�PK���M�M�
��
��-�-�
+��1z=�
F�D�G�#��Q�*��j���hz
zMz-��
C�M������������������	�D������uڠ��I�h�ބޔތޜނޒފ�i�N�:K��$z2=�ޚކ�JoKO�������3��,z6�=�ޑމޙޅޕލޝ�K�A��6����t'�Ew�=�<z>]�{�"]���=�2]��t?��^H/��{�{������������ӇЇ҇ч�G�G�G�G���������'�'�'�'ӧЧҧѧ�g�g�g�g������������ӗЗҗї�W�W�W�W���������7�7�7�7ӷзҷѷ�w�w�w�w������������ӏЏҏя�O�O�O�O���������/�/�/�/ӯ�K�W�����7�7���w�w���������O�O�����/�/���o�o���������_�_�����?�?�����
��
��
ð
������Ȍ¨L��
e�1+1Ù�Hfef�
+�*��:3�Y�Y�Y�ia�0k3c�q�:̺�z���̆�F���xf3�ie��$�1�$c2)�b6a6e6c6g�`�d�bl�a�L��2.3���La�f�a�2�2Ә��v���
f&3������avdvbvfvavevcvg�2{09��ig:�<��t1�L3����^�Ȕ�>fO��T�*��,`2����^���>̾�~���́�A���!̡�a���̑�Q���1̱�q���	̉�I���)̩�i���̙�Y���9̹�y���̅�E���%̥�e���̕�U���5̵�u���
̍�M���-̭�m���
̝�]���=̽�}���̃�C���#̣�c���̓�S���3̳�s���
̋�K���+��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�f)�/K�$K�4˰,˱<+�"+�2��*c��C�a�J�pv;�]�
Ů®ʮƮΎf�`�d�b[�1���Xv
��.�
�>��!��1;���Nd[�8��	Vg
6ɚl���M�M�����-�-٭X�u�4�a���Nb'�Sح�mة��4v:�
�=;����bg�;�s�
ٝ؝�]�]����ٹ�
l�mc��6�v�]l7���c���-�%��ݓ-�����
؅�"v1��7��/��?{ { {{0{{({{8{{${{4{
{,{
{<{{"{{2{
+{*{{:{{&{{6{{.{
{>{{!{{1{	{){{9{{%{{5{
{-{
{={{#{{3{
{+{{;{{'{{7{{/{{?� � ��0��(��8��$��4�
�,�
�<��"��2�
+��}�}�}�}�}�}�}�}�}�}�}�����������������������������������������������������������]���
�Q
�1
�q
�	��I��)��Ÿ!�Pn�7����V�Fq�p�r�q�s��5�5���n
�67�ǭí˭ǭ�m�m�m�m̍�&p�V.�i\��9�Kr&��,nnSn3nsn
nKn+��
.�e�,�r����nknn*�-7���m�m���fr�����
nGn'ngnnWn7nwn.���ڸv���s�\���p��\���\������\��r��n!��[�������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
ϝ��ȝĝ̝ʝƝΝ��ɝŝ͝Ý˝ǝ�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]�]���������������������������������=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=Ͻ��ȽĽ̽�-�^�^�^�����������������>�>�>�> [...]
+��1~?�Ư��G�#���Q�*���j���h~
~M~-��ï͏�����������������	�D������u���ɧx�߄ߔߌߜ߂ߒߊ�y�O�>˻�$~2?�ߚ߆��o�O������3���,~6�?�ߑ߉ߙ߅ߕߍߝ������6�����|'��w�=�<~>_�{�"_���=�2_�|?��_�/��{�{�����������������G�G�G�G���������'�'�'�'�����g�g�g�g�����������������W�W�W�W���������7�7�7�7�����w�w�w�w�����������������O�O�O�O���������/�/�/�/��K�W�����7�7�����w�w�����������O�O�����/�/�����o�o�����������_�_�����?�?���������!�%�#�'� ��$Ȃ"�BL"
�	+	�Haea���������0ZXCXSXKh�k
c�q�:º�z���†�F���xa�0Qh�&$]0��`
+)�6666���l��BF�
+�0I�,L���
+�
+ӄ��v���
a�0K�-� �vvvvvvv�
+{9�Mh:���)t	�B�0O�/�^�(��>aO�,T�����*qq;��O�B�J<*, "
"
+����DŽ��^���>¾�~���}����A�=���!¡�a���‘�Q���1±�q���	‰�I���)©�i���™�Y���9¹�y���
�E���%¥�e����1•�U���5µ�u���
�M���-­�m���
�]���=½�}���ƒ�C���#£�c���“�S���3³�s���
‹�K���+��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��
�[�;�
+�{��G�'�g��,�W�L�;�7�w��O�R�/�$�o�a��H爤H��Ȉ�ȉ�(�"q�(����������C�a�J�pq�8R\Y
%�"�*�&�.����[�1���Xq�����������������8^� N[Ÿ��	Q
1)�bJ��M�M�����-�-ŭD[tĴ���+N'�Sĭ�mĩ��4q�����8C�)�g�;�s�
ŝĝ�]�]����Ź�
bNl��1/v�]b��#���W,�%�O�S,��*��
ą�"q�������������x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x9q�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x��������������������������������������������D|U|M|]|C|S|K|[|G|W|O|_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G\*�+)Q-1+q/	�(I�,)�*Ť!�Pi���4\!��V�FI�H�J�I�K��5�5���i���4V'�#�+�'�/m m(m$m,��&H�V).iRB�%CJJ���,iiSi3is [...]
yMy-�E
#�-������������������	�D�U�˚��uِ��)�dK�D�T�L�\�B�R�J�eGN�9+��$y�<E�Z�F�*o+O�������3��,y���<G�Q�I�Y�E�U�M�]�+�!��6�]��r��%w�=�<y�\�{�\���=�\��r��@^(/��{�{������������ˇȇʇɇ�G�G�G�G���������'�'�'�'˧ȧʧɧ�g�g�g�g������������˗ȗʗɗ�W�W�W�W���������7�7�7�7˷ȷʷɷ�w�w�w�w������������ˏȏʏɏ�O�O�O�O���������/�/�/�/˯�K�W�����7�7���w�w���������O�O�����/�/���o�o���������_�_�����?�?�����
+��
+��
+��
+�����Ȋ��JL�
U�)+)Õ�Heee���������2ZYCYSYKiQ�(k+c�q�:ʺ�z���ʆ�F���xe�2QiU⊦$]1��b*)�R6Q6U6S6W�P�T�Rl�Q�JF�*�2I��LQ�V�Q�*�*Ӕ��v���
e�2K����QvTvRvVvQvUvSvW�*{(9�MiW:��ҩt)�J�2O���^����>eO��T��ү,P*����^���>ʾ�~���ʁ�A���!ʡ�a���ʑ�Q���1ʱ�q���	ʉ�I���)ʩ�i���ʙ�Y���9ʹ�y���ʅ�E���%ʥ�e���ʕ�U���5ʵ�u���
ʍ�M���-ʭ�m���
ʝ�]���=ʽ�}���ʃ�C���#ʣ�c���ʓ�S���3ʳ�s���
ʋ�K���+��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�e��J��J��ʨ�ʩ�*��*�����S��C�a�J�pu�:R]Y
����������V�P�T�R[�1���Xu�����������������:^��NT[ո��	UW
5��jJ��M�M�����-�-խT[uԴ�Q���NR'�Sԭ�mԩ��4u�����:C���Rg�;�s�
՝ԝ�]�]����չ�
jNmS��5�v�]j�ڣ�S��W-�%�O�S-�����
ԅ�"u�������������z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z��������������������������������������������D}U}M}]}C}S}K}[}G}W}O}_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G]��#bd���1&�ƸbbL��1%��b�!���a��b�c#b#c+�F�V��[-�zltl�ؚ��b-�1��ccc�b��֍�[?�Al��F��c�cbc��xL�%bz̈%cf,�b��6�m [...]
+҂�!
�4d2
���|
�p-�Z���k��\
�p-�Z��\vzw�\dK�߁�F�m`����m��
l�6�m`����mg��>f� ���:�v�� ��l��
`;�v���7��M/
�4���K/
�4���K/
�4�ҨkuM?
�
�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�,���?
�,�7)��]���Y�g��z�Y�g���
t�.�]��@wQ{x�%ٵLL�\��v6��|���W
+�Jw��t���2�A& uH2	iB� -HҁLCf ��A�8����?�8����?n*3��y��bV�E���"�8bЀ�C��:j���:j���:j���:j(_C�	�1�:&P��hཱྀ���}�g >���@|�3���
�c �$���iI�%��^xI�%��^�D���K��	<x&�L��3�g��	<x&�i��&�M��i�/
����4����_�Ki�/
����4����_�Ki�/�>�Ki�/
����4����_�Ki�/��
\��0

���4p�^��
�|�!�k��Z&!v�s
��k��R��{�VM�W<u
ҀLB��)��T��k+-�ʆt Ӑ�,ds�$�|�@>I �$�O�'	�D
Q�S�$����?|�rIB��)�Z�-_(-
�
M�&�D�@�I �$�hH4	$�M�&�D�@�I �$�hH4	$�D�&Pn�&Pn�&P.R�&�����M`�&0!f�������ѓ/�+=�J�
}�9_s�R5_���l_��[c�f![��)%h��ޞ�
+9��]�,M��wN�z<�,��b�|5�N�yy?̛i�cv�n�

;��Ә �M��/��xz�:rԶ�Դ~j�

P���3�K�̞��
=+��#z��
:��lW�	`lK�R�8��R.j%__�|X����#�
*�?ϴ�*�U�
ۑ/Ts<�b��U�v��W�V;߯Z��Z�����Ԣ
o?�׏.w��J�rq�tի#��>�~�ޏwɖj
�Է��e�TJ���_�k����L
$��X魭b���'��c��H�"m�
iF�%#͌�T�Y����0���Ld	��zTn<*-
��J�b�"֢��(N-*O��Ԣ���d-*9���JND%'��HD�#a$"�D���0�C�0�C�0�c�]�C�0�Ch��d�D2z"=���0���(3�Ōb1��ͨd3*ٌJ6��SQɩ���#a�"�T���0RF*�HEV�aEV�aEV�aEV��Հn
��@i!V<�9��H��pk"��H3"-if��"�~87��+�C<��p7�cU�cU�cU���h&�O@|:VF:v�:VHzX&VHz�&�s�+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
+$
�|
�|
�z
�z
�z
�z��
<x����������������������������������
�cE�cE�c��c��c��c��c��c��c��c��c��ce�ce�ce�c��c��c��c��c��c�c��c��c��c����L8Szx����������5�
_�
_�
_�
_�
_�"�,p�� �|
�|
�|
�|
�|
�|
�|
�|=d8��u��u��u��u��u��u7�3��3��3��3:���4!S�a96����@f!��
��:�u���ׁ��1t���ׁ�_�|
�:�u�col`)j`ol`ol`ol`ol`ol`/l�Þ����0�����������=��=��=��=��=��=��=��=��=��n��#�#�#�#�#�#�#XrXr�#�#�#�#X��#�#�#�#�#�#�#�#�#�#�#�#�#�)۟�^\�&/20RMk�4-�KD�
iF��"͌�MF�dd��&Bܤ
��ңt-zB��0�$NR�tx/�
ЌHKF�i�H����H�G�i�a��a��a�F*�HE�#a�"�T���0RF*�HE8�0[C�� �:���4!S��
�@�!�1jb/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/ob/o�C�,d0'L��M
��5�c;ob;ob;ob;ob;ob;ob;ob;ob;ob�n"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qPO�x9�D�7��M�x9�D�7��M�x9�D�7��M�x
���8�0N,�
���8�0N,�
��j
�s Ӑ�,dP
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
��¸�0n,�
���1��c 
�@Ɠ��da<YOƓ��da<YOƓ��da
YGƑ�qda
YGƑ�qda
YGƑ�qda
YGƑ�#�,�,�,�,�,�,�,�,�,�,dy
k
k
k
k
k
k
k
���
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+������
�\[O��_�.s��ʂ\9'y���J�ܕcjf���W{jjOOM����o.����%_�=����n��.�����.���_����ypX�j5��"�vt��

p*�Vנ���1���������_����������߮�W*�-�ݝj%�ϯ��V[��*�s��J�s�r�vOM��
+M���?����Z{�ˑ_>���L���>Н���\�:���{s���_�y9���=��(zD����
+�Zkҽ��RͧT�����$�mZ��k�;K��[g��~�gQ�~%� _�����
�=�|�h/�ޞ`L�j[N��ߗ��B�.*=]��E{��/�/��_h���
}H�E!_���e$�
�x�X�ǽ
���?6�����
�c�wl�
ޱ�+6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��6�����a�?l�
ް�6��_��	<a�l�
^��
6x�/���6�<o#����6�<m#O���6�<k#��ȳ6�<k#��ȳ6�
�A�ȳ6�<k#��ȳ6�L6�L6�L6�J6�J6�J6>O��g��y���m�����������6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��;06N�l���8%�qJf���)��S2�c6N�l���8�q*f�T�Ʃ��S1�a6N�l���8
�qf�4��i���0�a6N�l���8�q
+f����闍�/�^v6�(gL6Θl�1�8c�q�d�����3&gL6Θl�1�8c�q�� �9�{򞃼� �9�w���<� �9�o��� �9�g�<� �9�c�|� �8�;򎃼� �8X�:�;�|� �8�7�|�`
� �8X�9�N2��|�
y�A�p�7
�
y�A�p�
�y�A
p�
�y�A
ppR�`�;��N�
�����w0�
�s����v0�
�_���<u𮚃��`^:��楃�k����tpz�`�:��槃��`
:��桃y�����|s0�
�6;�o曃�����ٰ��ag�Ά
���?i�O��F���?i�O��F���?i�O��F���?i�O�9���F~N����4�-�~K�����i��4�q��F������i��4�9�~L����4�1���F^J#/�����Ki�4�Ry)����R<�y2�A& uH2	iB� -HҁLCf ����?�8����?�8����?�8����?�8���׀�_�|
��5�k�׀�_�|
��5�k�O ?���O ?���O ?���O ?���ׁ�_�|
�:�u���ׁ�_�|
�:�u���7�o � �|��
��7�o � �|��
��O?	�$��O?	�$��O?	�$��O?	�$��7�o��	|�&�M��7�o��	|�&�M�.7�A�[�9�{�
}!�	��Z�\
+�)ী�~
+�)ী�~
+�)��B�-��B�-��B�-���|
��-��(�F�6ʵQ��rm�k�\��(�F�6�e��^6�e�^6�� ��|��
�;�w�� ��|��
�;�w��~�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y���ߍs;l�/`�
t�.�]��0�]��
�v��.X�K�`i,킥]����gC:�i�
d2��
�v��.X�K�`i,킕]��
Vv��.X�+�`a,삅]��
v��.X�
�`a,삅]��
v��
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
vu��������.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q [...]
+�d��	
O�x"� OZ��R�Ĩ�ߗ/���Wj��F��aQx!Wz���l]��
E�>@�.j=�Π���^]�U�C��ʏ`�‹ zƋ zƏ ��#�
�E^p}�J��
�gGo�$�L��\
+���Z��O�o�t�s��e��q��D���ńt�
���Óp�
��!��+Xjh�`i��8$�	�k�jwO�C���W*�-��4 i 2`cOڢW��T݊��^�k�
]�x.��$BK"�$B
Xۓ:$�I"�$�I"�$�I�)�h�$�"��Xۓ�7�o��	|�&�M��7�o��	|�&�M���+�K
k�
?�k�}�/˵f
+nv����
n
�X���亼����8�j�I�E��~��W����/؋��]r9����%�jO� �{����q.x�o^���B���5��K:��¤������un.4�ŷ75|[ӓ����/�T����0ZJ_��W*��
�\���
+y�P��i�����7	{��Zl�y����wl5|�R�7,=���^�t��y����S>�մ`իi�*ד$"D*�w=���P�ۼ����_��T��|!�W���f%c����P��+,V=Ǿ|�_L�cH��J��x�Z��Ej[�v�`���	3�MO�o0Z�5C�ΐ��!
�$�	��� mH�+����
dҭ9$
���'5�D�A�s@q�7kz�b�#��C��1����p_CB����4��di YH����4
͏ YW "����E񪵆W�=�G` �Ż�޵�𮵆w�5�k�I?�� D�����5�l��ek
/[kx�Z���^��𲵆��5�l��ek
/[{������h:#
*����-�ьй�
:'R�O����
}"%����4,Y
C�#�d=�G����q#�`TFh_[��>?h�9�F��U
���h�9e��w��)4���*t��G���ޮ�\
���no-��������,t�l
�:�B[@��
�<���t�;{<��h+-�&{�
�3�P�6���7�������N�}ВZZ����u�%|^ ������ ��	��� mH2
���B��
�Ǔ�
��<	�0

q�C��
�%!���tĥ#.
q�KG\:�����
��7�o � �|��
��7�o � �|�I�'��~�I�'��~�I�'��~�I�'��~�&�M��7�o��	|�&�M��7�o��	|�)ী�~
+�)ী�~
+�)ী�~
+�)ী�~
+��-�[���o�\
����g��F�6���8m�i�<q�a���F�6���8
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~�.�]��w����
|�.�]��w���~pD��
�Y� ��
�n2X8y2�v Ӑ�,�Ȁ<:J�ڋ���������V�
Tg'������' .^�r�J��W�<�
�bz�S/1yR�L@ꐡ?J
���LA|�&�J�>��D�
+��
R.^��$bH �bHD_�
+�J ����Z�A
;ha�J��*�P�xuʓ���ru�NG�:�ף����%AG��)���fjo��{��+�*.rѻ��|_��^������Mp_����#��O�u�N�����q���W:�z�Ky at -
��
��}�@�
0w
����b׀K���=�*��J�7�2����z���z�SG����
�O랮��c at -�}�}u�m�:sx at -����*uqT*.uj�G�\���/�
	u���x
D:�{�����6
��f at d�3/��(��UE���J����t�NWhh��=4̃�Z��W�a����3xWC����
+
Ej2^3���z����

_�}{�.�0�Jw*�!|��D���_����<=ߛ,A�U���7 at p�����@�:D���X���OU
J)��^�J��
FS,D�U�s]�
A����xA�
+�E�ް��A�wy����
���z1�:��v�
>���3|-���*�`\��*L5��
��඗0�"��<�$Oz�B�uC�|}��^�"���4/4��Ƹ���
jú7
�]̵|�Q
-b"H��
:tt�FO�ˡ�q���'z���(�����L�K�d�`�[E�^�@�V�ѵ:�송#����-�0��10b:00:���L:y@�~��l.�J/�3fL]�*���@�Z#H	����YT�S�a{Q�bT��<S
kW
j�a�)B�a�)kߡ�P��.O���,B +~^��V�DV@"���E�6UoC;��>0��ҋ��־wnd7�ar��az��j8�{�<��B[�ٽ
ɶ~��!,�*�	h�K,�
Fd!
���WC!
��#�醡T�0@tIqyl$���
���R
��P)��d�v��tOG%-.�*fy��#�`��
}a	a��������z��h�Zxb 1)*�^	s��*A(AX��"GL�J4�*ӭ�J�r�@�`���%h���*�T	[|�F�s!��5T�֡�
<�C�r8?"�����@!m�R�
\����0���ɷ
�.	�-�oȟ5���><ӆma!�x�7Z��,q)2Ń����64
!@7
~5~���omƢ����]�
�Wᦆu�
+��
+u���?5��j��jtK
��.�jcL
1u���PDGC
�E�k�r�����S}��B�
�C2p��WF�2�
+��ꛦ��������j��R�QW����z��n�ڐ���[���h��
���A^i������l�p3���(k���]G�T��:�R�9��s���JW*]i�t=Rx��x���*��P�n�[���W��
�����
m�8��a؀e��`��~/�W�T����]U�wl����PƼ�[��X\�%A\�Ӵ���%ƺ���]}9�z�jC�
�t4�p����z�����[m
�z�/�_��/
+�%T*��:dž��r�����9����5ԶT�;r��0���ﭽ]5!�)Z��Tʬ�ݶ�C�� (�I��%�*a�)��'����\��̵�Z�`B��/��cu��'.�N
�8\�,K-�b%�0hgo%R+;4������`r��O���A�&F���d�/�	�� 0j�
��qMo
�x�֚
+�Z�	������0��N�1,��d����
+�������]
1;
w�yD��VXX
x�'*dN���.�f��f<��
4�^��9�	}�|��#�yz�����G"٤��]WF���Hue�`eh�z�A˰�4�|��w�~-c�|�e����Su��7k�F���=0���j��
F��1��h7�h#�{��d��
�����k���6h
j��=�(M"^&��♰���h�_K5k�zV��=�436��Y�h�fF�Y7كA+�xZ�B͚7Ѭy�Fp��N4k�D�ܘ�Ѳ���f�դn��Ԙf
�d�%
�M�`�|oVF�>Sƭ�w
�A=�A="m�
��`s3>��M�a�1h
ZfP��
�`


w���;���Z�Һ|
X

�D�5T�c�ͅ&�l�Q�2S
մ�H�f�1\},��	box�
�[�k�ׄ��Ⱥ�fYic]
cY&�����P�B%*z���
3TR�bm��TFM�e[><���%.C��L3�wC�EK�\X#����k`�50��Ѱl�M�=�	����1��aD�hXQGF�nE�H�!&��a��0�p�-�J�H	S�[��[�(f�h��f�h�6]�`��
M���íV"����`Y7�Yn��4�vk3c���=/��ih�
��r�u��
�c��FZ�ǠK����p���#3�Ǡ��
�����`3]o��X�����ƥ�
+btۧ-g�y
:�A�F�o��7���Mbо	��i2�4]"4N�z�m�siX/4�hX
��T�`Y�{��M3~��������%�p�+`�fa�h��#�
�a��tO����Ru.gi��Fi���3�(�֟�%�
	}�lܭ�+.���xF���a7Z
a�]r,6��	���;&Q3�
���{�?�cp��ݍ�uG��p�cjm�x���M��l+�;]�t��d3��̘jf���͌�f�l��hfԛ���n��,x�Y���جFv��Mk�61:Z3c��;ͪ�4�8�Yݝfuw��ˌ��(n`zNh�
s�����ݝ����
����Z�N�D�m��)����
탺��ͽY�+p���{�?�/37u�oUm�M+p�oU��cU3��=��ܝ�kU���BC��>��S�fF���n0�Yf^օ`՝KE
ˏ+
>NvB_�ZY&S���1��MʂGf�
��(�!؀��ߴ[�nڭ+�_�f|E7�փ��
,d;���������\�Ms7��n
�f��ݩ��j�|T5�X�.�K
������
���
��
+R�@Q�ܱ��
�44�<��R{3&XA�u)��G�e�K���)�՜��;T�iVDpcj���7��9�GjP{к� ��c�8�A��cЌe� c�#;�
4Rg��X�$k�����eFz��A�*��A�5b��j����B���^����ZQ3���<��\+x,d�f���	���

+���9\p���c��
G+�nLC�YA�Z�m�Az�A�����*�P1B%*a;$��wgt�;c��+�ݰ��c=��D?6�ÏMt=*<��Q�0Z#��H4�F�t�5��h63���fF���ifL73f��͌nc4
��fF��1�̨736kO�Y{����n֞v����5�ݬ��fMg7k:�Y�9͚�i�JN�Vr�5�ӬA�f
�4k�q�m��G+�܎n��ƛA�8���?r��>�2F����5���Gb���.n$BE#T��b�i	.��E-A�ǐ��h�����pm�›.u��e
�֠�q��=H��n���,����V����Q���O43���gm|8���jf���f�L3c���mbĉ�2F��1�̨736�;>"X�h636k%�Y���e��Dk� Z�I4k�Dc�0�-�q�5<�ڬZ�5Bk�Fhm��M���Lk��śU-ެ[�ͺ5
��w�5L���Y�h��0ӛ�̠� 3(J�Ax(�H����_$h�'rؘa�ac���~���w�����O�_<������q|�9�����-��л.YB��
�|�.!d���c�C.���z�����
O]����]r�ұWxN�%��	6|�l�>�{vɟ/{^5ܻ<��=U!Fy>#xn�ac��i�29F3���޺c�0��W�i�F�S=�J��#�co�z��n��
+������9�]rc���=��svz}��_^zs�ҥ^mr�����ҥ��
����Lf�#��V1|�u�	j��VNh�Hn��뭻
����k��k���d-��y��ծ<��=s�D�'$���Q���4|����J�	��]��ݝ��
[g�CZ�
Ժ���!�Ug����l��9���l]��NO�s�d�b\i����V�_t����2t��cǗ�V�ƌ���[z����z��o��+y5���b�W��0/����ah�z#ǒk�%Ѐ���o[y�;������%
�Lrɉ3'�߶rœ���%�<}�����\���'_�qG�7
X���E{��Ne�����!&9l��&64 5lYL��3��6�p����>�J�a��|�i�g�s��)�m��ѱǍQ�:�dI����8j���wϛ^��o����]s�i�
+�9��q�h3�<V�-�ò�S�˨<J��ʶ�� P�n�m*αV�<
�12-�
��k,:I�fB�S��,�6��L�ۋ߹mG+j1�?���;���{����q�G�V#h5�N� V �8�B4�y#�U/�ƹS����I�=����?�v&�����uǑ�?h�ǧ�?�rR^b�1g�_���9��]ݭ=��c٩�]eS�4���t_	�
*h
�Msӳ|���eJ����.�nt�R�Q��;F����a���v��k�mʈC
?
�9
+���j�z�5k�4��!���*~�
+��C�U���Z��:��h����$��Gx�P,�#�1s��>TiM|�8Rn٣)��G;��hj
zgc�����u��������̟آ06�,d~`c�x���w�]�}�*�#�
���
+u.��
�N��y���%�m��Dπ7
�pX+���b�3�FU�t"�p��]��?�����-ӧ����6
=v��/�,_�zp���zr���7n��_�u�j3�zt\*葡8�Zf�.��ZV$n��
O
���r�aU(p��R�J
�
+�������E����:�:����R�5���T
+
� �]�}L���q��/w�ڤV$K$9%���r���� ���s��4�R�lO*��~��Vn�8,��p[}d��FC33���/X�>=�s���o���|�]�T�f�JFl۳o
#�`�3�����tc�,8!ͤ�?S�ןS�&ɋ�lL�/$aK��t���(�f��>
�	O� �?i�!f�tY�%ܜ����K�`�>��,
�%	����$�$�Q� �?�~W����p*������
1���
+�p�Z��edpzD�(��ߡ6 at 0%��*A�v0���q�Z��j%�|y��$���~	�_?��H�S�~�<
�[�?�x`>#��&�I"��Ls��;dI�%�
��`0
��`0
��`0
���m
L_�A��_}�p$����,&�����,��F9���*4���2�E��j5���ơa��lKK�kh�
�ۦOK�;SyF��}Z�
eC��
�<�/��Ȅ�P1*��RTvgF%��*j�o0�e
�?]@
K~�y at 7w��
}s�"5���ΊF|�M�S�K3nAf�z��AL>b���>�
�@vz
��G
������DI����x�����ɪЇo�{��zOX\�
o���!As���
����endstream
+endobj
+7283 0 obj
+20551
+endobj
+7261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 335.177 191.16 346.0809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_b82fb79015a9e4959fe801e608b2a0ae) >>
+>> endobj
+7262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.258 320.5562 364.1404 330.4615]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >>
+>> endobj
+7264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 296.3227 191.16 307.2266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_701574facbfd5461d399dccbc88a2999) >>
+>> endobj
+7265 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4971 296.3227 295.7467 307.2266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 257.4684 198.9087 268.3723]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_e9cc837bbae1745ada3780634c73858f) >>
+>> endobj
+7269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 218.6141 191.16 229.518]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_e7df198cd5bdd6e9f87192fb3170261f) >>
+>> endobj
+7270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 179.7598 191.16 190.6637]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_9a14be758de0e77faef8de4a11bd8e8c) >>
+>> endobj
+7271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.9756 179.7598 230.1632 190.6637]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 140.9055 191.16 151.8094]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_5a74ca4d6d20b677bd8e4bf05dd45760) >>
+>> endobj
+7273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4971 140.9055 262.0034 151.8094]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+7274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 102.0512 191.16 112.9551]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_4124a10b953c4c49984524875a257f3a) >>
+>> endobj
+7275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4971 102.0512 260.3199 112.9551]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+7276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7256 0 obj <<
+/D [7254 0 R /XYZ 90 757.9346 null]
+>> endobj
+266 0 obj <<
+/D [7254 0 R /XYZ 90 733.028 null]
+>> endobj
+7257 0 obj <<
+/D [7254 0 R /XYZ 90 638.4619 null]
+>> endobj
+7258 0 obj <<
+/D [7254 0 R /XYZ 90 589.8981 null]
+>> endobj
+1503 0 obj <<
+/D [7254 0 R /XYZ 90 538.5747 null]
+>> endobj
+270 0 obj <<
+/D [7254 0 R /XYZ 90 531.9745 null]
+>> endobj
+7259 0 obj <<
+/D [7254 0 R /XYZ 90 354.1508 null]
+>> endobj
+7260 0 obj <<
+/D [7254 0 R /XYZ 90 354.1508 null]
+>> endobj
+7263 0 obj <<
+/D [7254 0 R /XYZ 90 315.416 null]
+>> endobj
+7266 0 obj <<
+/D [7254 0 R /XYZ 90 276.5617 null]
+>> endobj
+7268 0 obj <<
+/D [7254 0 R /XYZ 90 237.7074 null]
+>> endobj
+7253 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F23 2436 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F74 482 0 R >>
+/XObject << /Im12 7252 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7289 0 obj <<
+/Length 2790      
+/Filter /FlateDecode
+>>
+stream
+xڽ[Yo�H~���SVV���<N0�
�l�ݗف@K�M�Dju�����&���n9���%~��X]��)2��L
�(��a\N��+<����"��9ܟ�����~�bb��TN�ok
� A	�\�~����	�x�qF�4�m�����j�t��v����f��޽��(�l����v7#z���EU��T���u��7���ۼ�_.sk�*=���������k϶}�$�\�w��x�����
+#f��<���1t��┹��W��v��c1�X ��d�8��
	!�8�Q
�r�����
a)����
���ƖP��2z�a6�?
��ʆF���>�t��#�|��`ې2�
R�~Y���U�*ʻ�F՘�����6�b�
���/��
+Q���{X*w
�CZ!M�h���V-�mU��}�,+W-�u�?6�B����ޏLW�C�w���HY
,��
�aL!9���Ηն�W@��~���t�0A�+��6d�	��D�,�5$Y��u
��q�����Q*���)*�$4��ȑф9����]{�S���X�$;��
��M�>Uu%��R�{T���r��B��������8�U���Xx|��Ю��ӮX-~�U�*��ES$����ܣR
��Yn�
���
?��R1DA�/��FD�<�#R�1\x���}D��zL��������^�#W�fD��Z	
][_����q<�f��M>��>�}�F�ڷ뿱��F��DR
+�U���嬘�gȖ�{�AI\*[��l1���&%[������g�e+d�يP
e+N��V'Di��8?G��4�v-��Uy�;��>��dTƃ�Q)�
+�E�z��k�v ��E�؈i��u4
���`��ף�UW�P������=Q$@
Z	Z��ȅƩ�iU����5A�J�Lh��%5!4x�&$�9\�ݪ��m���i;��4B�yB��n��&se�<
��s�͖�³
-7г@>Lj�=*A:q�',z
	�UW��顆�D�#���ph#R�
f)~��]ٯ��������|y��
+���{i�&���$���a���ݸ����Hb�0�{�臥Ma�L
K�6$!�T��,n��T͘"V��.��డ
*�חm��}��Ψ����"/��.+�w��\���h�&�
5�G�t/��	�C���Gs@�H���XyT��+���v���a�qp��
��'
�Z��B�ٮ�nփaL��	
�G��0�٤K��\���
��V`#�[vZ���!:�
�_C�1z~h�FF
F':�B�7��
5�
����4�&�MM*��������Ỵײg��@�Z��X�`�f�*�զ���vu�/`�T0'�J���D��|���Dž
�A��V򢕎�F�x
�t�6a��n���bl
;��[����n�ȍ@�(���� N���DJ�Ò��x�`�p
v�|S���||�``�F!$1���A���l 	��az��z��-����!�W*�B�(ݹG%�Pxyƥ�5���
�"L����C�b��A1g�
+@���Ӄ��X���{_�u��Y$�����:���eڛ��Ѯ�����J�����O�BXR���9�A"O郃��!0x�>��y}ٝ��/ׇ8S�!�ܮl�^�L˄
�c;Ќ��{T����c�׮/�	j����H&1�p��}�ח�&+��B������;V?�)֯�Ejw�)
yR��`��
F�	���C�7U�
���)!X����W�O1ص
����?�k�� ��v��WA@ U?��W%��?a
�mD�����}��+��%W�%��׃�����]�hN$X�?�`K9;{;'�W'
�)����p�
�IH}Lu�0<,Y��Ha$�����}����aq ��Kv}G��ŧX
��
����퀅�\�"���
�!�D����و$�Ҍ����b0�{�'e2�x<*A�2�4ǦK��Slk���pq��^h#&
fY}~̶���4(�0��
)�ݤ��8܏"
+I��*�ӈ��%����A�70z��a�����hᲑŏǛ���-�ܸyчc�<@��G���S+�cvR�B at D�<,)rQ��"���D��w�c qq�L�sD�Z|���nzϒڱ��6�E��y�=�'�	�O����d_�}K�>
�`��E�h{�P���\NԒ=� ��h�?��$;=�����f������T0-���6�[��'������ �`QX4�s,�s�J�`\�L�
�e�F�>+W�z{R1�0H���)�=X�\"�<
�Pi{6��S�a��}��'�l��A��!qZ�
<A�o��_(E��S��
+	�^��x$
(�$Db��O)#0����dh#�
fy�Çd�%hş�q����5��)�� �u|Kgy`0��q�>�C�/K��s2=�h`�
^�r<�5L)$�x8T�;̊;�='��yE��_��
ڈd��Y^f\�
+|E�
C
�_s]�HKY�֥=,���H�'��|��
�}|}f���#�������3g�
+Q
m��G%HPf`d�H��r�iyn
<>�~`׺�+�Ucl��$����+�f1׽Lպ�0v�2��u;=�l!RV�yo�[�{뎙;
+�OKg�(~ɢ��'��h�'v/�����_��?B��΁`��ng�0j�
޵������M�?�������������}���L�i�߲��v)m���|�
o���`�j~0gO?���v1'��(5w����_�;����f�A�<�k_��pؾ{����-��X�
*o����>/�1(h}b7�5�_
p鄟�LZ*�;\n�I�M�����&���|d����Ė2endstream
+endobj
+7288 0 obj <<
+/Type /Page
+/Contents 7289 0 R
+/Resources 7287 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7251 0 R
+/Annots [ 7291 0 R 7292 0 R 7293 0 R 7294 0 R 7296 0 R 7297 0 R 7299 0 R 7300 0 R 7302 0 R 7304 0 R 7305 0 R 7307 0 R 7308 0 R 7310 0 R 7312 0 R 7313 0 R 7316 0 R 7317 0 R 7318 0 R 7320 0 R 7322 0 R 7323 0 R 7324 0 R 7325 0 R ]
+>> endobj
+7291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 685.043 191.16 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_04aff92d245522832391c1704f455992) >>
+>> endobj
+7292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4971 685.043 283.5625 695.9469]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+7293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 635.2298 191.16 646.1337]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_158df02c8c54fa5a9286836fb01563cd) >>
+>> endobj
+7294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.4971 635.2298 268.6288 646.1337]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+7296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 596.3755 179.5535 607.2794]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 596.3755 250.6661 607.2794]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_c1b93dcadc82e52690114301554801b0) >>
+>> endobj
+7299 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 557.8948 297.7285 568.4252]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0ed481e43baf024d4a5b5e86e85c4a87) >>
+>> endobj
+7300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.5441 557.8948 336.7317 568.4252]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.9332 518.6669 342.2613 529.5709]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_a8f43e35dec15be4374b207a9440eb2c) >>
+>> endobj
+7304 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 479.8126 191.7178 490.7166]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 479.8126 288.8524 490.7166]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_bca5613972564c8ec5c832bc8ff200d6) >>
+>> endobj
+7307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 440.9583 191.7178 451.8623]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 440.9583 303.0791 451.8623]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_3a808cf2742df02d856a8d9882845861) >>
+>> endobj
+7310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 402.4776 150.493 413.008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_5bb7f6903958069b19f70d1391987a51) >>
+>> endobj
+7312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 363.2497 156.2812 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_ede3aa1f7d5925d31d3f66faf655dc66) >>
+>> endobj
+7313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 363.2497 237.3465 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 282.4872 203.0748 293.3912]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 282.4872 296.3242 293.3912]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 267.8665 346.9078 277.7717]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 244.0065 194.2975 254.5369]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_baf335015f8c71026d2bee65ce4d109f) >>
+>> endobj
+7322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 205.1522 188.7586 215.6826]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_ea20a64dc7e9dd789fb069c7b8faca16) >>
+>> endobj
+7323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9531 165.9243 238.2027 176.8283]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.9423 165.9243 268.0804 176.8283]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >>
+>> endobj
+7325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7290 0 obj <<
+/D [7288 0 R /XYZ 90 757.9346 null]
+>> endobj
+7295 0 obj <<
+/D [7288 0 R /XYZ 90 615.4688 null]
+>> endobj
+7298 0 obj <<
+/D [7288 0 R /XYZ 90 576.6145 null]
+>> endobj
+7301 0 obj <<
+/D [7288 0 R /XYZ 90 537.7602 null]
+>> endobj
+7303 0 obj <<
+/D [7288 0 R /XYZ 90 498.9059 null]
+>> endobj
+7306 0 obj <<
+/D [7288 0 R /XYZ 90 460.0516 null]
+>> endobj
+7309 0 obj <<
+/D [7288 0 R /XYZ 90 421.1974 null]
+>> endobj
+7311 0 obj <<
+/D [7288 0 R /XYZ 90 382.3431 null]
+>> endobj
+7314 0 obj <<
+/D [7288 0 R /XYZ 90 301.4611 null]
+>> endobj
+7315 0 obj <<
+/D [7288 0 R /XYZ 90 301.4611 null]
+>> endobj
+7319 0 obj <<
+/D [7288 0 R /XYZ 90 262.7262 null]
+>> endobj
+7321 0 obj <<
+/D [7288 0 R /XYZ 90 223.872 null]
+>> endobj
+5593 0 obj <<
+/D [7288 0 R /XYZ 90 185.0177 null]
+>> endobj
+7287 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F52 345 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7330 0 obj <<
+/Length 3036      
+/Filter /FlateDecode
+>>
+stream
+x�՜]o����+t�J��� ��b��v
�Y�7�E�M�Ĩ#��w�}5"E�H�p<+�A."[��9�<��ጘq�'f�Ϝq,(mgo>^��{��_/���%|�,��x��5����vv�n�
+f���˷�̅`J/��s>�|��~\�~��|~s��������OW�mW��_���j�^m_����B������f�XJ���]���������7�Z:?�^-~�������v0FY����_��-
ԏ�����~�L� g/�T�닟/���t_���XN�P-I��qk�.)?l�֛�w�
s�4��t�
��!#���L+�qbs�����
�J��E͂����w�7����^�� !��t�t�����
޷�[�r�U�t��$�Fk�j�UVon��������E�Ӷ�����*�q�
&�:���fsw?h�r栟zm�LA�S.q�zK)˸1OEV&���h�k���ێG3' �\7g$�)3��M�&@�ьda408D�gD� ó���#g���=ڲ�@.�?jKH�xD߲�����̃-�M<ad`
�ˡ�h�����v�����u��z����:V��{���?]
�;MŨk�ij�W��$�
��
*��X
�&����̦�@g�gS�d
+;�4�m���+\泌�|p2�	wIW�k�<fUB
�	��(OZM��*�ye�G-.��h<b
�
�׋���n����g.��T����vuu��Ŏw��q��~���M����a�aP+���O�.�	�øm0<�ꠏ�0�(
�]����E���r)&�����0�·���9f%���G"��
+��0��<'%LÂ����`p:qw���D��� n5c��ڀA�b�A���^Ħ�:�~W��ݝ��1��8�5�^i<YE���]���M<[�?�.�
���v~���S��
�<��&X�g��y��8f��2�dr��A���~�j�UV�\p$�pza6�YEحuO�d��C��^�Y��A�F*(#���*��n�@�c�����L�Z�Z�=j��/��
p��4�ghY���Ȥ#.�I F�$��T�N&�]&S�n���Ʉ[�d*�6�	�Y�	5p SՓ4���[Ȅ��
I&,�P2�&�EI�
W��z�� n�$��01�3�U����e����(ig\9	�E

�I�E%���0)��%-�z��:'��Bv]��IF��8���������#Vdz
��Y_Zmd=b�d=j����'��Õ ͜����i�'=�7:��B1_m�V�]���0�qB)H*ʀ��n��
|^X3�vв
�lhNBғ
�q�$�x
+;�� ���0��;c
0�� ��:L!z!z���蟩5�����k�!�9'��pj	�g	�2�d�r�s��h�V����s�fs�@�yݓ#�2��]�S�[�a^��y>}�)�	�ø�w�`&���S�U�	�}�}m_������PX��P�d_�6=�}<
+� �p�d!�KZvsg��IF��8��������"Vdz��YXZmd!b�d!j��ª'�E���E
�� �E
4�E
�D^ĨLt���~ˑ�e!\kg�$10&���D���4�����B�3��&I�"�d�֒��֎A�'PИ���p��)�IV��
�

i��`���jx
7j�
�2�pw�f<����[��~K�;5Y����ad�����Q��#I%-��,"
x�wu���D�4�c�hcR�}�(`>}�i���X��j�<QYŬU�l4p�n*��1�h:��w��X�H��xB�V3"K�#��(!�<P��il����X�
&�Q��+)!���"<(嘳��+M��+��آ��2n���MBece��}9���H*ȉ�ޟ�B0o
��R�Ѱ,N�%�.òt7���eVQ&��eU�x6�
\�`|���xIz��a�jS�>�cJz�ೊj]�E�
��{P�lh>���

�.�U�V��!�
+*���7���2�esF��23�۸� �x::	Ѽ6�I8+��@7� 4jғOe
�ld����Sc�y�y\����(���Gss�.A��R�>۞��p�s�s>]%]<\E=]�edi*N.M����ܵ�&�jQ��4U&N���ц҄7?��X�Ѓ?�&��T��񁕦��ϥ�p0�;�4�i8�&�D.M�X�G(���������A\z�L*#�
$e�+�d~Fˑ�&Lz������${�O]�{,���G_#E
�r=g!�Оz�-��BT�^�pw���F"�jY�p��&�BT5�R���q[
v�E!�[υ�h!j<�C!�

�,DX�B��8�j
��N�!�b��2��$��
�{2��[��9�cy"Ȇ�
��2�e���&�%]�
ߘ�߄�����i|׍6�o~w�!��5��K<YE9����:�1r�YeUs��r0�ۈp�x��0�C�ע7�e.8O�ԭ�z�� n�2Tc��3�U���"��3�����]�s��}�	婌��� [...]
+5q(R�88��e�Q��f!�)������'��
$e .�U ���*�v8�1���dOy��S^�p!m�;�#�B8f��
!�2��#�].F����Z#�D.F�	�U��#��a�1�K at Q�p�Uc-F�98#�� ��b���(F��C1���9���bҢWCx�}m���
+ƒ`�O��
z��$��'���^�ݽ��"Tw���S~��l���k����/���
��1�>��q���ޭ�Z3ߧ��ͧ�u�9��s
��
��V9�����-�J�����3��u�&>c�7��R��f���
+��?Xѽ��<��������

؛;�isu�eW��oo��7�s��P�+_���$x��1����˻����f�
����
r8��7�
��2�\endstream
+endobj
+7329 0 obj <<
+/Type /Page
+/Contents 7330 0 R
+/Resources 7328 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7251 0 R
+/Annots [ 7333 0 R 7334 0 R 7335 0 R 7336 0 R 7337 0 R 7338 0 R 7339 0 R 7340 0 R 7341 0 R 7342 0 R 7343 0 R 7344 0 R 7345 0 R 7346 0 R 7347 0 R 7348 0 R 7349 0 R 7350 0 R 7351 0 R 7352 0 R 7353 0 R 7354 0 R 7355 0 R 7356 0 R 7357 0 R 7358 0 R 7359 0 R 7360 0 R 7361 0 R 7362 0 R 7363 0 R 7364 0 R 7365 0 R 7366 0 R 7367 0 R 7368 0 R 7369 0 R 7370 0 R 7371 0 R 7372 0 R 7373 0 R 7374 0 R 7375 0 R 7376 0 R 7377 0 R 7378 0 R 7379 0 R 7380 0 R 7381 0 R 7382 0 R 7383 0 R 7384 0 R 7385 0 R 7386  [...]
+>> endobj
+7333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.2473 191.16 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 697.2473 232.4646 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_62b7a88cefba86a6731c6b46487fc28a) >>
+>> endobj
+7335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.8018 697.2473 337.0514 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.2079 697.2473 460.4575 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.393 191.16 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.5575 658.393 232.3641 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_49574f120ec3f9fbfda58d6f826587e9) >>
+>> endobj
+7339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.3046 658.393 486.5541 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 619.5387 191.16 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.5575 619.5387 232.3641 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0308fb71a28c28f4e33aabfa9c5d3781) >>
+>> endobj
+7342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.5001 619.5387 336.7497 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 580.6844 191.16 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 580.6844 229.9641 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_72b6b45299672d85c7984392454296d6) >>
+>> endobj
+7345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.3013 580.6844 334.5509 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 541.8301 191.16 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 541.8301 229.9641 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_2e4d2efe88475a75dab18c7f9fe5e217) >>
+>> endobj
+7348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.3013 541.8301 334.5509 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [380.7074 541.8301 457.9569 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 502.9758 191.16 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 502.9758 229.9641 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_114f91c420cc8060d6834730c8e55721) >>
+>> endobj
+7352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.7798 502.9758 268.9674 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.7807 502.9758 313.9682 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 464.1215 191.16 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 464.1215 229.9641 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_41cdb256f546f09bd317deef44ac0009) >>
+>> endobj
+7356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2868 464.1215 484.5364 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 425.2672 191.16 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 425.2672 229.9641 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_b4396e8bfbdd5831fd37d13c19194cc4) >>
+>> endobj
+7359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.3013 425.2672 334.5509 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 386.4129 191.16 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6226 386.4129 231.7916 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_32a44c95ae4348ff889b48c309f9eab3) >>
+>> endobj
+7362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [408.9793 386.4129 486.2289 397.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 347.5586 191.16 358.4625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6226 347.5586 231.7916 358.4625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6ea3cf85efb71cf62fa3e233c9e9cf7b) >>
+>> endobj
+7365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.0577 347.5586 336.3073 358.4625]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 308.7043 191.16 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 308.7043 248.3249 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_2666c570468f53609bf420024a12628d) >>
+>> endobj
+7368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.1406 308.7043 329.3902 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.5467 308.7043 452.7962 319.6082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 269.85 191.16 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 269.85 248.3249 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_385e4d3cfe442f4fcbeefd9acf5c10eb) >>
+>> endobj
+7372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.1406 269.85 329.3902 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.0438 269.85 382.2314 280.754]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 230.9957 191.16 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 230.9957 248.3249 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_98b5ccd1157e6ec8beec7702af9acb36) >>
+>> endobj
+7376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.1406 230.9957 329.3902 241.8997]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 192.1414 191.16 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 192.1414 245.8244 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_80d43634ca26fd76dcb1fdede6363dc5) >>
+>> endobj
+7379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.6401 192.1414 326.8897 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [373.0461 192.1414 450.2957 203.0454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 153.2871 191.16 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 153.2871 245.8244 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_691b91bcd9b5c336892574e975235de5) >>
+>> endobj
+7383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.6401 153.2871 326.8897 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.5433 153.2871 379.7309 164.1911]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 114.4328 191.16 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 114.4328 245.8244 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_65766b549090f6b52281c99cfba9eed3) >>
+>> endobj
+7387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.6401 114.4328 326.8897 125.3368]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7331 0 obj <<
+/D [7329 0 R /XYZ 90 757.9346 null]
+>> endobj
+7332 0 obj <<
+/D [7329 0 R /XYZ 90 716.2211 null]
+>> endobj
+7328 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7407 0 obj <<
+/Length 2827      
+/Filter /FlateDecode
+>>
+stream
+x��[[s�~ׯ�K�C��&yH���4m][�t&�xV��b+��r%���=�@���
5���~{�����Y��0�'3�gJ(d�����}��F���_Ā�^�]��bf��Tήn
� A	�]��<'1~� ���s��E�P|x{N�|s������?�����|y��j]Շ�?m�s���n�ڬ�T����ݮ�|Wޖ��������s���/W?�}غ�&���ﳟ���ԏg1���>`D����3N��p���/�N{�y`�'���q�%<y�i�!,N4r�q��,����A����`x�
+6�
�[��h��{��ꣻ�.�E ��Yv
�a���>UޔL%�.*G�P7Y�ī~�S��нF� �3����7۲*�MeY\���<`
B	L�v(1f-�c�(�0�
��%��Qҁ��7�hbz1�
�+(����>��
���IqĨBJH�vC at eH0�������̦�=��]��u����U���\nֻ�Ce���

_���p�*i6��d�/��� �x|RP��՛El���3
����IA
���}S�3����Z;���
�����ui�׊,S��A�Ul
��� .<
�`a�4�>�;v$��0�)[@�
#����r���{��]o6c
`�4�b�K- 
/i�����b~�EF��x�
H�%�d�˯
8D
��P	u���7���]]��C����%aeS
�ϰ�[
�,|yHf��z�eT 
���T ��Q�Au�SV at G��szҨ�P�("�Nu]���
�NSWzNM:�(���5$P
�ʔFJi��������F�e���z��Dņ�9�&�`r&Bhİ�'��l���p�a�i�}Q�N�<��5��n$��6��c�a��M]�E���r�s_�_�6��C�p]�%�ַ�Ɔh
+��D�`Һ�к ˊ]�ţS�
;�받���$�<�6��Y�
ס�%��@A\�~UD��4NA�0�A
�)�BT���
�%зk����E�*����$�2���P�^�.��s)�_
Z��*>�	
��0��u#��N�	�!���kF��S�/$A��S�42��}�z���)�Ӿ
�������8g�E�SV3
�@�d���2
<]��삌�쎐���e<M5�xLu��'(�2�l<�xg�2�iv��g��
!�I�e<M �xL��x"���,5S��:C�ӒyM�xP��fHp���ټ�Wf�}��G6R��a�Ϻ��{���%�%��
� j�� �
+{l�daϰ���ž�z��g�z\�j^�S#aO7;� �jF�N�S������9��ԌI*AҮ�
	�4��]v�߬ �ńM�B��
��t����:���01���?���5�(v���6z
`/����z���zoQH�_RυA���;T^���N�$����#��0��<�3y�s����x������E<nx��')�
��	'D�b���A:
�#)OS����x9��V�&*�œ���PA���ay�
�.>ivA}bvG�O������(�~
��Z
���L��"�2�ݑ
�'�H)Iz�&�	
>ˠo7�O 2���
<*G��'H��&�0�#�9��'p�
���i��@K�_�'�#a7����DF��@k}�6G6R��a��N�bĆ@��ӫ���œ��⠾��F��,�����=���:��{�������q
���=E3��4���ݑ<�i
+�r�d��D����h
�NL6�
Rp��E at eH4Y)�c��vH0�z�>G``w�v�D�)�=�Q9v[A�^4$�
���$�U�m$T=�~������~��,2FȗTu� �y�-��
LT�e�
z
���ԋ�nm�M{m�b�ϱ�m�➛��
UFe<�Q���B�N���G�l"!��TL���
�Zo���x?Y�@��� �iyP��p���{�i(͐�K�RF�=>G``w���h+�U�����\D��m
�cv`́�r�E�[���P��>'E
􆜨�{)Iw(K���\�����݈�r
+ܕp"ڔ_��y�3�5�D���;��2���ha_��qE�͹D�ɘ�ʺX��:���ݲZm�J�*��
[� C85��O�x��oݱ���?˥����-����͠����&[�D�l��/��*�v'e}T��A
�l�	�e(P!��Lv)T�m�\���"v�/��A�(���ޞ�/��]Y�za�\�K걋�"mA�r�lD���BJ
xက�����#� ֜^��6�V��(
���}�Gʰ!�А�@P+��#��(��
���j����Y��4jL�_fF��Ȗ@��;Zz=Ң�j{x=2� r����
�a�v ��ʪ
�G%Ғ��щ�A�~�WMhqZl~�z(���w3���
�!7���������
|],�ƆHB�1�;ypxȘG;�Ҝv�g�����-'��e�\M�k;�>8U
2!�)�qa��R_����{��_�zv��V��H�q�5�D'���1�#C�I��RHYuvI�
iNϱx~�������c�.7���z�}Z����&v֪?�x�"F
W7
K8f`
�S��{C���M���ɝ����W���ψ�vN�,ِ;1JҼ�- ӢD�V�c� �B�t8�
�t��xU�ǒ������ʏS��G�4�]��~�뮬~ssۍ���cq�^�7�V��iY��a1��&v�
0<_�Ƶ��$l������_�!�Hv,�'�p�,}���wu����x~~F�
z\��Z����E��VAX�;���n=h���~��d�1�0k
6U�6��CQ�Ŝ �T�
Z�g�endstream
+endobj
+7406 0 obj <<
+/Type /Page
+/Contents 7407 0 R
+/Resources 7405 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7251 0 R
+/Annots [ 7409 0 R 7410 0 R 7411 0 R 7412 0 R 7413 0 R 7415 0 R 7416 0 R 7417 0 R 7418 0 R 7419 0 R 7420 0 R 7421 0 R 7422 0 R 7423 0 R 7424 0 R 7425 0 R 7426 0 R 7427 0 R 7428 0 R 7429 0 R 7430 0 R 7431 0 R 7432 0 R 7433 0 R 7434 0 R 7435 0 R 7436 0 R 7437 0 R 7438 0 R 7439 0 R 7440 0 R 7441 0 R 7443 0 R 7444 0 R ]
+>> endobj
+7409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 191.16 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.8996 719.9123 247.6875 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0dddfc1f0ff6f55a90c4ea8829b9752b) >>
+>> endobj
+7411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.5031 719.9123 328.7527 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 681.058 226.0342 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_37de3f55cf5e917e32f7f2f9c6d34840) >>
+>> endobj
+7413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 681.058 398.4255 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 573.0168 191.16 583.9208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 573.0168 232.4646 583.9208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_4d372c4dff7d328d3da118817ed3d8b7) >>
+>> endobj
+7417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.2803 573.0168 271.4679 583.9208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.2812 573.0168 316.4687 583.9208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 534.1625 191.16 545.0665]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 534.1625 232.4646 545.0665]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_9dd6ce1cb02b58fd3b973e40867362ac) >>
+>> endobj
+7421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.2803 534.1625 271.4679 545.0665]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.8027 534.1625 382.0523 545.0665]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 495.3082 191.16 506.2122]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 495.3082 232.4646 506.2122]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_f5bbfb14fef626aee9f34e71a78c0d7d) >>
+>> endobj
+7425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.8018 495.3082 337.0514 506.2122]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.705 495.3082 389.8926 506.2122]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 456.4539 191.16 467.3579]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 456.4539 232.4646 467.3579]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_920af28903c20a4a4962761b834d577f) >>
+>> endobj
+7429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.8018 456.4539 337.0514 467.3579]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7430 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 417.5996 191.16 428.5036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 417.5996 229.9641 428.5036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_9075dd07574234cc124e6076c272e987) >>
+>> endobj
+7432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.7798 417.5996 268.9674 428.5036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7433 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [302.3022 417.5996 379.5518 428.5036]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 378.7453 191.16 389.6493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7435 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6581 378.7453 229.9641 389.6493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_8d443d5098921978efd7b625000f3b68) >>
+>> endobj
+7436 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.3013 378.7453 334.5509 389.6493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7437 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [352.2045 378.7453 387.3921 389.6493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7438 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.91 339.891 156.2759 350.795]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_3fc6b9758fbac86e0592d37c23f14b1e) >>
+>> endobj
+7439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0863 339.891 348.4182 350.795]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7440 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.6203 339.891 513.9963 350.795]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7441 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 327.9359 160.1764 338.8398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 227.8649 255.0692 238.7688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7408 0 obj <<
+/D [7406 0 R /XYZ 90 757.9346 null]
+>> endobj
+7414 0 obj <<
+/D [7406 0 R /XYZ 90 619.2693 null]
+>> endobj
+7442 0 obj <<
+/D [7406 0 R /XYZ 90 290.6158 null]
+>> endobj
+7405 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F11 416 0 R /F10 488 0 R /F13 577 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7456 0 obj <<
+/Length 3416      
+/Filter /FlateDecode
+>>
+stream
+x��ZY���~�_�'��Dh�cUJ���I)��/�K�%�]�$@��wW�>�s�p�+_�T�fzzzz��z0tB�G'�L�ԅ�BM�
2���.h�C�|H���ŋ/����*�&W+�A�B2�&W˷SJ
.fsJ���Q2-�M��͌�i�~���]����+����o�*�w��݌�i���m3�3I������?~[�*��,*dʹ�2#g?^}}����6,FrEQ��o$�%,��
Rpk��^HA�e�ͅ`<��/���g��w�9�H�3J�l��
�$wJ���h1�fTNa�~�;�Xv��߆��rW/��]�Wm`��~ �5us����Z �}W��>���HRU�
^
���¼?��z_W�4r���ST5�~�k��nQe�b��7USu��v�}0'�ͷs�fڕ�мm��0�g�X�����x
+���ͅ��O}��^��]���*v5�}P+���?(�
+���0A��f�\/Ìe�NoѠϙ ӟ��j�qsr�Ѿ�V��n<
�}�h�z���]�v�]���$�6@�M �n_v�~��k7��FNad�T�<�pH�^��Z��3�B�q���qa@��nFA���[Qa
+I��(��]��
+��nͷ������Nr��~F)��kP�XC
M��2rО�)�,�f2��U�y[�fLN�t�헳�$���5 at OY�������N��u�X����@��zn�^��`4*:�����HQ.����A
�����m6����\}81p+��9�fzW����B��n�}�]׋�sG��@�_O�\xC�B+A����:�.�M��'�

+�K���S��du��#-C�A����7��o
�`�@�q� ��8�A�>n@�B�
v. �ַ�>�k�o�X�[t��a
� 
<M�4e&_)�m�
��Ka
�f3NO�An�V�f{Q :�X�1��F���qʑ��&q.2K�Df�p���d
+`lX?򾨗�a0/<��y�r��s?��m�Ue��t�
��>R�V�a,�rC߉�x��0Ex��
��
�#S�
'�����b�O�5z"�.43"�O�h>�:�i��p�T�p�f}}_��4��
+�aO���:�9
�z)�ؓ��W�qV�zݢJ�|���E�
��O��` b�y_�E�� ��<X���m���F�`�l�>@{D�@ �ON�	O��=5�Cv!��$	�d��R股q��g� ƦTd܄�#X��MH��~'z+&��L �b���x�)�k�<op�N
�1����;�	ub��3�Ց����#&$EЈ��+��b�
0�Ch�B��v]��$����s���!�R"΍H����/3*�S	jg
+"	#�@�c�i�@\���Ӈa�#�DwLa��i��q��
+V(!��n���-�d�m!��!U+��
�3{���_�
���-���YY2+��>��Yy2뇗?}��d�	�V*0��x���^�*�����<k��J%hj��h�h{Ԃ9��
�P��A�\��1F�S&��F
,�C��b�
+�{
y,@���'ٌ��q4>�"�T���)�#��: �]Na�� Uj̘���� įwm�r��)3̲j�; �
��'�t�nN_x�� Ц��ʣ;eX�� ���G�}W;�e��0(@����a$�W�2��1�!`5�X��m�A�a��|<g��b����O�
+θ>w�-�ž
����E�6�.\�ዯ�XL +ˆl
���Ξ�QK�;��~fٰ0x�M\�ʂI���ZD!=L�4g9�Ĩ^}[7��3��@S&|����� 
;�Y�&�H��W���'�3� *i��?�TBz����P
+�=ُ4�;W
R`����E�u\���ď�ߑ�)��=�����r]57��wUׁu����6���4��G�3������W�����H��g&�K�H�m�H��gV�P��an;�ې� S�`�nQU˓c2� ��t�g
�H|bI�K9fS��妼7� �qL�N��Sɻ^�v
�� Ɓ�	��D�l����N7�[�,� KE�Zi8����1�PY;,�W"9���΢>��JJ ��h<�_*)
o���mu�gt�>#�L�
C%�CB�"Q�8>B�2T��D|D�]YF� �� Ơ\&
���X��
+6�0����2X�_��)bOD*X\,�a� ށ9�BZ���d�`q�~�%u�@�+�P
C�{��җ�Ӫ^HT�/�X��\h�T��̡6��OV�2b�7&2z�;? d*�b�1��;3!� ��P�6��p��D��
���`�l��I�Fk��z�������!�s
FF����
�@���ɩ
�s��
���h
r������h1�VHPu��S�Z������t�Y
�j�Ȥib�Z��23F��!�O3�S���I
HU�(��SG>AW�[W���
��
4�N�h-s�Bk5
5�yg��Y��j_U�߾��Q᫔��j�F �
SŜk2�k��B�ޑ�T)m���*���߳�;�~L��;��Kю�~I�Cu̱�x�����뙔�B�M��P��h�
+!��6M�e� ���a�+��R�i�9��a)x��Qc)*e��l�[�?{1A{�5���[����ko� �Mp
�Σ�K}ࢪ0��3�io
�>��c�C��BW��
ޒG�us��{Tl�$B�w,`2����w,z����<DqVV�"�:0i�}�s
�M��E������!�#h/^? t4VA
+� ��t�)�3�D�
+�5N
�, Q–(�	��!��h8΄�2� ��#pH�\+
+E`~ʠFӆ̅#��9{�h�s�Y��*]�U��\���,�	��fr�ԥP�J9L����_��2�.��s�,�

G�A_v�/��+�V��-OR�P����0�&*?
�f��S�����{�O(�a8T�Ŝ�M��\.
(�����h�Ox��
D�-	8ـ
-�!���q���+�kV�ͻ:���V�v
-9��A��/Y�9w�����-{/
�a�$	�K0`<ʼnk);i8�?����)d(�����IU�����N����Qa�玙2Û{<\ ��nn�M�Ѿ=�BMPu��o��K5��pM���U��j�N�5”��3��H�#�-����aA>�B�I>n�|�|l���܄GX
+E�S��,��
+7,�7
�qП�9(�Jߌ
}�WK��9[���Ч��ӵ9��LZ�_z�
��H� �̉Yv�n?I��ɳ�l	h�*�~�E^o��Z:<�<��@��R�\7"��!�
�׿�kWu�����
�Gl�U�
O�@T[�t��
+��]ur	�����Z�?M����,�F�S�A��u_(����www�bW��l��޿�n�/�r	��i����{�Y�
 �$&�e?�mڮ���q�>���^�Έ��q�endstream
+endobj
+7455 0 obj <<
+/Type /Page
+/Contents 7456 0 R
+/Resources 7454 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7251 0 R
+/Annots [ 7458 0 R 7459 0 R 7462 0 R 7463 0 R 7466 0 R ]
+>> endobj
+7458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.5215 684.0467 182.7091 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 648.1812 124.1913 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5417 340.1669 513.9963 371.1356]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 328.8344 232.2465 338.7321]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7457 0 obj <<
+/D [7455 0 R /XYZ 90 757.9346 null]
+>> endobj
+7460 0 obj <<
+/D [7455 0 R /XYZ 90 456.4242 null]
+>> endobj
+7284 0 obj <<
+/D [7455 0 R /XYZ 90 434.1125 null]
+>> endobj
+7461 0 obj <<
+/D [7455 0 R /XYZ 90 434.1125 null]
+>> endobj
+7285 0 obj <<
+/D [7455 0 R /XYZ 90 321.7642 null]
+>> endobj
+7464 0 obj <<
+/D [7455 0 R /XYZ 90 307.5352 null]
+>> endobj
+7286 0 obj <<
+/D [7455 0 R /XYZ 250.0186 218.2993 null]
+>> endobj
+7465 0 obj <<
+/D [7455 0 R /XYZ 90 201.9135 null]
+>> endobj
+7326 0 obj <<
+/D [7455 0 R /XYZ 118.1641 89.4414 null]
+>> endobj
+7454 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F8 568 0 R /F11 416 0 R /F25 348 0 R /F97 1774 0 R /F1 583 0 R /F10 488 0 R /F13 577 0 R /F7 574 0 R /F6 565 0 R /F9 602 0 R /F12 664 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7469 0 obj <<
+/Length 2030      
+/Filter /FlateDecode
+>>
+stream
+x��ZMs�6��W�jB�N尙d�j���$�^f�\�D۬H����3�~H�,Kk;�!�I
+h4^?�n�$	�?��(��a\&��
'7�����3�=
|w1;{#Eb��T&םI���&�)!��yF0���9�iެ���s��z��X6��O�U�7_��*�"o.��i�D��v[��<���W�v�.)�
�{�(�i�tJ���x7��b��OF0I����}���%L��
#f�H��#b
M�3NY���:�y��~�:�0�

+eK�v� ��̃x!x�,𢮶mw/ҷM���,F�v
!H��ۢ*����?l��7F�0r����p�Z��ȑ� �k c�&��jJ�o���Y�����
+4���O����ww�jiY�U���B������s�٢n�~SW˲�q]���t����}�)'�+2���]�8������;��˪�~���M�.ڢٺ����)L��,�T��ʭ�)��0
� ���U�EQխ�Xԛ�X��!�
��zo�Y�SaR�	
{5���0�#@C���#4�=��gpס��D"���I�@�a���AO��\�B�
#ct��t�C�ቔV�RǬy�(�G�}6X�B���
́� BF�@�;��b�'
q&D��X�R����r���o"p��0�2 
�&��L��
.����fZ����/ 3�7!{�s�4��@`�
ļ7��#�8�b
r�PDAF�w��
i�ml$�"}]�H at 6h��vK͕��^��u5(�S�rQ�k ca\��Q�}l�`$,�
���fc��P����8��D�J�x2����(C�
��

+�ӽ�oqL9�uVBK������pT�x�/#�`)i����1i���3�CctK���Q�eu[�k�@3&�~��[լ� �̯�U}�t��b�\�e,x�kz��u�}W
|��0�$_�xFa�p5*/�˔�Ȱ�����ꦹ��H��(��J�^Z��� ��:��G� &B=PR��iIa���O!�J���d�#'{ذ���@O#���I&�t F�y1Z8ږ�JMܘ�&�zH��"թ9�Ҙ����i�	���0�G�p���3	���L�l	�G�^�"
@�h^�[Q�n��*

�����R\G
A �g�:V*���c8�
�qJ��&�5�3,hi
l�}.�+!�ţ��/m���\�0D����s9���	[*�9�*JH�2��I��|
�Ee�E�ϡo����D��n��
E���7o�E;����ݺ�ڼ�ܲY��]���}D�
~h���{�n��kot�e^j ��a1��
�K��rxDWa��1=� (�� �]��O���]S���c
h [...]
�p_{s{�yjD�ؙa�v�]��[��E�$�SƟ�uJ�=���JI͎�\Ă �V��p�4�"�8v����6���n�l*=D�t������
�n��aҟ>ᄁT�^\�̷����݌{�͙J3�(�8�9�9nC��)
+��XJ5>�=9�ݳ,�	����=M�t��x���81J�qꏐ}�l���q҈)vR�#�P�X`�9I�|��3*G�����*���X��+z����k[��&�o]����4o��jw
+�3lP�O�$
�����&�������Hrq�˶�r��sƧ�rƃ�c(N�"
(d�����ܐxO�$��TK��8�4��1S�W$�sz��	�1���+�'��
8�� �0m�
v��I%t�bH�1dxE.�['��Y=��-��m���_��O�N����-���B�> �ʫ�|�SGw���x�b
U��3�*8��(�^
�#hA�%���I�c�Z��=�w�S��];�۶ݜ����ߣ��U�Ae{�٬Φ~q����
�^64��e?�I�b2����b]7>
e��)�
��%W�b巪endstream
+endobj
+7468 0 obj <<
+/Type /Page
+/Contents 7469 0 R
+/Resources 7467 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7482 0 R
+/Annots [ 7481 0 R ]
+>> endobj
+7481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7470 0 obj <<
+/D [7468 0 R /XYZ 90 757.9346 null]
+>> endobj
+7471 0 obj <<
+/D [7468 0 R /XYZ 90 733.028 null]
+>> endobj
+7327 0 obj <<
+/D [7468 0 R /XYZ 291.1237 651.9511 null]
+>> endobj
+7472 0 obj <<
+/D [7468 0 R /XYZ 90 635.224 null]
+>> endobj
+7473 0 obj <<
+/D [7468 0 R /XYZ 90 545.9275 null]
+>> endobj
+7389 0 obj <<
+/D [7468 0 R /XYZ 90 521.5585 null]
+>> endobj
+7474 0 obj <<
+/D [7468 0 R /XYZ 90 521.5585 null]
+>> endobj
+7390 0 obj <<
+/D [7468 0 R /XYZ 90 472.3172 null]
+>> endobj
+7475 0 obj <<
+/D [7468 0 R /XYZ 90 457.7469 null]
+>> endobj
+7391 0 obj <<
+/D [7468 0 R /XYZ 90 410.543 null]
+>> endobj
+7476 0 obj <<
+/D [7468 0 R /XYZ 90 395.9727 null]
+>> endobj
+7392 0 obj <<
+/D [7468 0 R /XYZ 90 348.7688 null]
+>> endobj
+7477 0 obj <<
+/D [7468 0 R /XYZ 90 334.1985 null]
+>> endobj
+7393 0 obj <<
+/D [7468 0 R /XYZ 90 298.9498 null]
+>> endobj
+7478 0 obj <<
+/D [7468 0 R /XYZ 90 284.3795 null]
+>> endobj
+7394 0 obj <<
+/D [7468 0 R /XYZ 90 237.1755 null]
+>> endobj
+7479 0 obj <<
+/D [7468 0 R /XYZ 90 222.6052 null]
+>> endobj
+7395 0 obj <<
+/D [7468 0 R /XYZ 90 187.3565 null]
+>> endobj
+7480 0 obj <<
+/D [7468 0 R /XYZ 90 172.7862 null]
+>> endobj
+7396 0 obj <<
+/D [7468 0 R /XYZ 90 125.5823 null]
+>> endobj
+7467 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R /F8 568 0 R /F10 488 0 R /F6 565 0 R /F9 602 0 R /F12 664 0 R /F7 574 0 R /F1 583 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7485 0 obj <<
+/Length 1644      
+/Filter /FlateDecode
+>>
+stream
+x��Zێ�6}�W評������ )�&@�l���b˻F��+;���;��Ҋ��I6٠�>�.����p�� �4�R˅
+�W\���&P���}�6��|r�D����
+Η�D2`���u@��b���/"�a�_%���f��2]�����]�䟦�g�,M����<���j�E1�4|�Nv���e�L���<u��6!3:z{�t���A[
Fr�?��oi��A=�P­��5�Pֲ�j"�o֓W�??勢�/&�)Aa�P%�!(�S�ȸ9��f���~�G\�q��
�t��v{w�����_�ŋnT��
���[��5D*mqTZ�t�
����/Q��	m��J�|�f��>OV��tZ ���Gsʈ�..8R+%�KP��c��Żh�y I�P��� C�M�
�j����2G�����d-�XZ�
��(&Da�2ݿϳ�l�˴�Xa.��d��UE���%tC����L=���CC
�F��A���
�'T1p�a��B��u�g��'�=��p���AS�)��LP� �(��a��}NaHI�Ub�"p`- ��jŸQU��*A^���e�|9ȷ��
�ͩk�	���D�f,�#�f��0�5�m7��Xg�K��OY�Üel���0K�0g5a��e+�8����
��4F~ �P�+	���:��ϧ�/"lv�����8E��y��a��1�h��
\*�b
��*T��[5���(�b
+EN�r^�ci0�&Gʎ��_�cz
+�γb
�N�+XȺ>�x�I��hx|��d�J��E=�վ��ӅR�FQVS6 at dLCX�1�~&���[��_���~����*�ا���S"��"�p��Jޭ��O�0T��Ø�AZ�Sh�;!PF}w}9���<�/�$�15 ۜl�ߌ�E�RG �OH���6��V�
���?��ND`u/5�<��1»�;qSI4g�����5��������/��u�]�/gi��ʥFD�i}0�UD7�9��q~�o"�\^��"t�Z����{��&�|�X]�YU���f�c(�j����p+z8���t��9|�,q�;z�&��L^��P�{����P��T���ӫ�c����T�n,3kb�]�8ڣ`
���,����;��U�6�Ob�ۀ>i\b���~'��}¡�'���O8�g�º!;*Qy�CM���F���1��E!�'E�'T at buI�+TĈP)��VZ�p�a�jH����iԻ��Q٭[�<��n�vk�G$;n:�M-�
�v��U��͸�>zf�J�~o��\-R�����J�!��m 
+��-���j[���v4�%&'^
����������qG��j�mu\m�E+��d���|@m�P��vcv;�=�������@mwG?������N���E�
�ڍ̀�.m>Sd���L!���%t�j� �h�K�Hj�mT���l�
��?v��_��w-�4��Iɽ�xS���W���ŧ�`���̩��G�D�2��z��}EP�֟��շ�͟�4�9�2���<��'�L��\��A
!T��ϴ���4|����b4������A}�{+��
�V�:K
����~��o�gg���d�#��6'���v�>��K��2͇f/n�zX:�Xe����e�����&��c��ë��
�ܧ
(�,�\�endstream
+endobj
+7484 0 obj <<
+/Type /Page
+/Contents 7485 0 R
+/Resources 7483 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7482 0 R
+/Annots [ 7492 0 R 7493 0 R 7497 0 R 7498 0 R 7500 0 R ]
+>> endobj
+7492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5417 409.9925 513.9963 440.9612]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7493 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 398.66 232.2465 408.5577]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5417 169.702 513.9963 200.6707]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 158.3695 232.2465 168.2673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >>
+>> endobj
+7500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7486 0 obj <<
+/D [7484 0 R /XYZ 90 757.9346 null]
+>> endobj
+7487 0 obj <<
+/D [7484 0 R /XYZ 90 733.028 null]
+>> endobj
+7397 0 obj <<
+/D [7484 0 R /XYZ 90 691.329 null]
+>> endobj
+7488 0 obj <<
+/D [7484 0 R /XYZ 90 676.8011 null]
+>> endobj
+7398 0 obj <<
+/D [7484 0 R /XYZ 90 629.5972 null]
+>> endobj
+7489 0 obj <<
+/D [7484 0 R /XYZ 90 615.0694 null]
+>> endobj
+7399 0 obj <<
+/D [7484 0 R /XYZ 90 567.8655 null]
+>> endobj
+7490 0 obj <<
+/D [7484 0 R /XYZ 90 553.3376 null]
+>> endobj
+7400 0 obj <<
+/D [7484 0 R /XYZ 90 506.1337 null]
+>> endobj
+7491 0 obj <<
+/D [7484 0 R /XYZ 90 491.6059 null]
+>> endobj
+7401 0 obj <<
+/D [7484 0 R /XYZ 90 389.9295 null]
+>> endobj
+7494 0 obj <<
+/D [7484 0 R /XYZ 90 375.4016 null]
+>> endobj
+7402 0 obj <<
+/D [7484 0 R /XYZ 90 327.575 null]
+>> endobj
+7495 0 obj <<
+/D [7484 0 R /XYZ 90 313.0472 null]
+>> endobj
+7403 0 obj <<
+/D [7484 0 R /XYZ 90 265.8433 null]
+>> endobj
+7496 0 obj <<
+/D [7484 0 R /XYZ 90 251.3154 null]
+>> endobj
+7404 0 obj <<
+/D [7484 0 R /XYZ 90 149.639 null]
+>> endobj
+7499 0 obj <<
+/D [7484 0 R /XYZ 90 135.1112 null]
+>> endobj
+7445 0 obj <<
+/D [7484 0 R /XYZ 90 87.2846 null]
+>> endobj
+7483 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7504 0 obj <<
+/Length 1544      
+/Filter /FlateDecode
+>>
+stream
+x��Y�n�F}�W(�RH���EH
�AR$MP7q��#�6Q�T(�J���%�)/E٩�l^�s;gfv�d�ᇌ

+��a\�g�
_��_F�~
��������3)�I��⪔ 	�����m@bb�qp>!8��ety>�8��o�y
]�L>�Q�y:}����<�
d�rR��'�h��._�Wq�:Ng1�T�j=y�b���vC0I��Go���
�y1ˆ-�[���C�����,FoF�7r���hŽ	eK��pp�QuL^&i
�O?�*���$K'!�8���!A����r���3ږN�@؀h\
+�1�Vul��h���P	}�ީ�� �+�W� �Œj���Y���� n�^��$TTO��
+̣�$N��"��b=�βt]\�V�8d�"i%�$#)���҆��Mܮ����c� . �.L��k:��)q��������j�����0�Y�B�r^�
�<�yZ���Ţ
qu
O� �b�Q%H׏�q�=p��(����1���D鼲r,�v�'E�G�/%��
�d� y�!�[R��B�q�M]'Ǻ�O�ٺ���� H�l^H���v$%��w&<~챁i�";N�>mw	� �)wTY{�3��h� �%�+�{ҾO!�P�>:�z(
rb���c���,�mS�659��
���kW���Gխ�ω��;��'@�B����G�%6
H�*
��
���{Օ<^DE�/,�$�1.��D�嶯,����#�S��J{�1�
h�e����
n�e�0Lރ�(��V�s��J!
@
�U��цI�#����_�Mo�GІ�І<�6
��� ۍ
+�� �1j��`�ı4���fp2Ț�S��6�X#~������~���>�F�a[@B9��*�����ѭ�SAh
�S�������v
+j�@o�I��(�0����e�����ev�!�ƚ~u�F��y�O
�`�
2��n�θ>��׬�	
+���X�
d��s�s�t�9��`�T��AU��јH�m���,G�X}
��˜� �\N}� s4��3�
S�DZCɯz�0n�ƾ�Elxw%���K	a�zכU<K�E�w����la�3w*���:QR�ٵ�*dR��������}��6�8-��	�U���H��톕����:Nmʼn�i�U�-���*[,�	�6I�݆�E<�L7�g4�Ҷ�SɎ�Kę�;9%j`O���
�ج�K���
�����4�jk���H�:�H�; #7ը��W�'[�
��Ӣ���q��*V��L���y�]��r����K����{c�o�t���cϨ��������@ś
ҎuG��*���=���N�1"R�/�����e%���#��3]ӝ��<���$�o

�>��Bu��:��WQ��;�nKX�]9S1�5�,��8��M
�LJj���v�T��k�~�9�|�����Z.ߑk
�)����l�ݢ�m�d���8l����Cf*v��YtǖN��
�+�;�45p��5
I
+�e�D����xL�ą�endstream
+endobj
+7503 0 obj <<
+/Type /Page
+/Contents 7504 0 R
+/Resources 7502 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7482 0 R
+/Annots [ 7515 0 R ]
+>> endobj
+7515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7505 0 obj <<
+/D [7503 0 R /XYZ 90 757.9346 null]
+>> endobj
+7506 0 obj <<
+/D [7503 0 R /XYZ 90 733.028 null]
+>> endobj
+7446 0 obj <<
+/D [7503 0 R /XYZ 90 691.329 null]
+>> endobj
+7507 0 obj <<
+/D [7503 0 R /XYZ 90 676.7587 null]
+>> endobj
+7447 0 obj <<
+/D [7503 0 R /XYZ 90 629.5548 null]
+>> endobj
+7508 0 obj <<
+/D [7503 0 R /XYZ 90 614.9845 null]
+>> endobj
+7448 0 obj <<
+/D [7503 0 R /XYZ 90 579.7357 null]
+>> endobj
+7509 0 obj <<
+/D [7503 0 R /XYZ 90 565.1654 null]
+>> endobj
+7449 0 obj <<
+/D [7503 0 R /XYZ 90 517.9615 null]
+>> endobj
+7510 0 obj <<
+/D [7503 0 R /XYZ 90 503.3912 null]
+>> endobj
+7450 0 obj <<
+/D [7503 0 R /XYZ 90 456.1873 null]
+>> endobj
+7511 0 obj <<
+/D [7503 0 R /XYZ 90 441.617 null]
+>> endobj
+7451 0 obj <<
+/D [7503 0 R /XYZ 90 406.3683 null]
+>> endobj
+7512 0 obj <<
+/D [7503 0 R /XYZ 90 391.798 null]
+>> endobj
+7452 0 obj <<
+/D [7503 0 R /XYZ 90 344.5941 null]
+>> endobj
+7513 0 obj <<
+/D [7503 0 R /XYZ 90 330.0238 null]
+>> endobj
+7453 0 obj <<
+/D [7503 0 R /XYZ 90 282.8199 null]
+>> endobj
+7514 0 obj <<
+/D [7503 0 R /XYZ 90 268.2496 null]
+>> endobj
+1504 0 obj <<
+/D [7503 0 R /XYZ 90 169.8567 null]
+>> endobj
+274 0 obj <<
+/D [7503 0 R /XYZ 90 163.2565 null]
+>> endobj
+7502 0 obj <<
+/Font << /F65 361 0 R /F25 348 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7518 0 obj <<
+/Length 2645      
+/Filter /FlateDecode
+>>
+stream
+x��ZYs�~ׯ�CV-!܇��{8��*���T*��jD����!)9�_��
 b�a�jb?��itht7>`@&����%2���b}�'��/gĽ���y,�����k)&I���� 	��������lN0����Ӭ\g��3�����|Yf�?weV>_\\]^�^�3��ۻU��ͩ��oV�nW��)�ϫ��f��RJ5�Rmf?�|��M��!�$�dz�?�����F�h1�c�d}�)���7gz�U�>o�z�!h�
�!,����v���e�/��zP�"{_fn��۲���W��T��o�X#"0����L��
i�L,Ӗ��h"�2���	E�����w�a��5�_���[p���O�1D��H�C�h�	���x�	"%0���ǻU���v3S|����z��
E�+q�l,НK�%�L�
k�
��m�`�Ea�-��]��l��� ���ˑ�f�/�b��}�|��qq�����>�h��ja��#%[���)��H�:-�a�$8SÞ��"���q���}RDB
B��~gS��M�9W
+i�I��0�+gS��2z�� ^�n�>�e�"۵Rv���,gLM�l9�nV�u�
��{/��?�
U
�<:���
�tSl޷���lW@�-�8��������V.%��Г���MM� �Լ��w�����–��4�*A�@�
�%��J��qsq
H���	h!�#hQ)� T�vJ>�p
��CZ��W��]�)�����#��)�-����X�
��m�V���a}��
>
���!F�n����X�0kQ�d�u
Ԛ f�}�X��.�3��e�Td+�F�����r�E͔�f<���V�?�� >ӂ���� ���cK&d�p`��
TLْ
%[��>_?��}m�a�9t�
+q�%X���%*%�r�_~7�����M�Ff�$���7 �|��9Qe�e&���3M G
M¼�j����a
� /�D��;��`��
� H%P�!� ������6\�Qѩ]��ݾ�ʦ�ߩ�X�	:�IH\6:p�|uW�E��!v"E��z���!��G�� �@�!�%��&���>ͨ�휿z�ÕF�h3�9A>��������Yy;�(����=#�*2B�;����P�;y�
���vd��R�X�'�����A[���//
������rk�Ү�_u��
1,[�vN>���B��a_��ߪ-���v�IN�'L�a?��1��'k�X�ݗW��uyu��WU��\���A~`y.�O�g~��^,�\�i%�+�	lC�	��S�y��w�=6�
B5��-�b�Z�K6�e�j`�1�	's_�u6�M���s{Ѻy{_��lt�h���Z �<u�5��9�)
� �M�go�a�KPJ�����18`T9��Ql�Fx�U�T�����$��ICa�P��10C`
~�a��T=ž�mzz|�
�!Y��n}�l]4��d�e�teOmu�R�mB#J��qjN+7bXpL���v��fW?��� 7-���[`P6�g�X<�=`��F�V“���C��A��
L�;����Η�Co����:�j���X����z� >e��ܪ9N�1���AzM!4 �S�� ��ױ�z�g��^7��.�5:�����:�0@���Xz�r�^'�+�'͚���5��B�v��O"h�
C�a&`v}�(�������WDZP
��C����6�B1s
E�pP���u]�O ��H�q���i�bd�{A*�

+�G�@�<��Y���bq��&H$,#�kv�@s��?/?�;��_G�(I�}�j�i���J����
+�5A|>��ꆨ��� �A��$��N"'����H$���'X��_RH�"+#
i[��H�*��ȣ�R �̗$OD@��$E��X�<E
+O�Z�@�F�n� �a���*�rNр
�悷�
w��O!��
C4 >�]a�|�lɔ�Vv@�*����s�B�h6�
A>����Pp�����w��
�(I��G�T
+信�5'/�!�p �S3�#A>��w���6�Q����8+5'��A�	[7���Q��G�����:�
v��Q[Xڡⅆ0���@������I_�b
)�5��IVHAC� �O���#H�y� )�$Ճ�"a�>$��&���P�rjAˬί����;Y&�D8h�tD*o�5�<Бyu:�k� }A^�����%D��LAbBp5�M���$1��LL�\�b22"&	��*C�7P^{�
�a	7�e�xyu�	

�	P�%��@�JYIN[�_<�QUNqR
�t
�Q/V�9����d�?�}x��5�qa�C�e�x.�
�`*�d.ڻ�\�T.z�t.F
+O��6:*zs��3
NX–-i_��� B
�<H�
�	���6D1x�6܈c�N��H�P�z1���|\\j�8'�
��y�UoXbp�B�ty��m	��
�G3�,p�h
�}��'��{���Gw
�~��./�0b�.,]e�GQ�N�U����|T
̘*;�h6gO���}�V��x���귿����j��0�z��U4�^;��������O��b�
7�C�������{����R��չ��:X�簡�>��X�m������)h\W��ez��x=�[endstream
+endobj
+7517 0 obj <<
+/Type /Page
+/Contents 7518 0 R
+/Resources 7516 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7482 0 R
+/Annots [ 7522 0 R 7524 0 R 7525 0 R 7526 0 R 7527 0 R 7528 0 R 7529 0 R 7530 0 R 7531 0 R 7532 0 R 7533 0 R 7534 0 R 7535 0 R 7536 0 R 7537 0 R 7538 0 R 7539 0 R 7540 0 R 7542 0 R 7543 0 R 7545 0 R 7546 0 R ]
+>> endobj
+7501 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1MIP__Problem__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 7547 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 560.00000000 212.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 7548 0 R
+>>/Font << /R9 7549 0 R>>
+>>
+/Length 7550 0 R
+/Filter /FlateDecode
+>>
+stream
+x��VMo�0
��W�
���dI=(�-�6�.�`��Ӻ���I������i��\G4%R��g�I�O7�+���ˇ� -	�7xK���]	^�R��!�eS����۠���
̓H��_�hx4ik4m�hv�s~������ƕ�2B����x
�d�&*��p0�ćA�Ty6�g
�I�g��}�7..n��AS�ϊ���I\��mw:l�ۓA0�F�;է�hUB"��	�M���u��e����&��E�u���
) �
)���"�J�,cC���ꈰh,LL8l

 j`d5N�-���	����[�*���a5�8���=A3�9^Op����.	�ޤ�t���~�/W��Y ; D
Y%��"�����IcA����ې��qa�Q�xZ�,a?;�p��s��B�8����A��"�ch��[4u6)�lQ��U�`�?QP!X+!��dc�xV/_�bs�6-�
+a�)w(O�$9 at Mfoٸ.�E�d��M�\�����1i ̙�A��	����?'Z?�;��t.g�w��`��3�匲6�il�+狗UV�?eӗ�xu*N��aͭ�Q+�̊oĊ=�BO��*Wώ�I�ɍ��@����!V��J�(o�P�����`�y�
j�P�@��0�j)}�����O�ٰX�F
_E��<��2%�#�D�6���²�1�ܴ���

����)2-�yƵ|@���ʶ�x�͠�
��TQq��?O-���=�kdo�?�k%endstream
+endobj
+7547 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142737)
+/ModDate (D:20080908142737)
+>>
+endobj
+7548 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+7549 0 obj
+<<
+/BaseFont /QOIKJY#2BFreeSans
+/FontDescriptor 7551 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 667 0 778 0 278 0 0 556 833 0 0 667 0 0 667 0 0 667 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 222 0 222 833 556 556 556 0 333 500 278 556 500 0 500 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+7550 0 obj
+732
+endobj
+7551 0 obj
+<<
+/Type /FontDescriptor
+/FontName /QOIKJY#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 7552 0 R
+>>
+endobj
+7552 0 obj
+<<
+/Length1 57088
+/Filter /FlateDecode
+/Length 7553 0 R
+>>
+stream
+x������:�OE�����f2���g�
b��
����dM���{��{���;*��{��d�;�	���}�ᇜ3g����|y A!4�:u�D��������S{o�/�~k3� �m�Wm!FQ��^�/�U�
��r�W�ҝ�u|�6�A���gLv{��f
��������.����+oA�Ԟ
�ᅱ �<�7��o����c�oK1כ���5<_� ��J��i�Oh%΋����X������B.P/���?5V�4�ٽf�M�[�'����<�{mU��z����G�%�n�$!�C��x
:M�G�
+�!Drt�X�<:G��U¥v�
#�P�A_�ؘ��J#ѻ��K��$�q.t�P�;���6ij�bEr
�,���C��렫�q��c���y�W"v�_��O��GЗ@������D�`��4Q"���@�X�D
����q�'�t��\��y�=m��t��Dη�~�Htx�*��]�	�.�
����U۸���?���ϷL/uV������_��U{JE�g�WV��x�wz��i�{���~�׻�w���>v�C��2�����[=��Rq%v�H�=��c�+�T���rW�%>��eD�A{��
�Ş$��HD��\��=[�
+-�b�g��]��M��a��x����-c����ԴM��d˘��6�
o|�����5Y��-�}��*h�\wyE�|K�![<[?�F���}����BL"�3}��|��3�z߻���]m�˼R���3��-��|K�����Si��Z�œ]�\���h���ɷW[���ISf�L���\�e���BO{�v=��b%���Q���&�D����Ћ
�t�D�qO�}����^O#��վM&N�?���b��c'�cDN��+L���po��Z��zz�R�`�h�����>�
K^��%h��������i�ڵ䅂�ػ��}nK[�4��ǂ�9��}��Ҽ|�k�|K!��@KG���.z���vxZ�K��<�o�B��}~+�0k�y~G��C���x����jO������z���G��h��>�?�լ�ע��
Ĺ^�݈�֠�D�Tk�'�J���
+����g�3D'��Ol���)�"i/
�X��C DB��R�re�����Ċ^~
A�L�B�$V%V#V'� �$�"�&��E�K����z���Xbb
�!���%�{�L�2H��$	B��eқ�)��mSb3bsb
bK��l��2o��zSz�51��m�&��뚩^G��e���x���Y���.Į�n
��A�I�&��}-q	qq8qq:�9qq<q,q
qq�Ǫ�o��??
�3���G�w��󉫉_���_���눧�'<
l��D�a���I�i����#�'��Z�e�Ebq����'���������8��
�kj�Y$.�eo���~�z�8��қ)�Y�/�?�q'qq q��"9�������dI��I�I���XBʤB�d���#�a�
+�p�$W$W"G�+���#�U�����5�5ɵ�߉?ȵ�u�r�.9�
C�G�O�%7 Ǒ����?���	�D����� u� ��I�H�܄ܔ܌����ܜ܂ܒ܊�I�L�2K��$rkr2�
�-q#q�
�=9��J�@�HN#��3ș�_���Z�r'r�3�
�+��;��'9�܋̑md;�A��N���&{�9�\�
�@��E�D|J|F��{�e�BV�~r
9�\@����������������������G�G�G�G�ǐǒǑ
����ɓȓ�S�S�����3�3ɳȳ�s�s�����
�
ɋȋ�K�K�����+�+ɫȫ�k�k������ɛț�[�[�����;�;ɻȻ�{�{������ɇȇ�G�G�����'�'ɧȧ�g�g�������E�K���+�b�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�r	�/U��ES
�R
�S%R%S
+�R1j�5�Z�Z�A�L�B��V�V�V�֤֢֦֠֡Z�QԺ�hj
�
�>5�ڀGmHmDmL��&P�V*NiT��)�JR&��,jjSj3jsj
jKj+ʦ
*Me�,�R������6Զ�v���j*��#5��N͠fR;Q����]�]�ݨݩ=�=���^T�j�ک*OuR]T7�C͡�R�u���*R%��ڛx�x�x�x�x�x�*S�J�S���j�ڇڗڏڟ:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�ZH
O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O]@]H]D]L]B]J]F]N]A]I]E]M]C]K]G]O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O=@=H=D=L=B=J=F=N=A=I=E=M=C=K=G=O�@�H-�^�^�^�S�R�Q�SoPoRoQoS�P�R�Q�SPRQS�P�R�Q�S_P_�P_Q_S�P�R�Q�S?P?R?Q?S�P�R�Q�SPRQS�PK���M�M�
��
��-�-�
+��1z�=�^�^�
A�L�B��W�W�W�נפעצס[�Q��hz
�
�>=�ހ
GoHoDoL��'��V:Nkt��i�N�&��-zzSz3zsz
zKz+ڦ
:Mg�,�ғ����6��v���z*��#=��NϠg�;ѳ��]�]�����=�=���^t�n���:Ow�]t7�Cϡ����.�%��ޛ.��J������z�އޗޏޟ>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�^HO�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O_ at _H_D_L_B_J_F_N_A_I_E_M_C_K_G_O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O?@?H?D?L?B?J?F?N?A?I?E?M?C?K?G?O�@�H/�_�_�_�ӯүѯ�o�o�o�o������������ӟПҟџ�_�_�_�_���������?�?�?�?ӿпҿѿ�������K��!���a������Q�3�Y�άȬČ`VfVaF2�2�1�3k0k2k1k3�0- [...]
+3�فّ��Lgf03���Y���.̮�n���
̞�lf/&Ǵ1�L�g:�.���a�0s�������͔�
+Se��y�|f3���������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�,d�gN`NdNbNfNaNeNcNg�`�d�b�f�a�e�c�g.`.d.b.f.a.e.c.g�`�d�b�f�a�e�c�gn`ndnbnfnanencng�`�d�b�f�a�e�c�g
`
d
b
f
a
e
c
g�`�d�b�f�a�e�c�g^`^d1/1/3�0��W�טי7�7�����w�w�����������O�O�Ϙϙ/�/�����o�o���������_�_�ߘߙ?�?������%̿,��,��,ò,������ʬªl�
Ʈ�gWdWbG�+���#�U�����5�5ٵص�u�v�.;�
îǮώe7`DZ�����	�D�����`u�`��ɦX�݄ݔ݌ݜ݂ݒ݊�Y�M�6˺�$vkv2�
�-�
�=;�������Nc��3ؙ�N�,vgvvWv7vwvvOv6��c��v��ͳ�l����sعl��e�l��c�f�l�����<v>��
`�a�e�c�g`dbfaecg�`�d�b�f�a�e�c�dz'�'�'�'���������g�g�g�g�����������������W�W�W�W�װײױ׳7�7�7�7���������w�w�w�w���������������������O�O�O�O�ϰϲϱϳ/�/��ؗؗ�W����k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_��H��h��X��xN�DN�dN�T.�
�V�s+r+q#���U��ܪ�j���ܚ�Z���:\
7�[�͍������rp�
�������n"���9�Kp:gpI��R��m�m�m�m�m�m�m�ٜå�
��\n�57�ۆۖێ۞��M�v�v�qӹ�Ln'n�3�
�+��;��'7�ۋ�qm\;���N����z�9�\���rE���q{se��U�~n
7�[�
p�p�r�q�sprqs�p�r�q�sGpGrGqGs�p�r�q
��������S�S�Ӹӹ3�3�����s�s���
�
�����K�K�˸˹+�+�����k�k���������[�[�۸۹;�;�����{�{�����������G�G�Ǹǹ'�'�����g�g�����E�K���+�b�U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�n	�/O�$O�4��,��</�"/�2��*��+���������*�H~U~5~u~
~M~-~m~
��ůˏ�������c�
�q���F���x~?�o���'x�7�$o�)��7�7�7�7����m���|���.?�ߚ��o�o�o�o�O��;�;�����
~&�?�ߙ߅ߕߍߝ߃ߓ������6�����|'��w�=�
~._�{�"_�����2_�|??���/��}�}�����������C�C�����#�#�����c�c�������	���I���)���i������Y���9���y������E���%���e������U���5���u���
���M���-���m���
���]���=���}������C���#���c������S���3���s���
���"�%�e�~1�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7����W R�Z`V�^Q�YPU�	Ä��Š�J�aeaa������������������"��F
c��������8aCa#aca�0A�(�
+qA�.BR0��`	��
+�	�
[[
+[	��i!#dW�$l-L�����S�
�
�i�ta�0S�I�%�,�"�*�&�.�!�)��rB��.ty�S���
a�0W(�BQ(	}��BY�7�U�v��Q������xL�G
B<L
)���
�>¾�~�������A���!Ľ¡�a���‘�Q���1±�q�B�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�8�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��Ea����XxUxMx]xCxSxKx[xGxWxOx_�@�P�H�X�D�T�L�\�B�R�J�Z��8S�V���R�^�A�Q�I�Y��8[��8��N�M�]�C���L��8Y�[�GX"�+Ĺ")R"-2"+r"/
+�H\!J�	ĩ�i�,*�*��a�
+�pqEq%q�����8R\U\M\]\C\S\K\[\GlG�늣�1�z���Xqq�������8^� N[Ÿ��	Q
1)�bJ��M�M�����-�-ŭD[tĴ���+N�'�ۈۊۉۋSĩ���4q�8C�)�$�wwwww��g�{�9�Ml;ļ�)v��b�8G�+�^�(��>qo�,VĪ�/��
�qq_q?q� �@� �`��P�0�p��H�(�h��X�8q�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�xq�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x��������������������������������������H|I|Y|E\,�*�&�.�!�)�%�-�#�+�'�/~ ~(~$~,~"~*~&~.~!~)~%~-~#~+~'~/� �(�$�,�"�*�&�.�!�)�%�-�#.����(����8��I�$I�I�b�0ii�����4BZYZE)�*�&�.�!�)�%�-�#�H��u���i=i}i���4N�P�H�X/M�&J�R\Ҥ��K���L)%Y�&Ҧ�f��� [...]
+R�T�JR���T�*RU��I�Ҁ��������t�t�t� �t�t�t�t�t�t�t�t�t�t�t�t��P:^:A:Q:I:Y:E:U:M:]:C:S:K:[:G:W:O:_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_z at zPzHzXzDzTzLz\zBzRzJzZzFzVzNz^zAzQZ$�$�,�"-�^�^�^�ސޔޒޖޑޕޓޗ>�>�>�>�>�>�>�>�����������������~�~�~�~�~�~�~�~������������H�ʄLʔLˌ�ʜ�˂,ʒ,ˊ��1y���<\^Q^I
!�,�"��W�W�W�אהגזב[�Q��hy�����<V�@
'o(o$o,��'��V9.krB�eCNʦ��-yySy3ysy
yKy+ٖ
9-g��ʓ����6��v���y�����<M�.ϐg�;ɳ��]�]�����=�=���^rNn���9/w�]r��#ϑ���W.�%�O�[.��*������y@�G�W�O�_>@>P [...]
��
[1�RlDl��*���Uc��V��[3�Vl��:��بغ�ѱ1��b����6���m�(�ql|lBlb�5�i�DL��ď�bVl�ئ��b�Ƕ�m�*fǜX:��ecnlRl��d��0�׭"!UJ��nO�y�7�^.�\ 9������r���RW�����)��{��������}P��
�j��=_�J��e�s�";����U�, � ��y_H�����gF>�\6(1�
yR]P]uAM,�+R�I���
.��.����
ԙ��re����&W{
+
y���dԤ5�
Ԥ'h�Ɉ�'���m��9�6usue����6\t���b!W��i�˵�W�\��v�~��
n���
+�`��j��nJ�|1x~J�������.�j�N�Kހ���.:_�⧢�%T~jP��/ԩ��Ů\����믪��+nZC9�aZ}
���1�1=x��
yz]3Vu����Oj�	nF�p5h�����:rfБ�AG�D]�Q��A]�}��,����ڧ:��^��W�Ltx?�ʬ�������:�kP�}|!�:8x��T�P*vU�ڥZ!㐨u*�C�IH2iAڐd2��ti��\
�p-�Z���k��\
�p-�Z.;��T.���g`�Qg�6�m`����m��
l�6�m`�Yv���?�頾�
`;�v�� ��l��
`;����M�}��K/
�4���K/
�4���K/
�4�F]��O?�
�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?
�,���?
���M
+fy�/`z�Y�g��z�Y�g����
t�.�]���kIv-S�8���
d.d���B��
�A�/Ekm��Cj�	H
ҀLB��)H
҆t Ӑ�,dP{-�8����?�8��������|^���QQ�����!�4`h�Ѐ���ꨡ�ꨡ�ꨡ���P~uL��	�1�:�oཱྀ�Fx���@|�3���
�e .��'	�$��bZxI�%��^xI�%��D{$Q�$��3�g��	<x&�L��3�g���z���	|�&��_�Ki�/
����4����_�Ki�/
����4����_�K�����_�Ki�/
����4����_�K��k�.8L�i�0

��4�|�!�k���I�]�ܼ�7��D?��4�^�U�O�E�4 ��&dJ�.����J�ꟲ!
�4d2
Ĝ@>I �$�O�'	��I�$G��	�8�����$�\�Ѐ�i���j�J�+�D�@�I �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�@�	��@�	��@�	����@�I a$0a��	LȄ�e��b��v����JOſ��B_w�W�\�T��=9%�W��֘�Y�Vqr	�2����B.f�9KS{�]���
Ͻ���'_ͱ�r^��f�]�[������4��n����y;�޶�
�}?5��ڹ�G�=��;���7G����ޡ��N{w��0��L��h
�k)5����~>�~OX������g�j��U����9
e1�ԪV�Y��V+���W��W-�IS�~jA�����G��K\�V�8�
����t�W�v�wɖj
�Է����TJ���_�k����L
$��X魭b���'��c��H�"m�
iF�%#͌�T�Y����0���Ld	��zTn<*-
��J�c�"֢��(N-*O��Ԣ���d-*9���JND%'��HD�#a$"�D���0�C�0�C�0�c�]�C�0�Cl��d�D2z"=���0���(3�Ōb1��ͨd3*ٌJ6��SQɩ���#a�"�T���0RF*�HEV�aEV�aEV�aEV��Հn
��`i!V<�9�����D��fDZ2��HKE��pn��VT�x���n\ǪHǪHǪHO��L
l���t��t��u���L���M��#VH:VH:VH:VH:VH:VH:VH:VH:VH:VH:VH:VH:v�:v�:v�:v�:v�:v��
<x�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ��
�;�NJNNJN�N_�N_�N_�N_�N_�N_�N_�N_�N_��P��P��P�N_�N_�N_�_�_�
+R�_�_�_�_?�p4������ױ�ױ��3!2j�=��=��=��=��=��EY�dv�:v�:v�:v�:v�:v�:v�:v�z�p������������������n�g`Ig`Ig`Ig$tH2	iB� �rlH2
���Bqz+$�u���ׁ��c��ׁ�_�|
�:�u�������R�����������������^�0��=��=�a {c{c+{b{b{b{b{b{b{b{b{b#	�$p�G6�G6�G6�G6�G6�G6�G6��6��6�G6�G6�G6�G6�$7�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�G6�76R�?S���M^d`���iZ䗈4=ҌHKE�=��l���M��I=,%�G�Z�
iaI����^29����43�R�᛭��4-�"T3�0#
3�0#
3�0#�T���0RF*�HE�#a�"�T���0p~a��2�A& uH2	iB� -HҁLCc��^��^��^��^��^��^��^��^��^��^��^��^��^ތ�xY�`N��˛�5�k��v��v��v��v��v��v��v��v��v�Ķ�D�7��M�x9�D�7��M�x9�D�7��M�x3⠞��&r��
o"Ǜ��&r��
o"Ǜ��&r��
o" [...]
+M���?����Z{�ˑ_>���L���>Н���\�:���{s幜_�y9��@Њ
JM
+=��caa�@�5�>�r��S*��Ɯ_�6-��۝�~߭�g��ҳ�v����/���tuWkŞb�V�foO0�|�-������k�F���b��\����Z�E��BVwQ�W*j}I�*^/��qo�l�
���;6x����
�c�wl�
^��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�
���6�����a�7l�
���6x�O���`�l�
^��
6򾍼o#����6�<m#O���6��l#��ȳ6�<k#��ȳ6�<k'�r7�<k#��ȳ6�=��=��=������������m�l|�h��D'f6�?���������1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
����S2�d6N�l���8%�qJf���阍�1�b6N�l���8�q*f�T��i���0�a6N�l���8
�qf�4��i���0�`6N�l���8��q�e���Ʃ��
%����3&gL6Θl�1�8c�q�d�����3&gL6Θl�19�{򞃼� �9�{����|� �9�o��� �9�k�|� �9�c�|� 9�;򎃼� �8�7֧򎃼� �8�7�|� �8X�:�;�q�
�(y�A�p�7
�
y�A�p�7
�y�A
p�
�y�A
p�
��;��濃�q����w0�
�s����v0�
�k����u0O
���`�:��楃y������t0?
�^;��槃��`~:��桃y�`
:8uv0�
�7��曃��`�98-vp6��l��ٰ��ag�i�O��F���?i�O��F���?i�O��F���?i�O��F~N#?�����4�-�~K����4�q�8�|�F�џi��4�q�8�~N����4�1�~L#/�����Ki�4�Ry)���F^J#/�����F��Cj�	H
ҀLB��)H
҆t Ӑ�,$����?�8����?�8����?�8����?�8�5�k�׀�_�|
��5�k�׀�_�|
���O ?���O ?���O ?���O ?��u���ׁ�_�|
�:�u���ׁ�_�|
�:�
��7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�����_��bV���|_��·F���<�~
+�)ী�~
+�)ী�~
+��P
��P
��P
���o��|
�6ʵQ��rm�k�\��(�F�6ʵQ��z�a����z٨��z9�w�� ��|��
�;�w�� ��|��
ু�~�iু�~�iু�~�iু�~�i�g��~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�!���w��.���@w����
���
�v��.X�K�`i,킥]��
�v[��lH2
���B�q��.X�K�`i,킥]��
Vv��.X�+�`e,삅]��
v��.X�
�`a,삅]��
v�®�~`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
�u��.X�5�r?X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]���^
+x)ी�^
+x`M��5]��
�t��.X�M�x�/X�k�`M��5]��
�t��.X�k�`M�>�ӵ�o��|��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.����`U��U]��
Vu��.X���`U��U]��
Vu��.X���`Sl�M]��
6u��.����`Sl�M]��
6u��.��{�`O��=]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]��
�t���
<x�I��]��

8.p\�>����0��
��mC at l��K�=]��|G���[Q{i8���_��k��,W�
pu�%b�b����b!��ȗs"�������KE<�'
�$�	���\oG[�L u<��	
O�I
�Qj�U�����1�J�{�ШԾ,
+/�JςPW����+�����H�E
������?ҫ�#��I^�
^xD�xD��DW~�C��
�/_�WsA��荘D����K�9XTk�`y��t ����rnn��
C�6N2�ѳ���0��5Xrx��Ó6$�4`K
-
,-<�P"!x�W��)w�^��J%�e |� 
@l�I[��[��<�+r���+~���#8�DhI��Dhk{R�D<IēD<IēD<I4EM�DS$�k{�&�M��7�o��	|�&�M��7�o��	|�s�ri~���}��O�e��L�͎��b��y�#­�k�Ԟ\����QT�B�0)���SC�/2�]�{ղK� ��T�dR���|o_u�炷i�6��*�/�{k?~�ӋLj�
*��^��BCP[�zSï5=�+9��rOeno��
���K}�r���+��bW!/J]=��?6 B�&aO�Z˂�5O�{8����_Xj���'�b��k��R9�Wzz{
+�w���z5-X�zR�D�He�
�'~p
j�������J���}��`XkV2�z�
՞�€�9��k�bBC��U�U�k�B�/Rۂ�K�
/0M��mzj|����u��i@&!M��iC:^���f ��n�!1��<�A&jZ�B�#��Ys��
C
1��Ru�!�@u���B���`
�!$K��@�44D��ih~ɺ��4D�,�W�5�j�I?s� ,޵�𮵆w�5�k��]kO�u 
V�l��ek
/[kx�Z���^��𲵆��5�l��ek
/[kx�ړ� t��=Eӡ�PѠ$��'�h��f�έP��9�
+}"�
�d�)�-=��G�a�Z�
9�%�a<z�
����Q�r0B��
+���A����)4����(��G#���)����&N���]U���>�8�.�vU�jp�P�t{k9���;�������-`[�`

l�z���d��-W���裣������\Пa����m
OyN
+��^.��-�����J-_�X·�R
/�z�
J
2i@��)H
҆t Ӑ�,�Ȁ~<	��ȓ�	����8t��_q�KG\:�����tĥ#.
q�� �|��
��7�o � �|��
��7��~�I�'��~�I�'��~�I�'��~�I�'�o��	|�&�M��7�o��	|�&�M��7��~
+�)ী�~
+�)ী�~
+�)ী�~
+�)ীo��|
�ʵP�
?~6�l�i#Nqڈ�F�6ʳ�
��8m�i#Nq:���|��
�;�w�� ��|��
�;�w��~�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g����
|�.�]��w����
|�.�]�G$Y� ��
�Y� �&���'�k2
���B��
�Ǔq��T��:G��W_j;�Ξj5�Auvҝ�=�_���+Q.^�r��'��O�B�`}��%&Oj�	H
2�G���ԓ)����D?ɱ�gҐ�"X��xA��
R�D
	Đ@
��TaT	D� :Z�A
;ha-�W�\�B��*�Ny��Q����(_G�z�3�ְ$ 訛
"us�L�MߞbO�%Z�E.zW����������}�
�	���:xd�������q9x?<�/���J��@�s)��A�{��
�݃�AsW��^�ti4�Qz])s]�ԗ20�W�~��9ut
ި�0?�t�����;���7��W��6hn�3���jyP-
>W���Rt�S�<��:��>0��x��:�tn�`����m ��ˀ��[g
��(��UE���J����t�NWhh��=4́�Z��W�a����3xWC����
+
Ej2^3���z����

_�}{�2 �JS��;��>R�P����/���s���M��ŪU�� �W
���b�x
"EZd,G�r�'���QZ/d�z�J�)#
�*�.Ȏ��IQS� �{�"do��Š�zJPfC�W��A
�_����
+M��vi
H
�x0�ڃq&���VkF[p�K��o�_�'=o!к�x�>܀W��;4�	Ms�1nk})����
ss-��j�G��R�w�

����r�b��z<�
,�+���*~(S��R0�<��V�7кUtt�B �a�*���i����
1

az�&�<����p6C��3�.e
�
�i0{���j�h��,��)Ű=��]1��`�)��+���0�!ðє��P�Y(�A��@�A�B!
�?/}U�a"+ �́
�m��l�����
�j

+a�

+�E��
k�;����09��0�~J
��@��A�
lm�-��ކd�
���V
�	��%�@#�����+���
���
+��t��*P$�����<6BM�M�P)�Jo�B��aMA;@�S�����C�<��O0˃D�����sjjw�WGd��m4{-<1���AJ����M
� � ,yPEy�#�O%�n���V	\%l�p�U0���
�J�O��~��->X�й`u�*`�P�B�ݡg�
��][Hnm���p)�.i
s~[�����ۆ�
+�����7�Ϛ�L��CC�iÍ���^<�-ij������m
�c�
��?�?��q��6c�U��ˮ��pSË�[��[��[sꟚ��T��V5��MWS�1����:��h(������"�3U9P�����>�z!E��!
�����o�[��[�M�V�T[�Sm�O�EO�����W[w�s��E�F�bmH�U譋���
�H}��p����
+�4�Q�nh�Z6l�V`X����+�]G�T��:�R�9��s���JW*]i�t=Rx��x���*��P�n�[���W��
�����
mK9��a��e��`���.�W�T����]U�wl����PƜ�[s���� ��iZmp�c�������b=`��ІX:�l��PD_�__�_[����[������B}	���x��α���\n�j�7!G#��?���ږ*�`G���&��%�{koWM��bF�*:�2kc�m�(< �|R�bAI��JX`Jc�	���/��-s���8,�P������|����AN��d ,5V�J,5h0���J�Vvh6C%U������lm��
BM��/��J�l_&�j��A`�Z����*���5��jrm�*�Q7a���cX�*�P1����	^�ûbv�.��>��0��f�i����9!7�����ƛ�sT�z=F�l'��F�Dk��wN����
�d�2�v]��,#aԕa8C��
�ad�,�
2�Բ=F4މ�]��Q󍣖���O��:ެ]=R����J��nD3�f�T3��`�i�Xj��?�if�6�7:�k�
قڐ-����@�H4�x��F4�g�rBh4֣5k|-լ�S�Y�n����جG�f=�e��f�d9�0�iM
+M4k�D��M4��f#8Ѭ�FpcF�&Z����W��%ZS��5X���r�6̓��Y��L���y$��0��h��Y{��C���г79��9�ǐqh�!=�Cz�Cy4p\�m�
�P
Zk=J�=0`5,���P��j6�T��G}�KMqTӪ a$���p���b&���ysM܊\k_�&�u�`֍7�JK�X�R��
V���*�P�C��d����
+k�RS5
�m
��l��k��
m�R�X�
M-�sa
��FX#�����G���6Y�d&���;��Xs��aE
��u"��
CL�!&��EO�Po(!�"%L
n��na��!�"�!���tك9�w4i����Z�f���e݈f	�q��Hڭ͌�f�f�T�j��e/���X��%3sH��,�ih9
C.��Cn
���
�̐
Cn>�7X��r<�C�t�U�kbٮk./7.��ː�>m#��c��
�7ڐ}�
�1
�oC�MȌM�Ap���qR�Sm��K�z��G�j@��B�ݻ��h�����N��g
+H�Y�	W!���
�k��V0��<ڐ
F}PM�D�
*UW�2�f�l�f��>���h��X�шёЗ�V��z��R٪�G�`��v��v�%�2a���0����c5s_� �?����;�����_wd��
+;�ֆ�'�K��{Ͷ:��uK�J63�͌�fF��1�̘if�61ډfF���Y��f��͂��o;͌�jd7��ݴFn��536��Ӭ�N��s���iVw�j0�[j��Fq����sB������q�vwZ#cįKw
+��k�;Q]����F�^z��n�7�f�/���o���������U�i7-���U���U��7��rw��U
&V
+
���.�N���fF��8j�yY�Uw.y,;�p�8�	}�je�L��G5z6)

�e{�xD������Zw�n]���R7�˻Y�
���P!�ɥ
�֗�����n�˹��w[H6���N�WU��૪�%ﲽԑ��ށ��� 㖓J��:�e��إ�A����ڛ1�r¯K�u=�-�]Z��lN���Wߡ�PM�<��P��̿�=�!=RCz�C�e9Y
C�a�=t
Cf,{9

�!���:C��2&Y��z|,5��O
Z�P	�Z�K�V;�
��s�8�-
�����y �'����Z�c!C4{,�OX->jH(L�h́���

�$>�8ZNt���r���n
���/��D<T�PI��*�P	�!�;���;ݸ^	�e�_����&z���
~m��Q�a�F�b��a�F�q7�뷨�fF��1��h53�͌N3c��1�̘mft����`�73j͌�fF���Y{����n֞v����5�ݬ��fMg7k:�Y��͚�i�tN�Vr���ӬA�f
�4k�Y�8�l\C-os�fco6�
��џ]������2ZM�8����<{<�vq#*z���
sT�Hp|-j�<�5�FC�d|y�kC�t��u.eH�-��e�@��u{,|ei׿.h�Ռ��Z�&�x��
U<k�˱��V3����43f��͌n#N|�2j͌�fF���Y���RF���Y+i�_$-el� Z�њ5H�Y�$k�!l����f��ڬZ�5Bk�Fhm
+ԬeZ�U-ެj�f�o֭a�
_�k�a�h�L͒DS����4d���!Q��CG}?���	� �ᣆ����������ޡF�~��/:������q;|�[y������}����}�b�$�$�3v1!���<
+��t�_���[��ԕK�+��W.}��D���"�Z�["�]��
+�%���Jusr�1j��
ύn�>����+��L��\e���Ǯ?z]��G���|��?~��"�ĢJ��k��K~��֍��B�u�
�qu��1��Y��	���'�.���w�ޘ:?~���5W�#�L��Ar�-��<����mr��K�j�=�},�jC�j3z8��Av�y�ޥ^M3�ʆ5%ۨ���sx����l��Fz�B�Fמ%�^����?�d�[I�����oc>�k-﩯�n�|���^���ύ���� ��Fy5'Gymc�^�G1�P�y�FP=��J��Ʌ7m��|�sI�Y��9�
�.��gI��[�:'�A-��1�{�y}��2v�1�u��MW��`$���UV��Gy-?6Q3Q���Nq��-�,\���
?'�Ƿ��Q���y���5�众�Y��%7-���S�۪��+'�GN�B�v�
+�͛sE�և&����G�1v��u��Y�߶�ߤ+v�Y�ns�`�yu���J�d�
��?�=G�A��
�����	�ߗ���\�d��Ӯ�5u��s�	y�$��G� ��Ā��A�����>��Z��VDQ)R�CA�ڒM�v
k������]wQ�C�N��t;��2St�4��wo�ug�3����������}��|�w�
�]q��:����w� ��t*�h
BB{��`9���/
"L(�)Άd��F�I�dZ���6W�6F�:���m�0=��ԕ�]�L�]x+��p��ؔ��<Ӊ��ULJW�w��8Vƻ�r��#ݕ�Z�V��
�v�5�����n^���hC�[]P��P�Vwm�D��׭2�U

��
+*اR/��2�ۗGe�Z�+W�%������n��S=���K�k�xS�OOy�s�_����r��v|ڐ�X?�����z��$9	^
��c ��B��[/�
�M�
�Q���2^��4
Gw
���������dbb,�k��͙�)���Z?2���L��r���<^`y�~jj��if����ڔ�_�oho��WCQ��ޒ쪂}Ƃ��,&����N`
v
6��D�u����;
e͵��2��|�/p�GL�AD3 

��
�yA��+(_�7D��sN�`�
f٨��o��]m��lՆFZ�N�eEM��)�χ����z��n�\8f��S��*Jy�G�Kv�wC��o��h�B
+K�*&�@���c��]��hH̕+d�ݔ��RF^�2�z�k���]�F~,"P"d���J�r�J��d�#S����t�,
?6��p�?rq��~�
Y_6�}]��������ޠ�
�]Ә�ꉬă��-=?�����q�w(�	��a��7ա����P���O���y�Zӵ�<vy%��(#�'a���ew��/��@J&쑫{r�L�ʗS�>ܔd"���|k�u
�v�I*�ˬ�L�v�E��_'ևj!S�Uf�o��}���?�v���i:
'����~�PĺEm� N0�n��}��
+����s3���=DL���N8�;��x�b�V�e�*@f��T$��To�'+
q�G
+}�+�%���.7o�L��Ԛ�C̅R
k
T.���)�L�*%�y��J��p�'{g��_@��Q�3���s�ThL�j
���!��Xk�"�nZ�z<�	Y!��<ٜ\�/LTI�JC";�2t���h�:�o�T�f��n�`��L*������͗�c�`��7��V�}�z�Z��V3:���

+�`6�,Բg�v�	_m�ud�'c�G��XOI�>�N�}w���#�
�h��^�g����
+YSݥ�J�C]���e���g#��(�g<��|r��h�$�
&3�n[�R�g#E|���d��*��{�
9�m�B;�� l���ٜgj�޴М`��{�־m)�—y��ˌ��?
O<7�x�_��4�N5���q�2��L���=S�5����
+�͍��)���*�,+S���$�y�l.A�p���L-� '��D�q~�I'Ö���X��
��t{��!#;������
xNC�H��u� �ib'-P�Ӄ[�5EA�
	:�
�]���L�:C�������%br
�Zܫ��_���q �_��!r�B�	�o�.X���]�q�'�,��
��
����{
+��	)�A��m0z�=X&�� x1�S14I߫���F��
qw��W��R�}��g�=N��D�-�a�7��-�Ņ� ��45�U���Vb�r�8d
��X�H�ކ��
���0��"�
�G
�:%�`;�&�'����H��
'sȗ�6@/y�����^
�nS�<^4@ǫ�΁
8p���
8p���
8p�����W�_�a�#=$b�I@�0��F�q,�F�(��B���U%-��i7�gdn�ee砼���"TR���ETQ��y���
+�e�㟙��y8'2ghS�	�GHH
�R0��!�<b�#��X�EP:�@�h#ҡ,��r�i
�G��}	*E�Pz�+P%��؅��/���ds��?� /G
�+!З?Ux��*#�T�<�ÂPt�?���}� �
$�?	e��gT
R
v��U
��B�bķP;�5��MP'�52�A2�q ���Z��6��;��(��?�a|g���=W?"���#z�o�:7k�v�p�︚��jendstream
+endobj
+7553 0 obj
+21452
+endobj
+7522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.7637 489.4944 350.54 500.3983]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) >>
+>> endobj
+7524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 409.0119 172.3606 419.9158]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_1ee38be62a49852994bf906003b0c23c) >>
+>> endobj
+7525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.1762 409.0119 241.8194 419.9158]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 358.3956 172.3606 369.2995]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_a682606a24cf76b2d13ef9d70b0b4dde) >>
+>> endobj
+7527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.603 358.3956 242.2462 369.2995]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.9374 358.3956 407.7137 369.2995]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+7529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 358.3956 513.9963 369.2995]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 346.4404 160.1764 357.3443]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [296.3343 346.4404 379.1329 357.3443]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+7532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 273.9063 172.3606 284.8102]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_ee0ae23c1027e709991811b8398b9f46) >>
+>> endobj
+7533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.9096 273.9063 244.5528 284.8102]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7534 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.1198 273.9063 448.3694 284.8102]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.4848 261.9511 275.2833 272.855]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+7536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 212.331 172.3606 223.235]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_5da8e430d26c6471590e2c7ae5f7d82e) >>
+>> endobj
+7537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.8492 212.331 245.4924 223.235]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.932 212.331 379.7591 223.235]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 212.331 513.9963 223.235]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.5701 200.3759 332.3687 211.2798]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+7542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 150.7558 172.3606 161.6597]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3805575c5d920cbc808cf34e44c11fee) >>
+>> endobj
+7543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.6977 150.7558 258.148 161.6597]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7545 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 112.4682 180.1093 122.9986]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_a4a79e7bb87171b31d49429f9d875dcb) >>
+>> endobj
+7546 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7519 0 obj <<
+/D [7517 0 R /XYZ 90 757.9346 null]
+>> endobj
+7520 0 obj <<
+/D [7517 0 R /XYZ 90 506.4688 null]
+>> endobj
+7521 0 obj <<
+/D [7517 0 R /XYZ 90 506.4688 null]
+>> endobj
+7523 0 obj <<
+/D [7517 0 R /XYZ 90 427.8892 null]
+>> endobj
+7541 0 obj <<
+/D [7517 0 R /XYZ 90 169.7526 null]
+>> endobj
+7544 0 obj <<
+/D [7517 0 R /XYZ 90 131.0914 null]
+>> endobj
+7516 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F37 1999 0 R /F67 370 0 R /F99 2085 0 R /F100 2198 0 R /F25 348 0 R >>
+/XObject << /Im13 7501 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7560 0 obj <<
+/Length 3285      
+/Filter /FlateDecode
+>>
+stream
+xڵ\[s�~����ƞ���_2Ӈ6�d�f���m_��F�h/�"�޸��$�	�U4����霏�|�!@��da�B	�
�rq��‹x��+�}��ϗ!௟��~'�� #�\|�o,H�%t�i��5!���%�_��!�z}ڭW�o(�>l�?��z�cy{Z�������ޯޟn��>�n��͒
+|��v]U��������`�R����7�|����O�gw�IbY�v��/x�����
+#f�X|�c�bw�)s/�W����4_���x�8��9.����p	��`�8�|�a6h?S*��D0|�
+�
=rd4��g���C�ч�! �Rf�9\�];J�
I*n��$�
�s��B��|j���b�s��
>�=�k���i]N
Ҡ�"C�H_�Ge�C �	���ȹ��rL����s4"��`X#i�IG��2���z��ׇBDS�M(uL$(�(
OKj\۱	l4�_h`%y�� ��~qeY���ʇ���׭V�D�!��&�
!�M1�H����3G�@V��knDHB.S ���� �#$(��P��ڦ�0W�a����E�A	��$)�`5OR����4I
IV��]��T���I	I�`��[�D��������&GU�'�4�JE�)��F�d<�R�Pԏ�}7�ן���&p�/�kK�~ !j�8�n�h
�e&4ᡗ,3.`�#u��
,_g��8����k(�;�L#N58�.��Q��Z
+�ntq}*�0p��c�1�&��¡r,�@
+�A �������3�#��w��
;I<��@0�hj%�V��XxT�#
F�Vd/_!
#N�>K4)�p�H4֝d�g\��}��>�n������u��������ng�r_l����o
�-7��Z�vZt�A\0sI�Y�]>�D���<vO����k�`U��J;�	S�4�'yΝ�̜�|�iv���	���V�m�#�<E��tP�
��A94��.4z�9�h���\hqNц6E�aSE{�a�Xo�����+�:X3�
+����ӓ��P�#�ڽ�),�E���uUB��
�:���a�1��
ְ�
+IޮM5�a�
�]�v�c7��S<_[��
,f��p��D�
���I�K��0�L!��p_Q���W�ӳ�7���^���㺪�PWK�3�*~{l��+�~QW�jN�����UM5R���SU�`��
&ځ�__���t;�w<�
�P��Z
+?�zk}Z}���TT�=3�Y�K�8xT��Q&J�>���0LD�1�����ns{��?�]]�Pq�dӿX�?��8
c�`M���e�0l(=H��(�\sc�R��FJ�
l�B�'']�� S�
��pmlW&3J�aY%
�=�g�9\��?�u�+����]�;l��p��&T&�6S��S5fNƲT
�G�RݍP�J�j��$եGeHP�a�A��9�����!�)��F��<,QLA��w��6M��@�Iuɂa��ީ�r�|ASkƯ/���S��Yn��Є�������s,"�����5� 8�R���;Tα�&T6����la0s��J��F*�
�M�����lo�#�x*�*h����Hb�:L���,�
S���Ɓ7�`��N,��S�T�O_u��[�V~.X| �,���P��{1����S_x��|݅��]��Ъ���l�����~�*v�E�n*�
am�����P���[��S�`��hxx���j~ߎqH`Ȝ��{P�=�g���p�R!f�9��

+L$4ȡ�=�ͦ�j��;�ٍ
���wn�f6�2�{�:wש7����ʹڸ�ރ��<?��۵�-���i��m/'SL1ĔT��P�J��뤪�7�U}�3�*�"���>�^�+EEK��GehQX�r#�`P���0LcBύ��gh�v�mW2X bd:
�c!4��>�7����
X������9��	Z`#�hf�},�jj˭}���*&6���ͻ��Tm�"i��`҉ D"2"���b1��yvK�8%4tZ�`J��K*Ys4w����JL)YگW��o^�z��(Y�Ed�)�����cB��<
��10��
�0}V�
1���Ј�Z�L�B��a-��G�KHu<�7wI�"��:��HI���UW��qw8>��F��4���T�.�D���W�t�qIb.y@���Թ��ò
+L(LƯS��߬��}�P�
��n�0U,10+p�
�C�({+Q�� LK�DJɹ�p�
��j__V��z�D0����Ge80,���I��K��l/�(?�|ch#!4
6Sh� ��x��I�
b�r�gl�C,�	�CԇJZ'.yn�ŠX�;7�ay�	
��'�׫O�7�>=�s�'�"�ۜ..����B�4UD���QF�*H:
��g�R����s4"��6����璒��
	�(bܐ>�704IA��>4t����FJ�
l�9��+���G�$���Չ
 hq�q]״�0l����HJ L�x���%0�Җ�_�-�߼��|�і4�Ȯז�)�����Ge�4y`�3����j�L�RsC��YC��v���A�'��Q
>��ц?�&f{"�:��H���M���fqJL�\�>�e�p� �xNM��
yɃ�DX��AM˪Ih0�&�NMz~o�m�$�~&X�&����Dv��rժ�\��={0~tS"�!!�Qp�
m�T
�?���
�'g��
m$
+�Ú
�sqg��׮����۲~iF��5C��F�9{�3kL�CL/yl�p
R�s�&=,_c���Ke��J
�̮>���1�F��0�)�3OKY�&��
W��q�۶��g|@%�
��sM���-�� ��T�WaX�u�0��*U
EuNGm���Kn��ed��K(0����~}q�~��Q-��wb���9�]ˢh�h���}\��k�k��o�ɣ2�y��I{�3�]k���jn�<>G#�ki|_���`�̂=����Ge�3[����`�����x(����l8�DS0��
��gx�v�[�Ž%eg컲�wZ8
�1�jNǣr$ A�$���wq4�
�O����9��a����߆���a���Vd�1��(U
V-:�	i�e��pe_ġ�m�}fr�06�Ja�@d{����E����"�w�d�n!�?��HXڟ�
�7|�u��߻_�i_v?�Ӿ�WU���⺛�ޭ�����V�N/�U|<T� ��1tw�
+@ۮ��~��O]���
�M��e��7�Tpɑ]{�����۷_�|Awzܗ�*����m\���R���K/��nD(�{\�ݹ���������s��R�����endstream
+endobj
+7559 0 obj <<
+/Type /Page
+/Contents 7560 0 R
+/Resources 7558 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7482 0 R
+/Annots [ 7563 0 R 7564 0 R 7565 0 R 7567 0 R 7568 0 R 7570 0 R 7571 0 R 7573 0 R 7574 0 R 7576 0 R 7577 0 R 7579 0 R 7580 0 R 7582 0 R 7583 0 R 7584 0 R 7585 0 R 7586 0 R 7587 0 R 7588 0 R 7589 0 R 7590 0 R 7591 0 R 7592 0 R 7593 0 R 7594 0 R 7596 0 R 7597 0 R 7598 0 R 7599 0 R 7600 0 R 7601 0 R 7602 0 R 7603 0 R 7604 0 R 7605 0 R 7606 0 R ]
+>> endobj
+7563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 719.9123 172.3606 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.1002 719.9123 223.9067 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_40f18b846fb1fe73b63da7fa7cbbbbca) >>
+>> endobj
+7565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.2439 719.9123 309.6941 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.058 179.5535 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 681.058 250.6661 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_ff27d012a01487b7c9c14a9a3b40d9b1) >>
+>> endobj
+7570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 642.2037 194.2082 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+7571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.9478 642.2037 311.9354 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_a9f9e9fbb372e1f21bd0472b2db20567) >>
+>> endobj
+7573 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 603.3494 170.6866 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) >>
+>> endobj
+7574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 603.3494 243.3135 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_8ccc13c9fa8f27701c935b481a371f89) >>
+>> endobj
+7576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 564.8687 170.6866 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) >>
+>> endobj
+7577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.1848 564.8687 235.712 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_f46e579954688eec46ac0a43029fdaa1) >>
+>> endobj
+7579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 525.6408 214.6815 536.5447]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.4211 525.6408 301.7242 536.5447]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3800cc1eb2fb15d0c42dd71740bb661a) >>
+>> endobj
+7582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 486.7865 196.7089 497.6904]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+7583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.207 486.7865 276.6881 497.6904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_162d95e1149e222a317370e2fa25a120) >>
+>> endobj
+7584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 448.3058 155.2649 458.8361]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_4d480f0b906eef0c0094c8fabc69a3b3) >>
+>> endobj
+7585 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 409.0779 278.6812 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3aa58c4d8ded71e574db9d1c59533300) >>
+>> endobj
+7586 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.4968 409.0779 348.14 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7587 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 370.2236 273.0024 381.1275]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_0bf7e46a624f9d9df1528ae0b47ad55d) >>
+>> endobj
+7588 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [300.3395 370.2236 357.1158 381.1275]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+7589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 331.7429 194.5672 342.2732]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_e60e06beac90231262189084333bda57) >>
+>> endobj
+7590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.9044 331.7429 265.4106 342.2732]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+7591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 292.515 198.4425 303.4189]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3a010e69cfabe1a026ee21f7639207e3) >>
+>> endobj
+7592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.7797 292.515 303.6068 303.4189]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 253.6607 226.268 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_ea40406b8f95d9ca4f61f23598448cd5) >>
+>> endobj
+7594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.6051 253.6607 330.8547 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7596 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 214.8064 229.4458 225.7103]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_fc1e5cbd96d9c2819ba1ec2151f3897e) >>
+>> endobj
+7597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.2615 214.8064 316.06 225.7103]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >>
+>> endobj
+7598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 176.3257 187.583 186.856]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_49625522da117289c0312c67060210f2) >>
+>> endobj
+7599 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 137.4714 201.7001 148.0017]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) >>
+>> endobj
+7600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [202.1982 137.4714 225.0723 148.0017]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_21e9dae374ecb009d8f7f268f5e673e7) >>
+>> endobj
+7601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.2901 98.2435 249.2715 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_22183a1ac7a9af9929c6153e2a7a659b) >>
+>> endobj
+7602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.3584 98.2435 321.1812 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+7603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [403.9749 98.2435 449.9918 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.0289 98.2435 513.9963 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 86.6619 135.2699 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7561 0 obj <<
+/D [7559 0 R /XYZ 90 757.9346 null]
+>> endobj
+7562 0 obj <<
+/D [7559 0 R /XYZ 90 733.028 null]
+>> endobj
+7566 0 obj <<
+/D [7559 0 R /XYZ 90 700.1513 null]
+>> endobj
+7569 0 obj <<
+/D [7559 0 R /XYZ 90 661.297 null]
+>> endobj
+7572 0 obj <<
+/D [7559 0 R /XYZ 90 622.4427 null]
+>> endobj
+7575 0 obj <<
+/D [7559 0 R /XYZ 90 583.5884 null]
+>> endobj
+7578 0 obj <<
+/D [7559 0 R /XYZ 90 544.7341 null]
+>> endobj
+7581 0 obj <<
+/D [7559 0 R /XYZ 90 505.8798 null]
+>> endobj
+7595 0 obj <<
+/D [7559 0 R /XYZ 90 233.8997 null]
+>> endobj
+7558 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7618 0 obj <<
+/Length 2988      
+/Filter /FlateDecode
+>>
+stream
+xڽ[ے�}߯�­!�/�_
;vَ��<9��Y�vbr�p�Z��>�����)�\�f�A��� ��da�B	�
�r��^��{���+�=^��U(𗛫W�I�0�H*7�I���.n�Y���^����5����n�^S��m���Cv����
�_�~���۷�k����M��^Q���l��j_��?���\研R��Ԑ�_o~�����
C0I,��^��+^��p~�ˆ-O�#b
]l�8e������?���A�)op,�fz�b
i	ߞ"�
“�[�+E�Rp�U��*��*�ae�‹Y߾���
�@��q��I+T
��L_�F�'���Sz��2�y9��u2���e��խ0xG �TT!”Y0$!�p�@�
K�@�(51�JK7��o� +
Y��Ӹ�*W����}�T"
+�`#
�9L�0
��
},*7��}q�fj�W�Mݾ�=ؿb�_���m�Y]��_���'_�Ň��ñ�w��{XNM�&�?S��|��e=^K'E�/��
3%�B��ۧ6sq

5j�M�1�(����	���|��,��ǐ�[T�E�p�oN*e�pd��}��]Y�#�L#N5���;��CN>a��B�>/�CV�#J#*BOM��I��k�7}�/F6
F�`q�Н|��H�5��gU��)�{������J ��ƉV����?�.F���e��

=����$�:"K������ˬ��
׾k��>h���w�P3�

�p7j�&H�#	��ԏE5A3
+�b+�Z<t;��>U]��,���$I��)��,tR#��Q�A���V�a�����3�'6��D-;�	
G��A��'jz������b[��[P{�#
���g�
�P	Kn��Sy�C��z�:b���ƼS��e��y�Ð��L��.�
��!� �X�B��8�4�
+c���'����ڊ�1��4!b`;B@�|
+�H���ls
h�*�|�
IX���R
GD�B�7��c�PZ(4g:��'
�Z���;~H�.�z�1q/x���"�x��ˑae{���g���SFz����KB�~�R	
�B#� �
���gHh��E�|Rc�N*�O ���}(�Ij�@/3�O�i�	�U��C���	��F8�0�>�>A�r��' �0#`�!a0��
&ސ�6A3��$�v�c���U�a�+?����p�E�G6�v	Ӣ8��k���4�k�K�]���ڕ��֮�ݻ�n3^��f���u��O!�����>t��@.���RVAF���ϯ
�T��m�PG���X����V�U�B-�l�P��
/?d�"+kWl��l]&A�Tv-���CH����v�d,�Mz�tb
+�!�5a�|�H�����������*~�o��}>Ս)
+�Z
)�8�*��@�O 8RH�\i���8�����s�W��CC�	I�pW^*����Ҥ?���y6/��e^�#�yNlԵ�,k<��̷O��o��酪uz�p�>���}k��6����
�|�C������ۓ�D�;�t�
+/O�8:��!��S?���S?�ԧ~��9V�X�2� 
S�55Q�+/���0G�֪�y=��;�b|�~q�#� ^l��x�o�2��������O4$�����)��2�/��̥D��6s�T2�u�r8n��th4���3|�>N
�Pk�>5��#B �E|�L¬PH)���΍$0���;j'�0?�jͷ
��
ÒE!�i���
�mS{|�
��p�\r@����h�8�# '��M<e�j�8 "=�>��
R�N詨��0���}|+�<�F f��8�c{��\��@����1��
XCϳn����n�^�ɷw��}�]w����(ô�{��}B��y�$�E-�h-a��Z�n�:c�|�^<�YN
��|
+�Ho�
Tl�oOVK�V
+�9�3�%j�{�(����pn����>[�
����;nHJN*�@;E�`�|�4�QL�65/ȨPG����|eN+���fZ���Ʌ�l�qR{�4
���:�����:�7	G�/c��?�ەJ `�N����ڝ>f���)�g9�	�#�tLr&(�����&�]u�#�A�b{D��9U��y�{�£��vT���վ<�D�.sUh*�&Uv!�^�6"l�Œl
�xb�]��=�U}�����y�e��_A��AW�<5;�������ty�
vp
#�a�W_M�6`{y1�//��g����Y�2�@2JQ�lz�±�D�ʔF�����Tʼ&�Gc�7�b��-�G4I�#�Tx�fg�X;��7�Ų	3B�<�Q(�a9���(�Ek��N*M'u1���D�mG9�>�Ahx��x�Pk�
�.N
+f�cwB	ð@
+��c�lHC�=�9n'�2?�jͿmb���?w
:���L
!���c#ʠ�
����r�0bG�3���ևZ�r�ʂ�la��im�X�q�f|F8p�4��fn�Yr��*�>�#���t�O�00!�d�#F�N��Q����6����=n�X����zjSq�
\É?/�gVL�6��h���ɂ�H�4�rA���˷y�W_~�W�C��
ww��$������h#�������#-kl�2���e����l�mQ��8��v�
펅���������3��Gi>Y�?��/�r��ϻ7Y+�=���!J����l��J<ʕ�xyc-�1$��B�[��D��[eë=�����/-�{0�z���q>�y4
h�<��:��3wZ@�F����

m�h�kmk�S��	�@;%�D�
�B]�˪��F���
&d��T���C�qC��ܽu�ܾ�H�}�*?��Z�e�ſ�ʣ;ٴ��z�p�@��CN��W�H5��<�:=6ֵ��ڧ�-ܫ����V�7ZVQ��Gz���z��ի��'��б,�Tԯ��ͫ!.�!�b���B#,=�sL�T�K�����vw�D�ᶹ�4�c(v����c�endstream
+endobj
+7617 0 obj <<
+/Type /Page
+/Contents 7618 0 R
+/Resources 7616 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7482 0 R
+/Annots [ 7623 0 R 7624 0 R 7625 0 R 7626 0 R 7627 0 R 7628 0 R 7629 0 R 7631 0 R 7633 0 R 7634 0 R 7636 0 R 7637 0 R 7639 0 R 7640 0 R 7643 0 R 7644 0 R 7645 0 R 7647 0 R 7648 0 R 7649 0 R 7650 0 R 7651 0 R 7652 0 R 7654 0 R ]
+>> endobj
+7623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 696.0237 179.2546 706.9276]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+7624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.9943 696.0237 248.4344 706.9276]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_485bfce228009ebec2a7bd83d695eddd) >>
+>> endobj
+7625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4319 657.2129 179.2546 668.1168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+7626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.9943 657.2129 260.6286 668.1168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3601b97efe162fca1df11d70b0b3d607) >>
+>> endobj
+7627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 618.4021 192.6643 629.306]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_7f2b2dce631b12fb46f6f1fa719e6c84) >>
+>> endobj
+7628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.4799 618.4021 242.4968 629.306]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.4405 618.4021 319.4574 629.306]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 579.9649 150.493 590.4952]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_b5ff957e959947c6016cd28be6e2fadd) >>
+>> endobj
+7633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 540.7805 191.7178 551.6844]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 540.7805 288.8524 551.6844]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_25be5d5e126674d8aca8b9ec828e289f) >>
+>> endobj
+7636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 501.9697 191.7178 512.8736]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 501.9697 303.0791 512.8736]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_b151aa3732a4737e63c5142b42159dc3) >>
+>> endobj
+7639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 463.1589 156.2812 474.0628]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_623847fa141f97cd59f3d85627536379) >>
+>> endobj
+7640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.0969 463.1589 218.5471 474.0628]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 382.4595 203.0748 393.3634]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 382.4595 296.3242 393.3634]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >>
+>> endobj
+7645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.488 367.8605 334.3733 377.7657]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 274.5467 226.0342 285.4506]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_30c23ab257a58da3708591becad2bf1f) >>
+>> endobj
+7648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 274.5467 379.6261 285.4506]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.2843 235.7358 162.6502 246.6398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_6ba0be34c122032442a7409f194e157d) >>
+>> endobj
+7650 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.8348 235.7358 342.3674 246.6398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.9091 235.7358 513.9963 246.6398]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 223.7807 149.6659 234.6846]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7619 0 obj <<
+/D [7617 0 R /XYZ 90 757.9346 null]
+>> endobj
+7630 0 obj <<
+/D [7617 0 R /XYZ 90 598.6629 null]
+>> endobj
+7632 0 obj <<
+/D [7617 0 R /XYZ 90 559.852 null]
+>> endobj
+7635 0 obj <<
+/D [7617 0 R /XYZ 90 521.0413 null]
+>> endobj
+7638 0 obj <<
+/D [7617 0 R /XYZ 90 482.2305 null]
+>> endobj
+7641 0 obj <<
+/D [7617 0 R /XYZ 90 401.4115 null]
+>> endobj
+7642 0 obj <<
+/D [7617 0 R /XYZ 90 401.4115 null]
+>> endobj
+7646 0 obj <<
+/D [7617 0 R /XYZ 90 320.7121 null]
+>> endobj
+7653 0 obj <<
+/D [7617 0 R /XYZ 90 186.5019 null]
+>> endobj
+7616 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F38 7622 0 R /F52 345 0 R /F101 2079 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7662 0 obj <<
+/Length 3147      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�۶�~�B�i&� �K���4n��������$܉�D�$��뻋
+ yT�L?t<�#�v��ς�
��B��2Q)���Y<�🯨�^��:$�����w�X�De,[�ܛ
2�F��f�zIi��՚B��V�,��PܾZ1���wz��?�wM�|��~����fE�e}�ׇ՚	��z_��}�I�k3����M�ɒ)������ooz9�1D�Q�����_�b
����$����^HB�b��g��_�|��~;aLi��)O�
V>�.�&$�W�`��(���|ѓ���0&�g�V1�.�
G
{�K|)Oɲ�o��V���hK0�}k��CYW_؁����A�3M}o���BXUvn�Vw1վ�t��g��T���mYT[�P�պ�r�Š�pSW0]�U�~9e�&���]�9�x��v���e�oo����
Ubٞ�.��F�8�&��T������μǗ�)
�d�
��)��k��}��At�ɞ!��_7n�7D��e
O����<
����-	�,�� he
�A	a�D,ڷ��F���)3g�&L���UH0c�좙g9��|��7sķ?r}�o��JԨՉ��S�}nu�i�;������28$�t :N5���=��C���C�`B����F�-H;'�4�2��5�S]b�
+1�*JQ�ӧ]% �sOv�U�8�2Ϸw����U�]y(-�/\R���'aAtiC�����)�~C-11�f�5�$BqaX� ����攪山\n1�q�=
�u�ٗ{�Fl\���զ�]u�
y�u��d��7�q�:@v8Z��/wE�Q`VT��OG�Y;�-�A6�B�À+�^�.[L`&�}�����n�*|0
a0L�٭a|}W��l�7��|w�m�Z�;�=��i߹=�
u0yVL�q7�h^��Y��S���Չ�$�s��9�vȪ"�S�w]��)\vI9�l�-fk3o��
J[��ۈ$�:dί����g�Dn;)�1/�
���3�r,���Z;�Le�#q�ӭ�3~��S(T$��f8}�Mnգ�����bX ٸ����
q5�f�W�?�(��|/8r���� ̶�*9J�"!���� ԩ��3��ѯ�S�~�/��Bv��D�h�1#ǂ
����>��Ic�e��
��)�g���2���+�kʝa����l�ԧ!@6��e� [...]
��
'K���lg�M0ѱn
�6kk;��S놎�I��;�8��p<u�{�@��k��۩�*����
$_n�
+UF��q�+;��C�K�I+D�F3���! *�jϠ,+�Ӆ�9�����ӯ��8���7]&� #otT؏wC���j�95
���L���b�A�
��K����)
�|�?�2�i��nK�T��
+���;c|ܖ�X�"H�(���Ҡ�.��l� J�ɧ0�<cT��ts����j������]A{A�����!a��ks�Ӧ��3��
SoN�.a)�rE�m�_�bL\kd�&��D��ǣ�'T2t����I2�(@?�H�"O�������L�y2��H������.P�U��L�v{�?�6��&�⓫��_�����n
+�ŷ�˗D�\���;K���	"�h1
�����C��ڻS� 45�j���a�Fw�aʱa�wls�|XS�b�Fj�Кp�^��̦O�;&�!AX�Im
v���	
D���%,��֤�ﯱ �tݔe���0�O��ۭ
+��ͣ�d�vs�
��"E%11};��!��n1W @���<M��֥\8��u�^��1�H��L4e�z,I���D�T�w
�3b��QA���S��ƽ T
�2
������ɧ���n��̳�X�v*�Y�a}v �Dv�V1����ve;
/
�9��!�Y�g�
�`ұ
y���_v�C���
a����IKx�e3I�c�IDž�ǡ
_p܀j�qS��R(���m�?���v(�N��P���^_�u���nuӀo
��9H�����B�.��D)Bc!nvMsir����1��jX
c#�i�
�������B-�r��\��'L-#\:��Rsk��Qt_hC�8	��s��.�{��3�`#�%(�
+�^=����h��:JC/ФR�����sT�T��q�\,_T[f \�݊?MlI�D���c3SS)�T	9���	��bL峀
-�z �-Sޟ?ڍ1p����Q�i��
���?y�}1�
ZR
4����+����۟��l��6�!!�� �ܾ/�v�i�5���ip�l>����$������&Łį�O� ��N���lOC&�ʟit�}}��n�0�G�E*;��
+�-
:�ۗx�;q 
+.����*n	@�L/
�����|��ſ�߼��Sq
a�R���E'��
+���6<j87Wg�WX<�=���]��m�(p��:c���

+�:��
+��a^u�M}�<
�B-4��3#��������k|��h�����7��]��
�E(sPl��_�w吿d�g�����dgGLsq%&[�T�A+�XA:&r^��i��F��ǰi��#���#2R��?�&���|/���
�|7b�?���j[�q���W���<�ۗz�95����� �&�^$� ��
��
|���yk��x�%NǭX�v ����Td	ͨ���!�Ӱ�J���~R?6%�
�
I2
m{�K������؈�t?��?��L�x��i[q�0�e�Cfo��l�F�l�i�v���
�=՘��NRp�~�G���d��G0o�>������O�\��,̨�A��_Ro at 6�^O�X���	��y��j�w�[�E|��+<`����Y�'(�w(@g�)��ЀlN��l��#��Y���oO5�
+��D'�}�{��Tяo>��޺oטeZ���f�k��5f��%O�"ʛ�L4cG��إs��2�4C�w��22�����9y���kP�t��{->w���B(����4؋f"�]?����ɱ���a��ݯD���_�V�w��������/ou��J 
w�
��~Uw_\��D%С1i�b.�����94	�v�%;�v���
��`��:y�/
|�u��g�
�M�����$e��x�?�
aꀞn�z�h$K�~��I�G���?��>�a�PL^�
:)� T�ϋendstream
+endobj
+7661 0 obj <<
+/Type /Page
+/Contents 7662 0 R
+/Resources 7660 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7672 0 R
+/Annots [ 7664 0 R 7665 0 R 7666 0 R 7669 0 R 7671 0 R ]
+>> endobj
+7664 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [265.4109 668.1065 342.6604 679.0105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0056 574.7661 322.4559 585.67]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9118 545.1866 329.3621 556.0905]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >>
+>> endobj
+7669 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.6509 316.3922 406.1727 347.2364]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >>
+>> endobj
+7671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7663 0 obj <<
+/D [7661 0 R /XYZ 90 757.9346 null]
+>> endobj
+7667 0 obj <<
+/D [7661 0 R /XYZ 90 507.7022 null]
+>> endobj
+7554 0 obj <<
+/D [7661 0 R /XYZ 90 485.3904 null]
+>> endobj
+7668 0 obj <<
+/D [7661 0 R /XYZ 90 485.3904 null]
+>> endobj
+7555 0 obj <<
+/D [7661 0 R /XYZ 90 307.4258 null]
+>> endobj
+7670 0 obj <<
+/D [7661 0 R /XYZ 90 292.8555 null]
+>> endobj
+7660 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F97 1774 0 R /F67 370 0 R /F8 568 0 R /F25 348 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7675 0 obj <<
+/Length 2726      
+/Filter /FlateDecode
+>>
+stream
+x��Z[oܸ~����v�0���{����v��n�@�l0Pfd[��V��x}EQ"%�NP���y�sx��,2��GfϤ�H3��ֻ
<���]�nz	�K����g��L#��lvu��$(�����9!��Œ`����j��^/(���Ŧ�Wߗ﫼z��|����u� j~x�-v�%x��6�k���h�����M)UxN5[������U/gw
�2b�����;<��q����i%f��њ�v�2���xs�c���hĴ�	F4�j�d
�
�Ǩ�H2JAs�!�	�kNKOsK$	����ow��������
�|
Ք��>_#<#Y��궰:?
�rW��7�aoGZ��_�`���a�o�Hޚ��nW�;r_6��צ�n
�n�M}XP1Ϸw���|mP^&dg1�z�ϗ�^������a��3H*&
-HE�XgJ L��e�,�s4K�h��J#�줁�j��|�q]���/'ֲ�'1֧��Le����22����r[�o��UQU�j"�T �RI%�D	B�Qi�I ��mu06��<���X�S�2�;cm�]Ğ#�=��
"��bS��D�F�#嚙�#��;\O>5q�|�]�H�?��c�.V s�����������X "3�TtO�V�d/#
:�d�|�P:����=��{9�޿���C���r�ʫ.���h�2A�a
�T��/0�1�
�㭫���s���Hl��4Y�����Ƥ53P���*�N���[*XZ���@	�m
���3�q�n;Xa
ÎmʥQ�]�d�G���&��s >��ͳڼ�B�a�^UQp�w��r5���.�Mi����Ha����.]��g�>md�
���U�C [...]
+	�����?{����V� �@�"��m�,��ĩ��dx8��*R3�WzL���m�!,4��N��lF�3�cۀ],��y"�V/>
m�Z�0�4��.”h
����9���[�?G\�P$$w��d����p�Q�1Z�./+��_���
+
C����^?�z�u���i��[��I��)7g��)D@{'��0���_LW)�–�m�߂��ERÒ�C�1~Rr[s��+�Ѐ,9��w�)�,v�Xu73z��X�P�o�dW
�Ԑ!#y
��4V�j�G�~s]
v�G�c
����a����PZ���Ѻ*��t�RAdp�����Ȍ
2�/�RоA
���tW�D�!7�,������r+0ܗ���5�#dj
u��3�o���H��L�?d������p
�
��\W|����
+��T���;KL�D[9�$�V�d���\� TI��=Քm�DR��:`�_p�5-ֵ�͡�:�h6?!ζ���ykadO�Ch��P�X�2��".P�۲>�+씯
�R��ؙ��'K�ȑ�
+��N��gX;�)뉝��4d���%��;����=���`u�W�	c�џ��cB��D������R�ud~��B�jz�����
�V"���s{�#�_����KvOP�g(T�aF�)�#K)ԑy�=�'�u.�3l
Ք�H��D�C�W��L��L��R�vG�J�xx
+1��
�����G���#;�n�����o
�
�~��&���d��S��
�
ޭ�oƘ'�e"E�_z��A�IM
�D�8��Q��T��9������>�L�{@:���nx��K�"�Lb��R���>
�L
�c�a�Xg L�uJa�Gx��`�f�#����t
���ve�u����
�
{0�rz=5üm
f-Kx
�a�dDv�c�rj�r�U>3ou�:������v�G
#�c�G���T~.�h
���j~��?��?Y����
�4����Ɍu8�E� �����˷�G��<ԍRT9�HR�j��#2(D��Dк��̮'�:�e
�ct:�����R��X�H�S�8�*�t֟��&�"��Y'}
D�@I=�%1�z#�"�OAo����>[�Rz3�>�f��e���7�6#��+�mu�7���
�0�j��1g�K��1�u���
:@_
�b
�����QKEy��%�+�-�Gt��5P&�=	��O�c9⭆�:��>�_c�q�����a_pDH�g��(a��h�ˀ����4��ь����j���$���&�{���6����.����ZٖL�P��0����<���
�9 &Ͷ`&l� L���`H�Xhu�N
Y�N��, ���0�q &���0�h�|�L��N�+€���� L�y�_�R��G�4 &����`!�  �� ���Q  [...]
|��e5�}(3
��>�wB��Q��j�W������/?�E������}���\
46�6�+���XT��dP	���N�){��Z�����_��[��V�<6
y��9�m�
/�=���G����c�����}6Mc�
S��%���&���w2�U ˵���U�1"
���c�G&SDD�/�ϵ�endstream
+endobj
+7674 0 obj <<
+/Type /Page
+/Contents 7675 0 R
+/Resources 7673 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7672 0 R
+/Annots [ 7677 0 R 7679 0 R 7681 0 R 7682 0 R ]
+>> endobj
+7677 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.6509 674.7454 406.1727 705.5896]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >>
+>> endobj
+7679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.6509 387.4682 406.1727 418.3124]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >>
+>> endobj
+7681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.6509 116.3399 406.1727 147.1841]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >>
+>> endobj
+7682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7676 0 obj <<
+/D [7674 0 R /XYZ 90 757.9346 null]
+>> endobj
+7556 0 obj <<
+/D [7674 0 R /XYZ 90 626.242 null]
+>> endobj
+7678 0 obj <<
+/D [7674 0 R /XYZ 90 611.7281 null]
+>> endobj
+7557 0 obj <<
+/D [7674 0 R /XYZ 90 338.9649 null]
+>> endobj
+7680 0 obj <<
+/D [7674 0 R /XYZ 90 324.4509 null]
+>> endobj
+7673 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F8 568 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7685 0 obj <<
+/Length 2043      
+/Filter /FlateDecode
+>>
+stream
+xڽY[s�~���S+=Ɲ��I�i2�
�}99��%X�T"����P	ɮO��xD��^>|� �
��i<�D�4�r�>\��
����%�/�����A��FZR9��4H�%tv��<'1�X���vA�<���vA�ڿ�̦�W?u^��������m� j^=��a��Ͽ��M�.?�G�
�rm@)�
+ϩ�/�?^}����Lk�W�������
+#�����
FDk:;\q������ꟽ
7�� �=�
a)�)
����l�P��O�-�����Z?
L���#pf\R��d����ƶ*6���5�77�ɽ%�`���i��l��RK�k������
.��dHRλ>�ƴ���0Q��K���Ybr����;�vW4�y�D
� S9�
��5�>�{w�ڝk�bA���!wq���.
K��R\�\V是�妀�5}B
�چ���s@
�'4CT��N�؅�{��4
�0��� /k3!�NC���L�٬:�W���*/7+��M -L���>������h��z�挢Lɀ�C��
e�
,�1 ����y�v�iR�f��d<c�M!.U�^i,R^�gܧB�qg�ь W�7i�y��#�hVȝ��u[�+И�@��l&$F�$���@hJcJ�DSd
+a!]4=b�iM�܌g'�(IM?1���a�`�=a���',��������d�(�bĹ�ь�z/�N^=�a����
�`�7R4���#9R�������6G[C.�'1����8�� f�h����ޔ�v�2u
�
c����
�^jjD�4E�֘�F���[CviI9/
�/$�(�	^ &✱�� t�
�4�\F��V��S��ax�?5^�-v���w����+��L
���@R㞪�$�
I& �X"�A��n�ꭗ����/�/8F����b��6.�.ch�AA�5B�wc]}�ث�j$ѧ�̈́8�	
�o�si�^��ލ<���U��嶒>[p��0Plw�i�Ӣܸ\v9o�����Ƞ�dا�d|�Xr��:^�X^���Ʊ(�����c%�:���Ρ�ۤ�	��"ش�R��h�UQ�fk�IC�r�B��ڹ�0g���fuګ?%z
���"���9�����hkܯ�s
1�F-�mp���l3�s�^
H\������� �4N	�dxN���L���D�ϸ-����oM}��9[����@�k�P�|�b��)w�J�}�tM�H��^�/]�����f���nk61JC5�[‹饦��ԅ-��udLT�T�J���P
����ߦ`��n]�
�f���C'(-��M��j��
��х�Y𛻟�#%�:�
�����U06��('�w�2�	��q��"�
jLjp���� S$��sm
�x�hV�w�0IR�Q�â^'��
A߾�c1N4��]���D��i���������5�u~�`�!���N�Uc^�3�OQebJ�AAC��DH��wϩ�/P�Ĉ4�b���9Q�Ę4E�
)�JGA���|

��^;�	=܌�S��I at q�n��ew�S������C��ֿ۷oCr"�D�ۅ?l3�d�Q��&oC�lw�x~��K��2�0���k�S$,4Ol4"61!6)�W[��
��ޞ�m�L�ݽ6m8I�
��!� �T��*{��R��mz<�6��)����Z�
B�3=�9ްr{Ƞ��	�R�/�P�<h����M���/�Ĉ4�b#‹9�Ę4F�D��#~�
ΐ���a;��!��|!X�^�*[P�8��En����)�Z0�H;�
'
L�(�
+:��[3�N\8>G�N��P��6,ٻ(���"ِ"G��T
���y�;(�_�%��r&��$�
A&�Θ�_����ͭ�a���z6v7�jL��-��6���ay؝*է����X�Y�DP��
ɨ
�@H
%7��Y����x&��
�ΊN.O�Z�wm{���~yyA�=�űFE{}<��vq
�_{�w!{�^hbK~�$3�"[
����:m����,7�����)���+yendstream
+endobj
+7684 0 obj <<
+/Type /Page
+/Contents 7685 0 R
+/Resources 7683 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7672 0 R
+/Annots [ 7690 0 R 7694 0 R ]
+>> endobj
+7690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 503.6417 300.1613 513.923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >>
+>> endobj
+7694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7686 0 obj <<
+/D [7684 0 R /XYZ 90 757.9346 null]
+>> endobj
+7687 0 obj <<
+/D [7684 0 R /XYZ 90 733.028 null]
+>> endobj
+7607 0 obj <<
+/D [7684 0 R /XYZ 90 716.2211 null]
+>> endobj
+7688 0 obj <<
+/D [7684 0 R /XYZ 90 716.2211 null]
+>> endobj
+7608 0 obj <<
+/D [7684 0 R /XYZ 227.8415 663.4675 null]
+>> endobj
+7689 0 obj <<
+/D [7684 0 R /XYZ 90 647.0473 null]
+>> endobj
+7609 0 obj <<
+/D [7684 0 R /XYZ 184.9626 468.3352 null]
+>> endobj
+7691 0 obj <<
+/D [7684 0 R /XYZ 90 451.915 null]
+>> endobj
+7610 0 obj <<
+/D [7684 0 R /XYZ 90 342.6018 null]
+>> endobj
+7692 0 obj <<
+/D [7684 0 R /XYZ 90 328.3384 null]
+>> endobj
+7611 0 obj <<
+/D [7684 0 R /XYZ 90 215.0204 null]
+>> endobj
+7693 0 obj <<
+/D [7684 0 R /XYZ 90 200.757 null]
+>> endobj
+7612 0 obj <<
+/D [7684 0 R /XYZ 90 89.4414 null]
+>> endobj
+7683 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7697 0 obj <<
+/Length 1998      
+/Filter /FlateDecode
+>>
+stream
+xڭY�r�6}�W�)+U�0���N%�ͥ��x��)-A7��T��קA�o�lgj��$�N�n4�[$��DGJ(d�����3
� a:���+�����RDIe�W�	Jh��yIbb���aE�2)���aE�2?|��m���O����t�ÿ�Ŋ�e�t��UL^~8$e��;[O�lcaQJ5^R#V�<~�����L���Ͽ�h
�|���-�x��C��Sּ
�i���Sl�^CeK�.t �d��wGI�nW1c���ߗ�Z�O���*u�������@��U����YY�����&�:v��
1 at 2B��W�<�eY�H��	�}mTG-	t	��s� �2=�	E�Qd �B�v�bE��� 
�$��h�`�jo�C�$NI�
�Mk�<��b%D#F�kq6��>h�OZ L��$��$c����]��Gh�0f��t�4�o���Q��&8�8��D+=F�3 �
+)��eU�����i���I�!ݮ���|�Y5e4���gi��`z�S
��s��ȝ�_�q�'ӝ�k�K�@yJ6֏mS at Y�X֮ #�n�G�+5�
|��_�2lV�:|�?6� �S�>ɚ�����=4�b�W@�͡�!�r�д�0��	Q�=G�MhƑф�j�'c�̺N>��
�	�Q�!�k�{1K���������*-�eR�%�A��U���Ǫ1~��v�k�5�CZ}���0��ԯ����N~+fr
+���]��1<a
+��v��V�
¹�1��%X���
�XMKq�S�H�q��3
�H�m0Iv�i����NE��O�>�I��
�Ŵ����\���\�כ���oܿ��?B�?���
W
�3ЗS>�`]��ƹA�@2�j����`����o�`�����96�f}{A���n��e�l�n�E�g?W��&�s�ɏ֏B@�����'>�pSIU���/Π�lg�2�ݿ�A��9�N�8<��lk7/��`�mϔ�G&]�&]،RF�l�;��:�֫$�3\c�	d��%��P���"����E��s�\���z_�����Y5��4.
o> �(�!�;6��H��Ie�����S��F�����lj}�@8���w6&��]KJ��<x"��,b��0����q�wb�Ԋ��"3�9�Q��$hAp$�J U}�B$Q૔ʀ\hy
�
1�U����5e�U���R-n���kֱ���&$b���!ٜ�
��Ję�|�Y(^�<*?�����e
+��x�ࣩj�;Ռ[-�0�	,��Y�)a���[y
+��lX�_#]����|�\��Tr��1��$S fn�������V�?!�̓�J�1
�� m�(�0<6�G�"��e�n��)|_�CHɟ����]%�j�������!���޶� �/ol�H���s��L��� 쏴�a�J�l�4��^d�0A
Qꇛ;ð��Sq+I��1܈uW�a�Lvc�Fj�m�a
+Ӳ�����1�>'�Md�p�0*n�f�R���,�j������sv
��b�F�}��YF.�����LL�5C���ƅ6�Z��ѷ��V���d�
�����^�Ia�"���gq�A�p�E|���g}ǵ�-�Q1��&�c��ABO��Bhc�ېr�*�.�\'�U�*㶪0����PV�1������;J��d
+*ի^�c��Lu
�&��49���i����5t���
������e�����˪��+s�%ԕ�
��Z�q��X5��L����U�X���.��-
+o�
M�1���2�J�A
�,�&��Ũ�����5n<
~iஂM��8r���G��G7��gC�\J��^���\ѝ���
\�N��oi���\�H�sr���|�Y\ZծI~*,U��3�
�C�mT[=���Q���E�����EӒ씚�u����:��ݽ���M��Yz*PZݝN��!.e�����X/n�FXz�s8,Ra�òkR�c^s�

�^�ȏ�U<�/��endstream
+endobj
+7696 0 obj <<
+/Type /Page
+/Contents 7697 0 R
+/Resources 7695 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7672 0 R
+/Annots [ 7704 0 R ]
+>> endobj
+7704 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7698 0 obj <<
+/D [7696 0 R /XYZ 90 757.9346 null]
+>> endobj
+7699 0 obj <<
+/D [7696 0 R /XYZ 90 733.028 null]
+>> endobj
+7613 0 obj <<
+/D [7696 0 R /XYZ 90 626.7728 null]
+>> endobj
+7700 0 obj <<
+/D [7696 0 R /XYZ 90 612.2892 null]
+>> endobj
+7614 0 obj <<
+/D [7696 0 R /XYZ 90 522.3375 null]
+>> endobj
+7701 0 obj <<
+/D [7696 0 R /XYZ 90 507.8539 null]
+>> endobj
+7615 0 obj <<
+/D [7696 0 R /XYZ 90 407.9495 null]
+>> endobj
+7702 0 obj <<
+/D [7696 0 R /XYZ 90 393.4659 null]
+>> endobj
+7655 0 obj <<
+/D [7696 0 R /XYZ 90 205.7324 null]
+>> endobj
+7703 0 obj <<
+/D [7696 0 R /XYZ 90 191.2488 null]
+>> endobj
+7656 0 obj <<
+/D [7696 0 R /XYZ 90 89.4414 null]
+>> endobj
+7695 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F10 488 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7708 0 obj <<
+/Length 1849      
+/Filter /FlateDecode
+>>
+stream
+x��Xm��D��_	�&����F�
+�
���V'7�\,
;������:~�\[*�	�N����ٙg��1�c�#s��J(����a��w�����+X_����]=�b���T�ov�I����o��� &�+�1^\/	^��!��^R�(��{���۟��UZ�_�_�x2XZ�dQ�x�$O��]�4;Ӯ�bc�n���j�|s������\�$���9{�Ϸp�g1���=�`D���ÌSn��o�_;=n�}!�A��x�2��`�Wb��MY���K?��TiSV_��z�����k竷�9������Yqw{,���}��b����-i�q����SA{v[1�$�{i�SU�(�>0�ni�n�~�rWVN#�{�8����*|�1sBR��8�	�^��gu�4p�&�y��ܞ���z̒�Ż�nj4G"&��K�P��xh�Ъ/5
o�
tI�bpk���6\�]��&�"�(�n>1���Z��^�<@�0q�jͨ��z�-iVܚ�rA�P� {���1
x
iEFF��rI���b�Q�)48 R3��`��D���h[��xdӣq�e{A��&�_#�-����s��-�-ƘXdȠp�s��޸� �
U���3|Ȁ�!�
C����ؚ�O���:+�N��o�4"�VL#�,	q��P#���b��<Rf����߲J�߶z��d�"��ʓ�쬅������t� �1A2�!0��9
IPB5���
�	�ِ�F�ZgŶQ��lM�p�Y�ah���#�
�D�'�˿ʊ<+̛�`�$�dȤ�����%@$:�gn��
�Ӥ�6�F�D��щ�S���>��%x.!��'V�S�Q��Ծ�Z�Z
&l�%R(SHpQ���T^�Wa���wթ\�u��30��)
+�#%���q (8g�QTV�we~����r7Z���E|�_�4 ��x���.W���||��m�@��X�4�اU�=q�4#�f`����?�4
*��Wi�/3O+`�O�o�mh��	?=�s�|WnN p�I�9�
1�I_?
+�r���n��ڣ
����G�<{#}��(W��<~
�>�t���n�:���T׶��
hY�s�*	��U:*��w"X�y(�1�d(T�~A��	�2�W��)ZƘ�Ug�@(�B�˩9��@���B,b��QԠi{�$]����]�|j��ތy����"v�
�DTryt]�|c at ATC�1ȷ��]jU�!L�`���y����q%
�
v'G���<��Ěh�!|m~��j��@��st��k��gm_U�2��H_zC�ޜ�ܷ��7wnt<���èj��<w��1��
,��YG>
0����/!��Hy�
���wZ�xQ*�%^��=�]'�Mm��
lz<�h���!t��l+�b@����>�D?4�)��Qe*���uZe�����a]�ځ?|�p&���x�i㋬�䧭�ԍ!�Gt��$$D��=@w�!+��e�V�:��g��T�����(A8����Z;�إ��˼�c(ȯ�/D at 4�k����uH���s��H�@1zd�ޝ�L�j�K���2>}[V=F�f�]�
F���[�w����mG��;r>۫[�̶�[��+> 3�"AE;���u;S�w���gh>�+at���'j�
�[/��y�m����U���>��|)a>#��
�yzԅ`bX����w��n~�M�ȶ�t���)|��m�c��� ��ce��u-�[1L�f�a;i@���zɭ�х�
��
��n�S��z��
|�4������=���Td�
+e�����.�1$*@n`�(�:��-�s������.7e�Ñ���&�dе�#���
+ߗendstream
+endobj
+7707 0 obj <<
+/Type /Page
+/Contents 7708 0 R
+/Resources 7706 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7672 0 R
+/Annots [ 7715 0 R 7716 0 R ]
+>> endobj
+7705 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1NNC__Polyhedron__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 7717 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 758.00000000 150.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 7718 0 R
+>>/Font << /R9 7719 0 R>>
+>>
+/Length 7720 0 R
+/Filter /FlateDecode
+>>
+stream
+x��TMs�0��W��^TI���
����f��-��P�$tbH
m�����BC� c�ג�i��==ik��r��Q����+g�/���'|�uu��H�jG��VeM�d1��A{��j~��s�]�m�cp����s��"Wy��q�5fުU�N�����zw1j�Qu1{X��7��<�֎������i?<��~W���l��K�z\v��
>�Lp`������Dkl��;��(AJ�4Bʁ:&-�^�Q���B��@h�`�u�$� Q$F�\@
+>���r�����	�ŸK;f`�y�Cv:���=�M�v4�.��r�����k����2�
�D���FN�,ꐒ��=�@��$��_�Vwb��&��8�;�S0���x����o*�Ф�"����g�}Oi1�^�z�&�6X'��x6����AĉP�Tڨ��v��D��\(�X�Џ&_r\�ٷ0��!,� �Q�e��h '~���-b��;���
7��J���vV�L��n
�����$��X6��|����<��}��iݎ��(���;� �Q����{ �7��Y4�s.� u&���5���8I�
���+�x� �V'�]}�w�����8��7��
�]{�Y���������;M�#MM& M�x��t�s�2����endstream
+endobj
+7717 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142739)
+/ModDate (D:20080908142739)
+>>
+endobj
+7718 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+7719 0 obj
+<<
+/BaseFont /AIXSTO#2BFreeSans
+/FontDescriptor 7721 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 778 0 0 0 0 556 0 722 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+7720 0 obj
+655
+endobj
+7721 0 obj
+<<
+/Type /FontDescriptor
+/FontName /AIXSTO#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 7722 0 R
+>>
+endobj
+7722 0 obj
+<<
+/Length1 56888
+/Filter /FlateDecode
+/Length 7723 0 R
+>>
+stream
+x���������e !!=K !
X˒e�*�!!�PB:��z
x��6���{���{���
!O�>im�a�����3��7��wα�%H� d� �&Z�Ϝ���wZ��
�{s}��[U� �i_Pm!FS��
�/�U�
��|AH��|��˵�/	⽚1��V�5bO��;�����ᕷ�Pj���~Bk�Л[�7lW���]-�\o~��?���2���W�TO}n��A\s������i�"�ҿ~��Qc5Kß]k��d��x�8��	ʳ��ז�Z���
+�^�\��Nq
t��G��ĺ�*�B$g at g��ȓ�s�@�]%\j�1b,�9����N�4���N��NÉs�S�B��&�&���+��Cg	��:G
'���ǐO@�[Q�B_�ؑV|}�W~�>�J
F_
��g6��"1��'�D��#���b�-�F�z�i�Ƒ���
Os�������ӵ�9�V�W"��"��Y�D�wU$&D��7P�wV[��Vm��g��4Z�r>�2��Y]�+�[�R�#W�)��B��^YE��<ߙ���m�;����^�"����K��E�&�D�O�Co�䤥�J
��$�{��QǤWT�XuK�|K|Bk�$D�A{��
�Ş$��HD��\��=[�
+-�Xb�gY�]��I���0k�[����W���3�
zj�$/3�2�e�
2�ߵ8�=sM����k�n�Ż
+ڦ�]^Q9�Rk���O��v߫�����i�l_�=߼�L�����.xe�{WS}��C��z{Vw����o)u�T�{*-�^k�x���+V�
-���y��jK��2y����b��+�l��V�io��Ӟ/V�^9�^UoxN"&z�-����^��'��'zЍCx�g��&���z�]��M�8q�
������؎9���0���[l�=��k5���m
HɃ-�
yr�?���v,y�Yk���kO�6��
��kג
+�c�����-m��¢�
�Z����UZJ
�e���-��^-
�.ϻ������i%/}d|��W�<��s~Ag�����¬Y�
9��û��҂n�=����S���
r���m~L{!��W��_�>ϧ6�{�w#�Z��9R�՞��+9��*������%O�D�?��~��H���,Xc	���	��K�˕1b���G+x�q$��21�X�X�X�X�X�X�X�X�
d4�1ƛ������
�
���,9�
d��A�^&I��-���N��h����[x
e��y3D֛ғ���)
l�5��^�L�:b{/S����l/��!v$v"v&v�8o7bwb.��W�k���C�C�{�ӈ/�È㈣�s�+�K<V=�x�8�8�����8�8�8�x�#��󈫈_�_�߈��k�'��=
l���a���	�)�y���%�#��Z�e��E�z�� N$^#^!^���k�[�H��z���ug����=�+�Y��u�B�+o��f��ľ�>�
ą���~ފ�@��;�.�%9�'R$%�b	)�
+��1�_���$I�@�H�$W"W&G���������k�k�k�k�-�hr
r
9�\�\�
G�On at nHnDnL�'�"^''��V2Njd��I�L�&�"-r�	�)��1��9��%i��&3d�t���V�rkr��Fr*�-9��NnGnO� g�������bo-�)�9�ܑ܉ܙ܅ܕ܍ܝ�K�A��6��� �d'�Ev�=�<r>q7Y {�"Y">#>'��=�2Y!�d?��\H."ȽȽ�}�}������Ƀ��ȃ�C�C�����#�#ɣȣ�c�c������ɓȓ�S�S�����3�3ɳȳ�s�s�����
�
ɋȋ�K�K�����+�+ɫȫ�k�k������ɛț�[�[�����;�;ɻȻ�{�{������ɇȇ�G�G�����'�'ɧȧ�g�g������ɗȗ�W�W�����7�7ɷȷ�w�w������ɏȏ�O�O�����/�/ɯȯ�o�o������ɟȟ�_�_�����?�?ɿȿ���?��_�6I)����8��J�$J�J�b�0j85�Z [...]
+U����Bj5@�E�M�C�K�G�O
@
H
D
L
B
J
F
N
A
I
E
M
C
K
G
O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O]@]H]D]L]B]J]F]N]A]I]E]M]C]K]G]O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O=@=H=D=L=B=J=F=N=A=I=E=M=C=K=G=O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O}@}H}D}L}B}J}F}N}A}I}E�M}M}C}K}G}O�@�H�D�L�B�J�F�N�A�I�E�M-����P�z	��)����9��Z�%Z�Z�c�0z8=�^�^�
I�D�L��W�W�W�W�נפעצ[���:�z,�.�
=�^�ހސވޘ
OO�'ҭt�������M:E[�$zzSz3zsz
zKڦ
:Mg�,�ғ��)���6�Tz[z=�ގޞ�AϤgѳ�
�9��N���.��n���\z:G���t��;�.��������K��G�I��
+]����Bz=@�E�M�C�K�G�O@HDLBJFNAIEMCKGO�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O_ at _H_D_L_B_J_F_N_A_I_E_M_C_K_G_O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O?@?H?D?L?B?J?F?N?A?I?E?M?C?K?G?O�@�H�D�L�B�J�F�N�A�I�E�M�C�K�G�O@HDLBJFNAIEMCKGO�@�H�D�L�B�J�F�N�A�I�E�M/������2C2C3
�2
�3#2#3
+�21f3�����ȌdVbVfF1�0�2�1�3k0k2k1k3-�hf
f
3�Y�Y�Ǭ�l�l�l�ľg&0�V&�hL���I2&�b,f�	�)��9��%c3�f2L�q���V�fkff*�-3���l�l��`f2�����
fGf'fgffWf7fwf.��cژv���3�L���0��L��e�L��c�d�L��2��f!��`�b�f�a�e�c�g`dbfaecg�`�d�b�f�a�e�c�gN`NdNbNfNaNeNcNg�`�d�b�f�a�e�c�g.`.d.b.f.a.e.c.g�`�d�b�f�a�e�c�gn`ndnbnfnanencng�`�d�b�f�a�e�c�g
`
d
b
f
a
e
c
g�`�d�b�f�a�e�c�g^`^d^b^f^a^e^c^g�`�d�b�f�a�e�c�g>`>d>b>f>a>e>c>g�`�d�b�f�a�e�c�g~`~d~b~f~a~e~c~g�`�d�b�f3�0K�Y�%Y��Y�eY��Y�Y��Y�U�;�
Ύ`W [...]
+�5�
;�ݖ��Ng�c�gg�3�Y�lvv�#��3�
�+��;;�݃ͱml;����N���f{�y�|����E����{�e��V�~v��]��{�{���������������������G�G�G�G�ǰDzDZdz'�'�'�'���������g�g�g�g�����������������W�W�W�W�װײױ׳7�7�7�7���������w�w�w�w���������������������O�O�O�O�ϰϲϱϳ/�/�/�/���������o�o�o�o�����������������_�_�_�_�߲߰߱߳?�?�?�?����������������%�
��
��
ñ
������ɜ©\��
�Fp+p+r#�����Q�*ܪ�j���ܚ�Z��\
7�[�Í������q�sprqs�	�D���s��t���ɥ8���m�m�m�m�m�m�ٜå�
��\n2�7�ۚۆ��m�M�s�q�s3���,n6�7�ۑۉۙۅەۍ۝�����6�����\'��us=�<n>W�z�"W���=�2W�\?��[�-������}�}�����������C�C�øù#�#�����c�c���������S�S�Ӹӹ3�3�����s�s���
�
�����K�K�˸˹+�+�����k�k���������[�[�۸۹;�;�����{�{�����������G�G�Ǹǹ'�'�����g�g���������W�W�׸׹7�7�����w�w�����������O�O�ϸϹ/�/�����o�o���������_�_�߸߹?�?�������?��_��I��i��Y��y^�E^�e^�U>���#�����J���(~~U~5~u~
~M~-~m��ͯÏ�����������
�
�������~"���y�O�:o�I��S��O�7�7�7�7���m���|���.?�ߊ��o�o�O����������L~?�߁��������������������s|��w�y�����
~
?�/�|�/�}��|���U��_�/���^���>���~������A���!���a������Q���1���q���	���I���)���i������Y���9���y������E���%���e������U���5���u���
���M���-���m���
���]���=���}������C���#���c������S���3���s���
���K���+���k������[���;���{������G���'���g������W���7���w������O���/���o������_���b�~	��@�@	����	� � 	����	�
+Š�Ha%aea������������������"���c�u���q���†�F���xa�0Qh�&$]0��`
+)�&	��
+�	�
[[
+��i!#dW�,l%L���
+�
+ӄ��v���
a�0K�-� �vvvvvvv�
+{9�Mh:���)t	�B�0O�/�^�(��>aO�,T�����*qq;��O�B�J<*, "
"
+����DŽa/aoaa_a?a�>�~� �@� �
�`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+��J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�
�;�{�
+��G�'�g��W�,�7�L�{�w��O�/�R�o�$a��D�W$�sDR�DZdDV�D^D��\���S�SEYTDU������qqEq�����8J\E\U\M\]\C\S\K\[lG��cı��z�8q}qqCq#qcq�8A�(��qQ�.bR4Ŕh���M�M�����-�-E[tĴ���+N���[�ۈS�m�i�tq;q{q�8S�%�w�;�;�;���������s�=Ĝ�&��
b^���n�G�'�
b�XKb���X+bU��
�E‸�����������x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x9q�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�x�������������������������������������������������������������������������������������������� [...]
+
y���Ԥ5�Ԥ'h�)��'�Ԕ���y��u�ue����7\t���b!W��i�����y��
ej�_�4P��T��L�������?_�~Z�|1h�b���T��
:[���.~:*_B��/�B���_�ʕ�{
���Z���f1��f��P��aFC93��*��g�5ceP���=����fW�v�U��j�#g
�t�lԥu�
ԥ���rO���}����_��F��c�̩�qa��S�>0�s;5���΃�w�He
�bW%�]�2�Z��:���4!S��
�@�!3�YH7��-�[���k��\
�p-�Z���k���ӻK�"[�}6u��m��
l�6�m`����m���eg������� ��l��
`;�v�� ���z:h�4�7
�4���K/
�4���K/
�4���K��i�5
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,�����`�w�V�g��z�Y�g��z�.�]��@w���E�]๖d�2E0�s����@��A�^)�*݁^��R��V�8����!
�$�	��� mH2
���B�����?�8����?���̬����Y�պ
<��A�

ꨡ�ꨡ�ꨡ�ꨡ|
�'P��@
������o�����
�g >���@\�2��x��K,�%��^xI�%��^xI�G�O/	<x&�L��3�g��	<x&�L����z��7�o����4����_�Ki�/
����4����_�Ki�/
����4
��/
����4����_�Ki�/
����4
�6pm��4p���axA/h���|�!?k���U�-�{�M�sJM��%Z5�_��YtH2	iB���Ri~�����)ҁLCf ��A�	��I�$�|�@>I �$�OqDOAZ���?�8�K�%	
���xk��|��p�2H4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I �$�h	��@�	��@�	��@�HH	$�F6�	���L�Y�Z*�*jGO����T�+�.�u�|U�K�|!ߓS�}�
o�雅l����)�{{j+��bv��4�7�8�����X�q��
;9��� 0o���ٻE{x�nOcj��6�������m��Q��S���
{xD at m�C��.�3{�zs�\?�h��{��w�JO c[ʔ����1��rQC(������������hP9�y��V��Z�؎|���Q�W�j��U�j����~�
+~Ղ �4U��x�)�~t���Uj������^
�O�y�k��z�l���J}�[*L�T�k���V�z����@�
+.�5���*�:{z�
9���4-���fDZ2��HKE�j�
[o�D�+�G�ƣ��Qi�4m0�(b-�X��Ԣ�(N-*Y�J֢�Qɉ��DTr"j�D���0F"�HD�C�0�C�0�C�0�E�0�C�0�����HFO$�'����	3�ʌb1�X�(3*ٌJ6��ͨd3*9���ꛊ0RF*�HE�#a�"�T�aEV�aEV�aEV�aEX
��`[
�bţ���i�nMD�
iF�%#͌�T�Y��F<
aEu�G=��u��t��t�������	�O��H�_�
+I��
+I�$z1b��c��c��c��c��c��c��c��c��c��c��c��c��c��cW�cW�cW�cW������ ;{
;{
;{
;{
;{
;{
;{
;{
;{
;{
;{��|��t��t��u��u��u��u��u��u��u��u��u�
u�
u�
u��u��u��u��u��u� u��u��u��u��u�	GcJ� {|
{|
{|="�����������������YD�N`��c��c��c��c��c��c��c���
�]��]��]��]��]��]��x�t�t�tFB�4 ��&d
+2,džt Ӑ�,d���B_�|
�:��?�|
�:�u���ׁ�_�|�
,E
�
�
�
�
�
�
x���76�76�0�'6�'6�'6�'6�'6�'6�'6�'6�'6��M{d{d{d{d{d{d{dKnKn{d{d{d{dKr{d{d{d{d{d{d{d{d{d{d{d{d{d{c#e�3Ջ
��EF�i���E~�H�#͈�T��ѳ�Ȗ�l��D����RRz��EO�F��I���%���i�H3#-i��i�H�"-B5#
3�0#
3�0#
3�HE�#a�"�T���0RF*�HE��fk(�dR�4 ��&d
+҂�!
�4d0FM��M��M��M��M��M��M��M��M��M��M��M��M���x���
愉���_�|l�Ml�Ml�Ml�Ml�Ml�Ml�Ml�Ml�Ml�M�x9�D�7��M�x9�D�7��M�x9�D�7!�
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��
oa�X'Ɖ�qba�X'Ɖ�qba�X�ayd2��
�ca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X8�p
d���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
���8��q����������5��5��5��5��5��5��5��,oa�`a�`a�`a�`a�`a�`a�`����Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z��Z�2������\���k�)v���e��_Y [...]
+
���D��#�=V�Z��/�j>�b�o̅%�o�r>_��Y���:{��+=�j�+���|OWw��P�)�kE{a��c�W�rJ-���|�jtQ��*�.����|�} ^��_$�/�au�|��֗��{���b��6������c�wl�
ޱ�;6x����<b�Gl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x����a�?l�
���6x�o��
|a�'l�
~��
6x�/���`#����6�<o#����6�<m#O���6�<k#��ȳ6�<k#��ȳv2,q#��ȳ6�<k#���3��3��3��+��+��+��>�ƞ����6�O�qbf��C�o��8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1���8%�qJf���)��S2�d6N�l���8
�q*f�T�Ʃ��S1�b6N�l���8
�qf�4��i���0�a6N�l���8
�q
+f���)���/�_6N�l�z��P�<�1�8c�q�d�����3&gL6Θl�1�8c�q�d������� �9�{򞃼� �9X_;�w��� �9�o򛃼� �9�g�<� �9�G򑃼� �8�;�|�`}� �8�;�|� �8�7�u����`
� o8�Ў�7
�
y�A�p�7
�
y�A
p�
�y�A
p�
�y��I����`�;8
w0�
����<w0�
�o����v0
�_����j櫃y�`^:��N�
�O���鵃y�`~:��槃y�`
:��桃Sg���|sp��`�9�o曃�bg�Ά
�
;8vp�F���?i�O��F���?i�O��F���?i�O��F���?i��4�s�9�~K����4�-�~K#������i�g��F>N#������4�1�~L����4�Ry)���F^J#/�����Ki�4�R:�K�lpn��8����!
�$�	��� mH2
���B?�8����?�8����?�8����?�8����_�|
��5�k�׀�_�|
��5�k�׀�?���O ?���O ?���O ?���O _�|
�:�u���ׁ�_�|
�:�u���ׁ�� �|��
��7�o � �|��
��7�o ?	�$��O?	�$��O?	�$��O?	�$��O��	|�&�M��7�o��	|�&�M��7�o��
�1na ��/�8'|kD\j�s)ী�~
+�)ী�~
+�)�P
��P
��P
��P
��-�[���k�\��(�F�6ʵQ��rm�k�\�ڨ�
��z٨��z٨�|��
�;�w�� ��|��
�;�w�� �~�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��
|7��L�_�
+t�.�]��@�a��`i,킥]��
�v��.X�K�`i�5,φt Ӑ�,dP,킥]��
�v��.X�+�`e�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,�j!
�v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
�u��.X��`],�e]��
�u��.X�˺`Y��U]#,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���)ी�^
+x)ी�t��.X�k�`M��5�T����5]��
�t��.X�k�`M��5]��
�t-�=]
��-�[���`W��]]��
vu��.����`W��]]��
vu��.����`W��]]��
Vu��.X���`U��U]��
Vu��.X���`U��U]��
6u��.����`Sl�M]��
6u��.����`S��=]��
�t��.��k�`M��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M���s��t��.��?�!?��q������h����i[�;��:0��ɸ����_�w�*������S���j����r%�W7�Z"V*�~��/�|90'�\oO���j��T�C�xҀLB����_�^��v�`�R�:���D@�� 
���Q��/_�)!3�Ծ'
+�J�ˢ�B��,
+u���(��;�
�}�]�0z��A	^�#��0����T���A�A�At�G=T� ����|5�ώވI$�l���E��7�L2�*L�,��W��0o�$㉀=�	�3\�%�'�,9<iCKV������“qH %��|��r�赝�T�[�7 i � d�ƞ�E�������"�Z��7,.�\0��I��DhI���'uHēD<IēD<IēDS$�I4EM��'�o��	|�&�M��7�o��	|�&�M��7]1W.���9~����$_�k���(-,Z��9"�:��vO��uyY�E%pn+�
+�‹�>5T�"#�Z�х_�Q-��
+r~QO�K&՞\A���U�q.x�o^���B���3��G:����������un.4�ů75�Zӓ����/�T����0ZJ_��W*��/0r6W�*�B���=W��D��$�)VkY����z����
K
���dV�v{��Y*��JOoO!��WӂU���\Oj���
�A�d��C�o��"^�>�U����B���
k�J�So���WP=Ǿ|�_L�cH��J��x�Z��Ej[�v�`���	3�MO�o0Z�5C�ΐ��!
�$�	��� mH�+����
dҭ9$
���'5�D�A�s@q�7kz�b�#��C��1����p_CB����4��di YH����4
͏ YW "����E񪵆W�=�G` �Ż�޵�𮵆w�5�k�I?�� D�����5�l��ek
/[kx�Z���^��𲵆��5�l��ek
/[{������h:#
*����-�ьй�
:'R�O����
}"%����4,Y
C�#�d=�G����q#�`TFh_[��>?h�9�F��U
���h�9e��w��)4���*t��G���ޮ�\
���no-���|��@�^:��l

l��-�[@�T�LC��劝=
}t��q[y�
�3�P�6���)o�I������`��%����_���K�6�@��R��C�A& 
H2iAڐd2��tЏ'�
y8a<:���?=�KB".
q�KG\:�����tĥ#.q�7�o � �|��
��7�o � �|���O?	�$��O?	�$��O?	�$��O?	�$�M��7�o��	|�&�M��7�o��	|�&�S�O?��S�O?��S�O?��S�O?��-�[���o�B�ʳ�g�φ��8m�i#Nqڈ�Fy6��r��8m�i#Nq:�w�� ��|��
�;�w�� ��|����O?
�4���O?
�4���O?
�4���O?
�4�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,���?
�,���?
�,���?
�,�]��w����
|�.�]��w����
��$���x:���d�p�dx�@�!3�YH7��x2.t���C��u��Km��S��;��N�����럀�x%��+Q.^]�d6��Q��O]���I
2�C��(1X�z29����'9V�LQ+T/H�xAʓ�!��!��*�*�(@G
;ha-젅�*��W�\�B���)O��:��Q;
��(_�~��
u�C��n������S���D���E�*��}ݒ�zy_��o��7�}]�_���>�ו:=.�G��A�_���u.�A�0��/`����{��5h��
ԋ]�.��� �@�+eޠ˼�R�jկ
�:�������.�=]�@
pǠZ
T������mu��Au`P-����*uqT*�.uj�G�\���r�B
/�7^���
��:�
D��{���^���q_���ڝ.��
+
�0���y0T��"�J7L

0y}�j�
"U�;
�C��CM�k�>�B�6ں��+�o/\�R	c�Tp��Gj
J��Ezz������X��{~���\\
�C�H����X�$P���"J�,�ToP�a4��`d�_=���`8)j�Dp� Y��
{��}�WO	��`����:���kW��s]�	9���.����U{0�¤QS�j��h
n{	#�/b���K��-Z7�ׇ�
+�t��y�i^7�m�/�P
ֽ�`��`��#�P�b�hA
+��С�#4zZ\U��P�G>уEtE
\�e��X
+&��*B��Z�����Ad7

A����"
31
1
�#��#L�
����x����b��b:c�ԥ�����a;
f��5��P
�m1�Eu9��G�+F��3ŰvŠv�f�"d6���*?
�?���>�^�"d��९j5Ld$�y�A�mQ�msQ�6�c[��C!L~A!�H;�a�{�v@q�&�>��O��V��7ȳ��-�E��ېl{����
+���0����`D�aQ�{�p0���W!;B�n�`@
+�DQ@���AB�)ݡ�*�P�
�B�
A6�)h�~J�tT"��r�b��z<�	fy����vNM���ꈬ7��f��'��2H�07������%�(/r��Dӭ28�*ါ�-�
+Z]]��V	��2�O���k:��ZCl
�^���;�,�A��#�k
ɭ
�.e��%ma�o
|[�|ېY�2������YS�)�ph��3m��ҋg{�%M��"S<�m�xlCs�t��P���:.��f,��~��Q|njxQw�P�Pwk^�S����ߪF�Ԡ��b�6��1SG}

Et4��X~�*j�
�>�g[/���:�a��Q}�a�-u�P��i��jkx������)5u�j�nx������V�
�|�
+�uq�[���/�� 9TQᕆ0*�
m_ˆ
7�
+
��Vp{x�uJ���s*u�S	;'���t��ҕ�J�#��
���;�R�
�薿E��q�J�� �[x���ж�C
F
P�
+
�(����1qLź[]��WŮz���[�
e̫�5�����+/	�ʟ��W/1�ݬm���)�V
+m����Ȇ[
E����5����jk��[1PQ��(ԗPi��7z�
.��冫�{r4��cik�m�R
v���ۄ���|o��	qX�H�BE�Rfm�

�@�O*T,(��P	
Li�=����庿e�]Ժ�j�~�=7���O\��8�i \�
��ªX���
��[����f��j�0�
a����~�A����E�_)���DzB�5�Zk�1x\�[C%
����VmB�mA%0�&��z��`
�1B%*f��=3�k�bx�B�N�ݥ
�'�V�<��2'��wq3�x3��o��@���
ㄾr���h�<=��	
r���#�lRFܮ+#���e$��2
g�2�!=��e�CF�Z����;q���2j�q�R�V����ZǛ�K�Gj�
P�p at 5l� ��̘jf��@4��K���G2͌���Fg}�![P�5s�
H�&/��f�LXN��z�f�����s
+=���
q����֬G�l3�۬��!��f<�I��f͛hּ�f#8�l'�5b��nL�h�Dkrt��jR�Dkjt�k2�C�֦y�q�7+#^�)���;��
�

�6k�xz��z�&��0��2-3�GvHw(�������
�Ck�Gi]���^"�*����B�j6��q�)�jZ�$�d���>�Z��7<o��[�k�ׄ��̺�fYi)c]
cY*�����P�B%*z���
3TR�bm��TFM�e[><���%.C��T3�wC�EK�\X#����k`�50��Ѱt�M�=�	����1��aD�hXQGF�nE�H�!&��a��0�p�-�J�H	S�[��[�(f�h��f�h�6Y�`��
M���íV"���-gY7�Yn��4�vk3c���=/��ih�
��2�u��
�c9��FZ�ǐK����p�-�#3�ǐ���
���
��P3]o��X���KōK���2�O[���rhC��6d�hCo
��Đ}2c�d�i�Dh���T�l�Ұ^h�Ѱ��P��@��/;�f��ղ�����o�p�U���.�隅��Lb(��6��QT�=��߂J�����2����,�4Z>�h4bt$�Up�
��T�j� �fƆ�h1�]zɱL��r<&
9o���D�ܗ3��������v7��
?������a�I�R7�^����t�����͌f3c���nfL73f��M�v��QoflV#�Y�v���f��N3c���jd7�����h͌���4��Ӭ�fuw��ݱ�,5B梸�ML�9�Yw�mf�G��vwZ#cįKw
+��k�;Q]����F�^z��n�7�f�/���o���������U�i7-���U���U��7��rw��U
&V
+
���.�N���fF��8z�yY�Uw.y,;�p�8�	}�je�L��G7z6)

�e{�xD������Zw�n]���R7�˻Y�
���P!�ɥ
�֗�����n�˹��w[H6���N�WU��૪�Œw�^�ȏO���o�����f�
��J��:�e��إ�A����ڛ1�r¯K�u=�-�]Z��lN���Wߡ�PM�<��P��̿�=�!=RCz�C�e9Y
C�a�=t
Cf,{9

�!���:C��2&Y��z|,5��O
Z�P	�Z��K�V;�
��s�8�-
�����y �'����Z�c!C4{,�OX->zH(L�h́���

�$>�8ZNt���r���n
���/��D<T�PI��*�P	�!�;���;ݸ^	�e�_����&z���
~m��Q�a�F�b��a�F�q7�뷨�fF��1��h53�͌N3c��1�̘mft����`�73j͌�fF���Y{����n֞v����5�ݬ��fMg7k:�Y��͚�i�tN�Vr���ӬA�f
�4k�Y�8�l��>Z��v���l����?��+7�#,e��q�]3zKy$�x8��F"T�P1B%*��f��">�Z��4x
k\������
+׆,��RW�\ʐh
Z���c�4[��X��Ү]�n�����M��D3#:��x�ƗcK�fF���if�43f��&F��.eԚ͌z3c���+���f3c�VҚ5�HZ�جA�f
�5k�D�I4�C���_�#����Y#�6k��f����Y˴6�Z�Y��ͺ5ެ[���p�Z�$ј��%��

3�i.�
�
2C�
���"�$�>�E�&x� G�
��
1��o���5��K��_�c"���5�=�ۘx��Jc����m���]_}� ��_d��cbE�\a�d�eŕG�Yo�zc���G���j�?���z=z���I�I[����ě�v�������Mgr�G�������$���G�5'�K��t�g[�~�K>_��e�޴���@�y)��#v��������Q+���܌
m�
1f
�scZ�y��5=�\u�#��y��C�%U�x���Y���l��%[g�FW�[

{�c?=�d����
~��
�'�np��O
{y}���i3�z�\u�7-���νh��B-�K�ɰ����+�
A�Q-ރ}�����̞�9�n�b�c���	r�����
�z�1w����	�h�/��J���W�Q��z��*9b�W+r�WoC�j6��a��MK6���!GUҋ�$��q����K*�ڏ����p��{�t������A�1xm�y���2nݱ#t�� [...]
�3����c����*��
Ϻ�[=��%��N����O�e�A<ݓ��"���8�*W4����5�?�}y�M,n�'��'g�y���w�H�S��)�Z(,�C���.oI��z�ٞi�N8��А��L�-`t��Ϛ�:M}cYO]���|svw
+�f+6�
�y
x��|)�LR
,X��{��\�e��ָ�_�kk�~��a�NJ�+���3��H-t
U����"�=�5$SQ���ڟRgj���šR���A`["���\% 	
����D
+g��L��+J�ṵ[��-6ը��/-����~�b�����2Q�†������>?ZJݺ�S��q;���oL+�+y
)-�S$si�W����Mb��L���X���K�T͙���7�U���m_�>X������4=��4�曚T﷞9�~_�b]\�`Ά��WOd%
ܤi���T�=F<�fD'���m�2��X��`񡒉��p?��v��~��s�y��JɆ.�	�B�H?q�CJ��b*J��}]ON��������%�S��c~���1		w�A)�ɬ�O��m��n�}���
�6ۘh��-��?2�Q�8$���ܐ����'�F���"�.5�Ց���p�u���y�`��\����a��<*�2�`��В�=�&1�T׮
+��Pd���
����:����h?~��ǟA��]����\*ӏ����}�w����j�4u�!Q�{��	����Z[���IF�K*{
�1t���h�8�x�T�~��f$��L&�}��gM�
`�`���-?��b�q嘣2��"\�9� �%�6Ȓ,�'
+�z��۴�H��Ƭr9�r���⭖\.M�W�
��o��Z���)Q���4�Lܮ+u��
�*D�������l����ct�5�0�Q��
F��٨@1<i��`�'Y�R�P
�t6h>��-)�v�����RS�
K���;}3=�`�{i4�(�-�J
+zI�tn*eՑ�~͝��R8ժ�d��sT_���>c��x�?�Ί�͉�_���$�Q�k_�B�.d~����u U>���{�P��dh`T|pN���%==㌶á�,Y�սtwH8
ՁUܧ�W+�9����O
� a��
���_��It
���M-�|��NvxB
+�����Ax��^b�
�^���ŵ]��Xs��ڇ�]p�j�:�h� �?L��xI��tл���^�
j
���s��p ����Ί!�x��qFg�
�3����6"��¢��(���B
ُS�
cPDv{�M��[�쩠~/���"�n��؃Gѿ� W1Gi�J�u����
�t'�}�Y	Hfڙ	f���@�D&@�  @�  @�  @���W�_�a�q
+$_ �W����S�Ѕ�(�L��E:��nڄ
[�32�1+�ܼ��BT\���B��O#��7t�?2�?�
��pL"GX3���šv���h�X 
�J|�	��d@[P:�@�07�,������P>*@�0/F%h2��_�h;�
w��������r��?r��ĸ��Q�����D�P�;��!���X�9B��0OE�=7*�>�X�o:	U���p��(�
_Cmn�!
C]�:P&�
5�:�y��V��
�j��������{�����Z�
��\��y�=�w��-�h�����endstream
+endobj
+7723 0 obj
+21289
+endobj
+7715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.9298 217.2968 280.9422 228.2008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+7716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7709 0 obj <<
+/D [7707 0 R /XYZ 90 757.9346 null]
+>> endobj
+7710 0 obj <<
+/D [7707 0 R /XYZ 90 733.028 null]
+>> endobj
+7657 0 obj <<
+/D [7707 0 R /XYZ 90 625.8642 null]
+>> endobj
+7711 0 obj <<
+/D [7707 0 R /XYZ 90 611.2939 null]
+>> endobj
+7712 0 obj <<
+/D [7707 0 R /XYZ 90 490.6815 null]
+>> endobj
+7658 0 obj <<
+/D [7707 0 R /XYZ 90 466.3125 null]
+>> endobj
+7713 0 obj <<
+/D [7707 0 R /XYZ 90 466.3125 null]
+>> endobj
+7659 0 obj <<
+/D [7707 0 R /XYZ 90 417.0712 null]
+>> endobj
+7714 0 obj <<
+/D [7707 0 R /XYZ 90 402.5009 null]
+>> endobj
+513 0 obj <<
+/D [7707 0 R /XYZ 90 304.108 null]
+>> endobj
+278 0 obj <<
+/D [7707 0 R /XYZ 90 297.5079 null]
+>> endobj
+7706 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F97 1774 0 R /F10 488 0 R /F11 416 0 R >>
+/XObject << /Im14 7705 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7726 0 obj <<
+/Length 3100      
+/Filter /FlateDecode
+>>
+stream
+x��\ko7��_�O^�i�����U�ۤ��]l��,O
��c%9���^�
ir�!ǑU,�!�����%﹗Cj��?22x��B�q9�̎����ሴ����Yxvqt�J��AFR9��X[�	J�����B��gc|����j6�|wJ���v���^�/�^�ƫ�'o�>�.�}����Q�O�ߎ������cU_����VƜP�N�����內��F0I,��
��
]C�~<ˆ-F_���1t4;┹?n�>
���i.�7�r� l�W(CX
+V{�����t���M5���ԟ_��'��b��������L �)P X"�4��c��N��E0�E�i�E���~���fu�^z�"�X�";�����
0�<�DZH���G�hc��8i�P$��V�=�������tV��0#.7�e��B�DDh���GP�7D�
�w�K�b��%�8E������Ԯ��:%�䦚W��|y[�M��q�L�1
U`��a��t~���������0SHG
+IGR
�
�ɁHP
�
+�{�R������FMP��0��ܡ����,�gw���V2�����|��O?[!�'���ER͖�m�����t���3���H3!
�m�zM(R��+��0E#����V�;���
T�
�@�
+
@�W��м	DzS
L�N㽎���Ԯ���RX������zS�:���b���G�H�!,&q<Yg�+Da��؁�\`;X7���lt6�}l����4���6q����
��UX��ul3�d�C�6�KP��Rl;X9����v���������
c;���v䟞zf�촛�gj|�AbwXXK[��w�GHP�adm��$ ��뗓an�%� �k��&6ȶ�����|y�I�*0��ɻ��
+$���K&b�w��6�oXۺ��o����9�7��ꔩ�j��o
M�QHcv@�P����ka��q
��h\�n���xW`�4.�O�~�P��i�v-���b�[�`Ę�yWxT����� �p|�-_�#�B�ޡ�Lx{�a˗�������_�m�\D�T��p.aU�Y)�
�
���#<��Gx�nh�gx��g�#<�O����
P�$v�����^�*�
X���w�DE�y�<�� �;���HsU�

U �-�1�b
K9�K�9�s����y��Q�����JM]Z�9TY����/sYj^�jCE��d�q��ą�)�0a�CJ�
��j�R�Y��
��
+F#PF����0L�뒐��$_�p�%{Ev`"�u�g/����k����q�!��|T�@��b$���;���

�
� �

\8���U,q�*����hVA\ȼ<�@�*�$	�t�}��T�~�����n^+��~�		a�p�Ţ�
�����I m����9�_�६p�!Ŕ>��1���}r++\`p�˳�
+��p���ePH�
����[�p{pB�N���×X$vk��x��,�
�<��>�I&D�
��S)Nv�s�eC���%��F�g��z���t��l��t�ljF0�u�
U���}�D:<&���x�����#�d•����j=��ͻ�^���ůYi��rگ�
l���
������X@�G����6�m Q��2��
+*�ū��p��4F\��ԡ�r�Kсv5
+�Ja�d�(���xS5�d*�S�8���o�E���=U[�.��x�����Z}>����a۞@����>鶧*5������
�L�a�1��LQ``����A��A0�������n
ϋ�i��0RZ�{�Qi��D�k�O��Q!�������v�R�����T�$$vjd��U�1Hc������L	K
+X�7�q|���&PyE�$t�����
�@!�@������@#
�I���m��Eh#�@=��g��]Y��OvP�hf�z`Pa��ٮ�
�����X=��r9!d74'dx�9!��=��S|�7>�g�Fj���YM�̆�*tߣJ�2;	u���h8�̑)�о;|�Cbw��1f�H��/<��ê�Լ�
�7P�0Թ=�;X�9]s�G�5;	z��n�3�y��*�'�ô
V��`�����J>j�P��/;
2���bK�;�P�kakuxCF�=�Z
s������Ȕ��n�u��8$V�{q���x��!(�":�}�J��+��Z<��
+j�ΐvE����<�sUp`���zg
�*
�a�/�8���"���Q
��x
����z�d��$
K��
��ً�){
���<4�q�8` @�D)q8X9qs�cG��G���e��a���ܐK
���q�O
y���@&q�s=C�Т

�6-��'���b>��I
@Zb�Ӭ
<*%�y�ѵ֛<@��&���r��6���b�&��P��M���?�v�����w{T��}�y
&w����~����{���.@ ��bu0
�#�2W�p^��b���*
!�b
	
��d����"vE7�3��@���WuaX
��x��:|�Fj��C�ea��<���>NP�G�ޭY�ֆ�n�����pa�Ϥe�T`�e1b1\�Cd�n���s��FN
�N�����|�ںc&��Y�#��I}4����Yr=��@&v#���#c+
[`pa˳���*l�����G����<���
�#n4s��ŗ�O����� OS]������ݣ
+�׋G�hgn�:$i�(��/�H�uf at rh�Th߾
+�(�:S {�f
�d������9��t�y��Oo���)��k
կ�����P�â�޺��&Ǥ-�ǘ�8#�nwX����z�!ʐ���
h<��u�D i�
5QHR����B��=��tn��x3�j
�#�v��F at P�ݏ�1
<��Oʾ��=�O�mEd��0����<�D4r��aZ���M����UE�]��v*�I[����\Em��5U��g�/�*^�*���3�C�.E��o0 �����ܧq�n8
�h�B��.'vm�?m6�'��_�|A�5��O�+4ݜ/���Ii��ꠊ�F�̃.��A��TXG\>�����v8�s�r6�/EJ�}��*��c@�endstream
+endobj
+7725 0 obj <<
+/Type /Page
+/Contents 7726 0 R
+/Resources 7724 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7672 0 R
+/Annots [ 7729 0 R 7730 0 R 7731 0 R 7732 0 R 7733 0 R 7734 0 R 7735 0 R 7736 0 R 7737 0 R 7738 0 R 7739 0 R 7740 0 R 7741 0 R 7742 0 R 7743 0 R 7744 0 R 7745 0 R 7746 0 R 7747 0 R 7748 0 R 7749 0 R 7750 0 R 7751 0 R 7752 0 R 7753 0 R 7754 0 R 7755 0 R 7756 0 R 7757 0 R 7758 0 R 7759 0 R 7760 0 R 7761 0 R 7762 0 R 7764 0 R 7765 0 R 7766 0 R 7768 0 R 7769 0 R 7770 0 R 7771 0 R ]
+>> endobj
+7729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.4163 187.8527 708.3202]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_60ae86027d4480aec07a5eed85f6977a) >>
+>> endobj
+7730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.5112 697.4163 257.1544 708.3202]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7731 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.0352 697.4163 426.4242 708.3202]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+7732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.9 187.8527 669.8039]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_16829d6b83d0c21f3d3e1f87c46ac239) >>
+>> endobj
+7733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.1898 658.9 293.0169 669.8039]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 620.3837 187.8527 631.2877]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_f5aee1171c6c67b9c57f3949b7b75be8) >>
+>> endobj
+7735 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6683 620.3837 269.4954 631.2877]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7736 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [291.0244 620.3837 350.9691 631.2877]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+7737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 581.8675 187.8527 592.7714]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_7358056031cb08692ae07044715987cd) >>
+>> endobj
+7738 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.1898 581.8675 291.3334 592.7714]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+7739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 543.3512 187.8527 554.2551]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_89d5bd03139c8fcaf1ab035208d680dd) >>
+>> endobj
+7740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6683 543.3512 267.8119 554.2551]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+7741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [289.8989 543.3512 349.8436 554.2551]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+7742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 504.8349 187.8527 515.7388]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_d5c6d64b009045df8248bcb8ffeea69e) >>
+>> endobj
+7743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.1898 504.8349 299.6424 515.7388]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+7744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 466.3186 187.8527 477.2225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_42e87760e6f69306e6322cc77f20d162) >>
+>> endobj
+7745 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6683 466.3186 276.1209 477.2225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+7746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [302.6312 466.3186 362.5759 477.2225]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+7747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 427.8023 187.8527 438.7063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_8ee7e3364443dc8cd55f3f6388c81ecf) >>
+>> endobj
+7748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.3996 427.8023 298.9559 438.7063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+7749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.756 427.8023 419.2221 438.7063]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 365.3757 187.8527 376.2796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9bb0903a2b33f94b096f71e604f07648) >>
+>> endobj
+7751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.9646 365.3757 245.5648 376.2796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+7752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.699 365.3757 292.4259 376.2796]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+7753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.9735 365.3757 425.4396 376.2796]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 314.9043 187.8527 325.8082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_691bb5ef88a4c9638034de4c1b9532cc) >>
+>> endobj
+7755 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.1898 314.9043 235.4437 325.8082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+7756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.7236 314.9043 340.1897 325.8082]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7757 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 264.4328 187.8527 275.3367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_25b59f3491de4996c701bbf044746fe5) >>
+>> endobj
+7758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.5077 264.4328 272.668 275.3367]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+7759 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.702 264.4328 425.168 275.3367]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7760 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 202.0062 187.8527 212.9101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_5d2426c9804102311d41fd445b122cf9) >>
+>> endobj
+7761 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.3337 202.0062 292.6021 212.9101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.289 202.0062 428.755 212.9101]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 151.5347 187.8527 162.4387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_163f5dff452c6cf2e3a0c929eb2b8187) >>
+>> endobj
+7765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.9192 151.5347 307.8615 162.4387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [346.4962 151.5347 421.9622 162.4387]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 101.0633 187.8527 111.9672]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.5923 101.0633 239.3988 111.9672]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_91cfad066b0e12cdaf7454fe4585cfc5) >>
+>> endobj
+7770 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.736 101.0633 340.6783 111.9672]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7727 0 obj <<
+/D [7725 0 R /XYZ 90 757.9346 null]
+>> endobj
+7728 0 obj <<
+/D [7725 0 R /XYZ 90 716.2211 null]
+>> endobj
+7763 0 obj <<
+/D [7725 0 R /XYZ 90 170.459 null]
+>> endobj
+7767 0 obj <<
+/D [7725 0 R /XYZ 90 119.9876 null]
+>> endobj
+7724 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F37 1999 0 R /F11 416 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7786 0 obj <<
+/Length 2812      
+/Filter /FlateDecode
+>>
+stream
+xڵZYs��~ׯ�CV-g�ƌR~�
N�I\ή�ǥ���
+6	� ����s
+y7[z�t���Md�Ꮼ4^e"C�q��
.�����	���|�%xuu��[)ViI����q�	J�����5!��͖`��?n^��!��qC��?ޛ�:��GqS�����?��=����͖
+�~�ϛ��|g�{fʝ��3��T��/W�_��J��&�U������[���1���.0"Z���S/��/����n��Q8H1��2����DD���Px�,Ė��P��mO at A�t���
�,g�����(C�
��`�.áD��",�l��£w
�B,�v����syp7�z���H	�g��&�%
�F�g���W#�Z#��
}��
�ď�Z����y[�_ՠL!����{�ZN9FJ3:�
,�*�v$\f(c�=��~I�_��\0*Ւ̛!Q-�g�+�
B�
A�I�!"�Jj�H�糚И�O
�F_)��F�
+��b�>�4M�
ծ��b/�%�t��ە�U8�3O[{"�H�,
4�}�x��|�P&�ND&�[��+1k��v�?N�eIQt�Ȋ#J�g�N~�vʌ *�\���l�vv~v�
iG�T��k���m"��h���m�2��m�Z����B
�x6��D��Y	��1�b�����4m}�A��Bf"�C
�}��d�8��BhF����0
�-R-�MAו{SU��\��`5�{>�#��#�V[���O��u���uqwm6D�?�q#��
=o�D���2ah��.��B>�.�~I���Tg
��|��jA�R
+�mO��>J2�%a���

s�
ɬV��A/�T�m�v����WwS
V
+�e�=��ʅ
����Dyy;���Aߙ.�!�ɨM�x͍=+��w�*Z�?�k�
�6lG $Ɣ���p�Tb�P}�"���zò�iO5���Rr]�C뇢1���
����}3%j��x�-쀢%Z�'� ~�2϶�Mp&�`{�"�)Yh�l�=tδ���=��ζ���g��
F|��#���o�Sy��!8��y�$��( 
��
8�l�PPF)�ϵL�_Rc��
B؊'�YC$�
�P�J:��� 
I���4�.���ȬV��C8���ӱg
1B���t�8_ 
+���IPg#

�c6AmHr�4fC$
�ޘ6/���
{������ �s��1��-��kʪ
?��4M^�Gc����bz����6�|��O�U�Lde at C�h�^�
�ed]���!k���}��ا	��#���3�����JG���$�o�
&�Ɉ�r�P��LI=�eT;Ղ��(����X�Ɣm㭓�>��R`D1����.����n
چOb`
6�R�1��3�{�+���H at Kœ�.�6A���ǝ��us�w�=3��JJ$����]�/+Ƞ�)����NŐ$���T�
d'���(s� С��)8�M:2m�T�ܴ�
+3�šA�| U��
�
j�ad^l��
 8�CO|��[��TJ��G�����y
��S�:��f�%.9�YJ��ؼ�YZ�>�7���¸�G <��l��3(�}k���D�`�1ߥ����ìK,����p�������c��k>���bW�{�!
M/��֚�.)J���3#��������l�LٚA�p !i7o�D��.�h�#��U�c�!E_��[�@�����Ox�+d}u�^����+�l
�7o
�hY�b#~����z���mq��b}gj������i�E��f{����W�s�}
}Щ׏��b�
����钿"���`�_#���x�����@�!L�TK���PL_�+H��y
����.���ͣ�l�/U�5�փ��:ù��q8��
��qo@�
+܋p�3����:�]�M|��	
��

�}���TC�E�
����* *B��5��k{2�H���z��T�SR:�*��h�m�����u�=,Ӯb݂I�Ըn��u묏*��=�)O�봦��SF��q��u:�w�* k
�x�� P�F1�R�p�oe��~�
>��V���
�ߊ4��r�e�A���O?|���޿�`�3��8{BZd����D?�(
�IžLh�L 
��vxb[bo�:��̦�S�������Nh4M�[
���؆��Pb
��0�;J��T]��J� %ܾB|��
*Ds
]M)0��F���%��D6
��3�B�*5o�D5�`����0�kp���D;��;���/@r���b�TӒ���yp�(����%�3}$�flO.�r��Z���rs&l'�/����
+�nL0�ýyʭ�9����I������&�5��=�{��I����^�j&���~���w�Mf�nJ���GJL�>�Y5����ro�����k��T�aȩYC$������1�+qu_W���S��DI�zsz�>�{���̖�)��ΘX�S
���t��{E�|���I
+��ڏ�2�x�w�j�C�X�1t����%�.��7!lo}�b|ڷ/z	��I�H���8�q,ߏ�A�∴�
$�_
+eZuƻ���
�i��4�ꀡ��Mk�	g�"B��\R��K�ɐ��
��e묧���Ћ�����{v�L��05�Q
�Pe�v�
+S�~��=�&�P����

6#�s�ɟ���pb%��|�F\
%zV��f���p���e�g�Sc�l�X��3/O�����0
T�����O�]��7f��"�/�H�J��o������a����7����_����=^�|���v
��q�QѾ<
�/���4cs��&��.=��s���;��.w���ӧJ�ypG345N�P���0endstream
+endobj
+7785 0 obj <<
+/Type /Page
+/Contents 7786 0 R
+/Resources 7784 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7808 0 R
+/Annots [ 7789 0 R 7790 0 R 7791 0 R 7793 0 R 7794 0 R 7795 0 R 7797 0 R 7798 0 R 7800 0 R 7801 0 R 7802 0 R 7803 0 R 7807 0 R ]
+>> endobj
+7789 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 706.9608 187.8527 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7790 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.5923 706.9608 239.3988 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_2f41d86c5a949d903179e82072854ef4) >>
+>> endobj
+7791 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.736 706.9608 326.2923 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+7793 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 668.1065 195.6014 679.0105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9dc9e3a464def0e2d929fab9cae6e360) >>
+>> endobj
+7794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 629.2522 241.1122 640.1562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_ee8ba0ffc68e00046b55e12427c582cd) >>
+>> endobj
+7795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.4494 629.2522 342.3917 640.1562]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 579.439 255.4885 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_6b1f2d6606a0b4d4fc8bbde3b24ce553) >>
+>> endobj
+7798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.8257 579.439 356.768 590.343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.8409 479.368 252.7832 490.2719]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 423.7115 513.9963 452.7773]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+7802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [335.8256 411.7563 409.7679 422.6602]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+7803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [302.3236 399.8011 361.8799 410.705]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+7807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7787 0 obj <<
+/D [7785 0 R /XYZ 90 757.9346 null]
+>> endobj
+7788 0 obj <<
+/D [7785 0 R /XYZ 90 726.0541 null]
+>> endobj
+7792 0 obj <<
+/D [7785 0 R /XYZ 90 687.1998 null]
+>> endobj
+7796 0 obj <<
+/D [7785 0 R /XYZ 90 598.5323 null]
+>> endobj
+7799 0 obj <<
+/D [7785 0 R /XYZ 90 542.119 null]
+>> endobj
+7804 0 obj <<
+/D [7785 0 R /XYZ 90 374.2719 null]
+>> endobj
+7772 0 obj <<
+/D [7785 0 R /XYZ 90 351.9601 null]
+>> endobj
+7805 0 obj <<
+/D [7785 0 R /XYZ 90 351.9601 null]
+>> endobj
+7773 0 obj <<
+/D [7785 0 R /XYZ 480.0933 172.0428 null]
+>> endobj
+7806 0 obj <<
+/D [7785 0 R /XYZ 90 155.3157 null]
+>> endobj
+7784 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7812 0 obj <<
+/Length 1637      
+/Filter /FlateDecode
+>>
+stream
+x��YY��6~���Sk5��x�[�H��Ү��
E��Bmٕ�l��;�HY-�	M�KJ#��q���H�q �D��"��#
,�����p�x1��"x��T�E�A�����1!��ɔ`��o'��l
=��P<ެ�f�E�'�(;�޾ys׺5!j�I'S���n�v��/�0�=�Ʀx��zL��|��:z9�͵�p&Ha쿣wp0�~
aĴ��l0"Z�`=
+)s���~�g���F��/(!��(�`����x�G�(	��
+B�?~J#��
$��� ��Ek��lw���`�$�4h���3���[�e�+����[
S�]O;��	�G�N���ӦV���]��GS�~w��f]�7���Iwy%in�17�1�i�.�}��Z\mRTx�	��Y��#*Br0��}
�O��`-��1�w����`#Db�4��y��2��)$�� z�PV�j _%��d�qq��C�2���>��V����|�^<o���!w��b�Z8�	�K�U���`+�S� ��P��HА�O��'���nd
ij��j��xB�|�]�
T�T
���U���&K
�j��Ql��dm�]�
pkѣ�y�{�\��R!

+>\^�R��
�q��+/>�K�y��Δ�A��奧�_^ZZ�
3Ij�0Y����*/Ņfy)�y�t��L�d��yu#�O��ܽ"^E��{�
+��AR��Zj�
�W���h�h��N$����(��%���p��v1��q�ό�::T���{���
+�+QT��T�X?�8�rD�?�G�4���ZU����p}F��m(d������l|��
+H�llwH�(Γ8Z��>,&����1i�D�q�Ll>6����6�N�7�ʚu2��v^b��f/���ElJђ�*��W&5Yv>L}�vߨ�>���K���X��N���\�F@��`>oWI��^r!0"�m������
����R���s3R��"B
+)A�J=LHM�ӄ2
M
&W�π��ҳ�_Pj�#Ⱥ��%����R}�
B�a�����~����]_
+����`C�t��*V%����ls��@�<�r׵��:'U����6I'!
�V��!ʖ{�޳H+$8�oC���z���I1C���i��1���ɝ�$ˎ�
�X��6?4��^�jI����!�\/3��b(�%3
頮�Dx+�(Η�g�q�KXE\2�P�-��+x��{!���p5j��FT ��E˥t�Q?P��v�+��:�%C������$M�v�Q��F��F�JL�o6�
6�3���6�6�
6jp��܄X��MYg{��r��l6a��|�
-�K��3�MSl:N��`3��
6=������l|E����3�E�R���)���������g���>f0"�F�g���i���2��ʈ�je8\j
�����&]f�ⷉ�K�`ʍ��8
��5���`
���۸����ժ
�D4�e�Ã!fDp�U�&�?�A�%Ѥy������EӈVT��U��n
z���p��{g�'��m����}���\?��f�������@�<�sroL7>TI 2�m+J������l����DU�e���{
��|{{s����
ڧ�6CI~�ݮn�v�H���7��z���B���-
�®7�q����`�
���1�?�_:=endstream
+endobj
+7811 0 obj <<
+/Type /Page
+/Contents 7812 0 R
+/Resources 7810 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7808 0 R
+/Annots [ 7818 0 R ]
+>> endobj
+7818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7813 0 obj <<
+/D [7811 0 R /XYZ 90 757.9346 null]
+>> endobj
+7774 0 obj <<
+/D [7811 0 R /XYZ 90 697.5965 null]
+>> endobj
+7814 0 obj <<
+/D [7811 0 R /XYZ 90 683.3149 null]
+>> endobj
+7775 0 obj <<
+/D [7811 0 R /XYZ 90 540.7778 null]
+>> endobj
+7815 0 obj <<
+/D [7811 0 R /XYZ 90 526.4963 null]
+>> endobj
+7776 0 obj <<
+/D [7811 0 R /XYZ 90 367.2129 null]
+>> endobj
+7816 0 obj <<
+/D [7811 0 R /XYZ 90 352.9314 null]
+>> endobj
+7777 0 obj <<
+/D [7811 0 R /XYZ 90 166.3944 null]
+>> endobj
+7817 0 obj <<
+/D [7811 0 R /XYZ 90 152.1129 null]
+>> endobj
+7810 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7821 0 obj <<
+/Length 1981      
+/Filter /FlateDecode
+>>
+stream
+x��Ym�۸��_�OW8s�"R�W Y�Aһ4m\�A.Xhe�-Ԓ\Iή�}��-Z��4���`�
9�yy�-�c�#s����b��'�
�7������Kx�

+�\�.�"�\!%���n�
A�:_�?� &K�1�/�*���/(��q������즊����wWΫ�AY,����j�uw���6mߥE��#��������ժ7ל�3A����}���k8��FLI>����Rt��B���n�a��~��E��甐�C$ap����x�$G����%"�p���B�h
Q��`�u�q\��MZ՗��$���Q:nm
�K�-Q��p+���jS�M=RO1Rj(�;/5V��P-�HE�tծ�h�dP�&ͻ���M�bS
t2�݃u�+ƴȊMw���{�Xe�ː��Mӽ��ʢl��.�ҵ>,�h�*#�"��Z��E�tb�AE�
j�n�$>�ƌ����M��k�KF�	�S)�I��n�C�
�Ԥ~
�������dAxpLv`k��)��.�C����f������d
+	�&3E�G졊�ͷU��
+�!	~�
_�����EZ;[�t��Cg�I��H*nc�e���CT�A'�P�h�]�)��ƳmWD�E�C�=3�[�p�ɇe��X����a�J��!2э
ց�Ncu�.���
�n�~u�z?��٠�<j�b�V]�3��lj�\gyZԙ]`5�����S谠�CX�M"�P�<rrIzz:p��s�I<����{
8'�� �#�~�t���'���ӟH�C!C$h 6�@V�G1����Fh��M��A�`�}a
+���9$޸��E'M�Ļ������ ���h��I�/3��0�n�2?qt	WU�#]$˪��76{�J~/��o�Ka��W����0!�&4t������>k��]s<�X
+$c}��>
E�j��S��CB٭^��x}��_����_oV=�I������-�/�{�O��~�%Y��Ǟ�S�È~{zRm,�-��R��q���Y��,>Ə�C��,�IB�gќπ	�Y�G�^�����@a2!�O�K����'DW��|8]d7b�'�?��f�Z�
��ؔw�ظ
�
0Bj7Mj�Rc���kI\�
}��6h���7٦(���X+̦^�Uk����4�2���iFL��ɣ|J�4�}Z at N/����M��_�d�����E�?��Q�1 ���X�4DJJ�\��Q�e0)����J�)1�%Pť�X�� V(N'=�l��(]�=GݔZٽ��2
T%�z
+U)��O�*�a $\�'��*2�U-0	IO�OY�X
+���S
�����C�Zf�)�O&��{Ov���v����ژ��.;���/�`S$��:��[��N�%���i�
J��NA[���q�π	vY�g�^줨�1:
�i�Rc�'c��"���z5
+o�B�jݽ�/
͹�:�W;@5�9��@�=ƱC�)/Z�'r���cG��
�h���*�w�Jt�?�*��֊j�e�֛!I�XO��?߂!�#1]FC��2ġ�v�^�'�ؘ(!������������.-6��:���I�^�iO�Rc#�
��C)L\#V۪��}N���u!�
��g��o n=cR�K�g��68�P�B
+�L�
I�j���,���,?��S�;Ku�鷽e,3=��3����1��ߐ	�nS9c�T���u�����Fw�=�Mx��=
�@G��hZ��#���p�'�9��Q�<c$'�㙜*@��%�_w6:��G�6�ߩ���s�J�*g��ap5\|��.��
+	P����+ҟ�o�F8�}�!D������ݚ"�n�Y����Կ�����.�/z+�z׃��G#�����C���G0V
F�K�����_�/XVt

�<�W|�4�ˋ���;���Pd�
+e��~��8�+�)
+�6�e/4��q|'",
[n�ʦ[�ڼ��y�d��ϜxM�/����endstream
+endobj
+7820 0 obj <<
+/Type /Page
+/Contents 7821 0 R
+/Resources 7819 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7808 0 R
+/Annots [ 7827 0 R ]
+>> endobj
+7827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7822 0 obj <<
+/D [7820 0 R /XYZ 90 757.9346 null]
+>> endobj
+7778 0 obj <<
+/D [7820 0 R /XYZ 90 684.0369 null]
+>> endobj
+7823 0 obj <<
+/D [7820 0 R /XYZ 90 669.4666 null]
+>> endobj
+7779 0 obj <<
+/D [7820 0 R /XYZ 90 523.0789 null]
+>> endobj
+7824 0 obj <<
+/D [7820 0 R /XYZ 90 508.5086 null]
+>> endobj
+7780 0 obj <<
+/D [7820 0 R /XYZ 90 391.7005 null]
+>> endobj
+7825 0 obj <<
+/D [7820 0 R /XYZ 90 377.1301 null]
+>> endobj
+7781 0 obj <<
+/D [7820 0 R /XYZ 90 175.2403 null]
+>> endobj
+7826 0 obj <<
+/D [7820 0 R /XYZ 90 160.67 null]
+>> endobj
+7819 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7830 0 obj <<
+/Length 2128      
+/Filter /FlateDecode
+>>
+stream
+x��Y[�۸~�_a�@k5�wR�v��V�v�M/�E[

�%W�w��C��E��d۴���I���y�C��0��,�3%J�����
��o�{����>�����+)f	J$��ծ� 	���j�aNbj�$�����>��
��U�y�m�t�}~_��绻7��]�=o��*W�ݾ"�Ǜ�4I�bX����	F�%�Q� �_,���4Ž�)����'�=/����[-:��"m2��]�������#���3L
ӛ��΃���Ib��ϛ�l
���#�h1{�	F$I��p�)�����_;>�E� 'N!F�0%`$#Q*-&ZAH�F��N�L���H�[g�X��������N�)R��Y��W`�HG=�$QA<R��
W��C�oG�)G�����XG4�*h_*M���@�j�"ߊoG�S�FMe��M����?�k�.��]��L(�\����d
�Ȍ�
+R7��7�G��đ�	�j,=�0�$����n��y8���O�����j���4p_Z<Tu��C��=�qpY
�sk�yk�s��K��]r�� �+aQ��c����{�)�'*ăk���Ǭ�=����#
A%"�D��Q̕�x�ƾy
�2�J�|i�Cx�F\�Fg!��<\�Xr���o��Ԙ��?{�~�O�1��J\O9��$���a����E;��[Kn
+�8O|
�&nd) D0�y�k�
+Ɯ!��^�p�
$p�1�H��(fP��ß���~���߿�۷��"�4CRK��!($�"� >��?�e���)!��O�"���G� �р�D!I!���g����l� ��5�Ϋ����.X���?��iw�E
+�Z Ԁ%��r�A
8�Y��N�t��
j�)�
Z�}�V�YҦl;L˭�>�{�L�����&?e�}�x}6�y���B�U=�_��`�ɂiDT�I��S]ne�Q�
p�D�_C!Q$�B
�e��Mԡ}����K
�6��P<���v�w_�����$~.TS�sT_�ޓ�;�
��cw_����)tӫ�-%�C����i҇�L��.)�p�B8���0�
���I
Q�(!
Eu�"�B�
�C(ė`8��4V_ �#����0�z(�"�
%%a�5	�"AJ	=
���ķ
_��K����Wx����u��ڬe��=��Y��<�ð�0mU��u0+]ч��{#d���ѧ���}�x�
��n#�U����`�Iؿ�$Ӱߧ��LK�n�_��1&�k�I
�:��n
q_"�0�6��K
�>d� ���x�7�	j�>��}�)z�/� ��w-�Hz���� f
Ĭ�0����Ym��:��[��HXmZKR���li�'���� �UU�������عޟ�b
`N[�u�)�4��y��"����Lh
�
>�gR8�2>—'
n	L�#ڷ��BTl�a`
[���qˊ�����N
f<��C�k�L�u�PD�%��.*��$���$Q�=m"��6�ڀ�i���k�6}��U��܄�_Z�5�9��H
,���\�)擹L���~4�7�b���1إ�)&Ʒ8a��
+��]�B
+���l
+�Tס�2�a��/�/?m����0>Q�GZċxG֞����]^.8����v�֮��J 3dǤG:��2a�1C��8Pf����GW?��~��N�J&sL�Y"���=�]�A$Ǥv����Kh� 4����۴��ؤ
��D�3� �>�U��.����5�c[���!+����vuu�ޮ*
+��|�������"�DDHr���>�<�4︴�T�
Q8�N�눞jeX�@��X���Ú��Zhmɗ��DQ�5�
)닠BC622:��h̐+��ˍaȐ)p壣�U~�ΐ��!<y���a�j�����r��w��������E��;�D�݂!����~���^�
+��}
RΩ۱\���H!����6���W$	R�?e�'w}%�
�֠��(7�)e�.����SV�n!��m��iy�ݨi�~6��(Օ
+P�9�*�8���x�>ˆ��rH�G/ٷ����_.�v
���T��_c��i�w�����hsB�2?�(on!��C�8ƐۊMEo��t	����:Х+���뼄���܎� eU��
�endstream
+endobj
+7829 0 obj <<
+/Type /Page
+/Contents 7830 0 R
+/Resources 7828 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7808 0 R
+/Annots [ 7836 0 R ]
+>> endobj
+7836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7831 0 obj <<
+/D [7829 0 R /XYZ 90 757.9346 null]
+>> endobj
+7782 0 obj <<
+/D [7829 0 R /XYZ 90 681.7196 null]
+>> endobj
+7832 0 obj <<
+/D [7829 0 R /XYZ 90 667.3637 null]
+>> endobj
+7783 0 obj <<
+/D [7829 0 R /XYZ 90 511.8797 null]
+>> endobj
+7833 0 obj <<
+/D [7829 0 R /XYZ 90 497.5239 null]
+>> endobj
+7834 0 obj <<
+/D [7829 0 R /XYZ 90 336.4555 null]
+>> endobj
+7809 0 obj <<
+/D [7829 0 R /XYZ 90 314.1437 null]
+>> endobj
+7835 0 obj <<
+/D [7829 0 R /XYZ 90 314.1437 null]
+>> endobj
+1505 0 obj <<
+/D [7829 0 R /XYZ 90 152.5371 null]
+>> endobj
+282 0 obj <<
+/D [7829 0 R /XYZ 90 145.1983 null]
+>> endobj
+7828 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F23 2436 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7839 0 obj <<
+/Length 2125      
+/Filter /FlateDecode
+>>
+stream
+xڵY�����]�� �T{�~
� M.�G��ן\��W'"�P�/��;������Ka��c83;;��7+���
^+��a\���^?���W�~������7���7R�
2������ 	���}�aCbz�#���-���8Eo�o�����E��S�XD����_�e�gQ��������7oi��� )w���{��#�
�%�G�D�P��׋*�M��e���6C7�tN���'���[�76��#f��0L���w�M���
+&���o��:� ��ˆ-��p�1��O+NY�IW�W�j���c�#��
�
a)X�����4����lO������5ۗI�]Ɩ�1���
i	T.�	�D�i���9�JE���O�,rd4��w�I�T�z���R.z�:��3xg�k���
+�I��FjɾH`mz���_2��BDҵ�q!GM	� I����
a�P����/����'�/(=��~1�����蚖>g��.eAʡ$٠IoG�(�ǽe�YB�d:�C!��m&��l+
1H-�
�ձ����$
؆�BD��t��%/z��"w	�P�<�_�DZi�� ��1�Iӏ?$�
����_����V �HbJ^U-
sĪs�[AvMSUl��4hQ=�ϮM�M�\L ����H��j#�-�FK��y�
���3�yg)
+)�u��g!\c���]�.-�O3D�R} 
;g�~U��t̥o� �e�-������
+��:F�	t$
��`�&�w�����5&�˾H�a+���0n|M���
���
+�Y%M����͢��v��w����t�!	E�<�4�2��<�)�f�[���r?��L�X�x�2e0�j�zmj|5�l)�@F�P\m/�����x,{���1�y���RC�q��)�m��
�Zt!�d�c^��!/z�wIa�y��M�?��S�d(dQHR�[��i�g޳�x�?�^�ăGe��O��DY��A D�#�ҡ� N�Ys-#R,@`#�k0��ފ�W� ���O
7���
F�S�s��P�ԂC0�8ē]�|�밽
M�sT@��}R�N�Dy�n$�2J�
+����k6�����!Ӳ|4Ѣ:} �h�l ��ጫL���F�:A���d�2��ZQ�x3 ��3��1P�|�<���Q
�i&�
��5ݸ�Ɂ�c�^���@��H�Khw�P�3��_|
p�"�#�VJ����RXoo���_�����Ε����L'ѱ@X�ט�����x.p��脼4T�p�tIe $��8���C��If?�T�J�|Iu W6I��t���Blf������G�.�e/�]6�&�FY<�^7�H�
ۜ���.y�rXZ
B��L,%� @��� �sU:�͓�\�:���y��[*6�I����ގ��0� C��
�3CB#�8$�Z|���߱{>��xl��A�C��~���h�g�JmjY�
+f6 ��d`(�P��sɮ�*�z&���I詽�Ix�&��tUK�ЕA�*߾�sˑ�fi��iQ��B�o/..h��zE�U���k<�� ���s]55˵7�
�i�4�1��	f�No��o�@g
;�$�"N����i
̔M#�X6�_�f�n(��]��㆝<K���`z��K�
�V�O� v9��'����2��
���
dsGan圽jn%RFӥ������-BjU��
��W�s��G�����?�J�
+�R�$-'Gu"`��˒{'Hb:ˁx	E����,o)���y�M���,��@���Y���Z|Ʌ����iXZ@'��]5䶩��R���
+�@K���g�U7(8���da���(�ןRrTC��b��X��
���L~/m۸���b|)��УRIv�O�cO��^�5
O��4�����I��	3�.�Y�Ǣ,��t���)�|E�
+�?����O)ԫ~���)bh;��;�t8�3����ԇ���
l��֔����b�������Qv
��m�'�
+Ƃ�K���\X��v���ƽ�#�2�ai
������W?��e�v�/��j-y��-�X��ۛ���g���k��
��7 at _n�~q�������Fh�K'�
S$�
_�Y�7�KO�<2�G�[�+�Z�] endstream
+endobj
+7838 0 obj <<
+/Type /Page
+/Contents 7839 0 R
+/Resources 7837 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7808 0 R
+/Annots [ 7843 0 R 7844 0 R 7846 0 R 7849 0 R 7855 0 R 7857 0 R 7858 0 R 7859 0 R ]
+>> endobj
+7843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.6209 174.0145 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction_77067a656a3aa9381a93a23dfba036e4) >>
+>> endobj
+7844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 658.393 197.875 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction_f38e352895f910cc9556dc7ac0d8f39d) >>
+>> endobj
+7846 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 619.9123 181.7633 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction_5a0edbc51074f6e9e1a908fa292abe13) >>
+>> endobj
+7849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.4176 483.1634 391.8387 494.0673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+7855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.8565 179.2736 243.4733 190.1776]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_96bae54a01fe00bad4306bec61bb4687) >>
+>> endobj
+7857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2787 140.4193 155.4642 151.3233]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+7858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 140.4193 221.8944 151.3233]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_891529f721ff485fe2ec90ac48952cc6) >>
+>> endobj
+7859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7840 0 obj <<
+/D [7838 0 R /XYZ 90 757.9346 null]
+>> endobj
+7841 0 obj <<
+/D [7838 0 R /XYZ 90 716.2211 null]
+>> endobj
+7842 0 obj <<
+/D [7838 0 R /XYZ 90 716.2211 null]
+>> endobj
+7845 0 obj <<
+/D [7838 0 R /XYZ 90 638.632 null]
+>> endobj
+7847 0 obj <<
+/D [7838 0 R /XYZ 90 582.2186 null]
+>> endobj
+7848 0 obj <<
+/D [7838 0 R /XYZ 90 521.1757 null]
+>> endobj
+7850 0 obj <<
+/D [7838 0 R /XYZ 90 459.6915 null]
+>> endobj
+7851 0 obj <<
+/D [7838 0 R /XYZ 90 435.3224 null]
+>> endobj
+7852 0 obj <<
+/D [7838 0 R /XYZ 90 435.3224 null]
+>> endobj
+515 0 obj <<
+/D [7838 0 R /XYZ 90 317.2678 null]
+>> endobj
+286 0 obj <<
+/D [7838 0 R /XYZ 90 310.6676 null]
+>> endobj
+7853 0 obj <<
+/D [7838 0 R /XYZ 90 196.3446 null]
+>> endobj
+7854 0 obj <<
+/D [7838 0 R /XYZ 90 196.3446 null]
+>> endobj
+7856 0 obj <<
+/D [7838 0 R /XYZ 90 159.5127 null]
+>> endobj
+7837 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F67 370 0 R /F97 1774 0 R /F23 2436 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7862 0 obj <<
+/Length 3230      
+/Filter /FlateDecode
+>>
+stream
+x��\m��6���Ÿ�l�f�N��
З�h�/���pE[^��kt-�d9�ޯ��$rIK"��8i
����p��
E�L0�G&�(�PƸ��6xro{A��s�>�_^_��F�I�2I���]mA$(����_�� �gs�1���<]�����������>�-���7�|���W��n[,W��]>�����♧4CR*
+t���6���������
#"L�𷤉�
���lNk���òʛw����rF�4/V�˘�2̌ыW��s�c��������'����/0b����H����Sf��pqu�g��P�o~ac&�2��`�ݽ>�<�W����on�n���
�U����[�q��p�x�����{%�L�';��o����OQ`��L�}��y��k/��x@,e����6�f[>.����걉̀i���DD�R�3��L3� h���L�m	��]���*�L"�
+i!i|*
*A���C��	�����
+B��ίB�K-����¸�"�
a�s�FMQ����V�~�P|�W��h���os��`���w�j]47�_n�
}�qz{q�:�����T�C�x��I�����ဌU
�#�����~�o0��Q�\����8����3�n&e�
��4�������%S�7xr�'�Y\�nt�ǘ>;�L-.`�ψ�~��H+ �aM�(�C%�0̑PL
��3�KsJNR �FL,lX>=�7�biʜ;�x����B�y�����sf?�HfD��������N�E��uy폻.*F݈��%c8�p�Z|�DǮ!q���/V�ۮ���+5#	XTjp�(��>��3��V\��ӳ�O
�������ͺj^�Y��m>�ۖ����PV��L"�u�|�q�`RAu)�
Z�hC��@=Nf
�!�I��
�m
�jau�c�<��m���q�������Eվq�a�k'�hU���~��;
W�jN��E�}X_6C�S���
�Lh���;���˜$ɵ��[O_1)��{,*��B�+N�{ �;M��j�+
w��dpl�0�]C�졣�-��ΐ��sG}�P	
�
kvĠ8l���%��7�
�ɱq���]C��\�ˋ�\V���Cn�똓i�>�{��A	 ����.n_����zs��^z�G2�) ����Zi?
H��ѷѣ�
#*9}�0��~�����a�b��l�@�֪��ݰ�7��-�~�����|�᧶2����
4�XA8����`���Aտ$�h�h��� ZXZ =�'
`���5��h���0��t���7p`o�C9��O0�����c�#��Lx�L���P	
�
���
�;��8
X���çt�6��f��4���q�l�vt�B�C�~��
�w��FD}����/~�e17,L�
E���@��f���|�ë}w�KT)�HFNQJ�FD)
��r�(X��}�j�{���
+�T��ae����ӳ+`�A�W6K*�o�������U(S�!x�
[ٍ���b�	e9�Z�O!�b�.�kKP��M�м�1�4
�3��n[~�*Rc2V�}��T;�s�:�2(�qrjU
R�j�� R�X?8|�F��OP��4�	��Rlu�����"����m��-��J!�\��3)��uA at e��ho;|��]���
y'u�����V��ǹV�H�� =ee�l�V
���O�<y�~YA%m
+鶣?�>,�e�E�v匋���z�4O]M��4!�#%�S�Ǟ-h<���Ў�sH~�
+�e
i!R��%�!��v�\

����MO�
2
W�K
�3,�I���#���4�v�v���Z\=�a�>� }4�Q_8T��y�)9
+���>*L��`�N��FD
l�����&�7�=s�Ġ�n
+K#����>E"�U4��mT�Te
+�(0)�?�(�WS�%D��Ң�<Y��(��F�B��/
+qN��E!|�(Dit�pW
��AQЈ���(��	�&�b!���]B�B���3ӄ�<IXF���>��
bTIr�<��l��<��t
{O��89��>��y
���q�����=�<��Q]��Ʒ�n��
Hc�Fi��36w�s��1�B��,6ݕ��4�l������k{sr�ț��:`�o�=Ү�w�K�L/�PmQ,��K�9�F�N(�E%��3w�.ę�(��XU�p�D!:<5'b3h��
�k$ 2‘#;�-<���j}z�=D
�iG	8X���;P|h��s3�ȗ����t�8%|�;xb�c���K(y���@qn��'q��*b��SԷP�Dݵ�W_,�D�rD�Ί��OI*8b���$gqL�T���2��l����ݤ�=�&�wE���g���
��,�T2�_O�yV���5��G�z�*P^�
(�3vDax!`��Yz�
>E�c�N���ׅ��w���
}ǚ
�`P)U���k�O�uǮ�8P�5�<�U��- [...]
G�
I<b��涷��ӱ>v����v�S�rs.>�o�J�pUn��LU.1_=#'=0�L�V��I��n��:���u'��?
� ����0�J���S��8�������Ƈ�ծ?�eG�p$�
�
�ئx�k
{��ֹ�D+�޲%���L��0��(�(�j�[x�ñ�1������ZF���0�X8�}Ҕ�����
Yl~fĜ�<��>���BAC���4(u�s
�D�s'vc�u��ܴ�d����lq�-��y����V�~\��f��Sy�wG �*ޕ9U�+hz��Wy����U5�Rs���}����&�̽O4_ZT�-w��ߣ����/^|�����P�w%ZW/v���E��R�b�7w����
S$��w�+I�m�Fo6�(Q�7��T�
Bu�Dendstream
+endobj
+7861 0 obj <<
+/Type /Page
+/Contents 7862 0 R
+/Resources 7860 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7808 0 R
+/Annots [ 7866 0 R 7867 0 R 7869 0 R 7870 0 R 7871 0 R 7872 0 R 7873 0 R 7874 0 R 7875 0 R 7876 0 R 7877 0 R 7878 0 R 7879 0 R 7880 0 R 7881 0 R 7882 0 R 7883 0 R 7884 0 R 7885 0 R 7886 0 R 7887 0 R 7888 0 R 7889 0 R 7890 0 R 7891 0 R 7892 0 R 7893 0 R 7894 0 R 7895 0 R 7896 0 R 7897 0 R 7898 0 R 7899 0 R 7901 0 R 7902 0 R 7903 0 R 7904 0 R ]
+>> endobj
+7866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.2473 191.7178 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 697.2473 288.8524 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1091bf4d0e8ce7672f907cf5e7921120) >>
+>> endobj
+7869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.393 191.7178 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+7870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 658.393 303.0791 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f9503f2a0fd1535ce7cb9465908006dc) >>
+>> endobj
+7871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.6348 619.9123 188.6794 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6f9c769f48ed91cd71bec247b7733430) >>
+>> endobj
+7872 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 544.131 197.3631 555.0349]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b38e5d3ce8cc120ce4b534bc43d90d34) >>
+>> endobj
+7873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.0625 544.131 290.7056 555.0349]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7874 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [428.6073 544.131 513.9963 555.0349]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+7875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 497.3066 197.3631 508.2105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a8906c6b7e5b785bd457641007d1359) >>
+>> endobj
+7876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.1977 497.3066 312.4661 508.2105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7877 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.1122 497.3066 423.5783 508.2105]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7878 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 438.527 197.3631 449.431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c5f6c7896e64b8750e2cd9729c19d66e) >>
+>> endobj
+7879 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.4681 438.527 300.7365 449.431]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7880 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.977 438.527 429.4431 449.431]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7881 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 391.7026 197.3631 402.6065]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e37107ec8d1402bb69ac6462d7f4646d) >>
+>> endobj
+7882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.7003 391.7026 302.5274 402.6065]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 356.8334 197.3631 367.7373]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e74729a5f7cabef57fb795cc728869c) >>
+>> endobj
+7884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.7003 356.8334 309.1529 367.7373]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+7885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 321.9641 197.3631 332.8681]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_8a329c1ea10527cde394abab15b67356) >>
+>> endobj
+7886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.7003 321.9641 300.8439 332.8681]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+7887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 287.0949 197.3631 297.9988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_46797ad634dc267c1264aa046c69f9f8) >>
+>> endobj
+7888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.5718 287.0949 295.5018 297.9988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+7889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.4251 287.0949 419.8912 297.9988]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 228.3153 197.3631 239.2192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c720d2c0875eba7d87a4068876092025) >>
+>> endobj
+7891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.8515 228.3153 252.4517 239.2192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+7892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [265.2741 228.3153 298.001 239.2192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+7893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.2853 228.3153 426.7514 239.2192]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 181.4909 197.3631 192.3948]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_fa8decb7c7093c9cde1255a6c1af62d4) >>
+>> endobj
+7895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.7003 181.4909 244.9542 192.3948]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+7896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.2341 181.4909 349.7002 192.3948]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 134.6665 197.3631 145.5704]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_dc326b7c8687b685c42817f7fec425e0) >>
+>> endobj
+7898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [234.3942 134.6665 279.5546 145.5704]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+7899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.0139 134.6665 426.48 145.5704]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+7901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 87.8421 197.3631 98.746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.1028 87.8421 248.9093 98.746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a7f222ac228554b369d460087815b87) >>
+>> endobj
+7903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [276.2465 87.8421 348.5149 98.746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7863 0 obj <<
+/D [7861 0 R /XYZ 90 757.9346 null]
+>> endobj
+7864 0 obj <<
+/D [7861 0 R /XYZ 90 716.2211 null]
+>> endobj
+7865 0 obj <<
+/D [7861 0 R /XYZ 90 716.2211 null]
+>> endobj
+7868 0 obj <<
+/D [7861 0 R /XYZ 90 677.4863 null]
+>> endobj
+7900 0 obj <<
+/D [7861 0 R /XYZ 90 104.9429 null]
+>> endobj
+7860 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7918 0 obj <<
+/Length 3204      
+/Filter /FlateDecode
+>>
+stream
+x��\[s۸}���Sj�TӇf�;�۴i�>��x����
�����$�� *�=�?X��p?� ���<QB!ø��Wxr�pA�����4�����菱d$���wUI���N>��|Ib�jJ0Ɨ����V���W_n����v7�����n�;�y��y9�߬g˛�ٶ���㏯�'$O�AR*
+tl�?א���2��Ǟ &T�K6���l���R�!����j���E�ɇ��]}Y���3L\2�mЋ�}�k+�$6o�]��+��B����-&O�#b
��.8e������_>N�E����a�-��W
i	?�A�$�^���� �)�P�!,���DC�$�r�!I�Ӊ�U�~h�)[ܯWź��o�6M�rVn�?!����,p3D��D�c�
�/�f�T �Hb��|X�kL��)�M��o{���!��CO�$%nB�g�S����.����f=]���vV.>-
�]�#�=%H2N&�PD y�#�C�`�
4g�c�9"�QK
��)�c)h8߉����N��c^���P�v�Dؐ��ϕ7,n;Ms
��
7m���7�!	�ϑ�ĵ,�O�Ym;,�D\�7��P����b��7��ZUQ���;|��N\ˠdžC2�CB�L
+<*C�r�0�I��`�sT7RK8�6���	{�0K��i�����#�mWO���O;#a\�"k��	�)� ��cu����K_�y��� ?��Jɐ�.d��ò�l�ˑф9�����.9*z�9�Y3i��(��
1�
"d�+S�ʤ�b	�Q�6M���
Rx��1R�`��wž�=ο�AG	25�_AP�����\�7�H;�@�l��!(
:�_��Y�a����'(�*}~���� Ϧ~.fM=�ݦ���M��������`��3ɷ/
�������Z�S힪�
�q��wS
z��a�q�f	�f�̳4P(08���t���~;�7�m�$FZ��0zT�`���0:?���
fdyTyBI�4
-GXC#a

f9~(�����qM!p���sQ�I��Jt��G���b}�w�'�E�����0_W
M�H3�k��p
%�%'sw���%�&�$
r*���%���%
��]Qag]'�Y��$�N=*��*]
+�
�S�:�Q
�� FJ�*��1�a�8%A�
�E��c���]��	�
Ɯ��d�8T�ږ�?5�v�{Z�
{�Ґ�]1uٶ��H0�/�D�F��$��Lڻq�IJt3I���&��p�IN��G���u9�b6��A3�����3S���K83x/�ygv��3G;s��s��[�,��b]�\�e���[c�$с�lO�8��4z\Du�9
+	��ٜzT�y�V0�Q<ő1�3���
�H9��
�����F�W��j-�Jh�#E�*��-Nlβ�]��fU�� ��Ϯj��=�U{XV�a���ΐk`��N=Y�i�
Q]-֋����MJ�F ��HҝzT����T�E�}s	'<ܨ1�c$��a
}��>�������
�]k// vu6͋���b�{��{�
�~�{�Wn��]#!H�g�u��:��S�
Q����=�}�ꉽ
�"9��\�v��.
ƃx�¡��r�ƒ)�;�1��I�����q�\���O>��Og�bou���ӡW���'/V�s;9��yN�j8.yN��W{p�����Cn�՞�y�ړD��=d
ُ�[���3Ew�Q"�`+�V�N�=3�
��1�c$t�a�t�x��ٲ�̛ |Q��}& ��& �� �o�Q�9�gYi
���/�[��T�VE��x1��3�e4^-�ٱ��k �ׯ�'�˹S at N��Y�0�v�f񰬋�;_2�65�i�Y��z�Ꜵ�M�z��9��M�QB����?1H�L�tޡrmk8���j�t�d��X[w0CS��ݸC�]C	�i�Q9
+�	a at 9�W���
��0�<7���\�_G
�_�����0�;D�Jm�<�ֵ��q�g�N�v�(��f���

0H��T��=0sHq��(��;�����L�^�]g{a�iۋ�
b{i�����r������1��v��P$��ʐ�&'W�������P��
�
�����
��^T����
���MS8���]�cd��1R��`߬�9��sC8V)�������>�R��+���ònL�a���
�f�n7;�
3:q��7���6v
�n�Y����#���p��P�v�fh��
+�����
j��f��Ge(Tf��)
7C�"��Zx
c$��þY3<�v�Y��m5�5u����h������,g�5l�ʞG�ae/���̐��
�no7��rV��;��K#D���v0���2����axS���,�3{�/Es�Q9�"�e{
�:��SP.L���yp�
�N��:kwK��R�t<*�:cv��q��M�SĤ
�M<��2U;����z5�=l���Jds[D�T��>�3\<�}
1���iO#RA?�
0����qı�
3w)�R
搻�Py��n�[&�9�
����Y�n�)�_�2�9�(�s
}2ٺ��p��.�<�$�
�Q��U]�TH��M
&�0�棄�~5�l��n
�[+�2�����`L[
(Z_�i|�'>ؕFe��	�dȳ��P�"e��J[��e�1
8�
3�Xĭ����=j��ѡW���)�M��ET��ß
�H<� x��g��8&M�	�j<���щki�h��m��q)I:
�i�V�F��\~5�*����>
�H���������M`G�?9����p k"�})I$A��
+�y
S ��ܓ<,o�A��Rd�]�a�ɥȸ�K����Rdu�I��'��T�:�P��AЌh�J�	{_[Xc>J�A���
�]zs��{��P�|�P0Lax���R!�E���
,�� `J��v���f�
+��
��4�N�F��녽7�5�b����hX�̤��H;��le�)c8��<J�A���
�ۗr�f�g{0Ǘ�"/h(�8'_�ܟZ��꽵
ۧ�ɺ���qU�C�����DF1�<M�

?
�}U��VMb޻g��o���o��/v�����������ev��w��[
�����	(գ^���N&���%���T�߉{�SX�7?���
+��.w�ڎ?������OOOh�G0�;�(_o���m^�^��ż�C�@
.Q�9�H�۠B.w�n��f�
�b
��b�3��p�]�endstream
+endobj
+7917 0 obj <<
+/Type /Page
+/Contents 7918 0 R
+/Resources 7916 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7964 0 R
+/Annots [ 7921 0 R 7922 0 R 7924 0 R 7926 0 R 7927 0 R 7929 0 R 7930 0 R 7931 0 R 7933 0 R 7934 0 R 7936 0 R 7937 0 R 7939 0 R 7940 0 R 7942 0 R 7943 0 R 7944 0 R 7945 0 R 7946 0 R 7947 0 R 7948 0 R 7949 0 R 7950 0 R 7951 0 R 7952 0 R 7953 0 R 7954 0 R 7955 0 R 7956 0 R 7957 0 R 7958 0 R 7960 0 R 7962 0 R 7963 0 R ]
+>> endobj
+7921 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 697.089 167.4656 707.993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e4f3b53b4dd4f7f57a13df638b162e4) >>
+>> endobj
+7922 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 697.089 243.5497 707.993]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7924 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 660.409 205.1119 671.3129]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f1921cd40fb0920e1173cf67418c63fe) >>
+>> endobj
+7926 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 587.4936 190.7379 598.3975]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 587.4936 261.8505 598.3975]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ed38463ae788879580d6372653452603) >>
+>> endobj
+7929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 550.8135 190.7379 561.7175]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+7930 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 550.8135 262.1594 561.7175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_8b99abb6e15eedbdb94e2466e8304c52) >>
+>> endobj
+7931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.2253 537.2799 390.0817 547.1852]
+/Subtype /Link
+/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >>
+>> endobj
+7933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 514.1335 202.9218 525.0374]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 514.1335 248.5799 525.0374]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b5dfec17f683d1cbe01cfc71d601108c) >>
+>> endobj
+7936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 477.4534 202.9218 488.3574]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+7937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 477.4534 296.1808 488.3574]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f14ea5b6122685afd62a3df786512d77) >>
+>> endobj
+7939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 440.7734 209.5473 451.6773]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+7940 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 440.7734 261.8309 451.6773]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f7fd07f1f8d91c830130c061da7b6c56) >>
+>> endobj
+7942 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 404.0934 209.5473 414.9973]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+7943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 404.0934 309.4317 414.9973]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b7c86f7ff6b09ff72e3ee3382b4c933b) >>
+>> endobj
+7944 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 356.4544 180.4964 367.3583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e85fbe787fa3e172ecf6a63b2847d69a) >>
+>> endobj
+7945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 356.4544 280.102 367.3583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7946 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 321.676 213.1533 332.58]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f2c70f89a472f7fa34ba64817693776a) >>
+>> endobj
+7947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 321.676 312.7589 332.58]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 286.8976 213.1634 297.8016]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0d1677ef76c939ca2025722d2ee249e2) >>
+>> endobj
+7949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 286.8976 312.769 297.8016]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+7950 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 252.1193 205.6917 263.0232]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+7951 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 252.1193 261.3124 263.0232]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_81c8a26a02090eb4fb9255dd814514a8) >>
+>> endobj
+7952 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 252.1193 332.1558 263.0232]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+7953 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 217.3409 205.6917 228.2448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+7954 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 217.3409 261.3124 228.2448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_2d266342acc104c59dc0046242ccdac8) >>
+>> endobj
+7955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 217.3409 338.7813 228.2448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+7956 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 182.5625 205.6818 193.4664]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+7957 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 182.5625 261.3025 193.4664]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_46a4105c8476e5f5260a775777398586) >>
+>> endobj
+7958 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 182.5625 330.4624 193.4664]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+7960 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 147.7841 183.8239 158.6881]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_353fe86259fbb2dd09d451e9dd468676) >>
+>> endobj
+7962 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 111.4777 192.2722 122.008]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_aae8e418bb3d7a1432117530eaea7ec4) >>
+>> endobj
+7963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7919 0 obj <<
+/D [7917 0 R /XYZ 90 757.9346 null]
+>> endobj
+7920 0 obj <<
+/D [7917 0 R /XYZ 90 714.1444 null]
+>> endobj
+7923 0 obj <<
+/D [7917 0 R /XYZ 90 677.4644 null]
+>> endobj
+7925 0 obj <<
+/D [7917 0 R /XYZ 90 602.5266 null]
+>> endobj
+7928 0 obj <<
+/D [7917 0 R /XYZ 90 567.8689 null]
+>> endobj
+7932 0 obj <<
+/D [7917 0 R /XYZ 90 531.1888 null]
+>> endobj
+7935 0 obj <<
+/D [7917 0 R /XYZ 90 494.5088 null]
+>> endobj
+7938 0 obj <<
+/D [7917 0 R /XYZ 90 457.8288 null]
+>> endobj
+7941 0 obj <<
+/D [7917 0 R /XYZ 90 421.1487 null]
+>> endobj
+7959 0 obj <<
+/D [7917 0 R /XYZ 90 164.8395 null]
+>> endobj
+7961 0 obj <<
+/D [7917 0 R /XYZ 90 128.1594 null]
+>> endobj
+7916 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7973 0 obj <<
+/Length 3582      
+/Filter /FlateDecode
+>>
+stream
+x��\ko���_1��6s�~E�>� y ��_���gd{�yu$�q}/%��D
��Yo�t$��\�{x�{xHI$3
����3%2���|}�g����H��%�~�����/��d$��w7�I�����-~<'1}qI0��o.>/����������]��W�.������Ͽ����vS��������w_�����=�I�(����ؚ��(3��x7�� „�
��u��UQU�T`�f�y�ޭ��l��CyS�/�>/7s�3L�3,�ӳ/���u�L�����3�- �_�aČ�G��1���g�2�eu�����O�Cs�X�p���R�.GZ��cVsD�З�!,�})h����Tϼ�M�O�F�#� ������*�J�
釽�nWQX.5�
�ڟ����! g������bY��e]F@�FCM���r�
�l�w,0�K�q7�n�z�$��$'c0C�k
�G12���0>��� ���MԈ��9���CY��7UWR*�g���J���w��s
+�U��hy�6��,�����?�e�Ip9Wv���0f#@8�X���U
GW�M�_0un ��`��шcA�O?s���V���Z"i��ԯ7��o�0Q���]���&�vB�f D~�����o�"�a(>\�n���E7
A�Aڏ(_���pB��>���~��[��sC�����DK�00�����*�+bg�/��a���q]�a�E�
;��� "�]���v��]΋���j��VqES߆�t*�Q�
q���zf@t�V&�s�#U��������`W݈�:�
�����*�t׊������;�]1�M�T��|yV oFh�cg�g��a��q
+�aӬ�
;�� "��_],7��r�j��r��·��B\�**�o�A�Dd'�~/
�
�V���df|�����n����6�톢��UYT�s���
-
���Gّ@3l �2
@薗& �*$
��fY
& �#�^�$��N �
��o��U�o:?Z�[�H���*
z�h�i��6 [...]
C3r
+b��vl�
9�S���Tz�<Sl����0
�f�^�)l��m�����o�W������f�Qi@�$��2`(��Fz�q�
@� �395'�>#�ka|
�S쯾�u�/�j��
�0F�"32�Uc
e97�� a2O6�dN#��G�)��U���ɋ����������~ݬ����j>"{�&0;�=e�=1�,�綘�Y�=�)�L�u��M�g/��L����\m��y��S�
��Nf�[e�X�4aZ�ĩ���
g��0�:�5�!#�<x�
�%4�ģY�pCN�o
}$Xӛ�NY��c�1���F�\s$�i;p�$'W�,Jr;p�,K���if�v��
{�4A�
�&9Ӛ���������z��rl�M�&��;�\hX{sf��$�ˆ�	����IDI��C"e:�*h�i=�(��gU��!T��	��,��橙mycgN`:_��N,S����tB�U��(w?!���je�(,��Lx�
���Lp��b$S&�*�>���
���
����
;1�	�ͦ��U�����_O�o9�8���6�o�Yv�e��s�ᚄ�"�|
��>
��m��� ��!��
����r������1�j"Dv� ��?|	&~*X.���?k$���?�!�
� y�[�-�ݹ!��ou3�?� *�rpc|��
��V_��w�?�������"!7�B�b��k4�
+т��3�ˍ�aJn��:��Mʍ^�	r#
~�u��H��Yn�C{���x^nLK@ 7�0b�GʍT.����Fb�ܘ��@n$��~����r#
�ˍ^BrrcZ&���=Rn�2ȍ4/7�L
+7��em�KB��kg^0Rڑ_
�rS�
�0HT�ai�Nư��U&8��
�����T��
A
���}$��7���>i���Z~�
�h?>ޕ�u#m!��pq̆V�h�Pvo�+�P��0�kf^\�1��7�~�,+�B�	ᗉ�	�^�q᧐"L�&�_g��m��rs@��B���m�r��#>��A�+?�11�>#�;Y�)���L8�
#��b����[�RLM���`��N�}����|x�
��e�j���}V�Lτ�π��N�}i�˄�ʁ zVb4V�q�{�S2�}���o3Y/Zrs��	|���3�K�<�&��)
+�P>���|h����>�|�}Q�LP>Q������RJ��͋�
��=�.�3�g���v��5���?C�0��{�ʛ�F�0%4�q��æ�F/�����$4�m�B#
�
�^��BcZ����=Nh�2�,4���!L�� [...]
+�T&���F���� =�1��#_)6���n!�kg^0��4��`R�c%0�
��*�nDi�i?��
&
+Cjग�C	���>ɬO2�d�{o.�5����
q����i>��P�i-�ϛe5_�0��2q;��
�|�v“� �_���o���.!$�lg��*t
������7Z1~7>R��̚9����3{~����_��R�b��������⨊zY�rN�Dv���v
+Yľ�DA^2^a�%T�

̚��J�=~���|�y3�����˿-����M�ߴ'U�� ��rs����r}�^;��~3����ӽ��]�=���v��y�{�Ȥ^B=Hey��-qO�Y�.�Y�.�q=]d�vt�
�М!�\�Q6�
B')��ρ��Z�bq�_>�Wl�X%`�%��2(V�i�p��8Lqbj�y��k�"8� %�0:3�U.����~�W�=Q	����}�(3�Lofa�y��T0�������Gd�i���7�(� ����vx_�u*�;ۨ�����4"	pm筏��w�'C���{#L�Z��ļY���)�K�u|���]/��K����|Wń�p&�*��"
r��?�x
+.�|j&�}F�OzWo�2n�HU��t.�U#vCtīy�&?
+tm���
|��ϙ���s�(��h�H�<��l>F# 
c�>�H{�0���/
	��k&�,�fy�

�x/
��^6�{��Sx/
"��xo_6k����L� L^�LR�U�ƞ���1r�,i`��&g���D~���Hs�Si�V��AƆ�#��^NNZ..�����o;�J`n6b�ԓǜ�c��㲾��w�����_
{��^Au�j�A#'�
+)b�{�
�+[��އ�6�
K�1���}���c�9d�aӤx���w�q��;������B���-�7����������&@Ż}IU�`||����t� V!�,���2s��	X�]p\�nw��ɑ_���}�����#�W�~���Ѳ~�ۭ^G7�0F�*��Koa饟H{-�r�Nq[o�~/
+��.�J4������ Ƽ"Tendstream
+endobj
+7972 0 obj <<
+/Type /Page
+/Contents 7973 0 R
+/Resources 7971 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7964 0 R
+/Annots [ 7976 0 R 7978 0 R 7980 0 R 7982 0 R 7983 0 R 7984 0 R 7985 0 R 7986 0 R 7987 0 R 7988 0 R 7989 0 R 7990 0 R 7991 0 R 7992 0 R 7993 0 R 7994 0 R 7995 0 R 7996 0 R 7997 0 R 7998 0 R 7999 0 R 8000 0 R 8001 0 R 8002 0 R 8003 0 R 8004 0 R 8005 0 R 8006 0 R 8008 0 R 8009 0 R 8010 0 R 8011 0 R 8012 0 R 8013 0 R 8014 0 R 8015 0 R ]
+>> endobj
+7976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 720.2859 189.9009 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e3be22e7dcdf54fdc0fb976fd755d0c7) >>
+>> endobj
+7978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 683.9171 193.2289 694.4474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_74d2b64496aa448a85ec0b370cee0977) >>
+>> endobj
+7980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 647.1747 241.9353 658.0786]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_3905c42e02befd8a894c57abd9f972f5) >>
+>> endobj
+7982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 610.8059 238.4586 621.7098]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_22b6ac7ec1477dc82d6db22900b59be2) >>
+>> endobj
+7983 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 574.8107 187.6893 585.341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_d423a6ddce01a2f2efb34b826d0de921) >>
+>> endobj
+7984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 574.8107 226.6926 585.341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+7985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 539.8143 228.8952 550.7183]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_7ae373e57180f03b09aa0e38d1f19811) >>
+>> endobj
+7986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 539.8143 333.4819 550.7183]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 505.1916 229.5026 516.0955]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1ae372d4f3b58cfa4af6edd51d845209) >>
+>> endobj
+7988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 505.1916 334.0894 516.0955]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7989 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 470.5688 187.2643 481.4728]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e90a75aac44c14997804b8911ff7bbb) >>
+>> endobj
+7990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 470.5688 293.2128 481.4728]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 470.5688 371.1477 481.4728]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 470.5688 455.7274 481.4728]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 413.032 187.2643 423.9359]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_cb19de0243a618e9bf3d62e2ee04ae01) >>
+>> endobj
+7994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 413.032 293.2128 423.9359]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+7995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 413.032 371.1477 423.9359]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 413.032 455.7274 423.9359]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+7997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 401.0768 220.0576 411.9808]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+7998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 355.4952 186.3482 366.3991]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_cfec639e917dfd6eb63c4006ac55b807) >>
+>> endobj
+7999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 355.4952 293.7723 366.3991]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 355.4952 373.3671 366.3991]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 355.4952 456.8371 366.3991]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 297.9583 186.3482 308.8623]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_217e4addfae235df12c449320e65f891) >>
+>> endobj
+8003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 297.9583 293.7723 308.8623]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 297.9583 373.3671 308.8623]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8005 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 297.9583 456.8371 308.8623]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 286.0032 218.4038 296.9071]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+8008 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 240.7951 161.6774 251.3254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_35518da8c480784110d40b680256bd61) >>
+>> endobj
+8009 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 168.7356 205.7516 179.266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ae058fd9619a17e121c3aab9b0612d81) >>
+>> endobj
+8010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 168.7356 276.595 179.266]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8011 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 133.7393 209.6269 144.6432]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_dc269190695c1745ab086168fcf35835) >>
+>> endobj
+8012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 133.7393 314.7912 144.6432]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 99.1165 248.202 110.0205]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e09e7efc2f63aba534614086427bf49) >>
+>> endobj
+8014 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.0176 99.1165 329.8447 110.0205]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+7974 0 obj <<
+/D [7972 0 R /XYZ 90 757.9346 null]
+>> endobj
+7975 0 obj <<
+/D [7972 0 R /XYZ 90 733.028 null]
+>> endobj
+7977 0 obj <<
+/D [7972 0 R /XYZ 90 700.521 null]
+>> endobj
+7979 0 obj <<
+/D [7972 0 R /XYZ 90 664.1522 null]
+>> endobj
+7981 0 obj <<
+/D [7972 0 R /XYZ 90 627.7834 null]
+>> endobj
+8007 0 obj <<
+/D [7972 0 R /XYZ 90 257.3991 null]
+>> endobj
+7971 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8028 0 obj <<
+/Length 3868      
+/Filter /FlateDecode
+>>
+stream
+x��\ێ�}߯��
d[}�A�$��8	�Xr^
�����L%o�>�s��K��\
+6=h�{Xu���TuOϰ�l���(C��z�����#|�����
�~������Z�
q���ۇʂfDq�goW��2F���g���o��]
���7w���7O��q1����qq|�⋯���q�[l�o�/��o�z�%c�y�
��p�����$
%\8� �q�	e��Q�,N��{�(Xs���
6���?��x(�w���%|$�P��jo���oC��*���ۏ7��@g+�W7�g��#�B	s�϶7�����͛�;��/
��pn�
�$����DKk��A�0��
��8e� �QI�
��q�k�A�8��͹���9W� 1���
���(�/ׄ:���P%�z�s-=����:>6�oc-
#ѳ�Y,V��r�{<����p��|�6��Bpjk�섟*
+
NeϹ��0��"�1=�մ���J,
+��焤"��j�q`Ci��d3�@%�����B��
�����3
����4FK

yRX��Y��-������C�I
5�-SB)���򱆤~����Y�k���F�NO��؎�<�?�}3&�R���߯O� FS׀|&~\���粶�]����׻���0���)����a��`�٫�6j����{����!~�Kܢ�����{��ݾ����Fi��C@!8��Hݍ���A�Ze�F"�1=������ӭCGpC��
L7a[BB@�}�JI�����%�p�D#9	la��8սe����9���P1 F�hj̧HQ��ȩ��zW6
����M�+�T�zҸ�
I���'�
�<D�Y(�]O� �kw}e�
zP�	c��u��\N�N[U�|�����Y]��"
��Ϲ����#��P�s��<P����	�w
+�-��� ��w�N�D S������g �,;�&.��<���Z��FN[XG?Mv
� eX*/OW�S�/��WFP^����0RC��S��Kcd0��y��8�nquL\O��<��]��X@��]1�>�+���=���e�EP.������
�"�X95$����mtr$�j5��A(Ļ��P�M���2������F\�����B���ݩ��l�ڻ!�����E�!?=��He-2u�N���\�M�j�s�Ys
�ڤ�!mu��J���� �kиD*+`
ѹ�D*�!��M
0T"c��D�6��E%2u=A"=��9���;
#Y> �p��Z
���Q�4�*�Ԑ<F�g7��(�#V�|
Z�[p�&���**�����ԑ��>6����U��*�>}W�J�8�pjGe�T��(-1���WEa|
��5�����*������U1q=E�$zvs�cY-`�p�H
B�x�U���x�������h��}���Zc�ȇ"�B [...]
+�
�x'��2�O�F�#
�V��H*K��r��j
�3��]:
莤�`A8}�`�62�`?C0��!=6�HΔ$���/#���w,5WK	��
�{`�\�3z��m3q�*f�z�d"$zv=��.��="��36���w~?�uc?pۆ9?S ���ţ
�v=��1�n���ݦ�� 駬��B�
	!P�4��{�
��mL�6rB����=�K�|B�J�zC
�R��03T

�ӳ[���f�[
�^ږ�r���+���
��\��
+aBJ���%,���~��|��S��N�~s7�P,�f4����â:�)��j�-v�&,�
+E	��nڇ�q�Di„k��o������i�XU��IU�"F��3����s��p�35�R�Wׯ9
�Nh��0��Ds5'﷭9�[��$��Ԝ<����5'�皓wjN���
B��S�����^�9���M��:���XX�[�(a�����hH�U�Q�"�/�E��\-jai-R�
�"M���IfjQ�����N�E
+"V�r&b����^�坠��] �h��H�CU����~R���U1j����T��'~�R}P�)�Q(S��:kY�����{]~:���$�;p
�/��:�ͺ﹦����
᳞"�|[M�"����K����}`h%�
f*ⷩd�[����'T2�DϮg
��x�i �<���_T8��_�cP
�!��c����g��h<F�g��x�)=�a�"�hA��d
E/!��)[��D2yI�Ld
+W����UY�=,�
Jg_��YP�*K��Q���ېZG��{[�VCb��s	[bOV&D&��
+��R׿�	Έ�$����
+�)d�o���[\!�S2O�g��P����y�SGjat���!�
+��2&���T
�!�/�'F"�1=�S���K�f#P�l��
���%�E70c9�la��<mX�5m��oھpQ�M�:́��w��~(�\����C$��vn�McA�
��5�‚�cnj[����r�u��k�����u�2�Z��>�Cq��۟w���RMyQ�!���.7�:���<
��'�!�]���N�2�l
(�_J��2�*w�h�.ڼ�mdT5�<�7�mѮv��ø�Oun���
�
�:���82�9�΍VX;`�d�
ff;ⷙ��w��fh�s�X�mv�Wx�@��@+5_?�
����r�P_d�x� ��?� 
>���ꨙ���h��N��p�Bk�D@!��0��H)`�_ib�����m��
���
p�4+��Ͻ����M�#�
+�"���mM�	[}O��,H*[6�S}
u�I�7�,o�������(V��o�Yp�?�e��|��\���K��#��.���=�����4t�ٸ���bs�Te�>��}��)��]f*�?���3g
���N�^ "�������m�@$n��<����~0_#4,
���\L
+����2�1��*�o�Q-�F&�1=�S������#P�
1d;��U	
+��hs2���-lR�X�P�����#TPu���Y��D
U��`F��"$n�%b�z�!ѳ۶����?f�P
��#�E! Al> -�R=��������(g�Ԉ<F�gw�N�:��B(����O����@�s�.Q��FF
���wM6���n�;���W�uf}�W�L�Z��f
t��W�ϸ�/ߌcZ���.�O쿘�S��_��md0��y����nq�M\OQ�<��]�b����v��|4
+!��0��JGa�eQ�
�H&�#�1=�S�f�a��#P��Ԛ����}	�^�y�6rZ���;��z��u�X
���z�0)�֫��b̉A�o+���b,u;a1����
N��a�~x��OP���He�+�D�P(�N�P)^=����Ř#�Ml��1
+]��Vb�!]>�0�?�R��r"
����l�����۵��Z�^�93�Y
���*��4�	��
����EQ���w��C��A�)4~�Rp��+�!�(���cҥ��N�k
b�b�P��W�
�m	��xP�8)>����
4���5�u���Z��)���Q65~:�a�V}�iڇO&�[���P>�)��
�;�ʿ�a`ȩC�V��7UW�
+��oHh�Eg��CL�zSw{Q�T��
��Åߴ�	�m^^��
��o�6W�����>�����7U
O!4@�
�7�;�����7���!�ci���g����e���o�oG7�%���
_��/^����#Y��y�>
ɺ|}8l^wyI
+���ȍ�} ��$����6��?6�U�C����J at zy�� ��7�@endstream
+endobj
+8027 0 obj <<
+/Type /Page
+/Contents 8028 0 R
+/Resources 8026 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7964 0 R
+/Annots [ 8030 0 R 8031 0 R 8032 0 R 8033 0 R 8034 0 R 8035 0 R 8036 0 R 8037 0 R 8038 0 R 8039 0 R 8040 0 R 8041 0 R 8042 0 R 8043 0 R 8044 0 R 8045 0 R 8046 0 R 8047 0 R 8048 0 R 8049 0 R 8050 0 R 8051 0 R 8052 0 R 8053 0 R 8055 0 R 8056 0 R 8057 0 R 8058 0 R 8060 0 R 8061 0 R 8062 0 R 8063 0 R 8065 0 R 8066 0 R 8067 0 R 8068 0 R 8069 0 R 8070 0 R ]
+>> endobj
+8030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 708.9533 212.377 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e9ecea59dea0ccb1cc3600bc11f1056) >>
+>> endobj
+8031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 708.9533 289.8459 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+8032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 674.0841 216.2524 684.988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_a493e3939364ce0db66b42f0ef6511d0) >>
+>> endobj
+8033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 674.0841 328.0421 684.988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 639.2149 254.8275 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1cd37a76428add108f267548ae76664b) >>
+>> endobj
+8035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 639.2149 343.0957 650.1188]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 604.7192 236.7449 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_594973c5284386e52b8c33b206a47907) >>
+>> endobj
+8037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 604.7192 307.5883 615.2496]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 569.4764 243.3704 580.3803]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_580264341ec83f4bf3d6da1205939b0a) >>
+>> endobj
+8039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 569.4764 320.8393 580.3803]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+8040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 534.6071 240.6203 545.5111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c6376a87e99d3cdabaa6ee7542474849) >>
+>> endobj
+8041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 534.6071 345.7846 545.5111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 499.7379 247.2458 510.6418]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_a317313059bdf973567d2fcf5e030212) >>
+>> endobj
+8043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 499.7379 359.0355 510.6418]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 465.2423 193.5774 475.7726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_fea57a711a6b7a5d501112b84b246759) >>
+>> endobj
+8045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 465.2423 232.5806 475.7726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 452.2405 248.8445 462.1457]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 419.4141 193.5774 429.9445]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6ff5e78b07441619f850114578ca48d5) >>
+>> endobj
+8048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 419.4141 277.6909 429.9445]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+8049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 406.4123 252.6774 416.3176]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 373.2124 223.4647 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_bfde1aac87d8218fce0fa9b4ea8a5eb1) >>
+>> endobj
+8051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 373.2124 323.0702 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 338.3431 209.6369 349.2471]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e8a18fa1167e4ee4b494501debb69611) >>
+>> endobj
+8053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9741 338.3431 309.2425 349.2471]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 303.4739 229.5525 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ec298ee7df246c945e6a56442e04176d) >>
+>> endobj
+8056 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 303.4739 329.1581 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 266.6121 246.7573 277.5161]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ab445f2f18807e939aeaf4d27e3bdc06) >>
+>> endobj
+8058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.0945 266.6121 346.3629 277.5161]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 220.784 266.6729 231.6879]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_bfb434e3d574f4bd53314ac8749c4731) >>
+>> endobj
+8061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0101 220.784 366.2785 231.6879]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8062 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 183.9222 234.2643 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6484bee8e8765d0f3e9f16a59a8cf6f6) >>
+>> endobj
+8063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.6015 183.9222 333.8698 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 149.053 217.1088 159.9569]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_72782e7d9a6612efd73b253b0f862c6b) >>
+>> endobj
+8066 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 149.053 316.7143 159.9569]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8067 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 112.1912 271.1256 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a0d8c78069019f44dc34ebab82ecfc6) >>
+>> endobj
+8068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.4628 112.1912 370.7312 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.8625 99.563 326.2592 109.4682]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+8070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8029 0 obj <<
+/D [8027 0 R /XYZ 90 757.9346 null]
+>> endobj
+8054 0 obj <<
+/D [8027 0 R /XYZ 90 320.5747 null]
+>> endobj
+8059 0 obj <<
+/D [8027 0 R /XYZ 90 237.8848 null]
+>> endobj
+8064 0 obj <<
+/D [8027 0 R /XYZ 90 166.1538 null]
+>> endobj
+8026 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8087 0 obj <<
+/Length 4772      
+/Filter /FlateDecode
+>>
+stream
+x��]ms#�q��_�O�ʃ���V����N�qʗ�M��\*�4+�"�
+I�F������`�������|y�x� �40CvI��t��(C������^����z���
��Ā�x���Z]:�4ח?w4#�3~����+ƈ�W
�����bt��?�����t�{x�oo����o>�����ps\������O�՟>���o��s�ֆ
���=$a�(��I��8a�&������a}8\5\Q����}|zX���������U�����j%�A���<�
��f�������-8�w�g��xB	s�_>^H.�'?^�g�ӿ�}`��wk��$V��'PL-��Ǔ&aԙK�2�u� F%aFp
�^�0�
�
ќ�� C��Ĺ;�q�nl0ow@���P��f���6kZZ�,���������5�]d��|���'J����<���1N)1R�+�‚SM�3��hޮ#RX��_e0��
���1�`���@r����
T� t��g�AA�W��~u�h�W7���Qq�P��b�
���.���fۮ�׿���}{8lv�1
a`�
^
U!!�"����x�^1�
+�o�۵a��l�����_o��:�]7H��3��0~�T��$� �1���
7��q��unw�mqt�_����]jk0B��<�A�'�r�����;F^¤�Z����~��~��BB���;�_(�>(
1N�?�	�dL�DS3d�����c\Ρ{P>Q8'Jّ3���W�xf�.Hs}��<D/��w�O�Lkb4W�~j��HC
1tDi�y��0�d�v���}�������7G��ݳ����f{�?�9�l����8����h�Yb�q
���@K�N���{zMKw�����
NeaV>�ts����l���m�§�	�V��pʳh�΄�t!
����S�Y�� ۢ 0aO�>3�C�����,~s��8�
VQ8VU8���©��N���1�*9j� pzx���j&o �M+
H�0UvE at Uxp\RQ>�)���hc�:"�
�v�
+G1����`@�(�_2vh�p`"�)
�5���^�5R�݅
+f�t�와����!�&$�
+}�T�@���/�p`�+ٴ�[�p"%�3���9�S8�I��� �2YP8
򹂯�z�0g=���s������SgY��`��.�=�T��M$�J�Mk
x��ٻ�k����NZ���O�Z�	���ց1����=�u`�S�
�;z�ر��ء�Hg͛�
�4Q�ي�	��ډ
�N�]�v�f�Վ&R at jH�.�
�����"��v�����oo��v`}̨`e�T�Q'0��1�|@ p%�R�|���n]�X
!���
T��c��̆�I���E�f�RW|�In���>�1l^����i���
Kӕ�P5
+�1�}�pxy���Rb$wK
�6��E�O1Q���
���WO�>L5��&�N��-_��b]`i�*W��x"����ZMe��f�
�lg�&�es��x� �����*,�OiP�4D9�Gi�͇�_��n�Q:�lq[	�X�Yzf�
+
r�1���6��x�[XZ���k*'�\�;�
+�Ky�|��jx�^*��ӑ(�*���R�C���*8����\1�V�{�БI�1%�bq��.b�fK� C� D4'�k=��f�
�߬����p��/�{pM0��6;/%
OM+�M��T^50��4!|
���E%�c�W_��~�N���j
�d��<L�0�6~c����7��,/����=�H��-�h�9a�b��>$`]��uU�@
+���
_X�U��
���
��o��!��͖�|Ԃ�Ӧ�u�_#���:�k��^rK at Uq%b���t�
t��2�|�FfwY�
¾��T� `i�EL����!�VI�]ꅀ�Q��.�LB�.:!�*��.�N)�+����az���¸�Lob|a��E��S�Ҏ�d��
U��)dQaMJ����P��S�|ݦjl�$MXZr��%G�>
�y]�Kp�bi����)�4#MDC��E�&��M��w�?-M����ڴ��'���tSnwV�"�Qݔ��)�i�q�
�W|M@��Si���{B
��.e�6�5]
+[€�ӥI��ѱa�����w������|E�P"
6W4˂q!�-�'
ִ8{s�'-�L�™|V|���૴�sG�lI�9������5�]d�i���Ğ��oF�]P6\B�dl�f��)5t��B|���n��i@�qY�՚���i�A���[�G���*��'_!��]�r$�?j�~@
+�Z"1T$�=|�
U�f�#
�F�|�|�Yf7r��H��Fm$�{��>-u�/)��P@M����C��K�s�s渿Z�T��j�_�Cc
`���oQ�<{��b
*r
*��&��:�C�X��N�
+6�C-�U��\A�z|��r�Q*�ٌ��i�l���NGX3�rrI�T!��G	K	V�Z�S��	�!��a�\O49�BkG��)q��Qu�]�z}�Bf0��6'��iA(��u�� 匊
�?��'d3h{
F`��<��YQ��Z
�aq����~}��=�+>��
�`	��)��Y��m���Y�__�.�v����\�C�� DI�{T]��̕4{��A�Gm�*vY��Q��}�W��볳�2��<�l�'Tf�A`0ky�S�݀=��:$�k͏�V�z�{Oiy@P�u� �|D�I�����s�Wh��.)�RC��0PrC �ۗX�*m?�d�V5M���$/�[=� g���<��$� ��:� 
�Q�A
�(� K���gU���֎
+����	PxG��r�Rx�ۙ�xY|RY4:Y��Z&�
��|h����N��
\g�8��7h���j*g��}�S�\��^}&A�
rٙ.��|���;)�%�	��x%27g��&�9�`	MK2��ERP�O$hS.P�*O�b٤5�J���R�O2��o-y!}��y�*zc��[i��ޤ��J5֙p�%M*�
_#���J�۝��x&�*��bEK�
2{8f,,j�R�|�Efw��7hl�U!!,���(�<���\.�Zꇀ�P��.��w�+{!�j,�0�dJa��^|"(d�D|NZ讱�8���K�̥����K��e�xw�	=�3�;�B�s�"%Q=� @rgث�id�$OXz�V�y*�~
a��u'Y�@xT�N��L��;��T���ǟ�7�'k�Gw��3�OauaD�:p^��Jo�v�O����Z�\���A�XuM@�TS�aejQ��TKT� ��F�,0\��/{`��G� Ɖ�ׁTɣЌ
`u
,��r����-_���MW���u���
���,����
U!�'T��|���fi [...]
�T�ʂU�,ghTC�E���R��r^���E�X�J�kQ9�E!�1jF
XТ
_��nr�ٌ�N(B��#�	��^Z�i\GOXp�7=� =t�� J�3l��Mls�{MC����ŧ
R\�WO14wG�����~}��40�f��P��?�`k
iJ�`�8�aF��R��<�`��mN�gMkP8�ɷ8��qlj�?�̥�*kǐ�*�c�Q_i׋��ْ��N�Q�EQ��k$2�]�<������KyyE
+���XrE at UXpt�W-��r.�#G�bg|�FfiL�17=�+`�9[�D at U(�
�R
+�^�jH�L��uj(�QRC,�8Vt�$�U�<wω�7*T
���s�@��7�ǧ�c�
_��N�@
��{�{Tx|�U��aF5��ʏujb�(wcP���&L���O��K�n'{���=T�m������z��S�YOY�
+�7�
�~�]�<���d��8��y#j��6�v�d�"���nT�v���
ʛ���y?�;��OWtF ��peUV�=�����9X�C��&`�6
+3����C��M����Gˮ���2,��
�0�}խ|A�<�Xw���cV�x���̫��^�lu�M/�|�������3�����z�������W�B��
���+��2c�S<��`ds�l���Ȭw&�С*,e
�LS
+�^���d�[��gE
��B���Ӳ!,Y����ו�wMQ�U�0�Q�p�ۑ���H²�r�Ìm��)�
��Y�W�`- �b�6Ucc
�0����"�{�:����
���<���N�Ji*o�@�~��T��q�E��e"8�a#�N�%1���zOǗ�v�~��ߎ��t��Į��Be�߀I��8�w��r��SE��Dc�����&��T>
���|�w`M�M�SU�`U�p-R:�t*4��^	���
+ӷ
t%GT���rܰ��)�
+y~
�+����=AW��F!�Ŏ0g����d�%c��[�6J)y�}C)9�ޒ�\tUn�kSr�W�\f3���7����s�_�薧�x��dT���cZ�W��W��k�W�\r�{�7����
�}���0¿�F��q�?��?����?��C���+�V~J��z�<,�1���������@�>�[n0��%]��N�,�p�
;/���������T�?�D��n�D_9��_��x|�����/_�́<o7O{�9�zzx����E�+;��A����r,�ۄ��.ƃ�
w{�
�-����\2}�یʟ�8��endstream
+endobj
+8086 0 obj <<
+/Type /Page
+/Contents 8087 0 R
+/Resources 8085 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7964 0 R
+/Annots [ 8089 0 R 8090 0 R 8091 0 R 8092 0 R 8093 0 R 8094 0 R 8095 0 R 8096 0 R 8097 0 R 8098 0 R 8099 0 R 8100 0 R 8101 0 R 8102 0 R 8103 0 R 8104 0 R 8105 0 R 8106 0 R 8107 0 R 8108 0 R 8109 0 R 8110 0 R 8111 0 R 8112 0 R 8113 0 R 8114 0 R 8115 0 R 8116 0 R 8117 0 R 8118 0 R 8119 0 R 8120 0 R 8121 0 R 8122 0 R 8123 0 R 8124 0 R 8125 0 R 8126 0 R 8127 0 R 8128 0 R 8129 0 R 8130 0 R 8131 0 R 8132 0 R 8134 0 R 8135 0 R 8136 0 R 8137 0 R 8138 0 R 8139 0 R 8140 0 R 8141 0 R ]
+>> endobj
+8089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 708.9533 201.7419 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ccc6c6488ea9d8555ea8e978cf188749) >>
+>> endobj
+8090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 708.9533 243.6294 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 708.9533 371.3288 719.8573]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.5617 684.37 267.7587 694.2752]
+/Subtype /Link
+/A << /S /GoTo /D (main_affine_relation) >>
+>> endobj
+8093 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 651.17 212.7678 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ba9abb279871c30a4f0c6cbb188fecc1) >>
+>> endobj
+8094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 651.17 252.9591 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 651.17 375.1455 662.074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8096 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.6566 626.5867 275.7477 636.4919]
+/Subtype /Link
+/A << /S /GoTo /D (main_affine_relation) >>
+>> endobj
+8097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 593.3867 250.0993 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_934cc1f45a6d438f5d468276140cd5a8) >>
+>> endobj
+8098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 593.3867 289.4458 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 593.3867 379.5123 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8100 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 593.3867 513.9963 604.2907]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.2551 568.8033 484.6602 579.7594]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 535.6034 250.7476 546.5073]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_196d1efc79437ca1d96b79b7cd60387f) >>
+>> endobj
+8103 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 535.6034 357.3173 546.5073]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 535.6034 456.1447 546.5073]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 523.6482 202.3443 534.5522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.3595 511.02 470.793 521.9761]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 477.8201 239.9836 488.724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b499fba7b7be2932147748248180e057) >>
+>> endobj
+8108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 477.8201 280.8203 488.724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 477.8201 405.1043 488.724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8110 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 477.8201 513.9963 488.724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 465.8649 171.3608 476.7689]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8112 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 452.0277 432.0923 465.1857]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+8113 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 418.8339 266.586 429.7379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_702b00ff42a88c23ab25eecf0e9acef0) >>
+>> endobj
+8114 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 418.8339 309.697 429.7379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8115 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 418.8339 408.2337 429.7379]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8116 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 418.8339 513.9963 429.7379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8117 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 406.8788 171.3608 417.7827]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8118 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [362.1406 393.0416 414.3239 405.2066]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8119 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.0173 361.0506 265.396 371.9546]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_25f104e58f88e05dfcb905bcd66e493b) >>
+>> endobj
+8120 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.5684 361.0506 375.818 371.9546]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2392 361.0506 478.9794 371.9546]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 349.0954 225.8659 359.9994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8123 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2222 336.4672 466.6702 347.4233]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 303.2673 251.209 314.1712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0d4db6f54c7332e1a2e0bc85e16ba176) >>
+>> endobj
+8125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 303.2673 290.549 314.1712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 303.2673 409.9686 314.1712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 303.2673 513.9963 314.1712]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 291.3121 171.3608 302.2161]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 277.4749 456.9923 290.633]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+8130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 244.2811 224.5705 255.1851]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_44e10aa0180433db7d19fb8e473dc829) >>
+>> endobj
+8131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 244.2811 324.1761 255.1851]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 231.6529 347.8694 241.5582]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+8134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 209.4119 255.5641 220.3158]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_d8d04d80653fb850dd92468af1995f97) >>
+>> endobj
+8135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 172.5501 257.6366 183.4541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1d780ef5b99cc9752eb322353b7b6b08) >>
+>> endobj
+8136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.9737 172.5501 357.2421 183.4541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 159.9219 378.4537 169.8272]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.8973 125.7257 257.4342 136.6297]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_047e2a717168ae129338109f1afc9a7a) >>
+>> endobj
+8139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [284.3667 125.7257 356.6351 136.6297]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 101.1423 378.4537 111.0476]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8088 0 obj <<
+/D [8086 0 R /XYZ 90 757.9346 null]
+>> endobj
+8133 0 obj <<
+/D [8086 0 R /XYZ 90 226.5127 null]
+>> endobj
+8085 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R /F25 348 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8155 0 obj <<
+/Length 4080      
+/Filter /FlateDecode
+>>
+stream
+x��\ms���_�OWy&���%�v�I{M��$����$��%��FUI>���
��@����t:������b��. ��0���
�)��a\�V�+<{����_/��E�����7R�
2��ٻ�Z�$HPBg����	AL_/�x��5���+�__S<��O���X,���=ǧO?�ju.�W�b���/���|���@<�I�(�c����t, Qfx�x7 � „j̊�|[�N�
*0H3t^���\6�|Sޕ�k���~1�Ĝam�^���\�X�$�~���w?��
��F�h1{�_0"����S�~�^�\���i���`h~8�HS�g
Ƒ���C(�9"�Q�K�����4tQHR�g
f��=��?<B	"بY(0��P9�T"lHW�:d6�H5�`az��W��-����ɵV|���c�|ܬ��f�~	��y���D�DJ�v�Ge,�� ���MxU�O�H���#�:��sfDr�K64���"�	�ʘ������x�t-���f=>�턔�fU�pU
 [...]
A��ե�#8�9�q�<�S����'T;N8�v_=�	�i�9�R�	��ns.��v��k"�?��š��hS�GX�a�42�?s���^�Z�'e�� ���L����̈�N`!�S�>��9T��I8]<
U�]�aq
�{�K<>gO$�	�b�?/�p1��� �ԋT�f����t.wQtYr(�f�č
Y��aQm�2�N���
[�&����&�6�Lڰ̅��j&B)�v0k��v��5��n�|(-q3���C��g�)�[@?�3���>�;�����c�S*{L�,�ׅGeL`
+lK�M�Ss]�ۧ��b{�o������i�j�U�ַ�z<Z޴
���f?T�kp��,�`Z
� ��1_$��v�A۬4gM�-t���fb�H?� N�����
������8T��M�7���aq`����SY�!�
._���d���-
.��ARc[
+�]H�tB�TߓY���J.���X]S��x'	)/xL�
��>
+�>ڃ@�
+b�4?xtڀ��)��LPLR����r���Dݫ�d�Ca5�9���PF"�x�5��t��dҰ�]�vv� ��
z|�®�Knu��(KI�[���MRm鰭NgϤ����=���g�
Iu
rQZV��u�+�#�
T�0�d|,<*g���Ŕu�)��fU�?����ibċ�y���E��
,������:Vզx]3I{���^�sFDr�~�f���
5	�w�;
�1��i
+uwwVF�=p:$9�?
�1#�;��
�����	�fGʻ&�n�q6��A�Ed4�ݞ�g������N���L]2��
+�s�8�1��c����^���`�]
�I�
>�8����
 ����2��$����;��336� ]&]��5���d߱���Y��>������'���qb�������HGg��`2��-�$�(I��[��5���5q
1���#�m��V�tq�?�� ;�Z
�=�pð{�e�.�P�hM�o��⡅5T��ݖ�ƙo
����qw3��h'�m���=���ϛ]	4U�#����oaU�y��t��͡XE+�b��H�L�s%����}R}��ؒx�0�͆J't�I�=�u��^/O��˵��Ӳد�v���
m�ܰ�+<&i
� x!t=8qa�O)1�

��ܕiu��/�OC<4bT�Ԩ=&��I
e���.�j97H�\���jC�T�a����4����]��������~l��%�Z�޷^�ک�ն�����_ �鈯���>ξ�^aF>��"9��68�vyX�z�)�I�u���PG�
+J�M���X�RBLD Ѯ�_
(c�~�K�z�1HG)ms�4�x|ւ��)�u��}�t�Ge,�k0�Eׂ
5����)bjQ�/E4��ֺr�{��
pXKTgGXϥ+�l+֗�+fT��M�ʒU .�Ui�-U�:�L��;����6��~U��=�7�dombh�RN�	�ch��z~t�_P�t�����R�lQh;a��>�~> �}�����D�)���&��o�F���D������r�
c`S�*q̓�p��zgBt���QH
+���Nݝ��G��U��c��-꽏�}���D�`�{{��S�9��\e�a�dLe��^�.B��|�Q=%a����Z+�宲i����2*rcg�&�~�IT at X�s��|�?Va�0:�3
�3#�k������)n��iyS�GL�fbā260ݭP�kës��-��IZ��
��L��[��Tfi@ͩ�.��4��y:��M�-z��i0�� �B}	
�	�qF��S�E\�1�J
a:�|�BI
�R��~���<�9C3$��I�xP�,��y�3C�04��(6�+
�Sߓ:�����
&��շԵ�(���^�?M� ��1�dzd���)�3CCÝ����<��sj:���Ǎc���C�>Ԟk�d�����9P*A1c����	�col�|�c�������ò
+Lpؐ^���27 ��ڳ{t�v+Sޞ
�,t�+�H� G��4�b���
������
t}� h@L�1���q�[0<�0#�݅���S%��j����$���ꝣ␧[X��P]{�{}5&c�
A?��6\ʳq��߼:���I>���Ϻo
�H𑇵|T
�Tԧ���Cp��M�Z�}��˖��8@{J�|�6��g�˵�<4��^�
VE�6
+�ɕPp�&c�QCbi���I���a(�����s�
���@`�"�z
E�j�T�Q=�j�FDr��岃=��1NL8�l��K<*c
�*��Ew*�J<�˦z�Eg�weF�`\g*�Ȍ��k{�R�(
,�^s<�$��#�VDMu��g,��N(t�j��+<*g����?�X�HKɞ�L�d�`������f���3=��gU
6�X
+�κ{[2P[�}'
�*�\�}��x�E6ۗ���9�_��!"�ԹפxX���)�N�u�
���wG��NɵV�U�u�Vdƾ�����QC�c���,�n�I7�&���sfDr'n�ٍt�d�
���Ah at D��톞��r����d��d�x|ΖHn6�qʑ
+�`Q؂2��=d~-�ג�N
�^�y�c�2��aֶ7�
{��4��O�td�k�ALk����Ƃ�\�_zU�(	�l�(�M�=�|�K
+B�/##P�L�>����]�������<|�3~���K���т���3�?������R�A��z�=M��7��2��}�CG�x�p�}��Z�b{X����}�T��gmH�¾-m���F�͇ͻ/R3�A����3e�� Ga���
�12����X�a5\d ��
��P� EA	Y�y{X��q~8���
��
v�r1����^"Z���ێ� rC�(a�N�#g~�`d|5CC�9���P��
�K��R��C����n�j�2A�Ү��eݢ3��d��C�_
˕���ն\�.����GNCo��2E�5
���>
�k����	{H<��D�f���5���"�s{BS�ׂ݅F�/���n&��W������]��/�:�������3���f��
�
/KLŇcIU�
{�2�)��=��x���Ǚ����=���_4�XC��ځߟχO_�~||D�z�oG�9�>
����BH�}b�
��q?���~r�b˝�a�U��UV�ᮾ��^ [...]
+endobj
+8154 0 obj <<
+/Type /Page
+/Contents 8155 0 R
+/Resources 8153 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7964 0 R
+/Annots [ 8157 0 R 8158 0 R 8159 0 R 8161 0 R 8162 0 R 8163 0 R 8164 0 R 8165 0 R 8166 0 R 8167 0 R 8168 0 R 8169 0 R 8170 0 R 8171 0 R 8172 0 R 8173 0 R 8174 0 R 8175 0 R 8176 0 R 8177 0 R 8178 0 R 8179 0 R 8180 0 R 8181 0 R 8182 0 R 8183 0 R 8184 0 R 8185 0 R 8186 0 R 8187 0 R 8188 0 R 8189 0 R 8190 0 R 8191 0 R 8192 0 R 8193 0 R 8196 0 R 8197 0 R 8199 0 R 8200 0 R ]
+>> endobj
+8157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 719.9123 257.7862 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_9b7061aa20aa4b513216bcdb1a905ce7) >>
+>> endobj
+8158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.1234 719.9123 357.3917 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 707.3039 375.7729 717.2092]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+8161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 685.0827 214.0604 695.9867]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_173628da404c1dc2c4d423cad7f9f960) >>
+>> endobj
+8162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3976 685.0827 313.6659 695.9867]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.5248 648.3005 308.7683 659.2044]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_fa62abe41a99d6a01cca319ed860bb5b) >>
+>> endobj
+8164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [340.9557 648.3005 413.224 659.2044]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [462.1912 648.3005 513.9963 659.2044]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 636.3453 156.4268 647.2492]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.4892 623.7369 302.7196 633.6422]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+8168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 590.5569 245.9108 601.4608]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_46d5dc7df45abdea275f0295fee58c23) >>
+>> endobj
+8169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.248 590.5569 345.5164 601.4608]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [319.3457 577.9485 393.2569 587.8538]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.8399 555.7274 291.5917 566.6313]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_87aadd3a9d47e978a32c9867b13220a4) >>
+>> endobj
+8172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.4093 555.7274 392.6777 566.6313]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.1692 555.7274 513.9963 566.6313]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.6217 531.1639 310.5328 541.0691]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 459.577 289.8656 470.4809]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_703f57855b17ef63b28f88fe13a51870) >>
+>> endobj
+8176 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 459.577 359.3244 470.4809]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 424.7475 290.9713 435.6514]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_204fb0538d07ee8ac3d5f2724419928b) >>
+>> endobj
+8178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 424.7475 360.4301 435.6514]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 389.9179 224.0028 400.8219]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f41476c22751c8d79e8599443aea93da) >>
+>> endobj
+8180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 389.9179 323.6084 400.8219]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 377.3096 272.4902 387.2149]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+8182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 355.0884 254.1498 365.9924]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1169e57865dfa83ffc8cc23071248340) >>
+>> endobj
+8183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 355.0884 338.2632 365.9924]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+8184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 320.2589 284.5854 331.1629]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ba8ba56b075b2be7b6309cfaed039070) >>
+>> endobj
+8185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 320.2589 354.0443 331.1629]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 273.4743 241.7263 284.3782]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_34dbbfe20e987a3d55c7a3f2d08f1aed) >>
+>> endobj
+8187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.6171 260.8659 407.6577 270.7712]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+8188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 238.6448 249.3181 249.5487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_100662089d61a01ea43a28a944da266c) >>
+>> endobj
+8189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 238.6448 288.3213 249.5487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 238.6448 371.5186 249.5487]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 203.8153 240.6204 214.7192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_128413fc4c3051aaa9033a8030509ae5) >>
+>> endobj
+8192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 203.8153 324.7339 214.7192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+8193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 203.8153 425.7242 214.7192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 125.1029 203.0748 136.0068]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 125.1029 296.3242 136.0068]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) >>
+>> endobj
+8199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 86.2883 287.8558 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_51fb0220102e525b11cdb06dcbe322c7) >>
+>> endobj
+8200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8156 0 obj <<
+/D [8154 0 R /XYZ 90 757.9346 null]
+>> endobj
+8160 0 obj <<
+/D [8154 0 R /XYZ 90 702.1637 null]
+>> endobj
+8194 0 obj <<
+/D [8154 0 R /XYZ 90 144.0569 null]
+>> endobj
+8195 0 obj <<
+/D [8154 0 R /XYZ 90 144.0569 null]
+>> endobj
+8198 0 obj <<
+/D [8154 0 R /XYZ 90 105.3618 null]
+>> endobj
+8153 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8215 0 obj <<
+/Length 3090      
+/Filter /FlateDecode
+>>
+stream
+x��\ے��}߯`^n�9��Ee�!��*�qi�d�� Z�L�i�>=0�� 3X1+�
�jK�
t7�\�t�a�GfϔP�0.g������� ��
�~��|u���3���rv��hA$(����sBӗ
�1���$x^����K�����r�/��[����/�����]Ul�߼/n�˟��y���<�I�(�c��@�F��"��D�P-�OY����
+
�
����MQ��'��w����yY-�#f��3l�ы��
s-��Iby���?��
+��#f��}�7c�l{�)��l.�\���i�8
04>

���-GZ�� "a��t�B9���BQ��܍��3
I~�+�gf�z]�w��%�]�9�,���zY���y_�/��պ��v�b]5��EU�Z����y��_nZc�]u��s1|}@}�	V�H:S�"�=��q � bt-HsIG���,��3�g
�2�#�"���<s��t��S‘�RN5p�l�{��m� �F��п�b�"^����L =�6��}��Cg��F�fgW����P��C?2j�0)f:L:
j2������BRsD	9gy&��C}�E�R?���b��N~��{6���a���x�_���0�{J�aۣ���Rk���cʣ��~�r���A&!X������� �k#�ݖ�����*�C$8����P9�"�8���G�
k�cSIp�L�]ƀ���s$
�h�	��C�Kd�0���0	�t(`&�}��˜��d� ΧO<��p
۝�9')"3�ϡ2���>��ɼ�!eq-��Y=�������H^����X��אP`���ش���fVժy��6�m�z7�+��$�� [...]
+CA_y����K��i�I^�M^��D����W��P�^�؁/�mC�8�H�8�
+��e
>Pd��e��1(������x* =)��ˡ2�Q
+
�=�l���ܓ)�.�N&��3�v'�����I�$��C�$�����ejO�#a�Y5�o#�';ؑ�������v*
[;�	!��MI0(�`
��gcP��n�)\���v=ڭ��]��׻.���~. �7����e\��]eS���^ٖ۷@ESu����A�\A�F����$�W�n�I���uȯ�*�`{
��]{�H,S����ʑa�+0)��ǁ?Z��-+��
2��ܤ�BӀ��"����/\�Ҁ����@�~q0���@���m�0��~iQ9�Iٺ!p�(_` �JA��Y�T�HZHYI
*��W��=��vCf�T�
>CylwR�듈��s�
籵'R�pn��2�d
�F"O:���
+�"zn/6��6O
�D
��qf3�y�ʅS��V2�Z;X>�zS�u��Pj��>^j�0��}*�u5�j��T�%�����5!�J;g�L��LEy6����P��۵�KPb�uU����P�u_
�*�@v�
4���:T&
�a�҄��D
��X`�J���"��
�
�/�?�B�����Y�R���Jy��������hV H	�\Vh�(�����Z���_�6���@� &��<�=���}���|����[��H��b�9����~��M��D���T��o<
*!d+��D�q��T�
>�ylwJG�
+�1i�[L�ᆬϨ�.��Y�?3[/):yj;|����Q��պ����:�w8�(�`�&Yv��� Q�_��)��4���Y-
+�FB(:�qO�mo����k���@���|h3Ȯ}���z_Ԑӎ'ժ�&ǵ����CYVʎ�L�M�GӇ1���Q������#�>fo�,��:TV�y��o����>��S��4��
$	Ӡ�H�AEAB��� ���
m�
�H�A�T=6���8=��ԃ	9��L����$'=E1��(~�z��?�`�
�H��� =3��!��A?��b�b����I+��Q´Ӄ���}99w�
��Iz� Eu���a<�����V�`=�i��0
��JB���;w�<;T�?gi�z#
��]�v�uy�Q9Voo�f�3J�.��v:��)��a�=}C����O�Y7X�6Rڳ���=�x
+�1o���!�Y�f	˪O�`B~�
���j���BQ
+Bl��<�
~X`V���n�Y�ʢʫK�$�:�)�-(
	�	���H��%F�BU<�ϸ�[��+��`&p�(�^��͡P�pA"Q��CE�BL$�D��N�\�E�U$�P=YT�$D��=DT�����(�aQ�𔚌9?5Ӝ�v�7��wM�4�}KO��8��S�1Mslwr�1��ɘ��5��&�m0�Ϻ��H=K=��
�ሠ������5
c�Q/S��F�]4v����
�܀�!����l!6J
k�5���w at J�u�O�xAX�/�I����U�4:<��� ��P����Sz�(F��ůU��>��o@B�9�C�^̨֋B�zAO��8��S1�yl�
�$宁�f<��d��>5�L�v'7�<��i������"��6�4 ��Y�}�m$t����u��'�
+�G�A>�P��2������7�P�C~�e����$	�ho�����۲쥼��Ҏ}�6�����cZ����|$���2�,��-*��UΠz��=���з;U=�	i
*���+����������Q��t������u���p*k>]:z��c{�t
����F���SjN���&Ls
۝�&L2޵	�|�-=�6�D�Om�4ͱ��m�$˧6a��&
�gڄ6�k�)��yrγ��s
lX�5�����bؕ��5�g��5J6ٞ*lf
[.���Z2
��� N��JQ2���_X(�G�`q΃��abPhb��/)�Y��j�8�A˙�ǝ�b����AB��\uB�����mѾ�
�ּm��ּ�ס���R����#pWlN��ǚ*�����
+ T|�/��+A�B�M�6P++��
��R��ϳ�շ���
��h~0��S���_׷/�?���Z
�]��ݣu���v�<�%0�뚅qEO8kAQ,�
S[j� �w�����=S	>�����ld0��s%��endstream
+endobj
+8214 0 obj <<
+/Type /Page
+/Contents 8215 0 R
+/Resources 8213 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 7964 0 R
+/Annots [ 8218 0 R 8220 0 R 8221 0 R 8222 0 R 8223 0 R 8224 0 R 8226 0 R 8227 0 R 8228 0 R 8229 0 R 8230 0 R 8231 0 R 8232 0 R 8233 0 R 8234 0 R 8235 0 R 8236 0 R 8237 0 R 8238 0 R 8239 0 R 8240 0 R 8241 0 R 8242 0 R 8243 0 R 8244 0 R 8245 0 R 8246 0 R 8247 0 R 8248 0 R 8249 0 R 8250 0 R 8251 0 R 8252 0 R 8253 0 R 8254 0 R ]
+>> endobj
+8218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 696.0019 294.4813 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_2f13e4ffe7b47ec50721791877b41622) >>
+>> endobj
+8220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 615.2394 180.5399 626.1433]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c59e94611b71ddd67acd033a05bbbc7) >>
+>> endobj
+8221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 615.2394 280.1454 626.1433]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [348.4445 615.2394 420.7129 626.1433]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 576.3851 226.0342 587.289]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_606b0dde3138cd8f0fce7604b7d34986) >>
+>> endobj
+8224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 576.3851 393.4443 587.289]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 456.3888 178.2386 467.2927]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c2f0ae89d7bf247a76c40282f31758e) >>
+>> endobj
+8227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 456.3888 277.8441 467.2927]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [346.1432 456.3888 418.4116 467.2927]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 405.5793 245.5216 416.4833]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c2cd6705bce0af4bd9880b990baf1198) >>
+>> endobj
+8230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 405.5793 325.2287 416.4833]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+8231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 393.6242 186.1788 404.5281]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.4778 393.6242 326.7462 404.5281]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.8763 393.6242 430.4326 404.5281]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+8234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.6253 342.8147 245.5216 353.7186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_025902247d9c8b46d92c514c1646ff69) >>
+>> endobj
+8235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8481 342.8147 325.2287 353.7186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+8236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 330.8595 186.1788 341.7635]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.4559 330.8595 330.7243 341.7635]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.0745 330.8595 437.6308 341.7635]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+8239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 268.0949 243.6051 278.9988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_af0214aee8884dc52be4e061d6b4df94) >>
+>> endobj
+8240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 268.0949 323.607 278.9988]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+8241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 256.1397 186.1788 267.0437]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.4778 256.1397 326.7462 267.0437]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.8763 256.1397 430.4326 267.0437]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+8244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.9202 205.3303 243.6051 216.2342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_2560fe5ce16277c4b4db17e951047028) >>
+>> endobj
+8245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2264 205.3303 323.607 216.2342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+8246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 193.3751 186.1788 204.279]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8247 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.4559 193.3751 330.7243 204.279]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8248 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.0745 193.3751 437.6308 204.279]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+8249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 130.6105 242.189 141.5144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6f27f62cf5d65574cbb44025b1b3e585) >>
+>> endobj
+8250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 130.6105 322.4088 141.5144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+8251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 118.6553 186.1788 129.5592]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.4778 118.6553 326.7462 129.5592]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.8763 118.6553 430.4326 129.5592]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+8254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8216 0 obj <<
+/D [8214 0 R /XYZ 90 757.9346 null]
+>> endobj
+8217 0 obj <<
+/D [8214 0 R /XYZ 90 715.0952 null]
+>> endobj
+8219 0 obj <<
+/D [8214 0 R /XYZ 90 634.2132 null]
+>> endobj
+8225 0 obj <<
+/D [8214 0 R /XYZ 90 514.5964 null]
+>> endobj
+8213 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F52 345 0 R /F67 370 0 R /F37 1999 0 R /F100 2198 0 R /F40 354 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8265 0 obj <<
+/Length 4217      
+/Filter /FlateDecode
+>>
+stream
+xڽ\[��ƍ~�_�'��xTS�"Ǜ='Y�9�Mֳ�٧8�[bwӖH�T�����
�"K�&���м�(�>�Jf+
+��*�+�
Ʌԫ�ᆮ
��n�����!��>޼�N�UNr�����Q�����_֌��n�t����u�
���������S�k��?U�mѾ�{���T<6u����T
�ۿ~������<'Z� �w$��.r�)>&��	e<�,���}�u��(p���<
�ũtO~(���e���#�
��"ӛ��5���f������t����gj�7��<�Í�"��o>��o�ǽ��샯7B�L×
��Z�ހ�Gs�D�L�z2����������!�Ɉ=Ur\p%C�
�I�S��qOA��H�
>�H���"���
��N�Dz.e0��h�7�v�2��j*�B�ء"�n��0)�v
"W�-����O�*
���%c��_���懡~�f�A®�(����������nWu�����z�ǒq	�܌$ٻ�Z��KE
5�8?RE�����
+��������q�������
�H
����y5�TS)�X4�{����p-���]TQ����SY�z���7�j{���5���l�W�8<�_�����@ۦ�N�

W�X�Z��@��'�u��I�H�L��.#I��(MƏ�4�u�,����F��i<b��'ж�*�m�r"!�^��|^��Wh[@*6<�Uv�����ӿNկ�Z�s�gf 2�]��|^��(��s���ǻo�I��B�@kN�=���R�$�Dl�]7�[H�p������H�fЊ�
d�(y��11"={'����M�d$�W �W*O͏i��6�'�2F
m�<��\e0{-]HC���y(����Tzhwz
+x����
+�+��
�O�Dҕ��P74_mг >[���b(�R\9��|��/O/eY{8j�jA���~J07Ds�jQ�L�":g��k��"u��Ek���|c�`+H0�b�">�2#U5�O=�ZƧ=�<>
����h�/�O�
�e�7Pf�
�_��R�b��j7яL
+k"�ȩ\�ێz3$OXg���^l�w���9$
!G����F���HEc� %3
+<��y;���c�8�{�`�ܽ�ԍR���d��MO5�.N�nS,8-5�L��8b�l��X ���5�L_�y=��
�|/Ya���
��ڵ&����,$��P�͐lj�)����Ȉ2&�GA_��fg���?��<�s C�>
�mU쫿C��f3fL���i��]��B̈;Dk�2���TZ\|�����P��ZO��׆
�#B�ʘ"_Q�-H�"�vա�����0{M�,�T�y9!��e93���r�H�m�T�e}���L�x�i�d�D����nz�)��$�[B.J�t���o��\��%1&|��&�x��yE�T
�,�x�X�*ěQ���ɡ� ,���B&�7��-OE�/w'}[v۶:�`:6�Sd�,g	x�D�՘�i$�,23s�,b�(b��m���k4�!�*��x
0x���b5��v�h���CYI�
�"E����	{�:J���V�ny�
.'�č,����,��2%#���K�����j��E~hZ/{�O��ﱣ�� ���lݖǶ�ධ~j	���p�����'�k��"UO�Z�OFFE
]Nͱ	��
�-�
+v�Z~�o�r��]ƉaY�?�&l���GI��1�#ޚ52�"� �J#��/XI�? #�]�N�������:l&�t��vOM{��A at 1�;B�~Y�h������m�/���1������-��K
��	�f]��Q��8�lOV
����m����n�gt�=
��!L̳m�ר^P��R��<���t���
��eW���*"���C;��6p��w��G��b���s��v@��>-(�l{�{#������C���u��nޅ�|��i1�EU��HV]C�`�Cj�C.79f[S��k��)�i`��hN���q�	c*G�
C4@<jV���Q�^9g�O
���F�ɑqE�\�T?R.S3��th2��
+�\�v	�u�&�
4�x
�S�
�N���	��2���=�Y?��Щ�8�d�se�q{Љ�L9 at e��„^b �d��$xL����Q�g��1�!yN������im��v;H�Ɋ^�����-�b�P�:�sq!��k�V�v}%B<��F�a��} Ȳ<Nʿ+���!�d~�ƒ V��y�^X
i�!j
ʓ�0��ڰ' �M�+�cBP�Puo
��qv!�P�|��=��.踽/����
j-�S=W��gZ����~���=)�Ƕ�T�� dFLh�|qpS��+GK�O͡y,�y����=�++,
�<
DE
�)� #��������k	~�
�
�h�3y�%S̓�
���<��2-��}���j��K�^��QAʢs"�����*���KMt�/CXCj��J6�K��
+�.#jM�T!�U��!h���֠n��K�m�i!�W[G��\o���o�8��Xs�-�d9��Or�_/p5�^2S��-�Z:
��P���	i>�k�M�K
S<#�.̴1z��6�����¸�A�������r[y����r{,۱���䑼IE4��&�*�"��)a((���!�'�#��7WgVZ�Y1�I��0�}�2 ͈P<�l���ٲ�F
p~�ހ�q�0 ������릪O�e�
�c0��
x%t/8�����f�5���T� �i��ȳ
���cxC�+�d�V�
�lŅq��qC��\G��,��M�(���OE\�π�j�~�xEʤŹ���� ǿ�9|�@%�pJW��p��ef�>h�R��I�'�F�B��Kun�����]��Z_���6�ᅭ,-��{(
\x� ����
+O�U���6~xl��B�
|�[
�����
��9�%"��/BW,������ ��R��z��t�C^v����i��.�!��l4������Snvo@��bX�&�/36'>��ja0������Up��	V�6�
Ჹ��܆/
(��}�=�3bp�Js��
���u�0�d�r(ۯ�j�0=���Sn8�;��x`2D��s_��;>~��/����{,V�>��ĵ���R-�
 �['����
�"\k���mr"�f�OIfP��)f�
���
�G-�+��)�O`�@�|�J6���
r�`�u��}�m#�����o�%=�q��� {�zҵI6���RS�7K��M��2� b�T����
օ�
�����m
�&n�&�
݌�<#m�f�U����M&/Nk�'�Q>�6�]��=w�
+�l/7u�7أ>o��6*��h!��-�2��Ώ
� ��T,������U���)�B�/�����?�Y
�6<�^2/]_0�hŕ�{���kw����
���1�7n�
.�{����i�
#�^a����6�̀>���\�Q�	P;b������@Q��

�p��X�-.�սWС8
���m�����/`{8)lε��MV��d�M�ژ���h-d��� ۏ���]�<'��lԷ�����
��P
��5�0>!���
~�}j�20<��b���t��[t�:
��n>�m�c�v��7M�e욃�o�:�9_�W���>c9d��N;B&;ﳲ�S!�3��6�v��h����6��@�s�ao�æ���u�l|Q<�{w����Ǻi�]r�;4_(��ڝCE�d�d6
B�
�S#�Vn��
?H,�	����K�
O�
�R-P-��C@�ţ��ۛ�/�Q
�z��L*���>M9��I~�;�<��)�?o�� _�4?7�.&��-6u�s at 9�[R�c�� 
�.6��3M��l�i5;�i57�qhZE�.m�n�bƊ|�M_\&ZS��~/��.O�dbl��u!\�]�A�I5�Sm�
l��� ��3���cn��w�M;�p��o��9� � ɹ>;H
��L%�yFpk���;��M�_
oz~�3Cw�w(X?(�1ɇaq���x�Y�J�+F���QF��iW95$G(g�g�sSޮr�_$ݏ�a;�~�����\�j9.��I��}Kٟ8t�������s�����<��[��^�.��D�~��!�R Y܄�ZP [...]
+��7��!�C��T5����i4)��<�f1endstream
+endobj
+8264 0 obj <<
+/Type /Page
+/Contents 8265 0 R
+/Resources 8263 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8286 0 R
+/Annots [ 8267 0 R 8268 0 R 8269 0 R 8270 0 R 8271 0 R 8272 0 R 8273 0 R 8274 0 R 8275 0 R 8276 0 R 8277 0 R 8278 0 R 8281 0 R 8282 0 R 8283 0 R 8284 0 R 8285 0 R ]
+>> endobj
+8267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.1381 707.9571 242.189 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_715054228bad30a232707ed0357cdd98) >>
+>> endobj
+8268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.0282 707.9571 322.4088 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >>
+>> endobj
+8269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 696.0019 186.1788 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.4559 696.0019 330.7243 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.0745 696.0019 437.6308 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >>
+>> endobj
+8272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.0837 633.2373 163.4496 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_62d44847fe22abb82cbac84a776a9c72) >>
+>> endobj
+8273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.4337 633.2373 357.7845 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 633.2373 513.9963 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 621.2821 221.5955 632.186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 582.4278 179.5535 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 582.4278 243.314 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_09eda1d1953d8f83e4352c6fe78cbded) >>
+>> endobj
+8278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.6512 582.4278 336.2944 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 247.7249 148.56 258.6288]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+8282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.7205 247.7249 511.2267 258.6288]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.6363 179.9789 235.1426 190.8828]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.7255 138.4442 193.2317 149.3481]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8266 0 obj <<
+/D [8264 0 R /XYZ 90 757.9346 null]
+>> endobj
+8279 0 obj <<
+/D [8264 0 R /XYZ 90 568.8538 null]
+>> endobj
+8280 0 obj <<
+/D [8264 0 R /XYZ 90 520.29 null]
+>> endobj
+8263 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F100 2198 0 R /F40 354 0 R /F67 370 0 R /F10 488 0 R /F8 568 0 R /F25 348 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8292 0 obj <<
+/Length 2527      
+/Filter /FlateDecode
+>>
+stream
+x��Zms�6��_�O�|	a�oi��k�ޤ�ֹ��\'�xh��y�I
I�V~}$$;i��K'3	.�}yv0�a�Gf�$�H�T�7xv��8 �sߓ!�7gG�
>�H
*fg�
A���Ζo� ��1��:$x��7���C���js�/�������ͳg'�6���lu~z����wg?
}OȀ=�	!)�c�?�$�#�t�(�"L4"�KG��A߮��9L(��M�y~�^emnG^�y}H�</0�4�sF�azp|�5�˙ Fo�=x�ϖ��0bZ��
�`D��������eupz�/��~�&��c>',EJ�̝�
a�So at N��
�2��<���[J�xO�,��l�p�������i,D����a��m�D��=Y��%�C�*��f��-�i�	� '�8���"PG
���Zo�����2���sKֽ�ə@Z2խ
+S$�����L@c�S��Ϡ(��1
%Ddԧ�1��L4n�0�)�V�|,�"�	G�b����E�
��!�u�;�R�zM.3��cVemQ^��uU��}l7�'��:3�������	��g
7���u��e
<�Ҏ]V��TŒI���*��q�ɟg+�q���
��@[J�k0��G�bņ��腊y{�ۇ
+�j�x��KclF�Bc�������I��
�r4�����'�	Ț��`�*��Ό;�#��I6�c\���)��p���?y�Q�H
�Ҹ���T�
X7 ��>ea*��2��x��t8T;ѐD�HB���]�Zٽ_8i��|����UY��ҽ8W��
9�.G��]T&B?����"k��y(e�8M�����6m��
2q��<\V�UuH9�f �
���d�7v�hݯ{��{c$���v��
c dW\����Qa�����8�I� ��U�V2Z	�^WMS\��[��A�᦭����~ ���*1͹�ϱR
��K��F�����.�
���4�^k��\�����)���7���'02F�@J�~��2�ݎ�9
-��6I�����9��i��m�H7���w���m B1Q �),el6�鉓!�����|��ˮ�"�����~u�:LT��fC���U�
+P�i�C�#�CK
G���RO�*W����oqH5m$�f�6
T,�;<��j�N�)E�Q�}O5`T@g|˭���|lr_R λ��ָ-V˾Xq���iOYC���ʥ��VA]���p� ";�#%��{�������5C��Z:��S��6=Ö̕jW�ٜE�2�v'b�����
lw��4��8�����00Ӏ<
+�?%r�5L��NL㻋&�ߋ��uk<��R�����
�ؤ�n{Ԥ�笴���>~�J�Ҩi~��N�
�E�'�|/!Ġ��H0�N�����B��j� ���
<�~

+{ ��|h6P�/�baǡ���:g���E�L��bHJ�G�"3�������q�����0߸y�LW k�Ij�l���¤O�j�"����X��[6<��<D
���o,U�
=
1	�
�Q����A��+��w#Aj`LK�H$��AO��O� ������%CcRh{Sۓ����"��ƒ����]4�)�

�A��쪱.���.�����Vx�ʚ�z���S~��7��,�w,�)xTT	s�x�H����QwDk��v�V�
�/��wy8�]��
{Jℤ)b�&C��8�mj:�OLӌ�9҅B,U����J�m����Ј���>�ʨ�oX���i�?U^����;I��a��y��C�ʗ(L;'Z`�lt�5�
#
6O�6��˪��9�s���
+1�;����yB�v
Gxt]!ߞ�B���aWy���"�ǫ|�H��B�/�?u}_��0P��BПh�dEK)��m�/?������q�g*��X�SNb['@Dz�7E�*���
��~�*E�.V	q�Dj`���D��rP�׍˵}TB���0�����,X��4�}�۬�E���G�:;P�����ݐjwgG/��j��-�kw�`O�0�$t����d�1���Uᩦ�M�b�3LB	|�	�\�uhɁhq
[��b���y�XUͶ���W;5N46'l��fzH�GӞl����AA�ݞj�n�_��Y�p�S���qG�C��6O���������@�b	:u�<!�

���I��TH�eҮ2�x��=�H��]S�(ex�
 �2��}���/b	�
�����Xb���d
ʂ2�
������~G8c�8t�n��ψ%|ll�|�����?�v���O�~<��˳�"�=�����<���4�͝��a>��E	��7�k��d1��9���
N=۶�ݱ��p(Z�<�3�-s��(�GP(p΢9��k\���/��@@(�j
\wm�B[|�
�@��>����
�I_��������j{����Q��W�	
����^OI�
�� [...]
+	0H�\�9���/�9��ڳ�A�
�wg��(endstream
+endobj
+8291 0 obj <<
+/Type /Page
+/Contents 8292 0 R
+/Resources 8290 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8286 0 R
+/Annots [ 8294 0 R 8298 0 R ]
+>> endobj
+8294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4174 694.557 214.9236 705.461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8293 0 obj <<
+/D [8291 0 R /XYZ 90 757.9346 null]
+>> endobj
+8295 0 obj <<
+/D [8291 0 R /XYZ 90 331.9087 null]
+>> endobj
+7906 0 obj <<
+/D [8291 0 R /XYZ 90 308.6674 null]
+>> endobj
+8296 0 obj <<
+/D [8291 0 R /XYZ 90 308.6674 null]
+>> endobj
+7907 0 obj <<
+/D [8291 0 R /XYZ 90 178.5845 null]
+>> endobj
+8297 0 obj <<
+/D [8291 0 R /XYZ 90 164.068 null]
+>> endobj
+7908 0 obj <<
+/D [8291 0 R /XYZ 240.2453 89.4414 null]
+>> endobj
+8290 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F8 568 0 R /F25 348 0 R /F7 574 0 R /F67 370 0 R /F33 485 0 R /F74 482 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8301 0 obj <<
+/Length 2150      
+/Filter /FlateDecode
+>>
+stream
+x��Z[�۶~���Sk5�w����AZ���H��bsm���Jr7��;)�dѲ�Iq��Hy4�f8Wr���j<UB!͸���<���o&�����]��������j�%���]�A$(������Ģ��`�g����b߾�S<�v[�.����E\<\_�\U�&K����6����򻫯	鰧T#)8�������`D��b`�aBy���e�|��|An���>�ŕqo~1w���hf��b��#�2��X���L��?'������#�#1��	FDk:�O8e�d7�����q?���Gv�Q���q�E�oRՈ7�[�aeFFt���Q���!7i�����wB��q�1�����ay
S+,΁���~
�S��װ<e�
��t� !��t�B����0}B"t��%�L��'
i*�L�-
�ZD��~�������.��#�����C��s�ư�y|�(��S�H4:|��|�q�/��q����5{�B��
�ѼK��["��)
�H#��� ��DJ6���ty��nX=����/|�Ë�}��-�.bHF�6�X�4%�ϼN�]��/�
	q���w�*�޸�@���6
w
+Q��f��!٭}����Z�)��S1���>��1��؟��s���*ϋ�]��,u���p͐RD����Q �TC��>B@놠�a��ܚ�����#����ޤ�{�x	�M�f�ʇ,��P8�X�O�XBT��F���lG#q��D���TZ!� �<�f����2!�>���e7����
q�V�7%�{
�K�ۀ�*C���n|tWc`6�l��j�S^޸�]�yy�Ʋˎ��P�k:
�!�*�x�đ�=lM";�1H�z����d�nM�T�1�<^��:�+�����<J�E٭�"�0��

T�zCuUC��R
k�H#��6_H�u(�������S��!  -�I?�a�
+�r�>꧷�M���q�[��}UC���x�gPs�ڠ
[d�wm�z��Z���&��q�>�
�iV
�*�+�a)6�䗎@
�y\�8Y_
�#7��	�p=�ܖ�
]���MM�����l�3��6u$�6;l��MiD�,�W���}����M�W<�"yk_*�w�]��6>�tB
I��D�;a�j�	!pS��Ż��mQ1‡�G
p�"�-��QV���$�s�f�Kַq�K�cPP0K�͍j����T�H2��,�Efm��G���ó�
i5����"jk�n> �d��Y��� J�S���UT
�.���n�%>[��bkS
����b�./Y�0mB�a��G�-��j�s&�Rmţ^�U�L�v���hS�
+�L@`��2
x�T�/S�W<�}�����;@�-�	�ۂeT��j��Q�c�N
��}v�Y@��@Se���kv�&��(�m,!�3����( v��1R~������IMWYqA?ʡ1k��6�4�kH�h@?zC�it�G��Gb��� �
K\�GUR{P0(��ng�-�Y�^FM����#�ܛb
�a�6�cLӺ��ۇ�P����J�`R��A�I=|��p:	��z������h
+�SL�3I��t&��B������G�� E8��dO+�G5�X���K�
�'��
?�
hڶڥ�}�
��i[J��3��!
o0�O��鉇<=�~�Qd�͞t��B�S��NE�)'�m��T���	��$�����D��h?|U�T{g�q�J`����Q��<o⑻�����kB]7�����}� 7
+x�N
-3%jd�i��g'``��dj�@R�ơ��j��n�A>�����۬4͢�k�n�OXG-;p+S����֝
d���Y%6G7$�]����rݝ>6��e�FJ��ks6ѳo�-�T���1�Q��y��4(�-�B��c�7��
+�

+��
���C����?�y�Cש�`V��F���:TB��v/�٣�� �
��p�
!?��-�x�����!)�7��
�^#��Z�M
~�d7�)�M~-M��\�}���qz���M���]��^��0T��Ժq�1�X?b�����Ӓ���i3��Q���E�
W�����V�mU��WW���hU�C��J��<�]
�š���xl�-� KO�
j9�p��r��k�
+Ӝ��Kw�<�#[}��
k�endstream
+endobj
+8300 0 obj <<
+/Type /Page
+/Contents 8301 0 R
+/Resources 8299 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8286 0 R
+/Annots [ 8305 0 R 8309 0 R ]
+>> endobj
+8305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.9967 539.3012 408.3112 568.367]
+/Subtype /Link
+/A << /S /GoTo /D (main_Octagonal_Shapes) >>
+>> endobj
+8309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8302 0 obj <<
+/D [8300 0 R /XYZ 90 757.9346 null]
+>> endobj
+8303 0 obj <<
+/D [8300 0 R /XYZ 90 733.028 null]
+>> endobj
+7909 0 obj <<
+/D [8300 0 R /XYZ 240.2453 663.9063 null]
+>> endobj
+8304 0 obj <<
+/D [8300 0 R /XYZ 90 647.4305 null]
+>> endobj
+7910 0 obj <<
+/D [8300 0 R /XYZ 90 475.5686 null]
+>> endobj
+8306 0 obj <<
+/D [8300 0 R /XYZ 90 461.2497 null]
+>> endobj
+7911 0 obj <<
+/D [8300 0 R /XYZ 90 345.5507 null]
+>> endobj
+8307 0 obj <<
+/D [8300 0 R /XYZ 90 331.2318 null]
+>> endobj
+7912 0 obj <<
+/D [8300 0 R /XYZ 90 202.2973 null]
+>> endobj
+8308 0 obj <<
+/D [8300 0 R /XYZ 90 187.9784 null]
+>> endobj
+7913 0 obj <<
+/D [8300 0 R /XYZ 107.5342 89.4414 null]
+>> endobj
+8299 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8312 0 obj <<
+/Length 2162      
+/Filter /FlateDecode
+>>
+stream
+x���o�����W評�j��/#-P_.AҤw����`�m�(U�b��Yr��%��|�y(� ~��
gvf~\�L0�����%�,���
+O���W�ޞ���/p����F�FZP1Y<V3�8%t�X�����	�x�~F�ty�-���(�6�����!{8.��nnޭ���>_n��6�C:�����B��)�HI�
3�W�H`��2�X�Ed���
+���o�ˢ��)�0���tw�.˴����1=Έ���
+.1���f&�z�h<g
˙ �o����O����0bZ��3�`D����UB�;�^�]�����Q
�ŇvI�(CXp�Q�T����M%����K$�<[~:��r^!��h$C�d|$�T��
1�I��3��./M��j�nc�#�`r�V�6�V�܌��
Y2�C 4��L �#B�e��R�fw೾Ys���1ǫ}^�����%f.$.UL�5�)� "&�	���M��ZB�����F�ao���fJ�JW�4�
|��嘾d�&�\ %�ra�^�+�B�]W�l��@R8���\
+����������?���w��#�)��N3D�D��GP�8�~��m���ѡL�/�m��ʏ�8x�vܜH���#8 ��	nO�vm
�2���տ�Si
�@��A�g����Z��Y|L�@g�&=feQ_-���\���:ۥy����N��U��9��M�L�ե�KN����h��
+r8����Ý|�Y��Y�ڞ�iS���#L ��f�
��Nh�K�k��cs�J�%���@H�⦫�`�����=C�%a�a�(�}�Y;i�@)�\�q4R}����b	�W�Pu
�j���u�?5�>8��"���V�F�~mo����Tn٠a��Q�������Ɯ���e$�Ρ&)��hwR}�?��i�H�}��\�WX�t������dO�����X�q�r���L����S�$7N� �4��2h
+�y��3§�S
>
�&��#NƳɗ�&XsHΫ�~��J%T��L�)	~ϊx�1cFQ�on�i�Tn���q�Fc

j��T߈p
(���$4b�9�g�O���2N�٣�eu��[��5�*�;P�#}(1������JP�0���հJS�p��V7��/��.���R�����2
+�ٞN�� �밧[�Q���[ ̠8N����_�)!2�@_	{�
+ �$g��5��%_c�Wgu��'D 9��sH�cᓪ9����͑��!�HJ����G�P �%o�����`8�~�\5�9�~1"���JJS���*V��o(�S ���, �;��q	
+yQ h��!��k�Tԓ��G��٥��H}�ӊ��u
+R7;P�WVt�Z��a���OZ�٠`_�@���O�<ӽ|���e�+���b��#
�gI��5b~�� q@�ǁ�P_k!�0e��+�
�h��u�X��
�
���^��A��T#v!�ko@��=z���9�#�3�M��p�0�֊\
z1�c��Z1|'�:��D
z=#��
���
���pzx�ِ����
,G�l����
�a��p��pKz8 =�-A��l�#�ԃj$�}�A�S}��J�QO���
��
3��{��q?�9�c�.6�u���Kl��r��	�ʯ�DeT�hjNo�
�^�����6�� ��<ft8���)M�
btl��MS�6M1�������);�͏��.�-�
�0Kg���X�2s�ZZf!-3Kˌ���R3�V
+U�j�
T�j��s;�>6{V�
� ��x������!�DDI����FT�rg5f�&�,�cB#�fe��,)���7R}�
��Hp(��vS��o����ʁ�R{.���\��.��q�
V��DZ:��;�j�x$fgrƓ��|���Ә��w��{
V�z���q���r]a���!�Mu�C�:�� V�J�8�t�Вq�D�O�
T�� �c�9��	R�uvP��|(��9�~�ͷ��_�
E�
P�$��a1Nb�~#���{�C����h}j��>��H��q>�9��2?�|3����
+���
���z��+L�
r��]�P%���r����������
�{#ꤔ�#��5�)�������3Z�g�#����a{ݵ+��ʀJG�7o�z��O �!T`�#�b�
�>[s��[��ud�����?&��endstream
+endobj
+8311 0 obj <<
+/Type /Page
+/Contents 8312 0 R
+/Resources 8310 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8286 0 R
+/Annots [ 8317 0 R ]
+>> endobj
+8317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8313 0 obj <<
+/D [8311 0 R /XYZ 90 757.9346 null]
+>> endobj
+8314 0 obj <<
+/D [8311 0 R /XYZ 90 733.028 null]
+>> endobj
+7914 0 obj <<
+/D [8311 0 R /XYZ 90 536.643 null]
+>> endobj
+8315 0 obj <<
+/D [8311 0 R /XYZ 90 522.0727 null]
+>> endobj
+7915 0 obj <<
+/D [8311 0 R /XYZ 90 318.1256 null]
+>> endobj
+8316 0 obj <<
+/D [8311 0 R /XYZ 90 303.5553 null]
+>> endobj
+8310 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8320 0 obj <<
+/Length 1597      
+/Filter /FlateDecode
+>>
+stream
+x��Y��D���)���f�>\��* EH�SH����Ȓ��q��i�����9j_t�{�{z�?�V���G
�
%2�K�_�����?�Huۅ�n������AFR��n
+� A	uf��cB��`�ǯ&��t��_M(
'�~,Ro�kx�z�~:��ϼe{������w���^�rO�AR*
+��޿+M:�(3���Y�D�P���g]<���v�R�����`���,(��n�tB�8�}��
cFx�t�|�T�*�`��u�g��
vP�G1������1�Y�8e�I4z3���S�(~`�A�%D�R��!VM��`}
������,L����Ŀ]q�� =ѥ
1nH�"����S4��020�
+)��)��� ��P^B��N�0�c<8�AT��^'IT�{���H����3�-�������d*��L�~��U����+۬<=<�
+A��KJ^���)-��Z(m�0�
A��. OR�Xf[��
2�8צ��Q�JC�n��L� 
J����\���6��Z<3�u
H����
�-
ޔ�z�<H�h_
���Ǵ���P-I�T1�D��Ѱޫ(V��\M�X2H�F�O��F����zR��F�U�j#�m�W(�/�x^f%���M.=����S�%��{A4��(���4��k
�6[L�a<�x�ދ���K��,��2�\�+�X���N#fH28�3[�Ʉ��.
h%N��<r+��w��
�"���u_{i�E%���a�'�
0�:
+�E\x�@��һ��1D����g����E��C!�)�Z|��@�=�A�`�C�l��$Ғ�#I`	O�� ��V��$ �%�I���ԋŽ���~H��I�`�H��I�HbO�$F��HQ-��Pk�:@ʝ=���B��.�Jc6�����-��.��3�]�-��_Ig�b����K)	g#��L)�
+-^A���zl-)��$���H
L�ն:�(��
+W/w.A�m�D���#�1��+r at T/;�:��BT�c:��pv��_�d�D�r�AO��;�@gh,�
O�	�$���#�9
�@����,�?K��� *_A�� ��DbD�15!ʦ8I3�0��iߍ��
����e��]����z����\�[9!l)�J���W�7vR�}���:������h����:�vA[�?�N(�/�~~G���J�����
��
۔|�'@q�2:M j�Hrz1,C �8���V����b
��8���#���'�I�5j�?�v�W`X�V
�/���������B���g����2x�2�˧ �P��'�o}j@�km
rs\����� ��
C�3Lh[��Q`E/���
�B/;��aa� .􂱃����ŕ����
}
}� 
�Y?%��LI!�B��0���E��D�t�5B
D9
U�������R���m�~;b\��K/����F��]���!��MP���_|�� 8��
+V)(w�J�ݿ���C����/��Z)��扯�l3����v�ߢ�8ܤ(̮6���8.�12�=0{ncԋ�S~
X*�;��ԛ�uR�T��u!ɽ>*�(�C�)��>endstream
+endobj
+8319 0 obj <<
+/Type /Page
+/Contents 8320 0 R
+/Resources 8318 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8286 0 R
+/Annots [ 8328 0 R ]
+>> endobj
+8328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8321 0 obj <<
+/D [8319 0 R /XYZ 90 757.9346 null]
+>> endobj
+8322 0 obj <<
+/D [8319 0 R /XYZ 90 733.028 null]
+>> endobj
+7965 0 obj <<
+/D [8319 0 R /XYZ 90 716.2211 null]
+>> endobj
+8323 0 obj <<
+/D [8319 0 R /XYZ 90 716.2211 null]
+>> endobj
+7966 0 obj <<
+/D [8319 0 R /XYZ 90 611.4129 null]
+>> endobj
+8324 0 obj <<
+/D [8319 0 R /XYZ 90 596.8426 null]
+>> endobj
+7967 0 obj <<
+/D [8319 0 R /XYZ 90 494.0718 null]
+>> endobj
+8325 0 obj <<
+/D [8319 0 R /XYZ 90 479.5015 null]
+>> endobj
+7968 0 obj <<
+/D [8319 0 R /XYZ 90 376.7307 null]
+>> endobj
+8326 0 obj <<
+/D [8319 0 R /XYZ 90 362.1604 null]
+>> endobj
+7969 0 obj <<
+/D [8319 0 R /XYZ 90 259.3895 null]
+>> endobj
+8327 0 obj <<
+/D [8319 0 R /XYZ 90 244.8192 null]
+>> endobj
+7970 0 obj <<
+/D [8319 0 R /XYZ 90 142.0484 null]
+>> endobj
+8318 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8331 0 obj <<
+/Length 2073      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�����_�O�D{��r-��� IQǾ��k<i��D"��|���%�W\��&@`�GJÙ�gf�ኌ1�#c��J(d���f�Ǐ��#�|=��g]��ߍn��bl��T��
*
� A	
�-�MALOgc<y=%x��d�zJ�$_?��H�?��ER<���sQ&�y���oW��N��}w�
!
��$������Z$�`D���]D�A�	���Y_���n:��6C'v�]'��?ycl1%zb�|�
F�S:zu�"� +�$�_F���� �n�3Z�p�1��7#N��Y�ގ~l��_T��#�$@�!,;1$� �~y}�4ˌ
`����#[>mm�l �e4�#�9�CJ3�H���k��
n�yV���5sv�3"a�
 0B���ٴ�Sz���k��Ӎ��m�U�燴\�	�,�"�ve}
H�")����kT�5A�؛~����h�� H���S�w52	
+��ʻ4[��}_

+��Q��f�$�z�-�E��r�l��Yl��*_/�챾����ڬ6A�CBQ�:�Y��j�^�\����d�}v'��Ľ��zE�X��2J�����Gr��&���f]����K�7��Wv[�{{j�`��$j��D+��"L:
�
	���ؕ���4�r<�����<)
���=��D!%i��΄��P�\�ܭ�|J���N"��)b�
���$���JHP+�@Riĥ�U))�D]���b=K�E��¦�_[�� N��ƌg�N"TH	�R!��9� Nx��]�c����|ݨ�J!�&D
U��|l	3N$bBxn��%_�%���E���j��]ˑi1�w�!���އ���(�m�]�������,���
q�V�bo��'�%+O���g�p��[�
Kz��I1@�Ey/�]
�m,�1����
�F5`Ȑ6���`	r�|Е:�B��!/惘�>�y�V�e|0�ȑz��� p�
��
���dX�7-[R��m��i�n�<FD:L���B�S�
���)/��`�`q^������|�-w�j$�7��>wK����ѱ�(dI1�q[��cv�F
+�[������
+5���O1&(�Q���I$G<,4ۼ��'��"�4�]Ȅ
��!�2
�Tu�?�p��1l�b�R�)�C\�h��K(&f|�bz^�)�{�
"r���3q�	�y�\�{.�#�%KIu���%cЬ�(���щ��щ��t���ɽ]W|r��HB���J4FX����q:G%�s	�
�T�rU�
���7�P#��
�HW�<����b�H�� ���H+�2
D��#=g�<8�'�Dx��
�� �8�@-��O���t
�8uW!���l�H�W�K6��t���Rˀ7��
oh?�P
ҕ\4���~5�	�'_��Ғ.R�
�Z��,����~;�"(d2�ײ��[`B��B���TP`V

WU��7�
w��'�W�`R��bz�qS�,�bD�_�5����_�U�����~���ucW۬�۸
�*��ѵ�)F�=f;_o#6Z�w75�Wf¡�B N���\W'{�M�bg��}X��U}x�4��HIX2�Ξ���&(�����#�d��p��u�ݗ [...]
�
����
�K�>
,=�{�C��
+v}m]ʁC�n��}�Y����#}��]��l$M
�)ĵ��/���1���(
WGl(\^,��0�P�~ư��>�W5J��p�
�����p��@��������
���.<E
+([�T�p-,`h
�h-m�o��xa��5��3xu��b'�
��fI�{�M{��i�0&S�eh����C�����w���_s?���J$�Y<v���B��_YU�s�f�.H6�nMU�+*�D�e�]�t-}s�{z�*�j���l��T�I��?�l����`j�/��\� %U��C���䭵��P
UV@�P���y쯾?.�}`�y�g�q�=�n᫲����
�ء}�n
��7�����/��}(d�@�f�Pϗ ~�K*�_
����E��
>�T�*��Qu��w����!endstream
+endobj
+8330 0 obj <<
+/Type /Page
+/Contents 8331 0 R
+/Resources 8329 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8286 0 R
+/Annots [ 8338 0 R ]
+>> endobj
+8338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8332 0 obj <<
+/D [8330 0 R /XYZ 90 757.9346 null]
+>> endobj
+8333 0 obj <<
+/D [8330 0 R /XYZ 90 733.028 null]
+>> endobj
+8016 0 obj <<
+/D [8330 0 R /XYZ 90 635.7621 null]
+>> endobj
+8334 0 obj <<
+/D [8330 0 R /XYZ 90 621.1918 null]
+>> endobj
+8017 0 obj <<
+/D [8330 0 R /XYZ 90 518.4209 null]
+>> endobj
+8335 0 obj <<
+/D [8330 0 R /XYZ 90 503.8506 null]
+>> endobj
+8018 0 obj <<
+/D [8330 0 R /XYZ 90 401.0798 null]
+>> endobj
+8336 0 obj <<
+/D [8330 0 R /XYZ 90 386.5095 null]
+>> endobj
+8019 0 obj <<
+/D [8330 0 R /XYZ 90 283.7387 null]
+>> endobj
+8337 0 obj <<
+/D [8330 0 R /XYZ 90 269.1684 null]
+>> endobj
+8329 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8341 0 obj <<
+/Length 2495      
+/Filter /FlateDecode
+>>
+stream
+x��ZK����ϯ�)� ��ߏI�C���A��	r�,
��a"�
+E���׻�dSl�Ijw�S
^�*V����7M�#
�J(d����/����7��9�ߣ����on��ba��T.I���.�7 �W�/߮^��>~x��x��^��M?��>q�zw��u?�Y�{x�
�Շ�n�#���R��Tܱ��X�x
�(3���(1�0��?ͪ�v���
+
�
]&��..�����6)VD/�l
��abɈ�Jo�ܷ�k+�$6n��y�/6�n0bF��
�`D����
����n������^���6��E$RT����`)�D�Up)�A3�PT""������:9�i�
���H0E�Q��u�N��C/���B!�u�j�8����4[q�����C\<��IV�2I	9uv�I
���~�!���s����WT,_�:'�m�S���1�M�SɧCQ
��%�42q��E���i%]��
V(d�΂Z�|N����&�7)D����:��2}�%Ⱦ��(�&X��LhE�w��
�	Y*4���
+"�\-�H��5X��K�̋�fHL
��vPu�������m�M�t[���*~�WD,?��%�lE(�h�n��1	Xg�J��Iy*��(;g��_
+h �}��tx�Bg����[�Oi�����y�'���p(#��uV��O�����
1�T?�vɶ��NY���0P�7G���Q�\��
b��f֔�K�?�55�!�q�v�)_I�J1��'
+����%
�|ר��LHHɦf�g>�	��„p�HG?�
+�[���j����E�
+]�5
����1͒�xxc���ȣ�,�'��]�����A�$|P���hDe�6�YE���y��.Cש
�$���
֎g�Bc"�Z6a
�
�o�N�1���M��u����1ݱu�}�%E\BӬJ-�
���)��۷a�I��^�a�`0i�v��}�� ->:CD�m��M+)�}��)
C�9@��X�$<�
1N�s�0�zYu�g���*

2eX�*��Ʊ�YOLۉָ6��0�1�6΃
n�Af�tY�,8ʥ��
+!`�
��d`lV�_���s�3��P���h
�QQ>7P^Eb����hAX�;5?V+\]��
�4k&��sR$�ѭ �I�?�I
������v�Yu*�I�ť�
��_`1
ԻR�@]@��@�,0�ʤ� �!&����0Xoźa����20H��J
�z+B �{+��K�]5���Ħ;8��"�Oy��c#�f��e�㿓u��J�ؾ%ĵK�#�J�p��asRQWlj���7=À�$5zư��-������`+�R������P���E�#6-'�M�~����9m�I

��c��6Z�$��iv�x��F\3���D�Z�
^�Ls�(�yfL;��i��
PIK��8>8��t�
5<h��SaM� ۽�'�����ȹ�wĦ���Z8�%P�Z�Q'54ꧪ�mJ��?��i�q�5.��˰
�z�$�c���%����f
��Ш��-1v1��n�å�{��z�O���}>6�YEl�X}|�k��`܃��<6��6���G�n
p�N֜�]�q,�H�.$�H��T����='�e��dDΤ���0i�9�Kڍsv�s
'jw{�+(�f{k&�@J��j��\��v�c���
{5��a���
_G��J�	;��a�m�����t
GBQ1C�ͳ~��q��`�҄4�
,��~z?�iĥ�_J���3���G���B���)�4k(?�p��cԌQ~Vr����K(�q ��z�ܘ���Uw�mÔd��J����۩��B�c��at�+�*�AʏA�K�fNYL_N��6V�Y^�ӫ*tm�u�-�����Y#�
��R�ώԮ
���
+=.�Z��ʨyٮ���,���q������c�
l	%��
+'G*Nκ���c��N.�lɌ�rn�4K�AE�T�d
w���0�����3�1t`<	�Vl��
���
c��/'ƚ��Ę�D]+O�,1F�a�2���]���rb������\<g�I

�֋#
������X�M�
�DD�9��+6.'�
�~��lư�
��j&}ß��}~� �#J`�L�+6�V�7�}j����1��{��ȥo���X/�S�X��r$D "�jf,t��ǂŞB��9���
�{1�N��8�Ɉ�9��3a��s�7�$x�I�p�k�5�e�k���`'t������\;�t��R,G�51vѹ&�&6��M
S2ܩ}������l�&ܼ�dS`��5'�zD�A��`���=�*�������]����
H@��t��7G�Zhh���Q�m�[�7�8&��WB,����8;Ż��25
W�!&��tRew��n?��]���C5$��1�F���?
w���Ƕ/D�7�8<�@����<��޾�������P���=
v�}�8�M�Z�����I�����a�}^��
�
�����+� m��endstream
+endobj
+8340 0 obj <<
+/Type /Page
+/Contents 8341 0 R
+/Resources 8339 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8346 0 R
+/Annots [ 8345 0 R ]
+>> endobj
+8345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8342 0 obj <<
+/D [8340 0 R /XYZ 90 757.9346 null]
+>> endobj
+8020 0 obj <<
+/D [8340 0 R /XYZ 211.8424 666.6665 null]
+>> endobj
+8343 0 obj <<
+/D [8340 0 R /XYZ 90 651.9418 null]
+>> endobj
+8021 0 obj <<
+/D [8340 0 R /XYZ 192.8535 376.418 null]
+>> endobj
+8344 0 obj <<
+/D [8340 0 R /XYZ 90 360.3135 null]
+>> endobj
+8022 0 obj <<
+/D [8340 0 R /XYZ 211.8424 114.0649 null]
+>> endobj
+8339 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8349 0 obj <<
+/Length 2527      
+/Filter /FlateDecode
+>>
+stream
+x��Zݏ��
߿�O��g��ch� i�^s[��rXhmy�֖
I����/G��5�H޻lЇ��ErH�#%���#
�J(d����
+/
��W��^��U���wW7�H�0�H*wۆ�$HPBw�KB��+�1^��&x������5��b��K7er�C�P&������u�X�����.9��﾿���
{J
�RQP�r��%	4 Qf����01�0�
�/�x�O��zEn�.��q��i{��t���D/�|
��abɈ�L���u�s�Lk���>|ċ
��+���b�'c��p�)�'���W���7�b����A�!,;;10��R��76�6�)�g����Z;������!m�+�FD�&3� �BG�P{��U�I !%���@|l	+N$bB,V`Jci��������!˳C�5
/�����ᔚ�Y�&���_�mtUUV�-��Z�Fj2���"��E������4f��H�?aL�Y����	��{6˷�yD��p)_I�&&���B�Ih�b��i��!ƻ�MM��O��
f���'C���6��2�����1AR L����̑�������ZǷ�}�L"εq��|a�%�U�VG��^A�J
+��>�cZ�ʼ�qf�(�uyJ#L�DZ+/=ۂ�`�$ߴE�n��V�4�/UHD43�Z1�����d�˪�jT�̼��HW��Y��
�+��m��=��P��Mꖻ-�����k*�O�TC�FVO��
K�
��.,<Epo�2B��F��]��هl�S�#a
Z'��T��
d�݌6��Ov)������߱�즵�O��L#� 
+���t��
��+�d�K]U�
��L�v8
Ou�A�2���*!qk�I�z�U�j\���S�S�VCWT�h�iY��L�b�D)�Q�5	�7ĊHr��7c 
�ytTc��G�(��r�|���
��D,A!_���*��G�뙋����t]w��=bl�"���'�ô�0<� )E�vvW�l�]�,����l%��{����8Ҝ
w��O�~�*�/�����j��`�>ٌ�:�����0@�y��j,xd.��n �3�&�
��5��
�/�G6g0O6 at +�h]�f�hO5
frAC����焞m�ák�
v�\H�U1��~��%�O��%�������:4%@%d�y��j,4
V
۠s��s�Z�/�O�IݶR@~]��tSYD` �d�}{��c�t��cn�qs��t��^�qo����:����T�gԦ!�/�{�8���[�Y]9��1�[�C\>��&р�Ir
􈦱���������/��h�=�"���n��D�9*�CUono�q�C�� [...]
	
�_�? 
q��n!u�*#��wx�eӒz��MbDe�YC�6�������yZ՛'��t��$��C��g� "�`�_a�vq��0r���!�S^'ȩm�4�g@��
+�jb�
G}��
���Q��Bfj��~��X�m
�W�q�u�__P�%�>��Q_���73�2����Ϟ�܎N�`cp#},��&N��"�ے񒩒~�v&��ҟ6�*������s��{
�e�����R�;���ChX=W�S+��-�ȳ�1Vd8T��
�5	<h?'q
+�/F�o�*}�i�”A�C(~��"��
\i�+
Y��!L&L���wTc�#�L�&������M�+��nN�|��V�E�O-C_�
Z�We�_}���H��f.�ƙh&4q7�y	�������Aᨾ
���
b���Al_� �R\sH��ׄ*�C���ټh�$� [<-BAW0 �=H{M�=Tk���%l���Hb[
"�K%6���O)���ֵo�
Xe�Υ?��� fMF�
+�\ƬG� B
^L��
Z��bR��W�
���}�Gq�1�hg�u�@#j�z-�B�w�Bu��� ����_F���#�%�V&@J��oW�kO�'+�J���%�O5]���$p�ρ+1f
+�H�xe��ή
񊄕Q:���j,5�
+���y ��+�-�B�K� n�GM;σ^���7z�)	��2��`�BǢ
p�Y
�-S�	�,C����S����QMGւ���Ą�E�P����d_hf-rF4#e�&P��i�N`�S�W�
�N�Exn�a1L��dz�@R�G1V��` 
Ǣ�W+�<@mw�rFh�����MP��a(�\�pwǕ��|�%�
|G�����3��/���OjKĉDF1�>��J��;�ׂw�QI{�I{�*--��U��&��7@|�� yw/�AU|,S�l�v
��4
ڇj�����J��/��_΋�
X���/��K
�
���������	�+tʳc����x��
���
Ul�{��h�K`~�E*�]��-�(��`p��Q3���_8��endstream
+endobj
+8348 0 obj <<
+/Type /Page
+/Contents 8349 0 R
+/Resources 8347 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8346 0 R
+/Annots [ 8354 0 R ]
+>> endobj
+8354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8350 0 obj <<
+/D [8348 0 R /XYZ 90 757.9346 null]
+>> endobj
+8351 0 obj <<
+/D [8348 0 R /XYZ 90 733.028 null]
+>> endobj
+8023 0 obj <<
+/D [8348 0 R /XYZ 192.8535 467.0689 null]
+>> endobj
+8352 0 obj <<
+/D [8348 0 R /XYZ 90 450.9644 null]
+>> endobj
+8024 0 obj <<
+/D [8348 0 R /XYZ 90 291.9143 null]
+>> endobj
+8353 0 obj <<
+/D [8348 0 R /XYZ 90 277.344 null]
+>> endobj
+8025 0 obj <<
+/D [8348 0 R /XYZ 90 106.9615 null]
+>> endobj
+8347 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8357 0 obj <<
+/Length 1987      
+/Filter /FlateDecode
+>>
+stream
+x��Z[��T~ϯ�$9{�!A�"�
�T+o��X8N��]¯g�o����nS���6��3s�|3�q��?26x��B�q9^nFx|_7"��ܟ��]���H16�H*Nj�L�$HPBNj��	!���`�'�O�x�ݼ�R<ن��������؋��O�Ի�F^xs��v������Bj�)5HJE�
���\����2�
��C�A�	U|}Vū�K��
+
�
���]�~��/��O�����b��	#�*
�^T�++�$6n������#f�?�F�:ތ8e�E8�
�\��od��G6d�(CX
+v� ���.������1�yO�R\�B =������b��
+�ј���,>X m�U��"x�"��Ts���'1!�3���\J�w�Z���Y
����Yn�$�� J
���~U}ys}H`s�[_����/�؟*����F�T>�~R����:4�*��QD��\P���)g6S y%I��oV�b�H��҂�a�p��l�߰H8�\�`ۖ�����	�p#SL�L)b��*2�9
��hH���:p�H%�
#��t�ݧ��M��� �o�
��>L펠v��a�&Fs�L�RhV��?�0,
tI��P9X�D�TM�8���L�b�8
�8RIw=i��`�(�G��]oX��°=�˯��V� �Ӷ���
�m��,䯿�n9 �!Ć���g Ő!��
�6��xZn)��$�|r�)������rJ�$�U�1�B�`�&ՃQ(�BɜH��k��� �ڃO��>|��8��R̺����
����
�Ս��7>���H�~��J��L�!��sÙ�:�N��<F���I�l�B�S��h�����
z(�@EE/�
��-ȋ���t�ۆ���,�����K��0�E'�8Y� 0�j��`� E�́R�$L䦂&�Ӻ�i�
+(�����oS)`Q6Q"(�����
��,1Z�UՌ\
�O�`��,}�5D{�����n��6ުz�E��U
vo1P�)�ݶ0��K?I��aa ν�m�����������A�c�����>��g� (U�	�Ļ�â��|(�[��E!km�%3YT��)P�I���ev�(+c�OT�>�*C�����1�$�Y��/_�n�2Qp2�f
��;,C���r�`�"ȬE�����2<v�k�$��GS��r-=
}([.l��r�8�p�/Ƅ9�,$�/�u���C�c�9�e���T�n�Q�=�e�F��2:θYFÙ:��襋ep8>Il.||�$�|*H���fx&d�#k�谆vO�R!�婦�?OO^�%$gz€�	F�+^��5<!
�6�5ȁ�i2��l
�3%cHIF.p���Y����l�?�?^���N
��@��	]�_�V�A�2�)��+$
+|�mu����)���e��ct
qw�J�ӆ�r�ѻ�J�k�58p��i2,�$�`�w��1þ9ʥz
��R�Q��;R6}����Ȩ��sӹ��i�QM��f #q���W�7�*��1��x
I�7#i8Sg$R�sKa4����č<7��f��

@RR� ����Uv>�"�����
+}��Ѧ0�@,3�1�d0�3���L��O��<��ئN��
�t�Q5����`k6!b����δ�7@�3��
a���ز.u����`�
�d\�t��'�NS��c2��?2��Y7�i�]t�z�W@�"����t^
H/-��U���w@� a4�iM����̄
�{������R�y4�/G���M�Ꞽ�T�Q�%Ҫ����=d
+��

����/���G
+�Q?��~�d_��(

+���gJ'U�M
�E�˒��#�/~M��˩�"W�
;��UU8{Yc�W�.���{C��׾ߎ�
+�p�F����O�[=0�=�'��-���.|��������#Z&h���n^�����
U�o�f�PǗF�9�TX7|��<9k��RA_n<[-:8�	�p�F�g�endstream
+endobj
+8356 0 obj <<
+/Type /Page
+/Contents 8357 0 R
+/Resources 8355 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8346 0 R
+/Annots [ 8363 0 R ]
+>> endobj
+8363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8358 0 obj <<
+/D [8356 0 R /XYZ 90 757.9346 null]
+>> endobj
+8359 0 obj <<
+/D [8356 0 R /XYZ 90 733.028 null]
+>> endobj
+8071 0 obj <<
+/D [8356 0 R /XYZ 90 525.4279 null]
+>> endobj
+8360 0 obj <<
+/D [8356 0 R /XYZ 90 510.9873 null]
+>> endobj
+8072 0 obj <<
+/D [8356 0 R /XYZ 90 409.6573 null]
+>> endobj
+8361 0 obj <<
+/D [8356 0 R /XYZ 90 395.2167 null]
+>> endobj
+8073 0 obj <<
+/D [8356 0 R /XYZ 90 238.9507 null]
+>> endobj
+8362 0 obj <<
+/D [8356 0 R /XYZ 90 224.5101 null]
+>> endobj
+8355 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8366 0 obj <<
+/Length 1918      
+/Filter /FlateDecode
+>>
+stream
+x��ZI��6��W���@��"nF�C��膦
=$�@��P[v$9S��>J����=K�)�a,���[?R"c
d��Xr�4��x�
��-
�0"���O���GW�k���*�A�)����Gbj2%c���`/H����	��ns\��$��%z��q6�m���8��\��}8y7���!��)�HI����B���`D�����1�F�qi�;;ŋM���)�f��
��M�����*L&Dya��!���f���ye9kX�1v�0z���`�F1���.0"Z��v�SV^lFף߫y��.��|�O9A�r�R
a�$�
D1�r�Ri�1�cI"���MN��(���J0E�Q:���APIu!p�p�D�u�-���_*oCdy�	�f@{��v�E���AV�Yv�}X
l��i�"d]�Ĉc]��6-��(FKfe�B����0-�4]
6��.)���r�,�
d`o&avH,�(-�J�0�X`+j�(�M!�4�Eƥ�* [...]
+�̱
+�(��:r��4�� ��lYùH�v]��T���x�F�H��Y���u�`��w�4#����X��rB�����WR]��&AJ�"M��2FN����Q~��ٔ�l`Ļ�޽��M���hcE�[��m�Kl�v:��*0��T�ӹ y-y��eg�u8q*�s8q��qx)���l9�E�����`-o����
��� �
Ri�"�TL��3$�n�����R����9+G��1�������������*�z�$���e&M���(^�� ��oB'K��6
"�	�o�(�'#
+򩉂�?��(�p�
�M��&4n�h�	_��u������'�Kxb�?�'�Kr�
qZ�\K��������U)�RP�0�d
���U
+rw�Yԥ����9����C N 
����0*����6���WR]��P���ni�S�������h�؏&	L
���~�K
���ߕ`����wP�}^�=�$
Z�D:`�$�晐���,�*__^D���h�N��;M�_HB�,!=s�ps]�wN���ҶH
x���~,Y�q!eI�}�B�����"���N)���O�
��95�E��r֥��	��n�ٗ�����A��(����M5
����+�����H�V�AC7h��*��!5�?�/ځcO�MJ�5��
���Α	��g��I���T�륭a����!�7�z��É@�`��C
�g&��g�$����Ad�(�AXϙ�B�ϙBz�P�<]��\���iͥ��Փ�ɑ�'��?�.4M�C�yY�Ͻ,��c�L�A\P?�'!
��7�綟u���Ax^��{����A��
�X��
�e�\%�U�b
��,m�u�;ܗ14��
��
QDU]� �D
+�3$Ԅ���@�_L!
��
�
���XĐ-N4����#�H�;���.^�$Z֘}!g�b���Gp�on򯞄9�դ�
�o�|���h��k�a���ť��4���	�ͫ_��P�i��TP�O[`��}Ri:�M��0lۇ*	, B�J�ݿ�察O��
�֞(�Q֖ܙ�,|�e������
Z��G�E��~��j��1T@*ِ���PK��>$��X5���/n�P�]U�b��\t�(�؅�/��c�endstream
+endobj
+8365 0 obj <<
+/Type /Page
+/Contents 8366 0 R
+/Resources 8364 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8346 0 R
+/Annots [ 8372 0 R ]
+>> endobj
+8372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8367 0 obj <<
+/D [8365 0 R /XYZ 90 757.9346 null]
+>> endobj
+8074 0 obj <<
+/D [8365 0 R /XYZ 90 685.886 null]
+>> endobj
+8368 0 obj <<
+/D [8365 0 R /XYZ 90 671.9911 null]
+>> endobj
+8075 0 obj <<
+/D [8365 0 R /XYZ 90 536.7749 null]
+>> endobj
+8369 0 obj <<
+/D [8365 0 R /XYZ 90 522.8799 null]
+>> endobj
+8076 0 obj <<
+/D [8365 0 R /XYZ 90 387.6637 null]
+>> endobj
+8370 0 obj <<
+/D [8365 0 R /XYZ 90 373.7688 null]
+>> endobj
+8077 0 obj <<
+/D [8365 0 R /XYZ 90 238.5526 null]
+>> endobj
+8371 0 obj <<
+/D [8365 0 R /XYZ 90 224.6576 null]
+>> endobj
+8078 0 obj <<
+/D [8365 0 R /XYZ 90 89.4414 null]
+>> endobj
+8364 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8375 0 obj <<
+/Length 2214      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��}���S+�x�#(�IѴE7����B�%�bK�*I���o�!�!G��֦h7X`�˧��v�
If����3%2���zw�g�p��W��^��e��wW��H13�H*gw�� A	��m��	AL/�c<� x
�h�nA�<K_��&�VK��(���Ǻ�
�}��n��!^|����B:�Sj���
;�W����`D����.0�A�	�
~?9ğҨ(K*0�f�<�
Ҩ��+��q� z
��p�&�b;���w��c����?W�?��
��F�h1{���1t���5'����w�8�������	eK��B
Q�T6�:N��#�WHq��A�r���.�V�P���t,0d3�O6��d��H>	�
�c���’���%��ANN�rN�w77O�u�/�<J�u.����fX�'�}���e&E�J�8$�C�!�
b�8o
�4m��>٧�>�P
+ڝ
a
i%%
)$)D���lwx*��f<��۸��D�4�|&
C\
]竽�?:��;���/�?����3
��Y/����
6y�#�t
�I��c�0k��!�J�1��A�@�A�=
�C�Bꅃ"�e����h�D��&E T!M�pF�I������!^�.Y��8D��7�.���<`i�I?�|��~�f��KN�
zb�O���h�<�G0Cw,���R7C���
�M[B��k�����#l
��1Zv���: ��$E�C��'�>�����fP
+P��Q0 �Z��:��㨝 z���5
Ϳ�>��h�ژ�ػ��C�v��v�i�����9I���ޙv:a�9
?���D�:V#�`�]�~�q
l��]��c��8����(���
p��4٬���	|X@����Q��VC0~�`�$�c��6�T̟]���PqR�$6���
+DKS��R��%C4�7�
+
+Mj��h���������2K�
�8�)K
��M�b�I}�nb�O���I7U��Ӯ�*V�������	e�
.��}��Q ��`�s�8C`Q)���Ɲ�b=�eX
	i�
�s*&��_vX�q?E`	�0�A��h�Q�#�
8XRq�������~+�$&��jBR](Ⲿت����{m/+�(�M�m
u�-�!t
*��G 3=�
+*kyjU�=
+���]�m�Zu1$�
G�3s���ϸ�Tb�߻V��] �Ic�'��� 	s|k6�a|va%���Z
a��l�#=G���F���[�qΠo��tx��g��У���p"�����ۨ?��m &,�<0�xS�x��ě��]S"m�Sx�?��cw °[ս��ڣl�.��BL�9D��~�d��~�w�q-�����E�Z���a4x�� (J�$�d���)
aי��T[Y��Z���� .��%�w�OgGP���v�&���*X|y*�(0/��u�����3�(�U��A=<=b�-���zP�c��i`������ۥ�P�O�����ʕň2� 85cX}B�Ĥ����>vd��3��LoQD�Mȧ�n+?2� v[H�)��@
R�'D@��`ܮ���* ��0 V���T��C�*` &�<0��p�*�����N"
����u����'%�,E	���� K�_�j~ٽ�l]��Oi�F~R6��R���'^�I��й��/\�-?�(M�6|���ӧEo�.W��n%������qb��ؒ��J�2D'����rѩ�n��4�QFV���s�G��\C���בܘ3�
�G��.�_n�p��2
?�pB�	������>�R7܅�M�����&�9n�<��Ѻ|%�ջ��e)�.��	UI�A)��+�ɼ\��2fn�EC��˥u�;
��4 ��Z
M���f�xr���G�k�d�[��̓��^�'n����'��`���
���H��L�̟�q���q���L�D3�sRā�@{���<Diz���b��5ּ_n�w���������ct��	x���C�
��>�0?7V���1g
���$��]$_?���/�
����/K!��h�	��nB
�FB�*e�}�ـ�^�����2�;m��>u|[������.���j�{���#��>?�
����TY
@�%R����T+(U�*�K� [...]
+endobj
+8374 0 obj <<
+/Type /Page
+/Contents 8375 0 R
+/Resources 8373 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8346 0 R
+/Annots [ 8378 0 R 8380 0 R 8381 0 R 8385 0 R ]
+>> endobj
+8378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 690.3327 212.1242 701.2366]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 532.8894 216.2973 543.7933]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 440.1518 483.2121 471.1205]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8376 0 obj <<
+/D [8374 0 R /XYZ 90 757.9346 null]
+>> endobj
+8377 0 obj <<
+/D [8374 0 R /XYZ 90 733.028 null]
+>> endobj
+8079 0 obj <<
+/D [8374 0 R /XYZ 90 594.8928 null]
+>> endobj
+8379 0 obj <<
+/D [8374 0 R /XYZ 90 581.0895 null]
+>> endobj
+8080 0 obj <<
+/D [8374 0 R /XYZ 90 424.3386 null]
+>> endobj
+8382 0 obj <<
+/D [8374 0 R /XYZ 90 410.5354 null]
+>> endobj
+8081 0 obj <<
+/D [8374 0 R /XYZ 90 315.441 null]
+>> endobj
+8383 0 obj <<
+/D [8374 0 R /XYZ 90 301.6378 null]
+>> endobj
+8082 0 obj <<
+/D [8374 0 R /XYZ 90 207.3901 null]
+>> endobj
+8384 0 obj <<
+/D [8374 0 R /XYZ 90 193.5869 null]
+>> endobj
+8083 0 obj <<
+/D [8374 0 R /XYZ 90 89.4414 null]
+>> endobj
+8373 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8388 0 obj <<
+/Length 2532      
+/Filter /FlateDecode
+>>
+stream
+x��[ێ��}���S"QO�/�$@��
�� �z��h��!"�
+��x���&��l��Gp���
����S�4�d��?�0x��B�q��
o��~��
in����k������Xd$���}5�$HPB��wKBӫ5�/߬^F�1ڼYQ��/��.�6?%�(���۶�
�4:l�>F�x������
O�AR*
+���[�x�(3���
baB5��
�CT�5F3tO����_~��q�"z�[��&��;����m��
+&���n޽Nj
$�����b�
c��x�)s���7oǩoT��Gv�Q���@�!j�U*�����1��D�R\�Ơ|9�it���Up)�FDc:�0��-�,�5^���ȩz��š���5��AF�R%����]�-7�dߩ�
Z�֕�/,�6K����`.�"C�뷆�xk���0ʷPڈ��%0GP�n�&il�QҔ�Q�%�!I�������S����_!I�<��2�l�2��^
Q�	�@

{���ǤD@%☴6
0��p���e�����e��I�Є�>7�P+*�P5�TC����mL��`�3f��КH�����z�d�r��Z L`HA�0tœѺk5�1�"�+��("��������L`���}�

+�9�|Dk=��W밧aǜG�a���.IW
/?F�d���c�����F�b�dFZ�a0�
+b�$���`�����sS|I��8ELbs�0UEj��4�R������w����x����!F|Y�@�b("����u:����T����N'��t�}����
w�>'�d3}����NG/�tE�N�/��@oc�/�T���q�3����_���%�N^���(
Mu�c�vG�H�p��*}+�N4�4EU�

+N�FF�;�Cc�s��u�~m�Q��c
��S
q���0���`~t�NЏ� I�l� {��Z��E
,$Ë+ب�L���*
�w
������!�x[��.AQH�.oߐ���>T����vE��E
�Q ߶���Z>�i��
\Rn�O�HP��#�}�
/-9J 4���8
�4�`�|YI1�8��@�M3���8�����KG���Df
�ٗ1�Ɍ�� �0���2�d�q�0W����}:L8(d��)���H�b
6�2;e����#
��Zfymr&%u
[
�0ho��g	
3�G�� _!ߔ��U���6�4�$�����A��=���$�u�
i)ڜDy(h��� ���t����O���|���S}(P5�A A�Aa��� �O<j ����eq5�m(�)�()���*�M�{�5�
���p�W�.N�c�Fe�D ��v��
�U(:i�F�1�:�,��
+t��]	�D�k�,�$��ʑ36z� aq)�B�W��0�
*�\fQe��
�
�r����5����8������'W�#�I?�>�rV3�P@?lH/�0���q
+���)��&�����8Y�҆�؟���TqO{��&Ƀ��,q8+�
� ��v� ��z����y�ކu���O�
-a�
�������K N��
� T^'���
SP�=��q�X��4��Z��8�5�9%i�DK2ǹ\(�	.7�$��Z�N]x�)F�t
���Y
��[�Z�ϵ����l����i���c�}�
Y��P��@�9�^+�x��
�K���v̦�̺��g��bү���3�`�$��6�)P�� �@��r9�5	R�s:����T֜Y`�z�AQ2,�{g5t�'0�ji|�m�q\)}-���Q�wfP�c5�*�
K�
+�X
��O-a?��%tf_�'3rV��`���
���ն��o�Ђ�ԗ��v����
�E*�6�T(�ٹV��6-�l{
�ql�_�*į��JQ}_g2�Ls1�3�M����^<�!ݞ����}W�`<͚cڨw4?�JK�����6�
i)Z���k�";������IO7����
��%�V\pN?GVC�Z]m݌�j{+��m�P�>SXW^���;%2���%��[�����)�Q�� !��^�����諜�K,��&�p�z0(82�R�ٯ���vܡֶ���
���~\}��f��
��<��{�BC];��ܦ�,�YV�Nu�MF���9�
}�r��Z���[�ZqWE����,��v�/Rqe[)�ysҵ���Hd8���CL��A$a~ܚ�)������mXq{n���.�>eR>�S��H�R�Ɍ|�M�֙͊�i���
�
�n��W�D 9Vs9k��2V]*��
�b��8,�;����&� b������P���b�
�=�n� FVΙ}�ΞL�Yg�	�l/�o:��ξ���}�.
�����J
+���ݫ��@j����~`�
��cv��ao,
Y��\:�\_6����G�^	�lr��(}���>ڡ���Y�P1 
UV��՚�yɹVP0���,�w��p�������5��Δ�ډ?��������m
�&�
%���t���Un�gS��n��x�� �Ra�Ųw{���;���
kPG��(�P�&�Dendstream
+endobj
+8387 0 obj <<
+/Type /Page
+/Contents 8388 0 R
+/Resources 8386 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8346 0 R
+/Annots [ 8392 0 R 8394 0 R 8396 0 R 8397 0 R ]
+>> endobj
+8392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2748 582.4205 293.9708 593.3244]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+8394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.3316 438.6427 235.5982 449.5467]
+/Subtype /Link
+/A << /S /GoTo /D (main_affine_relation) >>
+>> endobj
+8396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.1511 227.0685 244.3447 237.9725]
+/Subtype /Link
+/A << /S /GoTo /D (main_affine_relation) >>
+>> endobj
+8397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8389 0 obj <<
+/D [8387 0 R /XYZ 90 757.9346 null]
+>> endobj
+8390 0 obj <<
+/D [8387 0 R /XYZ 90 733.028 null]
+>> endobj
+8084 0 obj <<
+/D [8387 0 R /XYZ 90 644.4124 null]
+>> endobj
+8391 0 obj <<
+/D [8387 0 R /XYZ 90 630.6207 null]
+>> endobj
+8142 0 obj <<
+/D [8387 0 R /XYZ 90 512.5899 null]
+>> endobj
+8393 0 obj <<
+/D [8387 0 R /XYZ 90 498.7981 null]
+>> endobj
+8143 0 obj <<
+/D [8387 0 R /XYZ 90 301.0157 null]
+>> endobj
+8395 0 obj <<
+/D [8387 0 R /XYZ 90 287.2239 null]
+>> endobj
+8144 0 obj <<
+/D [8387 0 R /XYZ 90 89.4414 null]
+>> endobj
+8386 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8400 0 obj <<
+/Length 3000      
+/Filter /FlateDecode
+>>
+stream
+x��[m���
���ŸZ�f��e���\��M/�~I��v-�
+�eW�fo�ח#��3�Hv�� �dQC�!��4�a�CfϔP�0.g�+<{���|E��
�g!��n����bf��T�nW�
+� A	��.��	AL/2�1��]<��M~�vA�|�~}*�u~�}y_������
����w��]��x������Sj����8v�ߵ$�#�
w��E
"L(G�K|����EF��
���:?�'?��^=/���&�R��՛�NsN��Ib�����l	
+��
+#f����
F�:�\q�������߻u��
)���1eK��B
1�t��*N���WHq�
��uWT��hVIS���t���_�u�m�t
^ğ��)
+Hm!�D"&�,U!��V�x���y,�����O��._}��V�]���q6����u��.���ߨP6���Ư�)�S`�jL
�o�b
�l\n��w����:�����NܺX�_7�թB�(������vߗU��wo~ܵ�d���_%�f�D
7^�m)�뉭iD%�G�
��m�h�,��ݡ�����鮕!<�	�
+���~�eQm7e��)	�@XS�h�("=""
�d[��d۪�&��$��D���HV�4%��/�5��cK�
��A���������o���XAtcN��}��rp������
M�
O�>!8
+{vDE��;<\nW	��`ѹ�{�9�_��S˴.�����i�����Gp���
�o�!�1��}T?:��P��g�
M<���k�
bC+Q�ZP1o����Ϋ����n�\=����+`ŀc,v/otTCau�g� ��Ɉd��r�#x�DF1�"��l���E�o8@!-j8 Y@�D��uK��!��fP\d��*�Q�%�V��TpD�4g�]A3�N��_1
�ltJ��
EH[���y�pPΑV

q�M\@�5��SQ��1�.
�,Z��E�ҕ2�����ݾM�5����:���M�&�42�#b�/q�g*
1�@�j�9SI�DYH5,o�D�k�:����
+(EE����'�"�(I
+0��
J�
�

+��A���S��		S�暴lccCEc�Έ��zk��ա�z�+g�}�tO?� �ˍ��ɱ�D��~G����L��G&4�vpP��Ⱦ��Ȧ���b��838k
��4gO5�
k�8����v�|��B@�����&tё�E��[��z�!ߞ&�G�$1�N��\��Qiת�ǧ	�
:Z� b�j��	���&�9�ԀlJ��,Q
F�8gX��=Ր}�[	u1��1�N��
��v}@6�cn��vH5
�T{��*���P�칙��)�S���0b_Of���77e��
!�R�����@(����{R
�P��Z�P�0����}���J/L8 �r�*���	���K�F��4�
�?������(��w_�Z��֦1��>�8�����A��H�,�^օ3����"���f	��f�����IJ�^1�5���
����j�a����;�C
�R�
h�\�	��1�
�l㕝��Fz{t[����p"
�"AưAې�A�8�.��u�؉.�2��OE/ѧH��\��ގ4|�TÇr��RzO[?�S{�`���C9��XL(b>���,�n��ZA��=Սl��wj��!0��P�ާmՙ��|�bL!L���{>p{���!Lz�x#�	{>��s
*�Hχ"[�4���c�>V
�U$�>p�4�4�@~u�����D�g���c%��d*�Vr��#m���'v��㩆�FM�G
+
˺~Z��>��2
+���u1R=���L�dQ�B��Nt�c�q|@ƒ�;���各�ݥ��5T�]4���DC�k��

r����\R@�,�C���c(Ήk���RI	0Q�$I��
Y�2"���Qbz�
Րm��b[s���=���娕)8JV�i��M�̓����ܵE��m����E��D�ɓ�Ȧt�ɂL
wE�uyv����
v�4W1�۟���� �����Ə>cV�B���Ş�֗b�n��ː��F��| L�G„Ȝ
+�a����	Z��wYƩ��O�;IJM��6T#�;���C
k�5&ֱ	Q
j��2*�d
|���h�W����z�
+5`d�
-�1���4��>W� ���A	�B1�y��p�g,��g�����p�ߍL10���)���L8���,poK���=�
�8wJ2}��
+�F�;Y���d�{�'@68��_��<um��
+��Q�1�2]=%��
+�ԣl-FP��d�\��C�:D� B���ʆ2C	) �V�$�v�Y�B
+e�׵�H�Jӫ�@�.E�15T{��Rb!���S
E
�8�7b�/js
+#�E�N�GR��v
�n�
q�1����MmgUi���ݒY��p�G� � rz">
�h1@�`��<�
PTvI�gQ"�Q;s΢
�F�(
�AfU\�p���Fw�d_bA?R��
��(K���(
h�����YF�
+�ؒt��T�@�H���k��(RL���$i�ґ�����q�c�6=���@�p��y����؊�[XC����o���8��N`�lJ}��W;�


_�	Ύh�8V`sb4��=��n�zi�LY=���'tJ42 �)�dS:�d��/b�	�J��=ՐuO� U�21복���]\����`��F�)�z�sgA��w� ��Y��}�UF��Bn��VMq
���C,��_
�k�
�7�^����^
��P�3��<6��(�v���h��ظ��y����9�.ܐ˪	���C������/J��B��d�۟�H!��g�c��#�ɂ\z":o��,,w�
�����7����B�]�y��fu��.���o��lAU���f�A�M�Sk�}������q��
Y�F����a�����᰻��~yyA{�\������n}=(\1�>�ؔ���h K�~[*�#YV>�l��3GY���<9��
�
E�%��Jendstream
+endobj
+8399 0 obj <<
+/Type /Page
+/Contents 8400 0 R
+/Resources 8398 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8409 0 R
+/Annots [ 8403 0 R 8405 0 R 8407 0 R 8408 0 R ]
+>> endobj
+8403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.1998 678.3775 480.9315 690.0166]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [324.8518 438.7136 466.4885 451.1928]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 202.4553 422.9245 217.1707]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+8408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8401 0 obj <<
+/D [8399 0 R /XYZ 90 757.9346 null]
+>> endobj
+8402 0 obj <<
+/D [8399 0 R /XYZ 90 733.028 null]
+>> endobj
+8145 0 obj <<
+/D [8399 0 R /XYZ 90 513.1785 null]
+>> endobj
+8404 0 obj <<
+/D [8399 0 R /XYZ 90 498.8689 null]
+>> endobj
+8146 0 obj <<
+/D [8399 0 R /XYZ 90 290.1542 null]
+>> endobj
+8406 0 obj <<
+/D [8399 0 R /XYZ 90 275.8446 null]
+>> endobj
+8398 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8412 0 obj <<
+/Length 2976      
+/Filter /FlateDecode
+>>
+stream
+x��[Ks����W�U�h�9qU�Z��v*���z����
+	2 $����`�` jwi��
��FwOOOwGd���<SB!ø���Wx� ��4_/���/��۫�落d$����J�$HPBg���sBӋ%���.�'�>Y�]P<?�^��HV?fwER����m]&�<٭�m�c��p���w�x�)5HJE�
���H���2��ۈ���權ow��XR�A���t�%eZ�Sz�
��i����ab�(�J��ܶ�k+�$6n��z��6��0bF��3���Cg�+N�{��zw��VO�E�@l8��ф͖� E��Ji�0�
+�KD1��n�6c�f�JD$�U0�|\��2;䧛�	�H1Jg�Zg|�D+=�¨`/R�_�V�Ʃ���d����S��6��xxܧy9p�h$D$�T猓:#��~�!��u���8,��?�%'b��79寃
k�e�&��,O�CQ�f�AZ��f�Z�/)��^�C��������*�x���2�$��.��}Q	��sH�Z�q\%A�3ҩ$��I�����_KV
+c�O��6�a�_�ص�r
AڇD�ؙO��n2H���2�ׇ�1)��]󝍤�?I�bR;�OIl�#8���+�/?������tL�}w�#�!P���j#9
~&$
��P���6p���3H()�l ��]��7,�P)��|�(���%P�rL�d�V�U�D
���t�F�J���6�C�i^���
�S}�s ��|��av3
��77i�P�~I������<]
�&���f�P��Oۏ�"KlBW��ک8
�69���u��j���CS���
]�{��
v��Bq'�Hw��}D5t#BTO�zGY/��,O�b��c��Su,@�"��
=R��]l���-�]e
+���YOd��
+�:�Ʊ*�$+O77���!��G,
���|��
h���F����
)/�;�ַ���쐧v��zV�D��Fj�fJ\��g�b�!R0�
P��F^!I�X�'�{�W�M��C�fqn� �@ɂ*�e'��F���~*x�lJ����������.�����B
�m�:���
+f4	��pr���~U<42?y�G+���C�U����G]'����
�e�}C�z�P+5�F��(o�����sWg ��
;:VuF@
��V��X�G�CZzbhA��_�����$���[M���ﯺ�q�j(��WM��6`�—�ʥ��
+��`g#�
+�t�*��<:Kq��x�@=4��lQ���6-b=�A�$m)��pN8�F��3�ѥ9p�ˢz��[A���a�n�7w/��I�	iaB
���t��*B �STM�_j
��rSYl&�EʴE4$���!O∦�s`
fKc|�(vqRC�A�	�?ס�[�ۻ�Y�v\��<�4�>��
7����-��۫K [$�������c�������@b������M�ۉ�)Xfp��g,;���0�0Ok{h�v�|M�@��Ĝ��'6
'6V4�l��뤆v{��
��v�H� ݋jn��V�=l'�s�h��KXU=QN*!WR�
�'6T'��:�y'54��
��	ͷ����m��
+2Waa�t���ƫ6`1�o��y�D�O������b��AMF����9������x��bB��rP�S���
�IMA��
��WH�C!mZ�����w���D�Ԑ�����I)b��u~"m�Қ^�4z
S�%²K��Φi1�XG���v�&���ae���3}p at T�M,�'����bg�*e��,U%hEU9�G�ڧ��<T( amn�)���( J��� A�(L��X*�^/�.#mOO��e�$�-�X��-�E|���3�z
eL�V5T�Q=��P=��ehJ

�
0�=��=v�i��bx��
��j�^�"��
����4��9���_���^�_����l��Q?
J&L�=?�?6BC�t�L85"tm�]��)F�P~K҈�Lj�>\��C�	�=r���
��N-eb�<�X/M�5p�E���i��_�<!bO�~`�s�/5>�3N��6�Z�$���,>�$>��b^S�Cq�F����RC�=���q���;�=9��

�<\�s���
+�{2m�e@��
H`y��5
1Cρu_l"���mC�ؔgg�:���!���
+����
D��3ܗ?�T�ï��1�S���bdߜ��A�Ɉt|�L
����
+҂�pt����̯d�R�����PM7�nC5R���x=�Fw�0��6D1�_#jT�2�8�T���
�d\!��A�K�M�l�!�6����o�6���fi*�K 
���S.Eh��{
`e
��W�
+�!�
��JV`�5�䜱��*�E�	�8p
+��S� *Z[��>1���yw8����	(�흍�'����8��!�yq�
��d�2 � �/��]��zMs!����1Txq�zx�<
�����
���C����
+O�h��4�Vj��뉂ɳx��_���t_���)(�7�!
�
�� �����.n#5t-�#��ZÈ"�{M�hc�I(����:��n���E�����B� �ƥ�2~
��k�i2}
"<
�^�5��1�R ��3���@��`�}>"�[�����{v��-9���j>[DWM=�l�F���>g
�]�(X�%���_��N��W9��֮
���[,�߾Q���-c{'��'4U,X��Ob)"�'�Jߏ8XqR�.xL-���ѷ����l�����qSkGC���q�b�u�O
�v�����_[H!��
��;�M��V�eh�D��'ۉ�y�F��m3��o�qJ��/��7��I��4���"��*Ƞ:��z+Uvt@�F+��K-�j�~&� J�����W?t�mXzO��
�~��
ߖ��������O�1ώ����qw=����ؽe+4�%?�s!ց/��W���]��r�p�Do�X�
q�?au�endstream
+endobj
+8411 0 obj <<
+/Type /Page
+/Contents 8412 0 R
+/Resources 8410 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8409 0 R
+/Annots [ 8415 0 R 8417 0 R 8419 0 R 8420 0 R ]
+>> endobj
+8415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [337.3823 608.7104 394.782 621.6282]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [334.8835 374.8397 440.2823 387.3189]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 141.5218 425.662 156.2372]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+8420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8413 0 obj <<
+/D [8411 0 R /XYZ 90 757.9346 null]
+>> endobj
+8147 0 obj <<
+/D [8411 0 R /XYZ 90 684.321 null]
+>> endobj
+8414 0 obj <<
+/D [8411 0 R /XYZ 90 670.1444 null]
+>> endobj
+8148 0 obj <<
+/D [8411 0 R /XYZ 90 449.1717 null]
+>> endobj
+8416 0 obj <<
+/D [8411 0 R /XYZ 90 434.995 null]
+>> endobj
+8149 0 obj <<
+/D [8411 0 R /XYZ 90 229.0877 null]
+>> endobj
+8418 0 obj <<
+/D [8411 0 R /XYZ 90 214.911 null]
+>> endobj
+8410 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8423 0 obj <<
+/Length 2641      
+/Filter /FlateDecode
+>>
+stream
+x��[ݏ����BO�X{��qm�FR$m7�>�Ɓw���H#Q�\��Β\j�\-e�v�������|�f�#3
����
+���ns�g����.H�����O����o��d$������$HPBg׫7sBӋ%��_-�g�Mv�jA�|�~z�W�����.�=]]�pWg�e��y��U�������Ⱨ� )u,�?�$�#�
�(�#L
"L���I/��~�XR�����|S��:o������󼼃G�01g�[��\���
+�$�n?_�y�g+0��1���n0"����S�n��/���i�b�í�R�ْq�%�
�"�"�(���
a)x�FfPH��f=�5���&���
wH�F
+���r,�#
���Z�P��Cg���wY�ݵ�����ڭ��
*�y�~�=���|��e�v�?Ӳ#�D�aG�~_l�?�6�Z���k�R6�+�,eSGf�v8aSNWRN�vTc��Ją2�賭z��綨4p�F�	��d	��dv[���n����P���BN�wTc�U�@B-�X�f�n��lK�"�tk���E�^�\ؾ����yw��x
Epv=<��Q�m��&�
!�v�����4�
����m2�;p��n�<�C{���t~XwK����� ��EC�k�0�j&��Y�-}�q��à$V��ު��/wye���:�v�)�jq��
�Uc_����r��.ٺX�d�ΌC���C ,m��j�L�C�dp
(s��kݩ\@��⾫y�>�u�� |b�AZ�����s�\Yw>)Hp�(v/{�d 2ʸJo
\�B/",p�tGz8͒ �9�$��6�j��ג5@Ɛ0@ �X�~�h8��u� F˧�����HY�6F�E	�����vݭ�l
�$a
1����Yl�# 
�;�&�o������Uv7T��c�� X��<m>a�
�n
(��8`H��A�y�
`:tY;\6|�)��<!��vT?Uy�m򆱊BH�ј�0$�t
��L�-V
�g��qCd
+{
+Ķ �/"��Nǝ��U
r���j�� 2.�u�Җ�r�y��&��H�
��&`�-� ����t���m
1?oD��
�O�MQ��2qy����
�9������_7����F��s@}(?W
�
�׾�;�g�ѡ�
0�$I�S�]�O��.��u4?z���_�/DJوo�N6�����"P��
+��"�J�SM�g61q��@�m^?�y9����ϐ��
+S�i���Ll�T�O�1�iFU��T�A��ZL�
�b� l�E
��d’9���2q(�0���N��c����"��"����<��ܔP���ʭ����Un����}����K%׻�ڂ��
�\�����y�8�c&]���d���t"]�
�r��;7z�X
+F��n=�A�n�v��T�ݘ�U�:���N��D�P#j��
GX�<�<�ȃAQ%�@
+��ʈ�ypF!
4;y�/$�GO�L�!v��Lŋ���V!:
A���Є5 at Q�P�)��R>�S ��$� ħ:
B86H�|d%v��A��@$�@��4�����N 

+#����}O5� �`�I(��h���EPV�����
+1J]��
�u� 4k�
�6w!Z�Ya3h�hb.)툂�_eP?N%�91S��R��Ȏ9><G(撳	��j,5<G;����9ڡZՏf	�Wۢ��y<,A�n
f
i_ٚ��`vWd�T	���v�fVXn�0<-�[DZ�–��9-�b}dPo�ѕ7E�,rh��w��þU  �C��l���W`KVU�T�Ƕcj��#�9�H�=��!b�_��c���^�����
I� ��@���TZQ;[e֣|�V��>u��we��!O�כ6W뉤z$:�S��u�M�m�"�Sq8��DvT�ե�qlꆚ�{:_��[�QKG~ŖN)����_.�
�_q,0�uc��T���
��n���六=|�F����Ou��g<b��
��hIm}"t�
+hCH�����vx~/�0�{Q{{F/�0�$����=�f���	T�sg�/�#�P��}���Cb�D��kP���Pa��0~�
�����~����L9t�=Q�4�M��T7�{<�LS�w��f�H�~�f�B�\�c|�Y4Ӕc$��8���_H4�=�G4ӡN'��&}3
h�y5��@qM����4���
�����
u�C��&�=���ue��棬/�i&R:�f�i��RG���)
�)Ë́hG5=�5R��P�;̢�?lk���jz�c�?wsz��G���!O�:7F����G���#��ph@�pl�\G5�;0 $G�r?ɀ���[�8;9;Z�#KYϑM�m�R���Hj|lH�}lӍW�����m�c����6�~'�6i���M���m��H��{D�k8!@E5={l��á�0tT7�I�8�j���|	c���
���[�mxK!?���?
�P�I�=���t�w!N���W�	�����
7��n����{�������f��}�l3�{�
+0j��"���]NUs�wү�q��5BB+��?���߽��^Xzo����-��ڍ?�uuuy�������P��%d�ˡ^
cd�b��[�D#]�s�\��t�w}�u.U��p�tc#?j>���?g�G�endstream
+endobj
+8422 0 obj <<
+/Type /Page
+/Contents 8423 0 R
+/Resources 8421 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8409 0 R
+/Annots [ 8426 0 R 8428 0 R 8429 0 R 8431 0 R 8432 0 R 8433 0 R ]
+>> endobj
+8426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 553.896 322.4458 564.8]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+8428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 429.8052 355.5118 440.7091]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 361.5513 268.3399 372.4553]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+8431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 237.4605 355.5118 248.3644]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 139.2365 268.3399 150.1404]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+8433 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8424 0 obj <<
+/D [8422 0 R /XYZ 90 757.9346 null]
+>> endobj
+8150 0 obj <<
+/D [8422 0 R /XYZ 90 616.2367 null]
+>> endobj
+8425 0 obj <<
+/D [8422 0 R /XYZ 90 602.0962 null]
+>> endobj
+8151 0 obj <<
+/D [8422 0 R /XYZ 90 504.101 null]
+>> endobj
+8427 0 obj <<
+/D [8422 0 R /XYZ 90 489.9605 null]
+>> endobj
+8152 0 obj <<
+/D [8422 0 R /XYZ 90 311.7563 null]
+>> endobj
+8430 0 obj <<
+/D [8422 0 R /XYZ 90 297.6158 null]
+>> endobj
+8201 0 obj <<
+/D [8422 0 R /XYZ 90 89.4414 null]
+>> endobj
+8421 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8436 0 obj <<
+/Length 2605      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���S+�x��-�,�6i�ݮݗn-�6�Ғ�:��=��P
rD�Y�@6bR<<s�̹|�
Cf�%3�gJ(d����
���翟����/��]�]� �� #��]��$A�:�^����>_����9���$7o�)�o�O�Hn���I�ty�zY%��<Y�\=$�����O?�QO�AR*
+�X�q"�#�
o$�#J
"L�F�o�*^���<_P�A���t�['U�~y�ޥ�9��4_�O�01gTX�g�_��k
+�$�o�޽dz8��3���b�7c�ls�)�7볫��z܃�����NY ���
1�i�J����q� �8q�B�k�TO�4O6i�XE�BhD4�ck*�6��٪Q�"�$7D��Sǀ��HĄ�-��Frt*�s|�]^~�������c�J�,���(��s+��`��ۼ��-��2�.�F������Ā�z<1:*��$��J���y���i�
|s�J����y�r�47��\4�`�"��c��2���~���tUh��S�
��C�������.��Y��w��vc�)��2��PЄ2�~��:�ZSmc����}wfpd4��
Y��J�1ie�jV��~]������nv�
+�1�!�7
+��I3���3�����od�v�T+��P���Ɓ^k�K��O��1Lp��'4�W([�	�O "�M�M��4�#���Z�^�$_ŢM"��
+s-P�,�{J
�	�#��
"u�Q^hѕv�
0W�e{�4�6�:@��e|�)R���CZ�%a�P
�����	'P <
�}+5
4p4�&A�&���.e^_��I*�J�w�A!F�}Y�� ������f^%����m
I��}BH�d05̎��a9)G<��a;bc����=\Gh���Q��p�p
)F�
�Z�#���l�w|��f9ĵ{ź�1iDێV���
+H�,�]��yYm
WR�+��k���z�u��-�q
+��AA���fWZw
���!\t�o�� ��ZY�$4P�A�d�[?��wl$-���ZH1Q�[�E����z�9ma��y̪������
�L����@+5a�A�e�U�t�<5��ˇ<��O-
+8ZU�aM�Vծ��*�njK��m�ց8RQc������x*�b֌�Z]^B����:[�$��~����(�a��ߍz���fH2���~(�6E
�����B��_z3 N�}�O����2pa	���r
��*��G<
+y
�G1�
	�;`s��؜z.�cH6��6Y��nV��V�n
���<P;Cjg�)�Nch�l��II�(�+ǩ]G�j1����$���T_���Ju���т^&t
�ꩄ�u	3�3�G-�]�K4��vq,˄Tc��R�)��ۍ�c$����Y&��}1�I�S�f9� i\��q��j	���Oj�2
����u
B���#�93�f�L�/���'�>�	W�gLx�	�C
Mp<��g��'�7Y�[w��w�b�K�m�8uن~�nՃ��X Ћ��?
�6;t(G)`JX#,$�a;�XJ0�����+�6h&Y������m�n
��P��N)<L�#��"�b���q,�E�4�p*C�0�����T+6�PGg`��A�
5��P9�;�S�#5����!a�E�6U���^h0䀜���gm�i����nՁF�v݂�͠W
+�z�_y}5�Q��=�ҎؘO�������Q�?�+�o�93@���'s��
#���D��w��[�r���gs~8R
c��TW�x����4i��)�?6�H*���b+��8��G�`L���������J�^��|��[Lt��3�m@[�
�1��,8|��o
�gۢ�P��ݿ����
%�#��9
�S�!zXZQ��<H?�!���s)���
������̄����Ƌ�o�S�7^�R�&O��c����cph-�Ck����H=uh}��
��9�;�fĩ;���)4A�Y��ݗoS�����MdaK��S���;��Qf�����u��l�!�[��C
�/ۖ]�����_t_�����
�Ejow�np��d��?J�R�0E�a@�K,˖���Q\A�%J�㊮�q\A9GX�,�3`[
,�c�Vl���������o0���
�}"`�D�D>��	�j�`��ӕ	
Xb�1?��	����i�~(
����������Q��(��}Y���j�?��28���'�	)���	[�1�fϐ�Ek��(Z�>��x�9TI<o'=���b����Aԗ>��~�Qw>F�͎��G��20kb��<� ��/�/
9�
+�
�I�Wߦ�yT-5a�=���S����<J7':��(����y�<J�g�GA����(���Qτ=GgQ(�-�B~�����a�Vٝ�N0HHG����������k5��m�ۦw����i��s!�WN�}�>px��E�"
~S�H�r��

�*
~�,5���K��3��N��7
�T�)�ډ?T�������-K�ϳ]�����E�.�12T���[�B[�s��Ra
�rWﰁ�6[�M�M���8�?���?�'Tendstream
+endobj
+8435 0 obj <<
+/Type /Page
+/Contents 8436 0 R
+/Resources 8434 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8409 0 R
+/Annots [ 8439 0 R 8440 0 R 8442 0 R 8443 0 R 8445 0 R 8447 0 R 8448 0 R ]
+>> endobj
+8439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 678.3775 355.6614 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+8440 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 609.7034 268.3399 620.6073]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+8442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0082 484.958 276.1434 495.862]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHMZ05_widening) >>
+>> endobj
+8443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 389.2235 268.3399 400.1275]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+8445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [290.4563 264.4782 371.4419 275.3821]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0616 98.2435 276.0472 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC76_extrapolation) >>
+>> endobj
+8448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8437 0 obj <<
+/D [8435 0 R /XYZ 90 757.9346 null]
+>> endobj
+8438 0 obj <<
+/D [8435 0 R /XYZ 90 733.028 null]
+>> endobj
+8202 0 obj <<
+/D [8435 0 R /XYZ 90 559.3079 null]
+>> endobj
+8441 0 obj <<
+/D [8435 0 R /XYZ 90 545.1134 null]
+>> endobj
+8203 0 obj <<
+/D [8435 0 R /XYZ 90 326.8729 null]
+>> endobj
+8444 0 obj <<
+/D [8435 0 R /XYZ 90 312.6783 null]
+>> endobj
+8204 0 obj <<
+/D [8435 0 R /XYZ 90 172.5934 null]
+>> endobj
+8446 0 obj <<
+/D [8435 0 R /XYZ 90 158.3988 null]
+>> endobj
+8434 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F25 348 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8451 0 obj <<
+/Length 2668      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s۸~���S+�D0���δ�Mg��$�ݧl�CK�ŮDjI*�����F$$9Yw�L�	


���d���i<�D�4�r��^��4������/����z-�L#-���~�
$A�:�]�����\����%����wo/)�כ�u�j򻿗�M�<]_�Yv�C]囻�u�+.?��p���{J5�2� ���GGI at 0�LsOq�`�a"�ߝe�M޶�
*0p�t^lw��+\˻�c�\5/�%41�ĜQi�^|�k�+V0I��~�x��V��.0bZ��#�`D�����,�l.n.���q
v@�>��ma𤑢�$��@��
L�"���)�F�l�Q��d�*��0�]Ѵ��uLQ�(�
Y&���SIt�#C���Ո�4��P��T����餂'%�*O�����͍���y�<(��<C����}뉢(A\i��G-��˪X�ײr#��4�!�$�G�f�^<�7���[�mJ�4���#�$3�)�\��BO���0cOf&]�S;JpP���Y�t�؎#�dzޮ��ۧ�+���؛��0B��~�st�7�v�ԗD�?����
��\��ܜ�k*Q$;���)�2k��T�q�ٙY�t։^92���h��u�����w5���*��ܓ|pڂ�O�T@�)��M��ۮn���u;Ck�����n��)+�A�90��L�*�֑��vBu��-
-��†�)
+�(i!\9�w�͓��{�cE�0LJX�
d��O�n��@�Hh{�׈c������K���2gr$��z�3RQ	e��J�*6���X����}:'�0�HRH����jHu�ZITD�(��󲰎x�R���Bq,őP
dF��[]_C"����\����~[T�D(���P�Oj���
+[3$���ܮ!qA�<���|^~L��<�����P�^%�@E,pyJ�PHc
j]^�<�T3��eJ‘RY$o
+��U	vh�Ce�����+]�АV�XC�L ������uLs�c
�UaE�4է\v ?��k��K)\�
�>�N�3 n�2<@ވA.��
�u��!xX��	T
n�UXl��+*���q���0��Ed����?�lU�+��E6
+P�4��6
+RKXp@L��4ߝS��u�Zݵ�|Y����ށ��P�<(05��3
+u|�lBC���y��Z�$�r3�WG�6�S�
+y6����!I!�ۚ�Z�	�ڰ͓�p��岏ʪ�Y�-���n��>X�#8UoV1�4Q�h"�V�G�
��	[�3�fHu��P�<���I
+p��L$I����7G��\��M&M��h�
T��l ��&�hA>z�Ќ$Wj�S遁�%b��f��=y��[���|�p��I��Ӭˇu�vV���-�oC�hH$ś�W~�u�\��J?r�GX���ؘ7�=�_���(�}�TNe2�C�Ê�a>xt��8{�f_yth	�z��R�� �H��骤��;��K���t
i�$��6Z����ؕA���jY��(��k�]�t=z����QLC�O�	�j�y�
̏%�>J
1`�x�}���N}&��́�ɟD� (�
M$2��
��
+��_A
�/����_�V��~��n}��#
+ �j�	l���
2r��`G����3�
+a��	��u
p�����R���K6�eʝ��tZ|����9 at EbRԠ�F6�
"�a1 KY�����
paS�e�2�c��^w<8� f����EK�Դ���W�t�R.DP��R�fD�DD#j�9!),����u
+��
@p\8�ah�b0T})
��K0��j��������x&d$$9F�ˁQ
+�`���<�΁Q�
0:��v�YU��U� \=:�wn_�Q��!��:�Q�T�1*�D;���$�?Q'��!jOv��\��N&MC�h�o�%!�CT}��)D�_Q�q��[�Fu�X+B�}�B��p%&���
��u
Pl����2�b��4��X#0n�b9>�b)��L�>�
�*.hǂ�=�5����8Z"
��mz
+���(� ѥУC�g�[b�o1�h[)/�yp���N�F��
N�1��9��k�_`-3�0���a��v��۞�B~_��+���[sux �6���rvD3yP��ߒ�.��"SZ�7 �8e��p��E>:䵪< �ĝ5���$$<��$�P1�U, �p�гw��~1
��C
���2ޟ��M�Ka�#AG#Q�ץ�� Rx
��Sp�S����ܞIH�2;qgˇ�/����y��)���
+ ��
���r�3�:��! ��,Ͻ�MM~b�3�"�����{�MQ=t뻢i��h$
�
���&z��#��HkLb!���Le�6~��a�! ��h+�~�y-Q�o=�(��/��@d�aw���v$n��,
+Ϧ�MP{�	�H���@�p��%"c
xٍf�y|b�EH�Q�
�nʃ�H����xpH~S��LhH�,y�ME�B����w�R�Gj2�� �BD���^�� ܫG��_m��ބ����I�Z켣�ƶ� *�5�ܷ 
>vSL�?U8/�HK���Yx���&a�b0"x�a��f���]_]=>>�e��U�kP�]�v���\
CP����=�D�H�
Ҋ̰�d�X��m�!�B���ď� 	Q�"�q�endstream
+endobj
+8450 0 obj <<
+/Type /Page
+/Contents 8451 0 R
+/Resources 8449 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8409 0 R
+/Annots [ 8453 0 R 8457 0 R 8458 0 R 8459 0 R ]
+>> endobj
+8453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 662.6734 268.3399 673.5774]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+8457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 151.4681 236.6587 162.372]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+8458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 96.4696 256.1568 106.3673]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) >>
+>> endobj
+8459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8452 0 obj <<
+/D [8450 0 R /XYZ 90 757.9346 null]
+>> endobj
+8205 0 obj <<
+/D [8450 0 R /XYZ 90 600.0241 null]
+>> endobj
+8454 0 obj <<
+/D [8450 0 R /XYZ 90 585.8027 null]
+>> endobj
+8206 0 obj <<
+/D [8450 0 R /XYZ 90 409.4742 null]
+>> endobj
+8455 0 obj <<
+/D [8450 0 R /XYZ 90 395.2528 null]
+>> endobj
+8207 0 obj <<
+/D [8450 0 R /XYZ 90 216.0465 null]
+>> endobj
+8456 0 obj <<
+/D [8450 0 R /XYZ 90 201.8251 null]
+>> endobj
+8208 0 obj <<
+/D [8450 0 R /XYZ 90 89.4414 null]
+>> endobj
+8449 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F67 370 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8462 0 obj <<
+/Length 2603      
+/Filter /FlateDecode
+>>
+stream
+x��Zm����~�B�R	�����P�C��m���}��xuG["U����}g���\Q'
+>R
�>;;3��Hd���<SB!ø���7x������Kx��
������3���rv�m5H�%tv��8'1�X���݂�yV�ջ��j��o�l�C�Pg����?�M�X��n��);�O��ݾ%���R��T�X�t"�e�{�����
�骊���q���6C����˚�}�>�����y^��#f��3��қo�;�y�
+&���n>~³
�����b�
7c�l�)
7��7����
�����(CX
+v> �7�������ALq>a|���
4/����y�X%�BhD4�Sg*�Ÿ�U��+�]�I�Ή��
����HĄ�-��Frq+�q����9��Wv������զ��屨J�u?a��p׸��fu�=����C�?�ƭhT�=�$�"
H�z�Wu���k�y�I � �J3�,O�P_7�VST,�]Q柜��}1
�Ҁ����/��P��f���h�||
���	c
+@���A� �a�����:�	B˾�8L��1f�K*�l�b�.����n�>�)FI�H'=F�!��7���Z'�2$!`
����@�s$�C�3��N*8b�
�!
+�
��~�"�{���<#�Ώ
BH�����L�#][]PH�F��W��u�y]�u~<T�(�_W�
�zx��'|��1���\���Ԅ�Sn��÷���CcN�{b�)����A��86����\pȕٮج����kF��F���E:�1���1C��u����T̟K{Hj^l]ڣ}kr��R/�0�H�
MB�m��c"R�����[�s�eQ���!k
+����yrWU�?��l�Z�X��c��>t1<;�+���\S������@s��d1���4P���w�6��g
���	���cb�9j�D�Kc
�
��\��i,!�����L��Vg�Zu�~mu��߫3��������T}�T<>��D��}���MVd� M�*e�|֓��8x��*1��J
:�f��X�Pn�i�:vt�5�׀�N��#��d��U�Sf=�-;X �MF�
��Mw-�R�ɡ�њ�i��K]&Nn@��W�fj�	�
�H�f'�u�9i�3o���y3�&�x3�D��$6�<eݶ�,"G<�sȑu�娫��W���h�q��Nq9���
�e�$pps���@�ئE�< =��<t�ȘBXa�u�<�40��S�n:��� `c�_
�LZ�%����>�hK�>y|5�i�bj��
+1�g Db2����a�
�ō��Qi����������鰅7��Tt�
��3X���e����=G?릪G�![C
7n޲a�d�9�� [...]
+_������Lb��Oa�y�]�Yl��m�۹:��
�S��<���jz�y^_�y���i��m�6��R�釪cKl���
+6޼��զ�C�h�h����.�&r�z�����T��d�k�E�f�)O��Rt�8N��<+7�*w/�*<j�l/�� %:����
�ޜ
�����b��ݾ�
6pw����
J�E�W��l ?�Q��[paՊ�
{*7���Bn
�K�d�xcCI�)B�?q:c�J0X(6��Tf|�˜
�n������v�ր ��o����
�q����s`�P(	ȀE���r��#�ږ�o��f;m�j+����k.	Ŷ��KF%�G\�AT���
��3�h�,���3��L �
a�_�	z�S� ��-
z�6���/���=Bl$�_�O�P��}��)6��v���¨�
��sH�E3K��uF>�N��
ũ��s��J��x���Ͼq~�J���7ɲ
a���oSm(T]��z���8εT�>_�c��S}�
��KrQH��Ң}/�%�Tΐ�k�ncEb
'��C�����\���r�U����%�O��Hut�چ�LXB�Q{?�8�K)�Q#x�S�;�u)8��"}n���4 :�t"�II��P?��- �sg��k���S~͡'�mQ�g����K�^���ѡ�d0bqy�&b;UL��ˆ�
��X
T��?��G�%t"_�
+��+";Pmd��lwL�A��n�8�DK��8�]o��53м����,��ц��`%X �I�q�юA2�6�M��E�ʯ���
M���k?���~D��앫i���!��fh+�u�Ё/�����L�]���z���
s��	���?����еv����_3�����$B�(G��m3��`!X�G=��^I
+��~7�TB��UBz���mD���Vn���0�r�~��n�}��?,�����GV�BAaS�/d��V�����5�M$������Y�=�2
W��N'���j��Gz�ʹiw�����h}D��8Ԩhn�����J��{Pl���Kd~��
�����l�Lj�6.‡�,Y�ٹ|�X^��endstream
+endobj
+8461 0 obj <<
+/Type /Page
+/Contents 8462 0 R
+/Resources 8460 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8409 0 R
+/Annots [ 8465 0 R 8466 0 R 8469 0 R 8470 0 R 8471 0 R ]
+>> endobj
+8465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 646.6313 250.8953 675.6971]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 601.027 483.2121 631.9958]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.3762 388.0387 385.5187 398.9427]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+8470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 93.2552 239.8565 104.1592]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+8471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8463 0 obj <<
+/D [8461 0 R /XYZ 90 757.9346 null]
+>> endobj
+8464 0 obj <<
+/D [8461 0 R /XYZ 90 733.028 null]
+>> endobj
+8209 0 obj <<
+/D [8461 0 R /XYZ 90 580.9523 null]
+>> endobj
+8467 0 obj <<
+/D [8461 0 R /XYZ 90 566.382 null]
+>> endobj
+8210 0 obj <<
+/D [8461 0 R /XYZ 90 462.7644 null]
+>> endobj
+8468 0 obj <<
+/D [8461 0 R /XYZ 90 448.1941 null]
+>> endobj
+8211 0 obj <<
+/D [8461 0 R /XYZ 244.4393 96.4083 null]
+>> endobj
+8460 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8474 0 obj <<
+/Length 3126      
+/Filter /FlateDecode
+>>
+stream
+x��[[s�~���S+MWX�/nҙ��f���]7/i�CK�D*����}H "H����<u� ^�
�|���Y�PB!ø\l�Wx�

uE��5�_�	�xs���
���rqs�r�	J��f�����jM0��oW/�z��~��xY��m������������c��*���쐯~����Bz�)5HJEA
����$��`D���&�� „r�e�]�4�5�����]v̻'o���^���
<b��%��2���&h�)V0I��~����؂���ˆ-�#b
]�8e�fw��ꟁO��� eA�%�
a)��@��Ŝ��~~c�i���|B�
+)��#8>�2��-c�4�ЈhL�l,=ß�U��1�$�$7DN�SO��֜HĄX�A�Frv*�r��]_�O����6�l��n�}^6EUvn�o,�w�ٲ���vNt��r	�0���9�S�3D��Vk�
�Z�$�*�
�^�}z
{� )q4�tiJ�#��(wE���
+�W��f
+���^m��9�`���(bR�X���F\j��Mu(r��}�{|p��꾻
`S�u�
�r[���WUj���U
�!�؀
�@���
C
+
� <ڞhݧ�7�(ƠL)5���vD(�Ǽn���L�b�$	�ǒ����O ў��
O12�O����"�@����x����"Մ�/�Oz�^��aWl�u��?�f�!Q���I�=�)�z�Ѡ��lfPO5
t�\�82
4(�|���jŚSH�Vצ
��ِ�AA�tH�&B�uКje��i��`ƉpH
>a��i{2+Fs�^_劃gf�b{������#�
ij]�'5���Dv��Av��H���������vq�Hxܦ_l&���|���|�-��0�b�Ȓ16J�P�e�9Vu/<�y;*�!3��'���'
�������m^��8�)
�%Ѵ�j,D
�B�$"����n�o�mS�؆�B36��
_B˼��1��.���y������n۽�d����,��bn��onI :�
t��S�����"#�[��pI�P.N���#yiޑ�{�]��?��*.{Vo�n�Q_*j�逬	5pO3�$���PQ �P�����k�4j�̄
+�T�#cWOW�?M*�%Ty���C��

V���N�vB ���L�K�1��a��P
R��D�k���Z�
+�qn�<�v81h;q
+�zBE��"W��B-�ǩ�Ǥ)��2������P�^�hڲ�І�+�H�Ѐ���
+
�'X��zSo=�ip -}h�Ahw�P3
+q���
m�fЩ�DxG��'2뀧��D�I�rQ$�&k�
��uO57���b�K�t��塯��~N��Lۤ�p&Ŵ���ʄg�#�
� 4��y��(]�T��83s#��^�	, �Z^��~8&�@���^E��p�HBO��G����
�=:D�@�@����V$�=��h�'A{�hϽ
�j7�{�ು;W �����]�
�&��P0���Gɱ���o�[��\�H&��SC\hmⰼR�.F�&a!y,ĘBT� 
uh���a^�
��)ʔ
9y�SZOa�0PlSJ��2����] �9 ��(8�t�ۧ:��r�#���/�RLtN#IҝS ;科,:S-ٴ2�X�X�R؅X�2��Vݏ*w��[�=��l��g$�}�"���0�V\��i��9l�c�H���?О5��{��:��q�J(>ק�ɦ�͓������q4lv���
��!���H�@����>8�[x�/�[����M�P�ͱ(����
|ҧ�vp���C^��g�4RHK���Q��|6bJ��\�����i�d�
����	�	���"a�X�f�H��\ گ q����з�����(7�� ��z�}wj��jL��ӝ0���#� P`�^U���+;u�q�Й� �#��Yt�ӯ���w�w6i�9e�>9�9�m�i<�)k	��<fP,YpM�tU]$��4B��J
��b�T�h�>�h�KA�R#,g*
H�J龋]:I�N?�f�v��'
� 78;U��_u�]rX~��,��O�q%t�	�lVd��P=
q$�z	�m�Y�L@��	/�P�'�2(ӿ /+���w
�f�nԩ�x�bR(�F
K2��A�$��\�33���0Q�3ΜS�G��Fإm��ݎ��ʊƙ��j����S��wϓ�l���.��	0sϠ�pT�^�^�?=f��o�b�2A��_⥒�X1�t�uV&ң�[M�+t���I���P�T�9��F�
/ɢ7��ᦌЮ�N���_$Ê3��Ϫ�w`]�(�))$8iB���;}B�z��q� ��W6�N���|ݣ�p#�q��
`��h��)���
�چ"��>��o;-�/R�B�g��4��������z7��A
)�$����	�`�����P
�)=	�����X
�/��j�����rM�E��Qf�]V���t�D�
d�����������ft}W8��
+�%؆��N!�v��?�$aPmbWFDؤ	::��u*i}�W���fD:ǃ
�
+���,�����Y�`�j)&O��������y�N|F2�B�A��}B��N�
� H���'��Lb�=�2�J|
ySy�1�/�!����-���c�9�=�?W����P��I�ٓm=��\���3��d*�p:SQ�Y�sIf*���Q�Uծ��aUm�`�{ ����R� *ɟ�}�.+
�\��B3�Y�c�gm���.?<("����������Ӈ
Rg���9
�Y.�z�oc$��x��q���;q �!�C���3�k�;ϔ�Ȭ���đ+K%
�q~�4{z� m��
�/�=n������1���̂��ם�>{��sPW;_͵���M$7��c�Y���K���{@�`���yX]��J9�=�|*��`u�|�s�P��0Or/ /�A�������"&¾%tq���j�
�|k7�l��n}��ݺb���W�׿]	�t�[V�6���ݹ��t*�
�<�9U6�Qg�w�x�Dۦ��XK����/�������?v��o
[
���ׯ?|��6
z,�C�����a�z�c�%�=>r�z�@4�%R?�н(�t��������GrQ��}��N��D�/Ou�endstream
+endobj
+8473 0 obj <<
+/Type /Page
+/Contents 8474 0 R
+/Resources 8472 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8487 0 R
+/Annots [ 8477 0 R 8478 0 R 8480 0 R 8481 0 R 8482 0 R 8486 0 R ]
+>> endobj
+8477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 560.0455 300.1613 570.3268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) >>
+>> endobj
+8478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 520.6776 182.1636 531.5816]
+/Subtype /Link
+/A << /S /GoTo /D (main_expand_space_dimension) >>
+>> endobj
+8480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 416.1424 241.6898 445.2082]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 343.7585 163.8226 354.6624]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8482 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 281.1029 513.9963 292.0068]
+/Subtype /Link
+/A << /S /GoTo /D (main_fold_space_dimensions) >>
+>> endobj
+8486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8475 0 obj <<
+/D [8473 0 R /XYZ 90 757.9346 null]
+>> endobj
+8476 0 obj <<
+/D [8473 0 R /XYZ 90 733.028 null]
+>> endobj
+8212 0 obj <<
+/D [8473 0 R /XYZ 400.6899 523.8307 null]
+>> endobj
+8479 0 obj <<
+/D [8473 0 R /XYZ 90 507.247 null]
+>> endobj
+7905 0 obj <<
+/D [8473 0 R /XYZ 213.4267 272.3008 null]
+>> endobj
+8483 0 obj <<
+/D [8473 0 R /XYZ 90 255.7171 null]
+>> endobj
+8484 0 obj <<
+/D [8473 0 R /XYZ 90 177.0847 null]
+>> endobj
+8255 0 obj <<
+/D [8473 0 R /XYZ 90 154.1502 null]
+>> endobj
+8485 0 obj <<
+/D [8473 0 R /XYZ 90 154.1502 null]
+>> endobj
+8256 0 obj <<
+/D [8473 0 R /XYZ 491.3508 89.4414 null]
+>> endobj
+8472 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8490 0 obj <<
+/Length 2489      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s۸~��P���3��Ż�L��v�m�i�N�-�1g%RKR����� hR)����֣ޠ�s��|2��#3�gJ(d����
����?���x����:��Z��AFR9��m-H�%tv�z;'1}� ���s��Y�ɮ_�S</�wvUe��o��z���۲�ޗE��~s�m����o.�&�g�R��T�qֿ�M
�(3<��J1�0�B��
5�r�����
+
�
���v�5��ymomuN��K��
sF�3z��U���X�$qy����;<[A��9È-f�p�1��6g��x�>{s��Ύ��!�?��S:�2��`�
�8�����a�4�732�{��1�������(Iv��1ʧz�C(4��nV��e���go�W�Pnm�5e�x!
Q*:�S�S���&4�
<����F��6�+�['�3������TK��˲��x�`� )��-�?� W]���Aq��!?�tH% Z(mDh�!a�Q���KB���4%����*���o(h��0����s��]��5~^v�A�9js����Y卅i�`�f� a�1��첵�_�mek[4Y����Wަ<g�M��y�lNS��b:�)�f�L�qty���o�um9����<�ra5���)_��iq��j�v�B4��6�xY|��S����T�T��a�?�ۗb�
.��<py$ ��A@`.�]��S1�����j� ����*���0��C{lgr��E,��w [...]
+��㔻)˵����q׸E{����K�XC���6�
�#�K�q���K
𞊻/�^��£�[��Y��d�3�*<�uCx��0����mvUQ',3��>�T"�c&��ɗaV��:��4�sc�G��<LO�cg6�z"�0�F�@~W� '0`��S�x�}�]�2Q6�ַe$��]֤�f5�i��,�t�mlQC�_�Ų�l�ܬm?�K���-E
&���ZH�7�_~t���q 
� s!>f��WU�ȳ�T/�z��:B�
@6BȖP.[�T�p��
�4\�i1 ���7AWs�n�e����f��*��
�5H��}�_�`��]~�t�]]/�(�T#i�V�ow��L N��7�cf]
���>@�^����(���C*%�*�����W%H�A՘6��b� AiN)�0�(&��d5����I��1�P%��7~���
J@���XU��C^��-�O��\�1ق3���,��Ή���V�pxת��V�������e8�kV@�0h�
+���!~som���
)��S"����tR)!tO����
I|��d�������pD��
 �ӱA}׌N�60Ҫ٩#�r�E�y
\܆g��t��*?�(�eP[p̛p,�2唆�e��7
ZH��[0 �PN��*5�����J��mA�dL�C	�ga'��p1),�p�\�u\�
'e`*�����uK6�F��e�z��3Fp*�1b�,��qN
�%�(���k��c���֯��iɧ;
w[V痻��Nl���kUy�-�˅쎎���>��PQD�i��DPtu��/��
��E����۫0�
p�R<�
+��+��^��2�����x�g 9@��,��G a\�����;	 �����
q�{�n���
C��i���r�O��'V7�����P=閁�F$e��G@񄊒B*����J�
�#�r<�Z�i�����Mgί�kM?,C�fb�]m_���zWʉ<�MG��lTc:�������f"���Ε<�2{ƒsE&%����'3#N�I"����|��"1�� �3͞@aDE�"9�1"�O��l$ "wK]��� %�Q���-��"1��	���&��P
X�]��lqj�zU�O6M�LS�ɶ�1�GD��C���W)��7~V�Ϫ��4���vc@�[_�OOu����q9�W�
]���ȤS��bT������m ���0
_C�y �ޤ�2�H`��TY>���/�q�(E�hKL�_��C6����r����K1�
8I��@ñ�F =x�(?��<��<�������)
  +>��i��Gh
�P��<�6
+����\�"#l*�v�Ǒ�
0�����D��1#-spN�H
��#y�Y
d�x����@Ty��H�NK�	��z%�$���aP&��<����^���H�'l&�S�]e�f|"���vt
 ��%wbc�'R�O���n��)bH����nߧ������}t;��e�j�/�~{��V�v�d�N���_����";�
+��me�r8��
�7����} 3 v�%���Y<��c�������]�]�l//.���ѲF�"�V(o.���ž_
���P�&zo�5:�e�~�)�
+�fߗۨ�7e$�y�8s;�Ƒ۲�p�_T}endstream
+endobj
+8489 0 obj <<
+/Type /Page
+/Contents 8490 0 R
+/Resources 8488 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8487 0 R
+/Annots [ 8497 0 R ]
+>> endobj
+8497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8491 0 obj <<
+/D [8489 0 R /XYZ 90 757.9346 null]
+>> endobj
+8492 0 obj <<
+/D [8489 0 R /XYZ 90 733.028 null]
+>> endobj
+8257 0 obj <<
+/D [8489 0 R /XYZ 203.8219 651.9511 null]
+>> endobj
+8493 0 obj <<
+/D [8489 0 R /XYZ 90 635.224 null]
+>> endobj
+8258 0 obj <<
+/D [8489 0 R /XYZ 485.3732 572.5525 null]
+>> endobj
+8494 0 obj <<
+/D [8489 0 R /XYZ 90 555.8254 null]
+>> endobj
+8259 0 obj <<
+/D [8489 0 R /XYZ 125.5542 345.2563 null]
+>> endobj
+8495 0 obj <<
+/D [8489 0 R /XYZ 90 328.5291 null]
+>> endobj
+8260 0 obj <<
+/D [8489 0 R /XYZ 438.9984 194.7435 null]
+>> endobj
+8496 0 obj <<
+/D [8489 0 R /XYZ 90 178.0163 null]
+>> endobj
+8488 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8500 0 obj <<
+/Length 1983      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�۶��_�O-5S����f2ӺI�iں������$���T(*�����H
+������}8�����g dS
+l���(C��z��L��
������s�w��vr�VSG��zz{_JЌ(���v�&b�;�3Ji�j�h�x�j�i���
�*��&wy�?�x�e���x�x�o����77_3�Ϲ#Z��/�!=
%\8Y��
q�	e�_��r
�v�9W�9
��v
�z�����ȧKx%�P��N��m=W;V	��o?N޼��8��	%�Y5}�%�9>�L$Mc=y=�o+��(Z�D`�,�j%*=Ԗ���/�$K�fv_�/��x�ͳ��&>�Ij��~�|O)�����S�U�];ʈ��\����c�;o���3G���Э��4��z=�Kˢe���R�]�&�}����}�oP/l�wI��z�i��K⻵��&���i[���_��Q�W��7w>��`�(��^H��2�Hkڈ���?��J����OW��ż2XpH&
̈S�ʥW�:YΘ��B�������X
����H�q�,���K�d������u��qZ5Wɮ��p�LDw�x�>
,8���&Y�t��Q�$Z��BR4QL�z��9!eL��
2�+�4�,�Y��ƐaHë2������IZd!��"�`Z~J+�1����b�C�
����Ɏ"���P�\Ǩ���ZD���j��U:��I �(��t�w����k
� ��d����
�
f���%�%B���K�ƒ�P5|S�	>�_�����|�
N('N:{9��5	�\~Q��i,�yvD��F�dJ@$15-(��z���P���=W���x�ކ�o�5:�6Й�]���Xf
a��q��d�UwY��ĵ�hps|"y���� y�S}���*zQ�X\�v֐�
�Ψ6Xj�9G�R�2��`@0 _L�P����P
p��%)���fO� ֨�AS)de�+YG�9"�
+�ީ�}p+1@������8�D��*c
`�����7�Y܍�
��

w�r����� ���=p �َ���w�>]�.��@zO�A�Q3���j���r0��T<���� h�f�fK���J+>X4;%����ϩ
��%u.�2���7�Gp^�
�?�їe��A��ǒ����i��
�J��G	
+�c��h3�
,L��
I���2�ʋ���ʋ������5���챱Y��]H�2<㩚}�
�B^qˎ�8����n�=�n_�&��
0DA�6a2
����A6l?"6�����+�� ��P�Q p�l+OExQ�z��%�$���-G
�m�G�Zښ���鍒"� �A�;)�
�
PV��A�
S�Pc�(�c|@_y��v��꫘���B�r�κD�q?�MF�3�z	���Z�_�qcc���,���χO�c�-�I����(��s��
V�g��T���F�1���&U�
�;�"
wk�L�m=BL5�-aq�Q,�D�Zp�qc

`�v)�4
��PHݯ��Xav� ��'<�+M[�Oz���#��
��G<��*;�1�	ԝ��P���#
+��5E���T�槡�؇�T5dH�U��ARSl�����[��KL+�PS
v�g��T�SS~5UQS}5������^LM��??�ք�T?$��؅ %?"H����9��]��wԿ�{%���+��y����t�uf'�B�Jx�0��`�K���J nt�]_-q4�\���WK�WK�z�t�Z��WK�ï�����A\
����A~��3�
���䧼
]�>�V�(���G��ߵ��t����lq��
��:J���n[�#���|�^5�Oի��v>��L������>�cY�O(��6~AU��=7X'�
7O�k����RR��T��0m��y0�������|�1�H.�P�77���d�#�4��$)n����P/I�0r#�Vo�:ҥ�~��m�\tu�ԩ
�ɚ�JŖ2׎��v����
�endstream
+endobj
+8499 0 obj <<
+/Type /Page
+/Contents 8500 0 R
+/Resources 8498 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8487 0 R
+/Annots [ 8505 0 R ]
+>> endobj
+8505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8501 0 obj <<
+/D [8499 0 R /XYZ 90 757.9346 null]
+>> endobj
+8261 0 obj <<
+/D [8499 0 R /XYZ 125.5542 616.7024 null]
+>> endobj
+8502 0 obj <<
+/D [8499 0 R /XYZ 90 600.3289 null]
+>> endobj
+8262 0 obj <<
+/D [8499 0 R /XYZ 438.9984 466.5432 null]
+>> endobj
+8503 0 obj <<
+/D [8499 0 R /XYZ 90 450.1697 null]
+>> endobj
+8287 0 obj <<
+/D [8499 0 R /XYZ 125.5542 239.6006 null]
+>> endobj
+8504 0 obj <<
+/D [8499 0 R /XYZ 90 223.2271 null]
+>> endobj
+8288 0 obj <<
+/D [8499 0 R /XYZ 438.9984 89.4414 null]
+>> endobj
+8498 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8508 0 obj <<
+/Length 2706      
+/Filter /FlateDecode
+>>
+stream
+xڵ[�o7����|�|?���5M���g��+�@�����^]�q|�
�A��+R�",iv��p�ofW�a�Gz��P�0.{��	����?����!|>�
~�>9{#E� #��]*<H�0�w=��'13�q�b at p�/ƣ������.����/��|�?��W��x>
]f��I6
]���+x�
|����
!^@� ��φ��� �(s?��!��#������2����^_�ǛM��z`h?[���mf��
SHH�zCȆ��\f��be�rRr��r���v����
+a-���_'>�����
i֢� /0"����SV���\����� ~�
��fA�>�L!�����GW���R�H�6�)
�2�׺2�>���x�
�

Hoۡ �J�⻥
��g[g���z��̀�����X�d��:َoW��|tu7^w-�r���$^�
��e
9�����I�iiaT#�6u�/
>82��4 j�}�G&0GJb�7A�2aa��"��	 ^�.�Hex!HSR{��g�ħKKA�ͣZ!N�e�B�B��K����m��l��
���
����oli��
գ��B
�-�? k�<$*9"Q���D�Z���6�#�5�,��E���Vˑ�]����j�܎f�i�žo
+�NV�Ͷ4k\�.�j��C�:�P�\W2;*Hj�Դ��Xi�$�ﲲsLW�{ �
ov�֧U^����U�e��j

+zV/n�e�ېՕ�jQ_�����Հ���ly[���t��w4	͈I�s
�>/�C�B�A�ltmU$�R�
D0\D����9�DP�
��
���stw����"Z�2��
� ��X��Oq��[��l@�5��Y��b���r,�m�E.�L	���)
8
F���RNG�1��s�&ZpV�qCš^��)_�e����2Iŋէ�Z��^�/�7�m>�X>lP�L��l9��O��,���:|RV��/��HK!"
+64V��
��[�G�7�٤\ջlq�U�~s�,��AA.9�
+@��o!�3K�0���g�������'k����.@�]�rl�aS[q
�F��(�0�2�Ht�V\.`T �wgJ�}A�oGl`a�uX%RP%�3
+��aT
�/�#�a��hB� fr�t8����B
3["u���g�e61�;�hJ�[�}+T� `�>�O9^����__^��g��L
+�>@=�IEgx�w���wP����
}@�{ J^ �v[�~
+e�p?�O+9Wc���Y-�w�Ϯ���`c�R;
<i� ��j��R{;	͌*��~��^#��C�n��mP�����fi��

.rqt��|t��l_䢀��8�!!L�����mB��F��JWۧ`��s�jy���9ct�������1��
&�
g� ��5����Nn7QZc��4�0Z{>b���Z��g�Lf��Y����Q��ٔ�
F����nb3{���1�͔m7"Elg�$���`b'��v��;�#v
�#v����aD8㍸�9]ۧ����i(��<�g� ��(�R��{E�s2�J�>"�vf{R:0��&���7#� �E
�� �CĮ����

N�8:Gl�3�
��;
+��A��
;
�G�N�h���mo�g��.vC�scx<�*��
�1�� N'qvS�`�
�n�G�ݵٷoؐ�!�n���G�6�$F�$�k�4�=��s;��q�G�LnG`�܎z�v��h���Ӵ�Z~��5SO��J�`XC��ƾ$hM5��f�����3;V�ދ�T	$(?&���枑��Y�ܾÃɝ@W��G�l��q@�Z���	ҵ�qK��hw|7�k���߂ᣋ��ղ=�C���h�U">��MB�����sD�)\��p�)-���-���Y���qT~�z�i+^�x&�Ug�~y�B
� ����}4����
���H��֫_�]���?o���#�H�RG�GL
k�]�X>I��{Q5Y���^U�UY��bU%�f�b�a:�
�3K����p1��sb�{�F`�bD)Բ2
@��;9�f�"w1�}
+F˯���}T-tJI<�*����i��G�-�)��c�
8������� �T<�Qœ�(�#��7	�~��>"b�̞+��6P�_���C�4;�
�Z�����VI5��
,�qh���yR��)a
e���a�v�R��
��w�`m����j1��Ϧ��f7�Xwei��V���������š�=W���^��=[&�����A8��A
I�`.ӇM�����UV���P��
�=�9��Ab�蔾�fi��
F��uŵ�&�x�q�#�Ly�¹��9��%L�Z�֑M�o��,�lO��
�Eq�=8���a������wAL�k�<��[£��0+8�& 
f���eϼ8���߂��/�.B�[�X}m����Eӛ�� ���ܽ��٧V��k�7+7|��1�ė��g�7����8I0H���
�ެ�t���_��M��O$���kf|iO�F��8�ڝ����;oa��v�����\��Ly�Y��y�_(t
����� �㯕J-�&W�eV/�����6Y�����}�/�c����|�ΆT��3�lV� ���WY�&"�T@
Y*?��W��O���C��@�[r˯]��v�>?;{xx@�
�_��9�m����Y����~
+���������DD)����/Vy�
�%��(�ף�#�
P��`M�endstream
+endobj
+8507 0 obj <<
+/Type /Page
+/Contents 8508 0 R
+/Resources 8506 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8487 0 R
+/Annots [ 8513 0 R 8514 0 R 8515 0 R 8516 0 R 8517 0 R 8518 0 R 8519 0 R 8520 0 R 8521 0 R 8522 0 R 8523 0 R 8524 0 R 8525 0 R 8526 0 R 8527 0 R 8528 0 R 8529 0 R 8530 0 R 8531 0 R 8532 0 R 8533 0 R 8534 0 R 8535 0 R 8536 0 R 8537 0 R ]
+>> endobj
+8513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 461.5236 225.3314 472.4275]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6713cca018bed4091ffafb98ca4833d0) >>
+>> endobj
+8514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.4251 461.5236 310.0683 472.4275]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [428.6073 461.5236 513.9963 472.4275]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+8516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 411.6304 225.3314 422.5343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_28f6854a94a3a7d58034cb1d51ae9c7c) >>
+>> endobj
+8517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.6686 411.6304 337.1212 422.5343]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 373.6924 225.3314 384.5963]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4857c775f03d5b4ff084723eed2b5e31) >>
+>> endobj
+8519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.1471 373.6924 313.5997 384.5963]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8520 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 335.7543 225.3314 346.6583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1daec40615d5a93ce0de360865d93497) >>
+>> endobj
+8521 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.6686 335.7543 330.4957 346.6583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 297.8163 225.3314 308.7202]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bc31d844172a202d43d08e299e26322f) >>
+>> endobj
+8523 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.1471 297.8163 306.9742 308.7202]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 259.8783 225.3314 270.7822]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3eb603756ab7be783cd92410ac7aed7) >>
+>> endobj
+8525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.4565 259.8783 320.0128 270.7822]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+8526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.967 259.8783 427.433 270.7822]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 209.9851 225.3314 220.889]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dca9874a75b5ba09114b8495a23c4edd) >>
+>> endobj
+8528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.9761 209.9851 328.9184 220.889]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+8529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.7072 209.9851 430.1732 220.889]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 160.0919 225.3314 170.9958]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ef3ebc0ed74af80cd3653321153360bd) >>
+>> endobj
+8531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [276.2144 160.0919 296.4683 170.9958]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+8532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.088 160.0919 419.554 170.9958]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 98.2435 225.3314 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2b4e2b95a505c70e40370e121cd179a4) >>
+>> endobj
+8534 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.1044 98.2435 272.7046 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+8535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.6693 98.2435 314.3962 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+8536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.143 98.2435 430.6091 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8509 0 obj <<
+/D [8507 0 R /XYZ 90 757.9346 null]
+>> endobj
+8510 0 obj <<
+/D [8507 0 R /XYZ 90 733.028 null]
+>> endobj
+8289 0 obj <<
+/D [8507 0 R /XYZ 90 691.329 null]
+>> endobj
+8511 0 obj <<
+/D [8507 0 R /XYZ 90 677.171 null]
+>> endobj
+520 0 obj <<
+/D [8507 0 R /XYZ 90 600.0676 null]
+>> endobj
+290 0 obj <<
+/D [8507 0 R /XYZ 90 592.0471 null]
+>> endobj
+8512 0 obj <<
+/D [8507 0 R /XYZ 90 480.0393 null]
+>> endobj
+8506 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F23 2436 0 R /F74 482 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8549 0 obj <<
+/Length 3163      
+/Filter /FlateDecode
+>>
+stream
+x��\ko���_�O��h�Aw�f��nv��
t�Y�4��Z�Jr���rfH�� GQ�(
+�%ݹ<syϹ���d�ᇌ

)��a\�f�3<����zF�'��$4xqyv�Z��AFR9��)=H�0bt9����xB0��o��O�����1����ǻb��^����N��ϟ��������]1���1��kx��~���kB����
|v�?W$�e��%�f<������:�r��ᦾ滬��炙]��rl�y���O���n4aL!!�M FR^�)�;+V�ʐc����Kƨ}��ե��
.Wk�l��}���x4�i��
C��}�c�hy�)s/��ޟ���� ~�
�f��Lr����;���,���N�r� 4Q�G
+��E�(J^F����#ofo����~^�sZ��l�\�IP��~p�D���Ϩ7�"�����(��s�

���
��8&�v��F"�4y3{�(m�p�y
���:��*;�K82X�x�}����
+.�
+q�e̪ȥDB��*==n��tYTS�K�C��b\���n��
+x�+o�~���mޅ7��'�
o��ÃΈ.��B��ʌ��Zc&�U��j�� }��֫]{p!��t
o����[�������h�0@�D�C��cNJ���X8{�RM���C�AŤ"<�鄏g��o�w� ZZR����ĸ�k ]a��b�xU�"��x&�QgiJ3=�P|���~���Ŋ i	�ŊV�~���W���寐��O_��2��9�^�>�›�Z/^��~��ć��V�
�>e�`P
��������#p�*

�v�p����Y$�y^<�
R�Ù�P<"h��#	�B#�9����e�5v�p�9-��ϳ��v���w���!�@x�6�H����Jň
�:�%� �}�~���l�k��
�=0��>�ߡ%DX�O��
�.a
=�cXuFA���!���˫ê~
imW�ej� nHu�:���
+�^��j�(�,[*B��!
4�

��t�.B�e���
�j尘�Uu#\�ªAnƬ_X�}F���qa�Lh����� �� �Qz�8��_F堁-��h`2��UI���D	����$����:��8o�L��������z�8)�{
i�ގ	!	Ac�1M�R��
 br����8L�]�v�ѸO���r{���i���;�/�_ at 2�Ze�;�.��)�8�$=��/�I@�J$�&1��>
C�14.�>���xI�)��aqFm8q���ջ�AE��Ө�KP�*�t�;7HFS{1��l
6A
INE��Qu$���
#�;����
+	�
QN�)�$�($ެ���|*������vʵV=l>M��S[o���b	��﷫��
+L%]&=V:�?�V�-��ڃ��۲�vJ*�)[�,[�B�'��t>'Ct_&�)؁h�Y���)�5�����~�v���[~���M��B��m{E �	�ܻ��
�4�4mdJ_�bЙSP߁p�
-�G������tL�U'�c� ���1��\ .�8I)etf��]ݖAYܮ����(l�1/���eO褝ۺ�B�vpo�ݒq0f

+	������bס�б*���t5�RZ5����*$�?`��m���f�
��
��d���
���*h�NR�2��B%�O���@��XN��Y^���Ef\������}k\Xs�uc�~�w�9-����u
,z�$�[��r�Jn�Ɲ[�t��ľ7g`�@N�?
}���̪5�Ф6��H���9�
���p$��uju{(O�&��`f��!¯�=�f����k��2��V3ۘ����nZ+��u���u�ƛ�|q���j)��N
<���s%�{�U[MB�.bY���ୗ��6�F%�
�jAǂ
ɂ��"l^;�캾�R�� &QR��<JCe���
Lg��m���ʣm�AP���i�VT‚�sӘ�*�*�3�$a݇�
I�u�L�2RM-�
2a����cgV���a{ O�@��
��E��V
,�@W���z�X�vuDk���+t �İ�e����Gݒe5����'
	5T�
�+�<��������}@5�ֽ��'u
+�����fL���J�")I �x�$�i)X<wG0�BuՆ�S
�H0ڛ�3z�X-��V��JSh4h���>��B(��6���L���H�
��[��hX��c8v6w�[ ��֭�*����|���3p�~-�����:
�3��^P�d��UX�[
'�S��i��U�.���_�����T�Z2���_>�͵Ȉ�7���c=��eƭ�=�Ҫ�1�'��Ce70!�
�R^���4���f��.V��
+R˴N��eƥv
+������)=ǞC��"�ߵUK������m͔���c����5_�u��V?�vy����w3]�
��pm��<9��D�*���3�S)p��Rz\G�pؐJ4G�� *��4�
�D{���ÁJ�qT��
�(�g�l(�)29��˦]��O �:d��D"�@%��7�)tx�$�6��}_>���z������$�@�N(��ۭ�
RoA�y���Xʕ�=LGs�r�
{$�Yc��#�)��h�@>�>|�f}|�U�1�
+ey ���姻�̾u�u6[��6
�d�k��4�{V���_Q��<��8��ܙ�y
8<��ip��!�#x� z<ϓH<��k����U��"��$܉��)

 G1����'1>�b�3�b|���b�
�iA���z�L�ӰQ��U�)br����8<Y��*��@n��-�U��w�S8i�xeE"��&g�����<�]�Y���y
+��[冷g
�`-��c��P �8ig2�gv��P~�
����q��"�SS\X�d��U���S��FV[���;�hr'Qz�fT��H� *g��	�o�F��VG���p�G�@��w>1�@d�}�/�'
�7>5R�D��t��4
��	����eM���iT/���Q�rWl�4�������}�Ɇ�uUl� o�U��;�J��7µQ $�R��F�߁�/�WTO)��[~�������>}B�
zX-6[��_l6���ϰ�o�R�7�F-,Q�9��)b
a�q�����p���X�gZQ��m(��I5endstream
+endobj
+8548 0 obj <<
+/Type /Page
+/Contents 8549 0 R
+/Resources 8547 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8487 0 R
+/Annots [ 8551 0 R 8552 0 R 8553 0 R 8554 0 R 8555 0 R 8556 0 R 8558 0 R 8559 0 R 8560 0 R 8561 0 R 8562 0 R 8563 0 R 8565 0 R 8566 0 R 8567 0 R 8569 0 R 8571 0 R 8572 0 R 8574 0 R 8575 0 R 8576 0 R 8577 0 R 8579 0 R 8581 0 R 8583 0 R 8584 0 R 8586 0 R 8587 0 R 8589 0 R 8590 0 R 8592 0 R 8593 0 R 8594 0 R ]
+>> endobj
+8551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 684.0818 225.3314 694.9858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b95eae83384d8c6b41b9ed8f9fd16704) >>
+>> endobj
+8552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.646 684.0818 299.8064 694.9858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+8553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8722 684.0818 430.3382 694.9858]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 621.3874 225.3314 632.2913]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2b3eb71543b3284872781f0b4481fe39) >>
+>> endobj
+8555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.0989 621.3874 345.3673 632.2913]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+8556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.5302 621.3874 513.9963 632.2913]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 570.6481 225.3314 581.552]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3b5db50d397654bd1a8d4067d90f7419) >>
+>> endobj
+8559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.434 570.6481 390.8551 581.552]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.5302 570.6481 513.9963 581.552]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 507.9536 225.3314 518.8576]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8cdc72dfa85aed4e613f780b02e69e92) >>
+>> endobj
+8562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.3332 507.9536 363.7543 518.8576]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.5302 507.9536 513.9963 518.8576]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+8565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 457.2143 225.3314 468.1183]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.0711 457.2143 276.8776 468.1183]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_187bdab1051f58af280af66645ce1fed) >>
+>> endobj
+8567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.2148 457.2143 415.6359 468.1183]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 418.8038 162.6572 429.3341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b3ad0a7ad694f4a7724504544aff49fa) >>
+>> endobj
+8571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 343.3383 190.7379 354.2422]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8572 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 343.3383 261.8505 354.2422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_38a5f3efb1fe599046d2ed48223bfa41) >>
+>> endobj
+8574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 306.6169 190.7379 317.5208]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 306.6169 262.1594 317.5208]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_46f912e8b181561f68062e183005c8bc) >>
+>> endobj
+8576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.2161 293.0626 279.0725 302.9678]
+/Subtype /Link
+/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >>
+>> endobj
+8577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [313.1871 293.0626 391.2318 302.9678]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Affine_Dimension) >>
+>> endobj
+8579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.5227 270.2691 210.3842 280.7994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c2583843b139ce11b842155b35d60332) >>
+>> endobj
+8581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.5227 233.5476 210.3842 244.078]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_294875fd6b469d8949f08c24b5893b6e) >>
+>> endobj
+8583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 196.4526 202.9218 207.3566]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 196.4526 248.5799 207.3566]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1dc5b9db43a16365ba0773a96fe1b799) >>
+>> endobj
+8586 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 159.7312 202.9218 170.6351]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8587 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.42 159.7312 296.1808 170.6351]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2fe458f016db5eeeb95bee46f1800533) >>
+>> endobj
+8589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 123.0098 209.5473 133.9137]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 123.0098 261.8309 133.9137]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6bd361a7c7e187c0ff63c62894e741f8) >>
+>> endobj
+8592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 86.2883 209.5473 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 86.2883 309.4317 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_425f248891aec4ed7800bd92334fd7c1) >>
+>> endobj
+8594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8550 0 obj <<
+/D [8548 0 R /XYZ 90 757.9346 null]
+>> endobj
+8557 0 obj <<
+/D [8548 0 R /XYZ 90 589.7063 null]
+>> endobj
+8564 0 obj <<
+/D [8548 0 R /XYZ 90 476.2726 null]
+>> endobj
+8568 0 obj <<
+/D [8548 0 R /XYZ 90 437.4884 null]
+>> endobj
+8570 0 obj <<
+/D [8548 0 R /XYZ 90 358.3816 null]
+>> endobj
+8573 0 obj <<
+/D [8548 0 R /XYZ 90 323.6826 null]
+>> endobj
+8578 0 obj <<
+/D [8548 0 R /XYZ 90 286.9612 null]
+>> endobj
+8580 0 obj <<
+/D [8548 0 R /XYZ 90 250.2397 null]
+>> endobj
+8582 0 obj <<
+/D [8548 0 R /XYZ 90 213.5183 null]
+>> endobj
+8585 0 obj <<
+/D [8548 0 R /XYZ 90 176.7969 null]
+>> endobj
+8588 0 obj <<
+/D [8548 0 R /XYZ 90 140.0755 null]
+>> endobj
+8591 0 obj <<
+/D [8548 0 R /XYZ 90 103.354 null]
+>> endobj
+8547 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F52 345 0 R /F37 1999 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8600 0 obj <<
+/Length 3576      
+/Filter /FlateDecode
+>>
+stream
+x��\[o�~ϯ��i
lxx�,�>to�v
��M��]��$j}��$'��
JM]�Q��n�]�!�5��4�|�HQb
+l���(C��z2_���
���
�/��Ej��˳��j5q�i�'���-�JM.o~:g�7�`���SF�g����Ô��������ή~(�����_�}9[,��>7�����v�����?_~��[ƒ��@4'���ڢ�Q�E���}1����Ç�^� �I������l���]N
?/���l_��&B��1�
ȆS�U�|,n��ʊռ6���tp)��}s��+
�V	�����3��@3}F!�VM��
%�9>Y�I.�/��������J'�Y8h5�
|��j8��	����y��p�����@Z��_��XH��U%�QK>�fun��UH���{��e�y}[���Ww���`�t_ΧL�߇S7��T����r	ͱ
-MY��A[+kB��N��m+I45����
�Z��Q�-��U���۩0�u���]o����
|h!��0N���
Nt����桒0#84�.����g$���9��hV�s5����:�ƕ�Y&����]8�1E�5�4C���@+W_�W@P��z����5$&
��F�rj�E�ZP���S�����P�L�,̋h�МX���H���{���.�~<�=��"Oa;+W=
�wf�t>	�
+��J���
��
��"��kR[M8�6L}d�0���p_��R��p�~��)Ww���b�T�A��
�^��1��`4[�
�a
+��`3�0�qr���,Jiޜ5(�
+��h�rb��TND�����bN�#�v-��813�D@�vD9�
|'"0z~'e��DC��7�Ec���o@зc��ߍ�D���'Qb�#G��ٯ��܀>7~LCI��y|sRf���3��'�b
\C�)���+R��3 at +R4�H�h4�Ѯ'E��r�� @��i�i�,)
+�:��(*R�����0����l���8�;"�f�
D+$�דN�N_~7�a�&O���!G��ѯ��NP�����ɐ!d��*�.l�P*L���6FH��qi���zы)af�k�<ΰ�9��Շ/wW�r��A� �|Ye/�1B[�̊v������I��N(��G�`�YZ��j09qp*�hY5
�eX��U/���a�)
*`�(������r�^��.
���~�~uR��*�z�R�*Wb('�\�1Tr��3����B��m*=
�/�V�1������aUN�:�+��vכ�0�`���4#
��}H�N�_R�0��9K�I�'>r�ߘ����ߟX��a�_M
������=�#�
:�� �I�3��y ��\b<И�<�8��@>n�i�<�Ž�<������f�Xߕ��>�|��7��Ԇ.���¥ �����\ �Ѻ�YZL� ���
�c
��H*m���
���
g�P�ձ�KUw�C���c\`��R�*hA�TPA���g�Ѕ��U�v׻�Fھ��+~H�&����\㱘��c}3q3�#�"
t0��~aEjK(g��J0�8�D�<��f�٥6�.�#�������c]��W����G+���6<��h�`��+M�M���Ɉ�'#S�1=�����%�N��
+��J�J���@B�2�i�w�c�V*E��'M�R��f�e�5��0}�\�W�Q#�T��x^arH�š�܅�����Bc�YY`k�/� Lq��\4��2q���|܆/Ӱy�l�
×y =���o�}6f�/P���o���~ϐS���h0�
����G��_b>6�Yv�EJ�:g��X�����
��p���p�SLE3��S���F��n�͖w;��F ����^?�n��+�8
���o���NÅ���-,'B�4�'.2��X���v��+Z`l+��f�P�Oϱ�Vx=���9���$f��Әcj9����l����i
RN���7FHh��´�
e<D��~
y�9��Շ��d#�rv���p]Zd/>�C/�;�\+��_��mG���4�E��G���_b��&����q�
گⷡ0�!��WW�r��|.o9kF�U���ag�DAx�	��(�PEӘ�
�8�Q`>nÁi�<	�Ža�<���
[�jm�jv��]����g����F�B�p(#a���ѕ
e��
��h�����0~�ڙm��������V%!�V��h��B��O��  ��T	�@��>rT٘��Qe�z�`�q��Di6F2�W�HJ����/�T�
�u�ʑ��
G"qG��f9�
vG" z~�
y],�^�<��тւ��f"Z!@<?�4�(=Z��f�1�0t���F���`�<D+C%����s#7���)ܘ��pc4��_��V�X�ߞ��ġ��E3��9n��m�1
{��.�v�,5zs,|׫��}*�忋�)4ז!W�Xa���p���ɐR���D{F��(>�~ɏi��E��@8��v�A�é��_�wkk¸ac�,}���4ŭ ���,
24�Ӏ2��h��0���N��as��eB��<�#H#3�}��2!�ڀ��g"Za ��(����b
+#��tQ?�iӇ��qU����*���m<��ܰژ�ê��
�NZ����a>�aհc��A™�����S
�:�j��?�[s#�~
�	eJ��;lY
+1�;|����_�P��V�G#�
�����<�ot�? 9�\ ��A��&��l���
���
���q�x
e���>�\�
r��H��s�Pa�Q[����2�6R��j�6�6�Qq����z
�6�W
��Q팣jcdj#���ej#����@@4j�b�������c��}���&�6��h'Q#3qPy}�/S�L
��Q�L�j���F/q�8�+�Vj9�ű��HO(���S��9B��:-����
+	��X��b���M^c�3�0�NZ�M}d�V4�Mn�&�>_nť��S���ͫ���rh3%*��%KW��Y}	�������2����2��y{�'�B��
l�f��K
��_>n#�Ұ���Ä�ͨ�`�����_�:����
�\{0�"���x�������{�nl�=��w��3^6�2�a���c�d�~����tD{K��H��	(;��G��@�@X�)�w��vP�y�3>�
��;R����LD+
гQ����Or��~�-`��!�&_��W���Nګ���	�`��
�(��3�u���0$:��
���y�կp�
cWǬe�3Q�h���q����
+b;A�%��*�p���2
���<��y����=ͣ���BEO��v�а�s;K���X�W_)�+Є>齥��g���8��	��f`p�_?
\�����^6�	�J-���м{��^@[����ο� $�ϳ��lQ��n�t��*���
���E���	���^��R}��ӟ�w�.�3�7��{~������/߿zz"�
yX��-)��7���
S�̗m\�&n�zXZ闔퇮�m���r���տ��z1M�?��2@�1��endstream
+endobj
+8599 0 obj <<
+/Type /Page
+/Contents 8600 0 R
+/Resources 8598 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8487 0 R
+/Annots [ 8603 0 R 8604 0 R 8605 0 R 8607 0 R 8608 0 R 8609 0 R 8611 0 R 8612 0 R 8613 0 R 8615 0 R 8617 0 R 8619 0 R 8620 0 R 8621 0 R 8623 0 R 8625 0 R 8626 0 R 8627 0 R 8628 0 R 8629 0 R 8630 0 R 8631 0 R 8632 0 R 8633 0 R 8634 0 R 8635 0 R 8636 0 R 8637 0 R 8638 0 R 8639 0 R 8640 0 R 8641 0 R 8642 0 R 8643 0 R 8644 0 R 8645 0 R ]
+>> endobj
+8603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 696.9982 205.6917 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+8604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 696.9982 261.3124 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cc8d0378d1cb13b5ddc04dd12cf18ebe) >>
+>> endobj
+8605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 696.9982 332.1558 707.9021]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 660.1364 205.6917 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+8608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 660.1364 261.3124 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3be7b3a04406453631aef24b817565a5) >>
+>> endobj
+8609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 660.1364 338.7813 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+8611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 623.2746 205.6818 634.1786]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+8612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 623.2746 261.3025 634.1786]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3e2a76d26bef272d0a13fa3bae9a5c2) >>
+>> endobj
+8613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 623.2746 330.4624 634.1786]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+8615 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 586.4129 183.8239 597.3168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ad10819182a33870e4b0a7e3b2bca564) >>
+>> endobj
+8617 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 549.9247 192.2722 560.455]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1190fcf4794305386f8475f9ac51ce00) >>
+>> endobj
+8619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 512.6893 241.9353 523.5933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41c9a9dc63e253ac5ed21cbdad4e2640) >>
+>> endobj
+8620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 464.8687 213.1634 475.7726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db466cb206f1d16d24257a838d130cf2) >>
+>> endobj
+8621 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 464.8687 351.9217 475.7726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 430.373 189.9009 440.9034]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_df7bd95cb0014251d60d1fd82c1d3932) >>
+>> endobj
+8625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 393.5113 193.2289 404.0416]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_fb7b94b681c4d195080fa81ed1480cc2) >>
+>> endobj
+8626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 356.6495 187.6893 367.1798]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e386245235cada70fc797b0747b0d326) >>
+>> endobj
+8627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 356.6495 226.6926 367.1798]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 321.4066 228.8952 332.3106]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99dc4fb442b60dc9c694d7abc853a3dc) >>
+>> endobj
+8629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 321.4066 333.4819 332.3106]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8630 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 286.5374 229.5026 297.4413]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a8128b9910f31bc963842e48c44a863e) >>
+>> endobj
+8631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 286.5374 334.0894 297.4413]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 251.6682 187.2643 262.5721]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a03cd3ea1b11c1c8dbdf462959d79df) >>
+>> endobj
+8633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 251.6682 293.2128 262.5721]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 251.6682 371.1477 262.5721]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 251.6682 455.7274 262.5721]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 193.8849 187.2643 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6d33d9f1d987efe6e333c7ad1993dd5a) >>
+>> endobj
+8637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 193.8849 293.2128 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 193.8849 371.1477 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 193.8849 455.7274 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 181.9297 220.0576 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+8641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 136.1015 186.3482 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b73df10027395d3b2c9fbd3f3e77944e) >>
+>> endobj
+8642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 136.1015 293.7723 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 136.1015 373.3671 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 136.1015 456.8371 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8601 0 obj <<
+/D [8599 0 R /XYZ 90 757.9346 null]
+>> endobj
+8602 0 obj <<
+/D [8599 0 R /XYZ 90 714.099 null]
+>> endobj
+8606 0 obj <<
+/D [8599 0 R /XYZ 90 677.2372 null]
+>> endobj
+8610 0 obj <<
+/D [8599 0 R /XYZ 90 640.3754 null]
+>> endobj
+8614 0 obj <<
+/D [8599 0 R /XYZ 90 603.5137 null]
+>> endobj
+8616 0 obj <<
+/D [8599 0 R /XYZ 90 566.6519 null]
+>> endobj
+8618 0 obj <<
+/D [8599 0 R /XYZ 90 529.7901 null]
+>> endobj
+8622 0 obj <<
+/D [8599 0 R /XYZ 90 447.1002 null]
+>> endobj
+8624 0 obj <<
+/D [8599 0 R /XYZ 90 410.2384 null]
+>> endobj
+8598 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8655 0 obj <<
+/Length 3924      
+/Filter /FlateDecode
+>>
+stream
+x��\Yo��~��Г#qO��"�d`d23�����H�X[r$y
�ק�G��Muѣ�d�K�Ǫ����(����3�
qB�����>��ߝ���%
��}w��[�f�8����ucA
B�R�w�_��..�t�����b{��z}��|s�tS���������髯:��^��>]��V�ju�z{��|_�����շ�E�oN?��O-"��(�" �f���ο�݇7#V� �Iם�g���n�]k�݅�����v���y�K!
Qژ�%D�)ŚS�T�Use�z�%��*ݙB�_Ͼy��+
�V	����+���6}F!�V�
�
%�9>�;�\�_n�ޞ�#�����N��fO�rm��$V��c(F%aFph
�V24	��H1C4�v`���Ź^�0��,6���Q�_��e������6s
15L؁[h��ü�	�x�@f�3����]��*cap~��;��:�5��SE���n?t��)8gj 
����4~���b{����nWo�
lj1�
�
�Qp�h�_
+��Ss p!���C��[���#�.��F:6��Wpw(_��:�;�p"
��xF�h�-
t��z}}��"!A�,�
��GH�v'EB*��E"�0��F#��� �
j�5\�
�5���3?�e�cZ�1�� �嘤����������4����v��l�:��F
h
�R�B�s�u�����7�z����7�0^���l�
��F�0��>�J�P�p9�Nl�ai��K-[Յ̬%?�j���a��u��Dx���e����jA�Qh!N�S_Õ�T�+���7�ۧ�'8�ЬgKK��}� �[��D���zw��˒z�:]o�-�:�On�
m�)֝_y�����a���
��T��]w���<v׿
�~�u������_��}6�
o꥗��C�%�S�P�

��9�Ůj�����P���@/n�~\�>tG��?�����~|���M�y5r%L1��8G�l4��[�Pu�d�9[t���uw���V�x������1�WV2#�B�>�8P&�� C��`��C�vu_�v��T�C�P�ux�@f�iy��~Q���
+G4@��{���.N�A?Z�5��sSC��ܮ��ڷ��]�%e��++�q	(���E[���伥8qƹ��Vd���z����F�V$2M�u�K\��C�
�f��z�یf���k�>Kz�؆���r�m�p�V��C��@����3�4B W��PX�	��d}�����1}�a��FK�Z���k춬���)�Z&���
v�m�܃�
Z�8aʰr
+!��hi� �G�V2"��Sc�����z�c0D.�%�BB	L��3t�\I�O���FIg{���
+��$�����
+�������:���W�YHa�BQv��&l���S�U�kT��9SݔxSss�.ɸHk�Q-v���A����
+���XYE��$g��b
,�1���mQ�S��!���
��C�_S�-c�e�(̫p[�0ܠ�S�F��2mO��FAh��亩�~��]Zx�Rg�R?;�q����nd$�[�����
+���7�g_���q�^
�뎔;pK�G,8G�c>PB�!G֌B
0����%\��������Lq�]�v~�Ԉ�br�Su�
~k0�>��{8c�~��,��O݇ͪ�~j�lbޘ
]��lԍ�s�e�$��('֡�r@���C�Rrz����^U"��5�z5&,�)��-�JG
�z
+������E�
�Jb4�R ��SC��iЏ�vB�5�������v~��E���{@�gc�3
�]�/]=&2��`T�48�L��GyNY�v��o���
Π�P֓�+��H��;�ˑ�ft3�XN���he#
x��凙R[?_h�`��Y��v\�����'�B"��L�V>뮫��zSR$h�FZ$ �p���-bp#���V�+��$�1�ݲ6	�Av8+!��:?�nR�<)�0��$}�l���yZ?gk
�RiC���J��m�¶U�i(
u��^�)���<��yy��3��W��+2X���^�b��x%���W�Df7*�>l��G�$#�R[C@!
� �Zk��dp�US���n'Yǂ`��
����¼;��"�~��P�,���'iVd��Y=,���d�?�9�^Ģ�
�u
J�0�!@���*�@m�k��,�f`�^�
z����*q��U�z�^!$2���ֱN+�(��	(�
�~�
ވ��e1Tة!	x�Ff��\�oё�
�
��
B%�I}c�%��
+��:X(hV:Ze
(#�nd�Y����
�c��5
J~&�u� �5+2XҬ��^�b��f%��hV�Df7��FV"��+��q(��߾g`84���"KBoVvj$
���M�����n_��m
�2�1�ۣ��T$%��+���D��V
c%��a��Qۅ���-~�^�
�7
�;cx&�����l%_~�(�
pl�`��EKbV�ۋY����1+���
+�\��R�t�
��B�pi�vR>��+0E�q|jL
��ٝ&k�*2:٦������%$pY����n�Sd-�Q��
�Ud%񂚮�z�k��4����}����(6�
0T�b�5C�vj��E�,u=A��ݾ4�V�曧�mU�Ӕ V�@���B�@-Gg>^�r����S#�(���iZ�;��ΰ��(���u���Ɓj��0;E�"%�Qi}�L%�˔��g)��Y��L&[�U�%:�#�
������Rd��Je��*�nqUJ\OQ�2��n��a7�M_CN)�!�
+~���y�4�Ƿ7 at j�TN�D�c42��B�15��j����XBB0�8��)��%"F�A��'�c%9�a�0^���
cmD
�G?=��c�S����ѯ�3�^~�ȹVR`���'([�D�-��-v�+[�z���IdvK{%r�P�@���A?�� �����0S#����4��k�֊r(
+!!��2kpWP��O7h{��1�Q�
6e�Dq�cd=E���w�/Fr
+ɋ��=O=�f����!~;5Kܢj����f�����QA�
�*$(���u�vЎқ1:z�V���<� �;M͸�&aU9
���
6LΘ�o�a'mP�m�,���?�,�ۑ}�y����2����?>�*c�%(6�
0\�"�%
+��u,v��X�z���Idv=��u�����!1�Q�{�w��a�Gd���uXhTS��QC���?/cs�l���|+���V�r
+!�l�7*k�	ͲjIcXu�(3�QR�
�Jz�	���re�
+�F)5`X�U

���m���^��u�Z��~�Q�C!y�b�.
+a��S����&ӵ3��LE�C�~����Z�i��ڧ����Ux:jl9�f�D���؛H�&̿(%�UE(9_�v��u��'8i=0z�=��%�
+��>	�%R�[N�}���A?�f
�9��R�)��sN��9��)9�L"�;9�cp�9e�!�$�?:���:F��(<B#��%����jd%[C�/u9��0 ~JX��7W﫫�T�r.��H�'��F)��4)i�s�&�O��

���ct2�s�b�̥�]�¯*�*��ű����GGN�ZM$Y�MF>�I2RR7ɨ�-��j���g����x᧐��^���VF%�ʾu^�/���٤�$i�#� '����'�9-��9�90����抿���љrD)1��(tm������ڼ�W[b�c�jh⌰�k|{��>R݋E����;|ۯ݋|�/?��.��w#��E������T�m��?Uz����BD��`t��y8�@3�/���
�m��!~N�;�2:�}
+�D����~��������#Y��ú�ߒz�����U�rJ��v
w�2�2.I�%�D��y�\�7�6Pw�mxE �x��P֎��?�
+��endstream
+endobj
+8654 0 obj <<
+/Type /Page
+/Contents 8655 0 R
+/Resources 8653 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8695 0 R
+/Annots [ 8657 0 R 8658 0 R 8659 0 R 8660 0 R 8661 0 R 8662 0 R 8663 0 R 8664 0 R 8665 0 R 8667 0 R 8668 0 R 8669 0 R 8670 0 R 8671 0 R 8672 0 R 8673 0 R 8674 0 R 8675 0 R 8676 0 R 8677 0 R 8678 0 R 8679 0 R 8680 0 R 8681 0 R 8682 0 R 8683 0 R 8684 0 R 8685 0 R 8686 0 R 8687 0 R 8688 0 R 8689 0 R 8690 0 R 8691 0 R 8692 0 R 8693 0 R 8694 0 R ]
+>> endobj
+8657 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 719.9123 186.3482 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_5358c9f367ad37e650d411ab5e558e50) >>
+>> endobj
+8658 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 719.9123 293.7723 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8659 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 719.9123 373.3671 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 719.9123 456.8371 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+8661 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 707.9571 218.4038 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+8662 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 662.5618 180.4964 673.4658]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_888509fe116790d0b9a267e614be10ec) >>
+>> endobj
+8663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 662.5618 319.2547 673.4658]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8664 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 628.1255 213.1533 639.0294]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_78e60691cfc6b6b52a34cc7952380a84) >>
+>> endobj
+8665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 628.1255 351.9116 639.0294]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 583.1039 161.6774 593.6342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41d30675a3c28980af0f087b06a1f4c1) >>
+>> endobj
+8668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 500.1145 205.7516 510.6448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ffd7d0678df82882b006ea7b02771f98) >>
+>> endobj
+8669 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 500.1145 276.595 510.6448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 465.6781 236.7449 476.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c6434b8a020aeda5828830fd4b639277) >>
+>> endobj
+8671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 465.6781 307.5883 476.2085]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+8672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 430.8682 212.377 441.7721]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3a8f10409a9fd73afb6691686d6862c) >>
+>> endobj
+8673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 430.8682 289.8459 441.7721]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+8674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 396.4319 243.3704 407.3358]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_201ee4c814267695f31b30be833917bf) >>
+>> endobj
+8675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 396.4319 320.8393 407.3358]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+8676 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 361.9955 216.2524 372.8994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1d52cb88936eb0f5bde559b39f8ec42c) >>
+>> endobj
+8677 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 361.9955 328.0421 372.8994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8678 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 327.5592 247.2458 338.4631]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_faf0bc4f0e0a036dbc3852b3e4490243) >>
+>> endobj
+8679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 327.5592 359.0355 338.4631]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8680 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 293.1228 254.8275 304.0268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ea7119974f9313e4c93908a2955c4186) >>
+>> endobj
+8681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 293.1228 343.0957 304.0268]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+8682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 258.6865 209.6269 269.5904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0c2c96efcf10102068f754c608a12427) >>
+>> endobj
+8683 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 258.6865 314.7912 269.5904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 224.2502 240.6203 235.1541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a031a8e65176b8bd80d2857bd9a68b6) >>
+>> endobj
+8685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 224.2502 345.7846 235.1541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8686 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 189.8138 248.202 200.7178]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_afc9294d3fb5f2c0fd8d4e4d22c283b6) >>
+>> endobj
+8687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.0176 189.8138 329.8447 200.7178]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+8688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 155.7511 193.5774 166.2814]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7ea45b608af772cd69e2c23d7d62a3cf) >>
+>> endobj
+8689 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 155.7511 232.5806 166.2814]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 142.9657 248.8445 152.871]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8691 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 110.3558 193.5774 120.8862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3ad1db1c5141d2815c0d849d12548e4c) >>
+>> endobj
+8692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 110.3558 277.6909 120.8862]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+8693 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 97.5705 252.6774 107.4757]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8656 0 obj <<
+/D [8654 0 R /XYZ 90 757.9346 null]
+>> endobj
+8666 0 obj <<
+/D [8654 0 R /XYZ 90 599.6146 null]
+>> endobj
+8653 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8713 0 obj <<
+/Length 5180      
+/Filter /FlateDecode
+>>
+stream
+x��]ko#9v��_�O
�b��h$�}�� ��N��,
�]n
�%G�����soU�"�Ud�-�v4а�ˣKֽ��%���
]e�R�n
/��3��_.�����Ā�x��Z�
q���ǻ΂�r�Vo�r��a�����\����]qz�{�z������|گ�_?| �����������M{{������
�8^��������An�5'�6��="��(�" ~�~s�pE/LJ���*qN��=�X��ۇ��Л�x��e���>���U#�!J�j�N)ֽ�����>Y��遒ZB�
L
+������Ε�P�z��/��W���n��7[��/(a�����¿x����߃
��҉�nzM+?Ib5����Z�y�#�:����vĨ$���q�%?
*�c_3C4`������C���d�
��v�����f����6kZ"��6��
0��$<�F"��,6�c�?�7��n{
co�y;&�9'R[Y�E at Uhp.a쎝�#U�f�=
��#�Y��_���E8�T�A#�&4#���	�
+!��� N	��
+�aS�S
�V�9"�y�sń"�r5�����+
���G
�'-��)��O�@�q7>ʢ7
+K�rvB?R*��g"�$�B<�1��͡�$
8�ES@m�����i�m��/���n,c��s����=�P
+qv~���
��v�
��V&x��w�����7��f��R�@:�d=�d9�ư�@�4[
�i�
i�DfY<?=���O����l
�D)�ˮ�
+

J�
�(�QC�]���� �"�Te�T��ЎX��)�Z
ՠO�����F)�z��6�����
���n�b��������!�y�����z���~%�e{��q��~
%�C!�*A,$��P,Pie-�zX=�FK!�ܮ�q��v���p˝b�f����dv������Ÿ��:�1\�p2Z�}PJ
��A��}1{�"�j��3_����űWR�AP��PB�j��)�Z�X�W�ޓ�R�
P�����3%�Yf���O�ל���҄XxF*3��H�ˁ�X5x�x��z:��$�6���?��o�
{@O:�b8v2Q���mQ�u�y���
�����I�7Z�
p^��3x�Ŝ7�I+�
+������&����w��y�mo���
|�}W
�
YJ��>Yޭ�M9O�)4UH�Ԃ>So�&�3D:^K�VM���B���;�ɤ�je�6��2����"����W�w�
g��	c\��P"�Yx>���^�M�R)9_ꏀ�������D�\7Ԗ�PB�%�A�&�*	RY6k^� #��Q�Fe�~z�_Iu��y�N�sҨ~h�
��
ajs��G=�8����x)�[����l�28gh���\͉uJ�b���cnd�s����7;s����QӅ�;�k$2�]�w!�߶�0~?�Ỵth�+�‚��f�ߨ
 ���:��-�C�W��"���b�A�ݬ?=�.�
�1f��
<�F :�R˳���JR`�f�r�D3J-����Hev�ԟ7�v�����O���.��€^�28�BB��Ԍǻ�X~�}��]�����q��
>t^�nzQΥ#�a��/D���v�C n����v}���!�
:
G'&�r�,àk_��"���aI�V��?��g�pE��h�#�9
�Fޘ�
_���!vA��cW��!���g�/'���rQ�&�j�
��R��|�N�(%�Z�K|
u6�]����y;���G�
]���)
+\��<��}@N4�
Q&�
+Eiˉ��~�h;U�>
u�!H��S{����i�O_�J?I�s�\o��kd��V��{J�@%i�'85o�_((*+yM�xX]�DK��ܮ�/q����@8���
��(��f�RԴ~��o
SeWT�g�(u��~���`���_e0�[�/���m�
U#�����Cs��~�b�q��+
_#��]�_�Ƀ��와����Cn\Jb�_�7K�
n���
+�EZ
+RI����FA�XZ������δ��%���� ���(�_���\���RgE��~ڷ�cM@՘G�t2e6=� H'��
��麿�*�.�:�� u�EQ�@�<0��:�k��H�$-OH
\��P��]��%R���RG*
6�}s�#!�[S���҉��N��A��m��ƥ����[���c�H�s�m�������
�k��eT��C�L����^�;�	��j�7����j]��3�T��{P�uu�r<
N2g,&(*3+:!��42��^�n��������-�@�c�<�Ҿ�ܕv��}8|}��<'�e����BWx�Jfu��S�+
~P]�\@�8��S��}Mֽ�r�D������-�QRn
�*7�攛!�(s� ����Zh5J8	=#]�"T+un"_6�����;�vK����
��Ll�z�s���+ݔ��G�-n8���e���H~R���G����D+�í	���s��aD1@)՟����M�<m�
O QZ�� ����n��r�0L��\1�.��`P�'�\B�g�ũ�X�%�[���W��~:pt�X��X'� 
+�ę�Ez�	&��f礄a�4%W0�wհ�I�'!`ȸ���Ӟ�~"
�>O���a�qʥ��
dc�ΤQ��<,�
a�3Y�P�W�
f{��-
+f�9a���O@,�P ��s��
(��|G/ୁ��Ax�=�
��o�x3��O"RK�DUyA�+�)��8�*D3[]'c�)Ĵ���
�p3��
+!��%Bl�P#T�
�@��l���x��������
�ٹQ�`�:[�L at UHq��Z>ꑩr��E��%�
�v�C'�)�
���P�s71:��H2����5&��u���p�茀�P�
�P#
+�x0Z�g  9-tI���dv��a�q��
+
͸��tuWrI��g���a�5<A
�o��
{���F����Ґ�cwz��9�ܤ������,�عm��%;/���@:I��,�֐�f�qx�
���Q�͇��tTnwV� �T� ��1�qQ
pM@�T�Zâė)�W��,�hYRj at T�w�7�8k�l��@�K�JEi��4�/6��&��QӬ��/(6�Pl�0��B@!�]��@�h���
+�w��(��rM�+寘�3u���)��0ڍu�n�?�h~����K�~�[xGm�p�7�&T{fw������/3Zinj�©'�U�
+,	�����h�Y[P~�
�~��Z�(^-?<�^~DK�G�]_~�͖�bP��/i�����Hdv_�Nap�薀�0�J`>1���o�]�_昀����.ۆ ��Qv�U(���h��{�?䵇U�2�]ꅀ�Q��.�=�"LB�,:!�*�UL��{1�P{@�2]{�Nj:\��m ��&�
Z�Z4*8��*�L��z at U8p�՘5)�w��CQ�sg0׼���FA���\���B?�iCaҋ;l�������*N��y
k
A*���ѭ-�[&�>�NJA���6�H{|��r��M��h��ޗ����Xk<(':ZY0D8��	Q�~SR��M
��� ��_UH�g�{X��-���n�
+C�P
bA�YY-���P���X�}��c�,`��'�A
*	��[M��Ւ���
S�cc�眔��6
7%�-�
�
+���a�����
cָ.U��,���86Xƕv�
�4;/�1w@�6]��F"���y�n�X�3U!Ż�f�
2	�#JK��5_c��]�C�rfˮ�
+	�
�	t4J&�1^NȅRK��
+��%���`e/T��0p�L)xq<̃�K �y�i��
��l�'�/��j�7������2�̻+
��Nv{Հ���
BS����f<u�^wOSl���=,=
&��L9ޜ�_wLq��f!t7Yn��r���d9�a��|z��nH�3���7�&��2+G
8�=<��[���;`6���E���$\q�5�SM����%TKZ��&�_�^"����_$����my����贶ݭ~Z�
B�o�7Lmq�=��ƻH��#�و
P���%je��o�%���LT��2��j:2XR��v����-M3;����4s������w�ᑑES�x5��-�$�*l�Ľ�l�fr{K7#��B|���n}C<.�rY�� �5o���Et�OZ:��İŭf
}�R��E*o�cԖ��A
+��%��'�=|�
mܘuNؙ��9�
/f��3�xaN("De�K
+�x	��wϙ��f�^��	����򱍂��t\���� ��L<+�
��Z
�zk�;7�a
+\��׋a{���^����\a�p�W�)�e���H�ڜ!;�8��ɥ{�%�
�+$nC�m����OP�;}������0(��=�B� W��Aw�rO�7��6'>ghrUZ�oS
������H���@
1<
��>�ɵV<�pju�GB�`0
-���ة�p�ዺ/l��z�}�8�.��fa���i��/�e4/ݙ�Q����J-��w��7<dY�ǰy�4[>���MWα�:���t���=�,����B7�PI��7&ϲj1f�K��`lw�qVG@
UF@�8����Ȉ�;`f��+��Xꕀ����.����C�R�L at UHH��ŹQ�L(�Y����='_a�٭+x�X�
�ՈV|+)x��<
ڴ�u
+>�QR�
�N���d<�s��oM������u!��d�[�&��x2
xt��rf2

��v`a2~�Wz+��yd3����y�p�.��&�rz�c��QG�@��o+�ǹeH]A�6���dۜ���ihD��R^� ���U)ߟ
��!j���<�
6��H�3���^8d</�m�#MI�èq�0�4n�9D�7��6'D}h�-������
����"�ALI�j��{TU�G�
+���� ��6�7�'�.����`l�?��^CD|:��Վ�9
���L���L)�E
+
*��!�+
�V_�R
o�UE�P�

2�\������OJM�נ`�i�_���W�b�b��|5~9�
�)Փ@�����@�(�K�5����R��qh�w����o���zXhű��j��븀*�M���-���N�Yo_e���������q�5�����9��>rf?��������/_���y�n��ds|����>�r(q8U�&�2.����%��������Z��}�rB�e�=��Jg����endstream
+endobj
+8712 0 obj <<
+/Type /Page
+/Contents 8713 0 R
+/Resources 8711 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8695 0 R
+/Annots [ 8715 0 R 8716 0 R 8717 0 R 8718 0 R 8719 0 R 8720 0 R 8721 0 R 8722 0 R 8723 0 R 8724 0 R 8725 0 R 8726 0 R 8727 0 R 8728 0 R 8729 0 R 8730 0 R 8731 0 R 8732 0 R 8733 0 R 8734 0 R 8735 0 R 8736 0 R 8737 0 R 8738 0 R 8739 0 R 8740 0 R 8741 0 R 8742 0 R 8743 0 R 8744 0 R 8745 0 R 8746 0 R 8747 0 R 8748 0 R 8749 0 R 8750 0 R 8751 0 R 8752 0 R 8753 0 R 8754 0 R 8755 0 R 8756 0 R 8757 0 R 8758 0 R 8759 0 R 8760 0 R 8761 0 R 8762 0 R 8763 0 R 8764 0 R 8765 0 R 8766 0 R 8767 0 R 8768  [...]
+>> endobj
+8715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 709.0894 223.4647 719.9934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_676b331ee61606b74be4cd1f90756839) >>
+>> endobj
+8716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 709.0894 362.2229 719.9934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8717 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 674.4924 229.5525 685.3963]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0ea21bf85aa2e90c449435cfedcef181) >>
+>> endobj
+8718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 674.4924 368.3107 685.3963]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 639.8953 266.6729 650.7992]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db0fa15c5f30fc4be6a94ce2606208ef) >>
+>> endobj
+8720 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0101 639.8953 405.4312 650.7992]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8721 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 594.3393 217.1088 605.2432]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_15b21e990e26976e615a7d3244ed843e) >>
+>> endobj
+8722 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 594.3393 355.867 605.2432]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8723 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 559.7422 201.7419 570.6461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8b2ee24610cb804238f33581093948c1) >>
+>> endobj
+8724 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 559.7422 243.6294 570.6461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8725 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 559.7422 371.3288 570.6461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.4576 535.2949 271.3786 545.2001]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+8727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 502.231 212.7678 513.135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7999968db9fb568980215d2c84393358) >>
+>> endobj
+8728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 502.231 252.9591 513.135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 502.231 375.1455 513.135]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4006 477.7837 277.9276 487.689]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+8731 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 444.7199 250.0993 455.6238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bb5709426ac80aa0bcf907b4f1d4a577) >>
+>> endobj
+8732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 444.7199 289.4458 455.6238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 444.7199 379.5123 455.6238]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 444.7199 513.9963 455.6238]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8735 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.3043 419.0636 439.3345 431.2286]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8736 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [363.591 409.3137 459.5053 419.2189]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+8737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 387.2087 266.586 398.1127]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c7b41dba5d22086cb9715c3f51248f98) >>
+>> endobj
+8738 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 387.2087 309.697 398.1127]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 387.2087 408.2337 398.1127]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 387.2087 513.9963 398.1127]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 375.2536 171.3608 386.1575]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.2371 362.7614 480.8696 373.7175]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [427.1251 350.5935 513.9963 362.1741]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+8744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.268 341.1037 155.212 350.7489]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+8745 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 318.7387 250.7476 329.6426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_97cc0d02a88d52e79cbb6615a3bbab42) >>
+>> endobj
+8746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 318.7387 357.3173 329.6426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 318.7387 456.1447 329.6426]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 306.7835 202.3443 317.6874]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0047 294.2914 446.0713 305.2474]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [342.5471 283.3325 438.4615 293.2377]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+8751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.0173 261.2275 265.396 272.1315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2c47f2f619b1d0f322b742891920735f) >>
+>> endobj
+8752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.5684 261.2275 375.818 272.1315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2392 261.2275 478.9794 272.1315]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+8754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 249.2724 225.8659 260.1763]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8755 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2222 236.7802 466.6702 247.7362]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+8756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.3705 225.8213 462.2848 235.7266]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+8757 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 203.7164 239.9836 214.6203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e274e65fc3f012ab21bcffa3177228c5) >>
+>> endobj
+8758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 203.7164 280.8203 214.6203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8759 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 203.7164 405.1043 214.6203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8760 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 203.7164 513.9963 214.6203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8761 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 191.7612 171.3608 202.6651]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 178.0601 432.0923 191.2181]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+8763 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 145.0024 251.209 155.9063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_732e7355673aa63a2fc22a470a36f707) >>
+>> endobj
+8764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 145.0024 290.549 155.9063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 145.0024 409.9686 155.9063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 145.0024 513.9963 155.9063]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8767 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 133.0472 171.3608 143.9511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+8768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 119.346 456.9923 132.5041]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+8769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 86.2883 224.5705 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_77a2a8e38120a21ac0d5f19eb6e1668b) >>
+>> endobj
+8770 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 86.2883 363.3288 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8714 0 obj <<
+/D [8712 0 R /XYZ 90 757.9346 null]
+>> endobj
+8711 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8787 0 obj <<
+/Length 3919      
+/Filter /FlateDecode
+>>
+stream
+x��\m�۸���¸�
�2|	�m�9�zW�I�\���fճ-��f���
J"��dR'�"H�G3���2�a�CfϔP�0.g���}����"�����u��������d$�������B�ޯ���Y\���͂�yq��7
�����\����͡8<�z�NU��<.ߖ��U�^�9,��������w/_(�
+��Yu�o�I#�<����
+<��v/ގH�
�Mw��R��)��V�����r����^7�fL!!��]�7����my[6wV�V-�c����HƤ������s�BX
f��﫟��5��+
n�b� o0"�����S��l��]��˱_���6ff jRxő�p��0$���zLaQMA�� )�/��4�Q�ƍ
�(9�y���?
�Շ�u(��S���B���9��.H* q$1��Ŝ�c��, �L�Ae���`j^
�7'�^�����U��ߟ�݇θ��%�)ܒ��7�~s��Aކ���G
�6�V������
+���3�i��i�qFu���<=��n4<Q">wt��zDi�Zy
"S��@8#�&�ߕ]��ͱ�;�KsM���g\9�����	Fҁt����#�
��j	%H2XB��I ���
��2e
+
�P������Y
	�($�
��
-J��P�P�C��R		��j?6	�ZTs
�U�
4
�3b �4�����U�Y�6���P.��:�vQ�m
+2i�xT�
+% �n�P���#��@�Z�,uI2	D$r�Cũr��T�����JI쪆���0�ڦ	U�a�&�,����~RI�^�L?�4e$3��&�$���P���K̽��n�:�3/�;a�-�K�&<T�r���F,�r����CEB��a�����4��)�{�'���36�Z��A;R��2=�E�
��'=�Aikp#,2���B�yW���lPʮP�a�.��7�J"

򻉾������4���ay�2R��`�-��E2h��dx�ɖ܂"���_���U�>Q@��R�m?[BJC����`�P)E��� �!*q�r<M�0����`
�Ď&�$7�Kt��
fo�r{��&,��w�SU��uWt���x�^������o����W�����	R ���S��y�/V�rכ'`������y�ò�+��g���.uEj��+V=!ye��mf�z�<Z�/�.`�%L��
ֶۨ��n�E��,��l����VJL���g���Z
�����p%-40�&ixT�&a-Dto at n�F(�!l�%&���0
�d���8B����.EnG���9�zc���}h�|3�ڗO��}o��yь�c�<lJ�w����.cY�K�gj<����gNtSNko0Y��
���
j���v�Fr��`yj
��1��Qc�6O���)Ԙ6b 7I��C��rX�R
-����@����K�z�%G���r�O<>kA_�r4�:e:���X�$���؂
9r;ܩ��
)rt�ߐ
�u�}��O_f���c��xGPP��&G`�'�@`���z
��j���B`i#r��z�*N����N��/�2�
+��X�F�(�
��� �E�Dgx|Ό����(�z�ܴ_<*c�
qB��xL3�,)�EL�H1��ōml#�#
+� j(z�����} p���#�t1f~,!�������VؙbMI(�?��-���`�WO�����fUz��5[���G�E�%2#��}!�3�mX���K�:��PL���������W�r��G������Y㠵��&�n�1*��v|;���F��`3n4�J暓

^0�39����?E�mB	`��
4�0����!=
{Sͣ2vq��0"��
R��h�蕘���0�;tL{<�v�c�X��P��MDU SjX�s�� J���C]��6HK���&�Z�u��H��N�Ce��@\��H+�J�Pg���N(8��Z嶶s���
,���!"�Hză������C*��p��а��K�i>��
}�ֆ�J,Uq�)��w��`
+�pz\8L� �
RB�Ȁ�zyS.�ج����I�˶0B�����3P�f_�[�@��[�
�媲9�-q�+��ÂCB���{撆s���)}�g.i8��Z������L�KZ��Pm�`"�S&m�@���U��C�j4C��h�=
���j��VIqX�z3� f����ZЗ;�7�8��.p��~��j�ߕ
*�OqH�
�g��E�PF�e
l�2�Ė$�v0��C^���B!;F���NM�v8�K]�=�T��
��[�k,)>�=;F�y
�h�2p�Hi/ma��ɏ��VLC
͑��e�/� �1�
+벀�"������Lx��Z�G�#�P�j�6!����./M���g
��{H0:�
y
n#̈vNJ'�12�UjzY^� mk���>O�v�����t���@9|K��mx*�;������'����1C/:
�HP��u�U��[a�
+h��>�}��j����O'3��$�(��<�\o��
ʵ��o��t����XB�KD2�
�1d(-���`_�@dL#�1�qd
8�!3
�����<�D��pMڈ�\kES��go��z�3d
�GOt�%
���*Ґ6{�+
+�M�F��j�e����T�m�̽w��r�F5j0
,�.8�=|(B"m�EMt��g,ʝP+��=i�t�G�,� �#�޲#i��$�2R�����_[�BU3�s	1�LOݹ\���<���v2����5��]��F�׊"%������(�+3"_��$��8�}�6S����
LxZ�#�Pm��#�S<m�@���ެ��"3�7;�S��!�L3!����C	�M�������;��t�:7�
��X�`h��d�]��\��$�����2��Ml�r��	5Zv��zn�-��&�$�S
s�.:��Hp��Y�^/�}:q380�8LR���D���9�k-H����ڍ�7P������7U%a~�s�������b�\��5窫��l�]Y�w�?j}�4�
7Me&넰D��l�I���Hd�B�s��E�e8Xlfx�롐jC��
M�@�%
�Q�R.�41}�3O�Q��2�d�H��������p�4����B9M���Y��`��t����P١�K�Gi��
uf��H��(mA_�5����$�~�/����[w��b[����#�X[�S{t~�];xFy_���&���$]�Aik����ɜ�"։����PFbN{�5�݃�
��/����Nwm�ڷ;�O?�KV�S���8>�!�F\�f�=���X� .v�)�^�u]��Q��T�r��;���'V-�/��/�?���=,ϼ�����:�
Ն��+���?�R
WU�\�o�#�x�b�����s׉Y�y_Y:ֆ��GXʣ��hR�G�z�GC�_ʣ���ի
+���a�8N�2C1Q9/���
,���'/��:/�j'{y�Uӈ�a�����!k���&lK9����L�}rfZ�sf����7㎤��h�n�b=�4��E
:���p=�V��o���~!,�V˻5���
��q���m�r[
����h�b�
��j�N���*k'D1c7H�q����Tl����ny��5�㇦
�
�t8=*cöMEh/�&���#ny钲1��*
��Q>�v�fQ�®o��j�9��o��}�Z��+wN��q�8�&���"@
�6�����s�ԖCZ�w�0�	"ۓ3��sl����"L='�QLw��'
�;���.>L�-���'�ڷ���o~<���-���&T��w!��=^wxڨS��PR�֮M�nO��l+A�7��R��3��o�cs�upE�MS�-���;���^�|xx@�#��U��N/�����i{NM�خ�a�4�%r?�I�ud˭;a�O�p�<m2�����?��
+�endstream
+endobj
+8786 0 obj <<
+/Type /Page
+/Contents 8787 0 R
+/Resources 8785 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8695 0 R
+/Annots [ 8789 0 R 8790 0 R 8792 0 R 8793 0 R 8794 0 R 8795 0 R 8796 0 R 8797 0 R 8798 0 R 8799 0 R 8800 0 R 8801 0 R 8802 0 R 8803 0 R 8804 0 R 8805 0 R 8806 0 R 8807 0 R 8808 0 R 8809 0 R 8810 0 R 8811 0 R 8812 0 R 8813 0 R 8814 0 R 8815 0 R 8817 0 R 8819 0 R 8820 0 R 8826 0 R 8827 0 R 8828 0 R ]
+>> endobj
+8789 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.2697 720.2355 344.5966 730.1407]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+8790 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [463.2004 720.2355 506.5273 730.1407]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Time_Elapse) >>
+>> endobj
+8792 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 698.0605 255.5641 708.9644]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_940db627ef73d29e63fed31acc7553f7) >>
+>> endobj
+8793 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 661.4629 214.0604 672.3668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99247c74022e8d51cd0a2d93a87bcfe5) >>
+>> endobj
+8794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3976 661.4629 352.8186 672.3668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 588.6422 289.8656 599.5461]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2f90e70dbef264e99b7015c0ce7e16fd) >>
+>> endobj
+8796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 588.6422 359.3244 599.5461]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 553.905 290.9713 564.8089]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_19a2fb28254bc142e01f3ee00c27ea89) >>
+>> endobj
+8798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 553.905 360.4301 564.8089]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 519.1679 224.0028 530.0718]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c5ec610fb42e16beaac59b537a71f187) >>
+>> endobj
+8800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 519.1679 362.7611 530.0718]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.582 495.6468 443.1674 505.552]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+8802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.2012 495.6468 513.9963 505.552]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Concatenate) >>
+>> endobj
+8803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.268 486.4139 161.6856 494.5931]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Concatenate) >>
+>> endobj
+8804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 462.5129 254.1498 473.4168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4c7c04e76c758c53feeb8c5cf58638a6) >>
+>> endobj
+8805 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 462.5129 338.2632 473.4168]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+8806 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 427.7757 284.5854 438.6797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dfe66b5a34b84fcf63d1a48777f68e4d) >>
+>> endobj
+8807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 427.7757 354.0443 438.6797]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 370.1245 241.7263 381.0284]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1ae424886d05361c1a78c89dbdd5b7db) >>
+>> endobj
+8809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.6171 357.5624 407.6577 367.4676]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+8810 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 335.3874 249.3181 346.2913]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a1f9b31c3ed7dc3e7691b9110ddbedb) >>
+>> endobj
+8811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 335.3874 288.3213 346.2913]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8812 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 335.3874 371.5186 346.2913]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 300.6502 240.6204 311.5541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_966dadd4ba398fb77b77584e5af698af) >>
+>> endobj
+8814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 300.6502 324.7339 311.5541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+8815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 300.6502 425.7242 311.5541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+8817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 227.8295 244.2646 238.7334]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cbcc65a843515d547f055b687d1e6d5f) >>
+>> endobj
+8819 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 191.2319 167.4656 202.1358]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_9bd884fea397d9d6cde6426e6f47cc4e) >>
+>> endobj
+8820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 191.2319 282.7023 202.1358]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8826 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 111.0629 202.9022 121.9668]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+8827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 111.0629 300.0368 121.9668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dea57326388915780370a677453778b3) >>
+>> endobj
+8828 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8788 0 obj <<
+/D [8786 0 R /XYZ 90 757.9346 null]
+>> endobj
+8791 0 obj <<
+/D [8786 0 R /XYZ 90 715.0952 null]
+>> endobj
+8816 0 obj <<
+/D [8786 0 R /XYZ 90 244.7447 null]
+>> endobj
+8818 0 obj <<
+/D [8786 0 R /XYZ 90 208.2666 null]
+>> endobj
+8821 0 obj <<
+/D [8786 0 R /XYZ 90 171.669 null]
+>> endobj
+8822 0 obj <<
+/D [8786 0 R /XYZ 90 158.7538 null]
+>> endobj
+8823 0 obj <<
+/D [8786 0 R /XYZ 90 147.8609 null]
+>> endobj
+8824 0 obj <<
+/D [8786 0 R /XYZ 90 136.9681 null]
+>> endobj
+8825 0 obj <<
+/D [8786 0 R /XYZ 90 126.3144 null]
+>> endobj
+8785 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8840 0 obj <<
+/Length 2431      
+/Filter /FlateDecode
+>>
+stream
+xڽZks���_�O�4S�x?v�δݺ3I3������5�z���u}/H�_���m2�(��ރ�{�{I�����
+��l��³O��\��~_����]]�H13�H*gw���B��6?�	A�,�c<�]<��]��]P<?l_
�M���YܗY���TE�ݾ�>䛧u�Yݖ
���R-~�������!U��p�g���At(�(k��K*��=uF�r�������տm�ө1w�0t��۬��}�%c
+	��l	�0B����C^�,߯ �a!�I������wm�mp�BX
f����Ͽ����+
a�b�
_0"����S�l�>^���c ��6:͖��Ru�����PsD���@
+ަ��a��B�R=kavx�P*��#� �����~92������_�O�!;*!/H���u���ݡ|Y�������yR
󈅉���<)D�)SD[\�i� b����}�]9��~u�R�>kF�R�(�e�J�aD X
+LoV���i��>�O��$K�!�� ±�$$��G��yL ��������3

%�'��H%����UO�ީ�z̛
;��U�o>� ֗��
�	�����]�>����[U0		imի������E(�$V�a����`:C� 
+b��� K��D�=��i�^�e�5 at j��[P"k@
K����_�J�u��-���ab
+�4�}��yz�����]K�1;=�և�`q!0cZ*��G%�ۥ�	M{��La-@
��8W����L[�@�Y���򾨚k@��d�p(Ge),���G�I
+a����6F
-�`w�QY*��*�Mn�����|weF}}�_WL�H]C��Q>Y����
�q����I}�Rl(0Q�-*�@9�!
��&}�L#Na��z�ַǧ8
�Z�b��O�
+�"��`�E�
��EZ�g����e�W�c��W-�Y#�7e-*E�(Xuo��iXi� �
KFa3��
�-��u�7ݻ��s��X�
A�T\L&x�$x
K&x��k�'�����)��]Q�
(Hزy��t�7���ͺ�:�b?to
4�X&bNTB0�v�����~�d�X*)��
D��a)N'�
+t��3����|%W�s�ȃ}����;U~��
�|_
~HQ"�L@��4#o
�c!��y2Ka�мq�RKgi`0��q�m��~�YJ���C ��q"=��YJ��4�^��K��C�f�d��Ӵ�����
*�͹)ʵBF��F�-M���P*:�R�[�p�!LM�!D��’z�z|�C¯�C����S�b3,L M����&�b1�kY��yV�J�p���٧��O0R
��;�G%xP1��f�
ħ,��XrQ�6b���
��� z�+L͛�[��|Z{�I�o�=0�m�@rhaI9�#rH��r��Mʡ��
9$X
�ֽB^�� �:'J�cѢ,ln�`�S1n�%bmD����3���
�ԈA��
`��q����e�� A���p�% `�@�oD�b0�[?;y
x(���x���Q)��
aH/�oH}��c���l�R��^E�<2�j_r��V�S>�̈A)�����Uo�����{�\<�A_�
'_N�{
�$��,h���z�6�L��r�/UU�v��F�s�8R�L+:D�’��z|U [...]
���
f"�P:�Zc�ċyl����H�&G��y�٬ӍN���H{�vQ;J)�vT�T�yX'���=S;A���4h�:���%�-4ɷ�_�q
��ҥ����%�``�2��[�ݘib��p��WY�P��@���o��N^
�-}�?]V>?�P����U����u�rx.�������<[۪���.�ReX���6��=3)�|��:���hb_�M�v�,��f�� �
+2-� ����%�H0`�wJ����ۨ-<�oպ?
�2����Hh�Rj���=*�\3�*Lm7��:�6
���<7
� 1�ZW�V3#g���j�#8�q5 6�
jȧsHmh-8��Y�d2<�8i��ً�#p�
�"�#p��}v�Fg�3�(�=wJZ|bN�v�'e��Y$�w��8����9,�-�p��"��%'9W��
+�~��߶�-�vF>�%��Z&"�G�>�m�=��ڃ�_���龜����)���������G�$
��4��Ǭ(��������m�؋n۪��bC:)�E�G�� )��$�b�mŞD��v�ܹ�<�� p�՝n�����X៼���a��;�wk*/Om�T�̩�i�`!���c><wѼ�"�(5��g�~
��2���>T0����WU
�]_???��	=�c����x�^�G
k)U,6{�4��	?���;�o!{2�9�x(�s���]fK�A
	2J�+a��endstream
+endobj
+8839 0 obj <<
+/Type /Page
+/Contents 8840 0 R
+/Resources 8838 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8695 0 R
+/Annots [ 8843 0 R 8844 0 R 8845 0 R 8847 0 R 8848 0 R 8851 0 R 8853 0 R 8856 0 R 8858 0 R 8860 0 R 8863 0 R 8865 0 R 8867 0 R 8869 0 R 8870 0 R 8871 0 R 8872 0 R 8873 0 R ]
+>> endobj
+8843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 719.9123 202.9022 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+8844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 719.9123 314.2635 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8eb19423295d8af4d69f144fc227128f) >>
+>> endobj
+8845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.8192 683.4698 199.8638 694.0001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_f191b9781c37da15b49810d47a838823) >>
+>> endobj
+8847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 604.3593 203.0748 615.2633]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+8848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 604.3593 296.3242 615.2633]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >>
+>> endobj
+8851 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9437 549.5214 200.0169 560.4253]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_343e039e48425126b187827066d12bf2) >>
+>> endobj
+8853 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.9437 510.69 200.0169 521.5939]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4ac4e4131c756f0ffce85b9dec7d2b3a) >>
+>> endobj
+8856 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 429.9606 211.7029 440.8645]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b3b8f7e6fdd123f510ba85f4527bdee3) >>
+>> endobj
+8858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 391.1291 203.414 402.0331]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_269f357fca785afae3774b1e084d9b93) >>
+>> endobj
+8860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 352.6713 179.2647 363.2016]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_21a9e355a53ec45a5a60213fa8c24f2e) >>
+>> endobj
+8863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.5753 273.6256 140.5305 282.4723]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_43ab45399b7e22ffcd6403b7e59a473c) >>
+>> endobj
+8865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.5753 234.7942 140.5305 243.6408]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2d12805af932544a4fc1575f8db62a3d) >>
+>> endobj
+8867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 195.9627 167.6386 204.8094]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a2a8683afd33a1d57db43c9db16de1f5) >>
+>> endobj
+8869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.8387 113.176 181.2641 124.08]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_de7792cb469ddf1d5d8944bbe7f1f55a) >>
+>> endobj
+8870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0497 113.176 321.4708 124.08]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [430.2512 113.176 513.9963 124.08]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8872 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 101.2209 146.8964 112.1248]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8841 0 obj <<
+/D [8839 0 R /XYZ 90 757.9346 null]
+>> endobj
+8842 0 obj <<
+/D [8839 0 R /XYZ 90 733.028 null]
+>> endobj
+8846 0 obj <<
+/D [8839 0 R /XYZ 90 623.3217 null]
+>> endobj
+8849 0 obj <<
+/D [8839 0 R /XYZ 90 566.5809 null]
+>> endobj
+8850 0 obj <<
+/D [8839 0 R /XYZ 90 566.5809 null]
+>> endobj
+8852 0 obj <<
+/D [8839 0 R /XYZ 90 529.7718 null]
+>> endobj
+8854 0 obj <<
+/D [8839 0 R /XYZ 90 448.923 null]
+>> endobj
+8855 0 obj <<
+/D [8839 0 R /XYZ 90 448.923 null]
+>> endobj
+8857 0 obj <<
+/D [8839 0 R /XYZ 90 410.211 null]
+>> endobj
+8859 0 obj <<
+/D [8839 0 R /XYZ 90 371.3796 null]
+>> endobj
+8861 0 obj <<
+/D [8839 0 R /XYZ 90 290.5307 null]
+>> endobj
+8862 0 obj <<
+/D [8839 0 R /XYZ 90 290.5307 null]
+>> endobj
+8864 0 obj <<
+/D [8839 0 R /XYZ 90 251.8188 null]
+>> endobj
+8866 0 obj <<
+/D [8839 0 R /XYZ 90 212.9873 null]
+>> endobj
+8868 0 obj <<
+/D [8839 0 R /XYZ 90 132.1385 null]
+>> endobj
+8838 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8879 0 obj <<
+/Length 3605      
+/Filter /FlateDecode
+>>
+stream
+x��[�sܶ�_qyqO3>� ���$�Ӧ�����!�x�;�bsw����_�]�$�CR҇�
D��bw����N��IN&Z�,�BM�32���;�nx㳐�˳����Y���\^w
��rr��qJi���%�LߜS2-�U���9#�zyS.���߫��h�/.
A[�������v^.>�iΩ��pӞ�t���W�2
����龰�H�d�{������I2}����W��<�{竣\�]ۭewy��i��,����&3�u&�֓h#��v��-��ne�zn	1�ʱ���ӳ?_z��r�Έ�
���ُ?�����59����<g�ՙ`��Y��;��� �9O�Y�n at r��'��/ ��$x��<3�`�T��&��R�{o�,R��7b��P3��C�Po1�K�p4��:6/YN���ݶ���z�6e�:�	���Fb&��@

j>:���@=�1�F|Q�zS6E[7	�

,ܶ�b((c&Ӓ����TG�c8
!r`'"IBg[�w���^oۡ\
8iCĩ
+��G$
�E	!��T���&M at P`��U���f�-�_���%�������^$�\
+J�Jp��
b��8��H�-6`6:�^:��M���0���!!���E�������3���=���m��mm�E��솞O)�f{��,�D�?IڀG2�)[SQ�:������z�V��	�C�)�ȩ�*�kH݋�M��W��=,w����\]�*���~�,e>S��fz^	DbOv4�q�S��ЄF�8��
��W\/0�	aT�"�*��3|��~S���S���,��mbz�i���ɝG�̴ <�yWu�
钫���HmУűt�����
�
��g_��@2C�@��M{�c��)i���)���p�O�AO~D���NMf�<�O5�'N�#n{�ͨ�Q>��X'�J���4'��2���㚴� 'g���&��Gl2��(3��!�s �1��c1*$بR)H�:�~=�,$�m��
W��,b���P��dLq��D�8��=�M��m��?�0;zќ{��6�.�GL`6���v�p��k�^�۫~ҥ��׫M�.׭+���
�ʌS٧�O		t� �8�8�Ef*��ֺ?ʤ9�z:L团j�>՗��˽�F��D�'Web?�,�%?
�q$�cw�'M�`��G�k��)(�!.N$zm��	P����/��@̷+u�V�f$����C��T��V4ʰxn�y���M�W���`�7�8بJ6�
���X�n{H_�j,m�F�Ռ���fd}�H�֌�`Ɖ�"D�
�*W�T+y�#V��c0�0��7ԓMH$:3�;�)���O5
�&
q��A��'� ��D�	�!�q 5x2��ݦ��i���r腺�]i{g#Հ� ���kݛO�֙���z!�d�@ X���Ӯ)�Q�Y�E��/��6X�w^=h�)/v-
�$�@'\C�1z��8Q��`$z�]Q1x����9v���u�SG1�-sd�����gPnJo��N
@V
+��#N
����W0��G��~����Kqc.:�p��.M�_mۦp]���C� l���`���_O4
���l`� ��.���s�1#�Z��6%(��%�Tca
|
+�
7��kP�`
tUn�c�S��x{���Mמ��
+*�b
+�=:xƧ�uc�K^�8��WE�vn'�bT�\�A�ݽ��"����E�)�d�{�zɎ�i�H~>�V f���4�1���:����pK�^�N6$��q���N6:�Y��u&=8و�v�i
y�0��$vd�P���EO5�?������ǓL�:?u������|q�ׯ)�C(���੎(`�-� .� 3�:U����|q��qĕ�L��G��S
[���_�@B��?���c�.����T��׃Ԣ�i�8��
إZ:���^�����K��
 �h�-۷ g����J�������7��$� ����N��j�R��
+[��Bҁׯ!=p�W�)1]s�w��uAX�3�3�P��~�o�(�fd�	��NUBhq�/R�Fr at l��'
�=�kJ�z��cM�
kJ���"b���w�	l� ��M�O���§1�si,�S�*s07�L
+J�f�����9�rwSbr��q 7V�5"�{{����n��[[���F
lzu��j�1`��
xu
�=
����6��h��� *ͥ@$��Na�s�nm��JCz
/]�6�ZKs��Ќ	À
��b���DZ��*o�xst�>���i�u���H
nz$n�zW�2����x^��M�V��*�̟�^��1�
�*�+��&�8�Pj��u��S �
{��X\t2.P}��<�-i
{
%�d�~������:���vd�x�~U"�;�#u�』��L at D�m�Y>�V�W�2�/�f��B�n �U�LN��UBt�:�O�
��ՅT�JDծ�A��c�
��4֥�O2%V�����i�h'���um��
���]��� $ o�фh�m݊���ë�Eۋ:��$4?5�?��n����p��x� ƈ��7��=g"���Iz#Q>�H�Mb��	5��g�{w?l`���>�� @�.�?�ǒ�6��}�r1��Rf���4�Ld��2���0�!��q5���gT�K(o�\:�
�N�hA�����\K�h�#H�R�8��
Jf�R�}.�E�-�~�8%��2:�|�.E(
�=9E'�w��y�#�$����S=3�ퟪ�}>�O���v�]v�t�����|1cX۰ �q��MG��D�@ ������_7�H����1�����fy_�?Z���k^7��������~�P�oB��զ���a� [...]
+h�������򺶽�=)WS@��=�t�f���{ZR������a	�;t/1�s����I�@|{�J��q��E��QnЁ���[�EՔ��Nt�S8��ő��#�yƅ����0ǎ�=�,�OtƇ\q%?~�����s�LX,���
�v�+�30�Y����X܁vD�VA\�D
+jc\8} &���j�-�
 �N����̾rUY+4ʦ�G����
+�6w����+��
Z��%�|*��y
]w! �E;xE
҇G�jӂ8�ώ46�K;��6=��������ZΡ����1�E㎟$�[�>4��e��A�2
S�&�2In�A���_w���Ĵj�����>�AJ�r�����ڎu��w���5:<�/��
+�h�]Y��TזiY�hc�y��A���טAo���Ʉ��̘b�`�4Ї������y�'W�R�X?��c����(��`
%�N��|���n��~{�N��Ϳ�e�sP����(ַ��^�C�nC��
M���e
���
�J����HKv��I�� X�/̂7�c�ݒG|q�7m��x����.�o��u�i��}H����)B�
"�!��<�H�H��@��D�ظ�����Tk�?wPp��IQ�
�אendstream
+endobj
+8878 0 obj <<
+/Type /Page
+/Contents 8879 0 R
+/Resources 8877 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8695 0 R
+/Annots [ 8881 0 R 8882 0 R 8884 0 R 8885 0 R 8886 0 R 8887 0 R 8888 0 R 8889 0 R 8890 0 R 8891 0 R 8894 0 R 8895 0 R 8896 0 R 8897 0 R 8898 0 R ]
+>> endobj
+8881 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.0636 706.9608 229.7488 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a18eff42a557fd87d59895399c7a13f) >>
+>> endobj
+8882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.7841 706.9608 444.2052 717.8648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.0528 575.0093 179.1769 585.9133]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a9afaf958c6f9dd09c89bd706dc09b0) >>
+>> endobj
+8885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.3907 575.0093 319.8118 585.9133]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [430.2512 575.0093 513.9963 585.9133]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 563.0542 146.8964 573.9581]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.7616 512.2447 158.1275 523.1487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0e39243c24d99f8d374f9c14e3da8d98) >>
+>> endobj
+8889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.7894 512.2447 386.2929 523.1487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.4 512.2447 513.9963 523.1487]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 500.2895 306.1276 511.1935]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+8894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.5252 323.9792 253.2487 334.8831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+8895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.7817 323.9792 341.4604 334.8831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+8896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.9933 323.9792 369.8962 334.8831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+8897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [272.3523 129.9449 304.2325 140.8489]
+/Subtype /Link
+/A << /S /GoTo /D (main_CC79) >>
+>> endobj
+8898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8880 0 obj <<
+/D [8878 0 R /XYZ 90 757.9346 null]
+>> endobj
+8883 0 obj <<
+/D [8878 0 R /XYZ 90 633.217 null]
+>> endobj
+8892 0 obj <<
+/D [8878 0 R /XYZ 90 462.9695 null]
+>> endobj
+8893 0 obj <<
+/D [8878 0 R /XYZ 90 400.5826 null]
+>> endobj
+8877 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F37 1999 0 R /F67 370 0 R /F7 574 0 R /F8 568 0 R /F25 348 0 R /F33 485 0 R /F10 488 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8904 0 obj <<
+/Length 2145      
+/Filter /FlateDecode
+>>
+stream
+x��Yko���_a
PTj����|�>�ݶ�t&��"P"&*K^I���}/ER�,���t��(�uxyy�sx)��?���Br�2�����/
���q�W�~~sq���
e�����`A0�)狛�DŽIJ�`���%�Iޮ���%�IS�t��.�ڼݽ~� }�W����.�����n�D%
<�˟n~�����C*��,�LwW1q�`Dو���n��
'�RWx��2�ei�ڼy��7U�u���2��^o��צ�bŘD\H�XA42����~���t}o�)Vs�L2��^|w3��7�+�L����'�(`�~��f����2�X_��������_G;���ҌE���gN�B��b�m�d�eSC�H�t���{(������u��Ğp�0x��� *@(DS����rŰL��9�K�P)sط_�RV��&��8 X#C�I�q���H�$f{�!�CJ�~ټ���&�L#V,�:Pd8B��l4�9�S&
��sb�������i-��d�I�y�ȵ^��I�Aa\�O�Ց)�PD�Ȧ|x���AH�B�u�k�dI��m���1�&̓����;ݎ�����u
�xIx���m��V}	�o*k}o�ٟ秲���r�'�Y�
 �#�L��J0��JB��2S�� #l
�z��+����6w,�j
S��@J(>4����e�;W�=5۪��V����|D��4Z�RΒ?4Kʓgm�4��Kq��iߣ3`;T�wۺ
ZwV
�t����}�նT>�_
(4u����ݘ�q�@b)��
���NeҼj
�} �#~6���
��̮%�-�����
���!�	†,S�{D�ݘ�G��ي�ԍa=@@��ɖ&J
ϳh�C?�Vr!8F��4�&�Hf�
�I-W���vfF��a
���X��0ͦ0��S���65eoc6h�Ц�k]�v�
}��Ϋq+/��#�!"XȬ�
��aR���w�́���G9H|Bk�Y�d��l�-Ƒ�Ҿ�+�}~����<���
+A���<u���tޖ�������#�b�ç�
+�B�������
+?�݋FZ��6;m��j6��k�
XDNH�F�Ngm���CSUV�ׇ,qk�,� m���#�½�@z&!O0�bQ)�ު��]��2C�+/�D"���`Ɉ�ќ�"
+�c��B�����Y
	W�"\�|g�jCI���d����
�+�3
�
��X0�e�h�(�b�^ޙ#̶���>���&S5�M��l���
�ER~8��;Έaps�C�Ֆ��
+��L�tPG�K�2��d�x�qx��Y��C�������<��
�4w��R��L��qQ/�>�fzN��uԶ��-�pK
����>�c#aH*��i���>H�,Q�l���c��[[��˶��bG
+�N���N&͙G2e���ĝ�hD_SP8��;h?�3/�f����u�׺����"�#$
pH>!��A^�:SNC�	9
a�����s�h��cT�Fe��w�
�d�����do(^�zL��v�m�:�yeP�+�
.E ���i�+�l�*�&��3�2��N&=�1�a��*
+CyQ��lw}���
b�&
glT�ƻc�c�Y
+�
HO�g!��~���K���=��O��_�3�����ib2��%W�^������kW�8�!�8���!�ybaǹ������~?���+�f��
��hy�:�8��iߗ��Q��@�b
f
�
��C�q38Y ���2<��~��
�3x������
}�R[���U�q|u�6_uv���ɤ��N?
�N ?����c�oX�&��&��*0V�|��3�?�OE�
������Օ�
V�)�U`~[����:�A��}���
�?���)��f���̦P�F��
�����T�9g��w3{��9'
��s)
�OP|���S��
L>���K���涑Cg�E��x����݉w�BG32x��NL�{m��Z�=�{m��.�������%牣�_�z�W�O��ƣ�_��U�i5�f���B�������2��}�υ/�)���
VA
O���gv����~�������wh[�����fS]ξ�`�2*٩�[���/�� HBb5���
A�֍�([�P�
n�f��b;�ʿ ��
endstream
+endobj
+8903 0 obj <<
+/Type /Page
+/Contents 8904 0 R
+/Resources 8902 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8695 0 R
+/Annots [ 8906 0 R 8907 0 R 8908 0 R 8909 0 R ]
+>> endobj
+8906 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [222.372 684.0467 302.0731 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1190fcf4794305386f8475f9ac51ce00) >>
+>> endobj
+8907 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [309.1489 561.8075 329.4027 592.7762]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+8908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.5626 561.8075 422.4926 592.7762]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+8909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8905 0 obj <<
+/D [8903 0 R /XYZ 90 757.9346 null]
+>> endobj
+8902 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F8 568 0 R /F25 348 0 R /F33 485 0 R /F67 370 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8912 0 obj <<
+/Length 1860      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�6~����f3�;�l�C�lhwA��{i
C��D�,{����~�%S�$hS
E�K�����\�#9d��
5
*��f\��
^�׿��<�����tp�C���r8��y�
a*�p�x;"1=����tL�(��tL�h�n��"�g�'y�o���A��i�����fn��|L��
+N�����_��
+V�
���~�,Z�F�5/��	x����Wΐ�\�{����EE�n:�td��4.��o8aL!!�N�
-��rf.�ng&�W�
G
�\2���iÿ%�+�#�,��޾����� ͑��	FDk:\8e�I:8���� �5
�Yv�8S`^�&Έ�H�XeE�C�VyE�w�s����j�Y����d��8��
1������nӌ�$�B�G��۵����*-�s�
�JJ��?o4R�3gq�$&^�PR'���Y�BD��`��^"Ti�^�$L�7YI0�z��#�6�vؼ
��/H�df#P���s=��2�q�.�l��5�!HE�.�����8BD�:T8�A �T�������LI:;I��� d
!
階I�x�)I��͟��>9;?	8��Dי���3�.�D8��I�&��=Iؓ��N�yR���D��W
a@'D!I!
���M�.\K���su񏱑��ױM��IvU��צ:(�f��Ø�E��:_�
d�)��	XJZ�`v��h�[u;Z��
|1����>��K�Ƿ�'�"Š@C :@�.�Vr
�B��{
�s
��P`�T4V]���Z;���`Z��\��W�է��}׏c"Ff���u<w�@�U�M�u��?
�
��s�tc��se�bkE��:�Q��ۼ2
ǒ�+�7��6��c)�>6Y2��q����ʺ�@
�ힺ�М�rU}^��/lB���J��T���|��e%XQZM
'��fm5���B����"
����(���qj���zf�
�
U�z�e��ꂸUU�JL� �������1�
4gN���䐲�V�$"J��bl� ���M�-�O�r�tY�����zڬ���K`LQ@ ��5�ѧ���n at xD[�:�E�1�"
ܺ���f�xv�����Mos�(PQB%A�*�=����U��A��mYR?1t�&�#�xX=pͯBS
a��#�:��S)HϨ�_H<��9_�-e�F�Y�m��y�G5��G"�����ed�IYt&�n�
���>�������!
��aa�lWV�A�V@�8t��š1�=�|k�0<
+8��m9�#�U{�&�w�FX��5L��ӡϺ&~�

Uc!F�˔�"��׷:
\������G�C����"
���a����^�; ª��>{R�F�
]�)�&*}�TVD؃���
;��sEv��)����sg������3�^����ˇ���PD{���fnKo;O?O���F�)��Msѯ��aE����8�!rУ
+
$aUh������徳lX�[˺�
+/7����-��ɽpr/|�/�[*�u��'���U�\-�2�To�7y�o���˕<� �,e�6!��z�_(,
:qP.m���oՓ_��{cu��#�xOnuP�s�1{�����~��O
-�����&���
�����IV���As �k����A
��#

�؟ �x��
������-�;wh<�)r0�1PE@}>�'�ݿ2����&~���X�~�A��8�]�֣;�
�:u�W��)L��U>G�q������l�:�!
��un��e�yn�m~h� ���Z,UW?
����mn�xwT��-w�ڍ_���������
�ɒu���h�N�n��F!
+sO�&�QK�~�+�ZX.�_<����I	_.w�@��#�
(����endstream
+endobj
+8911 0 obj <<
+/Type /Page
+/Contents 8912 0 R
+/Resources 8910 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8920 0 R
+/Annots [ 8919 0 R ]
+>> endobj
+8919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8913 0 obj <<
+/D [8911 0 R /XYZ 90 757.9346 null]
+>> endobj
+8914 0 obj <<
+/D [8911 0 R /XYZ 90 733.028 null]
+>> endobj
+8538 0 obj <<
+/D [8911 0 R /XYZ 90 716.2211 null]
+>> endobj
+8915 0 obj <<
+/D [8911 0 R /XYZ 90 716.2211 null]
+>> endobj
+8539 0 obj <<
+/D [8911 0 R /XYZ 90 550.7692 null]
+>> endobj
+8916 0 obj <<
+/D [8911 0 R /XYZ 90 536.7787 null]
+>> endobj
+8540 0 obj <<
+/D [8911 0 R /XYZ 90 370.3914 null]
+>> endobj
+8917 0 obj <<
+/D [8911 0 R /XYZ 90 356.401 null]
+>> endobj
+8541 0 obj <<
+/D [8911 0 R /XYZ 90 178.0585 null]
+>> endobj
+8918 0 obj <<
+/D [8911 0 R /XYZ 90 164.068 null]
+>> endobj
+8910 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8923 0 obj <<
+/Length 1964      
+/Filter /FlateDecode
+>>
+stream
+x��Z[���~ׯ�S#���/��@�q�����U��c,h�k�D��v��3��2��ml)�}А<�s�\��
i�
��<WB!ø�o3<��2#��
+���_�gW�J17�H*���r��B���7
B3��/n�/����.)^���.�f��ɻ,����N�H���|�*�>l���m�$z��E�|����[B:
+�m��}V�*	�$�e��7���x�
u�W�]9C�p�����]o�Q�Wۭ��.��i�}o�bL!!����FR��*��˓��M%ȱFXH�%��ޝ�X7����
+a-����fo������
����?�F�:?�8e��~�z��f� ��ܰ`�9�k�`e�����@�h8��	!"�� ���+*�L��s��qg�u��S����ֵC�%Fy!SH&�]�)�|��H8و�Vk-5�*hW+ŐK}��]\�K~΋�P����s�
�"��c�r�H��w��t���Rl랜�d��)J��
�?]
6)9Ғ���v��c+5HA��G{�a���0
א��ǵ�f����z���8��l`��r�ZO{���YS3&��]�.�X<
��$�J��s���5�
w��s��J�Ӥ����N<^� ��ۼ��2��� jeH�0�)�8�F
+�܊R�U� fS]\G	��E�zX
+��
#
��l�@q>�G ؘbZ�5�

Б!<�T )�� E9sc�jՁtJ|D�U}���`f��1Ĺ �F&�s�]�.�s���9�)�����_��7
L�n���;��8��r��
��]e�W��l�	�<`�F�4F�n(#P�is�7�q�
c�H���i�l��m��V�W4��:�������}]RQR!�
o�⍭����/`zYf`�����Pj��⸋����u�r}]�h��k�hK��5��R�-A at T1��Y�>d�D[Xn
�؅v?y�����۽����&�5#�cە��-&H����C�'�:�"
�F�y�~�m�n��~�7�ݗ�.L��]�׮���4&�Q���ѷ�#��
+Ӂ��
0}:04�tl�
3~��
+@	$�sC�*�/T��Q��F^�b���[;X�KLA?�)(p�e
+%�U�7
W �+��q��
ˍ�< ����ĤN��.<�
�kN`ɀRH��CR�調}�5 
o^�4�
0��C�E��ֲ��_�|w�ӏ�?���w�CL�%�DT�Abp�8�� ���:YBGu���=�qR.RZN�s(��}�~�}�
H�ڞ�O�3¸,E?�>�	����!/�X�m�>�;8폻4�k�6�%Lڈ���i��������Q�H�n���M�
�Dʌ&�!Ce/�ߝ��T�����( lTS��Y/�
v
����)�B�P�jK��n D���R/o!o/���ߚ��[�l�C^��6�Y����`K�;Y�y
��{�:�M
���b2�\�G3����׆~
fޫ�c��#���֕gl�P�
}ޗo!&X���0kk��@�l
f= ����BC�=.iN�u��1��iw�h܇
+"���L���#6�ZlX�vA��/h����{ 
$TB�y�����i��U�c��W�Y��m6ގ�7�Rt�Ƌ�
+��c
	*
"	X1�Z�ycˤ'ڱe`Dxl���cKm?��B�5�polQ_Ɩƃ�|l��$؛[��#�"�
'C�c�q��egn��/_��
�� ���L.�cr��"�=��.��0���6�����<�Ч/�S
/����~
�
��^
�1t
�h��b(
���{��/��L�e9�s�/���Q�[[��˺�U���U���+���sӏ��!rL�v�ۭ`zj���SSe����u
��C��@A�T=��^��=l�ª�F�qU�ȃ}��wEq���z||D�
=
�S����t�_���C�+6�U#4��s?F,֞-���U�fq��p��$�G�M�uB�endstream
+endobj
+8922 0 obj <<
+/Type /Page
+/Contents 8923 0 R
+/Resources 8921 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8920 0 R
+/Annots [ 8928 0 R ]
+>> endobj
+8928 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8924 0 obj <<
+/D [8922 0 R /XYZ 90 757.9346 null]
+>> endobj
+8542 0 obj <<
+/D [8922 0 R /XYZ 90 655.1028 null]
+>> endobj
+8925 0 obj <<
+/D [8922 0 R /XYZ 90 640.9569 null]
+>> endobj
+8543 0 obj <<
+/D [8922 0 R /XYZ 90 462.0798 null]
+>> endobj
+8926 0 obj <<
+/D [8922 0 R /XYZ 90 447.9339 null]
+>> endobj
+8544 0 obj <<
+/D [8922 0 R /XYZ 90 216.1368 null]
+>> endobj
+8927 0 obj <<
+/D [8922 0 R /XYZ 90 201.9908 null]
+>> endobj
+8921 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8931 0 obj <<
+/Length 2112      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��~���S#�x��	P�n��I��*@�� %�&*�
+E����rHq��HN�?���9߹
�L0����%2���rs�'wp��3�n����/p�8;�Z��AFR9Y��+H�0b�X}�����	�xz5#x�����jF�X?ߧ�2��>�)�����	TY�^?_�OW�tu}UΈ�pR�>-�;����B�@��Ϫ�G#�A"Q�I�%�ͩ�ӷ�
���2���WGW}�Nv�f����i�ٮ�*��M�)$�R�9x�A�Gާ�imY�/A�5�B�%���ٻE��\�ւY��z���� Lߝap��G8��C'�3NY{�>�p�c����57,fN!Ě082HSF�RZ L4X� 7!D�3B�1SE%"���8�d�Vi��J0E�Q:�/���H��B��"L�W�P��#�DClyP�^�����2D	��ӹ�O�dٺ"(��*��7�~�ݖ�S��\Z�;�N�[��K
�41
A3:���"��Ĭ
��<}ʪ�v���>���k��($
k�k����1��8�$Us���Q^T�{�g�i�JW#��-��,^}��E �BTb^���UV�
��
+"	�8�V���U���u��U��iY�������{����c�)�VL|����Q1}�
�L���Ks3�m��;\e�4�e�-n]{�Le�1
+���)�!��ʉ�sa7P�I�6�	��hS�c`��S̑�̴M�IY��ɜ$Y�q	�r#�
��"�h�+���9�2�z�[c��m�C���)��P$���
z�FhhR*��i���9�C�`ޛ���
�Cd���`&����
����j���
�
�����k߷�@�Kɦ�`���
��7e�r�Y��>��[�xP�Hi#��2�M#
��I���M�ׯf3^YK�
k#���.��m%~(V��ҴK���?_���W߿�﷋�C��ZR'N"��'@\Hk��,_gy
+�I�.}ڮ�eV}
+��ch
[�*$)oZ��C�^9��xsב�۲�x�� Zu���j�Y^%Y��wA��yb1
���\N4"h6g�m�]hN��>-�j7�]K�~�Ŷ��������
A\��}�ÓS`c�5y}$A ��9B����>>}�H(L��wRc�	A���E���E
�%�Tƨ���'�[+v"u�k��H{�:zڣ�1s����E!��a$��Gһ'u8�� )����0�<�!�!j�^F
�����01�@�21
wп
+14�H
��
���^��e1�
�F�@Ib��"�XK�"� 
�
+�c��)���n����ٱ�
+��H�~*A *l8���u6�8p7"�;[a�U��͛�؃P@$G\j�G�jK�)�z���
����,���e�r�D��E�ۃ�8!��FX����.d�
qx�q7�U�~oМ�=��ON!�F"�;lj��ZV$¤�
���JC�C�T�Av�:D�;��Nb��C�K'tS<�:��iS� v���?�B�f�(����.Q��:L0(t7c7|_Ÿ�#
c�#L1Z�A9y�)���t��Nh�w���MC<���2ݖ�.�+�5��de�b��n�aД+x�U����|׊�Ƞ��;=�
fО�� )8 &�>��=�H�C>`.��
:�<�!�!j�^Ơ���3��0��@�4�f�L�&��׫�^��w�
����>}�;(��r΂�.�t�=��W=
+m�v�( k�34g&ɀ?;�/�����a�*�_N<)��#3�e�>?.�����ʼn����-ȣ
Z��u���)��I��9۞+�x�6�=
+��4�&�D�?sI���Xi#8~"�H)|t�W�dח*���M�+p���|{��>٦a\�,��⡠Z������w�oV�E����y�����V3c��
�o5����[�<m^�>o^
�y�m
�;���0�[O��=�D6Q��W��a���oH
��%�3��>�2]�qh{�;m�\s�]s��.-��	1u��!��9�v���R��;?T
T�*��.�t���G@�{^j��o�
�kol����D��T��Ѻ�����^��?>>��=�ٶDYu�ݮχ�8���X,z�Nh��s?$m��c�-
�� 3ms.n���}<v�' ��d��"endstream
+endobj
+8930 0 obj <<
+/Type /Page
+/Contents 8931 0 R
+/Resources 8929 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8920 0 R
+/Annots [ 8936 0 R ]
+>> endobj
+8936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8932 0 obj <<
+/D [8930 0 R /XYZ 90 757.9346 null]
+>> endobj
+8545 0 obj <<
+/D [8930 0 R /XYZ 90 625.8152 null]
+>> endobj
+8933 0 obj <<
+/D [8930 0 R /XYZ 90 611.3398 null]
+>> endobj
+8546 0 obj <<
+/D [8930 0 R /XYZ 90 409.1856 null]
+>> endobj
+8934 0 obj <<
+/D [8930 0 R /XYZ 90 394.7102 null]
+>> endobj
+8595 0 obj <<
+/D [8930 0 R /XYZ 90 180.6007 null]
+>> endobj
+8935 0 obj <<
+/D [8930 0 R /XYZ 90 166.1253 null]
+>> endobj
+8929 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8939 0 obj <<
+/Length 2287      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n��}�W�)�������	�{�lv�Ό�b2h���H�BQc��S�nR�4)M֓`��T��ԥ�N�L&����
+��d����x��
⿞��������;)&I�dq_� �T��b�iJbf6'����i�o����i�yy��y��!�ˣ����
I�ټ,?���*^/o���
n�������i(�
+�����D
���Z��n6�O����X�3d
7��?�\��&���r����x��DElߛ�SHH�&s����|���Ҳ8]9A�5�B�%g���͢��u.Wk����}��3��!L�_`p��'���C'�
NYu���x�z
���ܰ`�9�k��� M	Ji�0�`�܄�m�LM��H�K�|��m\����k(�)F餹t����#1�2�a⸪�r��i'
+I%IP�Qk%��*hS+�H
+��Z��K�7��s����<���>N�$}pO�Jz��}�f���ygw�!�h��d"
E���*�ySl��h�A���I���. ��'�WR}�m
+	ך����t0fDLK(��o��!��x�sO��ҝR��ӽ)5��RD�,��<��]�d�`����uA
D��0����j���2��,�QP���㎨�� ځ��I��1�fTL�R3M�ݧOq3��\'�8݃��mv��p�T�pU��n�"�H0���K�U
��
���9�
��z����殺S̑��T՝:_jhsf�d��
���%���[e�h ��	�kx{�q��.N��p&}�c��X�^�y,���(
+����ֈ���)����)*h�O���`���؎���i	���v3��IW`gbI�8_��_Q��.�|�#�e��'�����X�ԭ���q��L��U=di�Y~,�X�xԐ�IZ(��o4Sg3��8�NYDJC�p�>��F��� �
،o�ζt<��2��6���ڭ���K�d�����,A�j�?��������p��?/~f�Ye
ċ��$G*�?%�&I�ρJ9gD-�<��}�
���o�Q��d����
���J��)�"@�*
��E����̃N�E7��
�։�ٜ�XyU�>�yR�;ܫ���ݘ�Vע�f�X71��8�hJ
���3*��d� ���C�
��1$m�-�P���_K��vH6Aݎ��X<�9����K�\�)6��J�L�=����=�a����*\�C��z�,p����p�sR��O�C��B�E1�J�����'�d�"L�[ �1��_
٦ߐlIrԍK�}L���d�;&���
b#"�!ٶ�n��T\�&e�

��yc�TЂ�KIb�Cvb����A�W�G�_��s�D��[(� [
�+SCA�382AO�$�+�tn$���o���f�C��J����
����D�>��iMv�8��%��q��5e�F7){��vlm �[G�!>O"Z�_��%T��y�IVI��D	�ܰ�)�m�)οؚ
���b+y�g�ݓ˲�kl	�yT4Iq �������K ��z�d����c`g��Q
���p��Q
3����P���п���6�>��Ź[��!]
M��V�
g�?�P����X�3ށ�
#__��~��d�>��c�z
�8*1�c�$y%Q���]۩�OU�~b9Ak����*������PpI��*��؜?WV�,�˲������Jl�9ZCI�A����f�*��;'�<��y�C\
�{�m��Cm�Xm��A�:�?F�z���}��ׁ�WU���c����x(��b�D�RU�,۸�Ic0� [...]
Y{*��*�箣`
�
+���_~O�Or��*�]�`�
ug�� tR��&0�[�+��!�5�v\����66��I����Y������Ӧ�J���� 
�~o�(l�9��j�
���Ƿ!v�����(o�,�����j�rzp��DJ���
���! U�N�_T�L/��ËJ��]$���h���Q�T��H
+ܘ3j�
�vx��J�M$��1����+Y7��Q�ԩ��<ImA����O���:8����H!�u���#5�Ӑ��������}D�?�Z�l��������]������΄�zn�>J�X��{wJȏ4��]
Se�������㙀J����_���/Gc��7�
S
�{�Z��bwuy���V{tH�]���r��\vqq�����X��PK��
�����5��g�H�ͪ�JRx�R�<��( �?��(pendstream
+endobj
+8938 0 obj <<
+/Type /Page
+/Contents 8939 0 R
+/Resources 8937 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8920 0 R
+/Annots [ 8946 0 R ]
+>> endobj
+8946 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8940 0 obj <<
+/D [8938 0 R /XYZ 90 757.9346 null]
+>> endobj
+8596 0 obj <<
+/D [8938 0 R /XYZ 90 629.099 null]
+>> endobj
+8941 0 obj <<
+/D [8938 0 R /XYZ 90 614.8699 null]
+>> endobj
+8597 0 obj <<
+/D [8938 0 R /XYZ 90 417.3677 null]
+>> endobj
+8942 0 obj <<
+/D [8938 0 R /XYZ 90 403.1386 null]
+>> endobj
+8943 0 obj <<
+/D [8938 0 R /XYZ 90 298.1136 null]
+>> endobj
+8875 0 obj <<
+/D [8938 0 R /XYZ 90 275.8018 null]
+>> endobj
+8944 0 obj <<
+/D [8938 0 R /XYZ 90 275.8018 null]
+>> endobj
+8646 0 obj <<
+/D [8938 0 R /XYZ 369.2399 216.7622 null]
+>> endobj
+8945 0 obj <<
+/D [8938 0 R /XYZ 90 200.3763 null]
+>> endobj
+8647 0 obj <<
+/D [8938 0 R /XYZ 90 89.4414 null]
+>> endobj
+8937 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8949 0 obj <<
+/Length 2196      
+/Filter /FlateDecode
+>>
+stream
+x��Zێ�F}�W�)� ���%��&N��8��x
�#Qw%R�(�'_�j6I���
��X����I���Nש�D�����c%2���r7��?��w#R}<��gm�܎n��bl��T�oץ��B�oWo&� f�3�1���<��]�x5�x�m6�*�?%wy�?��@�D����u�:.���U>%z��E1}{��ͷ��
R�
���/������F��b:�O����u at +g�n�g�����mt88u�SC'�n����>7�1���J�g
#)y
��rgq�t�
k���T2������&�6�\!����s��-
� M?�0�Y��=\`D���݈SV_lG��~i����

�YvM�)D^�+M�C��uъ@'���(#SHq�*��a��.�ΔQ.}�V�6-o���Pj)f�+6�[��!un�l�ԝ�ʳ
V�������h�
› �����ĸ��E�)L�BP�@W��2KE
%)��i1�'�w
�(O��m�f����*�<�;CT�
+��8���J���2�N̛$�&i��	
+��1%Q��5H(#�3W
s�C at 3�B׊���R�x�l�v�=JWn��������z!I7
���h�^$UAibW���=Kۡ�ehLJ�Npdt��b�
BN@�#���� -&p8�-jJ�`��fm�~����
J�`�����2�	lz޵M0E�Q4�s���{��`
a�պq(V�9D�cH�6Y-����.N��SF#i+�`D��3
0$�=gn7y6�br� �S�$6�@X����}�T.W	�� ٨@�@� �H��G�^2PdP3،�=�������$�+
+g��\P]sE��抨�_]��|~�
��a�v���]f7����8����
k���]�q�/^�߻
�32�(.#�#�H} 1@�Ҧ�^l���M�
�5�;�5�#\�+XL
+�B�rv��O�b�x
X�jL��A`�?��-*�0��%�
+k��..6Y�^u��TU�P
�2P��XH
�⭫�S)�&7Q
+=� a�����AlŽ�0C���E�0���`DN��s&L��3� �k�l�I��$�J^C�p=[y��gI��v��H���#e��2$G�d������g�
�#�ɑ�%G����Y�
�j���L(}bTb�Y�	�̊Ϭ��X6i�6ib�eE&(��aVlK�gE�@�ɫI1d{�{N�I�{
)�D�=g¤�9�L�R�Ϥ��I���cEf��3��
KL��u+���.�
�ʤh� ��
	��A�S~�5|W���E�S���!��:��p"�2����sȮ0�bU���q�Hv)
""Ovg�|�)�T�ma�����s��h��{�2�]@5'HP�?B�@
ED�_�\�%p *.v	�4��m��M�
�&�U�S9#��ݏ�rߍ��Y�ų
�d��ɵ�
��k|�HӰ�
��6�W!u3�y�vƖ0�����&Yn��)�Kکq��w���>�-J˫w�(��1�{K5�"^��g�dž��
�3-���
ev�'�ߪOq>���t4]?�
M-�Ɗg
zH�wp�PϨ�U\m�$���:E۲n�ul���Ż�eV���|M�:�w���E#��Q��	���5��8�0L���:�A;e�%6��Z�#
�0�P
�}�
�R}Ýt){��o��W
+�n
Y�|ypՑ;-��������V#�_7Z��
�k���^��`�7�Dk��.I�4^� �5����P�j��{�94-L�
�k��i�;YC�|���]y_F�_9�8Zn�s��d��þL%T!Ƙ����y� \�P�����!�t�8�Z�qc�`DNcpϙ��9�2�_K�L�ߣ|�
+��^*�%e��к!5r���g����B���]�
�O�)ܽ{�Qą�O��/Z �X�S�:�
B��1��1�
���6"���0�aMt0��4Hke.�i��_�M�E��hf�f_�zM�7�y:9��QwѼ��UwvL��h+0
+��baa
(
�)��<�����P�
i�8�~�V;�Q�+۔��-�e���]V/V��o�8�|*Ĥ�,~��cTM��u���Ss
�b�0�씌켃'��q7>TC
+�%��>���^�x�l����DMŧ-��ڍo�b?�����G�:��>GIq��oo�~q
�=��ެ��⅟I���˺n�vY��$�����_G�>��
~�V�endstream
+endobj
+8948 0 obj <<
+/Type /Page
+/Contents 8949 0 R
+/Resources 8947 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8920 0 R
+/Annots [ 8955 0 R ]
+>> endobj
+8955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8950 0 obj <<
+/D [8948 0 R /XYZ 90 757.9346 null]
+>> endobj
+8951 0 obj <<
+/D [8948 0 R /XYZ 90 733.028 null]
+>> endobj
+8648 0 obj <<
+/D [8948 0 R /XYZ 90 627.1066 null]
+>> endobj
+8952 0 obj <<
+/D [8948 0 R /XYZ 90 612.8333 null]
+>> endobj
+8649 0 obj <<
+/D [8948 0 R /XYZ 90 484.7589 null]
+>> endobj
+8953 0 obj <<
+/D [8948 0 R /XYZ 90 470.4856 null]
+>> endobj
+8650 0 obj <<
+/D [8948 0 R /XYZ 90 342.4112 null]
+>> endobj
+8954 0 obj <<
+/D [8948 0 R /XYZ 90 328.1379 null]
+>> endobj
+8651 0 obj <<
+/D [8948 0 R /XYZ 211.8424 89.4414 null]
+>> endobj
+8947 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8958 0 obj <<
+/Length 2661      
+/Filter /FlateDecode
+>>
+stream
+x��[ݓ۶��BO�4���q���i��8�u��xnx�c+Q*E�|�� � ARw>�������o�ݟ`2���
�)��a\�V�+<��pEꯗ���-�۫�菱d$���M5�dS!f���sB3�%���.�'�.�{��x��>=��"��{v_$���M-Pf�v�t�.]�V���m� z���r������	i)�
+��Yur�I#���ȷ�%x�
��"�r���~�ϓ��u�
�n�ۅ��tw�&ejߛ-SHH�fK@�A�Wޥ��ZY��� �a!�)�ӫ7�
�\�ւY��{�����M?^a�Y��#<`D������?l�~�����~�knX�͂�K�Ly	�4~F
���e
����(##
SHq�j�����.],�Q�}`V�cZ},:�\K1C\�Q�
+$
���n�� ^�~� `EB?Vt���������vxC\:D���@
F �\�'���%��]�?��I1�
�����>JXa�&�ݛO��c�ϝ���F�
V	&h=yj_�,K#*�7�[�0�	
Q[#L��ۧ�_1��,��$JuT/@�������.��
"y�w�aj�i�dK�:��	-B
.Ȇ&f #~GT�8�"Ss�e:���4O���#�sD�_�a��e�n�0
Q�� q�Hp��&���>˷&�
8�,�dJ ��W�ABQ���ȏ��9_x ��Ff��h�P��x�t��k7���'7����i{�B"F0i֊Y��ݜ�Cv�6��t���
�,��u(���W.Pr�?��^���j=�����_i
A
��`�$!�0�dJ�y+�A)��J��C�z��OMa�S��UrL]f-��"�;�z�mA�<ٞ�/+W��
�j���id�D�R�I�yE��
�:�g��IQ۰���2]�n�a�
N6�D�h��B˶T?kۀ�\
�RġU'ȀeZ
o��	�H1�8f@ϐF�oIx�cH���m�T��\��H��
!
C�H��a����6�� ���xڻ�ky���>������F6�E
�HR�
��d�� ��ۄը 6��5�j����
b��Q$)T㊽T_q�_�
)$T��+?�D���e�~-8P0�T;�VKl
-/$�.ZP��	�^���������i��e���%%�R�N���ˋuj�@57P�(6��K�U�縀:�h�
.��y�yN�Y%yxr�lP�>���AS�*z/ʔh�Q�:���t�sS-�~�
���l\��i��4��
zܶ�=�Oڜ�I��hJ��U����W�r��m��
+zx���c^a�&�Ï풗4% 
.(t�BK:Y@Y�{5 �5��[
��t�
A���W�a5X'p�$��:�-5\'0N�ʄ7�V���<R"�t�D[ψx�5b�)Z�on`�p�"�f뻤�I �F�[�EGi��Ƅn�
I���ۇbo
�Xon��ɜ"&�yF����a� t��*�@�/@��h+�e��bv��օtYP6I8�`� �]�[�
�H
m^�H�8m5(�2���ᾈ�,��%rzK2N:SW
�
4M�����E�K��mNlp��s�l�����H������B�@�(1�&��ƒ�R3[,��Lp��_H҄�d|��i1]�j�fSl�M]͟�r�Ex���6�K�
+�U at p���Op
+�E����8D�`��T��)�S�	�,��	Nx
"8��	�B���N��(�	q�#�7q���7[0�j���t[�:N
+�u��&8&���)�WΈ� ��1!Y.�
$����FB�-	4���)�A�р=�c����|z��W��63�IH��4��/ʑM
�C���~%�%�����YMBV�8ݺZ�}�EV�
��~|�R5���fG?VÊht眄f��sMo��v�
5���B�Q�Uz��oK
�� <R�Y
`L�Hy߳#^�7b�
����
`Oo�
����3@�CQ��l�d؀����s�
2F�/{��)�^����/�4'
�3�C;o.j�d�jh���\�X���p1He��T_q.��
?�|`J!ck�	�Zbc�y�NZ9@ۅ26��K�Uw8@��$���q����KH@!=������Đ���-5�>�%N%�sC1�c�ҵb Z��˸�QD��PϘ87���>lW�_�J���h
L��qF�!A�c�S5itj��;
�C�
�j�RD�
H��0&��
�$�XG��ɱO� �Q���I�X��~�6bfܠ���&	���>-����aL����_�00�+ӹ"���%�E����d��QH��乜���30s�{\C
O10���W̆
����g�1�G�
���d�쥚Iz�u W��15���ށ��
3��y�;fm3�N��w`��ڴ�
3 DM�-��:��<������=t�L!,�_w^�߁C��;`J�zd���e�u�K��꺋����
�g��\�Ơ�H!?��x�� $��Đv	-a�L�wýA���206�Տ>���:���
�⛅��$�)��c������䀩�P�T�3���_Ҵ���	Q�@j����̏~:/�ya�z�w��%��
(�������#Z
�)�����a{ݵ�c�
��`���l�z��C判�:�e�)�ݾh�
>�Uw-zqd��)��k�endstream
+endobj
+8957 0 obj <<
+/Type /Page
+/Contents 8958 0 R
+/Resources 8956 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8920 0 R
+/Annots [ 8963 0 R ]
+>> endobj
+8963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8959 0 obj <<
+/D [8957 0 R /XYZ 90 757.9346 null]
+>> endobj
+8960 0 obj <<
+/D [8957 0 R /XYZ 90 733.028 null]
+>> endobj
+8652 0 obj <<
+/D [8957 0 R /XYZ 216.7638 455.1137 null]
+>> endobj
+8961 0 obj <<
+/D [8957 0 R /XYZ 90 439.0092 null]
+>> endobj
+8696 0 obj <<
+/D [8957 0 R /XYZ 211.8424 194.7631 null]
+>> endobj
+8962 0 obj <<
+/D [8957 0 R /XYZ 90 180.0384 null]
+>> endobj
+8956 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8966 0 obj <<
+/Length 2214      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�~ϯ�Skk��KZ
�=���-�ݓ��E���F�-���9��PeQ��l֋��"!�g83��!e2��GfϔP�0.g���}��?\����/������A��AFR9�}hf�
a*��v�~Nbf�$������fwo����]W�ݟ��*��onZ�:�6��wv}X����jA�N��p�����R�
����z��$�e��w��bI�G�ƻĬ�!c�i�����n���Ow�0tn��MV[��lɘBB*5[�7��y�}���l��
k��l��ѫ�o;�;�r���y��W�?�����7k1{�F�:�^q�Bgs���_�y��_sÒa�B�	��A�2���a�aU
+�&��tFh�0fj��DD2�,��t�����7ÅL�b���SF�t�cK��B��"L
gu�؟w�H?�(����z��X��}�
C�%���>Z�0���Y��vA�

��}^~�.���V~��6��]���p�O
[#�6�J�T51BT�X��p�	���!�2�c��2�J(l
���oN��̤�����n
R˾�D�:1�4/
�q� O%>�8H���ao���.^�ak��.ې����� ��a뻟T̳��N�KI Bι�'6� ܵN��a �i�Aj�x�.���w�Zۢ�����$�����zbS
b��fw�)CՀ�B3vFu����84R]W��tqL�=���y��ʊ<*��
t�E��r�"$�NG�s���"���TsJwe^����H	��(RcŃ�f` Pr����yը �Y��F������
j
���)�l��& ���c�D��y�?ڢ����5ͧG[�D� i�0,T(��Ʃ��������O�ס�$в-U(��<.U��5
+x(�ր�ZLW
}����Ԙy����OV
$�|"�FV���sf����
���6��.�>$�h$pǤG:��1q 1C�A;2���*]D��M��u�����1Y�NU�KJ^���tU�&r�+z�y�*�;�S��g�%�
+J
+�Œ:�Uͫ|HX	��~�����iC��@��+��g�,���)�A�)_'�.��7��C�v��:U�m����z!��M
+�1lH�vއl�O�	#Ɓ��և�:��G�QE�Һ*l�6���n��$}/�Y֧fQ��4��Q�`�%�!M�3'x��(�;v����b���Ж��.�cQ���TԙH
'3���d���I��'S Gv�`�
�Ż��;[�1k�T��ïv�C<L�a
�Ɛ p"ē'c at yڑ�}Yn��S��@=.B�؎�����H��$O\h�Y�r�Q�=¨I_�A� ߜ
+AȤ��UY�Y^�nc�*	
#��u��U
3�"L���
��q���_y�"�M�(ω98���ik��7��ɀ7�F��
wp����;���_�v��pq(�O���
!|F�ği��s���$�VX�vW����O�\�&�c�EG�UYUv6���㤍|T07�qD#��>D�S��P�q�w�����R�kD�j��/�S�'jđ��{]�8�c�82&]#FƜ���kċ�v/��Tiĥ��Q ���M�+�,�˪�ʲ�,ɒ/%Yz)����'�3N�

8���I�Pn
+u�cuDZ���W5X�#[�#�U�ٶΡ�>���=���G��?���K�_�I�>��0g�Wv�Ґ��-�*���#�F����
�R^�v��
�tt
z:n�c:�g'L���t�H��D{���L
�q��i�/u��
F�1/f��	V
�f�N�u�<�#+��I�rd��Yy���2
�L�Þ�ـ�O���gX�〹�
ٔ��+:��a����<}�� �2"'%�w�2��k�_N��z}אJ�5��R�>/���c�&4Њy��Ջ-����,b���3
�����}�)�Չ
3��uunG�������p��Q �.	�	�(s���z�%�?V<��
���
+��'�p���i���
���%0�ka
 %
�A
�B~�Y�$I
7��i	�cڇ��W����n�c�ma�w���կ J��KV
��o;�䦲��`*�U�*�@�����O��C��h����kZ:.�{a�{#|\>.y4�[�c]�n������j�E��P^_�v��]p$sW*l*z�NhdK�~�V*�#[
�/�e�}ņ�m�
u�G�G��)��;�endstream
+endobj
+8965 0 obj <<
+/Type /Page
+/Contents 8966 0 R
+/Resources 8964 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8972 0 R
+/Annots [ 8971 0 R ]
+>> endobj
+8971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8967 0 obj <<
+/D [8965 0 R /XYZ 90 757.9346 null]
+>> endobj
+8697 0 obj <<
+/D [8965 0 R /XYZ 216.7638 549.3063 null]
+>> endobj
+8968 0 obj <<
+/D [8965 0 R /XYZ 90 533.2018 null]
+>> endobj
+8698 0 obj <<
+/D [8965 0 R /XYZ 90 417.8532 null]
+>> endobj
+8969 0 obj <<
+/D [8965 0 R /XYZ 90 403.2829 null]
+>> endobj
+8699 0 obj <<
+/D [8965 0 R /XYZ 90 277.2244 null]
+>> endobj
+8970 0 obj <<
+/D [8965 0 R /XYZ 90 262.6541 null]
+>> endobj
+8700 0 obj <<
+/D [8965 0 R /XYZ 90 149.9305 null]
+>> endobj
+8964 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8975 0 obj <<
+/Length 1727      
+/Filter /FlateDecode
+>>
+stream
+x��ZKo�F��W��J@����E�6�} i���@`D�&*Q*E����P|�K.)�q�
_��pgv���fD�L-�j���BMW�	�^����
�<h
���\�Trj�ULMW�
'�I9]Dog ��y ��٫9�Y�m��9�����&��p�[�!
����J O���~�:�nWq�|���̶x���/~�x	�R�4j��+�}_J8&%�7��y�$�=g��kϮ�k���������~_n��[6�7�u���{ӀsM��z�7��px�u|N��RPPC�TՖ\�bu�b���p�Є�
��=y��N#��	E79��J�Z6�L���z�f�G�O� �7�r/��983�BS�	'�+��
:�5(��d�haL%����4���@sV�g$�.��2w���-:��9/��PAk��ETn��T4�A�50�P+�ϊp��H��x�K 넸U��7����7
P��e��(ei��K��j���,L�
�h={G%=��f�����R����j3V
3 [...]
+�R�"���v�^X*��-4V!�)������(#�G�5�gH#ݷ�
#��
+\
wmpq�cvG/�����+u<
@ \�
O ��U�����>�ʫ�m���&N�A�U�	kƑkK� (EE�܋V�.O��a�|�GP�Y�G�+�����e���}
�I�
����#=��!��Q�4R}cܼ��(�׎1��l;grv��%W���pE���O�"�B%��g�h�OU
Vo�U�%��=�$�j�مy�a
O�
ƿf�Rw^<��'fx�
������
/qǃS$X�$a����a�~��
z�@(����9}3G�K�Ou��=�-ƺP��p���y��(���ʻ���n{����L��;�>��a\.��@Hs��~�(&��ā��)�J�ǰ���D[j�'�A)j��<�S>�=+�<ш=�'F=r䉞1~�p�yb�8
�J���1� �P��L8�
��l��A�@�pfC-��/fCe���ٰa	��;҂G��>	C�n��=N%��aM�
a�c��1 ���Z�O���FD�XrrD䘵Ra�%���0�p
0�I#�π�Y�'�F숌;#VS�����Vd�9omG��C�:#2ˋ�91#��F��"\�l���
A�g��F�a�?�#����S�c̗>"�GT�3k� ի�T�$To-�m�碢z.~V��<tH��
+�����/���1J���x��ѽ�#%�؀�����r�h��[��͎���z
+��&����{�N�i���E����DߌSJ[j�R�`�	BR7�3`�Wz��y�k��gER��
RK��v�I,���v�
ؗ��m
0�h�� iN�nm��0b-p~v�S>�T׊�j��u �
9v =c�
�c���.1� �O��|��1��
PR}�W��(��[
��M��6�I#�(�@��m���m���
�uٷs)gU��=Lo�uy]���b+,K�rM��,f��
�t���M
w�Ì�� p�T>�kZ_�z<l�B�z��I�:ro���7y�������#�=�M�]F��b�[_t��i>�^��lq�/0���ޡmK3�l�uH%).n¢h���|�3�_Z3
endstream
+endobj
+8974 0 obj <<
+/Type /Page
+/Contents 8975 0 R
+/Resources 8973 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8972 0 R
+/Annots [ 8981 0 R ]
+>> endobj
+8981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8976 0 obj <<
+/D [8974 0 R /XYZ 90 757.9346 null]
+>> endobj
+8977 0 obj <<
+/D [8974 0 R /XYZ 90 733.028 null]
+>> endobj
+8701 0 obj <<
+/D [8974 0 R /XYZ 90 584.1303 null]
+>> endobj
+8978 0 obj <<
+/D [8974 0 R /XYZ 90 569.56 null]
+>> endobj
+8702 0 obj <<
+/D [8974 0 R /XYZ 90 454.834 null]
+>> endobj
+8979 0 obj <<
+/D [8974 0 R /XYZ 90 440.2637 null]
+>> endobj
+8703 0 obj <<
+/D [8974 0 R /XYZ 90 281.8363 null]
+>> endobj
+8980 0 obj <<
+/D [8974 0 R /XYZ 90 267.266 null]
+>> endobj
+8704 0 obj <<
+/D [8974 0 R /XYZ 90 108.8387 null]
+>> endobj
+8973 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8984 0 obj <<
+/Length 1847      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�6~����&3��%l�:�ۀ�����0TKI�ٲ'����whR�.���
+�"�G<���}�B�����
+��t����-L?!~y���7���s)�I�tqs�A2���E�&"13��q�rFp�x�rFq�]?ܥI/��q�p}��,^����d�J���bFt��A5{�xq����B�@��`�U����D0�����|1�S��o�xؕ3d
7������l
���n134J7�u\����1��Tj:o!��W�Mz8Y��� �a!���k;;�n���:�+��`���O޼����b���ZL�a�1�N7NY=XO^O~n��
`���,�$�</��&Έ!�|���
z�� ��X�R\k/P=��<ޤ��b��O
ڟ��i֙&�؂C�n"��@��Z���m�8E��x�cM(�P�n�?*É�HfΤ���u��p�s0�7
������Kַ�<]�g��r��o������y
;�dY�!��5�{(�Hb�w=�����tq��3Ĩn5*"jKV�e�
��0`�"�m@�����7Y����K��s��&
+��($)��}�2u&Vw��w~
ey@�P����h�@Q�:�n��{۽@��eq"��,��#�I��]�
��`�P��h(I ��iz�_�B�԰g@݃���Hk� �WTl��u_?�Aّ�C�%��"r����Vh:�!0ƴC�o��j;�&T 5�U�8�Nu
���2M��Ͷ��&ͫ���"
+�3���H蠽�]W��U��2���a
�
�Z߆p�j)kCY%��Pv
G�u�,��vo�1��h$-��9�XҫV�$��%��b;�"��}/�	�-��Il.([v�l%�x�8OB�N"������-".|�%����γ|����*{�NQ��BG�H*a�s84�

П�@�п� R��t at Bf
�bBn
q��9:�:'��Q���j
fwڗ�,�l @��M�[����IR>�@
��D<�����%z����?:�
`�$0pɑfD�#C[�44pMՙ~��
���%a�h�Ρ�����>PF��� ��q���>�CM�_�ŕ{��]�"]͈�Uw:���&p����FB
��h�/F�����8�Z�i�?�#��	Cǘ;��v!��Џ��P�1��g��%t:ɘaH(��3)�&��y�ߞδ1����uD�_�Ա|����ږ��Q\���!�݊�PXY�~�P�0���z�~��B�n)�8��np|��5���My3#�
�U�vZ�	`9�n��4��EZ�
�~V���0�:�Ci�s��t݁��&]����e������>E$޿a�h>1��!�QM�
�1�˜
+_ٶ�����6������cĴ����Y���)��Q@��a{��ݣ�BTP#j���Q.(.�P�@h�:����w�*p��͐(��y@�3
+H;���&n�B;���E�V�($��Nc��,}
�
0�
K��;Ƣ�
JǏ�H
��(���
��KR)H)O�h�=
+R{4Xm��`a���{�%,1�|$P+jĞ�G=rd�c�,�c���%.���h��?��? �VW�~�K��\���P�\}��#��S����" r��G����@2 j{ھ+
+~.:��$�C����4���EO��@���1lD������?RC�
i7_����O7m#:����,���u)��/97���τ�|�~���ᇔ���`��~
�$��wEJ��%d9,�^�i�?T+HcB�^r��M���m^���p�ZG
�k~WU�뫫��{�*�>�vʪ��n}շ�c�{@������-
�s l�<ݱ��^�����0��-G��N30�OG^E�endstream
+endobj
+8983 0 obj <<
+/Type /Page
+/Contents 8984 0 R
+/Resources 8982 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8972 0 R
+/Annots [ 8990 0 R ]
+>> endobj
+8990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8985 0 obj <<
+/D [8983 0 R /XYZ 90 757.9346 null]
+>> endobj
+8986 0 obj <<
+/D [8983 0 R /XYZ 90 733.028 null]
+>> endobj
+8705 0 obj <<
+/D [8983 0 R /XYZ 90 580.1055 null]
+>> endobj
+8987 0 obj <<
+/D [8983 0 R /XYZ 90 565.5352 null]
+>> endobj
+8706 0 obj <<
+/D [8983 0 R /XYZ 90 349.5484 null]
+>> endobj
+8988 0 obj <<
+/D [8983 0 R /XYZ 90 334.9781 null]
+>> endobj
+8707 0 obj <<
+/D [8983 0 R /XYZ 90 176.5507 null]
+>> endobj
+8989 0 obj <<
+/D [8983 0 R /XYZ 90 161.9804 null]
+>> endobj
+8982 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8993 0 obj <<
+/Length 2269      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�~ϯ�Sk5���X,���ض�t&�>L�b+�Z[v%9i�}EJ%J��dv�h�K���\���a�#3�gJ(d����
+�
`��W����]�?�\]� �� #�����3H�0bv��0'1�X�����yR�۷
�����c�)��?gwER��Vޠʒ����]�9�����bA�|7���͏�?�Y�*X�p�g���Y�F��ߑ�-�T��w�_����2��̷gg}�M��Mw�0t��ۤJ�s�%c
+	��l	�0B���w�}Z�,��ΐc���~Jƍ
������u.Wk����}��#�m L?^ap��g���Cg�+NYs��z��v
���ܰh�9�k��� M�Zi�0Ѱ+�	!"�� ���)*�Lכ�Nvi�媿Q�)R��Yw�� Hk=DbT2�a�4���.�	;Y��jc5\U��C.�W�yL]���yYI�W>������2ݸ��}�.���<ݥy��蛰H�5�OǮk5
;���+�����C������� E<n���QV��*�
ϟ�m��M����� ��H
+��I��VC0A8)fH2���<����E(�w�A���1�R�2�+��rWyΦz�Jgb��c�m�|��S+��
�'&G�
�LS�|�d��»���~wH��n��.)�
>ci�؉�C�xޯ:l��YH0��{C�n at V/�4�X,!o
�kA�ô
f�0��<p#��S4��qc�dik�m�Bc�l�i�P�s%ڧ�_���Hf��
Ê���4�Nǻ
�^Fل�(4ٴZ%�ͭ�]��`�XLAv
��
�}�RB8�Pj[%a;��[�W�Hi#zI
2�`

%�Z ��H3͇,�fy�1RKT��m�
+I�]m�~�i�yH��t�s��� ���R��z�60d+:x��/a�7�M��
"�@�|��t��{� Yh���[��
���Hkv��O����������%��WPu��
��.y	��t� b^��x`��a���v�&
Ʉ������SQ��jc�y�`�#'q0 ��
qK3.�[\L�Y�j<͸��2����
) �M�<��sm�)�Bg49֚�j���>߾�+x	<���w��L�j���;��.����n�bQRpM
;&�E���f��^�ey�z���L�ǚM��EZ

�`V��g�'
vP�qb`q�u�o��>�zJڤ�m{��/���
+�x�zICI�/ ��K�(�VǼm|nV��''I�%@)Q5��'(�zH�jr��
�u�w���c�B�0�k5a�|�=�X
*Xc���~U<x�w]j��"44��慺��
6Ef��I�?=LvM�3!�
6FgpP��
t{�c�j���Whj
+i���=gգ�~���2݅b�>�C�N�%;��X
0h���~>�>���mFA	p�-�g��R�Asܞ�
ݱd�C��
g~}![ ;q�0�k5ވ�0��)J>`���5_k�	`�|#�'��Z
��Iya�`t�l+�}�2��֟��w�wb�	�N5�m(v�E�k5?
V�\(�It�Б�x�Z�ϓ�9����\�����6�
�H+NYS��?D��>�sigT��R3u��K��u��/�0�1t쀏��>S��>�"}F�<�;�؋�<3���
��@�1���!w�Uj����G��@�i�
k�ޥ�
EBr���*
d�EG~����P�1�'���
\J�@�7gD��/��$^�O�x1x�!
$�3:��R���*�'$ny�3I�l�I<��V�ILj�ׄ�
(�ʍ ���ө����2��bˣ-3�y�AC��e�_Aa-OR�&��T
N������n��k�
�
�A-L
��Ѹ� 
+�[f��Il�	������)���ڂ#,ϸ�5`���tbZ����
G�mUIq&�
���B�jI���1��TT�(F�ژ}�r���I9�ĕc &T�j�W`,^�'��j��}�H�^�s?�rP�z
ـ)���h�k���n8���ӂ�=�	�h��s���V� h���,���'���w !�"TvPo�c���A\Jt�"��.h(��> v@F��a"PW�����.���
�z
^�����.����ZQbű�mԱ��*����L��.���W��$�1ٞ���T�
Z���P�TYy�@\By�҂j��x�}��Ys����i
Xv�p��:[
�k7�XU������3Z��g�e��᰽
�+h
C�mi"z��h�%p?z��̻X����_f�
w�0
�Q�����wo�endstream
+endobj
+8992 0 obj <<
+/Type /Page
+/Contents 8993 0 R
+/Resources 8991 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8972 0 R
+/Annots [ 8997 0 R 8999 0 R 9000 0 R 9001 0 R ]
+>> endobj
+8997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 376.6536 212.1242 387.5576]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+8999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 202.4887 216.2973 213.3927]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+9000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 106.7534 483.2121 137.7221]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+8994 0 obj <<
+/D [8992 0 R /XYZ 90 757.9346 null]
+>> endobj
+8708 0 obj <<
+/D [8992 0 R /XYZ 90 657.9357 null]
+>> endobj
+8995 0 obj <<
+/D [8992 0 R /XYZ 90 643.8626 null]
+>> endobj
+8709 0 obj <<
+/D [8992 0 R /XYZ 90 438.9268 null]
+>> endobj
+8996 0 obj <<
+/D [8992 0 R /XYZ 90 424.8538 null]
+>> endobj
+8710 0 obj <<
+/D [8992 0 R /XYZ 90 276.7171 null]
+>> endobj
+8998 0 obj <<
+/D [8992 0 R /XYZ 90 262.6441 null]
+>> endobj
+8772 0 obj <<
+/D [8992 0 R /XYZ 90 89.4414 null]
+>> endobj
+8991 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9004 0 obj <<
+/Length 2213      
+/Filter /FlateDecode
+>>
+stream
+x��Z]o�}ϯ�Skk��i�@�;[t���i_�CcˉP[�Jr2���%F�h�3��� A
"�W����
R$3
df�L	�
�r��_��
<��i^��˾�_�/.�bf��Tή�M
�!L��]o��	A�,�c<� x���d�zA��=ܦ�2Y���/����5��d�{X�I7�u�Y�.D�
�������^�TAo�>���E �`D����|�XR������M�Uΐ1ܴ�|�d��풪r�]/
����.�S��lɘBB*5[�7��y�M�M�����r��m�	l�^�������
+a-���/o������

n�bv7c�l�)�nv?_�ӷc ���fA�9�L����yF
Q�Nv�s���
��2�׺5�i����R1��O
:|L��,xL�s
A��\tn�
ww6*�l�::��v�	�9T2��ϊp"4��	�A��F89�)���S��Z���,�ӲJ�uV�+���&��1��
�.򪶷>�Cl�C�FJ
+�
+�i|z��#ˆ���;gaTh�����i�#ȵ�	pim�VҔt����]���!8��pI�@�W
+I
+)d��s3m��
�"
PpDuf

y���mVEP�8&�&u}�����Ӽ�Ϫ�Q?XܓbF�fp!�A�?Y�ob~�H+)��
+�(��a��P$�d�/I���3Z����J ��1I\���N�c�հo�!]%��G ��� ~!�	��ZU��پ�x~���*)o�{��(���\1�o5� f�p
���-���6��XA-c�g��(RQ���v��mFl2pa���r�0I��ߥ(R3�H��Q
A�	�
V<ê/̰��aX
�`֧-L�
u��p���{<
�r��8�ϰ��>���p�
�6I at Bb=o�J�Hd�� X���Wv��s�U„@��m�kҖ�&*�e|���`��BhkޱN;���z�,�
+d�&�o��:I�VLD9M�}��T,(X#�Mű�'�x�"N���Өx�#�T<�� �
��X��TL:���ǎuH���bJ��b�:��E�s�<I��3���3���V�M���!Z;�4W1(
Al����*ۮ�	�v��Ȏ|�Q��j?��I8��]Rl���3|����|
.��o�X2�}�dl/[2��q2V�r&�I�*(3�N�B#��q�
�ccc�ll��K<�������
ݕL	1
�tA��%P���d}���Pt
Nm @dsN�a� 2�x}�͓3U
ӧH+k��i},�t��g#,���q
+ �]�n�]��*-OtsR,1P�P̴X�[�KL�gk�X�Zi"���٧i�I�<j���V
+��h��VR/�_`�C_$
�����
MZ~Ķ�&��>e��
������oP����o_���n�"9
��C�O�!�Wi���,[wUgk�'DU�q�4��ꋍ$_��
$!����ou��� +��g�X�L<Bgbo�iL<�G&
��3q 慉GL�_��
01A
+ˀ�8��)�"�C�?b�"�B��<]AŽ�2�>
�۞II�,���r�F�1��26 9~}��R�;f�^~^JJ�b)���Շ�S	Uհ�t�:�@���2-�oE�XȾ�7�?BͿ+���
�ͪ.������+������з�~�h���>˓��Aʖ����)��Vt�6s�`ak����� ��6�� rʜ�"t�F��6`m��	m :�=��Ju����	��i
zC��$�Sy�ڼ�sBg��0�q�MMmԅK7|�/P �
+R5 5�'o���
�C(����$^h���c�i>٩l����1�`��=h1�mn�����X��6�a��x�+�@a�c'�=�C�V�Lp$��4P�buHיm��l��!V�3$ڌ���ɻQ��A�P«�Jh�s�����yViqH���2P�=esZ�E���zC
q��Y��"��˜�]T�uF�>��VOs
�y�-���7���۬�U�A4ڭG����%l��C�&n�z�� �g6�l%�b��2|�t{��x�
��=�m'|�m+p�Ϳ����B�y;�$�1ٹkKLw�)�-����WTY6B���?��i����K���κ����g�²��K��];�ۺ>\]^��ߣu��yv(QV_
��!.�!�(h���[z����
2F*�,ۢ�D�/J
���@4�j�P�~��endstream
+endobj
+9003 0 obj <<
+/Type /Page
+/Contents 9004 0 R
+/Resources 9002 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8972 0 R
+/Annots [ 9011 0 R 9012 0 R ]
+>> endobj
+9011 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.6427 141.4652 229.7369 152.3691]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+9012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9005 0 obj <<
+/D [9003 0 R /XYZ 90 757.9346 null]
+>> endobj
+9006 0 obj <<
+/D [9003 0 R /XYZ 90 733.028 null]
+>> endobj
+8773 0 obj <<
+/D [9003 0 R /XYZ 90 624.7663 null]
+>> endobj
+9007 0 obj <<
+/D [9003 0 R /XYZ 90 610.2824 null]
+>> endobj
+8774 0 obj <<
+/D [9003 0 R /XYZ 90 496.5158 null]
+>> endobj
+9008 0 obj <<
+/D [9003 0 R /XYZ 90 482.0319 null]
+>> endobj
+8775 0 obj <<
+/D [9003 0 R /XYZ 90 356.3101 null]
+>> endobj
+9009 0 obj <<
+/D [9003 0 R /XYZ 90 341.8262 null]
+>> endobj
+8776 0 obj <<
+/D [9003 0 R /XYZ 90 228.0596 null]
+>> endobj
+9010 0 obj <<
+/D [9003 0 R /XYZ 90 213.5757 null]
+>> endobj
+9002 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9015 0 obj <<
+/Length 2754      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n��}�W�)�������,���.��Ό��ف��(��D)e��뷚ͦ�d��=�

�`�*vUW��ԡ���<QB!ø�,�Wx� ��"��s�~�������RL
2���ݪZA2������)!��ٜ`���3��I�M�ogOw��u�,���g��x����,�l��ߦ��"]��3��;�P�>��x�=!-�T�6��>��ON"0�`DY#�
��lN�~G닷�U9C�pS?����n���-w73t�n���L�s�9c
+	��d�0B�ꑷ�*�v��
'ȱFX�zI&��{���u.Wk����s���,�~���f-&O�#b
�l�8e������?�u�`��E����I��t����cRS���@
+ބ�Q��R��I#f��~���*�Q\O�
��z��^A�zoK�[����6-�rW�����_��Ռ���Ӽ��Έ�������?��w� }�a0�
y
��bC^�b��e��Y^��U/!l�
��R}���@�>T�8�m���������K��l�窜x���Kw�)+�^몪�M�գՑl����u��&R$(�Q�x�y[�_޴A3XKĕ�����"��p�91���3"
��5�P.on�|��-�&[�'E�ŮQF#)vH#�7&��
�c���Ξ��3�ҟ�����	��z�	�i���n�_R�Wdj��
��U?�
Ow
+i�}�O򥓡A�׈)�
4�6��
+
ns2�l
UV���e�e�c^7J�\��#���>)���:�}Fw�Qk��$�w��%�w����,q��d����$�Y�D�f�
x
�1�^E��ܢ Al�p��P�>C�#��՗;
2�vG@�q�S>��<ق? c
�Ђvo��6
n�(�.
!�� T(��ģ-��l��CV>�`媎#Z-�Y����`fw��ԸKz�%�
R�T�9w
+>�on��k1�{���m�P��z˿,K�,��R-VRb�x�^v��� ���f��*98x1O���j( �O��T[Ww>(���É�˴b�B%;E�J�O��鷻���"��_IV
nn*;����ztj�b
� �4Ɵ�#i
g�����2g�.O��F

�$1M�h��k<�SӴS�g���C����B�d�
�

�CU�3-w���IJ|I�磅
��S
u��fϓ	$T9��U3�_���v[������[��4(��8�R�c(.�ꀄFj��5�qJ�֜i ��~�y=���c���w'����:拲JH�i���Y��>8`ٮax
�m���J!~#f���(\�P

+
Va툡��>]d��t�n||�i��2{$��E=�f%�J��`ăh��Y(�`����m��P\�}�p筺�A�-�b ��
��=K�x�kE8��Djڂ�����
S�����fD
B��f�z�Zg����5
Ǐ�2+�e�<?s
�B ��m�!�z�Q�`XoC
���Ƀ@�o@
p	ᬉ�ZKl�k^�R�`X}C
���Ƀ@��5y�!)�Rt�b���W,α=Ev1{S>]+�Ć{
{0�{�3&�
�|e����
��=`�+{�?`8\�Js��E�
��6J^�
<�9��M�
X�0	5� ���B�
+	h�/�*�ڂ'�aݗB`��w��>%%��H7��mD#�����H)<m���ִE��`DF�	Ba��̄�y"&fd�JnB���4����5����ځ9D\ع^i2@\hD�a�$.�sfjڜ� a1�QE�2g�
*��#a��USB��".*��^��h��A����kZ ��[6.p���
+`
+[��A���������K]k_��8�: �2�ev�Pn
�e���Y/�7O��NQ����Ǚ�S_��{������$�)�CD���cei[��-14��^;a�Z�	�q�Ͽ��0!H�)*L	���f��;�y�伽f墶�'�@!3,���髨"�ҁ삜��B�տo��O봈�C'�5�e8G&6�t�U3%5!� ��nZ��
$��HI"}$�wmQ69�5|H���9�zi�,Ҷ���������DҮ�n?�s�ٴ��A���v��K���_�:����
+ D�ቲ-u~��J ��x3``��Y�*�1lp�'��6΁j�a���)dmg2�'��,C�#"^a�)
�	��
�=H[l��^,��@������^���C��p�5�
U�_P[~��EKl�^l�
�ې�=�qR0�{1)Xd�p|=gH��I;��8�%6�T/v)g8���
{��a���-�Ӑ3�7�w���K�޵�λ��y�^�޵w����R��s�h�80�:Q���_$��L�/�	 hA�ȏ��R�Q�� s1�S>O=+��Ԉ��g
�ȉg��c����
�vo��yF��
{�z"�s�b�h/����e�f���iFsR��3�E�_�t�(#ŗҩ:.IzXW�<�$�S��r�7�����[�"M�ok����|���K�A���Br>��Z^6��Μ����y��"���қїh�B�������RC}5h;��-#�rk���z돞�ukR�}��!-~?bZ��$?�m�O>ڥ`�h��bh�T�s8��K�?-�
+�
ā�ܷ������~e����pm/�
��ڍ��rs}���t̳}���z��\�����
�޼����C��
+����G��]QG���mS(�,S~_��Jendstream
+endobj
+9014 0 obj <<
+/Type /Page
+/Contents 9015 0 R
+/Resources 9013 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 8972 0 R
+/Annots [ 9018 0 R 9020 0 R 9021 0 R 9022 0 R 9023 0 R ]
+>> endobj
+9018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.0888 550.7654 246.7668 561.6693]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+9020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.8986 308.7431 431.9768 321.6609]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [338.7485 298.0666 444.5106 308.9705]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+9022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 137.4035 513.9963 148.3074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9016 0 obj <<
+/D [9014 0 R /XYZ 90 757.9346 null]
+>> endobj
+8777 0 obj <<
+/D [9014 0 R /XYZ 90 637.4462 null]
+>> endobj
+9017 0 obj <<
+/D [9014 0 R /XYZ 90 622.8759 null]
+>> endobj
+8778 0 obj <<
+/D [9014 0 R /XYZ 90 396.7026 null]
+>> endobj
+9019 0 obj <<
+/D [9014 0 R /XYZ 90 382.1323 null]
+>> endobj
+8779 0 obj <<
+/D [9014 0 R /XYZ 90 116.482 null]
+>> endobj
+9013 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9026 0 obj <<
+/Length 3073      
+/Filter /FlateDecode
+>>
+stream
+x��[Yo��~ׯ��dX��>�Hv�
l����x
��(��\ጬ���T�MN7�C��8Y�a
�)v}]]]�7-6���
�e�RϮWgtv�8c��
��B�?_��������]��#hA(Wjvy�n�n�1J�����y^���
N���}qS�W-?Ty�tq��e�\>]�)n
�����Ղ��n����?��X����$�Cu�o$"H�.:���7��+:����7�Q� �I������.�ݮ�r���Xm�����f��(m�,k8�X�ʛⶨgV��AI-�J�!������eg4�4�Z%���>{���n`�~<�`f�f�pC	s��Vg���fy�����8��҉�2+&���
,�J��D��b��kA�ȱ%3�Hk���i[��U�Ȍ���Y���y�XD�Yrm� �v+�\[E����G��My�(:�ę_k�a
�����<�)K�n��9�����.�)3(F��c.
����]�.�|Y���۟(���j۸p�����R��OT��
ȫ2����L�"�b���*5'Ax���Ƹ�S�(8�7.�	��ܬ��>�>l�	}F�Xk��X�V	���:���j~�Y��
XW��.�����~һ
hů��7�YrG4�~��J�����u~�)j�^�
�a���r�����\5�{ѣ�\9ܜ��o
+��166�z�*��~�B(�ƶ��K��,a�GB�~[^�{�.��?KFPF4k
0�����Ly�w�z	�����ic
\��l�ҟ`���;�26͋<���2��AE�$�v���/w	�ܔ	�	��m�����& N ��g@����7Z�b�- ��V�_#�%�5,	w3��*rx�
���˼	E'��/��"�5
��A��.��7�����>Pi�+���쥱VhΆv���z�>.���q	̮�3���� *
+���}4�1!;�f�
Y����i
��(�.�u	�kE��`������ X=�
 V�t)��#fᐵ�B���0+�*M܀�_;�W	������"Rx�����R���=�h��#�E#��MwJ_~��/:ש�vMn��!dnn�����S*��W�J�[+b�: �T@���+<�|��
6��Z��V����d�|���d�q���m��R�M�`
eMh��R��FøO��-`
Ea���%z[�,֩PkB8����$f)T�0��E���kg�(�XJ� F'<��c
+��3(|"�P�8ȥ��	
t���+���YC����X����>_{�ؕ7�ۏ�$mW?��o�O��
5��0֤����؈q;�x�F��#(�'4�RCͱ��選��|9�Fla9�b��1Kx�c���Q���@i��J�Hig���
+�k˴U����#��X at -Sj��sBѡ��t�@l̠�X��|�
�א���W�J
�Ǧ�
+
+�b��m�3��Z?����.^6�ūƺx[���m�aJ�lё���=�`i�~��l@����a��=1�aJ�Z�&�,����< 5�fN�'�P�x&P��H]�x��uQOl$
����S�j��nsqQ�/DT�+o�>(g��P��Z�����
+������}���y�՗����T7��P�v�e����@]m$�4
�������
Ճ���f�D��0ĺ��@7�X�h
\���beUѠ�)a�p˴D�DX��F���s���P�U�x={�L��@k��:
MÁbY���8�z�o.��c�ͯ���W��G�3̜�X��4�s�������T:M�$���U
+:͡0ECN��|���s�ִ��kO�lܩ1�;��&�d5���x+�ݍ��LOw7�8��W�O������rH���
UZ�-�{�&f�����9��
�
ߑ_�����M�"I
�&4]�?J
�q��Ĵ��
O�⭧Y�Y8T��1ʸz�s��x)�,���ߥ�sfV�Ns��ϣ�m<��+b>B)�$�utK�V�� q�Nƫ
+�c-�*c^�Ku�WE����s
q���WE�ށ�2��,�t'��Թ��#U�	������9XBR�����{Z�,|!��
�
�=���@����=
">��
��=��^D�B�m��[�/�|�bU9�(L }����"�� b=hc��(�5�D�."3)�3ixO�3���`m��'_��q�T�Of3����)���Y(������KPR
���
̾öR膣M�Bb���}i t�-�"���ʄ��δ�#ݘ�RAŒt3����z'4��+Z��1%��L��弐�8���P(6f�V����r
hNS���R�r:w��8H�Y�K�I�82�t1���
2�V�H��ţ�
r-�����
J
��܁���,TJ�Ȓ
P�׬{
5j�
5 �f�"0!
Ņ��Q�T�'�kb�4e
�:�
� 	h���AHu)�H�
���階ޤ�v�@�$ơ�������W�
��T��C5��X����X���
+\Z3	`�����TT�;ź0
+��HN쥦�;��`�E����<������R
xE��'#`����Q_�'+xH��O�	�҇S
�;��R&>�'��	x!<
�j���b
Ɯ���&
F
;�&ȉXΜ�X�n�g�D��n�Pu*2&bDp�
!�D
�"A�`/l��ϟa���V<
�Mm�aS+�G��ѦV�Y0
�췴^f�,b` �+��C\��
s�
+F��Ls
+�� 
+�g�:��K0�
10P%P*� ƲI�Ћg�|�Y��~.U�1B�`�ݵ��@7
m���ڟXe�xSJ
oʘ��Q�N>��Ii�HҍY'6EÌ����
Ԧ��H�gbp�PRL�x
+��L֊=����11�i&&��B&�a��b��Ԉ%Z�)&fTg���u���P�cb
�)�u�=��
"��������M[0$4}������d_#vl/�m�_�f�G47���oJ�}>�[�~�}��������y@�`n�XX���Š���@Rd,�R��f��_��^Ȃ7� 
�
������珏��zG
��"��|�]��z�
����e�� Kd~	�Aj#,����զ��Q���ށ$u�"�?0g�endstream
+endobj
+9025 0 obj <<
+/Type /Page
+/Contents 9026 0 R
+/Resources 9024 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9040 0 R
+/Annots [ 9029 0 R 9030 0 R 9031 0 R 9033 0 R 9034 0 R 9035 0 R 9037 0 R 9038 0 R 9039 0 R ]
+>> endobj
+9029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.6167 666.4224 476.6033 678.0615]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.8928 653.1885 498.655 666.0636]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+9031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 495.0112 513.9963 505.9152]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.631 400.2807 429.2969 412.76]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.2148 388.3255 409.9769 399.2295]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+9035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.549 257.3593 195.1053 268.2632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [334.8835 174.5839 440.2823 187.0632]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [315.0077 162.6287 420.7698 173.5327]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Generalized_Image) >>
+>> endobj
+9039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9027 0 obj <<
+/D [9025 0 R /XYZ 90 757.9346 null]
+>> endobj
+9028 0 obj <<
+/D [9025 0 R /XYZ 90 733.028 null]
+>> endobj
+8780 0 obj <<
+/D [9025 0 R /XYZ 90 474.8665 null]
+>> endobj
+9032 0 obj <<
+/D [9025 0 R /XYZ 90 460.436 null]
+>> endobj
+8781 0 obj <<
+/D [9025 0 R /XYZ 90 249.1697 null]
+>> endobj
+9036 0 obj <<
+/D [9025 0 R /XYZ 90 234.7392 null]
+>> endobj
+9024 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9043 0 obj <<
+/Length 2663      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���S+�x����&@�ۍۗ�B�-�&*�*E�q}ϐ3�
Qڵ����X,E
��͙3��IKf����3%2���������w�=N�y������R�
2����]�A2������9!��EB0���
��i�I������C����_�*�����@������C���f���jA���������3HX3
�Ys�o%H#�:�o�W��
+<������!c�q���֯��nת�^:�6�uZg��Y˜BB*5K�FҼ�!�˚�e�m+ȱFXH��	f�^����o���Z0��_|��g+ئ�/0�Y��|��Cg�
N��������
� �knXt�9�-ք�A���D��@�hX��Q
Wш�a��LQ��d�Yܻ�n�m����j�H�)R��Y_�7>�I�Ql�B�0q�ja����U^,8�?��|�L���&+�(����/5#h?f1C��u ���*T̟
+$�������ȣ}�r
+~��a�#8ׅg����V�~�w�L�Sx��m�2:_��
lM���f����:k!=��C������]?D����8�����H�E���4�󘣈�*^�Q���X+	��
k�<MG��$
N�4
Q!؄�}T�;�� ��I��q��6�h���ղ1G��B$� vR���o���b�X���"��ֻ�M��L#&$�$$Դ�gWW9T��4�6{�'ϛ�r�"I:!� � * �!";%��2ս|=�����S�
��G��6+�
��Jm�тo��6
n�h!��tWf���0�^�і�2_���U��E0�T"�
#�E���`f�
�,���SW�91�z���)74��#����+@�����E��7�=��i	�@��*�Vyjs[�-,
+'�>�*����w����o���ιC�a#�YZ-���mk�nׄ1��M��B,�7��Yf��1��_a� �Z:4��}�]-
9��q�
A�G��.���9��e]�y���j��أ6�)
4E-�Ac4�ƭ<�){��&/Һ��p8t�I��&[��Wfq��-��l��_m��*�ՖNH���)��1/ְ
�"�/�:
gB��}�O�K��M��u��|��\���)!D'��Fݩ�Z��X��fl����>�Pe�m֤}� .h]�
k�P�4���`X�U��O�/���X���K�&��][�fZ�]y��B�j: 9꾝�[d���"l��[�MB�*�":�
D%t��\�l����D�C�<�
؂��(u��M���
A�Ne��9^����=��&(ȼ�
h'05vy̍�?b�[I
�S����q!`S�B��H�*=�]j{Bq�,4�Į�'v0�_[�1,Ni�5�0ٹ\�A�4�j��적%B��	
�]i��
������
�����
=�mZA��>4\��A��@+2=������
´'��@У�YutX%Q džUAV;�^����O����
;z{֠�
+�^7� ��G��|����oW�4��7�����^����n�
�H
_��}=�)�y�A��g�ZB��ƆC6'F��p��b�ɪ�Qi>BA

�n���=o�L^��f� b+j{�	�ZZɎ�'|����ihѸ�i�^jlz�U	�C����^�o���Qn`nҒ��h_l£�X��
�KHҖ�6���C�J�
Ԍ�|�UFH3#ݖ�MY4�-���F��_���^�7,��w�`/��H�`����;�)�~lm?
V6��k�������k(�]�]���뺟��{Į�h��#A�	B�/u��p��jSr&!J�Ƨ�o��H�y�/#D'=r DG`�h �O�r
+O�Å
��M��	#�6��/Y����Lse���!�-E;�"�ö�Qs�g�3
�*�f
Ι�
١J�#9#�a��ّmA��0I������/�8���ʝ��D���.�F=IL��Yɕ!��)�.�(�ܦ�C8]
�0–a�L�1��.�O�_B�{d�#�m��
����s�ƚ
+�	��}G�	���N�K�GǸy*���H8�Xt�z	%$ �
(�o��R�#$L�B�W  �lj�`�@p��'u	`�֗��9H�p� B�AZoD8H[�(�~�d���7�9H/��_�p�#�!	h�
�<�Ar$�P�#�I���
��5��K���ڶ����?;���2����` �Ƥ�2B at vv-FC>������Ԟ& 1������)R !�w���
$����vx%���(ɰ�Ja���@R���OO�}��!��J~01
��ħ�N�9��92g ��(I��J��N_l�}^�
rڲg G��
d`��f )�����O{bS>�b�0�Ӧ;rd:�@�M���suʣ=�)�z�s�i�
92g �o
�4I$��LN֙���:C4m���
d��D��P�ï�2r�#r&�@`��7����
�V\K�E�A�_����7�
 5ELЎ�z���b���r��'ۏ�l?�c�U�]1w��[Z�}����hUAcܹ
�b��T�i���?d�a���"��ڧ���� [...]
+endobj
+9042 0 obj <<
+/Type /Page
+/Contents 9043 0 R
+/Resources 9041 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9040 0 R
+/Annots [ 9045 0 R 9047 0 R 9049 0 R 9050 0 R ]
+>> endobj
+9045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.549 691.1004 195.1053 702.0043]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 594.1745 422.9245 608.8899]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+9049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 322.4928 425.662 337.2082]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+9050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9044 0 obj <<
+/D [9042 0 R /XYZ 90 757.9346 null]
+>> endobj
+8782 0 obj <<
+/D [9042 0 R /XYZ 90 682.134 null]
+>> endobj
+9046 0 obj <<
+/D [9042 0 R /XYZ 90 667.5637 null]
+>> endobj
+8783 0 obj <<
+/D [9042 0 R /XYZ 90 410.4523 null]
+>> endobj
+9048 0 obj <<
+/D [9042 0 R /XYZ 90 395.882 null]
+>> endobj
+8784 0 obj <<
+/D [9042 0 R /XYZ 90 138.7706 null]
+>> endobj
+9041 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F7 574 0 R /F8 568 0 R /F13 577 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9053 0 obj <<
+/Length 2390      
+/Filter /FlateDecode
+>>
+stream
+x��Z[���~�_!䡑�hv�M[�m.@���yr
�+�H�BR^o}�p�����z7��%���9��|C��0�#3�gJ(d������`��
�<^��eW�/���I13�H*g׷���B̮�7sB3�%��_-�'�.Y�ZP<�o66-����H����F�ʒ��a�ڦǵMW����=�T���?\~GH� U`�p�ϙ����\"Q$�!_-�T��7��x=��3d
7�;~T�_�IYzu�
C�vw�&�u�͖�)$�R�%D�A�W^�[[���k/ȱFX�F%ܭ^|{
����Z0�_/޼ų����0k1����1t����7ۋ�.���憍�Y��<S��WB�CL6ɮ:!�W���S)SHq����`�dgKŨϟ��L�e-���B@��ͭ@��V❫�}�zC�x��Pȡ�q�?�‰�Hf&�e ^JDNHS��L�S��Q��puUe;����P�{v��rL�����yY����
6ѡD#%E�Z��>�0�?q���KK(m�>���Z�U�"�L�� MI��M�o�ܾ�����P�$ [...]
+~JM�`�8�Qq�ȼ�`R�_v_��)�q��v�w鋷��qn��� 1H=b�(�il��V���#�a�R-�r�? 7I��U�DZI�k�D �T+��f���l��d[���OD	��L�GB9��H&���Lg2H=b~����bԷ�a`�f�i�䣆[�eWj8Ya:B�.!���Өo߯�� f����G���8��^�
�0q���(���*�
��%�,]%��qg�j��H:1� 5t&�m� ��:r�zS�T��s_����Q�$�<3�M����/��ԴUR4M�BI�%$w��8�*��Z42O`�B�(�"���z�K=�R��|�� _�7!_`K��T
"N��ϱ/W	�q/��}��
�i ^L�.�r���
ʗ*M�/�x#�)����M�P&���)
YU���w���y`rAgƴ@���_�
����)�Q>�4R�'1	����Hc}�E[�_���l�)`��k:%��� �>uH���r���^�ݱ�ͺ� 
�����.b�]q�? ���F���H���|(a"4�R
�
�����֛f�g��~�.�,8����
]����};�Pz~�a����l��ۦg�WL�G�VW�<��F����E�0�*[L0�1&���q��BYE�a�&�����hT���Mb�/|�
M7&͐P��@b�ּm�ݱ�ƚ	�Nڴ�tc�vϫ$s����XCK�E�<}�P���)u/	��Q=��#6��V�43�\
+��i����j�K��*dl���o"�����l�
��Y^�p��&�Ť
��^}�8vRd	pR��`��=H�j~�ݴkq
K�
+��IA���u���9&��:`
�/�+����U��ߎ��a�0������s�����4�/;�#��ku�t�[8 �6-ȅ��?�H�g2v��� 4�����+��K)����z�g�
��	�7� qS;R�JA
+k����&�{q�	[���;��	v���	6r��	vp�՟O����� JF�8��G��
�r��9}�)6I�UyH�v�\A!�,L��9�J�<�Q�
�����h�|��e��n���s}�7ИB����4-G����ط��|s�!��Y�#�u�޹�u�>l+�9k/�
������=g�-AO��]�J�ų3�B�a���L�J��I�H �T~�s`b.
<�KA,��(7������s���uHN��:��~��G5���b
�I�YWj"S��OfcƧ����L�Z��
�6��6+[P�}g\x��ӑRC'z,�"c0���X���5�!1�|���hl|�b>����
+B:	7؎��?^'@���oz���<�V���N�� �J5�'`�=
�#V�v)� ��=��[�e�_�Q�z��%��̍�v�D�
h�Ž��S�Fh�L��}]�{Ҁ]�F�(�2���'��|W�\qܒ+>
�1a�~
�:�
���
8�����b�OI�ҽm��}�a]����$BF X0=];B�+!
�t!D�F�O�׾�㵕��@S?Q���qԵ8I�&�b�
<Ɓ�s�j������w��_ ��Jd����Z'�}�r����m!��6P�o~.m��B�y��%���|(�oB|��P��U|(,U�S���Ñ�`�
+P�.���ˬ���3$���7ډ}��@�����W�����h]�c�

+�U����r�3���02'��
B_��s�� ��ܶM�۷�M�
w�#��:r_�F\�
+�g
endstream
+endobj
+9052 0 obj <<
+/Type /Page
+/Contents 9053 0 R
+/Resources 9051 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9040 0 R
+/Annots [ 9056 0 R 9057 0 R 9059 0 R 9061 0 R 9063 0 R ]
+>> endobj
+9056 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 678.3775 322.4458 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+9057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [457.1796 678.3775 505.0991 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Time_Elapse) >>
+>> endobj
+9059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 447.9049 268.3399 458.8089]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+9061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 219.9929 300.1613 230.2741]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >>
+>> endobj
+9063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9054 0 obj <<
+/D [9052 0 R /XYZ 90 757.9346 null]
+>> endobj
+9055 0 obj <<
+/D [9052 0 R /XYZ 90 733.028 null]
+>> endobj
+8829 0 obj <<
+/D [9052 0 R /XYZ 90 623.8069 null]
+>> endobj
+9058 0 obj <<
+/D [9052 0 R /XYZ 90 609.2366 null]
+>> endobj
+8830 0 obj <<
+/D [9052 0 R /XYZ 90 393.3343 null]
+>> endobj
+9060 0 obj <<
+/D [9052 0 R /XYZ 90 378.764 null]
+>> endobj
+8831 0 obj <<
+/D [9052 0 R /XYZ 90 211.0265 null]
+>> endobj
+9062 0 obj <<
+/D [9052 0 R /XYZ 90 196.4562 null]
+>> endobj
+9051 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9066 0 obj <<
+/Length 2845      
+/Filter /FlateDecode
+>>
+stream
+x��Zm������ȇ�j
�_A��yA���m��r0��vW�-9��6��;$EZ�hy/wA,��9���
)2��GfϔP�0.g������o�H�x	ϗ}���\��F��AFR9��s=H�0bv�y7'1�X������y������f��Pn�b���-����N�X����M�y\����vA���������!�7 U0�᠟
�K/��D0�,J|E��XR��_Ѯ�&�+g�n�w�|�׿m���ww�0t^����X��fK�R���a� �7�]�fV�k/ȱFXȮK&��{��M��5.Wk����z�
�6��0�Y��\`D�����,\l��^�+�c����u3��bM�l)RT���
�RX"����m�L���H����e]�US���$�"�(���
�����c-�Jܥ�"L�z�j
����mY�Ve�6�H.�Zg�9)��J�WBS+LR%n
�fA���� �r^���b����.��sQq�X';/�
�4h'P��w��a_@���ڕ����^[	X}��v����C'y|�D���
5�����Ҋ�wˍ~�8�T�����
�!Ʉ�I��0gp����d�$����|&���lW��rsXE�~��?*F��������$��euA�$�������cNE
q�%�c/�
�>��Tz�u�!���y_��|
+���J-��6u�Yr�d�($�c���Q�"
�N⃋�j�:�.�
+�R�4�>	M��Hf&�e��F&h�Y�&����$FH|p}�n�5�����Ju��2��	�G9����
;�P�'����6 �Vˆ�-�T�M��%	
)
�x��a�L̊a	� A���wU����}&�.	�0��)�)�K�/��0�.�1f|z�7~Ę��;��uV[
���$�Jp������n��e݉7w^
ڟ��F"%��YfR܂u���:d��N
#Q����S�A��"�����T¼�$���G
���$��l���OW<
+M>�l!k�`)�M.����4��^2J���r���'����O�r����'�n��	�|)�\o��?(��f*�1H��cX��]@�(��0�q����|
��)�:�ԡf
�(x1�lH��}80`��@��/ɰB �������;6��:�G�m�9��
+�aSBC������0H-�bn8�-�����t
.DM3��yf.$Ha�RfN���c�$�E��G��c擖81�yf�(�g�L+�̙�����dO+�h��M'䉴mv/�D�>舴�i�H�H���)3J Z�jy�2�e��
e
����
���Rņ�9H��Is�����r�e�6��F����6��m��0%�O��(�����f�r���Sv����I9�U�ҺϤ5��M�V��<D�L��Ӡr}[
=�͑T*��8��fu[�Z����&3	I�T��1W�8,
�1�7��^��7|��þ\W��ٴco$�p}�6��;ɮ��L~�80y.���K�G.N!�05���

�X��S`�F���+�Mz>QHB�1DO[$J�ILqHY����D�����;I����T����/�3�ժ�Â�Hn���6G�4���i�����@�v��nZ[�@��ذ��f���Vf
������gß�b�NGO�|�I@�)�bږz"�:��>HE�T=�m [...]
+��~�0˪��/pD���Su|�-���Ɲ���7,� �1Ń�9_�iÍz��@9�d
+P?�(tat��,=�OOS,��b��P
 ���:�2A�~�b��&�(d������W[f�$})��ﻰ�#:I�3�ȴ���(o��B3�#��u|�(�1��QȞ����Y�%W�]� ��ޙ��*)�����"��%�Q��2r�p*#e�g(#
629���7p�k��X88b"���tp�M�8�|~���*'^��@
s���
J��@��I�a�Jzfa
��?�n2�L��g���
*�4����C>eq�ŋ!?7�援ȃ~�u�?i�쏔��~�L��G�O1��#
�[j9x�2"}x����r�
g�b���.4B�B�DN8��MF����F2$��,�q
+�ُ&��~��.;@�X��ħna�����]7j�D	
+ .�LL�)�
+ˏ�f;�
��Db�(�I�7����H��F�H6=C���T�3�,�������2n�|yQ-�U�:?B#�9H�̼
�w�>�b�r�S���w,/�m��˾��#�n�c����
9T�_=|�
�
+	�ٴ)��AQ:���
.��t>k({�������
E��d).
L�e����Ԩ_gc�n���R��b��J��R������#v�s�w9,1�@�6����aұ�8����ϝ��]yƛw��������S{�;'�� '�VU��z{ ���\��
+��<�x^H�K�W/J�d�;{���	4
�������ք{w.º���}�-@	+Pį�:�Aj�}���A��N�
+�X��N���R�π�
+Q)e⥠[�f�	���qw[�i�
�+[R
f�u��3���^g:��m�E{&j����d�-�p
+J,/�H
+�V�
w7x&�-A�GVx�>ʒ��
���Vj �&9���H�D����.+���e<�w�
�������c�ι�,�ǐg-Fz�hOvU�-���� ����a�U�D {b%��Yh���m^X��G��)���8
�ׯ^===��=�վE���~�}5ڡ�(�bS�[F��.��9TEҦԾ.wSwM�n��	�(�l
�Q��|�endstream
+endobj
+9065 0 obj <<
+/Type /Page
+/Contents 9066 0 R
+/Resources 9064 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9040 0 R
+/Annots [ 9068 0 R 9070 0 R 9071 0 R 9072 0 R 9073 0 R 9075 0 R 9076 0 R 9079 0 R 9080 0 R ]
+>> endobj
+9068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 691.723 300.1613 702.0043]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >>
+>> endobj
+9070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.347 597.2652 435.5464 608.1691]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+9071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4502 597.2652 513.9963 608.1691]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Concatenate) >>
+>> endobj
+9072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 587.3673 113.133 596.2139]
+/Subtype /Link
+/A << /S /GoTo /D (main_Grid_Concatenate) >>
+>> endobj
+9073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 531.9661 256.1568 541.8639]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >>
+>> endobj
+9075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 407.2976 250.8953 436.3634]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 363.2289 483.2121 394.1976]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.3762 133.4922 385.5187 144.3962]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+9080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9067 0 obj <<
+/D [9065 0 R /XYZ 90 757.9346 null]
+>> endobj
+8832 0 obj <<
+/D [9065 0 R /XYZ 90 684.2923 null]
+>> endobj
+9069 0 obj <<
+/D [9065 0 R /XYZ 90 669.9983 null]
+>> endobj
+8833 0 obj <<
+/D [9065 0 R /XYZ 90 524.5353 null]
+>> endobj
+9074 0 obj <<
+/D [9065 0 R /XYZ 90 510.2414 null]
+>> endobj
+8834 0 obj <<
+/D [9065 0 R /XYZ 90 344.6898 null]
+>> endobj
+9077 0 obj <<
+/D [9065 0 R /XYZ 90 330.3959 null]
+>> endobj
+8835 0 obj <<
+/D [9065 0 R /XYZ 90 207.9415 null]
+>> endobj
+9078 0 obj <<
+/D [9065 0 R /XYZ 90 193.6476 null]
+>> endobj
+9064 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9083 0 obj <<
+/Length 3203      
+/Filter /FlateDecode
+>>
+stream
+x��ZK���ϯ�)�*o�T��I
�j���b�T
	ڡ-�
+I�x�}�C	Qc�+��֬ �	4��5I���‹LdH1.��
^|���#��~�{�V��BJR�x��+H�0b��nIbj�&���ˢ9�w+�����I�b�u������#���pxټ׻�V�6�ɗ5L��_�yK�`C��n�f�?Z��%�e��
��jM^~A��}bUΐR\�g�tsտ
����=�]���Pt�<�X3�!!�l�i(!H��{����t���
�
�dB��w_>���
�\0#���}�^�@M_�as.�0��(E�;N��
�WX�� �s�XR͜��s�`�PNIR�a�é2�"��+�1���H���s�.���M{?>(�e���pi����@=�De��2�&.�VN�s��0��'���눦�
+:ܖI��,���I[{9Y���KW֕��'�-�/e���;��N�]Y��X��
����b��-���<ꪅU��G����H�\��t�v�ٶ7lk�CYfIG���Ξa�ֳ�?IA��u��s۹�7�9��r�Gg�ׇC��b�
���T�Z4֖�D)r�qp�9k	f;��f
F�T�I�5�#�(�,j�kД�`�T��T���ֻ�X���X`�#�����.!�5u�F�otwn�����QpE+��9�Ģ���J0�gˢ��A]
^����l�>5��U�
m0G3����������?�
z!ؙE�4��)Y����?0���ǀ���P���1��'9W;�=ƴ�;#Y�Z�L��:�T(�D��L�G(U�L��
�,X>f������V/@�{���q׭�a�,�S8�^I�t>IE��CE9�o�N��??�����%.P�T
�1��R�}θe��T��7L2(�~1�qUW:Xww���EF�Ԫ��p����P `�e��H0 �	�ʜ'��M�r����ϛ��M���g [...]
+'`�Ξ�:0rs�N<@���({�p�̟��̗ߧ�� ���B���r�e��K
�UrF	X�/#F�Š��Y��g
���5ƗX��
�����7W��V#Y@�X~���3UؚI�9�l�A�Ǥq�x�	&-fTF1��������U�sdMY�k�-��~�ι
��e�� �&1�(,~�IP�&�" ���C��D�

���v�	ܵv�Zv
]�&CNSq�R� 6#2��l���غ���I7:�PL)2�x�x���C(t��#���vu3�S �ukPI�)���72�u��*�,�vFk~���!l�	��� � 8I9`7.A���`��m�m����e#� ʽ5P<5 v)w�v�T��dS�
7��� \>D��s�=ّ�;  <ix��
Pw۔���j��y�Ch�0iN
�3�������������}��9r�}u��J��z[t�-
J�S��氅1�ѩ(� ����l�';�j=$��e�Z��Q�fM�_�g�/m<�算�
:\#���KnIu� ��ܧYS�T���1j�s���˴�̢�$ٺ#��<4播;(�x�����nt�G�UN #���'50	�!���`r��&�
+3x�N\yN�z%��v�>A���an3�2�p�[��,��x<8�ǽ5��)����&u�UHg�E1$�
B )x5��>@1��1}<J�K=�p�Xߕա���<e������mϷ�� I�
QR�$�n�� �8�m}��.-R}<�������v�a��"����D51�7M����ЉQy�Xg�C��
a�3İ$��!�b`�!<�$�dEۃ�*5$L��=�t�Q�� ���>\*z���h��v�I}��ܡ�
�w�_3Y0pU M�cz���jN��*�B�#1M�cfw�D�
Gr���v
b���G��^�DѦ��
�z��B����vdHu�(
T��_��է�vUC��gT5�"��@��:���

+.6Y
�ݦh>����	S
+`���vV"�j�L\�`�$�q���Sc��\��ހIӑ�	e<.a��d7���,�O �
Td���6$�ӟ'
�;��C���M3-2I@
C%6τ��2�_N!�a3�M���-v����7K�����	�<+��İ��0
j2��6���agoo�s�(��`i.^���Ն�S�\۞AiF�Q��b"�� p�����y����|r�����^쨞�\#�E3���5F�h�L�`㵆��%
K�y����s0�߀�j<E//Dl������XF (��L���r�m;�-�M���ʰ�4�K�<�P���ljM����4��Ԕ��VD�����~J��Ј�
S�BA 0�l;'%���b��80 wN_�b[�݈pt��r0�\^sp�Nb�蜁�A��)"�-7���!y"���4��xd���H9_�؈�qt�T�v�!Ę3�>�70��On��K �RŶ	��a,t���K5ǖ1�j�9"��� 
Q�L�4��8S�v��q�ZH#�O��O-h0r(O~ [...]
D�����z���� L^����[�'pv�!�΢��u�m�W,��'��~���H�5Ou�H#F$�����!M�%.�I�2b tJZ�l;�	��r3q��	���LV5�|�"�
�/��Tv��Ya�����T�����	�����W�
�y��^ѣ��צx�#'�I��p�
�/ojk�e�~�Dd�L�1��M}��S����߭n~�b��Ϣ:��[Mhw�]�g�rN����Ə�
|��:�!N�W
���ݟ~�����
<_�<Y�GA]w�����m[t��S�����tx3y��\��3g��D^"�s 2��h��޷�����6|��c���z���T�`�P�(endstream
+endobj
+9082 0 obj <<
+/Type /Page
+/Contents 9083 0 R
+/Resources 9081 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9040 0 R
+/Annots [ 9085 0 R 9086 0 R 9088 0 R 9089 0 R 9091 0 R 9092 0 R ]
+>> endobj
+9085 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [488.2133 453.5299 513.9963 464.4338]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+9086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 441.5747 219.3836 452.4786]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+9088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 240.2687 300.1613 250.5499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >>
+>> endobj
+9089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 201.7622 182.1636 212.6661]
+/Subtype /Link
+/A << /S /GoTo /D (main_Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions) >>
+>> endobj
+9091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 86.2883 241.6898 115.3541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9084 0 obj <<
+/D [9082 0 R /XYZ 90 757.9346 null]
+>> endobj
+8836 0 obj <<
+/D [9082 0 R /XYZ 223.9664 444.7278 null]
+>> endobj
+9087 0 obj <<
+/D [9082 0 R /XYZ 90 428.2992 null]
+>> endobj
+8837 0 obj <<
+/D [9082 0 R /XYZ 400.6899 204.9153 null]
+>> endobj
+9090 0 obj <<
+/D [9082 0 R /XYZ 90 188.4867 null]
+>> endobj
+9081 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F8 568 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9095 0 obj <<
+/Length 2744      
+/Filter /FlateDecode
+>>
+stream
+x��Zm��������������ER mrEҷ�ݶ�p9,��|VcK������P�hQ���{I4X,,QC9�y�Jd��L
�(��a\N�
<y�� ��
�χ���x�B��AFR9�Zu#H�0br�|3%13������iVo��3����a�/�����M����^�-�����U��]������i7������_2PHh3
�g�}�$�)�(
ߐg�9x�
���r��������Q��ɚ�
w53t�ow���m�ɜ1��Tj2k!H��U�ʻ����	r��Ʉ���^�[�r���Z���7o�d	���3k1����1t����7�����0�
Kn3���J��9�����H1J�%(�<��Q��R��I��{�������C���^�P��C�T ����^�s�&F��gT���ͦk��EU�y���eQ�sBm��^��e
?����eSTe/��N�h�N �7mQf����j5�XU�^)<��u'���a��|	q	��O/4J
�6cc�"�v���~�����`s�n���c�A�H�F��h���eQ�87���~w
�n&e4����	R���<�b�$��h2W뺲�r��
�+�thM.%�G�`X�õrd4��]��t2����	YO�*��͋rQmw�
���gwE�N(#���^����6b1��T�`��*������A����)��¸
���w^�U�^~>쐊��v���BBԎ�"�5�x*cg��M �JEc��Ϳ�Ek�[K���͊2_�[1=���=����M~mc
�
�"2�ˢ���~�i*��
�a�n�P'!�H���6
#����
�I���D����	r�OqN� [...]
�ͷ7y헒�2�(4�1m~
+��R�6�m�&�.{�o/��m�%lL�n��
�mJ%|�&`�y�Ӝ��Y}�ظ@���*,?�c��|��0�
���p
Ɋԏ��W'�A�"
�jM��)ʎ_C����s��H�h�"#��s�[�h!��~sQ���3��P
.(�I\�+VĀ ���
sc�A�O�@o��c�}��e���	%\%*�����K��"Y�s�!�'�TX�
+8g�u#
+����!�0��G��Dh$3?{�
���%�����Zz'�

���j�DP��
+����� ]z�pJ�"P�t)B!������m]�C���0:�)Zwm'�Ϡ�٪��� 
+�=
+
��b
F��P���Ka�APe�	�>� Ҽ
M�"�V���� ��Ms�X�葥6LX+
tA���W���,+}�)	��p��e�Qp��3E�� 
+�d?j�ln�X��%��=b����\zW��\���-������H��]}��(�`��
1n�p|D
���̈́�L�����x�L��IL�t������b��MUY������g/Um��6��r��)�A�%U
+Vl�:��� ������'�"j��<{�̓&���B�<�
����e v�&qdGC��
��c�
:��� ��!��R��4��D��;f�
j7 at 2
�oV]��R	N��á�y
���͏���_C��G���<����;�����0��G�$]'
#�09�
�#��<�
�8첢�+וD>�Q�1L���$�:��j����o����m�w�f�^�s�K[y`[y�T��Y�7�F�犖M��B��íޜ+�8S�RLiUtxZwޘ/��)(�4d���:�������Sk��f���Y��\8B�6�Dwf]5�{��m��_�w�ߓ�Xd#�L�_�V:�*5
$0���ڭIa���K��&����
+��t��zD��~�����߾�Kb:FJ��
�eb��J�u�MC�~�!�����v��n�������(��.�<.! x��޷�Ȇ�Λ@�N!�@d�ܥ)�5.�+����EH}͑�%%O�Zb���Z��I:�G
Fȸ�&�Ӥx
g�C�Иt�=4��2Nc"�	��0N��N�g��W����8kW
+�J9?�r��_��ត��1O
+���t.៑yr�L\���8������D6hv�y�`���{�{U�th�f�3g�TK�$l�+?�/� ��R��>ߪ4�r,���F���T��R�	)���_������3��_g>����(�d�b
�a��^��X��O�JL�*���.�"ALR�����7&�2���!m
��Sz�{=B-���u��o�奥{�)쪮�#�\U�����}ֽ���B��׀��)
+�9���P �
te�ăX�k��ï���� uN/�C΍��v�^'V)�E�R��+)�G}�Y
+*E�p���ÛK7��^���b������z�p7�h�������
%�E��v��n�W�T1TrT�(B.��^SmߒC�GVrO��W�/6t�z���`��v߁������;�h�mY�jT��a����|����̓��\"�sL�TXGs	Q��zJV�иM;i�O'��_��endstream
+endobj
+9094 0 obj <<
+/Type /Page
+/Contents 9095 0 R
+/Resources 9093 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9040 0 R
+/Annots [ 9097 0 R 9098 0 R 9105 0 R ]
+>> endobj
+9097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 662.3528 163.8226 673.2567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 598.9003 513.9963 609.8042]
+/Subtype /Link
+/A << /S /GoTo /D (main_Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension) >>
+>> endobj
+9105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9096 0 obj <<
+/D [9094 0 R /XYZ 90 757.9346 null]
+>> endobj
+8874 0 obj <<
+/D [9094 0 R /XYZ 213.4267 590.0982 null]
+>> endobj
+9099 0 obj <<
+/D [9094 0 R /XYZ 90 573.3711 null]
+>> endobj
+9100 0 obj <<
+/D [9094 0 R /XYZ 90 494.5952 null]
+>> endobj
+8876 0 obj <<
+/D [9094 0 R /XYZ 90 471.6607 null]
+>> endobj
+9101 0 obj <<
+/D [9094 0 R /XYZ 90 471.6607 null]
+>> endobj
+8899 0 obj <<
+/D [9094 0 R /XYZ 472.8106 394.9968 null]
+>> endobj
+9102 0 obj <<
+/D [9094 0 R /XYZ 90 378.2696 null]
+>> endobj
+8900 0 obj <<
+/D [9094 0 R /XYZ 260.5089 315.5982 null]
+>> endobj
+9103 0 obj <<
+/D [9094 0 R /XYZ 90 298.8711 null]
+>> endobj
+8901 0 obj <<
+/D [9094 0 R /XYZ 466.833 224.2445 null]
+>> endobj
+9104 0 obj <<
+/D [9094 0 R /XYZ 90 207.5173 null]
+>> endobj
+519 0 obj <<
+/D [9094 0 R /XYZ 90 97.1693 null]
+>> endobj
+9093 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9109 0 obj <<
+/Length 2962      
+/Filter /FlateDecode
+>>
+stream
+xڵ[ko7��_!`��D4ߏ`[`ۦ�t��M��ma(���V��Q��~/g�9
�rU#
��\���<�^rD����%2���tq�wp��
�~=���!���/�d$��돵I����o�8
�	�xx5"x8�,&7W#�����}u���|3���l
_�j.ϖ�m�k1���jF�\}�%!�`�QąT@Ύ���!Qfx��z�c�pD���i�����v;S���#C��b=���ʻ�c�=��S�ĈC&�5z���;���`�X7�v��/xp
���#f�<���1t�������{;��
}�%�/�#uF�R�g�0`�F�F�k��X�!�Yg�b;D!LI&�?k*�5egmlM
�T��k"c€�R������ ��3����i��Է\߷�^��p
��LW��n���f�ese&��
�6W�7WW�83��Q��*� �
")����-���m��!e4�?����ڭ��z���{�0��"���'T8jMt�Y�W��n�]�Rd(��
��&��W���.�l��7��
�H��1�I��ID��b�����h�I�D��v�f1[�`��
	˗�Ӈ�0��4~.�x���a�@�%�G��bxT���5;6:,��H�����ɇ�fr�����n3Y4>�6m���y��&?��`d���gS�jy�#�\���}�V�Ja`���&!�
��hb�-`��惈j^���%������+H����(WF����{A`5Hu<�s
��f�����l�L���C�N��e-wɺW�K9�P3B{��Q�>|��@b$���DJ�`����HML�R�ڤ����D��ȣ�!�G��@���
�gJE*�lTv�0
�2)��T"��"nGWZD��7'9T��
�U���X���I�v8ѸG
��E]����lQ-��7��u�p����R����
+

+T6<f��/n<��'�e��I�Nv���v-�/*��wղ9�n^�+���-?�>���C&F3X�v�_g��O~x��?�߽
�A�֐d
n�"��.A9��
+��jjc6�QT| U����
 �HNCY���g�۶K�4���﶐��m[��ޭ��4U_+�P��
���n��{NT
rq�9�/�/<Tj��stX���g�v`�An
+�
U �Z��F��caӂ~���V}Aّ4�T
+���+��
VT��๪_ ��"nOS�
�@��<(�0!PA�N���;�$�94vJt?
�_���=���C/_���G�0Ȃ
+��x�8�b�2]e	�݉�����nS.A�\K����M�S'��yW8P�gi
+��F,>���o��a�����,�ᄑ����\��ML��8'U�62���,��6#���XB�6֏��4
B2Z��F���k
׈b�JZ�`e�

��:T�
+�;L"
�ݹ���ec*�S�8�icx at H$�t����E����W�E��u�&Ə���
+���;�g�ۡ��zG���w�Ű�4\��
Wo[�I�O��Ǘh$vOWo
�0U*��J�ěG�����rQ���;��d������
!���v��=������9�mCH��
U�q�!�ӳyR��{$6�,��e	kw*F
]�Ђ4�ʞ7����<�^���
�S{�X'�b
a
YY}l
:˷������m_w�߮�uR��=�Ohn�:K�ֺ=4��!���͈��j�G�h3N;�v1}�(�q�ɜ\!0{��I5��(m
9T1o�2i�g�4k�c>_�$/!^����� �!X��$k� t��I6�O�
��$:�d�<l�L��H&�Zǝ�
/��Z
�>v��|�x��O�ۛ��
+��fZ�3F��Q)�8�&֎eZ���^��h$���ϻ��2���6�#�/֛u�+�
 �΄��"�{j�[nY��{r'�
+	�����)�
+
+��g���F&�zX�&��A2�bf8I(����C�8|�Ob���k�6
��7��!ʕ��1!��[�����zy�1�����{�����>T��首��>׮�l��Zc���n�b]Q�|�5��[1�-��+��]S�
�
���ЁY֓uK�٢�ۨ6	�/
(���г
+�8�|U(
��n�s����K���ۇrNBnO̍�an��P.D�I�Ti.;�g�_���=
0N�)7��P`��'G��n�o>[T��a�	��m^��@Zs� 6r�`� 7'%� C6vD3��K|�B�)Ć]�{c�*�B��"1����>:Crz6a- R=�u[�&��c��a�X+�}�f�Rl�
���fK�-b@��K*�
qmHAR=�(���s%�@��Eܞ&�9����yxI��T��x�$�@#��J��fo_�;&�'��d�
U � 8,&�bz��T�0Š�s45���T{���O������Ԝ�M��z~Mm��_Oa*��A�'���{iA���+����W,��:XYQ�g+j��SԐ�5C6T�,
+YR(-;N:~�
����3g�-�D#�[k��r�L�S�$�y�

U�X�Lw����>=���y��S=��%����a���ޱGx�C���3
m�����s�Q`#��
��[Pk���3��~ki{�t�ں���k�,/3�H(�ژg��'P*1��`A
�������1O�ic��ژ!jc���U3�Uc'
�F+��v�hc�/�H�Zo�f��LмZLatF12v.�W %g�>�Ǘ$vOWF�8S�p���2�<�Ze4x œ��m
l��f�/�Kh`H�YHd ���;�/���ڏ�G����͇����#!���~;Y�'�Û��[S���q1P��ME��
+j��W�+�Z�+	���|���q���E�nw4o������w����ˇ�4ݢ�r�ޠ��r��_&��!F�b��{P�%r?�I�u���e��T�t..�_���Ӕ
*���@endstream
+endobj
+9108 0 obj <<
+/Type /Page
+/Contents 9109 0 R
+/Resources 9107 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9143 0 R
+/Annots [ 9111 0 R 9113 0 R 9114 0 R 9115 0 R 9116 0 R 9117 0 R 9118 0 R 9119 0 R 9120 0 R 9121 0 R 9122 0 R 9124 0 R 9125 0 R 9126 0 R 9127 0 R 9129 0 R 9130 0 R 9131 0 R 9133 0 R 9134 0 R 9135 0 R 9136 0 R 9137 0 R 9138 0 R 9139 0 R 9140 0 R 9141 0 R 9142 0 R ]
+>> endobj
+9106 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Pointset__Powerset__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 9144 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 420.00000000 96.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 9145 0 R
+>>/Font << /R9 9146 0 R>>
+>>
+/Length 9147 0 R
+/Filter /FlateDecode
+>>
+stream
+x��QMk�0
��W�]2�qb��
��.�M�%��6#n�(����lֵ0��C�O�)HQF�x��i\�@�A�k�e�1GI"�9apP%ZR��#9�Pf�.��ű	�ng����m�e4��NJ���00he"S�P�Xy�)���y��+���k�
�p�L�M��w�����X��p[}�s�qI
̔rf��<!}���"O�0������_)O�w���w�"'�PB�
+)x,#�ߢRc�,
^
+~a���ҼT�����:��؞t�7������]MY�)|{O�3endstream
+endobj
+9144 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142740)
+/ModDate (D:20080908142740)
+>>
+endobj
+9145 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+9146 0 obj
+<<
+/BaseFont /LVASZQ#2BFreeSans
+/FontDescriptor 9148 0 R
+/Type /Font
+/FirstChar 32
+/LastChar 121
+/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 584 0 584 0 0 0 0 0 722 0 0 0 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 556 556 0 0 556 222 0 0 222 833 556 556 0 0 333 500 278 0 0 722 0 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+9147 0 obj
+293
+endobj
+9148 0 obj
+<<
+/Type /FontDescriptor
+/FontName /LVASZQ#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 9149 0 R
+>>
+endobj
+9149 0 obj
+<<
+/Length1 56288
+/Filter /FlateDecode
+/Length 9150 0 R
+>>
+stream
+x������:��@]�R��f$���$�-Poiv7+��n�,�uwwwwwwwwww�o2�ل_`�}��9gΜ��s�|yP�$B&�'h�u����y�e�c���|x���A~�>��B��}���_��8�޿�|��o�.�;�X��� ޺�7��}��Y�6�����kt�V��o�w��=^�5� V>�7���.�;��#ZJ����c~X��e�����R=��I���NW_���/�����B��?��Q5Kß95Kb
+�B<N
M�����k�Z-��\�\3~N'����@\
�"8��41�\
:C���YbE�D�
!��AW	��z�X��
�hb}��/�dD��3(����H�l���A��͉��3�2�&�Y� w��#�k��������T�
裉
h%����O�'AW�C鋠���z�G��"C��� Q$
+~�U��ЈV�?�X?��:��5�(��_��?]{j�l�{}� Q":|K���J�$����
����U[����f�W.Zf�uV�˅�o�ԑ�����"��~Y%��|ߙ���m�;���^����3�K�%�&�DWO�Go����
��5"EL�='��)���R��+wZ��Z[6@�>��k��ɉ~�)�I�D���5�Nٷ���B�Al�[��בmDh����-�C�rů~����Դ
��T�-Km�Y����1�k��/-~[th-�U�6-�����ZC�������_�^U߿��BlM�d��-����w�/�ݿ�2�� �B��guZ*���ΖjwO���o�_v��j���2�6��^m���L�zv˔B�P�[f
�{�[��i/�*��n?��?<7 &��-���^��'��'�ЍCx�o���&����]��o0y�
&u�&�
;�
#rrWqRw��8Ԇ{���j4���|�>��6\�˹���ڱ���Z��m]{��ў~8-~�����=��i���V�[P��ca�܁��JK��B�o�BK1��`KG_��]�
�����>?}d�>��A#����Z!�Y��:r^B�����T{���K������jO0Dۂ��D�y�f}A-�}��@��ލk
�K�I�V{r_��|P�0� �=EtM�$���")���`�%8�;B$$�/?W&�~�
E,���1�XbYb9bybbEb%bebbUb5?�q���x�N �$�"�&�!�%���D?��~I��D'
?[����&l��6$6"6&6!6��!\?�f��?��S�i>l�7�V~�L�;b?S����l?�lO�@�H�D�L�B�J��3��~��&."&!�!N%>'%�%�"�!� .�Y�H�M� �$�G�'��4�p�!�]��\�J��g�W�B��	�1����;�oا�F|�x�x��g�g�/�|�x�x���o���W���W������8��
�kj�Y"���e���A��ݸ��ҟ)�Y���7q;q����"9�������dI��I�I���XDʤB�d���'��HrI�ː��1�XrYr9ryrrEr%rer�w�rUr5��
G�N�'� '�k�k�k������?���I�d��L���i�)�"ӤMn at nHnD|H|DnLnBn [...]
+9��FnNnA\O�@nInEnMN'g�ېے3�Y�l�/�o-�	�
�=��#��3�
�+�9�ܝ̓md;�A�N���&{ȹ�<�.�H��%�������'� �d����|r��
$�$�"�&�!�%�#�' $.%"&!%#'� �$�"�&�!�%�#�'O O$O"O&O!O%O#O'� �$�"�&�!�%�#�'/ /$/"/&/!/%/#/'� �$�"�&�!�%�#�'o o$o"o&o!o%o#o'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!�%�#�'_ _$_"_&_!_%_#_'� �$�"�&�!�%�#�'? ?$?"?&?!?%?#?'� �$�"�&�!�%�#�' $"&!%#'� �$�"�&�!��R�IJQ4�P,�Q<%P"%Q2�P*��FP#�Q�2�hj
5�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�j��Q�S�5�	Ԛ�Z���:Ժ�z���Dj5�j���F�A�T���4eSPRQS�P�R�Q�R [...]
+T'�EuS=�\j
U$^'>�z��G�S{oo��o�Qe�BU�j>��ZH
R{R{Q{S�P�R�Q�SPRQS�P�R�Q�SGPGRGQGS�P�R�Q�S'P'R'Q'S�P�R�Q�SgPgRgQgS�P�R�Q�SPRQS�P�R�Q�SWPWRWQWS�P�R�Q�S7P7R7Q7S�P�R�Q�SwPwRwQwS�P�R�Q�SPRQS�P�R�Q�SOPOROQOS�P�R�Q�S/P/R/Q/S�P�R�Q�SoPoRoQoS�P�R�Q�SPRQS�P�R�Q�S_P_gQ_Q_S�P�R�Q�S?P?R?Q?S�P�R�Q�SPRQS�P����M�M�
��
��-�-�
+��	z=�
E/C����c�e���������U�U���z
�:=�^��@�I�E�M�C�K�G�OO�'ѓ�V:Ik�N�I�h�N�6��!��1�	�)���.���t���)�Tz�9��%��5=��AoCoKϤgѳ�����
�
���]�]���9��t�n����@w�]t7�Cϥ��E��.�}t?�]�+t�
���
�� �'��7��/��?} } }}0}}(}}8}}$}}4}
},}
}<}}"}}2}
+}*}}:}}&}}6}}.}
}>}}!}}1}	})}}9}}%}}5}
}-}
}=}}#}}3}
}+}};}}'}}7}}/}}?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����!���a������Q�I0#���(ff43��,�,�,Ϭ��ȬĬ̬¬ʬƴ0�ՙ���fMf-fmf
f]f=f}f"3��̴2IFct�`L&�XL���
�
�����M�M���q�
�er��La�2Ә͙-�-�������
ff[f&3���l�l����������������avg�L��t0���b��
f.3�)2�L��c��=�2Sa�� 3�Y�,d�=�����}�}�����������C�C�ØÙ#�#�����c�c���������S�S�Әә3�3�����s�s���
�
�����K�K�˘˙+�+�����k�k���������[�[�ۘۙ;�;�����{�{�����������G�G�ǘǙ'�'�����g�g���������W�W�טי7�7�����w�w�����������O�O�Ϙϙ/�/�����o�o���������_�_�ߘߙ?�?������E̿,��,��,ò,������ʬªl�
��dG�˰��1�XvYv9vyvvEv%vevvUv5��
ǮΎg�`'�k�k�k������I�d��M���k�)�bӬ�n�n�n�n�n�n�n�:��f�,�c=v
+;���n�n�n�n�n�Ngg�۰۲3�Y�lv;v{vvGv'vgvvWv7v�;�g��v��-��l����s�yl��eKl������
+[e���v!;���������������
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
Ϟ��ȞĞ̞žʞƞΞ��ɞŞ͞Þ˞Ǟ�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^���������������������������������>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>Ͼ��Ⱦľ̾¾ʾƾξ��ɾž;þ˾Ǿ�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~�~���������������������������.b����(����8��N�$N�N��n$7�[�͍��r�r�q�s+p+r+q+s�p�r�q-�8nun<�7�[�[�[�[�[�[�[���M�&s�\��8�38�Kq��lnnCn#ncnnSn3��\.�e�
�qS���4nsn
nKn+nkn:7�ۆۖ����fs�q�s;p;r;q;s�p�r�qs�ݹ<�Ƶs
\��亸n������\/W���~n��U�*7���p
�AnOn/nonn_n?n� �@� �`��P�0� [...]
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�n�/O�$O�4��,��</�"/�2��*��G�#�Q�2�h~
?�_�_�_�_�_�_�_�_�_�_�o������5�	���Z���:���z���D~?�o哼����|���4o����������>��x���O���[�[�[�[����6���L~?�ߎߞ߁ߑ߉ߙ߅ߕߍ������6����
|'��w�=�\~
_�{�����{�e��W�~>��_��{�{�{�����������������G�G�G�G���������'�'�'�'�����g�g�g�g�����������������W�W�W�W���������7�7�7�7�����w�w�w�w�����������������O�O�O�O���������/�/�/�/�����o�o�o�o�����������������_�_�_�_���������?�?� [...]
+Š�J���*ª�jB�0NX]/�!L�������&
+���B��4A
�R�%�[�@�P�H�X�D�T�LpW�Y!'x�a�0M�\�B�R�J�Z�.���f
+����v���Ž�N���.®�n�
aw!/�	�B�P:�.�[��
+��+��>�_�C(
�F�&�J�J�F<,
7�����Ä�B�*�QaP�S�K�[�G�W؏���O�_8 at 8��[8H8X8D8T8L8\8B8R8J8Z8F8V8N8^8A8Q8I8Y8E8U8M8]8C8S8K8[8G8W8O8_�@�P�H�X�D�T�L��8Z�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_x at xPxHxXxDxTxLx\xBxRxJxZxFxVxNx^xAxQxIxYxExUxMx]xCxSxKx[xGxWxOx_�@�P�H�X�D�T�L�\�B�R�J�Z��8]�V���\�^�A�Q�I�Y��8S��8��N�M�]�C���D��8Q�[�GX$�+��")R"-2"+r"/
+�H\&J�q���)�,*�*&��Hq���8Z
#����WWWWWWW[�q���xq
q���������������8Q�$N[Ť���h���-1-����F���&��f�#�bF̊9���S�i�����V���tq�����8S�%���wwwwwww爻�y�Ml;Ă�)v��b�8W�'�^�$����
bY��Uq@�/.����^���>��~�����A���!��a�����Q���1��q���	��I���)��i�����Y���9��y�����E���%��e�
�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?�"�_��H��h��X��xI�DI�dI�T)!��FJ��e���i����������������������"��V��KkH�5�����u�u�������$i��*%%M�%C2��dIiɖ6�6�6�6�6�6�6�
ɕ2RV�I�4E�*M�6����������K3�m�m���,i�������������������4G�]�KmR��!�N�K�z���<�(�J%�O����RE�J�|i��P��������������'�'
�������������������������N�N�N�N�N�N�N�N�ΐΔΒΖΑΕΓΗ.�.�.�.�.�.�.�.�����������������n�n�n�n�n�n�n�n���������
�
�
�
�
 [...]
�
�����M�M��Gq���Ur��LQ�*Ӕ͕-�-�������
ee[e�2K��l�l���������QvW�J�Үt(�S�R��
e�2O)*�JI�S��=��RQ�ʀ2_Y�,T�=�����}�}�����������C�C�ÔÕ#�#�����c�c���������S�S�Ӕӕ3�3�����s�s���
�
�����K�K�˔˕+�+�����k�k���������[�[�۔ە;�;�����{�{�����������G�G�ǔǕ'�'�����g�g���������W�W�הו7�7�����w�w�����������O�O�ϔϕ/�/�����o�o���������_�_�ߔߕ?�?������Eʿ*��*��*��*�򪠊��ʪ��jB
��TG�˨��1�XuYu9uyuuEu%ueuuUu5�E
����W�P'�k�k�k������I�d�UM�����j�)�RӪ�n�n�n�n�n�n�n�:��fԬ�S=u�:U��n�n�n�n�n�NWg�۪ۨ3�Y�lu;u{uu [...]
+]��uV�}�P��|{����C�9m������u��
+��|(�L{O�}���XX(��R����oo/��R{�r��|�ȎPd���U>� s!`!Rn��B��9�Q%�
K,B�RTW]PS���UeJ{_oo
]u�Ժr��tfj[��t�ܴjO���������&�š�M7
1�����9�3W޼clQռ���r�P*�K
=�ܖ���j�+BٲޯXw�m6P1̖~홢��m
>_
+�ߺ��R��[�ϗ�.�k�N���C�J]t���OG��P��a���N�
(u�����@U��
c(�1l[C�>�m�ʡ�>U	�<��+C:?P�iM�4H��>\
�aV�#����
v�@ؑ�Q��evX��@���=�.v����n��@�?
>���}]�
��
���!��)�ខ�v�{�*[�+uU�ڥ[!���uZ�4 M�����!
H2���Az���o��
\�6pm�����k��
\�6pm����W.�}������
`;�v�� ��l��
`;�vr�� s`�E}]`��v����
l�.�]`��vQO�A�f��^x�e��^x�e��^x�5��f��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~�9�瀟~�9����@�
+�
�s@�=�
�s@���t�
�=�{��<ϖ�Z�'q>Vy'�|!�`�+�|�;������2	�A��	��� Ӑ6��Bf ��9Ȱ�Z�I�'��~�I�'��������R1���Zw�gC1h�Ѐ�CC
5�QC
5�QC
5�QC
5���|
u�QG
u�QG�M�7qߌ�#>��D|&�3���L�e"
񤀗
XLK/��R�K/��Rh��^
+x�,�Y���g��<
x�,�Y��PO
���o�>�Ki�/
����4����_�Ki�/
����4����_�Ki6��_�Ki�/
����4����_�Ki6p
�:��i�0

���4�^А�5�s
�\C~ֲ��U��/��M
rJM
�魚�x�,�	��� �jw_߼|[����
H2���A�1��':�|�#���':�|�'E2
iC?	�$��G.ёKt
����k��B�o�Pe�ht$
�FG�ёht$
�FG�ёht$
�FG�ёht$
�FG��u���\
��(WG�:�EBґht$

VDŽ�1!u+�V�J}���P.Tz*������*�K}�B�ГWr��
���\���AS����V����:gizo�+t��7`���yvJ���a`�L
������Yݾ�� �-���y���֑����
�v��5��޶�����՛�g�xDC���3����Ʊ�iu��ct-��P
+��/D�?f��Ѱr��L[�r]�ʱ
�b5ϣ,f�Z�j7�A�j������A��4 at -���SA��rwW�U.����u>��ׯ���_�}��W��|�ba*}��6P�k}q�1~�HX��X��b���'��c���X�bm�kf��b͊�t�ّ���0���ll���F\n2.-���Kӆb�#�∵8N-.O���⒵�d-.Y�K����d=n
=��c
=��c
=��c
#�0b
#�0b
#�j#�0b
#�0��;~"?���H�O��'�8*+�Ŋc��X��d+.يK�⒭��t\r:�o:�H��#
c�c�t���1�1�
c�1�
c�1�
c�1�
c`5`�Cm1TZ���g��_��c�U�5#��XKŚk�X��͍d2Ɗ됌{>ڍXXXi/��C������
�������I�
b�
+��
+��
+��
+��
+��
+��
+��
+��
+��
+��
+��
+��.��.�������������p�� �
v�v�v�v�v�v�v�v�v�v�v��
|�X�X�������������������XXX����������XA���������#�ƴ�2������F6BFͱ�7��7��7��7��7r� �
"�.��.��.��.��.��.��.��.߈�|�|�|�|�|�|�
�L,�L,�L,�L݀4!S�d2*ǁt!3�Y�
d�i�B� �|���?�|��
��7�o � �|�M,EM�M�M�M�M�M�Mx����&�76�76�0�'6�'6�'6�'6�'6�'6�'6�'6�'6S�M{d{d{d{d{d{d{dKnKn{d{d{d{dKr{d{d{d{d{d{d{d{d{d{d{d{d{d{c3�3Տ
��GF�i����~z��f�Z:֬��TlKŶ��
ᦌ���G`h�F�E�p�bf�{�Ԑf�Z*֬XK�Z�o��Z2ִX�Q�Ê1�Ê1�Ê1�1F:�H��#
c�c�t���1�1F:������$��C�&d
+҂LCڐ�
��
Ǩ������������������������������������������r�ᜰ���4�k�׀����������m��
o!�[��r��
o!�[��r��
o!�[��
᠞��r��
o!�[��r��
o!�[��r��
o!�[��6Ɖ�qbc��'6Ɖ�qbc��'6Ɖ���Bf ��9Ȱ>6ƍ�qcc��76ƍ�qcc��76ƍ�qcc��76ƍ�qcc��76ƍ�qcc��76ƍ�qcc��76ƍ�qcc��76ƍ�c �@6��l�'���x�1�l�'���x�1�l�'���8�1�l�#���8�1�l�#���8�1�l�#���8�1�l�#;GX+�X+�X+�X#�X#�X#�X#�X#�X#�X#���6�6�6�6�6�6�6�6��m�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l�l+�h+�iϗ:����Rǀ�_�K���r^���=�|�+���l�#P{jj [...]
<���gwPTWp��
�RW`k.�C����\8
�Z���

�eG�J����5,�#t
/�����?4�m�Eo�9|���bp��_���;/�J
�W��6?�U�w�Š������힚"��"�@������.�c�Bt7��b�@�@w��/U�Z���
��͗�qA�A���a+�(5Q,��A�E�C�֤{�}5��R!h�}BЦ�B�v��o p��ܯ�,�ݯ�JA�=]�՚C��T������@m�+�@�
�Z��E���T�h(�
���d��V��_#�.��JE�/#�@���r0�
��q�?x��8�
��w
�^q�+x��8�<�G
�
q�#x��8�<�G
�
q�#x��8�<�G
��p���8���?
��p���O8�	��
�^p�
x�A�w��
�yy�A�w��
�iy�A�v��
�Yy�A�u�g
�Yy�A�u�g�TT�F�u�g
�Yy�A�u�gr�gr�gr�W [...]
sp��4��i���0�aN�
��98
sp����)��S0�_N�
�~98�rr�Dy8crp�������3&gLΘ
�198crp�������3&y�E�s��\�=y�E�s��v��\�9��E~s��\�7y�E>s��\�1y�E
s��\�#y�E�q�w\�
�����E�q�w\���E�q�o\��Py��:�E�pS�
�#o��.򆋼�"o��.�<�"��.�<�"��.򀋓r����wq:�b����.濋y�b����.测y�b����.橋w�\�W��żt1/]�^���.構�k����t1?]�O���<t1]�C��.曋�����|s1�\�7��.Ά]�
�8vq6��
8��ɠ2�
�'��ɠ2�
�'��ɠ2�
�'��ɠ2����
�s��A�e�o�[��A>� g��3��
�3�|�A>� g���c��A?fЏ�
�Ry)���A^� /e��2�K�L������ȗIH
R�4 M�����!
H2���A?	�$��O?	�$��O?	�$��O?	�$��O_�|
��5�k�׀�_�|
��5�k�׀�_�|
�:�u���ׁ�_�|
�:�u���ׁ�� �|��
��7�o � �|��
��7�o ��	|�&�M��7�o��	|�&�M��7�o?��S�O?��S�O?��S�O?��S�O��|
��-�[���o��|
��-�[���oy���
b܂Pl�w� ���[#�H
�K?
�4���O?
�4���O?��ۨ���ۨ���ۨ�������o��
\�:(�A��uP��r
��\�:(�A���|��A�
��A�\��w����
|�.�]��w����
|�.�3�� ?�
�3�� ?�
�3�� ?�
�3�� ?�
���?
�,���?
�,���?
�,���?
�,�s��?�
�s��?�
�s��?�
�s��?��W=�{In�p�
V�{@����z�
s�K{`i,큥=������
X�K{�Qy�
���B� ��x`i,큥=������
X�+{`e�쁕=�����
X�
{`a,쁅=�����
X�
{`aO��P?�����
X�
{`a,쁅=�����
X�
{`a,쁅=�����
X�
{`a,�u=������
X��z`Y,�e=������
X��z`W��Q��,�E=�����
X��z`Q,�E=�����
X��z`Q,�E=�����
X��z`Q,�E=�����
X�K/
�4���K/
<������
X�kz`M��#<���5=������
X�kz`M��5=��g������o�>���z`W��]=��v���
���z`W��]=��v���
���z`W��]=��V���
X��z`U��U=��V���
X��z`U��M=��6���
���z`Sl�M=��6���
���z`O��==������
X�kz`M��5=������
X�kz`M��5=������
X�kz`M��<�~���
�ы���
8
p� Gkmu����zsz��7
!��2)u�t
�

�Jw�nE�ᴺ�@_�P��g�R耫JMO�j�N.���|G�
��$��S
+~�Zh�+ᡐ@|iB� -HW,,l/�{;ڊ�dCi�	Ox"� _ڐ�R�ƨ2�_(��!+�Ծ'��J�ˢ�B��,�t5��(�
+�;��}�_�0zJ�a	~�c�� ����T�U�ЅA��A�LA|D?T� ���
�B5�ω߈�SLn����E��
�7�̄2�*L�,��U�0�o㤒zȈ�łt�m\�%�/�.9|�@KV��В��—IH ��7_����!�m(���M@��4��/
�/"h�n%h�P�ȵV��
�
<��d
+��Z
+����K�O
+�O
+��)4E
+M�BS���K�[���o��|
��-�[���o��|
��-O̗�}
j�
?h�R ˵f
+ov�-(�Z��9"�:J�v_��w�Y�%%tn+�
+����~5R�"c�Z��EP�Q-��raaO�O&՞|Q(��W�q.��^��b���3��G:�������2��wn>2��ů75�Zӗ����/�T����0�J����\�_`�l��U,Hž���|������T�e���'�?
��V�/,5��җ9���Ng_��Wzz{��w���z5-\��R�D�He�
�/� 8u��o�DtQ�(T�ڏ担��@8�5;�M��jOqP�
�
�1a �Aom�j�X�ն���p���	3�MO�O`0[�5C�ΠC�&d
+҂LCڐ���Z_`2��
�!�p��K
R�9hu!��V���s@
IĐ
bH�9 �$b ՙ�kACZ�=T���,M$K��������
+@"��(^���/���@�x�Zû�޵�𮵆w�}D`��0X񲵆��5�l��ek
/[kx�Z���^��𲵆��5�l��ek_�0�~�̀b&#E��ۑOd�"͌�[�����|bŊ�T�+�-#�HƠQ�Z�;G%Q<F��lD��q�r0B�ۊ}���FI���hd_�Q���FN���[M�F���bg�}tq]�����~�Z���rl��w�
e�e��m`�����6:��
�pO��
$�m�۞����GG[�Bn�߹�?Ӊ$�
���L�N
+��~.��-�e�ށJ-_�X"��R
/���
I
R�4!-�4�
�@���,d�
eH?�^xD�K�D���@
���/��
�e .q��@\�2���L�e��	|�&�M��7�o��	|�&�M��O?��S�O?��S�O?��S�O?��S���o��|
��-�[���o��|
��-�[�O?
�4���O?
�4���O?
�4���O?
�4�����o��
|��(ρ�?~�t��8
�� N�9�Ӊ�E��t��8]����
|�.�]��w����
|�.�]��� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?
�,���?
�,���?
�,���?�
�s��?�
�s��?�
�s��?�
�s������|�
�=�{������|�
��#�
^����
^��R��ɗѵ
���B� �P���ˤ��W��:W��W_j;�Ξj��Auvҝ�=�����+Q
^����/s�O�"�p}��%&_j�:����py��4���j����3HD�P=� ��)_"
1�A�@E�#
+
�ha-종]�0^���
+��W�<�:�K��@�jg�|����Z���`�nF����7}{J=��h��]�r��[
+^/�����r�&x�K����ߧ�R�'����ؿ4��+
s�B�Υ<�����y�s�v����]�Cz�kȥ}��
F�u��
r�[_��^���^���1t�����ӥ�����RKCj��s�sې����;���!�8�\�.�JeȥN��(���:��`~D�����0�y�C=�_��a�H�/bso�y0�k�p�_2(ݾV�Ӆ;]��
���0�j�W�@醩�&���]��#�jt�#z(2�`��d��C��C[7p%��� \*QL�
+�T"C�H�C�_���hCO�zz�?Y��Vq/h��^5��O���w�k��
�a����RBi��E��*9��T�,�� ;�
�&EM��!K��Qo�¶���)A��@�cP�t4�;z�+2!gZԥ5 1R��j�U�4j
+Z�=
m�m?a��%
��AI��P���p�~�"���472��Ƹ���
iCú7�]̵|�Q�
-a"H��
9ttDF_Kʑ�q���'~���(�����L5K�d�a�[%�^�@�V�ѵ:�송#���_[�a&F#�ch�t``tD�#�t�
�z��\��^Lg̘��6Tx7j����F���?�-ų�.����(�v��vCy�ծ�.V��S���FS�~Cd��]���
Y�,BV���U�F���D62��-��m�ކvl�5|h(F�/,�i�7�}��n������)5Ҋp
��y6��E���{�m/�z#CTX12T�%�XB��b4,�Cs�
�b8B�*dG��
C?
�@q�(��"��� L5�;2U#�)��R��#̆5� 5H龎J�ZR�T��HO�>�,9 ���Ω��X
��F�����PbRT�(��� 41R�P°�!�Ŏ�>�x�U��[%p��墁V�@��K<�*Q?U�����P�"�b��]k���#�
zvG��2p^Lvm���Bڢ�L��-��mQ�o��o2+\�b[�ߐ?k
+2
�
�x�
7ڢBz�lo���Y�RlJ���-�mh."�n�j�\[Dž��L�W��/��;J��M�.�n�o�nͭjn�S��[���6]]L�Ƙ:�b�/������":���T�P���ߧl�?^�4b�2��>���n�o�7M[�Sm
O��?�?����^m�
�����J�!�U��.�`�7�"�� ��*.��F����kٰ�fT�q�
+o����C��!�uN��s*Q�u��4T��X�z��v��v}U�{��
+�hC1v#�Z	��u��
�sh�è!�X��6/�]4�/�©Xw������U��^��������6�1X�'A\Ӵ���'ƺ���]}9�z�jC�
�t4�p����z�����[m
�z�/�/����*
�Go�c�E�_��p�po0F�G@�,m
��T�
y��0S�P譽]5)	�+Z�Tڪ�ݶ�C�� (�IG�
%�)Q�i�u&���\�̵�Z�`R�ۯ���:

�+��9
F�A��`T[Yj�`����H���lEJ�6
��U?�����(�Jɜ@�I�� 4j�
��q�h��d�֚�Z�I�����hX0&�n�1*nj�T�X��n��Fv��z�讍�݆��=bLj+.��
z��'*dM���.�f��f2�
6�Q��9�I��B��Co�=}��I��Ձ�CO5)#�ԕy��2t��
�
�
mX37lΰ����1��N2�ŌZ`
�X�շ~����f���^�T*P�pc�!�h53���#-s�bc���l3c�����Y_{m�ԆmA�Z���$�ł�,�IK	��X�֬�t�vN�g5��#n3c�
њ���kf�u�3�����5)Toּz��՛�`��֛5��l7&a��ޚ׬���MoM�k�`MF�>�hm��{�2���2i���H
�a
��i��Hf�����gojXkX�a�в�z����hฤ׬=��<��z��%{`�jX��zk�$�5�
M��ܣ>�Ŧ8�i����f�1Z},��	cox�Z�b������ʺ�fYi1c]�bY,����H�"E�#R�HIE�)�H��Yl*��Ჭ���p���MZ�뻡ɢ%z.�����j`F50��v�hX��&��rw��k�0"]4��c�V���SQ��(�Tb*
+1Z��
���-�nipK7u�Ŋ�ъ��K
��I�׷~���Ә��R�uc�%��}N#i�63&����by�����PN.a�_�̬a=���n���x
��O�q���R<��z
��X�`iL�K�H7ӍV
���]W^Z*n\z/%�a�}�F@�ǰ#@�o�a�F~c8l����MČM�Ax���qR�Sm��K�z��G�j�H�#�ÿ��h����%'��3
�$�,�D����]
+�5
si+}8]����oA��
+\��l���
�gq�?��
��X�
+��Õ�VM<B3��ذ-E��/9��\�Ǥa����
����R���=���18������#�GT8�1�6l<I\�f�k�
ҁ��[:8v���jfL73:͌�f�l3c���ћ�f�f5r��4
�i��636��ӬFN�yM����ج�n�j��:�mVw�Y�]����b#d���D���uǜf�`��dw�56���xG�ູV�'��[�
+nd��G����so�Rܝ���O�͍a��[U�v�R��[U��X��s��'w��Z�pb�ѐ�t���nft����u!�u�R�ǒ㊆����_�V�ԭ�q\�g���]��ʡG��lH��o:�u7�֥�L.v3���u�A�I
��Z��\}ً�L-���n}�Ed��n���}U5d
��Y��/��:
+��ɉ�
���
��RR�PCQGܱ���44��<��R{3&XJ�u)��G�źK���)�՜��;��i�Fp�j���7��5�GzXgغ,%��c�8�a�p��c،�,%c�#7�
6Rw��X�$k����Fz��A�)��A�=f��j����B���^����ZQ3����<��\Ky,b�f�E���%�

���9\x��c`�$�
GK�n\C�YJ�Z�m�AF�E��'#E�=R�HIEJ�zT`�wg�L�z%��}mbD_���&F�aąGњ�EkFњz�n���oQS͌V3c���nft��f�L3c��1���51�á��lfԚ�fF���Y{:���i֞N��t�5�Ӭ�fM�4k:�Y�9͚�m�tn�Vr���۬A�f
�6k�Y���l��>Z��v���l����?��+7�#,f��q�]3�Ky$�d4풦
)F�����k\�Hp�
z-j�<F4�F#�Tri�k��t��u.f�[Ö���X(�ֺ=��t�_tZ�j%��G�NcRofDG��:�rl1����43�͌�f�\3��Ĉ�ŌZ3���h436�;�"X�h536k%�Y���Ō�Dk� Z�ћ5��X#
a�h�
��6k��f��ڬZ�5BkS�f-�ڬj�fUK6��d�n��o��]k��Dcfj�$�z4�� ;l.��z��8� �{���	�
5n;n�8�޿�����
j<������é�~�{��$C�	cǛ���䭯�]^y� �]������ F��X�
�
���o�k��
C^~�[]�_
�����ȱ�)�&3��e��~�̢
. 7'g\�c�J�v�+�H�!}Ըb�H�7a\��9rš���JmF�D殻p���#w''&�K�.-:�}eQy�%�Ny���ɑ��L^�?��|1A0Y�D6���q��6�ÿwg_���}��y���*�r���?n�xz�e�q��2��|X��}�7.Z�>��\�����6_{�׹�¬����c_��gQ�
�lVf�nۿ/0�����v-a)kMXc�a�t���Ư闺:ύ
�_��.��Xx\���L����S�\2y�E�,z��c>'�Ƕ��P���q�Ͷ����7_��E7,����[����'[�M3�mKr�k��^V���i [...]
+ThE�Z�`eXjQa-�����:٦[
E'0�u� X����:�	]7�ű�����q�A�#n�fqK6��d�-;���������>|�{���{�=���x
^�M;س�f͋�}<_��pA�g����u�yf�voCQ�3/5��$�%Yg��J�<�����%�(eMmbɧf�
��Dq0��S��
�}^�E2��ʟ^���~��V�u�櫮M
s�:�9����e��E<����0�Dר����
|�nڹ��
�ꜷ�K�M�� �`�&���	�}�%��6��v�,���~g˕��
㽱�����l3�χ�T��
+�1O�u����3�R��������V=X5�L� Wш���� T�7/�I}�
^0Q�ߨ��
+ۅӮ�8�'j�����m�ͯ�i��?�
+�����4��}� ��Pj��jͩn,<�՜UY_�
�e*�PUn���̛<9��E��L](�5&�;�Yv�ymF�+۩���#6���qBh�4�D��j�
�FQ�h�Չ�80V9
}<�А���5X��j+4
��H��x��ċ<ͬG����$�"��	w�nN
�z+��ˏ����
��
U��u:��.^Iv�����B󬄺؈ΗJ��ԝ�)�Ң:����3/�=����.	��/SMK����I�q����+�~��vQw�Ҥld :�n$��b`b�L�*�TNT��J��o��Z}���Q�fS^�c�f
���9���`˙�8�PC���h�]��Y�I"����A��e��w��pT8z_[���̥{�ܒ�<7����|�S
U�;U0[�/�x�oq`C���`�J'#+�hXff㾬����c�+�ޱ|�6��gx'��m�Q�'��
Ȉ����ޓ�3��ɺ�T�\(��
����ܵ]t~�|�"<T�R�n8UY�^�Af=6@�����
Z���|��F�  [...]
+�WY�('�==�ENo��|
+��������������������������������/"L>K�H��
!<�|7FO�x��%I��=J��(Aj��.Z��9(W�P~BEc1Be�+2!��m?��A�lː��4��AKZ8gГ��-$��']����l��
�-iQ��H���v_�
Ȉ���2T�V�G&���
��g�=���42�P��vH at vO�����g"ƁL~�y�x�Q���X��@�J�� U=��ؠO�d�K
2Ȇ/��j��!���E��6���=.�7��!�Cr�/�>r�>�*lɟT�/i_zGg��G�
�S�3�a
��endstream
+endobj
+9150 0 obj
+20761
+endobj
+9111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [121.9298 646.3667 372.5587 657.2706]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+9113 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 437.6386 200.4511 448.5425]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_9846bc1d16b42521b6cda0e8a4799115) >>
+>> endobj
+9114 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.2003 437.6386 292.8435 448.5425]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9115 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [428.6073 437.6386 513.9963 448.5425]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+9116 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [290.3409 413.3208 358.0561 423.2261]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9117 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 391.3454 200.4511 402.2493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_bb6956f4cc086675f02d421fef46122d) >>
+>> endobj
+9118 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.1796 391.3454 316.536 402.2493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9119 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.1652 391.3454 424.6313 402.2493]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9120 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 333.097 200.4511 344.001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ff1c6d17be391cb22a9c4d4e0fa0feb8) >>
+>> endobj
+9121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.8676 333.097 303.2239 344.001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.8212 333.097 431.2873 344.001]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 274.8487 200.4511 285.7526]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_9f616c59b2d80aab9f11db8f3c63883c) >>
+>> endobj
+9125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [226.9747 274.8487 338.3958 285.7526]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+9126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.5302 274.8487 513.9963 285.7526]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.6942 249.8003 245.4094 259.7055]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 216.1353 200.4511 227.0393]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c4e8228056b829aa7e0e05e1b292d2c3) >>
+>> endobj
+9130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.7883 216.1353 305.6154 227.0393]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.7965 203.0421 243.5117 212.9473]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 180.336 200.4511 191.2399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_e315cd842b8a3bd48d730eba070969b0) >>
+>> endobj
+9134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.7883 180.336 312.2409 191.2399]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.7965 167.2428 243.5117 177.148]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 144.5367 200.4511 155.4406]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_440d3df9ebc23e058ec03d5606cecda9) >>
+>> endobj
+9137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.0544 144.5367 304.6107 155.4406]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2278 144.5367 422.6939 155.4406]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 98.2435 200.4511 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_bcfc281c9ef2a45bcfad5ed4a1109b8e) >>
+>> endobj
+9140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.574 98.2435 313.5163 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.968 98.2435 425.4341 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9110 0 obj <<
+/D [9108 0 R /XYZ 90 757.9346 null]
+>> endobj
+294 0 obj <<
+/D [9108 0 R /XYZ 90 733.028 null]
+>> endobj
+9112 0 obj <<
+/D [9108 0 R /XYZ 90 477.4678 null]
+>> endobj
+9123 0 obj <<
+/D [9108 0 R /XYZ 90 303.639 null]
+>> endobj
+9128 0 obj <<
+/D [9108 0 R /XYZ 90 232.9705 null]
+>> endobj
+9132 0 obj <<
+/D [9108 0 R /XYZ 90 197.1712 null]
+>> endobj
+9107 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F23 2436 0 R /F52 345 0 R /F67 370 0 R /F74 482 0 R /F37 1999 0 R >>
+/XObject << /Im15 9106 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9158 0 obj <<
+/Length 3173      
+/Filter /FlateDecode
+>>
+stream
+x��\k�����B�\	��|?��@�DR;q�m� 	Z��Z��Q$������rIqD�"+	
�J:���%Ϲ�<DF����#%2���ly�G���W���>�
�^]<�R��AFR9��k"H�%ttu�����`�ǯ&������Մ�q�x|S�n��/�7����Oڷ�ݶ�u��w�ޘ�|���/		�QFR9��/-$�C0�����uO�!.�ߊ1>[L���%x|51t\-׋�j�����6���jo1"Ę	c�^|q�
��Y0Il���g<��zs�3Z���
��1t���������q��/�
31)
�ő���
aHr����	D5��2���~�i���m�H�ӑ��Z}�0_�vŚ�������w�TxlǶ��~p�u_Y���V3��v�L��+�_VB	����"`q��2_4
+
#��/
+�)���`�K�|Q���!
+IJ���lQ~�T�1o���rd4|���l��Q��!Er
,��ʫ��P(/"k
Ȏ�,�K�*��)TZ�	
<�W�$9�)
�'?X
�/�H�Z_m�	��p�
U�ˍ������a����
+|@��V8z�/�H�6VW��U"��������1n�D�3�ң
+<�� ��y�"
���?\���W/����W?�L!�@j�(e��
cd���>������;lrR)�Y�lr�`rRJĈ���ɅӼ՛�
05B����\7n�8S�*Ĺ��Z!�(���3Z��q]����u�4 SHs�ÅC|�
?��	s>ԵC�a����];&tе�<(��
+�{D�6�V<rh5<�D#�ki|7�M���tq���t]%�ނ�JxTJ!Z>����*
:B;a�z���
+$c�R4
���z�4&�
+.��
+��
� 85�qk��j{T��%���"
=
���(�b��̆e��dh� R\�ӺG#�=
�.�k��E6Rh��6z�:e�
+�H�ξv�v at R�R[q�r[	��JOޞ����a����m%�n+
u|[�	
l+y

�䀪#"��"a_K��jx|�F�������j

 �|	<*�
��H�
�'
Q�Y���6XZ)gJ���m_K�%�-�����
�R$���|�=��÷����B�i)6Z�qJK	cdZ��}�
����6"�AJby�݉���(����m�#�m$�
n#Q�s���W�j��z4��4�h:�,v������3
š~EG�
�(Y
[
�VD$�Qš������$n���}B@�8
����4m�L�h~zEI�v ֡G��N�����5bb�^J��Q��g���B�8��>ȴ�m�~��Vbh�<�P�4�1m�h�/�X<5��ř�U�~G*~R
b䚠�}�&X�ϴ={6 �_����̞�����V�>
���!n��޻�յN��yY-o� �~�����`���ݛiW�����o��������vT��UγPB�t�݇�L���b���=��K�\���Η�j
ž�==a�a�I�%��(�,
E���D��"���tV]{�i�H
^F�*P��ٳAfo�i7��̲���uȡ�Jsډ�0F�b<�r���=l���)�l�����V�]݉�)t�g��-��|u�m�`9���no�Ƭ�t�G+�ٽ�o[Lt P2A��
�6�I;�z�1U�$qh����;TY�O�N�w���w at l��S<^�Y�^���]��
�����9Frd/=(O��[
+�7�����hiN�w#'o���
�_�>����=ƥ[&<���0`f�^�ۉ7J{S���p{VI�������%I\�`������c�
v��J�P��Z F4�+�zd�ۍ
9E�a��
=,�c*
��v'=v���O̞�r۾��~ҝ�W�nm
�h�+(�$@�1�m|
���v�i���2������Z�7�t����Z洜��
��k9J;D�yI�N���m�o����S_Q%
e�@%�N*)����a'Ja�w���9Q;�G/j�(���Nދ
+��k�@��
+b1�����wF�]1\���=s&K�q+[@0g���´y
����<�$ng0�����Ϧ���] V=wbd�ɗ
+D(g�Ӱ��� 5qk$'�@#c
��@��b�������:��W�
uPx�І1�L�?�̚�f�v�t�L��.@�A�ӷ��T*$µ[�
xX�€(��\ J�u�8� (H�v.pS?�nS�w�sY8|�*e7
)��^ُ���|$�I��0FN���J���y�c��T����&HF��^6"g���
�����
VVv0��|^��0m^�Q�!��H�vʶ=�^�����ˤ���R$�l<����dB���m�p#��Rx|�Fw�~fO��N�����	�c"�
�
|_3�Nr� F��
�����i
"��n�����	�}�蔕�D,�VR���Ub��I�+�b0c����)Fi���
`�I�'S�m�]�x�e��
���>�h۫��
{�r��0F�<�?��
~��]�QaA�ٷ+DD(7%�:XY�A��~�y�~ôy�Fi��7O �����L�m*_i�|���;T)��O5S{e��m��62��
�� �k�{B� [...]
�F����Pv�ȡ5���$����3�\�~���}��0�[
Zf�GH0ƑQ�vC��[U�í�
�����c����`VYA�/��i���]�3
�.�Msz�m�3P��7tOl#�ٷ��p��y:T�;�p��'�3̙5�(� ��gߏ��7բ=+���
�0�j�Ay�/MP΢[j&���
�b�I#�H�
�'����f��j��`*D�]�)�I?_������)���o���ޅ$�g
�n1��Ͳ�%���-��e��R�m�͟&B�;{9]=�ǡ�tp7c����*�ѡ��q���U�S�
+�
'q��O�7r�#| ���e���|
r�
���n�����޽C�-zX��4�=_�ϓ�B��`
�r�w�A	���
S$��;w+��x��7�S��@bǂ�R�?#+��endstream
+endobj
+9157 0 obj <<
+/Type /Page
+/Contents 9158 0 R
+/Resources 9156 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9143 0 R
+/Annots [ 9160 0 R 9161 0 R 9162 0 R 9163 0 R 9164 0 R 9165 0 R 9166 0 R 9167 0 R 9168 0 R 9169 0 R 9170 0 R 9171 0 R 9172 0 R 9174 0 R 9175 0 R 9177 0 R 9178 0 R 9180 0 R 9182 0 R 9184 0 R 9186 0 R 9187 0 R 9188 0 R 9190 0 R 9191 0 R 9192 0 R 9193 0 R 9194 0 R 9195 0 R 9196 0 R 9197 0 R ]
+>> endobj
+9160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 698.0082 200.4511 708.9121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_82341fbea6e1c21a80058424c0ccf2d0) >>
+>> endobj
+9161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.7883 698.0082 248.0422 708.9121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.1729 698.0082 344.6389 708.9121]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 651.2113 200.4511 662.1152]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_45243459137b3c9e917bde090a48ba01) >>
+>> endobj
+9164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.7614 651.2113 302.0297 662.1152]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >>
+>> endobj
+9165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.8744 651.2113 430.3404 662.1152]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 592.4592 200.4511 603.3632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_b6db0040a47381b41656b2846ce782fc) >>
+>> endobj
+9167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.8661 592.4592 281.0265 603.3632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >>
+>> endobj
+9168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.822 592.4592 427.2881 603.3632]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 533.7072 200.4511 544.6111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ddf613a0448b642291d5e60910983a81) >>
+>> endobj
+9170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.0876 533.7072 254.6878 544.6111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+9171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.0843 533.7072 299.8112 544.6111]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+9172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [351.7112 533.7072 427.1773 544.6111]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+9174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 448.4607 190.7379 459.3646]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 448.4607 261.8505 459.3646]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6a10411642132d2a11144719a8cec9fb) >>
+>> endobj
+9177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 411.6539 190.7379 422.5579]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 411.6539 262.1594 422.5579]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d850947fe33d1adad7b33c58ab859ce0) >>
+>> endobj
+9180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 374.8472 183.8239 385.7511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cecce63184c4367b7e48cd7f35b29adb) >>
+>> endobj
+9182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 338.4141 192.2722 348.9444]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_112cc024004bb7146ddccaa837664bf5) >>
+>> endobj
+9184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 301.2337 241.9353 312.1377]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_062e6c821cbe563825968a30a108f14d) >>
+>> endobj
+9186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 264.8006 193.2289 275.3309]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f4f6e42cf5b4be24e73efab004e22a34) >>
+>> endobj
+9187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 227.6203 213.1634 238.5242]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cd523ec773dc09fcf2c3ebbbd70b3bc5) >>
+>> endobj
+9188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 227.6203 315.857 238.5242]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 193.1521 189.9009 203.6825]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d43b1f8f4b622041e8719a0b26c4a2d2) >>
+>> endobj
+9191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 156.3454 187.6893 166.8757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_345c97f889e2b3dae5f12fcc130a8b75) >>
+>> endobj
+9192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 156.3454 226.6926 166.8757]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 121.1301 228.8952 132.034]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_085c8cf54c180f7eaf693904cb6ce68b) >>
+>> endobj
+9194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 121.1301 333.4819 132.034]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 86.2883 229.5026 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_302728bb407aa3c4137332e3275d21fe) >>
+>> endobj
+9196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 86.2883 334.0894 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9159 0 obj <<
+/D [9157 0 R /XYZ 90 757.9346 null]
+>> endobj
+9173 0 obj <<
+/D [9157 0 R /XYZ 90 463.5253 null]
+>> endobj
+9176 0 obj <<
+/D [9157 0 R /XYZ 90 428.741 null]
+>> endobj
+9179 0 obj <<
+/D [9157 0 R /XYZ 90 391.9342 null]
+>> endobj
+9181 0 obj <<
+/D [9157 0 R /XYZ 90 355.1275 null]
+>> endobj
+9183 0 obj <<
+/D [9157 0 R /XYZ 90 318.3208 null]
+>> endobj
+9185 0 obj <<
+/D [9157 0 R /XYZ 90 281.514 null]
+>> endobj
+9189 0 obj <<
+/D [9157 0 R /XYZ 90 209.8656 null]
+>> endobj
+9156 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F52 345 0 R /F37 1999 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9208 0 obj <<
+/Length 3896      
+/Filter /FlateDecode
+>>
+stream
+x��\mo�6��_�O{	�p��R
��m���������Q����Φ鯿�D�ԋIy��E�@V�F3������(���,
^(��a\.V�
�����^w��_��|w��)I���m�A$(��w7?^�8��&��7W_ͶX������<ߗ7M����}S4�_~ٝ^W�]�w2�����W?����7�D�(��
� ����N���`D��N��ZG�x
����jS�vW�T��wW�^�ۇM�/�3o�۲�"���Vp�!.��V����#���ĺ�׋Ƌ��w1���	~`D��������\�p�ߠ����0�\�Ĥ0pđ�p��aHr��xJaQMA��
a)xhw�|$y�Dp��tĬ�ޖ�Ǧ�9��H���0!�O��c�	���*%�qB����Eu�
���;�Kc\!M%qw��=4y�a�׏�M���6W\\�[w���O�j�z&�FC��
�i�	c6�
I�|��߯wS� ��aN
���q�P�".?�q���V��m�{ ��P�B� ��!����($)Ջ �>?�b
+yk7V8��rv�Dؐ���u����޷j�4wN�ml߉���Z����v�{9��%D�&�'�R9�� ����OX�U]��C� Ra�\�
��^
�_�,���v�n���
�U�}�r �@L�A7xU^qi#���/��
B�� ��2��֍�����f�Z�ը}���(O;$H�@(����w���aY�<�!(,�\O�
���Y��#�H&L�T�%,��	O�|5���.���5!�߀�!:�
��-��r�d���,D0'��HE��z�l�e63犭���VWl��[8�Ŷ_��FBq�	�^Ǯ3Z��� �����mlCR��ve�>�8T}�U}k�}�D?X���V~�4����aMJk�E�t�^٤v�����ՇnoY;�G��� z{s��������]�gUo
���q���1��\CrH_�'�5�X�k�
+\#c�q�����[�s�����Y\#��kdL{���x�k�t��k�a����5��8p�
�5z fr��9p�4���ӸF�!���F�!�1���1�{�Hz��52 <�{�T�1r
Q�)��*�䒊���o��^
�۲*�b_7��60��]�cK^*c��bgz�_��&ZD#�:�iE:RTˋ�ŵ��Zϵ��U���`�;�ç���o�Y�� %\�2��)+�G(
�[;c�35��	#�`F�8�Z ���� �%~�����uįgv��)���	���s Fz[�p?`(p�ٝP�20?*	��8�SQ��3
�30�zg3?�9�	/�� 1 �x"��4b\����,c�3yE��t�A*��>h<�W��v��Y�3�A>b�w&�H�'�T�g%&=ay���� a
+C�����9&!1�j��Υ>���	by�C7A}X���1��	�#8�Ḋ��}����c�Z�2����
�>�ť�1X��="�{�
�g�Ϻ��v�
�`"�3�f	
+�dW��X�hD
+SD#m���l�h���!i #���F���H[D���<ј瀈h$a���F4R�8�4�@4bs��<wDD#�e��D���GD4� ��9$G4�y""Ic�'��'"��������	&��JA�#
��	&'
�05�4ԛ�`R�c%0FLN*c�NDi�i���&�)��R^�"E���_
�/��Q
�g�š�?jf�kx`������b��Xa��e�:��3{lI��p�M�)��9 #��]Yo�}�^���rUۖ�`���n���!�d��

�8�6���(
�,�
�s��s0Fz�H�۩�-��7S{���
�wI�
�d;����yn��+RXRsN�u$*X˖0�Ln�:Q	c�g8c\	����0陪O��cwvY"����-W4�����m&�<O�����#v����5j�>�?o;kE�ܧw8g���{z������:��TO�%K8Pp�(	tھ�+�+XR�1J�`�]}�Y��{�ס��
�����%@�6��Z��.��xY�>F�$�����e)R�*Ki��,�f�e�gvNYJ�
����G�pS�H[@R�R
�
a<đ(GF|�;�|�H�I�b�v�����H-�0N�F0���^�HU#/��F,��W#"4�GT��r$��
+N
-G��I���׃�ɺL�FG'��'
�������E�,a|a�����w�;�m�iA�?�_�G���2�
j
„
���j_�����
��8_�%ow��0m`
/͋W�4<��/��+��DYIuU%��,*=�3jJ��PkԼ������E���B���d�����$:3��x�H���YaJw� �A�!����P�ˇ��m��#��E
?K�|/���I������;l6��{f�t�4��^�`g�ƾ
�OG��˄"i/�
J�p��?
� ���� ��1�;�O�h�e�A*�Ao����@N	!��B"K��ˇD��!$�v}H�f�!�3;'$� Fz㚰��в���Yv#��XC!.)K�#He�Pǂ
ZBc.�f0�熊s�u�#A�����w@�{}�[��p�|ءq,oS;O��0'݄cGě�&X�
�p�
��2�O��(�s����)
���h�<�����>Χ�ۛj�Wu�|[n���J<<��$��΋e(Ū�f��
��!\>���S30
�I��A*@R���~;
-�0�\����~��9#��9 at h���i��#�NR��z7�}�V��'�
gMND*R��IŹ�?���к���כ�uu�?C�*���~r���{�YTmw
�9k��TRu@�:����7�pq؎d~ra��}8�H�n,iw���pڎ]69
+IJ�4Vxn"̀sb=lm"���$R
�4�M�j^"U2�� ׃�O�8��h"�3 @"UF�A;&)f`<�H�|�Ho�F
0LI�>R�6�!}y�;3T� ���Hc
�L�����c�U�eS���l
+��)?>�B����OMRnP��:�|

��΢)X>�
Pͧ��!�LDS�Tr
	=0��IӞ�ƭ������3	`���;r�oq���BJ��ڋ$�2�� �V_��gJ&����{�#�)�؟�tF�=|
�v��|�I2�ȗO���*�&�X>QF
+�N�ip>Y�ض�n������r��P��%�l#8�s6���-�4� �C����f�����}9�7a�e�u�� a��:h�&���0=k?X�"�I��(��w~6mB8|H�Ei=����n
�n-����nl=�[W
7v��.�V�k�����S	�J�	[�?ûC�`�%'/>�G�y��-
IJ)"Vxn�Ȁsb=l�SD
+��)"
4���v�q�eS�3�6�R�$�� ���C
3h�2��$9�s���D�bg&���ۢ*,;�Q�D!�ݨF>c������"�$N8A����U�'�Hab�/c�����3�
�^��~l�o�x��9
#��}��_���G���Jd
�2�m>c�Ͳ��O�e��
+�Y�ֱ�T,{�c����{�
�:��qay��.���B�()?c��Ew&_�k&KT�l}�b�����.mׇ]l6���7;c�=`��"���#������c{��UɠY���'�j��Yu3R�5/�Nbܗ+�-�_va�
��f�7̮B(�uѽ}9܍�������ؐe�B$�����G"�<�s����2��~Րi��x�>�;�doڹ�f��������|�����ە���.�G?ΰm�w1���$@�MI������?�c�D<!}/uWY����i+w�utG��|=�Ho[~���/_�~zzB�
z��
Z�_?<l^��c�D��=�z�Ah���~�)������
������䶝'�#A&��65]�endstream
+endobj
+9207 0 obj <<
+/Type /Page
+/Contents 9208 0 R
+/Resources 9206 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9143 0 R
+/Annots [ 9210 0 R 9211 0 R 9212 0 R 9213 0 R 9214 0 R 9215 0 R 9216 0 R 9217 0 R 9218 0 R 9219 0 R 9220 0 R 9221 0 R 9222 0 R 9223 0 R 9224 0 R 9225 0 R 9226 0 R 9227 0 R 9228 0 R 9229 0 R 9230 0 R 9231 0 R 9232 0 R 9233 0 R 9234 0 R 9235 0 R 9237 0 R 9238 0 R 9239 0 R 9240 0 R 9241 0 R 9242 0 R 9243 0 R 9244 0 R 9245 0 R 9246 0 R 9248 0 R 9249 0 R 9251 0 R 9252 0 R 9253 0 R 9255 0 R 9256 0 R ]
+>> endobj
+9210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 697.9944 187.2643 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_5468429667edd0199d41c11d79d3d9b7) >>
+>> endobj
+9211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 697.9944 293.2128 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 697.9944 371.1477 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 697.9944 455.7274 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 640.2111 187.2643 651.1151]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ef0c072f344fd2a732e792578091cc9d) >>
+>> endobj
+9215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 640.2111 293.2128 651.1151]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 640.2111 371.1477 651.1151]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 640.2111 455.7274 651.1151]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 628.256 220.0576 639.1599]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 582.4278 186.3482 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d9bdf9f5b0e6b90d5c0c173ada762067) >>
+>> endobj
+9220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 582.4278 293.7723 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 582.4278 373.3671 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 582.4278 456.8371 593.3318]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 524.6445 186.3482 535.5484]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2e81b3aeb6ec2e74bee0cf690d44cd69) >>
+>> endobj
+9224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 524.6445 293.7723 535.5484]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 524.6445 373.3671 535.5484]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 524.6445 456.8371 535.5484]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 512.6893 218.4038 523.5933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 466.8612 232.76 477.7651]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_23d4da5a4d3ccbef1d32597a77661ab9) >>
+>> endobj
+9229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.0972 466.8612 335.4536 477.7651]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 421.033 232.5107 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_786d96ab353d022f56f211fa26e76766) >>
+>> endobj
+9231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.8479 421.033 335.2042 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 375.2049 180.4964 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2282182b70472430c77106aecf3c8029) >>
+>> endobj
+9233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 375.2049 283.19 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 364.246 213.1533 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_0f1e6f6f630698056d7e35149796f3e1) >>
+>> endobj
+9235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 364.246 315.8469 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 353.2871 238.4586 364.191]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_77ae7142afc112b5cc786f24875cc336) >>
+>> endobj
+9238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 316.4253 205.6917 327.3293]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 316.4253 261.3124 327.3293]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_75b26365a17a571d891fe7d0b5ded447) >>
+>> endobj
+9240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 316.4253 332.1558 327.3293]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 281.5561 205.6818 292.46]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 281.5561 261.3025 292.46]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_5ef6af0a8b11cc47f885ffc74e7be5b8) >>
+>> endobj
+9243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 281.5561 330.4624 292.46]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 246.6868 205.6917 257.5908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 246.6868 261.3124 257.5908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_374c1462c19381ba7d0f27f4bbd94a72) >>
+>> endobj
+9246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 246.6868 338.7813 257.5908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9248 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 211.8176 202.9022 222.7215]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+9249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 211.8176 300.0368 222.7215]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_632c2bfa8f851855c68d4c919e1cd237) >>
+>> endobj
+9251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 174.9558 202.9022 185.8598]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+9252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 174.9558 314.2635 185.8598]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a34fb5a16a8af56089e3a09b86263a08) >>
+>> endobj
+9253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.8192 138.4677 199.8638 148.998]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_98d288c85ce5c2e32cee27f20c6ce7ac) >>
+>> endobj
+9255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 103.5984 161.6774 114.1288]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_453d3ceee367754b17c722b66cb03e69) >>
+>> endobj
+9256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9209 0 obj <<
+/D [9207 0 R /XYZ 90 757.9346 null]
+>> endobj
+9236 0 obj <<
+/D [9207 0 R /XYZ 90 368.2311 null]
+>> endobj
+9247 0 obj <<
+/D [9207 0 R /XYZ 90 228.9184 null]
+>> endobj
+9250 0 obj <<
+/D [9207 0 R /XYZ 90 192.0566 null]
+>> endobj
+9254 0 obj <<
+/D [9207 0 R /XYZ 90 120.3256 null]
+>> endobj
+9206 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9271 0 obj <<
+/Length 3421      
+/Filter /FlateDecode
+>>
+stream
+x��\mo���_�O�
�
�_��@߮�ҋ�_.C�[�-������
�.ir��ٜ��""�
�<
���pWd3
+���љQ�8!�lywFg�p��g���>�H��<{��V3G��zv����Q�����9cD��
F)��=gt���-�ޞs:��>ެW���_6����7����xX;�����
.��x���oK�q��T� 9��W-$��(�����݀&	c�ƯQ��]
�\����������n�|���ޟ3;_o�pI0��B3o���1�]�|�����~�����3J��j��Pœ㳻3�Exs{���o�N�A������W�X
_@1A��^�P�P���k�
�� T\�
�s
��D����(
�|a>����.���ܭ���n۾}ۆ���M�6����_�w�Z���������x�8v��c�b��||
w��i��o#�Rz0Bu�š((�F��9�O�|�s�
+��F�A����:�����aU��

�*w�?�_w��R��(�z���j�9�Ïe����R"A(�?LUEU/
+謁K�C��	i�u���a�B�
PAM���%DŽ"�r��FC�ș�Z��]Ғ?��t�Z���Ď��[܁^0݉�{JE�x&I�g�$
o6����M]u�'
��UA���ol�����WQ��V_
\��r�:l�
+G�5[�����`m����՚��Wk�z�j��(��ڬ���υC`��TQ
CD!
85�C�ȣ�k�7�@
+�rb
�зڔ�0
+ҨE�ADa΍�P�d�_-����t��O��FM����������zy<
I��2��ז�ϛ�M�M��<gj
Ʀg
�
�e��
0��0���1���(xe��@.P���@���J�����"Pu�]�b���ŷ�+?-jR��H�$�.\X�C��@�j�V�+��$�1�ݺ\	�~��A�(Ļ�䊛�;"W
+z��;E�R��0O��ú���
��j
W�Yh$�>k��υ�w�rP���B~YC�	T���i���v)
sC:�hW��ڕ�h�Ӯ����vH��S�綪[

#P�-
���vuu��n�6�^���{0Ϫ�(��O%
W>
���;7�c���UD��� ��� D�\x}0J��1قR¹��n�l%6j�`/�����^T����/[�ݬ�>�]�����cE�|M  _?��	�i
��a��%k�V��-u��e��	uB��[�ۡ�
-� E�Q� ^��^��[G_�rj$"
�Q��u����Ḿ+�
f�!��"����Bݒ�x�<���s��=i{+�Qӷ {����m��,'T[
��p�֗�SW����R��(��a��%k
+V�,u�+X�z���Ivk�e�e~���z@��%,&Mo
�K�qJ���x�Faw��I	%4��PDBBH�ZoT0!��p�Sn�=	Yj�"d6����	%J3W�A(e��jrTͤ�D��gW3�����N]�:؄}����Y
+W��m����N�5�݁Z��lJ,�H@"
+��� S)�19��C�O�S�����493�8�� ���D�s
+��)N�u'향6jj`�Ge��hA�dD
+���'(L ��E�x�������Kݢ�[�zB���(�&�w�h
���
���R[CD!
��$�@:��?Z���3�����x�Fa�ӹ� XK���BDa���I��
�X�0q��$�Kl�.�^���d\�{i�
�=�֥�ws4{����;D�"
��`E���@enQ��]O(�Daw��
[��
+#Y= �p��?;(�1*U&"vjH"
�QحK�`DH�c@�o�!TB�����uU��Z1u�R�6*Ja���p@�-�S3y=�L�~�R�ю?�֘А6����"
W��`M��~�r�n��d�vB3�(�e�K
+H=���Q
n 
ʨ�8����X��ԨD<B����b�
+�L��¼+hD�
���F����=��FM��v�͔^&��y���X.��Lp��=�Sa��%k�V��-u��e��)eY�Da��r�������
��B(p�������Qe�����hvsQ� �~e10�	P	���	��I at YV�#���I��d��m
��J[us
������1M��xeFH�|�M/� �Gī�M��Ⱥx��q��ܢ╻� ^��n��,e�wƺ��B�piA�(��xS��2�O�I�c4
+��dLY(�
+:E�֡�2S������)N�KmT�,°���'�ʰ��X",{�}&� ����gW3�{��
���,1XS��ߠf��j�����g"
+�e�h"%t
ՀD‡x-��o451���a�x�Fiw��YG�(��gn at a$
#���vےKS^��U�ڨiY��OTe�,�W�=���A��/x���#�`��%k�W�/u��o��)�[�Da׳x���4��Fsh�CbP�{�e�؃ƕ~}�4:5 �2���
�~��/��Ň�R�}i`�/�� ��O=�*���uu�����:��FM���������!D�⋡�*�z
+C��1:��F�
o7��~�+��Ÿ�P��@]%���(�������}
�y�>�}��K����T��S�{H3�h����B��*
pQ�f�fM�q��أ�8�Pr�8
6��F���F�F����@\.�U��D���l���F>{�a�Jn�s"
�9��J�A�v9's��������(�N�9�Ĝ��9'���&��1j�F!���"�
�ޭ6-4�N�z0"
+cM�p)c�긻���J�d���"�9��%���R�\ay.R�
�"M��;gX�E

�S؝��D��ʕ�]D��wC����X
�"ƈ5�għH����Z��|�d��n�Q��?稹
�
m��b�:
�)��VɧG���@�{K��M�I��;�7��\
+�{�2�i#�L�
�)�o��/���߹c�m�ݹ�0<�%k���7d��-��2�S2Y�Da��������f���Z����U;�J5��NWID!l�2P���C����L��I;����vXs�T��R�šr�ko�l�ѫ)�SӌV�c�
Y����ޕKD;q҆����8���1�b���s��Wwڭ��'��2��^�A�j3�~��o�A
[r
2�����s��?��
�x!	I���hL�C�#
�V�)�1�;��0|Ġ��
uC5S���ò��W�C���L9�[b�l�`��vG�'�^�
'�-1,?zA��D	����F���ݢ{�m�v牶o�?���8Wj~G?n����ɛ��ǃ%�*�߯��Q!�
O:�
x���b,�R��?g�՟ӧ�/\$�h��4ɟ\�����x����ϟ?��<l7�{�9����}��%)�
+܈��]DP�%
���h�O���;]�n�_��j�xהх+6H�?��0endstream
+endobj
+9270 0 obj <<
+/Type /Page
+/Contents 9271 0 R
+/Resources 9269 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9143 0 R
+/Annots [ 9273 0 R 9274 0 R 9275 0 R 9276 0 R 9277 0 R 9278 0 R 9279 0 R 9280 0 R 9281 0 R 9282 0 R 9283 0 R 9284 0 R 9285 0 R 9286 0 R 9287 0 R 9288 0 R 9289 0 R 9290 0 R 9291 0 R 9292 0 R 9293 0 R 9294 0 R 9295 0 R 9296 0 R 9297 0 R 9298 0 R 9299 0 R 9300 0 R 9301 0 R 9302 0 R 9303 0 R 9305 0 R 9306 0 R 9307 0 R 9308 0 R ]
+>> endobj
+9273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 671.4037 198.0107 682.3076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cbcd7cd19d71e22f0a8deb3dfc536462) >>
+>> endobj
+9274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 636.9081 205.7516 647.4384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_61834f7d3b6629c2aafc5011c258961b) >>
+>> endobj
+9275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 636.9081 276.595 647.4384]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 602.0388 236.7449 612.5692]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1af6f8ca3539ffa5cff895d30c7d4d7e) >>
+>> endobj
+9277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 602.0388 307.5883 612.5692]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 567.1696 267.9376 577.6999]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a04426c5a10bb84d277c580d8377a8ca) >>
+>> endobj
+9279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [295.2748 567.1696 338.781 577.6999]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 531.9267 209.6269 542.8307]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_123c8d12181469abfa5dce562831a218) >>
+>> endobj
+9281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 531.9267 314.7912 542.8307]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 497.0575 240.6203 507.9614]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_7ba29a874c71bb8631504b25945713d3) >>
+>> endobj
+9283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 497.0575 345.7846 507.9614]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 462.1883 271.813 473.0922]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1773f4a296b1e34a24fc238f84d615c7) >>
+>> endobj
+9285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.1501 462.1883 376.9772 473.0922]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 427.319 212.377 438.223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1fbcf2de5cd0eeca6b521e70b7d731a7) >>
+>> endobj
+9287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 427.319 289.8459 438.223]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 392.4498 243.3704 403.3537]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6) >>
+>> endobj
+9289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 392.4498 320.8393 403.3537]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 357.5805 274.5631 368.4845]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f6ef577d2302b2baac4689f8766cfb2f) >>
+>> endobj
+9291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.9003 357.5805 352.032 368.4845]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 322.7113 216.2524 333.6152]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6069a2503278c2ba8d0f3c5b80dba198) >>
+>> endobj
+9293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 322.7113 328.0421 333.6152]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 287.8421 247.2458 298.746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1760892eb5a3f38323cff257495f1711) >>
+>> endobj
+9295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 287.8421 359.0355 298.746]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 252.9728 278.4384 263.8767]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ac2ae1578a08e1613a4e7ddfa0f4b711) >>
+>> endobj
+9297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.7756 252.9728 390.2282 263.8767]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 218.4772 193.5774 229.0075]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_60b58548061b148441614897071b152f) >>
+>> endobj
+9299 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 218.4772 232.5806 229.0075]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 205.4754 248.8445 215.3806]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+9301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 172.649 193.5774 183.1794]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_451da71733ac3915319b8bd36744d415) >>
+>> endobj
+9302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 172.649 277.6909 183.1794]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+9303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 159.6472 252.6774 169.5525]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+9305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 126.4473 255.5641 137.3512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d00fd827006fff19ba3d2bec4da28267) >>
+>> endobj
+9306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 89.5855 223.4647 100.4895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_7ba23c56994f511973d468959040f4a6) >>
+>> endobj
+9307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 89.5855 326.1582 100.4895]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9272 0 obj <<
+/D [9270 0 R /XYZ 90 757.9346 null]
+>> endobj
+9304 0 obj <<
+/D [9270 0 R /XYZ 90 143.5481 null]
+>> endobj
+9269 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9323 0 obj <<
+/Length 4875      
+/Filter /FlateDecode
+>>
+stream
+x��]m����>�B�|`E��Ÿ�Ipy6����
�L��D#�I���_���&�lv���f������t�]��H�؂�?�pta�!NH��}������o�X��
+>_ŀ_��z�k��8����}kA3�8㋷wZ2F$�^1J���kF�������kN���Ӈ�����a}xz�{{�;
�S���|n�������������r��v����
'{��ߎXa�0�m��j����x��.�^;�l

��Sӽ�Ms�
��]6�[xK0��Bs4z���������
��W�3]܁�{E�pV->�
J�s|�p%��/�W�^�1��>h�0�]�1"�r�$V��GPL-����L0��
L.�J�~7ra�GZvN'i������q�~�{��OY�Ea�U�����R����@�hj|�>l�
&a �M] �=�	{�.���i��u���ǸhM
���\ֻ�;L�o�iĊ"�ϐ�b�-$[�	����
��
�2%F��A�(�Fp��Ra (
�$�͹]xT�B�����\ިU�Pǒ6���۬M�	w��m�'��=䛸u��>��ͷ�k7�v��� �y��6��5Cj�€RR�@eB����wT����x�,`p8+� [...]
A}�U�>�^H[t��T8XG,@���l�.���;'D�6
+!2��
"��
'����H����J�
�j��
�d��>L&�~����X��DC�t1X����.�xxs��ǰ �	eS5�@��5�쒀���A�
��T���&�\�xx�����P	���싀��B������K%@[ڳ�峉R��Q?�`�c�=�|az�_��PN��¥�y�3�%
=Iy-\
+
+��j�����22X
+��v}�����ˤ�9�L"��,�EJ�aF�U�U!��
+����d���H��\|�Ffw~�d�4+�#�*D�̡MJ�-�8�ҝ.#�x�aI�TLL��L�
�(�Iֻ�Q
(k�S.���9�ZO���OJ��Z��R-��o
֝E���}{ݽ|��b���� m��7�6ǿ|�����֛]��
+FVx)�݉�µBϩ�W����is��~I�	��0l�
��� ��Ԗv�`��
�,��J�s�U3 at l��*�� i�XXH��QY���"����q����x����@�=5�L-�?MeC!8Q�J at UHqá7}1������QZ���<܇�슀��n$&tJ��7����c�$`�jvz:	hK�E� 3!�si�@��u���

_���.6��@x���9|���sBw#�e��.�

k
,�.[T���8&]Jn<]@?��������Cw�3
L�a�xHZP�8)~�Lb%�Y���XJ�DX�i:��z{l��:��oos���>
v��W]��^ླY��V��֦�:6���k�JPA�r��+F0K"T�ZU=��	02XJ��v}����AGZ*M�`�����1��ύkn@)��K�</�.�"�*,8�y�7��{y����es��UC����c��a�~��] 3x-`|�]�Q5��Z�
�_K���f'|9!�F��^����.���f׬7�����@�	� v�+�#�*$Pj��U��
c��r߄�{�iv���a�9
߼i�v�OC`�F4Ӻ��8��U�C����H��?lv������~���D)R�#�3��,9�(�K礊M����J\$
¬NGE������
�1=:=�r��>v�̱�]��C �,�
�k���NrY�U@�(���\�P�!
g�[&
�qwY���v
+��
���l�~X?>�2
_|���PVK��d �H���0^��PK[Nz���B��y�`�����cP��Z��uo�{aja 8�=Р��ɽ���(��3�>͗NZ�ŧ��B�1�WTN�UUNl��r*��*'ivZ�Mr�rA�t����L�@"W9� �}YtE at Ux�J*�]0�r�#ژ���*��ݺ�Q
�n+.���h;4W9p'O�
K��|�W<�F*�;S���'
/{&�*$�1�r�RC�����r�K���GP9�+B�:G��6
+*'�Ң���E��e�*�0��r`��
x��rz|��s������sgY�
W�D��VUcf
h
��'̦j.‰�wC�u��o��EZ�Z_����	�c�RFEZ'iyD��D���# �+�_^�p��Tٚ��։
��N�]�u�fK��R`�H�..k����.�x���z��[sw3��3dF+�%�*�Zq��(�1��+���$�
�v��Z"�SxT��c8M���x�=CuAQ�Y9�_a��E&�4۶H���û|	N�|LW�C@�(X�1�84����WX���O
+C@��	�
+���,��0�����:/^@l�ɲ�|�j��eT
����9K�E6J���RUG�jW���"rB0k�
htX1�2����
+b�K�ג�I��Di�:(S�B�`�z�s�!��+ݔ�m3J�
� Ak3K�l M�sw��e@),Š�p[TNչ��0�ġ��ke�^�I�P0zL�;R��g�w3MV⸄a�z��kf��u�5�`�K��,��_��"-�n
���=/)���9�d��g��xF	��̿��SZ���d뢄_�	g��%K����-G%���m`
����K~��P� ������;c��n��APF�L�X�Y�f/@&㪓�]�� w�����f�渿}�
4�BpuU��	P[�^\�
+��MmA3���76X���v�t�4;)N�İ�i���5�ݢ����iE`$۲g�B
+� ��A��)`a
+5�-_e0�[U��Rĝ�ET����&w#�cZC��yL�3��1���P���D��3�B�j@!h`�Մ� � ��tI���dv#
����c��i��pyWKH�����xl�U
��q�6`?)���;��g���6
+Z9��,A�L���1���)ܘ	elr���ة��%�,�N-#�D-#
T˭kFԲ��.���tx��JG�v'�22K�2r.�e�5�a�j��-�T�2=[,C>��h��2�
H�]mؤ\f ?�B�"$��m����`r���s�܁��cR_(�ۘS��0ӡZϓ��4�18U/����c5e�aue
,)�r�^�͖����2i��
+��k$2�_V6X�*�%�*��¸#����[Fh��9&�k42�����1�ʮ�
+� bc)=��j���b�
O��녀�Q��ΑŠƘ��]tB at U(@��p����B�� ��e���p!_3Q=
��W1~��
�Y�����
��6���
+��vOYHH�:|8�(���gn�-�h���K��˜ӵ¤��mV�Un�f�!P~a
}�6�7_�m��2"B�
<>
�������ڜ.��A���l����C�eZC��<
Q�X7�9�,�����n�@�4����Bp�0ֵ u!$����M��l��a��{��*�Ji����]��
5�jLCe`U,�J�>��N
8�t0�H�.�
_#�����f���♀����˰CJ'��f�k��"�;{
Lm�U!!,>ĎFɨ���T��~�
+���
g
L�+{!�j����yB�����hpAQ���qiמՀ8�>LF�m��{�ů�/��K��yꎷ��:�{ǣ*$8?h*Ruu�-Q����"%��a�������;Ӡ�ID���7ڬވ�L>F0~q>��C7$by�' �?#bπW�����{
_����Cf�2B�%�VD�x�F�*�r����G@`�>�Z�~�&�41ݲ�
��p��� ���%�$�PP�x��u s03\Vt`�Uu`l��+��:0i�T�s��A��B^�����v����г�x��QvI at U�p�[�؀���v;�A6�_e0�[�݉+$\V<Ѓj�[<�a�A�i����<
g�퓀������7�?j�~�
+Ԣk�	�W�w7�U�I�e��y^�0��֗����n��S[�a��� k}�1��?l��a��y��mDh���F��O�Xx
�y>e�3?m��J�(����K�K�b�;T�C���P<�
J)����
_��n��:6�"���e�cuq��<('�nv�
gb8\Ĭ�.޾
>~�j������NH�A;�n��ed�4&�ݬ��=���*�9r��i���[�GרCTt�}�E��(�#�����l�ײ���V�4�h�(�,����X��e��3�/��3
c���n1�m�0�����(�d���t�G�P��/.݅���j��.�#�%�^n�K�����,>l�r8��Idv'��d�7�����{T��(>D6�ѳYB��풀�2ڝq6
e�+#�j
�
��Ȉ�;`&��0%�z%�+�r�3�;���g�BB�
�t͈��tϳҞ�H���ev/�a����4�)�VR�
��S�m��g�ڏm����edY(#+�.�>M��]����U!�t�%��ed9,#���,'�Ȑ�h��
e�
_��n"�͠t
<�B
Ō�呶
+����ܒ�`���D�~+�KIy�qnR�
�
8�՛\�6Ǯ�7M!1�fKy��w�3��J�����w�4�_����T=�Dv���iQok
iJ�
��0
S�
3~�9Y0��m��z�s�8/��A�Hɾ�؁

���Gw�QHgL�Nc��|Z�{vx�tן?�t��9;�JMt#��_���]�:@��^�߲�^�?h׽��cs�|�h�|����8��Oh�9<?j�R��`�$�#rt�m3"4
(���Kݧ]��~k��
���/���3�x�N��7�_����
�����@6�׏��׹̣0M��x�+Sy=(㒸�=,j�.������
���Wx�{h<;
?B��=8<endstream
+endobj
+9322 0 obj <<
+/Type /Page
+/Contents 9323 0 R
+/Resources 9321 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9143 0 R
+/Annots [ 9325 0 R 9326 0 R 9328 0 R 9329 0 R 9330 0 R 9331 0 R 9332 0 R 9333 0 R 9334 0 R 9335 0 R 9336 0 R 9337 0 R 9338 0 R 9339 0 R 9340 0 R 9341 0 R 9342 0 R 9343 0 R 9344 0 R 9345 0 R 9346 0 R 9347 0 R 9348 0 R 9349 0 R 9350 0 R 9351 0 R 9352 0 R 9353 0 R 9354 0 R 9355 0 R 9356 0 R 9357 0 R 9358 0 R 9359 0 R 9360 0 R 9361 0 R 9362 0 R 9363 0 R 9364 0 R 9365 0 R 9366 0 R 9367 0 R 9368 0 R 9369 0 R 9370 0 R 9371 0 R 9372 0 R 9373 0 R 9374 0 R 9375 0 R 9376 0 R ]
+>> endobj
+9325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 698.2019 285.6507 709.1059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_aaf96fa77980ed96433261f5dd4c8f5a) >>
+>> endobj
+9326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.9879 698.2019 388.3443 709.1059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 663.7476 239.8036 674.6516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2119eb05373ac2b4c15fe748d0d8dbb4) >>
+>> endobj
+9329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.1407 663.7476 342.4971 674.6516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 627.7158 217.1088 638.6197]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_5c527292c276945f5ce0bdc9b41ed37c) >>
+>> endobj
+9331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 627.7158 319.8023 638.6197]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 582.3026 271.1256 593.2066]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_16579a075dfcd1fa22ac02bcc859353b) >>
+>> endobj
+9333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.4628 582.3026 373.8192 593.2066]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.8625 569.8819 326.2592 579.7871]
+/Subtype /Link
+/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >>
+>> endobj
+9335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 536.8894 201.7419 547.7934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cab49f11748c7473f15388191159a798) >>
+>> endobj
+9336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 536.8894 243.6294 547.7934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 536.8894 371.3288 547.7934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.3057 512.5135 269.9387 522.4188]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+9339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 479.5211 212.7678 490.425]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1be27ff4f03e00236044253c3ddd43da) >>
+>> endobj
+9340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 479.5211 252.9591 490.425]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 479.5211 375.1455 490.425]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4006 455.1452 277.9276 465.0504]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+9343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 422.1527 250.0993 433.0567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_7153c25dfa21af48271dd46e7e7cde7f) >>
+>> endobj
+9344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 422.1527 289.4458 433.0567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 422.1527 379.5123 433.0567]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+9346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 422.1527 513.9963 433.0567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.3043 396.5678 439.3345 408.7329]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 364.7844 266.586 375.6883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c3d56f02e252446c5844465d94068227) >>
+>> endobj
+9349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 364.7844 309.697 375.6883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 364.7844 408.2337 375.6883]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+9351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 364.7844 513.9963 375.6883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 352.8292 171.3608 363.7332]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.2371 340.4085 480.8696 351.3645]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 307.416 250.7476 318.32]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f4416e25871d6e2ee1fd5a09a1f9c343) >>
+>> endobj
+9355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 307.416 357.3173 318.32]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 307.416 456.1447 318.32]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+9357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 295.4609 202.3443 306.3648]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0047 283.0401 446.0713 293.9962]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.0173 250.0477 265.396 260.9516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_53fb6133be52cbd02a3fc7573900a95d) >>
+>> endobj
+9360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.5684 250.0477 375.818 260.9516]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2392 250.0477 478.9794 260.9516]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+9362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 238.0925 225.8659 248.9965]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2222 225.6718 466.6702 236.6278]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 192.6793 239.9836 203.5833]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_96712b6e1b0c6ef2ef36177eba8a5f7b) >>
+>> endobj
+9365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 192.6793 280.8203 203.5833]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 192.6793 405.1043 203.5833]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 192.6793 513.9963 203.5833]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 180.7242 171.3608 191.6281]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 167.0944 432.0923 180.2525]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+9370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 134.1081 251.209 145.0121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2d82b566c9bebad2adaaa3b5ba0e923b) >>
+>> endobj
+9371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 134.1081 290.549 145.0121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 134.1081 409.9686 145.0121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 134.1081 513.9963 145.0121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 122.153 171.3608 133.0569]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 108.5232 456.9923 121.6813]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+9376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9324 0 obj <<
+/D [9322 0 R /XYZ 90 757.9346 null]
+>> endobj
+9327 0 obj <<
+/D [9322 0 R /XYZ 90 680.641 null]
+>> endobj
+9321 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F52 345 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9389 0 obj <<
+/Length 4068      
+/Filter /FlateDecode
+>>
+stream
+x��\i����>�B�6`q�>I�\#���w� ��G��0�I����T�hu�T7ǚ	ޑ�b�cu���>D'��K&Z��r�&��
�|������9ܟ���t�����Y����}�A�L2�&��?L)���)!d�aF�4߯��3F����C���)�����ݻ�r�9
�c#����=\����Oo�S�c�eB*
���/k� %�V4>h�"����뤎߭��a6g�L?�,���*?����b?�fZlp�S)�\qTz�OΑ��%W����~"�%��O7$����	���Z�&��x�eu���[���Q=0�\���0e&s.2���!)J��3hZ�3��pM+���3Ř�81tǏ����QF3J���
+�v[��]�2bih�K�U�=�����[�ύ�w>�V>��Q
�uq[��ݡ��^Q~�t�0�Z��+�TCW(�A�#�d��
�=�e����p�)=���r#w;c��>$o��6q8��L�%�� ț'�
ꔊ
�G8���C�)ϔ0>�X.3f���Q��bb �ug��
+�CX��:HC
�m�D�zr�Қ�i~$�7t�=!�)�[�:>��Z&@ �ЊX'���~���8<�����}�w�]�
���s��F$�x&��Ů�����m�ռ
W= 0���f�;��ya������SQl[:�[(�,�P�)K[cOZdƵ�/��.������<o9�c$IEeL&`�$"�KF_a$�$�6$0�� ��$��Q��r*!|������O����J@`��Fw���#ʗJ��D_×��_:�3_#{�.��ھ�X�
P��-�h���aK��
��-
���
�/Ū:�ຨn.gtZq��$?�?X�7�Uق��*U���\^�������x���
����nz��ﶏ5���!�#՘̬4�z��p����!_7���r��,�s���_�X.�U}�qSn7���$�����`�L�H�K���0F2v���n�d|�Ƕ:�:
�Y��L���%Ш2i�iz�Ӯظf��L�i�,6���� հ��	�4�&��px?
+
E�$'ZŊ��BB���J~�?0̉�^D��?~����Q9��q���A�y�2l���V
l]�l���DԈ��
�V�"�:�ɧ`��ϰ�*��pR	 \Ch���@�<͔�~��a_�s��[�l�bY_^�����,�D�#��]Eu�xD`�	+��G��X<j����^��-t2�^("i
D$��߽0��v��҅���
�LAw�H���'<���p��@F�Q��ٍ�<F/�|�P��+(��hcϝT��D�+�A9܄؂ܼt
^��������ppP����O
'xz�'7*1f���B��� �i骚�� Y�P�O�R,�s.�M�*�O�ݦ�>lW����r� 

`P�K�9�r&"
8���/w�� ��T��Ē���0��
��g"����D~W�_5����L�b9
+&3�j��IJU`I1
���� R�9����;������+��B��&�Tx5�w�\�M��(�F��ɧ`���M�
NHG��@8
0�d��&�NX]9�G�
	]N~�䠯#�\8�0���A�]�z�ԓR�Ʌ�$�I.D89(.d0����E��Z<᨞V7��'�W���J�P�4��I� (�A�lB��A�鋷���A�
?#'q@�n�
_y�I�9��e�paD=�\��!9Jp+�\�S�!����N��N�u��f���E��?W�x�<a��44�<�R��Ϙ���A���_!ۻ0
��$���ڌZ
+�U�'	e��ҫKK���7���hfv�7���|�f
��q�7�ey�m�ߗ�
+�*o�
���a�e��W>���T���pGx"���"��K�V1�"��:�_N��*�
��
+��NHaNj�8VgB�ț�$3˨�:�r�Ј��w��m�����U��"7���;��m�
��
�3%T��x��)=��Ȕ�T,��Q8�$D
L���B��]�9�$��A4�
ܔ4�B at 9�"�?OP]��
��!a����,�!C�l`�7�y׼�e�y��+?�w�[�r��LPzMaK3͵I����Hx�|[�4�z
+#���~a�}���ۯ4
+���~��n�A��'�|$��R?#��.��(�s8�\'�p'q�]�#�I�Žp��‰o|D8�s8������$�/�t�;�����ui�\;���w�SC��<P�$���
�����ŮV��/εJ�"\e�B{��
Nߚ����
��ٻ��g!���@W����<�
+_To����cUQ-���]
�+e�(T�����
���3!���|\X�.mw\F�_�� d^"�C���@�AM���աJ���!�&B:7@���DHwbɐ�+����&�f�3���3�	=���p��+�z(���_��Tʶ®�q{3"��eLk9��[������Aq��	G8�&pG�t������*��uD�މ!���|w$-�Qi�K� ���0�V0h-�o�Re��
z�BN�P+�f!Oa���v[�ͦY(0=��� zz�0�\�
p>�օ��-Į[��[�SO��y�-N*��Y�q�i�n�v�T
2�#N>i����%���͠�L�d����J �@�g:
r
�$Π�W��u�8������� G0�>l9b=�����5�j��	sUuv���~�61��_�Y_�\�R��q�����ߐ#1�@j�^d���_'��TC��\�
|�����̸�V��P�2��ë�a�����d�ͥ;�W;1+���q�c�Չ�A^ϡN�K��0B�	�
qf��
�
A�	=�Q�����aӧn�\�K+�@��O�;�1H��
4�H�8�$���1�m!��&�'�@��,$�!�8u3�g���n_G���X����mY*B�:c��.u3����H݌��i�BK����n���n\:�W*��o����o���BE��z��׈���N��\�@��k�^m��tV@���L�L�_`m	�O�v+�fmOa���v[��ͦY;0=��� zz�	���l��ȉNB����I%P��3a5�4A�D'犏u��O���}ƉN�}����@�D'���%� �c
+;�F:��=
1�n��GNt����?c ��~��?;�ȘΨ���w��g�R�"�V,M���Q��D�Me`z
Q�A��"�}��b�����L�O\<��˸_�T�8���1h��
r
�ﱱ�q�)=����t����nU
n?P&�
��>�
+%0p�I"ԓ�7���

*�i'Q!���D=
1m��wF\9k�4_���w�"�)������2�P(�$�9'���"ԀEiS�&�X�E|�I�mX$0�d���I���
`����C�O�����,�
'�@�Lu���,C�2T��j>�7N>���wL�
	�0q�B	�\V? C�P�`�wn�(}�:��J�
+��uD���C�\�ZL��T_l?��1�
��s�6�p�_�
E������*H�p
+�pu�h=��!ݝ����
+O��~#���:c�럄�x_��I('�f>Oa����7�f_k�؇j���X����>��������.�z$#����sO��o�
��
�1v+V��ۥ�F*�Y���,\�$00�3ƈ1��ˎ���၅8o��A�?��o�b
o�r���vC[�x��$(_,����Ϯ
�o�v��S
� �پ�	��.�|B��/��RI���EH#n��
�fr�vG��8��V�P�
�:�pm���3�P

+���d�C���#�#���L{�U?9��F2�֍L�2�5T�n@��=~_�Ͽ�
F�G�����i
�j�'D�	N(a^C��i���K&�fR�8�����~�����4^�ڣ �r���d
"8L�ĆuC�����6�<Y����b&���
��<���]��Q��P ������>�>2�X
vL+)
�T�����簗V̽'��^�{�^|��q������-������v�[����p�e�#�7wB=,��a���X��H����(7pq�I��ٳ�"endstream
+endobj
+9388 0 obj <<
+/Type /Page
+/Contents 9389 0 R
+/Resources 9387 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9143 0 R
+/Annots [ 9391 0 R 9392 0 R 9393 0 R 9394 0 R 9395 0 R 9396 0 R 9397 0 R 9398 0 R 9399 0 R 9400 0 R 9402 0 R 9403 0 R 9404 0 R 9406 0 R 9407 0 R 9408 0 R 9410 0 R 9411 0 R 9413 0 R 9414 0 R 9416 0 R 9417 0 R 9418 0 R 9419 0 R 9420 0 R 9421 0 R 9422 0 R 9423 0 R 9424 0 R 9425 0 R 9426 0 R 9427 0 R 9428 0 R ]
+>> endobj
+9391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 719.9123 224.5705 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_723455890ff6a03f145169e411c83289) >>
+>> endobj
+9392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 719.9123 327.2641 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9393 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 707.3927 347.8694 717.298]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+9394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 685.2604 212.3767 696.1643]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) >>
+>> endobj
+9395 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9498 627.6944 264.5739 638.5983]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_32c9572669f8c0490cd714af2731b62a) >>
+>> endobj
+9396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6113 627.6944 368.9677 638.5983]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [300.9201 603.2197 413.7587 613.1249]
+/Subtype /Link
+/A << /S /GoTo /D (main_pps_bgp99_extrapolation) >>
+>> endobj
+9398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 558.1733 248.9295 569.0772]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_52fc679f0d74857dacafb72b57ab5c37) >>
+>> endobj
+9399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [276.2667 558.1733 351.6231 569.0772]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [303.8008 545.6537 367.5622 555.559]
+/Subtype /Link
+/A << /S /GoTo /D (main_pps_certificate_widening) >>
+>> endobj
+9402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 474.7772 200.4511 485.6812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [211.1908 474.7772 251.9973 485.6812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_57be1b41dad904bf9936df4560df720b) >>
+>> endobj
+9404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.3345 474.7772 354.6909 485.6812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 426.395 200.4511 437.2989]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [211.1908 426.395 251.9973 437.2989]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_280aacebc757d7ab2a23ff2e282aa10b) >>
+>> endobj
+9408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.3345 426.395 354.6909 437.2989]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 379.009 167.4656 389.913]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_0c8b9e21e6308b5841acc2f1ffef10e6) >>
+>> endobj
+9411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 379.009 246.6377 389.913]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 342.582 289.8656 353.4859]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_91dc05df4b7c844f1f6c9c5419db5635) >>
+>> endobj
+9414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 342.582 359.3244 353.4859]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 295.196 290.9713 306.0999]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_3b8a6c571be95e78b20207f732cd0848) >>
+>> endobj
+9417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 295.196 360.4301 306.0999]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 247.81 224.0028 258.7139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c878ab15837984ba2930ef42fa81dc5a) >>
+>> endobj
+9419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 247.81 326.6964 258.7139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 213.1581 254.1498 224.062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_e45ed9165f98258083b2337c3872acee) >>
+>> endobj
+9421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 213.1581 338.2632 224.062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+9422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 178.5062 284.5854 189.4101]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_02a568a0ea643d33f943fb6ab98271c7) >>
+>> endobj
+9423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 178.5062 354.0443 189.4101]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 120.9402 241.7263 131.8442]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_df9133b519b04cad51e09ebb9332cddd) >>
+>> endobj
+9425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 86.2883 249.3181 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d64b9c9ef7488b49c4f9a4acd3f57491) >>
+>> endobj
+9426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 86.2883 288.3213 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 86.2883 371.5186 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9390 0 obj <<
+/D [9388 0 R /XYZ 90 757.9346 null]
+>> endobj
+9401 0 obj <<
+/D [9388 0 R /XYZ 90 489.747 null]
+>> endobj
+9405 0 obj <<
+/D [9388 0 R /XYZ 90 455.3423 null]
+>> endobj
+9409 0 obj <<
+/D [9388 0 R /XYZ 90 396.0011 null]
+>> endobj
+9412 0 obj <<
+/D [9388 0 R /XYZ 90 359.5741 null]
+>> endobj
+9415 0 obj <<
+/D [9388 0 R /XYZ 90 312.1881 null]
+>> endobj
+9387 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9440 0 obj <<
+/Length 3648      
+/Filter /FlateDecode
+>>
+stream
+x��\[s�~��Г+Ϭ��_<�<4�M&M2n�IFCK�Z�n��8�_���	$�����t�x���
H�	�?21x��B�q9Yl.��=|��i~���6�owo�I11�H*'w�I���N��O	A
_��xzsE�8l��������c�<�W��������z�=
�S���<����ǻ�޾#���2���
+����ZC{F�� nnRG�8�ee|�.�ǫxzwe����ũ����|(WDO���bD�)��
+����wd�g�$�n�����d	���#f��<���1t�����ۋz9����b� &��w
i	�'P�!ɵ��)�	D5�2���~��h���I�Ӊ�U�:\15-�=�Ư�u
5Hc��njD U!I�s�b�_���w���q�q_,���զ�
W�m�q�;�V
���r�}�\�KXDEJ0���0�HD�
u�P�$�d�E\��Ng.4
+���ڤgúU���`�s��#m�^b�H��ì�?P*R�Wz�c���K%†�j�w�2R�-Vj���tx�`�k��9#"�֊��z9�V��/�c�$���7�����QC ,û��^��S�\�zl�?<>gF$ך��+B0�_���m��`W+�AgxT�
+KV$
��<�����NN�|Y \&
����ɍ<�5�S�T{C�|�@��*D���6�
���5��:�|*��e
p��Y��AH����`V��b���.�g?��R"e|�
!��@͆�߅����a꬘ٖ�̕$s**[nO�i��=v�t�v�)7��UT��=m�]Ya�"�T��$�Kę�/rz̜��
k�^H�
�2�{�����4�-c:�����l��Z�2��>�#��"� ��$�+�P�����	Z�N�
���v�Yd��Ŏ�F3�ʙaҖ�¥�,IYX!"�fx�%Uî4����( Sl��Y[F�� ����U֮����aۥ+p�j�ɥ�E��t�4��m�����vr
�Zr��Am��n�T�[�R�˻�I �@ye
�-����b���ED�ߚ�v����h�Hқ�
���[%-,�Y[�S��qC���v���cq��xl�,͛��q�b��
�֦5f
+�
+��6`�6=,K��_h3�jo��
�\9Z9����ip{6X��H���nAZ���Ƶ7_&$rKI�pyΙ� �1
+!�x��)�+9���B56wk!Q�+H0�
��LU��m�Ӳ1�E`
C0�	�9ӄ���g�

ɵ���"��!2�,!;�t	���CN
�F���Nr��}���u�0*��"!v���Y�����;륖q
�z�|S�>��ߺ�.��6�*��T
+{C
ז�;���2B��U+�`I�����ܬuGN����%ƐǶ����6���ũ�á\ ����G�� 	�mI���Ks�2��PY�k� ���ﵕ�
�5�7���ۄ"m�V��!���B:�z�YAh���E����0y�Ũ��B#L`�
+�z
+�dX������t�V=��H��Ɣv�w�Ρb�aX�	�F�5&zMŒ
����
��=���`����{T� Q
MC^���UG>b|"kƇ׊�)�&5�F:v
<�Hjz�	���2��<*��W%tg�]V{
�‚���
DA[�J�1Sa��kr'|M
�
b؏�IId�Xv�Y���Gr{���>DW}w�7��N[�jK����q0
�X.=��i��
�?
X�4��)aH��N	DJ �CI�r9��哂���� �7����Z^�J 8�%J�`9�[)
��񴼾��C"�3���f��k���b=QMψKj�:��4�������V�&��6�_�nf��
�u,�2C���W�wT7�T��N���b�V���~�Ϸ�^
c�v����{Tf��1�����:�"N� SBs=�
��C,�JV۲8����:%��
2Yc�t���
�h���
�,<;^!K���i���&�]
j0�m��Z\�<k�(�焚���H�P�f��H���;S�� �0��;b^�
k�sG�k��a�q�>!] fm�;kq���چ��ձ
<a���
�
Zm�A+���@��n��ȡҬ�w����,��V���r��
vƩXm7�6&p� ���^p��	�e[�v��{4. pS��z��sfDrG09lJ���>oP
쯘����G`*mL:�gc�G/
���

ݹ�P����ؐ ��Ғ�k	8�c���?�rݲ�5��S�F�v��_3DbH9��~�
�P�6,���W/��rϰW~������������x�`�D$���	���Oe"���O$v��I��6��n���Y��Ǟ�/V�7���;�Ԫ���A1(
+�}�c�6�0�����cV3�]�f
+���ӻL���H���غڨW,!�UZ�L4��l4n

���.z?�:
̳Ł�c^�v����\���C�:%�F`†
�P9��4�7.85��[���v���H���SHXۆ���bC’3���9%�jFϾ�g�I�{�v47f�ʍj*E��@/����D�i�Fj1v�
�|,�ZQ���ݯ�Mq*�kMf 
#"����1�-�;��MZ9��f�?<>gF$�o5p�WP7ߣrzA�3�jj�uO�2J��hZ���-��>��0:H(	#Mo�i�W�[}���t�j/ɡ��J[�}J
��q�e
d\
�h!����Ɖ�d�����4��(���l��(��
�6y{
�/�Qc/�����r�
{���.(�P>j�K�
,�,�%K�z�>h�M�.�@�X�	�ܳ��sDrG�.�����!7xT�Jl*L:��m^p��

�
�ϙ���
+�=�ù�;TN��
X��޺e�{.ɠVѶO;�	
�1&�;:?d������ؐ�,��%�Cf(���~p��"��I�M�8%����̰��#e����^����Zo������E�H�2�>m�l�ܖC_ȇk�
��?��OIu�e^1\��3".=,.��eJo�x:���8�
���G!

��
�t���
��Ӈ��1=0�{�m���b
A�p1�Q
��1�;>��,c�ٰ�<*6$�u���7k'�f襝vv��q�M�m��������oh�y<�*���)��<�ӎ&�@�)_�&g���"وѠ��E�P�����EK�"Z�?�
ӭ�

�λ
q�]�g�
�ءܪi�\���}|�F`QA]Z
�5��ni �út�@��=Σ�G��9
"�uO�
PU�h#�O6F��59?yTle#"i�1Bڧ��`�0v;ʡ ���M܍f R��
���F,�o6��1
�
�i�����/�V��=
�=�b8Ԭ
K��#i��p�a0�ë����y�2����UOe��ŪX�~K���X��8����s�jU��:�<�n�s�����dփ��D
+y�?��%��Z�f�Viϼ�{��Q�:nݹ
������f���u,�b�d,�ۧb������'<`*�J��B�_���m?�����7��R��O�����Y��aW�r$���t�_�}����G����V�����mDIC^�XhW��@�-���ٔ��8m[
v�󰛝{\v��/7��|��QI”�x)b7endstream
+endobj
+9439 0 obj <<
+/Type /Page
+/Contents 9440 0 R
+/Resources 9438 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9482 0 R
+/Annots [ 9442 0 R 9443 0 R 9444 0 R 9447 0 R 9448 0 R 9450 0 R 9451 0 R 9452 0 R 9453 0 R 9454 0 R 9455 0 R 9456 0 R 9457 0 R 9459 0 R 9460 0 R 9461 0 R 9462 0 R 9463 0 R 9464 0 R 9465 0 R 9466 0 R 9467 0 R 9468 0 R 9469 0 R 9471 0 R 9472 0 R 9473 0 R 9474 0 R 9475 0 R 9476 0 R 9477 0 R 9478 0 R 9479 0 R 9480 0 R 9481 0 R ]
+>> endobj
+9442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 697.9944 240.6204 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a944a73dab7e82a786f12d860def325e) >>
+>> endobj
+9443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 697.9944 324.7339 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+9444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 697.9944 425.7242 708.8984]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 619.2245 203.0748 630.1284]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 619.2245 296.3242 630.1284]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_25717d92bb71e83e73c686fb6f231efb) >>
+>> endobj
+9450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [228.914 499.2282 289.5562 510.1321]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cb90cd62d5a91523a0f7f7d17a7d380b) >>
+>> endobj
+9451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.0217 448.4187 271.1984 459.3226]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+9452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.2596 448.4187 341.9018 459.3226]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_0b63a885009bef951c4a57e878b81698) >>
+>> endobj
+9453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4258 448.4187 501.6025 459.3226]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+9454 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.1775 436.4635 203.3542 447.3675]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >>
+>> endobj
+9455 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.5729 385.6541 248.9293 396.558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.5294 385.6541 331.4717 396.558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.5086 385.6541 416.9298 396.558]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d6f64ccc36541cf23baca88a68ad06d7) >>
+>> endobj
+9459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.287 334.8446 218.7483 345.7485]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d7e1698be31b1b95dc7e28d13ec162d5) >>
+>> endobj
+9460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.4306 334.8446 330.3729 345.7485]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [393.8981 334.8446 469.2545 345.7485]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.6739 334.8446 513.9963 345.7485]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 322.8894 161.8403 333.7934]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.5889 284.0351 177.8427 294.9391]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.8093 284.0351 257.1657 294.9391]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.1948 284.0351 286.4486 294.9391]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [309.7722 284.0351 400.3116 294.9391]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_17e25309469009012f40ed891a2c3f01) >>
+>> endobj
+9468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [429.2132 284.0351 449.4671 294.9391]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [493.7424 284.0351 513.9963 294.9391]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 233.2257 213.5757 244.1296]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_3f4e612db0eea52c329f5a6be95197b9) >>
+>> endobj
+9472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.9129 233.2257 261.1668 244.1296]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9473 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.8812 233.2257 383.2376 244.1296]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.4845 233.2257 411.7383 244.1296]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 182.4162 213.5757 193.3201]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c262e9c3acc2920c3e3df6fab7852753) >>
+>> endobj
+9476 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [300.6982 182.4162 376.0546 193.3201]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.7908 131.6067 162.1568 142.5107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_74dabf047d8ef99e4088e5c410d34e6f) >>
+>> endobj
+9478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.8479 131.6067 358.2867 142.5107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9479 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0205 131.6067 513.9963 142.5107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 119.6516 224.6835 130.5555]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9441 0 obj <<
+/D [9439 0 R /XYZ 90 757.9346 null]
+>> endobj
+9445 0 obj <<
+/D [9439 0 R /XYZ 90 638.1983 null]
+>> endobj
+9446 0 obj <<
+/D [9439 0 R /XYZ 90 638.1983 null]
+>> endobj
+9449 0 obj <<
+/D [9439 0 R /XYZ 90 557.4358 null]
+>> endobj
+9458 0 obj <<
+/D [9439 0 R /XYZ 90 353.9379 null]
+>> endobj
+9470 0 obj <<
+/D [9439 0 R /XYZ 90 252.319 null]
+>> endobj
+9438 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F74 482 0 R /F67 370 0 R /F52 345 0 R /F100 2198 0 R /F37 1999 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9492 0 obj <<
+/Length 2487      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s۸~���S*ͬ`�/n���e���&���v'�hd���H$K�u��{@0/��I�:ypD
���| �a�GfϔP�0.g��	����OH�z	�m�g�'�?H13�H*g�וI����.��� �K�1��/����zu��x��
n�m�^����u�pvV?�����F���rx��p������QFR�s�֟j��?#�
o$�/ZG�8
O'u<߭�b���/�Σ}�[�Q��mt
�
��Q��G�1gRX�'//}"�<
&�M�N�}��-������bv?0"�����S�~�N.N~�z�Հ�t��KƑ�0��|R���ϧ���%�L��9xO� &�al�V8�襂vae)L*�0+Kٵ[�dW��Tk U�s-�Rh����,aU!�z���A,L"Ŭu�$7ٳ��F�m;*'�lds��z���6W�4)�q������dP
9��K���p��%���{,0�P
�s�YK}l.������Z�7��&}O�	,���&�3���v� [...]
+���$NnΆ�B��Iu�K
=�	Xr��Gmև�!uB�y�G>�^�ؼ�9�̋�,K�*yV�1����N�������%�F�6�CUmD:;xck��
kfz+��B�pֈ��g��A{�ے.$c]pȚU�ݰƳb�w�-�LI
XL��p����z
�C
��V*(�!�{��
Njh�[�ڬ��F�(e�
��O�?�kͿ~=�8 ���d<^j"Cm�@QAFyl��D�z���x;�@j��1a;����|�=9�O�֛M��I��nuq��BU@M�A
P���e��A���H�48}v��ًղ M�N�@]<EB
�Z��H�7�� ��H�O��i[��w~��"��>�I���
�z�j�-��>���E���-�zȲH[��h#�K�0���."��%Ὴ���
+�]��>����

��A(�%'v;�^��çS)��w���:�m
�X��lVk��S� �J�u���W~LrÞ,�����+
!�#���,u�6D
�&J�
V���.r�~�["��č�'�P�� #d�GȻ��>���o���˷/:9�
�'���t�!��]���$��
�G�)�ś�����S
+�(h'x}���.�m�fa]��KbK��m��������2�*�j2�lbؒ�ã�UZ������I%�

��LR�F|ْ��֣{w �L}ǟ~�uB�^
ty�
5
K��xSі:�Tpj�n#�Z	!n*B�4O���5^,��;�(�0�M��z�m4�
`���7���UԬ����r��t����X��l�i^E�f�е�����?
�=3�R|��k���܋���c���z®��흡b��$]�Y���cL�&���d%��'
,i_�(�6�vݘ(���U3�ʖ' �2�Zx��ZC"�
��؅
+�
�v�%�B(�:�~~n� �P�9;�6
���aTqOF�N�x��n�C��#No�F�h{��).V���P3DH�r�h��L7�
n���NN������_�_���O��4�J-�1�EvyK���V��z��ɷq�ܝ�ev���V�!D]rm��8����S��&=Ս�MՇ4�
��7I�G���`��ط��)
++��'��k�&~��Z~�s��%䜀z����
B9��3{,�k��m���64T�	|��ȑ?�$� ��_|T3vt`���P���� �1��������'#�Hc@ Ӄ�#�P�F�BC{j���FP���#1�~�ލ�C* �.�=O�ǞP���(��� Z��C���&�_Z����~0U\�e< ���ߡg�{_�w������m|m_]G����<�\�7Q��u�ҠY=x�
#
+8�>py�۱���v�؋IF�g�c!FZ��'�������1N��1�ǣ�RC��L+D�&]�#�u}�~W�K:��!���:J�J�P1:�_!�j�
��rZ

ѥcW���W��u2}�ݴ
+��jҶ듺_����aj��:��
��ݤy\���ģ�'R� !X��&

{��|=U}�$5�Րv��b����9щ��Fc)B��q��gC��Q��
�`Y'w.c���\�Y
Qe
��yE��,
�A@��d�~�q�����a��l�p�D�!���o�2;;=���G�A��(.O�lw:�2Z:cہ��[z��/��s�Ra����u��4�
���}u�?XG����:endstream
+endobj
+9491 0 obj <<
+/Type /Page
+/Contents 9492 0 R
+/Resources 9490 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9482 0 R
+/Annots [ 9494 0 R 9495 0 R 9496 0 R 9497 0 R 9500 0 R 9501 0 R 9502 0 R 9505 0 R 9508 0 R ]
+>> endobj
+9494 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.7404 707.9571 215.2016 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_69571f990b874f16d0f62235088427ca) >>
+>> endobj
+9495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.7906 707.9571 305.3469 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [357.3455 707.9571 432.7019 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [442.5746 707.9571 502.131 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.5252 557.5496 253.2487 568.4535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.7817 557.5496 341.4604 568.4535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.9933 557.5496 369.8962 568.4535]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.6795 447.5159 333.0359 458.4198]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9493 0 obj <<
+/D [9491 0 R /XYZ 90 757.9346 null]
+>> endobj
+9498 0 obj <<
+/D [9491 0 R /XYZ 90 682.4279 null]
+>> endobj
+9499 0 obj <<
+/D [9491 0 R /XYZ 90 633.8641 null]
+>> endobj
+9503 0 obj <<
+/D [9491 0 R /XYZ 90 532.643 null]
+>> endobj
+9151 0 obj <<
+/D [9491 0 R /XYZ 90 509.7086 null]
+>> endobj
+9504 0 obj <<
+/D [9491 0 R /XYZ 90 509.7086 null]
+>> endobj
+9152 0 obj <<
+/D [9491 0 R /XYZ 90 378.9079 null]
+>> endobj
+9506 0 obj <<
+/D [9491 0 R /XYZ 90 364.3376 null]
+>> endobj
+9153 0 obj <<
+/D [9491 0 R /XYZ 240.2453 289.711 null]
+>> endobj
+9507 0 obj <<
+/D [9491 0 R /XYZ 90 272.9839 null]
+>> endobj
+9154 0 obj <<
+/D [9491 0 R /XYZ 90 144.2205 null]
+>> endobj
+9490 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F67 370 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9512 0 obj <<
+/Length 1960      
+/Filter /FlateDecode
+>>
+stream
+x����6������j.�"������+�^|�i�Pl�Ww���r7��w(RJ��Ih�L�C�p�3��^2��G�O#!͸��v<�@���0��
+|��\}!�T#-��.�$A�:]�_�A
�c<��<��]|w;�x�o�
�u�}��.�����v�YyHJ'c�<&t�_-������2�(�BF`������!Q����}X�pDH��?Ϯq�����
+<[�5�%��6.����>)�D͒l]�1cR�E'ϖ�#���ĸ����Wx�=��i%���њNwNY������Ьc�	�p	�.�eK��x!p��YYoo�7�A3##ΏP�U���i�d��B�&�PHhFfO'cA9�k���1‘�Tς�6
��"M��B����\��b��]DD�~�����
o�����gfD�>��t��/B\C�*�?����X8�OL�����p�d��I˧;���	f�0Q��2��=�
5^;�3'�F��Z;�=��na��
8w�����������n�}�߯�?��iE�^
�HB
+	R��[�f�4K�2!y�ߦ��|e��N�#(y:�`O�$弚��1ݮ]���Ǿ��>�S���
�Ǻq�MYm�C����0��
�k��W�X5��Y��Į���C\Z��I'i� �˶w{�W%h�Zzo�A�6Z#�P��}~��N6���+R-Y���Ν&8�e�f�Ň4�l��uz��1[��f;ю��"���&�xD���hM�t(
+#��0�;��1�<�>�������M^�+v�z��	�s���U��9�؛UR�����OV�O�z�&A%nr	���|H� ��F�Ap��
��<��k��]�
�*$�#T�kz�{)�0�*
g
�
Ã7I-��J
o��P�$��;�S�����~�)��rȀ�!��В^!��
+��]��w�v��rgz|���P�W\�P?����l8�]�r����
�f��y��ض���P0 � ��ƫ]��6b�*�i���Tg��RC�w�JE|�ww��[�j?��š�~�饼���
\"L�
ϑ���
R���-<�:�/!{G�#�z,�}Nı3f
����6�6��]RP���D
+l\�C#54����#��F,
+{���г���Ow�u[��_���o�JgpV"�{��[H�i+����:aǝ}��[�x�a�U(�HIS;���X��h��9�
�[�=*��
R9}GT.$�R�y|�<��B�0�aȓ�
�Su)��)&�%X�5R�ɗ�”Lu��C,��z.�r�W�rw_g��
����L�
��E1E��FW�4o�����R&0B
K��ш�a���L>�frO럂ə�
�u�ɻbc^��.d�q�
�������{29�q��
�H��P3�x)����E�oʼnH�boG壞h�|`D��=#>P�G�ʣr�����T�R�P�/�tmB
N$F���7E��T�sSE�@
7M�
�o).�V��7�g�sڡ�Q�V
I%�8aC�+*� \�ڧ���M�|o \A����)�J 46U`M�BJ����23�
�O5k�j'ۏ�=���"l+�@0��=�mM�4�|�����q"�Q?H��y%xL	2?.��
���C�.��>�'~xl�ݮ��k�D���N�
��
�z����F��>�J$"LƷ�H
���^P�i]v����(�]2�g@�+6��Z�B
�ހ�@{D=�K��ijJ�
��G�N7�n��L�%�$>�֕9�� �fH�X��V��P-�v�9�0F��3�=f}��q�I|���7��PX��`��H!�?�T��#D_�nX��
��w��Эq��F�Xs�}t�h�sH���B�\b}g���ϐ�/f)�D͍��}���`���^$I�?TE�A�F�Kv��Ӻ�M��f¢3�&e���`]���__]=>>��
�t_�����W}�����Fl,z�Fh`��~),#�<[�/��k4��V�N�sd��'`ʯ
�B�endstream
+endobj
+9511 0 obj <<
+/Type /Page
+/Contents 9512 0 R
+/Resources 9510 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9482 0 R
+/Annots [ 9517 0 R ]
+>> endobj
+9517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9513 0 obj <<
+/D [9511 0 R /XYZ 90 757.9346 null]
+>> endobj
+9514 0 obj <<
+/D [9511 0 R /XYZ 90 733.028 null]
+>> endobj
+9155 0 obj <<
+/D [9511 0 R /XYZ 90 528.7053 null]
+>> endobj
+9515 0 obj <<
+/D [9511 0 R /XYZ 90 514.9806 null]
+>> endobj
+9198 0 obj <<
+/D [9511 0 R /XYZ 90 303.0958 null]
+>> endobj
+9516 0 obj <<
+/D [9511 0 R /XYZ 90 289.3711 null]
+>> endobj
+9199 0 obj <<
+/D [9511 0 R /XYZ 90 89.4414 null]
+>> endobj
+9510 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9520 0 obj <<
+/Length 2179      
+/Filter /FlateDecode
+>>
+stream
+x��mo����W�Skg��/A{@w�W����v]���"��J�֖][�d�}�)�-;��(���!g8C��L&~db�D	�
�r��\��
���q���|

+�Z\\~#�� #��,n�
$A�:Y��O	A
��c<��<�����zF�t��t�����w��}��tu��.��WN�6y��pc�a���7��(��
��8��7�Hd��2���D/�#B|_����:;
fs*�t13t�ov�ʛ;�o����i^.�#BL�T�Ӌ7�֑�ςIb������d���#f��<�F�:�\p������ş�~�u�T�a�ċ2��`]�E�Ŭ���Ms��Ȉ�R\{�V�vy�m����P(�0L��XP�����y�:��+,�u�D�� l�>۸c�}n[N�
,�e2��ˍ�n��`d�
/�sJ��J�/GF�씕s	+��X��<ԗd�ò��e��yw��R�#F!j�8w$�P���@#k:��W��Q��R�O��!чFZ�
���*�	l�k�_oa��OE��IC}� N�O2˶AB/�HI/�['�"È����Ǜ�?|�ݛ��]��CRK�,�It	�є���/�uQ�_AL!G�O�u�,�M;s�n^F�;� [...]
+Ձ�^_���BC뺺ϛ��%ìi�<)ͱܖ�]  R at pm*�~�3�YnE��ql�} �ʊ�(�A:=���S�*�x(��A���O�&�\�:o�̩�~����B�ַ��N@�J}�3�� �,���o��ӢѢ�w�eKw�*63�ߡؖ�
5{�҉�

b�cj�0��#������~���p�Ӑ�1S	3&�5l
����"R
�uʀ�!��В8�`H�����.�DډDBa2>�Vj�5Z��l8=�uЏ-���6Ǐ��ᐯzO�
+q�}��DB�}
H��I�L��@ļ^l�P#�梖��v/5�
�VH8�$־�/|�����a��.��'�]����3���'f~ u|��"GR�ڶ7O�|W�b
��	�c�q$@^̚q�VWW뼼��o��~��4���#Z��q�4E�`���7��_̴�m�n
���)�9���%$�Į�`6(�{[¡����3���
՛
���Ms���nE�҆9Ȥ����LL��j� �93H2[40
�4<*	�/%��-	�g/	 ܜ�ђ��EX�XI at LT��W�?^
mKoz�R1Ұ�����S=$K[{3叫T- ~ҭ�"�<�~`��P�D��XI@"Z�����(dݿhI� du��])@=�‰mb�����[���� ��9�H�D5@'�� 4��@�8j#�)�
��b���>�9���`�.R��ؤ����v���n�E�
�%�8
�`ؼ�8�R�����Yt�2`t��A�
�G�����[���
�C����.���2\�$p��1���ؘ7�ؙ\?������4�G�_��
�1'�|'42㹝 ����	�c���p$:N�yL?�����>� ����m��q��V�vI��%��X �� 
e4���K(�!}�
+(D����7�n��A�2FDg�9H��7��	',͔R!j+�j�h��gD�ں�ee����O���N
�X~�g��� ���_
+1B��� `�D|}.�!��|�}J~x�q*N����xq W%F��G
I�j�X�5^�)�
As�~� � �%i�t�񩑎S��jve��'{�#��"Ys�YwB��}:AO���#�����m��2�o�M�gx�U���;ϧ��V�F
>�4��q�!
+2<S�Y�2`l��ɦ�e���) ��>h���{$o�#`H�z����;�
vl�O�{(6�G/v&��ko�}�=�����w���<�E*���s���s	>�|,B}+�Dȋ=�G=�Q���4�GFD
/
�
���xs�8��ܮ@���O)��7�1�
��"�x��x�a��0
 D��k��{�Pv��4��b"����HT��KB�@L��®��Ј(	][�X�u��x�K����_���3!�ne}���+�ƟlW���]LŻ}N�e������
��^j��s����
�m0Z4�RC
�k~_U������G�<�����QQ]�v�˾]
c����Eo�
+
l���a
K�ud�-,��Q�P~g��4��&��)����Rendstream
+endobj
+9519 0 obj <<
+/Type /Page
+/Contents 9520 0 R
+/Resources 9518 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9482 0 R
+/Annots [ 9525 0 R ]
+>> endobj
+9525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9521 0 obj <<
+/D [9519 0 R /XYZ 90 757.9346 null]
+>> endobj
+9522 0 obj <<
+/D [9519 0 R /XYZ 90 733.028 null]
+>> endobj
+9200 0 obj <<
+/D [9519 0 R /XYZ 90 522.5811 null]
+>> endobj
+9523 0 obj <<
+/D [9519 0 R /XYZ 90 508.5322 null]
+>> endobj
+9201 0 obj <<
+/D [9519 0 R /XYZ 90 302.4782 null]
+>> endobj
+9524 0 obj <<
+/D [9519 0 R /XYZ 90 288.4293 null]
+>> endobj
+9518 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9528 0 obj <<
+/Length 1932      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�F~ׯ�S+�x�ww��m�@�-���K�4���H������
gH�∖�n��r��̹�LD�����S%2���r3��X�ׄ���/�������bj��TN/�k� A	�^���A
�c<{3'x����͜�Y�~���"��&�*�����/�YU�*иO�m
��_��&�seq!����'��C0���@��m�
ሐ���
���uR��xv17tf7�uRY�򃽶Ŝ�͖�Ĉ3&�c:yu�2�Y0I���{��+������bz/c�t3�5/�����-�Qs� �Q��l�/ĂǾ��+ЧV��.[Vi������nc�*��@=8qA9bܐ.#D�����>3��xQ!�u��ak�d����]
+HZ�E]*�&�����u���!J%�dT9/

�s2��tFzT�������r���q_^ב�o��/���S#�5•������0�O��i�x����aj��Wޓw2��&пK�u����
��
+U�4xE!I�O�l�+�2ƙ!�A�bg#L]��&\�k/j���C���l�Ӯ����$iU�,"GF�V�۴|L
+w��
�H+)�v�1шK��uR�ل#:,�Z L t%�#� 9c%�!Zt��eM�/�LQ�Dx�ai��^��gL�b�D�R�8M�F�Ğ���V��ٜ��]�NW�IqS�ҁPF#�j��EZ��0}�b�$��0�E>�bv��ê11����p���xQ��
=��*�����a�f�|���Z���hB
+�W�c{4(R
+"Cc�(E��
��է��"I��{����XI�&����o8Ҕ5��%ELfp��
�?����������
t�0-;�p���4���n^ ^27^;�KH
(m�HХ:�,K��'#A��$HG���yH0j�=
��#AO�g �S",�C����m���;y��!��A3�>Z�q	��6f<��T�c�k��~0�.���=vm�s{*��֒����̫fw��MA�\���
+�G�%mh휈ه���7��'�-�j�����K��s#����M���4�i���]�a���u�3����
+4K�d�0�v���=�z��j�na�C�`�0_�˰
�P��߫�[�$~�*�9@��T��HV`,X����oMt]�Y�m�����‡U�.���� ��Պ ws ��u�� (VI��_�מ#sU��G[6��	8໰ې�=
��{�J!�9��4#J��!u�PA
+�5��v� �i���!�	��=Гh7:����Ձ�M���Ж�gLED�Z�@��W�n
���(�e 8�L�׃Ӄ<�;Pd(E�;$"n�
��Η�i�� 6{�S�ٝ�ۆb����Ş pD�amc���+f¾M�d�4X��]�n&��
��͛�K���4�a-:yh��:>x�?�O9x\�\e{Av�\��޹�l��(�Iq����_����%vIEaB{SZ�YDG��$��M�(`��
U��9!�j��<��;�5�bd�!�C�f�Gk$�(�0��6�]��$5
+1���CL��r E|�iɞ7ČZd?�
��1=a�1Ĝ{�V?�z7Zc�Ğr�Z�'�jQӑ �D������~
+���E�+����HB�'m�z�
�_B��_��<�*�h^�Ԩ�C"�qT�R
G�|H�>Ub����@�8��d�C�Q��Qe L
Uz������/�A�aJ�!R����
��I������N����F���_55D��#�
+Z������s!f!ǿM�v�s����žȂ�x[X�\�
1o�=��
+@ �g%��˴y��^���E�
�����S�����gg���hY�]�n
�Vg����P.�12��-Z��,=�CW��º'�u3�n��aq����y�K�(�O��,endstream
+endobj
+9527 0 obj <<
+/Type /Page
+/Contents 9528 0 R
+/Resources 9526 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9482 0 R
+/Annots [ 9538 0 R ]
+>> endobj
+9538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9529 0 obj <<
+/D [9527 0 R /XYZ 90 757.9346 null]
+>> endobj
+9530 0 obj <<
+/D [9527 0 R /XYZ 90 733.028 null]
+>> endobj
+9202 0 obj <<
+/D [9527 0 R /XYZ 90 716.2211 null]
+>> endobj
+9531 0 obj <<
+/D [9527 0 R /XYZ 90 716.2211 null]
+>> endobj
+9203 0 obj <<
+/D [9527 0 R /XYZ 90 611.4129 null]
+>> endobj
+9532 0 obj <<
+/D [9527 0 R /XYZ 90 596.8426 null]
+>> endobj
+9204 0 obj <<
+/D [9527 0 R /XYZ 90 382.6245 null]
+>> endobj
+9536 0 obj <<
+/D [9527 0 R /XYZ 90 368.0542 null]
+>> endobj
+9205 0 obj <<
+/D [9527 0 R /XYZ 90 265.2833 null]
+>> endobj
+9537 0 obj <<
+/D [9527 0 R /XYZ 90 250.713 null]
+>> endobj
+9257 0 obj <<
+/D [9527 0 R /XYZ 90 147.9422 null]
+>> endobj
+9526 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F115 9535 0 R /F8 568 0 R /F1 583 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9541 0 obj <<
+/Length 2400      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n��}�W�)��U��'�C��l6�d�A
f-Q6�T(j=�ק�ͦ�b����,�� c^�u�����Df����3%2���jw�gw���
Ҽ^��eW����I13�H*gכZ�$HPBg��sBNj%���/�'�.�y��x^l��u����ݖI�xu�
gyuH�F�~��`�������QFR�q��N$��`D����-�#B��?L��v�
�%x~�0t���ۤJݓ��MZ.����
+
1"ĜIc�^��n
��Y0I��u������?\`����Cg�
N���^|��k�ǽ�?��K��xQ���/ĐhbV�����9 32�|��޳��>͓
xEc�$i�
��@�P/q[�F۫g�����9[�Xf-9��)&gK�0B�������%��]�o�BB�����P���<Mʛw��.����ݫ�8�Fu
U�W�Fyj?�,G#*�_�7��Rx�m�n~Ƙ��4��T��=�ḿ�#�#C�Kta
G "D��dgK��HH�}4\���
#��WT㸋 rk�fA��+.XN���AVq�
�1˷�ON��d��HIJ�T�$��৴:��!��#p�7�*�iD)�!�
��y���E�o�����ݵ
+���]+f; ĺM��>;L�qp�yQ�
(8��ɴ>���`���'`��|�6�ݔŮ���b �����y�K$I��/q�0?%*4
+�Yc?�g��&c5�]IIX?Vɡi7�}s;�Lm��w�,��'�c�2;����U�F��H
�	TI�Rě�Zv��
E�D��@�(���P�+��W���VH1Xf̀�!�tߒ�M
E�0q��M� �
+d���;�����%
C�$	q�}��u�vשM90ȗ�:���{���V�����G��Z�H�h�����w�a#	#�S�:bc��bA3	�a���	`/�>���ۚ��m���.-��hBVl�����%�DZh:᭮؈�Z��1�{
+X�8������c!p�u��,Ui�b�D��WGl�_^쬳��؉�M@{�>t�ӈ�fB�h�I�E['�-�vfݢ�>�V_��8�k�?��[p8�����pOp�F�����*�WP�F�A
|,έH/Vo�j}u���3�m��I�;��y�3�h$�j�#�Tߘ0Θ!��:0���,lD
�6ʑ�M��L@�<j稰O��U���e]�� /ڶ��r;y$Uv�uy6[R�p�pM�e��6ѩ���̄2��΄���b�hRܰ	oGU����Nx�̝p̝�D�	����N���
����u^�g�&i)�/X��.� ���c�N9p8�2nϒc�=��
��
�{����ۦ�f>:�Uq\�7#�YUZ� [...]
+�2ߧywb��vp>�w1�݊���
+)a�R+_��.�B�E���y���m�u��i�ƚ��FR�/���4�&֌�Y��mw��Sp��Ԍ��]����`�&_D��
�{����Vl��u������i� ���aP��2SDEWl,\^l��ni�
p��	�ߎ�a�
�S4EWl�[^l��ni�
p��	�ߒց�/"j�4슍�ˋ=���ni�
t��	�e�Έ�a��R�)�w������q. %�e�-ģ�^����۔$!���S[i��5�ܡ ['�Vi�>�� �?dۭ{Qc�$�B}����
�n�6��ն8
��}>����BOv{m�{�ȪC3���$f�``�v�� ��50ώ�]��Y�*����t^
|$�zV�s�{
�7���3&N�����yb�Ϋ	�װR���g�"��Ҝo hq.�
{���4���\s}��z�s�}��9�j��ði��ST
������˳&
py�֙�Pyz���H(*&��iB0P3���!
j��&�i���}Q���>�
��3�M�
T_���*��
d8`�d
`���
A�><��F��6q�������sd!�$�۽FpY2�v$4��
�2���Q��A)�ƼM�,'fg�ұ)�δ�L�t��U�ڶt�S�
��ng���h���O�׮͜Wwzjb޴(I'�Q�ez��6/�6��q�uc���C
�%�oBБ�����t��i�.��y�`��
b7:w���b�+n��"�,?2������$A6��?v�Ǻ��gǚ��옭D�V~�!v��0H�a7�-
�`
�/�Uw�3{�!��t�-!p�s���Fn~o]ks�;��mڿ���!-�b�쏿$�1ٺk�`�([�B�bU��#�m��C����jy at H�%���3���b���/<�rZrO�]�}U�./

�ꀎy�/QV]����s�8����7=��[�B=[�s؇Ra
ز��خ(��w5�+;�/I���
mբendstream
+endobj
+9540 0 obj <<
+/Type /Page
+/Contents 9541 0 R
+/Resources 9539 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9482 0 R
+/Annots [ 9546 0 R ]
+>> endobj
+9546 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9542 0 obj <<
+/D [9540 0 R /XYZ 90 757.9346 null]
+>> endobj
+9543 0 obj <<
+/D [9540 0 R /XYZ 90 733.028 null]
+>> endobj
+9258 0 obj <<
+/D [9540 0 R /XYZ 211.8424 499.5909 null]
+>> endobj
+9544 0 obj <<
+/D [9540 0 R /XYZ 90 485.1527 null]
+>> endobj
+9259 0 obj <<
+/D [9540 0 R /XYZ 192.8535 216.9495 null]
+>> endobj
+9545 0 obj <<
+/D [9540 0 R /XYZ 90 201.1315 null]
+>> endobj
+9539 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9549 0 obj <<
+/Length 2453      
+/Filter /FlateDecode
+>>
+stream
+x��Zݏ�߿�}il ���cS��%h���y�
Z[��V�]Y����3EZ�his�k�
p+Q#�p8���O&3
����
+��l��³G��t���|�������R�
2����C;�$HPBg���sBNj%���.�g�&�{��x�-�O����+��>�ܸ�j�y���W��n������2�(�B*0������!Qfx'��]b�!~�/'������Œ
+<�]:�7�2kr7�}���
��y��!F��3��Won�#;?
&�u�����5���+���b�
7c�ls�)�7�ջ���y܃���vqk�Tz�d
i	����H1Jak)CX
+
�֨�
+)��,�Yw��]u�>B
��d֟q��K

�Wl���L��S��������v���6�yQ�c�9l��
*�YyȿX�
V�J	d�]��ؘ���w�:�.�a/�{��⁻�f2V
ܵΫ�^�a�D47닍8,�Y���šr����ьM��RC�2R-(rZ����K����F�lPt�˪u�ͪ<vn��k�e���o�$��c��s'h�0�j&��e�t��B˾�0qk�0f0�)&t��7?��]Sl����O(��s+.Ā�f���MQ-88#+��]V?¡���QF#)�H�o4fH2����}��vG���ͮd���)b�.H�v�T � jEhTz$�*8�R����8��	�jJW�sA^���.�j��첦�/]�͖�ap�Œ�S��W�����W�R�Å_�= Lq[a����։�A�J2����նq��C������n��t���b�yB7 @C�$7�
�T�`I��3�u�
��k
)���1
��W���A%���[�P	����4�I3�-9��C8�#���<M���9b����+��]
�f{XD	��/���	U"�t�,†�N������ko_s��U�#56i��4�ċiB���v[v��:�����.�����/�D�����S���i7���]���
��RaO5��*��7�8Z@��y�I��M
g~� �C�p~���h ���8��n�_m�[YW�-	5( �\��I�4P3
2��h��Ck��Hk
kpQri�%�p2�_>s�
+f��9����C�M^�qrJ��X!$����Q�
'n2���d� @����/���C"K T��Y�KȨ�r־�}�!���2�G�e��ˊ-
W;�
T��"UՄ(��
����}3�Ng[z�EW޼iC
VB5	&NA�u��fo\Uk�CU�[
����
+z-"_���N�;����5���X=9��4����A����
��3$��?;�P���S^�".��+-~\��
JV��n�P�,�:4]EK!v����G�}�ˈ����u5*XU�2jO0����Q{�1�tx��q��޳NC�H�
�n�V w�/���A�
�յ]���
�Y?�����Udg�؜E�k�/t��������7�}����b�Dθ�@�
���H�'$r8�G����s��&r�"g�8M�D�?)�éF�=尞ؘü�K��qՁ��N9���7"g���"m���Ol��^,��H)<����Q�^j�4V
۔$���r�����5k\ ����Z��zo�0R��{`�}%�\���c{�
v�܎ظ�W�v����K�Q����$
�`��ۉ�f�A�B9g:�,���E4��BL>��R�� S Ż>�%�]J�H�
�H�^�8�n�#'�n`L�������Xi���K��FG��ćM������$}�RF�	_'�n{(�otHhtH��\��0
�)�� ��t��;r�s�CT`_F�;=��q��8���)�v��\&�#�i|V##l`
���4�Rӏ��`�!�O����3���K��1�B�Y��,�w����`���
%ho�1G�R�_���$'�]���c���O��Q(v����Ky1��z��, ��2�A_�=�41� ��*E�gFNN��)acJ�15����]�	
�I���vZ5/P��K٭�~|�J:��2�q�-W���M
v4/� �n���R8�h�'#j��n[	���p�(�$>cņܖ5�7�����(�V�
1�R MH��_�Ǹx-� 7���/u�R�V���N)�+Ҁ7�}
�
��	��I�ȘK�7
+��P}f8�3���d�	�
6l"�zR��
P
Ғ;���&��&���
G"m̂^���7�!¼��T�:l�c�1[O*
��+W��엷�5	��
0�#L��m�
���ل�}r���0;�B��߸�?:�|`"�LBb������do��pu�
q��v��������Ω˪CV�2�/A�;S�Ω���ox�.���C5dop$�{���i��e�
�s��<��.��iv7�����h�G���ըh�w����.�12T���[��-��9�TXG�<xRr��k��� �Y����S�endstream
+endobj
+9548 0 obj <<
+/Type /Page
+/Contents 9549 0 R
+/Resources 9547 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9554 0 R
+/Annots [ 9553 0 R ]
+>> endobj
+9553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9550 0 obj <<
+/D [9548 0 R /XYZ 90 757.9346 null]
+>> endobj
+9260 0 obj <<
+/D [9548 0 R /XYZ 211.8424 606.0384 null]
+>> endobj
+9551 0 obj <<
+/D [9548 0 R /XYZ 90 591.3137 null]
+>> endobj
+9261 0 obj <<
+/D [9548 0 R /XYZ 192.8535 317.8473 null]
+>> endobj
+9552 0 obj <<
+/D [9548 0 R /XYZ 90 301.7428 null]
+>> endobj
+9262 0 obj <<
+/D [9548 0 R /XYZ 90 140.7899 null]
+>> endobj
+9547 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9557 0 obj <<
+/Length 1868      
+/Filter /FlateDecode
+>>
+stream
+x��ZKo�F��W�������k=4H����
�����Ė"����Y�K��V
%i���1����
�"c
d��X	�4�r<[��x���H}{
+��m���FO�k�%���R�$HPB�W�!��ɔ`��g��(_E��&Y�[�y
]���Q����.�i�1E-cٚ
.L^]�|��b�QąT ή�C%��C0�L�Z��
��!NǏ��x�D��dJ�&�f�N��TW��[�OH�t�"`�X���W�#k?
&�u����Wx<�<ˆ�P��p�њ�W#N�;IF/F�7z���p	�N�eK���B
����w\�S�x_!�ð(vk�F+p�
�?y(�b���7Y���Ξ[T "�`nu�x
�rp(SL��p�� G-+}喻�\�le�<�EI��6�κ����,���;�9��~Ԛ���Ъ+�B-j��GG�߬ �Iepe{%�V�$�<Ե��8M�Լ�m��\R�B�B
+�'���.O7>��1-��"�3
�T!J�K����� J���Y��Kp�|��m�"���X�<88�!q)���(
�D�5;�T*S��[d��fH+J��%@@�j�
t	��k؄-��^61+�Z��n˸��A0(����S
��b��Ҡ��ݜ� �)宐+z�\,�8����
l�.W
��J������TtH�@�@�KHbF���;�i[��ҡ-��@���J)K����̺��t.�&�"�(�.��H�Q
�744��^���)旗�/��7Qϯ�|qg�
+JTZ��H#����e���j�g*�m
?oar����
�	�	��4�(T�8�K�q����:��1�p����,[��"�I��$� �atL���@�A5`�*��9�PM��8]
ϴA�
�A���ɰF�
+j\��*�U7u�V�ݻ�p%�O�
+L�
=��͜c�yo���6y��S󍇾����2n{R����|
�>ĀEO
���}���
e#��2U�1Uqn�`���cs�^��
X�jv߀�n�q����J�-竺���M4[�����.����z�F!

���Z�U�6�E�F�F�hh��C�`��g ��v��vX
	����ߖ:��9�8�!�O
1|�@��h�
6b
zd?b���G����2yd��B�?E�a
��A��DMЃ`@b��/�u�d�]g°�T���~
+�j�@�ۙ{�!k2
~,�]���&�ʚ�t[bc_"�dw}^�
aTR\}ћ*D!P�E�.��E���Z~42e\"�� ����S)��Pӓ�Գ� �
b���z�9cO��H�,�F�D�$J�A������IsM��3�~Om�0�e��s8�+��wb�ړDB��
���ȉA�B~`n:���#Re��6.�^�}dsh����҄�l�.g��$�"D
�h�n�浵��e���t�vp��1�۬�+����[�g!�í�.��>
+}��!���2�o�(�P�A��ٴkK
�ʔ��d��->@6=~�i�
F7�
��M��p:`>����Y%�uMǙ�c���B(0��G�/��8D�+��{9$<䐧�
B����7��kL
v 9N!u�
���BZy~^
+a�:���BM<
B�ֱ�:�
B0AD�{6��R��P�b��?��
�C�g�F�a
2�=������� CI%$�m�W,���Qc۫�`���!R����S�c4�W1Ҏ
�XX��Ɂ�Bb��e�O]�Nk�N�ؘ���A�R~���W��V_��MI+�"@���Pe{ �� ��
c�CC�AH�K����藽����U}���=���eQ�//.��-�m�]�s�urq��c�4�)h z�F����~�I��p��r�xf����S��*w/�l�y��
�ףendstream
+endobj
+9556 0 obj <<
+/Type /Page
+/Contents 9557 0 R
+/Resources 9555 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9554 0 R
+/Annots [ 9564 0 R ]
+>> endobj
+9564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9558 0 obj <<
+/D [9556 0 R /XYZ 90 757.9346 null]
+>> endobj
+9559 0 obj <<
+/D [9556 0 R /XYZ 90 733.028 null]
+>> endobj
+9263 0 obj <<
+/D [9556 0 R /XYZ 90 579.358 null]
+>> endobj
+9560 0 obj <<
+/D [9556 0 R /XYZ 90 564.857 null]
+>> endobj
+9264 0 obj <<
+/D [9556 0 R /XYZ 90 450.9013 null]
+>> endobj
+9561 0 obj <<
+/D [9556 0 R /XYZ 90 436.4003 null]
+>> endobj
+9265 0 obj <<
+/D [9556 0 R /XYZ 90 322.4445 null]
+>> endobj
+9562 0 obj <<
+/D [9556 0 R /XYZ 90 307.9436 null]
+>> endobj
+9266 0 obj <<
+/D [9556 0 R /XYZ 90 205.943 null]
+>> endobj
+9563 0 obj <<
+/D [9556 0 R /XYZ 90 191.442 null]
+>> endobj
+9267 0 obj <<
+/D [9556 0 R /XYZ 90 89.4414 null]
+>> endobj
+9555 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9567 0 obj <<
+/Length 1942      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n�F}�W評�r����h��H�i�>%�@���V"U���~}gŻ��[N��2����\Ι]��1����c%2���b=�����_{����rt�R��AFR9���k�	J��2x?!q<��x�fJ��O���͔�I��[�A����R?�����Q�mì���܆)ܘ~�|}񒐆1�(�B*p��z����!Qfx!��C
ሐRdz�:����v�Q�'�SC'�z��0��6��)ѓ0^�-F��0E��ы�*�E��Ć�����x
@�_�0bF��-\`D�����SV^�F�F�Wz�/���%;%_�!,��"�HZV��8mS�D_!ŵ.��M�k�0ܝ
+a�ʁ\0$�*�U���y�߆�g�ą�/*6Ϛ{D�9��A
��ae��F�
+�ȅ�g)0�兖/z~e˼?`�I���K�M����^�+6�iYh$9+�_�8�(
^$W�[�ś*�D�kSȿ��U�sAA�
Ua�
]!I���o�l��E�e����Xnq���(��/���6
�'6ɔ�V�hsU[?����9Ñ��KE
/��c
aR��qp�ǢNCW���)��ph�(Uz��DC	T��
+iM�hP
+yM�."@WC@�)nZ�/>/��>�C�S�%N�
'*���P섉Z�uc��YO9�|�WQ0�ӛ�:���S
+���`D*��3��b@
����\�ym%];�S�$6�U^�U%�����Ԓ��[?-J5� �[H�ŋd����Z�ȁ	
�'�܃��HD��DT�D�a=$��D�
"$R���yV(<���PŀO�|�f�<BLH�DOe���]�I��p
�
$NU\6�ܐ[d(g%r�.r����UT�u����:I
�C(:�
+�!�Ð!�7����
ϫkWL��E��G;	ڳ��H�U5�ޝ܎��bY���J��Q"��Γ�rO��.;L -�(
��b�ء�r�*e?����bj�st
 @x���^�F(z���
-�Th_-R����(6-
	C�v�d�!��B�����F���� �������<?��A0�ퟻx�9gO��?sB�1Vi�,�C��X4�NG_�)���7�F��� (���B �JV1>�Wsa?�R�� �
P��
+>82r@:‰
�
�R�s!W����e{`,�8�

+�������Ž3��7

�񎻌8l��~� H fF��AP?�i���К~U�>�����I�B�
�S\�;(h}�m�7R��-�PJ��A�}f"�1_ř
�"ۺz
�D-��{�>_i�ѱ炴h�𝼝~4fd��R��̈́@Jhv2d��@v�
7dWb�����Ԑ�q�
�-g��Ͱ�l�9g)+#(kn����(S�
m�!���&�[�Y�IV��]
��Wr;��H
����"9��=

% f ���ͷ�����NO����b(\�����������E�XT�	!���؆����vR�'s�d�j�<}Σ��%ĉ4�:�`�������t��R��@�]mɢ졳,��s�ˁ��x��J��K�8la@탫���F�N
+�I�襣���a�!��mà>�jՇ���	�8�
f�)՟9�%RZ��e| k
/�Y��������㌛�[���7c�s&��(Vn*������k���X�2xWI�*�=
���^_
�H���C���Q
���{��]�&�|=��g������ܕ�H�҂�<�=;8/T�in����V]�7�����۷	R���c�S
�Mk�#�ȫ�_v�N�x
J���,;*�,�*���*�~*Ĥ8�͏w��.�OV�|��
{\ś4��V����wax��
4T+J�����~�[=�5��iQ5���k�̲������-�hG�E��f��8���g`dϫ�:���ρD�º�K5)��أn��?j�ԑ�=�+��r�endstream
+endobj
+9566 0 obj <<
+/Type /Page
+/Contents 9567 0 R
+/Resources 9565 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9554 0 R
+/Annots [ 9575 0 R ]
+>> endobj
+9575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9568 0 obj <<
+/D [9566 0 R /XYZ 90 757.9346 null]
+>> endobj
+9569 0 obj <<
+/D [9566 0 R /XYZ 90 733.028 null]
+>> endobj
+9268 0 obj <<
+/D [9566 0 R /XYZ 90 635.7621 null]
+>> endobj
+9570 0 obj <<
+/D [9566 0 R /XYZ 90 621.1918 null]
+>> endobj
+9309 0 obj <<
+/D [9566 0 R /XYZ 431.1796 558.5203 null]
+>> endobj
+9571 0 obj <<
+/D [9566 0 R /XYZ 90 542.4158 null]
+>> endobj
+9310 0 obj <<
+/D [9566 0 R /XYZ 90 439.0224 null]
+>> endobj
+9572 0 obj <<
+/D [9566 0 R /XYZ 90 424.4521 null]
+>> endobj
+9311 0 obj <<
+/D [9566 0 R /XYZ 90 311.7285 null]
+>> endobj
+9573 0 obj <<
+/D [9566 0 R /XYZ 90 297.1582 null]
+>> endobj
+1255 0 obj <<
+/D [9566 0 R /XYZ 90 154.7108 null]
+>> endobj
+9574 0 obj <<
+/D [9566 0 R /XYZ 90 140.1405 null]
+>> endobj
+9565 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9578 0 obj <<
+/Length 1867      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n�F}�W𩕀j���PhӤhzsc�)	
Z�m��Rt\��;+.�KJp
(
+��2ܙ�3;�p)`����@	�
�2Xm'8����O��=��������k)���2X^F�	Jh�\���8��	�xz>#xf���|F�4�<�F�,��)����a�(.�I��rgc��2�0��|s����3�(�B*����0i�C0��pgq~��pDH9Ƌ�c�܄��lN�.g�N��n�Qq�mt
e3��Q��K�1e��A'��U"]��Ħ��ɻ8XC��L0bF��
N0"��`;ᔕ'����j����\�T�082HSF�VZ L�d��L�GV�1S����!o���+��~ѝ$�)Fi�
�署�W-R��z4��:��2A�PLi� ��
t�d]
���8*o��,��mrw��
�3)��;�2wRr$dg4�M��K���H�V�.�ӱ��������2�a���b'3���M��
���m�你�F
�He��#�
Iǭ`��Y:�bz���I��h3��#��U�
�vs��X
�M~
p{+��r���C!�Ĕ�V�A��0Ry
+��<Ow�&�y���*���<��
n�i�&�����v�`NF���Ρ�!�.�|~�Fa����0Ȅ���1]��׳g�YχB� 
���c�����F�]�+��
+z�W=
�"!<h�ܫ
ƑR�
�p��1�~���^��0/���4�,��Ys�Ӻ���9��%��I�E� �������}��]��y���`�!!����a^Y
�A4;�a�9��� ���b���P�L
�T�}tXr�nE?�$�BB�V~�p� ��Qg��ʑ4^��\�PX���əf4��9d$�jw�C�*��b�ח+ �<
m�E��.�/���{����E1z�H�E�c��D�5�n҂x�+�BSRB�.N6q}�4Y(0�����rvx�$��^�{K@�I)����"��������r�%ȴ��`���;)k�
*����sȾ6f\�4��刀d��+yXT6�C����uhҏ�/HJ�:5-�D¬�ߏͼ2��e���\B��%��ҊS[���e�@
�a���u��:Q0��1x�Q
�S�=N0�f���`���LS0���`�֕|��f��2 a+*F�A�W��hcЌJ҃f�&}���%=��|
,-�M����G��]�|M�v�i�M�[W�](i(U�D���<%S�cY��s�7�+d��������Q\��-z=���EEYi�Pd��#�@�H�r^�f�X����R��D�j�%��	��p*��a�^$~��̎P���k.�y��y��q6�rw���]�۬�g��Q# +��F�kZ�`G�Z����|�^~�*��1�hFj���g�V0M�w�z
�O��<���<�VR��}oC���(CS�m�
�h�Y)�S4��(Z�2}Wi�q�}z&�O�鹎��P_B�\n�$��G����+��
�l�լmr�O�\U
� ��蓼A ����|h
��髈��~r!����s�������-�پ�^�xnk���I.��N�E
�ci���'���&�y-��.�����i�7��i�	צ�B��9}{��|
�n��f�?���O/��i����)�����]S�w�0�I����i��_	�m�&M0�����e�xn���A�BũSC�	�g_΄����s�܅�Z[|�C���>A�x�ETY9����[Շ=_��Rq���<���l����D�)��{�ډ���nqvv�V{t�Ļ
���n�9���1t.��z�ʨK+�
�TX�b�^�i���.n��zud��'� ��O�endstream
+endobj
+9577 0 obj <<
+/Type /Page
+/Contents 9578 0 R
+/Resources 9576 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9554 0 R
+/Annots [ 9580 0 R 9581 0 R 9585 0 R ]
+>> endobj
+9580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 625.8972 138.5077 636.7763]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000036) >>
+>> endobj
+9581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 605.8076 314.5657 636.7763]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+9585 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9579 0 obj <<
+/D [9577 0 R /XYZ 90 757.9346 null]
+>> endobj
+9312 0 obj <<
+/D [9577 0 R /XYZ 90 598.8477 null]
+>> endobj
+9582 0 obj <<
+/D [9577 0 R /XYZ 90 584.6385 null]
+>> endobj
+9313 0 obj <<
+/D [9577 0 R /XYZ 90 436.2553 null]
+>> endobj
+9583 0 obj <<
+/D [9577 0 R /XYZ 90 422.0462 null]
+>> endobj
+1256 0 obj <<
+/D [9577 0 R /XYZ 90 285.6181 null]
+>> endobj
+9584 0 obj <<
+/D [9577 0 R /XYZ 90 271.409 null]
+>> endobj
+9576 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F67 370 0 R /F52 345 0 R /F97 1774 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9588 0 obj <<
+/Length 1888      
+/Filter /FlateDecode
+>>
+stream
+x��ZKs��
��W�HUQ���v�R�lvS�yMf��ɔ�#�6+���8ίZMR|4I�g��-,� ��߇��?�,����r���aA����T���|���fq󍒑%V1m��ɀE���% t�J���
+�2��ݛ�����1����_ҏy������iVIYɸW��
o�>l����e�qF�T�s�~�E:� %�[QI�y�� �:~7��}\�5�t�YY�L�}\&����>�W`�I��[
�\r-���כ&�U�%W������4�a��[P­��3^Pֲ����Ż�?=����P��T��Z�LڐG	�z�/�����ۖFc	��`0E@�`�b��
����õ�8�@Dm̓qA��0�;����2�9C)Ma���K�:y�D�Q#��|�$ߘ ����U�s�{:����"�۱.�c����Սo�ؒC��q����=����<.�y�_N��J�ZjfCmn
$��֌�*�UA���p�De����+
+�����KaL%P���,>`@���m/���O�{�!V	|rHtLw��W�2&	�|
+���W����X��]�9X5���ƻ����=�O
�\��J����_~�{�+��궋�ߙ�z� f�iDP�t� 1
�̼O�}�%�`�$�.�k�D1��o|��.�۲�ﰎ�(�L����ͪ�
�"`
aJP�d����ǥơ^e�֋OG�ĢԪ �
l�H �&-�Œ�t-�nK�a��қ���ޯ��MNZ��zT���1
��ݒ�1�sn���6�V�.?��tw�O�NY���TMF��:�M)�
+��qf�WL.�
�rX�����
g�(+1[V
T�(�v��tY�b�0QV�0�낎��+-������N���pBN��??b�c�Ev)����X;�����]�i�$ n1�.A��������}_�U˲��a�k���MB]��!��
+����|
p�\с8��}�����d�P)E��n�,&dSkG�5�@.� e_�t�[����N�6�m�q~�c?N},��ǝ�(v�#BLp���0G4b��t�c�
L/��Z�5�
w��Y�j�WU��"��O�g,m�#���9�E��I]Kj"u��b%^K�!�Si�{1��Z��}2"j8���3
j�
�����}��1{ �1�h\>����
Qϒ1��5cl��(�q6FͰ��u�>
��Jݗ�bPZ�p�ŗW&��a�
��f�!���b������NfLQ4�{T�=�]I����Ϟ�~�5V�I����<)���`ϩB�T3<ݖ{�Ѹ!�~�M�'l��r
+�'�_P~h>�򍘳�$<lи6u���ʟr���K�ġHV��+T��Rr�b
+���3lږ0���Rz=���O�y�E�M��c�Ɉ\�t�L�M;δ��pfS)H����M���
+�)6p��^F
� �s�s|�\l�>�����\�i�T��sq�F��#�����4�w��L��}�0�ok
���f��[˞��7bӳ�ngg�3�{:���T9�f��+j��ټ�e6�s��3-�ݻ�S5�	6fB_�Eh=�xsM+��i��L?�!}���\:�d5��~Ⱥ��gzn2c+�^��HKh
��Z��
�v.0?�}?�
I-ՊM�)��%��Zh`�̮��cs3��z&�ֵ�/]
��W�:R� �Rt�T?�����'�qM	�ק
ؙ������q������4Y����H�_��\V1�k�=��
j|r�0
E���'L��N�oh�g���&�%��_Q��ϗ�6/�[o��˒z����t{s���L�y��SN���t����+�i>��u#4�~���45
_����X�Z�
o
�4?�#�e�����OV�endstream
+endobj
+9587 0 obj <<
+/Type /Page
+/Contents 9588 0 R
+/Resources 9586 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9554 0 R
+/Annots [ 9590 0 R 9591 0 R 9595 0 R 9596 0 R 9598 0 R ]
+>> endobj
+9590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 723.1451 138.5077 734.0242]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000037) >>
+>> endobj
+9591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 703.0555 314.5657 734.0242]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+9595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 222.1559 138.5077 233.0351]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000038) >>
+>> endobj
+9596 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 202.0664 314.5657 233.0351]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+9598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9589 0 obj <<
+/D [9587 0 R /XYZ 90 757.9346 null]
+>> endobj
+9314 0 obj <<
+/D [9587 0 R /XYZ 90 694.9227 null]
+>> endobj
+9592 0 obj <<
+/D [9587 0 R /XYZ 90 680.5024 null]
+>> endobj
+9315 0 obj <<
+/D [9587 0 R /XYZ 90 567.4434 null]
+>> endobj
+9593 0 obj <<
+/D [9587 0 R /XYZ 90 553.0231 null]
+>> endobj
+1257 0 obj <<
+/D [9587 0 R /XYZ 90 409.0514 null]
+>> endobj
+9594 0 obj <<
+/D [9587 0 R /XYZ 90 394.6312 null]
+>> endobj
+9316 0 obj <<
+/D [9587 0 R /XYZ 90 193.9335 null]
+>> endobj
+9597 0 obj <<
+/D [9587 0 R /XYZ 90 179.5132 null]
+>> endobj
+9586 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F97 1774 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9601 0 obj <<
+/Length 2095      
+/Filter /FlateDecode
+>>
+stream
+x��ZYs��~��SLV��U�U��Nٹֻr^�[*,	I�� 
��(�>=�
�c h���aA������MCd��Y�VB!ø\�+����]�8��QW��7���Xd$�뛻Z�$HPB�7�wB�ۈ`�7��o��߾�R��Oɾ�o��~(�������fU�TNƾ�pc��槫�,FE\H�ٵ�Ԉ��!Qf��x�6��pD����W��,�xs�5t�
O��J�;o�����I�
�bD�
S�*]}�:��Y0I�[�{��{��O+���b�?0"���q�)�?����[=̓��P�8�Pi�֑ HQa�RZ L���b�(��`d�A3�VT""�����wɩJ�
�`��t�U��J��0�
�a�՚QV���4�r����m\ܟ�IV��2I
	u1�K�����!��g��C�o��<f�Hj�I�]oB@����ԯ�Y�x���&z�L����L����F:�8��P�(^��>��r�%^O�4�W�)?��OQ����)�������E#�O��%�@dծ#
+�PZi�#AF��t�G�"��_Z�s
+�F;�1D��!�/�q
C�2��L3���Z{>��,>��;��K�6�8�G�mVy�w�z��P���5��5�
E
<��q/8�N9˷��릫A��,�}L���]��g��\;�

7˪���}~�����5��Ьիj
+1��ȇ�ߝM��`	$:�IS��]�
�,y���*�$V�
+I�Y��/���Ճ�m��x]#Q��FЮ}2Uy��p.
�&'R?�E��A2��A���P�����4H��4��T�Z�=
!f�bdI(Z�Nhz�C`��
+!�K�����@�(���7�����8�ɾ������"Ϧ�� ���w�fB'څn�Ih驨��
AsR��sθ`�В0�w-�"{�
B���Il�
فgqLf��H�U��������ڋ�L�H�1
��E��OC3�r���������%p�H���b�WF�x��b�-���1��c��䋁YY�O|`v!\֐�9��,��
s�
 󏙅�dW����H�g�T��8�G�Ș���.�e.fiv?X�H��a��s�W@�f{Wj��s&���	kכ�:����?���폗��V̮�$t���O&hµ�l��/������'�CC�Z��V�ib�
���Դ���z�>���3�
Y��V쒦��\0�f?��Vj��9��[u���𛟶(��D
�S��K�:R3q� Y��g����s1Z1#/�yDh�#&42&L�z�t���db�A�9��
@6L��'�
FQ1�w
�C��r!k�ĐCIZ9��x���%]r�Ҕ*ˢd0(pR��f�*k{��w��t3ڥjD
� ��d��5�/ɩ9��G����]ͣ�avbd�M������v�?��oŬ�o�d|\�C��'}䤗�K�4��~��g0��n}(�mkpBC���))�*/F�8fI�g�!j�v0��
��lޫ
�y���Ƞ�<�Ο���q�]���헆�Hcۘ�4�V�қ�1.^z~F����)=Mo��t�se1
xN]���s��<��X��R�z���B��Gzk
���	��/R;C�5�:��®	x�oҠ�Ђ
pƁ�
�gG
�FB�_�B�(�;�X��=ռ�E��_�����aD
�
�
�
��s�
��(8�p�7qY��Y}��)୩��3f� !�QT>|�c�'_{.��R6��R�K$&��$v2`GG���c+�	`p�9����s�lx��[���.�zs'�qK���,��	��t�0@5
����L��C2��sXh��
�����<�?�
�f�=c�&����M@�ͣ?��g�,w�/�M����f��?�l)�,��
�""���O���ZH
	aH7B�2%�����+���,r?=!j~:V����L�o�Bl���g��p�
�*h^���T|*�,�@�
p��S
� '������Y���u�տu��s�˖Gz����t}u����v%:g�@iuu:
��vq at eC��^�
+�l鹟CUK�uϖ���1���4��ǚy���X16��F�W�endstream
+endobj
+9600 0 obj <<
+/Type /Page
+/Contents 9601 0 R
+/Resources 9599 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9554 0 R
+/Annots [ 9605 0 R 9606 0 R 9608 0 R 9609 0 R ]
+>> endobj
+9605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 288.9431 138.5077 299.8222]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000039) >>
+>> endobj
+9606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 268.8535 314.5657 299.8222]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+9608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 197.2718 212.1242 208.1757]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+9609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9602 0 obj <<
+/D [9600 0 R /XYZ 90 757.9346 null]
+>> endobj
+9317 0 obj <<
+/D [9600 0 R /XYZ 90 682.2655 null]
+>> endobj
+9603 0 obj <<
+/D [9600 0 R /XYZ 90 667.7188 null]
+>> endobj
+1258 0 obj <<
+/D [9600 0 R /XYZ 90 521.641 null]
+>> endobj
+9604 0 obj <<
+/D [9600 0 R /XYZ 90 507.0944 null]
+>> endobj
+9318 0 obj <<
+/D [9600 0 R /XYZ 90 260.0186 null]
+>> endobj
+9607 0 obj <<
+/D [9600 0 R /XYZ 90 245.472 null]
+>> endobj
+9319 0 obj <<
+/D [9600 0 R /XYZ 90 89.4414 null]
+>> endobj
+9599 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9612 0 obj <<
+/Length 2434      
+/Filter /FlateDecode
+>>
+stream
+x��Z�����?�6Ps�~,�}$E���n�/�����]���H�������,Y��m|�	ؓ��p83�̓$
����
+��d��“{�����}�%������RL
2����� 	���������lN0��73��I�MofO���C�*��߳�2)_nn�p��UZ{��約�هۯ��$�3eq!g���#��C0��pO��]�
ሐ��'y�y�T�lN���
����&�S7�6]���i�/a�!�LI����V�^ςIb�����x�}}�3ZL��#b
�l�8e�es����-���A�\��s�E�R���C�x��a}C�i���|D�
+)��'�_vi�lA-R��)<*&�l�� 58�'�
E��
/�^T lؘwu���h�A�L15�Ã�
]Z���77���ȫ�L���ַX�fȽ~c�/)��n�V�w����lTWLЫP�C��t�៮"�h��aq09�D=�iJ���g��}p��ێ
�H`�9QHRp�f3��c��~��N��p�*�FL�a�k����O彧y�q��~��A��=y�|�8��Xê̾Ř.�:+�C�`��ar ���
D'䠔 j���Q��
+遳QCEk�"��h\�~Ȫ�-(<�m����i�L�]���
ٛ��[�ٚ��]���V�6�+�T��b��na�9��N�LD�
as���̞�
+v
+��3���{ ��>��{���m`U��7`QC��$g�jeȐV���k4�	��-��pBI�kѼK5Dm@^�x	���{�� l
�v3�I�"e9��R%�C
c��laz�ޱ<���j(F;�ȁ������u����u��6��}�6�t�I{�9j^�3���ۥ1/��w�4����2�Y81ml������%�bT���B�ӧd��Iy�:���H�
dT#-�P����
I�=an�bF��1��f1���nJ�x<QV�9[�g� �
�
���W�T�~�����:������X�ҟ�ݐ����!$$Q4E���Z�Sh����/@q�
���G!�`��<�
���	HX���R����Ё"iϜH�4�ܦn������ܼX�ʋ�k�by*/&�&��Tf��s^jL�Scݦ� �mi�p�4E~���͈�ZNF�u��n�x���J?~����OfBn�J�?6��FR'�����&
�}o�6��PV���B�$_�t*�VR�-�c"`��
��~1G�Qگ}���1ަ���&�ر�. �
�{q�{��<׎����Ѭ��;HQ�@��
+f0�B��^	q�4�y��h�'�K��}�m
�0[��^b�@��cE�H��p�*�PU
�10��P�A���>i3�}�O��T�c�b��}
+�'R�����"��� ���fy��~H/��T�b�q��FXk�+�v���w(�)*(���
���|���
q�k�\G�('�o.�*B���W
��
�(�u+�Ie�>US��[
�jt��1$�*z@�D�G���B�?+b�>��W�ǫ�.��j�I��\�y�֏��F�����������2�%��M�FL�)
P%�
�V�E�y��[�4�2+N뗙ǻe
c��Ld��6G iw
����!�C[��"P�U�%ݹ3�%��a#�)$`7L���`6�6b��
7YgّnWk�@f�|���ԖaJ<�;wԧ&?���
+g��
l�O�_A��6Q҃�>ѿvi��EY
��f��|�
�-Չ
�
mPXF���C�OrHvvb��֝׋��<���_^3@(�
�G�A�RG�A�����)�M�ܜ֜�{���Ӫn�ڌ6R>�?�
`�y�ە��l�цI:M����5���
��_]S��C���oŶ9������i)� ֠�5hQ�u�L6��am��u�f�F".�c�e��TB&N�pu8�_�IQ��x &��g��&	�)�G -��v2����@��HO��>z�$6�'^��:��<<�띣ģ22�9��Feq���^ۭQ?�n�91Y�:&W�=[�,
+���'�X_26CP�6�vNh��4j�y0���H�7j�:�8�e�~�XHU��)���X
�c�<Unx�y�>Ro
r�soS�;()��ɕ�v�x#�v �{0����N�:!5��@=��w�ʐ�]}�j;&��
oo�t=��]b@��o\���u�]9��� ��	��y����~,�t [...]
Ul�z�h KO�
�<i�lteY�SԶ([��AW,
��]a��#,���endstream
+endobj
+9611 0 obj <<
+/Type /Page
+/Contents 9612 0 R
+/Resources 9610 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9625 0 R
+/Annots [ 9615 0 R 9616 0 R 9619 0 R 9620 0 R 9623 0 R 9624 0 R ]
+>> endobj
+9615 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 690.3327 216.2973 701.2366]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+9616 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 589.8776 483.2121 620.8463]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 317.3899 138.5077 328.269]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000040) >>
+>> endobj
+9620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 297.3003 314.5657 328.269]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+9623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2748 98.2435 293.9708 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >>
+>> endobj
+9624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9613 0 obj <<
+/D [9611 0 R /XYZ 90 757.9346 null]
+>> endobj
+9614 0 obj <<
+/D [9611 0 R /XYZ 90 733.028 null]
+>> endobj
+9320 0 obj <<
+/D [9611 0 R /XYZ 90 570.2058 null]
+>> endobj
+9617 0 obj <<
+/D [9611 0 R /XYZ 90 555.708 null]
+>> endobj
+1259 0 obj <<
+/D [9611 0 R /XYZ 168.9029 480.2346 null]
+>> endobj
+9618 0 obj <<
+/D [9611 0 R /XYZ 90 465.6372 null]
+>> endobj
+9377 0 obj <<
+/D [9611 0 R /XYZ 90 288.7368 null]
+>> endobj
+9621 0 obj <<
+/D [9611 0 R /XYZ 90 274.239 null]
+>> endobj
+9378 0 obj <<
+/D [9611 0 R /XYZ 90 160.9415 null]
+>> endobj
+9622 0 obj <<
+/D [9611 0 R /XYZ 90 146.4437 null]
+>> endobj
+9610 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9628 0 obj <<
+/Length 2637      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo����_�O���}Q�m�HR�z����`�$�"*Q*E�q~}gI.�K.)��m�p8X"�;�ٙg�-�a�GfϔP�0.g������^��v�_�/7W��I13�H*g7w�
+� A	�ݬ��	A
/�1��Y<O�]z�fA�|�}�d�2��1�X���r�\΋�U��}�)+���������)��".�㬮?4"�=#�
o%޼��B8"ĭ�k|�M��EB��,
�g��6������.+Dϳb�bΔ��^}{�9���`�X7����<[����ˆ-fO�#b
��8e������߻u������J6KA�
+��a��,��b��Ym�L���H�kg|��*;T��8.��H0E�Q:�u�Ft�C+�
+�B!E�8�j�8V��2/
��m��M���]VT��FR�GbF��qRCc��3$|��ٔ��b�h&��]S����st�Ƕq�+o6���6���	L�
�܅fZ�#�P�,1N�sd� F:Mi�5�W��~��N�b��
�*���o���lD�9x����eg	�md�!��7B4 �?�"	�0~���Q!�	:CL��Q�T�0'S�b@ aõv�|>dE����Z�QA�Gq6

	��F���>_�+�:�QHRæ�η&�F�\^�n7���Z�,1�ezJ��6ߥ�騄�����2Om\ԫ�r�#-�s�cZ��f�:��/.�|pRY-j�c^diy��O�U�6���i��3̴�e���F��$<���>�_r�j�Ve�W�岶�Q��PsB%��&��uV�wy�V��%6Uwo��H�j��nۭ�wyc�����XI�M�/�T�-�4%�z�[���>$DI$
�i����c��3��}��`A9� ���|��B�5��w�
�]K!g���I��Vy�ʼ�!��'�C��[C��&)��o2�ge
+a�{6���:c,4����c��@MP�����5�@�ٛ���
�UU����K���o�<Z�T@��Ch �V� �B��6���)
+��E��ق�9�AЩ
�*��f����爕F�ʨ�Z)�P��L$�J�T�B��H	�
��A��5!$
+��Η�鄂͠�4ţ)^P
+(Gc}
�0�ב�%��"POm
����I
Ն�
u�@�
��l�v>�����A��i��6�%'
���
��%i�����q۔o)”c=�)�:1?�C�:_L�uRC��g���z;�О�u�_�^��	���
q�k�ؔלX$o�ZU
ubZ����@�4���y�
���� �5}K��su��r�&��j��������>��m3F�k
e
*�$\�Rp�A
+|t!%Q��1�"
�اQ�I��(���8
��)(��(h�@h	�/�I�����?g�>����B`���Ph5LװvE��w y�u�O����>�e����b�̶��fa���
�Nw9�s�+��>�6�Rװ�+����.�#�"I��+x�!C0���>�v	R�NM�eH���?!������-��\��!��%<
��#�V�����D�&EB����Z���S�toHu	��V��1��m�{
+n���\����=#�I�/�c~��6r��3�dƠQPD�侕O�b便n����C�������]}���XC�F�
Z3��|^%�\�>q
�
��
�\��I��1|B��+�|8���|�J_�&�g��4eg:f_j�cf[Z�u�R�3`�k
X�;�s��O�6N����ψ@Dk}���bS�ubg	��ގ���	~���@�m�ڑi��b^��.%���;�?P'����4������I������i�4�bzQ==F⢕�4n?���[g��%_��b�+"��
��e��}V@���?g J�_�g�{(YP��yvߵ���c��9������6����Tu�������i
=�
+Wo��-F���W��⡫����/
"��=@�����`R`~�I��`R��cd���I�rdR`3��W@,	͒!ޤ�Vꎥ��(d
+(�R�W�T��[��q��s٬:4�s
��P���&ä;�7:�����a�0\���aCcQ�g�
o2�o(���Ʋgh�x����}�2hd(�o`��Bȹ��wiA]�X#�
�CD4�cU iQOxNbhA��_7��[��d�4����J�qh�%� �B�3梳��Vc?��tK&����|O����-Iu�5�*2���[ZAJ0ę-��]��C�����&+cuچ��T�ʐ�`�LV���xIQMk����@{����fOI)a�
{�L���
��&$��8!�pB5{��$�~���툓'unt2���I_g|p����6�k�؍m���ףS�
�)Jh](�O`8cY�k=�	�:�0��
R�:��	
���'ipq��f*����!vv���A���>�xy}�_j{|88�q.ψ�
��a�m�ۯ��n���v��Ǭ��B�y
%K�7���ͣ]
+2����eFU3�H��l8��
+P0.�Rs��3��oN�
H�'P�I]�⛪:,�������
��P���>
�׃*�!��WM�^�	
l	��!ȥ�:�����ݾl�#/�⮎�\�IDĔ����endstream
+endobj
+9627 0 obj <<
+/Type /Page
+/Contents 9628 0 R
+/Resources 9626 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9625 0 R
+/Annots [ 9631 0 R 9633 0 R 9635 0 R 9636 0 R ]
+>> endobj
+9631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.2694 608.31 238.0203 619.2139]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+9633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.0888 382.5627 246.7668 393.4666]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+9635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.8986 155.5367 431.9768 168.4545]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9629 0 obj <<
+/D [9627 0 R /XYZ 90 757.9346 null]
+>> endobj
+9379 0 obj <<
+/D [9627 0 R /XYZ 90 682.8981 null]
+>> endobj
+9630 0 obj <<
+/D [9627 0 R /XYZ 90 668.4653 null]
+>> endobj
+9380 0 obj <<
+/D [9627 0 R /XYZ 90 457.1508 null]
+>> endobj
+9632 0 obj <<
+/D [9627 0 R /XYZ 90 442.718 null]
+>> endobj
+9381 0 obj <<
+/D [9627 0 R /XYZ 90 231.4035 null]
+>> endobj
+9634 0 obj <<
+/D [9627 0 R /XYZ 90 216.9707 null]
+>> endobj
+9626 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9639 0 obj <<
+/Length 2695      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo����_�O=	�������\��p/�~�cQQ�R)ڎ��w���v��&.��A���;�����#�	�db�D	�
�rr��“x��+⿞���P�O���菱d$��ŪYA$(����ݔ��lN0����Ӭ�fw�3�����:_V�ݏŇ*�^nn�㢬y�e�+�yf�?\OH��2���
+���~�D"{F��%n�&V!
Ү���5��d��lN�.f�N��~�չ{�S�ʫ�Ӽ��G�1eJ�E��,:Gz?
&�u�?�޽Ǔ%���+���b�
7c�d{�)ko6Wo��֭�h^H
��K�'sƑ��zJ�`����2������A!E��tb�
��}��
���$\p����4��02<�]�����m^e��r��������a]��uV.�աX���Ռ��/��?�gDLaW��P���
6���?`d̩p��9���[��n[�ͮ��%
8��Vj�>���Bd����";�ֻ��n%�w��r޵W�w�ػ��/X�ݾ��l��k�����?��5j���MS ��������'�8�<�C%����3�@�h5�
\�
K����R�ʧ
˜�Z� m���7��fc���q�R>O+��ԉY3���(g
O��M���*�۾QF�/	�H'54&�.��
�#c�jg�N�C[(V����1!����|��+N�hqp�����"S�'�(�
�տ-f�}(8Qm��
�F�FMB#��+:�x��2��d�5�zVY�;���M��zJ�\�Q_����>���~�=������om~ʒ{'H3
8�.V�jw����>���:;��U�W� ������"��A��R�1����S�\��S�
�8�t" &�}��_U^槰Y����aR
�mP�ݭ�S���%M>GF��٥�VB
��]�J�)�g�
+��DZ��P�|sx�&�ȴM�0o�~�t]��m�
+Y�DT�����n�8mn,��֗p�B�#E
P���u�؆Pj8$1��P]�nӡ~��e��ȗZ����K����H��
O��튥_��3 at .l�^�I�P%/A��*Ϸ���&���C^R���ЀV��
\.�ك�
��E�YUd��5
�]N����~劷� �x�߂C%x�"��mD����3B�-
% F������k���2Ϫ�7��
�qu�4æ��K�ߤ6���F
Z��
*	?Z" ¿��{�
h�wu���榱��N)	�B"�0?�}#
�
aM�~��D=�&#�����
+gٮ��a[h�
���넁Td+�'JZ/�+�
��}��̡f"�t��
+I���l
J(>��i�K4�.w�=�8����0�	�N)`a��.�0EZP�
+�+2�aj���>���{�����^+aR™�i
(����0��:�y�°�
׵��Y��p���W�P �.��?{��q:�DĦg��L�i[wl_�u^��#�E �%~V�)����Ǝ�G94#RM���
+��a��;�C
�ɧFoC �1�"	�E����LS
�v�y�d���N/��%�
+4�&��4�09tme � ��
+���V��ΫT�f���9y--pp]�iƑH�
+�  �^�*��:
�՜�8 �8zb��p��?C��㧀��
���(5@��#hʀ�t`Iz�Ă

�D
+�i"/5T�C��N��v4�&_��@�-�x#�#E�(�
�u�3�0�rۯ�9�Pl���X
��f��1(
�[���
g �hO�b,�F|!����"�E+v��
�ۑ��iR2���'%9LqB��$�1�z�K�Q�
!�ם�#C��wt$ӶM��v�~J��
�4���Ȕ�PX���N����Q�
�ȁ1i:22�+
���#�W:�
�#�Ԉ��ȣ��.!"C�)rL_GBB."��K�����o�_I�/����
7�}�L��M3y�W)ΎrhE�������
�(;B����[(b.�&Uoy�%W����{���Fm��6j2�k�Uz���5����2���'�;��	�z�V�*��Z�1�˃R<�2�^
77���!P��#�
�g���
����H�ϑw��<|!A�
�
�w֢�P�~���P�1����>{�J
͋�;��g=�6��
R�
E�9��&N�wA��`�Q,��t
�8�Ž�1�5,ˀq9ƀ)��Y
�$��Q�:�sa��XL1:��R�g
+:��t��2`d�X��:��-D���%���I
�����T"Dj/��>�|�ز��
�H�9�K]@m��혭��4���D^�@�R!�7�b#~�Ă>�Z�;;����
����X��h��Io��O�P�t�@�Ky1�R>vn}+N�[+�i�ǨG�����4�
��i
)�[`~���n�T�*t؀A�YkR�m��ڟ�;��C׽M#�
9��u��͍����2���Q��Rȗ�r�<:��u%m��q
φ�P"��L Џ�t����R����1��L�!=KA���7��@�E�dž~u��O>c���17�
!X2Y1�%R���;��牢�b"n3���hDT�om�ӻ�m�ww�gxw��!���	1���kV>f
ک��.Щ�����S���9��6�
�M# �F^r��c�^����y�+��O΃u���u����~~~F��X�
+��~��
L#C;�y'4�%r?���q�#[V��?�]口(�ᶉ)�b���
�:�\endstream
+endobj
+9638 0 obj <<
+/Type /Page
+/Contents 9639 0 R
+/Resources 9637 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9625 0 R
+/Annots [ 9641 0 R 9643 0 R 9644 0 R 9646 0 R 9647 0 R 9648 0 R ]
+>> endobj
+9641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 634.831 513.9963 645.7349]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.6167 539.1838 476.6033 550.8229]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 365.2869 513.9963 376.1908]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.631 269.6397 429.2969 282.119]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.549 124.5432 195.1053 135.4472]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9640 0 obj <<
+/D [9638 0 R /XYZ 90 757.9346 null]
+>> endobj
+9382 0 obj <<
+/D [9638 0 R /XYZ 90 613.9095 null]
+>> endobj
+9642 0 obj <<
+/D [9638 0 R /XYZ 90 599.3392 null]
+>> endobj
+9383 0 obj <<
+/D [9638 0 R /XYZ 90 344.3653 null]
+>> endobj
+9645 0 obj <<
+/D [9638 0 R /XYZ 90 329.795 null]
+>> endobj
+9384 0 obj <<
+/D [9638 0 R /XYZ 90 115.5769 null]
+>> endobj
+9637 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9651 0 obj <<
+/Length 2983      
+/Filter /FlateDecode
+>>
+stream
+x��[[o�~ϯ�Sk+��Kz��l��-0�I�2;4���eWV����
J�LJ���x��P�E��x>
��g�,0����
%2�����
/��뿝w;��Y(��˳��Xd$����vI���..o�/	A
�2�1^�]���M~�vE�r�~�/n�����c�����e�����G���X}����;Be�QąT ���c'�!Qf��x�.�
+��Ɵ����:��Wxy�2tYlv�)�o~*n�zE���+F�X2e�go.{C:;
&�5��������g1���	>`D������X��;�G�Nw�} u\����eK����
Z��76�6�)�g����Z;��yWT��"�J��K���Yp$�
�����my�V<�{Q��as��I�(�`Q��Zdpa� �[k�����⮨�:_��7W���Ӫ��u�Un�;�^�.�_o�}c?��eU��՛_��~_n�N�w�N��-�s��Ӻ�ߧvI����Y�GIptp
+X������v�XZK���X�7�ũ�ѧ�ջ
��"c#���_�V&�iC0�MÐ!�;b��%CT�d���	�
M�w��e� :A��;!a�)\)$)��}�/ ���e��
�!
Pi���&�-��r��O%��
��N���CYno $G\aq*�o����P�]q�t��-�a�dL ��^H
�aW������d�^>
hS^�k����[�(�]Q����Z;��̀���A.�Bcp:�+��F����+�t�K�#�
L�e�4��,NeU$��A
��T��NX���!j͑
!X��������}Q���0��"΁�xu���>KWm;'���
�O�.��Pu�7�‡�ϩ f��H"-�N>"��4<r
��@����'�#�BY(5.�PF!�`�6�eW�]1�r�@y��'�"�(I��H�4I0� ��
�B�
��6J�ᅲ����r�
}B������m����rg�/o��A�Z'X�����?L��L��d�؜ɼX�V�f�d��k�Rc̓�:�|9$Ӷ�B&��"��E/T�H-%����^j�v�>�W�ڃ!ʻ�W��d�
��P�fC?��}!A�s�"��u��G7�)�s�6D1qn^���77e��x�u����aST���H�Qc�"��L�5`�$����}����d���e	u)ռp
+v�'�h?Y��c�)� �+�*�f�q]t��'Qp�F�^:������m�Z#I���˴�˔�lwJ�8����P]׮$��R�]{>Έ0$p=aF�qz�����Tn
��N�Wo�P8��QE��b$#'vR��v�Q�~�}+����6ݐ@4��o�=Q��YS���t�G�y'#�^�A�� =�>� �� b�*@�Q =�Y@��������	�7�	l���_����2�Yh<�A����Ǽ��{�<!\���U31i�[�I���	��W�}r��a[��QřK(��L�4ʈ��"�
+<��ޭ
�A1�d� J2��v[��.��]5u^6����U�=��R� ������vSVy�M�?� J�

��',�۲��
+�qs��>Bo��$5����
x���r�߀�b(?I�Q��к��zzC�4�!�ͣ���
� �@h�
k��A��y�C�(�#����1\Ղsi��2hx�$�
��V�p�kx�.0
�ibbhr-g�]v��z������z�	�KAi����8�a�< ��9
�Xi�"�
�Nm3D�f��%�p��.{�L��E<���ȲN��wL��
�9'�I�����|\	8�:E1$`�f�m�!7�}�ڬ�b���2�asv�ATq�Ri�5��W���-B�{B�S��Я��K���A���Eq�-�e/8��ɑi�R���c(5=9r
�D���̎#
�ٱ
:�x�wv���X�x�V)V����6������aw=���1	�s�4e¤˫c�I(6g>/6��i	�?VG4;���؀m�h+�
X��_�=J�*il�u7��~[`��
0�bŎ�4���4}�j��u^���
X�=�L���V}��NnQ���
�h 6gQ/��d#�R4�*>��K���V���tbb��U!���f[�]-|�#l��h�c�
�'Zj�~��^
����ޏa�����Et�L�Nۼ��_,�vrp�Z���$���m���M�������d�����J�W�Pj��P]�����dJ����P�ݯ�<~r�"~r&�OF`B~��Sx�-�*�3�o���H�4H�~h�t�]��ԴW֝'	��i�n4��M�-������}�X�&h}uj���$H�~����칯���"e�2�_�_7���u��v�2���,�2nҒ��:��AҮ�1�5Wm������C8}
H����L�`P�GLb_~�,�)sH2�ӶkHR����}�w�>�
��^F�)�O^/�5e���Z�^/Rl �6B:��ۓ��m��א��d �͓��3����b=��������  [...]
�B��,�ѷ��|>�z�i�n���t8�A}�P�#J�I��Ŝ���]C��ܨ/�	ڗ`��)�Hu
+N�-��k&8A��)��N��C�
�1��q�'h��yR�}aL�FIAhO�T
�q"R0\r�$�fA��)h�=��7�B��q;s����7�R fF����֋
�g��GjӴ`���҂�#�c/�R3��R/�g�zJp�5��Z�G������KKljȦ�U�:��/�t
T`� � "S����l�>����&���?�E���K7�=�
<�c��G�De?
+T
V���vZ��]1j���"�������_�p�l�@<�%�0׍ֵ�o��������ޣ���ըl�w�����b�S����e��Kd~�"��[����
+�ܴQ9J��[ic(�(�{endstream
+endobj
+9650 0 obj <<
+/Type /Page
+/Contents 9651 0 R
+/Resources 9649 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9625 0 R
+/Annots [ 9654 0 R 9655 0 R 9657 0 R 9659 0 R 9660 0 R ]
+>> endobj
+9654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [334.8835 678.3775 440.2823 690.8568]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+9655 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.549 533.2811 195.1053 544.185]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9657 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 436.3552 422.9245 451.0706]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+9659 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 164.6735 425.662 179.3889]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+9660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9652 0 obj <<
+/D [9650 0 R /XYZ 90 757.9346 null]
+>> endobj
+9653 0 obj <<
+/D [9650 0 R /XYZ 90 733.028 null]
+>> endobj
+9385 0 obj <<
+/D [9650 0 R /XYZ 90 524.3147 null]
+>> endobj
+9656 0 obj <<
+/D [9650 0 R /XYZ 90 509.7444 null]
+>> endobj
+9386 0 obj <<
+/D [9650 0 R /XYZ 90 252.633 null]
+>> endobj
+9658 0 obj <<
+/D [9650 0 R /XYZ 90 238.0627 null]
+>> endobj
+9649 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9663 0 obj <<
+/Length 3182      
+/Filter /FlateDecode
+>>
+stream
+x��Z�s��_��T�9���ᦙI:I�4�^w:�덇�h��D�$u>���.P�HI��i_:~�.���- 6���f�Ό2�	�g���=���Xx����!�7W���j��\�n�;���ݬ��#�.��R:�`t�����͂�y�y~��uv�mqWg����.ʶ��@��<�5
,��|��+��q��Tڀp8ק�$��Q
����\�$�E
�]���M�4�%Wt~�p|�ow�������}^/����
+�Sj.,E�W_��
zVB3T㿮޾��5���+J��j��0��l{%����������S�(�6v��X
�OQ1ʉ��i� T+ٛ֙D
�&Ԭ'Cu��n���x�L��ֳ!��ԑj<�≉4ڸt�Ǡ�r��묭j�X���m|������ڗ�|�O�����?(�e �L�a=y�U��Ѳ���̀2W�F�א�F#.k��ն(��
O���T�
�G���V�"
�"��Ӫ`
Ԣ��n�~1
��l
�}����6��)��Y������`��"1�O��
ĩvKT	��"Z�
+!�8�|�i�8��vQ� �Q�~�h��u~�e��&�z�d�}���%Ǻ��Pf�LKG�VfR��h9�gI��xi���v��a��p
��I���������v��
�h���uQ.$�%��۬j<�Y0�5�S��I��SA��߉07��w�r�L͋������
}?
+��i@��:h�Ƴ�w�t�НON�$1�Ə7��w4	�
d[O��
��#�&XrG�6��O�d�J�,���C�Z��;���q
�Y������
0��gu��u��1�,JH��-�6�]�Ɠ�dB�m��}6�fN	89�U�������ձ8}
��AM��M���*�T"�c4.�L 0�$P�!HN�2 � �`�F
1'�)���
�6:P����l
���L�
?�P��$�����*�b
8�8��1�8���L��������vJY����-8�m��vM~
��x��K_�O���bN(S���K?�G��C�{��!1��0�L+�
�"��E�)���DD,9��1�`��һ��bC��DLJ	8���R=���ۗ��
1[��
"�Qy�FA
+9���Օ7|U?�����_?�(t#�
�l���cA��C�pǂ
�ٞ���Ӗ�<��.o�򼜰
"-��
�ˤ�IJ�:���H�5a����a�ŕ
hn��^7l$?X_
+_C`��k3���{���>�m�ˊ���3,I	��p	Y삇D���	�
��9�&
�CrK�9v�HuA�J����EJ��
���E��\�~��� �wj_$��O���0�G�J�4O�BQ�I.��I�w\��y9s]$B�.uZ���K����� ���3�}�X�O>1�z�}��1
+x[3���#���
+�>��HlhguR����P�,
��j_7vV���7Ͼ���ͷ~��'�N�
X��)2G�6)������X5��w��#ˮ���~)����<���ջ�|��M_���\��-ᱪ�X��_B
�M
�r��S����}�U���h��/rl9g����W'L��)�����T�v�""�u����u��1T;v\SY �tT�t�4�������OM-�*��T�������g�\��l�#��W��j�(QL�����w2\��S�t�8(
�x��&���W�犳����<��9���,O
'
��w�O/��T��a~(�y�)bb��,�G�y�;��Oԝ��m�<�?�(A��|��0�/�j������?�q�6���ٮA�:4��&
�3�~0b���
+��V�[P�+v��^���� �ƞ�0U ���x�����R)�}����
�2mc��fn�u�
 l%����

�����]��$� d

�
�vH��!��y#�JueDz�n����at�քAU�0f�gO�
�O��)O��
%/�/�}L��J��څ���Aw�L�<n��yѠ�%F����M�>p�{ЗX�DK
�[���
��|�o�-���z�LC�)�R(��:�@��IC�蔏H��`=)[e��(�M�>�7���fr�]?��Dr�� AS�4xS�?�B�p��gHu��[lM�	���zPb[H���8s 4�d� �'�$�
�5ڞ_}O5�4�2�$c���~
�v<<ĺl��
+g��
G�f@���i��Z���yw�X���.�l�b3����^$�&X��i2w�h���O��dg�ٓ
"-5'������19�nx�����)��Ai{��;ȍ���ܿ�7��#�b��'��~�!x	 o�������=��~O�����a�(̪��ܣH��(Mdͮ
+g�RЁ�R0���j���f!���C�
8��o�3n
<,߼���A�x#��,�[��Z�r[���f
��]�{X�a5𕃓��?gu)
��yN
&
@Cn���p�0
��O��Uy}��q�Q��
�y�z�@im��/��*��G��)���[/��AF
� 
�N��� W�	Y!�՟E�	Y��UB\
+�ٹ��d��*���+U�Tc�����։ �
+�� I��o�C���u78�w���`�^��u�<���
+@��>λ�I&��;J�6� V�]�;<��=���v(G�Y]�fu�
��V'K�t�D���� B���t��tbu����w
�8u���|�(Z͛j�v�<Z
f���{��X��_�Fq���wK�t�k��!Y��g����Y��~���:�!��Z�^+��p�fHu]1
�ω��Z35���
I1
�=�ϻZsV#��5#a���$�
��
�i��%'BS��'��N�̙V��-��K(�pZ ��c��$*,��E��3�F�ΛU]���푴�8�.{��Z�U_�]�q7��#�u���m�
�p�_?���o���5���'Ɏ0�L��$�
S�Q��L�S�&�J
@
��k��/	0�����ߩ�/�QB5����.�=�6�7:�{DJ��
�2��/��]�� 
>dE����~(Drm���� ��1�S���&��PP���r�[��
��p�
+D��:��'���aa
�
(7������?
������
+���G|q�m��~���鉬�/�]M���n�y},���8}��-{��,��%�
m�Md鏜�U�cE	�ۀ&���,?!� ��endstream
+endobj
+9662 0 obj <<
+/Type /Page
+/Contents 9663 0 R
+/Resources 9661 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9625 0 R
+/Annots [ 9666 0 R 9667 0 R 9670 0 R 9671 0 R 9672 0 R 9673 0 R ]
+>> endobj
+9666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 562.7206 322.4458 573.6245]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+9667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [285.409 545.0962 332.4249 556.0001]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+9670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.1867 368.0579 399.2213 378.9618]
+/Subtype /Link
+/A << /S /GoTo /D (main_pps_bgp99_extrapolation) >>
+>> endobj
+9671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [292.2198 135.5986 330.1872 146.5025]
+/Subtype /Link
+/A << /S /GoTo /D (main_BGP99) >>
+>> endobj
+9672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.5619 135.5986 391.0586 146.5025]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHZ03b) >>
+>> endobj
+9673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9664 0 obj <<
+/D [9662 0 R /XYZ 90 757.9346 null]
+>> endobj
+9429 0 obj <<
+/D [9662 0 R /XYZ 90 625.491 null]
+>> endobj
+9665 0 obj <<
+/D [9662 0 R /XYZ 90 610.9207 null]
+>> endobj
+9430 0 obj <<
+/D [9662 0 R /XYZ 111.7981 536.2941 null]
+>> endobj
+9668 0 obj <<
+/D [9662 0 R /XYZ 90 520.1897 null]
+>> endobj
+9431 0 obj <<
+/D [9662 0 R /XYZ 448.0737 444.9404 null]
+>> endobj
+9669 0 obj <<
+/D [9662 0 R /XYZ 90 428.2132 null]
+>> endobj
+9432 0 obj <<
+/D [9662 0 R /XYZ 395.6414 138.7517 null]
+>> endobj
+9661 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9676 0 obj <<
+/Length 3054      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��~���SJ���/nQ�Y$M���	��B�%�b*�*I���3
�!G�7q�<�!^g�9s.�9$Y`�#
�J(d����
+/���_�Hw{�WC�/n�^}%�� #�\�ܵ#H�%tq�}��8^��8y�$8I�C�~��8)�O�l[�����*������h��d�#�Y�n�}�!��(��
� ���ON$�C0���N�ͻ�(�#B��8��}Z��8�Y�d��>m2w�mv�UK�����%F�H�&vЫ/ozEvzL���\���[���W1���N0"����S�O�W��я�n�ĶK����
a)�i�C\u����M�
b���+��֝@�t̊� jQ�ƷBbd�rf/hM	?�ypL!���NE��Ϊ����� �vo�mV��}̔F��� �룵�2�Z�Ŋc�4հi�
F����cЍ&snC�d�D�m`!����
+�����a�~촷/��
��������{J�`A+��82
+l��
�tsq�L#N��Mc�gN¨PBi�M�)2���'���
*bXy�y����
�iAѤ�Q�vkڛ�����E��	��O�+��Q!�H!I���i��FEl��t�`mRd
+~ĘE`�k�-���u�ֻ�.s�VY��o�qy�~7����X�9\�l
����JNRC�b��z�Vu�ɼ
�^~5|���!�ɸl� ���n�0N�x�e�{�
���L�n��1ˊ��0�����'-�1s�`
��<EF�AT$�(Q�C
l%\�ϗ$9���!�8	C��C�i�`��K#�ȃ0����"�
9(�f[��o�ܯɖ
��.��

ho��7}�
+u#$"�+�&����I��Ʀ��"����aQK�B��Ԕ @�c��8�1b�� -6v���L�b�DL���S$� 
+	�X��b���
+
+�z~���t�p�!��I8��j��E��߱\R�3Qg
+6yKɋ��
��>�1/:J	cUik��i�dGdy$N��
A�!p
	@�D}x����hI'��<�}g�YѤ�>$GJH����/D��`�U������H|�N�2�3/vr��R �A�������	�H
+��9[;�R&}Ї3q
+G�=ȗ��m'�P[{�r^b��?�Gj0�(������-oa
��]U
�������
y,���S�+�T�NC�:a�mM��w��ݱ���v���ng��v����=>�ϊ���ں��
�'�e6:�/E���C�'�����P~��*�4 �4��=�<�
"'�Lj��go:�\��_+3&�'f���Jzg�TX����W>�b�g��s����r������*=��6t AH�>��<�f�\J
P��
!�a(u>1�="ɥ
�_��Ɏ�LR�M>��q_��,���^_�.
��|�N�����	(��ma{g5�KM��Ƃ�.8���*�������1EL�&�k�p+L.�/���I�~iK�}��s��9����]�Ml`���쬑q�
+j�Y͘Ԛ8u
�%�����ú�y;���d^c aT���,�ol�JYRV[��
��.�k��9V�ы�"k+|��������Ɖ���}W�
�S��fRm]
�
�X
�!��|�o�ط� .{���c����qlJq1#�
�䮬�=�B8�M�l�w�
e�$:��NAP�Y��a��c��
0T�y�&��I�\mF]w�ߦ��9��� P�Y��aKٰH��#�')�V��	`_��ʏ
�m�
+7
)�
.���jڸ�~����N��N�t��<�T�l���lPt1��٤h�����t�AJu�h��W���6
��om����l"��9k���~rua���:e5%�	�R/6�x/���ʌѨvr�f�M41|�9��%
��z1��+�Gd��@��������Y�U�C��br�EǑ0Č;�n��R�p���X<�E�8(��ea��V���b
+��;��`�;���S�E ޷'~��T����|FߓJ��A,���U}����}U�R�n�j궹o�1z��J�^�e���"
�(C����MO�]8�U/�J�T�ګm~�]_8m��4o���
�H����	}���W�"��dܶ{lؤ̑֠�ʤ�I] ��-B@���n�:�t�sG����Ǻ�J!��z�>��$�N�r����S��)���硺vZ�
��a�'Y�8�1(�@{��"���ͨ�����ĥ�F��v)����6�ɹͽ`?�ۅf���n�u_���d��}]�Vy
+Uk�~�{���B)� �WUM����U;��W�����i�R/�Q��A�y��V�����r}�6�k�VE�B�>[�SX
+WB�W�C���;U	�R��� `��� �w�z��]
 I�eC�Fz�)��cC(�'!��uB�ޠ�4��� ����,Չ_�3���~I�2���80f^
^���"��
+�/o�6M�	�o\���x���#�
��v�G�}���}�#��H͘?)���9
���s�?Fq���/k��j�� ���7H0a�T�m�
+���0X�}�m�$��m�{
M����.�,
+~#�p�}L�؆ηG���Mǽ�
*z�4z~�z�K 4G�� ��VGل@��0�C�y�9�&�����ۏ>�H����9
+G��=

oQ�\'�ߢx^��4N�Ѹ]~�˪6�_[[}G��D���Z�=�Ɖ6(ω~�.#`]Ԗf�"6������|1��}�K���6���`�����]j
�!M+� �*1��K�˩
Q	5�RB�3�}'o6�Ψ��g�C<�z�_�N�qʦc$�d:D�R��\�I(Sx�<
�7�1as�W?��	#�WYڴ�K��݄ݧY�7C8<O+
�P����/���?�2�b!X��b�H!�g��w�1��b����g�
DP ��j�|w꣼;�B�;�g�UX
+�t��i��O��{7W��A���UF�
s�GE�H?
�I�vZrw���G6ĺV�'����'�څ��x�����#���ȏʛW���Մ�`
�\���[�B,��9���$p��}Giu(�＀���W�b/�"P�
|��endstream
+endobj
+9675 0 obj <<
+/Type /Page
+/Contents 9676 0 R
+/Resources 9674 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9625 0 R
+/Annots [ 9679 0 R 9680 0 R 9681 0 R 9683 0 R 9685 0 R 9686 0 R 9688 0 R ]
+>> endobj
+9679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [271.268 678.3775 343.5464 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_pps_certificate_widening) >>
+>> endobj
+9680 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [428.986 468.6086 513.9963 479.5125]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >>
+>> endobj
+9681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [117.5067 457.6297 183.1398 467.5574]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >>
+>> endobj
+9683 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.5585 371.5227 345.8829 382.4266]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+9685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 258.3224 250.8953 287.3882]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9686 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 216.3033 483.2121 247.272]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9677 0 obj <<
+/D [9675 0 R /XYZ 90 757.9346 null]
+>> endobj
+9678 0 obj <<
+/D [9675 0 R /XYZ 90 733.028 null]
+>> endobj
+9433 0 obj <<
+/D [9675 0 R /XYZ 90 452.2485 null]
+>> endobj
+9682 0 obj <<
+/D [9675 0 R /XYZ 90 438.3235 null]
+>> endobj
+9434 0 obj <<
+/D [9675 0 R /XYZ 134.2138 362.7206 null]
+>> endobj
+9684 0 obj <<
+/D [9675 0 R /XYZ 90 346.6388 null]
+>> endobj
+9435 0 obj <<
+/D [9675 0 R /XYZ 90 199.8137 null]
+>> endobj
+9687 0 obj <<
+/D [9675 0 R /XYZ 90 185.8887 null]
+>> endobj
+9436 0 obj <<
+/D [9675 0 R /XYZ 90 89.4414 null]
+>> endobj
+9674 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9691 0 obj <<
+/Length 3081      
+/Filter /FlateDecode
+>>
+stream
+x��[K������)!+�h
��ƕ*DZ�8I�"m샢bA$V��h���}z0b�!����%��`���_��aD����
�%�,���/>��oo��y
�����y�R�FZP����8�8%tq�{�$ex�&���˼9�W+������b�䛿�����>.��T��Ƽ�T4�`����/	�	����
	�Y_Z�H�e:s��$��
�y�a�����tZ�)�˻����p��ma��.�fEԲ���ΗLQ��曻`Hgg�1f����;�؁�����i�Op�њ.7e�f�����{!�.N�5��
a���_�!N��Z����FLfل�%��R����XT�̢$I�"Ga�d������1����W*g#�-����c�m˺JE��+!���߆o]�")�k��b͸FDQ�
�AsNl�~�d!¨2�.�J8#����zjőYoo�qs:��b�+EuKB���.��9��]kn/ؼ#���R�R�C�r�Me���
^L��pL
��W��Do�j_V�;K�{�G�R-�/X�п.`��.��
�l���_۶n�}g){�o�u�+���=���R��ޙ
ua��b6�����T
�
e� C
 [...]
+�3��<�����\u��@�:���릀�<%8C03�H�_�R�L(o�m},�K��W�����c]E�+�NM���
�ӼG�a�P��s�8*Y <ѺO5n� e1crcU�����
df
�p;*��"�`�N���NJ��!L�z ��'��i�'L-?P�Ŏj��4��ޝ�*�CNM8��0����Mqܗ[����/�9�������y{dS��d!"���drjZ��

�
f�Xh0n�xx_4q�9�����vY������S>�}����,�X�N�o>n���6&�!%|�_#-��
+dF�S���-�U�����&o><B��#��B�LB�	Tce�&3$\G��=4�I�'��}��e��b=Y�L�P�ۆ]��oU�ÜK���
���D��}a���[�l��,�o_TڇM�4���IA
Ҵ�j�D��B�$V"��o��|ו��%�,flr�
��VE��2��.��@
+Ӭ=�w��m�xr��spy.��� �-
	dg���$aD�bq{u���Mhs0���P=7
x�u�[E"���v��?�7ӹ��(4��)�k88��2q�
y��Œ��������Ke�&� 0
�8�R鎴">�ۇ�Jw�^h��Z�Y�-\F��0�J�ET	�fC����2�-���!��
D2�3r�o�U\�T�0��-��B�[O��R�銹��x��4��t%XW�,z���C�z��!u+��I�1W�%�
+S�OI�0vx�5���t
) %.%�݋Fc5���#��A�f��R����:�i���Lj�"E:�2,`Ž�VwO5']A�1�/>=t`D�0\͎@�~��=%

s
c�O��y�LDF?��q*Dt�Q�$��	eL�I��q�Z�F�?ry�bh��О|�ƳW�� �ׂ�s��c)2W���
�zb�����нI�z�K��
rಹ�B�͛�=N!�
�(�Y�֛���3����f
�B9�f �
�[�
�CP�X���fQ�X�KS�a]�+�vGSV)=((��"�h=�E��
Q>�A�%+�����+�!9�1��k����T�gaf�8�����O�S#E��T ���.Cl��j�Clw�;,b
�q��Uߏzy�>3�+c=.v�~F�1_��+BH?
#UL���6I��S�4@������
f�ӧ�e �^��2�b�́e}��h�dsX�؀E�Ħ��H�
0F�X$�#�Qg/����x�³~�ܑ䭥)O�K at Y�ڲ�[GK-�ҧ0~pB��c���[\�QA�D3���.#��
+�끹���i���@�뀹I�����2i`.R��0����4�qD�
寞�%lơ�7����麬�����E���<��[��p�M��
�ĠB�awUWN��Wv
B��`3�S����_G���!��bL�ר�2ڟ
՜���4���J@���
z%��)�nj`��ٵ-
��!���V.�2�;img4�R��P���ʧ��b�.F$�$�j����|�
����T����t�SF��
+uvF�G1>;�$W0���"K���il(C���:0\��8t�L��3
+�>#�,,�
+�ll
�"d6�A+�F����&�)���͠o♼޼3+�b��Q�5+�]P�B]s��
B�~&QQ[qr�~�O�d��cyx<��ISv��.s�����g�g8*�F-���)

�8��6i�s�T��x+��

������'�
z(��J���((*0�q�_#K?���*�2Bm�e.���et���aؽVۿ�G�JI��.
��|ܩ3��7��-SP3����jo
���
�=n�7��}
L��O������<�
+���0�$`R��Lx���F�"\f
���s��^6eQyl�+���ua ;ws>ih��To�V5�>�a:3ϙc*=��ӱ����
�u��(��Wߥ�?���ӱpА�1�rWT�S�XAOذ鄞}�Iň��% fs�=�6���ƞ���K6��G,����no��/4X��_�D
vv��>` (E��������#߇ʧ}���f���"B3�CI~:�QTض�wh��1�D��ŏ��Wl��Uw�����;�C������}�E��F�C��p�
����*>�<|����DG� ��͕�b^��ze�P���[��[��ۛ���+Η�\˫G�1_��

���MA��
2;�N��(evLH��J�ן��/=hʿ��῿��<����m{�}����	mO�*�
*�����h��d/���:�t�̟a�$V�.��4ʡn
+a��R�^�P�?�-%�endstream
+endobj
+9690 0 obj <<
+/Type /Page
+/Contents 9691 0 R
+/Resources 9689 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9705 0 R
+/Annots [ 9694 0 R 9696 0 R 9697 0 R 9699 0 R 9700 0 R 9701 0 R 9704 0 R ]
+>> endobj
+9694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [124.4205 660.7532 272.5235 671.6571]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_787615432c9f1d6aac5a6394aea8cfa9) >>
+>> endobj
+9696 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 466.6525 300.1613 476.9338]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_25717d92bb71e83e73c686fb6f231efb) >>
+>> endobj
+9697 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 426.5522 182.1636 437.4561]
+/Subtype /Link
+/A << /S /GoTo /D (main_Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions) >>
+>> endobj
+9699 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 321.1527 241.6898 350.2185]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 247.7433 163.8226 258.6472]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9701 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 184.3552 513.9963 195.2592]
+/Subtype /Link
+/A << /S /GoTo /D (main_Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension) >>
+>> endobj
+9704 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9692 0 obj <<
+/D [9690 0 R /XYZ 90 757.9346 null]
+>> endobj
+9693 0 obj <<
+/D [9690 0 R /XYZ 90 733.028 null]
+>> endobj
+9437 0 obj <<
+/D [9690 0 R /XYZ 277.1063 663.9063 null]
+>> endobj
+9695 0 obj <<
+/D [9690 0 R /XYZ 90 647.1908 null]
+>> endobj
+9483 0 obj <<
+/D [9690 0 R /XYZ 400.6899 429.7053 null]
+>> endobj
+9698 0 obj <<
+/D [9690 0 R /XYZ 90 412.9897 null]
+>> endobj
+9702 0 obj <<
+/D [9690 0 R /XYZ 90 158.8376 null]
+>> endobj
+9484 0 obj <<
+/D [9690 0 R /XYZ 90 136.5259 null]
+>> endobj
+9703 0 obj <<
+/D [9690 0 R /XYZ 90 136.5259 null]
+>> endobj
+9689 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9709 0 obj <<
+/Length 3193      
+/Filter /FlateDecode
+>>
+stream
+x��[K���ϯ�)�T��x?&)��8�3�n��5ŕ��z��x��>
� A
+����/�=�6��~M,Y`�G/�P�0.��
^<��7��������ӷ7�?�ba��T.�n;� A	]��|�$q|�"���-�ˢ���/���O�.
����E����-W��)۞�>�Rְp��ۯ^NH$�2���
+6ge�Ց��C0�����M�
��㓋<>�Ms��/���,��]іn��r[ַD/���b�4�Lo��6(�׳`�X5�r���x�}u�3Z,^�#b
]�o8e�bw���߁���=�2�`*M�2HSF�TZ L��b
� "mYm�L-��H��B�I�}ق���I0E�Q��Y�
�m$P��Ĩ�=R��������L:��`Ò����\���TP&6X���}�-�Rm�CuxtW����%�i�z6+&S*
+��C��^u����<h�k����Sy �ܮ$������1��ϒq�0�3
�
��վj���w��{m<|�|X����O�R�\������v˭En�+N��
+�m�p��
��}><��݂1[����z���%ˍ���������`�����DIB:w��i�
��C�:y�_ڿt�'xIH��������
�&��WI��{q4� �1�m�s�5���D <�
�<��{EDz���{��	n<�R�R��\����A���Q���� �!ѯ�
���ũ����sn<��7T��蹭������rݢiJ��
+�X�|B������\HB&�
�%d��I:!��i��#�`���T�b'���d,6d䋆D��Q
+A�P��
Z��rZ�d����	������ΥN���1S�A)]x�x��n�7Pk"�
��ʖ�f�����Q5c�c5�Ƥ�9�s��Z`?h
{����ݝ��N�Z�l�����v�F"I0�Z�7�|6j�m�JY
v����F��tu�T���:�E�p*��[\����������Rys�.U#П�xy%w�1���2ǜ�fE
+�P<@K
+IʙO�b�U�$$@4��x�#�q���^��ɽt]6'�#}D
�l��X�#�Pi��=A�.�ƈ�:8�c�@�D�JI �A��`qؤ�@z�Te4�1�*zN
_�/]
f/���#}⒚�1�^�L]��5���(������
CDH�����
��� %�AIbT�+r�`H�&!��2�M-�����
~�;h��jjoՏ=ͷ1
����X����o���V΅����q
rܨ�A*���m
+�V��y�UL��pM�܂GB�@Br
�UP�??��3�!'�.�rq�
+�A��y�

+8�֧w	��ւ�;S�~�U�h�	.14�L�N�b�D�%�L�O�~)�-<EDd%�s��L�
C0���h[�M��
+��1�U3�|��3�m�6���7�t���g�V2� Gy�/)�q�(S󣻘 g4Ov�h9��Ѧrg�˭(��U5VF���ᩘ��TOeݾ�<��ݮ�k�?R��}y�WE�@�~���jS5?
C�l��X���}ª
cd�̕�9iU at CT5oՈ gUOv٪9��U�r�Uc���7K(+�8B�����->�@�?��FG��&g�Z��9j�,��쏰��楂

W*H�wL��Q~{��-�_moX��B�
��d"
p��dh^q�J�*Ŋ ��$��Īj-�Z�4#][��<A�	�)F	0
zL�AZP{$t2צ6ۥ'�&
	�d`^���
k��kR�f��@|�o84�	5cV_��Ǝ��`�i��s�!�R_�
��t�T� 5B�;�
X�o�+
�$F`��h6;�}�O at j�ɏ �y�R ����w<��y2�0eZ��P��5�
�Dž��
�����
�
����c���Sq	󲋘7+� i�^l�����M��8��|������Dz�����l� �X��:��_.1���Q2 jF�R ӂ2��� �-} ���88�y0mSl����M�b�m*���yJ��X��Rz5���`�@�biNpJGT$��@z$�
+
=���ѱl_mF�%�/П�_�]x�)�����8S#�i:ۭ��n=�]�ֳ�n�Ln����� g�4"��y�E9�y��F�I�������;$U.�5�ų��Yv�p|�r7��fo�[xH���\�����0�|��t�R*[�
�Ё?�nS�B�T�K�L���J5L	�
%2r]+���N
����W?���ny�C� ���[;���
{(Jⱅ[�c
��@+,uc
��VX����0��D�|�#�
�����OK�mQ�
p�q�1���A`6���Jy�o&�� 6%���$9�ྟ�n�?\zR:
��
+U�))����0j���
 (W٦X1����i�����)A9t��n�2~��Z
�1�5����4AC�1�2��#�\��d�tNb���rC�����f�~��uo�2I�@{K��>��
<<Й
$u9�J�@,l��";����-5��qW�����T���-��GOb�;(�E�<|�����9ε�8c
Y#��I�n�rE�����#�2=n+k
%-9o����Rz��r�v3g�Ϗn�`��������l��<���2���<�
+��NO驑�������l��hRR�
+.&������P!�У��9R:��)}�M��?~DC0��l&���z"0��W�ښʁ��\1%	��/�Q}�ܘ���,�J&L���I��$�
l&�@�J����IBv>��H��#��H�rdO��T���VJc�'�c[Ο�ˊ
N��ɝԺ��Y �@�M�F�R`�'j��}�Na���ݯ�ݷg���l���?S��C9�wmGB����_ o���֋�����y��j����ݱ;Oow��T����O�\�	�Ɗ���x�
*;��?篆�#Ɔ�d<3���`(��uI:�M��"��=��
�u�;�W>`}���u
f�u�<��������.����r�j��AB�?�c;˓B~�`�7[Y�Y��_BWh���6��� c?���ݨ7F���w񟦬�l�|���Y
����M�w�&d2�*'����
nzS�gG:�o d�%w������t�`=�1�+����b۞�^�~yyA�A�=ըj_�N��gqb?XR�r�[�����oOBl��^�Ǻ��c
&>����™��Db+� [...]
+endobj
+9708 0 obj <<
+/Type /Page
+/Contents 9709 0 R
+/Resources 9707 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9705 0 R
+/Annots [ 9713 0 R 9714 0 R 9715 0 R 9717 0 R 9718 0 R 9719 0 R 9721 0 R 9722 0 R 9723 0 R ]
+>> endobj
+9713 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [452.2279 490.6814 513.9963 501.5853]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9714 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 479.3489 138.8169 489.6302]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.5731 479.3489 230.2519 489.6302]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9717 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [452.2279 326.5951 513.9963 337.499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 316.4072 138.8169 325.5439]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >>
+>> endobj
+9719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.5731 316.4072 170.476 325.5439]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >>
+>> endobj
+9721 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.6739 105.4646 513.9963 134.5304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9722 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [106.7172 93.5094 154.6472 104.4134]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9723 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9710 0 obj <<
+/D [9708 0 R /XYZ 90 757.9346 null]
+>> endobj
+9485 0 obj <<
+/D [9708 0 R /XYZ 90 700.8904 null]
+>> endobj
+9711 0 obj <<
+/D [9708 0 R /XYZ 90 687.2018 null]
+>> endobj
+9486 0 obj <<
+/D [9708 0 R /XYZ 90 570.1945 null]
+>> endobj
+9712 0 obj <<
+/D [9708 0 R /XYZ 90 556.5059 null]
+>> endobj
+9487 0 obj <<
+/D [9708 0 R /XYZ 90 406.1082 null]
+>> endobj
+9716 0 obj <<
+/D [9708 0 R /XYZ 90 392.4196 null]
+>> endobj
+9488 0 obj <<
+/D [9708 0 R /XYZ 90 208.1589 null]
+>> endobj
+9720 0 obj <<
+/D [9708 0 R /XYZ 90 194.4702 null]
+>> endobj
+9489 0 obj <<
+/D [9708 0 R /XYZ 90 89.4414 null]
+>> endobj
+9707 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9726 0 obj <<
+/Length 2405      
+/Filter /FlateDecode
+>>
+stream
+xڽZ[o��~��P ��h����ӇM�sA��}�	
Y�c6�
��������v%�
�`I�83;;�7�K��?22x��B�q9��.��
���
�\���i𷛋��R�
2����}eA$(���ŧ1!��ɔ`����dzb5���P<�,�
�E1��5�+f��Օ����f}�![��|��L���w��nW���gń�q��g�4!|�4�|�����7>�f0�Ibc����g<Z��~���-F��#b

�.8e�����ſ���Bu�PNa�$�2��`>)q$�Ĕ�j
���.�ҺUs�̬3{�_jD`\!ŵj ��6[�V������E�Tm��:`�P$�b
⛝�M��M�
g[�I���8����ee���<f�0
I�hd�SN��k
+y4B�
+:8V�!*6T�(3�A��F���h�lpd4q�z;���K���`�d�c������i0�g��4��
+A�g�Sa��->�HA��ͰA
+ӭ���W�|�f�|������s�!�1�+WWU���
���n��P���@� �SFA�
+8��m6K ����C6�z;߬�Y�^e���L*�����F�
*�ʙ�:

�:���i�>
ϝ�X

+�`%��%�����eGl��U
��.��N-Hj�k�!i�ES�Y��݀����ժԀ�kN�"�y�ꖵ����Z
�~S�ʇ�il�C�{����%[g����YlV���[.7*Ə��K����ev5�%�V���T�,*��
���N�AJE��
+���Q)� ^K��n�������h5%��O��V?h=ү
\�¸!aQ����|̲�ˬ��mBr��z\��]�ʔh�zqX�����~1�ȨE��tUw�����HK!"ԝ���i��ea�����~�VwYC�����fh7P�\	���G��
�T��%�8��P�	����U����lB��
��R��|hG��zvm9�@�h"���eG|��r
]���Cc�:QUP�'g��Sa��VE�#z'
�(��I�G%���#
�� �7OU':��_�
+IG\�VE��$�I����-�v/3mۨ�S
�����}� \%��*�1.�����
]ڬ�O�R�P�0���.f^k �a����Xa��`7�$v�Z�۱E5"��X

	Xk�^�
��P+f�O7sنu���+&�T�����r�2���_/Wm�q�
+��"W�zvm����������
*��F�n�A�N%(%�
928��-1�:X� �͇]�|�u(�\v֌��x�mV�3؅6�b�Ը�@wv�-�Vڌ��a�l
��0U�����5t�Txβ�	���E��r��
(������

�Z
wuz�Ӱ�V&��^��{��<�I’3<b���h����&2�@����
���]Z�f�c�>�@���W�#<a
ۃȗФe""�4`����F�0+
ş滬q�
2p"��6 ;�
+�b���9�2caܯ�a�o����S���g�L>Fq6#��zN��w��|�{��
Q�9�Nt�<*�]2  ���I�$5Q/"h�F��P�m�'\�{�}߳�!]�оw��yW���ɟ ���cKm{T0����
e>5)�����̧J���D��aI�
F�����M0?�|�1����X"�e~<R�$���%
f���eo]F�A���)s�T
��հ�TJ��TR�aK���mD��aI�W	�g�u�^_
+�6G�vðo����aaࢩ�~�����존|��t� j��I���E�e0&q�^4�~S�x>E4�1��)�D�-�H�h��傯��rV���\yTʻTPbV{�I�e�(F^$-1�p��\�bD}U�8�y�&��?9�1’�6�
��|�`��q���m�)��O�|<���39I�ٜ�F�9$kV��c���@p�4���o!�V]�)�m�!����6"�����}���٬'�#"�yQrZ6O	'�y��}�g���!�u̎�G�K�G��A?~�~~�������6[������^

+8̙L�ߡR�5⬓�c�)�@b�NM��'���=MB�B\)
υG����1d��|y��AxjB<>K��I	��n֠E�Q� 8���0!OQ����d/Ҥ���`;س���+���
X�7:�{�ɚ�!ICh�gh�}������gKh��>�6[f�`b�9�g��c
i>��C%)�^�_l�H��]\���*�D�x���W��wn��kB���]��˿wY�g;�Mo�m��ϖ�},��YSY��'�*�U���d� ��lH^`ML|�U��_G��/��T7L[w�]U��ܳk�P�۫����G4ߡ�:�(//���e����ba\=�7�^,A�9�H*h?�X�Kr�M�[�Jtz�h_�
����endstream
+endobj
+9725 0 obj <<
+/Type /Page
+/Contents 9726 0 R
+/Resources 9724 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9705 0 R
+/Annots [ 9732 0 R 9733 0 R 9735 0 R 9738 0 R 9739 0 R 9741 0 R 9742 0 R 9744 0 R 9745 0 R 9747 0 R 9748 0 R 9750 0 R 9751 0 R 9753 0 R 9754 0 R 9755 0 R 9756 0 R ]
+>> endobj
+9732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 471.9437 165.4464 482.8476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_a317e5d2d782c3589c48cb3b45d6790d) >>
+>> endobj
+9733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.7836 471.9437 273.3806 482.8476]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9735 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 433.463 150.493 443.9933]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_80b9d602f99df76039d58032b20041d7) >>
+>> endobj
+9738 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 352.3269 218.0286 363.2308]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5267 352.3269 250.9649 363.2308]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_553ae81ae234cedad36e72b32c967e65) >>
+>> endobj
+9741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 313.4726 218.0286 324.3765]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5267 313.4726 262.0428 324.3765]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_62827195c6aeacf38a8fb3df6df8ff2e) >>
+>> endobj
+9744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 274.6183 218.0286 285.5222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9745 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5267 274.6183 290.8043 285.5222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_9f09728ae53c8e3dadeb202f28bb6fdb) >>
+>> endobj
+9747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 235.764 218.0286 246.6679]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5267 235.764 266.4564 246.6679]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_1dd09c87a931132dbee52ea24266866a) >>
+>> endobj
+9750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 196.9097 218.0286 207.8136]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5267 196.9097 255.3779 207.8136]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_c8b0d22ea3470020b35240f778c34a94) >>
+>> endobj
+9753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 116.1472 180.5399 127.0511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_825bf274e880e1c8d51b42d32c69004e) >>
+>> endobj
+9754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 116.1472 288.474 127.0511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9755 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [330.2071 116.1472 410.8041 127.0511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9727 0 obj <<
+/D [9725 0 R /XYZ 90 757.9346 null]
+>> endobj
+9728 0 obj <<
+/D [9725 0 R /XYZ 90 733.028 null]
+>> endobj
+9509 0 obj <<
+/D [9725 0 R /XYZ 90 691.329 null]
+>> endobj
+9729 0 obj <<
+/D [9725 0 R /XYZ 90 676.7587 null]
+>> endobj
+1506 0 obj <<
+/D [9725 0 R /XYZ 90 595.9902 null]
+>> endobj
+298 0 obj <<
+/D [9725 0 R /XYZ 90 589.39 null]
+>> endobj
+9730 0 obj <<
+/D [9725 0 R /XYZ 90 490.9175 null]
+>> endobj
+9731 0 obj <<
+/D [9725 0 R /XYZ 90 490.9175 null]
+>> endobj
+9734 0 obj <<
+/D [9725 0 R /XYZ 90 452.1827 null]
+>> endobj
+9736 0 obj <<
+/D [9725 0 R /XYZ 90 371.3007 null]
+>> endobj
+9737 0 obj <<
+/D [9725 0 R /XYZ 90 371.3007 null]
+>> endobj
+9740 0 obj <<
+/D [9725 0 R /XYZ 90 332.5659 null]
+>> endobj
+9743 0 obj <<
+/D [9725 0 R /XYZ 90 293.7116 null]
+>> endobj
+9746 0 obj <<
+/D [9725 0 R /XYZ 90 254.8573 null]
+>> endobj
+9749 0 obj <<
+/D [9725 0 R /XYZ 90 216.003 null]
+>> endobj
+9752 0 obj <<
+/D [9725 0 R /XYZ 90 135.121 null]
+>> endobj
+9724 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9760 0 obj <<
+/Length 2181      
+/Filter /FlateDecode
+>>
+stream
+x��ZKsܸ��WL.�LUB�
�����Tm���U[^�k,Q�$�Z��Z��4H��VVN)WyD���l|��A„�?�X:�R˅�ܬ���
���4��x}

����❒K�bjr}WiP@$6���0 fs��N�f@��r��t5ct�]=�����ߖ��E�ty�O�~���X-��f6g�N�_-������]Q��L��M�T�)7r�����?_o���\��������3J�5r����l�>����ُg�
z�
�
}1q��\�����1N��"M�(h@܈Is�����3Ż��Xa�b��
�X�Tj��v���� PӲ�.�_���^~̃�^��vW��ö�ݛ�Z�"�~/5f][�9o��Jz���m�
WIjvj���
�·��&h�b0nw^6Aj���RR'��C��z���A�085
A~ė�ޓ"(��ʽ{�K�8!���U9Bl at wKj
+E�!���0(�L\�W&u�2�uT^i1�p(%*�2K���h�yu=�rZ>�Z-������c�Y=�K�:�t*D�EG��_k��*BÙ��ڮ�DY$�Z�iTI9�z�8��
�?V[�
�,o+�q�����bUld(��V���Q�>������Vq�2�0 ��Fl���`�=�c�;<̮��瑮
�Ǯ��$��Ar~2",��~ZE(3����9�F��y�.���p΃P�&,Q��t
�v{Ʀ���@#=�AK�I+�%�;�"� �w�c��@@��H��a��@�G�ZO���Br�
E�{ �*�B�4Y�W���
�?֑�� ��i��tY�n���p_t�4��67ǂzۗ
 0?Je^;
H�ݳ���.
�԰��v���
�v/6N�—�{޻@�w������'�����cW�c�7�,g��HD�Aj��4*mk%)
[X�l�
��F|̉���X^Plf��"H���#ZPH�!zÉ�N
G���4�W
;&+�	R#N%�X)k$O��̼��#
9��bY�_��Ey����Ᾱ�Z�D}"��Ҁr`'w��ES�����M��Ԭ�yy� 벺}�,�ztZ7�,��ƳD�03���?��?�^^n���X��ڹ;DQ�
ԕ�1��^~̡�ބ�Ƽ '`�/���C�
�&b � 5�
cX�0ӊ��=1��g��f'0ȏx��{���qse��F�����N��9B��n4�%���bs^���{hH��lrZa
�aƐ�i�z�����)���
��������rU4�����\��¶V��&w��
�kO�e2
�\

��9X�?�f��e�Dh!�\,�ኳ��E3V�_6)��8z_�w�b]l|����c>I3�?�i�o� �%�n�!�� kV�]�,6>������_�wI��v{��;��°XX�j��I^�{��
��.��p���cYݮ!�nuhɓWm�O�Hc ���v��@ƦӦ��eQ�	��
+!�e��2̥[�t+k@����c?�@����GeZ0Z�aK��vE�z�(�ǠI$2J�Ѝwƚ3&�_���f+�U
�PR
�:K�&U�֤:��&ug�g0�+�W��F����&��3F�E5�5�J���f�E��o:
���.�0<�ۺ��s�+b,�ә��`��	a]$�D���,V�|BWJ�S�����A�2L�/)�4
<J2���B��:��O�O���ı_�{e	��X�
�VqCׁ��D�O����ȁ�
��S2����Y�C��Қg@+�����5L ) {�kwc��
r�*Q�H;
r�d������z'�1
?dFݔ��1��
R�D`� J�@5t���*��Tp���:c��h��ָ�6�,�I�2օ�v%��Ϸ�QL����l8Ԋ�r��M,
�W�����ힱZ�@� �6i �Sw��䡯Uz�>vj�g��w�v��w��j�R��r�>�3�lU\�|��ak���*�
�����*k�8���V���nE��{���to�zLR�
+XD�軮��>�`�7�
+�>7��o�H�pU��uӈ^�/����s���_Ȍ�w�j������'g�g�:UE��BW�,�v�'.���E�� H��%�Q���g���k�-Ps�<���\��;z݃��ˋ���Gr�'��$����E�,�2�s�7B
_��
ʈ��$��]��z�_n��ڙ����^W�
�9p
endstream
+endobj
+9759 0 obj <<
+/Type /Page
+/Contents 9760 0 R
+/Resources 9758 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9705 0 R
+/Annots [ 9762 0 R 9763 0 R 9764 0 R 9765 0 R 9766 0 R 9767 0 R 9768 0 R 9769 0 R 9770 0 R 9771 0 R 9772 0 R 9773 0 R 9774 0 R 9786 0 R ]
+>> endobj
+9762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 719.9123 178.2386 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_f7184f692efc0672e3213f6be9d5cf4c) >>
+>> endobj
+9763 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 719.9123 286.1727 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.9058 719.9123 408.5028 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 681.058 194.5074 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0055 681.058 248.1855 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_9da1d84e02f8a0769cd21e74c11e3ba9) >>
+>> endobj
+9767 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.5227 681.058 356.1197 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [397.8528 681.058 478.4498 691.9619]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 642.2037 194.5074 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9770 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.0055 642.2037 233.3115 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_b9da0d811233cfb64481a7fe08b7f645) >>
+>> endobj
+9771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.6487 642.2037 341.2457 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9772 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [382.9788 642.2037 463.5758 653.1076]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9773 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 603.3494 226.0342 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_f00b427f47054a80d236d124443c580c) >>
+>> endobj
+9774 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 603.3494 401.7729 614.2533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9786 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9761 0 obj <<
+/D [9759 0 R /XYZ 90 757.9346 null]
+>> endobj
+9775 0 obj <<
+/D [9759 0 R /XYZ 90 566.0293 null]
+>> endobj
+9776 0 obj <<
+/D [9759 0 R /XYZ 90 489.7043 null]
+>> endobj
+9757 0 obj <<
+/D [9759 0 R /XYZ 90 467.3925 null]
+>> endobj
+9777 0 obj <<
+/D [9759 0 R /XYZ 90 467.3925 null]
+>> endobj
+9778 0 obj <<
+/D [9759 0 R /XYZ 90 418.1513 null]
+>> endobj
+9779 0 obj <<
+/D [9759 0 R /XYZ 90 403.581 null]
+>> endobj
+9780 0 obj <<
+/D [9759 0 R /XYZ 90 356.3771 null]
+>> endobj
+9781 0 obj <<
+/D [9759 0 R /XYZ 90 341.8068 null]
+>> endobj
+9782 0 obj <<
+/D [9759 0 R /XYZ 90 294.6029 null]
+>> endobj
+9783 0 obj <<
+/D [9759 0 R /XYZ 90 280.0326 null]
+>> endobj
+9784 0 obj <<
+/D [9759 0 R /XYZ 90 232.8287 null]
+>> endobj
+9785 0 obj <<
+/D [9759 0 R /XYZ 90 218.2584 null]
+>> endobj
+1507 0 obj <<
+/D [9759 0 R /XYZ 90 119.8655 null]
+>> endobj
+9758 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F11 416 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9789 0 obj <<
+/Length 2427      
+/Filter /FlateDecode
+>>
+stream
+x��Zko#���_�"�+����h�n��A�]�C�
�4k��+#i
��^�
)΋���(��Z��{/�=�䐌0�##�GJ(d����
+�
���H�x
+ϧ!��W7o�d$���O�I�����?�	A�N�c<��<���ǻ	����y�-��ǿ�
�Y�|{���]���.[ώ��v2���Y����w٧,�=ζ�̚&�����_�۽g[
F0I,�߮~��0��0bF��|��CG�+N����z���S>(~�AXwP`�F�B�R��NT 7o��yb`�(G�R0�_f��������eՇY�߾��0����1�f���'B�Q�Z��k������Zm��Ӣ"IH�
)�!��M�-�ת��k�\v�ai)D�se'�өQ�*FSFa�a�,���^��a��m
 ���oO۹
ҡ#�� ���ނ	En��`�8��l��@�h�"~E!��
=*�pd��u��ݺ��I�
��Q�Xaޅ

>Še�2Xm��U�
+4�
q�Ib��r-%2���x�|l97�����#��)-�E�j�A�*���D�	��-�:��g)��;$X!"�H��Q
%�A�@���U�9W G؊�4�Q�S|����E��A����e�&?U"��Ԑ��v���� Yq6
+�/1�@|��y�9�8�X9�9.W�Sc��$v���mآ��Ð�ɂA� �n
+5/7s�&�%�{�JhT�Iȕ�%�*4���_'W5�Q���
 W	-���?~h��q��C��
+�"�j��j`�
+���%�����CY~�,���Z~=4�s�.�8��c��p<�<�W��B��	S�
+p 	<@��l�[:N��h���ζV�@��� ��V�(��iPF��H�X:X�
+c
�*���U�=��hա�&��9R�>šewآ	-(��G
�s��K����?���jD�;XI��-z�Fh�'�Jy0n��j��
�T�"�mD���j{��d�y3r\ΎN�+mp�#���#e{��[$���4$���dy�#���ʳ�7Q�u��3��e���3�/-�8S���p8m��*4����'ʣR�%d(o)Y�P՚�����F�>
����baK��p?�c
��X�����v��—j՟X�r�-Ұ�N&\@��_Ӝ -4�h쁍�%�C�I�ʳ���*�.�o�����Gd! �
�T��dz:$�:u�����u�Z���]�`�/������CA�r&�w��wMf�5�޷�X#��O�h�
&����Z�x,<*EB�D#��SdG�A�0>4 
��Ҷ;( �X�
�ģ$8��T�FqT� =��`ǃE�Q�PM
+mD���^t�Q;��}��qa�j��)�l�HB#�u#�n�����j���h��i�y�����
�^��c�
�p��mK�v`0&�q�^�C�qٮ�
"�q-��l��C����I|����^�e-���
�

��8x�C��@Ɇ�I��h
<*��]
+h�j$�Ma�1�

��'����lX�t��ݒ]�$������l�������FL�
��@�}+�B���
,
�nH�:��@i��ƚ�@�5a�
���8/��g^����
c?�b���$��N��I�
+H:�/���}��L,�S��z�^�����*��*���_�+p�y���a�
3��D�3{w�p�O��U��

�G�Y4l�yX�ae�� xL�=����jA�*<5���E=y`"��e)�k��x�����F��~��]����K�	��R���{�H5CL���i�|S�A���>"�
������"�`�p5vÅ<F���<A��jT��S<��d�Q�p"�S�J���4B�/�瓠�u���^�S
�V�	;LjR#�q��)R�:���C!��px|�K��0��	
�e��;T��a�Y# q��u��l�D�1�w���7�_=��˾��n
8�V	���������y_m;�PfE���H���5	F��$�N��ҋD`0r>����?�{8.now�c��6U��>&��@��:�~�w���ݚ�wܖd�'�yӒa
+�	9��G%�Q
+�
Սx�5�#f����-

@�O0l�
x����P\�0yT�h�}���$�� B�I��E�؈	����N����g�� !$��S�/c��|�GC\3s�v�Hu����8[������0�W{7�����������aY�����a�����`_q^Rꋒ�~�X�^c
��N�3�s�1D�H!/��_޳�HS{�Y��v�*�	�+r5�T#�s��ˏ�
���?!��#���l{r�:+_���,?�PU��3�l͢ɔ�V�}�u�كu�ԣT>�u���������4�E��*rˮ
��x����<==�����}�VǛ�~}ӥg��Efo�A-.��sL�N��ɀ�'w�����: |�)ұ�G�U�6�� �V,endstream
+endobj
+9788 0 obj <<
+/Type /Page
+/Contents 9789 0 R
+/Resources 9787 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9705 0 R
+/Annots [ 9793 0 R 9794 0 R 9796 0 R 9799 0 R 9800 0 R 9802 0 R 9803 0 R 9805 0 R 9806 0 R 9807 0 R 9808 0 R 9809 0 R 9810 0 R 9811 0 R 9812 0 R 9813 0 R 9814 0 R 9815 0 R 9816 0 R 9817 0 R 9818 0 R 9819 0 R 9820 0 R 9822 0 R ]
+>> endobj
+9793 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 623.0791 165.4464 633.9831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_419ea78710f4b45c1542647e1212a3f7) >>
+>> endobj
+9794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.7836 623.0791 273.3706 633.9831]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 584.5984 150.493 595.1288]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_0ca2fc9566495b3d4ac6b970a301d9a1) >>
+>> endobj
+9799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 503.4623 218.0186 514.3662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5168 503.4623 250.9549 514.3662]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_af9d682418e536d9a1f6bd24991e1c56) >>
+>> endobj
+9802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 464.608 218.0186 475.512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.5168 464.608 259.2535 475.512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_f78754c1ef47797c0acbd31cf48f9caf) >>
+>> endobj
+9805 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 383.8455 180.5399 394.7494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_306699ac7d5f2c2c909c3a3baf303009) >>
+>> endobj
+9806 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 383.8455 288.4641 394.7494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [330.1972 383.8455 410.7842 394.7494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 344.9912 178.2386 355.8951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_5740d23d50b9aa7c95e8b6b51242258d) >>
+>> endobj
+9809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 344.9912 286.1627 355.8951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9810 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8959 344.9912 408.4829 355.8951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 306.1369 194.4974 317.0408]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9812 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.9955 306.1369 248.1756 317.0408]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_5db28418fdee0bbd164b1ac21e0a42f1) >>
+>> endobj
+9813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.5127 306.1369 356.0997 317.0408]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [397.8329 306.1369 478.4199 317.0408]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 267.2826 194.4974 278.1866]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.9955 267.2826 233.3016 278.1866]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_d99eb5124bfcd9c75379efdde73d1a1a) >>
+>> endobj
+9817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [260.6387 267.2826 341.2257 278.1866]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [382.9589 267.2826 463.5459 278.1866]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9819 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 228.4283 226.0342 239.3323]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_de82782e3363de460caad677b3583559) >>
+>> endobj
+9820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 228.4283 401.763 239.3323]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9822 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9790 0 obj <<
+/D [9788 0 R /XYZ 90 757.9346 null]
+>> endobj
+302 0 obj <<
+/D [9788 0 R /XYZ 90 733.028 null]
+>> endobj
+9791 0 obj <<
+/D [9788 0 R /XYZ 90 642.0529 null]
+>> endobj
+9792 0 obj <<
+/D [9788 0 R /XYZ 90 642.0529 null]
+>> endobj
+9795 0 obj <<
+/D [9788 0 R /XYZ 90 603.3181 null]
+>> endobj
+9797 0 obj <<
+/D [9788 0 R /XYZ 90 522.4361 null]
+>> endobj
+9798 0 obj <<
+/D [9788 0 R /XYZ 90 522.4361 null]
+>> endobj
+9801 0 obj <<
+/D [9788 0 R /XYZ 90 483.7013 null]
+>> endobj
+9804 0 obj <<
+/D [9788 0 R /XYZ 90 402.8193 null]
+>> endobj
+9821 0 obj <<
+/D [9788 0 R /XYZ 90 191.1082 null]
+>> endobj
+9787 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9831 0 obj <<
+/Length 1566      
+/Filter /FlateDecode
+>>
+stream
+x��mo�6���Wh���D��%hl�R�ۺ�d��[��ɒ#�s��w�DY�i']�~$y�;�=<
E
?$08PB!ø
��n`�و���G}��.G�
)���2���$A�\�ޅ� �������q���^�)��n�������˻�������8<������M2O�$�&�
!�j���������v%�Ib
�
�������#f���1����=d���ם�f�~�A�C"B�R�."�6&e��vq?�3��,����b�O����i1�,����!X58Q�7�����uQd�H2
�����|��>��=xZ�몙vѿz��W��Q+���\�[�4K�4طf?6"��sd4����&��	�HJcZ�w^��0g�GZ�������"� VF���w�:�7`p�D�($)o2x9f",7I��t���]�<���+��Vb��9�8��
+X��J�DZ�� '����Yq�N��9��n�1�?�W�V�T�� @I�
W��4!;оy�<�Aj��1	���Y?k�!���z�	"�#F������Y����r���oZ�f
��ӣG�/�h�O��ÂQ����S@Ġ�Ũ��c
�Ԑ��;6l>w R*��LH����Qr�M�-�����9"L�̝b�bXl���_����K �B�/N�@F)�
+��
�p?}�4}��j��0�C����8���	b��O at OJ
�k�K� �� �F��6�!GŒ�"}bR�ۦբ�Ȳ=Q���� �{(��"nk�aLs�ۢB�z���T �)��Eu]��Ίu�4����2
��Z=`�
�0Hq�V����
+��&���c�yR���n�k�v���dW��z��Q|�p?bzD��Y
������7�j���e �F��o�y�8ng�
@=4��\w��<�]�����}�Irk��-�e����"�
+{4o���z�1͒3�
�A�`#�,���� 
�g�wZ�`S*�
�V�P`��N�
����N��VZ,:�t��U-
1n{��q���ӿ�u,\��� �

�G�
C�'Jb}l�W�G�z�o�|�mf��2���J�c_�	�C���
&�����|��Q��z��\{�/�2�Q&������6P-H ��i�iؙ�y�'ȉG=yA�Z�3�l|
+	8�����(
�S{��
۝�i�tu�n)]�4���|�p�X|:�{���zo|^�<w�0��F��
z
��*����_�T���@[w�B�w:��C�����W�gi|S�˽�x2 ����,�p���<KS�Jal�
tPK{2��]{2�m ��QX֓����e�v`�|Id��
�{q���CM��*���~$���O6�����7����)bE_B��t�
N��01��]R�G���MO��4���ӹ�������ml��T�r�a ��U�Pe�d;p
�M���R��s(���:J���]
+~�-�{!��|vT�%�
_T��l2�n�h�F�<]�(�&P�'�~q��8Ul��޾�|��c������������i��z+�}�V�+��i�eendstream
+endobj
+9830 0 obj <<
+/Type /Page
+/Contents 9831 0 R
+/Resources 9829 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9705 0 R
+/Annots [ 9839 0 R 9840 0 R 9841 0 R 9842 0 R ]
+>> endobj
+9828 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (./classParma__Polyhedra__Library_1_1Polyhedron__coll__graph.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 9843 0 R 
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 500.00000000 150.00000000]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R7 9844 0 R
+>>/Font << /R9 9845 0 R>>
+>>
+/Length 9846 0 R
+/Filter /FlateDecode
+>>
+stream
+x���K��@
���)|����s� ��v��!�6�5�nZ@��c�i��}(��{<�7π� ��?G�z�a�T�2�_r<�*��#"�C[��B
]B�p�N�G�70�#��9M�8(�~����Y���jx;�
���I� �#p�a�^ݕm]w�����e�a��-����ִh^���Cu�/��r�/k݋L�/H�X�C6�ÿ�{�h����5�b�^��z��'�(�g�7f�}�I
+��K�,yHID��L�P+�e\++�:�#
u��k
^��)h����d	g�F��L‹ʐ��)z�L8�Mzg:>�$�[�,m��:)vڎM�\//.pd#��*p��=yH��ЏFʄ�5��DŽ(#<E���9z
d:��Ε�QSN����=��:]#io���6M��j�xVU��ZO� 	ʂ
+����v	>��sl�>�US��j�^E��I���q��
~w��&p�$z
:�-�2��@vN�e1v�o�><g�]�18~�mN��ء
:�'�m�q��q[lhK
��������O{�O���
��4�+��:{���`�[3���{�
;ؙendstream
+endobj
+9843 0 obj
+<<
+/Producer (ESP Ghostscript 815.04)
+/CreationDate (D:20080908142736)
+/ModDate (D:20080908142736)
+>>
+endobj
+9844 0 obj
+<<
+/Type /ExtGState
+/OPM 1
+>>
+endobj
+9845 0 obj
+<<
+/BaseFont /ESHNRP#2BFreeSans
+/FontDescriptor 9847 0 R
+/Type /Font
+/FirstChar 58
+/LastChar 122
+/Widths [ 278 0 0 0 0 0 0 0 0 722 0 0 0 778 0 0 0 0 556 0 0 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 500]
+/Encoding /WinAnsiEncoding
+/Subtype /TrueType
+>>
+endobj
+9846 0 obj
+571
+endobj
+9847 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ESHNRP#2BFreeSans
+/FontBBox [ -21 -217 762 977]
+/Flags 4
+/Ascent 977
+/CapHeight 977
+/Descent -217
+/ItalicAngle 0
+/StemV 114
+/MissingWidth 500
+/FontFile2 9848 0 R
+>>
+endobj
+9848 0 obj
+<<
+/Length1 56840
+/Filter /FlateDecode
+/Length 9849 0 R
+>>
+stream
+x�����V���eB!=K !
X˒e�*��H(!�xw�������{���{���{�<Y:��|���G~xF��=sۜ{�eB�A���M�Θ5Q#�?o�>�o����of���}a��M
x����LWa�3���!����:�X��� �y�3&�=�J��o���{�v�V��
��J�����	b��{s����B{:�������/<��=_� ��J��)�Nh%�w���?/~񵿧���K���F��,
v�Yb���q�h�'(�F�^[�jA���*�z�s	�:Iĵ�)�#
�N뒫@g��	�%V#O��yt�p��Lj��g�W"6�;��HF�:��k:I�@�
�"�6�4��4t�X��
:K��.�9b��*q4�8�1�:�J����c��c�I�U�P�"�?���L?�&JD1@��k�h!4���O#6��D�nx�K�=G��=�����ڽ�O��R%z��"1� ҥ��B��ڢ��j�>�������Y���\9����
�jO��=����*�����=m����O�z����^��.z�5Y&��x�
z�''-wPb`׈$1��
�:&��JŪ[*w�[�Z[&!J�ӵ���x/�$ѤD"���w��قVh!�3=�B�:�MB���Y���=�/W�귌��_�S�&y!�ɖ�-�m��������k��/-^[t�h-�U�6-������ZC�x�~����]��^UϿ��LL'��2����g
+����w�+�ݻ��˼R��۳��-��|K�����Si��Z�œ]�\���h���ϷW[������L���\�e���BO{˴��|������¨z�s1��o���/�?�<уn
�=k�w5���ӈ�j�o�ĉ�-��U��u��v�ȉ]}�	����`��_��Oo�@J
lm�ؓ��a��c���Z�m]{��ў^8-^���P�
{���/hi+���X�2�����RZ�/{m�o)��
h�(uy�E�����O+y�#ピ�������C:��o��fͺ���~
��/�tS����/���_o����=�m�c��缚��Z�y>����+����ȑj���^�9�VA|~>��,y��$���M��?ER$�e�Kp
w�HH
_*^��ü<=�X�ˏ#�����(bbUb5bub
bMb-bm/���:�o��K�G�#�'6 6$6��x/��^�{�$A�^�Lzs;EX^�mBlJlFlNl�1�M8^��YoJO&�S=��k�m����u�v^����9^�K�@�H�D��qޮ�n�<bw��W������G�W{�z$�&qq�#�q
qq8��.�q.q%�
�3�+q!q
��ǃm^�
�5�S^#>N<I<�q�3ij�^
�D<O�@\�5���	ī���+^W|E|C
�uS��5��,�{ݲ��ae?�T�n\D|�͔�,؋؇؛����؏��[�
@|M|K�I�$G�@��D�C,!eR!U2F���0rr8I�+�+�#ȑ���(rrUr5rur
rM�w�r-rm��
M�C�!ǒ������
�
ɍȍ��ğ�k�r"�J�I�L�:i�I�$S�EN"7!7%>$>"7#7'� �$m�!�d�̒.9��BN%�"�&�'n ��ې����v�Lr9��C�E��e>!�'�;�;�;�;�����������
�F��
d��$��n���O. �"
d/Y$Kħ�gd�Y&+d��'����� �'��7��/��?y y q)yy0yy(yy8yy$yy4y
y,y
y<yy"yy2y
+y*yy:yy&yy6yy.y
y>yy!yy1y	y)yy9yy%yy5y
y-y
y=yy#yy3y
y+yy;yy'yy7yy/yy?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7������MR��)�b)��)�)��)�R�5�Z�N�H�D��FR+S��U�U�ըթ5�5�����j4�5�K�K�G��֧6�6�6�6��S��T+�4*A�A%)�JQ5�ڄڔڌڜڂڒ�)�JS*K��dj
+5�ڊښ�FmCM�fP�R�Q3�Y�lj�=5�ځڑډڙڅڕڍ�G�N�6����T'�EuS=�|jU ^'>�z�"U���=���e�;����{T��PU��ZH-�SԞ�^���>Ծ�~���ԁ�A���!ԡ�a���ԑ�Q���1Ա�q���	ԉ�I���)ԩ�i���ԙ�Y���9Թ�y���ԅ�E���%ԥ�e���ԕ�U���5Ե�u���
ԍ�M���-ԭ�m���
ԝ�]���=Խ�}���ԃ�C���#ԣ�c���ԓ�S���3Գ�s���
ԋ�K���+ԫ�k���ԛ�[���;Ի�{���ԇ�G���'ԧ�g���ԗ�Y�W���7Է�w���ԏ�O���/ԯ�o���ԟ�_���?��_/a�4E�4C�4G�@��D˴B�t�
F�@�W�W�G�#��Q�*��j�����Z��t
=�^�
C��ץף����������	�D������uڠ��I�h��DoBoJoFoNoAoI۴C��
��]z2=��JoEoMO�����3�m����,z6=�ޞ�K�@�H�D�L�B�J�Fϣw�st�Nw�y���
z>��.нt�.�}�
t���U��^H/����^���>��~�����A���!��a�����Q���1��q���	��I���)��i�����Y���9��y�����E���%��e�����U���5��u���
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_�`H�bh�aX�cxF`DFbdFaT&�
cV`�3+2+1#�����(ffUf5fuf
fMf-fm��ͬÌa�2�2�1���
�
�������f"����I0:c0I�dR��Lb6a6e6c6g�`�dl�a�L��2.3���Le�b�f�1�0ә̶�v�Lf3���l��ev`vdvbvfvavevc�1�39��ig:�<��t1�L3�Y��^�Ȕ�>f��T�*��,d1��fOf/foff_f?f� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�f	�/K�$K�4˰,˱<+�"+�2��*c��+���ٕ��Hvev�
+�*��:��&��6�Žf�aǰc�u���q�����F���xv;�me��&X�5�$k�)�b'���������[�[�6�i6�fY���Na��[�[���m���
v[v;v&;����a�g�;�;�;�;�����������
�ƶ�
l��d��n����.`
l/[dKl�[f+l��g����� �'��7��/��?{ { {{0{{({{8{{${{4{
{,{
{<{{"{{2{
+{*{{:{{&{{6{{.{
{>{{!{{1{	{){{9{{%{{5{
{-{
{={{#{{3{
{+{{;{{'{{7{{/{{?� � ��0��(��8��$��4�
�,�
�<��"��2�
+�*��:��&��6��.�
�>��!��1�	�)��9��%��5�
�-�
�=��#��3�
�+��;��'��7�����#8��8�c8��8�8��8�S8��qø��܊�J�n$�27�[�[�[�[�[�[�[�[�k�Fs�pc��ܺ�z�8n}nnCn#ncn<7��ȵrqN���\�3�gq��M�M�͸͹-�-9�s�4�Ნ�M�pS�����i�6�tn�-�
7������p�ss�
�
�����]�]�ݸy��\�k�ڹ.�ur]\7����p��+r%��ۃ+s���s
�E�bn�ۓۋۛۇۗۏ۟;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�����������������������������������������������������������������{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{�{��������������������������������������������������� [...]
+�p~E~%~?�_�ů¯ʯƯί��ɯůͷ��u�1�X~]~=~
�>��!��1?���O�[�8��	^�
>ɛ|���I�&���f�������;|���Y��'�S���V���4~~:?�ߖߎ����g�s��������N���.���n�<~w>Ƿ��|��;�.������
����������
+_�����"~1?������������������������������ϟ��ȟğ̟ŸʟƟΟ��ɟş͟ß˟ǟ�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_�_���������������������������������?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?Ͽ��ȿĿ̿¿ʿƿο��ɿſͿÿ˿ǿ�������������������������������������������/���(��8�A$AAb�0aa�����0B)�,�VVVV����Z���:�a�����0NX_�@�P�H�X/L&
+�B\Є��
��L!%X�$aaSa3asa
aK�
!-d���
+��)�Ta+aka���0]�!l+l'�f	��9���\aaGa'agaaWa7a����ڄv�C�
�B��-��BA��BI���B����I���
����-�#�B�@�A�0a�����xT������#�%��$���������NNNNNNNN��������........'���������nnnnnnnn��������







��������^^^^^^^^��������>>>>>>>>�����!N��#.�~~~~~!�~%� �~~��$.�"N�����q�H��H��Ȋ�ȋ�(��q
q2q�(����1q���8\\Q\I
!�WG���������k�k�k�k�-�hq
q�8V\W\O
'�/n n [...]
��M���-��m���
��]���=��}�����C���#��c�����S���3��s���
��K���+��k�����[���;��{�����G���'��g�����W���7��w�����O���/��o�����_���?��_�PH�Rh�QX�SxEPDERdEQT%�
SVP�++*+)#�����(eeUe5eue
eMe-em�E����Q�*�*�)���
�
�������e�Ҫ�MI(�b(I�TR��LR6Q6U6S6W�P�Tl�Q�JF�*�2Y��LU�R�V�)�(ӕʶ�v�Le�2[��l��UvPvTvRvVvQvUvS�)�+9�MiW:��ҩt)�J�2_Y��^����>e��T��ү,T)��eOe/eoee_e?e� �@� �`��P�0�p��H�(�h��X�8�x��D�$�d��T�4�t�
�L�,�l�
�\�<�|��B�"�b��R�2�r�
+�J�*�j��Z�:�z��F�&�f��V�6�v��N�.�n�
�^�>�~��A�!�a��Q�1�q�	�I�)�i��Y�9�y��E�%�e��U�5�u�
�M�-�m�
�]�=�}��C�#�c��S�3�s�
�K�+�k��[�;�{��G�'�g��W�7�w��O�/�o�e��J��J��ʨ�ʩ�*��*�����S��+���Օ��Hueu�����������������ڢ�V�QǨc�u���q�����F���xu�:QmU㪦&T]5Ԥj�)�R'���������[�[���i5�fUW��NQ��[�[���m���
u[u;u�:K���Q�W�;�;�;�;����������՜ڦ��
j^�T��n�G��.P
j�ZTKj���ZV+jU�W����ꀺ�������������z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z�z������������������������������������������������������������������������ [...]
b�6�m
��k��cZ,�cF,3c����$�il���-b[��K�2�l̍M�M�M�
+}�Z R��Y���|��{s��R��������y.�
�.u���|.�r�������Y�/��u)�Q�����Ū�
�\�=W+�#��\��0�l ����
,(�|a��e��'��U�����"U��^���᢫�B�RWN���Li˕�nZ�)t�
_�SQ�
�djP����"�@RS��z��[�a�ԕ��Z�p�U�狅\������k�湂/�i�~��
nZ�@_0Ӽ�3
<_
��^�|������Š���ڻS�7`�l������|	��T��
uFw�+W��-���j�����Pb�YC�>��A
�@�
+���B�U׌�A��/��Ɠd��
<\
�av�#����tdБsP�~�eNP�~_�s�=�.�����i�W�?
ޏ�2�.�Eu��u������pO_H;
�=#�-��]��v�V�8$j�J@�d҄LAZ�6����@f!�@Z���o��\
�p-�Z���k��\
�����.��l���l���
l�6�m`����m��
l�v���c�b:��l��
`;�v�� ��l���}�h�4���K/
�4���K/
�4���K/���Q�4���� ?�
�3�� ?�
�3�� ?�
�3�� ?�
�3��?
�,���?kp��Y��
X��z�Y�g��z�Y��@w����
t�w��Z�]��$�E*og��lF���tziP�K�Z[!�dR�4 ��&d
+҂�!
�4d2
�^�?�8����?�8��2�>�W�/f�_T�.�,b�#
04`h���:j���:j���:j����5��@
�cuL����o��G|�3���
�g >q��@<�I/	<���^xI�%��^xI�%�
I�?	�$�L��3�g��	<x&�L��3�g��&�i��	|����_�Ki�/
����4����_�Ki�/
����4���,��4����_�Ki�/
����4���,�����
��a8L�i�
��!�k�����ebW9�0�M�6��)5Ϳ�h�D�Sg�!
�$�	�R�K�������lH2
���B1'�O�'	��I�$�|�@>I�E<iA?�8���G.I �$4�k�⭥��Ң�� �$�hH4	$�M�&�D�@�I �$�hH4	$�M�&�D�@�I$Pn�&Pn�&Pn�"!%�hH	L�&l2af�j�X��
=�r��S�$��ם�U1W,U�|ON��Uz�5�o�UܟZ��������9u�Ҍ�|W�4��so�b},��Ws�䜗�����<f'��ᱳ�=���[���rގ���#Gm�OM�v���m=��������ѳs�<��������m+=�m)S�"��Z�E
��뫟��VD�A��癶Z�j�c;�j�GY̞���nV���
+c�U+�U
�t�T��Z��������W�U.����zu>��կ���]��Z�+�m>l�0�R}����Z)�5�+	+��@zk����鉷z�jF<ҴH��G�i�H3#-iV�%#4
l�5YB��
��J�G�ţҴ�أ��(b-�S��Ӣ8��d-*Y�JND%'��Qɉ�-F"�HD�#a$"
=��#
=��#
=�l=��#
=���;z"=���HFO$�'�(*3�Ōb1�X̨d3*ٌJ6��ͨ�TTr*�o*�HE�#a�"�T���0R�aX�aX�aX�a`5��m1XZ��f��_�Ec�5iz����43�R�f?��x��!
�|�ױ*ұ*ұ*�Sn4�' >
+#
;|
+$=,+$=l��9Ĉ������������������������]��]��]��]��]��]�n��<��u��u��u��u��u��u��u��u��u��u��u��ӱ�ӱ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ�ױ2Ա2Ա2Ա�ױ [...]
+	|
�:�u���G�:�u���ׁ�_�|
�:�76�5�76�76�76�76�76�6
�aOl`Ol��������J����������������������������H7	\�
�
�
�
�
�
�
,�
,�
�
�
�
�
,�
�
�
�
�
�
�
�
�
�
�
�
�
�
썍���T/.p����F��%"M�4#�R�fF�&#[2�Ew!nRKI�Q�=�GZA')F:��LjF�%#͌�T�E�fk��#M��Ռ0�Ì0�Ì0�#a�"�T���0RF*�HE�#a�"
�_����Cj�	H
ҀLB��)H
҆t Ӑ�5��7��7��7��7��7��7��7��7��7��7��7��7��7�!^2�&��|
��7��7��7��7��7��7��7��7��7�m7��M�x9�D�7��M�x9�D�7��M�x9�L�8�'r��
o"Ǜ��&r��
o"Ǜ��&r��
o"Ǜ��&r��qba�X'Ɖ�qba�X'Ɖ�qb���9�i�
d2���qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qca�X7ƍ�qc���1��c 
���x�0�,�'
���x�0�,�'
���x�0�,�#
���8�0�,�#
���8�0�,�#
���8�0�,�#
��
+��
+�
+�
+����������5��5��5��5��5��5��5���s
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k
k�L�ڊ��sŎr�����/{��bea���<}aO%W��153[��՞���SS�kj��Y��ߜ��}�䫾ǂ
W������/��}Q��m��E{�0߿��_T�9����ÿ��S����t��Ep��7��6��-���?�ϲ�Y�oW��+�|v�Z��
�9���ʹ��҂\�\��SSD��BShꏴ�����r���"S)2��t�*�b5��N�����\y��G^*0���R�B���XXX!PkM�g�\����y�1��M��|�vg��w��Y�߯�,�ݯ��~�=]�՚C��������)_m�)�@����Z��E���X�h�/�����x��V���Ї�]�Z_F�׋e����c�l�
ޱ�;6x����
�b�Wl�

��#6x����<b�Gl�

��#6x����<b�Gl�

��#6x�����a�?l�
���6����
�a�/l�
���6��/���`�l��o#����6�<o#O���6�<m#?�ȳ6�<k#��ȳ6�<k#��ɰ
č<k#��ȳ6�<kc�dc�dc�dc�dc�dc�d��D{&�'��>�Ɖ���m��m|h�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l���8
�q:f�t��阍�1�c6N�l�c���)��S2�d6N�l���8%�q:f�t�Ʃ��S1�b6N�l���8�qf�4��i���0�a6N�l���8
�qf�4��)��S0�`6N�l�~�8��q�egC��p�d�����3&gL6Θl�1�8c�q�d�����3&gL򞃼� �9�{�|�`}� �9�s��� �9�o�|� �9�c�<� 9�G򎃼� �8�;������ �8�7�|� �8�7֡�u����$C;�G�p�7
�
y�A�p�7
�
y�A
p�
�y�A
p�
�'�濃���t���w0�
����<w0�
�k����u0
�S�9��楃y�`^:8�v0?
�O��橃��`~:��桃y�`
:��N�
�7���i����`�9�oN�
�
;8vp6��l��p��F���?i�O��F���?i�O��F���?i�O��F�������i��4�-�~K����4�-�|�F>N#�џi�g�8�|�F>N�����4�1�~L���Ki�4�Ry)���F^J#/�����K� /ų���'�dR�4 ��&d
+҂�!
�4d2
	�8����?�8����?�8����?�8����?|
��5�k�׀�_�|
��5�k�׀�_����O ?���O ?���O ?���O ?|
�:�u���ׁ�_�|
�:�u���ׁ�_�|��
��7�o � �|��
��7�o � ��$��O?	�$��O?	�$��O?	�$��O?	|�&�M��7�o��	|�&�M��7�o���rs�ĸE���w�����qQ�ϥ��~
+�)ী�~
+�)ী�B�-��B�-��B�-��B�-�[���o���rm�k�\��(�F�6ʵQ��rm�k�^vX>�e�^6�e�^�
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~ȫ.��8�c0�|+�]��@w��=��9]��
�v��.X�K�`i,킥�ְ<ҁLCf ��Am\��
�v��.X�K�`i�삕]��
Vv��.X�
�`a,삅]��
v��.X�
�`a,삅]����x�X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X�
�`a,삅]��
v��.X��`]��u]��
�u��.X�˺`Y,�e]��
Vu��\�u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X���`Q,�E]��
u��.X��� [...]
+x)ी�
X�k�`M��5]��
�tS!
�
�t��.X�k�`M��5]��
�t��.Xӵ��t-�[���o��]]��
vu��.����`W��]]��
vu��.����`W��]]��
vu��.X���`U��U]��
Vu��.X���`U��U]��
Vu��.����`Sl�M]��
6u��.����`Sl�M]��
�t��.��{�`O��5]��
�t��.X�k�`M��5]��
�t��.X�k�`M��5]����
x�?��G������

8�����:�Ns�oE�4w���'�RgOW9ߑ�t��V�^N�{����?˕|\�@j�X�X�ur�X��:�����s�=E�G���R�I2	iB:b~q{!���V�%H
O�xB�x҂t��7F���|���`̸R��(4*�/��
�ҳ8�U�k�����(z��RtQ��)v%x����Ȯ�_R�W~�^�3^�3~ѕA�P-����W��\P?;z#&�d [...]
�
��C���
	,
X�RC�K
O�!�H^�U�{�
��v�R	n� �H�{��"���V�6�\ke�߰��s��'Z�%Z�ڞ�!O�$O�$OM�DS$�I4E�ڞ�	|�&�M��7�o��	|�&�M��7�o�t�\�\ZT���y_��|Y�5Sp����hm^�p�(��=�'��eol����P+L
+/���P����j�F~�^D��+���=/�T{r!��W
�ƹ�m�
x���
�����������7�J�׹�������kMO�J�+��SYЛ�v�h)}�R_�\�_`�
+l��U�K�RWO{���
�P�I�S�ֲ`{͓�
~c���~a�ɬX��Z��T��ޞB𝯦�^M
V��� !R~��Ʉ�����E,��}�R�G�|_�?֚�����B���0�z�}�ڿ��Ɛhm�j�P�Զ���:�
Lfy����`��k�x�!�C�IH2iAڐ�W`k}��,�[sH
:{/Oj����V��!n�
�:�G
q?�T�b�#P��ᾆ4���!X�h��@�4�,

 i�A�� D�!
 ��Uk
�Z{ҏ�
, �w�5�k��]k
�Zkx�ړ~F]� �/[kx�Z���^��𲵆��5�l��ek
/[kx�Z���^��d- ��gO�t(F<T4(	+�	-Z��s+=tN�B�H1C%�DJxK!�hX���G�a�z�
ƣ�%���FT��
�о�B�}A�()4r
+���:�����)4r�d�ShboWU謿�.N���]U��/T+��Z��?����,t�l
�:�B[@��
�<���t�;{<��h+-�x�
�3�P�6�)�7�������N�}ВZZ����u�%|^ ������ ��	��� mH2
���B��
�Ǔ�
��<	�0

q�C��
�%!���tĥ#.
q�KG\:�����
��7�o � �|��
��7�o � �|�I�'��~�I�'��~�I�'��~�I�'��~�&�M��7�o��	|�&�M��7�o��	|�)ী�~
+�)ী�~
+�)ী�~
+�)ী�~
+��-�[���o�\
����g��F�6���8m�i�<q�a���F�6���8
�;�w�� ��|��
�;�w�� ��|�iু�~�iু�~�iু�~�iু�~��g��~��g��~��g��~��g��~�Y�g��~�Y�g��~�Y�g��~�Y�g��~�.�]��w����
|�.�]��w���~pD��
�Y� ��
�n2X8y2�v Ӑ�,�Ȁ<:J�ڋ���������V�
Tg'������O@\���(�.y2��(�֧.^b����!C�,O=��
�YM�
+|&
�(����\� �IĐ@
	�~@F�@	���
���v��x���+T.^�r��'QK
�ꨝ��u��G?k
K����!RP7������)�T�W�U\�w����n������7����.���Gfo���J�
����#�⠿��t�k
�:��ZT���΁�=h�4wu�ŮA��As{U�ו2�e~})�z���z�SG���
�O랮��cP-�}��}u�m��:s�:0�����s��8*�A�:�Σ\�����a�����Ht�x_�ކ"��
�̽u�@���^Uȸ�t{Z�N�t��v�C�|�UO}�����>�w5���ᝎ��P��&�5C
}�G
m���߷.p��1U*�S	
�#5%zݿ��
=�`���d	Z�Z�=��{��^..��!R�E�rd,}�ZPJ��BP�7��0�bq0�����z0�5�
"�W�,B���]
ھ˫�e^0T}ՋA
�������Є��ka�ր�P��=WaҨ)h��`�����1���%y�������
x��P�C���4��֗r�
��p0wa0��L�F1|��� �zw���=-.�*�Y��#���"�����2U,�Ƀ	n!{q�[EG�� ����R�m�������Ӂ���ǎ`�Ƀj<��
gs1Tz1�1c�RF�P�ݰ��G�AJ�����͢��R
ۣ����
�bX�bP�H
�O2
MY�
����ty
+dd/d� Y�C��W�&��|� ޶(ʶy�zڱ���&���^��ް���: ��Q
�c����P+�	t�����ڢ��mH����

aa��PN�@
^b	d0"
�(
νB8
+�`���
�O7
}0��A�(�K
+��c� !Ԕ��T
�b��J!� ��T?�{:*hq9T1�C=
��<H��
K;��v�`}uD��F����IQ��J�����P	B	’U�9b�T��V�n�p�U–
Z��.�@���T�J��5
+�
Vw���e/d��
z�� �ٵ���
+i
�2m��0緅	�-L�mȬpL�ma~C��)�x84��6�h

�ų�ђ�f�K�)
�޶p<���`�a�C��sm
�j3]E���
+�(�
+75���U��U��5����
OU�oU�[j�tu1Uc��������":��h,?S��N~�곭R�x
Ұ��(���0���U��U�4m�O�5<�V�T[�
��z�u7<�[_dot+ֆD>X�޺8�-�`��XG�

���JC��eÆ�a�EY+��B�uJ���s*u�S	;'���t��ҕ�J�#��
���;�R�
�薿E��q�J�� �[x���ж�C
�PƊ
�(���1qLź[]��WŮz���[�
e̯�5�����+/	�ʟ��W/1�ݬm���)�V
+m����Ȇ[
E����5����jk��[1PQ��(ԗPi��7z�
.��冫�{r4��cik�m�R
v���m�HZB���vՄ8,f�h��S)�6v�����'*�Tk���4֞����r��2�.j]�Â	�o�����x�'.�N
�4�O�RaU�D�R���Dje�f3TR�YL�����V?� �Ĉ�������e"=���F���<�魡�ZS�[�6!׶�u�x��i0����
3�OX�����^1�k!f���R���
+�*k�F�
+�r
����n���7GM��ct΃qB_9_i�H�F�
p焅�j�H6)#nוz��2F]�3Tڐ
Fv�2�!#M-�cD㝸�EK5�8z�~�o�T]���ڥ�#�l
�d8��F4C��lfL53�
F �ƈ��^�#�f�l�qy����ڐ-�
ق��l$�D���
+nD�x&,'�Fc=Z���R��9����f�8͌�zDk�#Z���m�M��C�
+3�֤�D��M4k�D��h6��1�l7&a�l�59�Y{5�[�55�Y�5i�!Gk�<�8ߛ��ϔq���GrHsH��H��G<=�܌={�Cz�Cz
���#;��;�G���f��塵֣�.�V�/�h
���fs�I5�{ԇ��G5�� F��|
WK-f���7���ȵ��k�[w
f�x�����.���,�h�a�x�h��=T�PI��*�P�6Xj*��������p���MX�뻡ɢ%|.����k`�50�V�hX��&�̄r_w��k�0"]4��#�V��N$��a��0�db���
%�[����-��-l3D4CD3D4S�,{0G��&
_���V+��LԖ���,7�sI���1��،���[�4��r|���df鱜�v#
-�c�%}|ȍC8����c����Kcr_�G|����jpM,�u���ƥ�rbrۧ-c�y
9�!�F�o��7�C�MbȾ	��i2�4]"4N�z�m�siX/4�hX
��T�`Y�{��
M3~��������%�p��a�fa.o��#�
�a��tO����Ru.ci��Fi���3�(�֟�%�
	}�lܭ�+.���xF���a7Z
a�^r,6�
�	C��;&Q3��
���{�?�cp��ݍ�uG��p�cjm�x���M��l+�;]�t��d3��̘jf���͌�f�l��hfԛ���n��,x�Y���جFv��Mk�61:Z3c��;ͪ�4�8�Yݝfuw��K��y(npzNh�
�����ݝ�����
����Z�N�D�n��)����
�C���ͽY��q���{�?�/57�t�oUm�M�q�oU��cU3��=��ܝ�kU���BC�꾋�S�fF���n0�^j^օ`՝KE
ˎ+
>NvB_�ZY*S���э�MʂGf�
k
Q�C�u7�i��ݴ[�w3�����n֭m;9T�vr�dz�e/}3����rn:���Ͳ�-�S�Uՠ1��j�bɻl/u��'��Ƿw`��_3��I��e
F
rDz�R��Р��p�J�͘`9�ץغ
і�.�~l6�@tWs֫�P}��Y
��n��r���
�
�!=�!벜��!㰇 [...]
�g9�ka��_��Az"
*Z�$B��d���

ߝ��n\��w�2ïM��k=��D�6����0Z#D1�h�0Z#Ѹu��[�d3��̘jf���fF��1�̘if�63�M��ph0ƛ�f�D3���ج=�f�i7kO�Y{�͚�n�tv����5�ݬ��fM�4k:�Y+9�Z�i� N�q�5�ӬA���AC-os�Fco6�
��џ]������2ZM�8����<{<�vq#*z���
st�Hp|-j�<�5�FC�d|y�kC�t��u.eH�-��e�@��u{,|ei׿.h�Ռ��Z�&�x��
U<k�˱��V3����43f��͌n#N|�2j͌�fF���Y���RF���Y+i�_$-el� Z�њ5H�Y�$k�!l����f��ڬZ�5Bk�Fhm
+ԬeZ�U-ެj�f�o֭a�
_�k�a�h�L͒DS����4d���!Q��CG}/�A<A��GgGM���S����C��_�}"���5�<�[�x���1�J�_��W�?�.��B�Dۿ/���o�1��n��n2Ѳ�ʣƬ7n�1����F���j�Ujt
�
�^[�DrҤ-�
�
�>4��i���;p�/}ݙ\���?�,9"I���#��%gm:��-V��%�-y��Sn����'׼�Fx�;y�W{�q�bĨ�Y�JnF�6F3��1-�<Ha�
�
A������<������*
L���u�,��7Vrǐ�3w%�+�-�=e�1�
wK}����p{
�
S7���}i}�e�鳾��\u��7.��ʙ�ιp�wB-��	�ɰ����#G'ۨ�ޝ}�ϗ.��^���y|�
+1������^��h�
��E:��~��K6���!GU�A
s�V�/r;�T�����a�+7�,��c�g��'��`~��D���%(eܺc��fc�Gz�5�]y��#=��^+�K�L���:�G\2q�%�,y��c>'�Ƕ��P��
�q�-�6����Z��%7,����[����'��M
�B�4r��ο�z�S���޵��v�:g����o9��ߤ�v��E��KKNg�_��O9r����Wbɒ�N�5����l����8Bw��ڵ����4~ν7��W!@����4�0 o0��L_�#؊,��,R�������K6[�]��v��>�q��]���a�N��v;�m��:�l�;7A��ζcgv���7�=�������ޙ\���
1_*���
�L�`^�1g�0����i�x��6J
�˅��dLo�,��9co�����������FwR��=fy�Q�6N��^]��ՙ@1���aчż=��cR8?0$^"��F�Eƻ��WH��jK�!�g-X��x�P4X��~�D�!ģ�\,�^�k�᭵={A"��l}q���{fO�n��i�--���M�><LM
ι�zꘝ��
���kAc��FC	��n~���E��7��D���-A�G��#mq�gs�����Qڅ��>mm�:4u˲��2�2\����tL�Vm
F�Xtj�l9�L
R�,X�2�}����-��
�lO�������+�j�}�XinUasOaVM���hd�m�p�X��O)]3-������R{�sk
H- ��m�$v$�*HX�L� ^‹�
h��:��K���
+���.�����������
1J�W��27
���?
�

+��2���]����Xpr�9�����w��tO1h���
֢T�x$����DV�V#Y�UE����A��!�X|Ǿ�3l|�����4=��4��V�.��GNG)���=ِ:��xc�s�9�7�Z��.��%��^cx���
	�i��I�Pٹ���`��N��v��{�Y��l2Ɇ
��7!N��x�!������~�Jۗ�a���I/~{{����7A���~��J�L\�]��;���y���/���'y�ׯ����C/�C2{
�
N����
�j�_�z*B�UC����G��eω
+k���se�k�U�Jeju��^�&�
j��W)�W

/q�P7�&JK��]f��X\0����� ]�+�QM�.T�m�Z#�x��_+��Z뜦�hJ�d=�Ȇl�`��V/�5��}�O�c�;G���U/5_9Y��k�/ܸ?��{o`�����w�j��ċ��}m1��z�U�c��;�Q�
���6�,�
+�v�	�޲�H�o'�R)Vz�G_�6K�;����K�����ߎ
�H�\S�Oi�;�džR�P7��c�B$q�l�:��s��'���������߻�2�wO+E|�� =�wj at Kɢ>*
�i�l�}[R�>m�3Y>���;��-J�ҵ̔��?w����	Ɋ��Ч�g��Wy�M�}�uV�*[��'�5��S����g�tNLB�2d�<ђZ�rE�s]:ɺ��)ʏW�ցXv�3D
�KA�9"Dʤ����K��l����Y�Կw���hZم��O�v�s
xE�m|Z�����Y�/�u9�DǠ�;��5t��R�]��N�KD�x�	/���*�7�K8�.2j��4\��82 �yZV�Ö}�-+��W�E�����
XȨ羾�r$(I���h�o�O��S��O|��D
oEt���qQ�\�PDN��M
�[�䡠x Oy�˻xߋop��V�
��ZAQ��h�`�D?O��1|���g����?���
���
8p���
8p���
8p�����+د�0�X
��W���i�#ba� �#
5����6!Ö̬ld��E(������m7=��y�����N�G��g�i~
���{��yw(�s��3j�e�)�ߏM@�e�,�
k#�A��/�� �"T
�RT��#z��Ōv�p/���;�{��hv���< �u���Z�>�oĻ�*}��
��'Ɗ�����C�߇��5��Z�S���Ki@=�2��.�$�!灲����I�
���pط3��� 
��n�k�so�~�[j�'`������ܠe��}��/`�m�endstream
+endobj
+9849 0 obj
+21241
+endobj
+9839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [159.2889 281.8829 329.9276 292.7868]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+9840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.5915 281.8829 513.9963 292.7868]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 269.9277 136.9337 280.8316]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+9842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9832 0 obj <<
+/D [9830 0 R /XYZ 90 757.9346 null]
+>> endobj
+9833 0 obj <<
+/D [9830 0 R /XYZ 90 733.028 null]
+>> endobj
+9823 0 obj <<
+/D [9830 0 R /XYZ 90 716.2211 null]
+>> endobj
+9834 0 obj <<
+/D [9830 0 R /XYZ 90 716.2211 null]
+>> endobj
+9824 0 obj <<
+/D [9830 0 R /XYZ 90 666.9799 null]
+>> endobj
+9835 0 obj <<
+/D [9830 0 R /XYZ 90 652.4096 null]
+>> endobj
+9825 0 obj <<
+/D [9830 0 R /XYZ 90 605.2057 null]
+>> endobj
+9836 0 obj <<
+/D [9830 0 R /XYZ 90 590.6354 null]
+>> endobj
+9826 0 obj <<
+/D [9830 0 R /XYZ 90 543.4314 null]
+>> endobj
+9837 0 obj <<
+/D [9830 0 R /XYZ 90 528.8611 null]
+>> endobj
+9827 0 obj <<
+/D [9830 0 R /XYZ 90 481.6572 null]
+>> endobj
+9838 0 obj <<
+/D [9830 0 R /XYZ 90 467.0869 null]
+>> endobj
+1508 0 obj <<
+/D [9830 0 R /XYZ 90 368.6941 null]
+>> endobj
+306 0 obj <<
+/D [9830 0 R /XYZ 90 362.0939 null]
+>> endobj
+9829 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R >>
+/XObject << /Im16 9828 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9852 0 obj <<
+/Length 3042      
+/Filter /FlateDecode
+>>
+stream
+x��\�r#���+p�FM틎V�!�c
틤`@`�0��j4�^����j����
���U��3�za

+l���(C��z�����#|��
k~^��𷻛��j��\/�>W#hFg|q��Ӓ1"��QJ�o]������-����ק�\�����\�_��&�����a��.�}^�N����E�[��0.�����_�pLmf��f���n~��.
`F��P"�U�/�%�9���H.��o>��+�S�P
0� ��9+��Z�jE>��)��m;���z�~m��ij"�I�L�$T(
��Xٍ����s5�b��`'�P9^&��Z�y�|�}�܃�� ���ㅹ/_���/��۲>�G�$������*�9�O�z�7O��
sJX
C���0�d�����Κ�+��״5DJ�^���,�5���Z���Z��J�m�����^��ۇ{p|||����:3j����I
=�5vF`,�\�
B�,֧�~F��XgT:D" "-,"c"8o��!4�
���xx><~�X�
v��y��s1�+�$;�
+��a�]�/��F�� 6�O�����1
�%��t<}o�����c䷀��m<�7�c�p!!
���

�*�͍͉���s�;>�P�tD9��@# ���W���
3�yu0W��k�A��8sBM�T�"RSqq��K�2O`4ѱQy�m�8�P
J
+k<pVZ
->��ޞo�	�z���T���AP9v�*����nS��+a9,&3��8���:�
.��R��0��v0�H;8o�N̋kG)�_�
-�Df�
+ю2V]�Y�\�	@;�0q�c�N iGj�
8
�N�ϸm<���b_��s]����l�iA9j�A
T��=��C��)
�
��1I�� D8���	'��
+�Nj�dP��>�h��p4V�k��U��]I��r]�K���)G'+2A�5r�,�"k�����'��U��n�����t.v����p	ն��B�MV�ZŰ���m7Z��N��MAah
ci)E LJ-,/%�1�����R���͍Q)�)�pDIP(���d�2O J2��KRP'��0��_U(p��B���3n���A���!�&.R�.�)�SRÔ���L5GI���}��)��啄1FJ�y��b^\I�r3)���؟��}VK����F�`�(І�kZ!��2O`�Nj�z8?e#��t4tS.
e
6
�ҭ|?
*���c1�'���[(a�?u��E�b�D<		�>��h�:��3tġNU&��0
����0�HG8o�Q̛�Dؕ�ZG�kr*'Q��E�_�˺�.M��"h֮�pc�
���fl�����pC#��p�,
��Ϧ�7����S$�0y���<0�H
8o�q̋�F�կU����~����6G�0W�H.�y�tS�l��6:��6�
+����h����������X�|d
k�8���;iW�A��|!�%��D#ТV1l"�4�E��F��T�$����&B
@�`Y!����2���z��z�k���0v�^�H�f�U�u�����*#�f�"�J�FJbDZ=t���q�x\|��k
��*��
�(�N��ո6��hӻ1 �F
�kc����	Ǽ�6�
��WhC*=qK��цS�*m�.ˤ�mH��5;�
�HP�@:8
�F�ϸm<.�3]I
�Z3#Ja��w�qi at a'K��1 �F
�Kc����	Ǽ�4�y�._۩�!mR�H殪��	�	B`����)äz���p�W�2|�k�q���X���Kk-�_Սw�>d�@e�sH�Sm~
ZŨ�._-���S�
A)��L��1 P
�
c���ż���c��W*Hr����	a��p����q"�le\��w�|�.�s�.�t
Cw�
,��W��*��_� �
���ľ���s��ӢrF8���}#f]��f�hf�

@�`Y����^2�a�c^\/B)�z� ��~���
3���0��2O z�L]�q�]���z��
����%: s\
�_�I��:��e�
��E�lp�(�6�a�eu�a,��� L.-,/�1�
�V=���i?qk�j�ˬ���H��4d$%��
+c�^�	�Ti���$�tr�(�r���(���%: s\
�J4_�%�
$i����QziP9#�#V�7ʱ9���TZ0 L
�
c���u�y�
eN�t4���-e��k��R�!�C����2\ IX'�\'�\B��}��sr���g\6
כ�[�ز]7K޿
MŴ�c&�r����$9����ф�(3�f4��M=zT�'`�iay�`��~pޠ��7�Wf�[�Yɦ��
�ʮ�H
����O��Ϭ�x��%�����d�P
$�s
�ӷ�,~{ٖ���鸆L�^~��
w��
rE�s,ݴ� $�,�(c��6�{�o��c�A9�3�����1�?�!���p���P�SI�'���G
������#�}��8M��J��]Syψ�k(�e�;
*
]
(i���t�ܶ��
���	x�j5��N�Mv���¦(��װ�v�'O������`B}�jmTu7��
Ux���p8��5���Mg1@���D��4�M=�9^����#�5�S?����S=�}k������
+��h�H8X6
Q�. 3�mD�x}u�P|
�
ŮQ�t���s&
G��]��"��7�b|5���p��e�D���Ό�~�e�Q=37C3'
3�
1ܩ����t�^�)&�4LC_�U;��\�K�Ӗgy;#��ex��8�0?�������ˮ(۠�&T}:|n��0i�g�􉌃��#�
��OE�3�˲���(x�ie^����|_I��`��y���ϛ	�_���LU�h�m_lQ�ۼݢ��ߧ��˭R��u�\�_���g���U���z��α,��'+R�b��G���
V�T���E���d�����&��h\?�������_�|!�y�o�%ٞ����G��
��;�c���H
��[~Iy}?Vl�g�����
��
�=|�[�Wl��;,Ǧ���ڷendstream
+endobj
+9851 0 obj <<
+/Type /Page
+/Contents 9852 0 R
+/Resources 9850 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9902 0 R
+/Annots [ 9858 0 R 9860 0 R 9862 0 R 9864 0 R 9865 0 R 9867 0 R 9868 0 R 9870 0 R 9871 0 R 9873 0 R 9875 0 R 9876 0 R 9878 0 R 9880 0 R 9882 0 R 9883 0 R 9885 0 R 9887 0 R 9889 0 R 9891 0 R 9893 0 R 9899 0 R 9900 0 R 9901 0 R ]
+>> endobj
+9858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [466.0663 671.3444 513.9963 682.358]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+9860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [453.0151 646.5723 496.5214 657.4514]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.0815 621.5312 495.9043 632.5448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [462.1912 596.7591 513.9963 607.6382]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 584.6694 145.2424 595.5734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [463.8747 571.718 513.9963 582.7316]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+9868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 559.7628 145.2424 570.6668]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+9870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [462.1911 546.9459 513.9963 557.825]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 534.8562 133.0584 545.7602]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [466.0663 521.9048 513.9963 532.9184]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+9875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 497.1327 513.9963 508.0118]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 485.043 160.1764 495.947]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9878 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [470.49 472.2261 513.9963 483.1052]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9880 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [472.1735 447.185 513.9963 458.1986]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.7984 422.2784 513.9963 433.292]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 410.3232 134.1543 421.2272]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 385.4166 191.7375 396.3206]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 360.51 190.054 371.414]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+9889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 335.6034 198.3629 346.5074]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.3256 322.7865 494.5132 333.6656]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [360.9903 297.7454 426.6335 308.759]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2787 180.1211 192.2956 191.0251]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.7937 180.1211 258.7257 191.0251]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_5dfef947c46e234a1ffd4707312332ec) >>
+>> endobj
+9901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9853 0 obj <<
+/D [9851 0 R /XYZ 90 757.9346 null]
+>> endobj
+9854 0 obj <<
+/D [9851 0 R /XYZ 90 714.3182 null]
+>> endobj
+9855 0 obj <<
+/D [9851 0 R /XYZ 90 714.3182 null]
+>> endobj
+9856 0 obj <<
+/D [9851 0 R /XYZ 90 701.6059 null]
+>> endobj
+9857 0 obj <<
+/D [9851 0 R /XYZ 90 688.4153 null]
+>> endobj
+9859 0 obj <<
+/D [9851 0 R /XYZ 90 663.3743 null]
+>> endobj
+9861 0 obj <<
+/D [9851 0 R /XYZ 90 640.525 null]
+>> endobj
+9863 0 obj <<
+/D [9851 0 R /XYZ 90 615.6184 null]
+>> endobj
+9866 0 obj <<
+/D [9851 0 R /XYZ 90 588.6545 null]
+>> endobj
+9869 0 obj <<
+/D [9851 0 R /XYZ 90 563.7479 null]
+>> endobj
+9872 0 obj <<
+/D [9851 0 R /XYZ 90 538.8413 null]
+>> endobj
+9874 0 obj <<
+/D [9851 0 R /XYZ 90 513.9347 null]
+>> endobj
+9877 0 obj <<
+/D [9851 0 R /XYZ 90 489.0281 null]
+>> endobj
+9879 0 obj <<
+/D [9851 0 R /XYZ 90 464.4951 null]
+>> endobj
+9881 0 obj <<
+/D [9851 0 R /XYZ 90 439.2149 null]
+>> endobj
+9884 0 obj <<
+/D [9851 0 R /XYZ 90 414.3083 null]
+>> endobj
+9886 0 obj <<
+/D [9851 0 R /XYZ 90 389.4017 null]
+>> endobj
+9888 0 obj <<
+/D [9851 0 R /XYZ 90 364.4951 null]
+>> endobj
+9890 0 obj <<
+/D [9851 0 R /XYZ 90 339.5885 null]
+>> endobj
+9892 0 obj <<
+/D [9851 0 R /XYZ 90 316.7392 null]
+>> endobj
+9894 0 obj <<
+/D [9851 0 R /XYZ 90 291.8326 null]
+>> endobj
+9895 0 obj <<
+/D [9851 0 R /XYZ 90 276.8239 null]
+>> endobj
+9896 0 obj <<
+/D [9851 0 R /XYZ 90 263.8724 null]
+>> endobj
+9897 0 obj <<
+/D [9851 0 R /XYZ 90 197.1921 null]
+>> endobj
+9898 0 obj <<
+/D [9851 0 R /XYZ 90 197.1921 null]
+>> endobj
+9850 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9905 0 obj <<
+/Length 3087      
+/Filter /FlateDecode
+>>
+stream
+x��\]s۸}���Sj�T0�?ҷn��l�N��O�
�,�6[}x%9
����$ �� *�ҙtvv"KG�
\�
^����db�D	�
�r2_]������4O��i�����;)&I��澊 	�����KBgWS�1��xE��l���~���r�|},���_˻�l���m��ї��Ք
+|��r���/?�E�Y����K��կ7?_���SmF"�$��o���'
��1������C'�
N��cy����>N�A����†T�2��`UE>>�-�y=����S�~������z�
�2�J)'
+c�
�}D䣐 �O���L�]�sD��L�o?�����l_��Ӧ��o���Ey��`E��g~[c���H�*�
�GMCX5 A��$�qx�
�?)��� ��J���h�kl��>4}
+�Q��!Yr
,�(W�z�ݿ>
�� �I�%���2��PD��
M��x�f��ֳm��g�ѣ2�d�qnZӈ��I���(�}�*�K��q�I�!ɵ>"
����v�G�'8J^��cP�
��Y��������F��Un�[�)��M�����Kp��fW��0��L��Z#%��k�Y��� �$V�,w5&�L�:^Rd��^R�Hm
+��0�I�SĄ19�;X^�A��O�s�
�x���O��y��+���J��JF�|�
�ab����l��t���I
#�C���T(�JM@� g�T0!5�
�E��}=��W� 
��K��U`�l�X=�_��Xx�����ckHm���l�Yk��R"�i8�@=<]�N�fyBQ/϶��Y��0
hR�c�A.� FUDe�;]�}GC�N�49�!c��T*g��7� `7�C��:�
��{7H*Zy�ۨ��t�Z
+?Y
+�Y���~~��U�A�@�+�.�GeHPj�ET��o:I��ل.e`
<>���OCU���
ՠ'.3���r�5C�����w��C����
s 	c$� 
v�S��+&j�b^qY�!(�œ��4�)!3��aYC&
!��1�(m��
!à�4CH��`i�"�
a`
��I߉kӯ�u�*�S,n���k��:xT�cv'J���d
B��
�[�1R��`���i�^��c�j�	[���z1[����0�����(Қ�8X�T��)SI�u��͘J�w���t�Z
+�u���7ۣ�b{~&�U�

+U����C��H8Qzh	<>��צp%��
+,P疀G�k��ƭ��d$� B�e$A���8�iF�`��l=+C��Q�w�����ȳ�7�)͸��e]!
�p�L����iW��p�
�Nܓ\!Y��+�9xW�8
w��%8�B&}'n�i
���0X���Q
�!�>��	��5�e��c$��þ�?��o�D $���.����;�0Hgw�
*�/�pc���̜��L�a�l/�
�?ض$E��jVY����u����4���:����`8��Ln{�^#���Yr�Hs=��e�H���:��
�
K���lY�_�1���_��˝�7-�w�����ԛ��m�C��R����R�4�`y�G�<M��<�6\�	��
=I��it�L�
��Z�I�S��a#Ce�d'�
Coř�� FJ�鞩J�L�{��ս���{�n��ꫡ�-�_�+�
�ֺ��c�
X>�9�4Z�A��
�za�f�!à
��i����싽,��[f��U�RQ
��: ؊f���VHQy�K8L	���]����:`�\���ߖ��!g;\s�$;�Һ�}5ʺO���Et,��~���Ֆ$:��
Ji��c�"r쾳���H���
�{��嗢>�H��@}�n#�	��c��r .��)���
+
�V`��S`��D&Ȟ��$ۃC���@Z��A'��$>Ey�Q2�ٻH{^O#
Ga,G�1�������Hx}/��ň)��rbt�����Ř&��r��Y���Y��b9��ݵC�p0H
*Dh��Y�
Q�6
o�ư��0��9��
8�h{�#��WrT�^\�V��up�
�N���pׁ`Q	#�E�Lv��
v����̇���&���&�	���{���C����
7˅?�+�/E�n}��݂�Es
zw�#��������K|ݵ'�T�I�� �1et��*+���A�HK)2nJ�����-T˺ip��f�5��[��ڤ�T�����_�.�d��
Qͻ)�r�M� �����<&ݔ	�J�vS����č.|u/�ؾK�t
<*�ܚ�����<
6S!]�2� F�L
�G6�n����4
F�)�D�h3�93��kLs��xX�L����4MΙi�mxk�"zrk�f�q�a�i�fКf��4��lk'Кfht�Ɨ���BJ��j�@���:�*��f>�L)��ů�o3
b����~��4��VE����])6�:�8{WJ
p#�k~��� \ⶡt��Üw�Ͳ{�
�� q��-C
<��
�~�z
��T�U�a;P&���A4�k}��
@���Bc$��a���"5�Oy�A5�����1���z��z��+(�$�z�k���3��&
+4�{�m:8�B+�v�����)��:�i�:��r�@'n#��ui��b��b��>kj
Kd�

(G��e%e���Țk$%
u2�H���~|Y۩,n۽���vG�e�r�yX^�A����y��ôimGi�h;M����~3�y(�%�P�(��Xt)
(C�r��z��	��ƣ
�	c���`�/��W��w�"�	��E}i��nW���
2���@����Q�In�á���KXB:i�aΤ!D9�A:{;j��r���}��~��^u�j��&��Ai��ǿT��G�)8A��+��g8���}%{<��P�
+��:K߁2�u�;KQ�7�4x"
���
ቬ�Z��_��~�Kj��[
�Kd�ͯP9����'��V�v��+c�g��\�����]	q�xχ��y�<�{��L[
P�Oۂ*[ t�Ǘ���o�`M��J�����W�'���4�F�sV*r'nu��~��������w���-*��OO��6/�흣��fo�A
.Q�9�H*�#.��rW�m3
��\U�F
���5�C忡-�endstream
+endobj
+9904 0 obj <<
+/Type /Page
+/Contents 9905 0 R
+/Resources 9903 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9902 0 R
+/Annots [ 9909 0 R 9910 0 R 9912 0 R 9913 0 R 9914 0 R 9916 0 R 9917 0 R 9919 0 R 9920 0 R 9922 0 R 9923 0 R 9925 0 R 9926 0 R 9928 0 R 9929 0 R 9931 0 R 9932 0 R 9934 0 R 9935 0 R 9937 0 R 9938 0 R 9939 0 R 9940 0 R 9941 0 R 9942 0 R 9943 0 R 9944 0 R 9945 0 R 9946 0 R 9947 0 R 9949 0 R 9951 0 R 9953 0 R 9954 0 R 9955 0 R 9956 0 R ]
+>> endobj
+9909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 675.6991 190.7379 686.603]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 675.6991 261.8505 686.603]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_43cd840b1ec99350c222b3f217739cea) >>
+>> endobj
+9912 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 639.2069 190.7379 650.1108]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+9913 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.2361 639.2069 262.1594 650.1108]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_97ddb3b93ac699eebaca7e79f691b0ad) >>
+>> endobj
+9914 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.2253 625.7672 390.0817 635.6724]
+/Subtype /Link
+/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >>
+>> endobj
+9916 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 602.7147 226.4434 613.6186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9917 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.183 602.7147 282.3429 613.6186]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7b8d597a3c23af1fce9d8d3e1d36e11d) >>
+>> endobj
+9919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 566.2225 226.4434 577.1264]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+9920 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.183 566.2225 329.9438 577.1264]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b7a35f8df974c9e932df6291754859fb) >>
+>> endobj
+9922 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 529.7303 224.7599 540.6342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+9923 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.4995 529.7303 278.986 540.6342]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_2bf7987a6ee3547c1e125e83e432ee2a) >>
+>> endobj
+9925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 493.2381 224.7599 504.142]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+9926 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.4995 493.2381 326.5868 504.142]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e1c5216e2ba5c80d77e128daea25b46e) >>
+>> endobj
+9928 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 456.7459 209.5473 467.6498]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 456.7459 261.8309 467.6498]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6fb94f0e966e97bfb9dcf43dddcf12ba) >>
+>> endobj
+9931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 420.2537 209.5473 431.1577]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+9932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.0454 420.2537 309.4317 431.1577]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c6ea1802e6a6cfb32e5af6d6d26eb424) >>
+>> endobj
+9934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 372.8026 224.481 383.7066]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+9935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.9792 372.8026 289.4966 383.7066]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_cb75fd68aa10bd15e590e8e8954c5002) >>
+>> endobj
+9937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 336.3104 224.481 347.2144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >>
+>> endobj
+9938 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.9792 336.3104 337.0974 347.2144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0d69bc8c9bd9843262551c7e3e33f5a2) >>
+>> endobj
+9939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 299.8183 205.6917 310.7222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9940 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 299.8183 261.3124 310.7222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9f3c5474494eb306717bc3da7c109307) >>
+>> endobj
+9941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 299.8183 332.1558 310.7222]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+9942 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 265.1338 205.6818 276.0377]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >>
+>> endobj
+9943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1799 265.1338 261.3025 276.0377]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0514c2e57ac8154666e9fe6bb56c0e18) >>
+>> endobj
+9944 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6396 265.1338 330.4624 276.0377]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 230.4494 205.6917 241.3533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >>
+>> endobj
+9946 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.1899 230.4494 261.3124 241.3533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6187dbe974649c7bd4de8e66f70d3e46) >>
+>> endobj
+9947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.6496 230.4494 338.7813 241.3533]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+9949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 195.7649 183.8239 206.6688]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d909d5b60cab5d1a6816577c97b60fcf) >>
+>> endobj
+9951 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 159.6463 192.2722 170.1767]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8c33b9ea975535b5aa0882241cf78986) >>
+>> endobj
+9953 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 122.7805 241.9353 133.6845]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8ed700f662722cbebdc9328344ba2839) >>
+>> endobj
+9954 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 86.2883 213.1634 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c251eb38d1b24b8b570d874ee11df424) >>
+>> endobj
+9955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.5006 86.2883 288.4306 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+9956 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9906 0 obj <<
+/D [9904 0 R /XYZ 90 757.9346 null]
+>> endobj
+9907 0 obj <<
+/D [9904 0 R /XYZ 90 716.2211 null]
+>> endobj
+9908 0 obj <<
+/D [9904 0 R /XYZ 90 690.6851 null]
+>> endobj
+9911 0 obj <<
+/D [9904 0 R /XYZ 90 656.2152 null]
+>> endobj
+9915 0 obj <<
+/D [9904 0 R /XYZ 90 619.7231 null]
+>> endobj
+9918 0 obj <<
+/D [9904 0 R /XYZ 90 583.2309 null]
+>> endobj
+9921 0 obj <<
+/D [9904 0 R /XYZ 90 546.7387 null]
+>> endobj
+9924 0 obj <<
+/D [9904 0 R /XYZ 90 510.2465 null]
+>> endobj
+9927 0 obj <<
+/D [9904 0 R /XYZ 90 473.7543 null]
+>> endobj
+9930 0 obj <<
+/D [9904 0 R /XYZ 90 437.2621 null]
+>> endobj
+9933 0 obj <<
+/D [9904 0 R /XYZ 90 389.811 null]
+>> endobj
+9936 0 obj <<
+/D [9904 0 R /XYZ 90 353.3188 null]
+>> endobj
+9948 0 obj <<
+/D [9904 0 R /XYZ 90 212.7733 null]
+>> endobj
+9950 0 obj <<
+/D [9904 0 R /XYZ 90 176.2811 null]
+>> endobj
+9952 0 obj <<
+/D [9904 0 R /XYZ 90 139.7889 null]
+>> endobj
+9903 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F99 2085 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9963 0 obj <<
+/Length 3444      
+/Filter /FlateDecode
+>>
+stream
+x��\[o#�~������\�/�ЦI�\�m��KZi�V�������3C�3

�W�X,�$�u朏�<?rf�f�a3GgF�Գ�������>c��/�����_ߜ��J��#Ns={s�xЌ(������sƈ/��������f~��������Z��߭������?O�|���n{�+z��z^���������.*�
@Թp��7ߜ}�&B�Z��f
��~��ΖТo�(Ϊ�=|��9�g�3�E��>�����O�Cs�XB�cDh��$V��#VL-���c.�P�[.
�j%cf��YȬ�>�LRµ�h���cu��ok�|�	��
h�P�x����j�zN����uF��6�����ۮ�O�Ss5�,�\b�f����T� �DSc��U]����~�"���jm
F��9����B�󪅿\��ޭ�2
'�3��d3�8a�֧w�`p�3Г�8f�x/SI�
z�������xR?��Fp;�fMf9Wcț���<n�*��P��a��v�,�Ԅ;�a�O�w�͏)�`_��mFd}	]� [...]
+�
�)1�;U�e� Z���� ���;�RD���Vu��E[�0 �:?^��h`b�O�_F����Dz�˷3c��x��f�˷-�~�	�[ �������v����	p-��`U��$�iQ
����U:N铪7�Uo0��w��/
���M�wR<���#Z��gn�q”�9���9q��3
7�s��^�)����zPC��j[_��j��]�����j��
C��#Z�p
~r���S�������9�w0�h�;��͡����ׇ�����0����_����c T�k�!�{��\��0�
+�͊��:D
+��+�^X���a'~@�����o:=���e���Jѭ�-� �P�cBQ�aS��K2�
�?/c��\�߮��

+h�x
+�U 
:H�v} w\A��|��w��)|��@�.��|�g�
����#�%�26*���
�TV�1N��-V����(�Dgt��6�s���J��SO��Y���q�aq>셝‡8��o� $m}y��m.�ow~�����p
Jg
��hU �uz�
@��t��:VO�I�/���z�A����_�v���z�������02�U��8�Y7񢑥 a2SJ�w�IL����2���1e隼��-��eܦ��
���U���~G��I8w2{�{zD��3���3q��'
7�gg�^�)�����m��yms�3�!ݍf"Z�x�tiZ��i����`^�0�:�5�`x
�U� �RV
F��Y�Z�aT�Ě��5��Gʚ� �K���?�n�)
�����ISª�U��`U���
˜xЎ0Ә���G?$ʖ޺{�����[mV���V�\[��9�š��~���� �rjbӣ9�!�:���=��F��
+�im�]y�ob}�13
�
���h�ɼz _�+?KB��Ū��[��SL���Ft*�����f9�P�j;1�
G�y���$3�(�Q�ʅr��`��̶*҂�{���f��)��ؼhj�v3uJ�~gA;yʔ��@��hV�R�'�Ҕ�e�jX7�‡nJ�OG��A��>�u��n�nw��C��9<<b�chN(S�8�C�A�ǹ
�$s�������]4��O���ڇl��_��ˮÐ�O�v�V�ݼ[��n�v��>��oo��@n�r7_߆^�=���
�%�(��7L?���P!lIR���H
b��TE���t
~�u��@[�(-��Q[�2^���
F�����E"0pQa� �J�i	I4�%��D��%$�8��3z	)	�i�H�
+"��D��e"8��6�L<Und�c�� �����^��^0Rڙ_��j[���>/mh��C�cXK������ҋ���d��'
m�IZ+�i�`�Ik}�Zﯵ�
�<y���x]u�:�=3
EʤzʞU�l�6��4ު
�{��,����QQ���OF��Ǹ�YQ���W��	�^�q�g�a��"ʯ�/��6�o�=��@���x�;�RdP~\31H�q�g���8&& �`�~'+?��D0*Ap�h��(�>K��-S��
Xr�u'��,��hUa`�`�,^��W��ϫ�陈��߉�O+K��V%@�F�f��>�mO�a*dž����m&�}"�9�I��"}�YY���	�>��|h�|(�|��H����
�+zL�@��ۡe�9*}
o!a��Q�E�(T��8/��֗�i;L�K���/4�7�J7��YYh$1���
B#
�
�^�)B���$4жG��G�B���И��Dh�0r�OX&
�!
+��T�1-
��@��~�(4�|$B�F/!%�1-��@A�~�(4�L$B�F���
+��
&�����@�����Sg�2�`l�i跰�d��F
`dL�U!�߈���~��;L�ZXS��:Y�Y�������Kc���#�r�G�,q���,���9P�T_4+
+��!"�
+q;��
�>��;�����o�հ��
+`�������ä�|�`T75Ѿ #��a��^p
�z�n��	
MB�*E��A^<L��� ��J
=`�Sk��
9�*�`r^	�o����19x���g_���jL�"��2�%1����K��T�
;��p �_��>�W������q��2
�B�*��
�4f����'�V۩���%���Y�����`U�k}Ǥ�G�cC5��Zd�#�`��R_(���cD�מ��Ӊ�9��|v
�O7A��^
�fE
L
"<X���`/,ʃ��x�  ����m_S��K�x��U)��-l�n ����໮�^��Y
���9in]WS���H�Nz
0��C4k�� �?���:p[��u����ww���
Y2��ê��<l�Ĵ�R�*|̿�΍�z|gz�+qăs�9�ڔ1���	��
��O�O7�E�п�6ն�Km��n���������]�����p��W�����CRá��;��~�\]=
r>r
�0�,dO0jJ̒�a���̂�}d<n`�4�]���r�]�Sne�ƾ"�ۜ�\^��'FVv�VR0D�4D�Naz�z���
+KHB����`^�0��nM�QD9[Ѫ�X�d?��EâG)�R")=�Y��F������r�?fj���
+xw5r��aD��F���(
)y�
�z��
Z�G�����������zw۱\w.Rc�������������=�����k���(�@��c������hZm�a������q��dZ�@�7�$�j��FQX�t_��i�/��I�OJ��a���λ��'�=b�87Tz���i�
:���TUc�$�U,l�����,|���^j.x�\�N�&ir��7��p���ի��{����vu�'�ë�����
ԛ�F�q
�8eXz闔��٥X�v����΁?n�~��ƣb�P�%T�
endstream
+endobj
+9962 0 obj <<
+/Type /Page
+/Contents 9963 0 R
+/Resources 9961 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9902 0 R
+/Annots [ 9966 0 R 9968 0 R 9970 0 R 9971 0 R 9972 0 R 9973 0 R 9974 0 R 9975 0 R 9976 0 R 9977 0 R 9978 0 R 9979 0 R 9980 0 R 9981 0 R 9982 0 R 9983 0 R 9984 0 R 9985 0 R 9986 0 R 9987 0 R 9988 0 R 9989 0 R 9990 0 R 9991 0 R 9992 0 R 9993 0 R 9994 0 R 9995 0 R 9996 0 R 9997 0 R 9998 0 R 9999 0 R 10000 0 R 10001 0 R 10002 0 R ]
+>> endobj
+9966 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 698.4091 189.9009 708.9395]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0d9abbf681b7b0724963d97596286ae5) >>
+>> endobj
+9968 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 661.7117 193.2289 672.242]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a0ac997a15935821583174de968e5bff) >>
+>> endobj
+9970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 624.6406 238.4586 635.5445]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_bbb7562de97ccf13bd97b57bb5e3ac94) >>
+>> endobj
+9971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 588.3167 187.6893 598.8471]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e3be29eddce8f41019e7dcb731c8ba7b) >>
+>> endobj
+9972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.505 588.3167 226.6926 598.8471]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+9973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 553.156 228.8952 564.06]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f740303d5461c838735ec53c5c1f8855) >>
+>> endobj
+9974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.2323 553.156 333.4819 564.06]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 518.369 229.5026 529.2729]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_31d70a625e092dfdaed4f3232701f35d) >>
+>> endobj
+9976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8398 518.369 334.0894 529.2729]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 483.5819 187.2643 494.4858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c5c7acc50141a9104ef5b9b7598c1438) >>
+>> endobj
+9978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 483.5819 293.2128 494.4858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 483.5819 371.1477 494.4858]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 483.5819 455.7274 494.4858]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.9798 425.8807 187.2643 436.7846]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e680437fdc213b7174c581caa2e0c0d3) >>
+>> endobj
+9982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.9632 425.8807 293.2128 436.7846]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9983 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.1308 425.8807 371.1477 436.7846]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [409.7105 425.8807 455.7274 436.7846]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2349 413.9255 220.0576 424.8295]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 368.1796 186.3482 379.0835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d914801461cad05325559e95b9c4d9c6) >>
+>> endobj
+9987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 368.1796 293.7723 379.0835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 368.1796 373.3671 379.0835]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9989 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 368.1796 456.8371 379.0835]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.7175 310.4784 186.3482 321.3823]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6e73a7d462d6a9a3891fff6c4a923495) >>
+>> endobj
+9991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5227 310.4784 293.7723 321.3823]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+9992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.3502 310.4784 373.3671 321.3823]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.8202 310.4784 456.8371 321.3823]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >>
+>> endobj
+9994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.581 298.5232 218.4038 309.4272]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+9995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 252.7772 180.4964 263.6812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_5df26655af3ae7844569d7086edf8332) >>
+>> endobj
+9996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.8336 252.7772 255.7636 263.6812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+9997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 217.9902 213.1533 228.8941]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c2182f38e9f8acede601c3dcfa71c3b3) >>
+>> endobj
+9998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.4905 217.9902 288.4205 228.8941]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+9999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 183.2031 161.6774 194.107]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_13f15417d90174f6c2d3648e83d9fcf5) >>
+>> endobj
+10000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 110.5312 205.7516 121.0615]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0a5c586d872f15baf7fd70941fc16c41) >>
+>> endobj
+10001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.0887 110.5312 276.595 121.0615]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+10002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+9964 0 obj <<
+/D [9962 0 R /XYZ 90 757.9346 null]
+>> endobj
+9965 0 obj <<
+/D [9962 0 R /XYZ 90 715.0952 null]
+>> endobj
+9967 0 obj <<
+/D [9962 0 R /XYZ 90 678.3978 null]
+>> endobj
+9969 0 obj <<
+/D [9962 0 R /XYZ 90 641.7003 null]
+>> endobj
+9961 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10016 0 obj <<
+/Length 3522      
+/Filter /FlateDecode
+>>
+stream
+x��K�����)xR�@���o��p@���mw�"�%7$ee��SMN���Q5k.et�S��Ou�o�3b�៘>sƱ���-������J��o��Mi���W/�b�,�`���~w�`3R�����B0��o�|��Z��bw�x��Z��v�����-��m�v��=~�U��������F>�z���O�k�5�c�fـ_b�*��^{���Yj{&FY���ꇟ�����+�T�f���L� g�WZ�������d?��
%Dsϼ�~v�4�~>d%�f�)	ɓ�qktN��E�p�J�g�,��G)M��L��f��~�dEŕ�� �o��u/��L#:a��]k�]) �Sz~������v�?�����bs��~�Yݯ��t�IkY�B���V�
i�Z�in�QM/v �nrN�9���5j�:g�+B)ǜ�
O@�"�+�!��u�Kȁ�ViP*�G����B1���σ�T&�
 ��q���̃,�O��Z-?����p{��aq�o�}x<}ھK�ļ]
3O� [...]
��:��~8Lelm�����4�yϩ:2�Ѱ,
b���&X�a�:�;��$���@I��p�Y��td+B
�0g`�P7�x
��	�LMJ��d����T0�ђ�A�"�+%��NQS
�:�Y�d��f2�BM����YT*ls��JիwdQ��hN1N�q'˰tQY��RT�"z~3+w+����\Q&m��ɊP!!�+�i�QFE��fj2�=%����Ș�qP
+
����Dd+B���
F���������WT�V�p2
2�YT���=�n�����a�v�^
Zl�7P^ݎ����������,��lFr�t�p���r�
+��Ku�	�!��w�x����d+B��ѕ��t�b
J at g��L�L�'d��N ��
��h"���C'
+��6Ӊ`
�c�5���!�E��5���~�ֈ7}eRAr�}hF�h�xZ
�6��m�=�p0�j˩��!�Y�!ߞq�~�n��j��Dk� � ���
�V�	��Ɍf`�c 
71�
K�Bu�	�!��X�����؃;����i�V�	M
u'��u\zN@�OLD��d����cI Z{M��lEE�,�U
��-''�Y����\k5}ѡ�Zw��2y�94H�
�i�8 at B@�p�BC����g�C���E��-߶�&^��Y,��r���
�͡�m�X��!-
k3�n����
+#.OT��&��dF�p����Z�ū�*씪��ۧ)^Q:Ō�
�G�"�H�0�t�a���n��L�J�'d���hUF0�"[Q�a�k�but�����y5d��k2+�jN���t5-]-IW[h
R�+�����Ī��+pGO��մt�]��1�ږ�9�5][��+�Z̏} Z��pD�$��=�'L�i��]
��z&�N
�ٌt�4�t�,y��J^BD�o�;���9��lEH��1�Lu�?����pqL�D��d���[m�|����<
A�\d+BD�&�
Ǖ��=�gm
ӊ�s�\�@���>�Y�#<�'>�O����N�:�`◫���Cf���!�
+
�;����.KK'��A#k&°8W{>�5��2C
�1z�x���
+]�i/B
ש��Z�M^��
X
�Z��R2�����h�1��qW˰4W��S�����M\�5��	����v
nmDR��Gj���ʺ1�G��@�49#ٞR��;��2Nx��!["�p�F�s�|�y��Y|-|`|Mf��B��wb�kf�D!Z
��͌�)ӳϿ[G�%��8.����@��ٌ�e��%��e�'��N�' �����D�_X"!ي�'�l՝��(�
NAOMK�'d��N�3q ��"Q\��(l-��et.���в��2�M���n�1	R���+\Y͔t��4��V�R�f6��Y8�Љ�M�,����NA'.�痪2Q�*(>�8�xv�!N�Y,/u�UJθ�.BSӓ�I]���d�6D�%"�)W��ABg�:��,}`Mf_J�
�R��
E��լ&��dF��p����HY�%��u�	crBD�oo[��T��.�$��lE(��N�]7��S�q6�NND��d��V[�Gg:9���HF�%$
 �V�⎀"�Y�B�
(>0(&��\
+K.Se	_
)��` �Fwh��H�i����)�q֗�,cfl��u�QzB��
ϲ�JAi88biHAN{
j�
J
=�'�p$}�o�'`��H���q[�VaI�֡'����;Xz"d��xN�!G��xRv�
�o
w�	�� [...]
+�Ɍ�g��'
7��
�����섀��~J<���F�9�q)�n��ۧ�'f%�S2z~'��I�D�D2"ĹD!����<>�x�dg�cg2{�d瓡*�(מ;���P���>�Tq����8�79��Ɍ�h��(
7q�
�s�
+;�����_� %�>��	���d+B[
K�C�Q�>�
����I]��x�39g�,$+JC��yYk ��%����|�>0�&�/���㦈OwX}��S�X�j���f$7K�7��-7����=a�N����o����*��
+<ي� !��C���I3㍟��lO�������
��0�a{kE���FYS�x�$H)�E�yӡ���٬ ����өT{�Gd�45	_���xdt˧S�E�arzf����������Bܪ:�����p-�#'��-�p�o[�zK�S#[����c��
�����6�'>%�a^|�7�A
��lF�p����x[�E��:�:���;�Zb{��o��xB��z2
���ۛ��t"LMK�'d��N�L���^��ZQ"�q>W"h�J	}��׹�>0�&�/��m��YJb
[[^��>�>��
:Y�|.�!xƃ�t.c��pwB-�+�z
�A5Z�7���KG6��@�
�mj1ËX�N�s�ͩ�
�Ӑ�e�
��d#\���x�u��q�3l�
����Ɲ����έgN�{d-
N��M�ID��:]������}
�W�5�?�w��������ژ4���b�a�>}���st�����"��ִ�]#�i�'n���
�������t:��Y����
�n�_�^��S���'��px���ˏ?��}ج
vlux��~�ե�3�q�(�z7٨��J��Y_�Qhy�ݵT��4]_�/��RوA)�B�endstream
+endobj
+10015 0 obj <<
+/Type /Page
+/Contents 10016 0 R
+/Resources 10014 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9902 0 R
+/Annots [ 10018 0 R 10019 0 R 10020 0 R 10021 0 R 10022 0 R 10023 0 R 10025 0 R 10026 0 R 10027 0 R 10028 0 R 10029 0 R 10030 0 R 10031 0 R 10032 0 R 10033 0 R 10034 0 R 10035 0 R 10036 0 R 10037 0 R 10038 0 R 10039 0 R 10040 0 R 10041 0 R 10042 0 R 10043 0 R 10044 0 R 10045 0 R 10046 0 R 10047 0 R 10048 0 R 10049 0 R 10050 0 R 10051 0 R 10052 0 R 10053 0 R 10054 0 R 10055 0 R ]
+>> endobj
+10018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 720.2859 267.9376 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1c64e09d6022054690f7d2bdf4e02138) >>
+>> endobj
+10019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [295.2748 720.2859 338.781 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+10020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 685.3197 204.0781 696.2237]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_5d53d09dcc839672fedd4ab5d4142d57) >>
+>> endobj
+10021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.4152 685.3197 273.238 696.2237]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+10022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 650.7273 266.2641 661.6312]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_ec640128c6492defc09c4d6ad5d3ea19) >>
+>> endobj
+10023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6013 650.7273 335.424 661.6312]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >>
+>> endobj
+10025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 616.1347 225.1091 627.0387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_586324b25bc2ab1b32af4440afdb9e11) >>
+>> endobj
+10026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.4462 616.1347 317.5116 627.0387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+10027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 579.8265 287.2951 590.7304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_aceb67cef4a0d79b9a80bf214ade8132) >>
+>> endobj
+10028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.6323 579.8265 379.6977 590.7304]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >>
+>> endobj
+10029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 545.234 212.377 556.1379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7df62db3bf13024d4ee9f8aaf0d27dc6) >>
+>> endobj
+10030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.7142 545.234 289.8459 556.1379]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+10031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 510.6415 274.5631 521.5454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_eb30e6558c9efffc62d5765b3bfe5e4f) >>
+>> endobj
+10032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [301.9003 510.6415 352.032 521.5454]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+10033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 465.0901 209.6269 475.994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f60c3f345fb8ec8c708e49e8fa33f737) >>
+>> endobj
+10034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.9641 465.0901 314.7912 475.994]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 419.5387 248.202 430.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4f9a47ba1b29f1e07a32542584d50686) >>
+>> endobj
+10036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.0176 419.5387 329.8447 430.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 384.9461 271.813 395.8501]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_304e74729ca34fc67648cbc995e1dfc7) >>
+>> endobj
+10038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.1501 384.9461 376.9772 395.8501]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 350.3537 310.388 361.2576]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e6eef0ed4aa8b3690f01f774dd0722fc) >>
+>> endobj
+10040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [314.2037 350.3537 392.0308 361.2576]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 315.7611 207.9534 326.6651]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9a45b4b8f148a20359a2f3e2b1c2cb2d) >>
+>> endobj
+10042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.2906 315.7611 311.4342 326.6651]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+10043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 281.1687 246.5285 292.0726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b1b315e7f04c051a36f48d344dd34052) >>
+>> endobj
+10044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.3441 281.1687 326.4878 292.0726]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+10045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 246.5761 270.1395 257.4801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_be643d7919aa34a2c1112702878f5536) >>
+>> endobj
+10046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.4766 246.5761 373.6203 257.4801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+10047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 211.9837 308.7145 222.8876]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7a8abcefdfb125b7c9ef5f96d352c1df) >>
+>> endobj
+10048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.5302 211.9837 388.6738 222.8876]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+10049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 177.3911 216.2524 188.2951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_96e902093a55f87f0aebc2bb13a8d740) >>
+>> endobj
+10050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.5896 177.3911 328.0421 188.2951]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+10051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 131.8398 278.4384 142.7437]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7e4bbfa6f481ead40e3ca6231e0f69be) >>
+>> endobj
+10052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.7756 131.8398 390.2282 142.7437]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+10053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 86.2883 254.8275 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_3569a428ad758dc9ac8273e0f1f77772) >>
+>> endobj
+10054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.6431 86.2883 343.0957 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+10055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10017 0 obj <<
+/D [10015 0 R /XYZ 90 757.9346 null]
+>> endobj
+10024 0 obj <<
+/D [10015 0 R /XYZ 90 633.0972 null]
+>> endobj
+10014 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10066 0 obj <<
+/Length 3867      
+/Filter /FlateDecode
+>>
+stream
+x��\�n#�}�W�iC�޾_�Cb8A�x�yq
�GZ")�Ԯ��O�\Z=��1(���0�ȣ�3�է�{zF�8�'f�Ϝq,(mg�w|v
��B�_/��E
+��7�fX���>ܔ�`F
+9���q.��r!8��w���W����ݥ�����c�>���m����۷�Ǘ����˅4|��vu<V?~_��w�� �@��U��?}��ŷ"��J����|��O|��+��g*x3�
�p&B���
-U�����ſ�������`ʚ ?i�-�� J(f����	�
�^�	'���Y�g
"k5FVhΤ�ra�?���秏E���~w{x����lv
(��

�z

����´]zf�P5洯 ���ǹ��Հ/�,����͐/	I#B��527��Mu�햺��&��Q`2���>m���͋��c�;�ꋫ����/3p�
at�f�h?q����
��6����v.�*-f�
&���>�!���`�p̈́Sr��0��{���d:
+ᘕ��j���IJ3ļ���~�"�
���� �n���mϭ�L#:n��m��>%��)=��`�^/���0���m�^&i�\��˻�ns��_ѥ�\�p2��"�)�X܅Ψp�{~!�^�\������"�ob4�����KGC�Iߣ�	CD$4��A�h�xZ��S�:ǤrgImj##��Ujk�}]��z�nv���KӸ<>lO�l�aJ��
��,7�(70Z��9Q��mD9u���6�!a�:���0�x�D�.�8��rW,?oNQ����j�;uYI��N{" Ep�����
��AϹ5�;��C����Z�G��@7M�"��"�+
�ҵ����k0L��t�'6r����Ǣ^�������O������&v]9VL�'9
H��B?iq"0U�v��X�
�c�r@�\����M�3:(9ӆ˗�A�-
��:X��
l��&���ni
l����y=��:XWޞiɔ�"��"�H��W�
�Q
t�9��ԐD<E�g�ݔ����<�
�4 ·�*�\�7�Y44V�
�622aO [...]
[GL�
f��-�PG
+�M*�h�-��I)��A��O��@
_��\�L
��#�i�p�ܧ�cI�R�?U�)=��p����D�T�4jً+��`
J"��F*jj0����ZQ[nIEm�������\gy췖b��i@^!���xc	l�����h��ˑU��r�W�PDABiXC�Ψ��ί���A6�%�����6���e��;��
 5HX�=�-�Pv�p�)&h�}���sF���H�
*P��h�L
�42����-��-�S42O�g7�u�5wUu0��DAFj�V�2�=�m�a�95&O��ٝ���g\��tS�A$`�͌
��!�B�0��J}�N&6r:�����u�
���@(����S�A?^�0932W�������毄r���dsT��gZ9�߭�p��В�%Ҽ���X���a��3�G��%�喔���	�G���E��
+��Ɍ��A����������3塐N
@�'t�"�_
+!��fu��o/@��u>E�JCL/
`�
��=$?����Ȩ[�U�w�p*׬�Z���
+�5cL�af�j<E�g�Ԡ��f�>lPr�W��~ׯ��z�\�E� md^A�Z,��H
e��e�n�N��
�_����S=�����
+�(%���]�;�a�ʹ�[���?�����F�W���vWm��j�������@\��ܴ����6s��orih�x��M��kNb0Ws�~�����kN�����'ѳ;��dc�Ts��c�i�~�������(D<A�o�Wx����@�o�
P'���(���ŷ��Z,^��˫b�
I���"�(B��Jѓ�\%�Q�Bd�.DL��^��p�K���*d Ve��jAy
+�XHu���N�`����<�L�X̪�qo� �mY��)?8��܈)?��~��qp��*���}0)��J�,��G�v�,$��;6���������K���z�(���I
�IJ��{�K�r��;atK
�
+X�oS�R�tk��R��$zv�,����d�J�~-�L�a�l,"��!%
	�c��������hD<E�gi��O*ap�)c� 4(»�P��m�
��
+|L	ΩW��L����\�ǜ�(z�soEU+���י����n�ssY��Cbo�a���+�)#�`}W�aL�7u�w���ۇU�)(�%�`WE��\�
�_�<S���uL�@�ʌ0R~S��%����r�=��v;��2A�gwDz����x�^�Q'�
6a
N�:� O�[���'h���uX�R8Ha�A�(ʻ��%�j{�t�h��;�Ffj#��
�?�?��c������du��F�jb0'�y����nɞ��zBOK���Ex}��a�
kh�6�| "�� 2ì�3 �
-����N
E�S4zv��Z<�A�AQރ�E�k{��Tf��9B���	i��)��S4���1����ɦ9�=�"���W\�Y˩ۯF�nj0����Zu[n��l��V� г;���>�Y����t�É��w�
�ܸ�Q�x�F�.��b:+��ADQޡK�&������:���nNmd�7¾���}�x�^^Ha��Д�60ZH�9!��m�4uK��m��W�D�ny?���8,����c;��ce>E��3\��̎�c�OF�S4zv	
�y�t>Ex�G��m甄j�ϡ�����IhCZ�WwEs�I��������A*
�>k�
+=�1���Ұ �H50z�'s�?﷙��[z��\O��y=���Zon�4�Mq(ϫ�� VJ�T>$E��Z at k�
���X�Đ4p�C�*���A�� ����cM')(����9h`�}�+H
@���9nR�K��m&�'��8A�fg�J��v�T�
�"�(*� qR�6��t���=�&\2�G^���<��/7F���`��~�r�rK����	� ѳ[��cR���B�|4"� "����j�����aZK95
O��٥� �JDJD�=@g�`��NT�
F���3���6�i9�"<��Ũ�o@n�O5�F+Bb0�y��"�n�;ym�v�=��ู��nn
����
;(���Ɣ�q& ��Q�(��tF�3���(g���)
+]�D

+"��j��#�p�O�z<���N�6����g�6r����-h�c-h`�s�,��]���h��l�b<<q�}����(N��*�çj�P͞��
+�B�sC��(�����C��XKj峼h�5��{p�� +1Z

����5ͪ�n�����W3�es*�f�=Ct3��9�\O�]�~�
̅�-�}&��\X��:[��' �����?=^�9
+��+�^X&��X�/,�0��%se/�){���FF�c��r�)}5�"ѳ[�J�׏Mo�V��%��ic�(���� ��:C0����(/��!�I]��c�Z�=)I��AQ��
�e/
�9�K��N�r>R��0�1����)R=�H�ͮX
���r(��!m�.�H��"H(g���4�H��z��46�싘�כbwZ���۷eԚG�� �j�5W�	��}�~���
����Ǿ������^d�	|fPn����3|a�qg���|[��̉�z��g}���^_��xW�a
��w�4�\�k�������E���v��^!^�'4U
�Q��*����Z�,�P���(U��w�����M���/��s��{v��?�N�o߼���3�>������6�7���7�7�B=�N�FoA=.���yv�oq���}��!�Q���z�҈A*����_endstream
+endobj
+10065 0 obj <<
+/Type /Page
+/Contents 10066 0 R
+/Resources 10064 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9902 0 R
+/Annots [ 10068 0 R 10069 0 R 10070 0 R 10071 0 R 10072 0 R 10073 0 R 10074 0 R 10075 0 R 10076 0 R 10077 0 R 10078 0 R 10079 0 R 10080 0 R 10081 0 R 10082 0 R 10083 0 R 10084 0 R 10085 0 R 10086 0 R 10087 0 R 10088 0 R 10089 0 R 10090 0 R 10091 0 R 10093 0 R 10094 0 R 10095 0 R 10096 0 R 10097 0 R 10099 0 R 10100 0 R 10101 0 R 10102 0 R 10103 0 R 10104 0 R 10105 0 R 10106 0 R 10107 0 R ]
+>> endobj
+10068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 687.0355 317.0135 697.9395]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_2aaf9117efebc52a8b45b787075a9647) >>
+>> endobj
+10069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [320.8291 687.0355 405.2817 697.9395]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+10070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 641.581 236.7449 652.1113]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d6a8cc7029bad7ad7ad116c90ff59aec) >>
+>> endobj
+10071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.0821 641.581 307.5883 652.1113]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >>
+>> endobj
+10072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 606.3382 243.3704 617.2421]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_236a18fe8cc922d00ee92a6c6e42f923) >>
+>> endobj
+10073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.7076 606.3382 320.8393 617.2421]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >>
+>> endobj
+10074 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 560.51 240.6203 571.4139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_bfd98397c137d81dcc27111fba3ccd54) >>
+>> endobj
+10075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9575 560.51 345.7846 571.4139]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 525.6408 247.2458 536.5447]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a26e1a5815b7a0c3b610395c854594bf) >>
+>> endobj
+10077 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5829 525.6408 359.0355 536.5447]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >>
+>> endobj
+10078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 491.1451 193.5774 501.6755]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_3c1e5a2419a5f4a5cf89133606ed1680) >>
+>> endobj
+10079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.393 491.1451 232.5806 501.6755]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.0592 478.1433 248.8445 488.0486]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+10081 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 445.317 193.5774 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9ca6b6eed07fd3b72119b8ea58328e5e) >>
+>> endobj
+10082 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9146 445.317 277.6909 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+10083 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.892 432.3152 252.6774 442.2204]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+10084 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 399.1152 223.4647 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8132d1a9b329271fb4f7faeb59c89c39) >>
+>> endobj
+10085 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.8018 399.1152 298.7318 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 364.246 285.6507 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1956a63a72283d208851d3fe2b11989b) >>
+>> endobj
+10087 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.9879 364.246 360.9179 375.1499]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 329.3768 215.1762 340.2807]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4b428098e57a9101473a54cd71a0753f) >>
+>> endobj
+10089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [242.5134 329.3768 290.4433 340.2807]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 294.5075 277.3622 305.4115]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_97011210c7f0b2efa0f837ef2da6c5b3) >>
+>> endobj
+10091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.6994 294.5075 352.6294 305.4115]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10093 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 259.6383 229.5525 270.5422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7e68bea365fe939d08c91ec4edc61a2b) >>
+>> endobj
+10094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 259.6383 304.8196 270.5422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 222.7765 239.8036 233.6804]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_672b0568e7a27c37b3afde649f7c0171) >>
+>> endobj
+10096 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.1407 222.7765 315.0707 233.6804]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 210.1483 275.4757 220.0536]
+/Subtype /Link
+/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >>
+>> endobj
+10099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 187.9073 217.1088 198.8112]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_eb14f5522982b3874f2cd19586813421) >>
+>> endobj
+10100 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.446 187.9073 292.3759 198.8112]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 151.0455 271.1256 161.9494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a809bff4b85d09cd801e5e5cde1b8c06) >>
+>> endobj
+10102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.4628 151.0455 346.3928 161.9494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10103 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.8625 138.4173 326.2592 148.3225]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+10104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.984 105.2174 201.7419 116.1213]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c93800b9ec7aae75937598e1f2209b1f) >>
+>> endobj
+10105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4419 105.2174 243.6294 116.1213]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0792 105.2174 371.3288 116.1213]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10067 0 obj <<
+/D [10065 0 R /XYZ 90 757.9346 null]
+>> endobj
+10092 0 obj <<
+/D [10065 0 R /XYZ 90 276.7391 null]
+>> endobj
+10098 0 obj <<
+/D [10065 0 R /XYZ 90 205.0081 null]
+>> endobj
+10064 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10121 0 obj <<
+/Length 5036      
+/Filter /FlateDecode
+>>
+stream
+x��]ms#�q������T������C|e'q����:b�T�4�b�"�ڵ���=3���
0���K�jO���~�t?�h
ق�l���(C��zq��.>����
��^���X�7޼��V
G��z��c�A3�8�w^2F��Z1J��+F�������+N����}swX_�assX�߿��|��r��ZqE��o��c���Ǧ}���6����p��~����J��
��כ?��.��~���Z|��0�����¿ؾ�������c�����$�>>"���Z�}L�p�A��P�d�

��=�$%\K�b��<
7�v�
���G7��
�,� |Nk��~�/��NJ�X�hjL/s��
;�!-tj�N� !(s��J���z��K�K��"��G�p=|�t׿yX������iP(�
��F��A2�P
.L �?�
 ���)�� <��`)t�z�.?>�nO\7�����f��{�y}جo�͈m&,�Jy� 9b�9���z����d4�Ӱ"�%Fq
S���k?������J�e�ׯ��cs���7w�n�G�Z��y4�g�M�M=���n��bT's�������ӧ
aƫ#�y�8#ZH�0�&��� �ԙ�Q�13
'��/V�Qb
?3�"0c�hnb��\�!o��
+s�^�f�kB
K�~n#��.3-
�&9�<(�x
�Pk&��'��㡁 �)���a�� U��avIE�`���]X#ژ���UC���߯c�($PÏۊ
�T
��&c���A��+I��A�pny��
Og�u���������"�?lv��p�[&}@�V�t�� U!�!���x�\1����|�o�ܽ�4����ޜ��߷^�^uq��
Y��S�#^$J
I�hE�_�z��g'�c�o2�i��fZ��rb
����
�`9���IV �5��r��9m�(��^�r�ޜ������Lv���`�8b� UCf
���8�I'.>
=�i��.�:���u�E��u
Np
K�2*�:���#`�R ��G����E��\��k\�KR�k\NjչN���u�v=׉�Ns

���>�����@dzŧf�
���7w�	��=ƛ
+VvK�� j�f�t8�x����� _E0�[�=�)����K� 8��I2�/�g�.(R5+�"�W��zɏ�v�A���燛�6�:���̇ U�`!�
���l���p���O
+C��n�C�|M�w�S�EK�Pm�/8�>���BW������6�,R�(�:/��::U��sF���	���H]k5�P�':�j��"��4�/��}���@
N
��tP6F@�����MG
/_�\o�PZ���
+1�M,
�3��Et&_ՖaEq���Tչ��0�����+e���I�P0{L� ���-����~�i�~�0MW/b��|�	

��b 8
x�a6�h�uk`Ė� 
�S>R�6V�r�u���g�iIzT�b����/��!�;M��Պ-G9���m`"
B%��w=�5��} Oi����1�„�
�!�ݙ�`ə�@n�j�P�`fu
��_���wE.� �2����
+�4pY5��,VL){u���AG�
+�
bU�+,�ߊ�>�%f'���{#14=��|
D���'KZ�ɶ� U����`D�(��T�vK��"�R�*RZ�
A�@��&w#�c�C���L'4/_C��A���. *��*$D+� B �F�	
n��\���LoD����P
�̠�8͐d�%�

a�
+1
[��*Yְ�,
bWlY)A
;o�7�Q`�A,a�8��F/�
s�қ��Se49Zu�w�c��%�,��/#��/#
+�˭kF����.`"�c7
^�|e�r��|��|1��qĚ
�0
y�
jʗ-�T�"=�.C>��hg�e�$q,�g
�$�
�T�T�$����9�\�:s��bZ8p��3ss���u�����f
�R&_��EE��1c/VgƑ�3.���86[���eb��
���@dz��2l��UtK�� ��O
�D�p�7�-#�L���L�
`����
+/T� Dl��'�n�9-��HJ�\/��L�
Z�a�w�	A���
�S��
��ayQG����W/���
��K͚�Bؗvf�B�T���5)����c��J�!��s�h��@G�XZ�����<e�]�fj�Ij�`tX�Un�v�!P~a
}�6�8_�m��2BE 
+d)
��%��+���.��A�0�(V��*ε�ʁ
+��y9
+�o����aR֋�º�mb
����w
�dž�/i?o��iV&r+sL�Ӻ�/��)
�Xq�ꍍR�6
�0:/U%t���+�3Cls��a����n����C��X�l�I�>	BeD\#���$�s�ʹ43��+�Zg���M�-:!�
3Z�tf��8I-H*5�A�l?�:��a��
+V�� T�o��͋�{��W
�&J_E�D�Y
�q� `I�M`tF;p/��?0�vR��
o�r���j�R��4)�:���МE�"
%b���%BM(.l�w��J���m��f�F|g��x�8�����8����g����� N3</_�\�$�Cd��1����`k�ťY�
+R9Ԕ�i���\�PK
O�8�&�����Xך�5
��w�����3T�W��a� -j�ϋ�)_�����v=�͖jx�;90]���5�^Dq��N�Y�;a��.�.	R4\b����no�a���G��"�wv����B5�Ow�|RD�Y����O�YEg�$�W@�zg���ڲ_�P�+��@x���
l�N:'�H�t��NwY���;���lT�Uv�c��Nwk}����g��x��s8h��@A�TZZ�}����EJz�&�}Z��ڢ(�ZCݥ���E1�
}_���
Ŧ4�Iɰ�B{��eZ�<�ATE��Avե���2���Qr��ij����D�����j�����X7'���G�8�D�L�j"����>N�r�
��������҃�ٞ�R��_(�#�������dY�����'@+�ae��v'�Ɔ��}�g
_�����B]�� �Y�*�������i�.4�U�ūSvl�p�*�=�U){��@�+v{ʞ�-��CӕY�"�; [...]
+�L�%�;nKS�k�=+1w/�w��! �-mXu�t���K�DzP>V�"��P(=ԅV�;U�N��_O_>���1�h��r�|
	���O�P>��+���Mh<���g��+`8N�g�*H��G�,#�'(�}�_��Ès˺��1�\�HV�r�
��`��v6�W0I��A�W��h<Ct�if�����X=�Dv����iRokiJ�
��0
3|.�����H��1̈b}��Ҕ���6�צ��	"��=c!�U)}��@�+v{J��-Qz��.R�V�"�����Cs
q���\�ۄ�o!
�
,��+�TGWh9 at 1�sܨݾ�� _���E?�l
�G��-IZe'x��u���XiN��}.Ҡ�ᗟ�
�(� /5荤�L��e
�ct(@v�O�S��O��v���tꞓ��@fg!{�K���(z�2�~��e��25�k)�*Ul��K�4����iv�cs�Kv�)=��{
{"�
W"�[���H������A��-"��lQ��El��-�s�ED��{|��~����]o�o����a2k(	T̸�K�T
W�P<�E�8=��A�x֝c��4���5�^�[őj�q����Y����(4�ߔl��9��@�g�Y���A��#��X��W`l���sV`D�Q���*��l��C�+�>cy�
A���]}��N<��ֳf:$��`dz˜MplLɲ�T�:�5�lz0)�>_i�cO;
��ύ<~��B��򾾴X7�A����Jp��ȝ�g�HG)�y�_%L�7�]��}Y�+�X�'pS_
�U��A0
+(!x4���#�ס}��>�8�����X55�
+
��b�OM����da���.��^�"�ۖ87�Sswݧ�n��tX�Z��s.
-�+�'HU�	�
R

4��p��9a�z(��`dz+��*||-�8�Kլ;�r2�
r��|R�@��\o�
+�\/��
!
֛������y{\a��i����=%>{����qF�vD:='e��)�i�
7:#cG*
+	�K!�y�-<�lo>7����s�4i.��m.���B�.I�c��y�2�L��I)��״GWA�l_ at B����~�$|;������
��o���u�mG8Z�폽[���
e�	�:�.7����V��x;���Lxf��~}�[���9xV������"��4�?���w�q�CUS=��IX�_���
NT�=öDG��{Xb�Yu-�{�z����}ٮ_��R���
L��[��Lo�
��
���J��*� �c��2��%�%g;(��Pdzk�����Tͺ����z��k�~�7�l_ē띟�K�����[�Rȟ7��0��j9�u��{���\ʜ�_ĝ����_�k��^�~
�����}��+1�O�F��	i�8��uܵ|����������8.wh�2��!y.�ހŇ���G�W�+2�6��΢�*�,����7���ƚ&4��g�p1�
�xx8�� c����
5̱��T����k� ��0
��l��G�

�@½�L��G����Q�D*��t���^��B�eZ�K�j>Ef
���O�
l�W��vl���X�s����6KA~�~��][��u���e���>��ş���WW
+�K���ֻ'�����3�j/_P����$�BV���i���2�z�{�?���w
���Ot_�i�K���ߟN��߽���
�=�����@6�w���wy�2�~<KR�Uʰ$o
>�,‚��u�������C���C��?3@(endstream
+endobj
+10120 0 obj <<
+/Type /Page
+/Contents 10121 0 R
+/Resources 10119 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 9902 0 R
+/Annots [ 10123 0 R 10124 0 R 10125 0 R 10126 0 R 10127 0 R 10128 0 R 10129 0 R 10130 0 R 10131 0 R 10132 0 R 10133 0 R 10134 0 R 10135 0 R 10136 0 R 10137 0 R 10138 0 R 10139 0 R 10140 0 R 10141 0 R 10142 0 R 10143 0 R 10144 0 R 10145 0 R 10146 0 R 10147 0 R 10148 0 R 10149 0 R 10150 0 R 10151 0 R 10152 0 R 10153 0 R 10154 0 R 10155 0 R 10156 0 R 10157 0 R 10158 0 R 10159 0 R 10160 0 R 10161 0 R 10162 0 R 10163 0 R 10165 0 R 10166 0 R 10167 0 R 10168 0 R 10169 0 R 10170 0 R 10171 0 R 10 [...]
+>> endobj
+10123 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.3057 720.2355 269.9387 730.1407]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+10124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.2877 687.7028 212.7678 698.6068]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f47944944e16e786df5c0671e7baa995) >>
+>> endobj
+10125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.7715 687.7028 252.9591 698.6068]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.8959 687.7028 375.1455 698.6068]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.4006 663.7868 277.9276 673.692]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+10128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4429 631.2541 250.0993 642.1581]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4f514edad990412bd66cc666347103ab) >>
+>> endobj
+10129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.2582 631.2541 289.4458 642.1581]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [307.7722 631.2541 379.5123 642.1581]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+10131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.7467 631.2541 513.9963 642.1581]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.3043 606.129 439.3345 618.2941]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2074 574.8054 266.586 585.7093]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_08e91d11b3deb5b694356b5573d2547a) >>
+>> endobj
+10134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5094 574.8054 309.697 585.7093]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [336.4935 574.8054 408.2337 585.7093]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+10136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 574.8054 513.9963 585.7093]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 562.8502 171.3608 573.7542]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.2371 550.8893 480.8696 561.8453]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.0912 518.3567 250.7476 529.2606]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_50e1047c49fffb06bc5089a06a051a3d) >>
+>> endobj
+10140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.0677 518.3567 357.3173 529.2606]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.4046 518.3567 456.1447 529.2606]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+10142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 506.4015 202.3443 517.3054]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0047 494.4406 446.0713 505.3966]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.0173 461.908 265.396 472.8119]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_cbc86683af6afc0818cc9e980a84fcb8) >>
+>> endobj
+10145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [298.5684 461.908 375.818 472.8119]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10146 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.2392 461.908 478.9794 472.8119]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >>
+>> endobj
+10147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.6163 449.9528 225.8659 460.8567]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2222 437.9919 466.6702 448.9479]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.9331 405.4592 239.9836 416.3632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e89cd985111a1a27c60a6fcc28ae9788) >>
+>> endobj
+10150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.6327 405.4592 280.8203 416.3632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [327.8547 405.4592 405.1043 416.3632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10152 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 405.4592 513.9963 416.3632]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 393.5041 171.3608 404.408]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.2574 380.3341 432.0923 393.4922]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+10155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.4364 347.8076 251.209 358.7116]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_371deb67f73bf27ac9a7ff6f2216db9c) >>
+>> endobj
+10156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.3614 347.8076 290.549 358.7116]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.719 347.8076 409.9686 358.7116]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7027 347.8076 513.9963 358.7116]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 335.8525 171.3608 346.7564]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >>
+>> endobj
+10160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.1145 322.6826 456.9923 335.8406]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+10161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 290.1561 224.5705 301.06]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_98c785602c5af8f7e0c1be92bb5e8b71) >>
+>> endobj
+10162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.9077 290.1561 299.8377 301.06]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 278.1952 347.8694 288.1004]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+10165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 256.6214 255.5641 267.5253]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e10fbc38125e63858549f5ec8a25e046) >>
+>> endobj
+10166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 222.4288 255.5745 233.3328]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7366f9b91109b63f078e963bccd9f5b4) >>
+>> endobj
+10167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [282.9117 222.4288 330.8417 233.3328]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 210.4679 373.7824 220.3732]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03_widening) >>
+>> endobj
+10169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.6092 188.8942 306.6411 199.7981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_281b8db6a8e0014ab2c41dd15f8c0708) >>
+>> endobj
+10170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [338.9975 188.8942 386.9274 199.7981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.1692 188.8942 513.9963 199.7981]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.2001 164.9781 301.44 174.8833]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03_widening) >>
+>> endobj
+10173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.6368 132.4455 311.7464 143.3494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1a3647877302fc6e0e583b8b881a7a4f) >>
+>> endobj
+10174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [342.1579 132.4455 390.0879 143.3494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.1692 132.4455 513.9963 143.3494]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10176 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.2001 108.5294 301.44 118.4346]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03_widening) >>
+>> endobj
+10177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10122 0 obj <<
+/D [10120 0 R /XYZ 90 757.9346 null]
+>> endobj
+10164 0 obj <<
+/D [10120 0 R /XYZ 90 273.0549 null]
+>> endobj
+10119 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F52 345 0 R /F99 2085 0 R /F40 354 0 R /F100 2198 0 R /F36 2201 0 R /F25 348 0 R /F104 5472 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10191 0 obj <<
+/Length 3917      
+/Filter /FlateDecode
+>>
+stream
+x��\ے�}߯�­�B�_\N��8N��U����qm��Y�1o!�Z�ߧ{f bC`��کT�YR<�n4���!�Q��9:3�'��-6Wt���/W���>��|}��K�f�8����]cA3�8����)�o�t��5��갩n���t�[?�������7�����g�?_3;�m�o���?���}�]}W7���E
v!5N^�����?��v-QB3
�?W?�HgKh�WW�g���Pœ�͕�¿Y_���6�i?h�0��Z9x%����DKk���	Fuf9
������!��N��W<J?c�h��,���Ź&���ol0��Q%�\�X����;W�ĵD0$��?:��0��Ax|)��.F�W�nV�z�ھ��q�z�
ąB<��"�
+ap}��Ut��
O�s-a�R;5_
+#��a|�M�]��Oj��I��w�:e}�����o۩|�ž�����K
��R:S�M
-��Bg�n�9�G!�ll�k�J;G����'(�~�
�_l�i��3
�h�?J ���
+�C3�:�:��v0ʢ/
+K�r6i�6HM��}�:��^\��
���z�f^�ק������m��'�]p��	�
��g���
�B�R��L��35�Dib��v���+G�U���M}z���h��}����;L!{xg�#V&
ry�[K
�g/I�,��P��X�b���T�ە���bI껞P�
+A$v1�R9�ޡ��l
����
��b9�
䎰S3�0��r�q�
+��|<����H�l��f9�H�=�
E6r���0�Wզ�
+UW�F���kRs�c[2L�8�T=�h��d�h$#T8]"+Md0G4y��hb���F�=gx���BZ�֫��T/o���k��?��~��N����X��1��T!,n1��\d
������|!��nA+���9��wMAP��~f
��ِ�c�����/ē��x��!
���t���x�7I8F
31���*a@�>��c����
�Y��X�c`�T��p���%�r;���d�f�pn�Fԑ�
Q{����p-�|��&�k$k-:M/���f�S�O���0�W�
��rQ��B�ݒ�GJ�T�l^o���B5ǥS���ih��ț��o�>����ۻ]��E��iҶ;v�m&�)gD���vL�[	�F����0JS�UY��W��a7Х�jl����s3СG�
F{S���`�^�ϋ���~ׅ�.�FV1
f���~�e
#���V �Av0���@
+�@A=������ +��`F�v�����.0�91��-���j����o��
@?;\��L@��0.�z�#��������/���-
%�I�OB@����h0,�0�^���¨���B<��i� WVXʳI	�R02$z?)(
Z���j�`��@f�&,�Z}ҥ��/�SAl#���A�5A>���dE��k�
+��"���?U��hZ�E�/��/�"`�"PD(c?�"�F�� I���K�%	�죠K6��
Xg���
F#?m���y̐��(�����Ж�C
F�o���
n�b�D'?,����s�#G
s�.�X?��ӻ1۰�b*����X��8Z�="vm��!uߎ��3�w�ڱ�
+��͛O�s�e���Թ\����@"2 �
�qԂ�>,8
+�9,�@xR����Qؠ��͛�Ц������8짯��+��-Ww����b������z�>�
j�׋Ӯ��j_-�bt���s��2z?��z?�7����N���
��'
8�H�6��\�
1�K�a�[�[
˱�w��]�i	�BD��"1�
�������/���B
nO��zt
�[��@@"�-@�����dE��0ؕO�����
��z�<��%�0�������y�U�6�ʇ�ܛ)߼<���޷
�7��8 ��z�9���귣��v���|QN�>�L�R�"sZ>�F��C0�e��<�L\��
q��z�ݖ���z
+q�H�f�k���8�.��s=�*D�
ǵ�t�(uA��X���$�
�N�.G$h�|
+��а��R�#(P�x���l���~y�:�a��T��ݝ"����
��,�W힝�(�O��2�Es����9-v[洞�)��"��nFlթ���v[� �>��TT!
+�5���A\� �p�Údb2�Fb�pV*܈�x��w�ǞZʾ��Y& 
�Gɂ3��62L`����d0R�
 �ٸ<
<����nr�F��a0�e�_n<���@ÅR}��;
+�p(!������J��
+׉8^���f�e�w��T
a��<����PI	X�j�3U�෫=�Ū�w=�j�H�6�t�f��=�_����aE����%�
+!q�R"M���b	���Q�N�L���H�b�7C�:��7��x��N��-�*� �k��z1�8�n�Է�NZ拋a�Q�,*.��\q�0
��&F�4��z�׋U�
;�w���
���
+UH��>;�@���4
�L4gs9��:�4�,�L�w
+�d#Z
��w����C�i�2�u<�� ʇ�-��ŭ�c+nX�
�}��%��S�� ¥�6�c��Es�ؚ�sX rX �ӟ�T�U�#J�l�(��J�vx�
C��D�}s��=}��n�ݼ�y
�I�q~��9�
|�au����#FR��q��/�?��Q�ǎ���DP}��O��sS
nYi�J��Hv��
ۍ�5P
AEGt�s{�7�5(�6���;�9
�Z~�y��qFh ��
qZnõ�o�3��iU�o��ֈ��s����G.�@�(��
�y�[XiR:���/d�:��m�j_&f���e�x���b
+1p),�L?��������;x�e.^�ʧ=��0W�u�U��C���j�:�R�E��:?S��Vi݀�/b���w�<����.6s��K'ޢYѿq���Le;�&�
+�������=+�}���|ⴴ]`e��
�(2��Sd�L5=�S�&Db�h�����e�8)��y(���T!��2�]1&t����]�޷�,4SEj�Y���Tr:�2e��{-���郺0{
3S��HR�$��Dq.��R��'�Px��]Ќm䊉�5we[9
+�f�

+����P�s��n��/��s)�L����ݶW�F�
'F	��}5vÌi�N%.����R��� ���*񷇕�;2���_�߱�2�\O��|�]��n�^���p��;�g#�
+�೾��a/\�
nJL�G���H�N�.�}zat>U�Bp|4Ɋ~݆!vN�L��1��A��	�R,��b]�\O�QQ؁
+�%����d�`]�R:s�ȏR�gJ�md(=�0�/�Ux�8�����e�k�#��p@��ؾ�&ƅ�«�8}k|��}�fxm���X��D�h�}�k�5WXW�E�^W�zwߥ�V��LXb,兪�2U'��U'�7<�R(
]�I��=�a�ب�#{
�����G��8b�)eϣJٳ
^�0B�
� ��nH�6r��a���t�o6 �G�P	�B>��"0
+	t��_���<��衼S?�"�E5��;A
�#Zm
�yh~�n�� |+5�m��
Tp��C��=�fE���V��V{x���j�
�P�U��
�w��9
U�vn��"WJ��UZd"3}=��������S�)�>�%��Y�����q�kw�'���[\��X���W��U�X}3TP7�->�W�V�D��x�g
�)G^\�%��a�G��c�S�0�
h�x�w5��t��F�~�?��T�[�3����.�7�<և����x�Rm��.-�k{{8��!T�?�ܴii��zt/�)��Yj?�i�_���/�|�&�F��L���.6������ˇ��8���j ����~�r�7M
7"�{7���K��ц�^,w~W~�;�^��C��u�d
)6�8���endstream
+endobj
+10190 0 obj <<
+/Type /Page
+/Contents 10191 0 R
+/Resources 10189 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10231 0 R
+/Annots [ 10193 0 R 10194 0 R 10195 0 R 10197 0 R 10198 0 R 10199 0 R 10200 0 R 10201 0 R 10202 0 R 10203 0 R 10204 0 R 10205 0 R 10206 0 R 10207 0 R 10208 0 R 10209 0 R 10210 0 R 10211 0 R 10212 0 R 10213 0 R 10214 0 R 10215 0 R 10216 0 R 10217 0 R 10218 0 R 10219 0 R 10220 0 R 10221 0 R 10222 0 R 10223 0 R 10224 0 R 10225 0 R 10227 0 R 10228 0 R 10229 0 R 10230 0 R ]
+>> endobj
+10193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 709.0482 236.1973 719.9522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f074d4d4d406dd065812b32cc8714222) >>
+>> endobj
+10194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.5345 709.0482 311.4645 719.9522]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.5425 696.5149 357.8403 706.4202]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+10197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 674.3687 214.0604 685.2727]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6e9d9dd7740b414d407c16687c99a88e) >>
+>> endobj
+10198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3976 674.3687 289.3275 685.2727]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [144.8708 637.8865 284.5255 648.7904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_cf531d280805472a54c22fed0f689932) >>
+>> endobj
+10200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.4048 637.8865 359.3348 648.7904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.7795 637.8865 477.6066 648.7904]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.9021 613.398 286.1999 623.3033]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+10203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.1967 580.293 291.9292 591.1969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9764ef2f159cfdcca3f151e899bd43ef) >>
+>> endobj
+10204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.4604 580.293 369.3904 591.1969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [414.0413 580.293 491.8684 591.1969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.9021 555.8045 286.1999 565.7097]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+10207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 473.8588 289.8656 484.7627]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_527e7c81841bbcf1963c6e260dadfe01) >>
+>> endobj
+10208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [293.6812 473.8588 359.3244 484.7627]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 439.1793 290.9713 450.0832]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a6b6fed08414c86d33fc4a44c59e9e22) >>
+>> endobj
+10210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.7869 439.1793 360.4301 450.0832]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 404.4998 224.0028 415.4038]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_87ebe6f7cd176227f61c6d0fe47a4f68) >>
+>> endobj
+10212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.34 404.4998 299.27 415.4038]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6947 391.9665 272.4902 401.8717]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+10214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 369.8203 254.1498 380.7243]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4c11206af59b0f6a5471aded55d20961) >>
+>> endobj
+10215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [281.487 369.8203 338.2632 380.7243]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+10216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 335.1409 284.5854 346.0448]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_dee3b5c0c3800ce2214e68a156cbcf77) >>
+>> endobj
+10217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [288.4011 335.1409 354.0443 346.0448]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 277.5473 241.7263 288.4512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_787615432c9f1d6aac5a6394aea8cfa9) >>
+>> endobj
+10219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.6171 265.014 407.6577 274.9192]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+10220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 242.8678 249.3181 253.7718]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6b737abc8f33b2a2362e3f9c9ab08d58) >>
+>> endobj
+10221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [253.1337 242.8678 288.3213 253.7718]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.8754 242.8678 371.5186 253.7718]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 208.1883 240.6204 219.0923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_dd7b66394e6c54bc1ae03a4ed9a33c9e) >>
+>> endobj
+10224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [267.9576 208.1883 324.7339 219.0923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+10225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.5366 208.1883 425.7242 219.0923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 135.6271 180.7735 146.5311]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0c58bbc8bf8db5f570da3db42a0ae2f7) >>
+>> endobj
+10228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 99.1449 167.4656 110.0488]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_ca90e7afe251a0d4174dcf538b34006b) >>
+>> endobj
+10229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 99.1449 219.2113 110.0488]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10192 0 obj <<
+/D [10190 0 R /XYZ 90 757.9346 null]
+>> endobj
+10196 0 obj <<
+/D [10190 0 R /XYZ 90 691.3747 null]
+>> endobj
+10226 0 obj <<
+/D [10190 0 R /XYZ 90 152.5136 null]
+>> endobj
+10189 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F25 348 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R /F100 2198 0 R /F104 5472 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10245 0 obj <<
+/Length 2997      
+/Filter /FlateDecode
+>>
+stream
+xڽ[k��6�>�Ÿ�
 �����ݤH���6��ma(�2�W%9���KK�)�"5㝢h+���=��9��d2���<SB!ø�-7Wxv�抴_���7!ૻ�Wo��d$������ A	�ݭ~��8��!���5���d��k���ç|Uf��eV>�~
�����n{}C��Ϊ�9�1���˷�
�1gF\�z��՛;O���$�D���W<[�}{�3Z̾���1t��┹��W��q�/�'�+31)

q�%�~E�\k8>� ���A��抜�Q�B�	E�h��/hP~B��ꙇ�A���A�m��y
*��J�
��|
�beS��	�cn �fղ(��f�@;�A+�B�ÿ��
�ݶ�W�j�0
0JU4��*�`�F�*��*�}��V����]U�y�i*���Zei0ȝ��m�T�ÒU���UN�m��I;������g
+L9��<e�Je�T*U�*V���d,驐Ѥ��A����|	)�3Q׻lu���#!�`�g&�hA�Fc�v����ـ��
�ȑф�ۀ�Ky�~�c��M-�\�O�6�fW>,����~��}���`�W�3����
a��(e��G
�]��-�b���P�Հ�1s,c��1Q
+
.Y0B;�7A�0���
�B��B�
}W'L �)4a�#Cp^

%?�#9HNO�,���Pnۖ�����x͡
��h{�������މM��/��þ�W�Fv���q�O�ì�
+P
I�T��?U��\
R�Z/4H�puI�D�bD���`�!RZw��ڃ��=N�)>�6]���W}��I�!�����u^n��`̩T,��ƣ|`V X
�ި>��FҜ�\�m �����k�m3�����[ �a-�hX���|v��I�����#
T"o+�NZh/]
'��Hۉ��<�0��0�kI|ʪO��n50b�*�H��ɭU1�i����
y�L��z�@�Y�?Fo>usl
���ZY~ܕgeSX(��?MvB��
?EvAтg��ԍ��
�����X6e�=|X����͇�l��
�˺��>��#@�B>�C�Lr��0hn<lT�΢��3zT*/�~ ��v�VM1���F��-��y\���0�k9��M����#-��,�]�
+�h!��%K���M�Ǣ�g�|���a�����a���
����tQ�	�
+�(;�n!�Q��8�[�7a�36D��`ЧT����
���z�ᩄ�m�ە�o�vu�%�4fL���8:�
���a\{A����
��|8�L@��6њ�xT���â�b�m��oW�c�Ɔ��@`-���gn�	����~�
+S���aIs
F�-�י['o8��
��1��BK֥icx�K?j;��2_��{X��ű�(3h��CU��.��fH/�G%HQm���=V)+��N����D+	cD���B+�

n��{���\��@�풂�K��{gMY펊�jV�MVx�Un�Rڭ��Y^��5S�|i�3hK;�v`�q�
+��S�)S�)��mg/SK�4�i<��i�7�i��ݗ*g�,��j��O1�m�LQ��.tk�S`B�p�Tvh�!�7)UR�����"��eI��%�������\�!����r����\w��\��z<���a�����)s=�h�]�������(�z8T*��)
w�Tg����%s=���
fy���^�}�|gJ ��s�`L2��8�织%�{02�y�|��ڂu)�[��~ԑ�
��-���Z0�q#��%(�5�QB��%5��Fcu��b�濃=������
�A�c��
Fj��Ǜ�v�""d
+QN�Ee
b��T���}f�
�m��P�/k��=u?�j�����"z����c�>4rjO�s���vU=\Qi�B�$^�Je�1�U�6 ����~�[����M��r`
N�\���ar��a�	;aF�B���ƣR
�}�b�0�
6�ݭjP��S���	2ø��ߏ�
��6/�:_�Y�@l����k�|-Z�J0�B�M�
�+�i*�M���p���0��C�^uw���
�vI�90_�
o�/
��9��7���."�J�S��3v8�3����C����r��R�nP�bv�C����VV���3+hƉb��y��
<��5~��ID��c��A�Ԕ��aXI��_<\K1z:X���L�xO0�G�
��m�͞�E��h^$�{�Y"<Z��`�>V��Cb�!�׿����?|�ݛ����)�j6)#�"W
b�\��,��M�
+�_�́�n�p�l�
���-BƷ�)�v
>�AA��@n)�r��E/��8;oR!�).��T<���Nmb-���w{+�J�
���[|��0n#f�g���`
(�g`H��	�qLz��bY�$k-X`r��`#"Y{D#���� ��w����[�D$�$�O�DJ�0U	�{XR�a����`�p
v�
�h=��i�[��,��|&,��̆q�	
kĴ���xT����јtI��_���2�,&�`���9m����ۅ�CZ��,�	C�7��f�u:A�V��g�a���9�#��o�W^����<�CB5\5M=9��/��8;ow!�)v��]<���Nm.lm��&�6q�ø��7�
ˮ
�l0�T�x�<*����*�I�Ë�xgc_����G�i�=GOӼ����W1 
�:��j�ON��a^�
�:TR�A���
��`!�	2�
T
O�Dީ�SZ��	
M�� �$Uc{�&Z�`0	��
	H��9+QZ��������S2^ J00�O���.ƾG
+q��:��D
+u�OǏ
+�����o|�:�
]�ftK’�s;÷G�*7��9a�۟�7�]��_����>�}�=��YU|�����}{_�T٪��h��������t��|���
�#|�=�&8�yn��K
�=� ���_����
ZV�-�%*�W�����a��*�p锟��K�u��}1�y�lW����7�}~8�Yr��� ;d@�endstream
+endobj
+10244 0 obj <<
+/Type /Page
+/Contents 10245 0 R
+/Resources 10243 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10231 0 R
+/Annots [ 10252 0 R 10253 0 R 10255 0 R 10256 0 R 10257 0 R 10260 0 R 10261 0 R 10262 0 R 10264 0 R 10266 0 R 10268 0 R 10270 0 R 10272 0 R 10273 0 R 10274 0 R 10275 0 R 10276 0 R 10277 0 R 10278 0 R 10279 0 R 10280 0 R 10281 0 R 10282 0 R 10283 0 R 10284 0 R 10285 0 R 10286 0 R 10287 0 R 10288 0 R ]
+>> endobj
+10252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 665.6769 202.9022 676.5808]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 665.6769 300.0368 676.5808]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6c7c72e56241da463eaeccdff79b6d49) >>
+>> endobj
+10255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 629.2624 202.9022 640.1664]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 629.2624 314.2635 640.1664]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a78179b1d8478dce6cf572af8e0b9cb4) >>
+>> endobj
+10257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.8192 593.2216 199.8638 603.7519]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_86d2bbceaa288f2f605ac88516d313cb) >>
+>> endobj
+10260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 514.4023 203.0748 525.3062]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 514.4023 296.3242 525.3062]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >>
+>> endobj
+10262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.3766 499.8934 355.0852 509.7986]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 475.7717 287.8558 486.6756]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_3b49993a1cd4fc6891da88a6259b9f93) >>
+>> endobj
+10266 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 437.5146 194.2975 448.0449]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a39bdf85d6db02629fa73bbcaddab6d5) >>
+>> endobj
+10268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 398.884 188.7586 409.4143]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e58a861a42c5216a2267e3f94ecaec8c) >>
+>> endobj
+10270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.6357 359.8797 294.4813 370.7837]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f496ec55802726ee3b39e52458ab0647) >>
+>> endobj
+10272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 279.4415 161.8403 290.3455]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b6ab1820f2fdf444d1431ff3af424451) >>
+>> endobj
+10273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.5586 279.4415 297.2018 290.3455]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.7652 279.4415 456.1542 290.3455]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >>
+>> endobj
+10275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 240.8109 161.8403 251.7148]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b4959b3da46291de301d9150f5afc3aa) >>
+>> endobj
+10276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.1775 240.8109 237.1075 251.7148]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.6716 240.8109 330.1377 251.7148]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+10278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 202.1803 161.8403 213.0842]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_858e0030826ee6c29545a934166874ef) >>
+>> endobj
+10279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.0801 202.1803 332.9072 213.0842]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 163.5496 161.8403 174.4536]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1cecffe684d1faa9b0f6b8d4f227e9ae) >>
+>> endobj
+10281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.5586 163.5496 309.3857 174.4536]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >>
+>> endobj
+10282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [330.9147 163.5496 390.8594 174.4536]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+10283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 124.919 161.8403 135.8229]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d6d1e866b7ba9bf4233f3a5254cda0f9) >>
+>> endobj
+10284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.0801 124.919 331.2237 135.8229]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+10285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 86.2883 161.8403 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_fc2a04d2049183cddbcf70316fdf40e7) >>
+>> endobj
+10286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.5586 86.2883 307.7022 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >>
+>> endobj
+10287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.7892 86.2883 389.7339 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >>
+>> endobj
+10288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10246 0 obj <<
+/D [10244 0 R /XYZ 90 757.9346 null]
+>> endobj
+10247 0 obj <<
+/D [10244 0 R /XYZ 90 726.0541 null]
+>> endobj
+10248 0 obj <<
+/D [10244 0 R /XYZ 90 713.1847 null]
+>> endobj
+10249 0 obj <<
+/D [10244 0 R /XYZ 90 702.3376 null]
+>> endobj
+10250 0 obj <<
+/D [10244 0 R /XYZ 90 691.4905 null]
+>> endobj
+10251 0 obj <<
+/D [10244 0 R /XYZ 90 680.8826 null]
+>> endobj
+10254 0 obj <<
+/D [10244 0 R /XYZ 90 646.2514 null]
+>> endobj
+10258 0 obj <<
+/D [10244 0 R /XYZ 90 533.2643 null]
+>> endobj
+10259 0 obj <<
+/D [10244 0 R /XYZ 90 533.2643 null]
+>> endobj
+10263 0 obj <<
+/D [10244 0 R /XYZ 90 494.7532 null]
+>> endobj
+10265 0 obj <<
+/D [10244 0 R /XYZ 90 456.1225 null]
+>> endobj
+10267 0 obj <<
+/D [10244 0 R /XYZ 90 417.4919 null]
+>> endobj
+10269 0 obj <<
+/D [10244 0 R /XYZ 90 378.8612 null]
+>> endobj
+10271 0 obj <<
+/D [10244 0 R /XYZ 90 298.3035 null]
+>> endobj
+10243 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10298 0 obj <<
+/Length 3479      
+/Filter /FlateDecode
+>>
+stream
+xڵ[Y���~�_��l$`��'�
�|v��fw��
�ęaV"��Y�ק��y��3�A<>VUWW��=lA�-��UL!��fE����W̽^��u�����w�Z$$�x���3"Fg|q��u��b�f����˴ڧެ8]���C���?�UZ
����+��e�ZsE�_�Һ��o��̼ˊMtA�I���懫ooZQ�H��
+��_��-��+JD���	n(aI��+Ʌ��]���{KǾ0�)DRE�Ћ��DG���E�/P
���$ɯc.��l˅�F�xBh��E
C�~���N5��9xJ�*�Z�x�m��]^�w���n���.���=�SV���2m�
+�k�W1�1a_��
?t��(���\�$�)�jF���7ؘ�
�Bż�\
������p><h�)X~L�a�$Ihu��&��ɐ��D
�yL���@�_,�C1"JMJ�CV���N��E�U��8��n�6�y{�_
�݊�c4qmǍ��{�yj����#z�E�o������(�R��
}�{�
�H��k����*z��`˰
��#�n�[��K��������t
�(��J��)T͢-?
�����uӢ�\
���F�a�%�Q|�
|n�}�Ȼo���)�)��coQ3c
��
��v��n���
��m���@2�2�R
��
�_��=2�������DRPB�`��Qɣf䐂͙�ʱ��������F9p@�L��#�a+f����7?~���o~����E�ֵ�4~N�
iLD��"䝽�w�`g�^$"$�ώz�|�d
T΅=��{�>G��,�^

��k�C(�%�aB�08Ls�� j���S�*���0=?x��c?����CVa6����! jz~�-j�9�kM��]@`
�{���b
8�=��S!�D*�3���9�	��R���'}�*EF�Y�)�1�<
��yp	
x����gE�2�C�|3�$+p��̢
e
R��≤�Ų��
+��pI�8�	�C^[LGN�-�lǂ�b;Bq�0��8Bf
+��6�s��n��
Z�e��
�5i���xCp��{\��R��Y��-^U�	O���o3��V��
�MR�#�ŕ� a�b{]6n��C�����3^���t/���f�F#ϋ��-��5��gcG��
-l6vLr<M3|}T����uY7U���;�a1K��c�S;��@���vK��^
+H� ��aN��^q2��5#
��=}�y��~i/Fݼ�P���b��	�t����4k���Ӣ���]�/S�^1A$c}�	iLx��b���

�;�s�R�?Ʀ��L�"���E�d�U��iW�&\E��mY�G&a��
�����$�
}ß>���p�N�ߣ��	����l�� �P
>#À�L"�8Q4��
+hQs��H
+IM���OS^�C"ąb����dН�r�x�hZ-j�����E�7�)��%��>. 1��<��K�c��N�( )ʷ(��1�M>s׍�$���bw�W�j$����OK?ͥ�S�-�4�Mmc��w�1������m���Y7/�bU	g�O7� Xʠ{r��[Xt����?���|��w��o��
�{�]������5��ٱ:
�P�%�Q��q�"B5�e]��B��"I0�����g%��5��ث٬٨;��8�WӪ��$�4f=ռ��*�h�.�L��`@���\pZ+�x�M"�f"�UɞU6�4�b���T��&Ow���� ��b
NO`�dWZ���D2�=�y
+�/� �a4F�BS�t����	s���dM��|����T�k��vA��M}{`s��+�6�YI
+��϶��$�0HI�c��u_��e�����<t�
�YM4x1X�`lL�ٚ����c�m��LZ	����=9%�C�pǒu�a^e�*�!dw7
+�4�7�O�Ŧ�SWҍ����Oy����
6���� @XWG�Y�"��P�m�(I��g V�t���U�U�5����rc�� ��o��X+��� ����?W ��ܐ<��U�[5�?J�
O%`�U�/����{�+e� ﲍ_}
�Q
+�	�Ţǯ�F�z@�&�ήR�9���` ^~=b]���*�M�JBHq��6�
jF�!5�x0+�ɻQμ�r'�ìȦF��be]�.�A4��-���"����g�L{��i�q���c�q[D Af_|,J�X~�O�
�G9��hh���'��I+3���0��3�#�P{�i>3�b���*s�x$��emO|�Uge½-����|� �n���Z
+�Q��t�h���#Ë�pC��*�>��)pk���5�O—
�Fm�x�O��DZe�iv���s�����E���Qo?���c|%
+—�i%�
+
�MS�X@<6Ym��	2z
�]%s'#��q�5�I�1b!��N7���6e��G�P5�󊆆�u��YBU�y�L�C�F���#[�}�f���DZJ��J
1���M3W�b
+N0dn��\��
�O�
y	
+#��Jap���
�?+p�t����S����HSѓe��s�9	��R��61�~��:�K]Hg���f�Y�wfߠ���y7ܶ`Z��g8�[
�{�|$W�"1���#9H��>=�,8���.+6���k�w2$xmƈJ�
���
Ǔ���0��ha���I����
__�u���]/o�s����
}�+�����
���eϟf�ֆ?_z<A��
��I���9��
�k���
��F&�%0�8>@8LLF
���I��ɘ��'��w_֍K1M_�fixoCL��Z,�N��ϝ�
�Eyʍ۪�%�9Ɉ9�8mlaŖ��;�����x��G����@@H��U�5��$��k��U9pL!g�

Vh����k(����N�<T>��[L'�.e�d��5��;�Ef/B%�o����d�V���D���%Z6^y^��OZq:dЅ�f07X%�F
+I!��t�Ŝ�(s�����#z at w�P ��|���PI�P0��SW&%-�l�� (
*�9k��x�yݢ�!ld=
���a�iH �H�w`�ixؼӘ�8�i����Z�Q�I��L�ⲣ=ۇǐ�[K��[G`����3��%�
�[��D��!S{��;x��"_�^d��+�IR�1�x�m��x4/tbZۆ�	=�\N��S�+�_�;�O-�W�����4��W6�!����w����m0��Z
y�
�e�
�a��q�Է���� x��@9f�D�b����'�٣f�y��ɘ��z[��9�is�T؇U��C�y��)cC������G��:hS��$PA~��h}��TE��O{��`�t\ީ�i۶�u���m
؛�Y�畂�l�J�G_�b`�E}�I�Bh�=gN��
���DA��ђ}�q���=Ni>X_؞w

y@�,��9\�z���D65y,�CE����{5��l����[�@���%�$�����v���ψ����RfD���t�endstream
+endobj
+10297 0 obj <<
+/Type /Page
+/Contents 10298 0 R
+/Resources 10296 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10231 0 R
+/Annots [ 10300 0 R 10301 0 R 10302 0 R 10303 0 R 10305 0 R 10306 0 R 10307 0 R 10309 0 R 10310 0 R 10311 0 R 10312 0 R 10313 0 R 10314 0 R 10315 0 R 10316 0 R 10318 0 R 10319 0 R 10320 0 R 10321 0 R 10322 0 R 10323 0 R 10324 0 R ]
+>> endobj
+10300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 684.0467 161.8403 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_dad834921ba7c139b0cb10c507b4070a) >>
+>> endobj
+10301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.3297 684.0467 274.9299 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >>
+>> endobj
+10302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [283.4708 684.0467 316.1976 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >>
+>> endobj
+10303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.5668 684.0467 431.0329 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >>
+>> endobj
+10305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 633.2373 161.8403 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.58 633.2373 213.3865 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f15f956dac6d4b19ecd8fee0f9718f29) >>
+>> endobj
+10307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.7237 633.2373 288.6537 644.1412]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 525.1961 226.0342 536.1001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d84befb6d0ded481871cbef1b7306824) >>
+>> endobj
+10310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 525.1961 369.1059 536.1001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10311 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 486.3419 178.2386 497.2458]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8af124edba7c75bc76ec394405aa893e) >>
+>> endobj
+10312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 486.3419 253.5057 497.2458]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [295.2388 486.3419 343.1688 497.2458]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.0713 447.4876 160.4372 458.3915]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_67a7d08f3cda46f7a743d46f3a6f33b5) >>
+>> endobj
+10315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [168.4089 447.4876 327.4213 458.3915]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [354.9839 447.4876 513.9963 458.3915]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.8197 335.4614 225.7496 346.4739]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >>
+>> endobj
+10319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.4449 305.8818 277.7324 316.7858]
+/Subtype /Link
+/A << /S /GoTo /D (main_representation) >>
+>> endobj
+10320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [443.2333 252.392 502.7896 263.2959]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+10321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [100.7342 240.4368 174.6765 251.4493]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >>
+>> endobj
+10322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [402.4398 169.0142 513.9963 179.9181]
+/Subtype /Link
+/A << /S /GoTo /D (main_representation) >>
+>> endobj
+10323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 157.059 156.3011 167.9629]
+/Subtype /Link
+/A << /S /GoTo /D (main_representation) >>
+>> endobj
+10324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10299 0 obj <<
+/D [10297 0 R /XYZ 90 757.9346 null]
+>> endobj
+10304 0 obj <<
+/D [10297 0 R /XYZ 90 652.3306 null]
+>> endobj
+10308 0 obj <<
+/D [10297 0 R /XYZ 90 571.4486 null]
+>> endobj
+10317 0 obj <<
+/D [10297 0 R /XYZ 90 398.2123 null]
+>> endobj
+10296 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F37 1999 0 R /F11 416 0 R /F101 2079 0 R /F67 370 0 R /F33 485 0 R /F10 488 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10331 0 obj <<
+/Length 1922      
+/Filter /FlateDecode
+>>
+stream
+x��Y[���~ׯ�-Rbz�Bw���a]��z7.Ǟ��ޚb$FCE�g�_��7hŠ��d��� ���ϥ�sH��G��K��H��[�~A�t���fq�R� A��"���;�8%4�ټ_�"�
+	�x�fE�2������rw|�6uz�S~W�����^�xY��r�|�K��\���3=��
�E��%r��ͫŋ�NUk	g�(EY�����#��<x��H��`��(s7�Ż�ߺ}̄^0��@�W�,�B�
Σ
a��i�*`
L�����<��#Fñ\�˕�/��\EC��:��j���Vɿzɩ�H퍱����t��GԖ濬�:m��Wu�"|�1�d3r_�v�C�ZС��&�jd����Xğ���}�ϳr{?��
����/�i�b���)�Rar\���! �-�Ya�ps�<ꈪN���AYa!��4��^�-�
�u:�	�á6c��~E�BL
S��
S�X�����l��B��.
�{f���e��A�&w�M����Uȩt@�}�
�2��6��E	�&�d9,��Y�.�
�N�_?v�)-E]
�\Y�QQ1�;�
4D'�;5�9"2�Dk2(�,V �DDx�� 6t�D�D(�J=�i�]�e��dw�u蔦1G�Ġ�2N�XJ$��q���0�H2J���c���n���!?X�!	��;S�~J��.�y �,Λ�݇}�9��1�u�ީ�ڝB����j:{,O
���(*L�1"!a����,������N-����@7|��$qv�,�ە����z�~̩�@(�
:8�sgW>ܤ?	,M$�ke4P�J)�]�m���^�j��2	+m�r!��'">�=*,�S��i�"���>j���a�`/��
+^jO���߻m$��
Lip����s̋�Z�=ɖw��
�ݦ13����]P�YS�Ŧ�CU�n[6�
4��Pn�c~��#�eD��I�0/ы�cx��2��;m�v֬�ش��\��δ"4u�&
����O�M[C
+lgb�CՖ��,|�L
t0���zܾ�6(���� X7(/��n��
��o���șZ�]�.Zt�
I�
%=�}�QRA��~�t+Nx�9�?8V��`�
�(E����APD�g��&�۫A� D
��;�Lj*^Jc�ݢM붓y_�{��N;�¤f(�m��5�MGSe�����
T8�=�����6_�Z��
�M���xl�XD/���xS�|��
P|;I�ϡ����eA#c��*��
�"���Y�DHƠ�7n��KY��G��`v�zUa�c}H��7P���ʲߓg���gϥ�m3ۡ0x��	�oP<����q Eb�A�g�~Nz�����>�Nxם�qwR��CqW

+���n��
+w+�v+�4|�����Q�=���d��"�p�������n���&<����}�#�l��n�a����܇�d����VB��;�_��M�B��d�B��42h"md�I?2�L�V�E]�Q� ���G-
+N�Eoѵ(j�iQ�x/�q�5�`�3��V�)*/�SF�/R��"��x���P�	M.$��!������=

xJ��d8߉�
D�%
#r��+��:_z	��	�^v����{���.�
��1��r��.Lj�5ӺU� �K�VA�v�Jͭ���.-��G;�闤f������m*������C5���
+=!1�U����|6Jb�`~i2��3�ȡ�O�EJ���Dn{��>ן|��P�8��
��CDp�x�|z!2�4�#��Y���=������ˁ��_����!��i�������!��/S
�r�&PWuF�r
R�^�˲S��Ί2��g�~����
+w�ɣ}��m[]_]=>>"�r *���UU�N��0F	�|;sza�2pT�]�oi�ҽn�
ܧ-�p����IU�
S7@�endstream
+endobj
+10330 0 obj <<
+/Type /Page
+/Contents 10331 0 R
+/Resources 10329 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10231 0 R
+/Annots [ 10333 0 R ]
+>> endobj
+10333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10332 0 obj <<
+/D [10330 0 R /XYZ 90 757.9346 null]
+>> endobj
+10329 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F11 416 0 R /F7 574 0 R /F67 370 0 R /F33 485 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10336 0 obj <<
+/Length 2631      
+/Filter /FlateDecode
+>>
+stream
+x��Zmo���_�o��k��/���a�����ޥ8
��˱����M�_��Lɲ��m�-P�EqH�3�3$Ef����
+���v{�gw��O$T/�~�
+�����)fI��j�z�	J��j�sF�l� ��ݜ�,o����9�Y�y\�&����i���ի���謮�
*p��&o[��}�*\]Q��/("2f��׫o/�\����&�U���Ͽ��f��F /f�P��Cg�
NY,l.~��[ߏ�p
�
"�����EVH&f�2��`�.WkО���ͦ�S�ݗ՝u[/C�5Ⱦ�,��
˺تͷ�i��l�
�7�����W��/��.t��M�d٪���}?F��u�Ӄ���7�`�k� nN�%,R��aq@���S0����Y�d�Id�V@����$؉z��EA^b0~"�WK?tY�E�{��ݮ�wM�w��]QM��Mp�_�����eս
��O�?�r
(Tlʪ���
�`��d&
E�+��ϑ�ҋT܇����D�J�C�v�__�KHB���v>�/�y���'���lqɅk�[�|����a:
��‘�F��
+\�v�wUP�A�������
���ٳ�?ZE�.�0SN�T�����?=ٰ��a�p�sЉ�
և������Z;o��,w
cD�o�u��[NJ 1�G�jUP^���"�j��
�;�m��>����.t�\�����
�
�7�m�oCE
�4�e[
��&���׋v���3��+���|[V�-�{�jߗ��
��^��o�Խ�o��xS�����,
'6@�xv5׶wW�[���H�
]���n�+�Ƈ�Sz�
���
X�'pj[V��gޕ��e�
`bgce��N^ʵ��)>���u��[j_��~��6n=���V��Rl\��%�c��7X�0z�%ݢN��u�~a#j�,�=��0U
�mD�Ưa5	_Z L��	K�64��/
+-R��@�1��4Hqc��o
��n���Dϳ�P�H�i
+��
��)^
+�\��>"T��B$�Y�[go�" ߉"ƚ"�E"G���r[T-�i��`���
8�1e�J���N[���gRN"}�q��9™�]���-̰k�@.�)�����'@����C?��(�� %�$��:2F�}Uڕ ��4Lm���HF����S���O
����!
���Bp�a��0�# ��Z��M� W�)-��0�“*
�8���6D���

�t���&����l�
�Ǯ���z��k��&m����1�!Hm��":��>ᡞNt�X��� ��N,_#J}�Bp �?���L�d�O��$�ԌjHnrPD

4/G �	�Ǣ��=�;
I:���0�
���džS�+b �a/bt� �.$�T#-D4�k�lI�=
�h��=��9��ҊsXBB ^M,����E"6�\�Zؐ'7ǽ��(�� 	<Z��>:Sr�zd���>q���'���aC7}r2Gk g��"dB!C�`]_�"uN�
/~��S�Ӥ�FJayL��$=�
��KG
+L�z/�e�:��(n�)Z�hTO�:��
�L^O��{/���.���
�����\�Q~H��u��$�Ƣs��J�_�
V2oB�.v�O[�S�z��P�
���YA��%��e�'�
	:��TbHAX+s (s���q �pp1���FEC���m1�{�TT!*�j\5�i�䪉|�SI
+O�T��
+񔥆�O�c.8����c���?00���R��N�@#ix8��N 5
1��yH�N �9����ɓ@vv��
)0M �ؗA ���u��T���ȓP[~�5$jσ�T�
��b�?5��+��
J��EK�/���A������
О߿��
+(�|��
���#���<t�I�̟m���.�ҭ}��z1���l��RǖgP���݅����&�Fg|BA�Ĩ0�{a3�&/fo�;(n��rY�SV[�8w�X��l�^�c�'�~��H��k$
�'���3t���H6U�7찗��r�z9�<�*<�����P#=�
+
m�žT��Om
�������`D�nj���Qb�Bb&M<�����>�U�ϐ�Wm<8W��\�C���[wa�uS$w͜�̝�C:��S
+I�B��b��J����jLJ|y��W�8i
�
<�	"�i��Yo�RG��\?� ���h�����N:�
b�L T 
4yf
+���Iz�ߎx�φ.e������]m�&�O0mu��M���|�k��n�+�>ׅuN���9C}�_�rW|���
�"�p�k'�Y�M�a��4�9'�;,v�_�2��K��S��A�	�!�AF���iG[	���O�0��@����.=ä
���|��
+��b��}PxfP՝.��_��
�)
V�9��d}\�x������t��
�CB��=�1̌�{�x��h��A
�"�	f�&�gB6J}J��
}# FmhN캰�=)�g},��ve��{�C��(1ج��+d?
+��m�/��|��m���P~�W.��G
�'P������l䇢�\��b`%_�~��r�l�`����x��Q�v��۽�����G�-�W�Aew��m.�zq���@jgVo�

�20?ϓ
+�.}Lm릈_���{t�`?y�P�_O�v]endstream
+endobj
+10335 0 obj <<
+/Type /Page
+/Contents 10336 0 R
+/Resources 10334 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10231 0 R
+/Annots [ 10338 0 R ]
+>> endobj
+10338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10337 0 obj <<
+/D [10335 0 R /XYZ 90 757.9346 null]
+>> endobj
+10334 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F33 485 0 R /F7 574 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F1 583 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10341 0 obj <<
+/Length 2512      
+/Filter /FlateDecode
+>>
+stream
+x��ْ�6�}�BoKm,'8�<$夒M��x�/qJ�!��)�����o� ER�F�d75UC
�F��Df��L�i���jw�g������/� _�߽�&3�tL����a�	���}�kD�l� ��͜�(�v��͜���&����C�T��^���DEe1_P����}�g�6n�+x�1������#5�D��XB������p���0bZ��:��lw�)k;��ۻ�:<~�-�b� l�#��8B�D�01��!

���l�?Pe�C�d��w����ѳp���,ٔE��^���Y���T����D�Y,��M˶Z���4˜.�� oO��c���9ޞ`�$����
�9����,�-
�e��s*�c��U������zķCm.pt}(VMҀ3'd�mYA�zK@�^g�Y�+�풍��sq�T�u�KB#!t�Iטu��’3�F��#�HD��;�v篗ozJ�a������-Y��B#
s��(I��,�J������/����,�",f�Z� [...]
+�I>�~���r8�8a�i
`1!S����; �Q*j}�42s"���Th�MRy�b{'��bJ�c�d���j� K��U�"
�G��y��(��������.+���H�;�e邨)�5��B��R';k�ZG��i������K�������,���a��a|�-�:���E�da4��
*�ްу�d�&lU%E�'�I���DBP&�Δ�u�,
�XV��
�`�A��8z��S
y�����`�=VS��i��q�{�B+ �)��~�G����̓[²u�M"p-�x�?
+~�y���_�
����l���?�&}�c�0��ig��M�tR%yn�rS%;?s̚���pnM��6�m@)�0_����R�l�N9]���Z��@]�Yʇ<{�*���9� �XÏj?ؒ�{N��
�
90{B#H�]V(H@�W�`D�
h�H:Q�j=�
d{�_��$�53
{3"���4P_����$� V
��
�0f� k��c�wsB N��)7',^0����ܐ!���+v,@�e˒'���H��I�2r���Qҹ�K�'�ɔ�K����M�~��;���3���)�3����i3�
+���"m3��$�s�S#ƕ��xiYժA�1�/

k�׋�>�墁S�h�'�uY�����|L�t�ЁY
+����ϧFV���2!��rd}ì/k2��6��M���W4����W�
��~���a��=+������fYY����x�	�	����9^�'���Vo��&��n��)Le����G7;��M=%�M����Xb��/C!�
�"���
����������z�d%�fPJ
0�[�|��2�	����[%#'}��'�Z��|�F��Oir�|k��)�f�$�Z3 �1���&�|�R�^PP�l���f��Wx���w�#|}b�� ��4�|
���cP
�0��_�X+��;L�yE�
��`P�QHRP_�6 }~��#N��L �H+�oD�/!`7"p���Y
��T�
�Dp/�s������^@F�Q2<�5�R�X��q��~>�L"�A7z��	]�b
���<���2�)
'C�r�K%E1
 L�!��J�a
N��7*T��+�
�d��S\'FLYx�8��	qҾ8�%q�8�u},�ʊ��he��`+ at nel
+?l]��V�
�<�8�J>�–���(V՜�������
�$݊W���:�U�q���Ba'$�@�
�P
���P+���LR�׍��HP��d�
��}+|�e\���)�
��TBT��
�c�nK�r���Z[����
�PM���&�`~�﬒�7
���M�Bj
�S*k� 05	��^FiX��u�h�m���i�۪L���ڇ����};��H3W,�
���@�s.�W���Ɯ�~%���\m�/�,�ˉ
��On����%
O�J�$����	}�
�"�
5�VIm\���K{�e�4j��a��I���_O��%=��(��5=`�� �Xo-i9���$�I�&���|+|Ǟr�b�!jS���*��=t�T���9(���(�W��œ��������ѥ�1fm�:N9y���.��iI�R�v�m2�Fk�Oz
�Z����"�|Z��p��� Q����6
&�wFO�圿6��] z^����M����w�F��ݾl���np��
�昭�
���QW�
r��X ��1\�fx1Уypiq���GF��ݭiR�Q�Ok ��ֿu�'�N4����&/��}��E��~k�~^+$�&�k��
��\�����������~_�;�@T��\�(��Ǥ8��'��1���^�l
���w��ƌ�C��E r���gֶ�y:l�`�[���ӑ��ڃo�f������V5:پBY����c�87J!��"�EtFˀ�
�Xb [...]
+endobj
+10340 0 obj <<
+/Type /Page
+/Contents 10341 0 R
+/Resources 10339 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10231 0 R
+/Annots [ 10343 0 R ]
+>> endobj
+10343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10342 0 obj <<
+/D [10340 0 R /XYZ 90 757.9346 null]
+>> endobj
+10339 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F8 568 0 R /F1 583 0 R /F7 574 0 R /F25 348 0 R /F33 485 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10346 0 obj <<
+/Length 1972      
+/Filter /FlateDecode
+>>
+stream
+x��YK����W��HUo���^�S���ƫTŵ�Rq(�
�I�����i�E��u�����Dw����"s
d��<Ҍ�y����<�nj��W�~��j=��F��FZR9_?�V�	J�|��� q�\������E\����%ŋ|w|6�2�|�>�qy���?^�ȳ�
+�x�������<��;�%�CĂc����v�vݙ�z"�$��_g?��<�v��J�_�#�5��g�2w��}���[�yq� � �D(CX
+vF��7yV��!��q������u�
�&��:T�Yп�
1�IYD�8�� 0-?c��KMy���5��
��d`
g2��9��l�<4(F\�V�˕�|�M��
+������^1Α&�lnj!����M�mPA��gm[d�Lfʸ6��;c1
h�
+��Ι_�lX�(D#��H+�_	
V��V�cQ�Ij���Ȃ+=?	�UZ�E�$�M�|uHw�6���_���m����4{j��g�\T�Iҟ1�f�~Y�)��Th�e�@��h.�@J�ppB���8�F3X
rR�N��)�Mm��~��`�"FIЀ�!���/�G("L�W���3�*(�O#�I�{�$�!E�W�v���V:�參��#���8���Q��3>=�)|�XxkyD
+a��
���(Ց`�[��<�҇�gZ�ߖD,̹|VE����q��j�UnA\h���y���X���	)�V\]���z	��Z_B�X�<��
�s��%-�e�>͇bf_��K5�r���h�y��
j\�5v�[�W� )���
}�fG��n�ؾ|����_:'a%�z
�}��s
��|š/
+�������bg~O�㦡@cu��պ
�t��JI'��@���&�3����y����{��w�����J�W�~�j(�����O�Pn�
��$K�6��U�#NB,��D���Ր��'l�Vz��ӉU5O�6Aӧ,/�6�����"���z
�ʺ�1�E�V����&�O��$G��
���8N�z��X�f�j�/q$wf$!2dI��t�7�%�Q$��l��X�{O��y�ZI�9_
r���5\=͠z�u5bb]�ׅ�uV�7�"_c�"@L��e�')�i�ݷ��qdI�;vb���$g�6R
�k����kp:B΁W�C_l
+'v�q�Vۇ�W�:��V
� Z�v�\�@m�K3�)�u9�)�%�ŕ
�I]�qLB)�����S�3�T~�O�ohŅ�91kFUo���lɁ�ƻt��˶3
����S�ID:��1^X)�&���3f�\�콸�6L��^Tr,,
j���&ąnE���n
��îU����!���[��"p
+��2L�#$�ς��vk�
+��ٙ=
i�����H���m�����o�׺: ��7w�v��I���l�e�!4\�b�����~���?d�x��HF��BiK
���v�)����0�2��K].�ʚ��=!&
+�Ȓpa�Į�I��a�8L
<ůI
H�f�ڠ�/6���B
��v�a�5L
<�'pXD�
Ģ��#�A�8�����'+�ًwu�"m����-��b8�J���
��S���P]�z0I|�Z'��P؟q
��K߅_p��t��}|�g!�R��ݴ���lo'O����?�C�+����'�UoO1���}Zo+4V; 	��8f��/ۂx�� ?��UǬ��:M�������5��f�Ƶۡώ{�
;���T�7{�<F'� b��tu�I]���VQt3e
)���Њ
�wb��N"r��#c”�3�ONY�l
+m	k��cXx���~�<��+]�~$ґm�}#�f��V/˒�[G��ۖ+77��L�;�kA�>�񮹶�؍�;���44�\
+>����!>TEPp	�Qj��2wW�<;�}��}��Ũ��h]��s]�ww///(��!K���]Q��v��6�U'4�Ń��ΕV�-�n��K�
�O����)��CƎendstream
+endobj
+10345 0 obj <<
+/Type /Page
+/Contents 10346 0 R
+/Resources 10344 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10354 0 R
+/Annots [ 10353 0 R ]
+>> endobj
+10353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10347 0 obj <<
+/D [10345 0 R /XYZ 90 757.9346 null]
+>> endobj
+10348 0 obj <<
+/D [10345 0 R /XYZ 90 733.028 null]
+>> endobj
+10290 0 obj <<
+/D [10345 0 R /XYZ 90 716.2211 null]
+>> endobj
+10349 0 obj <<
+/D [10345 0 R /XYZ 90 716.2211 null]
+>> endobj
+10291 0 obj <<
+/D [10345 0 R /XYZ 90 582.6346 null]
+>> endobj
+10350 0 obj <<
+/D [10345 0 R /XYZ 90 568.1414 null]
+>> endobj
+10292 0 obj <<
+/D [10345 0 R /XYZ 240.2453 505.47 null]
+>> endobj
+10351 0 obj <<
+/D [10345 0 R /XYZ 90 488.8199 null]
+>> endobj
+10293 0 obj <<
+/D [10345 0 R /XYZ 90 310.2393 null]
+>> endobj
+10352 0 obj <<
+/D [10345 0 R /XYZ 90 295.7461 null]
+>> endobj
+10294 0 obj <<
+/D [10345 0 R /XYZ 90 89.4414 null]
+>> endobj
+10344 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10357 0 obj <<
+/Length 2056      
+/Filter /FlateDecode
+>>
+stream
+x��YK������)���ͷ����.f��L2��젡�նYr$y���S�HZ�h�g�{|0%}d=XU�J"3
?2K�,1J�����6p��b
/��bx����V�Y�I�l�ح 	���r�)"q6_�q�aNp�ֻ��Ü�*��l]��?�uZ��DEU9_P���E�4���c�=��U�""��?/��y�t�K�D+�ߛO��l
}�K��=�F$I�lw�)���Ǜ�u�݄�Ca/�eK�N
A���J�S�%2�
��'4��UQm��/��&�@!�9bRR�@��jd��q�
��c��UU6��Lr�88l%B��]Vfu�V���c�f�~�~P#�0���4RB���.�%€>���Vm���c
`AS�$S
+F1���nқC^�M|������F�c]�<@3��z��7��u.¾��6
/��۬�[�Aka�>]��:�ee��	V��:�C��yN(�0Q�L2���$����Q��1��F��}h�PNwY���ݹ|�)�%AF�8�X/��QL�8��E�� U��O{��Ƃ�h"�!���v��޲S�񲟈�&*���?ؔ,�o�Tx,b|M�E���Ρpr&�9g:}L�g?cL˼�\t���$BL��u9�E���qg���U�o!'�;$|b�FZ�����M�����9��/i����zs�ю�J�����C���v�b]?a�)���՜��I�'&�����7��a*�m��@�
%�<?���ꃸ�䍑V���>m�"��<��6 B1�	��c�71A
+w�Q�k=4LZ��)��Yp.b��B�X<�����U��ݾ5��A��s�:�
��l��,^,��ћȡ
�ا��FL��
��&��
��R
����V���s�kL��/f ^`M5W�U�ݿ/��6�l
�$������
+���
�$FBEe�9L���DD`�+�_Cf�o��p*t���J?D]��
"E�/�2!��~�G��;�u*3i��ʌ���'�5�
�P�D,�P�!l�?v��LKuTf$5Le<��sX�\�8�\��
˽�
R}���c��,d£�m� 73��_bU�u�T
+�
��J�z�3;���
����Ccl��U�]�mjk-
��"į�M[V��L��R{je�Ut5�3<נL��ι�`��XRz%|����q0�p{�$�H��5���3���1��~c�a'�wH��
�
�6]��*-������i=f5p�<mm�n-����cu��`d�j#z'm}�V��5�H�K�u��2(�^̡C��6�\�
oa_ǡ'
r��#e�
�S��
z�C����
�}��N�n(�q �����ȕ���}V��
3
�/[�v��EH�@*V����� � 3�۽ע�ݶ �@�ѳ}yA�9\��� 49�
��9� :p�z8�+M]&
N0(��
\
y�ŧ\�-i� �s B(�x�����J�%*g��o!��9o�������
+t���#�N��Kۀ�s �c	k�7�������û�_�ꕠ~)���BG��2IQ�������
씐G�}��/i��
ob��!%���У8:4se�8-��i������
x[5�;\����c��V��vyZ�U�u?iH����0hvp�g]����*��U�~�Λ�3h�V�u�yC��׊5�(�<�i�1��:�.��C��Bm��-���ɕ�m���-੢_Է��O�"a~�`���I�����p��	~;��M��mCؔ,�(�
�eڦI�5}ּ鏀	�E;�6m�
zM�'^7��3��״^d1��k^
���ha���I�%��5��;|"�/]�vL�h��囲��>ъ6��Ic�M�����m��Z*p[�}�Sb���Y��tm׼�\Z��_��_������0���Ǵ<t�ƚ����b��x������섾�A|̲s�P�T 3��?��̎�z2�MX
f�e3
�<ZW�m�������Z5�P�����~_ܞ��1F	j [...]
+endobj
+10356 0 obj <<
+/Type /Page
+/Contents 10357 0 R
+/Resources 10355 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10354 0 R
+/Annots [ 10362 0 R ]
+>> endobj
+10362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10358 0 obj <<
+/D [10356 0 R /XYZ 90 757.9346 null]
+>> endobj
+10359 0 obj <<
+/D [10356 0 R /XYZ 90 733.028 null]
+>> endobj
+10295 0 obj <<
+/D [10356 0 R /XYZ 90 546.5409 null]
+>> endobj
+10360 0 obj <<
+/D [10356 0 R /XYZ 90 531.9706 null]
+>> endobj
+10325 0 obj <<
+/D [10356 0 R /XYZ 90 312.0832 null]
+>> endobj
+10361 0 obj <<
+/D [10356 0 R /XYZ 90 297.5129 null]
+>> endobj
+10355 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10365 0 obj <<
+/Length 1678      
+/Filter /FlateDecode
+>>
+stream
+x�ݙ˒�F��<�4}����q�cW�2��qQ(�a<o�#�$tii0�8.��ƒ8�>��ߟNKd��<TB!ø
.�<�����<��'Հ_��;)�I��~�� 	�����È��xB0ƣ7c�G^���o������_���U����a6�^
=���
+<z��G{��_��o~��]HD�8���/���T�&I��?��p#z9��-�g8��C����8�
�ޖ���\�®Q�2��`EP��k��ec�;��$(�k�<��0�K0<�qB9bܐjC���Z��Ϣp����' �-��fVf���
$[�֟X�e
{
+�M�� ##���c{A�ر��FL���%��/
_ڈ�r
��<�n�m�v��C_��	�PB��[����)s�$[�
������h�
+=Y������
�\
;�;Z͔�V���|<�#�I1�d

��qL�/\5���n�m���
�Ӻ���A �d
��kF
��VCIS��v:��T�ڮ����E���z|�y�2�g;	�H1J����(��Y�<s�a�Ҫ��j6
�1ǣO�.Xͽx�-�VRF#�.�^Eʨv2���
Iǵd�q4�bt�
�
��1���b�ث�U"
��=�҈K]�΋s�����=	�e�?�z[�|�X��S��)��5��&�^�ߐoЙ�o~�%Q܍7f�f��m��[e���G��#�mㇹ���!VuAo�� QLL?ݪQ�t0�D(r5�\��Э���ne�mt�U�B�V2n�Ւ�
��g*!�YazL�p�HSc�pc�Y�f���O���,�Œ���
o悫��S��2���Y��:��ܨ���8�H=R�]b���İ�iw
��
������ky�mT���´Fn�U��N��nI����?��`O�� ρ����x´��_�q�
+�EP������6WA�m��΀��-'�#L���U{����@5Q�d˰b��b��.����	�o�t�f���C�����+��'[���VR��m[���g繓h
���&�L�FuS�Q�"�]M5W�=\ke�&[v�z����o�d�WwL�p��L�_�c~i�*��i
m
j��WC��4#�
���N���Ҧo�Y���+��a�
��/�ޱd
&��|�bG�v����A�&��B~<���
O�9ƆM�H��W~�S��$,7ß�I̐!�n��T
�
���TըnRQ
+Q\��I�꼇T�,ܤ*�n#U�"R��q����
����Q��ڳ�
޲Y,�&w=y	��SO��ͼǪ�kB�Aac
en���&�6�-�S�:����[Di3��?~�pm��u�
+V�ϝ���v�z�h�*�$FD��s~z��Aa�����6�ׅ1>�2��&!
i���Y��P�GO���,���Ӓ:�8�H�N��=8�
�f<5
+* #�qZ	�)���˫i����
�,-�nCi��63q����

��se�W�P��{�������aa�̩&�n��>
g�ʥ��7��["��O?�jv��������4'�=����?��������ݥƴ+:��RŇا*$��2����7��Z�	��d�{X
�vlyär�]��2�V����Ir�M���-�����p�M�yq��'ޞٛ�A�\j�sX�Ra]�e]� �Q\�.���-eo�۩�
H��endstream
+endobj
+10364 0 obj <<
+/Type /Page
+/Contents 10365 0 R
+/Resources 10363 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10354 0 R
+/Annots [ 10374 0 R ]
+>> endobj
+10374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10366 0 obj <<
+/D [10364 0 R /XYZ 90 757.9346 null]
+>> endobj
+10367 0 obj <<
+/D [10364 0 R /XYZ 90 733.028 null]
+>> endobj
+9957 0 obj <<
+/D [10364 0 R /XYZ 90 716.2211 null]
+>> endobj
+10368 0 obj <<
+/D [10364 0 R /XYZ 90 716.2211 null]
+>> endobj
+9958 0 obj <<
+/D [10364 0 R /XYZ 90 619.5957 null]
+>> endobj
+10369 0 obj <<
+/D [10364 0 R /XYZ 90 605.7619 null]
+>> endobj
+9959 0 obj <<
+/D [10364 0 R /XYZ 90 511.1738 null]
+>> endobj
+10370 0 obj <<
+/D [10364 0 R /XYZ 90 497.34 null]
+>> endobj
+9960 0 obj <<
+/D [10364 0 R /XYZ 90 402.7519 null]
+>> endobj
+10371 0 obj <<
+/D [10364 0 R /XYZ 90 388.9181 null]
+>> endobj
+10003 0 obj <<
+/D [10364 0 R /XYZ 90 294.3301 null]
+>> endobj
+10372 0 obj <<
+/D [10364 0 R /XYZ 90 280.4962 null]
+>> endobj
+10004 0 obj <<
+/D [10364 0 R /XYZ 90 197.8633 null]
+>> endobj
+10373 0 obj <<
+/D [10364 0 R /XYZ 90 184.0295 null]
+>> endobj
+10005 0 obj <<
+/D [10364 0 R /XYZ 90 89.4414 null]
+>> endobj
+10363 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10377 0 obj <<
+/Length 2231      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n��}�W�)��U���-��E6��d�A
&��(��D*5��ק�ͦ�b��<
`��)�X����.G"3
����
+��l����g���
i
/���+�LJ��菱d$���u�A$(�����9!�������<O�]����y���IWe��S�T&�����[��E~��Ͽ�&����%]���4_��
s��퇇o�{hMmV"�$��ݼ��g+Xя71���>`D����
�����z�V�{P�s� ��P����Đj��T��Ҽ�A��O�1_

�����)�VϋU
+��^��̫��OY�&���:
ֱ ���6���ο�C���;+x��Q�eIp�`^�o���Z(X;шJ�!��8�֞���*eq�M#�>˷`�'(hGL�HK[@�����_��X�R#���R��4��:&�L�v�&��]�����G} �e���1�Єt��i��.�]s��#vk��飁1��K�:�
�3�82�݄j�
b�1df�:?NZ L��I���$~�Т+�?� �tI�b`�
�e�� ����S�%Q��tߊ ~	VH&NZ��ju��x�1�f�Ǥ|>�Ҽ�e4���z���z3$\�<lJ�H�q���抸�
	%���ӑ�&")�*Sg�*/ڌ���e��'U��MQ$g,(��4ؙ���M
�M����.�-�e�N�
+�#+��ɏ��>���6���s�7�
���H��k��l�
'[��2���q��G(l��Vq&�n'�38�yŵۏ��jn���@�`P!�!m�`S��C~�˩Za��b� :�ba/\��W���MH�H{H>'m�f

f^T�"��O'��
+#��t����e�~pe��y��C�?������G�y��A� 0k�M���}΂i
+'�V��i]&�&EU����Lm�֟>��l��C_�m;V�j�T
+����d�Tv��K%4ZHp욜&�%��Jˑr3`�\�,���V�0>�(��
�J�q��%P
��$�}�[��3��NmȁA�ε*|3������;��tY���05��K!ޠ.�a�c���=�����vڮ���vy��p��BV4z�K����K�cMB�v�rh�ʤ*�-+֗
�aoAH ����VWl�[�XPϽ���q`/��y

�B��[�4/vY���R��R�)u������j{ �
LF�ōC{�>tp҈����!��tcn�)?�
�3A�����5�S�oh��kBWj�&p@�]<>���B�܊��b��F=r�z��ǧ�����;0��vI�O�h�e�w�VB�gmW_�����b�q$"ְ	gGU����N�۴�p���D�	����B���
K���u^ֳ�e�����#Z�8�2m��c�SݟÆ��۳���A��_�J�
c�<��i��yU
����=���
�|�p���+���U3;�=y>Rs
�|�"|��~=��vj�!�f
i�r�lJ�nl��Hs��
��
��sLu79B�*"�@�� �G�|1y\3��3�M���3��&���.'ȫ���Lܟ}�y��e��i�)	��_�u�i��iD�F��'�*4�nm���J
7��qv3`���Yo>[�I2b�'2��'#��f2���q�+6�]^l��nɈ
p����
A��R1��y�[
�1oy�i2b
�%#z�q2" ��d����;ᯎؘ���%d�8tKF��dD ������`�����k�� ����'p
�K�A�P�}��$��&����Y��ν
['.�i�:�� ��dۭ{P'cx%�D��f<�}
+�}5�K���r[
�e�����
v�H�'��6���=`dաiX��&���
8v�� a E���Rý ��UIc.&�b�c�wn�@�y�בP�
9�P=c�$T`��I���5-�F
+�~�k�"��Ҍ7�gq�
��A�6��	��m�
{׍9�j���pf��SA���!����&
0Pئ�K(=�?q$��4��f�`��&�	SZ|�ax?G�iĥ��rXg�	��$�|+?맄��'���e���i9��T��^�lPY�����2����܇�
����B̛6��$?&��3,c��<
%`*��A�eX���x�k����j=��^��%��3���b��7|
uZrO�]�����ww///hy@�<ۗ(�����ݹ]
�HF�UٽE+Գ%p?��#ց-k���
+OY7wusы#[("��#xY�endstream
+endobj
+10376 0 obj <<
+/Type /Page
+/Contents 10377 0 R
+/Resources 10375 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10354 0 R
+/Annots [ 10382 0 R ]
+>> endobj
+10382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10378 0 obj <<
+/D [10376 0 R /XYZ 90 757.9346 null]
+>> endobj
+10379 0 obj <<
+/D [10376 0 R /XYZ 90 733.028 null]
+>> endobj
+10006 0 obj <<
+/D [10376 0 R /XYZ 90 635.7621 null]
+>> endobj
+10380 0 obj <<
+/D [10376 0 R /XYZ 90 621.1918 null]
+>> endobj
+10007 0 obj <<
+/D [10376 0 R /XYZ 211.8424 387.521 null]
+>> endobj
+10381 0 obj <<
+/D [10376 0 R /XYZ 90 372.7963 null]
+>> endobj
+10008 0 obj <<
+/D [10376 0 R /XYZ 192.8535 97.2725 null]
+>> endobj
+10375 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10385 0 obj <<
+/Length 2276      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o��~���S+�z����I�4Ny890h���R�JRq�_�Yޗ\��9Z~�
�������
+�Y�RB!ø\�N7x����!��-<��	�|s��+���ru(9H�%tu���&q��������u�������i�r
�Y��}����]����u�l�T���q��������d_PD�9曏��ݼ�oU�w"�$V��|��W{��w71���.0"����S�\�7?����S=(_�Dv�E(CX
+�Y1Dpm��4�7�I�
�xC��v��;EIt��
ZNf�
x�&yQ1�>J� {x�۹�]�Gֶ���r���S�
Z!H�qh_+�����$
�-�W�6�u
~���0)*��$H��2�~7J�G��p�>C�I��$@�j�]	�C�3�0e
��엓�5�iiLM!��-��W"�uC�!Jbp�NJP�
���Q������o��,�}�2�Ԍ��z�R��V��� ���}�H���Z���m�߫��h��3�
݆Kq��e5�Jf��"<���N��
��P���.p�B�@�czI�a��C����a�n�X?�K
q��=�
+�7�Wl�-l<Ep�H1B��R��c�;ڗ 4E�1Ҝ�*��<�b�8֋(�G�hy���J_��y����h�E�@�h��L!M��r`C��S��s���OD�r��SX�Y~7�O0E�Q�U`�HK=��9��_�0�q��#�
+8:\����u�KgI�ʽo|�I�Z�"֠P��K����ǚ�����2�<�#�-�'N�DP��!�Ӵ� �j�i^�u���US9�u�͸xAjC4�:pG�Wj��r
+��Hkg��+O݌�0����`�
ٜ�2��
mŠ�-n�ƂG֢�IWpk�}���oj0a0�-
�'�1XK6(�h�flAtC5�2"(zFG�tq��k3���֚Um�f\�k��8O�ͦ]�O�9��
+B�j� ���b���
�伙b�>C-&b�!�j����
+/cq��'8�I1R�h$�0k��j���h̐d�v��?fU��n��m�$6��OHm�	h��|���ʚ\�mM�F�m;�"z��8[m)H���)R�9x[.�[�ZB̈́�5�L�ϴ�4�pf I��e]��v�6���j8��m�	��W
�P�a�#U|p�}9�~IH��!��� �Q2���ݙ~��ST"A�`3j��r
�F��u&/�'�
h��0���PwG��H/�c���Ҷy}�`�4\�S;Y����ڸN��u�����0
]�w��L^;�{%�i	�
�-�zX�P
m�8y�^��6L�6o�0
)*�>y8;I�F�3( 6X_�(���P`8�C���|A>hɠ�wN�X{>�Y�Aj����F�q�4����y���Ε��
g�j��d�Ai��U�O���s����l��Yt�H��p��?#0X���
՜�j�ebVj�@
�������`���ꂥzds�jȖ�y�-1�G 
��+�l/�X2X�l�`
�5ļ����#���5b��P�l��=�9�7dm�%Ic��Іj,�
V�������1�4ˤl�jP����
�_v�0��0ІDq\=��ؾ@�~��:{U=�
��c�����i~����BϨ�BB/N�B0:��qT�u��1�i�Y�:v�} �&�F���>�t@4�R���'���i����Ӏ�Y�t��H?��(�xii��v���G m(���l�ҋ;q��i��)[{Y���8�
q�3�L�N�
��D���
�D&g6�a����IπN
&?�@�e�d#|��`�!����;t���N#.5�T�
+��87�up+���V�4)�(�e��>nUq�|���Ȍ�m���x��}hQC'���
�A��`�뿋�/""�6>
@�R&�����
	h at Z�����Ή��(&�,�Q��l�j��T�ꫫ�O�L�
i᯲-٧U�Y�tUv����:��,�0����G�
�͏�<E�����v�g�De/�s�O/N���T�Z��
+ׅ��0�*烳Q�
|�g'b[�=���&�B~�G�w�R[38����
l�Q_��3h����ͩ�e�T��:�V?�a�Ǎ�澺�[�\���3�W��¬C_ at U|�B�l*D���ph�X��J�����_�Ͷ/l{o4�b��_��cQ��no����.G�$:g(*n���v���؜��-�H��
�F*�
]�pJ�v����r��Q���X�� �>�endstream
+endobj
+10384 0 obj <<
+/Type /Page
+/Contents 10385 0 R
+/Resources 10383 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10354 0 R
+/Annots [ 10390 0 R ]
+>> endobj
+10390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10386 0 obj <<
+/D [10384 0 R /XYZ 90 757.9346 null]
+>> endobj
+10387 0 obj <<
+/D [10384 0 R /XYZ 90 733.028 null]
+>> endobj
+10009 0 obj <<
+/D [10384 0 R /XYZ 211.8424 504.8621 null]
+>> endobj
+10388 0 obj <<
+/D [10384 0 R /XYZ 90 490.1374 null]
+>> endobj
+10010 0 obj <<
+/D [10384 0 R /XYZ 192.8535 216.671 null]
+>> endobj
+10389 0 obj <<
+/D [10384 0 R /XYZ 90 200.5665 null]
+>> endobj
+10011 0 obj <<
+/D [10384 0 R /XYZ 90 97.173 null]
+>> endobj
+10383 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10393 0 obj <<
+/Length 2080      
+/Filter /FlateDecode
+>>
+stream
+x��Y�o����𩕁1�o�zh�Ew��t7=M�b3�0��J��_�G��%�V23���!����{�4Yb�#K��J(����a���0����kX_	�t���Q��FZR��{�N�	J��n�1!q�Z�q�aEp�Շl�aEqR�{����/�}��Ϸ���I��\�����"k7��<�n͔[� "�X�>������k"�$V�->~��
h��#�S�|����tyXp��G��m���
��m�D��P���l�	f����S�[
t{۴u�m�I���d��QeG%
�,/w�?��۪l��+bkœ�YK����@N�B[��ώd�%G`)�	��4�5'ɔ����B�n݉��aI��?�c^yi>9BA��@�&
+I�y��WӞjP7r0C<
ҵ��DΤq
T�\�e��
��xv#X�6ӡ��#�$���,"G:�x�R���%)�k=c��s��d)P*�
�gt�@Z)�	�e��a����
+�)��z Z���j��Y��i9���9�9����7�)FI��D��z*�(d	VH&Χ:��no�r�q�%+��&�OS��t��M�Y��TSa�N�
I�0w��ZQ�<A恡�����Qd���ب�
C��D�� "
1�s�j�o�cUT����V�c���E����v$�
�܀��(��a�L�
�X
��Ȭ�	����. �� Up�m�����f��QS at d >`\ȧ�e�7ݿϛ�j7�plc0�$�U,���@Bx8�!+9�j�����v�N<������9�E�����=6p�:�������_�J��*��501�Ǚ!�u�
#�v.+"�9���~�)�(��d�%�\
��V��h�
L�1@"�1{��b��:;�qb8g���0u�Yr����.c-Y$��U!J�6�.�c$��H�@���O�ij\"]�i(�U
1(�s)5��9��(۹O	��
��Ш^M.�Mh=�C��	�Ҝ����
LkꙜ�	0�I�ŷ'{%G"�i,�y��T��DI�*2�z�ܻ�KSz@������;;����v�mo�W�Zp;�>/�B�X4���"qJ�D������f�Sw
 9��@L��s���� 
gH[���7�>(��`����b4��`��T�SGS?T��w�M妳�}��;/�s;�&3���۶��;VM�(�4�˃�n���p
���6�Ɣ^D�C�"��{7_�|�/
�
X���1u���o
+��
���x�,1um["Kx0M�=v�k��~�S
�X1�f�H����dG��v
�ƚ~LCht�
+
�Yc��Qx
+�%�����
n\
+<�{�r��Ʒr�!*!HG=ǩ1'�;<t*�������;so����˗��a�� �'��qG(|G�ņv��<&�x͆
�t�T
w��
4�R���X�^��K��s|�U��
�_$����q�
�X�3
���cK�m̑������C����U�ܴ�p�c�/L�P{+��_���l
+W'�V�����aV��T���W+5ȇ4/T�!��J
�s)��J
`�RO$�WꞬ���9��b2�׾��2
_#!d	Iɘ�]p�(�:�d~��H(@��ƿмa
R!�T�k�s^�
(ط�W����f-�jHu=�(�T�^��c>P)�Փ}ۻˬE��.a��.#a��.
���
��L�	i��஗�Lg!Xh@��9/���k���!�
z�!�a�=�X��C
IQp�U��|������[��
�n�۸S��7Ғ����X5CC7ſ�Kf_�����

6|��|)���i��,R��#% ����oL���HG˞l���j.����;b��\~5�`�|��̈́ ����1r��9�&̣Q�^x
c*���+��~�y�eKc��B��O'$"R���m��9Z��W
2
u�j�R��kb��Wl9�
��_����\��"��5+O�O[�أ 1��c5������]#�
p�7c.�CS��!c+����0���l�a=�����\���m��77OOOh۠S�k��7�cqs)�i��4�uO4�ed~�+ơ,�k�������Of��I
�6/"�c��endstream
+endobj
+10392 0 obj <<
+/Type /Page
+/Contents 10393 0 R
+/Resources 10391 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10354 0 R
+/Annots [ 10399 0 R ]
+>> endobj
+10399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10394 0 obj <<
+/D [10392 0 R /XYZ 90 757.9346 null]
+>> endobj
+10395 0 obj <<
+/D [10392 0 R /XYZ 90 733.028 null]
+>> endobj
+10012 0 obj <<
+/D [10392 0 R /XYZ 90 623.8069 null]
+>> endobj
+10396 0 obj <<
+/D [10392 0 R /XYZ 90 609.2366 null]
+>> endobj
+10013 0 obj <<
+/D [10392 0 R /XYZ 280.9426 403.4363 null]
+>> endobj
+10397 0 obj <<
+/D [10392 0 R /XYZ 90 386.7092 null]
+>> endobj
+1260 0 obj <<
+/D [10392 0 R /XYZ 90 240.237 null]
+>> endobj
+10398 0 obj <<
+/D [10392 0 R /XYZ 90 225.6667 null]
+>> endobj
+10391 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10402 0 obj <<
+/Length 1933      
+/Filter /FlateDecode
+>>
+stream
+x��ZKs�F
��W��J3�z���4�4}��{J2
Z�dN%R%�8�/��ǒRl7��E
`���"
�?��)��a\z��
{[��Ռ���p���jv�R
+� #��6�I���zW��sBg�%���,���޿~��x
��o�u�_��$~ry��zA�<�K*����O����`���h�^0D�9���W�g/�jSKO������G����3���»�
��1���8e��n�n�g����?�
+�
M��)*�SJ
��V;,���;m�Ly�JD$�y _|^�,����#�)F��V[->0��
ZaT�
+�R��F�5#�֗�a��x��߅�k?�
�A�
�2Iq�SI
��e
�
I�;�\�&��
��b
n�/i;��!.�
�?�"[ɶ��ؽB&�
�B�k�DF�Jȏ�Ţ+ؒ,��"=�� (S>�rh��&FVJ��P�Ňxo�a���?
ov�-9��Bd
B�SH����-)ш(c �
Eݵ�G�=��v ��8S�Ad��N����d[
+�m'x���[JE�X�������?���W~��Ġ�	�^[� �GJA�.;�@��a��P�Y3���6�T|7��1*�O-��i�������,(>U��ݖ_��?�[��E�Rh���$~'i�F���|X�R'<j�>��H�鰤�R�4Ғ�2��.y��8\n<�E./���zDE 
+=��y
���w�+�� #�@lr�(ڭå��
+�Q�K�+$�9 '���b�������*>XW���x1D
h�
(��Y\(���^���i�GL��`K(���I���D߅�m|,wiF�>�7��=˓ =�2�Q�hD��8I�m�q��B�	?���s�1�"+�]�=��'#�P��7Ew��P4����O�4
+VִCѰ�T�[	�M����C�C��1��[9C��!C�2������{��R1U��SXXANI�����s(!��U�
Ԁ�' ����v�)7IH�9j�I�$n�xg?
+�
q
�^�X�Z������y{�i�3�X��+QQ�F
�̆���%��,�e
�0�T�i�hK��琹Р�v�
�#d��O����
M
�w�D-f����4pD�Q ]�]�i���9w�5<�"Y�L�@��h����p[j"�ੑR�MǮ�'�<��Mǵ���x2"

�q�qǘot���F���e
QN��
����V� ����U^K}��A[�ȱ;�����ܞ86�Ŧ�
�A<ylpb�ίzl0��c�i��
zl`:
!e�<�#L�Ѷ������g���`{Ĩ��7,��!�� T�:|F�0
+>��ISӬ{��(Q�R��Ed�18	i.��H(��g
4����

�Ar�!�i����!�� ��S`H�C�A!3'N j�/ ö�ǂa�6=���4����'����`��d
�=j{ R<8C��C��-}���*j��|޻��
d�\hg���:1	�B9Dm����R-�r5Q��
+�
Î���Tc-�v-�T�|�WU�yS�w`����*�f��%H�(�r
�����UW:�����5'缶�8�d����9ϵ��
�p�y����Ɉ4s�����1�=�Q>2�p���
����0��yv��꒰���Iʸ&�QϪm����iQ�|�.t-��^�i%�Q�����}�ن�*���` (���m��히DA4�t�'�Y>�ړ�g�(��,�
�rZ��A(z�l�1�;-�
��GRC��NE����Qش�(r0��ԉ�e�ˊf�˒k���� �~!ļ
�o~t�w͋�OVU��53������0+v�T+�7B�Q*���U�~i��X������z��Yv������C�
��0�8
v}�8���BFN�޲��	?��
+�-�*��qRnG������u�6hh�����endstream
+endobj
+10401 0 obj <<
+/Type /Page
+/Contents 10402 0 R
+/Resources 10400 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10415 0 R
+/Annots [ 10404 0 R 10405 0 R 10408 0 R 10409 0 R 10411 0 R 10412 0 R 10414 0 R ]
+>> endobj
+10404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 668.3759 138.5077 679.2551]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000001) >>
+>> endobj
+10405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 648.2864 314.5657 679.2551]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 350.179 138.5077 361.0581]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000002) >>
+>> endobj
+10409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 330.0894 314.5657 361.0581]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 238.9206 138.5077 249.7998]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000003) >>
+>> endobj
+10412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 218.8311 314.5657 249.7998]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10403 0 obj <<
+/D [10401 0 R /XYZ 90 757.9346 null]
+>> endobj
+10056 0 obj <<
+/D [10401 0 R /XYZ 90 642.1103 null]
+>> endobj
+10406 0 obj <<
+/D [10401 0 R /XYZ 90 628.0422 null]
+>> endobj
+1261 0 obj <<
+/D [10401 0 R /XYZ 90 530.8519 null]
+>> endobj
+10407 0 obj <<
+/D [10401 0 R /XYZ 90 516.7839 null]
+>> endobj
+1299 0 obj <<
+/D [10401 0 R /XYZ 90 323.9133 null]
+>> endobj
+10410 0 obj <<
+/D [10401 0 R /XYZ 90 309.8452 null]
+>> endobj
+10057 0 obj <<
+/D [10401 0 R /XYZ 90 212.655 null]
+>> endobj
+10413 0 obj <<
+/D [10401 0 R /XYZ 90 198.5869 null]
+>> endobj
+1300 0 obj <<
+/D [10401 0 R /XYZ 90 89.4414 null]
+>> endobj
+10400 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10418 0 obj <<
+/Length 2005      
+/Filter /FlateDecode
+>>
+stream
+x��YKs����W�U�h�ݜ����$�]�r�l� p(�B
 �����` 
CP�]R��A �ѯ���À,1����K%2��ezX��#��や�
�o��[�� �� #�\��
� A	]�m?�A��7c�z�&x�������U�y��2��){(�����{M���*���>�*���l�f�Ԃ^pD�8V�w?.���\
�&�s�?��r
����-���#b
]
����~�~��N�_h
�%D���P����%!-E�_o�៓���d��O���<���'������!��uZ��_X`�j�#p{
!H�͛�I���9����E 9R\*x�=�>z�a��c�J�Ad�j���D�Y��r��

+��h���<UHR��n]
h�J���8�|��_Ů��s�;�P�	7�"u�Eh?Z��$�w�b�őѤ����*b
��̂�7�Q�l�C�;��p<Mr�����5����އ���X����ɗA~��Њ<8�*��;F"͍l+��PC)��ӾF�΄��D��di-�}�
+m�R���A�AWӁZ7����t�����8�)Fɼ�N*b~�)X!E�8ks�wɾ���a1����v>KЯ��ț���vi�ɰ��
�����b���P�_�	�K�$��2�;���S{��b.�1�3y�xa�y�ĜU�����5ǫO�>��'��� �<q�h$
R�f���:3�Y̐dp=p��,�T��]�q�5� 78Eč�/�
�f4����'aǵ�W�qMZ���j�d����dyZ
�I�=�N=��
6�kŮm����”Dʁ� Z_�Dz8	h����z~�ҧa��6�N
+�AE���b_<6
�M�+�2��.�m��R��d�9Ju�� ܡ݉�Ӷp��ǰ��ߏ��6BH$�2���I��|@�P�4qX>�~4�@E�5O����W��6�{�_{aO[�ܯ��s��(GŒ�x1GA���Ά;�
�kQ�lG���qo
x$�n{�1�
�.������W`p��餮D0��b@ڵ��U�E�Ť�b~rD�� & ��fV�Y^WN�Q�F�n�~3$��߿T�=\&�ം Z��"kD���!�hc����j���>���f�]��pc����Q�#�����1��dgF٨
��j���bb���B�Մp���®,���
+�
�Y�jo����I�����E�)dH_x��hH_�2�q�Y�I������m9CEb�@�ē8����>�N �����;����ad��*�[
%R�PjX;�J��s����� 
mmm
+����k����¤@��`�k�!],2��_�}��E�
H1�z�3>S`/�։}
ם�ș�N��s݁3}��$�s]�`�}��� 
�u�z�+��b�
��>�u��ű�j떀ٖ^�L=7��t8���GG5@�d.��I�&��3���:���toGc�3����ì�E��8��Z�+Әs�����
�8���U�1�$:���`O�	f�1�)Z�y��K]�I*�-��q́��x��N��0�
�<�'V��x`�nZ�ӂj�->}#%�!��
��
�y���A\�_�\��eoiSw0�����ݗ�^!�}�����L�W����
{q�>[�ϛ�9��3�Y>p�Y��Y
+S�"8�l���.�)q�sJ���Ow&��l �˵:���F'.��j:����T�]%Uu:
��#$�U���S��x
�m�x�Y1wjf�"I[)�cLT�4�U�;탁�{�n��N�b���i��v;�O�����\�J
��Jv�=��Z�ˢ9=� ��K*X���(!z�E�%�/�R����W	��t���:1Oo]�
�
?[N�b�������B��P�K������X�'�
+�}w`��ci��
��1�S?����a��꿗�՟��vlzO��c�!O�����x{s�����
+���X���9
�7c�8��N�۽M'4�e�~�@Va=�eמ0�Ҷ�n
�C�I
�OW����endstream
+endobj
+10417 0 obj <<
+/Type /Page
+/Contents 10418 0 R
+/Resources 10416 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10415 0 R
+/Annots [ 10421 0 R 10422 0 R 10425 0 R ]
+>> endobj
+10421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 553.6593 138.5077 564.5384]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000004) >>
+>> endobj
+10422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 533.5697 314.5657 564.5384]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10419 0 obj <<
+/D [10417 0 R /XYZ 90 757.9346 null]
+>> endobj
+10420 0 obj <<
+/D [10417 0 R /XYZ 90 733.028 null]
+>> endobj
+10058 0 obj <<
+/D [10417 0 R /XYZ 90 524.6033 null]
+>> endobj
+10423 0 obj <<
+/D [10417 0 R /XYZ 90 510.033 null]
+>> endobj
+10059 0 obj <<
+/D [10417 0 R /XYZ 90 351.6057 null]
+>> endobj
+10424 0 obj <<
+/D [10417 0 R /XYZ 90 337.0354 null]
+>> endobj
+1301 0 obj <<
+/D [10417 0 R /XYZ 90 121.0485 null]
+>> endobj
+10416 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10428 0 obj <<
+/Length 1912      
+/Filter /FlateDecode
+>>
+stream
+x��YKs�6��W��J3�7�ڴ�4}��;=�-�6����T\��wA���
:>����ŷ�߂d��,5^*��f\.��^���/�?���MSો�ٷR,5Ғ���u�A$(�ˋݻ!����`�W����t^�^S�J��[�K����4L��ϛ?�I�J�
x�"��]�1צxf[z���8X��x���rկD0I��.޽��
���#�������t�_p�ʛx�v�K��=(^
+� �!�
a)X
��>,WI�7J����<��.��!��0:��ex�]�C���6Vm��

\H� ��pA
A
+w^T�^���r�wq��ʞ}�Us%
I�)h�/n3'�Zl���� ���ڐ�US��p�����_�v~�C�o�
m<��]r��緦|\���
�CM�	cHp�;N�
"
q./�'
CY#,�=��PL�� �"�uP��9����h�E �&�y�/�M�����qj�S��nNa�#$�0�K�M-�Gt���H�$��oL~L��!;���%S�+����vb�a��d-_�qfb� �
+���,�;��w�{hE׃�����1�_C�+�p�fې�-�̐�-З�por�NEw���8w=�Ñ.���iY'VF���+���v*R���Z��C�es �
���Eq쮮�0�I�w�3�BM$�����Q�	)�RBN��)52�ᠰ��_[ṣd*}��O ���0�*1�F���ϡ�s�����2LoN{s�{N� I�~'#RI��iG3�mp�r��6M�T� ����A���<�4-�fa�T_�έ���f
){p��{�
�8���D�m�?�yt��*I��.�@g �MA6sP%i�04��)�/�8� :TepTR'`No��7MD{�ny����n~m��'n���z�a�
	�dCo<�4�(j�:�ƚ*[�R�z�֘�k��;

���3��Y�-W�~JrS6�NY�n��ͽ�օ��Ѥa�����0/��$6���
+�ڪ2�Æ�R%�+�۴[�h7��x:����ƦO�7Ct�f�6x��?���k\|<�Œ�1�H�
M�|�
�=�����01��H�t�nJ��5�s�γ'���o~�AWb��f�i>��x����5y�
r`*�]O��P%6ö'�_���a�ݲz�O�~��<L��*���_ ��B��SKi�%yD�ڇ����fk�����%����`�!5�QH0���d}��>�^��{Y��HM�{�
���3�����u
+�X0	Ӧ�8L���4���7[�C׭���cu҃�=�v%VU3 ��@�*̲���8-#��'���.��K�pW�>t��"RL�.B �^�tL���ݚ,�>��@�16\e~��aj����H��v;j�O��(H t�*U�§mxm�n�3P.��u��QL�/b97Α��s�v�@��J�]S��DG���X��J�鉮
�ىn�xG�:�M��1�M�������
�$����Sݍ9���D�������x.���8�ZQ���).rn���LQ^q�9�1Q|Fa��~,v��݆��b���W���+��a�Z��Wۑ5yl8Ѷ-F<�U%$�O���kE�E�mrʝ�֨�t�
(vF
$T,��Lm��<[Uxy���Yd��DY��1��J�zû��P�L�����2�-��M���� ��G�]�#'��
+X��>o@_��C���aP�C~����{�
`�5in�����t�5��$��V[Ww�+���53��k!V>�?��S��_�*@wՐ�U|L
U.��n���@AɅ!�%��ey�}���M��أ^rO�]�m��������6C�CtLQ��
��Y�/���PŦvoS	�|i��C�J���/ז)gSIj�!~�M����Iߕ �M�endstream
+endobj
+10427 0 obj <<
+/Type /Page
+/Contents 10428 0 R
+/Resources 10426 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10415 0 R
+/Annots [ 10431 0 R 10432 0 R 10434 0 R 10435 0 R 10437 0 R ]
+>> endobj
+10431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 526.9183 138.5077 537.7974]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000005) >>
+>> endobj
+10432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 506.8287 314.5657 537.7974]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 217.9671 138.5077 228.8462]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000006) >>
+>> endobj
+10435 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 197.8775 314.5657 228.8462]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10437 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10429 0 obj <<
+/D [10427 0 R /XYZ 90 757.9346 null]
+>> endobj
+10430 0 obj <<
+/D [10427 0 R /XYZ 90 733.028 null]
+>> endobj
+1302 0 obj <<
+/D [10427 0 R /XYZ 90 499.628 null]
+>> endobj
+10433 0 obj <<
+/D [10427 0 R /XYZ 90 485.3755 null]
+>> endobj
+10060 0 obj <<
+/D [10427 0 R /XYZ 90 190.6768 null]
+>> endobj
+10436 0 obj <<
+/D [10427 0 R /XYZ 90 176.4243 null]
+>> endobj
+10426 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10440 0 obj <<
+/Length 1926      
+/Filter /FlateDecode
+>>
+stream
+x��Z�n�F}�W�i#Q����f� �\&/�!	
Z�lb%R!�q��O��)�����ypS,v��>u��
�`�G�%2��d����~�zF��%�_�
�q7��J�� #�L�6nI���&w�_� �K�1��Y<O�]z�fA��
��u���?Tiu����� z^�%x��6�k?|�m2w/+V�
@Ĝc�����ٗw
԰�$�@���Nְ�og1�E�
ch��q�ڋ����O�<��{ �N���d)RT�����wX"�a��6c�E%"�i��/�Xe�&/���|�S��I�v���z�¨

+�R��ӬFݬoo�b���]����i�x�eE3e4�<u�Z���C1C��x ��*T̟���y��(n��}o
+���!v��
+��F��Y�O��4Oy�mP�H
��b
��d����clb��D��T��ޔ�r[>
�y�*w��������7Y���(���&K�9L%�$!�
l�����Œq�&`����4�1<���� ڴ{�f��7G?�.s��	v���ǺY�����̊�J���#P���LN�X �8;�R�MF�σ՛C���v��͚#���y_�ES� ���%3�U�iN��1DUP�wV�
\"��M��M��{/���j���{�[JX�W,���o��6x�����������f  Z�&μ=�+��T
����҆��
WHR����:蹣�
�`�Ak�
0qB�)�碍֦<[��m��.�t
B1��d�/qLNn��y�TZ��wy���?���
y�Շmc݌�5��/BJ�%&�I�ou9		`�!ԟW`i�˚��HD1 �h�$��:�ӡV'(����;��C���
A�V��tL��k��4[w�"��<��{0�_a��pK;2�u���R�k�^Y��8�n� [...]
+�d��=�	�r�"ؼw�[|���(.��5��2i�#�2i&^&
�|*�>�I��2���I1
�]�T>�}��:�A�H���cq��U�r�e1�Dp���#[�̺d�0��
�����铽:?����J
?x��u�x�|�����Œ��xؗa���Zeu�9l��G�Yw����U�
���=�·���@�F�BVD]�n�mH�n@� E
C�8/�I�j��֡�~(K��!�?��>E�=D�}��2;+u��
+J+�O���BjV#���B�`�4���J:�V�޹vX⾬�&��Zq�^g���-�>����`1���J�ҷ�,X
h�
��6ƜVM�-�K��j�v�\�����t[g�\NS��l
��%(wpE��&��p3�s�O.z�j8t.��w�V��Km�d �K��	_���K���J�2��S�2Z5޸
V��,�4/�u�^���9�n���W
+sj0�X��o~.Q����+�q�j�b�A!�ޝGl�)z���@����:�I��:��x�1 ���yP.���
���U�~�NLt�SeX3t
v�
>���.�a�
�N�RA��5L�jf�<���2�X/u�����o��Qnԋ�����*�Q�D
'~6ga�
��۾r8Iж��k*��C'�����l��M�
�)SHP��̣8e
)e,��p/*K��Lg��g�Ђ
�x�G����gs���g��&k+����n�̥ͬ����?�{|����4|�����Ƴu�á��2��A�C9}���~'��
?!\mr@��&���D��&��\�*m�����&X����ʏ�R��s��  fP+HH��[��b�N���,��eKn�/�]g�g
y�_��4ԫ����TP�wZ P�ʨ�Nܛ�Q����
����7iG�:m�{`�{�m�N[
�k7��4�ۛ���g��ѡ��ʛ��~{s��c�
y�8�eg4�2p?�, �,��KƮ�� [...]
+endobj
+10439 0 obj <<
+/Type /Page
+/Contents 10440 0 R
+/Resources 10438 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10415 0 R
+/Annots [ 10444 0 R 10445 0 R 10447 0 R ]
+>> endobj
+10444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 182.464 138.5077 193.3431]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000007) >>
+>> endobj
+10445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 162.3744 314.5657 193.3431]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10441 0 obj <<
+/D [10439 0 R /XYZ 90 757.9346 null]
+>> endobj
+10061 0 obj <<
+/D [10439 0 R /XYZ 90 670.1788 null]
+>> endobj
+10442 0 obj <<
+/D [10439 0 R /XYZ 90 655.6085 null]
+>> endobj
+1303 0 obj <<
+/D [10439 0 R /XYZ 90 427.6665 null]
+>> endobj
+10443 0 obj <<
+/D [10439 0 R /XYZ 90 413.0962 null]
+>> endobj
+1304 0 obj <<
+/D [10439 0 R /XYZ 90 153.408 null]
+>> endobj
+10446 0 obj <<
+/D [10439 0 R /XYZ 90 138.8377 null]
+>> endobj
+10438 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10450 0 obj <<
+/Length 2043      
+/Filter /FlateDecode
+>>
+stream
+x��Y[��H~ϯ�$��{���.bY`�i��0j��Jb���v�	��S��S���l����C��q����;Yb��e��J(3.��i��{��w
�no��������;)�1�%�˧]��$HPB�Oۏ+Bg�
��ޭ	^%�)y~��xU
��-����2)�����k��|����9&Ue���N7�t�j���'x����ŷO
Tw�$1@����	/�p���8�W����1]��������K����<2�`��0X�(���"�0��G�"¶�b�1SKE%"�E������z

�`��t��;��I�+O=�
+)��m7��
+m?|'�'�(b*���He;�$��E��v�ު�.J]]����ܪO���W��[�I)� �����
,#�$�x�Eerҵ.gl
0c��8h�N�@�W#�D"�0�?~'5�������
�>����\�I]����V�>9���ʼn&ۭ�v��蠾�	�(&J���;��J�"����N�>dU �(��0sBh�a�1dGY
P��֑jCu�B8�\DN�\��-ujR�
�v:B��DEw�&4�
�����\g�\�Tυ� �Dd:)������`[�W��c�}N����z�(��P��	���=�!K�}$O��XS�z�� ��T�q�	
+aN��>�+�mX��6���
+��EW�'m2$�����\
��u��iq:'u�rlnѕ�A#����8c�]n(�$.�<�ᐶ�z��
+"��f�E�>J"�x�����	�n�s�i�y��� ����������o/�ǀ�T�F�>�Y,� P^�>2h3�J/�p\��C҉;cC>R��3���򺚬 �"
��2�KM��@
+sۈ�fp'�
+d�~��"�U���!�2Љu���ڻY3����d�!�Im�In/�S��
�W1�="��/Pvw9NEuIS]U���)(-m�����,
�r�1�7�Y>1�p Q�(U�p���n��VW5�'hPי>q$���"a����qI�{�w��`j�$OB��t.��e'eP�V�-�N�ZoG�Ā9���ΣPb
)�R��7��3��J��
!�P��	'
��h��h���z�OE�[2;���?�����~#4�>{��?#
		)5	�Nh
�h/˒lv�a����#����|��ݐ�لo�A���ed{|r������!�2;1�2ÏUm7����l[���|��
�GS �"�m�i[,zG��[�$PO6xj,LN+$)g6 �[�
+"8:|�x��&�폍���Ӱ�
��i(�ډ�C���;N
���Z%�B�n�u�˴�H�q͜�x�O��?�9���f��$l�M���,UB���I3,ɫ�LZ:S�	�~���T�%�)����
���t�e�P��~�0H� �j	 	S�N̋�~����`��Rc���'��
��F����f�iQ`k⎃:��p�����Y��9��`�-V�m�Ќ
ns� Fx
�`�S#,J�,�
+uB!̻����|
+��k�� oq�A�m��107�֝���j�>g�MV�
���kYې�M�^sQ��F��,��S�^�
�������@t�'��͠�N
F�����u�l��!��-1‚���M\�~)
+(��m/[G��|�|����[�mom�״mzzM�^���
�|C��
A%ml~��c��O�No�
�tk[=�����z�.�`�
�4��6$�܅��v�	M��#�yL���;��}�4#��V�J��.�ko�	t�X�{�����K�D�BS�1d+`��C$�މ�#[�翑���0���Zd� G��y��K͸�̉8�_L�B���3D1�V�m�k�"7�5�^=0?����/��B��$��x?H�1
�H!ҟ����22t���(�R���w>�^�xg�`X��li��t\�^����/�B�������FԬ
��l��:ܽ��z:U�z�?���I�o	�[���Dz]��v��D�oG
�k~��������+J+tɳs����|>>
qq`�1Ul�{�Nh��g~�K*
����(:�n�~�O�K�Q�6�& �?�
��endstream
+endobj
+10449 0 obj <<
+/Type /Page
+/Contents 10450 0 R
+/Resources 10448 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10415 0 R
+/Annots [ 10452 0 R 10453 0 R 10456 0 R ]
+>> endobj
+10452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 513.4125 138.5077 524.2916]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000008) >>
+>> endobj
+10453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 493.3229 314.5657 524.2916]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10451 0 obj <<
+/D [10449 0 R /XYZ 90 757.9346 null]
+>> endobj
+10062 0 obj <<
+/D [10449 0 R /XYZ 90 485.5426 null]
+>> endobj
+10454 0 obj <<
+/D [10449 0 R /XYZ 90 471.1858 null]
+>> endobj
+1305 0 obj <<
+/D [10449 0 R /XYZ 90 304.3614 null]
+>> endobj
+10455 0 obj <<
+/D [10449 0 R /XYZ 90 290.0046 null]
+>> endobj
+10448 0 obj <<
+/Font << /F65 361 0 R /F67 370 0 R /F52 345 0 R /F97 1774 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10459 0 obj <<
+/Length 1772      
+/Filter /FlateDecode
+>>
+stream
+x��Yَ�6}�W詵���E$%��iZ4��d�>�����PYr%9��{)R�Z�֠�y��#ޅ�

���x!�$�(d��6�����w3b_/���
��vv��^�BA�w��GqJ�w���|�X���ق�yT�����<=�T\D���"*N�U���<[,)���iT���ڪ���6
+�G��'d������m몍�3A���^��^
=�a�€{p�	C��g>e�M:{1��
Ǽ�?p%ħ���0o�	���.'
�,qN
B?/�-�yg� D� �L"��yn`-J'�u0��D���)!
�A��uG
E�|$%�a�sw "�"�(�$��@�^r��`�$a�ka��J�|�>��uG�ȑE_3>S���T��y��USb��>�~H�^eUT%��|; �rPET�E9�����A$�
7�+�G�1 mtPKJ�!}����}��m�׺�$^,��t�j��ږ�i��x�ɳ����ĸ�P<���
?n!���R{��/L(���
C~@t��כ��/$��
�CP@����I�&�ze��,C9�T•D���)�8֜CB;�p�
�~�d�a�|h���=�Ȇ�&�*7�cR`Y�1b�0����)��}
z�S>O�&�(M�Ÿ�2sqgjA��M��ғyP �Z8
�;�"2?[@y���p�	�51�x�j���.Q��a�i[��^U�(W#�1DF�\�=��dP–�ZX����Qv�N�mPc���(�~�7{ېVf5�������U�@O@��)Æ�n���j�ˡ&�˳�sXp�2�
����P�~{�f����f�a|jf�^\����(�x�.�`�4��Qq�Y9Hpp~2#-j�̀D
�{���|-��陬[}L.�*�>�H�}�-(�b�L"AX��CQ���qi,a��I���X��R$���ea�

�|g8*)u�2⻉zI� Q)���E�)ذhd��P� ��e�v�fg.�<�J����lF�*O���t�#����*�8�Ԋ�B���]X��
�&z
��
bD��ڳ��	͒��r�Mzpn��
n����
&���
	kKY
���� [...]
�WlmUjy9Ve�
~��<T��&�-���]���u��"q
4�^���>ɒ}�m�w���T���SG�
&��G�Y8�K��
 �`� ��6
?��EY�|�
\�%]�e�dB �M����	sB�LZ?��ؼS��0m��r�(��ɠY���Ջ��
7,�l���/g
+�^�.'��_[����S
+�A�N��e*�CG�ү�]���E�Ȭ[����D=T� ��e�.O.�q(�R���w��ّ�ma�'�'3r�#gܢ���gQ������E=���]i�3h��`.`� �&��w�k�[�7��z���N�~��x�`�[
>��
� ��&��w8|�|��5��J�uÞ��6}��O��Ç+�c~�Ç�r�
>LG0
�=|
������������ǎ"��
{�	 ���׶�DO
=ӽ�����ٻ�[��57����r�����OQv���nD_�@m���bؾP���V`9��J��~���?���s������?�<W���������mJt̒C����pHo�~��'���e
��K�
)$z�l�o�v:�

���
�Q�_ѱ+� ��=�endstream
+endobj
+10458 0 obj <<
+/Type /Page
+/Contents 10459 0 R
+/Resources 10457 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10415 0 R
+/Annots [ 10461 0 R 10462 0 R 10465 0 R 10466 0 R 10467 0 R ]
+>> endobj
+10461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 723.1451 138.5077 734.0242]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000009) >>
+>> endobj
+10462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 703.0555 314.5657 734.0242]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 160.77 138.5077 171.6491]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000010) >>
+>> endobj
+10466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 140.6804 314.5657 171.6491]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10460 0 obj <<
+/D [10458 0 R /XYZ 90 757.9346 null]
+>> endobj
+10063 0 obj <<
+/D [10458 0 R /XYZ 90 694.0892 null]
+>> endobj
+10463 0 obj <<
+/D [10458 0 R /XYZ 90 679.5189 null]
+>> endobj
+1306 0 obj <<
+/D [10458 0 R /XYZ 90 463.532 null]
+>> endobj
+10464 0 obj <<
+/D [10458 0 R /XYZ 90 448.9617 null]
+>> endobj
+10108 0 obj <<
+/D [10458 0 R /XYZ 90 131.7141 null]
+>> endobj
+10457 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F97 1774 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10470 0 obj <<
+/Length 1915      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�6~����f3��%�
��tm���T[I�ٲ+�Ͳ_�CQ7Z��zIWHt9&?���
�!S
?dj�T	�
�r��L��
�2!���_t
~��\��bj��TN�o�$A�:�^���8�/�x�zN�,�6���9ų���>^e��oɧ,�
//���D϶�|A�]��<w�o�۸|��� b�	��~5yq�@�V"�$�����x����`Č����C��	���YO�N�h�q/��
";�#�!,k=��Wn�bݲMV�@F�q�����i�<$���r��E%i���.��۫�58ֲ XFRB��>�xiTg#�� Sk�t�B9g�� �#�FЎ͂�a�B!I9/���q���Ynw�
��n{[?킆�}|
l���M���6(�nЬr��+�1/����y󢜅v�@�B\
�8� \��&����$��1���
����RP�7Ƀ	Z-�V�$�NKQ OD9㋿��H`՗�s���b�'�h��(rL!E�hG�0�buy��s����M���7����Hڊ
�Hc��{J2���\�g�9�����P
+p����
`G2@"��L���	u ��
?V�
4�~��Ks�"I���.*�O��
�9J}�$���L�k��kL�'䵻l�ȟi�xmNfP�d�
e8��4\���4�}�.:Dt�"�[�<` *@��L��0L��`���
��-�ؿ�E��p��!>on Y��LgGm���\2�}\3]@��LBψ`O�t@�
�֣�{�/
�M�&��$�k�۸.�+�W��ua�2H��1��9B�]�a�xB��)34�e�P�)�1;�2G=�RfL�2=0�	eW���Ds3ZQ��p��
iJ�	<
���7�\����j�
d�
޼��A!�4
"���]恥kD
�ӑ��ݰ�1d_�6][�C�0(#Hk~�y$���+�'H��zENA��4��׵&>ΡԤq)S%j���8!����!	�_c�ԛ�HX���o�����A12�pV����}
W��lYE%F)��v LC
%Ƴ�k5�US��˓�44�HF�P�3�1;ONG=��iLXN=0����TB?*��tz�|��l@>U_>	l�|ӑ�ӣ�Y��O ��d��=BJ�'���8g��o����R�9Li�$�M���?���_�h
�GS

�rf�݃*n�=�҇��Ϟ�Qu������#��1�/fj�׉b`�;�&�ڪ�o�Z�Ɩ���<D���ڛsX��~
=T�Ѡy�.�M'��-�|�X
'�M6Q<YC��e�!��t�����Q��z��C����A^���
��%�v^J�Z�/��/���C�}ڔ�ŊߟsCa�$|�C4�7`�
�K���kLH@��}��f_��S �:�O�/m�K Zڽ�v�g_ew�͛n
+����T�ם�1{\'�*K,w-#[���(���}H�P
�A	����cRD�|��WH%<�����|/�*[�7�E�	�amNw�^pr�&
�姹ݞ͢<O�Rw"X�@�f�n���Q�j*�߳=�(T�H�ѵ"@q�R_�e� �CIX�N ������N�7m���nz�v
��mDT���z�>U�
��W��v��m�p�:F#�+����IL=�C
��V����3Z9?DV�.�!1����0i��T�a�-����|	S)�Hj���`��)�,X-"�uIg�cC��
RC2/@
�t��
5��^[��MDu[w�j%�ͻ<�~�
1���{��u�E|�Ci5n�x��T��o
��mܓw�A!���ۿ��կ
Y�?��|�U��,�7�]�}Q�./.


�2G�4�e().v���!.�?�e6�Ec��⹟CAK����v�9Gm�uϘ��pSv
�<*���C�Zt��endstream
+endobj
+10469 0 obj <<
+/Type /Page
+/Contents 10470 0 R
+/Resources 10468 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10479 0 R
+/Annots [ 10477 0 R 10478 0 R ]
+>> endobj
+10477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.4002 183.7317 212.1242 194.6356]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+10478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10471 0 obj <<
+/D [10469 0 R /XYZ 90 757.9346 null]
+>> endobj
+10472 0 obj <<
+/D [10469 0 R /XYZ 90 733.028 null]
+>> endobj
+10109 0 obj <<
+/D [10469 0 R /XYZ 90 645.0517 null]
+>> endobj
+10473 0 obj <<
+/D [10469 0 R /XYZ 90 631.3175 null]
+>> endobj
+10110 0 obj <<
+/D [10469 0 R /XYZ 90 526.2548 null]
+>> endobj
+10474 0 obj <<
+/D [10469 0 R /XYZ 90 512.5205 null]
+>> endobj
+10111 0 obj <<
+/D [10469 0 R /XYZ 90 379.9829 null]
+>> endobj
+10475 0 obj <<
+/D [10469 0 R /XYZ 90 366.2486 null]
+>> endobj
+10112 0 obj <<
+/D [10469 0 R /XYZ 90 233.7109 null]
+>> endobj
+10476 0 obj <<
+/D [10469 0 R /XYZ 90 219.9767 null]
+>> endobj
+10113 0 obj <<
+/D [10469 0 R /XYZ 90 89.4414 null]
+>> endobj
+10468 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10482 0 obj <<
+/Length 1882      
+/Filter /FlateDecode
+>>
+stream
+x��YKs�6��W��J3!�7��4�4}���K���m��H������
����(���3��`\->�.�oA�)�?2�x�
i��t����-
?!�c�{m�o����RL5Ғ���� 	���r�~F�l�������Y�m���9ų4>ޅ�,X�]gAv\,��s�fi2�����q����Mx���d
�_ "f�����ɋe�Z�`��M���
���#���
�#�5�n'���&���������"�OD(CX
+v��?]��	Km�
��!AZ,��:M�"
"����u�n�)8���8�Wo�j�+����o��X"-0��D[�+�XM��+�B���u�jM
n��N |�$e�rȈ5�e��V
�����y���r/1�wa?�Dp$�S��J(�%�(��l޴���{��I���5p�s"f�8J6Y�c��j����&=H�©�.ࠔ ���ő���v�	K�ÌY��Nv�V���]�;RA����w6�Y���uan��)%�@
v����]���m�m���܁�b����ToPRU�1E�4�%g)�Qo
���|�d���
 ��6��[{[�6��}\T��#��#ə~��2�IWԯ%&
+�|��fΪ����Րr�F�|	��"���"�`a�/;	S�3J� @�!��
� L����<�c�
�K�h��0��YCDz �u	��k.L��t�eS�u���!�c{u]�v�s6�BSD��n�h$��"�����Ý!���:�
�k�;����������q�Y��
�W
s��4�9��h����0���6��]��
ʴ���ŗ�"��S�D
�2�r;gS9^��݁T���g�T�U�TC��|��q��W;g%�1����nN���$h,m�х�G�/Yg������~�.�E��a��.�-%��	诤
=��m��
b�
�G�B
+K��
'�n�񠍣�|X%��!P6+�X�[����
}2���9܍�ѱB������ʨj�l
�)!�#�ɡ)Q-ߏ�d�46a] ��5
>D���>�?E�l
n�DʗuA

N�P�Mŕ���ՏDUd���݃~Ò��7]X[��Qm�F�K�4��Q�i[� �Օb���|D�(�Ԙ=L�F#r��
+u��eH1�!8h`���A�h�E�K�Bd��GJ��43Yh��.���cO��ʬ�I�,}SH#�p&�O��N�e�X��E�����45͗b��xv![���\B�8�,��ܫ
+k�@Vy7�����
+��
+~b
+~�!�sGij�ʘ���
���yJ$�oۡ7a����1N
��ĥ��\ژ��o�8�L�|U7XQuh2���O�cU7#��Z���8Υ8"�
��x|[F#��K����z$�}
n���
&Wc�8�U�[��H�h�E�r�f���,ĐykL�u9~h�+�8��B��X�߅;�F|
�)�G¨O��t�9�i�n�
�|����x�Ҕzmf`�
�oo)H�����[k}i��R$-���a�Q=f�a��C�񂎎u�~݅YP�Y�_t,�m1-��������GSJk��~���@�j�`S
Ww�8>�K%�4E�gGS���
D *4ylWġb���F�����xy&^#=���ڐ��@1`��q�o[��F�LȄ��Ȼ&�
+��7f��ш��~ ƭ�
0_����^� f��ؕ

0��Q����R�0tz6	[Ҽ_�i��|�xm��˫ۚ��m�����<̾�
1����A�*z2<�ɸ��\� ﲐ��z+Bp�8U>D��n���?��Տ�O����/�C�i��f�wE�[\]
���>�v����.����i곱�y�� K'�
�F�w�m,7��J~K��0
�۲�ԑ��1��/����endstream
+endobj
+10481 0 obj <<
+/Type /Page
+/Contents 10482 0 R
+/Resources 10480 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10479 0 R
+/Annots [ 10485 0 R 10486 0 R 10489 0 R 10490 0 R 10492 0 R ]
+>> endobj
+10485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.5732 690.3327 216.2973 701.2366]
+/Subtype /Link
+/A << /S /GoTo /D (main_Cylindrification) >>
+>> endobj
+10486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 589.0719 483.2121 620.0406]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10489 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 249.308 138.5077 260.1872]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000011) >>
+>> endobj
+10490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 229.2184 314.5657 260.1872]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10483 0 obj <<
+/D [10481 0 R /XYZ 90 757.9346 null]
+>> endobj
+10484 0 obj <<
+/D [10481 0 R /XYZ 90 733.028 null]
+>> endobj
+10114 0 obj <<
+/D [10481 0 R /XYZ 90 568.9972 null]
+>> endobj
+10487 0 obj <<
+/D [10481 0 R /XYZ 90 554.4269 null]
+>> endobj
+1307 0 obj <<
+/D [10481 0 R /XYZ 90 438.854 null]
+>> endobj
+10488 0 obj <<
+/D [10481 0 R /XYZ 90 424.2837 null]
+>> endobj
+10115 0 obj <<
+/D [10481 0 R /XYZ 90 220.2521 null]
+>> endobj
+10491 0 obj <<
+/D [10481 0 R /XYZ 90 205.6818 null]
+>> endobj
+1308 0 obj <<
+/D [10481 0 R /XYZ 90 90.9558 null]
+>> endobj
+10480 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10495 0 obj <<
+/Length 2391      
+/Filter /FlateDecode
+>>
+stream
+x��Z�r����+�JȪ`4�SY$�uʎ��\+�8..9�P! �+}z�"����.-D��3gz�OH����
+��b{���{��/7��
���o𧻛ۯ�Xd$���}5�$HPBw��� �V�/?�^��1�|\Q���v�Ǜ��y�?����WD/�tQ��_
⢨?~�{[ݳ��¸ D,9�ᄑ�p�Amf"�$��n~�/v0�oo0bF��\`D����
���8�|��n��F�@�A�K�
a)؅�.�|β�*�L�����כ������t���1I�c�u������,-J� � ��Tx�H��3��ڨ�\$ED��p��sm�͖#`�7��6��l")��� �$�2�c��Y�2�����
Q�
��� 
�R۔I @%�t6��鈌
��e�@�0?��
 �V,0
�H+)}��A20��a7+���
���r[�%n-&Z-��h��a�E}�q�k��KQDY_�ly��˴X�L�b��{��=°B�0q���LJ��c1��XN�5Kn)��O����ր��f��x*�W���	&�-�~/F3�t��p�?|��S�d��]ϑ<�`�
7VCQ���$]q�|��n���M�"��t9s���h���A�!`BzH�
�lE��	��fҭ�xCt`�ޞF`\���H%F��a�#��8�5�2�t��?GI�͎��L>�[j���.�
X��J��d�P����~26�0HaB���+~��CV��������M�FB�!��Y9�����o���F�à�Ȫ��G��8�3��P�d���=�.�;3�{kG�(Gp�'q��������U��S�߳Ҷ9j���9��m��e����F�8�<.��΃��4|6
����
ƣ�9��f�(m�d�U�J�J�N
e	$h����.��Dd#��A/J������u��`b���
+&�a�(��L�
�A#3,�0D���':���@`��u *���=,d�	
 Q�c�
 �rgu�.	BG��
+D���F�3�sQ�T ��]
%rFƤY���9�㴴v��W����d��M�.(4=}���o5](8J�/V<!�3�`�"�y:�׉�YF.�g&,{<0�Ɜ�gXt�

���#����zS$P�����\@G���R�/eWr*�9��t�lPl��(6�ԼKg
�N��1�M� �@�(���Vi�o(4�Q�et�4i�Ǻ����+
+��Zd
+�q�����Z]�E�@��pM
.){����
����ā��ݖ~x�K
��ϨG��7�Pi�"��|���n�))Z��9O��
�P��JZ'
+B�P���;���	�ͼ�)v����=�@?�W�]�j��1�G��br>S�F(�Ů3{]��e�R�F`����k�{k�#~���Kc����]jL�&9���
���
�����0�'A�a�M:�q
��T_;��by���H��[>1�%���͇/��BQT��C�*�Qe�]I�
+�А���$���W��f�M`Sl�<N�b���mj���c���V�
��M3�خM  �i�h�I�D��w��I��	#��`ⳕ�֭�Ex^)�� �zh���A��� Ӛw(_
+�s=׫JX?H�����^�����z���^���zO�ӯ7�P50�0�LC��]B�~wf�	�Hn���f��� ���~h��?�MeuW��t�$��xty�����%|�
| �D|�2x���II� �;��_��+:�dO%��^��sh�	���(u���(x�I������8!
+���8
��I�jZ�#AF(�4'U����)�i�0#PFH��3�E�,��A�0(EZ����������0ŋa����!�>
�`��PI�@�������K����yw�l��֬�>�-�~[��_�Y+ ͍�c6�Y�WO
g_�r�5B�2q����
k�Y`�z�Mb�ļ��j��'r ����;��8^G_���YՇ����R3MPz�*V^�Uf���q87
���
+C�F����zV3�
+J ���^*�|.6�(&b�5{]/5�ȥ��	�R
�~/
V�K�
+ j���e5� �i�%w��d�
|"U_3�ǽ�gX]�� 5�6�"J�).�G���͡ve
Z@���_�]]����'c<�����*��F��q+X�m��[�3�i!CA�N������)=b�B@�&�)�@����\����Ԯ'�m ]�;S��Ղ�2�G��\��\��n}���ſ
+��v%IJ��oqznӢK��n(D
� C>���{�k��{d�!>K���.�O�5�Q��w1�)��u(�������	m
tN�S����t:�qA�#}���E���G?��)�
�}�/�Y�
�����uG.����H�|endstream
+endobj
+10494 0 obj <<
+/Type /Page
+/Contents 10495 0 R
+/Resources 10493 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10479 0 R
+/Annots [ 10498 0 R 10499 0 R 10501 0 R 10503 0 R 10505 0 R 10506 0 R ]
+>> endobj
+10498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.0075 576.7524 138.5077 587.6316]
+/Subtype /Link
+/A << /S /GoTo /D (deprecated__deprecated000012) >>
+>> endobj
+10499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [123.5937 556.6629 314.5657 587.6316]
+/Subtype /Link
+/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >>
+>> endobj
+10501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 490.1161 242.4868 501.0201]
+/Subtype /Link
+/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >>
+>> endobj
+10503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.2748 370.4084 293.9708 381.3123]
+/Subtype /Link
+/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >>
+>> endobj
+10505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.2694 226.7903 238.0203 237.6942]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+10506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10496 0 obj <<
+/D [10494 0 R /XYZ 90 757.9346 null]
+>> endobj
+10497 0 obj <<
+/D [10494 0 R /XYZ 90 733.028 null]
+>> endobj
+10116 0 obj <<
+/D [10494 0 R /XYZ 90 552.0949 null]
+>> endobj
+10500 0 obj <<
+/D [10494 0 R /XYZ 90 538.3163 null]
+>> endobj
+10117 0 obj <<
+/D [10494 0 R /XYZ 90 432.3871 null]
+>> endobj
+10502 0 obj <<
+/D [10494 0 R /XYZ 90 418.6085 null]
+>> endobj
+10118 0 obj <<
+/D [10494 0 R /XYZ 90 300.7242 null]
+>> endobj
+10504 0 obj <<
+/D [10494 0 R /XYZ 90 286.9456 null]
+>> endobj
+10178 0 obj <<
+/D [10494 0 R /XYZ 90 89.4414 null]
+>> endobj
+10493 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10509 0 obj <<
+/Length 2771      
+/Filter /FlateDecode
+>>
+stream
+x��Z[o�~ϯ�Sk��%E��l��.0�I���4�

���2��_�C��I���Lzy(������s�,2���
�)��a\�<{���!��
��B�?���~+�� #��ݯ�$A�:�_�8'q���x�~A�<?���
���M�:�ߗ�N����]x{A���_dT��7��|n.?����/
X
sN�����n�ݷ���&�5�7?��g+��w71���>`D����
����|��k�N�E�@
+A�5�P���b�+�g
ˡ\-2��k@����?aL��ñ����E��OX�/
�5��Ӷ�@�~kT`!S)	F��������A��I�,�L͗�������i�0��,��!H-�}�/��û_�]�siϔS1�M���J9-�}*a�FT�)���7���`Y��:�eu����{hT�n��L$EZ�V]�î���!e��HS�-����6�
�~ֶu�X�9��@D<ZM�
��=-�OZ�ALt�^���P�2��������A��yuh����`��X��c��GFQ�)�	�BX�
+��$bA�H
i�a�h�W�G'�!��V>
��,R�_����ƀ
�f�Ǔ���] P
+
����{+5a
�ntl�a������г�@��_��7'�q{_?�U
���.?
��c���)J�~"08���@!~#�f���(�(P
r
+Vq�(D�!�}��Y�|,��}�X57>}IE�@��~�����c������f!��TC� ZN�?�u�J
��V3I��Iҩ�PJ�
�6�ւ�a�l��+�������mR;�$i@ϐV�oI�-�B�0qY5p�H=�ȘP0��V��6q��(�c�����OD.\߱>h�>o������qf�wR�W������\��SU�~?�1[3�M^�
�ư�b�3��z8F�z���\� $�����vũ���#d���9��0̞��@-A�K�n�^BW���P���c� 
P-M��/��u�5�lwp8�
�o�suS���������k]���i[��}r��!3��
+�4tD�+��XB��F��/ˢ��H�J)���Ŭ�juwW�
pɷ��!?9�F����Gi�����3$\G��oN{8϶9���\�z (o��ue� �})�I̮�kZ�̭�
A2�*�
+i�M���N�%^�Ig*;�����F��)H����r�<�yU�e�Gar��AM��
�`,��u�<�0�}ϒ/}�{C��O���ai�� -HA��%��eFa������:���M�L��M���
�ƶ����S�O���x� �	�BD�a/�Pk��pT�s�G|(��M@��>
�	}J"J���S�=٥F2
o;��(
+C����C�/#29��$�׌�<�y�WN��X�������J�I��,�4�5"�=�p<
��	&H��	����|`�R��
	c�ğDB���R���2� �%a�x����d\; J���)�jh��t(N�m�a��"�8>���Y�@���׵������	Ն7��5�ێU�h
�)̭T�<
ˠ.�
Y�y!��'8w	�4��&��g�q�
vR$<S�m�d�Z�淍�
+Vx �

1��iS]?�VS2L�Ph�XӑNқ����8�v�,\��(4���/�>JF�Ud�*�\ZAL at qaBL���Mq*�Z����-�2n�1R��N�n��֥�Jݔ���na5�2&�4�$�C��p�R�)f�K�9�g�R�}6'Z7e^�
�
�{��{�Vl�����M3��v��kכml��
z��
z�Y����w��A�i�|b�
�� �b�F�D
#tB���k�i :�|?R#X؁
:�E 6����J���TIOo�*��^M����͈;��Ia����S�S(6���IW�2)=�i&%R_cK���{âk�V^¡k/t�U����ѵw�D��-�s�b�4�UcԅhiQ(���5l�_ľ@�C��ѪJ
W�m(�^;����Sϊ�?�b�c_F��/=c��Kd��ٗ���`з����
��TN��t�I,�v��|�y�Ǒ/�2 _j�i�� �ڟ��,"��{��^�H�V:U��79���I:�� �/
�Z�,|�T�u��ὣ���[
ϑ��*Ƶ�d	�
IK'�,6�����ص
q�<�W��e5��$y6���C4���l��7���A�u/��8~�zDPz��aӬ%8�'���T��
�j��4�&a��Ⅼ�U��/�d�5�1$�t��(����3=I�I;�Ϟ��=��gPVo�^C�B
�3��}m���L�"-(}�6�F
���2h���
���45�U
q�&�������[�ǠY���1|�ASШB���%МP߸�?�d����v
��3b�,�
���	4�z02h;�*$��



��3������f���Y�b�?k�B{��$_K��W�D�.�`q
Q���<��dʂ�D�D���@D�����d)F���%顨���F���zj�4Y���&#P+%nbh
�@l
`/vM6����z��4Y���4���e�	$.B#88�I�lLcK�u4�ɱ@��3x&�1,7�&RȯzA�~'
�<Eb�!��#"0�[�m��>�N�����������
!�.A����+@���l����:����)c��>��^���"$F���3����W�@<�d�跬�v㛪:���>??��=���	�����5&��¼4rzY+Գ%��C�H�ud�ڻ��pr�Q���N�X��
���endstream
+endobj
+10508 0 obj <<
+/Type /Page
+/Contents 10509 0 R
+/Resources 10507 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10479 0 R
+/Annots [ 10512 0 R 10514 0 R 10515 0 R 10517 0 R 10518 0 R ]
+>> endobj
+10512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.0888 678.3775 246.7668 689.2815]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >>
+>> endobj
+10514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [325.8986 448.3104 431.9768 461.2282]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 276.9708 513.9963 287.8748]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+10517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.6167 181.3237 476.6033 192.9627]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10510 0 obj <<
+/D [10508 0 R /XYZ 90 757.9346 null]
+>> endobj
+10511 0 obj <<
+/D [10508 0 R /XYZ 90 733.028 null]
+>> endobj
+10179 0 obj <<
+/D [10508 0 R /XYZ 90 524.3147 null]
+>> endobj
+10513 0 obj <<
+/D [10508 0 R /XYZ 90 509.7444 null]
+>> endobj
+10180 0 obj <<
+/D [10508 0 R /XYZ 90 256.0493 null]
+>> endobj
+10516 0 obj <<
+/D [10508 0 R /XYZ 90 241.479 null]
+>> endobj
+10507 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F11 416 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10521 0 obj <<
+/Length 2771      
+/Filter /FlateDecode
+>>
+stream
+x��[[o��~���SW��_��C��[ ݸ��Y�EYDuq):���ΐ�!���((Z,�`J:��͹C��0�#3�gJ(d�����=���"��
~�B�?�^]�E��AFR9�]7+H�%tv��yN�l����݂�y^�������ӦXU���ʫO77��
���"���l���]�X���b_�� D�9��_n��z{�A�;L
��W?��g+���W1���>`D���������z��n
�CsC� �`D�ҳ�q�%ܞ�"�"�(�Q���3�Q��VH&f��5��v�>�U�D6,�,\w����4T/���X����٨G��a��֭DU>ljw���+wu,W��|��b�c���
"�>V��XZg��>`��5|���O�b�W.�M
j�D�Ӷ��?$��+D��E�G�8�>.�� �oL-&Zͤ� 7D%m�
+e��0
�A3XK��Zo�/��
o�tB����$P���0�����/8�̷�j�W޶}PF�-	��H'5E�
I���Mu��y�s��ڢ k���1!5�K�CO�4Hq�Eˣ[�������
�#8"
+s��P@�F/dü�����FLA�t2�,�+d4�����zVYU8��eS&�AO)b��8����a������c�6����W�b��'�N�f:0�]l��E��
�{����կS�"E�e�ED���^#�`/b c/�S�L��S�
}Pҙa&}{�?U^�ǰ���Yx�0���Zo��|���4�
���K�I��He��k��T��H$�J�N�����.aG�m��yk
u��
몼��5���e;�bw�-�zCg�6db VrsGC����
�zŒ�fD��y(�E��j����e���fUڴ�{(��E�8K(�E^-��jc��
+������tÐ!]-�n����nͽȷ�L`;89�-�7&K����S�pT�6<!JNj��5�?s;Pq��JҪM��\bL���$":�@`T������� x��x�b^� b::�@-���tB�S�F\&
� oqsq�nF�Za�z,��q&p^�40��n`	� wL-�E������b���d�C�����~5�P-04�h6o���thY�ab`=t�͂̽�m�CFA�s�EA�#n�L+��	}���q�pC
"���	�°m�
+(��.�-��o����ySTEB?#��6"�q�p�1J�5�D����H�u����ƅ���S�0����v �Z���t�QC��t
J�O�Z�\7}��wE]Tz
+�Ą>@���;���G�aJ�F���wRC�������޶��k_�
�k|�и�)�yjc �qߍ�K��"��d�ؔ�Z�8�"͖�3B�hn���{�%���v*G�m�
As��؄-:���Fj�����Vj��>�W�ړ!�1�k�g4�9�����N�Pj<�9�P�����tO��b�m���x��AN�| &��#0!/���K�J��S0;���B�
��ـ��d�Bj�D���OdGd�	��iD!xOT1�F���`:�L:�8�2C|�KJ�
�N ��
_��"D�:�9WgF�N>
oH�����x(~F0�.F2b/uN���,�?�H��)� #�}�"MIɀ�Bc�����y>��ߙ����
3���f�`�
�VbX�KA%�ۖ�2������/)Z�s xj
+N� 4���"AM-;PFπ!N0;GM[�,�!AM��) �,�u��BjS-{8���

�EĔ�i"�6�Kak�x1_��21JL��1���
U�3Th��t�_���
1S`V��xJ����a(��~3M��QH�3j'v��N���Lj��4R�ՙ)5�[��6�M��{3���1Ӂ�43�4���RM�T�
KŦlъ�c��j;f:P�f��گ�L)؟�h7����x�SRL�SӔ�)��Q���{
5��ȉ����i�wj��MM)
����2�@~���R/��QZ:��e����-RJ�TI�:Nzwxگ�H��
�ia��W6�s�ICJƱ5cG#�w���F��
�}Q���Qj�i��æ+-ۻ��]����
�јSz�K���JʐҦ��Ӹ^����}s(�ߗP��u�����A�l�#�
+��=
r������򔍽��6�u�?&��������t��†ʉhǮ�
+�>G�)�d�v�H?(�r�A�1�_�N*�
+�e at i���؃bf��\Z�g� ��ƵPlM�zP

�>�$\ړ~�A����R���Z|�n84�MO=$���1�r��K
���]�cEb�8"0�ʗ��]gܓ�t�:�.�@�C\wNl�73��(&
�=q��g_`�II3�~�5���5��<i���:Ad^���>l�;`{�,|��'O�:�g�r����@���v���yF|B��M�,;�
��q�mF�3���'�O)j�1�_�A�T
�gC�}�
خ��K���9S7�M�/~���nh���
`*�>Mv�q�c�7L}�1GB����H��V*+b�����;���!EU\G:;���T���q	���q���9V|�5��m=�.�J<PK!X�Uv
��ޖo����`SC��!z���%�v��ۑ�=�o�J��Ǣ�f!��O���O�?���G�DP7�T
�*��w� ����F�ڂ��J���ګ��6�ݐw�`�r������o�������=���
+������z�0�Ul�{Y'4���c{,�u�eݰC0��Pyw�{�r��J�A����	ʭendstream
+endobj
+10520 0 obj <<
+/Type /Page
+/Contents 10521 0 R
+/Resources 10519 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10479 0 R
+/Annots [ 10523 0 R 10525 0 R 10526 0 R 10528 0 R 10529 0 R 10531 0 R 10532 0 R ]
+>> endobj
+10523 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.4399 652.8835 513.9963 663.7874]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+10525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.631 571.6839 429.2969 584.1631]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.549 432.5016 195.1053 443.4055]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+10528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [334.8835 363.2572 440.2823 375.7365]
+/Subtype /Link
+/A << /S /GoTo /D (main_Generalized_Affine_Relations) >>
+>> endobj
+10529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [135.549 224.0749 195.1053 234.9789]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >>
+>> endobj
+10531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0594 141.5966 422.9245 156.312]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+10532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10522 0 obj <<
+/D [10520 0 R /XYZ 90 757.9346 null]
+>> endobj
+10181 0 obj <<
+/D [10520 0 R /XYZ 90 634.0741 null]
+>> endobj
+10524 0 obj <<
+/D [10520 0 R /XYZ 90 619.884 null]
+>> endobj
+10182 0 obj <<
+/D [10520 0 R /XYZ 90 425.6475 null]
+>> endobj
+10527 0 obj <<
+/D [10520 0 R /XYZ 90 411.4574 null]
+>> endobj
+10183 0 obj <<
+/D [10520 0 R /XYZ 90 217.2208 null]
+>> endobj
+10530 0 obj <<
+/D [10520 0 R /XYZ 90 203.0307 null]
+>> endobj
+10519 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F8 568 0 R /F13 577 0 R /F11 416 0 R /F7 574 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10535 0 obj <<
+/Length 2680      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s�~���S+�,a�	�ӇMf�N��l6n�f4�EۜH�"Q���>$D�ޝf��ه�ȏ8��

��0�#3�g�ȑf\�n7xv��zA��<�B�W���b���Tή�$A�:�^�8'q���x�~A��m�����f��P�v���fW잯���
��M�Ȩ����~o/?�we���oKXsN��O��\�����;L��/?��g+��71���	~`D�������X_�p�_�>�^H�����,c
)	��PS�3J�x�!,���y`<�s�&f
fL��Y����	S(��,\r,��

+�
I�X,����F��rW����l����{�nT̟���Ms�WU}ow��1�u/D�aG�~_5��F��"3P
Q��)��U������
NؔC��R��Pc��J�E�c�/��a����� &���	{:��Ӫ��MUw�ʖ�>X�i�4�
T
+D!�"ٝ=!`�o�ͦ�ኘ{8R�ݹ�ֽ�y��W�~o~sy4���o�����i���T��0��z�E�y
�b���+j�uk�<U탽Z�w]�<��G�F�b}�O�~���J L �$T&�	Kށ�5��J�Ck	�K[
�}�-�f����>yC-N���5���ꪪ
�R��ղ��f
*�8ޚ��G���b�b(�
�#e�v6���8Eug� k���&H��3#5RJ�
[���)ALwe��� �QN�{9��PH��]gBy��$��q�T=�^� �9.I��&�:4
�+c]ϠI� �c,e?���.�>�Q��)�^���>SV��Ѭ��Tl���Y��\
NZ�0��TN�c��3��
��+�M����o�-n��x��@��so��&�gL�K���W��#�L� ��>�p�A3�7r��
5J�_��]]u%��d���t��]]�)�K����.4���¸�S8��+�#�D�"
H�G��嘃����p��Rf|�����.�����^�}�%L�H�AH���4�i�.
#���ڀ&�(���K�r�����t���U,���[A�\���j�WW�6K�[j3a
E���na#�p��Sv��E�	`!�}��D|+D�w�����Z7ui�+0	�c�$Q:,C�� �J�(3�#I�巷`�{��к��&���\H�R
+�ʏ��
+������� ��9�/P��D�}�:&(o[�X�Z�
�+3��8rH���y���1���,|a̳�u�~}���
�a�sW�
ә
��#)E>Prx�s��j�U�uއ�W� �¡�s��7�*m�gm���p)�#���穃	���
�#8F�
3Ϟi͙���6�+f���=z���B�
%3�Ad�K%�
��ޘ}xRn�*JR$�t\��r��iּ.PDž��l��'T��+��� ;Žrýe
��G�Y�͹;&���˜���B�|�ؓ�P�>�n�,\r俣\�p.����#�6	�w��(	�v���N�1�6ŞZ���E�)�r7q�H)0q�i�>gxX�\D�iO�������tkJp�U,֏
졯o����h�"hFσ��xJ���� ���
+��
Bؔ�
�S�i�n�5��bE��)�
+�[��b��)�:�K�XӢ�k$:=ŊD��S,�(gcԃ��iA/
aM	����� +��8�"���ˡ�P�OsK�:�-L
+x����i�;{��j�"���H���*R������/w~���\�n~��֗�Om���v1[��<�[;�E98���y�Sӌ
��2�`�a�99ˀ�Ik���m $�/��G0|h}C�*P�M����Z(7y;=T��,|!Q�F�Z>۔���h�ѝ��P�A���3�	e�i,��l�ʲN�ư��3�PTU\)�+��c�t����"���2L�mShWg>;��ӴM%�0{9m��O��H�4m{��h{�"G�
)���H�������G�矞�к��TQ�,��D(��K��(�6�f��?�
���79r�mM)��a>�����
+
v4�N2�1���⫿}�f˧
+%�u�-̂[�y��;���bR�
�I
��4��Yd6y��Fe���f�ƕ'���9�5_�69���!��}��D�S�G̴R�/����Hc�����&��Ì�6H3�#�q���
�ϡΨ��i�i�—E��A��D4D��?� ��ۉhJ�	
+
i��@�։��
3�w�Qc�1E@�H,�͘m_e]5l�����4���Ǟ�aߦ����..nJ��u[T���Vu������>ۜ
}���6�My����;v����2:-ա�R�ml>A�X�[�?3��i��ݪn��!<�>:�͢�z������|�6;[Yᱭ�p�>ln܊]6+��
T��m�I��#
���J
pﰷ
+@��`�l�(1�R^l���2�m&k��R#�kOVy�|���U�7ݾ��s�v�
$s�1����߃�U�f�H����w�����~9��a��3�M�$��bc{)�'��o���R��5*H�Ǵ�����������B��o��������{Q�Մ٣Y
+꺟���x�+in��
p(�݂��G[�>�y殾
��^Ȃ7,��G�v�h�n�./�����

�j�CU{	�~9�n�1�4gS��<h�Kd~80#�c�r��^��
ɪnn�/]�82'��*�ދ_endstream
+endobj
+10534 0 obj <<
+/Type /Page
+/Contents 10535 0 R
+/Resources 10533 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10479 0 R
+/Annots [ 10538 0 R 10540 0 R 10542 0 R 10543 0 R 10544 0 R ]
+>> endobj
+10538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.3329 534.1687 425.662 548.8841]
+/Subtype /Link
+/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >>
+>> endobj
+10540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 288.5907 322.4458 299.4946]
+/Subtype /Link
+/A << /S /GoTo /D (main_Time_Elapse_Operator) >>
+>> endobj
+10542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 159.7496 353.4498 170.6535]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03_widening) >>
+>> endobj
+10543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 88.4452 268.3399 99.3491]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+10544 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10536 0 obj <<
+/D [10534 0 R /XYZ 90 757.9346 null]
+>> endobj
+10184 0 obj <<
+/D [10534 0 R /XYZ 90 610.1355 null]
+>> endobj
+10537 0 obj <<
+/D [10534 0 R /XYZ 90 595.6028 null]
+>> endobj
+10185 0 obj <<
+/D [10534 0 R /XYZ 90 351.3236 null]
+>> endobj
+10539 0 obj <<
+/D [10534 0 R /XYZ 90 336.7909 null]
+>> endobj
+10186 0 obj <<
+/D [10534 0 R /XYZ 90 222.4825 null]
+>> endobj
+10541 0 obj <<
+/D [10534 0 R /XYZ 90 207.9498 null]
+>> endobj
+10533 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F7 574 0 R /F8 568 0 R /F13 577 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10547 0 obj <<
+/Length 2394      
+/Filter /FlateDecode
+>>
+stream
+x��Z[s��~ׯ�SK���_�����M�vƱ՗�
$B&$� �e����b�]b	ʒ�I�
{�={n߁�
�?23x��B�q9�Y���
����g�<
��<;#�� #��]�v+H�%tv��qN�l������y^��
�����X������:�/.��
���f�Q��_��q��ۢ{Vln
+X��9'z����g�\P��&���ُ?��v��F�h1{�c�l}�)�?Vg��~�q�R���	�e� E�IJi�0�
+l�%�����a��LQ��d�3�7o�m[V���p�S���pY�|b�
�0*@A�B�0�_��h���E�Yp<�����U^���Ŧ
�2II�ڃ�Rc0�`(fH2���\��Ղ����fr^�Z�ohhM��
+��7�
�u22�+w��d���q2F弗�7��2,K����X�p�Ƞ)�
���ժ�{���M���my��
�yU;�e	Vn��3��,�p�
C�eZFf���G#c�h��	�B�}p"���#�Ъ\�jN���r]����o��
���c[��ܺ��qy��6��H@߀��.̏e�?��Ek p	����sa�^-2[
�}m/�ܴW���X�E 4c�_�Ihӈ�bm���x�L�)��Z�
5ҫW���6��`�R"z��$�Ԫ1�qb	��Rr�!H3�
F�#��

+��z
I�u 1/l�6��|^�nպ�����(u�q
,))C�әK
�Q}�˼��H/��/���x]��9h�P.�M��;C�	�
�9�c��	TI$%�O����B����,_5��Sln�����V5�Qo���]nR�	��L
8�ar�&H�y�R
�aѝu�j��e��
�+��nt���|�r��b[�0�J%kuJ����t����f���R,��&E��z
J
��B���v��O���h��h�&I �j6I I��AlH��rBaRO�~�+��2 !��J_�w��'n�U�o�=R�Ok�k�ԑB�텮{��o����y��JBu�Dn����S��Mv����iz�}���)m��Z��Xk|�#c�^�n����p�R��5�8ڪ?��2
�.��W�.3a_��}��}�)�z�}Y��+������ZG��\�X�k`����s�8	w�xN��3%��{ѡ���~��p^�y�9��M[ծ`�cgj��٭������m��(W���g�Ġ�tb�7s ��>�ן4�y�/\Gg��X��b�]=:0���X �$�k�8U�|����h]
g(������[�
�R!ơ��
�^�**
��zT�jY��t������eW���h��\I6]�B���A�H�D�I��'Bq�"
������E�ds&M6#0!����&4���^h^%V��f���7XM3V��Jj�+��^ꈲ����B�Z�erB�a���UƔU�(+eF=��^W���g�b���5Gd��}u��ɒ(��W�+�u��U�+� ��<�����K}
+o��
��������%������=�=i�7�������4iei�����A�3���ծ�>�ٱ�mc��X�0s�@���1K'EH��a�1���L���U������Nl[���:�UHH)��V
h�����?��
+i���'2v�
����0е3�S��j?6
6�N���f�+>���4G`�WovS�_e����ҟ˅O�]�HSv�u
�����v]�o
�:wI�h_GH��� 6=w���~�2R���DJ�s$�h�O�B����b'�.�Z���Hkz�i���](�A!���V(6a�A���eZ�0wiM�]"�_�.�|�j(\�<y��OL]��
�.��3�IH��%�����Ņ>� �:^�������.)�S1x�H
z��
\&
�����.�/����E�.B>o��2W>+\�G)2
���(%1�I�:0RڈO����L:� =6���ם���OHl�#����
H�:d�黎a��2v�0U��HP�I�U�O}!���p�p]
\��h�1������
$�A�~�@?X6R]�E�j�A��g>�t���U+9��L��Sd�2̎|�
�f(u�jB�B�:秐����9B�.���4ٛ���썔��^���M�&�)O��Pl�4��	22�u ##�i2i�BFzڠ�
��d$�� #^�d$w��LB�H��d����%
���B��ϝ�����9k�M at B���|���o��6��O�	��};�~��)�?.8����|��W��indQ7��k o�*g���I�/Ɲ��eBb+��?���߂S�/d���`ˣu����v{q~���n�۔���9���!.�12T��������
қTXGXn-��ZW~H\�O0��+�ȏ,3K@��Ukendstream
+endobj
+10546 0 obj <<
+/Type /Page
+/Contents 10547 0 R
+/Resources 10545 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10559 0 R
+/Annots [ 10550 0 R 10551 0 R 10553 0 R 10554 0 R 10556 0 R 10557 0 R 10558 0 R ]
+>> endobj
+10550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.7981 620.2652 274.7216 631.1691]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03_widening) >>
+>> endobj
+10551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 522.1484 268.3399 533.0523]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+10553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.7981 394.5179 274.7216 405.4218]
+/Subtype /Link
+/A << /S /GoTo /D (main_BHRZ03_widening) >>
+>> endobj
+10554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 284.4459 268.3399 295.3499]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+10556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.5263 156.8154 334.0726 167.7193]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+10557 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 86.2883 268.3399 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+10558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10548 0 obj <<
+/D [10546 0 R /XYZ 90 757.9346 null]
+>> endobj
+10187 0 obj <<
+/D [10546 0 R /XYZ 90 682.8981 null]
+>> endobj
+10549 0 obj <<
+/D [10546 0 R /XYZ 90 668.4653 null]
+>> endobj
+10188 0 obj <<
+/D [10546 0 R /XYZ 90 457.1508 null]
+>> endobj
+10552 0 obj <<
+/D [10546 0 R /XYZ 90 442.718 null]
+>> endobj
+10232 0 obj <<
+/D [10546 0 R /XYZ 90 219.4483 null]
+>> endobj
+10555 0 obj <<
+/D [10546 0 R /XYZ 90 205.0155 null]
+>> endobj
+10545 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F74 482 0 R /F11 416 0 R /F33 485 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10562 0 obj <<
+/Length 2282      
+/Filter /FlateDecode
+>>
+stream
+x��ZKs����W�U�h�%98.;��T����v� �P& W��

� CP�U�R��
���7=���E���,
^(��a\.��+�x���"��5�_�|{u��
���rq{߮ 	���m�Ӓ��jM0��w+��I�O6�V/���c�V���]�T�77��+��e�ZS���쒺v�?f�Y�.+��
@Ē������oo{��N�����_�"�
}�3Z,��#b
]�8e�fw���~
��� fN����Z��0Q)-&Z��D�U�v� ��Z(*�L����6;4yY�7�=L�b�.��z����Q+��U-��Ion�b���C���MR=
�Y�L@�� ��@��x�)A`(fH2���>V劊���fr��[��ѡ5G�+Pg��
�d�p��
��i
���E��N&)��2,K���
Y�p�H�)�2�)�|x^�Ŷ��&�۵�Բ��H���k8��]v��p�
C��!��.̆ߣ��kf���ޜ""; [...]
+�0Pk ^���,uab������]��n/��i��X�&2��
{.E��M2{�F�S��WH���d�F���h��. �<��&�f�t
�L�� ���^�O��r�2aR�ラ�*
��MB�_�w)ۧ�֫��R|���jZ�c�ĎJ�6���|
+������?p+	M��^��3�
+����K��bs���N�
�?��4��KM���I�k��!\�����R�}p��q4ew,a=�6��ON.3c_����d߁؜}�ة����K(l�Z��T�ľ�
j���X�ly}b'�._BoӾjM	�N�g����&U��lѾ���j
�}�L
O���ί؞�]�r+�@�;-Д��$TӉYF�@}�;ix��9
g�B�5"9
v�Lw�ck�>b�rq��{����'�Z8}�Oy����x��B��
�Y�����J�4�
5D�f��+�M�},�ߎ�e]g�W����������
@W����$Q�3�8A�^�u
�EN
�L��
�
Lh��
&Pw�ś��"��s3|���7X�w�aӗ�8+V/uЦ��iS��m�jE&m*�$@y�[��O�T^զޕ�"�Ҧ~iS_Ӧc�0���/iT��z���V5X��ͪ!�7��~߬����U�U�5�ғR9lV��fհ~��D���N%]
v��!�is�2n��@N`���$�[:)B��U��#�@!e�q�#�@dKý�*�m`
�TY�X����(j>	�����OF�R�d���-	�.M���s�"-q�
 u��Z�>�5���Rok
F�Q�tn��V*ߏ�����s��c�f��A@�,�
J�'���
�O���(�;A'�����ev����Di|�(����0K4���C����b�/�Z���Dk|�h�/��P�e��/��z�
��Y���e�2>x��2w��#@��X�x�2�`f�ҋ}��%�wv�2�����>y���R���5�:_�����U/��Ĕ�E�ř0�b����Z�4w����]0_�.o=w!o1w!ӹ
�� [...]
+�Y�|k�'��eS�Gۤ�ߦ�A�{g�����'w�ew�:�~�@���?��t���{�U�{7��PeT��m��}6�:T+H ��Vro]���X��`=��y�ly����c�
n�����жF�"?T(o���]�qq
��B~�9�u/4����n�5�r�#|_��An't�v�7�#[�#P�
�C��endstream
+endobj
+10561 0 obj <<
+/Type /Page
+/Contents 10562 0 R
+/Resources 10560 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10559 0 R
+/Annots [ 10565 0 R 10566 0 R 10568 0 R 10569 0 R 10571 0 R ]
+>> endobj
+10565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.2237 619.3635 256.77 630.2675]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+10566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 519.8714 268.3399 530.7753]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+10568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.2237 390.5751 256.77 401.479]
+/Subtype /Link
+/A << /S /GoTo /D (main_H79_widening) >>
+>> endobj
+10569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.6595 279.1277 268.3399 290.0317]
+/Subtype /Link
+/A << /S /GoTo /D (main_Widening_with_Tokens) >>
+>> endobj
+10571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10563 0 obj <<
+/D [10561 0 R /XYZ 90 757.9346 null]
+>> endobj
+10233 0 obj <<
+/D [10561 0 R /XYZ 90 682.134 null]
+>> endobj
+10564 0 obj <<
+/D [10561 0 R /XYZ 90 667.5637 null]
+>> endobj
+10234 0 obj <<
+/D [10561 0 R /XYZ 90 453.3455 null]
+>> endobj
+10567 0 obj <<
+/D [10561 0 R /XYZ 90 438.7752 null]
+>> endobj
+10235 0 obj <<
+/D [10561 0 R /XYZ 90 212.6019 null]
+>> endobj
+10570 0 obj <<
+/D [10561 0 R /XYZ 90 198.0316 null]
+>> endobj
+10560 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F74 482 0 R /F11 416 0 R /F33 485 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10574 0 obj <<
+/Length 2484      
+/Filter /FlateDecode
+>>
+stream
+x��Zm����~���
`������-�i���_�@�I��TH�ϗ_��7�KR:�I�	
�����ٙٙy�#�$38SB!ø�6�+�=��_�Hx��竱��o�^#Ef��Tf��N�$HPB����9!�����o�	΋�P��\S�7��]�m��߫��h�on���D�M}����]�o���=+�M	z��9��?�~{��� 5�D0I,П���g[�ѷW1�E�7chv��ś�ջ�
z��`� ��14a�J��0�RZ L��a�(�Ѣ�A3�)*�L;~�qS
������
	�H1J������Az�¨
+�R���V
��77��~�w�m�vFi@��"��(5!����LR�����"�q!e^��k��V��E
�EQ�9��/��H#� P�N�W�

av��e�Y�{+��<���x�d�
��D��CM�����V�[n-���2�TC,��1B�4�{np�$:��#*XP��}2o���x�����3��v�ǵ��z �


��5�WLpM!
+��$��X���AHeB�8+��/���d�K�?U���
����pW،�����]��+���T�������U
��~b��ǐ������Ӯ�삺�a�+Z����.Nâ��e[�
��b��w��Z�
λ�/~����
l�o���;?a�kx�]��ڹk�V�ݾ
��c];C؛
N���.ޔ~��E;;6����uӧ;"nG�r�@��kOw���]_@η��@�� �m�=w�ms�#ox�l��?
�\���:d�7�f����R/
�c$L��˾�*��(��!�@	�"�9!��s$�
F��XQo=ؐ���^4l�j���0
��*�
e
+��=o��m�=�{?!���t�ڊ���j��V����`/�ljq���4:ȉ G�Jh�1A�#TtȌ6�e�nT��\;�HK}sP�
+��g
����5�
+&V#�%�ı!/�}����e�i9b�G�
�� eJ&��%��	Ƈ�f����4���~�d�U
+�<�4�P߳$8Y؈ A"�0�	U~�v�"d�
]���ZO�����+ە=K����77p>�u�[��]�ȿ��/�k�aź>�~#fҮ(=t#���Bk&�<��L ��P�a��<+���[h�(����� q�٬A�\�
��j�Is>��{���ʦ
klYp��pW��U��ꉾH�kE`hږ�&�C��(V�;����N]�^YQj����PBi>ۭ�E �u��d�[�G&/���%$�����/M�s���2}���G�`��>>1X�h�w��O��6�:�4.A��/�+���K��8�(�y��%N�jb�^% ~[�|"�Ⰾ0�?�^�\�W��ҫ�9z5�H�,�ӫ�^q��\-���D�`��+���
+&
��k�W\�
+��
+������J���$�
+Tzze1��/�+ۙqN������b?~$rl���#"�DLD

���
D�jۅ7\$b�0�8'"�1�@�
�ꅆ��DĠ#�X,1 ;1;��D�
&0�i�,��W���W�a@���4lN
���Ux�9@�/�����f&��0H�_Ŀ �m���������ʬ'\���,_�%�����&��ya��s��s�+���A<5�s�q��)�n�-�d��N�-��J8#d�)g
��@� �QE���RC�W�K��To(7�O
�e�R��&P�=L�z eA�&) ��sc
�iįll[3�j���+��~^P�2N+E�=e=%�U����"?˕�0"i�
w,u�+QR<��S����/p��e�4�
\	
�!��j�.ڇG���
��!��-2H���.�6��8�p&밥��[b�v�N�d�m��	����yU՛�p�s
�):�gB��,���ߑ�%�F���—A
\xb�
' �~eZ9.�t`�v"Mpn*��k�AA�SW;

S�j����4^dD]��y�J
Ĥ�p������O�Q|5�_��S���P� �h+��4�G��4⧺�:�A���� ����C�g=��
?�?@84v��Wξ	���d�����Ё�ߕ�,�(Pل
2H߬��u��P��H���/�-�1D��i��6�
�O��T�c�� ����v�u/�����^
��s�/W����bf�
7L}��څ�_�wS
��.J]�e�F�
��1�P��NR�$(�o�]�B�?%�J��<�p6�D��`�:�� ��s1��pC?r�Q�W
��ڨ��͝�'��i���:|	X�a��k�
�?�1Z��%a�8�8s���/�k&�\RC�����Do,h�'�mL��6dK�Ϯl��
j��wE�,	����ꙛ��ؖT�
e?9��|W�]��d
+৉����8��(��hE,w�-��ڍ���x������t豮�-���������d�b����fX�s�$Ra�`������n��a��z�Y
�^v� &�endstream
+endobj
+10573 0 obj <<
+/Type /Page
+/Contents 10574 0 R
+/Resources 10572 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10559 0 R
+/Annots [ 10576 0 R 10578 0 R 10580 0 R 10581 0 R 10583 0 R 10584 0 R ]
+>> endobj
+10576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 691.723 300.1613 702.0043]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >>
+>> endobj
+10578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 431.5999 300.1613 441.8812]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >>
+>> endobj
+10580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.3343 268.1768 236.6587 279.0807]
+/Subtype /Link
+/A << /S /GoTo /D (main_Concatenating_Polyhedra) >>
+>> endobj
+10581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 198.0565 256.1568 207.9543]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >>
+>> endobj
+10583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7077 86.2883 250.8953 115.3541]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10575 0 obj <<
+/D [10573 0 R /XYZ 90 757.9346 null]
+>> endobj
+10236 0 obj <<
+/D [10573 0 R /XYZ 90 592.8727 null]
+>> endobj
+10577 0 obj <<
+/D [10573 0 R /XYZ 90 578.6569 null]
+>> endobj
+10237 0 obj <<
+/D [10573 0 R /XYZ 90 332.7496 null]
+>> endobj
+10579 0 obj <<
+/D [10573 0 R /XYZ 90 318.5338 null]
+>> endobj
+10238 0 obj <<
+/D [10573 0 R /XYZ 90 191.0593 null]
+>> endobj
+10582 0 obj <<
+/D [10573 0 R /XYZ 90 176.8434 null]
+>> endobj
+10572 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F33 485 0 R /F7 574 0 R /F1 583 0 R /F8 568 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10587 0 obj <<
+/Length 2644      
+/Filter /FlateDecode
+>>
+stream
+xڥZ[�۸~�_᧭
�9�K
}�b�v���t_�����[reM&��{x�(ў4A�X�����|�!3
��L�Y!
+������
���n�^��r(�����7R�R������ 	���������bI0��
��Uw�Vo����No�j�k��U�������Y,�������.�魶c�Yk�sN����/7?�GU�N��(�ߛ��l;��#�J1{���Rtv�ᔅ���o7����B� ��1J�fKAPA��J�aR`;,�p��]�Ƭ�T""Yi
��>�uۜ��{$���Q:N�(��Z�b��*�Y��~swW7
�矫}�YU���A7�D)U")�"9�����2����!��:Q�~׵
*��ż�-n�С59Ec�W� �:!9�,w��d�]}r2���^�>�575��粬�u{8V}���n��w�m��v�~��
[�s8w���bf�{�2
��n:����!�����cUJ�(��ËR�)PrT��
+������-��p� H	�8c�6}U7z�\
P7=8p7.e8ݾ]=�U��gxkz�@��K#?�-K"KTbɍO#"
+v�/��>kk��R�[(����ס5����jW?�t�:
��^Eh9#��:`��Ī9j��ĉ
��R`7��<if��y�,�� ��O@�KR I���;�a6"��8�p!�n_��`[�޺�x�0źo;7`��Nm���Gou������K��$��~�
�*s
n��2l1�!�
���p
#ɉ��J�&*T4-;\�
BJ�O���c(u9|��/�2|�����h�Q����U����D�|�H�I��1|��� ɕ�yP.H����a���;]���b�/�
�py�ns!������i
 ��5B���!JO��>
��I7X $+xX�ϙE *�
��PYS
�
�AR穵�����S�%� �A#��/�U�(i�
/qf��2�
O���u���qJ�Kŕ�nn'�0%p~�v�
�3��0��q�����ɖô'py�
�5���=��9�g�B��QX� ��_
}F��
	�ýKy	��}@?\V�u�m
��WZ�xL
�� φ܂!*
�J����D1����
��e;�`�d9�R>Ri�XQ�5E&�]�܀BJz=n
�.�
��$%�+zl�;]�
9��&����'
+0b����t���A��K���ͣ�#X�������	R����t��M�=9��^�%T�"�<^8��[�K�f�	���Ó�
���%k�F�4޶����q7p��vs�>�FYRu��#���P�"U`�	"��G1�釶�K3�괂��/�u�iP
2��f�
�f��y�-�����S�x����E��ݓ�EO���"��ee1����h����
+C����G�W!��^6��ܜ�e�`�ab�k��.�ܝ1E�4�q����ޯ
��g~�
��
/�5��a͙��hH*(�^Ʋh���țJ*(�D�W�gj>B)R�W��u03�X����r��
}��w]��ր ���m�;3ÅGn���^@��
F�Đ���ߝ�6��`ՙ��G_�f�DSc��m/�I
闔�@�&ta2�q���X
���l#{�+';�yƚ�2
xR�+�` }�
+�XRd���:�������d���K^���\������n>�T�'
�L%j�����n;����ΜC2
��܄C�S���x1#���l
+Ԙ��
�W�()d��\���4D���|89�!���Z_D��5,�
C�+�bi�0�i�Eb���o:��{�����se	�pS�;{n3�q�<x�e6�q��
L��`�|��-
+TQ�X�|�թ@{\]Zu�q6(BS�gP�A��_���U��mK���ۜ��w쬾j$�@����u�,
��K�
�g�d�C�&��":�׳Lw<��pf
+����
m.��i���- ���)�}��d�� �SN��GIH at O�XZ9‘QL^	F wk	��cMY�k�!JTz�m@�
�<�[���P
Q�2�HP��H�@�g�m�?�
����
�wa ��فY�Y�5r�)K9F���#0���%y_|x�9��Nw:�PL)re��|&��g�\w��o�f�oO�"��/�n��*Jߠ���ɸ�k���>	r�@�������^��f`ۘoZ�iZ�*l��xm*�s��'
�"%�
��Q�
:2�i��Q��,?�
J$G�`�+-�w(:���s�殩���U��!0��mT�GjR
$��ReG�B�zE��l�?��0%34���YL>�0������rj
w݄&x��Pt�}n�#��0pL�>W]f;�A`�<�z
+���.|���!	�<.�@ȇ|W�~��QJ%�OG?��x���IW
��,��ۣu�,�r}�Ѷ
p±m��c���x�/�<-��_ED����	ӿeٿ#�0�B~ן*XυP_��C����o�J$-%�9:T�6 ��z4����t���so�U�S�����ldPC*K
�Q��n����-�~(6���4
W�
p at xa9x#�
�-O�uz��no���������ء��=
���/�#E
v��Qh�Kb~�)0	��P�mx��p����CCp���46U��ZЕendstream
+endobj
+10586 0 obj <<
+/Type /Page
+/Contents 10587 0 R
+/Resources 10585 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10559 0 R
+/Annots [ 10589 0 R 10592 0 R 10593 0 R 10595 0 R ]
+>> endobj
+10589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [448.0245 703.0555 483.2121 734.0242]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.3762 480.1145 385.5187 491.0184]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+10593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 161.4207 239.8565 172.3246]
+/Subtype /Link
+/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >>
+>> endobj
+10595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10588 0 obj <<
+/D [10586 0 R /XYZ 90 757.9346 null]
+>> endobj
+10239 0 obj <<
+/D [10586 0 R /XYZ 90 682.9808 null]
+>> endobj
+10590 0 obj <<
+/D [10586 0 R /XYZ 90 668.4105 null]
+>> endobj
+9706 0 obj <<
+/D [10586 0 R /XYZ 90 554.8401 null]
+>> endobj
+10591 0 obj <<
+/D [10586 0 R /XYZ 90 540.2698 null]
+>> endobj
+10240 0 obj <<
+/D [10586 0 R /XYZ 244.4393 164.5738 null]
+>> endobj
+10594 0 obj <<
+/D [10586 0 R /XYZ 90 147.8466 null]
+>> endobj
+10585 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F25 348 0 R /F67 370 0 R /F11 416 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10598 0 obj <<
+/Length 2919      
+/Filter /FlateDecode
+>>
+stream
+x��Zm����~�B�Z	����rM
+�m\$m�Ծ�Kb
x��F"����}g���\Rw���0�#�;����,�
+�?�2x��B�q��
���=�����|;$���ի�R�
2����}��$HPBW7��ք �6[�1^��!x������
�����!����?��:�?^_oo�^W�fK^��5��|���ݳ���."֜�ͻ�����E�;L+�W?�ë=��+���b�`D�����,�q�z{��~
��{!�NA�0�2HSF�TZ L��a�!"�;m�L���H�;z�eǼ���z�O�)R���p� �D��z*�QIVH&ΫZQ~��	{��1C���{�)[A�l�@Fq
��yȝ��P�(�������:oNU�/���V[���Vs�v�r_
�)�[�;���O�b�����3j&+i("���>�vH��ޞ���8aJ⒳
LՔ�H�q.d̴Wn�x���ꮫ�H!MZ]�:��Bc���K.��j9"D�!%Q�2�wv��#�I�^2�H�[y*+C��r��)�C�������[�D"����%e�DI"R̐dp=��桮lX<y�.����
8ELb�a<Y
A��f_���eՎc-v�,[���s���wmU��[�a��Kq6 [�] �w�����m^��4�)
~��!�T�8�4��I,Dd7)�ݺ�lߥ��
��e��瘰���SOP���nѐ�7�5��P^����=�e���t����r�j��onI .�ke�2x�f6;!#��ܳ�Ln=[��	lB>����y���o�/����n����m���^�������@%#�F�����6^�ʂ��(�K ��E��>�i��,�ϐ
S�nI���hR�.���,]�7�7-\F�z�����	؁
+,������ �W�-�|�T���,����m�`�?9B
'(�M`�L��bӬ�'TD)lLp!!j��|��~I�K,{SR�X��aC^�h���Ihcx�*�<�9�e�*0[0�`��2
��\|�R�L�3��J(�vjĥ(w��!y"��ִ��ttۻ�ɠ	��b#)��=P]�!�@���CV��
��r@�K��K=��3�Iր�0)��E�Β�a��TnXX� �k�`C`!��%N!<����*����ujA����/'zBy�*�O�`A#	='_<�-B.�(��d�"X@�1�醫s��ٴo��
+w���O뭯�ﭏU���
v� ��-�;���� s�������m�a��ܞ"
�T�
���]~{���:R� ��� �A:�&� (&�E�9=Z�s#Lz����6����
�T�uJ�mR��g��(S���M_X�6���Q
QJ�'.�tnQ�0)[,g��Q5�T��-d�c�kRͷm
�’�`�A�,4 I�
@O6瀑,#�%[VFO5�!V����X���nB�T��	�s;y��-�=����x&�
�+�b��Jz�KؚmH$@u�_�2�ϛ���*\|͏u��
E^h7�dK��.M͖��S�	���,b�
���Ԍщn��ӗ�}�4A�po�:��u4E��y�e�zZ� C
+k����#��FJ �T
��)�\<{��b��c)f|#�}�
iQ#�A�D��$)f8�` ��T��C
��
�����֓ذ���:��;:�����c\���p͗{9b{GOb����UUz
�_ٹo�cրά0�}��B���R�;^�b2&Ҷ�r,ʤ>y�KH۪Ҙ�9k	��l���-��"�j 2Q�\L���
��������r���d̲KM4��X��x }*��.���H��T$���7��
n�Q�;�U&��B
Q�=A��+�s�=c�E�=\	
�2�^7�%T/O38�D�dA��
��S�\��������T9P!�<�6�źQgl�Ť�<��[�<��$�z�z/��=��r��q�"o��a+����\_G����~���c��8>
���*�'�w��?܁��=��ʝ�u��cvp�B��1��_⥒�O1�1��#�2�
u801A��<
���G� �@o&��&/N�v�G��1B
�^��r����a`�Z�~Gֵ����B~��ϱ��N�G`Y=)l\CB�bLB�Hԅ��o�/LK�t�8ie��)f?��
�Z�g�Q���ܶ����s�H�^8��i��3%
�]񙑒����'N�����^�����9R3"f{G@�~�۰gJ�	�yx�Ab'���~*���w�)i!FS��݁Xvj���\�藩����P���WUU� 
��?�$7%ϰ�g�dQ�F�gl��`#�DJ@�J�����.+��=� k�ٶ��f�a.��C����r at aJ�g��)�
m�D�t�ؓ}Z۸��s�8&�6F�|�.y�q%[`�0"�z�1��T�$`u��
`Q�1Y�(���9���g�I����j���e����ˏ�G�g�
��y1�R��\��&o�0"��m0��+�V�TA�}?9�Sg!����>'2dfq�D�E7�Ԣ��}ʳ칛P��j
w��g)�	��>�~�l�Q�7߸ߏ�ůzА_�{Ph?�ާ���K��	lh+�xBeQ�2'���u�������Л�`?s�~,wmZ��jץ07=��M�E�d2\ϡK�UӺ�A��;����q���q�% h�����S�D�u��g���M��4v@�m�3�6q>��r!|�w�&Q [...]
+�H���Y߱
+ɱ(��1=߷`#!�� �l
�endstream
+endobj
+10597 0 obj <<
+/Type /Page
+/Contents 10598 0 R
+/Resources 10596 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10559 0 R
+/Annots [ 10600 0 R 10601 0 R 10603 0 R 10604 0 R 10605 0 R 10610 0 R ]
+>> endobj
+10600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.6395 616.1412 300.1613 626.4225]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >>
+>> endobj
+10601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.1437 575.9764 182.1636 586.8803]
+/Subtype /Link
+/A << /S /GoTo /D (main_expand_space_dimension) >>
+>> endobj
+10603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.5022 470.5008 241.6898 499.5666]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.635 397.0011 163.8226 407.905]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [486.5494 333.5486 513.9963 344.4525]
+/Subtype /Link
+/A << /S /GoTo /D (main_fold_space_dimensions) >>
+>> endobj
+10610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10599 0 obj <<
+/D [10597 0 R /XYZ 90 757.9346 null]
+>> endobj
+10241 0 obj <<
+/D [10597 0 R /XYZ 400.6899 579.1295 null]
+>> endobj
+10602 0 obj <<
+/D [10597 0 R /XYZ 90 562.4023 null]
+>> endobj
+10242 0 obj <<
+/D [10597 0 R /XYZ 213.4267 324.7465 null]
+>> endobj
+10606 0 obj <<
+/D [10597 0 R /XYZ 90 308.0194 null]
+>> endobj
+10289 0 obj <<
+/D [10597 0 R /XYZ 90 217.2037 null]
+>> endobj
+10607 0 obj <<
+/D [10597 0 R /XYZ 90 202.6334 null]
+>> endobj
+10608 0 obj <<
+/D [10597 0 R /XYZ 90 135.8127 null]
+>> endobj
+10326 0 obj <<
+/D [10597 0 R /XYZ 90 112.8782 null]
+>> endobj
+10609 0 obj <<
+/D [10597 0 R /XYZ 90 112.8782 null]
+>> endobj
+10596 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F25 348 0 R /F11 416 0 R /F8 568 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10613 0 obj <<
+/Length 2846      
+/Filter /FlateDecode
+>>
+stream
+x��Zm�۸����m��
�\�Sܶ�ޥ���n�-�!Z��U+[>I����w(��(ђ���kI�y��33���Yh�PB!͸\lvWx�n�銸�kx��������
���rq��p�	J��n�vI�|�&����eZ����+��E��h�e��/�}���77�mK�d��ԫww�^�"�ǟh��d
+��ے*�(��Q|
a��L:/gY�1O�j��/�V�.��i�6�\�di����KN�ez��]�:�Y�$������;�؂���ˆ�D,��#�5]쮀��ȯ�\����>h^�-� ,�B�V�2��`�u;ևc�S
L��E�b��	�uM�����,�ڀ/����Kp��c���Ks(Me�uZgž%*
��U��L�D'�ˇǖ$P��UG�b\�`lKRݬ���C�W&�P��*O�9K����8U���� �q���u�B����
�b���9�'^T]
cfP�����ٵZs"ᶀ8���B�)�YG�[��SMZǭzn��Ǘ�}��b���M��a�N��=�.�g��?fےU�Umv�#��ަ�Wu�f��jl���}��Q�*��T�՟���׏�|�*��&�Q�y��4��\	u���%��ACYX�<��9��[��py�����
�E`��Q���
�B�#���(�0o���{,p�_{ه[
U���V���%R�y��1�G�
+/l�9o|�4
�H�
��0�<�
�Eb9CPB��|[
��w�0 ¢r!<���}m�c��b�O�L2J@�.�Zk��ևC��:�,�[w�ġ\9�6� �%e��	&���-�!
+
ຽ�6m�MxSLX谿��1L��cZG4�P�(��f��i� �4Q�fo�.}nu�ot#˺ k����6������f;���>�����
�V����PK8�Mb7�
��Y�I+SA�3@<����G��4�1�E�܁	�<�
��M��m
(��
"�
���m��
�Rs���҃�%���5
�ڲ�%5�
+)%�'@�
8��


+�$u�Ǔ��
�)�˟wIP��۩7���
�a
{ ���;�z{sӬZ��aH�.�}�b��Q��ܻG����;ui�փ���~�Q�9��O��foz��,v�U��y[ m�ve	���Dzc����N
}�qOK�hq8ݑ5�F��"ޢ��NJ���B[�1 o �p���cS]��<u��\ ̴�R3��=1�� �|4$�h ��f"��B6�SR�Gs҈��0(ER�J�s��㚆�zh��5�ׁ
7� ��S�dJ�ջ�4�����
ERn0��
+�C~ܚ�
٦

���
@�'�tӋ��(�BL
�k�'T��~{�ϳ�w����C
"��b�UaC�\f�	&2�#�ͬI��̚��3+�[��[�:,�D���}]�o��Ȥ&�T��:��(x��}T~p4�{�w�3ڏ�6ho~8����
A۝L{���L�~I
Q�~9
+
�fPM/5��ϙ>��41n��Z0
�N�L�@.m�r�EE���6��, S��5Y��
��u�>LWv��l M#
���Ȭ���3_���vvz�^H߹�&ݮ����
�0�$�>��mV��Z������� �U�mV�����x�)8Z@�€O}�'�����טoN�ty���ɷ
i�1���6�5��t�A79���ƶ7h�S
+I��%���|$�~4Q�<�R���9d�d���c8���r;d��
��A����+�%���PF(YP�B�ϣ���1b�w`�(����Dc�!�j
�D ��ؠI�\jxG?c���.�8�%R@?c?אm8�2 k�ۈRs ���uM[

O&~)D���0_-��N����1n��"D䐕<j3�
G5����%
fC�!�e�� ��sH�H��f!��pg�zH
���Lߥ	�����
�xw�1Fh ��������gL�j�l�(���n�Ʋ�'��.�
�<Dm�z��~��߶	;�fa�K���v�)B�I�*K��
Hvd�8�B�5��sM�
d��v���ߵYq�,v�-mCE}
'����1i�7�77�	�u�I�B݆��f4s�6�bI%�:#?e�h;mwAfғ�#d��BN���/�gB���KrҔ1���6}Bi9�̎j�����`P�������v�:���q�������MNBf
�{�N�
Z2���͡�'�?�eO���rҤ1�8ZF:�Qm�S[�
G�f�s��L*���־�#����"B�vF�3�{����
+`��*�$`Q�HBD+
+q8�TkD��
�,Ɗ�<��IR�k���
m���w=+�E
M�xwT�>Y
��7L�
�ٲB	"<��v�{Ӊ@`U�
yg�sd�n��Ӏ���"&��񍧚5?��
�o���Tp��8�hv�T|�bP�����b
P3�6�z<"�
+4$�$�9�1�1���=�>aڶ���E]�3<?3ק������� N�?
��q_�d�A\�b��}
5dl݉���
+�4���d.b��yV2�(P�0=?)�D�d��c�ى2��O��n�%ʄ��D��%J��S��p薤�t ��<��#�sn�T��jz��
Ռ|�`~ �������K��B�
�)��dm�9<��b���|&&qN���ʽ�Ԟ��g 
�$R���H��d��B���P,q-��H6��oD+w� �֟�������Ge�_�e
�~��~���o���i{6t(
U-�5p��D6�!�

^��K��/��?��l�º�F�|���#���Ǻ>�\_?==�M����P���>
��^3�)�5\bO4�%p?�0v۽�.��ڮ�ߧe{��k�Pţ��9��$�sendstream
+endobj
+10612 0 obj <<
+/Type /Page
+/Contents 10613 0 R
+/Resources 10611 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10559 0 R
+/Annots [ 10618 0 R 10619 0 R 10620 0 R 10622 0 R 10623 0 R 10624 0 R 10626 0 R 10627 0 R 10628 0 R 10630 0 R 10631 0 R 10632 0 R 10635 0 R 10637 0 R 10638 0 R 10639 0 R ]
+>> endobj
+10618 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.034 364.3722 264.2031 375.2761]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >>
+>> endobj
+10619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.9406 364.3722 305.7047 375.2761]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [357.0104 349.8075 391.5684 359.8203]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10622 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.0462 325.845 290.2153 336.749]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >>
+>> endobj
+10623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [300.9528 325.845 357.7291 336.749]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >>
+>> endobj
+10624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [311.4348 311.3878 345.9928 321.2931]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.7996 287.3178 266.5637 298.2218]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.3012 287.3178 341.41 298.2218]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) >>
+>> endobj
+10628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.8169 272.8607 323.6127 282.7659]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10630 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [235.7996 248.7907 292.5759 259.6946]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >>
+>> endobj
+10631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [303.3134 248.7907 393.4344 259.6946]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) >>
+>> endobj
+10632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.8169 234.3335 347.0237 244.2387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >>
+>> endobj
+10635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 147.4489 163.3608 157.9793]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_900663a0e97525c064ccf31152fa8ae7) >>
+>> endobj
+10637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 110.8678 163.3608 121.7717]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_1c71c9b7d1de1b77eeb054e1c0ac935e) >>
+>> endobj
+10638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.698 110.8678 228.964 121.7717]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10614 0 obj <<
+/D [10612 0 R /XYZ 90 757.9346 null]
+>> endobj
+10327 0 obj <<
+/D [10612 0 R /XYZ 264.2149 681.5306 null]
+>> endobj
+10615 0 obj <<
+/D [10612 0 R /XYZ 90 664.9507 null]
+>> endobj
+10328 0 obj <<
+/D [10612 0 R /XYZ 161.2224 602.2793 null]
+>> endobj
+10616 0 obj <<
+/D [10612 0 R /XYZ 90 587.7018 null]
+>> endobj
+1541 0 obj <<
+/D [10612 0 R /XYZ 90 488.615 null]
+>> endobj
+310 0 obj <<
+/D [10612 0 R /XYZ 90 481.5077 null]
+>> endobj
+10617 0 obj <<
+/D [10612 0 R /XYZ 90 381.2796 null]
+>> endobj
+10621 0 obj <<
+/D [10612 0 R /XYZ 90 344.7748 null]
+>> endobj
+10625 0 obj <<
+/D [10612 0 R /XYZ 90 306.2476 null]
+>> endobj
+10629 0 obj <<
+/D [10612 0 R /XYZ 90 267.7204 null]
+>> endobj
+10633 0 obj <<
+/D [10612 0 R /XYZ 90 187.3127 null]
+>> endobj
+10634 0 obj <<
+/D [10612 0 R /XYZ 90 163.8931 null]
+>> endobj
+10636 0 obj <<
+/D [10612 0 R /XYZ 90 127.805 null]
+>> endobj
+10611 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R /F23 2436 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10644 0 obj <<
+/Length 3195      
+/Filter /FlateDecode
+>>
+stream
+x��[Ys#�~ׯ�SBV�X�8ǃ�q*v
ol��v�F�hwl^�
WV~}� �
��䔪Dr���C�u�2��GfϔPH3.g�������"��%�_��__��B��FZR9���$A�:�^?'q�X���݂�yyܖ7�������X����=�LJ�>s���}ul�v����o� $�O4CL2x��?9�
�e�wo'�h$���/YݔM�XR���
M����)��]�����
R̫�
+.)A��Sn�^��:���`���r���x�y�Ӆ������t��������
�����@��l�8*$<>%E0GD1
+�I�R���n 
+IJ�Y3���R1l
���,V8�ˑ.�w�̕���ַ1:*�$
��a{�_P��
FIa�p�ĸ
R9�
,�R�7X��~״np�u�[�u2�3�8� k�8��Q�E�6��� 6�a�*>+ ��,�-9}4e����*UH�nܯ��&3 �����ݾk��m��?t?L4��ͺ�*��ao�M�+శ�w�����m
&�
gL&�	Ĕ.:�X20�y���E-�p�p�
�uS-� -�M�����w�e	�a�2A*
	�4�i�i��� 
��b"H��0î�z
���\�
d�HK�c�r�SI����ɠ�𘦜_���D�1�Ϫ�=�V�
�,!��	iXK�	�"�ψ�Qv��'R��h�r1-d��3:],�!
�L
�����6�8�Vm
����̺w������~]�=
�|TPث���T�ƣ*�!
qa���H,�^,�I�^*g�\l�v�ߌ�r��d`�|�{�
��^K���]�V�������"��cJf
�28(t ��1耐���9GTH�Tw�
���
��C��u�
^*g���bٷ���m>�����"C���E4�Hќ3����q�L�
�_�|� .�&
+�ɴd��)]�C0�2�����&�qH
���us֖�J���UlU��q��GK�}c
�RҨ"�
�8߉ߕ�f�;�����ζ��*Fs)�	�xV0���N�M`��Ul��/M���4E_�aK&�$�8��}5��ϷQ@���&F���ˉЮH�>| �6�aA�%�u��ו�������#Q�^�
+�.x.s�l�&2g�n�9{f���o�	�3`��ͱn��a����LӽTβb�p>�
J�'�	!bB_�&b
�4��i8N)%�i�c�
��
������o�\
�4/B�1��ue���~�6U���@l0�%]�

)�����<4m�u߇�I�5;�ォyup
��M8)$
+N��*�Ӯ��Ad؆��Az1��
��TEa-sl���l)L�Mڮg��l�mzf��6i #�
۸5�
�
1�1l���/
+�a1��sC
?�{O&�HG�p�X�.�j����
�U�BD��w�à,r�c.M��f2�^�p�8g�F��э{1p�x7��s��s�-}�eO;滥
���<

�<�aTv��>�L���%=���
^p��ԯ^�pEa��s�IJ�+�t�.��a�V���ᦩ�[ݴ�j4y�i,t'E\c��I��
lh��!m�m����ֻ�ۇ�/9h
8�I�� � ���;��j@���"V�u$X-�Ŭ��oldw���]7�h����~��FE7E�uZ��E�����k�����PWk����MB� �x�n"��9�������f�N
+�c	/�g�H��,��Y"��t�H�|>K$�>�D��&�_��˓�>�R�$�e���aD %�
��sȂR�X^D��Yx�
���b[�JSf�7�2D��	J~C��0�����	�L$0�m��,Q�
+s��ݎzf�s���'�e2 Fz
�o�� �H�d��rV%�n!CwC۶�u��)7���ͬ�|g��l���)��
+��2.�XG"Ѓ�=��Z�
�����#�h��
�?�Ǻ
�y�J�.�˶n��x�>F�l�����c�x�
+�b�ޱ
b�
�;��~�6��m�
���e���Mi
��ۺ��hl�nW2��E�:"�ux�<u$�>RGڮ����G�k[���k(����a�s Fz�r���0��9V��j��aPL��M�"He`P,W���3{|�^�
+�H��g�
��`����O3��[*�fV���
�3��J�^�n/�L�ta%�/��!�,��
H2��w�m�k�-�;��G���F��$Pf��ԋ�;��[%+��Z%YCD|�i��H~��F��I����rK˲N�0�:�
��̞��	Յ������s(Fz=��� 2�z/��[@�hH�}�?�g`~�F/�y�:<�F3��Lw�����f`�D
�0e�_�Sm�$^,��T
�����&����'� #�vBnWqG��0��DdZ�r�����0��䱎���b�C1�Zfw;��:��~�S��Ψ�7�`�"�W����H
3�ɴ(!�q��M�)�F�|��EjN�+As�����
)�t�.�S@��n�ciN��	�e��=q͎ �2s�'���޺�܍�>M���i.�T�8d���A���-��s���7�~n�
b�|rۙv'��SPi���]�N��}�@W].�/f���Z'��ۜ��̶$)( [...]
+/%�
�N��-K4)|�&�
@/�Ch��D%��fIp� �3�8��o�ӲS?��e�HQ�;_~�����  �RI=7z�0'�H.z�X>z"�GO����-Po��P�sŋ$JC2��0o\����r=�g�5�����$�e���؜arЁϨ�a��c���t��ʋ���)��f>
;�1y�����2��~��8���͝(ys|�#�
hw/^�P+zg������ݜ�s�A��ݦ9�].Y3�h>\��΄���Sh�9�
�a��^Q��h�'0���u_�Ƶ,�"�7�%�
+\�^�	s��x����'��۠}�߶v?�W�ݏ�4���
!�M؍8�3
&�>Uձ	� �U}��j�<^(�.��<@�%w����U�RK��2z�m¨��#������ٛ7���hՠӮ>
Qݾ9
6o��`�!M���I�	�����1uop�X����v
;dpqk7xF�Q�I(��,endstream
+endobj
+10643 0 obj <<
+/Type /Page
+/Contents 10644 0 R
+/Resources 10642 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10680 0 R
+/Annots [ 10647 0 R 10649 0 R 10651 0 R 10652 0 R 10654 0 R 10656 0 R 10658 0 R 10659 0 R 10661 0 R 10662 0 R 10664 0 R 10665 0 R 10667 0 R 10669 0 R 10671 0 R 10672 0 R 10674 0 R 10675 0 R 10677 0 R 10678 0 R 10679 0 R ]
+>> endobj
+10647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 720.2859 163.3608 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_f60bb41867a12ce28144596e3cc1406a) >>
+>> endobj
+10649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 683.8697 171.1095 694.4001]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_c3283cf8fd0dd8ff2a319cba1dead1f2) >>
+>> endobj
+10651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 611.3065 215.923 622.2105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_411d42e5b59a492742793834efeeabc1) >>
+>> endobj
+10652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2602 611.3065 281.5262 622.2105]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 563.9315 171.6497 574.8355]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_66e3e2f2433738665eb748d2f6c5878f) >>
+>> endobj
+10656 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 516.9301 187.1514 527.4605]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_e006881831b298f0af5031e99df2bc6f) >>
+>> endobj
+10658 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 469.1815 202.9022 480.0854]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10659 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 469.1815 300.0368 480.0854]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5a36a32ab46d46f574f3091e931e2bd2) >>
+>> endobj
+10661 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 432.7654 202.9022 443.6693]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10662 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.4003 432.7654 314.2635 443.6693]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_cdc1e9b5ac338be9d0584d50d275226e) >>
+>> endobj
+10664 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 396.7229 161.6774 407.2532]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_8c82df1de8703aefeab268dc9ffc557f) >>
+>> endobj
+10665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 324.1597 204.9848 335.0636]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_7607ef1c8ef6b668dd2be62c39330406) >>
+>> endobj
+10667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.2138 278.5544 182.6979 289.4583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_277ba920e188477bb301196b19d63770) >>
+>> endobj
+10669 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 242.1383 172.1977 253.0422]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_754f66ed06474d4b68a93131af02a86f) >>
+>> endobj
+10671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 205.7221 155.8589 216.6261]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.357 205.7221 180.337 216.6261]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab2c45cbec19ad11bf34db42b794508) >>
+>> endobj
+10674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 158.7207 155.8589 169.2511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.357 158.7207 172.7355 169.2511]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_a215867508a89858bcc7ab025f8d20f1) >>
+>> endobj
+10677 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 121.931 181.871 132.835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >>
+>> endobj
+10678 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.3692 121.931 206.3492 132.835]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_272424f5d0df282c6d1ee63a5c84e3e6) >>
+>> endobj
+10679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10645 0 obj <<
+/D [10643 0 R /XYZ 90 757.9346 null]
+>> endobj
+10646 0 obj <<
+/D [10643 0 R /XYZ 90 733.028 null]
+>> endobj
+10648 0 obj <<
+/D [10643 0 R /XYZ 90 700.4855 null]
+>> endobj
+10650 0 obj <<
+/D [10643 0 R /XYZ 90 626.2735 null]
+>> endobj
+10653 0 obj <<
+/D [10643 0 R /XYZ 90 580.9209 null]
+>> endobj
+10655 0 obj <<
+/D [10643 0 R /XYZ 90 533.5459 null]
+>> endobj
+10657 0 obj <<
+/D [10643 0 R /XYZ 90 486.1709 null]
+>> endobj
+10660 0 obj <<
+/D [10643 0 R /XYZ 90 449.7548 null]
+>> endobj
+10663 0 obj <<
+/D [10643 0 R /XYZ 90 413.3387 null]
+>> endobj
+10666 0 obj <<
+/D [10643 0 R /XYZ 90 295.5437 null]
+>> endobj
+10668 0 obj <<
+/D [10643 0 R /XYZ 90 259.1276 null]
+>> endobj
+10670 0 obj <<
+/D [10643 0 R /XYZ 90 222.7115 null]
+>> endobj
+10673 0 obj <<
+/D [10643 0 R /XYZ 90 175.3365 null]
+>> endobj
+10676 0 obj <<
+/D [10643 0 R /XYZ 90 138.9204 null]
+>> endobj
+10642 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F25 348 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10684 0 obj <<
+/Length 3412      
+/Filter /FlateDecode
+>>
+stream
+x��\�r#�}�W�ɡ�L,��R��q*N\�؛'ۥ���.m�C�#���4f s!�ZJN
�-�D����>h\FlF��9:3�'����]��{x��,|���9�O�.�|��������m-hFg|�n��1"��QJ�o/�/�w˫�������j�_^�c}�_�?��{ۣ
���j.���/��3'��� o�w
�G�Q
����G�M&�����fy8\.���w��ϫ��f�T�;_W�����y������r.��F/��.�.DV	�|�~���{:[A����D8�f��
��]H.���7�Jv��/Lu���X��l!$��>�bTf���P�d�L��00C4�v�`>
��q�g�Qgf���_I�e@��̿�>�:g�5��������
��uS�M����X#m�%'�Q���~ �	�f��xV�Ո�3�(&��	�������|G��Y7t�`M���H
1�j�DKkc��
�"�r
3-G#g8jنFG-��+��몹�oC�5B�햇f [...]
ap/@̈́�I*m
d(WHR%�T��s�
+!`=n�꒫��>�^�
�e	�F���^��C	G\��u�پ_o�
9�R�
	�x��Bs�
�e̲�#�HB���Vn��Z	�K-��|����R�y��}&�y��T-xW���z��{����No&Ȧ{k�>�p��i>����׷a��,cǡ�T�0�~G�s��@�@��I���>t�^3�$RG;�аm�t�`�n

�k3����a}�|���YH|{�	��y�g<%NY�:��n��;�
���
"�L
+�q&__�`X� +)S��ʔ<[���2�ܞ�L��W�2�L}�㙟C�&)t��"��
��u|)\���F��I���&E�����R
�]J�_?ը"�B�#�ax�e�N�2��j9���:5�@�gNY��p~26~Ah'\�w� ��L�"�EBaޥ$��a�>��V�sd�}j�6
+�`�
l��L�m�6�_y�
�7}m��
�lBm���j�ܱ�@P�
,����<�C[
xZ�8�����S}�5��]Y��
�_� Z'��,]J;b��_[����Fi�HW��ҕ<W�r�����Ub�l�*�N�
��ZA@��`�Qb�H(̯��Q)}�
ђ
+����D+�Q�����e2�ʤp����c�20��
�
��F�7&W���v�v=�Β

Z�w}<�#
#1��Y,W��8�Lm�A�,� D��9?���S�K�v�}���dU,�ur��IJyӁ<�?�V1e�����~���
.�B~�]4�
+����W&�� 8��ҁ��^=G�5��K$GL�9��/0K涎'r��ѵ��'	���v>48?e�PB�#��p��wG��3�lD��"���0��Y>�k�Tr�P<�`h��I
T�p�4>�0��AdL��>��u�-*D�e�:3�mT-��C���T�z���(
���?�M�v�
j�q��S��،����vUT����s�8a[Q�#����8O8�~�Ԫ �Lf��n{�,����m\���q4@��fS?x;c�
N����A�j\��w��Ǝ4Vc�
a�bg
U�7�q�����O��#�#�=��-%L�J�ÐPN
�j�`Zq��P�� �1#�E�P+I�4>�0��g�2öS�?4��<kNЩ�x���n������
	@Da�� ��A�����|�a���:�Q�o"l0���v��
�OIӾ���w�
++ZB���zh����$MP=a���㕕v��XYn�\�h�旛���j+�f�0o��e~�Ta�T	��tf�$�e�Q�s��L�\�"�e#���֦Z��v����\l| an5ԢR�A̱#%XJ�u~֑Rn���	�����{}��1=���: ZoN��sVľD��]�på~�{R��,�v7�
SC����2 ��L�1�׸i
D�1�)J
k��+�)�̷�����wM���ƴ}�
�&_-C0��W���A���������jb�'��;��'PAp���
���/�
+������p?]���L�J�R<"��X��Q��?�3
+��~0�78�ˎ6��z�U'���8FK��H��[�7ߞ������F�pA8��i�N�2��M��9�h���){�P�P�{]�X�|�EЏ9��4?�Q����E�X
��ۻj������, �4����
4�l{?�P��
*
�oP��[���>��AH��z�����n�j��IH$ ���~�
�>� e�n�:�����ES�Z�+7?��
�.���#��-L�B�u���(�{�yZ�<,w��
E�r�O0
�͇��d��q����� ���|�\����R`�a��dK�S��'w�+O��)�S&1��.�+XI_��`���﷫�n�e",���u9 	�p�JBr81舣U��8s+N
I�c4Fv1A�_�c�
��B�
X�X����$�
��� r%I���l�
��Ua�rv�ՎW����ڎ�p)��P
M^���H��K�ZnWS�	*�������98U�
{�#�NxF*!��`�����s}�f�I��z'�%�%���P$‚
_����j�
���`$<Fcd-ߜ�ՊD�Q���Vt0$0�d�h�x�Zf6Jja�]��[o�QHXp����$����
����g��Y�P��v�
U��`A!�A!{n��z3���)6p[T��ٝVǫ��U{)��Ľ
��h]�IB!�8�d����Q�t
+�X-N�L�c4Fv���$�����B�
yh���G��?=l��Hen� �	����
K/CLfF���-��DEe�R�����1�`$��̴�O ��d���?�A9�pA�
���7
+r�-Y��O(Y#���]U5GjUZ%�׊b
"
+s�H�0L��?*�
��R~j
�1��֪����PH(�?,�%����	�T�{�R��� G��� ��YRZ	
+dՋ]ܶ���		Ӱ3���g�,��a@�j�d�$�E�Q
3���~OQ�"����Q��f�;T�#K��
��B�&��G�J�`ޣZ�u���(�~�yb��6C�o�K�	�T��E��#�B��!�К���/�=_��k�%����_�MS�u�jS�cQ�#&�Rhu��-����e��޾�TM��>����z�aۻ��7���YtOLB��
��(
,�a�/�%%v}縲X��ı�|:�"���b��pfZ���S���`5f��=�����'�)-�
��{'�o�����2��G�{��V��߇j��K��x�f{�
��C*>
��CO U��W�twAg����8��K�(u��8���=?q_Xd�����#����f�ٛ7��@��ݞ��7���͐��0�8,o{�F#+�F\zᗔÒ�œ�m
�>w�>t�z
o�-�}��xTl�� 5���endstream
+endobj
+10683 0 obj <<
+/Type /Page
+/Contents 10684 0 R
+/Resources 10682 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10680 0 R
+/Annots [ 10687 0 R 10688 0 R 10690 0 R 10691 0 R 10693 0 R 10694 0 R 10696 0 R 10697 0 R 10699 0 R 10700 0 R 10702 0 R 10704 0 R 10705 0 R 10706 0 R 10708 0 R 10709 0 R 10710 0 R 10712 0 R 10714 0 R 10715 0 R 10716 0 R 10718 0 R 10719 0 R 10721 0 R 10722 0 R 10723 0 R 10724 0 R 10725 0 R 10726 0 R 10728 0 R 10729 0 R 10731 0 R 10732 0 R ]
+>> endobj
+10687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 720.2859 181.871 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >>
+>> endobj
+10688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.3692 720.2859 198.7477 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_04aed5c92cf15c71ce85b8cc173a893b) >>
+>> endobj
+10690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 684.2394 189.2035 695.1433]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) >>
+>> endobj
+10691 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.7017 684.2394 216.9992 695.1433]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_b66151b86ac8c495eba1a3209501928a) >>
+>> endobj
+10693 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 637.9812 189.2035 648.5115]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) >>
+>> endobj
+10694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.7017 637.9812 209.3977 648.5115]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_241c65ff3d32769cbb9badd2c8e00ca5) >>
+>> endobj
+10696 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 601.9347 215.2157 612.8387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) >>
+>> endobj
+10697 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7139 601.9347 243.0114 612.8387]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_9fb86f09111d4ac21fdc7c7baa86e622) >>
+>> endobj
+10699 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 555.6766 215.2157 566.2069]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) >>
+>> endobj
+10700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7139 555.6766 235.4099 566.2069]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5eb3117d3d7d0566a99f9f5807276864) >>
+>> endobj
+10702 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 519.6301 198.0107 530.5341]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_44b0a622563e60fe28b91b7e9ff76364) >>
+>> endobj
+10704 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 483.9573 155.8589 494.8612]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10705 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.357 483.9573 213.1435 494.8612]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_386fa9c84bc37468f1a3a2b860a0bc3d) >>
+>> endobj
+10706 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.9592 483.9573 247.7233 494.8612]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10708 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 437.3255 205.7616 448.2294]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) >>
+>> endobj
+10709 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.5772 437.3255 240.3413 448.2294]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10710 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.3223 437.3255 292.0864 448.2294]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10712 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 402.0262 166.4493 412.5566]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_2edf5fe7007a3e91a404546ca2f2d98c) >>
+>> endobj
+10714 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.0948 331.5069 163.3608 342.4109]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.1004 331.5069 214.907 342.4109]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_b955487a974e74224f3d72d743ee78a4) >>
+>> endobj
+10716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [242.2441 331.5069 280.5102 342.4109]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 295.8341 167.4656 306.738]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_fe22acf3f8e5b6c20880acd443350482) >>
+>> endobj
+10719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.2813 295.8341 209.5473 306.738]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10721 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 260.1612 252.7949 271.0652]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_113964ab3d7ea36326ce962629a322ce) >>
+>> endobj
+10722 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.1321 260.1612 318.3981 271.0652]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10723 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 224.4884 229.5525 235.3923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_def4c62b5cdf5186801c592cc62dccea) >>
+>> endobj
+10724 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.8897 224.4884 295.1557 235.3923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10725 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.2989 190.2136 266.6729 201.1175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_01b873b0e820222e07789c3ba5fa48ae) >>
+>> endobj
+10726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [294.0101 190.2136 332.2761 201.1175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 155.9388 196.3468 166.8427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d3bda090e4ac93d937ac4dd775c20919) >>
+>> endobj
+10729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.684 155.9388 261.95 166.8427]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10731 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.0997 120.2659 179.7393 131.1698]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_1ee74f5687635ddbb9729be31a37e2d3) >>
+>> endobj
+10732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10685 0 obj <<
+/D [10683 0 R /XYZ 90 757.9346 null]
+>> endobj
+10686 0 obj <<
+/D [10683 0 R /XYZ 90 733.028 null]
+>> endobj
+10689 0 obj <<
+/D [10683 0 R /XYZ 90 701.0429 null]
+>> endobj
+10692 0 obj <<
+/D [10683 0 R /XYZ 90 654.4112 null]
+>> endobj
+10695 0 obj <<
+/D [10683 0 R /XYZ 90 618.7383 null]
+>> endobj
+10698 0 obj <<
+/D [10683 0 R /XYZ 90 572.1065 null]
+>> endobj
+10701 0 obj <<
+/D [10683 0 R /XYZ 90 536.4337 null]
+>> endobj
+10703 0 obj <<
+/D [10683 0 R /XYZ 90 500.7608 null]
+>> endobj
+10707 0 obj <<
+/D [10683 0 R /XYZ 90 454.129 null]
+>> endobj
+10711 0 obj <<
+/D [10683 0 R /XYZ 90 418.4562 null]
+>> endobj
+10713 0 obj <<
+/D [10683 0 R /XYZ 90 346.2881 null]
+>> endobj
+10717 0 obj <<
+/D [10683 0 R /XYZ 90 312.6376 null]
+>> endobj
+10720 0 obj <<
+/D [10683 0 R /XYZ 90 276.9648 null]
+>> endobj
+10727 0 obj <<
+/D [10683 0 R /XYZ 90 172.7423 null]
+>> endobj
+10730 0 obj <<
+/D [10683 0 R /XYZ 90 137.0695 null]
+>> endobj
+10682 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F101 2079 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10737 0 obj <<
+/Length 2893      
+/Filter /FlateDecode
+>>
+stream
+x��[�s�������r�:���6�q�:Ӵi\G��d8��h�
+ Z��= w����d<����o��yw$3
����3%2�����
+Ϟ��wW�����n|{wu�V��AFR9�{�8H�%tv��eN�|qM0��w
��I�I���w��*O�����$���[��4/�r����7o	i�'�!&�<���k��e�7oF�$�g�(�����X\S��w
C��f�Nʴ~�>}L���t� ���|Ω�L��v�M�XV0I��~���7<[����ˆ-f��F�:�\q��뫟�����_T/�-� ��
a)X�ݻ
+��L�t�T|��O�1-0F
c>�-�J��
�Ję�G>ï���,��-
+ �=UL.��`)�rKPr�>�Z���v�cn.���]��)��^�V��a����k�ʟ��-�=}D�!_+����C�}
�$��)�1�����	>b�8��N|-�@\�#z��
��Z����3Ofѿ�l�{��+��z�5a�A���t�=:i�H��v�W�H�w
+4tE���3�8�F��ח9u	EF���6y�:I�ǓE���0=�.z:r;��<��6+�<)w���(ETP݃4��>nȷ���I8�#�)�XH+�)�qu.�Ĕ�\ݑU��Μ�>�Շ�C�����:]1����/mH�y�q����[����a��s&��~I?�E��蘟;������<,��y[?�E9�^\#*����vG�8����0(h
+��7f-�cs�.���R�+
�yG�G|���ٞ/���ڜ�r��h�e
	��T��C��O
�Z�(8Ҋ	N��
�
�6A �<Y4Ȃ�A�났#�~�[�B
"�����1�AV,w�ʳ��F�<]

`M�4r�k��*�$D0�E��?���I���Z��<��#���B|����vK�pբg0�0!�F��iM�a
+��`��(k�k�]��]�4�i�1i�Ρ��4���1¡�*�p��"�c�K�ijݕ��e�m����&��m���-��5�T�/XJ�i�nJCA�P�c��.�A�>�[B?V�}�9m��o�#�\-���z����C$L�B˰�("Xa(��u
�|�����x�/GU�O8�‰��-��vT��{[;�0�|�Լ
+�Wcq(0 at P��C����s�^��}�1	顬nvnH��Q`1!uãc���5�SM��O�kNx�2XQ�hi?�!�b8��
g����"�uڶP���
+B��+䩶fR���I���z��\n)w#:�"a�O�Q�<��j��q���/�a��Ƀ��K�t�v�`��o���a�� Ư�w��j2#r	=(���
z��p�ɢ9�Ͱ/�&�A��[.'��9�����p���4��"n��#��Hp�BG�A��VK(���]Y�6�+��<-���m�Һ����?�0�8�*�ǵ�� d��
�0$ẕ���M���V�`�LhD̤�<}
րohi�
BH�$�*"��8&�oL�
X���5��Z���P
�- 5�B҈
UL�"\Wwe���
�_�#J�U[<BؑU3�je;Qb|�^����"
0W�w�ը
R]��q�)�
+�j��@�*t�:橢8l���C�
#�
+1p^7,4��[t�=�:����^Q��!��ܢ�h�I^fU���~�ُ��Sr]��&SM�1
+���*8��A-���ޓ��X�a������-7��we���GP
�^�
+Q]��a;y�Bf��x�LSE(�����-�8'�yr�'k�V+��A1C䥇��v�x�L~N
+��B)Hz7��$%���ڻ
�OA�́��ƾN/�
�D�>7��NB��C�
�
���u�
�=�,�{�
�gL�BF��sOGn�N�ec��$iε

�
)$Z���[��d�,��6�_�?���d���#��B��P4�+
�A{�l�a'����eM&x�>9i��9�QY�$˟�"]&���e�x
�gw�
P�������((�.Db�Aq̋}�0�O��'�`�s���w
hT�WO�����z�pD���;ޑ���B
+��&���(�7K����g
ܴX��ECU��
+V�b@���O˗�Mj=����~���_Aӭ��-�u�J
+F�%4^�np�I��v��
+�z^���
�a��hC�+�Ӆ�A
��q�g�x���1
�
c1u>��,���f�C9zG�j
+��ŭM(n�,Z�B?{�(���u�M]�!0�b
u2��� �q��E1
E��:�)��¶>c��Aiz�#i*҆�ZaOf�߹���
jv��v��z�{���mwW�xdD�U�~��B�
Nk�<Y��[
�]D������pW�	����A0��;Q^�@�1���Z�d��
בY�
�yH���,A��OcG����._n�����3J4��:o�-KD
��
����
��K=���
1n��s��s����+�:�n"���t�i]yt��Xha��[6�m�@�{�h�%
�L��dב��&�7#
�9U���
�(����p�E��
ܜ���/�'���zP��e��L�p���QŤC�ƌ�����
C�oǡ���#0�|�����
�j(�s�{�풗ƒ,���*p'�A���lpO1��o��L@/g�2��T���ipy��_Bs�Mn�^[8��y��'�\����ݫOS{��́�ˤ��
��c��&z�!0���9W
�:�#
�B��g����
��NAtvrj.���ٛ@�U�\�M�S�w�gT���o��?~.���n��!���%6k��!y�u T��S��ӣ${�y�+��|A<��J�����O�heV��u덺�R-�|���r{s����

+t�f�
e��~��
c
��b]\��bG4��1?��nf�
y�sMZ����dt���k�� _�q�endstream
+endobj
+10736 0 obj <<
+/Type /Page
+/Contents 10737 0 R
+/Resources 10735 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10680 0 R
+/Annots [ 10740 0 R 10742 0 R 10744 0 R 10747 0 R 10749 0 R 10750 0 R 10751 0 R 10752 0 R 10753 0 R 10754 0 R 10755 0 R 10756 0 R 10759 0 R 10760 0 R 10762 0 R 10764 0 R 10765 0 R 10766 0 R 10767 0 R ]
+>> endobj
+10740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.7903 697.2473 245.9593 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >>
+>> endobj
+10742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.2565 658.393 295.1785 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5534b8f8fbd973bfb7051cf5fb31f19d) >>
+>> endobj
+10744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.2687 619.5387 347.2028 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5c3bee913efb87e4661df746e184e1e1) >>
+>> endobj
+10747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 538.7762 210.6071 549.6801]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_30e0b0c2c668e73566cb1720d72cdac2) >>
+>> endobj
+10749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 499.9219 168.5549 510.8258]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ee126cc2eef44ab1d2055d0d15bc3169) >>
+>> endobj
+10750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 450.1087 144.6745 461.0126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.1726 450.1087 332.4089 461.0126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_0a660ed1cfae2599d7f9236f2084d499) >>
+>> endobj
+10752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [387.1432 450.1087 417.9073 461.0126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.8883 450.1087 469.6524 461.0126]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >>
+>> endobj
+10754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 411.2544 321.1516 422.1583]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_86f44d9d38638be46ef23422783f847e) >>
+>> endobj
+10755 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 360.4449 226.6664 371.3489]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ba65a2c1a6d563f5058479bc07181b9a) >>
+>> endobj
+10756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.0036 360.4449 292.2696 371.3489]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10759 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 279.6824 154.0794 290.5863]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >>
+>> endobj
+10760 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.5776 279.6824 193.0828 290.5863]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5d2c2fc2c077e77db657af49d332c9b5) >>
+>> endobj
+10762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 242.8854 167.6386 251.732]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d34bafd07f582c558936f9ea8892abd6) >>
+>> endobj
+10764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 120.8318 180.5399 131.7357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_057c4f38d0e8b8a146af731dbd91864f) >>
+>> endobj
+10765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.877 120.8318 246.1431 131.7357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [315.548 120.8318 353.814 131.7357]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10767 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10738 0 obj <<
+/D [10736 0 R /XYZ 90 757.9346 null]
+>> endobj
+10739 0 obj <<
+/D [10736 0 R /XYZ 90 714.3182 null]
+>> endobj
+10741 0 obj <<
+/D [10736 0 R /XYZ 90 677.4863 null]
+>> endobj
+10743 0 obj <<
+/D [10736 0 R /XYZ 90 638.632 null]
+>> endobj
+10745 0 obj <<
+/D [10736 0 R /XYZ 90 557.75 null]
+>> endobj
+10746 0 obj <<
+/D [10736 0 R /XYZ 90 557.75 null]
+>> endobj
+10748 0 obj <<
+/D [10736 0 R /XYZ 90 519.0152 null]
+>> endobj
+10757 0 obj <<
+/D [10736 0 R /XYZ 90 298.6562 null]
+>> endobj
+10758 0 obj <<
+/D [10736 0 R /XYZ 90 298.6562 null]
+>> endobj
+10761 0 obj <<
+/D [10736 0 R /XYZ 90 259.9214 null]
+>> endobj
+10763 0 obj <<
+/D [10736 0 R /XYZ 90 179.0394 null]
+>> endobj
+10735 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F37 1999 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10774 0 obj <<
+/Length 2792      
+/Filter /FlateDecode
+>>
+stream
+x��Z�s���_����$<����&�;���V��$O2j` в���޽/�@@�r;��
�������v� 2��Gf)�)�Pʸ���xv�� ~z	�˘������R�R�J*g7w��$HPBg7��� �K�1��Y<��mv�fA�*
?�M���9_�Y�xu�
Ճ��.~����5!�2�$S��a�ґ�T Q�rOq=�$E2�X��d�C�5�bI��,R:��]��ڍ��w�^�d��5
)A��Se�^��3���`���z��/x�
�x�K1{��H�����S^��w���	�`�Afz�8J$�|҃�!,�<(ho�q��YGfl�Rq�'�al3
H�F�B,)L�\�Q����m�����i�TAh%�	=�����ǝ.��w��C� Ÿ��E�6��d*aW�B�_UU1�
���Pƒ�����=���J�~/�΀�Ѡ��:k����z(�����
�>
+TS�U
+&b}����l�c�"I(z�	���F�7Ղ�5zjp�.�itTC�=�r�G�sq����q�;jm��K�5wG?a�!�)�3�� r��
Մ��ܞipy��!���"�� �dlsDB���3z�(G� �2ba7��,]$���a�&� ��[����9KE�
�asm�����	Ъ$N=Q~��)+7�*�G�SC\��J�W
ᯐ�$�ϰ
2!��G�8ɤ^05��]V�{п��OY��=�D����Â{E)�J������#�L�1��tL�H"���-$Ҧ�\]UM[�l븿�3��5�WB���j�_�
�2�1�8��@	cP���/_�3�
)z�uՄz|$(����ɼ#6kN�	JQ�lv��N���N��ꨆ���1��a^>�&�@\>/M
X�J�ʨ�Ӿ��=V� ^1��L�?
��|�w!�Bs�LCf ��̈�)�
�;����d~�-s��?$�� Hv^�a��'��
_
����
�´��H�c/�)�pĩJh_���\s�08s��~J�_
r�t�{��;�S��Cm{�<
�P�>��@@�buS�'0ba:��C��
+v�
:�	
�>�C�(=킎j�CnO�`�RHS�wǙ|�lt�i�A�>'
�<N䣎�h�n��yV���c�
��8Q�lI�<889��!˓$���L&A	V�����5�`��dw͉����m��7U׺Y���ͫҨ
r� ��d���V`I,O�u*�x�Ne�~|B���o>ׇ��/ry�0�1��GG
�0���;Z7�av1


+�z��.����*k��f�'�4�p�j��%
+n%�s�܋˭����ɼ�3,�@����Ͻ.u��
Mᠷ��fA
e�ٹ�;�Qa��
+�Ȯz0�
�w.��g����8��.^Ǎ~�1-]�y�~��!�� B
+
��f�0��/�C��|��}�U���\Z?@-D��zp�1dPs]�jg��<�
�j��Tn
N��y�#��u�o�1>���
���c^޻��n
23��l
�%[~x���Ƴ�1/�����庵��Œ�5�

p�r� V��
=�2^0�
��
�0�6=��.
+TS�܌|�#SVʽ��15�)��=��ʜ�O�Cb����
f�ݑ�
+�]��>q����
+�,��e����3������>dnڱwCy��t@'��.��t��c�d� �#��F�#���hq��rS� �7ǔ��k�d�Zoܩ��ø�L�`�$>��!ޭ�����h)����#wŗm���q�����$���J��U������"���f����V^a�^���C��`
cA��o3`U����
ݒ}��l\��&�E����>
����;V
�0��_��6V1�o��
m+�������J?e# ~�U�Gb4 J�=yn�����2O���s�67�����Mn�M��M�@�4�
�v׳��C���������A�;7љ;��^{�t^��±�N����ͻ���ɼ�ں��4
��t��B�m�Jr��
���C�
��򂄪��?]>��̰�u�/|A���ca_��u�>sd�MV��+�߆���G�N�	�_�[ۃ�
��W�����ք�X݌�A�T)�T����
��2����� ��2�v�y|��yG�+��u��ټ^�
+��".�pW*�:�h؄�m�_5��ޘc�r!����
�ngn^̓�yu"���ve��;Tm����
�a��4vuu8f*w?�
�J��aaD:�fPx+�K�5��|��/���Ҙ�W
�Y�m�(�ُ��`֓`�/����W}���{�xk�ۼ0Ȁ�a:>#V��z"
!��,���1�@�~���_�~!��8��7����6훂&��~[���-$Ꜯ��v��#Gg���2W�=yv����R�wvb���1ץ��udf�[
��������C[�Yq����v���&DN|
+F4���
�l�}W��cY�?|�<2���=M�W�2�`��>�u
���z���q@'�amf��'�t��o����X�盘��o:��_O�)mn�j�%
0�� =����e���JBkO���|�Q�d3p󮟖Ɲ5棎!%��3
Q�rL 8fU�m�������3�cn� ���6
;"R�g����� ER���ɒp����{w��_�
�{��`��o���b�-��p2Q�nTŻZS�J�%�z�փoʉ27��o%7�q��}^
�ъ‡-���h�������Z7h_����nW\.�0F)U���
�@���9�H*��tqͱk���Є���#đ ���Z�Rendstream
+endobj
+10773 0 obj <<
+/Type /Page
+/Contents 10774 0 R
+/Resources 10772 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10680 0 R
+/Annots [ 10776 0 R 10777 0 R 10778 0 R 10779 0 R 10780 0 R 10781 0 R 10782 0 R 10783 0 R 10786 0 R 10787 0 R 10788 0 R 10789 0 R ]
+>> endobj
+10776 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 707.9571 178.2386 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_2a7c225e4f50e2287216dcd77eaf27d5) >>
+>> endobj
+10777 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.5757 707.9571 243.8418 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10778 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [313.2467 707.9571 351.5127 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10779 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 657.2171 226.0342 668.121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_8691a3facce4d6f973b48743fa42ec42) >>
+>> endobj
+10780 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 657.2171 359.442 668.121]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10781 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1666 606.4771 156.5325 617.3811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_a55b32c299b7d7bec303f636b66ef624) >>
+>> endobj
+10782 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.5995 606.4771 309.9479 617.3811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10783 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [356.8991 606.4771 506.2475 617.3811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10786 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [435.1848 470.1679 513.9963 481.0718]
+/Subtype /Link
+/A << /S /GoTo /D (main_powerset) >>
+>> endobj
+10787 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 460.27 125.865 469.1166]
+/Subtype /Link
+/A << /S /GoTo /D (main_powerset) >>
+>> endobj
+10788 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.0801 440.5883 366.3461 451.4923]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10789 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10775 0 obj <<
+/D [10773 0 R /XYZ 90 757.9346 null]
+>> endobj
+10784 0 obj <<
+/D [10773 0 R /XYZ 90 557.2679 null]
+>> endobj
+10785 0 obj <<
+/D [10773 0 R /XYZ 90 506.5473 null]
+>> endobj
+10772 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F52 345 0 R /F37 1999 0 R /F74 482 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10795 0 obj <<
+/Length 2076      
+/Filter /FlateDecode
+>>
+stream
+x��Y[o��~ׯP_Z	�s���	��M��A��.��Y�8��P�BR�տ��ŤD��n�Ca�␇gΜ��I���<�s%J���f��p���x�
	���]}/�<E��r~{�s�	J��6� q�L�x�zI�"k6���%ŋ��?�����^����__�ۖ��4���o�����2�$S �e�ʑ�D Q�rOq3�$ERG߼��eֶ˄
+��]�ta6�2댻��ܛfI��Tk���
N�e:��mT�׬`�X��>{�
�s��3�X���	�4��͌S������{п0� �&l�0����TG�Z L�L)CX
+����#���F��l
ɬVVu].	��澨�Δ�;SuYQ��b��u�v�����w���tO{�
:�|B�^	�D�lv�7��5U�Rr8%�$�@u��L�N��@T�/F�{4� I�
<�������_1��t�?�0DP$p4���(���'@�DPy�t�XO��>+۩�1 %���m2����:��h&�
'�D!L)�@V!��[�
d�W�E�H����E���6޻z���i�X���Lq��'�����~�z]���`�U�ˬ����fѡ;ϑ��R_�fC�3n��	>�E�\f�ݚ�nU��R�P�u�
}�۞����"U{-޸��r��`^wV�1�	^�
�K�D<��.t
+,��L\̀�
0�l
�Ƙ��HeE�
�FB`��0��B���2��g`�d�4��OV�|�a�kN^H1`��
B��m ��T�E��H
:������jN�M��@��M��z#�X#ɠvH �K�]��
���˲^R�x*�$ YW7�(uu��nT2���)��ͮ=
+�}�5�I��"[m]fZC�3�����O��5��˯��kL��n�~5�������W�E;�tE��c��ʀ�1��_]�[���[Sf��V88r�_{:g�2��g�s`x�!_}"�~<��'E�/��+[E���x�,�.���f:v	�Jui��5�Z���z��/+c���R�E{x�bZ�ːR��>�
������B�� ���$��qBx?�]&�)Wϭ>�����lV�*�]*��o
4��y��mb,�I
1��!/D<��@��y
����((�tPJrT��
���� ��`�D�C��`��Oe�N�.�DXv��S�A#���%�C�-�T
r~�2�tJlh�X���o^����[J�\e�_R���m��3���隆]BVgJ�
�o�-n]-�0����5S�]8��6H7ʶƽ�<�ڵۓ
�(�fMW�weָ���"����e�o�b�d)�ݪ�0���Ri]8�U�v*�/�W_W��[��b﷯�"��5͎,V��7��
pi��$�m���7.�d����K���zڵ����=U��ѵ-?(��,t��w��b�-p8MӋ%
�����\DI^���'��g��d`.�~J
P�M�8
�Bc���L߸��.���a���8�Y�%S
��I���7����zU�E��=��Q���'/��u׎EvXQ1^�E�ď�������T�<��5�x<xȵ7�a�;��H
�qP�E����J���}��
'x�����ގ��b��}���
ml�W�*�B
���{�{���:��	��^y��F���i���n�sYY��uaW�C�g4�Ҙ̀Q>�$lL�X��҉�8����Kq���<Їzz"�Za�����ڨK[1��
+籅B�GFR
ZF :�ml��/�G���vl�	"䅚���5s��H3�H5�Nu�=��E�v�����nJ�B����t�J���x�H�
Ɏy��J�GEO�Ei��(�0owM��ĉSc�[<��|LJ�_6�'<,�CL���1�|�)�M~�� ;�B~�w��S��H��
�"��d��
B��W��	l��ː*���D��'�;�
r럳*�c�u���Ɓ
������}4H�Է�
ᯡ�GZrO�����^Ho�~>�_{�Ǯ�^_]===�u�vU�mP�]m��ա\
C�O;�^��d��c���z$KLʛ��#+���&�H�IQ�6~z�endstream
+endobj
+10794 0 obj <<
+/Type /Page
+/Contents 10795 0 R
+/Resources 10793 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10680 0 R
+/Annots [ 10800 0 R 10801 0 R 10802 0 R 10803 0 R 10804 0 R ]
+>> endobj
+10800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.2547 169.1685 379.5207 180.0724]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >>
+>> endobj
+10801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.6031 139.589 349.8783 150.4929]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_386fa9c84bc37468f1a3a2b860a0bc3d) >>
+>> endobj
+10802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.5193 139.589 513.9963 150.4929]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) >>
+>> endobj
+10803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [89.0037 127.6338 216.5255 138.5377]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) >>
+>> endobj
+10804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10796 0 obj <<
+/D [10794 0 R /XYZ 90 757.9346 null]
+>> endobj
+10797 0 obj <<
+/D [10794 0 R /XYZ 90 333.0715 null]
+>> endobj
+10640 0 obj <<
+/D [10794 0 R /XYZ 90 308.8568 null]
+>> endobj
+10798 0 obj <<
+/D [10794 0 R /XYZ 90 308.8568 null]
+>> endobj
+10641 0 obj <<
+/D [10794 0 R /XYZ 111.0807 234.0958 null]
+>> endobj
+10799 0 obj <<
+/D [10794 0 R /XYZ 90 219.4259 null]
+>> endobj
+10793 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F67 370 0 R /F52 345 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10807 0 obj <<
+/Length 2801      
+/Filter /FlateDecode
+>>
+stream
+x��Z[�۸~�_��b�AQ��l�n�ش;}��l�c����8��{(J�d�O2�M#����|�B��dd�H	�
�r�����
��4�S��v|ws�N��AFR9�_�$A�:�_~�8�L	�x�~B�8)������q�y\�e����΋�x����n����&��}GH�>1
1������/�@0���f����$��$�?o���L������c��m����ڕ-&D�m��!%(sj
ћ����
+&�ܯ7>��$��
F�h1:�
F�:��p�ڗ���7�t�D����a�h�2��`G
!���G���yꣽ�g�*�3��6_�6��z�;N)���%�HC�j�t� 
�
#JTHqݪ�z��,قx%�Q�
+���zH�
(�V�������S|���Őa�,�ÄD3:p��\���}Hf�Z
S��e3��*���q.���`����yV6Ǒ��F����i�I3��/�Dž�v�($)�F���w�2L��ȷ�I����C��u���
�+?�L�;�k~�f~7�!�ftk8�`�"�s�����N���iK(�l��
�z���t�|N�I3c7�Y�˼]�T16��/�g���q���pD)9�9�;[&Y�ZG������jJ�
om�Η�ٌ۱�]l a���l9�N�eF���Ź]$�Ҿ��}�
+�|��o

��~���a�a"��ԝ���j���X'ك�����C��������6"��r��HȃU��v��s-r�����Ȑ!�Ş7~˴jbJi���tѼ
Rg��i�x,8E}�%� �TiD��`
+���b��X�e
�YI�9�
5�X
_
+��:R��
P,��P��w;[
��"�O�r��W� �H�#{?�_�9 �!��O���F�W(
�c�G����=qν��vM�!`���~��S-��s�<�Ā���Ɨ;�D
����Vz�N�h����/�H
��t@�����(���G�)�.��>�

��o�K U��66i���!� z�t�
IG>%
ٕ�)�R
+C�%
+��Ua�_�]�$��=��'�R�+VO at n���bƮO~��!�,]��g��z%�X���e� ��y)��)a���[!�W��H��k�ш�9t�4@[틬�1�����*��b�ɺ���D��b^�9n��h�]4�:�%h��3��&����?/�Υ������\
ʙ��gL���\�8����8R�3�jywE$��O�&(
��S`�5N%V�3ӗ>c��c�~]��94yC�7��$6�H�P�fkjPzƗ)���N�l�owPC�76
"	��bgD"�굛�I�ţ�+�`Ba�_�`�->\ȉ
+9�d�d�-ʑ�F_���I��Q/E�&4R�]�Q����w�15
n�R��X

+�x��q�d��ey6��U�ogm{h��
�ҵ]��
�,t�|Mϩ�x���0
��TB��2Q;^��z
�pNp�Tm'��4-B�M��
����6 �����o�8Q�?B}A���E�xW�]Tv�
�=B�IZ�\�� _�	\/F� �5�Rt,{9ơ���H�����5i�S��~�f1��ސ��AC�6b�r��`rd�۷n��~�O�hV�
�E��K�*umI�o�5
�	�T_E]�Z{�3���&N��Ѥ9�n�?	����a`�?
�������\�_
�j�WA�����'`[��)[S���]^�u���mu�6�
zJ4����KWiq��i�QUu���-�1��4f�>3����(ȷ���s:���@������,�ļY�M�֏\�[5
�ŀ�i��*0v�G�<fH�:��Z缗W �.�
�xg"\].oa���rmf@�ђ����]c�����p)���M�~��
�`�")S�Zf;
)P�*o�S��`��g눽h� [...]
��^���[�'�zA�&��O�^���ꮰ)U�4�Rk�1 9F^��
g(��8��zN#���6
�h�T!�6b�ѻ��!�n#𱯱+��|�x*wQP#b}����QX~7�0,�XȰ��&����a�[[�k�|�[=ЗQ��nڣ�'~��l��Mw��/���WȐ@���8AR��+?���l���̄���T7�	:^2���j��=^����
P|���b3���/0
�����cq�
�H���-COӯ1T!��������<FT�*���]�����d��<�{O�
@'@�d�#(��l�\y=�}t��j�!�|���� nZC
+���>e}�ZYoo%����]+�.��׊��j0'ƿ���e����L/
�4k��ť���֭�[����NM�r��WL؀{�o���_�9D�E_�t���xY�������u{W����������U2qe{]i��+B���Fk2�)
r�`$y�y�X�͜�X��T�u^�FCDI�_]�;ώ�>�ȋ��5�ne1��=���A�I���\��G[�lj�wJ��AB��W��!Rȯ����XB�K
�޼H�d�͇�-���;�]tm^��_�0�_����'r-��c��ͱ��B(�P� ��Z�
�"�~��T>��E=)����ڧ�
~0���߿�Α�躃��jww{{8
ТD�,�(�n��nO��`؆*6��iXt�KO���' ���*o�e�y�
i��$��]~��Z���0~�+endstream
+endobj
+10806 0 obj <<
+/Type /Page
+/Contents 10807 0 R
+/Resources 10805 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10680 0 R
+/Annots [ 10816 0 R ]
+>> endobj
+10816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10808 0 obj <<
+/D [10806 0 R /XYZ 90 757.9346 null]
+>> endobj
+10809 0 obj <<
+/D [10806 0 R /XYZ 90 733.028 null]
+>> endobj
+10681 0 obj <<
+/D [10806 0 R /XYZ 90 716.2211 null]
+>> endobj
+10810 0 obj <<
+/D [10806 0 R /XYZ 90 716.2211 null]
+>> endobj
+10733 0 obj <<
+/D [10806 0 R /XYZ 305.4399 627.602 null]
+>> endobj
+10811 0 obj <<
+/D [10806 0 R /XYZ 90 610.8749 null]
+>> endobj
+10734 0 obj <<
+/D [10806 0 R /XYZ 321.0917 548.2034 null]
+>> endobj
+10812 0 obj <<
+/D [10806 0 R /XYZ 90 531.4763 null]
+>> endobj
+10768 0 obj <<
+/D [10806 0 R /XYZ 90 428.7054 null]
+>> endobj
+10813 0 obj <<
+/D [10806 0 R /XYZ 90 414.1351 null]
+>> endobj
+10769 0 obj <<
+/D [10806 0 R /XYZ 360.9313 303.643 null]
+>> endobj
+10814 0 obj <<
+/D [10806 0 R /XYZ 90 286.9159 null]
+>> endobj
+10770 0 obj <<
+/D [10806 0 R /XYZ 140.1315 212.2893 null]
+>> endobj
+10815 0 obj <<
+/D [10806 0 R /XYZ 90 197.6194 null]
+>> endobj
+10805 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F67 370 0 R /F52 345 0 R /F25 348 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10819 0 obj <<
+/Length 1787      
+/Filter /FlateDecode
+>>
+stream
+x��Y[o�6~���0�����R��eX�bY�=�E�HL,T�\I����
��,ٲ��
��@*J���}���1�#c��P�g\�������O#R���Y[����ɹc�����]�A$(����݄��tF0Ɠ�)�� _7S�'Y�8�Q
����A�xzz���0�7?��U9�Q�'We�
+��K}��)�&:
5�$
<s���ߌ~�nܬ�L��ѻx
A4oF1��5
0"�ONj��
�����F��PM�K� �lP����G���y
�4*lp���E����4,�,���,\-tZ�+�
�Q��I[?"��R/�F��=9'���|f�1_Z���
+)�Z�|\�4X@�)Gz
+�|Re��QH0�
;��Y�Xm�R�A��^��{,p��Ei��YL�u^��6a
+ڌ�h�qZK��#�qz��/�����Ǭ���G�$'��tƥ7��Xx���E��8��j
 B�t(f�|>
��|W��ޘIN��2
-y�8-�r
�V�k����y�B�r��K]����̘��k�|�{tR�6���,���,M
�|�5 8�H�n�;�=evFmO�yJ�n���z�?��)��'H�
POf�W4��(P
W
���I��
���0�(U�K����W��M�;�.���
0.�B*r�q :��p/]�]���Џ�
�s�E��O��H��	y�='o`�o���Z�}��t�,���4+J�o
V�
�i���"0�
s���^��

��T���.
��m�]�hg`_��O����L*��#�f�j6$}ATئ��
p�a<����9�?�AD�<�п�@;��mU6�����A ��>���x���
�P	Rp�%
Lkdqd5�`i�L�
<�
�\p�C�	1�����b�J

SoSQD=q�*jN  [...]
깯�v;e�N�u]��Un�Ӌ��E_�i���>f��H� ���ݵu;Y
=p
��2��
+qB�[��&��%ϙ.�8qmz��0���h_n��l�aa|=��h �u�a�L�̾����bn_�󬀽��g�3�)a��{PZ��DLL�ݧ�!
+����ɫ\׳��F4έHP��}��KL�I
Vu5s\`-�/��
x�:
�Ҵ��T�[����L�)Z���
C���O�^�i

0L#v�a-n�]�0
���a�
s���ͥ�V�(���P����˝U�%C�b�U�����brF�r�`�ݝ�^}?�(����Ik�	�c�$��\��SUk��q�<�	s�k3�u�R��3�ʇ8��VS�Mު�B֣�m�/�,j0e� N����!
+VOO�6���$m<o��V��
���>�3$<[����s�\sȪ��7�}�鲍`���9��k=�x陬���8��=xƼk�
q܆v�
+�GB�ޟt�D�H!��W����C����D�����
+9':�Ʌ���z�x�k�?
+�c��56��*H�!�Q���*^�*��
y��v~(����N��׏c���&�f¬5���Z!��5���ryzr�^�QX�U/s�'�Փm���
+M��P�f�Ў/��s
�h���/
q-2wW��rQ-�h���_�+�b
Rendstream
+endobj
+10818 0 obj <<
+/Type /Page
+/Contents 10819 0 R
+/Resources 10817 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10831 0 R
+/Annots [ 10829 0 R 10830 0 R ]
+>> endobj
+10829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 87.3448 188.4102 97.8752]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction_a4959b6198e090d37abbd07085b74a30) >>
+>> endobj
+10830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10820 0 obj <<
+/D [10818 0 R /XYZ 90 757.9346 null]
+>> endobj
+10821 0 obj <<
+/D [10818 0 R /XYZ 90 733.028 null]
+>> endobj
+10771 0 obj <<
+/D [10818 0 R /XYZ 90 716.2211 null]
+>> endobj
+10822 0 obj <<
+/D [10818 0 R /XYZ 90 716.2211 null]
+>> endobj
+10790 0 obj <<
+/D [10818 0 R /XYZ 90 666.9799 null]
+>> endobj
+10823 0 obj <<
+/D [10818 0 R /XYZ 90 652.4096 null]
+>> endobj
+10791 0 obj <<
+/D [10818 0 R /XYZ 90 605.2057 null]
+>> endobj
+10824 0 obj <<
+/D [10818 0 R /XYZ 90 590.6354 null]
+>> endobj
+10792 0 obj <<
+/D [10818 0 R /XYZ 90 543.4314 null]
+>> endobj
+10825 0 obj <<
+/D [10818 0 R /XYZ 90 528.8611 null]
+>> endobj
+1542 0 obj <<
+/D [10818 0 R /XYZ 90 430.4683 null]
+>> endobj
+314 0 obj <<
+/D [10818 0 R /XYZ 90 423.8681 null]
+>> endobj
+10826 0 obj <<
+/D [10818 0 R /XYZ 90 348.3301 null]
+>> endobj
+1543 0 obj <<
+/D [10818 0 R /XYZ 90 224.9654 null]
+>> endobj
+318 0 obj <<
+/D [10818 0 R /XYZ 90 218.3652 null]
+>> endobj
+10827 0 obj <<
+/D [10818 0 R /XYZ 90 105.9451 null]
+>> endobj
+10828 0 obj <<
+/D [10818 0 R /XYZ 90 105.9451 null]
+>> endobj
+10817 0 obj <<
+/Font << /F65 361 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R /F52 345 0 R /F23 2436 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10834 0 obj <<
+/Length 2099      
+/Filter /FlateDecode
+>>
+stream
+xڽY[o�~ϯP�k5�;��v������ۗ�A��t�V���
7���"���X�!�
�����&�?i
)��f\F��
�����n���������7�?Hi�%��zWk�	Jh��~Z��Z��x�$x�����aI��^�f[&�?�OeR��ݭ��ċ��]���,WT��_��tr����2&��[�c
�����Ǜ��O} �Ib�����g
m!�o0b:�n0"Z��p�)
7��Ǜ6z܋���|p,P��h�8�%|="D$�
r�G5���W�2���M^�bȫ�6��j����F�f���sV��l��T��MU@�Y�~RV�H)B
_�-
΂-��l�5"B4�����8�y�l(�P*��GT���n�� t�(�Hc);F_�>L���&_ǰ}S>{�m���Z�
Dz�B�
K���-Q�b5�� t�<�dR�Ҏ�'��~�%pW�4<� 06]2��b6
m��b�{`�"�5&,4�t�B
��b�W:�a��w�PR<�����xHN����UZ��r
+;�j>}�Ե$j��`�$BENJ�_*����=X��1�U��ê/C')p1V��ct��4��,Q�Hݛ*I3���`N�2=�Z��a\����
�YR����09 
�/�s
7��Q^�z=�<9��� 9�v���t�!Q-�W���%�Q�U0�q˩UxuE
��yJ)��|&ήu��$��1b̮%����x�
ɺ��:����ڬ��'
�7� h�$b�n�R�=�(� �ۃ����
�lW����a�{�-I���&f�r�]��1ٱ��c�#p��^�|������OaaO�*���^�+�1`�"���4fW���_�?��P����f1)��,{u�a�M>z�1�m�Uϵ>�RW
b�"+�u(dŰ�v�P�c��+Hy݂
{U�
����܄�y2���iz�8
����	��<ԟ��\��z���
��o��y����� :�)������>ӌ|=�(
�`E�?
�NFPl#�����K�Xб������r�,FJ�w*6�O��m!��2�[�8��C��A�鱗������h
ū7.5ͫ-t��S�U�1����)ےs�U�=x.p���脶Դ�-�RB
Ld:��<���S�g01�Ǡ�J�(,�ݸ>���9/�SO�УX\
M�T�4nMt�?�gs�۠�
�Af�ȝF���$���w9G��P�$ߎ%��s�z9��Nl7�iE~��]V�T�]L���fR��g���"��P	��B~y� [...]
a�P���M6Zbs�bo�7��Y�o	�[��H��W���	��UHĪ���ڄ��EG��nE�lr��a/�+�Co�vE�K*�@����Ȗ� �*�&��m��-#vu�?k����ݰ���=
3��7�_�&v5�r��#@���
s��=���S��O�1���wyx�ɷB�`g�
+� b�{[�ߥ�&;oǘ� �c�cPj��3��N�R���
+��'��������w>��*��1�l����N
RWu��[��
m�6����9�\������8z��b�,�_񧯵�%��z<
7��!!�|2�y�@����
+ε������QQ���{N�Z*f����r�Ţ����
��X��0[��m̱�x�1�<##�Ai��|>=!�*umD���i)��y�͔��1集�Ǻozz2��Љ���@������
*��.
�b_š3�� u-[�$��;:@L��l�]�m
ssĬ_�^*�h��
O�aŰG��;�A
+��@�	aH(�B��wD���T7��V���QJ
��`�K�I�!�m�[O9܍e	�,�Xx��9ɛ\ڢ�XU�CiP\���Pe����AW~4#G��bi
�����7
+W�h�-�V�/�fJ�B
赁��xw{{�\���yz,QZ������1�P����'Z/4�~n��;�4\�P��
i5� �����7�endstream
+endobj
+10833 0 obj <<
+/Type /Page
+/Contents 10834 0 R
+/Resources 10832 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10831 0 R
+/Annots [ 10836 0 R 10838 0 R 10841 0 R 10847 0 R 10849 0 R 10850 0 R ]
+>> endobj
+10836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 696.0019 197.875 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction_8041e8b3420a554e9637e4dfcf43c2b1) >>
+>> endobj
+10838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 683.4241 196.159 693.9544]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction_a3b0210cf6bc4dc319d24d429518c61d) >>
+>> endobj
+10841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.9109 546.6752 391.332 557.5791]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >>
+>> endobj
+10847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.418 187.5025 204.5596 198.0328]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable_14c081beabe1e165b1dc44b2a84b6c2b) >>
+>> endobj
+10849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.413 148.6482 194.9635 159.1785]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable_5024cc2b142473f5f733a8808cb09162) >>
+>> endobj
+10850 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10835 0 obj <<
+/D [10833 0 R /XYZ 90 757.9346 null]
+>> endobj
+10837 0 obj <<
+/D [10833 0 R /XYZ 90 699.987 null]
+>> endobj
+10839 0 obj <<
+/D [10833 0 R /XYZ 90 645.7304 null]
+>> endobj
+10840 0 obj <<
+/D [10833 0 R /XYZ 90 584.6875 null]
+>> endobj
+10842 0 obj <<
+/D [10833 0 R /XYZ 90 521.146 null]
+>> endobj
+10843 0 obj <<
+/D [10833 0 R /XYZ 90 498.8342 null]
+>> endobj
+10844 0 obj <<
+/D [10833 0 R /XYZ 90 498.8342 null]
+>> endobj
+1544 0 obj <<
+/D [10833 0 R /XYZ 90 311.1754 null]
+>> endobj
+322 0 obj <<
+/D [10833 0 R /XYZ 90 304.5752 null]
+>> endobj
+10845 0 obj <<
+/D [10833 0 R /XYZ 90 206.1027 null]
+>> endobj
+10846 0 obj <<
+/D [10833 0 R /XYZ 90 206.1027 null]
+>> endobj
+10848 0 obj <<
+/D [10833 0 R /XYZ 90 167.3679 null]
+>> endobj
+10832 0 obj <<
+/Font << /F65 361 0 R /F74 482 0 R /F52 345 0 R /F25 348 0 R /F11 416 0 R /F97 1774 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10853 0 obj <<
+/Length 2202      
+/Filter /FlateDecode
+>>
+stream
+xڽZm������@��j._DJ\��W ����6_�`!��[5��H��m}�I���n�
8۫G3��̐��
+�?��x�I�Ur�«���^}y
׷C��wW��_I$���΂ �SBWw�ׄ� �l	�x}�!x
ׇ��vC��_
�}
߿�vu\������ Y���͖r��*�����!}H�
��i��U�]�n~����w��
g�(��^��3^�a,�\a�d�W��#"%]
��̏����[;��Pp�^
���X���h|��q���~t_�MRgU�����;N� �4@,��3�"��V���&��P���v{����ą�T������HyP6I�
����c֙�	�5m
'm�k7i�-1sA��cy���/gE��E��mj����cil
�����yV|ԐR}�u4	_?e{}C�T�,Ey��\۩�>�<{;"�$�}�z�����Ak��h��=I��B9�?�b��S��I�MJ�
�?�>q�5`�e��g#�����x �em�fz6�S�?w��?>��rd�.�q>�y�϶�/^��1�ӛ�ʑ$atV�C@���$X��E�Ɏ�O��/��.�c�G���%�X��ߪ���c/ �b�
T�~:���D��N^�]gdd�������I�Ɏ�����c��T�SV$�q��2 at r�BQ�C��`+DaE0����(�k��l�O��
Q@(��S(�P%��Y�,db ɐ���!�����D��S&z��L
��z�:��$4&M<�K�G��0�`�>3�]��C��D(�0U���0yjx�V
"��	���|Ǫ{n��rv�
�����N%�+
Sܿ�
+[Y�z��u�Ϡ����V��v��e��PSw�>�-���I��A�Ԁ-�*��K��
+z��6��[��]�%=����δ�w�"QMbQ.01�9�r���F��r�
$H�!�Kf#5���6�[|�
�LBgH,��c�%e��`�gN��J,��������Īro��}�R�FO��s��s��vO)�� K���
�O�	�I	��\���	Gu0��8
�|?]�>�ZsR�}�h��؟��tM�U\�i��ur��,�L/�
+h��
�d;�
U������{�����EL�� 2CB�t��l1`!G4¡�X��


^\<�
n��-
+X"�C7O������9yy܈g��q�醬��ܶ��*	\�ӹ����V��fg�O�.���"	l�4l`�⇴=��T�'�-����V�e���E3���@�C���.�M~/)B��|R40�/�������k����v)�yZ)yv���Ӟk�Ha�Pi� ��(ʡ7��;��7蒪�)�h�=��ҥ��ץw�:ݥ�_a7���j����U�`
�zl�
�;
��Y�ωd�>K`mG�WH���)�yyH�G���������3��Cz(��&�_�,o�`��i'���T2D	�^�7b�m��5߬�߽��s�(�:�n-�C�����&�z�ӈ"A����C�[�y�6�j��Y�>(U�\Vt}1I�Uf���eI�T	! !�Qҧ!QU�~N�s�f�sR
�K`�r��Y�ٽ^��o�������i���Ԧu� 
S�#*������p �g|2�o� Ca��E``�U
�|��?�E�N�?����W}G<������s��H	�q����?0�8�����
�ݕe>?��
M�:N�5��`fW1�׷�3<	��=n��y�
+d8��T	��D�T9��R��uG��i����h�e�c��6��#J��-��?��R�۬Q�����0T5���(�n+������y�14��ǯ�ȯjr���<{SO�oD�h(��y����̮�T
����?��'�\�drwh,�Ãr���N��Ӵ����i�4֏��h���QL��F��=
�v��X��"r�Ȣ|"��hpE�'�A9B�	B/�(C��ba�[�0X����>����!��2)Je�	���.��0D�..z[�UA-��h��B�n\	�
���j�����������͟��
��~G�aR��קc���:���
��2X}��K�R(����_�ee�};ޟv7lw�����gv��۶���~~~FI��EV�(k��*���
+0�j�1��[Ќ�(�,�E
�!��
�#m_�?
�Wcf��޹Z���~�endstream
+endobj
+10852 0 obj <<
+/Type /Page
+/Contents 10853 0 R
+/Resources 10851 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10831 0 R
+/Annots [ 10857 0 R 10859 0 R 10860 0 R 10862 0 R 10863 0 R 10864 0 R 10865 0 R 10867 0 R 10868 0 R 10870 0 R 10871 0 R 10873 0 R 10875 0 R 10876 0 R 10877 0 R ]
+>> endobj
+10857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.5376 491.7444 177.0528 502.6483]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare) >>
+>> endobj
+10859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 410.9819 149.0979 421.8858]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_8dfe38ded52523b20209cce599411c4c) >>
+>> endobj
+10860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.9136 410.9819 218.5568 421.8858]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 372.1276 179.5535 383.0315]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 372.1276 189.795 383.0315]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_bb6a26c12f7bdee7504d577ca81992e0) >>
+>> endobj
+10864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 333.2733 179.5535 344.1772]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 333.2733 250.6661 344.1772]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_44e2225e59844067e005297572cd9ca5) >>
+>> endobj
+10867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 294.419 191.7178 305.3229]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 294.419 288.8524 305.3229]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_7102c6fe85d4c8e6939d29a047becbdb) >>
+>> endobj
+10870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 255.5647 191.7178 266.4687]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 255.5647 303.0791 266.4687]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_49b4a338d3d82bfb7a404ea87481fc4d) >>
+>> endobj
+10873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 217.084 150.493 227.6144]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_ed0f237309569c2bfbf9e6f60740974e) >>
+>> endobj
+10875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [166.2836 177.8561 254.0638 188.7601]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_0431b025f2e3c1b5d3cef06c4054f726) >>
+>> endobj
+10876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.2055 177.8561 384.3931 188.7601]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10877 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10854 0 obj <<
+/D [10852 0 R /XYZ 90 757.9346 null]
+>> endobj
+10855 0 obj <<
+/D [10852 0 R /XYZ 90 733.028 null]
+>> endobj
+1545 0 obj <<
+/D [10852 0 R /XYZ 90 615.7909 null]
+>> endobj
+326 0 obj <<
+/D [10852 0 R /XYZ 90 609.1907 null]
+>> endobj
+10856 0 obj <<
+/D [10852 0 R /XYZ 90 510.7182 null]
+>> endobj
+10858 0 obj <<
+/D [10852 0 R /XYZ 90 429.9557 null]
+>> endobj
+10861 0 obj <<
+/D [10852 0 R /XYZ 90 391.2209 null]
+>> endobj
+10866 0 obj <<
+/D [10852 0 R /XYZ 90 313.5123 null]
+>> endobj
+10869 0 obj <<
+/D [10852 0 R /XYZ 90 274.658 null]
+>> endobj
+10872 0 obj <<
+/D [10852 0 R /XYZ 90 235.8037 null]
+>> endobj
+10874 0 obj <<
+/D [10852 0 R /XYZ 90 196.9494 null]
+>> endobj
+10851 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R /F74 482 0 R /F101 2079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10882 0 obj <<
+/Length 2787      
+/Filter /FlateDecode
+>>
+stream
+xڵZ[s�~���S*�F0� 7�C���L��ۍ��$�%�f#�
+I����7
+������x�p�s(���G	^(�P¸\l�xq��vA|��ױ�_�..?H�HP"�\\�Z
� A	]\mY��^�	�x�qE�2�������r�|�m������J��o^%��f���T��]Z׮�)�ͪ�ˬ�@/��%gl�����]� �
��@�����b
s��#�h�x��H�����Snv?]����:�
c�����!,����I�|�f��x�
���
LͶ?
�M��E=6-�'��_�H��4�C�D�i~�c@�J��E0�E�䈭�ܸ��K�
�v���4�T%��MWu�e>���
��^�a�ﳢk_7χ���b���埲E<�
+��8)�HH�c38[��}�t]�Mv�"
�MbC��������(���-ٯX`�'���t!� g�tlh"�Q�;��V�
a�i�X�ť�B.��2��$ѧ�
�OYs�
+Oͽ�0Z�?�ݍ��k�LhoӁ%�F��lί��A>�j���"�������FL+5i�u+53>#I��.�M�p�[�@��]][�h���eaq	1!��4�#az��Z�Y��N��̸��:���?�p�o8�����<��9D�Q�\���pl�o}�m�A��6L+5�r��X�a�
��^/?�N�4�	Þ�E̜Pg0�&��
&��K$%�{
�D:��'�ٸ�5}�qp�v1�H�7^�Xg[/W�
�P�E�wC�׈b�{=OMA~fVC���D5
6e�u+5�1�43�(o��m��<!1����IH�"��\BՊ�R�p����m	)
7&��,0RI"z�e
��Ҥ����
�3s�5��)���kΧM�J��`D!�D�l�W
�*��tLM;��
J��P?zi{7ǪZ1USs�����H$�0�kf�-�����,�s�P�Y�
+�|\p}�[c�	om�f�urē�Ό��3n�l߾-��R��~5��$b
tua��
��
��^˶��JA�&���A}
�%��v�T ̠���W+5�R(ީ��˸����.���)
+
C_l�V~�P�|�PxIE�M�J�@
+"6����g	0+��K��<9�1�Y��A�ψn�
35��g�Z�y 	3|
�H�(�p� H(�u�6!���DC0��vc��l�@�i�p���o���G'>��k4�|�	�X��Rb�	�k�fyor��͌x�3�MY>�uo܉C/?�`�� �eu=,԰񣹙��qE����a�
�HK*^<� ?
��w����J�X H�0�
״
�a%����1$�������0�;k��b���Z�9 L��&: 
�H��"K"^C{��	�n�
�������p&�s�&�y�9�6�LY��z����|��1���nR��Q.g��`�������&�w���g������&���
���
��5�UCoO�=�B(1$�R�*L)_�����Zu���=
+d����Q��+�[�u�ˆ��λ	ш1ڇ�w� 5�B6�u@�
*��9Y16I�%Z��Igy�	9N|,6ݹWR���K�&��pj�'��nO���!�ag%B��ޚ�p��	�u��=�IkS��G7�r���YYmMF`
�Ί�c�c�ۺ���)������u��"K+����6�XA	��ߥ�{�������B�ۭj���~����L�Z�<�k�.EY�
;����t�Q�\��)Km7L�c`~�N+k��(r� ��ض�"~���MY����ض��
C�Ov������E3���i�UtoP%���oD0��K{ fdZ,������A�cv�[�pM�`��V���G_o��
z��h�}������aw���#�
Fkw���O͖{p$oz�T�"̥P�>PW�I���
�Y�B�k���05f�6�h�eg����
<�f
G[�d���ӡp�?��[���螛s(W��#1���v�|�������zd��#	�xw4
	���D钌�2�5g�
<šR�vc��N,�8F�-�� ����
��=��W�U�>D����0��D��@W��t^|
ˏ��h�������z8�e���1�g�;|�y�qr���}}�6'�4���3\L��A�MM"�����*��x��e��\�4
{R

a��PȨ���]n >�
wN�V��'E����e���H�,߽y����;�w^�M��to�'|��@5�`���0�y��r�5:�Tzy[�v�Q��SN�#[jc_W8Ŀ�T���@VѭN(V�@+;�_����؎��~���j�<Z�H+��v
+
�H �����<�_͔�&����$�X��=�@�P�(��<��
�D�.�B����F
����'
+=�ʀ�;( �D+X#���$v؁��u,���P(Q�X�M����JY�h7���ɤ
6�vg���bD��Ȓ��~����ݶ�ߵ�ս�^�챹�?��(�
E�
E���KWRko�5d�Dc
�SԗS�N��Ca�y���
! ��R���W^m[�}���?�ۜo����I�����$���(R2�*&Ș��)	B��� GmPBS[�.�eO�]�ɛ�ƾm��
O%R�W���}��H���
<]����1�*��G{`
��oò�[�6���uV�i%�ύ~L�c8 at 0K����"T
;���a��)֛|Y@
ձ���}Z�҉��:z#��i��f��Msx{y����65:��Bysy8�.��8�(��sj�֭� K��
S$�
,�/\�g��
��яv�'�#P�
�
�endstream
+endobj
+10881 0 obj <<
+/Type /Page
+/Contents 10882 0 R
+/Resources 10880 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10831 0 R
+/Annots [ 10886 0 R 10887 0 R 10888 0 R 10890 0 R 10891 0 R 10893 0 R 10895 0 R 10896 0 R 10898 0 R 10899 0 R 10900 0 R 10902 0 R 10903 0 R 10906 0 R ]
+>> endobj
+10886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 697.2632 203.0748 708.1671]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 697.2632 296.3242 708.1671]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_a5f2c0410e128e2f082d761ef36820da) >>
+>> endobj
+10888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 682.6583 309.384 692.5636]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.4365 658.4407 239.1294 669.3446]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_5012c55d8fdb1420b80a3bfbe5a5b843) >>
+>> endobj
+10891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [297.2056 643.8358 329.5848 653.7411]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.1819 619.6182 315.9807 630.5221]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_75683687bda865c93db529b76271bed2) >>
+>> endobj
+10895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 538.9018 226.0342 549.8057]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_56a9fd5bee6f87ae9079aed0bc3de31a) >>
+>> endobj
+10896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 538.9018 356.3635 549.8057]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 431.328 151.0506 441.8584]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_d71d7986fdfd19215fc87726ebacf555) >>
+>> endobj
+10899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.8662 431.328 190.0538 441.8584]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.8671 431.328 235.0547 441.8584]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.1414 330.9136 219.329 341.8175]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [296.0057 253.5134 331.1933 264.4173]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10906 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10883 0 obj <<
+/D [10881 0 R /XYZ 90 757.9346 null]
+>> endobj
+10884 0 obj <<
+/D [10881 0 R /XYZ 90 716.2211 null]
+>> endobj
+10885 0 obj <<
+/D [10881 0 R /XYZ 90 716.2211 null]
+>> endobj
+10889 0 obj <<
+/D [10881 0 R /XYZ 90 677.5181 null]
+>> endobj
+10892 0 obj <<
+/D [10881 0 R /XYZ 90 638.6956 null]
+>> endobj
+10894 0 obj <<
+/D [10881 0 R /XYZ 90 557.8597 null]
+>> endobj
+10897 0 obj <<
+/D [10881 0 R /XYZ 90 477.1433 null]
+>> endobj
+10901 0 obj <<
+/D [10881 0 R /XYZ 90 393.6646 null]
+>> endobj
+10904 0 obj <<
+/D [10881 0 R /XYZ 90 142.1428 null]
+>> endobj
+10878 0 obj <<
+/D [10881 0 R /XYZ 90 118.9015 null]
+>> endobj
+10905 0 obj <<
+/D [10881 0 R /XYZ 90 118.9015 null]
+>> endobj
+10880 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F25 348 0 R /F11 416 0 R /F8 568 0 R /F67 370 0 R /F97 1774 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10911 0 obj <<
+/Length 1907      
+/Filter /FlateDecode
+>>
+stream
+x��YYo�6~��0P�k�5ÛR�(�G�@t���e��N�ʒ+�M��;IYmmSt� �e
g�s|�!s
?d
�
+Ō��z7��[���q�W�~�xy5�x#�<F��r~�m4H�%t~��� �x�"���%����%�o�/���No�����L����ߖ1�4�����b�O�%�z��/���a]����V�w�^�
+�g|����ٷW��nC�Ib��s��#�o`c��0bq$����c:��8e�!������/�����t���5�yyH�Me7S߹
�����~�.�RW�"ߤ���.�^%e��4��c�:����M�^�x0၄��_TQ�F�[��.P��th�H L"5�AD�p��Ъ+5��(F35W�(���o�z_�E^]mL�b����h��^�ݐ��"L
�7�zsy�������eY�#gT�G��H�Rc'zA'Eq�I߉���05r�r�n)�1�ی~E9�AMs'c�c�5T�`WPHr5
�yU�:�w����T��n��8�[������'k}�Iw:� ��c��
]䒣XPz>��D���ڲT�)��ȃ&�!�@�'���j��搯M!ۧ��� ;���+P~�(G�Ǥ���
�u����'��
+���.��8��i�k��nu���Ep+����4��\
T��THR��w�>����-���P�z].����# VT۴�J ��]y���G �V��K�P�0̻�Ib�S��C�z�yV6[՛.�g�2�Ƹ!�a�!�S
�ʯ�
�
6�����TQ�aPr5�c�F�Ԅ��6c=�E��H7��N#�B/@B��]{�)S����"�x��%��œ��
،���-�HvV͗�v��Lj;.��ݠ0HB}�=
�"TR
E��X�OYk����a�'t��P�����r%0v-�(�b�i3����X�Z�
+��ݡ�klX���Z>l��� d�8F1ƪ$?���
�\�`��`� ��yS�U�����|/
�8��Զv2.�Z����k�J����G�-m��Kb�V{�,i�]4O9��E�(7�l��o�.q���n�Zt���j��a�{��g侙p��V�&御�e���m�e�#�^�-��

8�(q����4,g?�irC�3UXE��Zl����]:�gw����][8��6��ȯ�v��3�͂�����/�
,إ�Ro�5��Պ�����'�	 2���":q�� z
�T
Q�]p\�'�,��08h:iž	���� �����M���Bl�
+�5�$���T]w��u+6Y�g-
�z®�����v!���h`�4i��S
����9E��9p2'4偂"`dcyd5�Px�E�/?��Hos4[B���
	�d����RPbʏ�}
�
Y��F�'����?�;
 #S9 /5値��� ��|f����ߋ��L8Z�j*�#"3i@(X����\r��:��G���@�h�{�� y�g�8&<A�Q�p���Z�smᎂ�'�E�=�.=����#=~�7hO<'[;�qn��L-tHm�xK�
Zb�=h��)�a�ԿJIGG��
+�\�L;�ۓ�k]'i�Y�k]��t�=��3����_�Ū�?�K�H���Ivj�v�
�Vlr���x
�v�`��}a�)��X]��.9�����y�-��O5��+��_�*������"�������3CB���
ED�c�����ԩ��"1�
�b��D�ߚ@���G�u��Ro~�t�̜�]�J��Cf��^y��W1�
Ufʡ%P`8U��T)D�%������Cg����
+_u��H���]]�//.���ѺB�<ݗ(�/ ��Kh��;��U+4�~�)�
+Hhח�vE��s�r� �h�I\��W�Iendstream
+endobj
+10910 0 obj <<
+/Type /Page
+/Contents 10911 0 R
+/Resources 10909 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10831 0 R
+/Annots [ 10913 0 R 10916 0 R 10922 0 R 10923 0 R 10924 0 R 10926 0 R ]
+>> endobj
+10913 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.6509 678.1369 465.9485 708.9811]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_a5f2c0410e128e2f082d761ef36820da) >>
+>> endobj
+10916 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.6281 575.9924 201.5309 585.8354]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_bb6a26c12f7bdee7504d577ca81992e0) >>
+>> endobj
+10922 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 283.0766 175.9373 293.9805]
+/Subtype /Link
+/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare_f6c069432956f215967c61be24a40939) >>
+>> endobj
+10923 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7529 283.0766 214.9405 293.9805]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10924 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [225.4013 283.0766 260.5888 293.9805]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10926 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10912 0 obj <<
+/D [10910 0 R /XYZ 90 757.9346 null]
+>> endobj
+10914 0 obj <<
+/D [10910 0 R /XYZ 90 665.2296 null]
+>> endobj
+10879 0 obj <<
+/D [10910 0 R /XYZ 90 642.7933 null]
+>> endobj
+10915 0 obj <<
+/D [10910 0 R /XYZ 90 642.7933 null]
+>> endobj
+10917 0 obj <<
+/D [10910 0 R /XYZ 90 563.0851 null]
+>> endobj
+10907 0 obj <<
+/D [10910 0 R /XYZ 90 539.7124 null]
+>> endobj
+10918 0 obj <<
+/D [10910 0 R /XYZ 90 539.7124 null]
+>> endobj
+10908 0 obj <<
+/D [10910 0 R /XYZ 90 502.4263 null]
+>> endobj
+10919 0 obj <<
+/D [10910 0 R /XYZ 90 488.5228 null]
+>> endobj
+1546 0 obj <<
+/D [10910 0 R /XYZ 90 408.0121 null]
+>> endobj
+330 0 obj <<
+/D [10910 0 R /XYZ 90 399.1152 null]
+>> endobj
+10920 0 obj <<
+/D [10910 0 R /XYZ 90 301.3095 null]
+>> endobj
+10921 0 obj <<
+/D [10910 0 R /XYZ 90 301.3095 null]
+>> endobj
+10925 0 obj <<
+/D [10910 0 R /XYZ 90 247.1642 null]
+>> endobj
+1547 0 obj <<
+/D [10910 0 R /XYZ 90 157.7719 null]
+>> endobj
+334 0 obj <<
+/D [10910 0 R /XYZ 90 148.875 null]
+>> endobj
+10909 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R /F97 1774 0 R /F25 348 0 R /F11 416 0 R /F74 482 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10929 0 obj <<
+/Length 2345      
+/Filter /FlateDecode
+>>
+stream
+xڽZ�r��}�W�iMV���_��v��
'�]�/�K��
+e�PZ���C`��m�2����D��L�ϙ���?df�L	�
�r��^��'��oW�����K��۫�o��d$��ۇ�I����n�?�	|Ƌ%���/�'�6�{��x�ۼ<��"��Gv_$���͏
C� K�7iy�1�K*���MR����CZ,����*�T�#������z�"m&"�$�oW?��gk��wW1����`D������}�\}��w맾p�a,
��sB�R�c@��7٪����
�s���!_U�./Ǧ�1���g�
!�A X"�4?��@~�t6��.
+HC#rd4����/ŧ��!`����sv
t?.!�\�c�I�y8:�U
���h�
��a�"��
9:2���	x
�۬Z�>���i��XX� ��>
eq}u�6��cZH����X:��
����@�߲|�Z~NK495�7J�~j�͌Pd�NZiu��
$mkMZ���IA��:�^��!�^�FP4I�
$�
+td8��\���ƞ������
Ģ�2�($
��*�B�),t��� u�DSru=!�:�I�Y�i�V�|��
a���VI��mv~��(`	��=�8��־��`�+m�?O
HrF�R(��':&�,.���!���k!���0
+'���3�9�F1��
+A��� �� � �=-����e�0 T	D
c��������a��֑�h�" ��(Ӌ�sP �ŕ�H =!�tf�9UД_,8\���,����A�PMhD��
���vLH
GBKr���1Ţ1�v#
d�r���]��ea$R��N��fH��
�rk�e��Ų
A��:���6�Kh���zDi$�
+�P
cǩ	�
����:8�}�J�Z���*H P貵�@�V2
+�� ]�N�f��R#m��D1|�h�,�iu(�d������l�
�G�+O��5��1�MO��6;[��_᎞�V��Ϗ�2���X05O'�	n#�j��]��͹�^]�h���4�
����������c�l
!�7�4=�}
���E��eZ
� �
+s(���wV���A�i݋;�rXIR��dg����
�F���{c�8� z�i/B��`af�EJ��)�3���~L���J0R�<���
�X����Hy���ĕY�Ơb��5fo)& ��eIHL�Y\L<���
at�����vW�ܕ���x�`0R�JD �jPq��A�Hi��� �vU��k�f���K�v��V��4w�ZE�P�<�N��@ϯ
�!иrs	c}ƶfӵ�1�nk��ޒ]�s�����\\��,]��jh�O��%׎�?c�F�#萔k,
�rD(A at kk�ƈҷ,#�Tиx�!��o͢��
^��:g�Aw6�CH_��Rg�A����s�y\ �1XSD�l�"x��W1�{�� �>��"�|���M
�g�6���Po1�O���
+��#?'�)�ޒ�T#N��"�~gg��0�DD�my�{��m�
�@�`�7�@4�1������:7� �y;�ب��@�~�_�J�W�]�J�G����B��1]ْ�W���0Հ?ySK��X�]&UV�h��&���;s�L��1� SP#QZ�r~� V��y#�qh ���쑈�A���Y���OD�������1���Yez#����0
�Ʒ�]<�P�\�]*%t���]�6�|�4m�~i�b0
� D�
Y���(R�K��Gk6��Cв�a;����&�� X�a���&p
T�G���wR
1"D0���*�A��P=��	�c��7�rrR4T
J\ֲ�>FEZI A�p}H7I�j��:�r�]ohH�i�쟻�5w�I��ۭM��C��ڢ�U�7�y
�$�T�r��5��qpē
G�ur����77��*Ҥ�̻����.�imv�1@��n��ݞ��h��

�u���S�0�
ƫ����@.Au/^6�FbV�N��@Dѳ��G��).x#d8L�(�AAu��Y~
�_��� [...]
ؤ�Q�U/]�|��g���#��hi^��&��l��\پjJ�)-�
�Žcdvx���b~:Z?m_�}���� ՞Q��?
P��p뷃4��t^�P+�r=� �,o�����@�m�|u�
�_���/�)�⋅�m����v-ş��/N�@��"��&6Z,t��tl�zfҍR}�י��}w��x�һ�N�My��N����7�����hU�C��
�U���溏�c
��=�~z��h��~��H���
�nwEۭ���Ħ� ���EC(��Z0Uendstream
+endobj
+10928 0 obj <<
+/Type /Page
+/Contents 10929 0 R
+/Resources 10927 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10831 0 R
+/Annots [ 10933 0 R 10935 0 R 10936 0 R 10937 0 R 10938 0 R 10939 0 R 10941 0 R 10942 0 R 10944 0 R 10945 0 R 10947 0 R 10948 0 R 10950 0 R 10951 0 R 10953 0 R 10956 0 R 10957 0 R 10958 0 R 10960 0 R 10961 0 R 10963 0 R ]
+>> endobj
+10933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 697.6209 170.6866 708.1512]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_da205f4442f845f797fb108c121fe371) >>
+>> endobj
+10935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 658.7666 170.6866 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_6faffe6889615dc0491bf86dd601172c) >>
+>> endobj
+10936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.0238 658.7666 233.2114 669.2969]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 619.9123 170.6866 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_5842c4add70aabcc093269aea7a348e5) >>
+>> endobj
+10938 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.0238 619.9123 233.2114 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10939 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.297 619.9123 309.4846 630.4426]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10941 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 580.6844 179.5535 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10942 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.0517 580.6844 250.6661 591.5883]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_3d49b2488d36bda4fef0109bedf6b0cc) >>
+>> endobj
+10944 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.9153 542.2037 158.0444 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_7176b36adef9683aae06961175ad94cb) >>
+>> endobj
+10945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.86 542.2037 197.0476 552.734]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >>
+>> endobj
+10947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 502.9758 191.7178 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 502.9758 288.8524 513.8797]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_32b7f9e0a2f54d199ad55bc008bfa62e) >>
+>> endobj
+10950 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.9104 464.1215 191.7178 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >>
+>> endobj
+10951 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.2159 464.1215 303.0791 475.0254]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_4e8f85cded8a6be1916c2cc0bb31c540) >>
+>> endobj
+10953 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.1145 425.6408 150.493 436.1711]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_3a5d4b3fb638414792155bcef8b54c1c) >>
+>> endobj
+10956 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.4316 344.5047 203.0748 355.4086]
+/Subtype /Link
+/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >>
+>> endobj
+10957 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5729 344.5047 296.3242 355.4086]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_587efac6e5a2fbde0a1866dbe4427224) >>
+>> endobj
+10958 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0048 329.884 328.3118 339.7892]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+10960 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3489 236.4636 226.0342 247.3675]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_d7bdf8849f22908ce11574a04ba875df) >>
+>> endobj
+10961 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.1759 236.4636 377.9522 247.3675]
+/Subtype /Link
+/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >>
+>> endobj
+10963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10930 0 obj <<
+/D [10928 0 R /XYZ 90 757.9346 null]
+>> endobj
+10931 0 obj <<
+/D [10928 0 R /XYZ 90 716.2211 null]
+>> endobj
+10932 0 obj <<
+/D [10928 0 R /XYZ 90 716.2211 null]
+>> endobj
+10934 0 obj <<
+/D [10928 0 R /XYZ 90 677.4863 null]
+>> endobj
+10940 0 obj <<
+/D [10928 0 R /XYZ 90 599.7777 null]
+>> endobj
+10943 0 obj <<
+/D [10928 0 R /XYZ 90 560.9234 null]
+>> endobj
+10946 0 obj <<
+/D [10928 0 R /XYZ 90 522.0691 null]
+>> endobj
+10949 0 obj <<
+/D [10928 0 R /XYZ 90 483.2148 null]
+>> endobj
+10952 0 obj <<
+/D [10928 0 R /XYZ 90 444.3605 null]
+>> endobj
+10954 0 obj <<
+/D [10928 0 R /XYZ 90 363.4785 null]
+>> endobj
+10955 0 obj <<
+/D [10928 0 R /XYZ 90 363.4785 null]
+>> endobj
+10959 0 obj <<
+/D [10928 0 R /XYZ 90 282.716 null]
+>> endobj
+10962 0 obj <<
+/D [10928 0 R /XYZ 90 199.1435 null]
+>> endobj
+10927 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F74 482 0 R /F67 370 0 R /F101 2079 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10968 0 obj <<
+/Length 1109      
+/Filter /FlateDecode
+>>
+stream
+xڥV[o�F~���i
�2���J��M�m���ۗl��8A�����3�`��&me�0����|sH��G�%2��`����
����n9��x���r6��"0�H*�妱 	��`��		��(&��*"8L�mrwQ
�Ӄ]���O��2)��?"CaC�|�luwm�(��ﳤ�����Ɩѡ�W�R�8������ei��`��8�����`
	}�a�ch��q�� �]�~��
�Sx�^eK��� �A�ȫ�ܯ�l|�>>���b��ڼN��]��?�
1n��,"��I����',����*
�jg޸��F
�f�"M��8]x��2
�����&D��#�`̴B�%���mA�ݷ����q�ig�0�]"�E��v
89n��DX7($)o	|�O�uW��CC�k�ش�Lj�
˯"!��4_ۈ��o�g��{e��w����v�3�D"�%� �t�z&���Q	�'
��
��R�ͨ#
c���
/�,���p�PM����!��2��bšB�k�m�&�%
��
+��c�Q����q[���$��N�g^{��g
v4��3曹Sҧ�$H�^I�����m����_�Bh�r�1����X��z����W���꧓��vO�?_ |yH+�&�t���
�Ѐ$��u�xY�6����|��,�m7���Fg_�^:��KoU��ʧ���-$��v�(v�L\U��91&=i���[�9o皨��'���ΐ>�*��
rct�~x��l�K���x�Ip�i�I7e���V3i�p�bj ##�O~�׻�/
=�1�D�������V��M�i���mɡ�m���͝#_M�~��}SdY�d�����'�if}�p�Lij��`��>F�8
8Ӽ�ҀM�8uD0|D��/��7��p _ʑ��.CS�]�M:�`�H!�W
׀$5RĐa�P���E�A���ʩ�롺�o��a�I���+[o���|�d�Z��/��� T�+-U��;=���
+=� #���?���1���x�Eە�A�gv]�u�[����*���]��z��O��p��ؗ؋�Mg�����}��(���m���&	&�͙D��F|"�   �endstream
+endobj
+10967 0 obj <<
+/Type /Page
+/Contents 10968 0 R
+/Resources 10966 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10975 0 R
+/Annots [ 10974 0 R ]
+>> endobj
+10974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+10969 0 obj <<
+/D [10967 0 R /XYZ 90 757.9346 null]
+>> endobj
+10970 0 obj <<
+/D [10967 0 R /XYZ 90 733.028 null]
+>> endobj
+10964 0 obj <<
+/D [10967 0 R /XYZ 90 716.2211 null]
+>> endobj
+10971 0 obj <<
+/D [10967 0 R /XYZ 90 716.2211 null]
+>> endobj
+10972 0 obj <<
+/D [10967 0 R /XYZ 90 622.83 null]
+>> endobj
+10965 0 obj <<
+/D [10967 0 R /XYZ 90 600.5182 null]
+>> endobj
+10973 0 obj <<
+/D [10967 0 R /XYZ 90 600.5182 null]
+>> endobj
+10966 0 obj <<
+/Font << /F65 361 0 R /F97 1774 0 R /F52 345 0 R /F67 370 0 R /F11 416 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+10978 0 obj <<
+/Length 2738      
+/Filter /FlateDecode
+>>
+stream
+x��\[s[�~���=S��_�֤mƝ�դz�L&á%Ff+�
Rn���$�88X@"�N
�{;�v?�ͨ���
�e�R�n
��ٝ���o��cɅ�����ɜK⨞���s#�܆Ͽ�~�ǿj5c��\|v��!75D*.g׷��}��]}y�������:�	FL뤨��<��
q��Sm
�T�,?,7���b����_>�6��;���'�q���>|���|\o7�Pˌ�H\��e�8�#�WW?,�����z�����ѷ˛�Ƶ3g�e�ʹQ�*vz�����d�x�h?���qCMZ��s��1F���V��G��N����r�_�m�����rq����qu�[.~X�-w_��滏���V���~��ڕrG��z��#�*�Bp��C�	���Z�MQ���8�F� �V�����p��7A��ǫ�{�e��n!n)�\�G(�ϡCYj7�ʙ+
+p�(m�q�
V���ɘ"ܨ�a���Grs����ܬ��h��y�Ϗ�O�������3M��h��C�	�����	��0J����ic{)LjЊu@��R�"9Q��z
�@e��C�	T��TDq踿����ƨ
V��	㈤�u
���vI�� N
���
:L�2�{8i�����
+�\^@�ɪ�6���
,M��<.ﶛ�}�8EVUJ��fk耰u4
�
+f�l�Pe�Fڈ��Ӥl#t��q�������������]��?
�f��h��L	F�u��l��
:L4[� �,� ��Oݸ�q�
V��	J�������~�گ
1��ar��j���n4̳��G�p�������a�Y��MA��jB����8X��J��p3w at x��vS����D
�5�k��C���*�*=K�7���

P�|'�FZ?6H+��VO�

?�/
֛������!�t˄�!�2CD��
�P�!��T ]�Ͻ-c���: �eVv[�ToK<m�E�m��W%0)q��t@,��,/�J`��B.�s�R6D�&0��%���:��i�1N�0S�9Ң�P˟@Z�#���HZ�NZYu�B�����
?s�az�,>YyL���P]|�	�	3��K�1N/�C�ʳ�<XU*�
�Ry#m-��8"�����O=ط�q�O-J��u2�O=X5Ҧf��9���P�p�L��
�u/��ֽ����H����Z����	n�PLv�{�Y��Yk��
��{x�%�D8�_sZT)Y���Yi�j�JY�꤄�
��i��̠��J���*%��A)/�:(�i��^M+A�Ԡ�:�
ז(�T��
��)�������Ԅ�M}�4ќ�s��w>��|��7uS7z^@u>h�-���A�S������{|jY����65�G�_�J�\pb�;�#�}2:��5L]�k4a�_�F�K�������ְJ����l��
lM��\��������3��O�������߉R돐�{b�T
߉
���a�;�<n�Ֆ:o'��/�=Y5��c�׭u�7X��{�A��jdTTo����
��M�
4,���1L��
��?+��3/����i*�g���s�{�{�R��q��wz��z��9 ��E"?��
+�ڇ��C}���IB���{���F�6NV�޼����H��ʏ
+B]�̀�y��~����`v|3P������F�(#�
+��7�>���ua	�j+j<Z΁iY��~���:��;�9a�$'�w4�ϡ}YK��¡Xed�I�F��"ÓQ#�����&�ý��*|E�j�4q8|�~
&���{�`�������0Fp�j��*??Kz�+��ьM��5�ϡ�Dsq�_���
+:)�̨�8Ѫ�VP��m���Y�E_<H�������}CmWƭ�m�Rߕ��"�h�H��
J��>�H��@�,��
:L�Rĭ
)���z^��
V��	�|%���%�Ewe���Z�Dc����Z�
�T�%åwe�����Dcx�Hc��/���o��vr�w\��O8�7$zE��܏�Dq�q]`�j$MM֭
l3{�����a���	�P�케*��i4P^��<hq���\��1�7d�e��B.��"s��1Z5�&T�Տ�}���w�������>�dy��O�`�B�g��q
�4F�����[Y˅f�v���1Z���d�Ƴ���$}RE��,�V��&U�i#B�RŎ/�ٓ��(�\��}}y�D�B���g�-�x΄"T����)�KS'��+�
�NQ�:Q�^�:i#�P�w����N���:�*�O�Sg^@u���Ʃ3�����ٞ;e}i���ue�㌥�3*�K3�6vۙ��x�w
+��4�+�ʸ�i��iO�`��]��:p��p)Z��c�.�X#m��_��c1Z/�A�Dz*1
�
���6�X&�
<v�������_g�]Ȟ҅]�7Є�
+���z��)�@�9�3MY��n�Y햏�ݳAn�iԕ��)t@�4ӫM�M�؁y�>��&
��,ðy۲
ڧ����2nPL E�&@�2*t��]٣�"R�q�#|�_]�C&��(���_���I�a	�M��:�Yu<Ѵ�L�t@��x8M�=(v��Ҡ��wʸ���G at T4�E<m��rJ/ј
<��5 NL�RDm��k �X�80�
kz�j��{T�rT�*�{#/�zT�Ϡ������� ��n.�u	�WS�������MB����pX�O7��j��tu@���L� �dD��[���y�x$9�endstream
+endobj
+10977 0 obj <<
+/Type /Page
+/Contents 10978 0 R
+/Resources 10976 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10975 0 R
+/Annots [ 10981 0 R 10982 0 R 10983 0 R 10984 0 R 10985 0 R 10986 0 R 10987 0 R 10988 0 R 10989 0 R 10990 0 R 10991 0 R 10992 0 R 10993 0 R 10994 0 R 10995 0 R 10996 0 R 10997 0 R 10998 0 R 10999 0 R 11000 0 R 11001 0 R 11002 0 R 11003 0 R 11004 0 R 11005 0 R 11006 0 R 11007 0 R 11008 0 R 11009 0 R 11010 0 R 11011 0 R 11012 0 R 11013 0 R 11014 0 R 11015 0 R 11016 0 R 11017 0 R 11018 0 R 11019 0 R 11020 0 R 11021 0 R 11022 0 R 11023 0 R 11024 0 R 11025 0 R 11026 0 R 11027 0 R 11028 0 R 11 [...]
+>> endobj
+10981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 672.6154 208.7738 682.8021]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+10982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 638.09 145.7908 646.9366]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+10983 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 624.0775 296.5639 634.9814]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+10984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 600.1672 285.097 611.0711]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+10985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 588.212 258.5368 599.1159]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+10986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 576.2568 260.1905 587.1608]
+/Subtype /Link
+/A << /S /GoTo /D (page.241) >>
+>> endobj
+10987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 554.4038 145.7908 563.2504]
+/Subtype /Link
+/A << /S /GoTo /D (page.318) >>
+>> endobj
+10988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 529.1534 221.6059 539.3401]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+10989 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 505.2431 187.0456 515.4297]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+10990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 492.5706 287.8667 503.4746]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+10991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 468.6603 285.097 479.5642]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+10992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 456.7051 260.1905 467.6091]
+/Subtype /Link
+/A << /S /GoTo /D (page.241) >>
+>> endobj
+10993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 433.5121 187.0456 443.6987]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+10994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 420.8396 287.8667 431.7436]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+10995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 396.9293 285.097 407.8332]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+10996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 384.9741 258.5368 395.8781]
+/Subtype /Link
+/A << /S /GoTo /D (page.138) >>
+>> endobj
+10997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 373.019 260.1905 383.9229]
+/Subtype /Link
+/A << /S /GoTo /D (page.242) >>
+>> endobj
+10998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.1793 373.019 280.1158 383.9229]
+/Subtype /Link
+/A << /S /GoTo /D (page.243) >>
+>> endobj
+10999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 351.1659 145.7908 360.0126]
+/Subtype /Link
+/A << /S /GoTo /D (page.318) >>
+>> endobj
+11000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 325.9156 221.6059 336.1022]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+11001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 302.0052 187.0456 312.1919]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+11002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 289.3328 287.8667 300.2367]
+/Subtype /Link
+/A << /S /GoTo /D (page.410) >>
+>> endobj
+11003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 265.4225 285.097 276.3264]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+11004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 253.4673 260.1905 264.3712]
+/Subtype /Link
+/A << /S /GoTo /D (page.243) >>
+>> endobj
+11005 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.1793 253.4673 280.1158 264.3712]
+/Subtype /Link
+/A << /S /GoTo /D (page.244) >>
+>> endobj
+11006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 230.2742 187.0456 240.4609]
+/Subtype /Link
+/A << /S /GoTo /D (page.375) >>
+>> endobj
+11007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 217.6018 287.8667 228.5057]
+/Subtype /Link
+/A << /S /GoTo /D (page.410) >>
+>> endobj
+11008 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 193.6914 291.0445 204.5954]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11009 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 181.7363 285.097 192.6402]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 169.7811 258.5368 180.685]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11011 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 157.8259 260.1905 168.7299]
+/Subtype /Link
+/A << /S /GoTo /D (page.245) >>
+>> endobj
+11012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 135.8533 145.7908 144.8195]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+11013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 112.0626 145.7908 120.9092]
+/Subtype /Link
+/A << /S /GoTo /D (page.317) >>
+>> endobj
+11014 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 684.5706 438.0873 694.7573]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+11015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 660.6603 403.5269 670.8469]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+11016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 647.9878 504.348 658.8918]
+/Subtype /Link
+/A << /S /GoTo /D (page.405) >>
+>> endobj
+11017 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 624.0775 501.5784 634.9814]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 612.1223 476.6719 623.0263]
+/Subtype /Link
+/A << /S /GoTo /D (page.245) >>
+>> endobj
+11019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 588.9293 403.5269 599.1159]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+11020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 576.2568 504.348 587.1608]
+/Subtype /Link
+/A << /S /GoTo /D (page.405) >>
+>> endobj
+11021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 552.3465 507.5259 563.2504]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 540.3913 501.5784 551.2953]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+11023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 528.4362 475.0182 539.3401]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 516.481 476.6719 527.3849]
+/Subtype /Link
+/A << /S /GoTo /D (page.246) >>
+>> endobj
+11025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 494.5083 362.2721 503.4746]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+11026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 470.7176 362.2721 479.5642]
+/Subtype /Link
+/A << /S /GoTo /D (page.317) >>
+>> endobj
+11027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 445.4673 438.0873 455.6539]
+/Subtype /Link
+/A << /S /GoTo /D (page.348) >>
+>> endobj
+11028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 421.5569 403.5269 431.7436]
+/Subtype /Link
+/A << /S /GoTo /D (page.373) >>
+>> endobj
+11029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 408.8845 504.348 419.7884]
+/Subtype /Link
+/A << /S /GoTo /D (page.407) >>
+>> endobj
+11030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 384.9741 501.5784 395.8781]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+11031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 373.019 476.6719 383.9229]
+/Subtype /Link
+/A << /S /GoTo /D (page.246) >>
+>> endobj
+11032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 349.8259 403.5269 360.0126]
+/Subtype /Link
+/A << /S /GoTo /D (page.373) >>
+>> endobj
+11033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 337.1535 504.348 348.0574]
+/Subtype /Link
+/A << /S /GoTo /D (page.407) >>
+>> endobj
+11034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 302.0052 403.5269 312.1919]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+11035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 277.3776 504.348 288.2816]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+11036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 253.4673 504.348 264.3712]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+11037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 229.5569 504.348 240.4609]
+/Subtype /Link
+/A << /S /GoTo /D (page.408) >>
+>> endobj
+11038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 205.6466 504.348 216.5505]
+/Subtype /Link
+/A << /S /GoTo /D (page.409) >>
+>> endobj
+11039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 181.7363 476.6719 192.6402]
+/Subtype /Link
+/A << /S /GoTo /D (page.242) >>
+>> endobj
+11040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 157.8259 476.6719 168.7299]
+/Subtype /Link
+/A << /S /GoTo /D (page.242) >>
+>> endobj
+11041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 145.8708 504.348 156.7747]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+11042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 121.9604 476.6719 132.8644]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+11043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 98.0501 476.6719 108.954]
+/Subtype /Link
+/A << /S /GoTo /D (page.249) >>
+>> endobj
+10979 0 obj <<
+/D [10977 0 R /XYZ 90 757.9346 null]
+>> endobj
+10980 0 obj <<
+/D [10977 0 R /XYZ 90 696.9691 null]
+>> endobj
+10976 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11046 0 obj <<
+/Length 3304      
+/Filter /FlateDecode
+>>
+stream
+x��\mo7��_�o'��\�[��������m!(��QkK���4�����e�
���CQ ��3�ϒ3���,���,4^(��f\.6�gxqm�����~^�ߗ���g��!�B#-�\\��=H�%tqy�ӳ��}�՛�_.�Yp� ,�qd�笱ߞ}u鼟�
&������~��+��7g1݈��#�5]ܞq��7g�����
?��A6s�N.�2��`}�뫫����j}8l�w��cM��KB���v�D<[w����������[��ݾ�����>{���vN��j����۶��B5j�
�5"┿���>��\�3_���$^m�D�$:�Hi.���Q!&>�#e�QS���W���ckm�g��
F�2�]��8�e8 M5�kS�D'	h��Tr�� gUk�TQΕ�c��n�v<�oWW�ï���qu׵���ݢҮ���~s��g� -c|�?��ه�;��`I�����mti�9�e8`��o_ h
+�R�b�'	L
�
+a-�� Ƹ_�]���|�ܘE��﮻�v�i\�_|�z�~}��@i׆l�iĔ)Q%(O��p�
�S��Z�*],
��	L�
�
+a�j�
+q�+������)ZJ祀�h�
�g �z�I�
����I�) �
��Aⲩ�n��j�����$'�e8`��߾�q��b���TNV��
̐i��
�����z�[�d��]BR!��� z�3��2�d�b�@�+Ž	��A�U�����v}s�q���lo0e���&�N6,��B-LwB�7Ś4�/�3�-��C��HM��z��t��V��
Ja��$O_�w)6� IMO��͗��
2S�}�#$-�5
+O�'��d�4]Op�SM���;�k�������E�
+F�j��n�� �:�R
�ȶ@8��n#c%
[�ڒ J~���6[���%�6�f��L��2��ګ
�K���U�t��<����
�
+a�d��,J�T�g�V]}�P�	��O�@� �aM�f����
+t8v���x�ˊo�M����@����#�'��-8`L7Ÿ�c�<�s;7��;
 ��(=C���;N ˻�
�D>�
+;?�U8
 T�(?�e�
+�	d�0
�����OH�9��pª�w8  ��l ��Ө8�,�.�uQ��I��x�?G�9��2Rͻ{�v�V��Y�
Eϒn0�Gcd�c�4}�y��{� ��EY�9�x�hqپ�5}�5
b�b�+2�'9|bJ"&���� �
:�R��6B8��t̐=N0{l�w~jk~8 ��Q~��l͏��|8��EPīfL�Zt�j�b8 X�Q�
7ٵ'�]�pX�9Fb~!^���[������@��P^_����� ��%�
k�$�F��Oq�P,�H2.�
@��fE`����a
�TS$��<��65��3���ї��TW�p P	��P	�l%��VB8��R6HI]��S�������O����� ���%��
ka5�����[o������
����X��o۫����O�'K��
J�[�!�Q�1O}{�e8`��o���ڤ\F;�S��O
���
+Q]Ӷ�[�O@�Z� h^�#!2K���4��
Қ�G
x87�
� ��#J�̜4�Gq�8�C�h�0S�������M� �6E����֦8�lm��zXa�1�؈�zyaw�oo���aQ
�d�aG8 8�pf=:�g;���
��
IQ5�뫏�׈��� �F����<BQy��!��6��?��*�RW���!g�C)x�D(N {$��P�� Ot&�ղ�p ��,9ɳ�8�,ˇ�E0A�6�C�u�_���/gQ�F�^M�{�C�V
+�5��Q����	��`)
+I�ځLc����a���"YC�/7g�
�9�~3K`l��t��T�:Z�zh
܄`�0��M��ʴf禀�h�
̠���P,�8”L���
+a
*�<��3,��F1R��u氎6�W\�e�C�]g��TkwK�q�3��I^at��2
0�j�7C�aB��}�����V���P��i����Ӷ���|��̳��
w�/aM&ѧ��dT��Q
Ŭe�i�7U-�u��k�wP/�V�L@��[gUk�
�%��>
���W�'l�
�
�E6�:�o0 Z��\tfw�o�@~��aGd#駅�~�=��A"?в��������pR;���돇�
�����k:��n2��wن&	�?dв �tV���@
�~g��c�kW���u�W`����
��,���2���
S�=�ie0fԊϢ�Ie8Y���	 Ip+E����j���@pq��"MOp�
�j�&Hp+Պ��²���@pI��jEOp�
�j�"�p+u���‚���@ri��:E�r��H��44�N~�%(L�
�d�$$?�]�����>9�9�
k����9�

+�
Åcz�uyc� ����M�hLS��9���.���ҭ(�H0�`ឳ*�u�
�*6	�[�&!
 l�,9��MB�@v� �u�*� F��k?	����9^K��^��<�������
ɫ��Z^ xU�#I%��1�	dy
�C*�
Ϋ*���W�
+��o�W��Dϫ�
��	
��&z^+S�%^
+=���zX���ռj�ղ*g
p*/�U7˧�h�P��iٔ��U���>Ϧ"q�iY96Gϱ)8�G1T�}"6��z�l*
 ��H��8�,�*�
!�z�fS�:BϦ`A_�Ħ@
�gSpXǦB5�����z����o�z���G`]|�z��M6۽��yYofx��MW�D���z�_��L�突�4
�tV��
�H'xw���0��h觭`�z_	�~ɟY�u"�`��j��o�~�_��H.X�pX�x�B^K��
zL]~1�k�NoUۃ�@�t\D���	d�q!�#�
�Ӷ��z�k�a��͞��
@��p�]E�~�Y�_��Jۮ���LO�Og�hU���b�>��q������8�*SԊ�!�{�p �wrf6G�v\m�`5�?�n�*EM�٨?S��zT^�߼��~��N�O�`�M|�Ϊ��"�'�o���m@���'c�w��'�D��7��O�` 4�F�҃�8��
���q�
���o·�Mަg��B�+ֱqn
+�|ԋ���Z�D�M�R���
��)_�o�
�����>�wv�x����o�B<;
�_�w����?c��7�u����I�u-U�W��ͦ?{ݶ�$N�IFH����o��_�
Eq��`��D\r��^�������?|��6t���uh{|~ww�<%
� PŠ��tFI.��VHe_���n�
@������̗��
QZfS�4ô&endstream
+endobj
+11045 0 obj <<
+/Type /Page
+/Contents 11046 0 R
+/Resources 11044 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10975 0 R
+/Annots [ 11048 0 R 11049 0 R 11050 0 R 11051 0 R 11052 0 R 11053 0 R 11054 0 R 11055 0 R 11056 0 R 11057 0 R 11058 0 R 11059 0 R 11060 0 R 11061 0 R 11062 0 R 11063 0 R 11064 0 R 11065 0 R 11066 0 R 11067 0 R 11068 0 R 11069 0 R 11070 0 R 11071 0 R 11072 0 R 11073 0 R 11074 0 R 11075 0 R 11076 0 R 11077 0 R 11078 0 R 11079 0 R 11080 0 R 11081 0 R 11082 0 R 11083 0 R 11084 0 R 11085 0 R 11086 0 R 11087 0 R 11088 0 R 11089 0 R 11090 0 R 11091 0 R 11092 0 R 11093 0 R 11094 0 R 11095 0 R 11 [...]
+>> endobj
+11048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 698.0592 145.7908 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 684.0467 296.5639 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.2662 660.1364 278.2027 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+11051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 636.2261 285.097 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+11052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 624.2709 258.5368 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.138) >>
+>> endobj
+11053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 612.3157 260.1905 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.243) >>
+>> endobj
+11054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 590.4627 145.7908 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.318) >>
+>> endobj
+11055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 565.2123 221.6059 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.348) >>
+>> endobj
+11056 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 552.5399 287.8667 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.411) >>
+>> endobj
+11057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 528.6296 285.097 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+11058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 516.6744 260.1905 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.244) >>
+>> endobj
+11059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.1793 516.6744 280.1158 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.245) >>
+>> endobj
+11060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 504.7192 287.8667 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.411) >>
+>> endobj
+11061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 480.8089 285.097 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+11062 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 468.8537 258.5368 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 456.8986 260.1905 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.246) >>
+>> endobj
+11064 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 435.0455 145.7908 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.317) >>
+>> endobj
+11065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 409.7952 221.6059 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.349) >>
+>> endobj
+11066 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 397.1227 287.8667 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.407) >>
+>> endobj
+11067 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 373.2124 285.097 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+11068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 361.2572 260.1905 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.247) >>
+>> endobj
+11069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 349.302 287.8667 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.408) >>
+>> endobj
+11070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 325.3917 287.8667 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.409) >>
+>> endobj
+11071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 301.4814 287.8667 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.409) >>
+>> endobj
+11072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 277.571 260.1905 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+11073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 253.6607 260.1905 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.249) >>
+>> endobj
+11074 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 229.7504 291.0445 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+11075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 217.7952 285.097 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 205.84 258.5368 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.145) >>
+>> endobj
+11077 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 193.8849 260.1905 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.257) >>
+>> endobj
+11078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 171.9122 145.7908 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+11079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 148.1215 145.7908 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+11080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 122.8711 221.6059 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.354) >>
+>> endobj
+11081 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 110.1987 287.8667 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.419) >>
+>> endobj
+11082 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 86.2883 291.0445 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+11083 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 719.9123 501.5784 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11084 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 707.9571 475.0182 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.145) >>
+>> endobj
+11085 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 696.0019 476.6719 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.257) >>
+>> endobj
+11086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 674.1489 362.2721 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+11087 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 648.8985 438.0873 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.354) >>
+>> endobj
+11088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 636.2261 504.348 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.420) >>
+>> endobj
+11089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 602.2983 362.2721 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+11090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.6565 564.4951 396.5929 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+11091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 540.5847 507.5259 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+11092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 528.6296 501.5784 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11093 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 516.6744 475.0182 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.141) >>
+>> endobj
+11094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 504.7192 476.6719 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 482.8662 362.2721 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+11096 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 457.6158 438.0873 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+11097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 433.7055 403.5269 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.377) >>
+>> endobj
+11098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 421.033 504.348 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+11099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 397.1227 507.5259 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+11100 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 385.1675 501.5784 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.111) >>
+>> endobj
+11101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 373.2124 475.0182 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.141) >>
+>> endobj
+11102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 361.2572 476.6719 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11103 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 339.4042 362.2721 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+11104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 314.1538 438.0873 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.351) >>
+>> endobj
+11105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 290.2435 403.5269 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.377) >>
+>> endobj
+11106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 277.571 504.348 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+11107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 254.378 425.2551 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 218.5125 403.5269 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+11109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 183.987 362.2721 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11110 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [435.935 148.0567 447.8902 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.71) >>
+>> endobj
+11111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 124.1464 496.597 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.97) >>
+>> endobj
+11112 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.5858 124.1464 511.541 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+11113 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 100.236 501.5784 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11114 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11047 0 obj <<
+/D [11045 0 R /XYZ 90 757.9346 null]
+>> endobj
+11044 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11117 0 obj <<
+/Length 3214      
+/Filter /FlateDecode
+>>
+stream
+x��\�r7}�W�m��ƾ�m�d
g�Dc+USY�EI-��T(i
����
4KD:)W������
� })2���
�)��a\�N��>~uB������|qq��R�
2�����ރ$HPBg�?����˯�s���73�5�B�#�9g�~z�Յ��L�����~��kH����b��`D����NY�f}�����O���`�a!�w�k*�LQ���6��3"N�����|������-oV������������}���UQiR��Iٯv�
歗���}�8�د�2��
��	�Xq�BX{�A����^^?,�?�׋����v�Xn�w���n��f�IG�
���TJc_�j&=|��
U�1���1X�Z��Փ,�n���������(,*�(窞F� �c�Ip�� �4�ٰ�J�զ�s_�:7�c�q��߮����c��%y�]m
���<s7�gT�~hv��H'
+�
|&�AL���'�����L���0
�N�D�6J`D�C�ZҩB�����Ň�u�Ymn㺢p�@\j]_��A�p{X[�<]�A��͆u���
�����|����n��C���3a`	�4C:��7�H5�21D8G�p1J`\e=��L(��֕��1;R��m7q���2T�
+I�K�����D�E~�J����$�
+��
+�C�Z�@��,
��c͋��4U��o��
�4/�	$��|XK5� ߷C�r���n������M�X�-o�������~\��ǵ�1�d��
+���f��������x�4�㚍�K�G��9��
QGY>�����7�,A�����&�\>�aj4�V0��=&�S$���K��
>�������,�n�{
���	�A���"��.�j���`�#*��DI���S�������G��z2|�@�J�*�
h�0��GT�Î��z��dT���*�&UF�@Re�:��D����~���j�^�^�ښ�\?]����‹��ú,����F�ȐR����o0Ql��=�"
���2���֣
+a*	E��C��c�`����7��3�LR@�	$D!l� �1��q���V+d}���
��D&�l�@R���bJ"&EF]��?G`1�'�^`���`��O
+�|ԡ�E�HK�W���
2+ȑ�XaI��;P�1ʫ�G��r茴��	+/nRVe�

P
h~��r~jE�o�UA~9Q&�U��-D"��1E�
I��E�o�U֊*�UaIQU�3D
ER��DT�)UQ^/�|���r���
+H��|؁J�����UT��LX���
2���J�*L )�
+a
�P�Z�#�*�VT�Qd�;

H��|XU�Qd0
EUw�z�)���0V�T���x�a-�:�k�@��lX�+�Șn����2��(�a�U��dHu��T�$5L Ij>,�J� �L�@���f��[,/������>��'�!B��V��AF�;��U���'�>�����YuO�T��W���
2�?�|R��	$�>�@
7��n ���=�o���Ɠ;�0��f v`�)D%%�������o���Q����0��~ v��
+�p�F���>1At�~�7��
l/��H�����BX�&����
�� �	��x��n�G�y�<���4��A��k�ˈkԉBV�J�X��ε���2
���jh
���s�`�Z"�{�e�(r
�!��F�9T)lO���\�ŵg��e����c�׽��у�	�Tٖ5�DŽi
q�c��<v٬�2yf�ZQ|q#��z�l\������9	jd�k͡
+A�"�{מ��8(b�4|�����}��*�M(/�1
T:N ��C��X*���vc	��J����D~ʋ+�0%�ƳR�*�
X����򲏁#����

���Vyœ5�
2߈�P��-^;�A‹q	��޶�.C�/���~‹��d��0�e�P�����.ã	/N)"0Vv#��BW`�5!�8HvlH��b:�~�O{��Oe� ��퀱ߒ��v!���Q��"
,�zg����gd��bNVѓ�*��*�L���`A{n�tn)�l�
��|�c�]
+Ir)�6YKa!l�͆��RDž1��������b�ʐ�.�G�������^�[ n�]��j��VP]W�WA����o�@�+(�V�UP6�#2hٴDz?����uY�e;
#�%�r]�u٘s~㈹�ϗ���e���3���Hf�
HS�
;p�4�ɣ���g��ͩ��o���'�ȴ�z���n�>]^Ml�&,=Wfz��7�`&�kS�q*'i��(���
U�:��(�N�/� xfQ�.���**����d����+np�>L )�
a#o�U�I���I���{|1������4��	)\x�*���am]�|�䱟��Od`YR��9������
~�j�5�'F��
�G���@���/3=t�-��S�g�
2C����s�
&�
:���V�	�8Wꈧ
+�Sġ���
r
���/����
�ú1Ơ>X��q?�6�ݮ��~�_���I+�ДV�x��Ok�M$O<��'���C�����Q�V
y��6�s#\$�Q=���1
�p$�G
TS��T���7Ȍ?k�_�T/L 9�
+a��GFJ1��#�;W`T�������|�L�9X[c��0�d���
�=Ԃ�O���UnX������W+ԛ��wOw��.S����ׯ��A�{؞I)��$���|X�$�c���LZ
W���r��k6��C�;H%���_`R}��A����1fɃ�0��Aj>l�mR�q
�Z{�=�|䵽d>u�υ0�K�Q%��#J �����v��|��)v�a�ǩo��֎��&�
����Ff`gƻq�n��gr���s���r��e�#1���ӾA��
��hҒ7L M^>�#�
�kӲ�����~x�������]<��Wͦ�-��	�K�X�
A������>�qC�{�p|�c�m_CG3V�}��Ɠ{
+
���:�Oz�����	Kd�=�j��ABt]��s3�|����;ck�A�懇f��3!N���.7O�u��g,p�Y�{Xm7퇐*��5T���
��]�č�
+*������_g���=���ܳh�Ԛ�.9�k/������/^|��]=����~�V�/���/�Vk
+{� ��
w�(��~�(I���f�k����۱���w���[L���_�9endstream
+endobj
+11116 0 obj <<
+/Type /Page
+/Contents 11117 0 R
+/Resources 11115 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10975 0 R
+/Annots [ 11119 0 R 11120 0 R 11121 0 R 11122 0 R 11123 0 R 11124 0 R 11125 0 R 11126 0 R 11127 0 R 11128 0 R 11129 0 R 11130 0 R 11131 0 R 11132 0 R 11133 0 R 11134 0 R 11135 0 R 11136 0 R 11137 0 R 11138 0 R 11139 0 R 11140 0 R 11141 0 R 11142 0 R 11143 0 R 11144 0 R 11145 0 R 11146 0 R 11147 0 R 11148 0 R 11149 0 R 11150 0 R 11151 0 R 11152 0 R 11153 0 R 11154 0 R 11155 0 R 11156 0 R 11157 0 R 11158 0 R 11159 0 R 11160 0 R 11161 0 R 11162 0 R 11163 0 R 11164 0 R 11165 0 R 11166 0 R 11 [...]
+>> endobj
+11119 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 719.9123 285.097 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11120 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 696.0019 285.097 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 672.0916 285.097 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 636.9434 187.0456 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+11123 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 612.3157 285.097 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+11124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 590.4627 145.7908 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.324) >>
+>> endobj
+11125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 564.4951 287.8667 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.417) >>
+>> endobj
+11126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 529.3468 187.0456 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+11127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 504.7192 291.0445 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+11128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 492.7641 285.097 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+11129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 480.8089 258.5368 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.143) >>
+>> endobj
+11130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 468.8537 260.1905 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.254) >>
+>> endobj
+11131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 447.0007 145.7908 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.322) >>
+>> endobj
+11132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 421.7503 221.6059 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.353) >>
+>> endobj
+11133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 397.84 187.0456 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.379) >>
+>> endobj
+11134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 385.1675 287.8667 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.416) >>
+>> endobj
+11135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 361.2572 291.0445 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+11136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 349.302 285.097 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+11137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 337.3469 258.5368 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.143) >>
+>> endobj
+11138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 325.3917 260.1905 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.254) >>
+>> endobj
+11139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 303.5387 145.7908 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.323) >>
+>> endobj
+11140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 278.2883 221.6059 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.353) >>
+>> endobj
+11141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 254.378 187.0456 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.379) >>
+>> endobj
+11142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 241.7055 287.8667 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.417) >>
+>> endobj
+11143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 217.7952 287.8667 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.418) >>
+>> endobj
+11144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 193.8849 287.8667 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.419) >>
+>> endobj
+11145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 169.9745 291.0445 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+11146 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 158.0194 285.097 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+11147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 146.0642 258.5368 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 134.109 260.1905 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 112.256 145.7908 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+11150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 87.0056 221.6059 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.344) >>
+>> endobj
+11151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 708.6744 403.5269 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+11152 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 696.0019 504.348 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+11153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 672.0916 507.5259 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+11154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 660.1364 501.5784 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+11155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 648.1812 475.0182 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 636.2261 476.6719 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.238) >>
+>> endobj
+11157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 614.373 362.2721 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+11158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 589.1227 438.0873 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.344) >>
+>> endobj
+11159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 565.2123 403.5269 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+11160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 552.5399 504.348 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+11161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 528.6296 475.0182 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.131) >>
+>> endobj
+11162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.007 528.6296 494.9434 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.133) >>
+>> endobj
+11163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 504.7192 475.0182 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 480.8089 475.0182 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 456.8986 475.0182 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.91 434.9807 419.8652 445.8847]
+/Subtype /Link
+/A << /S /GoTo /D (page.57) >>
+>> endobj
+11167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 401.1725 362.2721 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (page.153) >>
+>> endobj
+11168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 401.1725 382.1974 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (page.156) >>
+>> endobj
+11169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 375.2049 511.5056 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+11170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 365.4066 362.2721 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+11171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 341.3967 362.2721 350.2433]
+/Subtype /Link
+/A << /S /GoTo /D (page.324) >>
+>> endobj
+11172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 315.4291 501.5784 326.333]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+11173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 303.4739 475.0182 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.145) >>
+>> endobj
+11174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 281.6208 362.2721 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (page.325) >>
+>> endobj
+11175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 255.6532 475.0182 266.5572]
+/Subtype /Link
+/A << /S /GoTo /D (page.144) >>
+>> endobj
+11176 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 221.845 362.2721 230.6917]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 184.6395 403.5269 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+11178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.5157 184.6395 423.4522 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (page.384) >>
+>> endobj
+11179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 150.114 362.2721 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 114.1289 362.2721 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+11181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 88.2809 498.2408 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11118 0 obj <<
+/D [11116 0 R /XYZ 90 757.9346 null]
+>> endobj
+11115 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11185 0 obj <<
+/Length 3247      
+/Filter /FlateDecode
+>>
+stream
+xڽ\ms�6��_�o�
���[����Ҟ۸3�k;E�]m�'�u��oA H k��Lf$�v�X<�\�,0�#
�J(d����^|���<#��
+�W!�����H�0�H*���
� A	]\^����_�����˯
k������c��ٛK?{g\0I���;����'�>È-�#b
]ܞq�ܛ���g��y�
̀�{�M܄����
a)X���fw���˻�f{ln� ��Պd� 
�✈���jy��y�T_�W�w�����Ͼ���~u���>�o*�nC�d�`ںm/�?v����*
�E<�u�b
9�1R��
��Q�@�4!Z�n��e�^�׿����Z~{����#� -�\H%�\���*
�C<���H9�9R���#�<�`�R'�ڴܽ����T��c����k�c������?.a���k��j]�|K���1�Y�/���|E�Z�$�VVH)%F��+͡
+V-]� �L���Е]x����}�� �*��t!�B���Vu�*�O����jS2ިaE��z�O;P�&�
/�ĥֳx9
�+Xb1
7�����:|��a�yj�����s9v �C���`���P���ds�{8 �N���Ёd|ϛ����b7���2M���B���(
�Dqk�:Ň$�x�,�%�Vr�K��C��z0Φ�3�����
��t����8t Mg֬���4U
���eq���-M�?���������f�������A8��`@�G��2F�<
H�5
<r#�!�-�ۻվ~"y����?�-�������i���8A��p��F�"�eq�:|� 7��90(��AT��cr
�d�E.1d9D�����J�
r'#��Ȭ@kwrz
H���YO��p��$}��l�(�(���8
+�8r��#��


Hs�5kw)��2�e �w7m��
��oV�ó%
cX�B�N��$�Ú$�'����d��
+�1��Xvamk���/������Ϸ��#\:�������
fc�����U8`B�E�Z_u�
�q�F��<:T��ߜLr�	��9_}�89A@����UR�
�
+L)��Mp'*�j`�a<v R�
�`��F@�0k���
��)F�~�+_�&X��mX���5���Yq��ٞ���$`����n�!
���)636A[�)���d��n�C�Y�I�X��e'#	m��-
�9�<���T&����`�3�9���X)���fus󘓘��W���jy�������R(�Ie�q��p����m�"r�bH�؁�Js��YOe��S>#��+����f��~�#�@�
b�FJ��L��U��R�Y�t�?���
�X�D*���		:��9���@`�J��V�v�*
0U
+
��<-�8>���c�#�Ĉ���S
-;��J�b
�2�
fbv5
���zX[F�2�Ёd
5o�R�X�5�n���p�oOf0�y[�A��7�
3Uܷ_�&6Q4o[��w��ӓ����P��1�T1�N�;n
6W�v�����TqB����l}�HkU�H���I��7kI�wU��a����'fHe�� ���l���kVfI�?t ���f��A�BT�S���f��d���=�XR�
H���ٞ*��!~�.s���e���.
��L�w����.˚�i!
1A�3# � f��A8 �xX#ÈHfC�
��D
+�
+���(���L �3�s�xD	�	��(����dV��)E���=^荈fm��N��!��
*��,�]n��4�m��
bLI
{|���hކ���
�
;0&СJf=�a7�S3�5̦�ܞ�/4���6���|@L��I�{V<�`"!�X�;W\����o�� �62���aq�B3I4k�р
���
,T��s7lc�
S��>Cݚ���D�ZX
:�M2���X�x����_��~S��_I�U��d���^��BI<o�W'�$��FI�{ţ
+f{jfw�L�U.l
)�̾�/4���z5*DrH�1%&߷�Q���?ַ�"1R��hq�*
0AK4o�W�>Y�b�؁��U0��6ɜ�W�����m0����p���Ѽ�^��02I�'�C�ԡJf=C(5�/,`;�8��ǫ�|GM4k�BeJ�f�x�
+���I
{y�"*`,��eh8 #C=�!P��

:�����°o�d:������6�x�V��
�v7�24o�K){��=f��i��ض���77��3tQCŠ@�P�ĠM��W�	�y��8;�������xY9T�jϜ�s�2q�iz�m�ݺ>��:[�ra;�\E�ӊԁEJ��t`:�H����L#�f=`z�r��j�A���G��9q�ZO
y�=�v7P���+l(�R��E8 sPxX{P��A1t yP̺
�
F�0��!�
6����xW?[
���
|&:���H|hOƿ�ɞ,i^���jc��o�Ž�����D���@�sی�窸e
�
+LP���-�)@�
;0fѡ
+f{9E
�
+i�
v��>�K���^G
c�`
�b����W�)3�7�
+n����
�JA
�`��=F���O�
�O��w#�����L�P��T��j`=���m��e��)����|sq��g�cTQ��
�|&�9TA�
�'�X�dϑ�#�����;{�?�s���w�Ǽ�+����POV0 ǖ�M7�t
���Z�	ci��[��ͮ����4��._��t�ڣ
+���T�:o�g�PdTW����7��z�]^m����C�jK1AxF늶>S�u���#8Y�
XOVl�6}�'��H*}b��O3�`�l<��b�$
�y�=+J!B�z��'����0p��T
C�j!o��F
+D��X�%�*��~��B8 #<��;6I�0t )
+f�٬���A�S���v������p�{�����];Tɬ
Ʉ� ��ԯnTx����B�������v�����-|�{j���텭M|���E� Q��S�`ar
����gDza

H/��YO1��Ql��Z�q�8�#'M��n:�`v�<��4��vB3hݒpFۢ�u����S}^Q����{���m�e�o~8����
��о�f��_ݴ����jo�
��*���T�U��+2�}]ǝ{
+�
,�K��_��?�&�n@�h�.�
+n9�������/

����=�
_��ݼ�+4��b�o��ȗ��z#�_�!En����c��oWv[�H~�IW��9Kendstream
+endobj
+11184 0 obj <<
+/Type /Page
+/Contents 11185 0 R
+/Resources 11183 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10975 0 R
+/Annots [ 11187 0 R 11188 0 R 11189 0 R 11190 0 R 11191 0 R 11192 0 R 11193 0 R 11194 0 R 11195 0 R 11196 0 R 11197 0 R 11198 0 R 11199 0 R 11200 0 R 11201 0 R 11202 0 R 11203 0 R 11204 0 R 11205 0 R 11206 0 R 11207 0 R 11208 0 R 11209 0 R 11210 0 R 11211 0 R 11212 0 R 11213 0 R 11214 0 R 11215 0 R 11216 0 R 11217 0 R 11218 0 R 11219 0 R 11220 0 R 11221 0 R 11222 0 R 11223 0 R 11224 0 R 11225 0 R 11226 0 R 11227 0 R 11228 0 R 11229 0 R 11230 0 R 11231 0 R 11232 0 R 11233 0 R 11234 0 R 11 [...]
+>> endobj
+11187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 707.9571 281.7594 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 674.0293 145.7908 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 648.8985 208.7738 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+11190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 624.2709 290.0684 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.5064 612.3157 283.4429 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 600.3606 281.7594 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 578.5075 145.7908 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 542.5224 145.7908 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+11195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 506.7765 145.7908 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.331) >>
+>> endobj
+11196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3392 469.571 192.2757 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+11197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 447.0007 145.7908 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.261) >>
+>> endobj
+11198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 423.0903 145.7908 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.277) >>
+>> endobj
+11199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 397.84 208.7738 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 373.2124 291.0445 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+11201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 361.2572 285.097 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+11202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 349.302 258.5368 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+11203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 337.3469 260.1905 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+11204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 315.4938 145.7908 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+11205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 290.2435 221.6059 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+11206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 266.3331 187.0456 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+11207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 253.6607 287.8667 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.420) >>
+>> endobj
+11208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 229.7504 290.0684 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.175) >>
+>> endobj
+11209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 193.8849 180.1116 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.181) >>
+>> endobj
+11210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 169.9745 260.1905 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.255) >>
+>> endobj
+11211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 146.0642 285.097 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 134.109 258.5368 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.133) >>
+>> endobj
+11213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 122.1538 260.1905 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 100.3008 145.7908 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+11215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 708.6744 438.0873 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+11216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 684.764 403.5269 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+11217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 672.0916 504.348 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+11218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 648.1812 499.9242 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 624.2709 507.5259 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 612.3157 501.5784 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+11221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 600.3606 475.0182 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 588.4054 476.6719 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 566.5524 362.2721 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+11224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 541.302 438.0873 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+11225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 517.3917 403.5269 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.371) >>
+>> endobj
+11226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 504.7192 504.348 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.404) >>
+>> endobj
+11227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 471.5635 425.2551 481.7502]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+11228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 446.9359 507.5259 457.8398]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+11229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 423.7429 438.0873 433.9295]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+11230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 399.8325 403.5269 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+11231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 375.9222 425.2551 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+11232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [472.2084 351.2946 489.1448 362.1985]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+11233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 327.3842 498.2408 338.2882]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 305.5312 362.2721 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 270.3182 425.2551 280.5049]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+11236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 246.4079 425.2551 256.5945]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 221.7802 499.9242 232.6842]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 197.8699 501.5784 208.7738]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+11239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 185.9147 475.0182 196.8187]
+/Subtype /Link
+/A << /S /GoTo /D (page.150) >>
+>> endobj
+11240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 173.9596 498.2408 184.8635]
+/Subtype /Link
+/A << /S /GoTo /D (page.210) >>
+>> endobj
+11241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 150.7665 362.2721 160.9532]
+/Subtype /Link
+/A << /S /GoTo /D (page.329) >>
+>> endobj
+11242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 150.7665 382.1974 160.9532]
+/Subtype /Link
+/A << /S /GoTo /D (page.330) >>
+>> endobj
+11243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 116.1214 362.2721 125.0877]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+11244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11186 0 obj <<
+/D [11184 0 R /XYZ 90 757.9346 null]
+>> endobj
+11183 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11247 0 obj <<
+/Length 3336      
+/Filter /FlateDecode
+>>
+stream
+x��\Yo#7~�����@��}�m��N���L
 @��#Ė������b��&��#>
0����u�XU2Y`�G/�P�0.��Gxq	/�>"�����2����ſ�Xd$���w�I���.�.~9��/^�|����
�5�B�!�:�ľz���[?8Lk��G�����G1�����1�.��8e��~�v�7z��5�f!h���g*�BQ���lȧ'D
�����������b�^}�y�_�?~������O>�.V��_����L�G�AZ`�P� B0
³o�/2o�@��2T��6�k�%R'p���b�/Us�@�� "D
��ߞ����uV�r �1��)o���_�i��U'�8�nR���
/T�	�,��ɩ{w����Yo/V�7��nu���ݶ��� 7B�:�/��ݏ��f{w���b�5l7����0{�e�0�fl�ƪe�&�q�&�8R�c�I��6
����߯o�i�ԣ�
+2N~*� ���!���`<
`
+����
�1�j�g�?ST8E�H9����䗡�
*��
�� l��x�'Uq;��
b�І��\���8�S�� �
�`���0),�U�OH`9HU܎�P�8�uT�?�[_���n�$q�u�*5/fCeTe�8��Vq��
A���
޼۬��>��s}x�o���shN�;�a�dc��j!
4PBW
��_�
+3����iͦpRb3
`�kN���C)��P��iVB�twB��n?w�

|g4�\W[,'�
f֒��!�4	@K8�
�0�F'Us�!�M��K�m�^�C%��*��ė��LrM���=%�'�Vx�=9�Be��]	ΐb*�-S���n�q�ٮ�~��n
��T� �*�\�B�B��bC;/��/ [�*n}�a��'���ֆ>T(t�Q���lK����n!��@|x$�����U���e끉��W��@ 3��
�B���1T(d���3"�aq �
+���	�
L��W��n�_�oo7�ۿa�r*QZ��(�Ptb�}�G��֢H�y�쐅���T>�굳J�)�R�fV*X��Y�ʲ���U�����@�F��Uz[��2T(��(���Ȳʲ������Yi唁|�R���e�=K(�>G<�D�U��|��i員B�OF��d
@�O�ݎ��8W�		%����xs�
+�ڋ
�2K�-��
!��`���������P�
+B��j�2 K(�nG(���O��|���"��O�
+>��j|2 �'+n
�TS��TOC(��VF*(e%�4�)� ����+�0R�
���չm/�K
s}��.���}��
+�4��&j�^��3�MlژTJá
+q��)dN���B� ]}�S�<����yJ(2J���P�p>x����_8�dχ�[�%1A�IY���J����,Q��{�q}Bzm��{
H��UO!���f���p�*�̋ղ, �e�.ˈ`�>m�y��y*-
+��iq �T+����	�\
���v�����#�w�E�c��V���e�����	����u _`�N�'�,K�#�Yn]t9&
Q�1���Z{[��:T(P�(FBH�Z�d�u��
��L�Hn�ʹ��P�����H:��s
@�_W�&֬ۙ\�v��4�����'v�U�=�R�Ka*�vR�>
C�J��[g��R!�/�)��QA�W
+���B���V&
`�)(h��u��S��z�:� Fbdi���S���!�	Eh�@p�C��9��1j�a`W�O��.Z�P� ��Ѽ|e.,�;\�$�I8o���q4/Us�X�M
{���6���W�O��Nv
hC���I�ܺ�h
�{��% �p5���t��P>]Pbu�ZJ��3��!��P����l�p8��p�u�N��=�;,9�
G$&�U��*n��	���:�ADBK�:z��+3p��
B��*�y�`X�G�T�mjm>q0DGh뢝x����d=�M��V��d'UC�gM�a����L�֡C/_��K��7�$��[�6�<t�*nSk�G�; g
+ǃ�<ܗ�
V-�oq�p<x+n1��&�La�>��ge��3���#z��``jw�D�9PG
2��5�V�(7�؜Q�B)��iH����~3�?M('U��jL4����;�#��j��������pw at g�QSR���R�#4�3�sw
XVʌf*�8�e�0�Jb7â��[�
0=��T��J8���i4�)Fd����q�v3̒C+&--N�z�����|{b/\�4ͫv�5���a�|�
��ʪ�T��
�3��D���V�P�P]�aVFY���Ȟ��
 F��T���qd�s���jb����3V|Nm�9c�=g�xO��8cy͞3�ݎ��<#�t�� Cm挡B�3z�
�r,/ �+n
�\3����'g��>���X"O��l�[��*��\A�c�^�C�B%�b5������9�
hF�t�ۯ>l.��f{��O�˭��X�
+}luB�B��ņC_d[�8�l�Sv;"�$
�
��]ww��yl��,J����<����+�PDi�f�|��
��Z��,�/eE�
s /}���w��__��X3�[����P�����
�Ż���$G�`��wqjۂ�v��A/W
�0�5!i��B�Zx��Zp��q �jQv;����(B�u�?l>��
�^�l3���:�L�C���b��Y�
�%�e�#xD�.0��w��"�����Y �
I�E;��B	B'V�0
+ aѭ��
+	kƍ|s���A E9i�/T(���j��d�+�
�)9|����W/O!�g�ެ��z��
�������<�f���?{��UY���"�/\ٮ�
+��su
;�e�0`b��$�j'1���O>�9HU���q�4
d)�g_����@c�D;h�B	4'V-���u�bd��j��|���b��a�m�P8h�Xв�
d
@����M��_��Tf/![�/!+$v����%dy�����g
1
+a��u	�|u��?{���y��Ԏh���~�l̡P��C^l�v$�Cq �
*�
�T
����b��w��c����
����!T(\4x�
�t��_!�d/*n=�L!*)1|�wכA$
1A�okB��Nl Q�A�ȃXv�@4q6|���2s�4��jm���
+ԣ��]�g�l/DLT�$2���� l�g�h��x��g<�zx��/?�v��q|;���z
�~��W,��X�ӬB�7��*x���%�>�ǮK���!1Jû�/�O�	�
+�@c�C�*Xrb�.����ͧ/^|���ߢ���f�6w/nn�^��
�y
+;���^(�%��2|���by��@]���DZ�‹��;�������w�Hlendstream
+endobj
+11246 0 obj <<
+/Type /Page
+/Contents 11247 0 R
+/Resources 11245 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 10975 0 R
+/Annots [ 11249 0 R 11250 0 R 11251 0 R 11252 0 R 11253 0 R 11254 0 R 11255 0 R 11256 0 R 11257 0 R 11258 0 R 11259 0 R 11260 0 R 11261 0 R 11262 0 R 11263 0 R 11264 0 R 11265 0 R 11266 0 R 11267 0 R 11268 0 R 11269 0 R 11270 0 R 11271 0 R 11272 0 R 11273 0 R 11274 0 R 11275 0 R 11276 0 R 11277 0 R 11278 0 R 11279 0 R 11280 0 R 11281 0 R 11282 0 R 11283 0 R 11284 0 R 11285 0 R 11286 0 R 11287 0 R 11288 0 R 11289 0 R 11290 0 R 11291 0 R 11292 0 R 11293 0 R 11294 0 R 11295 0 R 11296 0 R 11 [...]
+>> endobj
+11249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 710.0144 145.7908 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 696.0019 296.5639 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+11251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 672.0916 291.0445 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+11252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 660.1364 285.097 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+11253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 648.1812 258.5368 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.147) >>
+>> endobj
+11254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 636.2261 260.1905 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.259) >>
+>> endobj
+11255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 614.373 145.7908 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.327) >>
+>> endobj
+11256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 589.1227 221.6059 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.356) >>
+>> endobj
+11257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 565.2123 187.0456 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.382) >>
+>> endobj
+11258 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 552.5399 287.8667 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.421) >>
+>> endobj
+11259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 518.7317 145.7908 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 504.7192 296.5639 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 460.8288 145.7908 469.795]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+11262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 425.0829 145.7908 433.9295]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11263 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 399.1152 291.0445 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (page.87) >>
+>> endobj
+11264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 387.1601 285.097 398.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+11265 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 375.2049 258.5368 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (page.147) >>
+>> endobj
+11266 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 363.2497 260.1905 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (page.259) >>
+>> endobj
+11267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 341.3967 145.7908 350.2433]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+11268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 316.1463 221.6059 326.333]
+/Subtype /Link
+/A << /S /GoTo /D (page.356) >>
+>> endobj
+11269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 292.236 187.0456 302.4227]
+/Subtype /Link
+/A << /S /GoTo /D (page.382) >>
+>> endobj
+11270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 279.5636 287.8667 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+11271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.4537 255.6532 231.4089 266.5572]
+/Subtype /Link
+/A << /S /GoTo /D (page.71) >>
+>> endobj
+11272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 211.8824 145.7908 220.729]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 197.8699 296.5639 208.7738]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 164.0617 145.7908 172.9083]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 150.0492 296.5639 160.9532]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 126.1389 291.0445 137.0428]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+11277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 114.1837 285.097 125.0877]
+/Subtype /Link
+/A << /S /GoTo /D (page.111) >>
+>> endobj
+11278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 102.2286 258.5368 113.1325]
+/Subtype /Link
+/A << /S /GoTo /D (page.141) >>
+>> endobj
+11279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.5256 102.2286 278.4621 113.1325]
+/Subtype /Link
+/A << /S /GoTo /D (page.142) >>
+>> endobj
+11280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 90.2734 260.1905 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.1793 90.2734 280.1158 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (page.253) >>
+>> endobj
+11282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 708.6744 362.2721 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+11283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 708.6744 382.1974 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.322) >>
+>> endobj
+11284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 684.764 438.0873 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.351) >>
+>> endobj
+11285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [441.0761 684.764 458.0125 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.352) >>
+>> endobj
+11286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 660.8537 403.5269 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.377) >>
+>> endobj
+11287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.5157 660.8537 423.4522 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.378) >>
+>> endobj
+11288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 648.1812 511.5056 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.415) >>
+>> endobj
+11289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 638.2834 362.2721 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.416) >>
+>> endobj
+11290 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.5504 612.3157 511.5056 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+11291 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 602.4179 357.2908 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+11292 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 588.4054 501.5784 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+11293 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 576.4502 475.0182 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.142) >>
+>> endobj
+11294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 564.4951 476.6719 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.253) >>
+>> endobj
+11295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [479.6607 564.4951 496.5971 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.254) >>
+>> endobj
+11296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 542.642 362.2721 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.323) >>
+>> endobj
+11297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 517.3917 438.0873 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.351) >>
+>> endobj
+11298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [441.0761 517.3917 458.0125 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.352) >>
+>> endobj
+11299 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 493.4813 403.5269 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.378) >>
+>> endobj
+11300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 480.8089 511.5056 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.415) >>
+>> endobj
+11301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 470.911 362.2721 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.416) >>
+>> endobj
+11302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 444.9434 476.6719 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.255) >>
+>> endobj
+11303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 409.7952 403.5269 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.370) >>
+>> endobj
+11304 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 373.9297 403.5269 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.370) >>
+>> endobj
+11305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 349.302 476.6719 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 325.3917 475.0182 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 301.4814 475.0182 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 277.571 475.0182 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 254.378 425.2551 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 230.4676 425.2551 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11311 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 205.84 476.6719 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.233) >>
+>> endobj
+11312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [479.6607 205.84 496.5971 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 181.9297 476.6719 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 148.1215 362.2721 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 112.256 362.2721 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11248 0 obj <<
+/D [11246 0 R /XYZ 90 757.9346 null]
+>> endobj
+11245 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11319 0 obj <<
+/Length 3075      
+/Filter /FlateDecode
+>>
+stream
+x��\Y���~�_1o��V߇����Ķb)@ �P�Ԋ�
g��z���)^�&��M�樋���c��`�G6o�P�0.7������o�H���ߺ_��z�7)6I����ւ$HPB7�o~z��������/��p�
5�sN�O��~o���������O���
��F�h�y�7c��x�)�
��]����h��A�p�:A0���meKxф����Yu�voO��O�M���Q|����ի�^��}���?ϯ�J���z���|U��2?:�Y�������mb$Dzh��� f�X���B!���>:�>8��5�Gk	p���� �g��9�}p$�
+����n!��in�h�}�λ�T�UqMŋߋ�{ȳ_�	~��Ey�.
���F�x���:eV/d��2&7R�fm�$����UXtn�	�b�``M*%f�
�n@Ϝ��O���&"t)�o᫢��y��1����
QmD
+�A~�*,���mb�j	>�5��_���Jx��U
+���c���:�*D��$FBL��Mֱ��fSfE򼩊�ر��e�ߺ
+
�xv�'�' ?���a�nGX�B��4*?����TBm[�B
�C���ԩ�d差�B���&TF�O Ie��0�J��Z�0C�J��_�e
���ۆK׏���>�ٽ�N�b�8a��j#
tXB'�� �urͳ�B)��D1������ �pk�ʀckZ��n�P|{jvۇ�Z�������:�\���UX��n
��\����g� �rk!p

�L36[ۋ9�V�
�S��&ރ�X�'�
�1
Fw���~b���O��k�nv��?�U��	�
����*DJ�k�Fi�%n@����z� =j�p��9��
ߩ����r�����s�}`%l��
W
�LI+�u����j�Be"D��;H����K
+˛��9vo�2���T=
B�t�f=��|
�^�mN
��z��٤%ӈ0��������S�����\B�\�p*ẵZ�
+\�+�b-+ AV0�dq�c�1)�`��ZV�*DX�$F�<�
+�YA��
��J��0��X 	#�h&E
+z����D
+�v[T�)PHp<�#�T­E�A�1ž͕���\�U�p�I|�I�+Mr������\�I���o$\�H#a�:�����4�`#�pk
q��/\���ᠿ�+�
+�d�Z(�	r�i A�w;B�0L}Q�ĈFB��\�U�p%+�q%�J� �\)��B�%�T]�+
��r%G>•�9aA�4�
�JQ��VQÑT$�V��fw,��X���O^�
�)"���U�tV,�ALvq�6˨�HI"��WZ;k�JW!�WN��� �{e����Hc�E��!�뗫�_V,U���W­��q���L����_�|�~�!����{�~E}6��Rd8���ywS��U^?�T%�#��4�m�ztb�qk�#S��8	 �
�n5b
�

��4Kn��:
?���
+a�>
�L�U�0i+�2i
d�S�A&
�j�$Q��%�Akk�>�*D��I���>8
 ��ݎ�H���$҃��<ڑ��h76�d�EO�It�爇 �b��[����u�U�ԡI|�:4
 X��nGX��\^�D�5�#��D�
+m��m�� ��$�	�!"�k��/O�	f�iCV�hW!B��XG�Y�DO�B	�_�6��jҿ{�3L`�
����m�j@}X?�oVI�Ye��
�b�$��O�$�v[��wL�<
��$��J�
 t硞ڬr�����X
+�u��=�m��I=A���|�p��l�8ׄMǨ�����E������ϴKH��T	����� �g��E}$`�
��, �^*�vD�
�������C�l}z��幮2X�
�EF�SP�xbɳ�bi�35\KbjJ�
���	�� r�2�r
��'�|��ܡ_��j�F�Ǡ�T����1��A�_ށ�3F��)(+�G��vcb
>LB���OAY��[�
+�)(X�E���S�kX�o���/>��Y�Lh�E������ Nf�Z Ƙ����2�*6i�
���
��v�*"���A�1�>-��!a���ۼ�8�y
��Q�!9�%���2�ւ����`
���
gf�&%]
�#�s�J�9�
D3�s �+�0�63�S��ve{�_H�6r}j�
+1(�$�� �`��Z4�D���w�/���"��z<G���TM�{̨O�%Ɲ��eu�˫��r�g������(��Ɉ�!#V,EF��Hܭ��)��RX2r����$e���T���m�`

���E���k��U��k�IN�i ��L��8r�,�uv_���b�
>_/ɨF�'gvm/�ʇ{I+��%��C�d��
�H
�n
������n8��K��q���""�H2������� �g7�,�+�
��0�q�J��8RCA��M�����6�
�86�Y�r��8�
+��h�R�q@�8�ݎpJ��4Kh� ��RH��@:
+1 �$�� �@Fݎ@r�������G
O�/�0�+�c
⡌"��S�V~�*, ����d�iCR�y ^}�nG �3���ys��h���EW!R'��T�`Q�,�q�������%��@�;w���L�v�@��
 �nG �Cg���}d�G��?��N�

�G���$��cǨ�Gj�
�
��Y�G�����En�lK�7�(h�ezw�差���2���.����*&�a� ����n}k��0� �k1M�j��*D�뮚�4� �H�

����S�S��ҩ��V�0�o
��D�[m�'4��S2��-�^(�snk1	���0�k�wO��Y�,5�+�^�
mCZ->]��4�������p�ΖL�$2��
��B5M��]��O�5tzxL���k��>�7�:�՟��xq�����@���?c�oLAW���C�U9U�-A�[l�]���^
+� !6����_7ë��c_�����~�G9���m����^�|����gt_w*�ww���4h��$.��B^,��Q���������oGQ‡Ǭ�wG~�]
����endstream
+endobj
+11318 0 obj <<
+/Type /Page
+/Contents 11319 0 R
+/Resources 11317 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11380 0 R
+/Annots [ 11321 0 R 11322 0 R 11323 0 R 11324 0 R 11325 0 R 11326 0 R 11327 0 R 11328 0 R 11329 0 R 11330 0 R 11331 0 R 11332 0 R 11333 0 R 11334 0 R 11335 0 R 11336 0 R 11337 0 R 11338 0 R 11339 0 R 11340 0 R 11341 0 R 11342 0 R 11343 0 R 11344 0 R 11345 0 R 11346 0 R 11347 0 R 11348 0 R 11349 0 R 11350 0 R 11351 0 R 11352 0 R 11353 0 R 11354 0 R 11355 0 R 11356 0 R 11357 0 R 11358 0 R 11359 0 R 11360 0 R 11361 0 R 11362 0 R 11363 0 R 11364 0 R 11365 0 R 11366 0 R 11367 0 R 11368 0 R 11 [...]
+>> endobj
+11321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 719.9123 285.097 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 707.9571 287.8667 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.418) >>
+>> endobj
+11323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.2373 684.0467 291.1738 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 660.1364 291.0445 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.87) >>
+>> endobj
+11325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 648.1812 285.097 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 636.2261 260.1905 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 614.373 145.7908 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+11328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 589.1227 221.6059 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+11329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 565.2123 187.0456 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+11330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 552.5399 287.8667 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+11331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 508.6494 145.7908 517.6157]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 470.8462 180.1116 481.7502]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+11333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 446.9359 180.1116 457.8398]
+/Subtype /Link
+/A << /S /GoTo /D (page.273) >>
+>> endobj
+11334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 423.0256 291.0445 433.9295]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+11335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 411.0704 285.097 421.9743]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 399.1152 258.5368 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 387.1601 260.1905 398.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.250) >>
+>> endobj
+11338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 365.307 145.7908 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+11339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 340.0567 221.6059 350.2433]
+/Subtype /Link
+/A << /S /GoTo /D (page.349) >>
+>> endobj
+11340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 316.1463 187.0456 326.333]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+11341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 303.4739 287.8667 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+11342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 279.5636 285.097 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 267.6084 260.1905 278.5123]
+/Subtype /Link
+/A << /S /GoTo /D (page.250) >>
+>> endobj
+11344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 244.4153 187.0456 254.602]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+11345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 231.7429 287.8667 242.6468]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+11346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 207.8326 260.1905 218.7365]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 183.9222 291.0445 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 171.967 285.097 182.871]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+11349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 160.0119 258.5368 170.9158]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 148.0567 260.1905 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 126.2037 145.7908 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+11352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 100.9533 221.6059 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+11353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 708.6744 403.5269 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+11354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 696.0019 504.348 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+11355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 672.0916 506.5497 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 648.1812 499.9242 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 636.2261 498.2408 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 614.373 362.2721 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 588.4054 499.9242 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 554.5972 362.2721 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 518.7317 362.2721 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 482.8662 362.2721 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 447.0007 362.2721 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 411.1352 362.2721 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 385.1675 506.5497 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 351.2397 362.2721 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+11367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 325.3917 499.9242 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 301.4814 476.6719 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 277.571 506.5497 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 253.6607 506.5497 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 229.7504 494.684 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.428) >>
+>> endobj
+11372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 195.8774 476.6719 206.7813]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 171.967 476.6719 182.871]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 148.0567 476.6719 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 114.1837 511.5056 125.0877]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+11376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 104.3854 362.2721 113.1325]
+/Subtype /Link
+/A << /S /GoTo /D (page.121) >>
+>> endobj
+11377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 90.2734 475.0182 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (page.150) >>
+>> endobj
+11378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.007 90.2734 494.9434 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (page.151) >>
+>> endobj
+11379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11320 0 obj <<
+/D [11318 0 R /XYZ 90 757.9346 null]
+>> endobj
+11317 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11383 0 obj <<
+/Length 3390      
+/Filter /FlateDecode
+>>
+stream
+xڽ\�r7}�W�m��
w
�f;�D���Xʖ7�b��Xf�-E��~�3
0\D).�H�Fw����fP����3��������n��?
��q��W���ˣ���l&���.?�
8
#<�����������~���5��+G�uJ�~������g�#���G��g�*�
A at d�f�� )�l}D11��.�~�~�퀩90D&&��3	���@�~�)�#�l�[/�����O��n1���[�~��ͦ�-������œ��,��6+�hw�ۼs���; L2��	�N�	�`�V��6� �c��j���n��ŧ�m ��5�|ƥ��
@ּr�'
{�y��!)�бF阪�y-tQ�m���z���[�l�%�z�*�d
�{������g����~���%���Z> >g@
+?c��E\���#�k�3�%k��|~��7��f!]�
1�̬@c_�&V`�[�2H at 2����+�Xe��"#!���j��ʫ`e��!��.V��L�zMg

@1͡�[W��f#��Y at hZP�p�
��ۤj���ݒ|���b�����OzY�|L�o��������󥪯�G=dq5��I��b*g
��[�ƾrL,���Ή�pA�l
���DU�1��pV���_�%��a01!�ʁ��H�d�20��0��j�� ���:\��{�O�������v�e�[�nW��r�I�K�����s} �z�\�ۋ޼r짺���v�G!��Z����Eo��i�~F	D�O�Z0����(>
���њ��f���O z8���S����Qɽ���.9��v�PN0�3�K�:�\���
0Qv����@uXw\=�����2a�T��	)�z%��_ȴ&:����'���2�.d/zt!'cڅL��r�%�b�$烛
"ƾrL@�m1����(�� [...]
+Ic�!)�Hz	đL�UH��C�Ayc.
*z,�Dp at x��d �
� ՚���O 
+j:��S@���B~���0
�~kJ�^w@��f��ˣ���@��M��'
���i�:W�]��N�xCrt���tnN�hs����
��|�=�?9{}����%�VK^|��H\�Z�vEB����^���)����j
��Xb�E��}�; ѧX���
��@�OI�UE�b��9R7�_WT���m��5��'J�X�*ʋ
-�dL
Sk�~
*����/��Fm��C���O?\�aI
+�5CFg�` !ɶ�ƾrL�d�E�[gI�r���$�U.l�M����� (�gm���~�Y�
R�QP����ʄՕ�!���څ�*�v��/����v���5����
l�1{���)���B]�IH��Wo_���k��eu�Y�b�
�(�qq�LX3
 
�e�^���n��]/��F���;�|K�8(�l��̱O4dƪ��D��G۱dL{�"� ��!�M�m�; q⥇(�ކ�	DoC�aT�T���Dz!맔
�l���:ʆ��l(
v�
��dOxI������
�h��YwIo����W&�E@jY������j�5�/�k���<�m�/ᾎ!�31�P��D�XW��D��|� ��~V�s
J?����j�V6��a�&�"E��ZJQ$3�9P+�?@�>9Q��$��>j.yIck_�&���N�@-C��u'�'0��Z��]ʡ\�ֵr&�B��5OkV�-#�0L/7�DR'c��1	T�(>�e֋/�����`��O1��Rm�1�h\�m-��8JTW�6����eb��b���ONO~y��@.Oޞ=V	�6ulq<HT2���
0Y�w�#~}��z����D
@s�*�L����e�/6��׹�*C%�:�A��A�7�\�	 �^u��W�2S@��˼��
�?W�r!��<Jq�B���Ϩ]B�m�
� C0��RRdc�2aCo���P�V+��"'s
��
0��~�Y�>��D�O`�N�\XS�R��\��n
+Q,$��IO�E%ԧQA�H��D�*6�6Y
T=����Y�l���n�,\�H*pf��*v�WE�p�?N9~2���
0K�e�����
6N (��*v��Q^=� k�誊�g at jq�Z$Ԗ
{��@|I�
�M�3^kᬍ}6��o7k
R}��Pf��*֖��8��]�՞v��}�
�m$T�׏
��1]}�_{l�����RZw@��z�5��(���R�t����a� f�Nژg���vS�SK��)�
Ҧj\
ݣY|��o`�I�]�e�DY|J�7��dLˎ<
ݺYow_�w�!��_o�NJ�-󳲹RF�H0JO��q�Q��2
u��U֝���i�a�=]1h΀h�N/A���qВQ�\��z���p�<܈�
+i�c
g� O�(	�BG9x2�w�R�)x�:Rհ����}FW���Q�������Ze�Zh<Q��dԺ)%���қ�e�>�	D�h&l�-MFKgm�h.��o7k
%��Y[2�;Ԃ+~|-gd4��
�vdTF�hR�9��t�W��4l�Pk9�Ѵ�1��e�?&��̈́�j-���Yyc!)s���M�b�̏
#e������2�q,%e�)�S
��(?�()K�
�%IY�-)�ym�,`����lIYiS5���`Vf>(T��.�����13�$�ç
鰡��
V�Z��{�'���F�b?��^�	kx�+n==9�{�U�>�;�CAJA�V~9�΀�Ƭ=�%�#�%G0
6�[-���[ͅ��fM�w��Yۻ�LX[7�z�y��������X����rw@��{b�+��GYy:����=�]߯
�O:��<v�{��`
D����
+k�}F��m
/����
њ����*�B��k7�7����
c��BE�w������7���&�(
��LX�<@Q�����=Y��Ԙg4�����ƨ�J˳��Rc��9T��+=;{5����$QeF�Y\e΀T��:P,�x�y	ī,
6����1�
����d.��߶ߞ�n��/=q{Hfš
+rt�go�..ߝ�����y_�sr����wc06�/PEB��G}�[��t��C�$8�B���G7	�����
��i����/���ߎ{v��}���/V��A�Ԯ�����E�*��5X��
WD�t�4�
�����.J��?f���~����7�	gʁ_=�O���wϟ��\݁���v��緷��!gTM $��U�(�Ń_�T.��8�|��:���]�v,7��u�� �'S�?���endstream
+endobj
+11382 0 obj <<
+/Type /Page
+/Contents 11383 0 R
+/Resources 11381 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11380 0 R
+/Annots [ 11385 0 R 11386 0 R 11387 0 R 11388 0 R 11389 0 R 11390 0 R 11391 0 R 11392 0 R 11393 0 R 11394 0 R 11395 0 R 11396 0 R 11397 0 R 11398 0 R 11399 0 R 11400 0 R 11401 0 R 11402 0 R 11403 0 R 11404 0 R 11405 0 R 11406 0 R 11407 0 R 11408 0 R 11409 0 R 11410 0 R 11411 0 R 11412 0 R 11413 0 R 11414 0 R 11415 0 R 11416 0 R 11417 0 R 11418 0 R 11419 0 R 11420 0 R 11421 0 R 11422 0 R 11423 0 R 11424 0 R 11425 0 R 11426 0 R 11427 0 R 11428 0 R 11429 0 R 11430 0 R 11431 0 R 11432 0 R 11 [...]
+>> endobj
+11385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 719.9123 281.7594 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.211) >>
+>> endobj
+11386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 698.0592 145.7908 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.330) >>
+>> endobj
+11387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 662.1937 145.7908 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 648.1812 296.5639 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.1878 624.2709 275.1243 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+11390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 601.0779 208.7738 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 577.1675 208.7738 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 552.5399 285.097 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+11393 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 530.6868 145.7908 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.325) >>
+>> endobj
+11394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 504.7192 287.8667 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.418) >>
+>> endobj
+11395 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 480.8089 285.097 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+11396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 468.8537 258.5368 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.144) >>
+>> endobj
+11397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 447.0007 145.7908 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.325) >>
+>> endobj
+11398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 421.033 260.1905 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.256) >>
+>> endobj
+11399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 397.1227 260.1905 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.257) >>
+>> endobj
+11400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 373.2124 260.1905 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.256) >>
+>> endobj
+11401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 349.302 285.097 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 337.3469 287.8667 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.419) >>
+>> endobj
+11403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 313.4365 281.7594 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 291.5835 145.7908 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 265.6159 281.7594 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 229.7504 195.0456 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.285) >>
+>> endobj
+11407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.0344 229.7504 214.9709 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.286) >>
+>> endobj
+11408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 194.6021 187.0456 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+11409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 160.0119 285.097 170.9158]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+11410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 148.0567 258.5368 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+11411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 136.1015 260.1905 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+11412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 114.2485 145.7908 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (page.327) >>
+>> endobj
+11413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 88.9982 221.6059 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+11414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 708.6744 403.5269 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+11415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 696.0019 504.348 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.421) >>
+>> endobj
+11416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 660.8537 438.0873 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+11417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 636.9434 425.2551 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 612.3157 507.5259 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+11419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 600.3606 511.5056 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+11420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 590.4627 362.2721 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+11421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 576.4502 475.0182 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.007 576.4502 494.9434 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.135) >>
+>> endobj
+11423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 564.4951 476.6719 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.238) >>
+>> endobj
+11424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 541.302 362.2721 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+11425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 541.302 382.1974 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.316) >>
+>> endobj
+11426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 517.3917 438.0873 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.344) >>
+>> endobj
+11427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 493.4813 403.5269 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+11428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.5157 493.4813 423.4522 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.369) >>
+>> endobj
+11429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 480.8089 504.348 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.403) >>
+>> endobj
+11430 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 457.6158 425.2551 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+11431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 433.7055 425.2551 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 409.0779 507.5259 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+11433 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 397.1227 501.5784 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+11434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 385.1675 475.0182 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.135) >>
+>> endobj
+11435 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.007 385.1675 494.9434 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11436 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 373.2124 476.6719 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.239) >>
+>> endobj
+11437 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 351.3593 362.2721 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.316) >>
+>> endobj
+11438 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 326.109 438.0873 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.345) >>
+>> endobj
+11439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 302.1986 403.5269 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.369) >>
+>> endobj
+11440 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.5157 302.1986 423.4522 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.370) >>
+>> endobj
+11441 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 289.5262 511.5056 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.403) >>
+>> endobj
+11442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 279.6283 362.2721 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.404) >>
+>> endobj
+11443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 242.4228 362.2721 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.292) >>
+>> endobj
+11444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 242.4228 382.1974 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.293) >>
+>> endobj
+11445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 218.5125 425.2551 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11446 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [472.2084 193.8849 489.1448 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+11447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 150.114 362.2721 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.1087 136.1015 513.0452 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11449 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 102.1737 362.2721 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.298) >>
+>> endobj
+11450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 102.1737 382.1974 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.301) >>
+>> endobj
+11451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11384 0 obj <<
+/D [11382 0 R /XYZ 90 757.9346 null]
+>> endobj
+11381 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11454 0 obj <<
+/Length 3453      
+/Filter /FlateDecode
+>>
+stream
+xڽ\io
7��_1�%ki�����
�8�+� I0�H#{i�
��x���l6��a�0�Ѽ:�MYU䈬0�#+�WJ(d����#�z��ꈌow�~>?9z�/)VI���� 	����ٯO����g�
�~�͊c�������sn{���k�
&�����_ǫ3p�#���b�^`D����#N�{qq���G�gx��=� ,��A0�L[)���u��1O6������Ż�۳�f�|��asx��'_\�on�����������TM�z��[�W#��A��B���T���h�8�)�\�D�xTì��A����_%��m�O���u 1B�E̽:���O�)s�#~��1��"��� ��-��ӦTJ�AXQ2���6��6�4���Vݛ���c������xL��Ϟ�$�/�����5���pnE6��QHnVR	D9W
�<�
2��>�$�)VH)%"�1cհj)
1*Mo���v}�;?�����`�e���ٽ��3�~8�ݼ��o.�/_o�3lR���r%�Nd+�<�
2l&z�����Α2\DDtzTì��(�%���o..>��0d�y)��B�C��Y/X�	�	
�&��zw��Z��ڜ޾w2a��Z,��P�F��5��9P&�j�2�R
=�{'���b
+=�F� ��#�L_`�L^�`����R�Z4��
+��a
�a{�sxX����"1���S5h�
+2-��w��me����W������:��rp�|ws���8�8D��ɵ 0o��w�@��D�u��8��� "v fԡZf]��CƘ�W��YZ�A R�=���P S�%z{Zx�$Qlx�@\s8T��D��sN�Ѳ~��am�ք��Ո��S�
V��rTUmz��F�1�f���j�)��;*���U���.ȕ��޾�"��%�
+�$
��j��U�S	��
��˾\xu
�۳7����^\ٚ���p��5����2��f��](�k>c�=�4m>�B[�g�,:Tìe[�zX����;��O>��;����Z�������2�J�����4bB7x�w>����~��龠�he:�
'�5l�fR"�ya����	��T˩
j�9�@�*�7s��^�,'�q``���=3���}�
��6��]��\1��E��~
�
2ٝ赾j��7�㐋s�qr;T��~>?M0����2�J;��z��Z�F|
+�ֽXo?="��l��$�Ljj����I�0s�W�Z��Rz-�bm�w>W�EZ{Fxʈ
�r
YO*�T�����#�Ȃ�����?��l{������C�7��PE�Z�
�����z��.v�s�=bì'Ia�$�3��ږNcC��8v�em
;w�8�����i,i��-�����KbHq�?w�8㯛���P�
+����r{�=\����\�D���V��.ȅN���r0��S�Μ�d��
�0;��8�F�a�	
�41��j���|.l"�/&W?(�"�IЌ��͉J��X?t���,
)�����?*�#��őB��D
��ؚ�#��.E
,u
/��]���Lq��;Pܥf
AD+X��
�.��X �ˏ
B�C6
�+
�
(3T7��
��zW6�y��\@{Vm����l��p?d�5,��B�� �f2:|
+d�1��3)�M�b$��
��ѡf'&��ŀˇ����P��1bq�
+T\kM�܆YO�q�>�|�`��6d9}�@�>k���髛u��8�3

u-��N��d4�SV�����hʨ��)2�1�$�1L,�P�sN
+�1j�Q�b.��S��r���L/����1�ޞC���0$���+9
�0k[e�	�_��Q���_P���P1���ǀ���C����\�i7�
�jƈ�.��y��.���-4�L��`/��!�P-�.,gc��Cr#���/����4��B)�Bذ��
�j�M�Y������w�<$�ZH8��Դ
3�!Q7�RQB!�gwL�%�H
ar̍��P+	�S�6cm�w!>j����Jh$��0�
�C5�NY�
��Sc{h.�&^U��|��Xkad,0�#��z���ۜH�R�K��71��NӔ��4q�.�P��-
���S;o��0;��� L=�&�"B/_�B���aîf�K�܁��0�H�@W�؃�������V�߅��&�[
h5��:u�@�V#�av"G*$����s0�O�Z�� �B|n���v>n4��:��Ԡ�as�E�bg�4M�ǥ���T�gH1�,$
�
2���
�Kkf�*#c�s��Y�
#H�%�{�y;��V [...]
���؁�.
Q
�-`
��C��k��\^�����!�O��ńk��1�'�\���rD�$��.�坃
wcy9�f�3�n�SH(�lA�|��n��=���������{��u
��#n���](�y�Do�^��s�31
;g�C��:��ֈQ� C����=���"[.����X���@%==�g��bz�
(�gìgGr�>���$�"���V�P Pc���3��v�@���Y�����'��RX08���E��Q��.�g��Xk���3�:���98�6'
+��%���|��i����a�$k~���P ���z
��vE�42s7`Z&
u�P(H��>8����ݡ�,�.�P�a��ӑ���u
��:���
|�SS��Ѕ;e�y��|n�i
Ni�3�Qs�IS<��6'Z�D�,��͒Q�o�h(P9��Y;�;P<�����
i�W�������6P1|��7l{����](��'�;��
sT9��3�f'~E3qG~n�/��J�ު!���le�w�@n��
H��l�E�#��he 5���<{��p�
~�� �×B:J���=���?݀�2���P�R�yX�}�@�xk�u�J����|/�z��`����V���.�Ei�w�
g���~��F0�fSm�o�O���P�J.��@��:j�;P���Y����U'觏s�~�l�B�J���
+j�;X3g�y����H��<��W��,ė��f.f���ӭ���X����/��
���
+�t�(
��b�Ál�(`f=�B�
F{�Z�7
։�A.���f��&�{�e���P{:<�
'���׍��0�t���r�@�?�l?����������b��7,��*�̡�~	���Ö*x�����r�M�b*
�*�`����+�ӷ�9F�.����
+
9�k�����'O��}��ޠ7����n�^__<���*6�+� ��ė��
�Ra=���}����0~
����Sd�!Fia�u���/��endstream
+endobj
+11453 0 obj <<
+/Type /Page
+/Contents 11454 0 R
+/Resources 11452 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11380 0 R
+/Annots [ 11456 0 R 11457 0 R 11458 0 R 11459 0 R 11460 0 R 11461 0 R 11462 0 R 11463 0 R 11464 0 R 11465 0 R 11466 0 R 11467 0 R 11468 0 R 11469 0 R 11470 0 R 11471 0 R 11472 0 R 11473 0 R 11474 0 R 11475 0 R 11476 0 R 11477 0 R 11478 0 R 11479 0 R 11480 0 R 11481 0 R 11482 0 R 11483 0 R 11484 0 R 11485 0 R 11486 0 R 11487 0 R 11488 0 R 11489 0 R 11490 0 R 11491 0 R 11492 0 R 11493 0 R 11494 0 R 11495 0 R 11496 0 R 11497 0 R 11498 0 R 11499 0 R 11500 0 R 11501 0 R 11502 0 R 11503 0 R 11 [...]
+>> endobj
+11456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.5064 719.9123 283.4429 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 696.0019 290.0684 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 672.8089 208.7738 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 628.3207 145.7908 637.1674]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+11460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 592.4552 145.7908 601.3019]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+11461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 556.5897 145.7908 565.4364]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+11462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 520.7242 145.7908 529.5709]
+/Subtype /Link
+/A << /S /GoTo /D (page.311) >>
+>> endobj
+11463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.7796 520.7242 165.7161 529.5709]
+/Subtype /Link
+/A << /S /GoTo /D (page.313) >>
+>> endobj
+11464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 482.8014 180.1116 493.7054]
+/Subtype /Link
+/A << /S /GoTo /D (page.215) >>
+>> endobj
+11465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 470.8462 260.1905 481.7502]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 446.9359 180.1116 457.8398]
+/Subtype /Link
+/A << /S /GoTo /D (page.273) >>
+>> endobj
+11467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 434.9807 287.8667 445.8847]
+/Subtype /Link
+/A << /S /GoTo /D (page.405) >>
+>> endobj
+11468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.2662 411.0704 278.2027 421.9743]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+11469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5985 375.9222 184.535 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+11470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5985 352.0118 184.535 362.1985]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+11471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 327.3842 291.0445 338.2882]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 315.4291 285.097 326.333]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11473 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 303.4739 258.5368 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 281.6208 145.7908 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 267.6084 290.0684 278.5123]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11476 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.5064 255.6532 283.4429 266.5572]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11477 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.2373 243.6981 291.1738 254.602]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11478 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 231.7429 281.7594 242.6468]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11479 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 219.7877 260.1905 230.6917]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 197.8151 145.7908 206.7813]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+11481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 173.9047 145.7908 182.871]
+/Subtype /Link
+/A << /S /GoTo /D (page.329) >>
+>> endobj
+11482 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 148.774 221.6059 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+11483 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5985 124.8637 184.535 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+11484 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5985 100.9533 184.535 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+11485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 88.2809 287.8667 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.423) >>
+>> endobj
+11486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 719.9123 494.684 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+11487 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 686.104 362.2721 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11488 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 672.0916 511.5056 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11489 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 662.0741 362.2721 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 636.2261 507.5259 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11491 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 624.2709 501.5784 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 612.3157 475.0182 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11493 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 590.3431 362.2721 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11494 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 576.4502 506.5497 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 564.4951 499.9242 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.6565 540.5847 396.5929 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.195) >>
+>> endobj
+11497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [490.7186 528.6296 507.6551 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 516.6744 511.5056 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 506.8761 362.2721 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.211) >>
+>> endobj
+11500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.6565 480.8089 396.5929 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.215) >>
+>> endobj
+11501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 468.8537 476.6719 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 446.8811 362.2721 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+11503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.6565 421.033 396.5929 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+11504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.5905 397.1227 411.5269 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+11505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 375.1501 362.2721 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+11506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 351.3593 362.2721 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+11507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 326.109 438.0873 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+11508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.0798 302.1986 401.0163 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+11509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.0798 278.2883 401.0163 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+11510 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 265.6159 504.348 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+11511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 253.6607 494.684 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+11512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.6691 241.7055 491.6056 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+11513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.2578 229.7504 513.1943 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.436) >>
+>> endobj
+11514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 195.9421 362.2721 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [492.0784 181.9297 509.0149 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 171.9122 362.2721 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 136.1663 362.2721 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 122.1538 499.9242 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 88.3456 362.2721 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+11520 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11455 0 obj <<
+/D [11453 0 R /XYZ 90 757.9346 null]
+>> endobj
+11452 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11523 0 obj <<
+/Length 3520      
+/Filter /FlateDecode
+>>
+stream
+x��\ko7��_�/���;
ߏY I��ݼ��@w�BPl%j˪,7M�^�
9�CN�$� ��9������;���?�0x��B�q���>‹7��o�H����Mxx~t�)I���u�A$(���˟�Ϟ~}���/��-8�
	���9��G��^{o\0I��ߎ~�/.���0bF��;��1�.��8e����ˣ~�A+�� ,3AG��
a)X���n�_
n���{�@@�տ:D�L!ŵ��[*J&Z.B���Ϟ�q��_���o�޿]_�W�ǛW����W_=z�����������������c�5H
,�DD?z�d����x��&��\$Z��D��:�H.b�#�=�b��ȗZ��3����
������B%�j�V&��P �2��Rcp…�s9v`čGU�BpJ%�\e������c��φ0Da:\0�:ُ7��j�l�`&�\E��������6
S3�_HAc�����P 4�^��*q�p��;0U������
b��O2


*JD#* �~�"q���
+J3�`��
����Y;C�!�����49�,
2g�sq(PH�
�ec9��c&�qŬ��R�����I3?C�B�9T}r2�"��W�9�em���3����k�GZ��&;7�
�(��J����MXk�3����Z�����Gd~
���J��@�IVKd�ӱT4k��
+i�M㭆���
$3���ev.
�T�P�LY�Lde�.�qE�R�<�%�����/(ğ��RY��d�U�&���l�}:���%�⨇�V1냆��HQ��%�HJa�b}�:d�Fj$
��ID8��߄�q$z�L'�pKH0=v`
4U3��
���̤������g�G(���go����Q
wj����4u%���9�������~ʔDL���i(P�g
V�Oc&�Y�,�$G��x?���{�����n��X�=�'�pʷTWz߄�
D���F�J{�<%#�
D�����q�DL�����x>o�@�7�x�ӼEL�V4ky#	mdD�������>}�6���:��Ұ�i!
s$�-Y�oB�
��^�kf/6���ld̟CU��̈́����4E�
~�|�v�˄��
H���Z[��7�@�-8�ۆ1��@
b<v 	�
U1;P3�(���>��#e�S��
�TXq�&Ȱ��mY�)+� �cƬ8T���
+l�J�O{ �B"M��}"
+
+G"���c&E��#�B�O�����;(d����N;0���frE3��^E@��5��V#��7�@���ީW�4�zd?��
�ft�+�AM126��^,�@i�8X7d2�X"�K٬���1�|H<�΃/��
�י�
��"
��~���gz|
+�4c�
}"[�1v`L�C��:���tF���a���lW�\�p~brPW[O=�	r�i��=�`�+o ����EU��(�N���pL�J�L}# �:(��7=�	r��XoǍɕ�J��I"�Q�7� ����f���8
Q�=���7�@���mi�i�X*��
H
+�
U1;��
�@�<Z��q�+a
+QI��

+��u�Ʉ
;0��+f=AT �甀1A�^I5i�� z~�JI��Z
+�Nڑ�I�l�S�	b���R���zs�]]M
�|0@�9�c,�B̡�.
���#�1;p�C
+
��	�
(���*2�TTn�v�����r����*��7�CZqrJ�j�@�\{y��M�OG�hm�I-�aibCF�G:PŦg1���������J����<�r}'�;ц��_�xg���Lz��{C�?�:�
��|��u6хw�E槨+��ԅ��*ԝPq�n�ϵ��Hq8�ϼ���[H����%K�n�h���O
U1
�)���R�
+��>CC�C)-1L��
+�j���M���7�����C`��`<�>�`�@e�w�m���as
���6�VWw���_����s�'��ʔ'�K�Sb���%tu}:|
+dF��m��4����k�؁���P5����R�3K���6C-��\�
�����я?.ᄾ޿���U.���j��U	=�oB�L�%z�O��;�=`@����+ס*V҂�AϞ��=9�����6|^�p|�����'��;w9h6w�@����Q����4wE�w� ��V������rg��|dp�5��
7(-��zM�A�
�^�e��Gn2p��x�;����:���4��P�@bt����[OO��$���Da��u���j���]/W�
r���͛�GR:������꫐��	
+�����
5��L��d=S6;�	u��*fs�
�>���m��.r
�.Z*(o)���I��&ȕ�c�]Y�֎�\��"�ºG��:�_�0G���^<xrz~��#��4��Be��t~
+	�ú��L ��	�b��(8�Ý�����v�?7�
�l��;Q(P����
FLsX6�9$���V�p5�{��`˨�����Y��Ǻu N
��Û �[�#��F�Ӎ�@��|d}L�Ul���}+(Uߚ|�����g�ΗgO�dpA�d`����%߄��$�;��_�R���͡*fF4E��n>�(.1�� _���P CG�w�U�Qr�������K�*�‡�x�5��
=~�������g�
0T��=	�4��n��7�@��1�۽KQ�ѱɹ�GU�YR
ҵ
C,����l�;h%�8|
+d\H�N��I��
�؁$?���Y?rƑ�<��s&!��Z��7>��X�԰��%Y�ځ*6��)E����� �8��%�S���)��M(�����)���؋o�ɔ���Y�/F��4���e�qV^1��
��
+V��MV4�Z�
�\1�.xT�X�wNAu�R ���\
2
+
�	2�$z'(�Xt_��
H=�f�S �PL�d
���6B�Bވ|�;�	����b�-
""���dvNe{^��ov�&��v�Xg۪�-�H=2��1[P����(�ߵ�Zm�����H2�k	��7�@.��Z'ICp�d?Y�=�f��D�������¶Ȗ��چ���;�6z���e+���M(�	�Do�	N �5�ǀCU�LP�����׷�G��;�o{������f�&S��0�x�
��M(�+��z[2hZ��� #�Iޣ*V2�@���	mWj߾)Y]-o�,-�
��o$��؛鄑AW��oB�
3��	f��S{���'��
U�:0�bڐ��>4��o�6V�w,�4��K߄�,"�D0����~r͢GU�������A�J"	��i���{t3�s
�Xg�
KCP���r���b8k���0��mF��?L���$�={{2�e�v��ox����o�'p&���G7	��~&�?ܮ�?�����d��[]u?���ݪZ����~	�bX�T�S�N�|�r�Nos*����
lY���p?�;���
4�D��T0�D�
���a�ս{�޽C��n�����po������a�b�_��
-(�%��6���:�V}G�5��O�-��M�(�"@�����$endstream
+endobj
+11522 0 obj <<
+/Type /Page
+/Contents 11523 0 R
+/Resources 11521 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11380 0 R
+/Annots [ 11525 0 R 11526 0 R 11527 0 R 11528 0 R 11529 0 R 11530 0 R 11531 0 R 11532 0 R 11533 0 R 11534 0 R 11535 0 R 11536 0 R 11537 0 R 11538 0 R 11539 0 R 11540 0 R 11541 0 R 11542 0 R 11543 0 R 11544 0 R 11545 0 R 11546 0 R 11547 0 R 11548 0 R 11549 0 R 11550 0 R 11551 0 R 11552 0 R 11553 0 R 11554 0 R 11555 0 R 11556 0 R 11557 0 R 11558 0 R 11559 0 R 11560 0 R 11561 0 R 11562 0 R 11563 0 R 11564 0 R 11565 0 R 11566 0 R 11567 0 R 11568 0 R 11569 0 R 11570 0 R 11571 0 R 11572 0 R 11 [...]
+>> endobj
+11525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 698.0592 145.7908 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.5064 684.0467 283.4429 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 648.1812 195.0456 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+11528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 612.3157 195.0456 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+11529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 578.5075 145.7908 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 552.5399 195.0456 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.286) >>
+>> endobj
+11531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.0344 552.5399 214.9709 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+11532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 516.6744 195.0456 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+11533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 482.8662 145.7908 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11534 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 456.8986 195.0456 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.286) >>
+>> endobj
+11535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.0344 456.8986 214.9709 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+11536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5985 433.7055 184.535 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+11537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.5985 409.7952 184.535 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+11538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 373.2124 195.0456 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+11539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 349.302 290.0684 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 325.3917 290.0684 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11541 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 301.4814 291.0445 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 289.5262 285.097 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 277.571 258.5368 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11544 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 255.718 145.7908 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11545 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 241.7055 290.0684 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11546 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.0878 229.7504 295.0243 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11547 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 219.7329 145.7908 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11548 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 193.8849 180.1116 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.195) >>
+>> endobj
+11549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.2373 181.9297 291.1738 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 169.9745 281.7594 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 158.0194 260.1905 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 136.0467 145.7908 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+11553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 110.1987 180.1116 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+11554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 88.3456 145.7908 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+11555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 708.6744 438.0873 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+11556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.0798 684.764 401.0163 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+11557 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [384.0798 660.8537 401.0163 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+11558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 648.1812 494.684 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+11559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 624.2709 506.5497 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.178) >>
+>> endobj
+11560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 590.3431 362.2721 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+11561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 565.2123 425.2551 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 541.302 425.2551 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+11563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 506.6569 362.2721 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+11564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 470.7914 362.2721 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 434.9807 494.684 445.8847]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+11566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 399.8325 403.5269 410.0192]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+11567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 365.307 362.2721 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 329.4415 362.2721 338.2882]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [380.2446 303.8475 397.1811 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [451.6364 291.8923 468.5729 302.4227]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [430.0574 279.9372 446.9939 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11572 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.0923 256.3705 427.0288 266.5572]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11573 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.0765 244.4153 370.013 254.602]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [359.7215 232.4602 376.658 242.6468]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.3766 220.505 367.3131 230.6917]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [353.0765 196.5947 370.013 206.7813]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.8085 184.6395 406.745 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [359.7215 172.6843 376.658 182.871]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [416.0097 160.0119 427.9649 170.9158]
+/Subtype /Link
+/A << /S /GoTo /D (page.65) >>
+>> endobj
+11580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [357.4998 148.774 369.455 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.71) >>
+>> endobj
+11581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [405.4895 136.1015 417.4447 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (page.71) >>
+>> endobj
+11582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.3062 124.1464 450.2613 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+11583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [483.1169 112.1912 495.0721 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+11584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1606 100.236 433.1158 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+11585 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [475.6454 88.2809 487.6006 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+11586 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11524 0 obj <<
+/D [11522 0 R /XYZ 90 757.9346 null]
+>> endobj
+11521 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11589 0 obj <<
+/Length 5345      
+/Filter /FlateDecode
+>>
+stream
+xڵ]ko$�u�>�B�� U��caٵ���w��
�g�
�%�4����\V�n���5��5F��{��,��qJ������g7V��Kenn^�����~���|>��o~x���7����n�`��7?�������o~�_o����os#���+e�o_���
ɵ4<���������A%~����;}�	~`#�^�<�RB.?ܿ���`����@�
��J#�H��[hyc�
���*��������|y������Q�����'���
|H��QCM
+�
���ٳ�#�"��s>r�D����OJQ
+D���I��mi 8�2�B�Dq.
+�G�5
+��t�=
������8
/w�����]���>f
F��C�.k�E�d�����L�	W@6x�\_�����N�/%�h��kJ���5=�-I ����
M"�`]E�zJ�Y�wo�~�#c�r:���O�b�h,�kA�Y�CZ�R�"�$�(P��Ao˟?!
�bE�
����zj(a=
Њ�e��"⇴@m���6�p���f��XQ+*��(��鷏/w��Î�!��`J���c�i���Qĝ�P?��"�ϟ�E��rH��zі��Aw0҅/h�A(���@E�"nC8�eƟ+���U��P� χw�LJ�����_�O�����ͨ9LZKq�aY�C��T*�*e]�7ͨ��r�:D
A�*@GRƹB������;>U$��[���4��!-P!��R����6��E��
2.�r������
�������
|t<<�KAJ���5��caJ�h��!CDQ��
�vz���J~�
|Wܬp��
~H
T�Q�m䗐m0�dƟO
�b��Ü [...]
�
�����t9]����ݙU�ק-�k�[L�!-P�۸� ��-��<�t�	E���H]��}Iڙ�d��4n�C����@E�"nC8����ʂ�X�h��l����4fw�<I��m����aAI5zA�kW�~�<a}8>8�>�U�GmF��Y��t���@�
E���֧^p����ł�X���m9+���|y9]�O�/00��'a=_K��ӄ���iwҁײ'����+�ӄ�X
��uYH�&
�a�x��#�1�ԕ܁Ar_�r�����!��Ȣ<��nޖ��
"�bE�
��H�?�`H�<
+
�PLj���|�1Ȣ֗� �p�%/
�"(��V���y
+z8_Z��V0�#�jx�i�Z��S�}�t�AR��m�(�o��4$���	&—��?���|ȼ��k��?�j���N]����1��͏(�����4?p�;ΓRB����˯~5C���*de�>}r˸01!%�q�CZ��q��m8
�p���E���Ҍ<
2�����?J��Z��??�j�'���?�c�g�E��(��/`�q�O����q�;?�_>T: �
,Cu�����ǝ[;Z�SG��
 �(VT�
H�
�=�����%
�2
,����|�`#��Xxˆ)
,P7�űF�)WQ��V��*�
��
g�F!�X�CZ�"H��$�^�̱��%YP+j"
,[���������Sr!��ZnG��CZ��cm�vr,�E�_˱�bE���
�?�����l��5�[�D�g��+U�b6�a55��y��YD�ύz�P���y
�53�0�Q-^P)~ѐ�*�������Oϝmib��kAja�CZ�����6�w��/[�baQ+� ���z
}?^��Cez�0\s����Lj���1�[_Xr
8H�3�bz�(�ۯ�8���O�

���v�е�����	< �~6�Dl��$�Ni+�2�G�ٍn^��?�	�x}8
��x�����z<�����x�����������SesM�0��5���CZ��ϔǭ�2J�a����LE��
��Q;o�k@��Eu�㞫�=�M�!-P���qCe8SeG�#�y��/�(ZԀ�p-BW4��4�0��ܺ$�'"~H
��D
�!H�5ąY�NQ-
+"`p6�ˊ ��+f ��R�Մ���m�YS�
+?2��
+�"�(Z!ddB�T�0�ȗf
Au����n��m(" +���(VEЮ��[T0h��ɥ��
�	�}_2���e���y��.��DA�M�ft\�Jۉ� �֐�b�L&⇴@�L&�ېC@����+P
EЮ�(5�p@�E�G����i����Mm�G�6u^�b��(�E�b�L�T��N�!�n�CZ��-�"e^��(��Y�nQ��1%\�\��nC�����ԟF`~��~
Am/D���m/�qgE�Cni!Y�.�@��Q�s0�JN*��0\x葰��3��
R���Գ�ې��#a=��
++�hy��#s�5�i*�;ƍZCPw "~H
�� �q[���`��*Pt��"hWE`���Rb��ndL�5
!ς�y��-y`4�����YP�*,���w޵}
���~
+o^��T��2%�0
�蜑�j,(�tU#�
A�_xy�콼��\��T�����h�
+�DA����0���},���~Z�s{S!�+�>��
+IkDQ���УdK��e�������i����M�8�
�2��n+P��8�(Z���Qj>��M�x�S�pj�7⇴@m�7���m�0����(���X�Ԗk
ܻ۽�q�v��
��jvQ������j�	��]�=���`0�(����Uˈ����y��`�
y*�-'A�r8�J
+��������
O+�c!z��C�����s��kC �>c߶2T��y�!��PI�6���fT,7bf��-̭NʽQ�n�2nC�p�FO�$�(�vU$�e抜�
���Jj�`���5{
��'ܛe��S�t�M�3�(�I
��|��?3}�t�;]Η���I)y���"���,��:�Z�dB��gA}�U�Ԕ�n8�q�`���-�x·YƝ�e���t���"hW=Rw����#��}��N88���
��

z���F����:4�{��
���
E<��,�΃h9d��� m��QD��
�u���)>ݞ�{]��'��eܦ��P�mQ�*Ej���[k�
�r=>=�[j�Q���B"�0p�q����5��EE[D�^A��i������O�q[Ӈ�z2��V/(�v��1u����:?
��4Q m��Ex߼ZD���e�1U3���"�Ϲ
+��Sw�DëVDx��N�,�	�jwV��#�
w�t�.�(�v�!��Λ��/,g�֒�k�E<aX-�6�Ӥ3a3��}���h����Ɇ�M�˽6�N�U��s�E�����}�,�(Vlz�H=}���|�x	^��cg�
�4��n�,�	�jw�C�s��

:y�*�(�v��gZe���	�;���'L�e�ydp��ـ���EA����^�pE�s�wze�7�Q[2�
�
�]�,������,�d�N�n�Y�m�����
_����ݲ�"hWM~�[V)����]�����Z�Bf�v=��"8WER��w��["\�>�}�Q�F�2n� (�Sa���GA�ʐz5��Yi%��~�g�{��;7ޗ�����oEE�4k�a�U����FO88˸��K!F�a
EA�
+��6+:[�Ə6
L�3�"���,��q
+f.��R�9W=R+'�&�ގBC7��,E<��,�6����Ĥ�[KEѢ
+����p�L�����!e�^�)�	�g��q��_2�w�"��-�շ  A�Ց���O��q�V�郅zrm�V/(�v��1�
�H
���])�F#�^��'l�E���fz�N�YD��2�guQ�
w묆����"�p��q[�5 !�0�"��]�Iͬ�4!�گ
� L3��o�x��Z�m�\a�71��[D��2������g�f`a,v�kt���l�a�p'O���A}�U�Ծ�|O��a��vR�	MxY�=}��|��k�EEZD��
2
eL�v
#��/�έ.g�0�)/��FE�|��n3�����u
#���q���1����ˆ�h���w��z���E��k�E<ag-�v�X�Y���Q-�?5�����C:v#�^�-�	'l�� ���P�o�EE�
+����
:$L�N���[�N�2n�����l߀�(�ۏ��kX�ޟ/��u�
+ď�s�ˉ��96��Ai3�6
+.B�l�8��F���m��>�&bkqe�����q���֯85�^Oq?2���g�
�
�	C�>�1�	�ow�2\����ƈ"hW5RooK�J�(9D��}�c���2nSh��<Lj"hW9Rgo!G�V��bv�����p��
+���E�oK��A�^��'
�E�VϘ�p���!W
Rco��Mҩp��5#�p��q[��އ���o2FE[D�OП��bo�OЗq����Q:+��F�j��O��|]���q��s�����ZR��	ͻ�k�9WURo󗾯JI���k��2nK-�-R�w^#��]EI���燧��χ���/\
�;Q�R�Q�`����F<a�.�.f[I��}/6��U���L��k:�P��5`#�pB�q;��K�7`#��ER�s�E^Rsx���k�F<�z.�6��1�eZ��ֈ�h����z�ۭ­7g�X
ҷ�&���ߦ��m]*0"�����t��E
6f��뭤
Gʒﵕ#��w�qI����q���rDQ�ᯕ���n�_��ݟ��������
��p��	�{)��s��񄫹��|^��+�5S#���~���o����&�
��{m�
��0Q疋����0N#�b��:��t�a�K�ߪ�G�u�Ȟ�������c�/��{]ƈ'�e�Y�r�Q����}�1��U���ۗ������5
#�p��q[�hEM�p�(�v}�R�+�b5�O
F���[�V�2,SU
����
���hQ���J�G,
�hL��|��'
�e�Y�r=?m�
���"��ER�+�֬����_��g�E8�oͣ�:��}�NԱ��G�^
���5vn��E�u���a���f2��a�5��Q�Q�d����&��j
���@4�G����|>]��֯���p�|<�����i6/6�a�9��ʞ�'a�S>�=���O����,��l^*8�4��7˿�5�s/����7xm��"�t�����믾����x�<~������嫧���j�Vn�U
�FPQ�����=-�6uy�x��zx�Ư�|�_>L[Ycq��W��8y��endstream
+endobj
+11588 0 obj <<
+/Type /Page
+/Contents 11589 0 R
+/Resources 11587 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11380 0 R
+/Annots [ 11591 0 R 11592 0 R 11593 0 R 11594 0 R 11595 0 R 11596 0 R 11597 0 R 11598 0 R 11599 0 R 11600 0 R 11601 0 R 11602 0 R 11603 0 R 11604 0 R 11605 0 R 11606 0 R 11607 0 R 11608 0 R 11609 0 R 11610 0 R 11611 0 R 11612 0 R 11613 0 R 11614 0 R 11615 0 R 11616 0 R 11617 0 R 11618 0 R 11619 0 R 11620 0 R 11621 0 R 11622 0 R 11623 0 R 11624 0 R 11625 0 R 11626 0 R 11627 0 R 11628 0 R 11629 0 R 11630 0 R 11631 0 R 11632 0 R 11633 0 R 11634 0 R 11635 0 R 11636 0 R 11637 0 R 11638 0 R 11 [...]
+>> endobj
+11591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.5697 720.6295 184.5249 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4451 708.6744 188.4002 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.6837 696.0019 268.6389 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+11594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.7894 684.0467 269.7446 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+11595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6757 672.0916 177.6308 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+11596 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.3978 660.1364 190.353 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+11597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.9682 648.1812 216.9234 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+11598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.6904 636.2261 229.6456 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+11599 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.5141 624.9882 207.4693 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+11600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.1215 613.033 208.0767 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+11601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.821 600.3606 202.7761 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+11602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.1154 589.1227 159.0705 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.9269 576.4502 195.8821 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.82) >>
+>> endobj
+11604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.1362 564.4951 228.0914 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+11605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4386 552.5399 219.3937 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.87) >>
+>> endobj
+11606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5742 540.5847 228.5294 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+11607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.2964 528.6296 241.2516 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.83) >>
+>> endobj
+11608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.2404 528.6296 256.1955 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.84) >>
+>> endobj
+11609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 517.3917 167.9175 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.87) >>
+>> endobj
+11610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.2828 504.7192 202.238 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+11611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7824 492.7641 191.7375 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.2024 481.5262 165.1575 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.78) >>
+>> endobj
+11613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5485 469.571 163.5037 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.79) >>
+>> endobj
+11614 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 456.8986 167.997 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11615 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 444.9434 174.5582 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11616 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 432.9882 170.2983 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11617 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.0404 421.7503 178.9955 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.77) >>
+>> endobj
+11618 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.4036 409.0779 263.3587 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+11619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9679 397.1227 232.9231 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+11620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7723 385.1675 191.7274 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+11621 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 373.2124 146.2389 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.87) >>
+>> endobj
+11622 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.2277 373.2124 161.1829 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3886 361.2572 203.3438 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+11624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.3955 350.0193 172.3507 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+11625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.3706 337.3469 208.3258 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+11626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [248.2353 325.3917 260.1904 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+11627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.1952 313.4365 196.1317 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+11628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.182 301.4814 258.1185 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+11629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.0705 289.5262 200.007 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+11630 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.0574 277.571 261.9939 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.106) >>
+>> endobj
+11631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.5697 266.3331 189.5062 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [234.5565 254.378 251.493 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4451 242.4228 193.3816 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.104) >>
+>> endobj
+11634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [238.4319 230.4676 255.3684 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+11635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.6456 217.7952 238.5821 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+11636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 195.9421 145.7908 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+11637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.0201 181.9297 231.9566 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+11638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.007 169.9745 293.9434 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.105) >>
+>> endobj
+11639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.6837 158.0194 273.6202 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.7894 146.0642 274.7259 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6757 134.109 182.6121 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.3978 122.1538 195.3343 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.111) >>
+>> endobj
+11643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.0782 110.1987 169.0333 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.97) >>
+>> endobj
+11644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.0221 110.1987 183.9773 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.99) >>
+>> endobj
+11645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [202.7462 98.2435 219.6827 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1188 86.2883 195.0553 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [456.587 719.9123 473.5235 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [431.5214 707.9571 448.4579 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [441.0856 696.0019 458.0221 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+11650 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.4496 684.0467 438.3861 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+11651 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [434.1718 672.0916 451.1082 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+11652 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.9954 660.8537 428.9319 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+11653 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [412.6029 648.8985 429.5393 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+11654 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [440.936 636.2261 457.8725 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+11655 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [460.8613 636.2261 477.7978 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+11656 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [429.2103 624.2709 446.1467 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+11657 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.3023 612.3157 424.2388 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+11658 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.7896 601.0779 387.7261 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11659 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [363.5967 589.1227 380.5332 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+11660 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [436.084 576.4502 453.0205 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+11661 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [432.6175 564.4951 449.554 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+11662 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [423.9199 552.5399 440.8564 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.118) >>
+>> endobj
+11663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0555 540.5847 449.992 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.111) >>
+>> endobj
+11664 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [445.7777 528.6296 462.7142 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.112) >>
+>> endobj
+11665 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [419.4968 516.6744 436.4333 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11666 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.4437 505.4365 389.3802 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11667 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.7641 492.7641 423.7006 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [468.7509 480.8089 485.6874 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.109) >>
+>> endobj
+11669 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.2637 468.8537 413.2002 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+11670 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [434.4501 456.8986 451.3865 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+11671 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.3753 456.8986 471.3118 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.121) >>
+>> endobj
+11672 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6427 444.9434 506.5792 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.114) >>
+>> endobj
+11673 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.1509 432.9882 491.0873 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.115) >>
+>> endobj
+11674 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [468.0538 421.033 484.9903 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.116) >>
+>> endobj
+11675 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.0257 409.0779 441.9622 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+11676 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.6837 397.84 386.6202 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.100) >>
+>> endobj
+11677 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.609 397.84 406.5455 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+11678 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.0298 385.8848 384.9663 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.101) >>
+>> endobj
+11679 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 373.2124 389.4597 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11680 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 361.2572 396.0208 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11681 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 349.302 391.761 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11682 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.2954 337.3469 455.2319 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+11683 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.2207 337.3469 475.1571 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+11684 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [426.6699 325.3917 443.6063 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+11685 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [430.5452 313.4365 447.4817 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+11686 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [420.0444 302.1986 436.9809 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+11687 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [423.9197 290.2435 440.8562 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+11688 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.5217 278.2883 400.4582 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+11689 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [403.447 278.2883 420.3834 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+11690 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.8849 265.6159 484.8214 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+11691 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [437.4492 253.6607 454.3857 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+11692 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.2259 241.7055 471.1623 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+11693 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.2536 229.7504 413.1901 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+11694 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 217.7952 367.7015 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.121) >>
+>> endobj
+11695 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.8699 205.84 424.8064 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+11696 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.8768 194.6021 393.8133 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+11697 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 172.1313 362.2721 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.121) >>
+>> endobj
+11698 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.6927 158.0194 381.6292 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.122) >>
+>> endobj
+11699 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.8822 134.109 450.8187 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.123) >>
+>> endobj
+11700 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.1564 122.1538 455.0929 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.123) >>
+>> endobj
+11701 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.6765 110.1987 412.613 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11702 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.5519 98.2435 416.4883 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.138) >>
+>> endobj
+11703 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.051 87.0056 405.9875 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11704 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11590 0 obj <<
+/D [11588 0 R /XYZ 90 757.9346 null]
+>> endobj
+11587 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11707 0 obj <<
+/Length 5544      
+/Filter /FlateDecode
+>>
+stream
+xڽ]m�#�q���b�!�-r��w�>���$�o� >C�j4��5Ҝ�����O��]M�:8'0��=�b=M�l>����a`V�~��<�߰����~���
|�ŀ_���7F?
�`�yx�4Z0�ׂ������_~�O���z���\ϴC��JY��7�~�փs-
��x��?��G��o߰^N?|�XχA<<�QB�?
������郱A)�e!-� 8�
-��=3������fw>]o���t�~���[�+ţV�{���c��g��wq�Bo2��7\f�A���I����"	���3�$\���\�ew܏�|���O�}Έ�7���6#���y�r�#.뀄��K:�0�(�-2b���ZW	��MϸQh��c�w�@Gj�2>�dІ�{����pᬟ�ɸ�lw����y�
������?�?�t�,4n1A�1��^ #�9r�t���rH��d�(��†ս���f��r��~w+��z�]�P�|7(q�ڭ�"{+�t c%��
+F��
a�<�����������3�1��0��!�Ig|7(t(�;���8�����tFQn��{)��yx��+T��2ŗ�Ԣ�]ܠ���vkT

+>wi�E%�(�H��v�2�����R犡!�cJ/�)2㻸Aa�dv'>d��A~d.�@:Ef�v�C�"/T����A�3MPkJ�w���$VktH���ٚ@m�
\��8��q�<]�ϛ퇳_h��W�+��5gjiO̕��
+���N
���V2�@�ƌ��"
L�i3:>�g?D>���[�����.nP�"�[�B at m��dT�v�B���Zmt���Oy� \�I>㻸A���)�<_*Oץ
H�匢�fּ��0�_ȻJ��6�O� �;.K��tR��(�->qX�`p�0��ZjL�O���tl����㩰N��)���u"໸Ai�H�N���`�!��(��B���V9�t|z=
k$p�z�fiE����
+���VH��щ��v�@�S�@��
���������m��搼���l�Z)���2�Zr�3��{�RP��
�R\�iE��;k6���2-
+�����ྂ�؞�"໸A���nm�!��0Cځ��
+(��Bdi�]��|xܟ�L��3g����
JL�v'&�R�i�v c"��
�X 5e�������'���* ;n�Ґ*���
+������iR
f�y`�wVș��h�px�M2����||7(-�����i!��
�]�\9�(�s�
+��������+e
7
��~�wq�R��ڝ�ϫ�@3��d�C at Qn1z'�/G����������m��yӃ�9uj�]�/
Z&VG*ta�нV"����aa]af���
+��O����)�^
�X3=��T�;�SZ��U��t��lz�v��0I00�ۧ�1?�+T�
+a営TE�]ܠTQ�vkT���v [)�p�Ps�
fJ����e{<�u�i
<Fm�^���c�wq���[9��
�ei
+�cDQn3k��ץ�
+����g<�>�;E-�sb��d��zFn�� 
T�\�GB� J��4 at e�v(Z���hI��hQ�Ҙ�)-3�p��"Tϝၖ��p��/?zJ���ٵ�+�Z�Qg���
Jgש݉Wz
����Y!P�[d����N����x"U�{*���`Cj��]�/�<�5����ŝ�l�@�O���@��!�//��͘��V4fZ.�e��6(��rqׁzZ.�ng�s@�V�q&\��������_Z�;���
�;�{���7�`UL�6
D9E��	�ZW_S��
t��Ńk�Y��1#���b����k���i
+'1#�r�,�+Φ�|��8�������+Z��Zxx��o-�Vkl(�ِx/��� �gj�R3��
L�xƓ�S�S�y��e�D�3�p�� _dh=%����p�za<y�v��~9����N�m�o�G|7(����[;���7lH;Px�=��
5
+6|����˚�db�lhGm.�Ctigqg�v��?�&���)��m�[8p�\�'-���Pv
>u�p��%໸A��%�[yC����m�dGE�ͬ� ��;�dm�3�r�ٝ���J4��؁�zFQn�s�k7Lk���T{�b2�p�|7(=��n-z;,��d�<�(����3�ta_
����gvk���~rE
@�S|�l�C��r�:x{;_����3�=�7C�������yjw�oCN?�'�d�������Î��"��������TPV�p���� I(��:@�.���a�\R;ʀ����ڭ2�s�I2�r�
��U(~�෥�49��5����FPj���TEI���r���[3�^/~u<���ˊ�i�;_���K�#����;�wV+d�C*�o��y/ܨ
Am�
ڀs������)�_�u�
l��Ҝ�D|7(�"R�Sb͹V]�v ���p���T�3M6J��5,�L,�):����H��萬gL��
�#�p��!l��.��Z/�h=D��
 #���/��ۭ�=�P}�

�
(\ Q�ۅ
�P9�d����.�W����*chP}{a��U�+�{����ۅ�kt�������:��Y�P�h�wq��:�ڭ�8
<a��d�X at Qng
+��<&�<GW$7�?�/+6�PAK�
�Q{����=xj��
�ZZ*�v 

3�p�p� w9�J�����
+��|7(-���)��[�<�@�P�p��b�&v��W���;[�4��M�wq�ҴI�V_h'J%
�ʯ���"
޿
7�����������/
�����Z�I(ls�
�@o�wq��޽�ڱ����U�}
+z#�p�Т�^ �-��aw;~��o��Z�8��[q���]ܠr�}g�u��Eځ��6�[�*XaĔ�o�#6���\����N
KC�-G�wq��[��n��Aj.�@��#�(�ȃ����v���%F1Mȁ���&F|7(��{���' )uځB�Q���
jͧ��{�
��������O���v�o�����7�|��,]��m����
�(f|7($��n���o�-WI���"�.#��c���d 
T��ɪ0ߕ�A� L�w�kY9 �I�'`�t�Y�����w�vu�3��Afw
+�� ځ#�r;?z7xA�2��s��\�
��l�ڢx�K;��j��7��۝�{6�DP��e�e��D� ��ʥ��v"�����-g_�7�{}���d
�A���M�J�9�	�wnw"1���a8k�"�D8�(b0��5���eVZ���z��
�;�;Fo���àڊrDQn��SE��kU���f�VC��;�Z�_A<�9�Ԑ#����iȧ4��|�F������pB��Y�7���WS�qDQ^1�X����
���|_�
G<!����Xo��mm8�(�H@,��
}�O_
+Ϟ�NH�V�xB��۝��9�^x`y[�(�-F��w�/y�j|����O�s�S�Cμ�U̪��Q�[
<�Yc��y<�S��o�
�w���
;�;����7����F�وD���a9m�������es8m>|����b��G����o
�3����4Lq&LS����υ�Xd�=c�|�Tǃc=�[��F<!���V���o�m[�(�-r��?�
�EA��y#��[�vk��U[�(��
����'��Z�er���9�[����_p@��E�Eb�����o�`��6��O�s�����ӄ���9#�r������5�ZZ��U���*g����n�6p����eΈ��"��xd`:��X�Jˠ�df���m�qf�?$5�LSٌ �'F+�!����9
�� ɬ�4#��v+4(�5\nPmM3��
���8�!nN����_�[)gF<�+��VIА��Ж3#�p�������c{0�A��72k�̈'tŹ���/D�m93�(��C�">�녁��Z93�	]qn�Z��1���̈������OS>lG�
�VԌxB]��mGJ�5#�r�
D����Ki}�;�u*f��ř��F�� [...]
+����n�E#���n �f�*t4�[b��*9}�h�6}"u��x����Q��
Y'}F<�A���N�`�	[��-}F�v�Nh�CG�����
+
�kn։�O�s�U
+�Wdk�V=#�r��:�f���N0�V�xBy�ۭ�Lٶ�Q�[�?Vٞ_o�#9�;-�Z�/�	�mn�V�X�S�j�)�E�c�e����{}ބ[����
+��7=���"����vk뇿���MY/�(�H�i��M��vIe���-]mb�6ޡ~��04T�iz�0c!���ˍ8jk%��'�����T�MI�r�@�EbU���C�N���`�Z�'�	�en�z-�y�7��D�9������f�����.�J<Oh-s���n
��Z�%��������"o�ۚ��Ж���J�&�	�dn��J�6�C[��(��BE,��]^O���8��b�V��xB6�ۭ��5���l�Tk"�r�Y+n��Kc�]5�	���j�~rk�Q#��z���A�7�2Me�qJ�ԫ"��
ͬVr
��'�zU�}.�!���{�~��a_�"�CS>0�V��xB1�۝H0��X���QS��(�-�
B#`�',_�LE<!��N��o(�p-'�����b���p��x�
˯�a���j1*�	Uhn�6 �iE[��(�-�>�k����4�j��
�X�l0�	Ahn�„���CE�va"�~��t�� E��X7
���1��V� [...]
+�
��.E�c��k�O�ԕ./(���n5�����+]�Qn1�X����m�u9�okAs�5���u9�'�"���sf�]�Uja�JOOh at s��$z1Ӗ�"�r���JO
����0���INOh?s�ժ��5W�%����b���s��J��r�ܖ~�v��?�
7��3����s�_�����~��"�Px�v��]钕�
+���Q�[�?5�Z��
+��`q��*,OH
s�����e���D�v� 2^o��$�7�6+E�o�3��Y0^hԃi�*;����;W��x�F����ǿQ�7���Z����7ȣ�[þQ����O����e��F�q>�~
'
��u�_���_]���}{������f�7�\�׊L��
��>���NŽ��}&P��R�?�:8�4}����_�	d�]�b���6
+9���t��|����ϟ�ݵ=
^.��������t�tV��+�����������	J�����%<���ɏx�}>}�A�Ů�m�#�endstream
+endobj
+11706 0 obj <<
+/Type /Page
+/Contents 11707 0 R
+/Resources 11705 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11380 0 R
+/Annots [ 11709 0 R 11710 0 R 11711 0 R 11712 0 R 11713 0 R 11714 0 R 11715 0 R 11716 0 R 11717 0 R 11718 0 R 11719 0 R 11720 0 R 11721 0 R 11722 0 R 11723 0 R 11724 0 R 11725 0 R 11726 0 R 11727 0 R 11728 0 R 11729 0 R 11730 0 R 11731 0 R 11732 0 R 11733 0 R 11734 0 R 11735 0 R 11736 0 R 11737 0 R 11738 0 R 11739 0 R 11740 0 R 11741 0 R 11742 0 R 11743 0 R 11744 0 R 11745 0 R 11746 0 R 11747 0 R 11748 0 R 11749 0 R 11750 0 R 11751 0 R 11752 0 R 11753 0 R 11754 0 R 11755 0 R 11756 0 R 11 [...]
+>> endobj
+11709 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4451 720.6295 193.3816 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11710 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.6456 707.9571 238.5821 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.138) >>
+>> endobj
+11711 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.0201 696.0019 231.9566 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.137) >>
+>> endobj
+11712 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.6837 684.0467 273.6202 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.145) >>
+>> endobj
+11713 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.7894 672.0916 274.7259 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.145) >>
+>> endobj
+11714 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6757 660.1364 182.6121 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.141) >>
+>> endobj
+11715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.3978 648.1812 195.3343 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.141) >>
+>> endobj
+11716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.9682 636.2261 221.9047 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.143) >>
+>> endobj
+11717 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.6904 624.2709 234.6269 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.143) >>
+>> endobj
+11718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.5141 613.033 212.4506 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11719 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.1215 601.0779 213.058 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11720 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [130.518 589.1227 147.4545 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.131) >>
+>> endobj
+11721 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [150.4433 589.1227 167.3797 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.133) >>
+>> endobj
+11722 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.8522 576.4502 220.7887 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11723 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.2248 564.4951 196.1613 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11724 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.146 552.5399 233.0825 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11725 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [212.7289 540.5847 229.6654 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.145) >>
+>> endobj
+11726 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [209.1125 528.6296 226.049 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.144) >>
+>> endobj
+11727 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.821 516.6744 207.7575 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+11728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.3082 505.4365 171.2447 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.133) >>
+>> endobj
+11729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.1154 493.4813 164.0519 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6027 480.8089 236.5391 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.150) >>
+>> endobj
+11731 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.1362 468.8537 233.0727 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.147) >>
+>> endobj
+11732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4386 456.8986 224.3751 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.147) >>
+>> endobj
+11733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5742 444.9434 233.5107 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.141) >>
+>> endobj
+11734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.4995 444.9434 253.436 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.142) >>
+>> endobj
+11735 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.2964 432.9882 246.2329 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.142) >>
+>> endobj
+11736 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.2521 421.033 178.1886 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11737 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.3894 409.0779 200.3259 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11738 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.6386 397.1227 200.5751 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11739 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.2828 385.1675 207.2193 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11740 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7824 373.2124 196.7188 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11741 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.9687 361.2572 234.9052 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.150) >>
+>> endobj
+11742 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.894 361.2572 254.8305 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.151) >>
+>> endobj
+11743 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.6695 349.302 274.606 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.144) >>
+>> endobj
+11744 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.5444 337.3469 225.4809 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+11745 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.2024 326.109 170.1389 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.1277 326.109 190.0641 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.135) >>
+>> endobj
+11747 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5485 314.1538 168.485 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.135) >>
+>> endobj
+11748 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4738 314.1538 188.4103 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11749 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 301.4814 172.9784 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11750 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 289.5262 179.5395 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11751 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 277.571 175.2797 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11752 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.8141 265.6159 238.7505 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+11753 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.1885 253.6607 227.125 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+11754 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.0639 241.7055 231.0004 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+11755 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5631 230.4676 220.4996 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.138) >>
+>> endobj
+11756 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4384 218.5125 224.3749 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+11757 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.0404 206.5573 183.9769 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+11758 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.4036 193.8849 268.3401 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+11759 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9679 181.9297 237.9044 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+11760 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.1462 170.6918 177.0827 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+11761 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.7445 158.0194 254.681 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+11762 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7723 146.0642 196.7088 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+11763 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3886 134.109 208.3251 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.144) >>
+>> endobj
+11764 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.3955 122.8711 177.332 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+11765 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [262.6312 110.1987 279.5677 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.151) >>
+>> endobj
+11766 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4741 98.2435 188.4106 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.153) >>
+>> endobj
+11767 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3994 98.2435 208.3359 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.156) >>
+>> endobj
+11768 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.9155 86.2883 235.852 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.156) >>
+>> endobj
+11769 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [493.9368 719.9123 510.8733 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.157) >>
+>> endobj
+11770 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [373.5592 707.9571 390.4957 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11771 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.1482 696.0019 412.0846 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11772 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [363.5967 684.0467 380.5332 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11773 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.6649 672.0916 391.6014 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11774 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [360.8269 660.1364 377.7634 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11775 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.5471 648.1812 364.4836 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11776 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [398.6151 636.2261 415.5516 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11777 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.2623 624.2709 456.1988 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11778 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0985 612.3157 396.035 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11779 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.6652 600.3606 391.6017 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11780 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.69 588.4054 403.6265 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11781 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.8746 576.4502 367.8111 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11782 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.8095 564.4951 387.746 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11783 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.5344 552.5399 386.4709 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11784 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [400.1491 540.5847 417.0856 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11785 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.5716 529.3468 416.5081 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11786 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.3983 516.6744 409.3348 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.165) >>
+>> endobj
+11787 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.2229 504.7192 392.1594 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11788 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.5158 492.7641 391.4523 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11789 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 480.8089 389.4597 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11790 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.3356 468.8537 388.2721 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11791 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 456.8986 396.0208 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11792 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.9544 444.9434 393.8909 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11793 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.3356 432.9882 388.2721 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11794 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 421.033 396.0208 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+11795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.9544 409.0779 393.8909 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2057 397.1227 386.1422 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11797 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.7052 385.1675 383.6417 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11798 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 373.2124 391.761 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11799 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [355.8559 361.2572 372.7924 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.169) >>
+>> endobj
+11800 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.4873 350.0193 388.4238 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+11801 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.2296 337.3469 361.1661 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11802 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.2229 325.3917 392.1594 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+11803 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.6002 313.4365 411.5366 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 301.4814 367.7015 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+11805 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.0356 289.5262 441.9721 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11806 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [380.7522 277.571 397.6887 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+11807 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [400.6775 277.571 417.614 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+11808 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [469.6879 265.6159 486.6244 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+11809 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.1943 254.378 389.1308 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11810 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [378.5308 241.7055 395.4673 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.175) >>
+>> endobj
+11811 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.117 229.7504 391.0535 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11812 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [418.919 217.7952 435.8555 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11813 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.2598 206.5573 406.1963 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11814 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.042 194.6021 402.9785 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11815 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.2317 182.647 387.1682 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11816 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 169.9745 389.4597 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11817 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 158.0194 396.0208 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11818 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.3564 146.0642 383.2928 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11819 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.9752 134.109 388.9117 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11820 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 122.1538 391.761 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11821 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [377.5045 110.1987 394.441 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.178) >>
+>> endobj
+11822 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.8205 98.2435 408.757 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+11823 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [400.1194 86.2883 417.0559 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11824 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11708 0 obj <<
+/D [11706 0 R /XYZ 90 757.9346 null]
+>> endobj
+11705 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11827 0 obj <<
+/Length 5069      
+/Filter /FlateDecode
+>>
+stream
+xڽ]ێ$�q}��h?yp��~X~�e��k�0�
+5չ�euW�VUk��z+3#��Kp$y%`1�u<E�L�l~����γ;�m�2w��7��~��>~���71��߼���;�y#����o
�������������~�����S�uL0~��
�}�h}t������o��'vwA��
�w��3��:{z���~x|���D;���>h.3��"�g�o���c�B�|~������Rw�������aD�!�?�71<��f�[��֬B�|�z<����;����}�뷻��n��������������;�~������������˵JY�s��;�}ǵ�h����emu &L\��z�����L ��4
��a���������x�nϧwB��|���������xI��w�3ۨӁ�M� �-�{#ĉ$ e`iju +FE��)�0N��7�
���N��Ԏ~7�ē�
h�	
\t��u k&�i0�����x���L��
SR�`*Q��M� �*�v
C��0V,_�d�E�žC)U[�Dp[����$� ��!�-}��d�%$I#}'���$����r�q�g�փ�a�|��?
/���ڟw��9� Bu�+����DJ$�	������ZJ���/������

r�)�\���yw8�J(��U�5��	��d8I���$ #B��`�ʄ"������!��O��a}��1�?��6�e>jG̭	��d�I�4�$ �;�*�*���P�ۉ��NOKKi�8�`Q��7�&n����n��Ҩu ���P�[��
P5���e���r#�/�?�G
+��)e�A
����	6&�&n�	+�{cót���̡�^�fcBQn�
c;����8
C�<@��
	�:.��[$L�M� Mb�4$�� �$L(�-��ug<�����zz<=
���
0�`���(
+F�&��XY-�`�{���>��JvV�!�����~��P�uPa�o�����;���މu ��pCQn��P�['������8�H	�;����: &mg��# ßu��
R���M� ���n�?6l̖$��(�mb-�k(�a2��^Ox������N�'���������Pu
+��p��M�_<X*��0h�#��~7�t%�[b�BB	[�e ɸQ�[d���Y!���.��
�ѫ�#E���
r��o
5�p� G�6��~'�I�
(�|(;>��Źg`��
��	E��F��2�s+�l���ߞ��akƎT2��#���
���	�ȟ���`�*or�:�"|e��ݨͺ��⤫�D��3�b�g�b�ØAN
��3�7q���Y�-�^u��u I�G�6�VX�}'��ͽ�����҄�'s�������nX�47M�qn;����øE �D;��-}����k�:��P||�����>�k�ib��T�G�&n����niS�|��Y�<�Q�[��4
���%�h��yK��a�NF�Ӵ	��dN����!`q�ܭX��M(��<6�ٝ�?a��.[�߸A��]t�-��� ��/����/$#�y
��e$�"��)���ˋH�'���C/�ڲ�n̦��M� r�����w1�V]B>��uR0�E�$�h��M�6$�8Ґϊ�gq���
�
4��Ӎe ��u��H�9���|�����_�c�a�ԢS��֧�q���t�

����e ���i�Iź�[y>�B���Af�Ɲ�nlAk#x����4�X�����~�m�Լ�1!B�U
ϼ~��Ly:
wה;2ɜ��se�o�����
InV��	-���ʄ"��#�ú���z~�]����z

x
v������!�����!e���20�fV&�&n�a%����DuF�u IQ�ۙ
���'�ؠ��;nP9�^��?�e/(�xn��
/:c��	�7t�Z��
*�ۢ+YDzl@�x#�"��uV���
��oq�J��$���6[P�����:k|S7a�
+�]��b�>����q�z����EhXиlY_NOPpl���4�ޞrZ7[$����
2�4�;В^�
+�E
_�N��p����i�P�~u>=mq
+�����gXn�??��\�	):�d�ǸA�$CX�%,��K�����`�W��h��?�Jy�;祟�QwrF�&n�����[;�uN�u ɝ�E���s
d�!{�O��s�}>e��q�
����M� �����w_���a�$�G�v� ܱd��/����Z�%�
*ג��h�.
-(^K"�"
NobH^�c�z�L��`僥
+[L�M� Ib�D o�Z�
+ Y_F�	�Pl	;$��e�x��w����r݅������p�l�as䝟�S�����6�k�7:x�D�P:�u I�>��3
�w܎7'���6o��7�\�Z��
��e �kZ�[dCyh`����=
C�8
��������-P;����
���08�ev����dl
 ��L���eĐ�ǾTDDЦ"B�ç�"b�`�s
�
+ _D�-�\�ӄ��mٷb��}kܠ�o]"�/�[����[�?�������Vtٺo�T����d
w�� ��V�mb-�kщ��{=�)���B��ޅ�ܚ������aᾊ1ͻulк[�Tv�@����_Pܭn��ÖN)>,Z���g�&(�Y��7>�]_X-�K،�px�}�� ��Ƅ}�p#�M�%���:���5�EB��@r�
+�(0�[`F��aZ�Q�[�x�H<���!���3YN(	K�瑅:!���
��R���4�}���A�6��͋J�����^Ox���n��V��0O�zBnq�j��)
���.���?���[��/ղ�8E��
�:�[B����j�"�Py�vK���uq)�(�
z��J\�v U�ݢ��7�Ux�xB��
&Fr�E�@7���Q��y�Ě���mf]�ϥo�"�P�v�~�th�����E����b�c���k�-aG�
3��U�J��n�A؃�P�V�����"����!�N��5�e�8������"�r^�����]3��/�U�u0�t�`�r4�;�i�� ܺ��.XE�v&3�����7�_�}�<��,,
��V-+�	Qijw`Ȧ�踐��eE�'�BB��t)U�
+#
�kղ"���v���UL؏���iYE���Ǣ��挧��">��T�U��xBJ��-p�`j3�T]��(�-rkFo3௻�u;>B(��9l���'4���"���m診�Q�[d#ҏd@�<�
�O�����=
��^��%�DEx�ۦkEx]c�X-�
�X�
A5]+��>g.b9�����
��	�Y����4�[���Hת�kE��
#���x(� ��lj"�PL�vK����HشV�����"
���q�T
6㞷�,O�
S��aN�$��,E������P#Ԧ��Aa�&D<��K�V��҆�����N
,tv�]���v|�����[%�l��!��v\n.���Vu���"
�`��Wg�5�7��^��%V+��rΫ�=>��n����JdѪ`C<!%K�
+��Uۜ�H�B���^*�l�F�*�O�R���uZ1BΆ(�-r
ɮ�kKYm��U܆xBe��--��&���m�"��޲]����p��

�d��
�,�[!P��$��jC�v
!�,l�������ؠ&jӥ!���vo
(��Pnl]��(�-r)–�^��t8
���g
�����n�!�.K��Ȱ2�uU����ϙ�X'��"�*XHG��*�O�R�"
��U�l
Q���Z�ј�R�J���	O�O����I��[B��(�-~�
���'�Ax1�T~6A02�7q�
#��#�B��$saDQnk�q࠴5�-k�����'v�^���dJ��P��y
��q
�^��%
m����1�;p���:﹨
.E�Eb��jI��T*>[�ք������!�@]���	�P�ۙ�Xֹ$��A�Yd�xB��
HHO0�9cL]d�(�-���Ԙ�ᶧn��"�&]Y,�`����Y��"��m���
<@��}(j8�!��V�)�	�gj�T@�'��z�SDng
b
g�1��;ý�F�)�	�gj�D�
�҄�Q�ۙ�Xؙ���
yx@Ϛ���'4��݁��q��Q�[$b���A
�	ػ4�G'8��L���{oXwg��
E�u�$�lJ��>��_��=�Ő>< �jR����n��Ԫc�
��&E�vf$�s����$�U`�xB��-����akQX"�r�X�_���Eh+�{=�I�k��K:��qN�zBQnqL���ܠ(\J�p���&�Y2�7q��,Y�-�ʆ��� �3�E�����5F����u���rgo�R���@OrD��E8Ba�(��LO,aM�!�_��; ˍ
+[�R��ni�
w�`[VW�"�p;��Z)V�k��tίu
hj��
cF�JO��J��(Z>E��ݾ������ ��FK���
�߮\s٪FE<!
M��8���*K7��U5*��3'�������?}�US�ըIŲ��
M��(�
+��"u.��^gJb��e��~{x�=d���7�t��(4�;� ҃��(Ȋ�Q�[�!�|.xx>�*��ժU��xB��-P
:�U]��(�-R�@?�^���S��PI�����'���݁��>�λ�>Q�ۙ�X��8D�=7�U�:�	�hb�ćf
�.W�@�ϙ�X�xc��>�e�)zJ�$@��Y�*�D<��L��Ȑi���iSa"�p;�kc:>����z�
��P�4�1O#S��C�$��1E�E*b9$���ݵo�+��/��3^WA&V����@vB��8s#����˗f
�s����w(o-3��+uQ��~ؤ�޹�}�����C�6�l��0�8�u~
/<
?�ץ?��;��^���;��
��4_b*��*��&,|ʻw���o�>}L
��)�Kç������mLc�M�b���6�rb�����������?�����xx>w��������g�^X��+yB0��X��.hZ��|:D=����q8�/�v�Ŝ]*�ʆ�[�/�endstream
+endobj
+11826 0 obj <<
+/Type /Page
+/Contents 11827 0 R
+/Resources 11825 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11938 0 R
+/Annots [ 11829 0 R 11830 0 R 11831 0 R 11832 0 R 11833 0 R 11834 0 R 11835 0 R 11836 0 R 11837 0 R 11838 0 R 11839 0 R 11840 0 R 11841 0 R 11842 0 R 11843 0 R 11844 0 R 11845 0 R 11846 0 R 11847 0 R 11848 0 R 11849 0 R 11850 0 R 11851 0 R 11852 0 R 11853 0 R 11854 0 R 11855 0 R 11856 0 R 11857 0 R 11858 0 R 11859 0 R 11860 0 R 11861 0 R 11862 0 R 11863 0 R 11864 0 R 11865 0 R 11866 0 R 11867 0 R 11868 0 R 11869 0 R 11870 0 R 11871 0 R 11872 0 R 11873 0 R 11874 0 R 11875 0 R 11876 0 R 11 [...]
+>> endobj
+11829 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 719.9123 151.2202 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+11830 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 698.0592 145.7908 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.178) >>
+>> endobj
+11831 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [230.9904 684.764 247.9269 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+11832 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.3704 672.0916 213.3068 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.181) >>
+>> endobj
+11833 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [136.0469 660.8537 152.9834 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+11834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 648.1812 151.2202 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+11835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.4979 624.2709 240.4344 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+11836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [246.5811 612.3157 263.5176 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.184) >>
+>> endobj
+11837 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.713 601.0779 172.6495 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.424 589.1227 172.3605 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.2744 576.4502 196.2109 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.1372 565.2123 190.0737 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.5794 552.5399 189.5159 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 540.5847 172.9784 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.8543 528.6296 171.7908 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.7796 528.6296 191.716 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 516.6744 179.5395 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11846 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.4731 504.7192 177.4096 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.3984 504.7192 197.3349 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.8543 492.7641 171.7908 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.4731 480.8089 177.4096 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11850 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 468.8537 175.2797 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.190) >>
+>> endobj
+11851 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.2685 468.8537 195.2049 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.191) >>
+>> endobj
+11852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 456.8986 151.2202 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11853 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.5865 444.9434 150.523 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+11854 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.5784 432.9882 297.5149 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+11855 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 421.033 179.5395 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.195) >>
+>> endobj
+11856 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 409.0779 175.2797 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.195) >>
+>> endobj
+11857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 397.1227 151.2202 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.195) >>
+>> endobj
+11858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.4979 373.2124 240.4344 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.196) >>
+>> endobj
+11859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 351.2397 145.7908 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.197) >>
+>> endobj
+11860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.8775 337.3469 192.814 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.197) >>
+>> endobj
+11861 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [254.312 325.3917 271.2485 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.198) >>
+>> endobj
+11862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.7063 313.4365 235.6428 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 301.4814 172.9784 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 289.5262 179.5395 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 277.571 175.2797 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 265.6159 151.2202 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+11867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1416 253.6607 290.0781 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.201) >>
+>> endobj
+11868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 231.8076 145.7908 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.201) >>
+>> endobj
+11869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [244.8977 217.7952 261.8342 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.201) >>
+>> endobj
+11870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [168.1464 205.84 185.0828 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.713 194.6021 172.6495 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11872 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.3371 182.647 158.2736 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6027 169.9745 236.5391 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.210) >>
+>> endobj
+11874 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.2744 158.0194 196.2109 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.208) >>
+>> endobj
+11875 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.9687 146.0642 234.9052 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.211) >>
+>> endobj
+11876 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.854 134.8263 145.7905 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11877 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 122.1538 172.9784 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11878 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 110.1987 179.5395 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11879 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.5283 110.1987 199.4648 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.211) >>
+>> endobj
+11880 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 98.2435 175.2797 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11881 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.3933 86.2883 151.3298 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11882 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.1138 719.9123 360.0503 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11883 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.2954 707.9571 455.2319 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.2207 707.9571 475.1571 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.210) >>
+>> endobj
+11885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 696.0019 367.7015 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+11886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0678 684.0467 367.0043 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+11887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.6998 672.0916 512.6363 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.212) >>
+>> endobj
+11888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.7776 660.8537 361.7141 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.215) >>
+>> endobj
+11889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 648.1812 396.0208 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.215) >>
+>> endobj
+11890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 636.2261 367.7015 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.215) >>
+>> endobj
+11891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.9792 612.3157 456.9157 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.216) >>
+>> endobj
+11892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [476.1835 600.3606 493.1199 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.217) >>
+>> endobj
+11893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [373.5592 588.4054 390.4957 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.1482 576.4502 412.0846 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [398.6151 564.4951 415.5516 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+11896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.2623 552.5399 456.1988 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.6652 540.5847 391.6017 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.69 528.6296 403.6265 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.2229 516.6744 392.1594 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.5158 504.7192 391.4523 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [371.4873 493.4813 388.4238 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.218) >>
+>> endobj
+11902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.7709 480.8089 392.7074 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.2229 468.8537 392.1594 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+11904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.6002 456.8986 411.5366 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+11905 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.0356 444.9434 441.9721 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+11906 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.8101 432.9882 456.7466 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+11907 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.6765 421.033 412.613 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.241) >>
+>> endobj
+11908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [457.6633 409.0779 474.5998 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.241) >>
+>> endobj
+11909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.5519 397.1227 416.4883 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.242) >>
+>> endobj
+11910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [419.4771 397.1227 436.4136 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.243) >>
+>> endobj
+11911 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [461.5387 385.1675 478.4752 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.243) >>
+>> endobj
+11912 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.464 385.1675 498.4005 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.244) >>
+>> endobj
+11913 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.051 373.9297 405.9875 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.245) >>
+>> endobj
+11914 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [451.0379 361.9745 467.9743 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.245) >>
+>> endobj
+11915 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.9264 350.0193 409.8629 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.246) >>
+>> endobj
+11916 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.9132 338.0642 471.8497 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.246) >>
+>> endobj
+11917 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [408.4085 325.3917 425.345 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.242) >>
+>> endobj
+11918 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [470.3953 313.4365 487.3318 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.242) >>
+>> endobj
+11919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [412.2839 301.4814 429.2203 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+11920 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.2707 289.5262 491.2072 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.249) >>
+>> endobj
+11921 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.1269 277.571 455.0634 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.243) >>
+>> endobj
+11922 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 254.378 362.2721 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.244) >>
+>> endobj
+11923 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 254.378 382.1974 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.245) >>
+>> endobj
+11924 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [431.5014 241.7055 448.4379 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.246) >>
+>> endobj
+11925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [493.4883 229.7504 510.4248 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.247) >>
+>> endobj
+11926 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [450.8589 217.7952 467.7954 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+11927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 195.8225 362.2721 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.249) >>
+>> endobj
+11928 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [473.165 181.9297 490.1015 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.257) >>
+>> endobj
+11929 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.2707 169.9745 491.2072 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.257) >>
+>> endobj
+11930 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [382.157 158.0194 399.0935 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11931 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.8792 146.0642 411.8156 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.4496 134.109 438.3861 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.254) >>
+>> endobj
+11933 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [434.1718 122.1538 451.1082 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.254) >>
+>> endobj
+11934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.9954 110.916 428.9319 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11935 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [412.6029 98.9608 429.5393 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.238) >>
+>> endobj
+11936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.3023 86.2883 424.2388 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+11937 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11828 0 obj <<
+/D [11826 0 R /XYZ 90 757.9346 null]
+>> endobj
+11825 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+11941 0 obj <<
+/Length 5491      
+/Filter /FlateDecode
+>>
+stream
+xڽ]ێ$��}���}��2������je[�H��,��ej��{��jWU{4��
f2�L�"
�
+����)&
�d���Kn�Խ�B��>�"7��߼���>�b������J���*�n�ߏ�%����ݟ^��|�?o���w7���H���z�{�+�l��՟�Ln��{Ezn���?��Z�n�^	��
_}��?��郱A)Iy!ɢ (�3�o4�=Q��������2
o�ݧ��p<
v����p�"
�q�k��b`�����1��)໸Aޱܮ��2�н�:�@BE@!n>(�)%l��r=��K?���DȥA;������dv����:�IτI;��P��9~em}�ÿ��lQ�H�3���>�V��ɼ+�&�L���� �g��h��������?>�w���
�����p�
N��B;��b yf|7(<���9���h%�����B�.|h	G�����1c"
�?��Y�"T��.nP�"�[�
q�Mځ����]���Č����p
����?�����
�� �
���i�0���D.F��1⻸Ayx��N����T�
(
���ͬ9���A��J�9���O�NQ������zF!n�� iϹ���|
*���dl�^�`�x|7(ђڭ�"`�s��dk�Gan3k�� �w�l��1��)d�yW���Z$��x]F�0�X����gML�BÌ�#d��.nP`#�[˚�sA�J:�M
��]�`�`2�ٸ�nOn����pv||8��gF�Rh
Z#Y�
�"|�O��J����&�S"f�3�@e/���ߜwyМ�H�v�"Q��.nP�Bfw�y%wK;��O3
+s�Ysn`L�	3$d��́�x���Z¬`w�5C�Q���K"�����!EW���<�jS����-�l�㻸A)[J�NS��"�khҁ,[�(�m�CZ�K3-����0�
����n���p��.nP��1|��"4�-ai���GanC����Դ

���|n��/���L[��D���]ܠУ��4
+��!'N�g�œ��0�F������O���1%�b�<������n���i�����
+��W֏�
L���p-=
��C>`φ�w��h$V��H���w�X��_[�^Ö+��/'���驐�^k��Ͱ��㻸A)1H��ⷲ׌�
H)�Q�����6L�,\Oϧ����v���yw�x�
w�U�¬���[%<���V��n��1��B$
�V	�B�.dP�j���`�N���m`�Z �a�wq�BO2��e��"��$�;�=
��
��xJ 212�T74�����㻸Ai��ڭ%
��A�v �?x�6���
�l��q��MŸ��t�H�Ckl��]�/-�����=c�=eƒ0����/G��0���.��O\\�{�:������%:D��
�"|a��V'j�\�Y��vt�=�f�}.���C�2+n��I/85���2⻸A����;q�K��eځB�eD!nV`
#���XY
+��Ѱ��n��~f|7(�٭��{�eځ����]��
*�j�ޟ��[�ذ4
+7���\1>;Q�ʒ��;1a�K���j݁Ғ�P�ۅ	�z*(�L�X^a�=��%8�{z|7(%���)�0��o�s�v ۦ{�6DtQ3�}m}���w$�Ǣ��.nP�>�;Eo��5|�&�@�GanC�
1>y���y�̺�
+8$��E����j�<OWG�k�YAʃ�!b���H����4
��/�[-�
]�{���
ʛ���V
°��:�Can���1=�]�*~���)����ӝ�_�b�$�@n	-)���I��6r�e�
��
Jzj�ʠ������
��

j�À�+YA�"+����.nPA��j��h�v �ߣ0�!~

%�D}
��֧��c��<)LH0Ӆ�؁��wq�ҁgjw�M
+VX�I;���
��]�pg�R�&�d

�[�ctx|7(ёڭ��)!�&
�6l
��]���e.�3�B^%z)��K�<�
�RF��81��S�!��b��vi
����̴��¯^��K�M�# ��T�G�u�JDL���G�n:�ꥱ���
��>

>�
97�:�.�cX��㻸A��ڭ�ܐQq��d_�B�.��U\�78)
�|%�b+�x|7({R�5R ��r�u��ã���	{�}��rxz~<�޽\�9��r������� f����=���v��ڕ�{喢u��%
��]hq�i&��
f����Յ�w�
\���P&w�.nP)�����vW �,�@�L�P��@���Aى�Oo(y�.��KHf;B�]�.���,�R-w넉��4b�A��x��
�Ӭ}��`7<�/C���4#���zz|7(�=S��+$&Af�d�
��
<�ϸ�[���V��~�œN���ox|7(�7R���A��g.�d��Gan��<ʧ���6
������S�,H�+���]ܠ���vk�p���:�@:*f�v!���
+3����*jho����Vؔ��]ܠ4%�v+5Lj�P��i݁lJ�(ĭ%cn[�i�έ����~�������������?~��]6�}9������
��L���
+�#������fe�dV�m�<+�z�4�wTC��������\��	��l�4v[�㻸A��Sjw
+>?A�
&u��u���G!naTP�f6��n�p
�q�!��r:�Y
�wᆲPȨ��Q3��8l�5����.nP�Ŧv'
+
��aS"hځ,�(ĭ�&{���@����*95��.��53�����֨1I;�=Z
��]
-7��F�h
���a(l�ݵ+Ml���5⻸A�:���D�)�Q��,�@��:�0��w��-Ӱ�'���D��=�M�.Ɨ���D�-
��ɬ�g���|*�S&��������Rx$��L�s���&\����	7�[
Қ'
��t���(L/������X:C�%��=
+
��
J�Bjw
+�p�U���I��ƣ0�!|��c���O��T �K|*�]ܠ<��6��Dځ�T0�0�s���BP1_���2=��G7\O�]:�H:��7�#����=��j�	�|3*�����nv)��ӌ.$I�[��7DT��l
�q�[�UD�3�[�(�Q�P0�4E���
�������7#a\�7�P
у�vk
�#L��
5�0�3���q�Ƶ��`�&D
�(4�Z�ݕʜ�!D
 �g�<�{B6��ù9��O�d�3
�fV+K
7����5�3�"����
+V*��*ӀG䞹�ڷ�\J*y[eP��},i|�Ɛן��b�ҭ�ʀG$����7qW�o*+
+s
��p9�J��O��ʛ�)1����:<�L%�f
^�#b��ncʔV�/�0�a Ez���;���u�9��&�]���o��1n���Q#��� B|��c�W�jҽOb��.��Wn�5qo�@�v��
q�ꮟ'��(T[R��b,�;1(�)FS����ۙ��@lK��Q��$m�Xn��� �J�%�@܆�c]��n��-�m[)�ۭE?/�M}ڲ�"n�g� ��
��w�Ƴ���Z)
+A�
f�Q��m�Uf�§�N�`eS�@m�
������o�E�)�K�ܬ�
+xD��۝�Nq$lu)���+����+�j�\��n�{�pDv�Y�"��Ԉ3�{�5��Xb����~\!�荆	p�J*��Rn�£.`&�*��B�
W��&�_;ŭ�L��8����Q7�)�[���f�m�T@!n���|}�vR�
+D�-���Qޖ*eV���U'M�lʣ����GO/���a�ԚnB<�H��֢��D3J�B���܆�c}Q��9�%;��|�

+���
�{�eO��r�6�9�ݼmʞ
+s؈5F����/Y��e���=�N��M��
+)�[�����ڧ�9
lĚ#<��(}ZRݶ)�;�nH5�mJ��Tq��Xs�^6��}�7B��C�uϩ�[�Q���r�����y��qJ–4*��
;�8�M�e������n���B�^��
l�Px[ϔY�

aD/X��ʸ�υ�X��OpS(CP	*�_�Z�B@�gz��HR����C�ȡ��E�0�sR⫫Z���{��U�鹢ԣ5U2�{k
�UN�{���v�2*��Rn�:*�[	ܭ��2*��a\�Iظ�f��ݷ�
t�s�	DCW6*�
���v'6�{\v|0�U[YP���f��i����q؟w_��|
.ŷ�
+
	��V�Q�#���n�#	���6�A�Ӱ|/�

 ��T��hƶT?k{S�ٕh�h/
l��� i:[�)O*���d��*��^W�U����՟��
iy[��X���T�7*��
+v[�۝�3�
+vSy�T����XԴf��*���,e0�(�<D���6�V�#J���Da�4%zI�h
�
+s(�%P�����|��+�aUn�ơu�&��z�����
��R3��V�B�V�V�#��ne��P!m[�P���Z�����u`q�٭�=����)kG
P������7N�6�Ԗӳ�^,����XS����!nC��P,����
+S���:�j�֏eV������-Y
 �gj����
���p�wb�:ܙKft3� B|�/;�ĭ���F�C�����G�r���Jiz��M}^@an�*��m�-5��J.�[K���XS������&m%kn����w��Χ���GB۞�Y��\.�[{:,�P�J/���؈uq����k �LK��[Ez���r�#6? ���Z� �Dz��

��5�	����m�<����VI0�QJ�y���IXI�
	�KF���T@�½*�o��<"����81����&Z:��B�.��j=����;��
<ly9�;�#�VZ��.nP�-�v���^0�;Zu #ƣ�
1����q�n9KHƜ�c��p�#���j%���DSt�` >CԱ�o�$/��;}��{OvT0�9�/�.\#r/jQf��0�	`nw�'�zɱZ���ÀB�.�J��a9�ZZ����p)��
���vk
��ʬh�
+s8�~��
.�w\|Q���v��0��_n����
�6���Zy��u	��*
���v'Xq�jSSqP���Z�L`
���u���S�S�</EC?�0H�3
+#;|���)
o�j.��f2�;1����Ts)
#n��B��|=<�w�2S�?LO�[��H's�����m�f at angbu������!��
vf�*5�-�̬��
+�
�g/J͎3��)'��S%�O���Au�w/#
+L9�ƿCA�?!����?�y����
���%O?��e8��)__����?����@$��)A�3��J����)��t����C�M�����#Kӧ������ҮA����B����z}~���O���K�r<<�����������L�u��A�AY_V�%B�Q<���
�ɑ����
�#��i|�w�����0���endstream
+endobj
+11940 0 obj <<
+/Type /Page
+/Contents 11941 0 R
+/Resources 11939 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11938 0 R
+/Annots [ 11943 0 R 11944 0 R 11945 0 R 11946 0 R 11947 0 R 11948 0 R 11949 0 R 11950 0 R 11951 0 R 11952 0 R 11953 0 R 11954 0 R 11955 0 R 11956 0 R 11957 0 R 11958 0 R 11959 0 R 11960 0 R 11961 0 R 11962 0 R 11963 0 R 11964 0 R 11965 0 R 11966 0 R 11967 0 R 11968 0 R 11969 0 R 11970 0 R 11971 0 R 11972 0 R 11973 0 R 11974 0 R 11975 0 R 11976 0 R 11977 0 R 11978 0 R 11979 0 R 11980 0 R 11981 0 R 11982 0 R 11983 0 R 11984 0 R 11985 0 R 11986 0 R 11987 0 R 11988 0 R 11989 0 R 11990 0 R 11 [...]
+>> endobj
+11943 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.7774 719.9123 248.7139 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.255) >>
+>> endobj
+11944 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.3082 708.6744 171.2447 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11945 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.1154 696.7192 164.0519 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11946 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.1362 684.0467 233.0727 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.259) >>
+>> endobj
+11947 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4386 672.0916 224.3751 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.259) >>
+>> endobj
+11948 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5742 660.1364 233.5107 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11949 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.4995 660.1364 253.436 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.253) >>
+>> endobj
+11950 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.2964 648.1812 246.2329 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.253) >>
+>> endobj
+11951 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2217 648.1812 266.1582 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.254) >>
+>> endobj
+11952 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [223.4784 636.2261 240.4149 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.255) >>
+>> endobj
+11953 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.5514 624.2709 202.4879 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11954 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [132.1717 613.033 149.1082 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.233) >>
+>> endobj
+11955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.0969 613.033 169.0334 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11956 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.9579 600.3606 221.8944 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11957 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 589.1227 172.8988 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11958 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.2828 576.4502 207.2193 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.250) >>
+>> endobj
+11959 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.2696 564.4951 269.2061 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.250) >>
+>> endobj
+11960 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.5198 553.2572 173.4563 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11961 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7824 540.5847 196.7188 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11962 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.5542 528.6296 225.4907 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.237) >>
+>> endobj
+11963 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [159.2995 516.6744 176.236 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11964 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.2864 504.7192 238.2228 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11965 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.2207 492.7641 213.1572 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11966 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.3344 480.8089 297.2709 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.256) >>
+>> endobj
+11967 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.4356 468.8537 246.3721 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.257) >>
+>> endobj
+11968 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [272.0355 456.8986 288.9719 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.256) >>
+>> endobj
+11969 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.5444 444.9434 225.4809 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+11970 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.2024 433.7055 170.1389 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.238) >>
+>> endobj
+11971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5485 421.7503 168.485 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.239) >>
+>> endobj
+11972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.2963 409.7952 145.2328 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 397.1227 172.9784 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 385.1675 179.5395 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 373.2124 175.2797 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.1885 361.2572 227.125 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.247) >>
+>> endobj
+11977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.0639 349.302 231.0004 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.247) >>
+>> endobj
+11978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5631 338.0642 220.4996 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+11979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4384 326.109 224.3749 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+11980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.4036 313.4365 268.3401 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+11981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9679 301.4814 237.9044 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+11982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.7445 289.5262 254.681 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+11983 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7723 277.571 196.7088 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+11984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 265.6159 151.2202 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3886 253.6607 208.3251 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.255) >>
+>> endobj
+11986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.3955 242.4228 177.332 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.250) >>
+>> endobj
+11987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.3575 229.7504 275.2939 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+11988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.8785 217.7952 197.815 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.256) >>
+>> endobj
+11989 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [269.8137 205.84 286.7502 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+11990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [148.2114 193.8849 165.1479 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.261) >>
+>> endobj
+11991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.4009 169.9745 234.3374 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.262) >>
+>> endobj
+11992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1403 158.0194 285.0768 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.262) >>
+>> endobj
+11993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.713 146.7815 172.6495 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.0677 134.109 198.0042 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+11995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [141.3371 122.8711 158.2736 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.885 110.1987 166.8215 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+11997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.4243 98.2435 172.3608 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.2744 86.2883 196.2109 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.268) >>
+>> endobj
+11999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 719.9123 389.4597 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+12000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 707.9571 396.0208 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+12001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 696.0019 391.761 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+12002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.2217 684.0467 387.1582 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+12003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 672.0916 367.7015 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+12004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.0678 660.1364 367.0043 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+12005 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.6565 636.2261 396.5929 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+12006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [352.5282 624.9882 369.4647 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.273) >>
+>> endobj
+12007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.7776 613.033 361.7141 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.273) >>
+>> endobj
+12008 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 600.3606 396.0208 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+12009 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 588.4054 391.761 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+12010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 576.4502 367.7015 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+12011 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.9792 552.5399 456.9157 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+12012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [485.1893 540.5847 502.1258 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.276) >>
+>> endobj
+12013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.6927 528.6296 381.6292 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.277) >>
+>> endobj
+12014 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.8822 504.7192 450.8187 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.277) >>
+>> endobj
+12015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [452.2831 492.7641 469.2196 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.277) >>
+>> endobj
+12016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.7623 480.8089 389.6988 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+12017 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [375.7808 468.8537 392.7173 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+12018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [398.8639 457.6158 415.8004 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+12019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.1818 445.6607 411.1183 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+12020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 432.9882 367.7015 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.280) >>
+>> endobj
+12021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [476.3228 421.033 488.278 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+12022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [468.4824 409.0779 485.4188 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.280) >>
+>> endobj
+12023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [469.2936 385.8848 486.2301 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.280) >>
+>> endobj
+12024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [385.0763 361.9745 402.0128 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.281) >>
+>> endobj
+12025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.8058 349.302 513.7423 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.281) >>
+>> endobj
+12026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [405.6487 337.3469 422.5852 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.285) >>
+>> endobj
+12027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.574 337.3469 442.5105 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.286) >>
+>> endobj
+12028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 325.3917 396.0208 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+12029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.5682 313.4365 385.5047 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+12030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.187 301.4814 391.1235 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+12031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.2057 289.5262 386.1422 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.286) >>
+>> endobj
+12032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.131 289.5262 406.0674 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+12033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 277.571 391.761 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+12034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.7052 265.6159 383.6417 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.286) >>
+>> endobj
+12035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.6304 265.6159 403.5669 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+12036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.324 253.6607 389.2605 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.287) >>
+>> endobj
+12037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 241.7055 367.7015 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+12038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [478.0064 229.7504 494.9429 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+12039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.051 218.5125 405.9875 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.9264 206.5573 409.8629 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [473.165 193.8849 490.1015 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.4862 181.9297 484.4227 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [349.7487 170.6918 366.6852 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [442.3805 158.0194 459.317 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+12045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.8392 146.0642 403.7757 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+12046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.8676 134.8263 398.8041 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+12047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.8493 122.8711 403.7858 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.292) >>
+>> endobj
+12048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.7746 122.8711 423.7111 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.293) >>
+>> endobj
+12049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 110.1987 396.0208 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+12050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [387.1481 98.2435 404.0846 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+12051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.0334 86.2883 415.9699 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+12052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+11942 0 obj <<
+/D [11940 0 R /XYZ 90 757.9346 null]
+>> endobj
+11939 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F25 348 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12055 0 obj <<
+/Length 5533      
+/Filter /FlateDecode
+>>
+stream
+xڵ]m�
�q��_����n���`��N�ė�O����hw$��;��
E'����$�oE��3OU�O�YE6�^zG����NK=[.����+r�>��W�=��S
+���Wo~�䝝�b����Ń��d�ݽ}��7���?��?_�����13�
+
�υ$��W�y���+�|����D�
��{Efn���
���Z��^	Ʒ_
_���߃���Š�Iy��%��~f��i�g�����uw~��������o��5��
v�?����yw�3SJG'Kk�W�
�]?�e�J��q̊��̌��
����P:SJ���r~\y(�O���14����)5����v_
�d֜�
ȺPXح��ڙJ����kJ��?W;�L��=���N<�}V�>3&nWz�0�xp3*���e�`?����<�w?��|<<\��=���/_�����
��
w>t zD�
?��;��۠�Y6[�Eր�N�PH�84\!��5�D4Bņ�R�Jc
+�+����l�Yr6������X�=Qp�R=��G[��u-��� �5��������_q�!�z+>Å�}����ۿ�
?�v�����c~��_����JM�P��ԠBI�E	0h���S����n��t�\������S#e*1S����!�l�)5�S�m�aJ�6o at N̆B�Ʊ��̵]S�������8*yS�
���F�D��ԠҘ���+`�֦Zg
ȳȆBº���, �c�������q�����G�mU��|-�d^�0�13.ۤы
�A��qdP9
e�̵x�ݟO.����0�ܥ"a)��Ԡ�Br�
Ԕ#Cΐn�#ã����g(�u���
+	�Te�F��O�A���o�
E�P��QX؍	GJ#S^����t�L�R�h��+|J�	"���+`fI����l(,j  &U�W��
7���F��O�A���o����y�Q�QX�@�ҳ�.�{7c~�<��
�XR] �㆟R���X�m�����H�5��)<
+	�rV�7	iF܁Po
��ç_+�2����8�o�dxP?f�BpX��,^��������pz�z�e�?=�O�%
�6��Ɗ�Rx�����Ee�a1n��EQ�QH�����0�g�-�cS�À5��
ƈ�O�A���o��%�U��x6�k @�<��mT�D;
vǧ��JQ�Ԭ���7Cd&��SjPiP�w偖��P(�
(҉GaaDC��x����Р�hn��XR��)5�%��o�
++�5y���QX؍
+��z���O��/"w��������W+�&$BT4�҉�O�A-��~W.��KAf)����

+	�0�}�D}w�tz�,2p��=W�\k�=�����_�ɽ�r�j���,zew�cF&`��
a�T4oF
��JGXn��)5�%���J/�+�'y���QH�H�"3�TEJ^v�/�����
��n���'"�#�Ɔ�R�J�
+�k�!��AgY3k at Ndž��:���U����������
+z�Rw�Ũ��)5�Q��mRWZѼ
��
Tp5S�.pa��N+������q�6�z3��4��'R�R|}
��ڙF!��,|e]PH��35�F>N��e
��B]5.�=6qx���&���JG9<�0��
(�R�B�F:`<1�F�?<\���3�2H�[|�_;|�o�O	���w�u����
e$�^��[@H�� !3e�Sp��_'��	~��ECl���)5�M��V��
(�7�x
�QX؍n���j�a]�V60`��	��`���O�A�!���DI5�G���0�PX������J����{�u)��H�7��T�Q�]{/�U�
(���PX��{%fA�:>�?B��?����?��)�Xkl��r��O�A-I�~כ�����2��
(�)����\�_T+|&�p�7<��N���X����
����@2H�r��
��v"��Jr�rVt�%G��R�Zr������gU�K �
(F�G!a#�z,1ߟ�]��Z�̂
�
���O][g�x\�_n`2>smn�����ŎC��5}8�����
N�hR��a�O�A}0��m�E��,��P


+
[x�O	\ϰ�7ý��h��ok��4����B�Ƒ@a%g�ꏄ�z�C�LG?-
?�5Zr�����P*�5�XEx6�B,��zG~ܿ|�ݟ*�k�f�x*�Z��ԠV+�~3�t���
(j%���n�w獔�������r��-%]q˴��/���ԋ�[�+�V4�
�ů���
4�7���㋫��|:����Cp��3�!���R��C�[����J���
�<_PX���2�ҰK�GX;.s���/
����� ߊs�)��7�R���s��6te�a�#
pO��	���t��,���Ƿ\4�ڥV�vP��ԠvR$���f0v���
ȩ�PH�H�p���!�+w���ڀL|ᏽ���{��mQ�����Py쵠���(0,����
)3-�n��)Viz��Ԋ��o��f��0Be
(JN�B�F&�s a�g�g&��T��Mw
˩
?�����m�?(���
(V�
��-�U�K�n`��y��

_�]{]�φ[�@NDz�������Z���t<��9[�� Ǯ��O�A��~[�WP��7���
���z�
��4u���]�����>l'q��5:�c��O�Am����)X�W#�6�xV�QH�H��31�:�s���TN�R-
+�Ԡq���o��刔���R96� 	�2�j$`����.����ԠVS�~[Â�n��E^�($ldDљj�;i�X��5v�ªl��R�Z���]��r���Y���G!aKom�4�h=��G[��];�k{�DR�t|Ca|��/�
3ɚ��χ��z��ݯ*9��1�F,Gx���rD���
�P[k;6��)Fo��b��-���V��gV��/�B����j�!��=Z���bH�@��O�A����6w+ܞgY
+=
+
d�ɒ_
n
��6��;N/�6�<~J
j#(���pG����(,l�?�3�tMd�Q�x<
����;
w$��]�SjP?�{��tG��
��m@�d�B�FB����'�ob~>^?�D
�
+5P,s,�z����k�w�`K6��\`��G!aP�
AE���!e�fa�
#�ç_�"�ڢ�C!��F�e&Za����/
�8�$�Vq�T �F�\p�=Fg"Ȱ�:�]s����r�P}9u@!a#�����K�1[�F��
Q9^�\�٨���c����T�|9�],GC�un�
��
�Wx_�\xm��r�Z(j�� Bb����)9n��x���p�7��2�1P�
��
�;�~Z��)�����($l�&��f��pS�?�>xD\�m�3����v�������
+ߗ�������ݧw��
��­�Z>C�@G��H�K����BÊL)�W 6Ғ�{a�<�_��琸��W�
�<"�-�6&w��Zn�z���R�o�%P��m|Ti
����x~ĕ�5���4(,l�}���԰�l��Ҭ��{i�RlPU
�}�o�q at W@�`\v쩊�32�
+y?�B
Q�$��J�
���~��n�i_R
PX��[u��nO
E�p�7<>����s7�v�)��:���.��������_^��G��2

v��&W�I�䁺�J�޽?�/-��b�-���9�Yp�q�y�j%�}5r at aa�;��Fn-iau8+�̨9�Up�w�@��u�8GVO�
PX��A.F�d��h)�vmL
����$���1��6���;+Tna9-4T
x_�[x]�_��n����8������⸷$���=�<��-���F&W}�q at aa	��xX����q6*2xD�[�m1"�[- !vE�����܈��F�/8s��zTn
���2R�\��
�/7($ld�Fn�u�|�N�zyPw
� ��p"�t9��]�q@!a'7߯�
�vZ�1�G����%vy+��ˏ
+�)I����9����|Lv
�}	p�u�\�Y��Ԭ+; $f` ���
����R�ʍ
���~W"��
+J`YaE_n
PX�@E!7
���ޓ�<"�-��|�r�n��������|z���nם�a��G俅����I	{��
�Čl���q1�[4B��G���HK�k��lh�7�J�W
6ґ*{�����=1��j�Gd���&�3v�W6Rq�6F����e�e�cj� �+
��!k�[L0�UP?fd S�T�\�r��hc*�G侥�u�2�+��
�Wv��2n�n+㔏J�78"�-�6֣\[�*o�5t=U��
��������
���~�������
+	��Q�
M�{/�S

+o
Q��~W>ʭ
+ȀR�b�+�
($l�#շ�iM��n:��
xD�Z�mQ�<$'���
($l�"]�Rw*�p�ژ�6�{r��c���o���Ou��=l�Zӱ>n�n�[�kY��e����Az��U
��fiG�Q��GD����W�C��+m73�U���t��h�7<=�� �%v��e��
+	�A��m�h��N�lGU���yK�k�uY
A�7��U���
�Oջ#2ZA��z�G�����
$,�5��'($l �VO�	i�Gbp�����zK���x)�	�}5q at aa
�~wH	(��06�(������Z 	�Xi�z�B�F����g�(��FEb��)-𾮷��
\��ՕP?f� U�6��\��A��G#���gc����+(,h�w*�m�a��S�Q%p�#�����{Y�ܶ�о8������춣tqiKR+G���qK��t(`Z��
+
��JP�_�.
f"bȰ�8�Yk�Š�0��!(,l`0��v�.\�� xTO�����?�%t_OPXح�7���I��q ��̢]
��<"n-���
+�
l]j���6������n�=����h�7<ւ�o+� Q����o($l

�|wX��v��;�;�*xD�[�m
P+RB���B�F6R���Gp
+�8:,)xD�[�m��NJї6ґjY�^�3(��B��ֵ��:)�It��(�重l��֯�

+n���/|-���"���v��#F
R}�ߪe�F-K_�Z�m��6�JWD�,����T��ֲ
*k���/q-��H�T*]emԲ��FRR��W�6��Q����~[��&���i�h	hH���hcP?E}!k�Utnr��~6�6��[�S��׈6Ƅ�Q�ѕ�^[>6=FG8;q��6̟�^��u�������g�ݖ�7�����}X�
+����~5������$�"��X�r����x9\����߼���~��\��H��b7u�BS����4|K������P�+M�V”�5pai���ﶟ�%}m�7���Q�˅�ew�z}��͛ϟ?��/����2�o�����[��]��*�{Pі�q[���K��
��
QO狿
�|��H_�=�e:���/���hendstream
+endobj
+12054 0 obj <<
+/Type /Page
+/Contents 12055 0 R
+/Resources 12053 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11938 0 R
+/Annots [ 12057 0 R 12058 0 R 12059 0 R 12060 0 R 12061 0 R 12062 0 R 12063 0 R 12064 0 R 12065 0 R 12066 0 R 12067 0 R 12068 0 R 12069 0 R 12070 0 R 12071 0 R 12072 0 R 12073 0 R 12074 0 R 12075 0 R 12076 0 R 12077 0 R 12078 0 R 12079 0 R 12080 0 R 12081 0 R 12082 0 R 12083 0 R 12084 0 R 12085 0 R 12086 0 R 12087 0 R 12088 0 R 12089 0 R 12090 0 R 12091 0 R 12092 0 R 12093 0 R 12094 0 R 12095 0 R 12096 0 R 12097 0 R 12098 0 R 12099 0 R 12100 0 R 12101 0 R 12102 0 R 12103 0 R 12104 0 R 12 [...]
+>> endobj
+12057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.2705 719.9123 221.207 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.7918 708.6744 151.7283 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+12059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 696.0019 151.2202 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+12060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.0172 684.0467 293.9537 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+12061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.8601 672.0916 202.7966 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.298) >>
+>> endobj
+12062 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.7854 672.0916 222.7219 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.301) >>
+>> endobj
+12063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [218.9155 660.1364 235.852 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.301) >>
+>> endobj
+12064 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.1791 648.1812 280.1156 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.301) >>
+>> endobj
+12065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.8775 636.2261 192.814 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.302) >>
+>> endobj
+12066 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [275.3433 624.2709 292.2798 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.302) >>
+>> endobj
+12067 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.1952 612.3157 196.1317 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.318) >>
+>> endobj
+12068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.0705 600.3606 200.007 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.318) >>
+>> endobj
+12069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.5697 589.1227 189.5062 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.317) >>
+>> endobj
+12070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4451 577.1675 193.3816 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.317) >>
+>> endobj
+12071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.6456 564.4951 238.5821 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.318) >>
+>> endobj
+12072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.0201 552.5399 231.9566 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.317) >>
+>> endobj
+12073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [256.6837 540.5847 273.6202 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+12074 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.7894 528.6296 274.7259 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+12075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6757 516.6744 182.6121 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+12076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.3978 504.7192 195.3343 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+12077 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.6043 492.7641 241.5408 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.324) >>
+>> endobj
+12078 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.9682 480.8089 221.9047 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.322) >>
+>> endobj
+12079 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.6904 468.8537 234.6269 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.323) >>
+>> endobj
+12080 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.5141 457.6158 212.4506 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+12081 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.1215 445.6607 213.058 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+12082 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [224.4547 432.9882 241.3912 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.324) >>
+>> endobj
+12083 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [212.7289 421.033 229.6654 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.325) >>
+>> endobj
+12084 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.1802 409.7952 192.1167 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.331) >>
+>> endobj
+12085 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.821 397.1227 207.7575 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+12086 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.3082 385.8848 171.2447 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+12087 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.1154 373.9297 164.0519 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+12088 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.6027 361.2572 236.5391 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.329) >>
+>> endobj
+12089 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [239.5279 361.2572 256.4644 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.330) >>
+>> endobj
+12090 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.1362 349.302 233.0727 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.327) >>
+>> endobj
+12091 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4386 337.3469 224.3751 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+12092 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5742 325.3917 233.5107 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+12093 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.4995 325.3917 253.436 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.322) >>
+>> endobj
+12094 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.2964 313.4365 246.2329 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.323) >>
+>> endobj
+12095 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 302.1986 172.8988 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+12096 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.2828 289.5262 207.2193 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+12097 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7824 277.571 196.7188 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+12098 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.9687 265.6159 234.9052 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.330) >>
+>> endobj
+12099 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1614 253.6607 290.0979 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.325) >>
+>> endobj
+12100 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [257.6695 241.7055 274.606 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.325) >>
+>> endobj
+12101 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.5444 229.7504 225.4809 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.327) >>
+>> endobj
+12102 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.2024 218.5125 170.1389 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.315) >>
+>> endobj
+12103 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.1277 218.5125 190.0641 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.316) >>
+>> endobj
+12104 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5485 206.5573 168.485 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.316) >>
+>> endobj
+12105 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.0824 193.8849 218.0189 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+12106 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.455 181.9297 193.3915 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+12107 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [213.3762 169.9745 230.3127 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+12108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [184.1862 158.0194 201.1227 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.311) >>
+>> endobj
+12109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.1115 158.0194 221.048 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.313) >>
+>> endobj
+12110 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 146.0642 172.9784 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.329) >>
+>> endobj
+12111 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 134.109 179.5395 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+12112 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 122.1538 175.2797 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.328) >>
+>> endobj
+12113 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [221.8141 110.1987 238.7505 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.329) >>
+>> endobj
+12114 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.1885 98.2435 227.125 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12115 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.0639 86.2883 231.0004 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12116 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [420.0444 720.6295 436.9809 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12117 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [423.9197 708.6744 440.8562 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12118 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.5217 696.7192 400.4582 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+12119 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.8849 684.0467 484.8214 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.327) >>
+>> endobj
+12120 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [437.4492 672.0916 454.3857 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+12121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.2259 660.1364 471.1623 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+12122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.2536 648.1812 413.1901 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+12123 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 636.2261 367.7015 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.330) >>
+>> endobj
+12124 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.8699 624.2709 424.8064 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.324) >>
+>> endobj
+12125 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.8768 613.033 393.8133 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12126 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.8021 613.033 413.7386 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+12127 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.3104 589.1227 398.2469 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.331) >>
+>> endobj
+12128 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.6765 576.4502 412.613 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+12129 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.5519 564.4951 416.4883 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+12130 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.051 553.2572 405.9875 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+12131 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.9264 541.302 409.8629 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.348) >>
+>> endobj
+12132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.1269 528.6296 455.0634 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.348) >>
+>> endobj
+12133 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [431.5014 516.6744 448.4379 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.349) >>
+>> endobj
+12134 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [473.165 504.7192 490.1015 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.354) >>
+>> endobj
+12135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.2707 492.7641 491.2072 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.354) >>
+>> endobj
+12136 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [382.157 480.8089 399.0935 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+12137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.8792 468.8537 411.8156 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.351) >>
+>> endobj
+12138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.4496 456.8986 438.3861 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.353) >>
+>> endobj
+12139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [434.1718 444.9434 451.1082 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.353) >>
+>> endobj
+12140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.9954 433.7055 428.9319 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.344) >>
+>> endobj
+12141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [412.6029 421.7503 429.5393 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.344) >>
+>> endobj
+12142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.3023 409.0779 424.2388 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+12143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.7896 397.84 387.7261 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+12144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [363.5967 385.8848 380.5332 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+12145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [400.4082 373.2124 417.3447 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+12146 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [432.6175 361.2572 449.554 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.356) >>
+>> endobj
+12147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [423.9199 349.302 440.8564 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.356) >>
+>> endobj
+12148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [433.0555 337.3469 449.992 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.351) >>
+>> endobj
+12149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [452.9808 337.3469 469.9173 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.352) >>
+>> endobj
+12150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [445.7777 325.3917 462.7142 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.351) >>
+>> endobj
+12151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [465.703 325.3917 482.6395 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.352) >>
+>> endobj
+12152 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.4437 314.1538 389.3802 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+12153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.7641 301.4814 423.7006 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.349) >>
+>> endobj
+12154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.2637 289.5262 413.2002 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+12155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.0257 277.571 441.9622 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+12156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1504 265.6159 438.0868 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+12157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.6837 254.378 386.6202 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.344) >>
+>> endobj
+12158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [368.0298 242.4228 384.9663 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.345) >>
+>> endobj
+12159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 229.7504 389.4597 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+12160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 217.7952 396.0208 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+12161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 205.84 391.761 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+12162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [439.8202 193.8849 456.7567 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.340) >>
+>> endobj
+12163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7455 193.8849 476.682 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+12164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [426.6699 181.9297 443.6063 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+12165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [430.5452 169.9745 447.4817 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+12166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [420.0444 158.7366 436.9809 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+12167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [423.9197 146.7815 440.8562 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.348) >>
+>> endobj
+12168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.8849 134.109 484.8214 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+12169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [437.4492 122.1538 454.3857 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+12170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [396.2536 110.1987 413.1901 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+12171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.7651 98.2435 367.7015 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+12172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.8699 86.2883 424.8064 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.353) >>
+>> endobj
+12173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12056 0 obj <<
+/D [12054 0 R /XYZ 90 757.9346 null]
+>> endobj
+12053 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12176 0 obj <<
+/Length 5344      
+/Filter /FlateDecode
+>>
+stream
+xڽ]k�
�u��_1��H���ca��޵��f� A�Ơw�%�=/���]��\V�H6_�B�@�0=}��[�%���]Q�Ǯ
�2�'����E�>���}���
|��o޽z�;��
q��w�W���zw��׿�������?\Ij	U
��K��o_��]�
�+�����W�3���F��%�Yu�>Pœ�W��$���W|�����j��b��	ųN0
+?s%�
�j��7���������pz��l;�>
�l�XC���懬����T~}K�tU�&B��E�#
+
	`�0F�k����x��������������3Dh�!�Î_r�F�*�+��
��#�Q[4��!���;�9”��p}z}|���7/'\H­e�ɘ�_2|ݴ�k����^��1
��;ϮA?�n���ݜ��X#m�Brb�/�A�5�ߍY'�&�YS4��7v�)m�R�5����������~�x�=������p��믿<=�<_�7\��|<Ç:C�#��
#)��ܠ�#�ߍ![5�I"
SE�,�QHؔ&Z@��-7���0�~8:>�
Y�s&��%���,)��
�F�(� {�TYPX�ȁ�\H���� #����t�{M��0c3HR��%7h$E�C�9�q΋�I������ �
o���
+	Ӕ��
+ˊ�_r�VV�~�Y��3�e��(,l$��3e�,+4TQBGXR���[9Qx��PUtM�s��^f��L\0E��6'c+�ꑒA���I� _r|�)�׭���FKu�_&΢F(�g�4@�A(���VZ���j��o��(�N�
����B�FB�����AHc�0�d�eVXN������ �!�I��TCD at aa#	0y_�E�~ڷ<���"�ܠ���#\�B���TiPH�Ĉ6DK�f����_`U�&�"�+�L��X�/�Ak9V�����T#E at aa#J�BJ��叔������QSiM�a.�a,���[$^7L����^Q@H�Ȁ�ck
+���
�]�I�l�"�ܠ5@�~{D��Yز� PX�H�`�X
�������@�
0q8��^N��R���+�P�v��4F���J��Gf�3#�T��B�&*����lC�7�~�\X��x��xw�d�
B����N��2�ܠ5Z�~7Nh���[�l@�D($l�X
��������[�s����%[��
��
**�=*�3X}�
(��QH�H��E�cf�׍�������)�i���v	�%7h�.��m�v�8�R�ڲ%;
+	������OGw,�w���DX����[�Qx��!тѫ��q�D��Rm���Ϗ�ׇ�
��?��Ƭ�4��T&{l�3�ܠ��Y�]����
c0�JQ4�J
+
��ULWt�t���������|m�M����M�K�]*�k��
hl��(,l�BZB��Ǜ���*��ckm�+|��a4���h(��&W
seJv����~��p����u�c�+�[��m*n�^�Bz��0����0��[/���
TV���>�`���7bW?�ܠu�K����0�jV6������<pI��l�a[�6��P�
�/�n���/�A�!��� �
�+l�TO�
+
�y����v�!��eG#}��K�o���M��^�	�T���Bb�~S ʨm��=�����y۷�=�`+x��7kW���7k/�nD��f-��h at c�vEaaw*����8k�m]��7`��@��	f���j���%�J��1�ܠ54�~�!�ޞ0�-�TS@!a�)��
�?�UL<7*iK��6�b�t�/�Ak�*����&Q[6��%
+	��ВHF�A����x>ܝ�>���˨
U�	�
+~�
��q鷳/�/�b�l@#=V��֮�!�L�ӽ��h�����XT
R���;
+	�2�(�ƙ�_X	�
7�FK�/�A���o��`Vкh@�
PH�D��DN
�/������(�����/��yy��� ^"�5R\x�Xh
Q�轈[-#d-��[���lPp�ۧ�]��+�L�ޯ�%7hp�w���
h���	
[������#��mc]�4��X'<VG������oo��0�(/PՑ���ݧ�h!��;=��� 7�}I_�s�X��+~�
�
�K��j�/`B,�7�
��i���h
4h@�l)A��
�n�{c�/�A�ި��8іp�l����B�&V�� .����>��'�֝��Qc ��~Tf�/�A��̥��R�)���
h
�YQX���f�[�ޝ
����QF8ʘ���:�d��3��kg�%�DE� Bb��+Ml���i��v0�R�L��"�ܠ5W�~{����V�UY
PH�Ą����zc���h�����
�M������ۻ�#L���;�����f�
��
7��
����n���[3�qH�w6^sX?8*��;0(;�b#±k
�Kn�^�5�3�-P]���V�:�
�mC�t�w<��۩	��v2�t:������V�n����t�|z>^������C������p,໧C/��x0�}��gCј����¾��Ia����}��h�%7h�P���_�Np&eр�*
($l�͇�����kf;
�h
J�[�Mk��
�q�w����f+4�ǰM����qtX�?�cF�h�m
�����J����\�da�Tl6�aaQi�
��(�ֵ(��
�#�ܠEG�w.VPB�dE����B�&:
d�?�ߤ�wF��JL)��c�J�/�A�V)��N�2�
�q��T��MlhHN'���n=�d?��l6��n��z6��j���6�����Ѱ����
ᐓ��q��ݧu��������o�	����ҲU�PX�H�0�l�,Pp��)^<}�x<O,���^��a[
+���-��oo	%���l@��PH��
��M�kq��™?�ē��
��
R*�=R��G�Xрj@
($l"��M��6�?���N������������`�� ,�%���I�Kn�ڤ/����� z��/P=�($l��z����g�A��n���v�ǖ�Jv�O
�����
�����,�%/���(,�N�X�_��,|~����S�y�L�;��^2t#���ގ���äp���L��&��ξ�h@�B�$�p���
���q
��s��y[���:�Ar�P���zޡ:�����

�@.�?�
+e�� :�%r�S�
+��y!6@Gv' W�Lj��z�����G}��'��>�
W^;��%��z%�@�
A㘕��ތ�����o�c�
��a��br�T簿;��#欐w#�f�(�	��BZ���;���j�#
�~;��f�!���9������ďO�������k�^��W5
P�*�����Ȍk�
�a��
�n�(,ld!��,��oâ���I1s�#���o��VkZȱ�9������|8f�~�;�r�w�xx�ɯ�A�
h"�Q��  ��hR	
�$���� E(�z���(,ld0S
G9}��
��P�䟒>G�X�\y�&'Z*9�>G3v>
��M���C�B��=G<"A��v/�/�aP
*�#
+
'�\_�O4�
g&�I
p�hƂ���Ƒ�N4C
p�h��{�\�m�'�I�o�h�"���Ƃ�N4C�o�h����\p;3�L*�D3���~{�ߧ���7M4H���Lk��3��i��43��V^�����f8�1㘑�\�;9�Lj��$3��~��f��V8�3H�HA�˝�h&�i�+uk��S�P �&$�>�\hpщ���1����%�jV)
�d���!�
%�r��($lJ�\����I8/��vV"
�V����%�V��d��ڌ%����9�P�~�k���D+�g5���uk�=B`f����P#
QH�DH&�����u4
+�IUp����ו Vo��3gCUp�c�����/zC��P)	�f���(tk�=>��k�ucapD!a#�yMӺ[)7��xD�[��n
+��t^
9RG6r�kQ��MMR�B�Y�l�#r��o���3��U���M��T�MM����OJd#
Ѫ�~7L��
Kd#
+
Iȕ�_�&	���nZ4�z���c�PbaT�f#
+	�����M%�W�����r6��*��kof�P9AH���\�z�{,(��Y�l�#:��o�
�J��X>QH��DžJ����
K�f%��hWk�����C��d6�����\�z���
�fu�;
ѯV^76\��0��X5QH��F.�\�8��o��[�
+H#
Qr�~{��]5"z, �($l"%hzR���P��������|V;񈈳��U�����+��шB�&F�RsD�8[���2�
+�e���7q�w��L��H��M�bl�ӭ¤�~��
+,#
Q:�~{5�\_�i�ˈB�&Fr9�dxq�VI��.#
Q@�~;3���[6�XwQH�Hυ���g0%K��|Vs����ۛ������XsQH�DH.r
���?H�f��;
�DV^;���-��P�������L��y)O���
�:�6�fX
h6+ʌ�@��
�u�X��(��D�4�����]:�Ώ96^D+�a=����N���� :�n�Ό($j�$N��DXA��:bR��t���%F}���
�NJň��F
r���k>��+��N
+�"
���~;T@!
+��!J����F*r��7��0�Q_^ZC���/�}]�w�´�V�$��"
+	��ȕd_�Qɡ��PNJ�"
њ�~7>ꅍ0DXg���B�F>.�d_��Q)���2�
���*�����1>ָ� $fb#���l�;f��ž�TT���v8�;��n��+T��b�
��L�䢲�������ϊ�����"
��~{��:a�
��"
+	����e�/����αi�[�#���V��G���kJ�uo��Mt�Z���J&��6���"
��~�T�E�`c�[D!a��l�
����oR�����+H� ��Sc�[D!a��l�Ra�a�	'em���j��<V�
+�ٱ�-������l�+�����|wN���Y�u�z]�����K�"
+���Kž�ݜҿ%�/u&5l���j�ۭP�J�ٕ1c
[D!a#��l�՜�8��II[��d�׍�\h�F��E� Z8�`ە��L+��ۡ�_8���� Y��cq��^����
Ua����q;�����ɲ�c8^�}������(��y��o��O�������[�rm���R����oy�F_��x�ԡ�R�Xl�����_����%��Kf��MW�u��������o?�Ln�ɧ��ә�^�>=ݽm
r܈�vU���j��0�m�A¬-������p9N����^$U�ʚM�_����endstream
+endobj
+12175 0 obj <<
+/Type /Page
+/Contents 12176 0 R
+/Resources 12174 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11938 0 R
+/Annots [ 12178 0 R 12179 0 R 12180 0 R 12181 0 R 12182 0 R 12183 0 R 12184 0 R 12185 0 R 12186 0 R 12187 0 R 12188 0 R 12189 0 R 12190 0 R 12191 0 R 12192 0 R 12193 0 R 12194 0 R 12195 0 R 12196 0 R 12197 0 R 12198 0 R 12199 0 R 12200 0 R 12201 0 R 12202 0 R 12203 0 R 12204 0 R 12205 0 R 12206 0 R 12207 0 R 12208 0 R 12209 0 R 12210 0 R 12211 0 R 12212 0 R 12213 0 R 12214 0 R 12215 0 R 12216 0 R 12217 0 R 12218 0 R 12219 0 R 12220 0 R 12221 0 R 12222 0 R 12223 0 R 12224 0 R 12225 0 R 12 [...]
+>> endobj
+12178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.3955 720.6295 177.332 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.349) >>
+>> endobj
+12179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.3706 707.9571 213.3071 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+12180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.2918 696.0019 250.2283 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+12181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.8785 684.0467 197.815 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.354) >>
+>> endobj
+12182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.4313 672.0916 295.3678 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.358) >>
+>> endobj
+12183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.1952 660.1364 196.1317 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+12184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.182 648.1812 258.1185 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+12185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.0705 636.2261 200.007 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+12186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.0574 624.2709 261.9939 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.375) >>
+>> endobj
+12187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.5697 613.033 189.5062 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+12188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [234.5565 601.0779 251.493 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+12189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4451 589.1227 193.3816 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.373) >>
+>> endobj
+12190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [238.4319 577.1675 255.3684 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.373) >>
+>> endobj
+12191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [164.8288 564.4951 181.7653 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+12192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [165.6757 552.5399 182.6121 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.377) >>
+>> endobj
+12193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.3978 540.5847 195.3343 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.377) >>
+>> endobj
+12194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [202.4572 528.6296 219.3937 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [230.5419 516.6744 247.4783 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+12196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [215.7476 504.7192 232.6841 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+12197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.9682 492.7641 221.9047 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.379) >>
+>> endobj
+12198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.6904 480.8089 234.6269 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.379) >>
+>> endobj
+12199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [195.5141 469.571 212.4506 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+12200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.1215 457.6158 213.058 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+12201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.379 445.6607 208.3155 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [211.3043 445.6607 228.2408 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.384) >>
+>> endobj
+12203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.821 432.9882 207.7575 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+12204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.3082 421.7503 171.2447 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+12205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.1154 409.7952 164.0519 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.371) >>
+>> endobj
+12206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.9269 397.1227 200.8634 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+12207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.1362 385.1675 233.0727 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.382) >>
+>> endobj
+12208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4386 373.2124 224.3751 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.382) >>
+>> endobj
+12209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5742 361.2572 233.5107 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.377) >>
+>> endobj
+12210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.4995 361.2572 253.436 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.378) >>
+>> endobj
+12211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.2964 349.302 246.2329 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.378) >>
+>> endobj
+12212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.3789 337.3469 216.3154 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.370) >>
+>> endobj
+12213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.1296 325.3917 216.0661 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.370) >>
+>> endobj
+12214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 314.1538 172.8988 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+12215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.2828 301.4814 207.2193 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+12216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.2696 289.5262 269.2061 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+12217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7824 277.571 196.7188 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+12218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.3391 265.6159 192.2755 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.5444 253.6607 225.4809 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+12220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.2024 242.4228 170.1389 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.368) >>
+>> endobj
+12221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.1277 242.4228 190.0641 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.369) >>
+>> endobj
+12222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5485 230.4676 168.485 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.369) >>
+>> endobj
+12223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4738 230.4676 188.4103 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.370) >>
+>> endobj
+12224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.1948 217.7952 196.1313 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+12225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.2742 206.5573 204.2107 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.365) >>
+>> endobj
+12226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.1995 206.5573 224.136 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.367) >>
+>> endobj
+12227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.1885 193.8849 227.125 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+12228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.0639 181.9297 231.0004 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.375) >>
+>> endobj
+12229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5631 170.6918 220.4996 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+12230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4384 158.7366 224.3749 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.373) >>
+>> endobj
+12231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.0404 146.7815 183.9769 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.371) >>
+>> endobj
+12232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.4036 134.109 268.3401 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+12233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9679 122.1538 237.9044 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+12234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.7445 110.1987 254.681 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+12235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7723 98.2435 196.7088 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.371) >>
+>> endobj
+12236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 86.2883 151.2202 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.8699 719.9123 424.8064 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+12238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [376.8768 708.6744 393.8133 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.375) >>
+>> endobj
+12239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.0413 696.7192 405.9778 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.382) >>
+>> endobj
+12240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [408.9666 696.7192 425.9031 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 674.1489 362.2721 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.384) >>
+>> endobj
+12242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.5792 660.1364 398.5157 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+12243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 648.1812 389.4597 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+12244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 636.2261 396.0208 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+12245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.7052 624.2709 383.6417 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+12246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 612.3157 391.761 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.385) >>
+>> endobj
+12247 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 590.4627 362.2721 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.386) >>
+>> endobj
+12248 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [381.5792 576.4502 398.5157 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+12249 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.5232 564.4951 389.4597 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+12250 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 552.5399 396.0208 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+12251 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [366.7052 540.5847 383.6417 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+12252 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [374.8245 528.6296 391.761 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+12253 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.4862 516.6744 484.4227 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.387) >>
+>> endobj
+12254 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.6765 504.7192 412.613 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+12255 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [457.6633 492.7641 474.5998 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+12256 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [399.5519 480.8089 416.4883 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.410) >>
+>> endobj
+12257 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [461.5387 468.8537 478.4752 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.410) >>
+>> endobj
+12258 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [389.051 457.6158 405.9875 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.405) >>
+>> endobj
+12259 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [451.0379 445.6607 467.9743 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.405) >>
+>> endobj
+12260 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [392.9264 433.7055 409.8629 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.407) >>
+>> endobj
+12261 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [454.9132 421.7503 471.8497 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.407) >>
+>> endobj
+12262 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [387.3775 409.0779 404.314 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+12263 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [449.3644 397.1227 466.3008 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+12264 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [391.2529 385.1675 408.1894 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.408) >>
+>> endobj
+12265 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [453.2397 373.2124 470.1762 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.409) >>
+>> endobj
+12266 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [470.3953 361.2572 487.3318 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.406) >>
+>> endobj
+12267 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.1269 349.302 455.0634 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.411) >>
+>> endobj
+12268 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 327.5485 362.2721 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.411) >>
+>> endobj
+12269 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [431.5014 313.4365 448.4379 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.407) >>
+>> endobj
+12270 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [493.4883 301.4814 510.4248 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.408) >>
+>> endobj
+12271 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [429.8279 289.5262 446.7644 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.409) >>
+>> endobj
+12272 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [491.8148 277.571 508.7513 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.409) >>
+>> endobj
+12273 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [473.165 265.6159 490.1015 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.419) >>
+>> endobj
+12274 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.2707 253.6607 491.2072 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.420) >>
+>> endobj
+12275 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [382.157 241.7055 399.0935 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+12276 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.8792 229.7504 411.8156 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+12277 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [438.874 217.7952 455.8104 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.417) >>
+>> endobj
+12278 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.4496 205.84 438.3861 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.416) >>
+>> endobj
+12279 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [434.1718 193.8849 451.1082 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.417) >>
+>> endobj
+12280 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [493.5088 181.9297 510.4453 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.418) >>
+>> endobj
+12281 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.1316 169.9745 491.0681 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.419) >>
+>> endobj
+12282 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [411.9954 158.7366 428.9319 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+12283 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [412.6029 146.7815 429.5393 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+12284 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.3023 134.109 424.2388 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.420) >>
+>> endobj
+12285 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [370.7896 122.8711 387.7261 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+12286 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [363.5967 110.916 380.5332 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.404) >>
+>> endobj
+12287 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [432.6175 98.2435 449.554 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.421) >>
+>> endobj
+12288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [423.9199 86.2883 440.8564 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+12289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12177 0 obj <<
+/D [12175 0 R /XYZ 90 757.9346 null]
+>> endobj
+12174 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12292 0 obj <<
+/Length 5083      
+/Filter /FlateDecode
+>>
+stream
+xڽ]ms
����_������`T�٢m�ɐ�Nv��Z�+i/|��R��~}3 ���9�|�*�H>�F?�ht
�
Q��
u�U-��G��У����0��~�Āo��<�N���t����͈�]������˓w���󑤆P�A���T�~��ɵ��+�����'�=��I��	%�3��
|A	�:~t�Dr1~q����_������
����GF0
+��J
�\��v�7����v�������1WO���oVۻ�����p��T!�l��
�2���7�|r�ܞO��	N��:<
+S�I�js�EKd��b�G<�>�;X��	(N��Z����
��a��yO��7g��AF��7�-�ܚ3HE��:�@Jˈ��f��Π`v�,6��1�Ԛ'hE�f
b�B�zO�]G�R���n�e{����\������*	e��Fx�
$�RL
�
�J��
��y�����kz��ևO��7��3�A��?o��7��<2���<�QX�HGy:��z���z�[�~)�^���q�?l�?n�k.�:Fx۱0!b�7�Œ2����5�\$�S/p L��A
�M�j4���7�����e!6�h�� 
��J�!�[�D�i�N 
��
�(F�����=�n���~ vV�w�gJ�ֺ�8
���
+����,�|�t����H�Ȉ��zDGD�
��<���o~�����昩��|ܯw��e��„
�
C<���_p�Tj-rM���1Q��LjB�f8$2\N����rV uQ�/	[7�D�ҲI��t�����D{�h
h^g�)"�r��n�[
v��X:w��Pq(l�
Q��a(��:|(m���aka��$�X7�L %bD!jT s�uL��
;���O��=±���x at icM�Q#��LC� y:�4j�(L�h���L)3�������Ji
���x@��Tn�zpjc�	d�;�6�V̥Y
KK�b�G<�>�;X-�
+��$b�aJ�'�v�c؞�̭杭ot "V��&
P�@&w�:������Q�R�G���
��f�|
vPM>>���O_o	����;|(�z*w�s��B�N��B[��ۯѝ��oU?���/�#�0���$��ȮU�Y�꺠�o�7��f���@H|�=#ρ��;)H+�ak�l�+l��!ć�~s�f����f?
�2x�K;f"uH
d�a����l�t(Dk C0��2>}���b����:
��m�o��t;�[):Xן;�dY��P�Z���T����յ�
2��M<�tD�ʭ�a���	dv��
��_��K�(����?\BSb�da !
���BD*w�ah
#�����D#�4�U���8�qf��#
Ӟ�
Lf�	��<�0��G.a@�L�v�qg�_���|��������szF�������
�����S���yd���tYdt(Dm`���Y2
+��TS�cd8x�K\$RkTJ(�E3ў�X8м�@d��jSf� %����xl�T
��m{|(�N�\�&�9e3����[�B�6 .Q��,���)d�ct8|(ёʭ�A 
H'���B�:�!�����^,
������v
+�o���"�[;��Y����̡0���6fG�݃=����������~�y
��ž�{a��T�o��c����y
�
B�t���
��
�p	A\�78)
�"-y���2�x@��L�@
+�é&
5,�@O

+QHa
��A�a{���~���|�w`B
�If�
���/�	u�&—.B��2D	��]9֞%�4�3B)��t�B��!�\@0=T�/�¸%��x at -���֎r�̊�(�_
W;� �!��!��
3�t�˭�p������)$2k帽9�2ѝ��@��TV9Ն��Ә����Q����
�8�q�����u������B�
+���aS��8ndb7���J7���aݷ���M:��
+ԡ0��-�dtؖ>��
��<0�Ș	#����x@)yH�V�'f
*�@����葰-4J
�������n�K�������z����{:����l	���j����
����R���U
���ȶ�B�ϐ�
޸��Y�CR������]!
��h����K&��G���
Ԏ�Rc�v�W/�	h
+A����b����7�ʝ�D��]W��2�@�R��0��;��2�Զ���pn��]�5<��G|(L#�;Xo��n��d,�@��8��[������]�N}<���=aSt���A�����&
Pv���7h�	�t7�Q�ڑ�]��-��%���$
0sI2���zI2�@��Q���
����ī\zM��'��Rd�݁L'P�)A�z��nu7!�O%�`���c���M�/�O"�j���E$�3�
��-W�&�%�z������n�I�~H�A��
�8|(
�r+a�sJ4�X2��ǡ��
+)���V����c`55�8���J^�ʭ�&���������z���^�EE�/+�bx�(�L�������e�Jo58I'���w��!��|S�O �װ��@�>q�&
P�OR�5�g��2j�	d�����<PC ��
+���x�~_Hͅ�9�)�Q��7��YM*�F��|����u�B�B�b?*��Y.7�폿��ݬN�w�
�hہ�� ag�7�;���������	��(D�e�(U���\�٦��jab���� k�t�&
P��L�ָ�lÙJ��8��/&�B���!�����zN{S
{������J9y*w`��z�
k�d��C!j�whF�"��w\����z[j:0�B�
B����x@��O�V�ᐘ�K�	d������ 
��=f��O�ef�Q��X�u�&
P���܁���MAp�
#�@v
�P�ڰvDK��C���
�V?�(P�կ�7�r��T�`�,����d�
+�~=
+S�-��!�o�U.���3U�Ĕ�c}6�@��C�z� B1w�2�u+\��d�Qav���M<�t��ʭ��"m��N 
����$P{�x?CDA��0;s�&
P:K���#R��	d��C!j!���H�V�
�ϟ�p�[�
Q�0{ˡ�`$Ȏ�&�bl*��!��8��j��c�W�����e

+�
��/"�J�>�]N�auU8��mQ�����#�ms�e�	o9��ף��I4}���ka(�T/}
���;�\��`�<Vt��r���(L��`�
u�#	�!�Z�:���_�fR+
HjmRz�u�!:Dž6y����v}{�u��67���x(��,�O�Ȝ�9J�嫘s�d��	�G�BfR�T��j4	��=Ǜ}9�0��,����O\rBm+�R�G<6�L�`u�7J{� [b��B����y^���]�F�������6i8dk��-|������\��$�m
�[�.YͿ��(Dm�Xы�yj�ۛU�!��9떾I�x�q`.��Gg�͆6��7�
����?�ٷ��������m���ߙ�r1ך}�\k^��n���Rw�<��~��H����,�
��2�]�.����(eR� �U��r�mg�Eyм�LV5���U�B�G4�|*s��-m�R�n���p�k�;���a�'3�@�JA��WT
�<g��V�8�K�v��G!j�s��~O�=Éh�}�˭��
+4�=Éh�U�i��w�}��;r���J�t�)I&#t��J�sVg�3~'��_��F:�]�꓏��
BR3�� �k�	UV5��}��D��M���sv���eM�A�����~o�����#���z�������h���K��=
�J��V�_*F����o��(Dm.�|�3~�
�ƒ��7h�r+O0�?����AԎ^3iþ8u�(}�������Vߞ��xu�����7� ܻw���I}�/
���nC��nj�Gښs�vN:?}�5�ߦ�6S{�5�7i�.1Q��_��\;�a�/y�AO�w]=�aQ�s�( ڵ����A���=�H>y}Q0U���[���H{r.��9�D
8[/�6E{��[
w#���:ěcI��xU`@���.��x�E9�[��E
8j��\c�GaZ=q���'/��������j�)�
dri���#�ʹ��:�Z��V��i�B�zF&��F�xq��@
����>���+gR+0�Ap�o��(Di� �,~uru�� nj�".�v�x��8�[�= �l��\��G!ZQ�qOD����`[��<�绎S���`OϠ���s� D�7:�)~�����ӟ�*8=/� M�i��
g�G��s��E 8�u�-�
�h
,ĽůO�P �g�,�u�x��8�[c��V��Vg�B��N�s����P LK��K;�=
iD�������;��~�(L�g"�6>����p�r���buqi�8������/���6A�p�9�Zq
+
0���h�B�*�
�zE�s�
$�ri��#]ȹ�
+
�B\Ez�=
+���4���������PO��
*(�fi���#�ƹ�r2m���@�5���Q��@C�?
h8�����@Bgoc��vf�G:�s�5೵��y��٣�����8�0Fγ���'/
����^����
���r+dH�I��y!:q�p���Eaǐ pi�C#�é�J]�I�����e��tz����> �F(R����C��V�\n%0*�)���=
+�h���ߜ}c?�%[&d��Bʳ�k����\nm��Y2l'�M�
�h
lĝ�oξ;yqu
+�/�C���x #]���
�(;`��أ���������ۓ˫�b'�������c�GZs���`D*5�p�Q�Vo���x����������ُ��Z�6
�������\neK��w���v������M�oW/O߮~><?� ��F����#��MdV,[
z���́�”s(
+�!��֟^��@���Y7�0[���P(�*��O�c�w_����r�C�tI�o����zz�~�����
��
Ut��{�:`�&L�����O9>�ӫ�&o
+oIg�w�	�,
?������p7��F
��L���5��q��ٳ/_�����~�ۓ�����Y�C��[1�W�,�@�\&�۴[��L���a?u��w��
�y��2<�_���/{�Kendstream
+endobj
+12291 0 obj <<
+/Type /Page
+/Contents 12292 0 R
+/Resources 12290 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11938 0 R
+/Annots [ 12294 0 R 12295 0 R 12296 0 R 12297 0 R 12298 0 R 12299 0 R 12300 0 R 12301 0 R 12302 0 R 12303 0 R 12304 0 R 12305 0 R 12306 0 R 12307 0 R 12308 0 R 12309 0 R 12310 0 R 12311 0 R 12312 0 R 12313 0 R 12314 0 R 12315 0 R 12316 0 R 12317 0 R 12318 0 R 12319 0 R 12320 0 R 12321 0 R 12322 0 R 12323 0 R 12324 0 R 12325 0 R 12326 0 R 12327 0 R 12328 0 R 12329 0 R 12330 0 R 12331 0 R 12332 0 R 12333 0 R 12334 0 R 12335 0 R 12336 0 R 12337 0 R 12338 0 R 12339 0 R 12340 0 R 12341 0 R 12 [...]
+>> endobj
+12294 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.5742 719.9123 233.5107 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.415) >>
+>> endobj
+12295 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [236.4995 719.9123 253.436 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.416) >>
+>> endobj
+12296 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.2964 707.9571 246.2329 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.415) >>
+>> endobj
+12297 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [249.2217 707.9571 266.1582 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.416) >>
+>> endobj
+12298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.0155 696.0019 219.952 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.418) >>
+>> endobj
+12299 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.9624 684.764 172.8988 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+12300 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.2828 672.0916 207.2193 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+12301 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [252.2696 660.1364 269.2061 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+12302 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7824 648.1812 196.7188 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+12303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9497 636.2261 287.8862 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.418) >>
+>> endobj
+12304 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.5725 624.2709 268.509 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.419) >>
+>> endobj
+12305 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.5444 612.3157 225.4809 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.421) >>
+>> endobj
+12306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.2024 601.0779 170.1389 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.403) >>
+>> endobj
+12307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.5485 589.1227 168.485 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.403) >>
+>> endobj
+12308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4738 589.1227 188.4103 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.404) >>
+>> endobj
+12309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.2963 577.1675 145.2328 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.405) >>
+>> endobj
+12310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 564.4951 172.9784 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.423) >>
+>> endobj
+12311 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 552.5399 179.5395 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+12312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.6217 540.5847 223.5582 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+12313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [181.9943 528.6296 198.9308 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+12314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.9811 516.6744 260.9176 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+12315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [159.8478 504.7192 176.7843 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.400) >>
+>> endobj
+12316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7731 504.7192 196.7096 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.401) >>
+>> endobj
+12317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.1885 492.7641 227.125 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [214.0639 480.8089 231.0004 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.5631 469.571 220.4996 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.411) >>
+>> endobj
+12320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.4384 457.6158 224.3749 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.0404 445.6607 183.9769 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+12322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [251.4036 432.9882 268.3401 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.421) >>
+>> endobj
+12323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [220.9679 421.033 237.9044 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.420) >>
+>> endobj
+12324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.7445 409.0779 254.681 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+12325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.7723 397.1227 196.7088 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.404) >>
+>> endobj
+12326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 385.1675 151.2202 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+12327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.209 385.1675 171.1455 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.423) >>
+>> endobj
+12328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.3886 373.2124 208.3251 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.417) >>
+>> endobj
+12329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [160.3955 361.9745 177.332 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.3409 349.302 258.2774 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.423) >>
+>> endobj
+12331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4641 326.109 188.4006 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.6819 314.1538 159.6184 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.428) >>
+>> endobj
+12333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.8029 301.4814 188.7394 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.0419 289.5262 172.9784 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 277.571 179.5395 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.3432 265.6159 175.2797 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6689 253.6607 221.6054 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.0869 241.7055 169.0234 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.428) >>
+>> endobj
+12339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [134.2837 229.7504 151.2202 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.3706 217.7952 213.3071 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [233.2918 205.84 250.2283 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.0196 193.8849 279.9561 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [277.5748 181.9297 294.5113 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.8775 169.9745 192.814 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.431) >>
+>> endobj
+12345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [247.8766 158.0194 264.8131 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.431) >>
+>> endobj
+12346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [238.2625 146.0642 255.199 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.432) >>
+>> endobj
+12347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8539 134.8263 145.7904 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+12348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.603 122.1538 179.5395 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+12349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.5322 110.1987 199.4687 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+12350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [147.1054 98.9608 164.0419 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.433) >>
+>> endobj
+12351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [280.3242 86.2883 297.2607 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+12352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [476.3325 719.9123 493.269 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+12353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.0843 707.9571 396.0208 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.436) >>
+>> endobj
+12354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [385.1754 696.7192 402.1119 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.436) >>
+>> endobj
+12355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 660.8537 438.0873 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.340) >>
+>> endobj
+12356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [441.0761 660.8537 458.0125 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.343) >>
+>> endobj
+12357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 636.2261 498.2408 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+12358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 614.373 362.2721 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+12359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 588.4054 498.2408 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+12360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 553.2572 403.5269 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.365) >>
+>> endobj
+12361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [406.5157 553.2572 423.4522 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.367) >>
+>> endobj
+12362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 528.6296 504.348 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+12363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 504.7192 504.348 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+12364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 480.8089 504.348 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.413) >>
+>> endobj
+12365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 447.0007 362.2721 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.156) >>
+>> endobj
+12366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 423.0903 362.2721 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.301) >>
+>> endobj
+12367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 397.1227 511.5056 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.400) >>
+>> endobj
+12368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 387.2248 362.2721 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.401) >>
+>> endobj
+12369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 361.9745 425.2551 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 338.0642 433.106 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.1548 326.109 376.11 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [363.6469 313.8101 375.6021 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [432.2792 301.855 444.2343 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [407.8707 290.2435 419.8259 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [410.7002 277.9446 422.6554 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.2918 266.3331 398.2469 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [405.091 254.378 417.0462 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [401.2155 242.4228 413.1707 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [388.703 230.124 400.6581 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.4007 218.5125 470.3559 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [464.4282 206.5573 476.3833 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [401.0265 194.6021 412.9817 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [408.0202 182.647 419.9754 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [435.288 170.6918 447.2432 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.1237 158.7366 395.0789 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [442.1916 146.7815 454.1468 156.9681]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [467.8055 134.8263 479.7607 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [465.6037 122.8711 477.5589 133.0578]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.6466 110.916 391.6018 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [412.3041 98.9608 424.2592 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [390.8647 87.0056 402.8199 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12293 0 obj <<
+/D [12291 0 R /XYZ 90 757.9346 null]
+>> endobj
+12290 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F11 416 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12395 0 obj <<
+/Length 4017      
+/Filter /FlateDecode
+>>
+stream
+x��\[S
7}�W��BUZֵ՝7�	� �&����ж�3��B~�~ꋤֵ�8�Ƀ8��tF���d��2��L
+�j�����
�}�o��#��
�ya���{�m)f5�KZή?�J�%tv}������я�^7�BX�PH}�
���wt���䂕D����Ͽ��-t�=�X]������5���qʆw{W{?�:���1�����5l&)C��/T��Ϗ~���4�@Ub�-����S����5�����U](=ш 
e��wƬQ9V=pB!��{�� �<p�Aj�vR���f
^�5"B
㾎�{@N
��O���O
zD

s�R��jU���Ͼ��><T����1��ԦMf������
��b�ʊ
��@�r�Z)�\Z
+

�+P���%7m2
+
��n�W72j��8��P9V�@��ja)pz~�^�l����/��~xu#�� G$u����
�
���3{��N��:�<�x����4�87��*
������F� .K��]*Cj4`5b���Wノ��
+xLL����� �ܺ�5P!^Q��{k�G�X�T"Ny/�I�ȃ:T@��� /,|�߭4����
� �P�!�xY
[�I�/

6w����n:�ܺ�#p�a��;�zT�U�
3Np��Oj�8�Yk���{�{|a7��n�v��p�p��{�{T�u�����j��a���u�¨��i�{�/����֍-v��*ܘ�[�=*Ǫ%�5��-�,ap5t�ӳ$�ި
	�7揚�
�
x)Q���0������]~{r~���?�D�ai��
_�
B'�[7v䕨�s��#�GeX�B��
�����%8��Q�9!zxa�C:8Uc2p$k"��
+=(MiD�
I&�#��˃�_���p��J�ɹ�^����s�Ƽ��u
q��y�
�#��gIe��;���{��&���#
+5u�̌�ᅍ��jdFH�`u��)1�2�FR�|�"�ɴURR�)��PN�
_�
B��uc�TWe��{��
����JR�e9�<��9?�ܓ���$wO��� tOv���ɰ��wO�Q9�A �X����
���RW�����i@Ԁ�n������W7�
����€ʰ*E�E8Sk���?G� ܀�L�^X�@/ܪ���pW����+P�R\���e�G~~y��$pJ�����h|���� tN�u#�Y=J%w����G�X��K�� �0������%l�4�rN��v��Up��-
�:��Ԣ2�5��]
��܋�����/W�f�����M�>�'�Z��U�j|�a��]����<4�������f~��x�-v��j��(�r�3Π��d
W/l|@E�j+"��1�K��A��]T���$��㒴�o��G%�/ӛe��6�
+�
]n'��� ���u#멬Ժ+
~o3�Q9V����A����nv,w��7w��6�؉U����N-����N��᩠�&1N�1y�S
�Pj	0F`;���
��f�l�f~t��g���Vۜ����
�j�WT��
b����
�#
t`�=���e�]ޫ
����C8]*���!��N�
_�
B��[7v� �Ե��.=*Ǫ%�Í��?���z�<�.�l""t���l��0p)�D?����"��?�9
ɲj��p������b~�Y�u0����q|/1�L����_�
�O��u#���p&����[T��� (�Bt[���ny���=
���&rـ�ݔˆ���
b�
�nD���
��e�eY�
+
#�6�yu|~|<IUؠ��M��B��&���] 
+�Xm�
I��$�
-�
<�;������/W+8�KQ�v��U�/����[�
?�V��u���U�ʰ����.}��"*p,�i�W��v��
+�q�����Т2�F�Qɸ7��G� �촲6M3B
��n«98��+Āʰj!hMa�蟇^6w�&x�|�a}�	���Դ�m=�����n�
+���v��]�G�X��:�9�5�>���UH�<�
+�/���*Fu#����s�CU(T�U
��jG�~\�.W���M�‰�V��"g	{xa�C�Щ{.
0��ܞ
�0iB�eSQ��0��߭�W�G�P����
U�ʺ�_�
B
��3�I)���y�
�aUB1�j�D���rrQ�j^��rY
Rr
��������J�*��JV����;X��\�
�d=Y.�AB.
��5�ʕf�H%�h=���b�!B���h7H)6�2�q�W,ɪ+	�
�K�<lַ�7����������x,6�������ss�Y�O�6����_�Y����t�΋�ޗ�C���� �e^���4{*��n:ܺ��|��H�t pOhQ9��X$T ���()��z���ְ���NCL�쓤_�
���~2
��O���;�[zT�V˃	buY�幺_l?OQ���O��'�Pm
���<#��:*�$������!ID�[0��1�oJ���������ŋ�ss��
��������7q��`UxR�Z��)g�j�V��6���}R�JVkP����mB�N3'�y{z1?��{��a_'XL�]�L ګ��	�_�]�0�ө�����lt�|
�C���8W��uO����y3��8-����_����;��ȲFeh�zvHx�x~ẜ"ܴ��%\2n���
+�J�Z�%i�pV�v����\5���v��-V7�|��.?�^8�9�_}^�ثl�(����L�կ�np���0F�,��ը
�_M�&��i�YkSO&Y���)�o� ����i��}�YMO���\5�
��H��g­~�V��.9���m��Z���U�@�K��a>OLݚu�ο�u�m'�N��[�NҴ~��:��5�$
u��v'||�$�f�dh�����	q~�[|Z�w���
dZ��(�붗Z�J�O-�Ҵ�i4�wnY5}N�f�[.�^x)?�鍻���BO�J�N�hj|&,��mg�����B�We:��QZ#�
�Ԃ>����f�7K:1�h$M��9I�yG#i�VKj'
��O�����z�i�جRٯڥ
+6V��B�Ϥ������+����$
"Ԩ
��G������Bc
��>�n�
+��d���4�Qe�-L���֗�l��Yu2�
��n�ū�.<�_Ud�mp;��ң2�F;��e�ωBs|��|~���$��3�!4�g�V+de���?T���s�qrs��G걠?�(��DN��
�LΫ���hL"�k���� �pjG����k�4�م�߆�:
��m|�X%a�,��ܚ�gd~�V@�e�8�H��8K�4*G�%�sb	�o
7���c99ͦ�\�_�}�L���e:ΦQZ�F񱘁ؾ�V�AL	����j9s�!�
3�!�f��(�b�01(f,C:����Y�dR�X�4�Qe�{�e��
3�!�����,C2:f,C���2��}�01Ne,C:����Y�d��X�
��(���
��I�2$�Bn͌aH���_HG����_؅��%c��!�ngD�.$cK�.dh�����_�
��T�`7H؅Q/Sva܁�]H�j�0�Fyv����m�tPj�a�$<�(�E�O��'w �
Ҵz���S/7s]�<�V~��<TQ�
v�5���]/7��T�`7H��Q�(���a܁�yH�Y��ؗ1:6�<�
�a7K��q��!C�����?���!6�
�a2�j�ʘH&ش�Hs'ؾ���!7� �i3�n� h�A$Cn�Adh���CnS
��6�A�
b�KNH�A�;uiZ� �`]�@l}N%!�6Q��W�0m��s��&�h�����O�;�:��9(���
�_os�������B�o�ק������,���r��	]���J�)Ap���WM�%�a��B��*[�͆�����C��j���`i
٫��y�{��ի��'t�E����-w�

�^�

�?��R�^�A^_F�eXJ\���q�鄺_o��c��o޷�����@�+�U)xendstream
+endobj
+12394 0 obj <<
+/Type /Page
+/Contents 12395 0 R
+/Resources 12393 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 11938 0 R
+/Annots [ 12397 0 R 12398 0 R 12399 0 R 12400 0 R 12401 0 R 12402 0 R 12403 0 R 12404 0 R 12405 0 R 12406 0 R 12407 0 R 12408 0 R 12409 0 R 12410 0 R 12411 0 R 12412 0 R 12413 0 R 12414 0 R 12415 0 R 12416 0 R 12417 0 R 12418 0 R 12419 0 R 12420 0 R 12421 0 R 12422 0 R 12423 0 R 12424 0 R 12425 0 R 12426 0 R 12427 0 R 12428 0 R 12429 0 R 12430 0 R 12431 0 R 12432 0 R 12433 0 R 12434 0 R 12435 0 R 12436 0 R 12437 0 R 12438 0 R 12439 0 R 12440 0 R 12441 0 R 12442 0 R 12443 0 R 12444 0 R 12 [...]
+>> endobj
+12397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.3648 720.2859 151.32 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.3648 708.6744 151.32 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.3648 696.7192 151.32 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.7256 684.764 201.6808 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [185.8502 672.8089 197.8053 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.3583 660.8537 182.3135 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.8477 648.8985 211.8029 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.5238 636.9434 199.479 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [138.259 624.9882 150.2141 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [145.452 613.033 157.4071 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.3425 601.0779 149.2976 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.9225 589.1227 191.8777 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.3648 577.1675 151.32 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12410 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [206.0344 565.2123 217.9896 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12411 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.8326 553.2572 215.7878 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12412 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.4057 540.9583 188.3609 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12413 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [263.2297 529.3468 275.1849 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12414 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.0279 517.3917 272.9831 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12415 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.7168 505.4365 206.672 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12416 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [212.9682 493.4813 224.9234 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12417 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.96 481.5262 165.9151 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12418 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [175.8975 469.571 187.8527 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12419 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.2273 457.6158 217.1825 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12420 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [250.6067 432.9882 262.5619 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12421 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.9347 421.7503 169.8898 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12422 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [187.3839 409.0779 199.339 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12423 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [197.3068 397.1227 209.2619 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12424 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [177.561 385.1675 189.5162 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12425 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.7252 373.2124 201.6804 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12426 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.7075 361.9745 211.6627 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12427 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.7163 349.302 206.6715 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12428 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [179.225 338.0642 191.1801 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12429 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.9693 326.109 229.9245 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+12430 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.4115 314.1538 229.3667 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+12431 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [230.6916 302.1986 242.6468 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12432 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [183.658 289.5262 195.6131 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12433 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.3744 278.2883 151.3295 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12434 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.4741 265.6159 183.4293 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12435 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 242.4228 208.7738 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12436 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 218.5125 208.7738 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+12437 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 194.6021 208.7738 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.61) >>
+>> endobj
+12438 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 170.6918 208.7738 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12439 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [174.7916 134.8263 191.7281 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.197) >>
+>> endobj
+12440 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 112.256 145.7908 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.302) >>
+>> endobj
+12441 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 88.3456 145.7908 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.431) >>
+>> endobj
+12442 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 698.0592 362.2721 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+12443 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.1087 684.0467 513.0452 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.218) >>
+>> endobj
+12444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 660.1364 498.2408 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+12445 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 636.2261 498.2408 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+12446 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 612.3157 511.5056 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.119) >>
+>> endobj
+12447 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 602.4179 362.2721 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.120) >>
+>> endobj
+12448 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 588.4054 475.0182 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.149) >>
+>> endobj
+12449 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.5691 576.4502 511.5056 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+12450 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 566.5524 362.2721 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.210) >>
+>> endobj
+12451 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 542.5224 362.2721 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.329) >>
+>> endobj
+12452 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [472.2084 516.6744 489.1448 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+12453 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [472.2084 492.7641 489.1448 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.279) >>
+>> endobj
+12454 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 468.8537 501.5784 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+12455 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 456.8986 475.0182 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+12456 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 444.9434 476.6719 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.247) >>
+>> endobj
+12457 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 422.9707 362.2721 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12458 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 397.84 438.0873 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+12459 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 373.9297 403.5269 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.374) >>
+>> endobj
+12460 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 361.2572 504.348 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12461 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 337.3469 501.5784 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+12462 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 325.3917 475.0182 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+12463 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 313.4365 476.6719 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.247) >>
+>> endobj
+12464 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 291.4639 362.2721 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12465 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 266.3331 438.0873 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.347) >>
+>> endobj
+12466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 242.4228 403.5269 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.375) >>
+>> endobj
+12467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 229.7504 504.348 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 205.84 501.5784 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.107) >>
+>> endobj
+12469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 193.8849 475.0182 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.138) >>
+>> endobj
+12470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 181.9297 476.6719 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+12471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 159.957 362.2721 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 134.8263 438.0873 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+12473 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 110.916 403.5269 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.372) >>
+>> endobj
+12474 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 98.2435 504.348 109.1474]
+/Subtype /Link
+/A << /S /GoTo /D (page.411) >>
+>> endobj
+12475 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12396 0 obj <<
+/D [12394 0 R /XYZ 90 757.9346 null]
+>> endobj
+12393 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12478 0 obj <<
+/Length 3474      
+/Filter /FlateDecode
+>>
+stream
+x��\ks���_�o�f�0ޏ|Kl5�Ԗ[n�I3
Z�%���T
���bX`� 6��N&	%����
�\ �a���
�)��a\�.o���~��i߮���|q��R�
2���ŧڃ$HPBgW?�<{q��䗋g
k��G��\p�ۣ�
�
.�$���G?��gW�ďG1���3��1��n�8e��wG?9?����3�F
BP�!��T���
a	/l��'D
/v����v��fy�[�_�>��/�~����������SQiR����[����K��+� �1�ks$XG	h����8T!lO
!�L'P��=f�S$����+
��
FX��֬0%`+��aCV:T!�cE���2)?�VW#�pD�ݔHiᕇ�d��&Gy\(�6|=b��c��heǨ.3����n��@"� -೐J x&U`��+�`$�ȯM���d�
�9T)�cH2D��P3훇�b��2��Y��^*�O#DS�o�W��˫��n
/q�a��j&A�����+�`��"�5�#�F1��
�Z�*��d1e&�I����_
r,�oO�8���.�F�|&�B��R1v��Ï<��k͟bQt-憅ч�؁
+1
{D .���^��&.-xC%�J��W��HiE~kAh��I�
&-w-�4��
�fP��Z/��f������:S<���?|�C�-w�N>^\��iF!M��	�I�Ҍ��o0�F~mN���BJ)1�?$�C�YB������ϫ�M��\�}���~�w6.8�֠+�THr]T
��
F
+.�ksU*�o �5�Rء
+Q�`�R�(�	֜8W����+?6^�C��:

��`
+�l��8�!Ŕ�,|��8p��yYR
�	$�A!�+F��T=Re;7SU�o�Q�Az���H��|؞�G %�PT
+��4�>���3��MkD%O�M�@�n�a;����U�Lo6��J��g�P�j�I*� zR	�c:�E�'RB��T%�d�P�%�i%&�TB����s	�� �]�o��~u��2�~}>	��b���х]R�]�k���_��
{���~����Z��Uk�cN:qt�������r~���Y���;�����r����U�����|��jr0���I��O��|�~��(#O�]׹��[��3�u~����^]=�U��ٓ�1��R?RC87S5�o��Az�ˤ�Hj�|X�
+�1��c�ꜟ�{u�Af�.ȏ��n]�@r�.��EIĤxJi�$G
$�di�d����Ҁ���
+HJ�BXǐ��OZ�&�ב?�_�8Fb�f�Cgv�L͠�m:/nr�.��j�\MYʈDB9Y��a�`5y:�L��Ҵ�Q�9����Ѧ��Tm�d�i�%�$�M���4�5IeF��WU���|���
2���
+�*��U�����HI���s5UTy����̉� zRTec��(M�
+������7Ȉ� ���
+H��|؞XL�ЏU��TQ�dDU�_NT�	$EU>lO
��`���ʮ�Ǝ⩢�7Ȉ*kD�L��0���*�u
a��a��qjK0Sf���
2���J�*L )��a
�D
X-�W�XD1D����|���r���
+Hj�BXG����=~}��rަj,� ���,9�I�&��X����7�����������������j��~���fll��A�BTҢ�jЕ!n�>ϋwM�X����u�BL���V��]��ׇ̎�;6&�!&��|l�d��
�>6��c�0~��8�r�	bV��
�p|���ً��7'L
���ɎٵA�>�.�a�C�؃�!W���^{oF�2`I��JC
�Zx-����goޞ>� !<��
e��=�/ܣ���sj��A����=�*Du���z���ؗ����/
[���͸����w���I��Q{���s=w�ϟ����d�<�
_���
_A�4_٨=_�
����9��=��t��&�����/���
+���F��"
+q�N��/7��n�d5-W��s�t%�x舊�u��7�/��ȶ���`�
ء
+a
�
�J������,��y
����cM�аXQ�
��
F��6;1}�^"���u�B؞>i��X9�����<�,��6��ͥ���@6_�<������6b�q	��}(.�b��`
��
F
/�[o���
+�ޠ>T

+�U
+�Xe |TˎeuW_\���_w�[\����n�[�.�b����'��(A�+�]��
+
�
o/80�
3A�aqv�l��Dh[�lUj����vg{�]�Hs�A��#1�5� ��
�'��Gu�q-����b�����fy��&/��g��G.����%E�s:y��A�`��(ur�	$q!�cP��fB����-��^��������zW/�q�z7L@�hDXq���+�`�#�5�*��v��~ǬC��
R���M�{�������7��_^���Dt����"�7ȈB�E!O��0~R���a��l7���ۻ��ӗ����}���n����SK�jٙC2
�
+�&��2��+�`���os���Z�Hh:L ��Uˠ9�r�@���^r:��2U�y����s#
'�_=���1{>�}1eC}�P�ޚT�x~
+�t��7�$��
j�
'���XiQ��=-�#h������8E
����7�,��
j���&�\
a
C
F
S�+��0�`�K5cD��^�
��
F�%����E;
��	
��C��:
+a��S���9��Z�3h�;g�i��W
~l�
xm����I���Va�h�nA��n�߉��ݟ�o�M�g6�T�l#���d���5��H�0���,�u
+�4��r�=�ƿ�B�����ft��ϨmP!�m�_�c�JC�u
�_�i.$m+��B؞H�Qw	����Z뉻(J02�V���
r��J]T�@�"�a����8
��q�6�
9����W>~�Cx�l|�,�m� z�78P!��2�V�a���,fO�4�Y��_�c��o�9�z3��Wc� ��(:T)�{n݄�fP��x��������Ov����,߽Jt�dR��?��<F�L5ko0D�߼�Е[0C����&�^
����,�`�{�Eܞ��#�.�/u�����F�/�3��rY
�
���c�pൾ
+:�
:�A�Hv��B�~��
+��)���5;_S�f� �59�|3���aɮ9����8g�l����}�o�i������9L �:����Xa�
yl���L�}�L�
�G�6ڮ8L`8��w�
i6.	0ć�J>�o[���^P&�Id�ݴl������ ��Y�TT�����h~l?������/'B
_/6��u��_X����Z��%���vK��]�N�������B���$e�`�R��fݫ��w�Z�ʳh���
9�k��p���ٳϟ?��=�߬�vhuxvw�~���Шba^Q�ڂ�\�m�+�A.��������8V�Ov�ܞv�XB���?�lu�endstream
+endobj
+12477 0 obj <<
+/Type /Page
+/Contents 12478 0 R
+/Resources 12476 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 12544 0 R
+/Annots [ 12480 0 R 12481 0 R 12482 0 R 12483 0 R 12484 0 R 12485 0 R 12486 0 R 12487 0 R 12488 0 R 12489 0 R 12490 0 R 12491 0 R 12492 0 R 12493 0 R 12494 0 R 12495 0 R 12496 0 R 12497 0 R 12498 0 R 12499 0 R 12500 0 R 12501 0 R 12502 0 R 12503 0 R 12504 0 R 12505 0 R 12506 0 R 12507 0 R 12508 0 R 12509 0 R 12510 0 R 12511 0 R 12512 0 R 12513 0 R 12514 0 R 12515 0 R 12516 0 R 12517 0 R 12518 0 R 12519 0 R 12520 0 R 12521 0 R 12522 0 R 12523 0 R 12524 0 R 12525 0 R 12526 0 R 12527 0 R 12 [...]
+>> endobj
+12480 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 719.9123 285.097 730.8162]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+12481 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 707.9571 258.5368 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+12482 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 696.0019 260.1905 706.9059]
+/Subtype /Link
+/A << /S /GoTo /D (page.248) >>
+>> endobj
+12483 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 674.0293 145.7908 682.9955]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12484 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 648.8985 221.6059 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.348) >>
+>> endobj
+12485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 624.9882 187.0456 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.373) >>
+>> endobj
+12486 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 612.3157 287.8667 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12487 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 589.1227 208.7738 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12488 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 564.4951 291.0445 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.77) >>
+>> endobj
+12489 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.0878 552.5399 295.0243 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+12490 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 542.642 145.7908 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.103) >>
+>> endobj
+12491 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 528.6296 258.5368 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.134) >>
+>> endobj
+12492 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 506.7765 145.7908 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+12493 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 481.5262 187.0456 491.7128]
+/Subtype /Link
+/A << /S /GoTo /D (page.371) >>
+>> endobj
+12494 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 468.8537 287.8667 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.402) >>
+>> endobj
+12495 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 444.9434 296.5639 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+12496 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 421.033 291.0445 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+12497 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 409.0779 285.097 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+12498 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 397.1227 258.5368 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+12499 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 385.1675 260.1905 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+12500 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 363.3145 145.7908 372.1611]
+/Subtype /Link
+/A << /S /GoTo /D (page.327) >>
+>> endobj
+12501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 338.0642 221.6059 348.2508]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+12502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 314.1538 187.0456 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+12503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 301.4814 287.8667 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.421) >>
+>> endobj
+12504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 277.571 291.0445 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.86) >>
+>> endobj
+12505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 265.6159 285.097 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.117) >>
+>> endobj
+12506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 253.6607 258.5368 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.146) >>
+>> endobj
+12507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 241.7055 260.1905 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.258) >>
+>> endobj
+12508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 219.8525 145.7908 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.326) >>
+>> endobj
+12509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 194.6021 221.6059 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.355) >>
+>> endobj
+12510 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 170.6918 187.0456 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.381) >>
+>> endobj
+12511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 158.0194 287.8667 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.420) >>
+>> endobj
+12512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.4537 134.109 231.4089 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+12513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 110.916 208.7738 121.1026]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 87.0056 208.7738 97.1923]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 708.6744 425.2551 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 684.764 425.2551 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 660.8537 425.2551 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12518 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 636.9434 425.2551 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12519 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 602.3531 494.684 613.257]
+/Subtype /Link
+/A << /S /GoTo /D (page.428) >>
+>> endobj
+12520 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 578.4428 475.0182 589.3467]
+/Subtype /Link
+/A << /S /GoTo /D (page.148) >>
+>> endobj
+12521 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 544.5149 362.2721 553.4812]
+/Subtype /Link
+/A << /S /GoTo /D (page.294) >>
+>> endobj
+12522 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [435.935 518.6669 447.8902 529.5709]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+12523 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [435.935 494.7566 447.8902 505.6605]
+/Subtype /Link
+/A << /S /GoTo /D (page.72) >>
+>> endobj
+12524 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 460.9484 362.2721 469.795]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+12525 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [489.6132 434.9807 506.5497 445.8847]
+/Subtype /Link
+/A << /S /GoTo /D (page.176) >>
+>> endobj
+12526 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 411.7877 425.2551 421.9743]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12527 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 387.1601 501.5784 398.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.110) >>
+>> endobj
+12528 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 375.2049 475.0182 386.1088]
+/Subtype /Link
+/A << /S /GoTo /D (page.140) >>
+>> endobj
+12529 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 363.2497 476.6719 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (page.252) >>
+>> endobj
+12530 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 341.3967 362.2721 350.2433]
+/Subtype /Link
+/A << /S /GoTo /D (page.321) >>
+>> endobj
+12531 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 316.1463 403.5269 326.333]
+/Subtype /Link
+/A << /S /GoTo /D (page.376) >>
+>> endobj
+12532 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 303.4739 504.348 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.414) >>
+>> endobj
+12533 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 269.5461 362.2721 278.5123]
+/Subtype /Link
+/A << /S /GoTo /D (page.295) >>
+>> endobj
+12534 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [474.6691 243.6981 491.6056 254.602]
+/Subtype /Link
+/A << /S /GoTo /D (page.434) >>
+>> endobj
+12535 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 209.8898 362.2721 218.7365]
+/Subtype /Link
+/A << /S /GoTo /D (page.168) >>
+>> endobj
+12536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.1087 195.8774 513.0452 206.7813]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+12537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [322.0926 184.6395 334.0477 194.8261]
+/Subtype /Link
+/A << /S /GoTo /D (page.73) >>
+>> endobj
+12538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 160.0119 499.9242 170.9158]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+12539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 136.1015 507.5259 147.0055]
+/Subtype /Link
+/A << /S /GoTo /D (page.80) >>
+>> endobj
+12540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 124.1464 501.5784 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.102) >>
+>> endobj
+12541 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 112.1912 475.0182 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (page.136) >>
+>> endobj
+12542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 100.236 476.6719 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.240) >>
+>> endobj
+12543 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12479 0 obj <<
+/D [12477 0 R /XYZ 90 757.9346 null]
+>> endobj
+12476 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12547 0 obj <<
+/Length 3495      
+/Filter /FlateDecode
+>>
+stream
+x��\�r7}�W�m��
�K��Xq9�
�%�R�M�hil�"�Z���|�6��
[L��B��=�ݍF�)���C/�P�0.�7Gx�����toW�~��^
=�^��AFR����H�	J���������|���
�5�B� �w.����酓�)L+��G���W`�G1���3��1�.n�8e�/�G�G�rr�7�s� �yA�� ^S��2�%��&��q��ݬ�g��O��n�|�~�[�
�������v��^�Z����>
�i��B����;���a�xV:|�/�15�kMe�p���bb��
�ʩ��� "D�����zu}���� ��
+t!Z���W�����l����I��R����~�:ä�W���B�
�\P�$6S&L:TF����r�
+�ܮ7��z�b�l{B���z��|�X�
QmD�{|�/�y�@nC�"�Z"�
�0u�
�S�(1�Y	�ퟶ�п�!
�|���
_�
f�+���A
D*���
+O
��W�ʨ��*�AL��1������-0s���N�P���@���\�3rD��
I�g������o"՚H�
+�3+J���:PZ��ĥn���������ruw����c�0������c�q��o�׻�f!
l�B����_��,
�!Q��f16 �Yd���)����
+������;���3
Q
ٕ25��8Y���3^ȵ�B.
0	��Ā�����Zp4�!�u�����n�28���w��F1C�u
_��ɳ��+?G�D�5T�j F�Xw@\��(�H����RL��`�����5����}5at�K=*���#HiZP.<}�I����ԃ�����_0�r�4Cɜ��ɺCe��@� J
8c.e���-H�Ok74��#�8��'�Cj2D
h�w�J�zAb�Y����D���ځ
�����T1~�p��oBג��Wa,����W�����6�i� P��0u�
�S�ؓN�D���
+v��䤐��NZ.9u��_0���rr

]�"��Ԁ��:TF�@�)���G���p��}�[��
��'�52 �[i��>
+��,�����zw�ެ�sy
�ڌ�A\.ou��_0���r��ϔ�h�-jl at Pu��ځ
BA9��M�[�3��P��a���
�^y����Hmy1su��l�=����9��1�OF-��8�5b���$"���H<��D#.��g�)��,i�=߭�B�„
+���8T���3
�mh�a�	x`çL}�Ge�����	fe�,��
+A&`+�-���_�(0
�%�D
̱�3���1_�Σ�j$`{-�;oA*�zXß�����Z��HhSPE�F��w��]]��'$�Ӏ'/=����_ ��G�~��jj�4�zTF�@�H2^�a/כz���?nw���z��|l��M
ERe[%_�
�Z�S�-}a���8��0��
�S���졔�
+�^�ٻ���s���*5lɦ8uy�D��Q
5FF�H{4o�u:b��5a��W~v��B�rv�)zzXs��p���q��j
C�"������ު8����
w~�P)T��ol@��/�v�kdLI�~�;?b�L��;?A����
+5����
���e��-�T?��πNi��`���s�����Ώ�XO|�?��(��J�ʼnb�PU������`�#�hv�N��$����3��*�d)�����
���
��rz�L٤
��Ā�l�P�7�T���دo�e}����w�YpՄ�
�SMv���+��M�Xns�"�:-�f���NK��h
܌�xɨA����*�~�$�_F6¢�/c��/i�5�!�M��<��1�/�H)1�~A���s���܆
�_�4�����Q�X1q��D餔�Px���YFé<��U�� f��$
CGy<�a� Ij�8'����
�c\"ƈ)
�s��
\(��~h�U
�sӃL��9TNm���?~�
"�x���g���m

�,Π(�XK�����΁Ŀo�Ep�R��w��
�UxPVp
i�a���s��ZG�!&�� M���;�ό��r����<aS� *=y�P�
9�����~��,uS�lw��f��a_�}�^~|�%(7�V�����7�#RF�؀h�˨u� L=~���9��Č�u������Tj{i4����;�
�����N�p����~s�(��gn�����	?�ǥ�ll@��2ji��h&%�P�?u�Ϫ�ʍ
j2
vbB2Oݣrj�yu'?�>bP86��L�h^:���3r��v�ńq��Ytz,�et��T>�����i�
�cy���
嶗�j.#B=$�cy�Q;pS<���1
rB�H��k��q����T�sMj$��5i�}�q- ��+����������g����	��?=}y�*�g/����3T�z��� ��كc�v��+���r��_0�^�\k���ž;a��zW��h
ȓv��-���i���F����e�UC��<�\�0��t�HX�
+�
�����肓3�+�������J�jY����+�\ޚ�m2:�!1Atj@�L�ʨ
��Di�u�,.��2��
+=��̰�mXa�>��u �0��
�Q;�b��

�Ӓ�ON��
_�
fh	�}�� 
�~8�O
h�P�-����![V�`��WJw9Ab�s���&�ˍ
��r���tE]�Ԯ�Ω��mu8ZQ���U���_@�X���u��9�ō:o�9T�%Ykԍ��ui���#���ڨc�"��u��D���گȊh�nl@�Q�Q�(d��1u�F��Vڨ�$u#+9��F�؀h�.��Ր�h[Ю �����Pr�e�U,��;W�{�D�ݣ2��Hy��N�t�ّ���{�������h�߱PD���/H�`
S,��X���ց+e��I�����n�~{��z\�����"�%+=�����š2G����%��%3
+���
dW%_��R�Q~��m�
<������
Ƕԑ�؎�T8�
����2
���A^��
_�
f�	䶳D3�<��VS��U�ʨ
B�`d��|�.W��f�Y�D��y��8�1\~8�$G�
�H�p46 z8J�u|(~����g�\X6�4�.�_�
�D2D�(
t
�
�	��X�'�@'žW����+
tA"�Gv�}l at 4��jǤJ�ֽ�-�{w�<�x�|��ǃ�0�(8ug��;�0��D
�`�f�?Zä�|a���:ž�x���i[ �1�
9��#��'��Q�Fʧg�c�����nb��̚�f��`�8�=�DF�.h�C
�ks]|�O�v�C�w��a����z��ۻz��!����_�6��������[Q�
��M�G0��j��]�N*�y]�Å
+>z{3�ذԾ�ۢ��?g�-���?�S�#r���o�y��������oַ;��?���~��aO����
+��
(�eD�=}Ke��gˇ�%�f��>����wK{�� ���x�endstream
+endobj
+12546 0 obj <<
+/Type /Page
+/Contents 12547 0 R
+/Resources 12545 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 12544 0 R
+/Annots [ 12549 0 R 12550 0 R 12551 0 R 12552 0 R 12553 0 R 12554 0 R 12555 0 R 12556 0 R 12557 0 R 12558 0 R 12559 0 R 12560 0 R 12561 0 R 12562 0 R 12563 0 R 12564 0 R 12565 0 R 12566 0 R 12567 0 R 12568 0 R 12569 0 R 12570 0 R 12571 0 R 12572 0 R 12573 0 R 12574 0 R 12575 0 R 12576 0 R 12577 0 R 12578 0 R 12579 0 R 12580 0 R 12581 0 R 12582 0 R 12583 0 R 12584 0 R 12585 0 R 12586 0 R 12587 0 R 12588 0 R 12589 0 R 12590 0 R 12591 0 R 12592 0 R 12593 0 R 12594 0 R 12595 0 R 12596 0 R 12 [...]
+>> endobj
+12549 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 710.0144 145.7908 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.314) >>
+>> endobj
+12550 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 684.764 221.6059 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.346) >>
+>> endobj
+12551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 660.8537 187.0456 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.371) >>
+>> endobj
+12552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [270.9302 648.1812 287.8667 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.404) >>
+>> endobj
+12553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 624.2709 290.0684 635.1748]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+12554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 590.4627 145.7908 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+12555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.6274 576.4502 296.5639 587.3542]
+/Subtype /Link
+/A << /S /GoTo /D (page.220) >>
+>> endobj
+12556 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [283.0691 552.5399 295.0243 563.4438]
+/Subtype /Link
+/A << /S /GoTo /D (page.87) >>
+>> endobj
+12557 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 542.642 140.8095 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.88) >>
+>> endobj
+12558 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 528.6296 285.097 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.121) >>
+>> endobj
+12559 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 506.7765 145.7908 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.171) >>
+>> endobj
+12560 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [273.1319 492.7641 290.0684 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.177) >>
+>> endobj
+12561 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 468.8537 180.1116 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.182) >>
+>> endobj
+12562 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [266.5064 456.8986 283.4429 467.8025]
+/Subtype /Link
+/A << /S /GoTo /D (page.192) >>
+>> endobj
+12563 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 432.9882 180.1116 443.8922]
+/Subtype /Link
+/A << /S /GoTo /D (page.195) >>
+>> endobj
+12564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [274.2373 421.033 291.1738 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.200) >>
+>> endobj
+12565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [264.823 409.0779 281.7594 419.9818]
+/Subtype /Link
+/A << /S /GoTo /D (page.209) >>
+>> endobj
+12566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 385.1675 180.1116 396.0715]
+/Subtype /Link
+/A << /S /GoTo /D (page.215) >>
+>> endobj
+12567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 373.2124 260.1905 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.260) >>
+>> endobj
+12568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 351.2397 145.7908 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.269) >>
+>> endobj
+12569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.1751 325.3917 180.1116 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.274) >>
+>> endobj
+12570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.727 313.4365 272.6635 324.3405]
+/Subtype /Link
+/A << /S /GoTo /D (page.280) >>
+>> endobj
+12571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.1091 289.5262 195.0456 300.4301]
+/Subtype /Link
+/A << /S /GoTo /D (page.288) >>
+>> endobj
+12572 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 267.5535 145.7908 276.5198]
+/Subtype /Link
+/A << /S /GoTo /D (page.296) >>
+>> endobj
+12573 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 243.7628 145.7908 252.6095]
+/Subtype /Link
+/A << /S /GoTo /D (page.330) >>
+>> endobj
+12574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [204.6695 218.5125 221.6059 228.6991]
+/Subtype /Link
+/A << /S /GoTo /D (page.357) >>
+>> endobj
+12575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 194.6021 187.0456 204.7888]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12576 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [278.0878 181.9297 295.0243 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.422) >>
+>> endobj
+12577 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.8543 172.0318 145.7908 180.8785]
+/Subtype /Link
+/A << /S /GoTo /D (page.423) >>
+>> endobj
+12578 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [261.2662 158.0194 278.2027 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.430) >>
+>> endobj
+12579 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.0894 124.1464 291.0445 135.0503]
+/Subtype /Link
+/A << /S /GoTo /D (page.85) >>
+>> endobj
+12580 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [268.1606 112.1912 285.097 123.0951]
+/Subtype /Link
+/A << /S /GoTo /D (page.113) >>
+>> endobj
+12581 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.6004 100.236 258.5368 111.14]
+/Subtype /Link
+/A << /S /GoTo /D (page.144) >>
+>> endobj
+12582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.2541 88.2809 260.1905 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.255) >>
+>> endobj
+12583 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 710.0144 362.2721 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.324) >>
+>> endobj
+12584 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 684.764 438.0873 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.353) >>
+>> endobj
+12585 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 660.8537 403.5269 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.380) >>
+>> endobj
+12586 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 648.1812 504.348 659.0852]
+/Subtype /Link
+/A << /S /GoTo /D (page.417) >>
+>> endobj
+12587 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 614.373 362.2721 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+12588 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.1087 600.3606 513.0452 611.2645]
+/Subtype /Link
+/A << /S /GoTo /D (page.219) >>
+>> endobj
+12589 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 565.2123 362.2721 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.166) >>
+>> endobj
+12590 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 565.2123 382.1974 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.167) >>
+>> endobj
+12591 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [482.9877 540.5847 499.9242 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.189) >>
+>> endobj
+12592 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [481.3043 528.6296 498.2408 539.5335]
+/Subtype /Link
+/A << /S /GoTo /D (page.207) >>
+>> endobj
+12593 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 506.7765 362.2721 515.6232]
+/Subtype /Link
+/A << /S /GoTo /D (page.267) >>
+>> endobj
+12594 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 471.5635 425.2551 481.7502]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12595 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 446.9359 507.5259 457.8398]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+12596 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [484.6419 434.9807 501.5784 445.8847]
+/Subtype /Link
+/A << /S /GoTo /D (page.108) >>
+>> endobj
+12597 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [458.0817 423.0256 475.0182 433.9295]
+/Subtype /Link
+/A << /S /GoTo /D (page.139) >>
+>> endobj
+12598 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 411.0704 476.6719 421.9743]
+/Subtype /Link
+/A << /S /GoTo /D (page.250) >>
+>> endobj
+12599 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.3356 387.8774 362.2721 398.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.319) >>
+>> endobj
+12600 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [365.2609 387.8774 382.1974 398.064]
+/Subtype /Link
+/A << /S /GoTo /D (page.320) >>
+>> endobj
+12601 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 363.967 438.0873 374.1537]
+/Subtype /Link
+/A << /S /GoTo /D (page.349) >>
+>> endobj
+12602 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [386.5904 340.0567 403.5269 350.2433]
+/Subtype /Link
+/A << /S /GoTo /D (page.375) >>
+>> endobj
+12603 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [487.4115 327.3842 504.348 338.2882]
+/Subtype /Link
+/A << /S /GoTo /D (page.412) >>
+>> endobj
+12604 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 304.1912 425.2551 314.3778]
+/Subtype /Link
+/A << /S /GoTo /D (page.64) >>
+>> endobj
+12605 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 280.2808 425.2551 290.4675]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12606 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [495.5707 255.6532 507.5259 266.5572]
+/Subtype /Link
+/A << /S /GoTo /D (page.81) >>
+>> endobj
+12607 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 232.4602 438.0873 242.6468]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+12608 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 219.7877 494.684 230.6917]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12609 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 195.8774 476.6719 206.7813]
+/Subtype /Link
+/A << /S /GoTo /D (page.251) >>
+>> endobj
+12610 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 160.7292 438.0873 170.9158]
+/Subtype /Link
+/A << /S /GoTo /D (page.350) >>
+>> endobj
+12611 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [477.7475 148.0567 494.684 158.9606]
+/Subtype /Link
+/A << /S /GoTo /D (page.429) >>
+>> endobj
+12612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 114.901 425.2551 125.0877]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12613 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [413.2999 90.9907 425.2551 101.1773]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12614 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12548 0 obj <<
+/D [12546 0 R /XYZ 90 757.9346 null]
+>> endobj
+12545 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+12617 0 obj <<
+/Length 1731      
+/Filter /FlateDecode
+>>
+stream
+xڵ�]S�8���+r����oY�k
e�B����n��I���B`��L��
ő+۱lXw� �ߣWz�cK�i�����R��B�/�z����{twy��G��ͼw�Nɾ���ϯ�%(
+�Q֟_}
���>
������H���B*{�w4�KߙK��-����/���x�#�M$�Ox@���w=��;���>��d��� )���J�`
��|[ُ�чm(j�
Q
+FJ��:���o?}���M�^),.�_˭�FCD��k�����r�Rz��̼j���P�k�\['����h�Z˒	N�jpEB��R� 
��^HE�vk�� �� �k�]- -�	�
�yw�ٞ�"�dM�
+����������pIv2~�><��;�6�
pm�g�B�dM�
+������ ��H
�|�#��AE%=#�)'k"U�'t����k���3L���MF�s�`�e
�����®�Ij��Ͻ����ϣ�P���;^J�Q��B����W���W�����q�_��4�࠹n��~@���5�*�ד
+�ZR����K���f
����{^@���5*��
+�ZB(�p��u8yF���}��D��QѿQ����CGhhؠ����
Q�3�Ar�-$V��_)�j!)�K*�v��1��h%.یj�s~@���5
��=���e�PA]΍;L9&�F٢�
!/ D�ɚ��	]-!ʀq�:�'CI�f�N'C.�w����3�
!s�&d�zdAWDƣ8#.���V�^��\+�J�OD? �,�50+��2
�ZfJ���%����P�������
��ܚ�b�dM�
+������� �ް\�gCj�s���$�O���B�	^��
^��£
+dd�
~m�e�� ��3�
�s�&~�z~AW��
��%��x2;��NΦ��b�D�4��rY��-���%�"��d�����"].��&RC*Qu�����߿%W�">]~M��W�
+eT�1i�A.����<u򑯯6�R��-=���8�`Qɽ�n'j�脀HF��n
�'�. n
�R���q��8CxS������c��
de���HSU�@��S5�Z����uS��m|v2�8�o(N�'�?�KZ�1�I����ɚ���_��AW�e�	���ۧ��qg�5I k���rY��-����9�V9�����igÉ*
+��1y!LNְ/��c
+�ZL� CV���g$��b���r��AU�t���.v;?O˫d_?��4�~�
z���&
�~���)I�{�Tc)�����ѩG?�{�ʴ��Qe,�
����o]b�k†�����D��Gt˖:uظTf��=�H��BZ��;�,X�8�
+�!T�pBqy4�
AkjƉ�S���v�-W7�b�^ެc&4���U�})�q��v�?�7l�W˵�c��(��8o�*�ӟ�l9C~D��~8���������|��>K�
/��x���jJ
+ƀ
+��� 'oؙ���
�RT��
F

�E&��Y%ߧ"�N�T�뫖�7v����7LaB��z��`@�ݔs�-�����ݡ��p�m���:IJ9Xg�g����6����_[�?����$V�<�	�x��p��v�$�ɶ�n�4��Rv�����?������k#�5�R�m����������\��q�|Ha�9xx�=��1�)3Çv�^�Lq�J]
+���e�r}�f����]w,Wx�n�A�P���6iOU���:[endstream
+endobj
+12616 0 obj <<
+/Type /Page
+/Contents 12617 0 R
+/Resources 12615 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 12544 0 R
+/Annots [ 12619 0 R 12620 0 R 12621 0 R 12622 0 R 12623 0 R 12624 0 R 12625 0 R 12626 0 R 12627 0 R 12628 0 R 12629 0 R 12630 0 R 12631 0 R 12632 0 R 12633 0 R 12634 0 R 12635 0 R 12636 0 R 12637 0 R 12638 0 R 12639 0 R 12640 0 R 12641 0 R 12642 0 R 12643 0 R 12644 0 R 12645 0 R 12646 0 R 12647 0 R 12648 0 R ]
+>> endobj
+12619 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 708.6744 208.7738 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12620 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 684.764 208.7738 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12621 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 660.8537 208.7738 671.0403]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12622 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 636.9434 208.7738 647.13]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 613.033 208.7738 623.2197]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 589.1227 208.7738 599.3093]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 565.2123 208.7738 575.399]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 541.302 208.7738 551.4887]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 517.3917 208.7738 527.5783]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 493.4813 208.7738 503.668]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 469.571 208.7738 479.7577]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12630 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 445.6607 208.7738 455.8473]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 421.7503 208.7738 431.937]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 397.84 208.7738 408.0266]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 373.9297 208.7738 384.1163]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 350.0193 208.7738 360.206]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 326.109 208.7738 336.2956]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 302.1986 208.7738 312.3853]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 278.2883 208.7738 288.475]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [258.1878 253.6607 275.1243 264.5646]
+/Subtype /Link
+/A << /S /GoTo /D (page.433) >>
+>> endobj
+12639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [279.7765 229.7504 296.713 240.6543]
+/Subtype /Link
+/A << /S /GoTo /D (page.436) >>
+>> endobj
+12640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 206.5573 208.7738 216.744]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 182.647 208.7738 192.8336]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 158.7366 208.7738 168.9233]
+/Subtype /Link
+/A << /S /GoTo /D (page.62) >>
+>> endobj
+12643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [196.8186 134.8263 208.7738 145.0129]
+/Subtype /Link
+/A << /S /GoTo /D (page.63) >>
+>> endobj
+12644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.1091 88.9982 187.0456 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.382) >>
+>> endobj
+12645 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [190.0344 88.9982 206.9709 99.1848]
+/Subtype /Link
+/A << /S /GoTo /D (page.383) >>
+>> endobj
+12646 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [459.7354 707.9571 476.6719 718.861]
+/Subtype /Link
+/A << /S /GoTo /D (page.256) >>
+>> endobj
+12647 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [421.1508 684.764 438.0873 694.9507]
+/Subtype /Link
+/A << /S /GoTo /D (page.354) >>
+>> endobj
+12648 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [286.9548 56.1662 401.9236 66.1288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cs.unipr.it/ppl/)>>
+>> endobj
+12618 0 obj <<
+/D [12616 0 R /XYZ 90 757.9346 null]
+>> endobj
+12615 0 obj <<
+/Font << /F65 361 0 R /F52 345 0 R /F67 370 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+9534 0 obj <<
+/Length1 765
+/Length2 1314
+/Length3 532
+/Length 1876      
+/Filter /FlateDecode
+>>
+stream
+x��RiXSg����Ma��e�r�j��B�B@��iLn�B���DT(�ZE:�
+�EY�"�����CY��X�"-kP�>C���g�?���;���
�=��v\��Q<H m ��� �@"��

i"��ˆЁ�B6 H�Z ��	�B�ِ�m at k�!@CB�"80�i&�$
+`'�D0�-l4�48l>�p` ;>�Z�xAa�(�p pa
+��a!����E�C ��27<�}+��L�6M �I."�.����4H��ak��c8�����o$��>[ ���� 4
�D �B"�f�Q�9ą���.(�s섁|��V���:
�GA\O�<6?
ڨCB�f'��6|�
�ܜ]��
�Fӓ

Q�8H�70���$����$Yʠ�({߯X��х
�


�5���b����Xȅ� (J�H"�l
 K�
�CD��sA
��^{� 1l����푨h<hm	�-Ȳ!��5@����7&'\$����őE�
�`Y�qpC�6!8���
}�5	��*N輟X�eKx9b��'��fB{�TU��R��)�[D.�<�u��tk�71qP�Ui�I~���
��\[^K����χ�~
+�5�yb�0q[���hM]�|�����ِ���!�L����q��{ni�����$KR'�*j���^P_�j��7dX)�z)�!ߟuhe;�$�7ޅsB��r�οUT?W�'�G
xf
�+Q��O>P�
�
ƪS�ԗZ�r�c���H�#�Q���_��)�`
+>�
�*
?��_[�쑗�|<I���f�K�>^�d�Γ�n�*��>�8�r_��#��@-�8����g��j,�t��\ҧ�2��u>�_4
]�822O}�Ki޶tNQ���hJ\�k3�Є��P��\�
ɴo4��1%ww%�k����<�Y���ϤN	�S���>�y�Dg�w0�,��sߜiG �����s��W���Œ�
�����S�[$�J#�yS��b�Eu#푩}/vn!�jb���O�
�⾷2���ɯ���/L�{\���~��@Q�j�R�[�/�\B��j��:֖uO�q�ig���vC�]���
]�����+W�Gr���O�ެ�}�����Xt��g�%cA]�nϊ�3��|~�^�T=!���eM��mI�)Y-c_�����h;F��
:+Yi�Lh at n�ЧZ�|
%�
T4
�G4,��;$��� Z�C�&e�)>R��x��
|�Z�ݑz�gMUu:a�PlI�<�2� �yed��M̐O3�;�=�V��]-�;���8��P��j�%��� ��ږ�”�+��o��~^�/[=N�"�og�'��E��1��z��U��y����n��J�����A� ���/<K�9< N�q��{����4�@Q�q4/�<�Z�/
�}�v:UM�R�G
+�T�܂��*m
!4˼����6�/��Η)�H؁Y��u)�
~L�P�!VtXzz����ã��uw�=�:'���.#5��`��Χ��9�k�s�J�/��Vy9���^�����n��W��yZ²���6v�>z��:�[�j�qP�ӆ�*!I�F7��mA����ū�ݘ08�~`{������ê��'
��le՞^����K��7���"{|����p1{*�~ i�o�$d��1�Wn����n����^5�A��kΑ�O�aNbǨ˞���ً���4���6#��?�6���+o,W u[���b���t�伱��
�N�BU���SK9��lD=�w.<����'�}��H	��|�Wv)����  �վ��c�٭���
��%UN&�j�$^�J
+��y�.�r��Ͳ��D@������諑T���wIη�]
�靇�2
>ψ�M��4��
��Y �����
>����-
+��V��Pendstream
+endobj
+9535 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12649 0 R
+/FirstChar 112
+/LastChar 115
+/Widths 12650 0 R
+/BaseFont /LDRLHI+CMTI10
+/FontDescriptor 9533 0 R
+>> endobj
+9533 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /LDRLHI+CMTI10
+/ItalicAngle -14.04
+/StemV 68
+/XHeight 431
+/FontBBox [-163 -250 1146 969]
+/Flags 4
+/CharSet (/p/s)
+/FontFile 9534 0 R
+>> endobj
+12650 0 obj
+[511 0 0 409 ]
+endobj
+12649 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 112/p 113/.notdef 115/s 116/.notdef]
+>> endobj
+7621 0 obj <<
+/Length1 805
+/Length2 2096
+/Length3 532
+/Length 2681      
+/Filter /FlateDecode
+>>
+stream
+x��RWXS�
B�U9� 	hH �41tD
��bLN ��`0��0D���t�A
��C
�HG�8��Q�o�:��>���������:��j��{��hQ{�H�!`noo�p�(LM͜�$�j�c�� ��@8L�u �������6L
0��X4� ��#>��,���8*`�c��
G�!<	d�� �L�>��N 
���$
�$<8���0�ϖl�D��Z&}k��4:� �bpL *�@"L�0Ĺ
�x�o��^�*�L>��|��
�?�8
+���� Q�� 
�� ��=�
���
$��)�wm82	����A`/�Da��It+$8�� ��#��/u�J��	'�/>�
ܰή��_���#Q.� @�E���aND4�B!Q(4��Y�v>��eI�C����p4�Cq��uu�04@�@& 29���T��9p�� �
�y��Z�ϵ?!��
 -�_�!S����/��of1�8�j��.Ǐ6
��"�����@*��
��
I��A�	�a�=�(����?_��,l/�A�3Jb_�w7��
4�=hsw-�ʼn
'�M��+�"u���dž7�9k���5
+I"�3�yg�lo��M��jE(�����Ƃ
hξR]

+�����Z�@n�<��ޞ��������W���a>����@��CI����B��Z��w��f�\�@G��
��\{���9/늴Y����7W�×�
�픛У�ߐ21,;&>��o�D�JЦ`�"ߘ_z>d�=��'�l�+]j�
��9̞|>^�����{���ט�F�0SC�b�����G�Mo
n'v{�'�z�R̚�����q���_�7�^l����8�Y��f=�F]�E�_���0_��\X�=A;p���H�3���~�����/�QD��Vq�)��Q�w��8��N�B��>�y��ulv����4wٕ��2�E��RfDǟ�/Z
~ͺ)�
��dZ�,hL��ő���W�����
�.:��?�(�	��g���{�����rw9�*ʑ��o�0dx|��D9�=ӂP�)���+ 2AZM����7ۣd�s=M~��\�k�j��rɽ+�ȍR�޼�v���$��\�rV�z��W��=�#�K�%�8��_�D����Po]1�2�ʽt���4���45vItڤ�k���9g <f��m��%Shُ^�:|�tm�E�5��G2���5��.�M8�T;��;�@�u.=��ϓ�a^/os�x�{t�%�P#^�"2qU�aM^�Rz�<�3��
y��G�&���.X�%ñ�RҘ�
�V?�>�s�S�B������x��:��£�&��H4F4�����Wq�1�V[
y.l��qJ��D�y����)I�܃�	�p�G&�rk��F���b��%]6�]0]���.���{��+�I�/���S�8}?��Mv��:v�	�0xr3�Ge�x�,��ت��bj���9���;�d�Id7�-���i�Y���s��h���ޅ�?���݌��-!9Z�]7	X}Z:k1h�2t�����)]����ڐ����1�+Ʋ���W���o���m"
�x�
ݡ�絑�͆�
+A�m�w��g�5d�f�ʣ�K����h����4����q�I:N��4a[��+�p?���qx�U᱙���k��O�M�]�b�b�|d��Ǹ"{m������7��մK:.��E.�T	��mj�$&�1���4�l�2Ϯ�F*��������6�zc0��Q*j=���v��Y����ܘH�A���g'�f��6�
+a�t�y,�^c)��S4�R
���V�o�g�'2=Ĥ�t[vXhs_����k>�my3
+M�kY���fC�a�
ͩ[U̜��pvc0��2�e1�q�]�aW;�)7w0f�1Z�@D�Ƅ�MM���g
+E̙��|7n���ɕ{��ۉ_����4mf.O��R

B`%�ʌW�5D�
i3�
�ޚ�q�
�:o'��^�/[�>�0U4~)3a��$��I7
��b��p�YBVR��(����FzaER�̯�&
1�)�~
�ʊ�j�]9�y�~粶��F�
y#��EtKx��7o^��f1�Aō�࿋��ʛ���Ȃ2r���tA�
+f{���p:toϫ�2�����K��n�l+QJeDb�|ȘQ�>�Z��a�z�`
+<l��-%��{I�h0>��I�
��Wz�1��s��R�*�G�e�B�潅�5�=���D�w�9�V ���7Պ�W�ʤ��vz���q�7���G�t���*�m4y*�F��d.���
���"}�T������4��E��#���U��Sɟ�X�^�����Ks�y�o8�?��U�8�PT&6��ɿ��ta��u�ڇ䖊��I|�kK^���s���
<�곞;���MȲP�W<QVn���/H�>���X)["q�h*��ą�?����W��T�Yoi�6<h�j�k�[���-#ߠ(�����	C�0ك��G
�B;�wr��C�A��[��+#==vB�G�b���<"#��zyUn���2�F��
�'�Ł������V
yc�i:������8?<�Ь_������RZ���3]�W����
x�NZ���M��
*M����:�#Bz�h���-wߵN����yY�լ4l�^�dG�3�z���������ϴ��Q������� �
�h
�����`�~�endstream
+endobj
+7622 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12651 0 R
+/FirstChar 100
+/LastChar 117
+/Widths 12652 0 R
+/BaseFont /PWASVI+CMMI6
+/FontDescriptor 7620 0 R
+>> endobj
+7620 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /PWASVI+CMMI6
+/ItalicAngle -14.04
+/StemV 85
+/XHeight 431
+/FontBBox [11 -250 1241 750]
+/Flags 4
+/CharSet (/d/e/m/n/u)
+/FontFile 7621 0 R
+>> endobj
+12652 0 obj
+[642 589 0 0 0 0 0 0 0 1094 770 0 0 0 0 0 0 737 ]
+endobj
+12651 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 100/d/e 102/.notdef 109/m/n 111/.notdef 117/u 118/.notdef]
+>> endobj
+5471 0 obj <<
+/Length1 815
+/Length2 1545
+/Length3 532
+/Length 2129      
+/Filter /FlateDecode
+>>
+stream
+x��Rk<T���cJ�	ڄ��l�A�
���F
��f��53{�S
�+�򪤃4�TQ��"M�C
J�Ѓ�qk�����u>��~�������������^F�_s:��l�9�� O_GO� X�@������v���
 ��_��$ �@�
��1<!~�+d��L�!��Q0�0	e�t D��`��s��,/
b�(
��B���	��Hh�:��
#��
���|f:x�̃��0
�A����@
��1�gnl
+���t�{)��d� �̬	 �JG�L�L8�'��Y�L�C�|r�I�X2��m����p�I������9I�0
��W���9�C�0@�K!<$�S>-
`@L
<������e�
�ww�s��`��{�-R ���*���v=���e[�"�@ G �2����4o�&6
�#�P�����\H�!Ȩ,���� ���p4 G��ql�/k8~��ȸ���hx��\d�}f�?;rtD�w��h�--d�M�$����\.���
�l/�c"�"
G�4L���>)�ؕ���M"��Ŧ

Ck2ȕ���-I��\�,��%´��Թ<�e��D}]�������CBDFn�t 2x oW�j��<O���d����+����zu�����=TD�:o�(����)0���D�5��%�IMM�lL��Q͍(�g�����%��01.<U����'�A�bJ�t2[�}��~}��pF��Z�āi
�����������t0[y�ntH
8|�7ٚtB�f���/���o�&�2
�ݐ�~�
Ցx*�>��\)�ƨ�S
���!$��4B�Љ$J�HzΗ\�U�{&� �������Rv

^�Z���[���Q�����"M�6��k�������o��Jw9�}�Jү���X���*T�J
+� [�,�<���(+9Ow���G���04�����
ؔ���r#S��+��E%-~
&�]��#��%���Bn�J�$<�ڈR�F��4DW�wF;٫�
��
�O��m
ei��
+�K�F<��6�λE�>�U�pYJ�&E��_�s/h4C9���=����Z~�(㕛�\-�,2�+4����߫�ڣ�W���W�a�A�F�)�r�Ɗ�큰\(�S�]���Q���R�dZg��SX+�N7A�3�	�Y��/Y�ꋬ��y"��m��bIq�P�X+-�N(R�
���k7�� �{�@�
?wvUi _���{��N��:�Z�#�N�w<�LjN��{�ߔ��������T�vWJ��M�X��lhi�~�ވ
+�]qcF�g7�P�Xi�>�&<l��|��,���6U�i����ςS�?(/��r�MZ^�a�z�a��)���C��;�7g)�
�W�`�?��-�+-�46�J�>�/�>ت
��u2JwMB��x��8o�mm�-����l;��ׯl#�Վ� !O���uG�/
I�:w��
���O7^�ʘw���WV�Z��‹~�G�kL�vW���û�f{e9)�
��&%cs�9]{����:Z��-�����t�M�k��/�:06�oAa�fn�v�%�I���[����s�e��&]�����Ok�6��U��:�{vk=��}��P��53�O
�;$�D���†=>��z�ƍ�����&�r�����@ͽ��ր�O:g���e��������
8�콻�F������ի��g
�R�qڼ.G��!��7�[�Qm�\ݞ����~flo� u=����*�*:�y���0]Z)~\�N;T��z��e�.������}c���<���}�
+l�}է���)�Ŝ>2J��Q�вҢ��pˮM�~���a�u�	5=�R�� ����_���<�
l4��̘;�q(1_A���혋���Q}х+[�n�
�˫`��g'������~k��
��G3b��m������W_C.Q-/��rb���ⴊ����>~m�y��0@
��lM�(;Ci��_pSXd3�Y�bP��+f�P+M��Z�����5^�1����P���T%�<ܷ�A�'K�լ������e��R���D�g���8�ay�n
��d���8��,��vUP�]�Ǯ,�EI���*�4?�`n�L��@O�V�6[K��6�����	��|�qwb� ͳj�endstream
+endobj
+5472 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12653 0 R
+/FirstChar 81
+/LastChar 82
+/Widths 12654 0 R
+/BaseFont /JCVBKA+MSBM10
+/FontDescriptor 5470 0 R
+>> endobj
+5470 0 obj <<
+/Ascent 473
+/CapHeight 689
+/Descent 0
+/FontName /JCVBKA+MSBM10
+/ItalicAngle 0
+/StemV 40
+/XHeight 463
+/FontBBox [-55 -420 2343 920]
+/Flags 4
+/CharSet (/Q/R)
+/FontFile 5471 0 R
+>> endobj
+12654 0 obj
+[778 722 ]
+endobj
+12653 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 81/Q/R 83/.notdef]
+>> endobj
+3093 0 obj <<
+/Length1 831
+/Length2 2352
+/Length3 532
+/Length 2936      
+/Filter /FlateDecode
+>>
+stream
+x��Ry<��
��0��%‹d�3c'��d	!K3/��̌�Xұ$���dIʖ-r�����R�b,9�!wrι��Ο��u?�}�?���}����<ߟ�����1��
Z�e�
+B0�sqA��
+
n��5%�H
+��7CR@] ���
+I��&��몫2?�,`J �H� 
+ 5��F��q 	�B�;$% �15PH,�L at a@
+M0�b�od�	$��� Z�@ h
����<�͓5ޏ h�VF��h�Id�) �gS
`�D�X�� 0{�4���a�{q�,�
��&�����H
K��A�C( 	�#�A�{���9;�	�}ߵ� ��1�
��J��
+�
1T @!��{e���3�=0
S�S���/u����).4�T���0�Ǒ����pf�&�������a�x����� �DB� ���D@8���  �L�0<��
��D~��FLU���;�`�?!�N��� ���	�(BU8 ��2gi{������ꀲ����� ������BH$Oٻz̈��~�>@�
+� C�ԉ��ۏ/^0��)گ�j�_s��Qc�3��wɬ��m��
+c��_�邼3�g$C���W�F����c�􁝙��f�aO��W�v�i��z������k
�o��
S��{qg��|�#����{)�&��UM���Z�t������jRN|������GC�Rn��v�\���Yq�����y
9�v|X6Q�UM���t��ӕ�h�z��o�^�X
�o���f�6e�&����ևz&�k+�h,�ۓ��
+�G>�������ً-x���u�kJ����?<�����>0_;�b��*�xܻ-WP��+n�#Q��8�pZO=&��h�oV*5��b�d���a�\���Q֧&n;ejk
�d�]���Bv�
Ļϛ�V���S�[�/@;4�|�4	�4frǎ��S�(��x���ݫ 5�ɠeE
+L�T��-
�����/zc�
狓 ['�ތ�\k�lgIgY�~,$dP�
�"��sp�&O�Z
6�eh�����������@��b*�m��k��y 緌�<�m�ng,�1
+t���C
+QO�M��#0�ȭ|�`�%⼦�XR�VВ�Hv��*.J�o,���`���%H���!㪮�KKg	��e���4�A�
�m��0��t�����T�G�o��
+o��

+h:*�O�
D��LI�(�!ro�o��2�H�C��K=}
W[3�^y�k���5���ߌ����ٻ��[�C�,�#jO�� Wۃ},�C�3;�^�n��e
Rc�6��ə/����[9
��z�'��nu�U��ʸƚ.{񫒣�s��������`�{>�]���Zj�@˷^��]��rѺ�}z[����
�-V?�������	�lm�Td�R*Vw�S(s
���y�3�#��Šr��Kr3N��#:#s\�]6z���/�(��LY	�s��Җ�5|�8���Kv�/g9�S�N5���&�A^�c(ɏur�%
�4�)
<�"�&S�BA���H�W���A
��l\�^D���
�p �!>7ܭ������>ӏ
���k��o
��q\�
dyx]%�u��W8���-�^��w�|�
�&7y��>]�q���]��=�(�e;&�և���1�4pf�(=$q�DM�P?����+e6%�p���J� U�D]�-A��./v*'�	�(�=f ������j��f`�M�r��ܬ
+?�)��.߳ɣ���N?���׮�)���e�ϡ�-B9Ye�Ta�����=d#�����cGn�ҟ?a��)-2}ѻ�1:�.�Ͱ�p;눯�j
j�>1�뵂xն�m~�oC����` h��S�f(��N�Y#��U
��F����Y���
5k~ήY�נ�r

V
�
��W-߮� ��!뫜u�[?/��U�&��*�qq1� o\�s̾�!Ǚi�XQ)��X
&�^9י��{@�
Z����F����ܢ(*
��j�����BI���А6�u�yU��(��fRKK�gP���V�D*��\�#�b��!8U��>����Z5E,<�&��}����MXO�j�2b�&(�k�L�{`��蓎��(��	U}%��2��a_��
?}�
�T��|�H�μ�c
�i,9K��ٺ�?���u��r��#9M�s=A
c��,s����/�s
+G�
D�g�D�n;�tY��
`*k;$�?���vjS�כ���"b��.����w�G����iH �s��j6<�
?Z�k���T-��s�W�5阃g�˲�،�k�%�;�%�����&�?�M��%9H/,0n�D2���o����I1��n|� ^>����	d� �^^H�A��Q�8��l���N�}-�CGp
^h�\�5-�ͼ0q�]Y*M�u��I=ұ�� ���ĩ���0Ր3�
+��~
m#���+;��s�O

0n$-O\�:���g�q�hp"�����i�&c!�y���=k��<��U�ʦ�
+��Q+9]���@��4�J�H�}����	�I(�M�}�T�["�s�|
+�$�SJ��:7�9�H�	��H]�k��&�/��5E�®�c���%ͥ����گ�w�Z�����
+�� �Dʟ���T�8����6����l+���A��l�6
��ODg�zvG���k�~*ت��Q|֤e!�rM��}��Ip3h�6X�6�qw�@[q#"T��wP�ģ{�qnBݵ��
`�R~bs��:A8�����c
���M>	�f�6�z��&V��v.���g����F�H
uYb(����O�܍==�q��-���D�'��#��ɤ�_P��UI%��x�m��j���v�"%��>d9������+�[{�+��
��[�0
=��/eg�q�x=Q��s�������1���qW~���Ak�{G�m�&j����MC��Hⱓz��F.)EK������	D�(
��'�]��endstream
+endobj
+3094 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12655 0 R
+/FirstChar 101
+/LastChar 121
+/Widths 12656 0 R
+/BaseFont /FZCAQN+CMTT10
+/FontDescriptor 3092 0 R
+>> endobj
+3092 0 obj <<
+/Ascent 611
+/CapHeight 611
+/Descent -222
+/FontName /FZCAQN+CMTT10
+/ItalicAngle 0
+/StemV 69
+/XHeight 431
+/FontBBox [-4 -235 731 800]
+/Flags 4
+/CharSet (/e/l/o/r/t/x/y)
+/FontFile 3093 0 R
+>> endobj
+12656 0 obj
+[525 0 0 0 0 0 0 525 0 0 525 0 0 525 0 525 0 0 0 525 525 ]
+endobj
+12655 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 101/e 102/.notdef 108/l 109/.notdef 111/o 112/.notdef 114/r 115/.notdef 116/t 117/.notdef 120/x/y 122/.notdef]
+>> endobj
+2435 0 obj <<
+/Length1 771
+/Length2 1151
+/Length3 532
+/Length 1720      
+/Filter /FlateDecode
+>>
+stream
+x��RkTSW�q�9"Py
u�Q*�!%�` ɠ�hxȈ
!�$\M�ś
&$���
Ey�a!�� ��@��(Z��*V�(>�2���s��k��s���}�9ԅa|W.���@
#]n
�		b0�aO�S�T
+H�$� ���'X�$L6��a�9,�
+��D��H���$�
�RH�BBd�4�	��B�
+7��H���2�� �
7
+�TH�x(F1
+m�S&���$%~l%CBf0�L�\
+
&
�( EZ(n�
^~[���$�P�tR~*���RT����K�HH�
�6�?�
��$��
"T���\
nt�8*
D�	CIa	$28�C
��ĐߔZ�*^����~�کf� ��pE"�_�S5���������0
��n�a+1!���0Y�@@�n�b�X@� (�@9�r�c����#��L*�e�^=�&�2�$�`�x��қ�~�k~~�\��N�L�a��	�,z��I1r���X�PC�ʡ���
�;6���H[Yz�r�R�C�;�5f�z�
��m}����^XeXmBOX
^�
�
��qU��|Z��V���--)��
���h/nk��
�|�u�K��l���W�ɍ����c��{L*����i���hM
�ŏQ6�
΃����
�xx)�-k��)z�矵�-�;7��
+�����:�|�*odIE��GWpI�j]�����'V7n�ñ�[o���+[��bJ=�i:�Wzfd�yosԼ�u����U����}`M�F�ܦ�f���NsG%VO�m�ۭ2���d��cE�'Мg�V���z��S��C��./�Y�5����cc��aLN�Q�HuՎ-
Marݝ>s걗��[<nD�8��5
Jj�rY��>r~�W!�w?y~���׏�9
&g��,9ˣ̲61�b����s�/2ʹb��p����`�p$_�m��ӵ���ogP�_��̧�&�5��T������U/{�-�}vkü&=E��v�:�O�4�yߞ
9w�Y~�����Ҍ��jN�,�-�Ua�lљ{���#�"���_I͛��2F��#�+g��X�uL��߾�;������Q�!��ٜ���f[]�R�v�Y��m��~Ȍ

D�>�2�|o8���8������Z�	(?@���]kk#����pq��ﯚ��!��##��_Ku/r:��
�E
�䩤�Q�U;�;�
�����n��ٞ���1�=h [...]
+<�KP��-qnzX��"��xQq�ni�?��a��oC�C�l'�HD�����0�gLd�P졌>)�л�.�{����YM�J����bo��I.���
ݾm�T����'�ڠ�l6�yP|���k[��-�ݮ�����e����>R��s��&}ÿk^����p]l���I��B��ݮ�;^I���L(�m��O��֞Z�j����UW���ؑL�и#:�Jݫ�ίC�
:�,ؐ��p��b�Z%�����5��ڳ���>��ԹF^\��{n��ޫYwR5v��4ͺ�A�����Oh*����������6��?~��
�!�( H\* 6S�����endstream
+endobj
+2436 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12657 0 R
+/FirstChar 60
+/LastChar 62
+/Widths 12658 0 R
+/BaseFont /FJGYQN+CMMI12
+/FontDescriptor 2434 0 R
+>> endobj
+2434 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /FJGYQN+CMMI12
+/ItalicAngle -14.04
+/StemV 65
+/XHeight 431
+/FontBBox [-30 -250 1026 750]
+/Flags 4
+/CharSet (/less/greater)
+/FontFile 2435 0 R
+>> endobj
+12658 0 obj
+[762 0 762 ]
+endobj
+12657 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef]
+>> endobj
+2200 0 obj <<
+/Length1 976
+/Length2 3441
+/Length3 532
+/Length 4101      
+/Filter /FlateDecode
+>>
+stream
+x��y<���E�A�(��V��b;a��X
+����a���ʾk��)���,��BȾM�"���o�9���<�?����}�s���������$E�6r:�+րD����05@����P���
���HD��U`��0@��2 `p5U5�<H�#y�q��)�����"e@��%��("`���c	t
4
+ؐ�8,% 
�������%_�b� 
����{GA~�1&�� �?�_��RW�d�)@�nR�[Đ��  �uA,H�t'���)n��[�?��{�Y���<���K��sK&�����5s,�K�g֘����:��x, �3��1��c1H
����>�_q,�O�m�ebl��ױ��5�_)$
+G��x�[�g�/����!����P0
+��߿�����>M����Pd2* D?tRa ����X�_�H��[ ��n$2��0U �U,��3�g@������P����GA�M�v�
J/���0 ��
� �7���C�„�F�"��t)�o(@�~CE B�
�tϿ!ݲ��H�7�_��C��%���+���?��* �J���V��%��Dʯ�@�_솣,��M����Q
Y�1e!����2t/7$[�=
ja�
O9���m�-����N�����I�]!��AV/
Vý��G���,P�>��L5x�%����Q��Ʋ����=e�%�yk]
�R���Ӣ
O.^��$'
+�lo@ş���wJAԚ+ۻ�b,͏+=� �?2�#��Qvj���˳S�R����~��E����od�}��wG���*��/N�yش�S�
�
P�?��M
��MC���SG�g��煀#���{
+���/�J���;�5<$VpB�?������˧{H�
�����
�BzVxi3I��7��h`=a���f�Ŷk��iګ^ДS����ͼR���a��jy6]PH
�ׁ��H>��˳��Y�uGK�/�%�/5�~H8ju X���
+�3`k��^���Vi¯�i�5}��$M�5v���w���y^ڮ��b������v����L���:
d��ô��B+۴����8�LE��D��&d�h�ڋs�V�)
Ev�^j�)����c3����jzշ��?X=��/��e�Y�2�4p��G���{�
��r��TyZ���dB�+%��=��Q�q_�?��
��枇1#�����+}�<J���-(�
�^��
�ַ�Is�\�ww�+D�aD8�rZ�>�;Y�t|T�21wݡ�GrU�����,���	Ν�
Y}�9���	;4ϛ�
+�8)��	�����7,�oO��T��r�ِ��z��@��^6A�T�.~羫����s��X�ᄐ��o�l�F�`Z-���W�:��"���g�煔���g�|�d��<v�����z�p��Q�8�'}��W�f���)��VQ|�5uT�͗2�M�S�ʃo�r�d[V�lF"������k=��8�.�q�+��IV1ۄm]�R!�����N��#�����cZ�;n
_�6���,�@��EBfi�
����C�3U��5�:�GP��?��/�
��km����z�~�,��vsŤ0�K��{�a��Ǽr�_��[�N�^>�|n%/pw t�g�ʥ5��uK�
g��V��7.G��$��o��6#�Ž�˫O�헣�Ǒ�O���
-��h�$Ό�

+L�2lj4����(M�Эf�
����gJ/�j���r� ��pw╥�x�JlAz�yx�����+��w�_�o�o�D���4�+
~b:[�v�Ҽ�XgD;'�A�cx(�l|p�]|YP��{ٲ#�Z.�6�)s�5��~+�`�����.��^�,�$�e
�L��R���>OS8ݨ�i�.�p
��_���4)|�c�G�rH9���5w9hY7k��Ԭ24�TH4ޥ�����Ў^X�5�
Cd��]�A�GbY]���>�l#��_�|���j�
�a�M�92��9Z�ͪy����r�-��줔��=_c굻yD=���wq��)< �z] '�Z�_r#��C�+j�������z)!�
�ґK��\iܤ̓�
�Dg�Q������+L6�"��3�6��Vo�����
1Kwc�
&M��k4v�'�iB�]��k(Ykm�o&��=b���ꆑ'�|��iɖ�
N��q+ُ
+z��vl�Ԡ���ڄ��0�����a] 
}��.(}(�F�A�KLS)N��
H3�ɥ��P�#{�e�d,�!p�X:Q;(����&GZ�k�
�sϝ�����w��[�o�����a��GVO�t�[�:��"cd�H���ݱ��z!�9Br$��v+K�
�K�OV����mu�����b<�x��a����������S?�;�KO6��
Jt�<�w�ٸ<��S�ᯏߓ�al3y�p�\A��QS at pzi�ݥ�p�+�
Ðx��� ;�pS����w��|�y�T�ִOv5���(ߗ�N6�킍�M|��y��g&
�辍5���%
����裃��Y�n��
�G�w:�5���w�����6FՆ�~���گ/^�qZ���%��~�E�.�2O�pҔ��I��}���Ĉ����L�f�U4�KӦkO4vAm\

���ٶ�+:�[�Az�Rm?,霭
~!�
+����Κ~˱������F-:_UL����Wc�I�?�LB״iq�
+ �>T�9K�ߚ�P_-�}�<�e�D���9��[K�L�d]��o�]�����xZ�L�����3�%��u�N���������>�3�:N��J�dl�t�^����eTa�rw��X�
�7�r��z�ׄ�̢����6:!�l��H��i��no���CQ+�'���◃�kt�J��L��<B2

+i�4)
��-xde��AP��Œ5�qd����h2��Z���S�*
Չ�z���i�D���
6d�g���&/�1�;�Pk�!�JOpi��=q�w�o��o�
f'������
+lGeD��1t�&��CT�
[��K�w��0^3�F~μD3�"c�,��n�VN�ŕ�ڛCD�ʉj��^0�p�V���S]�S��r��t�A�>.�1�k����ߏ�7�~k�νD
6�}"��,f
�
������:�À����$>H��%��%P��{�����M�(��'x�o5�i�(�|	a�
ٰ��y
�
%�.�����J��֋�6��<�
+�q����<چ
+A�ZsVO�i�
�p
M��j����a�&%9��"%�q�:�A�"�����z'@ʙVe~�%�����=�
��=�9!��.�ʈ��X�ŕ#�O�k�d��k
+��޶�ԎT}gn�ǚ�(	@T&"��ނ���sN�����+m�>�-L*"C����iq⸟�Vp&�~� �0�-�V!�k`�0�]L36�5
+f�sG�^0izQd�
y[��:T/\43F}�~h��ȷ�V>�#�Z��>����Y�{!���Ԃ���+D��7:^x��d��f��¾�g���<�ʒÂk�3lL�!M��rZ�j�u`�p�T��R�r[ǀ
���-���yL9F&icP�w��;نP;]���{�Z�6*Yv+��F$îQ����-��d���g&#�9�u�m[1V��(_���q%��GYD@�9�x|���cݫ����K
�Qy��~yku�+�c���u�N
9<��&��|�E�q����`��I�S ��X_{IˢI�_�4T?�<���x�����#(j�@�JPd��lr��S�h���:;U&�I�Sw���Wb���C��q��
0��/�UJhh)����	�w��!��<x&�G�;_Wb��M���L�+��\�� s5KgE�BN�O-�-L�Hl��L4��wM�����S���bU� ��T��Qmx+�őQw�+'3�ڬ�Z�/���c�M?�Һ_+��ۘ����������q [...]
+endobj
+2201 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12659 0 R
+/FirstChar 48
+/LastChar 120
+/Widths 12660 0 R
+/BaseFont /IWPXAW+CMR6
+/FontDescriptor 2199 0 R
+>> endobj
+2199 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /IWPXAW+CMR6
+/ItalicAngle 0
+/StemV 83
+/XHeight 431
+/FontBBox [-20 -250 1193 750]
+/Flags 4
+/CharSet (/zero/one/two/a/b/d/e/i/l/m/n/o/p/r/t/u/x)
+/FontFile 2200 0 R
+>> endobj
+12660 0 obj
+[611 611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 676 0 676 546 0 0 0 352 0 0 352 1000 676 611 676 0 481 0 481 676 0 0 644 ]
+endobj
+12659 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 48/zero/one/two 51/.notdef 97/a/b 99/.notdef 100/d/e 102/.notdef 105/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r 115/.notdef 116/t/u 118/.notdef 120/x 121/.notdef]
+>> endobj
+2197 0 obj <<
+/Length1 911
+/Length2 2502
+/Length3 532
+/Length 3144      
+/Filter /FlateDecode
+>>
+stream
+x��Ry<�{ۧl�����c;��04
+�5�XB��1s����1d+��
+eI���9q�-[%{�,ɒ���s,�L�������}�z>�}���^���^��u���6vj8�	�@t�
+��
�x3,�9"�0%%C&H`Q ��� (,V
0��h
 ������``J�!�dR��Y�ã_��

dR�:�'��AG�H�v�� �J�|��΀� �$!`(@�Y�'�E��ԿX2��!@�[��������
S���6�
�$�N
H �nq��
/�[?���Q�V��/���@�P�;�1�X �C$�I�1���
�(~�Y3�J!��^TPCi"����_J H����� �@���A:�G'��}��nd��`�W��د�
�Bg�2@ �=�+F}ǜ1)�9$�Dq9��'�zӉ�B��-��daH���Q �N 0�cX
A�X��3�� b¾lUS
P��"|�췅q�o��w�
+��,�N�h4�?#ZH@�
+��~�u�/ϗ���cڜN��D(�m���ő���	�/E�9l�W���60����X@
���
���1���+���d�t�׷�Y�ߘL�l@"l�"���p�*��q^g�Q_�������+�N �FO��e�_ۃ��E��^��ܞ�(Q'�1�RU���`;���-B����/�\��j�jn�Gˌ���d�U����kyK-gQڹR�<�o�?�\�	}5>(�JR��
s˪�L�~��b�)�
��*难&�=(�0���V(
���ݗ���y4���
��#7�tkn�# �տ��>o��V2y�g}�̌S۪˭�AL���aG_���I�Ā)�*��LMQx)�-�;"v�QF}r���޵DŽ)�����J��.�}��S��R4��s;�~Vv�HE�|���)��zX�/�%i����I���4��bМLv���6>m�fZ��o
��tK_���Ȍ�
Yx�Wڠ8
�"�#�O��-�p.*t5�I6#!�����{N��b��W��
��{&�<h�:�q<�\
?�z�s���/�o�ZXݦ�Q��D�tT�Z���]cQ	C[��Mկ�U��I-w��?X�i#�+G'#���~Yƫ
D8'H�}�}�>����:�"�ބ�sk�����9�"�%{��/bG����rP�o��
���a�2�z~�2AKC`(?|ͪ�A��A)[ �"x1��t(��
��*ϼ攴�Oe/��5��� j���� ���m�;o��
�
�U������wϔLH��6߸�tT���c\��a�t��FY	�VžBvL�
 [...]
+uW7�L���/,^�(Z����f5����^
~�ȫ���6�^�
+�c;
k��M,�Q��K
ѱ��<��s̙N���i�v���V�e�&j^$�qj]�]N���v�5�s�
?�ܲ�"'?F�z�r��l��@覜�R��ԩr�-d�5�3��g�0�����ƫ����w�ߩBr���Z��6���Z[���g����>K���C�ħ�1ùs����^̺�[� �y��#+�B�mo�d<GF�ո�l���݋�7B~�~0��g�,1�n��5q�s3
Q޳��x���
������K�Ϯܔ�����[{N'{Is9Nئ���ӝ��_
���Q8�����^!���
��}t���5G����Z�j�,6������%Q!/�Ƙ�
�
�į�-ȴ�+6��R�K�J%��
m�ʫ�3>8t;g�p�!��'�1�ale����J��
$
��W�������[�e�G�U#�˥��Ϲ��L�:+
+
@퇞��v��F���f{ˡ�����G�����%#{�r’�{k"�娎�
��
KY�屸��œe�șe�C
�V�:嚉Y�n?ቈ�G|�hC���V
w��Y"%��ҡ����7�Q�{[���!�0��)����0ͼ1DNɀ�
��Y�̅�J�	|��qyB1<�\L���_
I�.���
s�֤x-w�Eb�?.�LeE+��$.9g�u61i;o���!��Jdz�%�\-�|��Y0�'�
����p�
��oK�l\�j��T�h��� ��'4�v�n��#͸(��?���uVשz~<�A�	�!�� ��n�re���yɬ�k~'�o����.��.��mf��.�MK��=W4";�@���V|�-I�g'^�$���r1&��v�W��A۾�nX\�������vI�i.Y�H��*��Hk��л�����d|�
�?EL��(�ٕ
+fd��xG���y?��M�[-��n���zk��
0�����o����ʣq�Ef;�x�T�/Jם�����d#����$4��kΨ
+�)6:޷[E4�Y#<~A�\���p0_�JT����)�b� *a�X.��5s,ǹ9�@߷
�S{p|<��/�:�X�_C@��!��+��
zl��9�}�~|�x������'&�?)CY4���/-NӫQ<��۴O4
+ I�@�&����u��g��`�������V��|\ӌBi�4�$��t��G�,a�
�R�?����ܻ���T����<y/kԬ⥾Zv5��V��hg}�
��L�Y��K��_�E0�]�[
t
u�y�Ƅ�WL�f�I��%�6�Y�E1�.Dm�-K������Z����*��QjX4�������
���9�z&^'5`�1�–��j�ڱ���L�����58ֽ]@v[(�Xk~jɪ�>����o
�\:����i��-�4���Q�E�%�%3�l˦p���
f�*um;T4�x=�p���["rv�r
�������2(�@��~xHx=�����^�O����J|����6����%����2u�;
��"��#�%�C+NW����~�3W0���&u���
��ܲ��5|y��0;!��-�!�V�Ҩ�C�xO�0�D3�Z�
n���U{��{E顭9/d���I�Tk
�r޽��VU5��>����f*Z���f�� ;[�y�����5��OK���/�$��1>���|�x)���\��I����
+�7��b~vz#/�>]����MpBq���<Su��s?�k�~coP�mKUp�ٜ���n2�7�g�
	�c��3�4��"�f�m8���g>
�s�s0���O�z��'�\p	K�������"$0Y����Ng$endstream
+endobj
+2198 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12661 0 R
+/FirstChar 46
+/LastChar 120
+/Widths 12662 0 R
+/BaseFont /DNYUOM+CMMI9
+/FontDescriptor 2196 0 R
+>> endobj
+2196 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /DNYUOM+CMMI9
+/ItalicAngle -14.04
+/StemV 74
+/XHeight 431
+/FontBBox [-29 -250 1075 750]
+/Flags 4
+/CharSet (/triangleright/triangleleft/comma/less/greater/L/e/n/r/x)
+/FontFile 2197 0 R
+>> endobj
+12662 0 obj
+[514 514 0 0 0 0 0 0 0 0 0 0 0 285 799 0 799 0 0 0 0 0 0 0 0 0 0 0 0 0 699 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 478 0 0 0 0 0 0 0 0 620 0 0 0 464 0 0 0 0 0 583 ]
+endobj
+12661 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 46/triangleright/triangleleft 48/.notdef 59/comma/less 61/.notdef 62/greater 63/.notdef 76/L 77/.notdef 101/e 102/.notdef 110/n 111/.notdef 114/r 115/.notdef 120/x 121/.notdef]
+>> endobj
+2084 0 obj <<
+/Length1 1034
+/Length2 3716
+/Length3 532
+/Length 4413      
+/Filter /FlateDecode
+>>
+stream
+x��Vi<�}�&Y�N��Ad��`�](��3�ɘa�]���d�"YC
+c��,!�R���d	Y=S�s�w��||�O����
�y������%"hb.���tqX�4D��24SBd�
""Zx���a���
+��
j��e�@�������2�P
�
�G�{�bZ�?��@
/
��c��p�ʋ���c��8E�j`0@��'|�f(_���a�@�H4� tE���
��~�n8 ����g���%���M���8,&�D�1��p�Z(���
S����`��^?��=��(�
�	�w
���G@၆8$
+��g�5�k�($���Q}
�Fh`�1( �
+�D!M���
��E��QX�?M�����X������i�
+���X�E��_�?sa�ߘ�<:h��!�D���?����"pH4��
+�@8
b �) C @4�
+��~A2X
�|Hn�5���s�Y �
�����@�7
��bPn��Yȿ�?f����	e �E���j����d
��y�2�U���O�?*��
A�d!�oP
��
�}`~�d^C�F�p�A�Y�oP��
*�
��6�~��B����[S"-�
��%�6,��*���G"�On"�דD^�?���b(T 
+��n
��E_�j���)~]I-A���xۨ�c��T�D
+%��ﲏ�L��aU.;���@�w>ߛ�����>��G���]�r��|6۹�A��Bߢ֘[��|V�4~3�_�n[�<���=1m�e�)A�N{�ǝyъP�\�e\L����K�OE�|�t Kz��顨��qtM��[�V?��b�´c�o�ɬ�V9�9	�e���K�X�kt�<T����K������
+�c���8or
���oH[mI"��3e
�r��
%����b\uCАM3id��4�A�u��
���&�)��+�stP�z��m
+�L<#�%-b:p�}���̨,�I�ÃZ��T�	)[����7

~m��=ܐ
+�m���O2��X���1�5r���}XuI;��gҜڒ��Dd�n��15���l���}�ik�����T����g�����
*>��r̰+IU
1&
�6��I��5C_���\�B�;g����{#3�OH��9ܱ�]��L4�օv�0�}�f
1
+��F��q�je�J���Gu�$r�j;�s�
N4T�+�{��/�=�lu��J�п	;���
Z
���.��{״�J��&X�2��?��ǫ�\��n�)?Y~nO��E_
op��sA2���S�/u�zޛ���
�����`M;ş�x�Ǟ������'�
+���Yͱտ��.��-����	��I�A�>#&�c�R�÷��n�`0�Cbq���{�O�ęx���
�krN���+��&��'��
��
'��;r���<D���b[�8_���.�S���yi v�{k;$7
-�h�
�ۈ��C
+:���9�[�0��4
ޗz��-��	�c��œ�Й$����49J�ޣ�����]�b~D�-�i�@��(�c��}�g�x�� Jw��
�<�
L
�z
cej�Te�N}��byِ9�I�J[;)ĩ
F�5�Zz�z�3U4b��RM�,QoL�UC����b��-��S@�'Ь]��7�d<�1<[oe^���e
M[-Cu�#}p
bϓ�6�\հ�9�)�I]
%W����m�,z 6b_
�~���}]lٌ
e��P��0[h���WU���V����6��C
�����B���f��q8��������Q>
+������4�;�-e#y/cŗ�����@�ܻ�Hҫ�}�W���V�K�SJ��*M�����Tq�Z�
�<�ֈ�|�
eU�ᴕSDw��!>>���XD��&	���& �㴯߉����w�m)
�kSDG%-��a�=�p��j�fn�)�W{U�����yFn��|E'ͧ0'޼�0*�p�޸~�E{<�:[�k=!s�^X�n�ׅQۊn
m[��:	]����5/
{
��'�Y�;�x�c���Z�R��T�J?
t�uUZ+��$��i
h��K3�}_E��
���>�s�y���&UB�p4����
��Qe�Zb�
+Ɔ�x
��2t��9�4V�Kz�/�3�PH��՜Y�Id�����ȓ>�d|g6�0�9V��;��?8�\w���m��D`�eA<�Zk���l�ˉ�L���K\.���r`��T٩�4C���2$��&۸pQ��ûֳ͈�>�����hUܯl�p�~>f��2f�<���a����a���ok�B��	��
y�m�
���KA���,j�A��������̣��N�������.�����r�=��D>O�"�7�p��$Լ�d>=c02/�-�*t��)Bae�Y��ć��n��5�
�H/
[?/h>�͆���,�gZ��%�� �oz[�Ԉ^
��TȲ/�sw����
}�)t���_���d�[C��ڬ����z����x>��M��+J�v�L�jq����qC	{M�1b��$��1�- �zv��R
U�W�D^�7����O�̨2�tq���m��_S�
	�1���������{� Um�Bm_��X�$�$`r�*udo�6�BQiE1miO�01>~�=��6�Qv�^����>��R��_D/�>W��Z��zhp�!k��.ZK��%t 5�zapͯ��(+������(%q�;(&!t��G��8�sĴ#l���3�1ُ'�<�FVl�'T��f��8'r��Sq3�Z����oI
i��$Ì/�p��Js�n�t֖��ycy�)<_��2�h1��H�j	Uc��EQ�
��1��~B�r�r
��b�_�RsZ��MR?㒽��zb���tQx�ͧ��%���-Rv ���Y���>-��7
!i�0p*Fl�W6ք�9�ƴ.��48xGK\?��ѻ~�� [...]
)�Ag��缽C�\��,�e���'ۆ�+p�J�
_�)������]�,���Q���@,GO�d�{2
rv��c?rC��w���8�H��H�r��_�-d>�ެfS�Ll�.���Pk(/y��׻'9�&�`>�T���Uc�Rg�<֨1n�����i�<����(����}�g�|
�i�+:����dzĩg��u}���r=w�}g�����֌g������J��*t�U�z��v���;�o�ӄG9(�oM�sT)xys
R�UDpP����>�&}~T��J@���_��Z Wj�m�k�e(���Bh�c�(hoO;
��|��aA�9��?(��]%VZa�⽎��z��MU+Q��^��e��iΑ
2���~���7�ޜ|O�'������
+�>
�vu<v��ڮR�T�)�I�Ҧ•a%��}�:�٧�w:j߭�^u|�
�.�^_sDN�X�-���:{�6��6i4_�ɱ8�^qO��)S���[�d�N�E�K7�y�-�H�+�"`^�?��2P�R2\FE�
���[T��M�S���e�ڍ�C8�1��Q~�ϰ4>m"$-�+���x��
��
8�l��0��l�geA._�|`���~)�����iwm���'��i��Е�p��v�"ޔ
+��T'��j6��7ۧ�̛|���Moz���m"�r����h��g��߰��/$
�v�������_u�>�8����t�:�f��b.T)L
0�3T�Xx [}��v�OO)��/�"U#6Ҭ~��8������/d<b��2�Zd[�<�m(��bD
��Ky�Yf"����<^52�*8<~��µ�����n�cdzu

+�d#�ເ&��U�,h�
�����G�ug�Ӫ}����O�^�|{�tqy��Bђ�ܲG
+��r�3�'t�����7�v��S�ȃ�f�N
��`�����mɡ�.�͓<��
v!_�9\֪����])�P�-ڨӬbG��9Ox�F{y����-�
�
y8x��:�H�P��r �N(�g UsoEdU�B�٥�OP[
+*�o�p�
'%'��T�X]��xq:v\��=@�
9���!祜���
G�ݦ����6Y牙?�nN4��7�RO�
+��i?�?��\
I���K�=��p���1����L��0���jy�y���،��e��#�#9�S���E��<C��[�y��y�
�Ѝ��w��
++�Z?{
�������_bգ:�
�^q~
+�<ɱ�OS̰o�;f[��(�o@���☹V�'@QfeGP7� �/�uVqݭ���vuh"X@{��W�&�?�$3�0
+S$^S&i��
�D+��3^7�T�\@9�|4�=]"���?�1����	�p^p�'ÿ >٭endstream
+endobj
+2085 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12663 0 R
+/FirstChar 12
+/LastChar 118
+/Widths 12664 0 R
+/BaseFont /ODGMWN+CMR9
+/FontDescriptor 2083 0 R
+>> endobj
+2083 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /ODGMWN+CMR9
+/ItalicAngle 0
+/StemV 74
+/XHeight 431
+/FontBBox [-39 -250 1036 750]
+/Flags 4
+/CharSet (/fi/parenleft/parenright/zero/one/two/equal/bracketleft/a/d/h/l/m/o/r/s/t/u/v)
+/FontFile 2084 0 R
+>> endobj
+12664 0 obj
+[571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400 400 0 0 0 0 0 0 514 514 514 0 0 0 0 0 0 0 0 0 0 799 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 285 0 0 0 0 0 514 0 0 571 0 0 0 571 0 0 0 285 856 0 514 0 0 402 405 400 571 542 ]
+endobj
+12663 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 48/zero/one/two 51/.notdef 61/equal 62/.notdef 91/bracketleft 92/.notdef 97/a 98/.notdef 100/d 101/.notdef 104/h 105/.notdef 108/l/m 110/.notdef 111/o 112/.notdef 114/r/s/t/u/v 119/.notdef]
+>> endobj
+2078 0 obj <<
+/Length1 832
+/Length2 1220
+/Length3 532
+/Length 1817      
+/Filter /FlateDecode
+>>
+stream
+x��R{<��
>vS*K-������à��¸���yǼ�E�\2M.s�\�V��H(
v�H��H*�Y�N�f;J�
��l�y�t����s�:����y����>���|�,k�0
a
+bk
+�� n^��w "�`a�!�
+�Bb�(�"�  �66
:��	�e���n��$:p�#
+C���׀!
��("��
���'D�!�a	
+`���#��@Z6�!��-̖D�kIL��;q�� ��
+x2�F8���
���7L�gJx<o��,�
�o����E�%b^B6�	VS���޼6*��z�!

+�"x����T��*b�1���a.�@<��#�j+xz+FH�2}��z�Օ

B� Y4ȿ�Wj�/5��ƀ��D2������઻����
+"�
�@�d\ʆFr
+@l$ 1�aQ �# O&p�ay�d@��h]�����PQ�$�q;@��ID�&���<D$BK�e�Ci8��>"�`�
��U#������
P(�v�N����K0
WXy~x��j��Ab�0<(�
�"��+��K�*�I�����k��j\ʎ����F�K'�ǯdv�E��{Ž��X�֓���t������YV��8�'KL�z��
�

��N�=>n�hŔ��f��g��ok������̏j�|����m���u�>ԓ=�0�����
O��
�`鉘i;�9�5�g��	9Ҿ�c�3ޤ*��iT;%�z�!��2Ysw 1�t��?�g����>�6�&�Yq�\z�]EΉ2�}
L+�cݥ*L�
�Ʋ��=����i�O�	k��2��f,��w)��fO%�Vn��r��������;�+��-�Q7���m�t
�=�0���������K���Ǿj*�A����gm2���mm��a��b���;X�_�ջ����/HI�F�^{ǒ����1��4
���QBg!"�������\�ܴH#�\oC����F�!$n[����4O��P��A�2X
�Tɳ�r���K��[�ZCj�� [...]
+C%Y�k�Q�����q��E� �{���g)h	Ny@�|Y|��@mB�d"��T������ �_�G�g&���l�h]
e���7n��t�U%mK����f�=�Pn('h��?$}����cE
%��>c��(#w���.4$�)3�.Ť�8����'e%�L���旤8���$�b5��T,���c�c�O��C�Aʜ��΄�_�\�o�Qk�7�4�E2���.��9,��@��).w��LV�c������/��؋�����5�!i#��r
���x�Jh��t�T�b!���
-|3��.�L�RYE���3�M��Zr���5�/�?gw\�<l�7�E�-�������bϥ��
9�9��k�a�&��W��.֙q��n�n~۴g #CZr�FK�B���˿׈7�V$�ۅ~;gּ�1���L�L�	J��-��hS�M4�}]�X֦��li>+
�J����]���ī^�P��$Cp�#�2\M�ɍ�8���
'�1��1m���)�M�����`��\�@i��%��ئ���Ƒ�ؾ��G���(�Z{�~74JP}���jn�sp�$���S��|]���&�ҝ)?CF��g��C��Ju�.g#�5������*<�I|�+ ��ӡTz�\U��56O�?���'`
ab!¢�M��wendstream
+endobj
+2079 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12665 0 R
+/FirstChar 0
+/LastChar 50
+/Widths 12666 0 R
+/BaseFont /GFOVLK+CMSY9
+/FontDescriptor 2077 0 R
+>> endobj
+2077 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /GFOVLK+CMSY9
+/ItalicAngle -14.035
+/StemV 87
+/XHeight 431
+/FontBBox [-30 -958 1146 777]
+/Flags 4
+/CharSet (/minus/asteriskmath/plusminus/lessequal/element)
+/FontFile 2078 0 R
+>> endobj
+12666 0 obj
+[799 0 0 514 0 0 799 0 0 0 0 0 0 0 0 0 0 0 0 0 799 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 685 ]
+endobj
+12665 0 obj <<
+/Type /Encoding
+/Differences [ 0 /minus 1/.notdef 3/asteriskmath 4/.notdef 6/plusminus 7/.notdef 20/lessequal 21/.notdef 50/element 51/.notdef]
+>> endobj
+1998 0 obj <<
+/Length1 768
+/Length2 1151
+/Length3 532
+/Length 1718      
+/Filter /FlateDecode
+>>
+stream
+x��RkTSWU
+R����փ�B�� �I��!&B�b{I.�B�
7�|P��P�J�c�Vp( `�*�3"�<T at CyTA�@Ņ2*SpW�П3�f��?���>��w����'0Eh
��
+�� l
/��d2�ٙ���Ae��f ��
lK� � {1h

�'���x%��c����H�L)�!BHx�"�4���Q!+�D��H��	9��a,	q
+!B��ň
G2Z
+�E��k%ƿi%���`
+�.��
&E�L�"8G
+A
�`��������I$5���M�"�	�4>Qc���`L��/z��"$Q����$��)K`@�xɞ�8"@�aQ(�ƀhH"�pX&Z��߂Rp�`�?�m�bz�"S��0 �J^�)�ֆ�0$�&�d��hXov�Kfm�	Q"*� 
��8�A�J��
+ at d"8���$�
U� C0� �p�[��I��Ft�����
������&����@�FQ(d�E#��Q��a�L��x
����C�0�

q�>T�{8��K�e��w��m���Wz�f���<_�Đ�Mv�K �?m���E*�4?s+I�hڏ�����>I}Ϻ�f�7�|�)�Ğ�&�E͍���G�׍�_v���`f8���:�1�����L����=�w��G��\�5��"]p
�����IZ��ϵ�ݓ?�z^o�8x;n ��s���V߷Ows�s�\ˮC?
�6�fv�.��1]vi�v���Q6#�z��YT�g������&�_l
-s{���'�|���n(���g�����u������yw7����Q(K�[�gAˋ�khPm�ñ�>���'6e�����n�;X�u���B)�2�
��"�=p}A���T�2�9���2?�������}��w:o���WA?]1�y��ML��`1(�+F�^����+��Z���	D�Sh���X�cHA [...]
�&n��r���lWLH���l�w�f�Ԡ(��-g޳�E���׳��%��S�h\M���Ŏ�Iz��ʝ�S��Z�����n5�h��`
=Jg�U��3Zp�X�݆���
���e����:~V__qy:�ʻ�@�����U���C~�=[���k+�N�}v쾢t|�Y~B���+���ub�ϴ����n7���
	��
�5��죃o^��<N`qKk]�@��
�J��L��	ɺ��z�Oi���o]�>|y{O�AJ#������I[�~����3��"��Vתmx��
J*\�"�T
vI�����\J[�f�n��%��'����yw��=��T�tj�s�.�w�h��Y±�z|��/͉��8���UlK��pN�ܲ�UNA��5�g2�cN8N���_�Ꞗ_(��']��f�/|�ӳ�8M�lNӍBN��aa���vϬ\��g����J��Mw:����y���5�
+�
�:dV�}ʙ����g��|��˻���5���{�%�H��_�>`��n,�<1I.�;=��!c�v�t={M[M
���|�Z��`��Y`3BјYz

ݩB�E�2��B��e�\��6)�g<f�
,���}F�b�
�b���6�.RQ�Oխ�td��2��e��<턎[i��
�vV��_�!L�/
ٵ�M0^�����$wg�^}iהH�/?���B	
a
+T
+aq�sט�endstream
+endobj
+1999 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12667 0 R
+/FirstChar 60
+/LastChar 62
+/Widths 12668 0 R
+/BaseFont /LQTODK+CMMI8
+/FontDescriptor 1997 0 R
+>> endobj
+1997 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /LQTODK+CMMI8
+/ItalicAngle -14.04
+/StemV 78
+/XHeight 431
+/FontBBox [-24 -250 1110 750]
+/Flags 4
+/CharSet (/less/greater)
+/FontFile 1998 0 R
+>> endobj
+12668 0 obj
+[826 0 826 ]
+endobj
+12667 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef]
+>> endobj
+12669 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/ques [...]
+>> endobj
+1773 0 obj <<
+/Length1 1642
+/Length2 14402
+/Length3 532
+/Length 15292     
+/Filter /FlateDecode
+>>
+stream
+x��eT\]�.��n�����N�@'@�����Op	�����������>c�{����q{��c��T=U5�Z�Ƣ�P�`�����!v�,
�� e�����:�V"�Ȣ� �9�� �b<H44� 3g0�N��$�Y $A@ ''�C@@ � ��p[Y;��u����s���� =��Vv ڿ7� ��-���/����p�,�6 �������
�^FY
 �9�-B���
(�� ;'����� ��Y��)͉�/���
�d����܁ � f�=������
 vX9��9�=g l�q��'�����%d��ka��K�
+qrv:����JJ�;Ogk3�b;��� ��_K
�埒������:��� � w�b�� `'{3������;��������?3`8���
-l at NNi�r�s:�Y'��������_ސY��
��N KV$ο1��c[�����9;K�����.�����
�u@���
��$�, v6
 
�%�2��oH ���ʬ�}"�7H��"����g��W�������y����.66�f���s�wИ����"�a�b
�gހ��O3[�������Z����g������/ng�W

V�o����� 
U�3�`if������egr�ہ�
+��������_0Mk0��?J���Y���j����d�%$������_ƪ;�Y��
��#�(A,����ϟ!� /ο��pqrx��>�/Q����k%3gG�;���������?��\�); ���p6����u�c�����W�
������_����H+��P��
���y����
��!�e��Ņ�5�.���-�Jӗ�ֆI��V��c��]yƽ�n<��T�y�CO!�m;�^ �qjƉN��ż��}^v���j�ƥ/��\�/
��\
�q����|�iuq�?1���
��&
>����

t]���3��!��~@���w�%�ת�%5rb~��ة[�=I!�#�U���!"\!�z�ԓ�@�\���)iS�ƥq���d^�Ht�c6���<�o�-�i��c �����#F�>9V��9TB|1��ʌ�e�|J%\*۫n��2���}�(c�����l �n�*d��<��.2g�zҚ��nLi �p�Lk�4�ַXk��+�R��S/���.SLt
E�e�9=`Aӆ���q��4w���
�S�`���H
���J�I�t�H
��k��Ϋ�D#�j��k�MV�@2�d���݆��o��}��u;u�F���*�+�
#
g,Ju/��\�|����G=~S
�e�&���]�;H�sX�
d&\���HH����z����V�0M���^��&�]���ҧ~�{

�����������F��T(	�{�{�[>jj�����FW?������l�(��O��`�Aq�������#�3/��d�
��Wƥ�Ӿ3g
��z��f���z��|��]d.?��'�!���O�e��Se<�p�m���PeY���o���E���
sm��Uٿ�\���	��#
�B�\;f�t��]�~�CW�bܶ�h��0{
k�{������"7z0VH�7t}�⋼�� d�
F40n��c[#�5��U� 1��|����N���v*�
i�Jɓh��ax��
��
sy2�
F��G8���7��
]�x��3�������WLr��AĹ���78�0YLo~����1�ջRf+�����~�{����@�Z�xs�7��Y��y#T��T�؟}3�!Ri;�
U�wn�BХ�����̈��$	�no]�&��
ltx�(��w��i����L�Ke�6���
��5�f��|�Q�jjN�oE6ˎ��b�22�,%*_*�!��l�N�(	~�
E�d(�\\1!���;�j�‰�5%OM`y�z�1��i*D�!��ʰ�m�
�m���d�
�n�EC����t���ו;��t��5B���܌0xe�vD��(Q�b��L��ׄ"x��\2
��FUf�My̪%JbIJ9�Yc���m
y����a���%x�=����(�q�n����o[{�
���刞�9-h<�G�I}20�"��t��?m������k_�L���j����X�,��dp��:���
��
��V2�����y8�
v��O�II6�݀>Km��S�����̓���|�	�Wh��:Ǻ{���M�键M緬���=�W�����"�S�.j���"��Nw���� �
����x�LI���2��u�����eI��L���=��b��)��'9<��K��@5Z5�ؑv�sWE&�r��մ=t������u(�ߐ�5�:Un�}\�
��E�o"s�~�v�?�;�_P�_Ocx�{�4�2��nX
n�Po���3h���8<?|�[�/�edC�^�jf�
�g�d6�n�
+]�2���%<{l{�UYu�X�Y3���E�3
I�P�||h�Ŭ!4Xg
+��H_<��z(���
aj(�v�
�l.�k��W��4�>Ę^�;��D��ڐ": ��q�$��ޭM��b̼�MŨ�̦��
�4�,��4�Q�r[2��L�\����^�NOLJ))����*;|hX���oW0]W�߃�M
���o_Pú��S
WG���hr�Z�y�
�A�T���`J��P�S�;�Cԕ��^��U�I��Io�8���Vk���'�č�F�PoN��x��G'���-
�j�ӚhId����߅�^���ɡ��L���В4�0.�n�Qh�'/�;7˘��q��\�l
.rD�&�d;~������х+�

_� �
�]^��+}��@
��e��
�F��(Qo��
��_>��P��47�������G
�����^H���m9#�v�g�O����~
��\��?
�[Pg��;Ĉ~���	�#gdc�����9���@��V�kdx���n���(� ��o��~��
�����-���'%�w�
���P�/G�,�\�às}��A����N��;,L=��0
�)?Νנ����k�
����n�

��3�
+�yI
M\����]1�u�s���Y�Z:�M&��鳿匪_��n%%������e8��|2�C�3��M��X�'�S��1.��t��՗ŘJ�8z���憖#��0��|�}
+>����������w�Ͽ��/\~���*�
��ĩ�R�ܽ/ZZ�:��2��3�d�hE
+���mľ�}杖2
�����*Q�M%�a^[A
i�
+�����;�*�%&���jH N
�7����s��v���6_M
�+0� ��L8u)}
+���
�����RFx�T��FH/|
+m�2"��#9���TGR�h�a���^%&��6�%�jv?�s�ҝ&�z�; ��$�s).5s�Y���p�T͘�6̘i��4��� �Pi|��u�,�b���~�q��EP�l�8��]~�
Dp��uT�Z(+�h��re�v���ș��agsk<Y�f���9���aI���B3��K���=X8�����lE�'E�Rk��w���U$.�V���ݻy���8w"��e��"�#tԲJ(d^�
Pq�
��6M�T4�eꦿ���o�~r%�L��:TK�Yp
�?
Gפu
+��fd��2`��.�������0���0+[��:��
�>���ń�hDeTcV.z�:7$6���}3탊����ב[E�-

+E�
�C�����0�Jx�)0x&�rk+C �jW
,�p��e���T��D�;Z���2ϝ
S�.q�=��e=`�O�=����%K1�.H�G���Ɓ_W˧7?I��|͙�*g]�%���Н���&DZ^p�_��$�ڰT|O���ǯX�MiP~��.�h�]o����?tj��=q~�WÝ�j7sHɤU*��5`##|9�����
�|�q'K�ȿ�P at PBj��;�)�?��t
����
_���4��e�
��ȇ �a������#��.]��)�6%tmɱGY�^T�
��븃]Y
#8G���v�I�5;
+�x�q�!�	܎�
������b
�)��dR=D!#,�
�8�3�{�#i�SCU��e!����.w7�}��ugX~g�aR�:A�<Niqq���Oe)�:�*n�yXBغ8�_�=�gf|�L�
�����1��\��|ؿ�~�,s
��s^�h#���?��s�����5�@5��V��lJ�?2�i�a�~8��z�aiT��(�V

�G/
y���S:

-�4�B�H}ZZ{
M�Q�e�=�Ԍ\݀uD�ͨ;-�?�k�	��������S
+�ҹ�"�r�P��3vk�.6d��o����:��"ǜ�����9;��Q9D��@���[�~%�5��t���>�7p
�N{K/��7�����w��i����"�e]|�U��&�v�~m�On����F���it?�����C-:�g�J`�'Q�P��z�嗃�ajeI�|���N���z[�@�W�.�_sш�_,�CL
4O��Llh
�5�n��1���`t�+�J��!1*���Z6�2."ˍB��e�7t�ST5�U�|69����&��4��_���<r�+Z�.J��W��(� �P�0S3z��f�?�"���hִ�1zX��v���
+{G᠌:��m�@e'N
+�c�1��ǡ�ppG5����
E�P7�������E��'�uxa{'�ڞ�H�19i`o<��ݯ�e��e
�P�`R:tfy~�2�k�
��]�ޣ u�0���)I�M��b���qh�h��&��c�I��tQ<d��i��[p�B%(b�;�"l9��}(�f�
++ݐb�>�|2�ɐ���H&�$4�}����X$����3��:TN���E�>1���?����
.��\t����!*7���Kw��
�	۳_���ױ����@�L|8s�>[k�_�]f}wWA��2����H�
�1z��k�B!
ڡ��gk�����J%��e���@��M�X�&�X�Ȫhw%�Zu(u���p��սR�V�x&%���.��S�'��m�۷h�O,�0���P	tѓ9ڴ���bX3���
�4��R.N����s�>j
�����A3�oE��q!L"1µ��T��}~��Yp�.��b�
��ʳ8ߗy5Ik�T�P}�����Z���Sg�b���CY��$�"H�D�����E�8E6�7���Z�܆K�獵�;O4�
+er?�nJ\��a�a�e�f�*,�@�|z��l�F��%R�X�<�����-ğaR�*+��LW[[`��BQQ9gX�!�'� �$*�C-�i�
{���1A:**G���R[�"*K�A�F
����QlV����;e�H����'	�=SSL���w��\������K��cSY�23�c�Qp��E�8e�R��Qi�������
���t=4}�l	d���.�f�>�o�_v+t+� �[IT�#�.b7��2}�����t�1؊�
��tvA���p��G����΍
ܘ#(s0�6�R��ݦYt����?�E�=�D�  �o"�$���,��>d�xe#u�˺���>�[���\���$�E�_�����Ɵͪ"��c0*�]P-A�-+p@
�ȴY����\#~����b*������OU��Mm�����P[�>�qd����wF�
7���8�����l�!�|,��öw�"�d���9��������a��Wi�("���4`����0L�ޯ�N=t���(��TKd�����<�m*���OirH��f^`u���KlY�h��yQ"��n�J�g�d"u
�b*�t4x⸩�
+&Œ��L��g�������{��S����:�]Ѳm̾��r
+�*/���[��x�)L�5^�
��]�f�
8�r�
��wD~�y�J�wh���:�4+Q�O�JFuK���l���Š'̖�DF���<D���#����K㛭UK���x���9��m(�
ՉӠ_xn���w��YY������S&�}�-��9Ndy8ë�����@5(e�
�!H�v�n,}O:w /
�j��/�9>`��M������Fc�Cs�� ,DXH����0�p�J�Q�)ټSD,ǧ�U���An���7��չ�t)�
;ĩ9  �	���I�Dq0��~���j�
��3��)~F�kf��$ô�(/�׬����x#�[�M���8b8�i�7#�iwa�^�t�؛pz�`TA����g�6��L��c.>,�)��YC�b(X�|zy]���z �v�8{�ч�A���`��3�:Ԝ�����<�81sKƒ\����$AB�)�J2�����
'$�=4
>4'R��Ni�	S|�*����};E�G�J.��V�{]�NJ��rHT��
+�|��F]PM�
����q=�ZX�?{*)�}�ZԞM'��.
�
+V��|
zJa��n�F�@jVj�S ����uΎ���"�#��
+�N��Ϥ&j�
¯P
�jH��
m��,ޕ��%C�?��bjߥ��h<U�D��	t��Y��~�b�˲B$�>nAz�-趐���z���%��
��ƥ��p9���u�T�[�
+O��*��o�l����'c���
|F�l7����y&��`В
BRk�q �%��*��rË�y�"��7K�|-���:�G-��7�t�+�IK��ݽ��,W#?�0�gY5gh|�P>�ZD\���mo�;� �qY��96��B�ԇ�����X/
�N���B9��%��ҧ�f�v:]�aAO���Y����gq��)��uc^!—\MJ�7z�1
�%��
*���)��2���(F]b�����Ol����T���
7��>ӿ�J�RZ(%[|MHM��L��� ��>�&�x�V� i m^�֒��`\3v����d`F��@��W^�t�b�
���N�h��G>��~��2��u�8Z�o�j�h;�
G-p
���Z�
+�I��Z]����r�/!/��Ө1_�ޑsw�)���B�7�)�8\
�m�S���S(m��r�K�M4
fs��y�>�x��-
����ۋ��2��]�i�G>���L��6��R����," 4t0�(_��UPPG�������@�N��u�,O��R��$
s��t�nMĻ.R,����V�����U�����~�⾪���/�/(�!�r�*y`k�DX��V^�tG��)'

��[�)�	�z塮�M�w�DEm��ś�=��걹���
��!VF#���H%�I||���y�,�܁Oؓ�FaW}t;������h� PFTEm�����xDm2J�ry�	Z�ĕ/(Ue�x��-��X
9{߶
k�8�\v��i٠<Bu��XB��+)��9m���v
�d6�Y�4l.r�'�$	�*�͒�-!�y�P������g)c듺N�\2�1����d3$�7؀<F!�t�a��J�:,u_n���8~-���Zo�y�#CC�-y;��6+�L�� ��\�
"Xg��
~��x�jђ����1�Д|-/\a
���]�3zĢv�N\
+֏��&�VSp�����w��b�� ���Q1�ScF�%ӯ�v��`�ɺ��\������r���~#��¹���C3�׵�̎G�
C�(�e����>{
����l2�<�F��WL�X�忞���)�K�"k��Q�c|n��7A0��D�iYpvM�	R\-a�
&1h,�Prf��J�:��BO��8�`�y��
�
+y�gMIJ�-�����nF���Ҷ��{�jw�{q���X������!��YG?��'�$�D�gΌo���c�e%�.�-�),ŦU��
��k뺐��m!� (.r���C���I��?�\k�a+��N��H�`X���ʭw�P�v�o�D�
���0���?ȍO,���T��m̿f:�w\
k�I�,���m�i3Q1��Sd
0�K\�:X�F��]J�/F�}T��� �Q��Y3���DhaTT�w��ۉ��#�i&���v�Hm�DkQ�6��^�Z��j�/I���0z�����f
�@��"��qENpY���0ʸ��w_���ۥD�x*��N�ߗ6At��G���2R���U��0r-z4�����
`[�SI�-���*�����ͽT9Ad�G
��d
_
+����㥦�p�G����̎<I�\��,\v�Hci�$�Y�[i՟�����¾����}m���.�h��N;�wR%Bz&����pn��Y�rzC��ɦ
5;�R�-�o1�T�)��z�M�v�$Q2�
�a�#��
���O��~
�|�E񔨵՛/��Iw��eN�w*�B��恦���{��zg�0y0���;]�'�D�.�]��
+��Ô]DvkK"�����_ᷭ�Ԃ^�j����U�|x��s��)�x:����R�v�<=ߥ>L��o�J=|(�
���[��@F�WX��BJ*��P
܈7��a���)�l���aq���|�14�<�7OH0��O
��B�H5�RG�5�;r$��{]O��%����7�]�$Wi5D��hщ�2
�$�`�
`�";l+.$�2�ň]V௑`���<�#��P;�u���#�E���~��Ƚ ���UܑGl�E�I`
�Yh�
�C��
+f~[���-7
+���t&'`�X����U���W=��CV9t��Y>�i�O��&�㦹�7��gD^7F}�,�����*n˘����[8�����44���)H����^��=<j�ց��2l���
���ֶV��^��&��]��s�R��a�-�>eV�O��X�å��_zVʙ���~��`��hFپE����C0
����~u='��.����[�e��r�5�t[�̩�S�/�Ԟ�8�����w�?
*qn��0�o�p���!�����=)
�s��9&��0�����T?�y�$խ
�E�oĝ�#��\v���^���u��ؾy��]�����N������%���5�0O����5�������a���(�yr)�� �:b�;�j�����:E�(���%zo�U�g -rF�5Xs�vjI�W��a�D
5��]���WA5�v���G�s�ט�^ph��Fn	*)��ɀIE��F-����l�ԏ	[#ٯb:����W�|�O��w���tVm���
�!�s����]I��kW@��*�Jo��ue [...]
+K
2�
+�6n�p�i+�4xP��6\�b[c���H��C����v��1�t�n�,v�~��AwAR;m���ۀ�H|Mg�{�?
�(�D����
X���9X��j|���kQ���%��0S�i7)��V<HU���J`߄"�����#N匇/
��:>�>?1��N�d~%(��C9A����Z��Ī��1AG+ס��������q_t�/ji��~�/ H&6c����7į&����it*,3
h��N�dž���
-i��h��=S'�#����GKGb��8=P�1�<��mq�j�5���P�C7����u��7�u�gz'������F�OL5 6�9� ��
&҂Ɍ��~j
��T��5�ɰ���'�m}7i�O��3Q��Gm�SNw��+�)�bs�$'{�mt�|J�
��s
+Gұ�k�T�V��m��Q9���(�+5���ϔ�o���L�
񁃶R���O�3�'����cH���u��C,X=�i�zI̢BC����ҳ�p��n78�{��t>���o�,���əG,{��kq�+��`�����R�{ݩ`�%|'%�77&�wɃ�޾�
<,�D,\˘��3�dsE�P��m��C��7QѦ|���G�
=X�I��tt^���x��,R��}1𧨱/��&�
+
��B <��;
+���;\g����x]H�I���^�����Q
�~
�����c�!�(�E�,iW9
/�c7��d"�ȶ��{fWr�d�
+h���Ia
u��E�V��1y
�xr�e:#9�]^�����
�3��rG�瓔�	n���}&�R�<����I�߼&��5�WVf!?gʴ5��-��U�����gݗpI��׆;o;$��
�kr�o_����&��8t�����;�}�H�7��|�\k
v��H&1�4��Ʋ�;t�v�a�ٚ22 at J�3Gu�>�\D!(�_��Z䒮�~&x�4�ނ�
�!�t!42H�2Z���'艢�7��8������e
��
���(ݜI� 5��'���[W#�$�z�w##��f��T����VP�,�7�*9E��K�h��gζ4졦��y�y^76h�
|~?�mm�����O�nܼ")�K
��>�6� q�U�_T.�DI�V��������	m{�η�&����
+�f�E�`��O΁Xy���J�y���-I`�g�1o���ė�O�D�A��Ʊ��
+N��5 �7-�����:�־�!nK]�D�.A��R��a��O��>�O(X!o�G��-r8��R���FW�-v!��&�C�h*E�"}�pP%Vϖ��uG<af�GH��y��<�L���?=>��6�j3zw�N�|�{`�'��H[����Z�a���Ac��w�����l�*̻�^4�xŻ��L���\�S��+��[��XL�Ʉ��H�I.�<���җ�0��'���]~~&�8����&�+>

�|�n
�໱��֙U�ɩ?sG/������\�̿5�fe����!f >���K^�zк�a]8h[�F�V��H��7C�1��λ
��[�oF�����
�i�L@�,�
L�u�z��N�)��P@�O.{|ŃX$���(�{X�P��
{� �
2�R�Z�#yXRko�xj
1���� �
0=x.�PT�K����d:�˜��T�n�z�jOf�S=�k.���V�
+Drxb
176�k.�z���jO�쥍��w��w\��<��
p�{�c��O{1 �Y��1+z>�ƿ6���]fC`=lPX;_��:��v�YSd��?L�MG�Y
+$ڨP����1��4u��G���u
��*w���W�R��a�pw�5�����c$3�JQV�j�<V[Dp�

�v���Ќ�s}-s�P:��um�,���w�k�$ya^���(ϒ�;h��H�T�8~0
+s=��
`!i�!�������|��Z���B"��,���u`��}��e2��'
�m��5;k
��NI�ˀ�}�����ϧ���
g�*�1����������h
���
ߙ�!�ړ�c�2�X��^��|݈�o3�rW���u2 /P��gY�V�+	�7�����b�2!+R���q	S���uH���Ω�T�/�@�B_F*^����U�-CG١7�(�|�"�T
���Q<���Lw��R?LB/W��g�<ȏ��hf���~3�)��P��Y�dS$'8n!���td
Ę���w��>�қF�DK!н5L7�qTZ�'���KM������l�dP��3�~aS�MC�S�p�����@�߱�1pZ^99��n��)�l�]��V�D�0�F���?��'hu
�a
�n���o"��p�Zئb

:Ȑ
��ֽ�<�,����*D�}=����t���U�~�����
/O�9�E�)񔚫���_K1������ ך��Y5�DY����p+�N�Htϯ�
&��DZm��n��>�Y��=�ۂy���f{��EX�6�I����b��`��,�ݖG�ܶ��d���F:�z��Hr�*�
m_f�ڥḳ���2#�I�B2�;.�$ȡ���S?�x��,'Ry�ڀ{t�o�߷�~<8��40=e�l
N��OQi�% ������9+�j�j��׷=\���JYpy ;,�*Y[�ǧ�4�1��uO�m"Ȟ���*�@pW�y]��1j%[�;�0Y�*ʝ`�����%�;��
�5EyM�� !�ĥ�Y
�U���
γ�
-�`��ZZ����	yow-�4�^��Y��ܨӲX��V���8Vb���zƣ4+Q啅ZF�K؆����Pv�݋��)�H�w�FObk�_�$<
㩭�>-3 ��V:�
F�+��c�\���A
�&���ſf�yf[��>a@��Y���z�C-�
'�
�Ǫ(hk� �߬�,p_=�g/�
J{�����G��@\~�7�D
2y�Q,#�ʸՀ�l�X�L�
��y<T��gX
б�0�
���
������SV��͡�_�6�er4�lٙ�>J��f�n��F���ܘm��.��J�H��D������9�ԒU��f�'��~s�Sm�e�^��J�F��J�bc?��K�+�T��,-�}�����1J�|j�����
2	�g?��
b*���8�
+�.�v]e@˶e#Vt*���6��b��VĆ��H/��(3!1'�2�r�a���
(-����ۇ�)2�nM�i*��=�m�2?�y��]���
+�
+@`C��i�'bR��H(��_
~����
+�I):lx
��̟.�|��g̼��⏆]<n��Ұ��nOI|��ZA�vǡ�
����}���O]����_L,?g~]����]	�?�X�"Ir5?O��x`��l)�a 环�w,���@��Jv������,L
+zHS*@��"y��cQ���ð-
<���6a띐�u���`����Hf��j�'4���TI�IB��N�N�
�����7_��&(4�����3h{��e�i�^���6%���+�y7M��4^x�I�t��ч
+(���m2�{��w��
T��V�o[[�C9��0���Z��j9
�^Q&��4���HA���$3(
���'3=O�
+>���<Sj'{D�Tj���������$���%*��X�����OA1F���2�<��K���<�
�s
6���Xa��S��l����
�zH_9J�V��F��n�Ov��Pi.��L�ۚ��+��ާ�|�{�����<㼌���
����r4)����A#C�'���;�_w�U
���q����)>S���P�F%q�?&�8^[N��Gn�)3�W*de��Z
+	�fH�A��\���̵鰳7��
�?�"���ޠE�"�{o?���D
}V����0A�!\��Ҧw�TNq�Ix��<k�����D��-��µ�/)��K��J��N	!��o8zi�Ҩ��md�
��IG��]=��5���i���r�{��'�
d� �xy@
��ꊻ���sЄ��%|��lVǓ{%���2
B]����u
�F���.s��*����
wF֦��~��\��;��=��%��fZ���Ƈ�V'�k'T���'��x�'cRp�
�&g�
7$�J�n��g|��d�>�t��%܁�&��F(�����:
��
J
h	_,R��Ԝ<���n�� �ѓ������7|�)o�<i_�ѵbd���?
3I�Jb�~���xƦ{D��Ӵ������r���V���l�<����s$[~�r��7xƦFv��צq�!	������#e�T���*
����Ba����l����|߯,�H��c<��.�y�EN���Q����!?�p�;y9&��:3 NK��oum�XI�a�&E(i@�<Ai��7*����2�){(EdtZs��J��b��l�pd���Ǥ��͎�
͊��6�����Rm���(
�0��E�N��?�w����]���J���+�Ͳ�p�Œi��6���
9M>�vw�����wX�N�֖h
R˘Xhrh�+��Ͳ9�+�ߗ��Z�^H*�]?l7�8�G�����
+����F)�]�I]#3s�Hʦ��3�pc
E1�A�2h2M+�����c6?��(p��ᘮ6W*�q�m���yIa
  �j|�5$��� ����l�"I��V+�D˧\��rR���`j���}q
�2T�m��

�gwSi=
����p��q���>�h
�i� �)�Q��%��e?��e��
xg՚�6|G6��V���RTײh�v��x���|�3�����vჵ�aZ�Z�����[��X
9\��R�ɲ�Jt%��K��8
�'�`���q��5�$��N&��&�U�
�	)��[��(�U��v<!�S�+�����o7����̥S����ȟ]�^�֞Kf������$�
�C:j L��AuPHi��K�GO����4����x�w�j°X�7��
P�� ��o�3��R�_���B&�=���	�����~
��6�
���b��
hӸ0���h�N�'G���AB��o��;5�[��|
��P8S�B�I}$
Ni�pm�8�'7��/�cʜ�!T����r�
�}��ν�K���\{56�P��^��F�s+Տ
��h�h�`�.钉�Ν�K��5��>D���S at vִ�4�U�Rw� .X�Q
>�k��`�J���Ov�7U�R��8��-5����
����,t��9&�
Gp��:'[�n�'��
�(l	Қ^�钯���tb	��+�'��Tph����
�k&��Ô��̒틜�B�ιØ�>)V��nVx
+Ƞ嵨>�RL;��J{�~H��ׂ��Ю�%ޏ[\|ܾ��
�@�o#D�1H�ga03~MQ�ۛUq

'�8�t�ӯ��
�GqN�G�WA.�)Ozx�ښ_�ۨI)��M.�4a!m[�
��k
+S=�[$�-l���
)�O;9�7��
[�[@�����mU
�6&t����r⏻�[�w,�"�昹=�s��M�MQ��
��p���P�W�c
i��#�yv�c鏽�&/�Cݞ\@-�0�%n?VV�K��"չS\P�>�?��>\
������]�-W��B�<9��0gduW�ہ�~ϳ��g"o��Vad�\��r鐇��~�0��������F8v(��O$ ����Q"v1�R]؂���w.9=���|�(p�OJE'mJz��=�<�S�V�Bt�z����{�3�i
���` ��*߶��L��njgS�C�08�X�Ȩ�S��b��k*��IՕ.� �Rs�R�'
�7��(v��R�%3<��^��ȭ�9���9
+��&�N[
׸���9E	�����9T��y�Ew�Py�O�a}/
�C�z
������r"���fQCϜ��2����T��Đ�tB�Z�Fe8q�p
)�Rf��#�n^�ʷ|\��F
[��Դ5��ۜ���'ۜ��vs�lq
8k��^�h���샨��&�z~�%��\
�"x)
+���}��ϴaՏ���it9�%c�W"����f������*i�|�n܀hk�2���Tw~��Q%�8�
�Ԧ�����nD`s�dԉ�2��`���8|[&��S0
+��\
+��:2=�1��T�̭�L���I�
�i�9sń4{',�����'���d��
�5s����N��endstream
+endobj
+1774 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12669 0 R
+/FirstChar 2
+/LastChar 122
+/Widths 12670 0 R
+/BaseFont /HVCCZZ+NimbusRomNo9L-MediItal
+/FontDescriptor 1772 0 R
+>> endobj
+1772 0 obj <<
+/Ascent 688
+/CapHeight 688
+/Descent -209
+/FontName /HVCCZZ+NimbusRomNo9L-MediItal
+/ItalicAngle -15.3
+/StemV 120
+/XHeight 462
+/FontBBox [-200 -324 996 964]
+/Flags 4
+/CharSet (/fi/hyphen/zero/one/two/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
+/FontFile 1773 0 R
+>> endobj
+12670 0 obj
+[556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 500 500 500 0 0 0 0 0 0 0 333 0 0 0 0 0 0 667 667 667 722 667 667 722 778 389 0 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 0 0 0 0 500 0 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389 ]
+endobj
+1090 0 obj <<
+/Length1 1630
+/Length2 7267
+/Length3 532
+/Length 8133      
+/Filter /FlateDecode
+>>
+stream
+x��vuT���6
RJ#9�tw)!���0��03tw+-=*���� ��*
�
���sλ~���}�_�����YϽ�����}��^�¤��#g�)��
<��� -���'B���9zj�A��;@��E
�� à
+�
 I�1�
� �, y��/
���`7�3�������
����]$���}x� 07W���
�<�@ 0���1U�R�+k�AP���k� AP�� � - @�
��5�
�
`
@����0�������`�� F 
�P��=��P ���wwv؟���;�;�L��@ �`7�]V
����p������0�;O{��wK�;�;��
E <@>
�sف �`����.�
�
��
O���
+�p��-�
B �h�����m�� ��a��Y��8��
��z��vC��~�*����n����
��A�g��[{�
�9��i�<�R��g*���D�H��?"��Nܿk�����<��Z�Ѳu���.��-h ~�3[8��]��	���l]���wGc�_����aUۻM��:�	�# �����P���u�
@'��-�n���
�� 8
�i�g[�����8��.��"�����/�N�?��j�)hp�������$x��� ���Xf���o�g�`> 
Q ���@LL . �o2����Z��������
 �����ke�7E(f�{r�=l��w��O�o�	��i����5������|@@��30�T�sfN�Gի�!�6̞H���7�!���̘e�r���H����F��m����8���(!l�/A{t��
�$
�(1��0>�b��
���)�%,3Q~���!]=��
��
o��#�٫0���q0�C"E�Z4Ҫ��;�����غ�{{�[�ۿ�r!�Hya�Ƈ�#ie�
��c��0��_����%u�S�L��
͜*��u548
jF䪋a����+�:�s�@�P�
�U�u�����9��Cľsɮ��j*��ē�
����:Ku�W�q�3�c�G7j-�2�zM�45䚊V]�sDltE�(,�cy���4�֍���,�ש'�:�i��c��!~��h�[�I
)n$
�hqK��
F�3��g��53�=���*���k
WT�0{Sپ�:J�Ws�:��̧��Rl\�Sx,�*���Yְϕ�� _M��L�m�=a�"
!�qRS�OJ� \� ��Ve���ׁ^j1�6���WH��.s�YVpf�1��7����
׾D��Ϭ�4]����g�͐q�Re˿��8��
+2�F��~=.]��\��9�E ��Y;.�5>�<q���
٨�.��R�e܅�R�� nc���t��vnxl$�X�f"G>N�c���͚Q����
\{a�Z�o51cH\��7Vp��9�i�4y #��GƄa���f�u���O�ý�n	 �7_�������U䟐A��ͦy��J3��ێ��f$CΓҋ&)�%��F��IQ���hO�9߇�z�$]LWes�j}I"��j�� �޴�}��-V���!(&Y
�����E�y��E�L�m
+�i�ͨ�ZR���0���c�]��w�UT����
E�EB�J�4�')��I�jhV��E��
+�*+���?lLYFW��
1O����5�
~�l�R�}�NyƸ�Db$+g>KT����!��K���$x	W�6+<�,Q�Wg�5v��"B�n�F�{ѝ9��(��ݧ�(����{������n(�̹/o�m�Ho}����
 ��S�Y����M��&_7
��r�0
v{ı��)6�&Ž�$�#�A�ԉ��r-$��j�:�,U���v-�
g��_���*�ك�����9Tn_b*��c�.�~��s�A�
i07���2!�h,
+��XE��������mY'>��=��B4��	�<�B���Ao�'.̧���׾��F�iҺY�vq���3����oL��)����x�%Y{<�7&Fd�����7�
��S�[�h
<�2	�wI1��X
+׊.B���d,�뎞
�ؚՊ��=����>�|���[
=��+	^�fpo�Y-��e�l��w�2�\��r��񰴻���d���ա��O�N�5Ռ����#.
���Jd�\�.§?wB|�7!"rM��i�b����"\�$"�gAf'R
FӔ?9��X�����z�2X�#,�;F>�f�K�7^�&#
�oʒ�U�kH+���L{��4 *\�gӫt�LY�b[�����2���P'�����od�=�A��
qz�K�J�?�In��ή��4b���G�y��"��(+�[b��­��m'
�'�e�'���z��e
�ZӞCo
�Y�'N$��jq��࿚�Q(UnZ
�C�k��m����25E������_1�x��?�WFI�Ӂ
R�N�H��8}sO{�GmrX��\��Eg;
�'��]�0����
h�����D�d���(�^�WX��
+�I��8�|�i
�p��u���"�+�D6z)p<)��>�Z�xw�L<?�e�2��
Y��YSA2���S��gõK�V���!]5Y
�9s,M �ӄ��C���ۤu�Q7hd{[ֶ��͢!���j'Ci�eMm�2֖1Xj/"�C����8�s��� #"on��IN�/�y�g$�� 	o���(�>
V<�n^�l�b�(R�|y]-r�S��:3��!��0�n�R�<��L-\[�ڸ�2�zf�q
W�v���&ʓ(C�s_���L�Ҹ��&�_��ȸ3ժ�G�}s���~�z��Wo�q�����7��ߵ'�.�go���
ܧ�`��;ia+�� ��}%��m��󔳒�|4,�2��
�6�
��ۿZ�y��/(�ƿ7r�t�/���0�^��r�(vI��냀�g�
+0e��)gq��^��[�|A%
̷��n���*�I��{���f�И
����X:���؇'�폘R����}����&�����Bqx
����'7�i(H��
�'��EA����l�;
+�]��O�NPj^��C���/��;B�<�_��-�0�	q.C ы/αc��ʨ���VX?�HY�v0�Ē�@]��k����"��<���MK�\6$,Z~|a�7���lF�zC�V��M͉��q�TF
k����,G�^kڹ�8�
ʚ
ר�����%,k(νwm�Ğ�)����%��%�hsI�j��Ÿ'� �݊����vS���뭙+�ך
SiL�a��L�}Y��S�=�$�}���D�E�F*������R����l�>��*�ÿ��d-Г���~��8��J��!JvlK���3яjJ�5'�vW9�
jR��>�V ������\5\
N��4^a�z�NFd�#Џ;�)X���	�8

��5��R�	� &�̷�SX�U�%G�u��@L��#�����l����ч
�tɟ���ք/��������?���k�o	_�
=e�l��ߡ�zG�Yȉyӥa���kbi.��
Ř����1^�&�I1��dž LR��ӂ)Z�GѡR��o�>b�G2��D
ŋ�{��+E�
5#d3˜�l�l|xC"����{��ӆK+6D�%����[�������.{l��搩
�W�h���
�Q�w��[W>�Jǵ�Q0�l�K�T�2�R
=� 
����7#S8`����^�
��	$P���Ꮃ4�9,��W����Rk-k <��i\
�Ҭ�€���{-�0z�����>�0�sxC����I�\��h�%��(�,���b�v�o��>ѯZ�;�)�6Oj����bƵ
� ����D�l숈��+�>%�Wj^
���V/^O;�Jf|uGz�4O�n:|)�݈x���l������X���{�R��
��wĥI���d�
�{9�Zn���,��C-TU(��Q��d)��{�����R��l 
Gln�g�R]�F�"��"1�=�_�<e�攔��\p����=S ���+Y�-u�S�����c�k�92����O�M#��
�u�,d��T^)7&7����tq=5j�T��Le@)AO���۫
+���Fɇ%��Qľt�8�le/p�����t�Wm����Sm�a	���C𮄅�R�!�.����9<��S�cب(��Ee�و�Dqs�q�st��,�&7R2Ac
+'�����K][����蛗i�u
8Yɸ3��}���<�33
��b�
h��ik]�2�y��WT���qz� �aü)F��t"�R��/[+��5�������f��X
D���XDb5+ɝ!tU��z��m͕�ɃC����&�
V���卑oL]�JE�e~'?{�E�dd[m���#
���T�(0I���FT�\�\�R E�Rju��+n�m�.l?[�n�-��jC n8������F�cve�Y���_x�?x�����|X�} ����͚kյ
���,�n����|X�Y�Y�2m
O�FG�?;8�82F��:������sCEP���*Z���<�cr;qh
T7�zd&�ldX_ �j�ih��IuA`��ѝ5&�τ���g�2e?&,
Vmm�r֛Qb>���U�;�@��"s���)^VW/۱�l$���E!>79N
Q�ᛢ$���o�q�,��
+�c&+�]F�odE�
+����s���:p"t&~.���z�����1�9�F�
�u0���=���j�B[�Ѕ�n,/�ޛ��\q{*E�ﱇ:��Ju����!�^|~f>�OC�9��16RL�Bܟ�rᄸ�#��4XIn��b���y2�#3��졶+�Y����8�I��e�RH��@�+�_Ni��[�t�X����&��L	�I~až�^��9-kq�%��T{ƃ��	�%��U"���E;>��v)<|9�ލ�,L���Ɉ{
�ЌqsN6׬��yc?��`��}�׮�b��_h
+%d��M��c��B���� �}���^�E�o%������⫥��O�
+��T�����
���8����]�R+)���
�A�CB _i7�P�0ήi~Q�@I������lz���Z��D�������`J�S�ۆnT�-�l������J|��iL�l�cŋ
�.#�)�ꔕ6B�_%L�
+>h���� wE��GlV+&�
+�.��x�O�~��M��U4I
D�Dw:[ ��\j��`��u֓��9���~�a������
3�
�7���q���q���
���,�Noږ��]�\<���=��4�n'��|�)�uBsQ�+�|�(i
�Щ�
+��w�����1�m����{�����\r�P�fCg|��ڝ�.�9'<
x�8h��N{L ��JEM���ȹx�./��OԤ?k=TT:��@3M���UPJ�ը��-�z.����u�[$�!�c��<�h�
4���
G����ǵI���2=|
�� �
�g�%�����(uR_U����7<m$2A���ס�"��F��
��G��?�3S�
+����5�,�98��m�:M��ޟ9U~ͮCRS 5���j��j����u*���y�>�d
+
��t���ZZ��}Ȉ�)�*��2^�|�xl�:����#Z����U
�i�`l�
��
������PV6Moe�&��%��I?
��U�W#jƗ (R� �!k��\�
1�2�A:�Dz�ƶk�-����
%	�I��"
�I�7wIr���qh�?�&b���tShO��l�Ю��Q	sD?��esԅ
U�L�ѷ�Eq��L!�F��Yh���d%���z1j]�HK
+~W0�#��F�ы矼i�
����
+@��C�����C:�b_�P��<�@٬���,�ёMԤ�U_�!�L�x��n�r���C7��U(��d��Ttb�GG
���P�K0�
�;��D'8\�7<5f"*u|�-�~+���߻!eDM��
��j��)=��S�rEXS]��sl��o�)$���8�D
Ct��$b��c���ŰS���6Q������q*����5W���3Yu�"̜��Ѥ��3ϫ�H^:�_�UM]�b,���v
��/�^6}
�@�vI-}�`q:C��r�,�"�7Ib(��]2J�3�\t@����A"�"�Bb��
��a�e��ʗ[t�!�[�~�>�Q���-�N�^�x���$-�U�-�C�D��
��J��|���x�FBJ�
_\&�nC
y�l">Sgqz	t~�oZ�<�!�E<ۦ���H��(�?��\��~��w�c�H���fd:��I��V��������Hjɦ�lu�ӡ��W�!�o
¿�}4�bN�ο�
�|�Ғ���J5��H��
��V�VyeGgJ�I�����4iP[�l�?���l��tt%��(��W<!�#J�-=9!�ю�3����g��HU���M�Y�Kc$J
�qR��+]���P��„{�~�,B�
]�1���q�E��#��6� [...]
+��*���'��6�}h9�{*����6�x��tK��$����&;Y�����z��50�gv�غ����4��z�v
�k/�|}�r�v��+��V4�b���~@��b�ka��
R�^X��qU�� �ea��ճJ��.�ǁ�5fڂ��.�}��{?
�:�6�4N�M���97�qߔ����\��b	��|��yi?�.�
��}�T7I���i���ĝ"u:�-�S g�_α�$�~�ـ
� ���
���/��$��	C����+i���7�<�͹@We��ɧ��4L�Yڲm:|v������S��#p��Ɵ��z6���8����ι�WA���R9��c�
gOYB�
��e<��y��R�҈��b�H
�����c�l}-a*�X����h,��bm>V]��o�'����~E����h����R^�3��epenf�$�rΡ;�=s�`.y~���Y��K�u���sU���&�1��&
e����Ds��'�_'k܈_I��m.�Jyʌ�&<�@��{DA���+p>&�Z;�C8�JkR�c���o�#R��Z�m�!pI݃p��䲵�fF�Ҋ���.s��ÍH�I̵e��>� ���-�@O�2X�%Y�ԋ�І"�_�h�����|e?�a+r�{ �W���}�·�0}���᪉8&��.��yU��/rpyn�9@�
��q��Ǿ�3w��" �����͏����5M��ϳ�+ϣ
���Uu�:`��\ [...]
I=YT��q��{�4B�S�lo
Þ�_+���ߜ�
B�����J}v����WП��";m�c-�ї<�)�[��J�D
+�:[�I���&�ikݧ�Ջ�_�(s�3�V�
�*1xc
)ԗq��F�y��X�<�;M�9����
��O
������?���3,6�j<�T`�;
�?�@�Td]��iX�*��K��3�*��D����V�m��a��fQ�� ��s���-W�no.�l�k̽����Q2_���g�ӈ��A1ݻe
RgcQO�7�|
�E-.鲉�i��Ĉ@e��|��0��}�zu��T������*��7$
Z����H���bV S[\/�&>ೖ�(4�/#:(l6;��/0��>�~�{AAjoPm�3:�ؗP)���Ho����;=��
ֱSr�^c�'s�+}��#::�$v�-�
X"iu�
Ə-���ީ��<�D�"΢��M�����6T�'�������O ! [����� ����endstream
+endobj
+1091 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12669 0 R
+/FirstChar 39
+/LastChar 121
+/Widths 12671 0 R
+/BaseFont /YNJETL+NimbusMonL-ReguObli
+/FontDescriptor 1089 0 R
+>> endobj
+1089 0 obj <<
+/Ascent 625
+/CapHeight 557
+/Descent -147
+/FontName /YNJETL+NimbusMonL-ReguObli
+/ItalicAngle -12
+/StemV 43
+/XHeight 426
+/FontBBox [-61 -237 774 811]
+/Flags 4
+/CharSet (/quoteright/period/a/b/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/y)
+/FontFile 1090 0 R
+>> endobj
+12671 0 obj
+[600 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 0 600 600 600 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 600 600 0 600 ]
+endobj
+859 0 obj <<
+/Length1 808
+/Length2 1232
+/Length3 532
+/Length 1816      
+/Filter /FlateDecode
+>>
+stream
+x��RkXg�D"ZP�\v�*`B�
+>r
�V�=B���d#�LL&��&X���AADn�� "Z�-�l���
X�ۂ"�rgԧO���}:�g�9�y�{�9���~f�<,
r�P܌F�����d
�T"�RI��
!��a
u��-���X1,���v�-� %��0
$D���hH
$��Q�¤�C90)�
T�GPV:R!

���
�2�5p���0�������\�0.
�R
+pD��!���x�x0aP8��̗�qG��~��oK�!��Xl}�"
�0�R�$sO��j���%w#�''j�~����(��A���w��kqN��w���\G4
��͒B�N]�E.��y�87�9�Z�C(�]!��+2�=�^L/�7w�R���(�/@��;z%��

	a	�R�	 ��
+}g�b<
t+�
+9R�����A

�(� HB(6��N� �qdB���,��`9Gz	''LCft����Xө�?��b�B�;!�x�a�<�@\R_�ݑ�W^}�$�y��T�І�L�.�#C��l�m=m�
�
 ��Ě�l�l��mhܩD�0�0y3�8x+���)���0'������z~7�����M(�7 �x����Ȳ#�6���n
e���v�Ž%���!����S���E��)D6Jz�uz�m�U�Ҍ��tN�c߶�=���Z=�j�Ӯ_�ҫ-��%��
�ÊZŔ�'�⺏y�sf��n��Tcł:�B��v�>�*�4+y��Ƀ�D�{4~1q�F>
�
+��`�u�ɱK!����޶�z���o�&9{�U�T��yҢ:c�q��a�����/�I�HS����3g��N���Q������=R�EY�ˈ��}t^��CT�Hx)��1d�>[���5�\�sF�[�i����z�\a�l0s*��筈Ԣ���j�َ���<_�d��L�<{RT	S�Q5o�ˏ�E��'?'�[�d���Y��9?
�+� �h��5��!���A%EG�
�q�}D�*�3��}�
��o�4K��'�hz�9�݈J�
Uu�����>7Κ+������p�_���v���1���l��Ά>G��>�KI��Gw>�������?"^�@�Ǔ�d�Ϋ��"Ѣ�
��_�k'�fj���T�/र_	�sU�!�/
����x��� �7;,�ڒخ���2�-;c �U�lZC��u^���l$k�=�aʱ�/�g��Z赵��e�҉��Χ�:=[=BE	Ы|��vM��қ�L�mQ�ݛ\=ZsjX�ӹiLmK��vd�'�]�[��6�m�u�VH�vt

6A��<i^8gҘ"[_��]U����-$���6]�y�{iE�_��i��)��2���}>f��6Wu���
�Ԋm��f
's����\]搮���Vvm,T1w�?b7��i�_���g��{������څkX�O���ؒ2��M[ͽT{3G�������ň��kO�F��]s[Z��ޚbj�U
@J�M�3x��F��
c�]�
u�.�^���J�9n�?c�q�R��q-�U�g:Y���PK���+n[��e�WȽ�&�n���nF��\��kg}Rq���;�u)��J�>
,_UG��Լ��<��%جo��/V/
��w�� Y�!
+��_s��6
7`�Q��Z��eИ<Ɨv$i(��Nߴ�¹�����ջ���~bqCLOM��mW
+�u���OTC2�Qu����B���Q�϶]��e��{0$���Ӵ\�M?و���F�cK�&��W�9��jX
m��_'OQ�ˇ�'���8B
��#I�����endstream
+endobj
+860 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12672 0 R
+/FirstChar 112
+/LastChar 112
+/Widths 12673 0 R
+/BaseFont /NCIOEO+CMMIB7
+/FontDescriptor 858 0 R
+>> endobj
+858 0 obj <<
+/Ascent 694
+/CapHeight 686
+/Descent -194
+/FontName /NCIOEO+CMMIB7
+/ItalicAngle -14.035
+/StemV 63
+/XHeight 444
+/FontBBox [0 -250 1294 750]
+/Flags 4
+/CharSet (/p)
+/FontFile 859 0 R
+>> endobj
+12673 0 obj
+[687 ]
+endobj
+12672 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 112/p 113/.notdef]
+>> endobj
+663 0 obj <<
+/Length1 788
+/Length2 771
+/Length3 532
+/Length 1337      
+/Filter /FlateDecode
+>>
+stream
+x��kPW��7%�H� ��
�$Y �`-"
+�r7"�,ٓdq�6L�X[.(�ZQ+��(�E.��P�j*-��x�� x�.P�)�lu���~����<��u�
�p�è@���E|�H�j@�|���?
Q�H	�@��D��* " |��;�xq
�?��ӸB� ��c&!�SA��$A%T�2� �
���
����Ѐp��t2ĸ
.c@T�$�7H�) �hcZ���
i

\X���E�(��
�9�{dI�
���Z�X����dž��pB���R��
�A�A��j]'�B �kUS�@%p��  pC<�|���kp
�BqF�r����>$��(���Ax�VED��N����$�WC�c
��75;#ׁ5|.���FvM��M9k	)�0�T w�@i�s�l��@ R����c�y\�b�-��L*�S4g�R����I�f�;���<5���
��1Z��08	(gƕ��X,�t)�pyzē
��Կ�dZ��$3�K�c���l0�Pe��6J�0=qgy桍K�].}�g�����sz��b�n
K���*��{E��|[g���GA��y��Ӗ�+���;�ș���M�nG��>-{��W�{�uIѻ~ȸ=ק���ϲ��s���F��8f���mFf
·-��v
��e0�B��w��\[ô�5�7�����7Z^D
�V�
1}�n7
p�r=%���\u\�Ufm�^�"��zAg�:G
+ݒT��n#^byR��5X���c���3��4�]x<�'1e�ӑ��,�Q�w]w��f5l��}�'�73
l�8������M����I����w���.
]{x�W|���^C��d���&uOO�a:<d��������3]gfk����u�@�A�k��R�����-��>��5��ȏh�T�=ZĞ$�[��R��f
9)���.2�9�Oޱ�=� }�l��)-�����g������k;_'�'H�gm
L
��y�_.�SZ��Ux'���6UjK���ަ�'�K���u�U��o��].��t6kj��q�z��ަ�
�x��9ˋV�ñ���v��+����]/k�rN�vk��Ү�
�e�a���n��l�
~fֵ���_�Zn���y�풧ŧں��7��Ȗ��J_i�[T�f�
;�d.]$�nSH�m�,;h�`�o�
�[�W`g���f�����w�*�#�erVU����

�¤�^b�Y�f'���w�������,�n 
��𝸁�Gu�y��i˜�.�
7�Zn
mPQ�ӿ�c�𭪒��n�6�v�^��6�����>s��
FDŽ�q#+��wo��������?�? # J3�
+��q��W��endstream
+endobj
+664 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12674 0 R
+/FirstChar 0
+/LastChar 96
+/Widths 12675 0 R
+/BaseFont /HWVFUC+CMSY5
+/FontDescriptor 662 0 R
+>> endobj
+662 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /HWVFUC+CMSY5
+/ItalicAngle -14.035
+/StemV 101
+/XHeight 431
+/FontBBox [21 -944 1448 791]
+/Flags 4
+/CharSet (/minus/prime/turnstileleft)
+/FontFile 663 0 R
+>> endobj
+12675 0 obj
+[1083 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 441 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 875 ]
+endobj
+12674 0 obj <<
+/Type /Encoding
+/Differences [ 0 /minus 1/.notdef 48/prime 49/.notdef 96/turnstileleft 97/.notdef]
+>> endobj
+660 0 obj <<
+/Length1 832
+/Length2 1188
+/Length3 532
+/Length 1784      
+/Filter /FlateDecode
+>>
+stream
+x��}<T�
���U;w�U��nI�����xN�a^��P��1sf�:f8s��,��B�������TD䩔�%j�E�ZE��"tn������q�_�u�����~?������jm�q�@�+�4&�ix�

�L�L����HĎ[���)�C �
0,�,+�D<���@	
+�G
+�a
X��İ * 
N0�!|H<���	.B�������Np
$!
+
�@�A�����

sR�Ka,
�IL& |
�"DL2��l�X(�
n�,�S(
Ƥ�p@�V�
+$bTA4.$�I�Z0�����p�
Eݠ`����š`U,(�d(�-�Z��D�8��P���P0\����a�6�!�J�y?,,.M�k�����Nggwÿ����6�^��`���6�6�
���
:��$����䷨���/ b0a��a��� P&,�dD,�� �
���H!2� ��0��52M�1q���9��˄
�	�$
�t���B����^"�� 43�)�1e&�az�_t|��b|����d
b�0,������uܾ����h��{e�*���4�K
]u�}���~�%ԠO�=U�K!�}>�!M�����
�	M�~0;0�Q���&��
�~;����,��}m�'|�o�j-ܦ��5���֒��a�������\tG�a�����Zvh����p�Ǘ�ލ�ޗ����גZ�ꩢ�{ީ���׮K���l�6+	�
�G�-� ��>�
+����H�!�G����et޴�
cT۽���\�_�7g2
���^!��,3o;�
+����

�RK�oyʻ"��}�f`�G[_N��nS�Nj;��g-�3���G�[�v߿� u��O�
\�T�%����_7��	+-Ǣ�)�Z�G=�����������c���*���:1ae�C{/Ұ�d4��MFٝ痔�}���׆��Re�	�)%L/ن�9:R~i���z
+{dS������N��������^YՅ7��8�|�����vU&}�]�y

1^B/���~ެ06S
�q��4m����pȄ�4J{���
���x�2��Zj�����ԉ�/��Jߣ�	�B����.�:Sw�"������P>:X�����,����Q�j#�����7%~�i�2����+�V�QBÎ~�{�������h�@��t����%����(Į��m
�W��\����]^{��2��=��fnEZ�݁�'I5���&�y���-�W[�E9E�L�xOY���

����:�N��*L��\ѵ����w�]]�;������ܻs�*yY������g��cPϽ!;�
��P�0�����d���M,��΋�Ы��x
Ǚt������q<�NK|��o����z�tN��g�տlUVE���F�.'�9�6Lg%���+������)uxgE�
�/�:�t;���)I
�^ډ���
�ޕ1�m�Ds&n�Wn4��}b���îo�}
*3.�
i�Talx��e��x,��1��d
+u�C�.��''�ZJbu��l.s0�W����3Q�O�$9;��5��

q���+�.�/�:�sw&?W��Xr!rx2��O�Z����
j�8���
�yWэ�
-�
+���MS�~Xꪛ�u<
�m�|�k��mkt�`ڏ~��j�{�":���G�F�'�0���8�ܼ�]
<۠ۻ�]�JàǓ{�gU�_�L<`���<�x��j򎊉��u�ʙXk��:���b߉����[��}�Nn��c������	 �!
�C�~�� XOȕendstream
+endobj
+661 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12676 0 R
+/FirstChar 13
+/LastChar 26
+/Widths 12677 0 R
+/BaseFont /BLVHHO+MSAM10
+/FontDescriptor 659 0 R
+>> endobj
+659 0 obj <<
+/Ascent 692
+/CapHeight 550
+/Descent 0
+/FontName /BLVHHO+MSAM10
+/ItalicAngle 0
+/StemV 40
+/XHeight 431
+/FontBBox [8 -463 1331 1003]
+/Flags 4
+/CharSet (/forces/arrowtailright)
+/FontFile 660 0 R
+>> endobj
+12677 0 obj
+[722 0 0 0 0 0 0 0 0 0 0 0 0 1111 ]
+endobj
+12676 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 13/forces 14/.notdef 26/arrowtailright 27/.notdef]
+>> endobj
+601 0 obj <<
+/Length1 789
+/Length2 1882
+/Length3 532
+/Length 2458      
+/Filter /FlateDecode
+>>
+stream
+x��Rk<T�εL���!�u.
�J#D���r3
Ssa��]�.��P.*MQ[�F��R�)NSm)B"Lg����?�����Z_���>��}��.�>��Ga���L�e������@rD"!0�vHbS�
g�Pvv6 � � k�F٣$$`;3*�E��d��&�$[ GYT2��I�H�.� �h�/�L�q� �F|�o� >`
�:R,!(@���@Ae@˖��L��[�‰��:�b$� ��M@b��d�� 
+A��i����֏�
�@�/�/��6�N������Gq� 
�3) ��#u��
�P9���l�J�1"h `���DZ�Sc\�� �He�#�p-\��
ʏN$��@��&z�%�}[�J�H�2�~qQ �����QbID,j,�i�D�$D�����,�I�2" 4� �X�8R"��`�#(�ʠ�� +1��d0ْ+�$�x �ɂ,o�
 ��K+H�Q A���?!J�e���~��3���-`��H�[Y��d����

d�W�(Ih�q8U�3Ƃd�@/�����<ቊ��'W埥,F��/^�]����U��j��AWc��Ie(�`�~j
nO�`$���-�P؜g��4�$?abxp��
���'ߛ쇟��rV�)�mH,�x��s63O�p�嚏Vs�<�=a|EY��*�0�������ͻ�ꂹ�
ȗ9�F������ؼч�grI�4
��f��
<c�[
�f#�)ӹ
G����׎���j�?ȪՍ�*���z�ŠL!���Q)�Bվ
۪�T�
�-*JoT�Gk�;
��8�p7s��M���<��N|�ou�Y�_�L^+�Bňz(*j��Šd��7WN
J-黽�t
X�h6w���)c'=�
-T�Gk
^���i(dp[V�W�U�=n�5ڢd5���߮	{�s��~�.�j�ڪc
�l�ba
ǰ���Ǯ��֠C�����L�Xwc����{� \Z���y�G�r��f��-m�
�#:��S��郙�قQ=G��'�Y-1�M[�H������D�y��z_�R�(�F�{�EY3q�!c�1�}|��umԀ=��]�
V�8��Z�y����Er�j�Z^)AX3�Q�������ZmǠ�m�*N�z<�.����J6������5��J=�{�Oy҅(��;
f�kB_�Y�`t�6cFo����[�`w�j{_�"'Z��IK� ��bS���V-��Ӽ�u����.�Z��S����g�t0�3�0��
*�������
��M�t�����%{�`��?I*,��d��Iʱf !��ۏ�#��V��Äo#�ݥ�5&
��ze峼�T�Y��*�lrH��9o��w
���AC��i�y3h�t9�g�L�QU�[�?�R/��XjS�=;�oڼ�u�l��:���ӭY�XE Y�65�XIt�Ef���dr���.�����HV�R��	�X3�|�O\i���@ᇙ�&~p�8G��nP�i��א��.�g$g_LF�3�=x���qeqĮ偸{v��a](�6,p
����S�l͹�� ]��kF��j��&��^9���nC^:+|-(���>3y̶c����0<��Ԕ��)naLF|��Y]�gl[��
�	�˭N����Щ��;�vR���bOK�z?U�\wP�_�[�-�q�f��#3��u����x��p+q2,�^uHf�{#�nS~�AA��ܧC`�B����Đ���ۻ����t�C{>\��5�z�S�QT���Y/��I��u]��z�1�
��,���\����ܔ�K)�
+��N���E~�nN��׮�͇~Q��Q��QR�a=��姚
W����ձjHL�tZ��ܹ��
[
��G���kb�#�S����p �V�=�[{��B��j�d��
�QԺbX�{���[.uD�/�R;uxH�p9%�$s��L�����?�s
���F� �C����U�����R������+!?U�/
+aOXM/T����ȶ�����S(�
y�KpL\s�3_���q��������
+]-'U�p#�n��D��=���p��a��ڊ�l�$� - at WvNc�i�Rc>D4U���]�n?�����ӿ��z��A��8���
�6|�,_+�p�ms�������'�k�
+^�����9�����y
�i��.��"=
�۝ue��j��
'�s�>��)b�~��|r�}�.�xlhY��v���yC��}6}D�
����W��h,�s"´[�I1�����m,u=_���Ih�w�1D�Y�0K;a~�7~[�V`K��s�b��ڔ`�j^}�����E�K�����)ώCc+:��0Fo��1s���ٷ�T�j
��Lߐ����%�s5�.Ֆ�
��f�E�
�b�[e��>�ŦSf/�ό�:X�j{=�@�
�%]���o��I��vs��_I�*UOh^T��x�2��#�����'�4��b3�$��? ��endstream
+endobj
+602 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12678 0 R
+/FirstChar 68
+/LastChar 110
+/Widths 12679 0 R
+/BaseFont /WQPOZN+CMMI5
+/FontDescriptor 600 0 R
+>> endobj
+600 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /WQPOZN+CMMI5
+/ItalicAngle -14.04
+/StemV 90
+/XHeight 431
+/FontBBox [37 -250 1349 750]
+/Flags 4
+/CharSet (/D/d/i/n)
+/FontFile 601 0 R
+>> endobj
+12679 0 obj
+[1110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 740 0 0 0 0 534 0 0 0 0 881 ]
+endobj
+12678 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 68/D 69/.notdef 100/d 101/.notdef 105/i 106/.notdef 110/n 111/.notdef]
+>> endobj
+582 0 obj <<
+/Length1 1440
+/Length2 5130
+/Length3 532
+/Length 5924      
+/Filter /FlateDecode
+>>
+stream
+x��WX�ݶ�E�tPP0�&%)*�{� R�@ ��@)J�tC�
R�IQ�MQ��o-�u��G���I��
�Ϙ�{nv=C!0���Bb���@Y�]me3�( (,*J��}�b����J�X�, (##�p���b at Y11Y	irn�]���+��
���3I
+������m� m[�#qZ��0D�� XOa�
0��0�` �8X�
�a�X�
��$�)I
	E������ ��SQ ��*���($� �@�EtP�� �R������
�c��Y��O��m0��?(���
+�F�!�ȿSM!��
��Su�-
f��t�C ��
+�0*0X��w@m�ȯ8	�[ĩs�$��+虚�
+�3�_P���y������_k����?�0��詿���������2�
�!
 b�7 �����䧷�t%	x ��`� �q�XD�žn���
��\�NT �b�
+A�!P�
��'���5��@ b�jk�{��?��� �^�O�/?�Cn�i�xv����g������
��'�>���;.s��p���.g�Rg{����
�ӕ����s `���c�A��!��OL���Δ��c|g�Y�����3@�T(�
���:�KIK�!`�n���6�Dܐ� ������ʆ�
~>��H���k�g��C�����STDy<� �ɜZ
��� HI�y��i��zz`쯗�����
+;���&C���GQ�7�⫃�|�����5�:��_R���!�g�h�&���
�.R//^s?��	k���S��
�0r���YL�_w�l#I�s��c������֪$����7yO@��S�w�d��)-�~b?�b��lI�!e��7,�g7�M@�HO��>�%���q
+&����jt��Ǔ��
[n��t�4U
r��NJf�i'IQ\@�'�^�m��6!�lW&rb}7�@AG�S]��w�B�G�W�
Vz�^��~�#�@�(ksF�,��Qy/���U��O�<��"Yz�/_�ĺh�xe Gӻ �5:ZdK������[2Z�:�U��P"
��&�E7��.X@��y���r�Rh�/a'1����)��BUI6��iO�<�u��c6';��Bm��-N��ev�+Q@?��$��R���8���V+g���3���kz
+���4u:b��o��M<0ܢ�$`��4�ʫ��L��E�M�s̵�*�H��
l!�J���z_��kjj�W�
�"��nW�]��P(I���Kk�?NP��?l7�k\<���P�1ᾳ}���a{V���s�@�����B
+��'=.�4�{�
rGӜ�$�k�ژ����6;�|�Ӿo���
�� �ƁB�z|boW�=n���0���ӐȃV��v󵵾�������Z�My�Z
+axMk*��k:Si�����ޏ��}�)�U���-¼�P�d��k��1iI�=���E�l� �j,���f��b�y>rm�OB,��
���D�Q�\�ϒ�ۦQ�=�b ED��[<�	�.��{�r
)������/���;�7UV�|.���1Q,ƛT�^�y�0��[Ye�O�1�����O�
+�7�
�OuT��`��^%i����n��n����Ծ�DƄ�fE���!bqG4E�`���>�ʍ~����ؔ
���5���4e�������f�{_U}-鏏����f�Z����
�"m��*�	��i|
rs�S�θ�k�
h�̈́9Օ��TK$Φ�r��ݒs�~jVG��z�t�w���w�*��
mM��rʎ���%
Ģ����u� �$a�ŊX�Ը��Ww�r�����`���9:���3���*�w���OF�VU��*_�db�f��iβ�a>V5���,-�P�n�׃��W�<��Z:}p��T����N����bX�Pa!s}(���Q<&�����d.p9\m}�辡�W��f��=��b�rvsGC����@�se�O�]{�\z�>-�e{�{�戎K���Oŧ���
.-r��*����Y�{�@�b~=��%+_�1a��m�P	y]	0F�&#-sjz�H]˫rձ�J�:t����%��)eh:й�E��J�����F�����d�I��C!\��xgT9���#`����.5�
�Rn�h��܁O�c���R#]�u��ҟiA$t�BF�Ne��V���=�J��%�r�
�D\���v)
&]�q�%��5��v2������
+U��/�8�no��9y�x�\''`|
r�^��nZ2�=��=�uv8:��A��LB\h��O��8�K�l�m�0ֻ�"0�sۮv�1M
]��/�����A&V����u�>U�
����h�S�xG+���|����[>_����r�Ou�w�Xrp� �5_M-�r]��/�o4�A.�!q� ����vfw���
	7
A��Ђ`V��c��!u��.	*CK�	B9�֭��KY"=�kzU`�f�D�w�Xo�4O˻��3�u7���L�^�U� 
�xH ����f��
���
r�ZnxX_0q����
!�a��k	����Rie
��s�Tbv�QW7�2�^�܌��E���l"��e�	ʒ~�Z�Z���·���4�5+9(�:��2�kJ��\8~8uCr;6�Cj�g�5Y�!�*��������
�k�U&��}G����r/�gZ�s(3��+`>z�+�����]e;�#�
`p|�S��y�@<l=jg�t�70
g壾X�l��)_硱�a��
�D���9a�I�8n�o^	֪��ũ>Q��-�{Uմ�cĞ�-q��L����o���g��
�F/�Gn%�
jܡ��#���y+}b����+bFԳ��7dft!���Ңx�bN���6��У%C����
|��
�2�V��&T�L�E�c�f:/Q�%R��;�ev!��:E��u�"�����4�o�>/2� [...]
+ei
*:�7�U|ʍ���?�_�<Y� �H
"%��ʙ>�
<�Rt�{��ﳪ�s{R9j
}xL)e"L�"$�����7]'��J��齷���
+#32o-�;[pwnϺr .���#�d ����
KW70
�T>X���dp�6
������޹�LLn,�oϽ����(|�z>)��j��*
p��=n�
�)�ֺ��Z\�E	7?6��N�;�]6V��)����B�xU'
(k�Ea���%�j
��ڝp��x�R31�K�c��#B����-��
x>H8a 3�|�r��
��u;�Nj���x|?�<
��I�q:L�ū�fo�q���
��5
�x
\�f�<2�B�պ�
+�w5�
�=X
+�����!-�>o��D��(�d���[s�5=5�����}�����y)N��eA
���jyF౻���)��a
�t��
B�W��
�q����f�y��u��=y����:�<�:>�D�fOD�#5قh��ݝx����ֈ>���&�"&��} �
qEg�+<�9&�x2�-S���+�xb��
�&��˫�
�qszm��):�3��N����4!��D��׌Z^�6�,*�j{
��'~�Ad�l�lw~�7�'m��[
V�L
�^��z��
V�T�TSMk_�w��X>^��
u���ׅ�;�{����#���w�ӻJ�ec��e��Cl�x�d
�&��c"�>B�VO���6��g�F�Yc�����]R/����i��}�[��
��
�#��j5�'�ۃ�G�8ɺ]���8�c|���C
+�(��%.��Y�g
��m	��g�c҉��W���U �c���C
�
�0��
�*�}낇I�
��]�
+�
�e%e�if�~?^��e�n��'R?1T����P�9	#<Y���9G�p]��ew�z�}f�`0�k�

!u�m��p'ȵ}��
�ɔ��5(��m�
0��[|� ����s��o
K��m勩*��,�'%�%�4E���m6��s�8�
���Iv܉�-�×�fԇW�)�sͲV��w��Ts�
0����k��
+(��p�$:�(
���T2�v&��X��$m�
9{����G�]�|�?U��D�uЅ�����@��P��LM1|�ET/(�
�z�s��~?��x3Y��8i���fg��[
��{U���'!�W��QϩL�4
+�ٌQ��ԁͺ����
+?�r
�bD3G��4�R
�+V|�'!�:pBL���A���:j���D�Ьo��6j�*��xp��t�gF'��$��
oǔ���;��^KIJ�&��dK_�3"�

Wg3a?�ꪔHC���ή����j��_}n���8U��U5{lSxo�J_�ӖG�z(��n�ڶ����\
��=�aQlmKm�l�y��3���cF���҄9�ץMn�:��>y�Ð���O^�/��σeX�(-�sX�vD������+
�	�D<����6�ՈM��M�kp��fψ,�ʎ�^��G��h���I:��^SӐ��O}q>ߦ�����u云� u��/.�W�}�TC]��[����]t�V�0�9�BoN��0�u����ע�r;"�$�#z�cS�1ų�nPS$����﫵 �$
��{�8-��Q��"�T¼�e)�+7��~�NF����~��]$�q
9V#u
�%
rT
7�eiQ��j1��`���F�.���"k�yU>�0k��Ig��9ˋ>�����ŧTGh���!v�-3*���^\�l}�݋��W
����
W�hC�9��5e�
�J���d�t�2�w����n�N�G�EDW��
ii!
2��^�^���\?	c2��J<j|[Kr/��?�|rVe�������t��)HΎ؇o8S/D΁S0����=J�Z!r�}�ܰ����D,O?�+
0��q1|�v�vV�^���r¤��
�g�܇ ��ͱ��O%?�~rx�\�"��-ȥ�:7����W�u
U��:���nLK��'%�514~*��3��d�,���K�F��B:��h=Lٚ,�8�ݓ�z�)�4{媬�C�8o73�Fi�1)�G�~*-}��,\�T�G[�
K���5%��A	�wK=�[�lj
+�>�

����%�4�G�[�ÂY,�c�6>��^��Ox��1�b�zCr�&����jhf����*(��Ѻ��ě
_�R5e�h@���lBw���8]�SH�+��M5.�t)]�}�v�����LEI�=���գdNE�:cibNy��1�����i�~�w��C��!wѾN����>��/{�����=��@(^!�����Pq�hz�k'X��o�����.��0������2������\g4�a8_x�'M�X�MP0VƏ�S��z�Z�	6�rzt���@K�@ű\�� �\$MPt���y��yuMre�,�F��7 �o��޵��H
O�$j��'���՟y"ܯ}y�nnme"�� ��M-7��xFN�j���2%�(FuF�[;�N�6�Ft~@|�'�
�����)P�97´��:{9���L"�0x�"k��$���I��� �gRc�
��qP�wVp���b�CQ�b���'�Մ��_&�Țw`YQ��׵A���\f\�`X9�WF������e��M
+sW����
+�Q'�֩�[���v���
`Z^�'
aa>x7������R�`j��\[����/|�	;<J,��^���~RZ�Рkn��Y��Z�`R�
U����8I̽������_��Υ��d|�����Nx��G�������
��0v�dkͺ����Jo��ꍁ��J�df�,ف�,������S�l�t
L���?0}2�4Y�0��"�M������
+��(`�غbQ[Wg���9L
endstream
+endobj
+583 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12680 0 R
+/FirstChar 0
+/LastChar 111
+/Widths 12681 0 R
+/BaseFont /QAPWVO+CMEX10
+/FontDescriptor 581 0 R
+>> endobj
+581 0 obj <<
+/Ascent 40
+/CapHeight 0
+/Descent -600
+/FontName /QAPWVO+CMEX10
+/ItalicAngle 0
+/StemV 47
+/XHeight 431
+/FontBBox [-24 -2960 1454 772]
+/Flags 4
+/CharSet (/parenleftbig/parenrightbig/braceleftbig/bracerightbig/vextendsingle/parenleftBig/parenrightBig/braceleftBigg/bracerightBigg/parenlefttp/parenrighttp/bracelefttp/bracerighttp/braceleftbt/bracerightbt/braceleftmid/bracerightmid/braceex/parenleftbt/parenrightbt/parenleftex/parenrightex/summationtext/summationdisplay/unionmultidisplay/logicalanddisplay/braceleftBig/bracerightBig)
+/FontFile 582 0 R
+>> endobj
+12681 0 obj
+[458 458 0 0 0 0 0 0 583 583 0 0 333 0 0 0 597 597 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 806 806 0 0 0 0 0 0 875 875 0 0 0 0 0 0 889 889 889 889 889 889 889 0 875 875 875 875 0 0 0 0 0 0 0 0 0 0 0 0 1056 0 0 0 0 0 0 0 1444 0 0 0 0 1111 1111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 667 ]
+endobj
+12680 0 obj <<
+/Type /Encoding
+/Differences [ 0 /parenleftbig/parenrightbig 2/.notdef 8/braceleftbig/bracerightbig 10/.notdef 12/vextendsingle 13/.notdef 16/parenleftBig/parenrightBig 18/.notdef 40/braceleftBigg/bracerightBigg 42/.notdef 48/parenlefttp/parenrighttp 50/.notdef 56/bracelefttp/bracerighttp/braceleftbt/bracerightbt/braceleftmid/bracerightmid/braceex 63/.notdef 64/parenleftbt/parenrightbt/parenleftex/parenrightex 68/.notdef 80/summationtext 81/.notdef 88/summationdisplay 89/.notdef 93/unionmultidisplay/log [...]
+>> endobj
+579 0 obj <<
+/Length1 761
+/Length2 1188
+/Length3 532
+/Length 1748      
+/Filter /FlateDecode
+>>
+stream
+x��RiTYe�C
�.0�	�p��=����!�@i�J*EBX������Ј�a��a	���Ҹ���D�n�i����0�=g��̯9SU?�����w�gc����ɇ#@,F
�D2
`�Ad@&�H
��
�(���(H�4�V�F`
�;S�$*�`�%EF� ��e��x�@�q� ��F�"L���0Q%�
+��
2����
�qd2��x(FBb��'o� \ޗ�ђ-9��0S a�� 3ɇ�B%�8G�M1/�
[����BW�$���'}�*e�"I4
+" 惈�c�n�9,�d�7�B<Oq�H�K��ŀ|_�E�P.�A1�c
Xp�
�}v2�B�=��/�J�o�K�eL���A� ���Kƈ��a�Ѱ�b
̇đ�Vg*�E���

9qd �� ��
;�0�m�H ����9�
"�R�}�8�bp�[

��Yq���!S) �BM�7&/A at 1�|i�t>`�e	�1 ���s=��Lur�j{a_���6#�&�S��[�*i K[X�����YE�\i�Z����g�y
ٱ���ݬ�C�̜�
���bk-�&���W�٤�Uߛ
u�������d�;�n
)�%x��b��*�j:{�����J9Ra�d�:GZ�JIy�X}2[�io�j_��M��	�.z�\��7'�j��饥����]e�x��=1�v��Ł�ܜ���,���F���U�s�y3FQ;�Is�j���iG��[����9��-������u�4�g&��
��a�2^u�����y? ���fe�Y�~>�H���;��o� [...]
+6�{����{ag?�/ldV�/oF&|�SAv*�k����Z%Q����[�
�9�1��k]w�sb����ߒ���on�"�JU�0�2�
4�Jw:v48m)���:����)Ϯ�
7��zg�1>�{�p�R�-J1�ud�*T�	t���Sw�]$�$�*9�[�o
�3_�l�a����_��hU��$����+k�|s���*Tq���]�VS�/��^��4�Ϝ�=�9��=*��VPB;�0Iг���

��L��}rG]<d��D�4�ε�W��}�=��3���Ѣ��׻�Y��&���w�Nn&���*)�Ґۮ�Te���p�n ��L��u�S�cqEbx��\�#�h�\��K��bԣvS��e�Zl5c�맯��O߾�3��{�
+��o6z��V�����2���x�8�Ԁ���\7$:p[<=X��O
�[�d���73,�p �59x��b݋uﴻ�T^P��~�w�M�j�ڼy�d��m���y]�AXksA�&����VR[F��5�5�&�Qz�_G������)�	���?�5W��>��=T��=�V���j�?��Y(^�
K�%����������*1yA�=�Ѯ��mkDyz/u���{�[�ƞOאn]�N�b7��b�w_+R��q�vGO�ʹ�d�T�������_{Q�A�,@�
)�7>]f���K�cQ�S��\�ۘ���Tt��(���Ϙ���m���d�ISzh�)�������)��M����ֆѳ�
]{�6�V�R��>�?)�G�B��OTSu%.�7�ۛ���{�<�a��%�3�C�0v���R�Ƕ�����t����)�7}��/�i�
+���ծN��� d^'
��k�.�vs�wU���^��:޽!�]� �3�`bv��>��
�O� Aaُ�'�q��endstream
+endobj
+580 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12682 0 R
+/FirstChar 48
+/LastChar 49
+/Widths 12683 0 R
+/BaseFont /SJQBDZ+CMBX10
+/FontDescriptor 578 0 R
+>> endobj
+578 0 obj <<
+/Ascent 694
+/CapHeight 686
+/Descent -194
+/FontName /SJQBDZ+CMBX10
+/ItalicAngle 0
+/StemV 114
+/XHeight 444
+/FontBBox [-301 -250 1164 946]
+/Flags 4
+/CharSet (/zero/one)
+/FontFile 579 0 R
+>> endobj
+12683 0 obj
+[575 575 ]
+endobj
+12682 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 48/zero/one 50/.notdef]
+>> endobj
+576 0 obj <<
+/Length1 875
+/Length2 1387
+/Length3 532
+/Length 2016      
+/Filter /FlateDecode
+>>
+stream
+x��R{8T����P�J?��}n̠��BƠ�A��2��f���I���K�$*6
�ГRɽ\��eWG�rP�P��t�}��9�?��k?{������}����`�	v`
+�1��T�:P�`�op"G ����R���B�S S! ;3���# �T�B`a

+�Y6S"g�C��I�?���X
>O��|BUD��@�T�
ArI�D
�01���HS�|$�R��	(d��D�c��5f�`R�HP,�Ėb� ����ԷŽ"�'�*?5�?�<1,R�.��e
+B��T !�o���'o�� V��e}P��3%B
(�D�r�'�{�JH��Q~
����4I�Z��7m������V�9���T2����c���+�L$�)�{?E~�k��/�!�Ҝ Ax*
+E�р�`� RH�&%RK�d�@��M-�
HbX��O�� "�a
�`�J��P���g���d����H�$����d�# I ��%�E<y���1"�p�x�
��?���S�T;`7�@�Q �J�gj�	�
+�$��b��
���!H	�q�K����_L.ٺ�����$��-��hօUm=
��i��fB�'�*��6�Y��w=4�`��N�-��r��Ⰼ�Zbg��j��l��vV/|Brr�ַ�Q���ga�`�b[�v��gxaͻG����Am�M��C�{�����iG��i-T�z���4$\fm�s��������o�
+9��
�g�74�c��N��-��j��f��ÿ�'
�
���
����CU�Yz58���\��M4{G�il��(�&�a������\��
+<j��C&��ݱ��V_�X1��$�W�<yS���qh��u�L���E�L���WN��%�
�6�j��z]~�ф��
z��ܣ��
�[ݿx?y�
B���������
��m>�F��l|o�����>��
S�E/�Z�<*���8�g)tgv�8����F�p����Ʀ����j�T�l׹7�%�J��n��8��8���i`��T�cxWzK�k\��'�U.�r�_��rdz=���M&.���w���
7�Z������s�={���i�{L�4�X^L.
��||s�Dۻ�F�`r�:�Ư����3�g����X|��N-�Ps߬�s���=oNd�OwD�~��o�R�a�.���:?1?�EUh@U���l���[�Ze�y���G2
^��i.x�3v����~��Q����[E���g��4YW����	�`���{E�v�CB�����^�h0p��1 �sp�`�����8�O
�;��n|}出�z
�u?��zM9�Ph���la����րca/M7Ͻ��f5ھ��JhR�6�Y1C������/�}�C��
(���)�0.�n��~�tK�T��
+����қ>Rj�i��yC%
/Le��{�*N�?������ܜ[��`	�U��Ȳ�=��z�H�)%׊�Qq�s�L5,��A?�m[s�m;�ߵ+Z�3�:T{n��vM�Xb�S#��H�{Sw�5�y
��}��F�hi�p�Y��0��2��+�k
+M���1ss���[�B#�
4Z�����Bv�(�'����#�;�
3DOr
�\�t{T
5F%�~L/v��;J��P��
7_��
2��wdǬ��fXUl�GR�Oy
��
�t
�b�e��H�pnV���M�ׯ�����p��$pK6�3��u�����%�=O�P��Y�0����m̀�:�����S��PH��Ң:wV?M���<Kgn��l-��]�A�}y���i�M�
f��Ʉx��,�@���ч��''vq���n��-��u��8#���{�q#��$( _ڄG�Ν��@�ti�Y��B�ּ�[�z�r�ǫn�

�zYdi^}�=�i��
52?�ܓ^�$�E��'&#J�1��{�v�|�mU)f)'I���P���:��,�������K��C"d�آIs?��K�Ր���W�?E��!�T�C6��"��endstream
+endobj
+577 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12684 0 R
+/FirstChar 0
+/LastChar 94
+/Widths 12685 0 R
+/BaseFont /OKRXDT+CMSY7
+/FontDescriptor 575 0 R
+>> endobj
+575 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /OKRXDT+CMSY7
+/ItalicAngle -14.035
+/StemV 93
+/XHeight 431
+/FontBBox [-15 -951 1252 782]
+/Flags 4
+/CharSet (/minus/multiply/lessequal/prime/infinity/negationslash/logicaland)
+/FontFile 576 0 R
+>> endobj
+12685 0 obj
+[893 0 893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 329 1139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 770 ]
+endobj
+12684 0 obj <<
+/Type /Encoding
+/Differences [ 0 /minus 1/.notdef 2/multiply 3/.notdef 20/lessequal 21/.notdef 48/prime/infinity 50/.notdef 54/negationslash 55/.notdef 94/logicaland 95/.notdef]
+>> endobj
+573 0 obj <<
+/Length1 1166
+/Length2 5142
+/Length3 532
+/Length 5892      
+/Filter /FlateDecode
+>>
+stream
+x��W\�[��AA��D���t����� JB�^)���R�]z��қ�.U�H9q��-=k_�s�;���c���9����ES�O�eS@!�| ~�@VM[ � bg�u�A�pR��I @�� �4� (  �H<��dQ�Npk4�S��W�(@�
��B� 5�f���  :((
�v�H# �_+��0g��
̒�X¡h���$�򣄴BD��-1�	������ �X�\ �EK���Y�Q�^0�����]\�@�C��Ǟ��B�������
0h�@
e	sB�;U��55�%
c����C���@�o	� w�Yj��P��
�K�!-�m{lY j��ȩ<���6�
+iB�H����?E��Šߌ='��H�_@ �M�~����_��P�%
�
a ��	�N��
,	<A 8����a���(4v	 {$^ +�ѯ�  
 N0$f���[������#?����oA
 �9�~
�  
+	�����Ѯ�����h'�� �
+��[ ��?j�`��
1�)��"& ��CءB~֒�o����C �
�?�W�?�?�[�?P ����>�?���7���� ���6r���q�E�g�b����ا
�������A�y�	����m#����'콢�z������c�
s�A�&�PP�@�Ī�|o��|n\��h���/���py=*��seg���d���w]����k�+��9F'�^����&{�2
$���8��l��W�|����<כ�,���^�V�&����

N��KEKJ����B2�iHP��,�I���B!��q1x��޶!�5<���
�Y6aF��QMO}�9�m�X�@h���kI)���J[&2�$r��y)�xk���Cs��<3#C7�xN�U�t8D�l��B��3!
1+���*?�S�<�_L��b��{}�r��o{Fw�#ǟ6�g\@���V|p��8p���2e��,���3]a8�p:�¼���B�<��Sp��F�e��M��� [...]
+s$-���ݍ���z�
��!�����~�����ćR�z/ޟ��IB�G�l�9��cD��
s
B�IZ>�����Q-��f�Dܾ:���̲�����~��
&�r�ŅZ��P�
0�o��!n���Ž��קe�
f<�g�� ��j�&
��]����jg���IFO�A������r��7z�V��_ei�
'�0
���7���X�X�2ī�
�ʱ�~�gr�#^�ZOڑ�����s��qp��|���;�oe��KS�
+F�7)���
7��VZQ
��?g��C��Tz��u3l�!qt��.uƂ�
���]�}'3�w$�)<�4�n��0�}JK�b�	��xA�%d�r��!W�z�-1�]�WȘ��
+}�{z*����ꦉ�xe��u�*��%��:}�ݹ5��ș�ڔ�C�|v�X�N���(���ď(Q“���}R�Z�<��=�.�g�1Ю�.����������7�T������6�BuZy>p+!H>��߿��?�S��ݘ���~�l��F�KL�rh�S�0 at q�jA:��(���}GB��cT�#dw�.�'��s���ؼ[�N�
+��f�:4�*�*�պHŘ��1K��M<R{1�F��ݦP��&�
 4rX�즧F'-
iz����W��p�oV��?�,�V�֮��ۑC
+�sW>b�uDn�18|�巯�Ryr�
�Z�(����7�٤��[t��M�a����n
S��'�Ɵ%v��H�p���f��;�|ub��"��S7�f�n���S����N��	�����7��&*zO-8g�q���"T�qc\mk>[b��z��j!�yP��jh�0�'��2RUX"XO7���br�����Y<HS;\����<�My
�/k�f�^������_�,�.��p�����8^�r���Ж>�Z�d�t�6�Y�5k�o\[���]��A�����ǵI(�w�k��n���z��();Q,FM�}Y$Ь!?h�ٽn��-�*�'>��LU�
�j��b�+����w�?�W#
�*�'�(���T�9a��P&ҡ8y�C���zqxW
�yjܱ
�$%��M�y����W�z��W~cFK�E�-Y��,���k�2������?
��
�J���Z�< '�PM
"B�_��7l���
������"����S
�%${��G@
| ٥h��LV�F˔\AYF��Mp�|+
7-���9���)=�]�O{8[L<�3C��2����^�S�p���Rt�
��pe.V�o.+:�ڌo�2��с����\�2.tm% sBSդM�Qp�<
/��Q^y�6�F��P1�&������h�Q�/� �I�[�6��CWJN���MHra��J�����lQ.��(�R��hϽ�]���Ѥ���
~mg�Y�n���L���H�N]"CWI0�ԝ/�oL8��hd���+^�����den�^�'s�w%K���Ӓ�-?V8;��\�?��(�kԵ�������I�rh�u����T��L�[G��ot�{-��[�xGl�p��D̈́�s�T
%��4ɷhm.s?�@��3��:9����	Ѐ܃��E�'�W���J�9���
�`d�r
���[��ڝ/j7# ��)x���T+{f����Qh1K�������Ԋ����XŒ|��َ�
��_�^�����z
��Od�{��2m	�x����bhtX��&ʄ��9~F���

ŵU'�M�H�r�X�q,�q>d�M��䜼������/t���u�Qe����s�sp>�4e�I�n�`����2��F�+	
�c��
+t�*�j����l�^�P�s��y�
Z��[�F�6�O_�t���6��}ۛ��S�*hYFH�޺����g.����8^?��M&;
܋�_�D8p������T�A�>;�����y��['}@h禟�b
��=��T���>��#�`ͪ
+R�6��@���.ѽ%��a����(;/�E3�)���6C�X(q�+���d�9����'�z��OZ��#<-������:�x���
?G��
��˞�Ryo+�"��k�����3}%l\����x��5�g��Q6o�"r���+
�

_	Ii�Y���W)p��M�8���
 ��%΁Z�
���̜�\׳!Y���ā�e�LHt���&�4���k�
��]\� -�/z�u+��5��ܴÎ]Յ3��'\��3��O�ZWB+2�y�•M��_�/�+�V��Hep���G��?$
n^z3��F�T�z�PY��⏋߈�A�1
g��Mҷ�Y�SF�q�x�f^���F��M�;�:�����B��n]z��0M1V�U�h���D���t"zNVT�b�i9옣�;)�5,���jrI���{����;�XfXFw��
�h��l�rg�02,�P���N��+`—��H�`���
<��r�^@�C���W64�+�K0
r�{.��4�r��+�E����������\	�i�ŠuC��g�N
-�Hܐ�;���2��3��e�T�w
N�-�����Fϒ�OP����L.��!1��fe>�i��?��� {$Z�A��(|���;�H�>����|c!�MIFC�
EC$pC �v�I����N��dL�q��< ���u����* j'o���{GILH�x��^�������+߄4L���^N��ؾ�����RKa�AM=qY�E��0ϵ�/��L�'TtR��~%��V�t<{G�B�P���I2Q�`��L�ϭ��4
J��g� ���EUu��@�� ��x9�b2m��ѥ–�f�n�MLj��Q��>�8�|Z��,��[X���|���1����/�)7����m��X+�r�T�5������xʩ�R�G��r�[�D
�L����o2%�[�D�m���5��Խ�x��gCK��靎Ae	����F�ԕ`���� �`BL⢺�N�ӳ��
�dr�z���	�3}�F���Ht ���]�k��j�
���Ƈ��ӽ���A�hҘ���L(�
��L¤:S=��e�Ƿv��꣠Y8Tm~�j/��n��M�V
��.;<���+'�S˦��&������ߍ>��t;\�E�#3Kl�>��b��r}0�=��yf�rb�Z�]�s�TZc��y��`oP޵aI
e�P�蜜0�e�E1đb��Ü��☾R_0.�@���_�S_�����iM��gN����%r?�Z�%{
+
���C{�wڮ��T�N���>n��g��15����E�6�*Ǎ <5�a��}��L$%��#^aK��3
WB��O���Mr_���Ve���(�|��c5U�
,�|P��"տ��x�K^��X�! ����o��ᝏM$��$k1>]+�hp�8�P7k��W��_�n�꒎}�Gԁ��
h��1\3���'
q_�EVG]�\^~뚩�m�H�9
+����`M�ݱ��CEs�� �U�n��
�v3�x�ͱQ
+���6߁��JM���7�<��-/�
�e��;�O$���ӏX���c�L �nx�f�%G� 
\;
+w��za�ک��u�]%i�4�rΌ�S^��� �$PI�[w��#�6���賎� ����}��z"��ۤ�Oh�n)�ox?�aC�_
+�?��n�qo��$���y�&3жz�9�NQ�ĝg�{0;~)ŧ��f�iy�k׊Yū=sA
?�<Җ��G#[R�� �XAi�Ҽ�R��'|�5$T�i��}	�$z���sa�:������Uw�j����9��w�t�ʢ�+u����w,��WԲ<�?�I������Լ����{��Ƣ|M"ܫ�$�9E/_nwc{԰���D�R��/e|�����5�G��<�z�&�j1a��h�|Nl��d�}�����K�����
�n_�ޭ��W-xܻ	�ʹ��	�}���ص���`LS����^d�h��T���
�pp�t��*���ne�n�%���~$T�P�#�uRk��^��Ș�#5dz�݆��ʼ����#���)$�y�Jŭu����i�04�y��;j��aѯ�x
�9��6 đ*��
}J���;?��$���7�G�����5ڭ�IE�c�� c�]�{���Җ1K��N��u���~�(c�E�6
�6o�7\
+�m�_�4���
���2��m�������$�� �}I���'Ru�U����gڍևt�Uݱ����Qsb��8#誯L��i�T��G����vs���nңHB$�1Gh,��
+bJd~5ת*y`�]���yI;F�
�VY=���ޮ����&��
�A��
�[����ś��B���C����Sy��
��I�{�w!��}�a�:q�gh(
�$�[��f3�Q�.������:�o
��I�~�p<��l�$��:��t����z�p���U�2�P�btg�^s7��=
<G�8��A*��@���e{_�	�
�
ح`
�Z��7��h��{EJ��&m=�[���|�D���X���P>Ϯ�����'��]��É��((�SjT��Sxu],
Άh1�墡]�LvMD���C�z��ּ�0��I
-��v\􅎩�������k��w>�l�6����-�_?D�[�D(qB��!NvD�.p�endstream
+endobj
+574 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12686 0 R
+/FirstChar 40
+/LastChar 120
+/Widths 12687 0 R
+/BaseFont /OLSDKU+CMR7
+/FontDescriptor 572 0 R
+>> endobj
+572 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /OLSDKU+CMR7
+/ItalicAngle 0
+/StemV 79
+/XHeight 431
+/FontBBox [-27 -250 1122 750]
+/Flags 4
+/CharSet (/parenleft/parenright/plus/zero/one/two/three/four/nine/equal/T/a/b/c/d/e/f/g/i/l/m/n/o/p/r/t/u/x)
+/FontFile 573 0 R
+>> endobj
+12687 0 obj
+[446 446 0 877 0 0 0 0 569 569 569 569 569 0 0 0 0 569 0 0 0 877 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 815 0 0 0 0 0 0 0 0 0 0 0 0 569 631 508 631 508 354 569 0 323 0 0 323 939 631 569 631 0 446 0 446 631 0 0 600 ]
+endobj
+12686 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 43/plus 44/.notdef 48/zero/one/two/three/four 53/.notdef 57/nine 58/.notdef 61/equal 62/.notdef 84/T 85/.notdef 97/a/b/c/d/e/f/g 104/.notdef 105/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r 115/.notdef 116/t/u 118/.notdef 120/x 121/.notdef]
+>> endobj
+570 0 obj <<
+/Length1 912
+/Length2 3316
+/Length3 532
+/Length 3946      
+/Filter /FlateDecode
+>>
+stream
+x��y<T}�Ǚ�e+�8��Y�,#d_��c�1�{D�De�Z�%��Hx$Ɩ5�%K�}
���ܩ�s����y�_�u��缿���~?���w^�#.bf)��&�`t��

W����p@
,.�M� �8"���Q�g�(�x@^���))���D�@�Ս
HiK�� Z��$ �H�Ɠ����DC� Zx<`��
��!�a�0
�q(2�q�����	X"��+����k�C��~ڔ�&�D>@c�`�	�^
C��a��u}�x���Z�/���O	��˗�!�D4�D�����
���W
}2�Ci\�@��)���|tq���r�H��g
C@���}?]@u�
��
e���U3$�@�
+�� ���?�7ӛD� v0
�
��_O���C@�8�+ ��
 I$d �~���
�	 0t�P�H���`�$��GE��"U ��7����"8�>�ҵ��.@�~C ��*P�oH����S������<
����� ��� 9y%����ʀ�,�	Q�$�@�y������8��1� 

+<�OD��tO��A	��}W�,�#���A�*K;
�}:��G��Fh�+��
Wę�d�
��*�
�к�l	��j���N�<����;�Z3��xfD�	Oy�)��Atcԏ����<\%���m&�@��z�ǵα!�T��t2�!�Q���hܛ�E=b.q(���>}�����
��
igb2�
#<�b�7�|n�NL�˾5x��p���e�X�t]�3�m� �v\Z2Z�E
ހ2��>
+.,.���K
��s?3��t>�$p}ݜ�
+�_\X'�MS0�=Y�Hw������s�U�I��X�%Hh.�~9�E��}ϒ%}u#���g�<�̯cO"�5+��]l$LZ�b{'�I):L��w� ږ�у��F���y�#e�_�(ɷk��؅|'!�'�����kx�
xF۰?t��s�S�����w�������1�(�*����-�����&IJpRxfT�
���NW���'�OlXZ�{X�D&tW�x�6����QΞ���(�;�t͌;�\4϶�=H�11Oy:NZh��d�;sm;���n�

��ӎK�M�i�
_�@�Y�2�^��� G�Cٲ/��a�[�C��n�
�췤�e�=-Kf�i�Xƭ�R�[����,
c�J ZT���r�Pi��0�W�*�]
����P�(���F5t`s�@�K�?�d�4?���9�z��(��f��}H��#[&����r��gk�9NNޗ˲R����BV�dſ>r�K�i��2H��-&��B�7�$C�g�޵(�
����&�M^�
~�/n3�%r�3x�M!�pO�B%������V�׬^\�)�E�϶�
�DW�KY�{�3w2�=����{L\��ޯF�|��5ś�O�[�wpp
�Q��`tϹ���ŷ 痃�.
?ݲ
�d�ٗ_lz9ҳV%1��5O㿲y�������r4�
��!�ܠ�A�UJ.�Nj:�d�b(0#��o1#[��7�T��:��
˾�Z�/�O;a��ZΣ����e��guM::���)��+o��g`[T�r�v�.~?_
�y)1���
�Yq�lT�S��<fv`�OCm������ᡊӠ���%�f��ס��U�#L�9fU�'���_n�^(=� t
7@���
y™��	}M�
���"գ��9���T����E?��DZ����t�Xq2�`Qi[�����%;6��W�
�oz:f
M6���!-=���|V�\7~tU���\�"��G�a
+�� �����q���$�)�|�~�ծ��K
�Yu�1bA
'e�?�>�f���6��P
�n�'�rn����
��
�zhPd&�h��$輽{R4���A���ίR;·������U���
�ħ
��P1�9��=�fmiI�UP�{��I���3)��Ҁ���+�V��.M�
�2�ΉB�'Umm'M�-�s+�[I\a��b��ϼB���
�H�i��ɇڙ��@�\�z����ݒ�WX�[7���S6��pV��U�E�W��-���=x��T9�ʘ��򨎉�+f��Mh'{�ѳ��݋j.�f�v�]��Q��U{��{	b�Ns�d���DU�&R��"�`�Te>�3�D3$���]���}���J�
�~Ֆ�zy��5A#�2����>J�NϹ�2�6d�������
+��9U}�pAZ��Q%��qq�aO��	tȴÌ��C�II��!�b�^j@��A9^�)�(~�a��C~�
��N�;
+rڃp~t� u��^ie���@�V��dI�}��
��7*v�<���͋鲈��+�dS� oۑ�'sG>
��$�
9Ʃp��
�@�G���*ǘ1������zCSM�����*��}��1gw�}#�ӧ!�]���6�Q������	�����tm��T淾���x\�B��,Uia�H�zx��iD��Ki�{����&�$���vDH&ߣG/�����z7�\%��.&w��;�I� �@1)����7�9���_{��c߂�c+�b�0��>����M�Sa�^CK�%��K��m�S�*[�~e�zܳ�ش�
��ek����w%���s%�<�n�b���G�A�������%���w[͊�#42S�I60��.
����
��3-���
+�|g364��vܳ��^XΡ4�������K�_�T�u0�H�$�N0r��m*��\}�r��IQ�����~R��0��/ҩ���c�{'�zE��O�����|j�	�6a�Dsde��`� CZE�M�N���{l�'�7�sݤ
��W�D��<
�\m:�O�gS����3�R|�6�A�-؋��וQ�{�YS�6]��q���f-���
}�e��yy
�2�G�f�0�n��g�	���獩�B�5�+j
3�]���Z�T�n�h��5&Ȧ��ʛ/�N�=I��
R�+� K��H<�I/(��-���ð^k����
ʆ����-�'�\��ѱ��gDL�9-�c�)
��2	5I
v�AG��$��bM�o%�ls�������&�M�3j
X��q�W�Dk�e]��"��l�rt<��(Na�
��v��'H^h�Ƨڗ����ə��9:��tMeU�B#&�~Z��ÝWƚ���

�x�d$qw�)��O��:f�Q�aɲٛ|�Y��;�����	�׾*�u [...]
+�gk�����N�pEF������:
a�Ӣ-A;ɬ�+V��3���o3:��0�l@)�u9�"��UΞ�A^_�&�{ϒ�=t�I��6���Zp��`���A;
��S��}�
u�d��U�%0�y��YIw��>Ir���4#1���
+��o	��Fb:��!��A�=�1O�=笩���@��uk\���*n�h���K��BN
+w
ww��������1eQ��}ك�����&�k�<�|L�`Z�����M�p��u��
P�O0S�7��eBO|sg�m|

u?!Q9t�ק���
c�^A�؉����~��\
+h[�mtP��v�A��³/�֭\���S=���?�2�um�}w�(��R�
+|Nf�����F��&
3�����M6>T���n)�~�\�</=)�=.�"�7U�
������ژ�P#l;�-�ˤ�Md�9�)�G�d�
�pn��H�g↍K~��7gi�R
���'8p��6��n���i����ʕVS]��
������]2���~}�
^wȱ�V��T�({S������q7^�|��=����r�G��xK�4��]���*D
�hI�K9�t�P�Vٮv�����,�'ֶ3�ׂ!�N~.���]��ǫCɚy4�D͒�Qє�{�j<�/�73���4��4�}Aڥ�?������D
�$���H��? ���endstream
+endobj
+571 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12688 0 R
+/FirstChar 97
+/LastChar 120
+/Widths 12689 0 R
+/BaseFont /EPKLPK+CMMIB10
+/FontDescriptor 569 0 R
+>> endobj
+569 0 obj <<
+/Ascent 694
+/CapHeight 686
+/Descent -194
+/FontName /EPKLPK+CMMIB10
+/ItalicAngle -14.04
+/StemV 113
+/XHeight 444
+/FontBBox [-15 -250 1216 750]
+/Flags 4
+/CharSet (/a/b/c/e/l/p/q/r/u/v/w/x)
+/FontFile 570 0 R
+>> endobj
+12689 0 obj
+[633 521 513 0 554 0 0 0 0 0 0 348 0 0 0 601 542 529 0 0 681 567 831 659 ]
+endobj
+12688 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 97/a/b/c 100/.notdef 101/e 102/.notdef 108/l 109/.notdef 112/p/q/r 115/.notdef 117/u/v/w/x 121/.notdef]
+>> endobj
+567 0 obj <<
+/Length1 1432
+/Length2 8965
+/Length3 532
+/Length 9843      
+/Filter /FlateDecode
+>>
+stream
+x��weT\��%!��Kᮅ\����E��N ��k �%$���[ h� �ʽ�{7����_=���gν�Zs�>UEG���&a�b�uq��q�s	��5�8\윜�(ttR`�9���Y�
p	
+rdA��G��G��� ������� ��~�$�@`;Ksg��9���ai��t��A|��� ��;� w�dŎ������ , at 6v�(
�%�;[� ����<\���	�CE������rqv�X��Q8T\��@P-�7d��sYGGs����[6w�s��'W
Pv�����T�6e�������C�
�,%�m
A ο);wY;o���
��`m����9[��h�����+�h�!��wO�ZS3�s�h�����o�0�?Z
��7��Z^.�!���;���%�l�be�l�������>(��"^����
+�
 yCs�;�@�[ К �]�(���9B��� U'��
7������` /�������H�8�C�8\A`K�3��
Է�9���������Y�7
�Ҏ
�� _��B���
�7慺�x���
u
����������;7�?,�ٹCK�o
��
�	�'1h�9@������ݟB�J-]
]��$�ۍ���|P� 7�	�#e,�� ��zt8�� Կ�?����A�`��
�M��M�����NsB�8�������'��
������
��.�ZS����*��q����A�����t��c�v
z��]
A� �`�XZz�����=����vУy�,Q��],���3Z"�eJ�T�3���iMRi���5l1��c����z��Ϛl\�}�}J�GR��.�	ٳ��̹�}O��l�vR��le�=W�۰o��-��'�/Tg�ǪR�K����1Jk
 �R��z���	��ד�vԎ�h�Ri`e�UE�D�ya���[�
+
��BjcY�p����Y�T��lt��۲���͌�q vRY����W�p�x�F
؇_F���Ǎl��%�1�>'���V�<cm�ңz��3^/�5��ږ*,�q��-q�M`�G�}>��	w)��n��c�@�t��
����i
�s���ra\�j�H�P�������6�(wG����i/���j���?�J�(�0���b�!��"Q�bK2ч�a��@�k���㌲�/
��
�庸FE�f�Dq`�nH�w�$�5�<�XQ>
+s$���v���~=B%��
!���~�{�l��.��Q?_��J�S��'-�|�
+�Tm��s$�3�
[��U��pT��PF0_��$d
a��፥l��x��C��Uq�E�[Q�Rv�)LJ�H�z��u� ��E[�-6f&�^������
w1�S���5}4�$Y�wDynm+�ij
ǹ���C����)q$�X-���#�r��(]<?<9wƃ���D�M�IR/d�6�����OXF_=
+�-.�ü0arh:�ԡ�
�n�{�(��҈�é��+�^�
g�a�8�gn��+��^
�����κ�&<VR8��u���Z��M7���
+���;�e!��s�n�3oD��a�~�)�q#Oz�?}�++�f���*���|�|�8(������!�<�_����d�h�[D�=���
�#�^I�z{�v(ҡa���m����t)��/�6��#�XŜ�u�l�����8��Ubl���+����7ш3�3�\M� �
�T�l/��~����W�m7�y�hVҽu��]�F-봇��:��}�2A�0��wD���&��N1��U[ؕ��J�
+��3od_����pޡ����'�����c�h��4~`��`������V(���T)�j�x�k�)z��h�3�؊u���c!/��o������(t�Ϳ���-	���.�&���q
z��L}�޽��j� \�
�`�]�O~�m�"�&�ˬ���}�nR)�,�_0���
_��̎5��I��Y��e��&��/m,{�,
��.c������j����d��p T$�c����|�������k���H��Gg
�
�XZ�hGR�,7lWL�3���`�Wh���Q����F��ulƐ�+i�����F?<@(tN�R�qlh�By�ߍ������q%||�g�™T3��R��Jt�cw�9s
L�FgȨ���m2{Q�]V�K���$h�	����ω+���,e�.�j�Ɓp"R����Uo>6
��Ð-�)
~�𩞰6{��
&�~��>	���'�`q at P�~v�����]�X#U6�
��;�lj��璣���{��8||#����MB˱��]�Ë
�X�?��_�:�t{Buߴ��Ю�ͪ-�`W�Jlm�fT���~��m�M�L_<
���0I�&���/
�.��ue��ݵ��û��(KP;\[�U��'?i��Ĺ����~��nDI�
J�����~!���+�_����aR�z�y���,M"^p�[q���=b��f��_��X��T�+���F�
V?���Q�b�S��9cv�T�}�+&V5��-2����}�����BH<I+�F
#)�.�;xtء��V��qRw�X����Z��i��&Ğ��4�+�
��m/
+'��ma�1���V1�/��ٖӹ�4��%)*qL]��N�Q��}���V͎@J�6�
���eG��
v�����"�\�ܤ{Vhɣ�Л�Ժ:ʼ�J�%���/â�]�֔Q��ݰ�<QH|�ZI���H��I+b�^'ct�WlR�d3�<��R���CǴ��Fx��*
����⎘����B�,��=���$ۀ�2��-��i�c:�:"Ґ}��T������
D����c�qDD��
�>�^#���P���H�Ԟ
䠲�j.#
�q(|�����(��>�}6���630>6��k��_��>>j��W���U�F�);
g�K)��Q�݆®ց��s�M�$l�ï$Z�f:�y��&��7(�r��z�s榨�U����T
��9X���P�9Iy�
+���$}�+�����!�%9%B
+�U�����q�$r�W�+K�鿌2�#��P_ρ
hc9��?
���� ןx9*3�$�F���
�7Q�����Y����������������|���/��Yү.�,�����NN�=���ct��~)�3L�����
��9uǑf�9�7l�	������$5BZZ�Cs�����؛.?�n�O�+�Dp��8�	I�ϭ�ҼP����z�J���ѩ��
�x+�������֮B�_?�w���m�k�i�����7M���\1\�)�< ��@U� �>��L}�s�?O�Ai�u�FUU������C�q�a��g*�_��G9�#Wgp�말���G����x[�	Ѳ��
ȕ�5P��G�ېn���H�Q�0F
�TY�y(a
P=����������O鞷��
�Z5+�(ʝ�W�(53|��v����CR�7�����^�A��)T��
�]'&�_;ŮZ�u4a��a{P�5O
gͯ9eP��&j	
JZ�/���b����foV�4��
���O� [...]
+��a��^�~�Z�9_����XN�����}iI����
+����t-?�߽��),�&�rU��5�	#�X!��
+��$����m̞D��42�`He���R�&�:��ņĽ�
+�Qu�
aH؋����)�e����ֲ
+R��6cUJq��Y0�;P��j�N���#*�&�����:�4o��!�:x�Uj߻տ�5�/}�r��߿|�&%�Ds]K��T���:�	S�:,�8��S�"��:�m��3�� ]�Ǝ�i��NA�8�-�—�Y0�[]�@�G�폻5��
<�%�F��(O���e�W��Q_����Y����ջ�0��X�3H5Ѭ�1�K��*.����\_�=3H	^LQ��.
�_�$zF
�ة)���)Q.P�R�d�T��U���y�Ֆ���z����25�
+�!r+E]t�xj���L�\��I���̛08��gv����wH�l}""|أ.OK��F1���mw��4��ň�x�4���2F	k?�j�G~R��_,	�+�4�H%��ٽ�.�0�5
KƱ\�v}$����O�ĥO�{����|j�cHFby�?%0&��t�.Tz�឴��%w��4�yx���$L˩��<�1�E|�)@�Y�����BYI��"$��t�9��
����#�
����)����U7�K���(��H��X��@i�j�z����5S}x�Yv��/�7�R����.�)�@Dy�����2��i�,JD\��|�k9���J@\K��/�e=�j���ނ��

����2�O7�s�x&���x)��V6�?v慭�,l� �*��_���-�#T\�*�I#�T�
\�#0�
ʏ���x�����	������D�/�����s���qiL C5��;c��]a'�N�05��|@Z:I
�v
�Ym�FkV�.�H‚j�l��ۃ8��J�i?�r������r�0:�Kϐ3L����	��"c)h���3
6Ta���k�u8
�s��D��*��� $�W�i�?h�4*�ٝ��|X���J���]/5����G�o�k>sF!4
ے�7��.��S
ɶ�5
�V���i܍l��U��i������{F��f��Ɇ�k�4��ciW����y���<:���=|�
+g�i.pY���,��U}g�g�菥e!R��)���j����Zf�ݠ�^�yDZjM%�m�{l,<�JO�*��ڬ\6�:�s?
���ˈ3c�3&${����+���&��j��[���
���B!v��]U�<��~6�����JGi��F�y��؆P���/c:�(��\��CMg�|
�@B���%!
>O�:�Xn���&폼:��
�a�$���|��ĵ�o÷�&�?����r
[_�Z��/'�7��E�18�:|r�j0��
{`��OH�QɜeG
��ܡ�
4��!9 �v��{��bD#y�� e�(��w�\*
��\H[�_ɀ��}�����RO�Ӥ�]��F[za8�3Vro<(���'J�.�G0m��71�,�>�4�V�*}���
�v�7�
S��i��ͯ7x��XI�V��x���y���H)�G4��o�Q��k%W��Mj_�Z���6�><����	z�na�I�k?ѵi�_ӟ����
��g)E���M.r���,F��]�
7ܽ�ÕT�pr��`�����Z�������:���l3��P�(�Q��p�>H�F�lH�х��qY��.j64�m��t��|0�>��-n��IC�$B��'���R)��e֦P�k[�>Mz�.'҇�*9�n������ ʽ�JuB�P�ռ�9�Ы�p�3��Q���
�o|�%@�����8|��6�B�^x%ڵ����˫��'D~���������<�/� c���#�;u�;�
+�<�j*?�ӝ;�؆��w}3��8��
�Ov��I[x�i�V�4��a�ҋ�d�J�
+��C��g9u����DaB�cUKsd��Q����3�
���DW$�Q�8�F�|9
XG��¬3C�sO�"ޣ����
�.PiXI�{T�I�;p�F�Ί�F�N1k������@
������a�i>?��+6{���/,�ߐ�rx��gd
g�̎0աO�~
c
��΄���v��
J&�V1�
���i��ʼn/�}��`*���U��՗@œ���n��;-:�w�x�k��„��a�
M�ڞd�{
_�܂���ίuV��Px:�G���o�l8�2�/����K�wW
����_0ݵ�E�t�� ������e1ӹ>��~����)�`]�{XC��GkuB���8S�*��1vRz�~���%xh�
+ �?(o�V����|
A3�|�
1Gkk��Hi���g_�p�<Wr��=S���u�$H�O$'��xjO��
����{dy�96���
�1�]�@��9����$!r����p<��dw�L�
�C��I�UD̝ �)hMf��w����ϵ��
+��z�v���(�p�	]�"�;߯xT>_��_
A��W�18�Rk�m��$���[��
1I�l���YX����:���1Bu�3pJ4�A��2O��� �N%���x�,�L�_
�\N̋(��9�C?��&�fd
��U��_������\�
$I��-9�lz��'�s�������/
+R�nbU�Tf���34(�U^
5��ö����
�el��d�
8���~?Kʝ-m���Ҹ���Hp�`��v�Iނ���
>�D�+��
�֯`�����Q/�"S
�.$*�����{_=q.%u��a1�|�X����[r#
%�Zi��
yQO,\�-�!u�݇�� ��W_��0U�"ۮ$&��Y�$��S����ޙ4�M����}G;��[�
W)
� o�m]=96�p��覲��p�<ʶ
+�SU
�O]�M��dRi�Y������0/R�
��׌�&��em�D"�4NP�N��B���E�&
�
[�r�e3Bk�=m5fC���m��~ya�����O����c�&��s#�߃\{b��ܢ�a^cl��AC�7�@�1�2Nso��"������j;�����iK��Ye\�Ox�
�B�O����A��헛"F3[�O��5#�ܩWE�2�|T
a�4a����ל�t��2r��H||���UO��V��)�W)B�|8`D*��D��|��h��!RՇ
���`g��ß�N���mI��_��o$OGR��:�[�_�R~��sаn �5�Ow�c��A����
穧m�\:�c~(?ŵ�~m��3?޼�S� o�ޝ*U���J
i]5>�Tn�Y�I�K|
�j�l at 7P�|����L
i��g<�aDS���
+�L�q�w�k�}g�Ww�g��7(�y����R�@�\�sV��=�6
+��w
�q���(�&
+��s�k:E
„�|tbQ��>�d#
+<w7BQC�*����B����K,��_��
 S�T����߾�iq|E$3wP���~��%%_��1�ʂ�:���$(���X��Y�� dH�������uQ�r��m�e���[�[�fu������ډ���I��V�2fRbN�v��+�h��F�:����[�0�=��X�
g�����~�����X�Qī���\��#d�� t
+#1��`

�E�w0�'�^�ы�h�Ga����H�#���o�ɪ����aX�+%qW
&�Ś?X_W.�<agtH�
;r=�ff��a�߁
���:��%r,�L�>ӑ�?�9؋0�j���o����H��$!f�&#Ld�%.ۅ�M�ngh5��@ojM.�Tz�)"R(erܪ>�����c��`��B������V���pB�B��E����O�0JxU�"������/U���J
+�*�Q���2E6;�R��
�R��oN`~Y��*�
��jH2{��^�5@�s��8�O0���f��뤙��Kv|��Cwj|>�T���3����a%��T���+�	
�U�Ȧ
lob��oq�2�Ƅ����_A;]�
���l��¹�g�}�˸��λ
邰s��6&�B���=���6�Q%�S{�\�C�A�=
��������3ehX��:ggS�h?���}���p�=.�i(�i���*�ބurY�u-G��˴)^�� \o��j(��.�����6��6�mɚ|�}'�L �
�)C� 9O\�A���{���4�G��	��y�
���1�'�(�H�#�Z{ڬ¨��/n��j�s�BFޞ	�� _s{IZܼ��� !RwJ�q
2�S̗
�?
��?�N0�S�%C��[f���Xͬ p�{Q;Ĝ�	��S=W�ʷLͧw�
��Y����Z�Gji�T���o@'P��x��!��3��>�̬��F�'[�˚W;u�{�
�̭Œn	2�הFh�=r���a�Z��8�V8�;��l���\tc""�
�
�8cl��K\ؗ/� o.o��^��
lk_:M�K�
Uw31����T��8�K��c�-�k�2
��]g�h��230������D�R�)�dC������D�N�xW��3?^���~S��rq�2��f�+ z"�j|tY_T�l�
��8�y\X
�T��
+�$���  ���\�!�d�����OAT��>���j�N�;F5�R[6+Ĝ�^
�F˄ug�s{�Y/-
i�Y ��t`7r���-O�!�g}� �������<W�����!hҢ'͖0��+`�z�!T�
���'xX��)�_.�7��қ
:<9Q�[�p�0�_֌Ou�N��uJ���
}K`�9��U�c^�lj�����"�!�#x8�X���?�׌<�G�m��4��@X��5��O���~�4ɥU8{��:�}�ɾ��_7G��`W��A��6.�k��e}&��W�MUB~﨣��$�98��w�7�®��p<��䡎���5��m˝l��I����
#o�r��;��P>�xRg�N�ב��
+d�3�n!/�2F��W�(��5*�~�!N2
��
+�>%
�!M�o��v�Y���I
��(:����@l��5W �84�����
�:��.���ѭ��#B��~���CIbMQ�)9�l
���nһ�{Tw3���ٚ%,D?p�.ωEOPқ�o��a���]W:��(�)s?�f�?0
����sG5�][�.�K5��c��
�P�Y��3s�}��I��$����$@
�:
.��3�s� K�P���
���ȵ��)�+�
.Z���(�T�B��(�;
Ά��# yaH����� '��4�L
+�qR�x̶�!f�mE�C�WԨ.j�*��,^9��s�Z!�D�Tyq��0��f����I��
ϴ� o�т���#�����ڔ��߱�"�F
�Rh	!N=�F��hA��'LFzfDT�<;q��h�t�g}�9��E$��I�#�����KVqW^3s]p����g��c*��I'ʔ�t�Ҝ��	�5	�������Z
+������j�>��(���q��	��
�W"r��]d"�˅+�*������0�ɋ��({$3~B?�
*��W�S��3��2���j�`3�Gx�T-;)���)�(@��@�G7��2�h`ٶ�����Dް���s�
.|B�3@�K���(n9:(nĠ���U*�
��#��[4^���`S��qH������ ~�!��.��^#�IZ�\p�Je����:�yJ�[{v2U"�.y�
+��!8u�P'Yp���2p%=�f�rF

_3Q�#���S��:�#|̫<��aM[�z��PXT�u�.�+���y>�2������`o޻f}XuA'K�W�@H�
���]
m��3]�\�ԙ�G����=��G���o��
��͉�#	5,C<���#
�.�{�?�"E�
�Y�G����u�Zr}G�%gOE��Dk>�:��)d橒j�\���H��y~���y4�M��0���hCl�r������qNJ�x�J��8
mB��|C�����1=s	g�)��#�3Z7pò����	�\	�$�*Y���lc��5�#�ȯ÷\�%��
˔�"��%W���C�	���0�$�@�T��(�j��Т��g!�_�eS�@�g�k�]�Yjj�i
�¼�j��
+�u?��@K*GGI
�Vٽ�@Z��Q
FAw��^��1C	
߀������o���(R�
/a	L+Soz65�Y1��{L`��aM��!���M �Ү�a��o6/��dr�ƲD�+<drd���>\�����M�o�������8�Kܫ�U.���ߍ��l8�������ߩ0�s�;VwA�LHԪl��uUmŹ{R��\ )���U�+
�s��P����'
X:���'s����|k�endstream
+endobj
+568 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12690 0 R
+/FirstChar 1
+/LastChar 120
+/Widths 12691 0 R
+/BaseFont /WIKZRB+CMR10
+/FontDescriptor 566 0 R
+>> endobj
+566 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /WIKZRB+CMR10
+/ItalicAngle 0
+/StemV 69
+/XHeight 431
+/FontBBox [-251 -250 1009 969]
+/Flags 4
+/CharSet (/Delta/Omega/fi/ffi/numbersign/percent/parenleft/parenright/plus/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/bracketleft/a/b/c/d/e/g/h/i/l/m/n/o/p/r/s/t/u/v/x)
+/FontFile 567 0 R
+>> endobj
+12691 0 obj
+[833 0 0 0 0 0 0 0 0 722 0 556 0 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 0 833 0 0 389 389 0 778 0 0 0 0 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 500 556 444 556 444 0 500 556 278 0 0 278 833 556 500 556 0 392 394 389 556 528 0 528 ]
+endobj
+12690 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 1/Delta 2/.notdef 10/Omega 11/.notdef 12/fi 13/.notdef 14/ffi 15/.notdef 35/numbersign 36/.notdef 37/percent 38/.notdef 40/parenleft/parenright 42/.notdef 43/plus 44/.notdef 48/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 91/bracketleft 92/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x 121/.notdef]
+>> endobj
+564 0 obj <<
+/Length1 788
+/Length2 1456
+/Length3 532
+/Length 2036      
+/Filter /FlateDecode
+>>
+stream
+x��{<Ty�S���ƺ<�丅i�cܒ
1�)&�[��cf�8�1�Q�3�jQ(bsyl�"mC�"�"Q䲶]R�R������i�|����s�����|����}>�h�9
�#����zx}�`M��>g��Ҳ�@ ���@.d�MM
 [�_�=fD�� �X#�|���:ֺkC� )�h 
P at .
+y�@6p�� ._ �� umG(@�B!ND�G�� �E�����kD�p ���ϭ0�*�t�1u$
��|�����i��忁���-��>
�ًr�K
b����#A�<.�(
��_��A��(��
��k��,	f�! �Ib�ڲ" �#�Kc ;Z�!��%�(�u���
��g����
A�u��a�6�^���E�pX�N.^4(�?�|�8��!t� 
�F ��|Nde@$�� 
�C !����W�E 
���4$ �`6/tM�$� �H���)�X���Mp �q���;[Y!���x@π(� �
S#bԿM�x
s��(Qt�� �(h��h��gmoܷY�N�D�v\G�Y1���+k���"�Ic?rA�p_(͖�6">���
�\s©�v26$�|��H��Hvd����l
+8X}^0&���q�ؑ����s
E
�S�c��:�_I��m��
+�Y�gd�n��vI�����F�9R�h�0.s.���vA�	RU{�����B�ԥ�+��
+�C�Q%P_�婯��_.J���X}�|�2`
� #�/����yr���F�9�dJ�M"%lS]㮶�e�3���|�ЪV�E�\x��P_�o�2��5��ϝ�⎩
+�U��]��+_�h��������ڞ�Y�c��kݔ
�Q�&���9X��[аs�vS��3��=W_
��!/�hk\�g��,
+�Ud��<��!��̫T��b=��uK�[3}Ǻ����ơ�#y=

�<�|��
+��FCR�o��oś�ę�Ʀ��x�?,e���ib�vR�����¾�}���XCP�?d����O%�_��Ul۞!�G;�
��ڗ'��1�4界�_5���v�q�^�G�9�y6ה9�D}M��Xf*�g
?6;�;O���{q��m�����-�E�b��׳��
��X���Xi^�%�f�q����!m!Wp���D�!�F{�;Rc��E���'���UI�7]Ŕ������|�x��&�8
�7�;�2;b��yڭ.J�X�Q`�r��!)��@�g��*�F!
�
�\�_$ȺG�)�OS�,��h|��O���l/
�H����Ȥf���̷�T�e/��&V#���D�=��R��G���\ヿPs:\�Y!V��W�
��ц_)}�w�"��ո�I�<i�a�d�X��m�2L�����
ټ��j�8�Z�����3-����a��K�#M
w������s����DLR�fA��HG�����ww�鷞�?D��{V���z)uMb��[
ٳ��Q���H�^���#/,��Zё�K[m;)s>�k�
�,t�eN�{,��㞡Nֺ���=���z�k�I�!l��nh3��pu���(�1���
e禢	gr�U����M)�сY����Go;b:�l�d�i������m/�M�)�,��^N�K���)�Kūr�ˆ'��
��c�'Ú}�3�BI�b��xY\NȠ�	
j �w�B�h
���bMb�׉38�=����VAZ�w�-�k��M��O`���Ƌ
+��B!G�9
�l�zq��*�l�o�X\�`e�R;�Td?����'��g��Y[���JvC����%2�'��R�
WJ�.�K��^�lq?���|�Y�V��
U�X��f�х�zWto�<	ަ�;W�ޒ�uC�S�\t�\
+�
�{���N����X��d'v9
ʸh�
{�gIט��+qe��kA�i�ɘL��U�܆����|&��
&.f"n�*
+�{�nh�� ��ލ�
=q���]%�I�Hay�\v�G���)�		>/�ι�Fˆ�{6����W�:�<:Z9�.�!�l��IڧR�<��	�^���O����"A '�Oa:?endstream
+endobj
+565 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12692 0 R
+/FirstChar 43
+/LastChar 80
+/Widths 12693 0 R
+/BaseFont /VBUAGK+CMR5
+/FontDescriptor 563 0 R
+>> endobj
+563 0 obj <<
+/Ascent 694
+/CapHeight 680
+/Descent -194
+/FontName /VBUAGK+CMR5
+/ItalicAngle 0
+/StemV 89
+/XHeight 431
+/FontBBox [-341 -250 1304 965]
+/Flags 4
+/CharSet (/plus/zero/one/P)
+/FontFile 564 0 R
+>> endobj
+12693 0 obj
+[1028 0 0 0 0 681 681 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 900 ]
+endobj
+12692 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 43/plus 44/.notdef 48/zero/one 50/.notdef 80/P 81/.notdef]
+>> endobj
+487 0 obj <<
+/Length1 1006
+/Length2 4498
+/Length3 532
+/Length 5189      
+/Filter /FlateDecode
+>>
+stream
+x��g8\m��-�(�c�x���5J�A
����`��atA��!��D
�� DI��-J�.JG��M�s>���\g��������׺���澦�/����#հ'Aa!a@Ӑ.�7�2i��bT̜�2������l��Iqы��P�ڻ�PV�N �2�� I@	�ġ,�0 ������aaf�c-PH'w!@�������C:"q.H���0�@Y8�H+�
�S��
H�mF8�����9^�x~��.D"�;w ��$kc/�!/��o��gr5g;;m3���?���fh���`���NH
 �"�8�?C�"��C"P��z5���PJ+;$ (,&�ێrTC�!�('
k�����ˎ� ���}�t�ՠP�����/��
+�t��
	@~�b��|�"
�
0�A ����V�QKc�E�0V���`�Ù��A.R������t�n��B����1^�%G��TE$ 0�����ť��6��E�퐎��
� X�7]$��o��Q���e���&	����Y��t1B �
+`�(�-���ʨ?��xQ���(�����0�( v�/�:���~��na�
C Aq��@a at R
��_�,�q8$��׫r1
�bK�� !�nH
�����S����\o�̾<"^G����]��	�BkӲ�C�w�w�WwA T>M���B0�R|��Rɳ�>8`
�FIϛ��O�e�����=�����4α`��k��یK=Q�֊�d�F(a���ٞ����q�x�b,�������L���Pl&v<���A�7��̍S���	��Ra�F]�ghE^�p�$�J�3�
+c�
+0��
+�m��y�Y�Zl.�Y%!~�xq����ۡ�'��zQ�(��d�v����#�
Kk-[O<
.P�Z�#��B8���yCm��ؕ�-h��`���ɩ7�%gY�ėVS���e��0,�l�N��?濟�n��������|#�&�@F�
���]�����wi\�����f%U���
+���X^�&I�a�N}?o
����HPPVX4^��Ai
�n�.�['�G�g��Ŵꑙ���8E�h���[%M��S�;�Y[��ޚ�*��a�l��t����}�)��a��L�r���K:���7��x��	���=���]� 
&q˻�{
+c�7� �}��f�
�4�j�M��
�������|�m-^k����h��ԤPۮ���'��>��t�
�t�7�A�^`)I;���b�f-��_i1�m���k
|����G�ÕM7r6o@��m�J��#��bm;�J}��
����~j`�A���Ǒʰ����{�U����>�'��x+�+2�B����~ś�ā,�Y	F
�:$��+�|*P^Q�M�s6�̀�h�"^���5gȑ�J{�P[
-��Ҳ,m���{��ภ���y�
q�Zk��-������y64H�=�g�A���(
������o�[�*և�$-�\F"لF�>��������}�J�������J��!�
3o�_Ϫ˽
H�S�����G�ݧI��g'~��c���t�N�^>�� �$�2
+f7���o��
�o���}Ӟt
+.�	~ڞg�Iُ!��i�IO�F��w�$s�y��-�4�v�
+i������������Ī���
Y���*\L�F�vx��ݵ�L�*B�>"�gL�$uĪ�N����}8,7�߬1�� t$��w�m�s%�h�
AU�`Y���YХ�;A��6�{a�6�N(ɔՅ<K�KkW�X�bG�}�����]�
���)�ʃ��>�3y������n���$��X��A��R�Ȫ������ÌNb��-���/�o
+!��`
��o���w��n�w&��}�2���PO]F�ld�=
�b��0*��y!�pcc!���*_;R�:�#g^�FXP]
�8��B;��rU�\%km1<����;���;=qL��
�
��9扉�_�'Xeω�8�WoN
=L�I8�>��aL��ߞJ��3���w�uج
+�C���nV�#����c�[p-1כ�Y
+��@vs�KY0���Bw��ʞ]
iP+��j�j�@���)�����=a��(1$�D-t�j�WM&t���E?=zR�l�82�Qt���
+�B�OxN0��n�-�fS�}t�&��	�ߍ�0ٰ�&��P7�,*ͻOב#���}S^s��B�l�qC�
;��I!�
j2���u��c��:�xf�<	��m���+�ե��4�1���M	R�Ƿ����D
*�<�5����P.��s9����Ĉ��)�1�>��>�7�Ti<�%V]q9��ŒsпjBM�9�S�P[���(9O�Q˥���"�Qjb�0Do�����ZD�|x�fq�w�8��[`�T���Xpz��T�&pٮ�m�<7�՘���bJw>dt�nf.|q�n~��+���LN����o�
��/����E~����W�y5������pi���`���{���Q.��7��-�O�t=���45�z���H�}7mlL��P�IDF����!����Q\A�An7D�:ϐ�ؘ�3�>�ˢ,�3XmzY�(d�O#c���(�7G�>S�d��
��\ܵ�~�$?EC�V�N$�4q$���Z}���^�+xjsV����?q+VC|�S�-5��,) [...]
+���A�+�H�v��R4#L��h��_&�3���]63F$�UмP�0a:y�J����qD����#�;��`"N����\�N�W��^Æ ʂzY�
����yB�5}Ȇ}��~��dEB;oK?!w���?%�u��|׺RoY�0��c��Y���)N�!�T�٢ xz����݉�9�K�BFd~�>��g��I1��˗������I������}��~S慵���,
��ry�?��9y*�4WdG�zrv��҅�~J�6hCI�E���ƍ]K�$>��ިyi������;��GR�+�13��W�����{l&GZ�u�:N��-���iА-����- at RUV at c�I������_�pr@����E�h$���ky��/�1Y�“%�7��q��كCL���ޗә!��I�P���j�J�B�]�XGU�����O
k�+`%Z����S
|��m�
�z�y���or��첗������Ŗ\
���>h~ߚ~W����s���~jĞȼY^�ᶬ��SO7/U��8���c�]k[B�N
N�
+�B�����z�t�	-���ikh!xȺB�>�L��6Z���=C�
�ydK°��
k��)�h!-[Ke�^��V<���
�-���PF�,�������.m���wb���W�ИC���&̺�;�Okܻ�^X��mK
������+
�F� �LF
i��?���y[���r�9
��L�A
�
+Ei��803%=��ue��0�y��� jC
>Q��8`��zB�I޵��##~��G��=S�1����Nb鐚��w�\˵�f�7�=5--��"�k���4q�럟L���TB=<<KMZ���y��ps��5�_�t�F)4�Á���Ę��� �P-�==��[�*1[�L��9�lB�
�tݜj�!iѡ0H���2}(��ɳ��
�X�`���e3'=7��!�d�o�����9
{^]ɲ �+_�c��m�C�T�g�/��y�|�D'F��@�vz)T��
+4-�-*�~{wf���_s
a�
#ЁŘ�Bjؓ����$;���[��dn�ˠ�-G=�,�&l����4��I�7�J��
+����}��%��y��vg�`������:�Dî&Z.,��^�IESa2y�TS,Ej
�{j�����3�}�ԑI��.J�B%⩪��4��Y��ps-��Z��w=*Q.%�%٬�q�m0��B��h�a�Z�+U�l2�f�5a
������w����j9si����j�w,Hq�ƹ����ܻ�A�v�
ă}�Ȏ�@qW����R"���L��&L~d�usaԕ�nb�,�GE�5s}��܎��jZ����:X�̘�,��!��
+�}�i������v��PW� )����1z�^/������3�R�m73�6Y�ި
_U�v��̅��Rnʗк����bm����d�ü��
��n��g;K��C��IH���
y��6��=�"d�t��c���/���HI%x�%����}f��Y�0_
�
o�Wq��V
oX
��k�TOd
s]3� ����$�#G3������lșLj��%�������o�F-(��$�.1��HW[�a
x%u�f�XF�\=g0ب��y@��ncU�Ku3e��xw��<<��
���,��:%�<8��{��S++��|�
[

a�*H����+kj?�1�o:�P�H(�"�u]�
�l ��5Q<
�
�IJ�������U�Ȩ�WyTew�v�d7�໠3�J.����$M[Ǚ���[&g�-��̎,
��p�s��
��
ՠ�'�Դ,7ǔ$9�4�o��p�-����r�p�6�I�ѿ�r��}d�jb�<=��D����i
��<1g}
+
=��:~����2�S�C�J��LU�R�ki�R���'�� �����2�W�c�����*�Ti�N��y&|�����ɱyH߹�q�h����[��Սlٗ��}8���y��������g�5��q,ͮ��}��1|��t\���>�u�Е�ފNjܑ����Y�����2}Bd�ig�z@��t������Ӣ}�Ϻ�S��"����&Ӹ��[��mЃZ��O���}�G��I8E��^9칑��w
�/�[��e�YZ��zy�!5���I;���&�\z
܁�-���|Q�W?�Y{S�Q�Q����l���(k��(�>���HjP�v+b?�h8;<)�)��hi�
+ٸ{
�v�ȿ��3�-|RơFM`:���!�i�
+Qhm�JA�oII����{���U��s�T

+]����>
ǓJf���i���
1R��#n��T
Z�;t

�s�
!�3�
�)F�@2��3���i�3O��XW����J?�&-{��V}6g?��F��4C�\z�X��@��7���[=���6	x�a�}�:*�C����'�?���i�s¢�p�d�g(d�endstream
+endobj
+488 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12694 0 R
+/FirstChar 26
+/LastChar 117
+/Widths 12695 0 R
+/BaseFont /FGGYKS+CMMI7
+/FontDescriptor 486 0 R
+>> endobj
+486 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /FGGYKS+CMMI7
+/ItalicAngle -14.04
+/StemV 81
+/XHeight 431
+/FontBBox [0 -250 1171 750]
+/Flags 4
+/CharSet (/rho/comma/less/A/B/lscript/a/c/d/e/f/i/j/k/m/n/q/u)
+/FontFile 487 0 R
+>> endobj
+12695 0 obj
+[593 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 339 893 0 0 0 0 859 863 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 478 620 0 511 595 542 557 0 0 404 473 607 0 1014 706 0 0 524 0 0 0 675 ]
+endobj
+12694 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 26/rho 27/.notdef 59/comma/less 61/.notdef 65/A/B 67/.notdef 96/lscript/a 98/.notdef 99/c/d/e/f 103/.notdef 105/i/j/k 108/.notdef 109/m/n 111/.notdef 113/q 114/.notdef 117/u 118/.notdef]
+>> endobj
+484 0 obj <<
+/Length1 920
+/Length2 3636
+/Length3 532
+/Length 4284      
+/Filter /FlateDecode
+>>
+stream
+x��Si<���Fv���<B�23
�-�ز�k�
3�fa�e�}_B��
+E�^KR"eO�d_"�
y�3��������9���<ϗ�������#t1DW�!�@V�(B��H=sPR��KI铰h��`�&c�uue �� j r
>���.��ɞ ��w%� w���%a
��˃�� ���t�X������t��8 It�’)�4
}�����Id�e&S�ob ]
@���X?,) �Qd�@ ��p�zx�A?;3!���f��Ͽ\X��9@�֬, at kC$�(����ADZ.,������)n��Y��4����7?�f��qX�?	v��%�c1^��zM�h���.����M^~�^AX
܋��	��q~�_v,��Դq�J
�3�3t@���=�r��^�5��/ٟ�_�7�M�����`0�F����r�G2����"x J*� �DBS��4)% x0�  D��H �i!��?9�vd$��kTU@X���%���6� ��� ��� ���90 ���hL��� B��h��!uZܥ_��G��G

+V�կ U��D�Pe@]	
�_�n�$�@�u���
�{�օ�a��ߎ�4����b+Ca��ULg��<
�Y�w���5q�
W�w���L��~u.�2ӲX��I�ĶkV�[�i9c��.˹W����5�,��ލ����4�uC��rx��2ӡ���ӳ�p��)q�.T at CW^����a.�&.�8�;Ƿ2
7
ȝ��8�:*�;��Y��gb����R֢�Cǝ���o�2:v�1j�%����1拶=9_��!l��As������U��#�QC\��O"���QO%]C�r�R�m�K�4=M��Ť�ܯ5�(R
�����u�1
�h����j��c��w�[��/���;�u]+�!\Fh�
k��"U���'����/
�Idu��Q�3
+$��G�
���s��jQs$k
+��J�K�(�h��__��`c�2�1qy���?n�$y�����
z���W
�#����'�
+�fZ�<T�ԁ���ٜ8r�X�w�W�MVm�y��&�� }�c��

w��2�}/����J;�.��Y�����o��A�;$<�E��ƛ!R
�tf�x�
�m���U��g8���CK��\n�͑
�iѓf�o~}e
a�� $m�}�����W�e�
t�9�+��C�j��?D~4z�g�X�И,뵓6q?}�6��<ޛ�Asϯ��V�K���+em
+��
����Wn*]��
&�2���jn��I�M'��
�k���m8�����ډ�q�EH��%8&
�)-��T��m������
ؙ�̱q����P8N��{�VuG��Ե��)���Ǚ����������R'ǃ:�G[�[�׫ IY�9G
T�b��%Vu����X��~3�*uJK���t�ߧ�?=�+�yGMPf�������5YCaSz��fJ�Z"O���^���@k���!Ve}��Q�W3	�0SicSc
R}
�|��! C�x��:�Zrf�$SH$����(�L@��[���h
u&����V8�!
�x}(P�9߀�N��sK7L��d��1�0Y�c�ٳ��Y�
���a�G�!�'P��ν�-�*��w�Q�U(�6k����3��۫p�E�L����?�;s`ɝ
�ׇ}�M���N#��
��ƢgŎ2�b8��=+k�

+I'ן��X���_:BW�5�4�r�$����M���h�ճ*�[��(�Eӌ���`��Q�~�L_ǝpA�ON~p��h1C_
�����q�2
U?
Z��C��4/f
��w�0�����@������{.t�
+��
I>܊��mڕ��B���CVU����㝠BH�9�7x>Ã��L����w��,G��ٻ��Ea��~���
�Ndd�

4+h��Ǔ-ؔ���-i�W�;_�S	+e����.BEz�1B���[g7��7x.?�v<���0|��c��Z|�'>�@�s�n���ĥ�|���с.:�k/�>�O� ,���/�9�Ni.�9�"ߘ�E�H^���1`��~���"��R�n�
h�j+���:o�U��BW�)Ӥ�X����G��C8�m0,��,=�p���
+ۻ���n]���|O�\󜠠A�����98��1&ܱ�a�)
qR�
;Sj��}닋��`�t۴;�Q!����G���ޞ���so����Z���p"�s��A�D�ѳԗȩ��A�
y�Ko�g�P�N.	��o�\42m�{a�'wG8p�
�����$M�f=�����P>dʔ�萫���bEi�S�xӌ>
Wg�q�kEq�:b8��
�
��	�
s�m��3��t!.i�m8��ǮVx8χ���i�μY��޳�{���|1;
�]�Z=�3�C

��+i5,����W'�������a��
w����%�'���;�wk1�i/
�w�Zщj]MqO���z��
e���5n����
��c�խ�3ێ��)ٮ�kG ��_�d�n�
rB��Zn��i��Y��Ro�lׄ�R��=��]��ټ<}�g&	�q��S�ooz���G��.Z��⢎n���ǦW�
�Ծg�-MK
�����˩
�z���'�<HpI�z ڴV��I��a&�c���W���;:"�3
+�쇡!c�]ܬY�O�ݐ>۽o��B~ ��������-�rK
]��l��
+��M�G�����wP���ةFU1�Oӟ�F�ȵ��ߧ���19�'�ܢ�D���܃�r���(����@�p��'u
4
R|C�=�|dbG5�
���)���!��'�P_��šg��ĭ�3,Xy��%3���x`�dy�i�'�;mm��EQ��spΡ3�
���h��h�^�a�����+)H�p`걡��W`�<��.�[S$�]��/
sP
n��u׼Bv�����a����$#���F5j�rd�ݖ�V��y4	����6�]�oL��T�\F7Ǎf��8w�3����ĽV_�-w[��� Q;
�P�b}���kc��ujf��������6wV����x�)��Z�
�׊� ]�}���k�_z?*#�
+�K�� ��{�����s�L�X4M{R����:hSU�h�D�nH]�ʳ�D��8�x�vjRX���O�~>��
k�z��O؜
��d)&rN$N�Y�*�rr�&3	����]�J�{
��[
��+L��ܗۛ7�o�+B����XwW�e��+�l=Ȣ^����x��r�=��
N�k�o��

V��L�˄��9\�f��,�Ҳt([фPi�lQ�ZR"<���Қ�����J�C�M�h��Dǂ���
h��aF��9S:��!5}`8E�Ky֤Jį���k��y�ne�k��y?��%��N�f�C� ��Iz�V��
+��+�gDܓDž���>����9r�U5��O։@��|��w�X{�����C��
����¡h�d'
s�Ғ��>T���ٙ��Yn�Y2_�j�Q�;1�Q~'%*���ة%i�
���ȫV�+�q�}�@�H��\h�|��~]r�Շ[A�D�]���	���c��
��
�
���wm~+~
s�E�kQ��*�1_.�ʐ&�0P̃v��l��3r��LSb�
F��8�*y�嵳�s�
��ǘ�l�Z7hfؽ�.aʳ�(��ZJ�����f
j;D�`sV�/��T
�E������Cf�"qH��3U��Sg�ߔ~�̢2�f+A�+C:����}�'e=�<E�8S��̠������؟��3�dҼzI ,�Wim�.cjb��h���
�
I��wIT�r�|��I��mU
�>	O�㌞oe�#�3��
��*�C
2;����4��[ơyt�}���6������ː�jRy8ro
Ĭɝ*��J"��[;�ϫf71��DM�r���lhĸCN�*ka8o��#ݘ9
� 'W��d������g�Jr;�A���ÒW�
g��W�s.��]�
+�Y��@:ɤ�H�~�Ɵ5�C2���5(P��{��喐1��U��m�{��GZ!7=��-u�D�x�Eq+�`d� ��
�F�o�y*�E��j��{�p��L���m.jY�Lf�|C\�r�g��7,ՒB�Kk�
�{��G�NL���<= 4xo1Ϳ{3
2Wt~B�Og���re��
N���J�\ԕxXG���
��o5Fm�G,��WDN�1��z�Ry�yfT�t!scv��
W�9,��%ߓľ:�ے������=����
p�^�r(�.|f����T-�֑U�F
��R�k��$(uv./&�*�n��߸p�K�������	7
M"�h��� 3B�kendstream
+endobj
+485 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12696 0 R
+/FirstChar 63
+/LastChar 90
+/Widths 12697 0 R
+/BaseFont /WJBFYR+MSBM10
+/FontDescriptor 483 0 R
+>> endobj
+483 0 obj <<
+/Ascent 464
+/CapHeight 689
+/Descent 0
+/FontName /WJBFYR+MSBM10
+/ItalicAngle 0
+/StemV 40
+/XHeight 463
+/FontBBox [-55 -420 2343 920]
+/Flags 4
+/CharSet (/emptyset/C/G/N/P/Q/R/S/Z)
+/FontFile 484 0 R
+>> endobj
+12697 0 obj
+[778 0 0 0 722 0 0 0 778 0 0 0 0 0 0 722 0 611 778 722 556 0 0 0 0 0 0 667 ]
+endobj
+12696 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 63/emptyset 64/.notdef 67/C 68/.notdef 71/G 72/.notdef 78/N 79/.notdef 80/P/Q/R/S 84/.notdef 90/Z 91/.notdef]
+>> endobj
+481 0 obj <<
+/Length1 1647
+/Length2 17446
+/Length3 532
+/Length 18368     
+/Filter /FlateDecode
+>>
+stream
+xڬ�c�d]�&�v�ͨ�m۶
���Yi�vVڶm۶Y�[��������?��G��k�x�;F�}WT�2�5���8�1�3r�-���
�m��m�d锁��RNFV��:6822����������4�M �� &...82����������RMY�����?%�� ���C������@���hekg
�q�
���,� 3K+ @DAQKJ^@)!�� � 
���llei��4�8� f� � &�6�����H�K�`p��X�u�� ��Q��֖����� s#��=p�XژX9����_����s��ka�W�L���������	�7������t�0r�'���_5��쯥����?%�K��������ts�'�1`j�hge��7�_0;����hic���
��F�V at Gǿ0�����	�_�7���r�����g�N�@+3z8&�1M���6���c�g^�l�lL����:������Q�33T�02���r����m���P�߱L��G���-�����F����������B�;[Y�Y�
����Ecd��k ��������ci��s5���r�?9�Wk
࿳���U��B6��cb�g����Q��
h�h�db03��ۼ��lL�V�6��$������N�����?l��[�1��5���_0�*��i������N����
�?"i�ٚ���?P�¶n O:&v. 
3�����:r1�z�o��
��?�rFN�n 
FzFF&�������I���ؚ٘�3G*NF6�G�
+�Q�8;8�e�_��o��q��% ݀&p�K�&<�?R3Ҝj�r�&Du�z������U
�}�l�}RCw��
߫����?[���>��Gz0�(���Wy��$T��(���
4��
�����5"=�d�!���w'����ޡ��Y
`���|I\�}�I������`t 7������'�<?Q
�
v�B�
��d����@|#�����V+��F��m,��Ob[!Lc�M-~m��,�O߁���rV��##{�H '�\Ć��
����c�(��y:?jM,�{\��Tw��e�i�� ����.[��nfU���'��4elu²�� �ǰ��Q��sU�]�[P��~Ѭ�x����� ,�3�_\�ѝ�D?�5��:���� "y�}��Y���1�8��w�F:���T��U��ډ
ц�0�?"/�\�-�
hVm�������g����
Y
+>J}\4��
+���/�#b#��	��m8��ٯ�����R
}I@
C�l�A�)O��s�䴟s�V �	<�r�;n/	��ms�yd���
��5��
+B)��� g7��G��������:�
�OA��n
beQ%+}
>{kg�
.k�%���g���´���v��[���X���ӝ(�r�{)�V��)���G�fq��d��Ձ�y�NN��F�
+|E�#�A5h�6T'xi�(��L��nF 
F7��JG���GsV�c��L����Y�q��5����ȅ�
�K��<�Eo at Lw�{U}����šMHxSu�76��^�~�������m�YhpMX�?Ƅ��y.�ͪK1,�s�/�� ɱB��p��I�3G����u��,��
�,ΩY���>����U���i�IS���4
�I�`���Rdr��C
+EӴ��H=SkFc�:�ƽC �1�H�Ǘ�*އ�l[��Bs���D �	���R ���vP�/�pT�0N_M�τ~S!�'
� ա��ՈB�RLú*��Uӧ��Y�Q�
�����
�$�ꄍ���ε�a���
d
m�Jn0�� �I=͊�!���M���8;9��)aqv�&��Y����I���r9�S�
�"�Jg��=܁�^��0�ǐx�D�{��%�!��ȣIH��ٳR��y��y�s�N([Z�~�+��.�0���}c����!�G>�y
�$��۶��
>v,gN/��c��C�2L`[Py�	b�w���
���� j�-*�2?�"��J�~�Q];8�"%�[ʗ�`N���O��8u�t��)(��1S	+X

�R�gP֞.qw.�
+�=����y�+��k�q�Cȼ�ÉL��@1�b�8?Ȧ��G-�W�
���q�fX�oJDfnt��ѣzQ*w���0o�"����A�Q*u�V���I>^���"��
+��dTLn*k(�A�
F�������ir�#���V�2�~��l�% �&ʤ�j�}�q%�h
rd�-���x�v�	F�Й�9I5	�6�b��J�yt�PƩE
*�&��hv���w|ȣ���m��5`Gԥ�k.�&�!�i�;�����������r
SuB<�'? �EW%f}���=����p��M^�?�R���o����ä�5����w��z
+�*o1�pt�R+�\�|/	Ct�pMP�JA��GV�ڜl�.����ܥ%Ң����Y�z
m
X�uS>�z��]�S
���+f�
��t�Ϗ+"����I\����,M�TB�T������ų7�:?"��
������ݤvi������#����f5(��>	
��}�.�
� ��R
j�X�
p��^�\Db����Vl�@�R�_����g��iQԥ{�n�`�PX֥�қ�*?��S[��$��
[�z�:g���큩�OX,/L�}į
G��������C�F�LD�
���\ȹ�
+
�9�J�G��7��Cy�!�h�-�Jxy��RE��
�W7k�
i�5^�����
�r��F:%��?>����Y�ЙP,(��x1�P��
�y�j��-k/�p��>I$�T
^Q$e)	#W'����&
Va����m�kb �����U�`��S0��-<1�Aש�J�4gjb�2_S�o��	*r=����$�����N���@���pm� A���{��
c����D-*N&�F�d��5y�8�\H2�Ǯ����}L;{V�l������+v�K�yD�k&�TՁi_���1K��׹����C�8,#��qWb"�g����8{�W-mtc
+�M��i��v�C�+2��e/�N��bsyT�E
<
��O@��x�.{�zf�˞�ˮ���q��2���2�o���OJ�V�@{�fP��=$@�+rx�o����������v|��?l����؆�܆Q��OH�[F{+K��0�
�Q�q��-L��4��f�\U'�v���@�������a�as�GE疘�ϯ�˜)<���QF*r
+V����Z���,��FV�ZU��ݶ � ���CU�����%E�\�Ĺ"2�}����}�+¡��]X!��Wu�؆��
��E��GKM�,%e)�� ]��v{�N�|��>����Fʬn�1Z�7ؒ跓���8�'�Ls��^�G����v���o�\�q�!�oQ��G�0��M�����෹����St��5�S�@L��@��k�J �u-�pɉ��Uj��
H���8EW\�g֬�B=�w�⪧
M¥��7�tXîdR��n?
+�~�;Qm�YB`�
]�"l7��F Y�S� ��
�}��Tf) ]�D>�I��ߛs��A����rbq�.�ܪɚ��5bY���ex�zDl1}*�-�1�L��k��u�(>��p����`���+9�G�
a���^��HÁďc
+��ٟ�2w���:\vĥ��q��Y̍�$-����8��ơ���J(�v�
I�k(J���)�Aj��FZ]]>�j��߫��Nk�_/&w�p0�1���톡�o+uᄕ/,��,��X.E��
�(��K5.��y������
�]�t���M}�~fB]����,���l�*�[�U�
&�;
�E
+�R&<20�hhcf->�Q�e6�)��
+���D�tD%6���(]�I��M��������Ei�_�	2��5�m�6���SźǁH�sU�/&'3�>�q3>n����k� 	�T���?`��F+�yA����
�N��R�Z��2ݠ�hy;j
��{��fnu���N��v�;G_z�Ѵ���Z-��Z\}�ܭ��>�z?��B�Sb������+^4�z�?b~�oD�umk�5�(H�X�`,�z�*L�la d�=� �$5�5�"�Ef9���՘
�}�W�́�U��������K�1Rz�
����i�
�
]��Ͽ�#�ޣ^��
���˼��}Am������p�ۧ�ߣS��/���!f=����Yy;~����m�HeF/�A��>k���W�<�y6����qR�S
@+W)
�)��CH�J��+'\7T<6e�"
7���f�
k��lj����弅��2�s�xڷ�/�qH���*���
�Ni,����N{:I�,��U~�9Q��u�}�Չ�GR�L�ߞ��s[��ŽW0n�56b�_�y������P�I+�^F�X�MH8J
+;���
Nz��Bm��Y�}����j	vjs�&�_Ȃ�ܳ��A��
���5Ų�h�3=��UV��V�i��ߊ�/DF�b��(���m�ϙ�5�˞ӆ۔p�CD�8O��P��	W7�)
��x�c6l����d��_��L�]*�����]�|�����Fz�����_
�EGN&�\Q-R<�~&x�1
�*m/��9#�r�fJq=����%6.�`l%�Oq
�]�.ۆ��e(=����SRYd���zutO�:��U�~�у�0݊9�+�9��f�
��2��FWT*�y�f)����JB
-����E�]?Ĉ
=4UHѯP
�I6�!���䰡����8=^�%�UR�Uu/ORp�-��x!�ї_�yNa
�KݑJ���ՇY��_�9Y��J
��כ��h>�n���U}��{��;��!&噡�z��{HX{�Q�Ax��B3���	��!}�1eC�s���x~�-�� Z\�
.%
�|���� �ai���'���V)�1�S�d�-ˌOH%��ܛw	#�d�P��$v�
tc��^��f 
�u�
���*�#����fZ�I�f	����c
��-�#��6(��
Q.%�
�%��!����mh��Fx�<Mk�vc�0��rŪ����9�442�	b�f�����-/�9|����0��f��>#�0���jIJNFX4�Q��ظ���^8A��o��կe>.�Y
r#��h�j���fz?�*o� ��$����>a�G��8C�7,�~�%���
<��=�z���͵w�5on%����J���!�}���A��~k���@��<[�������@������Q�
�

l���l���n��Zµ��R����D
T�s徊���p`�v�4�3,#�HS'���vB��3�"�짨�[rFŽ�l�K�۟Ӑ59
�{�ZӶ0ڳ���6��������_ ����έ��1@���q�{M��4%�P�d�ct��&�����]��;j^��J:T���u�0�v�Iw���
�Z�!��O&�
]�&'��ɳP��+�wwp�W/�Z�q)��`-�s�-�8��y�|l�!�`�&�r��rOFrw�iP��
�1�rFB�+i��Eo��
��u��l�LV�B�q��kMbdQ�����+W2�٭	�ɝ2�I��d�����P\^��
�e,2�����x�X��|'�О��pңz"����>��^t
N�%)W�6׎V���'B��r� [...]
�9(ϛd��޼�2�?����
�F]�A�]
p��n��o�*5m��~[y��Wځ�*�
�p,�a
A�~����a����G���Ks�J$�
���
+%p��U�X�/�
+
w-
@����}ޘT+��k��ףt&Rzî�Ӈ:��#�k&�� d]׽:t$��
ߍq�
����"��9�#��=< ܱf&�x��8��@�\y[�xԦ:��h�k!4������w���2�ʓ��y���Ofm�Xm��Ӻ]� }
+�
�pł�ήy
vam􃒛��n��|���f�j�r�9
+�����
�V���}��R�f��5������x*�9
+:Ca�#�l~��Õ@�� �������_�@i�NX���)�b����F�|��?�L��{��q�L�7��e$�
f����+C

�t��//-�}�O�&���~���
FY�g@6HC�R�y���i(�]P'�B@>ka�P�B;�D,�M�!eE�
+�4���nu#)���}���BBT�!o�fNT������,�.-��.&I�o9^a�������}���4��")j#�?k��aj��sK
+.���,�
"w'������PX{x�$���X�B�3
,��g���Gdl��1�3~�՝o���6���-������i�JyB���U��>�La���
�D��,��
�)�N��Gq�$��埊����!o�Q��x���+���L�`�\��;�ƀ��-��'g��ǥ�[�M9��(q�+�(�
�����Jr���t�I�T}�:<��|���Α�)����m��!�Z7�VU1%�>� m������/W�j�lk<��u�Y�ѷ�?���,4
�
C�O����b+�F
�E�S}ۿ�� d�V��+��r�G�	����NE�>��Z��KCj��	f��-�7A��xr���며-��g$:���73D�ay9��� Ҋ/���[7�m|���w��)����
+.Z��m��Ѫ�(r/�
bl�t�m�0��6���3oA���K��!h7z��1�}�2���������lO�U��L�Ķ��xn	���j�Ϭ#)M��dzg��C5т�����S)uF|�8x)rMKrH���������
�i�-$�J�
�S4M�xu@��O�
�w���p�]Y���J�I��5Aɩ�n4;��u��'M/�͕/���|b5~�
+"
�n���B�I�)C��0l�;I]8��Y�T
����3,�Jx����c��7�ł����0g
�I��H!	�`�6VT�E#l
��E�G>�ldγ�g
+x	9
�>'o���zǵ_]np����lI�l 

��� ua^�_�DH%���!!Av� �Bn�k���	]+��IB�:F5���.���5�����{�U�ۇ��`��]&d.�C9pЮ�OC鉿�lz����*����&�Ykr6LQ��i�rle��
�w at Z�I�-[�G�j�S/�	��0S�ӎ֜�OO�3!�i�v�`'
��_z
vf?fg�K

7ֿ�#��k�ԧ32Z�Z��0�	S����m�?!�[
+�,���p��|ƪ�)�~_����Rr�B�9���_�$s�Ep��+�t�7����x<YT�I�K��*�n�P��X��ϮX|�\� �
��$X���n"����)����$��kn{�<�S	 
+HO/�uC$+S��t[Ѯ
+W�h�{̫5IT�{b�=-���Р\)F#��7��YR��.�?��T�lY���z'_`
�N��,�\OpR�6Nz��D�(޶'�cM,F�lB[`���,ݳzR8��o:��
�������c��H*�)�E96k�E��ʾ,L�#Z�\R޸��,_Â��Z,H������4=�i&f��^��LĠ�)�4=h��T�?H��[�Z�
_�}˵����T�֡vH񋛚P���
�Mཨ�c<_���.4A�
+�/��D�j�	��6&�l�vE[
1o���j~��&���7S�EH�	
u��\��P-�ʂ~��@����l^��-�մ`Pݏ
���#0K�)L�uy���ɤ�Q�0�
d���G�Hѫ�B2ad
F�E
�tMiݑV��b�Ļ����ʴ"*�6�
i��O(�ug]�V�؝û#޶)��mo������`������4�2T�'.^�}w`�k�s�ª9�'2?�:�|�7�c��%��/dQ�,�
���
�q���Z=s5;C�%�����Ch*�7������6��IZ�{�P[Do�.�v�
~!5�
K4�8X�£?��N_���~�@�1�W�Æ���zZ!����p�r�=
}@�$��)s���$h��O6sB�A��U.nOA��HCR��N�ݼ�ҩ4��k�P���&��
+E�ߏ8yU8V�= 	���]u([�h��Uˡ�{ڳO6�V
�.5wFz$S�Z:A"嘭��ƚ���Z�g��.t�M>��7�*|����g�>3
�)�&`:'��������ޤ�I��9 at K�
���>����V��<)�'���
�zYÐ��'ߎN���Χ�$�GQ�����)'�wz�71��@V)�D at o2������dُC����Iy@%��=n��� ����>" kځ%��P0�����^��
���\�r`#C3ŷ��Jtf �P_V.b��
N,�r$��2r�
�M�

y�'�a��.�I"A'���E�{�Ip/9���K��t�����,zt�B���2\�~����^��
��j��ܘ�����������:�_O�b;g�J+䟾�1�
��W(U�F�U7O��c>�I�5[5A��aT{wh��
殆e�e�����2;q�s4��4&:�~�-�饖��+�<�Kȿ7Հ��ê���'^�����U
G�I���,��}��<0�� Pء��[�
��'
�r�r�F�MP~<
/H7�`4`�E�����o��j{���!�pont>v�
]4y^���O2�l! �PZ���������7n>@��0����5r�ڸ;���(
���e*l,%5?�܈��us�b`F�O����� [...]
+x���d�yv}x1/�"�5ԏ�%Y&_�z�'�gby�w
^fxoNG�o��<��y�
\}o��Nѷ^�Vk���,�
m�xc��Ȣ���1���\��G�������j�]�b?
�Ne�&���CM9�� �%��� k�����6��B��X�t�R���
K8�K.�Ba[ぃ�W�ڧoij��|���qJ
p)C��,
X��F3[�b,�F	������-"��0��
+�1�"!��RB����D&o�T~p�0�����*��~��	���Lgdh�^9

��V�eQ}�0����!
+1b� ����:JH��
�
��0xMLAy�@�,�J>���V(���f/�Ph��&S�S��?�|���?�Q
+�m��#�7���T"߉'0qvZ˳�l���'MZ$��N1�ނ�;��0�����͂O8-WԎ �bc����ɥ���2��ԫ`��H0����Tc{rw
�J|�X��rŷZ��d���
+O}_潪MW
�v��E
���Q�C���G��)�N
0�ό��h;��َ!,�"�%2����
+�|�E
��;p�
��=6u��_��S��B�ࠤh��)���Z��&���;����X�
��''�d�b�*�$uj�݉p�g��h�D��o„��JZ%��m#���<C�N�
e�Y]r\�s웉Q?������A9�2�|�
jRiFRi��ok1jGhrĥ�4�o�w�.C
Ib�0
��VG�l�tJJ%�ʈK����
s��s�Q�0�������In�������R<5�l
�mߖk���2�a�F��S��$�N���
+3w���
+&
���^~#�"H#(^��5&���G����3��3�
���I���A�߮�8�Z�c.�7$b�\�4�
^�#u�P��娻a]������[���L�CI9���?s�|y+C����O���K��0(�:��g�A�qD"��xaу�����V�^����i�c5�	�~B�����$)L�q��dg�ޚ��fp_����>�4�� 
��]��O=�)�A�&ۻ�7ٹ���(��k'���Щ\$�h�s
E�
`x�xz� �?��1�gItx�6����
�.�
+P�$��5`ƅɞ��
������C�6�+��,u�~�SR�T9�lC�m8M5�R[��rHA8wP���	���
�O�6:4Q�gDL%ⳍɠo�e��
y�b�:�>Ȭ_L�Zoܚ�Q.���@qB�0�u�V3���imZ�-
�jb*8��r���clG
��e�=c�Dv�����l���D��m
w���s��|���d�G��9�t�����y �\�'}ĺd6d|/�e6��
;�I��(����3��1�e� C�{p�:�	�
X1n�=^�]
+�.]oD����J�B�M�>C��Q8PC���-���������KV�8X���W�D���B��X	�
���5�O�2/��{J�e�vC�<�� 1�������ö.��Ҿ��K���v<��o���buvry�]�|e���
�$�7�-�ys%��X�t��^��m.bxUB�5ʼj��Hf���<[O%Ҩ
+��bFOE9��Ij��hp|�q�ƿ���:�}�����K�B��,�揻� 45w� ?3��X�3O��P|�Iv
+��"�ĔZ�?�IG<��_ at Fá�T�R�?
Z�f3<��N����?�4
N1�K	�����CQ���Eq�pƺ�
+
���p�d�d�˷G�����
+��,��sTb{g���d�m��1dX��%,��V	 ʨ�tcx���M�d�d�!ǝV��}/��
�o�pZ�K	ń�Q�֝R
M(���>�H����
+@�$
���rSƶ;A0&=1��
+�A��=2YZ|1;޽�-(B�2�c�¦�t[��XCj�x���c.�ă`�B7�m�������� v��Y��/�G��[�
d��j~A�.���Too�|�5)
l0X�z��7xw�;�W
$�)0zĞ͚dl���BߵT��c��bf�dC�U�"�l�r��ci'Fj-�X\79�y��{!����-�8A?�6]�H�>;5�4#�*2+TD뉕X~�
f�
�ظG%]R�`<�B��o
+Ʃ.}�
j�A���f�n�\�{o꼶�-.� M#�s,<��A(t����"��Ś�B��mq͗w�J͟�Bl@��:��Wʱ��c���sEq;�Np$��zQ���M�,Yd�Ԉ��﬌	�6i9�`��[Z&)�B ��
�����/��y��a��"}
�̐#�S�ya�� eq������Y���)��Q󵲇
��]
����C�Zi�� ���"2̽z�Pr
��xa�^TV�t9v��	��[#?�<��X�����.�_�}v�Z�$�	:	l;
dk|�V<#�x���P�-0��{�I^��/r{@�(�MѾ��%g�#�FӠb��v�^�l�P�k��}6�^K

�a���B-:�S�3�|��E�-a�
-�:��T~A�KeCӶo�:�\�� "&U>�蛑n�?�.�DNI�.��
$6�w�4�J�L-~ay.�[T�� =q��,csV&�||G_6�#;%h[����
�� d=8��r�v{S�O�s��,Ǵ�B�‘_�\��
��
?_Q�E��f_NV����7����ՔnX=��-v�w
��� ��q�Pl��T��F�g:�^�,z31�+uʫß��
��Z�%��jF��#�
<�reL��>�F��{6L�<�����~T��tn^دAS������@��@�����Y%A����?_��7	
��y�[�X��e
�8� �l�H�Kg��ZTR�{��w~1j�= ~&���s���L���oZM
�)�~L����7R�7u�$D|�kmyJ�����_��z!�|k]�>��L��r��rp��{�
��L�l�x��d�M܏z,<"T��xL.����u������f�2��&<s*��+���'~���_�A5M����07؛]���n=��u?�&�����{�Z^[�kjRG�z�[ 
R8�kS|x-yR�`p���^>���E&�Gݨ����I���rp �L���[�{m�e��+��]�%,��-�����a(9Oa!i�:{��
����M�p3������J
��H��>x 9j���ҏ�
s0/0�;A��ɬʘ
f4�m��(i����n�ǦݷGTs�VF�$W��3��%�
�C!��Ю�8F?*�}�MOYt�a� ZŒx����
�T���o��MqM�aM(;�|�p7��Qh��Ӳ�	�����_&{�a�o ��
�e��
����+�{YЃ�J�6��n�����{��0��c
��+���^0Ł
!0��:�	
+�"�0����D�[�����>�d�&ȱ���j�C��5I.ǧEa�Y��K銇���Q��҅RR�dT���f���;Z�C1�}�2��,t{�"�8ݷ�y�Nᦩ?�<��_��{�[j��{��
+C�8�TT>k�L����O�)X���s<��O"�Bf)gFZ�5X/.ׅj
��3 at J�]�rM?�Hz������v�O��f�'Gۿ
+.R`����f2��T�l`�����\�6lc�,Z{��r���G\�b���T}��x/��IC8Ƞ�)
+\e�|)��U��
N���U'���X����x.;�pR8�k�#u8�	�4�U$p`w�E�_��q�M\e�G<�������۽L4$�.���8�B������
���=��jaA��G��<���w�2�@��٭P
GȔ��X��9]���k�v�bK� �eS���xe}}iS���Ą�[�G+�1,9W1��6Z��T���@孙!.ԧ5Y�}Yw1�٤!����� �|�|}�'
�[�;�kt+�bc+�|���4>0x���YN��q���1H;������P���}i
�a�=~�>X�#���+�e��t8�ȕ
+
2��V%�U��	�z;to�l�*
+���U��-1��-_
�M�^�U�:�f�Ҫ2J�E��p�	�|򽑂����a�0�V)�H1���W\.����]1*�WT�8�R�pM��������>4d��v��Ё�-?2�R�E���w�n���W��=O�@a��f����#\�^�V)>�ݯ��@qL��ǎn���������ZU���1S�
q\��`��f93�ҳ�DJ�4�J}���g��U��U���)E��W䘂7�&�Yjcusφz�
��c#3>G�:���t+BEq3�Qy��������C�ܐ��k[9��;�/(~�p)��_ǿMG%r��$���_�y��]
*�,��TФv�ɏ�n�_BDZIJ�8����T�q>���Bv�-�����r>
OY
+�ik���
�$�,��`�ueDM4�ܞP��S&�
4�*\q�{�r:Y���Lt��P�ɍ�F�(o��-D
��
�
Sk/�pM�J|b(�1�
,G4/���O�7�um.�$�\��
w��ʞ�vXľ �
��]
DH]lsĮm�,ȪMi���y��?E�)
�n��ߍ��O��a5�~-C�)X�e ��ڎ���3ɀC��',
�?����C����[�
�S����p}D��c�^IO�1Za�i'* �Z�?�_��ĵ:^�� r
�� �<��!�
Y�A������B�АA��#�)?\
��V& �r�N��ڒ�%�p�=�
+�|��ٷ�YBG�˿�+�{$�ZeQ���Hr�F7:m���7G�ƨ�"
�x懊b3ҽ��~�t�M���~��
�;#!��Hc<O����rM�Cဌ�iG�;fk'�Psضn����?�
R!��ϑB�b�T �������u�N��r�/Z��w�8����{7�	_�<g
g��0q�>�'�N�eԎ�;��4Gp*'p���`��;��k�e~��\Q
�����V���ߔeܓ�(w�Ey_Z{CDwY��u�G�ce���ӿXL	��f�S'�9�]�2x���ʿYRBZ!�7$J�7aPK��O�HA�d�� �s9��WYc�U��
+^م��Ĉ�*w���
�zM��%�[egXS�UI�����W�-��*����\�|�ӏ��QK��[�C�~,$'x%�
���dcQ�-=%���v����t��]:⣺a?##}��
���Ĩ`�|���Y�Ϡ	�?¥ db
��$R&z�;���K
;�f�+q�����{�bFc�y�{YۏN?	&���m��e��µb�l0;͵r�-��4����aj��
�]����B��u��S��N�VH*�B��=��nTՒ�1ތ1��*�����i�E�f�(�ҍ���pUֺL��������C���#v{Aⶱ�Q
흥b
�����`N��n�Ջ[4��V��l�ԁ+��4��B�C/�^).*#6�(���:����-����r;�ڤ==��5�*�f
̵$}
)G��
iV��C�g�}0���u�`��F}�c�q˩a�	�N���v
j
nn�Y��a:�]�|t-����������B��f!,3�
+��i%���F����ۡ�Z���d̜���p�Au�S��̲!��c"�v�T�1�;�� ���{�Á��
A�3��FՔ��C�"���V
S� ��)F'=��(��'�<�̂�`o.��]��މ���HW��;��S��*�ߏ8\ �`���qg��?5��bj
%��B��D6���N�7��f��*P����8cK��oA�o�}���g�iv�	����*3��]ʖ�}&���3KG��hd�y�
	��+��OuL��4}�df:	�R�͹﨏��E���/�%��$��
�S���i�P�r'�g��V��%3�ɪds�b��?~
#�D���p���
�#��o�X�fۙ�	�aM=�1�2oύ��e�Nha��g���/����Q6�{Z��ʃ
x).�V��&ã}��	f	��n/5_��M!}��r��2�gE�cOm9�W]�5�B�F��_Ϭ���}smM���kaK��=v�H�PK	?(F�Qd��W�Է��]_�޺�qFoF�B���
��+�]T�
�PA���$�[vx�ru�Q_�]�YI�1�kv��&�oehml�K���듟S�D����K
+��r�k�_�K/�[�`��Ko\jԊ��� k͗h/_Z1��e��~bfd��|���y�L�2:V�G�я�ķ��{�!:�
��9�b0̓���d��|�3hJ*���|���Ao6�
g:��A��
L����W���t�P��f
���a���	����2�:��HQ����{�0�+�T�cK7O@����?;A��'
�osO�:~������ .;��YJ�s�=��
��{C�BS�� R��C�z�Цe�$L�Q��)7�R12���6
+�5�KѵyM��5�)�H��j�=s���я�U�T��1'%K�E}�w���g�|8Bf_���0y �Z�@L_|��3i�@�+�cX���8� �-��wJ��\�RԦQ�VMt�J\����]�Rj��{(�vx���=T�3�#�2����:�w���+L|������ �E�l��3Fh��'C�n�O
��z��g<M��a��j-:)�n~�!�`L���sek�y�2(5�������
Z
+"A
�}F���T�C�嶘��g��rG@P���B��OyI�⍨�J�V��'��+#z�
���9�d0
,��Z-7�0�zow	q �^���kT`M��TJb�|b�nk����g,�ů�;-�B~��Ӽi�H�:�ħUZOU��#�J[1�������j�J��̙��]9W��v@�P.!���U�Ұ����
 A��-�z��W���k�.�K^ǂ
+�j�~+'�'-����.�3�%�������i_yS
���/�q�ۻIn~�+f2x��+����#8�|58�O4���Ý��F�M�\u��r�7<�$�2�3E_�_9!Ae��ױ�u�
W�>���Fl�tg�8U��<�!�d~-
�����J�˭��He�.=^�z��\��1����VQ,�����θ��Ew0�a�l�
���Bp��Ke���
xbX��1T����IqQrV��9J��]�N=ͫ�\�BRpL�j27�Ҡ�yf�c�Z��~7��1� Iw��B���٬�s����l���b+Zk�
+�� D��ڃ.T��G��Uk��tZ3��ͽ�DY�hRn_^��=PP��-Q��|���n/���w�z�T�B3�a���bD<Pu
R��&���7{�J�8���]
�0�߾M�A��no���u۷�e�ٙ �^g$�ɢ/
�҂,?1#��W����㤍�QEb�q�H����W�VՃ�C���~0F��πe*���wꅝ�b̶s��;�/�R,�o�z7��
�ǩ��m*-�w
%���y`�
<�fv�����E�}7���Q4<��x]�
ͩ�Z�
+���3)u��ukC�"8d�
�'<�� +f#�K�|V��fq�~��r3�"V؋�4d��>`���Hu���?P�Ldy?W�\��
o1�q�PuRG6ebagӉ�8^v�8I�o���;����|����?NtW�m364��]�w<4�M2){"�+�Si���^Z=�6kwEu�Pk�]CQ�X�S9�G���,���.���yV5}BI�H��-
�ۈ&�/ߤ"+�.�]�Ebzniن��[c��#���b�㸡T��_������/�'�اħ��+����3O�~3.nSy��D}��^>/�.!x��N��-�(��rt&hX3t
�9������Q
a��n�
�Z��W�"Y�%V�Y͛�x�u
��
���N���X�4�>E�0�_''��V��8u�5�/I���eD� 9����l?�•o�¨#8���S�10�x�S���̍��h�-}7[R*�-F�
?�1ԉ�\����F����]T���JE��;
􋯽��Z]	�������d
iah����W7����Y��������]�F��
�S@�'/��5��׮}���0 
'Z!4���W[O� ͉�h���Q���	�(�f�P\���>5�DT�&�R%6WJ�Ԩ�����
+�����{�W�+\d1�S%�y��Lš����y�j�����������M�j�O)J���R�E��ꛩ
�I�	˙>4[<����KO��^�,Lk�(	�9Or�
���:�;�W]�
��bQTJ��Ez�z�#V
*"ie}
j�]栌���
�`�^I]e=}I*:���9�^�@W%�Uká	��ͭ��2�m�Xi���#f������
q��D���
]�
�*;��9�
���xL
bM��$�{��M�:'�ˈ����w�
�]��M'�Dl��� %<�H��Z
�]��.�}�[s�aܽz��؎������w�M6<���O�^���YP۩���
����~����8�#��D�]��0V�.�<��y�t���,��dG�M*8��w/Tc�g"�4�����i�\p+��)̗��f��mNZ�%�}�	��@C?=.Y7��.�
+P��"��)�)�R>sU�U�R�pAw�FL���EW�����ږk
�*�
��QD���=\Bh?���
��G
y軚Kע�E=���L&��ǰK��&*ol'Ϳ��4Q@Y� ��8
�|���/dki42��@����<���vfܼ�~y®��y��f�x`i�u)�����̅��M
�擗}@��QC�v�ui
�����
+OڥE�
a������&Ѱ,Q�]�^*�|G/��lNA����
�{4����R�Ҳ���c!� {�<=�u��,Ύ�,���?�jy�*\~�+ް��f�1����(���jExtb�A�`i��al�M꒽��{� kS%
�ú����Y_1�L��F՝[�����i��YƜ

K�DyK�Sf^'�Z���	��A;+��D�r�UW[�}�E֑L��0�I��"&������ �S7��F
B���YxEm�����%?`�J'~�:@�cnS��@A?���!9��!u�;HA{x��{��&�����~�f(�M�z'8��a�>����-��БQ-��VQG	>�Ҕ��h�
y��O5+G�%�P+�Q��J��0���f��6�
�LY"�P
��;Zͪ���ɞ/SC;��#T	G�NA�_oe=9�t��(t�^�
�1�[�`��>�L*
+1^[{����q }�q�����S&�nx�!�SxZ:���j�^�ϜQ����y����	J���?l�;M'}�	�/q�Q#�F��Y�.G��>�28i��X��-p���i��4�!��*h���`q�vz�ɬ^V��`#e�Ѹ���}l����bs���D�_��׈b�&��&�7��MYZ�qpɑ��"ƤRD�������>�U|XI������:�P���e0s��Q��/�dͲ�΅�%���P���Dnp�)y'�}�l��:���x�ށɝ���qF�]�&���7WkwM�;#�V��hwM�^�]�����0ooѢ`��h���h��j���
K?�4i���pޑм!p�"�VZe�o�������
d
g�ԁ��3�\�p�6���%!����{�#cᒈ�8*�ҡ��b�rM�x��^8���#��D��= m����7a��<B-��V.�1Ӿ+�=��b���xl
s%�P^��}X
�S�ҩ�׶�up
+�FO�������p�-8$(�-��/����endstream
+endobj
+482 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12669 0 R
+/FirstChar 2
+/LastChar 233
+/Widths 12698 0 R
+/BaseFont /DRDMXC+NimbusRomNo9L-ReguItal
+/FontDescriptor 480 0 R
+>> endobj
+480 0 obj <<
+/Ascent 669
+/CapHeight 669
+/Descent -193
+/FontName /DRDMXC+NimbusRomNo9L-ReguItal
+/ItalicAngle -15.5
+/StemV 78
+/XHeight 441
+/FontBBox [-169 -270 1010 924]
+/Flags 4
+/CharSet (/fi/fl/quotedbl/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblleft/quotedblright/eacute)
+/FontFile 481 0 R
+>> endobj
+12698 0 obj
+[500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 420 0 0 0 0 333 333 333 0 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 0 675 0 0 0 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 0 0 0 0 500 0 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [...]
+endobj
+415 0 obj <<
+/Length1 1501
+/Length2 10189
+/Length3 532
+/Length 11099     
+/Filter /FlateDecode
+>>
+stream
+x��UT\ݶ���[p
+w
+w'hpw(�p
+'xp�����		�
n�5�Ϸ��+�׾<��Su3�����;�}�6i)U5X%,
��2�7V6A����<;����
��V�
r�q����
� w{ '��O��K��� ����bce�`�b�g@��bc� �@n�`��� {����
�͋
 aoP��W�:����`C�� Xؘ���V6�?��!�� ��
+[�;�O����j
+��/���W��{/������~������,.�no�
r����:��� {��^�����v(9Z�] ��T�_��6����w�ۘK@��� Vn6v���۸��x�-Tm�̭� {W��`��:y�߿| �d�dT���{k��T�@�4��� �?���
��I.6� v6vv�ׅ����2�1i����
�
+���
 ����P^�+� |8 6
�' ����qt{���?���
�?��� Z�

@�����  �Af�8@�?�
 �X;����@'k�3�k��?���1�w��O�
l�'���Z�u��ş�  h���3�W
{�����UW{����ȫS�&�u��
� %�Ы9�?�jH���x�o�{�.��^%���@�?�ZS����jS��VQ�C�����kM����]�]l����ur� �����Ӡ��8��.�/|��
�����E6�ۿ�Մ�_����_6��
+9���B��k�\��W]׿�U��/|}\���U���|���
_���/|����
+�ۼ���\@�}����JJ:z��rqX9y^���������-4wwqC���b|
��aK�׷�	6GY�w4
+�Mk
++��.�,�gt%�(	�
+m�b;Z™ui���_`�b�ڔc�
��ZX��$j��
�� �.b��1�}�@<5?24���և��9ro�b۩������G|��_>�q\���ӥ�݇��K���;�(F9�)`�������d


����~��}^"�[��[A���Q���yDfg��C�ȴ�X��P�D"���� @�Pf芶��S:Aښbآ�@���K�ӑ׺!)��1/%��-"����w;�Bz÷kԂp�j&9E�9��Sh�M?�^���]=<�ݾDu���PBV��0�g�y001����D
Rꁬ���$���Pţ�9��m���)t���DP/q�
�vH�eQ�g�k�h(�	%����?;����4��2X3��\`
�h�)x�[g4�"#S@ӂ丸%��R�TK�p[`
��;��˺����7Y� ���G���T����^2��`�8�_�L>�'�]�*L�&�+��	��,4}Y����Kߕ�9x�
 ��	Ԝq���v^I�
X�$ ��}�fb�Fk2Rq��� [...]
���;�Ÿ5D�מ�I<ӄ�>V/O"'R_��-犭�ZV����[�t�v{qx��Y��u�ɒ	�
sn%Ͼ'0T��
��|
�16eaN�*�鯱��O{�_���eL&�(�Eo	Ҿ�G�x��-y���>߅2��ͱ��ȆPH����{�o�o�4ё/�i��
�
��6�IuS)V�u�*������|ܒ�l��JX
`a�y9R&7�8���Y�M'��w+v��T�V`H���<*�3�'���Iy=��{��W&�#3�cS�sd��α�)�%���˩�͞�Imz �z�խ��'�s�-Q��j	�'�vy��t5���k�_l�{�=8��$ӆ��0�
�=X��
�֬W�fF��5YC�Y�˷>~	p�=����ɉ�3���uE�q��Oh�=���]��*�����y��#�,oް��
��H�S~�7;�<��l!�	�	�Z.ͬ�\���
ǽ��Q�
�'�T�f�2�


+�
+ަ.�E�G޸|��Nd�$4��]�S���C�������Ļ�_�ԇp�[��u���pE6�;��'���ym�/���F(־����1���3�fѶH�K��j��Q��y�N��L}��!ˈ6%���~#����KZ��K:
+QBCo��
w�؝&\#?,j_��M8��V�5r~���*�A�Z&Q�$���+��p���m
�,��g7Iz;U��O#j}�⯕�$W�6g�1�r��V��?���v)���,�[��ta�nVA�
A5�|�<
�d�D���ar�]Mbq���,2U��o'UU$v��!M�e�	b�L����r�i�tN��//K�
��pj_a��P�
������2#��l���E�����nh��D	9�k�05�u���B���_�3}fw�
�� [)La� �'�猷�H7.	<_�M:��Ft�J�=<�rK�1���U���&g 
n�*+-��Z��(?u#
�1
z����&O�|g8����^���hniBHNTwe�����B��0��U!������1ffl��k+��:��ܼ.���y���(�JU�zf�����b�O*v�e�
C�������y���v�����}>�}ь<�X|�ם��ʌT"K
+s�$�˨;}�=ٷ�F{[�8�1���W�Np/B�
N��栉Z���ʫT�Ts���f+Ͻl�S��L
�OS��o}���~�D$�X�6�w���ǻ6Ƥ�O/�ì`��,�Xp)H
Y!���!(�Ix��vn�4��^�U9c���G'�I�Y�q�c���dL�˹�4 7��d�)�	C
+�����_y��>j,@}�^�]���D\��VO�]�<�U���is
M��� %��
nk�αg
o
	�7ճb��jx,G���M��=�v�N޹�����rX-��9��獴�z��Së֙k��[v���<�ER��E��<g�6:	»~W�
C��-�o�xv�%�8
|���滌̬
��w�ƙFG�Ce}r�ۜ*
�ܺ��M/I��+:��/�y��!IV�1p��?���ѣ�0
+����gy+�u���*�ב���L�$�T��9������y�޾�� ��TN%P�Vl&+�{�H�y ~��K�8�@��l���M��o�l~�J�k�X�c�fXuZ
�
n�=m� ���rp,8�a���YHO;qZ�
��@�Iv�ń�s%;}�K���f�
+ϸr%f���ndH�`��{�N�����ʏ
�h��hA'xD��ňh�J}%F|Ң��
+��)��
�^]v��(�٥S���q���l���$m�,
���s�/�Wd�ל�� �y�&A�`�5�b���#ˑf�%x��!p��X�~+�*|

+�<��'�g���XM۸l2��d<,u灋��|��Sa
2����V�{���<��
hra
~�քV��5>���*x�(�ݸ�a��Je�i��ľA�
�ҫ��z���3
+gsC�lH���.W
�h�LJ��
p:m}�(�
���3���yG�ۗ\��<E3_l	P	[y�]t|Y=g{z
��7�b��M
.
+t��0��oK� 1��"0��
+{ޟ&�Jgg��,x�6����P�
<�>
�1�ՏmS�@)<���_}C��|��k�XA�̲�s]%�����5U���T�=���,�����}��Gux�(���v��iB�e�jv�]�v8î��}��(�%0]E
�nYEꍞ]�"����e�Ԟ*`
��V
�aoF��e�]g�N<݋��H�����a���X�.���,���v�;�Oj�fU��ڊ^_�G�T��!�a���(�[A
+�a`�<k�����k�ԝː��^0��<1bV���
��q����W�w�.CI��.��X�d{��V@��bL$|��:����,�G C-9>ؐ"���p���V����3KU'�'K�2�X�.�֩veL��
�
4�y�;��7�>P���"Dr��mV
+rI.G��21�o
�k�
LJ�#
+,�B���"���Q>S��?}2A�'O
+���	ł8�&*^���UQ6�$�W�:���z��p�fb �?^M�ޚ�\�sD�)_�
 �K� 0?�:��:<
++^�F
q�?�"�K
��
��;�!z.�BF�qׂ�>����|�~�m�&rukN�����Uj+39�V#�<��ײX����נ#�""��[���5�
+Ea;��1�r��
;X<c�t��^�&A���H�+\����9�
�> P�w�ċ!�����G4n���}r�����ȦA�=�5��A�;\����.���w���Uz 9�،5���d(O���P���0	n �>�9d
+������c������,5��0[�������2t
"�K'�ח� �U�
�6�y�,X�Fl����F�x�����0mh|YjW�1�v�euT������f���̔�N�&V�^�~
^}^����SF �/����
+'�j����5'(��
���:#M
+�;��
dzĤ}5�5o~5�RȈWY)��pqM�,#�|%�X��� ��C��ʬ=�Oܱ�`�u�_��7�:��{�8$��v͐Er��a��T,3C�y�v@z��HP"�TI��hZXf1
¤���W	��mMc�;xwy;��#��F�8p��^�
���Ѯ
}�H���x�iW
�r�Cv("c
�kx���4D���M���/�:�\�t�G7϶m)��Gi'��������h}OƟ%vI�Ͻi�{�G��Ny=��NN:�F�e�nhz��:8?	<�e��p ���D;��~8�U�JQ���}Κ��)13�s\@�?�����0���5R���h�Ǣ.�_���1
�
�I9Xs�(���{��
+˪�Β`:�Č�
9�k�D�
Ae�����[j�<�(tKj���D��3%�ל��|аs��e�)�
)
K\>�|z]�ǘY��y��A
�
�f��O�G�FAw��M������
�
+a8�$�<�˰�J�YFj\"�a��7W�I�y|���c����R�79^r�Dy���k�hˢC`����aR�+'��Ǐ,��
\����vDH@ZW$�dY�VEϱ
ϗ�#�A���oL�D��(��_�a:X�_p8Yζ?8q���
�1�
0k�s�a���(>��
�0����)�
��QD��
޼(�?�^�̚���|7�����Z��Q7�Y���C��T�je]qbb��5�	���ͣ���W�zR+���c�9�0��&52Y��%
�s��
��|����/P汞���Fd
G�´��s�~#�AA좊���J2�Ñ�w����s��?�����U�L�+"��m�`A��)�؝�rS|B��w�����m����!�
+*P��{k�%%
{Ȧ8L��ԍ]�wQ3'.~8om��z[���`X_�3 �
�Q�t�+g?�!˘��)yMss�h���g�j���W��(r��OyoՊ�n��H���ND���0l����ҁ#]�Mh��`�0s�
�D�?"zߐ؀�
|�:M at A����t�ϵ{���~�
+�Ǡ^���w@��-�u�)�]V��LӉ��'q69W����LKi��.
S���&==.�	�ى�>�X;�2���f��K4���ͮ� 7>�

�K��;Ǝ���h�
���U��_��5[�a`oh�.�p���q�w���
�����T�\8�
��ք���Bgk�qbr
�zV;%m��Ɨ�$�8:�N+�n(�?t��彣gH�3n%��G%&Md\5�
R�#^O�J�|�=�鳐�
���:��gF\L/�����]RVU*s��k��=K�^�Jn�G��h+���q� ��!e�(ap���E�6�f�L��M$fZ�_�z����*|�
+�#	�)'n�;.��o�#K&r�LO�M���}���l#B�EM�0��>�(�gD2��E?�/�r��HtM7
+S7�N����fl��NW_�k���"��'���o	���9O�{}����X&�*���>�v����;�	)[��F��(��p��|��A;΁��*"��&z��3q�n��l$L�=���J��G���t��2VCL=���3d�
��]R8��T����I�"U|�ج��
pu� 
���I쐍|P?&�֡{�ʣ��O��������PJ���=J7���K?K,�v�>F� 
+,l"=N�i7<�q�]�-w�	_�ҹ�������c�3bAa3
��G�'��Hׁm]�|x�mtlɻK�y�Je�.%���~,I�?fp:jfA)�Us	�d*h
��hHI�I�r�{4n2�w�b�ο��%��b���t��� <�#E>X�Ԃzh�O\v�Ͳ����T�&^�	���:^X'���p�|!(�[�^[$��#� r�^~�Q�/���
5¦JĴ帤�xD����%��	v�+
�����G{",j���Y@���'�O�
��,�%o�c��fxt:Xŋ2��Ҙzܒ�4�-��
A���>i��5R�WaE��m:ً&&\o�?�i�Ѯ���ە^��<���Gr��T����v@^#$j�h" �~���i؈�B��HSf
�>s[��lV
��q����3k�JF��O/���1�U��(\
p����b%�\k�\��>+���H�t3P�!֔��2W�kU0
�q��\c���s��h��o�zs�qX
+h�Y������
+�)���X2?FfFyAe�ƅ��5�lo�,1��1J�vTo����i%4Y�HJg
د�K~��E� 1֔5��
+�{�pUo�9����=�
oWMt�����d-ڼ
����/���k����L�A[=�	��0然���o{�c��W���:~F�vMޮz?��M�
+�z�eP�5���]�G�>ޙuIE�\���w�{� �s�*�_�qz��rh��?0�
+v�
>��2�8��[����,C�W0/���N
j�SX{AJ���9!M���]��9
�q����ڏ�|*I�˩������˕��O�*3��8rd6A�ZY��O���9"U~e]LW�d��m�b�y)��`����>�E�0|i}N
I�M�@��l�ZqV�	�9؜a�uWr��CΎP��p�3��38/�X��n8�)q=� =y%ɪ[�V֡�F�‰���x�.m�
_<�4�����}n}�<5�V
���ɣK�.��Lޜ���
���m���R�8��r�'Ӄyc<8\H��"�)t�YF�b�:�C'�D6Pc����6�6�ᓌ*V�Q�k.[DqttK���qݯ
NB-�#s	�vB&u?���ֲSv"ev��ͥ�������Og��Kdro�t�Fg���UL'sP�D�fAЅ?����L�%���=�Y�+&�ټ��z��c0�Yw�'�a��
<����W:�+�u���u��{����ʼ�s>޸6��M0���t�(�0�*�fFj:�
+���6E�[�
bu-V�1!S�k�����k���^TO�(8y�;���?Q�i@���5��,����B���ӱ2$����8�k
�2)
V��Nߴ�:���'&% G�h
7k�L��q
u2U5N�޷|�k1oEfr@�r�p
 S�+�q;wg�d��/t��
S��g�	��
4LR�O�6Fb�c�؆�����Z�2�c���$�
�T9���r~�F�!��5'����T3D�J��
 ���"��b�-E�ia76k�Q�sM"U�.��G�/� �0�u�E�
��`��^������g�Ϥ��M|�H
�V�<�OB�d1���!�����
��3�I6^~Oy�ԛ�5�(�3}�
��Y��Mn"SaԽ�~���E��
�
Y���M��WF���@��Yf���KKm��d�Q��Ņ�����X���{؞~PA�[�np���@���+I׻mxdD��m�Cb�I�g]�\�-��C�y��vjm^����Ѹ]ٗRj�Q�
X�Ԩ
�j|��
+��-�0nP!တ��z����"B�OQ��ż���i����r�~t��r���)�.1g�%�~�	M�Q���I��:�ф�t��d�����_)��f�����}JK&6?^�x}�{�@^QG{���j�I���ڎ�k���2"�X�{��UY���l��!��f�\H˦eq`$��F�
+J"÷��J St� d�tO�*+��B��
+a ���!2m1Qw>��Z*�Ԉ]�}#���<��&
+Q�[�>���^w��CT7��ĩ�Ā�u�:\*�=��-���a�@W��ϸ��w��^�@v�&��lL�T|[�n�m}MQ��?
8��4�ؽE�����O�z��Oձ�κ&m�1prr�6!�{�	�
}?(s�eT��P��(k��5��
+�
Ex�x�W��
�B`�8�ԉ=j�Ƌ)��{3qޛ6���Z�暈T5 at Z�Qh���v_�=G� ԸW��/��-U7�Oݬ*��dؖrr�m��򉍿�sKG

+;�9�ӧ�

ͻF����g�9NG㾒��$�{�g�)�}zӌ�[B�n��y���s@��nF�\+��m�A2��<��3'�Qtְ[�,c}�?ǔ:~��1��ISm���_�i}@����M�|��캷�hU�T�C{�)��'-�Uq�D�IG�~P�T���0��q���9f�y"!=���nEr�'�
�*��d}��e�{F�=B��*],���2��_џY:#�]q;]�
g�JM�͈�W���z��B��>��I�Aq���G��!Ħ�>�S��[aIɐ"�Q�SjO�4Ӣ��u��}e��#�$�ᛙa��I��r�	
tӜ�.D�E���3ŏ
%0ҙK�-/5"�T�˓��W����}w�b/��)i�~���Hn
x��q�0�h��o}�k��r-և�7� �p�W[�>��84?-��T��a�vo��䇼^%V=�A6E��S~UCD
r�$4R�$���X�呁��3���s��Į=�����\�]C��Q��8;A� 	�i<7
+�)�v0MM+7|/�3��n�=O��+
�a�I8��
+|E
nƖ���&}qG��K�d�pm#�D���t-�n����اj(��(O[N�l��^@�cbX��{��<j�4~�ʅ;�p\���ii�wz�2�����!W�!�����n��u*9�j��o�U���;
��)��N�6���B��W#�oN
���Z7�j��t��++3��"��D7���c�n
��ʕ�#��d��N��GMV�z~��෶��_��Z��̆ޛ���a+y���.
�6
+Nr�i;������k^B�s��ڕ��d���X��1�0�m��bp{�-S�Y�UԦ� �����s+)|9lX3	�o�������X���%��x��C��2?
؉sP�������
V]�X�
��E���(?��9|Z�<��Y`��0i�
v�� 2��?Q�S�R�;��I�.�[�zX]��q>�#�
����'?c�����Y��^�/��Q �u�?qB�/%`ډs�+��ԗ��eC|��Գw�
\�%�i���P���w���
+��̹��Sv�,ס}C�$��M�h�3!6go�]�
����	�a��C�\:=
�s�aՔ��MRS{�.��k���bs��-G,����"Y"����bz��!���-[��L����<;}�@�,������2w'b�1�ЉӒ�+F)Zo(�43[Xr��ͣ�g�!��
]1ِ7��F�To5
�}�(h8)S�s��A����J���(� -��A
5�������'���i�U��io�"�ꖞ!V�Vp�U�"l�
~z�v|��ފUS
�$��'>����q���b�_� �u�^
?�m�
�U�k5'}�bx��ߟ���H�M0�p�&ш��c퇓ɆR���)'9�B�y"�c�e��<4��4�M�ǐ�#
a��ƌ�01;�9KlF0#
��c�v̪�V�3��Q
�on�{#jw�3̿8�	��YW��~��CܸV�j�B���g�8�E?�y3^�x
ب�<$H�<�M��}C�
+����w�;�
����4�`���.aX?�
S
�ؚF��̓ ���<߯Cw�R�<]TL8�(�02��qa6��`D/�m-[ �l�x)�;	0�ɺ]	e�j;�	!�dT�X�jzD�i�SFt�K�f�P�Hv�2^V�
�݆6�Q7��z�O�=��j��U��R�(1wM
޺����ʊ��ge<�$�0����S�r��Ԫ�#%W�x�6���,��F�r:F9�Kt^t�;��Q�

��#:�6
���O?����Z����&/+�hhU�z{$ϔ�s9
�B%��?%l��"y�T>6L������>ba�U3�g�)2F44���2�S�
�� g���beG�A9�gGHj^���0B�	��\��F�g�X+���RZ= ^+��(M�p``�<��R�l��
qQ�n�ږ�
&
����
�V��M�����s)%
+ϖW�n
��	qҤ�B�!6}�/vUH���^2�*ۀ�^�2�H(/� ���Ka���4���J��k_�(�l������&��cU$�ں�mנ�@zK�
�Vw�G��
�\�j5;��䭀�՗
�~��h1ܢYm�+J4�h
�"6�I�Lb�Ӟ ͼ�'~muҹS�)k�c��QW�����l�
E܋z��Vh�T�
"�D,��$���ȁ�n�9�2��_2�M.&*
aՃ�
��ϼo{�����B��Q�;��c�0E�.6�
Rv��s�7�B{o��I��?��a���9_������%�|h�y:���C�-n���3�
+Xr"���XC#�!��q���,��T�
U��b'RA2�uч
�{�
��Mc�	Ә��^6�K؅�Je�
Eڴ���:5C���L^��D[ow�;l
�֔�d�����?��kn��[��
b�9�����
+/�mA�=�y��(A�ɾ���{��[qK� ϊ�Nƙ/�fd�.�q%��pbW�R1�
aM���=i8ѭ�6��m�@�uF�i��6�b�`Q���/rH��k���_��e�ob�2��I���~%���8�ߜ<E]:H����
k�y��03�X3���Po���?�����'
+�ۃA.n� ;������endstream
+endobj
+416 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12699 0 R
+/FirstChar 13
+/LastChar 125
+/Widths 12700 0 R
+/BaseFont /YFCFOC+CMMI10
+/FontDescriptor 414 0 R
+>> endobj
+414 0 obj <<
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/FontName /YFCFOC+CMMI10
+/ItalicAngle -14.04
+/StemV 72
+/XHeight 431
+/FontBBox [-32 -250 1048 750]
+/Flags 4
+/CharSet (/gamma/lambda/mu/rho/phi/triangleright/triangleleft/period/comma/less/slash/greater/A/B/C/D/G/I/J/L/P/Q/R/S/lscript/a/b/c/d/e/f/g/i/j/k/m/n/p/q/r/s/u/v/w/x/y/z/weierstrass)
+/FontFile 415 0 R
+>> endobj
+12700 0 obj
+[518 0 0 0 0 0 0 0 583 603 0 0 0 517 0 0 0 596 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 0 0 0 0 0 0 0 0 278 278 778 500 778 0 0 750 759 715 828 0 0 786 0 440 555 0 681 0 0 0 642 791 759 613 0 0 0 0 0 0 0 0 0 0 0 0 417 529 429 433 520 466 490 477 0 345 412 521 0 878 600 0 503 446 451 469 0 572 485 716 572 490 465 0 0 636 ]
+endobj
+12699 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 13/gamma 14/.notdef 21/lambda/mu 23/.notdef 26/rho 27/.notdef 30/phi 31/.notdef 46/triangleright/triangleleft 48/.notdef 58/period/comma/less/slash/greater 63/.notdef 65/A/B/C/D 69/.notdef 71/G 72/.notdef 73/I/J 75/.notdef 76/L 77/.notdef 80/P/Q/R/S 84/.notdef 96/lscript/a/b/c/d/e/f/g 104/.notdef 105/i/j/k 108/.notdef 109/m/n 111/.notdef 112/p/q/r/s 116/.notdef 117/u/v/w/x/y/z 123/.notdef 125/weierstrass 126/.notdef]
+>> endobj
+369 0 obj <<
+/Length1 1612
+/Length2 18915
+/Length3 532
+/Length 19825     
+/Filter /FlateDecode
+>>
+stream
+xڬ�ctf��&�v�ضmTl��m�*��m۶͊��m�Իww=�����c���k��\cQ�(�2��9��K:ػ2�02��v&n.
+��
*�n��B8
+
+1gscW������9/@��
 nn
+`e�����Q �

����V� juM::����c0������. at K{ ��ws[G;s{׿�׎��� W+s���
 �MI[FQ
+ at -���2�7w6�(���M�@Ss{s���3���������\�b�� �.����n枦�������v@��� �
������o\
 @{S[7��+�p�WB��-�����)9����:
]�*�K�;OW+c�b� ��-�
L��)�_��0���@{�����?�L�f@G[c�����9:����
���2�8�[;�ٚ�������Ow��N��V�����׿�
�e��r ����Z0±���i��7�%�
��A���p �0�[n���?u����j�?3C�7	c3{[/���
����ߐ ��;���H�o������z�����
�o����}�OhI7[[Ec������a
 �v��������h��p�OCM�'���#�j��"��	afd���"	�47S��Z,�m�v�_ru{3sg[���_F��L 
3��Ԭ��6������*s{��L�/I�J�INNV]S��?w꿬��r����7��Q�����:��!* [...]
+Ʈ�@O��ߒ�Y�U��x���0��f�̊��������_�Ԧn��Y�׍�[��<�k���=�M�V�
L�B�S3�\k�s�'�u�{Y���
K�
+��
zR�wx*��k��y?ۼO
?�eiF{�l�z��/���h��Q7);����
J��4�}��!t8�5v'�U
�ߡ�;؜a��h���1�
��MS�c0;QA�j
N�(��
��F��zn ����c`)��!)����t�+|"h�Қ�oگ>�5�}
r)���#��_�,������!�څ���[�+���禣�E�y~�|��QH�`�7L����ڐ��d@�
?�]S������UӾ�!�̏�(w��{�@�S03�D�U"��:�Px�-��Y���f���$
>.h�t����9�7��w���Qb<m�q�y��Y`�x#>0%?
�t��8!MVt�����ޏO
W�	����
_�z��X���"?���8�]Ԇ�f���%A�ϓ�N
K��e2�9�C��t�(�s�
-��$���� )��|�y�%-vy
����V�Se�]�[�/޲d��5ENo#�Hә��A1X��;^����9��s��I�� m�t�m^������-�~�w���y��l�w"V��v�� H^�՘�E�v�-��
�
�6��
�%��Gr?+I'�'����[�H�sh���?���%�@�1<}^�m
�nD�NjZ	�P�ga8GP���6�}�f'��Y9��_��A2F�,�R���j�
+_�����w5���D���WS�~������!��!��R���
�y�Oh��\!���"�*�dd�'�Y��^��2;l\
�q�k�(N����ml��1AN��;^�D!Z�M�A������ϗ�]M�ޫ��@�V�АG]W�ȷ�b�W�Vf���_�h��H�0��~#�&O�,�c�%���֘Β)ih�9zd#^�?0
��(R	
+r�X��4ˎC(w��3��׌[
+�8�G,��F2}<��z�z[��(
]$7�/F��}`�"��4���'��
*N��Up���#Q�\m�k0�Y�ㆲu_�20m�c�	Dw1O� �\�0]4�I;�ﲒou_��?b���62�Sٳ\���R���4�P�x�ß�����
+��43n�Up��ZQIA��4�+�I�.	�d�.mҵ(��OÑP���Fh;wGu��vg&��mF��vXf���e2��4��A�|I[ N{�<��
��p<���
�l
SW���um�p��/v̌�q�6��jO�r�y��
+��<g,e��5P
+����?�~�-��.ɽ
qYw	?��M&��$��j���
�Ү2�����/�N��T����w��`g�P���*H��b�)�#�P�
��x�L�+���>S��_��""�=�z�`�u�Rz
u/��l�	���ꏗ+.�&̍�(�)l�x��/��C̱&�g
B���-
e ���ߥ���qc6�*�
c$W(��.߯3�y�&�~���^&S��TA�
��^3���"v{B��B�>�Ev�m4���k��T�x�&��z�%�s�0�k�Q��8.�;;$�@WU��P��1N@�7l����OlSO�{�ƶZC�����(�*2M���f��h�!G]��L�p�ʄ�^q�f�ݹ�*������K�5-*��S�}�+02��K�
+�nql{q}G�_ at K�a짂�Pv�.���.����rn�d��A3\
+F��놧����wW�{�-�;#L�\�h���h
�Rn���w,rFOdi��Lh�Wɩk
�}�N�<9�-
[`�
+
��EU]�NQ�ǭ|�����Б�d���n��9��iʑTw\�?ǷQ���ǹ��
�
6�q��F�P��M9f�B��Q TQ|w|�����/�St���rJ�4
)2�}�N����>=~����ь��S8%'���
+�$���Q��S���=E�
�DŽ�@��>����H
\��h�ŭ)~��!���M-օ�cl���\�
��?}1Y��>*4�J&�
*s�Dp�� �F�6@�(g�
�(���g�q�����k
�w�T0v(ܽ������挦dB"�
�Ƀ�]I;1iLl��/� ��0�������o4Ҽg�М�ݺM�
+��b4r�>��߃du�u�2���W{'���c&�%�h
�&�'%�9)9�;m���N�N������ hh�,��x
+�`��~��z�wfP
/���_�=µZ_r�H���2�����<+]"��|
gS/W:s��V����!�z}���Vp�m`~+R�3=� j
+j�y���#��iK8
�
+]���
��B���Z���l��M�@ [��K�r*�I92=<��H#���e
̡�s���+kti�=l�W��Int�Q���~8xG�O9
��J�T�
Ծ�&Ǭ��MR�vl6�n�2/�S���b���=G/n�V�u2F�R�B��Yc�^�Y���=��zT���&/xJ:�gԢ,$yͽç���RG
��o�0m��+ѽQ�N�
%-wfa9@�]�d4QKa}�Z��S��U�!Y
L�j�=��p�4iG?Xh�j���,�DGi����hm��:���#ГYC��
� �Q�E����9i���tk�H�&�|ԥl;9��HӼ��7�B�n����+�ȁ���d��Opu at Yԝ�����ׇjE��*�|��b�x~=���#&c���7\�Dˈ�'pKC�����ŧ}����1�z��s<��9��Z���������[ɭ������<W���C�HL�d�W�O.] m:F*|�<t��U�O����?0�ɥ*��<J��#���v���M�@�e%����
�2�ޭ��L<?D�����c����Ӕ�d�b�&Y�v7O��t��p�ә���[����q8d���K}{yE���٬�9n�ȡ0�ê�(��C�@�P82	ɗA�~�9�������rjp��:x�oc�LQ"�ڄb�A�S��A�K��
}��)���N_��P^�+�o,��noЧ�w53h� ���ˠ�g�.���� '��ew0�G�l
��ǝ�N"�#CШ<(ؔ�i�J�/0~��D�8m�J�x�8�}G9
����,j
�%i8�J
�K��<���
�@�c� ck-I����r\���2�Z��M~�>!��*������U����R���@ũ�M�
6�9)պe�c2���&�S=��u�
�gb�/�m�h��<
+��ˍ�P��3
O�
�o�kx��o5ݳ�#��&R�P��#Q����/u:�2��� �BN�c�V�`�e��b�p��� *J�V���7�ӘP����:��~*_����8:�_�h��(I&��Y*&��:�h���依�{۪f�v<��ƣ:�;�룙w>_ۑ^�vKٖ�
L����
Y���;���詃��t��ag�۳�	6Ԩh�^����7
�Dġ�xʞ�Z�&�����w��^�a���x-�Щ�l�֞�TS�V�
۸��t�a�݋���h�!3AB�ؕԇ��� �P
~l�n1N](b��k����uڳ�o�}$��+I�|�P�M@֚6����)k�w�4L:p�
�M&%�:�򀟘ˁ�T7����.
��_3U��+�Y�}ۤ�ǒ�A��#�X�b(@�-j��~F���^@���
N�����p��������A�
�̩����N��rJ X�]>��
+��zo�
s�GEv��o�毟�j*f��c]�o���,��䙟�a
vY��iO���HV��{P
;�'5RI����
L�bw7ytm�i
���� G�J?ޱˁ��H�z����C��EZZ{��8KW2Fێ~V��S���D=[%�YG'���2���'�O5A��)��qAƷJ�t�|���D�[^Ew��ů?�����,6�r��B�;xBD�
j{.3E^g-�ѥZ+����
+N=2��%IWh3���۟�oC��Xw�G�j
˹u�����a�����%���*H���Η���
��,
��&z\A�&��(HC��7�{�{��
9G�{�f�ƏͶ���?C�
�Sr�NAK�����).���]���øv��Bi�"��
�w���T�
+x��;�B�Q�������Z�-yE���s��'v���݆�"�2�$�����؀
ճUF18�EDR2�G�v�.$�#E��RX�
�A at s��e7����bC n�;�2�3O.x,��ʄ0��0�=jy����̭P���o�R��;:]K��ezo*�i�x��y�z�\V���e�?�D�R�N-'����0f�
����/~�'���x�M���C���P�yQ�Ե��y���j-�U��\�#�հ�-]�W�����ٌ��њv��v{Òp-M<ŧH[=<��Y�p�Y
+� /�\��X�<�?���4�g�E->�y!�]3ĭI���27��{/��vÊ��Z���
+��7[X�6��/�3vj�U����Y,DR��p].J�hT
+
���I �NJ;�V�
��$�zar>��ȷ읱쑪�RG<�3�χWq�]�-A_��U�Y7k
��,�ު����iu��#$bޥX�ȹd����,�Lo�X�֊�]&^%���ڻ�
i�à��; +T�����1D�`B<�1^#��}�ɅȔ��.�w��()B/�#V����ݻE�n�O�l����I���H�O�P�5q
+�;ُ]Vn���Ӂ�ٟ�g6.�I&���j��X��6e�=�83�[�d��Ra���N˞��=��t���UZ��m���	뾧`ci�F���GE�~l
����y���%�C���,,No�
+B�����٬!��
�B�mI�@�J%����ߍ��WJ��I�2�����I��uX� ���c��?E�8�l�N�Um
1\o
E��NB���V}�\��dk���|�;��!�g<tm!�(�%�[$��)9���0�b�N��ھ�;��eN+���6����g7��X"ک��y��h;r�%�B�~J��)/�
�����=��%z�fGS�
2�d�*��<�Z�

�a��
����ڟˣ 
!���&u0���E�X�]�`��
m���:�^o�,�`
+O!�0#�
<�l��L0(�� �C��W#;�X �3���5���F'�~q�����{Q���Ι)4���
�����t��좳"�D�����c�dO��vc�ܠwz�S�
I�B6!}I����
+>AY�w4�?�>$�&Y ILȝ
C?p|�篇�@&,O��"�:���E( 
�����3<�TN}��
+2|
+���&��a�ǂ��V��v�̛����S���[)(o?R��'�?���z@�S���
�+���L^C�މ�JW�
TM��P��]�Q},�ф��j�(ǘ����[�����*X�#V;B��&�o�ŧ�݉���c�^�z����^{��0	��~�����
?���������.��E
���Sku[�ى�3�E2�&0
΅���.g^�G]~�/��7��

��g��|����g�B��[�҂��߯�j>ksR����q��:�̵��f鶓�X#b�'�yJعG�(��� 84�	BZ�z�,rY ֮��M�<e6���ɚ�&��y��Wu�(��6�Ò��}8�m���@�N,>~��L�j�!<`�y�I�Y`Ӊ���)aU(�!�礔�(�K��
������%��c���D����8n������N0�S~�s,#�λ*`k�l�:���`�?r,��ó�߈,/�N�����>/i/�=�%���6T�c�+�#�p]R���a9W�.ʗ���{!��`������	x-oR	����D�^�����]��o�PA޴
�����	ɐ�"��
��a�)K\ӊ��.�b��_���4
b��O�<E� weZ�T�2��.e̯o
+��"�$?�C"��|V�޹#)��Al-�����ʡ��,��,�,.��P� m.Eo�����С]f�
�.�2�԰5��=�1�����es
ط�8L��O)}˨XH���;��r�'
���?_v���������REU�L�ض`��)��,{�P=�i��_��#fBoe�c�CE
hW*���S��w��BP
�nL�e�I%e竑8��6)]%��XȓR[{R��`��oh�7���J��# k�EQ�P���e#��9
ڷ�R�ңU��y��ܺ�B��ƿ��l����7H��An�bu����
8fy.W*�:������$�qH�\�Q)�Z"�W�/�"��{��in	�:ồ�k��
o�m�l�Җ
Xtu���y�n���h??C��x6jO��U�G�,y�/�������v�ҫ�'g��{���d7��;/U/�2Tl���3��AA@�

����h�|�#�7Ѳf�C���^-������%<Iǫ=��~ex&KFę4�
�d�������:%�#
�
~ �.��3'��ύd]��g��_�iji!�T�LLQ14bx8���Q
����^GE�x^NJ=�WZrf8���W� 4��B�s�{H~�	��)�t�À?�ZN�{0B�rW����Ԝ�!�}��w�S%�m�XA���

_zb
Q�֖x�
�h�>�Nz��]�6�h������fn�"-��������m��S�հgќ�9.�Dy�R�h�b�Q�1U���ḣ�҇�عx$s�ƴ�~a~
0(�R$"�{C2]�މ�b���ws���k�7Q���๏�z	�
����j��7�ڽ�~D±ƨʼ^^G���կߡ��y&�̶��K\����7�{��
ڒ5DO��2��-!8���ce|��u�P}����H�k�J��;WxQh}Q�"��x1�b�
+�{m6�޻<��?g<�\I ʟ��6q�W�
����
+�
{
���J�Y�<��R֠�\1�
9N�hg�\�=B�=�>�����/?�kܚ8"]��M�
��Ȍ�64�/~9������D�k�0X����T)��Q�tGQ8�LҚ�@'��F�^�^�"G�FjXU�}�t\��p+�
+�]O�G at c�2/]�W��A�`K��dgıדY/�J�3o��9�	����oi��g
+�r�r��
*���׏�t)̟��]6�c�O���m�2w�,Z�<ZIN𡳓]� n���� 󲆟��
�堑��
r��������9H�����
��m)�c�1��t6�1w�
����V0'�V�b#�ɂ�
+�=�J�%Mt���
%L7�z��
�K��
n�֧����;�^�3����b��5+���B�if�9�����a�4S�xu�5�>�
�–���t�w�9c�}Պzm켢'�6�o,��4�a����*�Bp˝���Le��6����2ƅ�9��p!9{3�!J�-���+o��י������J*ap>�b˶nu��/��*���#��Sō�}���g�
+����9�8O�s�@����.nL�>��}>)�sb(��P�%/�K��
��(���J�g}j��?C���6U�LvX*����Jaa�
1��aE�#�ϸ������^Q�[Ѓ�R���e;�\h
������_� �tk��a�r �K�V�τAvvQ��T_���ހ[l��A���*�
v^��O@��	���RB���^��:o���`H
¸,k_b!�}^���2�'�Y�4rÅx�ҏ��C��bn�Ț5���N��灊V�
F7��8�T2@��'���u+j�W4	b	ڟ��_�R
iˈ�XJ��� �_�
P;
 (͞F�N��&
2�
���
�y���������|�b��*
����k�̰T�R?�hH��Z�������eF�>�C�Q��= dDTb=bp�
T}C����󫴨�ńl�1J��/�(R`�	0��]\s�D��i)��������ʴ=DMo�W��.�/�xԠ�
�2��P
��g�l�8z���Ԁ��
�I�+�m�=���{�i|w�Q���=̚�:���`�M*��`��}�A�֠��mvd�$zH(^Fv��]��0�y�F�TK����>�y
<�;��m��O�7���
�L�`}'馓ָ���]O��L�	M��P�C�@Iq(���2Iq�p��t��+��dg�FH{��
�k	��'S��.H��+!
�% 
�İ
Pdx�ny|x��^o��ҿ.��rOW�3n�hY6���^;�|��r���4��_7�x�6�>T�����������Ax�*�����i�������K����\̡�ϧ)q�����P���� �+㢭�BO�PO����M���Yए�H�c :��^�pCJ4?�Q�؜�(,��It
q.��!��P��<[��H��5r�26@ܴ�'q�h_ at 3(":L��6Ca�����n������������艦Qw��)ޅ e�
�yLKD�)������uӣ��|�H��FÈCiS�ɣ�W�����Y���B2�B�ٖ���X�j�N��"�nr����
k�ZW���

�7
Ӓ��I���ܵ�
Ė���N��h

>��
�l[�Qb�.�����o�L��>X_�
� ��4b
+MŬ(�ªku�:ܬ��*�!^�
�+��!�Z��
�
�v
+��	�G�!-��.J���!X|w�} c�f��
+j�s�!������}NgQ�����8*�]<��ôi�Sr��p��*Z����7:����5�A
�/AϤl�Rx��q��{_��,Y����|0|�JB�-�QX�#�dn�yO=�x�m���l�:I$
^�����q�
_���4�Zp� �*=0��
/x���r��]ʆ V�
��J�b��^�	�6�#��q�����1�0~Қ���W8!��F.
V������=#,��?'L�}
����_��\�����2Oc�m�^�
.�~��\�M��mt!��rFgn�p�(�Qr)J�n�5L��{uЩ[&_�g�cՃ,H$k-�kO�N�Z���n�fI�6�v9NC}U6��u��c�A�����߸2T����EaU~FL0�G��?^w7���]�U�
Q�Ȋ�m�BP�qb�S�H����?*���d
c�X��#��y���1GP��.L����Y�攈g
�;t�=9 at 4Z�>>��b4�H��@�jo����c���dqƳ��6w����
\
?%=�D��\��񞕻� Y�? �D�Q��u|Q��`�8�'S�2�Ad:�W)��ՀF�o�v��z�c�k�[r�
yq�w�I����E����0.��g�
�“O��_buL(+����_a���P��
�׌�
+�g.��)�<���BK
 ����^�8��ѵ~a.�U��Z{�����*]m��i��!s�_��W!<�\��4�w�Ì�Bl03����b����1 .c��
�\U��Dk�Z��xFET��{�
+|���@Ԓ�����S���G�����������aIJP/�K*��|�Ir�_�a�
�mRѤ���WT:�Y�]�F����B�	]�}������y��u/N��-�d�[Huۋa_��k�:}� ���U�x
,;����
�qn�h�J���o	;_��Wh<���+1|����B�Z�������6��q�m|,���q��:�;�X���K�1;���X�g�Z��$M���~/f�bd���OP�s�ʏr-��CT_���
+�2	���7EL�U�֤	�i����
��?&F
�p���B���P�.7 TYy����yx�i���_�/z,��0�}�@���̈�93�-��B�p
q�/�z�3
��jQ&�C��o�*q��3��a]�xѲ��!y��9k/;�ƺJ&}!��V5���������;j��M��ڕ��テw��
���E�4e�u{�ߧ� R�)�����5�ns��3��
p���4EU� ���#,���С���F��^�ٱ��-
���J�?g`��K�v��_�{��a
O��B:�"8�
+F�~��ǥ�d �E�y[/���`�%��]a��>җ0	!'d��
cM� :̥�?^��4�:Sr �ju6��=K��N��^��-���3\>
������rT�m:��D����*,�B��K4���Ş�����G���n#{m��YR@��F����Z���B �[��͓s�:�k�x�|Za�
�����y}��Wwv��Z���є��B���Zr�ޏ�Bk���%�R�1PSG��~�����X��.
Qػ�-�҄�-�y���g�N�Ij�����ct%��}g>,�ؗaY{q(�gN!b�e�n��
-3�*#�*@�D
�Ƅ��ٶD��KϾ
�
E�{�5b6R�O���[F�E+:"�%H��w"�ԋ��&0�LN��Ԕ)nR�O
 �.�JU�|6�ھ�jFs�iq
�� ��8�c�4��C��*��f?�f�!��^���hC�����?q�����ãCL�4���6��������SԬ\!�x�"�K樖���pd�m��~Ƌ{�/�

*,��FC�Ǧ�犀Ɵ*�
+S ;��^Cb��:��+�m�c*���JB�����\IE"�f�Z���*d�FEo+Ṽ-�)�H����ΩO�ɯ5�J+�_)�~��R���G$ˎ�C�?��\�*�C��,����z/
)S2LL�������r����s������s�K�
�K�׍V�!u��f" �(Y҈�n�)G��QqC� �c��X���6.=
+�*��
�M��`��^�bC��ҿ��f�8�*.��1e|0�d.�7��{��P��W�.Z�1�c�D#�.boPT�ް�h$�8KH=6B2Qx��p���x�V�XE���
��%����Zy�Z�Dk
�8��+�v���=(c����X@�U�l>�2|�n�z#VZƷl'���J�X��l�̹�&�0����#�jؑ�.�	�k�p�,~��_��u5(:��)�,��ID�7	���
��ǽa6x�%/�
��@�P��F��q!6/�Ib4rS����E�OmT����C�n.6�xM7�
+�D��Њ�zUX�c��� ^)z�a�
sp�`?
t�2h�
R��t��N�� �@fw+w&�6���%��Eb	�t!M,����gI;��Qͨ]��U~�=.Ͳ>��\��qO@�F�8x��';���$�l.�N�S�I5��� FX��
ɪ��޴�%
���A?��ޠL
���Q's�Ut�p��]�}P
���x5��CS�[h���T�Lë*=��^NL��
�,hz"$�E�"���s-�<���,��]��|qF���Eݗ��,��P
=‚�/:�\�G�|vXdO�b��0{��}�>�\��أ��{{uգR56���'+�@�r���N�^�=�M���a�Z
�hϩT�*�5���
Z������s�G��1ugf�ߥ��"�Ɛ�vZ��3,#������4:��ο*�(��ӵ����_ڳP�G���Ϻ�'�M��
�L-TXE���O1�V���f�lAS�T��������-*1q
+�	��9"g��1�h��Ƚ���k�Jtβ�G�d����[	4�V�k�zI�
'��ԕa���
��}�Z��oJkp���oP��
+��N|�ž��Fܧ^ţ�e,�f����[�
�U�n]Ε�c�s9
��=WE��WR�l,�9�v�Z���,���O�˳�#ӯ���Wi!�f��
<��eMa�0�����z��__�{�\�_.�yG�O�'$t����*�(��O��g��Ӄ\�6���p\��J��>���=�X �q��z���F�~��si|S�5ӭ��Q!Zc3����d�6
!
J}�F������1U��*�~u�@�U&�,9I��
�8���2HK�D�ә�C/E�H����_�ۻe�3צ�)�yۏ.T��Ё��$��ҫt|Ww!v��s�׽�������1�|�����qDm�՟s�^�2���J�
�Ӹtc�l�~��&a�Z4���^�
r_
Uq�71�RKv_G4����3�u-F/
�
+�٫�l��EbO�9��P�0`�˷1�Vz��2M�6"M�`;���5��A9�m
+9PSE�����;̄N���j�Ӯ�o����[�A�
+a�����"a����ַ��y;ڵ�\P�Һ���X��H�"���*d᪷mv��⢷M�X/�zu�ͷ�Nj��G�
p�(�� �g14ty
�� O�yӂT�Hc�C�M�&��^m
c��f�Nw��C�5�͕�MD��<����y�*�L
9�����ř�	F���3)��0���_-��3:@�<V'�Q^߀%���ʗi�&}a`��	��2�e(E�>Б?\/�E�[�9�AW4��u�)�@�w7���)�H
������"��!�������#�|W�cF��}�k8j��.���
xȂ���{�Ğ6+䟧��@y�^�G�	n���T{�Q�-/�#��)����B0É6o
��u��*�*�E6�
&�G��b��P�$P����q�@0�����of�
+J��������-fӢf��/w�S2��g�r�4�6���h�_毎^��@*2g����%�*��p��eE�WG#56}vm�k��`j�#�㕃����2
�2�'� �I,k0���JG`��O-v���a� ���U<��*���Q���P�p�[]
�����Ux9�'��� 3ϛ s�������P�o��<O�6V�B�nZ�^b���:YE�萧
+��u�i���_4O*@3��������f�
a$.�̕7Ӄ��+�B{�s�6xt�
&N
8G	�R�m����$R������&y������+�*u5���I)
+�Z�E��G�Ŗ]��]��[��?
U�
�D�HэX��B����I1څ�w�qU`,��X�Z�|��(�on �e_�����H���f,ُ6Gd �
�g�"�%�N2��L�c����_n>�Գn�H�C��1k��W�øL=���
M|zl�0*�8N� �?V��!�W��a�
+���Ӣ��
ф��
"�os��ٯڭ��i�����_�RP4��\|��
��LI] �*g������&��$L
�3?3�+�>|����T*�D��CT��E֌�S
�g�6~��2�ߟuU迻�"�S�GC]xփBϪ~�^mH���`�:T	�
+ٶH��Rk�6̪��J_p�L�3����d+L!��^�	�o �VXh�vi�]������ڍ��V�)w��E�^2�*W���
+��
+W� ~������N�[yU����Gg�med
����v_]�;�tڲN��u�� ���a�
T��9�U�����hQ��.�%!���h��	8D��r(��
/�
q���Č6E&��繊���[�����W1��Md��Z|�^�m
�����¶���t�	Dz�p<���(��g�>�ݢ^9R|m��o
C�EIYK^֭�[��"�KT
+��?Y��bg��]5q�Fѧ�@�^�Ww�r�o��=����
���N��.���>M���BB��
+��і:���4���@�˼qg��qx�)���9��Xf}���B.F���sJOB�����9�(T
z=8dvYNS҂o6�'�zŁ5[�e�jc-�e"�3�xp����}�����r��V-
+�F?0a�]���h�c��.,"���e_�K'�B׋�
�6&L9z�`<�W5�-!f�#�hݰ��
y�j
+)�	l���a<��+>���Z����q8���b8W����^
�.Ꮅ��Y�Om)9 � Ӯ���9
z�FSa�����1�s�P����|�8tAN:A��5�#\b#���mR��A*�y�JϠ�֌�p�m�*\�YK��賉���ۂ�Ѕ���
K�x=�2�.�s�i���7���-m1�'%�^3�-G��X���g.������������6;���ó
��i���S��9��z�9�l5�Xxv�I�èTA��1�;������L���w!c�)
��O
7��:�<ƕ$@k��N�;��t�]�YX�b��ɟy�Dx�D�9O�G/��r��v['��]n�Js��R'
'Lpm_��YLT{
+��a��
+7���Vc4�~���BQڨ7#daKH�+�hx�g�*��1��b��e&�
�S�]�$��*���������
���h(��XB�
� ?���uŠ��mx�B�U���Y�@Z	��y���l��\�gSXs��>]��Ӵ�~/�a!p�P���X�\=>���f~�< 
�Ɗv�!׀��X�tZ�1ɤr�YC�f�o-�����Yx�[c����)T�k�
�0 [a��4

+Qaᄎ�\�Q�^�e%qC�+�+�-}�N�o���!��j�
6
���D�z������´��
�n
=fXJþ_�2+9 at f?Oׂ;������r.����rY����Mx�W��?ڹW��.���c��ȸ���^1�j��f��Lu���^�a쐤�>ϛ|�P"��hYK��7�`�'!qıQ8�M롣��xG'��]��V�]J�n-m�>
�"pg}?����^:��[��Mk#��,��c�_�^���FD�Rt�I�-�-�X�
+�Z
�����4��d[h�
+?�A?끹
K�]W�k'<�f����	^2	M�ƑO��˱T0;�ƥc�!3��S
E3����i$��1+���|�V�ɰH�ŗ:�@���hy���^��Uɠf�
s�������-;���z��襩Y-�ܴ-��6��L�`�A���B�����
ڪ�T���+��(v]\Mx���MMm�� z2�\��
+��e�W�`�1\��݁��R��l���t�6+����z�5��
w�T���U�M?s��PIR�^�VP�.�7��R��A�"����
�{��)aa�dT�T� ʹ%�{VC���J��1�h�_Ļ[4r봆�k�Y�-�:3gڇ����}��v
�
a�$���Vu��s��F�<�#\u|�֢��+��g4gS?�C���Ƀ:R_]��Ӻ\�m��ڎ�k(�2�
�=�0[ٰ4�����z2�)�%8Nl�%�{��LER�Va�3�0x���ﷇ�K"\�T�K���?��V��S%��,�^�KJy�-��'^E-e��,��g�^�sd
῞qf]pլ�jxW�Ա�x�"�$�>Z�
吾]#�"��,ѐ�2�ow0��.��12wq� r<�c���)
ep�
6�c�9.l5Q��x/��~�T�ĸ7
+�%�b��8c���
iM��$.��q�!��Zh��>\\�?�$�x;�������b8B.,
+��~�5E���v�h�D:?!|o)�(�y�OT�����j�
E��
y��d�
��c�������@4Z7����d8�B�����w$Yp������9|7�,�w
+jpU[
L�G�d���[�ms�qxq|!�����Kf����@���k\���^2{�czR	̠�Nd�GvC���3�\yj8���'d�' !���QզZ뤯
4
�)�%S�҂~{>
"Yghl�[����cK�Td
�P����q.
+�wљD������nO|�����6��Ϳb�j<�iī���az<���(�
���������~�o�����Ө�W$
+c%N��,�
�
+�f�a
r�a�]<%������
�ԳE�"�#�8��0�O��o��
/�D�����Y.g�����
6!�\dnaHFU��_��g˶��/�
��,�I�k��>e��6�nK�����U
S���Im$�^@��$;�Z;��5ppd*�E4��hdZ!�M���j�8��q�
���)
+M��r"~�-X�O�"�rV���%�Ui!:��*��Y\�|�u�| ��S��+�`��m�Z#SLp���z�`�l��#�

��fj�Z*�9X^��5��䶿I��w胲�[�iI�`�,�n#Ëp⿯�b�ܫ���G�8X�ޔ�O�O\�o��)�JpA3�y��%n&���Q���{x��ڣ���a]�)�P`
+5'G�{,�ڙ�(
 �|��!��s8_�N�
�KB摽��W�8[�!#�${d'eo�2�x������>�3�c����.0���
m��
+F�ْ
q��N�얪h��bP\8��*D��U/"��%	/�5
?f+k@|'���q6s�׋ZZ>	�I�9mO(^���p�&
�,�{�?�
"NûM�L�Qh�֠l
+����Ǣe�hB.�j��"�o��EU�$~5Q�kj���Ν���v�)I� Y��ť�EFj�er�AT�r��ȶ{�hU�<��]v6��32S4�7媏S�� ��c�j�iwbV���І�Ɇ'�)nؚ��|�Q`�ȏLb�.�E���f:��
��qq-
]��a��(��B�������65l٭���G����

�Q����o=^-��T�?Q��Npo�mz��}G�0@ֵp�y7� >������:A��Aj�J�stЩ�>��=���4�<vӗm'ʌݛ�7E�\&�
�Y����b��
��6P��"����wp�=��1m����O٘�}��pH�7����p��]7�%����,�	�2Zo�c/WN-��w�L�����3��R�Y�gCL
+0���
�e�=	e�R�!��%\
X��ofY����x
Qs�����*:�z0l��f��Mx��?
Qmn]h
O�&,,8��`�2��g�ejF[�IÍww�Û�lS��w�So'#ft��yL�xG��;��JDuo {��"�{;=�
�J�A���T
u�줄+�^��^ir�x�,���*?\4C
����t�Fq���o��A�+'U�-�[��80P`��<zX��6tR�^E���k�A;@k�;���
���[���.i1�mԏ�CΆ;�?d��x
����j
	rU�_HY���
�AٰO���p��3N-ᮮM��9�c����rE]�����
txꎡ�n"���qȪ���L�������iOA���#r�c�;7�#U�K��PK�k�D��V��D6t����
riXM��/w�nj��	?
o\��L��-
+L��
�bs��v�y
��ۖ"꽺��c9��2p�h^�t-���x�V}:q&��L�y-V�dXyc%�\��ʺ��b�b����~�GOq&y�2�	�[��I�G��S�W���5K䵃��KЮ �k��چ������v�g��tg|���k
�_R'&>ܟ��~f�'>�X���
n�+�Uk
��a
+�����.��(�@P]�p}0g�N��H:�
}^���ބ�.��"��˄���@KE���臑_�6�a�9+�OǠL���=�X�D}�E2���*,�1��_�k굵9jT�hoe�Z���RA^���B �N~w5��K��K
+�P��Pko�H���ZdžE
7��8���{�A���2��NSgZ
�"ĸ�U=���We0��v��WĨ-*����r���3
�AE�  ��5�"܎�
ur���nҪ\0��9�c���
+��u)1�@�Yj e��\�V<��C�[G3�D���`��I]�B�Wum���n��C|/�v�;J2>��rC�����I��fcׇv��1�

��*�k9�~�/�ܐ��WVH��-�����B��;�n�<���� ��VA�td�� �{�h/vD�} 
g���
�5fE�tg������2M�J�N:���Az]s�?b�w�Ȫ
O>
+��
�O�j?��Ҭ|#��,�AO�p�����o�%e�q%�7?��Q�n�Q�

�S!ƨ���	Y��Z�>%q��ӫ<E!�d
��
��6�y�dȼ��	�Z
+�?t��_`<r,���1�_��J�����c��W-	����|��'�G�w���O��`��x��~��o.>:���8��]¿2|*,���p�
Hv�+��g�E͝#���k�2�ǟ��-\�M8s>')T�
�
��
+)�È�ԇ{�R�^��2J���-�g��D����V%�Bq
+/�M�mv
�Jy]��C"d���17
����@�o:	U�	�T�U����l��e7�,"�*��]i����/�Ay��]����1�#�
������N��U���1~��k��	���fj� ����t%`����<�$Eu�Yb14�a��K308F����e�Y�Q#/S"S
{r �Y�H�'B�����c6 ��
����^�J���|I����u�c��i%+�dH����LX0�b��-s�ْ
+2�*�繺q#��.7����_���S��>WӔ������J�2�����qM#ETooj�#b�')F�m���Z�
Sj��D�]CV/����zπI���U�Xii����~7R_F���Kh ��q�b

J7}Z���/�2��U|����FG�>Ix
��X:�����L��\�75U6 cJ�G��q��9pB�w8[]�/Xݱ����HV|�p��bz��S�yH���KzF�E��Z�~gF�K��F�u�}��ܶ�4ר���τTɇ��T�l�uQ6�MH�͆�Y�3^x�l�4��3ѳ���� =eIW��L�4�U����o���Wr�>�a<BL�7
f�q���O�
Ҏ�=�0gJD�O4�$H�����7Vz����p����9���p�Ġ#�&|�q/�p�(:JcYEV��a��
vɕ���
bY����������Q;���Uۣf��\�r��x�Ϲ���m)�
����#�!{����Z�ґ�7>g\#6�8�\�-���Ĥ�t�Ԉ�Q�<I͔IG\���0[
�VZ�~�9�I󃡇�-2Z��.@
J���r�o��پ��l��α�ۗX�~�OT�l첃6e��G�
��)��~�@�=�`S���깟�$턵ٲO\"]�C��߉��
h���7+�
ϣ�2�Z�� ��'9�&����i�4Ĺ_ �$�=W"�?���m+�ظ�+��
;�%
2�Gh��!_�(k{a��1h�g����p��.���ׅ�)�;�
%�S}���8�%}�����q�\��	�n<5
���ЄR�BJ���Ȫ�NϚ�
�L�w;%�t����v�\����A
�O-x���V~ÿ��>ӽ�$��zp*Ka@���
�\��}}l´$�s��qO*p�+�2�[2�
+h�\�f�,�u3�Δ-i��{�������%ܽ��
+t�1�y�<'p[�U�\\��� �' �D�KT��'�7�6�(/7K�� רk�endstream
+endobj
+370 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12669 0 R
+/FirstChar 33
+/LastChar 125
+/Widths 12701 0 R
+/BaseFont /KKJUWQ+NimbusMonL-Regu
+/FontDescriptor 368 0 R
+>> endobj
+368 0 obj <<
+/Ascent 625
+/CapHeight 557
+/Descent -147
+/FontName /KKJUWQ+NimbusMonL-Regu
+/ItalicAngle 0
+/StemV 41
+/XHeight 426
+/FontBBox [-12 -237 650 811]
+/Flags 4
+/CharSet (/exclam/quotedbl/numbersign/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
+/FontFile 369 0 R
+>> endobj
+12701 0 obj
+[600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
+endobj
+360 0 obj <<
+/Length1 1626
+/Length2 18571
+/Length3 532
+/Length 19495     
+/Filter /FlateDecode
+>>
+stream
+xڬ�cx���%�V%Ol۩�V�zb�N%���vŶm۶N�{w���>}���~��u��1ǜc�EN��B����(ng�L�������1rqR����㖥��X ������E
���v����@
�� 
+4�� ������"v�
�f�� *5e
jZZ����0������Nf� ��?�@k;{���_���D �l�ZX"
+�?��% T�j 	�-�����bdma
��0�:��v� � �v�&��������d4���t7����
m,����,� f����g�l��5�v1���_��ݿ�;�������
�h���d�ha�
�[UQT��<��
����d��
�3�ibg��OK������u6��u8ݝ��e�X8�[z�������_4\�,l���
�hf�hb
tr�
�����W����{C{{k�e��+�q�pvZ�2�1���i������-
�?�"ekj`f�������\����?;C���������h
+�(o���$���Ne��>��$�o��E�����F��%��{��Z���Z��������}d
m��,�������bhca����������6�O����ߑ|�5�+
ӿ�N��@E
gcs�����y�ˮfkt������_#�331��O���������ښ�'��R��<������&���q�W���%pV������"gg���
۹��9� �l���_B�
L>����b��������;@�o�L����|�u��1[c;��F�������/�?ncGǿ����������@�;�ne�Θ7��wz�s
v�ศvo73�`�}q�jA��]���m�r�����I����S��}i���n,kʮd�e.�)uO
�E'�A �^1b�F��ռ�����θ��^�;Է�6VG��'jR�<
�G{$_㔺�v�����3���G�������Ȟ}|ڬXr^WD��,|A-�r�h�P�J$t}7�S��S��s�`;mɆG5�.U' �14��?	��
�6�����{U��IG�!Q��?���EM�1JY�96~�B3Y��A���#��6�MˢM`ƒ�	'�E�/'��%�
+�
�*w1�w�Ƃ�`-\RȂ��퐡�<$��h���>����(��}H��Tn�:i.ME�h�`FnћX�t�ڤ����Q�[�"!�U�ߨhj����_��N&G�	��ZL�@����0QY6�'B��|�0�ټ�|e
G%�*��$��vB��N�
R�Zgk��HHޣ��)j"���j�����*��<I#ȩ7�)�GnS��D-��"��q=J��
�8s �3+�e�q8�Cz%�9��
*�L��8��ܫTx]����������;YoOn��L�>�@�	]�3g>���Up�obO��z���D��%��p���>��
R�R�	"Y$g��oЫȰ�	�
�Q�!j75翇���]�DlQ6k�UVWA3�L
���$�E$�(B��t�A����c�� �Y6P	�
�硃�L�w�
P$L
+*��)�y��ok%�T>��t#�#F��s�k���h��Z�6�r��&��s9�w
����eXs��
g�
�#
7�� ����g�,V�q�xbE
�#�[i�U��=7�
j�&%�Z�襮�ܙ
��1�.��V���>�MR�)K�G��t��0�S7p�'�8m��V]9�K�� O2V5R����P�?�8�oJ�B���w2DI_ouoB�7�R�(7�����]k
��-���6�0�]�f�D�71$�
�Y��"���q�|ϝ�bw
-�_�&0ZC.�tS��X�ď^�

\�h��[�X��M#{�KY� �)�����j!�ǣ?:�����m��.>a=���
���4��9)�"�}]6Sg�X��=���c��������x�x�}���Vx$�w��e�5iO��F6����ܑ"�om[)(ٔ�����U�Z/<�oÈ/w����C��=������T���U`�)�����9���hU��
��̤_5���;�IF��N�ڲ�Ցb9;���+�!�Z
���2i�Ňّ�"���h�.�8�8�Z��a
Q�O�x�M.p��RZ-�׊
�*F�wt~L�}I
!���bd�N<kt
T�1bn�,���jR-����a�F�����gM��/kP��/*�
+=bu�7b���	�͑f��5Iã� .���~7���B�㬻���������/���V�{u�|��Q��\��#��%'����&�֊�Gu�d�GŠR4�^�X�叡�J�?�K}� 
6� lk��
rd����ͨy��
�V����oR��h���XWq�M��W���P�����]b�����?�~�!�6��[�Y$��O���G4�5@,�!
��ˣy~ڶ�
+��C_�f�;�<�D(�P��Mj��փ=�p�gf��bh�'�z%�,a�f	%9��C�a��=�p:�b�~V�&����=�`���N�+�G��b�{V�{0
/�9��|�/G���<
C�n�^=�
�
X ����Qʣ*��T�}lCg��]�yq�{w֌R�
�>����*m�Հ�jl�]�?ю�JE�vC���n��qlQ����u��6�Cソ��cҔ:�gs���C�>0N��L'ކ�C�E1�O4
+��v*�z���;>�g�
��S@cH=Ӵ5 9�pR����Ґ+"�G��&��X��n�������Wx��>tD�{�t
���lP*��v��U�w$�1,U��
�fJ��\�c5*�L��I���� ��16Q{��������1oP��iPN��}�L��
�(p��$ͤ����z�k֖E���Ŗ{-�
�ɻ�E��:a�Wn5��D'���;H�KS����Rv�X u��DDZCM�V���
�y��V����N�h#	m*mf��)�	w��Jd
7��6��eS�0�����*p�d�,�%��
�?���l�
+�w郖ƾi�
|%�d�o���픍	C�LEFZ�(�ǗVan�c�A?CZ�N-�&�շI�ӺY嬊L�ͨȯ� ;����ý@�H��1 at R;���SN
�W����!=BCþAO~����J�<U�#r���:Ŕ��:}�53�M�^;_k'w������3�#ϼ��v3 r
+{J��j�;��
�� �/�A����.�2��`�
�ٶ����R��i恶.��
r��
��uG��F�p7���Bi"u=�&jb����ԯh��H	ϼmpo�D%�D6oպG�um������.�H�?
+�%쬰����z�E:pp�A�X���j9b*MBE'Q��r�,F���ШriZ2ۆZ�P�8�'���6ЧC4��!_z�^���a�������]�X�0�� -hS)O]ֻ�L<N� ��a=~��t��m�g=
�3��Q��˫
�٧7:�-.dL�@�v"�^/��>ޔ~5������f����܆|�Us
�
I�޴D�<&"�St[ծ+�)`폐~y�KF� �ܹ���b�Bʶ��<�1�p��
�k�fOP����w�6��d�LG����dݩ��L�'����
lW!d�0�~SL��Ӻ�ġ�m��.�|6
2s‭Ar at g�Z1Y�2��3*Ш	;������
/'�̷L^�1�v���u;�
+߉L���r59Ri��تݙ���b���7�v߻-Y9Zmg�ơ��s/��9{JN%�N��mCU��`H;�Xy�:�X�������u�Ӳ�y���햪h�rѝJn��G�8�4�JL�\�L�
WP������)�>�4�}.�(�V��� 
��zZ�U���@zS���>����r�7
�b��nI���W�%V�R��L����
!�R����\�g�t�6��{Q�x
�J�,�9���V�`%NC�q�4��(�;v��6�k��``:����ئ��zZ�i%����3�Gv�4()�K��f�g�N�ޣ��X]��x,�9�F{��s���;d�֦t�I���ʃ؟\W�y|��ֻv+:�0�O%�"yy8|��B�֛7N�
�8
^��E�%�K�����)M�� P�pч���"/d�K9I��*�K���u�����ڶX�Q��vSO^��J:=_������1�"��;������O�]�f�
�m�2���N����.5T�6��xN4:�. [...]
+t�98�[J�m5�	��Wh��l��C�<!������;�=B�1�V�W�yvY?�0Yh���S_s�����d5�]�Y�aٵ!S��#
u��H}�
+2�-3� �Ⱦc����I��

+�u�0p9�
k7�T����ӣ�zH
+D���#
�����@+��زl"���;�&���� ��d�(�P�u�.A�:�5��c�:����4���
��*�W�ĥ�+n �
5
+���.����{�[A:�?�� ��
�
 ����?"�ͻ?9�-
k�"�~��
���CO�qEj`w�;Ǥ��~�Y2��t�
+�5��]�1E#�W��-+�r�(���|_ݽ��]�+Ef����k_���̸_W��$sV�R&�xy��!���'uA��<@Bɉs?q:�� U�|��!�o�M��HtQ��>�^Ym8ȳ����F �χ^y��/}� �a�ƔI�
�m���?o��{�I/�GBq�];�$�e�����A�#�lw��Ak%�� �ωl{�
#%���ؑg���i �x����:T�������R�(j>���;
+��/^Ѫ�j_�t���Ȉ��֠�
�ޓ/Y��%?	
��s���[�=�Y x�iac��J 
j���l&�0!�
z`�Q�[)#�-�����K
�ZG"�u�>���s�r��r�;�p-�-/�d�Y
+]�R��
}��n��P��z���&R{/y~��vHp�<�s~��|d,WM��q���`�Ix*0"r��s�zۂ�Q�b&E���Bb��*?��Vl8n�Z$ѓ�a�pN���Y%%x1�vijvQT
I6)�H���,����O~���O�'����ʂ0R�ʊg����qb�SC���ە�$\J��w%��/*�Y Bf>����k@�U�펢�p�۾G��x����ǧ�1Ws
��������|�j%�,g�(��ݗduʺ�.�9g���TU
!�d���}���j^�(��V����k��!�6��]�
i�w�PB	��&iz����<���!��ֽ�,���}���>�B']#r�{4��ܢ	d.-
L�/W��

ᢰ|��}�u�
퍘��cT�Ɠ�G+���_�M_o�)
5��E#)�d=�L��u"l��~�}��G
+�qݨ�A�8] 
��
d��Y� 
s
�88@���(�OPE�h�`�
g��\
�K
�U
eɨ
�,ʂ�������‚J��l
D��]ڱ^�A�J���O
�k�]g6���[a$fɵ=��mا�`��+Ք�JJ����8K[SoDu��XI.�5�/��Ǐ���r�;�6�(�yt�4š@iG-0ey��Ćߐ���T���"�[Od�+��(u�p��a�8=�
�R�%Mu}�߉I���Z��8f��V�V�YU؃�	
��[��P1�$�HG��!��B��š>,[�-�R�lѴ����"E^J�28\?��Z���C��\�?ލ\��h
��jGn�`�mlT�e��-�.�]���?�;��H� ��m�5я��#��%c�o� �I	L�|:4��
�w�XD�&Amy�ce'�ÐK�V�=�yX��n2��ڥ�Y��tn�|��*O�GDR��Ml&Ȗ��ӿ:h�C(�����)�XU��lB�MIi�~dsd:
��U�U/
�܇S��=��k��ioQ�\��
�VDU'�����
� ��J�1�[�5PI9�߃�*bɾ��גt�˲����
��7Zɭ�e
����U��6m �D����qF��>l�
#E�A�n{�AszR�,�W�CG�
�+�� �J�
^sTN�?�/�I
�k%�wo��E��{7�veK����H��\������A��`\މ
�S�(ERϥT����+&΀�� {E;
ޕD� zW
�%!c<��+7��E����'d�w(��U�X~&��U=���R��
݉�7����sb�jE����
�
����LbU_%���X��w�Ʈc�V.��B��`-#���
�x�L'�Aq�z��ڐeH��@Z-07�
��$HU��P���pƖA���K`�
sހ���������̓<�&*�S:(ҧs[�{�ܝ�W����5B%&j�L[��~	Wn���b���̚1q�

z��K��j�����o��h�8���	bA��4� �9<3 3�e������!f>�"��0
~�E(���
A�����׀+��l�}��Wh�
��
�f�͛w-$ѡ	:�k�B�2�0�Ȋ!=�+�( [...]
K�Wb��ZS�����u]�s�����D|����3dv��㚏e��Lp3�vB�@��넩�D�~���O��%���%B?m��7�����CzZn>#<���	�
��ic�ͻ�)�^'��V���?��5Y�5b���gt�
J
D���E(�k+�
�@��Y��6[��73��o2�}�qH
����}+y�(卅t�����Z�m��p���mRЊF=ԯ��T�
˅3�ۍ��/%�ef1$7>
ۄ����6s��U���1���lw
G19� ]�h6��|x�Ѕ�7�(�?��o��u4�tX6�ۍ�	(���x��N�6X�|�`���A�=�ذ
�ȱ&
5�_Pm�9i��ߚ�<�@�e��L��&�*�~ne[���0��6ډ���'����`h؀�ČߢA��.,땭��P�>E�6D̰A�;ۍ���H_�����KpI�
(u"&z�-��̯Y'%'r�T>�i؞,Ȋ@L�e;0�7f�L��g�ƥ'o��a�3dA�4F�-4TOR�xA�Z(�*�<1 ��P�Ȅ��U*�2��c��[w�Q�9V�H
�hQ�����y>ʆج23k��FE|�f�99|��+uE>\��`��v�۷���|�	�A��B��s']W���K~�*u�wa��Z���q��pG��*b�M�����QS�FB���i�&�W��}���
���P
�Sl{��{
P���������j�IՆ�+���]����xg+�#� D֊�:����>�b{{����^�=��77�~~/��TO��^�����N~$���~�G�w?
�i��F��0�M��p�%׷A�ߤ��d�D
�<�����\��� L�X

�����V��!B!Ј��j�,� [...]
kķ�r
7w�]Ui��
?���h*̯2�����ꅳG���W�+�|�֐
	�T�P}p态j�F�E�O��
Z� ��ٵ!�����M��u
{���m�a
��Zb��ѴC1(�
�����>`�F����8
^3�
~���^���6�u0�^��@�c� ���r6���G�u�̷�1[�<?]kL��B��)�D{[/�Ioe	c�x"���e"�mC�����r
+ư5
	x�[Ɵ����RU��!�Rr�Ԗ�p^c�[fQ�z1LfPZfݷe�v�w#r�,�˺QG�hr����v�ه�
����w��(��Qn��Ͱ���S�ziH�i��i��>�
q�@�E�a{�P�m�
����[ӛ��it���Nv���%���e&�N
�M��z
\]�JP뮱l�(�88;t#Y�0�Q
K[�[)k��Ե�i y��b.oXw�� �0V
�(�B�{��w���6m
��
HA��֏�
+-��mk~����,
�7��N44����N��aTe�DR�(Y�L�áM�}4L�r"����6B
#4�
T�[J6#�^~�
žb��3�%����B�-����y�yA
+�ן1�x�+^��Ӈ�`B�)�]mA��
��<��K�y�?*��
�|����� I?	�t_l�%1���jF<���,A
8����
5���{�'��T����]LP`��ө��_�p�!q����”̗��š� ���$�N&[9�������x�j w Uֱc-~M�a-�;j̨���|hL&��l5uzچ'ޝi�Y�j�`� y�m�F���.$r�5���F.�.0�o�pn|ѝıo:1�	��w�xnm�[���4��۷z;"N�
+V6^�&��t.���b�e� �'N6�gB꥘��`��}O�EyU��F[N�<����җ7�����M�$�V�-�2�A���1
�"�U���8����bA�d��<*�k�	,�Jk at h��
C�B��Jh�4Q;�^w{Y�C�&+

Um
4�����7#xH��?�sE7����>�b�Zd�KkD���ŭ����0ʎ�@\(��k��;�_���{�^��N�˅�>(�C��9M�L��wT��V�m��6��j�YQa���d`��DMι���{~��BaavidLZϥ��9��}�Z� y�H��?�v���}�f�ͤK)kI��~��P�H�O��}S"�)��
+n�������ީ�=��):
7���y���*>�~
�UA����P�~1��tW.���.pU��˄e�aebI����н��ցJ(����'�]~���q����Lj!)Gր&z�	Z:4�Tn���s�BsH9��Y�E܊��N`�
�<��+�#}b$�+yJ�pچ�0���h/]q���s�(����2cR�>d
C
��&��
 .zIa�	�k�����i���
i:Ԛ���V�W����})V���j#�+:�ҠQ2�3Bϥ�$�{y��d���g�̕�f�	yZ�S�r�:��Wg=|'�3rk���~�'��zN�D�
t~4���ыFO��>]u� sV��j{�Ԑ�3

�����-#�X�zC]g69����Y���I���~�r�G��d|�f�Xh�#]Qp��6{k��#AFuV�Y�aj�=Gd��^:G����&�x�S�2$�G)��
�r��ta& �l���Gʗ�b�탁P=�HK�����K�C��g���z�X-�
ʔ�������
e�@�s<|�sYL|^���}w��
�x�,™��k��o���Wڻ@{�B����=�`������Z*8
3	7/�B�/�C����eN,S���J�$
$��E[�����o�fҷ,�lf��o�5
����E�]-o�i!�8���[Vc�m�XM���
�B�
�XBz�C�D�ҡY��mh�v,{;R�K�CI8�\���ΐ?�X��oI�,R���٪�~%)!	�k�a+~l�����
����U��2���T<	��ᅬ�=ά�*T%�-��[��+��͆
.�3;^�ƖW��-�@����iV��e�K�/X�$� <P[��!D���d��2')�w����J�'
+�O�
gr&z!}���U���R���!���]�6չ����Ym�
$����}n�?��
��
�
�y��##�8Y�1{#�T�
+�[D��{	2*�u&�t^~�nˇ�{!�9P��q��h�a6S�a�E%Zr�ǁ�����L��x�X��B�a�$�C�ձ8	/L�y�����7E�����4�� k^ݓ��f�5�q3�\~�Ҡ1�ɡ�_n��IK�
o�9��! �h�Qà�<��o����{6G��Q������>
.g��K�
+yM��.�n�U�£�5?��x�z�E��
�� �CWi��
J`��N�]����u�}>w�#!�s[� �9��$��EZ2�-��J}U�3�/�s�W���=�0�#������
g���]�gby~���I��LD���}�C���P�I��Ho�񣜖�z�&q��n����:��{jy 0�'A���
؇
a�cc8�XH�2
ނ�dl�a˨���WV�2oJZ�Wӎ��K�-XMu�5=�q�r����y�	!�qX�!aa�a6�j
��Q3��O� �a�[

r�@�\j(i�j��*�
�a�\��%���IՀ�6��-�� ��/J�d��7�,���*���̼P)�?uf�V[P3��[x���G�2	�ՔSװ$&�J�`N1T��oi�o<2+���u�G�9��<�<Q'i��ء��N{�㿼@&�
p#Ty����y
n'�s,߽e���x�Fog ~���Ÿ�vJ���=�:�RPu?sU�.3��|
M�v� �.
P��cy ���Q�1;ŏ��E�����o
���S�/�$- H
[�
)Q"H\egS
��7:�<w]/=!�8Ҵ�o�����@��A�`@H<�b�8wJ>�ȫ�C(�.�e,�K��?��ʞ�lG?���
+�2�Ƀ�<����D����Fj
ts�|W�0d\����I
���"m	��>nIHp���B��%�p��v�k�D�/x^�9�ќ��-H(�ՈE�Ϛ
8�\
+2�|��%�1
�W�x�+-[����:���V�+v��ڀ˜�,��/x}Hx�
1�ċ�^�
���u �pdݥJJ�����	�#�LnpQ~��z�1d��� <^�	���
�D;qMU�V�k ��G$
)i�"�0:_\{�,�`	՜Oj�\W�6*4)�~��͓"�<0[��
������hõ�)~���O�q�4�,�A}��<,ܽ�
�X��
M'~
��� �ӟyP�Y�s�[��u
�E���^�
\�/�T�C������m�R�D�h�QP�u��M�3
(�w������a�7 at y���R�5A`%�P�"�`[Z��Y�^�$��p4��@���*`��\�ݤ��֋=�ځE8�W7R�
+�>�X�l����&p4���y�.������
�\�l�d�?Qi-��$[,VGw�.
"�e���j8]��#j��a��	�� J�h��4�&Ѹ�KS~�mp��]5�4���k$E�H�;�2w��K�%X�g-�ʋ����

/�
W�
��?g�Zr�O޴d�qܪ�=1�!��l��s��G�
�n�_g��
!�+p�l�
P��_1�vk��I� ���DL�k���_�y��a��h����v�l���M�4>;
ң� ����
ܨ���m�w��
7������=S��W�l��������`@��Ñ"Q���k�z�`�s���`�j�����C�[O:g\X��SڃXpY��P�H���n}�o-r0s�P�_2l�i��ѴM8}V�-{/M��w��PKˍV�	��)X�����Ð���|Ɯ�!D�z�2����D�`?ʇ�y�]�7ؠ|������b��HFlib�>K��C
+8�|	��9�I:��!W�ƪ����� �u����Px���8�9�E#�zV
��-�9�(I����#�*(��~/u���HX at a�H����W�Gôb.�J}����	��
�8H��̶���5M���Z�<�kO9��?}�T��6����%��`��A�^Z��O,��x�ǣI�W�����M����:cy�k���-�>��Z��t�@ƭ���:��yc�B 8 ��ܦ(?�u�tL�C��D
��wN��^梨�_"��!*;���O
,>�a�U�H;c
+ee��L2w���Rw���@��Y�K���߶�$���>�uH��na٧;Ը����k�F��h�P�
t�8O��+�s5�
qV.����,�+Z]�+��IK&k�	��|���^C�a=�[��Fjh	2�+���,��1�M����r�
�Vj��
���[����_� ���h^*E�_h\��cwz)�V����Qy�b0���b�Z��Eԛ��f��>wܵ�.a�6d	y�Y�ƿx���ڄ9,��!����7�d.D�2����47v*�{I�[����nR�F���(˖��v��nj-�qi����ܚ aI'�ggʈ
7��}��8kfy�
+P�[�[V���c��
����z�,�}]
�?P�ق��ִ�rT{nZ�۱�@����Y�I�}2��_�ҧ'RG�w�ThK'Ib�k� 4��3u��C����3�{{^�ő�MO!)��a��RUL��Q�6.�$u%ʎ�������Q~�3o�4���������6��'%s=����j=���*aw��dI��8j���
+� G���>�q��������ȏ-0l��Ug�u��i�
�Uz4�"�!\!�
+͔�� ��
K%
���[h`��bx�{��kl,(�<G��
�0�}c�zF������/vr�6��FD��#f��Ӷ�bM�L�'d�@�%���lf�_�#��C��!�;��6�툌
+L$��$
�ޏco��w
��E��&oN�g�j 
�g�3����W���6?�L�m9���Eo��/
�=J�l$7
7|�lU�|l�̂r���r�A6����W�A=��z���5�G�7h�sÜG|��}sӠf�6�'o�d���T�Z������Q
��;���S-�bt�C��U{��J5�c2���������pK���RA5�EZ'U��x�Sc�/
��n�[�t�c}�h��wq�z/�Y<��w��O�K�;���.x	J-ʃ�:T��?�=�����I�
+�
�����y^�
>�pH�3��/⑨d�S<�aoQ!�羭
��0R=2^���V�>a�J��6
��O�q:���#X��G�1
+E���
�6R}-
+.r��N�_�Z�g��j'l��E}�n�R��h��pO<4֑����ò�+*~���e�_�{�[M�1eb�s��Mu�6�����!�
+��70�9q+�a�"��õ�
V
�
��F��u�)a]�7�T.����n�PVq ��د8	fP��
�u�x%Ȗ����� �p ����0��Z��'9�ro�#
W��+.����JH
���l���p����а+�:��	$e�:����H)w[�:����U�ye�5�âo/k�6{RF�d.T��>�0�Z�C[g�y�p�J����;/�,~�$w�e|q�'�u��J���FU,^
'v|�n��{��7�
~d6:����&k��~�c�ʠ�;x��aaf�b/�›
1��e��4r G
�jמ�y�/�� iK��(�i|V�G-h��۸���у
+:���-�C<��(�Gn4���%H�G�6I��J�̪��!���Z�q�����X����#
�!�R��F^����_Y
$��6�A��:����:{
�I�ot�A�)��N?�ߵ�΄`����֞�M/Z���LK'x�
�p�nE�[��'ѻ��uBE,����;��(s}����%| ��a>�=�/3���Y?j�NHl2L��#�W
��z���]9���GZ�?�2~��
�gI�5��7����*)��/��"�'�7ABeZ�T���:�~ReG�[�/�6ɓ�Ԇ�Sru_�G]鷏�+#9൸��n�I��@V��*���
������a?v�82O|��Cz:\hs̺[����W��z���wM��Yl�xV��|�����~�w#�!���-2��@�n#�d7HtC�9�
$kD������P���9B'K\���g��;��T��4�
T?��r��a�2S�d|��@
qť�B��I&��v�5T�S�I���h�J#vY�o߇�t-�ҙ^��t�+%[-�U.�a�~>++?���:f�dH��M at 9
!/���5�Rl�O��}��|�C΄*U�<�PRF�0������-��◹��V
�-�#ULe44�l��^�
+L�=Рփ�#�x��ty�c��J�-��qIB�.����֔
�WN�]��q6�"��ṷ�XZ/�a6����5��c	�En�u�
+�}W��)�@Yo�@��e`�E��3T��QN0��1����
���c��>��־�!Ih�1vSѾ
�
��?m,�J�
+VL�k=t����Jކ�[���4�r�A�*�h�z��L���ZW�g�pȕ�^�*�T �"�O˶����%��h7�rYX��МOp+L��.H}LPͺ��vі�&�縼��ˏj�'���L�F�����
�Pt
�?�|��u
��vƑ�"-�M��X�>o��~�4��h���,k��{*[�iЩv

5������;�?"�_��	g�濩
�M��Lw�tyY����*�ʛѴߞ��ϯF
�;kp�?as�OV��CxT ���(
V��֓f�|kZ�p�^hL�g��H���`�TUTh�(���j{��Z�g1�=[u����[P�S�S���
d���>�R/���/5Y��(��
pi��;�����x�$MK��G�_Pd_����pY]n�P�b�|b���Hم�pPQ8�f�~�ܺ�.ق�Xh��ӾE�z��Š�
��2�*��u�h(�����Z�,�Dk	=��@���_|�*��������)"����b;�A�Nm]�
ր�A�����0�ğҺ�9}J��O�G�7��>��fq��Z��D
P
V
]Ǚ� �~�g�g.A�䤑R
�S�qNl�0��o���E<wA:p!���
�@w�
](���7�XUrr�GE��gL�L��8!6`�%�4��~Д���7��aHOd�h��u;���8!��/�&�5at���[W��M�͖�
g+��_�4�4(M�TnA�-K
��0 �R�AZ��<G�_V��W�.Y��`���R�ƛ�ٍM25?�_��
+m"�����\<��c�f�(_e+*�P�<�

���e�t�qk���\�n�@@�L:�G�9D��{a�"�ap�R�Q{����ZGݥ��;-��r��!�}�P�}�F>^����
NZ
~
���K���P;�o�a/j�yȜ�-4��M�l��+`29(j|,0�c��봝���p.����a�9��t�Z�T�߹A̜��zbՊ�6s�Z���N*�����6��
YWo����E4 �.��Y��Z)qZ.���9�
l���
�}ϊ>&��~R���ܜ��仪�D�xR����t7oI�#s��M�pf@�e��}OxD��
�FT�ęP��
hJ�g��aC-c$�Āɰ�!ݪ��E���ݹb�B��
>v�����6�g�j�1��˘
+��}�a���
��#��ޣ��CW
�x�&�L�=�
b���,7ʃ͹1����}��&[
c�I.n���^/����㭟{�l��A���*T5֢���O$ꛆ�H�$�S��"i�w��Fk&�ͩ
�I᥏(�_�����}ӹ-s���wF�:OTa(а��.�2ҏ9i�Q��R�$�U؛��V
c�� ��i�(i_�ɿ�����֣k�٧�a�^��!r�(*����-6�M�T�ja�
j�e�
+r�l~phhma�$eF��-Vj�����㭂��˴
3�6��hZc�/{x���
8]Iv �byYֻ�R�?�z_�7� �c�/8VS�
��a�}��4�$�[��7�L����@�7ܛP�ŹE�jӿ�^y
�`V��ZZ
ֿ=k-�,�9��K�_W��i�6���`\�Xsט�L7��(w����m����;� ��L�0�xL����p`	����N#��^K��>1�]�g���ڻȞt2�"���/ s�[�x�Nf�(�i$��d��̗��b����L��9S��7��S�
_m!n�Q~�ʀ!?�dceq9�"�q����+G�B�3G@����D�c���
45�vt��4E�\l��B��Ւ�5����
��	s<S �8�g��A��
�e�j�!.��r+d�O��b�C>je~l��(����Y��͵:R}�簿�F�4�)8�X�b�q[�u���Zr�r�z,��b�K�ǥ�JWP�4cI�����-���5�r`f6-j�?�+h��T����gm ��D�T���X��F���A�%����qM[��8xF��y���
�� [...]
+T)���B���؍�MP2{
�|P
�
z�9��)�M�cAL.�� �?�M�̪xچ��0F at E/~3�Jc5`w�9�'B(��;1m�~�*.��,�O���KN�b�;B\y @8�<�Q�/lcܙ�h�f[��f�9�Y���v��
+� �s�(���p�W
�����Y�u�
����p�!�g����N�p�:�"#����~����
������jz�+e��G/r����F��W�M*H3#�h?� �j��h
�*�h�jMrKB
+�py��)Q�'��|=�)�U��S���)L�YY�x��s/W$���#I����,�@\();��QKd�0�0��"�ꏌ���Fo4�� Em���߰�3��������ۛ���������(V�y{}XkƧ�)����G9�C���l̛�-��vn�w�7��%*�d��~2+d��{�A|���L��ͮ�_\{�҆H7����8Anä�����~�;bm�t�����
Z]�"o�c�:�}sWL�9Q�ڐ�]�
�,��꫆HŅ�#�L����������.q��)�[���
UX�t�����.�)).�[�B�볝�ꟓ}�*M�
4�ժ~|˩%���j��~�c�[��K[i4�������5�fh&-�eм�?#@
>- ��٭ʀhVj�].�#��I�D>!�1s�y�N*w�,in
��
6���+k�(��Qg���n>�~b��
W�a�e�m��~Q�^�N
+�~�����C�\%܉o
u��Pmg���[\x#�!����r����~��3�H�v�"�P���bx�7����)�B�;.�ǭ}�T1�`���-\�[��G����<�.O��� �q�܀�GU�W��/Q�PQ&l
"0�c#�Zr�UM�Վ�w$�=A_�`0�a�V
�e
��n����M!����]���A�_&�����&��Ss��:=��O^��}����D�kԡ���16��`l\��QjO����ï���A}ϲ�;U
�M#)Td�K�v�=K�H��U���X=�\ӣ���%� ڈt����G�����rr��xL��sVb�o5�^ժ�/���A�-M�Z3�י愣��,]���
+�o
��Q���֙�����5rﮎ��v���9Zp���KC��a����;�6��(8��J�n�*
��*�l��Q��.qm�����g��
!�
j��{�%��)�$K�;�n*�:��% ʵ����ȑ����o�91y���+Io�@čr��#��:�('�7��y�^0��M�Q�T7^s��c�
�x�z���fe�
+��)��k�����W��R
�b��+��-�?$Q~	�:����JW[J���j�!�'��j|nV�y9�h��6J
j9�E�b&��S9;�p��6tʙ�������*
�>¯[2m:��o�r2`i4GQ�u�~큦p �²m�h�$Pdy�J�
H���W�ix��4�D�X���ǽ-���'��hk���-H�b�Cu�r
+
����E�M��SY�W��)�:B���͈Ƅe����i��C
+-�l �mQNX *��ACya���q��s�O�	e/�Ԓj!��?�ҫM
��X$E�K��;��&�N
HC��J+I�{i�T��Tҽ(��('����gQ�և��!��Ƴeg~�b
v'�2����'Q��	�_A���L
li�Gg`�-ɥو^A��λ�[W�ĝ,>qi=B��D5Ʀp����%\��e?0 NjC��U䂒y�B��#��9�h��t���X{V
=<���(A��a����D�W���c����
�V�m/td�N����Z
�jJ
�x�?l�
�Hq��E5�?Y�xgX��8��i��)j�ɏ; o&JQ= [
+~���ᱦ0ƛ������C��
c�t0��H>`�S�!0�y-��k����‰�)��i�b͒�Ҹ��(
�y��A;���Of�v�!A�9�<���;��
V#=��0{D��*��aԦ�Md�Q��<�t
�x����y
\WEW�S��n����h�jW	x\�UjP�
�
��W#��=j��C+�d``@���
�f�8^���
*
�ӎP	c�GJp�T.7��ѩ й���+��
+�Ȑ�cOJ�\N(=��b��4���H�&�,-�̘U.����~0�v�������r�JWlN���`cH*�� ��UnO�
Y/�~W���2�oΨ���S�&���ע�
+��8xγA�
43�-��Aq��<M���qYYuc�&�1iɜ�(�M܁�-Y��Ů�_u�d��5�:��Q|`���]�Y�b��MN[��)��n�aA�{�\���]��y�~�L�ӑ�WZ
�������@I2�mʬ)
ǀy�0��z;Y������Rņ������Y�
�hyn�[v���]٥��܀��D�7�蟼��˳�q� �;/>��_S�{Ei��V�)��������rDS���w*~ڊ�[��|���
+��4K�}u�6k7�9zE���IA].�*PC�r`n ��w��j
3O����c髙�
�	sA��-

W:rS�dKr�
��.y�yE��HCX�]��؜9X7űL�
�
�}e߮<	�<u��R/
�yGރb�d;w��>#�}+y�

�B�ҹ��
p���U Z]� �5x��]й&�F�*u�-����\��!+��SA��W*h7�׼TY�^(7x]�OMRV�#jT�x&�������2���sڲ388���c�v���qOU��y�:G���|���4fɡi\��R]
+��o�Zh�����&�ˣ�.$x�{2/d^
�P��{�r2`�w_��D�iq��N�`����X��B��w��bk��NI�~�A����|('��G��-��o��Z>��]3Tc�>�N��#����� �~hU%� ���p���[w�e�oq8
�WGr�M�=�����[�$>O�6
w�)���c�Q�V�N���T�aL*�r�m(
�}ӝF-��a��Cg���
7��&�Ъ챭��p�zV��ퟋa�Ў��4Ê�(������� ����
p
�c��j��endstream
+endobj
+361 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12669 0 R
+/FirstChar 2
+/LastChar 150
+/Widths 12702 0 R
+/BaseFont /JKGCMX+NimbusRomNo9L-Medi
+/FontDescriptor 359 0 R
+>> endobj
+359 0 obj <<
+/Ascent 690
+/CapHeight 690
+/Descent -209
+/FontName /JKGCMX+NimbusRomNo9L-Medi
+/ItalicAngle 0
+/StemV 140
+/XHeight 461
+/FontBBox [-168 -341 1000 960]
+/Flags 4
+/CharSet (/fi/fl/exclam/quotedbl/numbersign/percent/ampersand/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash)
+/FontFile 360 0 R
+>> endobj
+12702 0 obj
+[556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 555 500 0 1000 833 333 333 333 0 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 0 0 570 0 500 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 0 333 0 500 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ]
+endobj
+353 0 obj <<
+/Length1 854
+/Length2 1837
+/Length3 532
+/Length 2455      
+/Filter /FlateDecode
+>>
+stream
+x��Rk<T�N�d(�B�%䖹b�N�nj��eL�š
Ӝ)��_%m�BI]p�u���(�h��
+�j�����?�����Z_�����y���]�}xc[23tb2��(8
+ػ��(8��k�D6��p �A
���@�

+�2�X
�Ø�t{f8�RBـ���2	
��A�J"2 w";��5HD�g�� �li4�{�
�Y ��p
+��$6
R�
bِ3#�	`��dN���XbS��ؤ �Hf2h<�
��
L�,P��a�Gq'��A�/�/��6�N���I`��9lܙdb�H= ~����
��]g6�F%�2(40F����o
*ˉ��Q٤P �Hc�+8� �hE�ފ�
�g��ѷ�����
6��?�+5��Z�D���p$%&���_?�rd��d*��M� "y0�X
+mj
+�Q �A� 0Jlg0��#�8„`�K� "K��&�I�rs71�U�  ���2�l� 
+�,��|M�D2�B/�O
�
#�V�ffgnj�� ���(
����	��G�@�`�\Jq����xY �`�L������.;�X�}Q
+!+�{��L��ͣ�T� o��EaO��ImU	�Qu!Y�R���R<��*��$\�=m��W��%��n�Hoڹ5b�����F����﵏ݕ�#O��5|
��h�a�}
v�TfXb�
+oxR�E]K6.��{�ơ ������~��"Mj�-�R����{�g���lbdž��tl�A�,���5�������T5缊�����طhZqg���e��Vz���26(��
\�y�sbqO�n��ѭ(B�
J+�h�&~�X10
.������ݳU��|�LO
az+r�`T��W޾mG]�����Ji�H�|/�2���B���������!��=��}�]>ql�}��m��F���ܠc3l�WE׃
r���g�
��㥦YI��rk�gS�S�w��?����z��w�N�#������#˾�bm��)j?��X+��q�X�[q}�ZW��,W�@�
�V,j�|�d�E&y4�kf�̓Vs��u���J�AjM�e����=��ېr]*i���!:�G��W���
+�86!BC:歌��RʪХm�!7�#���
+
��;6<�
�@�>���6�S{0�M������Bv�kZ�
������~�N�؋C	�����6Ԭ�K�4 \��L���K��R�8a~��1=��!���s�Iu�S�w2�Y�B]�#"�~2�*wτ��t^�
ˊ
�f���VL�Op��"��s�z�a?�a�|j*W�Ek��	���{�eɎ{��
�+�Z�jiQN����&�n� �T/z�=���W�NHQ���G�.�+`�뫝P��M��Č�V|c4"L�w��ǐ��W�����U��c����Α��g�UT!M8��/�g�~M�-��z]�/�KՀ�g�@t`d�Q��#�WBo����%�%��R>K���2��J�|h��P�t�v����OwC<���$�,�򚛑���Ԥ"<�-�3Qx��v�����:K�*:a��~^4Q��Q~y�PQ�^��~
�s���Gek{�
�-��
�0��T�7u�o�0R�7�@����M�_3�ͫht�l7���̝�c��v-](iɥ�!�➨5ۑ�婜-��a&}e��O��Ӎo޾$������㈽ԃ���=g��σF��F��YJa�:�2��+��s�ܪ�an6>�0U
�}�����g`�TY�6�
'����h󍩊����)�uj�YYw�ͣ�\�R��}�}�$����tSN'9h��T���e��q�ef�R_�>!;ƛ�M�n�hIV%]��.Fm��w�*ړ��Qs.�;�[�ݢ��yw�hY>���ں48�3��3�5p�!�i��蛏�r�Sz{��U�BY�à���O�ē���Y�����ҵ�[���r���O��ja"��LF;h��^�Jwm��s9V�7o��d�cB��fKuǽ�}�Ty��	��'c���6��6s�i(t���t�j�q����=ӑ4�)P*к�g��C�kN
�?�;����#��Ս���Y��u�	�z�\�u �uV�>)0�c:[W�ņKT�!ro�hO��H%�����Y3-������� [...]
���'z�3�^�7wsn{�MN	���:Z��G��ބȎ�����
sd
-uJ�ꢠ�Z�ɫ~X��i����[�z
C�*/IZ��L�T����.j��<S�i��fy��'_�z^�B���?xǯ5�3�xy
Qɜ#�����^x���M'��W� �|S�r��"��5lB]��'�m?�����'H4���t"�Z���endstream
+endobj
+354 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12703 0 R
+/FirstChar 3
+/LastChar 122
+/Widths 12704 0 R
+/BaseFont /BTSGGF+CMSY6
+/FontDescriptor 352 0 R
+>> endobj
+352 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /BTSGGF+CMSY6
+/ItalicAngle -14.035
+/StemV 93
+/XHeight 431
+/FontBBox [-4 -948 1329 786]
+/Flags 4
+/CharSet (/asteriskmath/prime/infinity/section/dagger/daggerdbl)
+/FontFile 353 0 R
+>> endobj
+12704 0 obj
+[639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 366 1222 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 574 574 574 ]
+endobj
+12703 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 3/asteriskmath 4/.notdef 48/prime/infinity 50/.notdef 120/section/dagger/daggerdbl 123/.notdef]
+>> endobj
+350 0 obj <<
+/Length1 792
+/Length2 1349
+/Length3 532
+/Length 1924      
+/Filter /FlateDecode
+>>
+stream
+x��Rk<T�
v�]$����ff
C.]���v�Uˬ5c1�fZ�&���vI�J�ҖP�v�$Rٻ:�-m2j�L"��ri�~����O�w����������}�M�mX� 
+u�
D����w`�r Q�ss7�IL�
���

!�s�t'�	R���@(!0n4	,ݖN�
 ��Ɓ7LF�|��@CI	�x<0�BPJlE*� ��I�r1�B�
�s��������(!R��ʐK�2""�y��

+�G��
U&�o��n�.��|`���dI�a>Ɠ�)�b%�� A	|�4���E01:�I�<��¹<�@vT�-���ܱx��Hv4��<:��82=���� 4�_�׺ �O�:���N��Q@�"���/��#��t*�)����W䴽��l��\�`�� `	���b0�`0
A��
L��R�(�����L
*Ġ�eO޳I�O4�r�
~��1$�7���]]��ll���Q�?-gG�	�b�@qr�Z)��<s0e�(��)�v�9)&�BrIš–ҿ�f��U�/Ӽ��:!C���<.Y4pLQ��� ��/�s�|��0�'m�ۂ��U��'6�Od�S;
$;S�fOX}3�ٰ%��#�FN����)fֲ�f�ߚ��<u
+�2��]KgY��e�

dŚrU}���m��d�μ��˶E�KH��
pk/
�O����:�*�	�0��𺪭��D�q�;��մ��u[��h
;�kɢfF���=C����_��q�<�y�A7=��N�&z�&wW�zbK���P��l��@�ɗj}��h�
+.�&+�#ڞ\
��u\ո)
q��ڃۏ�4�x�8]��s�o��
��-L���)b踪V��r����+��g�����
S��&��Ԍ�H
m�֚�min��3�����y�75���}lg���C��t6ӝ{'�xe�=�i
��?*,���͹�oץ�h�����DwEԳ�v��r�l�lc�Gm�){�*��G��霭w�Z���v�K��U�	�s�S���|�o��{�v�ӏ��ƈ����zܙ���������=ᘣm`Ɂ7E3xXĽ��1��߹�
���C�uT�ܷ�U�i����%YM5�7.�����φLjVS]n���}>�/�j�
N-N���5��?;+4Ky�1�+y��U]���+��o�W���3���2�x[�׳y��X�K�?�Y���z�f�����A�Hb[W�{m����^�T�2��FF[��K�9+O��|�&���u;Z�s��|��}���7Տ�x�R2�{�ORyl�E��ƌ��7?�G�
��ש�<�WkQ����/�Խn/.�
��
3,�5��մpH
^(���� ��'�WhkK�R�ʺ
��
�R\����Yu�j���e�4�
�J
}��*�SZĮ*	!'sRF-&�>��^�M�I��
�5���_��8@�<���4kwBXm$[�2
.q�葧뤋'
�sGB��Yί
K$��&�o���J�V�8��Z��3�mt�Q�ig��
9o�pP��|���q��gV�=�����=�.�{�,�do���y8[S$
��� +������;�1��V������_��c�<l}���)�7XW��%3���T��haw��H?�:�a�?h
�=�u	�Б�_���҂|.�eǂ��8W(b����cq_�����Y3��+��d��ז��	̫
�,/������
+���p��N�z��jǃ#_�꺅�!�v�������2/u��[�a�a�K�W�,{����
������f�E+�֐��M����~f��)R�/�3-���

8�A k{�����a����]���
�����D����EX���Z���	Z�7��t+�����H)��������Y�{z<���Y�	'G
Wר����]
�}���������€�Ca��a"��xH
endstream
+endobj
+351 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12705 0 R
+/FirstChar 120
+/LastChar 122
+/Widths 12706 0 R
+/BaseFont /APZJKR+CMSY8
+/FontDescriptor 349 0 R
+>> endobj
+349 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /APZJKR+CMSY8
+/ItalicAngle -14.035
+/StemV 89
+/XHeight 431
+/FontBBox [-30 -955 1185 779]
+/Flags 4
+/CharSet (/section/dagger/daggerdbl)
+/FontFile 350 0 R
+>> endobj
+12706 0 obj
+[472 472 472 ]
+endobj
+12705 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 120/section/dagger/daggerdbl 123/.notdef]
+>> endobj
+347 0 obj <<
+/Length1 1694
+/Length2 7480
+/Length3 532
+/Length 8507      
+/Filter /FlateDecode
+>>
+stream
+x��weX�k�6�Hw
��
R� "� 
5
%�!��t� �
�J�tHw*����v�����_�����u��Z��Z�:�ag�5�W�r���8: �A@�$@I��$ ��ٕ�0��� ��H@ ���
 $���c(9:y¡6� ��/'1��=�; ��[�=2�%0p��B�@�
��u��q��� V@<`�D , 6P<�_��
�
b���\��K�A�.HQ .�Hn R����`���vD� ������*�0�6��W�?��x�=�������+h9ZA��v}
��8-����߬:
�Z*8��  ~�}������
+�b�
EX���0�8����R���C��C#��*J���R
u@<�t� {�a�~��*��
 SA�� �����ٿ�);X:ZA
l B"� 0
��CN�x� P+� �T, tpD � ���X;��~�U `upu���� N�^9ZYB
�%�X��!]]a�2�1a� ��uy�l��_�(2
+���_���,�pK��� ήP70
“��pq� 
b
�x��Z�@�	��R��)!d��9c�ȋ��z��w�'q �E�����+�?�
+��0
������
�vp�#�Y�����RV0��o�7��h��w�:XC
���AƁ +���o
)�b�ǚp��]~�9
��_O�߮*��
Pd�
п�Ho���K�/K
)S���
����o
)[�/K
�W�������BF��m!kj�\s��#W�_�Яr ~5��B�O�?��7��
+���׆;�
_	�X�+���A��	� 2�
l�oX�O���	"�
l~Q/ ���;��H	3Я'�����@��
+�������.�p�{�(*:zx�
I �%D�� ��������G���
���k[#
�@< �x3���R�v)��ž��_K0p��ʶf�;�}ӡV>"Yz�6���ܕ��n�#�-����4��Q�N��J�"s����t �
�<�"�	oy9�ջ��R3BV�$;�i�|3��~}YV��O��/&�Iy�xXh�f�aϣRRy�c:n�K�$c�?4���K��9b-�oq
+>_�3�v���P��\q���&։�0��eg	c?�1x�q�K�5��	�j4|':��[��A������O+����
��}�¶?i�x���m�Ѫ7i��
�*@aw�ش���o�/2^3<�}�\�"saH�ԨO59(h�Ɵl� �ɍ�(�^e�jbE
+i�֝'7���P������Z��o�B@��gր�V�Ŋ�Z_x��	�q�����yd�����W�>�+��?�1

D'�1��~�
kBŜv��GBR87X IM����9\�#��r�[ۗa����E���o�0*��
��}��x�riҁj�*O6�HUNv@@�;�R��(�+��R�ݚU����۳�VY�������5%R�xӌ�|
�)io��i(��q��L�;�<ei	)}���W �0y��`A��\DFb���@����c�$�Bo�	��y��I�3[F���W?��(���
%']��?_R�;�to���$2^5ە�.e�%n��������A� �aꏪ��E��y%PE
+e�h�y���ȮyO�n~=$���r��	\�T{{���� _�+!r���5���D�
��2
��=�Ad1�B
�q߆
��JeE�z�{k��;
�{�;��e�Q��@��V�$[>���;��I�K֡�4�U
���F�jTō�:� �h7b�1���~�S8�����K
oJ�G8W��dOB��m�4V�
 ���
�n0��۶�J���{�
+O����W�b$�PV]m�/Mܶ�{_S�L�j>�
+-����
̠c�c
��ՠ��sXtX�%&�k�
�����'�!�:�4h�Ӏ�c���|F���:7��
+
C��D�F��޺�ŇB�;x�_Xﳬ�ͮ�I��E�e单�������I�g|<���MU�)6j�d�/�l�w�^2k�6
�����)N�-2���S%ˮ�H�J����TM"fR
F���oVU�tܡ�!R7ks�F~��ڸ�'�Z�d-,��)��mũ�����Q��L���_iNs����������Žy���Y�k�g�m�F�5��b;d��T�#��a�@ƶ�{��ن:`�S>3��B�i ���O�A ��]'�Px%�(�e�3��4ү*��<
t����[K��q��a
X����iO3R��|>n�v..�n�(6�#�xE4iU,Z�8�=��A��� ��ā�f�O�a�2�DE0+�T�U�U}�fQ��1=����fs:��uL�EB�,�@_˳)
����_4�ƫ?׻A�L�Zj�g
I_��2ȿjr�~�P�#F�2����1ܞ�~pĠ�"��e�[�)�u�t�zć2��7b�+
�tM��&�a��58B
��E*<���%�i.	9��`i���7RW.�
���b�[�����XGD��$|6I��gE��?E3F*u5(�v�۲��RkJ��X\�n��>�1�ac���'��os~{/�%�jo�֧�'a�F�J�d����ix���f��γ
�"%�Wh^�Όp�Ț
~qR��hE�k0�/��xQ�k9I�J�]�
�@9gD����ȼ�&�)��~�

�Ǹ�
ߛ��yURI����
σ��ϼ	�1u
�Q�HC	d)--
�y@��.�6�8<A��4�_�e
��"N�<P�TPq_h���;lʉ1ds [...]
+�&vtNm�m��G�W1!'�WeX_z�	�^�Ԟo�)��E���׮߿�O�~�I��n��sr�#r�#~���d\�
w�3߯��G�ԫoL�I4ךyv�'a�7B���矲"c�7JG���r��>���rZ��C�����y�
�b~AT�D��Ӳ��3<Nh 5�-����0��E�jɣ�
3GfN/�o�����ݠ\{� �Y�b'��WZgGeP��Fc�[��C*38
z�.#ڦ�'Ub܊reN�"�cZE]!��=_7�v
�����kJ&��o��N6"	�S}��ߤ�9O
hvD�K<v��/q�d�8�k��c4�UP
B��K�-��"�v�G^	
��.d���ǀtXl`r�t�ay"���4Q���qDe�"϶|���v� �,����%�v���Pﺨ}�EE
O_�F�<U�b��ZJ��݋X�Ug�O���Ʉ�B
z��?E���
ɮ��v���K'9-�XҐ����

)�V�^��u:�v$qal��f��K��j�
�1�X�5����]7Mj�E���0�g���� [...]
�J璗WPEA�g���Q�
V����ͺ��?t��[�r
�1C�b^�h�����Ȼ|��9I���}�
}ֳ���TCl �07.���YsJ֣r\�;�YIn��&�nG��2&c�@2<g���*9͛��:� R)�1�6���Nw[��>��ݞm ��2�(p������

+|y�>�N��},�!�`�
�	�
<�
(v��[�R�աYx�
�d�YNs�"4�������>-g0~L����9���d–�5��
��;p!ן�6%�tj��{�b�ٰ�Y���(�XD�>�᠎@��mC';�]�j��~[�v�G�kQ�$�Ù���ĕ�@p0�ҏ�-?m�3D�!�~@�ZG9�iB�������آ(~XU�GF��RW�M�H���~l��÷��'K?��~��{���]�{�N6oq���v�6V�7�ww�b@�^?;���PV^��
܁0��(�����F=���	϶�<Ll�U>�kA��3Ɍ��7>�xnr���3�P�Ƨ���������G?C˓��'r:ӟ�kI���
+��j�gѼ~+1O�I���������.��|��bA�	J�ű�@!�z��i�� ����B�$_�(��	�&	�Z�\#�k�H���Ui���f>O?UCr���
Ag����N�Z��0��$ɱ�f+� ��d�C�ݚ�0�ޔl��)��:lz�N�w#��.��������gF�4;Ds�h� S,w�
��6c���,��
r�yH��Γ5?��Q�7����B����#^����_>�֑_]֨��
+�a��
��"��f��w�j�v��(��
���~
����Vm�:R�vM��-�}
���
��Io�@=�<��p���C��h�kB�M>6(��/-|m�2+d�[d�wf�.�
������D�zG
�x��}Z�S�'nz�&�,hv���\&���径u��$C�/ � �"$D!jTc>PS/v����F�,��Y~+
��"߶�����
+ݥ��Y��[��r҃�j��Oȇ�ľ��g��=����"3;]�˧
���U���Lq�;�>���R{D.�kL�u+�:-O۩B�EI���tZpE��0�P�F��MҬw�rr��`檸��c�3�ĕ��)I��!���
9k��h�Xc�~9q<i��q�}��93�E���R���Ӥ�W�6_7~�G��E�_5����K&��yJ�AX�nd.���;ԇV2N�d�7h�R��©[P[�!�A�l��X,%�c�\��}�-�v�2�Q�Rú����'ڬY~^T�E��o�u�����3�"�}��
�+䲙�Jޓ�g?��b��7VM}�D���,*n���f�%�A��dX*�I��䗘��""I����l����m�U�@��uݞ�$O�x��9����y�����W����r�_<c��3�u}�8����L�l��Pe%��OR�r+8�>�o�N�08:H�ݍ
�U~�|���#��tN�$a�0�5�O��*����[x�C��L-?��F����A���%m7K)�W/��M��-x}{l/Ee�ٷ��}�(��
؄Hvj�;�tǶ�
+8rSu��k�fg<��|� !r�%>���,��4Q�`���ɝS��>����Ikj��7
�z.��qb?��~������Ѯ��Nt��ѱLF';�������i^����a�=��kє��9�)!�bu8�1.� g!�u���p��&��l��v���W�=�4/|��
[ʒ����^q���R,�S����!��D'Q	�Z�:~DL�����=ү*r�/� �eB~<��YY����^����uK�6E����>�)���•��H�)�݊#Pa��ՎО ��C���}�`�Z�S�.j�G����*�=GB߃Tv-(�:�5�
�V�Fq�<2���I���7E��g�N�~����jAc#�Ѡ+o�6�m�79�S�!�
��L��3�q�5m&m�C�h	h�8�HJ��r�j�C�m
+�K�
��z?K��1�j�
M���q3Ƞ���	�>f{Twf#و2Cm��FiL
.N�y
�B����d��l��ӫ�G�t�>G3�^���,��9�&��d���7�.	�ͥ��JǤ����Eo�~�M_y`����
��/�o�������
�ve>���R��U�o��
g
�
�z�;9`*�$
+Ե�|5s�s���<�}kE�)>��N�h�A?!Iy���
sԍ��v��y
��
d+e�E��iJҙ|�
�
��3��
@Nӏg��]�g����mڣ	d7n�鰗�Ֆ�K���R����T
��ȟ7�mK���pYT"�<
;$
�s|�|�>��E����Z4�LM��R?�q��L����ZN�\�i�B+�QY-*Y�����
��Md��������
t9a
�^[�\;�2����<s鮞�V�
�
q��v�w�0��N�8(�*p+r�J�
�;"�Rx�:
Ɣ�}�^�s���������bhw}
]�
�]t�25ZiSI�)
+��*�(�yW��<��	�8ԓAr at 3>֝4v�Ƿ�3

�K�=
+D���h۪���+c��P�����&2�U
+��dP��_�H�2�k5P.���ʷ�s��V
��'���P�ı��9 �%`4 "�K�y8o�S@���yu#T�7�
+���ݲ�z������%�R٧9���I�Y��=l����Ep\��iA���LP|���b
��k�
���i�杯��`�<
+�㲘imJ5<�Z�q2��P�J}j�\��xN��b�����m���\���
 ]ȉ��R�a
_��[�t����|ߣ���WF��K�L��.�Δ�kKl�ֺ5у`�hC�`��\�]4�����u��
���W�I����._�A��$�T3M��� S��'6��1
��ޣ�D�qvl��"�E��2��v�ְ�
γq�Fޤ�pLJQ7��S1^a�HA�`b���~΢5��*UF<e�VN�U0� %�A!�c�W�������f�n����<��Ɨ����!�wY3ѥ�B	���
��W���1l�az�5�A�n��޾5���
+���ò٘�pV�P'.�

����~8F�{3�l�c��t��~��Nb�CӹI
+��<� ��k��6@�V����gDE�gҳO�z
^�m[
-DW�)��l,u���6�͕�9�����8l�.�ү�E�Is��H�ӗ �^}�
NM��t�Q�0�j��
o�:���\jM*%&W�C+Z3�Y�o{�o�_���O�B��Ɯ�t�f ��<�£�?~pUP��%�C� ��V��l�ѷl ��-�-U��lNj�'����u�G
�E�3��k�(5���
Z6n�eA�
+
�A���3Ś�Zi�橲�i�t<I���؛�j���:��MW3'Zv�
�"�s[�N��e��������"'��[���9'����f㳜�IG��t�c���O��SXrj�Ю�*cl\]�%K�_	�ӭ#������4�؄\����_�n���Ƥa�ِ�Z�����SyW��C^���a�C$�"*��d�-�a
*�3����Q�%��C���\��ʯ������gIy?se�BYeO�֪��1�S�saX� Y�D_4��d���^�_^��Ӻ�(�(1��\W�Ks8�^wC/#��ԻR�-��O$�ف�s�
+�o>2o�0�;a|��|2�}�! 8�fW~r%Xy��Q昝�o{��'�����ac3
�`+�\9�6}HC�+��=�1I���d<�\B*� � E Ș��aW��cT�B\�h�N���6��Dĕ����E�Ԉ�5jɭ�o���S�'{P��}�(��T�oWvF����.E�oؗ]��0�Bwl5�ʝ8��I�����!���V����z�&���ߣڞ��)ͽ}s����fZ����k��%���{��"���|�+ ��^	�6��n�s	����myA�M��ZJ��G�	��Rm�~�,t�Mys�\�.t�&������^�ef�7P_v/_ε���k��ܤQ�Q�
8q������a�������yG�t�������6
 �W��U-���M_x^NIC.�{-6�S򩋮X�+�����,�=�9�s�	�<�]��n��*�.�#.�{:�z?�^Ng�1�ZA��uJ�h�b��o�6z}~Ë�̰�(�o�Ab�t߽�y�0�4�� [...]
��K=T�E]2���N��S�	�@��e)/�9������Zr�q�a���K�mS;	/ڗX�Y��^�9�$�����ܼ��tsBc~4Tr>�a[�ޯߢ_D#�7�-��c{#�#~r��n��0��U��-O��&ϟ��T�ʜ��>���P�L������?����`�
���M*�endstream
+endobj
+348 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12707 0 R
+/FirstChar 0
+/LastChar 117
+/Widths 12708 0 R
+/BaseFont /JVSJFC+CMSY10
+/FontDescriptor 346 0 R
+>> endobj
+346 0 obj <<
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/FontName /JVSJFC+CMSY10
+/ItalicAngle -14.035
+/StemV 85
+/XHeight 431
+/FontBBox [-29 -960 1116 775]
+/Flags 4
+/CharSet (/minus/periodcentered/multiply/asteriskmath/plusminus/circlemultiply/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/similar/propersubset/arrowright/arrownortheast/arrowdblleft/arrowdblright/infinity/element/negationslash/universal/existential/B/C/G/H/L/O/P/Q/R/S/union/intersection/unionmulti/logicaland/turnstileleft/braceleft/braceright/angbracketleft/angbracketright/bar/backslash/nabla/intersectionsq)
+/FontFile 347 0 R
+>> endobj
+12708 0 obj
+[778 278 778 500 0 0 778 0 0 0 778 0 0 0 0 0 0 778 778 778 778 778 0 0 778 0 778 0 0 0 0 0 0 1000 0 0 0 1000 0 0 1000 1000 0 0 0 0 0 0 0 1000 667 0 0 0 0 0 556 556 0 0 0 0 0 0 0 0 657 527 0 0 0 595 845 0 0 0 690 0 0 796 696 817 848 606 0 0 0 0 0 0 0 667 667 667 667 0 611 0 0 0 0 0 500 500 389 389 278 0 0 0 500 0 0 0 833 0 0 667 ]
+endobj
+12707 0 obj <<
+/Type /Encoding
+/Differences [ 0 /minus/periodcentered/multiply/asteriskmath 4/.notdef 6/plusminus 7/.notdef 10/circlemultiply 11/.notdef 17/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal 22/.notdef 24/similar 25/.notdef 26/propersubset 27/.notdef 33/arrowright 34/.notdef 37/arrownortheast 38/.notdef 40/arrowdblleft/arrowdblright 42/.notdef 49/infinity/element 51/.notdef 54/negationslash 55/.notdef 56/universal/existential 58/.notdef 66/B/C 68/.notdef 71/G/H 73/.notdef 76/L 77/.notdef 79 [...]
+>> endobj
+344 0 obj <<
+/Length1 1630
+/Length2 21092
+/Length3 532
+/Length 22010     
+/Filter /FlateDecode
+>>
+stream
+xڬ�ct�]�%
�F%�c�VŶ�;6*�8۪8۶m۶�����ӧ����t���^�
s�5�&'VT�6�7��۹�330� �-m�]���m��e镁殀�rv8rrQ'������w# @h
+�4�� ��������
N��. *5e
jZZ����c0���_OgKs; �ߟ@{[���_��kG �b�Y� �
+�ZR� *	y5���ddPt5��4�Z� 휁� 3{'�Ϳ {;S�Jsf��%�
08; M,���M���� @'[Kg�� Kg�������
��,�Ll\M�I����_	98�������
�h���l�d���U����t�0r�'���_5��쯥����?%�K��������tw�'�1`j��`c��7�_0'����lig������FN�6 at g�0�����	�_�7rp���������g�.�@38f��1M\��6���c�gV�����L����:�����_
��gf��&adjog�0��1�ۻ�
	���c�῏����[�o���������r��_���w���7��; ��1��K���w� d�,#������������Zk ����L���o[����R����o�����;�T����`fd�g���ٙ�l,���W[��LL�E�jaibm�	��V�L�k��W��2��Jj����/Cſ�����7��Q�����<�#"b��g��гp1���fa��߄����\�,�:�fb�W����ϓ���3�7�gtT\��L�N����6qur�K��ߪ�����݁&p+��&�AV�i.�ؿǿ��v3�;ש��U�w���ns��W3�O�|�x,�:|�K�

wc�Pv%/s���R��nP�q�
0�#��iDz]��nAhs0��+)��CL��:�\=Q������ {t@�i�R�َR�V�zF�p��H�?248�uٳ�O�
K���"��1_P[��+�F� V8^�v��H��@F��b��"�W����2Z� [...]
�/
A��^
�Q(�tY��pp����z[?|v�S��WW�Ϯk��+)��+C(�fGr��Cba����ڮ�~����V<B��
^AYT~��ȚA��Hh�#���mδo�����'N�0\�C#g��Ґ�9��
_]��}��
+3�`=��U�!W�=�6����ICD��z'a]�~SOXl��YQ��C�wIP��hO����m�L�0�%
=����=�pc�`p�qF�
�7yv��Ȋ��Z�'ٞ�u��d�'�A��)��r�)��m���N�,��hgS�����I�+�,��m�:���s��kqh�pS$'`|oײ��{�i����4
�HAl ���؃���jRk
N7	5=���u�.⛚��,u�GY"�P)��
�#,��.\kE<9��(� �R��G��ze��/:N҆7�����?������$:9AZչ,��q`��*��R�C�����!�'~rg���
"���:�֜��u��6��ͫ���-��֭�
��JN��
�Q���
+]�m��d��#���/��EN>�&�׭H��Z�0��1�}5m���h6
+�W�6ܖ�P
��n1�����z��E�`�h�i-`�D��aAֲ��L���3��
IOO�F <\c�f5�ֵ6��*n�R8�ffy�֥$�B&oԪG_����P�c��'��$�������#/�{݂\V1;��
gUW7V:�MH�[M��J��W�J�\f#?2#u�B���0�%0l���g�e���	�=&�Y

H�'��%�n2'�� RI�Ȭ
n�v]AGr,�����{s� �#���(��:�;m����8+�9fN�L򇆗
�4q����^��E� '
	�p>��=9�p �锧�E�A�૚�[辙.��PH����,d�l�g�x��O�Ro��8����"8�1��<e��m=�K��
L:#�+�̙�g��e��_���_\�6�"��.c!5 \	��׺�<]��k*�G�T��p|
lo�����ˠ4��}���]N%O-�ץ-͟C
��S �ͱ�%����)
6����k8/Lm�V���!�DayLl�>x][r�
z���~��>�\7c��;�@m�\�_�5Q�*k����$��HM��n� �+|I�tBFX��-T�1��
SI@\	�Κ]
�#G�I���~���=�Z!Q�Cu\�H��>Y��;H�3G��Ş��aǘO�z�Q���r��/�Q�R�I:�K~�<$�ᜤ��
+��h���$[E �a��
.���򩺔�4���e��^�q-a��^g5)iק�-*R�@b�9�^L	����3��+(URy�s��;a�䚨�YD��RU�l����:�4�V�R���Lᶢ��$l���G����v���&��� ����	K��[I�|�cf�%�T�����k����UD��؂~k���w��n��i#�H1;��
n&��ɻ"ˮ��7���M��-�֗D�����´
+na�),�S<�G[�(@y/�`:��^�@#��Uj����I�a�f�3��t�"PY
d�>x?�$fg5=���L����(ck�T� An����k$j�a�[f�)������RUG
��d�_Ĝ��9��|��W�!�h��x�I�0?�T���st&�X���)��oR�㌆L�-(?S����Ԙ��
��	�7Ls[�K�M�����
k�u���*���P�4�'�HRB��2��'.b���W�~��'���	�0H#&׉�*�ĥ#�9�uS���-U44(�&A
M��S�l���o$��T���etˑ4z8&�
ȅ�m��s�$��
=��k<m(� dp��p7Ǔd���p�K����9M{�n&�\-�+"���C��7��.{�x�Uh^[Hk�K��I�0��{5I�F�S�F�n0��;?J�R�w�0�����M��	�Px�����N�Up�L!�@"�mCf:�\����ѷ)�BGl����{kM���A�
+a�Q*m"�o�*K��J���*I�.�0~��:��m�dщj �{�X�cD��i�����L��J�옡���͊��C�ĕ��sl����g�j>y��L�
�Jz�G�a��C��G���#��Ir� ���M�-
��-a8�
R(3�Ycw?*GMO�/���WJ62�_�f
+���k
�

p+_��A�o�h�O:�
��a�������@���a��bRT�sQ�5^"��"
+�^|̶������
Yt��\zڳzi�'c� �n��O�9
`F�Wr���
+5�	�)��Qz�j).�n���nm��%��Ai¢��K%��-~n`D�i4�d��S��aA�{ڛ�����
����֭߯��_C�R˷���V� O��>�D�E�4�oڮA����?�|آR�pb����
�d-�❥�zN
`� 
d��[��q���Ԭ���s��:�Rǭ1	�Y�I啚@�韬��������oO�"5�[���V�^İ��0a�HJ�T�:,p�����j��_"
���+|넛����3)�"U�r/�L
�R��X���f��}�j3,�f<��'�
\�K}�|��\0�/p7�%�V
�{�eM�%.���
�8��J��I����B�I
�B�v�>�Ϭ
�ś��]��{w_v��7u
�M1�V����
�m��(7�?F�b�p��

^�d��T���� �%
��rP��4F)��6 at Q@�)�S@���7m�M�f$��87��[�JT
nv���';�J|�
��]�CT%�۫'�?��Wuک����
��D
]-���R
�R�fc[
+���a���jf��/K��p�O1���7f�RVI݁Y�<(�~^BT��
�6vV�
��!`	'6���}pO��lo�Pex���=�{5sf��4	�F3k�?w�T��Go;�P3c�
Хm�);c���>bcB,��5��E�7�=�G��с �����GVA����@����A�+�
������0�Z~K�{���q|$L l0
�N���ZU���r'��yք����lU��Ȉ�g1%u^^�P+��(I_��΁#X���(��)�(
[�=�@a"���i�T�K�7N��Db�u���($�U�%���pc`7s�R߷1�m<�Ci,��d?�e!���g�<%�fIԕù�fZ����&Ap[[��V�@�B�$a��L��o~q�[&A
`�2��T�@!w���	�bwh�B�Ln^�[�������I�f 22H<&+��a�i�- 5���rZ��Z>[�gyf}<3��h]��x�W{䫤{�e��$��
+��4�ͱ�a�m	�oX�B���zļYζ�Q�S�Xz�e��U��*��+ݍz4�Z*�(�&�z��,"x��q��"�	�є���omL��n�$B�������*]����B�·�֐~%��z�� k`k�[��J������Ӕe����QY'���ٻ���2��ۓ�9ȕ5e�:
>�Q?s��W()�\�Mƽ�v+G�t�ߋ�U2��^C G�|�8�=_����#.V.Ac��
K�p�Xs�qO���f#��Q�44�
{�x���l�<��K.��fe� �p}�
�p^�S�9E�h��#=t���
!�=`a�4�D4ٺ�-�77��!��
O���p��u��?��)i+
�k-�
,k��vՑ�^�N�4�y�]�3�\���76�(����Rsԟ��{��&[����I��:���8a�?pmТl7�W	�$�b.\u�Y�_x���jʃZw�@�U
�F{�+���W���
s�+��(���뱺�L����@
K�v���=�Hwx$����'SJ4tu����#
V0�bqk#3`����W㝙K<���.�>&����;'BnI�����	�୶!J���48_	���;�ФF싄@�s1��L|)��Ū��8n���2��a�y�
v�wF#w�
�ӗ��a��|�w}!K$q9qs�a�X:��e�?�޵	l�I���+r?O�C �
^r�?�~�uSl/������k�vݺ�q��B���7x�Y���=� ���ą��,��SO�D�G���??�&���n [...]
+�]��L��ͬ�lQ"UEu����<����b=���U���6����-���c�F}��g�絒�ά�ʹ2��YN�~u?o��t�+굶��n;4�U��jK�e����a��V��+痱��z�3$���O���a�co�Yp�Pw�q�7�7����jx��s�
vVˆ5r��F�U�
�KR��e�vmĬM���t,b���hI�wj���B
���r���hFp
b�Lfv؎�2�8�A-uV[������UKk6�q��;��\[=l؄k�nݞ�y���9�kkؘ�]�~|�L'��NZ,SY$���W�
+R�՚dI�s�9ȴ�ׁ:h��M�i�u�d�y0��0zX�$��d�ģ��I�	� `H����[{�
��ȍʒ5��}
�8����8�1�Rh�ԏ�*�ol�K�Ո7q9�=X	�y.;)��Jf<X�-DO�.%4G�f����F+៹w�?��y�W�wO&�����8K�
">¯��'>�~�J9fm�������+e�r��}
	�]��R���=���.'^p�A>�߇���v��Uu߷��� ��7{����L�>G���R���L�*cQ��b
�j
[t�R����ۀ:����')��e,�J�ă�S�_b�G����
_�:�� ��!�I����Xz7�(�"�E��D�����i��Ӡ�|�4	�1Ծ�����"]>�
{.��Î%+�u|���c&�-ZPh�
�ܶ|:�yhU�jd��7�@7}k	�s*�ۦ
��%�k쨚�?J�V��S
��)��Fw����b�K��
IUb.�˻9�M�0��Q
��N�~}[��"՛�g/#	p�Z�]�i>�|�F�
�x
��٘A����gu-
�d#�X���Z�.�z�udA��_Y��
+M6�ۡ � 
|
���~lL_
�
+ G��0��6{2��+7vp��"�;A)2t�G�
��q����
t�2�7�����%�Ffa�� �ļ�'��"���LuQ�O>�	�5e`��;�|�K
u�
���M'�3,�Y��
�o6J?�s]�\���cjqBT�LJ�|M�Yu^վyV|��
��
+|cA_�.
i=k���G,.
�=1
c^��|G�
*��A�3�ǥY%�c��U�Hn�Ҵ窝�
E�_=*7oq[j�����U���,P6vc0�
+l���%��5/#����/��ˮ��z�G6���T"��o�V���� Ќ��	��|ؿ�
����$��c��m��������%S����p��n\���d

�Ӝ<�;�ۂ�
��,�J7�NA�
DL�$3�-���٭���
�e�
�W�UR����
[9c���#�g٤h�����5���o.�?�o�^�@���
y�y�-�J0���d�إ��.@��wC�v	?(
���E�x&��A��u�r�}p
��ϯ�鏐n��y3EJL�6�Ycs^p����
胞
�\UJ:'��Ʋ�G5c`��l�K
�g�Jb�7Egk<��CCZ�����y'�G*�R�J�_k��
+|���rT��P��	�y���
+�{���s�0�G�!f���5N���"��H���'
Fg}4/G���8	���I�M?�����k��;\�yN!��UR�_�&h(���#��k{�,.����z�B���r��]j1���Z��FH at KH������E�9��U��L�����\�9ȭ�ݢ�K��|�!vZ\����W�D
��㶒56��ܖ��%��W�>�J�:��tg/�j�HȪ���J
ʬ�����)�hzG}��#� �ՒӏdU�g;z�@"���27�
�w�c�%
�R�re������7ԛ�S�s��Ͳ�b�Mk�܂a}:�i��d�a�$퍕
�I�k�_Q|�$I�	�|' ��qt~z��4<O�
�<
�J������0~^`,��*H���&��3-'��~@���$�
5����Dm���W���/	���<Hc�ꐥQ�c���T�F�o$�ώ�墸�l�K��&_JU�&��scn�i�$�ѡ��|�L�!����E=��I��=�x_��	u:
�>]�����6�G�
���4��E$��-M_��:��d�Ú�N�~���Qo�g/+򫠥.ڶ3�@Z��n#���Z��>�	�����ň����9|?�A3����=E���8Y�.�3����>���p��
��(�ϟ��P�R��O�w�Z�coO�H�Xqe�
+1yJU���X�y*SA��+
��]�V>�l��S�]�h�(s��'������W0Eϡ�J�}�p�D���F��3FtJ*XH�f����J�8q�~��o���^��g�D;�D�ھ4�aJ���i
�g�؟}5Y�]"����[u7S�m���2F
��Jw�;��J��ٌ�By)+ru����9�h�߁
!U�?U!���[ЄgS��H������~{����j�n��
>e
��
	�<�E���y�*�mx�,{f���Ιk�`(܉LY��r=}�i9��L)�
+	��܉07��nDC��(�ˏ�_�3v��;w�Z<]2�3Y�]�H57��U�҉���/�yRt�����>��X<h��P�
E[$^7$�<�֋��8	/�W�"UZ��1[D�hG�m�W���O�[;�'+�W�c�lɿ�I ��<���|9i$���t�,��g�TiF:�+ӑ)� $7p��
�3��/�r����N5N�檏(�&�C���Z�B%%�P�Z �
w��^X��Z�R�^0��s��L1�5s�No�15ve�^$g�x���$���A��D8�aB�UƄM ~G;����ϲ��j�(�	��������
��k�5W
�,�-��o�
+\Baع��ij�
u�q�fW[�ه!�UR�-�3��E��%����e�tu@�WLE�s��Ԡ�"�`
~�&���	/�j�F\Ñ״Z
V܋=�aj扅q��+�]��J,|�k�(��Q�S@?y���]��U��c�\
�^��*o�Q;9��,_
)Y�5J%H������T�'>B�}�
��E�A��,�"a�� �
+{R
+��Ԇ�b�Ъ�����$�B�ee3���
p;��Œ�0�h�jB�a��f�
�<n��'T6]ͪ9��'��g�M�Ʀ8�,��@^�5�I�p}q�2l��,?����^���]�`� u@VYwP�sj�V	m3�����MA�5i�:J����>Y�ݑz)�
�����VR]����&��B��S�5tP1��ǔ9=��]��uu��
XW>�š�����x
��f[�3��Q%� �2i��= J@�ut�B��)�R����6B�cjQ�:�?��x�p�Ȉ ���r�
G���mJ�����]ZґW���|�}n:wv�'$숕�|�42�X"��Z��؟Vx��M9j+����}WxON\/-
*�I�ӝ����l5��k�x�繋>�
�D�@�J�e
G�;�LpDRE�U!ea�"�O���c��2��cZ�w\���t��63�
�>a�
�� 
+�k���Ò����쎶���d��1R��E!#�M�H���w��|I��~��p'TG��
�269�W�܌E;{��b����a|��-?�aT�P���@u�� ���~�Q��ԯZ���	
%�j~!���>Fs�B����-Y4B���}�粦���E:�z��ѕ<U6whW6�b��)-�!j���K�v�7��Q�_)A�M>x�������۩��
�GA�'g��8�G�U����
+3	���T�|:��R�y�FI��ZU_q	C���XP�|kr�ѹ�X�Pt	��܏e�ȧf50�Au3��>��J�2�
h��}vCW{���e��hoh|���K	�cv���#8���uc�`Ny�
��N
c3	_�=r��
e '%!�vPX�-a�r�'hֲ��װ���4����h��v7Z�PѲռ��(��
+�����6�c��!���9��I���CZ�ӑ��v;5�H�v���׽_jh���(��]D�h�e�Sn�I���
��x�ũ���9%�e|�uThG�Pډ��n׃X�{ʢE=���}ia6Y;��ݻ�A`V=e�cؼ	#��C<�K�����O;��.��{3+{�h�zڦ��n��
�$�Zl6�pl��¿�t;�]�sX�,��'	�c"�f�
Ch�iJJ��U ���W����Cw�A3���.s��2���ǹ9��&�����cI�*���g8�t
+А(JD}s)?�~W��*%�h]�
���+�,��-{	G��M��X6��
�-G�V���Ҩ�R�g����c�t�0�3�)V��u��Yດ�H��
�Ng� �[�4p��Nl�6��s|�
�	94�/�a��
w��N���|Rb���;2s����3�'�׾�J�ٙ����"QBu��]hP���b	
������Wrf1���v�o�4˓o
s�0r䅽z�VM ���Vg���h
>
�dxݓ�N����
�
#��Ɂ��̶�#��/7�_�Xӿ�6Z!�ݣ�Px���?Y�u�J^S���
���ES ~+�),�Q�tvz
iw
��
�����0X�
��};9(kW����5�u�Y�[8dsRY���!�d�P���$�Px(��β�3VN�sc��уSۇ!��::�"/c^������@�%����P+��E����dY�㯟�^�w9�ց�Ƈ�(������U�����o�C5�[骫�
��JSϧ�r���!=�-m�	ֶW�B��	�޴(���Y���d�آY�\$r�Ј31�͊|�(�Y��_Z�v\�t�g��*���؋��!����\��TG����
|�Yn���;{Bb��O��&@���A��A1��K2���#��NW<n
k'*�a6�q�Y��G/�M���3�7t��/�up���7�Ꮽ�0/��>�^�Z�7���g��BLe���
2U�C���pd4m$�od��,�	 [...]
⩃���*�9�[knY��.3"���Ң�NZ_�(`�L
�_�L��3�R�Ш�n�͟��
����
w�|�s���q
'��*n
GY�#�4�P������Sl�i���f�
Zu�=Gz�r�KU��U$ͮ�3����˫�
�Y�2�
*��t�~Ό�ձ�l��2+��.���r=��φ&,~I�V���vH�uJH�����5����C�z��h�����Jݞ㭗>單v�(���Ӻk���6�ac+�j��ڱ��Q�lm� �~��7}x���2�8��:y<�v���P��^V��Y>a�Ta�(xM����/RȬ�� 
fxf T���O@�
��za�a��-a.��@NJD���~ө&�5�]1N]ɏ�#f@$�W��]P�D]���D�DCK�4���s�9�ȅ�«>⣙�c!~؏�f%C|����7��3�l>S��ܭ�n�
+����n
X �(ȕT�c���B4\9�$zm���G��ߖ|���
+Pr8:��P�YZ�19�_#�D���
����9��h�~�T�͸^�\i��Μ�\�\�,f�܎l�{�{U�sH-����
�`�v^���q�v]�
��
�����'��>WABW�mnE��w���52��KqC�?.
;�d�����V��W���3�ޟ����F
\V�Ԛ������F�sϜs7�G���5?ւ�,�[>��C�q�4
�6�R�z)M��K�b�t��)
55h:��Uǝ8F�a]j��{7�te��!s=n���׎���
Z8��w�õ���t/����	���1
+1��;�W��7X6ڮ�u��c�l?�����Q��ߋ�r�3��==�6;;��
:>;޴81��M&g����7Q:�16U[�o.$l��_!�R;�h��j��u޸�Yc�T��Ѫ��3�9�A!$RF�Uw�3���\������Ŕ�������@�g'ޫʡ~X7T�Yq���4��l�
մ�q�[آ_9��H]���Ƴy�{�~ ��L0Q��&�K�-Ś����v����z2�$���m��x^3
�
N�b�(/g?@\1��P��7 L���!���*Q�<~�����9#��v���q�E+�2��8��a5dR���iW��v�-P��I�;�/<���F���A#.�|:÷Uc倞@��-"���ǽ�^�$z��4�8�A��,:X�A���
�I[����.N�"C��ȩF�%���ȀH���sBvG<�G���aT-�'E)�8�zK�_i,�c����vx1_v�|��d.���ͷ�z[�%�Ğ�g���7mC{Ob"�Mh)�c��=�����
}g��I��vc��|�
}6�㯟�t�)��R���d�GW0o�]�v
�JRJAb�
+N[��6��c�����Gm�����@l����	ɝ"c�kVR
�_�r
dJ�����=�(��m�@�2����	��YW���.�ln5v�-�Sq����=��ַ�=�[~�U�z�H;H
.)�e��9#C*v
�sd����_�j��``���\�i�,;V�u^:���qy
R˙Ξ2r]����Yu���c���aLy?P���
H
�e"c:���3�K�^;-�B��i:�`Iy�v��J�bm.Z���g{�7ғ8TO���Lh+����

���=���ى
��O�-
t���
+RPU4
4󫻟��s@
<P��,v�~h:�0?'��ɼ�
�2�-ΫX��k�.��6�G��е��#��j6u�#�D�N{mׇ)�n�!p� ��!(Mj����&Z��v�t��|:�A2%�>��O���vy#bS��|�bf�sr*�F폶6ezŐ�!���
+��G�=�a�>M9^�9�hV����BR�k��Mi�b�;4u�.�
����J�oQ)+�B�0�h��ةa�v3p��Yv.x^@
���8k�Uy^>�ΐ#f��9�8I����Ơ_�p���/G��Ï����-��qP?�E��̧�Bχ��D73��,�{͘ѷۃ�!���A5E�S#�~����8�ؾ��I:ꉚx��g�^ ���f����cF��z����U�
}z<>\:FIK��f���*<��}̄B(�)9U���EV��p��?�L	)�|8��!}�����<}���a�uoJ��S|�H|����!Ձ�Ս�*~�
~��\��kv�i�2y�����
#�4X�����X�:ˢՠ��<-��U�z�(� ^�6hc
8��}�ijIp��r�xb���&6C�����$�`
>��{kS�#��I'�剩�A��ә�H��	|��?�iOMJ�~D�,�
+ĚF��W��֠�ǻD
�;�Kq�ҡ9�eJ��-��W�p��e-�uds��Ry~��v����g���0���7�
7i�.�|/�Em�%��n���.QLPm�J����?��M��	Q��
A����O�S�
LT����Ȝ��lxc>���ƾ>EJ\�6+�Qn��<�
�-w3"9Qq���ꐗs/�bcș�A���Gb�w�+/�Mo;�FEBց����+��`'�kk� lO�*�
��)�	�9¨l⨋a=ev�ꋟF3CļZ�W	g��y��
��D&�
����
�}~<N9�{q�/��}/
�x.���� ��'M��g"Qx��`��l�a���O�S�C묵�v��}jt��ش�|�u�|J�*x�S��P�ʺX6qX0�Mm֞x��
��.e��˨Z��*0�.��o�
���k
�������g7����w�Bc	|�kVy�w�
1��y^8M��r��*U�)�&��7w1�#���UP�)��:�U�M#f�ŤRA�
��@��3����
�-�J:oEΎ�
+��S�x��U�S|��eu�NI7�X������j]NM۸���J<x��Ai���yCM
�5ǖ�,�AM
*�^D��A�# OP%1�yi�1*�L����
e���z�l�$V�/�4I↿�
+A�ڥ,4R$�ȑ!�������!�
�Ԁ.
K6i��;�J>҈C
����˱m$��S�j8��G���7�O
3R.U
~�g��0���{�6niZ+J[]u $3;�#�`a�
��ß�����C�+�<4Bb�3�Y������Ӛ[�!�
ێ�ͥ��#�;h�z(	d�����=<@�+�*��Z �s29���"a��֨�UFp�wx�M�.�'q�)���X:�Liѣ���P�e@>���8y֘�"#�S���)��]�y�+�Uϰ��K��{
��P�9Șz�ߢEݗ{�w���)��O^0H���t�,�@�Q���b�� �1�?w���	��'���zh�0��m��N���?Df?�7`
;��>
�L��u��"G������&	�%*͓���jb6��{���$�N�@P�W�M��� �zTOhL�%��N��ANt���@_�+q{�C�-��ws~q�C3���U����#�9�k�3M� �q��ˍ����׾N�t�=�[v�r�q�)|�V#! [...]
+�
�E
f�ԭا
�>F�h���r|���&�*��WE��Z,�Q]���>�Z����C�
K���X����U���������������� sR����_��0r�n��)�߳�\Dž"]�
 �ۚ����\��5�LcOH��m
��
��k�_�D{���{[�P�:6�!6^ߢ�%�
+9� ^�ov2��۾�jZ���x[֕~
�5
+����v!��ׁD&�8�`��,���[L��*�E	(*�w��c)N���K
s\ ӝ~��ܩ�cS�-��t�|'qqV�,���)����c�&l
'�M�_���	��Jm��D?A^t�%�Zj�4��DF���� ��&��FMC|�a�#�����te�#��4���=���煔T
2�����Zw9_��O�S
5���׉YX�}9�+J����AU���#�k���M���I=
x+�o�!
+c�?S
��&�m�!��b���o�}�}���
4Ō��x�b9��*�7gݜL4�w�Q�5X�Ş�ʋOKWf>�b
�$�c�S�{^�T��#��q�l�A3N��8
k&q�*��jnj�
�n.mOZ�b%��
��G���V�q�E�sQ,?�,�A{�������s��_�~�X�K>�A
/�)'Py����d�p
���SO�v+��tf[�����^*��S{�:sӒU�R�y�,��Q��
3��~3ȴ�&���~4�d$�Z�� _������m�S�^�ߧ"3t����j,aw1�
�lɅ^}˝�F�	:�x�C>$q�f��0g�7}���QT֧�|��L�냡Í&)�����`&"M���8o�9q���S-n��'���s�0�ط�
o\��8�-��BZ^Ve���}ba��^�
�
��X缸���T���:�o�I���
B8�Py��-���B[����aż��{t�ݹQ�(�n8R��`9E��~խ�Ϗ#<1dcmF��ˎS��N�]ª0���\?��Q�NA򱍼�D�P��Un��;\��� ,�E�|X
+���<�ud�N��E.���Mse��_ y�?�#���0u>��rT(��)28M�4v��N�
+<�gS�tB8�IY`z�IGs�u�=�
��ٽfB��}�]�ϣ,�l
F�X��.�a�oR5txG ��]P0���T��+J�
����	3":mx�F���E��ȭ�+���v�<~Ia�+v{��a%y�N`Gi�`���
��8y��r
0�Q�[�s���͓-A��J��Gv|��b ;m�M�L��J:��
�� تk�M�X
+L^��d���
�K�8�-�}��*ovv�]DG�{ ����1{ľ��`���x�&�����d��ok�����ܑZ*8��z�[�6�������&��Z#
�;�n��\,(�(�	���Ew��i���e�j�0V��D�q�kL�)s�
�'@�_�O=�f�<f���1Y��
-0AH�
?m8��G=+7�k��
��q����=x�x�����-�r
�i�-x�ZN�4�2�
KL�b]�v�C�A�b�"4v��Ej�,)����ۋ�B�~���
���z����
��
�q����Y����*��A��X���-Y�
\�ԇ@�x��X����1�Ԏ�wW�����������C�daGV7�(�V���K�� &�f�HdK��aN��\��f<�>&��(�
U�A!�9�F�[���Up����	2�}C։C2�T�r0-���ˆ��# Š��wGI���=�E�y3a.�'�_��l����k��w�$�)��_<�Ϻh�g�@G�,�Xk�
ʮiR�qo�5rxj~
+����a(��
������Bp�X�B�q�o���!	7�%���j&�?�Z:�w�ǑF��-r
�W&��P
Ԯ�%3c�<�Bqvc�������}ٛ
�[���:�W�����ܫ|.��i�tD$@��!)a���S�
+���=y?wu4F��<
�> i���F�����+�Νi&�K eq�4�;
�s�b���Z6
J@@9�O�9=�����AxI�"Z���Z�m�cdž�5�
�M��X�%���4m� ��$<�0D�i"�A��~�0[���4�V��R����=���막�|�B��1��?5ݔ��
������O��߈~��e#�[���<���7:xVP������:1-�l&t��6�����y����y�t�]�. at _s�C�$����ڪN��q~y�*�]��އ�ܥ�]?�1
�����z������Nf+E�0~Ē���_�e���@Y,x(�wwww���������
���w(��-@��)6�
�n�Y�.��6����af(`^���f�%�3�\?��
I뺧1(�)WTbR�Wq�_2c��@�~�[�S<���!�����w�(6fA�*
����
:�NnG���`����񠛴�D\�bn��~�h�'H׉c�9�����G��'���fÙ [...]
+z�XTg
+k0m��E�U���s,+��Fu����LeHj��;��cĐ���5J)঍g�tɴF��Z�m��){�1n
+N)\:�w���)�5��j��_,���vP3|�"O&�W����c
��b_�_2�N�M͜M�u��yz��eտ���L,��8�(�6�/7A���m��ج��z�?��7mxQ��8�MO��d
�%��

l���KBhS"�>�jk�9�"�B�ȃ�������
�]WÛ2�,g��?�c�^!��$Z)}�-C�""���V	�{���8İ�
ɹ
h)�"S�-|4���}����RK�Q�JGm�(Z�����ё���l���J	�������Q���y�
�`��PϮ�3�ߘM�m؄ý���������?��}�p�-*AR��FZCH��W��ǖ���޷%�粓�:�!�U���tY���ĺ�.6��K'-.�GQ,�ڌ�5�.�-&���
I�T7�t�t�
)g�$�:T����3T�]�F�F�Fe0���%.��$
M�O����ψ�����8�'CV�"
+��R�/���g����(
o���]���K\@�G��Ye
5�W2�kw��MY�������R��Co�E�a�g��hɀ�p�������g�h|c�7�Q:Օ(gj���C����ϴ�a"6�&EQ�y��&F���'-�I�����F
�K{�\��"ئz��z
m��;�p
�ġ>��[��<x~uu��/J���?OA�
�6�	��}
+�%��ۀ����κhBħ���_5�t��ͬ�.O���L��w��hv9���Z�ءS��:�u:��
��\��4���c�դޯ��bTɁ��¬w�

��y�v���:XL�bwo�V�+ǒ��`Aѥ���r��&[e&W�^���2�ME�9=q��c�E�V�ߍ/�ж0y�|�ݢer�`��=�s x-�/m��S�<
+
��T�*|�@
�CR�5�+�A�b~�H���#�Q�9ވ
+
�k�A������M���0��q���$���|0@�|$��)��_�d)J�%�9�;m���S�9at���iG3����.tB�E�z��#����y>��h
���R����B�
��D�_f9鳿D le��/E#����IA�N@�J�§
+ �2�
��~? E)�G��{ku[�
+�&�|�3��a����!g�c
�L������罛?�� ���˨���J*�4$�C������od��l�(׋���(!���<'k��͸�n �+��������n��aL��u�F�v|��0=��p
��p��w�)`t�v��kx��,y.8�9z|؇q�Edk
;�E�wF5Y\bX��[7Ά���R����
e�`���/�F��,_.'D56���>�>V\2NCRG��A�e��
+�M�y}�$)�����Ţ�_���E>�ܴ�����,���/%)���Ƃ�[Qۿ{�E{��!V�b=s���P`Q�Aϓ�j�k;l+�O�YJ��?�����{!`aaA({e���o��r%ʿ�SP��2X�O29w�LtU��^7N�Q���e����Hn�+^yb��!������ss�x����w��z{�������s=�7
�_5�˚�����E�ݎn|���cQ-C�^�7�R�{)��DWK����
+��#�\^/Wx\p�y��Cn���dY�X�H��:?>j����]�{
�����t�oM
�d<m�<n ����z��,ZJXl�s�u:���i�
}��n��R��놧��K��	�����)Fu�a���&�ѱb=Π�.��R���1��V��/<����n>KYv'�pb
&I�[��r��\-,Ս��ȃ�w)�
B�Nr�!��m�c7
+� �k�ʋ�F@��j���� �]��tDve˿T�	�{��
����V��O�{�͟vn�ͼ����VD��rX)�i2�M�$a	!Ҽv�.G���{�G���C��G�����$���
��ZP]��R۶���^i5�4�F<�i֛�Y�;���9�V��av��3��xp\v�FT@�Ʈ�<
iv�N�3W��留���A����g�
�8��
�6��jb��
2>ٳ�x�<�/��"ζ�]���������������
+��ٔ��y>�	
Qgj�+���J��r��-�}�.�m�?
��-�4��
&�$�.bF�.q݅�Wu���q~��6%'%:��%V�
�r��W7�&es
5|F
�
#��k@ⷪ�&1�4L�T���:_Ud����:կ���H$����Ӆ
+����NX&�{h,�iϗ��ꈂ��b�B��y���D�~����{
�<Y�.�5t�Y8Bx/�S6~��
]k\��9MG���7�O�
+�
+Z9��p�/[�CjCq��ci=E_�/
�
+~��<�h{�[�n
���USh���"GѦBo�r��\�AZ
1�R��c��a1��u
��4��3�f
X:�u+�R�k��wt$f�Q�����3(��@�G棾�]�
��D��K��ɰL���<�p� �}Y�]
��~��\a�bm�&���h0��r����ư?�0:��#�Ŭ7�|,1��m�f�Bq�14FB��
�M�<�Z
oT֩�K��(���������	P�3��
+�p
��G��d������5��| )�;r����7&�N� ���p�t�t��
y�X*Oh��T��2�|��I�~-�)
S�l�%��*y?t��E������a0�c`�ӄ�OP��3Z��V�m���O�G�-3N����!�So^&���]P��,k(���p�U(+�T��a�oF���#�tf�OV��
����6��`�qϘ+�
��r�MJV�\XI�Hp;]+�Xʪ洙����NR��6����5n0��zخ%�D����
�9+��r����f>m��~��چ�Y����0Q��禹�x_�I�/�<���΄�>5��.D��s�����[��e�����م��
�O`�V�V���ջ��*ULh������Xj��M�T�;1$�^��&N�]?A�T�+A�0�".�ȟ_�f��x��ăF�ƒ�+\�^<�x���peU=� z���[vu��u��)�1����
	�J�,��a[��W�|'Ṋؽ���=%��;��?�;?u�f���
+Pv۝�
&l);Ṕ�� ���<՚�w	
�㤘R	��\L�k�>�**���<���x��$A���"�8�����e��H��J1y��=v���$�
۩=.2��
A߆�j(q<�'o�:�["�Ej��k�ot��Ur
+^�(�C��,<���Z.$�i���
dNq��<ȧM��n2E�t��-q�8໌S.�$�
X���0���"&��.oJ�}���A�1��e�ThgE�
+|�Cb�A滋�b�k�'u�T��9
�pA�r�i��ws��ƚ�+�DWG
JA�*���w
^�
�L:e9|9��
2ZZ�%)��dz�����x�"I�D�QS�w2�Q+�(�v��{-y��6����Ҩ�$=Ķ`ZhF$�c�8k�p�,��k�
�0$��yυn���	"�!�q3
;D)r̔��)Z��T�#JXK��>(ǹ|��
���)Av�e�fI�0[���M㞁��@<��'/������	F
+�
�I���j�~U9Kŵ���ڦ���¯�
�e��-K�ߐ?� yq^��/$~�f�S�ʗ�JG����=R}�w֮�
��\�e"eR��<�jG����ْ�	��]r�m�o�UdI�OS�꡶��'���V����K���w�0��O���2��7�*z�Hl
��G���.�Q��W�Na
m#���ۭ�}�}� �
SFt��5��J^�%����_�B��0�] <)j�����y�.�L�r`�=�W���]W͛n����/J��V�0���T�����G{���#;g��q��#t?ggK�
+X��_7mY-�ϧ��o O�� �
�����3�6˩4���_0|�%�
��#,"-��.c�A���k�b�f�q49r�ٖl�B�gW��^�c��Z۝��CJ����]�%�I$��!��&�2f5C�'#er_�,��X���i�+�N$��"�q_�W,�dgs~�>������%�Q$7��Z8H��	�
<��((����l^7o�s�g��i����4ȓUC
jԼ���hI����
9�O]V.�^l �;�-�
������X��ו�#'�m�
�� ��
%;��[� 
��(e�Qp��5M:'ڊ�j�u���IL[E*7�S=O����q��h4�҇�����W���?��ͼ��OF6i�5-���ڀ+y�_��D������q�u���!G�E�d,̼M�>���de�ټ��*:��V(��bp�U~�wzI7�� ƅ�R

�^��A�B?q��^�|
	C���B����!���������d����͘]���@⊡���]֏�Y�n��Yw���Q"���~�5����U�k�X7���E��M$ݿ�o�� @�{"���*�8�8U at fg`�BC��Q!�϶㾊 n���O�e[��"�#��e���
`��H�U�FSe`o���4�-]N�N�n��Z�[`�����>�P�K����nB��y�e��<e]-F����%*}�=�[��{��J�T���xhB�4F��
:���v܆��fK�8���طwWK�-"����9��#�w�V>���c�� [...]
+�JP���T��#�
��8�H!	�->��-�«�;^���A����+"�������/�B`������������ �I��endstream
+endobj
+345 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 12669 0 R
+/FirstChar 2
+/LastChar 233
+/Widths 12709 0 R
+/BaseFont /KTNPQU+NimbusRomNo9L-Regu
+/FontDescriptor 343 0 R
+>> endobj
+343 0 obj <<
+/Ascent 678
+/CapHeight 651
+/Descent -216
+/FontName /KTNPQU+NimbusRomNo9L-Regu
+/ItalicAngle 0
+/StemV 85
+/XHeight 450
+/FontBBox [-168 -281 1000 924]
+/Flags 4
+/CharSet (/fi/fl/exclam/quotedbl/numbersign/percent/ampersand/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright/quotedblleft/quotedblright/bullet/endash/emdash/copyright/Eacute/agrave/aacute/adieresis/egrave/eacute)
+/FontFile 344 0 R
+>> endobj
+12709 0 obj
+[556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 408 500 0 833 778 333 333 333 0 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 564 0 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 0 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 350 500 1000 0 0  [...]
+endobj
+355 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12710 0 R
+/Kids [338 0 R 357 0 R 395 0 R 436 0 R 473 0 R 494 0 R]
+>> endobj
+534 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12710 0 R
+/Kids [522 0 R 536 0 R 544 0 R 559 0 R 592 0 R 608 0 R]
+>> endobj
+627 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12710 0 R
+/Kids [620 0 R 629 0 R 642 0 R 654 0 R 678 0 R 686 0 R]
+>> endobj
+712 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12710 0 R
+/Kids [696 0 R 717 0 R 734 0 R 749 0 R 760 0 R 785 0 R]
+>> endobj
+830 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12710 0 R
+/Kids [805 0 R 836 0 R 851 0 R 871 0 R 887 0 R 900 0 R]
+>> endobj
+922 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12710 0 R
+/Kids [912 0 R 924 0 R 940 0 R 951 0 R 958 0 R 979 0 R]
+>> endobj
+1016 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12711 0 R
+/Kids [996 0 R 1018 0 R 1030 0 R 1038 0 R 1046 0 R 1053 0 R]
+>> endobj
+1064 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12711 0 R
+/Kids [1059 0 R 1066 0 R 1074 0 R 1082 0 R 1094 0 R 1103 0 R]
+>> endobj
+1112 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12711 0 R
+/Kids [1108 0 R 1114 0 R 1119 0 R 1124 0 R 1140 0 R 1201 0 R]
+>> endobj
+1298 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12711 0 R
+/Kids [1263 0 R 1310 0 R 1346 0 R 1380 0 R 1441 0 R 1510 0 R]
+>> endobj
+1569 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12711 0 R
+/Kids [1549 0 R 1571 0 R 1595 0 R 1623 0 R 1747 0 R 1765 0 R]
+>> endobj
+1786 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12711 0 R
+/Kids [1777 0 R 1788 0 R 1804 0 R 1826 0 R 1849 0 R 1906 0 R]
+>> endobj
+1987 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12712 0 R
+/Kids [1951 0 R 1993 0 R 2040 0 R 2055 0 R 2065 0 R 2123 0 R]
+>> endobj
+2238 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12712 0 R
+/Kids [2179 0 R 2251 0 R 2303 0 R 2318 0 R 2326 0 R 2334 0 R]
+>> endobj
+2356 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12712 0 R
+/Kids [2346 0 R 2358 0 R 2370 0 R 2379 0 R 2390 0 R 2402 0 R]
+>> endobj
+2429 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12712 0 R
+/Kids [2416 0 R 2431 0 R 2475 0 R 2531 0 R 2591 0 R 2640 0 R]
+>> endobj
+2759 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12712 0 R
+/Kids [2701 0 R 2773 0 R 2826 0 R 2880 0 R 2897 0 R 2906 0 R]
+>> endobj
+2925 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12712 0 R
+/Kids [2917 0 R 2927 0 R 2935 0 R 2943 0 R 2954 0 R 2965 0 R]
+>> endobj
+2985 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12713 0 R
+/Kids [2974 0 R 2987 0 R 2997 0 R 3007 0 R 3019 0 R 3032 0 R]
+>> endobj
+3055 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12713 0 R
+/Kids [3045 0 R 3057 0 R 3068 0 R 3081 0 R 3097 0 R 3111 0 R]
+>> endobj
+3135 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12713 0 R
+/Kids [3124 0 R 3137 0 R 3152 0 R 3160 0 R 3168 0 R 3196 0 R]
+>> endobj
+3274 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12713 0 R
+/Kids [3222 0 R 3286 0 R 3337 0 R 3399 0 R 3457 0 R 3528 0 R]
+>> endobj
+3624 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12713 0 R
+/Kids [3583 0 R 3634 0 R 3654 0 R 3664 0 R 3675 0 R 3686 0 R]
+>> endobj
+3701 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12713 0 R
+/Kids [3694 0 R 3703 0 R 3713 0 R 3721 0 R 3730 0 R 3743 0 R]
+>> endobj
+3765 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12714 0 R
+/Kids [3755 0 R 3767 0 R 3778 0 R 3790 0 R 3802 0 R 3813 0 R]
+>> endobj
+3836 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12714 0 R
+/Kids [3825 0 R 3838 0 R 3849 0 R 3858 0 R 3891 0 R 3944 0 R]
+>> endobj
+3962 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12714 0 R
+/Kids [3955 0 R 3964 0 R 3973 0 R 3984 0 R 4023 0 R 4074 0 R]
+>> endobj
+4168 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12714 0 R
+/Kids [4113 0 R 4170 0 R 4226 0 R 4273 0 R 4326 0 R 4382 0 R]
+>> endobj
+4419 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12714 0 R
+/Kids [4404 0 R 4421 0 R 4436 0 R 4450 0 R 4460 0 R 4466 0 R]
+>> endobj
+4531 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12714 0 R
+/Kids [4491 0 R 4539 0 R 4591 0 R 4618 0 R 4625 0 R 4637 0 R]
+>> endobj
+4673 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12715 0 R
+/Kids [4653 0 R 4683 0 R 4733 0 R 4776 0 R 4786 0 R 4798 0 R]
+>> endobj
+4865 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12715 0 R
+/Kids [4830 0 R 4879 0 R 4922 0 R 5000 0 R 5044 0 R 5049 0 R]
+>> endobj
+5076 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12715 0 R
+/Kids [5062 0 R 5078 0 R 5095 0 R 5118 0 R 5168 0 R 5203 0 R]
+>> endobj
+5242 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12715 0 R
+/Kids [5212 0 R 5244 0 R 5263 0 R 5297 0 R 5343 0 R 5366 0 R]
+>> endobj
+5428 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12715 0 R
+/Kids [5383 0 R 5438 0 R 5486 0 R 5545 0 R 5551 0 R 5556 0 R]
+>> endobj
+5592 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12715 0 R
+/Kids [5572 0 R 5597 0 R 5609 0 R 5617 0 R 5625 0 R 5661 0 R]
+>> endobj
+5717 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12716 0 R
+/Kids [5706 0 R 5720 0 R 5733 0 R 5763 0 R 5787 0 R 5856 0 R]
+>> endobj
+5895 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12716 0 R
+/Kids [5873 0 R 5904 0 R 5960 0 R 6016 0 R 6075 0 R 6130 0 R]
+>> endobj
+6229 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12716 0 R
+/Kids [6180 0 R 6241 0 R 6308 0 R 6362 0 R 6397 0 R 6402 0 R]
+>> endobj
+6411 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12716 0 R
+/Kids [6407 0 R 6413 0 R 6423 0 R 6431 0 R 6439 0 R 6446 0 R]
+>> endobj
+6467 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12716 0 R
+/Kids [6458 0 R 6469 0 R 6479 0 R 6488 0 R 6499 0 R 6512 0 R]
+>> endobj
+6531 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12716 0 R
+/Kids [6520 0 R 6533 0 R 6544 0 R 6556 0 R 6566 0 R 6575 0 R]
+>> endobj
+6598 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12717 0 R
+/Kids [6585 0 R 6600 0 R 6615 0 R 6628 0 R 6639 0 R 6648 0 R]
+>> endobj
+6675 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12717 0 R
+/Kids [6662 0 R 6677 0 R 6689 0 R 6704 0 R 6715 0 R 6729 0 R]
+>> endobj
+6786 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12717 0 R
+/Kids [6761 0 R 6798 0 R 6848 0 R 6898 0 R 6912 0 R 6917 0 R]
+>> endobj
+6949 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12717 0 R
+/Kids [6929 0 R 6952 0 R 6966 0 R 7012 0 R 7063 0 R 7085 0 R]
+>> endobj
+7109 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12717 0 R
+/Kids [7093 0 R 7118 0 R 7147 0 R 7177 0 R 7194 0 R 7229 0 R]
+>> endobj
+7251 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12717 0 R
+/Kids [7240 0 R 7254 0 R 7288 0 R 7329 0 R 7406 0 R 7455 0 R]
+>> endobj
+7482 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12718 0 R
+/Kids [7468 0 R 7484 0 R 7503 0 R 7517 0 R 7559 0 R 7617 0 R]
+>> endobj
+7672 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12718 0 R
+/Kids [7661 0 R 7674 0 R 7684 0 R 7696 0 R 7707 0 R 7725 0 R]
+>> endobj
+7808 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12718 0 R
+/Kids [7785 0 R 7811 0 R 7820 0 R 7829 0 R 7838 0 R 7861 0 R]
+>> endobj
+7964 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12718 0 R
+/Kids [7917 0 R 7972 0 R 8027 0 R 8086 0 R 8154 0 R 8214 0 R]
+>> endobj
+8286 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12718 0 R
+/Kids [8264 0 R 8291 0 R 8300 0 R 8311 0 R 8319 0 R 8330 0 R]
+>> endobj
+8346 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12718 0 R
+/Kids [8340 0 R 8348 0 R 8356 0 R 8365 0 R 8374 0 R 8387 0 R]
+>> endobj
+8409 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12719 0 R
+/Kids [8399 0 R 8411 0 R 8422 0 R 8435 0 R 8450 0 R 8461 0 R]
+>> endobj
+8487 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12719 0 R
+/Kids [8473 0 R 8489 0 R 8499 0 R 8507 0 R 8548 0 R 8599 0 R]
+>> endobj
+8695 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12719 0 R
+/Kids [8654 0 R 8712 0 R 8786 0 R 8839 0 R 8878 0 R 8903 0 R]
+>> endobj
+8920 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12719 0 R
+/Kids [8911 0 R 8922 0 R 8930 0 R 8938 0 R 8948 0 R 8957 0 R]
+>> endobj
+8972 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12719 0 R
+/Kids [8965 0 R 8974 0 R 8983 0 R 8992 0 R 9003 0 R 9014 0 R]
+>> endobj
+9040 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12719 0 R
+/Kids [9025 0 R 9042 0 R 9052 0 R 9065 0 R 9082 0 R 9094 0 R]
+>> endobj
+9143 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12720 0 R
+/Kids [9108 0 R 9157 0 R 9207 0 R 9270 0 R 9322 0 R 9388 0 R]
+>> endobj
+9482 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12720 0 R
+/Kids [9439 0 R 9491 0 R 9511 0 R 9519 0 R 9527 0 R 9540 0 R]
+>> endobj
+9554 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12720 0 R
+/Kids [9548 0 R 9556 0 R 9566 0 R 9577 0 R 9587 0 R 9600 0 R]
+>> endobj
+9625 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12720 0 R
+/Kids [9611 0 R 9627 0 R 9638 0 R 9650 0 R 9662 0 R 9675 0 R]
+>> endobj
+9705 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12720 0 R
+/Kids [9690 0 R 9708 0 R 9725 0 R 9759 0 R 9788 0 R 9830 0 R]
+>> endobj
+9902 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12720 0 R
+/Kids [9851 0 R 9904 0 R 9962 0 R 10015 0 R 10065 0 R 10120 0 R]
+>> endobj
+10231 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12721 0 R
+/Kids [10190 0 R 10244 0 R 10297 0 R 10330 0 R 10335 0 R 10340 0 R]
+>> endobj
+10354 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12721 0 R
+/Kids [10345 0 R 10356 0 R 10364 0 R 10376 0 R 10384 0 R 10392 0 R]
+>> endobj
+10415 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12721 0 R
+/Kids [10401 0 R 10417 0 R 10427 0 R 10439 0 R 10449 0 R 10458 0 R]
+>> endobj
+10479 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12721 0 R
+/Kids [10469 0 R 10481 0 R 10494 0 R 10508 0 R 10520 0 R 10534 0 R]
+>> endobj
+10559 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12721 0 R
+/Kids [10546 0 R 10561 0 R 10573 0 R 10586 0 R 10597 0 R 10612 0 R]
+>> endobj
+10680 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12721 0 R
+/Kids [10643 0 R 10683 0 R 10736 0 R 10773 0 R 10794 0 R 10806 0 R]
+>> endobj
+10831 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12722 0 R
+/Kids [10818 0 R 10833 0 R 10852 0 R 10881 0 R 10910 0 R 10928 0 R]
+>> endobj
+10975 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12722 0 R
+/Kids [10967 0 R 10977 0 R 11045 0 R 11116 0 R 11184 0 R 11246 0 R]
+>> endobj
+11380 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12722 0 R
+/Kids [11318 0 R 11382 0 R 11453 0 R 11522 0 R 11588 0 R 11706 0 R]
+>> endobj
+11938 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 12722 0 R
+/Kids [11826 0 R 11940 0 R 12054 0 R 12175 0 R 12291 0 R 12394 0 R]
+>> endobj
+12544 0 obj <<
+/Type /Pages
+/Count 3
+/Parent 12722 0 R
+/Kids [12477 0 R 12546 0 R 12616 0 R]
+>> endobj
+12710 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12723 0 R
+/Kids [355 0 R 534 0 R 627 0 R 712 0 R 830 0 R 922 0 R]
+>> endobj
+12711 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12723 0 R
+/Kids [1016 0 R 1064 0 R 1112 0 R 1298 0 R 1569 0 R 1786 0 R]
+>> endobj
+12712 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12723 0 R
+/Kids [1987 0 R 2238 0 R 2356 0 R 2429 0 R 2759 0 R 2925 0 R]
+>> endobj
+12713 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12723 0 R
+/Kids [2985 0 R 3055 0 R 3135 0 R 3274 0 R 3624 0 R 3701 0 R]
+>> endobj
+12714 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12723 0 R
+/Kids [3765 0 R 3836 0 R 3962 0 R 4168 0 R 4419 0 R 4531 0 R]
+>> endobj
+12715 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12723 0 R
+/Kids [4673 0 R 4865 0 R 5076 0 R 5242 0 R 5428 0 R 5592 0 R]
+>> endobj
+12716 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12724 0 R
+/Kids [5717 0 R 5895 0 R 6229 0 R 6411 0 R 6467 0 R 6531 0 R]
+>> endobj
+12717 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12724 0 R
+/Kids [6598 0 R 6675 0 R 6786 0 R 6949 0 R 7109 0 R 7251 0 R]
+>> endobj
+12718 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12724 0 R
+/Kids [7482 0 R 7672 0 R 7808 0 R 7964 0 R 8286 0 R 8346 0 R]
+>> endobj
+12719 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12724 0 R
+/Kids [8409 0 R 8487 0 R 8695 0 R 8920 0 R 8972 0 R 9040 0 R]
+>> endobj
+12720 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12724 0 R
+/Kids [9143 0 R 9482 0 R 9554 0 R 9625 0 R 9705 0 R 9902 0 R]
+>> endobj
+12721 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 12724 0 R
+/Kids [10231 0 R 10354 0 R 10415 0 R 10479 0 R 10559 0 R 10680 0 R]
+>> endobj
+12722 0 obj <<
+/Type /Pages
+/Count 27
+/Parent 12725 0 R
+/Kids [10831 0 R 10975 0 R 11380 0 R 11938 0 R 12544 0 R]
+>> endobj
+12723 0 obj <<
+/Type /Pages
+/Count 216
+/Parent 12726 0 R
+/Kids [12710 0 R 12711 0 R 12712 0 R 12713 0 R 12714 0 R 12715 0 R]
+>> endobj
+12724 0 obj <<
+/Type /Pages
+/Count 216
+/Parent 12726 0 R
+/Kids [12716 0 R 12717 0 R 12718 0 R 12719 0 R 12720 0 R 12721 0 R]
+>> endobj
+12725 0 obj <<
+/Type /Pages
+/Count 27
+/Parent 12726 0 R
+/Kids [12722 0 R]
+>> endobj
+12726 0 obj <<
+/Type /Pages
+/Count 459
+/Kids [12723 0 R 12724 0 R 12725 0 R]
+>> endobj
+12727 0 obj <<
+/Type /Outlines
+/First 7 0 R
+/Last 135 0 R
+/Count 11
+>> endobj
+335 0 obj <<
+/Title 336 0 R
+/A 333 0 R
+/Parent 135 0 R
+/Prev 331 0 R
+>> endobj
+331 0 obj <<
+/Title 332 0 R
+/A 329 0 R
+/Parent 135 0 R
+/Prev 327 0 R
+/Next 335 0 R
+>> endobj
+327 0 obj <<
+/Title 328 0 R
+/A 325 0 R
+/Parent 135 0 R
+/Prev 323 0 R
+/Next 331 0 R
+>> endobj
+323 0 obj <<
+/Title 324 0 R
+/A 321 0 R
+/Parent 135 0 R
+/Prev 319 0 R
+/Next 327 0 R
+>> endobj
+319 0 obj <<
+/Title 320 0 R
+/A 317 0 R
+/Parent 135 0 R
+/Prev 315 0 R
+/Next 323 0 R
+>> endobj
+315 0 obj <<
+/Title 316 0 R
+/A 313 0 R
+/Parent 135 0 R
+/Prev 311 0 R
+/Next 319 0 R
+>> endobj
+311 0 obj <<
+/Title 312 0 R
+/A 309 0 R
+/Parent 135 0 R
+/Prev 307 0 R
+/Next 315 0 R
+>> endobj
+307 0 obj <<
+/Title 308 0 R
+/A 305 0 R
+/Parent 135 0 R
+/Prev 303 0 R
+/Next 311 0 R
+>> endobj
+303 0 obj <<
+/Title 304 0 R
+/A 301 0 R
+/Parent 135 0 R
+/Prev 299 0 R
+/Next 307 0 R
+>> endobj
+299 0 obj <<
+/Title 300 0 R
+/A 297 0 R
+/Parent 135 0 R
+/Prev 295 0 R
+/Next 303 0 R
+>> endobj
+295 0 obj <<
+/Title 296 0 R
+/A 293 0 R
+/Parent 135 0 R
+/Prev 291 0 R
+/Next 299 0 R
+>> endobj
+291 0 obj <<
+/Title 292 0 R
+/A 289 0 R
+/Parent 135 0 R
+/Prev 287 0 R
+/Next 295 0 R
+>> endobj
+287 0 obj <<
+/Title 288 0 R
+/A 285 0 R
+/Parent 135 0 R
+/Prev 283 0 R
+/Next 291 0 R
+>> endobj
+283 0 obj <<
+/Title 284 0 R
+/A 281 0 R
+/Parent 135 0 R
+/Prev 279 0 R
+/Next 287 0 R
+>> endobj
+279 0 obj <<
+/Title 280 0 R
+/A 277 0 R
+/Parent 135 0 R
+/Prev 275 0 R
+/Next 283 0 R
+>> endobj
+275 0 obj <<
+/Title 276 0 R
+/A 273 0 R
+/Parent 135 0 R
+/Prev 271 0 R
+/Next 279 0 R
+>> endobj
+271 0 obj <<
+/Title 272 0 R
+/A 269 0 R
+/Parent 135 0 R
+/Prev 267 0 R
+/Next 275 0 R
+>> endobj
+267 0 obj <<
+/Title 268 0 R
+/A 265 0 R
+/Parent 135 0 R
+/Prev 263 0 R
+/Next 271 0 R
+>> endobj
+263 0 obj <<
+/Title 264 0 R
+/A 261 0 R
+/Parent 135 0 R
+/Prev 259 0 R
+/Next 267 0 R
+>> endobj
+259 0 obj <<
+/Title 260 0 R
+/A 257 0 R
+/Parent 135 0 R
+/Prev 255 0 R
+/Next 263 0 R
+>> endobj
+255 0 obj <<
+/Title 256 0 R
+/A 253 0 R
+/Parent 135 0 R
+/Prev 251 0 R
+/Next 259 0 R
+>> endobj
+251 0 obj <<
+/Title 252 0 R
+/A 249 0 R
+/Parent 135 0 R
+/Prev 247 0 R
+/Next 255 0 R
+>> endobj
+247 0 obj <<
+/Title 248 0 R
+/A 245 0 R
+/Parent 135 0 R
+/Prev 243 0 R
+/Next 251 0 R
+>> endobj
+243 0 obj <<
+/Title 244 0 R
+/A 241 0 R
+/Parent 135 0 R
+/Prev 239 0 R
+/Next 247 0 R
+>> endobj
+239 0 obj <<
+/Title 240 0 R
+/A 237 0 R
+/Parent 135 0 R
+/Prev 235 0 R
+/Next 243 0 R
+>> endobj
+235 0 obj <<
+/Title 236 0 R
+/A 233 0 R
+/Parent 135 0 R
+/Prev 231 0 R
+/Next 239 0 R
+>> endobj
+231 0 obj <<
+/Title 232 0 R
+/A 229 0 R
+/Parent 135 0 R
+/Prev 227 0 R
+/Next 235 0 R
+>> endobj
+227 0 obj <<
+/Title 228 0 R
+/A 225 0 R
+/Parent 135 0 R
+/Prev 223 0 R
+/Next 231 0 R
+>> endobj
+223 0 obj <<
+/Title 224 0 R
+/A 221 0 R
+/Parent 135 0 R
+/Prev 219 0 R
+/Next 227 0 R
+>> endobj
+219 0 obj <<
+/Title 220 0 R
+/A 217 0 R
+/Parent 135 0 R
+/Prev 215 0 R
+/Next 223 0 R
+>> endobj
+215 0 obj <<
+/Title 216 0 R
+/A 213 0 R
+/Parent 135 0 R
+/Prev 211 0 R
+/Next 219 0 R
+>> endobj
+211 0 obj <<
+/Title 212 0 R
+/A 209 0 R
+/Parent 135 0 R
+/Prev 207 0 R
+/Next 215 0 R
+>> endobj
+207 0 obj <<
+/Title 208 0 R
+/A 205 0 R
+/Parent 135 0 R
+/Prev 203 0 R
+/Next 211 0 R
+>> endobj
+203 0 obj <<
+/Title 204 0 R
+/A 201 0 R
+/Parent 135 0 R
+/Prev 199 0 R
+/Next 207 0 R
+>> endobj
+199 0 obj <<
+/Title 200 0 R
+/A 197 0 R
+/Parent 135 0 R
+/Prev 195 0 R
+/Next 203 0 R
+>> endobj
+195 0 obj <<
+/Title 196 0 R
+/A 193 0 R
+/Parent 135 0 R
+/Prev 191 0 R
+/Next 199 0 R
+>> endobj
+191 0 obj <<
+/Title 192 0 R
+/A 189 0 R
+/Parent 135 0 R
+/Prev 187 0 R
+/Next 195 0 R
+>> endobj
+187 0 obj <<
+/Title 188 0 R
+/A 185 0 R
+/Parent 135 0 R
+/Prev 183 0 R
+/Next 191 0 R
+>> endobj
+183 0 obj <<
+/Title 184 0 R
+/A 181 0 R
+/Parent 135 0 R
+/Prev 179 0 R
+/Next 187 0 R
+>> endobj
+179 0 obj <<
+/Title 180 0 R
+/A 177 0 R
+/Parent 135 0 R
+/Prev 175 0 R
+/Next 183 0 R
+>> endobj
+175 0 obj <<
+/Title 176 0 R
+/A 173 0 R
+/Parent 135 0 R
+/Prev 171 0 R
+/Next 179 0 R
+>> endobj
+171 0 obj <<
+/Title 172 0 R
+/A 169 0 R
+/Parent 135 0 R
+/Prev 167 0 R
+/Next 175 0 R
+>> endobj
+167 0 obj <<
+/Title 168 0 R
+/A 165 0 R
+/Parent 135 0 R
+/Prev 163 0 R
+/Next 171 0 R
+>> endobj
+163 0 obj <<
+/Title 164 0 R
+/A 161 0 R
+/Parent 135 0 R
+/Prev 159 0 R
+/Next 167 0 R
+>> endobj
+159 0 obj <<
+/Title 160 0 R
+/A 157 0 R
+/Parent 135 0 R
+/Prev 155 0 R
+/Next 163 0 R
+>> endobj
+155 0 obj <<
+/Title 156 0 R
+/A 153 0 R
+/Parent 135 0 R
+/Prev 151 0 R
+/Next 159 0 R
+>> endobj
+151 0 obj <<
+/Title 152 0 R
+/A 149 0 R
+/Parent 135 0 R
+/Prev 147 0 R
+/Next 155 0 R
+>> endobj
+147 0 obj <<
+/Title 148 0 R
+/A 145 0 R
+/Parent 135 0 R
+/Prev 143 0 R
+/Next 151 0 R
+>> endobj
+143 0 obj <<
+/Title 144 0 R
+/A 141 0 R
+/Parent 135 0 R
+/Prev 139 0 R
+/Next 147 0 R
+>> endobj
+139 0 obj <<
+/Title 140 0 R
+/A 137 0 R
+/Parent 135 0 R
+/Next 143 0 R
+>> endobj
+135 0 obj <<
+/Title 136 0 R
+/A 133 0 R
+/Parent 12727 0 R
+/Prev 119 0 R
+/First 139 0 R
+/Last 335 0 R
+/Count -50
+>> endobj
+131 0 obj <<
+/Title 132 0 R
+/A 129 0 R
+/Parent 119 0 R
+/Prev 127 0 R
+>> endobj
+127 0 obj <<
+/Title 128 0 R
+/A 125 0 R
+/Parent 119 0 R
+/Prev 123 0 R
+/Next 131 0 R
+>> endobj
+123 0 obj <<
+/Title 124 0 R
+/A 121 0 R
+/Parent 119 0 R
+/Next 127 0 R
+>> endobj
+119 0 obj <<
+/Title 120 0 R
+/A 117 0 R
+/Parent 12727 0 R
+/Prev 111 0 R
+/Next 135 0 R
+/First 123 0 R
+/Last 131 0 R
+/Count -3
+>> endobj
+115 0 obj <<
+/Title 116 0 R
+/A 113 0 R
+/Parent 111 0 R
+>> endobj
+111 0 obj <<
+/Title 112 0 R
+/A 109 0 R
+/Parent 12727 0 R
+/Prev 103 0 R
+/Next 119 0 R
+/First 115 0 R
+/Last 115 0 R
+/Count -1
+>> endobj
+107 0 obj <<
+/Title 108 0 R
+/A 105 0 R
+/Parent 103 0 R
+>> endobj
+103 0 obj <<
+/Title 104 0 R
+/A 101 0 R
+/Parent 12727 0 R
+/Prev 95 0 R
+/Next 111 0 R
+/First 107 0 R
+/Last 107 0 R
+/Count -1
+>> endobj
+99 0 obj <<
+/Title 100 0 R
+/A 97 0 R
+/Parent 95 0 R
+>> endobj
+95 0 obj <<
+/Title 96 0 R
+/A 93 0 R
+/Parent 12727 0 R
+/Prev 87 0 R
+/Next 103 0 R
+/First 99 0 R
+/Last 99 0 R
+/Count -1
+>> endobj
+91 0 obj <<
+/Title 92 0 R
+/A 89 0 R
+/Parent 87 0 R
+>> endobj
+87 0 obj <<
+/Title 88 0 R
+/A 85 0 R
+/Parent 12727 0 R
+/Prev 79 0 R
+/Next 95 0 R
+/First 91 0 R
+/Last 91 0 R
+/Count -1
+>> endobj
+83 0 obj <<
+/Title 84 0 R
+/A 81 0 R
+/Parent 79 0 R
+>> endobj
+79 0 obj <<
+/Title 80 0 R
+/A 77 0 R
+/Parent 12727 0 R
+/Prev 75 0 R
+/Next 87 0 R
+/First 83 0 R
+/Last 83 0 R
+/Count -1
+>> endobj
+75 0 obj <<
+/Title 76 0 R
+/A 73 0 R
+/Parent 12727 0 R
+/Prev 71 0 R
+/Next 79 0 R
+>> endobj
+71 0 obj <<
+/Title 72 0 R
+/A 69 0 R
+/Parent 12727 0 R
+/Prev 67 0 R
+/Next 75 0 R
+>> endobj
+67 0 obj <<
+/Title 68 0 R
+/A 65 0 R
+/Parent 12727 0 R
+/Prev 7 0 R
+/Next 71 0 R
+>> endobj
+63 0 obj <<
+/Title 64 0 R
+/A 61 0 R
+/Parent 7 0 R
+/Prev 59 0 R
+>> endobj
+59 0 obj <<
+/Title 60 0 R
+/A 57 0 R
+/Parent 7 0 R
+/Prev 55 0 R
+/Next 63 0 R
+>> endobj
+55 0 obj <<
+/Title 56 0 R
+/A 53 0 R
+/Parent 7 0 R
+/Prev 51 0 R
+/Next 59 0 R
+>> endobj
+51 0 obj <<
+/Title 52 0 R
+/A 49 0 R
+/Parent 7 0 R
+/Prev 47 0 R
+/Next 55 0 R
+>> endobj
+47 0 obj <<
+/Title 48 0 R
+/A 45 0 R
+/Parent 7 0 R
+/Prev 43 0 R
+/Next 51 0 R
+>> endobj
+43 0 obj <<
+/Title 44 0 R
+/A 41 0 R
+/Parent 7 0 R
+/Prev 39 0 R
+/Next 47 0 R
+>> endobj
+39 0 obj <<
+/Title 40 0 R
+/A 37 0 R
+/Parent 7 0 R
+/Prev 35 0 R
+/Next 43 0 R
+>> endobj
+35 0 obj <<
+/Title 36 0 R
+/A 33 0 R
+/Parent 7 0 R
+/Prev 31 0 R
+/Next 39 0 R
+>> endobj
+31 0 obj <<
+/Title 32 0 R
+/A 29 0 R
+/Parent 7 0 R
+/Prev 27 0 R
+/Next 35 0 R
+>> endobj
+27 0 obj <<
+/Title 28 0 R
+/A 25 0 R
+/Parent 7 0 R
+/Prev 23 0 R
+/Next 31 0 R
+>> endobj
+23 0 obj <<
+/Title 24 0 R
+/A 21 0 R
+/Parent 7 0 R
+/Prev 19 0 R
+/Next 27 0 R
+>> endobj
+19 0 obj <<
+/Title 20 0 R
+/A 17 0 R
+/Parent 7 0 R
+/Prev 15 0 R
+/Next 23 0 R
+>> endobj
+15 0 obj <<
+/Title 16 0 R
+/A 13 0 R
+/Parent 7 0 R
+/Prev 11 0 R
+/Next 19 0 R
+>> endobj
+11 0 obj <<
+/Title 12 0 R
+/A 9 0 R
+/Parent 7 0 R
+/Next 15 0 R
+>> endobj
+7 0 obj <<
+/Title 8 0 R
+/A 5 0 R
+/Parent 12727 0 R
+/Next 67 0 R
+/First 11 0 R
+/Last 63 0 R
+/Count -14
+>> endobj
+12728 0 obj <<
+/Names [(Doc-Start) 342 0 R (GFDL) 1100 0 R (GFDL_GFDL) 392 0 R (GPL) 1025 0 R (GPL_GPL) 393 0 R (Item.1) 531 0 R (Item.2) 532 0 R (Item.3) 539 0 R (Item.4) 540 0 R (Item.5) 541 0 R (classParma__Polyhedra__Library_1_1Any__Pointset) 1424 0 R (classParma__Polyhedra__Library_1_1Any__Pointset_00a22399f16a18c79f9bb770b2cff2e9) 2069 0 R (classParma__Polyhedra__Library_1_1Any__Pointset_0355b5aaf4c371be1776ea8a4d3c9b14) 2168 0 R (classParma__Polyhedra__Library_1_1Any__Pointset_053e0dfb6c9a7bc465 [...]
+/Limits [(Doc-Start) (subsubsection.9.1.5)]
+>> endobj
+12729 0 obj <<
+/Kids [12728 0 R]
+>> endobj
+12730 0 obj <<
+/Dests 12729 0 R
+>> endobj
+12731 0 obj <<
+/Type /Catalog
+/Pages 12726 0 R
+/Outlines 12727 0 R
+/Names 12730 0 R
+/PageMode /UseOutlines 
+/OpenAction 337 0 R
+>> endobj
+12732 0 obj <<
+/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords()
+/CreationDate (D:20080908142802+02'00')
+/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4)
+>> endobj
+xref
+0 12733
+0000000001 65535 f 
+0000000002 00000 f 
+0000000003 00000 f 
+0000000004 00000 f 
+0000000000 00000 f 
+0000000009 00000 n 
+0000058470 00000 n 
+0003718881 00000 n 
+0000000054 00000 n 
+0000000242 00000 n 
+0000058639 00000 n 
+0003718809 00000 n 
+0000000292 00000 n 
+0000000410 00000 n 
+0000058759 00000 n 
+0003718723 00000 n 
+0000000461 00000 n 
+0000000647 00000 n 
+0000076315 00000 n 
+0003718637 00000 n 
+0000000698 00000 n 
+0000000828 00000 n 
+0000076435 00000 n 
+0003718551 00000 n 
+0000000879 00000 n 
+0000000989 00000 n 
+0000087004 00000 n 
+0003718465 00000 n 
+0000001040 00000 n 
+0000001251 00000 n 
+0000101620 00000 n 
+0003718379 00000 n 
+0000001302 00000 n 
+0000001488 00000 n 
+0000140615 00000 n 
+0003718293 00000 n 
+0000001539 00000 n 
+0000001689 00000 n 
+0000151474 00000 n 
+0003718207 00000 n 
+0000001740 00000 n 
+0000001898 00000 n 
+0000156036 00000 n 
+0003718121 00000 n 
+0000001949 00000 n 
+0000002183 00000 n 
+0000156678 00000 n 
+0003718035 00000 n 
+0000002235 00000 n 
+0000002416 00000 n 
+0000168736 00000 n 
+0003717949 00000 n 
+0000002468 00000 n 
+0000002568 00000 n 
+0000179470 00000 n 
+0003717863 00000 n 
+0000002620 00000 n 
+0000002796 00000 n 
+0000201402 00000 n 
+0003717777 00000 n 
+0000002848 00000 n 
+0000002966 00000 n 
+0000210522 00000 n 
+0003717704 00000 n 
+0000003018 00000 n 
+0000003105 00000 n 
+0000234477 00000 n 
+0003717615 00000 n 
+0000003151 00000 n 
+0000003317 00000 n 
+0000270225 00000 n 
+0003717525 00000 n 
+0000003363 00000 n 
+0000003549 00000 n 
+0000291341 00000 n 
+0003717435 00000 n 
+0000003595 00000 n 
+0000003700 00000 n 
+0000318182 00000 n 
+0003717308 00000 n 
+0000003746 00000 n 
+0000003836 00000 n 
+0000318240 00000 n 
+0003717247 00000 n 
+0000003887 00000 n 
+0000003949 00000 n 
+0000318298 00000 n 
+0003717120 00000 n 
+0000003995 00000 n 
+0000004100 00000 n 
+0000318356 00000 n 
+0003717059 00000 n 
+0000004151 00000 n 
+0000004251 00000 n 
+0000325799 00000 n 
+0003716931 00000 n 
+0000004297 00000 n 
+0000004382 00000 n 
+0000325857 00000 n 
+0003716869 00000 n 
+0000004433 00000 n 
+0000004539 00000 n 
+0000344292 00000 n 
+0003716736 00000 n 
+0000004586 00000 n 
+0000004672 00000 n 
+0000344350 00000 n 
+0003716671 00000 n 
+0000004724 00000 n 
+0000004805 00000 n 
+0000365172 00000 n 
+0003716537 00000 n 
+0000004852 00000 n 
+0000004983 00000 n 
+0000365291 00000 n 
+0003716472 00000 n 
+0000005035 00000 n 
+0000005179 00000 n 
+0000422455 00000 n 
+0003716338 00000 n 
+0000005227 00000 n 
+0000005373 00000 n 
+0000422574 00000 n 
+0003716259 00000 n 
+0000005426 00000 n 
+0000005681 00000 n 
+0000484273 00000 n 
+0003716166 00000 n 
+0000005734 00000 n 
+0000006062 00000 n 
+0000487621 00000 n 
+0003716087 00000 n 
+0000006115 00000 n 
+0000006264 00000 n 
+0000487740 00000 n 
+0003715966 00000 n 
+0000006312 00000 n 
+0000006438 00000 n 
+0000487859 00000 n 
+0003715887 00000 n 
+0000006491 00000 n 
+0000006799 00000 n 
+0000590139 00000 n 
+0003715794 00000 n 
+0000006852 00000 n 
+0000007219 00000 n 
+0000780820 00000 n 
+0003715701 00000 n 
+0000007272 00000 n 
+0000007610 00000 n 
+0000792886 00000 n 
+0003715608 00000 n 
+0000007663 00000 n 
+0000008051 00000 n 
+0000793184 00000 n 
+0003715515 00000 n 
+0000008104 00000 n 
+0000008453 00000 n 
+0000991911 00000 n 
+0003715422 00000 n 
+0000008506 00000 n 
+0000008814 00000 n 
+0001024464 00000 n 
+0003715329 00000 n 
+0000008867 00000 n 
+0000009307 00000 n 
+0001155460 00000 n 
+0003715236 00000 n 
+0000009360 00000 n 
+0000009655 00000 n 
+0001222387 00000 n 
+0003715143 00000 n 
+0000009708 00000 n 
+0000010041 00000 n 
+0001250812 00000 n 
+0003715050 00000 n 
+0000010095 00000 n 
+0000010511 00000 n 
+0001288442 00000 n 
+0003714957 00000 n 
+0000010565 00000 n 
+0000010860 00000 n 
+0001363918 00000 n 
+0003714864 00000 n 
+0000010914 00000 n 
+0000011247 00000 n 
+0001393187 00000 n 
+0003714771 00000 n 
+0000011301 00000 n 
+0000011717 00000 n 
+0001398567 00000 n 
+0003714678 00000 n 
+0000011771 00000 n 
+0000012231 00000 n 
+0001406166 00000 n 
+0003714585 00000 n 
+0000012285 00000 n 
+0000012669 00000 n 
+0001447006 00000 n 
+0003714492 00000 n 
+0000012723 00000 n 
+0000013148 00000 n 
+0001447244 00000 n 
+0003714399 00000 n 
+0000013202 00000 n 
+0000013543 00000 n 
+0001447423 00000 n 
+0003714306 00000 n 
+0000013597 00000 n 
+0000013887 00000 n 
+0001536856 00000 n 
+0003714213 00000 n 
+0000013941 00000 n 
+0000014269 00000 n 
+0001562536 00000 n 
+0003714120 00000 n 
+0000014323 00000 n 
+0000014734 00000 n 
+0001569178 00000 n 
+0003714027 00000 n 
+0000014788 00000 n 
+0000015091 00000 n 
+0001615589 00000 n 
+0003713934 00000 n 
+0000015145 00000 n 
+0000015410 00000 n 
+0001838643 00000 n 
+0003713841 00000 n 
+0000015464 00000 n 
+0000015792 00000 n 
+0001874219 00000 n 
+0003713748 00000 n 
+0000015846 00000 n 
+0000016224 00000 n 
+0001874517 00000 n 
+0003713655 00000 n 
+0000016278 00000 n 
+0000016596 00000 n 
+0001919468 00000 n 
+0003713562 00000 n 
+0000016650 00000 n 
+0000017006 00000 n 
+0001998865 00000 n 
+0003713469 00000 n 
+0000017060 00000 n 
+0000017499 00000 n 
+0002012155 00000 n 
+0003713376 00000 n 
+0000017553 00000 n 
+0000017876 00000 n 
+0002016775 00000 n 
+0003713283 00000 n 
+0000017930 00000 n 
+0000018303 00000 n 
+0002017072 00000 n 
+0003713190 00000 n 
+0000018357 00000 n 
+0000018789 00000 n 
+0002031956 00000 n 
+0003713097 00000 n 
+0000018843 00000 n 
+0000019225 00000 n 
+0002032195 00000 n 
+0003713004 00000 n 
+0000019279 00000 n 
+0000019778 00000 n 
+0002060192 00000 n 
+0003712911 00000 n 
+0000019832 00000 n 
+0000020270 00000 n 
+0002060430 00000 n 
+0003712818 00000 n 
+0000020324 00000 n 
+0000020657 00000 n 
+0002113397 00000 n 
+0003712725 00000 n 
+0000020711 00000 n 
+0000021014 00000 n 
+0002209290 00000 n 
+0003712632 00000 n 
+0000021068 00000 n 
+0000021386 00000 n 
+0002237599 00000 n 
+0003712539 00000 n 
+0000021440 00000 n 
+0000021855 00000 n 
+0002242553 00000 n 
+0003712446 00000 n 
+0000021909 00000 n 
+0000022311 00000 n 
+0002426659 00000 n 
+0003712353 00000 n 
+0000022365 00000 n 
+0000022866 00000 n 
+0002613807 00000 n 
+0003712260 00000 n 
+0000022920 00000 n 
+0000023337 00000 n 
+0002776086 00000 n 
+0003712167 00000 n 
+0000023391 00000 n 
+0000023727 00000 n 
+0002791331 00000 n 
+0003712074 00000 n 
+0000023781 00000 n 
+0000024117 00000 n 
+0002818545 00000 n 
+0003711981 00000 n 
+0000024171 00000 n 
+0000024466 00000 n 
+0003030055 00000 n 
+0003711888 00000 n 
+0000024520 00000 n 
+0000024884 00000 n 
+0003077357 00000 n 
+0003711795 00000 n 
+0000024938 00000 n 
+0000025256 00000 n 
+0003077540 00000 n 
+0003711702 00000 n 
+0000025310 00000 n 
+0000025740 00000 n 
+0003082039 00000 n 
+0003711609 00000 n 
+0000025794 00000 n 
+0000026084 00000 n 
+0003088379 00000 n 
+0003711516 00000 n 
+0000026138 00000 n 
+0000026423 00000 n 
+0003099906 00000 n 
+0003711423 00000 n 
+0000026477 00000 n 
+0000026812 00000 n 
+0003100213 00000 n 
+0003711344 00000 n 
+0000026866 00000 n 
+0000027179 00000 n 
+0000028599 00000 n 
+0000028836 00000 n 
+0000027231 00000 n 
+0000028721 00000 n 
+0000028779 00000 n 
+0003698088 00000 n 
+0003675779 00000 n 
+0003697911 00000 n 
+0003674016 00000 n 
+0003665223 00000 n 
+0003673851 00000 n 
+0003664854 00000 n 
+0003662644 00000 n 
+0003664688 00000 n 
+0003661953 00000 n 
+0003659214 00000 n 
+0003661789 00000 n 
+0003699456 00000 n 
+0000036558 00000 n 
+0000031974 00000 n 
+0000028947 00000 n 
+0003658182 00000 n 
+0003638388 00000 n 
+0003658005 00000 n 
+0000032316 00000 n 
+0000032485 00000 n 
+0000032641 00000 n 
+0000032811 00000 n 
+0000032964 00000 n 
+0000033117 00000 n 
+0003637386 00000 n 
+0003617264 00000 n 
+0003637211 00000 n 
+0000036500 00000 n 
+0000033296 00000 n 
+0000033451 00000 n 
+0000033612 00000 n 
+0000033773 00000 n 
+0000033933 00000 n 
+0000034093 00000 n 
+0000034254 00000 n 
+0000034415 00000 n 
+0000034575 00000 n 
+0000034736 00000 n 
+0000034897 00000 n 
+0000035059 00000 n 
+0000035221 00000 n 
+0000035382 00000 n 
+0000035543 00000 n 
+0000035705 00000 n 
+0000035860 00000 n 
+0000036015 00000 n 
+0000036170 00000 n 
+0000036323 00000 n 
+0000270342 00000 n 
+0000234595 00000 n 
+0000045399 00000 n 
+0000039460 00000 n 
+0000036656 00000 n 
+0000045341 00000 n 
+0000039866 00000 n 
+0000040027 00000 n 
+0000040182 00000 n 
+0000040343 00000 n 
+0000040498 00000 n 
+0000040658 00000 n 
+0000040813 00000 n 
+0000040974 00000 n 
+0000041129 00000 n 
+0000041289 00000 n 
+0000041445 00000 n 
+0000041607 00000 n 
+0000041768 00000 n 
+0000041930 00000 n 
+0000042083 00000 n 
+0000042245 00000 n 
+0003616060 00000 n 
+0003604673 00000 n 
+0003615894 00000 n 
+0000042407 00000 n 
+0000042569 00000 n 
+0000042730 00000 n 
+0000042892 00000 n 
+0000043054 00000 n 
+0000043214 00000 n 
+0000043376 00000 n 
+0000043538 00000 n 
+0000043701 00000 n 
+0000043864 00000 n 
+0000044027 00000 n 
+0000044190 00000 n 
+0000044353 00000 n 
+0000044515 00000 n 
+0000044678 00000 n 
+0000044841 00000 n 
+0000045002 00000 n 
+0000045164 00000 n 
+0000054360 00000 n 
+0000048407 00000 n 
+0000045510 00000 n 
+0000048813 00000 n 
+0000048976 00000 n 
+0000049139 00000 n 
+0000049302 00000 n 
+0000049464 00000 n 
+0000049627 00000 n 
+0000049790 00000 n 
+0000049950 00000 n 
+0000050113 00000 n 
+0000050276 00000 n 
+0000050439 00000 n 
+0000050602 00000 n 
+0000050765 00000 n 
+0000050928 00000 n 
+0000051090 00000 n 
+0000051253 00000 n 
+0000051416 00000 n 
+0000051579 00000 n 
+0000051742 00000 n 
+0000051905 00000 n 
+0000052068 00000 n 
+0000052230 00000 n 
+0000052392 00000 n 
+0000052555 00000 n 
+0000052718 00000 n 
+0000052881 00000 n 
+0000053044 00000 n 
+0000053206 00000 n 
+0000053369 00000 n 
+0000053532 00000 n 
+0000053694 00000 n 
+0000053857 00000 n 
+0000054020 00000 n 
+0000054183 00000 n 
+0000058879 00000 n 
+0000057806 00000 n 
+0000054471 00000 n 
+0000058525 00000 n 
+0000058582 00000 n 
+0000057964 00000 n 
+0000058128 00000 n 
+0000058695 00000 n 
+0003603511 00000 n 
+0003584840 00000 n 
+0003603330 00000 n 
+0003584349 00000 n 
+0003579780 00000 n 
+0003584184 00000 n 
+0003579034 00000 n 
+0003573559 00000 n 
+0003578869 00000 n 
+0000058816 00000 n 
+0000058293 00000 n 
+0000076372 00000 n 
+0000201338 00000 n 
+0000064438 00000 n 
+0000061949 00000 n 
+0000059042 00000 n 
+0000064079 00000 n 
+0000064137 00000 n 
+0000062163 00000 n 
+0000062356 00000 n 
+0000062550 00000 n 
+0000062740 00000 n 
+0000062937 00000 n 
+0000063121 00000 n 
+0000063306 00000 n 
+0000063495 00000 n 
+0000063694 00000 n 
+0000064194 00000 n 
+0000064258 00000 n 
+0000064316 00000 n 
+0000064380 00000 n 
+0000063902 00000 n 
+0000991852 00000 n 
+0002209232 00000 n 
+0000590081 00000 n 
+0002242494 00000 n 
+0000793125 00000 n 
+0001615530 00000 n 
+0002017014 00000 n 
+0002581768 00000 n 
+0002426600 00000 n 
+0000067755 00000 n 
+0000066896 00000 n 
+0000064588 00000 n 
+0000067215 00000 n 
+0000067273 00000 n 
+0000067337 00000 n 
+0000067395 00000 n 
+0000067459 00000 n 
+0000067517 00000 n 
+0000067581 00000 n 
+0000067639 00000 n 
+0000067697 00000 n 
+0000067038 00000 n 
+0003699575 00000 n 
+0000071947 00000 n 
+0000071396 00000 n 
+0000067866 00000 n 
+0000071715 00000 n 
+0000071773 00000 n 
+0000071831 00000 n 
+0000071889 00000 n 
+0000071538 00000 n 
+0000076555 00000 n 
+0000075224 00000 n 
+0000072071 00000 n 
+0000076199 00000 n 
+0000076257 00000 n 
+0000075398 00000 n 
+0000075555 00000 n 
+0000075711 00000 n 
+0000075866 00000 n 
+0000076492 00000 n 
+0000076022 00000 n 
+0000217264 00000 n 
+0000222811 00000 n 
+0000229419 00000 n 
+0000234418 00000 n 
+0000082203 00000 n 
+0000081326 00000 n 
+0000076692 00000 n 
+0000081844 00000 n 
+0000081902 00000 n 
+0003573115 00000 n 
+0003570796 00000 n 
+0003572952 00000 n 
+0003569583 00000 n 
+0003559455 00000 n 
+0003569419 00000 n 
+0003558963 00000 n 
+0003554730 00000 n 
+0003558796 00000 n 
+0003553855 00000 n 
+0003547678 00000 n 
+0003553691 00000 n 
+0003546984 00000 n 
+0003544685 00000 n 
+0003546821 00000 n 
+0003544357 00000 n 
+0003542324 00000 n 
+0003544192 00000 n 
+0003540843 00000 n 
+0003534633 00000 n 
+0003540678 00000 n 
+0000081959 00000 n 
+0000082023 00000 n 
+0000082081 00000 n 
+0000082145 00000 n 
+0000081476 00000 n 
+0000081667 00000 n 
+0000096873 00000 n 
+0000087366 00000 n 
+0000086447 00000 n 
+0000082453 00000 n 
+0000086766 00000 n 
+0000086824 00000 n 
+0000086882 00000 n 
+0000086940 00000 n 
+0000087061 00000 n 
+0000087125 00000 n 
+0003534171 00000 n 
+0003531428 00000 n 
+0003534006 00000 n 
+0000087182 00000 n 
+0000087246 00000 n 
+0000087303 00000 n 
+0000086589 00000 n 
+0000092870 00000 n 
+0000092071 00000 n 
+0000087602 00000 n 
+0000092390 00000 n 
+0000092448 00000 n 
+0000092505 00000 n 
+0000092568 00000 n 
+0000092626 00000 n 
+0000092690 00000 n 
+0000092748 00000 n 
+0000092812 00000 n 
+0000092213 00000 n 
+0000097116 00000 n 
+0000096496 00000 n 
+0000093120 00000 n 
+0000096815 00000 n 
+0000096937 00000 n 
+0000096994 00000 n 
+0000097058 00000 n 
+0000096638 00000 n 
+0003699694 00000 n 
+0000101863 00000 n 
+0000100942 00000 n 
+0000097304 00000 n 
+0000101261 00000 n 
+0000101319 00000 n 
+0000101382 00000 n 
+0000101440 00000 n 
+0000101498 00000 n 
+0000101556 00000 n 
+0000101677 00000 n 
+0000101741 00000 n 
+0000101799 00000 n 
+0000101084 00000 n 
+0000106640 00000 n 
+0000105846 00000 n 
+0000102088 00000 n 
+0000106165 00000 n 
+0000106223 00000 n 
+0000106280 00000 n 
+0000106344 00000 n 
+0000106402 00000 n 
+0000106466 00000 n 
+0000106524 00000 n 
+0000106582 00000 n 
+0000105988 00000 n 
+0000112253 00000 n 
+0000110967 00000 n 
+0000106852 00000 n 
+0000111620 00000 n 
+0000111678 00000 n 
+0000111736 00000 n 
+0003531041 00000 n 
+0003528972 00000 n 
+0003530876 00000 n 
+0003528398 00000 n 
+0003526779 00000 n 
+0003528235 00000 n 
+0000111794 00000 n 
+0000111851 00000 n 
+0000111908 00000 n 
+0000111125 00000 n 
+0000111965 00000 n 
+0000112023 00000 n 
+0000112081 00000 n 
+0000111285 00000 n 
+0000112139 00000 n 
+0000112196 00000 n 
+0000111443 00000 n 
+0000222869 00000 n 
+0000117738 00000 n 
+0000117183 00000 n 
+0000112515 00000 n 
+0000117502 00000 n 
+0000117560 00000 n 
+0000117617 00000 n 
+0000117680 00000 n 
+0000117325 00000 n 
+0000123678 00000 n 
+0000123000 00000 n 
+0000117963 00000 n 
+0000123319 00000 n 
+0000123377 00000 n 
+0000123441 00000 n 
+0000123499 00000 n 
+0000123557 00000 n 
+0000123615 00000 n 
+0000123142 00000 n 
+0000129271 00000 n 
+0000127695 00000 n 
+0000123915 00000 n 
+0000128740 00000 n 
+0000128798 00000 n 
+0000127869 00000 n 
+0000128855 00000 n 
+0000128918 00000 n 
+0000128026 00000 n 
+0000128976 00000 n 
+0000129040 00000 n 
+0000128182 00000 n 
+0000128373 00000 n 
+0000129098 00000 n 
+0000129156 00000 n 
+0000129214 00000 n 
+0000128563 00000 n 
+0003699813 00000 n 
+0000228658 00000 n 
+0000228772 00000 n 
+0000156735 00000 n 
+0000135201 00000 n 
+0000133910 00000 n 
+0000129483 00000 n 
+0000134725 00000 n 
+0000134783 00000 n 
+0000134841 00000 n 
+0000134899 00000 n 
+0000134957 00000 n 
+0000135021 00000 n 
+0000135079 00000 n 
+0000134076 00000 n 
+0000134233 00000 n 
+0000135143 00000 n 
+0000134390 00000 n 
+0000134548 00000 n 
+0000223043 00000 n 
+0000210811 00000 n 
+0000140734 00000 n 
+0000139268 00000 n 
+0000135401 00000 n 
+0000140255 00000 n 
+0000140313 00000 n 
+0000140371 00000 n 
+0000139442 00000 n 
+0000140429 00000 n 
+0000140493 00000 n 
+0000139599 00000 n 
+0000139756 00000 n 
+0000139912 00000 n 
+0000140551 00000 n 
+0000140671 00000 n 
+0000140078 00000 n 
+0000145214 00000 n 
+0000144473 00000 n 
+0000140883 00000 n 
+0000144792 00000 n 
+0000144850 00000 n 
+0000144907 00000 n 
+0000144971 00000 n 
+0000145029 00000 n 
+0000145093 00000 n 
+0000145151 00000 n 
+0000144615 00000 n 
+0000151762 00000 n 
+0000149868 00000 n 
+0000145402 00000 n 
+0000151180 00000 n 
+0000151238 00000 n 
+0000151295 00000 n 
+0000150058 00000 n 
+0000150212 00000 n 
+0000151353 00000 n 
+0000150369 00000 n 
+0000151411 00000 n 
+0000150525 00000 n 
+0000150681 00000 n 
+0000150838 00000 n 
+0000151531 00000 n 
+0000151589 00000 n 
+0000151647 00000 n 
+0000151705 00000 n 
+0000151003 00000 n 
+0000222464 00000 n 
+0000210753 00000 n 
+0000217380 00000 n 
+0000210579 00000 n 
+0000217093 00000 n 
+0000156614 00000 n 
+0000156973 00000 n 
+0000155147 00000 n 
+0000151986 00000 n 
+0000155978 00000 n 
+0000156092 00000 n 
+0000156150 00000 n 
+0000156208 00000 n 
+0000156266 00000 n 
+0000156324 00000 n 
+0000156382 00000 n 
+0000156440 00000 n 
+0000156498 00000 n 
+0000156556 00000 n 
+0000155313 00000 n 
+0000155473 00000 n 
+0000155638 00000 n 
+0000156799 00000 n 
+0000156857 00000 n 
+0000156915 00000 n 
+0000155801 00000 n 
+0000163871 00000 n 
+0000161069 00000 n 
+0000157209 00000 n 
+0000163171 00000 n 
+0000163229 00000 n 
+0000163286 00000 n 
+0000163344 00000 n 
+0000163402 00000 n 
+0000163460 00000 n 
+0000163518 00000 n 
+0000163576 00000 n 
+0000161291 00000 n 
+0000161447 00000 n 
+0000163634 00000 n 
+0000163692 00000 n 
+0000163750 00000 n 
+0000161604 00000 n 
+0000161761 00000 n 
+0000161934 00000 n 
+0000162104 00000 n 
+0000162284 00000 n 
+0000162442 00000 n 
+0000162598 00000 n 
+0000162797 00000 n 
+0000163808 00000 n 
+0000162994 00000 n 
+0003699932 00000 n 
+0000210637 00000 n 
+0000217035 00000 n 
+0000780761 00000 n 
+0002006203 00000 n 
+0000169280 00000 n 
+0000168192 00000 n 
+0000164070 00000 n 
+0000168678 00000 n 
+0000168342 00000 n 
+0000168792 00000 n 
+0000168856 00000 n 
+0000168914 00000 n 
+0000168978 00000 n 
+0000169036 00000 n 
+0000169100 00000 n 
+0000169158 00000 n 
+0000169222 00000 n 
+0000168501 00000 n 
+0000210695 00000 n 
+0000174814 00000 n 
+0000173562 00000 n 
+0000169505 00000 n 
+0000174212 00000 n 
+0000174270 00000 n 
+0000174328 00000 n 
+0000173720 00000 n 
+0000173876 00000 n 
+0003526465 00000 n 
+0003524362 00000 n 
+0003526298 00000 n 
+0000174386 00000 n 
+0000174449 00000 n 
+0000174507 00000 n 
+0000174570 00000 n 
+0000174628 00000 n 
+0000174692 00000 n 
+0000174750 00000 n 
+0000174035 00000 n 
+0000229477 00000 n 
+0000180014 00000 n 
+0000178783 00000 n 
+0000175041 00000 n 
+0000179291 00000 n 
+0000179349 00000 n 
+0000179406 00000 n 
+0000178933 00000 n 
+0000179527 00000 n 
+0000179591 00000 n 
+0000179649 00000 n 
+0000179713 00000 n 
+0000179771 00000 n 
+0000179834 00000 n 
+0000179892 00000 n 
+0000179956 00000 n 
+0000179114 00000 n 
+0000184685 00000 n 
+0000183838 00000 n 
+0000180226 00000 n 
+0000184157 00000 n 
+0000184215 00000 n 
+0000184273 00000 n 
+0000184331 00000 n 
+0000184395 00000 n 
+0000184453 00000 n 
+0000184511 00000 n 
+0000184569 00000 n 
+0000184627 00000 n 
+0000183980 00000 n 
+0000191213 00000 n 
+0000190157 00000 n 
+0000184935 00000 n 
+0000190854 00000 n 
+0000190912 00000 n 
+0000190970 00000 n 
+0000190315 00000 n 
+0000191028 00000 n 
+0000191092 00000 n 
+0000190497 00000 n 
+0000191150 00000 n 
+0000190677 00000 n 
+0000196493 00000 n 
+0000195649 00000 n 
+0000191463 00000 n 
+0000196142 00000 n 
+0000196200 00000 n 
+0000196257 00000 n 
+0000196315 00000 n 
+0000196373 00000 n 
+0000196437 00000 n 
+0000195799 00000 n 
+0000195965 00000 n 
+0003700051 00000 n 
+0000201575 00000 n 
+0000200096 00000 n 
+0000196718 00000 n 
+0000200923 00000 n 
+0000200981 00000 n 
+0000201045 00000 n 
+0000200262 00000 n 
+0000201103 00000 n 
+0000201161 00000 n 
+0000200419 00000 n 
+0000201219 00000 n 
+0000201280 00000 n 
+0000200589 00000 n 
+0000201459 00000 n 
+0000201517 00000 n 
+0000200746 00000 n 
+0000206282 00000 n 
+0000205551 00000 n 
+0000201762 00000 n 
+0000205870 00000 n 
+0000205928 00000 n 
+0000205986 00000 n 
+0000206044 00000 n 
+0000206102 00000 n 
+0000206160 00000 n 
+0000206224 00000 n 
+0000205693 00000 n 
+0000210869 00000 n 
+0000209868 00000 n 
+0000206406 00000 n 
+0000210400 00000 n 
+0000210458 00000 n 
+0000210018 00000 n 
+0000210223 00000 n 
+0000217554 00000 n 
+0000215114 00000 n 
+0000210980 00000 n 
+0000216746 00000 n 
+0000216804 00000 n 
+0000215312 00000 n 
+0000216861 00000 n 
+0000215500 00000 n 
+0000216919 00000 n 
+0000216977 00000 n 
+0000215688 00000 n 
+0000217149 00000 n 
+0000217206 00000 n 
+0000215876 00000 n 
+0000216035 00000 n 
+0000217322 00000 n 
+0000216223 00000 n 
+0000216411 00000 n 
+0000217438 00000 n 
+0000217496 00000 n 
+0000216569 00000 n 
+0000223333 00000 n 
+0000221879 00000 n 
+0000217665 00000 n 
+0000222406 00000 n 
+0000222521 00000 n 
+0000222579 00000 n 
+0000222637 00000 n 
+0000222695 00000 n 
+0000222753 00000 n 
+0000222029 00000 n 
+0000222927 00000 n 
+0000222985 00000 n 
+0000223101 00000 n 
+0000223159 00000 n 
+0000223217 00000 n 
+0000223275 00000 n 
+0000222229 00000 n 
+0000229653 00000 n 
+0000227691 00000 n 
+0000223457 00000 n 
+0000228600 00000 n 
+0000228715 00000 n 
+0000228830 00000 n 
+0000228889 00000 n 
+0000227862 00000 n 
+0000228948 00000 n 
+0000229007 00000 n 
+0000229066 00000 n 
+0000228070 00000 n 
+0000228266 00000 n 
+0000229125 00000 n 
+0000229184 00000 n 
+0000229243 00000 n 
+0000229302 00000 n 
+0000229361 00000 n 
+0000229535 00000 n 
+0000229594 00000 n 
+0000228422 00000 n 
+0003700170 00000 n 
+0000234714 00000 n 
+0000233405 00000 n 
+0000229777 00000 n 
+0000234239 00000 n 
+0000234299 00000 n 
+0000233579 00000 n 
+0000234358 00000 n 
+0000233736 00000 n 
+0000234535 00000 n 
+0000233894 00000 n 
+0000234654 00000 n 
+0000234061 00000 n 
+0000238642 00000 n 
+0000238077 00000 n 
+0000234826 00000 n 
+0000238402 00000 n 
+0000238462 00000 n 
+0000238522 00000 n 
+0000238582 00000 n 
+0000238224 00000 n 
+0000242429 00000 n 
+0000241864 00000 n 
+0000238741 00000 n 
+0000242189 00000 n 
+0000242249 00000 n 
+0000242309 00000 n 
+0000242369 00000 n 
+0000242011 00000 n 
+0000246457 00000 n 
+0000245952 00000 n 
+0000242528 00000 n 
+0000246277 00000 n 
+0000246337 00000 n 
+0000246397 00000 n 
+0000246099 00000 n 
+0000250583 00000 n 
+0000250138 00000 n 
+0000246556 00000 n 
+0000250463 00000 n 
+0000250523 00000 n 
+0000250285 00000 n 
+0000254427 00000 n 
+0000253982 00000 n 
+0000250682 00000 n 
+0000254307 00000 n 
+0000254367 00000 n 
+0000254129 00000 n 
+0003700295 00000 n 
+0000258498 00000 n 
+0000257933 00000 n 
+0000254526 00000 n 
+0000258258 00000 n 
+0000258318 00000 n 
+0000258378 00000 n 
+0000258438 00000 n 
+0000258080 00000 n 
+0000262537 00000 n 
+0000261973 00000 n 
+0000258597 00000 n 
+0000262298 00000 n 
+0000262358 00000 n 
+0000262418 00000 n 
+0000262477 00000 n 
+0000262120 00000 n 
+0000266220 00000 n 
+0000265595 00000 n 
+0000262636 00000 n 
+0000265920 00000 n 
+0000265980 00000 n 
+0000266040 00000 n 
+0000266100 00000 n 
+0000266160 00000 n 
+0003523860 00000 n 
+0003515424 00000 n 
+0003523679 00000 n 
+0000265742 00000 n 
+0000270400 00000 n 
+0000269251 00000 n 
+0000266333 00000 n 
+0000270165 00000 n 
+0000269425 00000 n 
+0000269606 00000 n 
+0000269787 00000 n 
+0000270283 00000 n 
+0000269987 00000 n 
+0000274744 00000 n 
+0000274359 00000 n 
+0000270513 00000 n 
+0000274684 00000 n 
+0000274506 00000 n 
+0000279041 00000 n 
+0000278656 00000 n 
+0000274843 00000 n 
+0000278981 00000 n 
+0000278803 00000 n 
+0003700421 00000 n 
+0000283082 00000 n 
+0000282697 00000 n 
+0000279140 00000 n 
+0000283022 00000 n 
+0000282844 00000 n 
+0000286831 00000 n 
+0000286446 00000 n 
+0000283181 00000 n 
+0000286771 00000 n 
+0000286593 00000 n 
+0000291577 00000 n 
+0000289829 00000 n 
+0000286930 00000 n 
+0000291221 00000 n 
+0000290021 00000 n 
+0000291281 00000 n 
+0000291399 00000 n 
+0000291458 00000 n 
+0000290202 00000 n 
+0000290426 00000 n 
+0000291517 00000 n 
+0000290624 00000 n 
+0000290847 00000 n 
+0000291043 00000 n 
+0000710981 00000 n 
+0000711221 00000 n 
+0000300940 00000 n 
+0000293615 00000 n 
+0000291676 00000 n 
+0000300041 00000 n 
+0000300101 00000 n 
+0000294014 00000 n 
+0000294238 00000 n 
+0000300160 00000 n 
+0000294435 00000 n 
+0000294658 00000 n 
+0000300220 00000 n 
+0000294856 00000 n 
+0000295080 00000 n 
+0000300280 00000 n 
+0000295278 00000 n 
+0000295502 00000 n 
+0000300340 00000 n 
+0000295699 00000 n 
+0000295922 00000 n 
+0000300400 00000 n 
+0000296120 00000 n 
+0000296344 00000 n 
+0000300460 00000 n 
+0000296542 00000 n 
+0000296761 00000 n 
+0000300520 00000 n 
+0000296957 00000 n 
+0000297175 00000 n 
+0000300580 00000 n 
+0000297373 00000 n 
+0000297592 00000 n 
+0000300640 00000 n 
+0000297790 00000 n 
+0000298009 00000 n 
+0000300700 00000 n 
+0000298205 00000 n 
+0000298422 00000 n 
+0000300760 00000 n 
+0000298620 00000 n 
+0000298839 00000 n 
+0000300820 00000 n 
+0000299037 00000 n 
+0000299256 00000 n 
+0000300880 00000 n 
+0000299453 00000 n 
+0000299667 00000 n 
+0000299863 00000 n 
+0000714668 00000 n 
+0000718277 00000 n 
+0000721561 00000 n 
+0000721800 00000 n 
+0000729155 00000 n 
+0000732595 00000 n 
+0001764228 00000 n 
+0001764348 00000 n 
+0001767737 00000 n 
+0001770693 00000 n 
+0001773860 00000 n 
+0001773979 00000 n 
+0001777352 00000 n 
+0001777592 00000 n 
+0000310648 00000 n 
+0000303063 00000 n 
+0000301039 00000 n 
+0000309749 00000 n 
+0000309809 00000 n 
+0000303471 00000 n 
+0000303690 00000 n 
+0000309868 00000 n 
+0000303887 00000 n 
+0000304105 00000 n 
+0000309928 00000 n 
+0000304303 00000 n 
+0000304522 00000 n 
+0000309988 00000 n 
+0000304720 00000 n 
+0000304939 00000 n 
+0000310048 00000 n 
+0000305136 00000 n 
+0000305354 00000 n 
+0000310108 00000 n 
+0000305552 00000 n 
+0000305771 00000 n 
+0000305969 00000 n 
+0000310168 00000 n 
+0000306167 00000 n 
+0000306386 00000 n 
+0000310228 00000 n 
+0000306582 00000 n 
+0000306814 00000 n 
+0000310288 00000 n 
+0000307012 00000 n 
+0000307245 00000 n 
+0000310348 00000 n 
+0000307443 00000 n 
+0000307675 00000 n 
+0000310408 00000 n 
+0000307871 00000 n 
+0000308102 00000 n 
+0000310468 00000 n 
+0000308300 00000 n 
+0000308532 00000 n 
+0000310528 00000 n 
+0000308730 00000 n 
+0000308955 00000 n 
+0000310588 00000 n 
+0000309152 00000 n 
+0000309375 00000 n 
+0000309571 00000 n 
+0001780858 00000 n 
+0001783873 00000 n 
+0001789830 00000 n 
+0001789950 00000 n 
+0001794107 00000 n 
+0001797745 00000 n 
+0001797865 00000 n 
+0002718371 00000 n 
+0002721594 00000 n 
+0002725228 00000 n 
+0002728857 00000 n 
+0002733337 00000 n 
+0002953480 00000 n 
+0002957445 00000 n 
+0000318413 00000 n 
+0000312624 00000 n 
+0000310747 00000 n 
+0000317525 00000 n 
+0000317585 00000 n 
+0000312960 00000 n 
+0000313185 00000 n 
+0000317644 00000 n 
+0000313382 00000 n 
+0000313607 00000 n 
+0000317704 00000 n 
+0000313805 00000 n 
+0000314030 00000 n 
+0000317764 00000 n 
+0000314228 00000 n 
+0000314453 00000 n 
+0000317824 00000 n 
+0000314649 00000 n 
+0000314874 00000 n 
+0000317884 00000 n 
+0000315072 00000 n 
+0000315297 00000 n 
+0000317944 00000 n 
+0000315495 00000 n 
+0000315720 00000 n 
+0000318002 00000 n 
+0000315918 00000 n 
+0000316142 00000 n 
+0000318062 00000 n 
+0000316340 00000 n 
+0000316565 00000 n 
+0000318122 00000 n 
+0000316762 00000 n 
+0000316987 00000 n 
+0000317185 00000 n 
+0000317347 00000 n 
+0003700547 00000 n 
+0002957568 00000 n 
+0002957814 00000 n 
+0002961184 00000 n 
+0002964610 00000 n 
+0002967902 00000 n 
+0002968025 00000 n 
+0002971311 00000 n 
+0002974720 00000 n 
+0002981663 00000 n 
+0002981909 00000 n 
+0000325915 00000 n 
+0000320543 00000 n 
+0000318512 00000 n 
+0000325739 00000 n 
+0000320942 00000 n 
+0000321123 00000 n 
+0000321286 00000 n 
+0000321484 00000 n 
+0000321647 00000 n 
+0000321806 00000 n 
+0000321968 00000 n 
+0000322131 00000 n 
+0000322293 00000 n 
+0000322456 00000 n 
+0000322619 00000 n 
+0000322782 00000 n 
+0000322945 00000 n 
+0000323106 00000 n 
+0000323268 00000 n 
+0000323432 00000 n 
+0000323596 00000 n 
+0000323760 00000 n 
+0000323923 00000 n 
+0000324087 00000 n 
+0000324251 00000 n 
+0000324415 00000 n 
+0000324579 00000 n 
+0000324743 00000 n 
+0000324907 00000 n 
+0000325071 00000 n 
+0000325235 00000 n 
+0000325399 00000 n 
+0000325561 00000 n 
+0000422514 00000 n 
+0000484207 00000 n 
+0000487561 00000 n 
+0000333352 00000 n 
+0000327962 00000 n 
+0000326027 00000 n 
+0000333292 00000 n 
+0000328370 00000 n 
+0000328534 00000 n 
+0000328697 00000 n 
+0000328860 00000 n 
+0000329024 00000 n 
+0000329188 00000 n 
+0000329350 00000 n 
+0000329513 00000 n 
+0000329677 00000 n 
+0000329841 00000 n 
+0000330005 00000 n 
+0000330169 00000 n 
+0000330333 00000 n 
+0000330497 00000 n 
+0000330661 00000 n 
+0000330825 00000 n 
+0000330989 00000 n 
+0000331153 00000 n 
+0000331317 00000 n 
+0000331479 00000 n 
+0000331643 00000 n 
+0000331807 00000 n 
+0000331971 00000 n 
+0000332134 00000 n 
+0000332296 00000 n 
+0000332460 00000 n 
+0000332624 00000 n 
+0000332788 00000 n 
+0000332951 00000 n 
+0000333114 00000 n 
+0000344408 00000 n 
+0000336287 00000 n 
+0000333464 00000 n 
+0000344232 00000 n 
+0000336794 00000 n 
+0000336989 00000 n 
+0000337152 00000 n 
+0000337343 00000 n 
+0000337506 00000 n 
+0000337707 00000 n 
+0000337870 00000 n 
+0000338082 00000 n 
+0000338245 00000 n 
+0000338428 00000 n 
+0000338590 00000 n 
+0000338784 00000 n 
+0000338947 00000 n 
+0000339144 00000 n 
+0000339307 00000 n 
+0000339499 00000 n 
+0000339662 00000 n 
+0000339862 00000 n 
+0000340025 00000 n 
+0000340244 00000 n 
+0000340408 00000 n 
+0000340600 00000 n 
+0000340764 00000 n 
+0000340963 00000 n 
+0000341126 00000 n 
+0000341344 00000 n 
+0000341507 00000 n 
+0000341710 00000 n 
+0000341873 00000 n 
+0000342066 00000 n 
+0000342228 00000 n 
+0000342425 00000 n 
+0000342589 00000 n 
+0000342791 00000 n 
+0000342954 00000 n 
+0000343145 00000 n 
+0000343309 00000 n 
+0000343508 00000 n 
+0000343672 00000 n 
+0000343890 00000 n 
+0000344054 00000 n 
+0000487799 00000 n 
+0000792826 00000 n 
+0001024404 00000 n 
+0001155400 00000 n 
+0001222327 00000 n 
+0001250753 00000 n 
+0001258137 00000 n 
+0001363858 00000 n 
+0001386810 00000 n 
+0001398507 00000 n 
+0001406106 00000 n 
+0001421825 00000 n 
+0001447184 00000 n 
+0001447363 00000 n 
+0001536798 00000 n 
+0001562478 00000 n 
+0000357066 00000 n 
+0000347481 00000 n 
+0000344520 00000 n 
+0000357006 00000 n 
+0000348060 00000 n 
+0000348254 00000 n 
+0000348418 00000 n 
+0000348604 00000 n 
+0000348768 00000 n 
+0000348966 00000 n 
+0000349151 00000 n 
+0000349315 00000 n 
+0000349526 00000 n 
+0000349712 00000 n 
+0000349876 00000 n 
+0000350071 00000 n 
+0000350235 00000 n 
+0000350440 00000 n 
+0000350603 00000 n 
+0000350827 00000 n 
+0000350991 00000 n 
+0000351189 00000 n 
+0000351353 00000 n 
+0000351563 00000 n 
+0000351727 00000 n 
+0000351916 00000 n 
+0000352080 00000 n 
+0000352274 00000 n 
+0000352438 00000 n 
+0000352675 00000 n 
+0000352839 00000 n 
+0000353045 00000 n 
+0000353209 00000 n 
+0000353408 00000 n 
+0000353572 00000 n 
+0000353766 00000 n 
+0000353930 00000 n 
+0000354127 00000 n 
+0000354291 00000 n 
+0000354486 00000 n 
+0000354650 00000 n 
+0000354848 00000 n 
+0000355012 00000 n 
+0000355221 00000 n 
+0000355385 00000 n 
+0000355584 00000 n 
+0000355748 00000 n 
+0000355948 00000 n 
+0000356112 00000 n 
+0000356312 00000 n 
+0000356476 00000 n 
+0000356666 00000 n 
+0000356828 00000 n 
+0001569118 00000 n 
+0001838583 00000 n 
+0001845631 00000 n 
+0001874457 00000 n 
+0001919408 00000 n 
+0001998807 00000 n 
+0002016715 00000 n 
+0002031896 00000 n 
+0002032135 00000 n 
+0002032374 00000 n 
+0002060370 00000 n 
+0002113337 00000 n 
+0002237539 00000 n 
+0002776026 00000 n 
+0002783119 00000 n 
+0002818485 00000 n 
+0000365410 00000 n 
+0000359860 00000 n 
+0000357178 00000 n 
+0000365112 00000 n 
+0000360232 00000 n 
+0000360422 00000 n 
+0000360586 00000 n 
+0000360783 00000 n 
+0000360947 00000 n 
+0000361144 00000 n 
+0000361308 00000 n 
+0000361499 00000 n 
+0000361663 00000 n 
+0000361852 00000 n 
+0000362015 00000 n 
+0000362217 00000 n 
+0000362380 00000 n 
+0000362576 00000 n 
+0000365231 00000 n 
+0000365350 00000 n 
+0000362740 00000 n 
+0000362934 00000 n 
+0000363171 00000 n 
+0000363376 00000 n 
+0000363572 00000 n 
+0000363761 00000 n 
+0000363962 00000 n 
+0000364159 00000 n 
+0000364346 00000 n 
+0000364534 00000 n 
+0000364736 00000 n 
+0000364934 00000 n 
+0003029995 00000 n 
+0003077296 00000 n 
+0003077479 00000 n 
+0003081978 00000 n 
+0003088318 00000 n 
+0003099845 00000 n 
+0003100152 00000 n 
+0000371410 00000 n 
+0000367670 00000 n 
+0000365535 00000 n 
+0000371350 00000 n 
+0000367961 00000 n 
+0000368160 00000 n 
+0000368378 00000 n 
+0000368569 00000 n 
+0000368750 00000 n 
+0000368949 00000 n 
+0000369167 00000 n 
+0000369358 00000 n 
+0000369558 00000 n 
+0000369755 00000 n 
+0000369972 00000 n 
+0000370161 00000 n 
+0000370361 00000 n 
+0000370565 00000 n 
+0000370785 00000 n 
+0000370981 00000 n 
+0000371172 00000 n 
+0003700673 00000 n 
+0000378367 00000 n 
+0000374079 00000 n 
+0000371535 00000 n 
+0000378307 00000 n 
+0000374397 00000 n 
+0000374590 00000 n 
+0000374775 00000 n 
+0000374965 00000 n 
+0000375159 00000 n 
+0000375359 00000 n 
+0000375572 00000 n 
+0000375769 00000 n 
+0000375979 00000 n 
+0000376177 00000 n 
+0000376363 00000 n 
+0000376558 00000 n 
+0000376749 00000 n 
+0000376938 00000 n 
+0000377134 00000 n 
+0000377336 00000 n 
+0000377530 00000 n 
+0000377738 00000 n 
+0000377937 00000 n 
+0000378129 00000 n 
+0000383781 00000 n 
+0000380654 00000 n 
+0000378492 00000 n 
+0000383481 00000 n 
+0000380909 00000 n 
+0000383541 00000 n 
+0000381102 00000 n 
+0000381284 00000 n 
+0000381482 00000 n 
+0000383601 00000 n 
+0000381642 00000 n 
+0000381850 00000 n 
+0000382058 00000 n 
+0000383661 00000 n 
+0000382265 00000 n 
+0000382473 00000 n 
+0000383721 00000 n 
+0000382680 00000 n 
+0000382888 00000 n 
+0000383096 00000 n 
+0000383303 00000 n 
+0000406706 00000 n 
+0000406826 00000 n 
+0000406946 00000 n 
+0000407066 00000 n 
+0000407246 00000 n 
+0000407366 00000 n 
+0000407486 00000 n 
+0000404091 00000 n 
+0000387410 00000 n 
+0000383893 00000 n 
+0000403971 00000 n 
+0000404031 00000 n 
+0000388151 00000 n 
+0000388359 00000 n 
+0000388599 00000 n 
+0000388836 00000 n 
+0000389076 00000 n 
+0000389317 00000 n 
+0000389558 00000 n 
+0000389799 00000 n 
+0000390040 00000 n 
+0000390281 00000 n 
+0000390522 00000 n 
+0000390763 00000 n 
+0000391004 00000 n 
+0000391244 00000 n 
+0000391484 00000 n 
+0000391724 00000 n 
+0000391964 00000 n 
+0000392205 00000 n 
+0000392446 00000 n 
+0000392687 00000 n 
+0000392925 00000 n 
+0000393166 00000 n 
+0000393407 00000 n 
+0000393648 00000 n 
+0000393888 00000 n 
+0000394126 00000 n 
+0000394367 00000 n 
+0000394608 00000 n 
+0000394849 00000 n 
+0000395090 00000 n 
+0000395328 00000 n 
+0000395569 00000 n 
+0000395810 00000 n 
+0000396051 00000 n 
+0000396292 00000 n 
+0000396498 00000 n 
+0000396738 00000 n 
+0000396979 00000 n 
+0000397220 00000 n 
+0000397458 00000 n 
+0000397699 00000 n 
+0000397907 00000 n 
+0000398148 00000 n 
+0000398389 00000 n 
+0000398596 00000 n 
+0000398837 00000 n 
+0000399078 00000 n 
+0000399319 00000 n 
+0000399560 00000 n 
+0000399801 00000 n 
+0000400042 00000 n 
+0000400248 00000 n 
+0000400487 00000 n 
+0000400728 00000 n 
+0000400969 00000 n 
+0000401210 00000 n 
+0000401451 00000 n 
+0000401659 00000 n 
+0000401900 00000 n 
+0000402141 00000 n 
+0000402382 00000 n 
+0000402589 00000 n 
+0000402829 00000 n 
+0000403070 00000 n 
+0000403311 00000 n 
+0000403552 00000 n 
+0000403793 00000 n 
+0000411601 00000 n 
+0000411721 00000 n 
+0000411787 00000 n 
+0000411853 00000 n 
+0000411919 00000 n 
+0000411985 00000 n 
+0000412051 00000 n 
+0000412117 00000 n 
+0000412183 00000 n 
+0000412249 00000 n 
+0000412315 00000 n 
+0000412381 00000 n 
+0000412447 00000 n 
+0000412513 00000 n 
+0000412579 00000 n 
+0000412645 00000 n 
+0000412711 00000 n 
+0000412777 00000 n 
+0000412841 00000 n 
+0000412907 00000 n 
+0000412972 00000 n 
+0000413038 00000 n 
+0000413103 00000 n 
+0000413169 00000 n 
+0000413234 00000 n 
+0000413300 00000 n 
+0000413366 00000 n 
+0000416008 00000 n 
+0000416074 00000 n 
+0000416140 00000 n 
+0000416206 00000 n 
+0000416272 00000 n 
+0000416392 00000 n 
+0000416458 00000 n 
+0000416524 00000 n 
+0000416644 00000 n 
+0000416710 00000 n 
+0000416776 00000 n 
+0000416842 00000 n 
+0000416908 00000 n 
+0000416974 00000 n 
+0000417040 00000 n 
+0000417160 00000 n 
+0000417226 00000 n 
+0000417292 00000 n 
+0000417358 00000 n 
+0000417475 00000 n 
+0000417541 00000 n 
+0000417606 00000 n 
+0000422077 00000 n 
+0000422143 00000 n 
+0000422209 00000 n 
+0000407606 00000 n 
+0000405925 00000 n 
+0000404203 00000 n 
+0000406467 00000 n 
+0000406527 00000 n 
+0000406081 00000 n 
+0000406587 00000 n 
+0000406647 00000 n 
+0000406766 00000 n 
+0000406886 00000 n 
+0000407006 00000 n 
+0000407126 00000 n 
+0000407186 00000 n 
+0000407306 00000 n 
+0000407426 00000 n 
+0000407546 00000 n 
+0000406289 00000 n 
+0000422335 00000 n 
+0000413425 00000 n 
+0000410747 00000 n 
+0000407731 00000 n 
+0000411481 00000 n 
+0000410912 00000 n 
+0000411106 00000 n 
+0000411541 00000 n 
+0000411661 00000 n 
+0003514683 00000 n 
+0003499085 00000 n 
+0003514500 00000 n 
+0000411303 00000 n 
+0000417665 00000 n 
+0000415564 00000 n 
+0000413538 00000 n 
+0000415889 00000 n 
+0000415949 00000 n 
+0000416332 00000 n 
+0000416584 00000 n 
+0000417100 00000 n 
+0000417417 00000 n 
+0000415711 00000 n 
+0003700799 00000 n 
+0000422753 00000 n 
+0000420354 00000 n 
+0000417803 00000 n 
+0000421958 00000 n 
+0000422018 00000 n 
+0000420555 00000 n 
+0000422275 00000 n 
+0000422395 00000 n 
+0000422633 00000 n 
+0000420749 00000 n 
+0000422693 00000 n 
+0000420948 00000 n 
+0000421142 00000 n 
+0000421379 00000 n 
+0000421585 00000 n 
+0000421780 00000 n 
+0000428980 00000 n 
+0000425129 00000 n 
+0000422905 00000 n 
+0000428920 00000 n 
+0000425429 00000 n 
+0000425619 00000 n 
+0000425820 00000 n 
+0000426017 00000 n 
+0000426206 00000 n 
+0000426395 00000 n 
+0000426594 00000 n 
+0000426792 00000 n 
+0000426983 00000 n 
+0000427167 00000 n 
+0000427366 00000 n 
+0000427557 00000 n 
+0000427752 00000 n 
+0000427952 00000 n 
+0000428150 00000 n 
+0000428339 00000 n 
+0000428538 00000 n 
+0000428742 00000 n 
+0000435466 00000 n 
+0000431419 00000 n 
+0000429092 00000 n 
+0000435406 00000 n 
+0000431728 00000 n 
+0000431924 00000 n 
+0000432114 00000 n 
+0000432307 00000 n 
+0000432492 00000 n 
+0000432682 00000 n 
+0000432876 00000 n 
+0000433073 00000 n 
+0000433273 00000 n 
+0000433470 00000 n 
+0000433667 00000 n 
+0000433853 00000 n 
+0000434049 00000 n 
+0000434241 00000 n 
+0000434429 00000 n 
+0000434625 00000 n 
+0000434828 00000 n 
+0000435022 00000 n 
+0000435228 00000 n 
+0000451660 00000 n 
+0000439090 00000 n 
+0000435578 00000 n 
+0000451480 00000 n 
+0000439687 00000 n 
+0000439883 00000 n 
+0000440082 00000 n 
+0000440276 00000 n 
+0000451540 00000 n 
+0000440469 00000 n 
+0000440676 00000 n 
+0000440883 00000 n 
+0000451600 00000 n 
+0000441091 00000 n 
+0000441299 00000 n 
+0000441537 00000 n 
+0000441777 00000 n 
+0000442017 00000 n 
+0000442257 00000 n 
+0000442498 00000 n 
+0000442739 00000 n 
+0000442980 00000 n 
+0000443221 00000 n 
+0000443462 00000 n 
+0000443703 00000 n 
+0000443943 00000 n 
+0000444184 00000 n 
+0000444425 00000 n 
+0000444666 00000 n 
+0000444907 00000 n 
+0000445148 00000 n 
+0000445389 00000 n 
+0000445629 00000 n 
+0000445870 00000 n 
+0000446111 00000 n 
+0000446352 00000 n 
+0000446593 00000 n 
+0000446834 00000 n 
+0000447074 00000 n 
+0000447315 00000 n 
+0000447555 00000 n 
+0000447763 00000 n 
+0000448002 00000 n 
+0000448242 00000 n 
+0000448483 00000 n 
+0000448724 00000 n 
+0000448965 00000 n 
+0000449173 00000 n 
+0000449414 00000 n 
+0000449655 00000 n 
+0000449862 00000 n 
+0000450102 00000 n 
+0000450343 00000 n 
+0000450584 00000 n 
+0000450825 00000 n 
+0000451063 00000 n 
+0000451302 00000 n 
+0000462068 00000 n 
+0000454749 00000 n 
+0000451772 00000 n 
+0000461289 00000 n 
+0000455139 00000 n 
+0000455346 00000 n 
+0000455585 00000 n 
+0000455825 00000 n 
+0000456065 00000 n 
+0000456306 00000 n 
+0000456513 00000 n 
+0000456753 00000 n 
+0000456993 00000 n 
+0000457200 00000 n 
+0000457439 00000 n 
+0000457679 00000 n 
+0000461349 00000 n 
+0000461409 00000 n 
+0000457919 00000 n 
+0000461469 00000 n 
+0000458134 00000 n 
+0000461529 00000 n 
+0000458349 00000 n 
+0000461589 00000 n 
+0000458564 00000 n 
+0000461648 00000 n 
+0000458779 00000 n 
+0000458993 00000 n 
+0000461708 00000 n 
+0000459208 00000 n 
+0000459414 00000 n 
+0000459627 00000 n 
+0000461768 00000 n 
+0000459833 00000 n 
+0000460046 00000 n 
+0000461828 00000 n 
+0000460253 00000 n 
+0000461888 00000 n 
+0000460468 00000 n 
+0000461948 00000 n 
+0000460683 00000 n 
+0000462008 00000 n 
+0000460898 00000 n 
+0000461111 00000 n 
+0000483598 00000 n 
+0000470665 00000 n 
+0000465118 00000 n 
+0000462193 00000 n 
+0000469887 00000 n 
+0000469947 00000 n 
+0000465445 00000 n 
+0000470007 00000 n 
+0000465660 00000 n 
+0000470067 00000 n 
+0000465875 00000 n 
+0000466090 00000 n 
+0000470127 00000 n 
+0000466304 00000 n 
+0000466512 00000 n 
+0000466727 00000 n 
+0000470186 00000 n 
+0000466935 00000 n 
+0000467150 00000 n 
+0000470246 00000 n 
+0000467363 00000 n 
+0000467571 00000 n 
+0000470306 00000 n 
+0000467786 00000 n 
+0000470366 00000 n 
+0000468000 00000 n 
+0000470426 00000 n 
+0000468215 00000 n 
+0000468428 00000 n 
+0000468643 00000 n 
+0000470486 00000 n 
+0000468858 00000 n 
+0000470546 00000 n 
+0000469073 00000 n 
+0000470605 00000 n 
+0000469288 00000 n 
+0000469495 00000 n 
+0000469709 00000 n 
+0003700925 00000 n 
+0000483718 00000 n 
+0000483838 00000 n 
+0000483964 00000 n 
+0000484082 00000 n 
+0000480161 00000 n 
+0000473708 00000 n 
+0000470777 00000 n 
+0000479202 00000 n 
+0000479262 00000 n 
+0003496839 00000 n 
+0003494834 00000 n 
+0003496673 00000 n 
+0000474071 00000 n 
+0000474276 00000 n 
+0000479322 00000 n 
+0000474481 00000 n 
+0000474687 00000 n 
+0000479382 00000 n 
+0000474893 00000 n 
+0000475099 00000 n 
+0000479442 00000 n 
+0000475305 00000 n 
+0000475511 00000 n 
+0000479502 00000 n 
+0000475717 00000 n 
+0000475923 00000 n 
+0000479562 00000 n 
+0000476129 00000 n 
+0000476335 00000 n 
+0000479622 00000 n 
+0000476541 00000 n 
+0000476746 00000 n 
+0000479682 00000 n 
+0000476961 00000 n 
+0000477165 00000 n 
+0000479742 00000 n 
+0000477379 00000 n 
+0000479802 00000 n 
+0000477587 00000 n 
+0000479862 00000 n 
+0000477795 00000 n 
+0000479922 00000 n 
+0000478003 00000 n 
+0000479981 00000 n 
+0000478211 00000 n 
+0000480041 00000 n 
+0000478419 00000 n 
+0000480101 00000 n 
+0000478627 00000 n 
+0000478817 00000 n 
+0000479024 00000 n 
+0000484332 00000 n 
+0000482424 00000 n 
+0000480313 00000 n 
+0000483419 00000 n 
+0000483479 00000 n 
+0000483538 00000 n 
+0000483658 00000 n 
+0000483778 00000 n 
+0000483904 00000 n 
+0000484022 00000 n 
+0000482598 00000 n 
+0000482813 00000 n 
+0000484147 00000 n 
+0000483026 00000 n 
+0000483241 00000 n 
+0000487918 00000 n 
+0000486687 00000 n 
+0000484471 00000 n 
+0000487442 00000 n 
+0000487502 00000 n 
+0000486852 00000 n 
+0000487680 00000 n 
+0000487034 00000 n 
+0000487264 00000 n 
+0001155040 00000 n 
+0000499212 00000 n 
+0000491392 00000 n 
+0000488030 00000 n 
+0000498433 00000 n 
+0000498493 00000 n 
+0000498553 00000 n 
+0000491809 00000 n 
+0000498613 00000 n 
+0000492037 00000 n 
+0000492265 00000 n 
+0000498673 00000 n 
+0000492460 00000 n 
+0000492667 00000 n 
+0003494281 00000 n 
+0003492178 00000 n 
+0003494116 00000 n 
+0000498732 00000 n 
+0000492894 00000 n 
+0000493102 00000 n 
+0003491322 00000 n 
+0003486621 00000 n 
+0003491156 00000 n 
+0000493330 00000 n 
+0000498792 00000 n 
+0000493522 00000 n 
+0000493722 00000 n 
+0000493950 00000 n 
+0000494151 00000 n 
+0000494379 00000 n 
+0000494571 00000 n 
+0000494772 00000 n 
+0000495000 00000 n 
+0000498852 00000 n 
+0000495191 00000 n 
+0000498912 00000 n 
+0000495418 00000 n 
+0000498972 00000 n 
+0000495646 00000 n 
+0000499032 00000 n 
+0000495873 00000 n 
+0000499092 00000 n 
+0000496100 00000 n 
+0000499152 00000 n 
+0000496328 00000 n 
+0000496556 00000 n 
+0000496784 00000 n 
+0000496983 00000 n 
+0000497211 00000 n 
+0000497411 00000 n 
+0000497639 00000 n 
+0000497839 00000 n 
+0000498047 00000 n 
+0000498255 00000 n 
+0000541650 00000 n 
+0000541770 00000 n 
+0000541889 00000 n 
+0000542009 00000 n 
+0000542129 00000 n 
+0000511947 00000 n 
+0000503474 00000 n 
+0000499353 00000 n 
+0000511827 00000 n 
+0000503954 00000 n 
+0000504182 00000 n 
+0000504382 00000 n 
+0000504590 00000 n 
+0000504798 00000 n 
+0000504988 00000 n 
+0000505216 00000 n 
+0000505416 00000 n 
+0000505624 00000 n 
+0000505832 00000 n 
+0000506060 00000 n 
+0000506260 00000 n 
+0000506468 00000 n 
+0000506676 00000 n 
+0000506867 00000 n 
+0000507094 00000 n 
+0000507288 00000 n 
+0000507515 00000 n 
+0000507710 00000 n 
+0000507938 00000 n 
+0000511887 00000 n 
+0000508133 00000 n 
+0000508361 00000 n 
+0000508589 00000 n 
+0000508781 00000 n 
+0000509008 00000 n 
+0000509207 00000 n 
+0000509434 00000 n 
+0000509623 00000 n 
+0000509792 00000 n 
+0000510020 00000 n 
+0000510216 00000 n 
+0000510384 00000 n 
+0000510610 00000 n 
+0000510803 00000 n 
+0000511031 00000 n 
+0000511226 00000 n 
+0000511454 00000 n 
+0000511649 00000 n 
+0000545218 00000 n 
+0000545344 00000 n 
+0000548373 00000 n 
+0000548499 00000 n 
+0000548625 00000 n 
+0000548745 00000 n 
+0000551889 00000 n 
+0000552009 00000 n 
+0000552129 00000 n 
+0000552249 00000 n 
+0000555484 00000 n 
+0000555604 00000 n 
+0000555723 00000 n 
+0000527545 00000 n 
+0000516932 00000 n 
+0000512074 00000 n 
+0000527425 00000 n 
+0000517511 00000 n 
+0000517739 00000 n 
+0000517929 00000 n 
+0000518129 00000 n 
+0000518312 00000 n 
+0000518540 00000 n 
+0000518730 00000 n 
+0000518930 00000 n 
+0000519113 00000 n 
+0000519341 00000 n 
+0000519531 00000 n 
+0000519738 00000 n 
+0000519938 00000 n 
+0000520138 00000 n 
+0003485927 00000 n 
+0003482495 00000 n 
+0003485760 00000 n 
+0003481822 00000 n 
+0003477434 00000 n 
+0003481656 00000 n 
+0000520319 00000 n 
+0000520547 00000 n 
+0000520737 00000 n 
+0000520945 00000 n 
+0000521145 00000 n 
+0000521345 00000 n 
+0000521525 00000 n 
+0000521751 00000 n 
+0000521947 00000 n 
+0000522154 00000 n 
+0000522354 00000 n 
+0000522535 00000 n 
+0000522763 00000 n 
+0000522961 00000 n 
+0000523169 00000 n 
+0000523369 00000 n 
+0000523550 00000 n 
+0000523778 00000 n 
+0000523967 00000 n 
+0000524167 00000 n 
+0000524367 00000 n 
+0000524558 00000 n 
+0000524784 00000 n 
+0000524971 00000 n 
+0000525169 00000 n 
+0000525369 00000 n 
+0000525560 00000 n 
+0000525788 00000 n 
+0000525983 00000 n 
+0000527485 00000 n 
+0000526156 00000 n 
+0000526384 00000 n 
+0000526612 00000 n 
+0000526820 00000 n 
+0000527043 00000 n 
+0000527247 00000 n 
+0003701051 00000 n 
+0000555841 00000 n 
+0000560106 00000 n 
+0000560226 00000 n 
+0000560345 00000 n 
+0000563806 00000 n 
+0000563926 00000 n 
+0000564046 00000 n 
+0000567906 00000 n 
+0000568026 00000 n 
+0000568146 00000 n 
+0000572114 00000 n 
+0000538568 00000 n 
+0000531343 00000 n 
+0000527728 00000 n 
+0000538030 00000 n 
+0000531751 00000 n 
+0000531979 00000 n 
+0000532174 00000 n 
+0000532349 00000 n 
+0000532577 00000 n 
+0000532773 00000 n 
+0000533001 00000 n 
+0000533208 00000 n 
+0000533436 00000 n 
+0000533626 00000 n 
+0000533834 00000 n 
+0000534062 00000 n 
+0000534258 00000 n 
+0000538090 00000 n 
+0000534448 00000 n 
+0000534676 00000 n 
+0000534904 00000 n 
+0000538150 00000 n 
+0000538208 00000 n 
+0000538268 00000 n 
+0000538328 00000 n 
+0000538388 00000 n 
+0000535099 00000 n 
+0000535307 00000 n 
+0000538448 00000 n 
+0000535534 00000 n 
+0000535741 00000 n 
+0000535967 00000 n 
+0000538508 00000 n 
+0000536195 00000 n 
+0000536423 00000 n 
+0000536618 00000 n 
+0000536846 00000 n 
+0000537040 00000 n 
+0000537235 00000 n 
+0000537463 00000 n 
+0000537658 00000 n 
+0000537852 00000 n 
+0000572234 00000 n 
+0000572354 00000 n 
+0000576689 00000 n 
+0000576808 00000 n 
+0000576928 00000 n 
+0000580654 00000 n 
+0000580780 00000 n 
+0000580960 00000 n 
+0000581080 00000 n 
+0000581206 00000 n 
+0000542189 00000 n 
+0000540501 00000 n 
+0000538721 00000 n 
+0000541471 00000 n 
+0000540675 00000 n 
+0000540903 00000 n 
+0000541098 00000 n 
+0000541531 00000 n 
+0000541591 00000 n 
+0000541710 00000 n 
+0000541829 00000 n 
+0000541949 00000 n 
+0000542069 00000 n 
+0000541293 00000 n 
+0000581332 00000 n 
+0000545470 00000 n 
+0000544774 00000 n 
+0000542328 00000 n 
+0000545099 00000 n 
+0000545159 00000 n 
+0000545284 00000 n 
+0000545410 00000 n 
+0000544921 00000 n 
+0000548804 00000 n 
+0000547988 00000 n 
+0000545596 00000 n 
+0000548313 00000 n 
+0000548439 00000 n 
+0000548565 00000 n 
+0000548685 00000 n 
+0000548135 00000 n 
+0000552369 00000 n 
+0000551090 00000 n 
+0000548930 00000 n 
+0000551770 00000 n 
+0000551830 00000 n 
+0000551949 00000 n 
+0000552069 00000 n 
+0000552189 00000 n 
+0000551255 00000 n 
+0000552309 00000 n 
+0000551424 00000 n 
+0000551592 00000 n 
+0000555961 00000 n 
+0000554708 00000 n 
+0000552495 00000 n 
+0000555424 00000 n 
+0000554873 00000 n 
+0000555544 00000 n 
+0000555664 00000 n 
+0000555781 00000 n 
+0000555901 00000 n 
+0000555063 00000 n 
+0000555246 00000 n 
+0003701177 00000 n 
+0000560464 00000 n 
+0000558947 00000 n 
+0000556087 00000 n 
+0000560046 00000 n 
+0000560166 00000 n 
+0000559130 00000 n 
+0000560285 00000 n 
+0000559313 00000 n 
+0000559494 00000 n 
+0000560404 00000 n 
+0000559688 00000 n 
+0000559868 00000 n 
+0000564106 00000 n 
+0000563042 00000 n 
+0000560640 00000 n 
+0000563746 00000 n 
+0000563866 00000 n 
+0000563207 00000 n 
+0000563986 00000 n 
+0000563387 00000 n 
+0000563568 00000 n 
+0000568206 00000 n 
+0000566881 00000 n 
+0000564270 00000 n 
+0000567787 00000 n 
+0000567847 00000 n 
+0000567055 00000 n 
+0000567966 00000 n 
+0000567246 00000 n 
+0000568086 00000 n 
+0000567436 00000 n 
+0000567609 00000 n 
+0000572413 00000 n 
+0000570815 00000 n 
+0000568369 00000 n 
+0000571995 00000 n 
+0000572055 00000 n 
+0000570998 00000 n 
+0000572174 00000 n 
+0000571213 00000 n 
+0000572294 00000 n 
+0000571428 00000 n 
+0000571604 00000 n 
+0000571817 00000 n 
+0000577054 00000 n 
+0000575241 00000 n 
+0000572601 00000 n 
+0000576570 00000 n 
+0000576630 00000 n 
+0000575433 00000 n 
+0000575623 00000 n 
+0000576749 00000 n 
+0000576868 00000 n 
+0000575812 00000 n 
+0000576027 00000 n 
+0000576994 00000 n 
+0000576202 00000 n 
+0000576392 00000 n 
+0000581457 00000 n 
+0000579888 00000 n 
+0000577205 00000 n 
+0000580594 00000 n 
+0000580053 00000 n 
+0000580242 00000 n 
+0000580720 00000 n 
+0000580840 00000 n 
+0000580900 00000 n 
+0000581020 00000 n 
+0000581146 00000 n 
+0000581272 00000 n 
+0000581398 00000 n 
+0000580416 00000 n 
+0003701303 00000 n 
+0000590558 00000 n 
+0000584603 00000 n 
+0000581608 00000 n 
+0000590021 00000 n 
+0003477077 00000 n 
+0003475069 00000 n 
+0003476910 00000 n 
+0000590198 00000 n 
+0000590258 00000 n 
+0000584957 00000 n 
+0000590318 00000 n 
+0000585179 00000 n 
+0000585376 00000 n 
+0000590378 00000 n 
+0000590438 00000 n 
+0000585600 00000 n 
+0000585808 00000 n 
+0000590498 00000 n 
+0000586032 00000 n 
+0000586240 00000 n 
+0000586464 00000 n 
+0000586687 00000 n 
+0000586911 00000 n 
+0000587119 00000 n 
+0000587327 00000 n 
+0000587551 00000 n 
+0000587742 00000 n 
+0000587950 00000 n 
+0000588174 00000 n 
+0000588365 00000 n 
+0000588572 00000 n 
+0000588796 00000 n 
+0000588996 00000 n 
+0000589220 00000 n 
+0000589420 00000 n 
+0000589644 00000 n 
+0000589843 00000 n 
+0000773997 00000 n 
+0000690713 00000 n 
+0000690833 00000 n 
+0000690953 00000 n 
+0000691079 00000 n 
+0000694211 00000 n 
+0000694331 00000 n 
+0000603001 00000 n 
+0000594240 00000 n 
+0000590726 00000 n 
+0000602401 00000 n 
+0000594711 00000 n 
+0000594935 00000 n 
+0000595127 00000 n 
+0000595335 00000 n 
+0000595559 00000 n 
+0000595744 00000 n 
+0000595934 00000 n 
+0000596142 00000 n 
+0000596366 00000 n 
+0000596552 00000 n 
+0000596760 00000 n 
+0000596982 00000 n 
+0000597178 00000 n 
+0000602461 00000 n 
+0000597384 00000 n 
+0000597575 00000 n 
+0000597799 00000 n 
+0000602521 00000 n 
+0000597990 00000 n 
+0000598214 00000 n 
+0000602581 00000 n 
+0000598405 00000 n 
+0000602641 00000 n 
+0000598628 00000 n 
+0000598836 00000 n 
+0000602701 00000 n 
+0000599060 00000 n 
+0000599268 00000 n 
+0000599492 00000 n 
+0000602761 00000 n 
+0000599685 00000 n 
+0000599885 00000 n 
+0000602821 00000 n 
+0000600107 00000 n 
+0000600307 00000 n 
+0000602881 00000 n 
+0000600529 00000 n 
+0000600729 00000 n 
+0000602941 00000 n 
+0000600953 00000 n 
+0000601152 00000 n 
+0000601375 00000 n 
+0000601599 00000 n 
+0000601799 00000 n 
+0000602023 00000 n 
+0000602223 00000 n 
+0000694451 00000 n 
+0000694571 00000 n 
+0000697626 00000 n 
+0000697744 00000 n 
+0000697924 00000 n 
+0000698044 00000 n 
+0000616008 00000 n 
+0000606749 00000 n 
+0000603182 00000 n 
+0000615589 00000 n 
+0000607247 00000 n 
+0000607471 00000 n 
+0000607671 00000 n 
+0000607879 00000 n 
+0000608087 00000 n 
+0000608311 00000 n 
+0000608511 00000 n 
+0000608719 00000 n 
+0000608927 00000 n 
+0000609117 00000 n 
+0000609338 00000 n 
+0000609535 00000 n 
+0000609740 00000 n 
+0000609945 00000 n 
+0000610169 00000 n 
+0000610369 00000 n 
+0000610577 00000 n 
+0000610785 00000 n 
+0000610975 00000 n 
+0000611199 00000 n 
+0000611389 00000 n 
+0000611613 00000 n 
+0000611804 00000 n 
+0000612028 00000 n 
+0000612218 00000 n 
+0000612419 00000 n 
+0000612643 00000 n 
+0000612835 00000 n 
+0000613036 00000 n 
+0000613260 00000 n 
+0000613452 00000 n 
+0000613653 00000 n 
+0000613877 00000 n 
+0000615649 00000 n 
+0000614068 00000 n 
+0000615709 00000 n 
+0000614292 00000 n 
+0000615769 00000 n 
+0000614516 00000 n 
+0000615829 00000 n 
+0000614740 00000 n 
+0000615889 00000 n 
+0000614964 00000 n 
+0000615949 00000 n 
+0000615188 00000 n 
+0000615411 00000 n 
+0000701158 00000 n 
+0000701278 00000 n 
+0000701404 00000 n 
+0000704557 00000 n 
+0000704683 00000 n 
+0000704808 00000 n 
+0000707369 00000 n 
+0000707489 00000 n 
+0000707609 00000 n 
+0000707729 00000 n 
+0000627205 00000 n 
+0000619533 00000 n 
+0000616148 00000 n 
+0000627085 00000 n 
+0000619977 00000 n 
+0000620200 00000 n 
+0000627145 00000 n 
+0000620388 00000 n 
+0000620612 00000 n 
+0000620836 00000 n 
+0000621027 00000 n 
+0000621250 00000 n 
+0000621440 00000 n 
+0000621663 00000 n 
+0000621855 00000 n 
+0000622078 00000 n 
+0000622268 00000 n 
+0000622492 00000 n 
+0000622692 00000 n 
+0000622915 00000 n 
+0000623115 00000 n 
+0000623338 00000 n 
+0000623538 00000 n 
+0000623760 00000 n 
+0000623959 00000 n 
+0000624183 00000 n 
+0000624383 00000 n 
+0000624607 00000 n 
+0000624807 00000 n 
+0000625031 00000 n 
+0000625231 00000 n 
+0000625453 00000 n 
+0000625651 00000 n 
+0000625875 00000 n 
+0000626067 00000 n 
+0000626291 00000 n 
+0000626483 00000 n 
+0000626707 00000 n 
+0000626907 00000 n 
+0000707849 00000 n 
+0000707968 00000 n 
+0000711101 00000 n 
+0000714428 00000 n 
+0000714548 00000 n 
+0000718397 00000 n 
+0000721680 00000 n 
+0000724945 00000 n 
+0000725065 00000 n 
+0000725185 00000 n 
+0000641038 00000 n 
+0000631583 00000 n 
+0000627345 00000 n 
+0000640798 00000 n 
+0000632108 00000 n 
+0000632332 00000 n 
+0000632532 00000 n 
+0000632756 00000 n 
+0000632945 00000 n 
+0000633114 00000 n 
+0000633338 00000 n 
+0000633534 00000 n 
+0000633702 00000 n 
+0000633926 00000 n 
+0000634117 00000 n 
+0000634341 00000 n 
+0000634532 00000 n 
+0000634756 00000 n 
+0000634947 00000 n 
+0000635170 00000 n 
+0000640858 00000 n 
+0000635360 00000 n 
+0000635584 00000 n 
+0000635773 00000 n 
+0000635996 00000 n 
+0000640918 00000 n 
+0000636186 00000 n 
+0000636410 00000 n 
+0000636601 00000 n 
+0000636824 00000 n 
+0000637014 00000 n 
+0000640978 00000 n 
+0000637195 00000 n 
+0000637419 00000 n 
+0000637609 00000 n 
+0000637832 00000 n 
+0000638022 00000 n 
+0000638205 00000 n 
+0000638428 00000 n 
+0000638618 00000 n 
+0000638818 00000 n 
+0000639001 00000 n 
+0000639225 00000 n 
+0000639415 00000 n 
+0000639615 00000 n 
+0000639798 00000 n 
+0000640022 00000 n 
+0000640212 00000 n 
+0000640420 00000 n 
+0000640620 00000 n 
+0000725305 00000 n 
+0000728797 00000 n 
+0000728917 00000 n 
+0000729035 00000 n 
+0000732475 00000 n 
+0000732714 00000 n 
+0000732834 00000 n 
+0000736943 00000 n 
+0000737063 00000 n 
+0000737183 00000 n 
+0000737303 00000 n 
+0000657644 00000 n 
+0000646211 00000 n 
+0000641178 00000 n 
+0000657524 00000 n 
+0000646835 00000 n 
+0000647016 00000 n 
+0000647240 00000 n 
+0000647440 00000 n 
+0000647648 00000 n 
+0000647847 00000 n 
+0000648028 00000 n 
+0000648251 00000 n 
+0000648440 00000 n 
+0000648648 00000 n 
+0000648848 00000 n 
+0000649048 00000 n 
+0000649229 00000 n 
+0000649452 00000 n 
+0000649651 00000 n 
+0000649859 00000 n 
+0000650059 00000 n 
+0000650240 00000 n 
+0000650464 00000 n 
+0000650654 00000 n 
+0000650854 00000 n 
+0000651054 00000 n 
+0000651254 00000 n 
+0000651445 00000 n 
+0000651668 00000 n 
+0000651857 00000 n 
+0000652056 00000 n 
+0000652256 00000 n 
+0000652456 00000 n 
+0000652645 00000 n 
+0000652869 00000 n 
+0000653059 00000 n 
+0000657584 00000 n 
+0000653232 00000 n 
+0000653455 00000 n 
+0000653677 00000 n 
+0000653866 00000 n 
+0000654037 00000 n 
+0000654260 00000 n 
+0000654449 00000 n 
+0000654620 00000 n 
+0000654842 00000 n 
+0000655031 00000 n 
+0000655199 00000 n 
+0000655423 00000 n 
+0000655614 00000 n 
+0000655814 00000 n 
+0000655982 00000 n 
+0000656206 00000 n 
+0000656396 00000 n 
+0000656566 00000 n 
+0000656735 00000 n 
+0000656958 00000 n 
+0000657148 00000 n 
+0000657346 00000 n 
+0003701429 00000 n 
+0000741416 00000 n 
+0000741536 00000 n 
+0000741656 00000 n 
+0000746006 00000 n 
+0000746126 00000 n 
+0000750325 00000 n 
+0000750444 00000 n 
+0000750564 00000 n 
+0000750684 00000 n 
+0000755200 00000 n 
+0000755320 00000 n 
+0000755439 00000 n 
+0000669572 00000 n 
+0000661810 00000 n 
+0000657867 00000 n 
+0000669212 00000 n 
+0000662254 00000 n 
+0000662425 00000 n 
+0000662649 00000 n 
+0000662840 00000 n 
+0000669272 00000 n 
+0000663005 00000 n 
+0000663229 00000 n 
+0000663420 00000 n 
+0000663644 00000 n 
+0000663835 00000 n 
+0000664035 00000 n 
+0000664200 00000 n 
+0000664424 00000 n 
+0000664632 00000 n 
+0000664856 00000 n 
+0000665064 00000 n 
+0000665288 00000 n 
+0000665477 00000 n 
+0000665652 00000 n 
+0000665876 00000 n 
+0000666071 00000 n 
+0000666295 00000 n 
+0000666503 00000 n 
+0000666727 00000 n 
+0000666922 00000 n 
+0000667146 00000 n 
+0000667336 00000 n 
+0000667544 00000 n 
+0000667768 00000 n 
+0000667964 00000 n 
+0000669332 00000 n 
+0000669392 00000 n 
+0000668154 00000 n 
+0000668362 00000 n 
+0000669452 00000 n 
+0000668586 00000 n 
+0000669512 00000 n 
+0000668810 00000 n 
+0000669034 00000 n 
+0000759850 00000 n 
+0000759970 00000 n 
+0000760090 00000 n 
+0000764288 00000 n 
+0000764407 00000 n 
+0000764527 00000 n 
+0000764644 00000 n 
+0000769353 00000 n 
+0000769473 00000 n 
+0000769599 00000 n 
+0000681398 00000 n 
+0000672874 00000 n 
+0000669739 00000 n 
+0000681218 00000 n 
+0000681278 00000 n 
+0000673363 00000 n 
+0000673587 00000 n 
+0000673777 00000 n 
+0000673968 00000 n 
+0000674191 00000 n 
+0000681338 00000 n 
+0000674381 00000 n 
+0000674605 00000 n 
+0000674796 00000 n 
+0000674987 00000 n 
+0000675211 00000 n 
+0000675408 00000 n 
+0000675597 00000 n 
+0000675786 00000 n 
+0000675992 00000 n 
+0000676216 00000 n 
+0000676413 00000 n 
+0000676604 00000 n 
+0000676795 00000 n 
+0000677003 00000 n 
+0000677227 00000 n 
+0000677423 00000 n 
+0000677614 00000 n 
+0000677805 00000 n 
+0000678013 00000 n 
+0000678237 00000 n 
+0000678433 00000 n 
+0000678623 00000 n 
+0000678813 00000 n 
+0000679020 00000 n 
+0000679243 00000 n 
+0000679440 00000 n 
+0000679631 00000 n 
+0000679822 00000 n 
+0000680030 00000 n 
+0000680253 00000 n 
+0000680450 00000 n 
+0000680641 00000 n 
+0000680832 00000 n 
+0000681040 00000 n 
+0000774183 00000 n 
+0000774303 00000 n 
+0000774429 00000 n 
+0000774554 00000 n 
+0000777230 00000 n 
+0000777356 00000 n 
+0000777482 00000 n 
+0000780383 00000 n 
+0000780509 00000 n 
+0000687937 00000 n 
+0000685599 00000 n 
+0000681565 00000 n 
+0000687757 00000 n 
+0000685827 00000 n 
+0000686050 00000 n 
+0000686240 00000 n 
+0000686430 00000 n 
+0000687817 00000 n 
+0000687877 00000 n 
+0000686621 00000 n 
+0000686816 00000 n 
+0000687005 00000 n 
+0000687197 00000 n 
+0000687387 00000 n 
+0000687579 00000 n 
+0000780635 00000 n 
+0000691145 00000 n 
+0000690268 00000 n 
+0000688126 00000 n 
+0000690593 00000 n 
+0000690653 00000 n 
+0000690773 00000 n 
+0000690893 00000 n 
+0000691019 00000 n 
+0000690415 00000 n 
+0000694697 00000 n 
+0000693581 00000 n 
+0000691309 00000 n 
+0000694092 00000 n 
+0000694152 00000 n 
+0000693737 00000 n 
+0000694271 00000 n 
+0000694391 00000 n 
+0000694511 00000 n 
+0000694637 00000 n 
+0000693914 00000 n 
+0000698103 00000 n 
+0000697241 00000 n 
+0000694823 00000 n 
+0000697566 00000 n 
+0000697686 00000 n 
+0000697804 00000 n 
+0000697864 00000 n 
+0000697984 00000 n 
+0000697388 00000 n 
+0003701555 00000 n 
+0000701469 00000 n 
+0000700714 00000 n 
+0000698242 00000 n 
+0000701039 00000 n 
+0000701099 00000 n 
+0000701218 00000 n 
+0000701344 00000 n 
+0000700861 00000 n 
+0000704867 00000 n 
+0000704113 00000 n 
+0000701608 00000 n 
+0000704438 00000 n 
+0000704498 00000 n 
+0000704623 00000 n 
+0000704749 00000 n 
+0000704260 00000 n 
+0000708027 00000 n 
+0000706925 00000 n 
+0000705006 00000 n 
+0000707250 00000 n 
+0000707310 00000 n 
+0000707429 00000 n 
+0000707549 00000 n 
+0000707669 00000 n 
+0000707789 00000 n 
+0000707909 00000 n 
+0000707072 00000 n 
+0000711341 00000 n 
+0000710146 00000 n 
+0000708166 00000 n 
+0000710862 00000 n 
+0000710922 00000 n 
+0000711041 00000 n 
+0000710311 00000 n 
+0000710486 00000 n 
+0000711161 00000 n 
+0000711281 00000 n 
+0000710684 00000 n 
+0000714727 00000 n 
+0000713654 00000 n 
+0000711480 00000 n 
+0000714368 00000 n 
+0000713819 00000 n 
+0000713993 00000 n 
+0000714488 00000 n 
+0000714608 00000 n 
+0000714190 00000 n 
+0000718517 00000 n 
+0000717052 00000 n 
+0000714866 00000 n 
+0000718158 00000 n 
+0000718218 00000 n 
+0000717235 00000 n 
+0000717410 00000 n 
+0000718337 00000 n 
+0000717607 00000 n 
+0000717782 00000 n 
+0000718457 00000 n 
+0000717980 00000 n 
+0003701681 00000 n 
+0000721920 00000 n 
+0000720785 00000 n 
+0000718656 00000 n 
+0000721501 00000 n 
+0000721621 00000 n 
+0000720950 00000 n 
+0000721125 00000 n 
+0000721740 00000 n 
+0000721860 00000 n 
+0000721323 00000 n 
+0000725364 00000 n 
+0000724170 00000 n 
+0000722059 00000 n 
+0000724885 00000 n 
+0000724335 00000 n 
+0000724510 00000 n 
+0000725005 00000 n 
+0000725125 00000 n 
+0000725245 00000 n 
+0000724707 00000 n 
+0000729215 00000 n 
+0000727801 00000 n 
+0000725503 00000 n 
+0000728678 00000 n 
+0000728738 00000 n 
+0000728857 00000 n 
+0000727975 00000 n 
+0000728977 00000 n 
+0000728142 00000 n 
+0000728311 00000 n 
+0000729095 00000 n 
+0000728500 00000 n 
+0000732893 00000 n 
+0000731249 00000 n 
+0000729354 00000 n 
+0000732356 00000 n 
+0000732416 00000 n 
+0000731432 00000 n 
+0000731607 00000 n 
+0000732535 00000 n 
+0000732655 00000 n 
+0000731805 00000 n 
+0000731980 00000 n 
+0000732774 00000 n 
+0000732178 00000 n 
+0000737362 00000 n 
+0000735733 00000 n 
+0000733032 00000 n 
+0000736824 00000 n 
+0000736884 00000 n 
+0000735916 00000 n 
+0000737003 00000 n 
+0000736097 00000 n 
+0000737123 00000 n 
+0000736280 00000 n 
+0000737243 00000 n 
+0000736463 00000 n 
+0000736646 00000 n 
+0000741715 00000 n 
+0000740404 00000 n 
+0000737501 00000 n 
+0000741297 00000 n 
+0000741357 00000 n 
+0000740578 00000 n 
+0000741476 00000 n 
+0000740759 00000 n 
+0000741596 00000 n 
+0000740939 00000 n 
+0000741119 00000 n 
+0003701807 00000 n 
+0000746246 00000 n 
+0000744973 00000 n 
+0000741891 00000 n 
+0000745887 00000 n 
+0000745947 00000 n 
+0000745147 00000 n 
+0000746066 00000 n 
+0000745328 00000 n 
+0000746186 00000 n 
+0000745519 00000 n 
+0000745709 00000 n 
+0000750744 00000 n 
+0000749034 00000 n 
+0000746422 00000 n 
+0000750265 00000 n 
+0000750385 00000 n 
+0000749226 00000 n 
+0000750504 00000 n 
+0000749399 00000 n 
+0000749570 00000 n 
+0000750624 00000 n 
+0000749743 00000 n 
+0000749914 00000 n 
+0000750087 00000 n 
+0000755498 00000 n 
+0000753858 00000 n 
+0000750896 00000 n 
+0000755081 00000 n 
+0000755141 00000 n 
+0000754050 00000 n 
+0000754218 00000 n 
+0000755260 00000 n 
+0000754391 00000 n 
+0000754559 00000 n 
+0000755379 00000 n 
+0000754732 00000 n 
+0003474603 00000 n 
+0003471377 00000 n 
+0003474434 00000 n 
+0000754903 00000 n 
+0000760149 00000 n 
+0000758336 00000 n 
+0000755677 00000 n 
+0000759731 00000 n 
+0000759791 00000 n 
+0000758537 00000 n 
+0000758708 00000 n 
+0000759910 00000 n 
+0000758881 00000 n 
+0000759045 00000 n 
+0000760030 00000 n 
+0000759218 00000 n 
+0000759380 00000 n 
+0000759553 00000 n 
+0000764703 00000 n 
+0000763029 00000 n 
+0000760301 00000 n 
+0000764169 00000 n 
+0000764229 00000 n 
+0000764348 00000 n 
+0000764467 00000 n 
+0000763212 00000 n 
+0000763388 00000 n 
+0000764587 00000 n 
+0000763611 00000 n 
+0000763801 00000 n 
+0000763991 00000 n 
+0000769664 00000 n 
+0000768087 00000 n 
+0000764891 00000 n 
+0000769234 00000 n 
+0000769294 00000 n 
+0000769413 00000 n 
+0000768270 00000 n 
+0000768465 00000 n 
+0000769539 00000 n 
+0000768659 00000 n 
+0000768883 00000 n 
+0000769056 00000 n 
+0003701933 00000 n 
+0000774680 00000 n 
+0000772974 00000 n 
+0000769815 00000 n 
+0000773878 00000 n 
+0000773938 00000 n 
+0000773148 00000 n 
+0000773338 00000 n 
+0000773526 00000 n 
+0000774063 00000 n 
+0000774123 00000 n 
+0000774243 00000 n 
+0000774369 00000 n 
+0000774494 00000 n 
+0000774620 00000 n 
+0000773700 00000 n 
+0000777608 00000 n 
+0000776845 00000 n 
+0000774831 00000 n 
+0000777170 00000 n 
+0000777296 00000 n 
+0000777422 00000 n 
+0000777548 00000 n 
+0000776992 00000 n 
+0000780879 00000 n 
+0000779998 00000 n 
+0000777734 00000 n 
+0000780323 00000 n 
+0000780449 00000 n 
+0000780575 00000 n 
+0000780701 00000 n 
+0000780145 00000 n 
+0000787221 00000 n 
+0000783472 00000 n 
+0000781018 00000 n 
+0000786502 00000 n 
+0000786562 00000 n 
+0000783727 00000 n 
+0000786622 00000 n 
+0000786682 00000 n 
+0000783940 00000 n 
+0000786742 00000 n 
+0000784173 00000 n 
+0000784404 00000 n 
+0000786802 00000 n 
+0000784593 00000 n 
+0000784827 00000 n 
+0000786862 00000 n 
+0000785028 00000 n 
+0000785262 00000 n 
+0000785496 00000 n 
+0000786922 00000 n 
+0000785697 00000 n 
+0000785931 00000 n 
+0000786982 00000 n 
+0000786123 00000 n 
+0000787042 00000 n 
+0000787101 00000 n 
+0000787161 00000 n 
+0000786324 00000 n 
+0000793423 00000 n 
+0000789814 00000 n 
+0000787387 00000 n 
+0000792766 00000 n 
+0000792945 00000 n 
+0000793005 00000 n 
+0000790069 00000 n 
+0000790315 00000 n 
+0000790516 00000 n 
+0000793065 00000 n 
+0000793243 00000 n 
+0000793303 00000 n 
+0000790717 00000 n 
+0000793363 00000 n 
+0000790934 00000 n 
+0000791151 00000 n 
+0000791341 00000 n 
+0000791558 00000 n 
+0000791747 00000 n 
+0000791965 00000 n 
+0000792173 00000 n 
+0000792380 00000 n 
+0000792588 00000 n 
+0000954750 00000 n 
+0000954875 00000 n 
+0000954995 00000 n 
+0000806890 00000 n 
+0000797188 00000 n 
+0000793562 00000 n 
+0000806410 00000 n 
+0000797704 00000 n 
+0000797922 00000 n 
+0000798130 00000 n 
+0000798338 00000 n 
+0000806470 00000 n 
+0000798546 00000 n 
+0000798745 00000 n 
+0000806530 00000 n 
+0000798962 00000 n 
+0000799162 00000 n 
+0000806590 00000 n 
+0000799380 00000 n 
+0000799580 00000 n 
+0000806650 00000 n 
+0000799798 00000 n 
+0000799998 00000 n 
+0000806710 00000 n 
+0000800216 00000 n 
+0000800424 00000 n 
+0000806770 00000 n 
+0000800642 00000 n 
+0000800850 00000 n 
+0000806830 00000 n 
+0000801068 00000 n 
+0000801286 00000 n 
+0000801504 00000 n 
+0000801712 00000 n 
+0000801920 00000 n 
+0000802138 00000 n 
+0000802323 00000 n 
+0000802531 00000 n 
+0000802749 00000 n 
+0000802934 00000 n 
+0000803142 00000 n 
+0000803360 00000 n 
+0000803560 00000 n 
+0000803778 00000 n 
+0000803978 00000 n 
+0000804175 00000 n 
+0000804393 00000 n 
+0000804592 00000 n 
+0000804809 00000 n 
+0000805007 00000 n 
+0000805203 00000 n 
+0000805421 00000 n 
+0000805621 00000 n 
+0000805838 00000 n 
+0000806037 00000 n 
+0000806232 00000 n 
+0003702059 00000 n 
+0000955113 00000 n 
+0000888377 00000 n 
+0000888497 00000 n 
+0000888617 00000 n 
+0000888743 00000 n 
+0000888869 00000 n 
+0000891772 00000 n 
+0000891892 00000 n 
+0000892012 00000 n 
+0000892132 00000 n 
+0000818157 00000 n 
+0000810459 00000 n 
+0000807044 00000 n 
+0000817498 00000 n 
+0000810885 00000 n 
+0000811102 00000 n 
+0000811292 00000 n 
+0000811499 00000 n 
+0000811717 00000 n 
+0000811914 00000 n 
+0000812122 00000 n 
+0000812340 00000 n 
+0000812532 00000 n 
+0000812739 00000 n 
+0000812957 00000 n 
+0000813142 00000 n 
+0000813350 00000 n 
+0000813567 00000 n 
+0000813775 00000 n 
+0000817558 00000 n 
+0000813982 00000 n 
+0000814167 00000 n 
+0000814385 00000 n 
+0000817618 00000 n 
+0000814570 00000 n 
+0000814788 00000 n 
+0000817678 00000 n 
+0000814973 00000 n 
+0000815179 00000 n 
+0000817738 00000 n 
+0000815395 00000 n 
+0000815603 00000 n 
+0000815821 00000 n 
+0000817798 00000 n 
+0000816014 00000 n 
+0000817858 00000 n 
+0000816230 00000 n 
+0000817918 00000 n 
+0000816448 00000 n 
+0000817978 00000 n 
+0000816666 00000 n 
+0000818038 00000 n 
+0000816884 00000 n 
+0000818097 00000 n 
+0000817102 00000 n 
+0000817320 00000 n 
+0000895259 00000 n 
+0000895379 00000 n 
+0000895505 00000 n 
+0000895631 00000 n 
+0000895755 00000 n 
+0000831550 00000 n 
+0000822108 00000 n 
+0000818325 00000 n 
+0000831430 00000 n 
+0000822633 00000 n 
+0000822851 00000 n 
+0000823040 00000 n 
+0000823240 00000 n 
+0000823457 00000 n 
+0000823648 00000 n 
+0000823849 00000 n 
+0000824067 00000 n 
+0000824259 00000 n 
+0000824460 00000 n 
+0000824678 00000 n 
+0000824869 00000 n 
+0000825087 00000 n 
+0000825287 00000 n 
+0000825503 00000 n 
+0000825701 00000 n 
+0000825919 00000 n 
+0000826119 00000 n 
+0000826327 00000 n 
+0000826535 00000 n 
+0000826753 00000 n 
+0000826953 00000 n 
+0000827161 00000 n 
+0000827369 00000 n 
+0000827560 00000 n 
+0000827778 00000 n 
+0000827978 00000 n 
+0000828186 00000 n 
+0000828394 00000 n 
+0000828612 00000 n 
+0000828812 00000 n 
+0000829020 00000 n 
+0000829228 00000 n 
+0000829418 00000 n 
+0000829636 00000 n 
+0000829821 00000 n 
+0000830039 00000 n 
+0000830224 00000 n 
+0000830441 00000 n 
+0000831490 00000 n 
+0000830625 00000 n 
+0000830843 00000 n 
+0000831061 00000 n 
+0000831252 00000 n 
+0000898255 00000 n 
+0000898375 00000 n 
+0000898495 00000 n 
+0000898615 00000 n 
+0000898735 00000 n 
+0000898855 00000 n 
+0000901964 00000 n 
+0000902084 00000 n 
+0000902210 00000 n 
+0000905385 00000 n 
+0000905511 00000 n 
+0000905636 00000 n 
+0000908278 00000 n 
+0000908398 00000 n 
+0000843427 00000 n 
+0000835293 00000 n 
+0000831690 00000 n 
+0000843247 00000 n 
+0000835764 00000 n 
+0000835982 00000 n 
+0000836182 00000 n 
+0000836398 00000 n 
+0000836597 00000 n 
+0000836814 00000 n 
+0000837006 00000 n 
+0000837224 00000 n 
+0000837424 00000 n 
+0000837642 00000 n 
+0000837842 00000 n 
+0000838060 00000 n 
+0000838252 00000 n 
+0000838470 00000 n 
+0000838670 00000 n 
+0000838888 00000 n 
+0000839080 00000 n 
+0000839298 00000 n 
+0000839498 00000 n 
+0000839716 00000 n 
+0000839905 00000 n 
+0000840073 00000 n 
+0000840290 00000 n 
+0000840485 00000 n 
+0000840653 00000 n 
+0000840871 00000 n 
+0000841055 00000 n 
+0000841273 00000 n 
+0000843307 00000 n 
+0000841457 00000 n 
+0000841675 00000 n 
+0000841860 00000 n 
+0000842078 00000 n 
+0000843367 00000 n 
+0000842263 00000 n 
+0000842481 00000 n 
+0000842666 00000 n 
+0000842884 00000 n 
+0000843069 00000 n 
+0000908518 00000 n 
+0000908637 00000 n 
+0000911383 00000 n 
+0000911502 00000 n 
+0000911622 00000 n 
+0000911742 00000 n 
+0000914006 00000 n 
+0000914126 00000 n 
+0000914246 00000 n 
+0000914365 00000 n 
+0000917933 00000 n 
+0000918053 00000 n 
+0000918173 00000 n 
+0000918292 00000 n 
+0000918412 00000 n 
+0000860114 00000 n 
+0000848611 00000 n 
+0000843567 00000 n 
+0000859935 00000 n 
+0000859995 00000 n 
+0000849235 00000 n 
+0000849453 00000 n 
+0000849637 00000 n 
+0000849855 00000 n 
+0000850039 00000 n 
+0000850222 00000 n 
+0000850439 00000 n 
+0000850629 00000 n 
+0000850829 00000 n 
+0000851011 00000 n 
+0000851227 00000 n 
+0000851415 00000 n 
+0000851613 00000 n 
+0000851796 00000 n 
+0000852014 00000 n 
+0000852204 00000 n 
+0000852412 00000 n 
+0000852612 00000 n 
+0000852793 00000 n 
+0000853010 00000 n 
+0000853199 00000 n 
+0000853407 00000 n 
+0000853607 00000 n 
+0000853807 00000 n 
+0000853987 00000 n 
+0000854204 00000 n 
+0000854403 00000 n 
+0000854610 00000 n 
+0000854810 00000 n 
+0000854991 00000 n 
+0000855208 00000 n 
+0000855407 00000 n 
+0000855615 00000 n 
+0000855815 00000 n 
+0000855996 00000 n 
+0000856214 00000 n 
+0000856404 00000 n 
+0000856604 00000 n 
+0000856804 00000 n 
+0000857004 00000 n 
+0000857195 00000 n 
+0000857412 00000 n 
+0000857601 00000 n 
+0000857800 00000 n 
+0000858000 00000 n 
+0000858200 00000 n 
+0000858391 00000 n 
+0000858609 00000 n 
+0000858794 00000 n 
+0000860054 00000 n 
+0000858967 00000 n 
+0000859185 00000 n 
+0000859403 00000 n 
+0000859588 00000 n 
+0000859757 00000 n 
+0000922357 00000 n 
+0000922477 00000 n 
+0000922597 00000 n 
+0000922717 00000 n 
+0000926664 00000 n 
+0000926784 00000 n 
+0000931049 00000 n 
+0000931169 00000 n 
+0000931288 00000 n 
+0000935386 00000 n 
+0000935506 00000 n 
+0000872434 00000 n 
+0000864453 00000 n 
+0000860323 00000 n 
+0000872134 00000 n 
+0000864915 00000 n 
+0000865133 00000 n 
+0000865318 00000 n 
+0000872194 00000 n 
+0000865489 00000 n 
+0000865707 00000 n 
+0000865892 00000 n 
+0000866110 00000 n 
+0000866295 00000 n 
+0000866495 00000 n 
+0000866666 00000 n 
+0000866884 00000 n 
+0000867068 00000 n 
+0000867239 00000 n 
+0000867408 00000 n 
+0000867626 00000 n 
+0000867834 00000 n 
+0000868052 00000 n 
+0000868260 00000 n 
+0000868476 00000 n 
+0000868657 00000 n 
+0000868875 00000 n 
+0000869070 00000 n 
+0000869288 00000 n 
+0000869496 00000 n 
+0000869714 00000 n 
+0000869909 00000 n 
+0000870127 00000 n 
+0000870317 00000 n 
+0000870525 00000 n 
+0000870743 00000 n 
+0000870939 00000 n 
+0000872254 00000 n 
+0000872314 00000 n 
+0000871129 00000 n 
+0000871337 00000 n 
+0000871555 00000 n 
+0000872374 00000 n 
+0000871738 00000 n 
+0000871956 00000 n 
+0000935626 00000 n 
+0000935746 00000 n 
+0000940426 00000 n 
+0000940546 00000 n 
+0000940666 00000 n 
+0000945037 00000 n 
+0000945157 00000 n 
+0000945282 00000 n 
+0000945401 00000 n 
+0000950057 00000 n 
+0000950181 00000 n 
+0000883352 00000 n 
+0000875732 00000 n 
+0000872601 00000 n 
+0000883112 00000 n 
+0000883172 00000 n 
+0000876185 00000 n 
+0000883232 00000 n 
+0000876403 00000 n 
+0000876621 00000 n 
+0000876805 00000 n 
+0000876989 00000 n 
+0000877206 00000 n 
+0000883292 00000 n 
+0000877390 00000 n 
+0000877608 00000 n 
+0000877793 00000 n 
+0000877978 00000 n 
+0000878196 00000 n 
+0000878393 00000 n 
+0000878577 00000 n 
+0000878761 00000 n 
+0000878968 00000 n 
+0000879186 00000 n 
+0000879383 00000 n 
+0000879568 00000 n 
+0000879753 00000 n 
+0000879961 00000 n 
+0000880179 00000 n 
+0000880375 00000 n 
+0000880560 00000 n 
+0000880745 00000 n 
+0000880953 00000 n 
+0000881171 00000 n 
+0000881367 00000 n 
+0000881551 00000 n 
+0000881735 00000 n 
+0000881942 00000 n 
+0000882159 00000 n 
+0000882356 00000 n 
+0000882541 00000 n 
+0000882726 00000 n 
+0000882934 00000 n 
+0003702185 00000 n 
+0000958602 00000 n 
+0000958722 00000 n 
+0000958848 00000 n 
+0000958968 00000 n 
+0000959093 00000 n 
+0000961863 00000 n 
+0000961989 00000 n 
+0000962115 00000 n 
+0000888928 00000 n 
+0000886408 00000 n 
+0000883519 00000 n 
+0000888137 00000 n 
+0000886618 00000 n 
+0000886834 00000 n 
+0000887030 00000 n 
+0000887215 00000 n 
+0000887400 00000 n 
+0000888197 00000 n 
+0000888257 00000 n 
+0000887608 00000 n 
+0000888317 00000 n 
+0000888437 00000 n 
+0000888557 00000 n 
+0000888683 00000 n 
+0000888809 00000 n 
+0000887792 00000 n 
+0000887959 00000 n 
+0000991726 00000 n 
+0000892191 00000 n 
+0000891153 00000 n 
+0000889109 00000 n 
+0000891653 00000 n 
+0000891713 00000 n 
+0000891309 00000 n 
+0000891832 00000 n 
+0000891952 00000 n 
+0000892072 00000 n 
+0000891475 00000 n 
+0000895881 00000 n 
+0000894815 00000 n 
+0000892317 00000 n 
+0000895140 00000 n 
+0000895200 00000 n 
+0000895319 00000 n 
+0000895445 00000 n 
+0000895571 00000 n 
+0000895697 00000 n 
+0000895821 00000 n 
+0000894962 00000 n 
+0000898915 00000 n 
+0000897811 00000 n 
+0000896007 00000 n 
+0000898136 00000 n 
+0000898196 00000 n 
+0000898315 00000 n 
+0000898435 00000 n 
+0000898555 00000 n 
+0000898675 00000 n 
+0000898795 00000 n 
+0000897958 00000 n 
+0000902275 00000 n 
+0000901520 00000 n 
+0000899054 00000 n 
+0000901845 00000 n 
+0000901905 00000 n 
+0000902024 00000 n 
+0000902150 00000 n 
+0000901667 00000 n 
+0000905695 00000 n 
+0000904941 00000 n 
+0000902414 00000 n 
+0000905266 00000 n 
+0000905326 00000 n 
+0000905451 00000 n 
+0000905577 00000 n 
+0000905088 00000 n 
+0003702311 00000 n 
+0000908756 00000 n 
+0000907834 00000 n 
+0000905834 00000 n 
+0000908159 00000 n 
+0000908219 00000 n 
+0000908338 00000 n 
+0000908458 00000 n 
+0000908577 00000 n 
+0000908697 00000 n 
+0000907981 00000 n 
+0000911801 00000 n 
+0000910998 00000 n 
+0000908895 00000 n 
+0000911323 00000 n 
+0000911442 00000 n 
+0000911562 00000 n 
+0000911682 00000 n 
+0000911145 00000 n 
+0000914425 00000 n 
+0000913562 00000 n 
+0000911940 00000 n 
+0000913887 00000 n 
+0000913947 00000 n 
+0000914066 00000 n 
+0000914186 00000 n 
+0000914306 00000 n 
+0000913709 00000 n 
+0000918471 00000 n 
+0000916934 00000 n 
+0000914564 00000 n 
+0000917814 00000 n 
+0000917874 00000 n 
+0000917108 00000 n 
+0000917993 00000 n 
+0000917277 00000 n 
+0000917446 00000 n 
+0000918113 00000 n 
+0000918232 00000 n 
+0000918352 00000 n 
+0000917636 00000 n 
+0000922776 00000 n 
+0000921337 00000 n 
+0000918610 00000 n 
+0000922238 00000 n 
+0000922298 00000 n 
+0000922417 00000 n 
+0000921511 00000 n 
+0000922537 00000 n 
+0000921694 00000 n 
+0000922657 00000 n 
+0000921877 00000 n 
+0000922060 00000 n 
+0000926903 00000 n 
+0000925651 00000 n 
+0000922915 00000 n 
+0000926545 00000 n 
+0000926605 00000 n 
+0000925825 00000 n 
+0000926724 00000 n 
+0000926006 00000 n 
+0000926843 00000 n 
+0000926187 00000 n 
+0000926367 00000 n 
+0003702437 00000 n 
+0000931408 00000 n 
+0000930077 00000 n 
+0000927079 00000 n 
+0000930989 00000 n 
+0000931109 00000 n 
+0000930251 00000 n 
+0000931229 00000 n 
+0000930431 00000 n 
+0000931348 00000 n 
+0000930621 00000 n 
+0000930811 00000 n 
+0000935805 00000 n 
+0000934279 00000 n 
+0000931584 00000 n 
+0000935326 00000 n 
+0000935446 00000 n 
+0000934462 00000 n 
+0000935566 00000 n 
+0000934635 00000 n 
+0000934804 00000 n 
+0000935686 00000 n 
+0000934977 00000 n 
+0000935148 00000 n 
+0000940725 00000 n 
+0000939246 00000 n 
+0000935957 00000 n 
+0000940307 00000 n 
+0000940367 00000 n 
+0000939429 00000 n 
+0000939600 00000 n 
+0000940486 00000 n 
+0000939773 00000 n 
+0000939944 00000 n 
+0000940606 00000 n 
+0000940129 00000 n 
+0000945460 00000 n 
+0000944195 00000 n 
+0000940941 00000 n 
+0000944918 00000 n 
+0000944978 00000 n 
+0000945097 00000 n 
+0000945222 00000 n 
+0000944360 00000 n 
+0000944550 00000 n 
+0000945341 00000 n 
+0000944740 00000 n 
+0000950307 00000 n 
+0000948797 00000 n 
+0000945661 00000 n 
+0000949938 00000 n 
+0000949998 00000 n 
+0000948980 00000 n 
+0000949175 00000 n 
+0000950123 00000 n 
+0000949367 00000 n 
+0000949585 00000 n 
+0000950247 00000 n 
+0000949760 00000 n 
+0000955238 00000 n 
+0000953785 00000 n 
+0000950458 00000 n 
+0000954690 00000 n 
+0000953959 00000 n 
+0000954149 00000 n 
+0000954338 00000 n 
+0000954816 00000 n 
+0000954935 00000 n 
+0000955053 00000 n 
+0000955178 00000 n 
+0000954512 00000 n 
+0003702563 00000 n 
+0000959219 00000 n 
+0000958157 00000 n 
+0000955389 00000 n 
+0000958482 00000 n 
+0000958542 00000 n 
+0000958662 00000 n 
+0000958788 00000 n 
+0000958908 00000 n 
+0000959033 00000 n 
+0000959159 00000 n 
+0000958304 00000 n 
+0000962241 00000 n 
+0000961478 00000 n 
+0000959358 00000 n 
+0000961803 00000 n 
+0000961929 00000 n 
+0000962055 00000 n 
+0000962181 00000 n 
+0000961625 00000 n 
+0000965304 00000 n 
+0000992030 00000 n 
+0000965031 00000 n 
+0000962380 00000 n 
+0000991666 00000 n 
+0000991792 00000 n 
+0000988556 00000 n 
+0000991970 00000 n 
+0000988748 00000 n 
+0000988975 00000 n 
+0000989182 00000 n 
+0000989388 00000 n 
+0000989616 00000 n 
+0000989816 00000 n 
+0000990044 00000 n 
+0000990244 00000 n 
+0000990441 00000 n 
+0000990667 00000 n 
+0000990864 00000 n 
+0000991092 00000 n 
+0000991291 00000 n 
+0000991488 00000 n 
+0000966429 00000 n 
+0000966549 00000 n 
+0000966597 00000 n 
+0000966956 00000 n 
+0000966978 00000 n 
+0000967197 00000 n 
+0000988532 00000 n 
+0001007127 00000 n 
+0001007247 00000 n 
+0001007373 00000 n 
+0001009749 00000 n 
+0001009869 00000 n 
+0001003611 00000 n 
+0000995370 00000 n 
+0000992211 00000 n 
+0001003312 00000 n 
+0000995832 00000 n 
+0000996060 00000 n 
+0000996260 00000 n 
+0000996487 00000 n 
+0000996686 00000 n 
+0000996882 00000 n 
+0000997110 00000 n 
+0000997307 00000 n 
+0000997514 00000 n 
+0000997740 00000 n 
+0000997923 00000 n 
+0000998111 00000 n 
+0000998317 00000 n 
+0000998545 00000 n 
+0000998736 00000 n 
+0000998944 00000 n 
+0000999172 00000 n 
+0000999370 00000 n 
+0000999578 00000 n 
+0000999806 00000 n 
+0000999992 00000 n 
+0001000200 00000 n 
+0001000427 00000 n 
+0001000621 00000 n 
+0001003372 00000 n 
+0001000828 00000 n 
+0001001023 00000 n 
+0001001251 00000 n 
+0001003431 00000 n 
+0001001444 00000 n 
+0001001639 00000 n 
+0001001867 00000 n 
+0001003491 00000 n 
+0001002062 00000 n 
+0001002289 00000 n 
+0001002517 00000 n 
+0001003551 00000 n 
+0001002712 00000 n 
+0001002940 00000 n 
+0001003134 00000 n 
+0001009989 00000 n 
+0001012669 00000 n 
+0001012789 00000 n 
+0001012909 00000 n 
+0001013029 00000 n 
+0001015585 00000 n 
+0001015705 00000 n 
+0001015824 00000 n 
+0001016004 00000 n 
+0001007433 00000 n 
+0001006214 00000 n 
+0001003778 00000 n 
+0001006948 00000 n 
+0001007008 00000 n 
+0001006379 00000 n 
+0001006574 00000 n 
+0001007067 00000 n 
+0001007187 00000 n 
+0001007313 00000 n 
+0001006770 00000 n 
+0001010049 00000 n 
+0001009305 00000 n 
+0001007585 00000 n 
+0001009630 00000 n 
+0001009690 00000 n 
+0001009809 00000 n 
+0001009929 00000 n 
+0001009452 00000 n 
+0003702689 00000 n 
+0001013088 00000 n 
+0001012225 00000 n 
+0001010162 00000 n 
+0001012550 00000 n 
+0001012610 00000 n 
+0001012729 00000 n 
+0001012849 00000 n 
+0001012969 00000 n 
+0001012372 00000 n 
+0001016124 00000 n 
+0001015141 00000 n 
+0001013214 00000 n 
+0001015466 00000 n 
+0001015526 00000 n 
+0001015645 00000 n 
+0001015764 00000 n 
+0001015884 00000 n 
+0001015944 00000 n 
+0001016064 00000 n 
+0001015288 00000 n 
+0001025183 00000 n 
+0001019048 00000 n 
+0001016263 00000 n 
+0001024344 00000 n 
+0001024523 00000 n 
+0001024583 00000 n 
+0001019393 00000 n 
+0001019622 00000 n 
+0001019830 00000 n 
+0001024643 00000 n 
+0001020060 00000 n 
+0001024703 00000 n 
+0001020290 00000 n 
+0001020520 00000 n 
+0001024763 00000 n 
+0001020717 00000 n 
+0001020947 00000 n 
+0001021144 00000 n 
+0001021352 00000 n 
+0001024823 00000 n 
+0001021549 00000 n 
+0001021778 00000 n 
+0001024883 00000 n 
+0001021985 00000 n 
+0001022215 00000 n 
+0001024943 00000 n 
+0001022422 00000 n 
+0001022652 00000 n 
+0001025003 00000 n 
+0001022858 00000 n 
+0001023088 00000 n 
+0001025063 00000 n 
+0001023296 00000 n 
+0001023525 00000 n 
+0001025123 00000 n 
+0001023732 00000 n 
+0001023960 00000 n 
+0001024166 00000 n 
+0001109258 00000 n 
+0001036050 00000 n 
+0001028009 00000 n 
+0001025378 00000 n 
+0001034972 00000 n 
+0001035032 00000 n 
+0001028417 00000 n 
+0001028647 00000 n 
+0001035092 00000 n 
+0001028855 00000 n 
+0001029085 00000 n 
+0001035152 00000 n 
+0001029293 00000 n 
+0001029523 00000 n 
+0001035212 00000 n 
+0001029731 00000 n 
+0001029961 00000 n 
+0001035271 00000 n 
+0001030169 00000 n 
+0001030399 00000 n 
+0001035331 00000 n 
+0001030607 00000 n 
+0001030837 00000 n 
+0001035391 00000 n 
+0001031044 00000 n 
+0001031274 00000 n 
+0001035451 00000 n 
+0001031482 00000 n 
+0001031712 00000 n 
+0001035510 00000 n 
+0001031920 00000 n 
+0001032150 00000 n 
+0001035570 00000 n 
+0001032358 00000 n 
+0001032588 00000 n 
+0001035630 00000 n 
+0001032796 00000 n 
+0001033024 00000 n 
+0001033219 00000 n 
+0001035690 00000 n 
+0001033416 00000 n 
+0001035750 00000 n 
+0001033646 00000 n 
+0001035810 00000 n 
+0001033876 00000 n 
+0001035870 00000 n 
+0001034106 00000 n 
+0001035930 00000 n 
+0001034334 00000 n 
+0001035990 00000 n 
+0001034564 00000 n 
+0001034794 00000 n 
+0001044259 00000 n 
+0001038583 00000 n 
+0001036202 00000 n 
+0001043302 00000 n 
+0001043362 00000 n 
+0001038901 00000 n 
+0001043422 00000 n 
+0001039129 00000 n 
+0001043481 00000 n 
+0001039359 00000 n 
+0001043541 00000 n 
+0001039589 00000 n 
+0001043601 00000 n 
+0001039819 00000 n 
+0001043661 00000 n 
+0001040049 00000 n 
+0001043721 00000 n 
+0001040279 00000 n 
+0001043781 00000 n 
+0001040507 00000 n 
+0001043841 00000 n 
+0001040737 00000 n 
+0001043901 00000 n 
+0001040967 00000 n 
+0001043961 00000 n 
+0001041197 00000 n 
+0001044021 00000 n 
+0001041425 00000 n 
+0001044080 00000 n 
+0001041655 00000 n 
+0001044140 00000 n 
+0001041884 00000 n 
+0001042080 00000 n 
+0001042308 00000 n 
+0001044200 00000 n 
+0001042504 00000 n 
+0001042700 00000 n 
+0001042928 00000 n 
+0001043124 00000 n 
+0001056551 00000 n 
+0001047236 00000 n 
+0001044411 00000 n 
+0001055652 00000 n 
+0001055712 00000 n 
+0001047716 00000 n 
+0001047912 00000 n 
+0001055771 00000 n 
+0001048140 00000 n 
+0001048337 00000 n 
+0001048566 00000 n 
+0001055831 00000 n 
+0001048763 00000 n 
+0001048960 00000 n 
+0001055891 00000 n 
+0001049189 00000 n 
+0001049395 00000 n 
+0001049592 00000 n 
+0001055951 00000 n 
+0001049821 00000 n 
+0001050018 00000 n 
+0001050247 00000 n 
+0001056011 00000 n 
+0001050443 00000 n 
+0001050640 00000 n 
+0001056071 00000 n 
+0001050869 00000 n 
+0001051075 00000 n 
+0001051272 00000 n 
+0001056131 00000 n 
+0001051500 00000 n 
+0001051697 00000 n 
+0001051926 00000 n 
+0001056191 00000 n 
+0001052121 00000 n 
+0001052318 00000 n 
+0001056251 00000 n 
+0001052547 00000 n 
+0001052753 00000 n 
+0001052950 00000 n 
+0001056311 00000 n 
+0001053178 00000 n 
+0001053375 00000 n 
+0001053603 00000 n 
+0001056371 00000 n 
+0001053800 00000 n 
+0001053997 00000 n 
+0001056431 00000 n 
+0001054225 00000 n 
+0001054431 00000 n 
+0001054628 00000 n 
+0001056491 00000 n 
+0001054857 00000 n 
+0001055052 00000 n 
+0001055279 00000 n 
+0001055474 00000 n 
+0003702815 00000 n 
+0001068881 00000 n 
+0001060067 00000 n 
+0001056703 00000 n 
+0001068401 00000 n 
+0001068461 00000 n 
+0001060538 00000 n 
+0001060735 00000 n 
+0001068521 00000 n 
+0001060964 00000 n 
+0001061170 00000 n 
+0001061367 00000 n 
+0001068581 00000 n 
+0001061596 00000 n 
+0001061793 00000 n 
+0001068641 00000 n 
+0001062022 00000 n 
+0001062219 00000 n 
+0001068701 00000 n 
+0001062449 00000 n 
+0001062646 00000 n 
+0001068761 00000 n 
+0001062875 00000 n 
+0001063072 00000 n 
+0001068821 00000 n 
+0001063302 00000 n 
+0001063507 00000 n 
+0001063737 00000 n 
+0001063942 00000 n 
+0001064172 00000 n 
+0001064377 00000 n 
+0001064607 00000 n 
+0001064812 00000 n 
+0001065042 00000 n 
+0001065247 00000 n 
+0001065477 00000 n 
+0001065681 00000 n 
+0001065889 00000 n 
+0001066118 00000 n 
+0001066326 00000 n 
+0001066532 00000 n 
+0001066740 00000 n 
+0001066968 00000 n 
+0001067176 00000 n 
+0001067406 00000 n 
+0001067603 00000 n 
+0001067800 00000 n 
+0001068028 00000 n 
+0001068223 00000 n 
+0001109438 00000 n 
+0001109558 00000 n 
+0001109677 00000 n 
+0001109797 00000 n 
+0001109917 00000 n 
+0001112412 00000 n 
+0001112532 00000 n 
+0001155160 00000 n 
+0001079109 00000 n 
+0001072149 00000 n 
+0001069033 00000 n 
+0001079049 00000 n 
+0001072566 00000 n 
+0001072795 00000 n 
+0001072991 00000 n 
+0001073220 00000 n 
+0001073416 00000 n 
+0001073624 00000 n 
+0001073854 00000 n 
+0001074051 00000 n 
+0001074248 00000 n 
+0001074478 00000 n 
+0001074675 00000 n 
+0001074871 00000 n 
+0001075100 00000 n 
+0001075296 00000 n 
+0001075526 00000 n 
+0001075723 00000 n 
+0001075953 00000 n 
+0001076150 00000 n 
+0001076346 00000 n 
+0001076576 00000 n 
+0001076773 00000 n 
+0001077002 00000 n 
+0001077199 00000 n 
+0001077396 00000 n 
+0001077626 00000 n 
+0001077822 00000 n 
+0001078052 00000 n 
+0001078249 00000 n 
+0001078445 00000 n 
+0001078675 00000 n 
+0001078871 00000 n 
+0001155280 00000 n 
+0001112651 00000 n 
+0001112771 00000 n 
+0001112891 00000 n 
+0001113010 00000 n 
+0001113130 00000 n 
+0001113250 00000 n 
+0001113370 00000 n 
+0001113490 00000 n 
+0001113610 00000 n 
+0001116155 00000 n 
+0001116274 00000 n 
+0001091426 00000 n 
+0001082903 00000 n 
+0001079248 00000 n 
+0001091366 00000 n 
+0001083392 00000 n 
+0001083622 00000 n 
+0001083819 00000 n 
+0001084015 00000 n 
+0001084245 00000 n 
+0001084441 00000 n 
+0001084671 00000 n 
+0001084868 00000 n 
+0001085065 00000 n 
+0001085295 00000 n 
+0001085491 00000 n 
+0001085688 00000 n 
+0001085885 00000 n 
+0001086113 00000 n 
+0001086308 00000 n 
+0001086503 00000 n 
+0001086700 00000 n 
+0001086930 00000 n 
+0001087127 00000 n 
+0001087324 00000 n 
+0001087521 00000 n 
+0001087751 00000 n 
+0001087948 00000 n 
+0001088144 00000 n 
+0001088341 00000 n 
+0001088537 00000 n 
+0001088734 00000 n 
+0001088931 00000 n 
+0001089161 00000 n 
+0001089358 00000 n 
+0001089555 00000 n 
+0001089751 00000 n 
+0001089978 00000 n 
+0001090175 00000 n 
+0001090372 00000 n 
+0001090569 00000 n 
+0001090798 00000 n 
+0001090993 00000 n 
+0001091188 00000 n 
+0001116394 00000 n 
+0001116514 00000 n 
+0001116634 00000 n 
+0001116754 00000 n 
+0001116874 00000 n 
+0001116994 00000 n 
+0001117114 00000 n 
+0001117234 00000 n 
+0001119746 00000 n 
+0001119866 00000 n 
+0001104528 00000 n 
+0001095252 00000 n 
+0001091580 00000 n 
+0001104468 00000 n 
+0001095768 00000 n 
+0001095973 00000 n 
+0001096178 00000 n 
+0001096372 00000 n 
+0001096566 00000 n 
+0001096796 00000 n 
+0001097002 00000 n 
+0001097208 00000 n 
+0001097401 00000 n 
+0001097594 00000 n 
+0001097823 00000 n 
+0001098029 00000 n 
+0001098235 00000 n 
+0001098429 00000 n 
+0001098623 00000 n 
+0001098853 00000 n 
+0001099059 00000 n 
+0001099265 00000 n 
+0001099459 00000 n 
+0001099653 00000 n 
+0001099883 00000 n 
+0001100089 00000 n 
+0001100295 00000 n 
+0001100489 00000 n 
+0001100683 00000 n 
+0001100913 00000 n 
+0001101118 00000 n 
+0001101323 00000 n 
+0001101516 00000 n 
+0001101709 00000 n 
+0001101938 00000 n 
+0001102144 00000 n 
+0001102374 00000 n 
+0001102580 00000 n 
+0001102786 00000 n 
+0001103016 00000 n 
+0001103222 00000 n 
+0001103430 00000 n 
+0001103660 00000 n 
+0001103867 00000 n 
+0001104095 00000 n 
+0001104290 00000 n 
+0001119992 00000 n 
+0001120112 00000 n 
+0001120232 00000 n 
+0001120352 00000 n 
+0001120472 00000 n 
+0001120592 00000 n 
+0001120712 00000 n 
+0001124433 00000 n 
+0001124552 00000 n 
+0001124672 00000 n 
+0001109976 00000 n 
+0001107362 00000 n 
+0001104709 00000 n 
+0001109018 00000 n 
+0001107563 00000 n 
+0001107769 00000 n 
+0001107977 00000 n 
+0001108207 00000 n 
+0001108413 00000 n 
+0001108643 00000 n 
+0001109078 00000 n 
+0001109138 00000 n 
+0001109198 00000 n 
+0001109318 00000 n 
+0001109378 00000 n 
+0001109498 00000 n 
+0001109618 00000 n 
+0001109737 00000 n 
+0001109857 00000 n 
+0001108840 00000 n 
+0001124792 00000 n 
+0001154920 00000 n 
+0001113668 00000 n 
+0001111968 00000 n 
+0001110142 00000 n 
+0001112293 00000 n 
+0001112353 00000 n 
+0001112472 00000 n 
+0001112591 00000 n 
+0001112711 00000 n 
+0001112831 00000 n 
+0001112951 00000 n 
+0001113070 00000 n 
+0001113190 00000 n 
+0001113310 00000 n 
+0001113430 00000 n 
+0001113550 00000 n 
+0001112115 00000 n 
+0003702941 00000 n 
+0001117293 00000 n 
+0001115711 00000 n 
+0001113807 00000 n 
+0001116036 00000 n 
+0001116096 00000 n 
+0001116214 00000 n 
+0001116334 00000 n 
+0001116454 00000 n 
+0001116574 00000 n 
+0001116694 00000 n 
+0001116814 00000 n 
+0001116934 00000 n 
+0001117054 00000 n 
+0001117174 00000 n 
+0001115858 00000 n 
+0001120771 00000 n 
+0001119302 00000 n 
+0001117432 00000 n 
+0001119627 00000 n 
+0001119687 00000 n 
+0001119806 00000 n 
+0001119932 00000 n 
+0001120052 00000 n 
+0001120172 00000 n 
+0001120292 00000 n 
+0001120412 00000 n 
+0001120532 00000 n 
+0001120652 00000 n 
+0001119449 00000 n 
+0001124912 00000 n 
+0001123989 00000 n 
+0001120910 00000 n 
+0001124314 00000 n 
+0001124374 00000 n 
+0001124492 00000 n 
+0001124612 00000 n 
+0001124732 00000 n 
+0001124852 00000 n 
+0001124136 00000 n 
+0001128538 00000 n 
+0001128153 00000 n 
+0001125088 00000 n 
+0001128478 00000 n 
+0001128300 00000 n 
+0001130949 00000 n 
+0001155699 00000 n 
+0001130757 00000 n 
+0001128701 00000 n 
+0001154860 00000 n 
+0001154980 00000 n 
+0001155100 00000 n 
+0001155220 00000 n 
+0001155340 00000 n 
+0001155519 00000 n 
+0001155579 00000 n 
+0001153627 00000 n 
+0001153852 00000 n 
+0001154044 00000 n 
+0001154268 00000 n 
+0001155639 00000 n 
+0001154459 00000 n 
+0001154682 00000 n 
+0001131755 00000 n 
+0001131875 00000 n 
+0001131923 00000 n 
+0001132278 00000 n 
+0001132300 00000 n 
+0001132519 00000 n 
+0001153603 00000 n 
+0001187031 00000 n 
+0001165613 00000 n 
+0001158834 00000 n 
+0001155880 00000 n 
+0001164954 00000 n 
+0001165014 00000 n 
+0001159215 00000 n 
+0001159407 00000 n 
+0001159632 00000 n 
+0001165074 00000 n 
+0001159824 00000 n 
+0001160032 00000 n 
+0001160257 00000 n 
+0001160482 00000 n 
+0001165134 00000 n 
+0001160672 00000 n 
+0001165194 00000 n 
+0001160897 00000 n 
+0001161121 00000 n 
+0001161313 00000 n 
+0001161538 00000 n 
+0001161763 00000 n 
+0001161988 00000 n 
+0001162213 00000 n 
+0001165254 00000 n 
+0001162438 00000 n 
+0001162663 00000 n 
+0001162870 00000 n 
+0001165314 00000 n 
+0001163062 00000 n 
+0001163270 00000 n 
+0001165373 00000 n 
+0001163495 00000 n 
+0001163703 00000 n 
+0001165433 00000 n 
+0001163928 00000 n 
+0001165493 00000 n 
+0001165553 00000 n 
+0001164152 00000 n 
+0001164360 00000 n 
+0001164585 00000 n 
+0001164776 00000 n 
+0003703067 00000 n 
+0001190019 00000 n 
+0001190139 00000 n 
+0001190259 00000 n 
+0001190385 00000 n 
+0001190505 00000 n 
+0001190625 00000 n 
+0001176528 00000 n 
+0001168888 00000 n 
+0001165740 00000 n 
+0001175930 00000 n 
+0001175990 00000 n 
+0001169314 00000 n 
+0001176049 00000 n 
+0001169539 00000 n 
+0001176109 00000 n 
+0001169764 00000 n 
+0001169956 00000 n 
+0001176168 00000 n 
+0001170181 00000 n 
+0001170373 00000 n 
+0001176228 00000 n 
+0001170598 00000 n 
+0001170790 00000 n 
+0001171015 00000 n 
+0001171215 00000 n 
+0001176288 00000 n 
+0001171415 00000 n 
+0001171607 00000 n 
+0001171832 00000 n 
+0001176348 00000 n 
+0001172032 00000 n 
+0001172224 00000 n 
+0001172449 00000 n 
+0001176408 00000 n 
+0001172649 00000 n 
+0001172873 00000 n 
+0001173098 00000 n 
+0001176468 00000 n 
+0001173323 00000 n 
+0001173514 00000 n 
+0001173738 00000 n 
+0001173929 00000 n 
+0001174121 00000 n 
+0001174346 00000 n 
+0001174538 00000 n 
+0001174763 00000 n 
+0001174954 00000 n 
+0001175146 00000 n 
+0001175370 00000 n 
+0001175561 00000 n 
+0001175752 00000 n 
+0001190751 00000 n 
+0001193588 00000 n 
+0001193714 00000 n 
+0001193899 00000 n 
+0001194019 00000 n 
+0001194145 00000 n 
+0001194265 00000 n 
+0001183615 00000 n 
+0001179899 00000 n 
+0001176669 00000 n 
+0001183436 00000 n 
+0001180181 00000 n 
+0001180406 00000 n 
+0001180606 00000 n 
+0001180831 00000 n 
+0001181023 00000 n 
+0001183496 00000 n 
+0001181215 00000 n 
+0001181440 00000 n 
+0001181632 00000 n 
+0001181824 00000 n 
+0001182049 00000 n 
+0001182249 00000 n 
+0001182449 00000 n 
+0001182641 00000 n 
+0001182866 00000 n 
+0001183555 00000 n 
+0001183066 00000 n 
+0001183258 00000 n 
+0001194385 00000 n 
+0001194505 00000 n 
+0001194631 00000 n 
+0001222087 00000 n 
+0001222207 00000 n 
+0001187151 00000 n 
+0001186587 00000 n 
+0001183844 00000 n 
+0001186912 00000 n 
+0001186972 00000 n 
+0001187091 00000 n 
+0001186734 00000 n 
+0001190817 00000 n 
+0001189575 00000 n 
+0001187327 00000 n 
+0001189900 00000 n 
+0001189960 00000 n 
+0001190079 00000 n 
+0001190199 00000 n 
+0001190325 00000 n 
+0001190445 00000 n 
+0001190565 00000 n 
+0001190691 00000 n 
+0001189722 00000 n 
+0001194690 00000 n 
+0001193144 00000 n 
+0001191018 00000 n 
+0001193469 00000 n 
+0001193529 00000 n 
+0001193654 00000 n 
+0001193779 00000 n 
+0001193839 00000 n 
+0001193959 00000 n 
+0001194085 00000 n 
+0001194205 00000 n 
+0001194325 00000 n 
+0001194445 00000 n 
+0001194571 00000 n 
+0001193291 00000 n 
+0001197323 00000 n 
+0001222744 00000 n 
+0001197104 00000 n 
+0001194840 00000 n 
+0001221968 00000 n 
+0001222028 00000 n 
+0001222147 00000 n 
+0001222267 00000 n 
+0001222446 00000 n 
+0001220056 00000 n 
+0001222506 00000 n 
+0001222565 00000 n 
+0001220274 00000 n 
+0001222624 00000 n 
+0001220507 00000 n 
+0001220740 00000 n 
+0001220932 00000 n 
+0001221165 00000 n 
+0001222684 00000 n 
+0001221357 00000 n 
+0001221590 00000 n 
+0001221790 00000 n 
+0003703193 00000 n 
+0001198112 00000 n 
+0001198232 00000 n 
+0001198280 00000 n 
+0001198635 00000 n 
+0001198657 00000 n 
+0001198876 00000 n 
+0001220032 00000 n 
+0001246977 00000 n 
+0001233966 00000 n 
+0001226167 00000 n 
+0001222967 00000 n 
+0001233128 00000 n 
+0001233188 00000 n 
+0001226575 00000 n 
+0001226808 00000 n 
+0001233247 00000 n 
+0001227008 00000 n 
+0001233307 00000 n 
+0001227240 00000 n 
+0001227440 00000 n 
+0001227673 00000 n 
+0001233366 00000 n 
+0001227873 00000 n 
+0001228081 00000 n 
+0001233426 00000 n 
+0001228314 00000 n 
+0001228546 00000 n 
+0001233486 00000 n 
+0001228745 00000 n 
+0001233546 00000 n 
+0001228978 00000 n 
+0001229211 00000 n 
+0001229444 00000 n 
+0001229636 00000 n 
+0001229869 00000 n 
+0001230061 00000 n 
+0001230294 00000 n 
+0001233606 00000 n 
+0001230494 00000 n 
+0001230727 00000 n 
+0001233666 00000 n 
+0001230927 00000 n 
+0001233726 00000 n 
+0001231158 00000 n 
+0001231391 00000 n 
+0001231610 00000 n 
+0001233786 00000 n 
+0001231829 00000 n 
+0001232062 00000 n 
+0001233846 00000 n 
+0001232281 00000 n 
+0001233906 00000 n 
+0001232513 00000 n 
+0001232719 00000 n 
+0001232950 00000 n 
+0001250084 00000 n 
+0001250204 00000 n 
+0001250329 00000 n 
+0001243301 00000 n 
+0001236769 00000 n 
+0001234106 00000 n 
+0001242523 00000 n 
+0001242583 00000 n 
+0001237132 00000 n 
+0001237340 00000 n 
+0001242642 00000 n 
+0001237573 00000 n 
+0001237780 00000 n 
+0001242702 00000 n 
+0001238012 00000 n 
+0001238220 00000 n 
+0001242761 00000 n 
+0001238453 00000 n 
+0001238686 00000 n 
+0001238886 00000 n 
+0001239118 00000 n 
+0001242821 00000 n 
+0001242881 00000 n 
+0001239325 00000 n 
+0001239533 00000 n 
+0001239766 00000 n 
+0001242941 00000 n 
+0001239966 00000 n 
+0001243001 00000 n 
+0001240198 00000 n 
+0001243061 00000 n 
+0001240430 00000 n 
+0001240630 00000 n 
+0001240862 00000 n 
+0001243121 00000 n 
+0001243181 00000 n 
+0001241084 00000 n 
+0001241317 00000 n 
+0001243241 00000 n 
+0001241513 00000 n 
+0001241746 00000 n 
+0001241945 00000 n 
+0001242145 00000 n 
+0001242345 00000 n 
+0001250449 00000 n 
+0001250633 00000 n 
+0001247097 00000 n 
+0001246063 00000 n 
+0001243428 00000 n 
+0001246798 00000 n 
+0001246858 00000 n 
+0001246228 00000 n 
+0001246428 00000 n 
+0001246917 00000 n 
+0001247037 00000 n 
+0001246620 00000 n 
+0001250871 00000 n 
+0001249640 00000 n 
+0001247273 00000 n 
+0001249965 00000 n 
+0001250025 00000 n 
+0001250144 00000 n 
+0001250270 00000 n 
+0001250389 00000 n 
+0001250514 00000 n 
+0001250573 00000 n 
+0001250693 00000 n 
+0001249787 00000 n 
+0001258196 00000 n 
+0001253592 00000 n 
+0001251059 00000 n 
+0001257361 00000 n 
+0001257421 00000 n 
+0001257480 00000 n 
+0001253865 00000 n 
+0001257539 00000 n 
+0001254117 00000 n 
+0001257599 00000 n 
+0001254369 00000 n 
+0001257659 00000 n 
+0001254620 00000 n 
+0001257719 00000 n 
+0001254872 00000 n 
+0001255064 00000 n 
+0001257779 00000 n 
+0001255316 00000 n 
+0001255507 00000 n 
+0001257838 00000 n 
+0001255758 00000 n 
+0001257898 00000 n 
+0001256010 00000 n 
+0001257958 00000 n 
+0001256262 00000 n 
+0001258018 00000 n 
+0001256514 00000 n 
+0001258078 00000 n 
+0001256766 00000 n 
+0001256984 00000 n 
+0001257183 00000 n 
+0001261083 00000 n 
+0001289160 00000 n 
+0001260756 00000 n 
+0001258349 00000 n 
+0001288382 00000 n 
+0001288500 00000 n 
+0001283768 00000 n 
+0001283993 00000 n 
+0001284250 00000 n 
+0001284507 00000 n 
+0001288560 00000 n 
+0001288620 00000 n 
+0001284763 00000 n 
+0001284988 00000 n 
+0001285178 00000 n 
+0001285403 00000 n 
+0001288680 00000 n 
+0001285595 00000 n 
+0001288740 00000 n 
+0001285820 00000 n 
+0001286010 00000 n 
+0001286233 00000 n 
+0001288800 00000 n 
+0001286423 00000 n 
+0001286631 00000 n 
+0001288860 00000 n 
+0001286856 00000 n 
+0001287081 00000 n 
+0001288920 00000 n 
+0001287306 00000 n 
+0001288980 00000 n 
+0001287531 00000 n 
+0001289040 00000 n 
+0001287756 00000 n 
+0001289100 00000 n 
+0001287981 00000 n 
+0001288204 00000 n 
+0003703319 00000 n 
+0001261921 00000 n 
+0001262041 00000 n 
+0001262089 00000 n 
+0001262444 00000 n 
+0001262466 00000 n 
+0001262685 00000 n 
+0001283744 00000 n 
+0001329958 00000 n 
+0001330078 00000 n 
+0001330144 00000 n 
+0001330209 00000 n 
+0001330335 00000 n 
+0001298453 00000 n 
+0001292291 00000 n 
+0001289342 00000 n 
+0001297733 00000 n 
+0001292645 00000 n 
+0001292870 00000 n 
+0001297793 00000 n 
+0001293060 00000 n 
+0001297853 00000 n 
+0001293285 00000 n 
+0001293493 00000 n 
+0001297913 00000 n 
+0001293718 00000 n 
+0001293924 00000 n 
+0001294147 00000 n 
+0001294372 00000 n 
+0001294596 00000 n 
+0001294821 00000 n 
+0001297973 00000 n 
+0001295013 00000 n 
+0001298033 00000 n 
+0001295237 00000 n 
+0001295462 00000 n 
+0001298093 00000 n 
+0001298153 00000 n 
+0001295654 00000 n 
+0001295860 00000 n 
+0001296083 00000 n 
+0001298213 00000 n 
+0001296275 00000 n 
+0001298273 00000 n 
+0001296500 00000 n 
+0001298333 00000 n 
+0001296723 00000 n 
+0001296915 00000 n 
+0001298393 00000 n 
+0001297139 00000 n 
+0001297331 00000 n 
+0001297555 00000 n 
+0001330515 00000 n 
+0001330635 00000 n 
+0001330755 00000 n 
+0001333421 00000 n 
+0001313894 00000 n 
+0001301573 00000 n 
+0001298594 00000 n 
+0001313774 00000 n 
+0001313834 00000 n 
+0001302224 00000 n 
+0001302416 00000 n 
+0001302641 00000 n 
+0001302841 00000 n 
+0001303041 00000 n 
+0001303232 00000 n 
+0001303456 00000 n 
+0001303645 00000 n 
+0001303833 00000 n 
+0001304025 00000 n 
+0001304250 00000 n 
+0001304450 00000 n 
+0001304642 00000 n 
+0001304867 00000 n 
+0001305067 00000 n 
+0001305258 00000 n 
+0001305480 00000 n 
+0001305679 00000 n 
+0001305878 00000 n 
+0001306070 00000 n 
+0001306293 00000 n 
+0001306483 00000 n 
+0001306673 00000 n 
+0001306865 00000 n 
+0001307088 00000 n 
+0001307288 00000 n 
+0001307480 00000 n 
+0001307703 00000 n 
+0001307903 00000 n 
+0001308095 00000 n 
+0001308318 00000 n 
+0001308518 00000 n 
+0001308718 00000 n 
+0001308910 00000 n 
+0001309133 00000 n 
+0001309333 00000 n 
+0001309525 00000 n 
+0001309748 00000 n 
+0001309948 00000 n 
+0001310137 00000 n 
+0001310359 00000 n 
+0001310555 00000 n 
+0001310751 00000 n 
+0001310943 00000 n 
+0001311168 00000 n 
+0001311358 00000 n 
+0001311548 00000 n 
+0001311740 00000 n 
+0001311965 00000 n 
+0001312164 00000 n 
+0001312356 00000 n 
+0001312581 00000 n 
+0001312781 00000 n 
+0001312973 00000 n 
+0001313198 00000 n 
+0001313397 00000 n 
+0001313596 00000 n 
+0001333601 00000 n 
+0001333719 00000 n 
+0001333839 00000 n 
+0001333959 00000 n 
+0001334078 00000 n 
+0001334198 00000 n 
+0001334318 00000 n 
+0001334438 00000 n 
+0001334558 00000 n 
+0001336703 00000 n 
+0001336822 00000 n 
+0001336942 00000 n 
+0001337062 00000 n 
+0001337182 00000 n 
+0001337302 00000 n 
+0001337422 00000 n 
+0001323834 00000 n 
+0001317369 00000 n 
+0001314034 00000 n 
+0001323654 00000 n 
+0001317768 00000 n 
+0001317960 00000 n 
+0001318185 00000 n 
+0001318384 00000 n 
+0001318576 00000 n 
+0001318801 00000 n 
+0001323714 00000 n 
+0001319001 00000 n 
+0001319226 00000 n 
+0001319417 00000 n 
+0001319609 00000 n 
+0001319834 00000 n 
+0001320025 00000 n 
+0001320217 00000 n 
+0001320409 00000 n 
+0001320632 00000 n 
+0001320822 00000 n 
+0001321012 00000 n 
+0001321204 00000 n 
+0001321429 00000 n 
+0001321619 00000 n 
+0001321809 00000 n 
+0001322034 00000 n 
+0001322225 00000 n 
+0001322417 00000 n 
+0001322642 00000 n 
+0001322834 00000 n 
+0001323059 00000 n 
+0001323774 00000 n 
+0001323284 00000 n 
+0001323476 00000 n 
+0001337542 00000 n 
+0001337661 00000 n 
+0001337781 00000 n 
+0001337901 00000 n 
+0001363258 00000 n 
+0001363378 00000 n 
+0001363498 00000 n 
+0001363618 00000 n 
+0001363738 00000 n 
+0001327260 00000 n 
+0001326875 00000 n 
+0001324049 00000 n 
+0001327200 00000 n 
+0001327022 00000 n 
+0001330875 00000 n 
+0001329514 00000 n 
+0001327422 00000 n 
+0001329839 00000 n 
+0001329899 00000 n 
+0001330018 00000 n 
+0001330275 00000 n 
+0001330395 00000 n 
+0001330455 00000 n 
+0001330575 00000 n 
+0001330695 00000 n 
+0001330815 00000 n 
+0001329661 00000 n 
+0001334617 00000 n 
+0001333036 00000 n 
+0001331076 00000 n 
+0001333361 00000 n 
+0001333481 00000 n 
+0001333541 00000 n 
+0001333660 00000 n 
+0001333779 00000 n 
+0001333899 00000 n 
+0001334018 00000 n 
+0001334138 00000 n 
+0001334258 00000 n 
+0001334378 00000 n 
+0001334498 00000 n 
+0001333183 00000 n 
+0003703445 00000 n 
+0001337960 00000 n 
+0001336259 00000 n 
+0001334818 00000 n 
+0001336584 00000 n 
+0001336644 00000 n 
+0001336763 00000 n 
+0001336882 00000 n 
+0001337002 00000 n 
+0001337122 00000 n 
+0001337242 00000 n 
+0001337362 00000 n 
+0001337482 00000 n 
+0001337601 00000 n 
+0001337721 00000 n 
+0001337841 00000 n 
+0001336406 00000 n 
+0001340072 00000 n 
+0001364157 00000 n 
+0001339907 00000 n 
+0001338086 00000 n 
+0001363139 00000 n 
+0001363199 00000 n 
+0001363318 00000 n 
+0001363438 00000 n 
+0001363558 00000 n 
+0001363678 00000 n 
+0001363798 00000 n 
+0001363977 00000 n 
+0001362513 00000 n 
+0001364037 00000 n 
+0001364097 00000 n 
+0001362731 00000 n 
+0001362961 00000 n 
+0001340861 00000 n 
+0001340981 00000 n 
+0001341029 00000 n 
+0001341378 00000 n 
+0001341400 00000 n 
+0001341619 00000 n 
+0001362489 00000 n 
+0001375460 00000 n 
+0001367474 00000 n 
+0001364325 00000 n 
+0001374441 00000 n 
+0001374501 00000 n 
+0001367882 00000 n 
+0001368115 00000 n 
+0001374561 00000 n 
+0001368307 00000 n 
+0001368540 00000 n 
+0001374621 00000 n 
+0001368740 00000 n 
+0001368971 00000 n 
+0001374680 00000 n 
+0001369169 00000 n 
+0001374740 00000 n 
+0001369402 00000 n 
+0001369602 00000 n 
+0001369835 00000 n 
+0001374800 00000 n 
+0001370035 00000 n 
+0001370242 00000 n 
+0001374860 00000 n 
+0001370474 00000 n 
+0001374920 00000 n 
+0001370707 00000 n 
+0001374980 00000 n 
+0001370940 00000 n 
+0001371173 00000 n 
+0001375040 00000 n 
+0001371365 00000 n 
+0001375100 00000 n 
+0001371598 00000 n 
+0001371831 00000 n 
+0001372049 00000 n 
+0001375160 00000 n 
+0001372268 00000 n 
+0001372499 00000 n 
+0001375220 00000 n 
+0001372717 00000 n 
+0001375280 00000 n 
+0001372949 00000 n 
+0001373157 00000 n 
+0001375340 00000 n 
+0001373390 00000 n 
+0001373598 00000 n 
+0001375400 00000 n 
+0001373831 00000 n 
+0001374064 00000 n 
+0001374263 00000 n 
+0001383386 00000 n 
+0001378320 00000 n 
+0001375600 00000 n 
+0001382847 00000 n 
+0001382907 00000 n 
+0001382967 00000 n 
+0001378638 00000 n 
+0001378846 00000 n 
+0001379079 00000 n 
+0001383027 00000 n 
+0001379279 00000 n 
+0001383087 00000 n 
+0001379512 00000 n 
+0001383146 00000 n 
+0001379745 00000 n 
+0001379945 00000 n 
+0001380178 00000 n 
+0001383206 00000 n 
+0001380402 00000 n 
+0001380635 00000 n 
+0001380825 00000 n 
+0001383266 00000 n 
+0001381017 00000 n 
+0001381250 00000 n 
+0001381449 00000 n 
+0001381682 00000 n 
+0001381882 00000 n 
+0001382082 00000 n 
+0001383326 00000 n 
+0001382282 00000 n 
+0001382481 00000 n 
+0001382669 00000 n 
+0001386438 00000 n 
+0001386558 00000 n 
+0001386684 00000 n 
+0001386869 00000 n 
+0001385993 00000 n 
+0001383536 00000 n 
+0001386318 00000 n 
+0001386378 00000 n 
+0001386498 00000 n 
+0001386624 00000 n 
+0001386750 00000 n 
+0001386140 00000 n 
+0001393964 00000 n 
+0001389358 00000 n 
+0001387045 00000 n 
+0001393127 00000 n 
+0001393245 00000 n 
+0001393305 00000 n 
+0001389631 00000 n 
+0001393365 00000 n 
+0001389882 00000 n 
+0001393425 00000 n 
+0001390134 00000 n 
+0001393485 00000 n 
+0001390386 00000 n 
+0001393545 00000 n 
+0001390638 00000 n 
+0001390830 00000 n 
+0001393605 00000 n 
+0001391082 00000 n 
+0001391274 00000 n 
+0001393665 00000 n 
+0001391524 00000 n 
+0001393724 00000 n 
+0001391776 00000 n 
+0001393784 00000 n 
+0001392028 00000 n 
+0001393844 00000 n 
+0001392279 00000 n 
+0001393904 00000 n 
+0001392531 00000 n 
+0001392749 00000 n 
+0001392949 00000 n 
+0003703571 00000 n 
+0001399103 00000 n 
+0001396776 00000 n 
+0001394117 00000 n 
+0001398447 00000 n 
+0001398625 00000 n 
+0001398684 00000 n 
+0001396977 00000 n 
+0001397214 00000 n 
+0001398743 00000 n 
+0001397447 00000 n 
+0001398803 00000 n 
+0001398863 00000 n 
+0001397683 00000 n 
+0001398923 00000 n 
+0001398983 00000 n 
+0001399043 00000 n 
+0001397892 00000 n 
+0001398077 00000 n 
+0001398269 00000 n 
+0001406943 00000 n 
+0001402106 00000 n 
+0001399269 00000 n 
+0001406046 00000 n 
+0001406225 00000 n 
+0001406285 00000 n 
+0001402397 00000 n 
+0001406345 00000 n 
+0001402622 00000 n 
+0001406405 00000 n 
+0001402848 00000 n 
+0001406465 00000 n 
+0001403073 00000 n 
+0001403299 00000 n 
+0001406524 00000 n 
+0001403492 00000 n 
+0001403718 00000 n 
+0001406584 00000 n 
+0001403910 00000 n 
+0001404115 00000 n 
+0001406644 00000 n 
+0001404338 00000 n 
+0001404546 00000 n 
+0001406704 00000 n 
+0001404772 00000 n 
+0001404997 00000 n 
+0001406764 00000 n 
+0001406824 00000 n 
+0001405223 00000 n 
+0001406883 00000 n 
+0001405449 00000 n 
+0001405672 00000 n 
+0001405868 00000 n 
+0001421166 00000 n 
+0001416941 00000 n 
+0001410149 00000 n 
+0001407111 00000 n 
+0001416103 00000 n 
+0001416163 00000 n 
+0001410530 00000 n 
+0001410756 00000 n 
+0001416223 00000 n 
+0001410955 00000 n 
+0001411181 00000 n 
+0001416283 00000 n 
+0001411373 00000 n 
+0001416343 00000 n 
+0001411599 00000 n 
+0001411825 00000 n 
+0001416403 00000 n 
+0001412018 00000 n 
+0001412244 00000 n 
+0001416463 00000 n 
+0001412436 00000 n 
+0001412661 00000 n 
+0001416523 00000 n 
+0001412854 00000 n 
+0001413080 00000 n 
+0001413271 00000 n 
+0001416583 00000 n 
+0001413447 00000 n 
+0001416643 00000 n 
+0001416703 00000 n 
+0001413672 00000 n 
+0001413865 00000 n 
+0001414090 00000 n 
+0001416763 00000 n 
+0001414283 00000 n 
+0001414509 00000 n 
+0001416822 00000 n 
+0001414702 00000 n 
+0001414928 00000 n 
+0001415120 00000 n 
+0001415313 00000 n 
+0001415539 00000 n 
+0001415732 00000 n 
+0001416881 00000 n 
+0001415925 00000 n 
+0001421346 00000 n 
+0001421466 00000 n 
+0001421885 00000 n 
+0001419325 00000 n 
+0001417094 00000 n 
+0001420926 00000 n 
+0001419526 00000 n 
+0001419751 00000 n 
+0001419943 00000 n 
+0001420169 00000 n 
+0001420362 00000 n 
+0001420555 00000 n 
+0001420986 00000 n 
+0001421046 00000 n 
+0001421106 00000 n 
+0001421226 00000 n 
+0001421286 00000 n 
+0001421406 00000 n 
+0001421526 00000 n 
+0001421585 00000 n 
+0001421645 00000 n 
+0001421705 00000 n 
+0001421765 00000 n 
+0001420748 00000 n 
+0001423901 00000 n 
+0001447482 00000 n 
+0001423736 00000 n 
+0001422038 00000 n 
+0001446946 00000 n 
+0001447064 00000 n 
+0001447124 00000 n 
+0001447303 00000 n 
+0001446386 00000 n 
+0001446571 00000 n 
+0001446768 00000 n 
+0001424701 00000 n 
+0001424821 00000 n 
+0001424869 00000 n 
+0001425220 00000 n 
+0001425242 00000 n 
+0001425461 00000 n 
+0001446362 00000 n 
+0001458087 00000 n 
+0001450490 00000 n 
+0001447637 00000 n 
+0001457248 00000 n 
+0001457308 00000 n 
+0001450889 00000 n 
+0001451113 00000 n 
+0001451369 00000 n 
+0001451624 00000 n 
+0001451880 00000 n 
+0001457368 00000 n 
+0001457428 00000 n 
+0001452135 00000 n 
+0001452359 00000 n 
+0001457488 00000 n 
+0001452550 00000 n 
+0001457548 00000 n 
+0001452774 00000 n 
+0001452965 00000 n 
+0001453189 00000 n 
+0001457608 00000 n 
+0001453380 00000 n 
+0001453588 00000 n 
+0001457668 00000 n 
+0001453812 00000 n 
+0001454036 00000 n 
+0001457728 00000 n 
+0001454260 00000 n 
+0001457788 00000 n 
+0001454484 00000 n 
+0001457847 00000 n 
+0001454707 00000 n 
+0001457907 00000 n 
+0001454931 00000 n 
+0001455155 00000 n 
+0001455379 00000 n 
+0001455569 00000 n 
+0001457967 00000 n 
+0001455792 00000 n 
+0001456000 00000 n 
+0001458027 00000 n 
+0001456224 00000 n 
+0001456432 00000 n 
+0001456656 00000 n 
+0001456880 00000 n 
+0001457070 00000 n 
+0003703697 00000 n 
+0001492258 00000 n 
+0001492378 00000 n 
+0001492444 00000 n 
+0001492510 00000 n 
+0001492576 00000 n 
+0001498646 00000 n 
+0001498766 00000 n 
+0001498892 00000 n 
+0001467542 00000 n 
+0001460979 00000 n 
+0001458227 00000 n 
+0001466943 00000 n 
+0001467003 00000 n 
+0001461360 00000 n 
+0001467062 00000 n 
+0001461583 00000 n 
+0001461806 00000 n 
+0001467122 00000 n 
+0001461996 00000 n 
+0001462187 00000 n 
+0001462411 00000 n 
+0001462611 00000 n 
+0001462802 00000 n 
+0001463026 00000 n 
+0001463225 00000 n 
+0001463415 00000 n 
+0001463639 00000 n 
+0001463839 00000 n 
+0001464030 00000 n 
+0001464253 00000 n 
+0001467182 00000 n 
+0001464453 00000 n 
+0001464661 00000 n 
+0001464885 00000 n 
+0001467242 00000 n 
+0001465076 00000 n 
+0001467302 00000 n 
+0001465300 00000 n 
+0001467362 00000 n 
+0001465524 00000 n 
+0001465713 00000 n 
+0003471062 00000 n 
+0003468645 00000 n 
+0003470895 00000 n 
+0001467422 00000 n 
+0001465935 00000 n 
+0001466126 00000 n 
+0001467482 00000 n 
+0001466350 00000 n 
+0001466574 00000 n 
+0001466765 00000 n 
+0001492702 00000 n 
+0001492822 00000 n 
+0001492942 00000 n 
+0001498526 00000 n 
+0001501762 00000 n 
+0001480514 00000 n 
+0001471124 00000 n 
+0001467711 00000 n 
+0001480334 00000 n 
+0001480394 00000 n 
+0001471649 00000 n 
+0001471873 00000 n 
+0001472063 00000 n 
+0001472254 00000 n 
+0001472478 00000 n 
+0001472668 00000 n 
+0001472859 00000 n 
+0001473083 00000 n 
+0001473274 00000 n 
+0001473465 00000 n 
+0001473689 00000 n 
+0001473886 00000 n 
+0001474077 00000 n 
+0001474267 00000 n 
+0001474475 00000 n 
+0001474699 00000 n 
+0001474896 00000 n 
+0001475087 00000 n 
+0001475278 00000 n 
+0001475486 00000 n 
+0001475710 00000 n 
+0001475906 00000 n 
+0001476097 00000 n 
+0001476287 00000 n 
+0001476495 00000 n 
+0001476719 00000 n 
+0001476915 00000 n 
+0001477105 00000 n 
+0001477295 00000 n 
+0001477502 00000 n 
+0001477724 00000 n 
+0001477920 00000 n 
+0001478111 00000 n 
+0001478301 00000 n 
+0001478509 00000 n 
+0001478732 00000 n 
+0001478929 00000 n 
+0001479120 00000 n 
+0001479311 00000 n 
+0001479519 00000 n 
+0001479743 00000 n 
+0001480454 00000 n 
+0001479967 00000 n 
+0001480156 00000 n 
+0001501882 00000 n 
+0001502002 00000 n 
+0001502122 00000 n 
+0001502241 00000 n 
+0001504992 00000 n 
+0001505112 00000 n 
+0001505232 00000 n 
+0001507874 00000 n 
+0001507994 00000 n 
+0001508113 00000 n 
+0001484551 00000 n 
+0001483990 00000 n 
+0001480681 00000 n 
+0001484491 00000 n 
+0001484146 00000 n 
+0001484313 00000 n 
+0001488170 00000 n 
+0001487785 00000 n 
+0001484789 00000 n 
+0001488110 00000 n 
+0001487932 00000 n 
+0001493001 00000 n 
+0001490708 00000 n 
+0001488384 00000 n 
+0001492138 00000 n 
+0001492198 00000 n 
+0001492318 00000 n 
+0001490900 00000 n 
+0001492642 00000 n 
+0001492762 00000 n 
+0001491130 00000 n 
+0001491321 00000 n 
+0001492882 00000 n 
+0001491545 00000 n 
+0001491736 00000 n 
+0001491960 00000 n 
+0001909390 00000 n 
+0001498958 00000 n 
+0001495345 00000 n 
+0001493127 00000 n 
+0001498407 00000 n 
+0001498467 00000 n 
+0001495600 00000 n 
+0001495791 00000 n 
+0001496015 00000 n 
+0001496237 00000 n 
+0001496470 00000 n 
+0001498586 00000 n 
+0001496685 00000 n 
+0001496875 00000 n 
+0001497098 00000 n 
+0001497321 00000 n 
+0001497554 00000 n 
+0001498706 00000 n 
+0001497769 00000 n 
+0001498832 00000 n 
+0001497999 00000 n 
+0001498229 00000 n 
+0003703823 00000 n 
+0002070124 00000 n 
+0001915604 00000 n 
+0001915724 00000 n 
+0001502361 00000 n 
+0001501258 00000 n 
+0001499084 00000 n 
+0001501583 00000 n 
+0001501643 00000 n 
+0001501702 00000 n 
+0001501822 00000 n 
+0001501942 00000 n 
+0001502062 00000 n 
+0001502182 00000 n 
+0001502301 00000 n 
+0001501405 00000 n 
+0001505352 00000 n 
+0001504607 00000 n 
+0001502513 00000 n 
+0001504932 00000 n 
+0001505052 00000 n 
+0001505172 00000 n 
+0001505292 00000 n 
+0001504754 00000 n 
+0001508172 00000 n 
+0001507489 00000 n 
+0001505491 00000 n 
+0001507814 00000 n 
+0001507934 00000 n 
+0001508054 00000 n 
+0001507636 00000 n 
+0001510906 00000 n 
+0001537455 00000 n 
+0001510633 00000 n 
+0001508324 00000 n 
+0001536679 00000 n 
+0001536739 00000 n 
+0001533464 00000 n 
+0001536915 00000 n 
+0001533669 00000 n 
+0001536975 00000 n 
+0001537035 00000 n 
+0001533886 00000 n 
+0001537095 00000 n 
+0001534116 00000 n 
+0001534347 00000 n 
+0001537155 00000 n 
+0001534538 00000 n 
+0001534769 00000 n 
+0001537215 00000 n 
+0001534968 00000 n 
+0001537275 00000 n 
+0001535200 00000 n 
+0001535398 00000 n 
+0001535630 00000 n 
+0001537335 00000 n 
+0001535829 00000 n 
+0001536037 00000 n 
+0001537395 00000 n 
+0001536269 00000 n 
+0001536501 00000 n 
+0001511696 00000 n 
+0001511816 00000 n 
+0001511864 00000 n 
+0001512217 00000 n 
+0001512239 00000 n 
+0001512458 00000 n 
+0001533440 00000 n 
+0001547515 00000 n 
+0001540624 00000 n 
+0001537651 00000 n 
+0001546675 00000 n 
+0001546735 00000 n 
+0001540996 00000 n 
+0001541228 00000 n 
+0001546795 00000 n 
+0001541419 00000 n 
+0001546855 00000 n 
+0001541651 00000 n 
+0001541883 00000 n 
+0001542101 00000 n 
+0001546915 00000 n 
+0001542319 00000 n 
+0001542550 00000 n 
+0001542768 00000 n 
+0001546975 00000 n 
+0001542999 00000 n 
+0001543207 00000 n 
+0001547035 00000 n 
+0001543439 00000 n 
+0001543647 00000 n 
+0001547095 00000 n 
+0001543879 00000 n 
+0001544111 00000 n 
+0001547155 00000 n 
+0001547215 00000 n 
+0001544310 00000 n 
+0001544518 00000 n 
+0001544750 00000 n 
+0001547275 00000 n 
+0001544949 00000 n 
+0001547335 00000 n 
+0001545180 00000 n 
+0001547395 00000 n 
+0001545412 00000 n 
+0001545611 00000 n 
+0001545843 00000 n 
+0001547455 00000 n 
+0001546066 00000 n 
+0001546298 00000 n 
+0001546497 00000 n 
+0001555930 00000 n 
+0001556110 00000 n 
+0001552191 00000 n 
+0001550476 00000 n 
+0001547655 00000 n 
+0001552071 00000 n 
+0001550677 00000 n 
+0001550909 00000 n 
+0001551108 00000 n 
+0001551307 00000 n 
+0001552131 00000 n 
+0001551505 00000 n 
+0001551703 00000 n 
+0001551893 00000 n 
+0003703949 00000 n 
+0001556230 00000 n 
+0001556295 00000 n 
+0001554842 00000 n 
+0001552378 00000 n 
+0001555810 00000 n 
+0001555870 00000 n 
+0001555990 00000 n 
+0001555016 00000 n 
+0001555206 00000 n 
+0001555394 00000 n 
+0001556050 00000 n 
+0001556170 00000 n 
+0001555632 00000 n 
+0001972029 00000 n 
+0001563254 00000 n 
+0001558807 00000 n 
+0001556472 00000 n 
+0001562359 00000 n 
+0001562419 00000 n 
+0001559071 00000 n 
+0001562595 00000 n 
+0001562655 00000 n 
+0001559294 00000 n 
+0001562715 00000 n 
+0001559545 00000 n 
+0001562775 00000 n 
+0001559796 00000 n 
+0001562835 00000 n 
+0001560047 00000 n 
+0001562895 00000 n 
+0001560298 00000 n 
+0001560489 00000 n 
+0001562955 00000 n 
+0001560740 00000 n 
+0001560929 00000 n 
+0001563015 00000 n 
+0001561178 00000 n 
+0001563074 00000 n 
+0001561429 00000 n 
+0001563134 00000 n 
+0001561680 00000 n 
+0001563194 00000 n 
+0001561930 00000 n 
+0001562181 00000 n 
+0001569297 00000 n 
+0001565844 00000 n 
+0001563421 00000 n 
+0001568999 00000 n 
+0001569059 00000 n 
+0001566108 00000 n 
+0001566325 00000 n 
+0001566524 00000 n 
+0001569237 00000 n 
+0001566722 00000 n 
+0001566949 00000 n 
+0001567143 00000 n 
+0001567370 00000 n 
+0001567564 00000 n 
+0001567772 00000 n 
+0001567999 00000 n 
+0001568192 00000 n 
+0001568400 00000 n 
+0001568627 00000 n 
+0001568821 00000 n 
+0001583972 00000 n 
+0001584092 00000 n 
+0001586355 00000 n 
+0001586475 00000 n 
+0001584151 00000 n 
+0001573271 00000 n 
+0001569422 00000 n 
+0001583733 00000 n 
+0001573850 00000 n 
+0001574077 00000 n 
+0001574270 00000 n 
+0001574496 00000 n 
+0001574688 00000 n 
+0001574881 00000 n 
+0001575108 00000 n 
+0001575302 00000 n 
+0001575529 00000 n 
+0001575723 00000 n 
+0001575916 00000 n 
+0001576143 00000 n 
+0001576337 00000 n 
+0001576531 00000 n 
+0001576725 00000 n 
+0001576950 00000 n 
+0001577142 00000 n 
+0001577333 00000 n 
+0001577525 00000 n 
+0001577752 00000 n 
+0001577946 00000 n 
+0001578140 00000 n 
+0001578334 00000 n 
+0001578527 00000 n 
+0001578721 00000 n 
+0001578948 00000 n 
+0001579142 00000 n 
+0001579336 00000 n 
+0001579530 00000 n 
+0001579757 00000 n 
+0001579951 00000 n 
+0001580145 00000 n 
+0001580339 00000 n 
+0001580566 00000 n 
+0001580760 00000 n 
+0001580954 00000 n 
+0001581148 00000 n 
+0001581375 00000 n 
+0001581569 00000 n 
+0001581763 00000 n 
+0001581957 00000 n 
+0001582184 00000 n 
+0001582378 00000 n 
+0001583793 00000 n 
+0001582572 00000 n 
+0001582799 00000 n 
+0001582993 00000 n 
+0001583852 00000 n 
+0001583187 00000 n 
+0001583379 00000 n 
+0001583912 00000 n 
+0001584032 00000 n 
+0001583555 00000 n 
+0001586595 00000 n 
+0001586715 00000 n 
+0001586835 00000 n 
+0001586955 00000 n 
+0001587075 00000 n 
+0001587195 00000 n 
+0001587315 00000 n 
+0001587434 00000 n 
+0001587560 00000 n 
+0001615166 00000 n 
+0001615285 00000 n 
+0001615405 00000 n 
+0001587620 00000 n 
+0001585911 00000 n 
+0001584292 00000 n 
+0001586236 00000 n 
+0001586296 00000 n 
+0001586415 00000 n 
+0001586535 00000 n 
+0001586655 00000 n 
+0001586775 00000 n 
+0001586895 00000 n 
+0001587015 00000 n 
+0001587135 00000 n 
+0001587255 00000 n 
+0001587375 00000 n 
+0001587500 00000 n 
+0001586058 00000 n 
+0001590190 00000 n 
+0001616067 00000 n 
+0001589980 00000 n 
+0001587746 00000 n 
+0001615047 00000 n 
+0001615107 00000 n 
+0001615225 00000 n 
+0001615345 00000 n 
+0001615470 00000 n 
+0001615647 00000 n 
+0001615707 00000 n 
+0001615767 00000 n 
+0001615827 00000 n 
+0001613487 00000 n 
+0001613694 00000 n 
+0001615887 00000 n 
+0001613902 00000 n 
+0001615947 00000 n 
+0001614086 00000 n 
+0001614286 00000 n 
+0001616007 00000 n 
+0001614486 00000 n 
+0001614678 00000 n 
+0001614869 00000 n 
+0003704075 00000 n 
+0001591360 00000 n 
+0001591480 00000 n 
+0001591528 00000 n 
+0001591887 00000 n 
+0001591909 00000 n 
+0001592128 00000 n 
+0001613463 00000 n 
+0001626998 00000 n 
+0001619349 00000 n 
+0001616235 00000 n 
+0001626099 00000 n 
+0001626159 00000 n 
+0001619766 00000 n 
+0001626218 00000 n 
+0001619956 00000 n 
+0001620153 00000 n 
+0001626278 00000 n 
+0001620350 00000 n 
+0001626338 00000 n 
+0001620541 00000 n 
+0001626398 00000 n 
+0001620741 00000 n 
+0001626458 00000 n 
+0001620941 00000 n 
+0001621146 00000 n 
+0001626518 00000 n 
+0001621349 00000 n 
+0001626578 00000 n 
+0001621539 00000 n 
+0001626638 00000 n 
+0001626698 00000 n 
+0001626758 00000 n 
+0001626818 00000 n 
+0001626878 00000 n 
+0001621747 00000 n 
+0001621955 00000 n 
+0001626938 00000 n 
+0001622174 00000 n 
+0001622393 00000 n 
+0001622601 00000 n 
+0001622809 00000 n 
+0001623028 00000 n 
+0001623227 00000 n 
+0001623446 00000 n 
+0001623646 00000 n 
+0001623843 00000 n 
+0001624062 00000 n 
+0001624262 00000 n 
+0001624481 00000 n 
+0001624680 00000 n 
+0001624876 00000 n 
+0001625095 00000 n 
+0001625300 00000 n 
+0001625519 00000 n 
+0001625724 00000 n 
+0001625921 00000 n 
+0001736374 00000 n 
+0001736494 00000 n 
+0001736613 00000 n 
+0001736733 00000 n 
+0001739117 00000 n 
+0001739237 00000 n 
+0001739357 00000 n 
+0001639539 00000 n 
+0001630754 00000 n 
+0001627123 00000 n 
+0001638999 00000 n 
+0001631234 00000 n 
+0001631452 00000 n 
+0001631636 00000 n 
+0001631825 00000 n 
+0001632031 00000 n 
+0001632250 00000 n 
+0001632441 00000 n 
+0001632649 00000 n 
+0001632868 00000 n 
+0001633066 00000 n 
+0001633274 00000 n 
+0001633493 00000 n 
+0001633678 00000 n 
+0001633880 00000 n 
+0001634098 00000 n 
+0001634289 00000 n 
+0001634496 00000 n 
+0001634715 00000 n 
+0001634901 00000 n 
+0001639059 00000 n 
+0001635109 00000 n 
+0001635294 00000 n 
+0001635512 00000 n 
+0001639119 00000 n 
+0001635697 00000 n 
+0001635905 00000 n 
+0001639179 00000 n 
+0001636124 00000 n 
+0001636332 00000 n 
+0001636551 00000 n 
+0001639239 00000 n 
+0001636725 00000 n 
+0001636925 00000 n 
+0001639299 00000 n 
+0001637142 00000 n 
+0001637342 00000 n 
+0001639359 00000 n 
+0001637559 00000 n 
+0001637759 00000 n 
+0001639419 00000 n 
+0001637978 00000 n 
+0001638178 00000 n 
+0001639479 00000 n 
+0001638397 00000 n 
+0001638602 00000 n 
+0001638821 00000 n 
+0001739476 00000 n 
+0001742143 00000 n 
+0001742261 00000 n 
+0001742381 00000 n 
+0001746169 00000 n 
+0001748866 00000 n 
+0001652102 00000 n 
+0001643151 00000 n 
+0001639707 00000 n 
+0001651505 00000 n 
+0001651565 00000 n 
+0001643631 00000 n 
+0001643836 00000 n 
+0001651624 00000 n 
+0001644055 00000 n 
+0001644256 00000 n 
+0001644475 00000 n 
+0001651684 00000 n 
+0001644667 00000 n 
+0001644867 00000 n 
+0001645085 00000 n 
+0001651744 00000 n 
+0001645281 00000 n 
+0001645482 00000 n 
+0001645701 00000 n 
+0001651804 00000 n 
+0001645892 00000 n 
+0001646093 00000 n 
+0001646312 00000 n 
+0001651863 00000 n 
+0001646504 00000 n 
+0001651923 00000 n 
+0001646722 00000 n 
+0001646941 00000 n 
+0001647160 00000 n 
+0001647379 00000 n 
+0001647565 00000 n 
+0001651983 00000 n 
+0001647784 00000 n 
+0001652043 00000 n 
+0001648003 00000 n 
+0001648222 00000 n 
+0001648440 00000 n 
+0001648628 00000 n 
+0001648847 00000 n 
+0001649047 00000 n 
+0001649266 00000 n 
+0001649466 00000 n 
+0001649685 00000 n 
+0001649885 00000 n 
+0001650093 00000 n 
+0001650301 00000 n 
+0001650520 00000 n 
+0001650720 00000 n 
+0001650928 00000 n 
+0001651136 00000 n 
+0001651327 00000 n 
+0001749045 00000 n 
+0001749165 00000 n 
+0001749291 00000 n 
+0001749411 00000 n 
+0001749537 00000 n 
+0001752630 00000 n 
+0001752750 00000 n 
+0001752869 00000 n 
+0001664293 00000 n 
+0001655966 00000 n 
+0001652229 00000 n 
+0001664233 00000 n 
+0001656446 00000 n 
+0001656665 00000 n 
+0001656865 00000 n 
+0001657073 00000 n 
+0001657281 00000 n 
+0001657497 00000 n 
+0001657694 00000 n 
+0001657899 00000 n 
+0001658104 00000 n 
+0001658294 00000 n 
+0001658513 00000 n 
+0001658699 00000 n 
+0001658918 00000 n 
+0001659104 00000 n 
+0001659322 00000 n 
+0001659505 00000 n 
+0001659693 00000 n 
+0001659912 00000 n 
+0001660130 00000 n 
+0001660322 00000 n 
+0001660540 00000 n 
+0001660732 00000 n 
+0001660951 00000 n 
+0001661142 00000 n 
+0001661360 00000 n 
+0001661551 00000 n 
+0001661770 00000 n 
+0001661967 00000 n 
+0001662186 00000 n 
+0001662383 00000 n 
+0001662602 00000 n 
+0001662802 00000 n 
+0001663020 00000 n 
+0001663219 00000 n 
+0001663438 00000 n 
+0001663638 00000 n 
+0001663856 00000 n 
+0001664055 00000 n 
+0001756897 00000 n 
+0001757023 00000 n 
+0001760447 00000 n 
+0001760573 00000 n 
+0001760693 00000 n 
+0001760812 00000 n 
+0001763983 00000 n 
+0001764109 00000 n 
+0001767617 00000 n 
+0001767856 00000 n 
+0001770333 00000 n 
+0001770453 00000 n 
+0001770573 00000 n 
+0001675932 00000 n 
+0001667698 00000 n 
+0001664447 00000 n 
+0001675872 00000 n 
+0001668169 00000 n 
+0001668388 00000 n 
+0001668588 00000 n 
+0001668807 00000 n 
+0001669007 00000 n 
+0001669226 00000 n 
+0001669426 00000 n 
+0001669645 00000 n 
+0001669845 00000 n 
+0001670064 00000 n 
+0001670255 00000 n 
+0001670474 00000 n 
+0001670665 00000 n 
+0001670884 00000 n 
+0001671084 00000 n 
+0001671302 00000 n 
+0001671502 00000 n 
+0001671720 00000 n 
+0001671920 00000 n 
+0001672138 00000 n 
+0001672338 00000 n 
+0001672557 00000 n 
+0001672749 00000 n 
+0001672968 00000 n 
+0001673168 00000 n 
+0001673387 00000 n 
+0001673579 00000 n 
+0001673798 00000 n 
+0001673998 00000 n 
+0001674217 00000 n 
+0001674422 00000 n 
+0001674641 00000 n 
+0001674846 00000 n 
+0001675065 00000 n 
+0001675270 00000 n 
+0001675489 00000 n 
+0001675694 00000 n 
+0001777472 00000 n 
+0001780738 00000 n 
+0001780978 00000 n 
+0001783992 00000 n 
+0001784111 00000 n 
+0001786516 00000 n 
+0001786636 00000 n 
+0001786756 00000 n 
+0001786876 00000 n 
+0001689450 00000 n 
+0001680165 00000 n 
+0001676059 00000 n 
+0001689210 00000 n 
+0001680690 00000 n 
+0001680909 00000 n 
+0001681098 00000 n 
+0001681267 00000 n 
+0001681486 00000 n 
+0001681682 00000 n 
+0001681850 00000 n 
+0001682069 00000 n 
+0001682255 00000 n 
+0001682474 00000 n 
+0001682660 00000 n 
+0001682877 00000 n 
+0001683061 00000 n 
+0001683280 00000 n 
+0001689270 00000 n 
+0001683466 00000 n 
+0001683685 00000 n 
+0001683871 00000 n 
+0001684090 00000 n 
+0001684276 00000 n 
+0001684495 00000 n 
+0001689330 00000 n 
+0001684680 00000 n 
+0001684899 00000 n 
+0001685085 00000 n 
+0001685304 00000 n 
+0001685490 00000 n 
+0001689390 00000 n 
+0001685658 00000 n 
+0001685877 00000 n 
+0001686062 00000 n 
+0001686280 00000 n 
+0001686465 00000 n 
+0001686648 00000 n 
+0001686864 00000 n 
+0001687052 00000 n 
+0001687250 00000 n 
+0001687427 00000 n 
+0001687646 00000 n 
+0001687836 00000 n 
+0001688036 00000 n 
+0001688215 00000 n 
+0001688434 00000 n 
+0001688624 00000 n 
+0001688832 00000 n 
+0001689032 00000 n 
+0003704201 00000 n 
+0001793749 00000 n 
+0001793867 00000 n 
+0001793987 00000 n 
+0001797625 00000 n 
+0001797984 00000 n 
+0001798104 00000 n 
+0001802087 00000 n 
+0001802207 00000 n 
+0001802327 00000 n 
+0001802447 00000 n 
+0001705162 00000 n 
+0001694468 00000 n 
+0001689577 00000 n 
+0001705042 00000 n 
+0001695065 00000 n 
+0001695240 00000 n 
+0001695458 00000 n 
+0001695647 00000 n 
+0001695855 00000 n 
+0001696055 00000 n 
+0001696255 00000 n 
+0001696430 00000 n 
+0001696649 00000 n 
+0001696849 00000 n 
+0001697057 00000 n 
+0001697257 00000 n 
+0001697432 00000 n 
+0001697651 00000 n 
+0001697851 00000 n 
+0001698058 00000 n 
+0001698258 00000 n 
+0001698430 00000 n 
+0001698649 00000 n 
+0001698839 00000 n 
+0001699039 00000 n 
+0001699239 00000 n 
+0001699439 00000 n 
+0001699630 00000 n 
+0001699848 00000 n 
+0001700037 00000 n 
+0001700236 00000 n 
+0001700436 00000 n 
+0001700636 00000 n 
+0001700827 00000 n 
+0001701046 00000 n 
+0001701232 00000 n 
+0001705102 00000 n 
+0001701401 00000 n 
+0001701619 00000 n 
+0001701838 00000 n 
+0001702024 00000 n 
+0001702190 00000 n 
+0001702409 00000 n 
+0001702595 00000 n 
+0001702761 00000 n 
+0001702980 00000 n 
+0001703166 00000 n 
+0001703331 00000 n 
+0001703550 00000 n 
+0001703736 00000 n 
+0001703936 00000 n 
+0001704101 00000 n 
+0001704317 00000 n 
+0001704501 00000 n 
+0001704699 00000 n 
+0001704864 00000 n 
+0001806346 00000 n 
+0001806466 00000 n 
+0001810329 00000 n 
+0001810449 00000 n 
+0001810569 00000 n 
+0001815071 00000 n 
+0001815191 00000 n 
+0001815311 00000 n 
+0001819529 00000 n 
+0001819649 00000 n 
+0001819769 00000 n 
+0001716736 00000 n 
+0001709239 00000 n 
+0001705343 00000 n 
+0001716196 00000 n 
+0001709665 00000 n 
+0001709884 00000 n 
+0001710070 00000 n 
+0001710270 00000 n 
+0001710436 00000 n 
+0001710655 00000 n 
+0001710863 00000 n 
+0001711082 00000 n 
+0001711290 00000 n 
+0001711509 00000 n 
+0001711693 00000 n 
+0001711862 00000 n 
+0001712081 00000 n 
+0001712276 00000 n 
+0001712495 00000 n 
+0001712703 00000 n 
+0001712921 00000 n 
+0001713099 00000 n 
+0001713318 00000 n 
+0001713508 00000 n 
+0001713716 00000 n 
+0001713935 00000 n 
+0001714131 00000 n 
+0001716256 00000 n 
+0001714321 00000 n 
+0001716316 00000 n 
+0001714540 00000 n 
+0001714759 00000 n 
+0001716376 00000 n 
+0001716436 00000 n 
+0001716496 00000 n 
+0001716556 00000 n 
+0001716616 00000 n 
+0001714945 00000 n 
+0001715153 00000 n 
+0001716676 00000 n 
+0001715372 00000 n 
+0001715580 00000 n 
+0001715799 00000 n 
+0001716018 00000 n 
+0001823885 00000 n 
+0001824005 00000 n 
+0001824125 00000 n 
+0001828961 00000 n 
+0001829080 00000 n 
+0001829197 00000 n 
+0001829316 00000 n 
+0001833801 00000 n 
+0001833927 00000 n 
+0001837900 00000 n 
+0001724804 00000 n 
+0001720074 00000 n 
+0001716890 00000 n 
+0001724324 00000 n 
+0001724384 00000 n 
+0001724444 00000 n 
+0001720392 00000 n 
+0001720600 00000 n 
+0001720819 00000 n 
+0001724504 00000 n 
+0001721005 00000 n 
+0001724564 00000 n 
+0001721223 00000 n 
+0001724624 00000 n 
+0001721442 00000 n 
+0001721661 00000 n 
+0001721846 00000 n 
+0001724684 00000 n 
+0001722031 00000 n 
+0001722250 00000 n 
+0001722436 00000 n 
+0001722655 00000 n 
+0001722841 00000 n 
+0001723027 00000 n 
+0001723246 00000 n 
+0001723432 00000 n 
+0001724744 00000 n 
+0001723617 00000 n 
+0001723803 00000 n 
+0001723973 00000 n 
+0001724146 00000 n 
+0001838086 00000 n 
+0001838206 00000 n 
+0001838332 00000 n 
+0001838458 00000 n 
+0001727154 00000 n 
+0001726769 00000 n 
+0001724955 00000 n 
+0001727094 00000 n 
+0001726916 00000 n 
+0001730374 00000 n 
+0001729989 00000 n 
+0001727303 00000 n 
+0001730314 00000 n 
+0001730136 00000 n 
+0001733934 00000 n 
+0001733549 00000 n 
+0001730548 00000 n 
+0001733874 00000 n 
+0001733696 00000 n 
+0003704327 00000 n 
+0001736852 00000 n 
+0001735930 00000 n 
+0001734121 00000 n 
+0001736255 00000 n 
+0001736315 00000 n 
+0001736434 00000 n 
+0001736554 00000 n 
+0001736673 00000 n 
+0001736793 00000 n 
+0001736077 00000 n 
+0001739535 00000 n 
+0001738732 00000 n 
+0001736965 00000 n 
+0001739057 00000 n 
+0001739177 00000 n 
+0001739297 00000 n 
+0001739416 00000 n 
+0001738879 00000 n 
+0001742440 00000 n 
+0001741699 00000 n 
+0001739648 00000 n 
+0001742024 00000 n 
+0001742084 00000 n 
+0001742203 00000 n 
+0001742321 00000 n 
+0001741846 00000 n 
+0001746235 00000 n 
+0001745532 00000 n 
+0001742566 00000 n 
+0001746050 00000 n 
+0001746110 00000 n 
+0001745688 00000 n 
+0001745872 00000 n 
+0001749596 00000 n 
+0001748422 00000 n 
+0001746373 00000 n 
+0001748747 00000 n 
+0001748807 00000 n 
+0001748925 00000 n 
+0001748985 00000 n 
+0001749105 00000 n 
+0001749231 00000 n 
+0001749351 00000 n 
+0001749477 00000 n 
+0001748569 00000 n 
+0001752995 00000 n 
+0001751986 00000 n 
+0001749722 00000 n 
+0001752511 00000 n 
+0001752571 00000 n 
+0001752690 00000 n 
+0001752810 00000 n 
+0001752142 00000 n 
+0001752935 00000 n 
+0001752333 00000 n 
+0003704453 00000 n 
+0001757149 00000 n 
+0001755910 00000 n 
+0001753121 00000 n 
+0001756837 00000 n 
+0001756084 00000 n 
+0001756963 00000 n 
+0001756276 00000 n 
+0001757089 00000 n 
+0001756468 00000 n 
+0001756659 00000 n 
+0001760872 00000 n 
+0001759868 00000 n 
+0001757275 00000 n 
+0001760387 00000 n 
+0001760513 00000 n 
+0001760633 00000 n 
+0001760752 00000 n 
+0001760024 00000 n 
+0001760209 00000 n 
+0001764408 00000 n 
+0001763150 00000 n 
+0001761011 00000 n 
+0001763864 00000 n 
+0001763924 00000 n 
+0001764049 00000 n 
+0001764168 00000 n 
+0001764288 00000 n 
+0001763315 00000 n 
+0001763489 00000 n 
+0001763686 00000 n 
+0001767975 00000 n 
+0001766391 00000 n 
+0001764534 00000 n 
+0001767498 00000 n 
+0001767558 00000 n 
+0001766574 00000 n 
+0001766749 00000 n 
+0001767677 00000 n 
+0001767797 00000 n 
+0001766947 00000 n 
+0001767122 00000 n 
+0001767916 00000 n 
+0001767320 00000 n 
+0001770752 00000 n 
+0001769948 00000 n 
+0001768101 00000 n 
+0001770273 00000 n 
+0001770393 00000 n 
+0001770513 00000 n 
+0001770633 00000 n 
+0001770095 00000 n 
+0001774099 00000 n 
+0001772635 00000 n 
+0001770878 00000 n 
+0001773741 00000 n 
+0001773801 00000 n 
+0001772818 00000 n 
+0001772992 00000 n 
+0001773919 00000 n 
+0001773190 00000 n 
+0001773365 00000 n 
+0001774039 00000 n 
+0001773563 00000 n 
+0003704579 00000 n 
+0001777652 00000 n 
+0001776185 00000 n 
+0001774225 00000 n 
+0001777292 00000 n 
+0001776368 00000 n 
+0001776543 00000 n 
+0001777412 00000 n 
+0001776741 00000 n 
+0001776916 00000 n 
+0001777532 00000 n 
+0001777114 00000 n 
+0001781037 00000 n 
+0001779513 00000 n 
+0001777778 00000 n 
+0001780619 00000 n 
+0001780679 00000 n 
+0001779696 00000 n 
+0001779871 00000 n 
+0001780798 00000 n 
+0001780918 00000 n 
+0001780069 00000 n 
+0001780244 00000 n 
+0001780441 00000 n 
+0001784170 00000 n 
+0001783038 00000 n 
+0001781163 00000 n 
+0001783754 00000 n 
+0001783814 00000 n 
+0001783932 00000 n 
+0001783203 00000 n 
+0001783378 00000 n 
+0001784052 00000 n 
+0001783576 00000 n 
+0001786934 00000 n 
+0001786072 00000 n 
+0001784296 00000 n 
+0001786397 00000 n 
+0001786457 00000 n 
+0001786576 00000 n 
+0001786696 00000 n 
+0001786816 00000 n 
+0001786219 00000 n 
+0001790069 00000 n 
+0001788996 00000 n 
+0001787060 00000 n 
+0001789711 00000 n 
+0001789771 00000 n 
+0001789890 00000 n 
+0001789161 00000 n 
+0001789336 00000 n 
+0001790009 00000 n 
+0001789533 00000 n 
+0001794227 00000 n 
+0001792419 00000 n 
+0001790195 00000 n 
+0001793689 00000 n 
+0001792611 00000 n 
+0001792786 00000 n 
+0001793808 00000 n 
+0001792984 00000 n 
+0001793927 00000 n 
+0001793152 00000 n 
+0001793321 00000 n 
+0001794047 00000 n 
+0001794167 00000 n 
+0001793511 00000 n 
+0003704705 00000 n 
+0001798164 00000 n 
+0001796071 00000 n 
+0001794353 00000 n 
+0001797565 00000 n 
+0001796272 00000 n 
+0001796445 00000 n 
+0001797685 00000 n 
+0001797805 00000 n 
+0001796641 00000 n 
+0001796816 00000 n 
+0001797925 00000 n 
+0001797014 00000 n 
+0001797189 00000 n 
+0001798044 00000 n 
+0001797387 00000 n 
+0001802506 00000 n 
+0001800900 00000 n 
+0001798290 00000 n 
+0001801968 00000 n 
+0001802028 00000 n 
+0001801083 00000 n 
+0001802147 00000 n 
+0001801250 00000 n 
+0001802267 00000 n 
+0001801433 00000 n 
+0001802387 00000 n 
+0001801611 00000 n 
+0001801790 00000 n 
+0001806585 00000 n 
+0001805353 00000 n 
+0001802632 00000 n 
+0001806227 00000 n 
+0001806287 00000 n 
+0001805527 00000 n 
+0001806406 00000 n 
+0001805700 00000 n 
+0001806525 00000 n 
+0001805875 00000 n 
+0001806049 00000 n 
+0001810628 00000 n 
+0001809561 00000 n 
+0001806748 00000 n 
+0001810269 00000 n 
+0001810389 00000 n 
+0001809726 00000 n 
+0001810509 00000 n 
+0001809900 00000 n 
+0001810091 00000 n 
+0001815430 00000 n 
+0001813713 00000 n 
+0001810791 00000 n 
+0001814952 00000 n 
+0001815012 00000 n 
+0001813905 00000 n 
+0001815131 00000 n 
+0001814095 00000 n 
+0001815251 00000 n 
+0001814264 00000 n 
+0001814430 00000 n 
+0001815371 00000 n 
+0001814608 00000 n 
+0001814774 00000 n 
+0001819887 00000 n 
+0001818060 00000 n 
+0001815606 00000 n 
+0001819469 00000 n 
+0001818261 00000 n 
+0001819589 00000 n 
+0001818438 00000 n 
+0001818604 00000 n 
+0001819709 00000 n 
+0001818782 00000 n 
+0001818948 00000 n 
+0001819828 00000 n 
+0001819126 00000 n 
+0001819291 00000 n 
+0003704831 00000 n 
+0001824245 00000 n 
+0001822727 00000 n 
+0001820026 00000 n 
+0001823825 00000 n 
+0001822910 00000 n 
+0001823945 00000 n 
+0001823087 00000 n 
+0001823250 00000 n 
+0001824065 00000 n 
+0001823428 00000 n 
+0001824185 00000 n 
+0001823647 00000 n 
+0001829436 00000 n 
+0001827359 00000 n 
+0001824446 00000 n 
+0001828901 00000 n 
+0001827560 00000 n 
+0001829020 00000 n 
+0001827778 00000 n 
+0001827947 00000 n 
+0001829140 00000 n 
+0001828165 00000 n 
+0001828355 00000 n 
+0001829257 00000 n 
+0001829376 00000 n 
+0001828545 00000 n 
+0001828723 00000 n 
+0001834053 00000 n 
+0001832616 00000 n 
+0001829624 00000 n 
+0001833741 00000 n 
+0001832799 00000 n 
+0001833867 00000 n 
+0001832975 00000 n 
+0001833194 00000 n 
+0001833993 00000 n 
+0001833374 00000 n 
+0001833563 00000 n 
+0001838702 00000 n 
+0001836934 00000 n 
+0001834204 00000 n 
+0001837840 00000 n 
+0001837108 00000 n 
+0001837297 00000 n 
+0001837966 00000 n 
+0001838026 00000 n 
+0001838146 00000 n 
+0001838272 00000 n 
+0001838398 00000 n 
+0001838524 00000 n 
+0001837476 00000 n 
+0001837662 00000 n 
+0001845690 00000 n 
+0001841325 00000 n 
+0001838853 00000 n 
+0001844912 00000 n 
+0001844972 00000 n 
+0001841607 00000 n 
+0001841818 00000 n 
+0001845032 00000 n 
+0001845092 00000 n 
+0001842003 00000 n 
+0001845152 00000 n 
+0001842235 00000 n 
+0001842467 00000 n 
+0001845212 00000 n 
+0001842653 00000 n 
+0001842885 00000 n 
+0001845272 00000 n 
+0001843084 00000 n 
+0001843316 00000 n 
+0001843548 00000 n 
+0001845332 00000 n 
+0001843747 00000 n 
+0001843979 00000 n 
+0001845392 00000 n 
+0001844164 00000 n 
+0001844350 00000 n 
+0001844548 00000 n 
+0001845451 00000 n 
+0001845511 00000 n 
+0001845571 00000 n 
+0001844734 00000 n 
+0001848282 00000 n 
+0001874816 00000 n 
+0001848009 00000 n 
+0001845856 00000 n 
+0001874159 00000 n 
+0001870921 00000 n 
+0001874277 00000 n 
+0001874337 00000 n 
+0001871107 00000 n 
+0001871351 00000 n 
+0001871550 00000 n 
+0001874397 00000 n 
+0001871749 00000 n 
+0001871935 00000 n 
+0001872121 00000 n 
+0001874576 00000 n 
+0001872310 00000 n 
+0001872540 00000 n 
+0001872802 00000 n 
+0001873064 00000 n 
+0001874636 00000 n 
+0001874696 00000 n 
+0001873325 00000 n 
+0001873555 00000 n 
+0001874756 00000 n 
+0001873751 00000 n 
+0001873981 00000 n 
+0003704957 00000 n 
+0001849236 00000 n 
+0001849356 00000 n 
+0001849404 00000 n 
+0001849755 00000 n 
+0001849777 00000 n 
+0001849996 00000 n 
+0001870897 00000 n 
+0001909510 00000 n 
+0001909575 00000 n 
+0001909641 00000 n 
+0001885995 00000 n 
+0001877986 00000 n 
+0001874983 00000 n 
+0001885095 00000 n 
+0001885155 00000 n 
+0001878403 00000 n 
+0001878599 00000 n 
+0001878827 00000 n 
+0001885215 00000 n 
+0001879023 00000 n 
+0001879219 00000 n 
+0001879447 00000 n 
+0001885275 00000 n 
+0001879637 00000 n 
+0001879845 00000 n 
+0001885335 00000 n 
+0001880075 00000 n 
+0001880299 00000 n 
+0001885395 00000 n 
+0001880529 00000 n 
+0001885455 00000 n 
+0001880759 00000 n 
+0001885515 00000 n 
+0001880989 00000 n 
+0001885575 00000 n 
+0001881219 00000 n 
+0001885635 00000 n 
+0001881449 00000 n 
+0001881679 00000 n 
+0001881909 00000 n 
+0001882099 00000 n 
+0001885695 00000 n 
+0001882329 00000 n 
+0001882537 00000 n 
+0001885755 00000 n 
+0001882767 00000 n 
+0001882974 00000 n 
+0001883203 00000 n 
+0001883432 00000 n 
+0001885815 00000 n 
+0001883628 00000 n 
+0001883858 00000 n 
+0001885875 00000 n 
+0001884055 00000 n 
+0001884285 00000 n 
+0001884492 00000 n 
+0001885935 00000 n 
+0001884689 00000 n 
+0001884917 00000 n 
+0001915849 00000 n 
+0001896722 00000 n 
+0001889244 00000 n 
+0001886122 00000 n 
+0001896182 00000 n 
+0001896242 00000 n 
+0001889661 00000 n 
+0001896302 00000 n 
+0001889890 00000 n 
+0001890120 00000 n 
+0001890317 00000 n 
+0001890547 00000 n 
+0001896362 00000 n 
+0001890744 00000 n 
+0001890940 00000 n 
+0001891170 00000 n 
+0001891370 00000 n 
+0001891567 00000 n 
+0001891797 00000 n 
+0001891997 00000 n 
+0001892193 00000 n 
+0001892423 00000 n 
+0001896422 00000 n 
+0001892623 00000 n 
+0001892831 00000 n 
+0001893061 00000 n 
+0001896482 00000 n 
+0001893258 00000 n 
+0001896542 00000 n 
+0001893488 00000 n 
+0001896602 00000 n 
+0001893718 00000 n 
+0001893914 00000 n 
+0001896662 00000 n 
+0001894143 00000 n 
+0001894373 00000 n 
+0001894570 00000 n 
+0001894799 00000 n 
+0001894995 00000 n 
+0001895191 00000 n 
+0001895388 00000 n 
+0001895616 00000 n 
+0001895810 00000 n 
+0001896004 00000 n 
+0001918623 00000 n 
+0001909767 00000 n 
+0001909885 00000 n 
+0001915485 00000 n 
+0001918809 00000 n 
+0001918929 00000 n 
+0001919049 00000 n 
+0001901912 00000 n 
+0001900132 00000 n 
+0001896905 00000 n 
+0001901792 00000 n 
+0001900333 00000 n 
+0001900563 00000 n 
+0001900760 00000 n 
+0001900957 00000 n 
+0001901187 00000 n 
+0001901852 00000 n 
+0001901417 00000 n 
+0001901614 00000 n 
+0001919168 00000 n 
+0001919288 00000 n 
+0001905291 00000 n 
+0001904906 00000 n 
+0001902163 00000 n 
+0001905231 00000 n 
+0001905053 00000 n 
+0001909944 00000 n 
+0001908268 00000 n 
+0001905492 00000 n 
+0001909270 00000 n 
+0001909330 00000 n 
+0001909450 00000 n 
+0001908442 00000 n 
+0001909707 00000 n 
+0001909826 00000 n 
+0001908666 00000 n 
+0001908862 00000 n 
+0001909092 00000 n 
+0001915914 00000 n 
+0001912340 00000 n 
+0001910133 00000 n 
+0001915366 00000 n 
+0001915426 00000 n 
+0001912595 00000 n 
+0001912791 00000 n 
+0001913021 00000 n 
+0001913221 00000 n 
+0001913454 00000 n 
+0001915545 00000 n 
+0001913669 00000 n 
+0001913866 00000 n 
+0001914095 00000 n 
+0001914294 00000 n 
+0001914527 00000 n 
+0001915664 00000 n 
+0001914742 00000 n 
+0001915789 00000 n 
+0001914965 00000 n 
+0001915188 00000 n 
+0003705083 00000 n 
+0001922507 00000 n 
+0001919527 00000 n 
+0001917971 00000 n 
+0001916040 00000 n 
+0001918504 00000 n 
+0001918564 00000 n 
+0001918689 00000 n 
+0001918749 00000 n 
+0001918869 00000 n 
+0001918989 00000 n 
+0001919109 00000 n 
+0001919228 00000 n 
+0001919348 00000 n 
+0001918127 00000 n 
+0001918326 00000 n 
+0001950850 00000 n 
+0001922171 00000 n 
+0001919666 00000 n 
+0001950073 00000 n 
+0001950133 00000 n 
+0001945232 00000 n 
+0001950193 00000 n 
+0001950252 00000 n 
+0001945455 00000 n 
+0001950311 00000 n 
+0001945693 00000 n 
+0001945931 00000 n 
+0001950371 00000 n 
+0001946128 00000 n 
+0001946366 00000 n 
+0001950431 00000 n 
+0001946574 00000 n 
+0001946812 00000 n 
+0001950491 00000 n 
+0001947017 00000 n 
+0001950551 00000 n 
+0001947255 00000 n 
+0001947460 00000 n 
+0001947698 00000 n 
+0001950610 00000 n 
+0001947901 00000 n 
+0001948109 00000 n 
+0001950670 00000 n 
+0001948347 00000 n 
+0001948584 00000 n 
+0001948822 00000 n 
+0001950730 00000 n 
+0001949018 00000 n 
+0001949256 00000 n 
+0001950790 00000 n 
+0001949452 00000 n 
+0001949690 00000 n 
+0001949895 00000 n 
+0001923464 00000 n 
+0001923584 00000 n 
+0001923632 00000 n 
+0001923985 00000 n 
+0001924007 00000 n 
+0001924226 00000 n 
+0001945208 00000 n 
+0001971909 00000 n 
+0001962510 00000 n 
+0001954127 00000 n 
+0001951020 00000 n 
+0001961493 00000 n 
+0001961553 00000 n 
+0001954544 00000 n 
+0001961612 00000 n 
+0001954782 00000 n 
+0001955019 00000 n 
+0001955242 00000 n 
+0001961672 00000 n 
+0001955466 00000 n 
+0001955704 00000 n 
+0001961732 00000 n 
+0001955928 00000 n 
+0001956136 00000 n 
+0001961792 00000 n 
+0001956374 00000 n 
+0001956582 00000 n 
+0001961851 00000 n 
+0001956820 00000 n 
+0001957028 00000 n 
+0001961911 00000 n 
+0001957265 00000 n 
+0001961971 00000 n 
+0001957503 00000 n 
+0001957741 00000 n 
+0001957946 00000 n 
+0001962031 00000 n 
+0001958182 00000 n 
+0001958390 00000 n 
+0001962091 00000 n 
+0001958628 00000 n 
+0001958836 00000 n 
+0001962151 00000 n 
+0001959074 00000 n 
+0001959312 00000 n 
+0001962210 00000 n 
+0001962270 00000 n 
+0001959517 00000 n 
+0001959725 00000 n 
+0001959963 00000 n 
+0001962330 00000 n 
+0001960168 00000 n 
+0001962390 00000 n 
+0001960406 00000 n 
+0001962450 00000 n 
+0001960644 00000 n 
+0001960849 00000 n 
+0001961086 00000 n 
+0001961315 00000 n 
+0001968621 00000 n 
+0001965613 00000 n 
+0001962637 00000 n 
+0001968381 00000 n 
+0001968441 00000 n 
+0001965859 00000 n 
+0001966097 00000 n 
+0001966301 00000 n 
+0001968501 00000 n 
+0001966506 00000 n 
+0001966744 00000 n 
+0001966949 00000 n 
+0001967187 00000 n 
+0001967391 00000 n 
+0001967596 00000 n 
+0001968561 00000 n 
+0001967801 00000 n 
+0001968006 00000 n 
+0001968203 00000 n 
+0001998443 00000 n 
+0001998563 00000 n 
+0001998683 00000 n 
+0001972094 00000 n 
+0001971464 00000 n 
+0001968796 00000 n 
+0001971789 00000 n 
+0001971849 00000 n 
+0001971969 00000 n 
+0001971611 00000 n 
+0001974573 00000 n 
+0001999044 00000 n 
+0001974381 00000 n 
+0001972295 00000 n 
+0001998264 00000 n 
+0001998324 00000 n 
+0001996988 00000 n 
+0001997185 00000 n 
+0001997381 00000 n 
+0001998383 00000 n 
+0001998503 00000 n 
+0001998623 00000 n 
+0001998747 00000 n 
+0001997612 00000 n 
+0001998924 00000 n 
+0001998984 00000 n 
+0001997829 00000 n 
+0001998086 00000 n 
+0003705209 00000 n 
+0001975359 00000 n 
+0001975479 00000 n 
+0001975527 00000 n 
+0001975872 00000 n 
+0001975894 00000 n 
+0001976113 00000 n 
+0001996964 00000 n 
+0002006261 00000 n 
+0002001758 00000 n 
+0001999226 00000 n 
+0002005545 00000 n 
+0002005605 00000 n 
+0002002031 00000 n 
+0002005664 00000 n 
+0002002288 00000 n 
+0002005724 00000 n 
+0002002545 00000 n 
+0002005783 00000 n 
+0002002802 00000 n 
+0002002999 00000 n 
+0002005843 00000 n 
+0002003255 00000 n 
+0002003451 00000 n 
+0002005903 00000 n 
+0002003707 00000 n 
+0002005963 00000 n 
+0002003964 00000 n 
+0002006023 00000 n 
+0002004221 00000 n 
+0002006083 00000 n 
+0002004478 00000 n 
+0002006143 00000 n 
+0002004735 00000 n 
+0002004958 00000 n 
+0002005163 00000 n 
+0002005367 00000 n 
+0002012812 00000 n 
+0002008611 00000 n 
+0002006401 00000 n 
+0002012095 00000 n 
+0002012213 00000 n 
+0002008884 00000 n 
+0002012273 00000 n 
+0002012333 00000 n 
+0002009094 00000 n 
+0002012393 00000 n 
+0002009325 00000 n 
+0002012453 00000 n 
+0002009556 00000 n 
+0002009787 00000 n 
+0002012513 00000 n 
+0002009979 00000 n 
+0002010210 00000 n 
+0002012573 00000 n 
+0002010408 00000 n 
+0002010639 00000 n 
+0002010868 00000 n 
+0002012633 00000 n 
+0002011064 00000 n 
+0002012692 00000 n 
+0002011295 00000 n 
+0002011526 00000 n 
+0002012752 00000 n 
+0002011718 00000 n 
+0002011917 00000 n 
+0002016595 00000 n 
+0002017251 00000 n 
+0002015056 00000 n 
+0002012979 00000 n 
+0002016476 00000 n 
+0002016536 00000 n 
+0002016655 00000 n 
+0002016834 00000 n 
+0002016894 00000 n 
+0002015248 00000 n 
+0002015491 00000 n 
+0002015689 00000 n 
+0002016954 00000 n 
+0002017131 00000 n 
+0002017191 00000 n 
+0002015887 00000 n 
+0002016109 00000 n 
+0002016298 00000 n 
+0002025403 00000 n 
+0002020414 00000 n 
+0002017429 00000 n 
+0002024983 00000 n 
+0002025043 00000 n 
+0002020732 00000 n 
+0002025103 00000 n 
+0002020955 00000 n 
+0002021163 00000 n 
+0002025163 00000 n 
+0002021386 00000 n 
+0002021594 00000 n 
+0002025223 00000 n 
+0002021817 00000 n 
+0002025283 00000 n 
+0002022040 00000 n 
+0002022263 00000 n 
+0002022486 00000 n 
+0002022709 00000 n 
+0002022916 00000 n 
+0002023138 00000 n 
+0002023360 00000 n 
+0002023568 00000 n 
+0002023790 00000 n 
+0002025343 00000 n 
+0002024013 00000 n 
+0002024235 00000 n 
+0002024425 00000 n 
+0002024615 00000 n 
+0002024805 00000 n 
+0002028656 00000 n 
+0002028776 00000 n 
+0002028896 00000 n 
+0002029016 00000 n 
+0002031776 00000 n 
+0002029081 00000 n 
+0002028092 00000 n 
+0002025570 00000 n 
+0002028417 00000 n 
+0002028477 00000 n 
+0002028536 00000 n 
+0002028596 00000 n 
+0002028716 00000 n 
+0002028836 00000 n 
+0002028956 00000 n 
+0002028239 00000 n 
+0002032434 00000 n 
+0002031273 00000 n 
+0002029247 00000 n 
+0002031598 00000 n 
+0002031658 00000 n 
+0002031717 00000 n 
+0002031836 00000 n 
+0002032015 00000 n 
+0002032075 00000 n 
+0002032254 00000 n 
+0002032314 00000 n 
+0002031420 00000 n 
+0003705335 00000 n 
+0002035124 00000 n 
+0002060788 00000 n 
+0002034869 00000 n 
+0002032587 00000 n 
+0002060132 00000 n 
+0002060250 00000 n 
+0002060310 00000 n 
+0002060489 00000 n 
+0002060549 00000 n 
+0002057332 00000 n 
+0002057562 00000 n 
+0002060609 00000 n 
+0002057794 00000 n 
+0002058025 00000 n 
+0002060668 00000 n 
+0002058225 00000 n 
+0002060728 00000 n 
+0002058458 00000 n 
+0002058688 00000 n 
+0002058919 00000 n 
+0002059109 00000 n 
+0002059340 00000 n 
+0002059532 00000 n 
+0002059763 00000 n 
+0002059954 00000 n 
+0002035907 00000 n 
+0002036027 00000 n 
+0002036075 00000 n 
+0002036422 00000 n 
+0002036444 00000 n 
+0002036663 00000 n 
+0002057308 00000 n 
+0002101504 00000 n 
+0002101624 00000 n 
+0002101744 00000 n 
+0002070184 00000 n 
+0002063841 00000 n 
+0002060970 00000 n 
+0002069405 00000 n 
+0002064195 00000 n 
+0002064425 00000 n 
+0002064621 00000 n 
+0002064852 00000 n 
+0002069465 00000 n 
+0002065044 00000 n 
+0002065252 00000 n 
+0002069525 00000 n 
+0002065485 00000 n 
+0002065718 00000 n 
+0002069585 00000 n 
+0002065908 00000 n 
+0002069645 00000 n 
+0002066141 00000 n 
+0002066349 00000 n 
+0002069705 00000 n 
+0002066582 00000 n 
+0002066790 00000 n 
+0002069765 00000 n 
+0002067023 00000 n 
+0002069825 00000 n 
+0002067254 00000 n 
+0002067487 00000 n 
+0002069885 00000 n 
+0002069945 00000 n 
+0002067687 00000 n 
+0002067895 00000 n 
+0002068128 00000 n 
+0002070005 00000 n 
+0002068328 00000 n 
+0002070065 00000 n 
+0002068561 00000 n 
+0002068794 00000 n 
+0002068994 00000 n 
+0002069227 00000 n 
+0002101870 00000 n 
+0002104728 00000 n 
+0002085805 00000 n 
+0002073428 00000 n 
+0002070311 00000 n 
+0002085685 00000 n 
+0002085745 00000 n 
+0002074070 00000 n 
+0002074268 00000 n 
+0002074501 00000 n 
+0002074701 00000 n 
+0002074901 00000 n 
+0002075098 00000 n 
+0002075330 00000 n 
+0002075529 00000 n 
+0002075727 00000 n 
+0002075960 00000 n 
+0002076160 00000 n 
+0002076358 00000 n 
+0002076591 00000 n 
+0002076791 00000 n 
+0002076988 00000 n 
+0002077220 00000 n 
+0002077419 00000 n 
+0002077618 00000 n 
+0002077816 00000 n 
+0002078049 00000 n 
+0002078239 00000 n 
+0002078429 00000 n 
+0002078627 00000 n 
+0002078860 00000 n 
+0002079060 00000 n 
+0002079258 00000 n 
+0002079491 00000 n 
+0002079691 00000 n 
+0002079889 00000 n 
+0002080122 00000 n 
+0002080322 00000 n 
+0002080520 00000 n 
+0002080753 00000 n 
+0002080953 00000 n 
+0002081151 00000 n 
+0002081384 00000 n 
+0002081584 00000 n 
+0002081784 00000 n 
+0002081979 00000 n 
+0002082209 00000 n 
+0002082406 00000 n 
+0002082593 00000 n 
+0002082791 00000 n 
+0002083024 00000 n 
+0002083224 00000 n 
+0002083422 00000 n 
+0002083655 00000 n 
+0002083855 00000 n 
+0002084055 00000 n 
+0002084253 00000 n 
+0002084486 00000 n 
+0002084686 00000 n 
+0002084876 00000 n 
+0002085074 00000 n 
+0002085307 00000 n 
+0002085507 00000 n 
+0002104913 00000 n 
+0002105033 00000 n 
+0002105153 00000 n 
+0002105272 00000 n 
+0002105392 00000 n 
+0002105512 00000 n 
+0002105632 00000 n 
+0002105752 00000 n 
+0002109169 00000 n 
+0002109288 00000 n 
+0002109408 00000 n 
+0002109528 00000 n 
+0002109648 00000 n 
+0002109768 00000 n 
+0002109887 00000 n 
+0002110007 00000 n 
+0002096467 00000 n 
+0002088853 00000 n 
+0002085945 00000 n 
+0002096287 00000 n 
+0002089297 00000 n 
+0002089495 00000 n 
+0002089728 00000 n 
+0002089928 00000 n 
+0002090160 00000 n 
+0002096347 00000 n 
+0002090359 00000 n 
+0002090557 00000 n 
+0002090790 00000 n 
+0002090980 00000 n 
+0002091170 00000 n 
+0002091368 00000 n 
+0002091601 00000 n 
+0002091791 00000 n 
+0002091991 00000 n 
+0002092189 00000 n 
+0002092422 00000 n 
+0002092622 00000 n 
+0002092811 00000 n 
+0002093009 00000 n 
+0002093242 00000 n 
+0002093442 00000 n 
+0002093640 00000 n 
+0002093873 00000 n 
+0002094063 00000 n 
+0002094263 00000 n 
+0002094461 00000 n 
+0002094694 00000 n 
+0002094894 00000 n 
+0002095084 00000 n 
+0002095313 00000 n 
+0002095511 00000 n 
+0002095709 00000 n 
+0002096407 00000 n 
+0002095909 00000 n 
+0002096109 00000 n 
+0002110126 00000 n 
+0002112380 00000 n 
+0002112499 00000 n 
+0002112619 00000 n 
+0002112739 00000 n 
+0002112859 00000 n 
+0002112978 00000 n 
+0002113097 00000 n 
+0002113217 00000 n 
+0002101935 00000 n 
+0002100179 00000 n 
+0002096682 00000 n 
+0002101384 00000 n 
+0002100362 00000 n 
+0002100552 00000 n 
+0002101444 00000 n 
+0002101564 00000 n 
+0002100741 00000 n 
+0002100974 00000 n 
+0002101684 00000 n 
+0002101810 00000 n 
+0002101206 00000 n 
+0002105812 00000 n 
+0002104284 00000 n 
+0002102173 00000 n 
+0002104609 00000 n 
+0002104669 00000 n 
+0002104794 00000 n 
+0002104853 00000 n 
+0002104973 00000 n 
+0002105093 00000 n 
+0002105212 00000 n 
+0002105332 00000 n 
+0002105452 00000 n 
+0002105572 00000 n 
+0002105692 00000 n 
+0002104431 00000 n 
+0003705461 00000 n 
+0002110185 00000 n 
+0002107762 00000 n 
+0002106037 00000 n 
+0002109050 00000 n 
+0002109110 00000 n 
+0002109228 00000 n 
+0002109348 00000 n 
+0002109468 00000 n 
+0002109588 00000 n 
+0002107945 00000 n 
+0002108178 00000 n 
+0002109708 00000 n 
+0002109827 00000 n 
+0002109947 00000 n 
+0002108408 00000 n 
+0002108640 00000 n 
+0002110066 00000 n 
+0002108872 00000 n 
+0002116657 00000 n 
+0002113456 00000 n 
+0002111936 00000 n 
+0002110311 00000 n 
+0002112261 00000 n 
+0002112321 00000 n 
+0002112439 00000 n 
+0002112559 00000 n 
+0002112679 00000 n 
+0002112799 00000 n 
+0002112919 00000 n 
+0002113038 00000 n 
+0002113157 00000 n 
+0002113277 00000 n 
+0002112083 00000 n 
+0002145172 00000 n 
+0002116321 00000 n 
+0002113595 00000 n 
+0002144812 00000 n 
+0002144872 00000 n 
+0002144932 00000 n 
+0002140213 00000 n 
+0002144992 00000 n 
+0002140438 00000 n 
+0002140665 00000 n 
+0002140873 00000 n 
+0002141100 00000 n 
+0002141307 00000 n 
+0002141503 00000 n 
+0002141703 00000 n 
+0002141903 00000 n 
+0002142111 00000 n 
+0002142338 00000 n 
+0002142546 00000 n 
+0002142746 00000 n 
+0002142953 00000 n 
+0002143178 00000 n 
+0002143384 00000 n 
+0002143581 00000 n 
+0002143779 00000 n 
+0002145052 00000 n 
+0002143987 00000 n 
+0002144214 00000 n 
+0002145112 00000 n 
+0002144407 00000 n 
+0002144634 00000 n 
+0002117863 00000 n 
+0002117983 00000 n 
+0002118031 00000 n 
+0002118402 00000 n 
+0002118424 00000 n 
+0002118643 00000 n 
+0002140189 00000 n 
+0002171436 00000 n 
+0002171556 00000 n 
+0002175727 00000 n 
+0002175846 00000 n 
+0002157642 00000 n 
+0002148736 00000 n 
+0002145370 00000 n 
+0002157104 00000 n 
+0002157164 00000 n 
+0002149207 00000 n 
+0002149401 00000 n 
+0002149628 00000 n 
+0002157223 00000 n 
+0002149822 00000 n 
+0002150029 00000 n 
+0002157283 00000 n 
+0002150255 00000 n 
+0002150451 00000 n 
+0002157342 00000 n 
+0002150678 00000 n 
+0002150905 00000 n 
+0002157402 00000 n 
+0002151132 00000 n 
+0002151358 00000 n 
+0002157462 00000 n 
+0002151583 00000 n 
+0002151783 00000 n 
+0002157522 00000 n 
+0002152010 00000 n 
+0002152218 00000 n 
+0002152444 00000 n 
+0002152671 00000 n 
+0002152898 00000 n 
+0002153104 00000 n 
+0002153331 00000 n 
+0002153527 00000 n 
+0002153754 00000 n 
+0002153946 00000 n 
+0002154172 00000 n 
+0002154371 00000 n 
+0002154597 00000 n 
+0002157582 00000 n 
+0002154797 00000 n 
+0002155024 00000 n 
+0002155230 00000 n 
+0002155455 00000 n 
+0002155663 00000 n 
+0002155890 00000 n 
+0002156116 00000 n 
+0002156306 00000 n 
+0002156513 00000 n 
+0002156720 00000 n 
+0002156926 00000 n 
+0002178920 00000 n 
+0002179040 00000 n 
+0002179166 00000 n 
+0002179291 00000 n 
+0002179411 00000 n 
+0002179530 00000 n 
+0002182250 00000 n 
+0002182370 00000 n 
+0002182490 00000 n 
+0002166760 00000 n 
+0002160838 00000 n 
+0002157769 00000 n 
+0002166221 00000 n 
+0003468239 00000 n 
+0003465269 00000 n 
+0003468071 00000 n 
+0002161192 00000 n 
+0002161383 00000 n 
+0002161610 00000 n 
+0002161801 00000 n 
+0002162028 00000 n 
+0002162254 00000 n 
+0002162461 00000 n 
+0002166281 00000 n 
+0002162668 00000 n 
+0002166341 00000 n 
+0002162894 00000 n 
+0002163102 00000 n 
+0002166400 00000 n 
+0002163329 00000 n 
+0002163537 00000 n 
+0002166460 00000 n 
+0002163764 00000 n 
+0002163991 00000 n 
+0002166520 00000 n 
+0002166580 00000 n 
+0002164185 00000 n 
+0002164393 00000 n 
+0002164620 00000 n 
+0002166640 00000 n 
+0002164813 00000 n 
+0002165040 00000 n 
+0002165234 00000 n 
+0002165461 00000 n 
+0002165655 00000 n 
+0002165849 00000 n 
+0002166700 00000 n 
+0002166043 00000 n 
+0002182610 00000 n 
+0002182730 00000 n 
+0002208812 00000 n 
+0002208992 00000 n 
+0002209112 00000 n 
+0002171676 00000 n 
+0002170142 00000 n 
+0002166914 00000 n 
+0002171316 00000 n 
+0002170325 00000 n 
+0002170525 00000 n 
+0002170717 00000 n 
+0002171376 00000 n 
+0002171496 00000 n 
+0002170911 00000 n 
+0002171616 00000 n 
+0002171138 00000 n 
+0003705587 00000 n 
+0002175966 00000 n 
+0002174634 00000 n 
+0002171827 00000 n 
+0002175667 00000 n 
+0002174808 00000 n 
+0002175786 00000 n 
+0002175035 00000 n 
+0002175906 00000 n 
+0002175262 00000 n 
+0002175489 00000 n 
+0002179589 00000 n 
+0002178241 00000 n 
+0002176117 00000 n 
+0002178801 00000 n 
+0002178861 00000 n 
+0002178980 00000 n 
+0002179106 00000 n 
+0002178397 00000 n 
+0002179232 00000 n 
+0002179351 00000 n 
+0002179471 00000 n 
+0002178623 00000 n 
+0002182789 00000 n 
+0002181806 00000 n 
+0002179727 00000 n 
+0002182131 00000 n 
+0002182191 00000 n 
+0002182310 00000 n 
+0002182430 00000 n 
+0002182550 00000 n 
+0002182670 00000 n 
+0002181953 00000 n 
+0002185014 00000 n 
+0002209349 00000 n 
+0002184858 00000 n 
+0002182928 00000 n 
+0002208693 00000 n 
+0002208753 00000 n 
+0002208872 00000 n 
+0002208932 00000 n 
+0002209052 00000 n 
+0002209172 00000 n 
+0002208323 00000 n 
+0002208515 00000 n 
+0002186146 00000 n 
+0002186266 00000 n 
+0002186314 00000 n 
+0002186675 00000 n 
+0002186697 00000 n 
+0002186916 00000 n 
+0002208299 00000 n 
+0002222031 00000 n 
+0002212712 00000 n 
+0002209531 00000 n 
+0002221792 00000 n 
+0002221852 00000 n 
+0002213219 00000 n 
+0002213449 00000 n 
+0002213657 00000 n 
+0002213865 00000 n 
+0002214092 00000 n 
+0002214289 00000 n 
+0002214519 00000 n 
+0002214719 00000 n 
+0002214916 00000 n 
+0002215146 00000 n 
+0002215345 00000 n 
+0002215575 00000 n 
+0002215774 00000 n 
+0002215971 00000 n 
+0002216201 00000 n 
+0002216401 00000 n 
+0002216631 00000 n 
+0002216831 00000 n 
+0002217028 00000 n 
+0002217258 00000 n 
+0002217453 00000 n 
+0002217660 00000 n 
+0002217890 00000 n 
+0002218075 00000 n 
+0002218264 00000 n 
+0002218472 00000 n 
+0002218702 00000 n 
+0002218888 00000 n 
+0002219096 00000 n 
+0002219326 00000 n 
+0002219516 00000 n 
+0002219722 00000 n 
+0002219952 00000 n 
+0002220150 00000 n 
+0002221912 00000 n 
+0002220356 00000 n 
+0002220586 00000 n 
+0002220783 00000 n 
+0002221971 00000 n 
+0002220991 00000 n 
+0002221188 00000 n 
+0002221418 00000 n 
+0002221614 00000 n 
+0002228352 00000 n 
+0002228472 00000 n 
+0002230881 00000 n 
+0002231001 00000 n 
+0002231121 00000 n 
+0002231241 00000 n 
+0002233921 00000 n 
+0002234041 00000 n 
+0002234161 00000 n 
+0002234281 00000 n 
+0002237119 00000 n 
+0002237239 00000 n 
+0002228598 00000 n 
+0002225078 00000 n 
+0002222185 00000 n 
+0002227993 00000 n 
+0002228053 00000 n 
+0002225333 00000 n 
+0002225530 00000 n 
+0002225760 00000 n 
+0002228113 00000 n 
+0002225954 00000 n 
+0002226184 00000 n 
+0002226414 00000 n 
+0002228173 00000 n 
+0002226611 00000 n 
+0002226839 00000 n 
+0002228233 00000 n 
+0002227033 00000 n 
+0002227229 00000 n 
+0002227424 00000 n 
+0002227621 00000 n 
+0002228292 00000 n 
+0002228412 00000 n 
+0002228538 00000 n 
+0002227815 00000 n 
+0003705713 00000 n 
+0002237419 00000 n 
+0002231361 00000 n 
+0002230496 00000 n 
+0002228778 00000 n 
+0002230821 00000 n 
+0002230941 00000 n 
+0002231061 00000 n 
+0002231181 00000 n 
+0002231301 00000 n 
+0002230643 00000 n 
+0002234399 00000 n 
+0002233536 00000 n 
+0002231474 00000 n 
+0002233861 00000 n 
+0002233981 00000 n 
+0002234101 00000 n 
+0002234221 00000 n 
+0002234341 00000 n 
+0002233683 00000 n 
+0002237658 00000 n 
+0002236734 00000 n 
+0002234525 00000 n 
+0002237059 00000 n 
+0002237179 00000 n 
+0002237299 00000 n 
+0002237359 00000 n 
+0002237479 00000 n 
+0002236881 00000 n 
+0002242792 00000 n 
+0002240017 00000 n 
+0002237811 00000 n 
+0002241955 00000 n 
+0002242015 00000 n 
+0002242075 00000 n 
+0002240227 00000 n 
+0002240455 00000 n 
+0002242135 00000 n 
+0002240681 00000 n 
+0002242194 00000 n 
+0002242254 00000 n 
+0002240909 00000 n 
+0002242314 00000 n 
+0002242374 00000 n 
+0002242434 00000 n 
+0002242612 00000 n 
+0002242672 00000 n 
+0002241118 00000 n 
+0002242732 00000 n 
+0002241349 00000 n 
+0002241546 00000 n 
+0002241777 00000 n 
+0002254843 00000 n 
+0002246269 00000 n 
+0002242958 00000 n 
+0002254543 00000 n 
+0002254603 00000 n 
+0002254663 00000 n 
+0002246740 00000 n 
+0002246948 00000 n 
+0002254723 00000 n 
+0002247179 00000 n 
+0002247386 00000 n 
+0002247616 00000 n 
+0002247847 00000 n 
+0002248077 00000 n 
+0002248284 00000 n 
+0002248491 00000 n 
+0002248722 00000 n 
+0002248920 00000 n 
+0002249128 00000 n 
+0002249357 00000 n 
+0002249553 00000 n 
+0002249758 00000 n 
+0002249989 00000 n 
+0002250189 00000 n 
+0002250420 00000 n 
+0002250620 00000 n 
+0002250851 00000 n 
+0002251050 00000 n 
+0002251281 00000 n 
+0002251473 00000 n 
+0002251681 00000 n 
+0002251912 00000 n 
+0002252097 00000 n 
+0002252286 00000 n 
+0002252494 00000 n 
+0002252725 00000 n 
+0002252911 00000 n 
+0002253119 00000 n 
+0002253350 00000 n 
+0002253541 00000 n 
+0002254783 00000 n 
+0002253747 00000 n 
+0002253942 00000 n 
+0002254170 00000 n 
+0002254365 00000 n 
+0002410672 00000 n 
+0002344449 00000 n 
+0002344569 00000 n 
+0002344688 00000 n 
+0002347794 00000 n 
+0002347920 00000 n 
+0002348040 00000 n 
+0002348160 00000 n 
+0002348280 00000 n 
+0002351158 00000 n 
+0002351277 00000 n 
+0002266621 00000 n 
+0002258282 00000 n 
+0002254997 00000 n 
+0002265961 00000 n 
+0002266021 00000 n 
+0002258726 00000 n 
+0002258955 00000 n 
+0002266081 00000 n 
+0002259151 00000 n 
+0002266141 00000 n 
+0002259381 00000 n 
+0002259589 00000 n 
+0002266201 00000 n 
+0002259820 00000 n 
+0002260028 00000 n 
+0002260259 00000 n 
+0002266261 00000 n 
+0002260452 00000 n 
+0002260652 00000 n 
+0002266321 00000 n 
+0002260881 00000 n 
+0002261081 00000 n 
+0002266381 00000 n 
+0002261310 00000 n 
+0002261510 00000 n 
+0002266441 00000 n 
+0002261741 00000 n 
+0002261941 00000 n 
+0002262172 00000 n 
+0002262403 00000 n 
+0002262600 00000 n 
+0002262828 00000 n 
+0002263023 00000 n 
+0002263254 00000 n 
+0002263451 00000 n 
+0002263652 00000 n 
+0002263883 00000 n 
+0002264075 00000 n 
+0002264276 00000 n 
+0002264507 00000 n 
+0002264699 00000 n 
+0002264900 00000 n 
+0002265131 00000 n 
+0002266501 00000 n 
+0002265322 00000 n 
+0002266561 00000 n 
+0002265553 00000 n 
+0002265783 00000 n 
+0003705839 00000 n 
+0002353645 00000 n 
+0002353765 00000 n 
+0002353885 00000 n 
+0002354005 00000 n 
+0002354125 00000 n 
+0002354245 00000 n 
+0002278928 00000 n 
+0002270451 00000 n 
+0002266788 00000 n 
+0002278570 00000 n 
+0002278630 00000 n 
+0002270913 00000 n 
+0002278689 00000 n 
+0002271144 00000 n 
+0002278748 00000 n 
+0002271375 00000 n 
+0002278808 00000 n 
+0002271606 00000 n 
+0002271837 00000 n 
+0002272067 00000 n 
+0002272255 00000 n 
+0002272486 00000 n 
+0002272686 00000 n 
+0002272917 00000 n 
+0002273117 00000 n 
+0002273348 00000 n 
+0002273548 00000 n 
+0002273756 00000 n 
+0002273964 00000 n 
+0002274194 00000 n 
+0002274393 00000 n 
+0002274600 00000 n 
+0002274807 00000 n 
+0002274998 00000 n 
+0002275229 00000 n 
+0002275429 00000 n 
+0002275637 00000 n 
+0002275845 00000 n 
+0002276076 00000 n 
+0002276276 00000 n 
+0002276484 00000 n 
+0002276692 00000 n 
+0002278868 00000 n 
+0002276882 00000 n 
+0002277113 00000 n 
+0002277343 00000 n 
+0002277533 00000 n 
+0002277764 00000 n 
+0002277964 00000 n 
+0002278193 00000 n 
+0002278392 00000 n 
+0002357042 00000 n 
+0002357162 00000 n 
+0002357282 00000 n 
+0002357402 00000 n 
+0002360622 00000 n 
+0002360748 00000 n 
+0002360873 00000 n 
+0002364130 00000 n 
+0002364256 00000 n 
+0002364375 00000 n 
+0002291697 00000 n 
+0002283017 00000 n 
+0002279068 00000 n 
+0002291457 00000 n 
+0002283497 00000 n 
+0002283727 00000 n 
+0002283919 00000 n 
+0002284149 00000 n 
+0002284348 00000 n 
+0002284579 00000 n 
+0002284779 00000 n 
+0002285010 00000 n 
+0002285202 00000 n 
+0002285433 00000 n 
+0002285625 00000 n 
+0002285856 00000 n 
+0002286056 00000 n 
+0002286287 00000 n 
+0002286487 00000 n 
+0002286718 00000 n 
+0002286907 00000 n 
+0002287076 00000 n 
+0002287307 00000 n 
+0002287503 00000 n 
+0002287671 00000 n 
+0002287902 00000 n 
+0002288100 00000 n 
+0002288331 00000 n 
+0002291517 00000 n 
+0002288529 00000 n 
+0002288760 00000 n 
+0002288958 00000 n 
+0002289189 00000 n 
+0002291577 00000 n 
+0002289387 00000 n 
+0002289617 00000 n 
+0002289814 00000 n 
+0002290045 00000 n 
+0002291637 00000 n 
+0002290243 00000 n 
+0002290473 00000 n 
+0002290669 00000 n 
+0002290900 00000 n 
+0002291098 00000 n 
+0002291279 00000 n 
+0002367086 00000 n 
+0002367206 00000 n 
+0002367326 00000 n 
+0002369969 00000 n 
+0002370088 00000 n 
+0002370208 00000 n 
+0002370328 00000 n 
+0002370448 00000 n 
+0002373940 00000 n 
+0002374060 00000 n 
+0002374180 00000 n 
+0002374299 00000 n 
+0002374419 00000 n 
+0002378220 00000 n 
+0002307862 00000 n 
+0002296690 00000 n 
+0002291837 00000 n 
+0002307742 00000 n 
+0002297296 00000 n 
+0002297526 00000 n 
+0002297716 00000 n 
+0002297916 00000 n 
+0002298082 00000 n 
+0002298310 00000 n 
+0002298497 00000 n 
+0002298694 00000 n 
+0002298862 00000 n 
+0002299093 00000 n 
+0002299283 00000 n 
+0002299491 00000 n 
+0002299691 00000 n 
+0002299872 00000 n 
+0002300103 00000 n 
+0002300303 00000 n 
+0002300511 00000 n 
+0002300711 00000 n 
+0002300889 00000 n 
+0002301119 00000 n 
+0002301308 00000 n 
+0002301507 00000 n 
+0002301706 00000 n 
+0002301906 00000 n 
+0002302097 00000 n 
+0002302327 00000 n 
+0002302516 00000 n 
+0002302724 00000 n 
+0002302924 00000 n 
+0002303124 00000 n 
+0002303305 00000 n 
+0002303535 00000 n 
+0002303734 00000 n 
+0002303942 00000 n 
+0002304142 00000 n 
+0002304323 00000 n 
+0002304553 00000 n 
+0002304742 00000 n 
+0002304941 00000 n 
+0002305141 00000 n 
+0002305341 00000 n 
+0002305531 00000 n 
+0002305762 00000 n 
+0002305960 00000 n 
+0002307802 00000 n 
+0002306133 00000 n 
+0002306364 00000 n 
+0002306595 00000 n 
+0002306793 00000 n 
+0002306964 00000 n 
+0002307195 00000 n 
+0002307393 00000 n 
+0002307564 00000 n 
+0002378340 00000 n 
+0002378460 00000 n 
+0002378580 00000 n 
+0002382883 00000 n 
+0002383003 00000 n 
+0002387319 00000 n 
+0002387438 00000 n 
+0002387557 00000 n 
+0002391861 00000 n 
+0002391981 00000 n 
+0002392100 00000 n 
+0002321327 00000 n 
+0002312246 00000 n 
+0002308085 00000 n 
+0002321027 00000 n 
+0002312744 00000 n 
+0002312975 00000 n 
+0002313173 00000 n 
+0002321087 00000 n 
+0002313341 00000 n 
+0002313572 00000 n 
+0002313770 00000 n 
+0002314001 00000 n 
+0002314198 00000 n 
+0002314398 00000 n 
+0002314598 00000 n 
+0002314766 00000 n 
+0002314997 00000 n 
+0002315194 00000 n 
+0002315365 00000 n 
+0002315596 00000 n 
+0002315794 00000 n 
+0002315994 00000 n 
+0002316165 00000 n 
+0002316395 00000 n 
+0002316602 00000 n 
+0002316833 00000 n 
+0002317041 00000 n 
+0002317272 00000 n 
+0002317468 00000 n 
+0002317644 00000 n 
+0002317875 00000 n 
+0002318070 00000 n 
+0002318301 00000 n 
+0002318509 00000 n 
+0002318740 00000 n 
+0002318935 00000 n 
+0002319166 00000 n 
+0002319356 00000 n 
+0002319564 00000 n 
+0002319795 00000 n 
+0002319991 00000 n 
+0002321147 00000 n 
+0002321207 00000 n 
+0002320181 00000 n 
+0002320389 00000 n 
+0002321267 00000 n 
+0002320620 00000 n 
+0002320849 00000 n 
+0002392220 00000 n 
+0002396636 00000 n 
+0002396756 00000 n 
+0002396876 00000 n 
+0002400886 00000 n 
+0002401006 00000 n 
+0002401126 00000 n 
+0002401246 00000 n 
+0002405437 00000 n 
+0002405556 00000 n 
+0002405676 00000 n 
+0002410547 00000 n 
+0002332601 00000 n 
+0002324665 00000 n 
+0002321494 00000 n 
+0002332361 00000 n 
+0002332421 00000 n 
+0002325118 00000 n 
+0002332481 00000 n 
+0002325349 00000 n 
+0002325580 00000 n 
+0002325777 00000 n 
+0002325975 00000 n 
+0002326205 00000 n 
+0002332541 00000 n 
+0002326402 00000 n 
+0002326633 00000 n 
+0002326831 00000 n 
+0002327029 00000 n 
+0002327260 00000 n 
+0002327457 00000 n 
+0002327655 00000 n 
+0002327853 00000 n 
+0002328061 00000 n 
+0002328292 00000 n 
+0002328489 00000 n 
+0002328687 00000 n 
+0002328885 00000 n 
+0002329093 00000 n 
+0002329324 00000 n 
+0002329520 00000 n 
+0002329718 00000 n 
+0002329916 00000 n 
+0002330124 00000 n 
+0002330355 00000 n 
+0002330551 00000 n 
+0002330748 00000 n 
+0002330945 00000 n 
+0002331152 00000 n 
+0002331382 00000 n 
+0002331579 00000 n 
+0002331777 00000 n 
+0002331975 00000 n 
+0002332183 00000 n 
+0002410858 00000 n 
+0002410978 00000 n 
+0002414208 00000 n 
+0002414333 00000 n 
+0002414459 00000 n 
+0002414585 00000 n 
+0002417286 00000 n 
+0002417412 00000 n 
+0002340980 00000 n 
+0002337066 00000 n 
+0002332768 00000 n 
+0002340802 00000 n 
+0002337357 00000 n 
+0002337586 00000 n 
+0002337782 00000 n 
+0002337980 00000 n 
+0002338178 00000 n 
+0002338386 00000 n 
+0002338617 00000 n 
+0002338815 00000 n 
+0002339013 00000 n 
+0002339210 00000 n 
+0002339418 00000 n 
+0002339648 00000 n 
+0002340862 00000 n 
+0002340922 00000 n 
+0002339856 00000 n 
+0002340048 00000 n 
+0002340240 00000 n 
+0002340432 00000 n 
+0002340624 00000 n 
+0003705965 00000 n 
+0002417538 00000 n 
+0002417664 00000 n 
+0002426482 00000 n 
+0002344753 00000 n 
+0002343805 00000 n 
+0002341197 00000 n 
+0002344329 00000 n 
+0002343961 00000 n 
+0002344389 00000 n 
+0002344509 00000 n 
+0002344629 00000 n 
+0002344151 00000 n 
+0002348345 00000 n 
+0002347173 00000 n 
+0002344942 00000 n 
+0002347675 00000 n 
+0002347735 00000 n 
+0002347860 00000 n 
+0002347329 00000 n 
+0002347980 00000 n 
+0002348100 00000 n 
+0002348220 00000 n 
+0002347497 00000 n 
+0002351397 00000 n 
+0002350714 00000 n 
+0002348471 00000 n 
+0002351039 00000 n 
+0002351099 00000 n 
+0002351217 00000 n 
+0002351337 00000 n 
+0002350861 00000 n 
+0002354305 00000 n 
+0002353201 00000 n 
+0002351523 00000 n 
+0002353526 00000 n 
+0002353586 00000 n 
+0002353705 00000 n 
+0002353825 00000 n 
+0002353945 00000 n 
+0002354065 00000 n 
+0002354185 00000 n 
+0002353348 00000 n 
+0002357522 00000 n 
+0002356598 00000 n 
+0002354444 00000 n 
+0002356923 00000 n 
+0002356983 00000 n 
+0002357102 00000 n 
+0002357222 00000 n 
+0002357342 00000 n 
+0002357462 00000 n 
+0002356745 00000 n 
+0002360939 00000 n 
+0002360237 00000 n 
+0002357661 00000 n 
+0002360562 00000 n 
+0002360688 00000 n 
+0002360813 00000 n 
+0002360384 00000 n 
+0003706091 00000 n 
+0002364435 00000 n 
+0002363686 00000 n 
+0002361078 00000 n 
+0002364011 00000 n 
+0002364071 00000 n 
+0002364196 00000 n 
+0002364316 00000 n 
+0002363833 00000 n 
+0002367446 00000 n 
+0002366642 00000 n 
+0002364574 00000 n 
+0002366967 00000 n 
+0002367027 00000 n 
+0002367146 00000 n 
+0002367266 00000 n 
+0002367386 00000 n 
+0002366789 00000 n 
+0002370507 00000 n 
+0002369584 00000 n 
+0002367585 00000 n 
+0002369909 00000 n 
+0002370028 00000 n 
+0002370148 00000 n 
+0002370268 00000 n 
+0002370388 00000 n 
+0002369731 00000 n 
+0002374478 00000 n 
+0002372941 00000 n 
+0002370646 00000 n 
+0002373821 00000 n 
+0002373881 00000 n 
+0002373115 00000 n 
+0002374000 00000 n 
+0002373284 00000 n 
+0002373453 00000 n 
+0002374120 00000 n 
+0002374239 00000 n 
+0002374359 00000 n 
+0002373643 00000 n 
+0002378639 00000 n 
+0002377230 00000 n 
+0002374617 00000 n 
+0002378101 00000 n 
+0002378161 00000 n 
+0002378280 00000 n 
+0002377404 00000 n 
+0002378400 00000 n 
+0002377587 00000 n 
+0002378520 00000 n 
+0002377755 00000 n 
+0002377923 00000 n 
+0002383123 00000 n 
+0002381859 00000 n 
+0002378778 00000 n 
+0002382764 00000 n 
+0002382824 00000 n 
+0002382033 00000 n 
+0002382943 00000 n 
+0002382214 00000 n 
+0002383063 00000 n 
+0002382395 00000 n 
+0002382586 00000 n 
+0003706217 00000 n 
+0002387676 00000 n 
+0002386356 00000 n 
+0002383299 00000 n 
+0002387259 00000 n 
+0002387378 00000 n 
+0002386530 00000 n 
+0002387498 00000 n 
+0002386710 00000 n 
+0002387617 00000 n 
+0002386891 00000 n 
+0002387081 00000 n 
+0002392279 00000 n 
+0002390574 00000 n 
+0002387852 00000 n 
+0002391801 00000 n 
+0002391921 00000 n 
+0002390766 00000 n 
+0002392040 00000 n 
+0002390935 00000 n 
+0002391106 00000 n 
+0002392160 00000 n 
+0002391279 00000 n 
+0002391450 00000 n 
+0002391623 00000 n 
+0002396996 00000 n 
+0002395117 00000 n 
+0002392431 00000 n 
+0002396517 00000 n 
+0002396577 00000 n 
+0002395318 00000 n 
+0002395486 00000 n 
+0002396696 00000 n 
+0002395659 00000 n 
+0002395825 00000 n 
+0002396816 00000 n 
+0002395998 00000 n 
+0002396936 00000 n 
+0002396169 00000 n 
+0002396339 00000 n 
+0002401305 00000 n 
+0002399897 00000 n 
+0002397148 00000 n 
+0002400826 00000 n 
+0002400071 00000 n 
+0002400946 00000 n 
+0002401066 00000 n 
+0002401186 00000 n 
+0002400244 00000 n 
+0002400419 00000 n 
+0002400648 00000 n 
+0002405741 00000 n 
+0002404190 00000 n 
+0002401506 00000 n 
+0002405318 00000 n 
+0002405378 00000 n 
+0002404373 00000 n 
+0002404563 00000 n 
+0002405497 00000 n 
+0002405616 00000 n 
+0002404752 00000 n 
+0002404947 00000 n 
+0002405140 00000 n 
+0002411043 00000 n 
+0002409099 00000 n 
+0002405892 00000 n 
+0002410428 00000 n 
+0002410488 00000 n 
+0002409291 00000 n 
+0002409522 00000 n 
+0002410613 00000 n 
+0002409697 00000 n 
+0002409887 00000 n 
+0002410076 00000 n 
+0002410738 00000 n 
+0002410798 00000 n 
+0002410918 00000 n 
+0002410250 00000 n 
+0003706343 00000 n 
+0002414711 00000 n 
+0002413764 00000 n 
+0002411194 00000 n 
+0002414089 00000 n 
+0002414149 00000 n 
+0002414274 00000 n 
+0002414399 00000 n 
+0002414525 00000 n 
+0002414651 00000 n 
+0002413911 00000 n 
+0002417729 00000 n 
+0002416901 00000 n 
+0002414837 00000 n 
+0002417226 00000 n 
+0002417352 00000 n 
+0002417478 00000 n 
+0002417604 00000 n 
+0002417048 00000 n 
+0002426778 00000 n 
+0002420655 00000 n 
+0002417868 00000 n 
+0002426363 00000 n 
+0002426423 00000 n 
+0002426541 00000 n 
+0002426718 00000 n 
+0002421018 00000 n 
+0002421260 00000 n 
+0002421468 00000 n 
+0002421676 00000 n 
+0002421918 00000 n 
+0002422118 00000 n 
+0002422360 00000 n 
+0002422560 00000 n 
+0002422802 00000 n 
+0002423002 00000 n 
+0002423244 00000 n 
+0002423444 00000 n 
+0002423686 00000 n 
+0002423881 00000 n 
+0002424087 00000 n 
+0002424328 00000 n 
+0002424524 00000 n 
+0002424731 00000 n 
+0002424973 00000 n 
+0002425159 00000 n 
+0002425365 00000 n 
+0002425606 00000 n 
+0002425790 00000 n 
+0002425979 00000 n 
+0002426185 00000 n 
+0002515034 00000 n 
+0002515154 00000 n 
+0002515274 00000 n 
+0002515393 00000 n 
+0002518068 00000 n 
+0002518188 00000 n 
+0002518308 00000 n 
+0002521132 00000 n 
+0002521252 00000 n 
+0002438535 00000 n 
+0002430189 00000 n 
+0002426945 00000 n 
+0002437816 00000 n 
+0002430624 00000 n 
+0002430866 00000 n 
+0002431056 00000 n 
+0002431264 00000 n 
+0002431506 00000 n 
+0002431704 00000 n 
+0002437876 00000 n 
+0002431912 00000 n 
+0002432153 00000 n 
+0002432360 00000 n 
+0002432567 00000 n 
+0002432809 00000 n 
+0002433018 00000 n 
+0002437936 00000 n 
+0002433226 00000 n 
+0002433435 00000 n 
+0002433677 00000 n 
+0002437996 00000 n 
+0002433886 00000 n 
+0002438056 00000 n 
+0002434128 00000 n 
+0002434336 00000 n 
+0002438116 00000 n 
+0002434578 00000 n 
+0002434786 00000 n 
+0002435028 00000 n 
+0002435221 00000 n 
+0002438176 00000 n 
+0002435395 00000 n 
+0002438236 00000 n 
+0002435637 00000 n 
+0002438296 00000 n 
+0002435878 00000 n 
+0002436078 00000 n 
+0002438356 00000 n 
+0002436318 00000 n 
+0002436518 00000 n 
+0002438416 00000 n 
+0002436758 00000 n 
+0002436958 00000 n 
+0002438476 00000 n 
+0002437200 00000 n 
+0002437398 00000 n 
+0002437638 00000 n 
+0002521372 00000 n 
+0002524371 00000 n 
+0002524490 00000 n 
+0002451168 00000 n 
+0002442346 00000 n 
+0002438689 00000 n 
+0002450629 00000 n 
+0002450689 00000 n 
+0002442808 00000 n 
+0002443009 00000 n 
+0002443251 00000 n 
+0002450748 00000 n 
+0002443443 00000 n 
+0002443644 00000 n 
+0002443886 00000 n 
+0002450808 00000 n 
+0002444078 00000 n 
+0002444279 00000 n 
+0002444521 00000 n 
+0002450868 00000 n 
+0002444712 00000 n 
+0002450928 00000 n 
+0002444954 00000 n 
+0002450988 00000 n 
+0002445195 00000 n 
+0002445437 00000 n 
+0002445679 00000 n 
+0002451048 00000 n 
+0002445888 00000 n 
+0002451108 00000 n 
+0002446129 00000 n 
+0002446371 00000 n 
+0002446613 00000 n 
+0002446802 00000 n 
+0002447044 00000 n 
+0002447244 00000 n 
+0002447486 00000 n 
+0002447686 00000 n 
+0002447928 00000 n 
+0002448128 00000 n 
+0002448336 00000 n 
+0002448544 00000 n 
+0002448786 00000 n 
+0002448986 00000 n 
+0002449194 00000 n 
+0002449402 00000 n 
+0002449593 00000 n 
+0002449835 00000 n 
+0002450035 00000 n 
+0002450243 00000 n 
+0002450451 00000 n 
+0002524790 00000 n 
+0002524916 00000 n 
+0002527835 00000 n 
+0002527955 00000 n 
+0002528075 00000 n 
+0002528195 00000 n 
+0002531585 00000 n 
+0002463862 00000 n 
+0002455313 00000 n 
+0002451308 00000 n 
+0002463742 00000 n 
+0002455784 00000 n 
+0002456026 00000 n 
+0002456226 00000 n 
+0002456434 00000 n 
+0002456642 00000 n 
+0002456831 00000 n 
+0002457073 00000 n 
+0002457282 00000 n 
+0002457524 00000 n 
+0002463802 00000 n 
+0002457733 00000 n 
+0002457975 00000 n 
+0002458217 00000 n 
+0002458408 00000 n 
+0002458650 00000 n 
+0002458842 00000 n 
+0002459083 00000 n 
+0002459275 00000 n 
+0002459517 00000 n 
+0002459709 00000 n 
+0002459951 00000 n 
+0002460151 00000 n 
+0002460393 00000 n 
+0002460593 00000 n 
+0002460835 00000 n 
+0002461035 00000 n 
+0002461277 00000 n 
+0002461477 00000 n 
+0002461719 00000 n 
+0002461919 00000 n 
+0002462160 00000 n 
+0002462360 00000 n 
+0002462602 00000 n 
+0002462791 00000 n 
+0002462959 00000 n 
+0002463201 00000 n 
+0002463397 00000 n 
+0002463564 00000 n 
+0003706469 00000 n 
+0002531711 00000 n 
+0002534656 00000 n 
+0002534782 00000 n 
+0002534902 00000 n 
+0002535022 00000 n 
+0002537473 00000 n 
+0002537591 00000 n 
+0002537710 00000 n 
+0002537829 00000 n 
+0002540400 00000 n 
+0002540520 00000 n 
+0002540640 00000 n 
+0002544189 00000 n 
+0002544309 00000 n 
+0002544429 00000 n 
+0002481637 00000 n 
+0002469263 00000 n 
+0002464002 00000 n 
+0002481577 00000 n 
+0002469914 00000 n 
+0002470156 00000 n 
+0002470365 00000 n 
+0002470607 00000 n 
+0002470816 00000 n 
+0002471058 00000 n 
+0002471267 00000 n 
+0002471509 00000 n 
+0002471716 00000 n 
+0002471957 00000 n 
+0002472147 00000 n 
+0002472347 00000 n 
+0002472530 00000 n 
+0002472770 00000 n 
+0002472958 00000 n 
+0002473156 00000 n 
+0002473338 00000 n 
+0002473580 00000 n 
+0002473770 00000 n 
+0002473978 00000 n 
+0002474178 00000 n 
+0002474359 00000 n 
+0002474533 00000 n 
+0002474774 00000 n 
+0002474963 00000 n 
+0002475171 00000 n 
+0002475371 00000 n 
+0002475571 00000 n 
+0002475752 00000 n 
+0002475927 00000 n 
+0002476100 00000 n 
+0002476342 00000 n 
+0002476542 00000 n 
+0002476750 00000 n 
+0002476950 00000 n 
+0002477131 00000 n 
+0002477306 00000 n 
+0002477547 00000 n 
+0002477746 00000 n 
+0002477954 00000 n 
+0002478154 00000 n 
+0002478335 00000 n 
+0002478510 00000 n 
+0002478752 00000 n 
+0002478942 00000 n 
+0002479142 00000 n 
+0002479342 00000 n 
+0002479542 00000 n 
+0002479733 00000 n 
+0002479974 00000 n 
+0002480163 00000 n 
+0002480362 00000 n 
+0002480562 00000 n 
+0002480762 00000 n 
+0002480952 00000 n 
+0002481192 00000 n 
+0002481399 00000 n 
+0002544549 00000 n 
+0002547677 00000 n 
+0002547797 00000 n 
+0002547917 00000 n 
+0002548037 00000 n 
+0002552286 00000 n 
+0002552406 00000 n 
+0002552526 00000 n 
+0002557884 00000 n 
+0002558003 00000 n 
+0002562030 00000 n 
+0002562149 00000 n 
+0002562268 00000 n 
+0002493603 00000 n 
+0002485833 00000 n 
+0002481833 00000 n 
+0002493064 00000 n 
+0002486259 00000 n 
+0002486432 00000 n 
+0002493124 00000 n 
+0002486601 00000 n 
+0002486843 00000 n 
+0002487085 00000 n 
+0002487294 00000 n 
+0002487536 00000 n 
+0002487744 00000 n 
+0002487985 00000 n 
+0002488192 00000 n 
+0002488434 00000 n 
+0002488641 00000 n 
+0002488815 00000 n 
+0002488983 00000 n 
+0002489151 00000 n 
+0002489393 00000 n 
+0002489588 00000 n 
+0002489830 00000 n 
+0002490038 00000 n 
+0002490280 00000 n 
+0002490475 00000 n 
+0002490717 00000 n 
+0002490907 00000 n 
+0002491115 00000 n 
+0002491357 00000 n 
+0002491553 00000 n 
+0002493184 00000 n 
+0002491743 00000 n 
+0002493244 00000 n 
+0002491985 00000 n 
+0002492227 00000 n 
+0002493304 00000 n 
+0002493363 00000 n 
+0002493423 00000 n 
+0002493483 00000 n 
+0002493543 00000 n 
+0002492436 00000 n 
+0002492644 00000 n 
+0002492886 00000 n 
+0002566212 00000 n 
+0002566332 00000 n 
+0002566451 00000 n 
+0002571674 00000 n 
+0002571794 00000 n 
+0002571914 00000 n 
+0002572034 00000 n 
+0002577046 00000 n 
+0002577172 00000 n 
+0002501591 00000 n 
+0002496282 00000 n 
+0002493770 00000 n 
+0002500695 00000 n 
+0002500755 00000 n 
+0002496582 00000 n 
+0002496790 00000 n 
+0002497032 00000 n 
+0002500814 00000 n 
+0002497274 00000 n 
+0002497482 00000 n 
+0002500874 00000 n 
+0002500934 00000 n 
+0002497724 00000 n 
+0002500994 00000 n 
+0002497966 00000 n 
+0002501054 00000 n 
+0002501113 00000 n 
+0002498206 00000 n 
+0002501172 00000 n 
+0002498448 00000 n 
+0002501231 00000 n 
+0002498689 00000 n 
+0002501291 00000 n 
+0002501351 00000 n 
+0002498931 00000 n 
+0002501411 00000 n 
+0002499173 00000 n 
+0002501471 00000 n 
+0002499415 00000 n 
+0002501531 00000 n 
+0002499657 00000 n 
+0002499896 00000 n 
+0002500102 00000 n 
+0002500308 00000 n 
+0002500517 00000 n 
+0002581085 00000 n 
+0002524670 00000 n 
+0002581271 00000 n 
+0002509028 00000 n 
+0002505417 00000 n 
+0002501731 00000 n 
+0002508789 00000 n 
+0002505690 00000 n 
+0002505932 00000 n 
+0002508849 00000 n 
+0002506141 00000 n 
+0002506383 00000 n 
+0002506592 00000 n 
+0002506801 00000 n 
+0002507010 00000 n 
+0002507252 00000 n 
+0002507461 00000 n 
+0002507667 00000 n 
+0002508908 00000 n 
+0002508968 00000 n 
+0002507876 00000 n 
+0002508071 00000 n 
+0002508268 00000 n 
+0002508454 00000 n 
+0002508611 00000 n 
+0002581391 00000 n 
+0002581517 00000 n 
+0002581643 00000 n 
+0002512487 00000 n 
+0002511456 00000 n 
+0002509230 00000 n 
+0002512427 00000 n 
+0002511630 00000 n 
+0002511871 00000 n 
+0002512057 00000 n 
+0002512249 00000 n 
+0002515512 00000 n 
+0002514590 00000 n 
+0002512649 00000 n 
+0002514915 00000 n 
+0002514975 00000 n 
+0002515094 00000 n 
+0002515214 00000 n 
+0002515334 00000 n 
+0002515453 00000 n 
+0002514737 00000 n 
+0003706595 00000 n 
+0002518428 00000 n 
+0002517683 00000 n 
+0002515638 00000 n 
+0002518008 00000 n 
+0002518128 00000 n 
+0002518248 00000 n 
+0002518368 00000 n 
+0002517830 00000 n 
+0002521492 00000 n 
+0002520747 00000 n 
+0002518554 00000 n 
+0002521072 00000 n 
+0002521192 00000 n 
+0002521312 00000 n 
+0002521432 00000 n 
+0002520894 00000 n 
+0002524975 00000 n 
+0002523986 00000 n 
+0002521618 00000 n 
+0002524311 00000 n 
+0002524430 00000 n 
+0002524550 00000 n 
+0002524610 00000 n 
+0002524730 00000 n 
+0002524856 00000 n 
+0002524133 00000 n 
+0002528260 00000 n 
+0002527391 00000 n 
+0002525114 00000 n 
+0002527716 00000 n 
+0002527776 00000 n 
+0002527895 00000 n 
+0002528015 00000 n 
+0002528135 00000 n 
+0002527538 00000 n 
+0002531837 00000 n 
+0002531141 00000 n 
+0002528399 00000 n 
+0002531466 00000 n 
+0002531526 00000 n 
+0002531651 00000 n 
+0002531777 00000 n 
+0002531288 00000 n 
+0002535082 00000 n 
+0002534271 00000 n 
+0002531976 00000 n 
+0002534596 00000 n 
+0002534722 00000 n 
+0002534842 00000 n 
+0002534962 00000 n 
+0002534418 00000 n 
+0003706721 00000 n 
+0002537889 00000 n 
+0002537029 00000 n 
+0002535221 00000 n 
+0002537354 00000 n 
+0002537414 00000 n 
+0002537533 00000 n 
+0002537650 00000 n 
+0002537770 00000 n 
+0002537176 00000 n 
+0002540760 00000 n 
+0002539956 00000 n 
+0002538028 00000 n 
+0002540281 00000 n 
+0002540341 00000 n 
+0002540460 00000 n 
+0002540580 00000 n 
+0002540700 00000 n 
+0002540103 00000 n 
+0002544608 00000 n 
+0002543249 00000 n 
+0002540899 00000 n 
+0002544129 00000 n 
+0002544249 00000 n 
+0002544369 00000 n 
+0002543423 00000 n 
+0002544489 00000 n 
+0002543592 00000 n 
+0002543761 00000 n 
+0002543951 00000 n 
+0002548157 00000 n 
+0002547041 00000 n 
+0002544747 00000 n 
+0002547558 00000 n 
+0002547618 00000 n 
+0002547737 00000 n 
+0002547857 00000 n 
+0002547977 00000 n 
+0002548097 00000 n 
+0002547197 00000 n 
+0002547380 00000 n 
+0002552585 00000 n 
+0002551131 00000 n 
+0002548296 00000 n 
+0002552226 00000 n 
+0002552346 00000 n 
+0002551314 00000 n 
+0002552466 00000 n 
+0002551497 00000 n 
+0002551678 00000 n 
+0002551853 00000 n 
+0002552048 00000 n 
+0002558123 00000 n 
+0002555915 00000 n 
+0002552761 00000 n 
+0002557765 00000 n 
+0002557825 00000 n 
+0002556134 00000 n 
+0002556315 00000 n 
+0002556489 00000 n 
+0002557944 00000 n 
+0002556684 00000 n 
+0002556862 00000 n 
+0002557037 00000 n 
+0002558063 00000 n 
+0002557231 00000 n 
+0002557412 00000 n 
+0002557587 00000 n 
+0003706847 00000 n 
+0002562328 00000 n 
+0002561043 00000 n 
+0002558299 00000 n 
+0002561970 00000 n 
+0002561217 00000 n 
+0002562089 00000 n 
+0002561411 00000 n 
+0002562209 00000 n 
+0002561602 00000 n 
+0002561792 00000 n 
+0002566571 00000 n 
+0002564975 00000 n 
+0002562504 00000 n 
+0002566093 00000 n 
+0002566153 00000 n 
+0002565158 00000 n 
+0002565331 00000 n 
+0002566272 00000 n 
+0002565500 00000 n 
+0002566392 00000 n 
+0002565673 00000 n 
+0002566511 00000 n 
+0002565915 00000 n 
+0002572154 00000 n 
+0002569649 00000 n 
+0002566723 00000 n 
+0002571614 00000 n 
+0002569868 00000 n 
+0002571734 00000 n 
+0002570109 00000 n 
+0002570284 00000 n 
+0002570453 00000 n 
+0002570620 00000 n 
+0002571854 00000 n 
+0002570861 00000 n 
+0002571051 00000 n 
+0002571974 00000 n 
+0002572094 00000 n 
+0002571241 00000 n 
+0002571436 00000 n 
+0002577298 00000 n 
+0002575577 00000 n 
+0002572293 00000 n 
+0002576986 00000 n 
+0002575769 00000 n 
+0002575964 00000 n 
+0002577112 00000 n 
+0002576158 00000 n 
+0002576400 00000 n 
+0002577238 00000 n 
+0002576619 00000 n 
+0002576808 00000 n 
+0002581826 00000 n 
+0002580274 00000 n 
+0002577449 00000 n 
+0002581025 00000 n 
+0002580439 00000 n 
+0002580628 00000 n 
+0002581151 00000 n 
+0002581211 00000 n 
+0002581331 00000 n 
+0002581457 00000 n 
+0002581583 00000 n 
+0002581708 00000 n 
+0002580847 00000 n 
+0002585410 00000 n 
+0002614104 00000 n 
+0002585020 00000 n 
+0002581977 00000 n 
+0002613747 00000 n 
+0002607873 00000 n 
+0002613865 00000 n 
+0002608063 00000 n 
+0002608296 00000 n 
+0002608504 00000 n 
+0002608712 00000 n 
+0002608912 00000 n 
+0002609145 00000 n 
+0002609344 00000 n 
+0002609552 00000 n 
+0002609783 00000 n 
+0002609981 00000 n 
+0002613925 00000 n 
+0002610187 00000 n 
+0002610420 00000 n 
+0002610629 00000 n 
+0002610837 00000 n 
+0002613984 00000 n 
+0002611037 00000 n 
+0002611270 00000 n 
+0002611470 00000 n 
+0002614044 00000 n 
+0002611670 00000 n 
+0002611902 00000 n 
+0002612101 00000 n 
+0002612300 00000 n 
+0002612533 00000 n 
+0002612728 00000 n 
+0002612936 00000 n 
+0002613168 00000 n 
+0002613363 00000 n 
+0002613569 00000 n 
+0003706973 00000 n 
+0002586182 00000 n 
+0002586302 00000 n 
+0002586350 00000 n 
+0002586753 00000 n 
+0002586775 00000 n 
+0002586994 00000 n 
+0002607849 00000 n 
+0002695920 00000 n 
+0002696040 00000 n 
+0002696160 00000 n 
+0002696285 00000 n 
+0002698970 00000 n 
+0002625088 00000 n 
+0002617541 00000 n 
+0002614287 00000 n 
+0002624610 00000 n 
+0002617958 00000 n 
+0002618191 00000 n 
+0002618377 00000 n 
+0002618585 00000 n 
+0002618818 00000 n 
+0002619016 00000 n 
+0002619224 00000 n 
+0002619457 00000 n 
+0002619648 00000 n 
+0002619855 00000 n 
+0002620088 00000 n 
+0002620273 00000 n 
+0002620463 00000 n 
+0002624670 00000 n 
+0002620671 00000 n 
+0002620879 00000 n 
+0002624730 00000 n 
+0002621112 00000 n 
+0002621320 00000 n 
+0002624789 00000 n 
+0002621553 00000 n 
+0002624849 00000 n 
+0002621786 00000 n 
+0002624909 00000 n 
+0002622019 00000 n 
+0002624969 00000 n 
+0002622252 00000 n 
+0002622485 00000 n 
+0002622718 00000 n 
+0002625028 00000 n 
+0002622917 00000 n 
+0002623150 00000 n 
+0002623383 00000 n 
+0002623572 00000 n 
+0002623804 00000 n 
+0002624003 00000 n 
+0002624234 00000 n 
+0002624432 00000 n 
+0002699090 00000 n 
+0002699210 00000 n 
+0002702099 00000 n 
+0002702219 00000 n 
+0002704922 00000 n 
+0002705042 00000 n 
+0002705162 00000 n 
+0002705282 00000 n 
+0002639170 00000 n 
+0002629219 00000 n 
+0002625242 00000 n 
+0002638870 00000 n 
+0002629744 00000 n 
+0002629977 00000 n 
+0002630177 00000 n 
+0002630385 00000 n 
+0002630593 00000 n 
+0002630826 00000 n 
+0002631026 00000 n 
+0002631234 00000 n 
+0002631442 00000 n 
+0002631632 00000 n 
+0002631865 00000 n 
+0002632065 00000 n 
+0002632273 00000 n 
+0002632481 00000 n 
+0002632714 00000 n 
+0002632914 00000 n 
+0002633122 00000 n 
+0002633330 00000 n 
+0002633520 00000 n 
+0002633751 00000 n 
+0002633951 00000 n 
+0002634182 00000 n 
+0002634380 00000 n 
+0002634613 00000 n 
+0002634811 00000 n 
+0002635043 00000 n 
+0002638930 00000 n 
+0002635242 00000 n 
+0002635474 00000 n 
+0002635675 00000 n 
+0002635908 00000 n 
+0002636100 00000 n 
+0002636299 00000 n 
+0002636530 00000 n 
+0002636719 00000 n 
+0002636920 00000 n 
+0002637153 00000 n 
+0002638990 00000 n 
+0002637345 00000 n 
+0002637553 00000 n 
+0002639050 00000 n 
+0002637786 00000 n 
+0002637994 00000 n 
+0002638227 00000 n 
+0002639110 00000 n 
+0002638459 00000 n 
+0002638692 00000 n 
+0002705401 00000 n 
+0002708564 00000 n 
+0002708690 00000 n 
+0002711874 00000 n 
+0002712000 00000 n 
+0002712126 00000 n 
+0002714731 00000 n 
+0002714849 00000 n 
+0002714969 00000 n 
+0002715089 00000 n 
+0002715207 00000 n 
+0002717885 00000 n 
+0002650783 00000 n 
+0002642812 00000 n 
+0002639310 00000 n 
+0002650663 00000 n 
+0002643265 00000 n 
+0002643498 00000 n 
+0002643731 00000 n 
+0002643922 00000 n 
+0002644155 00000 n 
+0002644347 00000 n 
+0002644580 00000 n 
+0002644771 00000 n 
+0002645004 00000 n 
+0002645204 00000 n 
+0002645437 00000 n 
+0002645637 00000 n 
+0002645869 00000 n 
+0002646069 00000 n 
+0002646299 00000 n 
+0002646489 00000 n 
+0002646722 00000 n 
+0002646914 00000 n 
+0002647147 00000 n 
+0002647338 00000 n 
+0002647571 00000 n 
+0002647771 00000 n 
+0002648003 00000 n 
+0002648202 00000 n 
+0002648435 00000 n 
+0002648635 00000 n 
+0002648868 00000 n 
+0002649057 00000 n 
+0002649226 00000 n 
+0002649458 00000 n 
+0002649653 00000 n 
+0002650723 00000 n 
+0002649821 00000 n 
+0002650054 00000 n 
+0002650286 00000 n 
+0002650485 00000 n 
+0002718005 00000 n 
+0002718131 00000 n 
+0002718251 00000 n 
+0002721354 00000 n 
+0002721474 00000 n 
+0002724988 00000 n 
+0002725108 00000 n 
+0002725348 00000 n 
+0002728737 00000 n 
+0002728976 00000 n 
+0002729095 00000 n 
+0002733218 00000 n 
+0002666983 00000 n 
+0002655879 00000 n 
+0002650923 00000 n 
+0002666864 00000 n 
+0002656476 00000 n 
+0002656709 00000 n 
+0002666924 00000 n 
+0002656909 00000 n 
+0002657142 00000 n 
+0002657342 00000 n 
+0002657575 00000 n 
+0002657774 00000 n 
+0002658007 00000 n 
+0002658207 00000 n 
+0002658399 00000 n 
+0002658631 00000 n 
+0002658821 00000 n 
+0002659021 00000 n 
+0002659204 00000 n 
+0002659436 00000 n 
+0002659625 00000 n 
+0002659824 00000 n 
+0002660007 00000 n 
+0002660240 00000 n 
+0002660430 00000 n 
+0002660638 00000 n 
+0002660838 00000 n 
+0002661019 00000 n 
+0002661251 00000 n 
+0002661440 00000 n 
+0002661648 00000 n 
+0002661848 00000 n 
+0002662048 00000 n 
+0002662229 00000 n 
+0002662459 00000 n 
+0002662656 00000 n 
+0002662861 00000 n 
+0002663061 00000 n 
+0002663242 00000 n 
+0002663474 00000 n 
+0002663673 00000 n 
+0002663881 00000 n 
+0002664081 00000 n 
+0002664262 00000 n 
+0002664495 00000 n 
+0002664685 00000 n 
+0002664885 00000 n 
+0002665085 00000 n 
+0002665285 00000 n 
+0002665476 00000 n 
+0002665708 00000 n 
+0002665897 00000 n 
+0002666096 00000 n 
+0002666296 00000 n 
+0002666495 00000 n 
+0002666686 00000 n 
+0002733463 00000 n 
+0002733582 00000 n 
+0002737516 00000 n 
+0002737636 00000 n 
+0002737755 00000 n 
+0002742200 00000 n 
+0002742320 00000 n 
+0002742439 00000 n 
+0002746974 00000 n 
+0002747094 00000 n 
+0002679078 00000 n 
+0002671328 00000 n 
+0002667179 00000 n 
+0002678719 00000 n 
+0002671763 00000 n 
+0002671996 00000 n 
+0002672196 00000 n 
+0002672368 00000 n 
+0002672601 00000 n 
+0002672834 00000 n 
+0002673034 00000 n 
+0002673210 00000 n 
+0002673443 00000 n 
+0002673643 00000 n 
+0002678779 00000 n 
+0002673819 00000 n 
+0002674019 00000 n 
+0002674252 00000 n 
+0002678838 00000 n 
+0002674452 00000 n 
+0002674651 00000 n 
+0002674883 00000 n 
+0002678898 00000 n 
+0002675082 00000 n 
+0002675313 00000 n 
+0002678958 00000 n 
+0002675511 00000 n 
+0002675743 00000 n 
+0002679018 00000 n 
+0002675950 00000 n 
+0002676182 00000 n 
+0002676389 00000 n 
+0002676620 00000 n 
+0002676816 00000 n 
+0002677048 00000 n 
+0002677242 00000 n 
+0002677475 00000 n 
+0002677683 00000 n 
+0002677916 00000 n 
+0002678147 00000 n 
+0002678335 00000 n 
+0002678541 00000 n 
+0002751920 00000 n 
+0002752039 00000 n 
+0002752165 00000 n 
+0002752291 00000 n 
+0002757283 00000 n 
+0002757403 00000 n 
+0002757529 00000 n 
+0002757649 00000 n 
+0002762795 00000 n 
+0002690953 00000 n 
+0002682961 00000 n 
+0002679232 00000 n 
+0002690594 00000 n 
+0002683414 00000 n 
+0002683647 00000 n 
+0002683843 00000 n 
+0002690654 00000 n 
+0002690714 00000 n 
+0002684033 00000 n 
+0002684241 00000 n 
+0002690774 00000 n 
+0002684474 00000 n 
+0002684706 00000 n 
+0002684899 00000 n 
+0002685132 00000 n 
+0002685325 00000 n 
+0002685518 00000 n 
+0002685717 00000 n 
+0002685913 00000 n 
+0002690834 00000 n 
+0002686145 00000 n 
+0002686377 00000 n 
+0002686574 00000 n 
+0002686774 00000 n 
+0002686971 00000 n 
+0002687168 00000 n 
+0002687354 00000 n 
+0002687554 00000 n 
+0002687740 00000 n 
+0002687973 00000 n 
+0002688159 00000 n 
+0002690894 00000 n 
+0002688345 00000 n 
+0002688578 00000 n 
+0002688764 00000 n 
+0002688964 00000 n 
+0002689150 00000 n 
+0002689383 00000 n 
+0002689583 00000 n 
+0002689816 00000 n 
+0002690016 00000 n 
+0002690216 00000 n 
+0002690416 00000 n 
+0003707099 00000 n 
+0002762921 00000 n 
+0002763107 00000 n 
+0002768681 00000 n 
+0002768801 00000 n 
+0002768921 00000 n 
+0002769041 00000 n 
+0002769161 00000 n 
+0002696345 00000 n 
+0002693688 00000 n 
+0002691120 00000 n 
+0002695681 00000 n 
+0002693907 00000 n 
+0002694139 00000 n 
+0002694333 00000 n 
+0002694532 00000 n 
+0002695741 00000 n 
+0002695801 00000 n 
+0002694725 00000 n 
+0002694920 00000 n 
+0002695117 00000 n 
+0002695861 00000 n 
+0002695980 00000 n 
+0002695303 00000 n 
+0002696100 00000 n 
+0002696225 00000 n 
+0002695503 00000 n 
+0002775907 00000 n 
+0002699269 00000 n 
+0002698526 00000 n 
+0002696485 00000 n 
+0002698851 00000 n 
+0002698911 00000 n 
+0002699030 00000 n 
+0002699150 00000 n 
+0002698673 00000 n 
+0002702339 00000 n 
+0002701655 00000 n 
+0002699395 00000 n 
+0002701980 00000 n 
+0002702040 00000 n 
+0002702159 00000 n 
+0002702279 00000 n 
+0002701802 00000 n 
+0002705461 00000 n 
+0002704478 00000 n 
+0002702465 00000 n 
+0002704803 00000 n 
+0002704863 00000 n 
+0002704982 00000 n 
+0002705102 00000 n 
+0003464923 00000 n 
+0003462757 00000 n 
+0003464754 00000 n 
+0002705222 00000 n 
+0002705342 00000 n 
+0002704625 00000 n 
+0002708816 00000 n 
+0002708120 00000 n 
+0002705639 00000 n 
+0002708445 00000 n 
+0002708505 00000 n 
+0002708630 00000 n 
+0002708756 00000 n 
+0002708267 00000 n 
+0002712186 00000 n 
+0002711489 00000 n 
+0002708955 00000 n 
+0002711814 00000 n 
+0002711940 00000 n 
+0002712066 00000 n 
+0002711636 00000 n 
+0003707225 00000 n 
+0002715266 00000 n 
+0002714287 00000 n 
+0002712338 00000 n 
+0002714612 00000 n 
+0002714672 00000 n 
+0002714790 00000 n 
+0002714909 00000 n 
+0002715029 00000 n 
+0002715148 00000 n 
+0002714434 00000 n 
+0002718491 00000 n 
+0002717441 00000 n 
+0002715418 00000 n 
+0002717766 00000 n 
+0002717826 00000 n 
+0002717945 00000 n 
+0002718071 00000 n 
+0002718191 00000 n 
+0002718311 00000 n 
+0002718431 00000 n 
+0002717588 00000 n 
+0002721713 00000 n 
+0002720578 00000 n 
+0002718630 00000 n 
+0002721294 00000 n 
+0002720743 00000 n 
+0002720918 00000 n 
+0002721414 00000 n 
+0002721534 00000 n 
+0002721654 00000 n 
+0002721116 00000 n 
+0002725468 00000 n 
+0002723821 00000 n 
+0002721852 00000 n 
+0002724928 00000 n 
+0002724004 00000 n 
+0002724179 00000 n 
+0002725048 00000 n 
+0002725168 00000 n 
+0002725288 00000 n 
+0002724377 00000 n 
+0002724552 00000 n 
+0002725408 00000 n 
+0002724750 00000 n 
+0002729154 00000 n 
+0002727783 00000 n 
+0002725607 00000 n 
+0002728677 00000 n 
+0002728797 00000 n 
+0002728916 00000 n 
+0002727957 00000 n 
+0002728132 00000 n 
+0002729036 00000 n 
+0002728330 00000 n 
+0002728499 00000 n 
+0002733702 00000 n 
+0002731808 00000 n 
+0002729293 00000 n 
+0002733099 00000 n 
+0002733159 00000 n 
+0002732000 00000 n 
+0002732169 00000 n 
+0002733278 00000 n 
+0002733403 00000 n 
+0002732359 00000 n 
+0002732533 00000 n 
+0002733523 00000 n 
+0002733642 00000 n 
+0002732730 00000 n 
+0002732921 00000 n 
+0003707351 00000 n 
+0002737875 00000 n 
+0002736559 00000 n 
+0002733841 00000 n 
+0002737456 00000 n 
+0002737576 00000 n 
+0002736733 00000 n 
+0002737696 00000 n 
+0002736914 00000 n 
+0002737815 00000 n 
+0002737097 00000 n 
+0002737278 00000 n 
+0002742499 00000 n 
+0002740827 00000 n 
+0002738051 00000 n 
+0002742140 00000 n 
+0002741019 00000 n 
+0002742260 00000 n 
+0002741213 00000 n 
+0002741394 00000 n 
+0002742380 00000 n 
+0002741589 00000 n 
+0002741768 00000 n 
+0002741962 00000 n 
+0002747213 00000 n 
+0002745739 00000 n 
+0002742675 00000 n 
+0002746855 00000 n 
+0002746915 00000 n 
+0002745922 00000 n 
+0002746103 00000 n 
+0002747034 00000 n 
+0002746296 00000 n 
+0002747153 00000 n 
+0002746487 00000 n 
+0002746677 00000 n 
+0002752357 00000 n 
+0002750652 00000 n 
+0002747389 00000 n 
+0002751860 00000 n 
+0002751979 00000 n 
+0002750844 00000 n 
+0002751017 00000 n 
+0002752105 00000 n 
+0002752231 00000 n 
+0002751189 00000 n 
+0002751365 00000 n 
+0002751523 00000 n 
+0002751682 00000 n 
+0002757708 00000 n 
+0002755656 00000 n 
+0002752521 00000 n 
+0002757164 00000 n 
+0002757224 00000 n 
+0002755857 00000 n 
+0002756033 00000 n 
+0002756233 00000 n 
+0002757343 00000 n 
+0002756431 00000 n 
+0002757469 00000 n 
+0002756607 00000 n 
+0002756797 00000 n 
+0002757589 00000 n 
+0002756986 00000 n 
+0002763227 00000 n 
+0002761022 00000 n 
+0002757860 00000 n 
+0002762676 00000 n 
+0002762736 00000 n 
+0002761223 00000 n 
+0002762861 00000 n 
+0002761448 00000 n 
+0002761681 00000 n 
+0002762987 00000 n 
+0002761900 00000 n 
+0002762090 00000 n 
+0002762279 00000 n 
+0002763047 00000 n 
+0002763167 00000 n 
+0002762498 00000 n 
+0003707477 00000 n 
+0003017484 00000 n 
+0002769220 00000 n 
+0002766652 00000 n 
+0002763378 00000 n 
+0002768621 00000 n 
+0002768741 00000 n 
+0002768861 00000 n 
+0002766871 00000 n 
+0002767071 00000 n 
+0002767270 00000 n 
+0002768981 00000 n 
+0002767467 00000 n 
+0002767666 00000 n 
+0002767865 00000 n 
+0002769101 00000 n 
+0002768050 00000 n 
+0002768247 00000 n 
+0002768443 00000 n 
+0002776741 00000 n 
+0002771845 00000 n 
+0002769359 00000 n 
+0002775788 00000 n 
+0002775848 00000 n 
+0002775966 00000 n 
+0002776143 00000 n 
+0002776203 00000 n 
+0002772136 00000 n 
+0002772370 00000 n 
+0002776263 00000 n 
+0002772571 00000 n 
+0002776323 00000 n 
+0002776383 00000 n 
+0002772803 00000 n 
+0002773004 00000 n 
+0002776443 00000 n 
+0002773238 00000 n 
+0002773439 00000 n 
+0002776503 00000 n 
+0002773673 00000 n 
+0002773874 00000 n 
+0002776563 00000 n 
+0002774108 00000 n 
+0002774308 00000 n 
+0002776623 00000 n 
+0002774541 00000 n 
+0002774742 00000 n 
+0002776682 00000 n 
+0002774976 00000 n 
+0002775210 00000 n 
+0002775409 00000 n 
+0002775610 00000 n 
+0002782520 00000 n 
+0002783179 00000 n 
+0002779157 00000 n 
+0002776895 00000 n 
+0002782340 00000 n 
+0002779421 00000 n 
+0002779655 00000 n 
+0002779856 00000 n 
+0002780057 00000 n 
+0002780257 00000 n 
+0002780490 00000 n 
+0002780690 00000 n 
+0002780890 00000 n 
+0002781091 00000 n 
+0002781325 00000 n 
+0002781526 00000 n 
+0002781727 00000 n 
+0002781961 00000 n 
+0002782400 00000 n 
+0002782460 00000 n 
+0002782580 00000 n 
+0002782640 00000 n 
+0002782700 00000 n 
+0002782759 00000 n 
+0002782819 00000 n 
+0002782879 00000 n 
+0002782939 00000 n 
+0002782999 00000 n 
+0002783059 00000 n 
+0002782162 00000 n 
+0002791869 00000 n 
+0002785826 00000 n 
+0002783318 00000 n 
+0002791271 00000 n 
+0002791389 00000 n 
+0002791449 00000 n 
+0002786180 00000 n 
+0002786414 00000 n 
+0002791509 00000 n 
+0002786615 00000 n 
+0002791569 00000 n 
+0002791629 00000 n 
+0002786848 00000 n 
+0002787049 00000 n 
+0002791689 00000 n 
+0002787283 00000 n 
+0002787482 00000 n 
+0002791749 00000 n 
+0002787714 00000 n 
+0002787948 00000 n 
+0002788148 00000 n 
+0002788349 00000 n 
+0002788583 00000 n 
+0002788784 00000 n 
+0002788985 00000 n 
+0002789186 00000 n 
+0002789420 00000 n 
+0002789621 00000 n 
+0002789822 00000 n 
+0002790023 00000 n 
+0002790257 00000 n 
+0002790458 00000 n 
+0002790659 00000 n 
+0002790893 00000 n 
+0002791809 00000 n 
+0002791093 00000 n 
+0002817885 00000 n 
+0002818005 00000 n 
+0002818125 00000 n 
+0002818245 00000 n 
+0002818365 00000 n 
+0002793830 00000 n 
+0002818604 00000 n 
+0002793656 00000 n 
+0002792009 00000 n 
+0002817766 00000 n 
+0002817826 00000 n 
+0002817945 00000 n 
+0002818065 00000 n 
+0002818185 00000 n 
+0002818305 00000 n 
+0002818425 00000 n 
+0002817000 00000 n 
+0002817195 00000 n 
+0002817392 00000 n 
+0002817588 00000 n 
+0002794873 00000 n 
+0002794993 00000 n 
+0002795041 00000 n 
+0002795400 00000 n 
+0002795422 00000 n 
+0002795641 00000 n 
+0002816976 00000 n 
+0002828478 00000 n 
+0002821883 00000 n 
+0002818760 00000 n 
+0002826979 00000 n 
+0002827039 00000 n 
+0002827099 00000 n 
+0002827159 00000 n 
+0002827219 00000 n 
+0002822237 00000 n 
+0002827279 00000 n 
+0002822428 00000 n 
+0002827339 00000 n 
+0002822620 00000 n 
+0002827398 00000 n 
+0002822811 00000 n 
+0002823011 00000 n 
+0002827458 00000 n 
+0002823211 00000 n 
+0002823409 00000 n 
+0002827518 00000 n 
+0002823608 00000 n 
+0002823815 00000 n 
+0002827578 00000 n 
+0002824023 00000 n 
+0002827638 00000 n 
+0002824215 00000 n 
+0002824415 00000 n 
+0002827698 00000 n 
+0002824613 00000 n 
+0002827758 00000 n 
+0002824803 00000 n 
+0002827818 00000 n 
+0002824993 00000 n 
+0002825184 00000 n 
+0002827878 00000 n 
+0002825376 00000 n 
+0002827938 00000 n 
+0002825576 00000 n 
+0002827998 00000 n 
+0002825771 00000 n 
+0002828058 00000 n 
+0002825971 00000 n 
+0002828118 00000 n 
+0002826161 00000 n 
+0002828178 00000 n 
+0002828238 00000 n 
+0002828298 00000 n 
+0002828358 00000 n 
+0002828418 00000 n 
+0002826368 00000 n 
+0002826576 00000 n 
+0002826801 00000 n 
+0003707603 00000 n 
+0002840709 00000 n 
+0002831771 00000 n 
+0002828603 00000 n 
+0002839810 00000 n 
+0002839870 00000 n 
+0002839930 00000 n 
+0002832233 00000 n 
+0002832440 00000 n 
+0002839990 00000 n 
+0002832664 00000 n 
+0002832872 00000 n 
+0002833097 00000 n 
+0002840050 00000 n 
+0002833290 00000 n 
+0002833490 00000 n 
+0002840110 00000 n 
+0002833714 00000 n 
+0002833914 00000 n 
+0002840170 00000 n 
+0002834138 00000 n 
+0002834337 00000 n 
+0002840230 00000 n 
+0002834561 00000 n 
+0002834759 00000 n 
+0002840290 00000 n 
+0002834983 00000 n 
+0002835183 00000 n 
+0002840350 00000 n 
+0002835408 00000 n 
+0002835608 00000 n 
+0002840410 00000 n 
+0002835833 00000 n 
+0002836037 00000 n 
+0002840469 00000 n 
+0002836262 00000 n 
+0002836466 00000 n 
+0002836691 00000 n 
+0002836892 00000 n 
+0002837117 00000 n 
+0002837309 00000 n 
+0002837510 00000 n 
+0002837735 00000 n 
+0002837926 00000 n 
+0002838127 00000 n 
+0002838352 00000 n 
+0002840529 00000 n 
+0002838544 00000 n 
+0002840589 00000 n 
+0002838769 00000 n 
+0002840649 00000 n 
+0002838994 00000 n 
+0002839219 00000 n 
+0002839442 00000 n 
+0002839632 00000 n 
+0002943212 00000 n 
+0002943335 00000 n 
+0002943458 00000 n 
+0002943579 00000 n 
+0002852401 00000 n 
+0002844375 00000 n 
+0002840850 00000 n 
+0002852161 00000 n 
+0002852221 00000 n 
+0002844831 00000 n 
+0002852281 00000 n 
+0002845056 00000 n 
+0002852341 00000 n 
+0002845280 00000 n 
+0002845505 00000 n 
+0002845730 00000 n 
+0002845919 00000 n 
+0002846141 00000 n 
+0002846338 00000 n 
+0002846562 00000 n 
+0002846761 00000 n 
+0002846986 00000 n 
+0002847186 00000 n 
+0002847394 00000 n 
+0002847602 00000 n 
+0002847827 00000 n 
+0002848027 00000 n 
+0002848235 00000 n 
+0002848443 00000 n 
+0002848634 00000 n 
+0002848859 00000 n 
+0002849059 00000 n 
+0002849267 00000 n 
+0002849475 00000 n 
+0002849700 00000 n 
+0002849900 00000 n 
+0002850108 00000 n 
+0002850316 00000 n 
+0002850506 00000 n 
+0002850731 00000 n 
+0002850923 00000 n 
+0002851148 00000 n 
+0002851340 00000 n 
+0002851564 00000 n 
+0002851790 00000 n 
+0002851982 00000 n 
+0002943702 00000 n 
+0002943826 00000 n 
+0002943950 00000 n 
+0002946905 00000 n 
+0002947029 00000 n 
+0002947158 00000 n 
+0002950164 00000 n 
+0002950294 00000 n 
+0002950423 00000 n 
+0002953226 00000 n 
+0002953350 00000 n 
+0002864564 00000 n 
+0002856132 00000 n 
+0002852528 00000 n 
+0002864440 00000 n 
+0002856643 00000 n 
+0002856869 00000 n 
+0002857061 00000 n 
+0002857287 00000 n 
+0002857478 00000 n 
+0002857704 00000 n 
+0002864502 00000 n 
+0002857895 00000 n 
+0002858121 00000 n 
+0002858319 00000 n 
+0002858545 00000 n 
+0002858743 00000 n 
+0002858967 00000 n 
+0002859159 00000 n 
+0002859385 00000 n 
+0002859577 00000 n 
+0002859802 00000 n 
+0002860002 00000 n 
+0002860227 00000 n 
+0002860428 00000 n 
+0002860653 00000 n 
+0002860854 00000 n 
+0002861079 00000 n 
+0002861280 00000 n 
+0002861506 00000 n 
+0002861706 00000 n 
+0002861932 00000 n 
+0002862132 00000 n 
+0002862358 00000 n 
+0002862558 00000 n 
+0002862784 00000 n 
+0002862984 00000 n 
+0002863210 00000 n 
+0002863411 00000 n 
+0002863637 00000 n 
+0002863838 00000 n 
+0002864062 00000 n 
+0002864261 00000 n 
+0002957321 00000 n 
+0002957691 00000 n 
+0002960937 00000 n 
+0002961060 00000 n 
+0002964732 00000 n 
+0002967778 00000 n 
+0002971187 00000 n 
+0002974596 00000 n 
+0002877148 00000 n 
+0002868641 00000 n 
+0002864692 00000 n 
+0002876962 00000 n 
+0002869162 00000 n 
+0002869388 00000 n 
+0002869589 00000 n 
+0002869814 00000 n 
+0002870006 00000 n 
+0002870232 00000 n 
+0002870425 00000 n 
+0002870649 00000 n 
+0002870848 00000 n 
+0002871074 00000 n 
+0002871275 00000 n 
+0002871501 00000 n 
+0002871691 00000 n 
+0002871861 00000 n 
+0002872086 00000 n 
+0002872282 00000 n 
+0002872451 00000 n 
+0002872677 00000 n 
+0002872870 00000 n 
+0002873095 00000 n 
+0002873287 00000 n 
+0002873513 00000 n 
+0002873706 00000 n 
+0002873932 00000 n 
+0002877024 00000 n 
+0002874125 00000 n 
+0002874351 00000 n 
+0002874544 00000 n 
+0002874770 00000 n 
+0002874963 00000 n 
+0002877086 00000 n 
+0002875145 00000 n 
+0002875371 00000 n 
+0002875563 00000 n 
+0002875789 00000 n 
+0002875982 00000 n 
+0002876166 00000 n 
+0002876391 00000 n 
+0002876582 00000 n 
+0002876783 00000 n 
+0002974842 00000 n 
+0002977662 00000 n 
+0002977786 00000 n 
+0002977910 00000 n 
+0002978034 00000 n 
+0002978158 00000 n 
+0002981539 00000 n 
+0002981785 00000 n 
+0002985998 00000 n 
+0002986122 00000 n 
+0002986246 00000 n 
+0002894009 00000 n 
+0002882394 00000 n 
+0002877276 00000 n 
+0002893885 00000 n 
+0002883075 00000 n 
+0002883259 00000 n 
+0002883485 00000 n 
+0002883676 00000 n 
+0002883877 00000 n 
+0002884060 00000 n 
+0002884286 00000 n 
+0002884477 00000 n 
+0002884686 00000 n 
+0002884887 00000 n 
+0002885068 00000 n 
+0002885293 00000 n 
+0002885483 00000 n 
+0002885692 00000 n 
+0002885893 00000 n 
+0002886094 00000 n 
+0002886276 00000 n 
+0002886502 00000 n 
+0002886703 00000 n 
+0002886912 00000 n 
+0002887113 00000 n 
+0002887295 00000 n 
+0002887519 00000 n 
+0002887718 00000 n 
+0002887926 00000 n 
+0002888127 00000 n 
+0002888309 00000 n 
+0002888535 00000 n 
+0002888726 00000 n 
+0002888927 00000 n 
+0002889128 00000 n 
+0002889328 00000 n 
+0002889520 00000 n 
+0002889745 00000 n 
+0002889935 00000 n 
+0002890135 00000 n 
+0002890336 00000 n 
+0002890537 00000 n 
+0002890729 00000 n 
+0002890953 00000 n 
+0002891144 00000 n 
+0002893947 00000 n 
+0002891318 00000 n 
+0002891544 00000 n 
+0002891770 00000 n 
+0002891963 00000 n 
+0002892132 00000 n 
+0002892358 00000 n 
+0002892551 00000 n 
+0002892752 00000 n 
+0002892919 00000 n 
+0002893145 00000 n 
+0002893338 00000 n 
+0002893539 00000 n 
+0002893706 00000 n 
+0002986370 00000 n 
+0002990649 00000 n 
+0002990773 00000 n 
+0002995519 00000 n 
+0002995642 00000 n 
+0002995766 00000 n 
+0002999968 00000 n 
+0003000092 00000 n 
+0003000216 00000 n 
+0003004470 00000 n 
+0003004594 00000 n 
+0002906282 00000 n 
+0002898220 00000 n 
+0002894221 00000 n 
+0002906096 00000 n 
+0002898722 00000 n 
+0002898948 00000 n 
+0002899141 00000 n 
+0002906158 00000 n 
+0002899307 00000 n 
+0002899533 00000 n 
+0002899726 00000 n 
+0002899952 00000 n 
+0002900145 00000 n 
+0002900346 00000 n 
+0002900511 00000 n 
+0002900736 00000 n 
+0002900928 00000 n 
+0002901128 00000 n 
+0002901294 00000 n 
+0002901520 00000 n 
+0002901729 00000 n 
+0002901955 00000 n 
+0002902164 00000 n 
+0002902390 00000 n 
+0002902579 00000 n 
+0002902756 00000 n 
+0002902982 00000 n 
+0002903178 00000 n 
+0002903404 00000 n 
+0002903613 00000 n 
+0002903839 00000 n 
+0002904034 00000 n 
+0002904260 00000 n 
+0002904451 00000 n 
+0002904660 00000 n 
+0002904886 00000 n 
+0002905083 00000 n 
+0002906220 00000 n 
+0002905274 00000 n 
+0002905500 00000 n 
+0002905725 00000 n 
+0002905917 00000 n 
+0003707732 00000 n 
+0003004717 00000 n 
+0003008479 00000 n 
+0003008602 00000 n 
+0003008726 00000 n 
+0003013068 00000 n 
+0003013192 00000 n 
+0003013316 00000 n 
+0003017360 00000 n 
+0003017607 00000 n 
+0003022290 00000 n 
+0003022420 00000 n 
+0002917018 00000 n 
+0002909546 00000 n 
+0002906467 00000 n 
+0002916150 00000 n 
+0002916212 00000 n 
+0002916274 00000 n 
+0002916336 00000 n 
+0002916398 00000 n 
+0002916460 00000 n 
+0002909978 00000 n 
+0002910187 00000 n 
+0002916522 00000 n 
+0002910413 00000 n 
+0002910622 00000 n 
+0002910848 00000 n 
+0002916584 00000 n 
+0002916646 00000 n 
+0002911074 00000 n 
+0002911283 00000 n 
+0002911509 00000 n 
+0002916708 00000 n 
+0002911702 00000 n 
+0002916770 00000 n 
+0002911928 00000 n 
+0002916832 00000 n 
+0002912154 00000 n 
+0002916894 00000 n 
+0002912379 00000 n 
+0002916956 00000 n 
+0002912605 00000 n 
+0002912831 00000 n 
+0002913040 00000 n 
+0002913249 00000 n 
+0002913475 00000 n 
+0002913668 00000 n 
+0002913877 00000 n 
+0002914103 00000 n 
+0002914304 00000 n 
+0002914530 00000 n 
+0002914731 00000 n 
+0002914929 00000 n 
+0002915154 00000 n 
+0002915353 00000 n 
+0002915577 00000 n 
+0002915775 00000 n 
+0002915971 00000 n 
+0003022550 00000 n 
+0002937356 00000 n 
+0002937480 00000 n 
+0002937604 00000 n 
+0002937732 00000 n 
+0002937856 00000 n 
+0002940623 00000 n 
+0002925650 00000 n 
+0002920707 00000 n 
+0002917146 00000 n 
+0002925402 00000 n 
+0002921069 00000 n 
+0002921295 00000 n 
+0002921481 00000 n 
+0002921672 00000 n 
+0002925464 00000 n 
+0002921881 00000 n 
+0002922074 00000 n 
+0002922298 00000 n 
+0002925526 00000 n 
+0002922491 00000 n 
+0002922717 00000 n 
+0002922910 00000 n 
+0002923136 00000 n 
+0002923329 00000 n 
+0002923522 00000 n 
+0002923748 00000 n 
+0002923941 00000 n 
+0002925588 00000 n 
+0002924134 00000 n 
+0002924327 00000 n 
+0002924495 00000 n 
+0002924690 00000 n 
+0002924888 00000 n 
+0002925056 00000 n 
+0002925223 00000 n 
+0002940747 00000 n 
+0003022736 00000 n 
+0003029735 00000 n 
+0003029865 00000 n 
+0002928241 00000 n 
+0002927848 00000 n 
+0002925844 00000 n 
+0002928179 00000 n 
+0002928000 00000 n 
+0002931498 00000 n 
+0002931105 00000 n 
+0002928392 00000 n 
+0002931436 00000 n 
+0002931257 00000 n 
+0002934660 00000 n 
+0002934267 00000 n 
+0002931673 00000 n 
+0002934598 00000 n 
+0002934419 00000 n 
+0002937917 00000 n 
+0002936902 00000 n 
+0002934848 00000 n 
+0002937233 00000 n 
+0002937295 00000 n 
+0002937418 00000 n 
+0002937542 00000 n 
+0002937670 00000 n 
+0002937794 00000 n 
+0002937054 00000 n 
+0003707865 00000 n 
+0002940871 00000 n 
+0002940169 00000 n 
+0002938031 00000 n 
+0002940500 00000 n 
+0002940562 00000 n 
+0002940685 00000 n 
+0002940809 00000 n 
+0002940321 00000 n 
+0002944011 00000 n 
+0002942758 00000 n 
+0002940998 00000 n 
+0002943089 00000 n 
+0002943151 00000 n 
+0002943273 00000 n 
+0002943396 00000 n 
+0002943519 00000 n 
+0002943640 00000 n 
+0002943764 00000 n 
+0002943888 00000 n 
+0002942910 00000 n 
+0002947225 00000 n 
+0002946451 00000 n 
+0002944138 00000 n 
+0002946782 00000 n 
+0002946844 00000 n 
+0002946967 00000 n 
+0002947096 00000 n 
+0002946603 00000 n 
+0002950483 00000 n 
+0002949710 00000 n 
+0002947352 00000 n 
+0002950041 00000 n 
+0002950103 00000 n 
+0002950232 00000 n 
+0002950361 00000 n 
+0002949862 00000 n 
+0002953602 00000 n 
+0002952772 00000 n 
+0002950610 00000 n 
+0002953103 00000 n 
+0002953165 00000 n 
+0002953288 00000 n 
+0002953418 00000 n 
+0002953540 00000 n 
+0002952924 00000 n 
+0002957874 00000 n 
+0002955744 00000 n 
+0002953729 00000 n 
+0002957259 00000 n 
+0002955956 00000 n 
+0002956132 00000 n 
+0002957383 00000 n 
+0002957506 00000 n 
+0002956331 00000 n 
+0002956506 00000 n 
+0002957629 00000 n 
+0002956705 00000 n 
+0002956881 00000 n 
+0002957752 00000 n 
+0002957080 00000 n 
+0003707998 00000 n 
+0002961245 00000 n 
+0002960088 00000 n 
+0002958001 00000 n 
+0002960814 00000 n 
+0002960876 00000 n 
+0002960260 00000 n 
+0002960436 00000 n 
+0002960999 00000 n 
+0002961122 00000 n 
+0002960635 00000 n 
+0002964856 00000 n 
+0002963366 00000 n 
+0002961372 00000 n 
+0002964487 00000 n 
+0002964549 00000 n 
+0002963558 00000 n 
+0002963734 00000 n 
+0002964670 00000 n 
+0002963933 00000 n 
+0002964109 00000 n 
+0002964794 00000 n 
+0002964308 00000 n 
+0002968147 00000 n 
+0002966991 00000 n 
+0002964983 00000 n 
+0002967716 00000 n 
+0002967840 00000 n 
+0002967963 00000 n 
+0002967163 00000 n 
+0002967338 00000 n 
+0002968085 00000 n 
+0002967537 00000 n 
+0002971434 00000 n 
+0002970399 00000 n 
+0002968274 00000 n 
+0002971125 00000 n 
+0002970571 00000 n 
+0002970747 00000 n 
+0002971249 00000 n 
+0002971372 00000 n 
+0002970946 00000 n 
+0002974904 00000 n 
+0002973415 00000 n 
+0002971561 00000 n 
+0002974534 00000 n 
+0002973607 00000 n 
+0002973783 00000 n 
+0002974658 00000 n 
+0002974780 00000 n 
+0002973982 00000 n 
+0002974156 00000 n 
+0002974355 00000 n 
+0002978219 00000 n 
+0002977028 00000 n 
+0002975031 00000 n 
+0002977539 00000 n 
+0002977601 00000 n 
+0002977724 00000 n 
+0002977848 00000 n 
+0002977972 00000 n 
+0002978096 00000 n 
+0002977190 00000 n 
+0002977360 00000 n 
+0003708131 00000 n 
+0002981969 00000 n 
+0002980310 00000 n 
+0002978346 00000 n 
+0002981416 00000 n 
+0002981478 00000 n 
+0002980502 00000 n 
+0002980672 00000 n 
+0002981601 00000 n 
+0002981723 00000 n 
+0002980863 00000 n 
+0002981038 00000 n 
+0002981847 00000 n 
+0002981237 00000 n 
+0002986431 00000 n 
+0002984569 00000 n 
+0002982096 00000 n 
+0002985875 00000 n 
+0002985937 00000 n 
+0002984771 00000 n 
+0002984947 00000 n 
+0002986060 00000 n 
+0002985146 00000 n 
+0002986184 00000 n 
+0002985328 00000 n 
+0002986308 00000 n 
+0002985512 00000 n 
+0002985696 00000 n 
+0002990896 00000 n 
+0002989411 00000 n 
+0002986558 00000 n 
+0002990526 00000 n 
+0002990588 00000 n 
+0002989603 00000 n 
+0002990711 00000 n 
+0002989787 00000 n 
+0002989969 00000 n 
+0002990835 00000 n 
+0002990165 00000 n 
+0002990347 00000 n 
+0002995890 00000 n 
+0002993926 00000 n 
+0002991073 00000 n 
+0002995457 00000 n 
+0002994138 00000 n 
+0002995581 00000 n 
+0002994334 00000 n 
+0002994515 00000 n 
+0002995704 00000 n 
+0002994710 00000 n 
+0002994892 00000 n 
+0002995828 00000 n 
+0002995087 00000 n 
+0002995278 00000 n 
+0003000340 00000 n 
+0002998829 00000 n 
+0002996067 00000 n 
+0002999906 00000 n 
+0003000030 00000 n 
+0002999021 00000 n 
+0003000154 00000 n 
+0002999212 00000 n 
+0003000278 00000 n 
+0002999386 00000 n 
+0002999555 00000 n 
+0002999727 00000 n 
+0003004841 00000 n 
+0003002993 00000 n 
+0003000517 00000 n 
+0003004408 00000 n 
+0003004532 00000 n 
+0003003205 00000 n 
+0003003374 00000 n 
+0003004656 00000 n 
+0003003548 00000 n 
+0003003717 00000 n 
+0003004779 00000 n 
+0003003891 00000 n 
+0003004057 00000 n 
+0003004229 00000 n 
+0003708264 00000 n 
+0003008850 00000 n 
+0003007371 00000 n 
+0003005007 00000 n 
+0003008417 00000 n 
+0003008540 00000 n 
+0003007563 00000 n 
+0003007727 00000 n 
+0003008664 00000 n 
+0003007901 00000 n 
+0003008064 00000 n 
+0003008788 00000 n 
+0003008238 00000 n 
+0003013440 00000 n 
+0003011582 00000 n 
+0003009016 00000 n 
+0003013006 00000 n 
+0003011784 00000 n 
+0003013130 00000 n 
+0003012009 00000 n 
+0003013254 00000 n 
+0003012235 00000 n 
+0003012412 00000 n 
+0003013378 00000 n 
+0003012637 00000 n 
+0003012827 00000 n 
+0003017737 00000 n 
+0003016355 00000 n 
+0003013629 00000 n 
+0003017298 00000 n 
+0003016537 00000 n 
+0003017422 00000 n 
+0003017545 00000 n 
+0003016728 00000 n 
+0003016924 00000 n 
+0003017675 00000 n 
+0003017119 00000 n 
+0003022860 00000 n 
+0003020890 00000 n 
+0003017889 00000 n 
+0003022228 00000 n 
+0003021092 00000 n 
+0003021318 00000 n 
+0003022358 00000 n 
+0003021494 00000 n 
+0003021685 00000 n 
+0003021874 00000 n 
+0003022488 00000 n 
+0003022612 00000 n 
+0003022674 00000 n 
+0003022798 00000 n 
+0003022049 00000 n 
+0003030548 00000 n 
+0003025940 00000 n 
+0003023012 00000 n 
+0003029673 00000 n 
+0003029803 00000 n 
+0003029933 00000 n 
+0003030115 00000 n 
+0003026242 00000 n 
+0003026465 00000 n 
+0003026689 00000 n 
+0003030177 00000 n 
+0003026880 00000 n 
+0003027102 00000 n 
+0003027324 00000 n 
+0003030239 00000 n 
+0003027515 00000 n 
+0003027739 00000 n 
+0003027961 00000 n 
+0003030301 00000 n 
+0003028185 00000 n 
+0003028409 00000 n 
+0003028633 00000 n 
+0003030363 00000 n 
+0003030425 00000 n 
+0003028857 00000 n 
+0003030487 00000 n 
+0003029081 00000 n 
+0003029305 00000 n 
+0003029494 00000 n 
+0003069614 00000 n 
+0003069738 00000 n 
+0003039785 00000 n 
+0003033979 00000 n 
+0003030702 00000 n 
+0003038918 00000 n 
+0003038980 00000 n 
+0003034331 00000 n 
+0003039041 00000 n 
+0003034555 00000 n 
+0003039103 00000 n 
+0003034779 00000 n 
+0003035002 00000 n 
+0003039165 00000 n 
+0003035193 00000 n 
+0003039227 00000 n 
+0003035417 00000 n 
+0003039289 00000 n 
+0003035641 00000 n 
+0003035850 00000 n 
+0003039351 00000 n 
+0003036074 00000 n 
+0003036283 00000 n 
+0003039413 00000 n 
+0003036507 00000 n 
+0003036731 00000 n 
+0003039475 00000 n 
+0003036955 00000 n 
+0003039537 00000 n 
+0003037179 00000 n 
+0003039599 00000 n 
+0003037403 00000 n 
+0003037627 00000 n 
+0003039661 00000 n 
+0003037849 00000 n 
+0003038073 00000 n 
+0003039723 00000 n 
+0003038296 00000 n 
+0003038517 00000 n 
+0003038739 00000 n 
+0003708397 00000 n 
+0003073331 00000 n 
+0003051941 00000 n 
+0003043433 00000 n 
+0003039939 00000 n 
+0003051013 00000 n 
+0003051075 00000 n 
+0003043905 00000 n 
+0003044128 00000 n 
+0003051136 00000 n 
+0003044352 00000 n 
+0003044576 00000 n 
+0003051198 00000 n 
+0003044800 00000 n 
+0003045024 00000 n 
+0003051260 00000 n 
+0003045248 00000 n 
+0003045472 00000 n 
+0003051322 00000 n 
+0003045696 00000 n 
+0003045920 00000 n 
+0003051384 00000 n 
+0003046144 00000 n 
+0003051446 00000 n 
+0003046368 00000 n 
+0003046592 00000 n 
+0003046815 00000 n 
+0003051508 00000 n 
+0003047039 00000 n 
+0003047263 00000 n 
+0003047487 00000 n 
+0003051569 00000 n 
+0003047711 00000 n 
+0003051631 00000 n 
+0003047935 00000 n 
+0003048126 00000 n 
+0003048349 00000 n 
+0003051693 00000 n 
+0003048540 00000 n 
+0003048763 00000 n 
+0003051755 00000 n 
+0003048953 00000 n 
+0003049177 00000 n 
+0003049368 00000 n 
+0003049592 00000 n 
+0003049783 00000 n 
+0003050007 00000 n 
+0003051817 00000 n 
+0003050198 00000 n 
+0003050422 00000 n 
+0003051879 00000 n 
+0003050610 00000 n 
+0003050834 00000 n 
+0003073455 00000 n 
+0003073584 00000 n 
+0003060173 00000 n 
+0003055057 00000 n 
+0003052082 00000 n 
+0003059496 00000 n 
+0003059558 00000 n 
+0003055389 00000 n 
+0003059620 00000 n 
+0003055613 00000 n 
+0003059682 00000 n 
+0003055836 00000 n 
+0003059743 00000 n 
+0003059803 00000 n 
+0003056060 00000 n 
+0003059863 00000 n 
+0003056284 00000 n 
+0003056508 00000 n 
+0003056732 00000 n 
+0003056956 00000 n 
+0003057180 00000 n 
+0003057404 00000 n 
+0003057628 00000 n 
+0003057852 00000 n 
+0003059925 00000 n 
+0003059987 00000 n 
+0003058043 00000 n 
+0003058267 00000 n 
+0003060049 00000 n 
+0003058491 00000 n 
+0003060111 00000 n 
+0003058714 00000 n 
+0003058938 00000 n 
+0003059128 00000 n 
+0003059317 00000 n 
+0003073714 00000 n 
+0003073838 00000 n 
+0003073967 00000 n 
+0003076800 00000 n 
+0003065961 00000 n 
+0003063202 00000 n 
+0003060328 00000 n 
+0003065775 00000 n 
+0003063464 00000 n 
+0003063687 00000 n 
+0003063877 00000 n 
+0003064067 00000 n 
+0003064290 00000 n 
+0003064479 00000 n 
+0003064703 00000 n 
+0003064894 00000 n 
+0003065837 00000 n 
+0003065899 00000 n 
+0003065085 00000 n 
+0003065247 00000 n 
+0003065405 00000 n 
+0003065596 00000 n 
+0003076924 00000 n 
+0003077048 00000 n 
+0003077172 00000 n 
+0003069868 00000 n 
+0003068259 00000 n 
+0003066101 00000 n 
+0003069490 00000 n 
+0003069552 00000 n 
+0003069676 00000 n 
+0003069806 00000 n 
+0003068451 00000 n 
+0003068642 00000 n 
+0003068865 00000 n 
+0003069088 00000 n 
+0003069311 00000 n 
+0003074097 00000 n 
+0003072877 00000 n 
+0003069994 00000 n 
+0003073208 00000 n 
+0003073270 00000 n 
+0003073393 00000 n 
+0003073522 00000 n 
+0003073652 00000 n 
+0003073776 00000 n 
+0003073905 00000 n 
+0003074035 00000 n 
+0003073029 00000 n 
+0003077724 00000 n 
+0003076106 00000 n 
+0003074237 00000 n 
+0003076677 00000 n 
+0003076739 00000 n 
+0003076862 00000 n 
+0003076986 00000 n 
+0003077110 00000 n 
+0003077234 00000 n 
+0003077417 00000 n 
+0003077600 00000 n 
+0003077662 00000 n 
+0003076268 00000 n 
+0003076498 00000 n 
+0003708530 00000 n 
+0003082285 00000 n 
+0003080046 00000 n 
+0003077865 00000 n 
+0003081546 00000 n 
+0003080248 00000 n 
+0003081608 00000 n 
+0003080479 00000 n 
+0003081669 00000 n 
+0003081731 00000 n 
+0003080710 00000 n 
+0003081793 00000 n 
+0003081854 00000 n 
+0003081916 00000 n 
+0003082099 00000 n 
+0003082161 00000 n 
+0003080919 00000 n 
+0003082223 00000 n 
+0003081143 00000 n 
+0003081367 00000 n 
+0003088872 00000 n 
+0003084722 00000 n 
+0003082438 00000 n 
+0003088195 00000 n 
+0003088257 00000 n 
+0003088439 00000 n 
+0003085014 00000 n 
+0003088501 00000 n 
+0003085217 00000 n 
+0003085441 00000 n 
+0003088563 00000 n 
+0003085650 00000 n 
+0003085859 00000 n 
+0003086082 00000 n 
+0003086291 00000 n 
+0003088625 00000 n 
+0003086515 00000 n 
+0003086723 00000 n 
+0003088687 00000 n 
+0003086946 00000 n 
+0003087155 00000 n 
+0003088748 00000 n 
+0003087379 00000 n 
+0003088810 00000 n 
+0003087601 00000 n 
+0003087825 00000 n 
+0003088016 00000 n 
+0003095562 00000 n 
+0003099411 00000 n 
+0003095686 00000 n 
+0003091882 00000 n 
+0003089013 00000 n 
+0003095004 00000 n 
+0003095066 00000 n 
+0003095128 00000 n 
+0003092164 00000 n 
+0003092373 00000 n 
+0003092597 00000 n 
+0003095190 00000 n 
+0003092787 00000 n 
+0003093011 00000 n 
+0003095252 00000 n 
+0003093202 00000 n 
+0003095314 00000 n 
+0003093426 00000 n 
+0003093650 00000 n 
+0003095376 00000 n 
+0003093841 00000 n 
+0003094064 00000 n 
+0003094254 00000 n 
+0003095438 00000 n 
+0003094444 00000 n 
+0003094634 00000 n 
+0003095500 00000 n 
+0003095624 00000 n 
+0003094825 00000 n 
+0003099597 00000 n 
+0003099721 00000 n 
+0003100272 00000 n 
+0003097840 00000 n 
+0003095851 00000 n 
+0003099287 00000 n 
+0003098042 00000 n 
+0003099349 00000 n 
+0003099473 00000 n 
+0003098266 00000 n 
+0003099535 00000 n 
+0003099659 00000 n 
+0003099783 00000 n 
+0003099966 00000 n 
+0003100028 00000 n 
+0003098490 00000 n 
+0003098726 00000 n 
+0003098917 00000 n 
+0003100090 00000 n 
+0003099108 00000 n 
+0003108475 00000 n 
+0003102852 00000 n 
+0003100425 00000 n 
+0003107670 00000 n 
+0003107732 00000 n 
+0003107794 00000 n 
+0003103204 00000 n 
+0003107856 00000 n 
+0003103434 00000 n 
+0003103664 00000 n 
+0003103855 00000 n 
+0003104085 00000 n 
+0003104276 00000 n 
+0003107918 00000 n 
+0003104466 00000 n 
+0003104675 00000 n 
+0003107980 00000 n 
+0003104905 00000 n 
+0003105134 00000 n 
+0003108042 00000 n 
+0003105322 00000 n 
+0003105531 00000 n 
+0003108104 00000 n 
+0003105761 00000 n 
+0003105970 00000 n 
+0003108166 00000 n 
+0003106200 00000 n 
+0003108228 00000 n 
+0003108290 00000 n 
+0003106429 00000 n 
+0003106638 00000 n 
+0003106868 00000 n 
+0003108352 00000 n 
+0003107064 00000 n 
+0003107294 00000 n 
+0003108413 00000 n 
+0003107491 00000 n 
+0003110261 00000 n 
+0003110445 00000 n 
+0003110569 00000 n 
+0003109807 00000 n 
+0003108616 00000 n 
+0003110138 00000 n 
+0003110200 00000 n 
+0003110323 00000 n 
+0003110385 00000 n 
+0003110507 00000 n 
+0003109959 00000 n 
+0003708663 00000 n 
+0003124276 00000 n 
+0003113516 00000 n 
+0003110696 00000 n 
+0003124152 00000 n 
+0003124214 00000 n 
+0003114288 00000 n 
+0003114444 00000 n 
+0003114599 00000 n 
+0003114756 00000 n 
+0003114912 00000 n 
+0003115068 00000 n 
+0003115225 00000 n 
+0003115382 00000 n 
+0003115539 00000 n 
+0003115696 00000 n 
+0003115853 00000 n 
+0003116009 00000 n 
+0003116166 00000 n 
+0003116323 00000 n 
+0003116480 00000 n 
+0003116636 00000 n 
+0003116793 00000 n 
+0003116949 00000 n 
+0003117105 00000 n 
+0003117262 00000 n 
+0003117419 00000 n 
+0003117576 00000 n 
+0003117733 00000 n 
+0003117889 00000 n 
+0003118046 00000 n 
+0003118203 00000 n 
+0003118360 00000 n 
+0003118517 00000 n 
+0003118673 00000 n 
+0003118829 00000 n 
+0003118985 00000 n 
+0003119142 00000 n 
+0003119299 00000 n 
+0003119456 00000 n 
+0003119613 00000 n 
+0003119770 00000 n 
+0003119926 00000 n 
+0003120083 00000 n 
+0003120240 00000 n 
+0003120397 00000 n 
+0003120553 00000 n 
+0003120709 00000 n 
+0003120866 00000 n 
+0003121023 00000 n 
+0003121179 00000 n 
+0003121336 00000 n 
+0003121493 00000 n 
+0003121650 00000 n 
+0003121807 00000 n 
+0003121963 00000 n 
+0003122120 00000 n 
+0003122276 00000 n 
+0003122433 00000 n 
+0003122589 00000 n 
+0003122746 00000 n 
+0003122902 00000 n 
+0003123058 00000 n 
+0003123214 00000 n 
+0003123370 00000 n 
+0003123527 00000 n 
+0003123684 00000 n 
+0003123840 00000 n 
+0003123997 00000 n 
+0003139120 00000 n 
+0003127749 00000 n 
+0003124363 00000 n 
+0003139058 00000 n 
+0003128561 00000 n 
+0003128718 00000 n 
+0003128875 00000 n 
+0003129032 00000 n 
+0003129186 00000 n 
+0003129343 00000 n 
+0003129500 00000 n 
+0003129657 00000 n 
+0003129813 00000 n 
+0003129970 00000 n 
+0003130126 00000 n 
+0003130283 00000 n 
+0003130440 00000 n 
+0003130597 00000 n 
+0003130753 00000 n 
+0003130910 00000 n 
+0003131067 00000 n 
+0003131224 00000 n 
+0003131381 00000 n 
+0003131538 00000 n 
+0003131694 00000 n 
+0003131851 00000 n 
+0003132006 00000 n 
+0003132163 00000 n 
+0003132320 00000 n 
+0003132475 00000 n 
+0003132632 00000 n 
+0003132788 00000 n 
+0003132944 00000 n 
+0003133098 00000 n 
+0003133255 00000 n 
+0003133412 00000 n 
+0003133569 00000 n 
+0003133726 00000 n 
+0003133883 00000 n 
+0003134037 00000 n 
+0003134194 00000 n 
+0003134350 00000 n 
+0003134507 00000 n 
+0003134664 00000 n 
+0003134821 00000 n 
+0003134975 00000 n 
+0003135132 00000 n 
+0003135288 00000 n 
+0003135444 00000 n 
+0003135601 00000 n 
+0003135758 00000 n 
+0003135915 00000 n 
+0003136072 00000 n 
+0003136229 00000 n 
+0003136386 00000 n 
+0003136540 00000 n 
+0003136696 00000 n 
+0003136853 00000 n 
+0003137010 00000 n 
+0003137167 00000 n 
+0003137324 00000 n 
+0003137481 00000 n 
+0003137638 00000 n 
+0003137792 00000 n 
+0003137947 00000 n 
+0003138104 00000 n 
+0003138260 00000 n 
+0003138415 00000 n 
+0003138570 00000 n 
+0003138725 00000 n 
+0003138879 00000 n 
+0003153388 00000 n 
+0003142516 00000 n 
+0003139220 00000 n 
+0003153326 00000 n 
+0003143298 00000 n 
+0003143454 00000 n 
+0003143610 00000 n 
+0003143766 00000 n 
+0003143921 00000 n 
+0003144077 00000 n 
+0003144234 00000 n 
+0003144390 00000 n 
+0003144547 00000 n 
+0003144703 00000 n 
+0003144858 00000 n 
+0003145015 00000 n 
+0003145172 00000 n 
+0003145329 00000 n 
+0003145485 00000 n 
+0003145640 00000 n 
+0003145797 00000 n 
+0003145953 00000 n 
+0003146107 00000 n 
+0003146264 00000 n 
+0003146421 00000 n 
+0003146578 00000 n 
+0003146734 00000 n 
+0003146890 00000 n 
+0003147047 00000 n 
+0003147204 00000 n 
+0003147361 00000 n 
+0003147517 00000 n 
+0003147673 00000 n 
+0003147830 00000 n 
+0003147986 00000 n 
+0003148142 00000 n 
+0003148297 00000 n 
+0003148453 00000 n 
+0003148609 00000 n 
+0003148765 00000 n 
+0003148922 00000 n 
+0003149079 00000 n 
+0003149234 00000 n 
+0003149390 00000 n 
+0003149547 00000 n 
+0003149703 00000 n 
+0003149859 00000 n 
+0003150016 00000 n 
+0003150172 00000 n 
+0003150329 00000 n 
+0003150486 00000 n 
+0003150643 00000 n 
+0003150797 00000 n 
+0003150954 00000 n 
+0003151111 00000 n 
+0003151268 00000 n 
+0003151425 00000 n 
+0003151582 00000 n 
+0003151738 00000 n 
+0003151895 00000 n 
+0003152052 00000 n 
+0003152209 00000 n 
+0003152365 00000 n 
+0003152522 00000 n 
+0003152679 00000 n 
+0003152835 00000 n 
+0003152992 00000 n 
+0003153147 00000 n 
+0003166702 00000 n 
+0003156817 00000 n 
+0003153488 00000 n 
+0003166640 00000 n 
+0003157539 00000 n 
+0003157694 00000 n 
+0003157851 00000 n 
+0003158007 00000 n 
+0003158164 00000 n 
+0003158321 00000 n 
+0003158477 00000 n 
+0003158634 00000 n 
+0003158791 00000 n 
+0003158948 00000 n 
+0003159104 00000 n 
+0003159261 00000 n 
+0003159417 00000 n 
+0003159571 00000 n 
+0003159727 00000 n 
+0003159883 00000 n 
+0003160038 00000 n 
+0003160195 00000 n 
+0003160352 00000 n 
+0003160509 00000 n 
+0003160666 00000 n 
+0003160823 00000 n 
+0003160980 00000 n 
+0003161137 00000 n 
+0003161294 00000 n 
+0003161450 00000 n 
+0003161606 00000 n 
+0003161763 00000 n 
+0003161920 00000 n 
+0003162076 00000 n 
+0003162232 00000 n 
+0003162388 00000 n 
+0003162545 00000 n 
+0003162701 00000 n 
+0003162858 00000 n 
+0003163015 00000 n 
+0003163172 00000 n 
+0003163328 00000 n 
+0003163484 00000 n 
+0003163641 00000 n 
+0003163797 00000 n 
+0003163953 00000 n 
+0003164109 00000 n 
+0003164266 00000 n 
+0003164423 00000 n 
+0003164579 00000 n 
+0003164736 00000 n 
+0003164893 00000 n 
+0003165050 00000 n 
+0003165206 00000 n 
+0003165362 00000 n 
+0003165519 00000 n 
+0003165676 00000 n 
+0003165833 00000 n 
+0003165990 00000 n 
+0003166147 00000 n 
+0003166304 00000 n 
+0003166461 00000 n 
+0003181756 00000 n 
+0003170220 00000 n 
+0003166802 00000 n 
+0003181694 00000 n 
+0003171042 00000 n 
+0003171198 00000 n 
+0003171355 00000 n 
+0003171511 00000 n 
+0003171667 00000 n 
+0003171824 00000 n 
+0003171979 00000 n 
+0003172135 00000 n 
+0003172292 00000 n 
+0003172448 00000 n 
+0003172605 00000 n 
+0003172762 00000 n 
+0003172919 00000 n 
+0003173075 00000 n 
+0003173232 00000 n 
+0003173388 00000 n 
+0003173543 00000 n 
+0003173700 00000 n 
+0003173857 00000 n 
+0003174014 00000 n 
+0003174170 00000 n 
+0003174326 00000 n 
+0003174483 00000 n 
+0003174639 00000 n 
+0003174795 00000 n 
+0003174952 00000 n 
+0003175109 00000 n 
+0003175266 00000 n 
+0003175422 00000 n 
+0003175578 00000 n 
+0003175735 00000 n 
+0003175892 00000 n 
+0003176048 00000 n 
+0003176204 00000 n 
+0003176360 00000 n 
+0003176516 00000 n 
+0003176672 00000 n 
+0003176828 00000 n 
+0003176985 00000 n 
+0003177142 00000 n 
+0003177299 00000 n 
+0003177454 00000 n 
+0003177610 00000 n 
+0003177766 00000 n 
+0003177923 00000 n 
+0003178080 00000 n 
+0003178236 00000 n 
+0003178392 00000 n 
+0003178548 00000 n 
+0003178705 00000 n 
+0003178862 00000 n 
+0003179018 00000 n 
+0003179175 00000 n 
+0003179331 00000 n 
+0003179488 00000 n 
+0003179645 00000 n 
+0003179802 00000 n 
+0003179957 00000 n 
+0003180114 00000 n 
+0003180271 00000 n 
+0003180426 00000 n 
+0003180581 00000 n 
+0003180737 00000 n 
+0003180891 00000 n 
+0003181045 00000 n 
+0003181202 00000 n 
+0003181359 00000 n 
+0003181515 00000 n 
+0003195057 00000 n 
+0003185013 00000 n 
+0003181856 00000 n 
+0003194995 00000 n 
+0003185745 00000 n 
+0003185901 00000 n 
+0003186057 00000 n 
+0003186214 00000 n 
+0003186370 00000 n 
+0003186526 00000 n 
+0003186681 00000 n 
+0003186837 00000 n 
+0003186994 00000 n 
+0003187150 00000 n 
+0003187307 00000 n 
+0003187464 00000 n 
+0003187621 00000 n 
+0003187778 00000 n 
+0003187934 00000 n 
+0003188090 00000 n 
+0003188247 00000 n 
+0003188403 00000 n 
+0003188559 00000 n 
+0003188716 00000 n 
+0003188872 00000 n 
+0003189029 00000 n 
+0003189185 00000 n 
+0003189342 00000 n 
+0003189498 00000 n 
+0003189655 00000 n 
+0003189812 00000 n 
+0003189968 00000 n 
+0003190122 00000 n 
+0003190279 00000 n 
+0003190436 00000 n 
+0003190593 00000 n 
+0003190748 00000 n 
+0003190904 00000 n 
+0003191060 00000 n 
+0003191217 00000 n 
+0003191374 00000 n 
+0003191529 00000 n 
+0003191685 00000 n 
+0003191842 00000 n 
+0003191999 00000 n 
+0003192156 00000 n 
+0003192313 00000 n 
+0003192470 00000 n 
+0003192627 00000 n 
+0003192784 00000 n 
+0003192940 00000 n 
+0003193097 00000 n 
+0003193254 00000 n 
+0003193409 00000 n 
+0003193566 00000 n 
+0003193722 00000 n 
+0003193879 00000 n 
+0003194034 00000 n 
+0003194191 00000 n 
+0003194348 00000 n 
+0003194505 00000 n 
+0003194661 00000 n 
+0003194816 00000 n 
+0003708796 00000 n 
+0003210003 00000 n 
+0003198629 00000 n 
+0003195157 00000 n 
+0003209941 00000 n 
+0003199441 00000 n 
+0003199597 00000 n 
+0003199754 00000 n 
+0003199911 00000 n 
+0003200068 00000 n 
+0003200225 00000 n 
+0003200381 00000 n 
+0003200537 00000 n 
+0003200693 00000 n 
+0003200850 00000 n 
+0003201007 00000 n 
+0003201163 00000 n 
+0003201320 00000 n 
+0003201477 00000 n 
+0003201632 00000 n 
+0003201789 00000 n 
+0003201946 00000 n 
+0003202100 00000 n 
+0003202257 00000 n 
+0003202413 00000 n 
+0003202570 00000 n 
+0003202726 00000 n 
+0003202883 00000 n 
+0003203040 00000 n 
+0003203197 00000 n 
+0003203353 00000 n 
+0003203510 00000 n 
+0003203667 00000 n 
+0003203824 00000 n 
+0003203979 00000 n 
+0003204135 00000 n 
+0003204291 00000 n 
+0003204448 00000 n 
+0003204602 00000 n 
+0003204758 00000 n 
+0003204915 00000 n 
+0003205072 00000 n 
+0003205229 00000 n 
+0003205385 00000 n 
+0003205541 00000 n 
+0003205697 00000 n 
+0003205853 00000 n 
+0003206010 00000 n 
+0003206166 00000 n 
+0003206322 00000 n 
+0003206478 00000 n 
+0003206634 00000 n 
+0003206790 00000 n 
+0003206946 00000 n 
+0003207103 00000 n 
+0003207260 00000 n 
+0003207416 00000 n 
+0003207573 00000 n 
+0003207729 00000 n 
+0003207885 00000 n 
+0003208042 00000 n 
+0003208199 00000 n 
+0003208356 00000 n 
+0003208512 00000 n 
+0003208669 00000 n 
+0003208826 00000 n 
+0003208982 00000 n 
+0003209139 00000 n 
+0003209295 00000 n 
+0003209452 00000 n 
+0003209607 00000 n 
+0003209762 00000 n 
+0003224688 00000 n 
+0003213638 00000 n 
+0003210103 00000 n 
+0003224626 00000 n 
+0003214430 00000 n 
+0003214587 00000 n 
+0003214744 00000 n 
+0003214900 00000 n 
+0003215057 00000 n 
+0003215214 00000 n 
+0003215371 00000 n 
+0003215528 00000 n 
+0003215685 00000 n 
+0003215842 00000 n 
+0003215999 00000 n 
+0003216156 00000 n 
+0003216313 00000 n 
+0003216470 00000 n 
+0003216626 00000 n 
+0003216782 00000 n 
+0003216938 00000 n 
+0003217093 00000 n 
+0003217250 00000 n 
+0003217407 00000 n 
+0003217564 00000 n 
+0003217721 00000 n 
+0003217877 00000 n 
+0003218033 00000 n 
+0003218190 00000 n 
+0003218347 00000 n 
+0003218503 00000 n 
+0003218659 00000 n 
+0003218815 00000 n 
+0003218969 00000 n 
+0003219124 00000 n 
+0003219280 00000 n 
+0003219436 00000 n 
+0003219593 00000 n 
+0003219750 00000 n 
+0003219904 00000 n 
+0003220061 00000 n 
+0003220218 00000 n 
+0003220375 00000 n 
+0003220532 00000 n 
+0003220688 00000 n 
+0003220845 00000 n 
+0003221002 00000 n 
+0003221159 00000 n 
+0003221316 00000 n 
+0003221473 00000 n 
+0003221630 00000 n 
+0003221787 00000 n 
+0003221942 00000 n 
+0003222099 00000 n 
+0003222256 00000 n 
+0003222412 00000 n 
+0003222568 00000 n 
+0003222725 00000 n 
+0003222881 00000 n 
+0003223037 00000 n 
+0003223193 00000 n 
+0003223350 00000 n 
+0003223507 00000 n 
+0003223664 00000 n 
+0003223821 00000 n 
+0003223978 00000 n 
+0003224135 00000 n 
+0003224292 00000 n 
+0003224447 00000 n 
+0003238940 00000 n 
+0003228403 00000 n 
+0003224801 00000 n 
+0003238878 00000 n 
+0003229165 00000 n 
+0003229322 00000 n 
+0003229479 00000 n 
+0003229636 00000 n 
+0003229793 00000 n 
+0003229950 00000 n 
+0003230107 00000 n 
+0003230264 00000 n 
+0003230421 00000 n 
+0003230578 00000 n 
+0003230735 00000 n 
+0003230892 00000 n 
+0003231048 00000 n 
+0003231204 00000 n 
+0003231361 00000 n 
+0003231516 00000 n 
+0003231673 00000 n 
+0003231829 00000 n 
+0003231985 00000 n 
+0003232140 00000 n 
+0003232296 00000 n 
+0003232453 00000 n 
+0003232610 00000 n 
+0003232767 00000 n 
+0003232924 00000 n 
+0003233081 00000 n 
+0003233237 00000 n 
+0003233394 00000 n 
+0003233551 00000 n 
+0003233708 00000 n 
+0003233863 00000 n 
+0003234019 00000 n 
+0003234175 00000 n 
+0003234332 00000 n 
+0003234488 00000 n 
+0003234645 00000 n 
+0003234802 00000 n 
+0003234957 00000 n 
+0003235112 00000 n 
+0003235269 00000 n 
+0003235426 00000 n 
+0003235582 00000 n 
+0003235739 00000 n 
+0003235895 00000 n 
+0003236052 00000 n 
+0003236209 00000 n 
+0003236366 00000 n 
+0003236523 00000 n 
+0003236680 00000 n 
+0003236835 00000 n 
+0003236991 00000 n 
+0003237147 00000 n 
+0003237303 00000 n 
+0003237459 00000 n 
+0003237614 00000 n 
+0003237770 00000 n 
+0003237924 00000 n 
+0003238080 00000 n 
+0003238236 00000 n 
+0003238392 00000 n 
+0003238545 00000 n 
+0003238699 00000 n 
+0003263660 00000 n 
+0003244493 00000 n 
+0003239066 00000 n 
+0003263598 00000 n 
+0003245775 00000 n 
+0003245931 00000 n 
+0003246086 00000 n 
+0003246242 00000 n 
+0003246398 00000 n 
+0003246554 00000 n 
+0003246709 00000 n 
+0003246865 00000 n 
+0003247019 00000 n 
+0003247175 00000 n 
+0003247330 00000 n 
+0003247485 00000 n 
+0003247641 00000 n 
+0003247797 00000 n 
+0003247952 00000 n 
+0003248108 00000 n 
+0003248264 00000 n 
+0003248420 00000 n 
+0003248576 00000 n 
+0003248732 00000 n 
+0003248887 00000 n 
+0003249042 00000 n 
+0003249198 00000 n 
+0003249353 00000 n 
+0003249508 00000 n 
+0003249663 00000 n 
+0003249819 00000 n 
+0003249974 00000 n 
+0003250130 00000 n 
+0003250286 00000 n 
+0003250442 00000 n 
+0003250598 00000 n 
+0003250754 00000 n 
+0003250910 00000 n 
+0003251065 00000 n 
+0003251221 00000 n 
+0003251377 00000 n 
+0003251534 00000 n 
+0003251690 00000 n 
+0003251846 00000 n 
+0003252001 00000 n 
+0003252158 00000 n 
+0003252313 00000 n 
+0003252470 00000 n 
+0003252627 00000 n 
+0003252784 00000 n 
+0003252941 00000 n 
+0003253098 00000 n 
+0003253254 00000 n 
+0003253411 00000 n 
+0003253568 00000 n 
+0003253724 00000 n 
+0003253881 00000 n 
+0003254037 00000 n 
+0003254193 00000 n 
+0003254349 00000 n 
+0003254504 00000 n 
+0003254660 00000 n 
+0003254816 00000 n 
+0003254973 00000 n 
+0003255130 00000 n 
+0003255287 00000 n 
+0003255444 00000 n 
+0003255601 00000 n 
+0003255755 00000 n 
+0003255910 00000 n 
+0003256067 00000 n 
+0003256224 00000 n 
+0003256381 00000 n 
+0003256538 00000 n 
+0003256694 00000 n 
+0003256849 00000 n 
+0003257006 00000 n 
+0003257162 00000 n 
+0003257319 00000 n 
+0003257476 00000 n 
+0003257633 00000 n 
+0003257789 00000 n 
+0003257946 00000 n 
+0003258103 00000 n 
+0003258260 00000 n 
+0003258417 00000 n 
+0003258574 00000 n 
+0003258731 00000 n 
+0003258886 00000 n 
+0003259043 00000 n 
+0003259198 00000 n 
+0003259352 00000 n 
+0003259509 00000 n 
+0003259666 00000 n 
+0003259823 00000 n 
+0003259977 00000 n 
+0003260134 00000 n 
+0003260291 00000 n 
+0003260448 00000 n 
+0003260605 00000 n 
+0003260762 00000 n 
+0003260919 00000 n 
+0003261075 00000 n 
+0003261230 00000 n 
+0003261387 00000 n 
+0003261544 00000 n 
+0003261701 00000 n 
+0003261858 00000 n 
+0003262015 00000 n 
+0003262169 00000 n 
+0003262326 00000 n 
+0003262483 00000 n 
+0003262640 00000 n 
+0003262796 00000 n 
+0003262953 00000 n 
+0003263109 00000 n 
+0003263265 00000 n 
+0003263419 00000 n 
+0003288932 00000 n 
+0003269399 00000 n 
+0003263773 00000 n 
+0003288870 00000 n 
+0003270701 00000 n 
+0003270858 00000 n 
+0003271014 00000 n 
+0003271171 00000 n 
+0003271328 00000 n 
+0003271485 00000 n 
+0003271642 00000 n 
+0003271799 00000 n 
+0003271954 00000 n 
+0003272111 00000 n 
+0003272267 00000 n 
+0003272423 00000 n 
+0003272579 00000 n 
+0003272736 00000 n 
+0003272893 00000 n 
+0003273049 00000 n 
+0003273205 00000 n 
+0003273362 00000 n 
+0003273518 00000 n 
+0003273674 00000 n 
+0003273831 00000 n 
+0003273987 00000 n 
+0003274144 00000 n 
+0003274301 00000 n 
+0003274458 00000 n 
+0003274615 00000 n 
+0003274771 00000 n 
+0003274928 00000 n 
+0003275083 00000 n 
+0003275240 00000 n 
+0003275397 00000 n 
+0003275554 00000 n 
+0003275711 00000 n 
+0003275868 00000 n 
+0003276024 00000 n 
+0003276178 00000 n 
+0003276335 00000 n 
+0003276491 00000 n 
+0003276647 00000 n 
+0003276803 00000 n 
+0003276960 00000 n 
+0003277117 00000 n 
+0003277273 00000 n 
+0003277428 00000 n 
+0003277585 00000 n 
+0003277741 00000 n 
+0003277898 00000 n 
+0003278055 00000 n 
+0003278212 00000 n 
+0003278368 00000 n 
+0003278525 00000 n 
+0003278682 00000 n 
+0003278839 00000 n 
+0003278995 00000 n 
+0003279152 00000 n 
+0003279308 00000 n 
+0003279464 00000 n 
+0003279621 00000 n 
+0003279777 00000 n 
+0003279933 00000 n 
+0003280087 00000 n 
+0003280244 00000 n 
+0003280400 00000 n 
+0003280557 00000 n 
+0003280714 00000 n 
+0003280871 00000 n 
+0003281028 00000 n 
+0003281185 00000 n 
+0003281340 00000 n 
+0003281497 00000 n 
+0003281653 00000 n 
+0003281810 00000 n 
+0003281965 00000 n 
+0003282122 00000 n 
+0003282277 00000 n 
+0003282434 00000 n 
+0003282591 00000 n 
+0003282748 00000 n 
+0003282905 00000 n 
+0003283062 00000 n 
+0003283218 00000 n 
+0003283375 00000 n 
+0003283532 00000 n 
+0003283689 00000 n 
+0003283846 00000 n 
+0003284003 00000 n 
+0003284158 00000 n 
+0003284315 00000 n 
+0003284472 00000 n 
+0003284629 00000 n 
+0003284785 00000 n 
+0003284942 00000 n 
+0003285098 00000 n 
+0003285255 00000 n 
+0003285412 00000 n 
+0003285569 00000 n 
+0003285726 00000 n 
+0003285883 00000 n 
+0003286038 00000 n 
+0003286192 00000 n 
+0003286349 00000 n 
+0003286505 00000 n 
+0003286662 00000 n 
+0003286818 00000 n 
+0003286974 00000 n 
+0003287130 00000 n 
+0003287286 00000 n 
+0003287442 00000 n 
+0003287599 00000 n 
+0003287756 00000 n 
+0003287913 00000 n 
+0003288069 00000 n 
+0003288225 00000 n 
+0003288381 00000 n 
+0003288536 00000 n 
+0003288691 00000 n 
+0003312572 00000 n 
+0003294196 00000 n 
+0003289045 00000 n 
+0003312510 00000 n 
+0003295428 00000 n 
+0003295585 00000 n 
+0003295742 00000 n 
+0003295898 00000 n 
+0003296055 00000 n 
+0003296212 00000 n 
+0003296369 00000 n 
+0003296526 00000 n 
+0003296683 00000 n 
+0003296839 00000 n 
+0003296995 00000 n 
+0003297152 00000 n 
+0003297308 00000 n 
+0003297465 00000 n 
+0003297622 00000 n 
+0003297779 00000 n 
+0003297935 00000 n 
+0003298091 00000 n 
+0003298248 00000 n 
+0003298405 00000 n 
+0003298561 00000 n 
+0003298718 00000 n 
+0003298875 00000 n 
+0003299032 00000 n 
+0003299189 00000 n 
+0003299345 00000 n 
+0003299502 00000 n 
+0003299656 00000 n 
+0003299813 00000 n 
+0003299970 00000 n 
+0003300127 00000 n 
+0003300283 00000 n 
+0003300439 00000 n 
+0003300595 00000 n 
+0003300752 00000 n 
+0003300909 00000 n 
+0003301065 00000 n 
+0003301220 00000 n 
+0003301377 00000 n 
+0003301534 00000 n 
+0003301691 00000 n 
+0003301848 00000 n 
+0003302002 00000 n 
+0003302158 00000 n 
+0003302314 00000 n 
+0003302471 00000 n 
+0003302628 00000 n 
+0003302785 00000 n 
+0003302941 00000 n 
+0003303098 00000 n 
+0003303254 00000 n 
+0003303411 00000 n 
+0003303567 00000 n 
+0003303722 00000 n 
+0003303879 00000 n 
+0003304035 00000 n 
+0003304191 00000 n 
+0003304348 00000 n 
+0003304505 00000 n 
+0003304662 00000 n 
+0003304819 00000 n 
+0003304976 00000 n 
+0003305131 00000 n 
+0003305288 00000 n 
+0003305445 00000 n 
+0003305602 00000 n 
+0003305759 00000 n 
+0003305915 00000 n 
+0003306072 00000 n 
+0003306229 00000 n 
+0003306384 00000 n 
+0003306541 00000 n 
+0003306698 00000 n 
+0003306854 00000 n 
+0003307011 00000 n 
+0003307168 00000 n 
+0003307325 00000 n 
+0003307482 00000 n 
+0003307639 00000 n 
+0003307793 00000 n 
+0003307950 00000 n 
+0003308107 00000 n 
+0003308264 00000 n 
+0003308421 00000 n 
+0003308577 00000 n 
+0003308733 00000 n 
+0003308890 00000 n 
+0003309046 00000 n 
+0003309203 00000 n 
+0003309359 00000 n 
+0003309516 00000 n 
+0003309673 00000 n 
+0003309830 00000 n 
+0003309985 00000 n 
+0003310141 00000 n 
+0003310297 00000 n 
+0003310454 00000 n 
+0003310611 00000 n 
+0003310768 00000 n 
+0003310925 00000 n 
+0003311081 00000 n 
+0003311238 00000 n 
+0003311394 00000 n 
+0003311551 00000 n 
+0003311707 00000 n 
+0003311864 00000 n 
+0003312020 00000 n 
+0003312176 00000 n 
+0003312331 00000 n 
+0003708929 00000 n 
+0003336797 00000 n 
+0003318258 00000 n 
+0003312685 00000 n 
+0003336735 00000 n 
+0003319500 00000 n 
+0003319657 00000 n 
+0003319813 00000 n 
+0003319970 00000 n 
+0003320127 00000 n 
+0003320284 00000 n 
+0003320441 00000 n 
+0003320597 00000 n 
+0003320754 00000 n 
+0003320911 00000 n 
+0003321066 00000 n 
+0003321223 00000 n 
+0003321379 00000 n 
+0003321535 00000 n 
+0003321692 00000 n 
+0003321849 00000 n 
+0003322006 00000 n 
+0003322162 00000 n 
+0003322319 00000 n 
+0003322476 00000 n 
+0003322633 00000 n 
+0003322789 00000 n 
+0003322946 00000 n 
+0003323102 00000 n 
+0003323259 00000 n 
+0003323416 00000 n 
+0003323573 00000 n 
+0003323730 00000 n 
+0003323887 00000 n 
+0003324042 00000 n 
+0003324199 00000 n 
+0003324356 00000 n 
+0003324512 00000 n 
+0003324669 00000 n 
+0003324825 00000 n 
+0003324980 00000 n 
+0003325137 00000 n 
+0003325293 00000 n 
+0003325450 00000 n 
+0003325607 00000 n 
+0003325763 00000 n 
+0003325918 00000 n 
+0003326075 00000 n 
+0003326232 00000 n 
+0003326388 00000 n 
+0003326545 00000 n 
+0003326701 00000 n 
+0003326855 00000 n 
+0003327012 00000 n 
+0003327169 00000 n 
+0003327326 00000 n 
+0003327482 00000 n 
+0003327638 00000 n 
+0003327795 00000 n 
+0003327951 00000 n 
+0003328107 00000 n 
+0003328262 00000 n 
+0003328419 00000 n 
+0003328575 00000 n 
+0003328731 00000 n 
+0003328888 00000 n 
+0003329045 00000 n 
+0003329202 00000 n 
+0003329357 00000 n 
+0003329514 00000 n 
+0003329670 00000 n 
+0003329827 00000 n 
+0003329983 00000 n 
+0003330140 00000 n 
+0003330297 00000 n 
+0003330454 00000 n 
+0003330611 00000 n 
+0003330768 00000 n 
+0003330924 00000 n 
+0003331081 00000 n 
+0003331238 00000 n 
+0003331395 00000 n 
+0003331552 00000 n 
+0003331709 00000 n 
+0003331862 00000 n 
+0003332019 00000 n 
+0003332176 00000 n 
+0003332333 00000 n 
+0003332488 00000 n 
+0003332645 00000 n 
+0003332801 00000 n 
+0003332958 00000 n 
+0003333115 00000 n 
+0003333271 00000 n 
+0003333428 00000 n 
+0003333584 00000 n 
+0003333738 00000 n 
+0003333895 00000 n 
+0003334052 00000 n 
+0003334208 00000 n 
+0003334365 00000 n 
+0003334522 00000 n 
+0003334678 00000 n 
+0003334834 00000 n 
+0003334990 00000 n 
+0003335147 00000 n 
+0003335304 00000 n 
+0003335460 00000 n 
+0003335617 00000 n 
+0003335774 00000 n 
+0003335931 00000 n 
+0003336088 00000 n 
+0003336245 00000 n 
+0003336401 00000 n 
+0003336556 00000 n 
+0003362242 00000 n 
+0003342538 00000 n 
+0003336923 00000 n 
+0003362180 00000 n 
+0003343850 00000 n 
+0003344006 00000 n 
+0003344162 00000 n 
+0003344319 00000 n 
+0003344476 00000 n 
+0003344633 00000 n 
+0003344790 00000 n 
+0003344946 00000 n 
+0003345103 00000 n 
+0003345257 00000 n 
+0003345414 00000 n 
+0003345571 00000 n 
+0003345727 00000 n 
+0003345884 00000 n 
+0003346041 00000 n 
+0003346197 00000 n 
+0003346354 00000 n 
+0003346511 00000 n 
+0003346668 00000 n 
+0003346825 00000 n 
+0003346982 00000 n 
+0003347138 00000 n 
+0003347295 00000 n 
+0003347452 00000 n 
+0003347609 00000 n 
+0003347765 00000 n 
+0003347922 00000 n 
+0003348077 00000 n 
+0003348234 00000 n 
+0003348390 00000 n 
+0003348547 00000 n 
+0003348704 00000 n 
+0003348861 00000 n 
+0003349018 00000 n 
+0003349173 00000 n 
+0003349330 00000 n 
+0003349487 00000 n 
+0003349643 00000 n 
+0003349800 00000 n 
+0003349957 00000 n 
+0003350114 00000 n 
+0003350269 00000 n 
+0003350426 00000 n 
+0003350583 00000 n 
+0003350739 00000 n 
+0003350896 00000 n 
+0003351053 00000 n 
+0003351210 00000 n 
+0003351365 00000 n 
+0003351522 00000 n 
+0003351678 00000 n 
+0003351835 00000 n 
+0003351992 00000 n 
+0003352148 00000 n 
+0003352305 00000 n 
+0003352460 00000 n 
+0003352617 00000 n 
+0003352774 00000 n 
+0003352929 00000 n 
+0003353084 00000 n 
+0003353241 00000 n 
+0003353397 00000 n 
+0003353554 00000 n 
+0003353711 00000 n 
+0003353868 00000 n 
+0003354025 00000 n 
+0003354182 00000 n 
+0003354337 00000 n 
+0003354494 00000 n 
+0003354650 00000 n 
+0003354806 00000 n 
+0003354963 00000 n 
+0003355119 00000 n 
+0003355275 00000 n 
+0003355431 00000 n 
+0003355587 00000 n 
+0003355744 00000 n 
+0003355901 00000 n 
+0003356057 00000 n 
+0003356213 00000 n 
+0003356369 00000 n 
+0003356526 00000 n 
+0003356683 00000 n 
+0003356840 00000 n 
+0003356997 00000 n 
+0003357153 00000 n 
+0003357310 00000 n 
+0003357465 00000 n 
+0003357622 00000 n 
+0003357779 00000 n 
+0003357935 00000 n 
+0003358090 00000 n 
+0003358246 00000 n 
+0003358403 00000 n 
+0003358560 00000 n 
+0003358716 00000 n 
+0003358873 00000 n 
+0003359030 00000 n 
+0003359187 00000 n 
+0003359342 00000 n 
+0003359499 00000 n 
+0003359655 00000 n 
+0003359812 00000 n 
+0003359969 00000 n 
+0003360126 00000 n 
+0003360279 00000 n 
+0003360436 00000 n 
+0003360592 00000 n 
+0003360749 00000 n 
+0003360906 00000 n 
+0003361063 00000 n 
+0003361220 00000 n 
+0003361376 00000 n 
+0003361533 00000 n 
+0003361690 00000 n 
+0003361846 00000 n 
+0003362001 00000 n 
+0003386653 00000 n 
+0003367781 00000 n 
+0003362355 00000 n 
+0003386591 00000 n 
+0003369043 00000 n 
+0003369199 00000 n 
+0003369355 00000 n 
+0003369512 00000 n 
+0003369668 00000 n 
+0003369825 00000 n 
+0003369982 00000 n 
+0003370138 00000 n 
+0003370292 00000 n 
+0003370449 00000 n 
+0003370605 00000 n 
+0003370761 00000 n 
+0003370918 00000 n 
+0003371075 00000 n 
+0003371231 00000 n 
+0003371388 00000 n 
+0003371545 00000 n 
+0003371702 00000 n 
+0003371859 00000 n 
+0003372016 00000 n 
+0003372172 00000 n 
+0003372329 00000 n 
+0003372485 00000 n 
+0003372641 00000 n 
+0003372797 00000 n 
+0003372954 00000 n 
+0003373110 00000 n 
+0003373266 00000 n 
+0003373423 00000 n 
+0003373580 00000 n 
+0003373737 00000 n 
+0003373894 00000 n 
+0003374051 00000 n 
+0003374207 00000 n 
+0003374362 00000 n 
+0003374519 00000 n 
+0003374676 00000 n 
+0003374833 00000 n 
+0003374990 00000 n 
+0003375147 00000 n 
+0003375302 00000 n 
+0003375459 00000 n 
+0003375616 00000 n 
+0003375773 00000 n 
+0003375930 00000 n 
+0003376086 00000 n 
+0003376243 00000 n 
+0003376400 00000 n 
+0003376556 00000 n 
+0003376711 00000 n 
+0003376867 00000 n 
+0003377024 00000 n 
+0003377181 00000 n 
+0003377338 00000 n 
+0003377495 00000 n 
+0003377651 00000 n 
+0003377808 00000 n 
+0003377964 00000 n 
+0003378120 00000 n 
+0003378275 00000 n 
+0003378432 00000 n 
+0003378588 00000 n 
+0003378745 00000 n 
+0003378902 00000 n 
+0003379059 00000 n 
+0003379216 00000 n 
+0003379373 00000 n 
+0003379528 00000 n 
+0003379685 00000 n 
+0003379841 00000 n 
+0003379998 00000 n 
+0003380155 00000 n 
+0003380311 00000 n 
+0003380468 00000 n 
+0003380625 00000 n 
+0003380781 00000 n 
+0003380938 00000 n 
+0003381094 00000 n 
+0003381250 00000 n 
+0003381407 00000 n 
+0003381564 00000 n 
+0003381720 00000 n 
+0003381877 00000 n 
+0003382034 00000 n 
+0003382190 00000 n 
+0003382346 00000 n 
+0003382503 00000 n 
+0003382660 00000 n 
+0003382817 00000 n 
+0003382974 00000 n 
+0003383129 00000 n 
+0003383286 00000 n 
+0003383443 00000 n 
+0003383600 00000 n 
+0003383757 00000 n 
+0003383912 00000 n 
+0003384068 00000 n 
+0003384225 00000 n 
+0003384381 00000 n 
+0003384538 00000 n 
+0003384694 00000 n 
+0003384848 00000 n 
+0003385005 00000 n 
+0003385162 00000 n 
+0003385319 00000 n 
+0003385476 00000 n 
+0003385633 00000 n 
+0003385789 00000 n 
+0003385946 00000 n 
+0003386102 00000 n 
+0003386257 00000 n 
+0003386412 00000 n 
+0003408607 00000 n 
+0003391931 00000 n 
+0003386766 00000 n 
+0003408545 00000 n 
+0003393063 00000 n 
+0003393220 00000 n 
+0003393376 00000 n 
+0003393532 00000 n 
+0003393688 00000 n 
+0003393844 00000 n 
+0003394000 00000 n 
+0003394157 00000 n 
+0003394314 00000 n 
+0003394471 00000 n 
+0003394626 00000 n 
+0003394782 00000 n 
+0003394939 00000 n 
+0003395096 00000 n 
+0003395252 00000 n 
+0003395409 00000 n 
+0003395566 00000 n 
+0003395722 00000 n 
+0003395878 00000 n 
+0003396035 00000 n 
+0003396192 00000 n 
+0003396349 00000 n 
+0003396506 00000 n 
+0003396663 00000 n 
+0003396818 00000 n 
+0003396975 00000 n 
+0003397131 00000 n 
+0003397288 00000 n 
+0003397445 00000 n 
+0003397602 00000 n 
+0003397757 00000 n 
+0003397913 00000 n 
+0003398070 00000 n 
+0003398227 00000 n 
+0003398383 00000 n 
+0003398540 00000 n 
+0003398696 00000 n 
+0003398851 00000 n 
+0003399007 00000 n 
+0003399164 00000 n 
+0003399321 00000 n 
+0003399478 00000 n 
+0003399632 00000 n 
+0003399789 00000 n 
+0003399946 00000 n 
+0003400103 00000 n 
+0003400260 00000 n 
+0003400417 00000 n 
+0003400571 00000 n 
+0003400728 00000 n 
+0003400885 00000 n 
+0003401041 00000 n 
+0003401198 00000 n 
+0003401354 00000 n 
+0003401511 00000 n 
+0003401667 00000 n 
+0003401824 00000 n 
+0003401980 00000 n 
+0003402135 00000 n 
+0003402291 00000 n 
+0003402447 00000 n 
+0003402604 00000 n 
+0003402761 00000 n 
+0003402918 00000 n 
+0003403073 00000 n 
+0003403229 00000 n 
+0003403386 00000 n 
+0003403543 00000 n 
+0003403700 00000 n 
+0003403856 00000 n 
+0003404012 00000 n 
+0003404168 00000 n 
+0003404325 00000 n 
+0003404481 00000 n 
+0003404638 00000 n 
+0003404795 00000 n 
+0003404951 00000 n 
+0003405106 00000 n 
+0003405259 00000 n 
+0003405415 00000 n 
+0003405570 00000 n 
+0003405726 00000 n 
+0003405881 00000 n 
+0003406037 00000 n 
+0003406191 00000 n 
+0003406347 00000 n 
+0003406501 00000 n 
+0003406657 00000 n 
+0003406812 00000 n 
+0003406968 00000 n 
+0003407123 00000 n 
+0003407278 00000 n 
+0003407434 00000 n 
+0003407590 00000 n 
+0003407746 00000 n 
+0003407902 00000 n 
+0003408057 00000 n 
+0003408212 00000 n 
+0003408366 00000 n 
+0003426146 00000 n 
+0003412819 00000 n 
+0003408720 00000 n 
+0003426084 00000 n 
+0003413751 00000 n 
+0003413905 00000 n 
+0003414058 00000 n 
+0003414212 00000 n 
+0003414367 00000 n 
+0003414523 00000 n 
+0003414679 00000 n 
+0003414835 00000 n 
+0003414988 00000 n 
+0003415143 00000 n 
+0003415297 00000 n 
+0003415453 00000 n 
+0003415609 00000 n 
+0003415763 00000 n 
+0003415918 00000 n 
+0003416074 00000 n 
+0003416230 00000 n 
+0003416386 00000 n 
+0003416542 00000 n 
+0003416697 00000 n 
+0003416852 00000 n 
+0003417006 00000 n 
+0003417161 00000 n 
+0003417317 00000 n 
+0003417473 00000 n 
+0003417628 00000 n 
+0003417783 00000 n 
+0003417939 00000 n 
+0003418094 00000 n 
+0003418250 00000 n 
+0003418406 00000 n 
+0003418560 00000 n 
+0003418715 00000 n 
+0003418870 00000 n 
+0003419026 00000 n 
+0003419182 00000 n 
+0003419337 00000 n 
+0003419492 00000 n 
+0003419648 00000 n 
+0003419804 00000 n 
+0003419960 00000 n 
+0003420116 00000 n 
+0003420272 00000 n 
+0003420429 00000 n 
+0003420585 00000 n 
+0003420740 00000 n 
+0003420897 00000 n 
+0003421054 00000 n 
+0003421211 00000 n 
+0003421366 00000 n 
+0003421523 00000 n 
+0003421680 00000 n 
+0003421837 00000 n 
+0003421994 00000 n 
+0003422150 00000 n 
+0003422307 00000 n 
+0003422464 00000 n 
+0003422620 00000 n 
+0003422777 00000 n 
+0003422934 00000 n 
+0003423091 00000 n 
+0003423247 00000 n 
+0003423402 00000 n 
+0003423559 00000 n 
+0003423715 00000 n 
+0003423872 00000 n 
+0003424029 00000 n 
+0003424186 00000 n 
+0003424343 00000 n 
+0003424500 00000 n 
+0003424657 00000 n 
+0003424813 00000 n 
+0003424967 00000 n 
+0003425124 00000 n 
+0003425281 00000 n 
+0003425437 00000 n 
+0003425594 00000 n 
+0003425750 00000 n 
+0003425905 00000 n 
+0003440670 00000 n 
+0003429802 00000 n 
+0003426246 00000 n 
+0003440608 00000 n 
+0003430584 00000 n 
+0003430740 00000 n 
+0003430896 00000 n 
+0003431053 00000 n 
+0003431210 00000 n 
+0003431367 00000 n 
+0003431524 00000 n 
+0003431681 00000 n 
+0003431837 00000 n 
+0003431992 00000 n 
+0003432149 00000 n 
+0003432305 00000 n 
+0003432462 00000 n 
+0003432619 00000 n 
+0003432776 00000 n 
+0003432933 00000 n 
+0003433090 00000 n 
+0003433244 00000 n 
+0003433400 00000 n 
+0003433557 00000 n 
+0003433714 00000 n 
+0003433871 00000 n 
+0003434028 00000 n 
+0003434185 00000 n 
+0003434342 00000 n 
+0003434496 00000 n 
+0003434652 00000 n 
+0003434809 00000 n 
+0003434966 00000 n 
+0003435123 00000 n 
+0003435280 00000 n 
+0003435437 00000 n 
+0003435594 00000 n 
+0003435749 00000 n 
+0003435904 00000 n 
+0003436058 00000 n 
+0003436213 00000 n 
+0003436368 00000 n 
+0003436524 00000 n 
+0003436678 00000 n 
+0003436833 00000 n 
+0003436990 00000 n 
+0003437147 00000 n 
+0003437302 00000 n 
+0003437457 00000 n 
+0003437613 00000 n 
+0003437770 00000 n 
+0003437926 00000 n 
+0003438082 00000 n 
+0003438239 00000 n 
+0003438396 00000 n 
+0003438553 00000 n 
+0003438709 00000 n 
+0003438865 00000 n 
+0003439022 00000 n 
+0003439178 00000 n 
+0003439335 00000 n 
+0003439492 00000 n 
+0003439648 00000 n 
+0003439805 00000 n 
+0003439961 00000 n 
+0003440118 00000 n 
+0003440275 00000 n 
+0003440429 00000 n 
+0003709062 00000 n 
+0003455555 00000 n 
+0003444347 00000 n 
+0003440770 00000 n 
+0003455493 00000 n 
+0003445149 00000 n 
+0003445305 00000 n 
+0003445461 00000 n 
+0003445618 00000 n 
+0003445775 00000 n 
+0003445932 00000 n 
+0003446089 00000 n 
+0003446246 00000 n 
+0003446402 00000 n 
+0003446557 00000 n 
+0003446713 00000 n 
+0003446870 00000 n 
+0003447026 00000 n 
+0003447183 00000 n 
+0003447340 00000 n 
+0003447497 00000 n 
+0003447652 00000 n 
+0003447808 00000 n 
+0003447965 00000 n 
+0003448122 00000 n 
+0003448278 00000 n 
+0003448435 00000 n 
+0003448591 00000 n 
+0003448748 00000 n 
+0003448905 00000 n 
+0003449062 00000 n 
+0003449219 00000 n 
+0003449376 00000 n 
+0003449533 00000 n 
+0003449690 00000 n 
+0003449847 00000 n 
+0003450003 00000 n 
+0003450159 00000 n 
+0003450313 00000 n 
+0003450468 00000 n 
+0003450624 00000 n 
+0003450780 00000 n 
+0003450937 00000 n 
+0003451093 00000 n 
+0003451249 00000 n 
+0003451406 00000 n 
+0003451562 00000 n 
+0003451718 00000 n 
+0003451875 00000 n 
+0003452032 00000 n 
+0003452189 00000 n 
+0003452345 00000 n 
+0003452501 00000 n 
+0003452658 00000 n 
+0003452815 00000 n 
+0003452972 00000 n 
+0003453128 00000 n 
+0003453284 00000 n 
+0003453440 00000 n 
+0003453597 00000 n 
+0003453753 00000 n 
+0003453909 00000 n 
+0003454065 00000 n 
+0003454221 00000 n 
+0003454378 00000 n 
+0003454534 00000 n 
+0003454691 00000 n 
+0003454848 00000 n 
+0003455004 00000 n 
+0003455159 00000 n 
+0003455314 00000 n 
+0003462657 00000 n 
+0003457468 00000 n 
+0003455655 00000 n 
+0003462595 00000 n 
+0003457910 00000 n 
+0003458065 00000 n 
+0003458220 00000 n 
+0003458376 00000 n 
+0003458530 00000 n 
+0003458685 00000 n 
+0003458841 00000 n 
+0003458996 00000 n 
+0003459151 00000 n 
+0003459307 00000 n 
+0003459462 00000 n 
+0003459617 00000 n 
+0003459773 00000 n 
+0003459928 00000 n 
+0003460082 00000 n 
+0003460238 00000 n 
+0003460393 00000 n 
+0003460548 00000 n 
+0003460704 00000 n 
+0003460859 00000 n 
+0003461016 00000 n 
+0003461172 00000 n 
+0003461327 00000 n 
+0003461482 00000 n 
+0003461638 00000 n 
+0003461794 00000 n 
+0003461949 00000 n 
+0003462104 00000 n 
+0003462260 00000 n 
+0003462416 00000 n 
+0003465165 00000 n 
+0003465131 00000 n 
+0003468519 00000 n 
+0003468450 00000 n 
+0003471291 00000 n 
+0003471261 00000 n 
+0003474891 00000 n 
+0003474813 00000 n 
+0003477325 00000 n 
+0003477293 00000 n 
+0003482262 00000 n 
+0003482059 00000 n 
+0003486377 00000 n 
+0003486185 00000 n 
+0003491869 00000 n 
+0003491595 00000 n 
+0003494665 00000 n 
+0003494531 00000 n 
+0003497086 00000 n 
+0003497054 00000 n 
+0003497195 00000 n 
+0003515044 00000 n 
+0003524130 00000 n 
+0003526693 00000 n 
+0003526667 00000 n 
+0003528848 00000 n 
+0003528625 00000 n 
+0003531310 00000 n 
+0003531255 00000 n 
+0003534495 00000 n 
+0003534378 00000 n 
+0003541721 00000 n 
+0003541415 00000 n 
+0003544594 00000 n 
+0003544564 00000 n 
+0003547475 00000 n 
+0003547250 00000 n 
+0003554386 00000 n 
+0003554146 00000 n 
+0003559284 00000 n 
+0003559190 00000 n 
+0003570311 00000 n 
+0003569965 00000 n 
+0003573433 00000 n 
+0003573326 00000 n 
+0003579526 00000 n 
+0003579283 00000 n 
+0003584663 00000 n 
+0003584567 00000 n 
+0003604027 00000 n 
+0003616776 00000 n 
+0003616432 00000 n 
+0003637998 00000 n 
+0003658724 00000 n 
+0003662481 00000 n 
+0003662206 00000 n 
+0003665114 00000 n 
+0003665080 00000 n 
+0003674989 00000 n 
+0003674638 00000 n 
+0003698769 00000 n 
+0003709165 00000 n 
+0003709287 00000 n 
+0003709415 00000 n 
+0003709543 00000 n 
+0003709671 00000 n 
+0003709799 00000 n 
+0003709927 00000 n 
+0003710055 00000 n 
+0003710183 00000 n 
+0003710311 00000 n 
+0003710439 00000 n 
+0003710567 00000 n 
+0003710701 00000 n 
+0003710825 00000 n 
+0003710960 00000 n 
+0003711095 00000 n 
+0003711179 00000 n 
+0003711266 00000 n 
+0003718993 00000 n 
+0003934687 00000 n 
+0003934730 00000 n 
+0003934772 00000 n 
+0003934910 00000 n 
+trailer
+<<
+/Size 12733
+/Root 12731 0 R
+/Info 12732 0 R
+/ID [<B7F0B452D8C6B60E8C3059FD585177C2> <B7F0B452D8C6B60E8C3059FD585177C2>]
+>>
+startxref
+3935175
+%%EOF
diff --git a/doc/ppl-user-0.10pre27.ps.gz b/doc/ppl-user-0.10pre27.ps.gz
new file mode 100644
index 0000000..e1cb81c
Binary files /dev/null and b/doc/ppl-user-0.10pre27.ps.gz differ
diff --git a/doc/ppl-user-0.9-html.tar.gz b/doc/ppl-user-0.9-html.tar.gz
deleted file mode 100644
index 6a1cf9b..0000000
Binary files a/doc/ppl-user-0.9-html.tar.gz and /dev/null differ
diff --git a/doc/ppl-user-0.9.pdf b/doc/ppl-user-0.9.pdf
deleted file mode 100644
index d754838..0000000
Binary files a/doc/ppl-user-0.9.pdf and /dev/null differ
diff --git a/doc/ppl-user-0.9.ps.gz b/doc/ppl-user-0.9.ps.gz
deleted file mode 100644
index 43a274a..0000000
Binary files a/doc/ppl-user-0.9.ps.gz and /dev/null differ
diff --git a/doc/ppl.sty b/doc/ppl.sty
index 8050a21..064efa2 100644
--- a/doc/ppl.sty
+++ b/doc/ppl.sty
@@ -1,11 +1,11 @@
 %%    LaTeX package providing macros for typesetting the PPL manuals.
-%%    Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%%    Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 %%
 %% This file is part of the Parma Polyhedra Library (PPL).
 %%
 %% The PPL 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
+%% Free Software Foundation; either version 3 of the License, or (at your
 %% option) any later version.
 %%
 %% The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/doc/ppl_lcdd.1 b/doc/ppl_lcdd.1
index ee8267a..ea36281 100644
--- a/doc/ppl_lcdd.1
+++ b/doc/ppl_lcdd.1
@@ -1,4 +1,5 @@
-.TH PPL_LCDD "1" "January 2006" "ppl_lcdd 0.8" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
+.TH PPL_LCDD "1" "September 2008" "ppl_lcdd 0.10pre26" "User Commands"
 .SH NAME
 ppl_lcdd \- a PPL-based program for vertex/facet enumeration of convex polyhedra
 .SH SYNOPSIS
@@ -15,9 +16,6 @@ limits memory usage to MB megabytes
 \fB\-h\fR, \fB\-\-help\fR
 prints this help text to stdout
 .TP
-\fB\-V\fR, \fB\-\-version\fR
-prints version information to stdout
-.TP
 \fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
 appends output to PATH
 .TP
@@ -27,6 +25,9 @@ prints timings to stderr
 \fB\-v\fR, \fB\-\-verbose\fR
 produces lots of output
 .TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
 \fB\-cPATH\fR, \fB\-\-check\fR=\fIPATH\fR
 checks if the result is equal to what is in PATH
 .SH AVAILABILITY
@@ -40,7 +41,7 @@ See the file \fBCREDITS\fR in the source distribution or use the command
 .SH "REPORTING BUGS"
 Report bugs to <ppl\-devel at cs.unipr.it>.
 .SH COPYRIGHT
-Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001\-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 .br
 This is free software; see the file \fBCOPYING\fR in the source
 distribution or use the command \fBppl\-config \-\-copying\fR to
diff --git a/doc/ppl_lpsol.1 b/doc/ppl_lpsol.1
index ca8fa44..3d72c8e 100644
--- a/doc/ppl_lpsol.1
+++ b/doc/ppl_lpsol.1
@@ -1,4 +1,5 @@
-.TH PPL_LPSOL "1" "January 2006" "ppl_lpsol 0.8" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
+.TH PPL_LPSOL "1" "September 2008" "ppl_lpsol 0.10pre26" "User Commands"
 .SH NAME
 ppl_lpsol \- a PPL-based linear programming problem solver
 .SH SYNOPSIS
@@ -6,8 +7,12 @@ ppl_lpsol \- a PPL-based linear programming problem solver
 [\fIOPTION\fR]... [\fIFILE\fR]...
 .SH DESCRIPTION
 .TP
-\fB\-c\fR, \fB\-\-check\fR
-checks plausibility of the optimum value found
+\fB\-c\fR, \fB\-\-check\fR[=\fITHRESHOLD\fR] checks the obtained results;
+optima are checked
+with a tolerance of THRESHOLD (default 1e\-09)
+.TP
+\fB\-i\fR, \fB\-\-incremental\fR
+solves the problem incrementally
 .TP
 \fB\-m\fR, \fB\-\-min\fR
 minimizes the objective function
@@ -15,6 +20,12 @@ minimizes the objective function
 \fB\-M\fR, \fB\-\-max\fR
 maximizes the objective function (default)
 .TP
+\fB\-n\fR, \fB\-\-no\-optimization\fR
+checks for satisfiability only
+.TP
+\fB\-r\fR, \fB\-\-no\-mip\fR
+consider integer variables as real variables
+.TP
 \fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
 limits CPU usage to SECS seconds
 .TP
@@ -24,9 +35,6 @@ limits memory usage to MB megabytes
 \fB\-h\fR, \fB\-\-help\fR
 prints this help text to stdout
 .TP
-\fB\-V\fR, \fB\-\-version\fR
-prints version information to stdout
-.TP
 \fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
 appends output to PATH
 .TP
@@ -39,8 +47,19 @@ use the simplex method
 \fB\-t\fR, \fB\-\-timings\fR
 prints timings to stderr
 .TP
-\fB\-v\fR, \fB\-\-verbose\fR
-outputs also the constraints and objective function
+\fB\-v\fR, \fB\-\-verbosity\fR=\fILEVEL\fR
+sets verbosity level (from 0 to 4, default 3):
+0 \fB\-\-\fR> quiet: no output except for errors and
+.IP
+explicitly required notifications
+.IP
+1 \fB\-\-\fR> solver state only
+2 \fB\-\-\fR> state + optimal value
+3 \fB\-\-\fR> state + optimal value + optimum location
+4 \fB\-\-\fR> lots of output
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
 .SH AVAILABILITY
 The latest version of the Parma Polyhedra Library and all the documentation
 is available at
@@ -50,7 +69,7 @@ is available at
 See the file \fBCREDITS\fR in the source distribution or use the command
 \fBppl\-config \-\-credits\fR for a list of contributors.
 .SH COPYRIGHT
-Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001\-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 .br
 This is free software; see the file \fBCOPYING\fR in the source
 distribution or use the command \fBppl\-config \-\-copying\fR to
diff --git a/doc/user-c-interface.doxyconf-html b/doc/user-c-interface.doxyconf-html
new file mode 100644
index 0000000..c60e5e5
--- /dev/null
+++ b/doc/user-c-interface.doxyconf-html
@@ -0,0 +1,249 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface"
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = PPL_HTML_Tag_Documentation_of_Interfaces
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         /home/roberto/ppl/ppl/doc/../interfaces/C/C_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user-c-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-user-0.10pre27-html.tag=../ppl-user-0.10pre27-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-c-interface.doxyconf-html.in b/doc/user-c-interface.doxyconf-html.in
new file mode 100644
index 0000000..a9aa6b2
--- /dev/null
+++ b/doc/user-c-interface.doxyconf-html.in
@@ -0,0 +1,249 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface"
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = PPL_HTML_Tag_Documentation_of_Interfaces
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/C/C_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user-c-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-c-interface.doxyconf-latex b/doc/user-c-interface.doxyconf-latex
new file mode 100644
index 0000000..59bb435
--- /dev/null
+++ b/doc/user-c-interface.doxyconf-latex
@@ -0,0 +1,249 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         /home/roberto/ppl/ppl/doc/../interfaces/C/C_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-c-interface.doxyconf-latex.in b/doc/user-c-interface.doxyconf-latex.in
new file mode 100644
index 0000000..8c22606
--- /dev/null
+++ b/doc/user-c-interface.doxyconf-latex.in
@@ -0,0 +1,249 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL C Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/C/ppl_c_version.h \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/C/C_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-c-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-c-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-c-interface.tex b/doc/user-c-interface.tex
new file mode 100644
index 0000000..6e76771
--- /dev/null
+++ b/doc/user-c-interface.tex
@@ -0,0 +1,130 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library C Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library C Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+C Language Interface \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/user-java-interface.doxyconf-html.in b/doc/user-java-interface.doxyconf-html.in
new file mode 100644
index 0000000..5e8ef5a
--- /dev/null
+++ b/doc/user-java-interface.doxyconf-html.in
@@ -0,0 +1,284 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Java Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = PPL_HTML_Tag_Documentation_of_Interfaces
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../interfaces/Java/Java_interface.dox \
+                         @srcdir@/../interfaces/Java/ppl_java/By_Reference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Degenerate_Element.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Length_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Optimization_Mode.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Partial_Function.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/PPL_Object.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Relation_Symbol.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variables_Set.java \
+                         ../interfaces/Java/ppl_java \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.java
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user-java-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user-java-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-java-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-java-interface.doxyconf-latex b/doc/user-java-interface.doxyconf-latex
new file mode 100644
index 0000000..6ac89ab
--- /dev/null
+++ b/doc/user-java-interface.doxyconf-latex
@@ -0,0 +1,284 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Java Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = /home/roberto/ppl/ppl/doc/../interfaces/Java/Java_interface.dox \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/By_Reference.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Coefficient.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Congruence.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Congruence_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Constraint.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Constraint_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Degenerate_Element.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Generator.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Generator_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Generator_Type.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Grid_Generator.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Grid_Generator_System.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Length_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/MIP_Problem.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Optimization_Mode.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Partial_Function.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/PPL_Object.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Relation_Symbol.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Variable.java \
+                         /home/roberto/ppl/ppl/doc/../interfaces/Java/ppl_java/Variables_Set.java \
+                         ../interfaces/Java/ppl_java \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.java
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-java-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user-java-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-java-interface.doxyconf-latex.in b/doc/user-java-interface.doxyconf-latex.in
new file mode 100644
index 0000000..a02cec8
--- /dev/null
+++ b/doc/user-java-interface.doxyconf-latex.in
@@ -0,0 +1,284 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Java Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../interfaces/Java/Java_interface.dox \
+                         @srcdir@/../interfaces/Java/ppl_java/By_Reference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Congruence_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Constraint_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Degenerate_Element.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Domain_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_System.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Grid_Generator_Type.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Invalid_Argument_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Length_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Coefficient.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Difference.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Sum.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Times.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Linear_Expression_Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Logic_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem.java \
+                         @srcdir@/../interfaces/Java/ppl_java/MIP_Problem_Status.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Optimization_Mode.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Overflow_Error_Exception.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Parma_Polyhedra_Library.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Partial_Function.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Con_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Poly_Gen_Relation.java \
+                         @srcdir@/../interfaces/Java/ppl_java/PPL_Object.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Relation_Symbol.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variable.java \
+                         @srcdir@/../interfaces/Java/ppl_java/Variables_Set.java \
+                         ../interfaces/Java/ppl_java \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.java
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-java-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-java-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-java-interface.tex b/doc/user-java-interface.tex
new file mode 100644
index 0000000..8347fbf
--- /dev/null
+++ b/doc/user-java-interface.tex
@@ -0,0 +1,130 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Java Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Java Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+Java Language Interface \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/user-ocaml-interface.doxyconf-html.in b/doc/user-ocaml-interface.doxyconf-html.in
new file mode 100644
index 0000000..d200fce
--- /dev/null
+++ b/doc/user-ocaml-interface.doxyconf-html.in
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL OCaml Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = PPL_HTML_Tag_Documentation_of_Interfaces
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../interfaces/OCaml/OCaml_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user-ocaml-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user-ocaml-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-ocaml-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-ocaml-interface.doxyconf-latex b/doc/user-ocaml-interface.doxyconf-latex
new file mode 100644
index 0000000..835531d
--- /dev/null
+++ b/doc/user-ocaml-interface.doxyconf-latex
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL OCaml Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = /home/roberto/ppl/ppl/doc/../interfaces/OCaml/OCaml_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-ocaml-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user-ocaml-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-ocaml-interface.doxyconf-latex.in b/doc/user-ocaml-interface.doxyconf-latex.in
new file mode 100644
index 0000000..5be58b1
--- /dev/null
+++ b/doc/user-ocaml-interface.doxyconf-latex.in
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL OCaml Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/../interfaces/OCaml/OCaml_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-ocaml-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-ocaml-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-ocaml-interface.tex b/doc/user-ocaml-interface.tex
new file mode 100644
index 0000000..3168141
--- /dev/null
+++ b/doc/user-ocaml-interface.tex
@@ -0,0 +1,146 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ocamldoc}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+% This is a kludge to avoid the standard 2-columns index:
+% OCaml identifiers are too long for that.
+\makeatletter
+\renewenvironment{theindex}
+  {\section*{\indexname}
+   \markboth{\MakeUppercase\indexname}%
+            {\MakeUppercase\indexname}%
+   \thispagestyle{plain}
+   \setlength{\parindent}{0pt}
+   \setlength{\parskip}{0pt plus 0.3pt}
+   \relax
+   \let\item\@idxitem}%
+  {}
+\makeatother
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library OCaml Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library OCaml Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+OCaml Language Interface \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/user-prolog-interface.doxyconf-html b/doc/user-prolog-interface.doxyconf-html
new file mode 100644
index 0000000..07eed9b
--- /dev/null
+++ b/doc/user-prolog-interface.doxyconf-html
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = PPL_HTML_Tag_Documentation_of_Interfaces
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/Prolog/Prolog_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user-prolog-interface-0.10pre27-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-user-0.10pre27-html.tag=../ppl-user-0.10pre27-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-prolog-interface.doxyconf-html.in b/doc/user-prolog-interface.doxyconf-html.in
new file mode 100644
index 0000000..cd2a98d
--- /dev/null
+++ b/doc/user-prolog-interface.doxyconf-html.in
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\ref \1 \"\2\""
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = PPL_HTML_Tag_Documentation_of_Interfaces
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user-prolog-interface- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html.tag
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-prolog-interface.doxyconf-latex b/doc/user-prolog-interface.doxyconf-latex
new file mode 100644
index 0000000..2652f5e
--- /dev/null
+++ b/doc/user-prolog-interface.doxyconf-latex
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = 0.10pre27
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/Prolog/Prolog_interface.dox \
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user-prolog-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-prolog-interface.doxyconf-latex.in b/doc/user-prolog-interface.doxyconf-latex.in
new file mode 100644
index 0000000..81ab53a
--- /dev/null
+++ b/doc/user-prolog-interface.doxyconf-latex.in
@@ -0,0 +1,247 @@
+# Doxyfile 1.5.6-20080819
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL Prolog Language Interface "
+PROJECT_NUMBER         = @VERSION@
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = "extref{2}=\2"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 5
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user-prolog-interface.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user-prolog-interface.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_FUNCTIONS \
+                         PPL_DECLARE_OUTPUT_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/user-prolog-interface.tex b/doc/user-prolog-interface.tex
new file mode 100644
index 0000000..f31c7e1
--- /dev/null
+++ b/doc/user-prolog-interface.tex
@@ -0,0 +1,130 @@
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL 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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Prolog Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Prolog Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+Prolog Language Interface \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.}
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/user.doxyconf-html b/doc/user.doxyconf-html
index 040450d..99f8435 100644
--- a/doc/user.doxyconf-html
+++ b/doc/user.doxyconf-html
@@ -1,1243 +1,245 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = 0.9
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
+PROJECT_NUMBER         = 0.10pre27
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
 ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
 STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
 STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
 INHERIT_DOCS           = NO
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
 ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
 EXTRACT_STATIC         = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = YES
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = YES
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = YES
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = YES
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
 SORT_MEMBER_DOCS       = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = NO
-
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
 FILE_VERSION_FILTER    = 
-
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = NO
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
+WARN_FORMAT            = "$file:$line: $text "
 WARN_LOGFILE           = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = ./definitions.dox \
+INPUT                  = /home/roberto/ppl/ppl/doc/definitions.dox \
                          ../src/ppl.hh \
-                         ../interfaces/C/ppl_c.h \
-                         ./../interfaces/Prolog/Prolog_interface.dox \
-                         ./gpl.dox \
-                         ./fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
 RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
 EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
-# from the input.
-
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
 EXCLUDE_PATTERNS       = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
+EXCLUDE_SYMBOLS        = 
 EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
 EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
 IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
 INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
-
 FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = NO
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = NO
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
 IGNORE_PREFIX          = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
 GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = user.html-dir
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-user-0.10pre27-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
 HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
 HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
 HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
 CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
 HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
 GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
+LATEX_OUTPUT           = user.latex-dir
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = ./user.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user.tex
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
 RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
 RTF_EXTENSIONS_FILE    = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
 PERLMOD_MAKEVAR_PREFIX = 
-
 #---------------------------------------------------------------------------
 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
 INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
 INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
-
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
 TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
+GENERATE_TAGFILE       = ppl-user-0.10pre27-html.tag
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
-# powerful graphs.
-
 CLASS_DIAGRAMS         = NO
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = NO
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = NO
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = NO
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = NO
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
 DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
 DOTFILE_DIRS           = 
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that a graph may be further truncated if the graph's 
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
-# the graph is not depth-constrained.
-
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/user.doxyconf-html.in b/doc/user.doxyconf-html.in
index 86d92a0..c230487 100644
--- a/doc/user.doxyconf-html.in
+++ b/doc/user.doxyconf-html.in
@@ -1,1243 +1,245 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
 PROJECT_NUMBER         = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
 ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
 STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
 STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
 INHERIT_DOCS           = NO
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
 ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
 EXTRACT_STATIC         = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = YES
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = YES
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = YES
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = YES
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
 SORT_MEMBER_DOCS       = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = NO
-
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
 FILE_VERSION_FILTER    = 
-
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = NO
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
+WARN_FORMAT            = "$file:$line: $text "
 WARN_LOGFILE           = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
 INPUT                  = @srcdir@/definitions.dox \
                          ../src/ppl.hh \
-                         ../interfaces/C/ppl_c.h \
-                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
                          @srcdir@/gpl.dox \
                          @srcdir@/fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
 RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
 EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
-# from the input.
-
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
 EXCLUDE_PATTERNS       = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
+EXCLUDE_SYMBOLS        = 
 EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
 EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
 IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
 INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
-
 FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = NO
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = NO
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
 IGNORE_PREFIX          = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
 GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = user.html-dir
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-user- at VERSION@-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
 HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
 HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
 HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
 CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
 HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
 GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
+LATEX_OUTPUT           = user.latex-dir
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
 LATEX_HEADER           = @srcdir@/user.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
 RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
 RTF_EXTENSIONS_FILE    = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
 PERLMOD_MAKEVAR_PREFIX = 
-
 #---------------------------------------------------------------------------
 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
 INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
 INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
-
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
 TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
+GENERATE_TAGFILE       = ppl-user- at VERSION@-html.tag
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = @PERL@
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
-# powerful graphs.
-
 CLASS_DIAGRAMS         = NO
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = NO
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = NO
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = NO
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = NO
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
 DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
 DOTFILE_DIRS           = 
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that a graph may be further truncated if the graph's 
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
-# the graph is not depth-constrained.
-
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/user.doxyconf-latex b/doc/user.doxyconf-latex
index 914fb15..60d5b2e 100644
--- a/doc/user.doxyconf-latex
+++ b/doc/user.doxyconf-latex
@@ -1,1243 +1,245 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = 0.9
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
+PROJECT_NUMBER         = 0.10pre27
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
 ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
 STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
 STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
 INHERIT_DOCS           = NO
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
 ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
 EXTRACT_STATIC         = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = YES
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = YES
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = YES
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = YES
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
 SORT_MEMBER_DOCS       = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = NO
-
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
 FILE_VERSION_FILTER    = 
-
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = NO
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
+WARN_FORMAT            = "$file:$line: $text "
 WARN_LOGFILE           = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = ./definitions.dox \
+INPUT                  = /home/roberto/ppl/ppl/doc/definitions.dox \
                          ../src/ppl.hh \
-                         ../interfaces/C/ppl_c.h \
-                         ./../interfaces/Prolog/Prolog_interface.dox \
-                         ./gpl.dox \
-                         ./fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+                         /home/roberto/ppl/ppl/doc/gpl.dox \
+                         /home/roberto/ppl/ppl/doc/fdl.dox
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
 RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
 EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
-# from the input.
-
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
 EXCLUDE_PATTERNS       = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
+EXCLUDE_SYMBOLS        = 
 EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
 EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
 IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
 INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
-
 FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = NO
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = NO
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
 IGNORE_PREFIX          = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
 GENERATE_HTML          = NO
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-user-0.10pre27-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
 HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
 HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
 HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
 CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
 HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
 GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
 LATEX_OUTPUT           = user.latex-dir
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = ./user.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
+LATEX_HEADER           = /home/roberto/ppl/ppl/doc/user.tex
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
 RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
 RTF_EXTENSIONS_FILE    = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
 PERLMOD_MAKEVAR_PREFIX = 
-
 #---------------------------------------------------------------------------
 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
 INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
 INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
-
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
 TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
 GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
-# powerful graphs.
-
 CLASS_DIAGRAMS         = NO
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = NO
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = NO
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = NO
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = NO
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
 DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
 DOTFILE_DIRS           = 
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that a graph may be further truncated if the graph's 
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
-# the graph is not depth-constrained.
-
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/user.doxyconf-latex.in b/doc/user.doxyconf-latex.in
index eb06c0f..1b3c9b8 100644
--- a/doc/user.doxyconf-latex.in
+++ b/doc/user.doxyconf-latex.in
@@ -1,1243 +1,245 @@
-# Doxyfile 1.4.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# Doxyfile 1.5.6-20080819
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
+DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = PPL
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
 PROJECT_NUMBER         = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
 OUTPUT_DIRECTORY       = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
 CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
-# Swedish, and Ukrainian.
-
 OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
 BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
 REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
 ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
 ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
 INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
 FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
 STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
 STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
 SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
-
 JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
+QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
 INHERIT_DOCS           = NO
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
 SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
 TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
 ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
 OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
 OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
 SUBGROUPING            = YES
-
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
 EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
 EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
 EXTRACT_STATIC         = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
 EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
 EXTRACT_LOCAL_METHODS  = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
+EXTRACT_ANON_NSPACES   = NO
 HIDE_UNDOC_MEMBERS     = YES
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
 HIDE_UNDOC_CLASSES     = YES
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
 HIDE_FRIEND_COMPOUNDS  = YES
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
 HIDE_IN_BODY_DOCS      = YES
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
 INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
 CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
 HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
 INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
 SORT_MEMBER_DOCS       = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
 SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
 GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
 GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
 GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
 GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
 ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
 MAX_INITIALIZER_LINES  = 5
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = NO
-
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
 SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
 FILE_VERSION_FILTER    = 
-
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
 QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
 WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
 WARN_IF_UNDOCUMENTED   = NO
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
 WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
 WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
+WARN_FORMAT            = "$file:$line: $text "
 WARN_LOGFILE           = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
 INPUT                  = @srcdir@/definitions.dox \
                          ../src/ppl.hh \
-                         ../interfaces/C/ppl_c.h \
-                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
                          @srcdir@/gpl.dox \
                          @srcdir@/fdl.dox
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
+INPUT_ENCODING         = UTF-8
 FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
 RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
 EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
-# from the input.
-
 EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
 EXCLUDE_PATTERNS       = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
+EXCLUDE_SYMBOLS        = 
 EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
 EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
 EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
 IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
 INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
-
 FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
 FILTER_SOURCE_FILES    = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
 SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
 INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
 STRIP_CODE_COMMENTS    = NO
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
 REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
 REFERENCES_RELATION    = NO
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
+REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
 VERBATIM_HEADERS       = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
 COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
 IGNORE_PREFIX          = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
 GENERATE_HTML          = NO
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
+HTML_OUTPUT            = ppl-user- at VERSION@-html
 HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
 HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
 HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
 HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
 HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
 GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS  = NO
 CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
 HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
 TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
 DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
 ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
 GENERATE_TREEVIEW      = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
 TREEVIEW_WIDTH         = 250
-
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
 GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
 LATEX_OUTPUT           = user.latex-dir
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
 LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
 MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_LATEX          = YES
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
 PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
 EXTRA_PACKAGES         = ppl
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
 LATEX_HEADER           = @srcdir@/user.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
 PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
 USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
 LATEX_BATCHMODE        = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
 LATEX_HIDE_INDICES     = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
 GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
 RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
 COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
 RTF_HYPERLINKS         = YES
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
 RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
 RTF_EXTENSIONS_FILE    = 
-
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
 GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
 MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
 MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
 MAN_LINKS              = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
 GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
 XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
 XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
 XML_PROGRAMLISTING     = YES
-
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
 GENERATE_AUTOGEN_DEF   = NO
-
 #---------------------------------------------------------------------------
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
 GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
 PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
 PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
 PERLMOD_MAKEVAR_PREFIX = 
-
 #---------------------------------------------------------------------------
 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
 ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
 MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
 EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
 SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
 INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
 INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = PPL_PROTO(protos):=protos
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
-                         PPL_OUTPUT_DECLARATIONS
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
-
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
 SKIP_FUNCTION_MACROS   = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to external references   
 #---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
 TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
 GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
 ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
 EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
 PERL_PATH              = @PERL@
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
-# powerful graphs.
-
 CLASS_DIAGRAMS         = NO
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
+MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
 HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = NO
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = NO
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
 TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = NO
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
 CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
+CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = NO
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
 DIRECTORY_GRAPH        = NO
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
 DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
 DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
 DOTFILE_DIRS           = 
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that a graph may be further truncated if the graph's 
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
-# the graph is not depth-constrained.
-
+DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
-# read).
-
 DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
 DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
 GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
 DOT_CLEANUP            = YES
-
 #---------------------------------------------------------------------------
 # Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
 SEARCHENGINE           = NO
diff --git a/doc/user.tex b/doc/user.tex
index be0b302..a9e77bb 100644
--- a/doc/user.tex
+++ b/doc/user.tex
@@ -1,4 +1,4 @@
-% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 %
 % This document describes the Parma Polyhedra Library (PPL).
 %
@@ -11,7 +11,7 @@
 %
 % The PPL 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
+% Free Software Foundation; either version 3 of the License, or (at your
 % option) any later version.  The license is included, in various
 % formats, in the `doc' subdirectory of each distribution of the PPL in
 % files are called `gpl.*'.
@@ -25,32 +25,37 @@
 % site: http://www.cs.unipr.it/ppl/ .
 
 \documentclass[a4paper]{article}
-\nonstopmode
 \usepackage{a4wide}
 \usepackage{makeidx}
 \usepackage{fancyhdr}
 \usepackage{graphicx}
+\usepackage{multicol}
 \usepackage{float}
+\usepackage{textcomp}
 \usepackage{alltt}
-\usepackage{doxygen}
 \usepackage{times}
-\ifx\pdfoutput\undefined
-\usepackage[ps2pdf,
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
             pagebackref=true,
             colorlinks=true,
-            linkcolor=blue
+            linkcolor=blue,
+            unicode
            ]{hyperref}
-\usepackage{pspicture}
 \else
-\usepackage[pdftex,
+\usepackage[ps2pdf,
             pagebackref=true,
             colorlinks=true,
-            linkcolor=blue
+            linkcolor=blue,
+            unicode
            ]{hyperref}
+\usepackage{pspicture}
 \fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
 \usepackage{ppl}
 \makeindex
-\setcounter{tocdepth}{1}
+\setcounter{tocdepth}{2}
 \renewcommand{\footrulewidth}{0.4pt}
 
 \rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
@@ -100,7 +105,7 @@ Tatiana Zolo
 \maketitle
 
 \newpage
-Copyright \copyright\ 2001--2006 Roberto Bagnara (bagnara at cs.unipr.it).
+Copyright \copyright\ 2001--2008 Roberto Bagnara (bagnara at cs.unipr.it).
 
 This document describes the Parma Polyhedra Library (PPL).
 
@@ -110,14 +115,14 @@ or any later version published by the
 \href{http://www.fsf.org}{Free Software Foundation};
 with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 A copy of the license is included in the section entitled
-``\hyperlink{GFDL}{GNU Free Documentation License}''.
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
 
 The PPL is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
-\href{http://www.fsf.org}{Free Software Foundation}; either version 2
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
 of the License, or (at your option) any later version.
 A copy of the license is included in the section entitled
-``\hyperlink{GPL}{GNU GENERAL PUBLIC LICENSE}''.
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
diff --git a/fedora/Makefile.am b/fedora/Makefile.am
new file mode 100644
index 0000000..b17e2f7
--- /dev/null
+++ b/fedora/Makefile.am
@@ -0,0 +1,27 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = \
+ppl.spec \
+ppl.hh \
+ppl_c.h \
+pwl.hh
diff --git a/fedora/Makefile.in b/fedora/Makefile.in
new file mode 100644
index 0000000..512966f
--- /dev/null
+++ b/fedora/Makefile.in
@@ -0,0 +1,428 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = fedora
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = \
+ppl.spec \
+ppl.hh \
+ppl_c.h \
+pwl.hh
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  fedora/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  fedora/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/fedora/ppl.hh b/fedora/ppl.hh
new file mode 100644
index 0000000..c6e9332
--- /dev/null
+++ b/fedora/ppl.hh
@@ -0,0 +1,43 @@
+/* This is the header file switcher of the Parma Polyhedra Library.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#if defined(__x86_64__)
+#include "ppl-x86_64.hh"
+#elif defined(__i386__)
+#include "ppl-i386.hh"
+#elif defined(__powerpc64__)
+#include "ppl-ppc64.hh"
+#elif defined(__powerpc__)
+#include "ppl-ppc.hh"
+#elif defined(__ia64__)
+#include "ppl-ia64.hh"
+#elif defined(__alpha__)
+#include "ppl-alpha.hh"
+#elif defined(__arm__)
+#include "ppl-arm.hh"
+#elif defined(__s390x__)
+#include "ppl-s390x.hh"
+#elif defined(__s390__)
+#include "ppl-s390.hh"
+#else
+#error "This architecture is not supported by the currently installed ppl-devel packages."
+#endif
diff --git a/fedora/ppl.spec b/fedora/ppl.spec
new file mode 100644
index 0000000..e9b3e2e
--- /dev/null
+++ b/fedora/ppl.spec
@@ -0,0 +1,527 @@
+%define opt %(test -x %{_bindir}/ocamlopt && echo 1 || echo 0)
+
+Name:		ppl
+Version:	0.10pre14
+Release:	3%{?dist}
+
+Summary:	The Parma Polyhedra Library: a library of numerical abstractions
+Group:		Development/Libraries
+License:	GPLv3+
+URL:		http://www.cs.unipr.it/ppl/
+Source0:	ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.gz
+Source1:	ppl.hh
+Source2:	ppl_c.h
+Source3:	pwl.hh
+#Patch0:		ppl-0.10-docfiles.patch
+#Patch1:		ppl-0.10-configure.patch
+#Patch2:		ppl-0.10-makefiles.patch
+#Icon:
+#Requires:
+BuildRequires:	gmp-devel >= 4.1.3
+BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root
+#Prefix:	/usr
+
+%description
+The Parma Polyhedra Library (PPL) is a library for the manipulation of
+(not necessarily closed) convex polyhedra and other numerical
+abstractions.  The applications of convex polyhedra include program
+analysis, optimized compilation, integer and combinatorial
+optimization and statistical data-editing.  The Parma Polyhedra
+Library comes with several user friendly interfaces, is fully dynamic
+(available virtual memory is the only limitation to the dimension of
+anything), written in accordance to all the applicable standards,
+exception-safe, rather efficient, thoroughly documented, and free
+software.  This package provides all what is necessary to run
+applications using the PPL through its C and C++ interfaces.
+
+%package devel
+Summary:	Development tools for the Parma Polyhedra Library C and C++ interfaces
+Group:		Development/Libraries
+Requires:	%{name} = %{version}-%{release}, gmp-devel >= 4.1.3
+%description devel
+The header files, Autoconf macro, documentation, and ppl-config tool
+developing applications using the Parma Polyhedra Library through its
+C and C++ interfaces.
+
+%package static
+Summary:	Static archives for the Parma Polyhedra Library C and C++ interfaces
+Group:		Development/Libraries
+Requires:	%{name}-devel = %{version}-%{release}
+%description static
+The static archives for the Parma Polyhedra Library C and C++ interfaces.
+
+%package utils
+Summary:	Utilities using the Parma Polyhedra Library
+Group:		Development/Libraries
+Requires:	%{name} = %{version}-%{release}
+BuildRequires:	glpk-devel >= 4.13
+%description utils
+This package contains the (mixed integer) linear programming solver ppl_lpsol
+and the program ppl_lcdd for vertex/facet enumeration of convex polyhedra.
+
+%ifnarch ppc64
+%package gprolog
+# The `gprolog' package is not available on ppc64:
+# the GNU Prolog interface must thus be disabled for that architecture.
+Summary:	The GNU Prolog interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+BuildRequires:	gprolog >= 1.2.19
+Requires:	%{name} = %{version}-%{release}, %{name}-pwl = %{version}-%{release}, gprolog >= 1.2.19
+%description gprolog
+This package adds GNU Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in GNU Prolog programs.
+%endif
+
+%ifnarch ppc64
+%package gprolog-static
+Summary:	The static archive for the GNU Prolog interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+Requires:	%{name}-gprolog = %{version}-%{release}
+%description gprolog-static
+This package contains the static archive for the GNU Prolog interface
+of the Parma Polyhedra Library.
+%endif
+
+%package swiprolog
+Summary:	The SWI-Prolog interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+BuildRequires:	pl >= 5.6.0
+Requires:	%{name} = %{version}-%{release}, %{name}-pwl = %{version}-%{release}, pl >= 5.6.0
+%description swiprolog
+This package adds SWI-Prolog support to the Parma Polyhedra Library.
+Install this package if you want to use the library in SWI-Prolog programs.
+
+%package swiprolog-static
+Summary:	The static archive for the SWI-Prolog interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+BuildRequires:	pl >= 5.6.0
+Requires:	%{name}-swiprolog = %{version}-%{release}
+%description swiprolog-static
+This package contains the static archive for the SWI-Prolog interface
+of the Parma Polyhedra Library.
+
+%package yap
+Summary:	The YAP Prolog interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+BuildRequires:	yap-devel >= 5.1.1
+Requires:	%{name} = %{version}-%{release}, %{name}-pwl = %{version}-%{release}, yap >= 5.1.1
+%description yap
+This package adds YAP Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in YAP Prolog programs.
+
+%package yap-static
+Summary:	The static archive for the YAP Prolog interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+BuildRequires:	yap-devel >= 5.1.1
+Requires:	%{name}-yap = %{version}-%{release}
+%description yap-static
+This package contains the static archive for the YAP Prolog interface
+of the Parma Polyhedra Library.
+
+%package ocaml
+Summary:	The OCaml interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+BuildRequires:	ocaml >= 3.09
+Requires:	%{name} = %{version}-%{release}, %{name}-pwl = %{version}-%{release}
+%description ocaml
+This package adds Objective Caml (OCaml) support to the Parma
+Polyhedra Library.  Install this package if you want to use the
+library in OCaml programs.
+
+%package ocaml-devel
+Summary:	The OCaml interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+Requires:	%{name}-ocaml = %{version}-%{release}
+%description ocaml-devel
+This package contains libraries and signature files for developing
+applications using the OCaml interface of the Parma Polyhedra Library.
+
+%package docs
+Summary:	Documentation for the Parma Polyhedra Library
+Group:		Documentation
+Requires:	%{name} = %{version}-%{release}
+%description docs
+This package contains all the documentations required by programmers
+using the Parma Polyhedra Library (PPL).
+Install this package if you want to program with the PPL.
+
+%package pwl
+Summary:	The Parma Watchdog Library: a C++ library for watchdog timers
+Group:		Development/Libraries
+%description pwl
+The Parma Watchdog Library (PWL) provides support for multiple,
+concurrent watchdog timers on systems providing setitimer(2).  This
+package provides all what is necessary to run applications using the
+PWL.  The PWL is currently distributed with the Parma Polyhedra
+Library, but is totally independent from it.
+
+%package pwl-devel
+Summary:	Development tools for the Parma Watchdog Library
+Group:		Development/Libraries
+Requires:	%{name}-pwl = %{version}-%{release}
+%description pwl-devel
+The header files, documentation and static libraries for developing
+applications using the Parma Watchdog Library.
+
+%package pwl-static
+Summary:	Static archive for the Parma Watchdog Library
+Group:		Development/Libraries
+Requires:	%{name}-pwl-devel = %{version}-%{release}
+%description pwl-static
+This package contains the static archive for the Parma Watchdog Library.
+
+
+%prep
+%setup -q
+#%patch0 -p1
+#%patch1 -p1
+#%patch2 -p1
+
+%build
+CPPFLAGS="-I%{_includedir}/glpk"
+%ifnarch ppc64
+CPPFLAGS="$CPPFLAGS -I%{_libdir}/gprolog-`gprolog --version 2>&1 | head -1 | sed -e "s/.* \([^ ]*\)$/\1/g"`/include"
+%endif
+CPPFLAGS="$CPPFLAGS -I%{_includedir}/Yap"
+%configure --enable-shared --disable-rpath CPPFLAGS="$CPPFLAGS"
+sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
+sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+make DESTDIR=%{buildroot} INSTALL="%{__install} -p" install
+rm -f %{buildroot}%{_libdir}/*.la %{buildroot}%{_libdir}/%{name}/*.la
+
+# In order to avoid multiarch conflicts when installed for multiple
+# architectures (e.g., i386 and x86_64), we rename the header files
+# of the ppl-devel and ppl-pwl-devel packages.  They are substituted with
+# ad-hoc switchers that select the appropriate header file depending on
+# the architecture for which the compiler is compiling.
+
+# Since our header files only depend on the sizeof things, we smash
+# ix86 onto i386 and arm* onto arm.
+normalized_arch=%{_arch}
+%ifarch %{ix86}
+normalized_arch=i386
+%endif
+%ifarch %{arm}
+normalized_arch=arm
+%endif
+
+mv %{buildroot}/%{_includedir}/ppl.hh %{buildroot}/%{_includedir}/ppl-${normalized_arch}.hh
+install -m644 %{SOURCE1} %{buildroot}/%{_includedir}/ppl.hh
+mv %{buildroot}/%{_includedir}/ppl_c.h %{buildroot}/%{_includedir}/ppl_c-${normalized_arch}.h
+install -m644 %{SOURCE2} %{buildroot}/%{_includedir}/ppl_c.h
+mv %{buildroot}/%{_includedir}/pwl.hh %{buildroot}/%{_includedir}/pwl-${normalized_arch}.hh
+install -m644 %{SOURCE3} %{buildroot}/%{_includedir}/pwl.hh
+
+%files
+%defattr(-,root,root,-)
+%doc %{_datadir}/doc/%{name}/BUGS
+%doc %{_datadir}/doc/%{name}/COPYING
+%doc %{_datadir}/doc/%{name}/CREDITS
+%doc %{_datadir}/doc/%{name}/ChangeLog
+%doc %{_datadir}/doc/%{name}/NEWS
+%doc %{_datadir}/doc/%{name}/README
+%doc %{_datadir}/doc/%{name}/TODO
+%doc %{_datadir}/doc/%{name}/gpl.*
+%{_libdir}/libppl.so.*
+%{_libdir}/libppl_c.so.*
+
+%dir %{_libdir}/%{name}
+%dir %{_datadir}/doc/%{name}
+
+%files devel
+%defattr(-,root,root,-)
+%doc %{_datadir}/doc/%{name}/README.configure
+%{_includedir}/ppl*.hh
+%{_includedir}/ppl_c*.h
+%{_libdir}/libppl.so
+%{_libdir}/libppl_c.so
+%{_bindir}/ppl-config
+%{_mandir}/man1/ppl-config.1.gz
+%{_datadir}/aclocal/ppl.m4
+
+%files static
+%defattr(-,root,root,-)
+%{_libdir}/libppl.a
+%{_libdir}/libppl_c.a
+
+%files utils
+%defattr(-,root,root,-)
+%{_bindir}/ppl_lcdd
+%{_bindir}/ppl_lpsol
+%{_mandir}/man1/ppl_lcdd.1.gz
+%{_mandir}/man1/ppl_lpsol.1.gz
+
+%ifnarch ppc64
+%files gprolog
+%defattr(-,root,root,-)
+%doc interfaces/Prolog/GNU/README.gprolog
+%{_bindir}/ppl_gprolog
+%{_libdir}/%{name}/ppl_gprolog.pl
+%{_libdir}/%{name}/libppl_gprolog.so
+%endif
+
+%ifnarch ppc64
+%files gprolog-static
+%defattr(-,root,root,-)
+%{_libdir}/%{name}/libppl_gprolog.a
+%endif
+
+%files swiprolog
+%defattr(-,root,root,-)
+%doc interfaces/Prolog/SWI/README.swiprolog
+%{_bindir}/ppl_pl
+%{_libdir}/%{name}/libppl_swiprolog.so
+%{_libdir}/%{name}/ppl_swiprolog.pl
+
+%files swiprolog-static
+%defattr(-,root,root,-)
+%{_libdir}/%{name}/libppl_swiprolog.a
+
+%files yap
+%defattr(-,root,root,-)
+%doc interfaces/Prolog/YAP/README.yap
+%{_libdir}/%{name}/ppl_yap.pl
+%{_libdir}/%{name}/ppl_yap.so
+
+%files yap-static
+%defattr(-,root,root,-)
+%{_libdir}/%{name}/ppl_yap.a
+
+%files ocaml
+%defattr(-,root,root,-)
+%doc interfaces/OCaml/README.ocaml
+%{_libdir}/%{name}/ppl_ocaml.cma
+%{_libdir}/%{name}/ppl_ocaml.cmi
+%{_libdir}/%{name}/ppl_ocaml_globals.cmi
+%{_libdir}/%{name}/ppl_ocaml_types.cmi
+
+%files ocaml-devel
+%defattr(-,root,root,-)
+%{_libdir}/%{name}/libppl_ocaml.a
+%{_libdir}/%{name}/ppl_ocaml.mli
+
+%files docs
+%defattr(-,root,root,-)
+%doc %{_datadir}/doc/%{name}/README.doc
+%doc %{_datadir}/doc/%{name}/ppl-user-%{version}-html/
+%doc %{_datadir}/doc/%{name}/fdl.*
+%doc %{_datadir}/doc/%{name}/ppl-user-%{version}.pdf
+%doc %{_datadir}/doc/%{name}/ppl-user-%{version}.ps.gz
+
+%files pwl
+%defattr(-,root,root,-)
+%doc Watchdog/BUGS Watchdog/COPYING Watchdog/CREDITS Watchdog/ChangeLog Watchdog/NEWS Watchdog/README
+%{_libdir}/libpwl.so.*
+
+%files pwl-devel
+%defattr(-,root,root,-)
+%doc Watchdog/README.doc
+%{_includedir}/pwl*.hh
+%{_libdir}/libpwl.so
+
+%files pwl-static
+%defattr(-,root,root,-)
+%{_libdir}/libpwl.a
+
+%post -p /sbin/ldconfig
+%postun -p /sbin/ldconfig
+%post pwl -p /sbin/ldconfig
+%postun pwl -p /sbin/ldconfig
+
+%clean
+rm -rf %{buildroot}
+
+%changelog
+* Wed Jan 09 2008 Roberto Bagnara <bagnara at cs.unipr.it> 0.10-3
+- Avoid multiarch conflicts when installed for multiple architectures.
+
+* Sat Sep 29 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.10-2
+- The value of the `License' tag is now `GPLv3+'.
+- `ppl-swiprolog' dependency on `readline-devel' removed (again).
+
+* Thu Aug 30 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.10-1
+- Started working on the PPL 0.10 spec file.
+- New packages `ppl-ocaml' and `ppl-ocaml-devel' contain the OCaml interface.
+
+* Fri Jul 06 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-13
+- Bug 246815 had been fixed: YAP support enabled again.
+
+* Thu Jul 05 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-12
+- Disable YAP support until bug 246815 is fixed.
+- Bug 243084 has been fixed: `ppl-swiprolog' dependency on `readline-devel'
+  removed.
+
+* Thu Jul 05 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-11
+- The `gprolog' package is not available on the ppc64 architecture:
+  so do `ppl-gprolog' and `ppl-gprolog-static'.
+
+* Tue Jul 03 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-10
+- Use `%%{buildroot}' consistently, instead of  `$RPM_BUILD_ROOT'.
+
+* Mon Jul 02 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-9
+- Patch NEWS, TODO and doc/definitions.dox so as to use the
+  UTF-8 encoding instead of ISO-8859.
+
+* Tue Jun 12 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-8
+- Patch the `libtool' script after `%%configure' so as to fix
+  the rpath issue.
+- Revised the description of the `devel' package.
+- Include also the `TODO' file in the documentation of the main package.
+
+* Thu Jun 07 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-7
+- `%%install' commands revised.
+
+* Thu Jun 07 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-6
+- All the static archives are now in `*-static' packages.
+- Packages `ppl-gprolog-devel', `ppl-swiprolog-devel' and `ppl-yap-devel'
+  renamed `ppl-gprolog', `ppl-swiprolog' and `ppl-yap',
+  respectively.
+- As a workaround for a bug in the `pl' package (Bugzilla Bug 243084),
+  `ppl-swiprolog' is now dependent on `readline-devel'.
+- Added `%%dir %%{_datadir}/doc/%%{name}'.
+- The `ppl-user-0.9-html' documentation directory is now properly listed.
+- Remove installed *.la files.
+- Added a `ppl-0.9-configure.patch' to avoid overriding CFLAGS and CXXFLAGS.
+
+* Wed Jun 06 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-5
+- Use `%%{_includedir}' and `%%{_libdir}' instead of `/usr/include'
+  and `/usr/lib', respectively.
+- Use `%%{_datadir}/doc/%%{name}' instead of `/usr/share/doc/ppl'.
+- Replaced `%%defattr(-,root,root)' with `%%defattr(-,root,root,-)'.
+
+* Fri Feb 23 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-4
+- The user manual (in various formats) is now in the `docs' package.
+
+* Thu Feb 22 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-3
+- Dependencies for YAP fixed.
+- Make sure the header files of GNU Prolog and YAP are found.
+
+* Wed Feb 21 2007 Roberto Bagnara <bagnara at cs.unipr.it>
+- Added missing dependencies.
+
+* Sun Feb 18 2007 Roberto Bagnara <bagnara at cs.unipr.it>
+- `%%doc' tags corrected for the Prolog interfaces.
+- Tabs used consistently instead of spaces.
+
+* Sat Feb 17 2007 Roberto Bagnara <bagnara at cs.unipr.it>
+- Make `swiprolog-devel' depend on `pl' (at leat 5.6); documentation added.
+- The `yap' package has been renamed `yap-devel' and completed.
+- The `gprolog' package has been renamed `gprolog-devel' and completed.
+- The `ppl_lcdd' and `ppl_lpsol' programs are now in a new `utils' package.
+- The `ppl-config' program is now in the `devel' package.
+- Modified the configuration command so that the `glpk-devel' include files
+  are found.
+
+* Sun Feb 11 2007 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-2
+- The `%%_libdir/ppl' is no longer orphaned.
+- Use `make %%{?_smp_mflags}' for building.
+- The `swi' package has been renamed `swiprolog-devel'.
+
+* Sat Feb 10 2007 Roberto Bagnara <bagnara at cs.unipr.it>
+- Added the `%%changelog' section.
+- `Release' set to 2.
+- `Packager' and `Vendor' tags removed.
+- `Summary' fields are no longer ended with a dot.
+- The value of the `License' tag is now `GPL'.
+- Removed unused definition of `builddir'.
+- The `Name', `Version' and `Release' tags are now directly defined.
+- Commented out the efinitions of the `Require' and `Prefix' tags.
+- Set the `BuildRequires' tag to `gmp-devel'.
+- Exploit the features of `%%setup', `%%configure', `%%install',
+  `%%post' and `%%postun'.
+- Mixed use of spaces and tabs avoided.
+- Do configure with the --disable-rpath option so as to avoid
+  hardcoding the path to search libraries.
+- Do not include libtool archive files.
+- Packages reorganized.
+
+* Mon Jan 16 2006 Roberto Bagnara <bagnara at cs.unipr.it> 0.9-1
+- Install gzipped man pages.
+- The `Copyright' tag is no longer supported: use `License' instead.
+
+* Wed Jan 11 2006 Roberto Bagnara <bagnara at cs.unipr.it>
+- Include `ppl-config' in `%%{_bindir}' and the man pages in
+  `%%{_mandir}/man1'.
+
+* Tue Jan 10 2006 Roberto Bagnara <bagnara at cs.unipr.it>
+- Require gcc-c++ to be at least 4.0.2.
+- Distribute also `ppl_lpsol'.
+
+* Tue Mar 01 2005 Roberto Bagnara <bagnara at cs.unipr.it>
+- Wrong dependency fixed.
+
+* Mon Feb 28 2005 Roberto Bagnara <bagnara at cs.unipr.it>
+- URL for the source fixed.
+
+* Fri Dec 24 2004 Roberto Bagnara <bagnara at cs.unipr.it>
+- Sentence fixed.
+
+* Thu Dec 23 2004 Roberto Bagnara <bagnara at cs.unipr.it>
+- The file doc/README has been renamed README.doc so as not to conflict
+  with the library's main README file.
+- Require gcc-c++ to be exactly version 3.4.1.
+- `Summary' updated to reflect the fact that the library now provides
+  numerical abstractions other than convex polyhedra.
+
+* Wed Aug 18 2004 Roberto Bagnara <bagnara at cs.unipr.it>
+- Distribute more documentation.
+
+* Mon Aug 16 2004 Roberto Bagnara <bagnara at cs.unipr.it>
+- Added the `ppl_lcdd' program to the main package.
+- Require gcc-c++ to be exactly version 3.4.1.
+- We require gmp at least 4.1.3.
+
+* Wed Jul 30 2003 Roberto Bagnara <bagnara at cs.unipr.it>
+- Build an RPM package also for the PWL.
+- The Prolog interfaces depend on the PWL.
+
+* Tue Mar 04 2003 Roberto Bagnara <bagnara at cs.unipr.it>
+- We require gmp at least 4.1.2.
+
+* Fri Oct 04 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- Require gcc-c++ 3.2 or later version.
+- Require gmp 4.1 or later version.
+
+* Sun Jun 30 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- Mention not necessarily closed convex polyhedra in the main `%%description'.
+
+* Tue Jun 25 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- `%%files' section for gprolog package fixed.
+
+* Mon Jun 24 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- `%%files' section fixed for the yap package.
+- The `%%files' sections of each package are now complete.
+
+* Wed Jun 12 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- Added file list for package gprolog.
+- Updated file list for package swi.
+
+* Thu Jun 06 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- The `swi' package has now its `%%files' section.
+
+* Wed Jun 05 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- We will build several RPM packages out of our source tree.
+
+* Mon Mar 04 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- Require gcc-c++ 3.0.4 or later version.
+- Require gmp 4.0.1 or later version.
+
+* Sun Jan 27 2002 Roberto Bagnara <bagnara at cs.unipr.it>
+- The move to libtool is complete: we can now build and distribute
+  (with, e.g., RPM) static and dynamic versions of the library.
+
+* Tue Oct 16 2001 Roberto Bagnara <bagnara at cs.unipr.it>
+- Changed `Summary'.
+- Changed `Packager' in view of PGP signatures.
+- Changed `Group' to `Development/Libraries'.
+- Require gcc-c++ 2.96-85 or later version.
+
+* Mon Oct 15 2001 Roberto Bagnara <bagnara at cs.unipr.it>
+- Now we build a relocatable package.
+
+* Mon Oct 15 2001 Roberto Bagnara <bagnara at cs.unipr.it>
+- A first cut at a working RPM spec file.
diff --git a/fedora/ppl_c.h b/fedora/ppl_c.h
new file mode 100644
index 0000000..87b471d
--- /dev/null
+++ b/fedora/ppl_c.h
@@ -0,0 +1,43 @@
+/* Header file switcher for the C interface.  -*- C -*-
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#if defined(__x86_64__)
+#include "ppl_c-x86_64.h"
+#elif defined(__i386__)
+#include "ppl_c-i386.h"
+#elif defined(__powerpc64__)
+#include "ppl_c-ppc64.h"
+#elif defined(__powerpc__)
+#include "ppl_c-ppc.h"
+#elif defined(__ia64__)
+#include "ppl_c-ia64.h"
+#elif defined(__alpha__)
+#include "ppl_c-alpha.h"
+#elif defined(__arm__)
+#include "ppl_c-arm.h"
+#elif defined(__s390x__)
+#include "ppl_c-s390x.h"
+#elif defined(__s390__)
+#include "ppl_c-s390.h"
+#else
+#error "This architecture is not supported by the currently installed ppl-devel packages."
+#endif
diff --git a/fedora/pwl.hh b/fedora/pwl.hh
new file mode 100644
index 0000000..f8b9cd3
--- /dev/null
+++ b/fedora/pwl.hh
@@ -0,0 +1,43 @@
+/* This is the header file switcher of the Parma Watchdog Library.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL 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 3 of the License, or (at your
+option) any later version.
+
+The PWL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#if defined(__x86_64__)
+#include "pwl-x86_64.hh"
+#elif defined(__i386__)
+#include "pwl-i386.hh"
+#elif defined(__powerpc64__)
+#include "pwl-ppc64.hh"
+#elif defined(__powerpc__)
+#include "pwl-ppc.hh"
+#elif defined(__ia64__)
+#include "pwl-ia64.hh"
+#elif defined(__alpha__)
+#include "pwl-alpha.hh"
+#elif defined(__arm__)
+#include "pwl-arm.hh"
+#elif defined(__s390x__)
+#include "pwl-s390x.hh"
+#elif defined(__s390__)
+#include "pwl-s390.hh"
+#else
+#error "This architecture is not supported by the currently installed ppl-pwl-devel packages."
+#endif
diff --git a/install-sh b/install-sh
index 0ae12c0..a5897de 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2005-11-07.23
+scriptversion=2006-12-25.00
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -39,52 +39,68 @@ scriptversion=2005-11-07.23
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# 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-}"
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
 
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
+# 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_glob=
 posix_mkdir=
 
-# Symbolic mode for testing mkdir with directories.
-# It is the same as 755, but also tests that "u+" works.
-test_mode=u=rwx,g=rx,o=rx,u+wx
-
 # Desired mode of installed file.
 mode=0755
 
-# Desired mode of newly created intermediate directories.
-# It is empty if not known yet.
-intermediate_mode=
-
+chgrpcmd=
 chmodcmd=$chmodprog
 chowncmd=
-chgrpcmd=
-stripcmd=
+mvcmd=$mvprog
 rmcmd="$rmprog -f"
-mvcmd="$mvprog"
+stripcmd=
+
 src=
 dst=
 dir_arg=
-dstarg=
+dst_arg=
+
+copy_on_change=false
 no_target_directory=
 
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
    or: $0 [OPTION]... SRCFILES... DIRECTORY
    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
    or: $0 [OPTION]... -d DIRECTORIES...
@@ -94,81 +110,86 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
 In the 4th, create DIRECTORIES.
 
 Options:
--c         (ignored)
--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.
---help     display this help and exit.
---version  display version info and exit.
+     --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 CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
 "
 
-while test -n "$1"; do
+while test $# -ne 0; do
   case $1 in
-    -c) shift
-        continue;;
+    -c) ;;
+
+    -C) copy_on_change=true;;
 
-    -d) dir_arg=true
-        shift
-        continue;;
+    -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
+	shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-        shift
-        shift
-        continue;;
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
 
     -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
+	shift;;
 
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
+    -s) stripcmd=$stripprog;;
 
-    -t) dstarg=$2
-	shift
-	shift
-	continue;;
+    -t) dst_arg=$2
+	shift;;
 
-    -T) no_target_directory=true
-	shift
-	continue;;
+    -T) no_target_directory=true;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    *)  # When -d is used, all remaining arguments are directories to create.
-	# When -t is used, the destination is already specified.
-	test -n "$dir_arg$dstarg" && break
-        # Otherwise, the last argument is the destination.  Remove it from $@.
-	for arg
-	do
-          if test -n "$dstarg"; then
-	    # $@ is not empty: it contains at least $arg.
-	    set fnord "$@" "$dstarg"
-	    shift # fnord
-	  fi
-	  shift # arg
-	  dstarg=$arg
-	done
+    --)	shift
 	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
   esac
+  shift
 done
 
-if test -z "$1"; then
+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
+  done
+fi
+
+if test $# -eq 0; then
   if test -z "$dir_arg"; then
     echo "$0: no input file specified." >&2
     exit 1
@@ -178,13 +199,38 @@ if test -z "$1"; then
   exit 0
 fi
 
-test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 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 starting with `-'.
   case $src in
-    -*) src=./$src ;;
+    -*) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -202,22 +248,22 @@ do
       exit 1
     fi
 
-    if test -z "$dstarg"; then
+    if test -z "$dst_arg"; then
       echo "$0: no destination specified." >&2
       exit 1
     fi
 
-    dst=$dstarg
+    dst=$dst_arg
     # Protect names starting with `-'.
     case $dst in
-      -*) dst=./$dst ;;
+      -*) dst=./$dst;;
     esac
 
     # 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: $dstarg: Is a directory" >&2
+	echo "$0: $dst_arg: Is a directory" >&2
 	exit 1
       fi
       dstdir=$dst
@@ -230,14 +276,25 @@ do
 	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	     X"$dst" : 'X\(//\)[^/]' \| \
 	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| \
-	     .       : '\(.\)' 2>/dev/null ||
+	     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'
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
       `
 
       test -d "$dstdir"
@@ -250,83 +307,131 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	posix_mkdir=false
-	if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
-	  posix_mkdir=true
-	else
-	  # Remove any dirs left behind by ancient mkdir implementations.
-	  rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
-	fi ;;
-    esac
-
-    if
-      $posix_mkdir && {
+	# 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, create it using the same intermediate mode that
-	# mkdir -p would use when creating intermediate directories.
-	# POSIX says that this mode is "$(umask -S),u+wx", so use that
-	# if umask -S works.
-
+	# Otherwise, rely on $mkdir_umask.
 	if test -n "$dir_arg"; then
-	  mkdir_mode=$mode
+	  mkdir_mode=-m$mode
 	else
-	  case $intermediate_mode in
-	    '')
-	      if umask_S=`(umask -S) 2>/dev/null`; then
-		intermediate_mode=$umask_S,u+wx
-	      else
-		intermediate_mode=$test_mode
-	      fi ;;
-	  esac
-	  mkdir_mode=$intermediate_mode
+	  mkdir_mode=
 	fi
 
-	$mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
-      }
+	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
 
-      # 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.
+      # 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
-	/*) pathcomp=/ ;;
-	-*) pathcomp=./ ;;
-	*)  pathcomp= ;;
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
       esac
 
-      case $posix_glob in
-        '')
-	  if (set -f) 2>/dev/null; then
-	    posix_glob=true
-	  else
-	    posix_glob=false
-	  fi ;;
-      esac
+      eval "$initialize_posix_glob"
 
       oIFS=$IFS
       IFS=/
-      $posix_glob && set -f
+      $posix_glob set -f
       set fnord $dstdir
       shift
-      $posix_glob && set +f
+      $posix_glob set +f
       IFS=$oIFS
 
+      prefixes=
+
       for d
       do
-	test "x$d" = x && continue
+	test -z "$d" && continue
 
-	pathcomp=$pathcomp$d
-	if test ! -d "$pathcomp"; then
-	  $mkdirprog "$pathcomp"
-	  # Don't fail if two instances are running concurrently.
-	  test -d "$pathcomp" || exit 1
+	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
-	pathcomp=$pathcomp/
+	prefix=$prefix/
       done
-      obsolete_mkdir_used=true
+
+      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
 
@@ -334,7 +439,7 @@ do
     { 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
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
   else
 
     # Make a couple of temp file names in the proper directory.
@@ -345,7 +450,7 @@ do
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    $doit $cpprog "$src" "$dsttmp" &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
@@ -353,41 +458,54 @@ do
     # 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"; } &&
-
-    # Now 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.
-	   {
-	     if test -f "$dst"; then
-	       $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
-	       }
-	     else
-	       :
-	     fi
-	   } &&
-
-	   # Now rename the file to the real destination.
-	   $doit $mvcmd "$dsttmp" "$dst"
-	 }
-    } || exit 1
+    { 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
diff --git a/instchk.hh b/instchk.hh
index bd4ad1e..b95f97e 100644
--- a/instchk.hh
+++ b/instchk.hh
@@ -1,12 +1,12 @@
 /* Fake declarations to test the validity of the arguments of the
    --enabled-instantiations option defined in configure.ac.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,6 +28,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <inttypes.h>
 #endif
 
+#include "gmpxx.h"
+
 namespace Parma_Polyhedra_Library {
 
 class Polyhedron {
@@ -35,18 +37,231 @@ public:
   static bool valid_instantiation() {
     return true;
   }
-  static bool valid_Polyhedra_Powerset_argument() {
+};
+
+class C_Polyhedron {
+public:
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class NNC_Polyhedron {
+public:
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Grid {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Rational_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Z_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Float_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Double_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Long_Double_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
     return true;
   }
 };
 
+class Int8_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Int16_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Int32_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Int64_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint8_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint16_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint32_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint64_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+template <typename PS>
+class Pointset_Powerset {
+public:
+  static bool valid_instantiation() {
+    return PS::valid_Pointset_Powerset_argument();
+  }
+};
+
 template <typename T>
 bool
 valid_BD_Shape_argument(void);
 
 template <>
 bool
-valid_BD_Shape_argument<char>() {
+valid_BD_Shape_argument<signed char>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<short>() {
   return true;
 }
 
@@ -58,7 +273,25 @@ valid_BD_Shape_argument<int>() {
 
 template <>
 bool
-valid_BD_Shape_argument<int8_t>() {
+valid_BD_Shape_argument<long>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<long long>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<mpz_class>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<mpq_class>() {
   return true;
 }
 
@@ -68,13 +301,49 @@ public:
   static bool valid_instantiation() {
     return valid_BD_Shape_argument<T>();
   }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+template <typename T>
+class Octagonal_Shape {
+public:
+  static bool valid_instantiation() {
+    return valid_BD_Shape_argument<T>();
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+template <typename D1, typename D2>
+class Direct_Product {
+public:
+  static bool valid_instantiation() {
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
+  }
+};
+
+template <typename D1, typename D2>
+class Smash_Product {
+public:
+  static bool valid_instantiation() {
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
+  }
 };
 
-template <typename PH>
-class Polyhedra_Powerset {
+template <typename D1, typename D2>
+class Constraints_Product {
 public:
   static bool valid_instantiation() {
-    return PH::valid_Polyhedra_Powerset_argument();
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
   }
 };
 
diff --git a/interfaces/C/C_interface.dox b/interfaces/C/C_interface.dox
new file mode 100644
index 0000000..a37b654
--- /dev/null
+++ b/interfaces/C/C_interface.dox
@@ -0,0 +1,1359 @@
+/* Doxumentation for the C language interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \defgroup Polyhedron Convex Polyhedra
+  \brief
+  Types and functions for the domains of (topologically closed and
+  not necessarily closed) convex polyhedra.
+
+  The types and functions for convex polyhedra provide a single interface
+  for accessing both topologically closed (C) and not necessarily closed (NNC)
+  convex polyhedra.
+  The distinction between C and NNC polyhedra need only be explicitly
+  stated when <em>creating</em> or <em>assigning</em> a polyhedron object,
+  by means of one of the functions <code>ppl_new_*</code> and
+  <code>ppl_assign_*</code>.
+
+  Having a single datatype does not mean that C and NNC polyhedra can be
+  freely interchanged: as specified in the main manual, most library
+  functions require their arguments to be topologically and/or
+  space-dimension compatible.
+*/
+/*@{*/
+
+
+/*! \name Opaque Pointers for Polyhedra */
+/*@{*/
+
+/*! \brief Opaque pointer. */
+typedef struct ppl_Polyhedron_tag* ppl_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object. */
+typedef struct ppl_Polyhedron_tag const* ppl_const_Polyhedron_tag;
+
+/*@}*/ /* \name Opaque Pointers Related to Polyhedra */
+
+
+/*! \name Constructors and Assignment for C_Polyhedron */
+/*@{*/
+
+/*! \brief
+  Builds a C polyhedron of dimension \p d and writes an handle to it
+  at address \p pph. If \p empty is different from zero, the newly created
+  polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_C_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \brief
+  Builds a C polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Builds a new C polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \brief
+  Builds a new C polyhedron from the system of congruences \p cs
+  and writes a handle for the newly created polyhedron at address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs);
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of congruences
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the congruence system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs);
+
+/*! \brief
+  Builds a new C polyhedron corresponding to an interval-based
+  bounding box, writing a handle for the newly created polyhedron at
+  address \p pph.
+
+  If an interval of the bounding box is provided with any finite
+  but open bound, then the polyhedron is not built and the value
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
+  The bounding box is accessed by using the following functions,
+  passed as arguments:
+    \code
+      ppl_dimension_type space_dimension()
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      int is_empty()
+    \endcode
+    returns 0 if and only if the bounding box describes a non-empty set.
+    The function <CODE>is_empty()</CODE> will always be called before the
+    other functions. However, if <CODE>is_empty()</CODE> does not
+    return 0, none of the functions below will be called.
+    \code
+      int get_lower_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    lower boundary of \f$I\f$ is open and is set to a value different
+    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+    fraction \f$n/d\f$ corresponds to the greatest lower bound of
+    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
+    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+    positive, \f$0/1\f$ being the unique representation for zero.
+    \code
+      int get_upper_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    upper boundary of \f$I\f$ is open and is set to a value different
+    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_C_Polyhedron_from_bounding_box
+(ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d));
+
+/*! \brief
+  Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
+*/
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for C_Polyhedron */
+
+/*! \name Constructors and Assignment for NNC_Polyhedron */
+/*@{*/
+
+/*! \brief
+  Builds an NNC polyhedron of dimension \p d and writes an handle to it
+  at address \p pph. If \p empty is different from zero, the newly created
+  polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_NNC_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \brief
+  Builds an NNC polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of congruences
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of congruences
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the congruence system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \brief
+  Builds a new NNC polyhedron corresponding to an interval-based
+  bounding box, writing a handle for the newly created polyhedron at
+  address \p pph.
+
+  The bounding box is accessed by using the following functions,
+  passed as arguments:
+    \code
+      ppl_dimension_type space_dimension()
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      int is_empty()
+    \endcode
+    returns 0 if and only if the bounding box describes a non-empty set.
+    The function <CODE>is_empty()</CODE> will always be called before the
+    other functions. However, if <CODE>is_empty()</CODE> does not
+    return 0, none of the functions below will be called.
+    \code
+      int get_lower_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    lower boundary of \f$I\f$ is open and is set to a value different
+    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+    fraction \f$n/d\f$ corresponds to the greatest lower bound of
+    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
+    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+    positive, \f$0/1\f$ being the unique representation for zero.
+    \code
+      int get_upper_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    upper boundary of \f$I\f$ is open and is set to a value different
+    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+(ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d));
+
+/*! \brief
+  Assigns a copy of the NNC polyhedron \p src to the NNC
+  polyhedron \p dst.
+*/
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for NNC Polyhedron */
+
+/*! \name Constructors Behaving as Conversion Operators */
+/*@{*/
+
+/*! \brief
+  Builds a C polyhedron that is a copy of the topological closure
+  of the NNC polyhedron \p ph; writes a handle for the newly created
+  polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+					 ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+					 ppl_const_Polyhedron_t ph);
+
+/*@}*/ /* Constructors Behaving as Conversion Operators */
+
+/*! \name Destructor for (C or NNC) Polyhedra */
+/*@{*/
+
+/*! \brief
+  Invalidates the handle \p ph: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph);
+
+/*@}*/ /* Destructor for (C or NNC) Polyhedra */
+
+/*! \name Functions that Do Not Modify the Polyhedron */
+/*@{*/
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \brief
+  Writes to \p m the affine dimension of \p ph (not to be confused with the
+  dimension of its enclosing vector space) or 0, if \p ph is empty.
+*/
+int
+ppl_Polyhedron_affine_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \brief
+  Checks the relation between the polyhedron \p ph and the constraint \p c.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (chosen among
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
+  PPL_POLY_CON_RELATION_IS_INCLUDED, and
+  PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
+  \p ph and \p c.
+*/
+int
+ppl_Polyhedron_relation_with_Constraint
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \brief
+  Checks the relation between the polyhedron \p ph and the generator \p g.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (only
+  PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
+  relation between \p ph and \p g.
+*/
+int
+ppl_Polyhedron_relation_with_Generator
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_t g);
+
+int
+ppl_Polyhedron_relation_with_Congruence
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \brief
+  Writes a const handle to the constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \brief
+  Writes at address \p pcs a const handle to a system of congruences
+  approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \brief
+  Writes a const handle to the minimized constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_minimized_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \brief
+  Writes at address \p pcs a const handle to a system of minimized
+  congruences approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_minimized_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \brief
+  Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+  not empty.
+*/
+int
+ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Returns a positive integer if \p ph is a universe polyhedron;
+  returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+  unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Returns a positive integer if \p ph contains at least one integer
+  point; returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_contains_integer_point(ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Returns a positive integer if \p ph is topologically closed;
+  returns 0 if \p ph is not topologically closed.
+*/
+int
+ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph);
+
+/*! \brief
+  Returns a positive integer if \p ph is a discrete set;
+  returns 0 if \p ph is not a discrete set.
+*/
+int
+ppl_Polyhedron_is_discrete(ppl_const_Polyhedron_t ph);
+
+int
+ppl_Polyhedron_constrains
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \brief
+  Returns a positive integer if \p le is bounded from above in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_above
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \brief
+  Returns a positive integer if \p le is bounded from below in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_below
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \brief
+  Returns a positive integer if \p ph is not empty
+  and \p le is bounded from above in \p ph, in which case
+  the supremum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be maximized subject to \p ph;
+
+  \param sup_n
+  Will be assigned the numerator of the supremum value;
+
+  \param sup_d
+  Will be assigned the denominator of the supremum value;
+
+  \param pmaximum
+  Will store 1 in this location if the supremum is also the maximum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from above,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_maximize
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum,
+ ppl_Generator_t point);
+
+/*! \brief
+  Returns a positive integer if  \p ph is not empty
+  and \p le is bounded from below in \p ph, in which case
+  the infimum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be minimized subject to \p ph;
+
+  \param inf_n
+  Will be assigned the numerator of the infimum value;
+
+  \param inf_d
+  Will be assigned the denominator of the infimum value;
+
+  \param pminimum
+  Will store 1 in this location if the infimum is also the minimum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from below,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_minimize
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum,
+ ppl_Generator_t point);
+
+/*! \brief
+  Returns a positive integer if \p x contains or is equal to \p y;
+  returns 0 if it does not.
+*/
+int
+ppl_Polyhedron_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Returns a positive integer if \p x strictly contains \p y; returns 0
+  if it does not.
+*/
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Returns a positive integer if \p x and \p y are disjoint; returns 0
+  if they are not.
+*/
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Returns a positive integer if \p x and \p y are the same polyhedron;
+  returns 0 if they are different.
+
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value 0 is returned.
+*/
+int
+ppl_Polyhedron_equals_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Returns a positive integer if \p ph is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p ph is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph);
+
+/*@}*/ /* Functions that Do Not Modify the Polyhedron */
+
+
+/*! \name Space Dimension Preserving Functions that May Modify the Polyhedron */
+/*@{*/
+
+/*! \brief
+  Adds a copy of the constraint \p c to the system of constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \brief
+  Adds a copy of the congruence \p c to polyhedron of \p ph.
+*/
+int
+ppl_Polyhedron_add_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \brief
+  Adds a copy of the system of constraints \p cs to the system of
+  constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \brief
+  Adds a copy of the system of congruences \p cs to the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \brief
+  Adds the system of constraints \p cs to the system of constraints of
+  \p ph.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints
+(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs);
+
+/*! \brief
+  Adds the system of congruences \p cs to the polyhedron \p ph.
+
+  \warning
+  This function modifies the congruence system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_congruences
+(ppl_Polyhedron_t ph, ppl_Congruence_System_t cs);
+
+int
+ppl_Polyhedron_refine_with_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+int
+ppl_Polyhedron_refine_with_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+int
+ppl_Polyhedron_refine_with_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+int
+ppl_Polyhedron_refine_with_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \brief
+  Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Same as ppl_Polyhedron_poly_hull_assign(x, y).
+*/
+int
+ppl_Polyhedron_upper_bound_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Same as ppl_Polyhedron_poly_difference_assign(x, y).
+*/
+int
+ppl_Polyhedron_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Assigns to \p x a meet-preserving enlargement and simplification of \p y.
+*/
+int
+ppl_Polyhedron_simplify_using_context_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Assigns to \p x the \extref{Time_Elapse_Operator, time-elapse} between
+  the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph);
+
+int
+ppl_Polyhedron_unconstrain_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+int
+ppl_Polyhedron_unconstrain_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \brief
+  Transforms the polyhedron \p ph, assigning an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is assigned;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \brief
+  Transforms the polyhedron \p ph, substituting an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is substituted;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y.  If \p tp is not the null pointer, the
+  \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y.  If \p tp is not the null pointer, the
+  \extref{Widening_with_Tokens, widening with tokens} delay technique is
+  applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.  If \p tp is not the null pointer,
+  the \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x. If \p tp is not the null
+  pointer, the \extref{Widening_with_Tokens, widening with tokens} delay
+  technique is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x. If \p tp is not the null pointer,
+  the \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+  If \p tp is not the null pointer,
+  the \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*@}*/ /* Space Dimension Preserving Functions that May Modify [...] */
+
+
+/*! \name Functions that May Modify the Dimension of the Vector Space */
+/*@{*/
+
+/*! \brief
+  Seeing a polyhedron as a set of tuples (its points), assigns
+  to \p x all the tuples that can be obtained by concatenating,
+  in the order given, a tuple of \p x with a tuple of \p y.
+*/
+int
+ppl_Polyhedron_concatenate_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph
+  and to \p ph itself.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \brief
+  Removes from the vector space enclosing \p ph the space dimensions that
+  are specified in first \p n positions of the array \p ds.  The presence
+  of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_remove_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \brief
+  Removes the higher dimensions from the vector space enclosing \p ph
+  so that, upon successful return, the new space dimension is \p d.
+*/
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \brief
+  Remaps the dimensions of the vector space according to a
+  \extref{Mapping_the_Dimensions_of_the_Vector_Space, partial function}.
+  This function is specified by means of the \p maps array,
+  which has \p n entries.
+
+  The partial function is defined on dimension <CODE>i</CODE>
+  if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
+  otherwise it is undefined on dimension <CODE>i</CODE>.
+  If the function is defined on dimension <CODE>i</CODE>, then dimension
+  <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
+
+  The result is undefined if \p maps does not encode a partial
+  function with the properties described in the
+  \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+          specification of the mapping operator}.
+*/
+int
+ppl_Polyhedron_map_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type maps[], size_t n);
+
+/*! \brief
+  \extref{expand_space_dimension, Expands} the \f$d\f$-th dimension of
+  the vector space enclosing \p ph to \p m new space dimensions.
+*/
+int
+ppl_Polyhedron_expand_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type d, ppl_dimension_type m);
+
+/*! \brief
+  Modifies \p ph by \extref{fold_space_dimensions, folding} the
+  space dimensions contained in the first \p n positions of the array \p ds
+  into dimension \p d.  The presence of duplicates in \p ds is a waste
+  but an innocuous one.
+*/
+int
+ppl_Polyhedron_fold_space_dimensions
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d);
+
+/*@}*/ /* Functions that May Modify the Dimension of the Vector Space */
+
+/*! \name Output Functions */
+/*@{*/
+
+/*! \brief Prints \p x to <CODE>stdout</CODE>. */
+int
+ppl_io_print_Polyhedron(ppl_const_Polyhedron_t x);
+
+/*! \brief Prints \p x to the given output \p stream. */
+int
+ppl_io_fprint_Polyhedron(FILE* stream, ppl_const_Polyhedron_t x);
+
+/*! \brief Dumps an ascii representation of \p x on \p stream. */
+int
+ppl_Polyhedron_ascii_dump(ppl_const_Polyhedron_t x, FILE* stream);
+
+/*@}*/ /* Output Functions */
+
+
+/*! \name Ad Hoc Functions for (C or NNC) Polyhedra */
+/*@{*/
+
+/*! \brief
+  Builds a new C polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_C_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \brief
+  Writes a const handle to the generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \brief
+  Writes a const handle to the minimized generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_minimized_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \brief
+  Adds a copy of the generator \p g to the system of generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generator
+(ppl_Polyhedron_t ph, ppl_const_Generator_t g);
+
+/*! \brief
+  Adds a copy of the system of generators \p gs to the system of
+  generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generators
+(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs);
+
+/*! \brief
+  Adds the system of generators \p gs to the system of generators of
+  \p ph.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators
+(ppl_Polyhedron_t ph, ppl_Generator_System_t gs);
+
+/*! \brief
+  Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \brief
+  Assigns to \p x the \extref{Convex_Polyhedral_Difference, poly-difference}
+  of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*@}*/ /* Ad Hoc Functions for (C or NNC) Polyhedra */
+
+
+/*@}*/ /* \defgroup Polyhedron */
diff --git a/interfaces/C/Makefile.am b/interfaces/C/Makefile.am
index 2012751..a22c76e 100644
--- a/interfaces/C/Makefile.am
+++ b/interfaces/C/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,13 +20,24 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-EXTRA_DIST = ppl_c.h.in ppl_c.cc
+interface_generator_files = \
+ppl_interface_generator_c_procedure_generators.m4 \
+ppl_interface_generator_c_h.m4 \
+ppl_interface_generator_c_h_code.m4 \
+ppl_interface_generator_c_h_preamble \
+ppl_interface_generator_c_cc.m4 \
+ppl_interface_generator_c_cc_code.m4 \
+ppl_interface_generator_c_cc_preamble
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+C_interface.dox
 
 if BUILD_C_INTERFACE
 
 # Libtool -version-info for libppl_c.la.
 #
-#  1. Start with version information of `0:0:0' for each libtool library.
+#  1. Start with version information of `0:0:0' for each Libtool library.
 #
 #  2. Update the version information only immediately before a public
 #     release of your software.  More frequent updates are unnecessary,
@@ -56,15 +67,54 @@ LIBPPL_C_LT_CURRENT =  1
 LIBPPL_C_LT_REVISION = 0
 LIBPPL_C_LT_AGE =      1
 
+BUILT_SOURCES = \
+ppl_c.h \
+ppl_c.cc
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+$(interface_generator_files)
+
+ppl_c.h: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_h.m4 > $@
+
+ppl_c.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_cc.m4 > $@
+
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/interfaces/C \
 -I$(top_builddir)/src \
 @extra_includes@
 
 lib_LTLIBRARIES = libppl_c.la
-libppl_c_la_SOURCES = ppl_c.cc
+
+nodist_libppl_c_la_SOURCES = ppl_c.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_c_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
 libppl_c_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
 -version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
 
-include_HEADERS = ppl_c.h
+nodist_include_HEADERS = ppl_c.h ppl_c_version.h
 
 endif BUILD_C_INTERFACE
+
+DISTCLEANFILES = \
+ppl_c.h \
+ppl_c.cc
diff --git a/interfaces/C/Makefile.in b/interfaces/C/Makefile.in
index 71db98a..6fae26c 100644
--- a/interfaces/C/Makefile.in
+++ b/interfaces/C/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/ppl/ .
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -60,10 +56,11 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = interfaces/C
-DIST_COMMON = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/ppl_c.h.in
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/ppl_c_version.h.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -73,14 +70,24 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = ppl_c.h
+CONFIG_CLEAN_FILES = ppl_c_version.h
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -90,64 +97,46 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
 libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
-libppl_c_la_LIBADD =
-am__libppl_c_la_SOURCES_DIST = ppl_c.cc
- at BUILD_C_INTERFACE_TRUE@am_libppl_c_la_OBJECTS = ppl_c.lo
-libppl_c_la_OBJECTS = $(am_libppl_c_la_OBJECTS)
+ at BUILD_C_INTERFACE_TRUE@libppl_c_la_DEPENDENCIES =  \
+ at BUILD_C_INTERFACE_TRUE@	$(top_builddir)/src/libppl.la
+ at BUILD_C_INTERFACE_TRUE@nodist_libppl_c_la_OBJECTS = ppl_c.lo
+libppl_c_la_OBJECTS = $(nodist_libppl_c_la_OBJECTS)
+libppl_c_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_c_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_C_INTERFACE_TRUE at am_libppl_c_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libppl_c_la_SOURCES)
-DIST_SOURCES = $(am__libppl_c_la_SOURCES_DIST)
-am__include_HEADERS_DIST = ppl_c.h
-includeHEADERS_INSTALL = $(INSTALL_HEADER)
-HEADERS = $(include_HEADERS)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(nodist_libppl_c_la_SOURCES)
+DIST_SOURCES =
+nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(nodist_include_HEADERS)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -157,53 +146,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -212,56 +199,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -273,10 +234,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -285,30 +250,60 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-EXTRA_DIST = ppl_c.h.in ppl_c.cc
+interface_generator_files = \
+ppl_interface_generator_c_procedure_generators.m4 \
+ppl_interface_generator_c_h.m4 \
+ppl_interface_generator_c_h_code.m4 \
+ppl_interface_generator_c_h_preamble \
+ppl_interface_generator_c_cc.m4 \
+ppl_interface_generator_c_cc_code.m4 \
+ppl_interface_generator_c_cc_preamble
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+C_interface.dox
+
 
 # Libtool -version-info for libppl_c.la.
 #
-#  1. Start with version information of `0:0:0' for each libtool library.
+#  1. Start with version information of `0:0:0' for each Libtool library.
 #
 #  2. Update the version information only immediately before a public
 #     release of your software.  More frequent updates are unnecessary,
@@ -336,17 +331,42 @@ EXTRA_DIST = ppl_c.h.in ppl_c.cc
 @BUILD_C_INTERFACE_TRUE at LIBPPL_C_LT_CURRENT = 1
 @BUILD_C_INTERFACE_TRUE at LIBPPL_C_LT_REVISION = 0
 @BUILD_C_INTERFACE_TRUE at LIBPPL_C_LT_AGE = 1
+ at BUILD_C_INTERFACE_TRUE@BUILT_SOURCES = \
+ at BUILD_C_INTERFACE_TRUE@ppl_c.h \
+ at BUILD_C_INTERFACE_TRUE@ppl_c.cc
+
+ at BUILD_C_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_C_INTERFACE_TRUE@../ppl_interface_generator_common.m4 \
+ at BUILD_C_INTERFACE_TRUE@../ppl_interface_generator_common_dat.m4 \
+ at BUILD_C_INTERFACE_TRUE@../ppl_interface_generator_copyright \
+ at BUILD_C_INTERFACE_TRUE@../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_C_INTERFACE_TRUE@$(interface_generator_files)
+
 @BUILD_C_INTERFACE_TRUE at AM_CPPFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_C_INTERFACE_TRUE@-I$(top_builddir)/interfaces/C \
 @BUILD_C_INTERFACE_TRUE at -I$(top_builddir)/src \
 @BUILD_C_INTERFACE_TRUE@@extra_includes@
 
 @BUILD_C_INTERFACE_TRUE at lib_LTLIBRARIES = libppl_c.la
- at BUILD_C_INTERFACE_TRUE@libppl_c_la_SOURCES = ppl_c.cc
+ at BUILD_C_INTERFACE_TRUE@nodist_libppl_c_la_SOURCES = ppl_c.cc
+ at BUILD_C_INTERFACE_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at BUILD_C_INTERFACE_TRUE@libppl_c_la_LIBADD = \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_C_INTERFACE_TRUE@@extra_libraries@
+
 @BUILD_C_INTERFACE_TRUE at libppl_c_la_LDFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@$(NO_UNDEFINED_FLAG) \
 @BUILD_C_INTERFACE_TRUE at -version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
 
- at BUILD_C_INTERFACE_TRUE@include_HEADERS = ppl_c.h
-all: all-am
+ at BUILD_C_INTERFACE_TRUE@nodist_include_HEADERS = ppl_c.h ppl_c_version.h
+DISTCLEANFILES = \
+ppl_c.h \
+ppl_c.cc
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .cc .lo .o .obj
@@ -379,25 +399,25 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-ppl_c.h: $(top_builddir)/config.status $(srcdir)/ppl_c.h.in
+ppl_c_version.h: $(top_builddir)/config.status $(srcdir)/ppl_c_version.h.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
 	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-libLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
 	done
 
 clean-libLTLIBRARIES:
@@ -409,7 +429,7 @@ clean-libLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 libppl_c.la: $(libppl_c_la_OBJECTS) $(libppl_c_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_libppl_c_la_rpath) $(libppl_c_la_LDFLAGS) $(libppl_c_la_OBJECTS) $(libppl_c_la_LIBADD) $(LIBS)
+	$(libppl_c_la_LINK) $(am_libppl_c_la_rpath) $(libppl_c_la_OBJECTS) $(libppl_c_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -420,22 +440,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -445,23 +465,19 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-install-includeHEADERS: $(include_HEADERS)
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
 	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
-	@list='$(include_HEADERS)'; for p in $$list; do \
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
+	@list='$(nodist_include_HEADERS)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
-	  echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
-	  $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+	  echo " $(nodist_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+	  $(nodist_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
 	done
 
-uninstall-includeHEADERS:
+uninstall-nodist_includeHEADERS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(include_HEADERS)'; for p in $$list; do \
+	@list='$(nodist_include_HEADERS)'; for p in $$list; do \
 	  f=$(am__strip_dir) \
 	  echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
 	  rm -f "$(DESTDIR)$(includedir)/$$f"; \
@@ -472,8 +488,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -485,8 +501,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -496,13 +512,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -516,22 +531,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -543,13 +557,15 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES) $(HEADERS)
 installdirs:
 	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -569,10 +585,12 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
@@ -582,7 +600,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -594,14 +612,22 @@ info: info-am
 
 info-am:
 
-install-data-am: install-includeHEADERS
+install-data-am: install-nodist_includeHEADERS
+
+install-dvi: install-dvi-am
 
 install-exec-am: install-libLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -622,23 +648,34 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-includeHEADERS uninstall-info-am \
-	uninstall-libLTLIBRARIES
+uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
 	clean-libLTLIBRARIES clean-libtool ctags distclean \
 	distclean-compile distclean-generic distclean-libtool \
 	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-includeHEADERS install-info \
-	install-info-am install-libLTLIBRARIES install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-includeHEADERS uninstall-info-am \
-	uninstall-libLTLIBRARIES
-
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am \
+	install-libLTLIBRARIES install-man \
+	install-nodist_includeHEADERS install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-libLTLIBRARIES \
+	uninstall-nodist_includeHEADERS
+
+
+ at BUILD_C_INTERFACE_TRUE@ppl_c.h: $(interface_generator_dependencies)
+ at BUILD_C_INTERFACE_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_C_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_c_h.m4 > $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl_c.cc: $(interface_generator_dependencies)
+ at BUILD_C_INTERFACE_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_C_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_c_cc.m4 > $@
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/C/ppl_c.cc b/interfaces/C/ppl_c.cc
deleted file mode 100644
index 55a55fc..0000000
--- a/interfaces/C/ppl_c.cc
+++ /dev/null
@@ -1,2524 +0,0 @@
-/* Implementation of the C interface.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "ppl_c.h"
-#include <stdexcept>
-#include <limits>
-#include <sstream>
-#include <cstdio>
-#include <cerrno>
-#include <climits>
-
-using namespace Parma_Polyhedra_Library;
-
-//! Reinterpret an mpz_t as mpz_class.
-mpz_class&
-reinterpret_mpz_class(mpz_t n) {
-  return reinterpret_cast<mpz_class&>(*n);
-}
-
-#define DECLARE_CONVERSIONS(Type) \
-inline const Type* \
-to_const(ppl_const_ ## Type ## _t x) { \
-  return reinterpret_cast<const Type*>(x); \
-} \
- \
-inline Type* \
-to_nonconst(ppl_ ## Type ## _t x) { \
-  return reinterpret_cast<Type*>(x); \
-} \
- \
-inline ppl_const_ ## Type ## _t \
-to_const(const Type* x) { \
-  return reinterpret_cast<ppl_const_ ## Type ## _t>(x); \
-} \
- \
-inline ppl_ ## Type ## _t \
-to_nonconst(Type* x) { \
-  return reinterpret_cast<ppl_ ## Type ## _t>(x); \
-}
-
-namespace {
-
-extern "C" typedef void
-(*error_handler_type)(enum ppl_enum_error_code code, const char* description);
-
-error_handler_type user_error_handler = 0;
-
-void
-notify_error(enum ppl_enum_error_code code, const char* description) {
-  if (user_error_handler != 0)
-    user_error_handler(code, description);
-}
-
-} // namespace
-
-int
-ppl_set_error_handler(error_handler_type h) {
-  user_error_handler = h;
-  return 0;
-}
-
-#define CATCH_STD_EXCEPTION(exception, code) \
-catch (const std::exception& e) {	     \
-  notify_error(code, e.what()); \
-  return code; \
-}
-
-#define CATCH_ALL \
-CATCH_STD_EXCEPTION(bad_alloc, PPL_ERROR_OUT_OF_MEMORY) \
-CATCH_STD_EXCEPTION(invalid_argument, PPL_ERROR_INVALID_ARGUMENT) \
-CATCH_STD_EXCEPTION(domain_error, PPL_ERROR_DOMAIN_ERROR) \
-CATCH_STD_EXCEPTION(length_error, PPL_ERROR_LENGTH_ERROR) \
-CATCH_STD_EXCEPTION(overflow_error, PPL_ARITHMETIC_OVERFLOW) \
-CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \
-CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \
-catch (...) {						     \
-  notify_error(PPL_ERROR_UNEXPECTED_ERROR, \
-	       "completely unexpected error: a bug in the PPL"); \
-  return PPL_ERROR_UNEXPECTED_ERROR; \
-}
-
-unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
-unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
-unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
-unsigned int PPL_POLY_CON_RELATION_SATURATES;
-
-unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
-
-unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
-unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
-unsigned int PPL_COMPLEXITY_CLASS_ANY;
-
-int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
-int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
-int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
-
-int PPL_LP_PROBLEM_MINIMIZATION;
-int PPL_LP_PROBLEM_MAXIMIZATION;
-
-namespace {
-
-// Holds a pointer to the init object.
-Init* init_object_ptr = 0;
-
-} // namespace
-
-
-
-namespace {
-
-extern "C" const char*
-c_variable_default_output_function(ppl_dimension_type var) {
-#if SIZEOF_SIZE_T == SIZEOF_UNSIGNED
-# define FORMAT "%u"
-# define CONVERSION (unsigned)
-#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG
-# define FORMAT "%lu"
-# define CONVERSION (unsigned long)
-#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG_LONG
-# define FORMAT "%llu"
-# define CONVERSION (unsigned long long)
-#else
-# error "Unsupported definition for `size_t'."
-#endif
-  // On a 64-bits architecture, `var' will not be more than 2^64-1,
-  // (2^64-1)/26 is written with 18 decimal digits, plus one letter,
-  // plus one terminator makes 20.
-#if defined(ULLONG_MAX) && ULLONG_MAX > 18446744073709551615ULL
-# error "Please enlarge the buffer in the following line."
-#endif
-  static char buffer[20];
-  buffer[0] = static_cast<char>('A' + var % 26);
-  if (ppl_dimension_type i = var / 26) {
-    int r = sprintf(buffer+1, FORMAT, CONVERSION i);
-    if (r < 0)
-      return 0;
-    else if (r >= 19) {
-      errno = ERANGE;
-      return 0;
-    }
-  }
-  else
-    buffer[1] = '\0';
-  return buffer;
-}
-
-// Holds a pointer to the C current output function.
-ppl_io_variable_output_function_type* c_variable_output_function;
-
-void
-cxx_Variable_output_function(std::ostream& s, const Variable& v) {
-  const char* b = c_variable_output_function(v.id());
-  if (b == 0)
-    // Something went wrong in the client's output function.
-    // Client code will know what to do: we do nothing.
-    return;
-  s << b;
-}
-
-extern "C" typedef const char*
-c_variable_output_function_type(ppl_dimension_type var);
-
-// Holds a pointer to the C++ saved output function.
-Variable::output_function_type* saved_cxx_Variable_output_function;
-
-} // namespace
-
-
-int
-ppl_initialize(void) try {
-  if (init_object_ptr != 0)
-    // Already initialized: error.
-    return PPL_ERROR_INVALID_ARGUMENT;
-
-  init_object_ptr = new Init();
-
-  PPL_POLY_CON_RELATION_IS_DISJOINT
-    = Poly_Con_Relation::is_disjoint().get_flags();
-  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS
-    = Poly_Con_Relation::strictly_intersects().get_flags();
-  PPL_POLY_CON_RELATION_IS_INCLUDED
-    = Poly_Con_Relation::is_included().get_flags();
-  PPL_POLY_CON_RELATION_SATURATES
-    = Poly_Con_Relation::saturates().get_flags();
-
-  PPL_POLY_GEN_RELATION_SUBSUMES
-    = Poly_Gen_Relation::subsumes().get_flags();
-
-  PPL_COMPLEXITY_CLASS_POLYNOMIAL = POLYNOMIAL_COMPLEXITY;
-  PPL_COMPLEXITY_CLASS_SIMPLEX = SIMPLEX_COMPLEXITY;
-  PPL_COMPLEXITY_CLASS_ANY = ANY_COMPLEXITY;
-
-  PPL_LP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_LP_PROBLEM;
-  PPL_LP_PROBLEM_STATUS_UNBOUNDED = UNBOUNDED_LP_PROBLEM;
-  PPL_LP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_LP_PROBLEM;
-
-  PPL_LP_PROBLEM_MINIMIZATION = MINIMIZATION;
-  PPL_LP_PROBLEM_MAXIMIZATION = MAXIMIZATION;
-
-  c_variable_output_function = c_variable_default_output_function;
-  saved_cxx_Variable_output_function = Variable::get_output_function();
-  Variable::set_output_function(cxx_Variable_output_function);
-
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_finalize(void) try {
-  if (init_object_ptr == 0)
-    // Not initialized or already finalized: error.
-    return PPL_ERROR_INVALID_ARGUMENT;
-
-  delete init_object_ptr;
-  init_object_ptr = 0;
-
-  Variable::set_output_function(saved_cxx_Variable_output_function);
-
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_version_major(void) try {
-  return version_major();
-}
-CATCH_ALL
-
-int
-ppl_version_minor(void) try {
-  return version_minor();
-}
-CATCH_ALL
-
-int
-ppl_version_revision(void) try {
-  return version_revision();
-}
-CATCH_ALL
-
-int
-ppl_version_beta(void) try {
-  return version_beta();
-}
-CATCH_ALL
-
-int
-ppl_version(const char** p) try {
-  // Note: use explicit qualification to avoid clashes on, e.g.,
-  // Solaris 2.9, where `version' is the name of an enum defined in
-  // math.h.
-  *p = Parma_Polyhedra_Library::version();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_banner(const char** p) try {
-  *p = banner();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_max_space_dimension(ppl_dimension_type* m) try {
-  *m = max_space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_not_a_dimension(ppl_dimension_type* m) try {
-  *m = not_a_dimension();
-  return 0;
-}
-CATCH_ALL
-
-DECLARE_CONVERSIONS(Coefficient)
-
-DECLARE_CONVERSIONS(Linear_Expression)
-
-DECLARE_CONVERSIONS(Constraint)
-
-DECLARE_CONVERSIONS(Constraint_System)
-
-typedef Constraint_System::const_iterator Constraint_System_const_iterator;
-DECLARE_CONVERSIONS(Constraint_System_const_iterator)
-
-DECLARE_CONVERSIONS(Generator)
-
-DECLARE_CONVERSIONS(Generator_System)
-
-typedef Generator_System::const_iterator Generator_System_const_iterator;
-DECLARE_CONVERSIONS(Generator_System_const_iterator)
-
-DECLARE_CONVERSIONS(Polyhedron)
-
-DECLARE_CONVERSIONS(LP_Problem)
-
-
-int
-ppl_new_Coefficient(ppl_Coefficient_t* pc) try {
-  *pc = to_nonconst(new Coefficient(0));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Coefficient_from_mpz_t(ppl_Coefficient_t* pc, mpz_t z) try {
-  *pc = to_nonconst(new Coefficient(reinterpret_mpz_class(z)));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Coefficient_from_Coefficient(ppl_Coefficient_t* pc,
-				     ppl_const_Coefficient_t c) try {
-  const Coefficient& cc = *to_const(c);
-  *pc = to_nonconst(new Coefficient(cc));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Coefficient_to_mpz_t(ppl_const_Coefficient_t c, mpz_t z) try {
-  assign_r(reinterpret_mpz_class(z), *to_const(c), ROUND_NOT_NEEDED);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Coefficient(ppl_const_Coefficient_t c) try {
-  delete to_const(c);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Coefficient_from_mpz_t(ppl_Coefficient_t dst, mpz_t z) try {
-  Coefficient& ddst = *to_nonconst(dst);
-  ddst = reinterpret_mpz_class(z);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Coefficient_from_Coefficient(ppl_Coefficient_t dst,
-					ppl_const_Coefficient_t src) try {
-  const Coefficient& ssrc = *to_const(src);
-  Coefficient& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Coefficient_OK(ppl_const_Coefficient_t /* c */) try {
-  return 1;
-}
-CATCH_ALL
-
-int
-ppl_Coefficient_is_bounded(void) try {
-  return std::numeric_limits<Coefficient>::is_bounded ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Coefficient_min(mpz_t min) try {
-  if (std::numeric_limits<Coefficient>::is_bounded) {
-    assign_r(reinterpret_mpz_class(min),
-	     std::numeric_limits<Coefficient>::min(),
-	     ROUND_NOT_NEEDED);
-    return 1;
-  }
-  else
-    return 0;
-}
-CATCH_ALL
-
-int
-ppl_Coefficient_max(mpz_t max) try {
-  if (std::numeric_limits<Coefficient>::is_bounded) {
-    assign_r(reinterpret_mpz_class(max),
-	     std::numeric_limits<Coefficient>::max(),
-	     ROUND_NOT_NEEDED);
-    return 1;
-  }
-  else
-    return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Linear_Expression(ppl_Linear_Expression_t* ple) try {
-  *ple = to_nonconst(new Linear_Expression());
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Linear_Expression_with_dimension(ppl_Linear_Expression_t* ple,
-					 ppl_dimension_type d) try {
-  *ple = to_nonconst(d == 0
-		     ? new Linear_Expression(0)
-		     : new Linear_Expression(0*Variable(d-1)));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Linear_Expression_from_Linear_Expression
-(ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le) try {
-  const Linear_Expression& lle = *to_const(le);
-  *ple = to_nonconst(new Linear_Expression(lle));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Linear_Expression(ppl_const_Linear_Expression_t le) try {
-  delete to_const(le);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Linear_Expression_from_Linear_Expression
-(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
-  const Linear_Expression& ssrc = *to_const(src);
-  Linear_Expression& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Linear_Expression_add_to_coefficient(ppl_Linear_Expression_t le,
-					 ppl_dimension_type var,
-					 ppl_const_Coefficient_t n) try {
-  Linear_Expression& lle = *to_nonconst(le);
-  const Coefficient& nn = *to_const(n);
-  lle += nn * Variable(var);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Linear_Expression_add_to_inhomogeneous(ppl_Linear_Expression_t le,
-					   ppl_const_Coefficient_t n) try {
-  Linear_Expression& lle = *to_nonconst(le);
-  const Coefficient& nn = *to_const(n);
-  lle += nn;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_add_Linear_Expression_to_Linear_Expression
-(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
-  Linear_Expression& ddst = *to_nonconst(dst);
-  const Linear_Expression& ssrc = *to_const(src);
-  ddst += ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_subtract_Linear_Expression_from_Linear_Expression
-(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
-  Linear_Expression& ddst = *to_nonconst(dst);
-  const Linear_Expression& ssrc = *to_const(src);
-  ddst -= ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_multiply_Linear_Expression_by_Coefficient(ppl_Linear_Expression_t le,
-					      ppl_const_Coefficient_t n) try {
-  Linear_Expression& lle = *to_nonconst(le);
-  const Coefficient& nn = *to_const(n);
-  lle *= nn;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Linear_Expression_space_dimension(ppl_const_Linear_Expression_t le,
-				      ppl_dimension_type* m) try {
-  *m = to_const(le)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Linear_Expression_coefficient(ppl_const_Linear_Expression_t le,
-				  ppl_dimension_type var,
-				  ppl_Coefficient_t n) try {
-  const Linear_Expression& lle = *to_const(le);
-  Coefficient& nn = *to_nonconst(n);
-  nn = lle.coefficient(Variable(var));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Linear_Expression_inhomogeneous_term(ppl_const_Linear_Expression_t le,
-					 ppl_Coefficient_t n) try {
-  const Linear_Expression& lle = *to_const(le);
-  Coefficient& nn = *to_nonconst(n);
-  nn = lle.inhomogeneous_term();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Linear_Expression_OK(ppl_const_Linear_Expression_t /* le */) try {
-  return 1;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Constraint(ppl_Constraint_t* pc,
-		   ppl_const_Linear_Expression_t le,
-		   enum ppl_enum_Constraint_Type t) try {
-  Constraint* ppc;
-  const Linear_Expression& lle = *to_const(le);
-  switch (t) {
-  case PPL_CONSTRAINT_TYPE_EQUAL:
-    ppc = new Constraint(lle == 0);
-    break;
-  case PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL:
-    ppc = new Constraint(lle >= 0);
-    break;
-  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
-    ppc = new Constraint(lle > 0);
-    break;
-  case PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL:
-    ppc = new Constraint(lle <= 0);
-    break;
-  case PPL_CONSTRAINT_TYPE_LESS_THAN:
-    ppc = new Constraint(lle < 0);
-    break;
-  default:
-    throw std::invalid_argument("ppl_new_Constraint(pc, le, t): "
-				"t invalid");
-  }
-  *pc = to_nonconst(ppc);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Constraint_zero_dim_false(ppl_Constraint_t* pc) try {
-  *pc = to_nonconst(new Constraint(Constraint::zero_dim_false()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Constraint_zero_dim_positivity(ppl_Constraint_t* pc) try {
-  *pc = to_nonconst(new Constraint(Constraint::zero_dim_positivity()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Constraint_from_Constraint(ppl_Constraint_t* pc,
-				   ppl_const_Constraint_t c) try {
-  const Constraint& cc = *to_const(c);
-  *pc = to_nonconst(new Constraint(cc));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Constraint(ppl_const_Constraint_t le) try {
-  delete to_const(le);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Constraint_from_Constraint(ppl_Constraint_t dst,
-				      ppl_const_Constraint_t src) try {
-  const Constraint& ssrc = *to_const(src);
-  Constraint& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_space_dimension(ppl_const_Constraint_t c,
-			       ppl_dimension_type* m) try {
-  *m = to_const(c)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_type(ppl_const_Constraint_t c) try {
-  switch (to_const(c)->type()) {
-  case Constraint::EQUALITY:
-    return PPL_CONSTRAINT_TYPE_EQUAL;
-  case Constraint::NONSTRICT_INEQUALITY:
-    return PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL;
-  case Constraint::STRICT_INEQUALITY:
-    return PPL_CONSTRAINT_TYPE_GREATER_THAN;
-  default:
-    throw std::runtime_error("ppl_Constraint_type()");
-  }
-}
-CATCH_ALL
-
-int
-ppl_Constraint_coefficient(ppl_const_Constraint_t c,
-			   ppl_dimension_type var,
-			   ppl_Coefficient_t n) try {
-  const Constraint& cc = *to_const(c);
-  Coefficient& nn = *to_nonconst(n);
-  nn = cc.coefficient(Variable(var));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_inhomogeneous_term(ppl_const_Constraint_t c,
-				  ppl_Coefficient_t n) try {
-  const Constraint& cc = *to_const(c);
-  Coefficient& nn = *to_nonconst(n);
-  nn = cc.inhomogeneous_term();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_OK(ppl_const_Constraint_t /* c */) try {
-  return 1;
-}
-CATCH_ALL
-
-int
-ppl_new_Linear_Expression_from_Constraint(ppl_Linear_Expression_t* ple,
-					  ppl_const_Constraint_t c) try {
-  const Constraint& cc = *to_const(c);
-  *ple = to_nonconst(new Linear_Expression(cc));
-  return 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Constraint_System(ppl_Constraint_System_t* pcs) try {
-  *pcs = to_nonconst(new Constraint_System());
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Constraint_System_zero_dim_empty(ppl_Constraint_System_t* pcs) try {
-  *pcs = to_nonconst(new
-		     Constraint_System(Constraint_System::zero_dim_empty()));
-  return 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Constraint_System_from_Constraint(ppl_Constraint_System_t* pcs,
-					  ppl_const_Constraint_t c) try {
-  const Constraint& cc = *to_const(c);
-  *pcs = to_nonconst(new Constraint_System(cc));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Constraint_System_from_Constraint_System
-(ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs) try {
-  const Constraint_System& ccs = *to_const(cs);
-  *pcs = to_nonconst(new Constraint_System(ccs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Constraint_System(ppl_const_Constraint_System_t cs) try {
-  delete to_const(cs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Constraint_System_from_Constraint_System
-(ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src) try {
-  const Constraint_System& ssrc = *to_const(src);
-  Constraint_System& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_space_dimension(ppl_const_Constraint_System_t cs,
-				      ppl_dimension_type* m) try {
-  *m = to_const(cs)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_has_strict_inequalities
-(ppl_const_Constraint_System_t cs) try {
-  const Constraint_System& ccs = *to_const(cs);
-  return ccs.has_strict_inequalities() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_clear(ppl_Constraint_System_t cs) try {
-  to_nonconst(cs)->clear();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_insert_Constraint(ppl_Constraint_System_t cs,
-					ppl_const_Constraint_t c) try {
-  const Constraint& cc = *to_const(c);
-  Constraint_System& ccs = *to_nonconst(cs);
-  ccs.insert(cc);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_OK(ppl_const_Constraint_System_t cs) try {
-  return to_const(cs)->OK() ? 1 : 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Constraint_System_const_iterator
-(ppl_Constraint_System_const_iterator_t* pcit) try {
-  *pcit = to_nonconst(new Constraint_System::const_iterator());
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
-(ppl_Constraint_System_const_iterator_t* pcit,
- ppl_const_Constraint_System_const_iterator_t cit)  try {
-  *pcit = to_nonconst(new Constraint_System::const_iterator(*to_const(cit)));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Constraint_System_const_iterator
-(ppl_const_Constraint_System_const_iterator_t cit)
-  try {
-  delete to_const(cit);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
-(ppl_Constraint_System_const_iterator_t dst,
- ppl_const_Constraint_System_const_iterator_t src) try {
-  const Constraint_System::const_iterator& ssrc = *to_const(src);
-  Constraint_System::const_iterator& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_begin(ppl_const_Constraint_System_t cs,
-			    ppl_Constraint_System_const_iterator_t cit) try {
-  const Constraint_System& ccs = *to_const(cs);
-  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
-  ccit = ccs.begin();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_end(ppl_const_Constraint_System_t cs,
-			  ppl_Constraint_System_const_iterator_t cit) try {
-  const Constraint_System& ccs = *to_const(cs);
-  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
-  ccit = ccs.end();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_const_iterator_dereference
-(ppl_const_Constraint_System_const_iterator_t cit,
- ppl_const_Constraint_t* pc) try {
-  const Constraint_System::const_iterator& ccit = *to_const(cit);
-  const Constraint& c = *ccit;
-  *pc = to_const(&c);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_const_iterator_increment
-(ppl_Constraint_System_const_iterator_t cit) try {
-  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
-  ++ccit;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Constraint_System_const_iterator_equal_test
-(ppl_const_Constraint_System_const_iterator_t x,
- ppl_const_Constraint_System_const_iterator_t y) try {
-  const Constraint_System::const_iterator& xx = *to_const(x);
-  const Constraint_System::const_iterator& yy = *to_const(y);
-  return (xx == yy) ? 1 : 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Generator(ppl_Generator_t* pg,
-		  ppl_const_Linear_Expression_t le,
-		  enum ppl_enum_Generator_Type t,
-		  ppl_const_Coefficient_t d) try {
-  Generator* ppg;
-  const Linear_Expression& lle = *to_const(le);
-  const Coefficient& dd = *to_const(d);
-  switch (t) {
-  case PPL_GENERATOR_TYPE_POINT:
-    ppg = new Generator(Generator::point(lle, dd));
-    break;
-  case PPL_GENERATOR_TYPE_CLOSURE_POINT:
-    ppg = new Generator(Generator::closure_point(lle, dd));
-    break;
-  case PPL_GENERATOR_TYPE_RAY:
-    ppg = new Generator(Generator::ray(lle));
-    break;
-  case PPL_GENERATOR_TYPE_LINE:
-    ppg = new Generator(Generator::line(lle));
-    break;
-  default:
-    throw std::invalid_argument("ppl_new_Generator(pg, le, t, d): "
-				"t invalid");
-  }
-  *pg = to_nonconst(ppg);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_zero_dim_point(ppl_Generator_t* pg) try {
-  *pg = to_nonconst(new Generator(Generator::zero_dim_point()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_zero_dim_closure_point(ppl_Generator_t* pg) try {
-  *pg = to_nonconst(new Generator(Generator::zero_dim_closure_point()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_from_Generator(ppl_Generator_t* pg,
-				 ppl_const_Generator_t g) try {
-  const Generator& gg = *to_const(g);
-  *pg = to_nonconst(new Generator(gg));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Generator(ppl_const_Generator_t le) try {
-  delete to_const(le);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Generator_from_Generator(ppl_Generator_t dst,
-				      ppl_const_Generator_t src) try {
-  const Generator& ssrc = *to_const(src);
-  Generator& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_space_dimension(ppl_const_Generator_t g,
-			      ppl_dimension_type* m) try {
-  *m = to_const(g)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_type(ppl_const_Generator_t g) try {
-  switch (to_const(g)->type()) {
-  case Generator::LINE:
-    return PPL_GENERATOR_TYPE_LINE;
-  case Generator::RAY:
-    return PPL_GENERATOR_TYPE_RAY;
-  case Generator::POINT:
-    return PPL_GENERATOR_TYPE_POINT;
-  case Generator::CLOSURE_POINT:
-    return PPL_GENERATOR_TYPE_CLOSURE_POINT;
-  default:
-    throw std::runtime_error("ppl_Generator_type()");
-  }
-}
-CATCH_ALL
-
-int
-ppl_Generator_coefficient(ppl_const_Generator_t g,
-			  ppl_dimension_type var,
-			  ppl_Coefficient_t n) try {
-  const Generator& gg = *to_const(g);
-  Coefficient& nn = *to_nonconst(n);
-  nn = gg.coefficient(Variable(var));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_divisor(ppl_const_Generator_t g,
-		      ppl_Coefficient_t n) try {
-  const Generator& gg = *to_const(g);
-  Coefficient& nn = *to_nonconst(n);
-  nn = gg.divisor();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_OK(ppl_const_Generator_t /* g */) try {
-  return 1;
-}
-CATCH_ALL
-
-int
-ppl_new_Linear_Expression_from_Generator(ppl_Linear_Expression_t* ple,
-					 ppl_const_Generator_t g) try {
-  const Generator& gg = *to_const(g);
-  *ple = to_nonconst(new Linear_Expression(gg));
-  return 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Generator_System(ppl_Generator_System_t* pgs) try {
-  *pgs = to_nonconst(new Generator_System());
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_System_zero_dim_univ(ppl_Generator_System_t* pgs) try {
-  *pgs = to_nonconst(new Generator_System(Generator_System::zero_dim_univ()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_System_from_Generator(ppl_Generator_System_t* pgs,
-			      ppl_const_Generator_t g) try {
-  const Generator& gg = *to_const(g);
-  *pgs = to_nonconst(new Generator_System(gg));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_System_from_Generator_System
-(ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs) try {
-  const Generator_System& ggs = *to_const(gs);
-  *pgs = to_nonconst(new Generator_System(ggs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Generator_System(ppl_const_Generator_System_t gs) try {
-  delete to_const(gs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Generator_System_from_Generator_System
-(ppl_Generator_System_t dst, ppl_const_Generator_System_t src) try {
-  const Generator_System& ssrc = *to_const(src);
-  Generator_System& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_space_dimension(ppl_const_Generator_System_t gs,
-				     ppl_dimension_type* m) try {
-  *m = to_const(gs)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_clear(ppl_Generator_System_t gs) try {
-  to_nonconst(gs)->clear();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_insert_Generator(ppl_Generator_System_t gs,
-				      ppl_const_Generator_t g) try {
-  const Generator& gg = *to_const(g);
-  Generator_System& ggs = *to_nonconst(gs);
-  ggs.insert(gg);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_OK(ppl_const_Generator_System_t gs) try {
-  return to_const(gs)->OK() ? 1 : 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_Generator_System_const_iterator
-(ppl_Generator_System_const_iterator_t* pgit) try {
-  *pgit = to_nonconst(new Generator_System::const_iterator());
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
-(ppl_Generator_System_const_iterator_t* pgit,
- ppl_const_Generator_System_const_iterator_t git)  try {
-  *pgit = to_nonconst(new Generator_System::const_iterator(*to_const(git)));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Generator_System_const_iterator
-(ppl_const_Generator_System_const_iterator_t git) try {
-  delete to_const(git);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
-(ppl_Generator_System_const_iterator_t dst,
- ppl_const_Generator_System_const_iterator_t src) try {
-  const Generator_System::const_iterator& ssrc = *to_const(src);
-  Generator_System::const_iterator& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_begin(ppl_const_Generator_System_t gs,
-			   ppl_Generator_System_const_iterator_t git) try {
-  const Generator_System& ggs = *to_const(gs);
-  Generator_System::const_iterator& ggit = *to_nonconst(git);
-  ggit = ggs.begin();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_end(ppl_const_Generator_System_t gs,
-			 ppl_Generator_System_const_iterator_t git) try {
-  const Generator_System& ggs = *to_const(gs);
-  Generator_System::const_iterator& ggit = *to_nonconst(git);
-  ggit = ggs.end();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_const_iterator_dereference
-(ppl_const_Generator_System_const_iterator_t git,
- ppl_const_Generator_t* pg) try {
-  const Generator_System::const_iterator& ggit = *to_const(git);
-  const Generator& c = *ggit;
-  *pg = to_const(&c);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_const_iterator_increment
-(ppl_Generator_System_const_iterator_t git) try {
-  Generator_System::const_iterator& ggit = *to_nonconst(git);
-  ++ggit;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Generator_System_const_iterator_equal_test
-(ppl_const_Generator_System_const_iterator_t x,
- ppl_const_Generator_System_const_iterator_t y) try {
-  const Generator_System::const_iterator& xx = *to_const(x);
-  const Generator_System::const_iterator& yy = *to_const(y);
-  return (xx == yy) ? 1 : 0;
-}
-CATCH_ALL
-
-
-int
-ppl_new_C_Polyhedron_from_dimension(ppl_Polyhedron_t* pph,
-				    ppl_dimension_type d) try {
-  *pph = to_nonconst(new C_Polyhedron(d, UNIVERSE));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_from_dimension(ppl_Polyhedron_t* pph,
-				      ppl_dimension_type d) try {
-  *pph = to_nonconst(new NNC_Polyhedron(d, UNIVERSE));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_empty_from_dimension(ppl_Polyhedron_t* pph,
-					  ppl_dimension_type d) try {
-  *pph = to_nonconst(new C_Polyhedron(d, EMPTY));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_empty_from_dimension(ppl_Polyhedron_t* pph,
-					    ppl_dimension_type d) try {
-  *pph = to_nonconst(new NNC_Polyhedron(d, EMPTY));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
-				       ppl_const_Polyhedron_t ph) try {
-  const C_Polyhedron& phh = *static_cast<const C_Polyhedron*>(to_const(ph));
-  *pph = to_nonconst(new C_Polyhedron(phh));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
-					 ppl_const_Polyhedron_t ph) try {
-  const NNC_Polyhedron& phh
-    = *static_cast<const NNC_Polyhedron*>(to_const(ph));
-  *pph = to_nonconst(new C_Polyhedron(phh));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
-					 ppl_const_Polyhedron_t ph) try {
-  const C_Polyhedron& phh = *static_cast<const C_Polyhedron*>(to_const(ph));
-  *pph = to_nonconst(new NNC_Polyhedron(phh));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
-					   ppl_const_Polyhedron_t ph) try {
-  const NNC_Polyhedron& phh
-    = *static_cast<const NNC_Polyhedron*>(to_const(ph));
-  *pph = to_nonconst(new NNC_Polyhedron(phh));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_from_Constraint_System
-(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs) try {
-  const Constraint_System& ccs = *to_const(cs);
-  *pph = to_nonconst(new C_Polyhedron(ccs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_recycle_Constraint_System
-(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs) try {
-  Constraint_System& ccs = *to_nonconst(cs);
-  *pph = to_nonconst(new C_Polyhedron(ccs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_from_Constraint_System
-(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs) try {
-  const Constraint_System& ccs = *to_const(cs);
-  *pph = to_nonconst(new NNC_Polyhedron(ccs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_recycle_Constraint_System
-(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs) try {
-  Constraint_System& ccs = *to_nonconst(cs);
-  *pph = to_nonconst(new NNC_Polyhedron(ccs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_from_Generator_System
-(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs) try {
-  const Generator_System& ggs = *to_const(gs);
-  *pph = to_nonconst(new C_Polyhedron(ggs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_C_Polyhedron_recycle_Generator_System(ppl_Polyhedron_t* pph,
-					      ppl_Generator_System_t gs) try {
-  Generator_System& ggs = *to_nonconst(gs);
-  *pph = to_nonconst(new C_Polyhedron(ggs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_from_Generator_System
-(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs) try {
-  const Generator_System& ggs = *to_const(gs);
-  *pph = to_nonconst(new C_Polyhedron(ggs));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_recycle_Generator_System
-(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs) try {
-  Generator_System& ggs = *to_nonconst(gs);
-  *pph = to_nonconst(new C_Polyhedron(ggs));
-  return 0;
-}
-CATCH_ALL
-
-namespace {
-
-class C_Build_Box {
-private:
-  ppl_dimension_type (*s_d)(void);
-  int (*i_e)(void);
-  int (*g_l_b)(ppl_dimension_type k, int closed,
-	       ppl_Coefficient_t n,
-	       ppl_Coefficient_t d);
-  int (*g_u_b)(ppl_dimension_type k, int closed,
-	       ppl_Coefficient_t n,
-	       ppl_Coefficient_t d);
-
-public:
-  C_Build_Box(ppl_dimension_type (*sd)(void),
-	      int (*ie)(void),
-	      int (*glb)(ppl_dimension_type k, int closed,
-			 ppl_Coefficient_t n,
-			 ppl_Coefficient_t d),
-	      int (*gub)(ppl_dimension_type k, int closed,
-			 ppl_Coefficient_t n,
-			 ppl_Coefficient_t d))
-    : s_d(sd), i_e(ie), g_l_b(glb), g_u_b(gub) {
-  }
-
-  ppl_dimension_type space_dimension() const {
-    return s_d();
-  }
-
-  bool is_empty(void) const {
-    return i_e() != 0;
-  }
-
-  bool get_lower_bound(ppl_dimension_type k, bool closed,
-		       Coefficient& n, Coefficient& d) const {
-    return g_l_b(k, closed, to_nonconst(&n), to_nonconst(&d)) != 0;
-  }
-
-  bool get_upper_bound(ppl_dimension_type k, bool closed,
-		       Coefficient& n, Coefficient& d) const {
-    return g_u_b(k, closed, to_nonconst(&n), to_nonconst(&d)) != 0;
-  }
-};
-
-} // namespace
-
-int
-ppl_new_C_Polyhedron_from_bounding_box
-(ppl_Polyhedron_t* pph,
- ppl_dimension_type (*space_dimension)(void),
- int (*is_empty)(void),
- int (*get_lower_bound)(ppl_dimension_type k, int closed,
-			ppl_Coefficient_t n,
-			ppl_Coefficient_t d),
- int (*get_upper_bound)(ppl_dimension_type k, int closed,
-			ppl_Coefficient_t n,
-			ppl_Coefficient_t d)) try {
-  C_Build_Box cbbox(space_dimension, is_empty,
-		    get_lower_bound, get_upper_bound);
-  *pph = to_nonconst(new C_Polyhedron(cbbox, From_Bounding_Box()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_NNC_Polyhedron_from_bounding_box
-(ppl_Polyhedron_t* pph,
- ppl_dimension_type (*space_dimension)(void),
- int (*is_empty)(void),
- int (*get_lower_bound)(ppl_dimension_type k, int closed,
-			ppl_Coefficient_t n,
-			ppl_Coefficient_t d),
- int (*get_upper_bound)(ppl_dimension_type k, int closed,
-			ppl_Coefficient_t n,
-			ppl_Coefficient_t d)) try {
-  C_Build_Box cbbox(space_dimension, is_empty,
-		    get_lower_bound, get_upper_bound);
-  *pph = to_nonconst(new NNC_Polyhedron(cbbox, From_Bounding_Box()));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph) try {
-  delete to_const(ph);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_C_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t dst,
-					  ppl_const_Polyhedron_t src) try {
-  const C_Polyhedron& ssrc
-    = *static_cast<const C_Polyhedron*>(to_const(src));
-  C_Polyhedron& ddst = *static_cast<C_Polyhedron*>(to_nonconst(dst));
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t dst,
-					      ppl_const_Polyhedron_t src) try {
-  const NNC_Polyhedron& ssrc
-    = *static_cast<const NNC_Polyhedron*>(to_const(src));
-  NNC_Polyhedron& ddst = *static_cast<NNC_Polyhedron*>(to_nonconst(dst));
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_space_dimension(ppl_const_Polyhedron_t ph,
-			       ppl_dimension_type* m) try {
-  *m = to_const(ph)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_affine_dimension(ppl_const_Polyhedron_t ph,
-				ppl_dimension_type* m) try {
-  *m = to_const(ph)->affine_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_intersection_assign(ppl_Polyhedron_t x,
-				   ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.intersection_assign(yy);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_intersection_assign_and_minimize(ppl_Polyhedron_t x,
-						ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  return xx.intersection_assign_and_minimize(yy) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_concatenate_assign(ppl_Polyhedron_t x,
-				  ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.concatenate_assign(yy);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_poly_hull_assign(ppl_Polyhedron_t x,
-				ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.poly_hull_assign(yy);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_poly_hull_assign_and_minimize(ppl_Polyhedron_t x,
-					     ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  return xx.poly_hull_assign_and_minimize(yy) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_poly_difference_assign(ppl_Polyhedron_t x,
-				      ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.poly_difference_assign(yy);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(ppl_Polyhedron_t x,
-						  ppl_const_Polyhedron_t y,
-						  unsigned* tp) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.BHRZ03_widening_assign(yy, tp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_BHRZ03_widening_assign(ppl_Polyhedron_t x,
-				      ppl_const_Polyhedron_t y) try {
-  return ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(x, y, 0);
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs,
- unsigned* tp) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  const Constraint_System& ccs = *to_const(cs);
-  xx.limited_BHRZ03_extrapolation_assign(yy, ccs, tp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs) try {
-  return ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(x, y,
-									cs, 0);
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs,
- unsigned* tp) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  const Constraint_System& ccs = *to_const(cs);
-  xx.bounded_BHRZ03_extrapolation_assign(yy, ccs, tp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs) try {
-  return ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(x, y,
-									cs, 0);
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_H79_widening_assign_with_tokens(ppl_Polyhedron_t x,
-					       ppl_const_Polyhedron_t y,
-					       unsigned* tp) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.H79_widening_assign(yy, tp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_H79_widening_assign(ppl_Polyhedron_t x,
-				   ppl_const_Polyhedron_t y) try {
-  return ppl_Polyhedron_H79_widening_assign_with_tokens(x, y, 0);
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs,
- unsigned* tp) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  const Constraint_System& ccs = *to_const(cs);
-  xx.limited_H79_extrapolation_assign(yy, ccs, tp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_limited_H79_extrapolation_assign
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs) try {
-  return ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(x, y,
-								     cs, 0);
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs,
- unsigned* tp) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  const Constraint_System& ccs = *to_const(cs);
-  xx.bounded_H79_extrapolation_assign(yy, ccs, tp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounded_H79_extrapolation_assign
-(ppl_Polyhedron_t x,
- ppl_const_Polyhedron_t y,
- ppl_const_Constraint_System_t cs) try {
-  return ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(x, y,
-								     cs, 0);
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_time_elapse_assign(ppl_Polyhedron_t x,
-				  ppl_const_Polyhedron_t y) try {
-  Polyhedron& xx = *to_nonconst(x);
-  const Polyhedron& yy = *to_const(y);
-  xx.time_elapse_assign(yy);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_constraints(ppl_const_Polyhedron_t ph,
-			   ppl_const_Constraint_System_t* pcs) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Constraint_System& cs = pph.constraints();
-  *pcs = to_const(&cs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_minimized_constraints(ppl_const_Polyhedron_t ph,
-				     ppl_const_Constraint_System_t* pcs) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Constraint_System& cs = pph.minimized_constraints();
-  *pcs = to_const(&cs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_generators(ppl_const_Polyhedron_t ph,
-			  ppl_const_Generator_System_t* pgs) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Generator_System& gs = pph.generators();
-  *pgs = to_const(&gs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_minimized_generators(ppl_const_Polyhedron_t ph,
-				    ppl_const_Generator_System_t* pgs) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Generator_System& gs = pph.minimized_generators();
-  *pgs = to_const(&gs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_constraint(ppl_Polyhedron_t ph,
-			      ppl_const_Constraint_t c) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Constraint& cc = *to_const(c);
-  pph.add_constraint(cc);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_constraint_and_minimize(ppl_Polyhedron_t ph,
-					   ppl_const_Constraint_t c) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Constraint& cc = *to_const(c);
-  pph.add_constraint_and_minimize(cc);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_generator(ppl_Polyhedron_t ph,
-			     ppl_const_Generator_t g) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Generator& gg = *to_const(g);
-  pph.add_generator(gg);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_generator_and_minimize(ppl_Polyhedron_t ph,
-					  ppl_const_Generator_t g) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Generator& gg = *to_const(g);
-  pph.add_generator_and_minimize(gg);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_constraints(ppl_Polyhedron_t ph,
-			       ppl_const_Constraint_System_t cs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Constraint_System& ccs = *to_const(cs);
-  pph.add_constraints(ccs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_constraints_and_minimize
-(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Constraint_System& ccs = *to_const(cs);
-  return pph.add_constraints_and_minimize(ccs) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_generators(ppl_Polyhedron_t ph,
-			      ppl_const_Generator_System_t gs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Generator_System& ggs = *to_const(gs);
-  pph.add_generators(ggs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_generators_and_minimize
-(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Generator_System& ggs = *to_const(gs);
-  return pph.add_generators_and_minimize(ggs) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_recycled_constraints(ppl_Polyhedron_t ph,
-					ppl_Constraint_System_t cs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  Constraint_System& ccs = *to_nonconst(cs);
-  pph.add_recycled_constraints(ccs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_recycled_constraints_and_minimize
-(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  Constraint_System& ccs = *to_nonconst(cs);
-  return pph.add_recycled_constraints_and_minimize(ccs) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_recycled_generators(ppl_Polyhedron_t ph,
-				       ppl_Generator_System_t gs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  Generator_System& ggs = *to_nonconst(gs);
-  pph.add_recycled_generators(ggs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_recycled_generators_and_minimize(ppl_Polyhedron_t ph,
-						    ppl_Generator_System_t gs)
-try {
-  Polyhedron& pph = *to_nonconst(ph);
-  Generator_System& ggs = *to_nonconst(gs);
-  return pph.add_recycled_generators_and_minimize(ggs) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_space_dimensions_and_embed(ppl_Polyhedron_t ph,
-					      ppl_dimension_type d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  pph.add_space_dimensions_and_embed(d);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_add_space_dimensions_and_project(ppl_Polyhedron_t ph,
-						ppl_dimension_type d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  pph.add_space_dimensions_and_project(d);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_remove_space_dimensions(ppl_Polyhedron_t ph,
-				       ppl_dimension_type ds[],
-				       size_t n) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  Variables_Set to_be_removed;
-  for (ppl_dimension_type i = n; i-- > 0; )
-    to_be_removed.insert(Variable(ds[i]));
-  pph.remove_space_dimensions(to_be_removed);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_remove_higher_space_dimensions(ppl_Polyhedron_t ph,
-					      ppl_dimension_type d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  pph.remove_higher_space_dimensions(d);
-  return 0;
-}
-CATCH_ALL
-
-namespace {
-
-class PIFunc {
-private:
-  //! Holds the vector implementing the map.
-  dimension_type* vec;
-
-  //! Holds the size of \p vec.
-  size_t vec_size;
-
-  //! Cache for computing the maximum dimension in the codomain.
-  mutable dimension_type max_in_codomain_;
-
-  //! Cache for computing emptiness:
-  //! -1 if we still don't know, 0 if not empty, 1 if empty.
-  mutable int empty;
-
-public:
-  PIFunc(dimension_type* v, size_t n)
-    : vec(v), vec_size(n), max_in_codomain_(not_a_dimension()), empty(-1) {
-  }
-
-  bool has_empty_codomain() const {
-    if (empty < 0) {
-      empty = 1;
-      for (size_t i = vec_size; i-- > 0; )
-	if (vec[i] != not_a_dimension()) {
-	  empty = 0;
-	  break;
-	}
-    }
-    return empty;
-  }
-
-  dimension_type max_in_codomain() const {
-    if (max_in_codomain_ == not_a_dimension()) {
-      for (size_t i = vec_size; i-- > 0; ) {
-	dimension_type vec_i = vec[i];
-	if (vec_i != not_a_dimension()
-	    && (max_in_codomain_ == not_a_dimension()
-		|| vec_i > max_in_codomain_))
-	  max_in_codomain_ = vec_i;
-      }
-    }
-    return max_in_codomain_;
-  }
-
-  bool maps(dimension_type i, dimension_type& j) const {
-    if (i >= vec_size)
-      return false;
-    dimension_type vec_i = vec[i];
-    if (vec_i == not_a_dimension())
-      return false;
-    j = vec_i;
-    return true;
-  }
-};
-
-} // namespace
-
-int
-ppl_Polyhedron_map_space_dimensions(ppl_Polyhedron_t ph,
-				    ppl_dimension_type maps[],
-				    size_t n) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  PIFunc pifunc(maps, n);
-  pph.map_space_dimensions(pifunc);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_expand_space_dimension(ppl_Polyhedron_t ph,
-				      ppl_dimension_type d,
-				      ppl_dimension_type m) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  pph.expand_space_dimension(Variable(d), m);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_fold_space_dimensions(ppl_Polyhedron_t ph,
-				     ppl_dimension_type ds[],
-				     size_t n,
-				     ppl_dimension_type d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  Variables_Set to_be_folded;
-  for (ppl_dimension_type i = n; i-- > 0; )
-    to_be_folded.insert(Variable(ds[i]));
-  pph.fold_space_dimensions(to_be_folded, Variable(d));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_affine_image(ppl_Polyhedron_t ph,
-			    ppl_dimension_type var,
-			    ppl_const_Linear_Expression_t le,
-			    ppl_const_Coefficient_t d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& lle = *to_const(le);
-  const Coefficient& dd = *to_const(d);
-  pph.affine_image(Variable(var), lle, dd);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_affine_preimage(ppl_Polyhedron_t ph,
-			       ppl_dimension_type var,
-			       ppl_const_Linear_Expression_t le,
-			       ppl_const_Coefficient_t d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& lle = *to_const(le);
-  const Coefficient& dd = *to_const(d);
-  pph.affine_preimage(Variable(var), lle, dd);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounded_affine_image(ppl_Polyhedron_t ph,
-				    ppl_dimension_type var,
-				    ppl_const_Linear_Expression_t lb,
-				    ppl_const_Linear_Expression_t ub,
-				    ppl_const_Coefficient_t d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& llb = *to_const(lb);
-  const Linear_Expression& uub = *to_const(ub);
-  const Coefficient& dd = *to_const(d);
-  pph.bounded_affine_image(Variable(var), llb, uub, dd);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounded_affine_preimage(ppl_Polyhedron_t ph,
-				       ppl_dimension_type var,
-				       ppl_const_Linear_Expression_t lb,
-				       ppl_const_Linear_Expression_t ub,
-				       ppl_const_Coefficient_t d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& llb = *to_const(lb);
-  const Linear_Expression& uub = *to_const(ub);
-  const Coefficient& dd = *to_const(d);
-  pph.bounded_affine_preimage(Variable(var), llb, uub, dd);
-  return 0;
-}
-CATCH_ALL
-
-namespace {
-
-inline Relation_Symbol
-relation_symbol(enum ppl_enum_Constraint_Type t) {
-  switch (t) {
-  case PPL_CONSTRAINT_TYPE_LESS_THAN:
-    return LESS_THAN;
-  case PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL:
-    return LESS_THAN_OR_EQUAL;
-  case PPL_CONSTRAINT_TYPE_EQUAL:
-    return EQUAL;
-  case PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL:
-    return GREATER_THAN_OR_EQUAL;
-  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
-    return GREATER_THAN;
-  default:
-    return static_cast<Relation_Symbol>(t);
-  }
-}
-
-} // namespace
-
-int
-ppl_Polyhedron_generalized_affine_image(ppl_Polyhedron_t ph,
-					ppl_dimension_type var,
-					enum ppl_enum_Constraint_Type relsym,
-					ppl_const_Linear_Expression_t le,
-					ppl_const_Coefficient_t d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& lle = *to_const(le);
-  const Coefficient& dd = *to_const(d);
-  pph.generalized_affine_image(Variable(var), relation_symbol(relsym), lle,
-			       dd);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_generalized_affine_preimage
-(ppl_Polyhedron_t ph,
- ppl_dimension_type var,
- enum ppl_enum_Constraint_Type relsym,
- ppl_const_Linear_Expression_t le,
- ppl_const_Coefficient_t d) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& lle = *to_const(le);
-  const Coefficient& dd = *to_const(d);
-  pph.generalized_affine_preimage(Variable(var), relation_symbol(relsym), lle,
-				  dd);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_generalized_affine_image_lhs_rhs
-(ppl_Polyhedron_t ph,
- ppl_const_Linear_Expression_t lhs,
- enum ppl_enum_Constraint_Type relsym,
- ppl_const_Linear_Expression_t rhs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& llhs = *to_const(lhs);
-  const Linear_Expression& rrhs = *to_const(rhs);
-  pph.generalized_affine_image(llhs, relation_symbol(relsym), rrhs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
-(ppl_Polyhedron_t ph,
- ppl_const_Linear_Expression_t lhs,
- enum ppl_enum_Constraint_Type relsym,
- ppl_const_Linear_Expression_t rhs) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  const Linear_Expression& llhs = *to_const(lhs);
-  const Linear_Expression& rrhs = *to_const(rhs);
-  pph.generalized_affine_preimage(llhs, relation_symbol(relsym), rrhs);
-  return 0;
-}
-CATCH_ALL
-
-
-namespace {
-
-class C_Shrink_Box {
-private:
-  void (*s_e)(void);
-  void (*r_l_b)(ppl_dimension_type k, int closed,
-		ppl_const_Coefficient_t n,
-		ppl_const_Coefficient_t d);
-  void (*l_u_b)(ppl_dimension_type k, int closed,
-		ppl_const_Coefficient_t n,
-		ppl_const_Coefficient_t d);
-
-public:
-  C_Shrink_Box(void (*se)(void),
-	       void (*rlb)(ppl_dimension_type k, int closed,
-			   ppl_const_Coefficient_t n,
-			   ppl_const_Coefficient_t d),
-	       void (*lub)(ppl_dimension_type k, int closed,
-			   ppl_const_Coefficient_t n,
-			   ppl_const_Coefficient_t d))
-    : s_e(se), r_l_b(rlb), l_u_b(lub) {
-  }
-
-  void set_empty() {
-    s_e();
-  }
-
-  void raise_lower_bound(ppl_dimension_type k, bool closed,
-			 const Coefficient& n, const Coefficient& d) {
-    r_l_b(k, closed, to_const(&n), to_const(&d));
-  }
-
-  void lower_upper_bound(ppl_dimension_type k, bool closed,
-			 const Coefficient& n, const Coefficient& d) {
-    l_u_b(k, closed, to_const(&n), to_const(&d));
-  }
-};
-
-} // namespace
-
-int
-ppl_Polyhedron_shrink_bounding_box
-(ppl_const_Polyhedron_t ph,
- unsigned int complexity,
- void (*set_empty)(void),
- void (*raise_lower_bound)(ppl_dimension_type k, int closed,
-			   ppl_const_Coefficient_t n,
-			   ppl_const_Coefficient_t d),
- void (*lower_upper_bound)(ppl_dimension_type k, int closed,
-			   ppl_const_Coefficient_t n,
-			   ppl_const_Coefficient_t d)) try {
-  if (complexity != POLYNOMIAL_COMPLEXITY
-      && complexity != SIMPLEX_COMPLEXITY
-      && complexity != ANY_COMPLEXITY)
-    return PPL_ERROR_INVALID_ARGUMENT;
-
-  const Polyhedron& pph = *to_const(ph);
-  C_Shrink_Box csbox(set_empty, raise_lower_bound, lower_upper_bound);
-  pph.shrink_bounding_box(csbox, Complexity_Class(complexity));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_relation_with_Constraint(ppl_const_Polyhedron_t ph,
-					ppl_const_Constraint_t c) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Constraint& cc = *to_const(c);
-  return pph.relation_with(cc).get_flags();
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_relation_with_Generator(ppl_const_Polyhedron_t ph,
-				       ppl_const_Generator_t g) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Generator& gg = *to_const(g);
-  return pph.relation_with(gg).get_flags();
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph) try {
-  const Polyhedron& pph = *to_const(ph);
-  return pph.is_empty() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph) try {
-  const Polyhedron& pph = *to_const(ph);
-  return pph.is_universe() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph) try {
-  const Polyhedron& pph = *to_const(ph);
-  return pph.is_bounded() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounds_from_above(ppl_const_Polyhedron_t ph,
-				 ppl_const_Linear_Expression_t le) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Linear_Expression& lle = *to_const(le);
-  return pph.bounds_from_above(lle) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_bounds_from_below(ppl_const_Polyhedron_t ph,
-				 ppl_const_Linear_Expression_t le) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Linear_Expression& lle = *to_const(le);
-  return pph.bounds_from_below(lle) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_maximize(ppl_const_Polyhedron_t ph,
-			ppl_const_Linear_Expression_t le,
-			ppl_Coefficient_t sup_n,
-			ppl_Coefficient_t sup_d,
-			int* pmaximum,
-			ppl_Generator_t point) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Linear_Expression& lle = *to_const(le);
-  Coefficient& ssup_n = *to_nonconst(sup_n);
-  Coefficient& ssup_d = *to_nonconst(sup_d);
-  Generator& ppoint = *to_nonconst(point);
-  bool maximum;
-  bool ok = pph.maximize(lle, ssup_n, ssup_d, maximum, ppoint);
-  if (ok)
-    *pmaximum = maximum ? 1 : 0;
-  return ok ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_minimize(ppl_const_Polyhedron_t ph,
-			ppl_const_Linear_Expression_t le,
-			ppl_Coefficient_t inf_n,
-			ppl_Coefficient_t inf_d,
-			int* pminimum,
-			ppl_Generator_t point) try {
-  const Polyhedron& pph = *to_const(ph);
-  const Linear_Expression& lle = *to_const(le);
-  Coefficient& iinf_n = *to_nonconst(inf_n);
-  Coefficient& iinf_d = *to_nonconst(inf_d);
-  Generator& ppoint = *to_nonconst(point);
-  bool minimum;
-  bool ok = pph.minimize(lle, iinf_n, iinf_d, minimum, ppoint);
-  if (ok)
-    *pminimum = minimum ? 1 : 0;
-  return ok ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph) try {
-  const Polyhedron& pph = *to_const(ph);
-  return pph.is_topologically_closed() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph) try {
-  Polyhedron& pph = *to_nonconst(ph);
-  pph.topological_closure_assign();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_contains_Polyhedron(ppl_const_Polyhedron_t x,
-				   ppl_const_Polyhedron_t y) try {
-  const Polyhedron& xx = *to_const(x);
-  const Polyhedron& yy = *to_const(y);
-  return xx.contains(yy) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_strictly_contains_Polyhedron(ppl_const_Polyhedron_t x,
-					    ppl_const_Polyhedron_t y) try {
-  const Polyhedron& xx = *to_const(x);
-  const Polyhedron& yy = *to_const(y);
-  return xx.strictly_contains(yy) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_is_disjoint_from_Polyhedron(ppl_const_Polyhedron_t x,
-					   ppl_const_Polyhedron_t y) try {
-  const Polyhedron& xx = *to_const(x);
-  const Polyhedron& yy = *to_const(y);
-  return xx.is_disjoint_from(yy) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_equals_Polyhedron(ppl_const_Polyhedron_t x,
-				 ppl_const_Polyhedron_t y) try {
-  const Polyhedron& xx = *to_const(x);
-  const Polyhedron& yy = *to_const(y);
-  return (xx == yy) ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph) try {
-  return to_const(ph)->OK() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_new_LP_Problem_trivial(ppl_LP_Problem_t* plp) try {
-  *plp = to_nonconst(new LP_Problem());
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_LP_Problem(ppl_LP_Problem_t* plp, ppl_const_Constraint_System_t cs,
-		   ppl_const_Linear_Expression_t le, int m) try {
-  const Constraint_System& ccs = *to_const(cs);
-  const Linear_Expression& lle = *to_const(le);
-  Optimization_Mode mm = (m == PPL_LP_PROBLEM_MINIMIZATION)
-    ? MINIMIZATION : MAXIMIZATION;
-  *plp = to_nonconst(new LP_Problem(ccs, lle, mm));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_new_LP_Problem_from_LP_Problem(ppl_LP_Problem_t* plp,
-				   ppl_const_LP_Problem_t lp) try {
-  const LP_Problem& llp = *to_const(lp);
-  *plp = to_nonconst(new LP_Problem(llp));
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_delete_LP_Problem(ppl_const_LP_Problem_t lp) try {
-  delete to_const(lp);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_assign_LP_Problem_from_LP_Problem(ppl_LP_Problem_t dst,
-				      ppl_const_LP_Problem_t src) try {
-  const LP_Problem& ssrc = *to_const(src);
-  LP_Problem& ddst = *to_nonconst(dst);
-  ddst = ssrc;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_space_dimension(ppl_const_LP_Problem_t lp,
-			       ppl_dimension_type* m) try {
-  *m = to_const(lp)->space_dimension();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_constraints(ppl_const_LP_Problem_t lp,
-			   ppl_const_Constraint_System_t* pcs) try {
-  const Constraint_System& cs = to_const(lp)->constraints();
-  *pcs = to_const(&cs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_objective_function(ppl_const_LP_Problem_t lp,
-				  ppl_const_Linear_Expression_t* ple) try {
-  const Linear_Expression& le = to_const(lp)->objective_function();
-  *ple = to_const(&le);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_optimization_mode(ppl_const_LP_Problem_t lp) try {
-  return to_const(lp)->optimization_mode();
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_clear(ppl_LP_Problem_t lp) try {
-  to_nonconst(lp)->clear();
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_add_constraint(ppl_LP_Problem_t lp,
-			      ppl_const_Constraint_t c) try {
-  const Constraint& cc = *to_const(c);
-  LP_Problem& llp = *to_nonconst(lp);
-  llp.add_constraint(cc);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_add_constraints(ppl_LP_Problem_t lp,
-			       ppl_const_Constraint_System_t cs) try {
-  const Constraint_System& ccs = *to_const(cs);
-  LP_Problem& llp = *to_nonconst(lp);
-  llp.add_constraints(ccs);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_set_objective_function(ppl_LP_Problem_t lp,
-				      ppl_const_Linear_Expression_t le) try {
-  const Linear_Expression& lle = *to_const(le);
-  LP_Problem& llp = *to_nonconst(lp);
-  llp.set_objective_function(lle);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_set_optimization_mode(ppl_LP_Problem_t lp, int mode) try {
-  LP_Problem& llp = *to_nonconst(lp);
-  Optimization_Mode m = (mode == PPL_LP_PROBLEM_MINIMIZATION)
-    ? MINIMIZATION : MAXIMIZATION;
-  llp.set_optimization_mode(m);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_is_satisfiable(ppl_const_LP_Problem_t lp) try {
-  return to_const(lp)->is_satisfiable() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_solve(ppl_const_LP_Problem_t lp) try {
-  return to_const(lp)->solve();
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_evaluate_objective_function(ppl_const_LP_Problem_t lp,
-					   ppl_const_Generator_t g,
-					   ppl_Coefficient_t num,
-					   ppl_Coefficient_t den) try {
-  const LP_Problem& llp = *to_const(lp);
-  const Generator& gg = *to_const(g);
-  Coefficient& nnum = *to_nonconst(num);
-  Coefficient& dden = *to_nonconst(den);
-  llp.evaluate_objective_function(gg, nnum, dden);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_feasible_point(ppl_const_LP_Problem_t lp,
-			      ppl_const_Generator_t* pg) try {
-  const Generator& g = to_const(lp)->feasible_point();
-  *pg = to_const(&g);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_optimizing_point(ppl_const_LP_Problem_t lp,
-				ppl_const_Generator_t* pg) try {
-  const Generator& g = to_const(lp)->optimizing_point();
-  *pg = to_const(&g);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_optimal_value(ppl_const_LP_Problem_t lp,
-			     ppl_Coefficient_t num,
-			     ppl_Coefficient_t den) try {
-  Coefficient& nnum = *to_nonconst(num);
-  Coefficient& dden = *to_nonconst(den);
-  to_const(lp)->optimal_value(nnum, dden);
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_LP_Problem_OK(ppl_const_LP_Problem_t lp) try {
-  return to_const(lp)->OK() ? 1 : 0;
-}
-CATCH_ALL
-
-int
-ppl_io_print_variable(ppl_dimension_type var) try {
-  const char* b = c_variable_output_function(var);
-  if (b == 0 || puts(b) < 0)
-    return PPL_STDIO_ERROR;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_io_fprint_variable(FILE* stream, ppl_dimension_type var) try {
-  const char* b = c_variable_output_function(var);
-  if (b == 0 || fputs(b, stream) < 0)
-    return PPL_STDIO_ERROR;
-  return 0;
-}
-CATCH_ALL
-
-#define DEFINE_PRINT_FUNCTIONS(Type) \
-int \
-ppl_io_print_ ## Type(ppl_const_ ## Type ## _t x) try { \
-  using namespace IO_Operators; \
-  std::ostringstream s; \
-  s << *to_const(x); \
-  if (puts(s.str().c_str()) < 0) \
-    return PPL_STDIO_ERROR; \
-  return 0; \
-} \
-CATCH_ALL \
- \
-int \
-ppl_io_fprint_ ## Type(FILE* stream, ppl_const_ ## Type ## _t x) try { \
-  using namespace IO_Operators; \
-  std::ostringstream s; \
-  s << *to_const(x); \
-  if (fputs(s.str().c_str(), stream) < 0) \
-    return PPL_STDIO_ERROR; \
-  return 0; \
-} \
-CATCH_ALL
-
-DEFINE_PRINT_FUNCTIONS(Coefficient)
-
-DEFINE_PRINT_FUNCTIONS(Linear_Expression)
-
-DEFINE_PRINT_FUNCTIONS(Constraint)
-
-DEFINE_PRINT_FUNCTIONS(Constraint_System)
-
-DEFINE_PRINT_FUNCTIONS(Generator)
-
-DEFINE_PRINT_FUNCTIONS(Generator_System)
-
-DEFINE_PRINT_FUNCTIONS(Polyhedron)
-
-int
-ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p)
-try {
-  c_variable_output_function = p;
-  return 0;
-}
-CATCH_ALL
-
-int
-ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp)
-try {
-  *pp = c_variable_output_function;
-  return 0;
-}
-CATCH_ALL
diff --git a/interfaces/C/ppl_c.h b/interfaces/C/ppl_c.h
deleted file mode 100644
index 0a7f51e..0000000
--- a/interfaces/C/ppl_c.h
+++ /dev/null
@@ -1,2695 +0,0 @@
-/* Header file for the C interface.  -*- C -*-
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_ppl_c_h
-#define PPL_ppl_c_h 1
-
-/*! \defgroup PPL_C_interface C Language Interface
-
-\brief
-\ref CInterfaceDetails "Some details about the C Interface".
-
-\anchor CInterfaceDetails
-All the declarations needed for using the PPL's C interface
-(preprocessor symbols, data types, variables and
-functions) are collected in the header file <CODE>ppl_c.h</CODE>.
-This file, which is designed to work with pre-ANSI and ANSI C compilers
-as well as C99 and C++ compilers, should be included, either directly
-or via some other header file, with the directive
-\code
-#include <ppl_c.h>
-\endcode
-If this directive does not work, then your compiler is unable to find
-the file <CODE>ppl_c.h</CODE>. So check that the library is installed
-(if it is not installed, you may want to <CODE>make install</CODE>,
-perhaps with root privileges) in the right place
-(if not you may want to reconfigure the library using the appropriate
-pathname for the <CODE>--prefix</CODE> option); and that your compiler
-knows where it is installed (if not you should add the path to the
-directory where <CODE>ppl_c.h</CODE> is located to the compiler's
-include file search path; this is usually done with the
-<CODE>-I</CODE> option).
-
-The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
-preprocessor symbols, enumeration values and variables; and
-<CODE>ppl_*</CODE> for data types and function names. The interface
-systematically uses <EM>opaque data types</EM> (generic pointers that
-completely hide the internal representations from the client code) and
-provides all required access functions. By using just the interface,
-the client code can exploit all the functionalities of the library yet
-avoid directly manipulating the library's data structures.  The advantages
-are that (1) applications do not depend on the internals of the library
-(these may change from release to release), and (2) the interface
-invariants can be thoroughly checked (by the access functions).
-
-The PPL's C interface is initialized by means of the
-<CODE>ppl_initialize</CODE> function.  This function must
-be called <EM>before using any other interface of the library</EM>.
-The application can release the resources allocated by the library by
-calling the <CODE>ppl_finalize</CODE> function. After this function
-is called <EM>no other interface of the library may be used</EM>
-until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
-
-Any application using the PPL should make sure that only the
-intended version(s) of the library are ever used.  The version used can be
-checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
-PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
-give, respectively major, minor, revision and beta numbers of the PPL
-version.  This is an example of their use:
-\code
-#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
-# error "PPL version 0.6 or following is required"
-#endif
-\endcode
-Compile-time checking, however, is not normally enough, particularly in
-an environment where there is dynamic linking.  Run-time checking can
-be performed by means of the functions <CODE>ppl_version_major</CODE>,
-<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
-<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
-functions <CODE>ppl_version</CODE>, returning character string
-containing the full version number, and <CODE>ppl_banner</CODE>,
-returning a string that, in addition, provides (pointers to) other
-useful information for the library user.
-
-All programs using the PPL's C interface must link with the
-following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
-<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
-interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
-Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
-<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
-the compiler's or linker's command line.  For example:
-\verbatim
-gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
-\endverbatim
-If this does not work, it means that your compiler/linker is not
-finding the libraries where it expects.  Again, this could be because you
-forgot to install the library or you installed it in a non-standard
-location.  In the latter case you will need to use the appropriate
-options (usually <CODE>-L</CODE>) and, if you use shared libraries,
-some sort of run-time path selection mechanisms.  Consult your
-compiler's documentation for details.  Notice that the PPL is built
-using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
-an application can exploit this fact to significantly simplify the
-linking phase.  See Libtool's documentation for details.  Those
-working under Linux can find a lot of useful information on how to use
-program libraries (including static, shared, and dynamically loaded
-libraries) in the
-<A HREF="http://www.dwheeler.com/program-library/">Program Library
-HOWTO</A>.
-
-For examples on how to use the functions provided by the C interface,
-you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
-the source distribution.  It contains a <EM>Linear Programming</EM>
-solver written in C.  In order to use this solver you will need to install
-<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
-Programming Kit): this is used to read linear programs in MPS format.
-*/
-
-/*
-  For some reason, GMP up to and including version 4.1.3 requires
-  <stdio.h> to be included before <gmp.h>.
-*/
-/*@{*/ /* \defgroup PPL_C_interface */
-
-#include <stdio.h>
-#include <gmp.h>
-#include <stddef.h>
-
-/*
-  PPL_PROTO is a macro used to wrap function prototypes, so that
-  compilers that don't understand ANSI C prototypes still work, and
-  ANSI C compilers can issue warnings about type mismatches.
-*/
-#if defined(__STDC__)                              \
-  || defined(__cplusplus)                          \
-  || defined (_AIX)                                \
-  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
-  || defined(_WIN32)
-# define PPL_PROTO(protos) protos
-#else
-# define PPL_PROTO(protos) ()
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*! \brief
-  Defines the error codes that any function may return.
-*/
-enum ppl_enum_error_code {
-  /*! \hideinitializer
-    The virtual memory available to the process has been exhausted. */
-  PPL_ERROR_OUT_OF_MEMORY = -2,
-  /*! \hideinitializer
-    A function has been invoked with an invalid argument. */
-  PPL_ERROR_INVALID_ARGUMENT = -3,
-  /*! \hideinitializer
-    A function has been invoked outside its domain of definition. */
-  PPL_ERROR_DOMAIN_ERROR = -4,
-  /*! \hideinitializer
-    The construction of an object that would exceed its maximum
-    permitted size was attempted. */
-  PPL_ERROR_LENGTH_ERROR = -5,
-  /*! \hideinitializer
-    An arithmetic overflow occurred and the computation was consequently
-    interrupted.  This can <EM>only</EM> happen in library's incarnations
-    using bounded integers as coefficients. */
-  PPL_ARITHMETIC_OVERFLOW = -6,
-  /*! \hideinitializer
-    An error occurred during a C input/output operation.  A more
-    precise indication of what went wrong is available via
-    <CODE>errno</CODE>. */
-  PPL_STDIO_ERROR = -7,
-  /*! \hideinitializer
-    An internal error that was diagnosed by the PPL itself.
-    This indicates a bug in the PPL. */
-  PPL_ERROR_INTERNAL_ERROR = -8,
-  /*! \hideinitializer
-    A standard exception has been raised by the C++ run-time environment.
-    This indicates a bug in the PPL. */
-  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
-  /*! \hideinitializer
-    A totally unknown, totally unexpected error happened.
-    This indicates a bug in the PPL. */
-  PPL_ERROR_UNEXPECTED_ERROR = -10
-};
-
-/*! \name Version Checking */
-/*@{*/
-
-/*! \brief
-  The major number of the PPL version.
-*/
-#define PPL_VERSION_MAJOR 0
-
-/*! \brief
-  The minor number of the PPL version.
-*/
-#define PPL_VERSION_MINOR 9
-
-/*! \brief
-  The revision number of the PPL version.
-*/
-#define PPL_VERSION_REVISION 0
-
-/*! \brief
-  The beta number of the PPL version.  This is zero for official
-  releases and nonzero for development snapshots.
-*/
-#define PPL_VERSION_BETA 0
-
-/*! \brief
-  A string containing the PPL version.
-
-  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
-  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
-  format of PPL_VERSION is <CODE>M "." m</CODE> if both
-  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
-  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
-  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
-  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
-  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
-  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
-*/
-#define PPL_VERSION "0.9"
-
-/*! \brief
-  Returns the major number of the PPL version.
-*/
-int
-ppl_version_major PPL_PROTO((void));
-
-/*! \brief
-  Returns the minor number of the PPL version.
-*/
-int
-ppl_version_minor PPL_PROTO((void));
-
-/*! \brief
-  Returns the revision number of the PPL version.
-*/
-int
-ppl_version_revision PPL_PROTO((void));
-
-/*! \brief
-  Returns the beta number of the PPL version.
-*/
-int
-ppl_version_beta PPL_PROTO((void));
-
-/*! \brief
-  Writes to \c *p a pointer to a character string containing the
-  PPL version.
-*/
-int
-ppl_version PPL_PROTO((const char** p));
-
-/*! \brief
-  Writes to \c *p a pointer to a character string containing the PPL banner.
-
-  The banner provides information about the PPL version, the licensing,
-  the lack of any warranty whatsoever, the C++ compiler used to build
-  the library, where to report bugs and where to look for further
-  information.
-*/
-int
-ppl_banner PPL_PROTO((const char** p));
-
-/*@}*/ /* Version Checking */
-
-/*! \brief
-  An unsigned integral type for representing space dimensions.
-*/
-typedef size_t ppl_dimension_type;
-
-/*! \name Initialization, Error Handling and Auxiliary Functions */
-/*@{*/
-
-/*! \brief
-  Writes to \p m the maximum space dimension this library can handle.
-*/
-int
-ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
-
-/*! \brief
-  Writes to \p m a value that does not designate a valid dimension.
-*/
-int
-ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
-
-/*! \brief
-  Initializes the Parma Polyhedra Library.
-  This function must be called before any other function.
-
-  \return
-  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
-  was already initialized.
-*/
-int
-ppl_initialize PPL_PROTO((void));
-
-/*! \brief
-  Finalizes the Parma Polyhedra Library.
-  This function must be called after any other function.
-
-  \return
-  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
-  was already finalized.
-*/
-int
-ppl_finalize PPL_PROTO((void));
-
-/*! \brief
-  Installs the user-defined error handler pointed at by \p h.
-
-  The error handler takes an error code and a textual description that
-  gives further information about the actual error.  The C string
-  containing the textual description is read-only and its existence is
-  not guaranteed after the handler has returned.
-*/
-int
-ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
-					   const char* description)));
-
-/*@}*/ /* Initialization, Error Handling and Auxiliary Functions */
-
-#undef PPL_TYPE_DECLARATION
-
-#define PPL_TYPE_DECLARATION(Type) /*! \brief Opaque pointer. */ typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t; /*! \brief Opaque pointer to const object. */ typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
-
-PPL_TYPE_DECLARATION(Coefficient);
-
-PPL_TYPE_DECLARATION(Linear_Expression);
-
-PPL_TYPE_DECLARATION(Constraint);
-
-PPL_TYPE_DECLARATION(Constraint_System);
-
-PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
-
-PPL_TYPE_DECLARATION(Generator);
-
-PPL_TYPE_DECLARATION(Generator_System);
-
-PPL_TYPE_DECLARATION(Generator_System_const_iterator);
-
-PPL_TYPE_DECLARATION(Polyhedron);
-
-PPL_TYPE_DECLARATION(LP_Problem);
-
-#undef PPL_TYPE_DECLARATION
-
-/*! \name Functions Related to Coefficients */
-/*@{*/
-
-/*! \brief
-  Creates a new coefficient with value 0 and writes a handle for the
-  newly created coefficient at address \p pc.
-*/
-int
-ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
-
-/*! \brief
-  Creates a new coefficient with the value given by the GMP integer
-  \p z and writes a handle for the newly created coefficient
-  at address \p pc.
-*/
-int
-ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
-
-/*! \brief
-  Builds a coefficient that is a copy of \p c; writes a handle
-  for the newly created coefficient at address \p pc.
-*/
-int
-ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
-						ppl_const_Coefficient_t c));
-
-/*! \brief
-  Assign to \p dst the value given by the GMP integer \p z.
-*/
-int
-ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
-
-/*! \brief
-  Assigns a copy of the coefficient \p src to \p dst.
-*/
-int
-ppl_assign_Coefficient_from_Coefficient
-PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
-
-/*! \brief
-  Invalidates the handle \p c: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
-
-/*! \brief
-  Sets the value of the GMP integer \p z to the value of \p c.
-*/
-int
-ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
-
-/*! \brief
-  Returns a positive integer if \p c is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p c is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
-
-/*! \brief
-  Returns a positive integer if coefficients are bounded; returns 0
-  otherwise.
-*/
-int
-ppl_Coefficient_is_bounded PPL_PROTO((void));
-
-/*! \brief
-  Returns a positive integer if coefficients are bounded, in which case
-  \p min is set to their minimum value; returns 0 otherwise.
-*/
-int
-ppl_Coefficient_min PPL_PROTO((mpz_t min));
-
-/*! \brief
-  Returns a positive integer if coefficients are bounded, in which case
-  \p max is set to their maximum value; returns 0 otherwise.
-*/
-int
-ppl_Coefficient_max PPL_PROTO((mpz_t max));
-
-/*@}*/ /* Functions Related to Coefficients */
-
-/*! \name Functions Related to Linear Expressions */
-/*@{*/
-
-/*! \brief
-  Creates a new linear expression corresponding to the constant 0 in a
-  zero-dimensional space; writes a handle for the new linear
-  expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
-
-/*! \brief
-  Creates a new linear expression corresponding to the constant 0 in a
-  <TT>d</TT>-dimensional space; writes a handle for the new linear
-  expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_with_dimension
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
-
-/*! \brief
-  Builds a linear expression that is a copy of \p le; writes a handle
-  for the newly created linear expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_from_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Builds a linear expression corresponding to constraint \p c;
-  writes a handle for the newly created linear expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_from_Constraint
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
-
-/*! \brief
-  Builds a linear expression corresponding to generator \p g;
-  writes a handle for the newly created linear expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_from_Generator
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
-
-/*! \brief
-  Invalidates the handle \p le: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Assigns a copy of the linear expression \p src to \p dst.
-*/
-int
-ppl_assign_Linear_Expression_from_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
-
-/*! \brief
-  Adds \p n to the coefficient of variable \p var in the linear
-  expression \p le.  The space dimension is set to be the maximum
-  between \p var + 1 and the old space dimension.
-*/
-int
-ppl_Linear_Expression_add_to_coefficient
-PPL_PROTO((ppl_Linear_Expression_t le,
-	   ppl_dimension_type var,
-	   ppl_const_Coefficient_t n));
-
-/*! \brief
-  Adds \p n to the inhomogeneous term of the linear expression
-  \p le.
-*/
-int
-ppl_Linear_Expression_add_to_inhomogeneous
-PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
-
-/*! \brief
-  Adds the linear expression \p src to \p dst.
-*/
-int
-ppl_add_Linear_Expression_to_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
-
-/*! \brief
-  Subtracts the linear expression \p src from \p dst.
-*/
-int
-ppl_subtract_Linear_Expression_from_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
-
-/*! \brief
-  Multiply the linear expression \p dst by \p n.
-*/
-int
-ppl_multiply_Linear_Expression_by_Coefficient
-PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
-
-/*! \brief
-  Writes to \p m the space dimension of \p le.
-*/
-int
-ppl_Linear_Expression_space_dimension
-PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
-
-/*! \brief
-  Copies into \p n the coefficient of variable \p var in
-  the linear expression \p le.
-*/
-int
-ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
-					     ppl_dimension_type var,
-					     ppl_Coefficient_t n));
-
-/*! \brief
-  Copies into \p n the inhomogeneous term of linear expression \p le.
-*/
-int
-ppl_Linear_Expression_inhomogeneous_term
-PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
-
-/*! \brief
-  Returns a positive integer if \p le is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p le is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
-
-/*@}*/ /* Functions Related to Linear Expressions */
-
-/*! \brief
-  Describes the relations represented by a constraint.
-*/
-enum ppl_enum_Constraint_Type {
-  /*! The constraint is of the form \f$e < 0\f$. */
-  PPL_CONSTRAINT_TYPE_LESS_THAN,
-  /*! The constraint is of the form \f$e \leq 0\f$. */
-  PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL,
-  /*! The constraint is of the form \f$e = 0\f$. */
-  PPL_CONSTRAINT_TYPE_EQUAL,
-  /*! The constraint is of the form \f$e \geq 0\f$. */
-  PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL,
-  /*! The constraint is of the form \f$e > 0\f$. */
-  PPL_CONSTRAINT_TYPE_GREATER_THAN
-};
-
-
-/*! \name Functions Related to Constraints */
-/*@{*/
-
-/*! \brief
-  Creates the new constraint `\p le \p rel 0' and writes a handle for
-  it at address \p pc.  The space dimension of the new constraint is
-  equal to the space dimension of \p le.
-*/
-int
-ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
-			      ppl_const_Linear_Expression_t le,
-			      enum ppl_enum_Constraint_Type rel));
-
-/*! \brief
-  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
-  and writes a handle for it at address \p pc.
-*/
-int
-ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
-
-/*! \brief
-  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
-  also known as <EM>positivity constraint</EM>.
-  A handle for the newly created constraint is written at address \p pc.
-*/
-int
-ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
-
-/*! \brief
-  Builds a constraint that is a copy of \p c; writes a handle
-  for the newly created constraint at address \p pc.
-*/
-int
-ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
-					      ppl_const_Constraint_t c));
-
-/*! \brief
-  Invalidates the handle \p c: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
-
-/*! \brief
-  Assigns a copy of the constraint \p src to \p dst.
-*/
-int
-ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
-						 ppl_const_Constraint_t src));
-
-/*! \brief
-  Writes to \p m the space dimension of \p c.
-*/
-int
-ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
-					  ppl_dimension_type* m));
-
-/*! \brief
-  Returns the type of constraint \p c.
-*/
-int
-ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
-
-/*! \brief
-  Copies into \p n the coefficient of variable \p var in
-  constraint \p c.
-*/
-int
-ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
-				      ppl_dimension_type var,
-				      ppl_Coefficient_t n));
-
-/*! \brief
-  Copies into \p n the inhomogeneous term of constraint \p c.
-*/
-int
-ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
-					     ppl_Coefficient_t n));
-
-/*! \brief
-  Returns a positive integer if \p c is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p c is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
-
-/*@}*/ /* Functions Related to Constraints */
-
-/*! \name Functions Related to Constraint Systems */
-/*@{*/
-
-/*! \brief
-  Builds an empty system of constraints and writes a handle to it at
-  address \p pcs.
-*/
-int
-ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
-
-/*! \brief
-  Builds a zero-dimensional, unsatisfiable constraint system and
-  writes a handle to it at address \p pcs.
-*/
-int
-ppl_new_Constraint_System_zero_dim_empty
-PPL_PROTO((ppl_Constraint_System_t* pcs));
-
-/*! \brief
-  Builds the singleton constraint system containing only a copy of
-  constraint \p c; writes a handle for the newly created system at
-  address \p pcs.
-*/
-int
-ppl_new_Constraint_System_from_Constraint
-PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
-
-/*! \brief
-  Builds a constraint system that is a copy of \p cs; writes a handle
-  for the newly created system at address \p pcs.
-*/
-int
-ppl_new_Constraint_System_from_Constraint_System
-PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Invalidates the handle \p cs: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Assigns a copy of the constraint system \p src to \p dst.
-*/
-int
-ppl_assign_Constraint_System_from_Constraint_System
-PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p cs.
-*/
-int
-ppl_Constraint_System_space_dimension
-PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
-
-/*! \brief
-  Returns a positive integer if \p cs contains any (non-trivial) strict
-  inequality; returns 0 otherwise.
-*/
-int
-ppl_Constraint_System_has_strict_inequalities
-PPL_PROTO((ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Removes all the constraints from the constraint system \p cs
-  and sets its space dimension to 0.
-*/
-int
-ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
-
-/*! \brief
-  Inserts a copy of the constraint \p c into \p cs; the space
-  dimension is increased, if necessary.
-*/
-int
-ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
-						   ppl_const_Constraint_t c));
-
-/*! \brief
-  Returns a positive integer if \p cs is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p cs is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t c));
-
-
-/*! \brief
-  Builds a new `const iterator' and writes a handle to it at address
-  \p pcit.
-*/
-int
-ppl_new_Constraint_System_const_iterator
-PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
-
-/*! \brief
-  Builds a const iterator that is a copy of \p cit; writes an
-  handle for the newly created const iterator at address \p pcit.
-*/
-int
-ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
-PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
-	   ppl_const_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Invalidates the handle \p cit: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Constraint_System_const_iterator
-PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Assigns a copy of the const iterator \p src to \p dst.
-*/
-int
-ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
-PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
-	   ppl_const_Constraint_System_const_iterator_t src));
-
-/*! \brief
-  Assigns to \p cit a const iterator "pointing" to the beginning of
-  the constraint system \p cs.
-*/
-int
-ppl_Constraint_System_begin
-PPL_PROTO((ppl_const_Constraint_System_t cs,
-	   ppl_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Assigns to \p cit a const iterator "pointing" past the end of the
-  constraint system \p cs.
-*/
-int
-ppl_Constraint_System_end
-PPL_PROTO((ppl_const_Constraint_System_t cs,
-	   ppl_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Dereference \p cit writing a const handle to the resulting
-  constraint at address \p pc.
-*/
-int
-ppl_Constraint_System_const_iterator_dereference
-PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
-	   ppl_const_Constraint_t* pc));
-
-/*! \brief
-  Increment \p cit so that it "points" to the next constraint.
-*/
-int
-ppl_Constraint_System_const_iterator_increment
-PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Returns a positive integer if the iterators corresponding to \p x and
-  \p y are equal; returns 0 if they are different.
-*/
-int
-ppl_Constraint_System_const_iterator_equal_test
-PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
-	   ppl_const_Constraint_System_const_iterator_t y));
-
-/*@}*/ /* Functions Related to Constraint Systems */
-
-/*! \brief
-  Describes the different kinds of generators.
-*/
-enum ppl_enum_Generator_Type {
-  /*! The generator is a line. */
-  PPL_GENERATOR_TYPE_LINE,
-  /*! The generator is a ray. */
-  PPL_GENERATOR_TYPE_RAY,
-  /*! The generator is a point. */
-  PPL_GENERATOR_TYPE_POINT,
-  /*! The generator is a closure point. */
-  PPL_GENERATOR_TYPE_CLOSURE_POINT
-};
-
-
-/*! \name Functions Related to Generators */
-/*@{*/
-
-/*! \brief
-  Creates a new generator of direction \p le and type \p t.  If the
-  generator to be created is a point or a closure point, the divisor
-  \p d is applied to \p le.  For other types of generators \p d is
-  simply disregarded.  A handle for the new generator is written at
-  address \p pg.  The space dimension of the new generator is equal to
-  the space dimension of \p le.
-*/
-int
-ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
-			     ppl_const_Linear_Expression_t le,
-			     enum ppl_enum_Generator_Type t,
-			     ppl_const_Coefficient_t d));
-
-/*! \brief
-  Creates the point that is the origin of the zero-dimensional space
-  \f$\Rset^0\f$.  Writes a handle for the new generator at address
-  \p pg.
-*/
-int
-ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
-
-/*! \brief
-  Creates, as a closure point, the point that is the origin of the
-  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
-  generator at address \p pg.
-*/
-int
-ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
-
-/*! \brief
-  Builds a generator that is a copy of \p g; writes a handle
-  for the newly created generator at address \p pg.
-*/
-int
-ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
-					    ppl_const_Generator_t g));
-
-/*! \brief
-  Invalidates the handle \p g: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
-
-/*! \brief
-  Assigns a copy of the generator \p src to \p dst.
-*/
-int
-ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
-					       ppl_const_Generator_t src));
-
-/*! \brief
-  Writes to \p m the space dimension of \p g.
-*/
-int
-ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
-					 ppl_dimension_type* m));
-
-/*! \brief
-  Returns the type of generator \p g.
-*/
-int
-ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
-
-/*! \brief
-  Copies into \p n the coefficient of variable \p var in
-  generator \p g.
-*/
-int
-ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
-				     ppl_dimension_type var,
-				     ppl_Coefficient_t n));
-
-/*! \brief
-  If \p g is a point or a closure point assigns its divisor to \p n.
-*/
-int
-ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
-				 ppl_Coefficient_t n));
-
-/*! \brief
-  Returns a positive integer if \p g is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p g is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
-
-/*@}*/ /* Functions Related to Generators */
-
-/*! \name Functions Related to Generator Systems */
-/*@{*/
-
-/*! \brief
-  Builds an empty system of generators and writes a handle to it at
-  address \p pgs.
-*/
-int
-ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
-
-/*
-  Creates the universe zero-dimensional system of generators (i.e.,
-  containing the origin only).  Writes a handle to the new system at
-  address \p pgs.
-*/
-int
-ppl_new_Generator_System_zero_dim_univ
-PPL_PROTO((ppl_Generator_System_t* pgs));
-
-/*! \brief
-  Builds the singleton generator system containing only a copy of
-  generator \p g; writes a handle for the newly created system at
-  address \p pgs.
-*/
-int
-ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
-						   ppl_const_Generator_t g));
-
-/*! \brief
-  Builds a generator system that is a copy of \p gs; writes a handle
-  for the newly created system at address \p pgs.
-*/
-int
-ppl_new_Generator_System_from_Generator_System
-PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Invalidates the handle \p gs: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Assigns a copy of the generator system \p src to \p dst.
-*/
-int
-ppl_assign_Generator_System_from_Generator_System
-PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p gs.
-*/
-int
-ppl_Generator_System_space_dimension
-PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
-
-/*! \brief
-  Removes all the generators from the generator system \p gs
-  and sets its space dimension to 0.
-*/
-int
-ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
-
-/*! \brief
-  Inserts a copy of the generator \p g into \p gs; the space
-  dimension is increased, if necessary.
-*/
-int
-ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
-						 ppl_const_Generator_t g));
-
-/*! \brief
-  Returns a positive integer if \p gs is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p gs is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t c));
-
-
-/*! \brief
-  Builds a new `const iterator' and writes a handle to it at address
-  \p pgit.
-*/
-int
-ppl_new_Generator_System_const_iterator
-PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
-
-/*! \brief
-  Builds a const iterator that is a copy of \p git; writes an
-  handle for the newly created const iterator at address \p pgit.
-*/
-int
-ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
-PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
-	   ppl_const_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Invalidates the handle \p git: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Generator_System_const_iterator
-PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Assigns a copy of the const iterator \p src to \p dst.
-*/
-int
-ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
-PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
-	   ppl_const_Generator_System_const_iterator_t src));
-
-/*! \brief
-  Assigns to \p git a const iterator "pointing" to the beginning of
-  the generator system \p gs.
-*/
-int
-ppl_Generator_System_begin
-PPL_PROTO((ppl_const_Generator_System_t gs,
-	   ppl_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Assigns to \p git a const iterator "pointing" past the end of the
-  generator system \p gs.
-*/
-int
-ppl_Generator_System_end
-PPL_PROTO((ppl_const_Generator_System_t gs,
-	   ppl_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Dereference \p git writing a const handle to the resulting
-  generator at address \p pg.
-*/
-int
-ppl_Generator_System_const_iterator_dereference
-PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
-	   ppl_const_Generator_t* pg));
-
-/*! \brief
-  Increment \p git so that it "points" to the next generator.
-*/
-int
-ppl_Generator_System_const_iterator_increment
-PPL_PROTO((ppl_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Returns a positive integer if the iterators corresponding to \p x and
-  \p y are equal; returns 0 if they are different.
-*/
-int
-ppl_Generator_System_const_iterator_equal_test
-PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
-	   ppl_const_Generator_System_const_iterator_t y));
-
-/*@}*/ /* Functions Related to Generator Systems */
-
-/*! \brief
-  Code of the worst-case polynomial complexity class.
-*/
-extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
-
-/*! \brief
-  Code of the worst-case exponential but typically polynomial
-  complexity class.
-*/
-extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
-
-/*! \brief
-  Code of the universal complexity class.
-*/
-extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
-
-/*! \brief
-  Code of the "unfeasible LP problem" status.
-*/
-extern int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
-
-/*! \brief
-  Code of the "unbounded LP problem" status.
-*/
-extern int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
-
-/*! \brief
-  Code of the "optimized LP problem" status.
-*/
-extern int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
-
-/*! \brief
-  Code of the "maximization" optimization mode.
-*/
-extern int PPL_LP_PROBLEM_MAXIMIZATION;
-
-/*! \brief
-  Code of the "minimization" optimization mode.
-*/
-extern int PPL_LP_PROBLEM_MINIMIZATION;
-
-/*! \brief
-  Individual bit saying that the polyhedron and the set of points
-  satisfying the constraint are disjoint.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
-
-/*! \brief
-  Individual bit saying that the polyhedron intersects the set of
-  points satisfying the constraint, but it is not included in it.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
-
-/*! \brief
-  Individual bit saying that the polyhedron is included in the set of
-  points satisfying the constraint.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
-
-/*! \brief
-  Individual bit saying that the polyhedron is included in the set of
-  points saturating the constraint.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
-
-/*! \brief
-  Individual bit saying that adding the generator would not change the
-  polyhedron.
-*/
-extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
-
-/*! \name Functions Related to Polyhedra */
-/*@{*/
-
-/*! \brief
-  Builds a universe C polyhedron of dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-					       ppl_dimension_type d));
-
-/*! \brief
-  Builds a universe NNC polyhedron of dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-						 ppl_dimension_type d));
-
-/*! \brief
-  Builds an empty C polyhedron of space dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-						     ppl_dimension_type d));
-
-/*! \brief
-  Builds an empty NNC polyhedron of space dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-						       ppl_dimension_type d));
-
-/*! \brief
-  Builds a C polyhedron that is a copy of \p ph; writes a handle
-  for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_from_C_Polyhedron PPL_PROTO((ppl_Polyhedron_t* pph,
-						  ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds a C polyhedron that is a copy of of the NNC polyhedron \p ph;
-  writes a handle for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_from_NNC_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
-  writes a handle for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_from_C_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds an NNC polyhedron that is a copy of \p ph; writes a handle
-  for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds a new C polyhedron from the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p cs.
-*/
-int
-ppl_new_C_Polyhedron_from_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new C polyhedron recycling the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p cs will be <EM>the</EM> system of constraints of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_C_Polyhedron_recycle_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new NNC polyhedron from the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p cs.
-*/
-int
-ppl_new_NNC_Polyhedron_from_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new NNC polyhedron recycling the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p cs will be <EM>the</EM> system of constraints of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_NNC_Polyhedron_recycle_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new C polyhedron from the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p gs.
-*/
-int
-ppl_new_C_Polyhedron_from_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Builds a new C polyhedron recycling the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p gs will be <EM>the</EM> system of generators of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_C_Polyhedron_recycle_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
-
-/*! \brief
-  Builds a new NNC polyhedron from the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p gs.
-*/
-int
-ppl_new_NNC_Polyhedron_from_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Builds a new NNC polyhedron recycling the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p gs will be <EM>the</EM> system of generators of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_NNC_Polyhedron_recycle_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
-
-/*! \brief
-  Builds a new C polyhedron corresponding to an interval-based
-  bounding box, writing a handle for the newly created polyhedron at
-  address \p pph.
-
-  If an interval of the bounding box is provided with any finite
-  but open bound, then the polyhedron is not built and the value
-  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
-  The bounding box is accessed by using the following functions,
-  passed as arguments:
-    \code
-      ppl_dimension_type space_dimension()
-    \endcode
-    returns the dimension of the vector space enclosing the polyhedron
-    represented by the bounding box.
-    \code
-      int is_empty()
-    \endcode
-    returns 0 if and only if the bounding box describes a non-empty set.
-    The function <CODE>is_empty()</CODE> will always be called before the
-    other functions. However, if <CODE>is_empty()</CODE> does not
-    return 0, none of the functions below will be called.
-    \code
-      int get_lower_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    lower boundary of \f$I\f$ is open and is set to a value different
-    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
-    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
-    fraction \f$n/d\f$ corresponds to the greatest lower bound of
-    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
-    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
-    positive, \f$0/1\f$ being the unique representation for zero.
-    \code
-      int get_upper_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    upper boundary of \f$I\f$ is open and is set to a value different
-    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
-    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
-    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
-*/
-int
-ppl_new_C_Polyhedron_from_bounding_box
-PPL_PROTO((ppl_Polyhedron_t* pph,
-	   ppl_dimension_type (*space_dimension)(void),
-	   int (*is_empty)(void),
-	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d),
-	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d)));
-
-/*! \brief
-  Builds a new NNC polyhedron corresponding to an interval-based
-  bounding box, writing a handle for the newly created polyhedron at
-  address \p pph.
-
-  The bounding box is accessed by using the following functions,
-  passed as arguments:
-    \code
-      ppl_dimension_type space_dimension()
-    \endcode
-    returns the dimension of the vector space enclosing the polyhedron
-    represented by the bounding box.
-    \code
-      int is_empty()
-    \endcode
-    returns 0 if and only if the bounding box describes a non-empty set.
-    The function <CODE>is_empty()</CODE> will always be called before the
-    other functions. However, if <CODE>is_empty()</CODE> does not
-    return 0, none of the functions below will be called.
-    \code
-      int get_lower_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    lower boundary of \f$I\f$ is open and is set to a value different
-    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
-    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
-    fraction \f$n/d\f$ corresponds to the greatest lower bound of
-    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
-    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
-    positive, \f$0/1\f$ being the unique representation for zero.
-    \code
-      int get_upper_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    upper boundary of \f$I\f$ is open and is set to a value different
-    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
-    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
-    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
-*/
-int
-ppl_new_NNC_Polyhedron_from_bounding_box
-PPL_PROTO((ppl_Polyhedron_t* pph,
-	   ppl_dimension_type (*space_dimension)(void),
-	   int (*is_empty)(void),
-	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d),
-	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d)));
-
-/*! \brief
-  Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
-*/
-int
-ppl_assign_C_Polyhedron_from_C_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
-
-/*! \brief
-  Assigns a copy of the NNC polyhedron \p src to the NNC
-  polyhedron \p dst.
-*/
-int
-ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
-
-/*! \brief
-  Invalidates the handle \p ph: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p ph.
-*/
-int
-ppl_Polyhedron_space_dimension PPL_PROTO((ppl_const_Polyhedron_t ph,
-					  ppl_dimension_type* m));
-
-/*! \brief
-  Writes to \p m the affine dimension of \p ph (not to be confused with the
-  dimension of its enclosing vector space) or 0, if \p ph is empty.
-*/
-int
-ppl_Polyhedron_affine_dimension PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Writes a const handle to the constraint system defining the
-  polyhedron \p ph at address \p pcs.
-*/
-int
-ppl_Polyhedron_constraints PPL_PROTO((ppl_const_Polyhedron_t ph,
-				      ppl_const_Constraint_System_t* pcs));
-
-/*! \brief
-  Writes a const handle to the minimized constraint system defining the
-  polyhedron \p ph at address \p pcs.
-*/
-int
-ppl_Polyhedron_minimized_constraints
-PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs));
-
-/*! \brief
-  Writes a const handle to the generator system defining the
-  polyhedron \p ph at address \p pgs.
-*/
-int
-ppl_Polyhedron_generators PPL_PROTO((ppl_const_Polyhedron_t ph,
-				     ppl_const_Generator_System_t* pgs));
-
-/*! \brief
-  Writes a const handle to the minimized generator system defining the
-  polyhedron \p ph at address \p pgs.
-*/
-int
-ppl_Polyhedron_minimized_generators
-PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs));
-
-/*! \brief
-  Checks the relation between the polyhedron \p ph and the constraint \p c.
-
-  If successful, returns a non-negative integer that is
-  obtained as the bitwise or of the bits (chosen among
-  PPL_POLY_CON_RELATION_IS_DISJOINT
-  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
-  PPL_POLY_CON_RELATION_IS_INCLUDED, and
-  PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
-  \p ph and \p c.
-*/
-int
-ppl_Polyhedron_relation_with_Constraint PPL_PROTO((ppl_const_Polyhedron_t ph,
-						   ppl_const_Constraint_t c));
-
-/*! \brief
-  Checks the relation between the polyhedron \p ph and the generator \p g.
-
-  If successful, returns a non-negative integer that is
-  obtained as the bitwise or of the bits (only
-  PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
-  relation between \p ph and \p g.
-*/
-int
-ppl_Polyhedron_relation_with_Generator PPL_PROTO((ppl_const_Polyhedron_t ph,
-						  ppl_const_Generator_t g));
-
-/*! \brief
-  Use \p ph to shrink a generic, interval-based bounding box.
-  The bounding box is abstractly provided by means of the parameters.
-
-  \param ph
-  The polyhedron that is used to shrink the bounding box;
-
-  \param complexity
-  The code of the complexity class of the algorithm to be used.
-  Must be one of PPL_COMPLEXITY_CLASS_POLYNOMIAL,
-  PPL_COMPLEXITY_CLASS_SIMPLEX, or PPL_COMPLEXITY_CLASS_ANY;
-
-  \param set_empty
-  A pointer to a void function with no arguments that causes the bounding
-  box to become empty, i.e., to represent the empty set;
-
-  \param raise_lower_bound
-  A pointer to a void function with arguments
-  <CODE>(ppl_dimension_type k, int closed,
-         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
-  that intersects the interval corresponding to the <CODE>k</CODE>-th
-  space dimension with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is non-zero,
-  with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is zero.
-  The fraction \f$n/d\f$ is in canonical form, that is, \f$n\f$
-  and \f$d\f$ have no common factors and \f$d\f$ is positive, \f$0/1\f$
-  being the unique representation for zero;
-
-  \param lower_upper_bound
-  a pointer to a void function with argument
-  <CODE>(ppl_dimension_type k, int closed,
-         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
-  that intersects the interval corresponding to the <CODE>k</CODE>-th
-  space dimension with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is non-zero,
-  with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE> is zero.
-  The fraction \f$n/d\f$ is in canonical form.
-*/
-int
-ppl_Polyhedron_shrink_bounding_box
-PPL_PROTO((ppl_const_Polyhedron_t ph,
-	   unsigned int complexity,
-	   void (*set_empty)(void),
-	   void (*raise_lower_bound)(ppl_dimension_type k, int closed,
-				     ppl_const_Coefficient_t n,
-				     ppl_const_Coefficient_t d),
-	   void (*lower_upper_bound)(ppl_dimension_type k, int closed,
-				     ppl_const_Coefficient_t n,
-				     ppl_const_Coefficient_t d)));
-
-/*! \brief
-  Returns a positive integer if \p ph is empty; returns 0 if \p ph is
-  not empty.
-*/
-int
-ppl_Polyhedron_is_empty PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p ph is a universe polyhedron;
-  returns 0 if it is not.
-*/
-int
-ppl_Polyhedron_is_universe PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
-  unbounded.
-*/
-int
-ppl_Polyhedron_is_bounded PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p le is bounded from above in \p ph;
-  returns 0 otherwise.
-*/
-int
-ppl_Polyhedron_bounds_from_above PPL_PROTO((ppl_const_Polyhedron_t ph,
-					    ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Returns a positive integer if \p le is bounded from below in \p ph;
-  returns 0 otherwise.
-*/
-int
-ppl_Polyhedron_bounds_from_below PPL_PROTO((ppl_const_Polyhedron_t ph,
-					    ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Returns a positive integer if \p ph is not empty
-  and \p le is bounded from above in \p ph, in which case
-  the supremum value and a point where \p le reaches it are computed.
-
-  \param ph
-  The polyhedron constraining \p le;
-
-  \param le
-  The linear expression to be maximized subject to \p ph;
-
-  \param sup_n
-  Will be assigned the numerator of the supremum value;
-
-  \param sup_d
-  Will be assigned the denominator of the supremum value;
-
-  \param pmaximum
-  Will store 1 in this location if the supremum is also the maximum,
-  will store 0 otherwise;
-
-  \param point
-  Will be assigned the point or closure point where \p le reaches the
-  extremum value.
-
-  If \p ph is empty or \p le is not bounded from above,
-  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
-  will be left untouched.
-*/
-int
-ppl_Polyhedron_maximize PPL_PROTO((ppl_const_Polyhedron_t ph,
-				   ppl_const_Linear_Expression_t le,
-				   ppl_Coefficient_t sup_n,
-				   ppl_Coefficient_t sup_d,
-				   int* pmaximum,
-				   ppl_Generator_t point));
-
-/*! \brief
-  Returns a positive integer if  \p ph is not empty
-  and \p le is bounded from below in \p ph, in which case
-  the infimum value and a point where \p le reaches it are computed.
-
-  \param ph
-  The polyhedron constraining \p le;
-
-  \param le
-  The linear expression to be minimized subject to \p ph;
-
-  \param inf_n
-  Will be assigned the numerator of the infimum value;
-
-  \param inf_d
-  Will be assigned the denominator of the infimum value;
-
-  \param pminimum
-  Will store 1 in this location if the infimum is also the minimum,
-  will store 0 otherwise;
-
-  \param point
-  Will be assigned the point or closure point where \p le reaches the
-  extremum value.
-
-  If \p ph is empty or \p le is not bounded from below,
-  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
-  will be left untouched.
-*/
-int
-ppl_Polyhedron_minimize PPL_PROTO((ppl_const_Polyhedron_t ph,
-				   ppl_const_Linear_Expression_t le,
-				   ppl_Coefficient_t inf_n,
-				   ppl_Coefficient_t inf_d,
-				   int* pminimum,
-				   ppl_Generator_t point));
-
-/*! \brief
-  Returns a positive integer if \p ph is topologically closed;
-  returns 0 if \p ph is not topologically closed.
-*/
-int
-ppl_Polyhedron_is_topologically_closed PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p x contains or is equal to \p y;
-  returns 0 if it does not.
-*/
-int
-ppl_Polyhedron_contains_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
-					      ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p x strictly contains \p y; returns 0
-  if it does not.
-*/
-int
-ppl_Polyhedron_strictly_contains_Polyhedron
-PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p x and \p y are disjoint; returns 0
-  if they are not.
-*/
-int
-ppl_Polyhedron_is_disjoint_from_Polyhedron
-PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p x and \p y are the same polyhedron;
-  returns 0 if they are different.
-
-  Note that \p x and \p y may be topology- and/or dimension-incompatible
-  polyhedra: in those cases, the value 0 is returned.
-*/
-int
-ppl_Polyhedron_equals_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
-					    ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p ph is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p ph is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Polyhedron_OK PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Adds a copy of the constraint \p c to the system of constraints of
-  \p ph.
-*/
-int
-ppl_Polyhedron_add_constraint PPL_PROTO((ppl_Polyhedron_t ph,
-					 ppl_const_Constraint_t c));
-
-/*! \brief
-  Adds a copy of the constraint \p c to the system of constraints of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_constraint_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_t c));
-
-/*! \brief
-  Adds a copy of the generator \p g to the system of generators of
-  \p ph.
-*/
-int
-ppl_Polyhedron_add_generator PPL_PROTO((ppl_Polyhedron_t ph,
-					ppl_const_Generator_t g));
-
-/*! \brief
-  Adds a copy of the generator \p g to the system of generators of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_generator_and_minimize PPL_PROTO((ppl_Polyhedron_t ph,
-						     ppl_const_Generator_t g));
-
-/*! \brief
-  Adds a copy of the system of constraints \p cs to the system of
-  constraints of \p ph.
-*/
-int
-ppl_Polyhedron_add_constraints PPL_PROTO((ppl_Polyhedron_t ph,
-					  ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Adds a copy of the system of constraints \p cs to the system of
-  constraints of \p ph.  Returns a positive integer if the resulting
-  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
-  return, \p ph is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_constraints_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Adds a copy of the system of generators \p gs to the system of
-  generators of \p ph.
-*/
-int
-ppl_Polyhedron_add_generators PPL_PROTO((ppl_Polyhedron_t ph,
-					 ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Adds a copy of the system of generators \p gs to the system of
-  generators of \p ph.  Returns a positive integer if the resulting
-  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
-  return, \p ph is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_generators_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Adds the system of constraints \p cs to the system of constraints of
-  \p ph.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_constraints
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Adds the system of constraints \p cs to the system of constraints of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_constraints_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Adds the system of generators \p gs to the system of generators of
-  \p ph.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_generators PPL_PROTO((ppl_Polyhedron_t ph,
-						  ppl_Generator_System_t gs));
-
-/*! \brief
-  Adds the system of generators \p gs to the system of generators of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_generators_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_Generator_System_t gs));
-
-/*! \brief
-  Intersects \p x with polyhedron \p y and assigns the result to \p x.
-*/
-int
-ppl_Polyhedron_intersection_assign PPL_PROTO((ppl_Polyhedron_t x,
-					      ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Intersects \p x with polyhedron \p y and assigns the result to \p x.
-  Returns a positive integer if the resulting polyhedron is non-empty;
-  returns 0 if it is empty.  Upon successful return, \p x is also
-  guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_intersection_assign_and_minimize
-PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Assigns to \p x the poly-hull of \p x and \p y.
-*/
-int
-ppl_Polyhedron_poly_hull_assign PPL_PROTO((ppl_Polyhedron_t x,
-					   ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Assigns to \p x the poly-hull of \p x and \p y. Returns a positive
-  integer if the resulting polyhedron is non-empty; returns 0 if it is
-  empty. Upon successful return, \p x is also guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_poly_hull_assign_and_minimize
-PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Assigns to \p x the \ref Convex_Polyhedral_Difference "poly-difference"
-  of \p x and \p y.
-*/
-int
-ppl_Polyhedron_poly_difference_assign PPL_PROTO((ppl_Polyhedron_t x,
-						 ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Transforms the polyhedron \p ph, assigning an affine expression
-  to the specified variable.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable to which the affine expression is assigned;
-
-  \param le
-  The numerator of the affine expression;
-
-  \param d
-  The denominator of the affine expression.
-*/
-int
-ppl_Polyhedron_affine_image PPL_PROTO((ppl_Polyhedron_t ph,
-				       ppl_dimension_type var,
-				       ppl_const_Linear_Expression_t le,
-				       ppl_const_Coefficient_t d));
-
-/*! \brief
-  Transforms the polyhedron \p ph, substituting an affine expression
-  to the specified variable.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable to which the affine expression is substituted;
-
-  \param le
-  The numerator of the affine expression;
-
-  \param d
-  The denominator of the affine expression.
-*/
-int
-ppl_Polyhedron_affine_preimage PPL_PROTO((ppl_Polyhedron_t ph,
-					  ppl_dimension_type var,
-					  ppl_const_Linear_Expression_t le,
-					  ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the image of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\frac{\mathrm{lb}}{\mathrm{d}}
-       \leq \mathrm{var}'
-         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable bounded by the generalized affine transfer relation;
-
-  \param lb
-  The numerator of the lower bounding affine expression;
-
-  \param ub
-  The numerator of the upper bounding affine expression;
-
-  \param d
-  The (common) denominator of the lower and upper bounding affine expressions.
-*/
-int
-ppl_Polyhedron_bounded_affine_image
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   ppl_const_Linear_Expression_t lb,
-	   ppl_const_Linear_Expression_t ub,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the preimage of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\frac{\mathrm{lb}}{\mathrm{d}}
-       \leq \mathrm{var}'
-         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable bounded by the generalized affine transfer relation;
-
-  \param lb
-  The numerator of the lower bounding affine expression;
-
-  \param ub
-  The numerator of the upper bounding affine expression;
-
-  \param d
-  The (common) denominator of the lower and upper bounding affine expressions.
-*/
-int
-ppl_Polyhedron_bounded_affine_preimage
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   ppl_const_Linear_Expression_t lb,
-	   ppl_const_Linear_Expression_t ub,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the image of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
-  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-  by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The left hand side variable of the generalized affine transfer relation;
-
-  \param relsym
-  The relation symbol;
-
-  \param le
-  The numerator of the right hand side affine expression;
-
-  \param d
-  The denominator of the right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_image
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t le,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the preimage of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
-  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-  by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The left hand side variable of the generalized affine transfer relation;
-
-  \param relsym
-  The relation symbol;
-
-  \param le
-  The numerator of the right hand side affine expression;
-
-  \param d
-  The denominator of the right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_preimage
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t le,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the image of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param lhs
-  The left hand side affine expression;
-
-  \param relsym
-  The relation symbol;
-
-  \param rhs
-  The right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_image_lhs_rhs
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_const_Linear_Expression_t lhs,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t rhs));
-
-/*! \brief
-  Assigns to \p ph the preimage of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param lhs
-  The left hand side affine expression;
-
-  \param relsym
-  The relation symbol;
-
-  \param rhs
-  The right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_const_Linear_Expression_t lhs,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t rhs));
-
-/*! \brief
-  Assigns to \p x the \ref Time_Elapse_Operator "time-elapse" between
-  the polyhedra \p x and \p y.
-*/
-int
-ppl_Polyhedron_time_elapse_assign PPL_PROTO((ppl_Polyhedron_t x,
-					     ppl_const_Polyhedron_t y));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y.  If \p tp is not the null pointer, the
-  \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y.
-*/
-int
-ppl_Polyhedron_BHRZ03_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
-						 ppl_const_Polyhedron_t y));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x.  If \p tp is not the null pointer,
-  the \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x.
-*/
-int
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
-  x. If \p tp is not the null pointer,
-  the \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
-*/
-int
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y.  If \p tp is not the null pointer, the
-  \ref Widening_with_Tokens "widening with tokens" delay technique is
-  applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_H79_widening_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y.
-*/
-int
-ppl_Polyhedron_H79_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
-					      ppl_const_Polyhedron_t y));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x. If \p tp is not the null
-  pointer, the \ref Widening_with_Tokens "widening with tokens" delay
-  technique is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x.
-*/
-int
-ppl_Polyhedron_limited_H79_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
-  If \p tp is not the null pointer,
-  the \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
-  x.
-*/
-int
-ppl_Polyhedron_bounded_H79_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Assigns to \p ph its topological closure.
-*/
-int
-ppl_Polyhedron_topological_closure_assign PPL_PROTO((ppl_Polyhedron_t ph));
-
-/*! \brief
-  Adds \p d new dimensions to the space enclosing the polyhedron \p ph
-  and to \p ph itself.
-*/
-int
-ppl_Polyhedron_add_space_dimensions_and_embed
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
-
-/*! \brief
-  Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
-*/
-int
-ppl_Polyhedron_add_space_dimensions_and_project
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
-
-/*! \brief
-  Seeing a polyhedron as a set of tuples (its points), assigns
-  to \p x all the tuples that can be obtained by concatenating,
-  in the order given, a tuple of \p x with a tuple of \p y.
-*/
-int
-ppl_Polyhedron_concatenate_assign PPL_PROTO((ppl_Polyhedron_t x,
-					     ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Removes from the vector space enclosing \p ph the space dimensions that
-  are specified in first \p n positions of the array \p ds.  The presence
-  of duplicates in \p ds is a waste but an innocuous one.
-*/
-int
-ppl_Polyhedron_remove_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
-						  ppl_dimension_type ds[],
-						  size_t n));
-
-/*! \brief
-  Removes the higher dimensions from the vector space enclosing \p ph
-  so that, upon successful return, the new space dimension is \p d.
-*/
-int
-ppl_Polyhedron_remove_higher_space_dimensions
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
-
-/*! \brief
-  Remaps the dimensions of the vector space according to a
-  \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
-  This function is specified by means of the \p maps array,
-  which has \p n entries.
-
-  The partial function is defined on dimension <CODE>i</CODE>
-  if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
-  otherwise it is undefined on dimension <CODE>i</CODE>.
-  If the function is defined on dimension <CODE>i</CODE>, then dimension
-  <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
-
-  The result is undefined if \p maps does not encode a partial
-  function with the properties described in the
-  \ref Mapping_the_Dimensions_of_the_Vector_Space
-  "specification of the mapping operator".
-*/
-int
-ppl_Polyhedron_map_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
-					       ppl_dimension_type maps[],
-					       size_t n));
-
-/*! \brief
-  \ref expand_space_dimension "Expands" the \f$d\f$-th dimension of
-  the vector space enclosing \p ph to \p m new space dimensions.
-*/
-int
-ppl_Polyhedron_expand_space_dimension PPL_PROTO((ppl_Polyhedron_t ph,
-						 ppl_dimension_type d,
-						 ppl_dimension_type m));
-
-/*! \brief
-  Modifies \p ph by \ref fold_space_dimensions "folding" the
-  space dimensions contained in the first \p n positions of the array \p ds
-  into dimension \p d.  The presence of duplicates in \p ds is a waste
-  but an innocuous one.
-*/
-int
-ppl_Polyhedron_fold_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
-						ppl_dimension_type ds[],
-						size_t n,
-						ppl_dimension_type d));
-
-/*@}*/ /* Functions Related to Polyhedra */
-
-
-/*! \name Functions Related to LP Problems */
-/*@{*/
-
-/*! \brief
-  Builds a trivial LP problem and writes a handle to it at address \p plp.
-*/
-int
-ppl_new_LP_Problem_trivial PPL_PROTO((ppl_LP_Problem_t* plp));
-
-/*! \brief
-  Builds an LP problem having feasible region \p cs, objective function
-  \p le and optimization mode \p m; writes a handle to it at address \p plp.
-*/
-int
-ppl_new_LP_Problem PPL_PROTO((ppl_LP_Problem_t* plp,
-			      ppl_const_Constraint_System_t cs,
-			      ppl_const_Linear_Expression_t le,
-			      int m));
-
-/*! \brief
-  Builds an LP problem that is a copy of \p lp; writes a handle
-  for the newly created system at address \p plp.
-*/
-int
-ppl_new_LP_Problem_from_LP_Problem
-PPL_PROTO((ppl_LP_Problem_t* plp, ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Invalidates the handle \p lp: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_LP_Problem PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Assigns a copy of the LP problem \p src to \p dst.
-*/
-int
-ppl_assign_LP_Problem_from_LP_Problem
-PPL_PROTO((ppl_LP_Problem_t dst, ppl_const_LP_Problem_t src));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p lp.
-*/
-int
-ppl_LP_Problem_space_dimension
-PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_dimension_type* m));
-
-/*! \brief
-  Writes a const handle to the constraint system defining the
-  feasible region of the LP problem \p lp at address \p pcs.
-*/
-int
-ppl_LP_Problem_constraints PPL_PROTO((ppl_const_LP_Problem_t lp,
-				      ppl_const_Constraint_System_t* pcs));
-
-/*! \brief
-  Writes a const handle to the linear expression defining the
-  objective function of the LP problem \p lp at address \p ple.
-*/
-int
-ppl_LP_Problem_objective_function
-PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Linear_Expression_t* ple));
-
-/*! \brief
-  Returns the optimization mode of the LP problem \p lp.
-*/
-int
-ppl_LP_Problem_optimization_mode PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Resets the LP problem to be a trivial problem of space dimension 0.
-*/
-int
-ppl_LP_Problem_clear PPL_PROTO((ppl_LP_Problem_t lp));
-
-/*! \brief
-  Modifies the feasible region of the LP problem \p lp by adding a copy
-  of the constraint \p c; the space dimension is increased, if necessary.
-*/
-int
-ppl_LP_Problem_add_constraint PPL_PROTO((ppl_LP_Problem_t lp,
-					 ppl_const_Constraint_t c));
-
-/*! \brief
-  Modifies the feasible region of the LP problem \p lp by adding a copy
-  of the constraints in \p cs; the space dimension is increased, if necessary.
-*/
-int
-ppl_LP_Problem_add_constraints PPL_PROTO((ppl_LP_Problem_t lp,
-					  ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Sets the objective function of the LP problem \p lp to a copy of \p le.
-*/
-int
-ppl_LP_Problem_set_objective_function
-PPL_PROTO((ppl_LP_Problem_t lp, ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Sets the optimization mode of the LP problem \p lp to \p mode.
-*/
-int
-ppl_LP_Problem_set_optimization_mode PPL_PROTO((ppl_LP_Problem_t lp,
-						int mode));
-
-/*! \brief
-  Returns a positive integer if \p lp is satisfiable; returns 0 otherwise.
-*/
-int
-ppl_LP_Problem_is_satisfiable PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Solves the LP problem \p lp, returning an exit status.
-
-  \return
-  <CODE>PPL_LP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the LP problem
-  is not satisfiable;
-  <CODE>PPL_LP_PROBLEM_STATUS_UNBOUNDED</CODE> if the LP problem
-  is satisfiable but there is no finite bound to the value of
-  the objective function;
-  <CODE>PPL_LP_PROBLEM_STATUS_OPTIMIZED</CODE> if the LP problem
-  admits an optimal solution.
-*/
-int
-ppl_LP_Problem_solve PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Evaluates the objective function of \p lp on point \p g.
-
-  \param lp
-  The LP problem defining the objective function;
-
-  \param g
-  The generator on which the objective function will be evaluated;
-
-  \param num
-  Will be assigned the numerator of the objective function value;
-
-  \param den
-  Will be assigned the denominator of the objective function value;
-*/
-int
-ppl_LP_Problem_evaluate_objective_function
-PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Generator_t g,
-	   ppl_Coefficient_t num, ppl_Coefficient_t den));
-
-/*! \brief
-  Writes a const handle to a feasible point for the LP problem \p lp
-  at address \p pg.
-*/
-int
-ppl_LP_Problem_feasible_point PPL_PROTO((ppl_const_LP_Problem_t lp,
-					 ppl_const_Generator_t* pg));
-
-/*! \brief
-  Writes a const handle to an optimizing point for the LP problem \p lp
-  at address \p pg.
-*/
-int
-ppl_LP_Problem_optimizing_point PPL_PROTO((ppl_const_LP_Problem_t lp,
-					   ppl_const_Generator_t* pg));
-
-/*! \brief
-  Returns the optimal value for \p lp.
-
-  \param lp
-  The LP problem;
-
-  \param num
-  Will be assigned the numerator of the optimal value;
-
-  \param den
-  Will be assigned the denominator of the optimal value.
-*/
-int
-ppl_LP_Problem_optimal_value
-PPL_PROTO((ppl_const_LP_Problem_t lp,
-	   ppl_Coefficient_t num, ppl_Coefficient_t den));
-
-/*! \brief
-  Returns a positive integer if \p lp is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p lp is broken.  Useful for debugging purposes.
-*/
-int
-ppl_LP_Problem_OK PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*@}*/ /* Functions Related to LP Problems */
-
-
-/*! \name Simple I/O Functions */
-/*@{*/
-
-/*! \brief Pretty-prints \p var to <CODE>stdout</CODE>. */
-int
-ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
-
-/*! \brief Pretty-prints \p var to the given output \p stream. */
-int
-ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
-
-#undef PPL_DECLARE_PRINT_FUNCTIONS
-
-#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
-/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
-int \
-ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
- \
-/*! \brief Prints \p x to the given output \p stream. */ \
-int \
-ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
-
-PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Linear_Expression)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Constraint)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Constraint_System)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Generator)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Generator_System)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Polyhedron)
-
-#undef PPL_DECLARE_PRINT_FUNCTIONS
-
-/*! \brief
-  The type of output functions used for printing variables.
-
-  An output function for variables must write a textual representation
-  for \p var to a character buffer, null-terminate it, and return a
-  pointer to the beginning of the buffer.  In case the operation fails,
-  0 should be returned and perhaps <CODE>errno</CODE> should be set
-  in a meaningful way.  The library does nothing with the buffer, besides
-  printing its contents.
-*/
-typedef const char*
-ppl_io_variable_output_function_type(ppl_dimension_type var);
-
-/*! \brief
-  Sets the output function to be used for printing variables to \p p.
-*/
-int
-ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
-
-/*! \brief
-  Writes a pointer to the current variable output function to \p pp.
-*/
-int
-ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
-
-/*@}*/ /* Simple I/O Functions */
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#undef PPL_PROTO
-
-/*@}*/ /* \defgroup PPL_C_interface */
-
-#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c.h.in b/interfaces/C/ppl_c.h.in
deleted file mode 100644
index ce466e7..0000000
--- a/interfaces/C/ppl_c.h.in
+++ /dev/null
@@ -1,2695 +0,0 @@
-/* Header file for the C interface.  -*- C -*-
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_ppl_c_h
-#define PPL_ppl_c_h 1
-
-/*! \defgroup PPL_C_interface C Language Interface
-
-\brief
-\ref CInterfaceDetails "Some details about the C Interface".
-
-\anchor CInterfaceDetails
-All the declarations needed for using the PPL's C interface
-(preprocessor symbols, data types, variables and
-functions) are collected in the header file <CODE>ppl_c.h</CODE>.
-This file, which is designed to work with pre-ANSI and ANSI C compilers
-as well as C99 and C++ compilers, should be included, either directly
-or via some other header file, with the directive
-\code
-#include <ppl_c.h>
-\endcode
-If this directive does not work, then your compiler is unable to find
-the file <CODE>ppl_c.h</CODE>. So check that the library is installed
-(if it is not installed, you may want to <CODE>make install</CODE>,
-perhaps with root privileges) in the right place
-(if not you may want to reconfigure the library using the appropriate
-pathname for the <CODE>--prefix</CODE> option); and that your compiler
-knows where it is installed (if not you should add the path to the
-directory where <CODE>ppl_c.h</CODE> is located to the compiler's
-include file search path; this is usually done with the
-<CODE>-I</CODE> option).
-
-The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
-preprocessor symbols, enumeration values and variables; and
-<CODE>ppl_*</CODE> for data types and function names. The interface
-systematically uses <EM>opaque data types</EM> (generic pointers that
-completely hide the internal representations from the client code) and
-provides all required access functions. By using just the interface,
-the client code can exploit all the functionalities of the library yet
-avoid directly manipulating the library's data structures.  The advantages
-are that (1) applications do not depend on the internals of the library
-(these may change from release to release), and (2) the interface
-invariants can be thoroughly checked (by the access functions).
-
-The PPL's C interface is initialized by means of the
-<CODE>ppl_initialize</CODE> function.  This function must
-be called <EM>before using any other interface of the library</EM>.
-The application can release the resources allocated by the library by
-calling the <CODE>ppl_finalize</CODE> function. After this function
-is called <EM>no other interface of the library may be used</EM>
-until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
-
-Any application using the PPL should make sure that only the
-intended version(s) of the library are ever used.  The version used can be
-checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
-PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
-give, respectively major, minor, revision and beta numbers of the PPL
-version.  This is an example of their use:
-\code
-#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
-# error "PPL version 0.6 or following is required"
-#endif
-\endcode
-Compile-time checking, however, is not normally enough, particularly in
-an environment where there is dynamic linking.  Run-time checking can
-be performed by means of the functions <CODE>ppl_version_major</CODE>,
-<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
-<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
-functions <CODE>ppl_version</CODE>, returning character string
-containing the full version number, and <CODE>ppl_banner</CODE>,
-returning a string that, in addition, provides (pointers to) other
-useful information for the library user.
-
-All programs using the PPL's C interface must link with the
-following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
-<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
-interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
-Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
-<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
-the compiler's or linker's command line.  For example:
-\verbatim
-gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
-\endverbatim
-If this does not work, it means that your compiler/linker is not
-finding the libraries where it expects.  Again, this could be because you
-forgot to install the library or you installed it in a non-standard
-location.  In the latter case you will need to use the appropriate
-options (usually <CODE>-L</CODE>) and, if you use shared libraries,
-some sort of run-time path selection mechanisms.  Consult your
-compiler's documentation for details.  Notice that the PPL is built
-using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
-an application can exploit this fact to significantly simplify the
-linking phase.  See Libtool's documentation for details.  Those
-working under Linux can find a lot of useful information on how to use
-program libraries (including static, shared, and dynamically loaded
-libraries) in the
-<A HREF="http://www.dwheeler.com/program-library/">Program Library
-HOWTO</A>.
-
-For examples on how to use the functions provided by the C interface,
-you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
-the source distribution.  It contains a <EM>Linear Programming</EM>
-solver written in C.  In order to use this solver you will need to install
-<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
-Programming Kit): this is used to read linear programs in MPS format.
-*/
-
-/*
-  For some reason, GMP up to and including version 4.1.3 requires
-  <stdio.h> to be included before <gmp.h>.
-*/
-/*@{*/ /* \defgroup PPL_C_interface */
-
-#include <stdio.h>
-#include <gmp.h>
-#include <stddef.h>
-
-/*
-  PPL_PROTO is a macro used to wrap function prototypes, so that
-  compilers that don't understand ANSI C prototypes still work, and
-  ANSI C compilers can issue warnings about type mismatches.
-*/
-#if defined(__STDC__)                              \
-  || defined(__cplusplus)                          \
-  || defined (_AIX)                                \
-  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
-  || defined(_WIN32)
-# define PPL_PROTO(protos) protos
-#else
-# define PPL_PROTO(protos) ()
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*! \brief
-  Defines the error codes that any function may return.
-*/
-enum ppl_enum_error_code {
-  /*! \hideinitializer
-    The virtual memory available to the process has been exhausted. */
-  PPL_ERROR_OUT_OF_MEMORY = -2,
-  /*! \hideinitializer
-    A function has been invoked with an invalid argument. */
-  PPL_ERROR_INVALID_ARGUMENT = -3,
-  /*! \hideinitializer
-    A function has been invoked outside its domain of definition. */
-  PPL_ERROR_DOMAIN_ERROR = -4,
-  /*! \hideinitializer
-    The construction of an object that would exceed its maximum
-    permitted size was attempted. */
-  PPL_ERROR_LENGTH_ERROR = -5,
-  /*! \hideinitializer
-    An arithmetic overflow occurred and the computation was consequently
-    interrupted.  This can <EM>only</EM> happen in library's incarnations
-    using bounded integers as coefficients. */
-  PPL_ARITHMETIC_OVERFLOW = -6,
-  /*! \hideinitializer
-    An error occurred during a C input/output operation.  A more
-    precise indication of what went wrong is available via
-    <CODE>errno</CODE>. */
-  PPL_STDIO_ERROR = -7,
-  /*! \hideinitializer
-    An internal error that was diagnosed by the PPL itself.
-    This indicates a bug in the PPL. */
-  PPL_ERROR_INTERNAL_ERROR = -8,
-  /*! \hideinitializer
-    A standard exception has been raised by the C++ run-time environment.
-    This indicates a bug in the PPL. */
-  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
-  /*! \hideinitializer
-    A totally unknown, totally unexpected error happened.
-    This indicates a bug in the PPL. */
-  PPL_ERROR_UNEXPECTED_ERROR = -10
-};
-
-/*! \name Version Checking */
-/*@{*/
-
-/*! \brief
-  The major number of the PPL version.
-*/
-#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
-
-/*! \brief
-  The minor number of the PPL version.
-*/
-#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
-
-/*! \brief
-  The revision number of the PPL version.
-*/
-#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
-
-/*! \brief
-  The beta number of the PPL version.  This is zero for official
-  releases and nonzero for development snapshots.
-*/
-#define PPL_VERSION_BETA @PPL_VERSION_BETA@
-
-/*! \brief
-  A string containing the PPL version.
-
-  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
-  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
-  format of PPL_VERSION is <CODE>M "." m</CODE> if both
-  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
-  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
-  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
-  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
-  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
-  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
-*/
-#define PPL_VERSION "@VERSION@"
-
-/*! \brief
-  Returns the major number of the PPL version.
-*/
-int
-ppl_version_major PPL_PROTO((void));
-
-/*! \brief
-  Returns the minor number of the PPL version.
-*/
-int
-ppl_version_minor PPL_PROTO((void));
-
-/*! \brief
-  Returns the revision number of the PPL version.
-*/
-int
-ppl_version_revision PPL_PROTO((void));
-
-/*! \brief
-  Returns the beta number of the PPL version.
-*/
-int
-ppl_version_beta PPL_PROTO((void));
-
-/*! \brief
-  Writes to \c *p a pointer to a character string containing the
-  PPL version.
-*/
-int
-ppl_version PPL_PROTO((const char** p));
-
-/*! \brief
-  Writes to \c *p a pointer to a character string containing the PPL banner.
-
-  The banner provides information about the PPL version, the licensing,
-  the lack of any warranty whatsoever, the C++ compiler used to build
-  the library, where to report bugs and where to look for further
-  information.
-*/
-int
-ppl_banner PPL_PROTO((const char** p));
-
-/*@}*/ /* Version Checking */
-
-/*! \brief
-  An unsigned integral type for representing space dimensions.
-*/
-typedef size_t ppl_dimension_type;
-
-/*! \name Initialization, Error Handling and Auxiliary Functions */
-/*@{*/
-
-/*! \brief
-  Writes to \p m the maximum space dimension this library can handle.
-*/
-int
-ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
-
-/*! \brief
-  Writes to \p m a value that does not designate a valid dimension.
-*/
-int
-ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
-
-/*! \brief
-  Initializes the Parma Polyhedra Library.
-  This function must be called before any other function.
-
-  \return
-  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
-  was already initialized.
-*/
-int
-ppl_initialize PPL_PROTO((void));
-
-/*! \brief
-  Finalizes the Parma Polyhedra Library.
-  This function must be called after any other function.
-
-  \return
-  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
-  was already finalized.
-*/
-int
-ppl_finalize PPL_PROTO((void));
-
-/*! \brief
-  Installs the user-defined error handler pointed at by \p h.
-
-  The error handler takes an error code and a textual description that
-  gives further information about the actual error.  The C string
-  containing the textual description is read-only and its existence is
-  not guaranteed after the handler has returned.
-*/
-int
-ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
-					   const char* description)));
-
-/*@}*/ /* Initialization, Error Handling and Auxiliary Functions */
-
-#undef PPL_TYPE_DECLARATION
-
-#define PPL_TYPE_DECLARATION(Type) /*! \brief Opaque pointer. */ typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t; /*! \brief Opaque pointer to const object. */ typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
-
-PPL_TYPE_DECLARATION(Coefficient);
-
-PPL_TYPE_DECLARATION(Linear_Expression);
-
-PPL_TYPE_DECLARATION(Constraint);
-
-PPL_TYPE_DECLARATION(Constraint_System);
-
-PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
-
-PPL_TYPE_DECLARATION(Generator);
-
-PPL_TYPE_DECLARATION(Generator_System);
-
-PPL_TYPE_DECLARATION(Generator_System_const_iterator);
-
-PPL_TYPE_DECLARATION(Polyhedron);
-
-PPL_TYPE_DECLARATION(LP_Problem);
-
-#undef PPL_TYPE_DECLARATION
-
-/*! \name Functions Related to Coefficients */
-/*@{*/
-
-/*! \brief
-  Creates a new coefficient with value 0 and writes a handle for the
-  newly created coefficient at address \p pc.
-*/
-int
-ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
-
-/*! \brief
-  Creates a new coefficient with the value given by the GMP integer
-  \p z and writes a handle for the newly created coefficient
-  at address \p pc.
-*/
-int
-ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
-
-/*! \brief
-  Builds a coefficient that is a copy of \p c; writes a handle
-  for the newly created coefficient at address \p pc.
-*/
-int
-ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
-						ppl_const_Coefficient_t c));
-
-/*! \brief
-  Assign to \p dst the value given by the GMP integer \p z.
-*/
-int
-ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
-
-/*! \brief
-  Assigns a copy of the coefficient \p src to \p dst.
-*/
-int
-ppl_assign_Coefficient_from_Coefficient
-PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
-
-/*! \brief
-  Invalidates the handle \p c: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
-
-/*! \brief
-  Sets the value of the GMP integer \p z to the value of \p c.
-*/
-int
-ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
-
-/*! \brief
-  Returns a positive integer if \p c is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p c is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
-
-/*! \brief
-  Returns a positive integer if coefficients are bounded; returns 0
-  otherwise.
-*/
-int
-ppl_Coefficient_is_bounded PPL_PROTO((void));
-
-/*! \brief
-  Returns a positive integer if coefficients are bounded, in which case
-  \p min is set to their minimum value; returns 0 otherwise.
-*/
-int
-ppl_Coefficient_min PPL_PROTO((mpz_t min));
-
-/*! \brief
-  Returns a positive integer if coefficients are bounded, in which case
-  \p max is set to their maximum value; returns 0 otherwise.
-*/
-int
-ppl_Coefficient_max PPL_PROTO((mpz_t max));
-
-/*@}*/ /* Functions Related to Coefficients */
-
-/*! \name Functions Related to Linear Expressions */
-/*@{*/
-
-/*! \brief
-  Creates a new linear expression corresponding to the constant 0 in a
-  zero-dimensional space; writes a handle for the new linear
-  expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
-
-/*! \brief
-  Creates a new linear expression corresponding to the constant 0 in a
-  <TT>d</TT>-dimensional space; writes a handle for the new linear
-  expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_with_dimension
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
-
-/*! \brief
-  Builds a linear expression that is a copy of \p le; writes a handle
-  for the newly created linear expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_from_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Builds a linear expression corresponding to constraint \p c;
-  writes a handle for the newly created linear expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_from_Constraint
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
-
-/*! \brief
-  Builds a linear expression corresponding to generator \p g;
-  writes a handle for the newly created linear expression at address \p ple.
-*/
-int
-ppl_new_Linear_Expression_from_Generator
-PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
-
-/*! \brief
-  Invalidates the handle \p le: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Assigns a copy of the linear expression \p src to \p dst.
-*/
-int
-ppl_assign_Linear_Expression_from_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
-
-/*! \brief
-  Adds \p n to the coefficient of variable \p var in the linear
-  expression \p le.  The space dimension is set to be the maximum
-  between \p var + 1 and the old space dimension.
-*/
-int
-ppl_Linear_Expression_add_to_coefficient
-PPL_PROTO((ppl_Linear_Expression_t le,
-	   ppl_dimension_type var,
-	   ppl_const_Coefficient_t n));
-
-/*! \brief
-  Adds \p n to the inhomogeneous term of the linear expression
-  \p le.
-*/
-int
-ppl_Linear_Expression_add_to_inhomogeneous
-PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
-
-/*! \brief
-  Adds the linear expression \p src to \p dst.
-*/
-int
-ppl_add_Linear_Expression_to_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
-
-/*! \brief
-  Subtracts the linear expression \p src from \p dst.
-*/
-int
-ppl_subtract_Linear_Expression_from_Linear_Expression
-PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
-
-/*! \brief
-  Multiply the linear expression \p dst by \p n.
-*/
-int
-ppl_multiply_Linear_Expression_by_Coefficient
-PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
-
-/*! \brief
-  Writes to \p m the space dimension of \p le.
-*/
-int
-ppl_Linear_Expression_space_dimension
-PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
-
-/*! \brief
-  Copies into \p n the coefficient of variable \p var in
-  the linear expression \p le.
-*/
-int
-ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
-					     ppl_dimension_type var,
-					     ppl_Coefficient_t n));
-
-/*! \brief
-  Copies into \p n the inhomogeneous term of linear expression \p le.
-*/
-int
-ppl_Linear_Expression_inhomogeneous_term
-PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
-
-/*! \brief
-  Returns a positive integer if \p le is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p le is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
-
-/*@}*/ /* Functions Related to Linear Expressions */
-
-/*! \brief
-  Describes the relations represented by a constraint.
-*/
-enum ppl_enum_Constraint_Type {
-  /*! The constraint is of the form \f$e < 0\f$. */
-  PPL_CONSTRAINT_TYPE_LESS_THAN,
-  /*! The constraint is of the form \f$e \leq 0\f$. */
-  PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL,
-  /*! The constraint is of the form \f$e = 0\f$. */
-  PPL_CONSTRAINT_TYPE_EQUAL,
-  /*! The constraint is of the form \f$e \geq 0\f$. */
-  PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL,
-  /*! The constraint is of the form \f$e > 0\f$. */
-  PPL_CONSTRAINT_TYPE_GREATER_THAN
-};
-
-
-/*! \name Functions Related to Constraints */
-/*@{*/
-
-/*! \brief
-  Creates the new constraint `\p le \p rel 0' and writes a handle for
-  it at address \p pc.  The space dimension of the new constraint is
-  equal to the space dimension of \p le.
-*/
-int
-ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
-			      ppl_const_Linear_Expression_t le,
-			      enum ppl_enum_Constraint_Type rel));
-
-/*! \brief
-  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
-  and writes a handle for it at address \p pc.
-*/
-int
-ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
-
-/*! \brief
-  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
-  also known as <EM>positivity constraint</EM>.
-  A handle for the newly created constraint is written at address \p pc.
-*/
-int
-ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
-
-/*! \brief
-  Builds a constraint that is a copy of \p c; writes a handle
-  for the newly created constraint at address \p pc.
-*/
-int
-ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
-					      ppl_const_Constraint_t c));
-
-/*! \brief
-  Invalidates the handle \p c: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
-
-/*! \brief
-  Assigns a copy of the constraint \p src to \p dst.
-*/
-int
-ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
-						 ppl_const_Constraint_t src));
-
-/*! \brief
-  Writes to \p m the space dimension of \p c.
-*/
-int
-ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
-					  ppl_dimension_type* m));
-
-/*! \brief
-  Returns the type of constraint \p c.
-*/
-int
-ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
-
-/*! \brief
-  Copies into \p n the coefficient of variable \p var in
-  constraint \p c.
-*/
-int
-ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
-				      ppl_dimension_type var,
-				      ppl_Coefficient_t n));
-
-/*! \brief
-  Copies into \p n the inhomogeneous term of constraint \p c.
-*/
-int
-ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
-					     ppl_Coefficient_t n));
-
-/*! \brief
-  Returns a positive integer if \p c is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p c is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
-
-/*@}*/ /* Functions Related to Constraints */
-
-/*! \name Functions Related to Constraint Systems */
-/*@{*/
-
-/*! \brief
-  Builds an empty system of constraints and writes a handle to it at
-  address \p pcs.
-*/
-int
-ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
-
-/*! \brief
-  Builds a zero-dimensional, unsatisfiable constraint system and
-  writes a handle to it at address \p pcs.
-*/
-int
-ppl_new_Constraint_System_zero_dim_empty
-PPL_PROTO((ppl_Constraint_System_t* pcs));
-
-/*! \brief
-  Builds the singleton constraint system containing only a copy of
-  constraint \p c; writes a handle for the newly created system at
-  address \p pcs.
-*/
-int
-ppl_new_Constraint_System_from_Constraint
-PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
-
-/*! \brief
-  Builds a constraint system that is a copy of \p cs; writes a handle
-  for the newly created system at address \p pcs.
-*/
-int
-ppl_new_Constraint_System_from_Constraint_System
-PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Invalidates the handle \p cs: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Assigns a copy of the constraint system \p src to \p dst.
-*/
-int
-ppl_assign_Constraint_System_from_Constraint_System
-PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p cs.
-*/
-int
-ppl_Constraint_System_space_dimension
-PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
-
-/*! \brief
-  Returns a positive integer if \p cs contains any (non-trivial) strict
-  inequality; returns 0 otherwise.
-*/
-int
-ppl_Constraint_System_has_strict_inequalities
-PPL_PROTO((ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Removes all the constraints from the constraint system \p cs
-  and sets its space dimension to 0.
-*/
-int
-ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
-
-/*! \brief
-  Inserts a copy of the constraint \p c into \p cs; the space
-  dimension is increased, if necessary.
-*/
-int
-ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
-						   ppl_const_Constraint_t c));
-
-/*! \brief
-  Returns a positive integer if \p cs is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p cs is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t c));
-
-
-/*! \brief
-  Builds a new `const iterator' and writes a handle to it at address
-  \p pcit.
-*/
-int
-ppl_new_Constraint_System_const_iterator
-PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
-
-/*! \brief
-  Builds a const iterator that is a copy of \p cit; writes an
-  handle for the newly created const iterator at address \p pcit.
-*/
-int
-ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
-PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
-	   ppl_const_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Invalidates the handle \p cit: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Constraint_System_const_iterator
-PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Assigns a copy of the const iterator \p src to \p dst.
-*/
-int
-ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
-PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
-	   ppl_const_Constraint_System_const_iterator_t src));
-
-/*! \brief
-  Assigns to \p cit a const iterator "pointing" to the beginning of
-  the constraint system \p cs.
-*/
-int
-ppl_Constraint_System_begin
-PPL_PROTO((ppl_const_Constraint_System_t cs,
-	   ppl_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Assigns to \p cit a const iterator "pointing" past the end of the
-  constraint system \p cs.
-*/
-int
-ppl_Constraint_System_end
-PPL_PROTO((ppl_const_Constraint_System_t cs,
-	   ppl_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Dereference \p cit writing a const handle to the resulting
-  constraint at address \p pc.
-*/
-int
-ppl_Constraint_System_const_iterator_dereference
-PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
-	   ppl_const_Constraint_t* pc));
-
-/*! \brief
-  Increment \p cit so that it "points" to the next constraint.
-*/
-int
-ppl_Constraint_System_const_iterator_increment
-PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
-
-/*! \brief
-  Returns a positive integer if the iterators corresponding to \p x and
-  \p y are equal; returns 0 if they are different.
-*/
-int
-ppl_Constraint_System_const_iterator_equal_test
-PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
-	   ppl_const_Constraint_System_const_iterator_t y));
-
-/*@}*/ /* Functions Related to Constraint Systems */
-
-/*! \brief
-  Describes the different kinds of generators.
-*/
-enum ppl_enum_Generator_Type {
-  /*! The generator is a line. */
-  PPL_GENERATOR_TYPE_LINE,
-  /*! The generator is a ray. */
-  PPL_GENERATOR_TYPE_RAY,
-  /*! The generator is a point. */
-  PPL_GENERATOR_TYPE_POINT,
-  /*! The generator is a closure point. */
-  PPL_GENERATOR_TYPE_CLOSURE_POINT
-};
-
-
-/*! \name Functions Related to Generators */
-/*@{*/
-
-/*! \brief
-  Creates a new generator of direction \p le and type \p t.  If the
-  generator to be created is a point or a closure point, the divisor
-  \p d is applied to \p le.  For other types of generators \p d is
-  simply disregarded.  A handle for the new generator is written at
-  address \p pg.  The space dimension of the new generator is equal to
-  the space dimension of \p le.
-*/
-int
-ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
-			     ppl_const_Linear_Expression_t le,
-			     enum ppl_enum_Generator_Type t,
-			     ppl_const_Coefficient_t d));
-
-/*! \brief
-  Creates the point that is the origin of the zero-dimensional space
-  \f$\Rset^0\f$.  Writes a handle for the new generator at address
-  \p pg.
-*/
-int
-ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
-
-/*! \brief
-  Creates, as a closure point, the point that is the origin of the
-  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
-  generator at address \p pg.
-*/
-int
-ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
-
-/*! \brief
-  Builds a generator that is a copy of \p g; writes a handle
-  for the newly created generator at address \p pg.
-*/
-int
-ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
-					    ppl_const_Generator_t g));
-
-/*! \brief
-  Invalidates the handle \p g: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
-
-/*! \brief
-  Assigns a copy of the generator \p src to \p dst.
-*/
-int
-ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
-					       ppl_const_Generator_t src));
-
-/*! \brief
-  Writes to \p m the space dimension of \p g.
-*/
-int
-ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
-					 ppl_dimension_type* m));
-
-/*! \brief
-  Returns the type of generator \p g.
-*/
-int
-ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
-
-/*! \brief
-  Copies into \p n the coefficient of variable \p var in
-  generator \p g.
-*/
-int
-ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
-				     ppl_dimension_type var,
-				     ppl_Coefficient_t n));
-
-/*! \brief
-  If \p g is a point or a closure point assigns its divisor to \p n.
-*/
-int
-ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
-				 ppl_Coefficient_t n));
-
-/*! \brief
-  Returns a positive integer if \p g is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p g is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
-
-/*@}*/ /* Functions Related to Generators */
-
-/*! \name Functions Related to Generator Systems */
-/*@{*/
-
-/*! \brief
-  Builds an empty system of generators and writes a handle to it at
-  address \p pgs.
-*/
-int
-ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
-
-/*
-  Creates the universe zero-dimensional system of generators (i.e.,
-  containing the origin only).  Writes a handle to the new system at
-  address \p pgs.
-*/
-int
-ppl_new_Generator_System_zero_dim_univ
-PPL_PROTO((ppl_Generator_System_t* pgs));
-
-/*! \brief
-  Builds the singleton generator system containing only a copy of
-  generator \p g; writes a handle for the newly created system at
-  address \p pgs.
-*/
-int
-ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
-						   ppl_const_Generator_t g));
-
-/*! \brief
-  Builds a generator system that is a copy of \p gs; writes a handle
-  for the newly created system at address \p pgs.
-*/
-int
-ppl_new_Generator_System_from_Generator_System
-PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Invalidates the handle \p gs: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Assigns a copy of the generator system \p src to \p dst.
-*/
-int
-ppl_assign_Generator_System_from_Generator_System
-PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p gs.
-*/
-int
-ppl_Generator_System_space_dimension
-PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
-
-/*! \brief
-  Removes all the generators from the generator system \p gs
-  and sets its space dimension to 0.
-*/
-int
-ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
-
-/*! \brief
-  Inserts a copy of the generator \p g into \p gs; the space
-  dimension is increased, if necessary.
-*/
-int
-ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
-						 ppl_const_Generator_t g));
-
-/*! \brief
-  Returns a positive integer if \p gs is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p gs is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t c));
-
-
-/*! \brief
-  Builds a new `const iterator' and writes a handle to it at address
-  \p pgit.
-*/
-int
-ppl_new_Generator_System_const_iterator
-PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
-
-/*! \brief
-  Builds a const iterator that is a copy of \p git; writes an
-  handle for the newly created const iterator at address \p pgit.
-*/
-int
-ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
-PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
-	   ppl_const_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Invalidates the handle \p git: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Generator_System_const_iterator
-PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Assigns a copy of the const iterator \p src to \p dst.
-*/
-int
-ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
-PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
-	   ppl_const_Generator_System_const_iterator_t src));
-
-/*! \brief
-  Assigns to \p git a const iterator "pointing" to the beginning of
-  the generator system \p gs.
-*/
-int
-ppl_Generator_System_begin
-PPL_PROTO((ppl_const_Generator_System_t gs,
-	   ppl_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Assigns to \p git a const iterator "pointing" past the end of the
-  generator system \p gs.
-*/
-int
-ppl_Generator_System_end
-PPL_PROTO((ppl_const_Generator_System_t gs,
-	   ppl_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Dereference \p git writing a const handle to the resulting
-  generator at address \p pg.
-*/
-int
-ppl_Generator_System_const_iterator_dereference
-PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
-	   ppl_const_Generator_t* pg));
-
-/*! \brief
-  Increment \p git so that it "points" to the next generator.
-*/
-int
-ppl_Generator_System_const_iterator_increment
-PPL_PROTO((ppl_Generator_System_const_iterator_t git));
-
-/*! \brief
-  Returns a positive integer if the iterators corresponding to \p x and
-  \p y are equal; returns 0 if they are different.
-*/
-int
-ppl_Generator_System_const_iterator_equal_test
-PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
-	   ppl_const_Generator_System_const_iterator_t y));
-
-/*@}*/ /* Functions Related to Generator Systems */
-
-/*! \brief
-  Code of the worst-case polynomial complexity class.
-*/
-extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
-
-/*! \brief
-  Code of the worst-case exponential but typically polynomial
-  complexity class.
-*/
-extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
-
-/*! \brief
-  Code of the universal complexity class.
-*/
-extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
-
-/*! \brief
-  Code of the "unfeasible LP problem" status.
-*/
-extern int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
-
-/*! \brief
-  Code of the "unbounded LP problem" status.
-*/
-extern int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
-
-/*! \brief
-  Code of the "optimized LP problem" status.
-*/
-extern int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
-
-/*! \brief
-  Code of the "maximization" optimization mode.
-*/
-extern int PPL_LP_PROBLEM_MAXIMIZATION;
-
-/*! \brief
-  Code of the "minimization" optimization mode.
-*/
-extern int PPL_LP_PROBLEM_MINIMIZATION;
-
-/*! \brief
-  Individual bit saying that the polyhedron and the set of points
-  satisfying the constraint are disjoint.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
-
-/*! \brief
-  Individual bit saying that the polyhedron intersects the set of
-  points satisfying the constraint, but it is not included in it.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
-
-/*! \brief
-  Individual bit saying that the polyhedron is included in the set of
-  points satisfying the constraint.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
-
-/*! \brief
-  Individual bit saying that the polyhedron is included in the set of
-  points saturating the constraint.
-*/
-extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
-
-/*! \brief
-  Individual bit saying that adding the generator would not change the
-  polyhedron.
-*/
-extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
-
-/*! \name Functions Related to Polyhedra */
-/*@{*/
-
-/*! \brief
-  Builds a universe C polyhedron of dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-					       ppl_dimension_type d));
-
-/*! \brief
-  Builds a universe NNC polyhedron of dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-						 ppl_dimension_type d));
-
-/*! \brief
-  Builds an empty C polyhedron of space dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-						     ppl_dimension_type d));
-
-/*! \brief
-  Builds an empty NNC polyhedron of space dimension \p d and writes an
-  handle to it at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
-						       ppl_dimension_type d));
-
-/*! \brief
-  Builds a C polyhedron that is a copy of \p ph; writes a handle
-  for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_from_C_Polyhedron PPL_PROTO((ppl_Polyhedron_t* pph,
-						  ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds a C polyhedron that is a copy of of the NNC polyhedron \p ph;
-  writes a handle for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_C_Polyhedron_from_NNC_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
-  writes a handle for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_from_C_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds an NNC polyhedron that is a copy of \p ph; writes a handle
-  for the newly created polyhedron at address \p pph.
-*/
-int
-ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Builds a new C polyhedron from the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p cs.
-*/
-int
-ppl_new_C_Polyhedron_from_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new C polyhedron recycling the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p cs will be <EM>the</EM> system of constraints of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_C_Polyhedron_recycle_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new NNC polyhedron from the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p cs.
-*/
-int
-ppl_new_NNC_Polyhedron_from_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new NNC polyhedron recycling the system of constraints
-  \p cs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p cs will be <EM>the</EM> system of constraints of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_NNC_Polyhedron_recycle_Constraint_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Builds a new C polyhedron from the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p gs.
-*/
-int
-ppl_new_C_Polyhedron_from_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Builds a new C polyhedron recycling the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p gs will be <EM>the</EM> system of generators of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_C_Polyhedron_recycle_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
-
-/*! \brief
-  Builds a new NNC polyhedron from the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  The new polyhedron will inherit the space dimension of \p gs.
-*/
-int
-ppl_new_NNC_Polyhedron_from_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Builds a new NNC polyhedron recycling the system of generators
-  \p gs and writes a handle for the newly created polyhedron at
-  address \p pph.
-
-  Since \p gs will be <EM>the</EM> system of generators of the new
-  polyhedron, the space dimension is also inherited.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_new_NNC_Polyhedron_recycle_Generator_System
-PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
-
-/*! \brief
-  Builds a new C polyhedron corresponding to an interval-based
-  bounding box, writing a handle for the newly created polyhedron at
-  address \p pph.
-
-  If an interval of the bounding box is provided with any finite
-  but open bound, then the polyhedron is not built and the value
-  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
-  The bounding box is accessed by using the following functions,
-  passed as arguments:
-    \code
-      ppl_dimension_type space_dimension()
-    \endcode
-    returns the dimension of the vector space enclosing the polyhedron
-    represented by the bounding box.
-    \code
-      int is_empty()
-    \endcode
-    returns 0 if and only if the bounding box describes a non-empty set.
-    The function <CODE>is_empty()</CODE> will always be called before the
-    other functions. However, if <CODE>is_empty()</CODE> does not
-    return 0, none of the functions below will be called.
-    \code
-      int get_lower_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    lower boundary of \f$I\f$ is open and is set to a value different
-    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
-    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
-    fraction \f$n/d\f$ corresponds to the greatest lower bound of
-    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
-    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
-    positive, \f$0/1\f$ being the unique representation for zero.
-    \code
-      int get_upper_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    upper boundary of \f$I\f$ is open and is set to a value different
-    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
-    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
-    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
-*/
-int
-ppl_new_C_Polyhedron_from_bounding_box
-PPL_PROTO((ppl_Polyhedron_t* pph,
-	   ppl_dimension_type (*space_dimension)(void),
-	   int (*is_empty)(void),
-	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d),
-	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d)));
-
-/*! \brief
-  Builds a new NNC polyhedron corresponding to an interval-based
-  bounding box, writing a handle for the newly created polyhedron at
-  address \p pph.
-
-  The bounding box is accessed by using the following functions,
-  passed as arguments:
-    \code
-      ppl_dimension_type space_dimension()
-    \endcode
-    returns the dimension of the vector space enclosing the polyhedron
-    represented by the bounding box.
-    \code
-      int is_empty()
-    \endcode
-    returns 0 if and only if the bounding box describes a non-empty set.
-    The function <CODE>is_empty()</CODE> will always be called before the
-    other functions. However, if <CODE>is_empty()</CODE> does not
-    return 0, none of the functions below will be called.
-    \code
-      int get_lower_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    lower boundary of \f$I\f$ is open and is set to a value different
-    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
-    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
-    fraction \f$n/d\f$ corresponds to the greatest lower bound of
-    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
-    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
-    positive, \f$0/1\f$ being the unique representation for zero.
-    \code
-      int get_upper_bound(ppl_dimension_type k, int closed,
-                          ppl_Coefficient_t n, ppl_Coefficient_t d)
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
-    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
-    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
-    upper boundary of \f$I\f$ is open and is set to a value different
-    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
-    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
-    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
-*/
-int
-ppl_new_NNC_Polyhedron_from_bounding_box
-PPL_PROTO((ppl_Polyhedron_t* pph,
-	   ppl_dimension_type (*space_dimension)(void),
-	   int (*is_empty)(void),
-	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d),
-	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
-				  ppl_Coefficient_t n,
-				  ppl_Coefficient_t d)));
-
-/*! \brief
-  Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
-*/
-int
-ppl_assign_C_Polyhedron_from_C_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
-
-/*! \brief
-  Assigns a copy of the NNC polyhedron \p src to the NNC
-  polyhedron \p dst.
-*/
-int
-ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
-PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
-
-/*! \brief
-  Invalidates the handle \p ph: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p ph.
-*/
-int
-ppl_Polyhedron_space_dimension PPL_PROTO((ppl_const_Polyhedron_t ph,
-					  ppl_dimension_type* m));
-
-/*! \brief
-  Writes to \p m the affine dimension of \p ph (not to be confused with the
-  dimension of its enclosing vector space) or 0, if \p ph is empty.
-*/
-int
-ppl_Polyhedron_affine_dimension PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Writes a const handle to the constraint system defining the
-  polyhedron \p ph at address \p pcs.
-*/
-int
-ppl_Polyhedron_constraints PPL_PROTO((ppl_const_Polyhedron_t ph,
-				      ppl_const_Constraint_System_t* pcs));
-
-/*! \brief
-  Writes a const handle to the minimized constraint system defining the
-  polyhedron \p ph at address \p pcs.
-*/
-int
-ppl_Polyhedron_minimized_constraints
-PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs));
-
-/*! \brief
-  Writes a const handle to the generator system defining the
-  polyhedron \p ph at address \p pgs.
-*/
-int
-ppl_Polyhedron_generators PPL_PROTO((ppl_const_Polyhedron_t ph,
-				     ppl_const_Generator_System_t* pgs));
-
-/*! \brief
-  Writes a const handle to the minimized generator system defining the
-  polyhedron \p ph at address \p pgs.
-*/
-int
-ppl_Polyhedron_minimized_generators
-PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs));
-
-/*! \brief
-  Checks the relation between the polyhedron \p ph and the constraint \p c.
-
-  If successful, returns a non-negative integer that is
-  obtained as the bitwise or of the bits (chosen among
-  PPL_POLY_CON_RELATION_IS_DISJOINT
-  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
-  PPL_POLY_CON_RELATION_IS_INCLUDED, and
-  PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
-  \p ph and \p c.
-*/
-int
-ppl_Polyhedron_relation_with_Constraint PPL_PROTO((ppl_const_Polyhedron_t ph,
-						   ppl_const_Constraint_t c));
-
-/*! \brief
-  Checks the relation between the polyhedron \p ph and the generator \p g.
-
-  If successful, returns a non-negative integer that is
-  obtained as the bitwise or of the bits (only
-  PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
-  relation between \p ph and \p g.
-*/
-int
-ppl_Polyhedron_relation_with_Generator PPL_PROTO((ppl_const_Polyhedron_t ph,
-						  ppl_const_Generator_t g));
-
-/*! \brief
-  Use \p ph to shrink a generic, interval-based bounding box.
-  The bounding box is abstractly provided by means of the parameters.
-
-  \param ph
-  The polyhedron that is used to shrink the bounding box;
-
-  \param complexity
-  The code of the complexity class of the algorithm to be used.
-  Must be one of PPL_COMPLEXITY_CLASS_POLYNOMIAL,
-  PPL_COMPLEXITY_CLASS_SIMPLEX, or PPL_COMPLEXITY_CLASS_ANY;
-
-  \param set_empty
-  A pointer to a void function with no arguments that causes the bounding
-  box to become empty, i.e., to represent the empty set;
-
-  \param raise_lower_bound
-  A pointer to a void function with arguments
-  <CODE>(ppl_dimension_type k, int closed,
-         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
-  that intersects the interval corresponding to the <CODE>k</CODE>-th
-  space dimension with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is non-zero,
-  with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is zero.
-  The fraction \f$n/d\f$ is in canonical form, that is, \f$n\f$
-  and \f$d\f$ have no common factors and \f$d\f$ is positive, \f$0/1\f$
-  being the unique representation for zero;
-
-  \param lower_upper_bound
-  a pointer to a void function with argument
-  <CODE>(ppl_dimension_type k, int closed,
-         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
-  that intersects the interval corresponding to the <CODE>k</CODE>-th
-  space dimension with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is non-zero,
-  with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE> is zero.
-  The fraction \f$n/d\f$ is in canonical form.
-*/
-int
-ppl_Polyhedron_shrink_bounding_box
-PPL_PROTO((ppl_const_Polyhedron_t ph,
-	   unsigned int complexity,
-	   void (*set_empty)(void),
-	   void (*raise_lower_bound)(ppl_dimension_type k, int closed,
-				     ppl_const_Coefficient_t n,
-				     ppl_const_Coefficient_t d),
-	   void (*lower_upper_bound)(ppl_dimension_type k, int closed,
-				     ppl_const_Coefficient_t n,
-				     ppl_const_Coefficient_t d)));
-
-/*! \brief
-  Returns a positive integer if \p ph is empty; returns 0 if \p ph is
-  not empty.
-*/
-int
-ppl_Polyhedron_is_empty PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p ph is a universe polyhedron;
-  returns 0 if it is not.
-*/
-int
-ppl_Polyhedron_is_universe PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
-  unbounded.
-*/
-int
-ppl_Polyhedron_is_bounded PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p le is bounded from above in \p ph;
-  returns 0 otherwise.
-*/
-int
-ppl_Polyhedron_bounds_from_above PPL_PROTO((ppl_const_Polyhedron_t ph,
-					    ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Returns a positive integer if \p le is bounded from below in \p ph;
-  returns 0 otherwise.
-*/
-int
-ppl_Polyhedron_bounds_from_below PPL_PROTO((ppl_const_Polyhedron_t ph,
-					    ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Returns a positive integer if \p ph is not empty
-  and \p le is bounded from above in \p ph, in which case
-  the supremum value and a point where \p le reaches it are computed.
-
-  \param ph
-  The polyhedron constraining \p le;
-
-  \param le
-  The linear expression to be maximized subject to \p ph;
-
-  \param sup_n
-  Will be assigned the numerator of the supremum value;
-
-  \param sup_d
-  Will be assigned the denominator of the supremum value;
-
-  \param pmaximum
-  Will store 1 in this location if the supremum is also the maximum,
-  will store 0 otherwise;
-
-  \param point
-  Will be assigned the point or closure point where \p le reaches the
-  extremum value.
-
-  If \p ph is empty or \p le is not bounded from above,
-  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
-  will be left untouched.
-*/
-int
-ppl_Polyhedron_maximize PPL_PROTO((ppl_const_Polyhedron_t ph,
-				   ppl_const_Linear_Expression_t le,
-				   ppl_Coefficient_t sup_n,
-				   ppl_Coefficient_t sup_d,
-				   int* pmaximum,
-				   ppl_Generator_t point));
-
-/*! \brief
-  Returns a positive integer if  \p ph is not empty
-  and \p le is bounded from below in \p ph, in which case
-  the infimum value and a point where \p le reaches it are computed.
-
-  \param ph
-  The polyhedron constraining \p le;
-
-  \param le
-  The linear expression to be minimized subject to \p ph;
-
-  \param inf_n
-  Will be assigned the numerator of the infimum value;
-
-  \param inf_d
-  Will be assigned the denominator of the infimum value;
-
-  \param pminimum
-  Will store 1 in this location if the infimum is also the minimum,
-  will store 0 otherwise;
-
-  \param point
-  Will be assigned the point or closure point where \p le reaches the
-  extremum value.
-
-  If \p ph is empty or \p le is not bounded from below,
-  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
-  will be left untouched.
-*/
-int
-ppl_Polyhedron_minimize PPL_PROTO((ppl_const_Polyhedron_t ph,
-				   ppl_const_Linear_Expression_t le,
-				   ppl_Coefficient_t inf_n,
-				   ppl_Coefficient_t inf_d,
-				   int* pminimum,
-				   ppl_Generator_t point));
-
-/*! \brief
-  Returns a positive integer if \p ph is topologically closed;
-  returns 0 if \p ph is not topologically closed.
-*/
-int
-ppl_Polyhedron_is_topologically_closed PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Returns a positive integer if \p x contains or is equal to \p y;
-  returns 0 if it does not.
-*/
-int
-ppl_Polyhedron_contains_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
-					      ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p x strictly contains \p y; returns 0
-  if it does not.
-*/
-int
-ppl_Polyhedron_strictly_contains_Polyhedron
-PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p x and \p y are disjoint; returns 0
-  if they are not.
-*/
-int
-ppl_Polyhedron_is_disjoint_from_Polyhedron
-PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p x and \p y are the same polyhedron;
-  returns 0 if they are different.
-
-  Note that \p x and \p y may be topology- and/or dimension-incompatible
-  polyhedra: in those cases, the value 0 is returned.
-*/
-int
-ppl_Polyhedron_equals_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
-					    ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Returns a positive integer if \p ph is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p ph is broken.  Useful for debugging purposes.
-*/
-int
-ppl_Polyhedron_OK PPL_PROTO((ppl_const_Polyhedron_t ph));
-
-/*! \brief
-  Adds a copy of the constraint \p c to the system of constraints of
-  \p ph.
-*/
-int
-ppl_Polyhedron_add_constraint PPL_PROTO((ppl_Polyhedron_t ph,
-					 ppl_const_Constraint_t c));
-
-/*! \brief
-  Adds a copy of the constraint \p c to the system of constraints of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_constraint_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_t c));
-
-/*! \brief
-  Adds a copy of the generator \p g to the system of generators of
-  \p ph.
-*/
-int
-ppl_Polyhedron_add_generator PPL_PROTO((ppl_Polyhedron_t ph,
-					ppl_const_Generator_t g));
-
-/*! \brief
-  Adds a copy of the generator \p g to the system of generators of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_generator_and_minimize PPL_PROTO((ppl_Polyhedron_t ph,
-						     ppl_const_Generator_t g));
-
-/*! \brief
-  Adds a copy of the system of constraints \p cs to the system of
-  constraints of \p ph.
-*/
-int
-ppl_Polyhedron_add_constraints PPL_PROTO((ppl_Polyhedron_t ph,
-					  ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Adds a copy of the system of constraints \p cs to the system of
-  constraints of \p ph.  Returns a positive integer if the resulting
-  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
-  return, \p ph is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_constraints_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Adds a copy of the system of generators \p gs to the system of
-  generators of \p ph.
-*/
-int
-ppl_Polyhedron_add_generators PPL_PROTO((ppl_Polyhedron_t ph,
-					 ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Adds a copy of the system of generators \p gs to the system of
-  generators of \p ph.  Returns a positive integer if the resulting
-  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
-  return, \p ph is guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_add_generators_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs));
-
-/*! \brief
-  Adds the system of constraints \p cs to the system of constraints of
-  \p ph.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_constraints
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Adds the system of constraints \p cs to the system of constraints of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-
-  \warning
-  This function modifies the constraint system referenced by \p cs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_constraints_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
-
-/*! \brief
-  Adds the system of generators \p gs to the system of generators of
-  \p ph.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_generators PPL_PROTO((ppl_Polyhedron_t ph,
-						  ppl_Generator_System_t gs));
-
-/*! \brief
-  Adds the system of generators \p gs to the system of generators of
-  \p ph.  Returns a positive integer if the resulting polyhedron is
-  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
-  is guaranteed to be minimized.
-
-  \warning
-  This function modifies the generator system referenced by \p gs:
-  upon return, no assumption can be made on its value.
-*/
-int
-ppl_Polyhedron_add_recycled_generators_and_minimize
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_Generator_System_t gs));
-
-/*! \brief
-  Intersects \p x with polyhedron \p y and assigns the result to \p x.
-*/
-int
-ppl_Polyhedron_intersection_assign PPL_PROTO((ppl_Polyhedron_t x,
-					      ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Intersects \p x with polyhedron \p y and assigns the result to \p x.
-  Returns a positive integer if the resulting polyhedron is non-empty;
-  returns 0 if it is empty.  Upon successful return, \p x is also
-  guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_intersection_assign_and_minimize
-PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Assigns to \p x the poly-hull of \p x and \p y.
-*/
-int
-ppl_Polyhedron_poly_hull_assign PPL_PROTO((ppl_Polyhedron_t x,
-					   ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Assigns to \p x the poly-hull of \p x and \p y. Returns a positive
-  integer if the resulting polyhedron is non-empty; returns 0 if it is
-  empty. Upon successful return, \p x is also guaranteed to be minimized.
-*/
-int
-ppl_Polyhedron_poly_hull_assign_and_minimize
-PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Assigns to \p x the \ref Convex_Polyhedral_Difference "poly-difference"
-  of \p x and \p y.
-*/
-int
-ppl_Polyhedron_poly_difference_assign PPL_PROTO((ppl_Polyhedron_t x,
-						 ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Transforms the polyhedron \p ph, assigning an affine expression
-  to the specified variable.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable to which the affine expression is assigned;
-
-  \param le
-  The numerator of the affine expression;
-
-  \param d
-  The denominator of the affine expression.
-*/
-int
-ppl_Polyhedron_affine_image PPL_PROTO((ppl_Polyhedron_t ph,
-				       ppl_dimension_type var,
-				       ppl_const_Linear_Expression_t le,
-				       ppl_const_Coefficient_t d));
-
-/*! \brief
-  Transforms the polyhedron \p ph, substituting an affine expression
-  to the specified variable.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable to which the affine expression is substituted;
-
-  \param le
-  The numerator of the affine expression;
-
-  \param d
-  The denominator of the affine expression.
-*/
-int
-ppl_Polyhedron_affine_preimage PPL_PROTO((ppl_Polyhedron_t ph,
-					  ppl_dimension_type var,
-					  ppl_const_Linear_Expression_t le,
-					  ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the image of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\frac{\mathrm{lb}}{\mathrm{d}}
-       \leq \mathrm{var}'
-         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable bounded by the generalized affine transfer relation;
-
-  \param lb
-  The numerator of the lower bounding affine expression;
-
-  \param ub
-  The numerator of the upper bounding affine expression;
-
-  \param d
-  The (common) denominator of the lower and upper bounding affine expressions.
-*/
-int
-ppl_Polyhedron_bounded_affine_image
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   ppl_const_Linear_Expression_t lb,
-	   ppl_const_Linear_Expression_t ub,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the preimage of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\frac{\mathrm{lb}}{\mathrm{d}}
-       \leq \mathrm{var}'
-         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The variable bounded by the generalized affine transfer relation;
-
-  \param lb
-  The numerator of the lower bounding affine expression;
-
-  \param ub
-  The numerator of the upper bounding affine expression;
-
-  \param d
-  The (common) denominator of the lower and upper bounding affine expressions.
-*/
-int
-ppl_Polyhedron_bounded_affine_preimage
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   ppl_const_Linear_Expression_t lb,
-	   ppl_const_Linear_Expression_t ub,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the image of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
-  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-  by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The left hand side variable of the generalized affine transfer relation;
-
-  \param relsym
-  The relation symbol;
-
-  \param le
-  The numerator of the right hand side affine expression;
-
-  \param d
-  The denominator of the right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_image
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t le,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the preimage of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
-  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-  by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param var
-  The left hand side variable of the generalized affine transfer relation;
-
-  \param relsym
-  The relation symbol;
-
-  \param le
-  The numerator of the right hand side affine expression;
-
-  \param d
-  The denominator of the right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_preimage
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_dimension_type var,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t le,
-	   ppl_const_Coefficient_t d));
-
-/*! \brief
-  Assigns to \p ph the image of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param lhs
-  The left hand side affine expression;
-
-  \param relsym
-  The relation symbol;
-
-  \param rhs
-  The right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_image_lhs_rhs
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_const_Linear_Expression_t lhs,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t rhs));
-
-/*! \brief
-  Assigns to \p ph the preimage of \p ph with respect to the
-  \ref Generalized_Affine_Relations "generalized affine transfer relation"
-  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
-
-  \param ph
-  The polyhedron that is transformed;
-
-  \param lhs
-  The left hand side affine expression;
-
-  \param relsym
-  The relation symbol;
-
-  \param rhs
-  The right hand side affine expression.
-*/
-int
-ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
-PPL_PROTO((ppl_Polyhedron_t ph,
-	   ppl_const_Linear_Expression_t lhs,
-	   enum ppl_enum_Constraint_Type relsym,
-	   ppl_const_Linear_Expression_t rhs));
-
-/*! \brief
-  Assigns to \p x the \ref Time_Elapse_Operator "time-elapse" between
-  the polyhedra \p x and \p y.
-*/
-int
-ppl_Polyhedron_time_elapse_assign PPL_PROTO((ppl_Polyhedron_t x,
-					     ppl_const_Polyhedron_t y));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y.  If \p tp is not the null pointer, the
-  \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y.
-*/
-int
-ppl_Polyhedron_BHRZ03_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
-						 ppl_const_Polyhedron_t y));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x.  If \p tp is not the null pointer,
-  the \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x.
-*/
-int
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
-  x. If \p tp is not the null pointer,
-  the \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
-  \p x and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
-*/
-int
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y.  If \p tp is not the null pointer, the
-  \ref Widening_with_Tokens "widening with tokens" delay technique is
-  applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_H79_widening_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y.
-*/
-int
-ppl_Polyhedron_H79_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
-					      ppl_const_Polyhedron_t y));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x. If \p tp is not the null
-  pointer, the \ref Widening_with_Tokens "widening with tokens" delay
-  technique is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x.
-*/
-int
-ppl_Polyhedron_limited_H79_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
-  If \p tp is not the null pointer,
-  the \ref Widening_with_Tokens "widening with tokens" delay technique
-  is applied with <CODE>*tp</CODE> available tokens.
-*/
-int
-ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs,
-	   unsigned* tp));
-
-/*! \brief
-  If the polyhedron \p y is contained in (or equal to) the polyhedron
-  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
-  and \p y intersected with the constraints in \p cs that are
-  satisfied by all the points of \p x, further intersected with all
-  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
-  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
-  x.
-*/
-int
-ppl_Polyhedron_bounded_H79_extrapolation_assign
-PPL_PROTO((ppl_Polyhedron_t x,
-	   ppl_const_Polyhedron_t y,
-	   ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Assigns to \p ph its topological closure.
-*/
-int
-ppl_Polyhedron_topological_closure_assign PPL_PROTO((ppl_Polyhedron_t ph));
-
-/*! \brief
-  Adds \p d new dimensions to the space enclosing the polyhedron \p ph
-  and to \p ph itself.
-*/
-int
-ppl_Polyhedron_add_space_dimensions_and_embed
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
-
-/*! \brief
-  Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
-*/
-int
-ppl_Polyhedron_add_space_dimensions_and_project
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
-
-/*! \brief
-  Seeing a polyhedron as a set of tuples (its points), assigns
-  to \p x all the tuples that can be obtained by concatenating,
-  in the order given, a tuple of \p x with a tuple of \p y.
-*/
-int
-ppl_Polyhedron_concatenate_assign PPL_PROTO((ppl_Polyhedron_t x,
-					     ppl_const_Polyhedron_t y));
-
-/*! \brief
-  Removes from the vector space enclosing \p ph the space dimensions that
-  are specified in first \p n positions of the array \p ds.  The presence
-  of duplicates in \p ds is a waste but an innocuous one.
-*/
-int
-ppl_Polyhedron_remove_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
-						  ppl_dimension_type ds[],
-						  size_t n));
-
-/*! \brief
-  Removes the higher dimensions from the vector space enclosing \p ph
-  so that, upon successful return, the new space dimension is \p d.
-*/
-int
-ppl_Polyhedron_remove_higher_space_dimensions
-PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
-
-/*! \brief
-  Remaps the dimensions of the vector space according to a
-  \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
-  This function is specified by means of the \p maps array,
-  which has \p n entries.
-
-  The partial function is defined on dimension <CODE>i</CODE>
-  if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
-  otherwise it is undefined on dimension <CODE>i</CODE>.
-  If the function is defined on dimension <CODE>i</CODE>, then dimension
-  <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
-
-  The result is undefined if \p maps does not encode a partial
-  function with the properties described in the
-  \ref Mapping_the_Dimensions_of_the_Vector_Space
-  "specification of the mapping operator".
-*/
-int
-ppl_Polyhedron_map_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
-					       ppl_dimension_type maps[],
-					       size_t n));
-
-/*! \brief
-  \ref expand_space_dimension "Expands" the \f$d\f$-th dimension of
-  the vector space enclosing \p ph to \p m new space dimensions.
-*/
-int
-ppl_Polyhedron_expand_space_dimension PPL_PROTO((ppl_Polyhedron_t ph,
-						 ppl_dimension_type d,
-						 ppl_dimension_type m));
-
-/*! \brief
-  Modifies \p ph by \ref fold_space_dimensions "folding" the
-  space dimensions contained in the first \p n positions of the array \p ds
-  into dimension \p d.  The presence of duplicates in \p ds is a waste
-  but an innocuous one.
-*/
-int
-ppl_Polyhedron_fold_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
-						ppl_dimension_type ds[],
-						size_t n,
-						ppl_dimension_type d));
-
-/*@}*/ /* Functions Related to Polyhedra */
-
-
-/*! \name Functions Related to LP Problems */
-/*@{*/
-
-/*! \brief
-  Builds a trivial LP problem and writes a handle to it at address \p plp.
-*/
-int
-ppl_new_LP_Problem_trivial PPL_PROTO((ppl_LP_Problem_t* plp));
-
-/*! \brief
-  Builds an LP problem having feasible region \p cs, objective function
-  \p le and optimization mode \p m; writes a handle to it at address \p plp.
-*/
-int
-ppl_new_LP_Problem PPL_PROTO((ppl_LP_Problem_t* plp,
-			      ppl_const_Constraint_System_t cs,
-			      ppl_const_Linear_Expression_t le,
-			      int m));
-
-/*! \brief
-  Builds an LP problem that is a copy of \p lp; writes a handle
-  for the newly created system at address \p plp.
-*/
-int
-ppl_new_LP_Problem_from_LP_Problem
-PPL_PROTO((ppl_LP_Problem_t* plp, ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Invalidates the handle \p lp: this makes sure the corresponding
-  resources will eventually be released.
-*/
-int
-ppl_delete_LP_Problem PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Assigns a copy of the LP problem \p src to \p dst.
-*/
-int
-ppl_assign_LP_Problem_from_LP_Problem
-PPL_PROTO((ppl_LP_Problem_t dst, ppl_const_LP_Problem_t src));
-
-/*! \brief
-  Writes to \p m the dimension of the vector space enclosing \p lp.
-*/
-int
-ppl_LP_Problem_space_dimension
-PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_dimension_type* m));
-
-/*! \brief
-  Writes a const handle to the constraint system defining the
-  feasible region of the LP problem \p lp at address \p pcs.
-*/
-int
-ppl_LP_Problem_constraints PPL_PROTO((ppl_const_LP_Problem_t lp,
-				      ppl_const_Constraint_System_t* pcs));
-
-/*! \brief
-  Writes a const handle to the linear expression defining the
-  objective function of the LP problem \p lp at address \p ple.
-*/
-int
-ppl_LP_Problem_objective_function
-PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Linear_Expression_t* ple));
-
-/*! \brief
-  Returns the optimization mode of the LP problem \p lp.
-*/
-int
-ppl_LP_Problem_optimization_mode PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Resets the LP problem to be a trivial problem of space dimension 0.
-*/
-int
-ppl_LP_Problem_clear PPL_PROTO((ppl_LP_Problem_t lp));
-
-/*! \brief
-  Modifies the feasible region of the LP problem \p lp by adding a copy
-  of the constraint \p c; the space dimension is increased, if necessary.
-*/
-int
-ppl_LP_Problem_add_constraint PPL_PROTO((ppl_LP_Problem_t lp,
-					 ppl_const_Constraint_t c));
-
-/*! \brief
-  Modifies the feasible region of the LP problem \p lp by adding a copy
-  of the constraints in \p cs; the space dimension is increased, if necessary.
-*/
-int
-ppl_LP_Problem_add_constraints PPL_PROTO((ppl_LP_Problem_t lp,
-					  ppl_const_Constraint_System_t cs));
-
-/*! \brief
-  Sets the objective function of the LP problem \p lp to a copy of \p le.
-*/
-int
-ppl_LP_Problem_set_objective_function
-PPL_PROTO((ppl_LP_Problem_t lp, ppl_const_Linear_Expression_t le));
-
-/*! \brief
-  Sets the optimization mode of the LP problem \p lp to \p mode.
-*/
-int
-ppl_LP_Problem_set_optimization_mode PPL_PROTO((ppl_LP_Problem_t lp,
-						int mode));
-
-/*! \brief
-  Returns a positive integer if \p lp is satisfiable; returns 0 otherwise.
-*/
-int
-ppl_LP_Problem_is_satisfiable PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Solves the LP problem \p lp, returning an exit status.
-
-  \return
-  <CODE>PPL_LP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the LP problem
-  is not satisfiable;
-  <CODE>PPL_LP_PROBLEM_STATUS_UNBOUNDED</CODE> if the LP problem
-  is satisfiable but there is no finite bound to the value of
-  the objective function;
-  <CODE>PPL_LP_PROBLEM_STATUS_OPTIMIZED</CODE> if the LP problem
-  admits an optimal solution.
-*/
-int
-ppl_LP_Problem_solve PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*! \brief
-  Evaluates the objective function of \p lp on point \p g.
-
-  \param lp
-  The LP problem defining the objective function;
-
-  \param g
-  The generator on which the objective function will be evaluated;
-
-  \param num
-  Will be assigned the numerator of the objective function value;
-
-  \param den
-  Will be assigned the denominator of the objective function value;
-*/
-int
-ppl_LP_Problem_evaluate_objective_function
-PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Generator_t g,
-	   ppl_Coefficient_t num, ppl_Coefficient_t den));
-
-/*! \brief
-  Writes a const handle to a feasible point for the LP problem \p lp
-  at address \p pg.
-*/
-int
-ppl_LP_Problem_feasible_point PPL_PROTO((ppl_const_LP_Problem_t lp,
-					 ppl_const_Generator_t* pg));
-
-/*! \brief
-  Writes a const handle to an optimizing point for the LP problem \p lp
-  at address \p pg.
-*/
-int
-ppl_LP_Problem_optimizing_point PPL_PROTO((ppl_const_LP_Problem_t lp,
-					   ppl_const_Generator_t* pg));
-
-/*! \brief
-  Returns the optimal value for \p lp.
-
-  \param lp
-  The LP problem;
-
-  \param num
-  Will be assigned the numerator of the optimal value;
-
-  \param den
-  Will be assigned the denominator of the optimal value.
-*/
-int
-ppl_LP_Problem_optimal_value
-PPL_PROTO((ppl_const_LP_Problem_t lp,
-	   ppl_Coefficient_t num, ppl_Coefficient_t den));
-
-/*! \brief
-  Returns a positive integer if \p lp is well formed, i.e., if it
-  satisfies all its implementation invariants; returns 0 and perhaps
-  makes some noise if \p lp is broken.  Useful for debugging purposes.
-*/
-int
-ppl_LP_Problem_OK PPL_PROTO((ppl_const_LP_Problem_t lp));
-
-/*@}*/ /* Functions Related to LP Problems */
-
-
-/*! \name Simple I/O Functions */
-/*@{*/
-
-/*! \brief Pretty-prints \p var to <CODE>stdout</CODE>. */
-int
-ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
-
-/*! \brief Pretty-prints \p var to the given output \p stream. */
-int
-ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
-
-#undef PPL_DECLARE_PRINT_FUNCTIONS
-
-#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
-/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
-int \
-ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
- \
-/*! \brief Prints \p x to the given output \p stream. */ \
-int \
-ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
-
-PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Linear_Expression)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Constraint)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Constraint_System)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Generator)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Generator_System)
-
-PPL_DECLARE_PRINT_FUNCTIONS(Polyhedron)
-
-#undef PPL_DECLARE_PRINT_FUNCTIONS
-
-/*! \brief
-  The type of output functions used for printing variables.
-
-  An output function for variables must write a textual representation
-  for \p var to a character buffer, null-terminate it, and return a
-  pointer to the beginning of the buffer.  In case the operation fails,
-  0 should be returned and perhaps <CODE>errno</CODE> should be set
-  in a meaningful way.  The library does nothing with the buffer, besides
-  printing its contents.
-*/
-typedef const char*
-ppl_io_variable_output_function_type(ppl_dimension_type var);
-
-/*! \brief
-  Sets the output function to be used for printing variables to \p p.
-*/
-int
-ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
-
-/*! \brief
-  Writes a pointer to the current variable output function to \p pp.
-*/
-int
-ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
-
-/*@}*/ /* Simple I/O Functions */
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#undef PPL_PROTO
-
-/*@}*/ /* \defgroup PPL_C_interface */
-
-#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c_version.h.in b/interfaces/C/ppl_c_version.h.in
new file mode 100644
index 0000000..c3fc497
--- /dev/null
+++ b/interfaces/C/ppl_c_version.h.in
@@ -0,0 +1,62 @@
+/* Header file providing version information for the C interface.  -*- C -*-
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \addtogroup Version */
+/*@{*/
+
+/*! \brief
+  A string containing the PPL version.
+
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+/*! \brief
+  The major number of the PPL version.
+*/
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+/*! \brief
+  The minor number of the PPL version.
+*/
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+/*! \brief
+  The revision number of the PPL version.
+*/
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
+
+/*@}*/
diff --git a/interfaces/C/ppl_interface_generator_c_cc.m4 b/interfaces/C/ppl_interface_generator_c_cc.m4
new file mode 100644
index 0000000..55b760e
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc.m4
@@ -0,0 +1,88 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_cc
+dnl using the code in ppl_interface_generator_c_cc_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_cc_code.m4')
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+
+dnl -----------------------------------------------------------------
+dnl Output the fixed preamble.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+dnl As the preamble has quotes, first change the quote characters.
+m4_changequote(`@<<@',`@>>@')@<<@@>>@dnl
+m4_include(@<<@ppl_interface_generator_c_cc_preamble@>>@)@<<@@>>@dnl
+dnl Change the quote characters back to the standard.
+m4_changequote`'dnl
+m4_divert(-1)
+
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class conversion declarations.
+dnl -----------------------------------------------------------------
+m4_define(`m4_declaration_code', `dnl
+m4_ifelse(m4_class_group$1, product,
+            `typedef @CPP_CLASS@ @CPPDEF_CLASS@;')
+
+DECLARE_CONVERSIONS(m4_interface_class`'$1, @CPPDEF_CLASS@)
+')
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+                                  `m4_declaration_code($1)',
+                                  m4_pattern_list)
+')
+
+dnl -----------------------------------------------------------------
+dnl Output conversion declarations for all the classes.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+`#include "interfaced_boxes.hh"'
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+/* Interfacing m4_interface_class`'$1 */
+
+')
+
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+DEFINE_OUTPUT_FUNCTIONS(m4_interface_class`'$1)
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Output the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_cc_code.m4 b/interfaces/C/ppl_interface_generator_c_cc_code.m4
new file mode 100644
index 0000000..c586dc0
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc_code.m4
@@ -0,0 +1,922 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating ppl_c.cc.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension
+(ppl_ at CLASS@_t* pph,
+ ppl_dimension_type d,
+ int empty) try {
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(d, empty ? EMPTY : UNIVERSE));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+(ppl_ at CLASS@_t* pph,
+ ppl_const_ at ALT_FRIEND@_t ph) try {
+  const @CPPX_FRIEND@& phh
+    = *static_cast<const @CPPX_FRIEND@*>(to_const(ph));
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@UBUILD_REPRESENT at _System
+(ppl_ at CLASS@_t* pph, ppl_const_ at UBUILD_REPRESENT@_System_t cs) try {
+  const @UBUILD_REPRESENT at _System& ccs = *to_const(cs);
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@UBUILD_REPRESENT at _System
+(ppl_ at CLASS@_t* pph, ppl_ at UBUILD_REPRESENT@_System_t cs) try {
+  @UBUILD_REPRESENT at _System& ccs = *to_nonconst(cs);
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs at RECYCLE@));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@
+(ppl_ at CLASS@_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d)) try {
+  dimension_type space_dim = space_dimension();
+  if (is_empty())
+    *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(space_dim, EMPTY));
+  else {
+    *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(space_dim, UNIVERSE));
+    // Initialization is just to avoid compilation warnings.
+    bool closed = false;
+    TEMP_INTEGER(n);
+    TEMP_INTEGER(d);
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      if (get_lower_bound(k, closed, to_nonconst(&n), to_nonconst(&d))) {
+        if (closed)
+          to_nonconst(*pph)->add_constraint(d*Variable(k) >= n);
+        else
+          to_nonconst(*pph)->add_constraint(d*Variable(k) > n);
+      }
+      if (get_upper_bound(k, closed, to_nonconst(&n), to_nonconst(&d))) {
+        if (closed)
+          to_nonconst(*pph)->add_constraint(d*Variable(k) <= n);
+        else
+          to_nonconst(*pph)->add_constraint(d*Variable(k) < n);
+      }
+    }
+  }
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`int
+ppl_delete_ at CLASS@(ppl_const_ at CLASS@_t ph) try {
+  delete to_const(ph);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS at _code',
+`int
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@
+(ppl_ at CLASS@_t dst,
+ ppl_const_ at CLASS@_t src) try {
+  const @TOPOLOGY@@CPP_CLASS@& ssrc
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(src));
+  @TOPOLOGY@@CPP_CLASS@& ddst
+    = *static_cast<@TOPOLOGY@@CPP_CLASS@*>(to_nonconst(dst));
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`int
+ppl_ at CLASS@_ at DIMENSION@
+(ppl_const_ at CLASS@_t ph,
+ ppl_dimension_type* m) try {
+  *m = to_const(ph)->@DIMENSION@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_ at GET_REPRESENT@s
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_ at UGET_REPRESENT@_System_t* pcs) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const @UGET_REPRESENT at _System& cs = pph. at GET_REPRESENT@s();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_ at UGET_REPRESENT@_System_t* pcs) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const @UGET_REPRESENT at _System& cs = pph.minimized_ at GET_REPRESENT@s();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`int
+ppl_ at CLASS@_relation_with_ at URELATION_REPRESENT@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_ at URELATION_REPRESENT@_t c) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const @URELATION_REPRESENT@& cc = *to_const(c);
+  return pph.relation_with(cc).get_flags();
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`int
+ppl_ at CLASS@_ at HAS_PROPERTY@(ppl_const_ at CLASS@_t ph) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  return pph. at HAS_PROPERTY@() ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`int
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  return pph.bounds_from_ at ABOVEBELOW@(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`int
+ppl_ at CLASS@_ at MAXMIN@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* poptimum,
+ ppl_Generator_t point) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& ssup_n = *to_nonconst(sup_n);
+  Coefficient& ssup_d = *to_nonconst(sup_d);
+  Generator& ppoint = *to_nonconst(point);
+  bool optimum;
+  bool ok = pph. at MAXMIN@(lle, ssup_n, ssup_d, optimum, ppoint);
+  if (ok)
+    *poptimum = optimum ? 1 : 0;
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`int
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  const @CPP_CLASS@& xx = *to_const(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return xx. at COMPARISON@(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`int
+ppl_ at CLASS@_equals_ at CLASS@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  const @CPP_CLASS@& xx = *to_const(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`int
+ppl_ at CLASS@_OK(ppl_const_ at CLASS@_t ph) try {
+  return to_const(ph)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`int
+ppl_ at CLASS@_ at SIMPLIFY@(ppl_ at CLASS@_t ph) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph. at SIMPLIFY@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimension
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var
+) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.unconstrain(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set to_be_unconstrained;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    to_be_unconstrained.insert(ds[i]);
+  pph.unconstrain(to_be_unconstrained);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`int
+ppl_ at CLASS@_constrains
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var
+) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  return pph.constrains(Variable(var)) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`int
+ppl_ at CLASS@_ at BINOP@
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx. at BINOP@(yy);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`int
+ppl_ at CLASS@_ at BINMINOP@
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return xx. at BINMINOP@(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`int
+ppl_ at CLASS@_simplify_using_context_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return xx.simplify_using_context_assign(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@
+(ppl_ at CLASS@_t ph,
+ ppl_const_ at UADD_REPRESENT@_t c) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @UADD_REPRESENT@& cc = *to_const(c);
+  pph.add_ at ADD_REPRESENT@(cc);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+(ppl_ at CLASS@_t ph,
+ ppl_const_ at UREFINE_REPRESENT@_t c) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @UREFINE_REPRESENT@& cc = *to_const(c);
+  pph.refine_with_ at REFINE_REPRESENT@(cc);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize
+(ppl_ at CLASS@_t ph,
+ ppl_const_ at UADD_REPRESENT@_t c) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @UADD_REPRESENT@& cc = *to_const(c);
+  return pph.add_ at ADD_REPRESENT@_and_minimize(cc) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_const_ at UADD_REPRESENT@_System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @UADD_REPRESENT at _System& ccs = *to_const(cs);
+  pph.add_ at ADD_REPRESENT@s(ccs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_const_ at UREFINE_REPRESENT@_System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @UREFINE_REPRESENT at _System& ccs = *to_const(cs);
+  pph.refine_with_ at REFINE_REPRESENT@s(ccs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize
+(ppl_ at CLASS@_t ph,
+ ppl_const_ at UADD_REPRESENT@_System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @UADD_REPRESENT at _System& ccs = *to_const(cs);
+  return pph.add_ at ADD_REPRESENT@s_and_minimize(ccs) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_recycled_ at ADD_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_recycled_ at ADD_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_ at UADD_REPRESENT@_System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  @UADD_REPRESENT at _System& ccs = *to_nonconst(cs);
+  pph.add_recycled_ at ADD_REPRESENT@s(ccs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph. at AFFIMAGE@(Variable(var), lle, dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_bounded_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& llb = *to_const(lb);
+  const Linear_Expression& uub = *to_const(ub);
+  const Coefficient& dd = *to_const(d);
+  pph.bounded_ at AFFIMAGE@(Variable(var), llb, uub, dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph.generalized_ at AFFIMAGE@
+    (Variable(var), relation_symbol(relsym), lle, dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+(ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& llhs = *to_const(lhs);
+  const Linear_Expression& rrhs = *to_const(rhs);
+  pph.generalized_ at AFFIMAGE@(llhs, relation_symbol(relsym), rrhs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d,
+ ppl_const_Coefficient_t m) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  const Coefficient& mm = *to_const(m);
+  pph.generalized_ at AFFIMAGE@
+    (Variable(var), relation_symbol(relsym), lle, dd, mm);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+(ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs,
+ ppl_const_Coefficient_t m) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& llhs = *to_const(lhs);
+  const Linear_Expression& rrhs = *to_const(rhs);
+  const Coefficient& mm = *to_const(m);
+  pph.generalized_ at AFFIMAGE@(llhs, relation_symbol(relsym), rrhs, mm);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx. at WIDEN@_widening_assign(yy, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  return ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_ at UCONSTRAINER@_System_t cs,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  const @UCONSTRAINER at _System& ccs = *to_const(cs);
+  xx. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_ at UCONSTRAINER@_System_t cs) try {
+  return
+    ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+      (x, y, cs, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_ at UCONSTRAINER@_System_t cs,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  const @UCONSTRAINER at _System& ccs = *to_const(cs);
+  xx.bounded_ at WIDENEXPN@_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_ at UCONSTRAINER@_System_t cs) try {
+  return
+    ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_with_tokens
+      (x, y, cs, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`int
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.add_space_dimensions_ at EMBEDPROJECT@(d);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set to_be_removed;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    to_be_removed.insert(ds[i]);
+  pph.remove_space_dimensions(to_be_removed);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_higher_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.remove_higher_space_dimensions(d);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`int
+ppl_ at CLASS@_map_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type maps[],
+ size_t n) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  PIFunc pifunc(maps, n);
+  pph.map_space_dimensions(pifunc);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`int
+ppl_ at CLASS@_expand_space_dimension
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.expand_space_dimension(Variable(d), m);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`int
+ppl_ at CLASS@_fold_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set to_be_folded;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    to_be_folded.insert(ds[i]);
+  pph.fold_space_dimensions(to_be_folded, Variable(d));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`int
+ppl_ at CLASS@_ at MEMBYTES@
+(ppl_const_ at CLASS@_t ps,
+ size_t* sz) try {
+  *sz = to_const(ps)->@MEMBYTES@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+
+typedef @CPP_CLASS@::iterator
+        @CLASS at _iterator;
+typedef @CPP_CLASS@::const_iterator
+        @CLASS at _const_iterator;
+
+DECLARE_CONVERSIONS(@CLASS at _iterator,
+                    @CLASS at _iterator)
+DECLARE_CONVERSIONS(@CLASS at _const_iterator,
+                    @CLASS at _const_iterator)
+
+
+int
+ppl_ at CLASS@_iterator_equal_test
+(ppl_const_ at CLASS@_iterator_t x,
+ ppl_const_ at CLASS@_iterator_t y) try {
+  return (*to_const(x) == *to_const(y)) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_equal_test
+(ppl_const_ at CLASS@_const_iterator_t x,
+ ppl_const_ at CLASS@_const_iterator_t y) try {
+  return (*to_const(x) == *to_const(y)) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_ at BEGINEND@
+(ppl_ at CLASS@_t ps,
+ ppl_ at CLASS@_iterator_t psit) try {
+  @CPP_CLASS@::iterator& ppsit = *to_nonconst(psit);
+  ppsit = to_nonconst(ps)->@BEGINEND@();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_ at BEGINEND@
+(ppl_const_ at CLASS@_t ps,
+ ppl_ at CLASS@_const_iterator_t psit) try {
+  @CPP_CLASS@::const_iterator& ppsit = *to_nonconst(psit);
+  ppsit = to_const(ps)->@BEGINEND@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+`dnl
+int
+ppl_delete_ at CLASS@_iterator
+(ppl_const_ at CLASS@_iterator_t it)
+  try {
+  delete to_const(it);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_ at CLASS@_const_iterator
+(ppl_const_ at CLASS@_const_iterator_t it)
+  try {
+  delete to_const(it);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at INCDEC@
+(ppl_ at CLASS@_iterator_t it)
+  try {
+    @CPP_CLASS@::iterator& iit = *to_nonconst(it);
+    @CPPX_INCDEC at iit;
+    return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_ at INCDEC@
+(ppl_ at CLASS@_const_iterator_t it)
+  try {
+    @CPP_CLASS@::const_iterator& iit = *to_nonconst(it);
+    @CPPX_INCDEC at iit;
+    return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_drop_disjunct
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t cit,
+ ppl_ at CLASS@_iterator_t it) try {
+  @CPP_CLASS@& pps = *to_nonconst(ps);
+  const @CPP_CLASS@::iterator& ccit = *to_const(cit);
+  @CPP_CLASS@::iterator& iit = *to_nonconst(it);
+  iit = pps.drop_disjunct(ccit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_drop_disjuncts
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t first,
+ ppl_const_ at CLASS@_iterator_t last) try {
+  @CPP_CLASS@& pps = *to_nonconst(ps);
+  const @CPP_CLASS@::iterator& ffirst = *to_const(first);
+  const @CPP_CLASS@::iterator& llast = *to_const(last);
+  pps.drop_disjuncts(ffirst, llast);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_add_disjunct
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at DISJUNCT@_t d) try {
+  @CPP_CLASS@& pps = *to_nonconst(ps);
+  const @CLASSTOPOLOGY@@CPP_DISJUNCT@& dd
+     = *static_cast<const @CLASSTOPOLOGY@@CPP_DISJUNCT@*>(to_const(d));
+  pps.add_disjunct(dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_divert`'dnl
diff --git a/interfaces/C/ppl_interface_generator_c_cc_preamble b/interfaces/C/ppl_interface_generator_c_cc_preamble
new file mode 100644
index 0000000..3e2307e
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc_preamble
@@ -0,0 +1,2215 @@
+/* Implementation of the C interface.  -*- C++ -*-
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+#include "ppl_c.h"
+#include <stdexcept>
+#include <limits>
+#include <sstream>
+#include <cstdio>
+#include <cerrno>
+#include <climits>
+
+using namespace Parma_Polyhedra_Library;
+
+//! Reinterpret an mpz_t as mpz_class.
+mpz_class&
+reinterpret_mpz_class(mpz_t n) {
+  return reinterpret_cast<mpz_class&>(*n);
+}
+
+#define DECLARE_CONVERSIONS(Type, CPP_Type) \
+inline const CPP_Type* \
+to_const(ppl_const_ ## Type ## _t x) { \
+  return reinterpret_cast<const CPP_Type*>(x); \
+} \
+ \
+inline CPP_Type* \
+to_nonconst(ppl_ ## Type ## _t x) { \
+  return reinterpret_cast<CPP_Type*>(x); \
+} \
+ \
+inline ppl_const_ ## Type ## _t \
+to_const(const CPP_Type* x) { \
+  return reinterpret_cast<ppl_const_ ## Type ## _t>(x); \
+} \
+ \
+inline ppl_ ## Type ## _t \
+to_nonconst(CPP_Type* x) { \
+  return reinterpret_cast<ppl_ ## Type ## _t>(x); \
+}
+
+namespace {
+
+extern "C" typedef void
+(*error_handler_type)(enum ppl_enum_error_code code, const char* description);
+
+error_handler_type user_error_handler = 0;
+
+void
+notify_error(enum ppl_enum_error_code code, const char* description) {
+  if (user_error_handler != 0)
+    user_error_handler(code, description);
+}
+
+} // namespace
+
+int
+ppl_set_error_handler(error_handler_type h) {
+  user_error_handler = h;
+  return 0;
+}
+
+#define CATCH_STD_EXCEPTION(exception, code) \
+catch (const std::exception& e) {	     \
+  notify_error(code, e.what()); \
+  return code; \
+}
+
+#define CATCH_ALL \
+CATCH_STD_EXCEPTION(bad_alloc, PPL_ERROR_OUT_OF_MEMORY) \
+CATCH_STD_EXCEPTION(invalid_argument, PPL_ERROR_INVALID_ARGUMENT) \
+CATCH_STD_EXCEPTION(domain_error, PPL_ERROR_DOMAIN_ERROR) \
+CATCH_STD_EXCEPTION(length_error, PPL_ERROR_LENGTH_ERROR) \
+CATCH_STD_EXCEPTION(overflow_error, PPL_ARITHMETIC_OVERFLOW) \
+CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \
+CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \
+catch (...) {						     \
+  notify_error(PPL_ERROR_UNEXPECTED_ERROR, \
+	       "completely unexpected error: a bug in the PPL"); \
+  return PPL_ERROR_UNEXPECTED_ERROR; \
+}
+
+unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+
+namespace {
+
+extern "C" const char*
+c_variable_default_output_function(ppl_dimension_type var) {
+#if PPL_SIZEOF_SIZE_T == PPL_SIZEOF_INT
+# define FORMAT "%u"
+# define CONVERSION (unsigned)
+#elif PPL_SIZEOF_SIZE_T == PPL_SIZEOF_LONG
+# define FORMAT "%lu"
+# define CONVERSION (unsigned long)
+#elif PPL_SIZEOF_SIZE_T == PPL_SIZEOF_LONG_LONG
+# define FORMAT "%llu"
+# define CONVERSION (unsigned long long)
+#else
+# error "Unsupported definition for `size_t'."
+#endif
+  // On a 64-bits architecture, `var' will not be more than 2^64-1,
+  // (2^64-1)/26 is written with 18 decimal digits, plus one letter,
+  // plus one terminator makes 20.
+#if defined(ULLONG_MAX) && ULLONG_MAX > 18446744073709551615ULL
+# error "Please enlarge the buffer in the following line."
+#endif
+  static char buffer[20];
+  buffer[0] = static_cast<char>('A' + var % 26);
+  if (ppl_dimension_type i = var / 26) {
+    int r = sprintf(buffer+1, FORMAT, CONVERSION i);
+    if (r < 0)
+      return 0;
+    else if (r >= 19) {
+      errno = ERANGE;
+      return 0;
+    }
+  }
+  else
+    buffer[1] = '\0';
+  return buffer;
+}
+
+// Holds a pointer to the C current output function.
+ppl_io_variable_output_function_type* c_variable_output_function;
+
+void
+cxx_Variable_output_function(std::ostream& s, const Variable& v) {
+  const char* b = c_variable_output_function(v.id());
+  if (b == 0)
+    // Something went wrong in the client's output function.
+    // Client code will know what to do: we do nothing.
+    return;
+  s << b;
+}
+
+extern "C" typedef const char*
+c_variable_output_function_type(ppl_dimension_type var);
+
+// Holds a pointer to the C++ saved output function.
+Variable::output_function_type* saved_cxx_Variable_output_function;
+
+} // namespace
+
+
+int
+ppl_initialize(void) try {
+  initialize();
+
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+    = Poly_Con_Relation::is_disjoint().get_flags();
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS
+    = Poly_Con_Relation::strictly_intersects().get_flags();
+  PPL_POLY_CON_RELATION_IS_INCLUDED
+    = Poly_Con_Relation::is_included().get_flags();
+  PPL_POLY_CON_RELATION_SATURATES
+    = Poly_Con_Relation::saturates().get_flags();
+
+  PPL_POLY_GEN_RELATION_SUBSUMES
+    = Poly_Gen_Relation::subsumes().get_flags();
+
+  PPL_COMPLEXITY_CLASS_POLYNOMIAL = POLYNOMIAL_COMPLEXITY;
+  PPL_COMPLEXITY_CLASS_SIMPLEX = SIMPLEX_COMPLEXITY;
+  PPL_COMPLEXITY_CLASS_ANY = ANY_COMPLEXITY;
+
+  PPL_MIP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_MIP_PROBLEM;
+  PPL_MIP_PROBLEM_STATUS_UNBOUNDED = UNBOUNDED_MIP_PROBLEM;
+  PPL_MIP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_MIP_PROBLEM;
+
+  PPL_OPTIMIZATION_MODE_MINIMIZATION = MINIMIZATION;
+  PPL_OPTIMIZATION_MODE_MAXIMIZATION = MAXIMIZATION;
+
+  c_variable_output_function = c_variable_default_output_function;
+  saved_cxx_Variable_output_function = Variable::get_output_function();
+  Variable::set_output_function(cxx_Variable_output_function);
+
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_finalize(void) try {
+  Variable::set_output_function(saved_cxx_Variable_output_function);
+
+  finalize();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_rounding_for_PPL(void) try {
+  set_rounding_for_PPL();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_restore_pre_PPL_rounding(void) try {
+  restore_pre_PPL_rounding();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_version_major(void) try {
+  return version_major();
+}
+CATCH_ALL
+
+int
+ppl_version_minor(void) try {
+  return version_minor();
+}
+CATCH_ALL
+
+int
+ppl_version_revision(void) try {
+  return version_revision();
+}
+CATCH_ALL
+
+int
+ppl_version_beta(void) try {
+  return version_beta();
+}
+CATCH_ALL
+
+int
+ppl_version(const char** p) try {
+  // Note: use explicit qualification to avoid clashes on, e.g.,
+  // Solaris 2.9, where `version' is the name of an enum defined in
+  // math.h.
+  *p = Parma_Polyhedra_Library::version();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_banner(const char** p) try {
+  *p = banner();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_max_space_dimension(ppl_dimension_type* m) try {
+  *m = max_space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_not_a_dimension(ppl_dimension_type* m) try {
+  *m = not_a_dimension();
+  return 0;
+}
+CATCH_ALL
+
+DECLARE_CONVERSIONS(Coefficient, Coefficient)
+
+DECLARE_CONVERSIONS(Linear_Expression, Linear_Expression)
+
+DECLARE_CONVERSIONS(Constraint, Constraint)
+
+DECLARE_CONVERSIONS(Constraint_System, Constraint_System)
+
+typedef Constraint_System::const_iterator Constraint_System_const_iterator;
+DECLARE_CONVERSIONS(Constraint_System_const_iterator,
+                    Constraint_System_const_iterator)
+
+DECLARE_CONVERSIONS(Generator, Generator)
+
+DECLARE_CONVERSIONS(Generator_System, Generator_System)
+
+typedef Generator_System::const_iterator Generator_System_const_iterator;
+DECLARE_CONVERSIONS(Generator_System_const_iterator,
+                    Generator_System_const_iterator)
+
+DECLARE_CONVERSIONS(Congruence, Congruence)
+
+DECLARE_CONVERSIONS(Congruence_System, Congruence_System)
+
+typedef Congruence_System::const_iterator Congruence_System_const_iterator;
+DECLARE_CONVERSIONS(Congruence_System_const_iterator,
+                    Congruence_System_const_iterator)
+
+DECLARE_CONVERSIONS(Grid_Generator, Grid_Generator)
+
+DECLARE_CONVERSIONS(Grid_Generator_System, Grid_Generator_System)
+
+typedef Grid_Generator_System::const_iterator
+  Grid_Generator_System_const_iterator;
+DECLARE_CONVERSIONS(Grid_Generator_System_const_iterator,
+                    Grid_Generator_System_const_iterator)
+
+DECLARE_CONVERSIONS(MIP_Problem, MIP_Problem)
+
+
+/* Interfacing Coefficient */
+
+int
+ppl_new_Coefficient(ppl_Coefficient_t* pc) try {
+  *pc = to_nonconst(new Coefficient(0));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_mpz_t(ppl_Coefficient_t* pc, mpz_t z) try {
+  *pc = to_nonconst(new Coefficient(reinterpret_mpz_class(z)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_Coefficient(ppl_Coefficient_t* pc,
+				     ppl_const_Coefficient_t c) try {
+  const Coefficient& cc = *to_const(c);
+  *pc = to_nonconst(new Coefficient(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_to_mpz_t(ppl_const_Coefficient_t c, mpz_t z) try {
+  assign_r(reinterpret_mpz_class(z), *to_const(c), ROUND_NOT_NEEDED);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Coefficient(ppl_const_Coefficient_t c) try {
+  delete to_const(c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_mpz_t(ppl_Coefficient_t dst, mpz_t z) try {
+  Coefficient& ddst = *to_nonconst(dst);
+  ddst = reinterpret_mpz_class(z);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_Coefficient(ppl_Coefficient_t dst,
+					ppl_const_Coefficient_t src) try {
+  const Coefficient& ssrc = *to_const(src);
+  Coefficient& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_OK(ppl_const_Coefficient_t /* c */) try {
+  return 1;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_is_bounded(void) try {
+  return std::numeric_limits<Coefficient>::is_bounded ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_min(mpz_t min) try {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    assign_r(reinterpret_mpz_class(min),
+	     std::numeric_limits<Coefficient>::min(),
+	     ROUND_NOT_NEEDED);
+    return 1;
+  }
+  else
+    return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_max(mpz_t max) try {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    assign_r(reinterpret_mpz_class(max),
+	     std::numeric_limits<Coefficient>::max(),
+	     ROUND_NOT_NEEDED);
+    return 1;
+  }
+  else
+    return 0;
+}
+CATCH_ALL
+
+/* Interfacing Linear_Expression */
+
+int
+ppl_new_Linear_Expression(ppl_Linear_Expression_t* ple) try {
+  *ple = to_nonconst(new Linear_Expression());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_with_dimension(ppl_Linear_Expression_t* ple,
+					 ppl_dimension_type d) try {
+  *ple = to_nonconst(d == 0
+		     ? new Linear_Expression(0)
+		     : new Linear_Expression(0*Variable(d-1)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le) try {
+  const Linear_Expression& lle = *to_const(le);
+  *ple = to_nonconst(new Linear_Expression(lle));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Linear_Expression(ppl_const_Linear_Expression_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  const Linear_Expression& ssrc = *to_const(src);
+  Linear_Expression& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_coefficient(ppl_Linear_Expression_t le,
+					 ppl_dimension_type var,
+					 ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle += nn * Variable(var);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_inhomogeneous(ppl_Linear_Expression_t le,
+					   ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle += nn;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  Linear_Expression& ddst = *to_nonconst(dst);
+  const Linear_Expression& ssrc = *to_const(src);
+  ddst += ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  Linear_Expression& ddst = *to_nonconst(dst);
+  const Linear_Expression& ssrc = *to_const(src);
+  ddst -= ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_multiply_Linear_Expression_by_Coefficient(ppl_Linear_Expression_t le,
+					      ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle *= nn;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_space_dimension(ppl_const_Linear_Expression_t le,
+				      ppl_dimension_type* m) try {
+  *m = to_const(le)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_coefficient(ppl_const_Linear_Expression_t le,
+				  ppl_dimension_type var,
+				  ppl_Coefficient_t n) try {
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& nn = *to_nonconst(n);
+  nn = lle.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_inhomogeneous_term(ppl_const_Linear_Expression_t le,
+					 ppl_Coefficient_t n) try {
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& nn = *to_nonconst(n);
+  nn = lle.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_OK(ppl_const_Linear_Expression_t le) try {
+  return to_const(le)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Constraint */
+
+int
+ppl_new_Constraint(ppl_Constraint_t* pc,
+		   ppl_const_Linear_Expression_t le,
+		   enum ppl_enum_Constraint_Type t) try {
+  Constraint* ppc;
+  const Linear_Expression& lle = *to_const(le);
+  switch (t) {
+  case PPL_CONSTRAINT_TYPE_EQUAL:
+    ppc = new Constraint(lle == 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
+    ppc = new Constraint(lle >= 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+    ppc = new Constraint(lle > 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
+    ppc = new Constraint(lle <= 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_LESS_THAN:
+    ppc = new Constraint(lle < 0);
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Constraint(pc, le, t): "
+				"t invalid");
+  }
+  *pc = to_nonconst(ppc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_false(ppl_Constraint_t* pc) try {
+  *pc = to_nonconst(new Constraint(Constraint::zero_dim_false()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_positivity(ppl_Constraint_t* pc) try {
+  *pc = to_nonconst(new Constraint(Constraint::zero_dim_positivity()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_from_Constraint(ppl_Constraint_t* pc,
+				   ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *pc = to_nonconst(new Constraint(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint(ppl_const_Constraint_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_from_Constraint(ppl_Constraint_t dst,
+				      ppl_const_Constraint_t src) try {
+  const Constraint& ssrc = *to_const(src);
+  Constraint& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_space_dimension(ppl_const_Constraint_t c,
+			       ppl_dimension_type* m) try {
+  *m = to_const(c)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_type(ppl_const_Constraint_t c) try {
+  switch (to_const(c)->type()) {
+  case Constraint::EQUALITY:
+    return PPL_CONSTRAINT_TYPE_EQUAL;
+  case Constraint::NONSTRICT_INEQUALITY:
+    return PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL;
+  case Constraint::STRICT_INEQUALITY:
+    return PPL_CONSTRAINT_TYPE_GREATER_THAN;
+  default:
+    throw std::runtime_error("ppl_Constraint_type()");
+  }
+}
+CATCH_ALL
+
+int
+ppl_Constraint_coefficient(ppl_const_Constraint_t c,
+			   ppl_dimension_type var,
+			   ppl_Coefficient_t n) try {
+  const Constraint& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_inhomogeneous_term(ppl_const_Constraint_t c,
+				  ppl_Coefficient_t n) try {
+  const Constraint& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_OK(ppl_const_Constraint_t c) try {
+  return to_const(c)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Constraint(ppl_Linear_Expression_t* ple,
+					  ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *ple = to_nonconst(new Linear_Expression(cc));
+  return 0;
+}
+CATCH_ALL
+
+/* Interfacing Constraint_System */
+
+int
+ppl_new_Constraint_System(ppl_Constraint_System_t* pcs) try {
+  *pcs = to_nonconst(new Constraint_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_zero_dim_empty(ppl_Constraint_System_t* pcs) try {
+  *pcs = to_nonconst(new
+		     Constraint_System(Constraint_System::zero_dim_empty()));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint_System_from_Constraint(ppl_Constraint_System_t* pcs,
+					  ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *pcs = to_nonconst(new Constraint_System(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  *pcs = to_nonconst(new Constraint_System(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System(ppl_const_Constraint_System_t cs) try {
+  delete to_const(cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src) try {
+  const Constraint_System& ssrc = *to_const(src);
+  Constraint_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_space_dimension(ppl_const_Constraint_System_t cs,
+				      ppl_dimension_type* m) try {
+  *m = to_const(cs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_empty
+(ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  return ccs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_has_strict_inequalities
+(ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  return ccs.has_strict_inequalities() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_clear(ppl_Constraint_System_t cs) try {
+  to_nonconst(cs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_insert_Constraint(ppl_Constraint_System_t cs,
+					ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  Constraint_System& ccs = *to_nonconst(cs);
+  ccs.insert(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_OK(ppl_const_Constraint_System_t cs) try {
+  return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Constraint_System::const_iterator */
+
+int
+ppl_new_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit) try {
+  *pcit = to_nonconst(new Constraint_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit,
+ ppl_const_Constraint_System_const_iterator_t cit)  try {
+  *pcit = to_nonconst(new Constraint_System::const_iterator(*to_const(cit)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System_const_iterator
+(ppl_const_Constraint_System_const_iterator_t cit)
+  try {
+  delete to_const(cit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t dst,
+ ppl_const_Constraint_System_const_iterator_t src) try {
+  const Constraint_System::const_iterator& ssrc = *to_const(src);
+  Constraint_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_begin(ppl_const_Constraint_System_t cs,
+			    ppl_Constraint_System_const_iterator_t cit) try {
+  const Constraint_System& ccs = *to_const(cs);
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_end(ppl_const_Constraint_System_t cs,
+			  ppl_Constraint_System_const_iterator_t cit) try {
+  const Constraint_System& ccs = *to_const(cs);
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_dereference
+(ppl_const_Constraint_System_const_iterator_t cit,
+ ppl_const_Constraint_t* pc) try {
+  const Constraint_System::const_iterator& ccit = *to_const(cit);
+  const Constraint& c = *ccit;
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_increment
+(ppl_Constraint_System_const_iterator_t cit) try {
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ++ccit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_equal_test
+(ppl_const_Constraint_System_const_iterator_t x,
+ ppl_const_Constraint_System_const_iterator_t y) try {
+  const Constraint_System::const_iterator& xx = *to_const(x);
+  const Constraint_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Generator */
+
+int
+ppl_new_Generator(ppl_Generator_t* pg,
+		  ppl_const_Linear_Expression_t le,
+		  enum ppl_enum_Generator_Type t,
+		  ppl_const_Coefficient_t d) try {
+  Generator* ppg;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  switch (t) {
+  case PPL_GENERATOR_TYPE_POINT:
+    ppg = new Generator(Generator::point(lle, dd));
+    break;
+  case PPL_GENERATOR_TYPE_CLOSURE_POINT:
+    ppg = new Generator(Generator::closure_point(lle, dd));
+    break;
+  case PPL_GENERATOR_TYPE_RAY:
+    ppg = new Generator(Generator::ray(lle));
+    break;
+  case PPL_GENERATOR_TYPE_LINE:
+    ppg = new Generator(Generator::line(lle));
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Generator(pg, le, t, d): "
+				"t invalid");
+  }
+  *pg = to_nonconst(ppg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_point(ppl_Generator_t* pg) try {
+  *pg = to_nonconst(new Generator(Generator::zero_dim_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_closure_point(ppl_Generator_t* pg) try {
+  *pg = to_nonconst(new Generator(Generator::zero_dim_closure_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_from_Generator(ppl_Generator_t* pg,
+				 ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *pg = to_nonconst(new Generator(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator(ppl_const_Generator_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_from_Generator(ppl_Generator_t dst,
+				      ppl_const_Generator_t src) try {
+  const Generator& ssrc = *to_const(src);
+  Generator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_space_dimension(ppl_const_Generator_t g,
+			      ppl_dimension_type* m) try {
+  *m = to_const(g)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_type(ppl_const_Generator_t g) try {
+  switch (to_const(g)->type()) {
+  case Generator::LINE:
+    return PPL_GENERATOR_TYPE_LINE;
+  case Generator::RAY:
+    return PPL_GENERATOR_TYPE_RAY;
+  case Generator::POINT:
+    return PPL_GENERATOR_TYPE_POINT;
+  case Generator::CLOSURE_POINT:
+    return PPL_GENERATOR_TYPE_CLOSURE_POINT;
+  default:
+    throw std::runtime_error("ppl_Generator_type()");
+  }
+}
+CATCH_ALL
+
+int
+ppl_Generator_coefficient(ppl_const_Generator_t g,
+			  ppl_dimension_type var,
+			  ppl_Coefficient_t n) try {
+  const Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_divisor(ppl_const_Generator_t g,
+		      ppl_Coefficient_t n) try {
+  const Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.divisor();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_OK(ppl_const_Generator_t g) try {
+  return to_const(g)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Generator(ppl_Linear_Expression_t* ple,
+					 ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *ple = to_nonconst(new Linear_Expression(gg));
+  return 0;
+}
+CATCH_ALL
+
+/* Interfacing Generator_System */
+
+int
+ppl_new_Generator_System(ppl_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Generator_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_zero_dim_univ(ppl_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Generator_System(Generator_System::zero_dim_univ()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator(ppl_Generator_System_t* pgs,
+			      ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *pgs = to_nonconst(new Generator_System(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator_System
+(ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs) try {
+  const Generator_System& ggs = *to_const(gs);
+  *pgs = to_nonconst(new Generator_System(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System(ppl_const_Generator_System_t gs) try {
+  delete to_const(gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_from_Generator_System
+(ppl_Generator_System_t dst, ppl_const_Generator_System_t src) try {
+  const Generator_System& ssrc = *to_const(src);
+  Generator_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_space_dimension(ppl_const_Generator_System_t gs,
+				     ppl_dimension_type* m) try {
+  *m = to_const(gs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_empty
+(ppl_const_Generator_System_t gs) try {
+  const Generator_System& cgs = *to_const(gs);
+  return cgs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_clear(ppl_Generator_System_t gs) try {
+  to_nonconst(gs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_insert_Generator(ppl_Generator_System_t gs,
+				      ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  Generator_System& ggs = *to_nonconst(gs);
+  ggs.insert(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_OK(ppl_const_Generator_System_t gs) try {
+  return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Generator_System::const_iterator */
+
+int
+ppl_new_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit) try {
+  *pgit = to_nonconst(new Generator_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit,
+ ppl_const_Generator_System_const_iterator_t git)  try {
+  *pgit = to_nonconst(new Generator_System::const_iterator(*to_const(git)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System_const_iterator
+(ppl_const_Generator_System_const_iterator_t git) try {
+  delete to_const(git);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t dst,
+ ppl_const_Generator_System_const_iterator_t src) try {
+  const Generator_System::const_iterator& ssrc = *to_const(src);
+  Generator_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_begin(ppl_const_Generator_System_t gs,
+			   ppl_Generator_System_const_iterator_t git) try {
+  const Generator_System& ggs = *to_const(gs);
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_end(ppl_const_Generator_System_t gs,
+			 ppl_Generator_System_const_iterator_t git) try {
+  const Generator_System& ggs = *to_const(gs);
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_dereference
+(ppl_const_Generator_System_const_iterator_t git,
+ ppl_const_Generator_t* pg) try {
+  const Generator_System::const_iterator& ggit = *to_const(git);
+  const Generator& c = *ggit;
+  *pg = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_increment
+(ppl_Generator_System_const_iterator_t git) try {
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ++ggit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_equal_test
+(ppl_const_Generator_System_const_iterator_t x,
+ ppl_const_Generator_System_const_iterator_t y) try {
+  const Generator_System::const_iterator& xx = *to_const(x);
+  const Generator_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Congruence */
+
+int
+ppl_new_Congruence(ppl_Congruence_t* pc,
+		   ppl_const_Linear_Expression_t le,
+		   ppl_const_Coefficient_t m) try {
+  Congruence* ppc;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& mm = *to_const(m);
+  ppc = new Congruence((lle %= 0) / mm);
+  *pc = to_nonconst(ppc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_zero_dim_false(ppl_Congruence_t* pc) try {
+  *pc = to_nonconst(new Congruence(Congruence::zero_dim_false()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_zero_dim_integrality(ppl_Congruence_t* pc) try {
+  *pc = to_nonconst(new Congruence(Congruence::zero_dim_integrality()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_from_Congruence(ppl_Congruence_t* pc,
+				   ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  *pc = to_nonconst(new Congruence(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence(ppl_const_Congruence_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_from_Congruence(ppl_Congruence_t dst,
+				      ppl_const_Congruence_t src) try {
+  const Congruence& ssrc = *to_const(src);
+  Congruence& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_space_dimension(ppl_const_Congruence_t c,
+			       ppl_dimension_type* m) try {
+  *m = to_const(c)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_coefficient(ppl_const_Congruence_t c,
+			   ppl_dimension_type var,
+			   ppl_Coefficient_t n) try {
+  const Congruence& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_inhomogeneous_term(ppl_const_Congruence_t c,
+				  ppl_Coefficient_t n) try {
+  const Congruence& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_modulus(ppl_const_Congruence_t c,
+		       ppl_Coefficient_t m) try {
+  const Congruence& cc = *to_const(c);
+  Coefficient& mm = *to_nonconst(m);
+  mm = cc.modulus();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_OK(ppl_const_Congruence_t c) try {
+  return to_const(c)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Congruence(ppl_Linear_Expression_t* ple,
+					  ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  *ple = to_nonconst(new Linear_Expression(cc));
+  return 0;
+}
+CATCH_ALL
+
+/* Interfacing Congruence_System */
+
+int
+ppl_new_Congruence_System(ppl_Congruence_System_t* pcs) try {
+  *pcs = to_nonconst(new Congruence_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_zero_dim_empty(ppl_Congruence_System_t* pcs) try {
+  *pcs = to_nonconst(new
+		     Congruence_System(Congruence_System::zero_dim_empty()));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Congruence_System_from_Congruence(ppl_Congruence_System_t* pcs,
+					  ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  *pcs = to_nonconst(new Congruence_System(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_from_Congruence_System
+(ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs) try {
+  const Congruence_System& ccs = *to_const(cs);
+  *pcs = to_nonconst(new Congruence_System(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence_System(ppl_const_Congruence_System_t cs) try {
+  delete to_const(cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_System_from_Congruence_System
+(ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src) try {
+  const Congruence_System& ssrc = *to_const(src);
+  Congruence_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_space_dimension(ppl_const_Congruence_System_t cs,
+				      ppl_dimension_type* m) try {
+  *m = to_const(cs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_empty
+(ppl_const_Congruence_System_t cs) try {
+  const Congruence_System& ccs = *to_const(cs);
+  return ccs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_clear(ppl_Congruence_System_t cs) try {
+  to_nonconst(cs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_insert_Congruence(ppl_Congruence_System_t cs,
+					ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  Congruence_System& ccs = *to_nonconst(cs);
+  ccs.insert(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_OK(ppl_const_Congruence_System_t cs) try {
+  return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Congruence_System::const_iterator */
+
+int
+ppl_new_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t* pcit) try {
+  *pcit = to_nonconst(new Congruence_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t* pcit,
+ ppl_const_Congruence_System_const_iterator_t cit)  try {
+  *pcit = to_nonconst(new Congruence_System::const_iterator(*to_const(cit)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence_System_const_iterator
+(ppl_const_Congruence_System_const_iterator_t cit)
+  try {
+  delete to_const(cit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t dst,
+ ppl_const_Congruence_System_const_iterator_t src) try {
+  const Congruence_System::const_iterator& ssrc = *to_const(src);
+  Congruence_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_begin(ppl_const_Congruence_System_t cs,
+			    ppl_Congruence_System_const_iterator_t cit) try {
+  const Congruence_System& ccs = *to_const(cs);
+  Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_end(ppl_const_Congruence_System_t cs,
+			  ppl_Congruence_System_const_iterator_t cit) try {
+  const Congruence_System& ccs = *to_const(cs);
+  Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_dereference
+(ppl_const_Congruence_System_const_iterator_t cit,
+ ppl_const_Congruence_t* pc) try {
+  const Congruence_System::const_iterator& ccit = *to_const(cit);
+  const Congruence& c = *ccit;
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_increment
+(ppl_Congruence_System_const_iterator_t cit) try {
+  Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+  ++ccit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_equal_test
+(ppl_const_Congruence_System_const_iterator_t x,
+ ppl_const_Congruence_System_const_iterator_t y) try {
+  const Congruence_System::const_iterator& xx = *to_const(x);
+  const Congruence_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Grid_Generator */
+
+int
+ppl_new_Grid_Generator(ppl_Grid_Generator_t* pg,
+		       ppl_const_Linear_Expression_t le,
+		       enum ppl_enum_Grid_Generator_Type t,
+		       ppl_const_Coefficient_t d) try {
+  Grid_Generator* ppg;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  switch (t) {
+  case PPL_GRID_GENERATOR_TYPE_LINE:
+    ppg = new Grid_Generator(Grid_Generator::grid_line(lle));
+    break;
+  case PPL_GRID_GENERATOR_TYPE_PARAMETER:
+    ppg = new Grid_Generator(Grid_Generator::parameter(lle));
+    break;
+  case PPL_GRID_GENERATOR_TYPE_POINT:
+    ppg = new Grid_Generator(Grid_Generator::grid_point(lle, dd));
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Grid_Generator(pg, le, t, d): "
+				"t invalid");
+  }
+  *pg = to_nonconst(ppg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_zero_dim_point(ppl_Grid_Generator_t* pg) try {
+  *pg = to_nonconst(new Grid_Generator(Grid_Generator::zero_dim_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_from_Grid_Generator(ppl_Grid_Generator_t* pg,
+					   ppl_const_Grid_Generator_t g) try {
+  const Grid_Generator& gg = *to_const(g);
+  *pg = to_nonconst(new Grid_Generator(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator(ppl_const_Grid_Generator_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+(ppl_Grid_Generator_t dst,
+ ppl_const_Grid_Generator_t src) try {
+  const Grid_Generator& ssrc = *to_const(src);
+  Grid_Generator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_space_dimension(ppl_const_Grid_Generator_t g,
+				   ppl_dimension_type* m) try {
+  *m = to_const(g)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_type(ppl_const_Grid_Generator_t g) try {
+  switch (to_const(g)->type()) {
+  case Grid_Generator::LINE:
+    return PPL_GRID_GENERATOR_TYPE_LINE;
+  case Grid_Generator::PARAMETER:
+    return PPL_GRID_GENERATOR_TYPE_PARAMETER;
+  case Grid_Generator::POINT:
+    return PPL_GRID_GENERATOR_TYPE_POINT;
+  default:
+    throw std::runtime_error("ppl_Grid_Generator_type()");
+  }
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_coefficient(ppl_const_Grid_Generator_t g,
+			       ppl_dimension_type var,
+			       ppl_Coefficient_t n) try {
+  const Grid_Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_divisor(ppl_const_Grid_Generator_t g,
+			   ppl_Coefficient_t n) try {
+  const Grid_Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.divisor();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_OK(ppl_const_Grid_Generator_t g) try {
+  return to_const(g)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+// FIXME: to be restored soon.
+// int
+// ppl_new_Linear_Expression_from_Grid_Generator
+// (ppl_Linear_Expression_t* ple,
+//  ppl_const_Grid_Generator_t g) try {
+//   const Grid_Generator& gg = *to_const(g);
+//   *ple = to_nonconst(new Linear_Expression(gg));
+//   return 0;
+// }
+// CATCH_ALL
+
+/* Interfacing Grid_Generator_System */
+
+int
+ppl_new_Grid_Generator_System(ppl_Grid_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Grid_Generator_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+(ppl_Grid_Generator_System_t* pgs) try {
+  *pgs = to_nonconst
+    (new Grid_Generator_System(Grid_Generator_System::zero_dim_univ()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_from_Generator
+(ppl_Grid_Generator_System_t* pgs, ppl_const_Grid_Generator_t g) try {
+  const Grid_Generator& gg = *to_const(g);
+  *pgs = to_nonconst(new Grid_Generator_System(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+(ppl_Grid_Generator_System_t* pgs, ppl_const_Grid_Generator_System_t gs) try {
+  const Grid_Generator_System& ggs = *to_const(gs);
+  *pgs = to_nonconst(new Grid_Generator_System(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator_System(ppl_const_Grid_Generator_System_t gs) try {
+  delete to_const(gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+(ppl_Grid_Generator_System_t dst, ppl_const_Grid_Generator_System_t src) try {
+  const Grid_Generator_System& ssrc = *to_const(src);
+  Grid_Generator_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_space_dimension(ppl_const_Grid_Generator_System_t gs,
+					  ppl_dimension_type* m) try {
+  *m = to_const(gs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_empty
+(ppl_const_Grid_Generator_System_t gs) try {
+  const Grid_Generator_System& cgs = *to_const(gs);
+  return cgs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_clear(ppl_Grid_Generator_System_t gs) try {
+  to_nonconst(gs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+(ppl_Grid_Generator_System_t gs,
+ ppl_const_Grid_Generator_t g) try {
+  const Grid_Generator& gg = *to_const(g);
+  Grid_Generator_System& ggs = *to_nonconst(gs);
+  ggs.insert(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_OK(ppl_const_Grid_Generator_System_t gs) try {
+  return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interfacing Grid_Generator_System::const_iterator */
+
+int
+ppl_new_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t* pgit) try {
+  *pgit = to_nonconst(new Grid_Generator_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t* pgit,
+ ppl_const_Grid_Generator_System_const_iterator_t git)  try {
+  *pgit = to_nonconst
+    (new Grid_Generator_System::const_iterator(*to_const(git)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator_System_const_iterator
+(ppl_const_Grid_Generator_System_const_iterator_t git) try {
+  delete to_const(git);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t dst,
+ ppl_const_Grid_Generator_System_const_iterator_t src) try {
+  const Grid_Generator_System::const_iterator& ssrc = *to_const(src);
+  Grid_Generator_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_begin
+(ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git) try {
+  const Grid_Generator_System& ggs = *to_const(gs);
+  Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_end
+(ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git) try {
+  const Grid_Generator_System& ggs = *to_const(gs);
+  Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+(ppl_const_Grid_Generator_System_const_iterator_t git,
+ ppl_const_Grid_Generator_t* pg) try {
+  const Grid_Generator_System::const_iterator& ggit = *to_const(git);
+  const Grid_Generator& g = *ggit;
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_increment
+(ppl_Grid_Generator_System_const_iterator_t git) try {
+  Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ++ggit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+(ppl_const_Grid_Generator_System_const_iterator_t x,
+ ppl_const_Grid_Generator_System_const_iterator_t y) try {
+  const Grid_Generator_System::const_iterator& xx = *to_const(x);
+  const Grid_Generator_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+
+namespace {
+
+class PIFunc {
+private:
+  //! Holds the vector implementing the map.
+  dimension_type* vec;
+
+  //! Holds the size of \p vec.
+  size_t vec_size;
+
+  //! Cache for computing the maximum dimension in the codomain.
+  mutable dimension_type max_in_codomain_;
+
+  //! Cache for computing emptiness:
+  //! -1 if we still don't know, 0 if not empty, 1 if empty.
+  mutable int empty;
+
+public:
+  PIFunc(dimension_type* v, size_t n)
+    : vec(v), vec_size(n), max_in_codomain_(not_a_dimension()), empty(-1) {
+  }
+
+  bool has_empty_codomain() const {
+    if (empty < 0) {
+      empty = 1;
+      for (size_t i = vec_size; i-- > 0; )
+	if (vec[i] != not_a_dimension()) {
+	  empty = 0;
+	  break;
+	}
+    }
+    return empty;
+  }
+
+  dimension_type max_in_codomain() const {
+    if (max_in_codomain_ == not_a_dimension()) {
+      for (size_t i = vec_size; i-- > 0; ) {
+	dimension_type vec_i = vec[i];
+	if (vec_i != not_a_dimension()
+	    && (max_in_codomain_ == not_a_dimension()
+		|| vec_i > max_in_codomain_))
+	  max_in_codomain_ = vec_i;
+      }
+    }
+    return max_in_codomain_;
+  }
+
+  bool maps(dimension_type i, dimension_type& j) const {
+    if (i >= vec_size)
+      return false;
+    dimension_type vec_i = vec[i];
+    if (vec_i == not_a_dimension())
+      return false;
+    j = vec_i;
+    return true;
+  }
+};
+
+} // namespace
+
+
+namespace {
+
+inline Relation_Symbol
+relation_symbol(enum ppl_enum_Constraint_Type t) {
+  switch (t) {
+  case PPL_CONSTRAINT_TYPE_LESS_THAN:
+    return LESS_THAN;
+  case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
+    return LESS_OR_EQUAL;
+  case PPL_CONSTRAINT_TYPE_EQUAL:
+    return EQUAL;
+  case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
+    return GREATER_OR_EQUAL;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+    return GREATER_THAN;
+  default:
+    return static_cast<Relation_Symbol>(t);
+  }
+}
+
+} // namespace
+
+int
+ppl_new_MIP_Problem_from_space_dimension(ppl_MIP_Problem_t* pmip,
+                                         ppl_dimension_type d) try {
+  *pmip = to_nonconst(new MIP_Problem(d));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem(ppl_MIP_Problem_t* pmip,
+		    ppl_dimension_type d,
+		    ppl_const_Constraint_System_t cs,
+		    ppl_const_Linear_Expression_t le, int m) try {
+  const Constraint_System& ccs = *to_const(cs);
+  const Linear_Expression& lle = *to_const(le);
+  Optimization_Mode mm = (m == PPL_OPTIMIZATION_MODE_MINIMIZATION)
+    ? MINIMIZATION : MAXIMIZATION;
+  *pmip = to_nonconst(new MIP_Problem(d, ccs, lle, mm));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem_from_MIP_Problem(ppl_MIP_Problem_t* pmip,
+				     ppl_const_MIP_Problem_t mip) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  *pmip = to_nonconst(new MIP_Problem(mmip));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_MIP_Problem(ppl_const_MIP_Problem_t mip) try {
+  delete to_const(mip);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_MIP_Problem_from_MIP_Problem(ppl_MIP_Problem_t dst,
+					ppl_const_MIP_Problem_t src) try {
+  const MIP_Problem& ssrc = *to_const(src);
+  MIP_Problem& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_space_dimension(ppl_const_MIP_Problem_t mip,
+				ppl_dimension_type* m) try {
+  *m = to_const(mip)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions(ppl_const_MIP_Problem_t mip,
+						   ppl_dimension_type* m) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  *m = mmip.integer_space_dimensions().size();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_integer_space_dimensions(ppl_const_MIP_Problem_t mip,
+					 ppl_dimension_type ds[]) try {
+  const Variables_Set& vars = to_const(mip)->integer_space_dimensions();
+  ppl_dimension_type* ds_i = ds;
+  for (Variables_Set::const_iterator v_iter = vars.begin(),
+	 v_end = vars.end(); v_iter != v_end; ++v_iter, ++ds_i)
+    *ds_i = *v_iter;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_number_of_constraints(ppl_const_MIP_Problem_t mip,
+				      ppl_dimension_type* m) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  *m = mmip.constraints_end() - mmip.constraints_begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_constraint_at_index(ppl_const_MIP_Problem_t mip,
+				    ppl_dimension_type i,
+				    ppl_const_Constraint_t* pc) try {
+#ifndef NDEBUG
+  ppl_dimension_type num_constraints;
+  ppl_MIP_Problem_number_of_constraints(mip, &num_constraints);
+  assert(i < num_constraints);
+#endif
+  const MIP_Problem& mmip = *to_const(mip);
+  const Constraint& c = *(mmip.constraints_begin() + i);
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_objective_function(ppl_const_MIP_Problem_t mip,
+				   ppl_const_Linear_Expression_t* ple) try {
+  const Linear_Expression& le = to_const(mip)->objective_function();
+  *ple = to_const(&le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimization_mode(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->optimization_mode();
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_clear(ppl_MIP_Problem_t mip) try {
+  to_nonconst(mip)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed(ppl_MIP_Problem_t mip,
+					       ppl_dimension_type d) try {
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.add_space_dimensions_and_embed(d);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions(ppl_MIP_Problem_t mip,
+					        ppl_dimension_type ds[],
+					        size_t n) try {
+  MIP_Problem& mmip = *to_nonconst(mip);
+  Variables_Set to_be_set;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    to_be_set.insert(ds[i]);
+  mmip.add_to_integer_space_dimensions(to_be_set);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_constraint(ppl_MIP_Problem_t mip,
+			       ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.add_constraint(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_constraints(ppl_MIP_Problem_t mip,
+				ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.add_constraints(ccs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_objective_function(ppl_MIP_Problem_t mip,
+				       ppl_const_Linear_Expression_t le) try {
+  const Linear_Expression& lle = *to_const(le);
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.set_objective_function(lle);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_optimization_mode(ppl_MIP_Problem_t mip, int mode) try {
+  MIP_Problem& mmip = *to_nonconst(mip);
+  Optimization_Mode m = (mode == PPL_OPTIMIZATION_MODE_MINIMIZATION)
+    ? MINIMIZATION : MAXIMIZATION;
+  mmip.set_optimization_mode(m);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_is_satisfiable(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_solve(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->solve();
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_evaluate_objective_function(ppl_const_MIP_Problem_t mip,
+					    ppl_const_Generator_t g,
+					    ppl_Coefficient_t num,
+					    ppl_Coefficient_t den) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  const Generator& gg = *to_const(g);
+  Coefficient& nnum = *to_nonconst(num);
+  Coefficient& dden = *to_nonconst(den);
+  mmip.evaluate_objective_function(gg, nnum, dden);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_feasible_point(ppl_const_MIP_Problem_t mip,
+			       ppl_const_Generator_t* pg) try {
+  const Generator& g = to_const(mip)->feasible_point();
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimizing_point(ppl_const_MIP_Problem_t mip,
+				 ppl_const_Generator_t* pg) try {
+  const Generator& g = to_const(mip)->optimizing_point();
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimal_value(ppl_const_MIP_Problem_t mip,
+			      ppl_Coefficient_t num,
+			      ppl_Coefficient_t den) try {
+  Coefficient& nnum = *to_nonconst(num);
+  Coefficient& dden = *to_nonconst(den);
+  to_const(mip)->optimal_value(nnum, dden);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_OK(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_io_print_variable(ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0 || puts(b) < 0)
+    return PPL_STDIO_ERROR;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_fprint_variable(FILE* stream, ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0 || fputs(b, stream) < 0)
+    return PPL_STDIO_ERROR;
+  return 0;
+}
+CATCH_ALL
+
+#define DEFINE_PRINT_FUNCTIONS(Type) \
+int \
+ppl_io_print_ ## Type(ppl_const_ ## Type ## _t x) try { \
+  using namespace IO_Operators; \
+  std::ostringstream s; \
+  s << *to_const(x); \
+  if (puts(s.str().c_str()) < 0) \
+    return PPL_STDIO_ERROR; \
+  return 0; \
+} \
+CATCH_ALL \
+ \
+int \
+ppl_io_fprint_ ## Type(FILE* stream, ppl_const_ ## Type ## _t x) try { \
+  using namespace IO_Operators; \
+  std::ostringstream s; \
+  s << *to_const(x); \
+  if (fputs(s.str().c_str(), stream) < 0) \
+    return PPL_STDIO_ERROR; \
+  return 0; \
+} \
+CATCH_ALL
+
+#define DEFINE_ASCII_DUMP_FUNCTIONS(Type) \
+int \
+ppl_ ## Type ## _ascii_dump(ppl_const_ ## Type ## _t x, FILE* stream) try { \
+  std::ostringstream s; \
+  to_const(x)->ascii_dump(s);		  \
+  if (fputs(s.str().c_str(), stream) < 0) \
+    return PPL_STDIO_ERROR; \
+  return 0; \
+} \
+CATCH_ALL
+
+#define DEFINE_OUTPUT_FUNCTIONS(Type) \
+DEFINE_PRINT_FUNCTIONS(Type) \
+DEFINE_ASCII_DUMP_FUNCTIONS(Type)
+
+/* No ascii dump for Coefficient */
+DEFINE_PRINT_FUNCTIONS(Coefficient)
+
+DEFINE_OUTPUT_FUNCTIONS(Linear_Expression)
+
+DEFINE_OUTPUT_FUNCTIONS(Constraint)
+
+DEFINE_OUTPUT_FUNCTIONS(Constraint_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Generator)
+
+DEFINE_OUTPUT_FUNCTIONS(Generator_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Congruence)
+
+DEFINE_OUTPUT_FUNCTIONS(Congruence_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Grid_Generator)
+
+DEFINE_OUTPUT_FUNCTIONS(Grid_Generator_System)
+
+DEFINE_OUTPUT_FUNCTIONS(MIP_Problem)
+
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p)
+try {
+  c_variable_output_function = p;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp)
+try {
+  *pp = c_variable_output_function;
+  return 0;
+}
+CATCH_ALL
diff --git a/interfaces/C/ppl_interface_generator_c_h.m4 b/interfaces/C/ppl_interface_generator_c_h.m4
new file mode 100644
index 0000000..8440ccb
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h.m4
@@ -0,0 +1,79 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_h
+dnl using the code in ppl_interface_generator_c_h_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_h_code.m4')
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+
+PPL_TYPE_DECLARATION(m4_interface_class$1);
+
+/*! \name Functions Related to m4_interface_class$1 */
+/*@{*/
+
+')
+
+dnl m4_post_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+PPL_DECLARE_OUTPUT_FUNCTIONS(m4_interface_class$1)
+
+/*@}*/ /* Functions Related to m4_interface_class$1 */
+')
+
+m4_divert`'dnl
+dnl
+dnl Output the fixed preamble.
+dnl As the preamble has quotes, first change the quote characters.
+m4_changequote(`@<<@',`@>>@')@<<@@>>@dnl
+m4_include(@<<@ppl_interface_generator_c_h_preamble@>>@)@<<@@>>@dnl
+dnl Change the quote characters back to the standard.
+m4_changequote`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+dnl
+dnl Generate the fixed postamble.
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_TYPE_DECLARATION
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_FUNCTIONS
+#undef PPL_DECLARE_OUTPUT_FUNCTIONS
+#undef PPL_PROTO
+
+/*@}*/ /* \defgroup PPL_C_interface */
+
+#endif /* !defined(PPL_ppl_c_h) */
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_h_code.m4 b/interfaces/C/ppl_interface_generator_c_h_code.m4
new file mode 100644
index 0000000..8368a3e
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h_code.m4
@@ -0,0 +1,536 @@
+dnl  -*- C -*-
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating ppl_c.h.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_dimension_type d, int empty));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@UBUILD_REPRESENT at _System
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_ at UBUILD_REPRESENT@_System_t cs));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@UBUILD_REPRESENT at _System
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_ at UBUILD_REPRESENT@_System_t cs));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_bounding_box
+PPL_PROTO((ppl_ at CLASS@_t* pph,
+	   ppl_dimension_type (*space_dimension)(void),
+	   int (*is_empty)(void),
+	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d),
+	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d)));
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`int
+ppl_delete_ at CLASS@ PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS at _code',
+`int
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_ at CLASS@_t dst, ppl_const_ at CLASS@_t src));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`int
+ppl_ at CLASS@_ at DIMENSION@
+PPL_PROTO((ppl_const_ at CLASS@_t ph, ppl_dimension_type* m));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_ at GET_REPRESENT@s
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_ at UGET_REPRESENT@_System_t* pcs));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_ at UGET_REPRESENT@_System_t* pcs));
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`int
+ppl_ at CLASS@_relation_with_ at URELATION_REPRESENT@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_ at URELATION_REPRESENT@_t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`int
+ppl_ at CLASS@_ at HAS_PROPERTY@ PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`int
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t le));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`int
+ppl_ at CLASS@_ at MAXMIN@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`int
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`int
+ppl_ at CLASS@_equals_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`int
+ppl_ at CLASS@_OK PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`int
+ppl_ at CLASS@_ at SIMPLIFY@ PPL_PROTO((ppl_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`int
+ppl_ at CLASS@_constrains
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var));
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var));
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`int
+ppl_ at CLASS@_ at BINOP@
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`int
+ppl_ at CLASS@_ at BINMINOP@
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`int
+ppl_ at CLASS@_simplify_using_context_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_ at UADD_REPRESENT@_t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_ at UREFINE_REPRESENT@_t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_ at UADD_REPRESENT@_t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_ at UADD_REPRESENT@_System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_ at UREFINE_REPRESENT@_System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`int
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_ at UADD_REPRESENT@_System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_recycled_ at ADD_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_recycled_ at ADD_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_ at UADD_REPRESENT@_System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_bounded_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d,
+           ppl_const_Coefficient_t m));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs,
+           ppl_const_Coefficient_t m));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_const_Constraint_System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_bounded_ at WIDENEXPN@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_const_Constraint_System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`int
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_higher_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`int
+ppl_ at CLASS@_map_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`int
+ppl_ at CLASS@_expand_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`int
+ppl_ at CLASS@_fold_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`int
+ppl_ at CLASS@_ at MEMBYTES@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           size_t* sz));
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+PPL_TYPE_DECLARATION(@CLASS at _iterator);
+PPL_TYPE_DECLARATION(@CLASS at _const_iterator);
+
+int
+ppl_ at CLASS@_iterator_equal_test
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t x,
+           ppl_const_ at CLASS@_iterator_t y));
+
+int
+ppl_ at CLASS@_const_iterator_equal_test
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t x,
+           ppl_const_ at CLASS@_const_iterator_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at BEGINEND@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           ppl_const_ at CLASS@_iterator_t psit));
+
+int
+ppl_ at CLASS@_const_iterator_ at BEGINEND@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           ppl_const_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+`dnl
+int
+ppl_delete_ at CLASS@_iterator
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t psit));
+
+int
+ppl_delete_ at CLASS@_const_iterator
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at INCDEC@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           ppl_const_ at CLASS@_iterator_t psit));
+
+int
+ppl_ at CLASS@_const_iterator_ at INCDEC@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           ppl_const_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_drop_disjunct
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t cit,
+ ppl_ at CLASS@_iterator_t it));
+
+int
+ppl_ at CLASS@_drop_disjuncts
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t first,
+ ppl_const_ at CLASS@_iterator_t last));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_add_disjunct
+PPL_PROTO((ppl_ at CLASS@_t ps,
+           ppl_const_ at DISJUNCT@_t d));
+
+')
+
+m4_divert`'dnl
diff --git a/interfaces/C/ppl_interface_generator_c_h_preamble b/interfaces/C/ppl_interface_generator_c_h_preamble
new file mode 100644
index 0000000..1291591
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h_preamble
@@ -0,0 +1,2079 @@
+/* Header file for the C interface.  -*- C -*-
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*! \mainpage
+
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures.  The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function.  This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used.  The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version.  This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking.  Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line.  For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects.  Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location.  In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms.  Consult your
+compiler's documentation for details.  Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase.  See Libtool's documentation for details.  Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution.  It contains a <EM>Mixed Integer (Linear)
+Programming</EM> solver written in C.  In order to use this solver
+you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/ /* \mainpage */
+
+/*
+  For some reason, GMP up to and including version 4.1.3 requires
+  <stdio.h> to be included before <gmp.h>.
+*/
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+  PPL_PROTO is a macro used to wrap function prototypes, so that
+  compilers that don't understand ANSI C prototypes still work, and
+  ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__)                              \
+  || defined(__cplusplus)                          \
+  || defined (_AIX)                                \
+  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+  || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \defgroup Error Error Handling */
+/*@{*/
+
+/*! \brief
+  Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+  /*! \hideinitializer
+    The virtual memory available to the process has been exhausted. */
+  PPL_ERROR_OUT_OF_MEMORY = -2,
+  /*! \hideinitializer
+    A function has been invoked with an invalid argument. */
+  PPL_ERROR_INVALID_ARGUMENT = -3,
+  /*! \hideinitializer
+    A function has been invoked outside its domain of definition. */
+  PPL_ERROR_DOMAIN_ERROR = -4,
+  /*! \hideinitializer
+    The construction of an object that would exceed its maximum
+    permitted size was attempted. */
+  PPL_ERROR_LENGTH_ERROR = -5,
+  /*! \hideinitializer
+    An arithmetic overflow occurred and the computation was consequently
+    interrupted.  This can <EM>only</EM> happen in library's incarnations
+    using bounded integers as coefficients. */
+  PPL_ARITHMETIC_OVERFLOW = -6,
+  /*! \hideinitializer
+    An error occurred during a C input/output operation.  A more
+    precise indication of what went wrong is available via
+    <CODE>errno</CODE>. */
+  PPL_STDIO_ERROR = -7,
+  /*! \hideinitializer
+    An internal error that was diagnosed by the PPL itself.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_INTERNAL_ERROR = -8,
+  /*! \hideinitializer
+    A standard exception has been raised by the C++ run-time environment.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+  /*! \hideinitializer
+    A totally unknown, totally unexpected error happened.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNEXPECTED_ERROR = -10
+};
+
+/*! \brief
+  Installs the user-defined error handler pointed at by \p h.
+
+  The error handler takes an error code and a textual description that
+  gives further information about the actual error.  The C string
+  containing the textual description is read-only and its existence is
+  not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+					   const char* description)));
+
+/*@}*/ /* Error */
+
+/*! \defgroup Version Version Checking */
+/*@{*/
+
+#include "ppl_c_version.h"
+
+/*! \brief
+  Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+  Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+  Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+  Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the
+  PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the PPL banner.
+
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \defgroup Dimension Space Dimension */
+/*@{*/
+
+/*! \brief
+  An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \brief
+  Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*@}*/ /* Dimension */
+
+/*! \defgroup Init Library Initialization and Finalization */
+/*@{*/
+
+/*! \brief
+  Initializes the Parma Polyhedra Library.
+  This function must be called before any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+  Finalizes the Parma Polyhedra Library.
+  This function must be called after any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+int
+ppl_set_rounding_for_PPL PPL_PROTO((void));
+
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
+
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+int
+ppl_restore_pre_PPL_rounding PPL_PROTO((void));
+
+/*@}*/ /* Init */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type)                                    \
+/*! \brief Opaque pointer. */                                         \
+typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t;              \
+/*! \brief Opaque pointer to const object. */                         \
+typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
+
+PPL_TYPE_DECLARATION(Coefficient);
+
+PPL_TYPE_DECLARATION(Linear_Expression);
+
+PPL_TYPE_DECLARATION(Constraint);
+
+PPL_TYPE_DECLARATION(Constraint_System);
+
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Generator);
+
+PPL_TYPE_DECLARATION(Generator_System);
+
+PPL_TYPE_DECLARATION(Generator_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Congruence);
+
+PPL_TYPE_DECLARATION(Congruence_System);
+
+PPL_TYPE_DECLARATION(Congruence_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Grid_Generator);
+
+PPL_TYPE_DECLARATION(Grid_Generator_System);
+
+PPL_TYPE_DECLARATION(Grid_Generator_System_const_iterator);
+
+PPL_TYPE_DECLARATION(MIP_Problem);
+
+
+/*! \defgroup IO Simple I/O Functions */
+/*@{*/
+
+/*! \brief Pretty-prints \p var to <CODE>stdout</CODE>. */
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief Pretty-prints \p var to the given output \p stream. */
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+/*! \brief
+  The type of output functions used for printing variables.
+
+  An output function for variables must write a textual representation
+  for \p var to a character buffer, null-terminate it, and return a
+  pointer to the beginning of the buffer.  In case the operation fails,
+  0 should be returned and perhaps <CODE>errno</CODE> should be set
+  in a meaningful way.  The library does nothing with the buffer, besides
+  printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+  Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+  Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_FUNCTIONS
+#undef PPL_DECLARE_OUTPUT_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
+int \
+ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
+ \
+/*! \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
+
+#define PPL_DECLARE_ASCII_DUMP_FUNCTIONS(Type) \
+/*! \brief Dumps an ascii representation of \p x on \p stream. */ \
+int \
+ppl_ ## Type ## _ascii_dump PPL_PROTO((ppl_const_ ## Type ## _t x, \
+                                       FILE* stream));
+
+#define PPL_DECLARE_OUTPUT_FUNCTIONS(Type) \
+PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+PPL_DECLARE_ASCII_DUMP_FUNCTIONS(Type)
+
+/*@}*/ /* Simple I/O Functions */
+
+
+/*! \defgroup Coefficient Coefficients */
+/*@{*/
+
+/*! \brief
+  Creates a new coefficient with value 0 and writes a handle for the
+  newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \brief
+  Creates a new coefficient with the value given by the GMP integer
+  \p z and writes a handle for the newly created coefficient
+  at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \brief
+  Builds a coefficient that is a copy of \p c; writes a handle
+  for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+						ppl_const_Coefficient_t c));
+
+/*! \brief
+  Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \brief
+  Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \brief
+  Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded; returns 0
+  otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/* No ascii dump for Coefficient */
+PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
+
+/*@}*/ /* Coefficients */
+
+
+/*! \defgroup Linear_Expression Linear Expressions */
+/*@{*/
+
+/*! \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  zero-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  <TT>d</TT>-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \brief
+  Builds a linear expression that is a copy of \p le; writes a handle
+  for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Builds a linear expression corresponding to constraint \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \brief
+  Builds a linear expression corresponding to generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \brief
+  Builds a linear expression corresponding to congruence \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Congruence
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Congruence_t c));
+
+/*! \brief
+  Builds a linear expression corresponding to grid generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Grid_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Grid_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p le: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Adds \p n to the coefficient of variable \p var in the linear
+  expression \p le.  The space dimension is set to be the maximum
+  between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+	   ppl_dimension_type var,
+	   ppl_const_Coefficient_t n));
+
+/*! \brief
+  Adds \p n to the inhomogeneous term of the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \brief
+  Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \brief
+  Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+					     ppl_dimension_type var,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p le is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p le is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Linear_Expression)
+
+/*@}*/ /* Linear Expressions */
+
+
+/*! \brief
+  Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+  /*! The constraint is of the form \f$e < 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN,
+  /*! The constraint is of the form \f$e \leq 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL,
+  /*! The constraint is of the form \f$e = 0\f$. */
+  PPL_CONSTRAINT_TYPE_EQUAL,
+  /*! The constraint is of the form \f$e \geq 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL,
+  /*! The constraint is of the form \f$e > 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+
+/*! \defgroup Constraint Constraints */
+/*@{*/
+
+/*! \brief
+  Creates the new constraint `\p le \p rel 0' and writes a handle for
+  it at address \p pc.  The space dimension of the new constraint is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+			      ppl_const_Linear_Expression_t le,
+			      enum ppl_enum_Constraint_Type rel));
+
+/*! \brief
+  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+  and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \brief
+  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+  also known as <EM>positivity constraint</EM>.
+  A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \brief
+  Builds a constraint that is a copy of \p c; writes a handle
+  for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+					      ppl_const_Constraint_t c));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \brief
+  Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+						 ppl_const_Constraint_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+					  ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+				      ppl_dimension_type var,
+				      ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Constraint)
+
+/*@}*/ /* Constraints */
+
+
+/*! \defgroup Constraint_System Constraint Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of constraints and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \brief
+  Builds a zero-dimensional, unsatisfiable constraint system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \brief
+  Builds the singleton constraint system containing only a copy of
+  constraint \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \brief
+  Builds a constraint system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \brief
+  Returns a positive integer if \p cs contains no (non-trivial) constraint;
+  returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_empty
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Returns a positive integer if \p cs contains any (non-trivial) strict
+  inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Removes all the constraints from the constraint system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \brief
+  Inserts a copy of the constraint \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+						   ppl_const_Constraint_t c));
+
+/*! \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Constraint_System)
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p cit; writes an
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+	   ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+	   ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+	   ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+	   ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Dereference \p cit writing a const handle to the resulting
+  constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+	   ppl_const_Constraint_t* pc));
+
+/*! \brief
+  Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+	   ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Constraint Systems */
+
+
+/*! \brief
+  Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+  /*! The generator is a line. */
+  PPL_GENERATOR_TYPE_LINE,
+  /*! The generator is a ray. */
+  PPL_GENERATOR_TYPE_RAY,
+  /*! The generator is a point. */
+  PPL_GENERATOR_TYPE_POINT,
+  /*! The generator is a closure point. */
+  PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+/*! \defgroup Generator Generators */
+/*@{*/
+
+/*! \brief
+  Creates a new generator of direction \p le and type \p t.  If the
+  generator to be created is a point or a closure point, the divisor
+  \p d is applied to \p le.  For other types of generators \p d is
+  simply disregarded.  A handle for the new generator is written at
+  address \p pg.  The space dimension of the new generator is equal to
+  the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+			     ppl_const_Linear_Expression_t le,
+			     enum ppl_enum_Generator_Type t,
+			     ppl_const_Coefficient_t d));
+
+/*! \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new generator at address
+  \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \brief
+  Creates, as a closure point, the point that is the origin of the
+  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
+  generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \brief
+  Builds a generator that is a copy of \p g; writes a handle
+  for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+					    ppl_const_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \brief
+  Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+					       ppl_const_Generator_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+					 ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+				     ppl_dimension_type var,
+				     ppl_Coefficient_t n));
+
+/*! \brief
+  If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+				 ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Generator)
+
+/*@}*/ /* Generators */
+
+
+/*! \defgroup Generator_System Generator Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \brief
+  Builds the singleton generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+						   ppl_const_Generator_t g));
+
+/*! \brief
+  Builds a generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \brief
+  Returns a positive integer if \p gs contains no generators;
+  returns 0 otherwise.
+*/
+int
+ppl_Generator_System_empty
+PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Removes all the generators from the generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \brief
+  Inserts a copy of the generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+						 ppl_const_Generator_t g));
+
+/*! \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t gs));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Generator_System)
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p git; writes an
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+	   ppl_const_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+	   ppl_const_Generator_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+	   ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+	   ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Dereference \p git writing a const handle to the resulting
+  generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+	   ppl_const_Generator_t* pg));
+
+/*! \brief
+  Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+	   ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Generator Systems */
+
+/*! \defgroup Congruence Congruences */
+/*@{*/
+
+/*! \brief
+  Creates the new congruence \f$le = 0 \pmod{m}\f$ and writes a handle for
+  it at address \p pc.  The space dimension of the new congruence is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+			      ppl_const_Linear_Expression_t le,
+			      ppl_const_Coefficient_t m));
+
+/*! \brief
+  Creates the unsatisfiable (zero-dimension space) congruence
+  \f$0 = 1 \pmod{0}\f$ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_false PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \brief
+  Creates the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+  also known as <EM>integrality congruence</EM>.
+  A handle for the newly created congruence is written at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_integrality PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \brief
+  Builds a congruence that is a copy of \p c; writes a handle
+  for the newly created congruence at address \p pc.
+*/
+int
+ppl_new_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+					      ppl_const_Congruence_t c));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence PPL_PROTO((ppl_const_Congruence_t c));
+
+/*! \brief
+  Assigns a copy of the congruence \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t dst,
+						 ppl_const_Congruence_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Congruence_space_dimension PPL_PROTO((ppl_const_Congruence_t c,
+					  ppl_dimension_type* m));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  congruence \p c.
+*/
+int
+ppl_Congruence_coefficient PPL_PROTO((ppl_const_Congruence_t c,
+				      ppl_dimension_type var,
+				      ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of congruence \p c.
+*/
+int
+ppl_Congruence_inhomogeneous_term PPL_PROTO((ppl_const_Congruence_t c,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p m the modulus of congruence \p c.
+*/
+int
+ppl_Congruence_modulus PPL_PROTO((ppl_const_Congruence_t c,
+				  ppl_Coefficient_t m));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Congruence_OK PPL_PROTO((ppl_const_Congruence_t c));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Congruence)
+
+/*@}*/ /* Congruences */
+
+
+/*! \defgroup Congruence_System Congruence Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of congruences and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Congruence_System PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \brief
+  Builds a zero-dimensional, unsatisfiable congruence system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_zero_dim_empty
+PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \brief
+  Builds the singleton congruence system containing only a copy of
+  congruence \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_t c));
+
+/*! \brief
+  Builds a congruence system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs));
+
+/*! \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*! \brief
+  Assigns a copy of the congruence system \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Congruence_System_space_dimension
+PPL_PROTO((ppl_const_Congruence_System_t cs, ppl_dimension_type* m));
+
+/*! \brief
+  Returns a positive integer if \p cs contains no (non-trivial) congruence;
+  returns 0 otherwise.
+*/
+int
+ppl_Congruence_System_empty
+PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*! \brief
+  Removes all the congruences from the congruence system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Congruence_System_clear PPL_PROTO((ppl_Congruence_System_t cs));
+
+/*! \brief
+  Inserts a copy of the congruence \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Congruence_System_insert_Congruence PPL_PROTO((ppl_Congruence_System_t cs,
+						   ppl_const_Congruence_t c));
+
+/*! \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Congruence_System_OK PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Congruence_System)
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p cit; writes an
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit,
+	   ppl_const_Congruence_System_const_iterator_t cit));
+
+/*! \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System_const_iterator
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t dst,
+	   ppl_const_Congruence_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the congruence system \p cs.
+*/
+int
+ppl_Congruence_System_begin
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+	   ppl_Congruence_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  congruence system \p cs.
+*/
+int
+ppl_Congruence_System_end
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+	   ppl_Congruence_System_const_iterator_t cit));
+
+/*! \brief
+  Dereference \p cit writing a const handle to the resulting
+  congruence at address \p pc.
+*/
+int
+ppl_Congruence_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit,
+	   ppl_const_Congruence_t* pc));
+
+/*! \brief
+  Increment \p cit so that it "points" to the next congruence.
+*/
+int
+ppl_Congruence_System_const_iterator_increment
+PPL_PROTO((ppl_Congruence_System_const_iterator_t cit));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Congruence_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t x,
+	   ppl_const_Congruence_System_const_iterator_t y));
+
+/*@}*/ /* Congruence Systems */
+
+
+/*! \brief
+  Describes the different kinds of grid generators.
+*/
+enum ppl_enum_Grid_Generator_Type {
+  /*! The grid generator is a line. */
+  PPL_GRID_GENERATOR_TYPE_LINE,
+  /*! The grid generator is a parameter. */
+  PPL_GRID_GENERATOR_TYPE_PARAMETER,
+  /*! The grid generator is a point. */
+  PPL_GRID_GENERATOR_TYPE_POINT
+};
+
+/*! \defgroup Grid_Generator Grid_Generators */
+/*@{*/
+
+/*! \brief
+  Creates a new grid generator of direction \p le and type \p t.  If the
+  grid generator to be created is a point or a parameter, the divisor
+  \p d is applied to \p le.  If it is a line, \p d is simply disregarded.
+  A handle for the new grid generator is written at address \p pg.
+  The space dimension of the new grid generator is equal to the space
+  dimension of \p le.
+*/
+int
+ppl_new_Grid_Generator PPL_PROTO((ppl_Grid_Generator_t* pg,
+				  ppl_const_Linear_Expression_t le,
+				  enum ppl_enum_Grid_Generator_Type t,
+				  ppl_const_Coefficient_t d));
+
+/*! \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new grid generator at address
+  \p pg.
+*/
+int
+ppl_new_Grid_Generator_zero_dim_point PPL_PROTO((ppl_Grid_Generator_t* pg));
+
+/*! \brief
+  Builds a grid generator that is a copy of \p g; writes a handle
+  for the newly created grid generator at address \p pg.
+*/
+int
+ppl_new_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t* pg, ppl_const_Grid_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*! \brief
+  Assigns a copy of the grid generator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t dst,
+	   ppl_const_Grid_Generator_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Grid_Generator_space_dimension PPL_PROTO((ppl_const_Grid_Generator_t g,
+					      ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of grid generator \p g.
+*/
+int
+ppl_Grid_Generator_type PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  grid generator \p g.
+*/
+int
+ppl_Grid_Generator_coefficient PPL_PROTO((ppl_const_Grid_Generator_t g,
+					  ppl_dimension_type var,
+					  ppl_Coefficient_t n));
+
+/*! \brief
+  If \p g is a point or a parameter assigns its divisor to \p n.
+*/
+int
+ppl_Grid_Generator_divisor PPL_PROTO((ppl_const_Grid_Generator_t g,
+				      ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_OK PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Grid_Generator)
+
+/*@}*/ /* Grid_Generators */
+
+
+/*! \defgroup Grid_Generator_System Grid_Generator Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of grid generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of grid generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*! \brief
+  Builds the singleton grid generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+	   ppl_const_Grid_Generator_t g));
+
+/*! \brief
+  Builds a grid generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+	   ppl_const_Grid_Generator_System_t gs));
+
+/*! \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*! \brief
+  Assigns a copy of the grid generator system \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t dst,
+	   ppl_const_Grid_Generator_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Grid_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \brief
+  Returns a positive integer if \p gs contains no generator;
+  returns 0 otherwise.
+*/
+int
+ppl_Grid_Generator_System_empty
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*! \brief
+  Removes all the generators from the grid generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Grid_Generator_System_clear PPL_PROTO((ppl_Grid_Generator_System_t gs));
+
+/*! \brief
+  Inserts a copy of the grid generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t gs,
+	   ppl_const_Grid_Generator_t g));
+
+/*! \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_System_OK PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(Grid_Generator_System)
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p git; writes an
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit,
+	   ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t dst,
+	   ppl_const_Grid_Generator_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_begin
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+	   ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_end
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+	   ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Dereference \p git writing a const handle to the resulting
+  grid generator at address \p pg.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git,
+	   ppl_const_Grid_Generator_t* pg));
+
+/*! \brief
+  Increment \p git so that it "points" to the next grid generator.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t x,
+	   ppl_const_Grid_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Grid_Generator Systems */
+
+
+/*! \brief
+  Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief
+  Code of the worst-case exponential but typically polynomial
+  complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief
+  Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief
+  Code of the "unfeasible MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \brief
+  Code of the "unbounded MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \brief
+  Code of the "optimized MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \brief
+  Code of the "maximization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+/*! \brief
+  Code of the "minimization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+/*! \brief
+  Individual bit saying that the polyhedron and the set of points
+  satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief
+  Individual bit saying that the polyhedron intersects the set of
+  points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief
+  Individual bit saying that the polyhedron is included in the set of
+  points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief
+  Individual bit saying that the polyhedron is included in the set of
+  points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief
+  Individual bit saying that adding the generator would not change the
+  polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+
+/*! \defgroup MIP_Problem MIP Problems */
+/*@{*/
+
+/*! \brief
+  Builds a trivial MIP problem of dimension \p d and writes an
+  handle to it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_space_dimension PPL_PROTO((ppl_MIP_Problem_t* pmip,
+						    ppl_dimension_type d));
+
+/*! \brief
+  Builds an MIP problem of space dimension \p d having feasible region \p cs,
+  objective function \p le and optimization mode \p m; writes a handle to
+  it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem PPL_PROTO((ppl_MIP_Problem_t* pmip,
+			       ppl_dimension_type d,
+			       ppl_const_Constraint_System_t cs,
+			       ppl_const_Linear_Expression_t le,
+			       int m));
+
+/*! \brief
+  Builds an MIP problem that is a copy of \p mip; writes a handle
+  for the newly created system at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t* pmip, ppl_const_MIP_Problem_t mip));
+
+/*! \brief
+  Invalidates the handle \p mip: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_MIP_Problem PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \brief
+  Assigns a copy of the MIP problem \p src to \p dst.
+*/
+int
+ppl_assign_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t dst, ppl_const_MIP_Problem_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p mip.
+*/
+int
+ppl_MIP_Problem_space_dimension
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m the number of integer space dimensions of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \brief
+  Writes in the first positions of the array \p ds all the integer space
+  dimensions of problem \p mip. If the array is not big enough to hold
+  all of the integer space dimensions, the behavior is undefined.
+*/
+int
+ppl_MIP_Problem_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type ds[]));
+
+/*! \brief
+  Writes to \p m the number of constraints defining
+  the feasible region of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_constraints PPL_PROTO((ppl_const_MIP_Problem_t mip,
+						 ppl_dimension_type* m));
+
+/*! \brief
+  Writes at address \p pc a const handle to the \p i-th constraint
+  defining the feasible region of the MIP problem \p mip
+*/
+int
+ppl_MIP_Problem_constraint_at_index PPL_PROTO((ppl_const_MIP_Problem_t mip,
+					       ppl_dimension_type i,
+					       ppl_const_Constraint_t* pc));
+
+/*! \brief
+  Writes a const handle to the linear expression defining the
+  objective function of the MIP problem \p mip at address \p ple.
+*/
+int
+ppl_MIP_Problem_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Linear_Expression_t* ple));
+
+/*! \brief
+  Returns the optimization mode of the MIP problem \p mip.
+*/
+int
+ppl_MIP_Problem_optimization_mode PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \brief
+  Resets the MIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_MIP_Problem_clear PPL_PROTO((ppl_MIP_Problem_t mip));
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the MIP problem \p mip
+  and to \p mip itself.
+*/
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type d));
+
+/*! \brief
+  Sets the space dimensions that are specified in first \p n positions
+  of the array \p ds to be integer dimensions of problem \p mip.
+  The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type ds[], size_t n));
+
+/*! \brief
+  Modifies the feasible region of the MIP problem \p mip by adding a copy
+  of the constraint \p c.
+*/
+int
+ppl_MIP_Problem_add_constraint PPL_PROTO((ppl_MIP_Problem_t mip,
+					  ppl_const_Constraint_t c));
+
+/*! \brief
+  Modifies the feasible region of the MIP problem \p mip by adding a copy
+  of the constraints in \p cs.
+*/
+int
+ppl_MIP_Problem_add_constraints PPL_PROTO((ppl_MIP_Problem_t mip,
+					   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Sets the objective function of the MIP problem \p mip to a copy of \p le.
+*/
+int
+ppl_MIP_Problem_set_objective_function
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Sets the optimization mode of the MIP problem \p mip to \p mode.
+*/
+int
+ppl_MIP_Problem_set_optimization_mode PPL_PROTO((ppl_MIP_Problem_t mip,
+						 int mode));
+
+/*! \brief
+  Returns a positive integer if \p mip is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_MIP_Problem_is_satisfiable PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \brief
+  Solves the MIP problem \p mip, returning an exit status.
+
+  \return
+  <CODE>PPL_MIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the MIP problem
+  is not satisfiable;
+  <CODE>PPL_MIP_PROBLEM_STATUS_UNBOUNDED</CODE> if the MIP problem
+  is satisfiable but there is no finite bound to the value of
+  the objective function;
+  <CODE>PPL_MIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the MIP problem
+  admits an optimal solution.
+*/
+int
+ppl_MIP_Problem_solve PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \brief
+  Evaluates the objective function of \p mip on point \p g.
+
+  \param mip
+  The MIP problem defining the objective function;
+
+  \param g
+  The generator on which the objective function will be evaluated;
+
+  \param num
+  Will be assigned the numerator of the objective function value;
+
+  \param den
+  Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_MIP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Generator_t g,
+	   ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+  Writes a const handle to a feasible point for the MIP problem \p mip
+  at address \p pg.
+*/
+int
+ppl_MIP_Problem_feasible_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+					  ppl_const_Generator_t* pg));
+
+/*! \brief
+  Writes a const handle to an optimizing point for the MIP problem \p mip
+  at address \p pg.
+*/
+int
+ppl_MIP_Problem_optimizing_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+					    ppl_const_Generator_t* pg));
+
+/*! \brief
+  Returns the optimal value for \p mip.
+
+  \param mip
+  The MIP problem;
+
+  \param num
+  Will be assigned the numerator of the optimal value;
+
+  \param den
+  Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_MIP_Problem_optimal_value
+PPL_PROTO((ppl_const_MIP_Problem_t mip,
+	   ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+  Returns a positive integer if \p mip is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p mip is broken.  Useful for debugging purposes.
+*/
+int
+ppl_MIP_Problem_OK PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+PPL_DECLARE_OUTPUT_FUNCTIONS(MIP_Problem)
+
+/*@}*/ /* MIP Problems */
diff --git a/interfaces/C/ppl_interface_generator_c_procedure_generators.m4 b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4
new file mode 100644
index 0000000..769c874
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4
@@ -0,0 +1,58 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of procedures
+dnl for the C interface; this includes:
+dnl - the list in the imported file and any C specific procedures.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl m4_procedure_list
+dnl This is the main procedure for generating the C code.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_procedure_list', `m4_echo_unquoted(`m4_common_procedure_list',
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s +simple,
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@ +simple,
+ppl_ at CLASS@_add_recycled_ at ADD_REPRESENT@ +simple,
+ppl_ at CLASS@_add_recycled_ at ADD_REPRESENT@s +simple,
+)
+')
+
+dnl IMPLEMENTATION CODE MISSING FOR:
+dnl ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@/2 +polyhedron,
+dnl ppl_ at CLASS@_get_bounding_box/3 +simple,
+dnl ppl_ at CLASS@_get_covering_box/2 +grid,
+dnl ppl_ at CLASS@_ascii_dump/1 +simple_pps,
+dnl ppl_ at CLASS@_get_disjunct/2 +pointset_powerset,
+dnl ppl_ at CLASS@_ at PARTITION@/4 +pointset_powerset \grid,
+dnl ppl_ at CLASS@_approximate_partition/5 +pointset_powerset \shape,
+dnl ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2 +pointset_powerset,
+dnl ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3 +pointset_powerset,
+dnl ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3 -pointset_powe
diff --git a/interfaces/Java/Java_interface.dox b/interfaces/Java/Java_interface.dox
new file mode 100644
index 0000000..fdf03aa
--- /dev/null
+++ b/interfaces/Java/Java_interface.dox
@@ -0,0 +1,2044 @@
+/* Documentation for the Java interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \mainpage Java Language Interface
+
+The Parma Polyhedra Library comes equipped with an interface for the
+Java language.
+
+The system-independent features of the library are described in
+Section \ref PI_SI_Features "System-Independent Features".
+Section \ref OI_Compilation "Compilation and Installation"
+explains how the various incarnations of the Prolog interface
+are compiled and installed.
+Section \ref PI_SD_Features "System-Dependent Features"
+illustrates the system-dependent features of the interface
+for all the supported systems.
+
+In the sequel, <CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+
+\anchor PI_SI_Features
+<H1>System-Independent Features</H1>
+
+The Java interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in Sections
+\extref{preamble, The Main Features}, \extref{convex_polys, Convex Polyhedra},
+\extref{representation, Representations of Convex Polyhedra}
+and \extref{Operations_on_Convex_Polyhedra, Operations on Convex Polyhedra}
+in the main PPL user manual.
+Here we just describe those aspects that are specific to the Java interface.
+
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- The Prolog interface files are all installed in the directory
+  <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+  dynamically loaded libraries, you must make your dynamic
+  linker/loader aware of this fact.  If you use a GNU/Linux system,
+  try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+  for more information.
+- The Prolog interface to the PPL is initialized and finalized by the
+  predicates <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>.
+  Thus the only interface predicates callable after
+  <CODE>ppl_finalize/0</CODE> are <CODE>ppl_finalize/0</CODE> itself
+  (this further call has no effect) and <CODE>ppl_initialize/0</CODE>,
+  after which the interface's services are usable again.
+  Some Prolog systems allow the specification of initialization
+  and deinitialization functions in their foreign language interfaces.
+  The corresponding incarnations of the PPL-Prolog interface
+  have been written so that <CODE>ppl_initialize/0</CODE> and/or
+  <CODE>ppl_finalize/0</CODE> are called automatically.
+  Section \ref PI_SD_Features "System-Dependent Features" will detail
+  in which cases initialization and finalization is automatically
+  performed or is left to the Prolog programmer's responsibility.
+  However, for portable applications, it is best
+  to invoke <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>
+  explicitly: since they can be called multiple times without problems,
+  this will result in enhanced portability at a cost that is, by all means,
+  negligible.
+
+- A PPL polyhedron can only be accessed by means of a Prolog term
+  called a <EM>handle</EM>.
+  Note, however, that the data structure of a handle,
+  is implementation-dependent, system-dependent and
+  version-dependent, and, for this reason, deliberately left unspecified.
+  What we do guarantee is that the handle requires very little memory.
+
+- A Prolog term can be bound to a valid handle by using
+  predicates such as
+\code
+  ppl_new_C_Polyhedron_from_space_dimension/3,
+  ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+  ppl_new_C_Polyhedron_from_constraints/2,
+  ppl_new_C_Polyhedron_from_generators/2,
+  ppl_new_C_Polyhedron_from_bounding_box/2.
+\endcode
+  These predicates will create or copy a PPL polyhedron
+  and construct a valid handle for referencing it.
+  The last argument is a Prolog term that is
+  unified with a new valid handle for accessing this polyhedron.
+
+- As soon as a PPL polyhedron is no longer required,
+  the memory occupied by it should be released
+  using the PPL predicate <CODE>ppl_delete_Polyhedron/1</CODE>.
+  To understand why this is important,
+  consider a Prolog program and a variable that is bound to
+  a Herbrand term.
+  When the variable dies (goes out of scope) or is uninstantiated
+  (on backtracking) the term it is bound to is amenable to garbage collection.
+  But this only applies for the standard domain of the language:
+  Herbrand terms.
+  In Prolog+PPL, when a variable bound to a handle for a PPL Polyhedron dies
+  or is uninstantiated,
+  the handle can be garbage-collected, but the polyhedra to which
+  the handle refers will not be released.
+  Once a handle has been used as an argument in
+  <CODE>ppl_delete_Polyhedron/1</CODE>,
+  it becomes invalid.
+
+- For a PPL polyhedron with space dimension \p k,
+  the identifiers used for the PPL variables
+  must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+  associated Cartesian axes.
+  When using the predicates that combine PPL polyhedra
+  or add constraints or generators to a representation of
+  a PPL polyhedron,
+  the polyhedra referenced and any constraints or generators in the call
+  should follow all the (space) dimension-compatibility rules stated in
+  Section \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+
+- As explained above, a polyhedron has a fixed topology C or NNC,
+  that is determined at the time of its initialization.
+  All subsequent operations on the polyhedron must respect all the
+  topological compatibility rules stated in Section
+  \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+
+- Any application using the PPL should make sure that only the
+  intended version(s) of the library are ever used.
+  Predicates
+\code
+  ppl_version_major/1,
+  ppl_version_minor/1,
+  ppl_version_revision/1,
+  ppl_version_beta/1,
+  ppl_version/1,
+  ppl_banner.
+\endcode
+  allow run-time checking of information about the version being used.
+
+<H2>PPL Predicate List</H2>
+
+Here is a list of all the PPL predicates provided by the Prolog interface.
+
+<CODE>
+  ppl_version_major(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_minor(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_revision(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_beta(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version(?Atom)
+</CODE>
+
+<CODE>
+  ppl_banner(?Atom)
+</CODE>
+
+<CODE>
+  ppl_max_space_dimension(?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Coefficient_is_bounded
+</CODE>
+
+<CODE>
+  ppl_Coefficient_max(?Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Coefficient_min(?Coefficient)
+</CODE>
+
+<CODE>
+  ppl_initialize
+</CODE>
+
+<CODE>
+  ppl_finalize
+</CODE>
+
+<CODE>
+  ppl_set_timeout_exception_atom(+Atom)
+</CODE>
+
+<CODE>
+  ppl_set_timeout(+C_unsigned)
+</CODE>
+
+<CODE>
+  ppl_reset_timeout
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_delete_Polyhedron(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_minimized_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_minimized_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, -Relation)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_relation_with_generator(+Handle, +Generator, -Relation)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_bounding_box(+Handle, +Complexity, -Box)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_empty(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_universe(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_bounded(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_contains_integer_point(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr,
+                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr,
+                                     ?Coefficient_1, ?Coefficient_2,
+                                     ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr,
+                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr,
+                                     ?Coefficient_1, ?Coefficient_2,
+                                     ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_topologically_closed(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_OK(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generator(+Handle, +Generator)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraints_and_minimize(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generators(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generators_and_minimize(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_simplify_using_context_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_affine_image(+Handle,
+                                      +PPL_Var,
+                                      +Lin_Expr_1,
+                                      +Lin_Expr_2,
+                                      +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_generalized_affine_image(+Handle,
+					  +PPL_Var,
+					  +Relation_Symbol,
+					  +Lin_Expr,
+					  +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+						  +Lin_Expr_1,
+						  +Relation_Symbol,
+						  +Lin_Expr_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2,
+					+C_unsigned_1, ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+                                                     +Handle_2,
+						     +Constraint_System,
+						     +C_unsigned_1,
+						     ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+						     +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+                                                     +Handle_2,
+						     +Constraint_System,
+						     +C_unsigned_1,
+						     ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+						     +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2,
+						+C_unsigned_1,
+						?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1,
+                                                  +Handle_2,
+						  +Constraint_System,
+						   +C_unsigned_1,
+						   ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2,
+						  +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1,
+                                                  +Handle_2,
+						  +Constraint_System,
+						  +C_unsigned_1,
+						  ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2,
+						  +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_topological_closure_assign(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func))
+</CODE>
+
+<CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                      -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_MIP_Problem_from_MIP_Problem(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, -Vars_List)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_feasible_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_optimizing_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                              ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE>
+
+
+<H2>PPL Predicate Specifications</H2>
+
+The PPL predicates provided by the Prolog interface are specified below.
+The specification uses the following grammar rules:
+\code
+
+ Number      --> unsigned integer	ranging from 0 to an upper bound
+					depending on the actual Prolog system.
+
+ C_int       --> Number | - Number	C integer
+
+ C_unsigned  --> Number			C unsigned integer
+
+ Coefficient --> Number			used in linear expressions;
+					the upper bound will depend on how
+					the PPL has been configured
+
+ Dimension_Type
+             --> Number			used for the number of affine and
+					space dimensions and the names of
+ 					the dimensions;
+					the upper bound will depend on
+					the maximum number of dimensions
+					allowed by the PPL
+					(see ppl_max_space_dimensions/1)
+
+ Boolean     --> true | false
+
+ Handle      --> Prolog term		used to identify a Polyhedron
+
+ Topology    --> c | nnc		Polyhedral kind;
+					c is closed and nnc is NNC
+
+ VarId       --> Dimension_Type 	variable identifier
+
+ PPL_Var     --> '$VAR'(VarId)		PPL variable
+
+ Lin_Expr    --> PPL_Var		PPL variable
+            | Coefficient
+            | Lin_Expr			unary plus
+            | - Lin_Expr		unary minus
+            | Lin_Expr + Lin_Expr	addition
+            | Lin_Expr - Lin_Expr	subtraction
+            | Coefficient * Lin_Expr	multiplication
+            | Lin_Expr * Coefficient	multiplication
+
+ Relation_Symbol
+	     --> =			equals
+            | =< 			less than or equal
+            | >=			greater than or equal
+            | < 			strictly less than
+            | > 			strictly greater than
+
+ Constraint  --> Lin_Expr Relation_Symbol Lin_Expr
+					constraint
+
+ Constraint_System			list of constraints
+             --> []
+            | [Constraint | Constraint_System]
+
+ Generator_Denominator --> Coefficient	must be non-zero
+	    | Coefficient
+            | - Coefficient
+
+ Generator   --> point(Lin_Expr)	point
+            | point(Lin_Expr, Generator_Denominator)
+					point
+            | closure_point(Lin_Expr)	closure point
+            | closure_point(Lin_Expr, Generator_Denominator)
+					closure point
+            | ray(Lin_Expr)		ray
+            | line(Lin_Expr)		line
+
+ Generator_System			list of generators
+             --> []
+	    | [Generator | Generator_System]
+
+ Atom        --> Prolog atom
+
+ Universe_or_Empty			polyhedron
+             --> universe
+            | empty
+
+ Poly_Relation				polyhedron relation:
+             --> is_disjoint		with a constraint
+	    | strictly_intersects	with a constraint
+	    | is_included		with a constraint
+	    | saturates			with a constraint
+            | subsumes			with a generator
+
+ Poly_Relation_List			list of polyhedron relations
+	     --> []
+	    | [Poly_Relation | Poly_Relation_List]
+
+ Complexity  --> polynomial | simplex | any
+
+ Rational_Numerator
+	     --> Coefficient | - Coefficient
+
+ Rational_Denominator
+	     --> Coefficient		must be non-zero
+
+ Rational    --> Rational_Numerator	rational number
+	    | Rational_Numerator/Rational_Denominator
+
+ Bound       --> c(Rational)		closed rational limit
+            | o(Rational)		open rational limit
+            | o(pinf)			unbounded in the positive direction
+            | o(minf)			unbounded in the negative direction
+
+ Interval    --> i(Bound, Bound)	rational interval
+
+ Box         --> []			list of intervals
+            | [Interval | Box]
+
+ Vars_Pair   --> PPLVar - PPLVar        map relation
+
+ P_Func      --> []    			list of map relations
+            | [Vars_Pair | P_Func].
+
+ Optimization_Mode
+             --> max | min
+
+ MIP_Problem_Status
+             --> unfeasible | unbounded | optimized
+
+ Vars_List   --> []    			list of PPL variables
+            | [PPL_Var | Vars_List].
+\endcode
+
+\anchor predicates
+Below is a short description of each of the interface predicates.
+For full definitions of terminology used here, see Sections
+\extref{preamble, The Main Features},
+\extref{convex_polys, Convex Polyhedra},
+\extref{representation, Representations of Convex Polyhedra} and
+\extref{Operations_on_Convex_Polyhedra, Operations on Convex Polyhedra}
+in the main PPL user manual.
+
+
+<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the revision number
+  of the PPL version.
+
+<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+
+<H2><CODE> ppl_version(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with the PPL version.
+
+<H2><CODE> ppl_banner(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with
+  information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+
+  Succeeds if and only if the Coefficients in the C++ interface are bounded.
+
+<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the maximum coefficient the C++ interface can handle is
+  unified with <CODE>Max</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the minimum coefficient the C++ interface can handle is
+  unified with <CODE>Min</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+
+  Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+  this library can handle.
+
+<H2><CODE>
+  ppl_initialize
+ </CODE></H2>
+
+  Initializes the PPL interface.
+  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+
+<H2><CODE>
+  ppl_finalize
+ </CODE></H2>
+
+  Finalizes the PPL interface.
+  Once this is executed, the next call to an interface predicate must
+  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.
+
+<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+
+   Sets the atom to be thrown by timeout exceptions
+   to <CODE>Atom</CODE>.
+   The default value is <CODE>time_out</CODE>.
+
+<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+
+   The atom to be thrown by timeout exceptions
+   is unified with <CODE>Atom</CODE>.
+
+<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+
+   Computations taking exponential time will be interrupted
+   some time after <CODE>C_unsigned</CODE> ms after that call.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>C_unsigned</CODE> must be strictly greater than zero.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+
+   Resets the timeout time so that the computation is not interrupted.
+
+<H2><CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates a C polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X).
+\endcode
+   creates the C polyhedron defining the 3-dimensional vector space
+   \f$\Rset^3\f$ with \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates an NNC polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$ with
+   \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as a C polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X),
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron(X, Y).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$
+   referenced by \p X
+   and then makes a copy, converting the topology to a C polyhedron.
+   with \p Y bound to a valid handle for accessing it.
+
+   When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+   care must be taken that the source polyhedron referenced by
+   <CODE>Handle_1</CODE> is topologically closed.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as an NNC polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   There must be no bounds of the form <CODE>o(Rational)</CODE>
+   in an interval in <CODE>Box</CODE>.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE> ppl_Polyhedron_swap(+Handle_1, +Handle_2) </CODE></H2>
+
+   Swaps the polyhedron referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+   The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
+
+   Deletes the polyhedron referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
+
+<H2><CODE> ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   polyhedron referenced by
+   <CODE>Handle</CODE> is embedded with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the actual dimension of the polyhedron referenced by
+   <CODE>Handle</CODE> with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_constraints(+Handle,
+                                                   ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a minimized list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_generators(+Handle, ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_generators(+Handle,
+                                                  ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a minimized list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint,
+               ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Constraint</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in Section
+\extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator(+Handle, +Generator,
+               ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Generator</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in
+Section \extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_get_bounding_box(+Handle,
+                                          +Complexity,
+            	                          ?Box) </CODE></H2>
+
+   Succeeds if and only if the bounding box
+   of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   unifies with the box defined by <CODE>Box</CODE>.
+   E.g.,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box).
+
+   Box = [i(o(minf), c(1/2)), i(o(0), o(pinf))].
+\endcode
+Note that the rational numbers in <CODE>Box</CODE> are in canonical form.
+E.g., the following will fail:
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box),
+      Box = [i(o(minf), c(2/4)), i(o(0), o(pinf))].
+\endcode
+
+The complexity class <CODE>Complexity</CODE> determining the algorithm
+to be used has the following meaning:
+- <CODE>polynomial</CODE> allows
+  code of the worst-case polynomial complexity class;
+- <CODE>simplex</CODE> allows
+  code of the worst-case exponential but typically polynomial
+  complexity class;
+- <CODE>any</CODE> allows
+  code of the universal complexity class.
+
+<H2><CODE> ppl_Polyhedron_is_empty(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is empty.
+
+<H2><CODE> ppl_Polyhedron_is_universe(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is the universe.
+
+<H2><CODE> ppl_Polyhedron_is_bounded(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is bounded.
+
+<H2><CODE> ppl_Polyhedron_contains_integer_point(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> contains at least one integer point.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H3><CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1,
+  			  ?Coefficient_2, ?Boolean)
+ </CODE></H3>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value and <CODE>Coefficient_2</CODE> with the denominator
+  of the supremum value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+ </CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value,
+  <CODE>Coefficient_2</CODE> with the denominator of the supremum value,
+  and <CODE>Point</CODE> with a point or closure point where
+  <CODE>Lin_Expr</CODE> reaches this value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1,
+			  ?Coefficient_2, ?Boolean)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the infimum value
+  and <CODE>Coefficient_2</CODE> with the denominator of the infimum value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the
+  infimum value, <CODE>Coefficient_2</CODE> with the denominator of
+  the infimum value, and <CODE>Point</CODE> with  a point or
+  closure point where <CODE>Lin_Expr</CODE> reaches this value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is topologically closed.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in or
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in but not
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+     </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is disjoint from
+   the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is
+   equal to the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_OK(+Handle) </CODE></H2>
+
+   Succeeds only if the polyhedron referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint(+Handle, +Constraint) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Constraint</CODE> to its constraint system.
+   Thus, the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_constraint(X, 4*A + B - 2*C >= 5).
+\endcode
+    will update the polyhedron with handle \p X to consist of
+    the set of points
+    in the vector space \f$\Rset^3\f$ satisfying the constraint
+    \f$4x + y - 2z >= 5\f$.
+
+   Note that <CODE>ppl_Polyhedron_add_constraint_and_minimize/2</CODE>
+   will fail if, after adding the constraint, the polyhedron is empty.
+
+<H2><CODE> ppl_Polyhedron_add_generator(+Handle, +Generator) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Generator</CODE> to its generator system.
+   Thus, after the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generator(X, point(-100*A - 5*B, 8)).
+\endcode
+    will update the polyhedron with handle \p X to be the single point
+    \f$(-12.5, -0.625, 0)^\transpose\f$ in the vector space \f$\Rset^3\f$.
+
+<H2><CODE> ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   | ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+        A = '$VAR'(0), B = '$VAR'(1),
+        ppl_Polyhedron_add_constraints(X, [4*A + B >= 3, A = 1]),
+        ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [4*A+1*B>=3,1*A=1] ?
+\endcode
+The updated polyhedron referenced by <CODE>Handle</CODE> can be empty
+and a query will succeed even when
+<CODE>Constraint_System</CODE> is unsatisfiable.
+
+<H2><CODE> ppl_Polyhedron_add_constraints_and_minimize(+Handle,
+                                   +Constraint_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1),
+      ppl_Polyhedron_add_constraints_and_minimize(X, [4*A + B >= 3, A = 1]),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*B>= -1,1*A=1]
+\endcode                                                                          This will fail if, after adding the constraints, the polyhedron is empty.
+   E.g., the following will fail,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      ppl_Polyhedron_add_constraints_and_minimize(X,
+        [4*A + B >= 3, A = 0, B =< 0]),
+      ppl_Polyhedron_get_constraints(X, CS).
+\endcode
+<H2><CODE> ppl_C_Polyhedron_add_generators(+Handle, +Generator_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   If the system of generators representing a polyhedron
+   is non-empty, then it must include a point
+   (see Section \extref{Generators_Representation, Generators Representation}
+    of the main PPL user manual).
+   Thus care must be taken to ensure that, before calling this
+   predicate, either the polyhedron referenced by <CODE>Handle</CODE>
+   is non-empty or that whenever <CODE>Generator_System</CODE> is
+   non-empty the first element defines a point.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators(X,
+        [point(1*A + 1*B + 1*C, 1), ray(1*A), ray(2*A)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [ray(2*A), point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_generators_and_minimize(+Handle,
+                                   +Generator_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   Unlike the predicate <CODE>ppl_add_generators</CODE>,
+   the order of the generators in
+   <CODE>Generator_System</CODE> is not important.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators_and_minimize(X,
+        [ray(1*A), ray(2*A), point(1*A + 1*B + 1*C, 1)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1,
+                     +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its intersection with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-hull with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-difference with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_simplify_using_context_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   a meet preserving enlargement enlargement and simplification of
+   the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_image(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the affine expression
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE> to <CODE>PPL_Var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
+
+<H2><CODE> ppl_Polyhedron_bounded_affine_image(+Handle,
+               +PPL_Var,
+               +Lin_Expr_1,
+               +Lin_Expr_2,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the image with respect to the transfer relation
+   <CODE>Lin_Expr_1/Coefficient <= PPL_Var <= Lin_Expr_2/Coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image(+Handle,
+               +PPL_Var,
+               +Relation_Symbol
+               +Lin_Expr,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>PPL_Var</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+               +Lin_Expr_1,
+               +Relation_Symbol
+               +Lin_Expr_2) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>Lin_Expr_1</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron \f$\cP\f$ referenced by <CODE>Handle_1</CODE>
+   the time-elapse \f$ (\cP \nearrow \cQ)\f$
+   with the polyhedron \f$\cQ\f$ referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_topological_closure_assign(+Handle) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle</CODE>
+   its topological closure.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
+
+   Embeds the polyhedron  referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_embed(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [],
+   GS = [point(0),line(1*A),line(1*B)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Updates the polyhedron \f$\cP_1\f$ referenced  by <CODE>Handle_1</CODE>
+   by first embedding \f$\cP_1\f$ in a new space enlarged by
+   the space dimensions
+   of the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   and then adds to its system of constraints
+   a renamed-apart version of the constraints of  \f$\cP_2\f$.
+
+   E.g.,
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      D = '$VAR'(3), E = '$VAR'(4),
+      ppl_new_NNC_Polyhedron_from_constraints([A > 1, B >= 0, C >= 0], Y),
+      ppl_Polyhedron_concatenate_assign(X, Y),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*C > 1, 1*D >= 0, 1*E >= 0]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project(+Handle,
+                   +Dimension_Type)
+ </CODE></H2>
+
+   Projects the polyhedron  referenced by <CODE>Handle</CODE>
+   onto a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_project(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [1*A = 0, 1*B = 0],
+   GS = [point(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions(+Handle,
+               +List_of_PPL_Vars) </CODE></H2>
+
+   Removes the space dimensions given by the identifiers of the
+   PPL variables in list <CODE>List_of_PPL_Vars</CODE>
+   from the polyhedron  referenced by <CODE>Handle</CODE>.
+   The identifiers for the remaining PPL variables are renumbered so that
+   they are consecutive and the maximum index is less than the number
+   of dimensions.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_remove_space_dimensions(X, [B]),
+      ppl_Polyhedron_space_dimension(X, K),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   K = 2,
+   GS = [point(0),line(1*A),line(1*B),line(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)) </CODE></H2>
+
+   Projects the polyhedron  referenced to by <CODE>Handle</CODE>
+   onto  the first <CODE>Dimension_Type</CODE> dimension.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(5, empty, X),
+      ppl_Polyhedron_remove_higher_space_dimensions(X, 3),
+      ppl_Polyhedron_space_dimension(X, K).
+\endcode
+
+<H2><CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE></H2>
+
+   <CODE>Dimension_Type</CODE> copies of the space dimension referenced by
+   <CODE>PPL_Var</CODE> are added to the polyhedron
+   referenced to by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE></H2>
+
+   The space dimensions referenced by the PPL variables in list
+   <CODE>List_of_PPL_Vars</CODE> are folded into the dimension referenced
+   by <CODE>PPL_Var</CODE> and removed.
+   The result is undefined if <CODE>List_of_PPL_Vars</CODE>
+   does not have the properties described in Section
+   \extref{fold_space_dimensions,
+   Folding Multiple Dimensions of the Vector Space into One Dimension}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)) </CODE></H2>
+
+   Maps the space dimensions of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   using the partial function defined by <CODE>P_Func</CODE>.
+   The result is undefined if \p P_Func does not encode a partial
+   function with the properties described in
+   Section \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+   Mapping the Dimensions of the Vector Space}
+   of the main PPL user manual.
+
+<H2><CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region
+   the vector space of dimension <CODE>Dimension_Type</CODE>,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                      -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with
+   the feasible region represented by <CODE>Constraint_System</CODE>,
+   objective function <CODE>Lin_Expr</CODE> and optimization mode
+   <CODE>Optimization_Mode</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE></H2>
+
+   Swaps the MIP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE></H2>
+
+   Deletes the MIP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL MIP Problem.
+
+<H2><CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   MIP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, -Vars_List)
+</CODE></H2>
+
+   Unifies <CODE>Vars_List</CODE> with a list of variables representing
+   representing the integer space dimensions of the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE></H2>
+
+   Unifies <CODE>Lin_Expr</CODE> with the objective function
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE></H2>
+
+   Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE></H2>
+
+  Resets the MIP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+
+<H2><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
+
+   Embeds the MIP problem referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+
+<H2><CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the variables in <CODE>Vars_List</CODE> are added to
+   the set of integer space dimensions.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>Constraint_System</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the objective function is changed to <CODE>Lin_Expr</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE></H2>
+
+  Succeeds if and only if the MIP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.
+
+<H2><CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE></H2>
+
+  Solves the MIP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>MIP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the MIP problem is not satisfiable;
+  <CODE>unbounded</CODE>, if the MIP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  <CODE>optimized</CODE>, if the MIP problem admits an optimal solution.
+
+<H2><CODE>
+  ppl_MIP_Problem_feasible_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with a feasible point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with an optimizing point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+
+  Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
+  with the numerator and denominator, respectively, for the optimal value
+  for the MIP problem  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+  Evaluates the objective function of the MIP problem  referenced by
+  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+  <CODE>Coefficient_1</CODE> is unified with the numerator and
+  <CODE>Coefficient_2</CODE> is unified with the denominator of the
+  objective function value at <CODE>Generator</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE></H2>
+
+   Succeeds only if the MIP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+\anchor OI_Compilation
+<H1>Compilation and Installation</H1>
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of the Java system.  If Java is correctly installed in a standard location,
+things are arranged so that the Java interface is built and installed.
+
+*/ /* \mainpage */
diff --git a/interfaces/Java/Makefile.am b/interfaces/Java/Makefile.am
new file mode 100644
index 0000000..56f6b61
--- /dev/null
+++ b/interfaces/Java/Makefile.am
@@ -0,0 +1,42 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = ppl_java jni . tests
+
+interface_generator_files = \
+ppl_interface_generator_java_procedure_generators.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+Java_interface.dox
+
+if BUILD_JAVA_INTERFACE
+
+jardir = $(pkglibdir)
+jar_DATA = ppl_java.jar
+
+ppl_java.jar: ppl_java/java_classes.stamp
+	$(JAR) cf ppl_java.jar ppl_java/*.class
+
+endif BUILD_JAVA_INTERFACE
+
+CLEANFILES = ppl_java.jar
diff --git a/interfaces/Java/Makefile.in b/interfaces/Java/Makefile.in
new file mode 100644
index 0000000..276dbad
--- /dev/null
+++ b/interfaces/Java/Makefile.in
@@ -0,0 +1,625 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(jardir)"
+jarDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(jar_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = ppl_java jni . tests
+interface_generator_files = \
+ppl_interface_generator_java_procedure_generators.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+Java_interface.dox
+
+ at BUILD_JAVA_INTERFACE_TRUE@jardir = $(pkglibdir)
+ at BUILD_JAVA_INTERFACE_TRUE@jar_DATA = ppl_java.jar
+CLEANFILES = ppl_java.jar
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Java/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Java/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-jarDATA: $(jar_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(jardir)" || $(MKDIR_P) "$(DESTDIR)$(jardir)"
+	@list='$(jar_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(jarDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(jardir)/$$f'"; \
+	  $(jarDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(jardir)/$$f"; \
+	done
+
+uninstall-jarDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(jar_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(jardir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(jardir)/$$f"; \
+	done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(jardir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-jarDATA
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-jarDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-jarDATA install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-jarDATA
+
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java.jar: ppl_java/java_classes.stamp
+ at BUILD_JAVA_INTERFACE_TRUE@	$(JAR) cf ppl_java.jar ppl_java/*.class
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/jni/Makefile.am b/interfaces/Java/jni/Makefile.am
new file mode 100644
index 0000000..df2119b
--- /dev/null
+++ b/interfaces/Java/jni/Makefile.am
@@ -0,0 +1,75 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+if BUILD_JAVA_INTERFACE
+
+interface_generator_files = \
+ppl_interface_generator_java_ppl_java_classes_cc.m4 \
+ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+$(interface_generator_files)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/src \
+-I../ppl_java \
+-I$(top_srcdir)/src \
+ at extra_includes@ @JNIFLAGS@
+
+lib_LTLIBRARIES = libppl_java.la
+
+if HOST_OS_DARWIN
+libppl_java_la_LDFLAGS=-shrext .jnilib
+endif HOST_OS_DARWIN
+
+libppl_java_la_SOURCES = \
+ppl_java_common.hh \
+ppl_java_common.cc \
+ppl_java_globals.cc
+
+nodist_libppl_java_la_SOURCES = \
+ppl_java_classes.cc
+
+ppl_java_classes.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_ppl_java_classes_cc.m4 \
+			> $@
+
+EXTRA_DIST = \
+$(interface_generator_files)
+
+libppl_java_la_LIBADD = $(top_builddir)/src/libppl.la @extra_libraries@
+
+CLEANFILES = \
+ppl_java_classes.cc
+
+endif BUILD_JAVA_INTERFACE
diff --git a/interfaces/Java/jni/Makefile.in b/interfaces/Java/jni/Makefile.in
new file mode 100644
index 0000000..e32161d
--- /dev/null
+++ b/interfaces/Java/jni/Makefile.in
@@ -0,0 +1,627 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/jni
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+ at BUILD_JAVA_INTERFACE_TRUE@libppl_java_la_DEPENDENCIES =  \
+ at BUILD_JAVA_INTERFACE_TRUE@	$(top_builddir)/src/libppl.la
+am__libppl_java_la_SOURCES_DIST = ppl_java_common.hh \
+	ppl_java_common.cc ppl_java_globals.cc
+ at BUILD_JAVA_INTERFACE_TRUE@am_libppl_java_la_OBJECTS =  \
+ at BUILD_JAVA_INTERFACE_TRUE@	ppl_java_common.lo \
+ at BUILD_JAVA_INTERFACE_TRUE@	ppl_java_globals.lo
+ at BUILD_JAVA_INTERFACE_TRUE@nodist_libppl_java_la_OBJECTS =  \
+ at BUILD_JAVA_INTERFACE_TRUE@	ppl_java_classes.lo
+libppl_java_la_OBJECTS = $(am_libppl_java_la_OBJECTS) \
+	$(nodist_libppl_java_la_OBJECTS)
+libppl_java_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_java_la_LDFLAGS) $(LDFLAGS) -o $@
+ at BUILD_JAVA_INTERFACE_TRUE@am_libppl_java_la_rpath = -rpath $(libdir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libppl_java_la_SOURCES) $(nodist_libppl_java_la_SOURCES)
+DIST_SOURCES = $(am__libppl_java_la_SOURCES_DIST)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+ at BUILD_JAVA_INTERFACE_TRUE@interface_generator_files = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_interface_generator_java_ppl_java_classes_cc.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+
+ at BUILD_JAVA_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../ppl_interface_generator_java_procedure_generators.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@$(interface_generator_files)
+
+ at BUILD_JAVA_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_JAVA_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_JAVA_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_JAVA_INTERFACE_TRUE@-I../ppl_java \
+ at BUILD_JAVA_INTERFACE_TRUE@-I$(top_srcdir)/src \
+ at BUILD_JAVA_INTERFACE_TRUE@@extra_includes@ @JNIFLAGS@
+
+ at BUILD_JAVA_INTERFACE_TRUE@lib_LTLIBRARIES = libppl_java.la
+ at BUILD_JAVA_INTERFACE_TRUE@@HOST_OS_DARWIN_TRUE at libppl_java_la_LDFLAGS = -shrext .jnilib
+ at BUILD_JAVA_INTERFACE_TRUE@libppl_java_la_SOURCES = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_common.hh \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_common.cc \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_globals.cc
+
+ at BUILD_JAVA_INTERFACE_TRUE@nodist_libppl_java_la_SOURCES = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_classes.cc
+
+ at BUILD_JAVA_INTERFACE_TRUE@EXTRA_DIST = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(interface_generator_files)
+
+ at BUILD_JAVA_INTERFACE_TRUE@libppl_java_la_LIBADD = $(top_builddir)/src/libppl.la @extra_libraries@
+ at BUILD_JAVA_INTERFACE_TRUE@CLEANFILES = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_classes.cc
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Java/jni/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Java/jni/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libppl_java.la: $(libppl_java_la_OBJECTS) $(libppl_java_la_DEPENDENCIES) 
+	$(libppl_java_la_LINK) $(am_libppl_java_la_rpath) $(libppl_java_la_OBJECTS) $(libppl_java_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_classes.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_globals.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libLTLIBRARIES clean-libtool ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am \
+	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-libLTLIBRARIES
+
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_classes.cc: $(interface_generator_dependencies)
+ at BUILD_JAVA_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. \
+ at BUILD_JAVA_INTERFACE_TRUE@		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_JAVA_INTERFACE_TRUE@		$(srcdir)/ppl_interface_generator_java_ppl_java_classes_cc.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@			> $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4 b/interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
new file mode 100644
index 0000000..c502277
--- /dev/null
+++ b/interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
@@ -0,0 +1,59 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_java_classes.cc
+dnl using the code in ppl_interface_generator_java_classes_cc_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_java_ppl_java_classes_cc_code.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+
+m4_divert`'dnl
+/* Java classes implementation.
+m4_include(`ppl_interface_generator_copyright')
+*/
+m4_divert(-1)
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+`#'include "ppl_java_`'m4_this_class`'.h"
+m4_ifelse(m4_this_class, Polyhedron,
+`#'include "ppl_java_C_Polyhedron.h"
+`#'include "ppl_java_NNC_Polyhedron.h"
+)`'dnl
+m4_undefine(`m4_this_class')
+using namespace Parma_Polyhedra_Library;
+')
+
+dnl -----------------------------------------------------------------
+dnl Main call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+`#'include "ppl_java_common.hh"
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4 b/interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
new file mode 100644
index 0000000..0582eef
--- /dev/null
+++ b/interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
@@ -0,0 +1,1008 @@
+
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating ppl_java_classes.cc
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+#include "ppl_java_ at CLASS@_Iterator.h"
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _1Iterator_equals
+(JNIEnv* env, jobject j_this_it, jobject j_it) {
+jlong ptr = get_ptr(env, j_this_it);
+ @TOPOLOGY@@CPP_CLASS@::iterator* @LTOPOLOGY@@LCLASS at _this_itr_ptr = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(ptr);
+ptr = get_ptr(env, j_it);
+ @TOPOLOGY@@CPP_CLASS@::iterator* @LTOPOLOGY@@LCLASS at _itr_ptr = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(ptr);
+return *@LTOPOLOGY@@LCLASS at _itr_ptr == *@LTOPOLOGY@@LCLASS at _this_itr_ptr;
+}
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+JNIEXPORT jobject JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _@BEGINEND at _1iterator
+  (JNIEnv* env, jobject j_this_powerset) {
+ jlong powerset_ptr = get_ptr(env, j_this_powerset);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(powerset_ptr);
+jclass j_it_class = env->FindClass("ppl_java/@TOPOLOGY@@CLASS at _Iterator");
+jmethodID j_it_ctr_id = env->GetMethodID(j_it_class, "<init>", "()V");
+jobject j_it = env->NewObject(j_it_class, j_it_ctr_id);
+ at TOPOLOGY@@CPP_CLASS@::iterator* ppl_it = new @TOPOLOGY@@CPP_CLASS@::iterator(this_ at LCLASS@->@BEGINEND@());
+set_ptr(env, j_it,  ppl_it);
+return j_it;
+}
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_delete_1iterator
+(JNIEnv* env) {
+jclass j_it_class = env->FindClass("ppl_java/@CLASS at _Iterator");
+ if (!is_a_reference(env, j_it_class))
+  delete j_it_class;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+JNIEXPORT void JNICALL
+   Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _1Iterator_@ALT_INCDEC@
+(JNIEnv* env, jobject j_it) {
+ jlong ptr = get_ptr(env, j_it);
+ @TOPOLOGY@@CPP_CLASS@::iterator* @LTOPOLOGY@@LCLASS at _itr_ptr = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(ptr);
+ at CPPX_INCDEC@(*@LTOPOLOGY@@LCLASS at _itr_ptr);
+}
+')
+
+m4_define(`m4_increment_extra_op_name', `next')
+m4_define(`m4_decrement_extra_op_name', `prev')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+JNIEXPORT jobject JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _1Iterator_get_1disjunct
+(JNIEnv* env, jobject j_it) {
+ jlong ptr = get_ptr(env, j_it);
+ @TOPOLOGY@@CPP_CLASS@::iterator* @LTOPOLOGY@@LCLASS at _itr_ptr = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(ptr);
+jclass j_class = env->FindClass("ppl_java/@CLASSTOPOLOGY@@CPP_DISJUNCT@");
+jmethodID j_ctr_id = env->GetMethodID(j_class, "<init>", "()V");
+jobject j_obj = env->NewObject(j_class, j_ctr_id);
+set_ptr(env, j_obj,  &((*@LTOPOLOGY@@LCLASS at _itr_ptr)->element()));
+set_is_a_reference(env, j_obj, true);
+return j_obj;
+}
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _drop_1disjunct
+(JNIEnv* env, jobject j_pps, jobject j_it) {
+ jlong ptr = get_ptr(env, j_it);
+ @TOPOLOGY@@CPP_CLASS@::iterator* @LTOPOLOGY@@LCLASS at _itr_ptr = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(ptr);
+ ptr = get_ptr(env, j_pps);
+ @TOPOLOGY@@CPP_CLASS@* @LTOPOLOGY@@LCLASS at _ptr = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(ptr);
+ at LTOPOLOGY@@LCLASS at _ptr->drop_disjunct(*@LTOPOLOGY@@LCLASS at _itr_ptr);
+}
+')
+
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__JLppl_1java_Degenerate_1Element_2
+(JNIEnv* env, jobject j_ at LTOPOLOGY@@LCLASS@, jlong j_dim,
+ jobject j_degenerate_element) {
+  dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+  jclass degenerate_element_class
+    = env->FindClass("ppl_java/Degenerate_Element");
+  jmethodID degenerate_element_ordinal_id
+    = env->GetMethodID(degenerate_element_class, "ordinal", "()I");
+  jint j_degenerate_element_int
+    = env->CallIntMethod(j_degenerate_element, degenerate_element_ordinal_id);
+
+  @TOPOLOGY@@CPP_CLASS@* c_ptr;
+  switch (j_degenerate_element_int) {
+  case 0:
+    c_ptr = new @TOPOLOGY@@CPP_CLASS@(ppl_dim, UNIVERSE);
+    break;
+ case 1:
+    c_ptr = new @TOPOLOGY@@CPP_CLASS@(ppl_dim, EMPTY);
+    break;
+  default:
+    throw std::runtime_error("PPL Java interface internal error");
+  }
+ set_ptr(env, j_ at LTOPOLOGY@@LCLASS@, c_ptr);
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lppl_1java_@1FRIEND at _2
+(JNIEnv* env, jobject  j_this_ at LTOPOLOGY@@LCLASS@, jobject j_ at LFRIEND@)
+{
+ jlong ptr = get_ptr(env, j_ at LFRIEND@);
+ @CPPX_FRIEND@* @LFRIEND at _ptr = reinterpret_cast<@CPPX_FRIEND@*>(ptr);
+ @TOPOLOGY@@CPP_CLASS@* @LTOPOLOGY at _this_@LCLASS at _ptr = new @TOPOLOGY@@CPP_CLASS@(*@LFRIEND at _ptr);
+ set_ptr(env, j_this_ at LTOPOLOGY@@LCLASS@, @LTOPOLOGY at _this_@LCLASS at _ptr);
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lppl_1java_@UBUILD_REPRESENT at _1System_2
+(JNIEnv* env, jobject j_ at LTOPOLOGY@@LCLASS@, jobject j_iterable) {
+  @UBUILD_REPRESENT at _System cs = build_ppl_ at BUILD_REPRESENT@_system(env, j_iterable);
+
+  @TOPOLOGY@@CPP_CLASS@* c_ptr = new @TOPOLOGY@@CPP_CLASS@(cs at RECYCLE@);
+  set_ptr(env, j_ at LTOPOLOGY@@LCLASS@,  c_ptr);
+}
+
+')
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _@1UB_EXACT@
+(JNIEnv* env, jobject j_this_ at LTOPOLOGY@@LCLASS@, jobject j_ at LTOPOLOGY@@LCLASS@) {
+  jlong ptr = get_ptr(env, j_this_ at LTOPOLOGY@@LCLASS@);
+  @TOPOLOGY@@CPP_CLASS@* this_ at LTOPOLOGY@@LCLASS@ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(ptr);
+  ptr = get_ptr(env, j_ at LTOPOLOGY@@LCLASS@);
+  @TOPOLOGY@@CPP_CLASS@* @LTOPOLOGY@@LCLASS@ = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(ptr);
+  return this_ at LTOPOLOGY@@LCLASS at ->@UB_EXACT@(*@LTOPOLOGY@@LCLASS@);
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _finalize
+(JNIEnv* env, jobject j_ at LTOPOLOGY@@LCLASS@) {
+  jlong this_ptr = get_ptr(env, j_ at LTOPOLOGY@@LCLASS@);
+  @TOPOLOGY@@CPP_CLASS@* str  = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(this_ptr);
+ if (!is_a_reference(env, j_ at LTOPOLOGY@@LCLASS@))
+  delete str;
+}
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1TOPOLOGY@@1CLASS at _free
+(JNIEnv* env, jobject j_ at LTOPOLOGY@@LCLASS@) {
+  jlong this_ptr = get_ptr(env, j_ at LTOPOLOGY@@LCLASS@);
+  @TOPOLOGY@@CPP_CLASS@* str  =
+       reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(this_ptr);
+    if (!is_a_reference(env, j_ at LTOPOLOGY@@LCLASS@)) {
+  	delete str;
+        void* null_ptr = 0;
+  	set_ptr(env, j_ at LTOPOLOGY@@LCLASS@, null_ptr);
+   }
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_swap
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at LCLASS@) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ptr = get_ptr(env, j_ at LCLASS@);
+    @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ at LCLASS@->swap(*@LCLASS@);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+JNIEXPORT jlong JNICALL Java_ppl_1java_ at 1CLASS@_ at 1DIMENSION@
+(JNIEnv* env, jobject j_this_ at LCLASS@) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+ return this_ at LCLASS@->@DIMENSION@();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`dnl
+JNIEXPORT jobject JNICALL Java_ppl_1java_ at 1CLASS@_ at 1GET_REPRESENT@s
+(JNIEnv* env, jobject j_this_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  return build_java_ at GET_REPRESENT@_system(env, this_ at LCLASS@->@GET_REPRESENT at s());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`dnl
+JNIEXPORT jobject JNICALL Java_ppl_1java_ at 1CLASS@_minimized_1 at GET_REPRESENT@s
+(JNIEnv* env, jobject j_this_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  return build_java_ at GET_REPRESENT@_system(env,
+				   this_ at LCLASS@->minimized_ at GET_REPRESENT@s());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+JNIEXPORT jobject JNICALL Java_ppl_1java_ at 1CLASS@_relation_1with__Lppl_1java_ at 1URELATION_REPRESENT@_2
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at RELATION_REPRESENT@) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @URELATION_REPRESENT@ c = build_ppl_ at RELATION_REPRESENT@(env, j_ at RELATION_REPRESENT@);
+  Poly_ at UALT_RELATION_REPRESENT@_Relation pcr = this_ at LCLASS@->relation_with(c);
+  return build_java_poly_ at ALT_RELATION_REPRESENT@_relation(env, pcr);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_ at 1HAS_PROPERTY@
+(JNIEnv* env, jobject j_ at LCLASS@) {
+  try {
+  jlong ptr = get_ptr(env, j_ at LCLASS@);
+  @CPP_CLASS@* c = reinterpret_cast<@CPP_CLASS@*>(ptr);
+  return c->@HAS_PROPERTY@();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_ at 1SIMPLIFY@
+(JNIEnv* env, jobject j_this_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  this_ at LCLASS@->@SIMPLIFY@();
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_1unconstrain_space_dimension
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_var) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Variable v = build_ppl_variable(env, j_var);
+  this_ at LCLASS@->unconstrain(v);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_1unconstrain_space_dimensions
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_v_set) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Variables_Set v_set = build_ppl_variables_set(env, j_v_set);
+  this_ at LCLASS@->unconstrain(v_set);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_bounds_1from_1 at 1ABOVEBELOW@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject java_le) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Linear_Expression le = build_linear_expression(env, java_le);
+  return this_ at LCLASS@->bounds_from_ at ABOVEBELOW@(le);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_ at 1MAXMIN@__Lppl_1java_Linear_1Expression_2Lppl_1java_Coefficient_2Lppl_1java_Coefficient_2Lppl_1java_By_1Reference_2
+(JNIEnv* env, jobject j_this_ at LCLASS@ , jobject j_le,
+ jobject j_coeff_num, jobject j_coeff_den, jobject j_ref_boolean) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  TEMP_INTEGER(coeff_num);
+  TEMP_INTEGER(coeff_den);
+  coeff_num = build_ppl_coeff(env, j_coeff_num);
+  coeff_den = build_ppl_coeff(env, j_coeff_den);
+  Linear_Expression le = build_linear_expression(env, j_le);
+  bool b_value;
+  if(this_ at LCLASS@->@MAXMIN@(le, coeff_num, coeff_den, b_value)) {
+    jobject j_coeff_num_result = build_java_coeff(env, coeff_num);
+    jobject j_coeff_den_result = build_java_coeff(env, coeff_den);
+    set_coefficient(env, j_coeff_num, j_coeff_num_result);
+    set_coefficient(env, j_coeff_den, j_coeff_den_result);
+    jobject j_boolean = bool_to_j_boolean(env, b_value);
+    set_by_reference(env, j_ref_boolean, j_boolean);
+    return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_ at 1MAXMIN@__Lppl_1java_Linear_1Expression_2Lppl_1java_Coefficient_2Lppl_1java_Coefficient_2Lppl_1java_By_1Reference_2Lppl_1java_Generator_2
+(JNIEnv* env, jobject j_this_ at LCLASS@ , jobject j_le,
+ jobject j_coeff_num, jobject j_coeff_den, jobject j_ref_boolean,
+ jobject j_generator) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  TEMP_INTEGER(coeff_num);
+  TEMP_INTEGER(coeff_den);
+  coeff_num = build_ppl_coeff(env, j_coeff_num);
+  coeff_den = build_ppl_coeff(env, j_coeff_den);
+  Linear_Expression le = build_linear_expression(env, j_le);
+  bool b_value;
+  Generator g = point();
+  if(this_ at LCLASS@->@MAXMIN@(le, coeff_num, coeff_den, b_value, g)) {
+    jobject j_coeff_num_result = build_java_coeff(env, coeff_num);
+    jobject j_coeff_den_result = build_java_coeff(env, coeff_den);
+    jobject j_generator_result = build_java_generator(env, g);
+    set_coefficient(env, j_coeff_num, j_coeff_num_result);
+    set_coefficient(env, j_coeff_den, j_coeff_den_result);
+    jobject j_boolean = bool_to_j_boolean(env, b_value);
+    set_by_reference(env, j_ref_boolean, j_boolean);
+    set_generator(env, j_generator, j_generator_result);
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_ at 1COMPARISON@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  jlong @LCLASS at _ptr = get_ptr(env, j_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(@LCLASS at _ptr);
+  return this_ at LCLASS@->@COMPARISON@(*@LCLASS@);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_equals
+(JNIEnv* env , jobject j_this_ at LCLASS@, jobject j_ at LCLASS@ ) {
+  try {
+  jlong ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(ptr);
+  ptr = get_ptr(env, j_ at LCLASS@);
+  @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(ptr);
+  return (*this_ at LCLASS@)==(*@LCLASS@);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+`dnl
+JNIEXPORT jint JNICALL Java_ppl_1java_ at 1CLASS@_hashCode
+(JNIEnv* env , jobject j_this_ at LCLASS@) {
+  try {
+  jlong ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(ptr);
+  return (*this_ at LCLASS@).hash_code();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_OK
+(JNIEnv* env, jobject j_this_ at LCLASS@) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    return this_ at LCLASS@->OK();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_add_1 at 1ADD_REPRESENT@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at ADD_REPRESENT@) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    @UADD_REPRESENT@ c = build_ppl_ at ADD_REPRESENT@(env, j_ at ADD_REPRESENT@);
+    this_ at LCLASS@->add_ at ADD_REPRESENT@(c);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_refine_1with_1 at 1REFINE_REPRESENT@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at REFINE_REPRESENT@) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    @UREFINE_REPRESENT@ c = build_ppl_ at REFINE_REPRESENT@(env, j_ at REFINE_REPRESENT@);
+    this_ at LCLASS@->refine_with_ at REFINE_REPRESENT@(c);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_add_1 at 1ADD_REPRESENT@_1and_1minimize
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at ADD_REPRESENT@) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    @UADD_REPRESENT@ c = build_ppl_ at ADD_REPRESENT@(env, j_ at ADD_REPRESENT@);
+    return this_ at LCLASS@->add_ at ADD_REPRESENT@_and_minimize(c);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_add_1 at 1ADD_REPRESENT@s
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at ADD_REPRESENT@s) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @UADD_REPRESENT at _System cs = build_ppl_ at ADD_REPRESENT@_system(env, j_ at ADD_REPRESENT@s);
+  this_ at LCLASS@->add_ at ADD_REPRESENT@s(cs);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_refine_1with_1 at 1REFINE_REPRESENT@s
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at REFINE_REPRESENT@s) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @UREFINE_REPRESENT at _System cs = build_ppl_ at REFINE_REPRESENT@_system(env, j_ at REFINE_REPRESENT@s);
+  this_ at LCLASS@->refine_with_ at REFINE_REPRESENT@s(cs);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_add_1 at 1ADD_REPRESENT@s_1and_1minimize
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at ADD_REPRESENT@s) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @UADD_REPRESENT at _System cs = build_ppl_ at ADD_REPRESENT@_system(env, j_ at ADD_REPRESENT@s);
+  return this_ at LCLASS@->add_ at ADD_REPRESENT@s_and_minimize(cs);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_ at 1BINOP@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  jlong @LCLASS at _ptr = get_ptr(env, j_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(@LCLASS at _ptr);
+  this_ at LCLASS@->@BINOP@(*@LCLASS@);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_ at 1BINMINOP@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  jlong @LCLASS at _ptr = get_ptr(env, j_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(@LCLASS at _ptr);
+  return this_ at LCLASS@->@BINMINOP@(*@LCLASS@);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_simplify_1using_1context_1assign
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_ at LCLASS@) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  jlong @LCLASS at _ptr = get_ptr(env, j_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(@LCLASS at _ptr);
+  return this_ at LCLASS@->simplify_using_context_assign(*@LCLASS@);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_ at 1AFFIMAGE@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_var, jobject j_le,
+ jobject j_coeff) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Variable v = build_ppl_variable(env, j_var);
+  Linear_Expression le = build_linear_expression(env, j_le);
+  TEMP_INTEGER(c);
+  c = build_ppl_coeff(env, j_coeff);
+  this_ at LCLASS@->@AFFIMAGE@(v, le, c);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_generalized_1 at 1AFFIMAGE@__Lppl_1java_Linear_1Expression_2Lppl_1java_Relation_1Symbol_2Lppl_1java_Linear_1Expression_2
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_le_lhs, jobject j_relsym,
+ jobject j_le_rhs) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+ Linear_Expression lhs = build_linear_expression(env, j_le_lhs);
+ Linear_Expression rhs = build_linear_expression(env, j_le_rhs);
+ Relation_Symbol relsym = build_ppl_relsym(env, j_relsym);
+ this_ at LCLASS@->generalized_ at AFFIMAGE@(lhs, relsym, rhs);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_generalized_1 at 1AFFIMAGE@__Lppl_1java_Variable_2Lppl_1java_Relation_1Symbol_2Lppl_1java_Linear_1Expression_2Lppl_1java_Coefficient_2
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_variable, jobject j_relsym,
+ jobject j_le , jobject j_coeff) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+ Variable v = build_ppl_variable(env, j_variable);
+ Relation_Symbol relsym = build_ppl_relsym(env, j_relsym);
+ Linear_Expression le = build_linear_expression(env, j_le);
+ TEMP_INTEGER(c);
+ c = build_ppl_coeff(env, j_coeff);
+ this_ at LCLASS@->generalized_ at AFFIMAGE@(v, relsym, le, c);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_generalized_1 at 1AFFIMAGE@_1lhs_1rhs_1with_1congruence
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_le_lhs, jobject j_relsym,
+ jobject j_le_rhs, jobject j_modulus) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+ Linear_Expression lhs = build_linear_expression(env, j_le_lhs);
+ Linear_Expression rhs = build_linear_expression(env, j_le_rhs);
+ Relation_Symbol relsym = build_ppl_relsym(env, j_relsym);
+ TEMP_INTEGER(modulus);
+ modulus = build_ppl_coeff(env, j_modulus);
+ this_ at LCLASS@->generalized_ at AFFIMAGE@(lhs, relsym, rhs, modulus);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at CLASS@_generalized_1 at 1AFFIMAGE@_1with_1congruence
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_variable, jobject j_relsym,
+ jobject j_le , jobject j_coeff, jobject j_modulus) {
+  try {
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+ Variable v = build_ppl_variable(env, j_variable);
+ Relation_Symbol relsym = build_ppl_relsym(env, j_relsym);
+ Linear_Expression le = build_linear_expression(env, j_le);
+ TEMP_INTEGER(c);
+ TEMP_INTEGER(modulus);
+ c = build_ppl_coeff(env, j_coeff);
+ modulus = build_ppl_coeff(env, j_modulus);
+ this_ at LCLASS@->generalized_ at AFFIMAGE@(v, relsym, le, c, modulus);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_bounded_1 at 1AFFIMAGE@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_variable, jobject j_le_lhs, jobject j_le_rhs, jobject j_coeff) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Variable v = build_ppl_variable(env, j_variable);
+  Linear_Expression lhs = build_linear_expression(env, j_le_lhs);
+  Linear_Expression rhs = build_linear_expression(env, j_le_rhs);
+  TEMP_INTEGER(c);
+  c = build_ppl_coeff(env, j_coeff);
+  this_ at LCLASS@->bounded_ at AFFIMAGE@(v, lhs, rhs, c);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_ at 1WIDEN@_1widening_1assign
+(JNIEnv* env , jobject j_this_ at LCLASS@ , jobject j_ at LCLASS@,
+ jobject j_by_ref_int) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ptr = get_ptr(env, j_ at LCLASS@);
+    @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    if (is_null(env, j_by_ref_int))
+      this_ at LCLASS@->@WIDEN at _widening_assign(*@LCLASS@);
+    else {
+      jobject j_integer = get_by_reference(env, j_by_ref_int);
+      unsigned int tokens =
+        jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+      this_ at LCLASS@->@WIDEN at _widening_assign(*@LCLASS@, &tokens);
+      j_integer = j_int_to_j_integer(env, tokens);
+      set_by_reference(env, j_by_ref_int, j_integer);
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_ at 1EXTRAPOLATION@_1narrowing_1assign
+(JNIEnv* env , jobject j_this_ at LCLASS@ , jobject j_ at LCLASS@) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ptr = get_ptr(env, j_ at LCLASS@);
+    @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ at LCLASS@->@EXTRAPOLATION at _narrowing_assign(*@LCLASS@);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_ at 1LIMITEDBOUNDED@_1 at 1WIDENEXPN@_1extrapolation_1assign
+(JNIEnv* env , jobject j_this_ at LCLASS@, jobject j_cs, jobject j_ at LCLASS@,
+ jobject j_by_ref_int) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ptr = get_ptr(env, j_ at LCLASS@);
+    @CPP_CLASS@* @LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    @UCONSTRAINER at _System cs = build_ppl_ at CONSTRAINER@_system(env, j_cs);
+    if (is_null(env, j_by_ref_int))
+      this_ at LCLASS@->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*@LCLASS@, cs);
+    else {
+      jobject j_integer = get_by_reference(env, j_by_ref_int);
+      unsigned int tokens =
+        jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+      this_ at LCLASS@->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*@LCLASS@, cs,
+                                                                       &tokens);
+      j_integer = j_int_to_j_integer(env, tokens);
+      set_by_reference(env, j_by_ref_int, j_integer);
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_add_1space_1dimensions_1 at 1EMBEDPROJECT@
+(JNIEnv* env, jobject j_this_ at LCLASS@, jlong dim) {
+  try {
+dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+ jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+ @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+ this_ at LCLASS@->add_space_dimensions_ at EMBEDPROJECT@(ppl_dim);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_remove_1space_1dimensions
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_v_set) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Variables_Set v_set = build_ppl_variables_set(env, j_v_set);
+  this_ at LCLASS@->remove_space_dimensions(v_set);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_remove_1higher_1space_1dimensions
+(JNIEnv* env, jobject j_this_ at LCLASS@, jlong dim) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    this_ at LCLASS@->remove_higher_space_dimensions(ppl_dim);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_expand_1space_1dimension
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_variable, jlong dim) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    Variable v = build_ppl_variable(env, j_variable);
+    this_ at LCLASS@->expand_space_dimension(v, ppl_dim);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_fold_1space_1dimensions
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_v_set, jobject j_var) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  Variables_Set v_set = build_ppl_variables_set(env, j_v_set);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  Variable v = build_ppl_variable(env, j_var);
+  this_ at LCLASS@->fold_space_dimensions(v_set, v);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_ppl_1java_ at 1CLASS@_map_1space_1dimensions
+(JNIEnv* env , jobject j_this_ at LCLASS@, jobject j_p_func) {
+  try {
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  PFunc ppl_pfunc = PFunc(j_p_func, env);
+  this_ at LCLASS@->map_space_dimensions(ppl_pfunc);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+`dnl
+JNIEXPORT jstring JNICALL Java_ppl_1java_ at 1CLASS@_toString
+(JNIEnv* env , jobject j_this_ at LCLASS@) {
+  try {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  std::ostringstream s;
+  s << *this_ at LCLASS@;
+  return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`JNIEXPORT jlong JNICALL Java_ppl_1java_ at 1CLASS@_ at 1MEMBYTES@
+(JNIEnv* env, jobject j_pps) {
+  jlong this_ptr = get_ptr(env, j_pps);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  return this_ at LCLASS@->@MEMBYTES@();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+JNIEXPORT jboolean JNICALL Java_ppl_1java_ at 1CLASS@_constrains
+(JNIEnv* env, jobject j_this_ at LCLASS@, jobject j_var) {
+  try {
+    jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+    @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+    Variable v = build_ppl_variable(env, j_var);
+    return this_ at LCLASS@->constrains(v);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+JNIEXPORT jstring JNICALL Java_ppl_1java_ at 1CLASS@_ascii_1dump
+(JNIEnv* env , jobject j_this_ at LCLASS@) {
+  try {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  jlong this_ptr = get_ptr(env, j_this_ at LCLASS@);
+  @CPP_CLASS@* this_ at LCLASS@ = reinterpret_cast<@CPP_CLASS@*>(this_ptr);
+  std::ostringstream s;
+  this_ at LCLASS@->ascii_dump(s);
+  return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+')
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code',
+`dnl
+JNIEXPORT jobject JNICALL Java_ppl_1java_ at 1CLASS@_ at 1PARTITION@
+(JNIEnv* env, jclass pps_class, jobject j_p_ at LCLASS@, jobject j_q_ at LCLASS@) {
+  try {
+   // Suppress warnings concerning `ppl_class' not used.
+   pps_class = 0;
+   jlong p_ptr = get_ptr(env, j_p_ at LCLASS@);
+   @CLASSTOPOLOGY@@CPP_DISJUNCT@* ph = reinterpret_cast<@CLASSTOPOLOGY@@CPP_DISJUNCT@*>(p_ptr);
+  jlong q_ptr = get_ptr(env, j_q_ at LCLASS@);
+   @CLASSTOPOLOGY@@CPP_DISJUNCT@* qh = reinterpret_cast<@CLASSTOPOLOGY@@CPP_DISJUNCT@*>(q_ptr);
+   std::pair<@CLASSTOPOLOGY@@CPP_DISJUNCT@@COMMA@ Pointset_Powerset<@SUPERCLASS@> > r =
+       @PARTITION@(*ph, *qh);
+ jclass j_pair_class = env->FindClass("ppl_java/Pair");
+ jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "<init>", "()V");
+ jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair);
+
+ jclass j_class_r1 = env->FindClass("ppl_java/@CLASSTOPOLOGY@@CPP_DISJUNCT@");
+ jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "<init>", "()V");
+ jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1);
+ set_ptr(env, j_obj_r1,  new @CLASSTOPOLOGY@@CPP_DISJUNCT@(r.first));
+
+ jclass j_class_r2 = env->FindClass("ppl_java/@CLASS@");
+ jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "<init>", "()V");
+ jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2);
+ set_ptr(env, j_obj_r2,  new Pointset_Powerset<@SUPERCLASS@>(r.second));
+ set_pair_element(env, j_pair_obj, 0, j_obj_r1);
+ set_pair_element(env, j_pair_obj, 1, j_obj_r2);
+ return  j_pair_obj;
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
diff --git a/interfaces/Java/jni/ppl_java_common.cc b/interfaces/Java/jni/ppl_java_common.cc
new file mode 100644
index 0000000..16fe7e2
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common.cc
@@ -0,0 +1,1109 @@
+/* PPL Java interface common routines implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_java_common.hh"
+using namespace Parma_Polyhedra_Library;
+
+void
+handle_exception(JNIEnv* env, const std::overflow_error& e) {
+  jclass newExcCls = env->FindClass("ppl_java/Overflow_Error_Exception");
+  env->ThrowNew(newExcCls, e.what());
+}
+void
+handle_exception(JNIEnv* env, const std::invalid_argument& e) {
+  jclass newExcCls = env->FindClass("ppl_java/Invalid_Argument_Exception");
+  env->ThrowNew(newExcCls, e.what());
+}
+
+void
+handle_exception(JNIEnv* env, const std::logic_error& e) {
+  jclass newExcCls = env->FindClass("ppl_java/Logic_Error_Exception");
+  env->ThrowNew(newExcCls, e.what());
+}
+
+void
+handle_exception(JNIEnv* env, const std::length_error& e) {
+  jclass newExcCls = env->FindClass("ppl_java/Length_Error_Exception");
+  env->ThrowNew(newExcCls, e.what());
+}
+
+void
+handle_exception(JNIEnv* env, const std::domain_error& e) {
+  jclass newExcCls = env->FindClass("ppl_java/Domain_Error_Exception");
+  env->ThrowNew(newExcCls, e.what());
+}
+
+void
+handle_exception(JNIEnv* env, const std::bad_alloc&) {
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  env->ThrowNew(newExcCls, "Out of memory");
+}
+
+void
+handle_exception(JNIEnv* env, const std::exception& e) {
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  env->ThrowNew(newExcCls, e.what());
+}
+
+void
+handle_exception(JNIEnv* env) {
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  env->ThrowNew(newExcCls, "PPL bug: unknown exception raised");
+}
+
+jobject
+build_java_poly_gen_relation(JNIEnv* env,
+			     Poly_Gen_Relation& r) {
+  jclass j_poly_gen_relation_class
+    = env->FindClass("ppl_java/Poly_Gen_Relation");
+  jmethodID j_poly_gen_relation_ctr_id
+    = env->GetMethodID(j_poly_gen_relation_class, "<init>", "(I)V");
+
+  jint j_value = 0;
+  while (r != Poly_Gen_Relation::nothing()) {
+    if (r.implies(Poly_Gen_Relation::subsumes())) {
+      j_value += 1;
+      r = r - Poly_Gen_Relation::subsumes();
+    }
+  }
+  return env->NewObject(j_poly_gen_relation_class,
+			j_poly_gen_relation_ctr_id, j_value);
+}
+
+jobject
+build_java_poly_con_relation(JNIEnv* env,
+			    Poly_Con_Relation& r) {
+  jclass j_poly_con_relation_class
+    = env->FindClass("ppl_java/Poly_Con_Relation");
+  jmethodID j_poly_con_relation_ctr_id
+    = env->GetMethodID(j_poly_con_relation_class, "<init>", "(I)V");
+
+  jint j_value = 0;
+  while (r != Poly_Con_Relation::nothing()) {
+    if (r.implies(Poly_Con_Relation::is_disjoint())) {
+      j_value += 1;
+      r = r - Poly_Con_Relation::is_disjoint();
+    }
+    else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+      j_value += 2;
+      r = r - Poly_Con_Relation::strictly_intersects();
+    }
+    else if (r.implies(Poly_Con_Relation::is_included())) {
+      j_value += 4;
+      r = r - Poly_Con_Relation::is_included();
+    }
+    else if (r.implies(Poly_Con_Relation::saturates())) {
+      j_value += 8;
+      r = r - Poly_Con_Relation::saturates();
+    }
+  }
+  return env->NewObject(j_poly_con_relation_class,
+			j_poly_con_relation_ctr_id, j_value);
+}
+
+
+Parma_Polyhedra_Library::Congruence
+build_ppl_congruence(JNIEnv* env, const jobject& j_congruence) {
+  jclass congruence_class
+    = env->FindClass("ppl_java/Congruence");
+  jfieldID modulus_field_id = env->GetFieldID(congruence_class,
+					      "modulus",
+					      "Lppl_java/Coefficient;");
+  jobject j_modulus = env->GetObjectField(j_congruence, modulus_field_id);
+  TEMP_INTEGER(ppl_modulus);
+  ppl_modulus = build_ppl_coeff(env, j_modulus);
+  jfieldID lhs_field_id
+      = env->GetFieldID(congruence_class,
+ 			"lhs",
+ 			"Lppl_java/Linear_Expression;");
+    jfieldID rhs_field_id
+      = env->GetFieldID(congruence_class,
+ 			"rhs",
+ 			"Lppl_java/Linear_Expression;");
+    jobject j_lhs = env->GetObjectField(j_congruence, lhs_field_id);
+    jobject j_rhs = env->GetObjectField(j_congruence, rhs_field_id);
+    Linear_Expression lhs = build_linear_expression(env, j_lhs);
+    Linear_Expression rhs = build_linear_expression(env, j_rhs);
+    return (lhs %= rhs) / ppl_modulus;
+}
+
+// Converts a C++ bool to a Java boolean.
+jobject
+bool_to_j_boolean(JNIEnv* env,
+		  const bool bool_value) {
+ jclass boolean_java_class = env->FindClass("java/lang/Boolean");
+ jmethodID getboolean_method_id
+   = env->GetStaticMethodID(boolean_java_class,
+			    "valueOf",
+			    "(Z)Ljava/lang/Boolean;");
+ return env->CallStaticObjectMethod(boolean_java_class,
+ 				    getboolean_method_id,
+ 				    bool_value);
+}
+
+jobject
+j_long_to_j_long_class(JNIEnv* env, const jlong& jlong_value) {
+  jclass long_java_class = env->FindClass("java/lang/Long");
+  jmethodID get_long_method_id =
+    env->GetStaticMethodID(long_java_class,
+			   "valueOf",
+			   "(J)Ljava/lang/Long;");
+  return env->CallStaticObjectMethod(long_java_class,
+ 				     get_long_method_id,
+ 				     jlong_value);
+}
+
+jlong
+j_long_class_to_j_long(JNIEnv* env,  const jobject& j_long) {
+  jclass long_java_class = env->FindClass("java/lang/Long");
+  jmethodID get_int_method_id = env->GetMethodID(long_java_class,
+						 "longValue", "()J");
+  return env->CallIntMethod(j_long, get_int_method_id);
+}
+
+
+jobject
+j_int_to_j_integer(JNIEnv* env,  const jint&  jint_value) {
+  jclass integer_java_class = env->FindClass("java/lang/Integer");
+  jmethodID get_integer_method_id
+    = env->GetStaticMethodID(integer_java_class,
+			     "valueOf",
+			     "(I)Ljava/lang/Integer;");
+ return env->CallStaticObjectMethod(integer_java_class,
+ 				    get_integer_method_id,
+ 				    jint_value);
+}
+
+jint
+j_integer_to_j_int(JNIEnv* env,  const jobject& j_integer) {
+ jclass integer_java_class = env->FindClass("java/lang/Integer");
+ jmethodID get_int_method_id = env->GetMethodID(integer_java_class,
+						"intValue", "()I");
+ return env->CallIntMethod(j_integer, get_int_method_id);
+}
+
+// bool
+// j_boolean_to_bool(JNIEnv* env,
+// 		  const jobject& j_boolean) {
+//   jclass boolean_class = env->GetObjectClass(j_boolean);
+//   jmethodID booleanvalue_method_id = env->GetMethodID(boolean_class,
+// 						      "booleanValue",
+// 						      "()Z");
+//   return env->CallBooleanMethod(j_boolean, booleanvalue_method_id);
+
+// }
+
+Variables_Set
+build_ppl_variables_set(JNIEnv* env,
+			const jobject& j_v_set) {
+  jclass variables_set_class = env->GetObjectClass(j_v_set);
+  jclass iterator_java_class = env->FindClass("java/util/Iterator");
+  Variables_Set v_set;
+  jmethodID iterator_method_id = env->GetMethodID(variables_set_class,
+						  "iterator",
+ 						  "()Ljava/util/Iterator;");
+  jobject j_iterator = env->CallObjectMethod(j_v_set, iterator_method_id);
+  jmethodID has_next_method_id = env->GetMethodID(iterator_java_class,
+  						  "hasNext",
+  						  "()Z");
+  jboolean has_next_value = env->CallBooleanMethod(j_iterator,
+						   has_next_method_id);
+  jmethodID next_method_id = env->GetMethodID(iterator_java_class,
+					      "next",
+					      "()Ljava/lang/Object;");
+
+  while (has_next_value) {
+    jobject j_variable = env->CallObjectMethod(j_iterator,
+					       next_method_id);
+    v_set.insert(build_ppl_variable(env, j_variable));
+    has_next_value = env->CallBooleanMethod(j_iterator,
+					    has_next_method_id);
+  }
+  return v_set;
+}
+
+jobject
+build_java_variables_set(JNIEnv* env,
+			 const Variables_Set& v_set) {
+  jclass j_vs_class = env->FindClass("ppl_java/Variables_Set");
+  jmethodID j_vs_ctr_id = env->GetMethodID(j_vs_class, "<init>", "()V");
+  jmethodID j_vs_add_id = env->GetMethodID(j_vs_class, "add",
+					   "(Ljava/lang/Object;)Z");
+  jobject j_vs = env->NewObject(j_vs_class, j_vs_ctr_id);
+  for (Variables_Set::const_iterator v_begin = v_set.begin(),
+	 v_end = v_set.end(); v_begin != v_end; ++v_begin) {
+    Variable var(*v_begin);
+    jobject j_variable = build_java_variable(env, var);
+    env->CallBooleanMethod(j_vs, j_vs_add_id, j_variable);
+  }
+  return j_vs;
+}
+
+Variable
+build_ppl_variable(JNIEnv* env, const jobject& j_var) {
+  jclass j_variable_class = env->FindClass("ppl_java/Variable");
+  jfieldID varid_field_id = env->GetFieldID(j_variable_class,
+					  "varid",
+					  "I");
+  // Retrieve the value.
+  return Variable(env->GetIntField(j_var, varid_field_id));
+}
+
+jobject
+build_java_variable(JNIEnv* env, const Variable& var) {
+  jclass variable_class = env->FindClass("ppl_java/Variable");
+  jmethodID j_variable_ctr_id = env->GetMethodID(variable_class, "<init>",
+						 "(I)V");
+  return env->NewObject(variable_class, j_variable_ctr_id,
+ 			var.id());
+}
+
+Relation_Symbol
+build_ppl_relsym(JNIEnv* env, const jobject& j_relsym) {
+  jclass rel_sym_class = env->FindClass("ppl_java/Relation_Symbol");
+  jmethodID rel_sym_ordinal_id = env->GetMethodID(rel_sym_class, "ordinal",
+						  "()I");
+  jint rel_sym = env->CallIntMethod(j_relsym, rel_sym_ordinal_id);
+  switch (rel_sym) {
+  case 0: {
+    return LESS_THAN;
+  }
+  case 1: {
+    return LESS_OR_EQUAL;
+  }
+ case 2: {
+   return EQUAL;
+ }
+  case 3: {
+    return GREATER_OR_EQUAL;
+  }
+  case 4: {
+    return GREATER_THAN;
+  }
+  default:
+    ;
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+Optimization_Mode
+build_ppl_optimization_mode(JNIEnv* env, const jobject& j_opt_mode) {
+  jclass opt_mode_class = env->FindClass("ppl_java/Optimization_Mode");
+  jmethodID opt_mode_ordinal_id = env->GetMethodID(opt_mode_class, "ordinal",
+						  "()I");
+  jint opt_mode = env->CallIntMethod(j_opt_mode, opt_mode_ordinal_id);
+  switch (opt_mode) {
+  case 0: {
+    return MINIMIZATION;
+  }
+  case 1: {
+    return MAXIMIZATION;
+  }
+  default:
+    ;
+  }
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+jobject
+build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode) {
+  jclass j_optimization_mode_class
+    = env->FindClass("ppl_java/Optimization_Mode");
+  jfieldID optimization_mode_min_get_id
+    = env->GetStaticFieldID(j_optimization_mode_class,
+			    "MINIMIZATION",
+			    "Lppl_java/Optimization_Mode;");
+  jfieldID optimization_mode_max_get_id
+    = env->GetStaticFieldID(j_optimization_mode_class,
+			    "MAXIMIZATION",
+			    "Lppl_java/Optimization_Mode;");
+  switch (opt_mode) {
+  case MINIMIZATION:
+    return env->GetStaticObjectField(j_optimization_mode_class,
+				     optimization_mode_min_get_id);
+  case MAXIMIZATION:
+    return  env->GetStaticObjectField(j_optimization_mode_class,
+				      optimization_mode_max_get_id);
+  default:
+    throw std::runtime_error("PPL Java interface internal error");
+  }
+}
+
+jobject
+build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status) {
+  jclass j_mip_status_class
+    = env->FindClass("ppl_java/MIP_Problem_Status");
+  jfieldID mip_status_unfeasible_get_id
+    = env->GetStaticFieldID(j_mip_status_class,
+			    "UNFEASIBLE_MIP_PROBLEM",
+			    "Lppl_java/MIP_Problem_Status;");
+  jfieldID mip_status_unbounded_get_id
+    = env->GetStaticFieldID(j_mip_status_class,
+			    "UNBOUNDED_MIP_PROBLEM",
+			    "Lppl_java/MIP_Problem_Status;");
+  jfieldID mip_status_optimized_get_id
+    = env->GetStaticFieldID(j_mip_status_class,
+			    "OPTIMIZED_MIP_PROBLEM",
+			    "Lppl_java/MIP_Problem_Status;");
+
+  switch (mip_status) {
+  case UNFEASIBLE_MIP_PROBLEM:
+    return env->GetStaticObjectField(j_mip_status_class,
+				     mip_status_unfeasible_get_id);
+  case UNBOUNDED_MIP_PROBLEM:
+    return  env->GetStaticObjectField(j_mip_status_class,
+				      mip_status_unbounded_get_id);
+  case OPTIMIZED_MIP_PROBLEM:
+    return  env->GetStaticObjectField(j_mip_status_class,
+				      mip_status_optimized_get_id);
+  default:
+    throw std::runtime_error("PPL Java interface internal error");
+  }
+}
+
+Coefficient
+build_ppl_coeff(JNIEnv* env, const jobject& j_coeff) {
+  jclass j_coeff_class = env->GetObjectClass(j_coeff);
+  jfieldID fid = env->GetFieldID(j_coeff_class, "value",
+				 "Ljava/math/BigInteger;");
+  jobject bi = env->GetObjectField(j_coeff, fid);
+  jclass big_integer_class = env->GetObjectClass(bi);
+  jmethodID bi_to_string = env->GetMethodID(big_integer_class, "toString",
+					    "()Ljava/lang/String;");
+  jstring bi_string = (jstring) env->CallObjectMethod(bi, bi_to_string);
+  const char *nativeString = env->GetStringUTFChars(bi_string, 0);
+  TEMP_INTEGER(ppl_coeff);
+  ppl_coeff = Coefficient(nativeString);
+  env->ReleaseStringUTFChars(bi_string, nativeString);
+  return ppl_coeff;
+}
+
+// Converts a PPL coefficient to a Java coefficient.
+jobject
+build_java_coeff(JNIEnv* env, const Coefficient& ppl_coeff) {
+  std::ostringstream s;
+  s << ppl_coeff;
+  jclass j_coefficient_class = env->FindClass("ppl_java/Coefficient");
+  jmethodID j_coefficient_ctr_id = env->GetMethodID(j_coefficient_class,
+						    "<init>",
+						    "(Ljava/lang/String;)V");
+  jstring coeff_string = env->NewStringUTF(s.str().c_str());
+  return env->NewObject(j_coefficient_class, j_coefficient_ctr_id,
+			coeff_string);
+}
+
+Constraint
+build_ppl_constraint(JNIEnv* env, const jobject& j_constraint) {
+  jclass constraint_class = env->FindClass("ppl_java/Constraint");
+  jclass rel_sym_class = env->FindClass("ppl_java/Relation_Symbol");
+  jfieldID lhs_field_id = env->GetFieldID(constraint_class, "lhs",
+					  "Lppl_java/Linear_Expression;");
+  jfieldID rhs_field_id = env->GetFieldID(constraint_class, "rhs",
+					  "Lppl_java/Linear_Expression;");
+  jobject lhs_value = env->GetObjectField(j_constraint, lhs_field_id);
+  jobject rhs_value = env->GetObjectField(j_constraint, rhs_field_id);
+  Linear_Expression first_le = build_linear_expression(env, lhs_value);
+  Linear_Expression second_le = build_linear_expression(env, rhs_value);
+  jfieldID kind_field_id = env->GetFieldID(constraint_class, "kind",
+					   "Lppl_java/Relation_Symbol;");
+  jobject kind = env->GetObjectField(j_constraint, kind_field_id);
+  jmethodID rel_sym_ordinal_id = env->GetMethodID(rel_sym_class, "ordinal",
+						  "()I");
+  jint rel_sym = env->CallIntMethod(kind, rel_sym_ordinal_id);
+  switch (rel_sym) {
+  case 0:
+    return Constraint(first_le < second_le);
+  case 1:
+    return Constraint(first_le <= second_le);
+  case 2:
+    return Constraint(first_le == second_le);
+  case 3:
+  if (rel_sym == 3)
+    return Constraint(first_le >= second_le);
+  case 4:
+    return Constraint(first_le > second_le);
+  default:
+    ;
+  }
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  env->ThrowNew(newExcCls, "ppl.java: \n runtime error");
+  // We should not be here!
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+
+Linear_Expression
+build_linear_expression(JNIEnv* env, const jobject& j_le) {
+  jclass le_sum_class = env->FindClass("ppl_java/Linear_Expression_Sum");
+  jclass le_difference_class
+    = env->FindClass("ppl_java/Linear_Expression_Difference");
+  jclass le_times_class
+    = env->FindClass("ppl_java/Linear_Expression_Times");
+  jclass le_unary_minus_class
+    = env->FindClass("ppl_java/Linear_Expression_Unary_Minus");
+  jclass j_coeff_le_class
+    = env->FindClass("ppl_java/Linear_Expression_Coefficient");
+  jclass j_variable_le_class
+    = env->FindClass("ppl_java/Linear_Expression_Variable");
+  jclass j_variable_class = env->FindClass("ppl_java/Variable");
+
+  jclass current_class = env->GetObjectClass(j_le);
+  // Variable
+  if (env->IsAssignableFrom(j_variable_le_class, current_class)) {
+    jfieldID arg_field_id = env->GetFieldID(j_variable_le_class,
+					    "arg",
+					    "Lppl_java/Variable;");
+    jobject var = env->GetObjectField(j_le, arg_field_id);
+    jfieldID varid_field_id = env->GetFieldID(j_variable_class,
+					      "varid",
+					      "I");
+
+    // Retrieve the value.
+    jint varid = env->GetIntField(var, varid_field_id);
+    return Linear_Expression(Variable(varid));
+  }
+  // Coefficient
+  if (env->IsAssignableFrom(j_coeff_le_class, current_class)) {
+    jfieldID coeff_field_id = env->GetFieldID(j_coeff_le_class,
+					      "coeff",
+					      "Lppl_java/Coefficient;");
+    jobject ppl_coeff = env->GetObjectField(j_le, coeff_field_id);
+
+    return Linear_Expression(build_ppl_coeff(env, ppl_coeff));
+  }
+  // Sum
+  if (env->IsAssignableFrom(le_sum_class, current_class)) {
+    jfieldID l_field_id = env->GetFieldID(current_class, "lhs",
+					  "Lppl_java/Linear_Expression;");
+    jfieldID r_field_id = env->GetFieldID(current_class, "rhs",
+					  "Lppl_java/Linear_Expression;");
+    jobject l_value = env->GetObjectField(j_le, l_field_id);
+    jobject r_value = env->GetObjectField(j_le, r_field_id);
+    return (build_linear_expression(env, l_value)
+	    + build_linear_expression(env, r_value));
+  }
+  // Difference
+  if (env->IsAssignableFrom(current_class, le_difference_class)) {
+    jfieldID l_field_id = env->GetFieldID(current_class, "lhs",
+					  "Lppl_java/Linear_Expression;");
+    jfieldID r_field_id = env->GetFieldID(current_class, "rhs",
+					  "Lppl_java/Linear_Expression;");
+    jobject l_value = env->GetObjectField(j_le, l_field_id);
+    jobject r_value = env->GetObjectField(j_le, r_field_id);
+    return (build_linear_expression(env, l_value)
+	    - build_linear_expression(env, r_value));
+  }
+  // Times
+  if (env->IsAssignableFrom(le_times_class, current_class)) {
+    jfieldID le_field_id = env->GetFieldID(current_class, "rhs",
+					   "Lppl_java/Linear_Expression;");
+    jfieldID le_coeff_field_id
+      = env->GetFieldID(current_class, "lhs",
+			"Lppl_java/Linear_Expression_Coefficient;");
+    jobject le_value = env->GetObjectField(j_le, le_field_id);
+    jobject le_coeff_value = env->GetObjectField(j_le, le_coeff_field_id);
+    jfieldID coeff_field_id = env->GetFieldID(j_coeff_le_class,
+					      "coeff",
+					      "Lppl_java/Coefficient;");
+    jobject ppl_coeff = env->GetObjectField(le_coeff_value, coeff_field_id);
+    return (build_ppl_coeff(env, ppl_coeff)
+	    * build_linear_expression(env, le_value));
+  }
+  // Unary_Minus
+  if (env->IsAssignableFrom(current_class, le_unary_minus_class)) {
+    jfieldID le_field_id = env->GetFieldID(current_class, "arg",
+					   "Lppl_java/Linear_Expression;");
+    jobject le_value = env->GetObjectField(j_le, le_field_id);
+    return (-build_linear_expression(env, le_value));
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+Generator
+build_ppl_generator(JNIEnv* env, const jobject& j_generator) {
+  jclass generator_class = env->FindClass("ppl_java/Generator");
+  jclass generator_type_class = env->FindClass("ppl_java/Generator_Type");
+
+  jfieldID j_le_field = env->GetFieldID(generator_class, "le",
+					"Lppl_java/Linear_Expression;");
+  jobject j_le = env->GetObjectField(j_generator, j_le_field);
+  jfieldID j_coeff_field = env->GetFieldID(generator_class, "den",
+					   "Lppl_java/Coefficient;");
+  jobject j_coeff = env->GetObjectField(j_generator, j_coeff_field);
+
+  jfieldID generator_type_field = env->GetFieldID(generator_class, "gt",
+						  "Lppl_java/Generator_Type;");
+  jobject generator_type = env->GetObjectField(j_generator,
+					       generator_type_field);
+  jmethodID generator_type_ordinal_id = env->GetMethodID(generator_type_class,
+							 "ordinal",
+							 "()I");
+  jint generator_type_ordinal = env->CallIntMethod(generator_type,
+						   generator_type_ordinal_id);
+  switch (generator_type_ordinal) {
+  case 0:
+    return line(build_linear_expression(env, j_le));
+  case 1:
+    return ray(build_linear_expression(env, j_le));
+  case 2:
+    return point(build_linear_expression(env, j_le),
+		 build_ppl_coeff(env, j_coeff));
+  case 3:
+    return closure_point(build_linear_expression(env, j_le),
+			 build_ppl_coeff(env, j_coeff));
+  default:
+    ;
+  }
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  env->ThrowNew(newExcCls, "ppl.java: \n runtime error");
+  // We should not be here!
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+Grid_Generator
+build_ppl_grid_generator(JNIEnv* env, const jobject& j_grid_generator) {
+  jclass grid_generator_class = env->FindClass("ppl_java/Grid_Generator");
+  jclass grid_generator_type_class
+    = env->FindClass("ppl_java/Grid_Generator_Type");
+
+  jfieldID j_le_field = env->GetFieldID(grid_generator_class,
+					"le",
+					"Lppl_java/Linear_Expression;");
+  jobject j_le = env->GetObjectField(j_grid_generator, j_le_field);
+  jfieldID j_coeff_field = env->GetFieldID(grid_generator_class,
+					   "coeff",
+					   "Lppl_java/Coefficient;");
+  jobject j_coeff = env->GetObjectField(j_grid_generator, j_coeff_field);
+
+  jfieldID grid_generator_type_field
+    = env->GetFieldID(grid_generator_class,
+		      "gt",
+		      "Lppl_java/Grid_Generator_Type;");
+  jobject grid_generator_type = env->GetObjectField(j_grid_generator,
+						    grid_generator_type_field);
+  jmethodID grid_generator_type_ordinal_id
+    = env->GetMethodID(grid_generator_type_class,
+		       "ordinal",
+		       "()I");
+  jint grid_generator_type_ordinal
+    = env->CallIntMethod(grid_generator_type,
+			 grid_generator_type_ordinal_id);
+  switch (grid_generator_type_ordinal) {
+  case 0:
+    return grid_line(build_linear_expression(env, j_le));
+  case 1:
+    return parameter(build_linear_expression(env, j_le),
+		     build_ppl_coeff(env, j_coeff));
+  case 2:
+    return grid_point(build_linear_expression(env, j_le),
+		      build_ppl_coeff(env, j_coeff));
+  default:
+    ;
+  }
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  env->ThrowNew(newExcCls, "ppl.java: \n runtime error");
+  // We should not be here!
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+jlong
+get_ptr(JNIEnv* env, const jobject& ppl_object) {
+  jclass ppl_object_class = env->GetObjectClass(ppl_object);
+  jfieldID pointer_field = env->GetFieldID(ppl_object_class, "ptr","J");
+  return  env->GetLongField(ppl_object, pointer_field);
+}
+
+
+void
+set_is_a_reference(JNIEnv* env, const jobject& ppl_object, const bool reference) {
+  jclass ppl_object_class = env->GetObjectClass(ppl_object);
+  jfieldID is_a_reference_field = env->GetFieldID(ppl_object_class,
+						 "is_a_reference","Z");
+ env->SetBooleanField(ppl_object, is_a_reference_field, reference);
+
+}
+
+bool
+is_a_reference(JNIEnv* env, const jobject& ppl_object) {
+  jclass ppl_object_class = env->GetObjectClass(ppl_object);
+  jfieldID is_a_reference_field = env->GetFieldID(ppl_object_class,
+						 "is_a_reference","Z");
+  return env->GetBooleanField(ppl_object, is_a_reference_field);
+
+}
+
+
+Grid_Generator_System
+build_ppl_grid_generator_system(JNIEnv* env, const jobject& j_iterable) {
+  jclass j_iterable_class = env->GetObjectClass(j_iterable);
+  jclass iterator_java_class = env->FindClass("java/util/Iterator");
+  Grid_Generator_System ggs;
+  jmethodID iterator_method_id = env->GetMethodID(j_iterable_class,
+						  "iterator",
+ 						  "()Ljava/util/Iterator;");
+  jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id);
+  jmethodID has_next_method_id = env->GetMethodID(iterator_java_class,
+  						  "hasNext",
+  						  "()Z");
+  jboolean has_next_value = env->CallBooleanMethod(j_iterator,
+						   has_next_method_id);
+  jmethodID next_method_id = env->GetMethodID(iterator_java_class,
+					      "next",
+					      "()Ljava/lang/Object;");
+
+  while (has_next_value) {
+    jobject j_grid_generator = env->CallObjectMethod(j_iterator,
+						 next_method_id);
+    ggs.insert(build_ppl_grid_generator(env, j_grid_generator));
+    has_next_value = env->CallBooleanMethod(j_iterator,
+					    has_next_method_id);
+  }
+  return ggs;
+}
+
+
+Constraint_System
+build_ppl_constraint_system(JNIEnv* env, const jobject& j_iterable) {
+  jclass j_iterable_class = env->GetObjectClass(j_iterable);
+  jclass iterator_java_class = env->FindClass("java/util/Iterator");
+  Constraint_System cs;
+  jmethodID iterator_method_id = env->GetMethodID(j_iterable_class,
+						  "iterator",
+ 						  "()Ljava/util/Iterator;");
+  jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id);
+  jmethodID has_next_method_id = env->GetMethodID(iterator_java_class,
+  						  "hasNext",
+  						  "()Z");
+  jboolean has_next_value = env->CallBooleanMethod(j_iterator,
+						   has_next_method_id);
+  jmethodID next_method_id = env->GetMethodID(iterator_java_class,
+					      "next",
+					      "()Ljava/lang/Object;");
+
+  while (has_next_value) {
+    jobject j_constraint = env->CallObjectMethod(j_iterator,
+						 next_method_id);
+    cs.insert(build_ppl_constraint(env, j_constraint));
+    has_next_value = env->CallBooleanMethod(j_iterator,
+					    has_next_method_id);
+  }
+ return cs;
+}
+
+Generator_System
+build_ppl_generator_system(JNIEnv* env, const jobject& j_iterable) {
+  jclass j_iterable_class = env->GetObjectClass(j_iterable);
+  jclass iterator_java_class = env->FindClass("java/util/Iterator");
+  Generator_System gs;
+  jmethodID iterator_method_id = env->GetMethodID(j_iterable_class,
+						  "iterator",
+ 						  "()Ljava/util/Iterator;");
+  jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id);
+  jmethodID has_next_method_id = env->GetMethodID(iterator_java_class,
+  						  "hasNext",
+  						  "()Z");
+  jboolean has_next_value = env->CallBooleanMethod(j_iterator,
+						   has_next_method_id);
+  jmethodID next_method_id = env->GetMethodID(iterator_java_class,
+					      "next",
+					      "()Ljava/lang/Object;");
+
+  while (has_next_value) {
+    jobject j_constraint = env->CallObjectMethod(j_iterator,
+						 next_method_id);
+    gs.insert(build_ppl_generator(env, j_constraint));
+    has_next_value = env->CallBooleanMethod(j_iterator,
+					    has_next_method_id);
+  }
+  return gs;
+}
+
+Congruence_System
+build_ppl_congruence_system(JNIEnv* env, const jobject& j_iterable) {
+  jclass j_iterable_class = env->GetObjectClass(j_iterable);
+  jclass iterator_java_class = env->FindClass("java/util/Iterator");
+  Congruence_System cgs;
+  jmethodID iterator_method_id = env->GetMethodID(j_iterable_class,
+						  "iterator",
+ 						  "()Ljava/util/Iterator;");
+  jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id);
+  jmethodID has_next_method_id = env->GetMethodID(iterator_java_class,
+  						  "hasNext",
+  						  "()Z");
+  jboolean has_next_value = env->CallBooleanMethod(j_iterator,
+						   has_next_method_id);
+  jmethodID next_method_id = env->GetMethodID(iterator_java_class,
+					      "next",
+					      "()Ljava/lang/Object;");
+
+  while (has_next_value) {
+    jobject j_congruence = env->CallObjectMethod(j_iterator,
+						 next_method_id);
+    cgs.insert(build_ppl_congruence(env, j_congruence));
+    has_next_value = env->CallBooleanMethod(j_iterator,
+					    has_next_method_id);
+  }
+  return cgs;
+}
+
+jobject
+get_le_inhomogeneous_term(JNIEnv* env, const Coefficient& c) {
+  jclass j_le_coeff_class
+    = env->FindClass("ppl_java/Linear_Expression_Coefficient");
+  jobject j_coeff =  build_java_coeff(env, c);
+  jmethodID j_le_coeff_ctr_id
+    = env->GetMethodID(j_le_coeff_class,
+		       "<init>",
+		       "(Lppl_java/Coefficient;)V");
+  return env->NewObject(j_le_coeff_class, j_le_coeff_ctr_id,
+			j_coeff);
+}
+
+void set_generator(JNIEnv* env, jobject& to_be_set,
+		   const jobject& gen) {
+  jclass j_generator_class = env->FindClass("ppl_java/Generator");
+  jmethodID j_coeff_set_id = env->GetMethodID(j_generator_class, "set",
+					      "(Lppl_java/Generator;)V");
+  env->CallVoidMethod(to_be_set, j_coeff_set_id, gen);
+}
+
+void set_grid_generator(JNIEnv* env, jobject& to_be_set,
+			 const jobject& gen) {
+  jclass j_generator_class = env->FindClass("ppl_java/Grid_Generator");
+  jmethodID j_coeff_set_id = env->GetMethodID(j_generator_class, "set",
+					      "(Lppl_java/Grid_Generator;)V");
+  env->CallVoidMethod(to_be_set, j_coeff_set_id, gen);
+}
+
+void set_coefficient(JNIEnv* env, jobject& to_be_set,
+		     const jobject& c) {
+  jclass j_coeff_class = env->FindClass("ppl_java/Coefficient");
+  jmethodID j_coeff_set_id = env->GetMethodID(j_coeff_class, "set",
+					   "(Lppl_java/Coefficient;)V");
+  env->CallVoidMethod(to_be_set, j_coeff_set_id, c);
+}
+
+void set_by_reference(JNIEnv* env, jobject& by_ref_to_be_set,
+		      const jobject& to_insert) {
+  jclass by_reference_class = env->FindClass("ppl_java/By_Reference");
+  jfieldID obj_field_id = env->GetFieldID(by_reference_class,
+					  "obj",
+					  "Ljava/lang/Object;");
+  env->SetObjectField(by_ref_to_be_set, obj_field_id, to_insert);
+}
+
+jobject get_by_reference(JNIEnv* env, const jobject& by_ref_integer) {
+  jclass by_reference_class = env->FindClass("ppl_java/By_Reference");
+  jfieldID obj_field_id = env->GetFieldID(by_reference_class,
+					  "obj",
+					  "Ljava/lang/Object;");
+  return env->GetObjectField(by_ref_integer, obj_field_id);
+}
+
+void set_pair_element(JNIEnv* env, jobject& pair_to_be_set,
+		      int arg,  const jobject& to_insert) {
+  jclass pair_class = env->FindClass("ppl_java/Pair");
+  switch (arg) {
+  case 0: {
+    jfieldID obj_field_id = env->GetFieldID(pair_class,
+					    "first",
+					    "Ljava/lang/Object;");
+    env->SetObjectField(pair_to_be_set, obj_field_id, to_insert);
+    return;
+  }
+  case 1: {
+    jfieldID obj_field_id = env->GetFieldID(pair_class,
+					    "second",
+					    "Ljava/lang/Object;");
+    env->SetObjectField(pair_to_be_set, obj_field_id, to_insert);
+    return;
+  }
+  default:
+    throw std::runtime_error("PPL Java interface internal error: pair value"
+			     " not allowed");
+  }
+  throw std::runtime_error("PPL Java interface internal error");
+}
+
+
+jobject get_pair_element(JNIEnv* env, int arg, const jobject& j_pair) {
+  jclass pair_class = env->FindClass("ppl_java/Pair");
+  switch (arg) {
+  case 0: {
+    jfieldID obj_field_id = env->GetFieldID(pair_class,
+					    "first",
+					    "Ljava/lang/Object;");
+    return env->GetObjectField(j_pair, obj_field_id);
+  }
+  case 1: {
+    jfieldID obj_field_id = env->GetFieldID(pair_class,
+					    "second",
+					    "Ljava/lang/Object;");
+    return env->GetObjectField(j_pair, obj_field_id);
+  }
+  default:
+    throw std::runtime_error("PPL Java interface internal error: pair value"
+			     " not allowed");
+ }
+ throw std::runtime_error("PPL Java interface internal error");
+}
+
+
+
+jboolean is_null(JNIEnv* env, jobject obj) {
+  jclass by_reference_class = env->FindClass("ppl_java/By_Reference");
+  jmethodID j_reference_is_null_id
+   = env->GetStaticMethodID(by_reference_class,
+			    "is_null",
+			    "(Ljava/lang/Object;)Z");
+  return env->CallStaticBooleanMethod(by_reference_class,
+				      j_reference_is_null_id, obj);
+}
+
+jobject
+build_java_constraint(JNIEnv* env, const Constraint& c) {
+  jclass j_constraint_class = env->FindClass("ppl_java/Constraint");
+  jclass j_rel_sym_class = env->FindClass("ppl_java/Relation_Symbol");
+  jmethodID j_constraint_ctr_id
+    = env->GetMethodID(j_constraint_class,
+		       "<init>",
+		       "(Lppl_java/Linear_Expression;"
+		       "Lppl_java/Relation_Symbol;"
+		       "Lppl_java/Linear_Expression;)V");
+  jfieldID rel_sym_eq_get_id
+    = env->GetStaticFieldID(j_rel_sym_class,
+			    "EQUAL",
+			    "Lppl_java/Relation_Symbol;");
+   jfieldID rel_sym_gt_get_id
+     = env->GetStaticFieldID(j_rel_sym_class,
+ 			    "GREATER_THAN",
+ 			    "Lppl_java/Relation_Symbol;");
+   jfieldID rel_sym_gtoeq_get_id
+     = env->GetStaticFieldID(j_rel_sym_class,
+ 			    "GREATER_OR_EQUAL",
+ 			    "Lppl_java/Relation_Symbol;");
+   jobject lhs = get_linear_expression(env, c);
+   jobject rhs = get_le_inhomogeneous_term(env, -c.inhomogeneous_term());
+   jobject relation;
+   switch (c.type()) {
+   case Constraint::EQUALITY:
+     relation = env->GetStaticObjectField(j_rel_sym_class,
+					  rel_sym_eq_get_id);
+     break;
+   case Constraint::NONSTRICT_INEQUALITY:
+     relation = env->GetStaticObjectField(j_rel_sym_class,
+					  rel_sym_gtoeq_get_id);
+     break;
+  case Constraint::STRICT_INEQUALITY:
+    relation = env->GetStaticObjectField(j_rel_sym_class,
+					 rel_sym_gt_get_id);
+    break;
+   default:
+     throw std::runtime_error("PPL Java interface internal error");
+   }
+   return env->NewObject(j_constraint_class,j_constraint_ctr_id,
+			 lhs, relation, rhs);
+}
+
+jobject
+build_java_congruence(JNIEnv* env, const Congruence& cg) {
+  jclass j_congruence_class = env->FindClass("ppl_java/Congruence");
+  jmethodID j_congruence_ctr_id
+    = env->GetMethodID(j_congruence_class,
+		       "<init>",
+		       "(Lppl_java/Linear_Expression;"
+		       "Lppl_java/Linear_Expression;"
+		       "Lppl_java/Coefficient;)V");
+
+  jobject j_modulus = build_java_coeff(env, cg.modulus());
+  jobject lhs = get_linear_expression(env, cg);
+  jobject rhs = get_le_inhomogeneous_term(env, -cg.inhomogeneous_term());
+  return env->NewObject(j_congruence_class, j_congruence_ctr_id,
+			lhs, rhs,
+			j_modulus);
+
+}
+
+jobject
+build_java_generator(JNIEnv* env, const Generator& g) {
+  jclass j_generator_class = env->FindClass("ppl_java/Generator");
+  jmethodID line_ctr_id =
+    env->GetStaticMethodID(j_generator_class,
+			   "line",
+			   "(Lppl_java/Linear_Expression;)"
+			   "Lppl_java/Generator;");
+  jmethodID ray_ctr_id =
+    env->GetStaticMethodID(j_generator_class,
+			   "ray",
+			   "(Lppl_java/Linear_Expression;)"
+			   "Lppl_java/Generator;");
+  jmethodID point_ctr_id =
+    env->GetStaticMethodID(j_generator_class,
+			   "point",
+			   "(Lppl_java/Linear_Expression;"
+			   "Lppl_java/Coefficient;)"
+			   "Lppl_java/Generator;");
+  jmethodID closure_point_ctr_id =
+    env->GetStaticMethodID(j_generator_class,
+			   "closure_point",
+			   "(Lppl_java/Linear_Expression;"
+			   "Lppl_java/Coefficient;)"
+			   "Lppl_java/Generator;");
+  jobject j_g_le = get_linear_expression(env, g);
+  jobject jcoeff = build_java_coeff(env, Coefficient(1));
+  switch (g.type()) {
+  case Generator::LINE:
+    return env->CallStaticObjectMethod(j_generator_class,
+				       line_ctr_id, j_g_le);
+  case Generator::RAY:
+    return env->CallStaticObjectMethod(j_generator_class,
+				       ray_ctr_id, j_g_le);
+  case Generator::POINT:
+    {
+      const Coefficient& divisor = g.divisor();
+      j_g_le = get_linear_expression(env, g);
+      jcoeff = build_java_coeff(env, divisor);
+      return env->CallStaticObjectMethod(j_generator_class,
+					 point_ctr_id, j_g_le, jcoeff);
+    }
+  case Generator::CLOSURE_POINT:
+    {
+      const Coefficient& divisor = g.divisor();
+      j_g_le = get_linear_expression(env, g);
+      jcoeff = build_java_coeff(env, divisor);
+      return env->CallStaticObjectMethod(j_generator_class,
+					 closure_point_ctr_id, j_g_le, jcoeff);
+    }
+  default:
+    throw std::runtime_error("PPL Java interface internal error");
+  }
+}
+
+jobject
+build_java_grid_generator(JNIEnv* env, const Grid_Generator& g) {
+  jclass j_grid_generator_class = env->FindClass("ppl_java/Grid_Generator");
+  jmethodID line_ctr_id =
+    env->GetStaticMethodID(j_grid_generator_class,
+			   "grid_line",
+			   "(Lppl_java/Linear_Expression;)"
+			   "Lppl_java/Grid_Generator;");
+  jmethodID parameter_ctr_id =
+    env->GetStaticMethodID(j_grid_generator_class,
+			   "parameter",
+			   "(Lppl_java/Linear_Expression;"
+			   "Lppl_java/Coefficient;)"
+			   "Lppl_java/Grid_Generator;");
+  jmethodID point_ctr_id =
+    env->GetStaticMethodID(j_grid_generator_class,
+			   "grid_point",
+			   "(Lppl_java/Linear_Expression;"
+			   "Lppl_java/Coefficient;)"
+			   "Lppl_java/Grid_Generator;");
+  jobject j_g_le = get_linear_expression(env, g);
+  jobject jcoeff = build_java_coeff(env, Coefficient(1));
+  switch (g.type()) {
+  case Grid_Generator::LINE:
+    return env->CallStaticObjectMethod(j_grid_generator_class,
+				       line_ctr_id, j_g_le);
+  case Grid_Generator::PARAMETER:
+    {
+      const Coefficient& divisor = g.divisor();
+      j_g_le = get_linear_expression(env, g);
+      jcoeff = build_java_coeff(env, divisor);
+      return env->CallStaticObjectMethod(j_grid_generator_class,
+					 parameter_ctr_id, j_g_le, jcoeff);
+    }
+  case Grid_Generator::POINT:
+    {
+      const Coefficient& divisor = g.divisor();
+      j_g_le = get_linear_expression(env, g);
+      jcoeff = build_java_coeff(env, divisor);
+      return env->CallStaticObjectMethod(j_grid_generator_class,
+					 point_ctr_id, j_g_le, jcoeff);
+    }
+  default:
+    throw std::runtime_error("PPL Java interface internal error");
+  }
+}
+
+jobject
+build_java_constraint_system(JNIEnv* env, const Constraint_System& cs) {
+  jclass j_cs_class = env->FindClass("ppl_java/Constraint_System");
+  jmethodID j_cs_ctr_id = env->GetMethodID(j_cs_class, "<init>", "()V");
+  jmethodID j_cs_add_id = env->GetMethodID(j_cs_class, "add",
+					   "(Ljava/lang/Object;)Z");
+  jobject j_cs = env->NewObject(j_cs_class, j_cs_ctr_id);
+  for (Constraint_System::const_iterator v_begin = cs.begin(),
+ 	 v_end = cs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_constraint = build_java_constraint(env, *v_begin);
+    env->CallBooleanMethod(j_cs, j_cs_add_id, j_constraint);
+  }
+  return j_cs;
+}
+
+jobject
+build_java_generator_system(JNIEnv* env, const Generator_System& gs) {
+  jclass j_gs_class = env->FindClass("ppl_java/Generator_System");
+  jmethodID j_gs_ctr_id = env->GetMethodID(j_gs_class, "<init>", "()V");
+  jmethodID j_gs_add_id = env->GetMethodID(j_gs_class, "add",
+					   "(Ljava/lang/Object;)Z");
+  jobject j_gs = env->NewObject(j_gs_class, j_gs_ctr_id);
+  for (Generator_System::const_iterator v_begin = gs.begin(),
+ 	 v_end = gs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_generator = build_java_generator(env, *v_begin);
+    env->CallBooleanMethod(j_gs, j_gs_add_id, j_generator);
+  }
+  return j_gs;
+}
+
+jobject
+build_java_grid_generator_system(JNIEnv* env,
+				 const Grid_Generator_System& gs) {
+  jclass j_gs_class = env->FindClass("ppl_java/Grid_Generator_System");
+  jmethodID j_gs_ctr_id = env->GetMethodID(j_gs_class, "<init>", "()V");
+  jmethodID j_gs_add_id = env->GetMethodID(j_gs_class, "add",
+					   "(Ljava/lang/Object;)Z");
+  jobject j_gs = env->NewObject(j_gs_class, j_gs_ctr_id);
+  for (Grid_Generator_System::const_iterator v_begin = gs.begin(),
+ 	 v_end = gs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_generator = build_java_grid_generator(env, *v_begin);
+    env->CallBooleanMethod(j_gs, j_gs_add_id, j_generator);
+  }
+  return j_gs;
+}
+
+jobject
+build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs) {
+  jclass j_cgs_class = env->FindClass("ppl_java/Congruence_System");
+  jmethodID j_cgs_ctr_id = env->GetMethodID(j_cgs_class, "<init>", "()V");
+  jmethodID j_cgs_add_id = env->GetMethodID(j_cgs_class, "add",
+					    "(Ljava/lang/Object;)Z");
+  jobject j_cgs = env->NewObject(j_cgs_class, j_cgs_ctr_id);
+  for (Congruence_System::const_iterator v_begin = cgs.begin(),
+  	 v_end = cgs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_congruence = build_java_congruence(env,*v_begin);
+    env->CallBooleanMethod(j_cgs, j_cgs_add_id, j_congruence);
+  }
+  return j_cgs;
+}
diff --git a/interfaces/Java/jni/ppl_java_common.hh b/interfaces/Java/jni/ppl_java_common.hh
new file mode 100644
index 0000000..faea48f
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common.hh
@@ -0,0 +1,451 @@
+/* PPL Java interface common routines declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <jni.h>
+#include <ppl.hh>
+#include "interfaced_boxes.hh"
+
+using namespace Parma_Polyhedra_Library;
+
+#define CATCH_ALL \
+  catch(const std::overflow_error& e) { \
+    handle_exception(env, e); \
+  } \
+  catch(const std::length_error& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const std::bad_alloc& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const std::domain_error& e) { \
+    handle_exception(env, e); \
+  } \
+ catch (const std::invalid_argument& e) { \
+    handle_exception(env, e); \
+  } \
+ catch(const std::logic_error& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const std::exception& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (...) { \
+    handle_exception(env); \
+  };
+
+
+void
+handle_exception(JNIEnv* env, const std::logic_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::invalid_argument& e);
+
+void
+handle_exception(JNIEnv* env, const std::domain_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::overflow_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::length_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::bad_alloc&);
+
+void
+handle_exception(JNIEnv* env, const std::exception& e);
+
+void
+handle_exception(JNIEnv* env);
+
+/*! \brief
+  Converts a Java native number to an unsigned C++ number.
+
+  \param value
+  The Java native number of type V to be converted.
+
+  \exception std::invalid_argument
+  Thrown if the Java number is negative.
+*/
+template <typename U, typename V>
+U
+jtype_to_unsigned(const V& value) {
+  if (value < 0)
+    throw std::invalid_argument("not an unsigned integer.");
+
+  if (sizeof(U) < sizeof(V)) {
+    if (value
+        > static_cast<V>(std::numeric_limits<U>::max()))
+      throw std::invalid_argument("unsigned integer out of range.");
+  }
+
+  return value;
+}
+
+ // Converts a C++ bool to a Java boolean.
+jobject
+bool_to_j_boolean(JNIEnv* env,
+ 		  const bool bool_value);
+
+jint
+j_integer_to_j_int(JNIEnv* env, const jobject& j_integer);
+
+jobject
+j_int_to_j_integer(JNIEnv* env, const jint& jint_value);
+
+jlong
+j_long_class_to_j_long(JNIEnv* env, const jobject& j_long);
+
+jobject
+j_long_to_j_long_class(JNIEnv* env, const jlong& jlong_value);
+
+// Sets a Java object to be (or not) deleted after the automatic
+// call to `finalize()'. For example, object that are taken from iterators
+// should not be deleted.
+void
+set_is_a_reference(JNIEnv* env, const jobject& ppl_object,
+		   const bool reference);
+
+// Returns a <CODE>true</CODE> if and only if the Java object
+// is a reference to a C++ object, <CODE>false</CODE> otherwise.
+bool
+is_a_reference(JNIEnv* env, const jobject& ppl_object);
+
+
+// Converts a PPL Poly_Gen_Relation to a Java Poly_Gen_Relation.
+jobject
+build_java_poly_gen_relation(JNIEnv* env,
+			     Poly_Gen_Relation& pcr);
+
+// Converts a PPL Poly_Con_Relation to a Java Poly_Con_Relation.
+jobject
+build_java_poly_con_relation(JNIEnv* env,
+			    Poly_Con_Relation& pgr);
+
+// Converts a Java variables set to a PPL variables set.
+Parma_Polyhedra_Library::Variables_Set
+build_ppl_variables_set(JNIEnv* env,
+			const jobject& variables_set);
+
+// Converts a Java variables set to a PPL variables set.
+jobject
+build_java_variables_set(JNIEnv* env,
+			 const Variables_Set& variables_set);
+
+// Converts a Java relation symbol to a PPL relation_symbol.
+Parma_Polyhedra_Library::Relation_Symbol
+build_ppl_relsym(JNIEnv* env, const jobject& j_relsym);
+
+// Converts a Java optimization mode to a PPL optimization mode.
+Parma_Polyhedra_Library::Optimization_Mode
+build_ppl_optimization_mode(JNIEnv* env, const jobject& j_opt_mode);
+
+// Converts a PPL optimization mode to a Java optimization mode.
+jobject
+build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode);
+
+jobject
+build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status);
+
+// Converts a Java variable to a PPL variable.
+Parma_Polyhedra_Library::Variable
+build_ppl_variable(JNIEnv* env, const jobject& j_var);
+
+
+// Converts a Java variable to a PPL variable.
+jobject
+build_java_variable(JNIEnv* env, const Variable& var);
+
+// Converts a Java coefficient to a PPL coefficient.
+Parma_Polyhedra_Library::Coefficient
+build_ppl_coeff(JNIEnv* env, const jobject& j_coeff);
+
+// Converts a PPL coefficient to a Java coefficient.
+jobject
+build_java_coeff(JNIEnv* env,
+		     const Parma_Polyhedra_Library::Coefficient& ppl_coeff);
+
+// Builds a PPL constraint from a Java constraint.
+Parma_Polyhedra_Library::Constraint
+build_ppl_constraint(JNIEnv* env, const jobject& j_constraint);
+
+// Builds a PPL linear expression from a Java linear expression.
+Parma_Polyhedra_Library::Linear_Expression
+build_linear_expression(JNIEnv* env, const jobject& j_le);
+
+// Builds a PPL congruence from a Java congruence.
+Parma_Polyhedra_Library::Congruence
+build_ppl_congruence(JNIEnv* env, const jobject& j_cg);
+
+// Builds a PPL generator from a Java generator.
+Parma_Polyhedra_Library::Generator
+build_ppl_generator(JNIEnv* env, const jobject& j_g);
+
+// Builds a PPL grid generator from a Java grid generator.
+Parma_Polyhedra_Library::Grid_Generator
+build_ppl_grid_generator(JNIEnv* env, const jobject& j_g);
+
+// Builds a Java grid generator from a PPL grid generator.
+jobject
+build_java_grid_generator(JNIEnv* env, const Grid_Generator& grid_g);
+
+// Get a pointer to the underlying C++ object from a Java object.
+jlong
+get_ptr(JNIEnv* env, const jobject& ppl_object);
+
+
+// Builds a PPL grid generator system from a Java grid generator system.
+Parma_Polyhedra_Library::Grid_Generator_System
+build_ppl_grid_generator_system(JNIEnv* env, const jobject& j_g);
+
+
+// Builds a PPL constraint system from a Java constraint system.
+Parma_Polyhedra_Library::Constraint_System
+build_ppl_constraint_system(JNIEnv* env, const jobject& j_iterable);
+
+// Builds a PPL generator system from a Java generator system.
+Parma_Polyhedra_Library::Generator_System
+build_ppl_generator_system(JNIEnv* env, const jobject& j_iterable);
+
+// Builds a PPL congruence system from a Java congruence system.
+Parma_Polyhedra_Library::Congruence_System
+build_ppl_congruence_system(JNIEnv* env, const jobject& j_iterable);
+
+// Builds a Java constraint from a PPL constraint.
+jobject
+build_java_constraint(JNIEnv* env, const Constraint& c);
+
+// Builds a Java congruence from a PPL congruence.
+jobject
+build_java_congruence(JNIEnv* env, const Congruence& cg);
+
+// Builds a Java generator from a PPL generator.
+jobject
+build_java_generator(JNIEnv* env, const Generator& cg);
+
+// Builds a Java constraint system from a PPL constraint system.
+jobject
+build_java_constraint_system(JNIEnv* env, const Constraint_System& cs);
+
+// FIXME: implement me
+// Builds a PPL grid generator from a Java grid generator.
+jobject
+build_java_grid_generator_system(JNIEnv* env,
+				  const Grid_Generator_System& grid_g_system);
+
+// Builds a Java generator system from a PPL generator system.
+jobject
+build_java_generator_system(JNIEnv* env, const Generator_System& gs);
+
+// Builds a Java congruence system from a PPL congruence system.
+jobject
+build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs);
+
+// Utility routine to take the inhomogeneous term from a constraint or a
+// congruence.
+jobject
+get_le_inhomogeneous_term(JNIEnv* env, const Coefficient& c);
+
+void set_generator(JNIEnv* env, jobject& to_be_set,
+		   const jobject& gen);
+
+void set_grid_generator(JNIEnv* env, jobject& to_be_set,
+			const jobject& g_gen);
+
+void set_coefficient(JNIEnv* env, jobject& to_be_set,
+		     const jobject& c);
+
+void set_by_reference(JNIEnv* env, jobject& by_ref_to_be_set,
+		      const jobject& to_insert);
+
+jobject get_by_reference(JNIEnv* env, const jobject& by_ref_integer);
+
+
+// Utility to set a value a ppl_java Pair. the argument `arg' has two
+// possible values: 0 to set `first', 1 to `second'.
+void set_pair_element(JNIEnv* env, jobject& pair_to_be_set, int arg,
+		      const jobject& obj_to_insert);
+
+// Utility to get a value from a ppl_java Pair. the argument `arg' has two
+// possible values: 0 to set `first', 1 to `second'.
+jobject get_pair_element(JNIEnv* env, int arg, const jobject& pair);
+
+jboolean is_null(JNIEnv* env, jobject obj);
+
+
+
+
+// FIXME: this section is in the header file to allow g++ to build
+//        templatic code
+
+// Set the pointer of the underlying C++ object in the Java object
+template <typename T>
+void
+set_ptr(JNIEnv* env, const jobject& ppl_object, const T* address) {
+  jclass ppl_object_class = env->GetObjectClass(ppl_object);
+  jfieldID pointer_field = env->GetFieldID(ppl_object_class, "ptr","J");
+  env->SetLongField(ppl_object, pointer_field, (long long) address);
+
+}
+
+// Builds the Java linear expression starting from a congruence,
+// a constraint or a generator.
+template <typename R>
+jobject
+get_linear_expression(JNIEnv* env, const R& r) {
+  jclass j_le_coeff_class
+    = env->FindClass("ppl_java/Linear_Expression_Coefficient");
+  jclass j_le_class
+    = env->FindClass("ppl_java/Linear_Expression");
+  jclass j_le_variable_class
+    = env->FindClass("ppl_java/Linear_Expression_Variable");
+  jclass j_variable_class
+    = env->FindClass("ppl_java/Variable");
+  TEMP_INTEGER(coefficient);
+  dimension_type varid = 0;
+  dimension_type space_dimension = r.space_dimension();
+  jobject j_le_term;
+  jmethodID j_variable_ctr_id
+    = env->GetMethodID(j_variable_class,
+		       "<init>",
+		       "(I)V");
+  jmethodID j_le_variable_ctr_id
+    = env->GetMethodID(j_le_variable_class,
+		       "<init>",
+		       "(Lppl_java/Variable;)V");
+
+  jmethodID j_le_times_id
+    = env->GetMethodID(j_le_class,
+		       "times",
+		       "(Lppl_java/Coefficient;)Lppl_java/Linear_Expression;");
+
+  while (varid < space_dimension
+ 	 && (coefficient = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    jobject j_coefficient_zero = build_java_coeff(env, Coefficient(0));
+    jmethodID j_le_coeff_ctr_id
+      = env->GetMethodID(j_le_coeff_class, "<init>",
+			 "(Lppl_java/Coefficient;)V");
+    return env->NewObject(j_le_coeff_class, j_le_coeff_ctr_id,
+			  j_coefficient_zero);
+  }
+  else {
+    jobject j_coefficient = build_java_coeff(env, coefficient);
+    jobject j_variable = env->NewObject(j_variable_class, j_variable_ctr_id,
+					varid);
+    jobject j_le_variable = env->NewObject(j_le_variable_class,
+					   j_le_variable_ctr_id,
+					   j_variable);
+    j_le_term =  env->CallObjectMethod(j_le_variable,
+				       j_le_times_id, j_coefficient);
+    while (true) {
+      ++varid;
+      while (varid < space_dimension
+	     && (coefficient = r.coefficient(Variable(varid))) == 0)
+	++varid;
+      if (varid >= space_dimension)
+	break;
+      else {
+ 	j_coefficient = build_java_coeff(env, coefficient);
+ 	j_variable = env->NewObject(j_variable_class,
+				    j_variable_ctr_id,
+				    varid);
+  	j_le_variable = env->NewObject(j_le_variable_class,
+				       j_le_variable_ctr_id,
+				       j_variable);
+ 	jobject j_le_term2 = env->CallObjectMethod(j_le_variable,
+						   j_le_times_id,
+						   j_coefficient);
+  	jmethodID j_le_sum_id
+  	  = env->GetMethodID(j_le_class,
+  			     "sum",
+  			     "(Lppl_java/Linear_Expression;)"
+			     "Lppl_java/Linear_Expression;");
+ 	j_le_term = env->CallObjectMethod(j_le_term, j_le_sum_id, j_le_term2);
+      }
+    }
+  }
+  return j_le_term;
+}
+
+
+class PFunc {
+private:
+  jobject j_p_func;
+  JNIEnv* env;
+public:
+
+  PFunc(jobject j_p_func, JNIEnv* env):
+  j_p_func(j_p_func),
+  env(env){
+  }
+
+  bool has_empty_codomain() const {
+    jclass j_partial_function_class
+       = env->FindClass("ppl_java/Partial_Function");
+     jmethodID j_has_empty_codomain_id
+       = env->GetMethodID(j_partial_function_class,
+ 			 "has_empty_codomain",
+ 			 "()Z");
+     return env->CallBooleanMethod(j_p_func, j_has_empty_codomain_id);
+  }
+
+  dimension_type max_in_codomain() const {
+     jclass j_partial_function_class
+       = env->FindClass("ppl_java/Partial_Function");
+     jmethodID j_max_in_codomain_id
+       = env->GetMethodID(j_partial_function_class,
+ 			 "max_in_codomain",
+ 			 "()J");
+     jlong value = env->CallLongMethod(j_p_func, j_max_in_codomain_id);
+     return jtype_to_unsigned<dimension_type>(value);
+  }
+
+  bool maps(dimension_type i, dimension_type& j) const {
+    jclass j_partial_function_class
+       = env->FindClass("ppl_java/Partial_Function");
+    jclass j_by_reference_class
+      = env->FindClass("ppl_java/By_Reference");
+    jmethodID j_by_reference_ctr_id
+      = env->GetMethodID(j_by_reference_class,
+			 "<init>",
+			 "(Ljava/lang/Object;)V");
+    jobject coeff = j_long_to_j_long_class(env, 0);
+    jobject new_by_ref = env->NewObject(j_by_reference_class,
+  					j_by_reference_ctr_id,
+  					coeff);
+    jmethodID j_maps_id
+      = env->GetMethodID(j_partial_function_class,
+			 "maps",
+			 "(Ljava/lang/Long;Lppl_java/By_Reference;)Z");
+    if(env->CallBooleanMethod(j_p_func, j_maps_id,
+			      j_long_to_j_long_class(env, i),
+			      new_by_ref)) {
+      jobject long_value = get_by_reference(env, new_by_ref);
+      j = jtype_to_unsigned<dimension_type>(j_long_class_to_j_long(env,
+								   long_value));
+      return true;
+    }
+    return false;
+  }
+};
diff --git a/interfaces/Java/jni/ppl_java_globals.cc b/interfaces/Java/jni/ppl_java_globals.cc
new file mode 100644
index 0000000..870f7f3
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_globals.cc
@@ -0,0 +1,485 @@
+/* PPL Java interface fixed routines implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+   This file is part of the Parma Polyhedra Library (PPL).
+
+   The PPL 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 3 of the License, or (at your
+   option) any later version.
+
+   The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+   For the most up-to-date information see the Parma Polyhedra Library
+   site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_java_Parma_Polyhedra_Library.h"
+#include "ppl_java_common.hh"
+#include "ppl_java_MIP_Problem.h"
+#include "ppl_java_Linear_Expression.h"
+#include "ppl_java_Constraint.h"
+#include "ppl_java_Constraint_System.h"
+#include "ppl_java_Congruence.h"
+#include "ppl_java_Congruence_System.h"
+#include "ppl_java_Generator.h"
+#include "ppl_java_Generator_System.h"
+#include "ppl_java_Grid_Generator.h"
+#include "ppl_java_Grid_Generator_System.h"
+
+JNIEXPORT jint JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_version_1major
+(JNIEnv *, jclass) {
+  return version_major();
+}
+
+JNIEXPORT jint JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_version_1minor
+(JNIEnv *, jclass)  {
+  return version_minor();
+}
+
+
+JNIEXPORT jint JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_version_1revision
+(JNIEnv *, jclass) {
+  return version_revision();
+}
+
+JNIEXPORT jint JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_version_1beta
+(JNIEnv *, jclass) {
+  return version_beta();
+}
+
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_version
+(JNIEnv* env, jclass) {
+  return env->NewStringUTF(version());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_banner
+(JNIEnv* env, jclass) {
+  return env->NewStringUTF(banner());
+}
+
+
+JNIEXPORT void JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_set_1rounding_1for_1PPL
+(JNIEnv* env, jclass) {
+  try {
+    set_rounding_for_PPL();
+  }
+  CATCH_ALL;
+}
+
+
+JNIEXPORT void JNICALL Java_ppl_1java_Parma_1Polyhedra_1Library_restore_1pre_1PPL_1rounding
+(JNIEnv* env, jclass) {
+  try {
+    restore_pre_PPL_rounding();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL Java_ppl_1java_MIP_1Problem_max_1space_1dimension
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return mip->max_space_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL Java_ppl_1java_MIP_1Problem_space_1dimension
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return mip->space_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_integer_1space_1dimensions
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return build_java_variables_set(env, mip->integer_space_dimensions());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_objective_1function
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jclass j_le_coeff_class
+      = env->FindClass("ppl_java/Linear_Expression_Coefficient");
+    jclass j_le_class
+      = env->FindClass("ppl_java/Linear_Expression");
+    jmethodID j_le_sum_id
+      = env->GetMethodID(j_le_class,
+			 "sum",
+			 "(Lppl_java/Linear_Expression;)"
+			 "Lppl_java/Linear_Expression;");
+    jmethodID j_le_coeff_ctr_id
+      = env->GetMethodID(j_le_coeff_class, "<init>",
+			 "(Lppl_java/Coefficient;)V");
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    TEMP_INTEGER(inhomogeneous_term);
+    inhomogeneous_term = mip->objective_function().inhomogeneous_term();
+    jobject j_coeff_inhomogeneous_term
+      = build_java_coeff(env, inhomogeneous_term);
+    jobject j_le_coeff = env->NewObject(j_le_coeff_class, j_le_coeff_ctr_id,
+					j_coeff_inhomogeneous_term);
+
+    jobject j_le = get_linear_expression(env, mip->objective_function());
+    return env->CallObjectMethod(j_le, j_le_sum_id, j_le_coeff);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_optimization_1mode
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return build_java_optimization_mode(env, mip->optimization_mode());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_constraints
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jclass j_cs_class = env->FindClass("ppl_java/Constraint_System");
+    jmethodID j_cs_ctr_id = env->GetMethodID(j_cs_class, "<init>", "()V");
+    jmethodID j_cs_add_id = env->GetMethodID(j_cs_class, "add",
+					     "(Ljava/lang/Object;)Z");
+    jobject j_cs = env->NewObject(j_cs_class, j_cs_ctr_id);
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    for (MIP_Problem::const_iterator cs_it = mip->constraints_begin(),
+	   cs_end = mip->constraints_end(); cs_it != cs_end; ++cs_it) {
+      jobject j_constraint = build_java_constraint(env, *cs_it);
+      env->CallBooleanMethod(j_cs, j_cs_add_id, j_constraint);
+    }
+    return j_cs;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_clear
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    mip->clear();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_add_1space_1dimensions_1and_1embed
+(JNIEnv* env , jobject j_this_mip_problem, jlong j_dim) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    mip->add_space_dimensions_and_embed(ppl_dim);
+  }
+  CATCH_ALL;
+}
+
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_add_1to_1integer_1space_1dimensions
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_vset) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Variables_Set v_set = build_ppl_variables_set(env, j_vset);
+    mip->add_to_integer_space_dimensions(v_set);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_add_1constraint
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_c) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Constraint c = build_ppl_constraint(env, j_c);
+    mip->add_constraint(c);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_add_1constraints
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_cs) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Constraint_System cs = build_ppl_constraint_system(env, j_cs);
+    mip->add_constraints(cs);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_set_1objective_1function
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_le) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Linear_Expression le = build_linear_expression(env, j_le);
+    mip->set_objective_function(le);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_set_1optimization_1mode
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_opt_mode) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Optimization_Mode opt_mode = build_ppl_optimization_mode(env, j_opt_mode);
+    mip->set_optimization_mode(opt_mode);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL Java_ppl_1java_MIP_1Problem_is_1satisfiable
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return mip->is_satisfiable();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_solve
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return build_java_mip_status(env, mip->solve());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_evaluate_1objective_1function
+(JNIEnv* env, jobject j_this_mip_problem, jobject j_gen, jobject j_coeff_num,
+ jobject j_coeff_den) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Generator g = build_ppl_generator(env, j_gen);
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    num = build_ppl_coeff(env, j_coeff_num);
+    den = build_ppl_coeff(env, j_coeff_den);
+    mip->evaluate_objective_function(g, num, den);
+    set_coefficient(env, j_coeff_num, build_java_coeff(env, num));
+    set_coefficient(env, j_coeff_den, build_java_coeff(env, den));
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_feasible_1point
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Generator g = mip->feasible_point();
+    return build_java_generator(env, g);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL Java_ppl_1java_MIP_1Problem_optimizing_1point
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    Generator g = mip->optimizing_point();
+    return build_java_generator(env, g);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_optimal_1value
+(JNIEnv* env, jobject j_this_mip_problem, jobject j_coeff_num,
+ jobject j_coeff_den) {
+  try {
+    TEMP_INTEGER(coeff_num);
+    TEMP_INTEGER(coeff_den);
+    coeff_num = build_ppl_coeff(env, j_coeff_num);
+    coeff_den = build_ppl_coeff(env, j_coeff_den);
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    mip->optimal_value(coeff_num, coeff_den);
+    jobject j_coeff_num_result = build_java_coeff(env, coeff_num);
+    jobject j_coeff_den_result = build_java_coeff(env, coeff_den);
+    set_coefficient(env, j_coeff_num, j_coeff_num_result);
+    set_coefficient(env, j_coeff_den, j_coeff_den_result);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL Java_ppl_1java_MIP_1Problem_OK
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return mip->OK();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_build_1cpp_1object__J
+(JNIEnv* env, jobject j_this_mip_problem, jlong j_dim) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    MIP_Problem* mip_ptr = new MIP_Problem(ppl_dim);
+    set_ptr(env, j_this_mip_problem,  mip_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL Java_ppl_1java_MIP_1Problem_build_1cpp_1object__JLppl_1java_Constraint_1System_2Lppl_1java_Linear_1Expression_2Lppl_1java_Optimization_1Mode_2
+(JNIEnv* env , jobject j_this_mip_problem, jlong j_dim, jobject j_cs,
+ jobject j_le, jobject j_opt_mode) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    Constraint_System cs = build_ppl_constraint_system(env, j_cs);
+    Linear_Expression le = build_linear_expression(env, j_le);
+    Optimization_Mode opt_mode =  build_ppl_optimization_mode(env, j_opt_mode);
+    MIP_Problem* mip_ptr = new MIP_Problem(ppl_dim, cs, le, opt_mode);
+    set_ptr(env, j_this_mip_problem, mip_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_MIP_1Problem_toString
+(JNIEnv* env, jobject j_this_mip_problem) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  jlong ptr = get_ptr(env, j_this_mip_problem);
+  MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+  s << mip;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Linear_1Expression_toString
+(JNIEnv* env, jobject le) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Linear_Expression ppl_le = build_linear_expression(env, le);
+  s << ppl_le;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Generator_toString
+(JNIEnv* env, jobject g) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Generator ppl_g = build_ppl_generator(env, g);
+  s << ppl_g;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Constraint_toString
+(JNIEnv* env, jobject c) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Constraint ppl_c = build_ppl_constraint(env, c);
+  s << ppl_c;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL  Java_ppl_1java_Grid_1Generator_toString
+(JNIEnv* env, jobject g) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Grid_Generator ppl_g = build_ppl_grid_generator(env, g);
+  s << ppl_g;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Congruence_toString
+(JNIEnv* env, jobject g) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Congruence ppl_g = build_ppl_congruence(env, g);
+  s << ppl_g;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Grid_1Generator_1System_toString
+(JNIEnv* env, jobject ggs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Grid_Generator_System ppl_ggs = build_ppl_grid_generator_system(env, ggs);
+  s << ppl_ggs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Generator_1System_toString
+(JNIEnv* env, jobject gs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Generator_System ppl_gs = build_ppl_generator_system(env, gs);
+  s << ppl_gs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Constraint_1System_toString
+(JNIEnv* env, jobject cs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Constraint_System ppl_cs = build_ppl_constraint_system(env, cs);
+  s << ppl_cs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL Java_ppl_1java_Congruence_1System_toString
+(JNIEnv* env, jobject cgs) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Congruence_System ppl_cgs = build_ppl_congruence_system(env, cgs);
+  s << ppl_cgs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jlong JNICALL Java_ppl_1java_MIP_1Problem_total_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    jlong ptr = get_ptr(env, j_this_mip_problem);
+    MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(ptr);
+    return mip->total_memory_in_bytes();
+  }
+  CATCH_ALL;
+  return 0;
+}
diff --git a/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
new file mode 100644
index 0000000..bd2e3e4
--- /dev/null
+++ b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
@@ -0,0 +1,52 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of methods
+dnl for the Java interface; this includes:
+dnl - the list in the imported file and any Java specific methods.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl m4_procedure_list
+dnl This class extends the m4_common_procedure_list
+dnl and all procedures common to the all the interfaces should go there.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_procedure_list', `m4_echo_unquoted(`m4_common_procedure_list',
+ppl_free_ at CLASS@/1 +all,
+ppl_ at CLASS@_hashcode/2 +all -box,
+ppl_ at CLASS@_string/1 +all)dnl
+')
+
+dnl TODO
+dnl Some methods are not yet implemented for the Java interface:
+dnl ppl_ at CLASS@_approximate_partition/5 +pointset_powerset \shape,
+dnl ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2
+dnl ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3
+dnl ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3
diff --git a/interfaces/Java/ppl_java/By_Reference.java b/interfaces/Java/ppl_java/By_Reference.java
new file mode 100644
index 0000000..a2a3733
--- /dev/null
+++ b/interfaces/Java/ppl_java/By_Reference.java
@@ -0,0 +1,53 @@
+/* By_Reference Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! Allows to pass nonmutable and mutable objects by reference to functions.
+/*! \ingroup PPL_Java_interface
+ */
+public class By_Reference<T> {
+    // Stores the object.
+    T obj;
+
+    // Builds an object encapsulating \p object_value.
+    public By_Reference(T object_value) {
+	obj = object_value;
+    }
+
+    // Set an object to value \p object_value.
+    public void set(T y) {
+	obj = y;
+    }
+
+    // Returns the value held by \p this.
+    public T get() {
+	return obj;
+    }
+    
+    // FIXME: this must be moved in another place.
+    static boolean is_null(java.lang.Object obj) {
+        if (obj == null)
+              return true;
+        return false;
+    }
+}
diff --git a/interfaces/Java/ppl_java/Coefficient.java b/interfaces/Java/ppl_java/Coefficient.java
new file mode 100644
index 0000000..18f79b5
--- /dev/null
+++ b/interfaces/Java/ppl_java/Coefficient.java
@@ -0,0 +1,75 @@
+/* Coefficient Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+import java.math.BigInteger;
+
+//! A PPL coefficient.
+/*! \ingroup PPL_Java_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators,
+  intervals, bounding boxes and so on.
+*/
+public class Coefficient {
+
+    //! Holds the value of \p this.
+    private BigInteger value;
+
+    //! Builds a coefficient values \p i.
+    public Coefficient(int i) {
+	value = new BigInteger(Integer.toString(i));
+    }
+
+    //! Builds a coefficient valued \p l.
+    public Coefficient(long l) {
+	value = new BigInteger(Long.toString(l));
+    }
+
+    //! Builds a coefficient valued \p bi.
+    public Coefficient(BigInteger bi) {
+	value = bi;
+    }
+
+    //! Builds a coefficient from the decimal representation in \p s.
+    /*!
+      \exception java.lang.NumberFormatException
+      Thrown if \p s does not contain a valid decimal representation.
+    */
+    public Coefficient(String s) {
+	value = new BigInteger(s);
+    }
+
+    //! Builds a copy of \p c.
+    public Coefficient(Coefficient c) {
+	value = new BigInteger(c.value.toString());
+    }
+
+    //! Returns the value held by \p this.
+    public BigInteger getBigInteger() {
+	return value;
+    }
+
+    private void set(Coefficient c) {
+        value = c.getBigInteger();
+    }
+}
diff --git a/interfaces/Java/ppl_java/Congruence.java b/interfaces/Java/ppl_java/Congruence.java
new file mode 100644
index 0000000..57811fc
--- /dev/null
+++ b/interfaces/Java/ppl_java/Congruence.java
@@ -0,0 +1,62 @@
+/* Congruence Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A linear congruence.
+/*! \ingroup PPL_Java_interface
+  An object of the class Congruence is an object represeting a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+*/
+public class Congruence {
+
+    //! The modulus of the congruence.
+    protected Coefficient modulus;
+
+    //! The value of the left hand side of \p this.
+    Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    Linear_Expression rhs;
+
+    /*! \brief
+      Returns the congruence
+      \f$\mathtt{e1} = \mathtt{e2} \pmod{\mathtt{m}}\f$.
+    */
+    public Congruence(Linear_Expression e1, Linear_Expression e2,
+		      Coefficient m) {
+	modulus = new Coefficient(m);
+	lhs = e1.clone();
+	rhs = e2.clone();
+    }
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Congruence_System.java b/interfaces/Java/ppl_java/Congruence_System.java
new file mode 100644
index 0000000..38dadd6
--- /dev/null
+++ b/interfaces/Java/ppl_java/Congruence_System.java
@@ -0,0 +1,36 @@
+/* Congruence_System Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A system of congruences.
+/*! \ingroup PPL_Java_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+*/
+public class Congruence_System extends java.util.Vector<Congruence> {
+    public Congruence_System() {
+    }
+    
+    //! Returns a string representation of \p this
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Constraint.java b/interfaces/Java/ppl_java/Constraint.java
new file mode 100644
index 0000000..38c1f89
--- /dev/null
+++ b/interfaces/Java/ppl_java/Constraint.java
@@ -0,0 +1,71 @@
+/* Constraint Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_Java_interface
+  An object of the class Constraint is either:
+  - an equality
+  - a non-strict inequality
+  - a strict inequality
+*/
+public class Constraint {
+
+    //! The value of the left hand side of \p this.
+    private Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    private Linear_Expression rhs;
+
+    //! The relation symbol of \p this.
+    private Relation_Symbol kind;
+
+    /*! \brief
+      Builds a constraint from two linear expressions with a specified
+      relation symbol.
+    */
+    public Constraint(Linear_Expression le1, Relation_Symbol rel_sym,
+            Linear_Expression le2) {
+	lhs = le1.clone();
+	rhs = le2.clone();
+	kind = rel_sym;
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+	return lhs;
+    }
+
+    //! Returns the right hand side of \p this.
+    public Linear_Expression right_hand_side() {
+	return rhs;
+    }
+
+    //! Returns the relation symbol of \p this.
+    public Relation_Symbol kind() {
+	return kind;
+    }
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Constraint_System.java b/interfaces/Java/ppl_java/Constraint_System.java
new file mode 100644
index 0000000..545f6d8
--- /dev/null
+++ b/interfaces/Java/ppl_java/Constraint_System.java
@@ -0,0 +1,38 @@
+/* Constraint_System Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A system of constraints.
+/*! \ingroup PPL_Java_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+*/
+public class Constraint_System extends java.util.Vector<Constraint> {
+
+    //! Default constructor: builds an empty system of constraints.
+    public Constraint_System() {
+    }
+
+   //! Returns a string representation of \p this
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Degenerate_Element.java b/interfaces/Java/ppl_java/Degenerate_Element.java
new file mode 100644
index 0000000..5765eff
--- /dev/null
+++ b/interfaces/Java/ppl_java/Degenerate_Element.java
@@ -0,0 +1,32 @@
+/* Degenerate_Element enum declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_Java_interface */
+public enum Degenerate_Element {
+    //! The universe element, i.e., the whole vector space.
+    UNIVERSE,
+    //! The empty element, i.e., the empty set.
+    EMPTY;
+}
diff --git a/interfaces/Java/ppl_java/Domain_Error_Exception.java b/interfaces/Java/ppl_java/Domain_Error_Exception.java
new file mode 100644
index 0000000..704abd1
--- /dev/null
+++ b/interfaces/Java/ppl_java/Domain_Error_Exception.java
@@ -0,0 +1,30 @@
+/* Domain_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+public class Domain_Error_Exception extends RuntimeException {
+
+    public Domain_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/ppl_java/Generator.java b/interfaces/Java/ppl_java/Generator.java
new file mode 100644
index 0000000..d8f2fa0
--- /dev/null
+++ b/interfaces/Java/ppl_java/Generator.java
@@ -0,0 +1,137 @@
+/* Generator Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+import java.util.*;
+import javax.management.RuntimeErrorException;
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_Java_interface
+  An object of the class Generator is one of the following:
+
+  - a line
+
+  - a ray
+
+  - a point
+
+  - a closure point
+*/
+public class Generator {
+    //! The denominator used if the generator is a point or a clousure point.
+    private Coefficient den;
+
+    //! The generator type.
+    private Generator_Type gt;
+
+    //! The linear expression.
+    private Linear_Expression le;
+
+    /*! \brief
+      Builds a generator of type \p g_type, stealing the coefficients from
+      \p e.
+    */
+    private Generator(Linear_Expression e, Generator_Type g_type) {
+	le = e.clone();
+        gt = g_type;
+    }
+
+    //! Returns the closure point at \p e / \p d.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Generator closure_point(Linear_Expression e,
+					   Coefficient c) {
+        if (c.getBigInteger().equals(java.math.BigInteger.ZERO)) {
+            Error cause = new Error("ppl_java.Generatpr::Generator(le, c): \n"
+				    + "the divisor can not be a zero.");
+            throw new RuntimeErrorException(cause);
+        }
+
+        Generator g = new Generator(e, Generator_Type.CLOSURE_POINT);
+        g.den = c;
+        return g;
+    }
+
+    //! Returns the line of direction \p e.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if the homogeneous part of \p e represents the origin of
+      the vector space.
+    */
+    public static Generator line(Linear_Expression le) {
+        return new Generator(le, Generator_Type.LINE);
+    }
+
+    //! Returns the point at \p e / \p d.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Generator point(Linear_Expression le, Coefficient d) {
+        if (d.getBigInteger().equals(java.math.BigInteger.ZERO)) {
+	    Error cause = new Error("ppl_java.Generatpr::Generator(le, d): \n"
+				    + "the divisor can not be a zero.");
+            throw new RuntimeErrorException(cause);
+        }
+
+        Generator g = new Generator(le, Generator_Type.POINT);
+        g.den = d;
+        return g;
+    }
+
+    //! Returns the ray of direction \p e.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if the homogeneous part of \p e represents the origin of
+      the vector space.
+    */
+    public static Generator ray(Linear_Expression le) {
+        return new Generator(le, Generator_Type.RAY);
+    }
+
+    //! If \p this is either a point or a closure point, returns its divisor.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p this is neither a point nor a closure point.
+    */
+    public Coefficient divisor() {
+        if (this.gt == Generator_Type.POINT
+	    || this.gt == Generator_Type.CLOSURE_POINT)
+	    return den;
+	Error cause = new Error("ppl_java.Generator::divisor: \n"
+				+ "this is neither a point nor a"
+				+ " closure point");
+	throw new RuntimeErrorException(cause);
+    }
+
+    //! Allows to copy the fields from \p g to \p this. For internal use.
+    private void set(Generator g) {
+     this.le = g.le;
+     this.gt = g.gt;
+    }
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Generator_System.java b/interfaces/Java/ppl_java/Generator_System.java
new file mode 100644
index 0000000..82e0ca1
--- /dev/null
+++ b/interfaces/Java/ppl_java/Generator_System.java
@@ -0,0 +1,39 @@
+/* Generator_System Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A system of generators.
+/*! \ingroup PPL_Java_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+*/
+public class Generator_System extends java.util.Vector<Generator> {
+
+    //! Default constructor: builds an empty system of generators.
+    public Generator_System() {
+    }
+
+    //! Returns a representation of \p this
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Generator_Type.java b/interfaces/Java/ppl_java/Generator_Type.java
new file mode 100644
index 0000000..9b651d4
--- /dev/null
+++ b/interfaces/Java/ppl_java/Generator_Type.java
@@ -0,0 +1,37 @@
+/* Generator_Type enum declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+/*! \ingroup PPL_Java_interface
+//! The generator type.
+*/
+public enum Generator_Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a ray. */
+    RAY,
+    /*! The generator is a point. */
+    POINT,
+    /*! The generator is a closure point. */
+    CLOSURE_POINT;
+}
diff --git a/interfaces/Java/ppl_java/Grid_Generator.java b/interfaces/Java/ppl_java/Grid_Generator.java
new file mode 100644
index 0000000..142fdd6
--- /dev/null
+++ b/interfaces/Java/ppl_java/Grid_Generator.java
@@ -0,0 +1,98 @@
+/* Grid Generator Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+package ppl_java;
+
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_Java_interface
+  An object of the class Grid_Generator is one of the following:
+
+  - a grid_line
+
+  - a parameter
+
+  - a grid_point
+  */
+
+public class Grid_Generator {
+
+    //! The linear expression.
+    private Linear_Expression le;
+
+    /*! \brief
+      The coefficient used if the grid generator is a
+      parameter or a grid point a parameter.
+    */
+    private Coefficient coeff;
+
+    //! The grid generator type.
+    private Grid_Generator_Type gt;
+    private Grid_Generator(Linear_Expression e, Coefficient c,
+			   Grid_Generator_Type generator_type) {
+	le = e.clone();
+	coeff = new Coefficient(c);
+	gt = generator_type;
+    }
+
+    //! Returns the line of direction \p e.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if the homogeneous part of \p e represents the origin of
+      the vector space.
+    */
+    public static Grid_Generator grid_line(Linear_Expression e) {
+	return new Grid_Generator(e, new Coefficient(0),
+				  Grid_Generator_Type.LINE);
+    }
+
+    //! Returns the parameter of direction \p e and size \p e/d.
+    /*!
+      Both \p e and \p d are optional arguments, with default values
+      Linear_Expression::zero() and Coefficient_one(), respectively.
+
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Grid_Generator parameter(Linear_Expression e,
+					   Coefficient c) {
+	return new Grid_Generator(e, c, Grid_Generator_Type.PARAMETER);
+    }
+
+    //! Returns the point at \p e / \p d.
+    /*!
+      Both \p e and \p d are optional arguments, with default values
+      Linear_Expression::zero() and Coefficient_one(), respectively.
+
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Grid_Generator grid_point(Linear_Expression e,
+					    Coefficient c) {
+	return new Grid_Generator(e, c, Grid_Generator_Type.POINT);
+    }
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+}
+
diff --git a/interfaces/Java/ppl_java/Grid_Generator_System.java b/interfaces/Java/ppl_java/Grid_Generator_System.java
new file mode 100644
index 0000000..21643ef
--- /dev/null
+++ b/interfaces/Java/ppl_java/Grid_Generator_System.java
@@ -0,0 +1,38 @@
+/* Grid Generator_System Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+package ppl_java;
+
+//! A system of grid generators.
+/*! \ingroup PPL_Java_interface
+    An object of the class Grid_Generator_System is a system of grid
+    generators, i.e., a multiset of objects of the class Grid_Generator.
+*/
+
+public class Grid_Generator_System extends java.util.Vector<Grid_Generator> {
+    public Grid_Generator_System() {
+    }
+
+  //! Returns a representation of \p this
+  public native String toString();
+}
\ No newline at end of file
diff --git a/interfaces/Java/ppl_java/Grid_Generator_Type.java b/interfaces/Java/ppl_java/Grid_Generator_Type.java
new file mode 100644
index 0000000..bed2800
--- /dev/null
+++ b/interfaces/Java/ppl_java/Grid_Generator_Type.java
@@ -0,0 +1,35 @@
+/* Grid_Generator_Type enum declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+/*! \ingroup PPL_Java_interface
+//! The grid generator type.
+*/
+public enum Grid_Generator_Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a parameter. */
+    PARAMETER,
+    /*! The generator is a point. */
+    POINT;
+}
diff --git a/interfaces/Java/ppl_java/Invalid_Argument_Exception.java b/interfaces/Java/ppl_java/Invalid_Argument_Exception.java
new file mode 100644
index 0000000..6eebedf
--- /dev/null
+++ b/interfaces/Java/ppl_java/Invalid_Argument_Exception.java
@@ -0,0 +1,30 @@
+/* Invalid_Argument_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+package ppl_java;
+
+public class Invalid_Argument_Exception extends RuntimeException {
+    public Invalid_Argument_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/ppl_java/Length_Error_Exception.java b/interfaces/Java/ppl_java/Length_Error_Exception.java
new file mode 100644
index 0000000..6c61dbd
--- /dev/null
+++ b/interfaces/Java/ppl_java/Length_Error_Exception.java
@@ -0,0 +1,30 @@
+/* Length_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+public class Length_Error_Exception extends RuntimeException {
+
+    public Length_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/ppl_java/Linear_Expression.java b/interfaces/Java/ppl_java/Linear_Expression.java
new file mode 100644
index 0000000..ee63b85
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression.java
@@ -0,0 +1,57 @@
+/* Linear_Expression Java declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+//! A linear expression.
+/*! \ingroup PPL_Java_interface
+  An object of the class Linear_Expression represents a linear expression
+  that can be built from a Linear_Expression_Variable,
+  Linear_Expression_Coefficient, Linear_Expression_Sum,
+  Linear_Expression_Difference, Linear_Expression_Unary_Minus.
+*/
+
+public abstract class Linear_Expression implements Cloneable {
+
+    //! Returns the sum of \p this and \p y.
+    public Linear_Expression sum(Linear_Expression y) {
+	return new Linear_Expression_Sum(this, y);
+    }
+
+    //! Returns the difference of \p this and \p y.
+    public Linear_Expression subtract(Linear_Expression y) {
+	return new Linear_Expression_Difference(this, y);
+    }
+    //! Returns the product of \p this times \p c.
+    public Linear_Expression times(Coefficient c) {
+	return new Linear_Expression_Times(this, c);
+    }
+
+    //! Returns the negation of \p this.
+    public Linear_Expression unary_minus() {
+	return new Linear_Expression_Unary_Minus(this);
+    }
+    //! Returns a copy of the linear expression.
+    public abstract Linear_Expression clone();
+    
+    //! Return the string the represents \p this.
+    public native String toString();
+}
diff --git a/interfaces/Java/ppl_java/Linear_Expression_Coefficient.java b/interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
new file mode 100644
index 0000000..1804d60
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression_Coefficient.java
@@ -0,0 +1,49 @@
+/* Linear_Expression_Coefficient class definition and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A linear expression built from a coefficient.
+/*! \ingroup PPL_Java_interface
+ */
+public class Linear_Expression_Coefficient
+    extends Linear_Expression {
+
+    //! The coefficient representing the linear expression.
+    protected Coefficient coeff;
+
+    //! Builds the object corresponding to a copy of the coefficient \p c.
+    public Linear_Expression_Coefficient(Coefficient c) {
+	coeff = new Coefficient(c);
+    }
+
+    //! Returns coefficient representing the linear expression.
+    public Coefficient argument() {
+	return coeff;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Coefficient clone() {
+	return new Linear_Expression_Coefficient(new Coefficient(coeff));
+    }
+}
+
diff --git a/interfaces/Java/ppl_java/Linear_Expression_Difference.java b/interfaces/Java/ppl_java/Linear_Expression_Difference.java
new file mode 100644
index 0000000..4150718
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression_Difference.java
@@ -0,0 +1,61 @@
+/* Linear_Expression_Difference class definition and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! The difference of two linear expressions.
+/*! \ingroup PPL_Java_interface
+ */
+public class Linear_Expression_Difference
+    extends Linear_Expression {
+
+    //! The value of the left hand side of \p this.
+    protected Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    protected Linear_Expression rhs;
+
+    /*! \brief
+      Builds an object that represents the difference of the copy \p x and
+      \p y.
+    */
+    public Linear_Expression_Difference(Linear_Expression x,
+					Linear_Expression y) {
+        lhs = x.clone();
+        rhs = y.clone();
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+	return lhs;
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression right_hand_side() {
+	return rhs;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Difference clone() {
+	return new Linear_Expression_Difference(lhs.clone(), rhs.clone());
+    }
+}
diff --git a/interfaces/Java/ppl_java/Linear_Expression_Sum.java b/interfaces/Java/ppl_java/Linear_Expression_Sum.java
new file mode 100644
index 0000000..42bc69c
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression_Sum.java
@@ -0,0 +1,58 @@
+/* Linear_Expression_Sum class definition and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! The sum of two linear expressions.
+/*! \ingroup PPL_Java_interface
+ */
+public class Linear_Expression_Sum
+    extends Linear_Expression
+{
+
+    //! The value of the left hand side of \p this.
+    protected Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    protected Linear_Expression rhs;
+
+    //! Builds an object that represents the sum of the copy of \p x and \p y.
+    public Linear_Expression_Sum(Linear_Expression x, Linear_Expression y) {
+        lhs = x.clone();
+        rhs = y.clone();
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+	return lhs;
+    }
+
+    //! Returns the right hand side of \p this.
+    public Linear_Expression right_hand_side() {
+	return rhs;
+    }
+
+     //! Builds a copy of this.
+    public Linear_Expression_Sum clone() {
+	return new Linear_Expression_Sum(lhs.clone(), rhs.clone());
+    }
+}
diff --git a/interfaces/Java/ppl_java/Linear_Expression_Times.java b/interfaces/Java/ppl_java/Linear_Expression_Times.java
new file mode 100644
index 0000000..427c765
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression_Times.java
@@ -0,0 +1,59 @@
+/* Linear_Expression_Times class definition and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! The product of a linear expression and a coefficient.
+/*! \ingroup PPL_Java_interface
+ */
+public class Linear_Expression_Times
+    extends Linear_Expression {
+
+    //! The value of the left hand side of \p this.
+    protected Linear_Expression_Coefficient lhs;
+
+    //! The value of the left hand side of \p this.
+    protected Linear_Expression rhs;
+
+    //! Builds an object cloning the input arguments.
+    public Linear_Expression_Times(Linear_Expression l, Coefficient c) {
+	lhs = new Linear_Expression_Coefficient(new Coefficient(c));
+	rhs = l.clone();
+    }
+
+    //! Returns the left hand side of \p this.
+   public Linear_Expression left_hand_side() {
+	return lhs;
+    }
+
+    //! Returns the right hand side of \p this.
+    public Linear_Expression right_hand_side() {
+	return rhs;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Times clone() {
+
+	return new Linear_Expression_Times(rhs.clone(),
+					   new Coefficient(lhs.argument()));
+    }
+}
diff --git a/interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java b/interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
new file mode 100644
index 0000000..9db5045
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression_Unary_Minus.java
@@ -0,0 +1,49 @@
+/* Linear_Expression_Unary_Minus class definition and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! The negation of a linear expression.
+/*! \ingroup PPL_Java_interface
+ */
+public class Linear_Expression_Unary_Minus
+    extends Linear_Expression {
+
+    //! The value that \p this negates.
+    protected Linear_Expression arg;
+
+    //! Builds an object that represents the negation of the copy \p x.
+    public Linear_Expression_Unary_Minus(Linear_Expression x) {
+	arg = x.clone();
+    }
+
+    //! Returns the value that \p this negates.
+    public Linear_Expression argument() {
+	return arg;
+    }
+    
+    public Linear_Expression_Unary_Minus clone() {
+     return new Linear_Expression_Unary_Minus(arg.clone());   
+    }
+    
+}
+
diff --git a/interfaces/Java/ppl_java/Linear_Expression_Variable.java b/interfaces/Java/ppl_java/Linear_Expression_Variable.java
new file mode 100644
index 0000000..8518952
--- /dev/null
+++ b/interfaces/Java/ppl_java/Linear_Expression_Variable.java
@@ -0,0 +1,48 @@
+/* Linear_Expression_Variable class definition and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A linear expression built from a variable.
+/*! \ingroup PPL_Java_interface
+ */
+public class Linear_Expression_Variable
+extends Linear_Expression {
+
+    protected Variable arg;
+
+    //! Builds the object associated to the copy of \p v.
+    public Linear_Expression_Variable(Variable v) {
+	arg = new Variable(v.id());
+    }
+
+    //! Returns the variable representing the linear expression.
+    public Variable argument() {
+        return arg;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Variable clone() {
+	return new Linear_Expression_Variable(new Variable(arg.id()));
+    }
+}
+
diff --git a/interfaces/Java/ppl_java/Logic_Error_Exception.java b/interfaces/Java/ppl_java/Logic_Error_Exception.java
new file mode 100644
index 0000000..44ecb47
--- /dev/null
+++ b/interfaces/Java/ppl_java/Logic_Error_Exception.java
@@ -0,0 +1,31 @@
+/* Logic_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+
+public class Logic_Error_Exception extends RuntimeException {
+
+    public Logic_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/ppl_java/MIP_Problem.java b/interfaces/Java/ppl_java/MIP_Problem.java
new file mode 100644
index 0000000..eda8e20
--- /dev/null
+++ b/interfaces/Java/ppl_java/MIP_Problem.java
@@ -0,0 +1,267 @@
+/* MIP_Problem Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+package ppl_java;
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_Java_interface
+  An object of this class encodes a mixed integer (linear) programming problem.
+  The MIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the feasible region, by means of a finite set of linear equality
+     and non-strict inequality constraints;
+   - the subset of the unknown variables that range over the integers
+     (the other variables implicitly ranging over the reals);
+   - the objective function, described by a Linear_Expression;
+   - the optimization mode (either maximization or minimization).
+
+  The class provides support for the (incremental) solution of the
+  MIP problem based on variations of the revised simplex method and
+  on branch-and-bound techniques. The result of the resolution
+  process is expressed in terms of an enumeration, encoding the
+  feasibility and the unboundedness of the optimization problem.
+  The class supports simple feasibility tests (i.e., no optimization),
+  as well as the extraction of an optimal (resp., feasible) point,
+  provided the MIP_Problem is optimizable (resp., feasible).
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given MIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of constraints,
+  the change of objective function and the change of optimization mode.
+*/
+public class MIP_Problem extends PPL_Object {
+
+    //! Builds a trivial MIP problem.
+    /*!
+      A trivial MIP problem requires to maximize the objective function
+      \f$0\f$ on a vector space under no constraints at all:
+      the origin of the vector space is an optimal solution.
+
+      \param dim
+      The dimension of the vector space enclosing \p this.
+
+      \exception std::length_error
+      Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+    */
+    public  MIP_Problem(long dim) {
+	build_cpp_object(dim);
+    }
+
+    /*! \brief
+      Builds an MIP problem having space dimension \p dim from the constraint
+      system \p cs, the objective function \p obj and optimization mode
+      \p mode.
+
+      \param dim
+      The dimension of the vector space enclosing \p this.
+
+      \param cs
+      The constraint system defining the feasible region.
+
+      \param obj
+      The objective function.
+
+      \param mode
+      The optimization mode.
+
+      \exception std::length_error
+      Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+      \exception std::invalid_argument
+      Thrown if the constraint system contains any strict inequality
+      or if the space dimension of the constraint system (resp., the
+      objective function) is strictly greater than \p dim.
+    */
+    public  MIP_Problem(long dim, Constraint_System cs, Linear_Expression obj,
+			Optimization_Mode mode) {
+	build_cpp_object(dim, cs, obj, mode);
+    }
+
+
+    //! Returns the maximum space dimension an MIP_Problem can handle.
+    public native long max_space_dimension();
+
+    //! Returns the space dimension of the MIP problem.
+    public native long space_dimension();
+
+    /*! \brief
+      Returns a set containing all the variables' indexes constrained
+      to be integral.
+    */
+    public native Variables_Set integer_space_dimensions();
+
+    //! Returns the objective function.
+    public native Linear_Expression objective_function();
+
+    //! Returns the optimization mode.
+    public native Optimization_Mode optimization_mode();
+
+    //! Returns the constraints .
+    public native Constraint_System constraints();
+
+    //! Resets \p this to be equal to the trivial MIP problem.
+    /*!
+      The space dimension is reset to \f$0\f$.
+    */
+    public native void clear();
+
+    /*! \brief
+      Adds \p m new space dimensions and embeds the old MIP problem
+      in the new vector space.
+
+      \param m
+      The number of dimensions to add.
+
+      \exception std::length_error
+      Thrown if adding \p m new space dimensions would cause the
+      vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+      The new space dimensions will be those having the highest indexes
+      in the new MIP problem; they are initially unconstrained.
+    */
+    public native void add_space_dimensions_and_embed(long m);
+
+    /*! \brief
+      Sets the variables whose indexes are in set \p i_vars to be
+      integer space dimensions.
+
+      \exception std::invalid_argument
+      Thrown if some index in \p i_vars does not correspond to
+      a space dimension in \p this.
+    */
+    public native void add_to_integer_space_dimensions(Variables_Set i_vars);
+
+    /*! \brief
+      Adds a copy of constraint \p c to the MIP problem.
+
+      \exception std::invalid_argument
+      Thrown if the constraint \p c is a strict inequality or if its space
+      dimension is strictly greater than the space dimension of \p this.
+    */
+    public native void add_constraint(Constraint c);
+
+    /*! \brief
+      Adds a copy of the constraints in \p cs to the MIP problem.
+
+      \exception std::invalid_argument
+      Thrown if the constraint system \p cs contains any strict inequality
+      or if its space dimension is strictly greater than the space dimension
+      of \p *this.
+    */
+    public native void add_constraints(Constraint_System cs);
+
+    //! Sets the objective function to \p obj.
+    /*!
+      \exception std::invalid_argument
+      Thrown if the space dimension of \p obj is strictly greater than
+      the space dimension of \p this.
+    */
+    public native void set_objective_function(Linear_Expression obj);
+
+    //! Sets the optimization mode to \p mode.
+    public native void set_optimization_mode(Optimization_Mode mode);
+
+    //! Checks satisfiability of \p *this.
+    /*!
+      \return
+      <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+    */
+    public native boolean is_satisfiable();
+
+    //! Optimizes the MIP problem.
+    /*!
+      \return
+      An MIP_Problem_Status flag indicating the outcome of the optimization
+      attempt (unfeasible, unbounded or optimized problem).
+    */
+    public native MIP_Problem_Status solve();
+
+
+    /*! \brief
+      Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+      of evaluating the objective function on \p evaluating_point.
+
+      \param evaluating_point
+      The point on which the objective function will be evaluated.
+
+      \param num
+      On exit will contain the numerator of the evaluated value.
+
+      \param den
+      On exit will contain the denominator of the evaluated value.
+
+      \exception std::invalid_argument
+      Thrown if \p this and \p evaluating_point are dimension-incompatible
+      or if the generator \p evaluating_point is not a point.
+    */
+    public native void evaluate_objective_function(Generator evaluating_point,
+						   Coefficient num,
+						   Coefficient den);
+
+    //! Returns a feasible point for \p *this, if it exists.
+    /*!
+      \exception std::domain_error
+      Thrown if the MIP problem is not satisfiable.
+    */
+    public native Generator feasible_point();
+
+    //! Returns an optimal point for \p this, if it exists.
+    /*!
+      \exception std::domain_error
+      Thrown if \p this doesn't not have an optimizing point, i.e.,
+      if the MIP problem is unbounded or not satisfiable.
+    */
+    public native Generator optimizing_point();
+
+    /*! \brief
+      Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+      the solution of the optimization problem.
+
+      \exception std::domain_error
+      Thrown if \p *this doesn't not have an optimizing point, i.e.,
+      if the MIP problem is unbounded or not satisfiable.
+    */
+    public native void optimal_value(Coefficient num, Coefficient den);
+
+   /*! \brief
+     Returns the total size in bytes of the memory occupied by the
+     underlying C++ object.
+   */
+    public native long total_memory_in_bytes();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    //! Checks if all the invariants are satisfied.
+    public native boolean OK();
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(long dim);
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(long dim,
+					 Constraint_System cs,
+					 Linear_Expression obj,
+					 Optimization_Mode mode);
+}
diff --git a/interfaces/Java/ppl_java/MIP_Problem_Status.java b/interfaces/Java/ppl_java/MIP_Problem_Status.java
new file mode 100644
index 0000000..b3d507d
--- /dev/null
+++ b/interfaces/Java/ppl_java/MIP_Problem_Status.java
@@ -0,0 +1,34 @@
+/* MIP_Problem_Status enum declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_Java_interface */
+public enum MIP_Problem_Status {
+    //! The problem is unfeasible.
+    UNFEASIBLE_MIP_PROBLEM,
+    //! The problem is unbounded.
+    UNBOUNDED_MIP_PROBLEM,
+    //! The problem has an optimal solution.
+    OPTIMIZED_MIP_PROBLEM
+}
diff --git a/interfaces/Java/ppl_java/Makefile.am b/interfaces/Java/ppl_java/Makefile.am
new file mode 100644
index 0000000..094397c
--- /dev/null
+++ b/interfaces/Java/ppl_java/Makefile.am
@@ -0,0 +1,166 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+JAVAROOT = ../
+
+required_instantiations_java_sources = \
+ at required_instantiations_java_sources@
+
+required_instantiations_java_cxx_headers = \
+ at required_instantiations_java_cxx_headers@
+
+interface_generator_files = \
+ppl_interface_generator_java_classes_java.m4 \
+ppl_interface_generator_java_classes_java_code.m4
+
+fixed_java_cxx_headers = \
+ppl_java.Congruence \
+ppl_java.Congruence_System \
+ppl_java.Constraint \
+ppl_java.Constraint_System \
+ppl_java.Generator \
+ppl_java.Generator_System \
+ppl_java.Grid_Generator \
+ppl_java.Grid_Generator_System \
+ppl_java.Linear_Expression \
+ppl_java.MIP_Problem \
+ppl_java.Parma_Polyhedra_Library
+
+fixed_java_cxx_headers_sources = \
+ppl_java_Congruence.h \
+ppl_java_Congruence_System.h \
+ppl_java_Constraint.h \
+ppl_java_Constraint_System.h \
+ppl_java_Generator.h \
+ppl_java_Generator_System.h \
+ppl_java_Grid_Generator.h \
+ppl_java_Grid_Generator_System.h \
+ppl_java_Linear_Expression.h \
+ppl_java_MIP_Problem.h \
+ppl_java_Parma_Polyhedra_Library.h
+
+fixed_java_sources = \
+By_Reference.java \
+Coefficient.java \
+Congruence.java \
+Congruence_System.java \
+Constraint.java \
+Constraint_System.java \
+Constraint_System.java \
+Degenerate_Element.java \
+Domain_Error_Exception.java \
+Generator.java \
+Generator_System.java \
+Generator_Type.java \
+Grid_Generator.java \
+Grid_Generator_System.java \
+Grid_Generator_Type.java \
+Invalid_Argument_Exception.java \
+Length_Error_Exception.java \
+Linear_Expression.java \
+Linear_Expression_Coefficient.java \
+Linear_Expression_Difference.java \
+Linear_Expression_Sum.java \
+Linear_Expression_Times.java \
+Linear_Expression_Unary_Minus.java \
+Linear_Expression_Variable.java \
+Logic_Error_Exception.java \
+MIP_Problem.java \
+MIP_Problem_Status.java \
+Optimization_Mode.java \
+Overflow_Error_Exception.java \
+PPL_Object.java \
+Parma_Polyhedra_Library.java \
+Pair.java \
+Partial_Function.java \
+Poly_Con_Relation.java \
+Poly_Gen_Relation.java \
+Relation_Symbol.java \
+Variable.java \
+Variables_Set.java
+
+all_java_sources = \
+$(fixed_java_sources) \
+$(required_instantiations_java_sources)
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(fixed_java_sources)
+
+if BUILD_JAVA_INTERFACE
+
+# This is to force Automake to generate the required Java infrastructure
+# and all the class files.
+noinst_JAVA = Variable.java
+
+all:	java_classes.stamp java_cxx_headers.stamp
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+$(interface_generator_files)
+
+java_classes.stamp: $(all_java_sources)
+	@if test -n "$?"; then \
+		echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $?' ; \
+		$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \
+		$(AM_JAVACFLAGS) $(JAVACFLAGS) $?; \
+	else :; fi
+	echo timestamp > java_classes.stamp
+
+java_cxx_headers.stamp: java_classes.stamp
+	@if test -n "$?"; then \
+		echo '$(JAVAH) -classpath ..  $(fixed_java_cxx_headers) $(required_instantiations_java_cxx_headers)' ; \
+		$(JAVAH) -classpath .. $(fixed_java_cxx_headers) $(required_instantiations_java_cxx_headers) ; \
+	else :; fi
+	echo timestamp > java_cxx_headers.stamp
+
+# In general, several java sources will be built and the same process
+# will build all of them.  We assume that C_Polyhedron.java will always
+# be built, independently from all configuration options.
+BUILT_SOURCES = C_Polyhedron.java
+
+source_generation.stamp: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_classes_java.m4 \
+			> java_blob
+	$(top_srcdir)/utils/cm_cleaner.sh < java_blob
+	$(top_srcdir)/utils/cm_splitter.sh < java_blob
+	rm -f java_blob
+	echo timestamp > source_generation.stamp
+
+$(required_instantiations_java_sources): source_generation.stamp
+
+endif BUILD_JAVA_INTERFACE
+
+CLEANFILES = \
+$(required_instantiations_java_sources) \
+$(required_instantiations_java_cxx_headers_sources) \
+$(fixed_java_cxx_headers_sources) \
+java_classes.stamp \
+java_cxx_headers.stamp \
+source_generation.stamp
diff --git a/interfaces/Java/ppl_java/Makefile.in b/interfaces/Java/ppl_java/Makefile.in
new file mode 100644
index 0000000..86fdf89
--- /dev/null
+++ b/interfaces/Java/ppl_java/Makefile.in
@@ -0,0 +1,581 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/ppl_java
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+CLASSPATH_ENV = CLASSPATH=$(JAVAROOT):$(srcdir)/$(JAVAROOT):$$CLASSPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = \
+ at required_instantiations_java_cxx_headers@
+
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = \
+ at required_instantiations_java_sources@
+
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+JAVAROOT = ../
+interface_generator_files = \
+ppl_interface_generator_java_classes_java.m4 \
+ppl_interface_generator_java_classes_java_code.m4
+
+fixed_java_cxx_headers = \
+ppl_java.Congruence \
+ppl_java.Congruence_System \
+ppl_java.Constraint \
+ppl_java.Constraint_System \
+ppl_java.Generator \
+ppl_java.Generator_System \
+ppl_java.Grid_Generator \
+ppl_java.Grid_Generator_System \
+ppl_java.Linear_Expression \
+ppl_java.MIP_Problem \
+ppl_java.Parma_Polyhedra_Library
+
+fixed_java_cxx_headers_sources = \
+ppl_java_Congruence.h \
+ppl_java_Congruence_System.h \
+ppl_java_Constraint.h \
+ppl_java_Constraint_System.h \
+ppl_java_Generator.h \
+ppl_java_Generator_System.h \
+ppl_java_Grid_Generator.h \
+ppl_java_Grid_Generator_System.h \
+ppl_java_Linear_Expression.h \
+ppl_java_MIP_Problem.h \
+ppl_java_Parma_Polyhedra_Library.h
+
+fixed_java_sources = \
+By_Reference.java \
+Coefficient.java \
+Congruence.java \
+Congruence_System.java \
+Constraint.java \
+Constraint_System.java \
+Constraint_System.java \
+Degenerate_Element.java \
+Domain_Error_Exception.java \
+Generator.java \
+Generator_System.java \
+Generator_Type.java \
+Grid_Generator.java \
+Grid_Generator_System.java \
+Grid_Generator_Type.java \
+Invalid_Argument_Exception.java \
+Length_Error_Exception.java \
+Linear_Expression.java \
+Linear_Expression_Coefficient.java \
+Linear_Expression_Difference.java \
+Linear_Expression_Sum.java \
+Linear_Expression_Times.java \
+Linear_Expression_Unary_Minus.java \
+Linear_Expression_Variable.java \
+Logic_Error_Exception.java \
+MIP_Problem.java \
+MIP_Problem_Status.java \
+Optimization_Mode.java \
+Overflow_Error_Exception.java \
+PPL_Object.java \
+Parma_Polyhedra_Library.java \
+Pair.java \
+Partial_Function.java \
+Poly_Con_Relation.java \
+Poly_Gen_Relation.java \
+Relation_Symbol.java \
+Variable.java \
+Variables_Set.java
+
+all_java_sources = \
+$(fixed_java_sources) \
+$(required_instantiations_java_sources)
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(fixed_java_sources)
+
+
+# This is to force Automake to generate the required Java infrastructure
+# and all the class files.
+ at BUILD_JAVA_INTERFACE_TRUE@noinst_JAVA = Variable.java
+ at BUILD_JAVA_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../ppl_interface_generator_java_procedure_generators.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@$(interface_generator_files)
+
+
+# In general, several java sources will be built and the same process
+# will build all of them.  We assume that C_Polyhedron.java will always
+# be built, independently from all configuration options.
+ at BUILD_JAVA_INTERFACE_TRUE@BUILT_SOURCES = C_Polyhedron.java
+CLEANFILES = \
+$(required_instantiations_java_sources) \
+$(required_instantiations_java_cxx_headers_sources) \
+$(fixed_java_cxx_headers_sources) \
+java_classes.stamp \
+java_cxx_headers.stamp \
+source_generation.stamp
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Java/ppl_java/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Java/ppl_java/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+classnoinst.stamp: $(noinst_JAVA)
+	@list1='$?'; list2=; if test -n "$$list1"; then \
+	  for p in $$list1; do \
+	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	    list2="$$list2 $$d$$p"; \
+	  done; \
+	  echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) '"$$list2"; \
+	  $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $$list2; \
+	else :; fi
+	echo timestamp > classnoinst.stamp
+
+clean-noinstJAVA:
+	-rm -f *.class classnoinst.stamp
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile classnoinst.stamp
+installdirs:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstJAVA mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	clean-noinstJAVA distclean distclean-generic distclean-libtool \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am
+
+
+ at BUILD_JAVA_INTERFACE_TRUE@all:	java_classes.stamp java_cxx_headers.stamp
+
+ at BUILD_JAVA_INTERFACE_TRUE@java_classes.stamp: $(all_java_sources)
+ at BUILD_JAVA_INTERFACE_TRUE@	@if test -n "$?"; then \
+ at BUILD_JAVA_INTERFACE_TRUE@		echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $?' ; \
+ at BUILD_JAVA_INTERFACE_TRUE@		$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \
+ at BUILD_JAVA_INTERFACE_TRUE@		$(AM_JAVACFLAGS) $(JAVACFLAGS) $?; \
+ at BUILD_JAVA_INTERFACE_TRUE@	else :; fi
+ at BUILD_JAVA_INTERFACE_TRUE@	echo timestamp > java_classes.stamp
+
+ at BUILD_JAVA_INTERFACE_TRUE@java_cxx_headers.stamp: java_classes.stamp
+ at BUILD_JAVA_INTERFACE_TRUE@	@if test -n "$?"; then \
+ at BUILD_JAVA_INTERFACE_TRUE@		echo '$(JAVAH) -classpath ..  $(fixed_java_cxx_headers) $(required_instantiations_java_cxx_headers)' ; \
+ at BUILD_JAVA_INTERFACE_TRUE@		$(JAVAH) -classpath .. $(fixed_java_cxx_headers) $(required_instantiations_java_cxx_headers) ; \
+ at BUILD_JAVA_INTERFACE_TRUE@	else :; fi
+ at BUILD_JAVA_INTERFACE_TRUE@	echo timestamp > java_cxx_headers.stamp
+
+ at BUILD_JAVA_INTERFACE_TRUE@source_generation.stamp: $(interface_generator_dependencies)
+ at BUILD_JAVA_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. \
+ at BUILD_JAVA_INTERFACE_TRUE@		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_JAVA_INTERFACE_TRUE@		$(srcdir)/ppl_interface_generator_java_classes_java.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@			> java_blob
+ at BUILD_JAVA_INTERFACE_TRUE@	$(top_srcdir)/utils/cm_cleaner.sh < java_blob
+ at BUILD_JAVA_INTERFACE_TRUE@	$(top_srcdir)/utils/cm_splitter.sh < java_blob
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -f java_blob
+ at BUILD_JAVA_INTERFACE_TRUE@	echo timestamp > source_generation.stamp
+
+ at BUILD_JAVA_INTERFACE_TRUE@$(required_instantiations_java_sources): source_generation.stamp
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/ppl_java/Optimization_Mode.java b/interfaces/Java/ppl_java/Optimization_Mode.java
new file mode 100644
index 0000000..ba31690
--- /dev/null
+++ b/interfaces/Java/ppl_java/Optimization_Mode.java
@@ -0,0 +1,33 @@
+/* Optimization_Mode enum declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! Possible optimization modes.
+/*! \ingroup PPL_Java_interface */
+
+public enum Optimization_Mode {
+    /*! Minimization is requested. */
+    MINIMIZATION,
+    /*! Maximization is requested. */
+    MAXIMIZATION;
+}
diff --git a/interfaces/Java/ppl_java/Overflow_Error_Exception.java b/interfaces/Java/ppl_java/Overflow_Error_Exception.java
new file mode 100644
index 0000000..bcdb977
--- /dev/null
+++ b/interfaces/Java/ppl_java/Overflow_Error_Exception.java
@@ -0,0 +1,30 @@
+/* Overflow_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+public class Overflow_Error_Exception extends RuntimeException {
+
+    public Overflow_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/ppl_java/PPL_Object.java b/interfaces/Java/ppl_java/PPL_Object.java
new file mode 100644
index 0000000..d5cf931
--- /dev/null
+++ b/interfaces/Java/ppl_java/PPL_Object.java
@@ -0,0 +1,42 @@
+/* PPL_Object Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! Smart pointer to a PPL, C++ object.
+public class PPL_Object {
+
+    //! Stores the value of the C++ pointer.
+    long ptr;
+
+    /* A flag used to know if the underlying C++ object should be deleted
+       or not. For example, objects that are taken from iterators should not
+       be deleted.
+    */
+    boolean is_a_reference;
+
+    //! Builds an object that points to `null'.
+    protected PPL_Object() {
+	ptr = 0;
+        is_a_reference = false;
+    }
+}
diff --git a/interfaces/Java/ppl_java/Pair.java b/interfaces/Java/ppl_java/Pair.java
new file mode 100644
index 0000000..a8c7583
--- /dev/null
+++ b/interfaces/Java/ppl_java/Pair.java
@@ -0,0 +1,46 @@
+/* Pair Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+//! A Pair of values of type K and V.
+/*! \ingroup PPL_Java_interface
+  An object of this class holds a pair of values of type K and V.
+*/
+
+public class Pair<K, V>  {
+
+    //! Stores an object of type K.
+    private K first;
+
+    //! Stores an object of type V.
+    private V second;
+
+    // Returns the object of type K.
+    public K getFirst() {
+	return first;
+    }
+
+    // Returns the object of type V.
+    public V getSecond() {
+	return second;
+    }
+}
diff --git a/interfaces/Java/ppl_java/Parma_Polyhedra_Library.java b/interfaces/Java/ppl_java/Parma_Polyhedra_Library.java
new file mode 100644
index 0000000..d097649
--- /dev/null
+++ b/interfaces/Java/ppl_java/Parma_Polyhedra_Library.java
@@ -0,0 +1,43 @@
+/* Parma_Polyhedra_Library Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+public class Parma_Polyhedra_Library {
+
+    public static native int version_major();
+
+    public static native int version_minor();
+
+    public static native int version_revision();
+
+    public static native int version_beta();
+
+    public static native String version();
+
+    public static native String banner();
+
+    public static native void set_rounding_for_PPL();
+
+    public static native void restore_pre_PPL_rounding();
+
+}
diff --git a/interfaces/Java/ppl_java/Partial_Function.java b/interfaces/Java/ppl_java/Partial_Function.java
new file mode 100644
index 0000000..87ea9bb
--- /dev/null
+++ b/interfaces/Java/ppl_java/Partial_Function.java
@@ -0,0 +1,31 @@
+/* Partial_Function Java interface declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+public interface Partial_Function {
+    boolean has_empty_codomain();
+
+    long max_in_codomain();
+
+    boolean maps(Long i, By_Reference<Long> j);
+}
diff --git a/interfaces/Java/ppl_java/Poly_Con_Relation.java b/interfaces/Java/ppl_java/Poly_Con_Relation.java
new file mode 100644
index 0000000..0801f87
--- /dev/null
+++ b/interfaces/Java/ppl_java/Poly_Con_Relation.java
@@ -0,0 +1,87 @@
+/* Poly_Con_Relation Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_Java_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+public class Poly_Con_Relation {
+
+    public static final int NOTHING = 0;
+    public static final int IS_DISJOINT = 1;
+    public static final int STRICTLY_INTERSECTS = 2;
+    public static final int IS_INCLUDED = 4;
+    public static final int SATURATES = 8;
+
+    //! Holds the value of the possible relations.
+    public int mask_value;
+
+    //! Constructs from a integer value.
+    public Poly_Con_Relation(int val) {
+	mask_value = val;
+    }
+
+    //! The assertion that says nothing.
+    public static Poly_Con_Relation nothing() {
+	return new Poly_Con_Relation(Poly_Con_Relation.NOTHING);
+    }
+
+    /*! \brief
+      The polyhedron and the set of points satisfying
+      the constraint are disjoint.
+    */
+    public static Poly_Con_Relation is_disjoint() {
+	return new  Poly_Con_Relation(Poly_Con_Relation.IS_DISJOINT);
+    }
+
+    /*! \brief
+      The polyhedron intersects the set of points satisfying
+      the constraint, but it is not included in it.
+    */
+    public static Poly_Con_Relation strictly_intersects() {
+	return new Poly_Con_Relation(Poly_Con_Relation.STRICTLY_INTERSECTS);
+    }
+
+    /*! \brief
+      The polyhedron is included in the set of points satisfying
+      the constraint.
+    */
+    public static Poly_Con_Relation is_included() {
+	return new Poly_Con_Relation(Poly_Con_Relation.IS_INCLUDED);
+    }
+
+    /*! \brief
+      The polyhedron is included in the set of points saturating
+      the constraint.
+    */
+    public static Poly_Con_Relation saturates() {
+	return new Poly_Con_Relation(Poly_Con_Relation.SATURATES);
+    }
+
+    //! True if and only if \p *this implies \p y.
+    public boolean implies(Poly_Con_Relation y) {
+	return (this.mask_value & y.mask_value) ==  y.mask_value;
+    }
+}
diff --git a/interfaces/Java/ppl_java/Poly_Gen_Relation.java b/interfaces/Java/ppl_java/Poly_Gen_Relation.java
new file mode 100644
index 0000000..21507bd
--- /dev/null
+++ b/interfaces/Java/ppl_java/Poly_Gen_Relation.java
@@ -0,0 +1,57 @@
+/* Poly_Gen_Relation Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+public class Poly_Gen_Relation {
+
+    public static final int NOTHING = 0;
+    public static final int SUBSUMES = 1;
+
+    //! Holds the value of the possible relations.
+    public int mask_value;
+
+    //! Constructs from a integer value.
+    public Poly_Gen_Relation(int val) {
+	mask_value = val;
+    }
+
+    //! The assertion that says nothing.
+    public static Poly_Gen_Relation nothing() {
+	return new Poly_Gen_Relation(Poly_Gen_Relation.NOTHING);
+    }
+
+    //! Adding the generator would not change the polyhedron.
+    public static Poly_Gen_Relation subsumes() {
+	return new  Poly_Gen_Relation(Poly_Gen_Relation.SUBSUMES);
+    }
+
+    //! True if and only if \p *this implies \p y.
+    public boolean implies(Poly_Gen_Relation y) {
+	return (this.mask_value & y.mask_value) ==  y.mask_value;
+    }
+}
diff --git a/interfaces/Java/ppl_java/Relation_Symbol.java b/interfaces/Java/ppl_java/Relation_Symbol.java
new file mode 100644
index 0000000..470bcd5
--- /dev/null
+++ b/interfaces/Java/ppl_java/Relation_Symbol.java
@@ -0,0 +1,39 @@
+/* Relation_Symbol enum declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+/*! \ingroup PPL_Java_interface
+//! Relation symbols.
+*/
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+}
diff --git a/interfaces/Java/ppl_java/Variable.java b/interfaces/Java/ppl_java/Variable.java
new file mode 100644
index 0000000..fde2c79
--- /dev/null
+++ b/interfaces/Java/ppl_java/Variable.java
@@ -0,0 +1,69 @@
+/* Variable Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+import javax.management.RuntimeErrorException;
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_Java_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+*/
+public class Variable implements Comparable<Variable> {
+    //! The index of the Cartesian axis.
+    private int varid;
+
+    //! Builds the variable corresponding to the Cartesian axis of index \p i.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if <CODE>i</CODE> is has negative value.
+    */
+    public Variable(int i) {
+	if (i < 0)
+	    throw new
+		RuntimeErrorException(new Error("ppl_java.Variable::"
+						+ "Variable:"
+						+ " an index variable"
+						+ " cannot be negative."));
+	varid = i;
+    }
+
+    //! Returns the index of the Cartesian axis associated to \p this.
+    public int id() {
+	return varid;
+    }
+
+  /*! \brief
+    Returns a negative number if \p this comes first than \p v,
+    a zero if \p this equals \p v, a positive number if 
+   if \p this comes first than \p v.
+   */         
+    public int compareTo(Variable v) {
+        return varid - v.varid;
+        }
+}
diff --git a/interfaces/Java/ppl_java/Variables_Set.java b/interfaces/Java/ppl_java/Variables_Set.java
new file mode 100644
index 0000000..9502e6d
--- /dev/null
+++ b/interfaces/Java/ppl_java/Variables_Set.java
@@ -0,0 +1,31 @@
+/* Variables_Set Java class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+package ppl_java;
+
+//! A java.util.TreeSet of variables' indexes.
+public class Variables_Set extends java.util.TreeSet<Variable>{
+
+    //! Builds the empty set of variable indexes.
+    public Variables_Set() {
+    }
+}
diff --git a/interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4 b/interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
new file mode 100644
index 0000000..b443c6c
--- /dev/null
+++ b/interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java.m4
@@ -0,0 +1,115 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the files <CLASS_NAME>.java
+dnl using the code in ppl_interface_generator_java_classes_java_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_java_classes_java_code.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+m4_define(`m4_this_class_kind', `m4_class_kind$1')`'dnl
+m4_divert
+%<--%<--%<-- m4_this_class`'.java
+package ppl_java;
+
+public class m4_this_class extends PPL_Object {`'dnl
+m4_ifelse(m4_this_class, Polyhedron,
+  `
+%<--%<--%<-- C_`'m4_this_class`'.java
+package ppl_java;
+
+public class C_`'m4_this_class extends Polyhedron {
+
+%<--%<--%<-- NNC_`'m4_this_class`'.java
+package ppl_java;
+
+public class NNC_`'m4_this_class extends Polyhedron {
+',
+m4_this_class_kind, Pointset_Powerset,
+`
+%<--%<--%<-- m4_this_class`'_Iterator.java
+package ppl_java;
+
+public class m4_this_class`'_Iterator extends PPL_Object {
+
+  private m4_this_class`'_Iterator() {};
+
+  private native void build_ppl_object(m4_this_class obj);
+')`'dnl
+m4_undefine(`m4_this_class')`'dnl
+m4_undefine(`m4_this_class_kind')
+')
+
+%<--%<--%<-- m4_interface_class$1`'.java
+public class m4_cplusplus_class$1 extends PPL_Object {
+
+m4_divert(-1)
+
+dnl m4_post_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+  m4_class_build_cpp_object1_code,
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_class_build_cpp_object2_code,
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_class_build_cpp_object3_code,
+  m4_pattern_list)`'dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+m4_define(`m4_this_class_kind', `m4_class_kind$1')
+%<--%<--%<-- m4_this_class`'.java
+}`'dnl
+m4_ifelse(m4_this_class, Polyhedron,
+  `
+
+%<--%<--%<-- C_`'m4_this_class`'.java
+}
+
+%<--%<--%<-- NNC_`'m4_this_class`'.java
+}
+',
+m4_this_class_kind, Pointset_Powerset,
+  `
+%<--%<--%<-- m4_this_class`'_Iterator.java
+}`'dnl
+')`'dnl
+m4_undefine(`m4_this_class')`'dnl
+m4_undefine(`m4_this_class_kind')
+')
+
+dnl -----------------------------------------------------------------
+dnl Main calls to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+
+dnl End of file generation.
diff --git a/interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4 b/interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
new file mode 100644
index 0000000..12d0cfa
--- /dev/null
+++ b/interfaces/Java/ppl_java/ppl_interface_generator_java_classes_java_code.m4
@@ -0,0 +1,495 @@
+dnl  -*- java -*-
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating files <CLASS_NAME>.java
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`m4_class_build_cpp_object1_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    private native void build_cpp_object(@UBUILD_REPRESENT at _System cs);
+
+')
+
+m4_define(`m4_class_build_cpp_object2_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    private native void build_cpp_object(long num_dimensions,
+                                         Degenerate_Element kind);
+
+')
+
+m4_define(`m4_class_build_cpp_object3_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    private native void build_cpp_object(@FRIEND@ y);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    public @TOPOLOGY@@CLASS@(long num_dimensions,
+			Degenerate_Element kind) {
+	build_cpp_object(num_dimensions, kind);
+    }
+
+    private @TOPOLOGY@@CLASS@() {
+    }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    public @TOPOLOGY@@CLASS@(@FRIEND@ y) {
+        build_cpp_object(y);
+    }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    public @TOPOLOGY@@CLASS@(@UBUILD_REPRESENT at _System cs) {
+	build_cpp_object(cs);
+    }
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    protected native void finalize();
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    public native void free();
+
+')
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`dnl
+%<--%<--%<-- @TOPOLOGY@@CLASS at .java
+    public native boolean @UB_EXACT@(@TOPOLOGY@@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void swap(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native long @DIMENSION@();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native @UGET_REPRESENT at _System @GET_REPRESENT at s();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native @UGET_REPRESENT at _System minimized_ at GET_REPRESENT@s();
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native Poly_ at UALT_RELATION_REPRESENT@_Relation relation_with(@URELATION_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean @HAS_PROPERTY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void @SIMPLIFY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void unconstrain_space_dimension(Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void
+      unconstrain_space_dimensions(Variables_Set to_be_constrained);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean bounds_from_ at ABOVEBELOW@(Linear_Expression expr);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean @MAXMIN@(Linear_Expression expr,
+				   Coefficient sup_n, Coefficient sup_d,
+				   By_Reference<Boolean> maximum);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean @MAXMIN@(Linear_Expression expr,
+				   Coefficient sup_n, Coefficient sup_d,
+				   By_Reference<Boolean> maximum,
+				   Generator point);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean @COMPARISON@(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean equals(@CLASS@ p);
+
+    public boolean equals(Object y) {
+   if (this == y)
+     return true;
+   if (y == null || y.getClass() != this.getClass())
+     return false;
+   return this.equals((@CLASS@) y);
+  }
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native int hashCode();
+
+')
+
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean OK();
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void add_ at ADD_REPRESENT@(@UADD_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void refine_with_ at REFINE_REPRESENT@(@UREFINE_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean add_ at ADD_REPRESENT@_and_minimize(@UADD_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void add_ at ADD_REPRESENT@s(@UADD_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void refine_with_ at REFINE_REPRESENT@s(@UREFINE_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean add_ at ADD_REPRESENT@s_and_minimize(@UADD_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void @BINOP@(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean @BINMINOP@(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native boolean simplify_using_context_assign(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void @AFFIMAGE@(Variable var, Linear_Expression expr,
+				    Coefficient denominator);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void bounded_ at AFFIMAGE@(Variable var,
+					    Linear_Expression lb_expr,
+					    Linear_Expression ub_expr,
+					    Coefficient denominator);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void generalized_ at AFFIMAGE@(Variable var,
+				Relation_Symbol relsym,
+				Linear_Expression expr,
+				Coefficient denominator);
+
+')
+
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void generalized_ at AFFIMAGE@(Linear_Expression lhs,
+				Relation_Symbol relsym,
+				Linear_Expression rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void
+    @EXTRAPOLATION at _narrowing_assign(@TOPOLOGY@@CLASS@ arg);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void generalized_ at AFFIMAGE@_with_congruence(Variable var,
+				Relation_Symbol relsym,
+				Linear_Expression expr,
+				Coefficient denominator,
+				Coefficient modulus);
+
+')
+
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(Linear_Expression lhs,
+				Relation_Symbol relsym,
+				Linear_Expression rhs,
+				Coefficient modulus);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+public native void @WIDEN at _widening_assign(@CLASS@ y,
+                                By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native
+	void @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(@CLASS@ y,
+						 @UCONSTRAINER at _System cs,
+						 By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void add_space_dimensions_ at EMBEDPROJECT@(long m);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void remove_space_dimensions(Variables_Set to_be_removed);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void remove_higher_space_dimensions(long
+						      new_dimension);
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void expand_space_dimension(Variable var, long m);
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void fold_space_dimensions(Variables_Set to_be_folded,
+					     Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void map_space_dimensions(Partial_Function pfunc);
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native String toString();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native @CLASS at _Iterator @BEGINEND at _iterator();
+
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+    public native void delete_iterator();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+%<--%<--%<-- @CLASS at _Iterator.java
+  public native @CLASSTOPOLOGY@@DISJUNCT@ get_disjunct();
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+  public native void drop_disjunct(@CLASS at _Iterator itr);
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+%<--%<--%<-- @CLASS at _Iterator.java
+  public native boolean equals(@CLASS at _Iterator itr);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+%<--%<--%<-- @CLASS at _Iterator.java
+  public native void @ALT_INCDEC@();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+  public native long @MEMBYTES@();
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+  public native boolean constrains(Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+  public native String ascii_dump();
+
+')dd
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code',
+`dnl
+%<--%<--%<-- @CLASS at .java
+
+  public static native Pair <@CLASSTOPOLOGY@@CPP_DISJUNCT@@COMMA@ @CLASS@> @PARTITION@(@CLASSTOPOLOGY@@DISJUNCT@ p, @CLASSTOPOLOGY@@DISJUNCT@ q);
+')
diff --git a/interfaces/Java/tests/C_Polyhedron_test1.java b/interfaces/Java/tests/C_Polyhedron_test1.java
new file mode 100644
index 0000000..b4b4c40
--- /dev/null
+++ b/interfaces/Java/tests/C_Polyhedron_test1.java
@@ -0,0 +1,108 @@
+/* Test C_Polyhedron Java test class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.Vector;
+import ppl_java.*;
+
+
+public class C_Polyhedron_test1 {
+static {
+    try {
+        System.loadLibrary("ppl_java");
+    }
+
+   catch (UnsatisfiedLinkError  e) {
+       System.out.println("Unable to load the library");
+       System.exit(-1);
+   }
+}
+
+    // This code tests the method `map_space_dimension(pfunc)'.
+    public static Boolean test01() {
+	Test_Partial_Function partial_function = new Test_Partial_Function();
+	partial_function.insert(0, 2);
+	partial_function.insert(2, 0);
+	partial_function.insert(1, 1);
+	Variable A = new Variable(0);
+	Variable B = new Variable(1);
+	Variable C = new Variable(2);
+	Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+	Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+	Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+	Linear_Expression_Sum le_a_plus_b = new Linear_Expression_Sum(le_a,
+								      le_b);
+	Linear_Expression_Sum le_a_plus_c = new Linear_Expression_Sum(le_a,
+								      le_c);
+	Linear_Expression_Sum le_c_plus_b = new Linear_Expression_Sum(le_c,
+								      le_b);
+	Linear_Expression_Sum le_c_plus_a = new Linear_Expression_Sum(le_c,
+								      le_a);
+	Linear_Expression_Coefficient le_two
+	    = new Linear_Expression_Coefficient(new Coefficient(2));
+	Linear_Expression_Times le_2c
+	    = new Linear_Expression_Times(le_c,
+					  new Coefficient(2));
+	Linear_Expression_Times le_2a
+	    = new Linear_Expression_Times(le_a,
+					  new Coefficient(2));
+
+	Generator_System gs = new Generator_System();
+	gs.add(Generator.point(le_2c, new Coefficient(1)));
+	gs.add(Generator.line(le_a_plus_b));
+	gs.add(Generator.ray(le_a_plus_c));
+
+	C_Polyhedron poly1 = new C_Polyhedron(gs);
+	poly1.map_space_dimensions(partial_function);
+
+	Generator_System known_gs = new Generator_System();
+	known_gs.add(Generator.point(le_2a, new Coefficient(1)));
+	known_gs.add(Generator.line(le_c_plus_b));
+	known_gs.add(Generator.ray(le_c_plus_a));
+
+	C_Polyhedron known_result = new C_Polyhedron(known_gs);
+	return new Boolean(known_result.equals(poly1));
+    }
+
+
+    public static Boolean test02() {
+	// Test if `minimized_constraints' returns an empty Constraint_System
+	// if the Polyhedron is built from universe with a dimension greater
+	// than zero.
+	Variable X = new Variable(0);
+	Variable Y = new Variable(1);
+	Variable Z = new Variable(2);
+	C_Polyhedron ph = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+	Constraint_System cs = ph.minimized_constraints();
+	return new Boolean(cs.isEmpty());
+    }
+
+    public static void main(String[] args) {
+	boolean test_result_ok =
+	    Test_Executor.executeTests(C_Polyhedron_test1.class);
+	if (!test_result_ok)
+	    System.exit(1);
+	System.exit(0);
+    }
+}
diff --git a/interfaces/Java/tests/Makefile.am b/interfaces/Java/tests/Makefile.am
new file mode 100644
index 0000000..8bdcdfd
--- /dev/null
+++ b/interfaces/Java/tests/Makefile.am
@@ -0,0 +1,81 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+JAVAROOT = .
+
+interface_generator_files = \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4
+
+if BUILD_JAVA_INTERFACE
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4 \
+ppl_java_tests_common
+
+check_JAVA = \
+ppl_java_generated_tests.java \
+Test_Partial_Function.java \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java
+
+# Even if the Java sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake Java build system.
+EXTRA_DIST = \
+Test_Partial_Function.java \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+ppl_interface_generator_java_test_java_code.m4 \
+ppl_interface_generator_java_test_java.m4 \
+ppl_java_tests_common
+
+CLASSPATH = ../ppl_java.jar:.
+JAVACFLAGS = -classpath $(CLASSPATH)
+
+check-local: ppl_java_generated_tests.java
+	$(LIBTOOL) --mode=execute \
+                -dlopen ../../../src/libppl.la \
+	$(JAVA) -classpath .:../ppl_java.jar -Djava.library.path=../jni/.libs ppl_java_generated_tests
+	$(LIBTOOL) --mode=execute \
+             -dlopen ../../../src/libppl.la \
+	$(JAVA) -classpath .:../ppl_java.jar -Djava.library.path=../jni/.libs C_Polyhedron_test1
+	$(JAVA) -classpath .:../ppl_java.jar -Djava.library.path=../jni/.libs NNC_Polyhedron_test1
+
+ppl_java_generated_tests.java: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_test_java.m4 \
+			> $@
+
+endif BUILD_JAVA_INTERFACE
+
+CLEANFILES = \
+ppl_java_generated_tests.java
diff --git a/interfaces/Java/tests/Makefile.in b/interfaces/Java/tests/Makefile.in
new file mode 100644
index 0000000..e3e3811
--- /dev/null
+++ b/interfaces/Java/tests/Makefile.in
@@ -0,0 +1,497 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+CLASSPATH_ENV = CLASSPATH=$(JAVAROOT):$(srcdir)/$(JAVAROOT):$$CLASSPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+JAVAROOT = .
+interface_generator_files = \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4
+
+ at BUILD_JAVA_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_JAVA_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@../ppl_interface_generator_java_procedure_generators.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_interface_generator_java_test_java.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_interface_generator_java_test_java_code.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_tests_common
+
+ at BUILD_JAVA_INTERFACE_TRUE@check_JAVA = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_generated_tests.java \
+ at BUILD_JAVA_INTERFACE_TRUE@Test_Partial_Function.java \
+ at BUILD_JAVA_INTERFACE_TRUE@Test_Executor.java \
+ at BUILD_JAVA_INTERFACE_TRUE@C_Polyhedron_test1.java \
+ at BUILD_JAVA_INTERFACE_TRUE@NNC_Polyhedron_test1.java
+
+
+# Even if the Java sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake Java build system.
+ at BUILD_JAVA_INTERFACE_TRUE@EXTRA_DIST = \
+ at BUILD_JAVA_INTERFACE_TRUE@Test_Partial_Function.java \
+ at BUILD_JAVA_INTERFACE_TRUE@Test_Executor.java \
+ at BUILD_JAVA_INTERFACE_TRUE@C_Polyhedron_test1.java \
+ at BUILD_JAVA_INTERFACE_TRUE@NNC_Polyhedron_test1.java \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_interface_generator_java_test_java_code.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_interface_generator_java_test_java.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_tests_common
+
+ at BUILD_JAVA_INTERFACE_TRUE@CLASSPATH = ../ppl_java.jar:.
+ at BUILD_JAVA_INTERFACE_TRUE@JAVACFLAGS = -classpath $(CLASSPATH)
+CLEANFILES = \
+ppl_java_generated_tests.java
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Java/tests/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Java/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+classcheck.stamp: $(check_JAVA)
+	@list1='$?'; list2=; if test -n "$$list1"; then \
+	  for p in $$list1; do \
+	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	    list2="$$list2 $$d$$p"; \
+	  done; \
+	  echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) '"$$list2"; \
+	  $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $$list2; \
+	else :; fi
+	echo timestamp > classcheck.stamp
+
+clean-checkJAVA:
+	-rm -f *.class classcheck.stamp
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_JAVA_INTERFACE_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_JAVA)
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile classcheck.stamp
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkJAVA clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am check-local clean clean-checkJAVA \
+	clean-generic clean-libtool distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am
+
+
+ at BUILD_JAVA_INTERFACE_TRUE@check-local: ppl_java_generated_tests.java
+ at BUILD_JAVA_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_JAVA_INTERFACE_TRUE@                -dlopen ../../../src/libppl.la \
+ at BUILD_JAVA_INTERFACE_TRUE@	$(JAVA) -classpath .:../ppl_java.jar -Djava.library.path=../jni/.libs ppl_java_generated_tests
+ at BUILD_JAVA_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_JAVA_INTERFACE_TRUE@             -dlopen ../../../src/libppl.la \
+ at BUILD_JAVA_INTERFACE_TRUE@	$(JAVA) -classpath .:../ppl_java.jar -Djava.library.path=../jni/.libs C_Polyhedron_test1
+ at BUILD_JAVA_INTERFACE_TRUE@	$(JAVA) -classpath .:../ppl_java.jar -Djava.library.path=../jni/.libs NNC_Polyhedron_test1
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl_java_generated_tests.java: $(interface_generator_dependencies)
+ at BUILD_JAVA_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. \
+ at BUILD_JAVA_INTERFACE_TRUE@		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_JAVA_INTERFACE_TRUE@		$(srcdir)/ppl_interface_generator_java_test_java.m4 \
+ at BUILD_JAVA_INTERFACE_TRUE@			> $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/tests/NNC_Polyhedron_test1.java b/interfaces/Java/tests/NNC_Polyhedron_test1.java
new file mode 100644
index 0000000..50e49a8
--- /dev/null
+++ b/interfaces/Java/tests/NNC_Polyhedron_test1.java
@@ -0,0 +1,88 @@
+/* Test NNC_Polyhedron Java test class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.Vector;
+import ppl_java.*;
+
+
+public class NNC_Polyhedron_test1 {
+static {
+    try {
+        System.loadLibrary("ppl_java");
+    }
+
+   catch (UnsatisfiedLinkError  e) {
+       System.out.println("Unable to load the library");
+       System.exit(-1);
+   }
+}
+
+    public static Boolean test01() {
+	Variable X = new Variable(0);
+	Variable Y = new Variable(1);
+	Variable Z = new Variable(2);
+	NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+	Linear_Expression le_X = new Linear_Expression_Variable(X);
+	Linear_Expression le_Y = new Linear_Expression_Variable(Y);
+	Linear_Expression le_Z = new Linear_Expression_Variable(Z);
+	Linear_Expression le_2Y = le_Y.times(new Coefficient(2));
+	Linear_Expression le_5Z = le_Z.times(new Coefficient(5));
+	Linear_Expression le_7
+	    = new Linear_Expression_Coefficient(new Coefficient(7));
+	Linear_Expression le_5
+	    = new Linear_Expression_Coefficient(new Coefficient(5));
+	Linear_Expression lhs1 = le_X.sum(le_2Y.sum(le_5Z));
+	NNC_Polyhedron ph1 = new NNC_Polyhedron(3,
+						Degenerate_Element.UNIVERSE);
+	ph1.add_constraint(new Constraint(lhs1,
+					 Relation_Symbol.GREATER_OR_EQUAL,
+					 le_7));
+	ph1.add_constraint(new Constraint(le_X, Relation_Symbol.LESS_THAN,
+					  le_5Z));
+	System.out.println(ph1.constraints().toString());
+	return new Boolean(true);
+    }
+
+    public static Boolean test02() {
+	// Test if `minimized_constraints' returns an empty Constraint_System
+	// if the Polyhedron is built from universe with a dimension greater
+	// than zero.
+	Variable X = new Variable(0);
+	Variable Y = new Variable(1);
+	Variable Z = new Variable(2);
+	NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+	Constraint_System cs = ph.minimized_constraints();
+	return new Boolean(cs.isEmpty());
+    }
+
+    public static void main(String[] args) {
+	boolean test_result_ok =
+	    Test_Executor.executeTests(NNC_Polyhedron_test1.class);
+	if (!test_result_ok)
+	    System.exit(1);
+	System.exit(0);
+    }
+
+}
diff --git a/interfaces/Java/tests/Test_Executor.java b/interfaces/Java/tests/Test_Executor.java
new file mode 100644
index 0000000..9f71e58
--- /dev/null
+++ b/interfaces/Java/tests/Test_Executor.java
@@ -0,0 +1,61 @@
+/* Test helper class of the Parma Polyhedra Library Java interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+import java.lang.reflect.Method;
+
+public class Test_Executor {
+
+    /*! \brief
+    Executes all the methods named `test****' that are implemented in
+    the class \p c. This class expects that the return value is a Boolean
+    and the test methods don't take parameters.
+
+    \return
+    <CODE>true</CODE> if and only if all the tests defined in the class
+    \p return <CODE>true</CODE>, otherwise returns <CODE>false</CODE>
+  */
+    public static boolean executeTests(Class c) {
+	Boolean single_test_result_ok;
+	Boolean global_test_result_ok = new Boolean(true);
+	System.out.println("Checking " + c.getName());
+	Method methods[] = c.getDeclaredMethods();
+	for (Method currentMethod:methods) {
+	    try {
+		if (currentMethod.getName().startsWith("test"))  {
+		    System.out.println("Executing " + currentMethod.getName());
+		    single_test_result_ok =
+			(Boolean) currentMethod.invoke(new Object(),
+						       new Object[0]);
+		    if (!single_test_result_ok) {
+			global_test_result_ok = new Boolean(false);
+			System.out.println(currentMethod.getName() + " failed");
+		    }
+		}
+	    }
+	    catch (Exception e) {
+ 		System.out.println("An unexpected exception has occured");
+		return new Boolean(false);
+	    }
+	}
+	return global_test_result_ok;
+    }
+}
\ No newline at end of file
diff --git a/interfaces/Java/tests/Test_Partial_Function.java b/interfaces/Java/tests/Test_Partial_Function.java
new file mode 100644
index 0000000..c9cfb11
--- /dev/null
+++ b/interfaces/Java/tests/Test_Partial_Function.java
@@ -0,0 +1,61 @@
+/* Test_Partial_Function Java class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+import java.util.TreeMap;
+import ppl_java.*;
+
+
+// This class implements the Partial_Function interface defined
+// in the ppl_java package.
+public class Test_Partial_Function implements Partial_Function {
+
+    private TreeMap<Long, Long> map;
+    private long max;
+
+    public Test_Partial_Function() {
+	map = new TreeMap<Long, Long>();
+	max  = 0;
+    }
+
+    public boolean maps(Long i, By_Reference<Long> j) {
+	if (map.containsKey(i)) {
+	    j.set(map.get(i));
+	    return true;
+	}
+        return false;
+    }
+
+    public long max_in_codomain() {
+	return max;
+    }
+
+    public boolean has_empty_codomain() {
+	return map.isEmpty();
+    }
+
+    void insert(long i, long j) {
+	map.put(i, j);
+	if (j > max)
+	    max = j;
+    }
+}
diff --git a/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4 b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
new file mode 100644
index 0000000..e9ed371
--- /dev/null
+++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
@@ -0,0 +1,121 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+dnl
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+m4_include(`ppl_interface_generator_java_test_java_code.m4')
+dnl
+dnl This file generates ppl_java_classes_test.java.
+m4_divert`'
+/* Java code for checking all classes.  -*- C++ -*-
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.Vector;
+import ppl_java.*;
+
+public class ppl_java_generated_tests {
+static {
+    try {
+        System.loadLibrary("ppl_java");
+ }
+
+   catch (UnsatisfiedLinkError  e) {
+  System.out.println("Unable to load the library");
+  System.exit(-1);
+ }
+}
+
+
+m4_include(`ppl_java_tests_common')`'dnl
+    public static void main(String[] args) {
+	ppl_java_generated_tests test1 = new ppl_java_generated_tests();
+	test1.initialize();
+	// Here generated stuff.
+m4_divert(1)`'dnl
+    }
+
+    // Here generated stuff.
+m4_divert(2)`'dnl
+}
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Declare test for each domain
+dnl ==================================================================
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+  m4_run_class_code,
+  m4_pattern_list)`'dnl
+')
+
+m4_pushdef(`m4_post_extra_class_code', `dnl
+')
+
+m4_pushdef(`m4_extension', `')
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_undivert(1)`'dnl
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Test all methods
+dnl ==================================================================
+
+m4_popdef(`m4_pre_extra_class_code')
+m4_popdef(`m4_post_extra_class_code')
+m4_popdef(`m4_extension')
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+  m4_run_class_test_code,
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_new_class_element_code,
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_more_new_class_element_code,
+  m4_pattern_list)`'dnl
+')
+m4_pushdef(`m4_post_extra_class_code', `dnl
+}
+catch (ppl_java.Overflow_Error_Exception e) {
+System.out.println("*Overflow detected*::exception caught");
+}
+return true;
+
+    }
+
+')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_undivert(2)`'dnl
diff --git a/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4 b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
new file mode 100644
index 0000000..c560b72
--- /dev/null
+++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
@@ -0,0 +1,280 @@
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_divert(-1)`'dnl
+m4_define(`m4_run_class_code',
+`	test1.run_ at CLASS@_test();`'dnl
+')
+
+m4_define(`m4_run_class_test_code',
+`
+    public boolean run_ at CLASS@_test() {
+  try {
+')
+
+m4_define(`m4_new_class_element_code',
+`
+    @TOPOLOGY@@CLASS@ @LTOPOLOGY@@LCLASS at 1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ @LTOPOLOGY@@LCLASS at 2 = new @TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 1);
+    @TOPOLOGY@@CLASS@ @LTOPOLOGY@@LCLASS at 3 = new @TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 1);
+    @LTOPOLOGY@@LCLASS at 3.free();
+    @TOPOLOGY@@CLASS@ @LTOPOLOGY@@LCLASS at 4 = new @TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 1);
+    @LTOPOLOGY@@LCLASS at 4 = null;
+    System.gc();
+')
+
+m4_define(`m4_more_new_class_element_code',
+`
+    if (("@FRIEND@" != "@TOPOLOGY@@CLASS@")) {
+       @FRIEND@ @LFRIEND at _@FRIEND at 1 = new @FRIEND@(@CONSTRAINER at s1);
+       @TOPOLOGY@@CLASS@ @LTOPOLOGY@@LCLASS at _@FRIEND at 2
+         = new @TOPOLOGY@@CLASS@(@LFRIEND at _@FRIEND at 1);
+    System.gc();
+    System.out.println(
+      "@TOPOLOGY@@CLASS@ @LTOPOLOGY@@LCLASS at _@FRIEND@");
+    System.out.println(
+      "   = new @TOPOLOGY@@CLASS@(@LFRIEND at _@FRIEND at 1) ok.");
+}
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',`
+boolean @LTOPOLOGY@@CLASS at 1_bounds_from_@ABOVEBELOW@ = @LTOPOLOGY@@LCLASS at 1.bounds_from_@ABOVEBELOW@(le);
+')
+
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code', `
+        if (@LTOPOLOGY@@LCLASS at 1.@HAS_PROPERTY@())
+           System.out.println(
+             "@HAS_PROPERTY@ is true for @LTOPOLOGY@@LCLASS at 1.");
+        else
+           System.out.println(
+             "@HAS_PROPERTY@ is false for @LTOPOLOGY@@LCLASS at 1.");
+
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code', `
+              System.out.println("The hashcode is: " + @LTOPOLOGY@@LCLASS at 1.hashCode());
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code', `
+        if (@LTOPOLOGY@@LCLASS at 1.@HAS_PROPERTY@())
+           System.out.println(
+             "@HAS_PROPERTY@ is true for @LTOPOLOGY@@LCLASS at 1.");
+        else
+           System.out.println(
+             "@HAS_PROPERTY@ is false for @LTOPOLOGY@@LCLASS at 1.");
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code', `
+           System.out.print("@DIMENSION@ of @LTOPOLOGY@@LCLASS at 1 = ");
+           System.out.println(@LTOPOLOGY@@LCLASS at 1.@DIMENSION@());
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',`
+ at LTOPOLOGY@@LCLASS at 1.@BINOP@(@LTOPOLOGY@@LCLASS at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',`
+boolean @LTOPOLOGY@@LCLASS at 1_@BINMINOP@
+  = @LTOPOLOGY@@LCLASS at 1.@BINMINOP@(@LTOPOLOGY@@LCLASS at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',`
+boolean @LTOPOLOGY@@LCLASS at 1_simplify_using_context_assign
+  = @LTOPOLOGY@@LCLASS at 1.simplify_using_context_assign(@LTOPOLOGY@@LCLASS at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code', `
+ at UGET_REPRESENT@_System @LTOPOLOGY@@LCLASS at 1_@GET_REPRESENT@
+  = @LTOPOLOGY@@LCLASS at 1.@GET_REPRESENT at s();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_@COMPARISON@
+  = @LTOPOLOGY@@LCLASS at 2.@COMPARISON@(@LTOPOLOGY@@LCLASS at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code', `
+ at LTOPOLOGY@@LCLASS at 1.@EXTRAPOLATION at _narrowing_assign(@LTOPOLOGY@@LCLASS at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code', `
+Poly_ at UALT_RELATION_REPRESENT@_Relation @LTOPOLOGY@@LCLASS at 1_@UALT_RELATION_REPRESENT at _Relation_with_@RELATION_REPRESENT@
+  = @LTOPOLOGY@@LCLASS at 1.relation_with(@RELATION_REPRESENT at 1);
+
+ ')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code', `
+ at LTOPOLOGY@@LCLASS at 1.add_@ADD_REPRESENT@(@ADD_REPRESENT at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code', `
+ at LTOPOLOGY@@LCLASS at 1.refine_with_@REFINE_REPRESENT@(@REFINE_REPRESENT at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code', `
+ at LTOPOLOGY@@LCLASS at 1.add_@ADD_REPRESENT at _and_minimize(@ADD_REPRESENT at 1);
+
+')
+
+ m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code', `
+
+ at LTOPOLOGY@@LCLASS at 1.add_@ADD_REPRESENT at s(@ADD_REPRESENT at s1);
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code', `
+
+ at LTOPOLOGY@@LCLASS at 1.refine_with_@REFINE_REPRESENT at s(@REFINE_REPRESENT at s1);
+
+ ')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_add_@ADD_REPRESENT at s_and_minimize
+  = @LTOPOLOGY@@LCLASS at 1.add_@ADD_REPRESENT at s_and_minimize(@ADD_REPRESENT at s1);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code', `
+ at LTOPOLOGY@@LCLASS at 1.@AFFIMAGE@(var, le, coeff1);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code', `
+ at LTOPOLOGY@@LCLASS at 1.generalized_@AFFIMAGE@(le, Relation_Symbol.EQUAL , le);
+
+')
+
+ m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code', `
+boolean @LTOPOLOGY@@LCLASS at 1_@UB_EXACT@
+  = @LTOPOLOGY@@LCLASS at 1.@UB_EXACT@(@LTOPOLOGY@@LCLASS at 1);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code', `
+ at LTOPOLOGY@@LCLASS at 1.generalized_@AFFIMAGE at _with_congruence(var,
+                                                    Relation_Symbol.EQUAL,
+						    le, coeff1, coeff1);
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code', `
+ at LTOPOLOGY@@LCLASS at 1.generalized_@AFFIMAGE at _lhs_rhs_with_congruence(le,
+                                                    Relation_Symbol.EQUAL,
+						    le, coeff1);
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_equals
+  = @LTOPOLOGY@@LCLASS at 1.equals(@LTOPOLOGY@@LCLASS at 1);
+
+if (!@LTOPOLOGY@@LCLASS at 1.equals(new Object()))
+   System.out.println("A generic object is not equal to @LTOPOLOGY@@LCLASS at 1");
+')
+
+m4_define(`ppl_ at CLASS@_OK_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_OK
+  = @LTOPOLOGY@@LCLASS at 1.OK();
+
+')
+
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code', `
+ at LTOPOLOGY@@LCLASS at 1.bounded_@AFFIMAGE@(var, le, le, coeff1);
+
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',`
+ at LTOPOLOGY@@LCLASS at 1.@SIMPLIFY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_1unconstrain_space_dimension_code',`
+ at LTOPOLOGY@@LCLASS at 1.1unconstrain_space_dimension(var);
+
+')
+
+m4_define(`__ppl_ at CLASS@_1unconstrain_space_dimensions_code',`
+ at LTOPOLOGY@@LCLASS at 1.1unconstrain_space_dimensions(var_set);
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_constrains
+  = @LTOPOLOGY@@LCLASS at 1.constrains(var);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_@MAXMIN@
+  = @LTOPOLOGY@@LCLASS at 1.@MAXMIN@(le, coeff0, coeff1, bool_by_ref1);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code', `
+boolean @LTOPOLOGY@@LCLASS at 1_@MAXMIN at _with_point
+  = @LTOPOLOGY@@LCLASS at 1.@MAXMIN@(le, coeff0, coeff1, bool_by_ref1, generator1);
+
+');
+
+m4_define(`ppl_ at CLASS@_string_code', `
+System.out.println(@LTOPOLOGY@@LCLASS at 1.toString());
+
+');
+
+m4_define(`ppl_ at CLASS@_string_code', `
+System.out.println(@LTOPOLOGY@@LCLASS at 1.toString());
+
+');
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code', `
+System.out.print("@UMEMBYTES@ of @LTOPOLOGY@@LCLASS at 1: ");
+System.out.println(@LTOPOLOGY@@LCLASS at 1.@MEMBYTES@());
+
+');
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code', `
+System.out.println(@LTOPOLOGY@@LCLASS at 1.ascii_dump());
+
+');
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code', `
+ at CLASSTOPOLOGY@@CPP_DISJUNCT@ @LCLASSTOPOLOGY@@LCPP_DISJUNCT at 1 = new @CLASSTOPOLOGY@@CPP_DISJUNCT@(constraints1);
+Pair p =  @CLASS at .@PARTITION@(@LCLASSTOPOLOGY@@LCPP_DISJUNCT at 1, @LCLASSTOPOLOGY@@LCPP_DISJUNCT at 1);
+System.out.println("Printing Pair from @PARTITION@");
+System.out.println(p.getFirst());
+System.out.println(p.getSecond());
+
+');
+
+m4_divert`'dnl
diff --git a/interfaces/Java/tests/ppl_java_tests_common b/interfaces/Java/tests/ppl_java_tests_common
new file mode 100644
index 0000000..4b55242
--- /dev/null
+++ b/interfaces/Java/tests/ppl_java_tests_common
@@ -0,0 +1,113 @@
+
+    // Common stuff. We can add other object if we need them later.
+    Constraint_System constraints1;
+    Congruence_System congruences1;
+    Constraint_System constraints2;
+    Generator_System generators1;
+    Grid_Generator_System grid_generators1;
+    Constraint constraint1;
+    Generator generator1;
+    Grid_Generator grid_generator1;
+    Congruence congruence1;
+    Variable var;
+    Variables_Set var_set;
+    Linear_Expression le;
+    By_Reference<Boolean> bool_by_ref1;
+    Coefficient coeff0;
+    Coefficient coeff1;
+    // This ones builds Constraint_System and so on, and is common for
+    // all the tests.
+    public void initialize() {
+	// Variable declarations.
+	Variable A = new Variable(0);
+	Variable B = new Variable(1);
+	Variable C = new Variable(2);
+	var = C;
+        var_set = new Variables_Set();
+        var_set.add(A);
+
+	// Coefficient declaration.
+	coeff0 = new Coefficient("0");
+	coeff1 = new Coefficient("5");
+
+	// Linear_Expression declarations.
+	Linear_Expression le1 = new Linear_Expression_Variable(A);
+	Linear_Expression le2 = new Linear_Expression_Variable(C);
+	Linear_Expression le3 = new Linear_Expression_Coefficient(coeff1);
+	Linear_Expression le4 = le1.times(new Coefficient(3));
+	le2 = le2.sum(le4);
+	le = le1;
+	System.out.print("Printing a linear expression: ");
+        System.out.println(le2.toString());
+	// Constraint declarations.
+	Constraint c1 = new Constraint(new Linear_Expression_Coefficient(coeff1) , Relation_Symbol.GREATER_OR_EQUAL, new Linear_Expression_Coefficient(coeff0));
+	constraint1 = c1;
+	Constraint c2 = new Constraint(le2, Relation_Symbol.EQUAL, le3);
+	Congruence cg1 = new Congruence(le2, le3, coeff0);
+	System.out.print("Printing a congruence: ");
+        System.out.println(cg1.toString());
+	congruence1 = cg1;
+	Congruence cg2 = new Congruence(le2, le3, coeff0);
+	Constraint c3 = new Constraint(le2,
+				       Relation_Symbol.GREATER_OR_EQUAL,
+				       le4);
+	Constraint c4 = new Constraint(le2,
+				       Relation_Symbol.GREATER_OR_EQUAL,
+				       le3);
+	System.out.print("Printing a constraint: ");
+	System.out.println(c4.toString());
+
+	// Constraint_System declarations.
+	constraints1 = new Constraint_System();
+	constraints1.add(c1);
+	constraints1.add(c2);
+	System.out.print("Printing a constraint system :");
+	System.out.println(constraints1.toString());
+	congruences1 = new Congruence_System();
+	congruences1.add(cg1);
+	congruences1.add(cg2);
+	System.out.println("Printing a congruence system: ");
+	System.out.println(congruences1.toString());
+	constraints2 = new Constraint_System();
+	constraints2.add(c3);
+	constraints2.add(c4);
+
+	le2 = le2.times(new Coefficient("10"));
+
+	// Generator declarations.
+	Generator g1 = Generator.point(le2, new Coefficient(1));
+	System.out.println("Printing a generator:");
+	System.out.println(g1.toString());
+	generator1 = g1;
+	Generator g2 = Generator.point(le2, new Coefficient(2));
+        Generator g3 = Generator.point(le2, new Coefficient(3));
+	Generator g4 = Generator.point(le1, new Coefficient(4));
+
+        // Generator_System declaration.
+        generators1 = new Generator_System();
+        generators1.add(g1);
+        generators1.add(g2);
+        generators1.add(g3);
+        generators1.add(g4);
+	System.out.println("Printing a generator system: ");
+	System.out.println(generators1.toString());
+
+	// Grid_Generator declarations.
+	Grid_Generator gg1
+                = Grid_Generator.grid_point(le2, new Coefficient(1));
+	grid_generator1 = gg1;
+	Grid_Generator gg2
+                = Grid_Generator.grid_point(le2, new Coefficient(2));
+        Grid_Generator gg3
+                = Grid_Generator.grid_point(le2, new Coefficient(3));
+	Grid_Generator gg4
+                = Grid_Generator.grid_point(le1, new Coefficient(4));
+
+	// Grid_Generator_System declaration.
+	grid_generators1 = new Grid_Generator_System();
+	grid_generators1.add(gg1);
+	grid_generators1.add(gg2);
+	grid_generators1.add(gg3);
+	grid_generators1.add(gg4);
+        bool_by_ref1 = new By_Reference<Boolean>(true);
+}
diff --git a/interfaces/Makefile.am b/interfaces/Makefile.am
index e133934..4ec3e03 100644
--- a/interfaces/Makefile.am
+++ b/interfaces/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,4 +20,29 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-SUBDIRS = C Prolog
+SUBDIRS = . C Java OCaml Prolog
+
+REQUIRED_INSTANTIATIONS = \
+ at required_instantiations@
+
+REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \
+ at required_instantiations_canonical_names@
+
+BUILT_SOURCES = ppl_interface_instantiations.m4
+
+ppl_interface_instantiations.m4:
+	echo "m4_define(\`m4_interface_classes_names', \`$(REQUIRED_INSTANTIATIONS_CANONICAL_NAMES)')" > $@
+	echo "m4_define(\`m4_cplusplus_classes_names', \`$(REQUIRED_INSTANTIATIONS)')" >> $@
+
+noinst_HEADERS = \
+interfaced_boxes.hh \
+marked_pointers.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_common.m4 \
+ppl_interface_generator_common_dat.m4 \
+ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_copyright
+
+DISTCLEANFILES = \
+ppl_interface_instantiations.m4
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
index 4c864c6..34c0cf3 100644
--- a/interfaces/Makefile.in
+++ b/interfaces/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,12 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
+
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -58,9 +55,11 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = interfaces
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -70,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -82,48 +91,31 @@ SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -133,53 +125,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -188,56 +178,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -249,10 +213,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -261,27 +229,66 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-SUBDIRS = C Prolog
-all: all-recursive
+SUBDIRS = . C Java OCaml Prolog
+REQUIRED_INSTANTIATIONS = \
+ at required_instantiations@
+
+REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \
+ at required_instantiations_canonical_names@
+
+BUILT_SOURCES = ppl_interface_instantiations.m4
+noinst_HEADERS = \
+interfaced_boxes.hh \
+marked_pointers.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_common.m4 \
+ppl_interface_generator_common_dat.m4 \
+ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_copyright
+
+DISTCLEANFILES = \
+ppl_interface_instantiations.m4
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
@@ -320,10 +327,6 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -355,8 +358,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -400,8 +402,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -426,8 +428,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -437,13 +439,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -457,22 +458,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -486,7 +486,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -494,16 +494,20 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
 	done
 check-am: all-am
-check: check-recursive
-all-am: Makefile
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(HEADERS)
 installdirs: installdirs-recursive
 installdirs-am:
-install: install-recursive
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
 install-exec: install-exec-recursive
 install-data: install-data-recursive
 uninstall: uninstall-recursive
@@ -523,18 +527,19 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-recursive
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-recursive
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
+distclean-am: clean-am distclean-generic distclean-tags
 
 dvi: dvi-recursive
 
@@ -548,12 +553,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am:
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -572,23 +585,29 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-generic clean-libtool clean-recursive ctags \
-	ctags-recursive distclean distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic maintainer-clean-recursive \
-	mostlyclean mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am
+
 
+ppl_interface_instantiations.m4:
+	echo "m4_define(\`m4_interface_classes_names', \`$(REQUIRED_INSTANTIATIONS_CANONICAL_NAMES)')" > $@
+	echo "m4_define(\`m4_cplusplus_classes_names', \`$(REQUIRED_INSTANTIATIONS)')" >> $@
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/OCaml/Makefile.am b/interfaces/OCaml/Makefile.am
new file mode 100644
index 0000000..bf2aef2
--- /dev/null
+++ b/interfaces/OCaml/Makefile.am
@@ -0,0 +1,147 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = . tests
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_cc.m4 \
+ppl_interface_generator_ocaml_cc_code.m4 \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4
+
+ml_source_files = \
+ppl_ocaml_globals.ml \
+ppl_ocaml_types.ml
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(ml_source_files) \
+ppl_ocaml_globals.cc \
+OCaml_interface.dox
+
+
+if BUILD_OCAML_INTERFACE
+
+ocamldir = $(pkglibdir)
+
+ocaml_DATA = \
+libppl_ocaml.a \
+ppl_ocaml.cma \
+ppl_ocaml.cmi \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_types.cmi
+
+noinst_LIBRARIES = libppl_ocaml.a
+
+nodist_libppl_ocaml_a_SOURCES = \
+ppl_ocaml.cc
+
+OCAMLC_COMPILE_FLAGS = \
+-I +gmp -I $(srcdir) -I .. \
+-ccopt -g
+
+OCAMLC_LINK_FLAGS = \
+`echo " -L$(top_builddir)/src/.libs -lppl $(extra_libraries) " | sed -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLC_ROOT = @ocamlc_root@
+
+AM_CPPFLAGS = \
+-I$(OCAMLC_ROOT) \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+ppl_ocaml.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_ocaml_cc.m4 > $@
+
+ppl_ocaml.cma: ppl_ocaml_types.cmo ppl_ocaml_globals.cmo ppl_ocaml.cmo
+	ocamlc -o $@ -a -custom \
+		ppl_ocaml_types.cmo ppl_ocaml_globals.cmo ppl_ocaml.cmo \
+		$(OCAMLC_COMPILE_FLAGS) -cclib -lppl_ocaml \
+		$(OCAMLC_LINK_FLAGS)
+
+ppl_ocaml.cmo: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_types.cmi
+	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.ml
+
+ppl_ocaml.cmi: ppl_ocaml.mli
+	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) $<
+
+ppl_ocaml_globals.cmo: ppl_ocaml_globals.ml ppl_ocaml_types.cmi
+	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) \
+		$(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.cmi: ppl_ocaml_globals.cmo
+	@if test -f $@; then :; else \
+		rm -f ppl_ocaml_globals.cmo; \
+		$(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_globals.cmo; \
+	fi
+
+ppl_ocaml_types.cmo: ppl_ocaml_types.ml
+	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) \
+		$(srcdir)/ppl_ocaml_types.ml
+
+ppl_ocaml_types.cmi: ppl_ocaml_types.cmo
+	@if test -f $@; then :; else \
+		rm -f ppl_ocaml_types.cmo; \
+		$(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_types.cmo; \
+	fi
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4 \
+ppl_interface_generator_ocaml_cc.m4 \
+ppl_interface_generator_ocaml_cc_code.m4
+
+ppl_ocaml.ml: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_ocaml_ml.m4 > $@
+
+ppl_ocaml.mli: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_ocaml_mli.m4 > $@
+
+endif BUILD_OCAML_INTERFACE
+
+CLEANFILES = \
+ppl_ocaml.cc \
+ppl_ocaml.cma \
+ppl_ocaml.cmi \
+ppl_ocaml.cmo \
+ppl_ocaml.ml \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_globals.cmo \
+ppl_ocaml_types.cmi \
+ppl_ocaml_types.cmo
diff --git a/interfaces/OCaml/Makefile.in b/interfaces/OCaml/Makefile.in
new file mode 100644
index 0000000..55f3cef
--- /dev/null
+++ b/interfaces/OCaml/Makefile.in
@@ -0,0 +1,791 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/OCaml
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libppl_ocaml_a_AR = $(AR) $(ARFLAGS)
+libppl_ocaml_a_LIBADD =
+ at BUILD_OCAML_INTERFACE_TRUE@nodist_libppl_ocaml_a_OBJECTS =  \
+ at BUILD_OCAML_INTERFACE_TRUE@	ppl_ocaml.$(OBJEXT)
+libppl_ocaml_a_OBJECTS = $(nodist_libppl_ocaml_a_OBJECTS)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(nodist_libppl_ocaml_a_SOURCES)
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(ocamldir)"
+ocamlDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(ocaml_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = . tests
+interface_generator_files = \
+ppl_interface_generator_ocaml_cc.m4 \
+ppl_interface_generator_ocaml_cc_code.m4 \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4
+
+ml_source_files = \
+ppl_ocaml_globals.ml \
+ppl_ocaml_types.ml
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(ml_source_files) \
+ppl_ocaml_globals.cc \
+OCaml_interface.dox
+
+ at BUILD_OCAML_INTERFACE_TRUE@ocamldir = $(pkglibdir)
+ at BUILD_OCAML_INTERFACE_TRUE@ocaml_DATA = \
+ at BUILD_OCAML_INTERFACE_TRUE@libppl_ocaml.a \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cma \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cmi \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.mli \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_globals.cmi \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_types.cmi
+
+ at BUILD_OCAML_INTERFACE_TRUE@noinst_LIBRARIES = libppl_ocaml.a
+ at BUILD_OCAML_INTERFACE_TRUE@nodist_libppl_ocaml_a_SOURCES = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cc
+
+ at BUILD_OCAML_INTERFACE_TRUE@OCAMLC_COMPILE_FLAGS = \
+ at BUILD_OCAML_INTERFACE_TRUE@-I +gmp -I $(srcdir) -I .. \
+ at BUILD_OCAML_INTERFACE_TRUE@-ccopt -g
+
+ at BUILD_OCAML_INTERFACE_TRUE@OCAMLC_LINK_FLAGS = \
+ at BUILD_OCAML_INTERFACE_TRUE@`echo " -L$(top_builddir)/src/.libs -lppl $(extra_libraries) " | sed -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+ at BUILD_OCAML_INTERFACE_TRUE@OCAMLC_ROOT = @ocamlc_root@
+ at BUILD_OCAML_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_OCAML_INTERFACE_TRUE@-I$(OCAMLC_ROOT) \
+ at BUILD_OCAML_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_OCAML_INTERFACE_TRUE@-I$(top_srcdir)/src \
+ at BUILD_OCAML_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_OCAML_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_OCAML_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../ppl_interface_generator_common.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../ppl_interface_generator_common_dat.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../ppl_interface_generator_copyright \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_procedure_generators.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_ml.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_ml_code.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_mli.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_mli_code.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_cc.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_cc_code.m4
+
+CLEANFILES = \
+ppl_ocaml.cc \
+ppl_ocaml.cma \
+ppl_ocaml.cmi \
+ppl_ocaml.cmo \
+ppl_ocaml.ml \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_globals.cmo \
+ppl_ocaml_types.cmi \
+ppl_ocaml_types.cmo
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/OCaml/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/OCaml/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libppl_ocaml.a: $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_DEPENDENCIES) 
+	-rm -f libppl_ocaml.a
+	$(libppl_ocaml_a_AR) libppl_ocaml.a $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_LIBADD)
+	$(RANLIB) libppl_ocaml.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-ocamlDATA: $(ocaml_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(ocamldir)" || $(MKDIR_P) "$(DESTDIR)$(ocamldir)"
+	@list='$(ocaml_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(ocamlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(ocamldir)/$$f'"; \
+	  $(ocamlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(ocamldir)/$$f"; \
+	done
+
+uninstall-ocamlDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(ocaml_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(ocamldir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(ocamldir)/$$f"; \
+	done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(LIBRARIES) $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(ocamldir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-ocamlDATA
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-ocamlDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	clean-noinstLIBRARIES ctags ctags-recursive distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-ocamlDATA install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-ocamlDATA
+
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cc: $(interface_generator_dependencies)
+ at BUILD_OCAML_INTERFACE_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_OCAML_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_ocaml_cc.m4 > $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cma: ppl_ocaml_types.cmo ppl_ocaml_globals.cmo ppl_ocaml.cmo
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -a -custom \
+ at BUILD_OCAML_INTERFACE_TRUE@		ppl_ocaml_types.cmo ppl_ocaml_globals.cmo ppl_ocaml.cmo \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(OCAMLC_COMPILE_FLAGS) -cclib -lppl_ocaml \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(OCAMLC_LINK_FLAGS)
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cmo: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_types.cmi
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.ml
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.cmi: ppl_ocaml.mli
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) $<
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_globals.cmo: ppl_ocaml_globals.ml ppl_ocaml_types.cmi
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(srcdir)/ppl_ocaml_globals.ml
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_globals.cmi: ppl_ocaml_globals.cmo
+ at BUILD_OCAML_INTERFACE_TRUE@	@if test -f $@; then :; else \
+ at BUILD_OCAML_INTERFACE_TRUE@		rm -f ppl_ocaml_globals.cmo; \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_globals.cmo; \
+ at BUILD_OCAML_INTERFACE_TRUE@	fi
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_types.cmo: ppl_ocaml_types.ml
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(srcdir)/ppl_ocaml_types.ml
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_types.cmi: ppl_ocaml_types.cmo
+ at BUILD_OCAML_INTERFACE_TRUE@	@if test -f $@; then :; else \
+ at BUILD_OCAML_INTERFACE_TRUE@		rm -f ppl_ocaml_types.cmo; \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_types.cmo; \
+ at BUILD_OCAML_INTERFACE_TRUE@	fi
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.ml: $(interface_generator_dependencies)
+ at BUILD_OCAML_INTERFACE_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_OCAML_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_ocaml_ml.m4 > $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml.mli: $(interface_generator_dependencies)
+ at BUILD_OCAML_INTERFACE_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_OCAML_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_ocaml_mli.m4 > $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/OCaml_interface.dox b/interfaces/OCaml/OCaml_interface.dox
new file mode 100644
index 0000000..3dd0954
--- /dev/null
+++ b/interfaces/OCaml/OCaml_interface.dox
@@ -0,0 +1,2044 @@
+/* Documentation for the OCaml interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \mainpage OCaml Language Interface
+
+The Parma Polyhedra Library comes equipped with an interface for the
+OCaml language.
+
+The system-independent features of the library are described in
+Section \ref PI_SI_Features "System-Independent Features".
+Section \ref OI_Compilation "Compilation and Installation"
+explains how the various incarnations of the Prolog interface
+are compiled and installed.
+Section \ref PI_SD_Features "System-Dependent Features"
+illustrates the system-dependent features of the interface
+for all the supported systems.
+
+In the sequel, <CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+
+\anchor PI_SI_Features
+<H1>System-Independent Features</H1>
+
+The OCaml interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in Sections
+\extref{preamble, The Main Features}, \extref{convex_polys, Convex Polyhedra},
+\extref{representation, Representations of Convex Polyhedra}
+and \extref{Operations_on_Convex_Polyhedra, Operations on Convex Polyhedra}
+in the main PPL user manual.
+Here we just describe those aspects that are specific to the OCaml interface.
+
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- The Prolog interface files are all installed in the directory
+  <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+  dynamically loaded libraries, you must make your dynamic
+  linker/loader aware of this fact.  If you use a GNU/Linux system,
+  try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+  for more information.
+- The Prolog interface to the PPL is initialized and finalized by the
+  predicates <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>.
+  Thus the only interface predicates callable after
+  <CODE>ppl_finalize/0</CODE> are <CODE>ppl_finalize/0</CODE> itself
+  (this further call has no effect) and <CODE>ppl_initialize/0</CODE>,
+  after which the interface's services are usable again.
+  Some Prolog systems allow the specification of initialization
+  and deinitialization functions in their foreign language interfaces.
+  The corresponding incarnations of the PPL-Prolog interface
+  have been written so that <CODE>ppl_initialize/0</CODE> and/or
+  <CODE>ppl_finalize/0</CODE> are called automatically.
+  Section \ref PI_SD_Features "System-Dependent Features" will detail
+  in which cases initialization and finalization is automatically
+  performed or is left to the Prolog programmer's responsibility.
+  However, for portable applications, it is best
+  to invoke <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>
+  explicitly: since they can be called multiple times without problems,
+  this will result in enhanced portability at a cost that is, by all means,
+  negligible.
+
+- A PPL polyhedron can only be accessed by means of a Prolog term
+  called a <EM>handle</EM>.
+  Note, however, that the data structure of a handle,
+  is implementation-dependent, system-dependent and
+  version-dependent, and, for this reason, deliberately left unspecified.
+  What we do guarantee is that the handle requires very little memory.
+
+- A Prolog term can be bound to a valid handle by using
+  predicates such as
+\code
+  ppl_new_C_Polyhedron_from_space_dimension/3,
+  ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+  ppl_new_C_Polyhedron_from_constraints/2,
+  ppl_new_C_Polyhedron_from_generators/2,
+  ppl_new_C_Polyhedron_from_bounding_box/2.
+\endcode
+  These predicates will create or copy a PPL polyhedron
+  and construct a valid handle for referencing it.
+  The last argument is a Prolog term that is
+  unified with a new valid handle for accessing this polyhedron.
+
+- As soon as a PPL polyhedron is no longer required,
+  the memory occupied by it should be released
+  using the PPL predicate <CODE>ppl_delete_Polyhedron/1</CODE>.
+  To understand why this is important,
+  consider a Prolog program and a variable that is bound to
+  a Herbrand term.
+  When the variable dies (goes out of scope) or is uninstantiated
+  (on backtracking) the term it is bound to is amenable to garbage collection.
+  But this only applies for the standard domain of the language:
+  Herbrand terms.
+  In Prolog+PPL, when a variable bound to a handle for a PPL Polyhedron dies
+  or is uninstantiated,
+  the handle can be garbage-collected, but the polyhedra to which
+  the handle refers will not be released.
+  Once a handle has been used as an argument in
+  <CODE>ppl_delete_Polyhedron/1</CODE>,
+  it becomes invalid.
+
+- For a PPL polyhedron with space dimension \p k,
+  the identifiers used for the PPL variables
+  must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+  associated Cartesian axes.
+  When using the predicates that combine PPL polyhedra
+  or add constraints or generators to a representation of
+  a PPL polyhedron,
+  the polyhedra referenced and any constraints or generators in the call
+  should follow all the (space) dimension-compatibility rules stated in
+  Section \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+
+- As explained above, a polyhedron has a fixed topology C or NNC,
+  that is determined at the time of its initialization.
+  All subsequent operations on the polyhedron must respect all the
+  topological compatibility rules stated in Section
+  \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+
+- Any application using the PPL should make sure that only the
+  intended version(s) of the library are ever used.
+  Predicates
+\code
+  ppl_version_major/1,
+  ppl_version_minor/1,
+  ppl_version_revision/1,
+  ppl_version_beta/1,
+  ppl_version/1,
+  ppl_banner.
+\endcode
+  allow run-time checking of information about the version being used.
+
+<H2>PPL Predicate List</H2>
+
+Here is a list of all the PPL predicates provided by the Prolog interface.
+
+<CODE>
+  ppl_version_major(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_minor(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_revision(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_beta(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version(?Atom)
+</CODE>
+
+<CODE>
+  ppl_banner(?Atom)
+</CODE>
+
+<CODE>
+  ppl_max_space_dimension(?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Coefficient_is_bounded
+</CODE>
+
+<CODE>
+  ppl_Coefficient_max(?Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Coefficient_min(?Coefficient)
+</CODE>
+
+<CODE>
+  ppl_initialize
+</CODE>
+
+<CODE>
+  ppl_finalize
+</CODE>
+
+<CODE>
+  ppl_set_timeout_exception_atom(+Atom)
+</CODE>
+
+<CODE>
+  ppl_set_timeout(+C_unsigned)
+</CODE>
+
+<CODE>
+  ppl_reset_timeout
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_delete_Polyhedron(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_minimized_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_minimized_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, -Relation)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_relation_with_generator(+Handle, +Generator, -Relation)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_bounding_box(+Handle, +Complexity, -Box)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_empty(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_universe(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_bounded(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_contains_integer_point(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr,
+                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr,
+                                     ?Coefficient_1, ?Coefficient_2,
+                                     ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr,
+                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr,
+                                     ?Coefficient_1, ?Coefficient_2,
+                                     ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_topologically_closed(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_OK(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generator(+Handle, +Generator)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraints_and_minimize(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generators(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generators_and_minimize(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_affine_image(+Handle,
+                                      +PPL_Var,
+                                      +Lin_Expr_1,
+                                      +Lin_Expr_2,
+                                      +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_generalized_affine_image(+Handle,
+					  +PPL_Var,
+					  +Relation_Symbol,
+					  +Lin_Expr,
+					  +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+						  +Lin_Expr_1,
+						  +Relation_Symbol,
+						  +Lin_Expr_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2,
+					+C_unsigned_1, ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+                                                     +Handle_2,
+						     +Constraint_System,
+						     +C_unsigned_1,
+						     ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+						     +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+                                                     +Handle_2,
+						     +Constraint_System,
+						     +C_unsigned_1,
+						     ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+						     +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2,
+						+C_unsigned_1,
+						?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1,
+                                                  +Handle_2,
+						  +Constraint_System,
+						   +C_unsigned_1,
+						   ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2,
+						  +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1,
+                                                  +Handle_2,
+						  +Constraint_System,
+						  +C_unsigned_1,
+						  ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2,
+						  +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_topological_closure_assign(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func))
+</CODE>
+
+<CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                      -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_MIP_Problem_from_MIP_Problem(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, -Vars_List)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_feasible_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_optimizing_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                              ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE>
+
+
+<H2>PPL Predicate Specifications</H2>
+
+The PPL predicates provided by the Prolog interface are specified below.
+The specification uses the following grammar rules:
+\code
+
+ Number      --> unsigned integer	ranging from 0 to an upper bound
+					depending on the actual Prolog system.
+
+ C_int       --> Number | - Number	C integer
+
+ C_unsigned  --> Number			C unsigned integer
+
+ Coefficient --> Number			used in linear expressions;
+					the upper bound will depend on how
+					the PPL has been configured
+
+ Dimension_Type
+             --> Number			used for the number of affine and
+					space dimensions and the names of
+ 					the dimensions;
+					the upper bound will depend on
+					the maximum number of dimensions
+					allowed by the PPL
+					(see ppl_max_space_dimensions/1)
+
+ Boolean     --> true | false
+
+ Handle      --> Prolog term		used to identify a Polyhedron
+
+ Topology    --> c | nnc		Polyhedral kind;
+					c is closed and nnc is NNC
+
+ VarId       --> Dimension_Type 	variable identifier
+
+ PPL_Var     --> '$VAR'(VarId)		PPL variable
+
+ Lin_Expr    --> PPL_Var		PPL variable
+            | Coefficient
+            | Lin_Expr			unary plus
+            | - Lin_Expr		unary minus
+            | Lin_Expr + Lin_Expr	addition
+            | Lin_Expr - Lin_Expr	subtraction
+            | Coefficient * Lin_Expr	multiplication
+            | Lin_Expr * Coefficient	multiplication
+
+ Relation_Symbol
+	     --> =			equals
+            | =< 			less than or equal
+            | >=			greater than or equal
+            | < 			strictly less than
+            | > 			strictly greater than
+
+ Constraint  --> Lin_Expr Relation_Symbol Lin_Expr
+					constraint
+
+ Constraint_System			list of constraints
+             --> []
+            | [Constraint | Constraint_System]
+
+ Generator_Denominator --> Coefficient	must be non-zero
+	    | Coefficient
+            | - Coefficient
+
+ Generator   --> point(Lin_Expr)	point
+            | point(Lin_Expr, Generator_Denominator)
+					point
+            | closure_point(Lin_Expr)	closure point
+            | closure_point(Lin_Expr, Generator_Denominator)
+					closure point
+            | ray(Lin_Expr)		ray
+            | line(Lin_Expr)		line
+
+ Generator_System			list of generators
+             --> []
+	    | [Generator | Generator_System]
+
+ Atom        --> Prolog atom
+
+ Universe_or_Empty			polyhedron
+             --> universe
+            | empty
+
+ Poly_Relation				polyhedron relation:
+             --> is_disjoint		with a constraint
+	    | strictly_intersects	with a constraint
+	    | is_included		with a constraint
+	    | saturates			with a constraint
+            | subsumes			with a generator
+
+ Poly_Relation_List			list of polyhedron relations
+	     --> []
+	    | [Poly_Relation | Poly_Relation_List]
+
+ Complexity  --> polynomial | simplex | any
+
+ Rational_Numerator
+	     --> Coefficient | - Coefficient
+
+ Rational_Denominator
+	     --> Coefficient		must be non-zero
+
+ Rational    --> Rational_Numerator	rational number
+	    | Rational_Numerator/Rational_Denominator
+
+ Bound       --> c(Rational)		closed rational limit
+            | o(Rational)		open rational limit
+            | o(pinf)			unbounded in the positive direction
+            | o(minf)			unbounded in the negative direction
+
+ Interval    --> i(Bound, Bound)	rational interval
+
+ Box         --> []			list of intervals
+            | [Interval | Box]
+
+ Vars_Pair   --> PPLVar - PPLVar        map relation
+
+ P_Func      --> []    			list of map relations
+            | [Vars_Pair | P_Func].
+
+ Optimization_Mode
+             --> max | min
+
+ MIP_Problem_Status
+             --> unfeasible | unbounded | optimized
+
+ Vars_List   --> []    			list of PPL variables
+            | [PPL_Var | Vars_List].
+\endcode
+
+\anchor predicates
+Below is a short description of each of the interface predicates.
+For full definitions of terminology used here, see Sections
+\extref{preamble, The Main Features},
+\extref{convex_polys, Convex Polyhedra},
+\extref{representation, Representations of Convex Polyhedra} and
+\extref{Operations_on_Convex_Polyhedra, Operations on Convex Polyhedra}
+in the main PPL user manual.
+
+
+<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the revision number
+  of the PPL version.
+
+<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+
+<H2><CODE> ppl_version(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with the PPL version.
+
+<H2><CODE> ppl_banner(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with
+  information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+
+  Succeeds if and only if the Coefficients in the C++ interface are bounded.
+
+<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the maximum coefficient the C++ interface can handle is
+  unified with <CODE>Max</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the minimum coefficient the C++ interface can handle is
+  unified with <CODE>Min</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+
+  Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+  this library can handle.
+
+<H2><CODE>
+  ppl_initialize
+ </CODE></H2>
+
+  Initializes the PPL interface.
+  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+
+<H2><CODE>
+  ppl_finalize
+ </CODE></H2>
+
+  Finalizes the PPL interface.
+  Once this is executed, the next call to an interface predicate must
+  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.
+
+<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+
+   Sets the atom to be thrown by timeout exceptions
+   to <CODE>Atom</CODE>.
+   The default value is <CODE>time_out</CODE>.
+
+<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+
+   The atom to be thrown by timeout exceptions
+   is unified with <CODE>Atom</CODE>.
+
+<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+
+   Computations taking exponential time will be interrupted
+   some time after <CODE>C_unsigned</CODE> ms after that call.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>C_unsigned</CODE> must be strictly greater than zero.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+
+   Resets the timeout time so that the computation is not interrupted.
+
+<H2><CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates a C polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X).
+\endcode
+   creates the C polyhedron defining the 3-dimensional vector space
+   \f$\Rset^3\f$ with \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates an NNC polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$ with
+   \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as a C polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X),
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron(X, Y).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$
+   referenced by \p X
+   and then makes a copy, converting the topology to a C polyhedron.
+   with \p Y bound to a valid handle for accessing it.
+
+   When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+   care must be taken that the source polyhedron referenced by
+   <CODE>Handle_1</CODE> is topologically closed.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as an NNC polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   There must be no bounds of the form <CODE>o(Rational)</CODE>
+   in an interval in <CODE>Box</CODE>.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE> ppl_Polyhedron_swap(+Handle_1, +Handle_2) </CODE></H2>
+
+   Swaps the polyhedron referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+   The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
+
+   Deletes the polyhedron referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
+
+<H2><CODE> ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   polyhedron referenced by
+   <CODE>Handle</CODE> is embedded with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the actual dimension of the polyhedron referenced by
+   <CODE>Handle</CODE> with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_constraints(+Handle,
+                                                   ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a minimized list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_generators(+Handle, ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_generators(+Handle,
+                                                  ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a minimized list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint,
+               ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Constraint</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in Section
+\extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator(+Handle, +Generator,
+               ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Generator</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in
+Section \extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_get_bounding_box(+Handle,
+                                          +Complexity,
+            	                          ?Box) </CODE></H2>
+
+   Succeeds if and only if the bounding box
+   of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   unifies with the box defined by <CODE>Box</CODE>.
+   E.g.,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box).
+
+   Box = [i(o(minf), c(1/2)), i(o(0), o(pinf))].
+\endcode
+Note that the rational numbers in <CODE>Box</CODE> are in canonical form.
+E.g., the following will fail:
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box),
+      Box = [i(o(minf), c(2/4)), i(o(0), o(pinf))].
+\endcode
+
+The complexity class <CODE>Complexity</CODE> determining the algorithm
+to be used has the following meaning:
+- <CODE>polynomial</CODE> allows
+  code of the worst-case polynomial complexity class;
+- <CODE>simplex</CODE> allows
+  code of the worst-case exponential but typically polynomial
+  complexity class;
+- <CODE>any</CODE> allows
+  code of the universal complexity class.
+
+<H2><CODE> ppl_Polyhedron_is_empty(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is empty.
+
+<H2><CODE> ppl_Polyhedron_is_universe(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is the universe.
+
+<H2><CODE> ppl_Polyhedron_is_bounded(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is bounded.
+
+<H2><CODE> ppl_Polyhedron_contains_integer_point(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> contains at least one integer point.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H3><CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1,
+  			  ?Coefficient_2, ?Boolean)
+ </CODE></H3>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value and <CODE>Coefficient_2</CODE> with the denominator
+  of the supremum value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+ </CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value,
+  <CODE>Coefficient_2</CODE> with the denominator of the supremum value,
+  and <CODE>Point</CODE> with a point or closure point where
+  <CODE>Lin_Expr</CODE> reaches this value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1,
+			  ?Coefficient_2, ?Boolean)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the infimum value
+  and <CODE>Coefficient_2</CODE> with the denominator of the infimum value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the
+  infimum value, <CODE>Coefficient_2</CODE> with the denominator of
+  the infimum value, and <CODE>Point</CODE> with  a point or
+  closure point where <CODE>Lin_Expr</CODE> reaches this value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is topologically closed.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in or
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in but not
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+     </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is disjoint from
+   the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is
+   equal to the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_OK(+Handle) </CODE></H2>
+
+   Succeeds only if the polyhedron referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint(+Handle, +Constraint) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Constraint</CODE> to its constraint system.
+   Thus, the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_constraint(X, 4*A + B - 2*C >= 5).
+\endcode
+    will update the polyhedron with handle \p X to consist of
+    the set of points
+    in the vector space \f$\Rset^3\f$ satisfying the constraint
+    \f$4x + y - 2z >= 5\f$.
+
+   Note that <CODE>ppl_Polyhedron_add_constraint_and_minimize/2</CODE>
+   will fail if, after adding the constraint, the polyhedron is empty.
+
+<H2><CODE> ppl_Polyhedron_add_generator(+Handle, +Generator) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Generator</CODE> to its generator system.
+   Thus, after the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generator(X, point(-100*A - 5*B, 8)).
+\endcode
+    will update the polyhedron with handle \p X to be the single point
+    \f$(-12.5, -0.625, 0)^\transpose\f$ in the vector space \f$\Rset^3\f$.
+
+<H2><CODE> ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   | ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+        A = '$VAR'(0), B = '$VAR'(1),
+        ppl_Polyhedron_add_constraints(X, [4*A + B >= 3, A = 1]),
+        ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [4*A+1*B>=3,1*A=1] ?
+\endcode
+The updated polyhedron referenced by <CODE>Handle</CODE> can be empty
+and a query will succeed even when
+<CODE>Constraint_System</CODE> is unsatisfiable.
+
+<H2><CODE> ppl_Polyhedron_add_constraints_and_minimize(+Handle,
+                                   +Constraint_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1),
+      ppl_Polyhedron_add_constraints_and_minimize(X, [4*A + B >= 3, A = 1]),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*B>= -1,1*A=1]
+\endcode                                                                          This will fail if, after adding the constraints, the polyhedron is empty.
+   E.g., the following will fail,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      ppl_Polyhedron_add_constraints_and_minimize(X,
+        [4*A + B >= 3, A = 0, B =< 0]),
+      ppl_Polyhedron_get_constraints(X, CS).
+\endcode
+<H2><CODE> ppl_C_Polyhedron_add_generators(+Handle, +Generator_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   If the system of generators representing a polyhedron
+   is non-empty, then it must include a point
+   (see Section \extref{Generators_Representation, Generators Representation}
+    of the main PPL user manual).
+   Thus care must be taken to ensure that, before calling this
+   predicate, either the polyhedron referenced by <CODE>Handle</CODE>
+   is non-empty or that whenever <CODE>Generator_System</CODE> is
+   non-empty the first element defines a point.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators(X,
+        [point(1*A + 1*B + 1*C, 1), ray(1*A), ray(2*A)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [ray(2*A), point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_generators_and_minimize(+Handle,
+                                   +Generator_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   Unlike the predicate <CODE>ppl_add_generators</CODE>,
+   the order of the generators in
+   <CODE>Generator_System</CODE> is not important.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators_and_minimize(X,
+        [ray(1*A), ray(2*A), point(1*A + 1*B + 1*C, 1)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1,
+                     +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its intersection with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-hull with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-difference with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_image(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the affine expression
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE> to <CODE>PPL_Var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
+
+<H2><CODE> ppl_Polyhedron_bounded_affine_image(+Handle,
+               +PPL_Var,
+               +Lin_Expr_1,
+               +Lin_Expr_2,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the image with respect to the transfer relation
+   <CODE>Lin_Expr_1/Coefficient <= PPL_Var <= Lin_Expr_2/Coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image(+Handle,
+               +PPL_Var,
+               +Relation_Symbol
+               +Lin_Expr,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>PPL_Var</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+               +Lin_Expr_1,
+               +Relation_Symbol
+               +Lin_Expr_2) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>Lin_Expr_1</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron \f$\cP\f$ referenced by <CODE>Handle_1</CODE>
+   the time-elapse \f$ (\cP \nearrow \cQ)\f$
+   with the polyhedron \f$\cQ\f$ referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_topological_closure_assign(+Handle) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle</CODE>
+   its topological closure.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
+
+   Embeds the polyhedron  referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_embed(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [],
+   GS = [point(0),line(1*A),line(1*B)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Updates the polyhedron \f$\cP_1\f$ referenced  by <CODE>Handle_1</CODE>
+   by first embedding \f$\cP_1\f$ in a new space enlarged by
+   the space dimensions
+   of the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   and then adds to its system of constraints
+   a renamed-apart version of the constraints of  \f$\cP_2\f$.
+
+   E.g.,
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      D = '$VAR'(3), E = '$VAR'(4),
+      ppl_new_NNC_Polyhedron_from_constraints([A > 1, B >= 0, C >= 0], Y),
+      ppl_Polyhedron_concatenate_assign(X, Y),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*C > 1, 1*D >= 0, 1*E >= 0]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project(+Handle,
+                   +Dimension_Type)
+ </CODE></H2>
+
+   Projects the polyhedron  referenced by <CODE>Handle</CODE>
+   onto a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_project(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [1*A = 0, 1*B = 0],
+   GS = [point(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions(+Handle,
+               +List_of_PPL_Vars) </CODE></H2>
+
+   Removes the space dimensions given by the identifiers of the
+   PPL variables in list <CODE>List_of_PPL_Vars</CODE>
+   from the polyhedron  referenced by <CODE>Handle</CODE>.
+   The identifiers for the remaining PPL variables are renumbered so that
+   they are consecutive and the maximum index is less than the number
+   of dimensions.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_remove_space_dimensions(X, [B]),
+      ppl_Polyhedron_space_dimension(X, K),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   K = 2,
+   GS = [point(0),line(1*A),line(1*B),line(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)) </CODE></H2>
+
+   Projects the polyhedron  referenced to by <CODE>Handle</CODE>
+   onto  the first <CODE>Dimension_Type</CODE> dimension.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(5, empty, X),
+      ppl_Polyhedron_remove_higher_space_dimensions(X, 3),
+      ppl_Polyhedron_space_dimension(X, K).
+\endcode
+
+<H2><CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE></H2>
+
+   <CODE>Dimension_Type</CODE> copies of the space dimension referenced by
+   <CODE>PPL_Var</CODE> are added to the polyhedron
+   referenced to by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE></H2>
+
+   The space dimensions referenced by the PPL variables in list
+   <CODE>List_of_PPL_Vars</CODE> are folded into the dimension referenced
+   by <CODE>PPL_Var</CODE> and removed.
+   The result is undefined if <CODE>List_of_PPL_Vars</CODE>
+   does not have the properties described in Section
+   \extref{fold_space_dimensions,
+   Folding Multiple Dimensions of the Vector Space into One Dimension}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)) </CODE></H2>
+
+   Maps the space dimensions of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   using the partial function defined by <CODE>P_Func</CODE>.
+   The result is undefined if \p P_Func does not encode a partial
+   function with the properties described in
+   Section \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+   Mapping the Dimensions of the Vector Space}
+   of the main PPL user manual.
+
+<H2><CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region
+   the vector space of dimension <CODE>Dimension_Type</CODE>,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                      -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with
+   the feasible region represented by <CODE>Constraint_System</CODE>,
+   objective function <CODE>Lin_Expr</CODE> and optimization mode
+   <CODE>Optimization_Mode</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE></H2>
+
+   Swaps the MIP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE></H2>
+
+   Deletes the MIP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL MIP Problem.
+
+<H2><CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   MIP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, -Vars_List)
+</CODE></H2>
+
+   Unifies <CODE>Vars_List</CODE> with a list of variables representing
+   representing the integer space dimensions of the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE></H2>
+
+   Unifies <CODE>Lin_Expr</CODE> with the objective function
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE></H2>
+
+   Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE></H2>
+
+  Resets the MIP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+
+<H2><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
+
+   Embeds the MIP problem referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+
+<H2><CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the variables in <CODE>Vars_List</CODE> are added to
+   the set of integer space dimensions.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>Constraint_System</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the objective function is changed to <CODE>Lin_Expr</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE></H2>
+
+  Succeeds if and only if the MIP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.
+
+<H2><CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE></H2>
+
+  Solves the MIP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>MIP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the MIP problem is not satisfiable;
+  <CODE>unbounded</CODE>, if the MIP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  <CODE>optimized</CODE>, if the MIP problem admits an optimal solution.
+
+<H2><CODE>
+  ppl_MIP_Problem_feasible_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with a feasible point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with an optimizing point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+
+  Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
+  with the numerator and denominator, respectively, for the optimal value
+  for the MIP problem  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+  Evaluates the objective function of the MIP problem  referenced by
+  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+  <CODE>Coefficient_1</CODE> is unified with the numerator and
+  <CODE>Coefficient_2</CODE> is unified with the denominator of the
+  objective function value at <CODE>Generator</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE></H2>
+
+   Succeeds only if the MIP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+\anchor OI_Compilation
+<H1>Compilation and Installation</H1>
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of the OCaml system.  If OCaml is correctly installed in a standard location,
+things are arranged so that the OCaml interface is built and installed.
+
+\latexonly
+\input ocamldoc.tex
+\endlatexonly
+\htmlonly
+\anchor OI_OCamldoc_Documentation
+<H1>OCamldoc Documentation</H1>
+
+For the details about the PPL's OCaml interface, see the
+<A HREF="ocamldoc/Ppl_ocaml.html">OCamldoc-generated documentation</a>.
+\endhtmlonly
+
+*/ /* \mainpage */
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4
new file mode 100644
index 0000000..686fa20
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4
@@ -0,0 +1,65 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)dnl
+
+dnl This m4 file generates the file ppl_ocaml.cc
+dnl using the code in ppl_interface_generator_ocaml_cc_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_cc_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+/* OCaml interface implementation.
+m4_include(`ppl_interface_generator_copyright')
+*/
+m4_divert(-1)dnl
+
+dnl m4_pre_all_classes_code
+dnl
+dnl Definition for converting a term to a class handle code for all
+dnl classes must be placed before all the generated code so that one class
+dnl can be copied from another.
+m4_define(`m4_pre_all_classes_code', `')
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+                                  m4_access_class_code,
+                                  m4_pattern_list)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+
+m4_divert`'dnl
+`#'include "ppl_ocaml_globals.cc"
+m4_all_code
+m4_popdef(`m4_one_class_code')`'dnl
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_all_code
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
new file mode 100644
index 0000000..412c3e5
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
@@ -0,0 +1,1036 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating ppl_ocaml.cc
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`m4_access_class_code',
+`dnl
+//! Give access to the embedded @CLASS@* in \p v.
+inline @TOPOLOGY@@CPP_CLASS@*
+p_ at TOPOLOGY@@CLASS at _val(value v) {
+  return unmark(*reinterpret_cast<@TOPOLOGY@@CPP_CLASS@**>(Data_custom_val(v)));
+}
+
+//! Give access to the embedded @CLASS@* in \p v.
+inline @TOPOLOGY@@CPP_CLASS@*&
+actual_p_ at TOPOLOGY@@CLASS at _val(value v) {
+  return *reinterpret_cast<@TOPOLOGY@@CPP_CLASS@**>(Data_custom_val(v));
+}
+
+void
+custom_ at TOPOLOGY@@CLASS at _finalize(value v) {
+   if (!marked(actual_p_ at TOPOLOGY@@CLASS at _val(v)))
+      delete actual_p_ at TOPOLOGY@@CLASS at _val(v);
+}
+
+static struct custom_operations @TOPOLOGY@@CLASS at _custom_operations = {
+  "it.unipr.cs.ppl" "." PPL_VERSION "." "@TOPOLOGY@@CLASS@"@COMMA@
+  custom_ at TOPOLOGY@@CLASS at _finalize@COMMA@
+  custom_compare_default at COMMA@
+  custom_hash_default at COMMA@
+  custom_serialize_default at COMMA@
+  custom_deserialize_default
+};
+
+inline value
+val_p_ at TOPOLOGY@@CLASS@(const @TOPOLOGY@@CPP_CLASS@& ph) {
+  value v = caml_alloc_custom(&@TOPOLOGY@@CLASS at _custom_operations,
+			      sizeof(@TOPOLOGY@@CPP_CLASS@*), 0, 1);
+  actual_p_ at TOPOLOGY@@CLASS at _val(v) = const_cast<@TOPOLOGY@@CPP_CLASS@*>(&ph);
+  return(v);
+}
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(value d, value caml_de) try {
+  CAMLparam2(d, caml_de);
+  int dd = Int_val(d);
+  check_int_is_unsigned(dd);
+  Degenerate_Element ppl_de = build_ppl_degenerate_element(caml_de);
+  CAMLreturn(val_p_ at TOPOLOGY@@CLASS@(*new @TOPOLOGY@@CPP_CLASS@(dd, ppl_de)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(value cl) try {
+  CAMLparam1(cl);
+  @UBUILD_REPRESENT at _System cs = build_ppl_ at UBUILD_REPRESENT@_System(cl);
+  CAMLreturn(val_p_ at TOPOLOGY@@CLASS@(*new @TOPOLOGY@@CPP_CLASS@(cs)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _relation_with_@RELATION_REPRESENT@(value ph, value c) try {
+  CAMLparam2(ph, c);
+  const @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @URELATION_REPRESENT@ ppl_c = build_ppl_ at URELATION_REPRESENT@(c);
+  Poly_ at UALT_RELATION_REPRESENT@_Relation r = pph.relation_with(ppl_c);
+  CAMLreturn(build_ocaml_poly_ at ALT_RELATION_REPRESENT@_relation(r));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@DIMENSION@(value ph) try {
+  CAMLparam1(ph);
+  const @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  dimension_type d = pph. at DIMENSION@();
+  if (d > INT_MAX)
+    abort();
+  CAMLreturn(Val_int(d));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@HAS_PROPERTY@(value ph) try {
+  CAMLparam1(ph);
+  const @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  CAMLreturn(Val_bool(pph. at HAS_PROPERTY@()));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _@SIMPLIFY@(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph. at SIMPLIFY@();
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _bounds_from_@ABOVEBELOW@(value ph, value le) try {
+  CAMLparam2(ph, le);
+  const @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  Linear_Expression ple = build_ppl_Linear_Expression(le);
+  CAMLreturn(Val_bool(pph.bounds_from_ at ABOVEBELOW@(ple)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT@(value ph, value c) try {
+  CAMLparam2(ph, c);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @UADD_REPRESENT@ pc = build_ppl_ at UADD_REPRESENT@(c);
+  pph.add_ at ADD_REPRESENT@(pc);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at _and_minimize(value ph, value c) try {
+  CAMLparam2(ph, c);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @UADD_REPRESENT@ pc = build_ppl_ at UADD_REPRESENT@(c);
+  CAMLreturn(Val_bool(pph.add_ at ADD_REPRESENT@_and_minimize(pc)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s(value ph, value cs) try {
+  CAMLparam2(ph, cs);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @UADD_REPRESENT at _System pcs = build_ppl_ at UADD_REPRESENT@_System(cs);
+  pph.add_ at ADD_REPRESENT@s(pcs);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s_and_minimize(value ph, value cs) try {
+  CAMLparam2(ph, cs);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @UADD_REPRESENT at _System pcs = build_ppl_ at UADD_REPRESENT@_System(cs);
+  CAMLreturn(Val_bool(pph.add_ at ADD_REPRESENT@s_and_minimize(pcs)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT@(value ph, value c) try {
+  CAMLparam2(ph, c);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @UREFINE_REPRESENT@ pc = build_ppl_ at UREFINE_REPRESENT@(c);
+  pph.refine_with_ at REFINE_REPRESENT@(pc);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT at s(value ph, value cs) try {
+  CAMLparam2(ph, cs);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  @UREFINE_REPRESENT at _System pcs = build_ppl_ at UREFINE_REPRESENT@_System(cs);
+  pph.refine_with_ at REFINE_REPRESENT@s(pcs);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@COMPARISON at _@TOPOLOGY@@CLASS@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  const @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  CAMLreturn(Val_bool(pph1. at COMPARISON@(pph2)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _equals_@TOPOLOGY@@CLASS@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  const @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  CAMLreturn(Val_bool(pph1 == pph2));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _@BINOP@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  pph1. at BINOP@(pph2);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@BINMINOP@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  CAMLreturn(Val_bool(pph1. at BINMINOP@(pph2)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _simplify_using_context_assign(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  CAMLreturn(Val_bool(pph1.simplify_using_context_assign(pph2)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _add_space_dimensions_@EMBEDPROJECT@(value ph,
+							     value d) try {
+  CAMLparam2(ph, d);
+  int dd = Int_val(d);
+  check_int_is_unsigned(dd);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.add_space_dimensions_and_embed(dd);
+  CAMLreturn0;
+							     }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _remove_space_dimensions(value ph, value caml_vset) try {
+  CAMLparam2(ph, caml_vset);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.remove_space_dimensions(build_ppl_Variables_Set(caml_vset));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _remove_higher_space_dimensions(value ph,
+							     value d) try {
+  CAMLparam2(ph, d);
+  int dd = Int_val(d);
+  check_int_is_unsigned(dd);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.remove_higher_space_dimensions(dd);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _fold_space_dimensions(value ph, value caml_vset, value caml_dim)
+  try {
+  CAMLparam1(ph);
+  dimension_type ppl_dim = Int_val(caml_dim);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  Variables_Set ppl_vset;
+  if (Int_val(caml_vset) == 0)
+    CAMLreturn0;
+  while (true) {
+    ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+    if (Int_val(Field(caml_vset, 1)) == 0)
+      break;
+    caml_vset = Field(caml_vset, 1);
+  }
+  pph.fold_space_dimensions(ppl_vset, Variable(ppl_dim));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+
+  m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _map_space_dimensions(value ph, value caml_mapped_dims) try {
+  CAMLparam2(ph, caml_mapped_dims);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  PFunc pfunc;
+  while (caml_mapped_dims != Val_int(0)) {
+    Int_val(Field(Field(caml_mapped_dims, 0),0));
+    int domain_value = Int_val(Field(Field(caml_mapped_dims, 0),0));
+    int codomain_value = Int_val(Field(Field(caml_mapped_dims, 0),1));
+    pfunc.insert(domain_value,
+		 codomain_value);
+    caml_mapped_dims = Field(caml_mapped_dims, 1);
+  }
+  pph.map_space_dimensions(pfunc);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+
+  m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _expand_space_dimension(value ph,
+						     value var_index,
+						     value m) try {
+  CAMLparam3(ph, var_index, m);
+  int c_m = Int_val(m);
+  check_int_is_unsigned(c_m);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.expand_space_dimension(build_ppl_Variable(var_index), c_m);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+
+  m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _get_@GET_REPRESENT at s(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  CAMLreturn(build_caml_ at GET_REPRESENT@_system(pph. at GET_REPRESENT@s()));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _get_minimized_@GET_REPRESENT at s(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  CAMLreturn(build_caml_ at GET_REPRESENT@_system(pph.minimized_ at GET_REPRESENT@s()));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _constrains(value ph, value var) try {
+  CAMLparam2(ph, var);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  CAMLreturn(Val_bool(pph.constrains(build_ppl_Variable(var))));
+			    }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimension(value ph, value var) try {
+  CAMLparam2(ph, var);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.unconstrain(build_ppl_Variable(var));
+  CAMLreturn0;
+			    }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimensions(value ph, value caml_vset)
+  try {
+    CAMLparam2(ph, caml_vset);
+    @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+    pph.unconstrain(build_ppl_Variables_Set(caml_vset));
+    CAMLreturn0;
+			    }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _bounded_@AFFIMAGE@(value ph, value var, value lb_expr,
+				    value ub_expr, value coeff) try {
+  CAMLparam5(ph, var, lb_expr, ub_expr, coeff);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.bounded_ at AFFIMAGE@(build_ppl_Variable(var),
+			   build_ppl_Linear_Expression(lb_expr),
+ 			   build_ppl_Linear_Expression(ub_expr),
+ 			   build_ppl_Coefficient(coeff));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _@AFFIMAGE@(value ph, value var, value expr,
+			    value coeff) try {
+  CAMLparam4(ph, var, expr, coeff);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  build_ppl_Linear_Expression(expr);
+  pph. at AFFIMAGE@(build_ppl_Variable(var),
+		   build_ppl_Linear_Expression(expr),
+		   build_ppl_Coefficient(coeff));
+  CAMLreturn0;
+			    }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 1(value ph, value le1, value rel_sym,
+					 value le2) try {
+  CAMLparam4(ph, le1, rel_sym, le2);
+  build_ppl_relsym(rel_sym);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Linear_Expression(le1),
+			       build_ppl_relsym(rel_sym),
+			       build_ppl_Linear_Expression(le2));
+  CAMLreturn0;
+ }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 2(value ph, value int_val,
+					 value rel_sym,
+					 value le, value caml_coeff) try {
+  CAMLparam5(ph, int_val, rel_sym, le, caml_coeff);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Variable(int_val),
+			       build_ppl_relsym(rel_sym),
+			       build_ppl_Linear_Expression(le),
+			       build_ppl_Coefficient(caml_coeff));
+  CAMLreturn0;
+ }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 1_with_congruence(value ph,
+                                         value int_val,
+                                         value rel_sym,
+					 value le,
+                                         value caml_coeff,
+                                         value caml_modulus) try {
+  CAMLparam5(ph, int_val, rel_sym, le, caml_coeff);
+  CAMLxparam1(caml_modulus);
+  build_ppl_relsym(rel_sym);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Variable(int_val),
+			       build_ppl_relsym(rel_sym),
+			       build_ppl_Linear_Expression(le),
+			       build_ppl_Coefficient(caml_coeff),
+			       build_ppl_Coefficient(caml_modulus));
+  CAMLreturn0;
+ }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 1_lhs_rhs_with_congruence(value ph,
+                                         value le1,
+                                         value rel_sym,
+					 value le2,
+                                         value caml_modulus) try {
+  CAMLparam5(ph, le1, rel_sym, le2, caml_modulus);
+  build_ppl_relsym(rel_sym);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Linear_Expression(le1),
+			     build_ppl_relsym(rel_sym),
+			     build_ppl_Linear_Expression(le2),
+			     build_ppl_Coefficient(caml_modulus));
+  CAMLreturn0;
+ }
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  pph1. at WIDEN@_widening_assign(pph2);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+
+  m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign_with_tokens(value ph1, value ph2,
+						     value integer) try {
+  CAMLparam3(ph1, ph2, integer);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  int cpp_int = Val_int(integer);
+  check_int_is_unsigned(cpp_int);
+  unsigned int unsigned_value = cpp_int;
+  pph1. at WIDEN@_widening_assign(pph2, &unsigned_value);
+  CAMLreturn(Int_val(unsigned_value));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign_with_tokens(value ph1,
+						   value ph2,
+						   value caml_cs,
+						   value integer) try {
+  CAMLparam4(ph1, ph2, caml_cs, integer);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  @UCONSTRAINER at _System ppl_cs = build_ppl_ at UCONSTRAINER@_System(caml_cs);
+  int cpp_int = Val_int(integer);
+  check_int_is_unsigned(cpp_int);
+  unsigned int unsigned_value = cpp_int;
+  pph1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(pph2, ppl_cs,
+							 &unsigned_value);
+  CAMLreturn(Int_val(unsigned_value));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(value ph1,
+						   value ph2,
+						   value caml_cs) try {
+  CAMLparam3(ph1, ph2, caml_cs);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  @UCONSTRAINER at _System ppl_cs = build_ppl_ at UCONSTRAINER@_System(caml_cs);
+  pph1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(pph2, ppl_cs);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@MAXMIN@(value ph, value caml_le) try {
+  CAMLparam2(ph, caml_le);
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  bool is_supremum = false;
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  bool ppl_return_value = pph. at MAXMIN@(build_ppl_Linear_Expression(caml_le),
+				      num, den, is_supremum);
+  value caml_return_value = caml_alloc(4,0);
+  Field(caml_return_value, 0) = Val_bool(ppl_return_value);
+  Field(caml_return_value, 1) = build_caml_coefficient(num);
+  Field(caml_return_value, 2) = build_caml_coefficient(den);
+  Field(caml_return_value, 3) = Val_bool(is_supremum);
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@MAXMIN at _with_point(value ph, value caml_le) try {
+  CAMLparam2(ph, caml_le);
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  bool is_supremum = false;
+  Generator g = point();
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  bool ppl_return_value = pph. at MAXMIN@(build_ppl_Linear_Expression(caml_le),
+				      num, den, is_supremum, g);
+  value caml_return_value = caml_alloc(5,0);
+  Field(caml_return_value, 0) = Val_bool(ppl_return_value);
+  Field(caml_return_value, 1) = build_caml_coefficient(num);
+  Field(caml_return_value, 2) = build_caml_coefficient(den);
+  Field(caml_return_value, 3) = Val_bool(is_supremum);
+  Field(caml_return_value, 4) = build_caml_generator(g);
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _OK(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  CAMLreturn(Bool_val(pph.OK()));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@MEMBYTES@(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at TOPOLOGY@@CLASS at _val(ph);
+  CAMLreturn(Val_int(pph. at MEMBYTES@()));
+}
+CATCH_ALL
+
+ ')
+
+  m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _swap(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  pph1.swap(pph2);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(value ph) try {
+  CAMLparam1(ph);
+  @CPPX_FRIEND@& pph = *p_ at FRIEND@_val(ph);
+  CAMLreturn(val_p_ at TOPOLOGY@@CLASS@(*new @TOPOLOGY@@CPP_CLASS@(pph)));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @TOPOLOGY@@CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  const @TOPOLOGY@@CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  CAMLreturn(Val_bool(pph1. at UB_EXACT@(pph2)));
+}
+CATCH_ALL
+
+')
+
+
+  m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+extern "C"
+void
+ppl_ at TOPOLOGY@@CLASS at _@EXTRAPOLATION at _extrapolation_assign(value ph1,
+                                                           value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  pph1. at EXTRAPOLATION@_extrapolation_assign(pph2);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+
+  m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at TOPOLOGY@@CLASS at _@EXTRAPOLATION at _extrapolation_assign_with_tokens(
+                                                     value ph1, value ph2,
+						     value integer) try {
+  CAMLparam3(ph1, ph2, integer);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  int cpp_int = Val_int(integer);
+  check_int_is_unsigned(cpp_int);
+  unsigned int unsigned_value = cpp_int;
+  pph1. at EXTRAPOLATION@_extrapolation_assign(pph2, &unsigned_value);
+  CAMLreturn(Int_val(unsigned_value));
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+extern "C"
+void
+ppl at TOPOLOGY@_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(value ph1,
+                                                       value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @TOPOLOGY@@CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  const @TOPOLOGY@@CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  pph1. at EXTRAPOLATION@_narrowing_assign(pph2);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+ ')
+
+  m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `dnl
+ extern "C"
+ CAMLprim value
+ ppl_ at CLASS@_ at BEGINEND@_iterator(value t_pps) try {
+   CAMLparam1(t_pps);
+   @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+  CAMLreturn(val_p_ at CLASS@_iterator(*new @CPP_CLASS@::iterator(pps. at BEGINEND@())));
+
+ }
+ CATCH_ALL
+
+ ')
+
+
+  m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+ extern "C"
+ CAMLprim value
+ppl_ at CLASS@_get_disjunct(value caml_it) {
+   CAMLparam1(caml_it);
+   @CPP_CLASS@::iterator& cpp_it  = *p_ at CLASS@_iterator_val(caml_it);
+   @CLASSTOPOLOGY@@CPP_DISJUNCT@ disjunct = cpp_it->element();
+   value value_to_return = val_p_ at CLASSTOPOLOGY@@DISJUNCT@(disjunct);
+   actual_p_ at CLASSTOPOLOGY@@CPP_DISJUNCT at _val(value_to_return) =
+                                              mark(&disjunct);
+   CAMLreturn(value_to_return);
+
+}
+
+')
+
+  m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+extern "C"
+void
+ppl_ at CLASS@_add_disjunct(value t_pps, value caml_item_to_add) try {
+   CAMLparam2(t_pps, caml_item_to_add);
+   @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+   @CLASSTOPOLOGY@@CPP_DISJUNCT@& item = *p_ at CLASSTOPOLOGY@@DISJUNCT at _val(caml_item_to_add);
+   pps.add_disjunct(item);
+CAMLreturn0;
+}
+CATCH_ALL
+
+ ')
+
+  m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+ extern "C"
+void
+ ppl_ at CLASS@_drop_disjunct(value t_pps, value caml_item_to_drop) try {
+   CAMLparam2(t_pps, caml_item_to_drop);
+   @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+   @CPP_CLASS@::iterator& itr = *p_ at CLASS@_iterator_val(caml_item_to_drop);
+ pps.drop_disjunct(itr);
+CAMLreturn0;
+ }
+ CATCH_ALL
+
+ ')
+
+  m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+ extern "C"
+void
+ ppl_ at CLASS@_ at INCDEC@_iterator(value caml_itr) try {
+   CAMLparam1(caml_itr);
+   @CPP_CLASS@::iterator& itr = *p_ at CLASS@_iterator_val(caml_itr);
+    @CPPX_INCDEC at itr;
+   CAMLreturn0;
+ }
+ CATCH_ALL
+
+ ')
+
+  m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@::iterator*&
+p_ at CLASS@_iterator_val(value v) {
+  return *reinterpret_cast<@CPP_CLASS@::iterator**>(Data_custom_val(v));
+}
+
+void
+custom_ at CLASS@_iterator_finalize(value v) {
+  delete p_ at CLASS@_iterator_val(v);
+}
+
+static struct custom_operations @CLASS at _iterator_custom_operations = {
+  "it.unipr.cs.ppl" "." PPL_VERSION "." "@CLASS at _iterator"@COMMA@
+  custom_ at CLASS@_iterator_finalize at COMMA@
+  custom_compare_default at COMMA@
+  custom_hash_default at COMMA@
+  custom_serialize_default at COMMA@
+  custom_deserialize_default
+};
+
+inline value
+val_p_ at CLASS@_iterator(const @CPP_CLASS@::iterator& ph) {
+  value v = caml_alloc_custom(&@CLASS at _iterator_custom_operations,
+			      sizeof(@CPP_CLASS@::iterator*), 0, 1);
+  p_ at CLASS@_iterator_val(v) = const_cast<@CPP_CLASS@::iterator*>(&ph);
+  return(v);
+}
+
+ extern "C"
+CAMLprim value
+ ppl_ at CLASS@_iterator_equals_iterator(value caml_itr1, value caml_itr2) try {
+   CAMLparam2(caml_itr1, caml_itr2);
+  @CPP_CLASS@::iterator& itr1 = *p_ at CLASS@_iterator_val(caml_itr1);
+  @CPP_CLASS@::iterator& itr2 = *p_ at CLASS@_iterator_val(caml_itr2);
+ if (itr1 == itr2)
+   CAMLreturn(Val_bool(true));
+ else
+   CAMLreturn(Val_bool(false));
+ }
+ CATCH_ALL
+
+ ')
+
+
+  m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+extern "C"
+void
+ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+                                               value ph1,
+                                               value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  pph1.BHZ03_widening_assign<@ALT_DISJUNCT_WIDEN at _Certificate>
+      (pph2,
+       widen_fun_ref(&@CLASSTOPOLOGY@@CPP_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));;
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+extern "C"
+void
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(value ph1,
+                                              value ph2,
+                                              value integer) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at TOPOLOGY@@CLASS at _val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at TOPOLOGY@@CLASS at _val(ph2);
+  int cpp_int = Val_int(integer);
+  check_int_is_unsigned(cpp_int);
+  pph1.BGP99_extrapolation_assign(
+       pph2,
+       widen_fun_ref(&@CLASSTOPOLOGY@@CPP_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign), cpp_int);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4
new file mode 100644
index 0000000..e84c1ce
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4
@@ -0,0 +1,71 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ocaml.ml
+dnl using the code in ppl_interface_generator_ocaml_ml_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_ml_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+(** OCaml interface code.
+m4_include(`ppl_interface_generator_copyright')
+*)
+
+include Ppl_ocaml_globals
+include Ppl_ocaml_types
+open Gmp
+
+exception Error of string
+let _ = Callback.register_exception "PPL_arithmetic_overflow" (Error "any string")
+let _ = Callback.register_exception "PPL_internal_error" (Error "any string")
+let _ = Callback.register_exception "PPL_unknown_standard_exception" (Error "any string")
+let _ = Callback.register_exception "PPL_not_an_unsigned_exception" (Error "any string")
+
+let _ = Callback.register_exception "PPL_unexpected_error" (Error "any string")
+
+m4_divert(-1)
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+                                  `type @LTOPOLOGY@@LCLASS@
+',
+                                  m4_pattern_list)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
new file mode 100644
index 0000000..5519930
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
@@ -0,0 +1,529 @@
+dnl  -*- Tuareg -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating ppl_ocaml.ml
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension:
+  int -> degenerate_element -> @LTOPOLOGY@@LCLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s:
+  @BUILD_REPRESENT at _system -> @LTOPOLOGY@@LCLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _relation_with_@RELATION_REPRESENT@:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at RELATION_REPRESENT@
+  -> poly_ at ALT_RELATION_REPRESENT@_relation list
+  = "ppl_ at TOPOLOGY@@CLASS at _relation_with_@RELATION_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@DIMENSION@:
+	    @LTOPOLOGY@@LCLASS@ -> int = "ppl_ at TOPOLOGY@@CLASS at _@DIMENSION@"
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@HAS_PROPERTY@:
+  @LTOPOLOGY@@LCLASS@ -> bool = "ppl_ at TOPOLOGY@@CLASS at _@HAS_PROPERTY@"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@SIMPLIFY@:
+  @LTOPOLOGY@@LCLASS@ -> unit = "ppl_ at TOPOLOGY@@CLASS at _@SIMPLIFY@"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _bounds_from_@ABOVEBELOW@:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _bounds_from_@ABOVEBELOW@"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT@:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at ADD_REPRESENT@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at _and_minimize:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at ADD_REPRESENT@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at _and_minimize"
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @ADD_REPRESENT at _system -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s_and_minimize:
+  @LTOPOLOGY@@LCLASS@ -> @ADD_REPRESENT at _system -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s_and_minimize"
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT@:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at REFINE_REPRESENT@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @REFINE_REPRESENT at _system -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@COMPARISON at _@TOPOLOGY@@CLASS@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _@COMPARISON at _@TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _equals_@TOPOLOGY@@CLASS@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _equals_@TOPOLOGY@@CLASS@"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@BINOP@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _@BINOP@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@BINMINOP@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _@BINMINOP@"
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _simplify_using_context_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _simplify_using_context_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _add_space_dimensions_@EMBEDPROJECT@:
+  @LTOPOLOGY@@LCLASS@ -> int -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _add_space_dimensions_@EMBEDPROJECT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _remove_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int list -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _remove_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _remove_higher_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _remove_higher_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _fold_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int list -> int -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _fold_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _map_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> (int*int) list -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _map_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _expand_space_dimension:
+  @LTOPOLOGY@@LCLASS@ -> int -> int -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _expand_space_dimension"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _get_@GET_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @GET_REPRESENT at _system
+  = "ppl_ at TOPOLOGY@@CLASS at _get_@GET_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _get_minimized_@GET_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @GET_REPRESENT at _system
+  = "ppl_ at TOPOLOGY@@CLASS at _get_minimized_@GET_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _constrains:
+  @LTOPOLOGY@@LCLASS@ -> int -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _constrains"
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimension:
+  @LTOPOLOGY@@LCLASS@ -> int -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimension"
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int list -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _bounded_@AFFIMAGE@:
+  @LTOPOLOGY@@LCLASS@ -> int -> linear_expression
+  -> linear_expression -> Z.t -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _bounded_@AFFIMAGE@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@AFFIMAGE@:
+  @LTOPOLOGY@@LCLASS@ -> int -> linear_expression -> Z.t -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _@AFFIMAGE@"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _lhs_rhs:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> relation_symbol -> linear_expression -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 1"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE@:
+  @LTOPOLOGY@@LCLASS@ -> int -> relation_symbol
+  -> linear_expression -> Z.t -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 2"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _with_congruence:
+  @LTOPOLOGY@@LCLASS@ -> int -> relation_symbol
+  -> linear_expression -> Z.t -> Z.t -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 1_with_congruence"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _lhs_rhs_with_congruence:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression -> relation_symbol
+  -> linear_expression -> Z.t -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at 1_lhs_rhs_with_congruence"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign_with_tokens:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> int -> int
+  = "ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign_with_tokens"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> @CONSTRAINER at _system -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign_with_tokens:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> @CONSTRAINER at _system -> int -> int
+  = "ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign_with_tokens"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@MAXMIN@:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool
+  = "ppl_ at TOPOLOGY@@CLASS at _@MAXMIN@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@MAXMIN at _with_point:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool * linear_generator
+  = "ppl_ at TOPOLOGY@@CLASS at _@MAXMIN at _with_point"
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _OK:
+  @LTOPOLOGY@@LCLASS@ -> bool = "ppl_ at TOPOLOGY@@CLASS at _OK"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `
+external ppl_ at TOPOLOGY@@CLASS at _@MEMBYTES@:
+  @LTOPOLOGY@@LCLASS@  -> int = "ppl_ at TOPOLOGY@@CLASS at _@MEMBYTES@"
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _swap:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _swap"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@:
+  @LFRIEND@ -> @LTOPOLOGY@@LCLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@"
+
+')
+
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+  = "ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@"
+
+')
+
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens:
+   @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> int -> int
+   = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens"
+
+ ')
+
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign:
+   @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+   = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign"
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign:
+   @LTOPOLOGY@@LCLASS@  -> @LTOPOLOGY@@LCLASS@ -> unit
+   = "ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign"
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `
+external ppl_ at CLASS@_ at BEGINEND@_iterator:
+  @LCLASS@  -> @LCLASS at _iterator
+  = "ppl_ at CLASS@_ at BEGINEND@_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `
+external ppl_ at CLASS@_get_disjunct:
+   @LCLASS at _iterator  ->  @LCLASSTOPOLOGY@@LDISJUNCT@
+   = "ppl_ at CLASS@_get_disjunct"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `
+external ppl_ at CLASS@_add_disjunct:
+   @LCLASS@  ->  @LCLASSTOPOLOGY@@LDISJUNCT@ -> unit
+   = "ppl_ at CLASS@_add_disjunct"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `
+ external ppl_ at CLASS@_drop_disjunct:
+   @LCLASS@  ->  @LCLASS at _iterator -> unit
+   = "ppl_ at CLASS@_drop_disjunct"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `
+ external ppl_ at CLASS@_ at INCDEC@_iterator:
+   @LCLASS at _iterator -> unit
+   = "ppl_ at CLASS@_ at INCDEC@_iterator"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `
+type @LCLASS at _iterator
+
+external ppl_ at CLASS@_iterator_equals_iterator:
+  @LCLASS at _iterator ->  @LCLASS at _iterator -> bool
+  = "ppl_ at CLASS@_iterator_equals_iterator"
+
+')
+
+# m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _code',
+# `dnl
+# external ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@:
+  # @LFRIEND@ -> @LTOPOLOGY@@LCLASS@
+    # = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@"
+
+# ')
+
+# m4_define(`ppl_ at CLASS@_get_disjuncts_code',
+# `dnl
+# external ppl_ at CLASS@_get_disjuncts:
+  # @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+    # = "ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@"
+
+# ')
+
+# m4_define(`ppl_ at CLASS@_get_bounding_box_code',
+# `dnl
+# external ppl_ at CLASS@_get_bounding_box:
+  # @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+    # = "ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@"
+
+# ')
+
+# m4_define(`ppl_ at CLASS@_get_covering_box_code',
+# `dnl
+# external ppl_ at CLASS@_get_covering_box:
+  # @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+    # = "ppl_ at CLASS@_get_covering_box"
+
+# ')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _BHZ03_@ALT_DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _BHZ03_@ALT_DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+external ppl_ at TOPOLOGY@@CLASS at _BGP99_@DISJUNCT_WIDEN at _extrapolation_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> int -> unit
+  = "ppl_ at TOPOLOGY@@CLASS at _BGP99_@DISJUNCT_WIDEN at _extrapolation_assign"
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
new file mode 100644
index 0000000..6787785
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
@@ -0,0 +1,209 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ocaml.mli
+dnl using the code in ppl_interface_generator_ocaml_mli_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_mli_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+(* OCaml interface code.
+m4_define(`bagnara', ``bagnara'\')dnl
+m4_include(`ppl_interface_generator_copyright')dnl
+m4_undefine(`bagnara')dnl
+*)
+(** OCaml interface code. *)
+m4_divert(-1)
+
+dnl m4_pre_all_classes_code
+dnl
+dnl Definition for converting a term to a class handle code for all
+dnl classes must be placed before all the generated code so that one class
+dnl can be copied from another.
+
+m4_divert`'dnl
+dnl
+
+open Gmp
+
+(** Kinds of degenerate abstract elements. *)
+type degenerate_element =
+    Universe (** The universe element, i.e., the whole vector space. *)
+  | Empty (** The empty element, i.e., the empty set. *)
+
+(** A linear expression. *)
+type linear_expression =
+    Variable of int
+  | Coefficient of Z.t
+  | Unary_Plus of linear_expression
+  | Unary_Minus of linear_expression
+  | Plus of linear_expression * linear_expression
+  | Minus of linear_expression * linear_expression
+  | Times of Z.t * linear_expression
+
+(** A linear equality or inequality. *)
+type linear_constraint =
+    Less_Than of linear_expression * linear_expression
+  | Less_Or_Equal of linear_expression * linear_expression
+  | Equal of linear_expression * linear_expression
+  | Greater_Than of linear_expression * linear_expression
+  | Greater_Or_Equal of linear_expression * linear_expression
+
+(** A line, ray, point or closure point. *)
+type linear_generator =
+    Line of linear_expression
+  | Ray of linear_expression
+  | Point of linear_expression * Z.t
+  | Closure_Point of linear_expression * Z.t
+
+(** A grid line, parameter or grid point. *)
+type linear_grid_generator =
+    Grid_Line of linear_expression
+  | Grid_Parameter of linear_expression * Z.t
+  | Grid_Point of linear_expression * Z.t
+
+type poly_gen_relation =
+    Subsumes
+
+type poly_con_relation =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+  | Saturates
+
+type relation_with_congruence =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+
+type linear_congruence = linear_expression * linear_expression * Z.t
+
+type constraint_system = linear_constraint list
+
+type generator_system = linear_generator list
+
+type grid_generator_system = linear_grid_generator list
+
+type congruence_system = linear_congruence list
+
+(* Declared temporarily in this way to avoid name clashes. *)
+type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS
+                       | Greater_Than_RS | Greater_Or_Equal_RS
+
+type optimization_mode = Minimization | Maximization
+
+type mip_problem_status = Unfeasible_Mip_Problem | Unbounded_Mip_Problem
+                        | Optimized_Mip_Problem
+
+
+type mip_problem
+
+val ppl_new_MIP_Problem_from_space_dimension:
+int -> mip_problem
+
+val ppl_new_MIP_Problem:
+      int -> constraint_system -> linear_expression
+	-> optimization_mode -> mip_problem
+
+val ppl_MIP_Problem_space_dimension:
+  mip_problem -> int
+
+val ppl_MIP_Problem_constraints:
+  mip_problem -> constraint_system
+
+val ppl_MIP_Problem_add_space_dimensions_and_embed:
+  mip_problem -> int -> unit
+
+val ppl_MIP_Problem_add_to_integer_space_dimensions:
+  mip_problem -> int list -> unit
+
+val ppl_MIP_Problem_add_constraint:
+  mip_problem -> linear_constraint -> unit
+
+val ppl_MIP_Problem_add_constraints:
+  mip_problem -> constraint_system -> unit
+
+val ppl_MIP_Problem_set_objective_function:
+  mip_problem -> linear_expression -> unit
+
+val ppl_MIP_Problem_is_satisfiable:
+  mip_problem -> bool
+
+val ppl_MIP_Problem_solve:
+  mip_problem -> mip_problem_status
+
+val ppl_MIP_Problem_optimization_mode:
+  mip_problem -> optimization_mode
+
+val ppl_MIP_Problem_feasible_point:
+  mip_problem -> linear_generator
+
+val ppl_MIP_Problem_optimizing_point:
+  mip_problem -> linear_generator
+
+val ppl_MIP_Problem_objective_function:
+  mip_problem -> linear_expression
+
+val ppl_MIP_Problem_optimal_value:
+  mip_problem -> Z.t * Z.t
+
+val ppl_MIP_Problem_evaluate_objective_function:
+  mip_problem -> linear_generator  -> Z.t * Z.t
+
+val ppl_MIP_Problem_OK:
+  mip_problem -> bool
+
+val ppl_MIP_Problem_clear:
+  mip_problem -> unit
+
+val ppl_MIP_Problem_set_optimization_mode:
+  mip_problem -> optimization_mode -> unit
+
+val ppl_MIP_Problem_swap:
+  mip_problem -> mip_problem -> unit
+
+m4_define(`m4_pre_all_classes_code', `')
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+                                  `type @LTOPOLOGY@@LCLASS@
+',
+                                  m4_pattern_list)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
new file mode 100644
index 0000000..58c1b1a
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
@@ -0,0 +1,436 @@
+dnl  -*- Tuareg -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating ppl_ocaml.mli
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension:
+  int -> degenerate_element -> @LTOPOLOGY@@LCLASS@
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s:
+  @BUILD_REPRESENT at _system -> @LTOPOLOGY@@LCLASS@
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _relation_with_@RELATION_REPRESENT@:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at RELATION_REPRESENT@
+  -> poly_ at ALT_RELATION_REPRESENT@_relation list
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@DIMENSION@:
+  @LTOPOLOGY@@LCLASS@ -> int
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@HAS_PROPERTY@:
+  @LTOPOLOGY@@LCLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@SIMPLIFY@:
+  @LTOPOLOGY@@LCLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _bounds_from_@ABOVEBELOW@:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT@:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at ADD_REPRESENT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at _and_minimize:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at ADD_REPRESENT@ -> unit
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @ADD_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s_and_minimize:
+  @LTOPOLOGY@@LCLASS@ -> @ADD_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT@:
+  @LTOPOLOGY@@LCLASS@ -> linear_ at REFINE_REPRESENT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @REFINE_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@COMPARISON at _@TOPOLOGY@@CLASS@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _equals_@TOPOLOGY@@CLASS@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@BINOP@:
+   @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@BINMINOP@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _simplify_using_context_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _add_space_dimensions_@EMBEDPROJECT@:
+  @LTOPOLOGY@@LCLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _remove_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int list -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _remove_higher_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _fold_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int list -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _map_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> (int*int) list -> unit
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _expand_space_dimension:
+  @LTOPOLOGY@@LCLASS@ -> int -> int -> unit
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _get_@GET_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @GET_REPRESENT at _system
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _get_minimized_@GET_REPRESENT at s:
+  @LTOPOLOGY@@LCLASS@ -> @GET_REPRESENT at _system
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _constrains:
+  @LTOPOLOGY@@LCLASS@ -> int -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimension:
+  @LTOPOLOGY@@LCLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimensions:
+  @LTOPOLOGY@@LCLASS@ -> int list -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _bounded_@AFFIMAGE@:
+  @LTOPOLOGY@@LCLASS@ -> int
+  -> linear_expression -> linear_expression
+  -> Z.t -> unit
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@AFFIMAGE@:
+  @LTOPOLOGY@@LCLASS@ -> int -> linear_expression -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _lhs_rhs:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> relation_symbol -> linear_expression
+  -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE@:
+  @LTOPOLOGY@@LCLASS@ -> int -> relation_symbol -> linear_expression
+  -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _with_congruence:
+  @LTOPOLOGY@@LCLASS@ -> int -> relation_symbol -> linear_expression
+  -> Z.t -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _lhs_rhs_with_congruence:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> relation_symbol -> linear_expression -> Z.t
+  -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign_with_tokens:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign_with_tokens:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@
+  -> @CONSTRAINER at _system -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@
+  -> @CONSTRAINER at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@MAXMIN@:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@MAXMIN at _with_point:
+  @LTOPOLOGY@@LCLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool * linear_generator
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _OK:
+  @LTOPOLOGY@@LCLASS@ -> bool
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `
+val ppl_ at TOPOLOGY@@CLASS at _@MEMBYTES@:
+  @LTOPOLOGY@@LCLASS@  -> int
+')
+
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _swap:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@:
+  @LFRIEND@ -> @LTOPOLOGY@@LCLASS@
+
+')
+
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`dnl
+val ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> bool
+
+')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign:
+  @LTOPOLOGY@@LCLASS@  -> @LTOPOLOGY@@LCLASS@ -> unit
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+ `dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens:
+  @LTOPOLOGY@@LCLASS@  -> @LTOPOLOGY@@LCLASS@ -> int -> int
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign:
+  @LTOPOLOGY@@LCLASS@  -> @LTOPOLOGY@@LCLASS@ -> unit
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `dnl
+val ppl_ at CLASS@_ at BEGINEND@_iterator:
+  @LCLASS@  -> @LCLASS at _iterator
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `dnl
+val ppl_ at CLASS@_get_disjunct:
+  @LCLASS at _iterator  ->  @LCLASSTOPOLOGY@@LDISJUNCT@
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `
+val ppl_ at CLASS@_add_disjunct:
+  @LCLASS@  ->  @LCLASSTOPOLOGY@@LDISJUNCT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `dnl
+val ppl_ at CLASS@_drop_disjunct:
+  @LCLASS@  ->  @LCLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `dnl
+type @LCLASS at _iterator
+
+val ppl_ at CLASS@_iterator_equals_iterator:
+  @LCLASS at _iterator ->  @LCLASS at _iterator -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `dnl
+val ppl_ at CLASS@_ at INCDEC@_iterator:
+  @LCLASS at _iterator -> unit
+
+')
+
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign:
+  @LTOPOLOGY@@LCLASS@ -> @LTOPOLOGY@@LCLASS@ -> int -> unit
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
new file mode 100644
index 0000000..1153180
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
@@ -0,0 +1,50 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of procedures
+dnl for the OCaml interface; this includes:
+dnl - the list in the imported file and any OCaml specific procedures.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl
+dnl m4_procedure_list
+dnl This class extends the m4_common_procedure_list
+dnl and all procedures common to the all the interfaces should go there.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+dnl
+
+m4_define(`m4_procedure_list', `m4_common_procedure_list')
+
+dnl TODO
+dnl Some method schemas are not yet implemented for the OCaml interface:
+dnl ppl_ at CLASS@_ascii_dump/1
+dnl ppl_ at CLASS@_ at PARTITION@/4 +pointset_powerset \grid,
+dnl ppl_ at CLASS@_approximate_partition/5  +pointset_powerset \shape,
+dnl ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3
diff --git a/interfaces/OCaml/ppl_ocaml_globals.cc b/interfaces/OCaml/ppl_ocaml_globals.cc
new file mode 100644
index 0000000..38b2003
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_globals.cc
@@ -0,0 +1,1007 @@
+/* Implementation of the OCaml interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "interfaced_boxes.hh"
+#include "marked_pointers.hh"
+
+// OCaml include files.
+extern "C" {
+
+#define CAML_NAME_SPACE
+#include "caml/mlvalues.h"
+#include "caml/memory.h"
+#include "caml/custom.h"
+#include "caml/fail.h"
+#include "caml/callback.h"
+#include "caml/alloc.h"
+#undef CAML_NAME_SPACE
+
+} // extern "C"
+
+#include <stdexcept>
+using namespace Parma_Polyhedra_Library;
+
+class PFunc {
+ private:
+   std::set<dimension_type> codomain;
+   std::vector<dimension_type> vec;
+
+ public:
+   PFunc() {
+   }
+
+  bool has_empty_codomain() const {
+    return codomain.empty();
+   }
+
+  dimension_type max_in_codomain() const {
+    if (codomain.empty())
+      throw std::runtime_error("PFunc::max_in_codomain()");
+    return *codomain.rbegin();
+  }
+
+  bool maps(dimension_type i, dimension_type& j) const {
+    if (i >= vec.size())
+      return false;
+    dimension_type vec_i = vec[i];
+    if (vec_i == not_a_dimension())
+      return false;
+    j = vec_i;
+    return true;
+  }
+
+  bool insert(dimension_type i, dimension_type j) {
+    std::pair<std::set<dimension_type>::iterator, bool> s
+      = codomain.insert(j);
+    if (!s.second)
+      // *this is not injective!
+      return false;
+    if (i > vec.size())
+      vec.insert(vec.end(), i - vec.size(), not_a_dimension());
+    if (i == vec.size()) {
+      vec.insert(vec.end(), j);
+      return true;
+    }
+    dimension_type& vec_i = vec[i];
+    if (vec_i != not_a_dimension())
+      // Already mapped: *this is not a function!
+      return false;
+    vec_i = j;
+    return true;
+  }
+};
+
+#define CATCH_ALL							\
+  catch(std::bad_alloc&) {						\
+    caml_raise_out_of_memory();						\
+  }									\
+  catch(std::invalid_argument& e) {					\
+    caml_invalid_argument(const_cast<char*>(e.what()));			\
+  }									\
+  catch(std::overflow_error& e) {					\
+    caml_raise_with_string(*caml_named_value("PPL_arithmetic_overflow"), \
+			   (const_cast<char*>(e.what())));		\
+  }									\
+  catch(std::runtime_error& e) {					\
+    caml_raise_with_string(*caml_named_value("PPL_internal_error"),	\
+			   (const_cast<char*>(e.what())));		\
+  }									\
+  catch(std::exception& e) {						\
+    caml_raise_with_string(*caml_named_value("PPL_unknown_standard_exception"), \
+			   (const_cast<char*>(e.what())));		\
+  }									\
+  catch(...) {								\
+    caml_raise_constant(*caml_named_value("PPL_unexpected_error"));	\
+  }
+
+void check_int_is_unsigned(int dd) {
+  if (dd < 0)
+    caml_raise_with_string(*caml_named_value("PPL_not_an_unsigned_exception"),
+			   "negative number given, should be unsigned" );
+}
+
+// Function for the management of mpz_t integers.
+extern "C" struct custom_operations _mlgmp_custom_z;
+
+static inline mpz_t* mpz_val(value val) {
+  return ((mpz_t*) (Data_custom_val(val)));
+}
+
+static inline value alloc_mpz(void) {
+  return caml_alloc_custom(&_mlgmp_custom_z, sizeof(mpz_t), 0, 1);
+}
+
+Variable
+build_ppl_Variable(value caml_var) {
+  long ppl_var_index = Int_val(caml_var);
+  check_int_is_unsigned(ppl_var_index);
+  return Variable(ppl_var_index);
+}
+
+// FIXME: This should be placed in a more convenient place inside
+// the library.
+//! Reinterpret an mpz_t as mpz_class.
+mpz_class&
+reinterpret_mpz_class(mpz_t n) {
+  return reinterpret_cast<mpz_class&>(*n);
+}
+
+value
+build_caml_coefficient(const Coefficient& ppl_coeff) {
+  value ml_coeff = alloc_mpz();
+  mpz_init(*mpz_val(ml_coeff));
+  assign_r(reinterpret_mpz_class(*mpz_val(ml_coeff)), ppl_coeff,
+ 	   ROUND_NOT_NEEDED);
+  return ml_coeff;
+}
+
+Coefficient
+build_ppl_Coefficient(value coeff) {
+   mpz_class z((__mpz_struct*) Data_custom_val(coeff));
+   return Coefficient(z);
+}
+
+Linear_Expression
+build_ppl_Linear_Expression(value e) {
+  switch (Tag_val(e)) {
+  case 0:
+    // Variable
+    return Variable(Long_val(Field(e, 0)));
+  case 1: {
+    // Coefficient
+    mpz_class z((__mpz_struct*) Data_custom_val(Field(e, 0)));
+    return Linear_Expression(Coefficient(z));
+  }
+  case 2:
+    // Unary_Plus
+    return build_ppl_Linear_Expression(Field(e, 0));
+  case 3:
+    // Unary_Minus
+    return -build_ppl_Linear_Expression(Field(e, 0));
+  case 4:
+    // Plus
+    return build_ppl_Linear_Expression(Field(e, 0))
+      + build_ppl_Linear_Expression(Field(e, 1));
+  case 5:
+    // Minus
+    return build_ppl_Linear_Expression(Field(e, 0))
+      - build_ppl_Linear_Expression(Field(e, 1));
+  case 6: {
+    // Times
+    mpz_class z((__mpz_struct*) Data_custom_val(Field(e, 0)));
+    return Coefficient(z) * build_ppl_Linear_Expression(Field(e, 1));
+  }
+  default:
+    caml_invalid_argument("Error building PPL::Linear_Expression");
+  }
+}
+
+Relation_Symbol
+build_ppl_relsym(value caml_relsym) {
+  switch (Int_val(caml_relsym)) {
+  case 0: {
+    return LESS_THAN;
+  }
+  case 1: {
+    return LESS_OR_EQUAL;
+  }
+ case 2: {
+   return EQUAL;
+ }
+  case 3: {
+    return GREATER_OR_EQUAL;
+  }
+  case 4: {
+    return GREATER_THAN;
+  }
+ default:
+    ;
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Caml interface internal error");
+  }
+
+Optimization_Mode
+build_ppl_opt_mode(value caml_opt_mode) {
+  switch (Int_val(caml_opt_mode)) {
+  case 0: {
+    return MINIMIZATION;
+  }
+  case 1: {
+    return MAXIMIZATION;
+  }
+ default:
+    ;
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Caml interface internal error");
+  }
+
+Degenerate_Element
+build_ppl_degenerate_element(value caml_degenerate_element) {
+  switch (Int_val(caml_degenerate_element)) {
+  case 0: {
+    return UNIVERSE;
+  }
+  case 1: {
+    return EMPTY;
+  }
+ default:
+    ;
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Caml interface internal error");
+  }
+
+
+Variables_Set
+build_ppl_Variables_Set(value caml_vset) {
+ Variables_Set ppl_vset;
+  if (Int_val(caml_vset) == 0)
+    return ppl_vset;
+  while (true) {
+    ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+    if (Int_val(Field(caml_vset, 1)) == 0)
+      break;
+    caml_vset = Field(caml_vset, 1);
+  }
+  return ppl_vset;
+}
+
+Constraint
+build_ppl_Constraint(value c) {
+  value e1 = Field(c, 0);
+  value e2 = Field(c, 1);
+  switch (Tag_val(c)) {
+  case 0:
+    // Less_Than
+    return build_ppl_Linear_Expression(e1) < build_ppl_Linear_Expression(e2);
+  case 1:
+    // Less_Or_Equal
+    return build_ppl_Linear_Expression(e1) <= build_ppl_Linear_Expression(e2);
+  case 2:
+    // Equal
+    return build_ppl_Linear_Expression(e1) == build_ppl_Linear_Expression(e2);
+  case 3:
+    // Greater_Than
+    return build_ppl_Linear_Expression(e1) > build_ppl_Linear_Expression(e2);
+  case 4:
+    // Greater_Or_Equal
+    return build_ppl_Linear_Expression(e1) >= build_ppl_Linear_Expression(e2);
+  default:
+    caml_invalid_argument("Error building PPL::Constraint");
+  }
+}
+
+
+template <typename R>
+CAMLprim value
+get_inhomogeneous_term(const R& r) {
+  TEMP_INTEGER(coeff);
+  neg_assign(coeff, r.inhomogeneous_term());
+  value coeff_term = caml_alloc(1,1);
+  Field(coeff_term, 0) = build_caml_coefficient(coeff);
+  return coeff_term;
+}
+
+// Takes from constraints, generators... the embedded linear
+// expression.
+template <typename R>
+CAMLprim value
+get_linear_expression(const R& r) {
+  dimension_type space_dimension = r.space_dimension();
+  dimension_type varid = 0;
+  TEMP_INTEGER(coeff);
+  while (varid < space_dimension
+	 && (coeff = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    value zero_term = caml_alloc(1,1);
+    value zero_mpz = alloc_mpz();
+    mpz_init_set_ui(*mpz_val(zero_mpz), 0);
+    Field(zero_term, 0) = zero_mpz;
+    return zero_term;
+  }
+  else {
+    value term1 = caml_alloc(2,6);
+    TEMP_INTEGER(ppl_coeff);
+    ppl_coeff = r.coefficient(Variable(varid));
+    Field(term1, 0) = build_caml_coefficient(ppl_coeff);
+    value ml_le_var1 = caml_alloc(1,0);
+    Field(ml_le_var1, 0) = Val_int(varid);
+    Field(term1, 1) = ml_le_var1;
+    while (true) {
+      ++varid;
+      value sum;
+      while (varid < space_dimension
+	     && (coeff = r.coefficient(Variable(varid))) == 0)
+	++varid;
+      if (varid >= space_dimension)
+	return term1;
+      else {
+	sum = caml_alloc(2,4);
+	value term2 = caml_alloc(2,6);
+	ppl_coeff = r.coefficient(Variable(varid));
+	Field(term2, 0) = build_caml_coefficient(ppl_coeff);
+	value ml_le_var2 = caml_alloc(1,0);
+	Field(ml_le_var2, 0) = Val_int(varid);
+	Field(term2, 1) = ml_le_var2;
+	Field(sum, 0) = term1;
+	Field(sum, 1) = term2;
+	term1 = sum;
+      }
+    }
+  }
+}
+
+value
+build_caml_generator(const Generator& ppl_generator) {
+  switch (ppl_generator.type()) {
+  case Generator::LINE: {
+    // Store the linear expression. (1,0) stands for
+    // allocate one block (the linear expression) with Tag 0 (a line here).
+    value caml_generator = caml_alloc(1,0);
+    Field(caml_generator, 0) = get_linear_expression(ppl_generator);
+    return caml_generator;
+  }
+  case Generator::RAY: {
+    value caml_generator = caml_alloc(1,1);
+    Field(caml_generator, 0) = get_linear_expression(ppl_generator);
+    return caml_generator;
+  }
+  case Generator::POINT: {
+    // Allocates two blocks (the linear expression and the divisor)
+    // of tag 2 (Point).
+    value caml_generator = caml_alloc(2,2);
+    Field(caml_generator, 0) = get_linear_expression(ppl_generator);
+    const Coefficient& divisor = ppl_generator.divisor();
+    Field(caml_generator, 1) = build_caml_coefficient(divisor);
+    return caml_generator;
+  }
+  case Generator::CLOSURE_POINT:  {
+    value caml_generator = caml_alloc(2,3);
+    Field(caml_generator, 0) = get_linear_expression(ppl_generator);
+    const Coefficient& divisor = ppl_generator.divisor();
+    Field(caml_generator, 1) =  build_caml_coefficient(divisor);
+    return caml_generator;
+  }
+  default:
+    throw std::runtime_error("PPL OCaml interface internal error");
+  }
+}
+
+
+value
+build_caml_grid_generator(const Grid_Generator& ppl_grid_generator) {
+  switch (ppl_grid_generator.type()) {
+  case Grid_Generator::LINE: {
+    // Store the linear expression. (1,0) stands for
+    // allocate one block (the linear expression) with Tag 0 (a line here).
+    value caml_generator = caml_alloc(1,0);
+    Field(caml_generator, 0) = get_linear_expression(ppl_grid_generator);
+    return caml_generator;
+  }
+  case Grid_Generator::PARAMETER: {
+    value caml_generator = caml_alloc(2,1);
+    Field(caml_generator, 0) = get_linear_expression(ppl_grid_generator);
+    const Coefficient& divisor = ppl_grid_generator.divisor();
+    Field(caml_generator, 1) = build_caml_coefficient(divisor);
+    return caml_generator;
+  }
+  case Grid_Generator::POINT: {
+    // Allocates two blocks (the linear expression and the divisor)
+    // of tag 2 (Point).
+    value caml_generator = caml_alloc(2,2);
+    Field(caml_generator, 0) = get_linear_expression(ppl_grid_generator);
+    const Coefficient& divisor = ppl_grid_generator.divisor();
+    Field(caml_generator, 1) = build_caml_coefficient(divisor);
+    return caml_generator;
+  }
+
+  default:
+    throw std::runtime_error("PPL OCaml interface internal error");
+  }
+}
+
+value
+build_caml_constraint(const Constraint& ppl_constraint) {
+  switch (ppl_constraint.type()) {
+  case Constraint::EQUALITY: {
+    value caml_constraint = caml_alloc(2,2);
+    Field(caml_constraint, 0) = get_linear_expression(ppl_constraint);
+    Field(caml_constraint, 1) = get_inhomogeneous_term(ppl_constraint);
+    return caml_constraint;
+  }
+  case Constraint::STRICT_INEQUALITY: {
+    value caml_constraint = caml_alloc(2,3);
+    Field(caml_constraint, 0) = get_linear_expression(ppl_constraint);
+    Field(caml_constraint, 1) = get_inhomogeneous_term(ppl_constraint);
+    return caml_constraint;
+  }
+  case Constraint::NONSTRICT_INEQUALITY: {
+    value caml_constraint = caml_alloc(2,4);
+    Field(caml_constraint, 0) = get_linear_expression(ppl_constraint);
+    Field(caml_constraint, 1) = get_inhomogeneous_term(ppl_constraint);
+    return caml_constraint;
+  }
+  default:
+    throw std::runtime_error("PPL OCaml interface internal error");
+  }
+}
+
+value
+build_caml_congruence(const Congruence& ppl_congruence) {
+    value caml_congruence = caml_alloc(3,0);
+    Field(caml_congruence, 0) = get_linear_expression(ppl_congruence);
+    Field(caml_congruence, 1) = get_inhomogeneous_term(ppl_congruence);
+    const Coefficient& modulus = ppl_congruence.modulus();
+    Field(caml_congruence, 2) = build_caml_coefficient(modulus);
+    return caml_congruence;
+}
+
+value
+build_caml_congruence_system(const Congruence_System& ppl_cgs) {
+  // This code builds a list of constraints starting from bottom to
+  // top. A list on OCaml must be built like a sequence of Cons and Tail.
+  // The first element is the Nil list (the Val_int(0)).
+  value result = Val_int(0);
+  for (Congruence_System::const_iterator v_begin = ppl_cgs.begin(),
+  	 v_end = ppl_cgs.end(); v_begin != v_end; ++v_begin) {
+    value new_tail = caml_alloc_tuple(2);
+    Field(new_tail, 0) = build_caml_congruence(*v_begin);
+    Field(new_tail, 1) = result;
+    result = new_tail;
+  }
+  return result;
+}
+
+value
+build_caml_constraint_system(const Constraint_System& ppl_cs) {
+  // This code builds a list of constraints starting from bottom to
+  // top. A list on OCaml must be built like a sequence of Cons and Tail.
+  // The first element is the Nil list (the Val_int(0)).
+  value result = Val_int(0);
+  for (Constraint_System::const_iterator v_begin = ppl_cs.begin(),
+  	 v_end = ppl_cs.end(); v_begin != v_end; ++v_begin) {
+    value new_tail = caml_alloc_tuple(2);
+    Field(new_tail, 0) = build_caml_constraint(*v_begin);
+    Field(new_tail, 1) = result;
+    result = new_tail;
+  }
+  return result;
+}
+
+value
+build_caml_generator_system(const Generator_System& ppl_gs) {
+  value result = Val_int(0);
+  for (Generator_System::const_iterator v_begin = ppl_gs.begin(),
+  	 v_end = ppl_gs.end(); v_begin != v_end; ++v_begin) {
+    value new_tail = caml_alloc_tuple(2);
+    Field(new_tail, 0) = build_caml_generator(*v_begin);
+    Field(new_tail, 1) = result;
+    result = new_tail;
+  }
+  return result;
+}
+
+value
+build_caml_grid_generator_system(const Grid_Generator_System& ppl_gs) {
+  value result = Val_int(0);
+  for (Grid_Generator_System::const_iterator v_begin = ppl_gs.begin(),
+  	 v_end = ppl_gs.end(); v_begin != v_end; ++v_begin) {
+    value new_tail = caml_alloc_tuple(2);
+    Field(new_tail, 0) = build_caml_grid_generator(*v_begin);
+    Field(new_tail, 1) = result;
+    result = new_tail;
+  }
+  return result;
+}
+
+value
+build_ocaml_poly_gen_relation(Poly_Gen_Relation& r) {
+  value result = Val_int(0);
+  value cons;
+  while (r != Poly_Gen_Relation::nothing()) {
+    if (r.implies(Poly_Gen_Relation::subsumes())) {
+      cons = caml_alloc_tuple(2);
+      Field(cons, 0) = Val_int(0);
+      Field(cons, 1) = result;
+      result = cons;
+      r = r - Poly_Gen_Relation::subsumes();
+    }
+  }
+  return result;
+}
+
+value
+build_ocaml_poly_con_relation(Poly_Con_Relation& r) {
+  value result = Val_int(0);
+  value cons;
+  while (r != Poly_Con_Relation::nothing()) {
+    if (r.implies(Poly_Con_Relation::is_disjoint())) {
+      cons = caml_alloc_tuple(2);
+      Field(cons, 0) = Val_int(0);
+      Field(cons, 1) = result;
+      result = cons;
+      r = r - Poly_Con_Relation::is_disjoint();
+    }
+    else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+      cons = caml_alloc_tuple(2);
+      Field(cons, 0) = Val_int(1);
+      Field(cons, 1) = result;
+      result = cons;
+      r = r - Poly_Con_Relation::strictly_intersects();
+    }
+    else if (r.implies(Poly_Con_Relation::is_included())) {
+      cons = caml_alloc_tuple(2);
+      Field(cons, 0) = Val_int(2);
+      Field(cons, 1) = result;
+      result = cons;
+      r = r - Poly_Con_Relation::is_included();
+    }
+    else if (r.implies(Poly_Con_Relation::saturates())) {
+      cons = caml_alloc_tuple(2);
+      Field(cons, 0) = Val_int(3);
+      Field(cons, 1) = result;
+      result = cons;
+      r = r - Poly_Con_Relation::saturates();
+    }
+  }
+  return result;
+}
+
+
+Congruence
+build_ppl_Congruence(value c) {
+  value e1 = Field(c, 0);
+  value e2 = Field(c, 1);
+  mpz_class z((__mpz_struct*) Data_custom_val(Field(c, 2)));
+  Linear_Expression lhs = build_ppl_Linear_Expression(e1);
+  Linear_Expression rhs = build_ppl_Linear_Expression(e2);
+  return ((lhs %= rhs) / z);
+}
+
+Generator
+build_ppl_Generator(value g) {
+  switch (Tag_val(g)) {
+  case 0:
+    // Line
+    return Generator::line(build_ppl_Linear_Expression(Field(g, 0)));
+  case 1:
+    // Ray
+    return Generator::ray(build_ppl_Linear_Expression(Field(g, 0)));
+  case 2: {
+    // Point
+    mpz_class z((__mpz_struct*) Data_custom_val(Field(g, 1)));
+    return Generator::point(build_ppl_Linear_Expression(Field(g, 0)),
+			    Coefficient(z));
+  }
+  case 3: {
+    // Closure_point
+    mpz_class z((__mpz_struct*) Data_custom_val(Field(g, 1)));
+    return Generator::closure_point(build_ppl_Linear_Expression(Field(g, 0)),
+				    Coefficient(z));
+  }
+  default:
+    caml_invalid_argument("Error building PPL::Constraint");
+  }
+}
+
+Grid_Generator
+build_ppl_Grid_Generator(value g) {
+  switch (Tag_val(g)) {
+   case 0:
+     // Line
+     return grid_line(build_ppl_Linear_Expression(Field(g, 0)));
+   case 1: {
+     // Parameter
+     mpz_class z((__mpz_struct*) Data_custom_val(Field(g, 1)));
+     return parameter(build_ppl_Linear_Expression(Field(g, 0)),
+		      Coefficient(z));
+   }
+   case 2: {
+     // Point
+     mpz_class z((__mpz_struct*) Data_custom_val(Field(g, 1)));
+     return grid_point(build_ppl_Linear_Expression(Field(g, 0)),
+		       Coefficient(z));
+   }
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Caml interface internal error");
+}
+Constraint_System
+build_ppl_Constraint_System(value cl) {
+  Constraint_System cs;
+  while (cl != Val_int(0)) {
+    cs.insert(build_ppl_Constraint(Field(cl, 0)));
+    cl = Field(cl, 1);
+  }
+  return cs;
+}
+
+Generator_System
+build_ppl_Generator_System(value gl) {
+  Generator_System gs;
+  while (gl != Val_int(0)) {
+    gs.insert(build_ppl_Generator(Field(gl, 0)));
+    gl = Field(gl, 1);
+  }
+  return gs;
+}
+
+Congruence_System
+build_ppl_Congruence_System(value cgl) {
+  Congruence_System cgs;
+  while (cgl != Val_int(0)) {
+    cgs.insert(build_ppl_Congruence(Field(cgl, 0)));
+    cgl = Field(cgl, 1);
+  }
+  return cgs;
+}
+
+Grid_Generator_System
+build_ppl_Grid_Generator_System(value caml_ggs) {
+  Grid_Generator_System ggs;
+  while (caml_ggs != Val_int(0)) {
+    ggs.insert(build_ppl_Grid_Generator(Field(caml_ggs, 0)));
+    caml_ggs = Field(caml_ggs, 1);
+  }
+  return ggs;
+}
+
+//! Give access to the embedded MIP_Problem* in \p v.
+inline MIP_Problem*&
+p_MIP_Problem_val(value v) {
+  return *reinterpret_cast<MIP_Problem**>(Data_custom_val(v));
+}
+
+void
+custom_MIP_Problem_finalize(value v) {
+  delete p_MIP_Problem_val(v);
+}
+
+static struct custom_operations MIP_Problem_custom_operations = {
+  "it.unipr.cs.ppl" "." PPL_VERSION "." "MIP_Problem",
+  custom_MIP_Problem_finalize,
+  custom_compare_default,
+  custom_hash_default,
+  custom_serialize_default,
+  custom_deserialize_default
+};
+
+inline value
+val_p_MIP_Problem(const MIP_Problem& ph) {
+  value v = caml_alloc_custom(&MIP_Problem_custom_operations,
+			      sizeof(MIP_Problem*), 0, 1);
+  p_MIP_Problem_val(v) = const_cast<MIP_Problem*>(&ph);
+  return(v);
+}
+
+extern "C"
+CAMLprim value
+ppl_new_MIP_Problem_from_space_dimension(value d) try {
+  CAMLparam1(d);
+  int dd = Int_val(d);
+  if (dd < 0)
+    abort();
+  CAMLreturn(val_p_MIP_Problem(*new MIP_Problem(dd)));
+}
+CATCH_ALL
+extern "C"
+CAMLprim value
+ppl_new_MIP_Problem(value d, value caml_cs, value caml_cost,
+		    value caml_opt_mode) try {
+  CAMLparam4(d, caml_cs, caml_cost, caml_opt_mode);
+  int dd = Int_val(d);
+  if (dd < 0)
+    abort();
+  Constraint_System ppl_cs = build_ppl_Constraint_System(caml_cs);
+  Linear_Expression ppl_cost = build_ppl_Linear_Expression(caml_cost);
+  Optimization_Mode ppl_opt_mode = build_ppl_opt_mode(caml_opt_mode);
+  CAMLreturn(val_p_MIP_Problem(*new MIP_Problem(dd, ppl_cs, ppl_cost,
+						ppl_opt_mode)));
+}
+CATCH_ALL
+
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_space_dimension(value ph) try {
+  CAMLparam1(ph);
+  const MIP_Problem& pph = *p_MIP_Problem_val(ph);
+  dimension_type d = pph.space_dimension();
+  if (d > INT_MAX)
+    abort();
+  CAMLreturn(Val_int(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_constraints(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  const MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  Constraint_System cs;
+  for (MIP_Problem::const_iterator cs_it = ppl_mip.constraints_begin(),
+	 cs_end = ppl_mip.constraints_end(); cs_it != cs_end; ++cs_it) {
+    cs.insert(*cs_it);
+  }
+  CAMLreturn(build_caml_constraint_system(cs));
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_add_space_dimensions_and_embed(value caml_mip, value dim) try {
+  CAMLparam2(caml_mip, dim);
+  dimension_type ppl_dim = Int_val(dim);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_space_dimensions_and_embed(ppl_dim);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_add_to_integer_space_dimensions(value caml_mip,
+						value caml_ivars) try {
+  CAMLparam2(caml_mip, caml_ivars);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_to_integer_space_dimensions(build_ppl_Variables_Set(caml_ivars));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_add_constraint(value caml_mip,
+			       value caml_constraint) try {
+  CAMLparam2(caml_mip, caml_constraint);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_constraint(build_ppl_Constraint(caml_constraint));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_add_constraints(value caml_mip,
+			       value caml_constraints) try {
+  CAMLparam2(caml_mip, caml_constraints);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_constraints(build_ppl_Constraint_System(caml_constraints));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_set_objective_function(value caml_mip,
+				       value caml_cost) try {
+  CAMLparam2(caml_mip, caml_cost);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.set_objective_function(build_ppl_Linear_Expression(caml_cost));
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_is_satisfiable(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(ppl_mip.is_satisfiable());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_solve(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  MIP_Problem_Status mip_status = ppl_mip.solve();
+  switch (mip_status) {
+  case UNFEASIBLE_MIP_PROBLEM:
+    CAMLreturn(Val_int(0));
+  case UNBOUNDED_MIP_PROBLEM:
+    CAMLreturn(Val_int(1));
+  case OPTIMIZED_MIP_PROBLEM:
+    CAMLreturn(Val_int(2));
+  default:
+    ;
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Caml interface internal error");
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimization_mode(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  Optimization_Mode opt_mode = ppl_mip.optimization_mode();
+  switch (opt_mode) {
+  case MINIMIZATION:
+    CAMLreturn(Val_int(0));
+  case MAXIMIZATION:
+    CAMLreturn(Val_int(1));
+  default:
+    ;
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL Caml interface internal error");
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_feasible_point(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(build_caml_generator(ppl_mip.feasible_point()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimizing_point(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(build_caml_generator(ppl_mip.optimizing_point()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimal_value(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  ppl_mip.optimal_value(num, den);
+  value caml_return_value = caml_alloc(2,0);
+  Field(caml_return_value, 0) = build_caml_coefficient(num);
+  Field(caml_return_value, 1) = build_caml_coefficient(den);
+  CAMLreturn(caml_return_value);
+
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_evaluate_objective_function(value caml_mip,
+					    value caml_generator) try {
+  CAMLparam2(caml_mip, caml_generator);
+  Generator g = build_ppl_Generator(caml_generator);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  ppl_mip.evaluate_objective_function(g, num, den);
+  value caml_return_value = caml_alloc(2,0);
+  Field(caml_return_value, 0) = build_caml_coefficient(num);
+  Field(caml_return_value, 1) = build_caml_coefficient(den);
+  CAMLreturn(caml_return_value);
+
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_OK(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(ppl_mip.OK());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_objective_function
+(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  TEMP_INTEGER(inhomogeneous_term);
+  inhomogeneous_term = ppl_mip.objective_function().inhomogeneous_term();
+  value homogeneous_term = get_linear_expression(ppl_mip.objective_function());
+  value inhom_term
+    = build_caml_coefficient(ppl_mip.objective_function().inhomogeneous_term());
+  value sum = caml_alloc(2,4);
+  value coeff = caml_alloc(1,1);
+  Field(coeff, 0) = inhom_term;
+  Field(sum, 0) = homogeneous_term;
+  Field(sum, 1) = coeff;
+  CAMLreturn(sum);
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_clear(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.clear();
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_set_optimization_mode(value caml_mip, value caml_opt_mode) try{
+  CAMLparam2(caml_mip, caml_opt_mode);
+  Optimization_Mode ppl_opt_mode= build_ppl_opt_mode(caml_opt_mode);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.set_optimization_mode(ppl_opt_mode);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+extern "C"
+void
+ppl_MIP_Problem_swap(value caml_mip1, value caml_mip2) try{
+  CAMLparam2(caml_mip1, caml_mip2);
+  MIP_Problem& ppl_mip1 = *p_MIP_Problem_val(caml_mip1);
+  MIP_Problem& ppl_mip2 = *p_MIP_Problem_val(caml_mip2);
+  ppl_mip1.swap(ppl_mip2);
+  CAMLreturn0;
+}
+CATCH_ALL
+
+
+// FIXME: what is this?
+#if 0
+void
+ppl_error_out_of_memory() {
+  caml_raise_out_of_memory();
+}
+
+void
+ppl_error_invalid_argument() {
+  caml_raise_constant(*caml_named_value("invalid_argument"));
+}
+
+void
+ppl_arithmetic_overflow() {
+  caml_raise_constant(*caml_named_value("arithmetic_overflow"));
+}
+
+void
+ppl_stdio_error() {
+  caml_raise_constant(*caml_named_value("stdio_error"));
+}
+
+void
+ppl_internal_error() {
+  caml_raise_constant(*caml_named_value("internal_error"));
+}
+
+void
+ppl_unknow_standard_exception() {
+  caml_raise_constant(*caml_named_value("standard_exception"));
+}
+
+void
+ppl_error_unexpected_error() {
+  caml_raise_constant(*caml_named_value("unexpected_error"));
+}
+#endif
diff --git a/interfaces/OCaml/ppl_ocaml_globals.ml b/interfaces/OCaml/ppl_ocaml_globals.ml
new file mode 100644
index 0000000..d87cd22
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_globals.ml
@@ -0,0 +1,107 @@
+(* FIXME: to be written.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . *)
+
+open Ppl_ocaml_types
+open Gmp
+type mip_problem
+
+external ppl_new_MIP_Problem_from_space_dimension:
+  int -> mip_problem = "ppl_new_MIP_Problem_from_space_dimension"
+
+external ppl_new_MIP_Problem:
+      int -> constraint_system -> linear_expression
+	-> optimization_mode -> mip_problem
+	  = "ppl_new_MIP_Problem"
+
+external ppl_MIP_Problem_space_dimension:
+  mip_problem -> int = "ppl_MIP_Problem_space_dimension"
+
+external ppl_MIP_Problem_constraints:
+  mip_problem -> constraint_system = "ppl_MIP_Problem_constraints"
+
+external ppl_MIP_Problem_add_space_dimensions_and_embed:
+  mip_problem -> int -> unit
+      = "ppl_MIP_Problem_add_space_dimensions_and_embed"
+
+external ppl_MIP_Problem_add_to_integer_space_dimensions:
+  mip_problem -> int list -> unit
+      = "ppl_MIP_Problem_add_to_integer_space_dimensions"
+
+external ppl_MIP_Problem_add_constraint:
+  mip_problem -> linear_constraint -> unit
+      = "ppl_MIP_Problem_add_constraint"
+
+external ppl_MIP_Problem_add_constraints:
+  mip_problem -> constraint_system -> unit
+      = "ppl_MIP_Problem_add_constraints"
+
+external ppl_MIP_Problem_set_objective_function:
+  mip_problem -> linear_expression -> unit
+      = "ppl_MIP_Problem_set_objective_function"
+
+external ppl_MIP_Problem_is_satisfiable:
+  mip_problem -> bool
+      = "ppl_MIP_Problem_is_satisfiable"
+
+external ppl_MIP_Problem_solve:
+  mip_problem -> mip_problem_status
+      = "ppl_MIP_Problem_solve"
+
+external ppl_MIP_Problem_optimization_mode:
+  mip_problem -> optimization_mode
+      = "ppl_MIP_Problem_optimization_mode"
+
+external ppl_MIP_Problem_feasible_point:
+  mip_problem -> linear_generator
+      = "ppl_MIP_Problem_feasible_point"
+
+external ppl_MIP_Problem_optimizing_point:
+  mip_problem -> linear_generator
+      = "ppl_MIP_Problem_optimizing_point"
+
+external ppl_MIP_Problem_objective_function:
+  mip_problem -> linear_expression
+      = "ppl_MIP_Problem_objective_function"
+
+external ppl_MIP_Problem_optimal_value:
+  mip_problem -> Z.t * Z.t
+      = "ppl_MIP_Problem_optimal_value"
+
+external ppl_MIP_Problem_evaluate_objective_function:
+  mip_problem -> linear_generator  -> Z.t * Z.t
+      = "ppl_MIP_Problem_evaluate_objective_function"
+
+external ppl_MIP_Problem_OK:
+  mip_problem -> bool
+      = "ppl_MIP_Problem_OK"
+
+external ppl_MIP_Problem_clear:
+  mip_problem -> unit
+      = "ppl_MIP_Problem_clear"
+
+external ppl_MIP_Problem_set_optimization_mode:
+  mip_problem -> optimization_mode -> unit
+      = "ppl_MIP_Problem_set_optimization_mode"
+
+external ppl_MIP_Problem_swap:
+  mip_problem -> mip_problem -> unit
+      = "ppl_MIP_Problem_swap"
diff --git a/interfaces/OCaml/ppl_ocaml_types.ml b/interfaces/OCaml/ppl_ocaml_types.ml
new file mode 100644
index 0000000..d658351
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_types.ml
@@ -0,0 +1,87 @@
+(* FIXME: to be written.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . *)
+
+open Gmp
+
+type degenerate_element =
+    Universe
+  | Empty
+
+type linear_expression =
+    Variable of int
+  | Coefficient of Z.t
+  | Unary_Plus of linear_expression
+  | Unary_Minus of linear_expression
+  | Plus of linear_expression * linear_expression
+  | Minus of linear_expression * linear_expression
+  | Times of Z.t * linear_expression
+
+type linear_constraint =
+    Less_Than of linear_expression * linear_expression
+  | Less_Or_Equal of linear_expression * linear_expression
+  | Equal of linear_expression * linear_expression
+  | Greater_Than of linear_expression * linear_expression
+  | Greater_Or_Equal of linear_expression * linear_expression
+
+type linear_generator =
+    Line of linear_expression
+  | Ray of linear_expression
+  | Point of linear_expression * Z.t
+  | Closure_Point of linear_expression * Z.t
+
+type linear_grid_generator =
+    Grid_Line of linear_expression
+  | Grid_Parameter of linear_expression * Z.t
+  | Grid_Point of linear_expression * Z.t
+
+type poly_gen_relation =
+    Subsumes
+
+type poly_con_relation =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+  | Saturates
+
+type relation_with_congruence =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+
+type linear_congruence = linear_expression * linear_expression * Z.t
+
+type constraint_system = linear_constraint list
+
+type generator_system = linear_generator list
+
+type grid_generator_system = linear_grid_generator list
+
+type congruence_system = linear_congruence list
+
+(* Declared temporarily in this way to avoid name clashes. *)
+type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS
+                       | Greater_Than_RS | Greater_Or_Equal_RS
+
+type optimization_mode = Minimization | Maximization
+
+type mip_problem_status = Unfeasible_Mip_Problem | Unbounded_Mip_Problem
+                        | Optimized_Mip_Problem
diff --git a/interfaces/OCaml/tests/Makefile.am b/interfaces/OCaml/tests/Makefile.am
new file mode 100644
index 0000000..76c070d
--- /dev/null
+++ b/interfaces/OCaml/tests/Makefile.am
@@ -0,0 +1,97 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4
+
+if BUILD_OCAML_INTERFACE
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4 \
+ppl_ocaml_tests_common
+
+# Even if the OCaml sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake OCaml build system.
+EXTRA_DIST = \
+ppl_interface_generator_ocaml_test_ml_code.m4 \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_ocaml_tests_common
+
+OCAMLC_COMPILE_FLAGS = \
+-I +gmp -I $(srcdir) -I .. \
+-ccopt -g
+
+OCAMLC_LINK_FLAGS = \
+`echo " -L$(top_builddir)/src/.libs -lppl $(extra_libraries) " | sed -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+.ml.cmo:
+	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) $<
+
+TESTS_ENVIRONMENT = \
+	$(LIBTOOL) --mode=execute \
+		 -dlopen ../../../src/libppl.la $(WATCHDOG_DLOPEN)
+
+TESTS = \
+test1 \
+ppl_ocaml_generated_test
+
+check_PROGRAMS = $(TESTS)
+
+test1_SOURCES = test1.ml
+
+test1$(EXEEXT): test1.cmo
+	ocamlc -o $@ -cc g++ -g -custom $(OCAMLC_COMPILE_FLAGS) \
+		ppl_ocaml.cma gmp.cma \
+		$(OCAMLC_LINK_FLAGS) $<
+
+
+nodist_ppl_ocaml_generated_test_SOURCES = ppl_ocaml_generated_test.ml
+
+ppl_ocaml_generated_test.ml: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_ocaml_test_ml.m4 \
+			> $@
+
+ppl_ocaml_generated_test$(EXEEXT): ppl_ocaml_generated_test.cmo
+	ocamlc -o $@ -cc g++ -g -custom $(OCAMLC_COMPILE_FLAGS) \
+		ppl_ocaml.cma gmp.cma \
+		$(OCAMLC_LINK_FLAGS) $<
+
+endif BUILD_OCAML_INTERFACE
+
+CLEANFILES = \
+test1.cmi \
+test1.cmo \
+test1 \
+ppl_ocaml_generated_test.ml \
+ppl_ocaml_generated_test.cmi \
+ppl_ocaml_generated_test.cmo \
+ppl_ocaml_generated_test
diff --git a/interfaces/OCaml/tests/Makefile.in b/interfaces/OCaml/tests/Makefile.in
new file mode 100644
index 0000000..0f5174b
--- /dev/null
+++ b/interfaces/OCaml/tests/Makefile.in
@@ -0,0 +1,609 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_OCAML_INTERFACE_TRUE@TESTS = test1$(EXEEXT) \
+ at BUILD_OCAML_INTERFACE_TRUE@	ppl_ocaml_generated_test$(EXEEXT)
+ at BUILD_OCAML_INTERFACE_TRUE@check_PROGRAMS = $(am__EXEEXT_1)
+subdir = interfaces/OCaml/tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+ at BUILD_OCAML_INTERFACE_TRUE@am__EXEEXT_1 = test1$(EXEEXT) \
+ at BUILD_OCAML_INTERFACE_TRUE@	ppl_ocaml_generated_test$(EXEEXT)
+nodist_ppl_ocaml_generated_test_OBJECTS =
+ppl_ocaml_generated_test_OBJECTS =  \
+	$(nodist_ppl_ocaml_generated_test_OBJECTS)
+ppl_ocaml_generated_test_LDADD = $(LDADD)
+am__test1_SOURCES_DIST = test1.ml
+am_test1_OBJECTS =
+test1_OBJECTS = $(am_test1_OBJECTS)
+test1_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(nodist_ppl_ocaml_generated_test_SOURCES) $(test1_SOURCES)
+DIST_SOURCES = $(am__test1_SOURCES_DIST)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+interface_generator_files = \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4
+
+ at BUILD_OCAML_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_OCAML_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@../ppl_interface_generator_ocaml_procedure_generators.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_test_ml.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_test_ml_code.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_tests_common
+
+
+# Even if the OCaml sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake OCaml build system.
+ at BUILD_OCAML_INTERFACE_TRUE@EXTRA_DIST = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_test_ml_code.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_interface_generator_ocaml_test_ml.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_tests_common
+
+ at BUILD_OCAML_INTERFACE_TRUE@OCAMLC_COMPILE_FLAGS = \
+ at BUILD_OCAML_INTERFACE_TRUE@-I +gmp -I $(srcdir) -I .. \
+ at BUILD_OCAML_INTERFACE_TRUE@-ccopt -g
+
+ at BUILD_OCAML_INTERFACE_TRUE@OCAMLC_LINK_FLAGS = \
+ at BUILD_OCAML_INTERFACE_TRUE@`echo " -L$(top_builddir)/src/.libs -lppl $(extra_libraries) " | sed -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+ at BUILD_OCAML_INTERFACE_TRUE@TESTS_ENVIRONMENT = \
+ at BUILD_OCAML_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_OCAML_INTERFACE_TRUE@		 -dlopen ../../../src/libppl.la $(WATCHDOG_DLOPEN)
+
+ at BUILD_OCAML_INTERFACE_TRUE@test1_SOURCES = test1.ml
+ at BUILD_OCAML_INTERFACE_TRUE@nodist_ppl_ocaml_generated_test_SOURCES = ppl_ocaml_generated_test.ml
+CLEANFILES = \
+test1.cmi \
+test1.cmo \
+test1 \
+ppl_ocaml_generated_test.ml \
+ppl_ocaml_generated_test.cmi \
+ppl_ocaml_generated_test.cmo \
+ppl_ocaml_generated_test
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cmo .ml
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/OCaml/tests/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/OCaml/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ at BUILD_OCAML_INTERFACE_FALSE@ppl_ocaml_generated_test$(EXEEXT): $(ppl_ocaml_generated_test_OBJECTS) $(ppl_ocaml_generated_test_DEPENDENCIES) 
+ at BUILD_OCAML_INTERFACE_FALSE@	@rm -f ppl_ocaml_generated_test$(EXEEXT)
+ at BUILD_OCAML_INTERFACE_FALSE@	$(LINK) $(ppl_ocaml_generated_test_OBJECTS) $(ppl_ocaml_generated_test_LDADD) $(LIBS)
+ at BUILD_OCAML_INTERFACE_FALSE@test1$(EXEEXT): $(test1_OBJECTS) $(test1_DEPENDENCIES) 
+ at BUILD_OCAML_INTERFACE_FALSE@	@rm -f test1$(EXEEXT)
+ at BUILD_OCAML_INTERFACE_FALSE@	$(LINK) $(test1_OBJECTS) $(test1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool distclean \
+	distclean-compile distclean-generic distclean-libtool distdir \
+	dvi dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am
+
+
+ at BUILD_OCAML_INTERFACE_TRUE@.ml.cmo:
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -g -c $(OCAMLC_COMPILE_FLAGS) $<
+
+ at BUILD_OCAML_INTERFACE_TRUE@test1$(EXEEXT): test1.cmo
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -cc g++ -g -custom $(OCAMLC_COMPILE_FLAGS) \
+ at BUILD_OCAML_INTERFACE_TRUE@		ppl_ocaml.cma gmp.cma \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(OCAMLC_LINK_FLAGS) $<
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_generated_test.ml: $(interface_generator_dependencies)
+ at BUILD_OCAML_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. \
+ at BUILD_OCAML_INTERFACE_TRUE@		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(srcdir)/ppl_interface_generator_ocaml_test_ml.m4 \
+ at BUILD_OCAML_INTERFACE_TRUE@			> $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl_ocaml_generated_test$(EXEEXT): ppl_ocaml_generated_test.cmo
+ at BUILD_OCAML_INTERFACE_TRUE@	ocamlc -o $@ -cc g++ -g -custom $(OCAMLC_COMPILE_FLAGS) \
+ at BUILD_OCAML_INTERFACE_TRUE@		ppl_ocaml.cma gmp.cma \
+ at BUILD_OCAML_INTERFACE_TRUE@		$(OCAMLC_LINK_FLAGS) $<
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
new file mode 100644
index 0000000..b10d740
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
@@ -0,0 +1,64 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+dnl
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+m4_include(`ppl_interface_generator_ocaml_test_ml_code.m4')
+dnl
+dnl This file generates ppl_ocaml_test.ml.
+m4_divert`'
+m4_include(`ppl_ocaml_tests_common')
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Print name of domain being tested
+dnl ==================================================================
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+print_newline();;
+print_newline();;
+print_string "m4_current_interface";;
+print_newline();;
+m4_undefine(`m4_current_interface')`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_add_init_class_code($1),
+  m4_pattern_list)`'dnl
+')
+
+dnl ==================================================================
+dnl Test all methods
+dnl ==================================================================
+
+m4_divert`'dnl
+m4_all_code`'dnl
+
+print_newline();;
+at_exit Gc.full_major;;
+print_string "Bye!\n"
diff --git a/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
new file mode 100644
index 0000000..2fca8e1
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
@@ -0,0 +1,802 @@
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+m4_divert(-1)
+
+dnl Code for generating the domain elements to be used in the tests.
+dnl Note that if a test may change these at all, then a copy should be used.
+m4_define(`m4_add_init_class_code', `dnl
+let @LTOPOLOGY@@LCLASS at 01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at TOPOLOGY@@CLASS at _add_@CONSTRAINER at s
+  @LTOPOLOGY@@LCLASS at 01 @CONSTRAINER at s01;;
+let @LTOPOLOGY@@LCLASS at 02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at TOPOLOGY@@CLASS at _add_@CONSTRAINER at s
+  @LTOPOLOGY@@LCLASS at 02 @CONSTRAINER at s02;;
+let @LTOPOLOGY@@LCLASS at 03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at TOPOLOGY@@CLASS at _add_@CONSTRAINER at s
+  @LTOPOLOGY@@LCLASS at 03 @CONSTRAINER at s03;;
+print_newline();;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`
+print_string "testing ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension" ;;
+print_newline();;
+print_string ("space_dimension: ");;
+for i = 6 downto 0 do
+  (let @LTOPOLOGY@@LCLASS@
+    = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension i Empty
+    in let dimension
+       =  ppl_ at TOPOLOGY@@CLASS at _space_dimension(@LTOPOLOGY@@LCLASS@)
+       in printf "%d, " dimension)
+done;;
+print_newline();;
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`
+print_string "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@: " ;;
+let ps
+  = ppl_new_ at FRIEND@_from_space_dimension 3 Universe;;
+let ps1
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(ps);;
+let out = if (ppl_ at FRIEND@_OK ps & ppl_ at TOPOLOGY@@CLASS at _OK ps1)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`__ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`
+print_string
+  "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity: " ;;
+let ps
+  = ppl_new_ at FRIEND@_from_space_dimension 3 Universe;;
+let ps1
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps ;;
+let out = if (ppl_ at FRIEND@_OK ps & ppl_ at TOPOLOGY@@CLASS at _OK ps1)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`
+print_string "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s: " ;;
+let @LTOPOLOGY@@LCLASS@
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(@BUILD_REPRESENT at s1);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS@)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`
+print_string "testing ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let _result
+  =  ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@ copy01 copy02;;
+let out
+  = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01 & ppl_ at TOPOLOGY@@CLASS at _OK copy02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`
+print_string "testing ppl_ at CLASS@_swap: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _swap copy01 copy02;;
+let out
+  = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01 & ppl_ at TOPOLOGY@@CLASS at _OK copy02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`
+print_string "testing ppl_ at CLASS@_ at DIMENSION@: " ;;
+let dim
+  =  ppl_ at TOPOLOGY@@CLASS at _@DIMENSION@ @LTOPOLOGY@@LCLASS at 01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+printf "@DIMENSION@: %d" dim;;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`
+print_string "testing ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@: " ;;
+let _result
+  = ppl_ at TOPOLOGY@@CLASS at _relation_with_@RELATION_REPRESENT@
+    @LTOPOLOGY@@LCLASS at 01 @RELATION_REPRESENT at 1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`
+print_string "testing ppl_ at CLASS@_get_ at GET_REPRESENT@s: ";;
+let @GET_REPRESENT at s = ppl_ at TOPOLOGY@@CLASS at _get_@GET_REPRESENT at s
+  @LTOPOLOGY@@LCLASS at 01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+List.iter print_ at GET_REPRESENT@ @GET_REPRESENT at s;;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`
+print_string "testing ppl_ at CLASS@_ at HAS_PROPERTY@: ";;
+let result = ppl_ at TOPOLOGY@@CLASS at _@HAS_PROPERTY@ @LTOPOLOGY@@LCLASS at 01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+printf "@HAS_PROPERTY@: %b" result;;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`
+print_string "testing ppl_ at CLASS@_ at SIMPLIFY@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _@SIMPLIFY@ copy01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`
+print_string "testing ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@: " ;;
+let _result
+  =  ppl_ at TOPOLOGY@@CLASS at _bounds_from_above @LTOPOLOGY@@LCLASS at 01 e2;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`
+print_string "testing ppl_ at CLASS@_ at MAXMIN@: ";;
+let (is_bounded, num, den, is_supremum)
+  = ppl_ at TOPOLOGY@@CLASS at _@MAXMIN@ @LTOPOLOGY@@LCLASS at 01 e3;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+print_int(Z.to_int num);;
+print_string "/";;
+print_int(Z.to_int den);;
+print_string (", bound: ");;
+print_string (string_of_bool is_bounded);;
+print_string (", sup: ");;
+print_string (string_of_bool is_supremum);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`
+print_string "testing ppl_ at CLASS@_ at MAXMIN@_with_point: ";;
+let (is_bounded, num, den, is_supremum, pt)
+  = ppl_ at TOPOLOGY@@CLASS at _@MAXMIN at _with_point @LTOPOLOGY@@LCLASS at 01 e3;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+print_int(Z.to_int num);;
+print_string "/";;
+print_int(Z.to_int den);;
+print_string (", bound: ");;
+print_string (string_of_bool is_bounded);;
+print_string (", sup: ");;
+print_string (string_of_bool is_supremum);;
+print_string (", ");;
+print_generator(pt);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`
+print_string "testing ppl_ at CLASS@_ at COMPARISON@_ at CLASS@: " ;;
+let b = ppl_ at TOPOLOGY@@CLASS at _@COMPARISON at _@TOPOLOGY@@CLASS@
+  @LTOPOLOGY@@LCLASS at 01 @LTOPOLOGY@@LCLASS at 02;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01
+               & ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`
+print_string "testing ppl_ at CLASS@_equals_ at CLASS@: " ;;
+let b = ppl_ at TOPOLOGY@@CLASS at _equals_@TOPOLOGY@@CLASS@
+  @LTOPOLOGY@@LCLASS at 01 @LTOPOLOGY@@LCLASS at 02;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01
+               & ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`
+print_string "testing ppl_ at CLASS@_OK: ";;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01
+               & ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`
+print_string "testing ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT@ copy01 @ADD_REPRESENT at 1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`
+print_string
+  "testing ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at _and_minimize: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let b = ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at _and_minimize
+  copy01 @ADD_REPRESENT at 1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`
+print_string "testing ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s copy01 @ADD_REPRESENT at s1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`
+print_string
+  "testing ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s_and_minimize: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let b = ppl_ at TOPOLOGY@@CLASS at _add_@ADD_REPRESENT at s_and_minimize
+  copy01 @ADD_REPRESENT at s1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`
+print_string
+  "testing ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT@
+  copy01 @REFINE_REPRESENT at 01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`
+print_string
+  "testing ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT at s: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _refine_with_@REFINE_REPRESENT at s
+  copy01 @REFINE_REPRESENT at s01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`
+print_string "testing ppl_ at CLASS@_ at BINOP@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _@BINOP@ copy01 copy02;;
+let out
+  = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01 & ppl_ at TOPOLOGY@@CLASS at _OK copy02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`
+print_string "testing ppl_ at CLASS@_ at BINMINOP@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let b = ppl_ at TOPOLOGY@@CLASS at _@BINMINOP@ copy01 copy02;;
+let out
+  = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01 & ppl_ at TOPOLOGY@@CLASS at _OK copy02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`
+print_string "testing ppl_ at CLASS@_simplify_using_context_assign: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let b = ppl_ at TOPOLOGY@@CLASS at _simplify_using_context_assign copy01 copy02;;
+let out
+  = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01 & ppl_ at TOPOLOGY@@CLASS at _OK copy02)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`
+print_string "testing ppl_ at CLASS@_ at AFFIMAGE@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _@AFFIMAGE@ copy01 1 ((Z.of_int 2) */ v2) (Z.from_int 2);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`
+print_string "testing ppl_ at CLASS@_bounded_ at AFFIMAGE@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _bounded_@AFFIMAGE@ copy01 1
+  ((Z.of_int 2) */ v2) v2 (Z.from_int 10);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`
+print_string "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE@
+  copy01 1 Equal_RS v1 (Z.from_int 10);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`
+print_string "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _lhs_rhs
+  copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`
+print_string "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _with_congruence
+  copy01 1 Equal_RS v1 (Z.from_int 10);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+print_string "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _generalized_@AFFIMAGE at _lhs_rhs_with_congruence
+  copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7);;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`
+print_string "testing ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _add_space_dimensions_@EMBEDPROJECT@ copy01 2;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`
+print_string "testing ppl_ at CLASS@_remove_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let dimensions_to_remove = [2;0];;
+ppl_ at TOPOLOGY@@CLASS at _remove_space_dimensions copy01 dimensions_to_remove;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`
+print_string "testing ppl_ at CLASS@_remove_higher_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _remove_higher_space_dimensions copy01 1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`
+print_string "testing ppl_ at CLASS@_expand_space_dimension: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _expand_space_dimension copy01 1 1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`
+print_string "testing ppl_ at CLASS@_fold_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let dimensions_to_fold = [1];;
+ppl_ at TOPOLOGY@@CLASS at _fold_space_dimensions copy01 dimensions_to_fold 0;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`
+print_string "testing ppl_ at CLASS@_map_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+ppl_ at TOPOLOGY@@CLASS at _map_space_dimensions copy01 dimensions_to_map;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`
+print_string "testing ppl_ at CLASS@_constrains: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _constrains copy01 1;;
+ppl_ at TOPOLOGY@@CLASS at _map_space_dimensions copy01 dimensions_to_map;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`
+print_string "testing ppl_ at CLASS@_unconstrain_space_dimension: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimension copy01 1;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`
+print_string "testing ppl_ at CLASS@_unconstrain_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let dimensions_to_unconstrain = [1];;
+ppl_ at TOPOLOGY@@CLASS at _unconstrain_space_dimensions
+  copy01 dimensions_to_unconstrain;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`
+print_string "testing ppl_ at CLASS@_ at MEMBYTES@: " ;;
+let mb
+  =  ppl_ at TOPOLOGY@@CLASS at _@MEMBYTES@ @LTOPOLOGY@@LCLASS at 01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+printf "@MEMBYTES@: %d" mb;;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`
+print_string "testing ppl_ at CLASS@_ at WIDEN@_widening_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign copy01 copy03 ;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`
+print_string "testing ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+let tokens
+  = ppl_ at TOPOLOGY@@CLASS at _@WIDEN at _widening_assign_with_tokens copy01 copy03 5;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+print_string "tokens after widening = ";;
+print_int tokens;;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`
+print_string
+  "testing ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign
+  copy01 copy03 @CONSTRAINER at s04;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`
+print_string
+  "testing ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+let tokens
+  = ppl_ at TOPOLOGY@@CLASS at _@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign_with_tokens
+  copy01 copy03 @CONSTRAINER at s04 10;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+print_string "tokens after widening = ";;
+print_int tokens;;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`
+print_string "testing ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+ppl_ at TOPOLOGY@@CLASS at _@EXTRAPOLATION at _extrapolation_assign copy01 copy03 ;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`
+print_string "testing ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+let tokens
+  = ppl_ at TOPOLOGY@@CLASS at _@EXTRAPOLATION at _extrapolation_assign_with_tokens
+    copy01 copy03 5;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+print_string "tokens after extrapolation = ";;
+print_int tokens;;
+print_newline();;
+')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`
+print_string "testing ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+ppl_ at TOPOLOGY@@CLASS at _@EXTRAPOLATION at _narrowing_assign copy03 copy01 ;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`
+print_string "testing ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign copy01 copy03 ;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`
+print_string "testing ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 03);;
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign copy01 copy03 2;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`
+print_string "testing ppl_ at BEGINEND@_iterator: " ;;
+let it = ppl_ at CLASS@_ at BEGINEND@_iterator @LTOPOLOGY@@LCLASS at 01;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`
+print_string "testing ppl_ at CLASS@_iterator_equals_iterator: " ;;
+let it = ppl_ at CLASS@_begin_iterator @LTOPOLOGY@@LCLASS at 01;;
+let it_begin = ppl_ at CLASS@_begin_iterator @LTOPOLOGY@@LCLASS at 01;;
+let b = ppl_ at CLASS@_iterator_equals_iterator it it_begin;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`
+print_string "testing ppl_ at CLASS@_ at INCDEC@_iterator: " ;;
+let it = ppl_ at CLASS@_begin_iterator @LTOPOLOGY@@LCLASS at 01;;
+ppl_ at CLASS@_ at INCDEC@_iterator it;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`
+print_string "testing ppl_ at CLASS@_get_disjunct: " ;;
+let it = ppl_ at CLASS@_begin_iterator @LTOPOLOGY@@LCLASS at 01;;
+let d = ppl_ at CLASS@_get_disjunct it;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK @LTOPOLOGY@@LCLASS at 01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`
+print_string "testing ppl_ at CLASS@_drop_disjunct: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@LTOPOLOGY@@LCLASS at 01);;
+let it = ppl_ at CLASS@_begin_iterator copy01;;
+ppl_ at CLASS@_drop_disjunct copy01 it;;
+let out = if (ppl_ at TOPOLOGY@@CLASS at _OK copy01)
+  then "success" else "failed"
+    in (print_string out);;
+print_newline();;
+')
diff --git a/interfaces/OCaml/tests/ppl_ocaml_tests_common b/interfaces/OCaml/tests/ppl_ocaml_tests_common
new file mode 100644
index 0000000..d7b1a24
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_ocaml_tests_common
@@ -0,0 +1,235 @@
+(* FIXME: to be written.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . *)
+
+open Ppl_ocaml
+open Printf
+open Gmp
+
+let rec print_linear_expression = function
+    Variable v ->
+      print_string "V(";
+      print_int v;
+      print_string ")";
+  | Coefficient c ->
+      print_int(Z.to_int c)
+  | Unary_Minus e ->
+      print_string "-(";
+      print_linear_expression e;
+      print_string ")";
+  | Unary_Plus e ->
+      print_linear_expression e
+  | Plus (e1, e2) ->
+      print_string "(";
+      print_linear_expression e1;
+      print_string " + ";
+      print_linear_expression e2;
+      print_string ")";
+  | Minus (e1, e2) ->
+      print_string "(";
+      print_linear_expression e1;
+      print_string " - ";
+      print_linear_expression e2;
+      print_string ")";
+  | Times (c, e) ->
+      print_int(Z.to_int c);
+      print_string "*(";
+      print_linear_expression e;
+      print_string ")";
+;;
+
+let rec print_constraint = function
+    Less_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string " < ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Less_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string " <= ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string " == ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Greater_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string " > ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Greater_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string " >= ";
+      print_linear_expression le2;
+      print_string ", ";
+;;
+
+let rec print_generator = function
+    Ray (le1) ->
+      print_string "Ray: ";
+      print_linear_expression le1;
+      print_string ", ";
+  |  Line (le1) ->
+      print_string "Line: ";
+      print_linear_expression le1;
+      print_string ", ";
+  | Point (le1, c) ->
+      print_string "Point: ";
+      print_linear_expression le1;
+      print_string " den: ";
+      print_int(Z.to_int c);
+      print_string ", ";
+| Closure_Point (le1, c) ->
+      print_string "Closure_Point: ";
+      print_linear_expression le1;
+      print_string " den: ";
+      print_int(Z.to_int c);
+      print_string ", ";;
+
+let print_congruence = function x,y,z ->
+   print_linear_expression x;
+  print_string " %= ";
+  print_linear_expression y;
+  print_string " mod ";
+  print_int(Z.to_int z);
+  print_string ", ";;
+
+
+let rec print_grid_generator = function
+  |  Grid_Line (le1) ->
+      print_string "Line: ";
+      print_linear_expression le1;
+      print_string ", ";
+  | Grid_Point (le1, c) ->
+      print_string "Point: ";
+      print_linear_expression le1;
+      print_string " den: ";
+      print_int(Z.to_int c);
+      print_string ", ";
+  | Grid_Parameter (le1, c) ->
+      print_string "Parameter: ";
+      print_linear_expression le1;
+      print_string " den: ";
+      print_int(Z.to_int c);
+      print_string ", ";;
+
+(* Build linear expressions the hard way. *)
+
+print_string "Build linear expressions manually:\n" ;;
+
+let rec v0 = Variable 0
+and v1 = Variable 1
+and v2 = Variable 2
+and n = Coefficient (Z.from_int 3)
+and e1 = Plus (v2, v2)
+and e2 = Times ((Z.from_int 7), v0)
+and e3 = Plus (n, v2)
+;;
+
+print_linear_expression v0; print_string "\n" ;;
+print_linear_expression v1; print_string "\n" ;;
+print_linear_expression v2; print_string "\n" ;;
+print_linear_expression n; print_string "\n" ;;
+print_linear_expression e1; print_string "\n" ;;
+print_linear_expression e2; print_string "\n" ;;
+
+(* See whether operators can make life better. *)
+
+print_string "Build linear expressions with operators:\n" ;;
+
+let linear_expression_of_int n = Coefficient (Z.of_int n) ;;
+let linear_expression_plus e1 e2 = Plus (e1, e2) ;;
+let linear_expression_minus e1 e2 = Minus (e1, e2) ;;
+let linear_expression_times v2 e = Times (v2, e) ;;
+let linear_constraint_eq e1 e2 = Equal (e1, e2) ;;
+let linear_constraint_lt e1 e2 = Less_Than (e1, e2) ;;
+let linear_constraint_gt e1 e2 = Greater_Than (e1, e2) ;;
+let linear_constraint_le e1 e2 = Less_Or_Equal (e1, e2) ;;
+let linear_constraint_ge e1 e2 = Greater_Or_Equal (e1, e2) ;;
+
+let ( +/ ) = linear_expression_plus
+let ( -/ ) = linear_expression_minus
+let ( */ ) = linear_expression_times
+let ( =/ ) = linear_constraint_eq
+let ( </ ) = linear_constraint_lt
+let ( >/ ) = linear_constraint_gt
+let ( <=/ ) = linear_constraint_le
+let ( >=/ ) = linear_constraint_ge
+
+let e3 =
+  (Z.of_int 3) */ v0
+  +/
+  (Z.of_int 4) */ v1
+  -/
+  (linear_expression_of_int 7)
+;;
+
+print_linear_expression e3; print_string "\n" ;;
+
+(* Probably the most convenient thing for the user will be to use the
+   the Camlp4 preprocessor: see
+   http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#htoc10 *)
+
+(* Build some PPL::C_Polyhedron. *)
+
+let constraint1 = (e2 >=/ e2);;
+let constraints1 = [e3 >=/ e1; e1 >=/ e2; e1 <=/ e2 -/ n] ;;
+let generator1 = Point (e3, (Z.from_int 1));;
+let generators1 = [Point (e2, (Z.from_int 1)); Point (e1, (Z.from_int 2))] ;;
+let congruence1 = (e2, e2 , (Z.from_int 1));;
+let congruences1 = [e3, e2 , (Z.from_int 20)];;
+let grid_generator1 = Grid_Point (e3, (Z.from_int 1));;
+let grid_generators1 = [Grid_Point (e3, (Z.from_int 1))];;
+
+let mip1 =  ppl_new_MIP_Problem 10 constraints1 e3 Maximization;;
+let objective_func = ppl_MIP_Problem_objective_function mip1;;
+print_newline();;
+print_linear_expression objective_func;;
+let i = ppl_MIP_Problem_space_dimension mip1;;
+print_newline();;
+print_int i;;
+let i = ppl_MIP_Problem_constraints mip1;;
+print_newline();;
+List.iter print_constraint i;;
+
+let constraint01 = (v0 >=/ (linear_expression_of_int 1));;
+let constraints01 = [(v0 >=/ (linear_expression_of_int 1));
+                     (v1 >=/ (linear_expression_of_int 1));
+                     (v2 >=/ (linear_expression_of_int 1))];;
+let constraints02 = [(v0 <=/ (linear_expression_of_int 1));
+                     (v1 >=/ (linear_expression_of_int 1))];;
+let constraints03 = [(v0 >=/ (linear_expression_of_int 2));
+                     (v1 >=/ (linear_expression_of_int 1));
+                     (v2 >=/ (linear_expression_of_int 1))];;
+let constraints04 = [(v0 >=/ (linear_expression_of_int 2))];;
+let congruence01 = (v0, (linear_expression_of_int 0), (Z.from_int 2));;
+let congruences01 = [(v0, (linear_expression_of_int 0), (Z.from_int 2));
+                    (v1, (linear_expression_of_int 0), (Z.from_int 1));
+                    (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences02 = [(v0, (linear_expression_of_int 1), (Z.from_int 3));
+                    (v1, (linear_expression_of_int 0), (Z.from_int 1));
+                    (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences03 = [(v0, (linear_expression_of_int 0), (Z.from_int 4));
+                    (v1, (linear_expression_of_int 0), (Z.from_int 1));
+                    (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences04 = [(v0, (linear_expression_of_int 0), (Z.from_int 4))];;
diff --git a/interfaces/OCaml/tests/test1.ml b/interfaces/OCaml/tests/test1.ml
new file mode 100644
index 0000000..f5f54a6
--- /dev/null
+++ b/interfaces/OCaml/tests/test1.ml
@@ -0,0 +1,301 @@
+(* FIXME: to be written.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . *)
+
+open Ppl_ocaml
+open Printf
+open Gmp
+
+let rec print_linear_expression = function
+    Variable v ->
+      print_string "V(";
+      print_int v;
+      print_string ")";
+  | Coefficient c ->
+      print_int(Z.to_int c)
+  | Unary_Minus e ->
+      print_string "-(";
+      print_linear_expression e;
+      print_string ")";
+  | Unary_Plus e ->
+      print_linear_expression e
+  | Plus (e1, e2) ->
+      print_string "(";
+      print_linear_expression e1;
+      print_string " + ";
+      print_linear_expression e2;
+      print_string ")";
+  | Minus (e1, e2) ->
+      print_string "(";
+      print_linear_expression e1;
+      print_string " - ";
+      print_linear_expression e2;
+      print_string ")";
+  | Times (c, e) ->
+      print_int(Z.to_int c);
+      print_string "*(";
+      print_linear_expression e;
+      print_string ")";
+;;
+
+let rec print_constraint = function
+    Less_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string " < ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Less_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string " <= ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string " == ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Greater_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string " > ";
+      print_linear_expression le2;
+      print_string ", ";
+  | Greater_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string " >= ";
+      print_linear_expression le2;
+      print_string ", ";
+;;
+
+let rec print_generator = function
+    Ray (le1) ->
+      print_string "Ray: ";
+      print_linear_expression le1;
+      print_string ", ";
+  |  Line (le1) ->
+      print_string "Line: ";
+      print_linear_expression le1;
+      print_string ", ";
+  | Point (le1, c) ->
+      print_string "Point: ";
+      print_linear_expression le1;
+      print_string " den: ";
+      print_int(Z.to_int c);
+      print_string ", ";
+| Closure_Point (le1, c) ->
+      print_string "Closure_Point: ";
+      print_linear_expression le1;
+      print_string " den: ";
+      print_int(Z.to_int c);
+      print_string ", ";;
+
+let print_congruence = function x,y,z ->
+   print_linear_expression x;
+  print_string " %= ";
+  print_linear_expression y;
+  print_string " mod ";
+  print_int(Z.to_int z);
+  print_string ", ";;
+
+
+(* Build linear expressions the hard way. *)
+
+print_string "Build linear expressions manually:\n" ;;
+
+let rec a = Variable 0
+and b = Variable 1
+and c = Variable 2
+and n = Coefficient (Z.from_int 3)
+and e1 = Plus (c, c)
+and e2 = Times ((Z.from_int 7), a)
+and e3 = Plus (n, c)
+;;
+
+print_linear_expression a; print_string "\n" ;;
+print_linear_expression b; print_string "\n" ;;
+print_linear_expression c; print_string "\n" ;;
+print_linear_expression n; print_string "\n" ;;
+print_linear_expression e1; print_string "\n" ;;
+print_linear_expression e2; print_string "\n" ;;
+
+(* See whether operators can make life better. *)
+
+print_string "Build linear expressions with operators:\n" ;;
+
+let linear_expression_of_int n = Coefficient (Z.of_int n) ;;
+let linear_expression_plus e1 e2 = Plus (e1, e2) ;;
+let linear_expression_minus e1 e2 = Minus (e1, e2) ;;
+let linear_expression_times c e = Times (c, e) ;;
+let linear_constraint_eq e1 e2 = Equal (e1, e2) ;;
+let linear_constraint_lt e1 e2 = Less_Than (e1, e2) ;;
+let linear_constraint_gt e1 e2 = Greater_Than (e1, e2) ;;
+let linear_constraint_le e1 e2 = Less_Or_Equal (e1, e2) ;;
+let linear_constraint_ge e1 e2 = Greater_Or_Equal (e1, e2) ;;
+
+let ( +/ ) = linear_expression_plus
+let ( -/ ) = linear_expression_minus
+let ( */ ) = linear_expression_times
+let ( =/ ) = linear_constraint_eq
+let ( </ ) = linear_constraint_lt
+let ( >/ ) = linear_constraint_gt
+let ( <=/ ) = linear_constraint_le
+let ( >=/ ) = linear_constraint_ge
+
+let e3 =
+  (Z.of_int 3) */ a
+  +/
+  (Z.of_int 4) */ b
+  -/
+  (linear_expression_of_int 7)
+;;
+
+print_linear_expression e3; print_string "\n" ;;
+
+(* Probably the most convenient thing for the user will be to use the
+   the Camlp4 preprocessor: see
+   http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#htoc10 *)
+
+(* Build some PPL::C_Polyhedron. *)
+
+let constraint1 = (e2 >=/ e2);;
+let constraints1 = [e3 >=/ e1; e1 >=/ e2; e1 <=/ e2 -/ n] ;;
+let generator1 = Point (e3, (Z.from_int 1));;
+let generators1 = [Point (e2, (Z.from_int 1)); Point (e1, (Z.from_int 2))] ;;
+let congruence1 = (e2, e2 , (Z.from_int 1));;
+let congruences1 = [e3, e2 , (Z.from_int 20)];;
+let grid_generator1 = Grid_Point (e3, (Z.from_int 1));;
+
+let mip1 =  ppl_new_MIP_Problem 10 constraints1 e3 Maximization;;
+let objective_func = ppl_MIP_Problem_objective_function mip1;;
+print_newline();;
+print_linear_expression objective_func;;
+let i = ppl_MIP_Problem_space_dimension mip1;;
+print_newline();;
+print_int i;;
+let i = ppl_MIP_Problem_constraints mip1;;
+print_newline();;
+List.iter print_constraint i;;
+
+print_newline();;
+print_string ("space dimensions: ");;
+for i = 6 downto 0 do
+  let polyhedron1 = ppl_new_C_Polyhedron_from_space_dimension i Empty
+  in let dimension =  ppl_C_Polyhedron_space_dimension(polyhedron1)
+  in printf "%d, " dimension
+done;;
+print_newline();;
+
+let polyhedron1 = ppl_new_C_Polyhedron_from_constraints(constraints1);;
+let polyhedron2 = ppl_new_C_Polyhedron_from_generators(generators1);;
+let result =  ppl_C_Polyhedron_bounds_from_above polyhedron1 e2;;
+ppl_C_Polyhedron_add_constraint polyhedron1 constraint1;;
+ppl_C_Polyhedron_add_generator polyhedron1 generator1;;
+let b = ppl_C_Polyhedron_is_disjoint_from_C_Polyhedron
+  polyhedron1 polyhedron2;;
+ppl_C_Polyhedron_concatenate_assign polyhedron1 polyhedron2;;
+let congruences = ppl_C_Polyhedron_get_congruences polyhedron1 in
+List.iter print_congruence congruences;;
+print_newline();;
+ppl_C_Polyhedron_bounded_affine_preimage polyhedron1 1 e1 e2 (Z.from_int 10);;
+ppl_C_Polyhedron_bounded_affine_preimage polyhedron1 1 e1 e2 (Z.from_int 10);;
+ppl_C_Polyhedron_affine_image polyhedron1 1 e1 (Z.from_int 10);;
+let a = ppl_C_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+  polyhedron1 polyhedron1 constraints1 10;;
+let b = ppl_C_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+  polyhedron1 polyhedron1 constraints1 10;;
+let b = ppl_C_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+  polyhedron1 polyhedron1 constraints1 10;;
+ ppl_C_Polyhedron_H79_widening_assign polyhedron1 ;;
+print_int b;;
+
+let b = ppl_C_Polyhedron_OK polyhedron1;;
+ppl_C_Polyhedron_generalized_affine_preimage_lhs_rhs
+  polyhedron1 e1 Equal_RS e1;;
+ppl_C_Polyhedron_generalized_affine_image
+  polyhedron1 1 Equal_RS e2 (Z.from_int 10);;
+print_newline();;
+print_string "Testing minimization";;
+let is_bounded, num, den, is_supremum, gen
+  = ppl_C_Polyhedron_minimize_with_point polyhedron1 e3;;
+print_newline();;
+print_string "Value: ";;
+print_int(Z.to_int num);;
+print_string "/";;
+print_int(Z.to_int den);;
+print_string ", is_bounded: ";;
+print_string (string_of_bool is_bounded);;
+print_string ", is_supremum: ";;
+print_string (string_of_bool is_supremum);;
+print_string ", generator: ";;
+print_generator(gen);;
+print_newline();;
+let dimensions_to_remove = [3;0];;
+ppl_C_Polyhedron_remove_space_dimensions polyhedron1 dimensions_to_remove;;
+let dimensions_to_fold = [1];;
+ppl_C_Polyhedron_fold_space_dimensions polyhedron1 dimensions_to_fold 0;;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+let i = ppl_C_Polyhedron_space_dimension polyhedron1;;
+print_newline();;
+print_string "Space dimension is: ";
+print_int i;;
+print_string "\n";;
+ppl_C_Polyhedron_map_space_dimensions polyhedron1 dimensions_to_map;;
+ppl_C_Polyhedron_constrains polyhedron1 1;;
+ppl_C_Polyhedron_unconstrain_space_dimension polyhedron1 1;;
+let dimensions_to_unconstrain = [1];;
+ppl_C_Polyhedron_unconstrain_space_dimensions
+  polyhedron1 dimensions_to_unconstrain;;
+print_newline();;
+ppl_C_Polyhedron_swap polyhedron1 polyhedron2;;
+let result = ppl_C_Polyhedron_simplify_using_context_assign
+  polyhedron1 polyhedron2;;
+let c_polyhedron1 = ppl_new_C_Polyhedron_from_space_dimension 10 Universe;;
+let constraints = ppl_C_Polyhedron_get_minimized_constraints c_polyhedron1;;
+let cs_size =  List.length constraints;;
+print_string "\nSize of minimized constraints get from a C_Polyhedron built from Universe : ";;
+print_int(cs_size);;
+let nnc_polyhedron1 = ppl_new_NNC_Polyhedron_from_space_dimension 10 Universe;;
+let constraints = ppl_NNC_Polyhedron_get_minimized_constraints nnc_polyhedron1;;
+let cs_size =  List.length constraints;;
+print_string "\nSize of minimized constraints get from a NNC_Polyhedron built from Universe : ";;
+print_int(cs_size);;
+(* Pointset_Powersed_Grid is not enabled by default, the following code is *)
+(* commented *)
+(* let pps = ppl_new_Pointset_Powerset_Grid_from_space_dimension 3;; *)
+(* let space_dim = ppl_Pointset_Powerset_Grid_space_dimension pps;; *)
+(* ppl_Pointset_Powerset_Grid_add_constraints  pps constraints1;; *)
+(* let caml_grid_it = ppl_Pointset_Powerset_Grid_begin_iterator pps;; *)
+(* let grid1 =  ppl_Pointset_Powerset_Grid_iterator_get_disjunct caml_grid_it;; *)
+(* let space_dim = ppl_Grid_space_dimension grid1;; *)
+(* let grid2 = ppl_new_Grid_from_space_dimension 3;; *)
+(* ppl_Pointset_Powerset_Grid_add_disjunct pps grid2;; *)
+(* let space_dim = ppl_Pointset_Powerset_Grid_space_dimension pps;; *)
+(* let caml_grid_it1 = ppl_Pointset_Powerset_Grid_end_iterator pps;; *)
+(* let caml_grid_it2 = ppl_Pointset_Powerset_Grid_end_iterator pps;; *)
+(* ppl_Pointset_Powerset_Grid_iterator_decrement caml_grid_it1;; *)
+(* ppl_Pointset_Powerset_Grid_drop_disjunct pps caml_grid_it1;; *)
+(* ppl_Pointset_Powerset_Grid_iterator_equals_iterator caml_grid_it1 caml_grid_it1;; *)
+(* print_int space_dim;; *)
+(* print_newline();; *)
+(* print_string "PPS size : ";; *)
+(* let size = ppl_Pointset_Powerset_Grid_size pps;; *)
+(* print_int size;; *)
+at_exit Gc.full_major;;
+print_string "\nBye!\n"
diff --git a/interfaces/Prolog/Ciao/Makefile.am b/interfaces/Prolog/Ciao/Makefile.am
index c3871b1..697bc6c 100644
--- a/interfaces/Prolog/Ciao/Makefile.am
+++ b/interfaces/Prolog/Ciao/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,32 +20,67 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-abs_srcdir = @abs_srcdir@
+CIAO_CFLI_FILES = ciao_cfli.hh
 
-EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
+EXTRA_DIST = \
+ppl_interface_generator_ciao_pl.m4 \
+$(CIAO_CFLI_FILES) \
+ciao_clpq.pl \
+ciao_clpq2.pl \
+ciao_pl_check.pl \
+ppl_interface_generator_ciao_predicate_check_pl.m4
 
 if BUILD_CIAO_PROLOG_INTERFACE
+
+if BUILD_WATCHDOG_LIBRARY
+
+WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+
+endif BUILD_WATCHDOG_LIBRARY
+
 if ENABLE_SHARED
 
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog/src \
+$(WATCHDOG_INCLUDE_OPTIONS) \
+$(CIAO_PROLOG_INCLUDE_OPTIONS) \
 @extra_includes@
 
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_ciao_pl.m4 \
+ppl_interface_generator_ciao_predicate_check_pl.m4
+
 pkglib_LTLIBRARIES = libppl_ciao.la
 libppl_ciao_la_SOURCES = ppl_ciao.cc
 libppl_ciao_la_LIBADD = \
 $(top_builddir)/src/libppl.la \
-$(top_builddir)/Watchdog/src/libpwl.la \
+$(WATCHDOG_LIBRARY) \
 @extra_libraries@
 libppl_ciao_la_LDFLAGS = -module -avoid-version
 
 pkglib_DATA = ppl_ciao.po
 
+ppl_ciao.pl: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@
+
+ciao_predicate_check.pl: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_ciao_predicate_check_pl.m4 > $@
+
 ppl_ciao.po: ppl_ciao.pl
-	if [ $(abs_srcdir) != `pwd` ]; then \
-	  cp -f $(srcdir)/ppl_ciao.pl .; \
-	fi
 	ciaoc -c ppl_ciao.pl
 
 # All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq'
@@ -88,6 +123,12 @@ ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ci
 	rm -f clpq2.pl
 
 
+ciao_predicate_check: .libs/libppl_ciao.so ppl_ciao.po ciao_predicate_check.pl ../tests/ppl_predicate_check_main.pl | ciao_pl_check
+	cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl .; \
+	cp -f ../tests/ppl_predicate_check_main.pl .
+	ciaoc -o $@ ciao_predicate_check.pl
+	rm -f ppl_predicate_check_main.pl
+
 CLPQ_TESTS_NONSTRICT = \
 ack.clpq \
 ackn.clpq \
@@ -123,19 +164,19 @@ check-local: pl_check_test clpq_test clpq2_test
 pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen libppl_ciao.la \
 		./ciao_pl_check \
 			 >obtained_pchk
 	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 
-clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) 
+clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ)
 	LANG=C; \
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 	GLOBALSTKSIZE=1000000 \
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen libppl_ciao.la \
 		./ciao_clpq \
 			<$(srcdir)/../tests/script_clpq >obtained_clpq
@@ -147,22 +188,29 @@ clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXP
 	GLOBALSTKSIZE=100000 \
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen libppl_ciao.la \
 		./ciao_clpq2 \
 			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
+predicate_check_test: ciao_predicate_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		$(WATCHDOG_DLOPEN) \
+		-dlopen libppl_ciao.la \
+		./ciao_predicate_check \
+			 >obtained_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+endif ENABLE_SHARED
+endif BUILD_CIAO_PROLOG_INTERFACE
+
+DISTCLEANFILES = \
+ppl_ciao.pl
+
 MOSTLYCLEANFILES = \
 *.itf *.po *.c *.so \
-ciao_clpq ciao_clpq2 ciao_pl_check \
+ciao_clpq ciao_clpq2 ciao_pl_check ciao_predicate_check \
 obtained_clpq obtained_clpq2 obtained_pchk \
 $(CLPQ_TESTS)
-
-mostlyclean-local:
-	if [ $(abs_srcdir) != `pwd` ]; then \
-	  rm -f ppl_ciao.pl; \
-	fi
-
-endif ENABLE_SHARED
-endif BUILD_CIAO_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/Ciao/Makefile.in b/interfaces/Prolog/Ciao/Makefile.in
index 7d6ae06..8146d1a 100644
--- a/interfaces/Prolog/Ciao/Makefile.in
+++ b/interfaces/Prolog/Ciao/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/ppl/ .
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ host_triplet = @host@
 subdir = interfaces/Prolog/Ciao
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -90,24 +97,28 @@ am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
 pkglibLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(pkglib_LTLIBRARIES)
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(WATCHDOG_LIBRARY)
 am__libppl_ciao_la_SOURCES_DIST = ppl_ciao.cc
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_libppl_ciao_la_OBJECTS = ppl_ciao.lo
 libppl_ciao_la_OBJECTS = $(am_libppl_ciao_la_OBJECTS)
+libppl_ciao_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_ciao_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_libppl_ciao_la_rpath =  \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	-rpath \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(pkglibdir)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(libppl_ciao_la_SOURCES)
 DIST_SOURCES = $(am__libppl_ciao_la_SOURCES_DIST)
 pkglibDATA_INSTALL = $(INSTALL_DATA)
@@ -116,39 +127,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -158,53 +148,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -213,56 +201,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -274,10 +236,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -286,37 +252,80 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-abs_srcdir = @abs_srcdir@
-EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
+CIAO_CFLI_FILES = ciao_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_ciao_pl.m4 \
+$(CIAO_CFLI_FILES) \
+ciao_clpq.pl \
+ciao_clpq2.pl \
+ciao_pl_check.pl \
+ppl_interface_generator_ciao_predicate_check_pl.m4
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at AM_CPPFLAGS = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_srcdir)/interfaces \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_srcdir)/interfaces/Prolog \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/src \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/Watchdog/src \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(CIAO_PROLOG_INCLUDE_OPTIONS) \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_includes@
 
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at interface_generator_dependencies = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../../ppl_interface_generator_common.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../../ppl_interface_generator_copyright \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_interface_generator_ciao_pl.m4 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_interface_generator_ciao_predicate_check_pl.m4
+
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_LTLIBRARIES = libppl_ciao.la
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_SOURCES = ppl_ciao.cc
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_LIBADD = \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(WATCHDOG_LIBRARY) \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_libraries@
 
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_LDFLAGS = -module -avoid-version
@@ -341,11 +350,14 @@ EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
 @ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
 @ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at MOSTLYCLEANFILES = \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@*.itf *.po *.c *.so \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq ciao_clpq2 ciao_pl_check \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at obtained_clpq obtained_clpq2 obtained_pchk \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(CLPQ_TESTS)
+DISTCLEANFILES = \
+ppl_ciao.pl
+
+MOSTLYCLEANFILES = \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check ciao_predicate_check \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS)
 
 all: all-am
 
@@ -382,21 +394,21 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-pkglibLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
 	done
 
 clean-pkglibLTLIBRARIES:
@@ -408,7 +420,7 @@ clean-pkglibLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 libppl_ciao.la: $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_libppl_ciao_la_rpath) $(libppl_ciao_la_LDFLAGS) $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_LIBADD) $(LIBS)
+	$(libppl_ciao_la_LINK) $(am_libppl_ciao_la_rpath) $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -419,22 +431,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ciao.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -444,13 +456,9 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-pkglibDATA: $(pkglib_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -471,8 +479,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -484,8 +492,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -495,13 +503,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -515,22 +522,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -549,7 +555,7 @@ check: check-am
 all-am: Makefile $(LTLIBRARIES) $(DATA)
 installdirs:
 	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -572,12 +578,11 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
- at BUILD_CIAO_PROLOG_INTERFACE_FALSE@mostlyclean-local:
- at ENABLE_SHARED_FALSE@mostlyclean-local:
 clean: clean-am
 
 clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
@@ -587,7 +592,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -601,12 +606,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -617,7 +630,7 @@ maintainer-clean-am: distclean-am maintainer-clean-generic
 mostlyclean: mostlyclean-am
 
 mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-local
+	mostlyclean-libtool
 
 pdf: pdf-am
 
@@ -627,28 +640,35 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am uninstall-pkglibDATA \
-	uninstall-pkglibLTLIBRARIES
+uninstall-am: uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
 	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-pkglibDATA \
-	install-pkglibLTLIBRARIES install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
-	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am \
-	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibDATA install-pkglibLTLIBRARIES install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
 
 
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_ciao.pl: $(interface_generator_dependencies)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@           $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_predicate_check.pl: $(interface_generator_dependencies)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@           $(srcdir)/ppl_interface_generator_ciao_predicate_check_pl.m4 > $@
+
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_ciao.po: ppl_ciao.pl
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ppl_ciao.pl .; \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ciaoc -c ppl_ciao.pl
 
 # All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq'
@@ -690,24 +710,30 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	rm -f clpq2.pl
 
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_predicate_check: .libs/libppl_ciao.so ppl_ciao.po ciao_predicate_check.pl ../tests/ppl_predicate_check_main.pl | ciao_pl_check
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cp -f ../tests/ppl_predicate_check_main.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_predicate_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	rm -f ppl_predicate_check_main.pl
+
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at check-local: pl_check_test clpq_test clpq2_test
 
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_pl_check \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			 >obtained_pchk
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) 
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ)
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	LANG=C; \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	GLOBALSTKSIZE=1000000 \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_clpq \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<$(srcdir)/../tests/script_clpq >obtained_clpq
@@ -719,16 +745,20 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	GLOBALSTKSIZE=100000 \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_clpq2 \
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 @BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mostlyclean-local:
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  rm -f ppl_ciao.pl; \
- at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at predicate_check_test: ciao_predicate_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_predicate_check \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			 >obtained_pchk
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/Prolog/Ciao/ciao_cfli.hh b/interfaces/Prolog/Ciao/ciao_cfli.hh
new file mode 100644
index 0000000..6ecdeee
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_cfli.hh
@@ -0,0 +1,336 @@
+/* Ciao Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PCFLI_ciao_cfli_hh
+#define PCFLI_ciao_cfli_hh 1
+
+#include <ciao_prolog.h>
+#include <cassert>
+#include <sstream>
+
+typedef ciao_term Prolog_term_ref;
+typedef const char* Prolog_atom;
+typedef ciao_bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = 1;
+const Prolog_foreign_return_type PROLOG_FAILURE = 0;
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  t = ciao_integer(l);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul < INT_MAX)
+    t = ciao_integer(ul);
+  else {
+    std::ostringstream s;
+    s << ul;
+    t = ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = ciao_atom(s);
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = ciao_atom(a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  t = ciao_pointer_to_address(ciao_implicit_state, p);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return ciao_atom_name(ciao_atom(s));
+}
+
+static Prolog_term_ref args[4];
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  args[0] = a1;
+  t = ciao_structure_a(f, 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  args[0] = a1;
+  args[1] = a2;
+  t = ciao_structure_a(f, 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = ciao_structure_a(f, 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = ciao_structure_a(f, 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  c = ciao_list(h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  ciao_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return ciao_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return ciao_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return ciao_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return ciao_is_address(ciao_implicit_state, t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return ciao_is_structure(t);
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return ciao_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(ciao_is_integer(t));
+  if (ciao_fits_in_int(t)) {
+    *lp = ciao_to_integer(t);
+    return 1;
+  }
+  else {
+    char* s = ciao_get_number_chars(t);
+    mpz_class n(s);
+    ciao_free(s);
+    if (!n.fits_slong_p())
+      return 0;
+    else {
+      *lp = n.get_si();
+      return 1;
+    }
+  }
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = ciao_address_to_pointer(ciao_implicit_state, t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = ciao_atom_name(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  *ap = ciao_structure_name(t);
+  *ip = ciao_structure_arity(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = ciao_structure_arg(t, i);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = ciao_list_head(c);
+  t = ciao_list_tail(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return ciao_unify(t, u);
+}
+
+#endif // !defined(PCFLI_ciao_cfli_hh)
diff --git a/interfaces/Prolog/Ciao/ciao_clpq.pl b/interfaces/Prolog/Ciao/ciao_clpq.pl
index 1f36f09..05bfad1 100644
--- a/interfaces/Prolog/Ciao/ciao_clpq.pl
+++ b/interfaces/Prolog/Ciao/ciao_clpq.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the toy PPL/CIAO-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/Ciao/ciao_clpq2.pl b/interfaces/Prolog/Ciao/ciao_clpq2.pl
index 1b02d26..f518959 100644
--- a/interfaces/Prolog/Ciao/ciao_clpq2.pl
+++ b/interfaces/Prolog/Ciao/ciao_clpq2.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the 2nd toy PPL/CIAO-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/Ciao/ciao_pl_check.pl b/interfaces/Prolog/Ciao/ciao_pl_check.pl
index 7f5c0cb..14e01d4 100644
--- a/interfaces/Prolog/Ciao/ciao_pl_check.pl
+++ b/interfaces/Prolog/Ciao/ciao_pl_check.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the toy PPL/CIAO-Prolog predicate checker.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -70,6 +70,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 	ppl_Polyhedron_is_empty/1,
 	ppl_Polyhedron_is_universe/1,
 	ppl_Polyhedron_is_bounded/1,
+	ppl_Polyhedron_contains_integer_point/1,
 	ppl_Polyhedron_bounds_from_above/2,
 	ppl_Polyhedron_bounds_from_below/2,
 	ppl_Polyhedron_maximize/5,
@@ -125,27 +126,30 @@ site: http://www.cs.unipr.it/ppl/ . */
 	ppl_Polyhedron_expand_space_dimension/3,
 	ppl_Polyhedron_fold_space_dimensions/3,
 	ppl_Polyhedron_map_space_dimensions/2,
-        ppl_new_LP_Problem_trivial/1,
-        ppl_new_LP_Problem/4,
-        ppl_new_LP_Problem_from_LP_Problem/2,
-        ppl_LP_Problem_swap/2,
-        ppl_delete_LP_Problem/1,
-        ppl_LP_Problem_space_dimension/2,
-        ppl_LP_Problem_constraints/2,
-        ppl_LP_Problem_objective_function/2,
-        ppl_LP_Problem_optimization_mode/2,
-        ppl_LP_Problem_clear/1,
-        ppl_LP_Problem_add_constraint/2,
-        ppl_LP_Problem_add_constraints/2,
-        ppl_LP_Problem_set_objective_function/2,
-        ppl_LP_Problem_set_optimization_mode/2,
-        ppl_LP_Problem_is_satisfiable/1,
-        ppl_LP_Problem_solve/2,
-        ppl_LP_Problem_feasible_point/2,
-        ppl_LP_Problem_optimizing_point/2,
-        ppl_LP_Problem_optimal_value/3,
-        ppl_LP_Problem_evaluate_objective_function/4,
-        ppl_LP_Problem_OK/1
+        ppl_new_MIP_Problem_from_space_dimension/2,
+        ppl_new_MIP_Problem/5,
+        ppl_new_MIP_Problem_from_MIP_Problem/2,
+        ppl_MIP_Problem_swap/2,
+        ppl_delete_MIP_Problem/1,
+        ppl_MIP_Problem_space_dimension/2,
+        ppl_MIP_Problem_integer_space_dimensions/2,
+        ppl_MIP_Problem_constraints/2,
+        ppl_MIP_Problem_objective_function/2,
+        ppl_MIP_Problem_optimization_mode/2,
+        ppl_MIP_Problem_clear/1,
+        ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+        ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+        ppl_MIP_Problem_add_constraint/2,
+        ppl_MIP_Problem_add_constraints/2,
+        ppl_MIP_Problem_set_objective_function/2,
+        ppl_MIP_Problem_set_optimization_mode/2,
+        ppl_MIP_Problem_is_satisfiable/1,
+        ppl_MIP_Problem_solve/2,
+        ppl_MIP_Problem_feasible_point/2,
+        ppl_MIP_Problem_optimizing_point/2,
+        ppl_MIP_Problem_optimal_value/3,
+        ppl_MIP_Problem_evaluate_objective_function/4,
+        ppl_MIP_Problem_OK/1
 ]).
 
 :- set_prolog_flag(multi_arity_warnings, off).
diff --git a/interfaces/Prolog/Ciao/ppl_ciao.cc b/interfaces/Prolog/Ciao/ppl_ciao.cc
index f90fcf4..1783bb7 100644
--- a/interfaces/Prolog/Ciao/ppl_ciao.cc
+++ b/interfaces/Prolog/Ciao/ppl_ciao.cc
@@ -1,11 +1,11 @@
 /* Ciao Prolog interface: system-dependent part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,22 +21,10 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl.hh"
-#include "pwl.hh"
 #include <ciao_prolog.h>
 #include <cassert>
 #include <sstream>
-
-typedef ciao_term Prolog_term_ref;
-typedef const char* Prolog_atom;
-typedef ciao_bool Prolog_foreign_return_type;
-
-namespace {
-
-const Prolog_foreign_return_type PROLOG_SUCCESS = 1;
-const Prolog_foreign_return_type PROLOG_FAILURE = 0;
-
-} // namespace
-
+#include "ciao_cfli.hh"
 #include "../exceptions.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
@@ -73,338 +61,50 @@ ppl_Prolog_sysdep_init() {
 }
 
 /*!
-  Perform system-dependent de-itialization.
+  Perform system-dependent de-initialization.
 */
 void
 ppl_Prolog_sysdep_deinit() {
 }
 
-/*!
-  Return a new term reference.
-*/
-inline Prolog_term_ref
-Prolog_new_term_ref() {
-  return 0;
-}
-
-/*!
-  Make \p t be a reference to the same term referenced by \p u,
-  i.e., assign \p u to \p t.
-*/
-inline int
-Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
-  t = u;
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p l.
-*/
-inline int
-Prolog_put_long(Prolog_term_ref& t, long l) {
-  t = ciao_integer(l);
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p ul.
-*/
 inline int
-Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
-  if (ul < INT_MAX)
-    t = ciao_integer(ul);
+Prolog_get_Coefficient(Prolog_term_ref t, PPL::Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  if (ciao_fits_in_int(t))
+    n = ciao_to_integer(t);
   else {
-    std::ostringstream s;
-    s << ul;
+    const char* s = ciao_get_number_chars(t);
+    n = PPL::Coefficient(s);
     // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
-    t = ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
+    ciao_free(const_cast<char*>(s));
   }
   return 1;
 }
 
-/*!
-  Assign to \p t an atom whose name is given
-  by the null-terminated string \p s.
-*/
-inline int
-Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
-  t = ciao_atom(s);
-  return 1;
-}
-
-/*!
-  Assign to \p t the Prolog atom \p a.
-*/
-inline int
-Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
-  t = ciao_atom(a);
-  return 1;
-}
-
-/*!
-  Assign to \p t a term representing the address contained in \p p.
-*/
-inline int
-Prolog_put_address(Prolog_term_ref& t, void* p) {
-  t = ciao_pointer_to_address(ciao_implicit_state, p);
-  return 1;
-}
-
-/*!
-  Return an atom whose name is given by the null-terminated string \p s.
-*/
-Prolog_atom
-Prolog_atom_from_string(const char* s) {
-  return ciao_atom_name(ciao_atom(s));
-}
-
-Prolog_term_ref args[4];
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 1 with argument \p a1.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1) {
-  args[0] = a1;
-  t = ciao_structure_a(f, 1, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 2 with arguments \p a1 and \p a2.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2) {
-  args[0] = a1;
-  args[1] = a2;
-  t = ciao_structure_a(f, 2, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 3 with arguments \p a1, \p a2 and \p a3.
-*/
 inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3) {
-  args[0] = a1;
-  args[1] = a2;
-  args[2] = a3;
-  t = ciao_structure_a(f, 3, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3, Prolog_term_ref a4) {
-  args[0] = a1;
-  args[1] = a2;
-  args[2] = a3;
-  args[3] = a4;
-  t = ciao_structure_a(f, 4, args);
-  return 1;
-}
-
-/*!
-  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
-*/
-inline int
-Prolog_construct_cons(Prolog_term_ref& c,
-		      Prolog_term_ref h, Prolog_term_ref t) {
-  c = ciao_list(h, t);
-  return 1;
-}
-
-/*!
-  Raise a Prolog exception with \p t as the exception term.
-*/
-inline void
-Prolog_raise_exception(Prolog_term_ref t) {
-  ciao_raise_exception(t);
-}
-
-/*!
-  Return true if \p t is a Prolog variable, false otherwise.
-*/
-inline int
-Prolog_is_variable(Prolog_term_ref t) {
-  return ciao_is_variable(t);
-}
-
-/*!
-  Return true if \p t is a Prolog atom, false otherwise.
-*/
-inline int
-Prolog_is_atom(Prolog_term_ref t) {
-  return ciao_is_atom(t);
-}
-
-/*!
-  Return true if \p t is a Prolog integer, false otherwise.
-*/
-inline int
-Prolog_is_integer(Prolog_term_ref t) {
-  return ciao_is_integer(t);
-}
-
-/*!
-  Return true if \p t is the representation of an address, false otherwise.
-*/
-inline int
-Prolog_is_address(Prolog_term_ref t) {
-  return ciao_is_address(ciao_implicit_state, t);
-}
-
-/*!
-  Return true if \p t is a Prolog compound term, false otherwise.
-*/
-inline int
-Prolog_is_compound(Prolog_term_ref t) {
-  return ciao_is_structure(t);
-}
-
-/*!
-  Return true if \p t is a Prolog list, false otherwise.
-*/
-inline int
-Prolog_is_cons(Prolog_term_ref t) {
-  return ciao_is_list(t);
-}
-
-/*!
-  Assuming \p t is a Prolog integer, return true if its value fits
-  in a long, in which case the value is assigned to \p v,
-  return false otherwise.  The behavior is undefined if \p t is
-  not a Prolog integer.
-*/
-inline int
-Prolog_get_long(Prolog_term_ref t, long* lp) {
-  assert(ciao_is_integer(t));
-  if (ciao_fits_in_int(t)) {
-    *lp = ciao_to_integer(t);
-    return 1;
-  }
+Prolog_put_Coefficient(Prolog_term_ref& t, const PPL::Coefficient& n) {
+  int i;
+  if (PPL::assign_r(i, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ)
+    t = ciao_integer(i);
   else {
-    char* s = ciao_get_number_chars(t);
-    mpz_class n(s);
-    ciao_free(s);
-    PPL::Result r = PPL::assign_r(*lp, n, PPL::ROUND_NOT_NEEDED);
-    return r == PPL::V_EQ ? 1 : 0;
+    std::ostringstream s;
+    s << n;
+    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+    t = ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
   }
-}
-
-/*!
-  If \p t is the Prolog representation for a memory address, return
-  true and store that address into \p v; return false otherwise.
-  The behavior is undefined if \p t is not an address.
-*/
-inline int
-Prolog_get_address(Prolog_term_ref t, void** vpp) {
-  assert(Prolog_is_address(t));
-  *vpp = ciao_address_to_pointer(ciao_implicit_state, t);
   return 1;
 }
 
-/*!
-  If \p t is a Prolog atom, return true and store its name into \p name.
-  The behavior is undefined if \p t is not a Prolog atom.
-*/
 inline int
-Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
-  assert(Prolog_is_atom(t));
-  *ap = ciao_atom_name(t);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term, return true and store its name
-  and arity into \p name and \p arity, respectively.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
-  assert(Prolog_is_compound(t));
-  *ap = ciao_structure_name(t);
-  *ip = ciao_structure_arity(t);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term and \p i is a positive integer
-  less than or equal to its arity, return true and assign to \p a the
-  i-th (principal) argument of \p t.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
-  assert(Prolog_is_compound(t));
-  a = ciao_structure_arg(t, i);
-  return 1;
-}
-
-/*!
-  If \p c is a Prolog cons (list constructor), assign its head and
-  tail to \p h and \p t, respectively.
-  The behavior is undefined if \p c is not a Prolog cons.
-*/
-inline int
-Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
-  assert(Prolog_is_cons(c));
-  h = ciao_list_head(c);
-  t = ciao_list_tail(c);
-  return 1;
-}
-
-/*!
-  Unify the terms referenced by \p t and \p u and return true
-  if the unification is successful; return false otherwise.
-*/
-inline int
-Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+Prolog_unify_Coefficient(Prolog_term_ref t, const PPL::Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  Prolog_put_Coefficient(u, n);
   return ciao_unify(t, u);
 }
 
-PPL::Coefficient
-integer_term_to_Coefficient(Prolog_term_ref t) {
-  assert(ciao_is_integer(t));
-  if (ciao_fits_in_int(t))
-    return PPL::Coefficient(ciao_to_integer(t));
-  else {
-    char* s;
-    s = ciao_get_number_chars(t);
-    PPL::Coefficient n(s);
-    ciao_free(s);
-    return n;
-  }
-}
-
-Prolog_term_ref
-Coefficient_to_integer_term(const PPL::Coefficient& n) {
-  int i = 0;
-  if (PPL::assign_r(i, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ)
-    return ciao_integer(i);
-  else {
-    std::ostringstream s;
-    s << n;
-    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
-    return ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
-  }
-}
-
 } // namespace
 
-#include "../ppl_prolog.icc"
+#include "../ppl_prolog_main.icc"
 
 extern "C" void
 init() {
diff --git a/interfaces/Prolog/Ciao/ppl_ciao.pl b/interfaces/Prolog/Ciao/ppl_ciao.pl
deleted file mode 100644
index bd9239a..0000000
--- a/interfaces/Prolog/Ciao/ppl_ciao.pl
+++ /dev/null
@@ -1,1683 +0,0 @@
-/* Ciao Prolog interface: Ciao Prolog part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-:- module(ppl_ciao,
-[
-        ppl_version_major/1,
-        ppl_version_minor/1,
-        ppl_version_revision/1,
-        ppl_version_beta/1,
-        ppl_version/1,
-        ppl_banner/1,
-        ppl_max_space_dimension/1,
-        ppl_Coefficient_is_bounded/0,
-        ppl_Coefficient_max/1,
-        ppl_Coefficient_min/1,
-        ppl_initialize/0,
-        ppl_finalize/0,
-        ppl_set_timeout_exception_atom/1,
-        ppl_timeout_exception_atom/1,
-        ppl_set_timeout/1,
-        ppl_reset_timeout/0,
-	ppl_new_C_Polyhedron_from_space_dimension/3,
-	ppl_new_NNC_Polyhedron_from_space_dimension/3,
-	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
-	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
-	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
-	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
-	ppl_new_C_Polyhedron_from_constraints/2,
-	ppl_new_NNC_Polyhedron_from_constraints/2,
-	ppl_new_C_Polyhedron_from_generators/2,
-	ppl_new_NNC_Polyhedron_from_generators/2,
-	ppl_new_C_Polyhedron_from_bounding_box/2,
-	ppl_new_NNC_Polyhedron_from_bounding_box/2,
-        ppl_Polyhedron_swap/2,
-        ppl_delete_Polyhedron/1,
-        ppl_Polyhedron_space_dimension/2,
-        ppl_Polyhedron_affine_dimension/2,
-        ppl_Polyhedron_get_constraints/2,
-        ppl_Polyhedron_get_minimized_constraints/2,
-        ppl_Polyhedron_get_generators/2,
-        ppl_Polyhedron_get_minimized_generators/2,
-        ppl_Polyhedron_relation_with_constraint/3,
-        ppl_Polyhedron_relation_with_generator/3,
-        ppl_Polyhedron_get_bounding_box/3,
-        ppl_Polyhedron_is_empty/1,
-        ppl_Polyhedron_is_universe/1,
-        ppl_Polyhedron_is_bounded/1,
-        ppl_Polyhedron_bounds_from_above/2,
-        ppl_Polyhedron_bounds_from_below/2,
-        ppl_Polyhedron_maximize/5,
-        ppl_Polyhedron_maximize_with_point/6,
-        ppl_Polyhedron_minimize/5,
-        ppl_Polyhedron_minimize_with_point/6,
-        ppl_Polyhedron_is_topologically_closed/1,
-        ppl_Polyhedron_contains_Polyhedron/2,
-        ppl_Polyhedron_strictly_contains_Polyhedron/2,
-        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
-        ppl_Polyhedron_equals_Polyhedron/2,
-        ppl_Polyhedron_OK/1,
-        ppl_Polyhedron_add_constraint/2,
-        ppl_Polyhedron_add_constraint_and_minimize/2,
-        ppl_Polyhedron_add_generator/2,
-        ppl_Polyhedron_add_generator_and_minimize/2,
-        ppl_Polyhedron_add_constraints/2,
-        ppl_Polyhedron_add_constraints_and_minimize/2,
-        ppl_Polyhedron_add_generators/2,
-        ppl_Polyhedron_add_generators_and_minimize/2,
-        ppl_Polyhedron_intersection_assign/2,
-        ppl_Polyhedron_intersection_assign_and_minimize/2,
-        ppl_Polyhedron_poly_hull_assign/2,
-        ppl_Polyhedron_poly_hull_assign_and_minimize/2,
-        ppl_Polyhedron_poly_difference_assign/2,
-        ppl_Polyhedron_affine_image/4,
-        ppl_Polyhedron_affine_preimage/4,
-        ppl_Polyhedron_bounded_affine_image/5,
-        ppl_Polyhedron_bounded_affine_preimage/5,
-        ppl_Polyhedron_generalized_affine_image/5,
-        ppl_Polyhedron_generalized_affine_preimage/5,
-        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
-        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
-        ppl_Polyhedron_time_elapse_assign/2,
-        ppl_Polyhedron_topological_closure_assign/1,
-        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
-        ppl_Polyhedron_BHRZ03_widening_assign/2,
-        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
-        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
-        ppl_Polyhedron_H79_widening_assign_with_tokens/4,
-        ppl_Polyhedron_H79_widening_assign/2,
-        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
-        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
-        ppl_Polyhedron_add_space_dimensions_and_project/2,
-        ppl_Polyhedron_add_space_dimensions_and_embed/2,
-        ppl_Polyhedron_concatenate_assign/2,
-        ppl_Polyhedron_remove_space_dimensions/2,
-        ppl_Polyhedron_remove_higher_space_dimensions/2,
-        ppl_Polyhedron_expand_space_dimension/3,
-        ppl_Polyhedron_fold_space_dimensions/3,
-        ppl_Polyhedron_map_space_dimensions/2,
-	ppl_new_LP_Problem_trivial/1,
-	ppl_new_LP_Problem/4,
-	ppl_new_LP_Problem_from_LP_Problem/2,
-	ppl_LP_Problem_swap/2,
-	ppl_delete_LP_Problem/1,
-	ppl_LP_Problem_space_dimension/2,
-	ppl_LP_Problem_constraints/2,
-	ppl_LP_Problem_objective_function/2,
-	ppl_LP_Problem_optimization_mode/2,
-	ppl_LP_Problem_clear/1,
-	ppl_LP_Problem_add_constraint/2,
-	ppl_LP_Problem_add_constraints/2,
-	ppl_LP_Problem_set_objective_function/2,
-	ppl_LP_Problem_set_optimization_mode/2,
-	ppl_LP_Problem_is_satisfiable/1,
-	ppl_LP_Problem_solve/2,
-	ppl_LP_Problem_feasible_point/2,
-	ppl_LP_Problem_optimizing_point/2,
-	ppl_LP_Problem_optimal_value/3,
-	ppl_LP_Problem_evaluate_objective_function/4,
-	ppl_LP_Problem_OK/1
-],
-[
-        assertions,
-        basicmodes,
-        regtypes,
-        foreign_interface
-]).
-
-
-:- true pred ppl_version_major_2(in(Version),
-                               go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_version_major)).
-
-ppl_version_major(Version) :-
-   ppl_version_major_2(Version, 1).
-
-:- true pred ppl_version_minor_2(in(Version),
-                               go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_version_minor)).
-
-ppl_version_minor(Version) :-
-   ppl_version_minor_2(Version, 1).
-
-:- true pred ppl_version_revision_2(in(Version),
-                               go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_version_revision)).
-
-ppl_version_revision(Version) :-
-   ppl_version_revision_2(Version, 1).
-
-:- true pred ppl_version_beta_2(in(Version),
-                               go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_version_beta)).
-
-ppl_version_beta(Version) :-
-   ppl_version_beta_2(Version, 1).
-
-:- true pred ppl_version_2(in(Version),
-                               go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_version)).
-
-ppl_version(Version) :-
-   ppl_version_2(Version, 1).
-
-
-:- true pred ppl_banner_2(in(Banner),
-                               go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_banner)).
-
-ppl_banner(Banner) :-
-   ppl_banner_2(Banner, 1).
-
-:- true pred ppl_max_space_dimension_2(in(Dimension),
-                                       go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_max_space_dimension)).
-
-ppl_max_space_dimension(Dimension) :-
-   ppl_max_space_dimension_2(Dimension, 1).
-
-:- true pred ppl_Coefficient_is_bounded_1(go(Success))
-          :: int
-  + (returns(Success), foreign(ppl_Coefficient_is_bounded)).
-
-ppl_Coefficient_is_bounded :-
-   ppl_Coefficient_is_bounded_1(1).
-
-:- true pred ppl_Coefficient_max_2(in(Max),
-                                       go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_Coefficient_max)).
-
-ppl_Coefficient_max(Max) :-
-   ppl_Coefficient_max_2(Max, 1).
-
-:- true pred ppl_Coefficient_min_2(in(Min),
-                                       go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_Coefficient_min)).
-
-ppl_Coefficient_min(Min) :-
-   ppl_Coefficient_min_2(Min, 1).
-
-:- true pred ppl_initialize + foreign.
-
-:- true pred ppl_finalize + foreign.
-
-:- true pred ppl_set_timeout_exception_atom(in(Atom))
-             :: any_term + foreign.
-
-:- true pred ppl_timeout_exception_atom_2(in(Atom),
-                                     go(Success))
-  :: any_term * int
-  + (returns(Success), foreign(ppl_timeout_exception_atom)).
-
-ppl_timeout_exception_atom(Atom) :-
-   ppl_timeout_exception_atom_2(Atom, 1).
-
-:- true pred ppl_set_timeout(in(Time))
-             :: any_term + foreign.
-
-:- true pred ppl_reset_timeout + foreign.
-
-:- true pred ppl_new_C_Polyhedron_from_space_dimension_2(in(Dimension),
-                                                 in(Atom),
-                                                 in(Handle),
-                                                 go(Success))
-  :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_space_dimension)).
-
-ppl_new_C_Polyhedron_from_space_dimension(Dimension, Atom, Handle) :-
-   ppl_new_C_Polyhedron_from_space_dimension_2(Dimension, Atom, Handle, 1).
-
-:- true pred ppl_new_NNC_Polyhedron_from_space_dimension_2(in(Dimension),
-                                                 in(Atom),
-                                                 in(Handle),
-                                                 go(Success))
-  :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_space_dimension)).
-
-ppl_new_NNC_Polyhedron_from_space_dimension(Dimension, Atom, Handle) :-
-   ppl_new_NNC_Polyhedron_from_space_dimension_2(Dimension, Atom, Handle, 1).
-
-
-:- true pred ppl_new_C_Polyhedron_from_C_Polyhedron_2(in(Srd_Handle),
-						  in(Dst_Handle),
-						  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_C_Polyhedron)).
-
-ppl_new_C_Polyhedron_from_C_Polyhedron(Src_Handle, Dst_Handle) :-
-   ppl_new_C_Polyhedron_from_C_Polyhedron_2(
-               Src_Handle, Dst_Handle, 1).
-
-:- true pred ppl_new_C_Polyhedron_from_NNC_Polyhedron_2(in(Srd_Handle),
-						  in(Dst_Handle),
-						  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_NNC_Polyhedron)).
-
-ppl_new_C_Polyhedron_from_NNC_Polyhedron(Src_Handle, Dst_Handle) :-
-   ppl_new_C_Polyhedron_from_NNC_Polyhedron_2(
-               Src_Handle, Dst_Handle, 1).
-
-:- true pred ppl_new_NNC_Polyhedron_from_C_Polyhedron_2(in(Srd_Handle),
-						  in(Dst_Handle),
-						  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_C_Polyhedron)).
-
-ppl_new_NNC_Polyhedron_from_C_Polyhedron(Src_Handle, Dst_Handle) :-
-   ppl_new_NNC_Polyhedron_from_C_Polyhedron_2(
-               Src_Handle, Dst_Handle, 1).
-
-:- true pred ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2(in(Srd_Handle),
-						  in(Dst_Handle),
-						  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)).
-
-ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Src_Handle, Dst_Handle) :-
-   ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2(
-               Src_Handle, Dst_Handle, 1).
-
-:- true pred ppl_new_C_Polyhedron_from_constraints_2(in(CList),
-                                                   in(Handle),
-                                                   go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_constraints)).
-
-ppl_new_C_Polyhedron_from_constraints(CList, Handle) :-
-   ppl_new_C_Polyhedron_from_constraints_2(CList, Handle, 1).
-
-:- true pred ppl_new_NNC_Polyhedron_from_constraints_2(in(CList),
-                                                   in(Handle),
-                                                   go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_constraints)).
-
-ppl_new_NNC_Polyhedron_from_constraints(CList, Handle) :-
-   ppl_new_NNC_Polyhedron_from_constraints_2(CList, Handle, 1).
-
-:- true pred ppl_new_C_Polyhedron_from_generators_2(in(GList),
-                                                  in(Handle),
-                                                  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_generators)).
-
-ppl_new_C_Polyhedron_from_generators(GList, Handle) :-
-   ppl_new_C_Polyhedron_from_generators_2(GList, Handle, 1).
-
-:- true pred ppl_new_NNC_Polyhedron_from_generators_2(in(GList),
-                                                  in(Handle),
-                                                  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_generators)).
-
-ppl_new_NNC_Polyhedron_from_generators(GList, Handle) :-
-   ppl_new_NNC_Polyhedron_from_generators_2(GList, Handle, 1).
-
-
-:- true pred ppl_new_C_Polyhedron_from_bounding_box_2(in(BBox),
-                                               in(Handle),
-                                               go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_bounding_box)).
-
-ppl_new_C_Polyhedron_from_bounding_box(BBox, Handle) :-
-   ppl_new_C_Polyhedron_from_bounding_box_2(BBox, Handle, 1).
-
-:- true pred ppl_new_NNC_Polyhedron_from_bounding_box_2(in(BBox),
-                                               in(Handle),
-                                               go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_bounding_box)).
-
-ppl_new_NNC_Polyhedron_from_bounding_box(BBox, Handle) :-
-   ppl_new_NNC_Polyhedron_from_bounding_box_2(BBox, Handle, 1).
-
-:- true pred ppl_Polyhedron_swap(in(Handle1),
-                                 in(Handle2))
-  :: any_term * any_term + foreign.
-
-:- true pred ppl_delete_Polyhedron(in(Handle))
-  :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_space_dimension_2(in(Handle),
-                                              in(Dimension),
-                                              go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_space_dimension)).
-
-ppl_Polyhedron_space_dimension(Handle, Dimension) :-
-        ppl_Polyhedron_space_dimension_2(Handle, Dimension, 1).
-
-:- true pred ppl_Polyhedron_affine_dimension_2(in(Handle),
-					       in(Dimension),
-					       go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_affine_dimension)).
-
-ppl_Polyhedron_affine_dimension(Handle, Dimension) :-
-        ppl_Polyhedron_affine_dimension_2(Handle, Dimension, 1).
-
-:- true pred ppl_Polyhedron_get_constraints_2(in(Handle),
-                                              in(CList),
-                                              go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_get_constraints)).
-
-ppl_Polyhedron_get_constraints(Handle, CList) :-
-        ppl_Polyhedron_get_constraints_2(Handle, CList, 1).
-
-
-:- true pred ppl_Polyhedron_get_minimized_constraints_2(in(Handle),
-                                                        in(CList),
-                                                        go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_get_minimized_constraints)).
-
-ppl_Polyhedron_get_minimized_constraints(Handle, CList) :-
-        ppl_Polyhedron_get_minimized_constraints_2(Handle, CList, 1).
-
-:- true pred ppl_Polyhedron_get_generators_2(in(Handle),
-                                             in(GList),
-                                             go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_get_generators)).
-
-ppl_Polyhedron_get_generators(Handle, GList) :-
-        ppl_Polyhedron_get_generators_2(Handle, GList, 1).
-
-
-:- true pred ppl_Polyhedron_get_minimized_generators_2(in(Handle),
-                                                       in(GList),
-                                                       go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_get_minimized_generators)).
-
-ppl_Polyhedron_get_minimized_generators(Handle, GList) :-
-        ppl_Polyhedron_get_minimized_generators_2(Handle, GList, 1).
-
-:- true pred ppl_Polyhedron_relation_with_constraint_2(in(Handle),
-                                                       in(Constraint),
-                                                       in(RList),
-                                                       go(Success))
-  :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_relation_with_constraint)).
-
-ppl_Polyhedron_relation_with_constraint(Handle, Constraint, RList) :-
-        ppl_Polyhedron_relation_with_constraint_2(Handle, Constraint,
-                                                  RList, 1).
-
-:- true pred ppl_Polyhedron_relation_with_generator_2(in(Handle),
-                                                     in(Generator),
-                                                     in(RList),
-                                                     go(Success))
-  :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_relation_with_generator)).
-
-ppl_Polyhedron_relation_with_generator(Handle, Generator, RList) :-
-        ppl_Polyhedron_relation_with_generator_2(Handle, Generator, RList, 1).
-
-:- true pred ppl_Polyhedron_get_bounding_box_2(in(Handle),
-                                               in(Relation),
-                                               in(BBox),
-                                               go(Success))
-  :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_get_bounding_box)).
-
-ppl_Polyhedron_get_bounding_box(Handle, Relation, BBox) :-
-        ppl_Polyhedron_get_bounding_box_2(Handle, Relation, BBox, 1).
-
-:- true pred ppl_Polyhedron_is_empty_2(in(Handle),
-                                       go(Success))
-  :: any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_is_empty)).
-
-ppl_Polyhedron_is_empty(Handle) :-
-	ppl_Polyhedron_is_empty_2(Handle, 1).
-
-:- true pred ppl_Polyhedron_is_universe_2(in(Handle),
-                                          go(Success))
-  :: any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_is_universe)).
-
-ppl_Polyhedron_is_universe(Handle) :-
-	ppl_Polyhedron_is_universe_2(Handle, 1).
-
-:- true pred ppl_Polyhedron_is_bounded_2(in(Handle),
-                                         go(Success))
-  :: any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_is_bounded)).
-
-ppl_Polyhedron_is_bounded(Handle) :-
-	ppl_Polyhedron_is_bounded_2(Handle, 1).
-
-:- true pred ppl_Polyhedron_bounds_from_above_2(in(Handle),
-                                                in(Linear_Expression),
-                                                go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_bounds_from_above)).
-
-ppl_Polyhedron_bounds_from_above(Handle, Linear_Expression) :-
-	ppl_Polyhedron_bounds_from_above_2(Handle, Linear_Expression, 1).
-
-:- true pred ppl_Polyhedron_bounds_from_below_2(in(Handle),
-                                                in(Linear_Expression),
-                                                go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_bounds_from_below)).
-
-ppl_Polyhedron_bounds_from_below(Handle, Linear_Expression) :-
-	ppl_Polyhedron_bounds_from_below_2(Handle, Linear_Expression, 1).
-
-:- true pred ppl_Polyhedron_maximize_2(in(Handle),
-                                       in(Linear_Expression),
-                                       in(Num),
-                                       in(Den),
-                                       in(Max),
-                                       go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_maximize)).
-
-ppl_Polyhedron_maximize(Handle, Linear_Expression, Num, Den, Max) :-
-	ppl_Polyhedron_maximize_2(Handle, Linear_Expression, Num, Den, Max, 1).
-
-:- true pred ppl_Polyhedron_maximize_with_point_2(in(Handle),
-                                       in(Linear_Expression),
-                                       in(Num),
-                                       in(Den),
-                                       in(Max),
-                                       in(Point),
-                                       go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_maximize_with_point)).
-
-ppl_Polyhedron_maximize_with_point(Handle, Linear_Expression,
-				   Num, Den, Max, Point) :-
-	ppl_Polyhedron_maximize_with_point_2(Handle, Linear_Expression,
-					     Num, Den, Max, Point, 1).
-
-:- true pred ppl_Polyhedron_minimize_2(in(Handle),
-                                       in(Linear_Expression),
-                                       in(Num),
-                                       in(Den),
-                                       in(Min),
-                                       go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_minimize)).
-
-ppl_Polyhedron_minimize(Handle, Linear_Expression, Num, Den, Min) :-
-	ppl_Polyhedron_minimize_2(Handle, Linear_Expression, Num, Den, Min, 1).
-
-:- true pred ppl_Polyhedron_minimize_with_point_2(in(Handle),
-                                       in(Linear_Expression),
-                                       in(Num),
-                                       in(Den),
-                                       in(Min),
-                                       in(Point),
-                                       go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_minimize_with_point)).
-
-ppl_Polyhedron_minimize_with_point(Handle, Linear_Expression,
-				   Num, Den, Min, Point) :-
-	ppl_Polyhedron_minimize_with_point_2(Handle, Linear_Expression,
-					     Num, Den, Min, Point, 1).
-
-:- true pred ppl_Polyhedron_is_topologically_closed_2(in(Handle),
-                                                      go(Success))
-  :: any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_is_topologically_closed)).
-
-ppl_Polyhedron_is_topologically_closed(Handle) :-
-	ppl_Polyhedron_is_topologically_closed_2(Handle, 1).
-
-
-:- true pred ppl_Polyhedron_contains_Polyhedron_2(in(Handle1),
-                                                  in(Handle2),
-                                                  go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_contains_Polyhedron)).
-
-ppl_Polyhedron_contains_Polyhedron(Handle1, Handle2) :-
-	ppl_Polyhedron_contains_Polyhedron_2(Handle1, Handle2, 1).
-
-
-:- true pred ppl_Polyhedron_strictly_contains_Polyhedron_2(in(Handle1),
-                                                           in(Handle2),
-                                                           go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_strictly_contains_Polyhedron)).
-
-ppl_Polyhedron_strictly_contains_Polyhedron(Handle1, Handle2) :-
-	ppl_Polyhedron_strictly_contains_Polyhedron_2(Handle1, Handle2, 1).
-
-:- true pred ppl_Polyhedron_is_disjoint_from_Polyhedron_2(in(Handle1),
-                                                          in(Handle2),
-                                                          go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_is_disjoint_from_Polyhedron)).
-
-ppl_Polyhedron_is_disjoint_from_Polyhedron(Handle1, Handle2) :-
-	ppl_Polyhedron_is_disjoint_from_Polyhedron_2(Handle1, Handle2, 1).
-
-
-:- true pred ppl_Polyhedron_equals_Polyhedron_2(in(Handle1),
-                                                in(Handle2),
-                                                go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_equals_Polyhedron)).
-
-ppl_Polyhedron_equals_Polyhedron(Handle1, Handle2) :-
-	ppl_Polyhedron_equals_Polyhedron_2(Handle1, Handle2, 1).
-
-:- true pred ppl_Polyhedron_OK_2(in(Handle),
-                                 go(Success))
-  :: any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_OK)).
-
-ppl_Polyhedron_OK(Handle) :-
-	ppl_Polyhedron_OK_2(Handle, 1).
-
-:- true pred ppl_Polyhedron_add_constraint(in(Handle), in(Constraint))
-  :: any_term * any_term + foreign.
-
-
-:- true pred ppl_Polyhedron_add_constraint_and_minimize_2(in(Handle),
-                                                          in(Constraint),
-                                                          go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_add_constraint_and_minimize)).
-
-ppl_Polyhedron_add_constraint_and_minimize(Handle, Constraint) :-
-        ppl_Polyhedron_add_constraint_and_minimize_2(Handle, Constraint, 1).
-
-:- true pred ppl_Polyhedron_add_generator(in(Handle), in(Generator))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_generator_and_minimize_2(in(Handle),
-                                                         in(Generator),
-                                                         go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_add_generator_and_minimize)).
-
-ppl_Polyhedron_add_generator_and_minimize(Handle, Generator) :-
-        ppl_Polyhedron_add_generator_and_minimize_2(Handle, Generator, 1).
-
-:- true pred ppl_Polyhedron_add_constraints(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_constraints_and_minimize_2(in(Handle),
-                                                           in(CList),
-                                                           go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_add_constraints_and_minimize)).
-
-ppl_Polyhedron_add_constraints_and_minimize(Handle, CList) :-
-        ppl_Polyhedron_add_constraints_and_minimize_2(Handle, CList, 1).
-
-:- true pred ppl_Polyhedron_add_generators(in(Handle), in(GList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_generators_and_minimize_2(in(Handle),
-                                                          in(GList),
-                                                          go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_add_generators_and_minimize)).
-
-ppl_Polyhedron_add_generators_and_minimize(Handle, GList) :-
-        ppl_Polyhedron_add_generators_and_minimize_2(Handle, GList, 1).
-
-
-:- true pred ppl_Polyhedron_intersection_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_intersection_assign_and_minimize_2(in(Handle1),
-                                                          in(Handle2),
-                                                          go(Success))
-  :: any_term * any_term * int
-  + (returns(Success),
-	foreign(ppl_Polyhedron_intersection_assign_and_minimize)).
-
-ppl_Polyhedron_intersection_assign_and_minimize(Handle1, Handle2) :-
-        ppl_Polyhedron_intersection_assign_and_minimize_2(Handle1, Handle2, 1).
-
-:- true pred ppl_Polyhedron_poly_hull_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_poly_hull_assign_and_minimize_2(in(Handle1),
-                                                          in(Handle2),
-                                                          go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_poly_hull_assign_and_minimize)).
-
-ppl_Polyhedron_poly_hull_assign_and_minimize(Handle1, Handle2) :-
-        ppl_Polyhedron_poly_hull_assign_and_minimize_2(Handle1, Handle2, 1).
-
-:- true pred ppl_Polyhedron_poly_difference_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_affine_image(in(Handle), in(Var),
-                                         in(Linear_Expression), in(Divisor))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_affine_preimage(in(Handle), in(Var),
-                                            in(Linear_Expression), in(Divisor))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_affine_image(in(Handle), in(Var),
-                                                 in(Lower_Bound),
-                                                 in(Upper_Bound),
-                                                 in(Divisor))
-  :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_affine_preimage(in(Handle), in(Var),
-                                                    in(Lower_Bound),
-                                                    in(Upper_Bound),
-                                                    in(Divisor))
-  :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_image(in(Handle),
-                                                     in(Var), in(Rel),
-                                                     in(Linear_Expression),
-                                                     in(Divisor))
-  :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_preimage(in(Handle),
-                                                        in(Var), in(Rel),
-                                                        in(Linear_Expression),
-                                                        in(Divisor))
-  :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_image_lhs_rhs(
-                 in(Handle), in(LHS), in(Rel), in(RHS))
-  :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(
-                 in(Handle), in(LHS), in(Rel), in(RHS))
-  :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_time_elapse_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_topological_closure_assign(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2(
-                 in(Handle1), in(Handle2), in(Tokens1), in(Tokens2),
-                 go(Success))
-  :: any_term * any_term * any_term * any_term * int
-  + (returns(Success),
-      foreign(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)).
-
-ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
-                  Handle1, Handle2, Tokens1, Tokens2) :-
-      ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2(
-                  Handle1, Handle2, Tokens1, Tokens2, 1).
-
-:- true pred ppl_Polyhedron_BHRZ03_widening_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2(
-                 in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
-                 go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success),
-      foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)).
-
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
-                  Handle1, Handle2, CList, Tokens1, Tokens2) :-
-      ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2(
-                  Handle1, Handle2, CList, Tokens1, Tokens2, 1).
-
-:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(in(Handle1),
-                                                               in(CList),
-                                                                in(Handle2))
-  :: any_term * any_term * any_term + foreign.
-
-
-:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2(
-                 in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
-                 go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success),
-      foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)).
-
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
-                  Handle1, Handle2, CList, Tokens1, Tokens2) :-
-      ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2(
-                  Handle1, Handle2, CList, Tokens1, Tokens2, 1).
-
-:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(in(Handle1),
-                                                               in(CList),
-                                                                in(Handle2))
-             :: any_term * any_term * any_term + foreign.
-
-
-:- true pred ppl_Polyhedron_H79_widening_assign_with_tokens_2(
-                 in(Handle1), in(Handle2), in(Tokens1), in(Tokens2),
-                 go(Success))
-  :: any_term * any_term * any_term * any_term * int
-  + (returns(Success), 
-      foreign(ppl_Polyhedron_H79_widening_assign_with_tokens)).
-
-ppl_Polyhedron_H79_widening_assign_with_tokens(
-                  Handle1, Handle2, Tokens1, Tokens2) :-
-      ppl_Polyhedron_H79_widening_assign_with_tokens_2(
-                  Handle1, Handle2, Tokens1, Tokens2, 1).
-
-:- true pred ppl_Polyhedron_H79_widening_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2(
-                 in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
-                 go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success),
-      foreign(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)).
-
-ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(Handle1,
-                                                           Handle2,
-                                                           CList,
-                                                           Tokens1,
-                                                           Tokens2) :-
-  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2(Handle1,
-                                                               Handle2,
-                                                               CList,
-                                                               Tokens1,
-                                                               Tokens2,
-                                                               1).
-
-:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign(in(Handle1),
-                                                             in(Handle2),
-                                                             in(CList))
-  :: any_term * any_term * any_term + foreign.
-
-:- true pred
-  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2(in(Handle1),
-                                                               in(Handle2),
-                                                               in(CList),
-                                                               in(Tokens1),
-                                                               in(Tokens2),
-                                                               go(Success))
-  :: any_term * any_term * any_term * any_term * any_term * int
-  + (returns(Success),
-    foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)).
-
-ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(Handle1,
-                                                           Handle2,
-                                                           CList,
-                                                           Tokens1,
-                                                           Tokens2) :-
-  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2(Handle1,
-                                                               Handle2,
-                                                               CList,
-                                                               Tokens1,
-                                                               Tokens2,
-                                                               1).
-
-:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign(in(Handle1),
-                                                             in(Handle2),
-                                                             in(CList))
-  :: any_term * any_term * any_term + foreign.
-
-:- true pred
-   ppl_Polyhedron_add_space_dimensions_and_project(in(Handle),
-                                                   in(NDimensions_To_Add))
-  :: any_term * any_term + foreign.
-
-:- true pred
-   ppl_Polyhedron_add_space_dimensions_and_embed(in(Handle),
-                                                 in(NDimensions_To_Add))
-  :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_concatenate_assign(in(Handle1), in(Handle2))
-  :: any_term * any_term + foreign.
-
-ppl_Polyhedron_remove_space_dimensions(Handle, VList) :-
-	ppl_Polyhedron_remove_space_dimensions_2(Handle, VList, 1).
-
-:- true pred ppl_Polyhedron_remove_space_dimensions_2(in(Handle), in(VList),
-                                                go(Success))
-  :: any_term * any_term * int
- + (returns(Success), foreign(ppl_Polyhedron_remove_space_dimensions)).
-
-:- true pred ppl_Polyhedron_remove_higher_space_dimensions(in(Handle),
-                                                           in(Dimensions))
-  :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_expand_space_dimension(in(Handle),
-                                                   in(Var),
-                                                   in(Dimensions))
-  :: any_term * any_term * any_term + foreign.
-
-ppl_Polyhedron_fold_space_dimensions(Handle, VList, Var) :-
-	ppl_Polyhedron_fold_space_dimensions_2(Handle, VList, Var, 1).
-
-:- true pred ppl_Polyhedron_fold_space_dimensions_2(in(Handle),
-                                                 in(VList),
-                                                 in(Var),
-                                                go(Success))
-  :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_fold_space_dimensions)).
-
-
-ppl_Polyhedron_map_space_dimensions(Handle, PIFunc) :-
-	ppl_Polyhedron_map_space_dimensions_2(Handle, PIFunc, 1).
-
-:- true pred ppl_Polyhedron_map_space_dimensions_2(in(Handle),
-                                                 in(PIFunc),
-                                                go(Success))
-  :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_Polyhedron_map_space_dimensions)).
-
-:- true pred ppl_new_LP_Problem_trivial_2(in(Term1), go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_new_LP_Problem_trivial)).
- 
-ppl_new_LP_Problem_trivial(Term1) :-
-   ppl_new_LP_Problem_trivial_2(Term1, 1).
-
-:- true pred ppl_new_LP_Problem_2(in(Term1), in(Term2), in(Term3), in(Term4), go(Success))
-          :: any_term * any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_LP_Problem)).
- 
-ppl_new_LP_Problem(Term1, Term2, Term3, Term4) :-
-   ppl_new_LP_Problem_2(Term1, Term2, Term3, Term4, 1).
-
-:- true pred ppl_new_LP_Problem_from_LP_Problem_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_new_LP_Problem_from_LP_Problem)).
- 
-ppl_new_LP_Problem_from_LP_Problem(Term1, Term2) :-
-   ppl_new_LP_Problem_from_LP_Problem_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_swap_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_swap)).
- 
-ppl_LP_Problem_swap(Term1, Term2) :-
-   ppl_LP_Problem_swap_2(Term1, Term2, 1).
-
-:- true pred ppl_delete_LP_Problem_2(in(Term1), go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_delete_LP_Problem)).
- 
-ppl_delete_LP_Problem(Term1) :-
-   ppl_delete_LP_Problem_2(Term1, 1).
-
-:- true pred ppl_LP_Problem_space_dimension_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_space_dimension)).
- 
-ppl_LP_Problem_space_dimension(Term1, Term2) :-
-   ppl_LP_Problem_space_dimension_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_constraints_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_constraints)).
- 
-ppl_LP_Problem_constraints(Term1, Term2) :-
-   ppl_LP_Problem_constraints_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_objective_function_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_objective_function)).
- 
-ppl_LP_Problem_objective_function(Term1, Term2) :-
-   ppl_LP_Problem_objective_function_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_optimization_mode_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_optimization_mode)).
- 
-ppl_LP_Problem_optimization_mode(Term1, Term2) :-
-   ppl_LP_Problem_optimization_mode_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_clear_2(in(Term1), go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_clear)).
- 
-ppl_LP_Problem_clear(Term1) :-
-   ppl_LP_Problem_clear_2(Term1, 1).
-
-:- true pred ppl_LP_Problem_add_constraint_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_add_constraint)).
- 
-ppl_LP_Problem_add_constraint(Term1, Term2) :-
-   ppl_LP_Problem_add_constraint_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_add_constraints_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_add_constraints)).
- 
-ppl_LP_Problem_add_constraints(Term1, Term2) :-
-   ppl_LP_Problem_add_constraints_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_set_objective_function_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_set_objective_function)).
- 
-ppl_LP_Problem_set_objective_function(Term1, Term2) :-
-   ppl_LP_Problem_set_objective_function_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_set_optimization_mode_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_set_optimization_mode)).
- 
-ppl_LP_Problem_set_optimization_mode(Term1, Term2) :-
-   ppl_LP_Problem_set_optimization_mode_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_is_satisfiable_2(in(Term1), go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_is_satisfiable)).
- 
-ppl_LP_Problem_is_satisfiable(Term1) :-
-   ppl_LP_Problem_is_satisfiable_2(Term1, 1).
-
-:- true pred ppl_LP_Problem_solve_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_solve)).
- 
-ppl_LP_Problem_solve(Term1, Term2) :-
-   ppl_LP_Problem_solve_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_feasible_point_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_feasible_point)).
- 
-ppl_LP_Problem_feasible_point(Term1, Term2) :-
-   ppl_LP_Problem_feasible_point_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_optimizing_point_2(in(Term1), in(Term2), go(Success))
-          :: any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_optimizing_point)).
- 
-ppl_LP_Problem_optimizing_point(Term1, Term2) :-
-   ppl_LP_Problem_optimizing_point_2(Term1, Term2, 1).
-
-:- true pred ppl_LP_Problem_optimal_value_2(in(Term1), in(Term2), in(Term3), go(Success))
-          :: any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_optimal_value)).
- 
-ppl_LP_Problem_optimal_value(Term1, Term2, Term3) :-
-   ppl_LP_Problem_optimal_value_2(Term1, Term2, Term3, 1).
-
-:- true pred ppl_LP_Problem_evaluate_objective_function_2(in(Term1), in(Term2), in(Term3), in(Term4), go(Success))
-          :: any_term * any_term * any_term * any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_evaluate_objective_function)).
- 
-ppl_LP_Problem_evaluate_objective_function(Term1, Term2, Term3, Term4) :-
-   ppl_LP_Problem_evaluate_objective_function_2(Term1, Term2, Term3, Term4, 1).
-
-:- true pred ppl_LP_Problem_OK_2(in(Term1), go(Success))
-          :: any_term * int
-  + (returns(Success), foreign(ppl_LP_Problem_OK)).
- 
-ppl_LP_Problem_OK(Term1) :-
-   ppl_LP_Problem_OK_2(Term1, 1).
-
-:- extra_linker_opts('-L.libs').
-:- use_foreign_library(ppl_ciao).
-
-:- impl_defined(
-[
-        ppl_version_major_2/2,
-%        ppl_version_major/1,
-        ppl_version_minor_2/2,
-%        ppl_version_minor/1,
-        ppl_version_revision_2/2,
-%        ppl_version_revision/1,
-        ppl_version_beta_2/2,
-%        ppl_version_beta/1,
-        ppl_version_2/2,
-%        ppl_version/1,
-        ppl_banner_2/2,
-%        ppl_banner/1,
-        ppl_max_space_dimension_2/2,
-%        ppl_max_space_dimension/1,
-        ppl_Coefficient_is_bounded_1/1,
-        ppl_Coefficient_max_2/2,
-        ppl_Coefficient_min_2/2,
-        ppl_initialize/0,
-        ppl_finalize/0,
-        ppl_set_timeout_exception_atom/1,
-%        ppl_timeout_exception_atom/1,
-        ppl_timeout_exception_atom_2/2,
-        ppl_set_timeout/1,
-        ppl_reset_timeout/0,
-%        ppl_new_Polyhedron_from_space_dimension/4,
-        ppl_new_C_Polyhedron_from_space_dimension_2/4,
-        ppl_new_NNC_Polyhedron_from_space_dimension_2/4,
-%        ppl_new_Polyhedron_from_Polyhedron/4,
-        ppl_new_C_Polyhedron_from_C_Polyhedron_2/3,
-        ppl_new_C_Polyhedron_from_NNC_Polyhedron_2/3,
-        ppl_new_NNC_Polyhedron_from_C_Polyhedron_2/3,
-        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2/3,
-%        ppl_new_Polyhedron_from_constraints/3,
-        ppl_new_C_Polyhedron_from_constraints_2/3,
-        ppl_new_NNC_Polyhedron_from_constraints_2/3,
-%        ppl_new_Polyhedron_from_generators/3,
-        ppl_new_C_Polyhedron_from_generators_2/3,
-        ppl_new_NNC_Polyhedron_from_generators_2/3,
-%        ppl_new_Polyhedron_from_bounding_box/3,
-        ppl_new_C_Polyhedron_from_bounding_box_2/3,
-        ppl_new_NNC_Polyhedron_from_bounding_box_2/3,
-        ppl_Polyhedron_swap/2,
-        ppl_delete_Polyhedron/1,
-%        ppl_Polyhedron_space_dimension/2,
-        ppl_Polyhedron_space_dimension_2/3,
-%        ppl_Polyhedron_affine_dimension/2,
-        ppl_Polyhedron_affine_dimension_2/3,
-%        ppl_Polyhedron_get_constraints/2,
-        ppl_Polyhedron_get_constraints_2/3,
-%        ppl_Polyhedron_get_minimized_constraints/2,
-        ppl_Polyhedron_get_minimized_constraints_2/3,
-%        ppl_Polyhedron_get_generators/2,
-        ppl_Polyhedron_get_generators_2/3,
-%        ppl_Polyhedron_get_minimized_generators/2,
-        ppl_Polyhedron_get_minimized_generators_2/3,
-%        ppl_Polyhedron_relation_with_constraint/3,
-        ppl_Polyhedron_relation_with_constraint_2/4,
-%        ppl_Polyhedron_relation_with_generator/3,
-        ppl_Polyhedron_relation_with_generator_2/4,
-%        ppl_Polyhedron_get_bounding_box/3,
-        ppl_Polyhedron_get_bounding_box_2/4,
-%        ppl_Polyhedron_is_empty/1,
-        ppl_Polyhedron_is_empty_2/2,
-%        ppl_Polyhedron_is_universe/1,
-        ppl_Polyhedron_is_universe_2/2,
-%        ppl_Polyhedron_is_bounded/1,
-        ppl_Polyhedron_is_bounded_2/2,
-%        ppl_Polyhedron_bounds_from_above/2,
-        ppl_Polyhedron_bounds_from_above_2/3,
-%        ppl_Polyhedron_bounds_from_below/2,
-        ppl_Polyhedron_bounds_from_below_2/3,
-%        ppl_Polyhedron_maximize/5,
-        ppl_Polyhedron_maximize_2/6,
-%        ppl_Polyhedron_maximize_with_point/6,
-        ppl_Polyhedron_maximize_with_point_2/7,
-%        ppl_Polyhedron_minimize/5,
-        ppl_Polyhedron_minimize_2/6,
-%        ppl_Polyhedron_minimize_with_point/6,
-        ppl_Polyhedron_minimize_with_point_2/7,
-%        ppl_Polyhedron_is_topologically_closed/1,
-        ppl_Polyhedron_is_topologically_closed_2/2,
-%        ppl_Polyhedron_contains_Polyhedron/2,
-        ppl_Polyhedron_contains_Polyhedron_2/3,
-%        ppl_Polyhedron_strictly_contains_Polyhedron/2,
-        ppl_Polyhedron_strictly_contains_Polyhedron_2/3,
-%        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
-        ppl_Polyhedron_is_disjoint_from_Polyhedron_2/3,
-%        ppl_Polyhedron_equals_Polyhedron/2,
-        ppl_Polyhedron_equals_Polyhedron_2/3,
-%        ppl_Polyhedron_OK/1,
-        ppl_Polyhedron_OK_2/2,
-        ppl_Polyhedron_add_constraint/2,
-%        ppl_Polyhedron_add_constraint_and_minimize/2,
-        ppl_Polyhedron_add_constraint_and_minimize_2/3,
-        ppl_Polyhedron_add_generator/2,
-%        ppl_Polyhedron_add_generator_and_minimize/2,
-        ppl_Polyhedron_add_generator_and_minimize_2/3,
-        ppl_Polyhedron_add_constraints/2,
-%        ppl_Polyhedron_add_constraints_and_minimize/2,
-        ppl_Polyhedron_add_constraints_and_minimize_2/3,
-        ppl_Polyhedron_add_generators/2,
-%        ppl_Polyhedron_add_generators_and_minimize/2,
-        ppl_Polyhedron_add_generators_and_minimize_2/3,
-        ppl_Polyhedron_intersection_assign/2,
-%        ppl_Polyhedron_intersection_assign_and_minimize/2,
-        ppl_Polyhedron_intersection_assign_and_minimize_2/3,
-        ppl_Polyhedron_poly_hull_assign/2,
-%        ppl_Polyhedron_poly_hull_assign_and_minimize/2,
-        ppl_Polyhedron_poly_hull_assign_and_minimize_2/3,
-        ppl_Polyhedron_poly_difference_assign/2,
-        ppl_Polyhedron_affine_image/4,
-        ppl_Polyhedron_affine_preimage/4,
-        ppl_Polyhedron_bounded_affine_image/5,
-        ppl_Polyhedron_bounded_affine_preimage/5,
-        ppl_Polyhedron_generalized_affine_image/5,
-        ppl_Polyhedron_generalized_affine_preimage/5,
-        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
-        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
-        ppl_Polyhedron_time_elapse_assign/2,
-        ppl_Polyhedron_topological_closure_assign/1,
-%        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
-        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2/5,
-        ppl_Polyhedron_BHRZ03_widening_assign/2,
-%        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2/6,
-        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
-%        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2/6,
-        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
-%        ppl_Polyhedron_H79_widening_assign_with_tokens/4,
-        ppl_Polyhedron_H79_widening_assign_with_tokens_2/5,
-        ppl_Polyhedron_H79_widening_assign/2,
-%        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2/6,
-        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
-%        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
-        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2/6,
-        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
-        ppl_Polyhedron_add_space_dimensions_and_project/2,
-        ppl_Polyhedron_add_space_dimensions_and_embed/2,
-        ppl_Polyhedron_concatenate_assign/2,
-%        ppl_Polyhedron_remove_space_dimensions/2,
-        ppl_Polyhedron_remove_space_dimensions_2/3,
-        ppl_Polyhedron_remove_higher_space_dimensions/2,
-        ppl_Polyhedron_expand_space_dimension/3,
-%        ppl_Polyhedron_fold_space_dimensions/3,
-        ppl_Polyhedron_fold_space_dimensions_2/4,
-%        ppl_Polyhedron_map_space_dimensions/2
-        ppl_Polyhedron_map_space_dimensions_2/3,
-	ppl_new_LP_Problem_trivial_2/2,
-	ppl_new_LP_Problem_2/5,
-	ppl_new_LP_Problem_from_LP_Problem_2/3,
-	ppl_LP_Problem_swap_2/3,
-	ppl_delete_LP_Problem_2/2,
-	ppl_LP_Problem_space_dimension_2/3,
-	ppl_LP_Problem_constraints_2/3,
-	ppl_LP_Problem_objective_function_2/3,
-	ppl_LP_Problem_optimization_mode_2/3,
-	ppl_LP_Problem_clear_2/2,
-	ppl_LP_Problem_add_constraint_2/3,
-	ppl_LP_Problem_add_constraints_2/3,
-	ppl_LP_Problem_set_objective_function_2/3,
-	ppl_LP_Problem_set_optimization_mode_2/3,
-	ppl_LP_Problem_is_satisfiable_2/2,
-	ppl_LP_Problem_solve_2/3,
-	ppl_LP_Problem_feasible_point_2/3,
-	ppl_LP_Problem_optimizing_point_2/3,
-	ppl_LP_Problem_optimal_value_2/4,
-	ppl_LP_Problem_evaluate_objective_function_2/5,
-	ppl_LP_Problem_OK_2/2
-]).
-
-:- comment(version_maintenance,off).
-
-/*
-***********************************************
-This commnted code has been kept for future use
-since the above version of this is temporary.
-***********************************************
-
-:- true ppl_version_major(in(Version))
-             :: any_term + foreign.
-
-:- true ppl_version_minor
-             :: any_term + foreign.
-
-:- true ppl_version_revision
-             :: any_term + foreign.
-
-:- true ppl_version_beta
-             :: any_term + foreign.
-
-:- true ppl_version
-             :: any_term + foreign.
-
-:- true ppl_max_space_dimension
-             :: any_term + foreign.
-
-:- true pred ppl_initialize + foreign.
-
-:- true pred ppl_finalize + foreign.
-
-:- true pred ppl_set_timeout_exception_atom(in(Atom))
-             :: any_term + foreign.
-
-:- true pred ppl_timeout_exception_atom(in(Term))
-             :: any_term + foreign.
-
-:- true pred ppl_set_timeout(in(Time))
-             :: any_term + foreign.
-
-:- true pred ppl_reset_timeout + foreign.
-
-:- true pred ppl_new_Polyhedron_from_space_dimension(in(Kind),
-                                               in(Dimension),
-                                               in(Atom),
-                                               in(Handle))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_new_Polyhedron_from_Polyhedron(in(Src_Kind),
-                                                in(Src_Handle),
-                                                in(Dst_Kind),
-                                                in(Dst_Handle))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_new_Polyhedron_from_constraints(in(Kind),
-                                                 in(CList),
-                                                 in(Handle))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_new_Polyhedron_from_generators(in(Kind),
-                                                in(GList),
-                                                in(Handle))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_new_Polyhedron_from_bounding_box(in(Kind),
-                                                  in(BBox),
-                                                  in(Handle))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_swap(in(Handle1),
-                                 in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_delete_Polyhedron(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_space_dimension(in(Handle), in(Dimension))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_affine_dimension(in(Handle), in(Dimension))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_get_constraints(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_get_minimized_constraints(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_get_generators(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_get_minimized_generators(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_relation_with_constraint(in(Handle),
-                                                     in(Constraint),
-                                                     in(RList))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_relation_with_generator(in(Handle),
-                                                    in(Generator),
-                                                    in(RList))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_get_bounding_box(in(Handle),
-                                             in(Relation),
-                                             in(BBox))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_is_empty(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_is_universe(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_is_bounded(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounds_from_above(in(Handle), in(Linear_Expression))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounds_from_below(in(Handle), in(Linear_Expression))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_maximize(in(Handle),
-                                     in(Linear_Expression),
-                                     in(Num),
-                                     in(Den),
-                                     in(Max))
-             :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_maximize_with_point(in(Handle),
-                                     in(Linear_Expression),
-                                     in(Num),
-                                     in(Den),
-                                     in(Max),
-                                     in(Point))
-             :: any_term * any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_minimize(in(Handle),
-                                     in(Linear_Expression),
-                                     in(Num),
-                                     in(Den),
-                                     in(Min))
-             :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_minimize_with_point(in(Handle),
-                                     in(Linear_Expression),
-                                     in(Num),
-                                     in(Den),
-                                     in(Min),
-                                     in(Point))
-             :: any_term * any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_is_topologically_closed(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_contains_Polyhedron(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_strictly_contains_Polyhedron(in(Handle1),
-                                                         in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_is_disjoint_from_Polyhedron(in(Handle1),
-                                                        in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_equals_Polyhedron(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_OK(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_constraint(in(Handle), in(Constraint))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_constraint_and_minimize(in(Handle), in(Constraint))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_generator(in(Handle), in(Generator))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_generator_and_minimize(in(Handle), in(Generator))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_constraints(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_constraints_and_minimize(in(Handle), in(CList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_generators(in(Handle), in(GList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_add_generators_and_minimize(in(Handle), in(GList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_intersection_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_intersection_assign_and_minimize(in(Handle1),
-                                                             in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_poly_hull_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_poly_hull_assign_and_minimize(in(Handle1),
-                                                             in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_poly_difference_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_affine_image(in(Handle), in(Var),
-                                         in(Linear_Expression), in(Divisor))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_affine_preimage(in(Handle), in(Var),
-                                            in(Linear_Expression), in(Divisor))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_affine_image(in(Handle), in(Var),
-                                                 in(Lower_Bound),
-                                                 in(Upper_Bound),
-                                                 in(Divisor))
-             :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_affine_preimage(in(Handle), in(Var),
-                                                    in(Lower_Bound),
-                                                    in(Upper_Bound),
-                                                    in(Divisor))
-             :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_image(in(Handle),
-                                                     in(Var), in(Rel),
-                                                     in(Linear_Expression),
-                                                     in(Divisor))
-             :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_preimage(in(Handle),
-                                                        in(Var), in(Rel),
-                                                        in(Linear_Expression),
-                                                        in(Divisor))
-             :: any_term * any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_image_lhs_rhs(in(Handle),
-                                                             in(LHS),
-                                                             in(Rel), in(RHS))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(in(Handle),
-                                                                in(LHS),
-                                                                in(Rel),
-                                                                in(RHS))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_time_elapse_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_topological_closure_assign(in(Handle))
-             :: any_term + foreign.
-
-:- true pred ppl_Polyhedron_BHRZ03_widening_assign_with_token(in(Handle1),
-                                                               in(Handle2),
-                                                               in(Tokens))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_BHRZ03_widening_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token(in(Handle1),
-                                                                in(Handle2),
-                                                               in(CList),
-                                                               in(Tokens))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(in(Handle1),
-                                                               in(CList),
-                                                                in(Handle2))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token(in(Handle1),
-                                                                in(Handle2),
-                                                               in(CList),
-                                                               in(Tokens))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(in(Handle1),
-                                                                in(Handle2),
-                                                               in(CList))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_H79_widening_assign_with_token(in(Handle1),
-                                                            in(Handle2),
-                                                            in(Tokens))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_H79_widening_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign_with_token(in(Handle1),
-                                                             in(Handle2),
-                                                               in(CList),
-                                                            in(Tokens))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign(in(Handle1),
-                                                             in(Handle2),
-                                                               in(CList))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token(in(Handle1),
-                                                                in(Handle2),
-                                                               in(CList),
-                                                            in(Tokens))
-             :: any_term * any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign(in(Handle1),
-                                                                in(Handle2),
-                                                               in(CList))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred
-   ppl_Polyhedron_add_space_dimensions_and_project(in(Handle),
-                                                   in(NDimensions_To_Add))
-             :: any_term * any_term + foreign.
-
-:- true pred
-   ppl_Polyhedron_add_space_dimensions_and_embed(in(Handle),
-                                                 in(NDimensions_To_Add))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_concatenate_assign(in(Handle1), in(Handle2))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_remove_space_dimensions(in(Handle), in(VList))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_remove_higher_space_dimensions(in(Handle),
-                                                           in(Dimensions))
-             :: any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_expand_space_dimension(in(Handle),
-                                                   in(Var),
-                                                   in(Dimensions))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_fold_space_dimensions(in(Handle),
-                                                  in(VList),
-                                                  in(Var))
-             :: any_term * any_term * any_term + foreign.
-
-:- true pred ppl_Polyhedron_map_space_dimensions(in(Handle),
-                                                 in(PIFunc))
-             :: any_term * any_term + foreign.
-
-:- extra_linker_opts('-L.libs').
-:- use_foreign_library(ppl_ciao).
-
-:- impl_defined(
-[
-        ppl_version_major/1,
-        ppl_version_minor/1,
-        ppl_version_revision/1,
-        ppl_version_beta/1,
-        ppl_version/1,
-        ppl_banner/1,
-        ppl_max_space_dimension/1,
-        ppl_initialize/0,
-        ppl_finalize/0,
-        ppl_set_timeout_exception_atom/1,
-        ppl_timeout_exception_atom/1,
-        ppl_set_timeout/1,
-        ppl_reset_timeout/0,
-        ppl_new_Polyhedron_from_space_dimension/4,
-        ppl_new_Polyhedron_from_Polyhedron/4,
-        ppl_new_Polyhedron_from_constraints/3,
-        ppl_new_Polyhedron_from_generators/3,
-        ppl_new_Polyhedron_from_bounding_box/3,
-        ppl_Polyhedron_swap/2,
-        ppl_delete_Polyhedron/1,
-        ppl_Polyhedron_space_dimension/2,
-        ppl_Polyhedron_affine_dimension/2,
-        ppl_Polyhedron_get_constraints/2,
-        ppl_Polyhedron_get_minimized_constraints/2,
-        ppl_Polyhedron_get_generators/2,
-        ppl_Polyhedron_get_minimized_generators/2,
-        ppl_Polyhedron_relation_with_constraint/3,
-        ppl_Polyhedron_relation_with_generator/3,
-        ppl_Polyhedron_get_bounding_box/3,
-        ppl_Polyhedron_is_empty/1,
-        ppl_Polyhedron_is_universe/1,
-        ppl_Polyhedron_is_bounded/1,
-        ppl_Polyhedron_bounds_from_above/2,
-        ppl_Polyhedron_bounds_from_below/2,
-        ppl_Polyhedron_maximize/5,
-        ppl_Polyhedron_maximize_with_point/6,
-        ppl_Polyhedron_minimize/5,
-        ppl_Polyhedron_minimize_with_point/6,
-        ppl_Polyhedron_is_topologically_closed/1,
-        ppl_Polyhedron_contains_Polyhedron/2,
-        ppl_Polyhedron_strictly_contains_Polyhedron/2,
-        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
-        ppl_Polyhedron_equals_Polyhedron/2,
-        ppl_Polyhedron_OK/1,
-        ppl_Polyhedron_add_constraint/2,
-        ppl_Polyhedron_add_constraint_and_minimize/2,
-        ppl_Polyhedron_add_generator/2,
-        ppl_Polyhedron_add_generator_and_minimize/2,
-        ppl_Polyhedron_add_constraints/2,
-        ppl_Polyhedron_add_constraints_and_minimize/2,
-        ppl_Polyhedron_add_generators/2,
-        ppl_Polyhedron_add_generators_and_minimize/2,
-        ppl_Polyhedron_intersection_assign/2,
-        ppl_Polyhedron_intersection_assign_and_minimize/2,
-        ppl_Polyhedron_poly_hull_assign/2,
-        ppl_Polyhedron_poly_hull_assign_and_minimize/2,
-        ppl_Polyhedron_poly_difference_assign/2,
-        ppl_Polyhedron_affine_image/4,
-        ppl_Polyhedron_affine_preimage/4,
-        ppl_Polyhedron_bounded_affine_image/5,
-        ppl_Polyhedron_bounded_affine_preimage/5,
-        ppl_Polyhedron_generalized_affine_image/5,
-        ppl_Polyhedron_generalized_affine_preimage/5,
-        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
-        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
-        ppl_Polyhedron_time_elapse_assign/2,
-        ppl_Polyhedron_topological_closure_assign/1,
-        ppl_Polyhedron_BHRZ03_widening_assign_with_token/3,
-        ppl_Polyhedron_BHRZ03_widening_assign/2,
-        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token/4,
-        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
-        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token/4,
-        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
-        ppl_Polyhedron_H79_widening_assign_with_token/3,
-        ppl_Polyhedron_H79_widening_assign/2,
-        ppl_Polyhedron_limited_H79_extrapolation_assign_with_token/4,
-        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
-        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token/4,
-        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
-        ppl_Polyhedron_add_space_dimensions_and_project/2,
-        ppl_Polyhedron_add_space_dimensions_and_embed/2,
-        ppl_Polyhedron_concatenate_assign/2,
-        ppl_Polyhedron_remove_space_dimensions/2,
-        ppl_Polyhedron_remove_higher_space_dimensions/2,
-        ppl_Polyhedron_expand_space_dimension/3
-        ppl_Polyhedron_fold_space_dimensions/3
-        ppl_Polyhedron_map_space_dimensions/2
-]).
-
-:- comment(version_maintenance,off).
-
-
-*/
diff --git a/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
new file mode 100644
index 0000000..80cbec0
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
@@ -0,0 +1,87 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ciao.pl.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* Ciao Prolog interface: Ciao Prolog part.
+m4_include(`ppl_interface_generator_copyright')
+*/
+
+:- module(ppl_ciao,
+[
+m4_divert(1)
+],
+[
+        assertions,
+        basicmodes,
+        regtypes,
+        foreign_interface
+]).
+
+m4_divert(2)dnl
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+m4_divert(3)
+]).
+
+:- comment(version_maintenance,off).
+
+m4_divert`'dnl
+m4_define(`m4_extension', `m4_ifelse($4, 0, , `COMMA
+')	  $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)`'dnl
+m4_divert`'dnl
+m4_define(`check_fail', `m4_ifelse(m4_index($1, nofail), -1, failok, nofail)')
+m4_define(`term', `Term$1')dnl
+m4_define(`anyterm', `any_term')dnl
+m4_define(`interm', `in(Term$1)')dnl
+m4_define(`m4_extension', `m4_ifelse(check_fail($3), nofail,
+  `:- true pred $1`'m4_ifelse(`$2', 0, ,(`'m4_term_sequence($2, `interm'))
+          :: `'m4_term_sequence($2, `anyterm', ` *')) +  foreign.
+
+',
+  `:- true pred $1_2(`'m4_term_sequence($2, `interm')`'m4_ifelse(`$2', 0, `go(Success)', `, go(Success)'))
+          :: `'m4_term_sequence($2, `anyterm', ` *')`'m4_ifelse(`$2', 0, ` int', ` * int')
+  + (returns(Success), foreign($1)).
+
+$1`'m4_ifelse(`$2', 0, ,`(m4_term_sequence($2, `term'))') :-
+   $1_2(`'m4_term_sequence($2, `term')`'m4_ifelse(`$2', 0, `1', `, 1')).
+
+')')dnl
+ppl_prolog_sys_code`'dnl
+m4_undivert(2)dnl
+m4_divert`'dnl
+m4_define(`m4_extension',
+  `m4_ifelse(check_fail($3), nofail, ,m4_ifelse($4, 0, , `COMMA
+')	`'$1_2/m4_incr($2))')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
new file mode 100644
index 0000000..ef3d424
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
@@ -0,0 +1,65 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Ciao dependent code for ciao_predicate_check.pl.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+/* Ciao Prolog interface: Ciao Prolog part for checking all predicates.
+m4_include(`ppl_interface_generator_copyright')
+*/
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao,
+[
+m4_divert(1)
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+:-  `include'('ppl_predicate_check_main.pl').
+
+prolog_system('Ciao').
+
+main:-
+   (check_all ->
+        write('OK')
+   ;
+        write('FAILURE')
+   ),
+   nl.
+
+m4_divert`'dnl
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+m4_define(`m4_extension', `m4_ifelse($4, 0, , `COMMA
+')  $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/GNU/Makefile.am b/interfaces/Prolog/GNU/Makefile.am
index 24f65f4..01d3cc7 100644
--- a/interfaces/Prolog/GNU/Makefile.am
+++ b/interfaces/Prolog/GNU/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,28 +20,92 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
+GPROLOG_CFLI_FILES = gprolog_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_gprolog_pl.m4 \
+$(GPROLOG_CFLI_FILES) \
+gp_clpq.pl \
+gnu_pl_check.pl \
+README.gprolog
 
 if BUILD_GNU_PROLOG_INTERFACE
 
+if BUILD_WATCHDOG_LIBRARY
+
+WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+
+endif BUILD_WATCHDOG_LIBRARY
+
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog/src \
+$(WATCHDOG_INCLUDE_OPTIONS) \
 @extra_includes@
 
-bin_PROGRAMS = ppl_gprolog
-ppl_gprolog_SOURCES =
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_gprolog_pl.m4
 
 pkglib_LTLIBRARIES = libppl_gprolog.la
-libppl_gprolog_la_SOURCES = ppl_gprolog_sd.cc
+
+libppl_gprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+gprolog_efli.hh \
+gprolog_efli.cc
+
+nodist_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Rational_Box.cc
+
 libppl_gprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
 $(top_builddir)/src/libppl.la \
-$(top_builddir)/Watchdog/src/libpwl.la \
+$(WATCHDOG_LIBRARY) \
 @extra_libraries@
-libppl_gprolog_la_LDFLAGS = -module -avoid-version
+
+libppl_gprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_gprolog_la_LDFLAGS = \
+-module \
+-avoid-version
+
+ppl_gprolog.pl: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_gprolog_pl.m4 > $@
 
 pkglib_DATA = ppl_gprolog.pl
 
+bin_PROGRAMS = ppl_gprolog
+ppl_gprolog_SOURCES =
+
+
 if ENABLE_SHARED
 
 LIBPPL_GPROLOG = .libs/libppl_gprolog.so
@@ -54,20 +118,20 @@ endif !ENABLE_SHARED
 
 ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
 	gplc --c-compiler $(CXX) -o $@ \
-		$(srcdir)/ppl_gprolog.pl $(LIBPPL_GPROLOG) \
-		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+		ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl $(WATCHDOG_LINK_OPTIONS) -lgmpxx -lgmp'
 
 gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
 	gplc --c-compiler $(CXX) -o $@ \
-		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
 		$(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
-		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl $(WATCHDOG_LINK_OPTIONS) -lgmpxx -lgmp'
 
 gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
 	gplc --c-compiler $(CXX) -o $@ \
-		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
 		$(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
-		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl $(WATCHDOG_LINK_OPTIONS) -lgmpxx -lgmp'
 
 CLPQ_TESTS_NONSTRICT = \
 ack.clpq \
@@ -119,7 +183,7 @@ pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
 	echo "main." >>script_pchk
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen libppl_gprolog.la \
 		./ppl_gprolog <script_pchk
 	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
@@ -129,7 +193,7 @@ clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen libppl_gprolog.la \
 		./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
 	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
@@ -139,15 +203,18 @@ clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen libppl_gprolog.la \
 		./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
 	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
+endif BUILD_GNU_PROLOG_INTERFACE
+
+DISTCLEANFILES = \
+ppl_gprolog.pl
+
 MOSTLYCLEANFILES = \
 gp_clpq gp_clpq2 \
 obtained_clpq obtained_clpq2 obtained_pchk \
 $(CLPQ_TESTS) \
 script_pchk
-
-endif BUILD_GNU_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/GNU/Makefile.in b/interfaces/Prolog/GNU/Makefile.in
index fa9cf1d..3524b63 100644
--- a/interfaces/Prolog/GNU/Makefile.in
+++ b/interfaces/Prolog/GNU/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,15 +38,11 @@
 
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,9 +58,10 @@ build_triplet = @build@
 host_triplet = @host@
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at bin_PROGRAMS = ppl_gprolog$(EXEEXT)
 subdir = interfaces/Prolog/GNU
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -74,8 +71,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -92,12 +99,17 @@ am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
 	"$(DESTDIR)$(pkglibdir)"
 pkglibLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(pkglib_LTLIBRARIES)
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
-am__libppl_gprolog_la_SOURCES_DIST = ppl_gprolog_sd.cc
+am__libppl_gprolog_la_SOURCES_DIST = ppl_prolog_sysdep.hh \
+	gprolog_efli.hh gprolog_efli.cc
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at am_libppl_gprolog_la_OBJECTS =  \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@	ppl_gprolog_sd.lo
-libppl_gprolog_la_OBJECTS = $(am_libppl_gprolog_la_OBJECTS)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	gprolog_efli.lo
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@nodist_libppl_gprolog_la_OBJECTS =  \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	ppl_prolog_common.lo
+libppl_gprolog_la_OBJECTS = $(am_libppl_gprolog_la_OBJECTS) \
+	$(nodist_libppl_gprolog_la_OBJECTS)
+libppl_gprolog_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_gprolog_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at am_libppl_gprolog_la_rpath = -rpath \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(pkglibdir)
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
@@ -105,26 +117,31 @@ PROGRAMS = $(bin_PROGRAMS)
 am_ppl_gprolog_OBJECTS =
 ppl_gprolog_OBJECTS = $(am_ppl_gprolog_OBJECTS)
 ppl_gprolog_LDADD = $(LDADD)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libppl_gprolog_la_SOURCES) $(ppl_gprolog_SOURCES)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libppl_gprolog_la_SOURCES) \
+	$(nodist_libppl_gprolog_la_SOURCES) \
+	$(nodist_EXTRA_libppl_gprolog_la_SOURCES) \
+	$(ppl_gprolog_SOURCES)
 DIST_SOURCES = $(am__libppl_gprolog_la_SOURCES_DIST) \
 	$(ppl_gprolog_SOURCES)
 pkglibDATA_INSTALL = $(INSTALL_DATA)
@@ -133,39 +150,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -175,53 +171,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -230,56 +224,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -291,10 +259,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -303,41 +275,112 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
+GPROLOG_CFLI_FILES = gprolog_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_gprolog_pl.m4 \
+$(GPROLOG_CFLI_FILES) \
+gp_clpq.pl \
+gnu_pl_check.pl \
+README.gprolog
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at AM_CPPFLAGS = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_buildir)/interfaces/Prolog \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at -I$(top_builddir)/src \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@@extra_includes@
 
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog_SOURCES = 
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_interface_generator_gprolog_pl.m4
+
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at pkglib_LTLIBRARIES = libppl_gprolog.la
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_SOURCES = ppl_gprolog_sd.cc
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_SOURCES = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_prolog_sysdep.hh \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gprolog_efli.hh \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gprolog_efli.cc
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@nodist_libppl_gprolog_la_SOURCES = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_common.cc
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@nodist_EXTRA_libppl_gprolog_la_SOURCES = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Double_Box.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Grid.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Polyhedron.cc \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@../ppl_prolog_Rational_Box.cc
+
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at libppl_gprolog_la_LIBADD = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@ \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(WATCHDOG_LIBRARY) \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@@extra_libraries@
 
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_LDFLAGS = -module -avoid-version
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_DEPENDENCIES = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_LDFLAGS = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-module \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-avoid-version
+
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at pkglib_DATA = ppl_gprolog.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog_SOURCES = 
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_FALSE at LIBPPL_GPROLOG = .libs/libppl_gprolog.a
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at LIBPPL_GPROLOG = .libs/libppl_gprolog.so
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at CLPQ_TESTS_NONSTRICT = \
@@ -363,11 +406,14 @@ EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
 @ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
 @ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq gp_clpq2 \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@script_pchk
+DISTCLEANFILES = \
+ppl_gprolog.pl
+
+MOSTLYCLEANFILES = \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS) \
+script_pchk
 
 all: all-am
 
@@ -404,21 +450,21 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-pkglibLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
 	done
 
 clean-pkglibLTLIBRARIES:
@@ -430,18 +476,18 @@ clean-pkglibLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 libppl_gprolog.la: $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_libppl_gprolog_la_rpath) $(libppl_gprolog_la_LDFLAGS) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS)
+	$(libppl_gprolog_la_LINK) $(am_libppl_gprolog_la_rpath) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS)
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
 	@list='$(bin_PROGRAMS)'; for p in $$list; do \
 	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
 	  if test -f $$p \
 	     || test -f $$p1 \
 	  ; then \
 	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
 	  else :; fi; \
 	done
 
@@ -461,7 +507,7 @@ clean-binPROGRAMS:
 	done
 @BUILD_GNU_PROLOG_INTERFACE_FALSE at ppl_gprolog$(EXEEXT): $(ppl_gprolog_OBJECTS) $(ppl_gprolog_DEPENDENCIES) 
 @BUILD_GNU_PROLOG_INTERFACE_FALSE@	@rm -f ppl_gprolog$(EXEEXT)
- at BUILD_GNU_PROLOG_INTERFACE_FALSE@	$(LINK) $(ppl_gprolog_LDFLAGS) $(ppl_gprolog_OBJECTS) $(ppl_gprolog_LDADD) $(LIBS)
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@	$(LINK) $(ppl_gprolog_OBJECTS) $(ppl_gprolog_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -469,41 +515,149 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_gprolog_sd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gprolog_efli.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
 
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constrai [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-pkglibDATA: $(pkglib_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -524,8 +678,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -537,8 +691,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -548,13 +702,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -568,22 +721,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -601,7 +753,7 @@ check: check-am
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
 installdirs:
 	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -624,6 +776,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -637,7 +790,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -651,13 +804,21 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-binPROGRAMS install-pkglibDATA \
 	install-pkglibLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -678,41 +839,49 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
-	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+uninstall-am: uninstall-binPROGRAMS uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
 	clean-binPROGRAMS clean-generic clean-libtool \
 	clean-pkglibLTLIBRARIES ctags distclean distclean-compile \
 	distclean-generic distclean-libtool distclean-tags distdir dvi \
 	dvi-am html html-am info info-am install install-am \
-	install-binPROGRAMS install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-pkglibDATA install-pkglibLTLIBRARIES install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-info-am uninstall-pkglibDATA \
+	install-binPROGRAMS install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-pkglibDATA \
+	install-pkglibLTLIBRARIES install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-pkglibDATA \
 	uninstall-pkglibLTLIBRARIES
 
 
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog.pl: $(interface_generator_dependencies)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_gprolog_pl.m4 > $@
+
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	gplc --c-compiler $(CXX) -o $@ \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/ppl_gprolog.pl $(LIBPPL_GPROLOG) \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl $(WATCHDOG_LINK_OPTIONS) -lgmpxx -lgmp'
 
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	gplc --c-compiler $(CXX) -o $@ \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl $(WATCHDOG_LINK_OPTIONS) -lgmpxx -lgmp'
 
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	gplc --c-compiler $(CXX) -o $@ \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl $(WATCHDOG_LINK_OPTIONS) -lgmpxx -lgmp'
 
 @BUILD_GNU_PROLOG_INTERFACE_TRUE at check-local: pl_check_test clpq_test clpq2_test
 
@@ -722,7 +891,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	echo "main." >>script_pchk
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen libppl_gprolog.la \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		./ppl_gprolog <script_pchk
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
@@ -732,7 +901,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen libppl_gprolog.la \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
@@ -742,7 +911,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen libppl_gprolog.la \
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@		./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
 @BUILD_GNU_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
diff --git a/interfaces/Prolog/GNU/README b/interfaces/Prolog/GNU/README
deleted file mode 100644
index aed4eca..0000000
--- a/interfaces/Prolog/GNU/README
+++ /dev/null
@@ -1,32 +0,0 @@
-The only GNU Prolog version that is known to work with the PPL is a
-patched version of the "unstable version" available at
-
-  ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz
-
-(which unpacks to a directory called `gprolog-1.2.18').
-The patch to be applied is given below.
-
-So that it can be used with the GNU Prolog PPL interface (and, for
-that matter, with any foreign code), the GNU Prolog installation must
-be configured with the `--disable-regs' option.
-
-
-*** gprolog-1.2.18/src/TopComp/top_comp.c.orig	Fri Jun  4 18:05:02 2004
---- gprolog-1.2.18/src/TopComp/top_comp.c	Sun Jul  3 11:24:36 2005
-***************
-*** 1085,1091 ****
-  	      if (++i >= argc)
-  		Fatal_Error("FILE missing after %s option", last_opt);
-
-! 	      cmd_cc.exe_name = argv[i];
-  	      continue;
-  	    }
-
---- 1085,1091 ----
-  	      if (++i >= argc)
-  		Fatal_Error("FILE missing after %s option", last_opt);
-
-! 	      cmd_cc.exe_name = cmd_link.exe_name = argv[i];
-  	      continue;
-  	    }
-
diff --git a/interfaces/Prolog/GNU/README.gprolog b/interfaces/Prolog/GNU/README.gprolog
new file mode 100644
index 0000000..d699e26
--- /dev/null
+++ b/interfaces/Prolog/GNU/README.gprolog
@@ -0,0 +1,36 @@
+The GNU Prolog interface to the PPL is available both as a ``PPL
+enhanced'' GNU Prolog interpreter and as a library that can be linked
+to GNU Prolog programs.  Only GNU Prolog version 1.2.19 and later
+versions are supported.
+
+So that it can be used with the GNU Prolog PPL interface (and, for
+that matter, with any foreign code), the GNU Prolog installation must
+be configured with the `--disable-regs' option.
+
+
+The `ppl_gprolog' Executable
+----------------------------
+
+The `ppl_gprolog' executable is simply the GNU Prolog interpreter with
+the Parma Polyhedra Library linked in.  The only thing you should do
+to use the library is to call `ppl_initialize/0' before any other PPL
+predicate and to call `ppl_finalize/0' when you are done with the
+library.
+
+
+Linking the Library To GNU Prolog Programs
+------------------------------------------
+
+In order to allow linking GNU Prolog programs to the PPL, the
+following files are installed in the directory `<prefix>/lib/ppl',
+where <prefix> is the root of your installation (`/usr' or
+`/usr/local' in most cases): `ppl_gprolog.pl' contains the required
+foreign declarations; `libppl_gprolog.*' contain the executable code
+for the GNU Prolog interface in various formats (static library,
+shared library, libtool library).  If your GNU Prolog program is
+constituted by, say, `source1.pl' and `source2.pl' and you want to
+create the executable `myprog', your compilation command may look like
+
+    gplc -o myprog <prefix>/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+      -L '-L<prefix>/lib/ppl -lppl_gprolog -L<prefix>/lib \
+      -lppl -lgmpxx -lgmp -lstdc++'
diff --git a/interfaces/Prolog/GNU/gnu_pl_check.pl b/interfaces/Prolog/GNU/gnu_pl_check.pl
index ec8fb17..b5c9ea9 100644
--- a/interfaces/Prolog/GNU/gnu_pl_check.pl
+++ b/interfaces/Prolog/GNU/gnu_pl_check.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the PPL/GNU-Prolog predicate checker.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/GNU/gp_clpq.pl b/interfaces/Prolog/GNU/gp_clpq.pl
index 16832da..b5d1720 100644
--- a/interfaces/Prolog/GNU/gp_clpq.pl
+++ b/interfaces/Prolog/GNU/gp_clpq.pl
@@ -1,11 +1,11 @@
 /* Main program for the toy PPL/GNU-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/GNU/gprolog_cfli.hh b/interfaces/Prolog/GNU/gprolog_cfli.hh
new file mode 100644
index 0000000..9bfe2d2
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_cfli.hh
@@ -0,0 +1,425 @@
+/* GNU Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PCFLI_gprolog_cfli_hh
+#define PCFLI_gprolog_cfli_hh 1
+
+#if SIZEOF_FP == SIZEOF_INTP
+// Horrible kludge working around an horrible bug in <gprolog.h> (see
+// http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+#define byte_code byte_code(void)
+#define last_read_line last_read_line(void)
+#define last_read_col last_read_col(void)
+#include <gprolog.h>
+#undef byte_code
+#undef last_read_line
+#undef last_read_col
+#else
+#include <gprolog.h>
+#endif
+
+// <gprolog.h> pollutes the namespace: try to clean up
+// (see http://www.cs.unipr.it/pipermail/ppl-devel/2004-April/004270.html).
+#ifdef B
+#undef B
+#endif
+#ifdef H
+#undef H
+#endif
+#ifdef CP
+#undef CP
+#endif
+#ifdef E
+#undef E
+#endif
+#ifdef CS
+#undef CS
+#endif
+#ifdef S
+#undef S
+#endif
+#ifdef STAMP
+#undef STAMP
+#endif
+
+#include <cassert>
+
+typedef PlTerm Prolog_term_ref;
+typedef int Prolog_atom;
+typedef Bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+namespace {
+
+inline Prolog_atom
+a_dollar_address() {
+  // We use the `name' variable, instead of directly using the string
+  // literal, in order to avoid a compiler warning.
+  static char name[] = "$address";
+  static Prolog_atom atom = Create_Allocate_Atom(name);
+  return atom;
+}
+
+inline Prolog_atom
+a_throw() {
+  // We use the `name' variable, instead of directly using the string
+  // literal, in order to avoid a compiler warning.
+  static char name[] = "throw";
+  static Prolog_atom a = Find_Atom(name);
+  return a;
+}
+
+} // namespace
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  if (l < INT_LOWEST_VALUE || l > INT_GREATEST_VALUE)
+    return 0;
+  else {
+    t = Mk_Integer(l);
+    return 1;
+  }
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul > static_cast<unsigned long>(INT_GREATEST_VALUE))
+    return 0;
+  else {
+    t = Mk_Integer(ul);
+    return 1;
+  }
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = Mk_Atom(Create_Allocate_Atom(const_cast<char*>(s)));
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = Mk_Atom(a);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return Create_Allocate_Atom(const_cast<char*>(s));
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  Prolog_term_ref args[1];
+  args[0] = a1;
+  t = Mk_Compound(f, 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  Prolog_term_ref args[2];
+  args[0] = a1;
+  args[1] = a2;
+  t = Mk_Compound(f, 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  Prolog_term_ref args[3];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = Mk_Compound(f, 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  Prolog_term_ref args[4];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = Mk_Compound(f, 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  Prolog_term_ref args[2];
+  args[0] = h;
+  args[1] = t;
+  c = Mk_List(args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  union {
+    unsigned long l;
+    unsigned short s[2];
+  } u;
+  u.l = reinterpret_cast<unsigned long>(p);
+  return Prolog_construct_compound(t, a_dollar_address(),
+				   Mk_Positive(u.s[0]), Mk_Positive(u.s[1]));
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  Pl_Exec_Continuation(a_throw(), 1, &t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return Blt_Var(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return Blt_Atom(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return Blt_Integer(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return Blt_Compound(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  if (Blt_Compound(t) == FALSE)
+    return 0;
+  Prolog_atom name;
+  int arity;
+  Rd_Compound(t, &name, &arity);
+  return name == ATOM_CHAR('.') && arity == 2;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  *lp = Rd_Integer_Check(t);
+  return 1;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  if (!Prolog_is_compound(t))
+    return 0;
+  Prolog_atom name;
+  int arity;
+  Prolog_term_ref* a = Rd_Compound_Check(t, &name, &arity);
+  if (name != a_dollar_address() || arity != 2)
+    return 0;
+  for (int i = 0; i <= 1; ++i) {
+    if (!Prolog_is_integer(a[i]))
+      return 0;
+    long l;
+    if (!Prolog_get_long(a[i], &l))
+      return 0;
+    if (l < 0 || l > USHRT_MAX)
+      return 0;
+  }
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  static Prolog_atom dummy_name;
+  static int dummy_arity;
+  Prolog_term_ref* a = Rd_Compound_Check(t, &dummy_name, &dummy_arity);
+  union {
+    unsigned long l;
+    unsigned short s[2];
+  } u;
+  u.s[0] = Rd_Integer_Check(a[0]);
+  u.s[1] = Rd_Integer_Check(a[1]);
+  *vpp = reinterpret_cast<void*>(u.l);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = Rd_Atom_Check(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  Rd_Compound_Check(t, ap, ip);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  static Prolog_atom dummy_name;
+  static int dummy_arity;
+  a = Rd_Compound_Check(t, &dummy_name, &dummy_arity)[i-1];
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  Prolog_term_ref* ht = Rd_List_Check(c);
+  h = ht[0];
+  t = ht[1];
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return Unify(t, u) != FALSE;
+}
+
+#endif // !defined(PCFLI_gprolog_cfli_hh)
diff --git a/interfaces/Prolog/GNU/gprolog_efli.cc b/interfaces/Prolog/GNU/gprolog_efli.cc
new file mode 100644
index 0000000..2c910e7
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_efli.cc
@@ -0,0 +1,73 @@
+/* GNU Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "gprolog_efli.hh"
+#include "ppl_prolog_common.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = false;
+  Prolog_min_integer = INT_LOWEST_VALUE;
+  Prolog_max_integer = INT_GREATEST_VALUE;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  long v;
+  Prolog_get_long(t, &v);
+  n = v;
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  long l = 0;
+  if (assign_r(l, n, ROUND_NOT_NEEDED) != V_EQ
+      || !Prolog_put_long(t, l))
+    throw PPL_integer_out_of_range(n);
+  return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  Prolog_put_Coefficient(u, n);
+  return Prolog_unify(t, u);
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/GNU/gprolog_efli.hh b/interfaces/Prolog/GNU/gprolog_efli.hh
new file mode 100644
index 0000000..0726372
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_efli.hh
@@ -0,0 +1,80 @@
+/* GNU Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_gprolog_efli_hh
+#define PPL_gprolog_efli_hh 1
+
+#include "ppl.hh"
+#include "gprolog_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-initialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_gprolog_efli_hh)
diff --git a/interfaces/Prolog/GNU/ppl_gprolog.pl b/interfaces/Prolog/GNU/ppl_gprolog.pl
deleted file mode 100644
index f755eed..0000000
--- a/interfaces/Prolog/GNU/ppl_gprolog.pl
+++ /dev/null
@@ -1,182 +0,0 @@
-/* GNU Prolog interface: GNU Prolog part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-:- foreign(ppl_version_major(+term)).
-:- foreign(ppl_version_minor(+term)).
-:- foreign(ppl_version_revision(+term)).
-:- foreign(ppl_version_beta(+term)).
-:- foreign(ppl_version(+term)).
-:- foreign(ppl_banner(+term)).
-:- foreign(ppl_max_space_dimension(+term)).
-:- foreign(ppl_Coefficient_is_bounded).
-:- foreign(ppl_Coefficient_max(+term)).
-:- foreign(ppl_Coefficient_min(+term)).
-:- foreign(ppl_initialize).
-:- foreign(ppl_finalize).
-:- foreign(ppl_set_timeout_exception_atom(+term)).
-:- foreign(ppl_timeout_exception_atom(+term)).
-:- foreign(ppl_set_timeout(+term)).
-:- foreign(ppl_reset_timeout).
-:- foreign(ppl_new_C_Polyhedron_from_space_dimension(+term, +term,
-                                                            +term)).
-:- foreign(ppl_new_NNC_Polyhedron_from_space_dimension(+term, +term,
-                                                            +term)).
-:- foreign(ppl_new_C_Polyhedron_from_C_Polyhedron(+term, +term)).
-:- foreign(ppl_new_C_Polyhedron_from_NNC_Polyhedron(+term, +term)).
-:- foreign(ppl_new_NNC_Polyhedron_from_C_Polyhedron(+term, +term)).
-:- foreign(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+term, +term)).
-:- foreign(ppl_new_C_Polyhedron_from_constraints(+term, +term)).
-:- foreign(ppl_new_NNC_Polyhedron_from_constraints(+term, +term)).
-:- foreign(ppl_new_C_Polyhedron_from_generators(+term, +term)).
-:- foreign(ppl_new_NNC_Polyhedron_from_generators(+term, +term)).
-:- foreign(ppl_new_C_Polyhedron_from_bounding_box(+term, +term)).
-:- foreign(ppl_new_NNC_Polyhedron_from_bounding_box(+term, +term)).
-:- foreign(ppl_Polyhedron_swap(+term, +term)).
-:- foreign(ppl_delete_Polyhedron(+term)).
-:- foreign(ppl_Polyhedron_space_dimension(+term, +term)).
-:- foreign(ppl_Polyhedron_affine_dimension(+term, +term)).
-:- foreign(ppl_Polyhedron_get_constraints(+term, +term)).
-:- foreign(ppl_Polyhedron_get_minimized_constraints(+term, +term)).
-:- foreign(ppl_Polyhedron_get_generators(+term, +term)).
-:- foreign(ppl_Polyhedron_get_minimized_generators(+term, +term)).
-:- foreign(ppl_Polyhedron_relation_with_constraint(+term, +term, +term)).
-:- foreign(ppl_Polyhedron_relation_with_generator(+term, +term, +term)).
-:- foreign(ppl_Polyhedron_get_bounding_box(+term, +term, +term)).
-:- foreign(ppl_Polyhedron_is_empty(+term)).
-:- foreign(ppl_Polyhedron_is_universe(+term)).
-:- foreign(ppl_Polyhedron_is_bounded(+term)).
-:- foreign(ppl_Polyhedron_bounds_from_above(+term, +term)).
-:- foreign(ppl_Polyhedron_bounds_from_below(+term, +term)).
-:- foreign(ppl_Polyhedron_maximize(+term, +term, +term, +term, +term)).
-:- foreign(ppl_Polyhedron_minimize(+term, +term, +term, +term, +term)).
-:- foreign(ppl_Polyhedron_maximize_with_point(+term, +term, +term, +term,
-                                              +term, +term)).
-:- foreign(ppl_Polyhedron_minimize_with_point(+term, +term, +term, +term,
-                                              +term, +term)).
-:- foreign(ppl_Polyhedron_is_topologically_closed(+term)).
-:- foreign(ppl_Polyhedron_contains_Polyhedron(+term, +term)).
-:- foreign(ppl_Polyhedron_strictly_contains_Polyhedron(+term, +term)).
-:- foreign(ppl_Polyhedron_is_disjoint_from_Polyhedron(+term, +term)).
-:- foreign(ppl_Polyhedron_equals_Polyhedron(+term, +term)).
-:- foreign(ppl_Polyhedron_OK(+term)).
-:- foreign(ppl_Polyhedron_add_constraint(+term, +term)).
-:- foreign(ppl_Polyhedron_add_constraint_and_minimize(+term, +term)).
-:- foreign(ppl_Polyhedron_add_generator(+term, +term)).
-:- foreign(ppl_Polyhedron_add_generator_and_minimize(+term, +term)).
-:- foreign(ppl_Polyhedron_add_constraints(+term, +term)).
-:- foreign(ppl_Polyhedron_add_constraints_and_minimize(+term, +term)).
-:- foreign(ppl_Polyhedron_add_generators(+term, +term)).
-:- foreign(ppl_Polyhedron_add_generators_and_minimize(+term, +term)).
-:- foreign(ppl_Polyhedron_intersection_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_intersection_assign_and_minimize(+term, +term)).
-:- foreign(ppl_Polyhedron_poly_hull_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_poly_hull_assign_and_minimize(+term, +term)).
-:- foreign(ppl_Polyhedron_poly_difference_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_affine_image(+term, +term, +term, +term)).
-:- foreign(ppl_Polyhedron_affine_preimage(+term, +term, +term, +term)).
-:- foreign(ppl_Polyhedron_bounded_affine_image(+term, +term,
-                                               +term, +term, +term)).
-:- foreign(ppl_Polyhedron_bounded_affine_preimage(+term, +term,
-                                                  +term, +term, +term)).
-:- foreign(ppl_Polyhedron_generalized_affine_image(+term, +term,
-						   +term, +term, +term)).
-:- foreign(ppl_Polyhedron_generalized_affine_preimage(+term, +term,
-						      +term, +term, +term)).
-:- foreign(ppl_Polyhedron_generalized_affine_image_lhs_rhs(+term, +term,
-							   +term, +term)).
-:- foreign(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+term, +term,
-							      +term, +term)).
-:- foreign(ppl_Polyhedron_time_elapse_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_topological_closure_assign(+term)).
-:- foreign(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+term,
-							    +term,
-							    +term,
-							    +term)).
-:- foreign(ppl_Polyhedron_BHRZ03_widening_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
-                                                              +term,
-							      +term,
-							      +term,
-							      +term,
-							      +term)).
-:- foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+term,
-							      +term,
-							      +term)).
-:- foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
-                                                              +term,
-							      +term,
-							      +term,
-							      +term,
-							      +term)).
-:- foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+term,
-							      +term,
-							      +term)).
-:- foreign(ppl_Polyhedron_H79_widening_assign_with_tokens(+term,
-							 +term,
-							 +term,
-							 +term)).
-:- foreign(ppl_Polyhedron_H79_widening_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+term,
-							   +term,
-							   +term,
-							   +term,
-							   +term)).
-:- foreign(ppl_Polyhedron_limited_H79_extrapolation_assign(+term,
-							   +term,
-							   +term)).
-:- foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+term,
-							   +term,
-							   +term,
-							   +term,
-							   +term)).
-:- foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign(+term,
-							   +term,
-							   +term)).
-:- foreign(ppl_Polyhedron_add_space_dimensions_and_project(+term, +term)).
-:- foreign(ppl_Polyhedron_add_space_dimensions_and_embed(+term, +term)).
-:- foreign(ppl_Polyhedron_concatenate_assign(+term, +term)).
-:- foreign(ppl_Polyhedron_remove_space_dimensions(+term, +term)).
-:- foreign(ppl_Polyhedron_remove_higher_space_dimensions(+term, +term)).
-:- foreign(ppl_Polyhedron_expand_space_dimension(+term, +term, +term)).
-:- foreign(ppl_Polyhedron_fold_space_dimensions(+term, +term, +term)).
-:- foreign(ppl_Polyhedron_map_space_dimensions(+term, +term)).
-:- foreign(ppl_new_LP_Problem_trivial(+term)).
-:- foreign(ppl_new_LP_Problem(+term, +term, +term, +term)).
-:- foreign(ppl_new_LP_Problem_from_LP_Problem(+term, +term)).
-:- foreign(ppl_LP_Problem_swap(+term, +term)).
-:- foreign(ppl_delete_LP_Problem(+term)).
-:- foreign(ppl_LP_Problem_space_dimension(+term, +term)).
-:- foreign(ppl_LP_Problem_constraints(+term, +term)).
-:- foreign(ppl_LP_Problem_objective_function(+term, +term)).
-:- foreign(ppl_LP_Problem_optimization_mode(+term, +term)).
-:- foreign(ppl_LP_Problem_clear(+term)).
-:- foreign(ppl_LP_Problem_add_constraint(+term, +term)).
-:- foreign(ppl_LP_Problem_add_constraints(+term, +term)).
-:- foreign(ppl_LP_Problem_set_objective_function(+term, +term)).
-:- foreign(ppl_LP_Problem_set_optimization_mode(+term, +term)).
-:- foreign(ppl_LP_Problem_is_satisfiable(+term)).
-:- foreign(ppl_LP_Problem_solve(+term, +term)).
-:- foreign(ppl_LP_Problem_feasible_point(+term, +term)).
-:- foreign(ppl_LP_Problem_optimizing_point(+term, +term)).
-:- foreign(ppl_LP_Problem_optimal_value(+term, +term, +term)).
-:- foreign(ppl_LP_Problem_evaluate_objective_function(+term, +term, +term, +term)).
-:- foreign(ppl_LP_Problem_OK(+term)).
diff --git a/interfaces/Prolog/GNU/ppl_gprolog_sd.cc b/interfaces/Prolog/GNU/ppl_gprolog_sd.cc
deleted file mode 100644
index a160358..0000000
--- a/interfaces/Prolog/GNU/ppl_gprolog_sd.cc
+++ /dev/null
@@ -1,438 +0,0 @@
-/* GNU Prolog interface: system-dependent part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "pwl.hh"
-#include <gprolog.h>
-#include <cassert>
-
-typedef PlTerm Prolog_term_ref;
-typedef int Prolog_atom;
-typedef Bool Prolog_foreign_return_type;
-
-namespace {
-
-const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
-const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
-
-} // namespace
-
-#include "../exceptions.hh"
-
-namespace PPL = Parma_Polyhedra_Library;
-
-namespace {
-
-Prolog_atom a_dollar_address;
-Prolog_atom a_throw;
-
-/*!
-  True if and only if the Prolog engine supports unbounded integers.
-*/
-bool Prolog_has_unbounded_integers;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the minimum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_min_integer;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the maximum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_max_integer;
-
-#include <iostream>
-using namespace std;
-
-/*!
-  Performs system-dependent initialization.
-*/
-void
-ppl_Prolog_sysdep_init() {
-  Prolog_has_unbounded_integers = false;
-  Prolog_min_integer = INT_LOWEST_VALUE;
-  Prolog_max_integer = INT_GREATEST_VALUE;
-
-  a_dollar_address = Create_Allocate_Atom("$address");
-  a_throw = Find_Atom("throw");
-}
-
-/*!
-  Perform system-dependent de-itialization.
-*/
-void
-ppl_Prolog_sysdep_deinit() {
-}
-
-/*!
-  Return a new term reference.
-*/
-inline Prolog_term_ref
-Prolog_new_term_ref() {
-  return 0;
-}
-
-/*!
-  Make \p t be a reference to the same term referenced by \p u,
-  i.e., assign \p u to \p t.
-*/
-inline int
-Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
-  t = u;
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p l.
-*/
-inline int
-Prolog_put_long(Prolog_term_ref& t, long l) {
-  if (l < Prolog_min_integer || l > Prolog_max_integer)
-    throw PPL_integer_out_of_range(l);
-  t = Mk_Integer(l);
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p ul.
-*/
-inline int
-Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
-  if (ul > static_cast<unsigned long>(Prolog_max_integer))
-    throw PPL_integer_out_of_range(ul);
-  t = Mk_Integer(ul);
-  return 1;
-}
-
-/*!
-  Assign to \p t an atom whose name is given
-  by the null-terminated string \p s.
-*/
-inline int
-Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
-  // TODO: remove the const_cast when the GNU Prolog people fix gprolog.h.
-  // NOTE: at the time of writing this comment (January 14, 2006), and since
-  // a long time before, "GNU Prolog people" stands for the empty set.
-  t = Mk_Atom(Create_Allocate_Atom(const_cast<char*>(s)));
-  return 1;
-}
-
-/*!
-  Assign to \p t the Prolog atom \p a.
-*/
-inline int
-Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
-  t = Mk_Atom(a);
-  return 1;
-}
-
-/*!
-  Return an atom whose name is given by the null-terminated string \p s.
-*/
-Prolog_atom
-Prolog_atom_from_string(const char* s) {
-  // TODO: remove the const_cast when the GNU Prolog people fix gprolog.h.
-  return Create_Allocate_Atom(const_cast<char*>(s));
-}
-
-Prolog_term_ref args[4];
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 1 with argument \p a1.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1) {
-  args[0] = a1;
-  t = Mk_Compound(f, 1, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 2 with arguments \p a1 and \p a2.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2) {
-  args[0] = a1;
-  args[1] = a2;
-  t = Mk_Compound(f, 2, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 3 with arguments \p a1, \p a2 and \p a3.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3) {
-  args[0] = a1;
-  args[1] = a2;
-  args[2] = a3;
-  t = Mk_Compound(f, 3, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3, Prolog_term_ref a4) {
-  args[0] = a1;
-  args[1] = a2;
-  args[2] = a3;
-  args[3] = a4;
-  t = Mk_Compound(f, 4, args);
-  return 1;
-}
-
-/*!
-  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
-*/
-inline int
-Prolog_construct_cons(Prolog_term_ref& c,
-		      Prolog_term_ref h, Prolog_term_ref t) {
-  args[0] = h;
-  args[1] = t;
-  c = Mk_List(args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a term representing the address contained in \p p.
-*/
-inline int
-Prolog_put_address(Prolog_term_ref& t, void* p) {
-  union {
-    unsigned long l;
-    unsigned short s[2];
-  } u;
-  u.l = reinterpret_cast<unsigned long>(p);
-  return Prolog_construct_compound(t, a_dollar_address,
-				   Mk_Positive(u.s[0]), Mk_Positive(u.s[1]));
-}
-
-/*!
-  Raise a Prolog exception with \p t as the exception term.
-*/
-inline void
-Prolog_raise_exception(Prolog_term_ref t) {
-  Pl_Exec_Continuation(a_throw, 1, &t);
-}
-
-/*!
-  Return true if \p t is a Prolog variable, false otherwise.
-*/
-inline int
-Prolog_is_variable(Prolog_term_ref t) {
-  return Blt_Var(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog atom, false otherwise.
-*/
-inline int
-Prolog_is_atom(Prolog_term_ref t) {
-  return Blt_Atom(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog integer, false otherwise.
-*/
-inline int
-Prolog_is_integer(Prolog_term_ref t) {
-  return Blt_Integer(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog compound term, false otherwise.
-*/
-inline int
-Prolog_is_compound(Prolog_term_ref t) {
-  return Blt_Compound(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog list, false otherwise.
-*/
-inline int
-Prolog_is_cons(Prolog_term_ref t) {
-  if (Blt_Compound(t) == FALSE)
-    return 0;
-  Prolog_atom name;
-  int arity;
-  Rd_Compound(t, &name, &arity);
-  return name == ATOM_CHAR('.') && arity == 2;
-}
-
-/*!
-  Assuming \p t is a Prolog integer, return true if its value fits
-  in a long, in which case the value is assigned to \p v,
-  return false otherwise.  The behavior is undefined if \p t is
-  not a Prolog integer.
-*/
-inline int
-Prolog_get_long(Prolog_term_ref t, long* lp) {
-  assert(Prolog_is_integer(t));
-  *lp = Rd_Integer_Check(t);
-  return 1;
-}
-
-/*!
-  Return true if \p t is the representation of an address, false otherwise.
-*/
-inline int
-Prolog_is_address(Prolog_term_ref t) {
-  if (!Prolog_is_compound(t))
-    return 0;
-  Prolog_atom name;
-  int arity;
-  Prolog_term_ref* a = Rd_Compound_Check(t, &name, &arity);
-  if (name != a_dollar_address || arity != 2)
-    return 0;
-  for (int i = 0; i <= 1; ++i) {
-    if (!Prolog_is_integer(a[i]))
-      return 0;
-    long l;
-    if (!Prolog_get_long(a[i], &l))
-      return 0;
-    if (l < 0 || l > USHRT_MAX)
-      return 0;
-  }
-  return 1;
-}
-
-/*!
-  If \p t is the Prolog representation for a memory address, return
-  true and store that address into \p v; return false otherwise.
-  The behavior is undefined if \p t is not an address.
-*/
-inline int
-Prolog_get_address(Prolog_term_ref t, void** vpp) {
-  assert(Prolog_is_address(t));
-  static Prolog_atom dummy_name;
-  static int dummy_arity;
-  Prolog_term_ref* a = Rd_Compound_Check(t, &dummy_name, &dummy_arity);
-  union {
-    unsigned long l;
-    unsigned short s[2];
-  } u;
-  u.s[0] = Rd_Integer_Check(a[0]);
-  u.s[1] = Rd_Integer_Check(a[1]);
-  *vpp = reinterpret_cast<void*>(u.l);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog atom, return true and store its name into \p name.
-  The behavior is undefined if \p t is not a Prolog atom.
-*/
-inline int
-Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
-  assert(Prolog_is_atom(t));
-  *ap = Rd_Atom_Check(t);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term, return true and store its name
-  and arity into \p name and \p arity, respectively.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
-  assert(Prolog_is_compound(t));
-  Rd_Compound_Check(t, ap, ip);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term and \p i is a positive integer
-  less than or equal to its arity, return true and assign to \p a the
-  i-th (principal) argument of \p t.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
-  assert(Prolog_is_compound(t));
-  static Prolog_atom dummy_name;
-  static int dummy_arity;
-  a = Rd_Compound_Check(t, &dummy_name, &dummy_arity)[i-1];
-  return 1;
-}
-
-/*!
-  If \p c is a Prolog cons (list constructor), assign its head and
-  tail to \p h and \p t, respectively.
-  The behavior is undefined if \p c is not a Prolog cons.
-*/
-inline int
-Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
-  assert(Prolog_is_cons(c));
-  Prolog_term_ref* ht = Rd_List_Check(c);
-  h = ht[0];
-  t = ht[1];
-  return 1;
-}
-
-/*!
-  Unify the terms referenced by \p t and \p u and return true
-  if the unification is successful; return false otherwise.
-*/
-inline int
-Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
-  return Unify(t, u) != FALSE;
-}
-
-PPL::Coefficient
-integer_term_to_Coefficient(Prolog_term_ref t) {
-  long v;
-  Prolog_get_long(t, &v);
-  return PPL::Coefficient(v);
-}
-
-Prolog_term_ref
-Coefficient_to_integer_term(const PPL::Coefficient& n) {
-  long l = 0;
-  if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) != PPL::V_EQ)
-    throw PPL_integer_out_of_range(n);
-  Prolog_term_ref t = Prolog_new_term_ref();
-  Prolog_put_long(t, l);
-  return t;
-}
-
-} // namespace
-
-#undef CS
-
-#include "../ppl_prolog.icc"
diff --git a/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
new file mode 100644
index 0000000..255a96f
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
@@ -0,0 +1,46 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_gprolog.pl.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* GNU Prolog interface: GNU Prolog part.
+m4_include(`ppl_interface_generator_copyright')
+*/
+m4_divert(-1)
+
+m4_define(`tm', ``+term'')
+
+m4_define(`start', 0)
+
+m4_define(`m4_extension',
+  `:- foreign($1`'m4_ifelse(`$2', 0, ,`(m4_term_sequence($2, `tm'))')).
+')
+
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..c69fda6
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
@@ -0,0 +1,23 @@
+/* System-dependent part of the Prolog interfaces: stub for GNU Prolog.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "gprolog_efli.hh"
diff --git a/interfaces/Prolog/Makefile.am b/interfaces/Prolog/Makefile.am
index b84e0fd..5ad7413 100644
--- a/interfaces/Prolog/Makefile.am
+++ b/interfaces/Prolog/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,6 +20,80 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-SUBDIRS = Ciao GNU SICStus SWI XSB YAP tests
+SUBDIRS = . tests Ciao GNU SICStus SWI XSB YAP
 
-noinst_HEADERS = ppl_prolog.icc exceptions.hh track_allocation.hh
+interface_generator_files = \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4 \
+ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4 \
+ppl_prolog_sysdep_dox \
+ppl_prolog_sysindep_dox
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+Prolog_interface.dox \
+ppl_prolog_common.defs.hh \
+ppl_prolog_common.inlines.hh \
+ppl_prolog_common.cc
+
+if BUILD_SOME_PROLOG_INTERFACES
+
+BUILT_SOURCES = \
+Prolog_interface.dox \
+ppl_prolog_domains.hh \
+ppl_prolog_domains.cc
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4
+
+ppl_prolog_domains.hh: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_hh_files.m4 \
+                > ppl_prolog_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh < ppl_prolog_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh < ppl_prolog_hh_blob
+	rm -f ppl_prolog_hh_blob
+
+ppl_prolog_domains.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_cc_files.m4 \
+                > ppl_prolog_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh < ppl_prolog_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh < ppl_prolog_cc_blob
+	rm -f ppl_prolog_cc_blob
+
+ppl_prolog_main.icc: $(interface_generator_dependencies) Makefile
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_icc_files.m4 \
+                > ppl_prolog_icc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh < ppl_prolog_icc_blob
+	$(top_srcdir)/utils/cm_splitter.sh < ppl_prolog_icc_blob
+	rm -f ppl_prolog_icc_blob
+
+Prolog_interface.dox: $(interface_generator_dependencies) Makefile
+	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_dox.m4 \
+                > Prolog_interface.dox
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+DISTCLEANFILES = \
+ppl_prolog_*.hh \
+ppl_prolog_*.cc \
+Prolog_interface.dox
diff --git a/interfaces/Prolog/Makefile.in b/interfaces/Prolog/Makefile.in
index 20fef71..5c009d0 100644
--- a/interfaces/Prolog/Makefile.in
+++ b/interfaces/Prolog/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,16 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -59,10 +54,10 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = interfaces/Prolog
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +67,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -84,49 +89,30 @@ SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
-HEADERS = $(noinst_HEADERS)
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -136,53 +122,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -191,56 +175,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -252,10 +210,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -264,28 +226,89 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-SUBDIRS = Ciao GNU SICStus SWI XSB YAP tests
-noinst_HEADERS = ppl_prolog.icc exceptions.hh track_allocation.hh
-all: all-recursive
+SUBDIRS = . tests Ciao GNU SICStus SWI XSB YAP
+interface_generator_files = \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4 \
+ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4 \
+ppl_prolog_sysdep_dox \
+ppl_prolog_sysindep_dox
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+Prolog_interface.dox \
+ppl_prolog_common.defs.hh \
+ppl_prolog_common.inlines.hh \
+ppl_prolog_common.cc
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@BUILT_SOURCES = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@Prolog_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_prolog_domains.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_prolog_domains.cc
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@interface_generator_dependencies = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../ppl_interface_generator_common.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../ppl_interface_generator_common_dat.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../ppl_interface_generator_copyright \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_dox.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_dox_code.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_hh_files.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_hh_code.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_cc_files.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_prolog_cc_code.m4
+
+DISTCLEANFILES = \
+ppl_prolog_*.hh \
+ppl_prolog_*.cc \
+Prolog_interface.dox
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
@@ -324,10 +347,6 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -359,8 +378,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -404,8 +422,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -430,8 +448,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -441,13 +459,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -461,22 +478,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -490,7 +506,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -498,16 +514,20 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
 	done
 check-am: all-am
-check: check-recursive
-all-am: Makefile $(HEADERS)
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile
 installdirs: installdirs-recursive
 installdirs-am:
-install: install-recursive
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
 install-exec: install-exec-recursive
 install-data: install-data-recursive
 uninstall: uninstall-recursive
@@ -527,18 +547,19 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-recursive
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-recursive
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
+distclean-am: clean-am distclean-generic distclean-tags
 
 dvi: dvi-recursive
 
@@ -552,12 +573,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am:
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -576,23 +605,54 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-generic clean-libtool clean-recursive ctags \
-	ctags-recursive distclean distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic maintainer-clean-recursive \
-	mostlyclean mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am
-
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am
+
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_prolog_domains.hh: $(interface_generator_dependencies)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@           $(srcdir)/ppl_interface_generator_prolog_hh_files.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@                > ppl_prolog_hh_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_cleaner.sh < ppl_prolog_hh_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_splitter.sh < ppl_prolog_hh_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -f ppl_prolog_hh_blob
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_prolog_domains.cc: $(interface_generator_dependencies)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@           $(srcdir)/ppl_interface_generator_prolog_cc_files.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@                > ppl_prolog_cc_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_cleaner.sh < ppl_prolog_cc_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_splitter.sh < ppl_prolog_cc_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -f ppl_prolog_cc_blob
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_prolog_main.icc: $(interface_generator_dependencies) Makefile
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@           $(srcdir)/ppl_interface_generator_prolog_icc_files.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@                > ppl_prolog_icc_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_cleaner.sh < ppl_prolog_icc_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_splitter.sh < ppl_prolog_icc_blob
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -f ppl_prolog_icc_blob
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@Prolog_interface.dox: $(interface_generator_dependencies) Makefile
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	m4 --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@           $(srcdir)/ppl_interface_generator_prolog_dox.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@                > Prolog_interface.dox
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/Prolog/Prolog_interface.dox b/interfaces/Prolog/Prolog_interface.dox
index af930b4..c84fd3f 100644
--- a/interfaces/Prolog/Prolog_interface.dox
+++ b/interfaces/Prolog/Prolog_interface.dox
@@ -1,11 +1,11 @@
 /* Documentation for the Prolog interfaces.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-/*! \defgroup PrologInterface Prolog Language Interface
+/*! \mainpage Prolog Language Interface
 
 The Parma Polyhedra Library comes equipped with a Prolog interface.
 Despite the lack of standardization of Prolog's foreign language interfaces,
@@ -45,18 +45,57 @@ or <CODE>/usr/local</CODE>).
 \anchor PI_SI_Features
 <H1>System-Independent Features</H1>
 
-The Prolog interface provides access to the PPL polyhedra.
-A general introduction to convex polyhedra, their representation in the PPL
-and the operations provided by the PPL is given in Sections
-\ref preamble, \ref convex_polys, \ref representation
-and \ref Operations_on_Convex_Polyhedra of this manual.
+The Prolog interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in the main \extref{preamble, PPL user manual}.
 Here we just describe those aspects that are specific to the Prolog interface.
-
+<H4>Contents:</H4>
+- \ref Prolog_Interface_Overview "Overview";
+- \ref Predicate_Specifications "Predicate Specifications";
+- \ref predicate_descriptions "Predicate Descriptions"
+    - \ref di_predicates "Domain Independent Predicates",
+    - \ref mip_predicates "MIP Predicates",
+    - \ref main_polyhedron_predicates "Main Polyhedron Predicates";
+- \ref generated_predicates "Examples of Generated Domains with Predicates".
+
+\anchor Prolog_Interface_Overview
 <H2>Overview</H2>
 
 First, here is a list of notes with general information and advice
 on the use of the interface.
 
+- The numerical abstract domains available to the Prolog user consist
+  of the <EM>simple</EM> domains, <EM>powersets</EM> of a simple domain and
+  <EM>products</EM> of simple domains.
+  - The simple domains are:
+     - convex polyhedra, which consist of C_Polyhedron and
+       NNC_Polyhedron;<BR>
+     - weakly relational, which consist of BD_Shape_N and
+       Octagonal_Shape_N
+       where N is one of the numeric types
+       short, signed_char, int, long, long_long,
+       mpz_class, mpq_class;<BR>
+     - boxes which consist of
+       Int8_Box, Int16_Box,
+       Int32_Box, Int64_Box,
+       Uint8_Box, Uint16_Box,
+       Uint32_Box, Uint64_Box,
+       Double_Box, Long_Double_Box,
+       Z_Box, Rational_Box, Float_Box; and<BR>
+     - the Grid domain.
+  - The powerset domains are Pointset_Powerset_S where S is
+    a simple domain.
+  - The product domains consist of
+    Direct_Product_S_T,
+    Smash_Product_S_T and
+    Constraints_Product_S_T where S
+    and T are simple domains.
+- In the following, any of the above numerical
+  abstract domains  is called a PPL <EM>domain</EM>
+  and any element of a PPL domain is called a <EM>PPL object</EM>.
 - The Prolog interface files are all installed in the directory
   <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
   dynamically loaded libraries, you must make your dynamic
@@ -82,31 +121,28 @@ on the use of the interface.
   explicitly: since they can be called multiple times without problems,
   this will result in enhanced portability at a cost that is, by all means,
   negligible.
-
-- A PPL polyhedron can only be accessed by means of a Prolog term
-  called a <EM>handle</EM>.
+- A PPL object such as a polyhedron can only be accessed
+  by means of a Prolog term called a <EM>handle</EM>.
   Note, however, that the data structure of a handle,
   is implementation-dependent, system-dependent and
   version-dependent, and, for this reason, deliberately left unspecified.
   What we do guarantee is that the handle requires very little memory.
-
-- A Prolog term can be bound to a valid handle by using
+- A Prolog term can be bound to a valid handle for a PPL object by using
   predicates such as
 \code
   ppl_new_C_Polyhedron_from_space_dimension/3,
   ppl_new_C_Polyhedron_from_C_Polyhedron/2,
   ppl_new_C_Polyhedron_from_constraints/2,
   ppl_new_C_Polyhedron_from_generators/2,
-  ppl_new_C_Polyhedron_from_bounding_box/2.
 \endcode
   These predicates will create or copy a PPL polyhedron
   and construct a valid handle for referencing it.
   The last argument is a Prolog term that is
   unified with a new valid handle for accessing this polyhedron.
 
-- As soon as a PPL polyhedron is no longer required,
+- As soon as a PPL object is no longer required,
   the memory occupied by it should be released
-  using the PPL predicate <CODE>ppl_delete_Polyhedron/1</CODE>.
+  using the PPL predicate such as <CODE>ppl_delete_Polyhedron/1</CODE>.
   To understand why this is important,
   consider a Prolog program and a variable that is bound to
   a Herbrand term.
@@ -121,23 +157,23 @@ on the use of the interface.
   Once a handle has been used as an argument in
   <CODE>ppl_delete_Polyhedron/1</CODE>,
   it becomes invalid.
-
-- For a PPL polyhedron with space dimension \p k,
+- For a PPL object with space dimension \p k,
   the identifiers used for the PPL variables
   must lie between 0 and \f$k-1\f$ and correspond to the indices of the
   associated Cartesian axes.
-  When using the predicates that combine PPL polyhedra
+  For example, when using the predicates that combine PPL polyhedra
   or add constraints or generators to a representation of
   a PPL polyhedron,
   the polyhedra referenced and any constraints or generators in the call
   should follow all the (space) dimension-compatibility rules stated in
-  Section \ref representation.
-
+  Section \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
 - As explained above, a polyhedron has a fixed topology C or NNC,
   that is determined at the time of its initialization.
   All subsequent operations on the polyhedron must respect all the
-  topological compatibility rules stated in Section \ref representation.
-
+  topological compatibility rules stated in Section
+  \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
 - Any application using the PPL should make sure that only the
   intended version(s) of the library are ever used.
   Predicates
@@ -151,512 +187,8 @@ on the use of the interface.
 \endcode
   allow run-time checking of information about the version being used.
 
-<H2>PPL Predicate List</H2>
-
-Here is a list of all the PPL predicates provided by the Prolog interface.
-
-<CODE>
-  ppl_version_major(?C_int)
-</CODE>
-
-<CODE>
-  ppl_version_minor(?C_int)
-</CODE>
-
-<CODE>
-  ppl_version_revision(?C_int)
-</CODE>
-
-<CODE>
-  ppl_version_beta(?C_int)
-</CODE>
-
-<CODE>
-  ppl_version(?Atom)
-</CODE>
-
-<CODE>
-  ppl_banner(?Atom)
-</CODE>
-
-<CODE>
-  ppl_max_space_dimension(?Dimension_Type)
-</CODE>
-
-<CODE>
-  ppl_Coefficient_is_bounded
-</CODE>
-
-<CODE>
-  ppl_Coefficient_max(?Coefficient)
-</CODE>
-
-<CODE>
-  ppl_Coefficient_min(?Coefficient)
-</CODE>
-
-<CODE>
-  ppl_initialize
-</CODE>
-
-<CODE>
-  ppl_finalize
-</CODE>
-
-<CODE>
-  ppl_set_timeout_exception_atom(+Atom)
-</CODE>
-
-<CODE>
-  ppl_set_timeout(+C_unsigned)
-</CODE>
-
-<CODE>
-  ppl_reset_timeout
-</CODE>
-
-<CODE>
-  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
-                                          +Universe_or_Empty, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
-                                          +Universe_or_Empty, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
-</CODE>
-
-<CODE>
-  ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
-</CODE>
-
-<CODE>
-  ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
-</CODE>
-
-<CODE>
-  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
-</CODE>
-
-<CODE>
-  ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_swap(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_delete_Polyhedron(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_get_constraints(+Handle, -Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_get_minimized_constraints(+Handle, -Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_get_generators(+Handle, -Generator_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_get_minimized_generators(+Handle, -Generator_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, -Relation)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_relation_with_generator(+Handle, +Generator, -Relation)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_get_bounding_box(+Handle, +Complexity, -Box)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_is_empty(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_is_universe(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_is_bounded(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_maximize(+Handle, +Lin_Expr,
-                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr,
-                                     ?Coefficient_1, ?Coefficient_2,
-                                     ?Boolean, ?Point)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_minimize(+Handle, +Lin_Expr,
-                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr,
-                                     ?Coefficient_1, ?Coefficient_2,
-                                     ?Boolean, ?Point)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_is_topologically_closed(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_OK(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_constraint(+Handle, +Constraint)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_generator(+Handle, +Generator)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_constraints_and_minimize(+Handle, +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_generators(+Handle, +Generator_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_generators_and_minimize(+Handle, +Generator_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounded_affine_image(+Handle,
-                                      +PPL_Var,
-                                      +Lin_Expr_1,
-                                      +Lin_Expr_2,
-                                      +Coefficient)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_generalized_affine_image(+Handle,
-					  +PPL_Var,
-					  +Relation_Symbol,
-					  +Lin_Expr,
-					  +Coefficient)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
-						  +Lin_Expr_1,
-						  +Relation_Symbol,
-						  +Lin_Expr_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2,
-					+C_unsigned_1, ?C_unsigned_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
-                                                     +Handle_2,
-						     +Constraint_System,
-						     +C_unsigned_1,
-						     ?C_unsigned_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
-						     +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
-                                                     +Handle_2,
-						     +Constraint_System,
-						     +C_unsigned_1,
-						     ?C_unsigned_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
-						     +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2,
-						+C_unsigned_1,
-						?C_unsigned_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1,
-                                                  +Handle_2,
-						  +Constraint_System,
-						   +C_unsigned_1,
-						   ?C_unsigned_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2,
-						  +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1,
-                                                  +Handle_2,
-						  +Constraint_System,
-						  +C_unsigned_1,
-						  ?C_unsigned_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2,
-						  +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_topological_closure_assign(+Handle)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type))
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
-</CODE>
-
-<CODE>
-  ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func))
-</CODE>
-
-<CODE>
-  ppl_new_LP_Problem_trivial(-Handle)
-</CODE>
-
-<CODE>
-  ppl_new_LP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
-                     -Handle)
-</CODE>
-
-<CODE>
-  ppl_new_LP_Problem_from_LP_Problem(+Handle_1, -Handle_2)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_swap(+Handle_1, +Handle_2)
-</CODE>
-
-<CODE>
-  ppl_delete_LP_Problem(+Handle)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_space_dimension(+Handle, ?Dimension_Type)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_constraints(+Handle, -Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_objective_function(+Handle, -Lin_Expr)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_clear(+Handle)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_add_constraint(+Handle, +Constraint)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_add_constraints(+Handle, +Constraint_System)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_set_objective_function(+Handle, +Lin_Expr)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_is_satisfiable(+Handle)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_solve(+Handle, ?LP_Problem_Status)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_feasible_point(+Handle, -Generator)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_optimizing_point(+Handle, -Generator)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_evaluate_objective_function(+Handle, +Generator,
-                                             ?Coefficient_1, ?Coefficient_2)
-</CODE>
-
-<CODE>
-  ppl_LP_Problem_OK(+Handle)
-</CODE>
-
-
-<H2>PPL Predicate Specifications</H2>
+\anchor Predicate_Specifications
+<H2>Predicate Specifications</H2>
 
 The PPL predicates provided by the Prolog interface are specified below.
 The specification uses the following grammar rules:
@@ -746,9 +278,9 @@ The specification uses the following grammar rules:
 	    | saturates			with a constraint
             | subsumes			with a generator
 
- Poly_Relation_List			list of polyhedron relations
+ Relation_List			list of polyhedron relations
 	     --> []
-	    | [Poly_Relation | Poly_Relation_List]
+	    | [Poly_Relation | Relation_List]
 
  Complexity  --> polynomial | simplex | any
 
@@ -771,112 +303,330 @@ The specification uses the following grammar rules:
  Box         --> []			list of intervals
             | [Interval | Box]
 
- Vars_Pair   --> PPLVar - PPLVar        map relation
+ Vars_Pair   --> PPLVar - PPLVar        map relation
+
+ P_Func      --> []    			list of map relations
+            | [Vars_Pair | P_Func].
+
+ Optimization_Mode
+             --> max | min
+
+ MIP_Problem_Status
+             --> unfeasible | unbounded | optimized
+
+ Vars_List   --> []    			list of PPL variables
+            | [PPL_Var | Vars_List].
+\endcode
+
+\anchor predicate_descriptions
+<H2> Predicate Descriptions </H2>
+
+Below is a short description of many of the interface predicates.
+For full definitions of terminology used here, see the main PPL user manual.
+
+\anchor di_predicates
+<H3> Domain Independent Predicates </H3>
+
+First we describe the domain independent predicates
+that are included with all instantiations of the Prolog interfaces.
+
+<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the revision number
+  of the PPL version.
+
+<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+
+<H2><CODE> ppl_version(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with the PPL version.
+
+<H2><CODE> ppl_banner(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with
+  information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+
+  Succeeds if and only if the Coefficients in the C++ interface are bounded.
+
+<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the maximum coefficient the C++ interface can handle is
+  unified with <CODE>Max</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the minimum coefficient the C++ interface can handle is
+  unified with <CODE>Min</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+
+  Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+  this library can handle.
+
+<H2><CODE>
+  ppl_initialize
+ </CODE></H2>
+
+  Initializes the PPL interface.
+  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+
+<H2><CODE>
+  ppl_finalize
+ </CODE></H2>
+
+  Finalizes the PPL interface.
+  Once this is executed, the next call to an interface predicate must
+  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.
+
+<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+
+   Sets the atom to be thrown by timeout exceptions
+   to <CODE>Atom</CODE>.
+   The default value is <CODE>time_out</CODE>.
+
+<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+
+   The atom to be thrown by timeout exceptions
+   is unified with <CODE>Atom</CODE>.
+
+<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+
+   Computations taking exponential time will be interrupted
+   some time after <CODE>C_unsigned</CODE> ms after that call.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>C_unsigned</CODE> must be strictly greater than zero.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+
+   Resets the timeout time so that the computation is not interrupted.
+
+<BR>
+
+\anchor mip_predicates
+<H3> MIP Predicates </H3>
+Here we describe the predicates available for PPL objects
+defining mixed integer (linear) programming problems.
+
+<H2><CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region
+   the vector space of dimension <CODE>Dimension_Type</CODE>,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                      -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with
+   the feasible region represented by <CODE>Constraint_System</CODE>,
+   objective function <CODE>Lin_Expr</CODE> and optimization mode
+   <CODE>Optimization_Mode</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE></H2>
+
+   Swaps the MIP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE></H2>
+
+   Deletes the MIP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL MIP Problem.
+
+<H2><CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   MIP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, -Vars_List)
+</CODE></H2>
+
+   Unifies <CODE>Vars_List</CODE> with a list of variables representing
+   representing the integer space dimensions of the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE></H2>
+
+   Unifies <CODE>Lin_Expr</CODE> with the objective function
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE></H2>
 
- P_Func      --> []    			list of map relations
-            | [Vars_Pair | P_Func].
+   Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
 
- Optimization_Mode
-             --> max | min
+<H2><CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE></H2>
 
- LP_Problem_Status
-             --> unfeasible | unbounded | optimized
-\endcode
+  Resets the MIP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
 
-\anchor predicates
-Below is a short description of each of the interface predicates.
-For full definitions of terminology used here, see Sections
-\ref preamble, \ref convex_polys, \ref representation
-and \ref Operations_on_Convex_Polyhedra of this manual.
+<H2><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
 
+   Embeds the MIP problem referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
 
-<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
-  Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+<H2><CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE></H2>
 
-<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
-  Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the variables in <CODE>Vars_List</CODE> are added to
+   the set of integer space dimensions.
 
-<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
-  Unifies <CODE>C_int</CODE> with the revision number
-  of the PPL version.
+<H2><CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE></H2>
 
-<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
-  Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.
 
-<H2><CODE> ppl_version(?Atom) </CODE></H2>
-  Unifies <CODE>Atom</CODE> with the PPL version.
+<H2><CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE></H2>
 
-<H2><CODE> ppl_banner(?Atom) </CODE></H2>
-  Unifies <CODE>Atom</CODE> with
-  information about the PPL version, the licensing, the lack of any
-  warranty whatsoever, the C++ compiler used to build the library,
-  where to report bugs and where to look for further information.
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>Constraint_System</CODE>.
 
-<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+<H2><CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE></H2>
 
-  Succeeds if and only if the Coefficients in the C++ interface are bounded.
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the objective function is changed to <CODE>Lin_Expr</CODE>.
 
-<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+<H2><CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE></H2>
 
-  If the Coefficients in the C++ interface are bounded,
-  then the maximum coefficient the C++ interface can handle is
-  unified with <CODE>Max</Code>.
-  If the Prolog system cannot handle this coefficient, then
-  an exception is thrown.
-  It fails if the Coefficients in the C++ interface are unbounded.
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
 
-<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+<H2><CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE></H2>
 
-  If the Coefficients in the C++ interface are bounded,
-  then the minimum coefficient the C++ interface can handle is
-  unified with <CODE>Min</Code>.
-  If the Prolog system cannot handle this coefficient, then
-  an exception is thrown.
-  It fails if the Coefficients in the C++ interface are unbounded.
+  Succeeds if and only if the MIP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.
 
-<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+<H2><CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE></H2>
 
-  Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
-  this library can handle.
+  Solves the MIP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>MIP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the MIP problem is not satisfiable;
+  <CODE>unbounded</CODE>, if the MIP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  <CODE>optimized</CODE>, if the MIP problem admits an optimal solution.
 
 <H2><CODE>
-  ppl_initialize
- </CODE></H2>
+  ppl_MIP_Problem_feasible_point(+Handle, ?Generator)
+</CODE></H2>
 
-  Initializes the PPL interface.
-  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+  Unifies  <CODE>Generator</CODE> with a feasible point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
 
 <H2><CODE>
-  ppl_finalize
- </CODE></H2>
+  ppl_MIP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE></H2>
 
-  Finalizes the PPL interface.
-  Once this is executed, the next call to an interface predicate must
-  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
-  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.
+  Unifies  <CODE>Generator</CODE> with an optimizing point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
 
-<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+<H2><CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
 
-   Sets the atom to be thrown by timeout exceptions
-   to <CODE>Atom</CODE>.
-   The default value is <CODE>time_out</CODE>.
+  Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
+  with the numerator and denominator, respectively, for the optimal value
+  for the MIP problem  referenced by <CODE>Handle</CODE>.
 
-<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+<H2><CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+  Evaluates the objective function of the MIP problem  referenced by
+  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+  <CODE>Coefficient_1</CODE> is unified with the numerator and
+  <CODE>Coefficient_2</CODE> is unified with the denominator of the
+  objective function value at <CODE>Generator</CODE>.
 
-   The atom to be thrown by timeout exceptions
-   is unified with <CODE>Atom</CODE>.
+<H2><CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE></H2>
 
-<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+   Succeeds only if the MIP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
 
-   Computations taking exponential time will be interrupted
-   some time after <CODE>C_unsigned</CODE> ms after that call.
-   If the computation is interrupted that way, the current timeout
-   exception atom will be thrown.
-   <CODE>C_unsigned</CODE> must be strictly greater than zero.
+<BR>
 
-<H2><CODE> ppl_reset_timeout </CODE></H2>
+\anchor main_polyhedron_predicates
+<H3> Convex Polyhedron Predicates </H3>
+Here we describe the main predicates available for PPL objects
+defining convex polyhedra. A full list of the available
+PPL domains for convex polyhedra that have been instantiated
+for the Prolog interface is given in
+Section \ref Polyhedron_predicates "Polyhedron Predicate List".
 
-   Resets the timeout time so that the computation is not interrupted.
+<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
+
+   Deletes the polyhedron referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
 
 <H2><CODE>
   ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
@@ -1013,12 +763,6 @@ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
    with the one referenced by <CODE>Handle_2</CODE>.
    The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
 
-<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
-
-   Deletes the polyhedron referenced by <CODE>Handle</CODE>.
-   After execution,
-   <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
-
 <H2><CODE> ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type) </CODE></H2>
 
    Unifies the dimension of the vector space in which the
@@ -1061,22 +805,24 @@ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
    representing the polyhedron referenced by <CODE>Handle</CODE>.
 
 <H2><CODE> ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint,
-               ?Poly_Relation_List) </CODE></H2>
+               ?Relation_List) </CODE></H2>
 
-Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+Unifies <CODE>Relation_List</CODE> with the list of relations the
 polyhedron referenced by <CODE>Handle</CODE> has with
 <CODE>Constraint</CODE>.  The possible relations are listed in the
 grammar rules above; their meaning is given in Section
-\ref relation_with "specifying the relation_with operations".
+\extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
 
 <H2><CODE> ppl_Polyhedron_relation_with_generator(+Handle, +Generator,
-               ?Poly_Relation_List) </CODE></H2>
+               ?Relation_List) </CODE></H2>
 
-Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+Unifies <CODE>Relation_List</CODE> with the list of relations the
 polyhedron referenced by <CODE>Handle</CODE> has with
 <CODE>Generator</CODE>.  The possible relations are listed in the
 grammar rules above; their meaning is given in
-Section \ref relation_with "specifying the relation_with operations".
+Section \extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
 
 <H2><CODE> ppl_Polyhedron_get_bounding_box(+Handle,
                                           +Complexity,
@@ -1128,6 +874,11 @@ to be used has the following meaning:
    Succeeds if and only if the polyhedron referenced by
    <CODE>Handle</CODE> is bounded.
 
+<H2><CODE> ppl_Polyhedron_contains_integer_point(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> contains at least one integer point.
+
 <H2><CODE> ppl_Polyhedron_bounds_from_above(+Handle,
                                    +Lin_Expr) </CODE></H2>
 
@@ -1332,7 +1083,8 @@ and a query will succeed even when
 
    If the system of generators representing a polyhedron
    is non-empty, then it must include a point
-   (see Section \ref Generators_Representation).
+   (see Section \extref{Generators_Representation, Generators Representation}
+    of the main PPL user manual).
    Thus care must be taken to ensure that, before calling this
    predicate, either the polyhedron referenced by <CODE>Handle</CODE>
    is non-empty or that whenever <CODE>Generator_System</CODE> is
@@ -1412,7 +1164,7 @@ This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
 
 <H2><CODE> ppl_Polyhedron_generalized_affine_image(+Handle,
                +PPL_Var,
-               +Relation_Symbol
+               +Relation_Symbol,
                +Lin_Expr,
                +Coefficient) </CODE></H2>
 
@@ -1425,7 +1177,7 @@ This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
 
 <H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
                +Lin_Expr_1,
-               +Relation_Symbol
+               +Relation_Symbol,
                +Lin_Expr_2) </CODE></H2>
 
    Transforms the polyhedron referenced by <CODE>Handle</CODE>
@@ -1682,8 +1434,8 @@ This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
    Assigns to the polyhedron referenced by <CODE>Handle</CODE>
    its topological closure.
 
-<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed(
-             +Handle, +Dimension_Type)
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed(+Handle,
+	+Dimension_Type)
  </CODE></H2>
 
    Embeds the polyhedron  referenced by <CODE>Handle</CODE>
@@ -1758,7 +1510,7 @@ This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
    GS = [point(0),line(1*A),line(1*B),line(0)]
 \endcode
 
-<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type) </CODE></H2>
 
    Projects the polyhedron  referenced to by <CODE>Handle</CODE>
    onto  the first <CODE>Dimension_Type</CODE> dimension.
@@ -1770,7 +1522,7 @@ This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
 \endcode
 
 <H2><CODE>
-  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)
 </CODE></H2>
 
    <CODE>Dimension_Type</CODE> copies of the space dimension referenced by
@@ -1778,189 +1530,701 @@ This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
    referenced to by <CODE>Handle</CODE>.
 
 <H2><CODE>
-  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)
 </CODE></H2>
 
    The space dimensions referenced by the PPL variables in list
    <CODE>List_of_PPL_Vars</CODE> are folded into the dimension referenced
    by <CODE>PPL_Var</CODE> and removed.
    The result is undefined if <CODE>List_of_PPL_Vars</CODE>
-   does not have the properties described in
-   Section \ref fold_space_dimensions.
+   does not have the properties described in Section
+   \extref{fold_space_dimensions, Folding Multiple Dimensions of the Vector Space into One Dimension}
+   of the main PPL user manual.
 
-<H2><CODE> ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func) </CODE></H2>
 
    Maps the space dimensions of the polyhedron referenced by
    <CODE>Handle</CODE>
    using the partial function defined by <CODE>P_Func</CODE>.
    The result is undefined if \p P_Func does not encode a partial
    function with the properties described in
-   Section \ref Mapping_the_Dimensions_of_the_Vector_Space
-   "specifying the map_space_dimensions operator".
-
-<H2><CODE>
-  ppl_new_LP_Problem_trivial(-Handle)
-</CODE></H2>
-
-   Creates an LP Problem \f$\mathrm{LP}\f$ with
-   the feasible region the \f$0\f$-dimensional universe,
-   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
-   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{LP}\f$.
-
-<H2><CODE>
-  ppl_new_LP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
-                     -Handle)
-</CODE></H2>
-
-   Creates an LP Problem \f$\mathrm{LP}\f$ with
-   the feasible region represented by <CODE>Constraint_System</CODE>,
-   objective function <CODE>Lin_Expr</CODE> and optimization mode
-   <CODE>Optimization_Mode</CODE>.
-   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{LP}\f$.
-
-<H2><CODE>
-  ppl_LP_Problem_swap(+Handle_1, +Handle_2)
-</CODE></H2>
-
-   Swaps the LP Problem referenced by <CODE>Handle_1</CODE>
-   with the one referenced by <CODE>Handle_2</CODE>.
-
-<H2><CODE>
-  ppl_delete_LP_Problem(+Handle)
-</CODE></H2>
-
-   Deletes the LP Problem referenced by <CODE>Handle</CODE>.
-   After execution,
-   <CODE>Handle</CODE> is no longer a valid handle for a PPL LP Problem.
-
-<H2><CODE>
-  ppl_LP_Problem_space_dimension(+Handle, ?Dimension_Type)
-</CODE></H2>
-
-   Unifies the dimension of the vector space in which the
-   LP Problem referenced by <CODE>Handle</CODE> is embedded
-   with <CODE>Dimension_Type</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_constraints(+Handle, -Constraint_System)
-</CODE></H2>
-
-   Unifies <CODE>Constraint_System</CODE> with a list of
-   the constraints in the constraints system
-   representing the feasible region for the LP Problem
-   referenced by <CODE>Handle</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_objective_function(+Handle, -Lin_Expr)
-</CODE></H2>
-
-   Unifies <CODE>Lin_Expr</CODE> with the objective function
-   for the LP Problem referenced by <CODE>Handle</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
-</CODE></H2>
-
-   Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
-   for the LP Problem referenced by <CODE>Handle</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_clear(+Handle)
-</CODE></H2>
-
-  Resets the LP problem referenced by <CODE>Handle</CODE>
-  to be the trivial problem with
-  the feasible region the \f$0\f$-dimensional universe,
-  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_add_constraint(+Handle, +Constraint)
-</CODE></H2>
-
-   Updates the LP Problem referenced by <CODE>Handle</CODE>
-   so that the feasible region is represented by the original constraint
-   system together with the constraint <CODE>Constraint</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_add_constraints(+Handle, +Constraint_System)
-</CODE></H2>
-
-   Updates the LP Problem referenced by <CODE>Handle</CODE>
-   so that the feasible region is represented by the original constraint
-   system together with all the constraints in <CODE>Constraint_System</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_set_objective_function(+Handle, +Lin_Expr)
-</CODE></H2>
-
-   Updates the LP Problem referenced by <CODE>Handle</CODE>
-   so that the objective function is changed to <CODE>Lin_Expr</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
-</CODE></H2>
-
-   Updates the LP Problem referenced by <CODE>Handle</CODE>
-   so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_is_satisfiable(+Handle)
-</CODE></H2>
-
-  Succeeds if and only if the LP Problem referenced by
-  <CODE>Handle</CODE> is satisfiable.
-
-<H2><CODE>
-  ppl_LP_Problem_solve(+Handle, ?LP_Problem_Status)
-</CODE></H2>
-
-  Solves the LP problem  referenced by
-  <CODE>Handle</CODE> and unifies <CODE>LP_Problem_Status</CODE>
-  with:
-  <CODE>unfeasible</CODE>, if the LP problem is not satisfiable;
-  <CODE>unbounded</CODE>, if the LP problem is satisfiable but
-  there is no finite bound to the value of the objective function;
-  <CODE>optimized</CODE>, if the LP problem admits an optimal solution.
-
-<H2><CODE>
-  ppl_LP_Problem_feasible_point(+Handle, ?Generator)
-</CODE></H2>
-
-  Unifies  <CODE>Generator</CODE> with a feasible point for the LP problem
-  referenced by <CODE>Handle</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_optimizing_point(+Handle, ?Generator)
-</CODE></H2>
-
-  Unifies  <CODE>Generator</CODE> with an optimizing point for the LP problem
-  referenced by <CODE>Handle</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
-</CODE></H2>
-
-  Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
-  with the numerator and denominator, respectively, for the optimal value
-  for the LP problem  referenced by <CODE>Handle</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_evaluate_objective_function(+Handle, +Generator,
-                                             ?Coefficient_1, ?Coefficient_2)
-</CODE></H2>
-  Evaluates the objective function of the LP problem  referenced by
-  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
-  <CODE>Coefficient_1</CODE> is unified with the numerator and
-  <CODE>Coefficient_2</CODE> is unified with the denominator of the
-  objective function value at <CODE>Generator</CODE>.
-
-<H2><CODE>
-  ppl_LP_Problem_OK(+Handle)
-</CODE></H2>
-
-   Succeeds only if the LP Problem referenced by
-   <CODE>Handle</CODE> is well formed, i.e., if it
-   satisfies all its implementation invariants.  Useful for debugging purposes.
+   Section \extref{Mapping_the_Dimensions_of_the_Vector_Space, Mapping the Dimensions of the Vector Space}
+   of the main PPL user manual.
+
+
+\anchor generated_predicates
+<H1>PPL Domains Generated for the Prolog Interface</H1>
+Here are some example PPL domains: <BR>
+
+
+
+
+
+
+
+Polyhedron <BR>
+Grid <BR>
+Octagonal_Shape_mpz_class <BR>
+BD_Shape_double <BR>
+Float_Box <BR>
+Pointset_Powerset_C_Polyhedron <BR>
+Direct_Product_C_Polyhedron_Grid <BR>
+
+Next are lists of all the supported predicates for these domains: <BR>
+
+
+
+
+
+\anchor Polyhedron_predicates
+<H2>Polyhedron Predicates List</H2>
+<CODE>ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_new_C_Polyhedron_from_generators(+Generator, -Handle)</CODE><BR>
+<CODE>ppl_new_NNC_Polyhedron_from_generators(+Generator, -Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_Polyhedron_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Polyhedron_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_Polyhedron_get_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_Polyhedron_get_generators(+Handle, +Complexity, Generator_System?)</CODE><BR>
+<CODE>ppl_Polyhedron_get_congruences(+Handle, +Complexity, Congruence_System?)</CODE><BR>
+<CODE>ppl_Polyhedron_get_minimized_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_Polyhedron_get_minimized_generators(+Handle, +Complexity, Generator_System?)</CODE><BR>
+<CODE>ppl_Polyhedron_get_minimized_congruences(+Handle, +Complexity, Congruence_System?)</CODE><BR>
+<CODE>ppl_Polyhedron_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_contains_integer_point(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_OK(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Polyhedron_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Polyhedron_add_generator(+Handle, +Generator)</CODE><BR>
+<CODE>ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Polyhedron_add_congruence_and_minimize(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator)</CODE><BR>
+<CODE>ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Polyhedron_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Polyhedron_add_generators(+Handle, +Generator_System)</CODE><BR>
+<CODE>ppl_Polyhedron_add_constraints_and_minimize(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Polyhedron_add_congruences_and_minimize(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Polyhedron_add_generators_and_minimize(+Handle, +Generator_System)</CODE><BR>
+<CODE>ppl_Polyhedron_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Polyhedron_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Polyhedron_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Polyhedron_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Polyhedron_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Polyhedron_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Polyhedron_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Polyhedron_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_Polyhedron_constrains(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Polyhedron_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Polyhedron_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+<CODE>ppl_Polyhedron_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_Polyhedron_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Polyhedron_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Polyhedron_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+\anchor Grid_predicates
+<H2>Grid Predicates List</H2>
+<CODE>ppl_new_Grid_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Grid_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Grid_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Grid_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Grid_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Grid_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Grid_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_grid_generators(+Grid_Generator, -Handle)</CODE><BR>
+<CODE>ppl_new_Grid_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_Grid_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Grid_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Grid_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_Grid_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Grid_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_Grid_relation_with_grid_generator(+Handle, +Grid_Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Grid_get_congruences(+Handle, +Complexity, Congruence_System?)</CODE><BR>
+<CODE>ppl_Grid_get_grid_generators(+Handle, +Complexity, Grid_Generator_System?)</CODE><BR>
+<CODE>ppl_Grid_get_minimized_congruences(+Handle, +Complexity, Congruence_System?)</CODE><BR>
+<CODE>ppl_Grid_get_minimized_grid_generators(+Handle, +Complexity, Grid_Generator_System?)</CODE><BR>
+<CODE>ppl_Grid_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_Grid_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_Grid_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_Grid_contains_integer_point(+Handle)</CODE><BR>
+<CODE>ppl_Grid_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_Grid_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_Grid_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_Grid_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Grid_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Grid_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Grid_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Grid_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Grid_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Grid_contains_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_strictly_contains_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_is_disjoint_from_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_equals_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_OK(+Handle)</CODE><BR>
+<CODE>ppl_Grid_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Grid_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Grid_add_grid_generator(+Handle, +Grid_Generator)</CODE><BR>
+<CODE>ppl_Grid_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Grid_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Grid_add_grid_generators(+Handle, +Grid_Generator_System)</CODE><BR>
+<CODE>ppl_Grid_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Grid_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Grid_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Grid_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Grid_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_join_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Grid_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_image_with_congruence(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient_1, +Coefficient_2)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_preimage_with_congruence(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient_1, +Coefficient_2)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_image_lhs_rhs_with_congruence(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_generalized_affine_preimage_lhs_rhs_with_congruence(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Grid_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Grid_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Grid_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_Grid_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Grid_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Grid_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_Grid_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_Grid_constrains(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Grid_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Grid_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+<CODE>ppl_Grid_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_Grid_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Grid_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Grid_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Grid_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_congruence_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Grid_generator_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Grid_congruence_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_generator_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Grid_limited_generator_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Grid_limited_congruence_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_Grid_limited_generator_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+\anchor Octagonal_Shape_mpz_class_predicates
+<H2>Octagonal_Shape_mpz_class Predicates List</H2>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_new_Octagonal_Shape_mpz_class_from_generators(+Generator, -Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_get_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_get_minimized_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_contains_integer_point(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_contains_Octagonal_Shape_mpz_class(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_strictly_contains_Octagonal_Shape_mpz_class(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_is_disjoint_from_Octagonal_Shape_mpz_class(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_equals_Octagonal_Shape_mpz_class(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_OK(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_oct_hull_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_constrains(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_BHMZ05_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_BHMZ05_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_limited_BHMZ05_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_limited_CC76_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_limited_BHMZ05_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_limited_CC76_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_Octagonal_Shape_mpz_class_CC76_narrowing_assign(+Handle_1, +Handle_2)</CODE><BR>
+\anchor BD_Shape_double_predicates
+<H2>BD_Shape_double Predicates List</H2>
+<CODE>ppl_new_BD_Shape_double_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_new_BD_Shape_double_from_generators(+Generator, -Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_BD_Shape_double_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_BD_Shape_double_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_BD_Shape_double_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_BD_Shape_double_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_BD_Shape_double_get_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_BD_Shape_double_get_minimized_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_BD_Shape_double_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_contains_integer_point(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_BD_Shape_double_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_BD_Shape_double_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_BD_Shape_double_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_BD_Shape_double_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_BD_Shape_double_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_BD_Shape_double_contains_BD_Shape_double(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_strictly_contains_BD_Shape_double(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_is_disjoint_from_BD_Shape_double(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_equals_BD_Shape_double(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_OK(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_BD_Shape_double_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_BD_Shape_double_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_BD_Shape_double_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_BD_Shape_double_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_bds_hull_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+<CODE>ppl_BD_Shape_double_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_BD_Shape_double_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_BD_Shape_double_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_BD_Shape_double_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_BD_Shape_double_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_BD_Shape_double_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_BD_Shape_double_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_BD_Shape_double_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_BD_Shape_double_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_BD_Shape_double_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_BD_Shape_double_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_BD_Shape_double_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_BD_Shape_double_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_BD_Shape_double_constrains(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_BD_Shape_double_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_BD_Shape_double_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+<CODE>ppl_BD_Shape_double_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_BD_Shape_double_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_BD_Shape_double_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_BD_Shape_double_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_BHMZ05_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_H79_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_BHMZ05_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_limited_BHMZ05_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_limited_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_limited_CC76_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_BD_Shape_double_limited_BHMZ05_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_limited_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_limited_CC76_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+<CODE>ppl_BD_Shape_double_CC76_narrowing_assign(+Handle_1, +Handle_2)</CODE><BR>
+\anchor Float_Box_predicates
+<H2>Float_Box Predicates List</H2>
+<CODE>ppl_new_Float_Box_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_new_Float_Box_from_generators(+Generator, -Handle)</CODE><BR>
+<CODE>ppl_Float_Box_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Float_Box_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Float_Box_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_Float_Box_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Float_Box_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_Float_Box_get_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_Float_Box_get_minimized_constraints(+Handle, +Complexity, Constraint_System?)</CODE><BR>
+<CODE>ppl_Float_Box_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_contains_integer_point(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Float_Box_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Float_Box_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Float_Box_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Float_Box_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Float_Box_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Float_Box_contains_Float_Box(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_strictly_contains_Float_Box(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_is_disjoint_from_Float_Box(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_equals_Float_Box(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_OK(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Float_Box_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Float_Box_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Float_Box_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Float_Box_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Float_Box_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Float_Box_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Float_Box_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Float_Box_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Float_Box_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Float_Box_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Float_Box_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Float_Box_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Float_Box_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Float_Box_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Float_Box_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Float_Box_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Float_Box_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Float_Box_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Float_Box_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_Float_Box_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Float_Box_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Float_Box_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_Float_Box_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_Float_Box_constrains(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Float_Box_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+<CODE>ppl_Float_Box_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+<CODE>ppl_Float_Box_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_Float_Box_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Float_Box_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Float_Box_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Float_Box_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_CC76_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Float_Box_CC76_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Float_Box_limited_CC76_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Float_Box_limited_CC76_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+\anchor Pointset_Powerset_C_Polyhedron_predicates
+<H2>Pointset_Powerset_C_Polyhedron Predicates List</H2>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_Pointset_Powerset_C_Polyhedron_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_contains_integer_point(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_contains_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_strictly_contains_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_is_disjoint_from_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_equals_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_OK(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_size(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_equals_iterator(+Iterator_1, +Iterator_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_begin_iterator(+Handle, ?Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_end_iterator(+Handle, ?Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_increment(+Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement(+Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_increment(+Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement(+Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_get_disjunct(+Handle_1, -Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct(+Handle, +Iterator)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_linear_partition(+Handle_1, +Handle_2, -Handle_3, -Handle_4)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_BHZ03_H79_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_BGP99_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Pointset_Powerset_C_Polyhedron_BGP99_H79_extrapolation_assign(+Handle_1, +Handle_2)</CODE><BR>
+\anchor Direct_Product_C_Polyhedron_Grid_predicates
+<H2>Direct_Product_C_Polyhedron_Grid Predicates List</H2>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_C_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_NNC_Polyhedron(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpz_class(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_BD_Shape_double(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Float_Box(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Direct_Product_C_Polyhedron_Grid(+Handle, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_C_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_NNC_Polyhedron(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpz_class(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_BD_Shape_double(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Float_Box(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_Direct_Product_C_Polyhedron_Grid(+Handle, -Handle, +Complexity)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_constraints(+Constraint, -Handle)</CODE><BR>
+<CODE>ppl_new_Direct_Product_C_Polyhedron_Grid_from_congruences(+Congruence, -Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_swap(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_is_empty(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_is_universe(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_is_bounded(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_is_topologically_closed(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_is_discrete(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_topological_closure_assign(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_maximize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_minimize(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_contains_Direct_Product_C_Polyhedron_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_strictly_contains_Direct_Product_C_Polyhedron_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_is_disjoint_from_Direct_Product_C_Polyhedron_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_equals_Direct_Product_C_Polyhedron_Grid(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_OK(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_add_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_add_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_add_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_add_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_refine_with_constraint(+Handle, +Constraint)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_refine_with_congruence(+Handle, +Congruence)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_refine_with_constraints(+Handle, +Constraint_System)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_refine_with_congruences(+Handle, +Congruence_System)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_ascii_dump(+Handle)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<CODE>ppl_Direct_Product_C_Polyhedron_Grid_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
 
 \anchor PI_Compilation
 <H1>Compilation and Installation</H1>
@@ -1981,14 +2245,13 @@ Your configure command would then look like
   path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ...
 \endcode
 
-
 \anchor PI_SD_Features
 <H1>System-Dependent Features</H1>
 
 <H2>CIAO Prolog</H2>
 
 The Ciao Prolog interface to the PPL is available
-both as ``PPL enhanced'' Ciao Prolog interpreter
+both as `PPL enhanced' Ciao Prolog interpreter
 and as a library that can be linked to Ciao Prolog programs.
 Only Ciao Prolog versions 1.10 #5 and later are supported.
 
@@ -2029,10 +2292,10 @@ ciaoc -o myprog prefix/lib/ppl/ppl_ciao.pl ciao_pl_check.pl \
 <H2>GNU Prolog</H2>
 
 The GNU Prolog interface to the PPL is available both as a
-``PPL enhanced'' GNU Prolog interpreter and as a library that can be
+`PPL enhanced' GNU Prolog interpreter and as a library that can be
 linked to GNU Prolog programs.
 The only GNU Prolog version that is known to work is a patched
-version of the ``unstable version'' tagged
+version of the `unstable version' tagged
 <A HREF="ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz">20040608</A>
 (which unpacks to a directory called <CODE>gprolog-1.2.18</CODE>).
 The patch is contained in the
@@ -2172,4 +2435,9 @@ when the PPL library is no longer needed.
 Notice that, for dynamic linking to work, you should have configured
 the library with the <CODE>--enable-shared</CODE> option.
 
-*/ /* \defgroup PrologInterface */
+*/ /* \mainpage */
+
+
+
+
+
diff --git a/interfaces/Prolog/SICStus/Makefile.am b/interfaces/Prolog/SICStus/Makefile.am
index e5db3ea..ca83e63 100644
--- a/interfaces/Prolog/SICStus/Makefile.am
+++ b/interfaces/Prolog/SICStus/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,33 +23,64 @@
 SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
 
 EXTRA_DIST = \
+ppl_interface_generator_sicstus_sd_cc.m4 \
 $(SICSTUS_CFLI_FILES) \
-ppl_sicstus_sd.cc \
 ppl_sicstus.pl \
 sp_clpq.pl \
-sp_pl_check.pl
+sp_pl_check.pl \
+sp_predicate_check.pl
 
 if BUILD_SICSTUS_PROLOG_INTERFACE
 
+if BUILD_WATCHDOG_LIBRARY
+
+WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+
+endif BUILD_WATCHDOG_LIBRARY
+
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog/src \
+$(WATCHDOG_INCLUDE_OPTIONS) \
 $(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
 @extra_includes@
 
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_sicstus_sd_cc.m4
+
+ppl_sicstus_sd.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@
+
 bin_PROGRAMS = ppl_sicstus
 ppl_sicstus_SOURCES =
 
+
 if ENABLE_SHARED
 
 pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o
 
-ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la .libs/ppl_sicstus_sd.o
+ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY) libppl_sicstus.la
 	$(LIBTOOL) --mode=link --tag=CXX \
-	splfr $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o -o $@ \
-		$(top_builddir)/src/libppl.la \
-		$(top_builddir)/Watchdog/src/libpwl.la \
-		@extra_libraries@
+		splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+			$(srcdir)/ppl_sicstus.pl \
+			libppl_sicstus.la \
+			$(WATCHDOG_LIBRARY) \
+			@extra_libraries@
+
+#			@required_instantiations_prolog_cxx_objects@
 
 install-data-local: ppl_sicstus.so
 	$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
@@ -61,28 +92,73 @@ pkglib_DATA = ppl_sicstus.pl
 
 endif !ENABLE_SHARED
 
-noinst_LTLIBRARIES = ppl_sicstus_sd.la
-ppl_sicstus_sd_la_SOURCES = ppl_sicstus_sd.cc
-ppl_sicstus_sd_la_LDFLAGS = -module -avoid-version
+noinst_LTLIBRARIES = libppl_sicstus.la
+
+libppl_sicstus_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+sicstus_efli.hh \
+sicstus_efli.cc
 
-ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la
+nodist_libppl_sicstus_la_SOURCES = \
+ppl_sicstus_sd.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_sicstus_la_SOURCES = \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Rational_Box.cc
+
+libppl_sicstus_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+$(WATCHDOG_LIBRARY) \
+ at extra_libraries@
+
+libppl_sicstus_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_sicstus_la_LDFLAGS = \
+-module \
+-avoid-version
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY)
 	$(LIBTOOL) --mode=link --tag=CXX \
-	spld --main=prolog \
-		--cflag=`echo '$(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
-		--resources=ppl_sicstus.s.o -o $@ \
-		$(top_builddir)/src/libppl.la \
-		$(top_builddir)/Watchdog/src/libpwl.la \
-		@extra_libraries@
+		spld --main=prolog \
+			--cflag=`echo '$(AM_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+			--resources=ppl_sicstus.s.o -o $@ \
+			$(top_builddir)/src/libppl.la \
+			$(WATCHDOG_LIBRARY) \
+			@extra_libraries@
 
 if ENABLE_STATIC
 
-ppl_sicstus.s.o: ppl_sicstus.pl ppl_sicstus_sd.o
-	splfr --static $(srcdir)/ppl_sicstus.pl ppl_sicstus_sd.o
+ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+	splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \
+		$(srcdir)/ppl_sicstus.pl \
+		ppl_sicstus_sd.o \
+		sicstus_efli.o \
+		ppl_prolog_common.o \
+		`echo @required_instantiations_prolog_cxx_objects@ | sed -e "s/\.lo/.o/g"`
 
 else !ENABLE_STATIC
 
-ppl_sicstus.s.o: ppl_sicstus.pl .libs/ppl_sicstus_sd.o
-	splfr --static $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+	splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+		$(srcdir)/ppl_sicstus.pl \
+		.libs/ppl_sicstus_sd.o \
+		.libs/sicstus_efli.o \
+		.libs/ppl_prolog_common.o \
+		`echo @required_instantiations_prolog_cxx_objects@ | sed -e "s/\([^. ]*\)\.lo/.libs\/\1.o/g"`
 
 endif !ENABLE_STATIC
 
@@ -124,7 +200,8 @@ pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(
 	fi
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		 ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+		$(WATCHDOG_DLOPEN) \
+		./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
         --goal "main."  \
 			>obtained_pchk
 	if [ $(srcdir) != `pwd` ]; then \
@@ -137,7 +214,9 @@ pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(
 clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) | pl_check_test
 	LANG=C; \
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
-	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+	$(LIBTOOL) --mode=execute \
+	  -dlopen ../../../src/libppl.la \
+	  $(WATCHDOG_DLOPEN) \
 	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
 	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
 	      <$(srcdir)/../tests/script_clpq >obtained_clpq
@@ -148,15 +227,35 @@ clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/scrip
 clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) | clpq_test
 	LANG=C; \
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
-	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+	$(LIBTOOL) --mode=execute \
+          -dlopen ../../../src/libppl.la \
+	  $(WATCHDOG_DLOPEN) \
 	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
 	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
 	      <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
+predicate_check_test: ppl_sicstus ppl_sicstus.pl sp_predicate_check.pl ../tests/ppl_predicate_check_main.pl $(EXPECTED_PCHK)
+	if [ $(srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl . ; \
+	fi
+	cp -f ../tests/ppl_predicate_check_main.pl . ; \
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		$(WATCHDOG_DLOPEN) \
+		./ppl_sicstus -l $(srcdir)/sp_predicate_check.pl \
+        --goal "main."  \
+			>obtained_pchk
+	rm -f ppl_predicate_check_main.pl; \
+	rm -f ppl_predicate_check_common.pl; \
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+endif BUILD_SICSTUS_PROLOG_INTERFACE
+
+DISTCLEANFILES = \
+ppl_sicstus_sd.cc
+
 MOSTLYCLEANFILES = \
 ppl_sicstus.s.o ppl_sicstus.so \
 $(CLPQ_TESTS) \
 obtained_clpq obtained_clpq2 obtained_pchk
-
-endif BUILD_SICSTUS_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/SICStus/Makefile.in b/interfaces/Prolog/SICStus/Makefile.in
index 5f0bc02..e656873 100644
--- a/interfaces/Prolog/SICStus/Makefile.in
+++ b/interfaces/Prolog/SICStus/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,15 +38,11 @@
 
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -65,7 +61,8 @@ host_triplet = @host@
 subdir = interfaces/Prolog/SICStus
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -75,8 +72,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -84,39 +91,51 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
-ppl_sicstus_sd_la_LIBADD =
-am__ppl_sicstus_sd_la_SOURCES_DIST = ppl_sicstus_sd.cc
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_ppl_sicstus_sd_la_OBJECTS =  \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	ppl_sicstus_sd.lo
-ppl_sicstus_sd_la_OBJECTS = $(am_ppl_sicstus_sd_la_OBJECTS)
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_ppl_sicstus_sd_la_rpath =
+am__libppl_sicstus_la_SOURCES_DIST = ppl_prolog_sysdep.hh \
+	sicstus_efli.hh sicstus_efli.cc
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_libppl_sicstus_la_OBJECTS =  \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	sicstus_efli.lo
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@nodist_libppl_sicstus_la_OBJECTS =  \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	ppl_sicstus_sd.lo \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	ppl_prolog_common.lo
+libppl_sicstus_la_OBJECTS = $(am_libppl_sicstus_la_OBJECTS) \
+	$(nodist_libppl_sicstus_la_OBJECTS)
+libppl_sicstus_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_sicstus_la_LDFLAGS) $(LDFLAGS) -o $@
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_libppl_sicstus_la_rpath =
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
 am_ppl_sicstus_OBJECTS =
 ppl_sicstus_OBJECTS = $(am_ppl_sicstus_OBJECTS)
 ppl_sicstus_LDADD = $(LDADD)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(ppl_sicstus_sd_la_SOURCES) $(ppl_sicstus_SOURCES)
-DIST_SOURCES = $(am__ppl_sicstus_sd_la_SOURCES_DIST) \
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libppl_sicstus_la_SOURCES) \
+	$(nodist_libppl_sicstus_la_SOURCES) \
+	$(nodist_EXTRA_libppl_sicstus_la_SOURCES) \
+	$(ppl_sicstus_SOURCES)
+DIST_SOURCES = $(am__libppl_sicstus_la_SOURCES_DIST) \
 	$(ppl_sicstus_SOURCES)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -130,39 +149,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -172,53 +170,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -227,56 +223,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -288,10 +258,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -300,45 +274,116 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
 EXTRA_DIST = \
+ppl_interface_generator_sicstus_sd_cc.m4 \
 $(SICSTUS_CFLI_FILES) \
-ppl_sicstus_sd.cc \
 ppl_sicstus.pl \
 sp_clpq.pl \
-sp_pl_check.pl
+sp_pl_check.pl \
+sp_predicate_check.pl
 
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at AM_CPPFLAGS = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_buildir)/interfaces/Prolog \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at -I$(top_builddir)/src \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@extra_includes@
 
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_interface_generator_sicstus_sd_cc.m4
+
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at ppl_sicstus_SOURCES = 
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_FALSE at pkglib_DATA = ppl_sicstus.pl
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@noinst_LTLIBRARIES = ppl_sicstus_sd.la
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd_la_SOURCES = ppl_sicstus_sd.cc
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd_la_LDFLAGS = -module -avoid-version
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@noinst_LTLIBRARIES = libppl_sicstus.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@libppl_sicstus_la_SOURCES = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_prolog_sysdep.hh \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@sicstus_efli.hh \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@sicstus_efli.cc
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@nodist_libppl_sicstus_la_SOURCES = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_common.cc
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@nodist_EXTRA_libppl_sicstus_la_SOURCES = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Double_Box.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Grid.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Polyhedron.cc \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@../ppl_prolog_Rational_Box.cc
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@libppl_sicstus_la_LIBADD = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(WATCHDOG_LIBRARY) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@libppl_sicstus_la_DEPENDENCIES = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@libppl_sicstus_la_LDFLAGS = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-module \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-avoid-version
+
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at CLPQ_TESTS_NONSTRICT = \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at ack.clpq \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at ackn.clpq \
@@ -359,10 +404,13 @@ sp_pl_check.pl
 @ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
 @ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus.s.o ppl_sicstus.so \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk
+DISTCLEANFILES = \
+ppl_sicstus_sd.cc
+
+MOSTLYCLEANFILES = \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk
 
 all: all-am
 
@@ -406,19 +454,19 @@ clean-noinstLTLIBRARIES:
 	  echo "rm -f \"$${dir}/so_locations\""; \
 	  rm -f "$${dir}/so_locations"; \
 	done
-ppl_sicstus_sd.la: $(ppl_sicstus_sd_la_OBJECTS) $(ppl_sicstus_sd_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_ppl_sicstus_sd_la_rpath) $(ppl_sicstus_sd_la_LDFLAGS) $(ppl_sicstus_sd_la_OBJECTS) $(ppl_sicstus_sd_la_LIBADD) $(LIBS)
+libppl_sicstus.la: $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_DEPENDENCIES) 
+	$(libppl_sicstus_la_LINK) $(am_libppl_sicstus_la_rpath) $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_LIBADD) $(LIBS)
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
 	@list='$(bin_PROGRAMS)'; for p in $$list; do \
 	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
 	  if test -f $$p \
 	     || test -f $$p1 \
 	  ; then \
 	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
 	  else :; fi; \
 	done
 
@@ -438,7 +486,7 @@ clean-binPROGRAMS:
 	done
 @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE at ppl_sicstus$(EXEEXT): $(ppl_sicstus_OBJECTS) $(ppl_sicstus_DEPENDENCIES) 
 @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@	@rm -f ppl_sicstus$(EXEEXT)
- at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@	$(LINK) $(ppl_sicstus_LDFLAGS) $(ppl_sicstus_OBJECTS) $(ppl_sicstus_LDADD) $(LIBS)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@	$(LINK) $(ppl_sicstus_OBJECTS) $(ppl_sicstus_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -446,41 +494,150 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_sicstus_sd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sicstus_efli.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
 
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constrai [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-pkglibDATA: $(pkglib_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -501,8 +658,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -514,8 +671,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -525,13 +682,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -545,22 +701,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -578,7 +733,7 @@ check: check-am
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
 installdirs:
 	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -601,6 +756,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -616,7 +772,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -630,12 +786,20 @@ info-am:
 
 install-data-am: install-data-local
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-binPROGRAMS install-pkglibDATA
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -656,8 +820,9 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
-	uninstall-pkglibDATA
+uninstall-am: uninstall-binPROGRAMS uninstall-pkglibDATA
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
 	clean-binPROGRAMS clean-generic clean-libtool \
@@ -665,40 +830,59 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 	distclean-generic distclean-libtool distclean-tags distdir dvi \
 	dvi-am html html-am info info-am install install-am \
 	install-binPROGRAMS install-data install-data-am \
-	install-data-local install-exec install-exec-am install-info \
-	install-info-am install-man install-pkglibDATA install-strip \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibDATA install-ps install-ps-am install-strip \
 	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-info-am uninstall-pkglibDATA
+	uninstall-pkglibDATA
 
 
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la .libs/ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd.cc: $(interface_generator_dependencies)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY) libppl_sicstus.la
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=link --tag=CXX \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	splfr $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o -o $@ \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(top_builddir)/src/libppl.la \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(top_builddir)/Watchdog/src/libpwl.la \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		@extra_libraries@
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			$(srcdir)/ppl_sicstus.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			libppl_sicstus.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			$(WATCHDOG_LIBRARY) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			@extra_libraries@
+
+#			@required_instantiations_prolog_cxx_objects@
 
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at install-data-local: ppl_sicstus.so
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$< $(DESTDIR)$(pkglibdir)/$<
 
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY)
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=link --tag=CXX \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	spld --main=prolog \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		--cflag=`echo '$(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		--resources=ppl_sicstus.s.o -o $@ \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		$(top_builddir)/src/libppl.la \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		$(top_builddir)/Watchdog/src/libpwl.la \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		@extra_libraries@
-
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE at ppl_sicstus.s.o: ppl_sicstus.pl ppl_sicstus_sd.o
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@	splfr --static $(srcdir)/ppl_sicstus.pl ppl_sicstus_sd.o
-
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE at ppl_sicstus.s.o: ppl_sicstus.pl .libs/ppl_sicstus_sd.o
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@	splfr --static $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		spld --main=prolog \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			--cflag=`echo '$(AM_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			--resources=ppl_sicstus.s.o -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			$(top_builddir)/src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			$(WATCHDOG_LIBRARY) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			@extra_libraries@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE at ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@	splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@		$(srcdir)/ppl_sicstus.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@		ppl_sicstus_sd.o \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@		sicstus_efli.o \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@		ppl_prolog_common.o \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@		`echo @required_instantiations_prolog_cxx_objects@ | sed -e "s/\.lo/.o/g"`
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE at ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@	splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@		$(srcdir)/ppl_sicstus.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@		.libs/ppl_sicstus_sd.o \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@		.libs/sicstus_efli.o \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@		.libs/ppl_prolog_common.o \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@		`echo @required_instantiations_prolog_cxx_objects@ | sed -e "s/\([^. ]*\)\.lo/.libs\/\1.o/g"`
 
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at check-local: pl_check_test clpq_test clpq2_test
 
@@ -708,7 +892,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	fi
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		 ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@        --goal "main."  \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			>obtained_pchk
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
@@ -721,7 +906,9 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) | pl_check_test
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	LANG=C; \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  $(WATCHDOG_DLOPEN) \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	      <$(srcdir)/../tests/script_clpq >obtained_clpq
@@ -732,11 +919,28 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) | clpq_test
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	LANG=C; \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
- at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@          -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  $(WATCHDOG_DLOPEN) \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	      <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@predicate_check_test: ppl_sicstus ppl_sicstus.pl sp_predicate_check.pl ../tests/ppl_predicate_check_main.pl $(EXPECTED_PCHK)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl . ; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	cp -f ../tests/ppl_predicate_check_main.pl . ; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		./ppl_sicstus -l $(srcdir)/sp_predicate_check.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@        --goal "main."  \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			>obtained_pchk
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	rm -f ppl_predicate_check_main.pl; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	rm -f ppl_predicate_check_common.pl; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
new file mode 100644
index 0000000..aa3703b
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
@@ -0,0 +1,192 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_sicstus_sd.cc.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include common macros for generating system dependent code.
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+
+m4_divert`'dnl
+/* SICStus Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define SP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref /* goal */, void*) { \
+  return name(); \
+}
+
+#define SP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  return name(arg1); \
+}
+
+#define SP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2); \
+}
+
+#define SP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3); \
+}
+
+#define SP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4); \
+}
+
+#define SP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define SP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(6, goal, arg6)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+m4_divert(1)
+#define SP_DEFINE_C_PREDICATE(name, arity) \
+  SP_define_c_predicate(#name, arity, "user", sp_stub_##name, NULL)
+
+extern "C" void
+ppl_sicstus_init(int /* when */) {
+  ppl_initialize();
+  for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i) {
+    if (SP_register_atom(*prolog_interface_atoms[i].p_atom) == 0) {
+      Prolog_term_ref et = Prolog_new_term_ref();
+      Prolog_put_atom_chars(et, "Cannot initialize the PPL interface");
+      Prolog_raise_exception(et);
+      return;
+    }
+  }
+m4_divert(2)dnl
+}
+
+extern "C" void
+ppl_sicstus_deinit(int /* when */) {
+  for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i)
+    // SP_unregister_atom can fail.
+    // We ignore such failures: what else can we do?
+    (void) SP_unregister_atom(*prolog_interface_atoms[i].p_atom);
+  ppl_finalize();
+}
+dnl
+m4_divert`'dnl
+dnl
+dnl Redefine m4_extension to generate SICStus stubs.
+dnl m4_extension(Predicate_Name, Arity)
+m4_define(`m4_extension', `dnl
+SP_STUB_$2($1)
+')dnl
+dnl Generate stubs.
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)`'dnl
+m4_divert(-1)
+
+dnl Redefine m4_extension to generate SICStus user predicates.
+dnl m4_extension(Predicate_Name, Arity)
+m4_define(`m4_extension', `dnl
+  SP_DEFINE_C_PREDICATE($1, $2);
+')
+
+dnl Generate user predicates.
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..683053d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
@@ -0,0 +1,23 @@
+/* System-dependent part of the Prolog interfaces: stub for SICStus Prolog.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "sicstus_efli.hh"
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus.pl b/interfaces/Prolog/SICStus/ppl_sicstus.pl
index 7f9904d..1ed0c47 100644
--- a/interfaces/Prolog/SICStus/ppl_sicstus.pl
+++ b/interfaces/Prolog/SICStus/ppl_sicstus.pl
@@ -1,11 +1,11 @@
 /* Loader for the SICStus Prolog interface.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc b/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc
deleted file mode 100644
index 4ff3ab7..0000000
--- a/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc
+++ /dev/null
@@ -1,474 +0,0 @@
-/* SICStus Prolog interface: system-dependent part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "pwl.hh"
-#include "sicstus_cfli.h"
-#include "../exceptions.hh"
-#include <cassert>
-#include <sstream>
-
-namespace PPL = Parma_Polyhedra_Library;
-
-namespace {
-
-/*!
-  True if and only if the Prolog engine supports unbounded integers.
-*/
-bool Prolog_has_unbounded_integers;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the minimum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_min_integer;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the maximum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_max_integer;
-
-/*!
-  Performs system-dependent initialization.
-*/
-void
-ppl_Prolog_sysdep_init() {
-  Prolog_has_unbounded_integers = true;
-  Prolog_min_integer = 0;
-  Prolog_max_integer = 0;
-}
-
-/*!
-  Perform system-dependent de-itialization.
-*/
-void
-ppl_Prolog_sysdep_deinit() {
-}
-
-PPL::Coefficient
-integer_term_to_Coefficient(Prolog_term_ref t) {
-  assert(SP_is_integer(t));
-  long v;
-  if (SP_get_integer(t, &v) != 0)
-    return PPL::Coefficient(v);
-  else {
-    char* s;
-    if (SP_get_number_chars(t, &s) != 0)
-      return PPL::Coefficient(s);
-    else
-      throw unknown_interface_error("integer_term_to_Coefficient");
-  }
-}
-
-Prolog_term_ref
-Coefficient_to_integer_term(const PPL::Coefficient& n) {
-  Prolog_term_ref t = Prolog_new_term_ref();
-  long l = 0;
-  if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ) {
-    if (SP_put_integer(t, l) == 0)
-      throw unknown_interface_error("Coefficient_to_integer_term()");
-  } else {
-    std::ostringstream s;
-    s << n;
-    if (SP_put_number_chars(t, s.str().c_str()) == 0)
-      throw unknown_interface_error("Coefficient_to_integer_term()");
-  }
-  return t;
-}
-
-} // namespace
-
-#include "../ppl_prolog.icc"
-
-#define SP_STUB_0(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref /* goal */, void*) { \
-  return name(); \
-}
-
-#define SP_STUB_1(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref goal, void*) { \
-  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(1, goal, arg1)) \
-    return PROLOG_FAILURE; \
-  return name(arg1); \
-}
-
-#define SP_STUB_2(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref goal, void*) { \
-  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(1, goal, arg1)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(2, goal, arg2)) \
-    return PROLOG_FAILURE; \
-  return name(arg1, arg2); \
-}
-
-#define SP_STUB_3(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref goal, void*) { \
-  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(1, goal, arg1)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(2, goal, arg2)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(3, goal, arg3)) \
-    return PROLOG_FAILURE; \
-  return name(arg1, arg2, arg3); \
-}
-
-#define SP_STUB_4(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref goal, void*) { \
-  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(1, goal, arg1)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(2, goal, arg2)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(3, goal, arg3)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(4, goal, arg4)) \
-    return PROLOG_FAILURE; \
-  return name(arg1, arg2, arg3, arg4); \
-}
-
-#define SP_STUB_5(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref goal, void*) { \
-  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(1, goal, arg1)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(2, goal, arg2)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(3, goal, arg3)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(4, goal, arg4)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(5, goal, arg5)) \
-    return PROLOG_FAILURE; \
-  return name(arg1, arg2, arg3, arg4, arg5); \
-}
-
-#define SP_STUB_6(name) \
-extern "C" Prolog_foreign_return_type \
-sp_stub_##name(Prolog_term_ref goal, void*) { \
-  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(1, goal, arg1)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(2, goal, arg2)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(3, goal, arg3)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(4, goal, arg4)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(5, goal, arg5)) \
-    return PROLOG_FAILURE; \
-  Prolog_term_ref arg6 = Prolog_new_term_ref(); \
-  if (!Prolog_get_arg(6, goal, arg6)) \
-    return PROLOG_FAILURE; \
-  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
-}
-
-SP_STUB_1(ppl_version_major)
-SP_STUB_1(ppl_version_minor)
-SP_STUB_1(ppl_version_revision)
-SP_STUB_1(ppl_version_beta)
-SP_STUB_1(ppl_version)
-SP_STUB_1(ppl_banner)
-SP_STUB_1(ppl_max_space_dimension)
-SP_STUB_0(ppl_Coefficient_is_bounded)
-SP_STUB_1(ppl_Coefficient_max)
-SP_STUB_1(ppl_Coefficient_min)
-SP_STUB_0(ppl_initialize)
-SP_STUB_0(ppl_finalize)
-SP_STUB_1(ppl_set_timeout_exception_atom)
-SP_STUB_1(ppl_timeout_exception_atom)
-SP_STUB_1(ppl_set_timeout)
-SP_STUB_0(ppl_reset_timeout)
-SP_STUB_3(ppl_new_C_Polyhedron_from_space_dimension)
-SP_STUB_3(ppl_new_NNC_Polyhedron_from_space_dimension)
-SP_STUB_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
-SP_STUB_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
-SP_STUB_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
-SP_STUB_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
-SP_STUB_2(ppl_new_C_Polyhedron_from_constraints)
-SP_STUB_2(ppl_new_NNC_Polyhedron_from_constraints)
-SP_STUB_2(ppl_new_C_Polyhedron_from_generators)
-SP_STUB_2(ppl_new_NNC_Polyhedron_from_generators)
-SP_STUB_2(ppl_new_C_Polyhedron_from_bounding_box)
-SP_STUB_2(ppl_new_NNC_Polyhedron_from_bounding_box)
-SP_STUB_2(ppl_Polyhedron_swap)
-SP_STUB_1(ppl_delete_Polyhedron)
-SP_STUB_2(ppl_Polyhedron_space_dimension)
-SP_STUB_2(ppl_Polyhedron_affine_dimension)
-SP_STUB_2(ppl_Polyhedron_get_constraints)
-SP_STUB_2(ppl_Polyhedron_get_minimized_constraints)
-SP_STUB_2(ppl_Polyhedron_get_generators)
-SP_STUB_2(ppl_Polyhedron_get_minimized_generators)
-SP_STUB_3(ppl_Polyhedron_relation_with_constraint)
-SP_STUB_3(ppl_Polyhedron_relation_with_generator)
-SP_STUB_3(ppl_Polyhedron_get_bounding_box)
-SP_STUB_1(ppl_Polyhedron_is_empty)
-SP_STUB_1(ppl_Polyhedron_is_universe)
-SP_STUB_1(ppl_Polyhedron_is_bounded)
-SP_STUB_2(ppl_Polyhedron_bounds_from_above)
-SP_STUB_2(ppl_Polyhedron_bounds_from_below)
-SP_STUB_5(ppl_Polyhedron_maximize)
-SP_STUB_6(ppl_Polyhedron_maximize_with_point)
-SP_STUB_5(ppl_Polyhedron_minimize)
-SP_STUB_6(ppl_Polyhedron_minimize_with_point)
-SP_STUB_1(ppl_Polyhedron_is_topologically_closed)
-SP_STUB_2(ppl_Polyhedron_contains_Polyhedron)
-SP_STUB_2(ppl_Polyhedron_strictly_contains_Polyhedron)
-SP_STUB_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
-SP_STUB_2(ppl_Polyhedron_equals_Polyhedron)
-SP_STUB_1(ppl_Polyhedron_OK)
-SP_STUB_2(ppl_Polyhedron_add_constraint)
-SP_STUB_2(ppl_Polyhedron_add_constraint_and_minimize)
-SP_STUB_2(ppl_Polyhedron_add_generator)
-SP_STUB_2(ppl_Polyhedron_add_generator_and_minimize)
-SP_STUB_2(ppl_Polyhedron_add_constraints)
-SP_STUB_2(ppl_Polyhedron_add_constraints_and_minimize)
-SP_STUB_2(ppl_Polyhedron_add_generators)
-SP_STUB_2(ppl_Polyhedron_add_generators_and_minimize)
-SP_STUB_2(ppl_Polyhedron_intersection_assign)
-SP_STUB_2(ppl_Polyhedron_intersection_assign_and_minimize)
-SP_STUB_2(ppl_Polyhedron_poly_hull_assign)
-SP_STUB_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
-SP_STUB_2(ppl_Polyhedron_poly_difference_assign)
-SP_STUB_4(ppl_Polyhedron_affine_image)
-SP_STUB_4(ppl_Polyhedron_affine_preimage)
-SP_STUB_5(ppl_Polyhedron_bounded_affine_image)
-SP_STUB_5(ppl_Polyhedron_bounded_affine_preimage)
-SP_STUB_5(ppl_Polyhedron_generalized_affine_image)
-SP_STUB_5(ppl_Polyhedron_generalized_affine_preimage)
-SP_STUB_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
-SP_STUB_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
-SP_STUB_2(ppl_Polyhedron_time_elapse_assign)
-SP_STUB_1(ppl_Polyhedron_topological_closure_assign)
-SP_STUB_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
-SP_STUB_2(ppl_Polyhedron_BHRZ03_widening_assign)
-SP_STUB_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
-SP_STUB_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
-SP_STUB_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
-SP_STUB_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
-SP_STUB_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
-SP_STUB_2(ppl_Polyhedron_H79_widening_assign)
-SP_STUB_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
-SP_STUB_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
-SP_STUB_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
-SP_STUB_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
-SP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_project)
-SP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_embed)
-SP_STUB_2(ppl_Polyhedron_concatenate_assign)
-SP_STUB_2(ppl_Polyhedron_remove_space_dimensions)
-SP_STUB_2(ppl_Polyhedron_remove_higher_space_dimensions)
-SP_STUB_3(ppl_Polyhedron_expand_space_dimension)
-SP_STUB_3(ppl_Polyhedron_fold_space_dimensions)
-SP_STUB_2(ppl_Polyhedron_map_space_dimensions)
-SP_STUB_1(ppl_new_LP_Problem_trivial)
-SP_STUB_4(ppl_new_LP_Problem)
-SP_STUB_2(ppl_new_LP_Problem_from_LP_Problem)
-SP_STUB_2(ppl_LP_Problem_swap)
-SP_STUB_1(ppl_delete_LP_Problem)
-SP_STUB_2(ppl_LP_Problem_space_dimension)
-SP_STUB_2(ppl_LP_Problem_constraints)
-SP_STUB_2(ppl_LP_Problem_objective_function)
-SP_STUB_2(ppl_LP_Problem_optimization_mode)
-SP_STUB_1(ppl_LP_Problem_clear)
-SP_STUB_2(ppl_LP_Problem_add_constraint)
-SP_STUB_2(ppl_LP_Problem_add_constraints)
-SP_STUB_2(ppl_LP_Problem_set_objective_function)
-SP_STUB_2(ppl_LP_Problem_set_optimization_mode)
-SP_STUB_1(ppl_LP_Problem_is_satisfiable)
-SP_STUB_2(ppl_LP_Problem_solve)
-SP_STUB_2(ppl_LP_Problem_feasible_point)
-SP_STUB_2(ppl_LP_Problem_optimizing_point)
-SP_STUB_3(ppl_LP_Problem_optimal_value)
-SP_STUB_4(ppl_LP_Problem_evaluate_objective_function)
-SP_STUB_1(ppl_LP_Problem_OK)
-
-#define SP_DEFINE_C_PREDICATE(name, arity) \
-  SP_define_c_predicate(#name, arity, "user", sp_stub_##name, NULL)
-
-extern "C" void
-ppl_sicstus_init(int /* when */) {
-  ppl_initialize();
-  for (size_t i = 0; i < sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); ++i) {
-    if (SP_register_atom(*prolog_atoms[i].p_atom) == 0) {
-      Prolog_term_ref et = Prolog_new_term_ref();
-      Prolog_put_atom_chars(et, "Cannot initialize the PPL interface");
-      Prolog_raise_exception(et);
-      return;
-    }
-  }
-  SP_DEFINE_C_PREDICATE(ppl_version_major, 1);
-  SP_DEFINE_C_PREDICATE(ppl_version_minor, 1);
-  SP_DEFINE_C_PREDICATE(ppl_version_revision, 1);
-  SP_DEFINE_C_PREDICATE(ppl_version_beta, 1);
-  SP_DEFINE_C_PREDICATE(ppl_version, 1);
-  SP_DEFINE_C_PREDICATE(ppl_banner, 1);
-  SP_DEFINE_C_PREDICATE(ppl_max_space_dimension, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Coefficient_is_bounded, 0);
-  SP_DEFINE_C_PREDICATE(ppl_Coefficient_max, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Coefficient_min, 1);
-  SP_DEFINE_C_PREDICATE(ppl_initialize, 0);
-  SP_DEFINE_C_PREDICATE(ppl_finalize, 0);
-  SP_DEFINE_C_PREDICATE(ppl_set_timeout_exception_atom, 1);
-  SP_DEFINE_C_PREDICATE(ppl_timeout_exception_atom, 1);
-  SP_DEFINE_C_PREDICATE(ppl_set_timeout, 1);
-  SP_DEFINE_C_PREDICATE(ppl_reset_timeout, 0);
-  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_space_dimension, 3);
-  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_space_dimension, 3);
-  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_C_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_generators, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_generators, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_bounding_box, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_bounding_box, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_swap, 2);
-  SP_DEFINE_C_PREDICATE(ppl_delete_Polyhedron, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_space_dimension, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_dimension, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_minimized_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_generators, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_minimized_generators, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_relation_with_constraint, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_relation_with_generator, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_bounding_box, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_empty, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_universe, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_bounded, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounds_from_above, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounds_from_below, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_maximize, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_maximize_with_point, 6);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_minimize, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_minimize_with_point, 6);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_topologically_closed, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_contains_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_strictly_contains_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_equals_Polyhedron, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_OK, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraint, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraint_and_minimize, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generator, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generator_and_minimize, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraints_and_minimize, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generators, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generators_and_minimize, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_intersection_assign, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_intersection_assign_and_minimize, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_hull_assign, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_hull_assign_and_minimize, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_difference_assign, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_image, 4);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_preimage, 4);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_affine_image, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_affine_preimage, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_image, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_time_elapse_assign, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_topological_closure_assign, 1);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign, 2);
-  SP_DEFINE_C_PREDICATE(
-           ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3);
-  SP_DEFINE_C_PREDICATE(
-           ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_H79_widening_assign_with_tokens, 4);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_H79_widening_assign, 2);
-  SP_DEFINE_C_PREDICATE(
-           ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_limited_H79_extrapolation_assign, 3);
-  SP_DEFINE_C_PREDICATE(
-           ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_project, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_embed, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_concatenate_assign, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_remove_space_dimensions, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_remove_higher_space_dimensions, 2);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_expand_space_dimension, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_fold_space_dimensions, 3);
-  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_map_space_dimensions, 2);
-  SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem_trivial, 1);
-  SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem, 4);
-  SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem_from_LP_Problem, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_swap, 2);
-  SP_DEFINE_C_PREDICATE(ppl_delete_LP_Problem, 1);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_space_dimension, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_objective_function, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimization_mode, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_clear, 1);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_add_constraint, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_add_constraints, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_set_objective_function, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_set_optimization_mode, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_is_satisfiable, 1);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_solve, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_feasible_point, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimizing_point, 2);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimal_value, 3);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_evaluate_objective_function, 4);
-  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_OK, 1);
-}
-
-extern "C" void
-ppl_sicstus_deinit(int /* when */) {
-  for (size_t i = 0; i < sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); ++i)
-    // SP_unregister_atom can fail.
-    // We ignore such failures: what else can we do?
-    (void) SP_unregister_atom(*prolog_atoms[i].p_atom);
-  ppl_finalize();
-}
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.cc b/interfaces/Prolog/SICStus/sicstus_cfli.cc
index 7797624..5855b30 100644
--- a/interfaces/Prolog/SICStus/sicstus_cfli.cc
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.cc
@@ -1,11 +1,11 @@
 /* SICStus Prolog Common Foreign Language Interface: implementation.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.h b/interfaces/Prolog/SICStus/sicstus_cfli.h
index f1d209d..2dad342 100644
--- a/interfaces/Prolog/SICStus/sicstus_cfli.h
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.h
@@ -1,11 +1,11 @@
 /* SICStus Prolog Common Foreign Language Interface: declarations.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,20 +26,20 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <sicstus/sicstus.h>
 
 #ifdef __GNUC__
-# define PCFLI_EXTERN_INLINE  extern __inline__
-# define PCFLI_INLINE_PROTOTYPES  1
+# define PCFLI_EXTERN_INLINE extern __inline__
+# define PCFLI_INLINE_PROTOTYPES 1
 #endif
 
-#if defined (__cplusplus) && ! defined (PCFLI_EXTERN_INLINE)
-# define PCFLI_EXTERN_INLINE  inline
+#if defined(__cplusplus) && !defined(PCFLI_EXTERN_INLINE)
+# define PCFLI_EXTERN_INLINE inline
 #endif
 
 #ifdef PCFLI_EXTERN_INLINE
 # ifndef PCFLI_INLINE_PROTOTYPES
-#  define PCFLI_INLINE_PROTOTYPES  0
+#  define PCFLI_INLINE_PROTOTYPES 0
 # endif
 #else
-# define PCFLI_INLINE_PROTOTYPES  1
+# define PCFLI_INLINE_PROTOTYPES 1
 #endif
 
 /* Temporary. */
@@ -52,10 +52,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 typedef SP_term_ref Prolog_term_ref;
 typedef SP_atom Prolog_atom;
 typedef int Prolog_foreign_return_type;
+
 static const Prolog_foreign_return_type PROLOG_SUCCESS = SP_SUCCESS;
 static const Prolog_foreign_return_type PROLOG_FAILURE = SP_FAILURE;
 
-
 #if PCFLI_INLINE_PROTOTYPES
 
 PCFLI_DECLSPEC Prolog_term_ref
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.ic b/interfaces/Prolog/SICStus/sicstus_cfli.ic
index fe735b5..cbd9fd8 100644
--- a/interfaces/Prolog/SICStus/sicstus_cfli.ic
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.ic
@@ -1,11 +1,11 @@
 /* SICStus Common Foreign Language Interface: definitions. -*- C -*-
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -52,11 +52,11 @@ static int
 Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
   static unsigned char uc_buffer[sizeof(unsigned long) + 1];
   static unsigned n;
-#if SIZEOF_LONG_LONG > SIZEOF_UNSIGNED_LONG
+#if PPL_SIZEOF_LONG_LONG > PPL_SIZEOF_LONG
   static long long ll_buffer;
 #endif
 
-#if SIZEOF_LONG_LONG > SIZEOF_UNSIGNED_LONG
+#if PPL_SIZEOF_LONG_LONG > PPL_SIZEOF_LONG
   ll_buffer = ul;
   if (SP_put_integer_bytes(t, &ll_buffer, sizeof(ll_buffer), 1))
     return 1;
@@ -110,7 +110,7 @@ Prolog_put_address(Prolog_term_ref t, void* p) {
 /*!
   Return an atom whose name is given by the null-terminated string \p s.
 */
-Prolog_atom
+PCFLI_EXTERN_INLINE Prolog_atom
 Prolog_atom_from_string(const char* s) {
   return SP_atom_from_string(s);
 }
@@ -215,7 +215,7 @@ Prolog_is_compound(Prolog_term_ref t) {
 }
 
 /*!
-  Return true if \p t is a Prolog list, false otherwise.
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
 */
 PCFLI_EXTERN_INLINE int
 Prolog_is_cons(Prolog_term_ref t) {
diff --git a/interfaces/Prolog/SICStus/sicstus_efli.cc b/interfaces/Prolog/SICStus/sicstus_efli.cc
new file mode 100644
index 0000000..75d3098
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_efli.cc
@@ -0,0 +1,97 @@
+/* SICStus Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "sicstus_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(SP_is_integer(t));
+  long v;
+  if (SP_get_integer(t, &v) == SP_SUCCESS)
+    n = v;
+  else {
+#if SICSTUS_MAJOR_VERSION == 3
+    char* s;
+    if (SP_get_number_chars(t, &s) == SP_SUCCESS)
+      n = Coefficient(s);
+    else
+      return SP_FAILURE;
+#else
+    const char* s;
+    if (SP_get_number_codes(t, &s) == SP_SUCCESS)
+      n = Coefficient(s);
+    else
+      return SP_FAILURE;
+#endif
+  }
+  return SP_SUCCESS;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  long l = 0;
+  if (assign_r(l, n, ROUND_NOT_NEEDED) == V_EQ)
+    return SP_put_integer(t, l);
+  else {
+    std::ostringstream s;
+    s << n;
+#if SICSTUS_MAJOR_VERSION == 3
+    return SP_put_number_chars(t, s.str().c_str());
+#else
+    return SP_put_number_codes(t, s.str().c_str());
+#endif
+  }
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  if (Prolog_put_Coefficient(u, n) == SP_SUCCESS)
+    return SP_unify(t, u);
+  else
+    return SP_FAILURE;
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/SICStus/sicstus_efli.hh b/interfaces/Prolog/SICStus/sicstus_efli.hh
new file mode 100644
index 0000000..d2832ba
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_efli.hh
@@ -0,0 +1,83 @@
+/* SICStus Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_sicstus_efli_hh
+#define PPL_sicstus_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "sicstus_cfli.h"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_sicstus_efli_hh)
diff --git a/interfaces/Prolog/SICStus/sp_clpq.pl b/interfaces/Prolog/SICStus/sp_clpq.pl
index 113c3d5..865ced1 100644
--- a/interfaces/Prolog/SICStus/sp_clpq.pl
+++ b/interfaces/Prolog/SICStus/sp_clpq.pl
@@ -1,11 +1,11 @@
 /* Main program for the toy PPL/SICStus-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,16 +20,24 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-:- set_prolog_flag(language, iso).
-
 :- ensure_loaded('ppl_sicstus.pl').
-:- use_module(library(lists), [append/3, member/2]).
+
+version_dependent_declarations :-
+	prolog_flag(version, V),
+	atom_codes(V, VList),
+	VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+	(N is "4" ->
+	    true
+	;
+	    set_prolog_flag(language, iso),
+	    use_module(library(lists), [append/3, member/2])
+	).
 
 eat_eol :-
 	get_code(user_input, _EOL).
 
 main(CLPQ) :-
-    ensure_loaded(CLPQ),
-    set_prolog_flag(language, iso),	% FIXME: this is not ISO Prolog
-    nofileerrors,			% FIXME: this is not ISO Prolog
-    common_main.
+	version_dependent_declarations,
+	ensure_loaded(CLPQ),
+	set_prolog_flag(fileerrors, off),
+	common_main.
diff --git a/interfaces/Prolog/SICStus/sp_pl_check.pl b/interfaces/Prolog/SICStus/sp_pl_check.pl
index 14e8dfe..98d8134 100644
--- a/interfaces/Prolog/SICStus/sp_pl_check.pl
+++ b/interfaces/Prolog/SICStus/sp_pl_check.pl
@@ -1,11 +1,11 @@
 /* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,21 +20,29 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-:- set_prolog_flag(language, iso).
-
 prolog_system('SICStus').
 
 :- ensure_loaded('ppl_sicstus.pl').
-:- use_module(library(lists), [append/3, member/2]).
+
+version_dependent_declarations :-
+	prolog_flag(version, V),
+	atom_codes(V, VList),
+	VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+	(N is "4" ->
+	    true
+	;
+	    set_prolog_flag(language, iso),
+	    use_module(library(lists), [append/3, member/2])
+	).
 
 main :-
-    ensure_loaded('pl_check.pl'),
-    set_prolog_flag(language, iso),	% FIXME: this is not ISO Prolog
-    nofileerrors,
-    (check_all ->
-	write('OK')
-    ;
-	write('FAILURE')
-    ),
-    nl,
-    halt.
+	version_dependent_declarations,
+	ensure_loaded('pl_check.pl'),
+	set_prolog_flag(fileerrors, off),
+	(check_all ->
+	    write('OK')
+	;
+	    write('FAILURE')
+	),
+	nl,
+	halt.
diff --git a/interfaces/Prolog/SICStus/sp_predicate_check.pl b/interfaces/Prolog/SICStus/sp_predicate_check.pl
new file mode 100644
index 0000000..c38ab55
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_predicate_check.pl
@@ -0,0 +1,48 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+	prolog_flag(version, V),
+	atom_codes(V, VList),
+	VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+	(N is "4" ->
+	    true
+	;
+	    set_prolog_flag(language, iso),
+	    use_module(library(lists), [append/3, member/2])
+	).
+
+main :-
+	version_dependent_declarations,
+        ensure_loaded('ppl_predicate_check_main.pl'),
+	set_prolog_flag(fileerrors, off),
+	(check_all ->
+	    write('OK')
+	;
+	    write('FAILURE')
+	),
+	nl,
+	halt.
diff --git a/interfaces/Prolog/SWI/Makefile.am b/interfaces/Prolog/SWI/Makefile.am
index 13240cc..b0c64a2 100644
--- a/interfaces/Prolog/SWI/Makefile.am
+++ b/interfaces/Prolog/SWI/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,28 +20,90 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
+SWI_CFLI_FILES = swi_cfli.hh
+
 EXTRA_DIST = \
-ppl_swiprolog.cc \
+ppl_interface_generator_swiprolog_cc.m4 \
+$(SWI_CFLI_FILES) \
 ppl_swiprolog.pl \
 pl_clpq.cc \
 pl_clpq.pl \
-swi_pl_check.pl
+swi_pl_check.pl \
+swi_predicate_check.pl \
+README.swiprolog
 
 if BUILD_SWI_PROLOG_INTERFACE
 
+if BUILD_WATCHDOG_LIBRARY
+
+WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+
+endif BUILD_WATCHDOG_LIBRARY
+
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog/src \
+$(WATCHDOG_INCLUDE_OPTIONS) \
 $(SWI_PROLOG_INCLUDE_OPTIONS) \
 @extra_includes@
 
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_swiprolog_cc.m4
+
+ppl_swiprolog.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_swiprolog_cc.m4 > $@
+
 pkglib_LTLIBRARIES = libppl_swiprolog.la
-libppl_swiprolog_la_SOURCES = ppl_swiprolog.cc
+
+libppl_swiprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+swi_efli.hh \
+swi_efli.cc
+
+nodist_libppl_swiprolog_la_SOURCES = \
+ppl_swiprolog.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_swiprolog_la_SOURCES = \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Rational_Box.cc
+
 libppl_swiprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
 $(top_builddir)/src/libppl.la \
-$(top_builddir)/Watchdog/src/libpwl.la \
+$(WATCHDOG_LIBRARY) \
 @extra_libraries@
-libppl_swiprolog_la_LDFLAGS = -module -avoid-version
+
+libppl_swiprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_swiprolog_la_LDFLAGS = \
+-module \
+-avoid-version
 
 bin_PROGRAMS = ppl_pl
 ppl_pl_SOURCES = ppl_pl.cc
@@ -66,31 +128,47 @@ check_PROGRAMS = pl_clpq pl_clpq2
 pl_clpq_SOURCES = pl_clpq.cc
 pl_clpq2_SOURCES = pl_clpq.cc
 
+if HOST_OS_CYGWIN
+
+# Under Cygwin, plld gets the link options wrong: -lpl (PLLIB)
+# comes before -lppl_swiprolog, with the result that all the
+# symbols of the SWI-Prolog foreign interface are undefined.
+# Repeating the link options works around this problem.
+EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS)
+
+endif HOST_OS_CYGWIN
+
 # Notice: we are linking statically until we understand whether
-# and if libtool and plld can interoperate.
-ppl_pl$(EXEEXT): ppl_swiprolog.o ppl_pl.o | libppl_swiprolog.la
-	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
-		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
-		-o $@ $+ \
+# and if Libtool and plld can interoperate.
+ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o
+	plld -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ -L.libs -lppl_swiprolog ppl_pl.o \
 		-L$(top_builddir)/src/.libs -lppl \
-		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
-		@extra_libraries@
-
-pl_clpq$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq.pl | libppl_swiprolog.la 
-	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
-		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
-		-o $@ $+ \
+		$(WATCHDOG_LINK_OPTIONS) \
+		@extra_libraries@ \
+		$(EXTRA_LINK_OPTIONS)
+
+pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl
+	plld -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ -L.libs -lppl_swiprolog pl_clpq.o \
+                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq.pl \
 		-L$(top_builddir)/src/.libs -lppl \
-		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
-		@extra_libraries@
+		$(WATCHDOG_LINK_OPTIONS) \
+		@extra_libraries@ \
+		$(EXTRA_LINK_OPTIONS)
+
 
-pl_clpq2$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq2.pl | libppl_swiprolog.la 
-	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
-		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
-		-o $@ $+ \
+pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl
+	plld -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ -L.libs -lppl_swiprolog pl_clpq.o \
+                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq2.pl \
 		-L$(top_builddir)/src/.libs -lppl \
-		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
-		@extra_libraries@
+		$(WATCHDOG_LINK_OPTIONS) \
+		@extra_libraries@ \
+		$(EXTRA_LINK_OPTIONS)
 
 COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
 
@@ -117,7 +195,8 @@ pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
         echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
+		-dlopen libppl_swiprolog.la \
                 ./ppl_pl < script_pchk
 	if [ $(srcdir) != `pwd` ]; then \
 	  rm -f pl_check.pl; \
@@ -129,7 +208,8 @@ clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
+		-dlopen libppl_swiprolog.la \
 		./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
 	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
 
@@ -138,14 +218,30 @@ clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
+		-dlopen libppl_swiprolog.la \
 		./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
+predicate_check_test: swi_predicate_check.pl ../tests/ppl_predicate_check_main.pl $(EXPECTED_PCHK)
+	cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl . ; \
+	cp -f ../tests/ppl_predicate_check_main.pl . ; \
+        echo "ensure_loaded('$(srcdir)/swi_predicate_check'). main." > script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		$(WATCHDOG_DLOPEN) \
+                ./ppl_pl < script_pchk
+	rm -f ppl_predicate_check_main.pl; \
+	rm -f ppl_predicate_check_common.pl; \
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+endif BUILD_SWI_PROLOG_INTERFACE
+
+DISTCLEANFILES = \
+ppl_swiprolog.cc
+
 MOSTLYCLEANFILES = \
 pl_clpq pl_clpq2 \
 obtained_clpq obtained_clpq2 obtained_pchk \
 $(CLPQ_TESTS) \
 script_pchk
-
-endif BUILD_SWI_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/SWI/Makefile.in b/interfaces/Prolog/SWI/Makefile.in
index 0246497..3c5c6cf 100644
--- a/interfaces/Prolog/SWI/Makefile.in
+++ b/interfaces/Prolog/SWI/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,15 +38,11 @@
 
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -66,7 +62,8 @@ host_triplet = @host@
 subdir = interfaces/Prolog/SWI
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -76,8 +73,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -94,12 +101,18 @@ am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
 	"$(DESTDIR)$(pkglibdir)"
 pkglibLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(pkglib_LTLIBRARIES)
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
-am__libppl_swiprolog_la_SOURCES_DIST = ppl_swiprolog.cc
+am__libppl_swiprolog_la_SOURCES_DIST = ppl_prolog_sysdep.hh \
+	swi_efli.hh swi_efli.cc
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at am_libppl_swiprolog_la_OBJECTS =  \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@	ppl_swiprolog.lo
-libppl_swiprolog_la_OBJECTS = $(am_libppl_swiprolog_la_OBJECTS)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	swi_efli.lo
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@nodist_libppl_swiprolog_la_OBJECTS =  \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	ppl_swiprolog.lo \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	ppl_prolog_common.lo
+libppl_swiprolog_la_OBJECTS = $(am_libppl_swiprolog_la_OBJECTS) \
+	$(nodist_libppl_swiprolog_la_OBJECTS)
+libppl_swiprolog_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_swiprolog_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at am_libppl_swiprolog_la_rpath =  \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	-rpath $(pkglibdir)
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
@@ -118,18 +131,30 @@ am__ppl_pl_SOURCES_DIST = ppl_pl.cc
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at am_ppl_pl_OBJECTS = ppl_pl.$(OBJEXT)
 ppl_pl_OBJECTS = $(am_ppl_pl_OBJECTS)
 ppl_pl_LDADD = $(LDADD)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libppl_swiprolog_la_SOURCES) \
+	$(nodist_libppl_swiprolog_la_SOURCES) \
+	$(nodist_EXTRA_libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
 	$(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
 DIST_SOURCES = $(am__libppl_swiprolog_la_SOURCES_DIST) \
 	$(am__pl_clpq_SOURCES_DIST) $(am__pl_clpq2_SOURCES_DIST) \
@@ -140,39 +165,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -182,53 +186,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -237,56 +239,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -298,10 +274,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -310,46 +290,115 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
+SWI_CFLI_FILES = swi_cfli.hh
 EXTRA_DIST = \
-ppl_swiprolog.cc \
+ppl_interface_generator_swiprolog_cc.m4 \
+$(SWI_CFLI_FILES) \
 ppl_swiprolog.pl \
 pl_clpq.cc \
 pl_clpq.pl \
-swi_pl_check.pl
-
+swi_pl_check.pl \
+swi_predicate_check.pl \
+README.swiprolog
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at AM_CPPFLAGS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_buildir)/interfaces/Prolog \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at -I$(top_builddir)/src \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@$(SWI_PROLOG_INCLUDE_OPTIONS) \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@@extra_includes@
 
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_interface_generator_swiprolog_cc.m4
+
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at pkglib_LTLIBRARIES = libppl_swiprolog.la
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_SOURCES = ppl_swiprolog.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_SOURCES = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_prolog_sysdep.hh \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@swi_efli.hh \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@swi_efli.cc
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@nodist_libppl_swiprolog_la_SOURCES = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_swiprolog.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_common.cc
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@nodist_EXTRA_libppl_swiprolog_la_SOURCES = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Double_Box.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Grid.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Polyhedron.cc \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@../ppl_prolog_Rational_Box.cc
+
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at libppl_swiprolog_la_LIBADD = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@ \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(WATCHDOG_LIBRARY) \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@@extra_libraries@
 
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_LDFLAGS = -module -avoid-version
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_DEPENDENCIES = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_LDFLAGS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-module \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-avoid-version
+
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at ppl_pl_SOURCES = ppl_pl.cc
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at pkglib_DATA = ppl_swiprolog.pl
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at CLPQ_TESTS_NONSTRICT = \
@@ -367,6 +416,12 @@ swi_pl_check.pl
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at pl_clpq_SOURCES = pl_clpq.cc
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at pl_clpq2_SOURCES = pl_clpq.cc
+
+# Under Cygwin, plld gets the link options wrong: -lpl (PLLIB)
+# comes before -lppl_swiprolog, with the result that all the
+# symbols of the SWI-Prolog foreign interface are undefined.
+# Repeating the link options works around this problem.
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@HOST_OS_CYGWIN_TRUE at EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS)
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
 @ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
@@ -374,11 +429,14 @@ swi_pl_check.pl
 @ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
 @ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq pl_clpq2 \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@script_pchk
+DISTCLEANFILES = \
+ppl_swiprolog.cc
+
+MOSTLYCLEANFILES = \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS) \
+script_pchk
 
 all: all-am
 
@@ -415,21 +473,21 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-pkglibLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
 	done
 
 clean-pkglibLTLIBRARIES:
@@ -441,18 +499,18 @@ clean-pkglibLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 libppl_swiprolog.la: $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_libppl_swiprolog_la_rpath) $(libppl_swiprolog_la_LDFLAGS) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS)
+	$(libppl_swiprolog_la_LINK) $(am_libppl_swiprolog_la_rpath) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS)
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
 	@list='$(bin_PROGRAMS)'; for p in $$list; do \
 	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
 	  if test -f $$p \
 	     || test -f $$p1 \
 	  ; then \
 	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
 	  else :; fi; \
 	done
 
@@ -479,13 +537,13 @@ clean-checkPROGRAMS:
 	done
 @BUILD_SWI_PROLOG_INTERFACE_FALSE at pl_clpq$(EXEEXT): $(pl_clpq_OBJECTS) $(pl_clpq_DEPENDENCIES) 
 @BUILD_SWI_PROLOG_INTERFACE_FALSE@	@rm -f pl_clpq$(EXEEXT)
- at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(pl_clpq_LDFLAGS) $(pl_clpq_OBJECTS) $(pl_clpq_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(pl_clpq_OBJECTS) $(pl_clpq_LDADD) $(LIBS)
 @BUILD_SWI_PROLOG_INTERFACE_FALSE at pl_clpq2$(EXEEXT): $(pl_clpq2_OBJECTS) $(pl_clpq2_DEPENDENCIES) 
 @BUILD_SWI_PROLOG_INTERFACE_FALSE@	@rm -f pl_clpq2$(EXEEXT)
- at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(pl_clpq2_LDFLAGS) $(pl_clpq2_OBJECTS) $(pl_clpq2_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(pl_clpq2_OBJECTS) $(pl_clpq2_LDADD) $(LIBS)
 @BUILD_SWI_PROLOG_INTERFACE_FALSE at ppl_pl$(EXEEXT): $(ppl_pl_OBJECTS) $(ppl_pl_DEPENDENCIES) 
 @BUILD_SWI_PROLOG_INTERFACE_FALSE@	@rm -f ppl_pl$(EXEEXT)
- at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(ppl_pl_LDFLAGS) $(ppl_pl_OBJECTS) $(ppl_pl_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(ppl_pl_OBJECTS) $(ppl_pl_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -495,41 +553,150 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pl_clpq.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_pl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_swiprolog.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swi_efli.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
 
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constrai [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-pkglibDATA: $(pkglib_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -550,8 +717,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -563,8 +730,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -574,13 +741,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -594,22 +760,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -628,7 +793,7 @@ check: check-am
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
 installdirs:
 	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -651,6 +816,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -664,7 +830,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -678,13 +844,21 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-binPROGRAMS install-pkglibDATA \
 	install-pkglibLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -705,8 +879,10 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
-	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+uninstall-am: uninstall-binPROGRAMS uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
 	clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
@@ -714,42 +890,52 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 	distclean-compile distclean-generic distclean-libtool \
 	distclean-tags distdir dvi dvi-am html html-am info info-am \
 	install install-am install-binPROGRAMS install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-pkglibDATA \
-	install-pkglibLTLIBRARIES install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-info-am uninstall-pkglibDATA \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibDATA install-pkglibLTLIBRARIES install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-pkglibDATA \
 	uninstall-pkglibLTLIBRARIES
 
 
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_swiprolog.cc: $(interface_generator_dependencies)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_swiprolog_cc.m4 > $@
+
 # Notice: we are linking statically until we understand whether
-# and if libtool and plld can interoperate.
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_pl$(EXEEXT): ppl_swiprolog.o ppl_pl.o | libppl_swiprolog.la
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ $+ \
+# and if Libtool and plld can interoperate.
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ -L.libs -lppl_swiprolog ppl_pl.o \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/src/.libs -lppl \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@
-
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq.pl | libppl_swiprolog.la 
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_LINK_OPTIONS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(EXTRA_LINK_OPTIONS)
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ -L.libs -lppl_swiprolog pl_clpq.o \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq.pl \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/src/.libs -lppl \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@
-
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq2$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq2.pl | libppl_swiprolog.la 
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_LINK_OPTIONS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(EXTRA_LINK_OPTIONS)
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ -L.libs -lppl_swiprolog pl_clpq.o \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq2.pl \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/src/.libs -lppl \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_LINK_OPTIONS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(EXTRA_LINK_OPTIONS)
 
 @BUILD_SWI_PROLOG_INTERFACE_TRUE at check-local: pl_check_test clpq_test clpq2_test
 
@@ -760,7 +946,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@        echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen libppl_swiprolog.la \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@                ./ppl_pl < script_pchk
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	  rm -f pl_check.pl; \
@@ -772,7 +959,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen libppl_swiprolog.la \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
 
@@ -781,9 +969,22 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen libppl_swiprolog.la \
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@		./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 @BUILD_SWI_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@predicate_check_test: swi_predicate_check.pl ../tests/ppl_predicate_check_main.pl $(EXPECTED_PCHK)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl . ; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	cp -f ../tests/ppl_predicate_check_main.pl . ; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@        echo "ensure_loaded('$(srcdir)/swi_predicate_check'). main." > script_pchk
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@                ./ppl_pl < script_pchk
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	rm -f ppl_predicate_check_main.pl; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	rm -f ppl_predicate_check_common.pl; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/Prolog/SWI/README.swiprolog b/interfaces/Prolog/SWI/README.swiprolog
new file mode 100644
index 0000000..e975bd4
--- /dev/null
+++ b/interfaces/Prolog/SWI/README.swiprolog
@@ -0,0 +1,33 @@
+The SWI-Prolog interface to the PPL is available both as a statically
+linked module or as a dynamically linked one.  Only SWI-Prolog version
+5.6.0 and later versions are supported.
+
+
+The `ppl_pl' Executable
+-----------------------
+
+The `ppl_pl' executable is simply the SWI-Prolog shell with the Parma
+Polyhedra Library statically linked: from within `ppl_pl' all the
+services of the library are available without further action.
+
+
+Loading the SWI-Prolog Interface Dynamically
+--------------------------------------------
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load `<prefix>/lib/ppl/ppl_swiprolog.pl', where <prefix> is the
+root of your installation (`/usr' or `/usr/local' in most cases).
+This will invoke `ppl_initialize/0' and `ppl_finalize/0'
+automatically.  Alternatively, you can load the library directly with
+
+    :- load_foreign_library('<prefix>/lib/ppl/libppl_swiprolog.so').
+
+This will call `ppl_initialize/0' automatically.  Analogously,
+
+    :- unload_foreign_library('<prefix>/lib/ppl/libppl_swiprolog.so').
+
+will, as part of the unload process, invoke `ppl_finalize/0'.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the `--enable-shared' option (on most platforms this
+is the default).
diff --git a/interfaces/Prolog/SWI/pl_clpq.cc b/interfaces/Prolog/SWI/pl_clpq.cc
index 5a34f4f..808ffcc 100644
--- a/interfaces/Prolog/SWI/pl_clpq.cc
+++ b/interfaces/Prolog/SWI/pl_clpq.cc
@@ -1,11 +1,11 @@
 /* C++ main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,6 +27,11 @@ extern "C" install_t uninstall();
 
 int
 main(int, char** argv) {
+#if PLVERSION > 50643
+  // Tell SWI-Prolog not to fiddle with GMP allocation functions.
+  PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE);
+#endif
+
   char* pl_args[2];
   pl_args[0] = argv[0];
   pl_args[1] = 0;
diff --git a/interfaces/Prolog/SWI/pl_clpq.pl b/interfaces/Prolog/SWI/pl_clpq.pl
index b8cbf2c..7fc768c 100644
--- a/interfaces/Prolog/SWI/pl_clpq.pl
+++ b/interfaces/Prolog/SWI/pl_clpq.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
new file mode 100644
index 0000000..bdec4e3
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
@@ -0,0 +1,71 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_swiprolog.cc.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* SWI-Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
+
+namespace {
+
+PL_extension predicates[] = {
+m4_divert(1)dnl
+  { NULL, 0, NULL, 0 }
+};
+
+} // namespace
+
+extern "C" install_t
+install() {
+  ppl_initialize();
+  PL_register_extensions(predicates);
+}
+
+extern "C" install_t
+uninstall() {
+  ppl_finalize();
+}
+m4_divert(-1)
+dnl Include common macros for generating system dependent code.
+dnl
+dnl Redefine m4_extension as useful for SWI-Prolog.
+dnl m4_extension(Predicate_Name, Arity)
+dnl Note: SPACES is just a marker to generated the two spaces of
+dnl indentation following it.
+m4_define(`m4_extension', `dnl
+SPACES  PL_EXTENSION_ENTRY($1, $2)
+')
+
+dnl Now remove the marker SPACES.
+m4_divert`'dnl
+m4_patsubst(ppl_prolog_sys_code, SPACES, `')dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/SWI/ppl_pl.cc b/interfaces/Prolog/SWI/ppl_pl.cc
index df982a9..7704562 100644
--- a/interfaces/Prolog/SWI/ppl_pl.cc
+++ b/interfaces/Prolog/SWI/ppl_pl.cc
@@ -1,11 +1,11 @@
 /* Main program for SWI-Prolog with the PPL statically linked.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,6 +27,11 @@ extern "C" install_t uninstall();
 
 int
 main(int argc, char **argv) {
+#if PLVERSION > 50643
+  // Tell SWI-Prolog not to fiddle with GMP allocation functions.
+  PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE);
+#endif
+
   if (!PL_initialise(argc, argv))
     PL_halt(1);
   PL_install_readline();
diff --git a/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..edf608b
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
@@ -0,0 +1,23 @@
+/* System-dependent part of the Prolog interfaces: stub for SWI Prolog.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "swi_efli.hh"
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.cc b/interfaces/Prolog/SWI/ppl_swiprolog.cc
deleted file mode 100644
index 5a30db5..0000000
--- a/interfaces/Prolog/SWI/ppl_swiprolog.cc
+++ /dev/null
@@ -1,524 +0,0 @@
-/* SWI Prolog interface.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "pwl.hh"
-
-// Include gmp.h before SWI-Prolog.h.  This is required in order
-// to get access to interface functions dealing with GMP numbers
-// and SWI-Prolog terms.
-#include <gmp.h>
-#include <SWI-Prolog.h>
-#include <cassert>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-typedef term_t Prolog_term_ref;
-typedef atom_t Prolog_atom;
-typedef foreign_t Prolog_foreign_return_type;
-
-namespace {
-
-const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
-const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
-
-} // namespace
-
-#include "../exceptions.hh"
-
-namespace PPL = Parma_Polyhedra_Library;
-
-namespace {
-
-/*!
-  True if and only if the Prolog engine supports unbounded integers.
-*/
-bool Prolog_has_unbounded_integers;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the minimum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_min_integer;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the maximum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_max_integer;
-
-/*!
-  Temporary used to communicate big integers between C++ and Prolog.
-*/
-mpz_class tmp_mpz_class;
-
-/*!
-  Performs system-dependent initialization.
-*/
-void
-ppl_Prolog_sysdep_init() {
-  Prolog_has_unbounded_integers = true;
-  Prolog_min_integer = 0;
-  Prolog_max_integer = 0;
-}
-
-/*!
-  Perform system-dependent de-itialization.
-*/
-void
-ppl_Prolog_sysdep_deinit() {
-}
-
-/*!
-  Return a new term reference.
-*/
-inline Prolog_term_ref
-Prolog_new_term_ref() {
-  return PL_new_term_ref();
-}
-
-/*!
-  Make \p t be a reference to the same term referenced by \p u,
-  i.e., assign \p u to \p t.
-*/
-inline int
-Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
-  PL_put_term(t, u);
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p l.
-*/
-inline int
-Prolog_put_long(Prolog_term_ref t, long l) {
-  PL_put_integer(t, l);
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p ul.
-*/
-inline int
-Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
-  if (ul <= LONG_MAX)
-    PL_put_integer(t, ul);
-  else if (ul <= static_cast<uint64_t>(std::numeric_limits<int64_t>::max()))
-    PL_put_int64(t, static_cast<int64_t>(ul));
-  else {
-    PPL::assign_r(tmp_mpz_class, ul, PPL::ROUND_NOT_NEEDED);
-    PL_unify_mpz(t, tmp_mpz_class.get_mpz_t());
-  }
-  return 1;
-}
-
-/*!
-  Assign to \p t an atom whose name is given
-  by the null-terminated string \p s.
-*/
-inline int
-Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
-  PL_put_atom_chars(t, s);
-  return 1;
-}
-
-/*!
-  Assign to \p t the Prolog atom \p a.
-*/
-inline int
-Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
-  PL_put_atom(t, a);
-  return 1;
-}
-
-/*!
-  Assign to \p t a term representing the address contained in \p p.
-*/
-inline int
-Prolog_put_address(Prolog_term_ref t, void* p) {
-  PL_put_pointer(t, p);
-  return 1;
-}
-
-/*!
-  Return an atom whose name is given by the null-terminated string \p s.
-*/
-Prolog_atom
-Prolog_atom_from_string(const char* s) {
-  return PL_new_atom(s);
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 1 with argument \p a1.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
-			  Prolog_term_ref a1) {
-  PL_cons_functor(t, PL_new_functor(f, 1), a1);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 2 with arguments \p a1 and \p a2.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2) {
-  PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 3 with arguments \p a1, \p a2 and \p a3.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3) {
-  PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3, Prolog_term_ref a4) {
-  PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
-  return 1;
-}
-
-/*!
-  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
-*/
-inline int
-Prolog_construct_cons(Prolog_term_ref c,
-		      Prolog_term_ref h, Prolog_term_ref t) {
-  PL_cons_list(c, h, t);
-  return 1;
-}
-
-/*!
-  Raise a Prolog exception with \p t as the exception term.
-*/
-inline void
-Prolog_raise_exception(Prolog_term_ref t) {
-  (void) PL_raise_exception(t);
-}
-
-/*!
-  Return true if \p t is a Prolog variable, false otherwise.
-*/
-inline int
-Prolog_is_variable(Prolog_term_ref t) {
-  return PL_is_variable(t);
-}
-
-/*!
-  Return true if \p t is a Prolog atom, false otherwise.
-*/
-inline int
-Prolog_is_atom(Prolog_term_ref t) {
-  return PL_is_atom(t);
-}
-
-/*!
-  Return true if \p t is a Prolog integer, false otherwise.
-*/
-inline int
-Prolog_is_integer(Prolog_term_ref t) {
-  return PL_is_integer(t);
-}
-
-/*!
-  Return true if \p t is the representation of an address, false otherwise.
-*/
-inline int
-Prolog_is_address(Prolog_term_ref t) {
-  return PL_is_integer(t);
-}
-
-/*!
-  Return true if \p t is a Prolog compound term, false otherwise.
-*/
-inline int
-Prolog_is_compound(Prolog_term_ref t) {
-  return PL_is_compound(t);
-}
-
-/*!
-  Return true if \p t is a Prolog list, false otherwise.
-*/
-inline int
-Prolog_is_cons(Prolog_term_ref t) {
-  return !PL_is_atom(t) && PL_is_list(t);
-}
-
-/*!
-  Assuming \p t is a Prolog integer, return true if its value fits
-  in a long, in which case the value is assigned to \p v,
-  return false otherwise.  The behavior is undefined if \p t is
-  not a Prolog integer.
-*/
-inline int
-Prolog_get_long(Prolog_term_ref t, long* lp) {
-  assert(Prolog_is_integer(t));
-  return PL_get_long(t, lp);
-}
-
-/*!
-  If \p t is the Prolog representation for a memory address, return
-  true and store that address into \p v; return false otherwise.
-  The behavior is undefined if \p t is not an address.
-*/
-inline int
-Prolog_get_address(Prolog_term_ref t, void** vpp) {
-  assert(Prolog_is_address(t));
-  return PL_get_pointer(t, vpp);
-}
-
-/*!
-  If \p t is a Prolog atom, return true and store its name into \p name.
-  The behavior is undefined if \p t is not a Prolog atom.
-*/
-inline int
-Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
-  assert(Prolog_is_atom(t));
-  return PL_get_atom(t, ap);
-}
-
-/*!
-  If \p t is a Prolog compound term, return true and store its name
-  and arity into \p name and \p arity, respectively.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
-  assert(Prolog_is_compound(t));
-  return PL_get_name_arity(t, ap, ip);
-}
-
-/*!
-  If \p t is a Prolog compound term and \p i is a positive integer
-  less than or equal to its arity, return true and assign to \p a the
-  i-th (principal) argument of \p t.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
-  assert(Prolog_is_compound(t));
-  return PL_get_arg(i, t, a);
-}
-
-/*!
-  If \p c is a Prolog cons (list constructor), assign its head and
-  tail to \p h and \p t, respectively.
-  The behavior is undefined if \p c is not a Prolog cons.
-*/
-inline int
-Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
-  assert(Prolog_is_cons(c));
-  return PL_get_list(c, h, t);
-}
-
-/*!
-  Unify the terms referenced by \p t and \p u and return true
-  if the unification is successful; return false otherwise.
-*/
-inline int
-Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
-  return PL_unify(t, u);
-}
-
-PPL::Coefficient
-integer_term_to_Coefficient(Prolog_term_ref t) {
-  assert(Prolog_is_integer(t));
-  PL_get_mpz(t, tmp_mpz_class.get_mpz_t());
-  return PPL::Coefficient(tmp_mpz_class);
-}
-
-Prolog_term_ref
-Coefficient_to_integer_term(const PPL::Coefficient& n) {
-  PPL::assign_r(tmp_mpz_class, n, PPL::ROUND_NOT_NEEDED);
-  Prolog_term_ref t = Prolog_new_term_ref();
-  PL_unify_mpz(t, tmp_mpz_class.get_mpz_t());
-  return t;
-}
-
-} // namespace
-
-#include "../ppl_prolog.icc"
-
-#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
-
-namespace {
-
-PL_extension predicates[] = {
-  PL_EXTENSION_ENTRY(ppl_version_major, 1)
-  PL_EXTENSION_ENTRY(ppl_version_minor, 1)
-  PL_EXTENSION_ENTRY(ppl_version_revision, 1)
-  PL_EXTENSION_ENTRY(ppl_version_beta, 1)
-  PL_EXTENSION_ENTRY(ppl_version, 1)
-  PL_EXTENSION_ENTRY(ppl_banner, 1)
-  PL_EXTENSION_ENTRY(ppl_max_space_dimension, 1)
-  PL_EXTENSION_ENTRY(ppl_Coefficient_is_bounded, 0)
-  PL_EXTENSION_ENTRY(ppl_Coefficient_max, 1)
-  PL_EXTENSION_ENTRY(ppl_Coefficient_min, 1)
-  PL_EXTENSION_ENTRY(ppl_initialize, 0)
-  PL_EXTENSION_ENTRY(ppl_finalize, 0)
-  PL_EXTENSION_ENTRY(ppl_set_timeout_exception_atom, 1)
-  PL_EXTENSION_ENTRY(ppl_timeout_exception_atom, 1)
-  PL_EXTENSION_ENTRY(ppl_set_timeout, 1)
-  PL_EXTENSION_ENTRY(ppl_reset_timeout, 0)
-  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_space_dimension, 3)
-  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_space_dimension, 3)
-  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_C_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_generators, 2)
-  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_generators, 2)
-  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_bounding_box, 2)
-  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_bounding_box, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_swap, 2)
-  PL_EXTENSION_ENTRY(ppl_delete_Polyhedron, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_space_dimension, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_dimension, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_minimized_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_generators, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_minimized_generators, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_relation_with_constraint, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_relation_with_generator, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_bounding_box, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_empty, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_universe, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_bounded, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounds_from_above, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounds_from_below, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_maximize, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_maximize_with_point, 6)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_minimize, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_minimize_with_point, 6)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_topologically_closed, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_topological_closure_assign, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_contains_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_strictly_contains_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_equals_Polyhedron, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_OK, 1)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraint, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraint_and_minimize, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generator, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generator_and_minimize, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraints_and_minimize, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generators, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generators_and_minimize, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_intersection_assign, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_intersection_assign_and_minimize, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_hull_assign, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_hull_assign_and_minimize, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_difference_assign, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_image, 4)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_preimage, 4)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_affine_image, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_affine_preimage, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_image, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_preimage, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_time_elapse_assign, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_BHRZ03_widening_assign, 2)
-  PL_EXTENSION_ENTRY(
-           ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3)
-  PL_EXTENSION_ENTRY(
-           ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_H79_widening_assign_with_tokens, 4)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_H79_widening_assign, 2)
-  PL_EXTENSION_ENTRY(
-           ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_limited_H79_extrapolation_assign, 3)
-  PL_EXTENSION_ENTRY(
-           ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_space_dimensions_and_project, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_space_dimensions_and_embed, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_concatenate_assign, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_remove_space_dimensions, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_remove_higher_space_dimensions, 2)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_expand_space_dimension, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_fold_space_dimensions, 3)
-  PL_EXTENSION_ENTRY(ppl_Polyhedron_map_space_dimensions, 2)
-  PL_EXTENSION_ENTRY(ppl_new_LP_Problem_trivial, 1)
-  PL_EXTENSION_ENTRY(ppl_new_LP_Problem, 4)
-  PL_EXTENSION_ENTRY(ppl_new_LP_Problem_from_LP_Problem, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_swap, 2)
-  PL_EXTENSION_ENTRY(ppl_delete_LP_Problem, 1)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_space_dimension, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_objective_function, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_optimization_mode, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_clear, 1)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_add_constraint, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_add_constraints, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_set_objective_function, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_set_optimization_mode, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_is_satisfiable, 1)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_solve, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_feasible_point, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_optimizing_point, 2)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_optimal_value, 3)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_evaluate_objective_function, 4)
-  PL_EXTENSION_ENTRY(ppl_LP_Problem_OK, 1)
-  { NULL, 0, NULL, 0 }
-};
-
-} // namespace
-
-extern "C" install_t
-install() {
-  ppl_initialize();
-  PL_register_extensions(predicates);
-}
-
-extern "C" install_t
-uninstall() {
-  ppl_finalize();
-}
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.pl b/interfaces/Prolog/SWI/ppl_swiprolog.pl
index 946b999..c8888d5 100644
--- a/interfaces/Prolog/SWI/ppl_swiprolog.pl
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.pl
@@ -1,11 +1,11 @@
 /* Loader for the SWI-Prolog interface.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/SWI/swi_cfli.hh b/interfaces/Prolog/SWI/swi_cfli.hh
new file mode 100644
index 0000000..45d5ea1
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_cfli.hh
@@ -0,0 +1,327 @@
+/* SWI-Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PCFLI_swi_cfli_hh
+#define PCFLI_swi_cfli_hh 1
+
+/* Include gmp.h before SWI-Prolog.h.  This is required in order to
+   get access to interface functions dealing with GMP numbers and
+   SWI-Prolog terms.  */
+#include <gmp.h>
+#include <SWI-Prolog.h>
+#include <cassert>
+#include <climits>
+
+typedef term_t Prolog_term_ref;
+typedef atom_t Prolog_atom;
+typedef foreign_t Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return PL_new_term_ref();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+  PL_put_term(t, u);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref t, long l) {
+  PL_put_integer(t, l);
+  return 1;
+}
+
+static int tmp_mpz_t_initialized = 0;
+static mpz_t tmp_mpz_t;
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+static int
+Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
+  assert(ul > LONG_MAX && ul > (uint64_t) INT64_MAX);
+  if (!tmp_mpz_t_initialized) {
+    mpz_init_set_ui(tmp_mpz_t, ul);
+    tmp_mpz_t_initialized = 1;
+  }
+  else
+    mpz_set_ui(tmp_mpz_t, ul);
+  return PL_unify_mpz(t, tmp_mpz_t);
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+  if (ul <= LONG_MAX) {
+    PL_put_integer(t, ul);
+    return 1;
+  }
+  else if (ul <= (uint64_t) INT64_MAX) {
+    PL_put_int64(t, (int64_t) ul);
+    return 1;
+  }
+  else
+    return Prolog_put_big_ulong(t, ul);
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+  PL_put_atom_chars(t, s);
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+  PL_put_atom(t, a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+  PL_put_pointer(t, p);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return PL_new_atom(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  PL_cons_functor(t, PL_new_functor(f, 1), a1);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  PL_cons_list(c, h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  (void) PL_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return PL_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return PL_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return PL_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return PL_is_integer(t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return PL_is_compound(t);
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return !PL_is_atom(t) && PL_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  return PL_get_long(t, lp);
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into to \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  return PL_get_pointer(t, vpp);
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  return PL_get_atom(t, ap);
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  return PL_get_name_arity(t, ap, ip);
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+  assert(Prolog_is_compound(t));
+  return PL_get_arg(i, t, a);
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+  assert(Prolog_is_cons(c));
+  return PL_get_list(c, h, t);
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return PL_unify(t, u);
+}
+
+#endif // !defined(PCFLI_swi_cfli_hh)
diff --git a/interfaces/Prolog/SWI/swi_efli.cc b/interfaces/Prolog/SWI/swi_efli.cc
new file mode 100644
index 0000000..08b8c8d
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_efli.cc
@@ -0,0 +1,70 @@
+/* SWI-Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "swi_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  DIRTY_TEMP0(mpz_class, tmp);
+  PL_get_mpz(t, tmp.get_mpz_t());
+  n = tmp;
+  return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  DIRTY_TEMP0(mpz_class, tmp);
+  assign_r(tmp, n, ROUND_NOT_NEEDED);
+  return PL_unify_mpz(t, tmp.get_mpz_t());
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  PL_put_variable(t);
+  return Prolog_unify_Coefficient(t, n);
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/SWI/swi_efli.hh b/interfaces/Prolog/SWI/swi_efli.hh
new file mode 100644
index 0000000..5097eba
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_efli.hh
@@ -0,0 +1,83 @@
+/* SWI-Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_swi_efli_hh
+#define PPL_swi_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "swi_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_swi_efli_hh)
diff --git a/interfaces/Prolog/SWI/swi_pl_check.pl b/interfaces/Prolog/SWI/swi_pl_check.pl
index a4a9004..7edda5e 100644
--- a/interfaces/Prolog/SWI/swi_pl_check.pl
+++ b/interfaces/Prolog/SWI/swi_pl_check.pl
@@ -1,11 +1,11 @@
-/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Main program for the PPL/SWI-Prolog checker.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/SWI/swi_predicate_check.pl b/interfaces/Prolog/SWI/swi_predicate_check.pl
new file mode 100644
index 0000000..ea06fb6
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_predicate_check.pl
@@ -0,0 +1,38 @@
+/* Main program for the PPL/SWI-Prolog predicate checker.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:-  ensure_loaded('ppl_predicate_check_main.pl').
+
+prolog_system('SWI').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pchk, write, Stream),
+    set_output(Stream),
+    (check_all ->
+	write('OK')
+    ;
+	write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/XSB/Makefile.am b/interfaces/Prolog/XSB/Makefile.am
index 3e19fe6..9fcf0cb 100644
--- a/interfaces/Prolog/XSB/Makefile.am
+++ b/interfaces/Prolog/XSB/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,59 +20,120 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-abs_srcdir = @abs_srcdir@
+XSB_CFLI_FILES = xsb_cfli.hh
 
 EXTRA_DIST = \
-ppl_xsb.cc \
-ppl_xsb.H \
+ppl_interface_generator_xsb_cc.m4 \
+ppl_interface_generator_xsb_hh.m4 \
+ppl_interface_generator_xsb_H.m4 \
+$(XSB_CFLI_FILES) \
 xsb_clpq.P \
 xsb_clpq2.P \
 xsb_pl_check.P \
-expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
-expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
-expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
-expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
-expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
-expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
-expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
-expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
-expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
-expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+ppl_interface_generator_xsb_predicate_check_P.m4
 
 if BUILD_XSB_PROLOG_INTERFACE
 
+if BUILD_WATCHDOG_LIBRARY
+
+WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+
+endif BUILD_WATCHDOG_LIBRARY
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_xsb_predicate_check_P.m4
+
+ppl_xsb.H: $(interface_generator_dependencies) ppl_interface_generator_xsb_H.m4
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_H.m4 > $@
+
+ppl_xsb.hh: $(interface_generator_dependencies) ppl_interface_generator_xsb_hh.m4
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_hh.m4 > $@
+
+ppl_xsb.cc: $(interface_generator_dependencies) ppl_interface_generator_xsb_cc.m4
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_cc.m4 > $@
+
+xsb_predicate_check.P: $(interface_generator_dependencies) ppl_interface_generator_xsb_predicate_check_P.m4
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_predicate_check_P.m4 > $@
+
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog/src \
+$(WATCHDOG_INCLUDE_OPTIONS) \
 $(XSB_PROLOG_INCLUDE_OPTIONS) \
 @extra_includes@
 
-pkglib_LTLIBRARIES = ppl_xsb.la
-ppl_xsb_la_SOURCES = ppl_xsb.cc
-ppl_xsb_la_LIBADD = \
+noinst_LTLIBRARIES = libppl_xsb.la
+
+libppl_xsb_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+xsb_efli.hh \
+xsb_efli.cc
+
+nodist_libppl_xsb_la_SOURCES = \
+ppl_xsb.hh \
+../ppl_prolog_common.cc
+
+BUILT_SOURCES = \
+ppl_xsb.hh
+
+nodist_EXTRA_libppl_xsb_la_SOURCES = \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Rational_Box.cc
+
+libppl_xsb_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
 $(top_builddir)/src/libppl.la \
-$(top_builddir)/Watchdog/src/libpwl.la \
+$(WATCHDOG_LIBRARY) \
 @extra_libraries@
-ppl_xsb_la_LDFLAGS = -module -avoid-version
+
+libppl_xsb_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_xsb_la_LDFLAGS = \
+-module \
+-avoid-version
 
 pkglib_DATA = ppl_xsb.xwam
 
-ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc ppl_xsb.la Makefile
-	if [ $(abs_srcdir) != `pwd` ]; then \
-	  cp -f $(srcdir)/ppl_xsb.H . ; \
-	fi
-	cp -f $(srcdir)/ppl_xsb.cc ppl_xsb.c
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc libppl_xsb.la
+	cp -f ppl_xsb.cc ppl_xsb.c
 	echo "consult(ppl_xsb," \
 	  "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
-	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)')])." \
+	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -fPIC " \
+	    "-L.libs -lppl_xsb" \
+	    "-L../../../src/.libs -L../../../Watchdog/src/.libs')])." \
 		| $(LIBTOOL) --mode=execute \
 			-dlopen ../../../src/libppl.la \
-			-dlopen ../../../Watchdog/src/libpwl.la \
+			$(WATCHDOG_DLOPEN) \
 			xsb
 	rm -f ppl_xsb.c
-	if [ $(abs_srcdir) != `pwd` ]; then \
-	  rm -f ppl_xsb.H; \
-	fi
 
 CLPQ_TESTS_NONSTRICT = \
 ack.clpq \
@@ -88,28 +149,23 @@ schedule.clpq
 
 CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
 
-# FIXME: we are checking against special versions of `expected_clpq'
-#        and `expected_clpq2'.  This is due to the fact that XSB 2.6
-#        and previous versions do not support control escape
-#        sequences.
-
 COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
 
 if ASSERTIONS_ENABLED
 
-EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
-EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
-EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
 
 else !ASSERTIONS_ENABLED
 
-EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)
-EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)
-EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
 
 endif !ASSERTIONS_ENABLED
 
-check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test 
+check-local: libppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test
 	LANG=C; \
 	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 	if [ $(abs_srcdir) != `pwd` ]; then \
@@ -119,8 +175,7 @@ check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clp
 	rm -f xsb_clpq.xwam
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
-		-dlopen ppl_xsb.la \
+		$(WATCHDOG_DLOPEN) \
 		xsb xsb_clpq \
 			<$(srcdir)/../tests/script_clpq >obtained_clpq
 	rm -f clpq.pl
@@ -135,8 +190,7 @@ check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clp
 	rm -f xsb_clpq2.xwam
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
-		-dlopen ppl_xsb.la \
+		$(WATCHDOG_DLOPEN) \
 		xsb xsb_clpq2 \
 			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 	rm -f clpq2.pl
@@ -145,7 +199,7 @@ check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clp
 	fi
 	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
-pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+pl_check_test: libppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
 	if [ $(abs_srcdir) != `pwd` ]; then \
 	  cp -f $(srcdir)/xsb_pl_check.P . ; \
 	fi
@@ -153,8 +207,7 @@ pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
 	rm -f xsb_pl_check.xwam
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
-		-dlopen ppl_xsb.la \
+		$(WATCHDOG_DLOPEN) \
 		xsb xsb_pl_check \
 			>obtained_pchk
 	rm -f pl_check.pl
@@ -163,9 +216,27 @@ pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
 	fi
 	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 
+predicate_check_test: libppl_xsb.la ppl_xsb.xwam xsb_predicate_check.P ../tests/ppl_predicate_check_main.pl
+	cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl . ; \
+	cp -f ../tests/ppl_predicate_check_main.pl .
+	rm -f xsb_predicate_check.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		$(WATCHDOG_DLOPEN) \
+		xsb xsb_predicate_check \
+			>obtained_pchk
+	rm -f ppl_predicate_check_main.pl
+	rm -f xsb_predicate_check.P; \
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+endif BUILD_XSB_PROLOG_INTERFACE
+
+DISTCLEANFILES = \
+ppl_xsb.H \
+ppl_xsb.hh \
+ppl_xsb.cc
+
 MOSTLYCLEANFILES = \
 ppl_xsb.xwam ppl_xsb.so \
 xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
 $(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
-
-endif BUILD_XSB_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/XSB/Makefile.in b/interfaces/Prolog/XSB/Makefile.in
index e6361e1..c26f70e 100644
--- a/interfaces/Prolog/XSB/Makefile.in
+++ b/interfaces/Prolog/XSB/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/ppl/ .
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ host_triplet = @host@
 subdir = interfaces/Prolog/XSB
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,82 +69,86 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am__libppl_xsb_la_SOURCES_DIST = ppl_prolog_sysdep.hh xsb_efli.hh \
+	xsb_efli.cc
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_libppl_xsb_la_OBJECTS =  \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	xsb_efli.lo
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@nodist_libppl_xsb_la_OBJECTS =  \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	ppl_prolog_common.lo
+libppl_xsb_la_OBJECTS = $(am_libppl_xsb_la_OBJECTS) \
+	$(nodist_libppl_xsb_la_OBJECTS)
+libppl_xsb_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_xsb_la_LDFLAGS) $(LDFLAGS) -o $@
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_libppl_xsb_la_rpath =
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libppl_xsb_la_SOURCES) $(nodist_libppl_xsb_la_SOURCES) \
+	$(nodist_EXTRA_libppl_xsb_la_SOURCES)
+DIST_SOURCES = $(am__libppl_xsb_la_SOURCES_DIST)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
 am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
-pkglibLTLIBRARIES_INSTALL = $(INSTALL)
-LTLIBRARIES = $(pkglib_LTLIBRARIES)
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
-am__ppl_xsb_la_SOURCES_DIST = ppl_xsb.cc
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_ppl_xsb_la_OBJECTS = ppl_xsb.lo
-ppl_xsb_la_OBJECTS = $(am_ppl_xsb_la_OBJECTS)
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_ppl_xsb_la_rpath = -rpath \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(pkglibdir)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(ppl_xsb_la_SOURCES)
-DIST_SOURCES = $(am__ppl_xsb_la_SOURCES_DIST)
+am__installdirs = "$(DESTDIR)$(pkglibdir)"
 pkglibDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(pkglib_DATA)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -157,53 +158,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -212,56 +211,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -273,10 +246,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -285,57 +262,118 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-abs_srcdir = @abs_srcdir@
+XSB_CFLI_FILES = xsb_cfli.hh
 EXTRA_DIST = \
-ppl_xsb.cc \
-ppl_xsb.H \
+ppl_interface_generator_xsb_cc.m4 \
+ppl_interface_generator_xsb_hh.m4 \
+ppl_interface_generator_xsb_H.m4 \
+$(XSB_CFLI_FILES) \
 xsb_clpq.P \
 xsb_clpq2.P \
 xsb_pl_check.P \
-expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
-expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
-expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
-expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
-expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
-expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
-expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
-expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
-expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
-expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+ppl_interface_generator_xsb_predicate_check_P.m4
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_interface_generator_xsb_predicate_check_P.m4
 
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at AM_CPPFLAGS = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_buildir)/interfaces/Prolog \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at -I$(top_builddir)/src \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@$(XSB_PROLOG_INCLUDE_OPTIONS) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@@extra_includes@
 
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = ppl_xsb.la
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_SOURCES = ppl_xsb.cc
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_LIBADD = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@noinst_LTLIBRARIES = libppl_xsb.la
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@libppl_xsb_la_SOURCES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_prolog_sysdep.hh \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@xsb_efli.hh \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@xsb_efli.cc
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@nodist_libppl_xsb_la_SOURCES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.hh \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_common.cc
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@BUILT_SOURCES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.hh
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@nodist_EXTRA_libppl_xsb_la_SOURCES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Double_Box.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Grid.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Polyhedron.cc \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@../ppl_prolog_Rational_Box.cc
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@libppl_xsb_la_LIBADD = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@ \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(WATCHDOG_LIBRARY) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@@extra_libraries@
 
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_LDFLAGS = -module -avoid-version
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@libppl_xsb_la_DEPENDENCIES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@libppl_xsb_la_LDFLAGS = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-module \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-avoid-version
+
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at pkglib_DATA = ppl_xsb.xwam
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at CLPQ_TESTS_NONSTRICT = \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at ack.clpq \
@@ -350,24 +388,25 @@ expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at schedule.clpq
 
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
-
-# FIXME: we are checking against special versions of `expected_clpq'
-#        and `expected_clpq2'.  This is due to the fact that XSB 2.6
-#        and previous versions do not support control escape
-#        sequences.
 @BUILD_XSB_PROLOG_INTERFACE_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
- at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)
- at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
- at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)
- at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
- at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)
- at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam ppl_xsb.so \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
-
-all: all-am
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+DISTCLEANFILES = \
+ppl_xsb.H \
+ppl_xsb.hh \
+ppl_xsb.cc
+
+MOSTLYCLEANFILES = \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .cc .lo .o .obj
@@ -400,35 +439,17 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
-	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
-	  else :; fi; \
-	done
-
-uninstall-pkglibLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
-	done
 
-clean-pkglibLTLIBRARIES:
-	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
-	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
 	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
 	  test "$$dir" != "$$p" || dir=.; \
 	  echo "rm -f \"$${dir}/so_locations\""; \
 	  rm -f "$${dir}/so_locations"; \
 	done
-ppl_xsb.la: $(ppl_xsb_la_OBJECTS) $(ppl_xsb_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_ppl_xsb_la_rpath) $(ppl_xsb_la_LDFLAGS) $(ppl_xsb_la_OBJECTS) $(ppl_xsb_la_LIBADD) $(LIBS)
+libppl_xsb.la: $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_DEPENDENCIES) 
+	$(libppl_xsb_la_LINK) $(am_libppl_xsb_la_rpath) $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -436,41 +457,149 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_xsb.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xsb_efli.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
 
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constrai [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-pkglibDATA: $(pkglib_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -491,8 +620,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -504,8 +633,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -515,13 +644,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -535,22 +663,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -564,13 +691,15 @@ distdir: $(DISTFILES)
 @BUILD_XSB_PROLOG_INTERFACE_FALSE at check-local:
 check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) check-local
-check: check-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES) $(DATA)
 installdirs:
-	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	for dir in "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -591,20 +720,22 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
 	mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -618,12 +749,20 @@ info-am:
 
 install-data-am:
 
-install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+install-dvi: install-dvi-am
+
+install-exec-am: install-pkglibDATA
+
+install-html: install-html-am
 
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -644,42 +783,55 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am uninstall-pkglibDATA \
-	uninstall-pkglibLTLIBRARIES
+uninstall-am: uninstall-pkglibDATA
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
-	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+	clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-pkglibDATA \
-	install-pkglibLTLIBRARIES install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibDATA install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am \
-	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+	tags uninstall uninstall-am uninstall-pkglibDATA
 
 
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc ppl_xsb.la Makefile
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/ppl_xsb.H . ; \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/ppl_xsb.cc ppl_xsb.c
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.H: $(interface_generator_dependencies) ppl_interface_generator_xsb_H.m4
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_xsb_H.m4 > $@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.hh: $(interface_generator_dependencies) ppl_interface_generator_xsb_hh.m4
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_xsb_hh.m4 > $@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.cc: $(interface_generator_dependencies) ppl_interface_generator_xsb_cc.m4
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_xsb_cc.m4 > $@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@xsb_predicate_check.P: $(interface_generator_dependencies) ppl_interface_generator_xsb_predicate_check_P.m4
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_xsb_predicate_check_P.m4 > $@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc libppl_xsb.la
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f ppl_xsb.cc ppl_xsb.c
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	echo "consult(ppl_xsb," \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	  "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)')])." \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -fPIC " \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	    "-L.libs -lppl_xsb" \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	    "-L../../../src/.libs -L../../../Watchdog/src/.libs')])." \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		| $(LIBTOOL) --mode=execute \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@			-dlopen ../../../src/libppl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@			-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			$(WATCHDOG_DLOPEN) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@			xsb
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f ppl_xsb.c
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  rm -f ppl_xsb.H; \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
 
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test 
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@check-local: libppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	LANG=C; \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
@@ -689,8 +841,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_clpq.xwam
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_clpq \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@			<$(srcdir)/../tests/script_clpq >obtained_clpq
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f clpq.pl
@@ -705,8 +856,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_clpq2.xwam
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_clpq2 \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f clpq2.pl
@@ -715,7 +865,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pl_check_test: libppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/xsb_pl_check.P . ; \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
@@ -723,8 +873,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_pl_check.xwam
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
- at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_pl_check \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@			>obtained_pchk
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f pl_check.pl
@@ -732,6 +881,19 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	  rm -f xsb_pl_check.P; \
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
 @BUILD_XSB_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@predicate_check_test: libppl_xsb.la ppl_xsb.xwam xsb_predicate_check.P ../tests/ppl_predicate_check_main.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/../tests/ppl_predicate_check_common.pl . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f ../tests/ppl_predicate_check_main.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_predicate_check.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		$(WATCHDOG_DLOPEN) \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_predicate_check \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			>obtained_pchk
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f ppl_predicate_check_main.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_predicate_check.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int16 b/interfaces/Prolog/XSB/expected_clpq2_int16
deleted file mode 100644
index 9debe48..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int16
+++ /dev/null
@@ -1,102 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Unknown result due to negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int16_a b/interfaces/Prolog/XSB/expected_clpq2_int16_a
deleted file mode 100644
index 8f18e66..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int16_a
+++ /dev/null
@@ -1,103 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Unknown result due to negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int32 b/interfaces/Prolog/XSB/expected_clpq2_int32
deleted file mode 100644
index 667acc1..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int32
+++ /dev/null
@@ -1,109 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- E >= 0
-Y =< 9
--E + Y >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int32_a b/interfaces/Prolog/XSB/expected_clpq2_int32_a
deleted file mode 100644
index 636a1bc..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int32_a
+++ /dev/null
@@ -1,102 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int64 b/interfaces/Prolog/XSB/expected_clpq2_int64
deleted file mode 100644
index 667acc1..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int64
+++ /dev/null
@@ -1,109 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- E >= 0
-Y =< 9
--E + Y >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int64_a b/interfaces/Prolog/XSB/expected_clpq2_int64_a
deleted file mode 100644
index 667acc1..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int64_a
+++ /dev/null
@@ -1,109 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- E >= 0
-Y =< 9
--E + Y >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int8 b/interfaces/Prolog/XSB/expected_clpq2_int8
deleted file mode 100644
index 0cc3daf..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int8
+++ /dev/null
@@ -1,101 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int8_a b/interfaces/Prolog/XSB/expected_clpq2_int8_a
deleted file mode 100644
index 0cc3daf..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_int8_a
+++ /dev/null
@@ -1,101 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_mpz b/interfaces/Prolog/XSB/expected_clpq2_mpz
deleted file mode 100644
index 667acc1..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_mpz
+++ /dev/null
@@ -1,109 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- E >= 0
-Y =< 9
--E + Y >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_mpz_a b/interfaces/Prolog/XSB/expected_clpq2_mpz_a
deleted file mode 100644
index 667acc1..0000000
--- a/interfaces/Prolog/XSB/expected_clpq2_mpz_a
+++ /dev/null
@@ -1,109 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Z - Y = 1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- E >= 0
-Y =< 9
--E + Y >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X =< 5
-X > 4
- more? X < 2
-X > 1
- more? no
-PPL clpq ?- X =< 205
-X > 110
- more? X < 35
-X > 28
- more? no
-PPL clpq ?- -D2 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S + S2 >= 0
-S + D - S2 - D3 >= 0
--S + S1 >= 0
- more? -D3 > 0
--S1 - D1 + S2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S + S2 >= 0
-S + D - S2 - D2 >= 0
--S + S1 >= 0
- more? S + D - S2 - D2 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
--D2 > 0
- more? -D3 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D3 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D3 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
- more? -D2 > 0
--S + S2 >= 0
--S + S1 >= 0
-S1 - S2 - D2 > 0
-S - S1 - D1 + D >= 0
-S + D - S2 - D2 >= 0
--S1 - D1 + S2 > 0
-S + D - S2 - D3 >= 0
- more? S + D - S2 - D3 >= 0
--S + S1 >= 0
-S - S1 - D1 + D >= 0
--S + S2 >= 0
-S1 - S2 - D2 > 0
--S1 - D1 + S2 > 0
-S + D - S2 - D2 >= 0
--D3 > 0
- more? S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D2 > 0
--S + S1 >= 0
--S + S2 >= 0
-S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S - S1 - D1 + D >= 0
- more? S1 - S2 - D3 > 0
-S + D - S2 - D3 >= 0
-S + D - S2 - D2 >= 0
-S1 - S2 - D2 > 0
--D3 > 0
--S + S1 >= 0
--S + S2 >= 0
-S - S1 - D1 + D >= 0
- more? no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int16 b/interfaces/Prolog/XSB/expected_clpq_int16
deleted file mode 100644
index 91ca9e6..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int16
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- R = 45
-O = 9
-M = 45
-D = 9
-N = 55
-E = 10
-S = 10
-Y = 8
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int16_a b/interfaces/Prolog/XSB/expected_clpq_int16_a
deleted file mode 100644
index 91ca9e6..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int16_a
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Negative overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- R = 45
-O = 9
-M = 45
-D = 9
-N = 55
-E = 10
-S = 10
-Y = 8
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int32 b/interfaces/Prolog/XSB/expected_clpq_int32
deleted file mode 100644
index bd1676d..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int32
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y =< 9
--E + Y >= 0
-E >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int32_a b/interfaces/Prolog/XSB/expected_clpq_int32_a
deleted file mode 100644
index bd1676d..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int32_a
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y =< 9
--E + Y >= 0
-E >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int64 b/interfaces/Prolog/XSB/expected_clpq_int64
deleted file mode 100644
index bd1676d..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int64
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y =< 9
--E + Y >= 0
-E >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int64_a b/interfaces/Prolog/XSB/expected_clpq_int64_a
deleted file mode 100644
index bd1676d..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int64_a
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y =< 9
--E + Y >= 0
-E >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int8 b/interfaces/Prolog/XSB/expected_clpq_int8
deleted file mode 100644
index 5bb478c..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int8
+++ /dev/null
@@ -1,29 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int8_a b/interfaces/Prolog/XSB/expected_clpq_int8_a
deleted file mode 100644
index 5bb478c..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_int8_a
+++ /dev/null
@@ -1,29 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- yes
-PPL clpq ?- 
-Error: an overflow has been detected by the PPL: Positive overflow.
-no
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_mpz b/interfaces/Prolog/XSB/expected_clpq_mpz
deleted file mode 100644
index bd1676d..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_mpz
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y =< 9
--E + Y >= 0
-E >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_mpz_a b/interfaces/Prolog/XSB/expected_clpq_mpz_a
deleted file mode 100644
index bd1676d..0000000
--- a/interfaces/Prolog/XSB/expected_clpq_mpz_a
+++ /dev/null
@@ -1,35 +0,0 @@
-\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
-this program is free software, covered by the GNU General Public License,\n\
-and you are welcome to change it and/or distribute copies of it\n\
-under certain conditions.\n\
-Type "copying" to see the conditions.\n\
-There is ABSOLUTELY NO WARRANTY for this program.\n\
-Type "warranty" for details.\nPPL clpq ?- yes
-PPL clpq ?- Z = 5
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 0
-Y - Z = -1
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 102
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y = 8
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- Y =< 9
--E + Y >= 0
-E >= 0
-M = 1
-E + D - Y = 0
-E - N = 0
-O = 0
-S = 9
-R = 0
- more? yes
-PPL clpq ?- yes
-PPL clpq ?- X = 10
- more? yes
-PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_pchk_int16 b/interfaces/Prolog/XSB/expected_pchk_int16
deleted file mode 100644
index 2bf7000..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int16
+++ /dev/null
@@ -1,3 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int16_a b/interfaces/Prolog/XSB/expected_pchk_int16_a
deleted file mode 100644
index 2bf7000..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int16_a
+++ /dev/null
@@ -1,3 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int32 b/interfaces/Prolog/XSB/expected_pchk_int32
deleted file mode 100644
index 2bf7000..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int32
+++ /dev/null
@@ -1,3 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int32_a b/interfaces/Prolog/XSB/expected_pchk_int32_a
deleted file mode 100644
index 2bf7000..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int32_a
+++ /dev/null
@@ -1,3 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int64 b/interfaces/Prolog/XSB/expected_pchk_int64
deleted file mode 100644
index d86bac9..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int64
+++ /dev/null
@@ -1 +0,0 @@
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int64_a b/interfaces/Prolog/XSB/expected_pchk_int64_a
deleted file mode 100644
index 2aed667..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int64_a
+++ /dev/null
@@ -1,3 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Positive overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int8 b/interfaces/Prolog/XSB/expected_pchk_int8
deleted file mode 100644
index b19de5d..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int8
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-
-Error: an overflow has been detected by the PPL: Positive overflow.
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int8_a b/interfaces/Prolog/XSB/expected_pchk_int8_a
deleted file mode 100644
index f6b1402..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_int8_a
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-
-Error: an overflow has been detected by the PPL: Positive overflow.
-
-Error: an overflow has been detected by the PPL: Positive overflow.
-
-Error: an overflow has been detected by the PPL: Negative overflow.
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_mpz b/interfaces/Prolog/XSB/expected_pchk_mpz
deleted file mode 100644
index d86bac9..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_mpz
+++ /dev/null
@@ -1 +0,0 @@
-OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_mpz_a b/interfaces/Prolog/XSB/expected_pchk_mpz_a
deleted file mode 100644
index d86bac9..0000000
--- a/interfaces/Prolog/XSB/expected_pchk_mpz_a
+++ /dev/null
@@ -1 +0,0 @@
-OK
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
new file mode 100644
index 0000000..201d19a
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
@@ -0,0 +1,45 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+
+dnl This m4 file generates the file ppl_xsb.H.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface: declarations.  -*- Prolog -*-
+m4_include(`ppl_interface_generator_copyright')
+*/
+
+:- export
+m4_divert(1)
+
+:- ldoption('-L../../../src/.libs -lppl -L../../../Watchdog/.libs -lpwl -lgmp -lgmpxx').
+
+m4_define(`m4_extension', `m4_ifelse($4, 0, `  $1/$2', `COMMA
+  $1/$2')')
+m4_divert(-1)
+
+m4_divert`'dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`.'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
new file mode 100644
index 0000000..2be5ff7
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
@@ -0,0 +1,118 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.cc.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+m4_divert(1)dnl
+
+#define XSB_ENTRY_0(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  return xsb_stub_##name(); \
+}
+
+#define XSB_ENTRY_1(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  return xsb_stub_##name(arg1); \
+}
+
+#define XSB_ENTRY_2(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  return xsb_stub_##name(arg1, arg2); \
+}
+
+#define XSB_ENTRY_3(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  return xsb_stub_##name(arg1, arg2, arg3); \
+}
+
+#define XSB_ENTRY_4(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4); \
+}
+
+#define XSB_ENTRY_5(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define XSB_ENTRY_6(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  Prolog_term_ref arg6 = reg_term(6); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+m4_divert(2)dnl
+
+extern "C" void
+init() {
+   ppl_initialize();
+}
+m4_divert`'dnl
+m4_define(`m4_extension', `#undef $1
+')dnl
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)
+
+m4_define(`m4_extension', `XSB_ENTRY_$2($1)
+')
+
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
new file mode 100644
index 0000000..204bd17
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
@@ -0,0 +1,38 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.cc.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_divert`'dnl
+m4_define(`m4_extension', `#define $1 xsb_stub_$1
+')dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
new file mode 100644
index 0000000..b85fc09
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
@@ -0,0 +1,86 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Ciao dependent code for xsb_predicate_check.pl.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface: XSB Prolog part for checking all predicates.
+m4_include(`ppl_interface_generator_copyright')
+*/
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+#include "ppl_predicate_check_main.pl"
+#include "ppl_predicate_check_common.pl"
+m4_divert(-1)
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns_in_string($1,
+                                  `#includeSPACE"../tests/ppl_predicate_check_ at CLASS@.pl"
+',
+                                  m4_pattern_list)`'dnl
+')`'dnl
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate #include declarations for all the classes.
+dnl -----------------------------------------------------------------
+dnl
+m4_divert
+m4_patsubst(m4_patsubst(m4_all_code, ` ', `'), SPACE, ` ')`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+m4_divert(1)
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+prolog_system('XSB').
+
+discontiguous(_).
+include(_).
+
+main :-
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl.
+
+:- main.
+m4_divert`'dnl
+m4_define(`m4_extension', `m4_ifelse($4, 0, , `COMMA
+')	  $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..deae2e7
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
@@ -0,0 +1,24 @@
+/* System-dependent part of the Prolog interfaces: stub for XSB.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "xsb_efli.hh"
+#include "ppl_xsb.hh"
diff --git a/interfaces/Prolog/XSB/ppl_xsb.H b/interfaces/Prolog/XSB/ppl_xsb.H
deleted file mode 100644
index 8ee38fb..0000000
--- a/interfaces/Prolog/XSB/ppl_xsb.H
+++ /dev/null
@@ -1,143 +0,0 @@
-/* XSB Prolog interface: declarations.  -*- Prolog -*-
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-:- export
-	ppl_version_major/1,
-	ppl_version_minor/1,
-	ppl_version_revision/1,
-	ppl_version_beta/1,
-	ppl_version/1,
-	ppl_banner/1,
-	ppl_max_space_dimension/1,
-	ppl_Coefficient_is_bounded/0,
-	ppl_Coefficient_max/1,
-	ppl_Coefficient_min/1,
-	ppl_initialize/0,
-	ppl_finalize/0,
-	ppl_set_timeout_exception_atom/1,
-	ppl_timeout_exception_atom/1,
-	ppl_set_timeout/1,
-	ppl_reset_timeout/0,
-	ppl_new_C_Polyhedron_from_space_dimension/3,
-	ppl_new_NNC_Polyhedron_from_space_dimension/3,
-	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
-	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
-	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
-	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
-	ppl_new_C_Polyhedron_from_constraints/2,
-	ppl_new_NNC_Polyhedron_from_constraints/2,
-	ppl_new_C_Polyhedron_from_generators/2,
-	ppl_new_NNC_Polyhedron_from_generators/2,
-	ppl_new_C_Polyhedron_from_bounding_box/2,
-	ppl_new_NNC_Polyhedron_from_bounding_box/2,
-	ppl_Polyhedron_swap/2,
-	ppl_delete_Polyhedron/1,
-	ppl_Polyhedron_space_dimension/2,
-	ppl_Polyhedron_affine_dimension/2,
-	ppl_Polyhedron_get_constraints/2,
-	ppl_Polyhedron_get_minimized_constraints/2,
-	ppl_Polyhedron_get_generators/2,
-	ppl_Polyhedron_get_minimized_generators/2,
-	ppl_Polyhedron_relation_with_constraint/3,
-	ppl_Polyhedron_relation_with_generator/3,
-        ppl_Polyhedron_get_bounding_box/3,
-	ppl_Polyhedron_is_empty/1,
-	ppl_Polyhedron_is_universe/1,
-	ppl_Polyhedron_is_bounded/1,
-	ppl_Polyhedron_bounds_from_above/2,
-	ppl_Polyhedron_bounds_from_below/2,
-	ppl_Polyhedron_maximize/5,
-	ppl_Polyhedron_maximize_with_point/6,
-	ppl_Polyhedron_minimize/5,
-	ppl_Polyhedron_minimize_with_point/6,
-        ppl_Polyhedron_is_topologically_closed/1,
-	ppl_Polyhedron_contains_Polyhedron/2,
-	ppl_Polyhedron_strictly_contains_Polyhedron/2,
-	ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
-        ppl_Polyhedron_equals_Polyhedron/2,
-	ppl_Polyhedron_OK/1,
-	ppl_Polyhedron_add_constraint/2,
-	ppl_Polyhedron_add_constraint_and_minimize/2,
-	ppl_Polyhedron_add_generator/2,
-	ppl_Polyhedron_add_generator_and_minimize/2,
-	ppl_Polyhedron_add_constraints/2,
-	ppl_Polyhedron_add_constraints_and_minimize/2,
-	ppl_Polyhedron_add_generators/2,
-	ppl_Polyhedron_add_generators_and_minimize/2,
-	ppl_Polyhedron_intersection_assign/2,
-	ppl_Polyhedron_intersection_assign_and_minimize/2,
-	ppl_Polyhedron_poly_hull_assign/2,
-	ppl_Polyhedron_poly_hull_assign_and_minimize/2,
-	ppl_Polyhedron_poly_difference_assign/2,
-	ppl_Polyhedron_affine_image/4,
-	ppl_Polyhedron_affine_preimage/4,
-	ppl_Polyhedron_bounded_affine_image/5,
-	ppl_Polyhedron_bounded_affine_preimage/5,
-	ppl_Polyhedron_generalized_affine_image/5,
-	ppl_Polyhedron_generalized_affine_preimage/5,
-	ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
-	ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
-	ppl_Polyhedron_time_elapse_assign/2,
-        ppl_Polyhedron_topological_closure_assign/1,
-	ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
-	ppl_Polyhedron_BHRZ03_widening_assign/2,
-	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
-	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
-	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
-	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
-	ppl_Polyhedron_H79_widening_assign_with_tokens/4,
-	ppl_Polyhedron_H79_widening_assign/2,
-	ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
-	ppl_Polyhedron_limited_H79_extrapolation_assign/3,
-	ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
-	ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
-	ppl_Polyhedron_add_space_dimensions_and_project/2,
-	ppl_Polyhedron_add_space_dimensions_and_embed/2,
-	ppl_Polyhedron_concatenate_assign/2,
-	ppl_Polyhedron_remove_space_dimensions/2,
-	ppl_Polyhedron_remove_higher_space_dimensions/2,
-	ppl_Polyhedron_expand_space_dimension/3,
-	ppl_Polyhedron_fold_space_dimensions/3,
-	ppl_Polyhedron_map_space_dimensions/2,
-	ppl_new_LP_Problem_trivial/1,
-	ppl_new_LP_Problem/4,
-	ppl_new_LP_Problem_from_LP_Problem/2,
-	ppl_LP_Problem_swap/2,
-	ppl_delete_LP_Problem/1,
-	ppl_LP_Problem_space_dimension/2,
-	ppl_LP_Problem_constraints/2,
-	ppl_LP_Problem_objective_function/2,
-	ppl_LP_Problem_optimization_mode/2,
-	ppl_LP_Problem_clear/1,
-	ppl_LP_Problem_add_constraint/2,
-	ppl_LP_Problem_add_constraints/2,
-	ppl_LP_Problem_set_objective_function/2,
-	ppl_LP_Problem_set_optimization_mode/2,
-	ppl_LP_Problem_is_satisfiable/1,
-	ppl_LP_Problem_solve/2,
-	ppl_LP_Problem_feasible_point/2,
-	ppl_LP_Problem_optimizing_point/2,
-	ppl_LP_Problem_optimal_value/3,
-	ppl_LP_Problem_evaluate_objective_function/4,
-	ppl_LP_Problem_OK/1.
-
-:- ldoption('-L../../../src/.libs -lppl -L../../../Watchdog/src/.libs -lpwl -lgmp -lgmpxx').
diff --git a/interfaces/Prolog/XSB/ppl_xsb.cc b/interfaces/Prolog/XSB/ppl_xsb.cc
deleted file mode 100644
index 41d06ff..0000000
--- a/interfaces/Prolog/XSB/ppl_xsb.cc
+++ /dev/null
@@ -1,834 +0,0 @@
-/* XSB Prolog interface: system-dependent part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "pwl.hh"
-#include <cinterf.h>
-
-// In XSB versions up to and including 2.7.1, <error_xsb.h> does not
-// come with the extern "C" wrapper.
-extern "C" {
-#include <error_xsb.h>
-}
-
-#include <cassert>
-
-typedef prolog_term Prolog_term_ref;
-typedef char* Prolog_atom;
-typedef xsbBool Prolog_foreign_return_type;
-
-namespace {
-
-const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
-const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
-
-} // namespace
-
-#include "../exceptions.hh"
-
-namespace PPL = Parma_Polyhedra_Library;
-
-namespace {
-
-/*!
-  True if and only if the Prolog engine supports unbounded integers.
-*/
-bool Prolog_has_unbounded_integers;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the minimum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_min_integer;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the maximum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_max_integer;
-
-/*!
-  Performs system-dependent initialization.
-*/
-void
-ppl_Prolog_sysdep_init() {
-  Prolog_has_unbounded_integers = false;
-  // XSB people claim XSB supports 32-bit integers.  However, experiments
-  // suggest this is not the case.
-  // See http://sourceforge.net/tracker/index.php?func=detail&aid=1400271&group_id=1176&atid=101176
-#if 0
-  Prolog_min_integer = -2147483647-1;
-  Prolog_max_integer = 2147483647;
-#else
-  Prolog_min_integer = -268435456;
-  Prolog_max_integer = 268435455;
-#endif
-}
-
-void
-ppl_Prolog_sysdep_deinit() {
-}
-
-/*!
-  Return a new term reference.
-*/
-inline Prolog_term_ref
-Prolog_new_term_ref() {
-  return p2p_new();
-}
-
-/*!
-  Make \p t be a reference to the same term referenced by \p u,
-  i.e., assign \p u to \p t.
-*/
-inline int
-Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
-  t = u;
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p l.
-*/
-inline int
-Prolog_put_long(Prolog_term_ref& t, long l) {
-  assert(is_var(t) == TRUE);
-  if (l < Prolog_min_integer || l > Prolog_max_integer)
-    throw PPL_integer_out_of_range(l);
-  return c2p_int(l, t) != FALSE;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p ul.
-*/
-inline int
-Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
-  assert(is_var(t) == TRUE);
-  if (ul > static_cast<unsigned long>(Prolog_max_integer))
-    throw PPL_integer_out_of_range(ul);
-  return c2p_int(ul, t) != FALSE;
-}
-
-/*!
-  Assign to \p t an atom whose name is given
-  by the null-terminated string \p s.
-*/
-inline int
-Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
-  assert(is_var(t) == TRUE);
-  // TODO: remove the const_cast when the XSB people fix cinterf.h.
-  return c2p_string(string_find(const_cast<char*>(s), 1), t) != FALSE;
-}
-
-/*!
-  Assign to \p t the Prolog atom \p a.
-*/
-inline int
-Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
-  assert(is_var(t) == TRUE);
-  return c2p_string(a, t) != FALSE;
-}
-
-/*!
-  Assign to \p t a term representing the address contained in \p p.
-*/
-inline int
-Prolog_put_address(Prolog_term_ref& t, void* p) {
-  assert(is_var(t) == TRUE);
-  return c2p_int(reinterpret_cast<long>(p), t) != FALSE;
-}
-
-/*!
-  Return an atom whose name is given by the null-terminated string \p s.
-*/
-Prolog_atom
-Prolog_atom_from_string(const char* s) {
-  // TODO: remove the const_cast when the XSB people fix cinterf.h.
-  return string_find(const_cast<char*>(s), 1);
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 1 with argument \p a1.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1) {
-  prolog_term new_compound = p2p_new();
-  c2p_functor(f, 1, new_compound);
-  p2p_unify(p2p_arg(new_compound, 1), a1);
-  t = new_compound;
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 2 with arguments \p a1 and \p a2.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2) {
-  prolog_term new_compound = p2p_new();
-  c2p_functor(f, 2, new_compound);
-  p2p_unify(p2p_arg(new_compound, 1), a1);
-  p2p_unify(p2p_arg(new_compound, 2), a2);
-  t = new_compound;
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 3 with arguments \p a1, \p a2 and \p a3.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3) {
-  prolog_term new_compound = p2p_new();
-  c2p_functor(f, 3, new_compound);
-  p2p_unify(p2p_arg(new_compound, 1), a1);
-  p2p_unify(p2p_arg(new_compound, 2), a2);
-  p2p_unify(p2p_arg(new_compound, 3), a3);
-  t = new_compound;
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3, Prolog_term_ref a4) {
-  prolog_term new_compound = p2p_new();
-  c2p_functor(f, 4, new_compound);
-  p2p_unify(p2p_arg(new_compound, 1), a1);
-  p2p_unify(p2p_arg(new_compound, 2), a2);
-  p2p_unify(p2p_arg(new_compound, 3), a3);
-  p2p_unify(p2p_arg(new_compound, 4), a4);
-  t = new_compound;
-  return 1;
-}
-
-/*!
-  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
-*/
-inline int
-Prolog_construct_cons(Prolog_term_ref& c,
-		      Prolog_term_ref h, Prolog_term_ref t) {
-  prolog_term new_cons = p2p_new();
-  c2p_list(new_cons);
-  p2p_unify(p2p_car(new_cons), h);
-  p2p_unify(p2p_cdr(new_cons), t);
-  c = new_cons;
-  return 1;
-}
-
-/*!
-  Raise a Prolog exception with \p t as the exception term.
-*/
-inline void
-Prolog_raise_exception(Prolog_term_ref t) {
-  xsb_throw(t);
-}
-
-/*!
-  Return true if \p t is a Prolog variable, false otherwise.
-*/
-inline int
-Prolog_is_variable(Prolog_term_ref t) {
-  return is_var(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog atom, false otherwise.
-*/
-inline int
-Prolog_is_atom(Prolog_term_ref t) {
-  return is_string(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog integer, false otherwise.
-*/
-inline int
-Prolog_is_integer(Prolog_term_ref t) {
-  return is_int(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is the representation of an address, false otherwise.
-*/
-inline int
-Prolog_is_address(Prolog_term_ref t) {
-  return is_int(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog compound term, false otherwise.
-*/
-inline int
-Prolog_is_compound(Prolog_term_ref t) {
-  return is_functor(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog list, false otherwise.
-*/
-inline int
-Prolog_is_cons(Prolog_term_ref t) {
-  return is_list(t) != FALSE;
-}
-
-/*!
-  Assuming \p t is a Prolog integer, return true if its value fits
-  in a long, in which case the value is assigned to \p v,
-  return false otherwise.  The behavior is undefined if \p t is
-  not a Prolog integer.
-*/
-inline int
-Prolog_get_long(Prolog_term_ref t, long* lp) {
-  assert(Prolog_is_integer(t));
-  *lp = p2c_int(t);
-  return 1;
-}
-
-/*!
-  If \p t is the Prolog representation for a memory address, return
-  true and store that address into \p v; return false otherwise.
-  The behavior is undefined if \p t is not an address.
-*/
-inline int
-Prolog_get_address(Prolog_term_ref t, void** vpp) {
-  assert(Prolog_is_address(t));
-  *vpp = reinterpret_cast<void*>(p2c_int(t));
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog atom, return true and store its name into \p name.
-  The behavior is undefined if \p t is not a Prolog atom.
-*/
-inline int
-Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
-  assert(Prolog_is_atom(t));
-  *ap = p2c_string(t);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term, return true and store its name
-  and arity into \p name and \p arity, respectively.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
-  assert(Prolog_is_compound(t));
-  *ap = p2c_functor(t);
-  *ip = p2c_arity(t);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term and \p i is a positive integer
-  less than or equal to its arity, return true and assign to \p a the
-  i-th (principal) argument of \p t.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
-  assert(Prolog_is_compound(t));
-  a = p2p_arg(t, i);
-  return 1;
-}
-
-/*!
-  If \p c is a Prolog cons (list constructor), assign its head and
-  tail to \p h and \p t, respectively.
-  The behavior is undefined if \p c is not a Prolog cons.
-*/
-inline int
-Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
-  assert(Prolog_is_cons(c));
-  h = p2p_car(c);
-  t = p2p_cdr(c);
-  return 1;
-}
-
-/*!
-  Unify the terms referenced by \p t and \p u and return true
-  if the unification is successful; return false otherwise.
-*/
-inline int
-Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
-  return p2p_unify(t, u) != FALSE;
- }
-
-PPL::Coefficient
-integer_term_to_Coefficient(Prolog_term_ref t) {
-  // XSB supports only 32-bit integers.
-  long v;
-  Prolog_get_long(t, &v);
-  return PPL::Coefficient(v);
-}
-
-Prolog_term_ref
-Coefficient_to_integer_term(const PPL::Coefficient& n) {
-  long l = 0;
-  if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) != PPL::V_EQ)
-    throw PPL_integer_out_of_range(n);
-  Prolog_term_ref t = p2p_new();
-  Prolog_put_long(t, l);
-  return t;
-}
-
-} // namespace
-
-#define ppl_version_major xsb_stub_ppl_version_major
-#define ppl_version_minor xsb_stub_ppl_version_minor
-#define ppl_version_revision xsb_stub_ppl_version_revision
-#define ppl_version_beta xsb_stub_ppl_version_beta
-#define ppl_version xsb_stub_ppl_version
-#define ppl_banner xsb_stub_ppl_banner
-#define ppl_max_space_dimension xsb_stub_ppl_max_space_dimension
-#define ppl_Coefficient_is_bounded xsb_stub_ppl_Coefficient_is_bounded
-#define ppl_Coefficient_max xsb_stub_ppl_Coefficient_max
-#define ppl_Coefficient_min xsb_stub_ppl_Coefficient_min
-#define ppl_initialize xsb_stub_ppl_initialize
-#define ppl_finalize xsb_stub_ppl_finalize
-#define ppl_set_timeout_exception_atom xsb_stub_ppl_set_timeout_exception_atom
-#define ppl_timeout_exception_atom xsb_stub_ppl_timeout_exception_atom
-#define ppl_set_timeout xsb_stub_ppl_set_timeout
-#define ppl_reset_timeout xsb_stub_ppl_reset_timeout
-#define ppl_new_C_Polyhedron_from_space_dimension xsb_stub_ppl_new_C_Polyhedron_from_space_dimension
-#define ppl_new_NNC_Polyhedron_from_space_dimension xsb_stub_ppl_new_NNC_Polyhedron_from_space_dimension
-#define ppl_new_C_Polyhedron_from_C_Polyhedron xsb_stub_ppl_new_C_Polyhedron_from_C_Polyhedron
-#define ppl_new_C_Polyhedron_from_NNC_Polyhedron xsb_stub_ppl_new_C_Polyhedron_from_NNC_Polyhedron
-#define ppl_new_NNC_Polyhedron_from_C_Polyhedron xsb_stub_ppl_new_NNC_Polyhedron_from_C_Polyhedron
-#define ppl_new_NNC_Polyhedron_from_NNC_Polyhedron xsb_stub_ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
-#define ppl_new_C_Polyhedron_from_constraints xsb_stub_ppl_new_C_Polyhedron_from_constraints
-#define ppl_new_NNC_Polyhedron_from_constraints xsb_stub_ppl_new_NNC_Polyhedron_from_constraints
-#define ppl_new_C_Polyhedron_from_generators xsb_stub_ppl_new_C_Polyhedron_from_generators
-#define ppl_new_NNC_Polyhedron_from_generators xsb_stub_ppl_new_NNC_Polyhedron_from_generators
-#define ppl_new_C_Polyhedron_from_bounding_box xsb_stub_ppl_new_C_Polyhedron_from_bounding_box
-#define ppl_new_NNC_Polyhedron_from_bounding_box xsb_stub_ppl_new_NNC_Polyhedron_from_bounding_box
-#define ppl_Polyhedron_swap xsb_stub_ppl_Polyhedron_swap
-#define ppl_delete_Polyhedron xsb_stub_ppl_delete_Polyhedron
-#define ppl_Polyhedron_space_dimension xsb_stub_ppl_Polyhedron_space_dimension
-#define ppl_Polyhedron_affine_dimension xsb_stub_ppl_Polyhedron_affine_dimension
-#define ppl_Polyhedron_get_constraints xsb_stub_ppl_Polyhedron_get_constraints
-#define ppl_Polyhedron_get_minimized_constraints xsb_stub_ppl_Polyhedron_get_minimized_constraints
-#define ppl_Polyhedron_get_generators xsb_stub_ppl_Polyhedron_get_generators
-#define ppl_Polyhedron_get_minimized_generators xsb_stub_ppl_Polyhedron_get_minimized_generators
-#define ppl_Polyhedron_relation_with_constraint xsb_stub_ppl_Polyhedron_relation_with_constraint
-#define ppl_Polyhedron_relation_with_generator xsb_stub_ppl_Polyhedron_relation_with_generator
-#define ppl_Polyhedron_get_bounding_box xsb_stub_ppl_Polyhedron_get_bounding_box
-#define ppl_Polyhedron_is_empty xsb_stub_ppl_Polyhedron_is_empty
-#define ppl_Polyhedron_is_universe xsb_stub_ppl_Polyhedron_is_universe
-#define ppl_Polyhedron_is_bounded xsb_stub_ppl_Polyhedron_is_bounded
-#define ppl_Polyhedron_bounds_from_above xsb_stub_ppl_Polyhedron_bounds_from_above
-#define ppl_Polyhedron_bounds_from_below xsb_stub_ppl_Polyhedron_bounds_from_below
-#define ppl_Polyhedron_maximize xsb_stub_ppl_Polyhedron_maximize
-#define ppl_Polyhedron_maximize_with_point xsb_stub_ppl_Polyhedron_maximize_with_point
-#define ppl_Polyhedron_minimize xsb_stub_ppl_Polyhedron_minimize
-#define ppl_Polyhedron_minimize_with_point xsb_stub_ppl_Polyhedron_minimize_with_point
-#define ppl_Polyhedron_is_topologically_closed xsb_stub_ppl_Polyhedron_is_topologically_closed
-#define ppl_Polyhedron_contains_Polyhedron xsb_stub_ppl_Polyhedron_contains_Polyhedron
-#define ppl_Polyhedron_strictly_contains_Polyhedron xsb_stub_ppl_Polyhedron_strictly_contains_Polyhedron
-#define ppl_Polyhedron_is_disjoint_from_Polyhedron xsb_stub_ppl_Polyhedron_is_disjoint_from_Polyhedron
-#define ppl_Polyhedron_equals_Polyhedron xsb_stub_ppl_Polyhedron_equals_Polyhedron
-#define ppl_Polyhedron_OK xsb_stub_ppl_Polyhedron_OK
-#define ppl_Polyhedron_add_constraint xsb_stub_ppl_Polyhedron_add_constraint
-#define ppl_Polyhedron_add_constraint_and_minimize xsb_stub_ppl_Polyhedron_add_constraint_and_minimize
-#define ppl_Polyhedron_add_generator xsb_stub_ppl_Polyhedron_add_generator
-#define ppl_Polyhedron_add_generator_and_minimize xsb_stub_ppl_Polyhedron_add_generator_and_minimize
-#define ppl_Polyhedron_add_constraints xsb_stub_ppl_Polyhedron_add_constraints
-#define ppl_Polyhedron_add_constraints_and_minimize xsb_stub_ppl_Polyhedron_add_constraints_and_minimize
-#define ppl_Polyhedron_add_generators xsb_stub_ppl_Polyhedron_add_generators
-#define ppl_Polyhedron_add_generators_and_minimize xsb_stub_ppl_Polyhedron_add_generators_and_minimize
-#define ppl_Polyhedron_intersection_assign xsb_stub_ppl_Polyhedron_intersection_assign
-#define ppl_Polyhedron_intersection_assign_and_minimize xsb_stub_ppl_Polyhedron_intersection_assign_and_minimize
-#define ppl_Polyhedron_poly_hull_assign xsb_stub_ppl_Polyhedron_poly_hull_assign
-#define ppl_Polyhedron_poly_hull_assign_and_minimize xsb_stub_ppl_Polyhedron_poly_hull_assign_and_minimize
-#define ppl_Polyhedron_poly_difference_assign xsb_stub_ppl_Polyhedron_poly_difference_assign
-#define ppl_Polyhedron_affine_image xsb_stub_ppl_Polyhedron_affine_image
-#define ppl_Polyhedron_affine_preimage xsb_stub_ppl_Polyhedron_affine_preimage
-#define ppl_Polyhedron_bounded_affine_image xsb_stub_ppl_Polyhedron_bounded_affine_image
-#define ppl_Polyhedron_bounded_affine_preimage xsb_stub_ppl_Polyhedron_bounded_affine_preimage
-#define ppl_Polyhedron_generalized_affine_image xsb_stub_ppl_Polyhedron_generalized_affine_image
-#define ppl_Polyhedron_generalized_affine_preimage xsb_stub_ppl_Polyhedron_generalized_affine_preimage
-#define ppl_Polyhedron_generalized_affine_image_lhs_rhs xsb_stub_ppl_Polyhedron_generalized_affine_image_lhs_rhs
-#define ppl_Polyhedron_generalized_affine_preimage_lhs_rhs xsb_stub_ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
-#define ppl_Polyhedron_time_elapse_assign xsb_stub_ppl_Polyhedron_time_elapse_assign
-#define ppl_Polyhedron_topological_closure_assign xsb_stub_ppl_Polyhedron_topological_closure_assign
-#define ppl_Polyhedron_BHRZ03_widening_assign_with_tokens xsb_stub_ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
-#define ppl_Polyhedron_BHRZ03_widening_assign xsb_stub_ppl_Polyhedron_BHRZ03_widening_assign
-#define ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
-#define ppl_Polyhedron_limited_BHRZ03_extrapolation_assign xsb_stub_ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
-#define ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
-#define ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign xsb_stub_ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
-#define ppl_Polyhedron_H79_widening_assign_with_tokens xsb_stub_ppl_Polyhedron_H79_widening_assign_with_tokens
-#define ppl_Polyhedron_H79_widening_assign xsb_stub_ppl_Polyhedron_H79_widening_assign
-#define ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
-#define ppl_Polyhedron_limited_H79_extrapolation_assign xsb_stub_ppl_Polyhedron_limited_H79_extrapolation_assign
-#define ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
-#define ppl_Polyhedron_bounded_H79_extrapolation_assign xsb_stub_ppl_Polyhedron_bounded_H79_extrapolation_assign
-#define ppl_Polyhedron_add_space_dimensions_and_project xsb_stub_ppl_Polyhedron_add_space_dimensions_and_project
-#define ppl_Polyhedron_add_space_dimensions_and_embed xsb_stub_ppl_Polyhedron_add_space_dimensions_and_embed
-#define ppl_Polyhedron_concatenate_assign xsb_stub_ppl_Polyhedron_concatenate_assign
-#define ppl_Polyhedron_remove_space_dimensions xsb_stub_ppl_Polyhedron_remove_space_dimensions
-#define ppl_Polyhedron_remove_higher_space_dimensions xsb_stub_ppl_Polyhedron_remove_higher_space_dimensions
-#define ppl_Polyhedron_expand_space_dimension xsb_stub_ppl_Polyhedron_expand_space_dimension
-#define ppl_Polyhedron_fold_space_dimensions xsb_stub_ppl_Polyhedron_fold_space_dimensions
-#define ppl_Polyhedron_map_space_dimensions xsb_stub_ppl_Polyhedron_map_space_dimensions
-#define ppl_new_LP_Problem_trivial xsb_stub_ppl_new_LP_Problem_trivial
-#define ppl_new_LP_Problem xsb_stub_ppl_new_LP_Problem
-#define ppl_new_LP_Problem_from_LP_Problem xsb_stub_ppl_new_LP_Problem_from_LP_Problem
-#define ppl_LP_Problem_swap xsb_stub_ppl_LP_Problem_swap
-#define ppl_delete_LP_Problem xsb_stub_ppl_delete_LP_Problem
-#define ppl_LP_Problem_space_dimension xsb_stub_ppl_LP_Problem_space_dimension
-#define ppl_LP_Problem_constraints xsb_stub_ppl_LP_Problem_constraints
-#define ppl_LP_Problem_objective_function xsb_stub_ppl_LP_Problem_objective_function
-#define ppl_LP_Problem_optimization_mode xsb_stub_ppl_LP_Problem_optimization_mode
-#define ppl_LP_Problem_clear xsb_stub_ppl_LP_Problem_clear
-#define ppl_LP_Problem_add_constraint xsb_stub_ppl_LP_Problem_add_constraint
-#define ppl_LP_Problem_add_constraints xsb_stub_ppl_LP_Problem_add_constraints
-#define ppl_LP_Problem_set_objective_function xsb_stub_ppl_LP_Problem_set_objective_function
-#define ppl_LP_Problem_set_optimization_mode xsb_stub_ppl_LP_Problem_set_optimization_mode
-#define ppl_LP_Problem_is_satisfiable xsb_stub_ppl_LP_Problem_is_satisfiable
-#define ppl_LP_Problem_solve xsb_stub_ppl_LP_Problem_solve
-#define ppl_LP_Problem_feasible_point xsb_stub_ppl_LP_Problem_feasible_point
-#define ppl_LP_Problem_optimizing_point xsb_stub_ppl_LP_Problem_optimizing_point
-#define ppl_LP_Problem_optimal_value xsb_stub_ppl_LP_Problem_optimal_value
-#define ppl_LP_Problem_evaluate_objective_function xsb_stub_ppl_LP_Problem_evaluate_objective_function
-#define ppl_LP_Problem_OK xsb_stub_ppl_LP_Problem_OK
-
-#include "../ppl_prolog.icc"
-
-#undef ppl_version_major
-#undef ppl_version_minor
-#undef ppl_version_revision
-#undef ppl_version_beta
-#undef ppl_version
-#undef ppl_banner
-#undef ppl_max_space_dimension
-#undef ppl_Coefficient_is_bounded
-#undef ppl_Coefficient_max
-#undef ppl_Coefficient_min
-#undef ppl_initialize
-#undef ppl_finalize
-#undef ppl_set_timeout_exception_atom
-#undef ppl_timeout_exception_atom
-#undef ppl_set_timeout
-#undef ppl_reset_timeout
-#undef ppl_new_C_Polyhedron_from_space_dimension
-#undef ppl_new_NNC_Polyhedron_from_space_dimension
-#undef ppl_new_C_Polyhedron_from_C_Polyhedron
-#undef ppl_new_C_Polyhedron_from_NNC_Polyhedron
-#undef ppl_new_NNC_Polyhedron_from_C_Polyhedron
-#undef ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
-#undef ppl_new_C_Polyhedron_from_constraints
-#undef ppl_new_NNC_Polyhedron_from_constraints
-#undef ppl_new_C_Polyhedron_from_generators
-#undef ppl_new_NNC_Polyhedron_from_generators
-#undef ppl_new_C_Polyhedron_from_bounding_box
-#undef ppl_new_NNC_Polyhedron_from_bounding_box
-#undef ppl_Polyhedron_swap
-#undef ppl_delete_Polyhedron
-#undef ppl_Polyhedron_space_dimension
-#undef ppl_Polyhedron_affine_dimension
-#undef ppl_Polyhedron_get_constraints
-#undef ppl_Polyhedron_get_minimized_constraints
-#undef ppl_Polyhedron_get_generators
-#undef ppl_Polyhedron_get_minimized_generators
-#undef ppl_Polyhedron_relation_with_constraint
-#undef ppl_Polyhedron_relation_with_generator
-#undef ppl_Polyhedron_get_bounding_box
-#undef ppl_Polyhedron_is_empty
-#undef ppl_Polyhedron_is_universe
-#undef ppl_Polyhedron_is_bounded
-#undef ppl_Polyhedron_bounds_from_above
-#undef ppl_Polyhedron_bounds_from_below
-#undef ppl_Polyhedron_maximize
-#undef ppl_Polyhedron_maximize_with_point
-#undef ppl_Polyhedron_minimize
-#undef ppl_Polyhedron_minimize_with_point
-#undef ppl_Polyhedron_is_topologically_closed
-#undef ppl_Polyhedron_contains_Polyhedron
-#undef ppl_Polyhedron_strictly_contains_Polyhedron
-#undef ppl_Polyhedron_is_disjoint_from_Polyhedron
-#undef ppl_Polyhedron_equals_Polyhedron
-#undef ppl_Polyhedron_OK
-#undef ppl_Polyhedron_add_constraint
-#undef ppl_Polyhedron_add_constraint_and_minimize
-#undef ppl_Polyhedron_add_generator
-#undef ppl_Polyhedron_add_generator_and_minimize
-#undef ppl_Polyhedron_add_constraints
-#undef ppl_Polyhedron_add_constraints_and_minimize
-#undef ppl_Polyhedron_add_generators
-#undef ppl_Polyhedron_add_generators_and_minimize
-#undef ppl_Polyhedron_intersection_assign
-#undef ppl_Polyhedron_intersection_assign_and_minimize
-#undef ppl_Polyhedron_poly_hull_assign
-#undef ppl_Polyhedron_poly_hull_assign_and_minimize
-#undef ppl_Polyhedron_poly_difference_assign
-#undef ppl_Polyhedron_affine_image
-#undef ppl_Polyhedron_affine_preimage
-#undef ppl_Polyhedron_bounded_affine_image
-#undef ppl_Polyhedron_bounded_affine_preimage
-#undef ppl_Polyhedron_generalized_affine_image
-#undef ppl_Polyhedron_generalized_affine_preimage
-#undef ppl_Polyhedron_generalized_affine_image_lhs_rhs
-#undef ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
-#undef ppl_Polyhedron_time_elapse_assign
-#undef ppl_Polyhedron_topological_closure_assign
-#undef ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
-#undef ppl_Polyhedron_BHRZ03_widening_assign
-#undef ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
-#undef ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
-#undef ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
-#undef ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
-#undef ppl_Polyhedron_H79_widening_assign_with_tokens
-#undef ppl_Polyhedron_H79_widening_assign
-#undef ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
-#undef ppl_Polyhedron_limited_H79_extrapolation_assign
-#undef ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
-#undef ppl_Polyhedron_bounded_H79_extrapolation_assign
-#undef ppl_Polyhedron_add_space_dimensions_and_project
-#undef ppl_Polyhedron_add_space_dimensions_and_embed
-#undef ppl_Polyhedron_concatenate_assign
-#undef ppl_Polyhedron_remove_space_dimensions
-#undef ppl_Polyhedron_remove_higher_space_dimensions
-#undef ppl_Polyhedron_expand_space_dimension
-#undef ppl_Polyhedron_fold_space_dimensions
-#undef ppl_Polyhedron_map_space_dimensions
-#undef ppl_new_LP_Problem_trivial
-#undef ppl_new_LP_Problem
-#undef ppl_new_LP_Problem_from_LP_Problem
-#undef ppl_LP_Problem_swap
-#undef ppl_delete_LP_Problem
-#undef ppl_LP_Problem_space_dimension
-#undef ppl_LP_Problem_constraints
-#undef ppl_LP_Problem_objective_function
-#undef ppl_LP_Problem_optimization_mode
-#undef ppl_LP_Problem_clear
-#undef ppl_LP_Problem_add_constraint
-#undef ppl_LP_Problem_add_constraints
-#undef ppl_LP_Problem_set_objective_function
-#undef ppl_LP_Problem_set_optimization_mode
-#undef ppl_LP_Problem_is_satisfiable
-#undef ppl_LP_Problem_solve
-#undef ppl_LP_Problem_feasible_point
-#undef ppl_LP_Problem_optimizing_point
-#undef ppl_LP_Problem_optimal_value
-#undef ppl_LP_Problem_evaluate_objective_function
-#undef ppl_LP_Problem_OK
-
-#define XSB_ENTRY_0(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  return xsb_stub_##name(); \
-}
-
-#define XSB_ENTRY_1(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  Prolog_term_ref arg1 = reg_term(1); \
-  return xsb_stub_##name(arg1); \
-}
-
-#define XSB_ENTRY_2(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  Prolog_term_ref arg1 = reg_term(1); \
-  Prolog_term_ref arg2 = reg_term(2); \
-  return xsb_stub_##name(arg1, arg2); \
-}
-
-#define XSB_ENTRY_3(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  Prolog_term_ref arg1 = reg_term(1); \
-  Prolog_term_ref arg2 = reg_term(2); \
-  Prolog_term_ref arg3 = reg_term(3); \
-  return xsb_stub_##name(arg1, arg2, arg3); \
-}
-
-#define XSB_ENTRY_4(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  Prolog_term_ref arg1 = reg_term(1); \
-  Prolog_term_ref arg2 = reg_term(2); \
-  Prolog_term_ref arg3 = reg_term(3); \
-  Prolog_term_ref arg4 = reg_term(4); \
-  return xsb_stub_##name(arg1, arg2, arg3, arg4); \
-}
-
-#define XSB_ENTRY_5(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  Prolog_term_ref arg1 = reg_term(1); \
-  Prolog_term_ref arg2 = reg_term(2); \
-  Prolog_term_ref arg3 = reg_term(3); \
-  Prolog_term_ref arg4 = reg_term(4); \
-  Prolog_term_ref arg5 = reg_term(5); \
-  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5); \
-}
-
-#define XSB_ENTRY_6(name) \
-extern "C" Prolog_foreign_return_type \
-name() { \
-  Prolog_term_ref arg1 = reg_term(1); \
-  Prolog_term_ref arg2 = reg_term(2); \
-  Prolog_term_ref arg3 = reg_term(3); \
-  Prolog_term_ref arg4 = reg_term(4); \
-  Prolog_term_ref arg5 = reg_term(5); \
-  Prolog_term_ref arg6 = reg_term(6); \
-  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6); \
-}
-
-XSB_ENTRY_1(ppl_version_major)
-XSB_ENTRY_1(ppl_version_minor)
-XSB_ENTRY_1(ppl_version_revision)
-XSB_ENTRY_1(ppl_version_beta)
-XSB_ENTRY_1(ppl_version)
-XSB_ENTRY_1(ppl_banner)
-XSB_ENTRY_1(ppl_max_space_dimension)
-XSB_ENTRY_0(ppl_Coefficient_is_bounded)
-XSB_ENTRY_1(ppl_Coefficient_max)
-XSB_ENTRY_1(ppl_Coefficient_min)
-XSB_ENTRY_0(ppl_initialize)
-XSB_ENTRY_0(ppl_finalize)
-XSB_ENTRY_1(ppl_set_timeout_exception_atom)
-XSB_ENTRY_1(ppl_timeout_exception_atom)
-XSB_ENTRY_1(ppl_set_timeout)
-XSB_ENTRY_0(ppl_reset_timeout)
-XSB_ENTRY_3(ppl_new_C_Polyhedron_from_space_dimension)
-XSB_ENTRY_3(ppl_new_NNC_Polyhedron_from_space_dimension)
-XSB_ENTRY_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
-XSB_ENTRY_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
-XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
-XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
-XSB_ENTRY_2(ppl_new_C_Polyhedron_from_constraints)
-XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_constraints)
-XSB_ENTRY_2(ppl_new_C_Polyhedron_from_generators)
-XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_generators)
-XSB_ENTRY_2(ppl_new_C_Polyhedron_from_bounding_box)
-XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_bounding_box)
-XSB_ENTRY_2(ppl_Polyhedron_swap)
-XSB_ENTRY_1(ppl_delete_Polyhedron)
-XSB_ENTRY_2(ppl_Polyhedron_space_dimension)
-XSB_ENTRY_2(ppl_Polyhedron_affine_dimension)
-XSB_ENTRY_2(ppl_Polyhedron_get_constraints)
-XSB_ENTRY_2(ppl_Polyhedron_get_minimized_constraints)
-XSB_ENTRY_2(ppl_Polyhedron_get_generators)
-XSB_ENTRY_2(ppl_Polyhedron_get_minimized_generators)
-XSB_ENTRY_3(ppl_Polyhedron_relation_with_constraint)
-XSB_ENTRY_3(ppl_Polyhedron_relation_with_generator)
-XSB_ENTRY_3(ppl_Polyhedron_get_bounding_box)
-XSB_ENTRY_1(ppl_Polyhedron_is_empty)
-XSB_ENTRY_1(ppl_Polyhedron_is_universe)
-XSB_ENTRY_1(ppl_Polyhedron_is_bounded)
-XSB_ENTRY_2(ppl_Polyhedron_bounds_from_above)
-XSB_ENTRY_2(ppl_Polyhedron_bounds_from_below)
-XSB_ENTRY_5(ppl_Polyhedron_maximize)
-XSB_ENTRY_6(ppl_Polyhedron_maximize_with_point)
-XSB_ENTRY_5(ppl_Polyhedron_minimize)
-XSB_ENTRY_6(ppl_Polyhedron_minimize_with_point)
-XSB_ENTRY_1(ppl_Polyhedron_is_topologically_closed)
-XSB_ENTRY_2(ppl_Polyhedron_contains_Polyhedron)
-XSB_ENTRY_2(ppl_Polyhedron_strictly_contains_Polyhedron)
-XSB_ENTRY_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
-XSB_ENTRY_2(ppl_Polyhedron_equals_Polyhedron)
-XSB_ENTRY_1(ppl_Polyhedron_OK)
-XSB_ENTRY_2(ppl_Polyhedron_add_constraint)
-XSB_ENTRY_2(ppl_Polyhedron_add_constraint_and_minimize)
-XSB_ENTRY_2(ppl_Polyhedron_add_generator)
-XSB_ENTRY_2(ppl_Polyhedron_add_generator_and_minimize)
-XSB_ENTRY_2(ppl_Polyhedron_add_constraints)
-XSB_ENTRY_2(ppl_Polyhedron_add_constraints_and_minimize)
-XSB_ENTRY_2(ppl_Polyhedron_add_generators)
-XSB_ENTRY_2(ppl_Polyhedron_add_generators_and_minimize)
-XSB_ENTRY_2(ppl_Polyhedron_intersection_assign)
-XSB_ENTRY_2(ppl_Polyhedron_intersection_assign_and_minimize)
-XSB_ENTRY_2(ppl_Polyhedron_poly_hull_assign)
-XSB_ENTRY_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
-XSB_ENTRY_2(ppl_Polyhedron_poly_difference_assign)
-XSB_ENTRY_4(ppl_Polyhedron_affine_image)
-XSB_ENTRY_4(ppl_Polyhedron_affine_preimage)
-XSB_ENTRY_5(ppl_Polyhedron_bounded_affine_image)
-XSB_ENTRY_5(ppl_Polyhedron_bounded_affine_preimage)
-XSB_ENTRY_5(ppl_Polyhedron_generalized_affine_image)
-XSB_ENTRY_5(ppl_Polyhedron_generalized_affine_preimage)
-XSB_ENTRY_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
-XSB_ENTRY_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
-XSB_ENTRY_2(ppl_Polyhedron_time_elapse_assign)
-XSB_ENTRY_1(ppl_Polyhedron_topological_closure_assign)
-XSB_ENTRY_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
-XSB_ENTRY_2(ppl_Polyhedron_BHRZ03_widening_assign)
-XSB_ENTRY_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
-XSB_ENTRY_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
-XSB_ENTRY_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
-XSB_ENTRY_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
-XSB_ENTRY_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
-XSB_ENTRY_2(ppl_Polyhedron_H79_widening_assign)
-XSB_ENTRY_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
-XSB_ENTRY_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
-XSB_ENTRY_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
-XSB_ENTRY_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
-XSB_ENTRY_2(ppl_Polyhedron_add_space_dimensions_and_project)
-XSB_ENTRY_2(ppl_Polyhedron_add_space_dimensions_and_embed)
-XSB_ENTRY_2(ppl_Polyhedron_concatenate_assign)
-XSB_ENTRY_2(ppl_Polyhedron_remove_space_dimensions)
-XSB_ENTRY_2(ppl_Polyhedron_remove_higher_space_dimensions)
-XSB_ENTRY_3(ppl_Polyhedron_expand_space_dimension)
-XSB_ENTRY_3(ppl_Polyhedron_fold_space_dimensions)
-XSB_ENTRY_2(ppl_Polyhedron_map_space_dimensions)
-XSB_ENTRY_1(ppl_new_LP_Problem_trivial)
-XSB_ENTRY_4(ppl_new_LP_Problem)
-XSB_ENTRY_2(ppl_new_LP_Problem_from_LP_Problem)
-XSB_ENTRY_2(ppl_LP_Problem_swap)
-XSB_ENTRY_1(ppl_delete_LP_Problem)
-XSB_ENTRY_2(ppl_LP_Problem_space_dimension)
-XSB_ENTRY_2(ppl_LP_Problem_constraints)
-XSB_ENTRY_2(ppl_LP_Problem_objective_function)
-XSB_ENTRY_2(ppl_LP_Problem_optimization_mode)
-XSB_ENTRY_1(ppl_LP_Problem_clear)
-XSB_ENTRY_2(ppl_LP_Problem_add_constraint)
-XSB_ENTRY_2(ppl_LP_Problem_add_constraints)
-XSB_ENTRY_2(ppl_LP_Problem_set_objective_function)
-XSB_ENTRY_2(ppl_LP_Problem_set_optimization_mode)
-XSB_ENTRY_1(ppl_LP_Problem_is_satisfiable)
-XSB_ENTRY_2(ppl_LP_Problem_solve)
-XSB_ENTRY_2(ppl_LP_Problem_feasible_point)
-XSB_ENTRY_2(ppl_LP_Problem_optimizing_point)
-XSB_ENTRY_3(ppl_LP_Problem_optimal_value)
-XSB_ENTRY_4(ppl_LP_Problem_evaluate_objective_function)
-XSB_ENTRY_1(ppl_LP_Problem_OK)
-
-extern "C" void
-init() {
-  ppl_initialize();
-}
diff --git a/interfaces/Prolog/XSB/xsb_cfli.hh b/interfaces/Prolog/XSB/xsb_cfli.hh
new file mode 100644
index 0000000..4aaf22f
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_cfli.hh
@@ -0,0 +1,350 @@
+/* XSB Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PCFLI_xsb_cfli_hh
+#define PCFLI_xsb_cfli_hh 1
+
+#include <cinterf.h>
+
+// In XSB versions up to and including 2.7.1, <error_xsb.h> does not
+// come with the extern "C" wrapper.
+extern "C" {
+#include <error_xsb.h>
+}
+
+#include <cassert>
+
+typedef prolog_term Prolog_term_ref;
+typedef char* Prolog_atom;
+typedef xsbBool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+// XSB people claim XSB supports 32-bit integers.  However, experiments
+// suggest this is not the case.
+// See http://sourceforge.net/tracker/index.php?func=detail&aid=1400271&group_id=1176&atid=101176
+#if 0
+#define XSB_min_integer (-2147483647-1)
+#define XSB_max_integer  2147483647
+#else
+#define XSB_min_integer -268435456
+#define XSB_max_integer  268435455
+#endif
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return p2p_new();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  assert(is_var(t) == TRUE);
+  if (l < XSB_min_integer || l > XSB_max_integer)
+    return 0;
+  return c2p_int(l, t) != FALSE;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  assert(is_var(t) == TRUE);
+  if (ul > static_cast<unsigned long>(XSB_max_integer))
+    return 0;
+  return c2p_int(ul, t) != FALSE;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  assert(is_var(t) == TRUE);
+  return c2p_string(string_find(const_cast<char*>(s), 1), t) != FALSE;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  assert(is_var(t) == TRUE);
+  return c2p_string(a, t) != FALSE;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  assert(is_var(t) == TRUE);
+  return c2p_int(reinterpret_cast<long>(p), t) != FALSE;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return string_find(const_cast<char*>(s), 1);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 1, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 2, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 3, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  p2p_unify(p2p_arg(new_compound, 3), a3);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 4, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  p2p_unify(p2p_arg(new_compound, 3), a3);
+  p2p_unify(p2p_arg(new_compound, 4), a4);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  prolog_term new_cons = p2p_new();
+  c2p_list(new_cons);
+  p2p_unify(p2p_car(new_cons), h);
+  p2p_unify(p2p_cdr(new_cons), t);
+  c = new_cons;
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  xsb_throw(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return is_var(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return is_string(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return is_int(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return is_int(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return is_functor(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return is_list(t) != FALSE;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  *lp = p2c_int(t);
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = reinterpret_cast<void*>(p2c_int(t));
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = p2c_string(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  *ap = p2c_functor(t);
+  *ip = p2c_arity(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = p2p_arg(t, i);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = p2p_car(c);
+  t = p2p_cdr(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return p2p_unify(t, u) != FALSE;
+}
+
+
+
+#endif // !defined(PCFLI_xsb_cfli_hh)
diff --git a/interfaces/Prolog/XSB/xsb_clpq.P b/interfaces/Prolog/XSB/xsb_clpq.P
index b09b9fe..d697222 100644
--- a/interfaces/Prolog/XSB/xsb_clpq.P
+++ b/interfaces/Prolog/XSB/xsb_clpq.P
@@ -1,11 +1,11 @@
 /* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/XSB/xsb_clpq2.P b/interfaces/Prolog/XSB/xsb_clpq2.P
index fa976d6..1092cfa 100644
--- a/interfaces/Prolog/XSB/xsb_clpq2.P
+++ b/interfaces/Prolog/XSB/xsb_clpq2.P
@@ -1,11 +1,11 @@
 /* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/XSB/xsb_efli.cc b/interfaces/Prolog/XSB/xsb_efli.cc
new file mode 100644
index 0000000..6323839
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_efli.cc
@@ -0,0 +1,72 @@
+/* XSB extended foreign language interface: definitions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "xsb_efli.hh"
+#include "ppl_prolog_common.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = false;
+  Prolog_min_integer = XSB_min_integer;
+  Prolog_max_integer = XSB_max_integer;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  // XSB supports only 32-bit integers.
+  long l;
+  Prolog_get_long(t, &l);
+  n = l;
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  long l = 0;
+  if (assign_r(l, n, ROUND_NOT_NEEDED) != V_EQ)
+    throw PPL_integer_out_of_range(n);
+  return Prolog_put_long(t, l);
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  return Prolog_put_Coefficient(u, n) && Prolog_unify(t, u);
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/XSB/xsb_efli.hh b/interfaces/Prolog/XSB/xsb_efli.hh
new file mode 100644
index 0000000..582b7a9
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_efli.hh
@@ -0,0 +1,80 @@
+/* XSB extended foreign language interface: declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_xsb_efli_hh
+#define PPL_xsb_efli_hh 1
+
+#include "ppl.hh"
+#include "xsb_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_xsb_efli_hh)
diff --git a/interfaces/Prolog/XSB/xsb_pl_check.P b/interfaces/Prolog/XSB/xsb_pl_check.P
index 807ad36..9a853d3 100644
--- a/interfaces/Prolog/XSB/xsb_pl_check.P
+++ b/interfaces/Prolog/XSB/xsb_pl_check.P
@@ -1,11 +1,11 @@
 /* Prolog main program for the PPL/XSB-Prolog predicate checker.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -68,6 +68,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 	ppl_Polyhedron_is_empty/1,
 	ppl_Polyhedron_is_universe/1,
 	ppl_Polyhedron_is_bounded/1,
+	ppl_Polyhedron_contains_integer_point/1,
 	ppl_Polyhedron_bounds_from_above/2,
 	ppl_Polyhedron_bounds_from_below/2,
 	ppl_Polyhedron_maximize/5,
@@ -123,27 +124,33 @@ site: http://www.cs.unipr.it/ppl/ . */
 	ppl_Polyhedron_expand_space_dimension/3,
 	ppl_Polyhedron_fold_space_dimensions/3,
 	ppl_Polyhedron_map_space_dimensions/2,
-	ppl_new_LP_Problem_trivial/1,
-	ppl_new_LP_Problem/4,
-	ppl_new_LP_Problem_from_LP_Problem/2,
-	ppl_LP_Problem_swap/2,
-	ppl_delete_LP_Problem/1,
-        ppl_LP_Problem_space_dimension/2,
-        ppl_LP_Problem_constraints/2,
-        ppl_LP_Problem_objective_function/2,
-        ppl_LP_Problem_optimization_mode/2,
-        ppl_LP_Problem_clear/1,
-        ppl_LP_Problem_add_constraint/2,
-        ppl_LP_Problem_add_constraints/2,
-        ppl_LP_Problem_set_objective_function/2,
-        ppl_LP_Problem_set_optimization_mode/2,
-        ppl_LP_Problem_is_satisfiable/1,
-        ppl_LP_Problem_solve/2,
-        ppl_LP_Problem_feasible_point/2,
-        ppl_LP_Problem_optimizing_point/2,
-        ppl_LP_Problem_optimal_value/3,
-        ppl_LP_Problem_evaluate_objective_function/4,
-        ppl_LP_Problem_OK/1
+        ppl_Polyhedron_constrains/2,
+        ppl_Polyhedron_unconstrain_space_dimension/2,
+        ppl_Polyhedron_unconstrain_space_dimensions/2,
+	ppl_new_MIP_Problem_from_space_dimension/2,
+	ppl_new_MIP_Problem/5,
+	ppl_new_MIP_Problem_from_MIP_Problem/2,
+	ppl_MIP_Problem_swap/2,
+	ppl_delete_MIP_Problem/1,
+        ppl_MIP_Problem_space_dimension/2,
+        ppl_MIP_Problem_integer_space_dimensions/2,
+        ppl_MIP_Problem_constraints/2,
+        ppl_MIP_Problem_objective_function/2,
+        ppl_MIP_Problem_optimization_mode/2,
+        ppl_MIP_Problem_clear/1,
+        ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+        ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+        ppl_MIP_Problem_add_constraint/2,
+        ppl_MIP_Problem_add_constraints/2,
+        ppl_MIP_Problem_set_objective_function/2,
+        ppl_MIP_Problem_set_optimization_mode/2,
+        ppl_MIP_Problem_is_satisfiable/1,
+        ppl_MIP_Problem_solve/2,
+        ppl_MIP_Problem_feasible_point/2,
+        ppl_MIP_Problem_optimizing_point/2,
+        ppl_MIP_Problem_optimal_value/3,
+        ppl_MIP_Problem_evaluate_objective_function/4,
+        ppl_MIP_Problem_OK/1
    from ppl_xsb.
 
 :- [ppl_xsb].
diff --git a/interfaces/Prolog/YAP/Makefile.am b/interfaces/Prolog/YAP/Makefile.am
index 7a8740d..c37591c 100644
--- a/interfaces/Prolog/YAP/Makefile.am
+++ b/interfaces/Prolog/YAP/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,14 +20,50 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
+YAP_CFLI_FILES = yap_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_yap_cc.m4 \
+$(YAP_CFLI_FILES) \
+ppl_yap.pl \
+yap_clpq.pl \
+yap_clpq2.pl \
+yap_pl_check.pl \
+README.yap
 
 if BUILD_YAP_PROLOG_INTERFACE
+
+if BUILD_WATCHDOG_LIBRARY
+
+WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+
+endif BUILD_WATCHDOG_LIBRARY
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_yap_cc.m4
+
+ppl_yap.cc: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@
+
 if ENABLE_SHARED
 
 AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog/src \
+$(WATCHDOG_INCLUDE_OPTIONS) \
 @extra_includes@
 
 if NO_UNDEFINED
@@ -37,14 +73,47 @@ NO_UNDEFINED_FLAG = -no-undefined
 endif NO_UNDEFINED
 
 pkglib_LTLIBRARIES = ppl_yap.la
-ppl_yap_la_SOURCES = ppl_yap.cc
+
+ppl_yap_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+yap_efli.hh \
+yap_efli.cc
+
+nodist_ppl_yap_la_SOURCES = \
+ppl_yap.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_ppl_yap_la_SOURCES = \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Rational_Box.cc
+
 ppl_yap_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
 -lYap \
 $(top_builddir)/src/libppl.la \
-$(top_builddir)/Watchdog/src/libpwl.la \
+$(WATCHDOG_LIBRARY) \
 @extra_libraries@
 
-ppl_yap_la_LDFLAGS = $(NO_UNDEFINED_FLAG) -module -avoid-version
+ppl_yap_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+ppl_yap_la_LDFLAGS = \
+-no-undefined \
+-module \
+-avoid-version
+
+#$(NO_UNDEFINED_FLAG)
 
 pkglib_DATA = ppl_yap.pl
 
@@ -84,7 +153,7 @@ pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
 	echo "main." >script_pchk
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen ppl_yap.la \
 		yap -l $(srcdir)/yap_pl_check.pl \
 			<script_pchk >obtained_pchk
@@ -97,7 +166,7 @@ clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECT
 	cat $(srcdir)/../tests/script_clpq >>script_clpq
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen ppl_yap.la \
 		yap -l $(srcdir)/yap_clpq.pl \
 			<script_clpq >obtained_clpq
@@ -110,16 +179,19 @@ clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EX
 	cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
 	$(LIBTOOL) --mode=execute \
 		-dlopen ../../../src/libppl.la \
-		-dlopen ../../../Watchdog/src/libpwl.la \
+		$(WATCHDOG_DLOPEN) \
 		-dlopen ppl_yap.la \
 		yap -l $(srcdir)/yap_clpq2.pl \
 			<script_clpq2 >obtained_clpq2
 	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
 
+endif ENABLE_SHARED
+endif BUILD_YAP_PROLOG_INTERFACE
+
+DISTCLEANFILES = \
+ppl_yap.cc
+
 MOSTLYCLEANFILES = \
 script_clpq script_clpq2 script_pchk \
 obtained_clpq obtained_clpq2 obtained_pchk \
 $(CLPQ_TESTS)
-
-endif ENABLE_SHARED
-endif BUILD_YAP_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/YAP/Makefile.in b/interfaces/Prolog/YAP/Makefile.in
index d998ca5..defb628 100644
--- a/interfaces/Prolog/YAP/Makefile.in
+++ b/interfaces/Prolog/YAP/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/ppl/ .
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ host_triplet = @host@
 subdir = interfaces/Prolog/YAP
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -89,26 +96,42 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
 am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
 pkglibLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(pkglib_LTLIBRARIES)
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
-am__ppl_yap_la_SOURCES_DIST = ppl_yap.cc
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_OBJECTS = ppl_yap.lo
-ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS)
+am__ppl_yap_la_SOURCES_DIST = ppl_prolog_sysdep.hh yap_efli.hh \
+	yap_efli.cc
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_OBJECTS = yap_efli.lo
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at nodist_ppl_yap_la_OBJECTS = ppl_yap.lo \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ppl_prolog_common.lo
+ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS) \
+	$(nodist_ppl_yap_la_OBJECTS)
+ppl_yap_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(ppl_yap_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_rpath =  \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	-rpath \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(pkglibdir)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(ppl_yap_la_SOURCES)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(ppl_yap_la_SOURCES) $(nodist_ppl_yap_la_SOURCES) \
+	$(nodist_EXTRA_ppl_yap_la_SOURCES)
 DIST_SOURCES = $(am__ppl_yap_la_SOURCES_DIST)
 pkglibDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(pkglib_DATA)
@@ -116,39 +139,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -158,53 +160,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -213,56 +213,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -274,10 +248,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -286,41 +264,118 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
+YAP_CFLI_FILES = yap_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_yap_cc.m4 \
+$(YAP_CFLI_FILES) \
+ppl_yap.pl \
+yap_clpq.pl \
+yap_clpq2.pl \
+yap_pl_check.pl \
+README.yap
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE at WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE at WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE at WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE at WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@interface_generator_dependencies = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@ppl_interface_generator_yap_cc.m4
+
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at AM_CPPFLAGS = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_srcdir)/interfaces \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_srcdir)/interfaces/Prolog \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_buildir)/interfaces/Prolog \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/src \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/Watchdog/src \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_includes@
 
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_LTLIBRARIES = ppl_yap.la
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_SOURCES = ppl_yap.cc
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_SOURCES = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_prolog_sysdep.hh \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at yap_efli.hh \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at yap_efli.cc
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at nodist_ppl_yap_la_SOURCES = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_common.cc
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at nodist_EXTRA_ppl_yap_la_SOURCES = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_BD_Shape_double.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_BD_Shape_mpq_class.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_BD_Shape_mpz_class.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Double_Box.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Grid.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Octagonal_Shape_double.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Polyhedron.cc \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ../ppl_prolog_Rational_Box.cc
+
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LIBADD = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -lYap \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(WATCHDOG_LIBRARY) \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_libraries@
 
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LDFLAGS = $(NO_UNDEFINED_FLAG) -module -avoid-version
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_DEPENDENCIES = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LDFLAGS = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -no-undefined \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -module \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -avoid-version
+
+
+#$(NO_UNDEFINED_FLAG)
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_yap.pl
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_NONSTRICT = \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ack.clpq \
@@ -342,10 +397,13 @@ EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
 @ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
 @ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
 @ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at MOSTLYCLEANFILES = \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at script_clpq script_clpq2 script_pchk \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at obtained_clpq obtained_clpq2 obtained_pchk \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(CLPQ_TESTS)
+DISTCLEANFILES = \
+ppl_yap.cc
+
+MOSTLYCLEANFILES = \
+script_clpq script_clpq2 script_pchk \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS)
 
 all: all-am
 
@@ -382,21 +440,21 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-pkglibLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
 	done
 
 clean-pkglibLTLIBRARIES:
@@ -408,7 +466,7 @@ clean-pkglibLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 ppl_yap.la: $(ppl_yap_la_OBJECTS) $(ppl_yap_la_DEPENDENCIES) 
-	$(CXXLINK) $(am_ppl_yap_la_rpath) $(ppl_yap_la_LDFLAGS) $(ppl_yap_la_OBJECTS) $(ppl_yap_la_LIBADD) $(LIBS)
+	$(ppl_yap_la_LINK) $(am_ppl_yap_la_rpath) $(ppl_yap_la_OBJECTS) $(ppl_yap_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -416,41 +474,150 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_yap.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/yap_efli.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
 
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constrai [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-pkglibDATA: $(pkglib_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
 	@list='$(pkglib_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -471,8 +638,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -484,8 +651,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -495,13 +662,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -515,22 +681,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -549,7 +714,7 @@ check: check-am
 all-am: Makefile $(LTLIBRARIES) $(DATA)
 installdirs:
 	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -572,6 +737,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -585,7 +751,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -599,12 +765,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -625,23 +799,29 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am uninstall-pkglibDATA \
-	uninstall-pkglibLTLIBRARIES
+uninstall-am: uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
 	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-pkglibDATA \
-	install-pkglibLTLIBRARIES install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am \
-	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibDATA install-pkglibLTLIBRARIES install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
 
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@ppl_yap.cc: $(interface_generator_dependencies)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@	m4 --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@           $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@
 
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at check-local: pl_check_test clpq_test clpq2_test
 
@@ -649,7 +829,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	echo "main." >script_pchk
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		yap -l $(srcdir)/yap_pl_check.pl \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<script_pchk >obtained_pchk
@@ -662,7 +842,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cat $(srcdir)/../tests/script_clpq >>script_clpq
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		yap -l $(srcdir)/yap_clpq.pl \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<script_clpq >obtained_clpq
@@ -675,7 +855,7 @@ uninstall-am: uninstall-info-am uninstall-pkglibDATA \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
- at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(WATCHDOG_DLOPEN) \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		yap -l $(srcdir)/yap_clpq2.pl \
 @BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<script_clpq2 >obtained_clpq2
diff --git a/interfaces/Prolog/YAP/README.yap b/interfaces/Prolog/YAP/README.yap
new file mode 100644
index 0000000..fd92834
--- /dev/null
+++ b/interfaces/Prolog/YAP/README.yap
@@ -0,0 +1,11 @@
+The YAP Prolog interface to the PPL is available as a dynamically
+linked module.  Only YAP version 5.1.1 and following are supported.
+
+In order to dynamically load the library from YAP you should simply
+load `<prefix>/lib/ppl/ppl_yap.pl', where <prefix> is the root of your
+installation (`/usr' or `/usr/local' in most cases).  This will invoke
+`ppl_initialize/0' automatically; it is the programmer's
+responsibility to call `ppl_finalize/0' when the PPL library is no
+longer needed.  Notice that, for dynamic linking to work, you should
+have configured the library with the `--enable-shared' option (on most
+platforms this is the default).
diff --git a/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
new file mode 100644
index 0000000..754ab9d
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
@@ -0,0 +1,137 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_yap.cc.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* YAP Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define YAP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  return name(); \
+}
+
+#define YAP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  return name(arg1); \
+}
+
+#define YAP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  return name(arg1, arg2); \
+}
+
+#define YAP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  return name(arg1, arg2, arg3); \
+}
+
+#define YAP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  return name(arg1, arg2, arg3, arg4); \
+}
+
+#define YAP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define YAP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  Prolog_term_ref arg6 = YAP_ARG6; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+dnl
+dnl Place here YAP_STUB macros.
+dnl
+m4_divert(1)dnl
+
+#define YAP_USER_C_PREDICATE(name, arity) \
+ YAP_UserCPredicate(#name, reinterpret_cast<int(*)()>(yap_stub_##name), arity)
+
+extern "C" void
+init() {
+  ppl_initialize();
+
+dnl
+dnl Place here YAP_USER_C_PREDICATE macros.
+dnl
+m4_divert(2)dnl
+}
+dnl
+m4_divert`'dnl
+dnl
+dnl Redefine m4_extension to generate YAP stubs.
+dnl m4_extension(Predicate_Name, Arity)
+m4_define(`m4_extension', `dnl
+YAP_STUB_$2($1)
+')`'dnl
+dnl Generate stubs.
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)
+
+dnl Redefine m4_extension to generate YAP user predicates.
+dnl m4_extension(Predicate_Name, Arity)
+m4_define(`m4_extension', `dnl
+  YAP_USER_C_PREDICATE($1, $2);
+')
+
+dnl Generate user predicates.
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..64f8e0d
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
@@ -0,0 +1,23 @@
+/* System-dependent part of the Prolog interfaces: stub for YAP.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "yap_efli.hh"
diff --git a/interfaces/Prolog/YAP/ppl_yap.cc b/interfaces/Prolog/YAP/ppl_yap.cc
deleted file mode 100644
index 9bd77fb..0000000
--- a/interfaces/Prolog/YAP/ppl_yap.cc
+++ /dev/null
@@ -1,725 +0,0 @@
-/* YAP Prolog interface: system-dependent part.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "pwl.hh"
-#include <Yap/YapInterface.h>
-#include <cassert>
-#include <cassert>
-#include <climits>
-
-typedef YAP_Term Prolog_term_ref;
-typedef YAP_Atom Prolog_atom;
-typedef YAP_Bool Prolog_foreign_return_type;
-
-namespace {
-
-const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
-const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
-
-} // namespace
-
-#include "../exceptions.hh"
-
-namespace PPL = Parma_Polyhedra_Library;
-
-namespace {
-
-Prolog_atom a_throw;
-
-/*!
-  True if and only if the Prolog engine supports unbounded integers.
-*/
-bool Prolog_has_unbounded_integers;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the minimum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_min_integer;
-
-/*!
-  If \p Prolog_has_unbounded_integers is false, holds the maximum
-  integer value representable by a Prolog integer.
-  Holds zero otherwise.
-*/
-long Prolog_max_integer;
-
-/*!
-  Temporary used to communicate big integers between C++ and Prolog.
-*/
-mpz_class tmp_mpz_class;
-
-/*!
-  Performs system-dependent initialization.
-*/
-void
-ppl_Prolog_sysdep_init() {
-  Prolog_has_unbounded_integers = true;
-  Prolog_min_integer = 0;
-  Prolog_max_integer = 0;
-
-  a_throw = YAP_LookupAtom("throw");
-}
-
-/*!
-  Perform system-dependent de-itialization.
-*/
-void
-ppl_Prolog_sysdep_deinit() {
-}
-
-/*!
-  Return a new term reference.
-*/
-inline Prolog_term_ref
-Prolog_new_term_ref() {
-  return 0;
-}
-
-/*!
-  Make \p t be a reference to the same term referenced by \p u,
-  i.e., assign \p u to \p t.
-*/
-inline int
-Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
-  t = u;
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p l.
-*/
-inline int
-Prolog_put_long(Prolog_term_ref& t, long l) {
-  t = YAP_MkIntTerm(l);
-  return 1;
-}
-
-/*!
-  Assign to \p t a Prolog integer with value \p ul.
-*/
-inline int
-Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
-  if (ul <= LONG_MAX)
-    t = YAP_MkIntTerm(ul);
-  else {
-    tmp_mpz_class = ul;
-    t = YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
-  }
-  return 1;
-}
-
-/*!
-  Assign to \p t an atom whose name is given
-  by the null-terminated string \p s.
-*/
-inline int
-Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
-  t = YAP_MkAtomTerm(YAP_FullLookupAtom(s));
-  return 1;
-}
-
-/*!
-  Assign to \p t the Prolog atom \p a.
-*/
-inline int
-Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
-  t = YAP_MkAtomTerm(a);
-  return 1;
-}
-
-/*!
-  Assign to \p t a term representing the address contained in \p p.
-*/
-inline int
-Prolog_put_address(Prolog_term_ref& t, void* p) {
-  t = YAP_MkIntTerm(reinterpret_cast<long>(p));
-  return 1;
-}
-
-/*!
-  Return an atom whose name is given by the null-terminated string \p s.
-*/
-Prolog_atom
-Prolog_atom_from_string(const char* s) {
-  return YAP_FullLookupAtom(s);
-}
-
-Prolog_term_ref args[4];
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 1 with argument \p a1.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1) {
-  args[0] = a1;
-  t = YAP_MkApplTerm(YAP_MkFunctor(f, 1), 1, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 2 with arguments \p a1 and \p a2.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2) {
-  args[0] = a1;
-  args[1] = a2;
-  t = YAP_MkApplTerm(YAP_MkFunctor(f, 2), 2, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 3 with arguments \p a1, \p a2 and \p a3.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3) {
-  args[0] = a1;
-  args[1] = a2;
-  args[2] = a3;
-  t = YAP_MkApplTerm(YAP_MkFunctor(f, 3), 3, args);
-  return 1;
-}
-
-/*!
-  Assign to \p t a compound term whose principal functor is \p f
-  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
-*/
-inline int
-Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
-			  Prolog_term_ref a1, Prolog_term_ref a2,
-			  Prolog_term_ref a3, Prolog_term_ref a4) {
-  args[0] = a1;
-  args[1] = a2;
-  args[2] = a3;
-  args[3] = a4;
-  t = YAP_MkApplTerm(YAP_MkFunctor(f, 4), 4, args);
-  return 1;
-}
-
-/*!
-  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
-*/
-inline int
-Prolog_construct_cons(Prolog_term_ref& c,
-		      Prolog_term_ref h, Prolog_term_ref t) {
-  c = YAP_MkPairTerm(h, t);
-  return 1;
-}
-
-/*!
-  Raise a Prolog exception with \p t as the exception term.
-*/
-inline void
-Prolog_raise_exception(Prolog_term_ref t) {
-  YAP_Throw(t);
-}
-
-/*!
-  Return true if \p t is a Prolog variable, false otherwise.
-*/
-inline int
-Prolog_is_variable(Prolog_term_ref t) {
-  return YAP_IsVarTerm(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog atom, false otherwise.
-*/
-inline int
-Prolog_is_atom(Prolog_term_ref t) {
-  return YAP_IsAtomTerm(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog integer, false otherwise.
-*/
-inline int
-Prolog_is_integer(Prolog_term_ref t) {
-  return YAP_IsIntTerm(t) != FALSE || YAP_IsBigNumTerm(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is the representation of an address, false otherwise.
-*/
-inline int
-Prolog_is_address(Prolog_term_ref t) {
-  return YAP_IsIntTerm(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog compound term, false otherwise.
-*/
-inline int
-Prolog_is_compound(Prolog_term_ref t) {
-  return YAP_IsApplTerm(t) != FALSE;
-}
-
-/*!
-  Return true if \p t is a Prolog list, false otherwise.
-*/
-inline int
-Prolog_is_cons(Prolog_term_ref t) {
-  return YAP_IsPairTerm(t) != FALSE;
-}
-
-/*!
-  Assuming \p t is a Prolog integer, return true if its value fits
-  in a long, in which case the value is assigned to \p v,
-  return false otherwise.  The behavior is undefined if \p t is
-  not a Prolog integer.
-*/
-inline int
-Prolog_get_long(Prolog_term_ref t, long* lp) {
-  assert(Prolog_is_integer(t));
-  if (YAP_IsBigNumTerm(t) != FALSE) {
-    YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
-    if (tmp_mpz_class >= LONG_MIN && tmp_mpz_class <= LONG_MAX)
-      PPL::assign_r(*lp, tmp_mpz_class, PPL::ROUND_NOT_NEEDED);
-    else
-      return 0;
-  }
-  else
-    *lp = YAP_IntOfTerm(t);
-  return 1;
-}
-
-/*!
-  If \p t is the Prolog representation for a memory address, return
-  true and store that address into \p v; return false otherwise.
-  The behavior is undefined if \p t is not an address.
-*/
-inline int
-Prolog_get_address(Prolog_term_ref t, void** vpp) {
-  assert(Prolog_is_address(t));
-  *vpp = reinterpret_cast<void*>(YAP_IntOfTerm(t));
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog atom, return true and store its name into \p name.
-  The behavior is undefined if \p t is not a Prolog atom.
-*/
-inline int
-Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
-  assert(Prolog_is_atom(t));
-  *ap = YAP_AtomOfTerm(t);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term, return true and store its name
-  and arity into \p name and \p arity, respectively.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
-  assert(Prolog_is_compound(t));
-  YAP_Functor f = YAP_FunctorOfTerm(t);
-  *ap = YAP_NameOfFunctor(f);
-  *ip = YAP_ArityOfFunctor(f);
-  return 1;
-}
-
-/*!
-  If \p t is a Prolog compound term and \p i is a positive integer
-  less than or equal to its arity, return true and assign to \p a the
-  i-th (principal) argument of \p t.
-  The behavior is undefined if \p t is not a Prolog compound term.
-*/
-inline int
-Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
-  assert(Prolog_is_compound(t));
-  a = YAP_ArgOfTerm(i, t);
-  return 1;
-}
-
-/*!
-  If \p c is a Prolog cons (list constructor), assign its head and
-  tail to \p h and \p t, respectively.
-  The behavior is undefined if \p c is not a Prolog cons.
-*/
-inline int
-Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
-  assert(Prolog_is_cons(c));
-  h = YAP_HeadOfTerm(c);
-  t = YAP_TailOfTerm(c);
-  return 1;
-}
-
-/*!
-  Unify the terms referenced by \p t and \p u and return true
-  if the unification is successful; return false otherwise.
-*/
-inline int
-Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
-  return YAP_Unify(t, u) != FALSE;
-}
-
-PPL::Coefficient
-integer_term_to_Coefficient(Prolog_term_ref t) {
-  PPL::Coefficient n;
-  if (YAP_IsBigNumTerm(t) != FALSE) {
-    YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
-    n = tmp_mpz_class;
-  }
-  else
-    n = YAP_IntOfTerm(t);
-  return n;
-}
-
-Prolog_term_ref
-Coefficient_to_integer_term(const PPL::Coefficient& n) {
-  if (n >= LONG_MIN && n <= LONG_MAX) {
-    long l = 0;
-    PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED);
-    return YAP_MkIntTerm(l);
-  }
-  else {
-    PPL::assign_r(tmp_mpz_class, n, PPL::ROUND_NOT_NEEDED);
-    return YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
-  }
-}
-
-} // namespace
-
-#include "../ppl_prolog.icc"
-
-#define YAP_STUB_0(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  return name(); \
-}
-
-#define YAP_STUB_1(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  Prolog_term_ref arg1 = YAP_ARG1; \
-  return name(arg1); \
-}
-
-#define YAP_STUB_2(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  Prolog_term_ref arg1 = YAP_ARG1; \
-  Prolog_term_ref arg2 = YAP_ARG2; \
-  return name(arg1, arg2); \
-}
-
-#define YAP_STUB_3(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  Prolog_term_ref arg1 = YAP_ARG1; \
-  Prolog_term_ref arg2 = YAP_ARG2; \
-  Prolog_term_ref arg3 = YAP_ARG3; \
-  return name(arg1, arg2, arg3); \
-}
-
-#define YAP_STUB_4(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  Prolog_term_ref arg1 = YAP_ARG1; \
-  Prolog_term_ref arg2 = YAP_ARG2; \
-  Prolog_term_ref arg3 = YAP_ARG3; \
-  Prolog_term_ref arg4 = YAP_ARG4; \
-  return name(arg1, arg2, arg3, arg4); \
-}
-
-#define YAP_STUB_5(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  Prolog_term_ref arg1 = YAP_ARG1; \
-  Prolog_term_ref arg2 = YAP_ARG2; \
-  Prolog_term_ref arg3 = YAP_ARG3; \
-  Prolog_term_ref arg4 = YAP_ARG4; \
-  Prolog_term_ref arg5 = YAP_ARG5; \
-  return name(arg1, arg2, arg3, arg4, arg5); \
-}
-
-#define YAP_STUB_6(name) \
-extern "C" Prolog_foreign_return_type \
-yap_stub_##name() { \
-  Prolog_term_ref arg1 = YAP_ARG1; \
-  Prolog_term_ref arg2 = YAP_ARG2; \
-  Prolog_term_ref arg3 = YAP_ARG3; \
-  Prolog_term_ref arg4 = YAP_ARG4; \
-  Prolog_term_ref arg5 = YAP_ARG5; \
-  Prolog_term_ref arg6 = YAP_ARG6; \
-  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
-}
-
-YAP_STUB_1(ppl_version_major)
-YAP_STUB_1(ppl_version_minor)
-YAP_STUB_1(ppl_version_revision)
-YAP_STUB_1(ppl_version_beta)
-YAP_STUB_1(ppl_version)
-YAP_STUB_1(ppl_banner)
-YAP_STUB_1(ppl_max_space_dimension)
-YAP_STUB_0(ppl_Coefficient_is_bounded)
-YAP_STUB_1(ppl_Coefficient_max)
-YAP_STUB_1(ppl_Coefficient_min)
-YAP_STUB_0(ppl_initialize)
-YAP_STUB_0(ppl_finalize)
-YAP_STUB_1(ppl_set_timeout_exception_atom)
-YAP_STUB_1(ppl_timeout_exception_atom)
-YAP_STUB_1(ppl_set_timeout)
-YAP_STUB_0(ppl_reset_timeout)
-YAP_STUB_3(ppl_new_C_Polyhedron_from_space_dimension)
-YAP_STUB_3(ppl_new_NNC_Polyhedron_from_space_dimension)
-YAP_STUB_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
-YAP_STUB_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
-YAP_STUB_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
-YAP_STUB_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
-YAP_STUB_2(ppl_new_C_Polyhedron_from_constraints)
-YAP_STUB_2(ppl_new_NNC_Polyhedron_from_constraints)
-YAP_STUB_2(ppl_new_C_Polyhedron_from_generators)
-YAP_STUB_2(ppl_new_NNC_Polyhedron_from_generators)
-YAP_STUB_2(ppl_new_C_Polyhedron_from_bounding_box)
-YAP_STUB_2(ppl_new_NNC_Polyhedron_from_bounding_box)
-YAP_STUB_2(ppl_Polyhedron_swap)
-YAP_STUB_1(ppl_delete_Polyhedron)
-YAP_STUB_2(ppl_Polyhedron_space_dimension)
-YAP_STUB_2(ppl_Polyhedron_affine_dimension)
-YAP_STUB_2(ppl_Polyhedron_get_constraints)
-YAP_STUB_2(ppl_Polyhedron_get_minimized_constraints)
-YAP_STUB_2(ppl_Polyhedron_get_generators)
-YAP_STUB_2(ppl_Polyhedron_get_minimized_generators)
-YAP_STUB_3(ppl_Polyhedron_relation_with_constraint)
-YAP_STUB_3(ppl_Polyhedron_relation_with_generator)
-YAP_STUB_3(ppl_Polyhedron_get_bounding_box)
-YAP_STUB_1(ppl_Polyhedron_is_empty)
-YAP_STUB_1(ppl_Polyhedron_is_universe)
-YAP_STUB_1(ppl_Polyhedron_is_bounded)
-YAP_STUB_2(ppl_Polyhedron_bounds_from_above)
-YAP_STUB_2(ppl_Polyhedron_bounds_from_below)
-YAP_STUB_5(ppl_Polyhedron_maximize)
-YAP_STUB_6(ppl_Polyhedron_maximize_with_point)
-YAP_STUB_5(ppl_Polyhedron_minimize)
-YAP_STUB_6(ppl_Polyhedron_minimize_with_point)
-YAP_STUB_1(ppl_Polyhedron_is_topologically_closed)
-YAP_STUB_2(ppl_Polyhedron_contains_Polyhedron)
-YAP_STUB_2(ppl_Polyhedron_strictly_contains_Polyhedron)
-YAP_STUB_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
-YAP_STUB_2(ppl_Polyhedron_equals_Polyhedron)
-YAP_STUB_1(ppl_Polyhedron_OK)
-YAP_STUB_2(ppl_Polyhedron_add_constraint)
-YAP_STUB_2(ppl_Polyhedron_add_constraint_and_minimize)
-YAP_STUB_2(ppl_Polyhedron_add_generator)
-YAP_STUB_2(ppl_Polyhedron_add_generator_and_minimize)
-YAP_STUB_2(ppl_Polyhedron_add_constraints)
-YAP_STUB_2(ppl_Polyhedron_add_constraints_and_minimize)
-YAP_STUB_2(ppl_Polyhedron_add_generators)
-YAP_STUB_2(ppl_Polyhedron_add_generators_and_minimize)
-YAP_STUB_2(ppl_Polyhedron_intersection_assign)
-YAP_STUB_2(ppl_Polyhedron_intersection_assign_and_minimize)
-YAP_STUB_2(ppl_Polyhedron_poly_hull_assign)
-YAP_STUB_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
-YAP_STUB_2(ppl_Polyhedron_poly_difference_assign)
-YAP_STUB_4(ppl_Polyhedron_affine_image)
-YAP_STUB_4(ppl_Polyhedron_affine_preimage)
-YAP_STUB_5(ppl_Polyhedron_bounded_affine_image)
-YAP_STUB_5(ppl_Polyhedron_bounded_affine_preimage)
-YAP_STUB_5(ppl_Polyhedron_generalized_affine_image)
-YAP_STUB_5(ppl_Polyhedron_generalized_affine_preimage)
-YAP_STUB_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
-YAP_STUB_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
-YAP_STUB_2(ppl_Polyhedron_time_elapse_assign)
-YAP_STUB_1(ppl_Polyhedron_topological_closure_assign)
-YAP_STUB_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
-YAP_STUB_2(ppl_Polyhedron_BHRZ03_widening_assign)
-YAP_STUB_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
-YAP_STUB_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
-YAP_STUB_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
-YAP_STUB_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
-YAP_STUB_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
-YAP_STUB_2(ppl_Polyhedron_H79_widening_assign)
-YAP_STUB_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
-YAP_STUB_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
-YAP_STUB_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
-YAP_STUB_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
-YAP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_project)
-YAP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_embed)
-YAP_STUB_2(ppl_Polyhedron_concatenate_assign)
-YAP_STUB_2(ppl_Polyhedron_remove_space_dimensions)
-YAP_STUB_2(ppl_Polyhedron_remove_higher_space_dimensions)
-YAP_STUB_3(ppl_Polyhedron_expand_space_dimension)
-YAP_STUB_3(ppl_Polyhedron_fold_space_dimensions)
-YAP_STUB_2(ppl_Polyhedron_map_space_dimensions)
-YAP_STUB_1(ppl_new_LP_Problem_trivial)
-YAP_STUB_4(ppl_new_LP_Problem)
-YAP_STUB_2(ppl_new_LP_Problem_from_LP_Problem)
-YAP_STUB_2(ppl_LP_Problem_swap)
-YAP_STUB_1(ppl_delete_LP_Problem)
-YAP_STUB_2(ppl_LP_Problem_space_dimension)
-YAP_STUB_2(ppl_LP_Problem_constraints)
-YAP_STUB_2(ppl_LP_Problem_objective_function)
-YAP_STUB_2(ppl_LP_Problem_optimization_mode)
-YAP_STUB_1(ppl_LP_Problem_clear)
-YAP_STUB_2(ppl_LP_Problem_add_constraint)
-YAP_STUB_2(ppl_LP_Problem_add_constraints)
-YAP_STUB_2(ppl_LP_Problem_set_objective_function)
-YAP_STUB_2(ppl_LP_Problem_set_optimization_mode)
-YAP_STUB_1(ppl_LP_Problem_is_satisfiable)
-YAP_STUB_2(ppl_LP_Problem_solve)
-YAP_STUB_2(ppl_LP_Problem_feasible_point)
-YAP_STUB_2(ppl_LP_Problem_optimizing_point)
-YAP_STUB_3(ppl_LP_Problem_optimal_value)
-YAP_STUB_4(ppl_LP_Problem_evaluate_objective_function)
-YAP_STUB_1(ppl_LP_Problem_OK)
-
-#define YAP_USER_C_PREDICATE(name, arity) \
- YAP_UserCPredicate(#name, reinterpret_cast<int(*)()>(yap_stub_##name), arity)
-
-extern "C" void
-init() {
-  ppl_initialize();
-  YAP_USER_C_PREDICATE(ppl_version_major, 1);
-  YAP_USER_C_PREDICATE(ppl_version_minor, 1);
-  YAP_USER_C_PREDICATE(ppl_version_revision, 1);
-  YAP_USER_C_PREDICATE(ppl_version_beta, 1);
-  YAP_USER_C_PREDICATE(ppl_version, 1);
-  YAP_USER_C_PREDICATE(ppl_banner, 1);
-  YAP_USER_C_PREDICATE(ppl_max_space_dimension, 1);
-  YAP_USER_C_PREDICATE(ppl_Coefficient_is_bounded, 0);
-  YAP_USER_C_PREDICATE(ppl_Coefficient_max, 1);
-  YAP_USER_C_PREDICATE(ppl_Coefficient_min, 1);
-  YAP_USER_C_PREDICATE(ppl_initialize, 0);
-  YAP_USER_C_PREDICATE(ppl_finalize, 0);
-  YAP_USER_C_PREDICATE(ppl_set_timeout_exception_atom, 1);
-  YAP_USER_C_PREDICATE(ppl_timeout_exception_atom, 1);
-  YAP_USER_C_PREDICATE(ppl_set_timeout, 1);
-  YAP_USER_C_PREDICATE(ppl_reset_timeout, 0);
-  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_space_dimension, 3);
-  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_space_dimension, 3);
-  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_C_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_generators, 2);
-  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_generators, 2);
-  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_bounding_box, 2);
-  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_bounding_box, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_swap, 2);
-  YAP_USER_C_PREDICATE(ppl_delete_Polyhedron, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_space_dimension, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_dimension, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_minimized_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_generators, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_minimized_generators, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_relation_with_constraint, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_relation_with_generator, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_bounding_box, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_empty, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_universe, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_bounded, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounds_from_above, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounds_from_below, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_maximize, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_maximize_with_point, 6);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_minimize, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_minimize_with_point, 6);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_topologically_closed, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_contains_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_strictly_contains_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_equals_Polyhedron, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_OK, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraint, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraint_and_minimize, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generator, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generator_and_minimize, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraints_and_minimize, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generators, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generators_and_minimize, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_intersection_assign, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_intersection_assign_and_minimize, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_hull_assign, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_hull_assign_and_minimize, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_difference_assign, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_image, 4);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_preimage, 4);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_affine_image, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_affine_preimage, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_image, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_time_elapse_assign, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_topological_closure_assign, 1);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign, 2);
-  YAP_USER_C_PREDICATE(
-          ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3);
-  YAP_USER_C_PREDICATE(
-          ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_H79_widening_assign_with_tokens, 4);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_H79_widening_assign, 2);
-  YAP_USER_C_PREDICATE(
-          ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_limited_H79_extrapolation_assign, 3);
-  YAP_USER_C_PREDICATE(
-          ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_project, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_embed, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_concatenate_assign, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_remove_space_dimensions, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_remove_higher_space_dimensions, 2);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_expand_space_dimension, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_fold_space_dimensions, 3);
-  YAP_USER_C_PREDICATE(ppl_Polyhedron_map_space_dimensions, 2);
-  YAP_USER_C_PREDICATE(ppl_new_LP_Problem_trivial, 1);
-  YAP_USER_C_PREDICATE(ppl_new_LP_Problem, 4);
-  YAP_USER_C_PREDICATE(ppl_new_LP_Problem_from_LP_Problem, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_swap, 2);
-  YAP_USER_C_PREDICATE(ppl_delete_LP_Problem, 1);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_space_dimension, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_objective_function, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_optimization_mode, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_clear, 1);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_add_constraint, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_add_constraints, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_set_objective_function, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_set_optimization_mode, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_is_satisfiable, 1);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_solve, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_feasible_point, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_optimizing_point, 2);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_optimal_value, 3);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_evaluate_objective_function, 4);
-  YAP_USER_C_PREDICATE(ppl_LP_Problem_OK, 1);
-}
diff --git a/interfaces/Prolog/YAP/ppl_yap.pl b/interfaces/Prolog/YAP/ppl_yap.pl
index 2420b2a..ef1ee9a 100644
--- a/interfaces/Prolog/YAP/ppl_yap.pl
+++ b/interfaces/Prolog/YAP/ppl_yap.pl
@@ -1,11 +1,11 @@
 /* Loader for the YAP Prolog interface.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/YAP/yap_cfli.hh b/interfaces/Prolog/YAP/yap_cfli.hh
new file mode 100644
index 0000000..1bd027c
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_cfli.hh
@@ -0,0 +1,348 @@
+/* YAP Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PCFLI_yap_cfli_hh
+#define PCFLI_yap_cfli_hh 1
+
+#include <Yap/YapInterface.h>
+#include <cassert>
+#include <climits>
+#include <gmp.h>
+
+typedef YAP_Term Prolog_term_ref;
+typedef YAP_Atom Prolog_atom;
+typedef YAP_Bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  t = YAP_MkIntTerm(l);
+  return 1;
+}
+
+static int tmp_mpz_t_initialized = 0;
+static mpz_t tmp_mpz_t;
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul <= LONG_MAX)
+    t = YAP_MkIntTerm(ul);
+  else {
+    if (!tmp_mpz_t_initialized) {
+      mpz_init_set_ui(tmp_mpz_t, ul);
+      tmp_mpz_t_initialized = 1;
+    }
+    else
+      mpz_set_ui(tmp_mpz_t, ul);
+    t = YAP_MkBigNumTerm(tmp_mpz_t);
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = YAP_MkAtomTerm(YAP_FullLookupAtom(s));
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = YAP_MkAtomTerm(a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  assert(sizeof(long) >= sizeof(void*));
+  t = YAP_MkIntTerm(reinterpret_cast<long>(p));
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return YAP_FullLookupAtom(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  YAP_Term args[1];
+  args[0] = a1;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 1), 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  YAP_Term args[2];
+  args[0] = a1;
+  args[1] = a2;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 2), 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  YAP_Term args[3];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 3), 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  YAP_Term args[4];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 4), 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  c = YAP_MkPairTerm(h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  YAP_Throw(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return YAP_IsVarTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return YAP_IsAtomTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return YAP_IsIntTerm(t) != FALSE || YAP_IsBigNumTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return YAP_IsIntTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return YAP_IsApplTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return YAP_IsPairTerm(t) != FALSE;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  if (YAP_IsBigNumTerm(t) != FALSE) {
+    if (!tmp_mpz_t_initialized) {
+      mpz_init(tmp_mpz_t);
+      tmp_mpz_t_initialized = 1;
+    }
+    YAP_BigNumOfTerm(t, tmp_mpz_t);
+    if (mpz_cmp_si(tmp_mpz_t, LONG_MIN) >= 0
+	&& mpz_cmp_si(tmp_mpz_t, LONG_MAX) <= 0)
+      *lp = mpz_get_si(tmp_mpz_t);
+    else
+      return 0;
+  }
+  else
+    *lp = YAP_IntOfTerm(t);
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into to \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = reinterpret_cast<void*>(YAP_IntOfTerm(t));
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = YAP_AtomOfTerm(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  YAP_Functor f = YAP_FunctorOfTerm(t);
+  *ap = YAP_NameOfFunctor(f);
+  *ip = YAP_ArityOfFunctor(f);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = YAP_ArgOfTerm(i, t);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = YAP_HeadOfTerm(c);
+  t = YAP_TailOfTerm(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return YAP_Unify(t, u) != FALSE;
+}
+
+#endif // !defined(PCFLI_yap_cfli_hh)
diff --git a/interfaces/Prolog/YAP/yap_clpq.pl b/interfaces/Prolog/YAP/yap_clpq.pl
index 83e6c56..e95aef4 100644
--- a/interfaces/Prolog/YAP/yap_clpq.pl
+++ b/interfaces/Prolog/YAP/yap_clpq.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the toy PPL/YAP-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/YAP/yap_clpq2.pl b/interfaces/Prolog/YAP/yap_clpq2.pl
index 95dfb2f..9852657 100644
--- a/interfaces/Prolog/YAP/yap_clpq2.pl
+++ b/interfaces/Prolog/YAP/yap_clpq2.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the 2nd toy PPL/YAP-Prolog CLP(Q) interpreter.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/YAP/yap_efli.cc b/interfaces/Prolog/YAP/yap_efli.cc
new file mode 100644
index 0000000..ac8e247
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_efli.cc
@@ -0,0 +1,86 @@
+/* YAP extended foreign language interface: definitions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "yap_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+Prolog_atom a_throw;
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+mpz_class tmp_mpz_class;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+
+  a_throw = YAP_LookupAtom("throw");
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  if (YAP_IsBigNumTerm(t) != FALSE) {
+    YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+    n = tmp_mpz_class;
+  }
+  else
+    n = YAP_IntOfTerm(t);
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  if (n >= LONG_MIN && n <= LONG_MAX) {
+    long l = 0;
+    assign_r(l, n, ROUND_NOT_NEEDED);
+    t = YAP_MkIntTerm(l);
+  }
+  else {
+    assign_r(tmp_mpz_class, n, ROUND_NOT_NEEDED);
+    t = YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
+  }
+  return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  return Prolog_put_Coefficient(u, n) && YAP_Unify(t, u);
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/YAP/yap_efli.hh b/interfaces/Prolog/YAP/yap_efli.hh
new file mode 100644
index 0000000..33694f2
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_efli.hh
@@ -0,0 +1,82 @@
+/* YAP extended foreign language interface: declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_yap_efli_hh
+#define PPL_yap_efli_hh 1
+
+#include "ppl.hh"
+#include "yap_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+//extern Prolog_atom a_throw;
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_yap_efli_hh)
diff --git a/interfaces/Prolog/YAP/yap_pl_check.pl b/interfaces/Prolog/YAP/yap_pl_check.pl
index 7df31e1..14aa471 100644
--- a/interfaces/Prolog/YAP/yap_pl_check.pl
+++ b/interfaces/Prolog/YAP/yap_pl_check.pl
@@ -1,11 +1,11 @@
 /* Prolog main program for the PPL/YAP-Prolog predicate checker.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/interfaces/Prolog/exceptions.hh b/interfaces/Prolog/exceptions.hh
deleted file mode 100644
index 51e5322..0000000
--- a/interfaces/Prolog/exceptions.hh
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Exceptions used internally by the Prolog interfaces.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-class internal_exception {
-private:
-  Prolog_term_ref tr;
-
-public:
-  explicit internal_exception(Prolog_term_ref t)
-    : tr(t) {
-  }
-
-  virtual ~internal_exception() {
-  }
-
-  virtual Prolog_term_ref term() const {
-    return tr;
-  }
-};
-
-class Prolog_unsigned_out_of_range : public internal_exception {
-private:
-  unsigned long m;
-
-public:
-  explicit Prolog_unsigned_out_of_range(Prolog_term_ref t, unsigned long max)
-    : internal_exception(t),
-      m(max) {
-  }
-
-  unsigned long max() const {
-    return m;
-  }
-
-};
-
-class non_linear : public internal_exception {
-private:
-  const char* w;
-
-public:
-  explicit non_linear(const char* s, Prolog_term_ref t)
-    : internal_exception(t), w(s) {
-  }
-
-  const char* where() const {
-    return w;
-  }
-};
-
-class not_an_integer : public internal_exception {
-public:
-  explicit not_an_integer(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_unsigned_integer : public internal_exception {
-public:
-  explicit not_unsigned_integer(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_a_variable : public internal_exception {
-public:
-  explicit not_a_variable(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_a_polyhedron_kind : public internal_exception {
-public:
-  explicit not_a_polyhedron_kind(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_a_polyhedron_handle : public internal_exception {
-public:
-  explicit not_a_polyhedron_handle(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_an_optimization_mode : public internal_exception {
-public:
-  explicit not_an_optimization_mode(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_an_lp_problem_handle : public internal_exception {
-public:
-  explicit not_an_lp_problem_handle(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_a_complexity_class : public internal_exception {
-public:
-  explicit not_a_complexity_class(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_universe_or_empty : public internal_exception {
-public:
-  explicit not_universe_or_empty(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_a_relation : public internal_exception {
-public:
-  explicit not_a_relation(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class not_a_nil_terminated_list : public internal_exception {
-public:
-  explicit not_a_nil_terminated_list(Prolog_term_ref t)
-    : internal_exception(t) {
-  }
-};
-
-class PPL_integer_out_of_range {
-private:
-  Parma_Polyhedra_Library::Coefficient n;
-
-public:
-  explicit
-  PPL_integer_out_of_range(const Parma_Polyhedra_Library::Coefficient& i)
-    : n(i) {
-  }
-
-  const Parma_Polyhedra_Library::Coefficient i() const {
-    return n;
-  }
-};
-
-class unknown_interface_error {
-private:
-  const char* w;
-
-public:
-  unknown_interface_error(const char* s)
-    : w(s) {
-  }
-
-  const char* where() const {
-    return w;
-  }
-};
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
new file mode 100644
index 0000000..c4e3b66
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
@@ -0,0 +1,1797 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating ppl_prolog.icc
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Prolog_term_ref t_nd,
+                                               Prolog_term_ref t_uoe,
+                                               Prolog_term_ref t_ph)
+{
+ static const char* where = "ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension/3";
+ try {
+      @TOPOLOGY@@CPP_CLASS@* ph;
+      Prolog_atom uoe = term_to_universe_or_empty(t_uoe, where);
+
+      if (uoe == a_empty)
+     ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned<dimension_type>(t_nd,
+                                                                     where),
+                                    EMPTY);
+    else
+     ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned<dimension_type>(t_nd,
+                                                                     where),
+                                    UNIVERSE);
+
+      Prolog_term_ref tmp = Prolog_new_term_ref();
+      Prolog_put_address(tmp, ph);
+      if (Prolog_unify(t_ph, tmp)) {
+                                    PPL_REGISTER(ph);
+                                    return PROLOG_SUCCESS;
+                                    }
+     else
+      delete ph;
+      }
+  CATCH_ALL;
+}
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(
+                     Prolog_term_ref t_ph_source, Prolog_term_ref t_ph)
+{
+  static const char* where =
+                   "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@/2";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    const @CPPX_FRIEND@* ph_source
+        = static_cast<const @CPPX_FRIEND@*>
+        (term_to_handle<@CPPX_FRIEND@ >(t_ph_source, where));
+    PPL_CHECK(ph_source);
+        ph = new @TOPOLOGY@@CPP_CLASS@(*ph_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(
+                     Prolog_term_ref t_ph_source,
+                     Prolog_term_ref t_ph,
+                     Prolog_term_ref t_cc)
+{
+  static const char* where =
+                   "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity/3";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    const @CPPX_FRIEND@* ph_source
+        = static_cast<const @CPPX_FRIEND@*>
+        (term_to_handle<@CPPX_FRIEND@ >(t_ph_source, where));
+
+    Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+    Complexity_Class cc;
+    if (p_cc == a_polynomial)
+      cc = POLYNOMIAL_COMPLEXITY;
+    else if (p_cc == a_simplex)
+      cc = SIMPLEX_COMPLEXITY;
+    else
+      cc = ANY_COMPLEXITY;
+
+    PPL_CHECK(ph_source);
+    ph = new @TOPOLOGY@@CPP_CLASS@(*ph_source, cc);
+
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(Prolog_term_ref t_clist,
+                                                    Prolog_term_ref t_ph)
+{
+  static const char* where =
+    "ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s/2";
+  try {
+    @UBUILD_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at BUILD_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    ph = new @TOPOLOGY@@CPP_CLASS@(cs at RECYCLE@);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(Prolog_term_ref t_bb,
+                                       Prolog_term_ref t_ph) {
+  static const char* where = "ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@/2";
+  try {
+    // Compute the space dimension.
+    Prolog_term_ref t_l = Prolog_new_term_ref();
+    Prolog_term_ref t_interval = Prolog_new_term_ref();
+    Prolog_put_term(t_l, t_bb);
+    dimension_type dimension;
+    for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
+      Prolog_get_cons(t_l, t_interval, t_l);
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_l, where);
+
+    Rational_Box box(dimension);
+    // Set box to reflect its Prolog representation.
+    for (dimension_type i = 0; i < dimension; ++i) {
+      Prolog_get_cons(t_bb, t_interval, t_bb);
+      // An interval is either the atom empty or of the form
+      // i(Lower_Bound, Upper_Bound).
+      if (Prolog_is_atom(t_interval)) {
+        Prolog_atom name;
+        if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
+          box.set_empty();
+          continue;
+        }
+        else
+          return PROLOG_FAILURE;
+      }
+
+      if (!Prolog_is_compound(t_interval))
+        return PROLOG_FAILURE;
+
+      Prolog_atom functor;
+      int arity;
+      Prolog_get_compound_name_arity(t_interval, &functor, &arity);
+      if (arity != 2 || functor != a_i)
+        return PROLOG_FAILURE;
+
+      bool finite;
+      bool closed;
+      TEMP_INTEGER(n);
+      TEMP_INTEGER(d);
+      Prolog_term_ref t_bound = Prolog_new_term_ref();
+
+      // Get and raise the lower bound.
+      Prolog_get_arg(1, t_interval, t_bound);
+      if (!term_to_boundary(t_bound, LOWER_BOUNDARY, finite, closed, n, d))
+        return PROLOG_FAILURE;
+      if (finite)
+        box.add_constraint(d*Variable(i) >= n);
+
+      // Get and lower the upper bound.
+      Prolog_get_arg(2, t_interval, t_bound);
+      if (!term_to_boundary(t_bound, UPPER_BOUNDARY, finite, closed, n, d))
+        return PROLOG_FAILURE;
+      if (finite)
+        box.add_constraint(d*Variable(i) <= n);
+    }
+
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    ph = new @TOPOLOGY@@CPP_CLASS@(box new_ at BOX@_code );
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`new_bounding_box_code', `')
+
+m4_define(`new_covering_box_code', `, From_Covering_Box()`'');
+
+')
+
+  m4_define(`ppl_ at CLASS@_swap_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_swap/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->swap(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_delete_ at CLASS@(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_delete_ at CLASS@/1";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_UNREGISTER(ph);
+    delete ph;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+  static const char* where = "ppl_ at CLASS@_ at DIMENSION@/2";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (unify_ulong(t_sd, ph->@DIMENSION@()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_ at GET_REPRESENT@s(Prolog_term_ref t_ph,
+                                   Prolog_term_ref t_glist) {
+  static const char* where = "ppl_ at CLASS@_get_ at GET_REPRESENT@s/2";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const @UGET_REPRESENT at _System& gs = ph->@GET_REPRESENT at s();
+    for (@UGET_REPRESENT at _System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i)
+      Prolog_construct_cons(tail, @GET_REPRESENT at _term(*i), tail);
+
+    if (Prolog_unify(t_glist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s(Prolog_term_ref t_ph,
+                                             Prolog_term_ref t_glist) {
+  static const char* where = "ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s/2";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const @UGET_REPRESENT at _System& gs = ph->minimized_ at GET_REPRESENT@s();
+    for (@UGET_REPRESENT at _System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i)
+      Prolog_construct_cons(tail, @GET_REPRESENT at _term(*i), tail);
+
+    if (Prolog_unify(t_glist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BEGINEND@_iterator(Prolog_term_ref t_pps,
+                                  Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_ at BEGINEND@_iterator/2";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    @CPP_CLASS@::iterator* i = new @CPP_CLASS@::iterator(pps->@BEGINEND@());
+    Prolog_term_ref t_i = Prolog_new_term_ref();
+    Prolog_put_address(t_i, i);
+
+    if (Prolog_unify(t_it, t_i)) {
+      PPL_REGISTER(i);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete i;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_delete_iterator(Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_delete_iterator/1";
+  try {
+    const @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_UNREGISTER(it);
+    delete it;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at INCDEC@_iterator(Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_ at INCDEC@_iterator/2";
+  try {
+    @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_CHECK(it);
+    @CPPX_INCDEC@(*it);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1,
+                                       Prolog_term_ref t_it2) {
+  static const char* where = "ppl_ at CLASS@_iterator_equals_iterator/2";
+  try {
+    @CPP_CLASS@::iterator* it1
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it1, where);
+    PPL_CHECK(it1);
+    @CPP_CLASS@::iterator* it2
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it2, where);
+    PPL_CHECK(it2);
+    if (*it1 == *it2)
+      return PROLOG_SUCCESS;
+    else
+      return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_disjunct(Prolog_term_ref t_it,
+                           Prolog_term_ref t_disj) {
+  static const char* where = "ppl_ at CLASS@_get_disjunct/2";
+  try {
+    const @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_CHECK(it);
+
+    @CLASSTOPOLOGY@@CPP_DISJUNCT@* disj
+      = const_cast<@CLASSTOPOLOGY@@CPP_DISJUNCT@*>(&((*it)->element()));
+    Prolog_term_ref t_d = Prolog_new_term_ref();
+    Prolog_put_address(t_d, disj);
+
+    if (Prolog_unify(t_disj, t_d)) {
+      PPL_WEAK_REGISTER(disj);
+      return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_disjunct(Prolog_term_ref t_pps,
+                            Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_drop_disjuncts/2";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_CHECK(it);
+
+    @CPP_CLASS@::iterator& i = *it;
+    pps->drop_disjunct(i);
+
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_add_disjunct/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @CLASSTOPOLOGY@@CPP_DISJUNCT@* d =
+      static_cast<@CLASSTOPOLOGY@@CPP_DISJUNCT@*>
+      (term_to_handle<@CLASSTOPOLOGY@@CPP_DISJUNCT@ >(t_d, where));
+    PPL_CHECK(d);
+    ph->add_disjunct(*d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code',
+  `dnl
+  extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at PARTITION@(Prolog_term_ref t_ph,
+                          Prolog_term_ref t_qh,
+                          Prolog_term_ref t_inters,
+                          Prolog_term_ref t_pset) {
+  static const char* where = "ppl_ at CLASS@_ at PARTITION@/4";
+  try {
+    const @CLASSTOPOLOGY@@CPP_DISJUNCT@* ph =
+      term_to_handle<@CLASSTOPOLOGY@@CPP_DISJUNCT@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const @CLASSTOPOLOGY@@CPP_DISJUNCT@* qh =
+      term_to_handle<@CLASSTOPOLOGY@@CPP_DISJUNCT@ >(t_qh, where);
+    PPL_CHECK(qh);
+
+    Prolog_term_ref t_r_first = Prolog_new_term_ref();
+    Prolog_term_ref t_r_second = Prolog_new_term_ref();
+    std::pair<@CLASSTOPOLOGY@@CPP_DISJUNCT@@COMMA@ Pointset_Powerset<@SUPERCLASS@> > r =
+      @PARTITION@(*ph, *qh);
+
+    @CLASSTOPOLOGY@@CPP_DISJUNCT@* rfh = new @CLASSTOPOLOGY@@CPP_DISJUNCT@(EMPTY);
+    rfh->swap(r.first);
+
+    Pointset_Powerset<@SUPERCLASS@>* rsh =
+      new Pointset_Powerset<@SUPERCLASS@>(EMPTY);
+    rsh->swap(r.second);
+
+    Prolog_put_address(t_r_first, rfh);
+    Prolog_put_address(t_r_second, rsh);
+
+    if (Prolog_unify(t_inters, t_r_first)
+        && Prolog_unify(t_pset, t_r_second)) {
+      return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_partition_code',
+  `dnl
+  extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_approximate_partition(Prolog_term_ref t_ph,
+                                    Prolog_term_ref t_qh,
+                                    Prolog_term_ref t_finite,
+                                    Prolog_term_ref t_inters,
+                                    Prolog_term_ref t_pset) {
+  static const char* where = "ppl_ at CLASS@_approximate_partition/5";
+  try {
+    const @CLASSTOPOLOGY@@CPP_DISJUNCT@* ph =
+      term_to_handle<@CLASSTOPOLOGY@@CPP_DISJUNCT@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const @CLASSTOPOLOGY@@CPP_DISJUNCT@* qh =
+      term_to_handle<@CLASSTOPOLOGY@@CPP_DISJUNCT@ >(t_qh, where);
+    PPL_CHECK(qh);
+    bool finite;
+
+    std::pair<@CLASSTOPOLOGY@@CPP_DISJUNCT@@COMMA@ Pointset_Powerset<@SUPERCLASS@> > r =
+      approximate_partition(*ph, *qh, finite);
+
+    @CLASSTOPOLOGY@@CPP_DISJUNCT@* rfh = new @CLASSTOPOLOGY@@CPP_DISJUNCT@(EMPTY);
+    rfh->swap(r.first);
+
+    Pointset_Powerset<@SUPERCLASS@>* rsh =
+      new Pointset_Powerset<@SUPERCLASS@>(EMPTY);
+    rsh->swap(r.second);
+
+    Prolog_term_ref t_b = Prolog_new_term_ref();
+    Prolog_term_ref t_r_first = Prolog_new_term_ref();
+    Prolog_term_ref t_r_second = Prolog_new_term_ref();
+    Prolog_atom a = (finite ? a_true : a_false);
+    Prolog_put_atom(t_b, a);
+
+    Prolog_put_address(t_r_first, rfh);
+    Prolog_put_address(t_r_second, rsh);
+
+    if (Prolog_unify(t_inters, t_r_first)
+        && Prolog_unify(t_pset, t_r_second
+                        && Prolog_unify(t_finite, t_b)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(Prolog_term_ref t_ph,
+                                                 Prolog_term_ref t_c,
+                                                 Prolog_term_ref t_r) {
+  static const char* where =
+    "ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    relation_with_ at RELATION_REPRESENT@_code
+      if (Prolog_unify(t_r, tail))
+        return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`relation_with_constraint_code', `
+  Poly_Con_Relation r = ph->relation_with(build_constraint(t_c, where));
+
+Prolog_term_ref tail = Prolog_new_term_ref();
+Prolog_put_atom(tail, a_nil);
+while (r != Poly_Con_Relation::nothing()) {
+  if (r.implies(Poly_Con_Relation::is_disjoint())) {
+    Prolog_term_ref t_dis = Prolog_new_term_ref();
+    Prolog_put_atom(t_dis, a_is_disjoint);
+    Prolog_construct_cons(tail, t_dis, tail);
+    r = r - Poly_Con_Relation::is_disjoint();
+  }
+  else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+    Prolog_term_ref t_sin = Prolog_new_term_ref();
+    Prolog_put_atom(t_sin, a_strictly_intersects);
+    Prolog_construct_cons(tail, t_sin, tail);
+    r = r - Poly_Con_Relation::strictly_intersects();
+  }
+  else if (r.implies(Poly_Con_Relation::is_included())) {
+    Prolog_term_ref t_inc = Prolog_new_term_ref();
+    Prolog_put_atom(t_inc, a_is_included);
+    Prolog_construct_cons(tail, t_inc, tail);
+    r = r - Poly_Con_Relation::is_included();
+  }
+  else if (r.implies(Poly_Con_Relation::saturates())) {
+    Prolog_term_ref t_sat = Prolog_new_term_ref();
+    Prolog_put_atom(t_sat, a_saturates);
+    Prolog_construct_cons(tail, t_sat, tail);
+    r = r - Poly_Con_Relation::saturates();
+  }
+ }
+')
+
+m4_define(`relation_with_congruence_code', `
+  Poly_Con_Relation r = ph->relation_with(build_congruence(t_c, where));
+
+Prolog_term_ref tail = Prolog_new_term_ref();
+Prolog_put_atom(tail, a_nil);
+while (r != Poly_Con_Relation::nothing()) {
+  if (r.implies(Poly_Con_Relation::is_disjoint())) {
+    Prolog_term_ref t_dis = Prolog_new_term_ref();
+    Prolog_put_atom(t_dis, a_is_disjoint);
+    Prolog_construct_cons(tail, t_dis, tail);
+    r = r - Poly_Con_Relation::is_disjoint();
+  }
+  else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+    Prolog_term_ref t_sin = Prolog_new_term_ref();
+    Prolog_put_atom(t_sin, a_strictly_intersects);
+    Prolog_construct_cons(tail, t_sin, tail);
+    r = r - Poly_Con_Relation::strictly_intersects();
+  }
+  else if (r.implies(Poly_Con_Relation::is_included())) {
+    Prolog_term_ref t_inc = Prolog_new_term_ref();
+    Prolog_put_atom(t_inc, a_is_included);
+    Prolog_construct_cons(tail, t_inc, tail);
+    r = r - Poly_Con_Relation::is_included();
+  }
+  else if (r.implies(Poly_Con_Relation::saturates())) {
+    Prolog_term_ref t_sat = Prolog_new_term_ref();
+    Prolog_put_atom(t_sat, a_saturates);
+    Prolog_construct_cons(tail, t_sat, tail);
+    r = r - Poly_Con_Relation::saturates();
+  }
+  else
+    break;
+ }
+')
+
+m4_define(`relation_with_generator_code', `
+  Poly_Gen_Relation r = ph->relation_with(build_generator(t_c, where));
+
+Prolog_term_ref tail = Prolog_new_term_ref();
+Prolog_put_atom(tail, a_nil);
+while (r != Poly_Gen_Relation::nothing()) {
+  if (r.implies(Poly_Gen_Relation::subsumes())) {
+    Prolog_term_ref t_sub = Prolog_new_term_ref();
+    Prolog_put_atom(t_sub, a_subsumes);
+    Prolog_construct_cons(tail, t_sub, tail);
+    r = r - Poly_Gen_Relation::subsumes();
+  }
+ }
+')
+
+m4_define(`relation_with_grid_generator_code', `
+  Poly_Gen_Relation r = ph->relation_with(build_grid_generator(t_c, where));
+
+Prolog_term_ref tail = Prolog_new_term_ref();
+Prolog_put_atom(tail, a_nil);
+while (r != Poly_Gen_Relation::nothing()) {
+  if (r.implies(Poly_Gen_Relation::subsumes())) {
+    Prolog_term_ref t_sub = Prolog_new_term_ref();
+    Prolog_put_atom(t_sub, a_subsumes);
+    Prolog_construct_cons(tail, t_sub, tail);
+    r = r - Poly_Gen_Relation::subsumes();
+  }
+ }
+')
+
+m4_define(`ppl_ at CLASS@_get_covering_box_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_covering_box(Prolog_term_ref t_ph, Prolog_term_ref t_bb) {
+  static const char* where = "ppl_ at CLASS@_get_covering_box/2";
+  try {
+    @CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+
+    dimension_type dimension = ph->space_dimension();
+    Rational_Box box(dimension);
+    ph->get_covering_box(box);
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    for (dimension_type i = dimension; i-- > 0; )
+      Prolog_construct_cons(tail,
+                            interval_term(box.get_interval(Variable(i))),
+                            tail);
+    if (Prolog_unify(t_bb, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_bounding_box_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_bounding_box(Prolog_term_ref t_ph,
+                               Prolog_term_ref t_cc,
+                               Prolog_term_ref t_bb) {
+  static const char* where = "ppl_ at CLASS@_get_bounding_box/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+
+    Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+    Complexity_Class cc;
+    if (p_cc == a_polynomial)
+      cc = POLYNOMIAL_COMPLEXITY;
+    else if (p_cc == a_simplex)
+      cc = SIMPLEX_COMPLEXITY;
+    else
+      cc = ANY_COMPLEXITY;
+
+    Rational_Box box(*ph, cc);
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    if (box.is_empty()) {
+      Prolog_term_ref t_empty = Prolog_new_term_ref();
+      Prolog_put_atom(t_empty, a_empty);
+      Prolog_construct_cons(tail, t_empty, tail);
+    }
+    else
+      for (dimension_type i = ph->space_dimension(); i-- > 0; )
+        Prolog_construct_cons(tail,
+                              interval_term(box.get_interval(Variable(i))),
+                              tail);
+    if (Prolog_unify(t_bb, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at HAS_PROPERTY@(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_ at HAS_PROPERTY@/1";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->@HAS_PROPERTY@())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at SIMPLIFY@(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_ at SIMPLIFY@/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->@SIMPLIFY@();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_v) {
+  static const char* where = "ppl_ at CLASS@__unconstrain/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->unconstrain(term_to_Variable(t_v, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_ at CLASS@__unconstrain/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set unconstrain_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      unconstrain_variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+    ph->unconstrain(unconstrain_variables);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_constrains(Prolog_term_ref t_ph,
+                          Prolog_term_ref t_v) {
+  static const char* where = "ppl_ at CLASS@__constrains/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->constrains(term_to_Variable(t_v, where)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(Prolog_term_ref t_ph,
+                                       Prolog_term_ref t_expr) {
+  static const char* where = "ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Linear_Expression l = build_linear_expression(t_expr, where);
+    if (ph->bounds_from_ at ABOVEBELOW@(l))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+                       Prolog_term_ref t_n,  Prolog_term_ref t_d,
+                       Prolog_term_ref t_maxmin) {
+  static const char* where = "ppl_ at CLASS@_ at MAXMIN@/5";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    TEMP_INTEGER(n);
+    TEMP_INTEGER(d);
+    bool maxmin;
+    if (ph->@MAXMIN@(le, n, d, maxmin)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (maxmin ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify_Coefficient(t_n, n)
+          && Prolog_unify_Coefficient(t_d, d)
+          && Prolog_unify(t_maxmin, t))
+        return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@_with_point(Prolog_term_ref t_ph,
+                                  Prolog_term_ref t_le_expr,
+                                  Prolog_term_ref t_n, Prolog_term_ref t_d,
+                                  Prolog_term_ref t_maxmin, Prolog_term_ref t_g) {
+  static const char* where = "ppl_ at CLASS@_ at MAXMIN@_with_point/6";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    TEMP_INTEGER(n);
+    TEMP_INTEGER(d);
+    bool maxmin;
+    Generator g(point());
+    if (ph->@MAXMIN@(le, n, d, maxmin, g)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (maxmin ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify_Coefficient(t_n, n)
+          && Prolog_unify_Coefficient(t_d, d)
+          && Prolog_unify(t_maxmin, t)
+          && Prolog_unify(t_g, generator_term(g)))
+        return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(Prolog_term_ref t_lhs,
+                                   Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at COMPARISON@_ at CLASS@/2";
+  try {
+    const @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    if (lhs->@COMPARISON@(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_equals_ at CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_equals_ at CLASS@/2";
+  try {
+    const @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    if (*lhs == *rhs)
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_OK(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_OK/1";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
+  static const char* where = "ppl_ at CLASS@_add_ at ADD_REPRESENT@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->add_ at ADD_REPRESENT@(build_ at ADD_REPRESENT@(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
+  static const char* where = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->refine_with_ at REFINE_REPRESENT@(build_ at REFINE_REPRESENT@(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize(Prolog_term_ref t_ph,
+                                               Prolog_term_ref t_c) {
+  static const char* where = "ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->add_ at ADD_REPRESENT@_and_minimize(build_ at ADD_REPRESENT@(t_c, where)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@s(Prolog_term_ref t_ph,
+                                   Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_add_ at ADD_REPRESENT@s/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @UADD_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at ADD_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    ph->add_ at ADD_REPRESENT@s(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(Prolog_term_ref t_ph,
+                                   Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @UREFINE_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at REFINE_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    ph->refine_with_ at REFINE_REPRESENT@s(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(Prolog_term_ref t_ph,
+                                                Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @UADD_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at ADD_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    if (ph->add_ at ADD_REPRESENT@s_and_minimize(cs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`bop_assign_code',
+`namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+Prolog_foreign_return_type
+bop_assign(Prolog_term_ref t_lhs,
+           Prolog_term_ref t_rhs,
+           void (@CPP_CLASS@::* bop_assign)(const @CPP_CLASS@&),
+           const char* where) {
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    (lhs->*bop_assign)(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+bop_assign_and_minimize(Prolog_term_ref t_lhs,
+                        Prolog_term_ref t_rhs,
+                        bool (@CPP_CLASS@::*
+                              bop_assign_and_minimize)(const @CPP_CLASS@&),
+                        const char* where) {
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    if ((lhs->*bop_assign_and_minimize)(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library::Prolog_Interfaces;
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BINOP@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at BINOP@";
+  return bop_assign(t_lhs, t_rhs, &@CPP_CLASS@::@BINOP@, where);
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BINMINOP@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at BINMINOP@";
+  return bop_assign_and_minimize(t_lhs, t_rhs,
+                                 &@CPP_CLASS@::@BINMINOP@, where);
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_simplify_using_context_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b) {
+  static const char* where = "ppl_ at CLASS@_simplify_using_context_assign";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    Prolog_term_ref t_is_intersect = Prolog_new_term_ref();
+    Prolog_atom is_intersect
+      = (lhs->simplify_using_context_assign(*rhs) ? a_true : a_false);
+    Prolog_put_atom(t_is_intersect, is_intersect);
+    if (Prolog_unify(t_b, t_is_intersect))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@";
+  @TOPOLOGY@@CPP_CLASS@* lhs = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_lhs, where);
+  const @TOPOLOGY@@CPP_CLASS@* rhs = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_rhs, where);
+  PPL_CHECK(lhs);
+  PPL_CHECK(rhs);
+  return lhs->@UB_EXACT@(*rhs);
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d) {
+  const char* where = "ppl_ at CLASS@_ at AFFIMAGE@/4";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->@AFFIMAGE@(term_to_Variable(t_v, where),
+                   build_linear_expression(t_le, where),
+                   term_to_Coefficient(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d, Prolog_term_ref t_m) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@/6";
+  try {
+    @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where);
+    PPL_CHECK(ph);
+    ph->generalized_ at AFFIMAGE@(term_to_Variable(t_v, where),
+                               term_to_relation_symbol(t_r, where),
+                               build_linear_expression(t_le, where),
+                               term_to_Coefficient(t_d, where),
+                               term_to_Coefficient(t_m, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@/5";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->generalized_ at AFFIMAGE@(term_to_Variable(t_v, where),
+                               term_to_relation_symbol(t_r, where),
+                               build_linear_expression(t_le, where),
+                               term_to_Coefficient(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_m) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/5";
+  try {
+    @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where);
+    PPL_CHECK(ph);
+    ph->generalized_ at AFFIMAGE@(build_linear_expression(t_lhs, where),
+                               term_to_relation_symbol(t_r, where),
+                               build_linear_expression(t_rhs, where),
+                               term_to_Coefficient(t_m, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/4";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Relation_Symbol r = term_to_relation_symbol(t_r, where);
+    ph->generalized_ at AFFIMAGE@(build_linear_expression(t_lhs, where),
+                               r,
+                               build_linear_expression(t_rhs, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounded_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_lb_le, Prolog_term_ref t_ub_le,
+   Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_bounded_ at AFFIMAGE@/5";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->bounded_ at AFFIMAGE@(term_to_Variable(t_v, where),
+                           build_linear_expression(t_lb_le, where),
+                           build_linear_expression(t_ub_le, where),
+                           term_to_Coefficient(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->@WIDEN at _widening_assign(*rhs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at WIDEN@_widening_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->@WIDEN at _widening_assign(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_widening_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->widening_assign(*rhs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_widening_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->widening_assign(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->@EXTRAPOLATION at _extrapolation_assign(*rhs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+
+    lhs->@EXTRAPOLATION at _extrapolation_assign(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->@EXTRAPOLATION at _narrowing_assign(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+
+dnl FIXME: This code is redundant as there is no options for tokens
+dnl        in the current C++ code.
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens(
+                                                                                      Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+                                                                                      Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->BHZ03_widening_assign<@ALT_DISJUNCT_WIDEN at _Certificate>
+      (*rhs,
+       widen_fun_ref(&@CLASSTOPOLOGY@@CPP_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+       &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+                                                                          Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    lhs->BHZ03_widening_assign<@ALT_DISJUNCT_WIDEN at _Certificate>
+      (*rhs,
+       widen_fun_ref(&@CLASSTOPOLOGY@@CPP_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+                                                          Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+                                                          Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    lhs->BGP99_extrapolation_assign
+      (*rhs,
+       widen_fun_ref(&@CLASSTOPOLOGY@@CPP_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+       term_to_unsigned<unsigned>(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+                                                                  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+                                                                  Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    lhs->BGP99_extrapolation_assign
+      (*rhs,
+       widen_fun_ref(&@CLASSTOPOLOGY@@CPP_DISJUNCT@::@DISJUNCT_EXTRAPOLATION at _extrapolation_assign),
+       term_to_unsigned<unsigned>(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens/5";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    @UCONSTRAINER at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at CONSTRAINER@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*rhs, cs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign/3";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    @UCONSTRAINER at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at CONSTRAINER@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    lhs->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*rhs, cs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nnd) {
+  static const char* where = "ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    dimension_type d = term_to_unsigned<dimension_type>(t_nnd, where);
+    ph->add_space_dimensions_ at EMBEDPROJECT@(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_ at CLASS@_remove_space_dimensions/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set dead_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      dead_variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    ph->remove_space_dimensions(dead_variables);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_higher_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nd) {
+  static const char* where = "ppl_ at CLASS@_remove_higher_space_dimensions/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->remove_higher_space_dimensions(term_to_unsigned<dimension_type>(t_nd,
+                                                                        where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_expand_space_dimension
+  (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd) {
+  static const char* where = "ppl_ at CLASS@_expand_space_dimension/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->expand_space_dimension(term_to_Variable(t_v, where),
+                               term_to_unsigned<dimension_type>(t_nd, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_fold_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v) {
+  static const char* where = "ppl_ at CLASS@_fold_space_dimensions/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set fold_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      fold_variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    ph->fold_space_dimensions(fold_variables, term_to_Variable(t_v, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_map_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc) {
+  static const char* where = "ppl_ at CLASS@_map_space_dimensions/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    dimension_type space_dim = ph->space_dimension();
+    PPL_CHECK(ph);
+    PFunc pfunc;
+    Prolog_term_ref t_pair = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_pfunc)) {
+      Prolog_get_cons(t_pfunc, t_pair, t_pfunc);
+      Prolog_atom functor;
+      int arity;
+      Prolog_get_compound_name_arity(t_pair, &functor, &arity);
+      if (arity != 2 || functor != a_minus)
+        return PROLOG_FAILURE;
+      Prolog_term_ref t_i = Prolog_new_term_ref();
+      Prolog_term_ref t_j = Prolog_new_term_ref();
+      Prolog_get_arg(1, t_pair, t_i);
+      Prolog_get_arg(2, t_pair, t_j);
+      dimension_type i = term_to_Variable(t_i, where).id();
+      dimension_type j = term_to_Variable(t_j, where).id();
+      if (i >= space_dim || !pfunc.insert(i, j))
+        return PROLOG_FAILURE;
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_pfunc, where);
+
+    ph->map_space_dimensions(pfunc);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ascii_dump
+  (Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_ascii_dump/1";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->ascii_dump(std::cout);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MEMBYTES@(Prolog_term_ref t_pps,
+                         Prolog_term_ref t_m) {
+  static const char* where = "ppl_ at CLASS@_ at MEMBYTES@/2";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    if (unify_ulong(t_m, pps->@MEMBYTES@()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
new file mode 100644
index 0000000..1ee8fc1
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
@@ -0,0 +1,76 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_prolog.icc
+dnl using the code in ppl_interface_generator_prolog_icc_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl This file generates ppl_prolog.icc.
+dnl
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_prolog_cc_code.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+m4_divert`'dnl
+%<--%<--%<-- ppl_prolog_domains.cc
+/* Prolog interface code: inclusion of all domain definitions.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+m4_divert(-1)
+
+dnl m4_add_bop_assign_code(Class, CPP_Class)
+dnl
+dnl Adds the extra code used by the binary operators.
+m4_define(`m4_add_bop_assign_code', `dnl
+m4_replace_all_patterns_in_string($1,
+  bop_assign_code,
+  m4_pattern_list)`'dnl
+')
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+%<--%<--%<-- ppl_prolog_domains.cc
+`#'include "ppl_prolog_`'m4_current_interface.cc"
+%<--%<--%<-- ppl_prolog_`'m4_current_interface.cc
+/* Prolog m4_current_interface interface code: definitions.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "ppl_prolog_sysdep.hh"
+#include "ppl_prolog_common.defs.hh"
+
+m4_add_bop_assign_code($1)`'dnl
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+m4_divert`'dnl
+
+`#'include "ppl_prolog_common.cc"`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
new file mode 100644
index 0000000..8fee0cc
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
@@ -0,0 +1,72 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file Prolog_interface.dox
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl This file generates ppl_prolog.icc.
+dnl
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_prolog_dox_code.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+
+m4_pushdef(`m4_interface_classes_names', `Polyhedron at Grid@Octagonal_Shape_mpz_class at BD_Shape_double@Float_Box@@Pointset_Powerset_C_Polyhedron at Direct_Product_C_Polyhedron_Grid')
+m4_pushdef(`m4_cplusplus_classes_names', `Polyhedron at Grid@Octagonal_Shape<mpz_class>@BD_Shape<double>@Float_Box at Pointset_Powerset<C_Polyhedron>@Direct_Product<C_Polyhedron,Grid>')
+
+m4_divert`'dnl
+m4_include(`ppl_prolog_sysindep_dox')
+m4_divert(-1)`'dnl
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_pushdef(`m4_one_class_code', `m4_interface_class$1 <BR>
+')
+m4_divert`'dnl
+dnl -----------------------------------------------------------------
+dnl Output all the classes.
+dnl -----------------------------------------------------------------
+\anchor generated_predicates
+<H1>PPL Domains Generated for the Prolog Interface</H1>
+Here are some example PPL domains: <BR>
+m4_all_code
+Next are lists of all the supported predicates for these domains: <BR>
+m4_popdef(`m4_one_class_code')
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+\anchor m4_interface_class$1`'_predicates
+<H2>m4_interface_class`'$1 Predicates List</H2>
+')
+m4_define(`m4_post_extra_class_code', `dnl
+')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_include(`ppl_prolog_sysdep_dox')
+m4_popdef(`m4_interface_classes_names')
+m4_popdef(`m4_cplusplus_classes_names')
+
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
new file mode 100644
index 0000000..60305d7
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
@@ -0,0 +1,336 @@
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating ppl_prolog.icc
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code', `dnl
+<CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code', `dnl
+<CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(+Handle, -Handle)</CODE><BR>
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code', `dnl
+<CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(+Handle, -Handle, +Complexity)</CODE><BR>
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+<CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(+ at UBUILD_REPRESENT@, -Handle)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at UB_EXACT@(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+<CODE>ppl_ at CLASS@_swap(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at DIMENSION@(+Handle, ?Dimension_Type)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+<CODE>ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(+Handle, + at URELATION_REPRESENT@, ?Relation_List)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`dnl
+<CODE>ppl_ at CLASS@_get_ at GET_REPRESENT@s(+Handle, +Complexity, @UGET_REPRESENT at _System?)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`dnl
+<CODE>ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s(+Handle, +Complexity, @UGET_REPRESENT at _System?)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at HAS_PROPERTY@(+Handle)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at SIMPLIFY@(+Handle)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+<CODE>ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(+Handle, +Lin_Expr)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at MAXMIN@(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at MAXMIN@_with_point(+Handle, +Lin_Expr, ?Coefficient_1, ?Coefficient_2, ?Boolean, ?Point)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+<CODE>ppl_ at CLASS@_equals_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+<CODE>ppl_ at CLASS@_OK(+Handle)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`dnl
+<CODE>ppl_ at CLASS@_add_ at ADD_REPRESENT@(+Handle, + at UADD_REPRESENT@)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`dnl
+<CODE>ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize(+Handle, + at UADD_REPRESENT@)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`dnl
+<CODE>ppl_ at CLASS@_add_ at ADD_REPRESENT@s(+Handle, + at UADD_REPRESENT@_System)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`dnl
+<CODE>ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(+Handle, + at UADD_REPRESENT@_System)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+<CODE>ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(+Handle, + at UREFINE_REPRESENT@)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+<CODE>ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(+Handle, + at UREFINE_REPRESENT@_System)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at BINOP@(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at BINMINOP@(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+<CODE>ppl_ at CLASS@_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+<CODE>ppl_ at CLASS@_bounded_ at AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coefficient)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+<CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+<CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+ `dnl
+<CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coefficient_1, +Coefficient_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+<CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2, +Coefficient)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+<CODE>ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@(+Handle, +Dimension_Type)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+<CODE>ppl_ at CLASS@_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+<CODE>ppl_ at CLASS@_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+<CODE>ppl_ at CLASS@_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+<CODE>ppl_ at CLASS@_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+<CODE>ppl_ at CLASS@_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+<CODE>ppl_ at CLASS@_constrains(+Handle, +PPL_Var)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+<CODE>ppl_ at CLASS@_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+<CODE>ppl_ at CLASS@_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+ `dnl
+<CODE>ppl_ at CLASS@_ascii_dump(+Handle)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `dnl
+<CODE>ppl_ at CLASS@_ at MEMBYTES@(+Handle, ?Number)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+<CODE>ppl_ at CLASS@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+<CODE>ppl_ at CLASS@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at WIDEN@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+<CODE>ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+<CODE>ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `dnl
+<CODE>ppl_ at CLASS@_iterator_equals_iterator(+Iterator_1, +Iterator_2)</CODE><BR>
+')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `dnl
+<CODE>ppl_ at CLASS@_ at BEGINEND@_iterator(+Handle, ?Iterator)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+ `dnl
+<CODE>ppl_ at CLASS@_iterator_ at INCDEC@(+Iterator)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `dnl
+<CODE>ppl_ at CLASS@_iterator_ at INCDEC@(+Iterator)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `dnl
+<CODE>ppl_ at CLASS@_iterator_get_disjunct(+Handle_1, -Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `dnl
+<CODE>ppl_ at CLASS@_drop_disjunct(+Handle, +Iterator)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `dnl
+<CODE>ppl_ at CLASS@_add_disjunct(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code',
+ `dnl
+<CODE>ppl_ at CLASS@_ at PARTITION@(+Handle_1, +Handle_2, -Handle_3, -Handle_4)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_approximate_partition',
+ `dnl
+<CODE>ppl_ at CLASS@_approximate_partition(+Handle_1, ?Handle_2, ?Boolean, ?Handle_3, ?Handle_4)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+ `dnl
+<CODE>ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+ `dnl
+<CODE>ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(+Handle_1, +Handle_2)</CODE><BR>
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+ `dnl
+<CODE>ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(+Handle_1, +Handle_2)</CODE><BR>
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
new file mode 100644
index 0000000..913b3ea
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
@@ -0,0 +1,542 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating ppl_prolog.icc
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Prolog_term_ref t_nd,
+                                               Prolog_term_ref t_uoe,
+                                               Prolog_term_ref t_ph);
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(
+                     Prolog_term_ref t_ph_source, Prolog_term_ref t_ph);
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(
+                     Prolog_term_ref t_ph_source,
+                     Prolog_term_ref t_ph,
+                     Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(Prolog_term_ref t_clist,
+						    Prolog_term_ref t_ph);
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(Prolog_term_ref t_bb,
+				       Prolog_term_ref t_ph);
+')
+
+m4_define(`new_bounding_box_code', `')
+
+m4_define(`new_covering_box_code', `, From_Covering_Box()`'');
+
+')
+
+  m4_define(`ppl_ at CLASS@_swap_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_delete_ at CLASS@(Prolog_term_ref t_ph);
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd);
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_ at GET_REPRESENT@s(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_glist);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s(Prolog_term_ref t_ph,
+					     Prolog_term_ref t_glist);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BEGINEND@_iterator(Prolog_term_ref t_pps,
+				  Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_delete_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_delete_iterator(Prolog_term_ref t_it);
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at INCDEC@_iterator(Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1,
+				       Prolog_term_ref t_it2);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_disjunct(Prolog_term_ref t_it,
+			   Prolog_term_ref t_disj);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_disjunct(Prolog_term_ref t_pps,
+			    Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d);
+')
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code',
+  `dnl
+  extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at PARTITION@(Prolog_term_ref t_ph,
+			  Prolog_term_ref t_qh,
+			  Prolog_term_ref t_inters,
+			  Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_partition_code',
+  `dnl
+  extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_approximate_partition(Prolog_term_ref t_ph,
+				    Prolog_term_ref t_qh,
+				    Prolog_term_ref t_finite,
+				    Prolog_term_ref t_inters,
+				    Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(Prolog_term_ref t_ph,
+						 Prolog_term_ref t_c,
+						 Prolog_term_ref t_r);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_covering_box_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_covering_box(Prolog_term_ref t_ph, Prolog_term_ref t_bb);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_bounding_box_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_bounding_box(Prolog_term_ref t_ph,
+			       Prolog_term_ref t_cc,
+			       Prolog_term_ref t_bb);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at HAS_PROPERTY@(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at SIMPLIFY@(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_vlist);
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_constrains(Prolog_term_ref t_ph,
+                          Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(Prolog_term_ref t_ph,
+				       Prolog_term_ref t_expr);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+		       Prolog_term_ref t_n,  Prolog_term_ref t_d,
+		       Prolog_term_ref t_maxmin);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@_with_point(Prolog_term_ref t_ph,
+				  Prolog_term_ref t_le_expr,
+				  Prolog_term_ref t_n,
+                                  Prolog_term_ref t_d,
+				  Prolog_term_ref t_maxmin,
+                                  Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(Prolog_term_ref t_lhs,
+				   Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_equals_ at CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_OK(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize(Prolog_term_ref t_ph,
+					       Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@s(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(Prolog_term_ref t_ph,
+						Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BINOP@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BINMINOP@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_simplify_using_context_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b);
+
+')
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d, Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounded_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_lb_le, Prolog_term_ref t_ub_le,
+   Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+
+dnl FIXME: This code is redundant as there is no options for tokens
+dnl        in the current C++ code.
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens(
+										      Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+										      Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+									  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+							  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+							  Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+								  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+								  Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nnd);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_higher_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nd);
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_expand_space_dimension
+  (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd);
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_fold_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_map_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc);
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ascii_dump
+  (Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MEMBYTES@(Prolog_term_ref t_pps,
+			 Prolog_term_ref t_m);
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
new file mode 100644
index 0000000..147ac50
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
@@ -0,0 +1,63 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_prolog.icc
+dnl using the code in ppl_interface_generator_prolog_icc_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl This file generates ppl_prolog.icc.
+dnl
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_prolog_hh_code.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+m4_divert`'dnl
+%<--%<--%<-- ppl_prolog_domains.hh
+/* Prolog interface code: inclusion of all domain declarations.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+m4_divert(-1)
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+%<--%<--%<-- ppl_prolog_domains.hh
+`#'include "ppl_prolog_`'m4_current_interface.hh"
+%<--%<--%<-- ppl_prolog_`'m4_current_interface.hh
+/* Prolog m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+m4_divert`'dnl
+
+`#'include "ppl_prolog_common.defs.hh"`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
new file mode 100644
index 0000000..940b8d2
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
@@ -0,0 +1,79 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of predicates
+dnl for the Prolog interfaces; this includes:
+dnl - the list in the imported file and any Prolog specific predicates;
+dnl   ppl_interface_generator_common_procedure_generators.m4;
+dnl - the list of library predicates needed for the system dependent files.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl Library predicate list.
+m4_define(`m4_library_predicate_list', `dnl
+ppl_version_major/1,
+ppl_version_minor/1,
+ppl_version_revision/1,
+ppl_version_beta/1,
+ppl_version/1,
+ppl_banner/1,
+ppl_max_space_dimension/1,
+ppl_Coefficient_is_bounded/0,
+ppl_Coefficient_max/1,
+ppl_Coefficient_min/1,
+ppl_initialize/0 *nofail,
+ppl_finalize/0 *nofail,
+ppl_set_timeout_exception_atom/1 *nofail,
+ppl_timeout_exception_atom/1,
+ppl_set_timeout/1 *nofail,
+ppl_reset_timeout/0 *nofail,
+ppl_new_MIP_Problem_from_space_dimension/2,
+ppl_new_MIP_Problem/5,
+ppl_new_MIP_Problem_from_MIP_Problem/2,
+ppl_MIP_Problem_swap/2 *nofail,
+ppl_delete_MIP_Problem/1 *nofail,
+ppl_MIP_Problem_space_dimension/2,
+ppl_MIP_Problem_integer_space_dimensions/2,
+ppl_MIP_Problem_constraints/2,
+ppl_MIP_Problem_objective_function/2,
+ppl_MIP_Problem_optimization_mode/2,
+ppl_MIP_Problem_clear/1,
+ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+ppl_MIP_Problem_add_constraint/2,
+ppl_MIP_Problem_add_constraints/2,
+ppl_MIP_Problem_set_objective_function/2,
+ppl_MIP_Problem_set_optimization_mode/2,
+ppl_MIP_Problem_is_satisfiable/1,
+ppl_MIP_Problem_solve/2,
+ppl_MIP_Problem_feasible_point/2,
+ppl_MIP_Problem_optimizing_point/2,
+ppl_MIP_Problem_optimal_value/3,
+ppl_MIP_Problem_evaluate_objective_function/4,
+ppl_MIP_Problem_OK/1`'dnl
+')
+
+m4_define(`m4_procedure_list', `m4_common_procedure_list')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
new file mode 100644
index 0000000..1be4f8d
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
@@ -0,0 +1,78 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Prolog system-dependent code files.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+dnl m4_separator(String)
+dnl
+dnl String is returned unless if it is empty, then use `,'
+m4_define(`m4_separator', `m4_ifelse($1, `', `,', `$1')')`'dnl
+dnl
+dnl m4_pattern_delimiter(String)
+dnl
+dnl For the system files we use the macro names
+dnl where the patterns have no delimiters
+dnl FIXME The `@' is temporary.
+dnl This needs to be replaced by the empty string `'
+dnl when the dat.m4 and code.m4 files are changed.
+m4_define(`m4_pattern_delimiter', `@')`'dnl
+dnl
+dnl m4_term_sequence(Number of Iterations, String to be Repeated)
+dnl
+dnl generates a sequence of strings with the option of
+dnl identifying each string uniquely and the option of
+dnl changing the separator from the default `,'.
+m4_define(`m4_term_sequence',
+  `m4_ifelse(`$1', 0, ,
+     `$2(1)`'m4_ifelse(`$1', 1, ,
+       `m4_forloop(`i', 2, `$1', `m4_separator(`$3') $2(i)')')')')
+
+dnl m4_library_names_to_code(Class_Kind,
+dnl                            Procedure_Name1, Procedure_Name2, ...)
+dnl
+dnl Each name from the second argument onwards is replaced
+dnl with the code and then the schema patterns in the code
+dnl are replaced by the various instances.
+m4_define(`m4_library_names_to_code', `dnl
+m4_ifelse($#, 0, ,$#, 1, ,$#, 2, m4_get_schematic_code($2, $1),
+       `dnl
+m4_get_schematic_code($2, $1)`'dnl
+m4_library_names_to_code(m4_incr($1), m4_shift(m4_shift($@)))`'dnl
+')`'dnl
+')
+
+dnl ppl_prolog_sys_code
+dnl
+dnl For each recognised class in the "classes" list,
+dnl takes main predicate input list and sends one line at a time to
+dnl a macro that adds extensions for the result of
+dnl a macro that sets the class and the schema(s).
+m4_define(`ppl_prolog_sys_code', `dnl
+m4_library_names_to_code(0, m4_library_predicate_list)`'dnl
+m4_all_code`'dnl
+')
diff --git a/interfaces/Prolog/ppl_prolog.icc b/interfaces/Prolog/ppl_prolog.icc
deleted file mode 100644
index eb8df70..0000000
--- a/interfaces/Prolog/ppl_prolog.icc
+++ /dev/null
@@ -1,3483 +0,0 @@
-/* Common part of the Prolog interfaces.  -*- C++ -*-
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl.hh"
-#include "pwl.hh"
-#include "track_allocation.hh"
-#include <set>
-#include <vector>
-#include <exception>
-#include <stdexcept>
-#include <sstream>
-#include <climits>
-
-using namespace Parma_Polyhedra_Library;
-
-namespace {
-
-Prolog_atom out_of_memory_exception_atom;
-
-// For Prolog lists.
-Prolog_atom a_nil;
-
-// For variables.
-Prolog_atom a_dollar_VAR;
-
-// For linear expressions.
-Prolog_atom a_plus;
-Prolog_atom a_minus;
-Prolog_atom a_asterisk;
-
-// To represent rational numbers as fractions.
-Prolog_atom a_slash;
-
-// For constraints.
-Prolog_atom a_less_than;
-Prolog_atom a_equal_less_than;
-Prolog_atom a_equal;
-Prolog_atom a_greater_than_equal;
-Prolog_atom a_greater_than;
-
-// For generators.
-Prolog_atom a_line;
-Prolog_atom a_ray;
-Prolog_atom a_point;
-Prolog_atom a_closure_point;
-
-// For the relation between a polyhedron and a constraint.
-Prolog_atom a_is_disjoint;
-Prolog_atom a_strictly_intersects;
-Prolog_atom a_is_included;
-Prolog_atom a_saturates;
-
-// For the relation between a polyhedron and a generator.
-Prolog_atom a_subsumes;
-
-// Denotes a closed interval boundary.
-Prolog_atom a_c;
-
-// Denotes the empty set such as the empty interval or polyhedron.
-Prolog_atom a_empty;
-
-// Denotes the universe polyhedron.
-Prolog_atom a_universe;
-
-// Denotes the maximization mode for optimization problems.
-Prolog_atom a_max;
-
-// Denotes the minimization mode for optimization problems.
-Prolog_atom a_min;
-
-// Denote possible outcomes of LP problems solution attempts.
-Prolog_atom a_unfeasible;
-Prolog_atom a_unbounded;
-Prolog_atom a_optimized;
-
-// Denotes an open interval boundary.
-Prolog_atom a_o;
-
-// Denotes the constructor that turns two boundaries into a proper interval.
-Prolog_atom a_i;
-
-// Denote the -infinity and +infinity interval boundaries.
-Prolog_atom a_minf;
-Prolog_atom a_pinf;
-
-// Denote complexity classes.
-Prolog_atom a_polynomial;
-Prolog_atom a_simplex;
-Prolog_atom a_any;
-
-// Default timeout exception atom.
-Prolog_atom a_time_out;
-
-// "Out of memory" exception atom.
-Prolog_atom a_out_of_memory;
-
-// Boolean constants.
-Prolog_atom a_true;
-Prolog_atom a_false;
-
-// To build exception terms.
-Prolog_atom a_ppl_invalid_argument;
-Prolog_atom a_ppl_overflow_error;
-Prolog_atom a_ppl_domain_error;
-Prolog_atom a_ppl_length_error;
-Prolog_atom a_ppl_representation_error;
-Prolog_atom a_expected;
-Prolog_atom a_found;
-Prolog_atom a_where;
-
-struct {
-  Prolog_atom* p_atom;
-  const char* name;
-} const prolog_atoms[] = {
-  { &a_nil,                      "[]" },
-
-  { &a_dollar_VAR,               "$VAR" },
-
-  { &a_plus,                     "+" },
-  { &a_minus,                    "-" },
-  { &a_asterisk,                 "*" },
-
-  { &a_slash,                    "/" },
-
-  { &a_equal,                    "=" },
-  { &a_greater_than_equal,       ">=" },
-  { &a_equal_less_than,          "=<" },
-  { &a_greater_than,             ">" },
-  { &a_less_than,                "<" },
-
-  { &a_line,                     "line" },
-  { &a_ray,                      "ray" },
-  { &a_point,                    "point" },
-  { &a_closure_point,            "closure_point" },
-
-  { &a_is_disjoint,              "is_disjoint" },
-  { &a_strictly_intersects,      "strictly_intersects" },
-  { &a_is_included,              "is_included" },
-  { &a_saturates,                "saturates" },
-
-  { &a_subsumes,                 "subsumes" },
-
-  { &a_c,                        "c" },
-
-  { &a_empty,                    "empty" },
-  { &a_universe,                 "universe" },
-
-  { &a_max,                      "max" },
-  { &a_min,                      "min" },
-
-  { &a_unfeasible,               "unfeasible" },
-  { &a_unbounded,                "unbounded" },
-  { &a_optimized,                "optimized" },
-
-  { &a_o,                        "o" },
-  { &a_i,                        "i" },
-
-  { &a_minf,                     "minf" },
-  { &a_pinf,                     "pinf" },
-
-  { &a_polynomial,               "polynomial" },
-  { &a_simplex,                  "simplex" },
-  { &a_any,                      "any" },
-
-  { &a_time_out,                 "time_out" },
-  { &a_out_of_memory,            "out_of_memory" },
-
-  { &a_true,                     "true" },
-  { &a_false,                    "false" },
-
-  { &a_ppl_invalid_argument,     "ppl_invalid_argument" },
-  { &a_ppl_overflow_error,       "ppl_overflow_error" },
-  { &a_ppl_domain_error,         "ppl_domain_error" },
-  { &a_ppl_length_error,         "ppl_length_error" },
-  { &a_ppl_representation_error, "ppl_representation_error" },
-  { &a_expected,                 "expected" },
-  { &a_found,                    "found" },
-  { &a_where,                    "where" }
-};
-
-Prolog_term_ref
-Prolog_atom_term_from_string(const char* s) {
-  Prolog_term_ref t = Prolog_new_term_ref();
-  Prolog_put_atom(t, Prolog_atom_from_string(s));
-  return t;
-}
-
-void
-handle_exception(const Prolog_unsigned_out_of_range& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref max = Prolog_new_term_ref();
-  Prolog_put_ulong(max, e.max());
-  Prolog_construct_compound(max,
-			    Prolog_atom_from_string("unsigned_integer"
-						    "_less_than_or_equal_to"),
-			    max);
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected, max);
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string("term_to_unsigned"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_unsigned_integer& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected,
-			    Prolog_atom_term_from_string("unsigned_integer"));
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string("term_to_unsigned"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const non_linear& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected,
-			    Prolog_atom_term_from_string
-			    ("linear_expression_or_constraint"));
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string(e.where()));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_a_variable& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found,
-			    e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected,
-			    Prolog_atom_term_from_string
-			    ("$VAR(unsigned_integer)"));
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string("term_to_Variable"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_an_integer& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected,
-			    Prolog_atom_term_from_string("integer"));
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_Coefficient"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_a_polyhedron_handle& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected,
-			    Prolog_atom_term_from_string("polyhedron_handle"));
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_polyhedron_handle"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_an_optimization_mode& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_put_atom(expected, a_nil);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("max"), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("min"), expected);
-  Prolog_construct_compound(expected, a_expected, expected);
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_optimization_mode"));
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_an_lp_problem_handle& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_construct_compound(expected, a_expected,
-			    Prolog_atom_term_from_string("lp_problem_handle"));
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_lp_problem_handle"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_a_complexity_class& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_put_atom(expected, a_nil);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("polynomial"), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("simplex"), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("any"), expected);
-  Prolog_construct_compound(expected, a_expected, expected);
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_complexity_class"));
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_universe_or_empty& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_put_atom(expected, a_nil);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("universe"), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("empty"), expected);
-  Prolog_construct_compound(expected, a_expected, expected);
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_universe_or_empty"));
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_a_relation& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_put_atom(expected, a_nil);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("="), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string(">="), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("=<"), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string(">"), expected);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string("<"), expected);
-  Prolog_construct_compound(expected, a_expected, expected);
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("term_to_relation"));
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const not_a_nil_terminated_list& e) {
-  Prolog_term_ref found = Prolog_new_term_ref();
-  Prolog_construct_compound(found, a_found, e.term());
-
-  Prolog_term_ref expected = Prolog_new_term_ref();
-  Prolog_put_atom(expected, a_nil);
-  Prolog_construct_cons(expected,
-			Prolog_atom_term_from_string
-                        ("Prolog_list"), expected);
-  Prolog_construct_compound(expected, a_expected, expected);
-
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("check_nil_terminating"));
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			    found, expected, where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const PPL_integer_out_of_range& e) {
-  Prolog_term_ref where = Prolog_new_term_ref();
-  Prolog_construct_compound(where, a_where,
-			    Prolog_atom_term_from_string
-			    ("Coefficient_to_integer_term"));
-
-  Prolog_term_ref exception_term = Prolog_new_term_ref();
-  std::ostringstream s;
-  s << e.i();
-  Prolog_construct_compound(exception_term, a_ppl_representation_error,
-			    Prolog_atom_term_from_string(s.str().c_str()),
-			    where);
-  Prolog_raise_exception(exception_term);
-}
-
-void
-handle_exception(const unknown_interface_error& e) {
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_put_atom_chars(et, e.where());
-  Prolog_raise_exception(et);
-}
-
-void
-handle_exception(const std::overflow_error& e) {
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_construct_compound(et, a_ppl_overflow_error,
-			    Prolog_atom_term_from_string(e.what()));
-  Prolog_raise_exception(et);
-}
-
-void
-handle_exception(const std::length_error& e) {
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_construct_compound(et, a_ppl_length_error,
-			    Prolog_atom_term_from_string(e.what()));
-  Prolog_raise_exception(et);
-}
-
-void
-handle_exception(const std::bad_alloc&) {
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_put_atom(et, out_of_memory_exception_atom);
-  Prolog_raise_exception(et);
-}
-
-void
-handle_exception(const std::exception& e) {
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_put_atom_chars(et, e.what());
-  Prolog_raise_exception(et);
-}
-
-void
-handle_exception() {
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_put_atom_chars(et, "PPL bug: unknown exception raised");
-  Prolog_raise_exception(et);
-}
-
-class timeout_exception : public Throwable {
-public:
-  void throw_me() const {
-    throw *this;
-  }
-  int priority() const {
-    return 0;
-  }
-  timeout_exception() {
-  }
-};
-
-Prolog_atom timeout_exception_atom;
-
-Parma_Watchdog_Library::Watchdog* p_timeout_object = 0;
-
-void
-reset_timeout() {
-  if (p_timeout_object) {
-    delete p_timeout_object;
-    p_timeout_object = 0;
-    abandon_expensive_computations = 0;
-  }
-}
-
-void
-handle_exception(const timeout_exception&) {
-  assert(p_timeout_object);
-  reset_timeout();
-  Prolog_term_ref et = Prolog_new_term_ref();
-  Prolog_put_atom(et, timeout_exception_atom);
-  Prolog_raise_exception(et);
-}
-
-#define CATCH_ALL \
-  catch (const Prolog_unsigned_out_of_range& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_unsigned_integer& e) { \
-    handle_exception(e); \
-  } \
-  catch (const non_linear& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_a_variable& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_an_integer& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_a_polyhedron_handle& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_an_optimization_mode& e) {	\
-    handle_exception(e); \
-  } \
-  catch (const not_an_lp_problem_handle& e) {	\
-    handle_exception(e); \
-  } \
-  catch (const not_a_complexity_class& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_universe_or_empty& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_a_relation& e) { \
-    handle_exception(e); \
-  } \
-  catch (const not_a_nil_terminated_list& e) { \
-    handle_exception(e); \
-  } \
-  catch (const PPL_integer_out_of_range& e) { \
-    handle_exception(e); \
-  } \
-  catch (const unknown_interface_error& e) { \
-    handle_exception(e); \
-  } \
-  catch (const timeout_exception& e) { \
-    handle_exception(e); \
-  } \
-  catch(const std::overflow_error& e) { \
-    handle_exception(e); \
-  } \
-  catch(const std::length_error& e) { \
-    handle_exception(e); \
-  } \
-  catch (const std::bad_alloc& e) { \
-    handle_exception(e); \
-  } \
-  catch (const std::exception& e) { \
-    handle_exception(e); \
-  } \
-  catch (...) { \
-    handle_exception(); \
-  } \
-  return PROLOG_FAILURE
-
-Prolog_term_ref
-variable_term(dimension_type varid) {
-  Prolog_term_ref v = Prolog_new_term_ref();
-  Prolog_put_ulong(v, varid);
-  Prolog_term_ref t = Prolog_new_term_ref();
-  Prolog_construct_compound(t, a_dollar_VAR, v);
-  return t;
-}
-
-#if 0
-unsigned int
-get_unsigned_int(long n) {
-  if (n >= 0 && static_cast<unsigned long>(n) <= UINT_MAX)
-    return n;
-  else {
-    Prolog_term_ref n_term = Prolog_new_term_ref();
-    Prolog_put_long(n_term, n);
-    throw not_unsigned_integer(n_term);
-  }
-}
-#endif
-
-template <typename U>
-U
-term_to_unsigned(Prolog_term_ref t) {
-  if (!Prolog_is_integer(t))
-    throw not_unsigned_integer(t);
-
-  U d = 0;
-  long l;
-  if (Prolog_get_long(t, &l))
-    if (l < 0)
-      throw not_unsigned_integer(t);
-    else if (static_cast<unsigned long>(l) > std::numeric_limits<U>::max())
-      throw Prolog_unsigned_out_of_range(t, std::numeric_limits<U>::max());
-    else
-      d = l;
-  else {
-    Coefficient v = integer_term_to_Coefficient(t);
-    if (v < 0)
-      throw not_unsigned_integer(t);
-    if (assign_r(d, raw_value(v), ROUND_NOT_NEEDED) != V_EQ)
-      throw Prolog_unsigned_out_of_range(t, std::numeric_limits<U>::max());
-  }
-  return d;
-}
-
-Prolog_atom
-term_to_universe_or_empty(Prolog_term_ref t) {
-  if (Prolog_is_atom(t)) {
-    Prolog_atom name;
-    if (Prolog_get_atom_name(t, &name)
-	&& (name == a_universe || name == a_empty))
-      return name;
-  }
-  throw not_universe_or_empty(t);
-}
-
-Linear_Expression
-build_linear_expression(Prolog_term_ref t) {
-  if (Prolog_is_integer(t))
-    return Linear_Expression(integer_term_to_Coefficient(t));
-  else if (Prolog_is_compound(t)) {
-    Prolog_atom functor;
-    int arity;
-    Prolog_get_compound_name_arity(t, &functor, &arity);
-    switch (arity) {
-    case 1:
-      {
-	Prolog_term_ref arg = Prolog_new_term_ref();
-	Prolog_get_arg(1, t, arg);
-	if (functor == a_minus)
-	  // Unary minus.
-	  return -build_linear_expression(arg);
-	else if (functor == a_dollar_VAR)
-	  // Variable.
-	  return Variable(term_to_unsigned<dimension_type>(arg));
-      }
-      break;
-    case 2:
-      {
-	Prolog_term_ref arg1 = Prolog_new_term_ref();
-	Prolog_term_ref arg2 = Prolog_new_term_ref();
-	Prolog_get_arg(1, t, arg1);
-	Prolog_get_arg(2, t, arg2);
-	if (functor == a_plus)
-	  // Plus.
-	  if (Prolog_is_integer(arg1))
-	    return integer_term_to_Coefficient(arg1)
-	      + build_linear_expression(arg2);
-	  else if (Prolog_is_integer(arg2))
-	    return build_linear_expression(arg1)
-	      + integer_term_to_Coefficient(arg2);
-	  else
-	    return build_linear_expression(arg1)
-	      + build_linear_expression(arg2);
-	else if (functor == a_minus)
-	  // Minus.
-	  if (Prolog_is_integer(arg1))
-	    return integer_term_to_Coefficient(arg1)
-	      - build_linear_expression(arg2);
-	  else if (Prolog_is_integer(arg2))
-	    return build_linear_expression(arg1)
-	      - integer_term_to_Coefficient(arg2);
-	  else
-	    return build_linear_expression(arg1)
-	      - build_linear_expression(arg2);
-	else if (functor == a_asterisk)
-	  // Times.
-	  if (Prolog_is_integer(arg1))
-	    return integer_term_to_Coefficient(arg1)
-	      * build_linear_expression(arg2);
-	  else if (Prolog_is_integer(arg2))
-	    return build_linear_expression(arg1)
-	      * integer_term_to_Coefficient(arg2);
-      }
-    }
-  }
-  // Invalid.
-  throw non_linear("build_linear_expression", t);
-}
-
-
-Constraint
-build_constraint(Prolog_term_ref t) {
-  if (Prolog_is_compound(t)) {
-    Prolog_atom functor;
-    int arity;
-    Prolog_get_compound_name_arity(t, &functor, &arity);
-    if (arity == 2) {
-      Prolog_term_ref arg1 = Prolog_new_term_ref();
-      Prolog_term_ref arg2 = Prolog_new_term_ref();
-      Prolog_get_arg(1, t, arg1);
-      Prolog_get_arg(2, t, arg2);
-      if (functor == a_equal)
-	// =
-	if (Prolog_is_integer(arg1))
-	  return integer_term_to_Coefficient(arg1)
-	    == build_linear_expression(arg2);
-	else if (Prolog_is_integer(arg2))
-	  return build_linear_expression(arg1)
-	    == integer_term_to_Coefficient(arg2);
-	else
-	  return build_linear_expression(arg1)
-	    == build_linear_expression(arg2);
-      else if (functor == a_equal_less_than)
-	// =<
-	if (Prolog_is_integer(arg1))
-	  return integer_term_to_Coefficient(arg1)
-	    <= build_linear_expression(arg2);
-	else if (Prolog_is_integer(arg2))
-	  return build_linear_expression(arg1)
-	    <= integer_term_to_Coefficient(arg2);
-	else
-	  return build_linear_expression(arg1)
-	    <= build_linear_expression(arg2);
-      else if (functor == a_greater_than_equal)
-	// >=
-	if (Prolog_is_integer(arg1))
-	  return integer_term_to_Coefficient(arg1)
-	    >= build_linear_expression(arg2);
-	else if (Prolog_is_integer(arg2))
-	  return build_linear_expression(arg1)
-	    >= integer_term_to_Coefficient(arg2);
-	else
-	  return build_linear_expression(arg1)
-	    >= build_linear_expression(arg2);
-      else if (functor == a_less_than)
-	// <
-	if (Prolog_is_integer(arg1))
-	  return integer_term_to_Coefficient(arg1)
-	    < build_linear_expression(arg2);
-	else if (Prolog_is_integer(arg2))
-	  return build_linear_expression(arg1)
-	    < integer_term_to_Coefficient(arg2);
-	else
-	  return build_linear_expression(arg1)
-	    < build_linear_expression(arg2);
-      else if (functor == a_greater_than)
-	// >
-	if (Prolog_is_integer(arg1))
-	  return integer_term_to_Coefficient(arg1)
-	    > build_linear_expression(arg2);
-	else if (Prolog_is_integer(arg2))
-	  return build_linear_expression(arg1)
-	    > integer_term_to_Coefficient(arg2);
-	else
-	  return build_linear_expression(arg1)
-	    > build_linear_expression(arg2);
-    }
-  }
-  // Invalid.
-  throw non_linear("build_constraint", t);
-}
-
-Generator
-build_generator(Prolog_term_ref t) {
-  if (Prolog_is_compound(t)) {
-    Prolog_atom functor;
-    int arity;
-    Prolog_get_compound_name_arity(t, &functor, &arity);
-    if (arity == 1) {
-      Prolog_term_ref arg = Prolog_new_term_ref();
-      Prolog_get_arg(1, t, arg);
-      if (functor == a_line)
-	return Generator::line(build_linear_expression(arg));
-      else if (functor == a_ray)
-	return Generator::ray(build_linear_expression(arg));
-      else if (functor == a_point)
-	return Generator::point(build_linear_expression(arg));
-      else if (functor == a_closure_point)
-	return Generator::closure_point(build_linear_expression(arg));
-    }
-    else if (arity == 2) {
-      Prolog_term_ref arg1 = Prolog_new_term_ref();
-      Prolog_term_ref arg2 = Prolog_new_term_ref();
-      Prolog_get_arg(1, t, arg1);
-      Prolog_get_arg(2, t, arg2);
-      if (Prolog_is_integer(arg2)) {
-        if (functor == a_point)
-	  return Generator::point(build_linear_expression(arg1),
-				  integer_term_to_Coefficient(arg2));
-        else if (functor == a_closure_point)
-	  return Generator::closure_point(build_linear_expression(arg1),
-					  integer_term_to_Coefficient(arg2));
-      }
-    }
-  }
-  // Invalid.
-  throw non_linear("build_generator", t);
-}
-
-template <typename R>
-Prolog_term_ref
-get_linear_expression(const R& r) {
-  Prolog_term_ref so_far = Prolog_new_term_ref();
-  Coefficient coefficient;
-  dimension_type varid = 0;
-  dimension_type space_dimension = r.space_dimension();
-  while (varid < space_dimension
-	 && (coefficient = r.coefficient(Variable(varid))) == 0)
-    ++varid;
-  if (varid >= space_dimension) {
-    Prolog_put_long(so_far, 0);
-  }
-  else {
-    Prolog_construct_compound(so_far, a_asterisk,
-			      Coefficient_to_integer_term(coefficient),
-			      variable_term(varid));
-    while (true) {
-      ++varid;
-      while (varid < space_dimension
-	     && (coefficient = r.coefficient(Variable(varid))) == 0)
-	++varid;
-      if (varid >= space_dimension)
-	break;
-      else {
-	Prolog_term_ref addendum = Prolog_new_term_ref();
-	Prolog_construct_compound(addendum, a_asterisk,
-				  Coefficient_to_integer_term(coefficient),
-				  variable_term(varid));
-	Prolog_term_ref new_so_far = Prolog_new_term_ref();
-	Prolog_construct_compound(new_so_far, a_plus,
-				  so_far, addendum);
-	so_far = new_so_far;
-      }
-    }
-  }
-  return so_far;
-}
-
-Prolog_term_ref
-constraint_term(const Constraint& c) {
-  Prolog_atom relation = 0;
-  switch (c.type()) {
-  case Constraint::EQUALITY:
-    relation = a_equal;
-    break;
-  case Constraint::NONSTRICT_INEQUALITY:
-    relation = a_greater_than_equal;
-    break;
-  case Constraint::STRICT_INEQUALITY:
-    relation = a_greater_than;
-    break;
-  default:
-    throw unknown_interface_error("generator_term()");
-  }
-  Prolog_term_ref t = Prolog_new_term_ref();
-  Prolog_construct_compound
-    (t,
-     relation,
-     get_linear_expression(c),
-     Coefficient_to_integer_term(-c.inhomogeneous_term()));
-  return t;
-}
-
-Prolog_term_ref
-generator_term(const Generator& g) {
-  Prolog_term_ref t = Prolog_new_term_ref();
-  Prolog_atom constructor = 0;
-  switch (g.type()) {
-  case Generator::LINE:
-    constructor = a_line;
-    break;
-  case Generator::RAY:
-    constructor = a_ray;
-    break;
-  case Generator::POINT:
-    {
-      constructor = a_point;
-      const Coefficient& divisor = g.divisor();
-      if (divisor == 1)
-	break;
-      else {
-	Prolog_construct_compound(t, constructor,
-				  get_linear_expression(g),
-				  Coefficient_to_integer_term(divisor));
-	return t;
-      }
-    }
-  case Generator::CLOSURE_POINT:
-    {
-      constructor = a_closure_point;
-      const Coefficient& divisor = g.divisor();
-      if (divisor == 1)
-	break;
-      else {
-	Prolog_construct_compound(t, constructor,
-				  get_linear_expression(g),
-				  Coefficient_to_integer_term(divisor));
-	return t;
-      }
-    }
-  default:
-    throw unknown_interface_error("generator_term()");
-  }
-  Prolog_construct_compound(t, constructor, get_linear_expression(g));
-  return t;
-}
-
-Variable
-term_to_Variable(Prolog_term_ref t) {
-  if (Prolog_is_compound(t)) {
-    Prolog_atom functor;
-    int arity;
-    Prolog_get_compound_name_arity(t, &functor, &arity);
-    if (functor == a_dollar_VAR && arity == 1) {
-      Prolog_term_ref arg = Prolog_new_term_ref();
-      Prolog_get_arg(1, t, arg);
-      return Variable(term_to_unsigned<dimension_type>(arg));
-    }
-  }
-  throw not_a_variable(t);
-}
-
-Coefficient
-term_to_Coefficient(Prolog_term_ref t) {
-  if (Prolog_is_integer(t))
-    return integer_term_to_Coefficient(t);
-  else
-    throw not_an_integer(t);
-}
-
-Polyhedron*
-term_to_polyhedron_handle(Prolog_term_ref t_ph) {
-  if (Prolog_is_address(t_ph)) {
-    void* p;
-    if (Prolog_get_address(t_ph, &p))
-      return static_cast<Polyhedron*>(p);
-  }
-  throw not_a_polyhedron_handle(t_ph);
-}
-
-LP_Problem*
-term_to_lp_problem_handle(Prolog_term_ref t_lp) {
-  if (Prolog_is_address(t_lp)) {
-    void* p;
-    if (Prolog_get_address(t_lp, &p))
-      return static_cast<LP_Problem*>(p);
-  }
-  throw not_an_lp_problem_handle(t_lp);
-}
-
-Prolog_atom
-term_to_optimization_mode(Prolog_term_ref t) {
-  if (Prolog_is_atom(t)) {
-    Prolog_atom name;
-    if (Prolog_get_atom_name(t, &name)
-	&& (name == a_max || name == a_min))
-      return name;
-  }
-  throw not_an_optimization_mode(t);
-}
-
-bool Prolog_interface_initialized = false;
-
-bool
-unify_long(Prolog_term_ref t, long l) {
-  Prolog_term_ref t_l = Prolog_new_term_ref();
-  return Prolog_put_long(t_l, l) && Prolog_unify(t, t_l);
-}
-
-bool
-unify_ulong(Prolog_term_ref t, unsigned long l) {
-  Prolog_term_ref t_l = Prolog_new_term_ref();
-  return Prolog_put_ulong(t_l, l) && Prolog_unify(t, t_l);
-}
-
-void
-check_nil_terminating(Prolog_term_ref t) {
-  if (Prolog_is_atom(t)) {
-    Prolog_atom a;
-    Prolog_get_atom_name(t, &a);
-    if (a == a_nil)
-      return;
-  }
-    throw not_a_nil_terminated_list(t);
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_version_major(Prolog_term_ref t_v) {
-  try {
-    if (unify_ulong(t_v, version_major()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_version_minor(Prolog_term_ref t_v) {
-  try {
-    if (unify_ulong(t_v, version_minor()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_version_revision(Prolog_term_ref t_v) {
-  try {
-    if (unify_ulong(t_v, version_revision()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_version_beta(Prolog_term_ref t_v) {
-  try {
-    if (unify_ulong(t_v, version_beta()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_version(Prolog_term_ref t_v) {
-  try {
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_atom_chars(tmp, version());
-    if (Prolog_unify(t_v, tmp))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_banner(Prolog_term_ref t_b) {
-  try {
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_atom_chars(tmp, banner());
-    if (Prolog_unify(t_b, tmp))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-inline dimension_type
-max_representable_dimension(dimension_type d) {
-  return
-    Prolog_has_unbounded_integers
-    ? d
-    : std::min(d, static_cast<dimension_type>(Prolog_max_integer));
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_max_space_dimension(Prolog_term_ref t_msd) {
-  try {
-    if (unify_ulong(t_msd, max_representable_dimension(max_space_dimension())))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_initialize() {
-  try {
-    if (Prolog_interface_initialized)
-      return PROLOG_SUCCESS;
-    for (size_t
-	   i = sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); i-- > 0; ) {
-      Prolog_atom a = Prolog_atom_from_string(prolog_atoms[i].name);
-      *prolog_atoms[i].p_atom = a;
-    }
-    timeout_exception_atom = a_time_out;
-    out_of_memory_exception_atom = a_out_of_memory;
-    ppl_Prolog_sysdep_init();
-    Prolog_interface_initialized = true;
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_finalize() {
-  try {
-    if (!Prolog_interface_initialized)
-      return PROLOG_SUCCESS;
-
-    Prolog_interface_initialized = false;
-    // Release the pending timeout object, if any.
-    reset_timeout();
-    ppl_Prolog_sysdep_deinit();
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_set_timeout_exception_atom(Prolog_term_ref t_tea) {
-  try {
-    if (Prolog_is_atom(t_tea)) {
-      Prolog_atom tea;
-      if (Prolog_get_atom_name(t_tea, &tea)) {
-	timeout_exception_atom = tea;
-	return PROLOG_SUCCESS;
-      }
-    }
-    Prolog_term_ref found = Prolog_new_term_ref();
-    Prolog_construct_compound(found, a_found, t_tea);
-
-    Prolog_term_ref expected = Prolog_new_term_ref();
-    Prolog_construct_compound(expected, a_expected,
-			      Prolog_atom_term_from_string("atom"));
-
-    Prolog_term_ref where = Prolog_new_term_ref();
-    Prolog_construct_compound(where, a_where,
-			      Prolog_atom_term_from_string
-			      ("ppl_set_timeout_exception_atom"));
-
-    Prolog_term_ref exception_term = Prolog_new_term_ref();
-    Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
-			      found, expected, where);
-    Prolog_raise_exception(exception_term);
-    return PROLOG_FAILURE;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_timeout_exception_atom(Prolog_term_ref t) {
-  try {
-    Prolog_term_ref t_tea = Prolog_new_term_ref();
-    Prolog_put_atom(t_tea, timeout_exception_atom);
-    return Prolog_unify(t_tea, t) ? PROLOG_SUCCESS : PROLOG_FAILURE;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_set_timeout(Prolog_term_ref t_time) {
-  try {
-    // In case a timeout was already set.
-    reset_timeout();
-    static timeout_exception e;
-    unsigned hundredth_secs = term_to_unsigned<unsigned>(t_time);
-    p_timeout_object =
-      new Parma_Watchdog_Library::Watchdog(hundredth_secs,
-					   abandon_expensive_computations,
-					   e);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_reset_timeout() {
-  try {
-    reset_timeout();
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Coefficient_is_bounded() {
-  try {
-    if (std::numeric_limits<Coefficient>::is_bounded)
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Coefficient_min(Prolog_term_ref t_min) {
-  try {
-    if (std::numeric_limits<Coefficient>::is_bounded) {
-      Coefficient min = std::numeric_limits<Coefficient>::min();
-      if (Prolog_has_unbounded_integers
-	  || (min >= Prolog_min_integer && min <= Prolog_min_integer))
-	return Prolog_unify(t_min, Coefficient_to_integer_term(min));
-    }
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Coefficient_max(Prolog_term_ref t_max) {
-  try {
-    if (std::numeric_limits<Coefficient>::is_bounded) {
-      Coefficient max = std::numeric_limits<Coefficient>::max();
-      if (Prolog_has_unbounded_integers
-	  || (max >= Prolog_min_integer && max <= Prolog_min_integer))
-	return Prolog_unify(t_max, Coefficient_to_integer_term(max));
-    }
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_C_Polyhedron_from_space_dimension(Prolog_term_ref t_nd,
-					  Prolog_term_ref t_uoe,
-					  Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph;
-    Prolog_atom uoe = term_to_universe_or_empty(t_uoe);
-
-    if (uoe == a_empty)
-        ph = new C_Polyhedron(term_to_unsigned<dimension_type>(t_nd),
-			      EMPTY);
-      else
-        ph = new C_Polyhedron(term_to_unsigned<dimension_type>(t_nd));
-
-
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_NNC_Polyhedron_from_space_dimension(Prolog_term_ref t_nd,
-					    Prolog_term_ref t_uoe,
-					    Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph;
-    Prolog_atom uoe = term_to_universe_or_empty(t_uoe);
-
-    if (uoe == a_empty)
-        ph = new NNC_Polyhedron(term_to_unsigned<dimension_type>(t_nd),
-			      EMPTY);
-      else
-        ph = new NNC_Polyhedron(term_to_unsigned<dimension_type>(t_nd));
-
-
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_C_Polyhedron_from_C_Polyhedron(Prolog_term_ref t_ph_source,
-				       Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph;
-    const C_Polyhedron* ph_source
-	= static_cast<const C_Polyhedron*>
-	(term_to_polyhedron_handle(t_ph_source));
-    CHECK(ph_source);
-        ph = new C_Polyhedron(*ph_source);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_NNC_Polyhedron_from_C_Polyhedron(Prolog_term_ref t_ph_source,
-					 Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph;
-    const C_Polyhedron* ph_source
-	= static_cast<const C_Polyhedron*>
-	(term_to_polyhedron_handle(t_ph_source));
-    CHECK(ph_source);
-        ph = new NNC_Polyhedron(*ph_source);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_C_Polyhedron_from_NNC_Polyhedron(Prolog_term_ref t_ph_source,
-					 Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph;
-    const NNC_Polyhedron* ph_source
-	= static_cast<const NNC_Polyhedron*>
-	(term_to_polyhedron_handle(t_ph_source));
-    CHECK(ph_source);
-        ph = new C_Polyhedron(*ph_source);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Prolog_term_ref t_ph_source,
-					   Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph;
-    const NNC_Polyhedron* ph_source
-	= static_cast<const NNC_Polyhedron*>
-	(term_to_polyhedron_handle(t_ph_source));
-    CHECK(ph_source);
-        ph = new NNC_Polyhedron(*ph_source);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_C_Polyhedron_from_constraints(Prolog_term_ref t_clist,
-				      Prolog_term_ref t_ph) {
-  try {
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    Polyhedron* ph;
-    ph = new C_Polyhedron(cs);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_NNC_Polyhedron_from_constraints(Prolog_term_ref t_clist,
-					Prolog_term_ref t_ph) {
-  try {
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    Polyhedron* ph;
-    ph = new NNC_Polyhedron(cs);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_C_Polyhedron_from_generators(Prolog_term_ref t_glist,
-				     Prolog_term_ref t_ph) {
-  try {
-    Generator_System gs;
-    Prolog_term_ref g = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_glist)) {
-      Prolog_get_cons(t_glist, g, t_glist);
-      gs.insert(build_generator(g));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_glist);
-
-    Polyhedron* ph;
-    ph = new C_Polyhedron(gs);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_NNC_Polyhedron_from_generators(Prolog_term_ref t_glist,
-				       Prolog_term_ref t_ph) {
-  try {
-    Generator_System gs;
-    Prolog_term_ref g = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_glist)) {
-      Prolog_get_cons(t_glist, g, t_glist);
-      gs.insert(build_generator(g));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_glist);
-
-    Polyhedron* ph;
-    ph = new NNC_Polyhedron(gs);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-enum Boundary_Kind {
-  LOWER,
-  UPPER
-};
-
-bool
-term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
-		 bool& finite, bool& closed,
-		 Coefficient& n, Coefficient& d) {
-  if (!Prolog_is_compound(t_b))
-    return false;
-
-  Prolog_atom functor;
-  int arity;
-
-  Prolog_get_compound_name_arity(t_b, &functor, &arity);
-  // A boundary term is either of the form c(Limit) or o(Limit).
-  if (arity != 1 || (functor != a_c && functor != a_o))
-    return false;
-
-  Prolog_atom open_closed_atom = functor;
-
-  Prolog_term_ref t_limit = Prolog_new_term_ref();
-  Prolog_get_arg(1, t_b, t_limit);
-  if (Prolog_is_integer(t_limit)) {
-    // A finite, integral limit.
-    finite = true;
-    closed = (open_closed_atom == a_c);
-    n = integer_term_to_Coefficient(t_limit);
-    d = 1;
-  }
-  else if (Prolog_is_atom(t_limit)) {
-    Prolog_atom a;
-    Prolog_get_atom_name(t_limit, &a);
-    Prolog_atom allowed_infinity = (kind == LOWER ? a_minf : a_pinf);
-    // Only open bounds may be unbounded.
-    if (a != allowed_infinity || open_closed_atom != a_o)
-      return false;
-
-    finite = false;
-  }
-  else if (Prolog_is_compound(t_limit)) {
-    Prolog_get_compound_name_arity(t_limit, &functor, &arity);
-    if (arity != 2 || functor != a_slash)
-      return false;
-
-    Prolog_term_ref t_n = Prolog_new_term_ref();
-    Prolog_term_ref t_d = Prolog_new_term_ref();
-    Prolog_get_arg(1, t_limit, t_n);
-    Prolog_get_arg(2, t_limit, t_d);
-
-    if (!Prolog_is_integer(t_n) || !Prolog_is_integer(t_d))
-      return false;
-    else {
-      finite = true;
-      closed = (open_closed_atom == a_c);
-      n = integer_term_to_Coefficient(t_n);
-      d = integer_term_to_Coefficient(t_d);
-      // Catch negative denominators and divisions by zero here.
-      if (d <= 0)
-        return false;
-    }
-  }
-  return true;
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_new_C_Polyhedron_from_bounding_box(Prolog_term_ref t_bb,
-				       Prolog_term_ref t_ph) {
-  try {
-    // Compute the space dimension.
-    Prolog_term_ref t_l = Prolog_new_term_ref();
-    Prolog_term_ref t_interval = Prolog_new_term_ref();
-    Prolog_put_term(t_l, t_bb);
-    dimension_type dimension;
-    for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
-      Prolog_get_cons(t_l, t_interval, t_l);
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_l);
-
-    Bounding_Box bbox(dimension);
-    // Set bbox to reflect its Prolog representation.
-    for (dimension_type i = 0; i < dimension; ++i) {
-      Prolog_get_cons(t_bb, t_interval, t_bb);
-      // An interval is either the atom empty or of the form
-      // i(Lower_Bound, Upper_Bound).
-      if (Prolog_is_atom(t_interval)) {
-	Prolog_atom name;
-	if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
-	  bbox.set_empty();
-	  continue;
-	}
-	else
-	  return PROLOG_FAILURE;
-      }
-
-      if (!Prolog_is_compound(t_interval))
-	return PROLOG_FAILURE;
-
-      Prolog_atom functor;
-      int arity;
-      Prolog_get_compound_name_arity(t_interval, &functor, &arity);
-      if (arity != 2 || functor != a_i)
-	return PROLOG_FAILURE;
-
-      bool finite;
-      bool closed;
-      Coefficient n;
-      Coefficient d;
-      Prolog_term_ref t_bound = Prolog_new_term_ref();
-
-      // Get and raise the lower bound.
-      Prolog_get_arg(1, t_interval, t_bound);
-      if (!term_to_boundary(t_bound, LOWER, finite, closed, n, d))
-	return PROLOG_FAILURE;
-      if (finite)
-	bbox.raise_lower_bound(i, closed, n, d);
-
-      // Get and lower the upper bound.
-      Prolog_get_arg(2, t_interval, t_bound);
-      if (!term_to_boundary(t_bound, UPPER, finite, closed, n, d))
-	return PROLOG_FAILURE;
-      if (finite)
-	bbox.lower_upper_bound(i, closed, n, d);
-    }
-
-    Polyhedron* ph;
-    ph = new C_Polyhedron(bbox, From_Bounding_Box());
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_NNC_Polyhedron_from_bounding_box(Prolog_term_ref t_bb,
-					 Prolog_term_ref t_ph) {
-  try {
-    // Compute the space dimension.
-    Prolog_term_ref t_l = Prolog_new_term_ref();
-    Prolog_term_ref t_interval = Prolog_new_term_ref();
-    Prolog_put_term(t_l, t_bb);
-    dimension_type dimension;
-    for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
-      Prolog_get_cons(t_l, t_interval, t_l);
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_l);
-
-    Bounding_Box bbox(dimension);
-    // Set bbox to reflect its Prolog representation.
-    for (dimension_type i = 0; i < dimension; ++i) {
-      Prolog_get_cons(t_bb, t_interval, t_bb);
-      // An interval is either the atom empty or of the form
-      // i(Lower_Bound, Upper_Bound).
-      if (Prolog_is_atom(t_interval)) {
-	Prolog_atom name;
-	if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
-	  bbox.set_empty();
-	  continue;
-	}
-	else
-	  return PROLOG_FAILURE;
-      }
-
-      if (!Prolog_is_compound(t_interval))
-	return PROLOG_FAILURE;
-
-      Prolog_atom functor;
-      int arity;
-      Prolog_get_compound_name_arity(t_interval, &functor, &arity);
-      if (arity != 2 || functor != a_i)
-	return PROLOG_FAILURE;
-
-      bool finite;
-      bool closed;
-      Coefficient n;
-      Coefficient d;
-      Prolog_term_ref t_bound = Prolog_new_term_ref();
-
-      // Get and raise the lower bound.
-      Prolog_get_arg(1, t_interval, t_bound);
-      if (!term_to_boundary(t_bound, LOWER, finite, closed, n, d))
-	return PROLOG_FAILURE;
-      if (finite)
-	bbox.raise_lower_bound(i, closed, n, d);
-
-      // Get and lower the upper bound.
-      Prolog_get_arg(2, t_interval, t_bound);
-      if (!term_to_boundary(t_bound, UPPER, finite, closed, n, d))
-	return PROLOG_FAILURE;
-      if (finite)
-	bbox.lower_upper_bound(i, closed, n, d);
-    }
-
-    Polyhedron* ph;
-    ph = new NNC_Polyhedron(bbox, From_Bounding_Box());
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, ph);
-    if (Prolog_unify(t_ph, tmp)) {
-      REGISTER(ph);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete ph;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    lhs->swap(*rhs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_delete_Polyhedron(Prolog_term_ref t_ph) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    UNREGISTER(ph);
-    delete ph;
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_space_dimension(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (unify_ulong(t_sd, ph->space_dimension()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_affine_dimension(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (unify_ulong(t_sd, ph->affine_dimension()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_get_constraints(Prolog_term_ref t_ph,
-			       Prolog_term_ref t_clist) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    const Constraint_System& cs = ph->constraints();
-    for (Constraint_System::const_iterator i = cs.begin(),
-	   cs_end = cs.end(); i != cs_end; ++i)
-      Prolog_construct_cons(tail, constraint_term(*i), tail);
-
-    if (Prolog_unify(t_clist, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_get_minimized_constraints(Prolog_term_ref t_ph,
-					 Prolog_term_ref t_clist) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    const Constraint_System& cs = ph->minimized_constraints();
-    for (Constraint_System::const_iterator i = cs.begin(),
-	   cs_end = cs.end(); i != cs_end; ++i)
-      Prolog_construct_cons(tail, constraint_term(*i), tail);
-
-    if (Prolog_unify(t_clist, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_get_generators(Prolog_term_ref t_ph,
-			      Prolog_term_ref t_glist) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    const Generator_System& gs = ph->generators();
-    for (Generator_System::const_iterator i = gs.begin(),
-	   gs_end = gs.end(); i != gs_end; ++i)
-      Prolog_construct_cons(tail, generator_term(*i), tail);
-
-    if (Prolog_unify(t_glist, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_get_minimized_generators(Prolog_term_ref t_ph,
-					Prolog_term_ref t_glist) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    const Generator_System& gs = ph->minimized_generators();
-    for (Generator_System::const_iterator i = gs.begin(),
-	   gs_end = gs.end(); i != gs_end; ++i)
-      Prolog_construct_cons(tail, generator_term(*i), tail);
-
-    if (Prolog_unify(t_glist, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_relation_with_constraint(Prolog_term_ref t_ph,
-					Prolog_term_ref t_c,
-					Prolog_term_ref t_r) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Poly_Con_Relation r = ph->relation_with(build_constraint(t_c));
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    while (r != Poly_Con_Relation::nothing()) {
-      if (r.implies(Poly_Con_Relation::is_disjoint())) {
-        Prolog_term_ref t_dis = Prolog_new_term_ref();
-	Prolog_put_atom(t_dis, a_is_disjoint);
-        Prolog_construct_cons(tail, t_dis, tail);
-	r = r - Poly_Con_Relation::is_disjoint();
-      }
-      else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
-        Prolog_term_ref t_sin = Prolog_new_term_ref();
-	Prolog_put_atom(t_sin, a_strictly_intersects);
-        Prolog_construct_cons(tail, t_sin, tail);
-	r = r - Poly_Con_Relation::strictly_intersects();
-      }
-      else if (r.implies(Poly_Con_Relation::is_included())) {
-        Prolog_term_ref t_inc = Prolog_new_term_ref();
-	Prolog_put_atom(t_inc, a_is_included);
-        Prolog_construct_cons(tail, t_inc, tail);
-	r = r - Poly_Con_Relation::is_included();
-      }
-      else if (r.implies(Poly_Con_Relation::saturates())) {
-        Prolog_term_ref t_sat = Prolog_new_term_ref();
-	Prolog_put_atom(t_sat, a_saturates);
-        Prolog_construct_cons(tail, t_sat, tail);
-	r = r - Poly_Con_Relation::saturates();
-      }
-    }
-    if (Prolog_unify(t_r, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_relation_with_generator(Prolog_term_ref t_ph,
-				       Prolog_term_ref t_g,
-				       Prolog_term_ref t_r) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Poly_Gen_Relation r = ph->relation_with(build_generator(t_g));
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    while (r != Poly_Gen_Relation::nothing()) {
-      if (r.implies(Poly_Gen_Relation::subsumes())) {
-        Prolog_term_ref t_sub = Prolog_new_term_ref();
-	Prolog_put_atom(t_sub, a_subsumes);
-        Prolog_construct_cons(tail, t_sub, tail);
-	r = r - Poly_Gen_Relation::subsumes();
-      }
-    }
-    if (Prolog_unify(t_r, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-Prolog_term_ref
-extended_rational_term(const ERational& e) {
-  Prolog_term_ref t = Prolog_new_term_ref();
-  if (is_plus_infinity(e))
-    Prolog_put_atom(t, a_pinf);
-  else if (is_minus_infinity(e))
-    Prolog_put_atom(t, a_minf);
-  else {
-    Coefficient numerator = raw_value(e).get_num();
-    Coefficient denominator = raw_value(e).get_den();
-    if (denominator == 1)
-      Prolog_put_term(t, Coefficient_to_integer_term(numerator));
-    else
-      Prolog_construct_compound(t, a_slash,
-				Coefficient_to_integer_term(numerator),
-				Coefficient_to_integer_term(denominator));
-  }
-  return t;
-}
-
-Prolog_term_ref
-interval_term(const Interval& i) {
-  Prolog_term_ref t = Prolog_new_term_ref();
-  if (i.is_empty())
-    Prolog_put_atom(t, a_empty);
-  else {
-    // Lower bound.
-    const LBoundary& l = i.lower_bound();
-    Prolog_term_ref lt = Prolog_new_term_ref();
-    if (l.is_closed())
-      Prolog_construct_compound(lt, a_c, extended_rational_term(l.bound()));
-    else
-      Prolog_construct_compound(lt, a_o, extended_rational_term(l.bound()));
-
-    // Upper bound.
-    const UBoundary& u = i.upper_bound();
-    Prolog_term_ref ut = Prolog_new_term_ref();
-    if (u.is_closed())
-      Prolog_construct_compound(ut, a_c, extended_rational_term(u.bound()));
-    else
-      Prolog_construct_compound(ut, a_o, extended_rational_term(u.bound()));
-
-    Prolog_construct_compound(t, a_i, lt, ut);
-  }
-  return t;
-}
-
-Prolog_atom
-term_to_complexity_class(Prolog_term_ref t) {
-  if (Prolog_is_atom(t)) {
-    Prolog_atom name;
-    if (Prolog_get_atom_name(t, &name)
-	&& (name == a_polynomial || name == a_simplex || name == a_any))
-      return name;
-  }
-  throw not_a_complexity_class(t);
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_get_bounding_box(Prolog_term_ref t_ph,
-				Prolog_term_ref t_cc,
-				Prolog_term_ref t_bb) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-
-    Prolog_atom p_cc = term_to_complexity_class(t_cc);
-    Complexity_Class cc;
-    if (p_cc == a_polynomial)
-      cc = POLYNOMIAL_COMPLEXITY;
-    else if (p_cc == a_simplex)
-      cc = SIMPLEX_COMPLEXITY;
-    else
-      cc = ANY_COMPLEXITY;
-
-    dimension_type dimension = ph->space_dimension();
-    Bounding_Box bbox(dimension);
-    ph->shrink_bounding_box(bbox, cc);
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    for (dimension_type i = dimension; i-- > 0; )
-      Prolog_construct_cons(tail, interval_term(bbox[i]), tail);
-    if (Prolog_unify(t_bb, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_is_empty(Prolog_term_ref t_ph) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->is_empty())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_is_universe(Prolog_term_ref t_ph) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->is_universe())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_is_bounded(Prolog_term_ref t_ph) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->is_bounded())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounds_from_above(Prolog_term_ref t_ph,
-				 Prolog_term_ref t_expr) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Linear_Expression l = build_linear_expression(t_expr);
-    if (ph->bounds_from_above(l))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounds_from_below(Prolog_term_ref t_ph,
-				 Prolog_term_ref t_expr) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Linear_Expression l = build_linear_expression(t_expr);
-    if (ph->bounds_from_below(l))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_maximize(Prolog_term_ref t_ph,
-			Prolog_term_ref t_le_expr,
-                        Prolog_term_ref t_n,
-                        Prolog_term_ref t_d,
-                        Prolog_term_ref t_max) {
- try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    const Linear_Expression le = build_linear_expression(t_le_expr);
-    Coefficient n;
-    Coefficient d;
-    bool max;
-    if (ph->maximize(le, n, d, max)) {
-      Prolog_term_ref t = Prolog_new_term_ref();
-      Prolog_atom a = (max ? a_true : a_false);
-      Prolog_put_atom(t, a);
-      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
-	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
-	  && Prolog_unify(t_max, t))
-	return PROLOG_SUCCESS;
-    }
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_maximize_with_point(Prolog_term_ref t_ph,
-				   Prolog_term_ref t_le_expr,
-				   Prolog_term_ref t_n,
-				   Prolog_term_ref t_d,
-				   Prolog_term_ref t_max,
-				   Prolog_term_ref t_g) {
- try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    const Linear_Expression le = build_linear_expression(t_le_expr);
-    Coefficient n;
-    Coefficient d;
-    bool max;
-    Generator g(point());
-    if (ph->maximize(le, n, d, max, g)) {
-      Prolog_term_ref t = Prolog_new_term_ref();
-      Prolog_atom a = (max ? a_true : a_false);
-      Prolog_put_atom(t, a);
-      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
-	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
-	  && Prolog_unify(t_max, t)
-	  && Prolog_unify(t_g, generator_term(g)))
-	return PROLOG_SUCCESS;
-    }
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_minimize(Prolog_term_ref t_ph,
-			Prolog_term_ref t_le_expr,
-                        Prolog_term_ref t_n,
-                        Prolog_term_ref t_d,
-                        Prolog_term_ref t_min) {
- try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    const Linear_Expression le = build_linear_expression(t_le_expr);
-    Coefficient n;
-    Coefficient d;
-    bool min;
-    if (ph->minimize(le, n, d, min)) {
-      Prolog_term_ref t = Prolog_new_term_ref();
-      Prolog_atom a = (min ? a_true : a_false);
-      Prolog_put_atom(t, a);
-      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
-	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
-	  && Prolog_unify(t_min, t))
-	return PROLOG_SUCCESS;
-    }
- }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_minimize_with_point(Prolog_term_ref t_ph,
-				   Prolog_term_ref t_le_expr,
-				   Prolog_term_ref t_n,
-				   Prolog_term_ref t_d,
-				   Prolog_term_ref t_min,
-				   Prolog_term_ref t_g) {
- try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    const Linear_Expression le = build_linear_expression(t_le_expr);
-    Coefficient n;
-    Coefficient d;
-    bool min;
-    Generator g(point());
-    if (ph->minimize(le, n, d, min, g)) {
-      Prolog_term_ref t = Prolog_new_term_ref();
-      Prolog_atom a = (min ? a_true : a_false);
-      Prolog_put_atom(t, a);
-      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
-	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
-	  && Prolog_unify(t_min, t)
-	  && Prolog_unify(t_g, generator_term(g)))
-	return PROLOG_SUCCESS;
-    }
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_is_topologically_closed(Prolog_term_ref t_ph) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->is_topologically_closed())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_topological_closure_assign(Prolog_term_ref t_ph) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->topological_closure_assign();
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_contains_Polyhedron(Prolog_term_ref t_lhs,
-				   Prolog_term_ref t_rhs) {
-  try {
-    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    if (lhs->contains(*rhs))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_strictly_contains_Polyhedron(Prolog_term_ref t_lhs,
-					    Prolog_term_ref t_rhs) {
-  try {
-    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    if (lhs->strictly_contains(*rhs))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_is_disjoint_from_Polyhedron(Prolog_term_ref t_lhs,
-					   Prolog_term_ref t_rhs) {
-  try {
-    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    if (lhs->is_disjoint_from(*rhs))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_equals_Polyhedron(Prolog_term_ref t_lhs,
-				 Prolog_term_ref t_rhs) {
-  try {
-    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    if (*lhs == *rhs)
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_OK(Prolog_term_ref t_ph) {
-  try {
-    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->OK())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_constraint(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->add_constraint(build_constraint(t_c));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_constraint_and_minimize(Prolog_term_ref t_ph,
-					   Prolog_term_ref t_c) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->add_constraint_and_minimize(build_constraint(t_c)))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_generator(Prolog_term_ref t_ph, Prolog_term_ref t_g) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->add_generator(build_generator(t_g));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_generator_and_minimize(Prolog_term_ref t_ph,
-					  Prolog_term_ref t_g) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    if (ph->add_generator_and_minimize(build_generator(t_g)))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_constraints(Prolog_term_ref t_ph,
-			       Prolog_term_ref t_clist) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    ph->add_constraints(cs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_constraints_and_minimize(Prolog_term_ref t_ph,
-					    Prolog_term_ref t_clist) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    if (ph->add_constraints_and_minimize(cs))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_generators(Prolog_term_ref t_ph,
-			      Prolog_term_ref t_glist) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Generator_System gs;
-    Prolog_term_ref g = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_glist)) {
-      Prolog_get_cons(t_glist, g, t_glist);
-      gs.insert(build_generator(g));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_glist);
-
-    ph->add_generators(gs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_generators_and_minimize(Prolog_term_ref t_ph,
-					   Prolog_term_ref t_glist) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Generator_System gs;
-    Prolog_term_ref g = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_glist)) {
-      Prolog_get_cons(t_glist, g, t_glist);
-      gs.insert(build_generator(g));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_glist);
-
-    if (ph->add_generators_and_minimize(gs))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-Prolog_foreign_return_type
-bop_assign(Prolog_term_ref t_lhs,
-	   Prolog_term_ref t_rhs,
-	   void (Polyhedron::* bop_assign)(const Polyhedron&)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    (lhs->*bop_assign)(*rhs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-Prolog_foreign_return_type
-bop_assign_and_minimize(Prolog_term_ref t_lhs,
-			Prolog_term_ref t_rhs,
-			bool (Polyhedron::*
-			      bop_assign_and_minimize)(const Polyhedron&)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    if ((lhs->*bop_assign_and_minimize)(*rhs))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_intersection_assign(Prolog_term_ref t_lhs,
-				   Prolog_term_ref t_rhs) {
-  return bop_assign(t_lhs, t_rhs,
-		    &Polyhedron::intersection_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_intersection_assign_and_minimize(Prolog_term_ref t_lhs,
-						Prolog_term_ref t_rhs) {
-  return bop_assign_and_minimize(t_lhs, t_rhs,
-		    &Polyhedron::intersection_assign_and_minimize);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_poly_hull_assign(Prolog_term_ref t_lhs,
-				Prolog_term_ref t_rhs) {
-  return bop_assign(t_lhs, t_rhs,
-		    &Polyhedron::poly_hull_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_poly_hull_assign_and_minimize(Prolog_term_ref t_lhs,
-					     Prolog_term_ref t_rhs) {
-  return bop_assign_and_minimize(t_lhs, t_rhs,
-				 &Polyhedron::poly_hull_assign_and_minimize);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_poly_difference_assign(Prolog_term_ref t_lhs,
-				      Prolog_term_ref t_rhs) {
-  return bop_assign(t_lhs, t_rhs,
-		    &Polyhedron::poly_difference_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_time_elapse_assign(Prolog_term_ref t_lhs,
-				  Prolog_term_ref t_rhs) {
-  return bop_assign(t_lhs, t_rhs,
-		    &Polyhedron::time_elapse_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_affine_image(Prolog_term_ref t_ph, Prolog_term_ref t_v,
-			    Prolog_term_ref t_le, Prolog_term_ref t_d) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->affine_image(term_to_Variable(t_v),
-		     build_linear_expression(t_le),
-		     term_to_Coefficient(t_d));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_affine_preimage(Prolog_term_ref t_ph, Prolog_term_ref t_v,
-			       Prolog_term_ref t_le, Prolog_term_ref t_d) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->affine_preimage(term_to_Variable(t_v),
-			build_linear_expression(t_le),
-			term_to_Coefficient(t_d));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-Prolog_atom
-term_to_relation(Prolog_term_ref t) {
-  if (Prolog_is_atom(t)) {
-    Prolog_atom name;
-    if (Prolog_get_atom_name(t, &name)
-	&& (name == a_equal || name == a_greater_than_equal ||
-            name == a_equal_less_than || name == a_greater_than ||
-            name == a_less_than))
-      return name;
-  }
-  throw not_a_relation(t);
-}
-
-Relation_Symbol
-term_to_relation_symbol(Prolog_term_ref t_r) {
-  Prolog_atom ra = term_to_relation(t_r);
-  Relation_Symbol r;
-  if (ra == a_less_than)
-	  r = LESS_THAN;
-  else if (ra == a_equal_less_than)
-	  r = LESS_THAN_OR_EQUAL;
-  else if (ra == a_equal)
-	  r = EQUAL;
-  else if (ra == a_greater_than_equal)
-	  r = GREATER_THAN_OR_EQUAL;
-  else r = GREATER_THAN;
-
-  return r;
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_generalized_affine_image(Prolog_term_ref t_ph,
-					Prolog_term_ref t_v,
-					Prolog_term_ref t_r,
-					Prolog_term_ref t_le,
-					Prolog_term_ref t_d) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Relation_Symbol r = term_to_relation_symbol(t_r);
-    ph->generalized_affine_image(term_to_Variable(t_v),
-				 r,
-				 build_linear_expression(t_le),
-				 term_to_Coefficient(t_d));
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_generalized_affine_preimage(Prolog_term_ref t_ph,
-					   Prolog_term_ref t_v,
-					   Prolog_term_ref t_r,
-					   Prolog_term_ref t_le,
-					   Prolog_term_ref t_d) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Relation_Symbol r = term_to_relation_symbol(t_r);
-    ph->generalized_affine_preimage(term_to_Variable(t_v),
-				    r,
-				    build_linear_expression(t_le),
-				    term_to_Coefficient(t_d));
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_generalized_affine_image_lhs_rhs(Prolog_term_ref t_ph,
-						Prolog_term_ref t_lhs,
-						Prolog_term_ref t_r,
-						Prolog_term_ref t_rhs) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Relation_Symbol r = term_to_relation_symbol(t_r);
-    ph->generalized_affine_image(build_linear_expression(t_lhs),
-				 r,
-				 build_linear_expression(t_rhs));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(Prolog_term_ref t_ph,
-						   Prolog_term_ref t_lhs,
-						   Prolog_term_ref t_r,
-						   Prolog_term_ref t_rhs) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Relation_Symbol r = term_to_relation_symbol(t_r);
-    ph->generalized_affine_preimage(build_linear_expression(t_lhs),
-				    r,
-				    build_linear_expression(t_rhs));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounded_affine_image(Prolog_term_ref t_ph,
-				    Prolog_term_ref t_v,
-				    Prolog_term_ref t_lb_le,
-				    Prolog_term_ref t_ub_le,
-				    Prolog_term_ref t_d) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->bounded_affine_image(term_to_Variable(t_v),
-			     build_linear_expression(t_lb_le),
-			     build_linear_expression(t_ub_le),
-			     term_to_Coefficient(t_d));
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounded_affine_preimage(Prolog_term_ref t_ph,
-				       Prolog_term_ref t_v,
-				       Prolog_term_ref t_lb_le,
-				       Prolog_term_ref t_ub_le,
-				       Prolog_term_ref t_d) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->bounded_affine_preimage(term_to_Variable(t_v),
-				build_linear_expression(t_lb_le),
-				build_linear_expression(t_ub_le),
-				term_to_Coefficient(t_d));
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-Prolog_foreign_return_type
-widening_assign(Prolog_term_ref t_lhs,
-		Prolog_term_ref t_rhs,
-		void (Polyhedron::* widening_assign)(const Polyhedron&,
-						     unsigned* tp)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    (lhs->*widening_assign)(*rhs, 0);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-Prolog_foreign_return_type
-widening_assign_with_tokens(Prolog_term_ref t_lhs,
-			    Prolog_term_ref t_rhs,
-			    Prolog_term_ref t_ti,
-			    Prolog_term_ref t_to,
-			    void (Polyhedron::*
-				  widening_assign)(const Polyhedron&,
-						   unsigned* tp)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    unsigned t = term_to_unsigned<unsigned>(t_ti);
-    (lhs->*widening_assign)(*rhs, &t);
-      if (unify_long(t_to, t))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-Prolog_foreign_return_type
-widening_assign_with_token(Prolog_term_ref t_lhs,
-			   Prolog_term_ref t_rhs,
-			   Prolog_term_ref t_t,
-			   void (Polyhedron::*
-				 widening_assign)(const Polyhedron&,
-						  unsigned* tp)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    unsigned t = 1;
-    (lhs->*widening_assign)(*rhs, &t);
-    if (unify_long(t_t, 1-t))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-Prolog_foreign_return_type
-limited_extrapolation_assign(Prolog_term_ref t_lhs,
-			 Prolog_term_ref t_rhs,
-			 Prolog_term_ref t_clist,
-			 void (Polyhedron::*
-			       limited_extrap_assign)(const Polyhedron&,
-						      const Constraint_System&,
-						      unsigned* tp)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    (lhs->*limited_extrap_assign)(*rhs, cs, 0);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-Prolog_foreign_return_type
-limited_extrapolation_assign_with_tokens(Prolog_term_ref t_lhs,
-			 Prolog_term_ref t_rhs,
-			 Prolog_term_ref t_clist,
-	  		 Prolog_term_ref t_ti,
-	  		 Prolog_term_ref t_to,
-			 void (Polyhedron::*
-			       limited_extrap_assign)(const Polyhedron&,
-						      const Constraint_System&,
-						      unsigned* tp)) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    unsigned t = term_to_unsigned<unsigned>(t_ti);
-   (lhs->*limited_extrap_assign)(*rhs, cs, &t);
-      if (unify_long(t_to, t))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(Prolog_term_ref t_lhs,
-						  Prolog_term_ref t_rhs,
-						  Prolog_term_ref t_ti,
-						  Prolog_term_ref t_to) {
-  return widening_assign_with_tokens(t_lhs, t_rhs, t_ti, t_to,
-				    &Polyhedron::BHRZ03_widening_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_BHRZ03_widening_assign_with_token(Prolog_term_ref t_lhs,
-						 Prolog_term_ref t_rhs,
-						 Prolog_term_ref t_t) {
-  return widening_assign_with_token(t_lhs, t_rhs, t_t,
-				    &Polyhedron::BHRZ03_widening_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_BHRZ03_widening_assign(Prolog_term_ref t_lhs,
-				      Prolog_term_ref t_rhs) {
-  return widening_assign(t_lhs, t_rhs, &Polyhedron::BHRZ03_widening_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
-                                    Prolog_term_ref t_lhs,
-				    Prolog_term_ref t_rhs,
-				    Prolog_term_ref t_clist,
-				    Prolog_term_ref t_ti,
-				    Prolog_term_ref t_to) {
-  return limited_extrapolation_assign_with_tokens(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      t_ti,
-				      t_to,
-				      &Polyhedron::
-				      limited_BHRZ03_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(Prolog_term_ref t_lhs,
-						   Prolog_term_ref t_rhs,
-						   Prolog_term_ref t_clist) {
-  return limited_extrapolation_assign(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      &Polyhedron::
-				      limited_BHRZ03_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
-                                                   Prolog_term_ref t_lhs,
-						   Prolog_term_ref t_rhs,
-						   Prolog_term_ref t_clist,
-				                   Prolog_term_ref t_ti,
-				                   Prolog_term_ref t_to) {
-  return limited_extrapolation_assign_with_tokens(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      t_ti,
-				      t_to,
-				      &Polyhedron::
-				      bounded_BHRZ03_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(Prolog_term_ref t_lhs,
-						   Prolog_term_ref t_rhs,
-						   Prolog_term_ref t_clist) {
-  return limited_extrapolation_assign(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      &Polyhedron::
-				      bounded_BHRZ03_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_H79_widening_assign_with_tokens(Prolog_term_ref t_lhs,
-					       Prolog_term_ref t_rhs,
-					       Prolog_term_ref t_ti,
-					       Prolog_term_ref t_to) {
-  return widening_assign_with_tokens(t_lhs, t_rhs, t_ti, t_to,
-				    &Polyhedron::H79_widening_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_H79_widening_assign(Prolog_term_ref t_lhs,
-				   Prolog_term_ref t_rhs) {
-  return widening_assign(t_lhs, t_rhs, &Polyhedron::H79_widening_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
-                                                Prolog_term_ref t_lhs,
-						Prolog_term_ref t_rhs,
-						Prolog_term_ref t_clist,
-				                Prolog_term_ref t_ti,
-				                Prolog_term_ref t_to) {
-  return limited_extrapolation_assign_with_tokens(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      t_ti,
-				      t_to,
-				      &Polyhedron::
-				      limited_H79_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_limited_H79_extrapolation_assign(Prolog_term_ref t_lhs,
-						Prolog_term_ref t_rhs,
-						Prolog_term_ref t_clist) {
-  return limited_extrapolation_assign(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      &Polyhedron::
-				      limited_H79_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
-                                                   Prolog_term_ref t_lhs,
-						   Prolog_term_ref t_rhs,
-						   Prolog_term_ref t_clist,
-				                   Prolog_term_ref t_ti,
-				                   Prolog_term_ref t_to) {
-  return limited_extrapolation_assign_with_tokens(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      t_ti,
-				      t_to,
-				      &Polyhedron::
-				      bounded_H79_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_bounded_H79_extrapolation_assign(Prolog_term_ref t_lhs,
-						   Prolog_term_ref t_rhs,
-						   Prolog_term_ref t_clist) {
-  return limited_extrapolation_assign(t_lhs,
-				      t_rhs,
-				      t_clist,
-				      &Polyhedron::
-				      bounded_H79_extrapolation_assign);
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_space_dimensions_and_project(Prolog_term_ref t_ph,
-						Prolog_term_ref t_nnd) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    dimension_type d = term_to_unsigned<dimension_type>(t_nnd);
-      ph->add_space_dimensions_and_project(d);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_add_space_dimensions_and_embed(Prolog_term_ref t_ph,
-					      Prolog_term_ref t_nnd) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    dimension_type d = term_to_unsigned<dimension_type>(t_nnd);
-    ph->add_space_dimensions_and_embed(d);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_concatenate_assign(Prolog_term_ref t_lhs,
-				  Prolog_term_ref t_rhs) {
-  try {
-    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
-    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    lhs->concatenate_assign(*rhs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_remove_space_dimensions(Prolog_term_ref t_ph,
-				       Prolog_term_ref t_vlist) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Variables_Set dead_variables;
-    Prolog_term_ref v = Prolog_new_term_ref();
-    while (Prolog_is_cons(t_vlist)) {
-      Prolog_get_cons(t_vlist, v, t_vlist);
-      dead_variables.insert(term_to_Variable(v));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_vlist);
-
-    ph->remove_space_dimensions(dead_variables);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_remove_higher_space_dimensions(Prolog_term_ref t_ph,
-					      Prolog_term_ref t_nd) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->remove_higher_space_dimensions(term_to_unsigned<dimension_type>(t_nd));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_expand_space_dimension(Prolog_term_ref t_ph,
-				      Prolog_term_ref t_v,
-				      Prolog_term_ref t_nd) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    ph->expand_space_dimension(term_to_Variable(t_v),
-			       term_to_unsigned<dimension_type>(t_nd));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_fold_space_dimensions(Prolog_term_ref t_ph,
-				     Prolog_term_ref t_vlist,
-				     Prolog_term_ref t_v) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    CHECK(ph);
-    Variables_Set fold_variables;
-    Prolog_term_ref v = Prolog_new_term_ref();
-    while (Prolog_is_cons(t_vlist)) {
-      Prolog_get_cons(t_vlist, v, t_vlist);
-      fold_variables.insert(term_to_Variable(v));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_vlist);
-
-    ph->fold_space_dimensions(fold_variables, term_to_Variable(t_v));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-namespace {
-
-class PFunc {
-private:
-  std::set<dimension_type> codomain;
-  std::vector<dimension_type> vec;
-
-public:
-  PFunc() {
-  }
-
-  bool has_empty_codomain() const {
-    return codomain.empty();
-  }
-
-  dimension_type max_in_codomain() const {
-    if (codomain.empty())
-      throw unknown_interface_error("PFunc::max_in_codomain()");
-    return *codomain.rbegin();
-  }
-
-  bool maps(dimension_type i, dimension_type& j) const {
-    if (i >= vec.size())
-      return false;
-    dimension_type vec_i = vec[i];
-    if (vec_i == not_a_dimension())
-      return false;
-    j = vec_i;
-    return true;
-  }
-
-  bool insert(dimension_type i, dimension_type j) {
-    std::pair<std::set<dimension_type>::iterator, bool> s
-      = codomain.insert(j);
-    if (!s.second)
-      // *this is not injective!
-      return false;
-    if (i > vec.size())
-      vec.insert(vec.end(), i - vec.size(), not_a_dimension());
-    if (i == vec.size()) {
-      vec.insert(vec.end(), j);
-      return true;
-    }
-    dimension_type& vec_i = vec[i];
-    if (vec_i != not_a_dimension())
-      // Already mapped: *this is not a function!
-      return false;
-    vec_i = j;
-    return true;
-  }
-};
-
-} // namespace
-
-extern "C" Prolog_foreign_return_type
-ppl_Polyhedron_map_space_dimensions(Prolog_term_ref t_ph,
-				    Prolog_term_ref t_pfunc) {
-  try {
-    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
-    dimension_type space_dim = ph->space_dimension();
-    CHECK(ph);
-    PFunc pfunc;
-    Prolog_term_ref t_pair = Prolog_new_term_ref();
-    while (Prolog_is_cons(t_pfunc)) {
-      Prolog_get_cons(t_pfunc, t_pair, t_pfunc);
-      Prolog_atom functor;
-      int arity;
-      Prolog_get_compound_name_arity(t_pair, &functor, &arity);
-      if (arity != 2 || functor != a_minus)
-	return PROLOG_FAILURE;
-      Prolog_term_ref t_i = Prolog_new_term_ref();
-      Prolog_term_ref t_j = Prolog_new_term_ref();
-      Prolog_get_arg(1, t_pair, t_i);
-      Prolog_get_arg(2, t_pair, t_j);
-      dimension_type i = term_to_Variable(t_i).id();
-      dimension_type j = term_to_Variable(t_j).id();
-      if (i >= space_dim || !pfunc.insert(i, j))
-	return PROLOG_FAILURE;
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_pfunc);
-
-    ph->map_space_dimensions(pfunc);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-
-}
-
-
-extern "C" Prolog_foreign_return_type
-ppl_new_LP_Problem_trivial(Prolog_term_ref t_lp) {
-  try {
-    LP_Problem* lp = new LP_Problem;
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, lp);
-    if (Prolog_unify(t_lp, tmp)) {
-      REGISTER(lp);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete lp;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_LP_Problem(Prolog_term_ref t_clist,
-		   Prolog_term_ref t_le_expr,
-		   Prolog_term_ref t_opt,
-		   Prolog_term_ref t_lp) {
-  try {
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    const Linear_Expression le = build_linear_expression(t_le_expr);
-    Prolog_atom opt = term_to_optimization_mode(t_opt);
-    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
-
-    LP_Problem* lp = new LP_Problem(cs, le, mode);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, lp);
-    if (Prolog_unify(t_lp, tmp)) {
-      REGISTER(lp);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete lp;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_new_LP_Problem_from_LP_Problem(Prolog_term_ref t_lp_source,
-				   Prolog_term_ref t_lp) {
-  try {
-    const LP_Problem* lp_source
-      = static_cast<const LP_Problem*>
-        (term_to_lp_problem_handle(t_lp_source));
-    CHECK(lp_source);
-    LP_Problem* lp = new LP_Problem(*lp_source);
-    Prolog_term_ref tmp = Prolog_new_term_ref();
-    Prolog_put_address(tmp, lp);
-    if (Prolog_unify(t_lp, tmp)) {
-      REGISTER(lp);
-      return PROLOG_SUCCESS;
-    }
-    else
-      delete lp;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
-  try {
-    LP_Problem* lhs = term_to_lp_problem_handle(t_lhs);
-    LP_Problem* rhs = term_to_lp_problem_handle(t_rhs);
-    CHECK(lhs);
-    CHECK(rhs);
-    lhs->swap(*rhs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_delete_LP_Problem(Prolog_term_ref t_lp) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    UNREGISTER(lp);
-    delete lp;
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_space_dimension(Prolog_term_ref t_lp, Prolog_term_ref t_sd) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    if (unify_ulong(t_sd, lp->space_dimension()))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_constraints(Prolog_term_ref t_lp,
-			   Prolog_term_ref t_clist) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-
-    Prolog_term_ref tail = Prolog_new_term_ref();
-    Prolog_put_atom(tail, a_nil);
-    const Constraint_System& cs = lp->constraints();
-    for (Constraint_System::const_iterator i = cs.begin(),
-	   cs_end = cs.end(); i != cs_end; ++i)
-      Prolog_construct_cons(tail, constraint_term(*i), tail);
-
-    if (Prolog_unify(t_clist, tail))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_objective_function(Prolog_term_ref t_lp,
-				  Prolog_term_ref t_le_expr) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-
-    const Linear_Expression& le = lp->objective_function();
-    Prolog_term_ref t = get_linear_expression(le);
-
-    if (Prolog_unify(t_le_expr, t))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_optimization_mode(Prolog_term_ref t_lp,
-				 Prolog_term_ref t_opt) {
-  try {
-    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-
-    Optimization_Mode mode = lp->optimization_mode();
-    Prolog_term_ref t = Prolog_new_term_ref();
-    Prolog_atom a = (mode == MAXIMIZATION) ? a_max : a_min;
-    Prolog_put_atom(t, a);
-    if (Prolog_unify(t_opt, t))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_clear(Prolog_term_ref t_lp) {
-  try {
-    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    lp->clear();
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_add_constraint(Prolog_term_ref t_lp, Prolog_term_ref t_c) {
-  try {
-    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    lp->add_constraint(build_constraint(t_c));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_add_constraints(Prolog_term_ref t_lp,
-			       Prolog_term_ref t_clist) {
-  try {
-    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    Constraint_System cs;
-    Prolog_term_ref c = Prolog_new_term_ref();
-
-    while (Prolog_is_cons(t_clist)) {
-      Prolog_get_cons(t_clist, c, t_clist);
-      cs.insert(build_constraint(c));
-    }
-
-    // Check the list is properly terminated.
-    check_nil_terminating(t_clist);
-
-    lp->add_constraints(cs);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_set_objective_function(Prolog_term_ref t_lp,
-				      Prolog_term_ref t_le_expr) {
-  try {
-    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    lp->set_objective_function(build_linear_expression(t_le_expr));
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_set_optimization_mode(Prolog_term_ref t_lp,
-				     Prolog_term_ref t_opt) {
-  try {
-    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-
-    Prolog_atom opt = term_to_optimization_mode(t_opt);
-    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
-    lp->set_optimization_mode(mode);
-    return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_is_satisfiable(Prolog_term_ref t_lp) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    if (lp->is_satisfiable())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_solve(Prolog_term_ref t_lp, Prolog_term_ref t_status) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-
-    Prolog_atom a;
-    switch (lp->solve()) {
-    case UNFEASIBLE_LP_PROBLEM:
-      a = a_unfeasible;
-      break;
-    case UNBOUNDED_LP_PROBLEM:
-      a = a_unbounded;
-      break;
-    case OPTIMIZED_LP_PROBLEM:
-      a = a_optimized;
-      break;
-    default:
-      throw unknown_interface_error("ppl_LP_Problem_solve()");
-    }
-    Prolog_term_ref t = Prolog_new_term_ref();
-    Prolog_put_atom(t, a);
-    if (Prolog_unify(t_status, t))
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_feasible_point(Prolog_term_ref t_lp,
-			      Prolog_term_ref t_g) {
- try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    const Generator& g = lp->feasible_point();
-    if (Prolog_unify(t_g, generator_term(g)))
-      return PROLOG_SUCCESS;
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_optimizing_point(Prolog_term_ref t_lp,
-				Prolog_term_ref t_g) {
- try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    const Generator& g = lp->optimizing_point();
-    if (Prolog_unify(t_g, generator_term(g)))
-      return PROLOG_SUCCESS;
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_optimal_value(Prolog_term_ref t_lp,
-			     Prolog_term_ref t_n,
-			     Prolog_term_ref t_d) {
- try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    Coefficient n;
-    Coefficient d;
-    lp->optimal_value(n, d);
-    if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
-	&& Prolog_unify(t_d, Coefficient_to_integer_term(d)))
-      return PROLOG_SUCCESS;
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_evaluate_objective_function(Prolog_term_ref t_lp,
-					   Prolog_term_ref t_g,
-					   Prolog_term_ref t_n,
-					   Prolog_term_ref t_d) {
- try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    Coefficient n;
-    Coefficient d;
-    lp->evaluate_objective_function(build_generator(t_g), n, d);
-    if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
-	&& Prolog_unify(t_d, Coefficient_to_integer_term(d)))
-      return PROLOG_SUCCESS;
- }
- CATCH_ALL;
-}
-
-extern "C" Prolog_foreign_return_type
-ppl_LP_Problem_OK(Prolog_term_ref t_lp) {
-  try {
-    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
-    CHECK(lp);
-    if (lp->OK())
-      return PROLOG_SUCCESS;
-  }
-  CATCH_ALL;
-}
diff --git a/interfaces/Prolog/ppl_prolog_common.cc b/interfaces/Prolog/ppl_prolog_common.cc
new file mode 100644
index 0000000..6e8730d
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common.cc
@@ -0,0 +1,2005 @@
+/* Common part of the Prolog interfaces: variables and non-inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_prolog_common.defs.hh"
+#include <exception>
+#include <stdexcept>
+#include <sstream>
+#include <climits>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+Prolog_atom out_of_memory_exception_atom;
+
+// For Prolog lists.
+Prolog_atom a_nil;
+
+// For variables.
+Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+Prolog_atom a_plus;
+Prolog_atom a_minus;
+Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+Prolog_atom a_slash;
+
+// For constraints.
+Prolog_atom a_less_than;
+Prolog_atom a_equal_less_than;
+Prolog_atom a_equal;
+Prolog_atom a_greater_than_equal;
+Prolog_atom a_greater_than;
+
+// For congruences.
+Prolog_atom a_is_congruent_to;
+Prolog_atom a_modulo;
+
+// For generators.
+Prolog_atom a_line;
+Prolog_atom a_ray;
+Prolog_atom a_point;
+Prolog_atom a_closure_point;
+
+// For grid_generators.
+Prolog_atom a_grid_line;
+Prolog_atom a_parameter;
+Prolog_atom a_grid_point;
+
+// For the relation between a polyhedron and a constraint.
+Prolog_atom a_is_disjoint;
+Prolog_atom a_strictly_intersects;
+Prolog_atom a_is_included;
+Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+Prolog_atom a_empty;
+
+// Denotes the universe polyhedron.
+Prolog_atom a_universe;
+
+// Denotes the maximization mode for optimization problems.
+Prolog_atom a_max;
+
+// Denotes the minimization mode for optimization problems.
+Prolog_atom a_min;
+
+// Denote possible outcomes of MIP problems solution attempts.
+Prolog_atom a_unfeasible;
+Prolog_atom a_unbounded;
+Prolog_atom a_optimized;
+
+// Denotes an open interval boundary.
+Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+Prolog_atom a_minf;
+Prolog_atom a_pinf;
+
+// Denote complexity classes.
+Prolog_atom a_polynomial;
+Prolog_atom a_simplex;
+Prolog_atom a_any;
+
+// Default timeout exception atom.
+Prolog_atom a_time_out;
+
+// "Out of memory" exception atom.
+Prolog_atom a_out_of_memory;
+
+// Boolean constants.
+Prolog_atom a_true;
+Prolog_atom a_false;
+
+// To build exception terms.
+Prolog_atom a_ppl_invalid_argument;
+Prolog_atom a_ppl_overflow_error;
+Prolog_atom a_ppl_domain_error;
+Prolog_atom a_ppl_length_error;
+Prolog_atom a_ppl_representation_error;
+Prolog_atom a_expected;
+Prolog_atom a_found;
+Prolog_atom a_where;
+
+const Prolog_Interface_Atom prolog_interface_atoms[] = {
+  { &a_nil,                      "[]" },
+
+  { &a_dollar_VAR,               "$VAR" },
+
+  { &a_plus,                     "+" },
+  { &a_minus,                    "-" },
+  { &a_asterisk,                 "*" },
+
+  { &a_slash,                    "/" },
+
+  { &a_equal,                    "=" },
+  { &a_greater_than_equal,       ">=" },
+  { &a_equal_less_than,          "=<" },
+  { &a_greater_than,             ">" },
+  { &a_less_than,                "<" },
+
+  { &a_is_congruent_to,          "=:=" },
+  { &a_modulo,                   "/" },
+
+  { &a_line,                     "line" },
+  { &a_ray,                      "ray" },
+  { &a_point,                    "point" },
+  { &a_closure_point,            "closure_point" },
+
+  { &a_grid_line,                "grid_line" },
+  { &a_parameter,                "parameter" },
+  { &a_grid_point,               "grid_point" },
+
+  { &a_is_disjoint,              "is_disjoint" },
+  { &a_strictly_intersects,      "strictly_intersects" },
+  { &a_is_included,              "is_included" },
+  { &a_saturates,                "saturates" },
+
+  { &a_subsumes,                 "subsumes" },
+
+  { &a_c,                        "c" },
+
+  { &a_empty,                    "empty" },
+  { &a_universe,                 "universe" },
+
+  { &a_max,                      "max" },
+  { &a_min,                      "min" },
+
+  { &a_unfeasible,               "unfeasible" },
+  { &a_unbounded,                "unbounded" },
+  { &a_optimized,                "optimized" },
+
+  { &a_o,                        "o" },
+  { &a_i,                        "i" },
+
+  { &a_minf,                     "minf" },
+  { &a_pinf,                     "pinf" },
+
+  { &a_polynomial,               "polynomial" },
+  { &a_simplex,                  "simplex" },
+  { &a_any,                      "any" },
+
+  { &a_time_out,                 "time_out" },
+  { &a_out_of_memory,            "out_of_memory" },
+
+  { &a_true,                     "true" },
+  { &a_false,                    "false" },
+
+  { &a_ppl_invalid_argument,     "ppl_invalid_argument" },
+  { &a_ppl_overflow_error,       "ppl_overflow_error" },
+  { &a_ppl_domain_error,         "ppl_domain_error" },
+  { &a_ppl_length_error,         "ppl_length_error" },
+  { &a_ppl_representation_error, "ppl_representation_error" },
+  { &a_expected,                 "expected" },
+  { &a_found,                    "found" },
+  { &a_where,                    "where" },
+  { 0,                           0 }
+};
+
+Prolog_term_ref
+Prolog_atom_term_from_string(const char* s) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_put_atom(t, Prolog_atom_from_string(s));
+  return t;
+}
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref max = Prolog_new_term_ref();
+  Prolog_put_ulong(max, e.max());
+  Prolog_construct_compound(max,
+			    Prolog_atom_from_string("unsigned_integer"
+						    "_less_or_equal"),
+			    max);
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected, max);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_unsigned_integer& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("unsigned_integer"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const non_linear& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string
+			    ("linear_expression_or_constraint"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_variable& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found,
+			    e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string
+			    ("$VAR(unsigned_integer)"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_integer& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("integer"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const ppl_handle_mismatch& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("handle"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_optimization_mode& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("max"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("min"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_complexity_class& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("polynomial"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("simplex"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("any"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_universe_or_empty& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("universe"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("empty"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_relation& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("="), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string(">="), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("=<"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string(">"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("<"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_nil_terminated_list& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string
+                        ("Prolog_list"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const PPL_integer_out_of_range& e) {
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string("Coefficient_to_integer_term"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  std::ostringstream s;
+  s << e.value();
+  Prolog_construct_compound(exception_term, a_ppl_representation_error,
+			    Prolog_atom_term_from_string(s.str().c_str()),
+			    where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const unknown_interface_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, e.where());
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::overflow_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_overflow_error,
+			    Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::length_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_length_error,
+			    Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::bad_alloc&) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, out_of_memory_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::exception& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, e.what());
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception() {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, "PPL bug: unknown exception raised");
+  Prolog_raise_exception(et);
+}
+
+#ifdef PPL_WATCHDOG_LIBRARY_ENABLED
+
+Parma_Watchdog_Library::Watchdog* p_timeout_object = 0;
+
+void
+reset_timeout() {
+  if (p_timeout_object) {
+    delete p_timeout_object;
+    p_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+#endif
+
+Prolog_atom timeout_exception_atom;
+
+void
+handle_exception(const timeout_exception&) {
+#ifdef PPL_WATCHDOG_LIBRARY_ENABLED
+  assert(p_timeout_object);
+  reset_timeout();
+#endif
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, timeout_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+#define CATCH_ALL \
+  catch (const Prolog_unsigned_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_unsigned_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const non_linear& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_variable& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const ppl_handle_mismatch& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_optimization_mode& e) {	\
+    handle_exception(e); \
+  } \
+  catch (const not_a_complexity_class& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_universe_or_empty& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_relation& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_nil_terminated_list& e) { \
+    handle_exception(e); \
+  } \
+  catch (const PPL_integer_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const unknown_interface_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const timeout_exception& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::overflow_error& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::length_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::bad_alloc& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::exception& e) { \
+    handle_exception(e); \
+  } \
+  catch (...) { \
+    handle_exception(); \
+  } \
+  return PROLOG_FAILURE
+
+Prolog_term_ref
+variable_term(dimension_type varid) {
+  Prolog_term_ref v = Prolog_new_term_ref();
+  Prolog_put_ulong(v, varid);
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound(t, a_dollar_VAR, v);
+  return t;
+}
+
+#if 0
+unsigned int
+get_unsigned_int(long n) {
+  if (n >= 0 && static_cast<unsigned long>(n) <= UINT_MAX)
+    return n;
+  else {
+    Prolog_term_ref n_term = Prolog_new_term_ref();
+    Prolog_put_long(n_term, n);
+    throw not_unsigned_integer(n_term, "get_unsigned_int");
+  }
+}
+#endif
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_universe || name == a_empty))
+      return name;
+  }
+  throw not_universe_or_empty(t, where);
+}
+
+Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  TEMP_INTEGER(n);
+  assert(Prolog_is_integer(t));
+  if (!Prolog_get_Coefficient(t, n))
+    abort();
+  return n;
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const Coefficient& n) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  if (!Prolog_put_Coefficient(t, n))
+    abort();
+  return t;
+}
+
+bool
+unify_long(Prolog_term_ref t, long l) {
+  Prolog_term_ref t_l = Prolog_new_term_ref();
+  return Prolog_put_long(t_l, l) && Prolog_unify(t, t_l);
+}
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l) {
+  Prolog_term_ref t_l = Prolog_new_term_ref();
+  return Prolog_put_ulong(t_l, l) && Prolog_unify(t, t_l);
+}
+
+Linear_Expression
+build_linear_expression(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_integer(t))
+    return Linear_Expression(integer_term_to_Coefficient(t));
+  else if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    switch (arity) {
+    case 1:
+      {
+	Prolog_term_ref arg = Prolog_new_term_ref();
+	Prolog_get_arg(1, t, arg);
+	if (functor == a_minus)
+	  // Unary minus.
+	  return -build_linear_expression(arg, where);
+	else if (functor == a_dollar_VAR)
+	  // Variable.
+	  return Variable(term_to_unsigned<dimension_type>(arg, where));
+      }
+      break;
+    case 2:
+      {
+	Prolog_term_ref arg1 = Prolog_new_term_ref();
+	Prolog_term_ref arg2 = Prolog_new_term_ref();
+	Prolog_get_arg(1, t, arg1);
+	Prolog_get_arg(2, t, arg2);
+	if (functor == a_plus)
+	  // Plus.
+	  if (Prolog_is_integer(arg1))
+	    return integer_term_to_Coefficient(arg1)
+	      + build_linear_expression(arg2, where);
+	  else if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1, where)
+	      + integer_term_to_Coefficient(arg2);
+	  else
+	    return build_linear_expression(arg1, where)
+	      + build_linear_expression(arg2, where);
+	else if (functor == a_minus)
+	  // Minus.
+	  if (Prolog_is_integer(arg1))
+	    return integer_term_to_Coefficient(arg1)
+	      - build_linear_expression(arg2, where);
+	  else if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1, where)
+	      - integer_term_to_Coefficient(arg2);
+	  else
+	    return build_linear_expression(arg1, where)
+	      - build_linear_expression(arg2, where);
+	else if (functor == a_asterisk) {
+	  // Times.
+	  if (Prolog_is_integer(arg1))
+	    return integer_term_to_Coefficient(arg1)
+	      * build_linear_expression(arg2, where);
+	  else if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1, where)
+	      * integer_term_to_Coefficient(arg2);
+	}
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Constraint
+build_constraint(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (functor == a_equal)
+	// =
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    == build_linear_expression(arg2, where);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1, where)
+	    == integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1, where)
+	    == build_linear_expression(arg2, where);
+      else if (functor == a_equal_less_than)
+	// =<
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    <= build_linear_expression(arg2, where);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1, where)
+	    <= integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1, where)
+	    <= build_linear_expression(arg2, where);
+      else if (functor == a_greater_than_equal)
+	// >=
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    >= build_linear_expression(arg2, where);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1, where)
+	    >= integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1, where)
+	    >= build_linear_expression(arg2, where);
+      else if (functor == a_less_than)
+	// <
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    < build_linear_expression(arg2, where);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1, where)
+	    < integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1, where)
+	    < build_linear_expression(arg2, where);
+      else if (functor == a_greater_than) {
+	// >
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    > build_linear_expression(arg2, where);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1, where)
+	    > integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1, where)
+	    > build_linear_expression(arg2, where);
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Congruence
+build_congruence(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (functor == a_modulo) {
+        // /
+	if (Prolog_is_integer(arg2)) {
+          Prolog_atom functor1;
+          int arity1;
+          Prolog_get_compound_name_arity(arg1, &functor1, &arity1);
+          if (arity1 == 2) {
+            if (functor1 == a_is_congruent_to) {
+      	      // =:=
+              Prolog_term_ref arg11 = Prolog_new_term_ref();
+              Prolog_term_ref arg12 = Prolog_new_term_ref();
+              Prolog_get_arg(1, arg1, arg11);
+              Prolog_get_arg(2, arg1, arg12);
+              if (Prolog_is_integer(arg12))
+	        return (build_linear_expression(arg11, where)
+			%= integer_term_to_Coefficient(arg12))
+		  / integer_term_to_Coefficient(arg2);
+	      else
+	        return (build_linear_expression(arg11, where)
+			%= build_linear_expression(arg12, where))
+		  / integer_term_to_Coefficient(arg2);
+	    }
+	  }
+	}
+      }
+      else
+        if (functor == a_is_congruent_to)
+      	  // =:=
+          if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1, where)
+	      %= integer_term_to_Coefficient(arg2);
+	  else
+	    return build_linear_expression(arg1, where)
+	      %= build_linear_expression(arg2, where);
+	else
+          if (functor == a_equal) {
+	    // =
+	    if (Prolog_is_integer(arg1))
+	      return (build_linear_expression(arg2, where)
+		      %= integer_term_to_Coefficient(arg1)) / 0;
+	    else if (Prolog_is_integer(arg2))
+	      return (build_linear_expression(arg1, where)
+		      %= integer_term_to_Coefficient(arg2)) / 0;
+	    else
+	      return (build_linear_expression(arg1, where)
+		      %= build_linear_expression(arg2, where)) / 0;
+	  }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Generator
+build_generator(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      if (functor == a_line)
+	return Generator::line(build_linear_expression(arg, where));
+      else if (functor == a_ray)
+	return Generator::ray(build_linear_expression(arg, where));
+      else if (functor == a_point)
+	return Generator::point(build_linear_expression(arg, where));
+      else if (functor == a_closure_point)
+	return Generator::closure_point(build_linear_expression(arg, where));
+    }
+    else if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (Prolog_is_integer(arg2)) {
+        if (functor == a_point)
+	  return Generator::point(build_linear_expression(arg1, where),
+				  integer_term_to_Coefficient(arg2));
+        else if (functor == a_closure_point)
+	  return Generator::closure_point(build_linear_expression(arg1, where),
+					  integer_term_to_Coefficient(arg2));
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Grid_Generator
+build_grid_generator(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      if (functor == a_grid_line)
+	return Grid_Generator::grid_line(build_linear_expression(arg, where));
+      else if (functor == a_parameter)
+	return Grid_Generator::parameter(build_linear_expression(arg, where));
+      else if (functor == a_grid_point)
+	return Grid_Generator::grid_point(build_linear_expression(arg, where));
+    }
+    else if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (Prolog_is_integer(arg2)) {
+        if (functor == a_grid_point)
+	  return Grid_Generator::grid_point(build_linear_expression(arg1,
+								    where),
+					    integer_term_to_Coefficient(arg2));
+        else if (functor == a_parameter)
+	  return Grid_Generator::parameter(build_linear_expression(arg1,
+								   where),
+					  integer_term_to_Coefficient(arg2));
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+template <typename R>
+Prolog_term_ref
+get_homogeneous_expression(const R& r) {
+  Prolog_term_ref so_far = Prolog_new_term_ref();
+  TEMP_INTEGER(coefficient);
+  dimension_type varid = 0;
+  dimension_type space_dimension = r.space_dimension();
+  while (varid < space_dimension
+	 && (coefficient = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    Prolog_put_long(so_far, 0);
+  }
+  else {
+    Prolog_construct_compound(so_far, a_asterisk,
+			      Coefficient_to_integer_term(coefficient),
+			      variable_term(varid));
+    while (true) {
+      ++varid;
+      while (varid < space_dimension
+	     && (coefficient = r.coefficient(Variable(varid))) == 0)
+	++varid;
+      if (varid >= space_dimension)
+	break;
+      else {
+	Prolog_term_ref addendum = Prolog_new_term_ref();
+	Prolog_construct_compound(addendum, a_asterisk,
+				  Coefficient_to_integer_term(coefficient),
+				  variable_term(varid));
+	Prolog_term_ref new_so_far = Prolog_new_term_ref();
+	Prolog_construct_compound(new_so_far, a_plus,
+				  so_far, addendum);
+	so_far = new_so_far;
+      }
+    }
+  }
+  return so_far;
+}
+
+Prolog_term_ref
+get_linear_expression(const Linear_Expression& le) {
+  Prolog_term_ref t_homo = get_homogeneous_expression(le);
+  if (le.inhomogeneous_term() == 0)
+    return t_homo;
+  else {
+    Prolog_term_ref t_in
+      = Coefficient_to_integer_term(le.inhomogeneous_term());
+    if (unify_long(t_homo, 0))
+      return t_in;
+    else {
+      Prolog_term_ref t_le = Prolog_new_term_ref();
+      Prolog_construct_compound(t_le, a_plus, t_homo, t_in);
+      return t_le;
+    }
+  }
+}
+
+Prolog_term_ref
+constraint_term(const Constraint& c) {
+  Prolog_atom relation = 0;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    relation = a_equal;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    relation = a_greater_than_equal;
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    relation = a_greater_than;
+    break;
+  default:
+    throw unknown_interface_error("generator_term()");
+  }
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound
+    (t,
+     relation,
+     get_homogeneous_expression(c),
+     Coefficient_to_integer_term(-c.inhomogeneous_term()));
+  return t;
+}
+
+Prolog_term_ref
+congruence_term(const Congruence& cg) {
+  Prolog_atom relation1 = a_is_congruent_to;
+  Prolog_atom relation2 = a_modulo;
+  Prolog_term_ref t_tmp = Prolog_new_term_ref();
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound
+    (t_tmp,
+     relation1,
+     get_homogeneous_expression(cg),
+     Coefficient_to_integer_term(-cg.inhomogeneous_term()));
+  Prolog_construct_compound
+    (t,
+     relation2,
+     t_tmp,
+     Coefficient_to_integer_term(cg.modulus()));
+  return t;
+}
+
+Prolog_term_ref
+generator_term(const Generator& g) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_atom constructor = 0;
+  switch (g.type()) {
+  case Generator::LINE:
+    constructor = a_line;
+    break;
+  case Generator::RAY:
+    constructor = a_ray;
+    break;
+  case Generator::POINT:
+    {
+      constructor = a_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+	break;
+      else {
+	Prolog_construct_compound(t, constructor,
+				  get_homogeneous_expression(g),
+				  Coefficient_to_integer_term(divisor));
+	return t;
+      }
+    }
+  case Generator::CLOSURE_POINT:
+    {
+      constructor = a_closure_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+	break;
+      else {
+	Prolog_construct_compound(t, constructor,
+				  get_homogeneous_expression(g),
+				  Coefficient_to_integer_term(divisor));
+	return t;
+      }
+    }
+  default:
+    throw unknown_interface_error("generator_term()");
+  }
+  Prolog_construct_compound(t, constructor, get_homogeneous_expression(g));
+  return t;
+}
+
+Prolog_term_ref
+grid_generator_term(const Grid_Generator& g) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_atom constructor = 0;
+  switch (g.type()) {
+  case Grid_Generator::LINE:
+    constructor = a_grid_line;
+    break;
+  case Grid_Generator::PARAMETER:
+    {
+      constructor = a_parameter;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+	break;
+      else {
+	Prolog_construct_compound(t, constructor,
+				  get_homogeneous_expression(g),
+				  Coefficient_to_integer_term(divisor));
+	return t;
+      }
+    }
+  case Grid_Generator::POINT:
+    {
+      constructor = a_grid_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+	break;
+      else {
+	Prolog_construct_compound(t, constructor,
+				  get_homogeneous_expression(g),
+				  Coefficient_to_integer_term(divisor));
+	return t;
+      }
+    }
+  default:
+    throw unknown_interface_error("grid_generator_term()");
+  }
+  Prolog_construct_compound(t, constructor, get_homogeneous_expression(g));
+  return t;
+}
+
+Variable
+term_to_Variable(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (functor == a_dollar_VAR && arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      return
+	Variable(term_to_unsigned<dimension_type>(arg, "term_to_Variable"));
+    }
+  }
+  throw not_a_variable(t, where);
+}
+
+Coefficient
+term_to_Coefficient(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_integer(t))
+    return integer_term_to_Coefficient(t);
+  else
+    throw not_an_integer(t, where);
+}
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_max || name == a_min))
+      return name;
+  }
+  throw not_an_optimization_mode(t, where);
+}
+
+bool Prolog_interface_initialized = false;
+
+void
+check_nil_terminating(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom a;
+    Prolog_get_atom_name(t, &a);
+    if (a == a_nil)
+      return;
+  }
+  throw not_a_nil_terminated_list(t, where);
+}
+
+inline dimension_type
+max_representable_dimension(dimension_type d) {
+  return
+    Prolog_has_unbounded_integers
+    ? d
+    : std::min(d, static_cast<dimension_type>(Prolog_max_integer));
+}
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+		 bool& finite, bool& closed,
+		 Coefficient& n, Coefficient& d) {
+  if (!Prolog_is_compound(t_b))
+    return false;
+
+  Prolog_atom functor;
+  int arity;
+
+  Prolog_get_compound_name_arity(t_b, &functor, &arity);
+  // A boundary term is either of the form c(Limit) or o(Limit).
+  if (arity != 1 || (functor != a_c && functor != a_o))
+    return false;
+
+  Prolog_atom open_closed_atom = functor;
+
+  Prolog_term_ref t_limit = Prolog_new_term_ref();
+  Prolog_get_arg(1, t_b, t_limit);
+  if (Prolog_is_integer(t_limit)) {
+    // A finite, integral limit.
+    finite = true;
+    closed = (open_closed_atom == a_c);
+    n = integer_term_to_Coefficient(t_limit);
+    d = 1;
+  }
+  else if (Prolog_is_atom(t_limit)) {
+    Prolog_atom a;
+    Prolog_get_atom_name(t_limit, &a);
+    Prolog_atom allowed_infinity = (kind == LOWER_BOUNDARY ? a_minf : a_pinf);
+    // Only open bounds may be unbounded.
+    if (a != allowed_infinity || open_closed_atom != a_o)
+      return false;
+
+    finite = false;
+  }
+  else if (Prolog_is_compound(t_limit)) {
+    Prolog_get_compound_name_arity(t_limit, &functor, &arity);
+    if (arity != 2 || functor != a_slash)
+      return false;
+
+    Prolog_term_ref t_n = Prolog_new_term_ref();
+    Prolog_term_ref t_d = Prolog_new_term_ref();
+    Prolog_get_arg(1, t_limit, t_n);
+    Prolog_get_arg(2, t_limit, t_d);
+
+    if (!Prolog_is_integer(t_n) || !Prolog_is_integer(t_d))
+      return false;
+    else {
+      finite = true;
+      closed = (open_closed_atom == a_c);
+      n = integer_term_to_Coefficient(t_n);
+      d = integer_term_to_Coefficient(t_d);
+      // Catch negative denominators and divisions by zero here.
+      if (d <= 0)
+        return false;
+    }
+  }
+  return true;
+}
+
+Prolog_atom
+term_to_relation(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_equal
+	    || name == a_greater_than_equal
+	    || name == a_equal_less_than
+	    || name == a_greater_than
+	    || name == a_less_than))
+      return name;
+  }
+  throw not_a_relation(t, where);
+}
+
+Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r, const char* where) {
+  Prolog_atom ra = term_to_relation(t_r, where);
+  Relation_Symbol r;
+  if (ra == a_less_than)
+    r = LESS_THAN;
+  else if (ra == a_equal_less_than)
+    r = LESS_OR_EQUAL;
+  else if (ra == a_equal)
+    r = EQUAL;
+  else if (ra == a_greater_than_equal)
+    r = GREATER_OR_EQUAL;
+  else {
+    assert(ra == a_greater_than);
+    r = GREATER_THAN;
+  }
+  return r;
+}
+
+Prolog_term_ref
+rational_term(const Rational_Box::interval_type::boundary_type& q) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  TEMP_INTEGER(numerator);
+  TEMP_INTEGER(denominator);
+  numerator = q.get_num();
+  denominator = q.get_den();
+  if (denominator == 1)
+    Prolog_put_Coefficient(t, numerator);
+  else
+    Prolog_construct_compound(t, a_slash,
+			      Coefficient_to_integer_term(numerator),
+			      Coefficient_to_integer_term(denominator));
+  return t;
+}
+
+Prolog_term_ref
+interval_term(const Rational_Box::interval_type& i) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  if (i.is_empty())
+    Prolog_put_atom(t, a_empty);
+  else {
+    // Lower bound.
+    const Prolog_atom& l_oc = i.lower_is_open() ? a_o : a_c;
+    Prolog_term_ref l_b = Prolog_new_term_ref();
+    if (i.lower_is_unbounded())
+      Prolog_put_atom(l_b, a_minf);
+    else
+      Prolog_put_term(l_b, rational_term(i.lower()));
+    Prolog_term_ref l_t = Prolog_new_term_ref();
+    Prolog_construct_compound(l_t, l_oc, l_b);
+
+    // Upper bound.
+    const Prolog_atom& u_oc = i.upper_is_open() ? a_o : a_c;
+    Prolog_term_ref u_b = Prolog_new_term_ref();
+    if (i.upper_is_unbounded())
+      Prolog_put_atom(u_b, a_pinf);
+    else
+      Prolog_put_term(u_b, rational_term(i.upper()));
+    Prolog_term_ref u_t = Prolog_new_term_ref();
+    Prolog_construct_compound(u_t, u_oc, u_b);
+
+    Prolog_construct_compound(t, a_i, l_t, u_t);
+  }
+  return t;
+}
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_polynomial || name == a_simplex || name == a_any))
+      return name;
+  }
+  throw not_a_complexity_class(t, where);
+}
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library::Prolog_Interfaces;
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_major()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_minor()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_revision()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_beta()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v) {
+  try {
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_atom_chars(tmp, version());
+    if (Prolog_unify(t_v, tmp))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b) {
+  try {
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_atom_chars(tmp, banner());
+    if (Prolog_unify(t_b, tmp))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd) {
+  try {
+    if (unify_ulong(t_msd, max_representable_dimension(max_space_dimension())))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize() {
+  try {
+    if (Prolog_interface_initialized)
+      return PROLOG_SUCCESS;
+    // Initialize the core library.
+    initialize();
+    for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i) {
+      Prolog_atom a = Prolog_atom_from_string(prolog_interface_atoms[i].name);
+      *prolog_interface_atoms[i].p_atom = a;
+    }
+    timeout_exception_atom = a_time_out;
+    out_of_memory_exception_atom = a_out_of_memory;
+    ppl_Prolog_sysdep_init();
+    Prolog_interface_initialized = true;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize() {
+  try {
+    if (!Prolog_interface_initialized)
+      return PROLOG_SUCCESS;
+
+    Prolog_interface_initialized = false;
+    // Finalize the core library.
+    finalize();
+#ifdef PPL_WATCHDOG_LIBRARY_ENABLED
+    // Release the pending timeout object, if any.
+    reset_timeout();
+#endif
+    ppl_Prolog_sysdep_deinit();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_rounding_for_PPL() {
+  try {
+    set_rounding_for_PPL();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_restore_pre_PPL_rounding() {
+  try {
+    restore_pre_PPL_rounding();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea) {
+  try {
+    if (Prolog_is_atom(t_tea)) {
+      Prolog_atom tea;
+      if (Prolog_get_atom_name(t_tea, &tea)) {
+	timeout_exception_atom = tea;
+	return PROLOG_SUCCESS;
+      }
+    }
+    Prolog_term_ref found = Prolog_new_term_ref();
+    Prolog_construct_compound(found, a_found, t_tea);
+
+    Prolog_term_ref expected = Prolog_new_term_ref();
+    Prolog_construct_compound(expected, a_expected,
+			      Prolog_atom_term_from_string("atom"));
+
+    Prolog_term_ref where = Prolog_new_term_ref();
+    Prolog_construct_compound(where, a_where,
+			      Prolog_atom_term_from_string
+			      ("ppl_set_timeout_exception_atom"));
+
+    Prolog_term_ref exception_term = Prolog_new_term_ref();
+    Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			      found, expected, where);
+    Prolog_raise_exception(exception_term);
+    return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t) {
+  try {
+    Prolog_term_ref t_tea = Prolog_new_term_ref();
+    Prolog_put_atom(t_tea, timeout_exception_atom);
+    return Prolog_unify(t_tea, t) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_time) {
+  try {
+#ifdef PPL_WATCHDOG_LIBRARY_ENABLED
+    // In case a timeout was already set.
+    reset_timeout();
+    static timeout_exception e;
+    unsigned hundredth_secs = term_to_unsigned<unsigned>(t_time,
+							 "ppl_set_timeout/1");
+    p_timeout_object =
+      new Parma_Watchdog_Library::Watchdog(hundredth_secs,
+					   abandon_expensive_computations,
+					   e);
+    return PROLOG_SUCCESS;
+#else
+    used(t_time);
+    return PROLOG_FAILURE;
+#endif
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout() {
+  try {
+#ifdef PPL_WATCHDOG_LIBRARY_ENABLED
+    reset_timeout();
+    return PROLOG_SUCCESS;
+#else
+    return PROLOG_FAILURE;
+#endif
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded() {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded)
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min) {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded) {
+      TEMP_INTEGER(min);
+      min = std::numeric_limits<Coefficient>::min();
+      if (Prolog_has_unbounded_integers
+	  || (min >= Prolog_min_integer && min <= Prolog_min_integer))
+	return Prolog_unify_Coefficient(t_min, min)
+	  ? PROLOG_SUCCESS : PROLOG_FAILURE;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max) {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded) {
+      TEMP_INTEGER(max);
+      max = std::numeric_limits<Coefficient>::max();
+      if (Prolog_has_unbounded_integers
+	  || (max >= Prolog_min_integer && max <= Prolog_min_integer))
+	return Prolog_unify_Coefficient(t_max, max)
+	  ? PROLOG_SUCCESS : PROLOG_FAILURE;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_from_space_dimension/2";
+  try {
+    dimension_type d = term_to_unsigned<dimension_type>(t_nd, where);
+    MIP_Problem* mip = new MIP_Problem(d);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, mip);
+    if (Prolog_unify(t_mip, tmp)) {
+      PPL_REGISTER(mip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete mip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem(Prolog_term_ref t_nd,
+		    Prolog_term_ref t_clist,
+		    Prolog_term_ref t_le_expr,
+		    Prolog_term_ref t_opt,
+		    Prolog_term_ref t_mip) {
+  static const char* where = "ppl_new_MIP_Problem/5";
+  try {
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c, where));
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    Prolog_atom opt = term_to_optimization_mode(t_opt, where);
+    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+
+    MIP_Problem* mip
+      = new MIP_Problem(term_to_unsigned<dimension_type>(t_nd, where),
+			cs, le, mode);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, mip);
+    if (Prolog_unify(t_mip, tmp)) {
+      PPL_REGISTER(mip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete mip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_MIP_Problem(Prolog_term_ref t_mip_source,
+				     Prolog_term_ref t_mip) {
+  static const char* where = "ppl_new_MIP_Problem_from_MIP_Problem/2";
+  try {
+    const MIP_Problem* mip_source
+      = static_cast<const MIP_Problem*>
+      (term_to_handle<MIP_Problem>(t_mip_source, where));
+    PPL_CHECK(mip_source);
+    MIP_Problem* mip = new MIP_Problem(*mip_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, mip);
+    if (Prolog_unify(t_mip, tmp)) {
+      PPL_REGISTER(mip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete mip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_MIP_Problem_swap/2";
+  try {
+    MIP_Problem* lhs = term_to_handle<MIP_Problem>(t_lhs, where);
+    MIP_Problem* rhs = term_to_handle<MIP_Problem>(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->swap(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_MIP_Problem(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_delete_MIP_Problem/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_UNREGISTER(mip);
+    delete mip;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_space_dimension(Prolog_term_ref t_mip, Prolog_term_ref t_sd) {
+  static const char* where = "ppl_MIP_Problem_space_dimension/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    if (unify_ulong(t_sd, mip->space_dimension()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_integer_space_dimensions(Prolog_term_ref t_mip,
+					 Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_MIP_Problem_integer_space_dimensions/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Variables_Set& i_vars = mip->integer_space_dimensions();
+
+    for (Variables_Set::const_iterator i = i_vars.begin(),
+	   i_end = i_vars.end(); i != i_end; ++i)
+      Prolog_construct_cons(tail, variable_term(*i), tail);
+
+    if (Prolog_unify(t_vlist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_constraints(Prolog_term_ref t_mip,
+			    Prolog_term_ref t_clist) {
+  static const char* where = "ppl_MIP_Problem_constraints/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    for (MIP_Problem::const_iterator i = mip->constraints_begin(),
+	   i_end = mip->constraints_end(); i != i_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_clist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_objective_function(Prolog_term_ref t_mip,
+				   Prolog_term_ref t_le_expr) {
+  static const char* where = "ppl_MIP_Problem_objective_function/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    const Linear_Expression& le = mip->objective_function();
+    Prolog_term_ref t = get_linear_expression(le);
+
+    if (Prolog_unify(t_le_expr, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimization_mode(Prolog_term_ref t_mip,
+				  Prolog_term_ref t_opt) {
+  static const char* where = "ppl_MIP_Problem_optimization_mode/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Optimization_Mode mode = mip->optimization_mode();
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_atom a = (mode == MAXIMIZATION) ? a_max : a_min;
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_opt, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_clear(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_clear/1";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->clear();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_mip, Prolog_term_ref t_nnd) {
+  static const char* where
+    = "ppl_MIP_Problem_add_space_dimensions_and_embed/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    dimension_type d = term_to_unsigned<dimension_type>(t_nnd, where);
+    mip->add_space_dimensions_and_embed(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_to_integer_space_dimensions(Prolog_term_ref t_mip,
+						Prolog_term_ref t_vlist) {
+  static const char* where
+    = "ppl_MIP_Problem_add_to_integer_space_dimensions/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    Variables_Set i_vars;
+    Prolog_term_ref v = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      i_vars.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    mip->add_to_integer_space_dimensions(i_vars);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraint(Prolog_term_ref t_mip, Prolog_term_ref t_c) {
+  static const char* where = "ppl_MIP_Problem_add_constraint/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->add_constraint(build_constraint(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraints(Prolog_term_ref t_mip,
+				Prolog_term_ref t_clist) {
+  static const char* where = "ppl_MIP_Problem_add_constraints/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    mip->add_constraints(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_objective_function(Prolog_term_ref t_mip,
+				       Prolog_term_ref t_le_expr) {
+  static const char* where = "ppl_MIP_Problem_set_objective_function/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->set_objective_function(build_linear_expression(t_le_expr, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_optimization_mode(Prolog_term_ref t_mip,
+				      Prolog_term_ref t_opt) {
+  static const char* where = "ppl_MIP_Problem_set_optimization_mode/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_atom opt = term_to_optimization_mode(t_opt, where);
+    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+    mip->set_optimization_mode(mode);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_is_satisfiable(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_is_satisfiable/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    if (mip->is_satisfiable())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_solve(Prolog_term_ref t_mip, Prolog_term_ref t_status) {
+  static const char* where = "ppl_MIP_Problem_solve/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_atom a;
+    switch (mip->solve()) {
+    case UNFEASIBLE_MIP_PROBLEM:
+      a = a_unfeasible;
+      break;
+    case UNBOUNDED_MIP_PROBLEM:
+      a = a_unbounded;
+      break;
+    case OPTIMIZED_MIP_PROBLEM:
+      a = a_optimized;
+      break;
+    default:
+      throw unknown_interface_error("ppl_MIP_Problem_solve()");
+    }
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_status, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_feasible_point(Prolog_term_ref t_mip,
+			       Prolog_term_ref t_g) {
+  static const char* where = "ppl_MIP_Problem_feasible_point/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    const Generator& g = mip->feasible_point();
+    if (Prolog_unify(t_g, generator_term(g)))
+      return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimizing_point(Prolog_term_ref t_mip,
+				 Prolog_term_ref t_g) {
+  static const char* where = "ppl_MIP_Problem_optimizing_point/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    const Generator& g = mip->optimizing_point();
+    if (Prolog_unify(t_g, generator_term(g)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimal_value(Prolog_term_ref t_mip,
+			      Prolog_term_ref t_n,
+			      Prolog_term_ref t_d) {
+  static const char* where = "ppl_MIP_Problem_optimal_value/3";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    TEMP_INTEGER(n);
+    TEMP_INTEGER(d);
+    mip->optimal_value(n, d);
+    if (Prolog_unify_Coefficient(t_n, n)
+	&& Prolog_unify_Coefficient(t_d, d))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_evaluate_objective_function(Prolog_term_ref t_mip,
+					    Prolog_term_ref t_g,
+					    Prolog_term_ref t_n,
+					    Prolog_term_ref t_d) {
+  static const char* where = "ppl_MIP_Problem_evaluate_objective_function/4";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    TEMP_INTEGER(n);
+    TEMP_INTEGER(d);
+    mip->evaluate_objective_function(build_generator(t_g, where), n, d);
+    if (Prolog_unify_Coefficient(t_n, n)
+	&& Prolog_unify_Coefficient(t_d, d))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_OK(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_OK/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    if (mip->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
diff --git a/interfaces/Prolog/ppl_prolog_common.defs.hh b/interfaces/Prolog/ppl_prolog_common.defs.hh
new file mode 100644
index 0000000..9b14e53
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common.defs.hh
@@ -0,0 +1,926 @@
+/* Common part of the Prolog interfaces: declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_prolog_common_defs_hh
+#define PPL_ppl_prolog_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+#ifdef PPL_WATCHDOG_LIBRARY_ENABLED
+#include "pwl.hh"
+#endif
+#include "ppl_prolog_sysdep.hh"
+#include "interfaced_boxes.hh"
+#include <set>
+#include <vector>
+#include <exception>
+#include <stdexcept>
+#include <iostream>
+
+#ifndef PROLOG_TRACK_ALLOCATION
+#define PROLOG_TRACK_ALLOCATION 0
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Prolog_Interfaces {
+
+#if PROLOG_TRACK_ALLOCATION
+
+
+class Poly_Tracker {
+public:
+  //! Construct an allocation tracker with no registered objects.
+  Poly_Tracker();
+
+  /*! \brief
+    Register an object whose deletion is under the Prolog programmer
+    responsibility.
+  */
+  void insert(const void* pp);
+
+  /*! \brief
+    Register an object whose deletion is under the PPL library
+    responsibility.
+  */
+  void weak_insert(const void* pp);
+
+  //! Check whether the object was correctly registered.
+  void check(const void* pp) const;
+
+  /*! \brief
+    Unregister an object whose deletion is under the Prolog programmer
+    responsibility.
+  */
+  void remove(const void* pp);
+
+  /*! \brief
+    Destroy the allocation tracker: an error message will be output
+    if there still are registered objects whose deletion was under
+    the Prolog programmer responsibility.
+  */
+  ~Poly_Tracker();
+
+private:
+  //! The type for recording a set of pointers to PPL library objects.
+  typedef std::set<const void*, std::less<const void*> > Set;
+
+  /*! \brief
+    A set of pointers to objects whose deallocation is under the
+    rensponsibility of the Prolog programmer: they should be deallocated
+    before the termination of the program.
+  */
+  Set s;
+
+  /*! \brief
+    A set of pointers to objects whose deallocation is under the
+    rensponsibility of the PPL library: they should not be deallocated
+    by the Prolog programmer.
+  */
+  Set weak_s;
+};
+
+inline
+Poly_Tracker::Poly_Tracker() {
+}
+
+inline
+Poly_Tracker::~Poly_Tracker() {
+  Set::size_type n = s.size();
+  if (n > 0)
+    std::cerr
+      << "Poly_Tracker: " << n << " polyhedra leaked!"
+      << std::endl;
+}
+
+inline void
+Poly_Tracker::insert(const void* pp) {
+  std::pair<Set::iterator, bool> stat = s.insert(pp);
+  if (!stat.second) {
+    std::cerr
+      << "Poly_Tracker: two polyhedra at the same address at the same time?!"
+      << std::endl;
+    abort();
+  }
+}
+
+inline void
+Poly_Tracker::weak_insert(const void* pp) {
+  weak_s.insert(pp);
+}
+
+inline void
+Poly_Tracker::check(const void* pp) const {
+  if (s.find(pp) == s.end()
+      && weak_s.find(pp) == weak_s.end()) {
+    std::cerr
+      << "Poly_Tracker: attempt to access a nonexistent polyhedron."
+      << std::endl;
+    abort();
+  }
+}
+
+void
+Poly_Tracker::remove(const void* pp) {
+  if (s.erase(pp) != 1) {
+    std::cerr
+      << "Poly_Tracker: attempt to deallocate a nonexistent polyhedron."
+      << std::endl;
+    abort();
+  }
+}
+
+namespace {
+
+inline Poly_Tracker&
+poly_tracker() {
+  static Poly_Tracker pt;
+  return pt;
+}
+
+} // namespace
+
+#define PPL_REGISTER(x) Parma_Polyhedra_Library::poly_tracker().insert(x)
+#define PPL_WEAK_REGISTER(x) Parma_Polyhedra_Library::poly_tracker().weak_insert(x)
+#define PPL_UNREGISTER(x) Parma_Polyhedra_Library::poly_tracker().remove(x)
+#define PPL_CHECK(x) Parma_Polyhedra_Library::poly_tracker().check(x)
+
+#else
+
+#define PPL_REGISTER(x)
+#define PPL_WEAK_REGISTER(x)
+#define PPL_UNREGISTER(x)
+#define PPL_CHECK(x)
+
+#endif
+
+class internal_exception {
+private:
+  Prolog_term_ref t;
+  const char* w;
+
+public:
+  internal_exception(Prolog_term_ref term, const char* where)
+    : t(term),
+      w(where) {
+  }
+
+  virtual ~internal_exception() {
+  }
+
+  virtual Prolog_term_ref term() const {
+    return t;
+  }
+
+  virtual const char* where() const {
+    return w;
+  }
+};
+
+class Prolog_unsigned_out_of_range : public internal_exception {
+private:
+  unsigned long m;
+
+public:
+  Prolog_unsigned_out_of_range(Prolog_term_ref term,
+			       const char* where,
+			       unsigned long max)
+    : internal_exception(term, where),
+      m(max) {
+  }
+
+  unsigned long max() const {
+    return m;
+  }
+};
+
+class non_linear : public internal_exception {
+public:
+  non_linear(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_an_integer : public internal_exception {
+public:
+  not_an_integer(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_unsigned_integer : public internal_exception {
+public:
+  not_unsigned_integer(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_variable : public internal_exception {
+public:
+  not_a_variable(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_an_optimization_mode : public internal_exception {
+public:
+  not_an_optimization_mode(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_complexity_class : public internal_exception {
+public:
+  not_a_complexity_class(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_universe_or_empty : public internal_exception {
+public:
+  not_universe_or_empty(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_relation : public internal_exception {
+public:
+  not_a_relation(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_nil_terminated_list : public internal_exception {
+public:
+  not_a_nil_terminated_list(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class PPL_integer_out_of_range {
+private:
+  Parma_Polyhedra_Library::Coefficient n;
+
+public:
+  PPL_integer_out_of_range(const Parma_Polyhedra_Library::Coefficient& value)
+    : n(value) {
+  }
+
+  const Parma_Polyhedra_Library::Coefficient value() const {
+    return n;
+  }
+};
+
+class ppl_handle_mismatch : public internal_exception {
+public:
+  ppl_handle_mismatch(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class unknown_interface_error {
+private:
+  const char* w;
+
+public:
+  unknown_interface_error(const char* s)
+    : w(s) {
+  }
+
+  const char* where() const {
+    return w;
+  }
+};
+
+#if 0
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+#endif
+
+#if 0
+Prolog_atom out_of_memory_exception_atom;
+#endif
+
+// For Prolog lists.
+extern Prolog_atom a_nil;
+
+// For variables.
+extern Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+extern Prolog_atom a_plus;
+extern Prolog_atom a_minus;
+extern Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+extern Prolog_atom a_slash;
+
+// For constraints.
+extern Prolog_atom a_less_than;
+extern Prolog_atom a_equal_less_than;
+extern Prolog_atom a_equal;
+extern Prolog_atom a_greater_than_equal;
+extern Prolog_atom a_greater_than;
+
+// For congruences.
+extern Prolog_atom a_is_congruent_to;
+extern Prolog_atom a_modulo;
+
+// For generators.
+extern Prolog_atom a_line;
+extern Prolog_atom a_ray;
+extern Prolog_atom a_point;
+extern Prolog_atom a_closure_point;
+
+// For grid_generators.
+extern Prolog_atom a_grid_line;
+extern Prolog_atom a_parameter;
+extern Prolog_atom a_grid_point;
+
+// For the relation between a polyhedron and a constraint.
+extern Prolog_atom a_is_disjoint;
+extern Prolog_atom a_strictly_intersects;
+extern Prolog_atom a_is_included;
+extern Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+extern Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+extern Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+extern Prolog_atom a_empty;
+
+#if 0
+// Denotes the universe polyhedron.
+Prolog_atom a_universe;
+
+// Denotes the maximization mode for optimization problems.
+Prolog_atom a_max;
+
+// Denotes the minimization mode for optimization problems.
+Prolog_atom a_min;
+
+// Denote possible outcomes of MIP problems solution attempts.
+Prolog_atom a_unfeasible;
+Prolog_atom a_unbounded;
+Prolog_atom a_optimized;
+#endif
+
+// Denotes an open interval boundary.
+extern Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+extern Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+extern Prolog_atom a_minf;
+extern Prolog_atom a_pinf;
+
+// Denote complexity classes.
+extern Prolog_atom a_polynomial;
+extern Prolog_atom a_simplex;
+extern Prolog_atom a_any;
+
+#if 0
+// Default timeout exception atom.
+Prolog_atom a_time_out;
+
+// "Out of memory" exception atom.
+Prolog_atom a_out_of_memory;
+#endif
+
+// Boolean constants.
+extern Prolog_atom a_true;
+extern Prolog_atom a_false;
+
+#if 0
+// To build exception terms.
+Prolog_atom a_ppl_invalid_argument;
+Prolog_atom a_ppl_overflow_error;
+Prolog_atom a_ppl_domain_error;
+Prolog_atom a_ppl_length_error;
+Prolog_atom a_ppl_representation_error;
+Prolog_atom a_expected;
+Prolog_atom a_found;
+Prolog_atom a_where;
+#endif
+
+struct Prolog_Interface_Atom {
+  Prolog_atom* p_atom;
+  const char* name;
+};
+
+extern const Prolog_Interface_Atom prolog_interface_atoms[];
+
+#if 0
+Prolog_term_ref
+Prolog_atom_term_from_string(const char* s) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_put_atom(t, Prolog_atom_from_string(s));
+  return t;
+}
+#endif
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e);
+
+void
+handle_exception(const not_unsigned_integer& e);
+
+void
+handle_exception(const non_linear& e);
+
+void
+handle_exception(const not_a_variable& e);
+
+void
+handle_exception(const not_an_integer& e);
+
+void
+handle_exception(const ppl_handle_mismatch& e);
+
+void
+handle_exception(const not_an_optimization_mode& e);
+
+void
+handle_exception(const not_a_complexity_class& e);
+
+void
+handle_exception(const not_universe_or_empty& e);
+
+void
+handle_exception(const not_a_relation& e);
+
+void
+handle_exception(const not_a_nil_terminated_list& e);
+
+void
+handle_exception(const PPL_integer_out_of_range& e);
+
+void
+handle_exception(const unknown_interface_error& e);
+
+void
+handle_exception(const std::overflow_error& e);
+
+void
+handle_exception(const std::length_error& e);
+
+void
+handle_exception(const std::bad_alloc&);
+
+void
+handle_exception(const std::exception& e);
+
+void
+handle_exception();
+
+class timeout_exception : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+  timeout_exception() {
+  }
+};
+
+void
+handle_exception(const timeout_exception&);
+
+#define CATCH_ALL \
+  catch (const Prolog_unsigned_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_unsigned_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const non_linear& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_variable& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const ppl_handle_mismatch& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_optimization_mode& e) {	\
+    handle_exception(e); \
+  } \
+  catch (const not_a_complexity_class& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_universe_or_empty& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_relation& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_nil_terminated_list& e) { \
+    handle_exception(e); \
+  } \
+  catch (const PPL_integer_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const unknown_interface_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const timeout_exception& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::overflow_error& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::length_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::bad_alloc& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::exception& e) { \
+    handle_exception(e); \
+  } \
+  catch (...) { \
+    handle_exception(); \
+  } \
+  return PROLOG_FAILURE
+
+#if 0
+Prolog_term_ref
+variable_term(dimension_type varid) {
+  Prolog_term_ref v = Prolog_new_term_ref();
+  Prolog_put_ulong(v, varid);
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound(t, a_dollar_VAR, v);
+  return t;
+}
+
+unsigned int
+get_unsigned_int(long n) {
+  if (n >= 0 && static_cast<unsigned long>(n) <= UINT_MAX)
+    return n;
+  else {
+    Prolog_term_ref n_term = Prolog_new_term_ref();
+    Prolog_put_long(n_term, n);
+    throw not_unsigned_integer(n_term, "get_unsigned_int");
+  }
+}
+#endif
+
+template <typename U>
+U
+term_to_unsigned(Prolog_term_ref t, const char* where) {
+  using namespace Parma_Polyhedra_Library;
+  using namespace Parma_Polyhedra_Library::Prolog_Interfaces;
+  if (!Prolog_is_integer(t))
+    throw not_unsigned_integer(t, where);
+
+  U d = 0;
+  long l;
+  if (Prolog_get_long(t, &l))
+    if (l < 0)
+      throw not_unsigned_integer(t, where);
+    else if (static_cast<unsigned long>(l) > std::numeric_limits<U>::max())
+      throw Prolog_unsigned_out_of_range(t, where,
+					 std::numeric_limits<U>::max());
+    else
+      d = l;
+  else {
+    TEMP_INTEGER(v);
+    Prolog_get_Coefficient(t, v);
+    if (v < 0)
+      throw not_unsigned_integer(t, where);
+    if (assign_r(d, raw_value(v), ROUND_NOT_NEEDED) != V_EQ)
+      throw Prolog_unsigned_out_of_range(t, where,
+					 std::numeric_limits<U>::max());
+  }
+  return d;
+}
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t, const char* where);
+
+Prolog_term_ref
+interval_term(const Parma_Polyhedra_Library::Rational_Box::interval_type& i);
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t, const char* where);
+
+template <typename T>
+T*
+term_to_handle(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_address(t)) {
+    void* p;
+    if (Prolog_get_address(t, &p))
+      return static_cast<T*>(p);
+  }
+  throw ppl_handle_mismatch(t, where);
+}
+
+enum Boundary_Kind {
+  LOWER_BOUNDARY,
+  UPPER_BOUNDARY
+};
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+		 bool& finite, bool& closed,
+		 Parma_Polyhedra_Library::Coefficient& n, Parma_Polyhedra_Library::Coefficient& d);
+
+Parma_Polyhedra_Library::Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r, const char* where);
+
+Parma_Polyhedra_Library::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t);
+
+Prolog_term_ref
+Coefficient_to_integer_term(const Parma_Polyhedra_Library::Coefficient& n);
+
+bool
+unify_long(Prolog_term_ref t, long l);
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l);
+
+Parma_Polyhedra_Library::Linear_Expression
+build_linear_expression(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Constraint
+build_constraint(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Congruence
+build_congruence(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Generator
+build_generator(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Grid_Generator
+build_grid_generator(Prolog_term_ref t, const char* where);
+
+Prolog_term_ref
+get_linear_expression(const Parma_Polyhedra_Library::Linear_Expression& le);
+
+Prolog_term_ref
+constraint_term(const Parma_Polyhedra_Library::Constraint& c);
+
+Prolog_term_ref
+congruence_term(const Parma_Polyhedra_Library::Congruence& cg);
+
+Prolog_term_ref
+generator_term(const Parma_Polyhedra_Library::Generator& g);
+
+Prolog_term_ref
+grid_generator_term(const Parma_Polyhedra_Library::Grid_Generator& g);
+
+Parma_Polyhedra_Library::Variable
+term_to_Variable(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Coefficient
+term_to_Coefficient(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t, const char* where);
+
+void
+check_nil_terminating(Prolog_term_ref t, const char* where);
+
+} // namespace Prolog_Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b);
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd);
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize();
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize();
+
+extern "C" Prolog_foreign_return_type
+ppl_set_rounding_for_PPL();
+
+extern "C" Prolog_foreign_return_type
+ppl_restore_pre_PPL_rounding();
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea);
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_time);
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout();
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded();
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min);
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem(Prolog_term_ref t_nd,
+		    Prolog_term_ref t_clist,
+		    Prolog_term_ref t_le_expr,
+		    Prolog_term_ref t_opt,
+		    Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_MIP_Problem(Prolog_term_ref t_mip_source,
+				     Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_MIP_Problem(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_space_dimension(Prolog_term_ref t_mip, Prolog_term_ref t_sd);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_integer_space_dimensions(Prolog_term_ref t_mip,
+					 Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_constraints(Prolog_term_ref t_mip,
+			    Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_objective_function(Prolog_term_ref t_mip,
+				   Prolog_term_ref t_le_expr);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimization_mode(Prolog_term_ref t_mip,
+				  Prolog_term_ref t_opt);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_clear(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_mip, Prolog_term_ref t_nnd);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_to_integer_space_dimensions(Prolog_term_ref t_mip,
+						Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraint(Prolog_term_ref t_mip, Prolog_term_ref t_c);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraints(Prolog_term_ref t_mip,
+				Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_objective_function(Prolog_term_ref t_mip,
+				       Prolog_term_ref t_le_expr);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_optimization_mode(Prolog_term_ref t_mip,
+				      Prolog_term_ref t_opt);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_is_satisfiable(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_solve(Prolog_term_ref t_mip, Prolog_term_ref t_status);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_feasible_point(Prolog_term_ref t_mip,
+			       Prolog_term_ref t_g);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimizing_point(Prolog_term_ref t_mip,
+				 Prolog_term_ref t_g);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimal_value(Prolog_term_ref t_mip,
+			      Prolog_term_ref t_n,
+			      Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_evaluate_objective_function(Prolog_term_ref t_mip,
+					    Prolog_term_ref t_g,
+					    Prolog_term_ref t_n,
+					    Prolog_term_ref t_d);
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Prolog_Interfaces;
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_OK(Prolog_term_ref t_mip);
+
+class PFunc {
+private:
+  std::set<dimension_type> codomain;
+  std::vector<dimension_type> vec;
+
+public:
+  PFunc() {
+  }
+
+  bool has_empty_codomain() const {
+    return codomain.empty();
+  }
+
+  dimension_type max_in_codomain() const {
+    if (codomain.empty())
+      throw unknown_interface_error("PFunc::max_in_codomain()");
+    return *codomain.rbegin();
+  }
+
+  bool maps(dimension_type i, dimension_type& j) const {
+    if (i >= vec.size())
+      return false;
+    dimension_type vec_i = vec[i];
+    if (vec_i == not_a_dimension())
+      return false;
+    j = vec_i;
+    return true;
+  }
+
+  bool insert(dimension_type i, dimension_type j) {
+    std::pair<std::set<dimension_type>::iterator, bool> s
+      = codomain.insert(j);
+    if (!s.second)
+      // *this is not injective!
+      return false;
+    if (i > vec.size())
+      vec.insert(vec.end(), i - vec.size(), not_a_dimension());
+    if (i == vec.size()) {
+      vec.insert(vec.end(), j);
+      return true;
+    }
+    dimension_type& vec_i = vec[i];
+    if (vec_i != not_a_dimension())
+      // Already mapped: *this is not a function!
+      return false;
+    vec_i = j;
+    return true;
+  }
+};
+
+#include "ppl_prolog_common.inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/Prolog/ppl_prolog_common.inlines.hh b/interfaces/Prolog/ppl_prolog_common.inlines.hh
new file mode 100644
index 0000000..eaa44d4
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common.inlines.hh
@@ -0,0 +1,26 @@
+/* Common part of the Prolog interfaces: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_prolog_common_inlines_hh
+#define PPL_ppl_prolog_common_inlines_hh 1
+
+#endif // !defined(PPL_ppl_prolog_common_inlines_hh)
diff --git a/interfaces/Prolog/ppl_prolog_sysdep_dox b/interfaces/Prolog/ppl_prolog_sysdep_dox
new file mode 100644
index 0000000..27593a4
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_sysdep_dox
@@ -0,0 +1,212 @@
+
+\anchor PI_Compilation
+<H1>Compilation and Installation</H1>
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of each supported Prolog system.  If a supported Prolog system is
+correctly installed in a standard location, things are arranged
+so that the corresponding interface is built and installed.
+
+As an option, the Prolog interface can track the creation and disposal
+of polyhedra.  In fact, differently from native Prolog data, PPL polyhedra
+must be explicitly disposed and forgetting to do so is a very common mistake.
+To enable this option, configure the library adding
+<CODE>-DPROLOG_TRACK_ALLOCATION</CODE> to the options passed to the
+C++ compiler.
+Your configure command would then look like
+\code
+  path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ...
+\endcode
+
+\anchor PI_SD_Features
+<H1>System-Dependent Features</H1>
+
+<H2>CIAO Prolog</H2>
+
+The Ciao Prolog interface to the PPL is available
+both as ``PPL enhanced'' Ciao Prolog interpreter
+and as a library that can be linked to Ciao Prolog programs.
+Only Ciao Prolog versions 1.10 `#5 and later are supported.'
+
+So that it can be used with the Ciao Prolog PPL interface, the
+Ciao Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_ciao</CODE> Executable</H3>
+
+If an appropriate version of Ciao Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_ciao</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_ciao</CODE> executable is simply the Ciao Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To Ciao Prolog Programs</H3>
+
+In order to allow linking Ciao Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_ciao.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_ciao.*</CODE> contain the executable code for the
+Ciao Prolog interface in various formats (static library, shared library,
+libtool library).
+If your Ciao Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+ciaoc -o myprog prefix/lib/ppl/ppl_ciao.pl ciao_pl_check.pl \
+  -L '-Lprefix/lib/ppl -lppl_ciao -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+<H2>GNU Prolog</H2>
+
+The GNU Prolog interface to the PPL is available both as a
+``PPL enhanced'' GNU Prolog interpreter and as a library that can be
+linked to GNU Prolog programs.
+The only GNU Prolog version that is known to work is a patched
+version of the ``unstable version'' tagged
+<A HREF="ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz">20040608</A>
+(which unpacks to a directory called <CODE>gprolog-1.2.18</CODE>).
+The patch is contained in the
+<CODE>interfaces/Prolog/GNU/README</CODE> file of the PPL's distribution.
+
+So that it can be used with the GNU Prolog PPL interface
+(and, for that matter, with any foreign code),
+the GNU Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_gprolog</CODE> Executable</H3>
+
+If an appropriate version of GNU Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_gprolog</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_gprolog</CODE> executable is simply the GNU Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To GNU Prolog Programs</H3>
+
+In order to allow linking GNU Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_gprolog.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_gprolog.*</CODE> contain the executable code for the
+GNU Prolog interface in various formats (static library, shared library,
+libtool library).
+If your GNU Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+gplc -o myprog prefix/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+  -L '-Lprefix/lib/ppl -lppl_gprolog -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+
+<H2>SICStus Prolog</H2>
+
+The SICStus Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SICStus Prolog versions 3.9.0 and later are supported.
+
+<H3>The Statically Linked <CODE>ppl_sicstus</CODE> Executable</H3>
+
+If an appropriate version of SICStus Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_sicstus</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_sicstus</CODE> executable is simply the SICStus Prolog
+system with the Parma Polyhedra Library statically linked.
+The only thing you should do to use the library is to
+load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+
+<H3>Loading the SICStus Interface Dynamically</H3>
+
+In order to dynamically load the library from SICStus Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+<H2>SWI-Prolog</H2>
+
+The SWI-Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SWI-Prolog version 5.6.0 and later versions are supported.
+
+<H3>The <CODE>ppl_pl</CODE> Executable</H3>
+
+If an appropriate version of SWI-Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_pl</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_pl</CODE> executable is simply the SWI-Prolog
+shell with the Parma Polyhedra Library statically linked:
+from within <CODE>ppl_pl</CODE> all the services of the library
+are available without further action.
+
+<H3>Loading the SWI-Prolog Interface Dynamically</H3>
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_swiprolog.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> and
+<CODE>ppl_finalize/0</CODE> automatically.
+Alternatively, you can load the library directly with
+\code
+:- load_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+This will call <CODE>ppl_initialize/0</CODE> automatically.
+Analogously,
+\code
+:- unload_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+will, as part of the unload process, invoke <CODE>ppl_finalize/0</CODE>.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+<H2>XSB</H2>
+
+The XSB Prolog interface to the PPL is available
+as a dynamically linked module.
+Only some CVS versions of XSB starting from 2 July 2005 are known to work.
+CVS versions starting from 11 November 2005 are known not to work.
+
+In order to dynamically load the library from XSB you should
+load the <CODE>ppl_xsb</CODE> module and import the predicates
+you need.
+For things to work, you may have to copy the files
+<CODE>prefix/lib/ppl/ppl_xsb.xwam</CODE>
+and
+<CODE>prefix/lib/ppl/ppl_xsb.so</CODE>
+in your current directory or in one of the XSB library directories.
+
+
+<H2>YAP</H2>
+
+The YAP Prolog interface to the PPL is available
+as a dynamically linked module.
+Only YAP versions following 5.1.0 and CVS HEAD versions starting from
+4 January 2006 are supported.  Notice that support for unbounded
+integers in YAP is young and may have errors that could affect
+programs using the PPL (see, e.g.,
+<A HREF="http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html">http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html</A>).
+
+In order to dynamically load the library from YAP you should
+simply load <CODE>prefix/lib/ppl/ppl_yap.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> automatically;
+it is the programmer's responsibility to call <CODE>ppl_finalize/0</CODE>
+when the PPL library is no longer needed.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+*/ /* \mainpage */
+
diff --git a/interfaces/Prolog/ppl_prolog_sysindep_dox b/interfaces/Prolog/ppl_prolog_sysindep_dox
new file mode 100644
index 0000000..106038e
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_sysindep_dox
@@ -0,0 +1,1554 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+/* Documentation for the Prolog interfaces.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \mainpage Prolog Language Interface
+
+The Parma Polyhedra Library comes equipped with a Prolog interface.
+Despite the lack of standardization of Prolog's foreign language interfaces,
+the PPL Prolog interface supports several Prolog systems and, to the
+extent this is possible, provides a uniform view of the library from
+each such systems.
+
+The system-independent features of the library are described in
+Section \ref PI_SI_Features "System-Independent Features".
+Section \ref PI_Compilation "Compilation and Installation"
+explains how the various incarnations of the Prolog interface
+are compiled and installed.
+Section \ref PI_SD_Features "System-Dependent Features"
+illustrates the system-dependent features of the interface
+for all the supported systems.
+
+In the sequel, <CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+
+\anchor PI_SI_Features
+<H1>System-Independent Features</H1>
+
+The Prolog interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in the main \extref{preamble, PPL user manual}.
+Here we just describe those aspects that are specific to the Prolog interface.
+<H4>Contents:</H4>
+- \ref Prolog_Interface_Overview "Overview";
+- \ref Predicate_Specifications "Predicate Specifications";
+- \ref predicate_descriptions "Predicate Descriptions"
+    - \ref di_predicates "Domain Independent Predicates",
+    - \ref mip_predicates "MIP Predicates",
+    - \ref main_polyhedron_predicates "Main Polyhedron Predicates";
+- \ref generated_predicates "Examples of Generated Domains with Predicates".
+
+\anchor Prolog_Interface_Overview
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- The numerical abstract domains available to the Prolog user consist
+  of the <EM>simple</EM> domains, <EM>powersets</EM> of a simple domain and
+  <EM>products</EM> of simple domains.
+  - The simple domains are:
+     - convex polyhedra, which consist of C_Polyhedron and
+       NNC_Polyhedron;<BR>
+     - weakly relational, which consist of BD_Shape_N and
+       Octagonal_Shape_N
+       where N is one of the numeric types
+       short, signed_char, int, long, long_long,
+       mpz_class, mpq_class;<BR>
+     - boxes which consist of
+       Int8_Box, Int16_Box,
+       Int32_Box, Int64_Box,
+       Uint8_Box, Uint16_Box,
+       Uint32_Box, Uint64_Box,
+       Double_Box, Long_Double_Box,
+       Z_Box, Rational_Box, Float_Box; and<BR>
+     - the Grid domain.
+  - The powerset domains are Pointset_Powerset_S where S is
+    a simple domain.
+  - The product domains consist of
+    Direct_Product_S_T,
+    Smash_Product_S_T and
+    Constraints_Product_S_T where S
+    and T are simple domains.
+- In the following, any of the above numerical
+  abstract domains  is called a PPL <EM>domain</EM>
+  and any element of a PPL domain is called a <EM>PPL object</EM>.
+- The Prolog interface files are all installed in the directory
+  <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+  dynamically loaded libraries, you must make your dynamic
+  linker/loader aware of this fact.  If you use a GNU/Linux system,
+  try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+  for more information.
+- The Prolog interface to the PPL is initialized and finalized by the
+  predicates <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>.
+  Thus the only interface predicates callable after
+  <CODE>ppl_finalize/0</CODE> are <CODE>ppl_finalize/0</CODE> itself
+  (this further call has no effect) and <CODE>ppl_initialize/0</CODE>,
+  after which the interface's services are usable again.
+  Some Prolog systems allow the specification of initialization
+  and deinitialization functions in their foreign language interfaces.
+  The corresponding incarnations of the PPL-Prolog interface
+  have been written so that <CODE>ppl_initialize/0</CODE> and/or
+  <CODE>ppl_finalize/0</CODE> are called automatically.
+  Section \ref PI_SD_Features "System-Dependent Features" will detail
+  in which cases initialization and finalization is automatically
+  performed or is left to the Prolog programmer's responsibility.
+  However, for portable applications, it is best
+  to invoke <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>
+  explicitly: since they can be called multiple times without problems,
+  this will result in enhanced portability at a cost that is, by all means,
+  negligible.
+- A PPL object such as a polyhedron can only be accessed
+  by means of a Prolog term called a <EM>handle</EM>.
+  Note, however, that the data structure of a handle,
+  is implementation-dependent, system-dependent and
+  version-dependent, and, for this reason, deliberately left unspecified.
+  What we do guarantee is that the handle requires very little memory.
+- A Prolog term can be bound to a valid handle for a PPL object by using
+  predicates such as
+\code
+  ppl_new_C_Polyhedron_from_space_dimension/3,
+  ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+  ppl_new_C_Polyhedron_from_constraints/2,
+  ppl_new_C_Polyhedron_from_generators/2,
+\endcode
+  These predicates will create or copy a PPL polyhedron
+  and construct a valid handle for referencing it.
+  The last argument is a Prolog term that is
+  unified with a new valid handle for accessing this polyhedron.
+
+- As soon as a PPL object is no longer required,
+  the memory occupied by it should be released
+  using the PPL predicate such as <CODE>ppl_delete_Polyhedron/1</CODE>.
+  To understand why this is important,
+  consider a Prolog program and a variable that is bound to
+  a Herbrand term.
+  When the variable dies (goes out of scope) or is uninstantiated
+  (on backtracking) the term it is bound to is amenable to garbage collection.
+  But this only applies for the standard domain of the language:
+  Herbrand terms.
+  In Prolog+PPL, when a variable bound to a handle for a PPL Polyhedron dies
+  or is uninstantiated,
+  the handle can be garbage-collected, but the polyhedra to which
+  the handle refers will not be released.
+  Once a handle has been used as an argument in
+  <CODE>ppl_delete_Polyhedron/1</CODE>,
+  it becomes invalid.
+- For a PPL object with space dimension \p k,
+  the identifiers used for the PPL variables
+  must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+  associated Cartesian axes.
+  For example, when using the predicates that combine PPL polyhedra
+  or add constraints or generators to a representation of
+  a PPL polyhedron,
+  the polyhedra referenced and any constraints or generators in the call
+  should follow all the (space) dimension-compatibility rules stated in
+  Section \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+- As explained above, a polyhedron has a fixed topology C or NNC,
+  that is determined at the time of its initialization.
+  All subsequent operations on the polyhedron must respect all the
+  topological compatibility rules stated in Section
+  \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+- Any application using the PPL should make sure that only the
+  intended version(s) of the library are ever used.
+  Predicates
+\code
+  ppl_version_major/1,
+  ppl_version_minor/1,
+  ppl_version_revision/1,
+  ppl_version_beta/1,
+  ppl_version/1,
+  ppl_banner.
+\endcode
+  allow run-time checking of information about the version being used.
+
+\anchor Predicate_Specifications
+<H2>Predicate Specifications</H2>
+
+The PPL predicates provided by the Prolog interface are specified below.
+The specification uses the following grammar rules:
+\code
+
+ Number      --> unsigned integer	ranging from 0 to an upper bound
+					depending on the actual Prolog system.
+
+ C_int       --> Number | - Number	C integer
+
+ C_unsigned  --> Number			C unsigned integer
+
+ Coefficient --> Number			used in linear expressions;
+					the upper bound will depend on how
+					the PPL has been configured
+
+ Dimension_Type
+             --> Number			used for the number of affine and
+					space dimensions and the names of
+ 					the dimensions;
+					the upper bound will depend on
+					the maximum number of dimensions
+					allowed by the PPL
+					(see ppl_max_space_dimensions/1)
+
+ Boolean     --> true | false
+
+ Handle      --> Prolog term		used to identify a Polyhedron
+
+ Topology    --> c | nnc		Polyhedral kind;
+					c is closed and nnc is NNC
+
+ VarId       --> Dimension_Type 	variable identifier
+
+ PPL_Var     --> '$VAR'(VarId)		PPL variable
+
+ Lin_Expr    --> PPL_Var		PPL variable
+            | Coefficient
+            | Lin_Expr			unary plus
+            | - Lin_Expr		unary minus
+            | Lin_Expr + Lin_Expr	addition
+            | Lin_Expr - Lin_Expr	subtraction
+            | Coefficient * Lin_Expr	multiplication
+            | Lin_Expr * Coefficient	multiplication
+
+ Relation_Symbol
+	     --> =			equals
+            | =< 			less than or equal
+            | >=			greater than or equal
+            | < 			strictly less than
+            | > 			strictly greater than
+
+ Constraint  --> Lin_Expr Relation_Symbol Lin_Expr
+					constraint
+
+ Constraint_System			list of constraints
+             --> []
+            | [Constraint | Constraint_System]
+
+ Generator_Denominator --> Coefficient	must be non-zero
+	    | Coefficient
+            | - Coefficient
+
+ Generator   --> point(Lin_Expr)	point
+            | point(Lin_Expr, Generator_Denominator)
+					point
+            | closure_point(Lin_Expr)	closure point
+            | closure_point(Lin_Expr, Generator_Denominator)
+					closure point
+            | ray(Lin_Expr)		ray
+            | line(Lin_Expr)		line
+
+ Generator_System			list of generators
+             --> []
+	    | [Generator | Generator_System]
+
+ Atom        --> Prolog atom
+
+ Universe_or_Empty			polyhedron
+             --> universe
+            | empty
+
+ Poly_Relation				polyhedron relation:
+             --> is_disjoint		with a constraint
+	    | strictly_intersects	with a constraint
+	    | is_included		with a constraint
+	    | saturates			with a constraint
+            | subsumes			with a generator
+
+ Relation_List			list of polyhedron relations
+	     --> []
+	    | [Poly_Relation | Relation_List]
+
+ Complexity  --> polynomial | simplex | any
+
+ Rational_Numerator
+	     --> Coefficient | - Coefficient
+
+ Rational_Denominator
+	     --> Coefficient		must be non-zero
+
+ Rational    --> Rational_Numerator	rational number
+	    | Rational_Numerator/Rational_Denominator
+
+ Bound       --> c(Rational)		closed rational limit
+            | o(Rational)		open rational limit
+            | o(pinf)			unbounded in the positive direction
+            | o(minf)			unbounded in the negative direction
+
+ Interval    --> i(Bound, Bound)	rational interval
+
+ Box         --> []			list of intervals
+            | [Interval | Box]
+
+ Vars_Pair   --> PPLVar - PPLVar        map relation
+
+ P_Func      --> []    			list of map relations
+            | [Vars_Pair | P_Func].
+
+ Optimization_Mode
+             --> max | min
+
+ MIP_Problem_Status
+             --> unfeasible | unbounded | optimized
+
+ Vars_List   --> []    			list of PPL variables
+            | [PPL_Var | Vars_List].
+\endcode
+
+\anchor predicate_descriptions
+<H2> Predicate Descriptions </H2>
+
+Below is a short description of many of the interface predicates.
+For full definitions of terminology used here, see the main PPL user manual.
+
+\anchor di_predicates
+<H3> Domain Independent Predicates </H3>
+
+First we describe the domain independent predicates
+that are included with all instantiations of the Prolog interfaces.
+
+<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the revision number
+  of the PPL version.
+
+<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+
+<H2><CODE> ppl_version(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with the PPL version.
+
+<H2><CODE> ppl_banner(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with
+  information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+
+  Succeeds if and only if the Coefficients in the C++ interface are bounded.
+
+<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the maximum coefficient the C++ interface can handle is
+  unified with <CODE>Max</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the minimum coefficient the C++ interface can handle is
+  unified with <CODE>Min</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+
+  Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+  this library can handle.
+
+<H2><CODE>
+  ppl_initialize
+ </CODE></H2>
+
+  Initializes the PPL interface.
+  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+
+<H2><CODE>
+  ppl_finalize
+ </CODE></H2>
+
+  Finalizes the PPL interface.
+  Once this is executed, the next call to an interface predicate must
+  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.
+
+<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+
+   Sets the atom to be thrown by timeout exceptions
+   to <CODE>Atom</CODE>.
+   The default value is <CODE>time_out</CODE>.
+
+<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+
+   The atom to be thrown by timeout exceptions
+   is unified with <CODE>Atom</CODE>.
+
+<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+
+   Computations taking exponential time will be interrupted
+   some time after <CODE>C_unsigned</CODE> ms after that call.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>C_unsigned</CODE> must be strictly greater than zero.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+
+   Resets the timeout time so that the computation is not interrupted.
+
+<BR>
+
+\anchor mip_predicates
+<H3> MIP Predicates </H3>
+Here we describe the predicates available for PPL objects
+defining mixed integer (linear) programming problems.
+
+<H2><CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region
+   the vector space of dimension <CODE>Dimension_Type</CODE>,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                      -Handle)
+</CODE></H2>
+
+   Creates an MIP Problem \f$\mathrm{MIP}\f$ with
+   the feasible region represented by <CODE>Constraint_System</CODE>,
+   objective function <CODE>Lin_Expr</CODE> and optimization mode
+   <CODE>Optimization_Mode</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.
+
+<H2><CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE></H2>
+
+   Swaps the MIP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE></H2>
+
+   Deletes the MIP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL MIP Problem.
+
+<H2><CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   MIP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, -Vars_List)
+</CODE></H2>
+
+   Unifies <CODE>Vars_List</CODE> with a list of variables representing
+   representing the integer space dimensions of the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the MIP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE></H2>
+
+   Unifies <CODE>Lin_Expr</CODE> with the objective function
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE></H2>
+
+   Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+   for the MIP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE></H2>
+
+  Resets the MIP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+
+<H2><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
+
+   Embeds the MIP problem referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+
+<H2><CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the variables in <CODE>Vars_List</CODE> are added to
+   the set of integer space dimensions.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>Constraint_System</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the objective function is changed to <CODE>Lin_Expr</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE></H2>
+
+   Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE></H2>
+
+  Succeeds if and only if the MIP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.
+
+<H2><CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE></H2>
+
+  Solves the MIP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>MIP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the MIP problem is not satisfiable;
+  <CODE>unbounded</CODE>, if the MIP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  <CODE>optimized</CODE>, if the MIP problem admits an optimal solution.
+
+<H2><CODE>
+  ppl_MIP_Problem_feasible_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with a feasible point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with an optimizing point for the MIP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+
+  Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
+  with the numerator and denominator, respectively, for the optimal value
+  for the MIP problem  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+  Evaluates the objective function of the MIP problem  referenced by
+  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+  <CODE>Coefficient_1</CODE> is unified with the numerator and
+  <CODE>Coefficient_2</CODE> is unified with the denominator of the
+  objective function value at <CODE>Generator</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE></H2>
+
+   Succeeds only if the MIP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+<BR>
+
+\anchor main_polyhedron_predicates
+<H3> Convex Polyhedron Predicates </H3>
+Here we describe the main predicates available for PPL objects
+defining convex polyhedra. A full list of the available
+PPL domains for convex polyhedra that have been instantiated
+for the Prolog interface is given in
+Section \ref Polyhedron_predicates "Polyhedron Predicate List".
+
+<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
+
+   Deletes the polyhedron referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
+
+<H2><CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates a C polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X).
+\endcode
+   creates the C polyhedron defining the 3-dimensional vector space
+   \f$\Rset^3\f$ with \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates an NNC polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$ with
+   \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as a C polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X),
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron(X, Y).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$
+   referenced by \p X
+   and then makes a copy, converting the topology to a C polyhedron.
+   with \p Y bound to a valid handle for accessing it.
+
+   When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+   care must be taken that the source polyhedron referenced by
+   <CODE>Handle_1</CODE> is topologically closed.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as an NNC polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   There must be no bounds of the form <CODE>o(Rational)</CODE>
+   in an interval in <CODE>Box</CODE>.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE> ppl_Polyhedron_swap(+Handle_1, +Handle_2) </CODE></H2>
+
+   Swaps the polyhedron referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+   The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   polyhedron referenced by
+   <CODE>Handle</CODE> is embedded with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the actual dimension of the polyhedron referenced by
+   <CODE>Handle</CODE> with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_constraints(+Handle,
+                                                   ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a minimized list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_generators(+Handle, ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_generators(+Handle,
+                                                  ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a minimized list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint,
+               ?Relation_List) </CODE></H2>
+
+Unifies <CODE>Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Constraint</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in Section
+\extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator(+Handle, +Generator,
+               ?Relation_List) </CODE></H2>
+
+Unifies <CODE>Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Generator</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in
+Section \extref{relation_with, Relation-With Operators}
+of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_get_bounding_box(+Handle,
+                                          +Complexity,
+            	                          ?Box) </CODE></H2>
+
+   Succeeds if and only if the bounding box
+   of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   unifies with the box defined by <CODE>Box</CODE>.
+   E.g.,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box).
+
+   Box = [i(o(minf), c(1/2)), i(o(0), o(pinf))].
+\endcode
+Note that the rational numbers in <CODE>Box</CODE> are in canonical form.
+E.g., the following will fail:
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box),
+      Box = [i(o(minf), c(2/4)), i(o(0), o(pinf))].
+\endcode
+
+The complexity class <CODE>Complexity</CODE> determining the algorithm
+to be used has the following meaning:
+- <CODE>polynomial</CODE> allows
+  code of the worst-case polynomial complexity class;
+- <CODE>simplex</CODE> allows
+  code of the worst-case exponential but typically polynomial
+  complexity class;
+- <CODE>any</CODE> allows
+  code of the universal complexity class.
+
+<H2><CODE> ppl_Polyhedron_is_empty(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is empty.
+
+<H2><CODE> ppl_Polyhedron_is_universe(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is the universe.
+
+<H2><CODE> ppl_Polyhedron_is_bounded(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is bounded.
+
+<H2><CODE> ppl_Polyhedron_contains_integer_point(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> contains at least one integer point.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H3><CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1,
+  			  ?Coefficient_2, ?Boolean)
+ </CODE></H3>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value and <CODE>Coefficient_2</CODE> with the denominator
+  of the supremum value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+ </CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value,
+  <CODE>Coefficient_2</CODE> with the denominator of the supremum value,
+  and <CODE>Point</CODE> with a point or closure point where
+  <CODE>Lin_Expr</CODE> reaches this value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1,
+			  ?Coefficient_2, ?Boolean)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the infimum value
+  and <CODE>Coefficient_2</CODE> with the denominator of the infimum value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the
+  infimum value, <CODE>Coefficient_2</CODE> with the denominator of
+  the infimum value, and <CODE>Point</CODE> with  a point or
+  closure point where <CODE>Lin_Expr</CODE> reaches this value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is topologically closed.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in or
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in but not
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+     </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is disjoint from
+   the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is
+   equal to the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_OK(+Handle) </CODE></H2>
+
+   Succeeds only if the polyhedron referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint(+Handle, +Constraint) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Constraint</CODE> to its constraint system.
+   Thus, the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_constraint(X, 4*A + B - 2*C >= 5).
+\endcode
+    will update the polyhedron with handle \p X to consist of
+    the set of points
+    in the vector space \f$\Rset^3\f$ satisfying the constraint
+    \f$4x + y - 2z >= 5\f$.
+
+   Note that <CODE>ppl_Polyhedron_add_constraint_and_minimize/2</CODE>
+   will fail if, after adding the constraint, the polyhedron is empty.
+
+<H2><CODE> ppl_Polyhedron_add_generator(+Handle, +Generator) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Generator</CODE> to its generator system.
+   Thus, after the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generator(X, point(-100*A - 5*B, 8)).
+\endcode
+    will update the polyhedron with handle \p X to be the single point
+    \f$(-12.5, -0.625, 0)^\transpose\f$ in the vector space \f$\Rset^3\f$.
+
+<H2><CODE> ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   | ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+        A = '$VAR'(0), B = '$VAR'(1),
+        ppl_Polyhedron_add_constraints(X, [4*A + B >= 3, A = 1]),
+        ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [4*A+1*B>=3,1*A=1] ?
+\endcode
+The updated polyhedron referenced by <CODE>Handle</CODE> can be empty
+and a query will succeed even when
+<CODE>Constraint_System</CODE> is unsatisfiable.
+
+<H2><CODE> ppl_Polyhedron_add_constraints_and_minimize(+Handle,
+                                   +Constraint_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1),
+      ppl_Polyhedron_add_constraints_and_minimize(X, [4*A + B >= 3, A = 1]),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*B>= -1,1*A=1]
+\endcode                                                                          This will fail if, after adding the constraints, the polyhedron is empty.
+   E.g., the following will fail,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      ppl_Polyhedron_add_constraints_and_minimize(X,
+        [4*A + B >= 3, A = 0, B =< 0]),
+      ppl_Polyhedron_get_constraints(X, CS).
+\endcode
+<H2><CODE> ppl_C_Polyhedron_add_generators(+Handle, +Generator_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   If the system of generators representing a polyhedron
+   is non-empty, then it must include a point
+   (see Section \extref{Generators_Representation, Generators Representation}
+    of the main PPL user manual).
+   Thus care must be taken to ensure that, before calling this
+   predicate, either the polyhedron referenced by <CODE>Handle</CODE>
+   is non-empty or that whenever <CODE>Generator_System</CODE> is
+   non-empty the first element defines a point.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators(X,
+        [point(1*A + 1*B + 1*C, 1), ray(1*A), ray(2*A)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [ray(2*A), point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_generators_and_minimize(+Handle,
+                                   +Generator_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   Unlike the predicate <CODE>ppl_add_generators</CODE>,
+   the order of the generators in
+   <CODE>Generator_System</CODE> is not important.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators_and_minimize(X,
+        [ray(1*A), ray(2*A), point(1*A + 1*B + 1*C, 1)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1,
+                     +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its intersection with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-hull with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-difference with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_image(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the affine expression
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE> to <CODE>PPL_Var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
+
+<H2><CODE> ppl_Polyhedron_bounded_affine_image(+Handle,
+               +PPL_Var,
+               +Lin_Expr_1,
+               +Lin_Expr_2,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the image with respect to the transfer relation
+   <CODE>Lin_Expr_1/Coefficient <= PPL_Var <= Lin_Expr_2/Coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image(+Handle,
+               +PPL_Var,
+               +Relation_Symbol,
+               +Lin_Expr,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>PPL_Var</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+               +Lin_Expr_1,
+               +Relation_Symbol,
+               +Lin_Expr_2) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>Lin_Expr_1</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron \f$\cP\f$ referenced by <CODE>Handle_1</CODE>
+   the time-elapse \f$ (\cP \nearrow \cQ)\f$
+   with the polyhedron \f$\cQ\f$ referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_topological_closure_assign(+Handle) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle</CODE>
+   its topological closure.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed(+Handle,
+	+Dimension_Type)
+ </CODE></H2>
+
+   Embeds the polyhedron  referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_embed(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [],
+   GS = [point(0),line(1*A),line(1*B)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Updates the polyhedron \f$\cP_1\f$ referenced  by <CODE>Handle_1</CODE>
+   by first embedding \f$\cP_1\f$ in a new space enlarged by
+   the space dimensions
+   of the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   and then adds to its system of constraints
+   a renamed-apart version of the constraints of  \f$\cP_2\f$.
+
+   E.g.,
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      D = '$VAR'(3), E = '$VAR'(4),
+      ppl_new_NNC_Polyhedron_from_constraints([A > 1, B >= 0, C >= 0], Y),
+      ppl_Polyhedron_concatenate_assign(X, Y),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*C > 1, 1*D >= 0, 1*E >= 0]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project(+Handle,
+                   +Dimension_Type)
+ </CODE></H2>
+
+   Projects the polyhedron  referenced by <CODE>Handle</CODE>
+   onto a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_project(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [1*A = 0, 1*B = 0],
+   GS = [point(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions(+Handle,
+               +List_of_PPL_Vars) </CODE></H2>
+
+   Removes the space dimensions given by the identifiers of the
+   PPL variables in list <CODE>List_of_PPL_Vars</CODE>
+   from the polyhedron  referenced by <CODE>Handle</CODE>.
+   The identifiers for the remaining PPL variables are renumbered so that
+   they are consecutive and the maximum index is less than the number
+   of dimensions.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_remove_space_dimensions(X, [B]),
+      ppl_Polyhedron_space_dimension(X, K),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   K = 2,
+   GS = [point(0),line(1*A),line(1*B),line(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type) </CODE></H2>
+
+   Projects the polyhedron  referenced to by <CODE>Handle</CODE>
+   onto  the first <CODE>Dimension_Type</CODE> dimension.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(5, empty, X),
+      ppl_Polyhedron_remove_higher_space_dimensions(X, 3),
+      ppl_Polyhedron_space_dimension(X, K).
+\endcode
+
+<H2><CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)
+</CODE></H2>
+
+   <CODE>Dimension_Type</CODE> copies of the space dimension referenced by
+   <CODE>PPL_Var</CODE> are added to the polyhedron
+   referenced to by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)
+</CODE></H2>
+
+   The space dimensions referenced by the PPL variables in list
+   <CODE>List_of_PPL_Vars</CODE> are folded into the dimension referenced
+   by <CODE>PPL_Var</CODE> and removed.
+   The result is undefined if <CODE>List_of_PPL_Vars</CODE>
+   does not have the properties described in Section
+   \extref{fold_space_dimensions, Folding Multiple Dimensions of the Vector Space into One Dimension}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func) </CODE></H2>
+
+   Maps the space dimensions of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   using the partial function defined by <CODE>P_Func</CODE>.
+   The result is undefined if \p P_Func does not encode a partial
+   function with the properties described in
+   Section \extref{Mapping_the_Dimensions_of_the_Vector_Space, Mapping the Dimensions of the Vector Space}
+   of the main PPL user manual.
+
diff --git a/interfaces/Prolog/tests/Makefile.am b/interfaces/Prolog/tests/Makefile.am
index 6522380..374b4e1 100644
--- a/interfaces/Prolog/tests/Makefile.am
+++ b/interfaces/Prolog/tests/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,6 +39,7 @@ clpq.pl script_clpq \
 clpq2.pl script_clpq2 script_clpq2_int8 \
 $(CLPQ_TESTS) \
 pl_check.pl \
+pl_grid_check.pl \
 expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
 expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
 expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
@@ -48,4 +49,44 @@ expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
 expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
 expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
 expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
-expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a \
+ppl_predicate_check_common.pl \
+ppl_interface_generator_predicate_check_pl.m4 \
+ppl_interface_generator_predicate_check_code.m4
+
+
+all_predicate_check_sources = \
+$(fixed_predicate_check_sources) \
+$(required_instantiations_predicate_check_sources)
+
+if BUILD_SOME_PROLOG_INTERFACES
+
+check-local: ppl_predicate_check_main.pl
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_predicate_check_pl.m4 \
+ppl_interface_generator_predicate_check_code.m4
+
+ppl_predicate_check_main.pl: $(interface_generator_dependencies)
+	m4 --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_predicate_check_pl.m4 \
+			> predicate_check_all
+	$(top_srcdir)/utils/cm_cleaner.sh < predicate_check_all
+	$(top_srcdir)/utils/cm_splitter.sh < predicate_check_all
+	rm -f predicate_check_all
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+CLEANFILES = \
+ppl_predicate_check_*.pl
+
+DISTCLEANFILES = \
+ppl_predicate_check_*.pl
diff --git a/interfaces/Prolog/tests/Makefile.in b/interfaces/Prolog/tests/Makefile.in
index 0a111d0..d302efb 100644
--- a/interfaces/Prolog/tests/Makefile.in
+++ b/interfaces/Prolog/tests/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -60,7 +56,8 @@ host_triplet = @host@
 subdir = interfaces/Prolog/tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -70,8 +67,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -82,39 +89,18 @@ SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -124,53 +110,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -179,56 +163,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -240,10 +198,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -252,24 +214,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 CLPQ_TESTS_NONSTRICT = \
 ack.clpq \
@@ -289,6 +269,7 @@ clpq.pl script_clpq \
 clpq2.pl script_clpq2 script_clpq2_int8 \
 $(CLPQ_TESTS) \
 pl_check.pl \
+pl_grid_check.pl \
 expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
 expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
 expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
@@ -298,7 +279,31 @@ expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
 expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
 expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
 expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
-expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a \
+ppl_predicate_check_common.pl \
+ppl_interface_generator_predicate_check_pl.m4 \
+ppl_interface_generator_predicate_check_code.m4
+
+all_predicate_check_sources = \
+$(fixed_predicate_check_sources) \
+$(required_instantiations_predicate_check_sources)
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@interface_generator_dependencies = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../../ppl_interface_generator_common.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../../ppl_interface_generator_copyright \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_predicate_check_pl.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_interface_generator_predicate_check_code.m4
+
+CLEANFILES = \
+ppl_predicate_check_*.pl
+
+DISTCLEANFILES = \
+ppl_predicate_check_*.pl
 
 all: all-am
 
@@ -338,10 +343,6 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 tags: TAGS
 TAGS:
 
@@ -350,22 +351,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -376,7 +376,9 @@ distdir: $(DISTFILES)
 	    || exit 1; \
 	  fi; \
 	done
+ at BUILD_SOME_PROLOG_INTERFACES_FALSE@check-local:
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
 check: check-am
 all-am: Makefile
 installdirs:
@@ -397,9 +399,11 @@ install-strip:
 mostlyclean-generic:
 
 clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -410,7 +414,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -424,12 +428,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -448,18 +460,33 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
-
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am check-local clean clean-generic \
+	clean-libtool distclean distclean-generic distclean-libtool \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am
+
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@check-local: ppl_predicate_check_main.pl
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl_predicate_check_main.pl: $(interface_generator_dependencies)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	m4 --prefix-builtin -I../.. \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@		$(srcdir)/ppl_interface_generator_predicate_check_pl.m4 \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@			> predicate_check_all
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_cleaner.sh < predicate_check_all
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(top_srcdir)/utils/cm_splitter.sh < predicate_check_all
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -f predicate_check_all
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/interfaces/Prolog/tests/clpq.pl b/interfaces/Prolog/tests/clpq.pl
index ed75fea..f056243 100644
--- a/interfaces/Prolog/tests/clpq.pl
+++ b/interfaces/Prolog/tests/clpq.pl
@@ -1,13 +1,13 @@
 % A toy, non-ground meta-interpreter for CLP(Q)
 % for testing the Parma Polyhedra Library and its Prolog interface.
 %
-% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 %
 % This file is part of the Parma Polyhedra Library (PPL).
 %
 % The PPL 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
+% Free Software Foundation; either version 3 of the License, or (at your
 % option) any later version.
 %
 % The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -791,7 +791,7 @@ POSSIBILITY OF SUCH DAMAGES.\n').
 
 common_main :-
   write('\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>\n\
 this program is free software, covered by the GNU General Public License,\n\
 and you are welcome to change it and/or distribute copies of it\n\
 under certain conditions.\n\
diff --git a/interfaces/Prolog/tests/clpq2.pl b/interfaces/Prolog/tests/clpq2.pl
index 5853afe..deb74c3 100644
--- a/interfaces/Prolog/tests/clpq2.pl
+++ b/interfaces/Prolog/tests/clpq2.pl
@@ -1,13 +1,13 @@
 % A toy, non-ground meta-interpreter for CLP(Q)
 % for testing the Parma Polyhedra Library and its Prolog interface.
 %
-% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 %
 % This file is part of the Parma Polyhedra Library (PPL).
 %
 % The PPL 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
+% Free Software Foundation; either version 3 of the License, or (at your
 % option) any later version.
 %
 % The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -435,10 +435,10 @@ do_command(consult(Program), _VN) :-
   !,
   (read_program(Program) ; true),
   main_loop_yes.
-do_command(reconsult(Program), _VN) :-
+do_command(reconsult(Program), VN) :-
   !,
   clear_program,
-  do_command(consult(Program), _VN).
+  do_command(consult(Program), VN).
 do_command(listing, _VN) :-
   !,
   list_program,
@@ -592,7 +592,9 @@ write_termexpr('$VAR'(N), Var_List) :-
 write_termexpr(Term, _Var_List) :-
   int_expr(Term),
   !,
-  N is Term,
+  % FIXME: restore the original `N is Term' as soon as XSB is fixed.
+  % See http://www.cs.unipr.it/pipermail/ppl-devel/2007-September/011126.html
+  call(N is Term),
   write(N).
 write_termexpr(Term, Var_List) :-
   Term = [_|_],
@@ -1109,7 +1111,7 @@ POSSIBILITY OF SUCH DAMAGES.\n').
 
 common_main :-
   write('\
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>\n\
 this program is free software, covered by the GNU General Public License,\n\
 and you are welcome to change it and/or distribute copies of it\n\
 under certain conditions.\n\
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16 b/interfaces/Prolog/tests/expected_clpq2_int16
index 0229065..9931931 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int16
+++ b/interfaces/Prolog/tests/expected_clpq2_int16
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16_a b/interfaces/Prolog/tests/expected_clpq2_int16_a
index 0d41bf6..d88be80 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int16_a
+++ b/interfaces/Prolog/tests/expected_clpq2_int16_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32 b/interfaces/Prolog/tests/expected_clpq2_int32
index d095df4..3ac88d3 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int32
+++ b/interfaces/Prolog/tests/expected_clpq2_int32
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32_a b/interfaces/Prolog/tests/expected_clpq2_int32_a
index 61d3188..a54d6a6 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int32_a
+++ b/interfaces/Prolog/tests/expected_clpq2_int32_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64 b/interfaces/Prolog/tests/expected_clpq2_int64
index d095df4..3ac88d3 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int64
+++ b/interfaces/Prolog/tests/expected_clpq2_int64
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64_a b/interfaces/Prolog/tests/expected_clpq2_int64_a
index d095df4..3ac88d3 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int64_a
+++ b/interfaces/Prolog/tests/expected_clpq2_int64_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8 b/interfaces/Prolog/tests/expected_clpq2_int8
index f16bdf1..ec68bcc 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int8
+++ b/interfaces/Prolog/tests/expected_clpq2_int8
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8_a b/interfaces/Prolog/tests/expected_clpq2_int8_a
index f16bdf1..ec68bcc 100644
--- a/interfaces/Prolog/tests/expected_clpq2_int8_a
+++ b/interfaces/Prolog/tests/expected_clpq2_int8_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz b/interfaces/Prolog/tests/expected_clpq2_mpz
index d095df4..3ac88d3 100644
--- a/interfaces/Prolog/tests/expected_clpq2_mpz
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz_a b/interfaces/Prolog/tests/expected_clpq2_mpz_a
index d095df4..3ac88d3 100644
--- a/interfaces/Prolog/tests/expected_clpq2_mpz_a
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int16 b/interfaces/Prolog/tests/expected_clpq_int16
index 3578056..daab152 100644
--- a/interfaces/Prolog/tests/expected_clpq_int16
+++ b/interfaces/Prolog/tests/expected_clpq_int16
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int16_a b/interfaces/Prolog/tests/expected_clpq_int16_a
index 3578056..daab152 100644
--- a/interfaces/Prolog/tests/expected_clpq_int16_a
+++ b/interfaces/Prolog/tests/expected_clpq_int16_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int32 b/interfaces/Prolog/tests/expected_clpq_int32
index 31d77fe..13dd03f 100644
--- a/interfaces/Prolog/tests/expected_clpq_int32
+++ b/interfaces/Prolog/tests/expected_clpq_int32
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int32_a b/interfaces/Prolog/tests/expected_clpq_int32_a
index 31d77fe..13dd03f 100644
--- a/interfaces/Prolog/tests/expected_clpq_int32_a
+++ b/interfaces/Prolog/tests/expected_clpq_int32_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int64 b/interfaces/Prolog/tests/expected_clpq_int64
index 31d77fe..13dd03f 100644
--- a/interfaces/Prolog/tests/expected_clpq_int64
+++ b/interfaces/Prolog/tests/expected_clpq_int64
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int64_a b/interfaces/Prolog/tests/expected_clpq_int64_a
index 31d77fe..13dd03f 100644
--- a/interfaces/Prolog/tests/expected_clpq_int64_a
+++ b/interfaces/Prolog/tests/expected_clpq_int64_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int8 b/interfaces/Prolog/tests/expected_clpq_int8
index 3c3c0b3..f4d93ed 100644
--- a/interfaces/Prolog/tests/expected_clpq_int8
+++ b/interfaces/Prolog/tests/expected_clpq_int8
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_int8_a b/interfaces/Prolog/tests/expected_clpq_int8_a
index 3c3c0b3..f4d93ed 100644
--- a/interfaces/Prolog/tests/expected_clpq_int8_a
+++ b/interfaces/Prolog/tests/expected_clpq_int8_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz b/interfaces/Prolog/tests/expected_clpq_mpz
index 31d77fe..13dd03f 100644
--- a/interfaces/Prolog/tests/expected_clpq_mpz
+++ b/interfaces/Prolog/tests/expected_clpq_mpz
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz_a b/interfaces/Prolog/tests/expected_clpq_mpz_a
index 31d77fe..13dd03f 100644
--- a/interfaces/Prolog/tests/expected_clpq_mpz_a
+++ b/interfaces/Prolog/tests/expected_clpq_mpz_a
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 this program is free software, covered by the GNU General Public License,
 and you are welcome to change it and/or distribute copies of it
 under certain conditions.
diff --git a/interfaces/Prolog/tests/expected_pchk_int8 b/interfaces/Prolog/tests/expected_pchk_int8
index b19de5d..2b69853 100644
--- a/interfaces/Prolog/tests/expected_pchk_int8
+++ b/interfaces/Prolog/tests/expected_pchk_int8
@@ -1,8 +1,6 @@
 
 Error: an overflow has been detected by the PPL: Negative overflow.
 
-Error: an overflow has been detected by the PPL: Positive overflow.
-
 Error: an overflow has been detected by the PPL: Negative overflow.
 
 Error: an overflow has been detected by the PPL: Negative overflow.
diff --git a/interfaces/Prolog/tests/expected_pchk_int8_a b/interfaces/Prolog/tests/expected_pchk_int8_a
index f6b1402..b18723e 100644
--- a/interfaces/Prolog/tests/expected_pchk_int8_a
+++ b/interfaces/Prolog/tests/expected_pchk_int8_a
@@ -3,7 +3,5 @@ Error: an overflow has been detected by the PPL: Negative overflow.
 
 Error: an overflow has been detected by the PPL: Positive overflow.
 
-Error: an overflow has been detected by the PPL: Positive overflow.
-
 Error: an overflow has been detected by the PPL: Negative overflow.
 OK
diff --git a/interfaces/Prolog/tests/pl_check.pl b/interfaces/Prolog/tests/pl_check.pl
index 99ba081..907d674 100644
--- a/interfaces/Prolog/tests/pl_check.pl
+++ b/interfaces/Prolog/tests/pl_check.pl
@@ -1,11 +1,11 @@
 /* Various tests on the Prolog interface.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -33,27 +33,29 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 :- dynamic(noisy/1).
 
-% check_all
+% check_all/0
 % This executes all the test predicates which, together, check all
 % the ppl interface predicates.
 
 check_all :-
-   (noisy(_) -> true; make_quiet),
+   (noisy(_) -> true ; make_quiet),
    list_groups(Groups),
    catch(run_all(Groups), Exception,
-       (print_exception_term(Exception), fail)).
+         (print_exception_term(Exception), fail)).
 
-% check_quiet
-% This alo executes all the test predicates with no output.
+% check_quiet/0
+% This also executes all the test predicates with no output.
 
 check_quiet :-
    make_quiet,
    check_all.
 
-% check_noisy
-% This alo executes all the test predicates but also prints some messages
-% including the banner, version numbers and expected output from
-% the exception tests.
+% check_noisy/0
+% check_extra_noisy/0
+%
+% These also execute all the test predicates but also outputs
+% information including the banner, version numbers and expected
+% output from the exception tests.
 
 check_noisy :-
    make_noisy,
@@ -63,45 +65,53 @@ check_extra_noisy :-
    make_extra_noisy,
    check_all.
 
+% run_all/1
+% This executes all the given list of tests, catching any exceptions.
+% If any test fails then an error message is output and then it fails.
+
 run_all([Group|Groups]):-
    ppl_initialize,
-   (catch(run_one(Group), Exception,
-         run_exception(Group, Exception)) -> true ; run_fail(Group)),
-   !,
-   ppl_finalize,
-   run_all(Groups).
-
+   (catch(run_one(Group), Exception, run_exception(Group, Exception)) ->
+       ppl_finalize,
+       run_all(Groups)
+   ;
+       run_fail(Group)
+   ).
 run_all([]).
 
-run_all([_|_]) :-
-   error_message(['Prolog interface checks failed.']),
-   !,
-   ppl_finalize,
-   fail.
+% run_fail/1
+% This is used when a test in run_all/1 fails.
+% A message is output saying which group of tests has failed;
+% then it finalizes the ppl and fails.
 
 run_fail(Group) :-
    group_predicates(Group, Predicates),
    error_message(['Error occurred while performing test', Group,
-              'which checks predicates:', nl, Predicates]),
-   !,
+                  'which checks predicates:', also, Predicates]),
+   error_message(['Prolog interface checks failed.']),
    ppl_finalize,
    fail.
 
-run_exception(Group, ppl_overflow_error(Cause)) :-
-   !,
-   group_predicates(Group, Predicates),
-   display_message(
-            ['Overflow exception occurred while performing test ', Group,
-              'which checks predicates ', nl, Predicates]),
-   print_exception_term(ppl_overflow_error(Cause)).
+% run_exception/2
+% This is used when a test in run_all/1 causes an exception to be thrown.
+% A message is output saying which group of tests was being run when
+% the exception was thrown and then it fails.
 
 run_exception(Group, Exception) :-
-   group_predicates(Group, Predicates),
-   display_message(
-            ['Exception occurred while performing test ', Group,
-              'which checks predicates ', nl, Predicates]),
-   print_exception_term(Exception),
-   fail.
+	group_predicates(Group, Predicates),
+	(Exception = ppl_overflow_error(_) ->
+	    Kind = 'Overflow exception'
+	;
+	    Kind = 'Exception'
+	),
+ 	display_message([Kind, 'occurred while performing test ', Group,
+			 'which checks predicates ', nl, Predicates]),
+	print_exception_term(Exception),
+	% Do fail for all but overflow exceptions.
+	Exception = ppl_overflow_error(_).
+
+% run_one/1
+% Runs the named group of tests.
 
 % Tests predicates that return PPL version information and the PPL banner.
 % If noisy(0) holds, there is no output but if not,
@@ -127,7 +137,7 @@ run_one(all_versions_and_banner) :-
   ).
 
 % Tests predicates that return the maximum allowed dimension and coefficients.
-% If noisy(0) holds, there is no output but if not, the maximums/miniumums
+% If noisy(0) holds, there is no output but if not, the maximums/minimums
 % are printed.
 run_one(numeric_bounds) :-
   max_dimension,
@@ -149,7 +159,10 @@ run_one(swap_polyhedra) :-
 
 run_one(polyhedron_dimension) :-
    space,
-   affine_dim.
+   affine_dim,
+   constrains,
+   unconstrain_space_dimension,
+   unconstrain_space_dimensions.
 
 run_one(basic_operators) :-
    inters_assign,
@@ -236,9 +249,10 @@ run_one(polyhedron_boxes) :-
 run_one(catch_time) :-
    time_out.
 
-run_one(lp_problem) :-
-   lp_problem.
+run_one(mip_problem) :-
+   mip_problem.
 
+% Checks how the PPL Prolog system performs with large integers
 % XSB has problems with large numbers - hence tests for XSB disallowed.
 % We catch the exception if it is caused by integer overflow in C++
 % and suppress output as this is expected when C++ uses checked_integers.
@@ -251,6 +265,7 @@ run_one(large_integers) :-
      true
    ).
 
+% Checks the handling of exceptions.
 run_one(handle_exceptions) :-
    exceptions.
 
@@ -267,7 +282,7 @@ max_dimension :-
 % ppl_Coefficient_max/1, ppl_Coefficient_min/1.
 % But it has to catch the case when the numeric bounds in the
 % prolog system are smaller than any finite bounds in C++
-% As the test does not know the configuartion, all that can be tested
+% As the test does not know the configuration, all that can be tested
 % here is that the results are consistent and the bounds are
 % in a list of possible bounds.
 
@@ -549,6 +564,52 @@ affine_dim(T) :-
   ppl_delete_Polyhedron(P3),
   ppl_delete_Polyhedron(P4).
 
+% Tests ppl_Polyhedron_constrains/2.
+constrains :-
+  constrains(c), constrains(nnc).
+
+constrains(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+  ppl_Polyhedron_constrains(P, B),
+  \+ppl_Polyhedron_constrains(P, A),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_unconstrain_space_dimension/2.
+unconstrain_space_dimension :-
+  unconstrain_space_dimension(c), unconstrain_space_dimension(nnc).
+
+unconstrain_space_dimension(T) :-
+  make_vars(3, [_A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+  ppl_Polyhedron_unconstrain_space_dimension(P, B),
+  \+ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_unconstrain_space_dimensions/2.
+unconstrain_space_dimensions :-
+  unconstrain_space_dimensions(c), unconstrain_space_dimensions(nnc).
+
+unconstrain_space_dimensions(T) :-
+  make_vars(3, [_A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+  ppl_Polyhedron_unconstrain_space_dimensions(P, []),
+  ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_unconstrain_space_dimensions(P, [B]),
+  \+ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_unconstrain_space_dimensions(P, [B]),
+  \+ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P).
+
 %%%%%%%%%%%%%%%% Basic Operators %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 % Tests ppl_Polyhedron_intersection_assign/2.
@@ -1793,7 +1854,8 @@ rel_gens(T, GS, [A, _, _]) :-
 %  tests ppl_Polyhedron_is_universe/1,
 %        ppl_Polyhedron_is_empty/1,
 %        ppl_Polyhedron_is_bounded/1,
-%        ppl_Polyhedron_is_topologically_closed/1.
+%        ppl_Polyhedron_is_topologically_closed/1,
+%        ppl_Polyhedron_contains_integer_point/2.
 checks :-
   checks(c), checks(nnc).
 
@@ -1805,15 +1867,22 @@ checks(T) :-
   ppl_Polyhedron_is_empty(P1),
   \+ppl_Polyhedron_is_universe(P1),
   \+ppl_Polyhedron_is_empty(P),
+  \+ppl_Polyhedron_contains_integer_point(P1),
+  ppl_Polyhedron_contains_integer_point(P),
+  ppl_Polyhedron_add_generators(P1, [point(A + B + C, 2)]),
+  \+ppl_Polyhedron_contains_integer_point(P1),
   ppl_Polyhedron_add_generators(P1, [point(A + B + C)]),
   ppl_Polyhedron_is_bounded(P1),
+  ppl_Polyhedron_contains_integer_point(P1),
   ppl_Polyhedron_add_generators(P1, [ray(A + B + C)]),
   \+ ppl_Polyhedron_is_bounded(P1),
   ppl_Polyhedron_add_constraints(P, [A >= 1, B =< 3, A =< 2]),
+  ppl_Polyhedron_contains_integer_point(P),
   ppl_Polyhedron_is_topologically_closed(P),
    (T = nnc ->
      (ppl_Polyhedron_add_constraints(P, [A > 1, B =< 3, A =< 2]),
       \+ ppl_Polyhedron_is_topologically_closed(P),
+      ppl_Polyhedron_contains_integer_point(P),
       ppl_Polyhedron_add_constraints(P, [A > 2]),
       ppl_Polyhedron_is_topologically_closed(P))
    ; true
@@ -1916,12 +1985,12 @@ get_bounding_box:-
   get_bounding_box(c, [B >= 0, 4*A =< 2],
                      [i(o(minf), c(1/2)), i(c(0), o(pinf))]),
   get_bounding_box(c, [], [i(o(minf), o(pinf)), i(o(minf), o(pinf))]),
-  get_bounding_box(c, [1=0], [empty, empty]),
+  get_bounding_box(c, [1=0], [empty]),
   get_bounding_box(c, [A =< 4, B =< 4, 3*A + B >= 2],
                      [i(c(-2/3), c(4)), i(c(-10), c(4))]),
   get_bounding_box(nnc, [B > 0, 4*A =< 2],
                      [i(o(minf), c(1/2)), i(o(0), o(pinf))]),
-  get_bounding_box(nnc,[A > 1, B > 1, A < 1, B < 1], [empty, empty]),
+  get_bounding_box(nnc,[A > 1, B > 1, A < 1, B < 1], [empty]),
   get_bounding_box(nnc, [A =< 4, B =< 4, 3*A + B > 2],
                      [i(o(-2/3), c(4)), i(o(-10), c(4))]).
 
@@ -1935,9 +2004,16 @@ get_bounding_box(T, CS, Box) :-
   clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P1),
   clean_ppl_new_Polyhedron_from_bounding_box(T, Box1, P2),
   clean_ppl_new_Polyhedron_from_bounding_box(T, Box2, P3),
-  ppl_Polyhedron_contains_Polyhedron(P1, P),
-  ppl_Polyhedron_contains_Polyhedron(P2, P1),
-  ppl_Polyhedron_contains_Polyhedron(P3, P1),
+  (Box \== [empty]
+  ->
+    ppl_Polyhedron_contains_Polyhedron(P1, P),
+    ppl_Polyhedron_contains_Polyhedron(P2, P1),
+    ppl_Polyhedron_contains_Polyhedron(P3, P1)
+   ;
+    ppl_Polyhedron_is_empty(P1),
+    ppl_Polyhedron_is_empty(P2),
+    ppl_Polyhedron_is_empty(P3)
+  ),
   !,
   ppl_delete_Polyhedron(P),
   ppl_delete_Polyhedron(P1),
@@ -2107,8 +2183,7 @@ time_out(T) :-
   ppl_set_timeout_exception_atom(time_out),
   !,
   ppl_delete_Polyhedron(P1),
-  ppl_delete_Polyhedron(Q1),
-  ppl_finalize.
+  ppl_delete_Polyhedron(Q1).
 
 % time_watch(+Topology, +Goal, +No_Time_Out, +Time_Out)
 % time_watch/4 makes a copy of Goal with a copy of the polyhedron
@@ -2136,41 +2211,27 @@ time_watch(Topology, Goal, No_Time_Out, Time_Out) :-
    !,
    ppl_delete_Polyhedron(Polyhedron_Copy).
 
-%%%%%%%%%%%%%%%%% LP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-lp_problem :-
-  lp_trivial,
-  lp_from_cons,
-  lp_from_lp,
-  lp_swap,
-  lp_get,
-  lp_clear,
-  lp_satisfiable,
-  lp_set,
-  lp_solve,
-  lp_eval.
-
-lp_trivial :-
-  clean_ppl_new_LP_Problem_trivial(LP),
-  ppl_LP_Problem_space_dimension(LP, 0),
-  ppl_LP_Problem_objective_function(LP, Obj),
-  compare_lin_expressions(Obj, 0),
-  ppl_LP_Problem_optimization_mode(LP, max),
-  ppl_LP_Problem_constraints(LP, CS),
-  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
-  ppl_Polyhedron_is_universe(PH),
-  !,
-  ppl_delete_Polyhedron(PH),
-  ppl_delete_LP_Problem(LP).
+%%%%%%%%%%%%%%%%% MIP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-lp_from_cons :-
+mip_problem :-
+  mip_from_cons,
+  mip_from_mip,
+  mip_swap,
+  mip_get,
+  mip_clear,
+  mip_satisfiable,
+  mip_set,
+  mip_solve,
+  mip_eval.
+
+mip_from_cons :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
-  ppl_LP_Problem_space_dimension(LP, 3),
-  ppl_LP_Problem_constraints(LP, CS),
-  ppl_LP_Problem_objective_function(LP, Obj),
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+  ppl_MIP_Problem_space_dimension(MIP, 3),
+  ppl_MIP_Problem_constraints(MIP, CS),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
   compare_lin_expressions(Obj, C),
-  ppl_LP_Problem_optimization_mode(LP, max),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
   clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
   clean_ppl_new_Polyhedron_from_constraints(c,
        [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
@@ -2178,33 +2239,35 @@ lp_from_cons :-
   !,
   ppl_delete_Polyhedron(PH),
   ppl_delete_Polyhedron(Expect_PH),
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP).
 
-lp_from_lp :-
+mip_from_mip :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP1),
-  clean_ppl_new_LP_Problem_from_LP_Problem(LP1, LP),
-  ppl_LP_Problem_objective_function(LP, Obj),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP1),
+  clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
   compare_lin_expressions(Obj, C),
-  ppl_LP_Problem_optimization_mode(LP, max),
-  ppl_LP_Problem_constraints(LP, CS),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  ppl_MIP_Problem_constraints(MIP, CS),
   clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
-  ppl_LP_Problem_constraints(LP1, Expect_CS),
+  ppl_MIP_Problem_constraints(MIP1, Expect_CS),
   clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
   ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
   !,
   ppl_delete_Polyhedron(PH),
   ppl_delete_Polyhedron(Expect_PH),
-  ppl_delete_LP_Problem(LP1),
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP1),
+  ppl_delete_MIP_Problem(MIP).
 
-lp_swap :-
+mip_swap :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem_trivial(LP),
-  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP1),
-  ppl_LP_Problem_swap(LP, LP1),
-  ppl_LP_Problem_constraints(LP, CS),
-  ppl_LP_Problem_constraints(LP1, CS1),
+  clean_ppl_new_MIP_Problem(0, [], 0, max, MIP),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP1),
+  ppl_MIP_Problem_swap(MIP, MIP1),
+  ppl_MIP_Problem_constraints(MIP, CS),
+  ppl_MIP_Problem_constraints(MIP1, CS1),
   clean_ppl_new_Polyhedron_from_constraints(c, CS1, PH1),
   ppl_Polyhedron_is_universe(PH1),
   clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
@@ -2215,126 +2278,140 @@ lp_swap :-
   ppl_delete_Polyhedron(PH),
   ppl_delete_Polyhedron(PH1),
   ppl_delete_Polyhedron(Expect_PH),
-  ppl_delete_LP_Problem(LP1),
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP1),
+  ppl_delete_MIP_Problem(MIP).
 
-lp_get :-
+mip_get :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
-  ppl_LP_Problem_constraints(LP, CS),
+
+  ppl_new_MIP_Problem(3, [], A + 3, min, MIP0),
+  ppl_MIP_Problem_objective_function(MIP0, Obj0),
+  compare_lin_expressions(Obj0, A + 3),
+
+  ppl_new_MIP_Problem(3, [], 3, min, MIP1),
+  ppl_MIP_Problem_objective_function(MIP1, Obj1),
+  compare_lin_expressions(Obj1, 3),
+
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+  ppl_MIP_Problem_constraints(MIP, CS),
   clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
   clean_ppl_new_Polyhedron_from_constraints(c,
        [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
   ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
-  ppl_LP_Problem_objective_function(LP, Obj),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
   compare_lin_expressions(Obj, C),
-  ppl_LP_Problem_optimization_mode(LP, Opt),
+  ppl_MIP_Problem_optimization_mode(MIP, Opt),
   Opt = max,
   !,
   ppl_delete_Polyhedron(PH),
   ppl_delete_Polyhedron(Expect_PH),
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP0),
+  ppl_delete_MIP_Problem(MIP1),
+  ppl_delete_MIP_Problem(MIP).
 
-lp_clear :-
+mip_clear :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, min, LP),
-  ppl_LP_Problem_clear(LP),
-  ppl_LP_Problem_space_dimension(LP, D),
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, min, MIP),
+  ppl_MIP_Problem_clear(MIP),
+  ppl_MIP_Problem_space_dimension(MIP, D),
   D == 0,
-  ppl_LP_Problem_constraints(LP, CS),
+  ppl_MIP_Problem_constraints(MIP, CS),
   clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
   ppl_Polyhedron_is_universe(PH),
-  ppl_LP_Problem_objective_function(LP, Obj),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
   compare_lin_expressions(Obj, 0),
-  ppl_LP_Problem_optimization_mode(LP, Opt),
+  ppl_MIP_Problem_optimization_mode(MIP, Opt),
   Opt == max,
   !,
   ppl_delete_Polyhedron(PH),
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP).
 
-lp_satisfiable :-
+mip_satisfiable :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
-  ppl_LP_Problem_is_satisfiable(LP),
-  ppl_LP_Problem_add_constraint(LP, A + B =< 0),
-  \+ ppl_LP_Problem_is_satisfiable(LP),
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+  ppl_MIP_Problem_is_satisfiable(MIP),
+  ppl_MIP_Problem_add_constraint(MIP, A + B =< 0),
+  \+ ppl_MIP_Problem_is_satisfiable(MIP),
   !,
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP).
 
-lp_add :-
+mip_add :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem_trivial(LP),
-  ppl_LP_Problem_add_constraint(LP, A >= 0),
-  ppl_LP_Problem_add_constraints(LP, [A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
-  clean_ppl_new_LP_Problem([A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5],
-      2*B-C, max, LP1),
-  ppl_LP_Problem_solve(LP, Status),
-  ppl_LP_Problem_solve(LP1, Status),
-  ppl_LP_Problem_optimal_value(LP, N, D),
-  ppl_LP_Problem_optimal_value(LP1, N, D),
-  ppl_LP_Problem_constraints(LP, CS),
+  clean_ppl_new_MIP_Problem_from_space_dimension(0, MIP),
+  ppl_MIP_Problem_add_space_dimensions_and_embed(MIP, 1),
+  ppl_MIP_Problem_add_constraint(MIP, A >= 0),
+  ppl_MIP_Problem_add_space_dimensions_and_embed(MIP, 2),
+  ppl_MIP_Problem_add_constraints(
+    MIP,[A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 2*B-C, max, MIP1),
+  ppl_MIP_Problem_solve(MIP, Status),
+  ppl_MIP_Problem_solve(MIP1, Status),
+  ppl_MIP_Problem_optimal_value(MIP, N, D),
+  ppl_MIP_Problem_optimal_value(MIP1, N, D),
+  ppl_MIP_Problem_constraints(MIP, CS),
   clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
-  ppl_LP_Problem_constraints(LP1, Expect_CS),
+  ppl_MIP_Problem_constraints(MIP1, Expect_CS),
   clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
   ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
   !,
   ppl_delete_Polyhedron(PH),
   ppl_delete_Polyhedron(Expect_PH),
-  ppl_delete_LP_Problem(LP),
-  ppl_delete_LP_Problem(LP1).
+  ppl_delete_MIP_Problem(MIP),
+  ppl_delete_MIP_Problem(MIP1).
 
-lp_set :-
+mip_set :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem(
-    [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, LP),
-  ppl_LP_Problem_objective_function(LP, 0),
-  ppl_LP_Problem_optimization_mode(LP, max),
-  ppl_LP_Problem_set_objective_function(LP, 2*B-C),
-  ppl_LP_Problem_set_optimization_mode(LP, min),
-  ppl_LP_Problem_objective_function(LP, Obj),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, MIP),
+  ppl_MIP_Problem_objective_function(MIP, 0),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  ppl_MIP_Problem_set_objective_function(MIP, 2*B-C),
+  ppl_MIP_Problem_set_optimization_mode(MIP, min),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
   compare_lin_expressions(Obj, 2*B-C),
-  ppl_LP_Problem_optimization_mode(LP, min),
-  ppl_LP_Problem_solve(LP, optimized),
+  ppl_MIP_Problem_optimization_mode(MIP, min),
+  ppl_MIP_Problem_solve(MIP, optimized),
   !,
-  ppl_delete_LP_Problem(LP).
+  ppl_delete_MIP_Problem(MIP).
 
-lp_solve :-
+mip_solve :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem(
-    [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, LP),
-  ppl_LP_Problem_objective_function(LP, 0),
-  ppl_LP_Problem_optimization_mode(LP, max),
-  ppl_LP_Problem_set_objective_function(LP, 2*B-C),
-  ppl_LP_Problem_set_optimization_mode(LP, min),
-  ppl_LP_Problem_solve(LP, optimized),
-  ppl_LP_Problem_set_objective_function(LP, C),
-  ppl_LP_Problem_solve(LP, unbounded),
-  ppl_LP_Problem_add_constraint(LP, B = 0),
-  ppl_LP_Problem_solve(LP, unfeasible),
-  \+ppl_LP_Problem_solve(LP, invalid_status),
-  !,
-  ppl_delete_LP_Problem(LP).
-
-lp_eval :-
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, MIP),
+  ppl_MIP_Problem_objective_function(MIP, 0),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  ppl_MIP_Problem_set_objective_function(MIP, 2*B-C),
+  ppl_MIP_Problem_set_optimization_mode(MIP, min),
+  ppl_MIP_Problem_solve(MIP, optimized),
+  ppl_MIP_Problem_set_objective_function(MIP, C),
+  ppl_MIP_Problem_solve(MIP, unbounded),
+  ppl_MIP_Problem_add_constraint(MIP, B = 0),
+  ppl_MIP_Problem_solve(MIP, unfeasible),
+  \+ppl_MIP_Problem_solve(MIP, invalid_status),
+  !,
+  ppl_delete_MIP_Problem(MIP).
+
+mip_eval :-
   make_vars(3, [A, B, C]),
-  clean_ppl_new_LP_Problem([A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5],
-      2*B-C, min, LP),
-  \+ ppl_LP_Problem_optimizing_point(LP, closure_point(_X)),
-  ppl_LP_Problem_optimizing_point(LP, Point),
-  ppl_LP_Problem_feasible_point(LP, Point),
-  \+ ppl_LP_Problem_feasible_point(LP, point(B)),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 2*B-C, min, MIP),
+  \+ ppl_MIP_Problem_optimizing_point(MIP, closure_point(_X)),
+  ppl_MIP_Problem_optimizing_point(MIP, Point),
+  ppl_MIP_Problem_feasible_point(MIP, Point),
+  \+ ppl_MIP_Problem_feasible_point(MIP, point(B)),
   clean_ppl_new_Polyhedron_from_generators(c, [Point], PH),
   clean_ppl_new_Polyhedron_from_generators(c, [point(5*B+5*C)], Expect_PH),
   ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
-  \+ ppl_LP_Problem_optimal_value(LP, 2, 1),
-  ppl_LP_Problem_optimal_value(LP, N, D),
-  \+ ppl_LP_Problem_evaluate_objective_function(LP, Point, 2, 1),
-  ppl_LP_Problem_evaluate_objective_function(LP, Point, N1, D1),
+  \+ ppl_MIP_Problem_optimal_value(MIP, 2, 1),
+  ppl_MIP_Problem_optimal_value(MIP, N, D),
+  \+ ppl_MIP_Problem_evaluate_objective_function(MIP, Point, 2, 1),
+  ppl_MIP_Problem_evaluate_objective_function(MIP, Point, N1, D1),
   N == N1,
   D == D1,
-  ppl_LP_Problem_OK(LP),
+  ppl_MIP_Problem_OK(MIP),
   !,
-  ppl_delete_LP_Problem(LP),
+  ppl_delete_MIP_Problem(MIP),
   ppl_delete_Polyhedron(Expect_PH),
   ppl_delete_Polyhedron(PH).
 
@@ -2382,31 +2459,36 @@ large_integers :-
   large_integers_exponents(Exps),
   large_integers_additions(Adds),
   out(large_int, init),
-  large_integers_prolog_cpp(Exps, Adds),
   pl_check_prolog_flag(bounded, Y),
   (Y == true ->
-    (out(sys_large_int, init),
-     large_integers_sys_prolog_cpp(Adds))
+     large_integers_prolog_cpp_bounded(Exps, Adds, 0),
+     out(sys_large_int, init),
+     large_integers_sys_prolog_cpp(Adds)
    ;
-     true
+     large_integers_prolog_cpp_unbounded(Exps, Adds)
   ).
 
-large_integers_prolog_cpp([], _).
-large_integers_prolog_cpp([Exp|Exps], Adds) :-
-  pl_check_prolog_flag(bounded, F),
-  (F == true ->
-     pl_check_prolog_flag(max_integer, Max_int),
-    (Max_int >> 1 =< 1 << Exp + 3 ->
-       true
-    ;
-       large_integers_prolog_cpp1(Adds, Exp),
-       large_integers_prolog_cpp(Exps, Adds)
-    )
-  ;
+large_integers_prolog_cpp_bounded([], _, _).
+large_integers_prolog_cpp_bounded([Exp|Exps], Adds, Prev_value) :-
+  /* If the test value is too large, it may be wrap.
+     So we compare it with the previous value that was ok
+     as well as checking it against the maximum value. */
+  Test_value is 1 << Exp + 3,
+  ( ( Test_value =< Prev_value ;
+      (pl_check_prolog_flag(max_integer, Max_int),
+         Max_int >> 1 =< Test_value)
+    ) ->
+     true
+   ;
      large_integers_prolog_cpp1(Adds, Exp),
-     large_integers_prolog_cpp(Exps, Adds)
+     large_integers_prolog_cpp_bounded(Exps, Adds, Test_value)
   ).
 
+large_integers_prolog_cpp_unbounded([], _).
+large_integers_prolog_cpp_unbounded([Exp|Exps], Adds) :-
+   large_integers_prolog_cpp1(Adds, Exp),
+   large_integers_prolog_cpp_unbounded(Exps, Adds).
+
 large_integers_prolog_cpp1([], _).
 large_integers_prolog_cpp1([Add|Adds], Exp) :-
   large_integers_prolog_cpp2(Exp, Add, 1),
@@ -2491,12 +2573,14 @@ large_integers_affine_transform_loop(Exp, P, A) :-
 % has a wrong exception message, then exceptions/0 will fail.
 
 exceptions :-
-   current_prolog_flag(bounded, Y),
+   pl_check_prolog_flag(bounded, Y),
    make_vars(3, V),
    exception_prolog(V),
-   (Y == true -> exception_sys_prolog(V) ; true),
+   ((Y == true,\+prolog_system('XSB'))  -> exception_sys_prolog(V) ; true),
    exception_cplusplus(V),
    !.
+exceptions :-
+   prolog_system('XSB').
 
 %% TEST: Prolog_unsigned_out_of_range
 exception_yap :-
@@ -2552,17 +2636,17 @@ exception_prolog(4, _) :-
   clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
   clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, Q),
   must_catch(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
-             Q, P, -1, _X)),
+             Q, P, -1, _)),
   must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
-             Q, P, [], -1, _X)),
+             Q, P, [], -1, _)),
   must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
-             Q, P, [], -1, _X)),
+             Q, P, [], -1, _)),
   must_catch(ppl_Polyhedron_H79_widening_assign_with_tokens(
-             Q, P, -1, _X)),
+             Q, P, -1, _)),
   must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
-             Q, P, [], -1, _X)),
+             Q, P, [], -1, _)),
   must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
-             Q, P, [], -1, _X)),
+             Q, P, [], -1, _)),
   !,
   ppl_delete_Polyhedron(P),
   ppl_delete_Polyhedron(Q).
@@ -2606,7 +2690,9 @@ exception_prolog(8, _) :-
 exception_prolog(9, [A, _, _]) :-
    clean_ppl_new_Polyhedron_from_generators(c,
                [point(A)], P),
-   must_catch(ppl_Polyhedron_get_bounding_box(P, a, _Box)).
+   must_catch(ppl_Polyhedron_get_bounding_box(P, a, _Box)),
+   !,
+   ppl_delete_Polyhedron(P).
 
 %% TEST: not_universe_or_empty
 exception_prolog(10, _) :-
@@ -2620,7 +2706,9 @@ exception_prolog(11, [A, B, _]) :-
   must_catch(
      ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x, A + 1)),
   must_catch(
-     ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1)).
+     ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1)),
+   !,
+   ppl_delete_Polyhedron(P).
 
 %% TEST: not_a_nil_terminated_list
 exception_prolog(12, [A, B, C]) :-
@@ -2664,10 +2752,10 @@ exception_prolog(12, [A, B, C]) :-
   ppl_delete_Polyhedron(P),
   ppl_delete_Polyhedron(Q).
 
-%% TEST: not_an_lp_problem_handle
+%% TEST: not_an_mip_problem_handle
 exception_prolog(13, _) :-
-  must_catch(ppl_LP_Problem_space_dimension(_, _N)),
-  must_catch(ppl_LP_Problem_constraints(p, [])).
+  must_catch(ppl_MIP_Problem_space_dimension(_, _N)),
+  must_catch(ppl_MIP_Problem_constraints(p, [])).
 
 % exception_sys_prolog(+N, +V) checks exceptions thrown by Prolog interfaces
 % that are dependent on a specific Prolog system.
@@ -2856,10 +2944,10 @@ delete_all_ppl_Polyhedra([P|Ps]) :-
   ppl_delete_Polyhedron(P),
   delete_all_ppl_Polyhedra(Ps).
 
-cleanup_ppl_LP_Problem(_).
-cleanup_ppl_LP_Problem(LP) :-
-  out(lp, LP),
-  ppl_delete_LP_Problem(LP), fail.
+cleanup_ppl_MIP_Problem(_).
+cleanup_ppl_MIP_Problem(MIP) :-
+  out(mip, MIP),
+  ppl_delete_MIP_Problem(MIP), fail.
 
 out(cs, P):-
   ((noisy(N), N < 2) -> true ;
@@ -2873,11 +2961,11 @@ out(gs, P):-
     nl, write(GS), nl
   ).
 
-out(lp, LP):-
+out(mip, MIP):-
   ((noisy(N), N < 2) -> true ;
-    ppl_LP_Problem_constraints(LP, CS),
-    ppl_LP_Problem_objective_function(LP, Obj),
-    ppl_LP_Problem_optimization_mode(LP, Opt),
+    ppl_MIP_Problem_constraints(MIP, CS),
+    ppl_MIP_Problem_objective_function(MIP, Obj),
+    ppl_MIP_Problem_optimization_mode(MIP, Opt),
     nl,
     write(' constraint system is: '), write(CS), nl,
     write(' objective function is: '), write(Obj), nl,
@@ -2961,17 +3049,17 @@ clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P) :-
   ),
   cleanup_ppl_Polyhedron(P).
 
-clean_ppl_new_LP_Problem_trivial(LP) :-
-  ppl_new_LP_Problem_trivial(LP),
-  cleanup_ppl_LP_Problem(LP).
+clean_ppl_new_MIP_Problem_from_space_dimension(Dim, MIP) :-
+  ppl_new_MIP_Problem_from_space_dimension(Dim, MIP),
+  cleanup_ppl_MIP_Problem(MIP).
 
-clean_ppl_new_LP_Problem(CS, Obj, Opt, LP) :-
-  ppl_new_LP_Problem(CS, Obj, Opt, LP),
-  cleanup_ppl_LP_Problem(LP).
+clean_ppl_new_MIP_Problem(Dim, CS, Obj, Opt, MIP) :-
+  ppl_new_MIP_Problem(Dim, CS, Obj, Opt, MIP),
+  cleanup_ppl_MIP_Problem(MIP).
 
-clean_ppl_new_LP_Problem_from_LP_Problem(LP1, LP) :-
-  ppl_new_LP_Problem_from_LP_Problem(LP1, LP),
-  cleanup_ppl_LP_Problem(LP).
+clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP) :-
+  ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP),
+  cleanup_ppl_MIP_Problem(MIP).
 
 %%%%%%%%%%%% predicates for switching on/off output messages %
 
@@ -3067,8 +3155,7 @@ format_exception_message(Error) :-
 %%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%
 
 error_message(Message):-
-   write_all(Message),
-   fail.
+   write_all(Message).
 
 display_message(Message):-
     noisy(_),
@@ -3081,8 +3168,8 @@ write_all([Phrase|Phrases]):-
    (Phrase == nl ->
       nl
    ;
-      (write(Phrase),
-      write(' '))
+      write(Phrase),
+      write(' ')
    ),
    write_all(Phrases).
 
@@ -3110,7 +3197,7 @@ list_groups( [
    check_polyhedron,
    minmax_polyhedron,
    compare_polyhedra,
-   lp_problem,
+   mip_problem,
    transform_polyhedron,
    polyhedron_boxes,
    add_to_system,
@@ -3147,10 +3234,10 @@ group_predicates(new_polyhedron_from_dimension,
   ]).
 
 group_predicates(new_polyhedron_from_polyhedron,
-  [ppl_new_C_Polyhedron_from_C_Polyhedrom/3,
-   ppl_new_C_Polyhedron_from_NNC_Polyhedrom/3,
-   ppl_new_NNC_Polyhedron_from_C_Polyhedrom/3,
-   ppl_new_NNC_Polyhedron_from_NNC_Polyhedrom/3,
+  [ppl_new_C_Polyhedron_from_C_Polyhedron/3,
+   ppl_new_C_Polyhedron_from_NNC_Polyhedron/3,
+   ppl_new_NNC_Polyhedron_from_C_Polyhedron/3,
+   ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/3,
    ppl_new_C_Polyhedron_from_constraints/2,
    ppl_new_NNC_Polyhedron_from_constraints/2,
    ppl_Polyhedron_equals_Polyhedron/2
@@ -3159,8 +3246,8 @@ group_predicates(new_polyhedron_from_polyhedron,
 group_predicates(new_polyhedron_from_representations,
   [ppl_new_C_Polyhedron_from_constraints/2,
    ppl_new_NNC_Polyhedron_from_constraints/2,
-   ppl_new_C_Polyhedron_from_genenerators/2,
-   ppl_new_NNC_Polyhedron_from_genenerators/2,
+   ppl_new_C_Polyhedron_from_generators/2,
+   ppl_new_NNC_Polyhedron_from_generators/2,
    ppl_new_C_Polyhedron_from_bounding_box/2,
    ppl_new_NNC_Polyhedron_from_bounding_box/2
   ]).
@@ -3171,7 +3258,10 @@ group_predicates(swap_polyhedra,
 
 group_predicates(polyhedron_dimension,
   [ppl_Polyhedron_affine_dimension/2,
-   ppl_Polyhedron_space_dimension/2]).
+   ppl_Polyhedron_space_dimension/2,
+   ppl_Polyhedron_constrains/2,
+   ppl_Polyhedron_unconstrain_space_dimension/2,
+   ppl_Polyhedron_unconstrain_space_dimensions/2]).
 
 group_predicates(basic_operators,
   [ppl_Polyhedron_intersection_assign/2,
@@ -3240,6 +3330,10 @@ group_predicates(check_polyhedron,
   [ppl_Polyhedron_relation_with_constraint/3,
    ppl_Polyhedron_relation_with_generator/3,
    ppl_Polyhedron_is_topologically_closed/1,
+   ppl_Polyhedron_is_universe,
+   ppl_Polyhedron_is_empty,
+   ppl_Polyhedron_is_bounded,
+   ppl_Polyhedron_contains_integer_point,
    ppl_Polyhedron_contains_Polyhedron/2,
    ppl_Polyhedron_strictly_contains_Polyhedron/2,
    ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
@@ -3271,8 +3365,8 @@ group_predicates(catch_time,
    ppl_reset_timeout/0
   ]).
 
-group_predicates(lp_problem,
-  ['all LP_Prolog predicates'
+group_predicates(mip_problem,
+  ['all MIP_Prolog predicates'
   ]).
 
 group_predicates(large_integers,
@@ -3293,12 +3387,8 @@ group_predicates(handle_exceptions,
 % Note that 268435456 is 2^28.
 
 pl_check_prolog_flag(bounded, TF) :-
-  \+ prolog_system('XSB'),
   current_prolog_flag(bounded, TF).
 
-pl_check_prolog_flag(bounded, true) :-
-  prolog_system('XSB').
-
 pl_check_prolog_flag(max_integer, Max_Int) :-
   \+ prolog_system('XSB'),
   current_prolog_flag(max_integer, Max_Int).
diff --git a/interfaces/Prolog/tests/pl_grid_check.pl b/interfaces/Prolog/tests/pl_grid_check.pl
new file mode 100644
index 0000000..1242331
--- /dev/null
+++ b/interfaces/Prolog/tests/pl_grid_check.pl
@@ -0,0 +1,2301 @@
+/* Various tests on the Prolog interface.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+% noisy(F)
+% When F = 1, a message is displayed if a time out occurs
+% when running the `timeout'` predicate.
+% Also, the values of the PPL versions and banner are displayed.
+% When F = 0, no 'time out' message or versions are displayed.
+% When F = 2, if a test fails and the backtracking returns to a polyhedron
+% constructor, the caught error will cause the constraint and generator systems
+% for the polyhedron to be displayed.
+% noisy/1 can be reset by calling make_noisy/0 or make_quiet/0.
+
+:- dynamic(noisy/1).
+
+% check_all
+% This executes all the test predicates which, together, check all
+% the ppl interface predicates.
+
+check_all :-
+   (noisy(_) -> true; make_quiet),
+   list_groups(Groups),
+   catch(run_all(Groups), Exception,
+       (print_exception_term(Exception), fail)).
+
+% check_quiet
+% This alo executes all the test predicates with no output.
+
+check_quiet :-
+   make_quiet,
+   check_all.
+
+% check_noisy
+% This also executes all the test predicates but also prints some messages
+% including the banner, version numbers and expected output from
+% the exception tests.
+
+check_noisy :-
+   make_noisy,
+   check_all.
+
+check_extra_noisy :-
+   make_extra_noisy,
+   check_all.
+
+run_all([Group|Groups]):-
+   ppl_initialize,
+   (catch(run_one(Group), Exception,
+         run_exception(Group, Exception)) -> true ; run_fail(Group)),
+   !,
+   ppl_finalize,
+   run_all(Groups).
+
+run_all([]).
+
+run_all([_|_]) :-
+   error_message(['Prolog interface checks failed.']),
+   !,
+   ppl_finalize,
+   fail.
+
+run_fail(Group) :-
+   group_predicates(Group, Predicates),
+   error_message(['Error occurred while performing test', Group,
+              'which checks predicates:', nl, Predicates]),
+   !,
+   ppl_finalize,
+   fail.
+
+run_exception(Group, ppl_overflow_error(Cause)) :-
+   !,
+   group_predicates(Group, Predicates),
+   display_message(
+            ['Overflow exception occurred while performing test ', Group,
+              'which checks predicates ', nl, Predicates]),
+   print_exception_term(ppl_overflow_error(Cause)).
+
+run_exception(Group, Exception) :-
+   group_predicates(Group, Predicates),
+   display_message(
+            ['Exception occurred while performing test ', Group,
+              'which checks predicates ', nl, Predicates]),
+   print_exception_term(Exception),
+   fail.
+
+% Tests predicates that return PPL version information and the PPL banner.
+% If noisy(0) holds, there is no output but if not,
+% all the versions are printed and the banner is pretty printed.
+run_one(all_versions_and_banner) :-
+  \+ ppl_version_major(-1),
+  ppl_version_major(Vmajor),
+  ppl_version_minor(Vminor),
+  ppl_version_revision(Vrevision),
+  ppl_version_beta(Vbeta),
+  ppl_version(V),
+  ppl_banner(B),
+  (noisy(0) -> true ;
+     (
+      nl,
+      write('Version major is '), write(Vmajor), nl,
+      write('Version minor is '), write(Vminor), nl,
+      write('Version revision is '), write(Vrevision), nl,
+      write('Version beta is '), write(Vbeta), nl,
+      write('Version is '), write(V), nl,
+      banner_pp(B), nl
+     )
+  ).
+
+% Tests predicates that return the maximum allowed dimension and coefficients.
+% If noisy(0) holds, there is no output but if not, the maximums/miniumums
+% are printed.
+
+run_one(grid_from_dimension) :-
+  new_grid_from_dim,
+  (noisy(0) -> true ;
+     display_message(['grid_from_dimension ok'])
+  ).
+
+run_one(grid_from_grid) :-
+  new_grid_from_grid,
+  (noisy(0) -> true ;
+     display_message(['grid_from_grid ok'])
+  ).
+
+run_one(grid_from_representation) :-
+  new_grid_from_congs,
+  new_grid_from_gens,
+  new_grid_from_bounding_box,
+  new_grid_from_covering_box,
+  (noisy(0) -> true ;
+     display_message(['grid_from_representation ok'])
+  ).
+
+run_one(swap_grids) :-
+  grid_swap,
+  (noisy(0) -> true ;
+     display_message(['swap_grids ok'])
+  ).
+
+run_one(grid_dimension) :-
+   grid_space_dim,
+   grid_affine_dim,
+  (noisy(0) -> true ;
+     display_message(['grid_dimension ok'])
+  ).
+
+run_one(grid_basic_operators) :-
+   grid_inters_assign,
+   grid_join_assign,
+   grid_join_assign,
+   grid_time_elapse,
+   grid_top_close_assign,
+  (noisy(0) -> true ;
+     display_message(['grid_basic_operators ok'])
+  ).
+
+run_one(grid_add_to_system) :-
+   grid_add_con,
+   grid_add_gen,
+   grid_add_cons,
+   grid_add_gens,
+  (noisy(0) -> true ;
+     display_message(['grid_add_to_system ok'])
+  ).
+
+run_one(grid_revise_dimensions) :-
+   grid_project,
+   grid_embed,
+   grid_conc_assign,
+   grid_remove_dim,
+   grid_remove_high_dim,
+   grid_expand_dim,
+   grid_map_dim,
+   grid_fold_dims,
+  (noisy(0) -> true ;
+     display_message(['grid_revise_dimensions ok'])
+  ).
+
+run_one(grid_transform) :-
+   grid_affine_image,
+   grid_affine_preimage,
+   grid_affine_image_gen,
+   grid_affine_preimage_gen,
+   grid_affine_image_genlr,
+   grid_affine_preimage_genlr,
+  (noisy(0) -> true ;
+     display_message(['transform_grid ok'])
+  ).
+
+run_one(grid_get_system) :-
+   grid_get_cons,
+   grid_get_min_cons,
+   grid_get_gens,
+   grid_get_min_gens,
+  (noisy(0) -> true ;
+     display_message(['grid_get_system ok'])
+  ).
+
+run_one(check_grid) :-
+   grid_rel_cons,
+   grid_rel_gens,
+   grid_checks,
+   grid_bounds_from_above,
+   grid_bounds_from_below,
+  (noisy(0) -> true ;
+     display_message(['check_grids ok'])
+  ).
+
+run_one(minmax_grid) :-
+   grid_maximize,
+   grid_minimize,
+   grid_maximize_with_point,
+   grid_minimize_with_point,
+  (noisy(0) -> true ;
+     display_message(['minmax_grid ok'])
+  ).
+
+run_one(compare_grids) :-
+   grid_contains,
+   grid_strict_contains,
+   grid_disjoint_from,
+   grid_equals,
+   grid_ok,
+  (noisy(0) -> true ;
+     display_message(['compare_grids ok'])
+  ).
+
+run_one(grid_get_boxes) :-
+   grid_get_bounding_box,
+   grid_get_covering_box,
+  (noisy(0) -> true ;
+     display_message(['grid_get_boxes ok'])
+  ).
+
+run_one(grid_extrapolation_operators) :-
+   grid_widen_congruence,
+   grid_widen_congruence_with_tokens,
+   grid_lim_extrapolate_congruence,
+   grid_lim_extrapolate_congruence_with_tokens,
+   grid_widen_generator,
+   grid_widen_generator_with_tokens,
+   grid_lim_extrapolate_generator,
+   grid_lim_extrapolate_generator_with_tokens,
+  (noisy(0) -> true ;
+     display_message(['grid_extrapolation_operators ok'])
+  ).
+
+run_one(grid_handle_exceptions) :-
+   grid_exceptions,
+  (noisy(0) -> true ;
+     display_message(['grid_exceptions ok'])
+  ).
+
+%%%%%%%%%%%%%%%%% New Grid %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Note that throughout the tests, all "new_Grid_from_...(...,P)" calls
+% are made in such a way that, if the test fails, P is deleted.
+% This is done by using special "clean_new_Grid_from_...(...,P)"
+% forms of the predicates that are defined later.
+%
+% As we also delete P on success of the test, to prevent trying to
+% delete P again when a later test fails, we always have a cut before these
+% in-line calls to ppl_Grid_delete(P).
+
+% Tests new_Grid_from_space_dimension/3 and
+%       ppl_delete_Grid/1.
+new_grid_from_dim :-
+  new_grid_from_dim(universe),
+  new_grid_from_dim(empty).
+
+% This also uses ppl_Grid_is_universe/1
+% and ppl_Grid_is_empty.
+new_grid_from_dim(Universe_Or_Empty) :-
+  \+ clean_ppl_new_Grid_from_space_dimension(3, Universe_Or_Empty, 0),
+  clean_ppl_new_Grid_from_space_dimension(3, Universe_Or_Empty, P),
+  (Universe_Or_Empty = universe ->
+      (ppl_Grid_is_universe(P),
+      \+ ppl_Grid_is_empty(P))
+   ;
+      (ppl_Grid_is_empty(P),
+      \+ ppl_Grid_is_universe(P))
+  ),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_new_Grid_from_Grid/2,
+% This also uses ppl_new_Grid_from_congruences/2 and
+% ppl_Grid_equals_Grid/2.
+new_grid_from_grid :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  \+ clean_ppl_new_Grid_from_Grid(P1, 0),
+  clean_ppl_new_Grid_from_Grid(P1, P2),
+  clean_ppl_new_Grid_from_Grid(P2, P1a),
+  ppl_Grid_equals_Grid(P1, P1a),
+  clean_ppl_new_Grid_from_Grid(P1a, P2a),
+  ppl_Grid_equals_Grid(P2, P2a),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P1a),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P2a),
+  make_vars(3, [A, B, C]),
+  CS = [3 =:= A, 4*A + B - 2*C =:= 5],
+  clean_ppl_new_Grid_from_congruences(CS, P3),
+  clean_ppl_new_Grid_from_Grid(P3, P4),
+  clean_ppl_new_Grid_from_Grid(P4, P3a),
+  clean_ppl_new_Grid_from_Grid(P3a, P4a),
+  ppl_Grid_equals_Grid(P3, P3a),
+  ppl_Grid_equals_Grid(P4, P4a),
+  !,
+  ppl_delete_Grid(P3),
+  ppl_delete_Grid(P4),
+  ppl_delete_Grid(P3a),
+  ppl_delete_Grid(P4a).
+
+% Tests ppl_new_Grid_from_congruences/2.
+new_grid_from_congs :-
+  make_vars(4, [A, B, C, D]),
+  new_grid_from_congs([3 =:= A, 4*A + B - 2*C =:= 5, (D =:= 1) / 0]),
+  new_grid_from_congs([B =:= A, (4*A + B - 2*C =:= 5) / 2, D = 1]).
+
+new_grid_from_congs(CS) :-
+  clean_ppl_new_Grid_from_congruences([], P),
+  \+ clean_ppl_new_Grid_from_congruences([], 0),
+  ppl_Grid_is_universe(P),
+  clean_ppl_new_Grid_from_congruences(CS, Pa),
+  \+ ppl_Grid_is_universe(Pa),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Pa).
+
+% Tests ppl_new_Grid_from_constraints/2.
+new_grid_from_conss :-
+  make_vars(4, [A, B, C, D]),
+  new_grid_from_conss([3 = A, 4*A + B - 2*C = 5, D >= 1]),
+  new_grid_from_conss([B = A, 4*A + B - 2*C =< 5, D = 1]).
+
+new_grid_from_conss(CS) :-
+  make_vars(1, [A]),
+  clean_ppl_new_Grid_from_constraints([], P),
+  ppl_Grid_is_universe(P),
+  \+ clean_ppl_new_Grid_from_constraints([], 0),
+  clean_ppl_new_Grid_from_constraints([A = 0, A = 1], P1),
+  ppl_Grid_is_empty(P1),
+  clean_ppl_new_Grid_from_constraints(CS, P2),
+  \+ ppl_Grid_is_universe(P2),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2).
+
+% Tests ppl_new_Grid_from_generators/2 and
+%       ppl_new_Grid_from_generators/2.
+new_grid_from_gens :-
+  make_vars(3, [A, B, C]),
+  new_grid_from_gens([grid_point(A + B + C, 1), grid_point(A + B + C)] ).
+
+new_grid_from_gens(GS) :-
+  \+ clean_ppl_new_Grid_from_generators([], 0),
+  clean_ppl_new_Grid_from_generators([], P),
+  ppl_Grid_is_empty(P),
+  clean_ppl_new_Grid_from_generators(GS, Pa),
+  \+ ppl_Grid_is_empty(Pa),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Pa).
+
+% Tests ppl_new_Grid_from_bounding_box/3.
+new_grid_from_bounding_box :-
+  clean_ppl_new_Grid_from_bounding_box([empty], PEmpty),
+  ppl_Grid_get_bounding_box(PEmpty, any, BoxEmpty1),
+  clean_ppl_new_Grid_from_bounding_box(BoxEmpty1, PEmpty1),
+  ppl_Grid_equals_Grid(PEmpty1, PEmpty),
+  !,
+  ppl_delete_Grid(PEmpty),
+  ppl_delete_Grid(PEmpty1),
+  clean_ppl_new_Grid_from_bounding_box(
+         [i(o(minf), o(pinf)), i(c(-1/2), c(-1/2))], PUniverse
+                                      ),
+  ppl_Grid_get_bounding_box(PUniverse, any, BoxUniverse1),
+  clean_ppl_new_Grid_from_bounding_box(BoxUniverse1, PUniverse1),
+  ppl_Grid_equals_Grid(PUniverse1, PUniverse),
+  !,
+  ppl_delete_Grid(PUniverse),
+  ppl_delete_Grid(PUniverse1),
+  Box = [i(c(1/2), c(1/2)), i(c(-1/2), c(-1/2))],
+  clean_ppl_new_Grid_from_bounding_box(Box, P),
+  ppl_Grid_get_bounding_box(P, any, Box1),
+  clean_ppl_new_Grid_from_bounding_box(Box1, P1),
+  ppl_Grid_equals_Grid(P, P1),
+  \+ clean_ppl_new_Grid_from_bounding_box(Box, 0),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(x, c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(x(minf), c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(o(minf), c(1/2)), i(c(0), c(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(c(minf), c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(o(minf), c(inf)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(c(minf), c(1+2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(c(minf), c(n/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(c(minf), c(2/d)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(e), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [i(c(minf), c(2/1), c(1)), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_bounding_box(
+             [x(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+
+% Tests ppl_new_Grid_from_covering_box/2.
+new_grid_from_covering_box :-
+  clean_ppl_new_Grid_from_covering_box([i(c(-1/2), c(1/2)), empty], PEmpty),
+  ppl_Grid_get_covering_box(PEmpty, BoxEmpty1),
+  clean_ppl_new_Grid_from_covering_box(BoxEmpty1, PEmpty1),
+  ppl_Grid_equals_Grid(PEmpty1, PEmpty),
+  !,
+  ppl_delete_Grid(PEmpty),
+  ppl_delete_Grid(PEmpty1),
+  clean_ppl_new_Grid_from_covering_box(
+         [i(c(1), c(1)), i(c(-1/2), c(-1/2))], PUniverse
+                                      ),
+  ppl_Grid_get_covering_box(PUniverse, BoxUniverse1),
+  clean_ppl_new_Grid_from_covering_box(BoxUniverse1, PUniverse1),
+  ppl_Grid_equals_Grid(PUniverse1, PUniverse),
+  !,
+  ppl_delete_Grid(PUniverse),
+  ppl_delete_Grid(PUniverse1),
+  Box = [i(c(1/2), c(8)), i(c(-1/2), o(pinf))],
+  clean_ppl_new_Grid_from_covering_box(Box, P),
+  ppl_Grid_get_covering_box(P, Box1),
+  clean_ppl_new_Grid_from_covering_box(Box1, P1),
+  ppl_Grid_equals_Grid(P, P1),
+  \+ clean_ppl_new_Grid_from_covering_box(Box, 0),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(x, c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(x(minf), c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(o(minf), c(1/2)), i(c(0), c(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(c(minf), c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(o(minf), c(inf)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(c(minf), c(1+2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(c(minf), c(n/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(c(minf), c(2/d)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(e), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [i(c(minf), c(2/1), c(1)), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Grid_from_covering_box(
+             [x(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+%%%%%%%%%%%%%%%%% Swap Grids %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_swap/2.
+grid_swap :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  clean_ppl_new_Grid_from_space_dimension(2, empty, Q),
+  ppl_Grid_swap(P, Q),
+  ppl_Grid_is_empty(P),
+  ppl_Grid_is_universe(Q),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+%%%%%%%%%%%%%%%%%% Grid Dimension %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_space_dimension/2.
+
+grid_space_dim :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  ppl_Grid_space_dimension(P, N),
+  N = 3,
+  \+ ppl_Grid_space_dimension(P, 4),
+  clean_ppl_new_Grid_from_generators([], Q),
+  ppl_Grid_space_dimension(Q, M),
+  M == 0,
+  clean_ppl_new_Grid_from_congruences([], Q1),
+  ppl_Grid_space_dimension(Q1, M1),
+  M1 == 0,
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q),
+  ppl_delete_Grid(Q1).
+
+
+% Tests ppl_Grid_affine_dimension/2.
+grid_affine_dim :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  ppl_Grid_affine_dimension(P, N),
+  N == 3,
+  \+ ppl_Grid_affine_dimension(P, 2),
+  clean_ppl_new_Grid_from_generators([], Q),
+  ppl_Grid_affine_dimension(Q, M),
+  M == 0,
+  clean_ppl_new_Grid_from_congruences([], Q1),
+  ppl_Grid_affine_dimension(Q1, M1),
+  M1 == 0,
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q),
+  ppl_delete_Grid(Q1),
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_generators([grid_point(A), parameter(B)],
+                                     P1),
+  ppl_Grid_space_dimension(P1, 2),
+  ppl_Grid_affine_dimension(P1, 1),
+  clean_ppl_new_Grid_from_generators([grid_point(A + B, 2)],
+                                     P2),
+  ppl_Grid_space_dimension(P2, 2),
+  ppl_Grid_affine_dimension(P2, 0),
+  clean_ppl_new_Grid_from_congruences([A - B =:= 0, B =:= 0,
+                                       (A + B =:= 1)/0],
+                                      P3),
+  ppl_Grid_space_dimension(P3, 2),
+  ppl_Grid_affine_dimension(P3, 1),
+  clean_ppl_new_Grid_from_congruences([A - B =:= 0, B =:= 1,
+                                       A + B =:= 1],
+                                      P4),
+  ppl_Grid_add_congruence(P4, (2*B =:= 1)/2),
+  ppl_Grid_space_dimension(P4, 2),
+  ppl_Grid_affine_dimension(P4, 0),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P3),
+  ppl_delete_Grid(P4).
+
+%%%%%%%%%%%%%%%% Basic Operators %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_intersection_assign/2.
+grid_inters_assign :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_generators([grid_point(0), grid_point(B),
+                                      grid_point(A), grid_point(A, 2)],
+                                     P1),
+  clean_ppl_new_Grid_from_generators([grid_point(0), grid_point(A),
+                                      grid_point(A + B), grid_point(A, 2)],
+                                     P2),
+  ppl_Grid_intersection_assign(P1, P2),
+  clean_ppl_new_Grid_from_generators([grid_point(A, 2),
+                                      grid_point(B), grid_point(0)],
+                                     P1a),
+  clean_ppl_new_Grid_from_congruences([2*A =:= 0, B =:= 0],
+                                      P1b),
+  ppl_Grid_equals_Grid(P1, P1a),
+  ppl_Grid_equals_Grid(P1, P1b),
+  clean_ppl_new_Grid_from_congruences([(4*A =:= 1)/2, B =:= 0], P3),
+  ppl_Grid_intersection_assign(P1, P3),
+  ppl_Grid_is_empty(P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P3),
+  ppl_delete_Grid(P1a),
+  ppl_delete_Grid(P1b).
+
+% Tests ppl_Grid_concatenate_assign/2.
+grid_conc_assign :-
+  make_vars(5, [A, B, C, D, E]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  clean_ppl_new_Grid_from_congruences( [A =:= 1, B =:= 0, C =:= 0], Q),
+  ppl_Grid_concatenate_assign(P, Q),
+  clean_ppl_new_Grid_from_congruences(
+                                      [C =:= 1, D =:= 0, E =:= 0],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+% Tests ppl_Grid_join_assign/2.
+grid_join_assign :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_generators(
+                                     [grid_point(0), grid_point(2*B),
+                                      parameter(A,2)],
+                                     P1),
+  clean_ppl_new_Grid_from_generators(
+                                     [grid_point(0), grid_point(A + B)],
+                                     P2),
+  ppl_Grid_join_assign(P1, P2),
+  clean_ppl_new_Grid_from_generators(
+                                     [grid_point(0), grid_point(B),
+                                      parameter(A,2)],
+                                     P1a),
+  ppl_Grid_equals_Grid(P1, P1a),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P1a).
+
+% Tests ppl_Grid_difference_assign/2.
+grid_diff_assign :-
+  make_vars(1, [A]),
+  GS0 = [grid_point(2*A)],
+  GS1 = [grid_point(0), grid_point(2*A)],
+  GS2 = [grid_point(0), grid_point(A)],
+  GS3 = [grid_point(-2*A), grid_point(2*A)],
+  GS4 = [grid_point(0), grid_point(4*A)],
+  grid_diff_assign(GS1, GS2, []),
+  grid_diff_assign(GS1, GS3, GS4),
+  grid_diff_assign(GS3, GS0, GS3),
+  grid_diff_assign(GS0, GS0, []).
+
+grid_diff_assign( GS1, GS2, GS3) :-
+  clean_ppl_new_Grid_from_generators( GS1, P1),
+  ppl_Grid_space_dimension(P1, Dim),
+  clean_ppl_new_Grid_from_space_dimension( Dim, empty, P2),
+  ppl_Grid_add_grid_generators(P2, GS2),
+  ppl_Grid_difference_assign(P1, P2),
+  clean_ppl_new_Grid_from_space_dimension( Dim, empty, P3),
+  ppl_Grid_add_grid_generators(P3, GS3),
+  ppl_Grid_equals_Grid(P1, P3),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P3).
+
+% Tests ppl_Grid_time_elapse_assign/2.
+grid_time_elapse :-
+  make_vars(1, [A]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_constraints(P,
+                          [A = 2]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, Q),
+  ppl_Grid_add_congruences(Q, [(A =:= 0) /3]),
+  ppl_Grid_time_elapse_assign(P, Q),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, Pa),
+  ppl_Grid_add_congruences(Pa, [(A =:= 2)/3]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, Qa),
+  ppl_Grid_add_congruences(Qa, [(A =:= 0)/3]),
+  ppl_Grid_equals_Grid(Q, Qa),
+  ppl_Grid_equals_Grid(P, Pa),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q),
+  ppl_delete_Grid(Pa),
+  ppl_delete_Grid(Qa).
+
+% Tests ppl_Grid_topological_closure_assign/1.
+grid_top_close_assign :-
+  make_vars(3, [A, B, C]),
+  GS_close = [grid_point(A + B), grid_point(0),
+               parameter(A), parameter(B)],
+  CS_close = [4*A + B + -2*C =:= 5, A =:= 3],
+  grid_top_close_assign(gensys, GS_close, GS_close),
+  grid_top_close_assign(consys, CS_close, CS_close).
+
+grid_top_close_assign( gensys, GS, GS_close) :-
+  clean_ppl_new_Grid_from_generators( GS, P),
+  ppl_Grid_topological_closure_assign(P),
+  clean_ppl_new_Grid_from_generators( GS_close, Pa),
+  ppl_Grid_equals_Grid(P, Pa),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Pa).
+
+grid_top_close_assign( consys, CS, CS_close) :-
+  clean_ppl_new_Grid_from_congruences( CS, P),
+  ppl_Grid_topological_closure_assign(P),
+  clean_ppl_new_Grid_from_congruences( CS_close, Pa),
+  ppl_Grid_equals_Grid(P, Pa),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Pa).
+
+%%%%%%%%%%%%%%%%%% Grid_Add Constraints or Generators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_add_congruence/2 and ppl_Grid_add_constraint/2.
+grid_add_con :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_constraint(P, A - B = 1),
+  clean_ppl_new_Grid_from_constraints(
+                                      [A - B = 1],
+                                      Pa),
+  ppl_Grid_equals_Grid(P, Pa),
+  ppl_Grid_add_congruence(P, A =:= 0),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 0, (B =:= A - 1)/0],
+                                      Pb),
+  ppl_Grid_equals_Grid(P, Pb),
+  ppl_Grid_add_congruence(P, (2*A =:= 1)/2),
+  clean_ppl_new_Grid_from_space_dimension( 2, empty, Pc),
+  ppl_Grid_equals_Grid(P, Pc),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Pa),
+  ppl_delete_Grid(Pb),
+  ppl_delete_Grid(Pc).
+
+% Tests ppl_Grid_add_grid_generator/2.
+grid_add_gen :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, empty, P),
+  ppl_Grid_add_grid_generator(P, grid_point(0)),
+  ppl_Grid_add_grid_generator(P, parameter(A + B)),
+  ppl_Grid_add_grid_generator(P, grid_line(A)),
+  clean_ppl_new_Grid_from_space_dimension(2, universe, P1),
+  ppl_Grid_add_congruence(P1, B =:= 1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+% Tests ppl_Grid_add_congruences/2.
+% and ppl_Grid_add_constraints/2.
+grid_add_cons :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, P),
+  ppl_Grid_add_congruences(P,
+        [A =:= 1, B =:= 0, 4*A + B - 2*C =:= 5]),
+  ppl_Grid_add_constraints(P,
+        [2*A + B - 2*C = 5]),
+  clean_ppl_new_Grid_from_congruences(
+        [A =:= 1, B =:= 0, 4*A + B - 2*C =:= 5], P1),
+  ppl_Grid_add_congruences(P1, [2*A + B - 2*C = 5]),
+  ppl_Grid_equals_Grid(P, P1),
+  ppl_Grid_add_congruences(P, [(3*A =:= 1)/3]),
+  ppl_Grid_is_empty(P),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+% Tests ppl_Grid_add_grid_generators/2.
+grid_add_gens :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension( 3, empty, P),
+  ppl_Grid_add_grid_generators(P, [grid_point(A + B + C),
+                parameter(A), parameter(2*A), parameter(A + B + C, 1),
+                parameter(100*A + 5*B, -8)]),
+  clean_ppl_new_Grid_from_generators([grid_point(A + B + C),
+                parameter(A), parameter(2*A), parameter(A + B + C, 1),
+                parameter(100*A + 5*B, -8)], P1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+%%%%%%%%%%%%%%%%%% Change Dimensions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_add_space_dimensions_and_project/2.
+grid_project :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 0]),
+  ppl_Grid_add_space_dimensions_and_project(P, 0),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1, B =:= 0],
+                                      P0),
+  ppl_Grid_equals_Grid(P, P0),
+  ppl_delete_Grid(P0),
+  ppl_Grid_add_space_dimensions_and_project(P, 2),
+  clean_ppl_new_Grid_from_congruences(
+            [A =:= 1, B =:= 0, (C =:= 0)/0, (D =:= 0)/0],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_add_space_dimensions_and_embed/2.
+grid_embed :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 0]),
+  ppl_Grid_add_space_dimensions_and_embed(P, 0),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1, B =:= 0],
+                                      P0),
+  ppl_Grid_equals_Grid(P, P0),
+  ppl_delete_Grid(P0),
+  ppl_Grid_add_space_dimensions_and_embed(P, 2),
+  clean_ppl_new_Grid_from_space_dimension( 4, universe, P1),
+  ppl_Grid_add_congruences(P1, [A =:= 1, B =:= 0]),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_remove_space_dimensions/2.
+grid_remove_dim :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 0, C =:= 2]),
+  ppl_Grid_remove_space_dimensions(P, []),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1, B =:= 0, C =:= 2],
+                                      P0),
+  ppl_Grid_equals_Grid(P, P0),
+  ppl_delete_Grid(P0),
+  ppl_Grid_remove_space_dimensions(P,[B]),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1, B =:= 2],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  ppl_delete_Grid(P1),
+  % Note: now 'B' refers to the old 'C' variable.
+  ppl_Grid_remove_space_dimensions(P,[A, B]),
+  ppl_Grid_space_dimension(P, 0),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_remove_higher_space_dimensions/2.
+grid_remove_high_dim :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 0, C =:= 0]),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1, B =:= 0, C =:= 0],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  ppl_Grid_remove_higher_space_dimensions(P, 1),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1],
+                                      P2),
+  ppl_Grid_equals_Grid(P, P2),
+  ppl_Grid_remove_higher_space_dimensions(P, 1),
+  ppl_Grid_equals_Grid(P, P2),
+  ppl_Grid_remove_higher_space_dimensions(P, 0),
+  ppl_Grid_space_dimension(P, 0),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_expand_space_dimension/3.
+grid_expand_dim :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 0, C =:= 2]),
+  ppl_Grid_expand_space_dimension(P, B, 1),
+  ppl_Grid_space_dimension(P, 4),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A =:= 1, B =:= 0, C =:= 2, D =:= 0],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  ppl_delete_Grid(P1),
+  ppl_Grid_remove_higher_space_dimensions(P, 2),
+  ppl_Grid_expand_space_dimension(P, A, 2),
+  clean_ppl_new_Grid_from_congruences(
+                                      [D =:= 1, C =:= 1, A =:= 1, B =:= 0],
+                                      P2),
+  ppl_Grid_equals_Grid(P, P2),
+  ppl_delete_Grid(P2),
+  ppl_Grid_space_dimension(P, 4),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_fold_space_dimension/3.
+grid_fold_dims :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Grid_from_space_dimension( 4, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 0, C =:= 2, D =:= 0]),
+  ppl_Grid_fold_space_dimensions(P, [D], B),
+  ppl_Grid_space_dimension(P, 3),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, P1),
+  ppl_Grid_add_congruences(P1, [A =:= 1, B =:= 0, C =:= 2]),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_Grid_fold_space_dimensions(P, [A, C], B),
+  clean_ppl_new_Grid_from_space_dimension( 1, universe, P2),
+  ppl_Grid_add_congruences(P2, [A =:= 0]),
+  ppl_Grid_equals_Grid(P, P2),
+  ppl_delete_Grid(P2),
+  ppl_Grid_space_dimension(P, 1),
+  !,
+  ppl_delete_Grid(P),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, Ptacas),
+  ppl_Grid_add_congruences(Ptacas, [A =:= 1, A =:= 3, B =:= 7, B =:= 12]),
+  ppl_Grid_fold_space_dimensions(Ptacas, [A], B),
+  ppl_Grid_space_dimension(Ptacas, 1),
+  clean_ppl_new_Grid_from_space_dimension( 1, universe, Ptacas1),
+  ppl_Grid_add_congruences(Ptacas1, [A =:= 1, A =:= 12]),
+  ppl_Grid_equals_Grid(Ptacas, Ptacas1),
+  !,
+  ppl_delete_Grid(Ptacas1),
+  ppl_delete_Grid(Ptacas).
+
+% Tests ppl_Grid_map_space_dimensions/2.
+grid_map_dim :-
+  make_vars(7, [A, B, C, D, E, F, G]),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, P),
+  ppl_Grid_add_congruences(P, [A =:= 2, B =:= 1, C =:= 0]),
+  ppl_Grid_map_space_dimensions(P, [A-B, B-C, C-A]),
+  clean_ppl_new_Grid_from_space_dimension( 3, universe, Q),
+  ppl_Grid_add_congruences(Q, [A =:= 0, B =:= 2, C =:= 1]),
+  ppl_Grid_equals_Grid(P, Q),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q),
+  clean_ppl_new_Grid_from_space_dimension( 4, empty, P0),
+  ppl_Grid_add_grid_generators(P0, [grid_point(2*C), grid_line(A+B), parameter(A+C)]),
+  \+ppl_Grid_map_space_dimensions(P0, [A+C, C-A, B-B]), % A+C not map
+  \+ppl_Grid_map_space_dimensions(P0, [A, C-A, B-B]),   % A not map
+  \+ppl_Grid_map_space_dimensions(P0, [D-A, C-A, B-B]), % D not dimension
+  \+ppl_Grid_map_space_dimensions(P0, [B-A, C-A, B-B]), % not injective
+  \+ppl_Grid_map_space_dimensions(P0, [B-A, C-A, B-C]), % not function
+  ppl_delete_Grid(P0),
+  clean_ppl_new_Grid_from_space_dimension( 4, empty, P1),
+  ppl_Grid_add_grid_generators(P1,
+     [grid_point(2*C), grid_line(A+B), parameter(A+C)]),
+  ppl_Grid_map_space_dimensions(P1, [A-C, C-A, B-B]),
+  clean_ppl_new_Grid_from_space_dimension( 3, empty, Q1),
+  ppl_Grid_add_grid_generators(Q1,
+     [grid_point(2*A), parameter(A+C), grid_line(B+C)]),
+  ppl_Grid_equals_Grid(P1, Q1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(Q1),
+  clean_ppl_new_Grid_from_space_dimension( 5, universe, P2),
+  ppl_Grid_add_constraints(P2, [B = 2, E = 8]),
+  ppl_Grid_add_space_dimensions_and_embed(P2, 2),
+  ppl_Grid_map_space_dimensions(P2, [A-A, B-B, C-E, D-F, E-G, F-C, G-D]),
+  clean_ppl_new_Grid_from_space_dimension( 7, universe, Q2),
+  ppl_Grid_add_constraints(Q2, [B = 2, G = 8]),
+  ppl_Grid_equals_Grid(P2, Q2),
+  !,
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(Q2).
+
+
+%%%%%%%%%%%%%%%%%% Affine Transformations %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_affine_image/4.
+grid_affine_image :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_constraint(P, A - B = 1),
+  clean_ppl_new_Grid_from_constraints(
+                                      [A - B = 1],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  ppl_Grid_affine_image(P, A, A + 1, 1),
+  clean_ppl_new_Grid_from_constraints(
+                                      [A - B = 2],
+                                      P2),
+  ppl_Grid_equals_Grid(P, P2),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_affine_preimage/4.
+grid_affine_preimage :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_congruence(P, A + B =:= 10),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A + B =:= 10],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  ppl_Grid_affine_preimage(P, A, A + 1, 1),
+  clean_ppl_new_Grid_from_congruences(
+                                      [A + B =:= 9],
+                                      P2),
+  ppl_Grid_equals_Grid(P, P2),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_generalized_affine_image/5.
+grid_affine_image_gen :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_congruence(P, A =:= 0),
+  ppl_Grid_add_congruence(P, (A + B =:= 0) / 2),
+  ppl_Grid_generalized_affine_image(P, A, =, A + 1, 1, 1),
+  clean_ppl_new_Grid_from_generators(
+        [grid_point(0), grid_point(A - B), grid_point(B)],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_generalized_affine_image/5.
+grid_affine_preimage_gen :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_congruence(P, A =:= 0),
+  ppl_Grid_add_congruence(P, (A + B =:= 0) / 2),
+  ppl_Grid_generalized_affine_preimage(P, B, =, A + 1, 2, 3),
+  clean_ppl_new_Grid_from_generators(
+        [grid_point(-3*A), grid_point(A), grid_point(-A), grid_line(B)],
+                                      P1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_generalized_affine_image_lhs_rhs/4.
+grid_affine_image_genlr :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  ppl_Grid_add_congruences(P, [(C =:= 0)/ 3, (A - 2*B =:= 1)/ 0]),
+  ppl_Grid_generalized_affine_image_lhs_rhs(P, A - B + C, =, 2*A - B - C, 5),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+% % Tests ppl_Grid_generalized_affine_preimage_lhs_rhs/4.
+grid_affine_preimage_genlr :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P),
+  ppl_Grid_add_constraint(P, A - B = 0),
+  ppl_Grid_generalized_affine_preimage_lhs_rhs(P, A-B, =, A, 0),
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P1),
+  ppl_Grid_add_constraint(P1, A = 0),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P),
+
+  clean_ppl_new_Grid_from_space_dimension( 2, universe, P2),
+  ppl_Grid_add_congruences(P2, [A =:= 0, (B =:= 0)/ 2]),
+  ppl_Grid_generalized_affine_preimage_lhs_rhs(P2, A + 2*B, =, A - B, 3),
+  clean_ppl_new_Grid_from_space_dimension( 2, empty, P3),
+  ppl_Grid_add_grid_generators(P3,
+           [grid_point(0), grid_point(A), grid_line(A + B)]),
+  ppl_Grid_equals_Grid(P2, P3),
+  !,
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P3).
+
+%%%%%%%%%%%%%%%%%% Get Congruence or Generator System %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_get_congruences/2.
+grid_get_cons :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension(2, universe, P),
+  ppl_Grid_get_congruences(P, []),
+  ppl_Grid_add_congruence(P, A - B =:= 1),
+  \+  ppl_Grid_get_congruences(P, []),
+  ppl_Grid_get_congruences(P, [C]),
+  clean_ppl_new_Grid_from_congruences([C], Q),
+  ppl_Grid_equals_Grid(P, Q),
+  ppl_Grid_add_congruence(P, A - B = 1),
+  ppl_Grid_get_congruences(P, C1),
+  clean_ppl_new_Grid_from_congruences(C1, Q1),
+  ppl_Grid_equals_Grid(P, Q1),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q),
+  ppl_delete_Grid(Q1).
+
+% Tests ppl_Grid_get_minimized_congruences/2.
+grid_get_min_cons :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension(2, universe, P),
+  ppl_Grid_get_minimized_congruences(P, []),
+  ppl_Grid_add_congruences(P, [A - B =:= 1, A - B =:= 3, (A + B =:= 0)/3]),
+  ppl_Grid_get_minimized_congruences(P, [C1, C2]),
+  clean_ppl_new_Grid_from_congruences([C1, C2], Q),
+  ppl_Grid_equals_Grid(P, Q),
+  ppl_Grid_add_congruences(P, [(A + B =:= 1)/3]),
+%  \+ppl_Grid_get_minimized_congruences(P, _),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+% Tests ppl_Grid_get_grid_generators/2.
+grid_get_gens :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension(2, empty, P),
+  ppl_Grid_get_grid_generators(P, []),
+  \+ ppl_Grid_get_grid_generators(P, [_]),
+  ppl_Grid_add_grid_generator(P, grid_point(A+B)),
+  ppl_Grid_get_grid_generators(P, [G]),
+  clean_ppl_new_Grid_from_generators([G], Q),
+  ppl_Grid_equals_Grid(P, Q),
+  ppl_Grid_add_grid_generator(P, grid_point(A+B, 2)),
+  ppl_Grid_get_grid_generators(P, GS1),
+  ppl_Grid_add_grid_generators(Q, GS1),
+  ppl_Grid_equals_Grid(P, Q),
+  ppl_Grid_add_grid_generator(P, grid_line(A)),
+  ppl_Grid_get_grid_generators(P, GS2),
+  ppl_Grid_add_grid_generators(Q, GS2),
+  ppl_Grid_equals_Grid(P, Q),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+% Tests ppl_Grid_get_minimized_grid_generators/2.
+grid_get_min_gens :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension(2, empty, P),
+  ppl_Grid_add_grid_generators(P,
+     [grid_point(0), grid_point(2*A), grid_point(A+B), grid_point(2*B)]),
+  \+ ppl_Grid_get_minimized_grid_generators(P, [_]),
+  ppl_Grid_get_minimized_grid_generators(P, [G1, G2, G3]),
+  clean_ppl_new_Grid_from_generators([G1, G2, G3], Q),
+  ppl_Grid_equals_Grid(P, Q),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+
+%%%%%%%%%%%%%%%%%% Grid Relations %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_relation_with_congruence/3.
+grid_rel_cons :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  ppl_Grid_add_congruences(P, [(A =:= 1) / 3, B =:= 0, (C =:= 0) / 0]),
+  \+ ppl_Grid_relation_with_congruence(P, (A =:= 0)/0, x),
+  ppl_Grid_relation_with_congruence(P, (A =:= 0)/0, R),
+  R = [is_disjoint],
+  ppl_Grid_relation_with_congruence(P, (B =:= 0) / 0, R1),
+  R1 = [strictly_intersects],
+  ppl_Grid_relation_with_congruence(P, A =:= 0, R2),
+  R2 = [is_included],
+  ppl_Grid_relation_with_congruence(P, C =:= 0, R3),
+  R3 = [is_included],
+  ppl_Grid_add_constraint(P, A = B + 1),
+  ppl_Grid_relation_with_congruence(P, (A =:= B + 1) / 0, R4),
+  (R4 = [is_included, saturates] ; R4 = [saturates, is_included]),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_relation_with_grid_generator/3.
+grid_rel_gens :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, P),
+  ppl_Grid_add_grid_generators(P, [grid_point(A + B + C), parameter(A)]),
+  \+ppl_Grid_relation_with_grid_generator(P, grid_point(A), x),
+  ppl_Grid_relation_with_grid_generator(P, grid_point(A), R),
+  R = [],
+  ppl_Grid_relation_with_grid_generator(P, parameter(A), R1),
+  R1 = [subsumes],
+  !,
+  ppl_delete_Grid(P).
+
+%%%%%%%%%%%%%%%%%% Check Properties %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%  tests ppl_Grid_is_universe/1,
+%        ppl_Grid_is_empty/1,
+%        ppl_Grid_is_bounded/1,
+%        ppl_Grid_is_discrete/1,
+%        ppl_Grid_is_topologically_closed/1.
+grid_checks :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, P1),
+  ppl_Grid_is_universe(P),
+  ppl_Grid_is_empty(P1),
+  \+ ppl_Grid_is_universe(P1),
+  \+ ppl_Grid_is_empty(P),
+  ppl_Grid_add_grid_generators(P1, [grid_point(A + B + C)]),
+  ppl_Grid_is_bounded(P1),
+  ppl_Grid_is_discrete(P1),
+  ppl_Grid_add_grid_generators(P1, [parameter(A + B + C)]),
+  \+ ppl_Grid_is_bounded(P1),
+  ppl_Grid_is_discrete(P1),
+  ppl_Grid_add_congruences(P, [(A =:= 1)/0, (B =:= 1)/0, (C =:= 1)/0]),
+  ppl_Grid_is_topologically_closed(P),
+  ppl_Grid_add_grid_generators(P1, [grid_line(A + B + C)]),
+  \+ ppl_Grid_is_bounded(P1),
+  \+ ppl_Grid_is_discrete(P1),
+  ppl_Grid_is_topologically_closed(P),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+% Tests ppl_Grid_contains_Grid/2.
+grid_contains :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, P2),
+  ppl_Grid_contains_Grid(P1, P2),
+  \+ppl_Grid_contains_Grid(P2, P1),
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2).
+
+% Tests ppl_Grid_strictly_contains_Grid for C/2.
+grid_strict_contains :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, P2),
+  ppl_Grid_strictly_contains_Grid(P1, P2),
+  \+ppl_Grid_strictly_contains_Grid(P1, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2).
+
+% Tests ppl_Grid_is_disjoint_from_Grid/2.
+grid_disjoint_from :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Grid_from_congruences([(3 =:= A) / 5, 4*A + B - 2*C =:= 5],
+                                      P1),
+  clean_ppl_new_Grid_from_congruences([(4 =:= A) / 5, 4*A + B - 2*C =:= 5],
+                                      P2),
+  ppl_Grid_is_disjoint_from_Grid(P1, P2),
+  \+ppl_Grid_is_disjoint_from_Grid(P1, P1),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2).
+
+% Tests ppl_Grid_equals_Grid/2.
+grid_equals :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P2),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, P3),
+  ppl_Grid_equals_Grid(P1, P2),
+  \+ ppl_Grid_equals_Grid(P1, P3),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P3).
+
+% Tests ppl_Grid_OK/1.
+grid_ok :-
+  clean_ppl_new_Grid_from_space_dimension(0, universe, P1),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P2),
+  clean_ppl_new_Grid_from_space_dimension(0, empty, P3),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, P4),
+  ppl_Grid_OK(P1),
+  ppl_Grid_OK(P2),
+  ppl_Grid_OK(P3),
+  ppl_Grid_OK(P4),
+  !,
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2),
+  ppl_delete_Grid(P3),
+  ppl_delete_Grid(P4).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Grid Bounding Values %%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_get_bounding_box/3.
+
+grid_get_bounding_box :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension(2, universe, P),
+  ppl_Grid_get_bounding_box(P, any, Box),
+  clean_ppl_new_Grid_from_bounding_box(Box, P1),
+  ppl_Grid_equals_Grid(P1, P),
+  ppl_Grid_add_constraints(P, [A = 1, B = 2]),
+  ppl_Grid_get_bounding_box(P, any, Box1),
+  clean_ppl_new_Grid_from_bounding_box(Box1, P2),
+  ppl_Grid_equals_Grid(P, P2),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2).
+
+% Tests ppl_Grid_get_covering_box/3.
+
+grid_get_covering_box :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_space_dimension(2, universe, P),
+  ppl_Grid_get_covering_box(P, Box),
+  clean_ppl_new_Grid_from_covering_box(Box, P1),
+  ppl_Grid_equals_Grid(P1, P),
+  ppl_Grid_add_congruences(P, [A =:= 1, B =:= 2]),
+  ppl_Grid_get_covering_box(P, Box1),
+  clean_ppl_new_Grid_from_covering_box(Box1, P2),
+  ppl_Grid_equals_Grid(P, P2),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1),
+  ppl_delete_Grid(P2).
+
+% Tests ppl_Grid_bounds_from_above/2 and ppl_Grid_bounds_from_below/2.
+grid_bounds_from_above :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_congruences([A =:= 1, B =:= 0], P),
+  \+ ppl_Grid_bounds_from_above(P, B),
+  ppl_Grid_add_constraints(P, [B = 2]),
+  ppl_Grid_bounds_from_above(P, B),
+  !,
+  ppl_delete_Grid(P).
+
+grid_bounds_from_below :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_congruences([A =:= 1, B =:= 0], P),
+  \+ ppl_Grid_bounds_from_below(P, B),
+  ppl_Grid_add_constraints(P, [B = 2]),
+  ppl_Grid_bounds_from_below(P, B),
+  ppl_Grid_bounds_from_below(P, B),
+  !,
+  ppl_delete_Grid(P).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Maximize and Minimize %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_maximize/5.
+grid_maximize :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_constraints([A = 0, B = 0], P),
+  ppl_Grid_maximize(P, A + B, 0, 1, true),
+  ppl_Grid_add_grid_generator(P, parameter(A + B)),
+  \+ ppl_Grid_maximize(P, A + B, _, _, _),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_maximize/5.
+grid_maximize_with_point :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_constraints([A = 0, B = 0], P),
+  ppl_Grid_maximize_with_point(P, A + B, 0, 1, true, point(0)),
+  ppl_Grid_add_grid_generator(P, parameter(A + B)),
+  \+ ppl_Grid_maximize_with_point(P, A + B, _, _, _, _),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_minimize/5.
+grid_minimize :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_constraints([A = 0, B = 0], P),
+  ppl_Grid_minimize(P, A + B, 0, 1, true),
+  ppl_Grid_add_grid_generator(P, parameter(A + B)),
+  \+ ppl_Grid_minimize(P, A + B, _, _, _),
+  !,
+  ppl_delete_Grid(P).
+
+% Tests ppl_Grid_minimize/5.
+grid_minimize_with_point :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Grid_from_constraints([A = 0, B = 0], P),
+  ppl_Grid_minimize_with_point(P, A + B, 0, 1, true, point(0)),
+  ppl_Grid_add_grid_generator(P, parameter(A + B)),
+  \+ ppl_Grid_minimize_with_point(P, A + B, _, _, _, _),
+  !,
+  ppl_delete_Grid(P).
+
+%%%%%%%%%%%%%%%%%% Widen and Extrapolation Operators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Grid_congruence_widening_assign/2.
+grid_widen_congruence :-
+  make_vars(3, [A, B, C]),
+  grid_widen_extrapolation_init(P, [(A =:= 0) / 2, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_init(Q, [(A =:= 0) / 2, C =:= 0]),
+  ppl_Grid_congruence_widening_assign(Q, P),
+  grid_widen_extrapolation_final(P, [(A =:= 0) / 2, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_final(Q, [(A =:= 0) / 2, C =:= 0]).
+
+% Tests ppl_Grid_congruence_widening_assign_with_tokens/4.
+grid_widen_congruence_with_tokens :-
+  make_vars(3, [A, B, C]),
+  grid_widen_extrapolation_init(P, [(A =:= 0) / 2, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_init(Q, [(A =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_init(R, [(A =:= 0) / 1, C =:= 0]),
+  \+ ppl_Grid_congruence_widening_assign_with_tokens(Q, P, 4, 3),
+  \+ ppl_Grid_congruence_widening_assign_with_tokens(Q, P, 4, not_a_number),
+  ppl_Grid_congruence_widening_assign_with_tokens(Q, P, 5, 5),
+  ppl_Grid_congruence_widening_assign_with_tokens(R, Q, 1, 0),
+  grid_widen_extrapolation_final(P, [(A =:= 0) / 2, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_final(Q, [(A =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_final(R, [(A =:= 0) / 1, C =:= 0]).
+
+% Tests ppl_Grid_limited_congruence_extrapolation_assign/3.
+grid_lim_extrapolate_congruence :-
+  make_vars(3, [A, B, C]),
+  grid_widen_extrapolation_init(P, [(A =:= 0) / 4, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_init(Q, [(A =:= 0) / 2, (B =:= 0) / 2, C =:= 0]),
+  ppl_Grid_limited_congruence_extrapolation_assign(Q, P, [(A =:= 0) / 2]),
+  grid_widen_extrapolation_final(P, [(A =:= 0) / 4, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_final(Q, [(A =:= 0) / 2, (B =:= 0) / 2, C =:= 0]).
+
+% Tests ppl_Grid_limited_congruence_extrapolation_assign_with_tokens/5.
+grid_lim_extrapolate_congruence_with_tokens :-
+  make_vars(3, [A, B, C]),
+  grid_widen_extrapolation_init(P, [(A =:= 0) / 4, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_init(Q, [(A =:= 0) / 2, (B =:= 0) / 2]),
+  grid_widen_extrapolation_init(R, [(A =:= 0) / 1, (B =:= 0) / 2]),
+  \+ ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(Q, P,
+                                                  [(A =:= 0) / 2], 4, 4),
+  \+ ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(Q, P,
+                                    [(A =:= 0) / 2],  3, not_a_number),
+  ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(Q, P,
+                                                  [(A =:= 0) / 2], 4, 3),
+  ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(R, Q,
+                                                      [(A =:= 0) / 1], 2, 1),
+  grid_widen_extrapolation_final(P, [(A =:= 0) / 4, (B =:= 0) / 2, C =:= 0]),
+  grid_widen_extrapolation_final(Q, [(A =:= 0) / 2, (B =:= 0) / 2]),
+  grid_widen_extrapolation_final(R, [(A =:= 0) / 1, (B =:= 0) / 2]).
+
+% Tests ppl_Grid_generator_widening_assign/2.
+grid_widen_generator :-
+  make_vars(3, [A, B, C]),
+  grid_gen_widen_extrapolation_init(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_init(R, [grid_point(A, 2), grid_point(B),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2)]),
+  ppl_Grid_generator_widening_assign(Q, P),
+  ppl_Grid_generator_widening_assign(S, R),
+  grid_gen_widen_extrapolation_final(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_final(R, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2),
+                                    grid_line(B), grid_line(C)]).
+
+% Tests ppl_Grid_generator_widening_assign_with_tokens/4.
+grid_widen_generator_with_tokens :-
+  make_vars(3, [A, B, C]),
+  grid_gen_widen_extrapolation_init(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_init(R, [grid_point(A, 2), grid_point(B),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2)]),
+  \+ ppl_Grid_generator_widening_assign_with_tokens(Q, P, 1, 0),
+  \+ ppl_Grid_generator_widening_assign_with_tokens(Q, P, 0, any),
+  ppl_Grid_generator_widening_assign_with_tokens(Q, P, 1, 1),
+  ppl_Grid_generator_widening_assign_with_tokens(S, R, 4, 4),
+  grid_gen_widen_extrapolation_final(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_final(R, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2),
+                                    grid_line(B), grid_line(C)]).
+
+% Tests ppl_Grid_generator_extrapolation_assign/2.
+grid_lim_extrapolate_generator :-
+  make_vars(3, [A, B, C]),
+  grid_gen_widen_extrapolation_init(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_init(R, [grid_point(A, 2), grid_point(B),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2)]),
+  ppl_Grid_limited_generator_extrapolation_assign(Q, P, []),
+  ppl_Grid_limited_generator_extrapolation_assign(S, R, []),
+  grid_gen_widen_extrapolation_final(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_final(R, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2),
+                                    grid_line(B), grid_line(C)]).
+
+% Tests ppl_Grid_generator_extrapolation_assign_with_tokens/4.
+grid_lim_extrapolate_generator_with_tokens :-
+  make_vars(3, [A, B, C]),
+  grid_gen_widen_extrapolation_init(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_init(R, [grid_point(A, 2), grid_point(B),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_init(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2)]),
+  \+ ppl_Grid_limited_generator_extrapolation_assign_with_tokens(Q, P, [], 1, 0),
+%  \+ ppl_Grid_limited_generator_extrapolation_assign_with_tokens(Q, P, [], any, _),
+  ppl_Grid_limited_generator_extrapolation_assign_with_tokens(Q, P, [], 1, 1),
+  ppl_Grid_limited_generator_extrapolation_assign_with_tokens(S, R,
+                                    [2*B =:= 0], 4, 4),
+  grid_gen_widen_extrapolation_final(P, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(Q, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C),
+                                    grid_point(4*C + A, 4)]),
+  grid_gen_widen_extrapolation_final(R, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C)]),
+  grid_gen_widen_extrapolation_final(S, [grid_point(A, 2), grid_point(B, 2),
+                                    grid_point(C, 2),
+                                    grid_line(C)]).
+
+% grid_widen_extrapolation_init/3 and widen_extrapolation_final/3
+% are used in the tests for widening and extrapolation predicates.
+grid_widen_extrapolation_init(P, CS):-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  ppl_Grid_add_congruences(P, CS).
+
+grid_widen_extrapolation_final(P, CS):-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  ppl_Grid_add_congruences(P1, CS),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+% grid_gen_widen_extrapolation_init/3 and grid_gen_widen_extrapolation_final/3
+% are used in the tests for widening and extrapolation predicates.
+grid_gen_widen_extrapolation_init(P, GS):-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  ppl_Grid_add_grid_generators(P, GS).
+
+grid_gen_widen_extrapolation_final(P, GS):-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P1),
+  ppl_Grid_add_grid_generators(P1, GS),
+  ppl_Grid_equals_Grid(P, P1),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(P1).
+
+%%%%%%%%%%%%%%%%% Exceptions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% grid_exceptions/0 tests both Prolog and C++ exceptions using:
+%
+% grid_exception_prolog(+N, +V)
+% grid_exception_sys_prolog(+N, +V)
+% grid_exception_cplusplus(+N, +V)
+%
+% N is the number of the test while V is a list of 3 PPL variables
+%
+% In exceptions/0, the calls to these predicates should fail
+% so that all the tests are tried on backtracking.
+% When all the tests have been tried,
+% (and, for the Prolog interface, providing the correct
+% exception message),
+% the call to exceptions/0 succeeds.
+% If one of the tests succeeds or a Prolog interface exception
+% has a wrong exception message, then exceptions/0 will fail.
+
+grid_exceptions :-
+   current_prolog_flag(bounded, Y),
+   make_vars(3, V),
+   grid_exception_prolog(V),
+    /* XSB does not throw catchable exceptions for integers out of range;
+	so call to exception_sys_prolog is not made when testing XSB.
+        The same exclusion for XSB and exception_sys_prolog/1 test is also
+        made in pl_check.pl (See log message 2007-09-19 10:29:08) */
+   ((Y == true,\+prolog_system('XSB'))  -> grid_exception_sys_prolog(V) ; true),
+   grid_exception_cplusplus(V),
+   !.
+
+
+%% TEST: Prolog_unsigned_out_of_range
+grid_exception_yap :-
+     I = 21474836470, J = 3, K = 0,
+     ppl_new_Grid_from_grid_generators(
+        [grid_point('$VAR'(I)),grid_point('$VAR'(J))], P),
+     ppl_Grid_get_grid_generators(P, GS),
+     nl, write(GS), nl,
+     ppl_new_Grid_from_grid_generators(
+        [grid_point('$VAR'(I)),grid_point('$VAR'(K))], P1),
+     ppl_Grid_get_grid_generators(P1, GS1),
+     nl, write(GS1), nl,
+     ppl_delete_Grid(P),
+     ppl_delete_Grid(P1).
+
+% exception_prolog(+N, +V) checks exceptions thrown by the Prolog interface.
+% It does not check those that are dependent on a specific Prolog system.
+
+grid_exception_prolog(V) :-
+   grid_exception_prolog1(10, V).
+
+grid_exception_prolog1(0, _) :- !.
+grid_exception_prolog1(N, V) :-
+   grid_exception_prolog(N, V),
+   N1 is N - 1,
+   grid_exception_prolog1(N1, V).
+
+%% TEST: Prolog_unsigned_out_of_range
+grid_exception_prolog(1, _) :-
+    pl_check_prolog_flag(bounded, Y),
+   (Y == true ->
+     true
+    ;
+     (I = 21474836470,
+     must_catch(ppl_new_Grid_from_grid_generators([grid_point('$VAR'(I))], _))
+      )
+   ).
+
+%% TEST: not_unsigned_integer
+grid_exception_prolog(2, _) :-
+  must_catch(ppl_new_Grid_from_grid_generators([grid_point('$VAR'(n))], _)),
+  must_catch(ppl_new_Grid_from_grid_generators([grid_point('$VAR'(-1))], _)).
+
+%% TEST: not_unsigned_integer
+grid_exception_prolog(3, _) :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, Q),
+  must_catch(ppl_Grid_congruence_widening_assign_with_tokens(
+             Q, P, -1, _X)),
+  must_catch(ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _X)),
+  must_catch(ppl_Grid_generator_widening_assign_with_tokens(
+             Q, P, -1, _X)),
+  must_catch(ppl_Grid_limited_generator_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _X)),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+%% TEST: non_linear
+grid_exception_prolog(4, [A,B,C]) :-
+  must_catch(ppl_new_Grid_from_grid_generators([grid_point(B + A*C)], _)),
+  must_catch(ppl_new_Grid_from_grid_generators(
+                     [grid_point(C), parameter(B + C, _)], _)),
+  must_catch(ppl_new_Grid_from_grid_generators(
+                     [grid_point], _)),
+  must_catch(ppl_new_Grid_from_grid_generators(
+                     [grid_point(_D)], _)),
+  must_catch(ppl_new_Grid_from_constraints(
+                     [_E >= 3], _)),
+  must_catch(ppl_new_Grid_from_constraints(
+                     [A*B = 0], _)),
+  must_catch(ppl_new_Grid_from_constraints(
+                     [A], _)).
+
+%% TEST: not_a_variable
+grid_exception_prolog(5, [A,_,_]) :-
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  must_catch(ppl_Grid_remove_space_dimensions(P, [A,1])),
+  !,
+  ppl_delete_Grid(P).
+
+%% TEST: not_an_integer
+grid_exception_prolog(6, [A,B,_]) :-
+  clean_ppl_new_Grid_from_generators(
+               [grid_point(A + B), parameter(A), parameter(B)], P),
+  must_catch(ppl_Grid_affine_image(P, A, A + B + 1, i)),
+  !,
+  ppl_delete_Grid(P).
+
+%% TEST: not_a_grid_handle
+grid_exception_prolog(7, _) :-
+  must_catch(ppl_Grid_space_dimension(_, _N)).
+
+%% TEST: not_universe_or_empty
+grid_exception_prolog(8, _) :-
+  must_catch(ppl_new_Grid_from_space_dimension(3, xxx, _)).
+
+%% TEST: not_relation
+grid_exception_prolog(9, [A, B, _]) :-
+  clean_ppl_new_Grid_from_generators(
+               [grid_point(A)], P),
+  must_catch(ppl_Grid_generalized_affine_image(P, A, x, A + 1, 1)),
+  must_catch(
+     ppl_Grid_generalized_affine_image_lhs_rhs(P, B - 1, x, A + 1)),
+  must_catch(
+     ppl_Grid_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1)).
+
+%% TEST: not_a_nil_terminated_list
+grid_exception_prolog(10, [A, B, C]) :-
+  must_catch(ppl_new_Grid_from_grid_generators(
+     [grid_point(A + B + C, 1) | not_a_list], _)),
+  must_catch(ppl_new_Grid_from_constraints(
+     [A = 0 | not_a_list], _)),
+  must_catch(ppl_new_Grid_from_bounding_box(0, 0)),
+  must_catch(ppl_new_Grid_from_bounding_box(
+             [i(c(-3), c(2/1)), i(c(2), c(8)) | d], _)),
+  must_catch(ppl_new_Grid_from_covering_box(
+             [i(c(-4), c(2/1)), i(c(1), c(2)) | _], _)),
+  clean_ppl_new_Grid_from_space_dimension(3, universe, P),
+  must_catch(ppl_Grid_add_congruences(P, _)),
+  must_catch(ppl_Grid_add_congruences(P, not_a_list)),
+  must_catch(ppl_Grid_add_grid_generators(P, not_a_list)),
+  must_catch(ppl_Grid_add_grid_generators(P, _)),
+  clean_ppl_new_Grid_from_space_dimension(3, empty, Q),
+  must_catch(ppl_Grid_map_space_dimensions(Q, not_a_list)),
+  must_catch(ppl_Grid_fold_space_dimensions(Q, not_a_list, B)),
+  must_catch(ppl_Grid_remove_space_dimensions(Q, not_a_list)),
+  must_catch(ppl_Grid_limited_generator_extrapolation_assign(
+             Q, P, not_a_list)),
+  must_catch(ppl_Grid_limited_generator_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _)),
+  must_catch(ppl_Grid_limited_congruence_extrapolation_assign(
+
+             Q, P, not_a_list)),
+  must_catch(ppl_Grid_limited_congruence_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _)),
+  !,
+  ppl_delete_Grid(P),
+  ppl_delete_Grid(Q).
+
+% grid_exception_sys_prolog(+N, +V)
+% checks exceptions thrown by Prolog interfaces
+% that are dependent on a specific Prolog system.
+% These are only checked if current_prolog_flag(bounded, true) holds.
+
+grid_exception_sys_prolog(V) :-
+   grid_exception_sys_prolog1(4, V).
+
+grid_exception_sys_prolog1(0, _) :- !.
+grid_exception_sys_prolog1(N, V) :-
+   grid_exception_sys_prolog(N, V),
+   N1 is N - 1,
+   grid_exception_sys_prolog1(N1, V).
+
+grid_exception_sys_prolog(1, [A,B,_]) :-
+  pl_check_prolog_flag(max_integer, Max_Int),
+  catch((
+          clean_ppl_new_Grid_from_congruences(
+               [Max_Int * A - B =:= 0], P),
+          ppl_Grid_affine_image(P, B, 2*B, 1),
+          must_catch(ppl_Grid_get_grid_generators(P, _GS)),
+          !,
+          ppl_delete_Grid(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+ grid_exception_sys_prolog(2, [A,B,_]) :-
+  pl_check_prolog_flag(min_integer, Min_Int),
+  catch((
+          clean_ppl_new_Grid_from_congruences(
+               [Min_Int * A - B =:= 0], P),
+          ppl_Grid_affine_image(P, B, 2*B, 1),
+          must_catch(ppl_Grid_get_grid_generators(P, _GS)),
+          !,
+          ppl_delete_Grid(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+grid_exception_sys_prolog(3, [A,B,_]) :-
+  pl_check_prolog_flag(max_integer, Max_Int),
+  catch((
+          clean_ppl_new_Grid_from_generators(
+               [grid_point(Max_Int * A + B)], P),
+          ppl_Grid_affine_image(P, A, A + 1, 1),
+          must_catch(ppl_Grid_get_grid_generators(P, _GS)),
+          !,
+          ppl_delete_Grid(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+grid_exception_sys_prolog(4, [A,B,_]) :-
+  pl_check_prolog_flag(min_integer, Min_Int),
+  catch((
+          clean_ppl_new_Grid_from_generators(
+               [grid_point(Min_Int * A + B)], P),
+          ppl_Grid_affine_image(P, A, A - 1, 1),
+          must_catch(ppl_Grid_get_grid_generators(P, _GS)),
+          !,
+          ppl_delete_Grid(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+% grid_exception_cplusplus(+N, +V) checks exceptions thrown by the C++
+% interface for the PPL.
+
+grid_exception_cplusplus(V) :-
+   grid_exception_cplusplus1(10, V).
+
+grid_exception_cplusplus1(0, _) :- !.
+grid_exception_cplusplus1(N, V) :-
+   grid_exception_cplusplus(N, V),
+   N1 is N - 1,
+   grid_exception_cplusplus1(N1, V).
+
+grid_exception_cplusplus(1, [A,B,C]) :-
+  must_catch(ppl_new_Grid_from_grid_generators([grid_point(A + B + C, 0)], _)).
+
+grid_exception_cplusplus(2, [A,B,_]) :-
+  clean_ppl_new_Grid_from_generators(
+               [grid_point(A + B), parameter(A), parameter(B)], P),
+  must_catch(ppl_Grid_affine_image(P, A, A + B + 1, 0)),
+  !,
+  ppl_delete_Grid(P).
+
+grid_exception_cplusplus(4, [A,B,C]) :-
+   must_catch(ppl_new_Grid_from_grid_generators([grid_line(A + B + C)], _)).
+
+grid_exception_cplusplus(5, [A,B,C]) :-
+  clean_ppl_new_Grid_from_generators([grid_point(B + 2*C)], P),
+  ppl_Grid_remove_space_dimensions(P,[C]),
+  must_catch(ppl_Grid_remove_space_dimensions(P,[A,C])),
+  !,
+  ppl_delete_Grid(P).
+
+grid_exception_cplusplus(6, [A,B,_]) :-
+  clean_ppl_new_Grid_from_congruences([A =:= 1], P),
+  must_catch(ppl_Grid_affine_image(P, B, A + 1, 1)),
+  !,
+  ppl_delete_Grid(P).
+
+grid_exception_cplusplus(7, [A, B, C]) :-
+  clean_ppl_new_Grid_from_congruences([A =:= 1, B =:= 1], P),
+  must_catch(ppl_Grid_affine_image(P, B, A + C + 1, 1)),
+  !,
+  ppl_delete_Grid(P).
+
+grid_exception_cplusplus(8, [A,B,_]) :-
+  clean_ppl_new_Grid_from_congruences([A =:= B], P),
+  must_catch(ppl_Grid_affine_preimage(P, A, A + B + 1, 0)),
+  !,
+  ppl_delete_Grid(P).
+
+grid_exception_cplusplus(9, [A, B, C]) :-
+  clean_ppl_new_Grid_from_generators(
+               [grid_point(0), parameter(A + B), parameter(A)], P),
+  must_catch(ppl_Grid_affine_preimage(P, C, A + 1, 1)),
+  !,
+  ppl_delete_Grid(P).
+
+
+grid_exception_cplusplus(10, [A, B, C]) :-
+  clean_ppl_new_Grid_from_generators(
+               [grid_point(0), grid_point(A), grid_line(A + B)], P),
+  must_catch(ppl_Grid_affine_preimage(P, B, A + C, 1)),
+  !,
+  ppl_delete_Grid(P).
+
+
+% must_catch(+Call) calls Call using catch and checks exception.
+% If exception it succeeds and fails if there is no exception caught.
+
+must_catch(Call) :-
+   ( catch(Call, M0, check_exception(M0) ) -> fail ; true).
+
+% check_exception(+Exception) checks and prints the exception message;
+% and then fails.
+
+check_exception(Exception):-
+         format_exception_message(Exception), fail.
+
+%%%%%%%%%%%% predicate for making list of ppl variables %%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I = Dimension.
+
+make_vars(Dim, Var_List):-
+  make_var_list(0, Dim, Var_List).
+make_var_list(Dim,Dim,[]):- !.
+make_var_list(I,Dim,['$VAR'(I)|Var_List]):-
+  I1 is I + 1,
+  make_var_list(I1,Dim,Var_List).
+
+%%%%%%%%%%%% predicate for safely deleting polyhedra on failure %
+
+cleanup_ppl_Polyhedron(_).
+cleanup_ppl_Polyhedron(P) :-
+  out(cs, P),
+  out(gs, P),
+  ppl_delete_Polyhedron(P), fail.
+
+cleanup_ppl_Polyhedra([]).
+cleanup_ppl_Polyhedra([_|_]).
+cleanup_ppl_Polyhedra([P|Ps]) :-
+  delete_all_ppl_Polyhedra([P|Ps]).
+
+delete_all_ppl_Polyhedra([]).
+delete_all_ppl_Polyhedra([P|Ps]) :-
+  ppl_delete_Polyhedron(P),
+  delete_all_ppl_Polyhedra(Ps).
+
+cleanup_ppl_MIP_Problem(_).
+cleanup_ppl_MIP_Problem(MIP) :-
+  out(mip, MIP),
+  ppl_delete_MIP_Problem(MIP), fail.
+
+cleanup_ppl_Grid(_).
+cleanup_ppl_Grid(GR) :-
+%%  out(cgs, GR),
+%%  out(ggs, GR),
+  ppl_delete_Grid(GR), fail.
+
+out(cs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Polyhedron_get_constraints(P, CS),
+    nl, write(CS), nl
+  ).
+
+out(gs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Polyhedron_get_grid_generators(P, GS),
+    nl, write(GS), nl
+  ).
+
+out(mip, MIP):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_MIP_Problem_constraints(MIP, CS),
+    ppl_MIP_Problem_objective_function(MIP, Obj),
+    ppl_MIP_Problem_optimization_mode(MIP, Opt),
+    nl,
+    write(' constraint system is: '), write(CS), nl,
+    write(' objective function is: '), write(Obj), nl,
+    write(' optimization mode is: '), write(Opt),
+    nl
+  ).
+
+out(cgs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Grid_get_congruences(P, CS),
+    nl, write(CS), nl
+  ).
+
+out(ggs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Grid_get_grid_generators(P, GS),
+    nl, write(GS), nl
+  ).
+
+out(sys_large_int, init):-
+  !,
+  prolog_system(System),
+  ((noisy(N), N < 2) -> true ;
+    nl, write_all([' At the Prolog/C++ interface, for', System, 'Prolog', nl,
+       ' the extra numbers tested are: ']),
+    nl
+  ).
+
+out(sys_large_int, Num):-
+  ((noisy(N), N < 2) -> true ;
+      write_all([Num, ',  '])
+  ).
+
+out(large_int, init):-
+  !,
+  ((noisy(N), N < 2) -> true ;
+    nl, write(' At the Prolog/C++ interface, the numbers tested are: '),
+    nl
+  ).
+
+out(large_int, Num, Sign, Add, Exp):-
+  ((noisy(N), N < 2) -> true ;
+    write_all([Num, ' = ', Sign, ' * ', '((1 << ', Exp, ') + ', Add, '),  '])
+  ).
+
+%%% predicates for ensuring new grids are always deleted on failure %
+
+clean_ppl_new_Grid_from_space_dimension(D, Universe_or_Empty, P) :-
+  ppl_new_Grid_from_space_dimension(D, Universe_or_Empty, P),
+  cleanup_ppl_Grid(P).
+
+clean_ppl_new_Grid_from_congruences(CS, P) :-
+  ppl_new_Grid_from_congruences(CS, P),
+  cleanup_ppl_Grid(P).
+
+clean_ppl_new_Grid_from_constraints(CS, P) :-
+  ppl_new_Grid_from_constraints(CS, P),
+  cleanup_ppl_Grid(P).
+
+clean_ppl_new_Grid_from_generators(GS, P) :-
+  ppl_new_Grid_from_grid_generators(GS, P),
+  cleanup_ppl_Grid(P).
+
+clean_ppl_new_Grid_from_Grid(Q, P) :-
+  ppl_new_Grid_from_Grid(Q, P),
+  cleanup_ppl_Grid(P).
+
+clean_ppl_new_Grid_from_bounding_box(Box, P) :-
+  ppl_new_Grid_from_bounding_box(Box, P),
+  cleanup_ppl_Grid(P).
+
+clean_ppl_new_Grid_from_covering_box(Box, P) :-
+  ppl_new_Grid_from_covering_box(Box, P),
+  cleanup_ppl_Grid(P).
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+  (retract(noisy(_)) ->
+      make_extra_noisy
+  ;
+      assertz(noisy(2))
+  ).
+
+make_noisy :-
+  (retract(noisy(_)) ->
+      make_noisy
+  ;
+      assertz(noisy(1))
+  ).
+
+make_quiet :-
+  (retract(noisy(_)) ->
+      make_quiet
+   ; assertz(noisy(0))
+  ).
+
+%%%%%%%%%%%% predicates for pretty printing the PPL banner %%%%%%%%%%
+%
+% The banner is read as an atom with"/n" denoting where there should
+% new lines. Here we print the banner as intended with new lines instead
+% of "/n".
+%
+
+banner_pp(B) :-
+  name(B,Bcodes),
+  nl,
+  !,
+  format_banner(Bcodes).
+
+format_banner([]) :- nl.
+format_banner([C]) :- put_code(C), nl.
+format_banner([C,C1|Chars]):-
+  ([C,C1] == "/n" ->
+     (nl,
+     format_banner(Chars))
+   ;
+     (put_code(C),
+     format_banner([C1|Chars]))
+  ).
+
+%%%%%%%%%%%% predicate for handling an unintended exception %%%%
+
+check_exception_term(ppl_overflow_error(Cause)) :-
+  ((Cause == 'Negative overflow.'; Cause == 'Positive overflow.') ->
+    true
+  ;
+    print_exception_term(ppl_overflow_error(Cause))
+  ),
+  !.
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  write('exception'), nl,
+  nl,
+  writeq(Exception),
+  nl.
+
+%%%%%%%%%%%% predicate for printing exception messages %%%%%%%%%%
+
+format_exception_message(
+             ppl_invalid_argument( found(F), expected(E), where(W))
+                        ) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   F, 'is an invalid argument for', W, nl, '   ',
+                  F, 'should be', E, '.']).
+
+format_exception_message(
+             ppl_representation_error(I, where(W))
+                        ) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   'This Prolog system has bounded integers', nl, '   ',
+                   I, 'is not in the allowed range of integers', nl, '   ',
+                   'in call to', W, '.']).
+
+format_exception_message(Error) :-
+  display_message([Error]).
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+   write_all(Message),
+   fail.
+
+display_message(Message):-
+    noisy(_),
+    (noisy(0) -> true ;
+     (nl, write_all(Message))
+    ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+   (Phrase == nl ->
+      nl
+   ;
+      (write(Phrase),
+      write(' '))
+   ),
+   write_all(Phrases).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% list_groups(G)
+% The interface predicates are partitioned into related sets called
+% groups and here is a list of the groups.
+
+list_groups( [
+   grid_from_dimension,
+   grid_from_grid,
+   grid_from_representation,
+   swap_grids,
+   grid_dimension,
+   grid_basic_operators,
+   grid_add_to_system,
+   grid_transform,
+   grid_revise_dimensions,
+   grid_get_system,
+   check_grid,
+   minmax_grid,
+   compare_grids,
+   grid_extrapolation_operators,
+   grid_handle_exceptions
+             ] ).
+
+% group_predicates(G, P)
+% P is a list of the interface predicates checked by test for group G.
+% This is used to generate more informative error and exception messages.
+
+group_predicates(grid_from_dimension,
+  [ppl_new_Grid_from_space_dimension/3,
+   ppl_Grid_is_universe/1,
+   ppl_Grid_is_empty/1,
+   ppl_delete_grid/1
+  ]).
+
+group_predicates(grid_from_grid,
+  [ppl_new_Grid_from_Grid/2,
+   ppl_new_Grid_from_congruences/2,
+   ppl_Grid_equals_Grid/2
+  ]).
+
+group_predicates(new_grid_from_representations,
+  [ppl_new_Grid_from_congruences/2,
+   ppl_new_Grid_from_constraints/2,
+   ppl_new_Grid_from_generators/2,
+   ppl_new_Grid_from_bounding_box/2,
+   ppl_new_Grid_from_covering_box/2
+  ]).
+
+
+group_predicates(swap_grids,
+  [ppl_Grid_swap/2
+  ]).
+
+group_predicates(grid_dimension,
+  [ppl_Grid_affine_dimension/2,
+   ppl_Grid_space_dimension/2]).
+
+group_predicates(grid_basic_operators,
+  [ppl_Grid_intersection_assign/2,
+   ppl_Grid_join_assign/2,
+   ppl_Grid_difference_assign/2,
+   ppl_Grid_time_elapse_assign/2,
+   ppl_Grid_topological_closure_assign/1
+  ]).
+
+group_predicates(grid_add_to_system,
+  [ppl_Grid_add_congruence/2,
+   ppl_Grid_add_constraint/2,
+   ppl_Grid_add_grid_generator/2,
+   ppl_Grid_add_congruences/2,
+   ppl_Grid_add_constraints/2,
+   ppl_Grid_add_grid_generators/2
+  ]).
+
+group_predicates(grid_revise_dimensions,
+  [ppl_Grid_remove_space_dimensions/2,
+   ppl_Grid_remove_higher_space_dimensions/2,
+   ppl_Grid_expand_space_dimension/3,
+   ppl_Grid_fold_space_dimensions/3,
+   ppl_Grid_map_space_dimensions/2,
+   ppl_Grid_concatenate_assign/2
+  ]).
+
+group_predicates(grid_transform,
+  [ppl_Grid_affine_image/4,
+   ppl_Grid_affine_preimage/4,
+   ppl_Grid_generalized_affine_image/5,
+   ppl_Grid_generalized_affine_preimage/5,
+   ppl_Grid_generalized_affine_image_lhs_rhs/4,
+   ppl_Grid_generalized_affine_preimage_lhs_rhs/4
+  ]).
+
+group_predicates(grid_get_system,
+  [ppl_Grid_get_constraints/2,
+   ppl_Grid_get_minimized_constraints/2,
+   ppl_Grid_get_grid_generators/2,
+   ppl_Grid_get_minimized_grid_generators/2
+  ]).
+
+group_predicates(grid_check_grid,
+  [ppl_Grid_relation_with_constraint/3,
+   ppl_Grid_relation_with_grid_generator/3,
+   ppl_Grid_is_empty/1,
+   ppl_Grid_is_universe/1,
+   ppl_Grid_is_bounded/1,
+   ppl_Grid_is_discrete/1,
+   ppl_Grid_is_topologically_closed/1,
+   ppl_Grid_bounds_from_above/1,
+   ppl_Grid_bounds_from_below/1,
+   ppl_Grid_contains_Grid/2,
+   ppl_Grid_strictly_contains_Grid/2,
+   ppl_Grid_is_disjoint_from_Grid/2,
+   ppl_Grid_equals_Grid/2,
+   ppl_Grid_OK/1
+  ]).
+
+group_predicates(minmax_grid,
+  [ppl_Grid_maximize/5,
+   ppl_Grid_maximize_with_point/6,
+   ppl_Grid_minimize/5,
+   ppl_Grid_minimize_with_point/6
+  ]).
+
+group_predicates(compare_grids,
+  [ppl_Grid_contains_Grid/2,
+   ppl_Grid_strictly_contains_Grid/2,
+   ppl_Grid_is_disjoint_from_Grid/2,
+   ppl_Grid_equals_Grid/2
+  ]).
+
+group_predicates(grid_boxes,
+  [ppl_Grid_get_bounding_box/3,
+   ppl_Grid_get_covering_box/3]).
+
+
+group_predicates(grid_extrapolation_operators,
+  [ppl_Grid_congruence_widening_assign_with_token/3,
+   ppl_Grid_congruence_widening_assign/2,
+   ppl_Grid_limited_congruence_extrapolation_assign_with_token/4,
+   ppl_Grid_limited_congruence_extrapolation_assign/3,
+   ppl_Grid_generator_widening_assign_with_token/3,
+   ppl_Grid_generator_widening_assign/2,
+   ppl_Grid_limited_generator_extrapolation_assign_with_token/4,
+   ppl_Grid_limited_generator_extrapolation_assign/3
+  ]).
+
+
+group_predicates(grid_handle_exceptions,
+  'all Grid predicates'' exception handling.'
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%% System flags %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% pl_check_prolog_flag/2
+% returns true or false (if the 1st argument is 'bounded')
+% or (if the 1st argument is 'max_integer' or  'min_integer')
+% the maximum or minimum integer for Prolog
+% systems that have bounded integers.
+% Note that 268435456 is 2^28.
+
+pl_check_prolog_flag(bounded, TF) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(bounded, TF).
+
+pl_check_prolog_flag(bounded, true) :-
+  prolog_system('XSB').
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(max_integer, Max_Int).
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+  prolog_system('XSB'), Max_Int is 268435455.
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(min_integer, Min_Int).
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+  prolog_system('XSB'), Min_Int is -268435456.
diff --git a/interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4 b/interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
new file mode 100644
index 0000000..210497c
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
@@ -0,0 +1,1903 @@
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating the test files
+dnl ppl_predicate_check_<CLASS_NAME>.pl, which test
+dnl the generated Prolog interface predicates.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_define(`m4_add_build_class_code', `dnl
+ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim) :-
+  (clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, universe, PS),
+  ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+  ppl_ at CLASS@_add_ at CONSTRAINER@s(PS, RS)).
+
+')
+
+m4_define(`m4_add_comparison_class_code', `dnl
+ppl_ at CLASS@_comparison_check(is_disjoint_from, PS1, PS2, Result) :-
+  (
+   ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+   ppl_ at CLASS@_intersection_assign(PS1_Copy, PS2),
+   (ppl_ at CLASS@_is_empty(PS1_Copy)
+   ->
+    Result = true
+   ;
+    Result = false
+   ),
+   ppl_delete_ at CLASS@(PS1_Copy)
+  ).
+
+ppl_ at CLASS@_comparison_check(contains, PS1, PS2, Result) :-
+  (
+   ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+   ppl_ at CLASS@_intersection_assign(PS1_Copy, PS2),
+   (ppl_ at CLASS@_equals_ at CLASS@(PS1_Copy, PS2)
+   ->
+    Result = true
+   ;
+    Result = false
+   ),
+  ppl_delete_ at CLASS@(PS1_Copy)
+  ).
+
+ppl_ at CLASS@_comparison_check(strictly_contains, PS1, PS2, Result) :-
+  (
+   (ppl_ at CLASS@_equals_ at CLASS@(PS1, PS2)
+   ->
+     Result = false
+   ;
+     ppl_ at CLASS@_comparison_check(contains, PS1, PS2, Result)
+   )
+  ).
+
+ppl_ at CLASS@_comparison_check(geometrically_covers, _PS1, _PS2, _).
+
+ppl_ at CLASS@_comparison_check(geometrically_equals, _PS1, _PS2, _).
+
+')
+
+m4_define(`m4_add_wdn_exn_class_code', `dnl
+ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) :-
+  (
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+     ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2_Copy)
+  ).
+
+ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, PS2, PS2_Copy,
+                                           T, T1) :-
+  (
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1a, PS1_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1a, PS1),
+     ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2_Copy),
+     (T == 1
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1a)
+     ;
+       T == 0,
+       ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_Copy)
+     ),
+     T1 == 0,
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1a),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1a),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2_Copy)
+  ).
+
+')
+
+m4_define(`m4_add_cleanup_class_code', `dnl
+ppl_cleanup_ at CLASS@(_).
+ppl_cleanup_ at CLASS@(P) :-
+  (out_ at CLASS@(P), fail).
+
+ppl_cleanup_all_ at CLASS@([]).
+ppl_cleanup_all_ at CLASS@([_|_]).
+ppl_cleanup_all_ at CLASS@([P|Ps]) :-
+  ppl_delete_all_ at CLASS@([P|Ps]).
+
+ppl_delete_all_ at CLASS@([]).
+ppl_delete_all_ at CLASS@([P|Ps]) :-
+  (ppl_delete_ at CLASS@(P),
+  ppl_delete_all_ at CLASS@(Ps)).
+
+')
+
+m4_define(`m4_add_out_class_code', `dnl
+out_ at CLASS@(P):-
+  ((noisy(N), N < 2) -> true ;
+    (predicate_exists(ppl_ at CLASS@_get_ at GET_REPRESENT@s)
+    ->
+      ppl_ at CLASS@_get_ at GET_REPRESENT@s(P, RS),
+      display_message([nl, @GET_REPRESENT at s, are, nl, RS, nl])
+    ;
+      display_message([nl, @LCLASS@, representation, cannot ,be, displayed, nl])
+    ),
+    fail
+  ).
+
+')
+
+m4_define(`m4_add_out_extra_class_code', `dnl
+out_ at CLASS@(P) :-
+  ppl_delete_ at CLASS@(P).
+
+')
+
+dnl Note that to avoid m4 treating commas as m4 argument separators,
+dnl all tests must be between `(' and `)'.
+m4_divert(-1)
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_3_test :-
+  (
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(0, empty, PS),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, empty, PS1),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(0, universe, PS2),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, universe, PS3),
+   ppl_delete_ at CLASS@(PS),
+   ppl_delete_ at CLASS@(PS1),
+   ppl_delete_ at CLASS@(PS2),
+   ppl_delete_ at CLASS@(PS3)
+  ->
+   fail ; true).
+
+')
+
+m4_define(`ppl_C_Polyhedron_OK', ppl_Polyhedron_OK`'$1)
+m4_define(`ppl_NNC_Polyhedron_OK', ppl_Polyhedron_OK`'$1)
+
+m4_define(`ppl_delete_C_Polyhedron', ppl_delete_Polyhedron`'$1)
+m4_define(`ppl_delete_NNC_Polyhedron', ppl_delete_Polyhedron`'$1)
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _2_test :-
+  (
+   clean_ppl_new_ at FRIEND@_from_space_dimension(0, universe, PS),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(PS, PS1),
+   ppl_ at FRIEND@_OK(`(PS)'),
+   ppl_ at CLASS@_OK(PS1),
+   ppl_delete_ at FRIEND@(`(PS)'),
+   ppl_delete_ at CLASS@(PS1)
+  ->
+   fail ; true).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_2_test :-
+  (
+   clean_ppl_new_ at FRIEND@_from_space_dimension(0, universe, PS),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(PS, PS1),
+   ppl_ at FRIEND@_OK(`(PS)'),
+   ppl_ at CLASS@_OK(PS1),
+   ppl_delete_ at FRIEND@(`(PS)'),
+   ppl_delete_ at CLASS@(PS1)
+  ->
+   fail ; true).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_2_test :-
+  (
+   member(TEST_DATA, [test00, test02, test03, test04, test05, test06]),
+   (
+    ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@,
+                        @BUILD_REPRESENT at s, RS1),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(RS1, PS1),
+    ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@,
+                        @ALT_BUILD_REPRESENT at s, RS1a),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@ALT_BUILD_REPRESENT at s(RS1a, PS1a),
+%%    ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1a),
+    ppl_delete_ at CLASS@(PS1),
+    ppl_delete_ at CLASS@(PS1a)
+    ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX at _2_test :-
+  (
+   member(TEST_DATA,
+          [test00, test02, test04, test05, test06, test10, test11, test12]),
+   (
+    ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, box, Box),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(Box, PS),
+    (predicate_exists(ppl_ at CLASS@_get_ at BOX@)
+    ->
+     (@BOX@ == bounding_box
+      ->
+        ppl_ at CLASS@_get_bounding_box(PS, any, Box1)
+      ;
+        ppl_ at CLASS@_get_ at BOX@(PS, Box1)
+      )
+    ;
+      ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, box, Box1)
+    ),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(Box1, PS1),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(Box, 0),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(x, c(1/2)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(x(minf), c(1/2)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(o(minf), c(1/2)), i(c(0), c(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(c(minf), c(1/2)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(o(minf), c(inf)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(c(minf), c(1+2)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(c(minf), c(n/2)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(c(minf), c(2/d)), i(c(0), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(e), i(c(n), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [i(c(minf), c(2/1), c(1)), i(c(n), o(pinf))], _),
+    \+ clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@(
+             [x(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+    ppl_delete_ at CLASS@(PS),
+    ppl_delete_ at CLASS@(PS1)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code',
+`
+ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     (ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@(PS1_Copy, PS2) ->
+       (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+       ->
+         ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2a),
+         ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS1),
+         ppl_ at CLASS@_upper_bound_assign(PS2a, PS1),
+         ppl_ at CLASS@_contains_ at CLASS@(PS2a, PS1_Copy)
+       ;
+         true
+       )
+     ;
+       (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+       ->
+         ppl_ at CLASS@_equals_ at CLASS@(PS1_Copy, PS1),
+         ppl_ at CLASS@_equals_ at CLASS@(PS2a, PS2)
+       ;
+         true
+       )
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2a)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`
+ppl_ at CLASS@_swap_2_test :-
+  (
+   (
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3, universe, PS),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3, empty, PS1),
+    ppl_ at CLASS@_swap(PS, PS1),
+    (predicate_exists(ppl_ at CLASS@_is_empty)
+    ->
+      ppl_ at CLASS@_is_empty(PS),
+      ppl_ at CLASS@_is_universe(PS1)
+    ;
+      true
+    ),
+    ppl_ at CLASS@_OK(PS),
+    ppl_ at CLASS@_OK(PS1),
+    ppl_delete_ at CLASS@(PS),
+    ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`
+ppl_ at CLASS@_ at DIMENSION@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim), TEST_DATA \= test07,
+    (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     \+ppl_ at CLASS@_ at DIMENSION@(PS, 3),
+     ppl_ at CLASS@_ at DIMENSION@(PS, Dim),
+     ppl_dimension_test_data(TEST_DATA, @DIMENSION@, Dim1),
+     ((TEST_DATA == test05, @DIMENSION@ == affine_dimension)
+     ->
+       true
+     ;
+       Dim == Dim1
+     ),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at GET_REPRESENT@s_code',
+`
+ppl_ at CLASS@_get_ at GET_REPRESENT@s_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     ppl_ at CLASS@_get_ at GET_REPRESENT@s(PS, RS),
+     (predicate_exists(ppl_ at CLASS@_add_ at GET_REPRESENT@s)
+     ->
+         ppl_ at CLASS@_add_ at GET_REPRESENT@s(PS1, RS)
+     ;
+         true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_code',
+`
+ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+      ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+      ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+      ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s(PS, RS),
+      ( predicate_exists(ppl_ at CLASS@_add_ at GET_REPRESENT@s)
+      ->
+        ppl_ at CLASS@_add_ at GET_REPRESENT@s(PS1, RS)
+      ;
+        true
+      ),
+      ppl_ at CLASS@_OK(PS),
+      ppl_ at CLASS@_OK(PS1),
+      ppl_delete_ at CLASS@(PS),
+      ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`
+ppl_ at CLASS@_ at MEMBYTES@_2_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(RS, PH),
+     ppl_ at CLASS@_ at MEMBYTES@(PH, S),
+     ((noisy(N), N < 2) -> true ;
+       display_message([nl, for, TEST_DATA, the, @MEMBYTES@, is, S, nl])
+     ),
+     ppl_delete_ at CLASS@(PH)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`
+ppl_ at CLASS@_ at BEGINEND@_iterator_2_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(RS, PPS),
+     ppl_ at CLASS@_ at BEGINEND@_iterator(PPS, It_x),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_ at CLASS@_delete_iterator(It_x),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`
+ppl_ at CLASS@_iterator_equals_iterator_2_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(RS, PPS),
+     ppl_ at CLASS@_begin_iterator(PPS, It),
+     ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+     ppl_ at CLASS@_iterator_equals_iterator(It, It_begin),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_ at CLASS@_delete_iterator(It),
+     ppl_ at CLASS@_delete_iterator(It_begin),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`
+ppl_ at CLASS@_ at INCDEC@_iterator_1_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(RS, PPS),
+     ppl_ at CLASS@_begin_iterator(PPS, Itb),
+     ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+     ppl_ at CLASS@_size(PPS, S),
+     (S > 0
+     ->
+       ppl_ at CLASS@_increment_iterator(Itb),
+       ppl_ at CLASS@_decrement_iterator(Itb)
+     ),
+     ppl_ at CLASS@_iterator_equals_iterator(Itb, It_begin),
+     ppl_ at CLASS@_end_iterator(PPS, Ite),
+     ppl_ at CLASS@_end_iterator(PPS, It_end),
+     (S > 0
+     ->
+       ppl_ at CLASS@_decrement_iterator(Ite),
+       ppl_ at CLASS@_increment_iterator(Ite)
+     ),
+     ppl_ at CLASS@_iterator_equals_iterator(Ite, It_end),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_ at CLASS@_delete_iterator(Itb),
+     ppl_ at CLASS@_delete_iterator(It_begin),
+     ppl_ at CLASS@_delete_iterator(Ite),
+     ppl_ at CLASS@_delete_iterator(It_end),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`
+ppl_ at CLASS@_drop_disjunct_2_test :-
+  (
+   TEST_DATA = test06, TEST_DATA1 = test07,
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+   ppl_build_test_data(TEST_DATA1, t_ at TOPOLOGY@, @CONSTRAINER at s, RS1),
+   (
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(RS, PPS),
+     clean_ppl_new_ at CLASSTOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+     ppl_ at CLASS@_add_disjunct(PPS, PS),
+     ppl_ at CLASS@_size(PPS, S),
+     S > 1,
+     ppl_ at CLASS@_begin_iterator(PPS, It),
+     ppl_ at CLASS@_increment_iterator(It),
+     ppl_ at CLASS@_drop_disjunct(PPS, It),
+     S1 is S - 1,
+     ppl_ at CLASS@_size(PPS, S1),
+     ppl_ at CLASS@_decrement_iterator(It),
+     ppl_ at CLASS@_drop_disjunct(PPS, It),
+     S2 is S1 - 1,
+     ppl_ at CLASS@_size(PPS, S2),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_ at CLASS@_delete_iterator(It),
+     ppl_delete_ at CLASS@(PPS),
+     ppl_delete_ at DISJUNCT@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`
+ppl_ at CLASS@_get_disjunct_2_test :-
+  (
+   all_tests(Space_Dim, Tests),
+   (
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, empty, PPS),
+     ppl_ at CLASS@_get_disjunct_2_test1(PPS, Tests),
+     ppl_ at CLASS@_begin_iterator(PPS, It),
+     ppl_ at CLASS@_end_iterator(PPS, It_end),
+     ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_ at CLASS@_delete_iterator(It),
+     ppl_ at CLASS@_delete_iterator(It_end),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+ppl_ at CLASS@_get_disjunct_2_test1(_, []).
+ppl_ at CLASS@_get_disjunct_2_test1(PPS, [Test|Tests]) :-
+  (
+   ppl_build_test_data(Test, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+   clean_ppl_new_ at CLASSTOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS, PS),
+   ppl_ at CLASS@_add_disjunct(PPS, PS),
+   ppl_delete_ at DISJUNCT@(PS),
+   ppl_ at CLASS@_get_disjunct_2_test1(PPS, Tests),
+   !
+  ).
+
+ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim) :-
+  (
+   (ppl_ at CLASS@_iterator_equals_iterator(It, It_end)
+   ->
+     true
+   ;
+     ppl_ at CLASS@_get_disjunct(It, PS),
+     ppl_ at CLASS@_increment_iterator(It),
+     ppl_ at DISJUNCT@_OK(PS),
+     ppl_ at DISJUNCT@_space_dimension(PS, D),
+     D = Space_Dim,
+     ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim)
+   )
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at PARTITION@_code',
+`
+ppl_ at CLASS@_ at PARTITION@_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at CLASSTOPOLOGY@@DISJUNCT at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at CLASSTOPOLOGY@@DISJUNCT at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_ at PARTITION@(PS1, PS2, PS3, _PPS),
+     ppl_ at DISJUNCT@_OK(PS3)
+   ->
+     fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_3_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     class_ at CLASS@ \== class_BD_Shape_int8_t,
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_relation_test_data(TEST_DATA, @RELATION_REPRESENT@, R, Rel_Expected),
+     ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(PS, R, Rel),
+     (class_ at CLASS@ == class_Polyhedron ; class_ at CLASS@ == class_Grid
+     ->
+       Rel = Rel_Expected
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_bounding_box_code',
+`
+ppl_ at CLASS@_get_bounding_box_3_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (CC = any ; CC = simplex ; CC = polynomial),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at CLASS@_get_bounding_box(PS, CC, Box),
+     (predicate_exists(ppl_new_ at TOPOLOGY@@CLASS at _from_bounding_box)
+     ->
+      (Box \== [empty]
+      ->
+        clean_ppl_new_ at TOPOLOGY@@CLASS at _from_bounding_box(Box, PS1),
+        ppl_ at CLASS@_get_bounding_box(PS1, CC, Box1),
+        clean_ppl_new_ at TOPOLOGY@@CLASS at _from_bounding_box(Box1, PS2),
+        ppl_ at CLASS@_equals_ at CLASS@(PS1, PS2),
+        ppl_ at CLASS@_contains_ at CLASS@(PS2, PS),
+        ppl_delete_ at CLASS@(PS1),
+        ppl_delete_ at CLASS@(PS2)
+      ;
+        true
+      )
+    ;
+      true
+    ),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_covering_box_code',
+`
+ppl_ at CLASS@_get_covering_box_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at CLASS@_get_covering_box(PS, Box),
+     (predicate_exists(ppl_new_ at TOPOLOGY@@CLASS at _from_covering_box)
+     ->
+      clean_ppl_new_ at TOPOLOGY@@CLASS at _from_covering_box(Box, PS1),
+      (Box \== [empty]
+      ->
+       ppl_ at CLASS@_get_covering_box(PS1, Box1),
+       clean_ppl_new_ at CLASS@_from_covering_box(Box1, PS2),
+       ppl_ at CLASS@_space_dimension(PS2, Space_Dim),
+       %% ppl_ at CLASS@_equals_ at CLASS@(PS1, PS2),
+       %% ppl_ at CLASS@_contains_ at CLASS@(PS2, PS),
+       ppl_delete_ at CLASS@(PS1),
+       ppl_delete_ at CLASS@(PS2)
+      ;
+       true
+      )
+    ;
+      true
+    ),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`
+ppl_ at CLASS@_ at HAS_PROPERTY@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+    (ppl_property_test_data(TEST_DATA, t_ at TOPOLOGY@,
+                            @CONSTRAINER@, @HAS_PROPERTY@)
+    ->
+      ppl_ at CLASS@_ at HAS_PROPERTY@(PS)
+    ;
+      \+ ppl_ at CLASS@_ at HAS_PROPERTY@(PS)
+    ),
+    ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`
+ppl_ at CLASS@_ at SIMPLIFY@_1_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   TEST_DATA = test04,
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     ppl_ at CLASS@_ at SIMPLIFY@(PS),
+     ppl_ at CLASS@_OK(PS),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`
+ppl_ at CLASS@_unconstrain_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_unconstrain_space_dimensions(PS, [Var]),
+     ppl_ at CLASS@_OK(PS),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+ppl_ at CLASS@_unconstrain_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, 0),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, 0),
+     ppl_ at CLASS@_unconstrain_space_dimensions(PS, []),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`
+ppl_ at CLASS@_unconstrain_space_dimension_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_unconstrain_space_dimension(PS, Var),
+     ppl_ at CLASS@_OK(PS),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`
+ppl_ at CLASS@_constrains_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_constrains_test_data(TEST_DATA, _, Bool),
+     (ppl_ at CLASS@_constrains(PS, Var)
+        -> Bool = true
+        ; Bool = false
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   TEST_DATA \= test05,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ((
+       class_ at DISJUNCT@ \= class_Grid,
+       ppl_bounds_test_data(TEST_DATA, @CONSTRAINER at s, LE,
+                           @ABOVEBELOW@, true))
+     ->
+       ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(PS, LE)
+     ;
+       true
+     ),
+     ((
+       class_ at DISJUNCT@ \= class_Grid,
+       ppl_bounds_test_data(TEST_DATA, @CONSTRAINER at s, LE1,
+                           @ABOVEBELOW@, false))
+     ->
+       \+ ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(PS, LE1)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+dnl FIXME:: The test fails for BD_Shape.
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_codeXXXXX',
+`
+ppl_ at CLASS@_ at MAXMIN@_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_maxmin_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@, @MAXMIN@,
+                          LE, Nexptd, Dexptd, Bexptd, _, SuccessFlag),
+     (SuccessFlag == true
+     ->
+       (ppl_ at CLASS@_ at MAXMIN@(PS, LE, N, D, B),
+        B == Bexptd, N == Nexptd, D == Dexptd)
+     ;
+       \+ ppl_ at CLASS@_ at MAXMIN@(PS, LE, N, D, B)
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+dnl FIXME:: The test fails for BD_Shape.
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_codeXXXXX',
+`
+ppl_ at CLASS@_ at MAXMIN@_with_point_6_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_maxmin_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@, @MAXMIN@,
+                          LE, Nexptd, Dexptd, Bexptd, Gexptd, SuccessFlag),
+     (SuccessFlag == true
+     ->
+       (ppl_ at CLASS@_ at MAXMIN@_with_point(PS, LE, N, D, B, G),
+        B == Bexptd, N == Nexptd, D == Dexptd,
+        (predicate_exists(ppl_Polyhedron_add_generator)
+        ->
+          clean_ppl_new_C_Polyhedron_from_space_dimension(Space_Dim,
+                                                             empty, PSG),
+          clean_ppl_new_C_Polyhedron_from_space_dimension(Space_Dim,
+                                                             empty, PSGexptd),
+          (G =.. [closure_point|CP]
+          ->
+            Gexptd =.. [closure_point|CPexptd],
+            G_Point =.. [point|CP],
+            Gexptd_Point =.. [point|CPexptd],
+            ppl_Polyhedron_add_generator(PSG, G_Point),
+            ppl_Polyhedron_add_generator(PSGexptd, Gexptd_Point)
+          ;
+            (ppl_Polyhedron_add_generator(PSG, G),
+             ppl_Polyhedron_add_generator(PSGexptd, Gexptd))
+          ),
+          ppl_C_Polyhedron_equals_C_Polyhedron(PSG, PSGexptd),
+          ppl_delete_Polyhedron(PSG),
+          ppl_delete_Polyhedron(PSGexptd)
+        ;
+          true
+        ))
+     ;
+        \+ ppl_ at CLASS@_ at MAXMIN@_with_point(PS, LE, N, _, _, _)
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     (ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(PS1, PS2)
+     ->
+       ppl_ at CLASS@_comparison_check(@COMPARISON@, PS1, PS2, true)
+     ;
+       ppl_ at CLASS@_comparison_check(@COMPARISON@, PS1, PS2, false)
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_code',
+`
+:- discontiguous(ppl_ at CLASS@_add_ at ADD_REPRESENT@_2_test1/3).
+
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @ADD_REPRESENT at s, RS),
+   ppl_initial_test_system(@ADD_REPRESENT@, U_or_E),
+   ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS),
+   ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS, RS),
+   ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS1),
+   (ppl_ at CLASS@_add_ at ADD_REPRESENT@_2_test1(PS, PS1, RS)
+   ->
+     fail ; true)
+  ).
+
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_2_test1(PS, PS1, []) :-
+  (
+   (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+      ->
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+   ;
+     true
+   ),
+   ppl_delete_ at CLASS@(PS),
+   ppl_delete_ at CLASS@(PS1)
+  ).
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_2_test1(PS, PS1, [R | RS]) :-
+  (
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@(PS1, R),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@_2_test1(PS, PS1, RS)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_code',
+`
+:- discontiguous(ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_2_test1/3).
+
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @ADD_REPRESENT at s, RS),
+     ppl_initial_test_system(@ADD_REPRESENT@, U_or_E),
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim,
+                                                          U_or_E, PS),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS, RS),
+     clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim,
+                                                        U_or_E, PS1),
+     (predicate_exists(ppl_ at CLASS@_is_empty)
+     ->
+       (\+ ppl_ at CLASS@_is_empty(PS)
+       ->
+         ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_2_test1(PS, PS1, RS)
+       ;
+         true
+       )
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_2_test1(PS, PS1, []) :-
+  (
+   (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+   ->
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+   ;
+     true
+   )
+  ).
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_2_test1(PS, PS1, [R | RS]) :-
+  (
+   ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize(PS1, R),
+   ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize_2_test1(PS, PS1, RS)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_code',
+`
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_build_test_data(TEST_DATA1, t_ at TOPOLOGY@, @ADD_REPRESENT at s, RS),
+     ppl_build_test_data(TEST_DATA2, t_ at TOPOLOGY@, @ADD_REPRESENT at s, RS1),
+     ppl_initial_test_system(@ADD_REPRESENT@, U_or_E),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS1),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS, RS),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS, RS1),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS1, RS1),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS1, RS),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_code',
+`
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+   (
+     ppl_build_test_data(TEST_DATA1, t_ at TOPOLOGY@, @ADD_REPRESENT at s, RS),
+     ppl_build_test_data(TEST_DATA2, t_ at TOPOLOGY@, @ADD_REPRESENT at s, RS1),
+     ppl_initial_test_system(@ADD_REPRESENT@, U_or_E),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, U_or_E, PS),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, U_or_E, PS1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, U_or_E, PS_min),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, U_or_E, PS1_min),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS, RS),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS, RS1),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS_min, RS),
+     (predicate_exists(ppl_ at CLASS@_is_empty)
+     ->
+       (ppl_ at CLASS@_is_empty(PS)
+       ->
+         \+ ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(PS_min, RS1),
+         ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS_min, RS1)
+       ;
+         ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(PS_min, RS1)
+       )
+     ;
+       true
+     ),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS1, RS1),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS1, RS),
+     ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS1_min, RS1),
+     (predicate_exists(ppl_ at CLASS@_is_empty)
+     ->
+       (ppl_ at CLASS@_is_empty(PS1)
+       ->
+         \+ ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(PS1_min, RS),
+         ppl_ at CLASS@_add_ at ADD_REPRESENT@s(PS1_min, RS)
+       ;
+         ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize(PS1_min, RS)
+       )
+     ;
+       true
+     ),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS_min, PS1_min),
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS1_min),
+       ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_min)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_min),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_min)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`
+ppl_ at CLASS@_add_disjunct_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PPS1, Space_Dim),
+     ppl_ at CLASSTOPOLOGY@@DISJUNCT at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_add_disjunct(PPS1, PS2),
+     ppl_ at CLASS@_OK(PPS1),
+     ppl_ at DISJUNCT@_OK(PS2),
+     ppl_delete_ at DISJUNCT@(PS2),
+     ppl_delete_ at CLASS@(PPS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`
+ppl_ at CLASS@_ at BINOP@_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_ at BINOP@(PS1_Copy, PS2),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       (@BINOP@ == intersection_assign
+       ->
+         ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+         ppl_ at CLASS@_contains_ at CLASS@(PS2, PS1_Copy)
+       ;
+         (@BINOP@ == difference_assign ; @BINOP@ == poly_difference_assign
+         ->
+           ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy)
+         ;
+           (@BINOP@ == concatenate_assign
+            ->
+             ppl_ at CLASS@_space_dimension(PS1, Dim1),
+             ppl_ at CLASS@_space_dimension(PS2, Dim2),
+             Dim_Conc is Dim1 + Dim2,
+             ppl_ at CLASS@_space_dimension(PS1_Copy, Dim_Conc)
+           ;
+             (member(@BINOP@,
+                         [upper_bound_assign,
+                          poly_hull_assign,
+                          join_assign,
+                          bds_hull_assign,
+                          oct_hull_assign])
+             ->
+               ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS1),
+               ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS2)
+             ;
+               true
+             )
+           )
+         )
+       )
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2a)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINMINOP@_code',
+`
+ppl_ at CLASS@_ at BINMINOP@_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy_n),
+     (@BINMINOP@ == intersection_assign_and_minimize
+     ->
+       ppl_ at CLASS@_intersection_assign(PS1_Copy_n, PS2),
+       (\+ ppl_ at CLASS@_is_empty(PS1_Copy_n)
+       ->
+         ppl_ at CLASS@_ at BINMINOP@(PS1_Copy, PS2),
+         \+ ppl_ at CLASS@_is_empty(PS1_Copy),
+         ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2a),
+         ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+         ppl_ at CLASS@_contains_ at CLASS@(PS2, PS1_Copy)
+       ;
+         \+ ppl_ at CLASS@_ at BINMINOP@(PS1_Copy, PS2)
+       )
+     ;
+       (member(@BINMINOP@,
+                     [upper_bound_assign_and_minimize,
+                      poly_hull_assign_and_minimize,
+                      join_assign_and_minimize,
+                      bds_hull_assign_and_minimize,
+                      oct_hull_assign_and_minimize])
+        ->
+          ppl_ at CLASS@_upper_bound_assign(PS1_Copy_n, PS2),
+          (\+ ppl_ at CLASS@_is_empty(PS1_Copy_n)
+          ->
+            ppl_ at CLASS@_ at BINMINOP@(PS1_Copy, PS2),
+            \+ ppl_ at CLASS@_is_empty(PS1_Copy),
+            ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS1),
+            ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS2)
+          ;
+            \+ ppl_ at CLASS@_ at BINMINOP@(PS1_Copy, PS2)
+          )
+        ;
+          fail
+        )
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS1_Copy_n),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2a)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`
+ppl_ at CLASS@_simplify_using_context_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_simplify_using_context_assign(PS1_Copy, PS2,
+                                               _Is_Intersection),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`ppl_ at CLASS@_ at AFFIMAGE@_4_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var + 5, 1),
+     ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var - 5, 1),
+     (@AFFIMAGE@ == affine_image
+     ->
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, 3*Var, 1),
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var, 3)
+     ;
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var, 3),
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, 3*Var, 1)
+     ),
+dnl  FIXME: This fails with Uint??_Box domains for many of the tests
+dnl      (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+dnl      ->
+dnl        ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+dnl      ;
+dnl        true
+dnl      ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`
+ppl_ at CLASS@_bounded_ at AFFIMAGE@_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   ppl_dimension_test_data(TEST_DATA, space_dimension, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS, Var, Var, 2*Var, 3),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS, Var, 3*Var, 3*Var, 1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS_Copy, Var, 3*Var, 3*Var, 1),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS_Copy, Var, Var, 2*Var, 3),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (t_ at TOPOLOGY@ == t_NNC_
+   ->
+     member(Op, [>=, =<, =, >, <])
+   ;
+     member(Op, [>=, =<, =])
+   ),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, Op, 2*Var, 3),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, Op, Var + 2, 1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, Op, Var + 2, 1),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, Op, 2*Var, 3),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_6_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, =, 2*Var, 3, 5),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, =, Var + 2, 1, 0),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, =, Var + 2, 1, 0),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, =, 2*Var, 3, 5),
+%%     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_4_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (t_ at TOPOLOGY@ == t_NNC_
+   ->
+     member(Op, [>=, =<, =, >, <])
+   ;
+     member(Op, [>=, =<, =])
+   ),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, 2*Var, Op, 2*(Var + 2)),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy, Var, Op, Var + 2),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, Var + 2, =, 2*Var, 5),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, 1 - Var, =, Var + 2, 0),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy,
+                                                1 - Var, =, Var + 2, 0),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy,
+                                                Var + 2, =, 2*Var, 5),
+%%     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`
+ppl_ at CLASS@_ at WIDEN@_widening_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_ at WIDEN@_widening_assign(PS1, PS2),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+     ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(PS1, PS2, 1, T),
+     ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(PS1a, PS2, 0, T1),
+     ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+                                                PS2, PS2_Copy, T, T1)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at CLASSTOPOLOGY@@DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign_code',
+`
+ppl_ at CLASS@_BHZ03_ at CLASSTOPOLOGY@@DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+                                                           PS1, PS2),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+                                                           PS1, PS2, 3),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+                                                           PS1, PS2, 3),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at EXTRAPOLATION@_extrapolation_assign_3_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+   Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     make_vars(Dim, [Var|_]),
+     ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(
+           PS1, PS2, [Var = 1]),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_5_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+   Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+     make_vars(Dim, [Var|_]),
+     ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(
+                                                  PS1, PS2, [Var = 1], 1, T),
+     ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(
+                                                  PS1a, PS2, [Var = 1], 0, T1),
+     ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+                                                PS2, PS2_Copy, T, T1)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign(PS1, PS2),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1, PS2,
+                                                                  1, T),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1a, PS2,
+                                                                  0, T1),
+     ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+                                                PS2, PS2_Copy, T, T1)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(PS2, PS1),
+     ppl_ at CLASS@_contains_ at CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+     ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_2_test :-
+  (
+    (
+      clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, universe, PS),
+      ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@(PS, 1),
+      ppl_ at CLASS@_OK(PS),
+      ppl_ at CLASS@_space_dimension(PS, 2),
+      (@EMBEDPROJECT@ == and_embed
+      ->
+        clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(2, universe, PS1)
+      ;
+        make_vars(2, [Var0, Var1]),
+        clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(
+                            [Var0 = Var0, Var1 = 0], PS1)
+      ),
+      (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+      ->
+        ppl_ at CLASS@_equals_ at CLASS@(PS, PS1),
+        ppl_ at CLASS@_OK(PS1),
+        ppl_ at CLASS@_OK(PS)
+      ;
+        true
+      ),
+      ppl_delete_ at CLASS@(PS1),
+      ppl_delete_ at CLASS@(PS)
+
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`
+ppl_ at CLASS@_remove_higher_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     Dim1 is Dim + 1,
+     ppl_ at CLASS@_remove_higher_space_dimensions(PS, Dim),
+     ppl_ at CLASS@_space_dimension(PS, Dim),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_remove_higher_space_dimensions(PS, 0),
+     ppl_ at CLASS@_space_dimension(PS, 0),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`
+ppl_ at CLASS@_remove_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     Dim1 is Dim + 1,
+     ppl_ at CLASS@_remove_space_dimensions(PS, []),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     make_vars(Dim1, Var_List),
+     append(_, [Var], Var_List),
+     ppl_ at CLASS@_remove_space_dimensions(PS, [Var]),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`
+ppl_ at CLASS@_expand_space_dimension_3_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     Dim1 is Dim + 1,
+     make_vars(1, [Var]),
+     ppl_ at CLASS@_expand_space_dimension(PS, Var, 0),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     make_vars(Dim1, Var_List),
+     append(_, [Var1], Var_List),
+     ppl_ at CLASS@_expand_space_dimension(PS, Var1, 1),
+     Dim2 is Dim1 + 1,
+     ppl_ at CLASS@_space_dimension(PS, Dim2),
+     ppl_ at CLASS@_remove_higher_space_dimensions(PS, Dim1),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`
+ppl_ at CLASS@_fold_space_dimensions_3_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     Dim1 is Dim + 1,
+     make_vars(Dim1, [Var | _]),
+     ppl_ at CLASS@_fold_space_dimensions(PS, [], Var),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     Dim2 is Dim1 + 1,
+     make_vars(Dim2, Var_List),
+     append(_, [Var1], Var_List),
+     ppl_ at CLASS@_fold_space_dimensions(PS, [Var], Var1),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`
+ppl_ at CLASS@_map_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_ at CLASS@_add_space_dimensions_and_project(PS, 1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PSa),
+     Dim1 is Dim + 2,
+     ppl_ at CLASS@_map_space_dimensions(PSa, []),
+     ppl_ at CLASS@_space_dimension(PSa, 0),
+     make_vars(Dim1, Var_List),
+     append(_, [Var, Var1], Var_List),
+     make_map_vars(Dim, Var_Map_List),
+     append(Var_Map_List, [Var-Var1, Var1-Var], Var_Map_List1),
+     ppl_ at CLASS@_map_space_dimensions(PS, Var_Map_List1),
+     ppl_ at CLASS@_map_space_dimensions(PS, Var_Map_List1),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PSa),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+dnl ppl_ at CLASS@_ at NARROWING@_narrowing_assign/2,
diff --git a/interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4 b/interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
new file mode 100644
index 0000000..136542d
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
@@ -0,0 +1,359 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the test files ppl_predicate_check_<CLASS_NAME>.pl
+dnl using the code in ppl_interface_generator_predicate_check_code.m4.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+m4_divert`'dnl
+%<--%<--%<-- ppl_predicate_check_main.pl
+/* Prolog code for checking all predicates.  -*- C++ -*-
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+m4_include(`ppl_interface_generator_predicate_check_code.m4')
+
+dnl ==================================================================
+dnl Useful macros needed to generate the test code.
+dnl ==================================================================
+
+dnl m4_filter_code(Schema_Code, Procedure_Spec1, Procedure_Spec1...)
+dnl
+m4_define(`m4_filter_code', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+  `m4_ifelse(`$2', `', keep,
+    `m4_ifelse(m4_index($1, `m4_regexp($2, `ppl_[^ /]+', `\&')'), -1,
+      keep, throw)')',
+  `m4_ifelse(m4_index($1, m4_regexp($2, `ppl_[^ /]+', `\&')), -1,
+    `m4_filter_code($1, m4_shift(m4_shift($@)))', throw)')')`'dnl
+
+dnl m4_check_test_usability(Procedure_name,
+dnl                         Procedure_Spec1, Procedure_Spec1...)
+dnl
+m4_define(`m4_check_test_usability', `dnl
+m4_filter_code(m4_indir($1_code),
+  m4_filter_all_procedures($2, 0, m4_procedure_list))`'dnl
+')
+dnl
+dnl
+dnl ==================================================================
+dnl Now generate the test code.
+dnl ==================================================================
+dnl
+dnl
+dnl ==================================================================
+dnl Generate code for the include statements.
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions needed
+dnl -----------------------------------------------------------------
+dnl
+m4_pushdef(`m4_one_class_code',
+`m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+:- include(QUOTE../tests/ppl_predicate_check_`'m4_current_interface`'.plQUOTE).
+m4_undefine(`m4_current_interface')`'dnl
+')
+dnl
+dnl -----------------------------------------------------------------
+dnl Main call to generate code for the include statements.
+dnl -----------------------------------------------------------------
+dnl
+m4_divert`'dnl
+%<--%<--%<-- ppl_predicate_check_main.pl
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%       Include the common code and all class dependent files       %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+:- include('ppl_predicate_check_common.pl').
+:- dynamic(all_class_dependent_predicates/1).
+:- discontiguous(all_class_dependent_predicates/1).
+m4_patsubst(m4_all_code`'m4_changequote(`[*[', `]*]')[*[]*],
+                                        QUOTE, [*[']*])[*[]*]dnl
+m4_changequote`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+dnl
+dnl ==================================================================
+dnl Generate code for the top-level call
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+dnl
+m4_pushdef(`m4_one_class_code', `
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+test_`'m4_current_interface`'COMMA`'dnl
+m4_undefine(`m4_current_interface')`'dnl
+')
+dnl
+dnl -----------------------------------------------------------------
+dnl Main call to generate code
+dnl -----------------------------------------------------------------
+m4_define(`m4_gen_code', m4_all_code)
+m4_divert`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%                       Main call for tests                         %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+check_all :-
+  (noisy(_) -> true; make_quiet),
+  ppl_initialize, `'dnl
+m4_patsubst(m4_gen_code, COMMA, `,')
+  ppl_finalize.
+m4_popdef(`m4_one_class_code')`'dnl
+dnl ==================================================================
+dnl Generate code for defining test_<class_name>.
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+m4_divert(-1)`'dnl
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+m4_define(`m4_start1', 0)`'dnl
+m4_pushdef(`m4_check_test_usability', keep)`'dnl
+m4_pushdef(`m4_extension', `dnl
+m4_ifdef(`$1_code',
+         `m4_ifelse(m4_check_test_usability($1, $5), keep,
+                    `m4_ifelse(m4_start1, 0,
+                      `m4_undefine(`m4_start1')  ', `
+')'  ``  '($1_$2_test
+      -> (!COMMA write_error($1))
+      ;  write_success($1))COMMA
+`  '')')`'dnl
+')`'dnl
+dnl
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+
+%<--%<--%<-- ppl_predicate_check_`'m4_current_interface.pl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%                       Main call for tests                         %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+test_`'m4_current_interface :-
+m4_undefine(`m4_current_interface')`'dnl
+')
+m4_pushdef(`m4_post_extra_class_code', `
+  true.
+')
+
+dnl -----------------------------------------------------------------
+dnl Call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_patsubst(m4_all_code, COMMA, `,')`'dnl
+m4_popdef(`m4_extension')`'dnl
+m4_popdef(`m4_pre_extra_class_code')`'dnl
+m4_popdef(`m4_post_extra_class_code')`'dnl
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Generate code for the declarations
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra definitions
+dnl -----------------------------------------------------------------
+
+m4_pushdef(`m4_extension', `dnl
+m4_ifdef(`$1_code',
+         `m4_ifelse(m4_check_test_usability($1, $5), keep,
+:- dynamic($1_$2_test/0).
+:- discontiguous($1_$2_test/0).)')
+')`'dnl
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+%<--%<--%<-- ppl_predicate_check_`'m4_current_interface.pl
+m4_undefine(`m4_current_interface')`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%                   discontiguous declarations                      %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+')
+
+dnl -----------------------------------------------------------------
+dnl Main call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_extension')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl ==================================================================
+dnl Generate code for the class dependent predicate tests
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra definitions
+dnl -----------------------------------------------------------------
+m4_include(`ppl_interface_generator_predicate_check_code.m4')
+
+m4_define(`m4_arg_sequence',
+  `m4_ifelse(`$1', 0, ,
+     `Arg1`'m4_ifelse(`$1', 1, ,
+       `m4_forloop(`i', 2, `$1', `m4_separator Arg`'i')')')')
+
+m4_define(`m4_find_name',
+  `m4_regexp($1, `\(ppl_[^ /]+\)', `\1')`'dnl
+')
+
+m4_define(`m4_find_arity',
+  `m4_regexp($1, `ppl_[^ /]+\(.*\)', `m4_get_arity(\1)')`'dnl
+')
+
+m4_define(`m4_make_clean_defs', `dnl
+clean_$1`'m4_ifelse(`$2', 0, , `(`'m4_arg_sequence($2))') :-
+  ($1`'m4_ifelse(`$2', 0, , `(`'m4_arg_sequence($2))'),
+  ppl_cleanup_ at CLASS@(Arg`'$2)).
+')
+
+m4_define(`m4_replace_patterns_in_clean_defs', `dnl
+m4_replace_all_patterns_in_string($1,
+                                  m4_make_clean_defs(m4_find_name($2),
+                                                     m4_find_arity($2)),
+                                  m4_pattern_list)
+')
+
+m4_define(`m4_extras', `dnl
+m4_ifelse($#, 0, ,
+          $#, 1, ,
+          $#, 2,
+          `m4_ifelse(m4_index($2, new), -1, ,
+                     m4_replace_patterns_in_clean_defs($1, $2))',
+          `m4_ifelse(m4_index($2, new), -1, ,
+                     m4_replace_patterns_in_clean_defs($1, $2))'dnl
+`m4_extras($1, m4_shift(m4_shift($@)))')`'dnl
+')
+
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+
+%<--%<--%<-- ppl_predicate_check_`'m4_current_interface.pl
+m4_undefine(`m4_current_interface')`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%               class dependent predicate tests                     %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+m4_replace_all_patterns_in_string($1,
+  m4_add_build_class_code($1),
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_add_comparison_class_code($1),
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_add_wdn_exn_class_code($1),
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_add_cleanup_class_code($1),
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_add_out_class_code($1),
+  m4_pattern_list)`'dnl
+m4_replace_all_patterns_in_string($1,
+  m4_add_out_extra_class_code($1),
+  m4_pattern_list)`'dnl
+m4_extras($1, m4_procedure_list)
+')
+
+m4_pushdef(`m4_default_code', `')
+
+m4_pushdef(`m4_extension', `dnl
+m4_ifdef(`$1_code',
+`m4_ifelse(m4_check_test_usability($1, $5), keep, `
+m4_indir(`$1_code')`'dnl
+')', `')
+')
+
+dnl -----------------------------------------------------------------
+dnl Call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_extension')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl ==================================================================
+dnl Generate code,
+dnl defining the argument of "all_class_dependent_predicates/1",
+dnl a list of all the class dependent predicates that are implemented.
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+%<--%<--%<-- ppl_predicate_check_`'m4_current_interface.pl
+m4_undefine(`m4_current_interface')`'dnl
+m4_define(`m4_start1', 0)`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%               class dependent predicate tests                     %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all_class_dependent_predicates(
+  [
+  ')
+
+m4_define(`m4_post_extra_class_code', `
+  ]
+).
+')
+m4_define(`m4_start1', 0)
+
+m4_pushdef(`m4_extension', `dnl
+m4_ifelse(m4_start1, 0,
+  `m4_undefine(`m4_start1')', `COMMA
+')  `$1'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Main calls to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_patsubst(m4_all_code, COMMA, `,')`'dnl
+m4_divert(-1)
+m4_popdef(`m4_extension')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl End of file generation.
diff --git a/interfaces/Prolog/tests/ppl_predicate_check_common.pl b/interfaces/Prolog/tests/ppl_predicate_check_common.pl
new file mode 100644
index 0000000..2d8e0f3
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_predicate_check_common.pl
@@ -0,0 +1,613 @@
+% Extra test code for the Prolog interfaces.
+% Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL 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 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+:- dynamic(noisy/1).
+
+% check_noisy
+% This also executes all the test predicates but also prints some messages
+% including the banner, version numbers and expected output from
+% the exception tests.
+
+check_noisy :-
+   make_noisy,
+   check_all,
+   make_quiet.
+
+check_extra_noisy :-
+   make_extra_noisy,
+   check_all,
+   make_quiet.
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+  (retract(noisy(_)) ->
+      make_extra_noisy
+  ;
+      assertz(noisy(2))
+  ).
+
+make_noisy :-
+  (retract(noisy(_)) ->
+      make_noisy
+  ;
+      assertz(noisy(1))
+  ).
+
+make_quiet :-
+  (retract(noisy(_)) ->
+      make_quiet
+   ; assertz(noisy(0))
+  ).
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+   write_all(Message),
+   fail.
+
+display_message(Message):-
+    noisy(_),
+    (noisy(0) -> true ;
+     (write_all(Message))
+    ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+   (Phrase == nl ->
+      nl
+   ;
+      (write(Phrase),
+      write(' '))
+   ),
+   write_all(Phrases).
+
+%%%%%%%%%%%% predicates for variable generation %%%%%%%%%%%%%%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I =< Dimension.
+
+make_vars(Dim, Var_List) :-
+  make_var_list(0, Dim, Var_List).
+make_var_list(Dim, Dim, []) :- !.
+make_var_list(I, Dim, ['$VAR'(I)|Var_List]) :-
+  I < Dim,
+  (I1 is I + 1,
+  make_var_list(I1, Dim, Var_List)).
+
+make_map_vars(Dim, Var_Map_List) :-
+  make_map_var_list(0, Dim, Var_Map_List).
+make_map_var_list(Dim, Dim, []) :- !.
+make_map_var_list(I, Dim, ['$VAR'(I)-'$VAR'(I)|Var_Map_List]) :-
+  I < Dim,
+  (I1 is I + 1,
+  make_map_var_list(I1, Dim, Var_Map_List)).
+
+%%%%%%%%%%%% predicates for success and errors.  %%%%%%%%%%%%%%%%%
+
+write_success(Predicate_name) :-
+  display_message([test, for, Predicate_name, 'succeeded.']).
+
+write_error(Predicate_name) :-
+  write_all([test, for, Predicate_name, 'failed.']).
+
+
+%%%%%%%%%%%% test data selection       %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all_tests(0, [test00, test02]).
+all_tests(1, [test01, test03, test04, test05, test06, test07]).
+
+choose_test(TEST_DATA, Dim) :-
+   all_tests(_, Tests),
+   member(TEST_DATA, Tests),
+   ppl_dimension_test_data(TEST_DATA, space_dimension, Dim).
+
+choose_2_tests(TEST_DATA1, TEST_DATA2, Dim) :-
+   all_tests(0, Tests0),
+   all_tests(1, Tests1),
+   (
+     (member(TEST_DATA1, Tests0),
+      member(TEST_DATA2, Tests0)) ;
+     (member(TEST_DATA1, Tests1),
+      member(TEST_DATA2, Tests1))
+   ),
+   ppl_dimension_test_data(TEST_DATA1, space_dimension, Dim),
+   ppl_dimension_test_data(TEST_DATA2, space_dimension, Dim).
+
+:- discontiguous(ppl_build_test_data/4).
+:- discontiguous(ppl_dimension_test_data/3).
+:- discontiguous(ppl_relation_test_data/4).
+:- discontiguous(ppl_property_test_data/4).
+:- discontiguous(ppl_bounds_test_data/5).
+:- discontiguous(ppl_maxmin_test_data/10).
+:- discontiguous(ppl_constrains_test_data/3).
+:- dynamic(all_class_dependent_predicates/1).
+:- discontiguous(all_class_dependent_predicates/1).
+
+ppl_initial_test_system(constraint, universe).
+ppl_initial_test_system(congruence, universe).
+ppl_initial_test_system(generator, empty).
+ppl_initial_test_system(grid_generator, empty).
+
+predicate_exists(Predicate) :-
+  all_class_dependent_predicates(List_of_Predicates),
+  member(Predicate, List_of_Predicates).
+
+
+%%%%%%%%%%%% predicates for test data %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/* Test data for test test00 (an empty object in 0 dimensions) */
+
+ppl_build_test_data(test00, _Topology, constraints, [0 = 1]).
+ppl_build_test_data(test00, _Topology, generators, []).
+ppl_build_test_data(test00, _Topology, congruences, [0 = 1]).
+ppl_build_test_data(test00, _Topology, grid_generators, []).
+
+ppl_dimension_test_data(test00, _, 0).
+
+ppl_relation_test_data(test00, constraint, 0 = 1, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test00, generator, point(0), []).
+ppl_relation_test_data(test00, congruence, (0 =:= 1) / 0, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test00, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test00, _, _, is_empty).
+ppl_property_test_data(test00, _, _, is_bounded).
+ppl_property_test_data(test00, _, _, is_topologically_closed).
+ppl_property_test_data(test00, _, _, is_discrete).
+
+ppl_bounds_test_data(test00, _, 0, _, true).
+
+ppl_maxmin_test_data(test00, _Topology, _, _, 0, _, _, _, _, false).
+
+/* Test data for test test01 (an empty object in 1 dimension) */
+
+ppl_build_test_data(test01, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A >= 1, A =< 0]).
+ppl_build_test_data(test01, _Topology, generators, []).
+ppl_build_test_data(test01, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= 1) / 2, (A =:= 0) / 2]).
+ppl_build_test_data(test01, _Topology, grid_generators, []).
+
+ppl_dimension_test_data(test01, space_dimension, 1).
+ppl_dimension_test_data(test01, affine_dimension, 0).
+
+ppl_relation_test_data(test01, constraint, 0 = 1, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test01, generator, point(0), []).
+ppl_relation_test_data(test01, congruence, 0 = 1, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test01, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test01, _, _, is_empty).
+ppl_property_test_data(test01, _, _, is_bounded).
+ppl_property_test_data(test01, _, _, is_topologically_closed).
+ppl_property_test_data_(test01, _, _, is_discrete).
+
+ppl_bounds_test_data(test01, _, A, _, true) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test01, _Topology, _, _, 0, _, _, _, _, false).
+
+ppl_constrains_test_data(test01, _, true).
+
+/* Test data for test test02 (a universe object in 0 dimensions) */
+
+ppl_build_test_data(test02, _Topology, constraints, []).
+ppl_build_test_data(test02, _Topology, generators, [point(0)]).
+ppl_build_test_data(test02, _Topology, congruences, []).
+ppl_build_test_data(test02, _Topology, grid_generators, [grid_point(0)]).
+
+ppl_dimension_test_data(test02, _, 0).
+
+ppl_relation_test_data(test02, constraint, 0 = 0, Rel) :-
+  Rel = [saturates, is_included] ; Rel = [is_included, saturates]
+  ; Rel = [is_included].
+ppl_relation_test_data(test02, generator, point(0), [subsumes]).
+ppl_relation_test_data(test02, congruence, 0 = 0, Rel) :-
+  Rel = [saturates, is_included] ; Rel = [is_included, saturates]
+  ; Rel = [is_included].
+ppl_relation_test_data(test02, grid_generator, grid_point(0), [subsumes]).
+
+ppl_property_test_data(test02, _, _, is_bounded).
+ppl_property_test_data(test02, _, _, is_topologically_closed).
+ppl_property_test_data(test02, _, _, is_discrete).
+ppl_property_test_data(test02, _, _, contains_integer_point).
+
+ppl_bounds_test_data(test02, _, 0, _, true).
+
+ppl_maxmin_test_data(test02, _Topology, constraint, _, 0, 0, 1, true,
+                     point(0), true).
+ppl_maxmin_test_data(test02, _Topology, congruence, _, 0, 0, 1, true,
+                     grid_point(0), true).
+
+/* Test data for test test03 (a universe object in 1 dimension) */
+
+ppl_build_test_data(test03, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = A]).
+ppl_build_test_data(test03, _Topology, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(0), line(A)]).
+ppl_build_test_data(test03, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = A]).
+ppl_build_test_data(test03, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(0), grid_line(A)]).
+
+ppl_dimension_test_data(test03, _, 1).
+
+ppl_relation_test_data(test03, constraint, A = 0, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test03, generator, point(0), [subsumes]).
+ppl_relation_test_data(test03, congruence, A = 0, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test03, grid_generator, grid_point(0), [subsumes]).
+
+ppl_property_test_data(test03, _, _, is_universe).
+ppl_property_test_data(test03, _, _, is_topologically_closed).
+ppl_property_test_data(test03, _, _, contains_integer_point).
+
+ppl_bounds_test_data(test03, _, A, _, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test03, _Topology, _, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test03, _, false).
+
+/* Test data for test test04 and test05
+   (an object in 1 dimension with a single point) */
+
+ppl_build_test_data(test04, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = 1]).
+
+ppl_build_test_data(test04, _Topology, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(1*A)]).
+ppl_build_test_data(test04, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = 1]).
+ppl_build_test_data(test04, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(1*A)]).
+
+ppl_dimension_test_data(test04, space_dimension, 1).
+ppl_dimension_test_data(test04, affine_dimension, 0).
+
+ppl_relation_test_data(test04, constraint, A = 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test04, generator, point(0), []).
+ppl_relation_test_data(test04, congruence, A = 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test04, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test04, _, _, is_bounded).
+ppl_property_test_data(test04, _, _, is_topologically_closed).
+ppl_property_test_data(test04, _, _, contains_integer_point).
+ppl_property_test_data(test04, _, _, is_discrete).
+
+ppl_bounds_test_data(test04, _, A, _, true) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test04, _Topology, constraint, _, A, 1, 1, true,
+                     point(A), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test04, _Topology, congruence, _, A, 1, 1, true,
+             grid_point(A), true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test04, _, true).
+
+ppl_build_test_data(test05, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = -1]).
+ppl_build_test_data(test05, _Topology, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(-1*A)]).
+ppl_build_test_data(test05, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = -1]).
+ppl_build_test_data(test05, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(-1*A)]).
+
+ppl_dimension_test_data(test05, space_dimension, 1).
+ppl_dimension_test_data(test05, affine_dimension, 0).
+
+ppl_relation_test_data(test05, constraint, A = 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test05, generator, point(0), []).
+ppl_relation_test_data(test05, congruence, A = 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test05, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test05, _, _, is_bounded).
+ppl_property_test_data(test05, _, _, is_topologically_closed).
+ppl_property_test_data(test05, _, _, contains_integer_point).
+ppl_property_test_data(test05, _, _, is_discrete).
+
+ppl_bounds_test_data(test05, _, A, _, true) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test05, _Topology, constraint, _, A, -1, 1, true,
+                     point(-1*A), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test05, _Topology, congruence, _, A, -1, 1, true,
+             grid_point(-1*A), true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test05, _, true).
+
+/* Test data for test test06,
+            a non-universe object in 1 dimension with no upper bound */
+
+ppl_build_test_data(test06, T, constraints, CS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   CS = [A >= 0]).
+ppl_build_test_data(test06, T, generators, GS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   GS = [point(0*A), ray(A)]).
+ppl_build_test_data(test06, t_NNC_, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A > 0]).
+ppl_build_test_data(test06, t_NNC_, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(A), closure_point(0*A), ray(A)]).
+ppl_build_test_data(test06, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [A =:= 0]).
+ppl_build_test_data(test06, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(0*A), parameter(1*A)]).
+
+ppl_dimension_test_data(test06, _, 1).
+
+ppl_relation_test_data(test06, constraint, A =< 3, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test06, generator, point(3*A), [subsumes]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test06, congruence, (2*A =:= 1) / 3,
+                                              [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test06, grid_generator, grid_point(3*A), [subsumes]) :-
+  make_vars(1, [A]).
+
+ppl_property_test_data(test06, T, _, is_topologically_closed) :-
+  \+ T == t_NNC_.
+ppl_property_test_data(test06, _, _, contains_integer_point).
+ppl_property_test_data(test06, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test06, _, A, above, false) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test06, constraint, A, below, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test06, congruence, A, below, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test06, T, constraint, maximize, A, _, _, _, _, false) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test06, T, constraint, minimize, A, 0, 1, true,
+                     point(0), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test06, t_NNC_, constraint, maximize, A, _, _, _,
+                     _, false) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test06, t_NNC_, constraint, minimize, A, 0, 1, false,
+                     closure_point(0), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test06, _, congruence, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test06, _, true).
+
+/* Test data for test test07,
+    a non-universe object in 1 dimension with no lower bound */
+
+ppl_build_test_data(test07, T, constraints, CS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   CS = [A =< 0]).
+ppl_build_test_data(test07, T, generators, GS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   GS = [point(0*A), ray(-1*A)]).
+ppl_build_test_data(test07, t_NNC_, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A < 0]).
+ppl_build_test_data(test07, t_NNC_, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(A), closure_point(0*A), ray(-1*A)]).
+ppl_build_test_data(test07, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= 0) / 2]).
+ppl_build_test_data(test07, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(0*A), parameter(-2*A)]).
+
+ppl_dimension_test_data(test07, _, 1).
+
+ppl_relation_test_data(test07, constraint, A >= -3, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test07, generator, point(-4*A), [subsumes]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test07, congruence, (2*A =:= 1) / 3,
+                                              [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test07, grid_generator, grid_point(6*A), [subsumes]) :-
+  make_vars(1, [A]).
+
+ppl_property_test_data(test07, T, _, is_topologically_closed) :-
+  \+ T == t_NNC_.
+ppl_property_test_data(test07, _, _, contains_integer_point).
+ppl_property_test_data(test07, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test07, _, A, below, false) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test07, constraint, A, above, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test07, congruence, A, above, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test07, T, constraint, minimize, A, _, _, _, _, false) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test07, T, constraint, maximize, A, 0, 1, true,
+                     point(0), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test07, t_NNC_, constraint, minimize, A, _, _, _,
+                     _, false) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test07, t_NNC_, constraint, maximize, A, 0, 1, false,
+                     closure_point(0), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test07, _, congruence, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test07, _, true).
+
+/* Test data for test test08,
+    a non-universe bounded object in 1 dimension */
+
+ppl_build_test_data(test08, T, constraints, CS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   CS = [2*A >= 3, A =< 5]).
+ppl_build_test_data(test08, T, generators, GS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   GS = [point(3*A, 2), point(5*A)]).
+ppl_build_test_data(test08, t_NNC_, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [2*A > 3, A < 5]).
+ppl_build_test_data(test08, t_NNC_, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(2*A), closure_point(3*A, 2), closure_point(5*A)]).
+ppl_build_test_data(test08, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(2*A =:= 3) / 7]).
+ppl_build_test_data(test08, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(3*A, 2), parameter(7*A, 2)]).
+
+ppl_dimension_test_data(test08, _, 1).
+
+ppl_relation_test_data(test08, constraint, A >= 3, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test08, generator, point(5*A, 2), [subsumes]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test08, congruence, (2*A =:= 1) / 3,
+                                              [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test08, grid_generator, grid_point(5*A), [subsumes]) :-
+  make_vars(1, [A]).
+
+ppl_property_test_data(test08, T, _, is_topologically_closed) :-
+  \+ T == t_NNC_.
+ppl_property_test_data(test08, _, _, contains_integer_point).
+ppl_property_test_data(test08, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test08, constraint, A, above, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test08, congruence, A, above, false) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test08, constraint, A, below, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test08, congruence, A, below, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test08, T, constraint, minimize, A, 3, 2, true,
+                     point(3*A, 2), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test08, T, constraint, maximize, A, 5, 1, true,
+                     point(5*A), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test08, t_NNC_, constraint, minimize, A, 3, 2, false,
+                     closure_point(3*A, 2), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test08, t_NNC_, constraint, maximize, A, 5, 1, false,
+                     closure_point(5*A), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test08, _, congruence, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test08, _, true).
+
+/* boxes  */
+
+ppl_dimension_test_data(test10, _, 2).
+ppl_dimension_test_data(test11, _, 2).
+ppl_dimension_test_data(test12, _, 2).
+
+ppl_build_test_data(test00, _Topology, box, [empty]).
+ppl_build_test_data(test01, _Topology, box, [empty]).
+ppl_build_test_data(test02, _Topology, box, []).
+ppl_build_test_data(test03, _Topology, box, [i(o(minf), o(pinf))]).
+ppl_build_test_data(test04, _Topology, box, [i(c(1), c(1))]).
+ppl_build_test_data(test05, _Topology, box, [i(c(-1), c(-1))]).
+ppl_build_test_data(test06, _Topology, box, [i(c(0), o(pinf))]).
+ppl_build_test_data(test07, _Topology, box, [i(o(minf), c(0))]).
+ppl_build_test_data(test08, _Topology, box, [i(c(3/2), c(5))]).
+ppl_build_test_data(test10, _Topology, box,
+                               [i(c(1/2), o(pinf)), i(o(minf), c(-1/2))]).
+ppl_build_test_data(test11, _Topology, box, [i(c(-4), c(1)), i(c(-1), c(1))]).
+ppl_build_test_data(test12, T, box, [i(c(0/2), o(pinf)), i(o(minf), c(1))]) :-
+  \+ T == t_NNC_.
+ppl_build_test_data(test12, t_NNC_, box, [i(o(0/2), o(pinf)), i(o(minf), o(1))]).
diff --git a/interfaces/Prolog/track_allocation.hh b/interfaces/Prolog/track_allocation.hh
deleted file mode 100644
index 08604fe..0000000
--- a/interfaces/Prolog/track_allocation.hh
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Code for keeping track of polyhedra allocations and deallocations.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_track_allocation_hh
-#define PPL_track_allocation_hh
-
-#ifndef PROLOG_TRACK_ALLOCATION
-#define PROLOG_TRACK_ALLOCATION 0
-#endif
-
-#if PROLOG_TRACK_ALLOCATION
-
-#include <set>
-#include <iostream>
-
-namespace Parma_Polyhedra_Library {
-
-class Poly_Tracker {
-public:
-  void insert(const void* pp);
-  void check(const void* pp) const;
-  void remove(const void* pp);
-
-  Poly_Tracker();
-  ~Poly_Tracker();
-
-private:
-  typedef std::set<const void*, std::less<const void*> > Set;
-  Set s;
-};
-
-inline
-Poly_Tracker::Poly_Tracker() {
-}
-
-inline
-Poly_Tracker::~Poly_Tracker() {
-  Set::size_type n = s.size();
-  if (n > 0)
-    std::cerr << "Poly_Tracker: " << n << " polyhedra leaked!" << std::endl;
-}
-
-inline void
-Poly_Tracker::insert(const void* pp) {
-  std::pair<Set::iterator, bool> stat = s.insert(pp);
-  if (!stat.second) {
-    std::cerr << "Poly_Tracker: two polyhedra at the same address "
-	      << "at the same time?!" << std::endl;
-    abort();
-  }
-}
-
-inline void
-Poly_Tracker::check(const void* pp) const {
-  if (s.find(pp) == s.end()) {
-    std::cerr << "Poly_Tracker: attempt to access an inexistent polyhedron."
-	      << std::endl;
-    abort();
-  }
-}
-
-void
-Poly_Tracker::remove(const void* pp) {
-  if (s.erase(pp) != 1) {
-    std::cerr << "Poly_Tracker: attempt to deallocate "
-	      << "an inexistent polyhedron."
-	      << std::endl;
-    abort();
-  }
-}
-
-namespace {
-
-inline Poly_Tracker&
-poly_tracker() {
-  static Poly_Tracker pt;
-  return pt;
-}
-
-} // namespace
-
-} // namespace Parma_Polyhedra_Library
-
-
-#define REGISTER(x) Parma_Polyhedra_Library::poly_tracker().insert(x)
-#define UNREGISTER(x) Parma_Polyhedra_Library::poly_tracker().remove(x)
-#define CHECK(x) Parma_Polyhedra_Library::poly_tracker().check(x)
-
-#else
-
-#define REGISTER(x)
-#define UNREGISTER(x)
-#define CHECK(x)
-
-#endif
-
-#endif // !defined(PPL_track_allocation_hh)
diff --git a/interfaces/interfaced_boxes.hh b/interfaces/interfaced_boxes.hh
new file mode 100644
index 0000000..a67fbb1
--- /dev/null
+++ b/interfaces/interfaced_boxes.hh
@@ -0,0 +1,115 @@
+/* Declarations for the Box instantiations offered by the foreign interfaces.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_interfaced_boxes_hh
+#define PPL_interfaced_boxes_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+struct Z_Box_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef
+Interval_Restriction_None<Interval_Info_Bitset
+                          <unsigned int,
+                           Z_Box_Interval_Info_Policy> >
+Z_Box_Interval_Info;
+
+typedef Box<Interval<mpz_class, Z_Box_Interval_Info> > Z_Box;
+
+struct Floating_Point_Box_Interval_Info_Policy {
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef
+Interval_Restriction_None<Interval_Info_Bitset
+                          <unsigned int,
+                           Floating_Point_Box_Interval_Info_Policy> >
+Floating_Point_Box_Interval_Info;
+
+typedef
+Box<Interval<float, Floating_Point_Box_Interval_Info> >
+Float_Box;
+
+typedef Box<Interval<double, Floating_Point_Box_Interval_Info> >
+Double_Box;
+
+typedef Box<Interval<long double, Floating_Point_Box_Interval_Info> >
+Long_Double_Box;
+
+struct Native_Integer_Box_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef
+Interval_Restriction_None<Interval_Info_Bitset
+                          <unsigned int,
+                           Native_Integer_Box_Interval_Info_Policy> >
+Native_Integer_Box_Interval_Info;
+
+typedef Box<Interval<int8_t, Native_Integer_Box_Interval_Info> > Int8_Box;
+
+typedef Box<Interval<int16_t, Native_Integer_Box_Interval_Info> > Int16_Box;
+
+typedef Box<Interval<int32_t, Native_Integer_Box_Interval_Info> > Int32_Box;
+
+typedef Box<Interval<int64_t, Native_Integer_Box_Interval_Info> > Int64_Box;
+
+typedef Box<Interval<uint8_t, Native_Integer_Box_Interval_Info> > Uint8_Box;
+
+typedef Box<Interval<uint16_t, Native_Integer_Box_Interval_Info> > Uint16_Box;
+
+typedef Box<Interval<uint32_t, Native_Integer_Box_Interval_Info> > Uint32_Box;
+
+typedef Box<Interval<uint64_t, Native_Integer_Box_Interval_Info> > Uint64_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_interfaced_boxes_hh)
diff --git a/interfaces/marked_pointers.hh b/interfaces/marked_pointers.hh
new file mode 100644
index 0000000..98e94f3
--- /dev/null
+++ b/interfaces/marked_pointers.hh
@@ -0,0 +1,64 @@
+/* Implementation of marked pointers for use in the PPL foreign interfaces.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_marked_pointers_hh
+#define PPL_marked_pointers_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#include <stdint.h>
+
+#define PPL_MARKED_POINTERS_MASK 0x00000001L
+
+/*! \brief
+  Returns the marked pointer corresponding to \p p.
+
+  The marking consists in setting the least significant bit to 1.
+*/
+template <typename T>
+inline T*
+mark(T* p) {
+  uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+  return reinterpret_cast<T*>(uint_p | (PPL_MARKED_POINTERS_MASK));
+}
+
+//! Returns the unmarked pointer corresponding to \p p.
+template <typename T>
+inline T*
+unmark(T* p) {
+  uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+  return reinterpret_cast<T*>(uint_p & ~(PPL_MARKED_POINTERS_MASK));
+}
+
+//! Returns <CODE>true</CODE> if and only if \p p is marked.
+template <typename T>
+inline bool
+marked(T* p) {
+  uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+  return (uint_p & (PPL_MARKED_POINTERS_MASK)) != 0;
+}
+
+#undef PPL_MARKED_POINTERS_MASK
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_marked_pointers_hh)
diff --git a/interfaces/ppl_interface_generator_common.m4 b/interfaces/ppl_interface_generator_common.m4
new file mode 100644
index 0000000..165c160
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common.m4
@@ -0,0 +1,621 @@
+m4_divert(-1)
+
+dnl This m4 file includes macro definitions for:
+dnl - application independent helper macros used here and by other m4 files.
+dnl - defining the main code generation macro m4_all_code.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl =====================================================================
+dnl ====== The following are application independent helper macros ======
+dnl =====================================================================
+
+dnl m4_forloop(Iteration_Var, From_Value, To_Value, Loop_Body)
+dnl
+dnl Code copied from m4 documentation.
+m4_define(`m4_forloop',
+  `m4_pushdef(`$1', `$2')_m4_forloop(`$1', `$2', `$3', `$4')m4_popdef(`$1')')
+m4_define(`_m4_forloop',
+  `$4`'m4_ifelse($1, `$3', ,
+    `m4_define(`$1', m4_incr($1))_m4_forloop(`$1', `$2', `$3', `$4')')')
+
+
+dnl m4_upcase(String), m4_downcase(String)
+dnl
+dnl Code copied from m4 documentation.
+dnl Examples: m4_upcase(`abCd')   ==> ABCD
+dnl           m4_downcase(`abCd') ==> abcd
+m4_define(`m4_upcase', `m4_translit(`$*', `a-z', `A-Z')')
+m4_define(`m4_downcase', `m4_translit(`$*', `A-Z', `a-z')')
+
+dnl m4_capfirstletter(String)
+dnl
+dnl Capitalises first letter of words that can have letters and underscores.
+dnl Example: m4_capfirstletter(`xyz_abc') ==> Xyz_abc
+m4_define(`m4_capfirstletter',
+  `m4_regexp(`$1', `^\(\w\)\([\w_]*\)',
+     m4_upcase(`\1')`\2')')
+
+dnl m4_capfirstletters(String)
+dnl
+dnl Capitalises first letter of subwords that can have letters only.
+dnl Example: m4_capfirstletter(`xyz_abc') ==> Xyz_Abc
+m4_define(`m4_capfirstletters',
+  `m4_ifelse(m4_index(`$1', `_'), -1,
+     `m4_regexp(`$1', `^\(\w\)\(\w*\)',
+       `m4_upcase(`\1')`\2'')',
+         m4_regexp(`$1', `^\(\w\)\(\w*_\)\(\w\)\(\w*\)',
+           `m4_upcase(`\1')`\2'm4_upcase(`\3')`\4''))')
+
+dnl m4_add_one_after_underscore(String)
+dnl
+dnl Adds a 1 after any underscore (needed for Java interface code)..
+dnl Example: m4_capfirstletter(`xyz_abc') ==> xyz_1abc
+m4_define(`m4_add_one_after_underscore', `m4_patsubst(`$1', `_', `_1')')
+
+dnl m4_ifndef(Macro, Default Definition)
+dnl
+dnl If Macro is defined, use that definition;
+dnl otherwise use the Default Definition.
+m4_define(`m4_ifndef', `m4_ifdef(`$1', $1, $2)')
+
+dnl m4_nargs expands to the number of arguments.
+dnl
+dnl Code copied from m4 documentation.
+m4_define(`m4_nargs', `$#')
+
+dnl m4_arg(Ind, Arg1, Arg2, ...)
+dnl
+dnl m4_arg expands to Arg`'Ind
+m4_define(`m4_arg',
+`m4_ifelse($1, 0, , $1, 1, $2, `m4_arg(m4_decr($1), m4_shift(m4_shift($@)))')')
+
+dnl m4_arg_counter(String, Arg1, Arg2, ...)
+dnl
+dnl If String = Arg`'Counter, m4_arg_counter expands to Counter
+dnl where Counter is the least index for which this holds.
+dnl Otherwise it expands to the empty string.
+m4_define(`m4_arg_counter', `m4_arg_counter_aux(1, $@)')
+
+m4_define(`m4_arg_counter_aux', `dnl
+m4_ifelse($#, 0, ,$#, 1, , $#, 2, ,
+  $2, $3, $1,
+  $#, 3, ,
+  `m4_arg_counter_aux(m4_incr($1), $2, m4_shift(m4_shift(m4_shift($@))))')`'dnl
+')
+
+dnl m4_echo_unquoted(Args)
+dnl
+dnl Code copied from m4 documentation where it is called echo1.
+m4_define(`m4_echo_unquoted', `$*')
+dnl m4_echo_quoted(Args)
+dnl
+dnl Code copied from m4 documentation where it is called echo2.
+m4_define(`m4_echo_quoted', `$@')
+
+dnl ----------------------------------------------------------------------
+dnl m4_two_seq_intersection,
+dnl m4_three_seq_intersection and helper macros
+dnl
+dnl These find the intersection of two and three sequences, respectively.
+dnl ----------------------------------------------------------------------
+dnl
+dnl m4_seq_intersection
+dnl
+dnl This macro with its helper macros below,
+dnl intersects two or three sequences that must be previously defined
+dnl as `m4_1st_sequence', `m4_2nd_sequence' and, if there is a third,
+dnl `m4_3rd_sequence'. The number of sequences (2 or 3) must also be defined
+dnl by the macro `m4_number_of_sequences'. The order of the
+dnl intersected sequence is that of m4_1st_sequence.
+dnl
+dnl For example, if m4_1st_sequence is defined to be `a, b, c, d' and
+dnl m4_2nd_sequence is defined to be `b, d, e, a, f',
+dnl this macro is defined to be `a, b, d'.
+m4_define(`m4_seq_intersection', `dnl
+m4_define(`m4_add_one_first', 1)`'dnl
+m4_patsubst(m4_seq_intersection_aux(m4_1st_sequence),
+            @COMMA@, `, ')`'dnl
+')
+
+dnl m4_seq_intersection_aux(...)
+dnl
+dnl The arguments are the first sequence to be intersected.
+dnl It calls either the helper macro for 3 sequences or the helper
+dnl macro for 2 sequences (depending on the number of sequences).
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1,
+  m4_`'m4_num_of_sequences`'_seq_intersection_aux($1, m4_2nd_sequence),
+  m4_`'m4_num_of_sequences`'_seq_intersection_aux($1, m4_2nd_sequence)`'dnl
+`m4_seq_intersection_aux(m4_shift($@))')`'dnl
+')
+
+dnl m4_3_seq_intersection_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' also occurs
+dnl in the 2nd or in a later argument position
+dnl as well as in m4_3rd_sequence.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_3_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+  `m4_ifelse($1, $2, `m4_2_seq_intersection_aux($1, m4_3rd_sequence)')',
+  `m4_ifelse($1, $2, `m4_2_seq_intersection_aux($1, m4_3rd_sequence)',
+`m4_3_seq_intersection_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl m4_2_seq_intersection_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' also occurs
+dnl in the 2nd or in a later argument position.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_2_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+  `m4_ifelse($1, $2, `m4_add_one($1)')',
+  `m4_ifelse($1, $2, `m4_add_one($1)',
+`m4_2_seq_intersection_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl m4_add_one(String)
+dnl
+dnl This separates the new sequence temporarily with @COMMA@ to avoid
+dnl the `,' being mis-interpreted by m4.
+m4_define(`m4_add_one', `dnl
+m4_ifelse(m4_add_one_first, 1,
+  $1`'m4_undefine(`m4_add_one_first'), @COMMA@$1)`'dnl
+')
+
+dnl =====================================================================
+dnl ====== The following are application dependent macros: their meaning
+dnl ====== is influenced by the overall interface generator architecture.
+dnl =====================================================================
+
+dnl =====================================================================
+dnl ====== The next group of macros process the patterns in the code ====
+dnl =====================================================================
+
+dnl m4_pattern_delimiter
+dnl
+dnl In case the pattern delimiter needs to be changed,
+dnl this is defined as a global variable
+m4_define(`m4_pattern_delimiter', `@')
+
+dnl m4_expand_pattern_by_one_replacement(Pattern, Index)
+dnl
+dnl Pattern       - is the pattern;
+dnl Index         - is the index of the replacement.
+dnl The delimited PATTERN is replaced by the Index'th argument in
+dnl m4_replacements.
+dnl Additional codes help provide the right form of the replacmement:
+dnl - alt_ means that the alternative replacement in m4_alt_replacements
+dnl must be used if one exists.
+dnl - cppx_ means that the alternative replacement in m4_cppx_replacements
+dnl must be used if one exists.
+dnl - when the alt_replace is NONE, then the code is replaced by the
+dnl   the empty string.
+dnl - U means that the alt_actual string must be capitalised at start
+dnl   of word and after "_".
+m4_define(`m4_expand_pattern_by_one_replacement', `dnl
+dnl
+dnl m4_replace is the replacement for pattern
+m4_define(`m4_replace', `m4_arg($2, m4_replacements)')`'dnl
+dnl
+dnl m4_alt_replace is the replacement for alt_pattern
+m4_define(`m4_alt_replace', `m4_arg($2, m4_alt_replacements)')`'dnl
+dnl m4_alt_replace is the replacement for alt_pattern
+m4_define(`m4_cppx_replace', `m4_arg($2, m4_cppx_replacements)')`'dnl
+dnl
+m4_ifelse(m4_replace, NONE, `',
+          m4_alt_replace, NONE, `',
+m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(
+            m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(
+            m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(
+            m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(
+            m4_patsubst(m4_patsubst($1,
+  m4_pattern_delimiter`'1U`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_capfirstletters(m4_replace))),
+  m4_pattern_delimiter`'1L`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_downcase(m4_replace))),
+  m4_pattern_delimiter`'U`'PATTERN`'m4_pattern_delimiter,
+    m4_capfirstletters(m4_replace)),
+  m4_pattern_delimiter`'L`'PATTERN`'m4_pattern_delimiter,
+    m4_downcase(m4_replace)),
+  m4_pattern_delimiter`'1`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_replace)),
+  m4_pattern_delimiter`'1UALT_`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_capfirstletters(m4_alt_replace))),
+  m4_pattern_delimiter`'UALT_`'PATTERN`'m4_pattern_delimiter,
+    m4_capfirstletters(m4_alt_replace)),
+  m4_pattern_delimiter`'1LALT_`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_downcase(m4_alt_replace))),
+  m4_pattern_delimiter`'LALT_`'PATTERN`'m4_pattern_delimiter,
+    m4_downcase(m4_alt_replace)),
+  m4_pattern_delimiter`'1ALT_`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_alt_replace)),
+  m4_pattern_delimiter`'ALT_`'PATTERN`'m4_pattern_delimiter,
+    m4_alt_replace),
+  m4_pattern_delimiter`'1UCPPX_`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_capfirstletters(m4_alt_replace))),
+  m4_pattern_delimiter`'UCPPX_`'PATTERN`'m4_pattern_delimiter,
+    m4_capfirstletters(m4_alt_replace)),
+  m4_pattern_delimiter`'1LCPPX_`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_downcase(m4_alt_replace))),
+  m4_pattern_delimiter`'LCPPX_`'PATTERN`'m4_pattern_delimiter,
+    m4_downcase(m4_alt_replace)),
+  m4_pattern_delimiter`'1CPPX_`'PATTERN`'m4_pattern_delimiter,
+    m4_add_one_after_underscore(m4_alt_replace)),
+  m4_pattern_delimiter`'CPPX_`'PATTERN`'m4_pattern_delimiter,
+    m4_cppx_replace),
+  m4_pattern_delimiter`'PATTERN`'m4_pattern_delimiter,
+    m4_replace)`'dnl
+)`'dnl
+dnl
+m4_undefine(`m4_replace')`'dnl
+m4_undefine(`m4_alt_replace')`'dnl
+')
+
+dnl m4_expand_pattern_by_replacements(Pattern, Index)
+dnl
+dnl Pattern       - is the pattern;
+dnl Index         - is the index of the replacement.
+dnl This iteratively calls m4_expand_pattern_by_one_replacement/2 to replace
+dnl a delimited form of PATTERN by the Index'th argument in m4_replacements
+dnl or m4_alt_replacements.
+m4_define(`m4_expand_pattern_by_replacements', `dnl
+m4_ifelse($2, m4_nargs(m4_replacements),
+  `m4_expand_pattern_by_one_replacement($1, $2)',
+  `dnl
+m4_expand_pattern_by_one_replacement($1, $2)`'dnl
+m4_expand_pattern_by_replacements($1, m4_incr($2))')`'dnl
+')
+
+dnl m4_replace_one_pattern_in_string(Class_Number, String, Pattern)
+dnl
+dnl Class_Number  - is the index to Class in Class_List;
+dnl String        - is the code to be changed;
+dnl Pattern       - is the pattern to be replaced;
+dnl Replaces all occurrences of the capitalised form of Pattern
+dnl in String by the required replacement
+dnl (determined both by the class kind of Class and Pattern).
+m4_define(`m4_replace_one_pattern_in_string', `dnl
+dnl
+dnl the PATTERN (in uppercase) is the string to be replaced.
+m4_define(`PATTERN', m4_upcase($3))`'dnl
+dnl
+dnl m4_replacements is the replacement list for the pattern.
+m4_define(`m4_replacements', `dnl
+m4_class_pattern_replacement($1, $3, `')')`'dnl
+dnl
+dnl m4_alt_replacements is the alternative replacement list for pattern.
+m4_define(`m4_alt_replacements', `dnl
+m4_class_pattern_replacement($1, $3, `_alt')')`'dnl
+dnl
+dnl m4_cppx_replacements is the cplusplus replacement list for pattern.
+m4_define(`m4_cppx_replacements', `dnl
+m4_class_pattern_replacement($1, $3, `_cppx')')`'dnl
+dnl
+m4_ifelse(m4_index(`$2', PATTERN), `-1', $2, `dnl
+m4_expand_pattern_by_replacements($2, 1)')`'dnl
+dnl
+m4_undefine(`PATTERN')`'dnl
+m4_undefine(`m4_replacements')`'dnl
+m4_undefine(`m4_alt_replacements')`'dnl
+m4_undefine(`m4_cppx_replacements')`'dnl
+')
+
+dnl m4_replace_all_patterns_in_string(
+dnl    Class_Number, String, Pattern1, Pattern2, ...)
+dnl
+dnl A (recursive) macro to replace, inside the second argument String,
+dnl all of the patterns listed from the third argument onwards.
+m4_define(`m4_replace_all_patterns_in_string', `dnl
+m4_ifelse($3, `', ``$2'',
+       `m4_replace_all_patterns_in_string($1,
+                                m4_replace_one_pattern_in_string($1, $2, $3),
+                                m4_shift(m4_shift(m4_shift($@))))')`'dnl
+')
+
+dnl =====================================================================
+dnl ====== The next macros deal with instantiating the schematic code ===
+dnl ====== and also generates lists of names augmented with extensions. =
+dnl =====================================================================
+
+
+dnl m4_get_arity(Procedure_Flags)
+dnl
+dnl Procedure_Flags - The schematic code flags;
+dnl If the substring "/Arity" is found in the Procedure_Flags,
+dnl this macro expands to Arity.
+m4_define(`m4_get_arity', `m4_regexp(`$1', `/\([0-9]*\)', \1)')
+
+dnl m4_get_attribute(Procedure_Flags)
+dnl
+dnl Procedure_Flags - The schematic code flags;
+dnl If the substring "*nofail" is found in the Procedure_Flags,
+dnl this macro expands to "nofail"
+dnl This is only needed for the Ciao system code.
+m4_define(`m4_get_attribute', `m4_regexp(`$1', `\*\(nofail\)', \1)')
+
+dnl m4_extension(Procedure_Name, [Arity, Attribute], Start_Flag)
+dnl
+dnl Procedure_Name - The schematic name;
+dnl Arity          - The arity of the procedure;
+dnl Attribute      - The attribute `nofail' or `';
+dnl Start_Flag     - 0 suppresses any separator.
+dnl                  (Needed for expanding Prolog lists of atoms etc.).
+dnl
+dnl The default definition.
+dnl Appends "_code" to Procedure_Name so that it can match the name
+dnl of one of the macros defined (if ever) in file *_code.m4 and get
+dnl therefore expanded to the corresponding code schema.
+dnl
+dnl Here arguments Arity and Attribute are ignored.
+dnl This macro is redefined when a different extension is needed.
+dnl (e.g., in the Prolog system files).
+dnl
+dnl Note: the macro `$1_code' has to be called using builtin `indir'
+dnl because it is not a legal m4 identifier (it contains `@').
+m4_define(`m4_default_code', `')
+m4_define(`m4_extension', `m4_ifdef(`$1_code', `m4_indir(`$1_code')',
+  `m4_default_code($1)')`'dnl
+')
+
+dnl m4_get_schematic_code(Procedure_Spec, Start_Flag, Class_Kind)
+dnl
+dnl Procedure_Spec - The schematic procedure name, complete with any flags;
+dnl Start_Flag     - 0 suppresses any separator.
+dnl                  (Needed for expanding Prolog lists of atoms etc.).
+dnl Class_Kind     - The current class kind;
+dnl Procedure_Spec has the flags removed and expanded to
+dnl the extended code.
+m4_define(`m4_get_schematic_code', `dnl
+m4_patsubst(`$1',
+         `[ ]*\(ppl_[^ /]+\)\(.*\)',
+         `m4_extension(\1, m4_get_arity(\2), m4_get_attribute(\2), $2, $3)')')
+
+dnl m4_replace_procedure_spec_by_code(Class_Number, Procedure_Spec)
+dnl
+dnl Class_Number   - The current class counter.
+dnl Procedure_Spec - The schematic procedure name, complete with any flags;
+dnl The procedure specification is replaced with the code and then
+dnl the patterns in the code are replaced by the required replacements.
+dnl
+dnl Note: one schematic specification will replaced by a single
+dnl matching schematic code item; which is then replaced by several
+dnl instances.
+m4_undefine(`m4_replace_procedure_spec_by_code')
+m4_define(`m4_replace_procedure_spec_by_code', `dnl
+m4_patsubst(`$2', `\(.*\)', `dnl
+m4_replace_all_patterns_in_string($1,
+  m4_get_schematic_code(\1, 1, $1),
+    m4_pattern_list)')`'dnl
+')
+
+dnl m4_replace_all_procedure_specs_by_code(Class_Number,
+dnl                            Procedure_Spec1, Procedure_Spec2, ...)
+dnl
+dnl Class_Number    - The current class counter.
+dnl Procedure_Spec1 - A schematic procedure name;
+dnl ...
+dnl Procedure_Speck - A schematic procedure name
+dnl Each name from the second argument onwards is replaced
+dnl with the code and then the schema patterns in the code
+dnl are replaced by the various instances.
+m4_define(`m4_replace_all_procedure_specs_by_code', `dnl
+m4_ifelse($#, 0, , $#, 1, ,
+       $#, 2, `m4_replace_procedure_spec_by_code($1, $2)',
+       `dnl
+m4_replace_procedure_spec_by_code($1, $2)`'dnl
+m4_replace_all_procedure_specs_by_code($1, m4_shift(m4_shift($@)))`'dnl
+')dnl
+')
+
+dnl =====================================================================
+dnl ====== The next set of macros filter the procedure specifications   =
+dnl ====== according to the +/-group names in the extra flags in the    =
+dnl ====== procedure specification.                                     =
+dnl =====================================================================
+
+dnl m4_keep_or_throw_for_one_group(
+dnl     Class__Counter, Procedure_Spec, +_or_-, Group)
+dnl
+dnl Class_Counter   - The current class counter;
+dnl Procedure_Spec  - A schematic procedure name with flags still attached;
+dnl +_or_-          - + or -;
+dnl Group           - A group name.
+dnl This checks if or Class_Kind is in the list of class kinds defined
+dnl by Group (in ppl_interface_generator_common_dat.m4);
+dnl if it is, it checks if +Group or -Group
+dnl (depending if +_or_- is + or -) is included in the Procedure_Spec;
+dnl if it is, then it expands to 1, otherwise, expands to 0.
+m4_define(`m4_keep_or_throw_for_one_group', `dnl
+m4_ifelse(m4_arg_counter($1, m4_$4_group), `', 0,
+  `m4_ifelse(m4_index($2, $3$4), -1, 0, 1)')`'dnl
+')
+
+dnl m4_keep_or_throw(
+dnl     Class_Counter, Procedure_Spec, +_or_-, Group1, Group2, ...)
+dnl
+dnl Class_Counter   - The current class counter;
+dnl Procedure_Spec  - A schematic procedure name with flags still attached;
+dnl +_or_-          - + or -;
+dnl Group1          - A group name;
+dnl ....
+dnl Groupk          - A group name.
+m4_define(`m4_keep_or_throw', `dnl
+m4_ifelse($#, 0, 0, $#, 1, 0, $#, 2, 0, $#, 3, 0,
+  $#, 4, `m4_keep_or_throw_for_one_group($1, $2, $3, $4)',
+    `m4_ifelse(m4_keep_or_throw_for_one_group($1, $2, $3, $4), 1, 1,
+      `m4_keep_or_throw($1, $2, $3,
+                       m4_shift(m4_shift(m4_shift(m4_shift($@)))))')')`'dnl
+')
+
+dnl m4_filter_one_procedure(Class_Counter, Procedure_Spec)
+ dnl
+dnl Class_Counter   - The current class counter;
+dnl Procedure_Spec  - A schematic procedure name with flags still attached;
+dnl Keeps just those procedures that are wanted for the given class kind.
+dnl It first checks if there is a group in Procedure_Spec, whose
+dnl definition includes the Class_Kind, preceded by a "-",
+dnl if so, it expands to the empty string;
+dnl otherwise, it checks if there is a group in Procedure_Spec, whose
+dnl definition includes the Class_Kind, preceded by a "+",
+dnl if so, it expands to Procedure_Spec.
+m4_define(`m4_filter_one_procedure', `dnl
+m4_define(`m4_proc_info_string',
+       `m4_patsubst(`$2', `[ ]*ppl_[^ ]+ \(.*\)', \1)')`'dnl
+m4_ifelse(m4_keep_or_throw(m4_class_kind$1,
+                           m4_proc_info_string, -,
+                           m4_group_names),
+  1, 0,
+  m4_keep_or_throw(m4_class_body_kind$1,
+                             m4_proc_info_string, \,
+                             m4_group_names),
+  1, 0,
+  m4_keep_or_throw(m4_class_body_2nd_kind$1,
+                             m4_proc_info_string, ?,
+                             m4_group_names),
+  1, 0,
+  `m4_keep_or_throw(m4_class_kind$1,
+                   m4_proc_info_string, +,
+                   m4_group_names)')`'dnl
+m4_undefine(m4_proc_info_string)`'dnl
+')
+
+dnl m4_filter_all_procedures(Class_Counter, keep_or_throw_flag,
+dnl                         Procedure_Spec1, ProcedureSpec2, ...)
+dnl
+dnl Class_Counter   - The current class kind;
+dnl keep_or_throw_flag
+dnl                 - has value 1 or 0;
+dnl Procedure_Spec1 - A schematic procedure name with flags still attached;
+dnl ...
+dnl Procedure_Speck - A schematic procedure name with flags still attached;
+dnl Keeps just those procedure names that are needed for the given class kind.
+dnl The classes to be kept or filtered away are determined by extra info
+dnl included with each Procedure_Name
+dnl The keep_or_throw_flag determines if the filtered procedures
+dnl are the wanted (value 1) procedures or the unwanted ones (value 0);
+dnl Here we only use the wanted procedures list.
+dnl The unwanted list is used when generating the Prolog tests.
+m4_define(`m4_filter_all_procedures', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, ,
+  $#, 3,
+    `m4_ifelse(m4_filter_one_procedure($1, $3), $2,
+       `$3')',
+    `m4_ifelse(m4_filter_one_procedure($1, $3), $2,
+       `$3,
+')`'dnl
+m4_filter_all_procedures($1, $2, m4_shift(m4_shift(m4_shift($@))))`'dnl
+')`'dnl
+')
+
+dnl =====================================================================
+dnl ====== The next set of macros process a single class.   =============
+dnl =====================================================================
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl m4_post_extra_class_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class;
+dnl Default (empty) definitions for pre- and post- code for each class.
+dnl These should be redefined as needed.
+m4_define(`m4_pre_extra_class_code', `')
+m4_define(`m4_post_extra_class_code', `')
+
+dnl m4_one_class_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class;
+dnl First, any necessary prefix code for the procedures in
+dnl that class is added.
+dnl Then, the main procedure input list is filtered according to
+dnl the current class kind and the +/- codes included with the procedure.
+dnl Each procedure that is not filtered away is checked to see if
+dnl there is a macro with "_code" extension that defines the code.
+dnl Then a macro sets the class and other schematic components.
+dnl Finally, any necessary postfix code for the procedures in
+dnl that class is added.
+m4_define(`m4_one_class_code', `dnl
+m4_pre_extra_class_code($1)`'dnl
+m4_define(`m4_filtered_proc_list',
+       `m4_filter_all_procedures($1, 1, m4_procedure_list)')`'dnl
+m4_replace_all_procedure_specs_by_code($1, m4_filtered_proc_list)`'dnl
+m4_undefine(`m4_filtered_proc_list')`'dnl
+m4_post_extra_class_code($1)`'dnl
+')
+
+dnl =====================================================================
+dnl === The final set of macros process all the classes, one at a time. =
+dnl =====================================================================
+
+dnl m4_all_classes_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class;
+dnl This iterates through the classes to generate the code.
+dnl The actual code for each class is generated by m4_one_class_code.
+dnl The generated code then has the pattern "@COMMA@" replaced by ",".
+m4_define(`m4_all_classes_code', `dnl
+m4_ifdef(m4_interface_class`'$1,
+`m4_patsubst(m4_one_class_code($1), @COMMA@, `,')`'dnl
+m4_all_classes_code(m4_incr($1))')`'dnl
+')
+
+dnl m4_pre_all_classes_code
+dnl
+dnl Default (empty) definitions for code that must be placed before all
+dnl the generated code.
+dnl This is required for code that depends on the instantiated classes
+dnl (so must be generated from a schema) but has to be included before
+dnl all classes (as in ppl_prolog_icc.m4).
+m4_define(`m4_pre_all_classes_code', `')
+
+dnl m4_class_definitions_initialized/0
+dnl
+dnl Avoids initializing the class macro definitions more than once
+dnl when the main macro m4_all_code/0 is called more than once in a
+dnl file generation.
+m4_define(`m4_class_definitions_initialized', `false')
+
+dnl m4_all_code
+dnl
+dnl This initializes the macros for the classes requested by the user
+dnl (which is determined by the configuration).
+dnl
+dnl The macros for names of the classes are first initialized:
+dnl The interface class names are m4_interface_class`'Class_Counter;
+dnl the class kind by m4_class_kind`'Class_Counter;
+dnl the cplusplus class name by m4_cplusplus_class`'Class_Counter.
+dnl
+dnl The main loop macro m4_all_classes_loop is called to generate
+dnl code for all the required classes.
+m4_define(`m4_all_code', `dnl
+dnl
+dnl Provides the class name macro definitions if not
+dnl already initialized
+m4_ifelse(m4_class_definitions_initialized, `false',
+  `m4_init_class_definitions', `')`'dnl
+dnl
+dnl then adds the extra code for all classes
+m4_pre_all_classes_code`'dnl
+dnl and then generates code for each class.
+m4_all_classes_code(1)`'dnl
+')
diff --git a/interfaces/ppl_interface_generator_common_dat.m4 b/interfaces/ppl_interface_generator_common_dat.m4
new file mode 100644
index 0000000..c91847a
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common_dat.m4
@@ -0,0 +1,1112 @@
+m4_divert(-1)
+
+dnl This m4 file includes macro definitions for:
+dnl - processing the class list in ppl_interface_instantiations.m4;
+dnl - the control of the procedures to be generated for each class;
+dnl - the replacements for the patterns in the code files.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl Classes to be implemented and C++ versions of these classes.
+m4_include(ppl_interface_instantiations.m4)
+
+dnl =====================================================================
+dnl ===== The first set of macros here initialise the class names   =====
+dnl ===== using "@" separated lists and defined                     =====
+dnl ===== by macros in ppl_interface_instantiations.m4.             =====
+dnl =====================================================================
+
+
+dnl m4_init_class_definitions
+dnl
+dnl Macro called by m4_all_code in m4_interface_generators_common.m4
+dnl
+dnl For all the classes required by the configuration and specified
+dnl by m4_interface_classes_names and m4_cplusplus_classes_names
+dnl in <build_dir>/interfaces/m4_interface_instantiations.m4
+dnl this defines macros for their interface and cplusplus names,
+dnl their components and 'entities' related to these components.
+dnl
+dnl The Boolean flag m4_class_definitions_initialized is set to true
+dnl to avoid repeated generation when more than one set of code is
+dnl generated for any one file.
+m4_define(`m4_init_class_definitions', `dnl
+m4_init_interface_classes(m4_interface_classes_names)`'dnl
+m4_init_cplusplus_classes(m4_cplusplus_classes_names)`'dnl
+m4_define(`m4_class_definitions_initialized', `true')`'dnl
+')
+dnl ---------------------------------------------------------------------
+dnl =====  any extra macros needed for both interfaces and          =====
+dnl =====  cplusplus names go here                           .      =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_prefix_polyhedron(Class, String)
+dnl
+dnl Every occurrence of Polyhedron in the name is replaced by
+dnl String_Polyhedron.
+m4_define(`m4_prefix_polyhedron', `dnl
+m4_patsubst($1, Polyhedron, $2_Polyhedron)`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl =====  Macros for m4_interface_class<class_num> are defined     =====
+dnl =====  here.                                                    =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_init_interface_classes(Class_List)
+dnl
+dnl Parses the @-separated list of class names Class_List
+dnl for the names of the classes used to form the names of procedures
+dnl in the user interface.
+m4_define(`m4_init_interface_classes', `dnl
+m4_init_interface_classes_aux(1, $1)')
+
+dnl m4_init_interface_classes_aux(Class_Counter, Class_List)
+dnl
+dnl Class_Counter - is the index to the first class in Class_List;
+dnl Class_List    - is a tail part of the input list of interface
+dnl                 class names.
+dnl The macro also defines m4_num_classes to be the number of classes
+dnl in the full list (ie counter + number in the current list - 1).
+dnl The macro calls m4_init_interface_names to define the next
+dnl interface names and then to to call this macro to recursively
+dnl process the rest of the list.
+m4_define(`m4_init_interface_classes_aux', `dnl
+m4_ifelse($2, `',  `m4_define(m4_num_classes, m4_decr($1))',
+  m4_regexp(`$2', `\([^@]+\)@?\(.*\)',
+    `m4_init_interface_names($1, \1, \2)'))`'dnl
+')
+
+dnl m4_init_interface_names(Class_Counter, Class, Class_List)
+dnl
+dnl Class_Counter - is the index to the first class in Class_List;
+dnl Class         - is the interface class name, as input;
+dnl Class_List    - is a tail part of the input list of interface
+dnl                 class names.
+m4_define(`m4_init_interface_names', `dnl
+m4_define(m4_interface_class`'$1, $2)`'dnl
+m4_init_interface_classes_aux(m4_incr($1), $3)`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl =====  Macros for m4_cplusplus_class<class_num> and             =====
+dnl =====  its components are defined here.                         =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_init_cplusplus_classes(Class_List)
+dnl
+dnl Parses the "@"-separated list of class names Class_List
+dnl to be used in the C++ code implementing the interface procedures.
+dnl Note that first the "," is replaced by "COMMA" using the macro
+dnl m4_subst_comma because the ',' in the product class is wrongly
+dnl parsed by m4.
+dnl First all the macros m4_cplusplus_class`'Class_Counter
+dnl are defined and then the components are parsed and their entities
+dnl defined by additional macros.
+m4_define(`m4_init_cplusplus_classes',   `dnl
+dnl First all the macros m4_cplusplus_class`'Class_Counter
+dnl are defined.
+m4_init_cplusplus_classes_aux(1, m4_subst_comma($@))`'dnl
+dnl Then the components are parsed and their entities are
+dnl defined by additional macros.
+m4_init_all_cplusplus_class_components(1)`'dnl
+')
+
+dnl m4_subst_comma(String1, String2,...)
+dnl
+dnl String1, String2,... is the "@"-separated list of C++ class names
+dnl provided by the configuration.
+dnl As the product classes have their arguments ","-separated,
+dnl the "," separates the list into macro arguments.
+dnl This macro iterates through these macro arguments, replacing the
+dnl "," by "COMMA" so that the C++ names are handled as intended.
+m4_define(`m4_subst_comma',
+`m4_ifelse($#, 0, , $#, 1, $1,
+  `$1`'COMMA`'m4_subst_comma(m4_shift($@))')')
+
+dnl m4_init_cplusplus_classes_aux(Class_Counter, Class_List)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl Class_List    - is a tail part of the input list of cplusplus
+dnl                 class names.
+dnl The macro calls m4_init_cplusplus_names to define the
+dnl cplusplus names (which calls this macro recursively).
+dnl The COMMA pattern is revised to @COMMA@ as soon as a class name
+dnl has been separated from the @-separated list of classes.
+m4_define(`m4_init_cplusplus_classes_aux', `dnl
+m4_ifelse($2, `',  `',
+  m4_regexp(`$2', `\([^@]+\)@?\(.*\)',
+    `m4_init_cplusplus_names(`$1',
+      m4_patsubst(\1, COMMA, @COMMA@), `\2')'))`'dnl
+')
+
+dnl m4_init_cplusplus_names(Class_Counter, Class, Class_List)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl Class         - is the cplusplus class name, as input;
+dnl Class_List    - is a tail part of the input list of cplusplus
+dnl                 class names.
+dnl This defines m4_cplusplus_class`'Class_Counter
+dnl and then calls m4_init_cplusplus_classes_aux to process the rest
+dnl of the list of classes.
+m4_define(`m4_init_cplusplus_names', `dnl
+m4_define(m4_cplusplus_class`'$1, `$2')`'dnl
+m4_init_cplusplus_classes_aux(m4_incr($1), $3)`'dnl
+')
+
+dnl m4_init_all_cplusplus_class_components(Class_Counter)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl
+dnl For each class, this parses the name, finding and defining
+dnl schemas for its class kind and group.
+dnl For classes that have a sub-component "<...>" part
+dnl this also parses and defines macros for these components.
+m4_define(`m4_init_all_cplusplus_class_components', `dnl
+m4_init_cplusplus_class_components($1, m4_cplusplus_class`'$1, class)`'dnl
+m4_ifelse($1, m4_num_classes, ,
+    `m4_init_all_cplusplus_class_components(m4_incr($1))')
+')
+
+dnl m4_init_cplusplus_class_components(Class_Counter,
+dnl                                    String, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Class         - is the cplusplus class name, as input;
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+dnl Initially (at the top level), the Macro_Specifier is just "class".
+dnl For each component in the name the string "_body" is added.
+dnl Thus for Pointset_Powerset<BD_Shape<long> > with Class_Counter = 4
+dnl and interface names Pointset_Powerset_BD_Shape_long
+dnl with BD_Shape_long defined for the component:
+dnl
+dnl m4_cplusplus_class4 = Pointset_Powerset<BD_Shape<long> >
+dnl m4_interface_class4 = Pointset_Powerset_BD_Shape_long
+dnl m4_class_kind4 = Pointset_Powerset
+dnl m4_class_group4 = pointset_powerset
+dnl m4_class_body_body4 = BD_Shape<long>
+dnl m4_cplusplus_class_body4 = BD_Shape<long>
+dnl m4_interface_class_body4 = BD_Shape_long
+dnl m4_class_body_kind4 = BD_Shape
+dnl m4_class_body_group4 = bd_shape
+dnl m4_class_body_body4 = long
+dnl
+dnl For the Product classes, the body is parsed into a "1st"
+dnl and "2nd" component:
+dnl Thus for Direct_Product<Grid,BD_Shape<long> > with Class_Counter = 5
+dnl and interface names Product_BD_Shape_long
+dnl with Grid and BD_Shape_long for the components:
+dnl m4_cplusplus_class5 = Direct_Product<Grid at COMMA@BD_Shape<long> >
+dnl m4_interface_class5 = Direct_Product_Grid_BD_Shape_long
+dnl m4_class_kind5 = Direct_Product
+dnl m4_class_group5 = product
+dnl m4_class_body5 = Grid at COMMA@BD_Shape<long>
+dnl m4_class_body_1st5 = Grid
+dnl m4_cplusplus_class_body_1st5 = Grid
+dnl m4_interface_class_body_1st5 = Grid
+dnl m4_class_body_1st_kind5 = Grid
+dnl m4_class_body_1st_group5 = grid
+dnl m4_class_body_2nd5 = BD_Shape<long>
+dnl m4_cplusplus_class_body_2nd5 = BD_Shape<long>
+dnl m4_interface_class_body_2nd5 = BD_Shape<long>
+dnl m4_class_body_2nd_kind5 = BD_Shape
+dnl m4_class_body_2nd_group5 = bd_shape
+dnl m4_class_body_2nd_body5 = long
+dnl
+m4_define(`m4_init_cplusplus_class_components', `dnl
+m4_get_kind($1, $2, $3)`'dnl
+m4_get_group($1, $3)`'dnl
+m4_get_body($1, $2, $3)`'dnl
+m4_get_counter($1, $2, $3)`'dnl
+dnl
+m4_ifelse(m4_$3_group$1, pointset_powerset,
+  `m4_parse_body_for_powerset($1, $3)')`'dnl
+dnl
+m4_ifelse(m4_$3_group$1, product,
+  `m4_parse_body_for_product($1, $3)')`'dnl
+dnl
+')
+
+dnl m4_get_kind(Class_Counter, String, Macro_Specifier)
+dnl m4_get_body(Class_Counter, String, Macro_Specifier)
+dnl m4_get_group(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl String        - a cplusplus class name.
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+dnl The head (Macro_Specifier_kind) and the body of
+dnl the C++ class name in String are separated out.
+dnl m4_Macro_Specifier_kind`'Class_Counter = the first part before the "<"
+dnl m4_Macro_Specifier_body`'Class_Counter = the rest
+dnl and m4_Macro_Specifier_body`'Class_Counter defines the group to which this
+dnl class belongs.
+dnl
+dnl For example:
+dnl If Macro_Specifier = class, String = Polyhedron and Class_Counter = 1
+dnl m4_class_kind1 => `Polyhedron'
+dnl m4_class_body1 => `'
+dnl If String = Pointset_Powerset<BD_Shape<signed char> >
+dnl               and Class_Counter = 2
+dnl m4_class_kind2 => `Pointset_Powerset'
+dnl m4_class_body2 => `BD_Shape<signed char>'
+dnl m4_class_group2 => `pointset_powerset'
+m4_define(`m4_get_body',
+  `m4_define(m4_$3_body`'$1,
+    m4_ifelse($2, `', ,
+               m4_index(`$2', <), -1, `',
+                 m4_regexp(`$2', `[^ <]+[<]\(.*\w>?\)[ ]*[>]', `\1')))`'dnl
+')
+
+m4_define(`m4_get_kind',
+  `m4_define(m4_$3_kind`'$1,
+    `m4_ifelse($2, `', ,
+               m4_index($2, <), -1, m4_remove_topology($2),
+                 m4_regexp($2, `\([^ <]+\)[.]*', `\1'))')`'dnl
+')
+
+m4_define(`m4_get_counter',
+  `m4_define(m4_$3_counter`'$1,
+    m4_ifelse($2, `', ,
+               m4_get_class_counter($2)))`'dnl
+')
+
+m4_define(`m4_get_group',
+  `m4_define(m4_$2_group`'$1, `')`'dnl
+m4_get_group_aux($1, $2, m4_class_groups)`'dnl
+')
+
+m4_define(`m4_get_group_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, , $#, 3,
+    m4_get_group_aux2($1, $2, $3, m4_$3_group),
+    `m4_ifelse(m4_get_group_aux2($1, $2, $3, m4_$3_group), 0,
+      `m4_get_group_aux($1, $2, m4_shift(m4_shift(m4_shift($@))))')')`'dnl
+')
+
+m4_define(`m4_get_group_aux2', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, 0, $#, 3, 0, $#, 4,
+  `m4_ifelse(`$4', m4_$2_kind$1,
+    `m4_define(m4_$2_group`'$1, `$3')', 0)',
+  `m4_ifelse(`$4', m4_$2_kind$1,
+    `m4_define(m4_$2_group`'$1, `$3')',
+    m4_get_group_aux2($1, $2, $3,
+      m4_shift(m4_shift(m4_shift(m4_shift($@))))))')`'dnl
+')
+
+
+dnl m4_get_class_counter(String)
+dnl
+dnl String        - a cplusplus class name.
+dnl
+dnl This finds the class counter from the cpp name.
+m4_define(`m4_get_class_counter', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_remove_topology($1),
+  m4_echo_unquoted(m4_cplusplus_class`'m4_ind),
+  m4_ind)`'dnl
+')`'dnl
+')
+
+dnl m4_parse_body_for_powerset(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+m4_define(`m4_parse_body_for_powerset', `dnl
+m4_define(`m4_interface_$2_body$1',
+  m4_interface_class`'m4_get_class_counter(m4_$2_body$1))`'dnl
+m4_define(`m4_cplusplus_$2_body$1', m4_$2_body$1)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body$1, $2_body)`'dnl
+')
+
+dnl m4_parse_body_for_product(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+m4_define(`m4_parse_body_for_product', `dnl
+m4_define(`m4_$2_body_1st$1',
+  `m4_regexp(m4_$2_body$1, `\([^@]*\).*', `\1')')`'dnl
+m4_define(`m4_$2_body_2nd$1',
+  `m4_regexp(m4_$2_body$1, `\([^@]*\)@COMMA@\(.*\)', `\2')')`'dnl
+m4_define(`m4_interface_$2_body_1st$1',
+  m4_interface_class`'m4_get_class_counter(m4_$2_body_1st$1))`'dnl
+m4_define(`m4_cplusplus_$2_body_1st$1', m4_$2_body_1st$1)`'dnl
+m4_define(`m4_interface_$2_body_2nd$1',
+  m4_interface_class`'m4_get_class_counter(m4_$2_body_2nd$1))`'dnl
+m4_define(`m4_cplusplus_$2_body_2nd$1', m4_$2_body_2nd$1)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body_1st$1, $2_body_1st)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body_2nd$1, $2_body_2nd)`'dnl
+')
+
+dnl m4_get_class_topology(Class)
+dnl
+dnl expands to the empty string unless the class is
+dnl C_Polyhedron or NNC_Polyhedron, in which case it expands to
+dnl "C_" or "NNC_" respectively.
+m4_define(`m4_get_class_topology', `dnl
+m4_ifelse(m4_index($1, C_), 0, C_,
+m4_index($1, NNC_), 0, NNC_)`'dnl
+')
+
+dnl m4_remove_topology(Class_Name)
+dnl
+dnl expands to the class name unless it is
+dnl C_Polyhedron or NNC_Polyhedron, in which case it expands to
+dnl "Polyhedron".
+m4_define(`m4_remove_topology', `dnl
+m4_ifelse(m4_index($1, C_), 0, Polyhedron,
+            m4_index($1, NNC_), 0, Polyhedron, $1)`'dnl
+')
+
+dnl =====================================================================
+dnl ===== The next set of macros define the groups used to          =====
+dnl ===== specify to which classes the schematic procedures apply;  =====
+dnl ===== see ppl_interface_generators_common_procedure_list.m4     =====
+dnl ===== and <interface>/ppl_interface_generators_<interface>_dat.m4 ===
+dnl =====================================================================
+
+dnl m4_group_names expands to all the group names.
+dnl
+dnl Each group_name in the expansion should
+dnl have a corresponding definition for
+dnl "m4_`'group_name`'_group
+dnl which must be defined as a (comma separated) list of class kinds.
+dnl
+dnl If more groups are wanted, then these must be added to this list.
+dnl and the list of class_kinds they include be defined.
+dnl If a group_name occurs in the extra text preceded by a - after
+dnl a procedure name, then no code for any classes in that group is generated.
+dnl Conversely, if a group_name preceded by a + occurs in the extra text after
+dnl a procedure name, then code for those classes in that group that are
+dnl not covered by a - is generated.
+dnl
+dnl More formally, if the extra text for a procedure includes
+dnl +g1 +g2 ''' +gm and -h1 -h2 ... -hn
+dnl where g1,g2, ..., gm and h1, h2, ..., hn are group names,
+dnl then the actual class kinds that code will be generated for
+dnl will be determined using set difference "\":
+dnl (m4_g1_group union m4_g2_group union ... union m4_gm_group)\
+dnl (m4_h1_group union m4_h2_group union ... union m4_hn_group)
+dnl
+dnl That is: in case of conflict between the + and - groups,
+dnl the - takes precedence over the +;
+dnl all class kinds for group_names preceded by - are filtered away.
+dnl For instance, with:
+dnl "+shape -bd_shape"
+dnl following a procedure name, only code (for that procedure)
+dnl for the Polyhedron and Octagonal_Shape class will be generated.
+m4_define(`m4_group_names', `dnl
+all,
+simple_pps,
+simple,
+shape,
+wr_shape,
+polyhedron,
+grid,
+bd_shape,
+octagonal_shape,
+box,
+pointset_powerset,
+product')
+
+dnl A sublist of the same groups whose elements are disjoint.
+dnl These are used to define the m4_class_group`'class_index
+dnl which is used for the "pattern" replacements (see below).
+m4_define(`m4_class_groups', `dnl
+polyhedron,
+grid,
+wr_shape,
+box,
+pointset_powerset,
+product')
+
+m4_define(`m4_all_group',
+  `Polyhedron, Grid, BD_Shape, Octagonal_Shape, m4_box_group,
+   Pointset_Powerset, m4_product_group')
+m4_define(`m4_simple_pps_group', `m4_simple_group, Pointset_Powerset')
+m4_define(`m4_simple_group', `Grid, m4_shape_group')
+m4_define(`m4_shape_group', `Polyhedron, m4_wr_shape_group, m4_box_group')
+m4_define(`m4_wr_shape_group', `BD_Shape, Octagonal_Shape')
+m4_define(`m4_polyhedron_group', Polyhedron)
+m4_define(`m4_grid_group', Grid)
+m4_define(`m4_bd_shape_group', BD_Shape)
+m4_define(`m4_octagonal_shape_group', Octagonal_Shape)
+m4_define(`m4_box_group',
+  `Rational_Box, Z_Box, Float_Box, Double_Box, Long_Double_Box,
+   Int8_Box, Int16_Box, Int32_Box, Int64_Box,
+   Uint8_Box, Uint16_Box, Uint32_Box, Uint64_Box')
+m4_define(`m4_pointset_powerset_group', Pointset_Powerset)
+m4_define(`m4_product_group',
+  `Direct_Product, Smash_Product, Constraints_Product')
+
+dnl =====================================================================
+dnl ===== The next set of macros define the replacements            =====
+dnl ===== for the patterns used                                     =====
+dnl =====================================================================
+
+dnl ---------------------------------------------------------------------
+dnl First the list of patterns. Note that the order is important.
+dnl ---------------------------------------------------------------------
+
+dnl m4_pattern_list
+dnl
+dnl Returns a list of patterns (in lowercase) used for the generation
+dnl of procedure names and code schemas.
+m4_define(`m4_pattern_list', `dnl
+class,
+cpp_class,
+cppdef_class,
+friend,
+intopology,
+topology,
+cpp_disjunct,
+disjunct,
+classtopology,
+build_represent,
+get_represent,
+refine_represent,
+relation_represent,
+add_represent,
+partition,
+superclass,
+recycle,
+dimension,
+generator,
+point,
+constrainer,
+has_property,
+simplify,
+abovebelow,
+maxmin,
+embedproject,
+affimage,
+comparison,
+binop,
+binminop,
+ub_exact,
+disjunct_extrapolation,
+disjunct_widen,
+widenexpn,
+widen,
+extrapolation,
+narrow,
+limitedbounded,
+box,
+incdec,
+beginend,
+membytes')
+
+dnl ---------------------------------------------------------------------
+dnl Define the replacement macros for all patterns
+dnl ---------------------------------------------------------------------
+
+dnl m4_class_pattern_replacement(Class_Counter, Pattern, Replacement_Id)
+dnl
+dnl Class_Counter:  counter of class for which we want the replacements.
+dnl Pattern:        pattern to be replaced (lower-case);
+dnl Replacement_Id: Can be the empty string, `_alt' or `_cppx'
+dnl                 depending on the required group of replacements.
+dnl
+dnl To find any sequence of replacements the macro
+dnl "m4_replace_one_pattern_in_string"
+dnl defined in "m4_interface_generators_common.m4"
+dnl calls this macro.
+dnl
+m4_define(`m4_class_pattern_replacement', `dnl
+  m4_ifdef(m4_`'m4_class_kind$1`'_$2$3_replacement,
+    m4_`'m4_class_kind$1`'_$2$3_replacement($1),
+    `m4_ifdef(m4_`'m4_class_group$1`'_$2$3_replacement,
+       m4_`'m4_class_group$1`'_$2$3_replacement($1),
+       `m4_$2$3_replacement($1)')')`'dnl
+')
+
+dnl =====================================================================
+dnl ===== Define the individual replacements for each pattern       =====
+dnl =====================================================================
+
+dnl ---------------------------------------------------------------------
+dnl pattern == class
+dnl The class being generated
+dnl ---------------------------------------------------------------------
+
+dnl The interface class name.
+m4_define(`m4_class_replacement', m4_interface_class`'$1)
+
+dnl The cplusplus name.
+m4_define(`m4_cpp_class_replacement', m4_cplusplus_class`'$1)
+
+dnl The product full cplusplus name.
+m4_define(`m4_product_cpp_class_replacement',
+     Domain_Product<`'m4_cplusplus_class_body_1st$1 at COMMA@`'m4_cplusplus_class_body_2nd$1 >::`'m4_class_kind$1)
+
+dnl The defined cplusplus name (the default is as before).
+m4_define(`m4_cppdef_class_replacement', m4_cplusplus_class`'$1)
+
+dnl The defined product cplusplus name.
+m4_define(`m4_product_cppdef_class_replacement',
+m4_interface_class`'$1)
+
+dnl The defined box cplusplus name.
+m4_define(`m4_box_cppdef_class_replacement',
+m4_interface_class`'$1)
+
+dnl ---------------------------------------------------------------------
+dnl pattern == friend
+dnl A class can be built from any other class named as a "friend".
+dnl A friend must be one of the classes named in the instantiations
+dnl ---------------------------------------------------------------------
+
+dnl The friend class name.
+dnl There is the interface name as default friend,
+dnl the interface name but where "Polyhedron" does not include
+dnl the topology (alt_friend), and the C++ name (cppx_friend).
+dnl
+dnl To allow for other classes to be friends,
+dnl we cannot just take a predefined list of friends as some
+dnl may not be instantiated and available.
+m4_define(`m4_friend_replacement', `m4_all_friends(interface)')
+
+m4_define(`m4_friend_alt_replacement', `dnl
+m4_all_friends(interface, no_topology)`'dnl
+')
+
+m4_define(`m4_friend_cppx_replacement',`m4_all_friends(cplusplus)')
+
+m4_define(`m4_all_friends', `dnl
+m4_patsubst(m4_all_friends_aux($1, $2), `@COMMA@', `, ')`'dnl
+')
+m4_define(`m4_all_friends_aux', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_echo_unquoted(m4_class_kind`'m4_ind), Pointset_Powerset, ,
+m4_echo_unquoted(m4_class_group`'m4_ind), product, , `dnl
+m4_define(`m4_friend_class', m4_`'$1`'_class`'m4_ind)`'dnl
+m4_ifelse(m4_friend_class, Polyhedron,
+          `m4_ifelse($2, `',
+          `m4_one_friend(C_`'m4_friend_class at COMMA@NNC_`'m4_friend_class)',
+          `m4_one_friend(m4_friend_class at COMMA@m4_friend_class)')',
+          `m4_one_friend(m4_friend_class)')`'dnl
+m4_undefine(`m4_friend_class')')')`'dnl
+')
+
+m4_define(`m4_one_friend', `dnl
+m4_ifelse(m4_ind, 1, `$1', @COMMA@`'$1)`'dnl
+')
+
+dnl For Pointset_Powerset class kind, if the body is C_Polyhedron
+dnl or NNC_Polyhedron, and Polyhedron is generated, then C_Polyhedron
+dnl (if the body is C_Polyhedron) or NNC_Polyhedron
+dnl (if the body is NNC_Polyhedron) is a friend.
+dnl
+m4_define(`m4_Pointset_Powerset_friend_replacement', `dnl
+dnl
+m4_interface_class$1,
+m4_get_class_topology(m4_cplusplus_class_body$1)`'dnl
+m4_interface_class_body$1`'dnl
+')
+
+m4_define(`m4_Pointset_Powerset_friend_alt_replacement', `dnl
+dnl
+m4_interface_class$1, m4_interface_class_body$1`'dnl
+')
+
+m4_define(`m4_Pointset_Powerset_friend_cppx_replacement', `dnl
+dnl
+m4_cplusplus_class$1, m4_cplusplus_class_body$1`'dnl
+')
+
+dnl For product class kinds, C_Polyhedron, NNC_Polyhedron, BD_Shape,
+dnl Octagonal_Shape and other products are all friends.
+dnl
+m4_define(`m4_product_friend_replacement',
+  `m4_all_friends(interface), m4_interface_class$1`'dnl
+')
+
+m4_define(`m4_product_friend_alt_replacement',
+  `m4_all_friends(interface, no_topology), m4_interface_class$1`'dnl
+')
+
+m4_define(`m4_product_friend_cppx_replacement',
+  `m4_all_friends(cplusplus),
+     Domain_Product<`'m4_cplusplus_class_body_1st$1`'@COMMA@`'m4_cplusplus_class_body_2nd$1`' >::`'m4_class_kind$1')
+)
+
+dnl ---------------------------------------------------------------------
+dnl pattern == topology or intopology
+dnl This is C_ or NNC_ if the class is Polyhedron and `' otherwise
+dnl ---------------------------------------------------------------------
+
+dnl The topology of the domain element. The default is the empty string.
+m4_define(`m4_topology_replacement', `')
+m4_define(`m4_Polyhedron_topology_replacement', `C_, NNC_')
+
+dnl The topology used to copy from another element of the domain
+m4_define(`m4_intopology_replacement', `')
+m4_define(`m4_Polyhedron_intopology_replacement', `C_, NNC_')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == widen
+dnl ---------------------------------------------------------------------
+dnl The widening operators.
+m4_define(`m4_widen_replacement', `')
+m4_define(`m4_Polyhedron_widen_replacement', `BHRZ03, H79')
+m4_define(`m4_Grid_widen_replacement', `congruence, generator')
+m4_define(`m4_BD_Shape_widen_replacement', `BHMZ05, H79')
+m4_define(`m4_Octagonal_Shape_widen_replacement', `BHMZ05')
+m4_define(`m4_box_widen_replacement', `CC76')
+m4_define(`m4_Pointset_Powerset_widen_replacement', `BHZ03')
+dnl The alt_replacement defines the certificates for the widenings
+m4_define(`m4_Polyhedron_widen_alt_replacement', `BHRZ03, H79')
+m4_define(`m4_BD_Shape_widen_alt_replacement', `H79, H79')
+m4_define(`m4_Octagonal_Shape_widen_alt_replacement', `H79')
+m4_define(`m4_Grid_widen_alt_replacement', `Grid, Grid')
+dnl FIXME: This is not in the C++ box domain and will fail if used.
+m4_define(`m4_box_widen_alt_replacement', `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == extrapolation
+dnl ---------------------------------------------------------------------
+m4_define(`m4_extrapolation_replacement', `NONE')
+m4_define(`m4_BD_Shape_extrapolation_replacement',
+  `CC76')
+m4_define(`m4_Octagonal_Shape_extrapolation_replacement',
+   `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == widenexp
+dnl The limited/bounded extrapolation operators.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_widenexpn_replacement', `m4_widen_replacement')
+m4_define(`m4_Polyhedron_widenexpn_replacement',
+  `m4_Polyhedron_widen_replacement')
+m4_define(`m4_Grid_widenexpn_replacement', `m4_Grid_widen_replacement')
+m4_define(`m4_BD_Shape_widenexpn_replacement',
+  `m4_BD_Shape_widen_replacement,
+   m4_BD_Shape_extrapolation_replacement')
+m4_define(`m4_Octagonal_Shape_widenexpn_replacement',
+   `m4_Octagonal_Shape_widen_replacement,
+    m4_Octagonal_Shape_extrapolation_replacement')
+m4_define(`m4_box_widenexpn_replacement', `m4_box_widen_replacement')
+m4_define(`m4_Pointset_Powerset_widenexpn_replacement',
+  `m4_Pointset_Powerset_widen_replacement')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == narrow
+dnl ---------------------------------------------------------------------
+m4_define(`m4_narrow_replacement', `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == limitedbounded
+dnl limited/bounded are qualifiers for widening and extrapolation
+dnl operations.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_limitedbounded_replacement', `limited')
+m4_define(`m4_Polyhedron_limitedbounded_replacement', `limited, bounded')
+
+
+dnl ---------------------------------------------------------------------
+dnl pattern == box
+dnl The shape classes have bounding boxes while the grid classes also
+dnl have covering boxes.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_box_replacement', `bounding_box')
+m4_define(`m4_Grid_box_replacement', `m4_box_replacement, covering_box')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == dimension
+dnl ---------------------------------------------------------------------
+m4_define(`m4_dimension_replacement', `space_dimension, affine_dimension')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == generator
+dnl The different kinds of objects use to generate a class.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_generator_replacement', `generator')
+m4_define(`m4_Grid_generator_replacement', `grid_generator')
+
+dnl  The different kinds of points.
+m4_define(`m4_point_replacement', `point')
+m4_define(`m4_Grid_point_replacement', `grid_point')
+
+dnl  The constrainer objects used to describe a class.
+m4_define(`m4_constrainer_replacement', `constraint')
+m4_define(`m4_Grid_constrainer_replacement', `congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == cpp_disjunct or disjunct
+dnl The different kinds of objects that are elements of a Pointset_Powerset.
+dnl ---------------------------------------------------------------------
+
+dnl If the interface disjunct name is C_Polyhedron or NNC_Polyhedron
+dnl the topology is removed.
+m4_define(`m4_cpp_disjunct_replacement', `')
+m4_define(`m4_cpp_disjunct_replacement',
+  `m4_remove_topology(m4_cplusplus_class_body$1)')
+
+dnl If the cpp disjunct name is C_Polyhedron or NNC_Polyhedron
+dnl the topology is removed.
+m4_define(`m4_disjunct_replacement', `')
+m4_define(`m4_Pointset_Powerset_disjunct_replacement',
+  `m4_remove_topology(m4_interface_class_body$1)')
+
+dnl The disjunct topology replacement.
+m4_define(`m4_classtopology_replacement',
+  `m4_get_class_topology(m4_cplusplus_class_body$1)')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_widen
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_disjunct_widen_replacement',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_widen_replacement)')
+
+m4_define(`m4_disjunct_widen_alt_replacement',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_widen_alt_replacement)')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_extrapolation
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_disjunct_extrapolation_replacement',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_extrapolation_replacement)')
+
+m4_define(`m4_disjunct_extrapolation_alt_replacement',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_extrapolation_alt_replacement)')
+
+
+dnl ---------------------------------------------------------------------
+dnl pattern == build_represent
+dnl  The different kinds of objects that can build a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_build_represent_replacement',
+         `constraint, congruence, generator')
+m4_define(`m4_Grid_build_represent_replacement',
+         `constraint, grid_generator, congruence')
+m4_define(`m4_Pointset_Powerset_build_represent_replacement',
+         `constraint, congruence')
+m4_define(`m4_product_build_represent_replacement',
+         `constraint, congruence')
+
+dnl  The different kinds of alternative objects that can build
+dnl  the same class.
+dnl  At the moment, this is just used for the test data generator.
+m4_define(`m4_build_represent_alt_replacement',
+          `generator, congruence, constraint')
+m4_define(`m4_Grid_build_represent_alt_replacement',
+         `constraint, congruence, grid_generator')
+m4_define(`m4_Pointset_Powerset_build_represent_alt_replacement',
+         `constraint, congruence')
+m4_define(`m4_product_build_represent_alt_replacement',
+         `constraint, congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == relation_represent
+dnl  The different kinds of objects that can have a relation with a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_relation_represent_replacement',
+	`constraint, generator, congruence')
+m4_define(`m4_Grid_relation_represent_replacement',
+         `m4_relation_represent_replacement, grid_generator')
+
+m4_define(`m4_Pointset_Powerset_relation_represent_replacement', `dnl
+m4_define(`m4_1st_sequence',
+  `m4_relation_represent_replacement')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_counter$1,
+                                relation_represent, `')')`'dnl
+m4_define(`m4_num_of_sequences', 2)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+m4_define(`m4_product_relation_represent_replacement', `dnl
+m4_define(`m4_1st_sequence',
+  `constraint, generator, congruence')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_1st_counter$1,
+    relation_represent, `')')`'dnl
+m4_define(`m4_3rd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_2nd_counter$1,
+    relation_represent, `')')`'dnl
+m4_define(`m4_num_of_sequences', 3)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_3rd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+dnl The type of these relations with a class.
+m4_define(`m4_relation_represent_alt_replacement', `con, gen, con')
+m4_define(`m4_Grid_relation_represent_alt_replacement',
+         `con, gen, con, gen')
+
+m4_define(`m4_Pointset_Powerset_relation_represent_alt_replacement', `dnl
+m4_define(`m4_1st_sequence',
+  `m4_relation_represent_alt_replacement')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_counter$1,
+                                relation_represent, `_alt')')`'dnl
+m4_define(`m4_num_of_sequences', 2)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+m4_define(`m4_product_relation_represent_alt_replacement', `dnl
+m4_define(`m4_1st_sequence',
+  `con, gen, con')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_1st_counter$1,
+    relation_represent, `_alt')')`'dnl
+m4_define(`m4_3rd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_2nd_counter$1,
+    relation_represent, `_alt')')`'dnl
+m4_define(`m4_num_of_sequences', 3)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_3rd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == add_represent
+dnl The different kinds of objects that can be added to a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_add_represent_replacement', `constraint, congruence')
+m4_define(`m4_Polyhedron_add_represent_replacement',
+         `m4_add_represent_replacement, generator')
+m4_define(`m4_Grid_add_represent_replacement',
+         `m4_add_represent_replacement, grid_generator')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == get_represent
+dnl The different kinds of objects that can be obtained from a
+dnl class description.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_get_represent_replacement', `constraint')
+m4_define(`m4_Polyhedron_get_represent_replacement',
+         `constraint, generator, congruence')
+m4_define(`m4_Grid_get_represent_replacement',
+         `congruence, grid_generator')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == recycle_represent
+dnl The recycling argument which is only needed for the Polyhedron
+dnl or Grid class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_recycle_replacement', `')
+m4_define(`m4_Polyhedron_recycle_replacement',
+         `@COMMA@ Recycle_Input()')
+m4_define(`m4_Grid_recycle_replacement',
+         `@COMMA@ Recycle_Input()')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == refine_represent
+dnl The different kinds of objects that can refine a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_refine_represent_replacement', `constraint, congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == superclass
+dnl The "superclass" is the most general class for the disjunct kind.
+dnl For grids it is Grid and for all the other simple classes,
+dnl it is NNC_Polyhedron. The default is NONE.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_superclass_replacement', `NONE')
+m4_define(`m4_Pointset_Powerset_superclass_replacement',
+          `m4_ifelse(m4_echo_unquoted(m4_class_body_kind$1),
+          `Grid', `Grid', `NNC_Polyhedron')')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == partition
+dnl The "partition" which is currently only available for the Polyhedron
+dnl and Grid Pointset_Powerset classes.
+dnl FIXME: However because of differences between the
+dnl linear and approximate partitions, we have to have these
+dnl separate. Thus approximate_partition for Grids
+dnl is defined without any pattern.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_partition_replacement', `NONE')
+m4_define(`m4_Pointset_Powerset_partition_replacement',`linear_partition')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == has_property
+dnl The unary "has_property" predicates check properties of the domains
+dnl The check "contains_integer_point" is not available for the
+dnl product domains.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_has_property_replacement', `is_empty, is_universe,
+            is_bounded, contains_integer_point, is_topologically_closed,
+            is_discrete')
+
+dnl For products, contains_integer_point is not yet implemented.
+m4_define(`m4_product_has_property_replacement', `dnl
+  is_empty, is_universe, is_bounded, is_topologically_closed, is_discrete')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == simplify
+dnl This just groups two methods that modify a domain element.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_simplify_replacement', `topological_closure_assign')
+m4_define(`m4_Pointset_Powerset_simplify_replacement', `dnl
+pairwise_reduce,
+m4_define(`m4_1st_sequence',
+  `m4_simplify_replacement')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_counter$1,
+                                simplify, `')')`'dnl
+m4_define(`m4_num_of_sequences', 2)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+m4_define(`m4_product_simplify_replacement', `dnl
+m4_define(`m4_1st_sequence',
+  `m4_simplify_replacement')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_1st_counter$1,
+    simplify, `')')`'dnl
+m4_define(`m4_3rd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_2nd_counter$1,
+    simplify, `')')`'dnl
+m4_define(`m4_num_of_sequences', 3)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_3rd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl pattern -- above/below
+dnl Used for the bounds_from_above and bounds_from_below methods.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_abovebelow_replacement', `above, below')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == maxmin
+dnl Maximize or Minimize
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_maxmin_replacement', `maximize, minimize')
+
+dnl  Embed or project
+m4_define(`m4_embedproject_replacement', `and_embed, and_project')
+
+dnl  Affine_image or affine_preimage
+m4_define(`m4_affimage_replacement', `affine_image, affine_preimage')
+
+dnl  One object can be contained, strictly contained or disjoint in the other.
+m4_define(`m4_comparison_replacement',
+         `contains, strictly_contains, is_disjoint_from')
+m4_define(`m4_Pointset_Powerset_comparison_replacement',
+         `m4_comparison_replacement,
+          geometrically_covers, geometrically_equals')
+
+dnl  The different kinds of binary operators.
+m4_define(`m4_binop_replacement',
+         `intersection_assign, upper_bound_assign, difference_assign,
+          concatenate_assign, time_elapse_assign')
+m4_define(`m4_Polyhedron_binop_replacement',
+         `m4_binop_replacement, poly_hull_assign, poly_difference_assign')
+m4_define(`m4_Grid_binop_replacement',
+         `m4_binop_replacement, join_assign')
+m4_define(`m4_BD_Shape_binop_replacement',
+         `m4_binop_replacement, bds_hull_assign')
+m4_define(`m4_Octagonal_Shape_binop_replacement',
+         `m4_binop_replacement, oct_hull_assign')
+dnl For the powerset domains, we intersect the replacements for the
+dnl disjuncts with the replacements for a powerset.
+dnl The poly_difference_assign has been defined for powersets of polyhedra.
+dnl FIXME: poly_difference_assign
+dnl does not appear to work for disjuncts that are not polyhedra or grids.
+m4_define(`m4_Pointset_Powerset_binop_replacement', `dnl
+m4_define(`m4_1st_sequence',
+  `poly_difference_assign, intersection_assign,
+   concatenate_assign, time_elapse_assign')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacement(m4_class_body_counter$1,
+    binop, `')')`'dnl
+m4_define(`m4_num_of_sequences', 2)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+dnl  The different kinds of "and_minimize" binary operators.
+m4_define(`m4_binminop_replacement', `')
+m4_define(`m4_Polyhedron_binminop_replacement',
+         `intersection_assign_and_minimize,
+          poly_hull_assign_and_minimize')
+
+dnl  The different kinds of "upper_bound_if_exact" binary operators.
+m4_define(`m4_ub_exact_replacement', `upper_bound_assign_if_exact')
+m4_define(`m4_Polyhedron_ub_exact_replacement',
+         `m4_ub_exact_replacement, poly_hull_assign_if_exact')
+m4_define(`m4_Grid_ub_exact_replacement',
+         `m4_ub_exact_replacement, join_assign_if_exact')
+
+dnl  The iterators for the Powerset domains can increment or decrement
+m4_define(`m4_incdec_replacement', `increment, decrement')
+
+dnl  The C++ replacements for the increment/decrement operators.
+m4_define(`m4_incdec_cppx_replacement', `++, --')
+
+dnl  The Java replacements for the increment/decrement operators.
+m4_define(`m4_incdec_alt_replacement', `next, prev')
+
+dnl  The iterators for the Powerset domains have a begin and end iterator
+m4_define(`m4_beginend_replacement', `begin, end')
+
+dnl  The total and external memory query methods for all the domains
+dnl  and the size query to the pointset powerset domain.
+m4_define(`m4_membytes_replacement',
+   `external_memory_in_bytes, total_memory_in_bytes')
+m4_define(`m4_Pointset_Powerset_membytes_replacement',
+   `m4_membytes_replacement, size')
diff --git a/interfaces/ppl_interface_generator_common_procedure_generators.m4 b/interfaces/ppl_interface_generator_common_procedure_generators.m4
new file mode 100644
index 0000000..6ee70b5
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common_procedure_generators.m4
@@ -0,0 +1,143 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of the procedures generated
+dnl that are independent of the inetrface being generated.
+
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl m4_procedure_list
+dnl This class using patterns wherever possible.
+dnl Which classes the schema applies to is determined by +/-group_name.
+dnl The group_names represent sets of PPL classes +group1 and -group2.
+dnl These are defined in ../ppl_interface_generator_common_dat.m4.
+dnl The actual classes the schema applies to is the set difference
+dnl +group1 \ -group2 where a missing +group1 or -group2 is
+dnl assumed to be the empty set.
+dnl For the pointset-powerset classes, the schema they apply to may also
+dnl depend on the disjunct. In this case, a schema with
+dnl "+pointset_powerset \group" will apply to any powerset
+dnl whose disjunct is not in "group".
+dnl Where "@CLASS@" is replaced by the class name, then that class only
+dnl is applicable for that schema.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_common_procedure_list', `dnl
+ppl_delete_ at CLASS@/1 *nofail +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension/3 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@/2 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity/3 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s/2 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BOX@/2 +all,
+ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT@/2 +polyhedron,
+ppl_ at CLASS@_swap/2 *nofail +all,
+ppl_ at CLASS@_ at DIMENSION@/2 +all,
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@/3 +all,
+dnl
+dnl NOTE: The next two schemas are only for simple domains since
+dnl       we can only "get" a meaningful system (such as a set of
+dnl       constraints) that represents a domain from a simple domain.
+dnl
+ppl_ at CLASS@_get_ at GET_REPRESENT@s/2 +simple,
+ppl_ at CLASS@_get_minimized_ at GET_REPRESENT@s/2 +simple,
+dnl
+dnl FIXME: There is no get_bounding_box() method
+dnl        for the pointset_powerset or product domains.
+dnl        The Box domain does not have a get_bounding_box() method.
+dnl        Only the Grid domain has a get_covering_box() method.
+dnl
+ppl_ at CLASS@_get_bounding_box/3 +simple -box,
+ppl_ at CLASS@_get_covering_box/2 +grid,
+dnl
+ppl_ at CLASS@_ at HAS_PROPERTY@/1 +all,
+ppl_ at CLASS@_ at SIMPLIFY@/1 *nofail +all,
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@/2 +all,
+ppl_ at CLASS@_ at MAXMIN@/5 +all,
+ppl_ at CLASS@_ at MAXMIN@_with_point/6 +all,
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@/2 +all,
+ppl_ at CLASS@_equals_ at CLASS@/2 +all,
+ppl_ at CLASS@_OK/1 +all,
+ppl_ at CLASS@_add_ at ADD_REPRESENT@/2 *nofail +all,
+ppl_ at CLASS@_add_ at ADD_REPRESENT@_and_minimize/2 +polyhedron,
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s/2 *nofail +all,
+ppl_ at CLASS@_add_ at ADD_REPRESENT@s_and_minimize/2 +polyhedron,
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@/2 *nofail +all,
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s/2 *nofail +all,
+ppl_ at CLASS@_ at BINOP@/2 *nofail +all,
+ppl_ at CLASS@_ at BINMINOP@/2 +polyhedron,
+ppl_ at CLASS@_simplify_using_context_assign/3 +simple_pps,
+ppl_ at CLASS@_ at AFFIMAGE@/4 *nofail +all,
+ppl_ at CLASS@_bounded_ at AFFIMAGE@/5 *nofail +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@/5 +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/4 +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence/6 +grid,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence/5 +grid,
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@/2 *nofail +all,
+ppl_ at CLASS@_remove_space_dimensions/2 +all,
+ppl_ at CLASS@_remove_higher_space_dimensions/2 *nofail +all,
+ppl_ at CLASS@_expand_space_dimension/3 *nofail +all,
+ppl_ at CLASS@_fold_space_dimensions/3  +all,
+ppl_ at CLASS@_map_space_dimensions/2 +all,
+ppl_ at CLASS@_constrains/2 +simple,
+ppl_ at CLASS@_unconstrain_space_dimension/2 +simple,
+ppl_ at CLASS@_unconstrain_space_dimensions/2 +simple,
+ppl_ at CLASS@_ascii_dump/1 +all,
+ppl_ at CLASS@_ at MEMBYTES@/2 +all,
+dnl
+dnl FIXME: We do not have a default widening for the
+dnl        pointset_powerset domain.
+dnl
+ppl_ at CLASS@_widening_assign_with_tokens/4 +simple +product,
+ppl_ at CLASS@_widening_assign/2 *nofail +simple +product,
+dnl
+dnl NOTE: The next few schemas provide special widenings and
+dnl       extrapolations that depend on the domains.
+dnl
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens/4 +simple,
+ppl_ at CLASS@_ at WIDEN@_widening_assign/2 *nofail +simple,
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens/5 +simple,
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign/3 *nofail +simple,
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens/4 +wr_shape,
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign/2 *nofail +wr_shape,
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign/2 +wr_shape,
+dnl
+dnl NOTE: The next few schemas provide procedures specifically for
+dnl       the pointset_powerset domains.
+dnl
+ppl_ at CLASS@_iterator_equals_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_ at BEGINEND@_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_delete_iterator/1 +pointset_powerset,
+ppl_ at CLASS@_ at INCDEC@_iterator/1 +pointset_powerset,
+ppl_ at CLASS@_get_disjunct/2 +pointset_powerset,
+ppl_ at CLASS@_drop_disjunct/2 +pointset_powerset,
+ppl_ at CLASS@_add_disjunct/2 *nofail +pointset_powerset,
+ppl_ at CLASS@_ at PARTITION@/4 +pointset_powerset \grid,
+ppl_ at CLASS@_approximate_partition/5  +pointset_powerset \shape,
+ppl_ at CLASS@_BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2 +pointset_powerset \box,
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3 +pointset_powerset \box,
+dnl
+dnl CHECKME: This is not implemented.
+dnl
+ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3 -pointset_powerset
+')
diff --git a/interfaces/ppl_interface_generator_copyright b/interfaces/ppl_interface_generator_copyright
new file mode 100644
index 0000000..6d1ef56
--- /dev/null
+++ b/interfaces/ppl_interface_generator_copyright
@@ -0,0 +1,20 @@
+`   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . 'dnl
diff --git a/ltmain.sh b/ltmain.sh
index 06823e0..b36c4ad 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,30 +1,174 @@
-# ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun configure.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
+# Generated from ltmain.m4sh.
+
+# ltmain.sh (GNU libtool) 2.2.6
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool 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
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
 #
-# 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.
+#     --config             show all configuration variables
+#     --debug              enable verbose shell tracing
+# -n, --dry-run            display commands without modifying any files
+#     --features           display basic configuration information and exit
+#     --mode=MODE          use operation mode MODE
+#     --preserve-dup-deps  don't remove duplicate dependency libraries
+#     --quiet, --silent    don't print informational messages
+#     --tag=TAG            use configuration variables from tag TAG
+# -v, --verbose            print informational messages (default)
+#     --version            print version information
+# -h, --help               print short or long help message
+#
+# MODE must be one of the following:
+#
+#       clean              remove files from the build directory
+#       compile            compile a source file into a libtool object
+#       execute            automatically set library path, then run a program
+#       finish             complete the installation of libtool libraries
+#       install            install libraries or executables
+#       link               create a library or an executable
+#       uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#       host-triplet:	$host
+#       shell:		$SHELL
+#       compiler:		$LTCC
+#       compiler flags:		$LTCFLAGS
+#       linker:		$LD (gnu? $with_gnu_ld)
+#       $progname:		(GNU libtool) 2.2.6
+#       automake:		$automake_version
+#       autoconf:		$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=2.2.6
+TIMESTAMP=""
+package_revision=1.3012
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+
+$lt_unset CDPATH
+
+
+
+
+
+: ${CP="cp -f"}
+: ${ECHO="echo"}
+: ${EGREP="/usr/bin/grep -E"}
+: ${FGREP="/usr/bin/grep -F"}
+: ${GREP="/usr/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/opt/local/bin/gsed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
 
-basename="s,^.*/,,g"
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+# Generated shell functions inserted here.
 
 # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
 # is ksh but when the shell is invoked as "sh" and the current value of
@@ -34,112 +178,174 @@ basename="s,^.*/,,g"
 progpath="$0"
 
 # The name of this program:
-progname=`echo "$progpath" | $SED $basename`
-modename="$progname"
+# In the unlikely event $progname began with a '-', it would play havoc with
+# func_echo (imagine progname=-n), so we prepend ./ in that case:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+case $progname in
+  -*) progname=./$progname ;;
+esac
 
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
 
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=1.5.22
-TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname${mode+: }$mode: $*"
+}
 
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes.
-if test -n "${ZSH_VERSION+set}" ; then
-  setopt NO_GLOB_SUBST
-fi
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
 
-# Check that we have a working $echo.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell, and then maybe $echo will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
 
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
 
-default_mode=
-help="Try \`$progname --help' for more information."
-magic="%%%MAGIC variable%%%"
-mkdir="mkdir"
-mv="mv -f"
-rm="rm -f"
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  SP2NL='tr \040 \012'
-  NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  SP2NL='tr \100 \n'
-  NL2SP='tr \r\n \100\100'
-  ;;
-esac
+    # bash bug again:
+    :
+}
 
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-# We save the old values to restore during execute mode.
-if test "${LC_ALL+set}" = set; then
-  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
-fi
-if test "${LANG+set}" = set; then
-  save_LANG="$LANG"; LANG=C; export LANG
-fi
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
 
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
 
-if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-  $echo "$modename: not configured to build any kind of library" 1>&2
-  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-  exit $EXIT_FAILURE
-fi
 
-# Global variables.
-mode=$default_mode
-nonopt=
-prev=
-prevopt=
-run=
-show="$echo"
-show_help=
-execute_dlfiles=
-duplicate_deps=no
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
 
-#####################################
-# Shell function definitions:
-# This seems to be the best place for them
 
 # func_mktempdir [string]
 # Make a temporary directory that won't clash with other running
@@ -149,7 +355,7 @@ func_mktempdir ()
 {
     my_template="${TMPDIR-/tmp}/${1-$progname}"
 
-    if test "$run" = ":"; then
+    if test "$opt_dry_run" = ":"; then
       # Return a directory name, but don't create it in dry-run mode
       my_tmpdir="${my_template}-$$"
     else
@@ -158,546 +364,818 @@ func_mktempdir ()
       my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
 
       if test ! -d "$my_tmpdir"; then
-	# Failing that, at least try and use $RANDOM to avoid a race
-	my_tmpdir="${my_template}-${RANDOM-0}$$"
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
 
-	save_mktempdir_umask=`umask`
-	umask 0077
-	$mkdir "$my_tmpdir"
-	umask $save_mktempdir_umask
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || {
-        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
-	exit $EXIT_FAILURE
-      }
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
     fi
 
-    $echo "X$my_tmpdir" | $Xsed
+    $ECHO "X$my_tmpdir" | $Xsed
 }
 
 
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-func_win32_libid ()
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
 {
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
-      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 | \
-	$SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
     esac
-    ;;
-  esac
-  $echo $win32_libid_type
 }
 
 
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
 {
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-	case $arg in
-	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	CC_quoted="$CC_quoted $arg"
-      done
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "X$1" | $Xsed \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
       *)
-	for z in $available_tags; do
-	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	    # Double-quote args containing other shell metacharacters.
-	    case $arg in
-	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	      arg="\"$arg\""
-	      ;;
-	    esac
-	    CC_quoted="$CC_quoted $arg"
-	  done
-	    case "$@ " in
-	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  $echo "$modename: unable to infer tagged configuration"
-	  $echo "$modename: specify a tag with \`--tag'" 1>&2
-	  exit $EXIT_FAILURE
-#        else
-#          $echo "$modename: using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
 }
 
 
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
 {
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
 
-    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
-    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
-      exit $EXIT_FAILURE
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
     fi
 }
 
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
 {
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-    my_status=""
-
-    $show "${rm}r $my_gentop"
-    $run ${rm}r "$my_gentop"
-    $show "$mkdir $my_gentop"
-    $run $mkdir "$my_gentop"
-    my_status=$?
-    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
-      exit $my_status
-    fi
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
 
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
-      my_xdir="$my_gentop/$my_xlib"
-
-      $show "${rm}r $my_xdir"
-      $run ${rm}r "$my_xdir"
-      $show "$mkdir $my_xdir"
-      $run $mkdir "$my_xdir"
-      exit_status=$?
-      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
-	exit $exit_status
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
       fi
-      case $host in
-      *-darwin*)
-	$show "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	if test -z "$run"; then
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
-	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
-	  if test -n "$darwin_arches"; then 
-	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      lipo -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    ${rm}r unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd "$darwin_orig_dir"
- 	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	fi # $run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-        ;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-    func_extract_archives_result="$my_oldobjs"
+    fi
 }
-# End of Shell function definitions
-#####################################
 
-# Darwin sucks
-eval std_shrext=\"$shrext_cmds\"
 
-disable_libs=no
 
-# Parse our command line options once, thoroughly.
-while test "$#" -gt 0
-do
-  arg="$1"
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $SED -n '/^# Usage:/,/# -h/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    $ECHO
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+     }' < "$progpath"
+    exit $?
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    func_error "missing argument for $1"
+    exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+# Check that we have a working $ECHO.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
   shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell, and then maybe $ECHO will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
 
-  case $arg in
-  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
 
-  # If the previous option needs an argument, assign it.
-  if test -n "$prev"; then
-    case $prev in
-    execute_dlfiles)
-      execute_dlfiles="$execute_dlfiles $arg"
-      ;;
-    tag)
-      tagname="$arg"
-      preserve_args="${preserve_args}=$arg"
-
-      # Check whether tagname contains only valid characters
-      case $tagname in
-      *[!-_A-Za-z0-9,/]*)
-	$echo "$progname: invalid tag name: $tagname" 1>&2
-	exit $EXIT_FAILURE
-	;;
-      esac
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
 
-      case $tagname in
-      CC)
-	# Don't test for the "default" C tag, as we know, it's there, but
-	# not specially marked.
-	;;
-      *)
-	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
-	  taglist="$taglist $tagname"
-	  # Evaluate the configuration.
-	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
-	else
-	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
-	fi
-	;;
-      esac
-      ;;
-    *)
-      eval "$prev=\$arg"
-      ;;
-    esac
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
 
-    prev=
-    prevopt=
-    continue
-  fi
+opt_dry_run=false
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
 
-  # Have we seen a non-optional argument yet?
-  case $arg in
-  --help)
-    show_help=yes
-    ;;
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
 
-  --version)
-    $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
-    $echo
-    $echo "Copyright (C) 2005  Free Software Foundation, Inc."
-    $echo "This is free software; see the source for copying conditions.  There is NO"
-    $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-    exit $?
-    ;;
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
 
-  --config)
-    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
     # Now print the configurations for the tags.
     for tagname in $taglist; do
-      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
     done
-    exit $?
-    ;;
-
-  --debug)
-    $echo "$progname: enabling shell trace mode"
-    set -x
-    preserve_args="$preserve_args $arg"
-    ;;
 
-  --dry-run | -n)
-    run=:
-    ;;
+    exit $?
+}
 
-  --features)
-    $echo "host: $host"
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    $ECHO "host: $host"
     if test "$build_libtool_libs" = yes; then
-      $echo "enable shared libraries"
+      $ECHO "enable shared libraries"
     else
-      $echo "disable shared libraries"
+      $ECHO "disable shared libraries"
     fi
     if test "$build_old_libs" = yes; then
-      $echo "enable static libraries"
+      $ECHO "enable static libraries"
     else
-      $echo "disable static libraries"
+      $ECHO "disable static libraries"
     fi
+
     exit $?
-    ;;
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
 
-  --finish) mode="finish" ;;
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
 
-  --mode) prevopt="--mode" prev=mode ;;
-  --mode=*) mode="$optarg" ;;
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
 
-  --preserve-dup-deps) duplicate_deps="yes" ;;
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
 
-  --quiet | --silent)
-    show=:
-    preserve_args="$preserve_args $arg"
-    ;;
+# Parse options once, thoroughly.  This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
 
-  --tag)
-    prevopt="--tag"
-    prev=tag
-    preserve_args="$preserve_args --tag"
+  # Shorthand for --mode=foo, only valid as the first argument
+  case $1 in
+  clean|clea|cle|cl)
+    shift; set dummy --mode clean ${1+"$@"}; shift
     ;;
-  --tag=*)
-    set tag "$optarg" ${1+"$@"}
-    shift
-    prev=tag
-    preserve_args="$preserve_args --tag"
+  compile|compil|compi|comp|com|co|c)
+    shift; set dummy --mode compile ${1+"$@"}; shift
     ;;
-
-  -dlopen)
-    prevopt="-dlopen"
-    prev=execute_dlfiles
+  execute|execut|execu|exec|exe|ex|e)
+    shift; set dummy --mode execute ${1+"$@"}; shift
     ;;
-
-  -*)
-    $echo "$modename: unrecognized option \`$arg'" 1>&2
-    $echo "$help" 1>&2
-    exit $EXIT_FAILURE
+  finish|finis|fini|fin|fi|f)
+    shift; set dummy --mode finish ${1+"$@"}; shift
     ;;
-
-  *)
-    nonopt="$arg"
-    break
+  install|instal|insta|inst|ins|in|i)
+    shift; set dummy --mode install ${1+"$@"}; shift
+    ;;
+  link|lin|li|l)
+    shift; set dummy --mode link ${1+"$@"}; shift
+    ;;
+  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+    shift; set dummy --mode uninstall ${1+"$@"}; shift
     ;;
   esac
-done
 
-if test -n "$prevopt"; then
-  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
-  $echo "$help" 1>&2
-  exit $EXIT_FAILURE
-fi
+  # Parse non-mode specific arguments:
+  while test "$#" -gt 0; do
+    opt="$1"
+    shift
 
-case $disable_libs in
-no) 
-  ;;
-shared)
-  build_libtool_libs=no
-  build_old_libs=yes
-  ;;
-static)
-  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-  ;;
-esac
+    case $opt in
+      --config)		func_config					;;
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
+      --debug)		preserve_args="$preserve_args $opt"
+			func_echo "enabling shell trace mode"
+			opt_debug='set -x'
+			$opt_debug
+			;;
 
-if test -z "$show_help"; then
+      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			execute_dlfiles="$execute_dlfiles $1"
+			shift
+			;;
 
-  # Infer the operation mode.
-  if test -z "$mode"; then
-    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
-    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
-    case $nonopt in
-    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
-      mode=link
-      for arg
-      do
-	case $arg in
-	-c)
-	   mode=compile
-	   break
-	   ;;
-	esac
-      done
-      ;;
-    *db | *dbx | *strace | *truss)
-      mode=execute
-      ;;
-    *install*|cp|mv)
-      mode=install
-      ;;
-    *rm)
-      mode=uninstall
+      --dry-run | -n)	opt_dry_run=:					;;
+      --features)       func_features					;;
+      --finish)		mode="finish"					;;
+
+      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			case $1 in
+			  # Valid mode arguments:
+			  clean)	;;
+			  compile)	;;
+			  execute)	;;
+			  finish)	;;
+			  install)	;;
+			  link)		;;
+			  relink)	;;
+			  uninstall)	;;
+
+			  # Catch anything else as an error
+			  *) func_error "invalid argument for $opt"
+			     exit_cmd=exit
+			     break
+			     ;;
+		        esac
+
+			mode="$1"
+			shift
+			;;
+
+      --preserve-dup-deps)
+			opt_duplicate_deps=:				;;
+
+      --quiet|--silent)	preserve_args="$preserve_args $opt"
+			opt_silent=:
+			;;
+
+      --verbose| -v)	preserve_args="$preserve_args $opt"
+			opt_silent=false
+			;;
+
+      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			preserve_args="$preserve_args $opt $1"
+			func_enable_tag "$1"	# tagname is set here
+			shift
+			;;
+
+      # Separate optargs to long options:
+      -dlopen=*|--mode=*|--tag=*)
+			func_opt_split "$opt"
+			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+			shift
+			;;
+
+      -\?|-h)		func_usage					;;
+      --help)		opt_help=:					;;
+      --version)	func_version					;;
+
+      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
+
+      *)		nonopt="$opt"
+			break
+			;;
+    esac
+  done
+
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
       ;;
     *)
-      # If we have no mode, but dlfiles were specified, then do execute mode.
-      test -n "$execute_dlfiles" && mode=execute
+      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      ;;
+  esac
 
-      # Just use the default operation mode.
-      if test -z "$mode"; then
-	if test -n "$nonopt"; then
-	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
-	else
-	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
-	fi
+  # Having warned about all mis-specified options, bail out if
+  # anything was wrong.
+  $exit_cmd $EXIT_FAILURE
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
       fi
-      ;;
-    esac
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+$opt_help || {
+  # Sanity checks first:
+  func_check_version_match
+
+  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+    func_fatal_configuration "not configured to build any kind of library"
   fi
 
+  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+  # Darwin sucks
+  eval std_shrext=\"$shrext_cmds\"
+
+
   # Only execute mode is allowed to have -dlopen flags.
   if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
-    $echo "$help" 1>&2
+    func_error "unrecognized option \`-dlopen'"
+    $ECHO "$help" 1>&2
     exit $EXIT_FAILURE
   fi
 
   # Change the help message to a mode-specific one.
   generic_help="$help"
-  help="Try \`$modename --help --mode=$mode' for more information."
+  help="Try \`$progname --help --mode=$mode' for more information."
+}
 
-  # These modes are in order of execution frequency so that they run quickly.
-  case $mode in
-  # libtool compile mode
-  compile)
-    modename="$modename: compile"
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
 
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
 
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
 
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  if test -n "$libobj" ; then
-	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  arg_mode=target
-	  continue
-	  ;;
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
 
-	-static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
 
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_ltwrapper_scriptname_result=""
+    if func_ltwrapper_executable_p "$1"; then
+	func_dirname_and_basename "$1" "" "."
+	func_stripname '' '.exe' "$func_basename_result"
+	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    fi
+}
 
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
 
-	-Wc,*)
-	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
- 	  for arg in $args; do
-	    IFS="$save_ifs"
 
-	    # Double-quote args containing other shell metacharacters.
-	    # Many Bourne shells cannot handle close brackets correctly
-	    # in scan sets, so we specify it separately.
-	    case $arg in
-	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	      arg="\"$arg\""
-	      ;;
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+        func_quote_for_eval "$arg"
+	CC_quoted="$CC_quoted $func_quote_for_eval_result"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_quote_for_eval "$arg"
+	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
+	    done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
 	    esac
-	    lastarg="$lastarg $arg"
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag="$pie_flag $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_quote_for_eval "$arg"
+	    lastarg="$lastarg $func_quote_for_eval_result"
 	  done
 	  IFS="$save_ifs"
-	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
 
 	  # Add the arguments to base_compile.
 	  base_compile="$base_compile $lastarg"
 	  continue
 	  ;;
 
-	* )
+	*)
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
@@ -709,64 +1187,42 @@ if test -z "$show_help"; then
       esac    #  case $arg_mode
 
       # Aesthetically quote the previous argument.
-      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
-
-      case $lastarg in
-      # Double-quote args containing other shell metacharacters.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, and some SunOS ksh mistreat backslash-escaping
-      # in scan sets (worked around with variable expansion),
-      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
-      # at all, so we specify them separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	lastarg="\"$lastarg\""
-	;;
-      esac
-
-      base_compile="$base_compile $lastarg"
+      func_quote_for_eval "$lastarg"
+      base_compile="$base_compile $func_quote_for_eval_result"
     done # for arg
 
     case $arg_mode in
     arg)
-      $echo "$modename: you must specify an argument for -Xcompile"
-      exit $EXIT_FAILURE
+      func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      $echo "$modename: you must specify a target with \`-o'" 1>&2
-      exit $EXIT_FAILURE
+      func_fatal_error "you must specify a target with \`-o'"
       ;;
     *)
       # Get the name of the library object.
-      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
       ;;
     esac
 
     # Recognize several different file suffixes.
     # If the user specifies -o file.o, it is replaced with file.lo
-    xform='[cCFSifmso]'
     case $libobj in
-    *.ada) xform=ada ;;
-    *.adb) xform=adb ;;
-    *.ads) xform=ads ;;
-    *.asm) xform=asm ;;
-    *.c++) xform=c++ ;;
-    *.cc) xform=cc ;;
-    *.ii) xform=ii ;;
-    *.class) xform=class ;;
-    *.cpp) xform=cpp ;;
-    *.cxx) xform=cxx ;;
-    *.f90) xform=f90 ;;
-    *.for) xform=for ;;
-    *.java) xform=java ;;
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
     esac
 
-    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
-
     case $libobj in
-    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
-      exit $EXIT_FAILURE
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
       ;;
     esac
 
@@ -774,7 +1230,15 @@ if test -z "$show_help"; then
 
     for arg in $later; do
       case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
       -static)
+	build_libtool_libs=no
 	build_old_libs=yes
 	continue
 	;;
@@ -791,28 +1255,17 @@ if test -z "$show_help"; then
       esac
     done
 
-    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
-    case $qlibobj in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	qlibobj="\"$qlibobj\"" ;;
-    esac
-    test "X$libobj" != "X$qlibobj" \
-	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
-	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
-    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
-    if test "X$xdir" = "X$obj"; then
-      xdir=
-    else
-      xdir=$xdir/
-    fi
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
     lobj=${xdir}$objdir/$objname
 
-    if test -z "$base_compile"; then
-      $echo "$modename: you must specify a compilation command" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
     if test "$build_old_libs" = yes; then
@@ -821,12 +1274,9 @@ if test -z "$show_help"; then
       removelist="$lobj $libobj ${libobj}T"
     fi
 
-    $run $rm $removelist
-    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
-
     # On Cygwin there's no "real" PIC flag so we must build both object types
     case $host_os in
-    cygwin* | mingw* | pw32* | os2*)
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
       pic_mode=default
       ;;
     esac
@@ -838,10 +1288,8 @@ if test -z "$show_help"; then
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
     if test "$compiler_c_o" = no; then
-      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
       lockfile="$output_obj.lock"
-      removelist="$removelist $output_obj $lockfile"
-      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
     else
       output_obj=
       need_locks=no
@@ -851,13 +1299,13 @@ if test -z "$show_help"; then
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
     if test "$need_locks" = yes; then
-      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
-	$show "Waiting for $lockfile to be removed"
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
     elif test "$need_locks" = warn; then
       if test -f "$lockfile"; then
-	$echo "\
+	$ECHO "\
 *** ERROR, $lockfile exists and contains:
 `cat $lockfile 2>/dev/null`
 
@@ -868,34 +1316,22 @@ repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
-	$run $rm $removelist
+	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
-      $echo "$srcfile" > "$lockfile"
+      removelist="$removelist $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
     fi
 
+    $opt_dry_run || $RM $removelist
+    removelist="$removelist $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
     if test -n "$fix_srcfile_path"; then
       eval srcfile=\"$fix_srcfile_path\"
     fi
-    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
-    case $qsrcfile in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-      qsrcfile="\"$qsrcfile\"" ;;
-    esac
-
-    $run $rm "$libobj" "${libobj}T"
-
-    # Create a libtool object file (analogous to a ".la" file),
-    # but don't create it if we're doing a dry run.
-    test -z "$run" && cat > ${libobj}T <<EOF
-# $libobj - a libtool object file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-EOF
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
     if test "$build_libtool_libs" = yes; then
@@ -909,32 +1345,19 @@ EOF
 	command="$base_compile $qsrcfile"
       fi
 
-      if test ! -d "${xdir}$objdir"; then
-	$show "$mkdir ${xdir}$objdir"
-	$run $mkdir ${xdir}$objdir
-	exit_status=$?
-	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
-	  exit $exit_status
-	fi
-      fi
+      func_mkdir_p "$xdir$objdir"
 
       if test -z "$output_obj"; then
 	# Place PIC objects in $objdir
 	command="$command -o $lobj"
       fi
 
-      $run $rm "$lobj" "$output_obj"
-
-      $show "$command"
-      if $run eval "$command"; then :
-      else
-	test -n "$output_obj" && $run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
       if test "$need_locks" = warn &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$echo "\
+	$ECHO "\
 *** ERROR, $lockfile contains:
 `cat $lockfile 2>/dev/null`
 
@@ -948,45 +1371,27 @@ repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
-	$run $rm $removelist
+	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
 
       # Just move the object if needed, then go on to compile the next one
       if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	$show "$mv $output_obj $lobj"
-	if $run $mv $output_obj $lobj; then :
-	else
-	  error=$?
-	  $run $rm $removelist
-	  exit $error
-	fi
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
       fi
 
-      # Append the name of the PIC object to the libtool object file.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-pic_object='$objdir/$objname'
-
-EOF
-
       # Allow error messages only from the first compilation.
       if test "$suppress_opt" = yes; then
-        suppress_output=' >/dev/null 2>&1'
+	suppress_output=' >/dev/null 2>&1'
       fi
-    else
-      # No PIC object so indicate it doesn't exist in the libtool
-      # object file.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-pic_object=none
-
-EOF
     fi
 
     # Only build a position-dependent object if we build old libraries.
     if test "$build_old_libs" = yes; then
       if test "$pic_mode" != yes; then
 	# Don't build PIC code
-	command="$base_compile $qsrcfile"
+	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
@@ -996,17 +1401,12 @@ EOF
 
       # Suppress compiler output if we already did a PIC compilation.
       command="$command$suppress_output"
-      $run $rm "$obj" "$output_obj"
-      $show "$command"
-      if $run eval "$command"; then :
-      else
-	$run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
       if test "$need_locks" = warn &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$echo "\
+	$ECHO "\
 *** ERROR, $lockfile contains:
 `cat $lockfile 2>/dev/null`
 
@@ -1020,5423 +1420,6777 @@ repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
-	$run $rm $removelist
+	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
 
       # Just move the object if needed
       if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	$show "$mv $output_obj $obj"
-	if $run $mv $output_obj $obj; then :
-	else
-	  error=$?
-	  $run $rm $removelist
-	  exit $error
-	fi
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
       fi
-
-      # Append the name of the non-PIC object the libtool object file.
-      # Only append if the libtool object file exists.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-# Name of the non-PIC object.
-non_pic_object='$objname'
-
-EOF
-    else
-      # Append the name of the non-PIC object the libtool object file.
-      # Only append if the libtool object file exists.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-# Name of the non-PIC object.
-non_pic_object=none
-
-EOF
     fi
 
-    $run $mv "${libobj}T" "${libobj}"
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
-    # Unlock the critical section if it was locked
-    if test "$need_locks" != no; then
-      $run $rm "$lockfile"
-    fi
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
 
     exit $EXIT_SUCCESS
-    ;;
-
-  # libtool link mode
-  link | relink)
-    modename="$modename: link"
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
+}
 
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args="$nonopt"
-    base_compile="$nonopt $@"
-    compile_command="$nonopt"
-    finalize_command="$nonopt"
+$opt_help || {
+test "$mode" = compile && func_mode_compile ${1+"$@"}
+}
 
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
 
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    notinst_path= # paths that contain not-installed libtool libraries
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
 
-    func_infer_tag $base_compile
+Remove files from the build directory.
 
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -all-static | -static)
-	if test "X$arg" = "X-all-static"; then
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	else
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	fi
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
 
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
 
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
-	;;
-      *) qarg=$arg ;;
-      esac
-      libtool_args="$libtool_args $qarg"
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
 
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  compile_command="$compile_command @OUTPUT@"
-	  finalize_command="$finalize_command @OUTPUT@"
-	  ;;
-	esac
+Compile a source file into a libtool library object.
 
-	case $prev in
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    compile_command="$compile_command @SYMFILE@"
-	    finalize_command="$finalize_command @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  if test ! -f "$arg"; then
-	    $echo "$modename: symbol file \`$arg' does not exist"
-	    exit $EXIT_FAILURE
-	  fi
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat $save_arg`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
+This mode accepts the following additional options:
 
-	      # Check to see that this really is a libtool object.
-	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-		pic_object=
-		non_pic_object=
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
 
-		# Read the .lo file
-		# If there is no directory component, then add one.
-		case $arg in
-		*/* | *\\*) . $arg ;;
-		*) . ./$arg ;;
-		esac
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
 
-		if test -z "$pic_object" || \
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none && \
-		   test "$non_pic_object" = none; then
-		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
-		  exit $EXIT_FAILURE
-		fi
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
 
-		# Extract subdirectory from the argument.
-		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-		if test "X$xdir" = "X$arg"; then
-		  xdir=
-		else
-		  xdir="$xdir/"
-		fi
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
 
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
+Automatically set library path, then run a program.
 
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
+This mode accepts the following additional options:
 
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
+  -dlopen FILE      add the directory containing FILE to the library path
 
-		  # A PIC object.
-		  libobjs="$libobjs $pic_object"
-		  arg="$pic_object"
-		fi
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
 
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
 
-		  # A standard non-PIC object
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if test -z "$run"; then
-		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
-		  exit $EXIT_FAILURE
-		else
-		  # Dry-run case.
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
 
-		  # Extract subdirectory from the argument.
-		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-		  if test "X$xdir" = "X$arg"; then
-		    xdir=
-		  else
-		    xdir="$xdir/"
-		  fi
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
 
-		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
-		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
-		  libobjs="$libobjs $pic_object"
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		fi
-	      fi
-	    done
-	  else
-	    $echo "$modename: link input file \`$save_arg' does not exist"
-	    exit $EXIT_FAILURE
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    $echo "$modename: only absolute run-paths are allowed" 1>&2
-	    exit $EXIT_FAILURE
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  compile_command="$compile_command $qarg"
-	  finalize_command="$finalize_command $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  compile_command="$compile_command $wl$qarg"
-	  finalize_command="$finalize_command $wl$qarg"
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  compile_command="$compile_command $qarg"
-	  finalize_command="$finalize_command $qarg"
-	  continue
-	  ;;
-	shrext)
-  	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	darwin_framework|darwin_framework_skip)
-	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
-	  compile_command="$compile_command $arg"
-	  finalize_command="$finalize_command $arg"
-	  prev=
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
+Complete the installation of libtool libraries.
 
-      prevarg="$arg"
+Each LIBDIR is a directory that contains libtool libraries.
 
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  compile_command="$compile_command $link_static_flag"
-	  finalize_command="$finalize_command $link_static_flag"
-	fi
-	continue
-	;;
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
 
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
-	continue
-	;;
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
 
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
+Install executables or libraries.
 
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
 
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
+The following components of INSTALL-COMMAND are treated specially:
 
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
+  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
 
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  $echo "$modename: more than one -exported-symbols argument is not allowed"
-	  exit $EXIT_FAILURE
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
 
-      -framework|-arch|-isysroot)
-	case " $CC " in
-	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
-		prev=darwin_framework_skip ;;
-	  *) compiler_flags="$compiler_flags $arg"
-	     prev=darwin_framework ;;
-	esac
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-	continue
-	;;
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
 
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
+Link object files or libraries together to form another library, or to
+create an executable program.
 
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  compile_command="$compile_command $arg"
-	  finalize_command="$finalize_command $arg"
-	  ;;
-	esac
-	continue
-	;;
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
 
-      -L*)
-	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  if test -z "$absdir"; then
-	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
-	    absdir="$dir"
-	    notinst_path="$notinst_path $dir"
-	  fi
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
+The following components of LINK-COMMAND are treated specially:
 
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs -framework System"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
 
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      -model)
-	compile_command="$compile_command $arg"
-	compiler_flags="$compiler_flags $arg"
-	finalize_command="$finalize_command $arg"
-	prev=xcompiler
-	continue
-	;;
+All other options (arguments beginning with \`-') are ignored.
 
-     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
-	compiler_flags="$compiler_flags $arg"
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-	continue
-	;;
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
 
-      -module)
-	module=yes
-	continue
-	;;
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
 
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m* pass through architecture-specific compiler args for GCC
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -pg pass through profiling flag for GCC
-      # @file GCC response files
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
-      -t[45]*|-txscale*|@*)
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
 
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-        compile_command="$compile_command $arg"
-        finalize_command="$finalize_command $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
         ;;
 
-      -shrext)
-	prev=shrext
-	continue
-	;;
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
 
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
+Remove libraries from an installation directory.
 
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # in order for the loader to find any dlls it needs.
-	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
-	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
 
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
 
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
+      *)
+        func_fatal_help "invalid operation mode \`$mode'"
+        ;;
+    esac
 
-      -o) prev=output ;;
+    $ECHO
+    $ECHO "Try \`$progname --help' for more information about other modes."
 
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
+    exit $?
+}
 
-      -release)
-	prev=release
-	continue
-	;;
+  # Now that we've collected a possible --mode arg, show help if necessary
+  $opt_help && func_mode_help
 
-      -rpath)
-	prev=rpath
-	continue
-	;;
 
-      -R)
-	prev=xrpath
-	continue
-	;;
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
 
-      -R*)
-	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  $echo "$modename: only absolute run-paths are allowed" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -static)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
 
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
 
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
 
-      -Wc,*)
-	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-	  case $flag in
-	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	    flag="\"$flag\""
-	    ;;
-	  esac
-	  arg="$arg $wl$flag"
-	  compiler_flags="$compiler_flags $flag"
-	done
-	IFS="$save_ifs"
-	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
-	;;
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
 
-      -Wl,*)
-	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-	  case $flag in
-	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	    flag="\"$flag\""
-	    ;;
-	  esac
-	  arg="$arg $wl$flag"
-	  compiler_flags="$compiler_flags $wl$flag"
-	  linker_flags="$linker_flags $flag"
-	done
-	IFS="$save_ifs"
-	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
-	;;
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
 
-      -Xcompiler)
-	prev=xcompiler
-	continue
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
 	;;
 
-      -Xlinker)
-	prev=xlinker
-	continue
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
 	;;
 
-      -XCClinker)
-	prev=xcclinker
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
+      esac
 
-      # Some other compiler flag.
-      -* | +*)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
 
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
 
-      *.lo)
-	# A libtool-controlled object.
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
 
-	# Check to see that this really is a libtool object.
-	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  pic_object=
-	  non_pic_object=
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_quote_for_eval "$file"
+      args="$args $func_quote_for_eval_result"
+    done
 
-	  # Read the .lo file
-	  # If there is no directory component, then add one.
-	  case $arg in
-	  */* | *\\*) . $arg ;;
-	  *) . ./$arg ;;
-	  esac
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
 
-	  if test -z "$pic_object" || \
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none && \
-	     test "$non_pic_object" = none; then
-	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
 
-	  # Extract subdirectory from the argument.
-	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	  if test "X$xdir" = "X$arg"; then
-	    xdir=
- 	  else
-	    xdir="$xdir/"
-	  fi
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	$ECHO "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
 
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
+test "$mode" = execute && func_mode_execute ${1+"$@"}
 
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
 
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libdirs="$nonopt"
+    admincmds=
 
-	    # A PIC object.
-	    libobjs="$libobjs $pic_object"
-	    arg="$pic_object"
-	  fi
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
 
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
 
-	    # A standard non-PIC object
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if test -z "$run"; then
-	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
-	    exit $EXIT_FAILURE
-	  else
-	    # Dry-run case.
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
 
-	    # Extract subdirectory from the argument.
-	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	    if test "X$xdir" = "X$arg"; then
-	      xdir=
-	    else
-	      xdir="$xdir/"
-	    fi
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    $ECHO "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $ECHO "   $libdir"
+    done
+    $ECHO
+    $ECHO "If you ever happen to want to link against installed libraries"
+    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
+    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $ECHO "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $ECHO "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $ECHO "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
 
-	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
-	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
-	    libobjs="$libobjs $pic_object"
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	  fi
-	fi
-	;;
+      $ECHO "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $ECHO "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $ECHO
 
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
+    $ECHO "See any operating system documentation about shared libraries for"
+    case $host in
+      solaris2.[6789]|solaris2.1[0-9])
+        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	$ECHO "pages."
 	;;
+      *)
+        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
+        ;;
+    esac
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+}
 
-      *.la)
-	# A libtool-controlled library.
+test "$mode" = finish && func_mode_finish ${1+"$@"}
 
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
 
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
-      esac # arg
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
 
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog="$install_prog$func_quote_for_eval_result"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
       fi
-    done # argument parsing loop
 
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      compile_command="$compile_command $arg"
-      finalize_command="$finalize_command $arg"
-    fi
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog="$install_prog $func_quote_for_eval_result"
+    done
 
-    oldlibs=
-    # calculate the name of the file, without its directory
-    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
-    libobjs_save="$libobjs"
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
 
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
 
-    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-    if test "X$output_objdir" = "X$output"; then
-      output_objdir="$objdir"
-    else
-      output_objdir="$output_objdir/$objdir"
-    fi
-    # Create the object directory.
-    if test ! -d "$output_objdir"; then
-      $show "$mkdir $output_objdir"
-      $run $mkdir $output_objdir
-      exit_status=$?
-      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
-	exit $exit_status
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
       fi
     fi
 
-    # Determine the type of output
-    case $output in
-    "")
-      $echo "$modename: you must specify an output file" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
 
-    case $host in
-    *cygwin* | *mingw* | *pw32*)
-      # don't eliminate duplications in $postdeps and $predeps
-      duplicate_compiler_generated_deps=yes
-      ;;
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
     *)
-      duplicate_compiler_generated_deps=$duplicate_deps
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
       ;;
     esac
-    specialdeplibs=
 
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if test "X$duplicate_deps" = "Xyes" ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
 
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
 
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
 	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
 
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    case $linkmode in
-    lib)
-	passes="conv link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
-	    exit $EXIT_FAILURE
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
 	    ;;
 	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-    for pass in $passes; do
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
 	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
-	    continue
-	  fi
-	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
-	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
 	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if (${SED} -e '2q' $lib |
-                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-		  library_names=
-		  old_library=
-		  case $lib in
-		  */* | *\\*) . $lib ;;
-		  *) . ./$lib ;;
-		  esac
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
-		    test "X$ladir" = "X$lib" && ladir="."
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-	        ;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-	    ;;
-	  *)
-	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    valid_a_lib=no
-	    case $deplibs_check_method in
-	      match_pattern*)
-		set dummy $deplibs_check_method
-	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-		if eval $echo \"$deplib\" 2>/dev/null \
-		    | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		  valid_a_lib=yes
-		fi
-		;;
-	      pass_all)
-		valid_a_lib=yes
-		;;
-            esac
-	    if test "$valid_a_lib" != yes; then
-	      $echo
-	      $echo "*** Warning: Trying to link with static lib archive $deplib."
-	      $echo "*** I have the capability to make that library automatically link in when"
-	      $echo "*** you link to this library.  But I can only do this if you have a"
-	      $echo "*** shared version of the library, which you do not appear to have"
-	      $echo "*** because the file extensions .$libext of this argument makes me believe"
-	      $echo "*** that it is just a static archive that I should not used here."
-	    else
-	      $echo
-	      $echo "*** Warning: Linking the shared library $output against the"
-	      $echo "*** static library $deplib is not portable!"
-	      deplibs="$deplib $deplibs"
-	    fi
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
 	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
 
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-	  exit $EXIT_FAILURE
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
-	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$ladir" = "X$lib" && ladir="."
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
 
+      *.lo)
+	# Install (i.e. copy) a libtool object.
 
-	# Read the .la file
-	case $lib in
-	*/* | *\\*) . $lib ;;
-	*) . ./$lib ;;
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
 	esac
 
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
 	fi
+	exit $EXIT_SUCCESS
+	;;
 
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
-	      exit $EXIT_FAILURE
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
 	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	    tmp_libs=
-	    for deplib in $dependency_libs; do
-	      deplibs="$deplib $deplibs"
-              if test "X$duplicate_deps" = "Xyes" ; then
-	        case "$tmp_libs " in
-	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	        esac
-              fi
-	      tmp_libs="$tmp_libs $deplib"
-	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  continue
-	fi # $pass = conv
+	    ;;
+	esac
 
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
 
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+	  func_source "$wrapper"
 
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
 	  else
-	    newdlfiles="$newdlfiles $lib"
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
 	  fi
-	  continue
-	fi # $pass = dlopen
+	fi
 
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
-	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-	    abs_ladir="$ladir"
-	  fi
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
 	  ;;
 	esac
-	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
 
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
 
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir"; then
-	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
 
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
 
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
 
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
 
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
 
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if test "X$duplicate_deps" = "Xyes" ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
 
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath " in
-	      *" $dir "*) ;;
-	      *" $absdir "*) ;;
-	      *) temp_rpath="$temp_rpath $absdir" ;;
-	      esac
-	    fi
+test "$mode" = install && func_mode_install ${1+"$@"}
 
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
 
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
 
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes ; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  if test "$installed" = no; then
-	    notinst_deplibs="$notinst_deplibs $lib"
-	    need_relink=yes
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_verbose "extracting global C symbols from \`$progfile'"
+	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
 	  fi
-	  # This is a shared library
 
-	  # Warn about portability, can't link against -module's on
-	  # some systems (darwin)
-	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
-	    $echo
-	    if test "$linkmode" = prog; then
-	      $echo "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $echo "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $echo "*** $linklib is not portable!"
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
 	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
 	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
 	      esac
-	      ;;
-	    esac
+	    }
 	  fi
+	fi
 
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    realname="$2"
-	    shift; shift
-	    libname=`eval \\$echo \"$libname_spec\"`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw*)
-		major=`expr $current - $age`
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
-	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      $show "extracting exported symbol list from \`$soname'"
-	      save_ifs="$IFS"; IFS='~'
-	      cmds=$extract_expsyms_cmds
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd" || exit $?
-	      done
-	      IFS="$save_ifs"
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      $show "generating import library for \`$soname'"
-	      save_ifs="$IFS"; IFS='~'
-	      cmds=$old_archive_from_expsyms_cmds
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd" || exit $?
-	      done
-	      IFS="$save_ifs"
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a module then we can not link against
-		    # it, someone is ignoring the new warnings I added
-		    if /usr/bin/file -L $add 2> /dev/null |
-                      $EGREP ": [^:]* bundle" >/dev/null ; then
-		      $echo "** Warning, lib $linklib is a module, not a shared library"
-		      if test -z "$old_library" ; then
-		        $echo
-		        $echo "** And there doesn't seem to be a static archive available"
-		        $echo "** The link will probably fail, sorry"
-		      else
-		        add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+	  $opt_dry_run || {
+	    eval '$ECHO ": $name " >> "$nlist"'
+	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	  }
+	done
 
-	    if test "$lib_linked" != yes; then
-	      $echo "$modename: configuration error: unsupported hardcode properties"
-	      exit $EXIT_FAILURE
-	    fi
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
 
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes && \
-		 test "$hardcode_minus_L" != yes && \
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
 	  fi
 
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-	        add="$inst_prefix_dir$libdir/$linklib"
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
 	      else
-	        add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
 	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
 	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
 
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    $echo
-	    $echo "*** Warning: This system can not link to static lib archive $lib."
-	    $echo "*** I have the capability to make that library automatically link in when"
-	    $echo "*** you link to this library.  But I can only do this if you have a"
-	    $echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      $echo "*** But as you try to build a module library, libtool will still create "
-	      $echo "*** a static module, that should work as long as the dlopening application"
-	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		$echo
-		$echo "*** However, this would only work if libtool was able to extract symbol"
-		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		$echo "*** not find such a program.  So, this module is probably useless."
-		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
 	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
+	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
-	fi # link shared/static library?
 
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
 
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if test "X$duplicate_deps" = "Xyes" ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+"
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* )
+	    $ECHO >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs.  */"
+	    lt_dlsym_const= ;;
+	  *osf5*)
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+	    lt_dlsym_const= ;;
+	  *)
+	    lt_dlsym_const=const ;;
+	  esac
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+extern $lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+$lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
 	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags="$symtab_cflags $arg" ;;
+	  esac
+	done
 
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
-		test "X$dir" = "X$deplib" && dir="."
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if grep "^installed=no" $deplib > /dev/null; then
-		  path="$absdir/$objdir"
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  if test -z "$libdir"; then
-		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
-		    exit $EXIT_FAILURE
-		  fi
-		  if test "$absdir" != "$libdir"; then
-		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
-		  fi
-		  path="$absdir"
-		fi
-		depdepl=
-		case $host in
-		*-*-darwin*)
-		  # we do not want to link against static libs,
-		  # but need to link against shared
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$path/$depdepl" ; then
-		      depdepl="$path/$depdepl"
-		    fi
-		    # do not add paths which are already there
-		    case " $newlib_search_path " in
-		    *" $path "*) ;;
-		    *) newlib_search_path="$newlib_search_path $path";;
-		    esac
-		  fi
-		  path=""
-		  ;;
-		*)
-		  path="-L$path"
-		  ;;
-		esac
-		;;
-	      -l*)
-		case $host in
-		*-*-darwin*)
-		  # Again, we only want to link against shared libraries
-		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
-		  for tmp in $newlib_search_path ; do
-		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
-		      eval depdepl="$tmp/lib$tmp_libs.dylib"
-		      break
-		    fi
-		  done
-		  path=""
-		  ;;
-		*) continue ;;
-		esac
-		;;
-	      *) continue ;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	      case " $deplibs " in
-	      *" $depdepl "*) ;;
-	      *) deplibs="$depdepl $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
 	  ;;
 	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-      dlprefiles="$newdlprefiles"
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
     fi
+}
 
-    case $linkmode in
-    oldlib)
-      if test -n "$deplibs"; then
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
-      fi
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
 
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
-      fi
 
-      if test -n "$rpath"; then
-	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
-      fi
 
-      if test -n "$xrpath"; then
-	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
-      fi
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
 
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
-      fi
 
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
-      fi
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
 
-      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
-      fi
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
 
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
+      func_mkdir_p "$my_xdir"
 
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	if test "$module" = no; then
-	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-	fi
-	;;
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
       esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
 
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
-	  exit $EXIT_FAILURE
-	else
-	  $echo
-	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
-	  $echo "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
+    func_extract_archives_result="$my_oldobjs"
+}
 
-      if test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
-      fi
 
-      set dummy $rpath
-      if test "$#" -gt 2; then
-	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
-      fi
-      install_libdir="$2"
 
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
+# func_emit_wrapper_part1 [arg=no]
+#
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
+{
+	func_emit_wrapper_part1_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part1_arg1=$1
 	fi
 
-	if test -n "$vinfo"; then
-	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
-	fi
+	$ECHO "\
+#! $SHELL
 
-	if test -n "$release"; then
-	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
-	fi
-      else
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
 
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	IFS="$save_ifs"
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
 
-	if test -n "$8"; then
-	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
 
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-	case $vinfo_number in
-	yes)
-	  number_major="$2"
-	  number_minor="$3"
-	  number_revision="$4"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows)
-	    current=`expr $number_major + $number_minor`
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    current=`expr $number_major + $number_minor - 1`
-	    age="$number_minor"
-	    revision="$number_minor"
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$2"
-	  revision="$3"
-	  age="$4"
-	  ;;
-	esac
+relink_command=\"$relink_command\"
 
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    ECHO=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$ECHO works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$ECHO will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$ECHO "\
 
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
 
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
 
-	if test "$age" -gt "$current"; then
-	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
 
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
+    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+"
+}
+# end: func_emit_wrapper_part1
 
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  major=.`expr $current - $age`
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  minor_current=`expr $current + 1`
-	  verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  ;;
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+	func_emit_wrapper_part2_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part2_arg1=$1
+	fi
 
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
+	$ECHO "\
 
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current";
-	  ;;
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
 
-	irix | nonstopux)
-	  major=`expr $current - $age + 1`
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
 
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
 
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    iface=`expr $revision - $loop`
-	    loop=`expr $loop - 1`
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
+    file=\"\$\$-\$program\"
 
-	linux)
-	  major=.`expr $current - $age`
-	  versuffix="$major.$age.$revision"
-	  ;;
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
 
-	osf)
-	  major=.`expr $current - $age`
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
+	  $ECHO "\
 
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    iface=`expr $current - $loop`
-	    loop=`expr $loop - 1`
-	    verstring="$verstring:${iface}.0"
-	  done
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
 
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
 
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
+	$ECHO "\
 
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  major=`expr $current - $age`
-	  versuffix="-$major"
-	  ;;
+  if test -f \"\$progdir/\$program\"; then"
 
-	*)
-	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
-	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
 
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
 
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
+    export $shlibpath_var
+"
 	fi
 
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
 	fi
-      fi
 
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$echo "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-	         then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	if test -n "$removelist"; then
-	  $show "${rm}r $removelist"
-	  $run ${rm}r $removelist
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2* | *-cegcc*)
+	  $ECHO "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $ECHO "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+# end: func_emit_wrapper_part2
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_arg1=$1
 	fi
-      fi
 
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+	# split this up so that func_emit_cwrapperexe_src
+	# can call each part independently.
+	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
 
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
 
-      # Eliminate all temporary directories.
-      for path in $notinst_path; do
-	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
-	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
-	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
-      done
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_tmp1=`cygpath -w "$1"`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=""
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
 
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+        func_to_host_pathlist_tmp2="$1"
+        # Once set for this call, this variable should not be
+        # reassigned. It is used in tha fallback case.
+        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+          $SED -e 's|^:*||' -e 's|:*$||'`
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+                  fi
+                fi
+              fi
+              IFS=:
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result" ; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
 
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
 
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
 
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs -framework System"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
- 	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
 
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $rm conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "$SHELL $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat <<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+# define setmode _setmode
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+#  define HAVE_SETENV
+#  ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+#  endif
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+#ifdef _MSC_VER
+# define S_IXUSR _S_IEXEC
+# define stat _stat
+# ifndef _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifdef __CYGWIN__
+# define FOPEN_WB "wb"
+#endif
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+    va_list args;
+    va_start (args, fmt);
+    (void) vfprintf (stderr, fmt, args);
+    va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
+EOF
+
+	    func_emit_wrapper_part1 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+	    cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+	    func_emit_wrapper_part2 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+
+	    cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
 EOF
-	  $rm conftest
-	  $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
-	  if test "$?" -eq 0 ; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      name=`expr $i : '-l\(.*\)'`
-	      # If $name is empty we are operating on a -L argument.
-              if test "$name" != "" && test "$name" -ne "0"; then
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-	        fi
-		if test -n "$i" ; then
-		  libname=`eval \\$echo \"$libname_spec\"`
-		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
-		  set dummy $deplib_matches
-		  deplib_match=$2
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    $echo
-		    $echo "*** Warning: dynamic linker does not accept needed library $i."
-		    $echo "*** I have the capability to make that library automatically link in when"
-		    $echo "*** you link to this library.  But I can only do this if you have a"
-		    $echo "*** shared version of the library, which I believe you do not have"
-		    $echo "*** because a test_compile did reveal that the linker did not use it for"
-		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-	      else
-		newdeplibs="$newdeplibs $i"
-	      fi
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      name=`expr $i : '-l\(.*\)'`
-	      # If $name is empty we are operating on a -L argument.
-              if test "$name" != "" && test "$name" != "0"; then
-		$rm conftest
-		$LTCC $LTCFLAGS -o conftest conftest.c $i
-		# Did it work?
-		if test "$?" -eq 0 ; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval \\$echo \"$libname_spec\"`
-		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
-		    set dummy $deplib_matches
-		    deplib_match=$2
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      $echo
-		      $echo "*** Warning: dynamic linker does not accept needed library $i."
-		      $echo "*** I have the capability to make that library automatically link in when"
-		      $echo "*** you link to this library.  But I can only do this if you have a"
-		      $echo "*** shared version of the library, which you do not appear to have"
-		      $echo "*** because a test_compile did reveal that the linker did not use this one"
-		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  $echo
-		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
-		  $echo "***  make it link in!  You will probably need to install it or some"
-		  $echo "*** library that it depends on before this library will be fully"
-		  $echo "*** functional.  Installing it before continuing would be even better."
-		fi
-	      else
-		newdeplibs="$newdeplibs $i"
-	      fi
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method
-	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    name=`expr $a_deplib : '-l\(.*\)'`
-	    # If $name is empty we are operating on a -L argument.
-            if test "$name" != "" && test  "$name" != "0"; then
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval \\$echo \"$libname_spec\"`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null \
-			 | grep " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
-			 | ${SED} 10q \
-			 | $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$echo
-		$echo "*** Warning: linker path does not have real file for library $a_deplib."
-		$echo "*** I have the capability to make that library automatically link in when"
-		$echo "*** you link to this library.  But I can only do this if you have a"
-		$echo "*** shared version of the library, which you do not appear to have"
-		$echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $echo "*** with $libname and none of the candidates passed a file format test"
-		  $echo "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
 	    else
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
 	    fi
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    name=`expr $a_deplib : '-l\(.*\)'`
-	    # If $name is empty we are operating on a -L argument.
-	    if test -n "$name" && test "$name" != "0"; then
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval \\$echo \"$libname_spec\"`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval $echo \"$potent_lib\" 2>/dev/null \
-		        | ${SED} 10q \
-		        | $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$echo
-		$echo "*** Warning: linker path does not have real file for library $a_deplib."
-		$echo "*** I have the capability to make that library automatically link in when"
-		$echo "*** you link to this library.  But I can only do this if you have a"
-		$echo "*** shared version of the library, which you do not appear to have"
-		$echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $echo "*** with $libname and none of the candidates passed a file format test"
-		  $echo "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
 	    else
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
 	    fi
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
-	    -e 's/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
-	    done
-	  fi
-	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
-	    | grep . >/dev/null; then
-	    $echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
 	    else
-	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
 	    fi
-	    $echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	  fi
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
 
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library is the System framework
-	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	  ;;
-	esac
 
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    $echo
-	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
-	    $echo "*** a static module, that should work as long as the dlopening"
-	    $echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      $echo
-	      $echo "*** However, this would only work if libtool was able to extract symbol"
-	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      $echo "*** not find such a program.  So, this module is probably useless."
-	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    $echo "*** The inter-library dependencies that have been dropped here will be"
-	    $echo "*** automatically added whenever a program is linked with this library"
-	    $echo "*** or is declared to -dlopen it."
+	    cat <<"EOF"
 
-	    if test "$allow_undefined" = no; then
-	      $echo
-	      $echo "*** Since this library must not contain undefined symbols,"
-	      $echo "*** because either the platform does not support them or"
-	      $echo "*** it was explicitly requested with -no-undefined,"
-	      $echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
 
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
 
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
 
+static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
+  /* argument is putenv-style "foo=bar", value of foo is set to bar */
 
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
+  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
 
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
+static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
+  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
 
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
 
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	realname="$2"
-	shift; shift
+  int i;
 
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
 
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
+  /* very simple arg parsing; don't want to rely on getopt */
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
 
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    cat <<"EOF"
+	  printf ("%s", script_text_part1);
+	  printf ("%s", script_text_part2);
+	  return 0;
+	}
+    }
 
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    $show "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $run $rm $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      if len=`expr "X$cmd" : ".*"` &&
-	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	        $show "$cmd"
-	        $run eval "$cmd" || exit $?
-	        skipped_export=false
-	      else
-	        # The command line is too long to execute in one step.
-	        $show "using reloadable object file for export list..."
-	        skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex"; then
-	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
-	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
-	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
+  newargz = XMALLOC (char *, argc + 1);
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal ("Couldn't find %s", argv[0]);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+			  tmp_pathspec));
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+			  actual_cwrapper_path));
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
+EOF
 
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
-	fi
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
 
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-		case " $convenience " in
-		*" $test_deplib "*) ;;
-		*)
-			tmp_deplibs="$tmp_deplibs $test_deplib"
-			;;
-		esac
-	done
-	deplibs="$tmp_deplibs"
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
 
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
 
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	  fi
-	fi
-	
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
 
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
-	fi
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
 
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	  eval test_cmds=\"$archive_expsym_cmds\"
-	  cmds=$archive_expsym_cmds
-	else
-	  eval test_cmds=\"$archive_cmds\"
-	  cmds=$archive_cmds
-	  fi
-	fi
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
 
-	if test "X$skipped_export" != "X:" &&
-	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise.
-	  $echo "creating reloadable object files..."
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
 
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+        {
+          if (argv[i][env_set_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_set_opt_len + 1;
+              lt_opt_process_env_set (p);
+            }
+          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_set (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_set_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+        {
+          if (argv[i][env_prepend_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_prepend_opt_len + 1;
+              lt_opt_process_env_prepend (p);
+            }
+          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_prepend_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+        {
+          if (argv[i][env_append_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_append_opt_len + 1;
+              lt_opt_process_env_append (p);
+            }
+          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_append (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_append_opt);
+          continue;
+        }
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
 
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  delfiles=
-	  last_robj=
-	  k=1
-	  output=$output_objdir/$output_la-${k}.$objext
-	  # Loop over the list of objects to be linked.
-	  for obj in $save_libobjs
-	  do
-	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
-	    if test "X$objlist" = X ||
-	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-		 test "$len" -le "$max_cmd_len"; }; then
-	      objlist="$objlist $obj"
-	    else
-	      # The command $test_cmds is almost too long, add a
-	      # command to the queue.
-	      if test "$k" -eq 1 ; then
-		# The first file doesn't have a previous command to add.
-		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
-	      else
-		# All subsequent reloadable object files will link in
-		# the last one created.
-		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
-	      fi
-	      last_robj=$output_objdir/$output_la-${k}.$objext
-	      k=`expr $k + 1`
-	      output=$output_objdir/$output_la-${k}.$objext
-	      objlist=$obj
-	      len=1
-	    fi
-	  done
-	  # Handle the remaining objects by creating one last
-	  # reloadable object file.  All subsequent reloadable object
-	  # files will link in the last one created.
-	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
-
-	  if ${skipped_export-false}; then
-	    $show "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $run $rm $export_symbols
-	    libobjs=$output
-	    # Append the command to create the export file.
-	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
-          fi
-
-	  # Set up a command to remove the reloadable object files
-	  # after they are used.
-	  i=0
-	  while test "$i" -lt "$k"
-	  do
-	    i=`expr $i + 1`
-	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
-	  done
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
+    {
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+    }
 
-	  $echo "creating a temporary reloadable object file: $output"
+EOF
 
-	  # Loop through the commands generated above and execute them.
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $concat_cmds; do
-	    IFS="$save_ifs"
-	    $show "$cmd"
-	    $run eval "$cmd" || exit $?
-	  done
-	  IFS="$save_ifs"
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
 
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
+	    cat <<"EOF"
+}
 
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
 
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    cmds=$archive_expsym_cmds
-	  else
-	    cmds=$archive_cmds
-	    fi
-	  fi
+  return p;
+}
 
-	  # Append the command to remove the reloadable object files
-	  # to the just-reset $cmds.
-	  eval cmds=\"\$cmds~\$rm $delfiles\"
-	fi
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $show "$cmd"
-	  $run eval "$cmd" || {
-	    lt_exit=$?
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
 
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
-	    fi
+const char *
+base_name (const char *name)
+{
+  const char *base;
 
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
 
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
 
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      $show "${rm}r $gentop"
-	      $run ${rm}r "$gentop"
-	    fi
-	  fi
+int
+check_executable (const char *path)
+{
+  struct stat st;
 
-	  exit $EXIT_SUCCESS
-	fi
+  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
 
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
-	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
-	  fi
-	done
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
 
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
 
-    obj)
-      if test -n "$deplibs"; then
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
-      fi
+  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
 
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
-      fi
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
 
-      if test -n "$rpath"; then
-	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
-      fi
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
 
-      if test -n "$xrpath"; then
-	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
-      fi
+  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
+			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
 
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
-      fi
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
 
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
-      fi
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
 
-      case $output in
-      *.lo)
-	if test -n "$objs$old_deplibs"; then
-	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	libobj="$output"
-	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal ("getcwd failed");
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
 
-      # Delete the old objects.
-      $run $rm $obj $libobj
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
 
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec
-      wl=
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+			      tmp_pathspec));
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
 
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  char *errstr = strerror (errno);
+	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+	}
+    }
+  XFREE (tmp_pathspec);
 
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
 
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal ("Could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
 
-      output="$obj"
-      cmds=$reload_cmds
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-	IFS="$save_ifs"
-	eval cmd=\"$cmd\"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
 
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  $show "${rm}r $gentop"
-	  $run ${rm}r $gentop
-	fi
+  assert (str != NULL);
+  assert (pat != NULL);
 
-	exit $EXIT_SUCCESS
-      fi
+  len = strlen (str);
+  patlen = strlen (pat);
 
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  $show "${rm}r $gentop"
-	  $run ${rm}r $gentop
-	fi
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
 
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $run eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
+static void
+lt_error_core (int exit_status, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	cmds=$reload_cmds
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $show "$cmd"
-	  $run eval "$cmd" || exit $?
-	done
-	IFS="$save_ifs"
-      fi
+  if (exit_status >= 0)
+    exit (exit_status);
+}
 
-      if test -n "$gentop"; then
-	$show "${rm}r $gentop"
-	$run ${rm}r $gentop
-      fi
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
 
-      exit $EXIT_SUCCESS
-      ;;
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
 
-    prog)
-      case $host in
-	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
-      esac
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
-      fi
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
 
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
-      fi
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+  const char *p;
+  int len;
+  if (!arg || !*arg)
+    return 1;
 
-      if test "$preload" = yes; then
-	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
-	   test "$dlopen_self_static" = unknown; then
-	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
-	fi
-      fi
+  p = strchr (arg, (int)'=');
 
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	;;
-      esac
+  if (!p)
+    return 1;
 
-      case $host in
-      *darwin*)
-        # Don't allow lazy linking, it breaks C++ global constructors
-        if test "$tagname" = CXX ; then
-        compile_command="$compile_command ${wl}-bind_at_load"
-        finalize_command="$finalize_command ${wl}-bind_at_load"
-        fi
-        ;;
-      esac
+  *value = xstrdup (++p);
 
+  len = strlen (arg) - strlen (*value);
+  *name = XMALLOC (char, len);
+  strncpy (*name, arg, len-1);
+  (*name)[len - 1] = '\0';
 
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
+  return 0;
+}
 
+void
+lt_opt_process_env_set (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
 
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+    }
 
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
+  lt_setenv (name, value);
+  XFREE (name);
+  XFREE (value);
+}
 
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
 
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+    }
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
+  new_value = lt_extend_str (getenv (name), value, 0);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
 
-      dlsyms=
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	  dlsyms="${outputname}S.c"
-	else
-	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
-	fi
-      fi
+void
+lt_opt_process_env_append (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
 
-      if test -n "$dlsyms"; then
-	case $dlsyms in
-	"") ;;
-	*.c)
-	  # Discover the nlist of each of the dlfiles.
-	  nlist="$output_objdir/${outputname}.nm"
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+    }
 
-	  $show "$rm $nlist ${nlist}S ${nlist}T"
-	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+  new_value = lt_extend_str (getenv (name), value, 1);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
 
-	  # Parse the name list into a source file.
-	  $show "creating $output_objdir/$dlsyms"
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
 
-	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
-/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
-/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
 
-#ifdef __cplusplus
-extern \"C\" {
-#endif
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
 
-/* Prevent the only kind of declaration conflicts we can make. */
-#define lt_preloaded_symbols some_other_symbol
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
 
-/* External symbol declarations for the compiler. */\
-"
 
-	  if test "$dlself" = yes; then
-	    $show "generating symbol list for \`$output'"
+EOF
+}
+# end: func_emit_cwrapperexe_src
 
-	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
 
-	    # Add our own program objects to the symbol list.
-	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	    for arg in $progfiles; do
-	      $show "extracting global C symbols from \`$arg'"
-	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-	    done
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
 
-	    if test -n "$exclude_expsyms"; then
-	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      $run eval '$mv "$nlist"T "$nlist"'
-	    fi
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
 
-	    if test -n "$export_symbols_regex"; then
-	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      $run eval '$mv "$nlist"T "$nlist"'
-	    fi
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
 
-	    # Prepare the list of exported symbols
-	    if test -z "$export_symbols"; then
-	      export_symbols="$output_objdir/$outputname.exp"
-	      $run $rm $export_symbols
-	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-              case $host in
-              *cygwin* | *mingw* )
-	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-                ;;
-              esac
-	    else
-	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      $run eval 'mv "$nlist"T "$nlist"'
-              case $host in
-              *cygwin* | *mingw* )
-	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-                ;;
-              esac
-	    fi
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
 	  fi
-
-	  for arg in $dlprefiles; do
-	    $show "extracting global C symbols from \`$arg'"
-	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
-	    $run eval '$echo ": $name " >> "$nlist"'
-	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -z "$run"; then
-	    # Make sure we have at least an empty file.
-	    test -f "$nlist" || : > "$nlist"
-
-	    if test -n "$exclude_expsyms"; then
-	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	      $mv "$nlist"T "$nlist"
-	    fi
-
-	    # Try sorting and uniquifying the output.
-	    if grep -v "^: " < "$nlist" |
-		if sort -k 3 </dev/null >/dev/null 2>&1; then
-		  sort -k 3
-		else
-		  sort +2
-		fi |
-		uniq > "$nlist"S; then
-	      :
-	    else
-	      grep -v "^: " < "$nlist" > "$nlist"S
-	    fi
-
-	    if test -f "$nlist"S; then
-	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
-	    else
-	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
-	    fi
-
-	    $echo >> "$output_objdir/$dlsyms" "\
-
-#undef lt_preloaded_symbols
-
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-"
-
-	    case $host in
-	    *cygwin* | *mingw* )
-	  $echo >> "$output_objdir/$dlsyms" "\
-/* DATA imports from DLLs on WIN32 can't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs */
-struct {
-"
-	      ;;
-	    * )
-	  $echo >> "$output_objdir/$dlsyms" "\
-const struct {
-"
-	      ;;
-	    esac
-
-
-	  $echo >> "$output_objdir/$dlsyms" "\
-  const char *name;
-  lt_ptr address;
-}
-lt_preloaded_symbols[] =
-{\
-"
-
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
-
-	    $echo >> "$output_objdir/$dlsyms" "\
-  {0, (lt_ptr) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
 	  fi
-
-	  pic_flag_for_symtable=
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    case "$compile_command " in
-	    *" -static "*) ;;
-	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
-	    esac;;
-	  *-*-hpux*)
-	    case "$compile_command " in
-	    *" -static "*) ;;
-	    *) pic_flag_for_symtable=" $pic_flag";;
-	    esac
-	  esac
-
-	  # Now compile the dynamic symbol file.
-	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
-	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
-
-	  # Clean up the generated files.
-	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
-	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
-
-	  # Transform the symbol file into the correct name.
-          case $host in
-          *cygwin* | *mingw* )
-            if test -f "$output_objdir/${outputname}.def" ; then
-              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
-              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
-            else
-              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-             fi
-            ;;
-          * )
-            compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-            finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-            ;;
-          esac
+	  prefer_static_libs=yes
 	  ;;
-	*)
-	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
-	  exit $EXIT_FAILURE
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
 	  ;;
 	esac
-      else
-	# We keep going just in case the user didn't refer to
-	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-	# really was required.
-
-	# Nullify the symbol file.
-	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-      fi
-
-      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-	# Replace the output file specification.
-	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
 
-	# We have no uninstalled library dependencies, so finalize right now.
-	$show "$link_command"
-	$run eval "$link_command"
-	exit_status=$?
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
 
-	# Delete the generated files.
-	if test -n "$dlsyms"; then
-	  $show "$rm $output_objdir/${outputname}S.${objext}"
-	  $run $rm "$output_objdir/${outputname}S.${objext}"
-	fi
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
 
-	exit $exit_status
-      fi
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
 
-      if test -n "$shlibpath_var"; then
-	# We should set the shlibpath_var
-	rpath=
-	for dir in $temp_rpath; do
-	  case $dir in
-	  [\\/]* | [A-Za-z]:[\\/]*)
-	    # Absolute path.
-	    rpath="$rpath$dir:"
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
 	    ;;
 	  *)
-	    # Relative path: add a thisdir entry.
-	    rpath="$rpath\$thisdir/$dir:"
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
 	    ;;
 	  esac
-	done
-	temp_rpath="$rpath"
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
 
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
 
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$run $rm $output
-	# Link the executable and exit
-	$show "$link_command"
-	$run eval "$link_command" || exit $?
-	exit $EXIT_SUCCESS
-      fi
+		# Read the .lo file
+		func_source "$arg"
 
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
 
-	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
-	$echo "$modename: \`$output' will be relinked during installation" 1>&2
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
 
-      # Replace the output file specification.
-      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
 
-      # Delete the old output files.
-      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
 
-      $show "$link_command"
-      $run eval "$link_command" || exit $?
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
 
-      # Now create the wrapper script.
-      $show "creating $output"
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
 
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
-	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
 
-      # Quote $echo for shipping.
-      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
-	case $progpath in
-	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-	esac
-	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if our run command is non-null.
-      if test -z "$run"; then
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
-	  *) exeext= ;;
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs="$weak_libs $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
 	esac
-	case $host in
-	  *cygwin* | *mingw* )
-            output_name=`basename $output`
-            output_path=`dirname $output`
-            cwrappersource="$output_path/$objdir/lt-$output_name.c"
-            cwrapper="$output_path/$output_name.exe"
-            $rm $cwrappersource $cwrapper
-            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    cat > $cwrappersource <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "/bin/sh $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat >> $cwrappersource<<"EOF"
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
+      fi # test -n "$prev"
 
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
+      prevarg="$arg"
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
 
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
 
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
 
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
 
-/* -DDEBUG is fairly common in CFLAGS.  */
-#undef DEBUG
-#if defined DEBUGWRAPPER
-# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
-#else
-# define DEBUG(format, ...)
-#endif
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
 
-const char *program_name = NULL;
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
 
-void * xmalloc (size_t num);
-char * xstrdup (const char *string);
-const char * base_name (const char *name);
-char * find_executable(const char *wrapper);
-int    check_executable(const char *path);
-char * strendzap(char *str, const char *pat);
-void lt_fatal (const char *message, ...);
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
 
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int i;
+      -framework)
+	prev=framework
+	continue
+	;;
 
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  DEBUG("(main) argv[0]      : %s\n",argv[0]);
-  DEBUG("(main) program_name : %s\n",program_name);
-  newargz = XMALLOC(char *, argc+2);
-EOF
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
 
-            cat >> $cwrappersource <<EOF
-  newargz[0] = (char *) xstrdup("$SHELL");
-EOF
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
 
-            cat >> $cwrappersource <<"EOF"
-  newargz[1] = find_executable(argv[0]);
-  if (newargz[1] == NULL)
-    lt_fatal("Couldn't find %s", argv[0]);
-  DEBUG("(main) found exe at : %s\n",newargz[1]);
-  /* we know the script has the same name, without the .exe */
-  /* so make sure newargz[1] doesn't end in .exe */
-  strendzap(newargz[1],".exe");
-  for (i = 1; i < argc; i++)
-    newargz[i+1] = xstrdup(argv[i]);
-  newargz[argc+1] = NULL;
+      -L*)
+	func_stripname '-L' '' "$arg"
+	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
 
-  for (i=0; i<argc+1; i++)
-  {
-    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
-    ;
-  }
-
-EOF
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
 
-            case $host_os in
-              mingw*)
-                cat >> $cwrappersource <<EOF
-  execv("$SHELL",(char const **)newargz);
-EOF
-              ;;
-              *)
-                cat >> $cwrappersource <<EOF
-  execv("$SHELL",newargz);
-EOF
-              ;;
-            esac
+      -module)
+	module=yes
+	continue
+	;;
 
-            cat >> $cwrappersource <<"EOF"
-  return 127;
-}
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
 
-void *
-xmalloc (size_t num)
-{
-  void * p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+	esac
+	continue
+	;;
 
-  return p;
-}
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
 
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
-;
-}
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
 
-const char *
-base_name (const char *name)
-{
-  const char *base;
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
-    name += 2;
-#endif
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
 
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
 
-int
-check_executable(const char * path)
-{
-  struct stat st;
+      -o) prev=output ;;
 
-  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
-  if ((!path) || (!*path))
-    return 0;
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
 
-  if ((stat (path, &st) >= 0) &&
-      (
-        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
-#if defined (S_IXOTH)
-       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
-#endif
-#if defined (S_IXGRP)
-       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
-#endif
-       ((st.st_mode & S_IXUSR) == S_IXUSR))
-      )
-    return 1;
-  else
-    return 0;
-}
+      -release)
+	prev=release
+	continue
+	;;
 
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise */
-char *
-find_executable (const char* wrapper)
-{
-  int has_slash = 0;
-  const char* p;
-  const char* p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char* concat_name;
+      -rpath)
+	prev=rpath
+	continue
+	;;
 
-  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+      -R)
+	prev=xrpath
+	continue
+	;;
 
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
 
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
-  {
-    concat_name = xstrdup (wrapper);
-    if (check_executable(concat_name))
-      return concat_name;
-    XFREE(concat_name);
-  }
-  else
-  {
-#endif
-    if (IS_DIR_SEPARATOR (wrapper[0]))
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable(concat_name))
-        return concat_name;
-      XFREE(concat_name);
-    }
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  }
-#endif
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
 
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-    {
-      has_slash = 1;
-      break;
-    }
-  if (!has_slash)
-  {
-    /* no slashes; search PATH */
-    const char* path = getenv ("PATH");
-    if (path != NULL)
-    {
-      for (p = path; *p; p = p_next)
-      {
-        const char* q;
-        size_t p_len;
-        for (q = p; *q; q++)
-          if (IS_PATH_SEPARATOR(*q))
-            break;
-        p_len = q - p;
-        p_next = (*q == '\0' ? q : q + 1);
-        if (p_len == 0)
-        {
-          /* empty path: current directory */
-          if (getcwd (tmp, LT_PATHMAX) == NULL)
-            lt_fatal ("getcwd failed");
-          tmp_len = strlen(tmp);
-          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
-          memcpy (concat_name, tmp, tmp_len);
-          concat_name[tmp_len] = '/';
-          strcpy (concat_name + tmp_len + 1, wrapper);
-        }
-        else
-        {
-          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
-          memcpy (concat_name, p, p_len);
-          concat_name[p_len] = '/';
-          strcpy (concat_name + p_len + 1, wrapper);
-        }
-        if (check_executable(concat_name))
-          return concat_name;
-        XFREE(concat_name);
-      }
-    }
-    /* not found in PATH; assume curdir */
-  }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen(tmp);
-  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
+      -shrext)
+	prev=shrext
+	continue
+	;;
 
-  if (check_executable(concat_name))
-    return concat_name;
-  XFREE(concat_name);
-  return NULL;
-}
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
 
-char *
-strendzap(char *str, const char *pat)
-{
-  size_t len, patlen;
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
 
-  assert(str != NULL);
-  assert(pat != NULL);
+      -version-info)
+	prev=vinfo
+	continue
+	;;
 
-  len = strlen(str);
-  patlen = strlen(pat);
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
 
-  if (patlen <= len)
-  {
-    str += len - patlen;
-    if (strcmp(str, pat) == 0)
-      *str = '\0';
-  }
-  return str;
-}
+      -weak)
+        prev=weak
+	continue
+	;;
 
-static void
-lt_error_core (int exit_status, const char * mode,
-          const char * message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
 
-  if (exit_status >= 0)
-    exit (exit_status);
-}
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+	  linker_flags="$linker_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
 
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-EOF
-          # we should really use a build-platform specific compiler
-          # here, but OTOH, the wrappers (shell script and this C one)
-          # are only useful if you want to execute the "real" binary.
-          # Since the "real" binary is built for $host, then this
-          # wrapper might as well be built for $host, too.
-          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
-          ;;
-        esac
-        $rm $output
-        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
 
-	$echo > $output "\
-#! $SHELL
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
 
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
 
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
 
-relink_command=\"$relink_command\"
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
 
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variable:
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$echo are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    echo=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$echo works!
-      :
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
     else
-      # Restart under the correct shell, and then maybe \$echo will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+      shlib_search_path=
     fi
-  fi\
-"
-	$echo >> $output "\
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
-  # Find the directory that this script lives in.
-  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
 
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_duplicate_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  case $lib in
+	  *.la)	func_source "$lib" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs="$deplibs $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    dir=$func_stripname_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		$ECHO
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
+		$ECHO "*** that it is just a static archive that I should not use here."
+	      else
+		$ECHO
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	    # Keep a list of preopened convenience libraries to check
+	    # that they are being used correctly in the link pass.
+	    test -z "$libdir" && \
+		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         newlib_search_path="$newlib_search_path $func_stripname_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath="$temp_rpath$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    $ECHO
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  $ECHO
+			  $ECHO "*** And there doesn't seem to be a static archive available"
+			  $ECHO "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $ECHO
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** I have the capability to make that library automatically link in when"
+	    $ECHO "*** you link to this library.  But I can only do this if you have a"
+	    $ECHO "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $ECHO "*** But as you try to build a module library, libtool will still create "
+	      $ECHO "*** a static module, that should work as long as the dlopening application"
+	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$ECHO
+		$ECHO "*** However, this would only work if libtool was able to extract symbol"
+		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$ECHO "*** not find such a program.  So, this module is probably useless."
+		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_dirname "$deplib" "" "."
+		dir="$func_dirname_result"
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  $ECHO
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs="$libobjs $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
+      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $ECHO
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    $ECHO "*** I have the capability to make that library automatically link in when"
+		    $ECHO "*** you link to this library.  But I can only do this if you have a"
+		    $ECHO "*** shared version of the library, which I believe you do not have"
+		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
+		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $ECHO
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      $ECHO "*** I have the capability to make that library automatically link in when"
+		      $ECHO "*** you link to this library.  But I can only do this if you have a"
+		      $ECHO "*** shared version of the library, which you do not appear to have"
+		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
+		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $ECHO
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $ECHO "*** make it link in!  You will probably need to install it or some"
+		  $ECHO "*** library that it depends on before this library will be fully"
+		  $ECHO "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
+	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+	    done
+	  fi
+	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
+	     $GREP . >/dev/null; then
+	    $ECHO
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $ECHO "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $ECHO
+	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $ECHO "*** a static module, that should work as long as the dlopening"
+	    $ECHO "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $ECHO
+	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
+	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $ECHO "*** not find such a program.  So, this module is probably useless."
+	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
+	    $ECHO "*** automatically added whenever a program is linked with this library"
+	    $ECHO "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $ECHO
+	      $ECHO "*** Since this library must not contain undefined symbols,"
+	      $ECHO "*** because either the platform does not support them or"
+	      $ECHO "*** it was explicitly requested with -no-undefined,"
+	      $ECHO "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
 
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
 
-    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
-  done
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
 
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
 
-	if test "$fast_install" = yes; then
-	  $echo >> $output "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
 
-  if test ! -f \"\$progdir/\$program\" || \\
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
 
-    file=\"\$\$-\$program\"
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles="$delfiles $export_symbols"
+	fi
 
-    if test ! -d \"\$progdir\"; then
-      $mkdir \"\$progdir\"
-    else
-      $rm \"\$progdir/\$file\"
-    fi"
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
 
-	  $echo >> $output "\
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      func_len " $cmd"
+	      len=$func_len_result
+	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
 
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$echo \"\$relink_command_output\" >&2
-	$rm \"\$progdir/\$file\"
-	exit $EXIT_FAILURE
-      fi
-    fi
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	fi
 
-    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $rm \"\$progdir/\$program\";
-      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $rm \"\$progdir/\$file\"
-  fi"
-	else
-	  $echo >> $output "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	fi
 
-	$echo >> $output "\
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs="$tmp_deplibs $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
 
-  if test -f \"\$progdir/\$program\"; then"
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
 
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $echo >> $output "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
 
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
 
-    export $shlibpath_var
-"
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $echo >> $output "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
 	fi
 
-	$echo >> $output "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2*)
-	  $echo >> $output "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
 
-	*)
-	  $echo >> $output "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$echo >> $output "\
-      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
-      exit $EXIT_FAILURE
-    fi
-  else
-    # The program doesn't exist.
-    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$echo \"This script is just a wrapper for \$program.\" 1>&2
-    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit $EXIT_FAILURE
-  fi
-fi\
-"
-	chmod +x $output
-      fi
-      exit $EXIT_SUCCESS
-      ;;
-    esac
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
 
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
 
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	fi
-	addlibs="$old_convenience"
-      fi
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    $ECHO 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    $ECHO ')' >> $output
+	    delfiles="$delfiles $output"
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    delfiles="$delfiles $output"
+	    output=$firstobj\"$file_list_spec$output\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=$obj
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      delfiles="$delfiles $output"
 
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
+	    else
+	      output=
+	    fi
 
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
 
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-       cmds=$old_archive_from_new_cmds
-      else
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  $echo "copying selected object files to avoid basename conflicts..."
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
 
-	  if test -z "$gentop"; then
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
 
-	    $show "${rm}r $gentop"
-	    $run ${rm}r "$gentop"
-	    $show "$mkdir $gentop"
-	    $run $mkdir "$gentop"
-	    exit_status=$?
-	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
-	      exit $exit_status
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
 	  fi
 
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		counter=`expr $counter + 1`
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      $run ln "$obj" "$gentop/$newobj" ||
-	      $run cp "$obj" "$gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	    fi
 
-	eval cmds=\"$old_archive_cmds\"
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
 
-	if len=`expr "X$cmds" : ".*"` &&
-	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  $echo "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
 
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  for obj in $save_oldobjs
-	  do
-	    oldobjs="$objlist $obj"
-	    objlist="$objlist $obj"
-	    eval test_cmds=\"$old_archive_cmds\"
-	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-	       test "$len" -le "$max_cmd_len"; then
-	      :
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
 	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-	        RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
+	      cmds=$module_cmds
 	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
 	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
 	  fi
 	fi
-      fi
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-        eval cmd=\"$cmd\"
-	IFS="$save_ifs"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
 
-    if test -n "$generated"; then
-      $show "${rm}r$generated"
-      $run ${rm}r$generated
-    fi
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
 
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      $show "creating $output"
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
 
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
-	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs="$libobjs $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
 	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
 
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
 
-      # Only create the output if not a dry run.
-      if test -z "$run"; then
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
 	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		if test -z "$libdir"; then
-		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
-		  exit $EXIT_FAILURE
-		fi
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-	      if test -z "$libdir"; then
-		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-		exit $EXIT_FAILURE
-	      fi
-	      newdlfiles="$newdlfiles $libdir/$name"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-	      if test -z "$libdir"; then
-		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-		exit $EXIT_FAILURE
-	      fi
-	      newdlprefiles="$newdlprefiles $libdir/$name"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
 	  fi
-	  $rm $output
-	  # place dlname in correct position for cygwin
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
-	  esac
-	  $echo > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
 
-# The name that we can dlopen(3).
-dlname='$tdlname'
+	  exit $EXIT_SUCCESS
+	fi
 
-# Names of this library.
-library_names='$library_names'
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
 
-# The name of the static archive.
-old_library='$old_library'
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
 
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
 
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
 
-# Is this an already installed library?
-installed=$installed
+	exit $EXIT_SUCCESS
+      fi
 
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
 
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
 
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $echo >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
-      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-    ;;
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
 
-  # libtool install mode
-  install)
-    modename="$modename: install"
+      exit $EXIT_SUCCESS
+      ;;
 
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       $echo "X$nonopt" | grep shtool > /dev/null; then
-      # Aesthetically quote it.
-      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	arg="\"$arg\""
-	;;
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
       esac
-      install_prog="$arg "
-      arg="$1"
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
 
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-    case $arg in
-    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-      arg="\"$arg\""
-      ;;
-    esac
-    install_prog="$install_prog$arg"
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
 
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
-      case $arg in
-      -d) isdir=yes ;;
-      -f) 
-      	case " $install_prog " in
-	*[\\\ /]cp\ *) ;;
-	*) prev=$arg ;;
-	esac
-	;;
-      -g | -m | -o) prev=$arg ;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
 	;;
       esac
 
-      # Aesthetically quote the argument.
-      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	arg="\"$arg\""
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command="$compile_command ${wl}-bind_at_load"
+	      finalize_command="$finalize_command ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
 	;;
       esac
-      install_prog="$install_prog $arg"
-    done
-
-    if test -z "$install_prog"; then
-      $echo "$modename: you must specify an install program" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prev' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	$echo "$modename: no file or destination specified" 1>&2
-      else
-	$echo "$modename: you must specify a destination" 1>&2
-      fi
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    # Strip any trailing slash from the destination.
-    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
 
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
-      test "X$destdir" = "X$dest" && destdir=.
-      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
 
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files
-      if test "$#" -gt 2; then
-	$echo "$modename: \`$dest' is not a directory" 1>&2
-	$echo "$help" 1>&2
-	exit $EXIT_FAILURE
-      fi
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
 	*)
-	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
 	  ;;
 	esac
       done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
 
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
 
-      *.la)
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
 
-	library_names=
-	old_library=
-	relink_command=
-	# If there is no directory component, then add one.
-	case $file in
-	*/* | *\\*) . $file ;;
-	*) . ./$file ;;
-	esac
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
 
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
 	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
 	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
 	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
 	  esac
 	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
 
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
-	test "X$dir" = "X$file/" && dir=
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  if test "$inst_prefix_dir" = "$destdir"; then
-	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
 
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
 
-	  $echo "$modename: warning: relinking \`$file'" 1>&2
-	  $show "$relink_command"
-	  if $run eval "$relink_command"; then :
-	  else
-	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	fi
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
 
-	# See the names of the shared library.
-	set dummy $library_names
-	if test -n "$2"; then
-	  realname="$2"
-	  shift
-	  shift
+      wrappers_required=yes
+      case $host in
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *cegcc)
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
 
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
 
-	  # Install the shared library and build the symlinks.
-	  $show "$install_prog $dir/$srcname $destdir/$realname"
-	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
-	  if test -n "$stripme" && test -n "$striplib"; then
-	    $show "$striplib $destdir/$realname"
-	    $run eval "$striplib $destdir/$realname" || exit $?
-	  fi
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
 
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      if test "$linkname" != "$realname"; then
-                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
-                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
-	      fi
-	    done
-	  fi
+	exit $exit_status
+      fi
 
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  cmds=$postinstall_cmds
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $cmds; do
-	    IFS="$save_ifs"
-	    eval cmd=\"$cmd\"
-	    $show "$cmd"
-	    $run eval "$cmd" || {
-	      lt_exit=$?
-
-	      # Restore the uninstalled library and exit
-	      if test "$mode" = relink; then
-		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
-	      fi
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
 
-	      exit $lt_exit
-	    }
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
 	  done
-	  IFS="$save_ifs"
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
 	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
 
-	# Install the pseudo-library for information purposes.
-	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	instname="$dir/$name"i
-	$show "$install_prog $instname $destdir/$name"
-	$run eval "$install_prog $instname $destdir/$name" || exit $?
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+	exit $EXIT_SUCCESS
+      fi
 
-      *.lo)
-	# Install (i.e. copy) a libtool object.
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
 
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
 	else
-	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	  destfile="$destdir/$destfile"
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
 	fi
+      fi
 
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
+      # Replace the output file specification.
+      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
 
-	# Install the libtool object if requested.
-	if test -n "$destfile"; then
-	  $show "$install_prog $file $destfile"
-	  $run eval "$install_prog $file $destfile" || exit $?
-	fi
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
 
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+      func_show_eval "$link_command" 'exit $?'
 
-	  $show "$install_prog $staticobj $staticdest"
-	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
-	fi
-	exit $EXIT_SUCCESS
-	;;
+      # Now create the wrapper script.
+      func_verbose "creating $output"
 
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	  destfile="$destdir/$destfile"
-	fi
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
 
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      file=`$echo $file|${SED} 's,.exe$,,'`
-	      stripped_ext=".exe"
-	    fi
-	    ;;
+      # Quote $ECHO for shipping.
+      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
 	esac
+	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+      fi
 
-	# Do a test to see if this is really a libtool program.
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
 	case $host in
-	*cygwin*|*mingw*)
-	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
 	esac
-	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  # Note that it is not necessary on cygwin/mingw to append a dot to
-	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
-	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-	  # `FILE.' does not work on cygwin managed mounts.
-	  #
-	  # If there is no directory component, then add one.
-	  case $wrapper in
-	  */* | *\\*) . ${wrapper} ;;
-	  *) . ./${wrapper} ;;
-	  esac
-
-	  # Check the variables that should have been set.
-	  if test -z "$notinst_deplibs"; then
-	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      # If there is no directory component, then add one.
-	      case $lib in
-	      */* | *\\*) . $lib ;;
-	      *) . ./$lib ;;
-	      esac
-	    fi
-	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  # Note that it is not necessary on cygwin/mingw to append a dot to
-	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
-	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-	  # `FILE.' does not work on cygwin managed mounts.
-	  #
-	  # If there is no directory component, then add one.
-	  case $wrapper in
-	  */* | *\\*) . ${wrapper} ;;
-	  *) . ./${wrapper} ;;
-	  esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
 
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    if test "$finalize" = yes && test -z "$run"; then
-	      tmpdir=`func_mktempdir`
-	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
-	      outputname="$tmpdir/$file"
-	      # Replace the output file specification.
-	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
-	      $show "$relink_command"
-	      if $run eval "$relink_command"; then :
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
-		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-		${rm}r "$tmpdir"
-		continue
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
 	      fi
-	      file="$outputname"
-	    else
-	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
-	    fi
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
 
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway 
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
-	    ;;
-	  esac
+	    func_emit_wrapper no > $output
+	    chmod +x $output
 	  ;;
 	esac
-	$show "$install_prog$stripme $file $destfile"
-	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
-	test -n "$outputname" && ${rm}r "$tmpdir"
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
 
-      $show "$install_prog $file $oldlib"
-      $run eval "$install_prog \$file \$oldlib" || exit $?
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
 
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	$show "$old_striplib $oldlib"
-	$run eval "$old_striplib $oldlib" || exit $?
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs="$oldobjs $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
       fi
 
-      # Do each command in the postinstall commands.
-      cmds=$old_postinstall_cmds
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-	IFS="$save_ifs"
-	eval cmd=\"$cmd\"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
 
-    if test -n "$future_libdirs"; then
-      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
-    fi
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
 
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      test -n "$run" && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-    ;;
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
 
-  # libtool finish mode
-  finish)
-    modename="$modename: finish"
-    libdirs="$nonopt"
-    admincmds=
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
 
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs="$oldobjs $func_extract_archives_result"
+	fi
 
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  cmds=$finish_cmds
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $cmds; do
-	    IFS="$save_ifs"
-	    eval cmd=\"$cmd\"
-	    $show "$cmd"
-	    $run eval "$cmd" || admincmds="$admincmds
-       $cmd"
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $ECHO "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
 	  done
-	  IFS="$save_ifs"
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $run eval "$cmds" || admincmds="$admincmds
-       $cmds"
 	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    test "$show" = : && exit $EXIT_SUCCESS
+	eval cmds=\"$old_archive_cmds\"
 
-    $echo "X----------------------------------------------------------------------" | $Xsed
-    $echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $echo "   $libdir"
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
     done
-    $echo
-    $echo "If you ever happen to want to link against installed libraries"
-    $echo "in a given directory, LIBDIR, you must either use libtool, and"
-    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $echo "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $echo "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $echo
-    $echo "See any operating system documentation about shared libraries for"
-    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
-    $echo "X----------------------------------------------------------------------" | $Xsed
-    exit $EXIT_SUCCESS
-    ;;
 
-  # libtool execute mode
-  execute)
-    modename="$modename: execute"
-
-    # The first argument is the command name.
-    cmd="$nonopt"
-    if test -z "$cmd"; then
-      $echo "$modename: you must specify a COMMAND" 1>&2
-      $echo "$help"
-      exit $EXIT_FAILURE
-    fi
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
 
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      if test ! -f "$file"; then
-	$echo "$modename: \`$file' is not a file" 1>&2
-	$echo "$help" 1>&2
-	exit $EXIT_FAILURE
-      fi
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
 
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
 	else
-	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
 	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
 
-	# Read the libtool library.
-	dlname=
-	library_names=
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles="$newdlfiles $libdir/$name"
+		;;
+	      *) newdlfiles="$newdlfiles $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles="$newdlprefiles $libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
 
-	# If there is no directory component, then add one.
-	case $file in
-	*/* | *\\*) . $file ;;
-	*) . ./$file ;;
-	esac
+# The name that we can dlopen(3).
+dlname='$tdlname'
 
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
+# Names of this library.
+library_names='$library_names'
 
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$dir" = "X$file" && dir=.
+# The name of the static archive.
+old_library='$old_library'
 
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	;;
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
 
-      *.lo)
-	# Just add the directory containing the .lo file.
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$dir" = "X$file" && dir=.
-	;;
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
 
-      *)
-	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
-	continue
-	;;
-      esac
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
 
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
 
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
+# Is this an already installed library?
+installed=$installed
 
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
 
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -*) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  # If there is no directory component, then add one.
-	  case $file in
-	  */* | *\\*) . $file ;;
-	  *) . ./$file ;;
-	  esac
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
 
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
-      args="$args \"$file\""
-    done
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
 
-    if test -z "$run"; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
 
-      # Restore saved environment variables
-      if test "${save_LC_ALL+set}" = set; then
-	LC_ALL="$save_LC_ALL"; export LC_ALL
-      fi
-      if test "${save_LANG+set}" = set; then
-	LANG="$save_LANG"; export LANG
-      fi
+{ test "$mode" = link || test "$mode" = relink; } &&
+    func_mode_link ${1+"$@"}
 
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
-	$echo "export $shlibpath_var"
-      fi
-      $echo "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-    ;;
 
-  # libtool clean and uninstall mode
-  clean | uninstall)
-    modename="$modename: $mode"
-    rm="$nonopt"
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
     files=
     rmforce=
     exit_status=0
@@ -6448,30 +8202,28 @@ relink_command=\"$relink_command\""
     for arg
     do
       case $arg in
-      -f) rm="$rm $arg"; rmforce=yes ;;
-      -*) rm="$rm $arg" ;;
+      -f) RM="$RM $arg"; rmforce=yes ;;
+      -*) RM="$RM $arg" ;;
       *) files="$files $arg" ;;
       esac
     done
 
-    if test -z "$rm"; then
-      $echo "$modename: you must specify an RM program" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
 
     rmdirs=
 
     origobjdir="$objdir"
     for file in $files; do
-      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$dir" = "X$file"; then
-	dir=.
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
 	objdir="$origobjdir"
       else
 	objdir="$dir/$origobjdir"
       fi
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      func_basename "$file"
+      name="$func_basename_result"
       test "$mode" = uninstall && objdir="$dir"
 
       # Remember objdir for removal later, being careful to avoid duplicates
@@ -6483,9 +8235,9 @@ relink_command=\"$relink_command\""
       fi
 
       # Don't error if the file doesn't exist and rm -f was used.
-      if (test -L "$file") >/dev/null 2>&1 \
-	|| (test -h "$file") >/dev/null 2>&1 \
-	|| test -f "$file"; then
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
 	:
       elif test -d "$file"; then
 	exit_status=1
@@ -6499,8 +8251,8 @@ relink_command=\"$relink_command\""
       case $name in
       *.la)
 	# Possibly a libtool archive, so verify it.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  . $dir/$name
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
 
 	  # Delete the libtool libraries and symlinks.
 	  for n in $library_names; do
@@ -6515,39 +8267,17 @@ relink_command=\"$relink_command\""
 	    *" $dlname "*) ;;
 	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
 	    esac
-	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
 	    ;;
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
-	      cmds=$postuninstall_cmds
-	      save_ifs="$IFS"; IFS='~'
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd"
-		if test "$?" -ne 0 && test "$rmforce" != yes; then
-		  exit_status=1
-		fi
-	      done
-	      IFS="$save_ifs"
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
-	      cmds=$old_postuninstall_cmds
-	      save_ifs="$IFS"; IFS='~'
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd"
-		if test "$?" -ne 0 && test "$rmforce" != yes; then
-		  exit_status=1
-		fi
-	      done
-	      IFS="$save_ifs"
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
@@ -6557,20 +8287,20 @@ relink_command=\"$relink_command\""
 
       *.lo)
 	# Possibly a libtool object, so verify it.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	if func_lalib_p "$file"; then
 
 	  # Read the .lo file
-	  . $dir/$name
+	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" \
-	     && test "$pic_object" != none; then
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
 	    rmfiles="$rmfiles $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" \
-	     && test "$non_pic_object" != none; then
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
 	    rmfiles="$rmfiles $dir/$non_pic_object"
 	  fi
 	fi
@@ -6581,17 +8311,26 @@ relink_command=\"$relink_command\""
 	  noexename=$name
 	  case $file in
 	  *.exe)
-	    file=`$echo $file|${SED} 's,.exe$,,'`
-	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
 	    # $file with .exe has already been added to rmfiles,
 	    # add $file without .exe
 	    rmfiles="$rmfiles $file"
 	    ;;
 	  esac
 	  # Do a test to see if this is a libtool program.
-	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	    relink_command=
-	    . $dir/$noexename
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
@@ -6606,237 +8345,38 @@ relink_command=\"$relink_command\""
 	fi
 	;;
       esac
-      $show "$rm $rmfiles"
-      $run $rm $rmfiles || exit_status=1
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
     objdir="$origobjdir"
 
     # Try to remove the ${objdir}s in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
-	$show "rmdir $dir"
-	$run rmdir $dir >/dev/null 2>&1
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
       fi
     done
 
     exit $exit_status
-    ;;
+}
 
-  "")
-    $echo "$modename: you must specify a MODE" 1>&2
-    $echo "$generic_help" 1>&2
-    exit $EXIT_FAILURE
-    ;;
-  esac
+{ test "$mode" = uninstall || test "$mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
 
-  if test -z "$exec_cmd"; then
-    $echo "$modename: invalid operation mode \`$mode'" 1>&2
-    $echo "$generic_help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-fi # test -z "$show_help"
+test -z "$mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$mode'"
 
 if test -n "$exec_cmd"; then
-  eval exec $exec_cmd
+  eval exec "$exec_cmd"
   exit $EXIT_FAILURE
 fi
 
-# We need to display help for each of the modes.
-case $mode in
-"") $echo \
-"Usage: $modename [OPTION]... [MODE-ARG]...
-
-Provide generalized library-building support services.
-
-    --config          show all configuration variables
-    --debug           enable verbose shell tracing
--n, --dry-run         display commands without modifying any files
-    --features        display basic configuration information and exit
-    --finish          same as \`--mode=finish'
-    --help            display this help message and exit
-    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
-    --quiet           same as \`--silent'
-    --silent          don't print informational messages
-    --tag=TAG         use configuration variables from tag TAG
-    --version         print version information
-
-MODE must be one of the following:
-
-      clean           remove files from the build directory
-      compile         compile a source file into a libtool object
-      execute         automatically set library path, then run a program
-      finish          complete the installation of libtool libraries
-      install         install libraries or executables
-      link            create a library or an executable
-      uninstall       remove libraries from an installed directory
-
-MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
-a more detailed description of MODE.
-
-Report bugs to <bug-libtool at gnu.org>."
-  exit $EXIT_SUCCESS
-  ;;
-
-clean)
-  $echo \
-"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-compile)
-  $echo \
-"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -static           always build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-  ;;
-
-execute)
-  $echo \
-"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-  ;;
-
-finish)
-  $echo \
-"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-  ;;
-
-install)
-  $echo \
-"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-  ;;
-
-link)
-  $echo \
-"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-		    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-		    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -static           do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-		    specify library version info [each variable defaults to 0]
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-  ;;
-
-uninstall)
-  $echo \
-"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
+exit $exit_status
 
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-*)
-  $echo "$modename: invalid operation mode \`$mode'" 1>&2
-  $echo "$help" 1>&2
-  exit $EXIT_FAILURE
-  ;;
-esac
-
-$echo
-$echo "Try \`$modename --help' for more information about other modes."
-
-exit $?
 
 # The TAGs below are defined such that we never get into a situation
 # in which we disable both kinds of libraries.  Given conflicting
@@ -6850,14 +8390,17 @@ exit $?
 # configuration.  But we'll never go from static-only to shared-only.
 
 # ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-disable_libs=shared
+build_libtool_libs=no
+build_old_libs=yes
 # ### END LIBTOOL TAG CONFIG: disable-shared
 
 # ### BEGIN LIBTOOL TAG CONFIG: disable-static
-disable_libs=static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # ### END LIBTOOL TAG CONFIG: disable-static
 
 # Local Variables:
 # mode:shell-script
 # sh-indentation:2
 # End:
+# vi:sw=2
+
diff --git a/m4/Makefile.am b/m4/Makefile.am
index e2d31c7..2d9d262 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,23 +22,30 @@
 
 # M4 macro files to be used by the client applications with Autoconf.
 m4datadir = $(datadir)/aclocal
-m4data_DATA = ppl.m4
+m4data_DATA = ppl.m4 ppl_c.m4
 
 # M4 macro files for internal use.
 m4macros = \
+ac_check_classpath.m4 \
 ac_check_fpu_control.m4 \
 ac_check_gmp.m4 \
 ac_check_sicstus_prolog.m4 \
 ac_check_swi_prolog.m4 \
 ac_check_xsb_prolog.m4 \
 ac_cxx_attribute_weak.m4 \
+ac_cxx_proper_long_double.m4 \
 ac_cxx_double_binary_format.m4 \
 ac_cxx_flexible_arrays.m4 \
 ac_cxx_float_binary_format.m4 \
 ac_cxx_long_double_binary_format.m4 \
+ac_cxx_remainder_bug.m4 \
+ac_prog_jar.m4 \
+ac_prog_java.m4 \
+ac_prog_javac.m4 \
+ac_prog_javah.m4 \
+ax_prefix_config_h.m4 \
 lib-ld.m4 \
 lib-link.m4 \
 lib-prefix.m4
 
 EXTRA_DIST = $(m4macros) $(m4data_DATA)
-
diff --git a/m4/Makefile.in b/m4/Makefile.in
index d43e7d6..562eb0a 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -61,7 +57,8 @@ host_triplet = @host@
 subdir = m4
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -71,8 +68,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -92,39 +99,18 @@ m4dataDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(m4data_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -134,53 +120,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -189,56 +173,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -250,10 +208,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -262,42 +224,68 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 
 # M4 macro files to be used by the client applications with Autoconf.
 m4datadir = $(datadir)/aclocal
-m4data_DATA = ppl.m4
+m4data_DATA = ppl.m4 ppl_c.m4
 
 # M4 macro files for internal use.
 m4macros = \
+ac_check_classpath.m4 \
 ac_check_fpu_control.m4 \
 ac_check_gmp.m4 \
 ac_check_sicstus_prolog.m4 \
 ac_check_swi_prolog.m4 \
 ac_check_xsb_prolog.m4 \
 ac_cxx_attribute_weak.m4 \
+ac_cxx_proper_long_double.m4 \
 ac_cxx_double_binary_format.m4 \
 ac_cxx_flexible_arrays.m4 \
 ac_cxx_float_binary_format.m4 \
 ac_cxx_long_double_binary_format.m4 \
+ac_cxx_remainder_bug.m4 \
+ac_prog_jar.m4 \
+ac_prog_java.m4 \
+ac_prog_javac.m4 \
+ac_prog_javah.m4 \
+ax_prefix_config_h.m4 \
 lib-ld.m4 \
 lib-link.m4 \
 lib-prefix.m4
@@ -341,13 +329,9 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-m4dataDATA: $(m4data_DATA)
 	@$(NORMAL_INSTALL)
-	test -z "$(m4datadir)" || $(mkdir_p) "$(DESTDIR)$(m4datadir)"
+	test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)"
 	@list='$(m4data_DATA)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -370,22 +354,21 @@ CTAGS:
 
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -401,7 +384,7 @@ check: check-am
 all-am: Makefile $(DATA)
 installdirs:
 	for dir in "$(DESTDIR)$(m4datadir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
 install-exec: install-exec-am
@@ -433,7 +416,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool
+distclean-am: clean-am distclean-generic
 
 dvi: dvi-am
 
@@ -447,12 +430,20 @@ info-am:
 
 install-data-am: install-m4dataDATA
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -471,17 +462,21 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am uninstall-m4dataDATA
+uninstall-am: uninstall-m4dataDATA
+
+.MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
 	distclean distclean-generic distclean-libtool distdir dvi \
 	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
 	install-info install-info-am install-m4dataDATA install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
 	install-strip installcheck installcheck-am installdirs \
 	maintainer-clean maintainer-clean-generic mostlyclean \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	uninstall uninstall-am uninstall-info-am uninstall-m4dataDATA
+	uninstall uninstall-am uninstall-m4dataDATA
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/m4/ac_check_ciao.m4 b/m4/ac_check_ciao.m4
new file mode 100644
index 0000000..c52c69c
--- /dev/null
+++ b/m4/ac_check_ciao.m4
@@ -0,0 +1,92 @@
+dnl A function to check for the existence and usability of Ciao-Prolog.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+AC_DEFUN([AC_CHECK_CIAO_PROLOG],
+[
+AC_PATH_PROG(ciao_prolog, ciao)
+if test x$ciao_prolog != x
+then
+  # Create a temporary directory $tmp in $TMPDIR (default /tmp).
+  # Use mktemp if possible; otherwise fall back on mkdir,
+  # with $RANDOM to make collisions less likely.
+  : ${TMPDIR=/tmp}
+  {
+    tmp=`
+      (umask 077 && mktemp -d "$TMPDIR/ppl_ciao_XXXXXX") 2>/dev/null
+    ` &&
+    test -n "$tmp" && test -d "$tmp"
+  } || {
+    tmp=$TMPDIR/ppl_ciao_$$-$RANDOM
+    (umask 077 && mkdir "$tmp")
+  } || exit $?
+  cat >$tmp/print_include_dir.pl <<_CIAO_PRINT_INCLUDE_DIR_EOF
+main(_) :-
+    ciaolibdir(Lib_Dir),
+    get_os(Os),
+    /*get_arch(Arch),*/
+    format("~p/include/", [[Lib_Dir/*, Os, Arch*/]]).
+_CIAO_PRINT_INCLUDE_DIR_EOF
+  ciao_prolog_include_dir=`$ciao_prolog $tmp/print_include_dir.pl`
+  rm -rf $tmp
+
+  CIAO_PROLOG_INCLUDE_OPTIONS="-I${ciao_prolog_include_dir}"
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $CIAO_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  AC_CHECK_HEADER(ciao_prolog.h,
+                  AC_MSG_CHECKING([for Ciao Prolog version x.y.z or later])
+                  AC_COMPILE_IFELSE(
+[#include <ciao_prolog.h>
+
+int
+main() {
+#if 0
+  choke me
+#endif
+
+  ;
+  return 0;
+}],
+                    AC_MSG_RESULT(yes),
+                    ciao_prolog=""
+                    AC_MSG_RESULT(no)
+                  ),
+                  ciao_prolog="")
+
+  dnl Additional version checks could be inserted here, if necessary.
+
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  CIAO_PROLOG="$ciao_prolog"
+  AC_SUBST(CIAO_PROLOG)
+  AC_SUBST(CIAO_PROLOG_INCLUDE_OPTIONS)
+  dnl AC_SUBST(CIAO_PROLOG_LD_OPTIONS)
+fi
+
+if test x$ciao_prolog != x
+then
+  have_ciao_prolog=yes
+else
+  have_ciao_prolog=no
+fi
+])
diff --git a/m4/ac_check_classpath.m4 b/m4/ac_check_classpath.m4
new file mode 100644
index 0000000..bfbdda4
--- /dev/null
+++ b/m4/ac_check_classpath.m4
@@ -0,0 +1,63 @@
+##### http://autoconf-archive.cryp.to/ac_check_classpath.html
+#
+# SYNOPSIS
+#
+#   AC_CHECK_CLASSPATH
+#
+# DESCRIPTION
+#
+#   AC_CHECK_CLASSPATH just displays the CLASSPATH, for the edification
+#   of the user.
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission. The general documentation, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2000-07-19
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000 Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#
+#   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, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+
+AC_DEFUN([AC_CHECK_CLASSPATH],[
+if test "x$CLASSPATH" = x; then
+        echo "You have no CLASSPATH, I hope it is good"
+else
+        echo "You have CLASSPATH $CLASSPATH, hope it is correct"
+fi
+])
diff --git a/m4/ac_check_fpu_control.m4 b/m4/ac_check_fpu_control.m4
index a658429..2f955aa 100644
--- a/m4/ac_check_fpu_control.m4
+++ b/m4/ac_check_fpu_control.m4
@@ -1,11 +1,11 @@
 dnl A function to check for the possibility to control the FPU.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CHECK_FPU_CONTROL],
 [
 AC_LANG_PUSH(C++)
@@ -45,7 +45,7 @@ main() {
   ac_cv_can_control_fpu=0
 ),
 AM_CONDITIONAL(CAN_CONTROL_FPU, test $ac_cv_can_control_fpu = 1)
-AC_DEFINE_UNQUOTED(PPL_CAN_CONTROL_FPU, $ac_cv_can_control_fpu,
+AC_DEFINE_UNQUOTED(CAN_CONTROL_FPU, $ac_cv_can_control_fpu,
     [Not zero if the FPU can be controlled.])
 AC_LANG_POP(C++)
 ])
diff --git a/m4/ac_check_gmp.m4 b/m4/ac_check_gmp.m4
index 3b4c9b6..ca10f58 100644
--- a/m4/ac_check_gmp.m4
+++ b/m4/ac_check_gmp.m4
@@ -1,11 +1,11 @@
 dnl A function to check for the existence and usability of GMP.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CHECK_GMP],
 [
 dnl Since libgmp and libgmpxx are usually installed in the same location,
diff --git a/m4/ac_check_sicstus_prolog.m4 b/m4/ac_check_sicstus_prolog.m4
index 52b8e9d..25a584f 100644
--- a/m4/ac_check_sicstus_prolog.m4
+++ b/m4/ac_check_sicstus_prolog.m4
@@ -1,11 +1,11 @@
 dnl A function to check for the existence and usability of SICStus Prolog.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,13 +19,13 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CHECK_SICSTUS_PROLOG],
 [
 AC_PATH_PROG(sicstus_prolog, sicstus)
 if test x$sicstus_prolog != x
 then
-  dnl The following would fail to find the real base `sicstus'
+  dnl The following would fail to find the real base if `sicstus'
   dnl is a symbolic link.
   dnl sicstus_prolog_base=$(dirname $(dirname $sicstus_prolog))
   sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
diff --git a/m4/ac_check_swi_prolog.m4 b/m4/ac_check_swi_prolog.m4
index 3d03256..bcd99c7 100644
--- a/m4/ac_check_swi_prolog.m4
+++ b/m4/ac_check_swi_prolog.m4
@@ -1,11 +1,11 @@
 dnl A function to check for the existence and usability of SWI-Prolog.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CHECK_SWI_PROLOG],
 [
 dnl By default, SWI-Prolog is installed as `pl', though some administrators
@@ -38,10 +38,14 @@ if test x$swi_prolog != x
 then
   swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
   swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
+  swi_prolog_arch=`$swi_prolog -dump-runtime-variables | grep PLARCH= | sed 's/PLARCH="\(.*\)";/\1/'`
+  swi_prolog_libs=`$swi_prolog -dump-runtime-variables | grep PLLIBS= | sed 's/PLLIBS="\(.*\)";/\1/'`
+  swi_prolog_lib=`$swi_prolog -dump-runtime-variables | grep PLLIB= | sed 's/PLLIB="\(.*\)";/\1/'`
 
   dnl Additional version checks could be inserted here, if necessary.
 
   SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
+  SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} ${swi_prolog_lib} ${swi_prolog_libs}"
   ac_save_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
   AC_LANG_PUSH(C++)
@@ -67,7 +71,10 @@ main() {
                   swi_prolog="")
   AC_LANG_POP(C++)
   CPPFLAGS="$ac_save_CPPFLAGS"
+  SWI_PROLOG="$swi_prolog"
+  AC_SUBST(SWI_PROLOG)
   AC_SUBST(SWI_PROLOG_INCLUDE_OPTIONS)
+  AC_SUBST(SWI_PROLOG_LD_OPTIONS)
 fi
 
 if test x$swi_prolog != x
diff --git a/m4/ac_check_xsb_prolog.m4 b/m4/ac_check_xsb_prolog.m4
index 2e552b1..58ddc3c 100644
--- a/m4/ac_check_xsb_prolog.m4
+++ b/m4/ac_check_xsb_prolog.m4
@@ -1,11 +1,11 @@
 dnl A function to check for the existence and usability of XSB Prolog.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CHECK_XSB_PROLOG],
 [
 AC_PATH_PROG(xsb_prolog, xsb)
diff --git a/m4/ac_cxx_attribute_weak.m4 b/m4/ac_cxx_attribute_weak.m4
index 7f950c5..189a428 100644
--- a/m4/ac_cxx_attribute_weak.m4
+++ b/m4/ac_cxx_attribute_weak.m4
@@ -1,12 +1,12 @@
 dnl A function to check whether the C++ compiler supports the function
 dnl __attribute__ ((weak)).
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CXX_SUPPORTS_ATTRIBUTE_WEAK],
 [
 ac_save_CPPFLAGS="$CPPFLAGS"
diff --git a/m4/ac_cxx_double_binary_format.m4 b/m4/ac_cxx_double_binary_format.m4
index 5e3c271..3bdfc3b 100644
--- a/m4/ac_cxx_double_binary_format.m4
+++ b/m4/ac_cxx_double_binary_format.m4
@@ -1,11 +1,11 @@
 dnl A function to detect the binary format used by C++ doubles.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,9 +19,10 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CXX_DOUBLE_BINARY_FORMAT],
 [
+AC_REQUIRE([AC_C_BIGENDIAN])
 ac_save_CPPFLAGS="$CPPFLAGS"
 ac_save_LIBS="$LIBS"
 AC_LANG_PUSH(C++)
@@ -31,6 +32,9 @@ ac_cxx_double_binary_format=unknown
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
@@ -91,7 +95,7 @@ else
   ac_supported_double=1
 fi
 AM_CONDITIONAL(SUPPORTED_DOUBLE, test $ac_supported_double = 1)
-AC_DEFINE_UNQUOTED(PPL_SUPPORTED_DOUBLE, $ac_supported_double,
+AC_DEFINE_UNQUOTED(SUPPORTED_DOUBLE, $ac_supported_double,
   [Not zero if doubles are supported.])
 
 AC_LANG_POP(C++)
diff --git a/m4/ac_cxx_flexible_arrays.m4 b/m4/ac_cxx_flexible_arrays.m4
index 283303f..225351d 100644
--- a/m4/ac_cxx_flexible_arrays.m4
+++ b/m4/ac_cxx_flexible_arrays.m4
@@ -1,11 +1,11 @@
 dnl A function to check whether the C++ compiler supports flexible arrays.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS],
 [
 ac_save_CPPFLAGS="$CPPFLAGS"
diff --git a/m4/ac_cxx_float_binary_format.m4 b/m4/ac_cxx_float_binary_format.m4
index 45edd33..c26456d 100644
--- a/m4/ac_cxx_float_binary_format.m4
+++ b/m4/ac_cxx_float_binary_format.m4
@@ -1,11 +1,11 @@
 dnl A function to detect the binary format used by C++ floats.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CXX_FLOAT_BINARY_FORMAT],
 [
 ac_save_CPPFLAGS="$CPPFLAGS"
@@ -31,6 +31,9 @@ ac_cxx_float_binary_format=unknown
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
@@ -82,7 +85,7 @@ else
   ac_supported_float=1
 fi
 AM_CONDITIONAL(SUPPORTED_FLOAT, test $ac_supported_float = 1)
-AC_DEFINE_UNQUOTED(PPL_SUPPORTED_FLOAT, $ac_supported_float,
+AC_DEFINE_UNQUOTED(SUPPORTED_FLOAT, $ac_supported_float,
   [Not zero if floats are supported.])
 
 AC_LANG_POP(C++)
diff --git a/m4/ac_cxx_long_double_binary_format.m4 b/m4/ac_cxx_long_double_binary_format.m4
index d0a846b..9690302 100644
--- a/m4/ac_cxx_long_double_binary_format.m4
+++ b/m4/ac_cxx_long_double_binary_format.m4
@@ -1,11 +1,11 @@
 dnl A function to detect the binary format used by C++ long doubles.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_CXX_LONG_DOUBLE_BINARY_FORMAT],
 [
 ac_save_CPPFLAGS="$CPPFLAGS"
@@ -32,6 +32,9 @@ ac_cxx_long_double_binary_format=unknown
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
@@ -88,6 +91,9 @@ then
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
@@ -145,6 +151,9 @@ then
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
@@ -202,6 +211,9 @@ then
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <limits>
 #ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
 #include <stdint.h>
 #endif
 #ifdef HAVE_INTTYPES_H
@@ -263,7 +275,7 @@ else
   ac_supported_long_double=1
 fi
 AM_CONDITIONAL(SUPPORTED_LONG_DOUBLE, test $ac_supported_long_double = 1)
-AC_DEFINE_UNQUOTED(PPL_SUPPORTED_LONG_DOUBLE, $ac_supported_long_double,
+AC_DEFINE_UNQUOTED(SUPPORTED_LONG_DOUBLE, $ac_supported_long_double,
   [Not zero if long doubles are supported.])
 
 AC_LANG_POP(C++)
diff --git a/m4/ac_cxx_proper_long_double.m4 b/m4/ac_cxx_proper_long_double.m4
new file mode 100644
index 0000000..5b29864
--- /dev/null
+++ b/m4/ac_cxx_proper_long_double.m4
@@ -0,0 +1,62 @@
+dnl A function to check whether the C++ compiler provides long double
+dnl numbers that have bigger range or precision than double.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_PROVIDES_PROPER_LONG_DOUBLE],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler provides proper long doubles])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <cfloat>
+
+long double f = 0.0;
+
+int main() {
+  return ((LDBL_MAX <= DBL_MAX) && (DBL_EPSILON <= LDBL_EPSILON)
+	  && (LDBL_MAX_EXP <= DBL_MAX_EXP) && (LDBL_MANT_DIG <= DBL_MANT_DIG))
+    ? 1
+    : 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_provides_proper_long_double=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_provides_proper_long_double=no,
+  AC_MSG_RESULT(no)
+  ac_cxx_provides_proper_long_double=no)
+
+if test x"$ac_cxx_provides_proper_long_double" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(CXX_PROVIDES_PROPER_LONG_DOUBLE, $value,
+  [Not zero if the C++ compiler provides long double numbers that have bigger range or precision than double.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_remainder_bug.m4 b/m4/ac_cxx_remainder_bug.m4
new file mode 100644
index 0000000..342ad85
--- /dev/null
+++ b/m4/ac_cxx_remainder_bug.m4
@@ -0,0 +1,71 @@
+dnl A function to check whether the C++ compiler has the `remainder' bug.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+AC_DEFUN([AC_CXX_HAS_REMAINDER_BUG],
+[
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([if the compiler has the remainder bug])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <climits>
+
+int minus_one(int n) {
+   return (n+1)*(n-1)-n*n;
+}
+
+int p(int x, int y) {
+   int z = x % y;
+   return z;
+}
+
+int main(int argc, char** argv) {
+   if (p(INT_MIN, minus_one(argc)) != 0)
+     return 1;
+   else
+     return 0;
+}
+
+]])],
+  AC_MSG_RESULT(no)
+  ac_cv_cxx_has_remainder_bug=no,
+  AC_MSG_RESULT(yes)
+  ac_cv_cxx_has_remainder_bug=yes,
+  AC_MSG_RESULT(yes)
+  ac_cv_cxx_has_remainder_bug=yes)
+
+if test x"$ac_cv_cxx_has_remainder_bug" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(CXX_HAS_REMAINDER_BUG, $value,
+  [Not zero if the C++ compiler has the remainder bug.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
+
diff --git a/m4/ac_prog_jar.m4 b/m4/ac_prog_jar.m4
new file mode 100644
index 0000000..41c05ea
--- /dev/null
+++ b/m4/ac_prog_jar.m4
@@ -0,0 +1,53 @@
+##### http://autoconf-archive.cryp.to/ac_prog_jar.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAR
+#
+# DESCRIPTION
+#
+#   AC_PROG_JAR tests for an existing jar program. It uses the
+#   environment variable JAR then tests in sequence various common jar
+#   programs.
+#
+#   If you want to force a specific compiler:
+#
+#   - at the configure.in level, set JAR=yourcompiler before calling
+#   AC_PROG_JAR
+#
+#   - at the configure level, setenv JAR
+#
+#   You can use the JAR variable in your Makefile.in, with @JAR at .
+#
+#   Note: This macro depends on the autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download that whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission.
+#
+#   The general documentation of those macros, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2006-11-06
+#
+# COPYLEFT
+#
+#   Copyright (C) 2000      Egon Willighagen <e.willighagen at science.ru.nl>
+#   Copyright (C) 2006-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+#   Copying and distribution of this file, with or without
+#   modification, are permitted in any medium without royalty provided
+#   the copyright notice and this notice are preserved.
+
+AC_DEFUN([AC_PROG_JAR],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAR" = x && AC_CHECK_PROGS(JAR, jar$EXEEXT, no)
+else
+        test "x$JAR" = x && AC_PATH_PROGS(JAR, jar, no, $JAVAPREFIX)
+fi
+test "x$JAR" = xno
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_java.m4 b/m4/ac_prog_java.m4
new file mode 100644
index 0000000..b450758
--- /dev/null
+++ b/m4/ac_prog_java.m4
@@ -0,0 +1,267 @@
+#### http://autoconf-archive.cryp.to/ac_prog_java_works.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVA_WORKS
+#
+# DESCRIPTION
+#
+#   Internal use ONLY.
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission. The general documentation, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2006-11-15
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000      Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#   Copyright (C) 2006-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+#   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, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+AC_DEFUN([AC_PROG_JAVA_WORKS], [
+AC_CHECK_PROG(uudecode, uudecode$EXEEXT, yes)
+if test x$uudecode = xyes; then
+AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [
+dnl /**
+dnl  * Test.java: used to test if java compiler works.
+dnl  */
+dnl public class Test
+dnl {
+dnl
+dnl public static void
+dnl main( String[] argv )
+dnl {
+dnl     System.exit (0);
+dnl }
+dnl
+dnl }
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+        ac_cv_prog_uudecode_base64=yes
+else
+        echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AC_FD_CC
+        echo "configure: failed file was:" >&AC_FD_CC
+        cat Test.uue >&AC_FD_CC
+        ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue])
+fi
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        rm -f Test.class
+        if test x$ac_cv_javac_supports_enums = x; then
+                AC_PROG_JAVAC
+        fi
+fi
+AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+changequote(, )dnl
+cat << \EOF > $JAVA_TEST
+/* [#]line __oline__ "configure" */
+public class Test {
+public static void main (String args[]) {
+        System.exit (0);
+} }
+EOF
+changequote([, ])dnl
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then
+                :
+        else
+          echo "configure: failed program was:" >&AC_FD_CC
+          cat $JAVA_TEST >&AC_FD_CC
+          AC_MSG_WARN(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?))
+        fi
+fi
+# if we don't have a Java compiler installed, it's useless to check if Java
+# works beacause a working javac is needed.
+if test x$ac_cv_javac_supports_enums = xno; then
+ ac_cv_prog_java_works=skipping
+else
+if AC_TRY_COMMAND($JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then
+  ac_cv_prog_java_works=yes
+else
+  echo "configure: failed program was:" >&AC_FD_CC
+  cat $JAVA_TEST >&AC_FD_CC
+  AC_MSG_WARN(The Java VM $JAVA failed (see config.log, check the CLASSPATH?))
+  fi
+fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
+])
+AC_PROVIDE([$0])dnl
+]
+)
+
+
+##### http://autoconf-archive.cryp.to/ac_prog_java.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVA
+#
+# DESCRIPTION
+#
+#   Here is a summary of the main macros:
+#
+#   AC_PROG_JAVAC: finds a Java compiler.
+#
+#   AC_PROG_JAVA: finds a Java virtual machine.
+#
+#   AC_CHECK_CLASS: finds if we have the given class (beware of
+#   CLASSPATH!).
+#
+#   AC_CHECK_RQRD_CLASS: finds if we have the given class and stops
+#   otherwise.
+#
+#   AC_TRY_COMPILE_JAVA: attempt to compile user given source.
+#
+#   AC_TRY_RUN_JAVA: attempt to compile and run user given source.
+#
+#   AC_JAVA_OPTIONS: adds Java configure options.
+#
+#   AC_PROG_JAVA tests an existing Java virtual machine. It uses the
+#   environment variable JAVA then tests in sequence various common
+#   Java virtual machines. For political reasons, it starts with the
+#   free ones. You *must* call [AC_PROG_JAVAC] before.
+#
+#   If you want to force a specific VM:
+#
+#   - at the configure.in level, set JAVA=yourvm before calling
+#   AC_PROG_JAVA
+#
+#     (but after AC_INIT)
+#
+#   - at the configure level, setenv JAVA
+#
+#   You can use the JAVA variable in your Makefile.in, with @JAVA at .
+#
+#   *Warning*: its success or failure can depend on a proper setting of
+#   the CLASSPATH env. variable.
+#
+#   TODO: allow to exclude virtual machines (rationale: most Java
+#   programs cannot run with some VM like kaffe).
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission.
+#
+#   A Web page, with a link to the latest CVS snapshot is at
+#   <http://www.internatif.org/bortzmeyer/autoconf-Java/>.
+#
+#   This is a sample configure.in Process this file with autoconf to
+#   produce a configure script.
+#
+#      AC_INIT(UnTag.java)
+#
+#      dnl Checks for programs.
+#      AC_CHECK_CLASSPATH
+#      AC_PROG_JAVAC
+#      AC_PROG_JAVA
+#
+#      dnl Checks for classes
+#      AC_CHECK_RQRD_CLASS(org.xml.sax.Parser)
+#      AC_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver)
+#
+#      AC_OUTPUT(Makefile)
+#
+# LAST MODIFICATION
+#
+#   2006-11-06
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000      Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#   Copyright (C) 2006-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+#   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, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+
+
+AC_DEFUN([AC_PROG_JAVA],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test x$JAVAPREFIX = x; then
+        test x$JAVA = x && AC_CHECK_PROGS(JAVA, java$EXEEXT, no)
+else
+        test x$JAVA = x && AC_PATH_PROGS(JAVA, java$EXEEXT, no, $JAVAPREFIX)
+fi
+if test ! x$JAVA = "xno"
+then
+ 	AC_PROG_JAVA_WORKS
+fi
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_javac.m4 b/m4/ac_prog_javac.m4
new file mode 100644
index 0000000..9bc5b80
--- /dev/null
+++ b/m4/ac_prog_javac.m4
@@ -0,0 +1,143 @@
+dnl A function to check whether the Java compiler supports enums.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+AC_DEFUN([AC_JAVAC_SUPPORTS_ENUMS],[
+AC_CACHE_CHECK([whether $JAVAC supports enums], ac_cv_javac_supports_enums, [
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* [#]line __oline__ "configure" */
+public class Test {
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+ }
+}
+EOF
+if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then
+  ac_cv_javac_supports_enums=yes
+else
+  echo "configure: failed program was:" >&AC_FD_CC
+  cat $JAVA_TEST >&AC_FD_CC
+  ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+])
+AC_PROVIDE([$0])dnl
+])
+
+##### http://autoconf-archive.cryp.to/ac_prog_javac.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVAC
+#
+# DESCRIPTION
+#
+#   AC_PROG_JAVAC tests an existing Java compiler. It uses the
+#   environment variable JAVAC then tests in sequence various common
+#   Java compilers. For political reasons, it starts with the free
+#   ones.
+#
+#   If you want to force a specific compiler:
+#
+#   - at the configure.in level, set JAVAC=yourcompiler before calling
+#   AC_PROG_JAVAC
+#
+#   - at the configure level, setenv JAVAC
+#
+#   You can use the JAVAC variable in your Makefile.in, with @JAVAC at .
+#
+#   *Warning*: its success or failure can depend on a proper setting of
+#   the CLASSPATH env. variable.
+#
+#   TODO: allow to exclude compilers (rationale: most Java programs
+#   cannot compile with some compilers like guavac).
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission. The general documentation, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2006-11-07
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000      Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#   Copyright (C) 2006-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+#   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, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+AC_DEFUN([AC_PROG_JAVAC],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x
+then
+        test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, javac$EXEEXT, no)
+else
+        test "x$JAVAC" = x && AC_PATH_PROGS(JAVAC, javac$EXEEXT, no, $JAVAPREFIX)
+fi
+if test ! x$JAVAC = "xno"
+then
+ 	AC_JAVAC_SUPPORTS_ENUMS
+fi
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_javah.m4 b/m4/ac_prog_javah.m4
new file mode 100644
index 0000000..eef679e
--- /dev/null
+++ b/m4/ac_prog_javah.m4
@@ -0,0 +1,50 @@
+##### http://autoconf-archive.cryp.to/ac_prog_javah.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVAH
+#
+# DESCRIPTION
+#
+#   AC_PROG_JAVAH tests the availability of the javah header generator
+#   and looks for the jni.h header file. If available, JAVAH is set to
+#   the full path of javah and CPPFLAGS is updated accordingly.
+#
+# LAST MODIFICATION
+#
+#   2006-12-20
+#
+# COPYLEFT
+#
+#   Copyright (C) 2002      Luc Maisonobe <luc at spaceroots.org>
+#   Copyright (C) 2006-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+#   Copying and distribution of this file, with or without
+#   modification, are permitted in any medium without royalty provided
+#   the copyright notice and this notice are preserved.
+
+AC_DEFUN([AC_PROG_JAVAH],[
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CPP])dnl
+if test "x$JAVAPREFIX" = x; then
+        AC_CHECK_PROGS(JAVAH,javah, no)
+else
+	AC_PATH_PROGS(JAVAH,javah, no, $JAVAPREFIX)
+fi
+
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != xno ; then
+  AC_PREPROC_IFELSE([#include <jni.h> ] ,,[
+    ac_save_CPPFLAGS="$CPPFLAGS"
+changequote(, )dnl
+    ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+    ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+changequote([, ])dnl
+    JNIFLAGS="-I$ac_dir -I$ac_dir/$ac_machdep"
+    CPPFLAGS="$ac_save_CPPFLAGS $JNIFLAGS"
+    AC_SUBST(JNIFLAGS)
+    AC_PREPROC_IFELSE([#include <jni.h>],
+               CPPFLAGS="$ac_save_CPPFLAGS",
+               AC_MSG_WARN([unable to include <jni.h>])
+	       JAVAH=no)
+    CPPFLAGS="$ac_save_CPPFLAGS"])
+fi])
diff --git a/m4/ac_text_md5sum.m4 b/m4/ac_text_md5sum.m4
index 15b8cdf..8ef8536 100644
--- a/m4/ac_text_md5sum.m4
+++ b/m4/ac_text_md5sum.m4
@@ -1,11 +1,11 @@
 dnl A function to set the command for computing the MD5 checksum of text files.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -19,7 +19,7 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
+
 AC_DEFUN([AC_TEXT_MD5SUM],
 [
 AC_MSG_CHECKING([for the text md5sum command])
diff --git a/m4/ax_prefix_config_h.m4 b/m4/ax_prefix_config_h.m4
new file mode 100644
index 0000000..83f8df6
--- /dev/null
+++ b/m4/ax_prefix_config_h.m4
@@ -0,0 +1,219 @@
+# ===========================================================================
+#           http://autoconf-archive.cryp.to/ax_prefix_config_h.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])]
+#
+# DESCRIPTION
+#
+#   This is a new variant from ac_prefix_config_ this one will use a
+#   lowercase-prefix if the config-define was starting with a
+#   lowercase-char, e.g. "#define const", "#define restrict", or "#define
+#   off_t", (and this one can live in another directory, e.g.
+#   testpkg/config.h therefore I decided to move the output-header to be the
+#   first arg)
+#
+#   takes the usual config.h generated header file; looks for each of the
+#   generated "#define SOMEDEF" lines, and prefixes the defined name (ie.
+#   makes it "#define PREFIX_SOMEDEF". The result is written to the output
+#   config.header file. The PREFIX is converted to uppercase for the
+#   conversions.
+#
+#   Defaults:
+#
+#     OUTPUT-HEADER = $PACKAGE-config.h
+#     PREFIX = $PACKAGE
+#     ORIG-HEADER, from AM_CONFIG_HEADER(config.h)
+#
+#   Your configure.ac script should contain both macros in this order, and
+#   unlike the earlier variations of this prefix-macro it is okay to place
+#   the AX_PREFIX_CONFIG_H call before the AC_OUTPUT invokation.
+#
+#   Example:
+#
+#     AC_INIT(config.h.in)        # config.h.in as created by "autoheader"
+#     AM_INIT_AUTOMAKE(testpkg, 0.1.1)    # makes #undef VERSION and PACKAGE
+#     AM_CONFIG_HEADER(config.h)          # prep config.h from config.h.in
+#     AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it..
+#     AC_MEMORY_H                         # makes "#undef NEED_MEMORY_H"
+#     AC_C_CONST_H                        # makes "#undef const"
+#     AC_OUTPUT(Makefile)                 # creates the "config.h" now
+#                                         # and also mylib/_config.h
+#
+#   if the argument to AX_PREFIX_CONFIG_H would have been omitted then the
+#   default outputfile would have been called simply "testpkg-config.h", but
+#   even under the name "mylib/_config.h" it contains prefix-defines like
+#
+#     #ifndef TESTPKG_VERSION
+#     #define TESTPKG_VERSION "0.1.1"
+#     #endif
+#     #ifndef TESTPKG_NEED_MEMORY_H
+#     #define TESTPKG_NEED_MEMORY_H 1
+#     #endif
+#     #ifndef _testpkg_const
+#     #define _testpkg_const _const
+#     #endif
+#
+#   and this "mylib/_config.h" can be installed along with other
+#   header-files, which is most convenient when creating a shared library
+#   (that has some headers) where some functionality is dependent on the
+#   OS-features detected at compile-time. No need to invent some
+#   "mylib-confdefs.h.in" manually. :-)
+#
+#   Note that some AC_DEFINEs that end up in the config.h file are actually
+#   self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T
+#   say that they "will define inline|const|off_t if the system does not do
+#   it by itself". You might want to clean up about these - consider an
+#   extra mylib/conf.h that reads something like:
+#
+#      #include <mylib/_config.h>
+#      #ifndef _testpkg_const
+#      #define _testpkg_const const
+#      #endif
+#
+#   and then start using _testpkg_const in the header files. That is also a
+#   good thing to differentiate whether some library-user has starting to
+#   take up with a different compiler, so perhaps it could read something
+#   like this:
+#
+#     #ifdef _MSC_VER
+#     #include <mylib/_msvc.h>
+#     #else
+#     #include <mylib/_config.h>
+#     #endif
+#     #ifndef _testpkg_const
+#     #define _testpkg_const const
+#     #endif
+#
+# LAST MODIFICATION
+#
+#   2008-04-12
+#
+# COPYLEFT
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod at gmx.de>
+#   Copyright (c) 2008 Marten Svantesson
+#   Copyright (c) 2008 Gerald Point <Gerald.Point at labri.fr>
+#
+#   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, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Macro Archive. When you make and
+#   distribute a modified version of the Autoconf Macro, you may extend this
+#   special exception to the GPL to apply to your modified version as well.
+
+AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl
+AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl
+AC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl
+AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl
+AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl
+AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl
+AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl
+AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl
+AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl
+m4_pushdef([_script],[conftest.prefix])dnl
+m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl
+_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)`
+_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"`
+_PKG=`echo ifelse($2, , $PACKAGE, $2)`
+_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"`
+_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:"  -e "/^@<:@m4_cr_digits@:>@/s/^/_/"`
+_INP=`echo "ifelse($3,,,$3)" | sed -e 's/ *//'`
+if test ".$_INP" = "."; then
+   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
+     case "$ac_file" in
+        *.h) _INP=$ac_file ;;
+        *)
+     esac
+     test ".$_INP" != "." && break
+   done
+fi
+if test ".$_INP" = "."; then
+   case "$_OUT" in
+      */*) _INP=`basename "$_OUT"`
+      ;;
+      *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"`
+      ;;
+      *) _INP=config.h
+      ;;
+   esac
+fi
+if test -z "$_PKG" ; then
+   AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H])
+else
+  if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then
+     _INP="$srcdir/$_INP"
+  fi fi
+  AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines)
+  if test -f $_INP ; then
+    echo "s/^@%:@undef  *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/" > _script
+    echo "s/^@%:@undef  *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/" >> _script
+    echo "s/^@%:@def[]ine  *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1 \\" >> _script
+    echo "@%:@def[]ine $_UPP""_\\1 \\2 \\" >> _script
+    echo "@%:@endif/" >>_script
+    echo "s/^@%:@def[]ine  *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1 \\" >> _script
+    echo "@%:@define $_LOW""_\\1 \\2 \\" >> _script
+    echo "@%:@endif/" >> _script
+    # now executing _script on _DEF input to create _OUT output file
+    echo "@%:@ifndef $_DEF"      >$tmp/pconfig.h
+    echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
+
+    sed -f _script $_INP >>$tmp/pconfig.h
+    echo ' ' >>$tmp/pconfig.h
+    echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h
+    echo "@%:@endif" >>$tmp/pconfig.h
+    if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then
+      AC_MSG_NOTICE([$_OUT is unchanged])
+    else
+      ac_dir=`AS_DIRNAME(["$_OUT"])`
+      AS_MKDIR_P(["$ac_dir"])
+      rm -f "$_OUT"
+      mv $tmp/pconfig.h "$_OUT"
+    fi
+    cp _script _configs.sed
+  else
+    AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT])
+  fi
+  rm -f conftest.*
+fi
+m4_popdef([_symbol])dnl
+m4_popdef([_script])dnl
+AS_VAR_POPDEF([_INP])dnl
+AS_VAR_POPDEF([_UPP])dnl
+AS_VAR_POPDEF([_LOW])dnl
+AS_VAR_POPDEF([_PKG])dnl
+AS_VAR_POPDEF([_DEF])dnl
+AS_VAR_POPDEF([_OUT])dnl
+],[PACKAGE="$PACKAGE"])])
+
+dnl implementation note: a bug report (31.5.2005) from Marten Svantesson points
+dnl out a problem where `echo "\1"` results in a Control-A. The unix standard
+dnl    http://www.opengroup.org/onlinepubs/000095399/utilities/echo.html
+dnl defines all backslash-sequences to be inherently non-portable asking
+dnl for replacement mit printf. Some old systems had problems with that
+dnl one either. However, the latest libtool (!) release does export an $ECHO
+dnl (and $echo) that does the right thing - just one question is left: what
+dnl was the first version to have it? Is it greater 2.58 ?
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
index ea0b0c4..e3d26fc 100644
--- a/m4/lib-link.m4
+++ b/m4/lib-link.m4
@@ -1,17 +1,19 @@
-# lib-link.m4 serial 6 (gettext-0.14.3)
-dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
+# lib-link.m4 serial 13 (gettext-0.17)
+dnl Copyright (C) 2001-2007 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl From Bruno Haible.
 
-AC_PREREQ(2.50)
+AC_PREREQ(2.54)
 
 dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
 dnl the libraries corresponding to explicit and implicit dependencies.
 dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
 dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
 AC_DEFUN([AC_LIB_LINKFLAGS],
 [
   AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
@@ -24,13 +26,16 @@ AC_DEFUN([AC_LIB_LINKFLAGS],
     ac_cv_lib[]Name[]_libs="$LIB[]NAME"
     ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
     ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
   ])
   LIB[]NAME="$ac_cv_lib[]Name[]_libs"
   LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
   INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
   AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
   AC_SUBST([LIB]NAME)
   AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
   dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
   dnl results of this search when this library appears as a dependency.
   HAVE_LIB[]NAME=yes
@@ -46,6 +51,8 @@ dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
 dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
 dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
 dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
 AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
 [
   AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
@@ -82,17 +89,23 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
     CPPFLAGS="$ac_save_CPPFLAGS"
     LIB[]NAME=
     LTLIB[]NAME=
+    LIB[]NAME[]_PREFIX=
   fi
   AC_SUBST([HAVE_LIB]NAME)
   AC_SUBST([LIB]NAME)
   AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
   undefine([Name])
   undefine([NAME])
 ])
 
 dnl Determine the platform dependent parameters needed to use rpath:
-dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
-dnl hardcode_direct, hardcode_minus_L.
+dnl   acl_libext,
+dnl   acl_shlibext,
+dnl   acl_hardcode_libdir_flag_spec,
+dnl   acl_hardcode_libdir_separator,
+dnl   acl_hardcode_direct,
+dnl   acl_hardcode_minus_L.
 AC_DEFUN([AC_LIB_RPATH],
 [
   dnl Tell automake >= 1.10 to complain if config.rpath is missing.
@@ -109,12 +122,14 @@ AC_DEFUN([AC_LIB_RPATH],
     acl_cv_rpath=done
   ])
   wl="$acl_cv_wl"
-  libext="$acl_cv_libext"
-  shlibext="$acl_cv_shlibext"
-  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
-  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
-  hardcode_direct="$acl_cv_hardcode_direct"
-  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
   dnl Determine whether the user wants rpath handling at all.
   AC_ARG_ENABLE(rpath,
     [  --disable-rpath         do not hardcode runtime library paths],
@@ -124,19 +139,24 @@ AC_DEFUN([AC_LIB_RPATH],
 dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
 dnl the libraries corresponding to explicit and implicit dependencies.
 dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
 AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
 [
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
   define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  dnl Autoconf >= 2.61 supports dots in --with options.
+  define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])])
   dnl By default, look in $includedir and $libdir.
   use_additional=yes
   AC_LIB_WITH_FINAL_PREFIX([
     eval additional_includedir=\"$includedir\"
     eval additional_libdir=\"$libdir\"
   ])
-  AC_LIB_ARG_WITH([lib$1-prefix],
-[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
-  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
+  AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix],
+[  --with-lib]N_A_M_E[-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
+  --without-lib]N_A_M_E[-prefix     don't search for lib$1 in includedir and libdir],
 [
     if test "X$withval" = "Xno"; then
       use_additional=no
@@ -148,7 +168,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
         ])
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/lib"
+        additional_libdir="$withval/$acl_libdirstem"
       fi
     fi
 ])
@@ -157,6 +177,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
   LIB[]NAME=
   LTLIB[]NAME=
   INC[]NAME=
+  LIB[]NAME[]_PREFIX=
   rpathdirs=
   ltrpathdirs=
   names_already_handled=
@@ -196,22 +217,55 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
           found_la=
           found_so=
           found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
           if test $use_additional = yes; then
-            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
-              found_dir="$additional_libdir"
-              found_so="$additional_libdir/lib$name.$shlibext"
-              if test -f "$additional_libdir/lib$name.la"; then
-                found_la="$additional_libdir/lib$name.la"
-              fi
-            else
-              if test -f "$additional_libdir/lib$name.$libext"; then
-                found_dir="$additional_libdir"
-                found_a="$additional_libdir/lib$name.$libext"
-                if test -f "$additional_libdir/lib$name.la"; then
-                  found_la="$additional_libdir/lib$name.la"
+            dir="$additional_libdir"
+            dnl The same code as in the loop below:
+            dnl First look for a shared library.
+            if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
                 fi
               fi
             fi
+            dnl Then look for a static library.
+            if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
           fi
           if test "X$found_dir" = "X"; then
             for x in $LDFLAGS $LTLIB[]NAME; do
@@ -219,21 +273,46 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
               case "$x" in
                 -L*)
                   dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
-                    found_dir="$dir"
-                    found_so="$dir/lib$name.$shlibext"
-                    if test -f "$dir/lib$name.la"; then
-                      found_la="$dir/lib$name.la"
-                    fi
-                  else
-                    if test -f "$dir/lib$name.$libext"; then
+                  dnl First look for a shared library.
+                  if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
                       found_dir="$dir"
-                      found_a="$dir/lib$name.$libext"
-                      if test -f "$dir/lib$name.la"; then
-                        found_la="$dir/lib$name.la"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
                       fi
                     fi
                   fi
+                  dnl Then look for a static library.
+                  if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
                   ;;
               esac
               if test "X$found_dir" != "X"; then
@@ -248,7 +327,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
               dnl Linking with a shared library. We attempt to hardcode its
               dnl directory into the executable's runpath, unless it's the
               dnl standard /usr/lib.
-              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
                 dnl No hardcoding is needed.
                 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
               else
@@ -267,12 +346,12 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
                   ltrpathdirs="$ltrpathdirs $found_dir"
                 fi
                 dnl The hardcoding into $LIBNAME is system dependent.
-                if test "$hardcode_direct" = yes; then
+                if test "$acl_hardcode_direct" = yes; then
                   dnl Using DIR/libNAME.so during linking hardcodes DIR into the
                   dnl resulting binary.
                   LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
                 else
-                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                     dnl Use an explicit option to hardcode DIR into the resulting
                     dnl binary.
                     LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
@@ -303,13 +382,13 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
                     if test -z "$haveit"; then
                       LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
                     fi
-                    if test "$hardcode_minus_L" != no; then
+                    if test "$acl_hardcode_minus_L" != no; then
                       dnl FIXME: Not sure whether we should use
                       dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
                       dnl here.
                       LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
                     else
-                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
                       dnl here, because this doesn't fit in flags passed to the
                       dnl compiler. So give up. No hardcoding. This affects only
                       dnl very old systems.
@@ -334,8 +413,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
             dnl Assume the include files are nearby.
             additional_includedir=
             case "$found_dir" in
-              */lib | */lib/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                LIB[]NAME[]_PREFIX="$basedir"
                 additional_includedir="$basedir/include"
                 ;;
             esac
@@ -396,9 +476,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
                     dnl   3. if it's already present in $LDFLAGS or the already
                     dnl      constructed $LIBNAME,
                     dnl   4. if it doesn't exist as a directory.
-                    if test "X$additional_libdir" != "X/usr/lib"; then
+                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
                       haveit=
-                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
                         if test -n "$GCC"; then
                           case $host_os in
                             linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -497,18 +577,18 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
     done
   done
   if test "X$rpathdirs" != "X"; then
-    if test -n "$hardcode_libdir_separator"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
       dnl Weird platform: only the last -rpath option counts, the user must
       dnl pass all path elements in one option. We can arrange that for a
       dnl single library, but not when more than one $LIBNAMEs are used.
       alldirs=
       for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
       done
-      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
       acl_save_libdir="$libdir"
       libdir="$alldirs"
-      eval flag=\"$hardcode_libdir_flag_spec\"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
       libdir="$acl_save_libdir"
       LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
     else
@@ -516,7 +596,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
       for found_dir in $rpathdirs; do
         acl_save_libdir="$libdir"
         libdir="$found_dir"
-        eval flag=\"$hardcode_libdir_flag_spec\"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
         libdir="$acl_save_libdir"
         LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
       done
@@ -551,3 +631,79 @@ AC_DEFUN([AC_LIB_APPENDTOVAR],
     fi
   done
 ])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+  AC_REQUIRE([AC_LIB_RPATH])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  $1=
+  if test "$enable_rpath" != no; then
+    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+      dnl Use an explicit option to hardcode directories into the resulting
+      dnl binary.
+      rpathdirs=
+      next=
+      for opt in $2; do
+        if test -n "$next"; then
+          dir="$next"
+          dnl No need to hardcode the standard /usr/lib.
+          if test "X$dir" != "X/usr/$acl_libdirstem"; then
+            rpathdirs="$rpathdirs $dir"
+          fi
+          next=
+        else
+          case $opt in
+            -L) next=yes ;;
+            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+                 dnl No need to hardcode the standard /usr/lib.
+                 if test "X$dir" != "X/usr/$acl_libdirstem"; then
+                   rpathdirs="$rpathdirs $dir"
+                 fi
+                 next= ;;
+            *) next= ;;
+          esac
+        fi
+      done
+      if test "X$rpathdirs" != "X"; then
+        if test -n ""$3""; then
+          dnl libtool is used for linking. Use -R options.
+          for dir in $rpathdirs; do
+            $1="${$1}${$1:+ }-R$dir"
+          done
+        else
+          dnl The linker is used for linking directly.
+          if test -n "$acl_hardcode_libdir_separator"; then
+            dnl Weird platform: only the last -rpath option counts, the user
+            dnl must pass all path elements in one option.
+            alldirs=
+            for dir in $rpathdirs; do
+              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+            done
+            acl_save_libdir="$libdir"
+            libdir="$alldirs"
+            eval flag=\"$acl_hardcode_libdir_flag_spec\"
+            libdir="$acl_save_libdir"
+            $1="$flag"
+          else
+            dnl The -rpath options are cumulative.
+            for dir in $rpathdirs; do
+              acl_save_libdir="$libdir"
+              libdir="$dir"
+              eval flag=\"$acl_hardcode_libdir_flag_spec\"
+              libdir="$acl_save_libdir"
+              $1="${$1}${$1:+ }$flag"
+            done
+          fi
+        fi
+      fi
+    fi
+  fi
+  AC_SUBST([$1])
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
index 0d895ca..a8684e1 100644
--- a/m4/lib-prefix.m4
+++ b/m4/lib-prefix.m4
@@ -1,4 +1,4 @@
-# lib-prefix.m4 serial 4 (gettext-0.14.2)
+# lib-prefix.m4 serial 5 (gettext-0.15)
 dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -24,6 +24,7 @@ AC_DEFUN([AC_LIB_PREFIX],
   AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
   AC_REQUIRE([AC_PROG_CC])
   AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
   AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
   dnl By default, look in $includedir and $libdir.
   use_additional=yes
@@ -45,7 +46,7 @@ AC_DEFUN([AC_LIB_PREFIX],
         ])
       else
         additional_includedir="$withval/include"
-        additional_libdir="$withval/lib"
+        additional_libdir="$withval/$acl_libdirstem"
       fi
     fi
 ])
@@ -87,7 +88,7 @@ AC_DEFUN([AC_LIB_PREFIX],
     dnl   2. if it's already present in $LDFLAGS,
     dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
     dnl   4. if it doesn't exist as a directory.
-    if test "X$additional_libdir" != "X/usr/lib"; then
+    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
       haveit=
       for x in $LDFLAGS; do
         AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
@@ -97,7 +98,7 @@ AC_DEFUN([AC_LIB_PREFIX],
         fi
       done
       if test -z "$haveit"; then
-        if test "X$additional_libdir" = "X/usr/local/lib"; then
+        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
           if test -n "$GCC"; then
             case $host_os in
               linux*) haveit=yes;;
@@ -151,3 +152,34 @@ AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
   exec_prefix="$acl_save_exec_prefix"
   prefix="$acl_save_prefix"
 ])
+
+dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing
+dnl the basename of the libdir, either "lib" or "lib64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+  dnl There is no formal standard regarding lib and lib64. The current
+  dnl practice is that on a system supporting 32-bit and 64-bit instruction
+  dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit
+  dnl libraries go under $prefix/lib. We determine the compiler's default
+  dnl mode by looking at the compiler's library search path. If at least
+  dnl of its elements ends in /lib64 or points to a directory whose absolute
+  dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the
+  dnl default, namely "lib".
+  acl_libdirstem=lib
+  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+  if test -n "$searchpath"; then
+    acl_save_IFS="${IFS= 	}"; IFS=":"
+    for searchdir in $searchpath; do
+      if test -d "$searchdir"; then
+        case "$searchdir" in
+          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+          *) searchdir=`cd "$searchdir" && pwd`
+             case "$searchdir" in
+               */lib64 ) acl_libdirstem=lib64 ;;
+             esac ;;
+        esac
+      fi
+    done
+    IFS="$acl_save_IFS"
+  fi
+])
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..39ba996
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,7357 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# 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.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 56 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+_LT_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+  ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+if test "$no_create" != yes; then
+  lt_cl_success=:
+  test "$silent" = yes &&
+    lt_config_lt_args="$lt_config_lt_args --quiet"
+  exec AS_MESSAGE_LOG_FD>/dev/null
+  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+  exec AS_MESSAGE_LOG_FD>>config.log
+  $lt_cl_success || AS_EXIT(1)
+fi
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_XSI_SHELLFNS
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX
+# -----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+[$]*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "[$]0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+    [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+       [shlibpath_overrides_runpath=yes])])
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method == "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        AC_LINK_IFELSE(int foo(void) {},
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+        )
+        LDFLAGS="$save_LDFLAGS"
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+        _LT_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [fix_srcfile_path], [1],
+    [Fix the shell variable $srcfile for the compiler])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+        # as there is no search path for DLLs.
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+        _LT_TAGVAR(always_export_symbols, $1)=no
+        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          _LT_TAGVAR(ld_shlibs, $1)=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${F77-"f77"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${FC-"f95"}
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC="$lt_save_CC"
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]+=\$[2]"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+    ;;
+  esac
+])
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 0000000..34151a3
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,368 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# 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.
+
+# serial 6 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# 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.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644
index 0000000..b8e154f
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# 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.
+
+# Generated from ltversion.in.
+
+# serial 3012 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6])
+m4_define([LT_PACKAGE_REVISION], [1.3012])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6'
+macro_revision='1.3012'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644
index 0000000..637bb20
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,92 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# 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.
+
+# serial 4 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
diff --git a/m4/ppl.m4 b/m4/ppl.m4
index 4df7534..81eb85e 100644
--- a/m4/ppl.m4
+++ b/m4/ppl.m4
@@ -1,13 +1,13 @@
 dnl A function to test for the existence and usability of particular
 dnl versions of the PPL, defining macros containing the required paths.
-dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 dnl Copyright (C) 1997 Owen Taylor
 dnl
 dnl This file is part of the Parma Polyhedra Library (PPL).
 dnl
 dnl The PPL is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU General Public License as published by the
-dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl Free Software Foundation; either version 3 of the License, or (at your
 dnl option) any later version.
 dnl
 dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,6 @@ dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 dnl
 dnl For the most up-to-date information see the Parma Polyhedra Library
 dnl site: http://www.cs.unipr.it/ppl/ .
-dnl
 
 dnl AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
 dnl Test for PPL, and define PPL_CPPFLAGS, PPL_LDFLAGS, ... what else?
@@ -89,6 +88,8 @@ else
 dnl Now check if the installed PPL is sufficiently new.
 dnl (Also sanity checks the results of ppl-config to some extent.)
 
+    AC_LANG_PUSH(C++)
+
     rm -f conf.ppltest
     AC_TRY_RUN([
 #include <ppl.hh>
@@ -132,7 +133,7 @@ main() {
       if (min_ppl_beta == 0)
         min_ppl_version_ok = false;
       else
-        min_ppl_revision = 0; 
+        min_ppl_revision = 0;
     }
     else if (n == 2) {
       n = sscanf("$min_ppl_version",
@@ -141,7 +142,7 @@ main() {
       if (n != 2)
         min_ppl_version_ok = false;
       else {
-        min_ppl_revision = 0; 
+        min_ppl_revision = 0;
         min_ppl_beta = 0;
       }
     }
@@ -157,7 +158,7 @@ main() {
     exit(1);
   }
 
-  if (strcmp("$ppl_config_version", PPL::version()) != 0)
+  if (strcmp("$ppl_config_version", PPL::version()) != 0) {
     cout << "\n*** 'ppl-config --version' returned $ppl_config_version, "
             "but PPL version "
          << PPL::version()
@@ -173,24 +174,27 @@ main() {
             " PPL_CONFIG"
             "\n*** to point to the correct copy of ppl-config,"
             " and remove the file config.cache"
-            "\n*** before re-running configure"
+            "\n*** before re-running configure."
          << endl;
-  else if (strcmp(PPL_VERSION, PPL::version()) != 0)
+      exit(1);
+  }
+  else if (strcmp(PPL_VERSION, PPL::version()) != 0) {
     cout << "\n*** PPL header file (version " PPL_VERSION ") does not match"
          << "\n*** library (version " << PPL::version() << ")"
          << endl;
-  else {
-    if (PPL_VERSION_MAJOR < min_ppl_major
-        || (PPL_VERSION_MAJOR == min_ppl_major
-           && PPL_VERSION_MINOR < min_ppl_minor)
-        || (PPL_VERSION_MAJOR == min_ppl_major
-           && PPL_VERSION_MINOR == min_ppl_minor
-           && PPL_VERSION_REVISION < min_ppl_revision)
-        || (PPL_VERSION_MAJOR == min_ppl_major
-           && PPL_VERSION_MINOR == min_ppl_minor
-           && PPL_VERSION_REVISION == min_ppl_revision
-           && PPL_VERSION_BETA < min_ppl_beta)) {
-      cout << "\n*** An old version of PPL (" PPL_VERSION ") was found"
+      exit(1);
+  }
+  else if (PPL_VERSION_MAJOR < min_ppl_major
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR < min_ppl_minor)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION < min_ppl_revision)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION == min_ppl_revision
+              && PPL_VERSION_BETA < min_ppl_beta)) {
+      cout << "\n*** An old version of PPL (" PPL_VERSION ") was found."
               "\n*** You need at least PPL version $min_ppl_version."
               "  The latest version of"
               "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
@@ -210,19 +214,22 @@ main() {
               "\n*** so that the correct libraries are found at run-time.)"
            << endl;
       exit(1);
-    }
   }
   return 0;
 }
 ],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
-       CPPFLAGS="$ac_save_CPPFLAGS"
-       LDFLAGS="$ac_save_LDFLAGS"
+
+    AC_LANG_POP
+
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LDFLAGS="$ac_save_LDFLAGS"
   fi
 fi
+
 if test "x$no_ppl" = x
 then
   AC_MSG_RESULT(yes)
-  ifelse([$2], , :, [$2])     
+  ifelse([$2], , :, [$2])
 else
   AC_MSG_RESULT(no)
   if test x"$PPL_CONFIG" = xno
@@ -253,7 +260,7 @@ using namespace Parma_Polyhedra_Library;
   echo "*** wrong version of the PPL.  If it is not finding the PPL, you will"
   echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
   echo "*** /etc/ld.so.conf to point to the installed location.  Also, make"
-  echo "*** sure you have run ldconfig if that is required on your system"
+  echo "*** sure you have run ldconfig if that is required on your system."
   echo "***"
   echo "*** If you have an old version installed, it is best to remove it,"
   echo "*** although you may also be able to get things to work by modifying"
@@ -261,7 +268,7 @@ using namespace Parma_Polyhedra_Library;
 ],
 [
   echo "*** The test program failed to compile or link. See the file"
-  echo "*** config.log for the exact error that occured.  This usually"
+  echo "*** config.log for the exact error that occured.  This usually means"
   echo "*** the PPL was incorrectly installed or that someone moved the PPL"
   echo "*** since it was installed.  In both cases you should reinstall"
   echo "*** the library."
diff --git a/m4/ppl_c.m4 b/m4/ppl_c.m4
new file mode 100644
index 0000000..d81a80d
--- /dev/null
+++ b/m4/ppl_c.m4
@@ -0,0 +1,285 @@
+dnl A function to test for the existence and usability of particular
+dnl versions of the C interface of the PPL, defining macros containing
+dnl the required paths.
+dnl Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 1997 Owen Taylor
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+
+dnl AM_PATH_PPL_C([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for the C interface of the PPL, and define PPL_CPPFLAGS,
+dnl PPL_LDFLAGS, ... what else?
+
+AC_DEFUN([AM_PATH_PPL_C],
+[
+dnl Get the required information from the ppl-config program.
+AC_ARG_WITH(ppl-prefix,
+  AS_HELP_STRING([--with-ppl-prefix=PREFIX],
+    [prefix used to configure the PPL]),
+  ppl_prefix="$withval",
+  ppl_prefix="")
+AC_ARG_WITH(ppl-exec-prefix,
+  AS_HELP_STRING([--with-ppl-exec-prefix=PREFIX],
+    [exec-prefix used to configure the PPL]),
+  ppl_exec_prefix="$withval",
+  ppl_exec_prefix="")
+AC_ARG_ENABLE(ppl-test,
+  AS_HELP_STRING([--disable-ppltest],
+    [do not try to compile and run a test PPL program]),
+  ,
+  enable_ppltest=yes)
+
+if test "x$ppl_exec_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --exec-prefix=$ppl_exec_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_exec_prefix/bin/ppl-config"
+  fi
+fi
+if test "x$ppl_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --prefix=$ppl_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_prefix/bin/ppl-config"
+  fi
+fi
+
+AC_PATH_PROG(PPL_CONFIG, ppl-config, no)
+min_ppl_version=ifelse([$1], ,0.0,$1)
+if test \( "x$min_ppl_version" = "x0.0" \) -o \( "x$min_ppl_version" = "x0.0.0" \)
+then
+  AC_MSG_CHECKING([for the Parma Polyhedra Library])
+else
+  AC_MSG_CHECKING([for the Parma Polyhedra Library, version >= $min_ppl_version])
+fi
+no_ppl=""
+if test $PPL_CONFIG = no
+then
+  no_ppl=yes
+else
+  PPL_CPPFLAGS=`$PPL_CONFIG $ppl_config_args --cppflags`
+  PPL_LDFLAGS=`$PPL_CONFIG $ppl_config_args --interface=C --ldflags`
+  ppl_config_version="`$PPL_CONFIG $ppl_config_args --version`"
+
+  if test "x$enable_ppltest" = xyes
+  then
+    ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_save_LDFLAGS="$LDFLAGS"
+    CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+    LDFLAGS="$PPL_LDFLAGS $LDFLAGS"
+
+dnl Now check if the installed (C interface of the) PPL is sufficiently new.
+dnl (Also sanity checks the results of ppl-config to some extent.)
+
+    AC_LANG_PUSH(C)
+
+    rm -f conf.ppltest
+    AC_TRY_RUN([
+#include <ppl_c.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BOOL int
+#define TRUE 1
+#define FALSE 0
+
+int
+main() {
+  const char* version_string = 0;
+
+  system("touch conf.ppltest");
+
+  unsigned min_ppl_major, min_ppl_minor, min_ppl_revision, min_ppl_beta;
+  int n = sscanf("$min_ppl_version",
+                 "%u.%u.%upre%u%*c",
+                 &min_ppl_major, &min_ppl_minor,
+                 &min_ppl_revision, &min_ppl_beta);
+  BOOL min_ppl_version_ok = TRUE;
+  if (n == 4) {
+    if (min_ppl_beta == 0)
+      min_ppl_version_ok = FALSE;
+  }
+  else if (n == 3) {
+    n = sscanf("$min_ppl_version",
+               "%u.%u.%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_revision);
+    if (n != 3)
+      min_ppl_version_ok = FALSE;
+    else
+      min_ppl_beta = 0;
+  }
+  else if (n == 2) {
+    n = sscanf("$min_ppl_version",
+               "%u.%upre%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_beta);
+    if (n == 3) {
+      if (min_ppl_beta == 0)
+        min_ppl_version_ok = FALSE;
+      else
+        min_ppl_revision = 0;
+    }
+    else if (n == 2) {
+      n = sscanf("$min_ppl_version",
+                 "%u.%u%*c",
+                 &min_ppl_major, &min_ppl_minor);
+      if (n != 2)
+        min_ppl_version_ok = FALSE;
+      else {
+        min_ppl_revision = 0;
+        min_ppl_beta = 0;
+      }
+    }
+    else
+      min_ppl_version_ok = FALSE;
+  }
+  else
+    min_ppl_version_ok = FALSE;
+
+  if (!min_ppl_version_ok) {
+    printf("illegal version string '$min_ppl_version'\n");
+    exit(1);
+  }
+
+  ppl_version(&version_string);
+
+  if (strcmp("$ppl_config_version", version_string) != 0) {
+    printf("\n*** 'ppl-config --version' returned $ppl_config_version, "
+           "but PPL version %s", version_string);
+    printf("\n*** was found!  If ppl-config was correct, then it is best"
+           "\n*** to remove the old version of PPL."
+           "  You may also be able to fix the error"
+           "\n*** by modifying your LD_LIBRARY_PATH enviroment variable,"
+           " or by editing"
+           "\n*** /etc/ld.so.conf."
+           "  Make sure you have run ldconfig if that is"
+           "\n*** required on your system."
+           "\n*** If ppl-config was wrong, set the environment variable"
+           " PPL_CONFIG"
+           "\n*** to point to the correct copy of ppl-config,"
+           " and remove the file config.cache"
+           "\n*** before re-running configure.\n");
+    exit(1);
+  }
+  else if (strcmp(PPL_VERSION, version_string) != 0) {
+    printf("\n*** PPL header file (version " PPL_VERSION ") does not match"
+           "\n*** library (version %s)\n", version_string);
+    exit(1);
+  }
+  else if (PPL_VERSION_MAJOR < min_ppl_major
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR < min_ppl_minor)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION < min_ppl_revision)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION == min_ppl_revision
+              && PPL_VERSION_BETA < min_ppl_beta)) {
+      printf("\n*** An old version of PPL (" PPL_VERSION ") was found."
+             "\n*** You need at least PPL version $min_ppl_version."
+             "  The latest version of"
+             "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
+             "\n***"
+             "\n*** If you have already installed a sufficiently new version,"
+             " this error"
+             "\n*** probably means that the wrong copy of the ppl-config"
+             " program is"
+             "\n*** being found.  The easiest way to fix this is to remove"
+             " the old version"
+             "\n*** of PPL, but you can also set the PPL_CONFIG environment"
+             " variable to point"
+             "\n*** to the correct copy of ppl-config.  (In this case,"
+             " you will have to"
+             "\n*** modify your LD_LIBRARY_PATH enviroment"
+             " variable or edit /etc/ld.so.conf"
+             "\n*** so that the correct libraries are found at run-time.)\n");
+      exit(1);
+  }
+  return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+
+    AC_LANG_POP
+
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LDFLAGS="$ac_save_LDFLAGS"
+  fi
+fi
+
+if test "x$no_ppl" = x
+then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], , :, [$2])
+else
+  AC_MSG_RESULT(no)
+  if test x"$PPL_CONFIG" = xno
+  then
+    echo "*** The ppl-config script installed by PPL could not be found."
+    echo "*** If the PPL was installed in PREFIX, make sure PREFIX/bin is in"
+    echo "*** your path, or set the PPL_CONFIG environment variable to the"
+    echo "*** full path to ppl-config."
+  else
+    if test -f conf.ppltest
+    then
+      :
+    else
+      echo "*** Could not run PPL test program, checking why..."
+      CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+      LDFLAGS="$LDFLAGS $PPL_LDFLAGS"
+      AC_TRY_LINK([
+#include <ppl_c.h>
+],
+[
+  return ppl_version_major() || ppl_version_minor()
+  || ppl_version_revision() || ppl_version_beta();
+],
+[
+  echo "*** The test program compiled, but did not run.  This usually means"
+  echo "*** that the run-time linker is not finding the PPL or finding the"
+  echo "*** wrong version of the PPL.  If it is not finding the PPL, you will"
+  echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
+  echo "*** /etc/ld.so.conf to point to the installed location.  Also, make"
+  echo "*** sure you have run ldconfig if that is required on your system."
+  echo "***"
+  echo "*** If you have an old version installed, it is best to remove it,"
+  echo "*** although you may also be able to get things to work by modifying"
+  echo "*** LD_LIBRARY_PATH."
+],
+[
+  echo "*** The test program failed to compile or link. See the file"
+  echo "*** config.log for the exact error that occured.  This usually means"
+  echo "*** the PPL was incorrectly installed or that someone moved the PPL"
+  echo "*** since it was installed.  In both cases you should reinstall"
+  echo "*** the library."
+])
+      CPPFLAGS="$ac_save_CPPFLAGS"
+      LDFLAGS="$ac_save_LDFLAGS"
+    fi
+  fi
+  PPL_CPPFLAGS=""
+  PPL_LDFLAGS=""
+  ifelse([$3], , :, [$3])
+fi
+AC_SUBST(PPL_CPPFLAGS)
+AC_SUBST(PPL_LDFLAGS)
+rm -f conf.ppltest
+])
diff --git a/missing b/missing
index d84fac8..1c8ff70 100755
--- a/missing
+++ b/missing
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
 
-scriptversion=2005-06-08.21
+scriptversion=2006-05-10.23
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
 #   Free Software Foundation, Inc.
 # Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
@@ -18,8 +18,9 @@ scriptversion=2005-06-08.21
 # 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -32,6 +33,8 @@ if test $# -eq 0; then
 fi
 
 run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
 
 # In the cases where this matters, `missing' is being run in the
 # srcdir already.
@@ -43,7 +46,7 @@ fi
 
 msg="missing on your system"
 
-case "$1" in
+case $1 in
 --run)
   # Try to run requested program, and just exit if it succeeds.
   run=
@@ -76,6 +79,7 @@ Supported PROGRAM values:
   aclocal      touch file \`aclocal.m4'
   autoconf     touch file \`configure'
   autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
   automake     touch all \`Makefile.in' files
   bison        create \`y.tab.[ch]', if possible, from existing .[ch]
   flex         create \`lex.yy.c', if possible, from existing .c
@@ -105,7 +109,7 @@ esac
 # Now exit if we have it, but it failed.  Also exit now if we
 # don't have it and --version was passed (most likely to detect
 # the program).
-case "$1" in
+case $1 in
   lex|yacc)
     # Not GNU programs, they don't have --version.
     ;;
@@ -134,7 +138,7 @@ esac
 
 # If it does not exist, or fails to run (possibly an outdated version),
 # try to emulate it.
-case "$1" in
+case $1 in
   aclocal*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
@@ -163,7 +167,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     test -z "$files" && files="config.h"
     touch_files=
     for f in $files; do
-      case "$f" in
+      case $f in
       *:*) touch_files="$touch_files "`echo "$f" |
 				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
       *) touch_files="$touch_files $f.in";;
@@ -191,8 +195,8 @@ WARNING: \`$1' is needed, but is $msg.
          You can get \`$1' as part of \`Autoconf' from any GNU
          archive site."
 
-    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
-    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
     if test -f "$file"; then
 	touch $file
     else
@@ -213,25 +217,25 @@ WARNING: \`$1' $msg.  You should only need it if
          in order for those modifications to take effect.  You can get
          \`Bison' from any GNU archive site."
     rm -f y.tab.c y.tab.h
-    if [ $# -ne 1 ]; then
+    if test $# -ne 1; then
         eval LASTARG="\${$#}"
-	case "$LASTARG" in
+	case $LASTARG in
 	*.y)
 	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" y.tab.c
 	    fi
 	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" y.tab.h
 	    fi
 	  ;;
 	esac
     fi
-    if [ ! -f y.tab.h ]; then
+    if test ! -f y.tab.h; then
 	echo >y.tab.h
     fi
-    if [ ! -f y.tab.c ]; then
+    if test ! -f y.tab.c; then
 	echo 'main() { return 0; }' >y.tab.c
     fi
     ;;
@@ -243,18 +247,18 @@ WARNING: \`$1' is $msg.  You should only need it if
          in order for those modifications to take effect.  You can get
          \`Flex' from any GNU archive site."
     rm -f lex.yy.c
-    if [ $# -ne 1 ]; then
+    if test $# -ne 1; then
         eval LASTARG="\${$#}"
-	case "$LASTARG" in
+	case $LASTARG in
 	*.l)
 	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" lex.yy.c
 	    fi
 	  ;;
 	esac
     fi
-    if [ ! -f lex.yy.c ]; then
+    if test ! -f lex.yy.c; then
 	echo 'main() { return 0; }' >lex.yy.c
     fi
     ;;
@@ -266,11 +270,9 @@ WARNING: \`$1' is $msg.  You should only need it if
 	 \`Help2man' package in order for those modifications to take
 	 effect.  You can get \`Help2man' from any GNU archive site."
 
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
-    fi
-    if [ -f "$file" ]; then
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
 	touch $file
     else
 	test -z "$file" || exec >$file
@@ -288,11 +290,17 @@ WARNING: \`$1' is $msg.  You should only need it if
          DU, IRIX).  You might want to install the \`Texinfo' package or
          the \`GNU make' package.  Grab either from any GNU archive site."
     # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
     if test -z "$file"; then
       # ... or it is the one specified with @setfilename ...
       infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
       # ... or it is derived from the source name (dir/f.texi becomes f.info)
       test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
     fi
@@ -316,13 +324,13 @@ WARNING: \`$1' is $msg.  You should only need it if
     fi
     firstarg="$1"
     if shift; then
-	case "$firstarg" in
+	case $firstarg in
 	*o*)
 	    firstarg=`echo "$firstarg" | sed s/o//`
 	    tar "$firstarg" "$@" && exit 0
 	    ;;
 	esac
-	case "$firstarg" in
+	case $firstarg in
 	*h*)
 	    firstarg=`echo "$firstarg" | sed s/h//`
 	    tar "$firstarg" "$@" && exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
index 259dbfc..ef7e16f 100755
--- a/mkinstalldirs
+++ b/mkinstalldirs
@@ -1,7 +1,7 @@
 #! /bin/sh
 # mkinstalldirs --- make directory hierarchy
 
-scriptversion=2005-06-29.22
+scriptversion=2006-05-11.19
 
 # Original author: Noah Friedman <friedman at prep.ai.mit.edu>
 # Created: 1993-05-16
@@ -11,6 +11,9 @@ scriptversion=2005-06-29.22
 # bugs to <bug-automake at gnu.org> or send patches to
 # <automake-patches at gnu.org>.
 
+nl='
+'
+IFS=" ""	$nl"
 errstatus=0
 dirmode=
 
diff --git a/ppl.spec.in b/ppl.spec.in
deleted file mode 100644
index f8b2db6..0000000
--- a/ppl.spec.in
+++ /dev/null
@@ -1,185 +0,0 @@
-%define name	ppl
-%define version @VERSION@
-%define release 1
-%define builddir $RPM_BUILD_DIR/%{name}-%{version}
-
-Name:		%{name}
-Version:	%{version}
-Release:	%{release}
-Vendor:		ppl-devel at cs.unipr.it
-Packager:	%{packager}
-URL:		http://www.cs.unipr.it/ppl/
-Source:         ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.gz
-#Patch:
-Group:		Development/Libraries
-License:	GPL v2
-#Icon:
-Requires:	gmp >= 4.1.3, gcc-c++ >= 4.0.2
-BuildRoot:	%{_tmppath}/%{name}-%{version}
-Prefix:		/usr
-Summary:	The Parma Polyhedra Library: a C++ library for numerical abstractions.
-%description
-The Parma Polyhedra Library (PPL) is a C++ library for the
-manipulation of (not necessarily closed) convex polyhedra and other
-numerical abstractions.  The applications of convex polyhedra include
-program analysis, optimized compilation, integer and combinatorial
-optimization and statistical data-editing.  The Parma Polyhedra
-Library is user friendly (you write `x + 2*y + 5*z <= 7' when you mean
-it), fully dynamic (available virtual memory is the only limitation to
-the dimension of anything), written in standard C++, exception-safe,
-rather efficient, thoroughly documented, and free software.
-
-%package c
-Summary:	The C interface of the Parma Polyhedra Library
-Group:		Development/Libraries
-Requires:	ppl = %{version}-%{release}
-%description c
-This package adds C support to the Parma Polyhedra Library (PPL).
-Install this package if you want to access the PPL via C.
-
-%package gprolog
-Summary:	The GNU Prolog interface of the Parma Polyhedra Library.
-Group:		Development/Libraries
-Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
-%description gprolog
-This package adds GNU Prolog support to the Parma Polyhedra Library (PPL).
-Install this package if you want to use the library in GNU Prolog programs.
-
-%package sicstus
-Summary:	The SICStus Prolog interface of the Parma Polyhedra Library.
-Group:		Development/Libraries
-Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
-%description sicstus
-This package adds SICStus Prolog support to the Parma Polyhedra Library (PPL).
-Install this package if you want to use the library in SICStus Prolog programs.
-
-%package swi
-Summary:	The SWI Prolog interface of the Parma Polyhedra Library.
-Group:		Development/Libraries
-Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
-%description swi
-This package adds SWI Prolog support to the Parma Polyhedra Library (PPL).
-Install this package if you want to use the library in SWI Prolog programs.
-
-%package yap
-Summary:	The YAP Prolog interface of the Parma Polyhedra Library.
-Group:		Development/Libraries
-Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
-%description yap
-This package adds YAP Prolog support to the Parma Polyhedra Library (PPL).
-Install this package if you want to use the library in YAP Prolog programs.
-
-%package pwl
-Summary:	The Parma Watchdog Library: a C++ library for watchdog timers.
-Group:		Development/Libraries
-Requires:	gcc-c++ >= 4.0.2
-%description pwl
-This package contains the Parma Watchdog Library (PWL).
-The library provides support for multiple, concurrent watchdog timers
-on systems providing setitimer(2).
-The PWL is currently distributed with the Parma Polyhedra Library (PPL),
-but is totally independent from it.
-
-%prep
-%setup -n %{name}-%{version}
-#%patch -p1
-
-%build
-CXXFLAGS="$RPM_OPT_FLAGS" ./configure --enable-shared \
-    --prefix=%{_prefix} --bindir=%{_bindir} --mandir=%{_mandir} \
-    --localstatedir=%{_localstatedir} --libdir=%{_libdir} \
-    --datadir=%{_datadir} --includedir=%{_includedir} \
-    --sysconfdir=%{_sysconfdir}
-make
-
-%install
-if [ -d $RPM_BUILD_ROOT ]
-then
-	rm -rf $RPM_BUILD_ROOT
-fi
-mkdir -p $RPM_BUILD_ROOT
-make prefix=$RPM_BUILD_ROOT%{_prefix} bindir=$RPM_BUILD_ROOT%{_bindir} \
-    mandir=$RPM_BUILD_ROOT%{_mandir} libdir=$RPM_BUILD_ROOT%{_libdir} \
-    localstatedir=$RPM_BUILD_ROOT%{_localstatedir} \
-    datadir=$RPM_BUILD_ROOT%{_datadir} \
-    includedir=$RPM_BUILD_ROOT%{_includedir} \
-    sysconfdir=$RPM_BUILD_ROOT%{_sysconfdir} install
-
-
-%files
-%defattr(-,root,root)
-%doc BUGS COPYING CREDITS ChangeLog NEWS README README.configure doc/README.doc doc/*.pdf* doc/*.ps.gz doc/*.txt
-%{_includedir}/ppl.hh
-%{_bindir}/ppl-config
-%{_bindir}/ppl_lcdd
-%{_bindir}/ppl_lpsol
-%{_libdir}/libppl.so.*
-%{_libdir}/libppl.so
-%{_libdir}/libppl.a
-%{_libdir}/libppl.la
-%{_mandir}/man1/ppl-config.1.gz
-%{_mandir}/man1/ppl_lcdd.1.gz
-%{_mandir}/man1/ppl_lpsol.1.gz
-
-
-%files c
-%defattr(-,root,root)
-%{_includedir}/ppl_c.h
-%{_libdir}/libppl_c.a
-%{_libdir}/libppl_c.la
-%{_libdir}/libppl_c.so*
-
-%files gprolog
-%defattr(-,root,root)
-%{_bindir}/ppl_gprolog
-%{_libdir}/ppl/ppl_gprolog.pl
-%{_libdir}/ppl/libppl_gprolog.a
-%{_libdir}/ppl/libppl_gprolog.la
-%{_libdir}/ppl/libppl_gprolog.so
-
-%files sicstus
-%defattr(-,root,root)
-# Uncomment the following line if you want to create an RPM containing
-# a version of SICStus statically linked with the PPL.
-#%{_bindir}/ppl_sicstus
-%{_libdir}/ppl/ppl_sicstus.s.o
-%{_libdir}/ppl/ppl_sicstus.so
-%{_libdir}/ppl/ppl_sicstus.pl
-
-%files swi
-%defattr(-,root,root)
-%{_bindir}/ppl_pl
-%{_libdir}/ppl/libppl_swiprolog.a
-%{_libdir}/ppl/libppl_swiprolog.la
-%{_libdir}/ppl/libppl_swiprolog.so
-
-%files yap
-%defattr(-,root,root)
-%{_libdir}/ppl/ppl_yap.a
-%{_libdir}/ppl/ppl_yap.la
-%{_libdir}/ppl/ppl_yap.pl
-%{_libdir}/ppl/ppl_yap.so
-
-%files pwl
-%defattr(-,root,root)
-%doc Watchdog/README
-%{_includedir}/pwl.hh
-%{_libdir}/libpwl.so.*
-%{_libdir}/libpwl.so
-%{_libdir}/libpwl.a
-%{_libdir}/libpwl.la
-
-%post
-/sbin/ldconfig
-
-%postun
-/sbin/ldconfig
-
-%post c
-/sbin/ldconfig
-
-%postun c
-/sbin/ldconfig
-
-%clean
-rm -rf $RPM_BUILD_ROOT
diff --git a/src/Any_Pointset.defs.hh b/src/Any_Pointset.defs.hh
new file mode 100644
index 0000000..f544e1c
--- /dev/null
+++ b/src/Any_Pointset.defs.hh
@@ -0,0 +1,1382 @@
+/* Any_Pointset class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Any_Pointset_defs_hh
+#define PPL_Any_Pointset_defs_hh 1
+
+#include "Any_Pointset.types.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include "Grid.defs.hh"
+#include "Box.defs.hh"
+#include "BD_Shape.defs.hh"
+#include "Octagonal_Shape.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Any_Pointset
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty pointset;
+  <CODE>true</CODE> is written if \p ph is a universe pointset;
+  a minimized system of constraints and congruences \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Any_Pointset& ph);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same pointset.
+
+  \relates Any_Pointset
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  pointsets: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Any_Pointset& x, const Any_Pointset& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different pointsets.
+
+  \relates Any_Pointset
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  pointsets: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Any_Pointset& x, const Any_Pointset& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! Any PPL pointset.
+/*! \ingroup PPL_CXX_interface */
+class Parma_Polyhedra_Library::Any_Pointset {
+public:
+#if 0
+  //! Returns the maximum space dimension all pointsets can handle.
+  static dimension_type max_space_dimension();
+#endif
+
+  //! Default constructor.
+  Any_Pointset();
+
+  //! Ordinary copy-constructor.
+  Any_Pointset(const Any_Pointset& y);
+
+  //! \name Member Functions that Do Not Modify the Pointset
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  virtual dimension_type space_dimension() const = 0;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  virtual dimension_type affine_dimension() const = 0;
+
+  //! Returns a system of constraints that \p *this satisfies.
+  virtual Constraint_System constraints() const = 0;
+
+#if 0
+  //! Returns a system of congruences that \p *this satisfies.
+  virtual Congruence_System congruences() const = 0;
+#endif
+
+  /*! \brief
+    Returns the relations holding between the pointset \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the pointset \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty pointset.
+  */
+  virtual bool is_empty() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe pointset.
+  */
+  virtual bool is_universe() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  virtual bool is_topologically_closed() const = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  virtual bool is_discrete() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded pointset.
+  */
+  virtual bool is_bounded() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  virtual bool contains_integer_point() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  virtual bool bounds_from_above(const Linear_Expression& expr) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  virtual bool bounds_from_below(const Linear_Expression& expr) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  virtual bool
+  maximize(const Linear_Expression& expr,
+	   Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param point
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  virtual bool maximize(const Linear_Expression& expr,
+			Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+			Generator& point) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  virtual bool
+  minimize(const Linear_Expression& expr,
+	   Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param point
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  virtual bool minimize(const Linear_Expression& expr,
+			Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+			Generator& point) const = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual bool contains(const Any_Pointset& y) const = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual bool strictly_contains(const Any_Pointset& y) const = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual bool is_disjoint_from(const Any_Pointset& y) const = 0;
+
+  //! Checks if all the invariants are satisfied.
+  virtual bool OK() const = 0;
+
+  //@} // Member Functions that Do Not Modify the Any_Pointset
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Any_Pointset
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  virtual void add_constraint(const Constraint& c) = 0;
+
+#if 0
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty pointset and
+    \p g is not a point.
+  */
+  virtual void add_generator(const Generator& g) = 0;
+
+  //! Domain compatibility method.
+  virtual void add_grid_generator(const Grid_Generator& g) const = 0;
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are topology-incompatible
+    or dimension-incompatible.
+  */
+  virtual void add_congruence(const Congruence& cg) = 0;
+#endif
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void add_constraints(const Constraint_System& cs) = 0;
+
+#if 0
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+  */
+  virtual void add_generators(const Generator_System& gs) = 0;
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void add_congruences(const Congruence_System& cgs) = 0;
+#endif
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  virtual void unconstrain(Variable var) = 0;
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  virtual void unconstrain(const Variables_Set& to_be_unconstrained) = 0;
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+    The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void intersection_assign(const Any_Pointset& y) = 0;
+
+
+  /*! \brief
+    Assigns to \p *this the smallest pointset, in the class of
+    \p *this and \p y, that contains both \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void upper_bound_assign(const Any_Pointset& y) = 0;
+
+  /*! \brief
+    Assigns to \p *this the smallest pointset, in the class of \p
+    *this and \p y, that contains the set-theoretic difference of \p
+    *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void difference_assign(const Any_Pointset& y) = 0;
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a pointset, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the pointset, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the pointset and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+	    \vect{\lambda} \in \Rset^{m_1}_+,
+	    \vect{\mu} \in \Rset^{m_2}_+,
+	    \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting pointset is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
+
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
+  */
+  virtual void affine_image(Variable var,
+			    const Linear_Expression& expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one()) = 0;
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering constraints of a pointset, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
+
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the pointset, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting pointset is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  virtual void affine_preimage(Variable var,
+			       const Linear_Expression& expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one()) = 0;
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one()) = 0;
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one()) = 0;
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual void generalized_affine_image(const Linear_Expression& lhs,
+					Relation_Symbol relsym,
+					const Linear_Expression& rhs) = 0;
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual void generalized_affine_preimage(const Linear_Expression& lhs,
+					   Relation_Symbol relsym,
+					   const Linear_Expression& rhs) = 0;
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  virtual
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one()) = 0;
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  virtual
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one()) = 0;
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void time_elapse_assign(const Any_Pointset& y) = 0;
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+#if 0
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const Any_Pointset& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A pointset that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened pointset;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Any_Pointset& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+
+    \param y
+    A pointset that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened pointset;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Any_Pointset& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+#endif
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old pointset
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new pointset, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the pointset \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the pointset
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  virtual void add_space_dimensions_and_embed(dimension_type m) = 0;
+
+  /*! \brief
+    Adds \p m new space dimensions to the pointset
+    and does not embed it in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new pointset, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the pointset \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the pointset
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  virtual void add_space_dimensions_and_project(dimension_type m) = 0;
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  virtual void concatenate_assign(const Any_Pointset& y) = 0;
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  virtual void remove_space_dimensions(const Variables_Set& to_be_removed) = 0;
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  virtual
+  void remove_higher_space_dimensions(dimension_type new_dimension) = 0;
+
+#if 0
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the pointset.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+#endif
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+#if 0
+  friend bool Parma_Polyhedra_Library::operator==(const Any_Pointset& x,
+						  const Any_Pointset& y);
+#endif
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  virtual ~Any_Pointset();
+
+  /*! \brief
+    Swaps \p *this with pointset \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void swap(Any_Pointset& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const = 0;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const = 0;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  virtual int32_t hash_code() const = 0;
+
+  //@} // Miscellaneous Member Functions
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Any_Pointset */
+void swap(Parma_Polyhedra_Library::Any_Pointset& x,
+	  Parma_Polyhedra_Library::Any_Pointset& y);
+
+} // namespace std
+
+#define PPL_ANY_POINTSET_WRAPPER_CLASS(TEMPLATE, WRAPPER_NAME, BASE_CLASS) \
+TEMPLATE								\
+class WRAPPER_NAME : public Any_Pointset {				\
+ private:								\
+  BASE_CLASS x;								\
+ public:								\
+  explicit WRAPPER_NAME(const C_Polyhedron& y)				\
+    : x(y) {								\
+  }									\
+  explicit WRAPPER_NAME(const NNC_Polyhedron& y)			\
+    : x(y) {								\
+  }									\
+  template <typename U>							\
+  explicit WRAPPER_NAME(const Box<U>& y)				\
+    : x(y) {								\
+  }									\
+  template <typename U>							\
+  explicit WRAPPER_NAME(const BD_Shape<U>& y)				\
+    : x(y) {								\
+  }									\
+  template <typename U>					                \
+  explicit WRAPPER_NAME(const Octagonal_Shape<U>& y)			\
+    : x(y) {								\
+  }									\
+									\
+  explicit WRAPPER_NAME(const Constraint_System& y)			\
+    : x(y) {								\
+  }									\
+  explicit WRAPPER_NAME(const Congruence_System& y)			\
+    : x(y) {								\
+  }									\
+									\
+  ~WRAPPER_NAME() {							\
+  }									\
+									\
+  dimension_type space_dimension() const {				\
+    return x.space_dimension();						\
+  }									\
+  dimension_type affine_dimension() const {				\
+    return x.space_dimension();						\
+  }									\
+  Constraint_System constraints() const {				\
+    return x.constraints();						\
+  }									\
+  Congruence_System congruences() const {				\
+    return x.congruences();						\
+  }									\
+									\
+  bool is_empty() const {						\
+    return x.is_empty();						\
+  }									\
+  bool is_universe() const {						\
+    return x.is_universe();						\
+  }									\
+  bool is_bounded() const {						\
+    return x.is_bounded();						\
+  }									\
+  bool is_topologically_closed() const {				\
+    return x.is_topologically_closed();					\
+  }									\
+  bool is_discrete() const {						\
+    return x.is_discrete();						\
+  }									\
+  bool contains_integer_point() const {					\
+    return x.contains_integer_point();					\
+  }									\
+									\
+  bool contains(const Any_Pointset& y) const {				\
+    return x.contains(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  bool strictly_contains(const Any_Pointset& y) const {			\
+    return x.strictly_contains(dynamic_cast<const BASE_CLASS&>(y));	\
+  }									\
+  bool is_disjoint_from(const Any_Pointset& y) const {			\
+    return x.is_disjoint_from(dynamic_cast<const BASE_CLASS&>(y));	\
+  }									\
+									\
+  void add_space_dimensions_and_embed(dimension_type m) {		\
+    return x.add_space_dimensions_and_embed(m);				\
+  }									\
+  void add_space_dimensions_and_project(dimension_type m) {		\
+    return x.add_space_dimensions_and_project(m);			\
+  }									\
+  void remove_space_dimensions(const Variables_Set& to_be_removed) {	\
+    x.remove_space_dimensions(to_be_removed);				\
+  }									\
+  void remove_higher_space_dimensions(dimension_type new_dimension) {	\
+    x.remove_higher_space_dimensions(new_dimension);			\
+  }									\
+									\
+  void add_constraint(const Constraint& c) {				\
+    x.add_constraint(c);						\
+  }									\
+									\
+  void add_constraints(const Constraint_System& cs) {			\
+    x.add_constraints(cs);						\
+  }									\
+									\
+  void intersection_assign(const Any_Pointset& y) {			\
+    x.intersection_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void upper_bound_assign(const Any_Pointset& y) {			\
+    x.upper_bound_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void difference_assign(const Any_Pointset& y) {			\
+    x.difference_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void concatenate_assign(const Any_Pointset& y) {			\
+    x.concatenate_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void time_elapse_assign(const Any_Pointset& y) {			\
+    x.time_elapse_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+									\
+  void affine_image(Variable var,					\
+		    const Linear_Expression& expr,			\
+		    Coefficient_traits::const_reference denominator	\
+		    = Coefficient_one()) {				\
+    x.affine_image(var, expr, denominator);				\
+  }									\
+  void affine_preimage(Variable var,					\
+		       const Linear_Expression& expr,			\
+		       Coefficient_traits::const_reference denominator	\
+		       = Coefficient_one()) {				\
+    x.affine_image(var, expr, denominator);				\
+  }									\
+  void generalized_affine_image(Variable var,				\
+				Relation_Symbol relsym,			\
+				const Linear_Expression& expr,		\
+				Coefficient_traits::const_reference	\
+				denominator = Coefficient_one()) {	\
+    x.generalized_affine_image(var, relsym, expr, denominator);		\
+  }									\
+  void									\
+  generalized_affine_preimage(Variable var,				\
+			      Relation_Symbol relsym,			\
+			      const Linear_Expression& expr,		\
+			      Coefficient_traits::const_reference denominator \
+			      = Coefficient_one()) {			\
+    x.generalized_affine_preimage(var, relsym, expr, denominator);	\
+  }									\
+  virtual void generalized_affine_image(const Linear_Expression& lhs,	\
+					Relation_Symbol relsym,		\
+					const Linear_Expression& rhs) { \
+    x.generalized_affine_image(lhs, relsym, rhs);			\
+  }									\
+  void generalized_affine_preimage(const Linear_Expression& lhs,	\
+				   Relation_Symbol relsym,		\
+				   const Linear_Expression& rhs) {	\
+    x.generalized_affine_preimage(lhs, relsym, rhs);			\
+  }									\
+									\
+  void bounded_affine_image(Variable var,				\
+			    const Linear_Expression& lb_expr,		\
+			    const Linear_Expression& ub_expr,		\
+			    Coefficient_traits::const_reference		\
+			    denominator = Coefficient_one()) {		\
+    x.bounded_affine_image(var, lb_expr, ub_expr, denominator);		\
+  }									\
+  void bounded_affine_preimage(Variable var,				\
+			       const Linear_Expression& lb_expr,	\
+			       const Linear_Expression& ub_expr,	\
+			       Coefficient_traits::const_reference	\
+			       denominator = Coefficient_one()) {	\
+    x.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);	\
+  }									\
+									\
+  bool bounds_from_above(const Linear_Expression& expr) const {		\
+    return x.bounds_from_above(expr);					\
+  }									\
+  bool bounds_from_below(const Linear_Expression& expr) const {		\
+    return x.bounds_from_below(expr);					\
+  }									\
+  bool maximize(const Linear_Expression& expr,				\
+		Coefficient& sup_n, Coefficient& sup_d,			\
+		bool& maximum) const {					\
+    return maximize(expr, sup_n, sup_d, maximum);			\
+  }									\
+  bool maximize(const Linear_Expression& expr,				\
+		Coefficient& sup_n, Coefficient& sup_d,			\
+		bool& maximum, Generator& point) const {		\
+    return maximize(expr, sup_n, sup_d, maximum, point);		\
+  }									\
+  bool minimize(const Linear_Expression& expr,				\
+		Coefficient& inf_n, Coefficient& inf_d,			\
+		bool& minimum) const {					\
+    return minimize(expr, inf_n, inf_d, minimum);			\
+  }									\
+  bool minimize(const Linear_Expression& expr,				\
+		Coefficient& inf_n, Coefficient& inf_d,			\
+		bool& minimum, Generator& point) const {		\
+    return minimize(expr, inf_n, inf_d, minimum, point);		\
+  }									\
+									\
+  memory_size_type total_memory_in_bytes() const {			\
+    return x.total_memory_in_bytes();					\
+  }									\
+  memory_size_type external_memory_in_bytes() const {			\
+    return x.total_memory_in_bytes();					\
+  }									\
+									\
+  int32_t hash_code() const {						\
+    return x.hash_code();						\
+  }									\
+									\
+  bool OK() const {							\
+    return x.OK();							\
+  }									\
+};
+
+namespace Parma_Polyhedra_Library {
+
+PPL_ANY_POINTSET_WRAPPER_CLASS(, C_Polyhedron_Pointset, C_Polyhedron)
+PPL_ANY_POINTSET_WRAPPER_CLASS(, NNC_Polyhedron_Pointset, NNC_Polyhedron)
+//PPL_ANY_POINTSET_WRAPPER_CLASS(, Grid_Pointset, Grid)
+
+PPL_ANY_POINTSET_WRAPPER_CLASS(template <typename T>, Box_Pointset, Box<T>)
+PPL_ANY_POINTSET_WRAPPER_CLASS(template <typename T>, BD_Shape_Pointset, BD_Shape<T>)
+PPL_ANY_POINTSET_WRAPPER_CLASS(template <typename T>, Octagonal_Shape_Pointset, Octagonal_Shape<T>)
+
+//C_Polyhedron_Pointset a(C_Polyhedron(3));
+//Octagonal_Shape_Pointset<double> b(C_Polyhedron(3));
+//BD_Shape_Pointset<double> c(C_Polyhedron(3));
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Any_Pointset.inlines.hh"
+//#include "Any_Pointset.templates.hh"
+
+#endif // !defined(PPL_Any_Pointset_defs_hh)
diff --git a/src/Any_Pointset.inlines.hh b/src/Any_Pointset.inlines.hh
new file mode 100644
index 0000000..9bf12e4
--- /dev/null
+++ b/src/Any_Pointset.inlines.hh
@@ -0,0 +1,38 @@
+/* Any_Pointset class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Any_Pointset_inlines_hh
+#define PPL_Any_Pointset_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Any_Pointset::Any_Pointset() {
+}
+
+inline
+Any_Pointset::~Any_Pointset() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Any_Pointset_inlines_hh)
diff --git a/src/Any_Pointset.types.hh b/src/Any_Pointset.types.hh
new file mode 100644
index 0000000..6659d80
--- /dev/null
+++ b/src/Any_Pointset.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Any_Pointset_types_hh
+#define PPL_Any_Pointset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Any_Pointset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Any_Pointset_types_hh)
diff --git a/src/BDS_Status.idefs.hh b/src/BDS_Status.idefs.hh
index 6a27232..b0acfb4 100644
--- a/src/BDS_Status.idefs.hh
+++ b/src/BDS_Status.idefs.hh
@@ -1,11 +1,11 @@
 /* BD_Shape<T>::Status class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,8 +20,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#ifndef PPL_BD_Status_defs_hh
-#define PPL_BD_Status_defs_hh 1
+#ifndef PPL_BDS_Status_idefs_hh
+#define PPL_BDS_Status_idefs_hh 1
 
 #ifndef PPL_IN_BD_Shape_CLASS
 #error "Do not include BDS_Status.idefs.hh directly; use BD_Shape.defs.hh instead."
@@ -30,7 +30,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 //! A conjunctive assertion about a BD_Shape<T> object.
 /*! \ingroup PPL_CXX_interface
   The assertions supported are:
-  - <EM>zero-dim universe</EM>: the BDS is the zero-dimension
+  - <EM>zero-dim universe</EM>: the BDS is the zero-dimensional
     vector space \f$\Rset^0 = \{\cdot\}\f$;
   - <EM>empty</EM>: the BDS is the empty set;
   - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
@@ -73,11 +73,11 @@ public:
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
     Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
@@ -113,4 +113,4 @@ private:
   void reset(flags_t mask);
 };
 
-#endif // !defined(PPL_BD_Status_defs_hh)
+#endif // !defined(PPL_BDS_Status_idefs_hh)
diff --git a/src/BDS_Status.inlines.hh b/src/BDS_Status.inlines.hh
index 930d783..b9251c7 100644
--- a/src/BDS_Status.inlines.hh
+++ b/src/BDS_Status.inlines.hh
@@ -1,11 +1,11 @@
 /* BD_Shape<T>::Status class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,8 +20,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#ifndef PPL_BD_Status_inlines_hh
-#define PPL_BD_Status_inlines_hh 1
+#ifndef PPL_BDS_Status_inlines_hh
+#define PPL_BDS_Status_inlines_hh 1
 
 namespace Parma_Polyhedra_Library {
 
@@ -161,7 +161,7 @@ BD_Shape<T>::Status::OK() const {
   }
 
   // Shortest-path reduction implies shortest-path closure.
-  if (test_shortest_path_reduced())
+  if (test_shortest_path_reduced()) {
     if (test_shortest_path_closed())
       return true;
     else {
@@ -172,6 +172,7 @@ BD_Shape<T>::Status::OK() const {
 #endif
       return false;
     }
+  }
 
   // Any other case is OK.
   return true;
@@ -224,7 +225,7 @@ BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
     << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
 }
 
-PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status);
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status)
 
 template <typename T>
 bool
@@ -256,11 +257,11 @@ BD_Shape<T>::Status::ascii_load(std::istream& s) {
   else
     reset_shortest_path_reduced();
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
 
 } // namespace Parma_Polyhedra_Library
 
-#endif // !defined(PPL_BD_Status_inlines_hh)
+#endif // !defined(PPL_BDS_Status_inlines_hh)
diff --git a/src/BD_Shape.cc b/src/BD_Shape.cc
index 3f63f58..22a93e2 100644
--- a/src/BD_Shape.cc
+++ b/src/BD_Shape.cc
@@ -1,11 +1,11 @@
 /* BD_Shape class implementation: non-inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,14 +20,14 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include "BD_Shape.defs.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 bool
 PPL::extract_bounded_difference(const Constraint& c,
 				const dimension_type c_space_dim,
@@ -42,12 +42,13 @@ PPL::extract_bounded_difference(const Constraint& c,
   dimension_type non_zero_index[2] = { 0, 0 };
   // Collect the non-zero components of `c'.
   for (dimension_type i = c_space_dim; i-- > 0; )
-    if (c.coefficient(Variable(i)) != 0)
+    if (c.coefficient(Variable(i)) != 0) {
       if (c_num_vars <= 1)
 	non_zero_index[c_num_vars++] = i + 1;
       else
 	// Constraint `c' is not a bounded difference.
 	return false;
+    }
 
   // Make sure that `c' is indeed a bounded difference,
   // i.e., it has one of the following forms:
@@ -80,7 +81,7 @@ PPL::extract_bounded_difference(const Constraint& c,
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void
 PPL::compute_leader_indices(const std::vector<dimension_type>& predecessor,
 			    std::vector<dimension_type>& indices) {
@@ -90,7 +91,7 @@ PPL::compute_leader_indices(const std::vector<dimension_type>& predecessor,
   assert(indices.size() == 0);
   assert(0 == predecessor[0]);
   indices.push_back(0);
-  for (dimension_type i = 1, iend = predecessor.size(); i != iend; ++i)
+  for (dimension_type i = 1, p_size = predecessor.size(); i != p_size; ++i)
     if (i == predecessor[i])
       indices.push_back(i);
 }
diff --git a/src/BD_Shape.defs.hh b/src/BD_Shape.defs.hh
index f93735d..9d203d6 100644
--- a/src/BD_Shape.defs.hh
+++ b/src/BD_Shape.defs.hh
@@ -1,11 +1,11 @@
 /* BD_Shape class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,21 +27,26 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "globals.defs.hh"
 #include "Constraint.types.hh"
 #include "Generator.types.hh"
+#include "Congruence.types.hh"
 #include "Linear_Expression.types.hh"
 #include "Constraint_System.types.hh"
 #include "Generator_System.types.hh"
+#include "Congruence_System.types.hh"
 #include "Poly_Con_Relation.types.hh"
 #include "Poly_Gen_Relation.types.hh"
 #include "Polyhedron.types.hh"
+#include "Box.types.hh"
+#include "Grid.types.hh"
+#include "Octagonal_Shape.types.hh"
 #include "Variable.defs.hh"
+#include "Variables_Set.types.hh"
 #include "DB_Matrix.defs.hh"
 #include "DB_Row.defs.hh"
 #include "Checked_Number.defs.hh"
+#include "Bit_Matrix.defs.hh"
 #include <cstddef>
 #include <iosfwd>
 #include <vector>
-#include <deque>
-
 
 namespace Parma_Polyhedra_Library {
 
@@ -62,8 +67,7 @@ operator<<(std::ostream& s, const BD_Shape<T>& bds);
 } // namespace IO_Operators
 
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
-/*!
-  \relates BD_Shape
+/*! \relates BD_Shape
   Note that \p x and \p y may be dimension-incompatible shapes:
   in this case, the value <CODE>false</CODE> is returned.
 */
@@ -71,8 +75,7 @@ template <typename T>
 bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
 
 //! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same BDS.
-/*!
- \relates BD_Shape
+/*! \relates BD_Shape
   Note that \p x and \p y may be dimension-incompatible shapes:
   in this case, the value <CODE>true</CODE> is returned.
 */
@@ -92,9 +95,9 @@ bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
 */
 template <typename To, typename T>
 bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const BD_Shape<T>& x,
-				 const BD_Shape<T>& y,
-				 const Rounding_Dir dir);
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
 
 //! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -109,9 +112,9 @@ bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename Temp, typename To, typename T>
 bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const BD_Shape<T>& x,
-				 const BD_Shape<T>& y,
-				 const Rounding_Dir dir);
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
 
 //! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -126,12 +129,12 @@ bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename Temp, typename To, typename T>
 bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const BD_Shape<T>& x,
-				 const BD_Shape<T>& y,
-				 const Rounding_Dir dir,
-				 Temp& tmp0,
-				 Temp& tmp1,
-				 Temp& tmp2);
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
 
 //! Computes the euclidean distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -146,9 +149,9 @@ bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename To, typename T>
 bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const BD_Shape<T>& x,
-			       const BD_Shape<T>& y,
-			       const Rounding_Dir dir);
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
 
 //! Computes the euclidean distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -163,9 +166,9 @@ bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename Temp, typename To, typename T>
 bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const BD_Shape<T>& x,
-			       const BD_Shape<T>& y,
-			       const Rounding_Dir dir);
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
 
 //! Computes the euclidean distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -180,12 +183,12 @@ bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename Temp, typename To, typename T>
 bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const BD_Shape<T>& x,
-			       const BD_Shape<T>& y,
-			       const Rounding_Dir dir,
-			       Temp& tmp0,
-			       Temp& tmp1,
-			       Temp& tmp2);
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
 
 //! Computes the \f$L_\infty\f$ distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -200,9 +203,9 @@ bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename To, typename T>
 bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				const BD_Shape<T>& x,
-				const BD_Shape<T>& y,
-				const Rounding_Dir dir);
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
 
 //! Computes the \f$L_\infty\f$ distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -217,9 +220,9 @@ bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename Temp, typename To, typename T>
 bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				const BD_Shape<T>& x,
-				const BD_Shape<T>& y,
-				const Rounding_Dir dir);
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
 
 //! Computes the \f$L_\infty\f$ distance between \p x and \p y.
 /*! \relates BD_Shape
@@ -234,16 +237,16 @@ bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 */
 template <typename Temp, typename To, typename T>
 bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				const BD_Shape<T>& x,
-				const BD_Shape<T>& y,
-				const Rounding_Dir dir,
-				Temp& tmp0,
-				Temp& tmp1,
-				Temp& tmp2);
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Decodes the constraint \p c as a bounded difference.
-/*!
+/*! \relates BD_Shape
   \return
   <CODE>true</CODE> if the constraint \p c is a
   \ref Bounded_Difference_Shapes "bounded difference";
@@ -276,19 +279,20 @@ bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
   then it will be set to the value of the first non-zero coefficient
   in \p c.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 bool extract_bounded_difference(const Constraint& c,
-				const dimension_type c_space_dim,
-				dimension_type& c_num_vars,
-				dimension_type& c_first_var,
-				dimension_type& c_second_var,
-				Coefficient& c_coeff);
+                                dimension_type c_space_dim,
+                                dimension_type& c_num_vars,
+                                dimension_type& c_first_var,
+                                dimension_type& c_second_var,
+                                Coefficient& c_coeff);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Extracts leader indices from the predecessor relation.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void compute_leader_indices(const std::vector<dimension_type>& predecessor,
-			    std::vector<dimension_type>& indices);
+                            std::vector<dimension_type>& indices);
 
 } // namespace Parma_Polyhedra_Library
 
@@ -395,7 +399,7 @@ private:
 
 public:
   //! The numeric base type upon which bounded differences are built.
-  typedef T base_type;
+  typedef T coefficient_type_base;
 
   /*! \brief
     The (extended) numeric type of the inhomogeneous term of the
@@ -406,6 +410,16 @@ public:
   //! Returns the maximum space dimension that a BDS can handle.
   static dimension_type max_space_dimension();
 
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
   //! \name Constructors, Assignment, Swap and Destructor
   //@{
 
@@ -418,14 +432,22 @@ public:
     Specifies whether the universe or the empty BDS has to be built.
   */
   explicit BD_Shape(dimension_type num_dimensions = 0,
-		    Degenerate_Element kind = UNIVERSE);
+                    Degenerate_Element kind = UNIVERSE);
 
   //! Ordinary copy-constructor.
-  BD_Shape(const BD_Shape& y);
+  /*!
+    The complexity argument is ignored.
+  */
+  BD_Shape(const BD_Shape& y,
+           Complexity_Class complexity = ANY_COMPLEXITY);
 
   //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
   template <typename U>
-  explicit BD_Shape(const BD_Shape<U>& y);
+  explicit BD_Shape(const BD_Shape<U>& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
   //! Builds a BDS from the system of constraints \p cs.
   /*!
@@ -440,7 +462,16 @@ public:
     \exception std::invalid_argument
     Thrown if the system of constraints \p cs contains strict inequalities.
   */
-  BD_Shape(const Constraint_System& cs);
+  explicit BD_Shape(const Constraint_System& cs);
+
+  //! Builds a BDS from a system of congruences.
+  /*!
+    The BDS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences: some elements may be safely ignored.
+  */
+  explicit BD_Shape(const Congruence_System& cgs);
 
   //! Builds a BDS from the system of generators \p gs.
   /*!
@@ -450,7 +481,7 @@ public:
     \exception std::invalid_argument
     Thrown if the system of generators is not empty but has no points.
   */
-  BD_Shape(const Generator_System& gs);
+  explicit BD_Shape(const Generator_System& gs);
 
   //! Builds a BDS from the polyhedron \p ph.
   /*!
@@ -459,7 +490,67 @@ public:
     \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
     smallest one containing \p ph.
   */
-  BD_Shape(const Polyhedron& ph, Complexity_Class complexity = ANY_COMPLEXITY);
+  explicit BD_Shape(const Polyhedron& ph,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS that approximates a box.
+  /*!
+    The BDS inherits the space dimension of the box.
+    The built BDS is the most precise BDS that includes the box.
+
+    \param box
+    The bounding box representing the BDS to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit BD_Shape(const Box<Interval>& box,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS out of a grid.
+  /*!
+    The BDS inherits the space dimension of the grid.
+    The built BDS is the most precise BDS that includes the grid.
+
+    \param grid
+    The grid used to build the BDS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit BD_Shape(const Grid& grid,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS from an octagonal shape.
+  /*!
+    The BDS inherits the space dimension of the octagonal shape.
+    The built BDS is the most precise BDS that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the BDS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit BD_Shape(const Octagonal_Shape<U>& os,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
   /*! \brief
     The assignment operator
@@ -497,6 +588,151 @@ public:
   //! Returns a minimized system of constraints defining \p *this.
   Constraint_System minimized_constraints() const;
 
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
   //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
   /*!
     \exception std::invalid_argument
@@ -511,15 +747,28 @@ public:
   */
   bool strictly_contains(const BD_Shape& y) const;
 
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const BD_Shape& y) const;
+
   //! Returns the relations holding between \p *this and the constraint \p c.
   /*!
     \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible
-    or if \p c is a strict inequality or if \p c is not a bounded
-    difference constraint.
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
   */
   Poly_Con_Relation relation_with(const Constraint& c) const;
 
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
   //! Returns the relations holding between \p *this and the generator \p g.
   /*!
     \exception std::invalid_argument
@@ -533,6 +782,33 @@ public:
   //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
   bool is_universe() const;
 
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded BDS.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this satisfies
     all its invariants.
@@ -572,10 +848,46 @@ public:
     \exception std::invalid_argument
     Thrown if \p *this and constraint \p c are dimension-incompatible,
     or if \p c is a strict inequality.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_constraint_and_minimize(const Constraint& c);
 
   /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
+
+    \param cg
+    The congruence to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences
+    of \p *this, minimizing the result
+
+    \param cg
+    The congruence to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are topology-incompatible
+    or dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Congruence& cg);
+
+  /*! \brief
     Adds the constraints in \p cs to the system of bounded differences
     defining \p *this.
 
@@ -590,6 +902,24 @@ public:
   void add_constraints(const Constraint_System& cs);
 
   /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
     Adds the constraints in \p cs to the system of bounded differences
     defining \p *this.
 
@@ -603,9 +933,188 @@ public:
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible,
     or if \p cs contains a strict inequality.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_constraints_and_minimize(const Constraint_System& cs);
 
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds a copy of the congruences in \p cs to the system
+    of congruences of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cs);
+
+  // FIXME
+  /*! \brief
+    Adds the congruences in \p cs to the system of congruences
+    of \p *this (without minimizing the result).
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  // FIXME
+  /*! \brief
+    Adds the congruences in \p cs to the system of congruences
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint. If it is not a bounded difference, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    bounded differences  of \p *this.
+
+    \param cg
+    The congruence. If it is not a bounded difference equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    bounded differences defining \p *this.
+
+    \param  cs
+    The constraint system to be used. Constraints that are not bounded
+    differences are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    bounded differences defining \p *this.
+
+    \param  cgs
+    The congruence system to be used. Congruences that are not bounded
+    difference equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
   //! Assigns to \p *this the intersection of \p *this and \p y.
   /*!
     \exception std::invalid_argument
@@ -620,6 +1129,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p y are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool intersection_assign_and_minimize(const BD_Shape& y);
 
@@ -641,6 +1153,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p y are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool bds_hull_assign_and_minimize(const BD_Shape& y);
 
@@ -674,6 +1189,17 @@ public:
   void difference_assign(const BD_Shape& y);
 
   /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const BD_Shape& y);
+
+  /*! \brief
     Assigns to \p *this the
     \ref Single_Update_Affine_Functions "affine image"
     of \p *this under the function mapping variable \p var into the
@@ -693,9 +1219,9 @@ public:
     are dimension-incompatible or if \p var is not a dimension of \p *this.
   */
   void affine_image(Variable var,
-		    const Linear_Expression& expr,
-		    Coefficient_traits::const_reference denominator
-		    = Coefficient_one());
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
 
   /*! \brief
     Assigns to \p *this the
@@ -717,9 +1243,9 @@ public:
     are dimension-incompatible or if \p var is not a dimension of \p *this.
   */
   void affine_preimage(Variable var,
-		       const Linear_Expression& expr,
-		       Coefficient_traits::const_reference denominator
-		       = Coefficient_one());
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
 
   /*! \brief
     Assigns to \p *this the image of \p *this with respect to the
@@ -746,10 +1272,10 @@ public:
     of \p *this or if \p relsym is a strict relation symbol.
   */
   void generalized_affine_image(Variable var,
-				Relation_Symbol relsym,
-				const Linear_Expression& expr,
-				Coefficient_traits::const_reference denominator
-				= Coefficient_one());
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
 
   /*! \brief
     Assigns to \p *this the image of \p *this with respect to the
@@ -771,8 +1297,8 @@ public:
     or if \p relsym is a strict relation symbol.
   */
   void generalized_affine_image(const Linear_Expression& lhs,
-				Relation_Symbol relsym,
-				const Linear_Expression& rhs);
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
 
   /*! \brief
     Assigns to \p *this the preimage of \p *this with respect to the
@@ -799,12 +1325,98 @@ public:
     of \p *this or if \p relsym is a strict relation symbol.
   */
   void generalized_affine_preimage(Variable var,
-				   Relation_Symbol relsym,
-				   const Linear_Expression& expr,
-				   Coefficient_traits::const_reference
-				   denominator = Coefficient_one());
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
 
   /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+  /*! \brief
     Assigns to \p *this the result of computing the
     \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
 
@@ -813,6 +1425,9 @@ public:
   */
   void time_elapse_assign(const BD_Shape& y);
 
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
   /*! \brief
     Assigns to \p *this the result of computing the
     \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
@@ -853,8 +1468,8 @@ public:
   */
   template <typename Iterator>
   void CC76_extrapolation_assign(const BD_Shape& y,
-				 Iterator first, Iterator last,
-				 unsigned* tp = 0);
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
 
   /*! \brief
     Assigns to \p *this the result of computing the
@@ -894,8 +1509,8 @@ public:
     if \p cs contains a strict inequality.
   */
   void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
-					   const Constraint_System& cs,
-					   unsigned* tp = 0);
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
 
   /*! \brief
     Assigns to \p *this the result of restoring in \p y the constraints
@@ -912,7 +1527,7 @@ public:
     As was the case for widening operators, the argument \p y is meant to
     denote the value computed in the previous iteration step, whereas
     \p *this denotes the value computed in the current iteration step
-    (in the <EM>descreasing</EM> iteration sequence). Hence, the call
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
     <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
     the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
   */
@@ -939,8 +1554,8 @@ public:
     if \p cs contains a strict inequality.
   */
   void limited_CC76_extrapolation_assign(const BD_Shape& y,
-					 const Constraint_System& cs,
-					 unsigned* tp = 0);
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
 
   /*! \brief
     Assigns to \p *this the result of computing the
@@ -959,6 +1574,9 @@ public:
   */
   void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
 
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
   /*! \brief
     Improves the result of the \ref H79_widening "H79-widening"
     computation by also enforcing those constraints in \p cs that are
@@ -979,8 +1597,8 @@ public:
     Thrown if \p *this, \p y and \p cs are dimension-incompatible.
   */
   void limited_H79_extrapolation_assign(const BD_Shape& y,
-					const Constraint_System& cs,
-					unsigned* tp = 0);
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
 
   //@} Space-Dimension Preserving Member Functions that May Modify [...]
 
@@ -1031,27 +1649,12 @@ public:
   void add_space_dimensions_and_project(dimension_type m);
 
   /*! \brief
-    Seeing a BDS as a set of tuples (its points),
-    assigns to \p *this all the tuples that can be obtained by concatenating,
-    in the order given, a tuple of \p *this with a tuple of \p y.
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
 
-    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the BDSs
-    corresponding, on entry, to \p *this and \p y, respectively.
-    Upon successful completion, \p *this will represent the BDS
-    \f$R \sseq \Rset^{n+m}\f$ such that
-    \f[
-      R \defeq
-          \Bigl\{\,
-            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
-          \Bigm|
-            (x_1, \ldots, x_n)^\transpose \in B,
-            (y_1, \ldots, y_m)^\transpose \in D
-          \,\Bigl\}.
-    \f]
-    Another way of seeing it is as follows: first increases the space
-    dimension of \p *this by adding \p y.space_dimension() new
-    dimensions; then adds to the system of constraints of \p *this a
-    renamed-apart version of the constraints of \p y.
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
   */
   void concatenate_assign(const BD_Shape& y);
 
@@ -1083,7 +1686,7 @@ public:
     \param pfunc
     The partial function specifying the destiny of each dimension.
 
-    The template class PartialFunction must provide the following
+    The template class Partial_Function must provide the following
     methods.
     \code
       bool has_empty_codomain() const
@@ -1113,24 +1716,86 @@ public:
     \ref Mapping_the_Dimensions_of_the_Vector_Space
     "specification of the mapping operator".
   */
-  template <typename PartialFunction>
-  void map_space_dimensions(const PartialFunction& pfunc);
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
   //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
-  friend bool Parma_Polyhedra_Library::operator==<T>(const BD_Shape<T>& x,
-						     const BD_Shape<T>& y);
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  friend bool operator==<T>(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
   template <typename Temp, typename To, typename U>
   friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
   (Checked_Number<To, Extended_Number_Policy>& r,
@@ -1149,6 +1814,7 @@ public:
 
 private:
   template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
 
   //! The matrix representing the system of bounded differences.
   DB_Matrix<N> dbm;
@@ -1160,15 +1826,19 @@ private:
   //! The status flags to keep track of the internal state.
   Status status;
 
-  //! A matrix of Booleans indicating which constraints are redundant.
-  std::vector<std::deque<bool> > redundancy_dbm;
+  //! A matrix indicating which constraints are redundant.
+  Bit_Matrix redundancy_dbm;
+
+  //! Returns <CODE>true</CODE> if the BDS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the BDS is known to be empty.
 
-  //! Returns <CODE>true</CODE> if the BDS is known to be empty.
-  /*!
     The return value <CODE>false</CODE> does not necessarily
     implies that \p *this is non-empty.
   */
-  bool marked_empty()const;
+  bool marked_empty() const;
 
   /*! \brief
     Returns <CODE>true</CODE> if the system of bounded differences
@@ -1177,7 +1847,7 @@ private:
     The return value <CODE>false</CODE> does not necessarily
     implies that <CODE>this->dbm</CODE> is not shortest-path closed.
   */
-  bool marked_shortest_path_closed()const;
+  bool marked_shortest_path_closed() const;
 
   /*! \brief
     Returns <CODE>true</CODE> if the system of bounded differences
@@ -1186,7 +1856,7 @@ private:
     The return value <CODE>false</CODE> does not necessarily
     implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
   */
-  bool marked_shortest_path_reduced()const;
+  bool marked_shortest_path_reduced() const;
 
   //! Turns \p *this into an empty BDS.
   void set_empty();
@@ -1194,6 +1864,18 @@ private:
   //! Turns \p *this into an zero-dimensional universe BDS.
   void set_zero_dim_univ();
 
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_closed();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_reduced();
+
+  //! Marks \p *this as possibly not shortest-path closed.
+  void reset_shortest_path_closed();
+
+  //! Marks \p *this as possibly not shortest-path reduced.
+  void reset_shortest_path_reduced();
+
   //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
   void shortest_path_closure_assign() const;
 
@@ -1211,12 +1893,109 @@ private:
   */
   bool is_shortest_path_reduced() const;
 
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
   //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
-  void add_dbm_constraint(dimension_type i, dimension_type j, N k);
+  void add_dbm_constraint(dimension_type i, dimension_type j, const N& k);
+
   //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
   void add_dbm_constraint(dimension_type i, dimension_type j,
-			  Coefficient_traits::const_reference num,
-			  Coefficient_traits::const_reference den);
+                          Coefficient_traits::const_reference num,
+                          Coefficient_traits::const_reference den);
+
+  /*! \brief
+    Adds to the BDS the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var, Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
 
   //! Removes all the constraints on row/column \p v.
   void forget_all_dbm_constraints(dimension_type v);
@@ -1227,7 +2006,7 @@ private:
   /*!
     For each dbm index \p u (less than or equal to \p last_v and different
     from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
-    starting from \p pos_sum which is an upper bound for \p v.
+    starting from \p ub_v which is an upper bound for \p v.
 
     The shortest-path closure is able to deduce the constraint
     <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
@@ -1239,16 +2018,16 @@ private:
         <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
   */
   void deduce_v_minus_u_bounds(dimension_type v,
-			       dimension_type last_v,
-			       const Linear_Expression& sc_expr,
-			       Coefficient_traits::const_reference sc_den,
-			       const N& pos_sum);
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_den,
+                               const N& ub_v);
 
   //! An helper function for the computation of affine relations.
   /*!
     For each dbm index \p u (less than or equal to \p last_v and different
     from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
-    starting from \p neg_sum which is a lower bound for \p v.
+    starting from \p minus_lb_v which is a lower bound for \p v.
 
     The shortest-path closure is able to deduce the constraint
     <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
@@ -1261,17 +2040,17 @@ private:
         <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
   */
   void deduce_u_minus_v_bounds(dimension_type v,
-			       dimension_type last_v,
-			       const Linear_Expression& sc_expr,
-			       Coefficient_traits::const_reference sc_den,
-			       const N& neg_sum);
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_den,
+                               const N& minus_lb_v);
 
   /*! \brief
     Adds to \p limiting_shape the bounded differences in \p cs
     that are satisfied by \p *this.
   */
   void get_limiting_shape(const Constraint_System& cs,
-			  BD_Shape& limiting_shape) const;
+                          BD_Shape& limiting_shape) const;
 
   //! Compute the (zero-equivalence classes) predecessor relation.
   /*!
@@ -1285,40 +2064,35 @@ private:
   */
   void compute_leaders(std::vector<dimension_type>& leaders) const;
 
-#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
-  friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<<>(std::ostream& s,
-						      const BD_Shape<T>& c);
-#else
-  // This is too lax than wanted.
-  template <typename U>
   friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
-						    const BD_Shape<U>& c);
-#endif
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const BD_Shape<T>& c);
 
   //! \name Exception Throwers
   //@{
   void throw_dimension_incompatible(const char* method,
-				    const BD_Shape& x) const;
+                                    const BD_Shape& x) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
 
   void throw_dimension_incompatible(const char* method,
-				    dimension_type required_dim) const;
+                                    const Constraint& c) const;
 
   void throw_dimension_incompatible(const char* method,
-				    const Constraint& c) const;
+                                    const Congruence& cg) const;
 
   void throw_dimension_incompatible(const char* method,
-				    const Generator& g) const;
+                                    const Generator& g) const;
 
   void throw_dimension_incompatible(const char* method,
-				    const char* name_row,
-				    const Linear_Expression& y) const;
+                                    const char* name_row,
+                                    const Linear_Expression& y) const;
 
   static void throw_constraint_incompatible(const char* method);
 
   static void throw_expression_too_complex(const char* method,
-					   const Linear_Expression& e);
+                                           const Linear_Expression& e);
 
   static void throw_generic(const char* method, const char* reason);
   //@} // Exception Throwers
@@ -1331,7 +2105,7 @@ namespace std {
 /*! \relates Parma_Polyhedra_Library::BD_Shape */
 template <typename T>
 void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
-	  Parma_Polyhedra_Library::BD_Shape<T>& y);
+          Parma_Polyhedra_Library::BD_Shape<T>& y);
 
 } // namespace std
 
diff --git a/src/BD_Shape.inlines.hh b/src/BD_Shape.inlines.hh
index ee435d1..3401e42 100644
--- a/src/BD_Shape.inlines.hh
+++ b/src/BD_Shape.inlines.hh
@@ -1,11 +1,11 @@
 /* BD_Shape class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,9 +23,14 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_BD_Shape_inlines_hh
 #define PPL_BD_Shape_inlines_hh 1
 
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
 #include "C_Polyhedron.defs.hh"
+#include "Grid.defs.hh"
+#include "Octagonal_Shape.defs.hh"
 #include "Poly_Con_Relation.defs.hh"
 #include "Poly_Gen_Relation.defs.hh"
+#include "Temp.defs.hh"
 #include <cassert>
 #include <vector>
 #include <iostream>
@@ -33,71 +38,6 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
-namespace Implementation {
-namespace BD_Shapes {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Extract the numerator and denominator components of \p from.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T, typename Policy>
-inline void
-numer_denom(const Checked_Number<T, Policy>& from,
-	    Coefficient& num, Coefficient& den) {
-  assert(!is_not_a_number(from)
-	 && !is_minus_infinity(from)
-	 && !is_plus_infinity(from));
-  mpq_class q;
-  assign_r(q, from, ROUND_NOT_NEEDED);
-  num = q.get_num();
-  den = q.get_den();
-}
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T, typename Policy>
-inline void
-div_round_up(Checked_Number<T, Policy>& to,
-	     Coefficient_traits::const_reference x,
-	     Coefficient_traits::const_reference y) {
-  mpq_class qx;
-  mpq_class qy;
-  // Note: this code assumes that a Coefficient is always convertible
-  // to an mpq_class without loss of precision.
-  assign_r(qx, x, ROUND_NOT_NEEDED);
-  assign_r(qy, y, ROUND_NOT_NEEDED);
-  div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
-  assign_r(to, qx, ROUND_UP);
-}
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Assigns to \p x the minimum between \p x and \p y.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename N>
-inline void
-min_assign(N& x, const N& y) {
-  if (x > y)
-    x = y;
-}
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Assigns to \p x the maximum between \p x and \p y.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename N>
-inline void
-max_assign(N& x, const N& y) {
-  if (x < y)
-    x = y;
-}
-
-} // namespace BD_Shapes
-} // namespace Implementation
-
-
 template <typename T>
 inline dimension_type
 BD_Shape<T>::max_space_dimension() {
@@ -109,34 +49,62 @@ BD_Shape<T>::max_space_dimension() {
 
 template <typename T>
 inline bool
+BD_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
 BD_Shape<T>::marked_empty() const {
   return status.test_empty();
 }
 
 template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+  return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+  return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
 inline void
 BD_Shape<T>::set_empty() {
   status.set_empty();
-  assert(OK());
-  assert(marked_empty());
 }
 
 template <typename T>
 inline void
-BD_Shape<T>::set_zero_dim_univ() {
-  status.set_zero_dim_univ();
+BD_Shape<T>::set_shortest_path_closed() {
+  status.set_shortest_path_closed();
 }
 
 template <typename T>
-inline bool
-BD_Shape<T>::marked_shortest_path_closed() const {
-  return status.test_shortest_path_closed();
+inline void
+BD_Shape<T>::set_shortest_path_reduced() {
+  status.set_shortest_path_reduced();
 }
 
 template <typename T>
-inline bool
-BD_Shape<T>::marked_shortest_path_reduced() const {
-  return status.test_shortest_path_reduced();
+inline void
+BD_Shape<T>::reset_shortest_path_closed() {
+  status.reset_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_reduced() {
+  status.reset_shortest_path_reduced();
 }
 
 template <typename T>
@@ -149,14 +117,14 @@ BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
   else {
     if (num_dimensions > 0)
       // A (non zero-dim) universe BDS is closed.
-      status.set_shortest_path_closed();
+      set_shortest_path_closed();
   }
   assert(OK());
 }
 
 template <typename T>
 inline
-BD_Shape<T>::BD_Shape(const BD_Shape& y)
+BD_Shape<T>::BD_Shape(const BD_Shape& y, Complexity_Class)
   : dbm(y.dbm), status(y.status), redundancy_dbm() {
   if (y.marked_shortest_path_reduced())
     redundancy_dbm = y.redundancy_dbm;
@@ -165,16 +133,22 @@ BD_Shape<T>::BD_Shape(const BD_Shape& y)
 template <typename T>
 template <typename U>
 inline
-BD_Shape<T>::BD_Shape(const BD_Shape<U>& y)
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y, Complexity_Class)
   : dbm(y.dbm), status(), redundancy_dbm() {
   // TODO: handle flags properly, possibly taking special cases into account.
   if (y.marked_empty())
     set_empty();
-  else if (y.status.test_zero_dim_univ())
+  else if (y.marked_zero_dim_univ())
     set_zero_dim_univ();
 }
 
 template <typename T>
+inline Congruence_System
+BD_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
+
+template <typename T>
 inline bool
 BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
   add_constraint(c);
@@ -183,12 +157,19 @@ BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
 }
 
 template <typename T>
+inline bool
+BD_Shape<T>::add_congruence_and_minimize(const Congruence& cg) {
+  add_congruence(cg);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
 inline void
 BD_Shape<T>::add_constraints(const Constraint_System& cs) {
   for (Constraint_System::const_iterator i = cs.begin(),
-	 iend = cs.end(); i != iend; ++i)
+	 cs_end = cs.end(); i != cs_end; ++i)
     add_constraint(*i);
-  assert(OK());
 }
 
 template <typename T>
@@ -200,42 +181,117 @@ BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
 }
 
 template <typename T>
+inline void
+BD_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_recycled_constraints_and_minimize(Constraint_System& cs) {
+  return add_constraints_and_minimize(cs);
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  add_constraints(cs);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_congruences_and_minimize(const Congruence_System& cgs) {
+  add_congruences(cgs);
+  return !is_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
+  return add_congruences_and_minimize(cgs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i)
+    refine_with_constraint(*i);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  refine_with_constraints(cs);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
 inline
 BD_Shape<T>::BD_Shape(const Constraint_System& cs)
   : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
   if (cs.space_dimension() > 0)
     // A (non zero-dim) universe BDS is shortest-path closed.
-    status.set_shortest_path_closed();
+    set_shortest_path_closed();
   add_constraints(cs);
-  assert(OK());
 }
 
 template <typename T>
-inline dimension_type
-BD_Shape<T>::affine_dimension() const {
-  const dimension_type space_dim = space_dimension();
-
-  // Shortest-path closure is necessary to detect emptiness
-  // and all (possibly implicit) equalities.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return 0;
-
-  // The vector `predecessor' is used to represent equivalence classes:
-  // `predecessor[i] == i' if and only if `i' is the leader of its
-  // equivalence class (i.e., the minimum index in the class);
-  std::vector<dimension_type> predecessor;
-  compute_predecessors(predecessor);
+template <typename Interval>
+inline
+BD_Shape<T>::BD_Shape(const Box<Interval>& box,
+                      Complexity_Class)
+  : dbm(box.space_dimension() + 1), status(), redundancy_dbm() {
+  if (box.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(box.constraints());
+  return;
+}
 
-  // Due to the fictitious variable `0', the affine dimension is one
-  // less the number of equivalence classes.
-  dimension_type affine_dim = 0;
-  // Note: disregard the first equivalence class.
-  for (dimension_type i = 1; i <= space_dim; ++i)
-    if (predecessor[i] == i)
-      ++affine_dim;
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Grid& grid,
+                      Complexity_Class)
+  : dbm(grid.space_dimension() + 1), status(), redundancy_dbm() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_congruences(grid.congruences());
+  return;
+}
 
-  return affine_dim;
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const Octagonal_Shape<U>& os,
+                      Complexity_Class)
+  : dbm(os.space_dimension() + 1), status(), redundancy_dbm() {
+  if (os.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(os.constraints());
+  return;
 }
 
 template <typename T>
@@ -276,6 +332,70 @@ BD_Shape<T>::is_empty() const {
 
 template <typename T>
 inline bool
+BD_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+		      Coefficient& sup_n, Coefficient& sup_d,
+		      bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+		      Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		      Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+		      Coefficient& inf_n, Coefficient& inf_d,
+		      bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+		      Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		      Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_topologically_closed() const {
+  return true;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::topological_closure_assign() {
+  // Nothing to be done.
+  return;
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
 operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
   const dimension_type x_space_dim = x.space_dimension();
   // Dimension-compatibility check.
@@ -283,11 +403,12 @@ operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
     return false;
 
   // Zero-dim BDSs are equal if and only if they are both empty or universe.
-  if (x_space_dim == 0)
+  if (x_space_dim == 0) {
     if (x.marked_empty())
       return y.marked_empty();
     else
       return !y.marked_empty();
+  }
 
   // The exact equivalence test requires shortest-path closure.
   x.shortest_path_closure_assign();
@@ -304,6 +425,7 @@ operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
   return x.dbm == y.dbm;
 }
 
+/*! \relates BD_Shape */
 template <typename T>
 inline bool
 operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
@@ -330,7 +452,7 @@ rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
     if (x.marked_empty() == y.marked_empty())
       assign_r(r, 0, ROUND_NOT_NEEDED);
     else
-      r = PLUS_INFINITY;
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
     return true;
   }
 
@@ -344,7 +466,7 @@ rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
    if (x.marked_empty() == y.marked_empty())
       assign_r(r, 0, ROUND_NOT_NEEDED);
     else
-      r = PLUS_INFINITY;
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
    return true;
   }
 
@@ -358,9 +480,10 @@ rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 			    const BD_Shape<T>& x,
 			    const BD_Shape<T>& y,
 			    const Rounding_Dir dir) {
-  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
   return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
 }
 
@@ -394,7 +517,7 @@ euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
     if (x.marked_empty() == y.marked_empty())
       assign_r(r, 0, ROUND_NOT_NEEDED);
     else
-      r = PLUS_INFINITY;
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
     return true;
   }
 
@@ -408,7 +531,7 @@ euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
    if (x.marked_empty() == y.marked_empty())
       assign_r(r, 0, ROUND_NOT_NEEDED);
     else
-      r = PLUS_INFINITY;
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
    return true;
   }
 
@@ -422,9 +545,10 @@ euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 			  const BD_Shape<T>& x,
 			  const BD_Shape<T>& y,
 			  const Rounding_Dir dir) {
-  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
   return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
 }
 
@@ -458,7 +582,7 @@ l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
     if (x.marked_empty() == y.marked_empty())
       assign_r(r, 0, ROUND_NOT_NEEDED);
     else
-      r = PLUS_INFINITY;
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
     return true;
   }
 
@@ -472,7 +596,7 @@ l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
    if (x.marked_empty() == y.marked_empty())
       assign_r(r, 0, ROUND_NOT_NEEDED);
     else
-      r = PLUS_INFINITY;
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
    return true;
   }
 
@@ -486,9 +610,10 @@ l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 			   const BD_Shape<T>& x,
 			   const BD_Shape<T>& y,
 			   const Rounding_Dir dir) {
-  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
   return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
 }
 
@@ -506,16 +631,15 @@ template <typename T>
 inline void
 BD_Shape<T>::add_dbm_constraint(const dimension_type i,
 				const dimension_type j,
-				N k) {
+				const N& k) {
   // Private method: the caller has to ensure the following.
   assert(i <= space_dimension() && j <= space_dimension() && i != j);
   N& dbm_ij = dbm[i][j];
   if (dbm_ij > k) {
     dbm_ij = k;
     if (marked_shortest_path_closed())
-      status.reset_shortest_path_closed();
+      reset_shortest_path_closed();
   }
-  assert(OK());
 }
 
 template <typename T>
@@ -527,12 +651,27 @@ BD_Shape<T>::add_dbm_constraint(const dimension_type i,
   // Private method: the caller has to ensure the following.
   assert(i <= space_dimension() && j <= space_dimension() && i != j);
   assert(den != 0);
-  N k;
-  Implementation::BD_Shapes::div_round_up(k, num, den);
+  DIRTY_TEMP(N, k);
+  div_round_up(k, num, den);
   add_dbm_constraint(i, j, k);
 }
 
 template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // See the polyhedra documentation.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.time_elapse_assign(py);
+  BD_Shape<T> x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
 inline bool
 BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
   const BD_Shape<T>& x = *this;
@@ -597,7 +736,7 @@ BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
   // Shortest-path closure is maintained.
   // TODO: see whether or not reduction can be (efficiently!) maintained too.
   if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    reset_shortest_path_reduced();
 
   // If we removed _all_ dimensions from a non-empty BDS,
   // the zero-dim universe BDS has been obtained.
@@ -645,53 +784,34 @@ BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
 
 template <typename T>
 inline void
-BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
-					      const Constraint_System& cs,
-					      unsigned* tp) {
-  // See the documentation for polyhedra.
-  C_Polyhedron px(constraints());
-  C_Polyhedron py(y.constraints());
-  px.limited_H79_extrapolation_assign(py, cs, tp);
-  BD_Shape x(px);
-  swap(x);
-  assert(OK());
+BD_Shape<T>::widening_assign(const BD_Shape& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
 }
 
 template <typename T>
 inline void
-BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
-  // Dimension-compatibility check.
-  if (space_dimension() != y.space_dimension())
-    throw_dimension_incompatible("time_elapse_assign(y)", y);
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+					      const Constraint_System& cs,
+					      unsigned* tp) {
   // See the documentation for polyhedra.
   C_Polyhedron px(constraints());
   C_Polyhedron py(y.constraints());
-  px.time_elapse_assign(py);
+  px.limited_H79_extrapolation_assign(py, cs, tp);
   BD_Shape x(px);
   swap(x);
   assert(OK());
 }
 
 template <typename T>
-inline void
-BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
-  assert(0 < v && v <= dbm.num_rows());
-  DB_Row<N>& dbm_v = dbm[v];
-  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
-    dbm_v[i] = PLUS_INFINITY;
-    dbm[i][v] = PLUS_INFINITY;
-  }
+inline memory_size_type
+BD_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
 }
 
 template <typename T>
-inline void
-BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
-  assert(0 < v && v <= dbm.num_rows());
-  DB_Row<N>& dbm_v = dbm[v];
-  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
-    dbm_v[i] = PLUS_INFINITY;
-    dbm[i][v] = PLUS_INFINITY;
-  }
+inline int32_t
+BD_Shape<T>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/BD_Shape.templates.hh b/src/BD_Shape.templates.hh
index fb9e8ac..cad3f59 100644
--- a/src/BD_Shape.templates.hh
+++ b/src/BD_Shape.templates.hh
@@ -1,11 +1,11 @@
 /* BD_Shape class implementation: non-inline template functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,9 +23,16 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_BD_Shape_templates_hh
 #define PPL_BD_Shape_templates_hh 1
 
+#include "Generator_System.defs.hh"
+#include "Generator_System.inlines.hh"
+#include "Congruence_System.inlines.hh"
+#include "Congruence_System.defs.hh"
 #include "Poly_Con_Relation.defs.hh"
 #include "Poly_Gen_Relation.defs.hh"
-#include "LP_Problem.defs.hh"
+#include "MIP_Problem.defs.hh"
+#include "Variables_Set.defs.hh"
+#include "Bit_Row.defs.hh"
+#include "Temp.defs.hh"
 #include <cassert>
 #include <vector>
 #include <deque>
@@ -37,69 +44,75 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace Parma_Polyhedra_Library {
 
 template <typename T>
+BD_Shape<T>::BD_Shape(const Congruence_System& cgs)
+  : dbm(cgs.space_dimension() + 1),
+    status(),
+    redundancy_dbm() {
+  add_congruences(cgs);
+  return;
+}
+
+template <typename T>
 BD_Shape<T>::BD_Shape(const Generator_System& gs)
   : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
-  using Implementation::BD_Shapes::max_assign;
-  using Implementation::BD_Shapes::div_round_up;
-
   const Generator_System::const_iterator gs_begin = gs.begin();
   const Generator_System::const_iterator gs_end = gs.end();
   if (gs_begin == gs_end) {
     // An empty generator system defines the empty polyhedron.
     set_empty();
-    assert(OK());
     return;
   }
 
   const dimension_type space_dim = space_dimension();
   DB_Row<N>& dbm_0 = dbm[0];
-  N tmp;
+  DIRTY_TEMP(N, tmp);
 
   bool dbm_initialized = false;
   bool point_seen = false;
   // Going through all the points and closure points.
-  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
-    const Generator& g = *i;
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
     switch (g.type()) {
     case Generator::POINT:
       point_seen = true;
       // Intentionally fall through.
     case Generator::CLOSURE_POINT:
       if (!dbm_initialized) {
-	// When handling the first (closure) point, we initialize the DBM.
-	dbm_initialized = true;
-	const Coefficient& d = g.divisor();
-	for (dimension_type i = space_dim; i > 0; --i) {
-	  const Coefficient& g_i = g.coefficient(Variable(i-1));
-	  DB_Row<N>& dbm_i = dbm[i];
-	  for (dimension_type j = space_dim; j > 0; --j)
-	    if (i != j)
-	      div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
-	  div_round_up(dbm_i[0], -g_i, d);
-	}
-	for (dimension_type j = space_dim; j > 0; --j)
-	  div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d);
-	// Note: no need to initialize the first element of the main diagonal.
+        // When handling the first (closure) point, we initialize the DBM.
+        dbm_initialized = true;
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.coefficient(Variable(i-1));
+          DB_Row<N>& dbm_i = dbm[i];
+          for (dimension_type j = space_dim; j > 0; --j)
+            if (i != j)
+              div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
+          div_round_up(dbm_i[0], -g_i, d);
+        }
+        for (dimension_type j = space_dim; j > 0; --j)
+          div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d);
+        // Note: no need to initialize the first element of the main diagonal.
       }
       else {
-	// This is not the first point: the DBM already contains
-	// valid values and we must compute maxima.
-	const Coefficient& d = g.divisor();
-	for (dimension_type i = space_dim; i > 0; --i) {
-	  const Coefficient& g_i = g.coefficient(Variable(i-1));
-	  DB_Row<N>& dbm_i = dbm[i];
-	  // The loop correctly handles the case when i == j.
-	  for (dimension_type j = space_dim; j > 0; --j) {
-	    div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d);
-	    max_assign(dbm_i[j], tmp);
-	  }
-	  div_round_up(tmp, -g_i, d);
-	  max_assign(dbm_i[0], tmp);
-	}
-	for (dimension_type j = space_dim; j > 0; --j) {
-	  div_round_up(tmp, g.coefficient(Variable(j-1)), d);
-	  max_assign(dbm_0[j], tmp);
-	}
+        // This is not the first point: the DBM already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.coefficient(Variable(i-1));
+          DB_Row<N>& dbm_i = dbm[i];
+          // The loop correctly handles the case when i == j.
+          for (dimension_type j = space_dim; j > 0; --j) {
+            div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d);
+            max_assign(dbm_i[j], tmp);
+          }
+          div_round_up(tmp, -g_i, d);
+          max_assign(dbm_i[0], tmp);
+        }
+        for (dimension_type j = space_dim; j > 0; --j) {
+          div_round_up(tmp, g.coefficient(Variable(j-1)), d);
+          max_assign(dbm_0[j], tmp);
+        }
       }
       break;
     default:
@@ -111,65 +124,65 @@ BD_Shape<T>::BD_Shape(const Generator_System& gs)
   if (!point_seen)
     // The generator system is not empty, but contains no points.
     throw std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
-				"the non-empty generator system gs "
-				"contains no points.");
+                                "the non-empty generator system gs "
+                                "contains no points.");
 
   // Going through all the lines and rays.
-  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
-    const Generator& g = *i;
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
     switch (g.type()) {
     case Generator::LINE:
       for (dimension_type i = space_dim; i > 0; --i) {
-	const Coefficient& g_i = g.coefficient(Variable(i-1));
-	DB_Row<N>& dbm_i = dbm[i];
-	// The loop correctly handles the case when i == j.
-	for (dimension_type j = space_dim; j > 0; --j)
-	  if (g_i != g.coefficient(Variable(j-1)))
-	    dbm_i[j] = PLUS_INFINITY;
-	if (g_i != 0)
-	  dbm_i[0] = PLUS_INFINITY;
+        const Coefficient& g_i = g.coefficient(Variable(i-1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i != g.coefficient(Variable(j-1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i != 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
       }
       for (dimension_type j = space_dim; j > 0; --j)
-	if (g.coefficient(Variable(j-1)) != 0)
-	  dbm_0[j] = PLUS_INFINITY;
+        if (g.coefficient(Variable(j-1)) != 0)
+          assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
       break;
     case Generator::RAY:
       for (dimension_type i = space_dim; i > 0; --i) {
-	const Coefficient& g_i = g.coefficient(Variable(i-1));
-	DB_Row<N>& dbm_i = dbm[i];
-	// The loop correctly handles the case when i == j.
-	for (dimension_type j = space_dim; j > 0; --j)
-	  if (g_i < g.coefficient(Variable(j-1)))
-	    dbm_i[j] = PLUS_INFINITY;
-	if (g_i < 0)
-	  dbm_i[0] = PLUS_INFINITY;
+        const Coefficient& g_i = g.coefficient(Variable(i-1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i < g.coefficient(Variable(j-1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i < 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
       }
       for (dimension_type j = space_dim; j > 0; --j)
-	if (g.coefficient(Variable(j-1)) > 0)
-	  dbm_0[j] = PLUS_INFINITY;
+        if (g.coefficient(Variable(j-1)) > 0)
+          assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
       break;
     default:
       // Points and closure points already dealt with.
       break;
     }
   }
-  status.set_shortest_path_closed();
+  set_shortest_path_closed();
   assert(OK());
 }
 
 template <typename T>
 BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
   : dbm(), status(), redundancy_dbm() {
-  using Implementation::BD_Shapes::div_round_up;
   const dimension_type num_dimensions = ph.space_dimension();
 
   if (ph.marked_empty()) {
-    *this = BD_Shape(num_dimensions, EMPTY);
+    *this = BD_Shape<T>(num_dimensions, EMPTY);
     return;
   }
 
   if (num_dimensions == 0) {
-    *this = BD_Shape(num_dimensions, UNIVERSE);
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
     return;
   }
 
@@ -177,7 +190,7 @@ BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
   // or when the process has polynomial complexity.
   if (complexity == ANY_COMPLEXITY
       || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
-    *this = BD_Shape(ph.generators());
+    *this = BD_Shape<T>(ph.generators());
     return;
   }
 
@@ -190,23 +203,23 @@ BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
     // If the constraint system of the polyhedron is minimized,
     // the test `is_universe()' has polynomial complexity.
     if (ph.is_universe()) {
-      *this = BD_Shape(num_dimensions, UNIVERSE);
+      *this = BD_Shape<T>(num_dimensions, UNIVERSE);
       return;
     }
   }
 
   // See if there is at least one inconsistent constraint in `ph.con_sys'.
   for (Constraint_System::const_iterator i = ph.con_sys.begin(),
-	 cs_end = ph.con_sys.end(); i != cs_end; ++i)
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
     if (i->is_inconsistent()) {
-      *this = BD_Shape(num_dimensions, EMPTY);
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
       return;
     }
 
   // If `complexity' allows it, use simplex to derive the exact (modulo
   // the fact that our BDSs are topologically closed) variable bounds.
   if (complexity == SIMPLEX_COMPLEXITY) {
-    LP_Problem lp;
+    MIP_Problem lp(num_dimensions);
     lp.set_optimization_mode(MAXIMIZATION);
 
     const Constraint_System& ph_cs = ph.constraints();
@@ -215,21 +228,23 @@ BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
     else
       // Adding to `lp' a topologically closed version of `ph_cs'.
       for (Constraint_System::const_iterator i = ph_cs.begin(),
-	     iend = ph_cs.end(); i != iend; ++i) {
-	const Constraint& c = *i;
-	lp.add_constraint(c.is_equality()
-			  ? (Linear_Expression(c) == 0)
-			  : (Linear_Expression(c) >= 0));
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality())
+          lp.add_constraint(Linear_Expression(c) >= 0);
+        else
+          lp.add_constraint(c);
       }
 
     // Check for unsatisfiability.
     if (!lp.is_satisfiable()) {
-      *this = BD_Shape(num_dimensions, EMPTY);
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
       return;
     }
 
+    // Start with a universe BDS that will be refined by the simplex.
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
     // Get all the upper bounds.
-    LP_Problem_Status lp_status;
     Generator g(point());
     TEMP_INTEGER(num);
     TEMP_INTEGER(den);
@@ -237,56 +252,125 @@ BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
       Variable x(i-1);
       // Evaluate optimal upper bound for `x <= ub'.
       lp.set_objective_function(x);
-      lp_status = lp.solve();
-      if (lp_status == UNBOUNDED_LP_PROBLEM)
-	dbm[0][i] = PLUS_INFINITY;
-      else {
-	assert(lp_status == OPTIMIZED_LP_PROBLEM);
-	g = lp.optimizing_point();
-	lp.evaluate_objective_function(g, num, den);
-	div_round_up(dbm[0][i], num, den);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        div_round_up(dbm[0][i], num, den);
       }
       // Evaluate optimal upper bound for `x - y <= ub'.
       for (dimension_type j = 1; j <= num_dimensions; ++j) {
-	if (i == j)
-	  continue;
-	Variable y(j-1);
-	lp.set_objective_function(x - y);
-	lp_status = lp.solve();
-	if (lp_status == UNBOUNDED_LP_PROBLEM)
-	  dbm[j][i] = PLUS_INFINITY;
-	else {
-	  assert(lp_status == OPTIMIZED_LP_PROBLEM);
-	  g = lp.optimizing_point();
-	  lp.evaluate_objective_function(g, num, den);
-	  div_round_up(dbm[j][i], num, den);
-	}
+        if (i == j)
+          continue;
+        Variable y(j-1);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up(dbm[j][i], num, den);
+        }
       }
       // Evaluate optimal upper bound for `-x <= ub'.
       lp.set_objective_function(-x);
-      lp_status = lp.solve();
-      if (lp_status == UNBOUNDED_LP_PROBLEM)
-	dbm[i][0] = PLUS_INFINITY;
-      else {
-	assert(lp_status == OPTIMIZED_LP_PROBLEM);
-	g = lp.optimizing_point();
-	lp.evaluate_objective_function(g, num, den);
-	div_round_up(dbm[i][0], num, den);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        div_round_up(dbm[i][0], num, den);
       }
     }
-    status.set_shortest_path_closed();
+    set_shortest_path_closed();
+    assert(OK());
     return;
   }
 
   // Extract easy-to-find bounds from constraints.
-  *this = BD_Shape(ph.con_sys);
+  *this = BD_Shape<T>(ph.constraints());
+}
+
+template <typename T>
+dimension_type
+BD_Shape<T>::affine_dimension() const {
+  const dimension_type space_dim = space_dimension();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (space_dim == 0)
+    return 0;
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `predecessor' is used to represent equivalence classes:
+  // `predecessor[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class);
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+
+  // Due to the fictitious variable `0', the affine dimension is one
+  // less the number of equivalence classes.
+  dimension_type affine_dim = 0;
+  // Note: disregard the first equivalence class.
+  for (dimension_type i = 1; i <= space_dim; ++i)
+    if (predecessor[i] == i)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+BD_Shape<T>::minimized_congruences() const {
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs;
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cgs.insert((0*Variable(space_dim-1) %= 1) / 0);
+  else {
+    // KLUDGE: in the future `cgs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cgs.insert(0*Variable(space_dim-1) == 0);
+
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+
+    // Compute leader information.
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
+
+    // Go through the non-leaders to generate equality constraints.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const dimension_type leader = leaders[i];
+      if (i != leader) {
+        // Generate the constraint relating `i' and its leader.
+        if (leader == 0) {
+          // A unary equality has to be generated.
+          assert(!is_plus_infinity(dbm_0[i]));
+          numer_denom(dbm_0[i], num, den);
+          cgs.insert(den*Variable(i-1) == num);
+        }
+        else {
+          // A binary equality has to be generated.
+          assert(!is_plus_infinity(dbm[i][leader]));
+          numer_denom(dbm[i][leader], num, den);
+          cgs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+        }
+      }
+    }
+  }
+  return cgs;
 }
 
 template <typename T>
 void
 BD_Shape<T>::add_constraint(const Constraint& c) {
-  using Implementation::BD_Shapes::div_round_up;
-
   const dimension_type c_space_dim = c.space_dimension();
   // Dimension-compatibility check.
   if (c_space_dim > space_dimension())
@@ -305,6 +389,84 @@ BD_Shape<T>::add_constraint(const Constraint& c) {
 
   if (num_vars == 0) {
     // Dealing with a trivial constraint.
+    if (c.is_equality() && c.inhomogeneous_term() != 0)
+      set_empty();
+    if (c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    TEMP_INTEGER(minus_c_term);
+    neg_assign(minus_c_term, c.inhomogeneous_term());
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    add_constraint(expr == 0);
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    return;
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (c.is_equality() && c.inhomogeneous_term() != 0)
+      set_empty();
     if (c.inhomogeneous_term() < 0)
       set_empty();
     return;
@@ -312,14 +474,15 @@ BD_Shape<T>::add_constraint(const Constraint& c) {
 
   // Select the cell to be modified for the "<=" part of the constraint,
   // and set `coeff' to the absolute value of itself.
-  N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
-  N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
-  if (coeff < 0)
-    coeff = -coeff;
+  const bool negative = (coeff < 0);
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
 
   bool changed = false;
   // Compute the bound for `x', rounding towards plus infinity.
-  N d;
+  DIRTY_TEMP(N, d);
   div_round_up(d, c.inhomogeneous_term(), coeff);
   if (x > d) {
     x = d;
@@ -328,7 +491,9 @@ BD_Shape<T>::add_constraint(const Constraint& c) {
 
   if (c.is_equality()) {
     // Also compute the bound for `y', rounding towards plus infinity.
-    div_round_up(d, -c.inhomogeneous_term(), coeff);
+    TEMP_INTEGER(minus_c_term);
+    neg_assign(minus_c_term, c.inhomogeneous_term());
+    div_round_up(d, minus_c_term, coeff);
     if (y > d) {
       y = d;
       changed = true;
@@ -336,9 +501,25 @@ BD_Shape<T>::add_constraint(const Constraint& c) {
   }
 
   // In general, adding a constraint does not preserve the shortest-path
-  // closure or reduction of the system of bounded differences.
+  // closure or reduction of the bounded difference shape.
   if (changed && marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
+    reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    refine_with_constraint(expr == 0);
+  }
   assert(OK());
 }
 
@@ -350,11 +531,10 @@ BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
   const dimension_type x_space_dim = x.space_dimension();
   const dimension_type y_space_dim = y.space_dimension();
 
-  // If `y' is an empty 0-dim space system of bounded differences,
+  // If `y' is an empty 0-dim space bounded difference shape,
   // let `*this' become empty.
   if (y_space_dim == 0 && y.marked_empty()) {
     set_empty();
-    assert(OK());
     return;
   }
 
@@ -383,7 +563,7 @@ BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
   }
 
   if (marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
+    reset_shortest_path_closed();
   assert(OK());
 }
 
@@ -409,7 +589,7 @@ BD_Shape<T>::contains(const BD_Shape& y) const {
   }
 
   /*
-    The `y' system of bounded differences need be closed.
+    The `y' bounded difference shape need be closed.
     In fact if, for example, in `*this' we have the constraints:
 
     x1 - x2 <= 1;
@@ -441,13 +621,55 @@ BD_Shape<T>::contains(const BD_Shape& y) const {
     const DB_Row<N>& y_dbm_i = y.dbm[i];
     for (dimension_type j = x_space_dim + 1; j-- > 0; )
       if (x_dbm_i[j] < y_dbm_i[j])
-	return false;
+        return false;
   }
   return true;
 }
 
 template <typename T>
 bool
+BD_Shape<T>::is_disjoint_from(const BD_Shape& y) const {
+  const dimension_type space_dim = space_dimension();
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If one of the two bounded difference shape is empty,
+  // then the two bounded difference shape are disjoint.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return true;
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return true;
+
+  // Two BDSs are disjoint when their intersection is empty.
+  // That is if and only if there exists at least a bounded difference
+  // such that the upper bound of the bounded difference in the first
+  // BD_Shape is strictly less than the lower bound of
+  // the corresponding bounded difference in the second BD_Shape
+  // or vice versa.
+  // For example: let be
+  // in `*this':    -a_j_i <= v_j - v_i <= a_i_j;
+  // and in `y':    -b_j_i <= v_j - v_i <= b_i_j;
+  // `*this' and `y' are disjoint if
+  // 1.) a_i_j < -b_j_i or
+  // 2.) b_i_j < -a_j_i.
+  DIRTY_TEMP(N, tmp);
+  for (dimension_type i = space_dim+1; i-- > 0; ) {
+    const DB_Row<N>& x_i = dbm[i];
+    for (dimension_type j = space_dim+1; j-- > 0; ) {
+      neg_assign_r(tmp, y.dbm[j][i], ROUND_UP);
+      if (x_i[j] < tmp)
+        return true;
+    }
+  }
+
+  return false;
+}
+
+template <typename T>
+bool
 BD_Shape<T>::is_universe() const {
   if (marked_empty())
     return false;
@@ -458,18 +680,111 @@ BD_Shape<T>::is_universe() const {
   if (space_dim == 0)
     return true;
 
-  // A system of bounded differences defining the universe BDS can only
+  // A bounded difference shape defining the universe BDS can only
   // contain trivial constraints.
   for (dimension_type i = space_dim + 1; i-- > 0; ) {
     const DB_Row<N>& dbm_i = dbm[i];
     for (dimension_type j = space_dim + 1; j-- > 0; )
       if (!is_plus_infinity(dbm_i[j]))
-	return false;
+        return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_bounded() const {
+  shortest_path_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  // A zero-dimensional or empty BDS is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  // A bounded difference shape defining the bounded BDS never can
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (i != j)
+        if (is_plus_infinity(dbm_i[j]))
+          return false;
   }
+
   return true;
 }
 
 template <typename T>
+bool
+BD_Shape<T>::contains_integer_point() const {
+  // Force shortest-path closure.
+  if (is_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
+
+  // A non-empty BD_Shape defined by integer constraints
+  // necessarily contains an integer point.
+  if (std::numeric_limits<T>::is_integer)
+    return true;
+
+  // Build an integer BD_Shape z with bounds at least as tight as
+  // those in *this and then recheck for emptiness.
+  BD_Shape<mpz_class> bds_z(space_dim);
+  typedef BD_Shape<mpz_class>::N Z;
+  bds_z.reset_shortest_path_closed();
+  DIRTY_TEMP(N, tmp);
+  bool all_integers = true;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<Z>& z_i = bds_z.dbm[i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      const N& dbm_i_j = dbm_i[j];
+      if (is_plus_infinity(dbm_i_j))
+        continue;
+      if (is_integer(dbm_i_j))
+        assign_r(z_i[j], dbm_i_j, ROUND_NOT_NEEDED);
+      else {
+        all_integers = false;
+        Z& z_i_j = z_i[j];
+        // Copy dbm_i_j into z_i_j, but rounding downwards.
+        neg_assign_r(tmp, dbm_i_j, ROUND_NOT_NEEDED);
+        assign_r(z_i_j, tmp, ROUND_UP);
+        neg_assign_r(z_i_j, z_i_j, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  return all_integers || !bds_z.is_empty();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // A polyhedron known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
+
+  // Check whether `var' is syntactically constrained.
+  const DB_Row<N>& dbm_v = dbm[var_space_dim];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    if (!is_plus_infinity(dbm_v[i])
+        || !is_plus_infinity(dbm[i][var_space_dim]))
+      return true;
+  }
+
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
+
+template <typename T>
 void
 BD_Shape<T>
 ::compute_predecessors(std::vector<dimension_type>& predecessor) const {
@@ -490,15 +805,12 @@ BD_Shape<T>
     if (i == predecessor[i]) {
       const DB_Row<N>& dbm_i = dbm[i];
       for (dimension_type j = i; j-- > 0; )
-	if (j == predecessor[j]) {
-	  N negated_dbm_ji;
-	  if (neg_assign_r(negated_dbm_ji, dbm[j][i], ROUND_NOT_NEEDED) == V_EQ
-	      && negated_dbm_ji == dbm_i[j]) {
-	    // Choose as predecessor the variable having the smaller index.
-	    predecessor[i] = j;
-	    break;
-	  }
-	}
+        if (j == predecessor[j]
+            && is_additive_inverse(dbm[j][i], dbm_i[j])) {
+          // Choose as predecessor the variable having the smaller index.
+          predecessor[i] = j;
+          break;
+        }
     }
 }
 
@@ -511,7 +823,7 @@ BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
   compute_predecessors(leaders);
   // Flatten the predecessor chains so as to obtain leaders.
   assert(leaders[0] == 0);
-  for (dimension_type i = 1, iend = leaders.size(); i != iend; ++i) {
+  for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) {
     const dimension_type l_i = leaders[i];
     assert(l_i <= i);
     if (l_i != i) {
@@ -529,6 +841,11 @@ BD_Shape<T>::is_shortest_path_reduced() const {
   if (marked_empty())
     return true;
 
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return true;
+
   // A shortest-path reduced dbm is just a dbm with an indication of
   // those constraints that are redundant. If there is no indication
   // of the redundant constraints, then it cannot be reduced.
@@ -536,154 +853,149 @@ BD_Shape<T>::is_shortest_path_reduced() const {
     return false;
 
   const BD_Shape x_copy = *this;
-  const dimension_type x_space_dim = x_copy.space_dimension();
   x_copy.shortest_path_closure_assign();
-  // If we just discovered emptyness, it cannot be reduced.
+  // If we just discovered emptiness, it cannot be reduced.
   if (x_copy.marked_empty())
     return false;
 
   // The vector `leader' is used to indicate which variables are equivalent.
-  std::vector<dimension_type> leader(x_space_dim + 1);
+  std::vector<dimension_type> leader(space_dim + 1);
 
   // We store the leader.
-  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+  for (dimension_type i = space_dim + 1; i-- > 0; )
     leader[i] = i;
 
   // Step 1: we store really the leader with the corrected value.
   // We search for the equivalent or zero-equivalent variables.
   // The variable(i-1) and variable(j-1) are equivalent if and only if
   // m_i_j == -(m_j_i).
-  for (dimension_type i = 0; i < x_space_dim; ++i) {
-    const DB_Row<N>& xdbm_i = x_copy.dbm[i];
-    for (dimension_type j = i + 1; j <= x_space_dim; ++j) {
-      N negated_xdbm_ji;
-      if (neg_assign_r(negated_xdbm_ji, x_copy.dbm[j][i],
-		       ROUND_NOT_NEEDED) == V_EQ
-	  && negated_xdbm_ji == xdbm_i[j])
-	// Two equivalent variables have got the same leader
-	// (the smaller variable).
-	leader[j] = leader[i];
-    }
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    const DB_Row<N>& x_copy_dbm_i = x_copy.dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j)
+      if (is_additive_inverse(x_copy.dbm[j][i], x_copy_dbm_i[j]))
+        // Two equivalent variables have got the same leader
+        // (the smaller variable).
+        leader[j] = leader[i];
   }
 
   // Step 2: we check if there are redundant constraints in the zero_cycle
-  // free systems of bounded differences, considering only the leaders.
+  // free bounded difference shape, considering only the leaders.
   // A constraint `c' is redundant, when there are two constraints such that
   // their sum is the same constraint with the inhomogeneous term
   // less than or equal to the `c' one.
-  N c;
-  for (dimension_type k = 0; k <= x_space_dim; ++k)
+  DIRTY_TEMP(N, c);
+  for (dimension_type k = 0; k <= space_dim; ++k)
     if (leader[k] == k) {
       const DB_Row<N>& x_k = x_copy.dbm[k];
-      for (dimension_type i = 0; i <= x_space_dim; ++i)
-	if (leader[i] == i) {
-	  const DB_Row<N>& x_i = x_copy.dbm[i];
-	  const std::deque<bool>& redundancy_i = redundancy_dbm[i];
-	  const N& x_i_k = x_i[k];
-	  for (dimension_type j = 0; j <= x_space_dim; ++j)
-	    if (leader[j] == j) {
-	      const N& x_i_j = x_i[j];
-	      if (!is_plus_infinity(x_i_j)) {
-		add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
-		if (x_i_j >= c && !redundancy_i[j])
-		  return false;
-	      }
-	    }
-	}
+      for (dimension_type i = 0; i <= space_dim; ++i)
+        if (leader[i] == i) {
+          const DB_Row<N>& x_i = x_copy.dbm[i];
+          const Bit_Row& redundancy_i = redundancy_dbm[i];
+          const N& x_i_k = x_i[k];
+          for (dimension_type j = 0; j <= space_dim; ++j)
+            if (leader[j] == j) {
+              const N& x_i_j = x_i[j];
+              if (!is_plus_infinity(x_i_j)) {
+                add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+                if (x_i_j >= c && !redundancy_i[j])
+                  return false;
+              }
+            }
+        }
     }
 
   // The vector `var_conn' is used to check if there is a single cycle
   // that connected all zero-equivalent variables between them.
   // The value `space_dim + 1' is used to indicate that the equivalence
   // class contains a single variable.
-  std::vector<dimension_type> var_conn(x_space_dim + 1);
-  for (dimension_type i = x_space_dim + 1; i-- > 0; )
-    var_conn[i] = x_space_dim + 1;
+  std::vector<dimension_type> var_conn(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    var_conn[i] = space_dim + 1;
 
   // Step 3: we store really the `var_conn' with the right value, putting
   // the variable with the selected variable is connected:
   // we check the row of each variable:
   // a- each leader could be connected with only zero-equivalent one,
   // b- each no-leader with only another zero-equivalent one.
-  for (dimension_type i = 0; i <= x_space_dim; ++i) {
+  for (dimension_type i = 0; i <= space_dim; ++i) {
     // It count with how many variables the selected variable is
     // connected.
     dimension_type t = 0;
     dimension_type ld_i = leader[i];
     // Case a: leader.
     if (ld_i == i) {
-      for (dimension_type j = 0; j <= x_space_dim; ++j) {
-	dimension_type ld_j = leader[j];
-	// Only the connectedness with equivalent variables
-	// is considered.
-	if (j != ld_j)
-	  if (!redundancy_dbm[i][j]) {
-	    if (t == 1)
-	      // Two no-leaders couldn't connected with the same leader.
-	      return false;
-	    else
-	      if (ld_j != i)
-		// The variables isn't in the same equivalence class.
-		return false;
-	      else {
-		++t;
-		var_conn[i] = j;
-	      }
-	  }
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        dimension_type ld_j = leader[j];
+        // Only the connectedness with equivalent variables
+        // is considered.
+        if (j != ld_j)
+          if (!redundancy_dbm[i][j]) {
+            if (t == 1)
+              // Two no-leaders couldn't connected with the same leader.
+              return false;
+            else
+              if (ld_j != i)
+                // The variables isn't in the same equivalence class.
+                return false;
+              else {
+                ++t;
+                var_conn[i] = j;
+              }
+          }
       }
     }
     // Case b: no-leader.
     else {
-      for (dimension_type j = 0; j <= x_space_dim; ++j) {
-	if (!redundancy_dbm[i][j]) {
-	  dimension_type ld_j = leader[j];
-	  if (ld_i != ld_j)
-	    // The variables isn't in the same equivalence class.
-	    return false;
-	  else {
-	    if (t == 1)
-	      // Two variables couldn't connected with the same leader.
-	      return false;
-	    else {
-	      ++t;
-	      var_conn[i] = j;
-	    }
-	  }
-	  // A no-leader must be connected with
-	  // another variable.
-	  if (t == 0)
-	    return false;
-	}
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        if (!redundancy_dbm[i][j]) {
+          dimension_type ld_j = leader[j];
+          if (ld_i != ld_j)
+            // The variables isn't in the same equivalence class.
+            return false;
+          else {
+            if (t == 1)
+              // Two variables couldn't connected with the same leader.
+              return false;
+            else {
+              ++t;
+              var_conn[i] = j;
+            }
+          }
+          // A no-leader must be connected with
+          // another variable.
+          if (t == 0)
+            return false;
+        }
       }
     }
   }
 
   // The vector `just_checked' is used to check if
   // a variable is already checked.
-  std::vector<bool> just_checked(x_space_dim + 1);
-  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+  std::vector<bool> just_checked(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
     just_checked[i] = false;
 
   // Step 4: we check if there are single cycles that
   // connected all the zero-equivalent variables between them.
-  for (dimension_type i = 0; i <= x_space_dim; ++i) {
+  for (dimension_type i = 0; i <= space_dim; ++i) {
     bool jc_i = just_checked[i];
     // We do not re-check the already considered single cycles.
     if (!jc_i) {
       dimension_type v_con = var_conn[i];
       // We consider only the equivalence classes with
       // 2 or plus variables.
-      if (v_con != x_space_dim + 1) {
-	// There is a single cycle if taken a variable,
-	// we return to this same variable.
-	while (v_con != i) {
-	  just_checked[v_con] = true;
-	  v_con = var_conn[v_con];
-	  // If we re-pass to an already considered variable,
-	  // then we haven't a single cycle.
-	  if (just_checked[v_con])
-	    return false;
-	}
+      if (v_con != space_dim + 1) {
+        // There is a single cycle if taken a variable,
+        // we return to this same variable.
+        while (v_con != i) {
+          just_checked[v_con] = true;
+          v_con = var_conn[v_con];
+          // If we re-pass to an already considered variable,
+          // then we haven't a single cycle.
+          if (just_checked[v_con])
+            return false;
+        }
       }
     }
     just_checked[i] = true;
@@ -694,111 +1006,504 @@ BD_Shape<T>::is_shortest_path_reduced() const {
 }
 
 template <typename T>
-Poly_Con_Relation
-BD_Shape<T>::relation_with(const Constraint& c) const {
-  using Implementation::BD_Shapes::div_round_up;
-
-  const dimension_type c_space_dim = c.space_dimension();
+bool
+BD_Shape<T>::bounds(const Linear_Expression& expr,
+                    const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
   const dimension_type space_dim = space_dimension();
-
-  // Dimension-compatibility check.
-  if (c_space_dim > space_dim)
-    throw_dimension_incompatible("relation_with(c)", c);
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
 
   shortest_path_closure_assign();
+  // A zero-dimensional or empty BDS bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
 
-  if (marked_empty())
-    return Poly_Con_Relation::saturates()
-      && Poly_Con_Relation::is_included()
-      && Poly_Con_Relation::is_disjoint();
-
-  if (space_dim == 0) {
-    if ((c.is_equality() && c.inhomogeneous_term() != 0)
-	|| (c.is_inequality() && c.inhomogeneous_term() < 0))
-      return Poly_Con_Relation::is_disjoint();
-    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
-      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
-      // thus, the zero-dimensional point also saturates it.
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_disjoint();
-    else if (c.is_equality() || c.inhomogeneous_term() == 0)
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_included();
-    else
-      // The zero-dimensional point saturates
-      // neither the positivity constraint 1 >= 0,
-      // nor the strict positivity constraint 1 > 0.
-      return Poly_Con_Relation::is_included();
-  }
-
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = from_above ? expr <= 0 : expr >= 0;
+  const dimension_type c_space_dim = c.space_dimension();
   dimension_type num_vars = 0;
   dimension_type i = 0;
   dimension_type j = 0;
   TEMP_INTEGER(coeff);
-  // Constraints that are not bounded differences are not compatible.
-  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
-    throw_constraint_incompatible("relation_with(c)");
+  // Check if `c' is a BD constraint.
+  if (extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) {
+    if (num_vars == 0)
+      // Dealing with a trivial constraint.
+      return true;
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    return !is_plus_infinity(x);
+  }
+  else {
+    // Not a DB constraint: use the MIP solver.
+    Optimization_Mode mode_bounds
+      = from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    // Problem is known to be feasible.
+    return (mip.solve() == OPTIMIZED_MIP_PROBLEM);
+  }
+}
 
-  if (num_vars == 0) {
-    // Dealing with a trivial constraint.
-    switch (sgn(c.inhomogeneous_term())) {
-    case -1:
-      return Poly_Con_Relation::is_disjoint();
-    case 0:
-      if (c.is_strict_inequality())
-	return Poly_Con_Relation::saturates()
-	  && Poly_Con_Relation::is_disjoint();
-      else
-	return Poly_Con_Relation::saturates()
-	  && Poly_Con_Relation::is_included();
-    case 1:
-      return Poly_Con_Relation::is_included();
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
     }
   }
 
-  // Select the cell to be checked for the "<=" part of the constraint,
-  // and set `coeff' to the absolute value of itself.
-  const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
-  const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
-  if (coeff < 0)
-    coeff = -coeff;
-  N d;
-  div_round_up(d, c.inhomogeneous_term(), coeff);
-  N d1;
-  div_round_up(d1, -c.inhomogeneous_term(), coeff);
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
 
-  switch (c.type()) {
-  case Constraint::EQUALITY:
-    if (d == x && d1 == y)
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_included();
-    else if (d < y && d1 > x)
-      return Poly_Con_Relation::is_disjoint();
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = maximize ? expr <= 0 : expr >= 0;
+  const dimension_type c_space_dim = c.space_dimension();
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Check if `c' is a BD constraint.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) {
+    Optimization_Mode mode_max_min
+      = maximize ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
     else
-      return Poly_Con_Relation::strictly_intersects();
-  case Constraint::NONSTRICT_INEQUALITY:
-    if (d >= x && d1 >= y)
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // Here `expr' is a bounded difference.
+    if (num_vars == 0) {
+      // Dealing with a trivial expression.
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    if (!is_plus_infinity(x)) {
+      // Compute the maximize/minimize of `expr'.
+      DIRTY_TEMP(N, d);
+      const Coefficient& b = expr.inhomogeneous_term();
+      TEMP_INTEGER(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of
+      // a variable in `expr'.
+      DIRTY_TEMP(N, coeff_expr);
+      const Coefficient& coeff_i = expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        TEMP_INTEGER(minus_coeff_i);
+        neg_assign(minus_coeff_i, coeff_i);
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      add_mul_assign_r(d, coeff_expr, x, ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
+
+    // `expr' is unbounded.
+    return false;
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included,
+                     Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
+
+  Optimization_Mode mode_max_min
+    = maximize ? MAXIMIZATION : MINIMIZATION;
+  MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+  if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+    g = mip.optimizing_point();
+    mip.evaluate_objective_function(g, ext_n, ext_d);
+    included = true;
+    return true;
+  }
+  // Here `expr' is unbounded in `*this'.
+  return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  // If the congruence is a bounded difference equality,
+  // find the relation with the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    TEMP_INTEGER(coeff);
+    if (extract_bounded_difference(c, cg_space_dim, num_vars,
+                                    i, j, coeff))
+      return relation_with(c);
+  }
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else if (cg.inhomogeneous_term() % cg.modulus() == 0)
       return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_included();
-    else if (d >= x)
-      return Poly_Con_Relation::is_included();
-    else if (d < x && d1 > y)
+        && Poly_Con_Relation::is_included();
+  }
+
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  TEMP_INTEGER(mod);
+  mod = cg.modulus();
+  Linear_Expression le;
+  for (dimension_type i = cg_space_dim; i-- > 0; )
+    le += cg.coefficient(Variable(i)) * Variable(i);
+  bool bounded_below = minimize(le, min_num, min_den, min_included);
+
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  TEMP_INTEGER(v);
+  TEMP_INTEGER(lower_num);
+  TEMP_INTEGER(lower_den);
+  TEMP_INTEGER(lower);
+  assign_r(lower_num, min_num, ROUND_NOT_NEEDED);
+  assign_r(lower_den, min_den, ROUND_NOT_NEEDED);
+  v -= cg.inhomogeneous_term();
+  lower = lower_num / lower_den;
+  v += ((lower / mod) * mod);
+  if (v * lower_den < lower_num)
+    v += mod;
+  const Constraint& c(le == v);
+  return relation_with(c);
+}
+
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
       return Poly_Con_Relation::is_disjoint();
-    else
-      return Poly_Con_Relation::strictly_intersects();
-  case Constraint::STRICT_INEQUALITY:
-    if (d >= x && d1 >= y)
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
       return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_disjoint();
-    else if (d > x)
+        && Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
       return Poly_Con_Relation::is_included();
-    else if (d <= x && d1 >= y)
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) {
+    // Constraints that are not bounded differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le;
+    for (dimension_type k = c_space_dim; k-- > 0; ) {
+      Variable vk(k);
+      le += c.coefficient(vk) * vk;
+    }
+    DIRTY_TEMP(Coefficient, max_num);
+    DIRTY_TEMP(Coefficient, max_den);
+    bool max_included;
+    DIRTY_TEMP(Coefficient, min_num);
+    DIRTY_TEMP(Coefficient, min_den);
+    bool min_included;
+    bool bounded_above = maximize(le, max_num, max_den, max_included);
+    bool bounded_below = minimize(le, min_num, min_den, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(min_num)) {
+      case 1:
+        if (c.is_equality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return  Poly_Con_Relation::strictly_intersects();
+        return  Poly_Con_Relation::is_included();
+      case -1:
+        return  Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_num += c.inhomogeneous_term() * max_den;
+      switch (sgn(max_num)) {
+      case 1:
+        return  Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_num += c.inhomogeneous_term() * max_den;
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(max_num)) {
+      case 1:
+        switch (sgn(min_num)) {
+        case 1:
+          if (c.is_equality())
+            return  Poly_Con_Relation::is_disjoint();
+          return  Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return  Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::strictly_intersects();
+          return  Poly_Con_Relation::is_included();
+        case -1:
+          return  Poly_Con_Relation::strictly_intersects();
+        }
+     case 0:
+        if (min_num == 0) {
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return  Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
+
+  // Constraints that are bounded differences.
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  const N& x = negative ? dbm[i][j] : dbm[j][i];
+  const N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+  // Deduce the relation/s of the constraint `c' of the form
+  // `coeff*v - coeff*u </<=/== c.inhomogeneous_term()'
+  // with the respectively constraints in `*this'
+  // `-y <= v - u <= x'.
+  // Let `d == c.inhomogeneous_term()/coeff'
+  // and `d1 == -c.inhomogeneous_term()/coeff'.
+  // The following variables of mpq_class type are used to be precise
+  // when the bds is defined by integer constraints.
+  DIRTY_TEMP0(mpq_class, q_x);
+  DIRTY_TEMP0(mpq_class, q_y);
+  DIRTY_TEMP0(mpq_class, d);
+  DIRTY_TEMP0(mpq_class, d1);
+  DIRTY_TEMP0(mpq_class, c_den);
+  DIRTY_TEMP0(mpq_class, q_den);
+  assign_r(c_den, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_den, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_den, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(x)) {
+    if (!is_plus_infinity(y)) {
+      // `*this' is in the following form:
+      // `-y <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+      // `y < d1' (`y <= d1' if c is a strict equality).
+      TEMP_INTEGER(numer);
+      TEMP_INTEGER(denom);
+      numer_denom(y, numer, denom);
+      assign_r(q_den, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
+
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
+
+  // Here `x' is not plus-infinity.
+  TEMP_INTEGER(numer);
+  TEMP_INTEGER(denom);
+  numer_denom(x, numer, denom);
+  assign_r(q_den, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(y)) {
+    numer_denom(y, numer, denom);
+    assign_r(q_den, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+    // `y < d1' (`y <= d1' if c is a strict equality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
+
+  // Here `y' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `x < d'.
+  if (d > q_x) {
+    if (c.is_equality())
       return Poly_Con_Relation::is_disjoint();
     else
-      return Poly_Con_Relation::strictly_intersects();
+      return Poly_Con_Relation::is_included();
   }
-  // Quiet a compiler warning: this program point is unreachable.
-  throw std::runtime_error("PPL internal error");
+
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
+
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
 }
 
 template <typename T>
@@ -811,128 +1516,103 @@ BD_Shape<T>::relation_with(const Generator& g) const {
   if (space_dim < g_space_dim)
     throw_dimension_incompatible("relation_with(g)", g);
 
-  // The empty bdiff cannot subsume a generator.
+  shortest_path_closure_assign();
+  // The empty BDS cannot subsume a generator.
   if (marked_empty())
     return Poly_Gen_Relation::nothing();
 
-  // A universe BD shape in a zero-dimensional space subsumes
+  // A universe BDS in a zero-dimensional space subsumes
   // all the generators of a zero-dimensional space.
   if (space_dim == 0)
     return Poly_Gen_Relation::subsumes();
 
   const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
 
-  // The relation between the bdiff and the given generator is obtained
-  // checking if the generator satisfies all the constraints in the bdiff.
+  // The relation between the BDS and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the BDS.
   // To check if the generator satisfies all the constraints it's enough
   // studying the sign of the scalar product between the generator and
-  // all the constraints in the bdiff.
+  // all the constraints in the BDS.
 
+  // Allocation of temporaries done once and for all.
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  TEMP_INTEGER(product);
   // We find in `*this' all the constraints.
   for (dimension_type i = 0; i <= space_dim; ++i) {
+    const Coefficient& g_coeff_y = (i > g_space_dim || i == 0)
+      ? Coefficient(0) : g.coefficient(Variable(i-1));
+    const DB_Row<N>& dbm_i = dbm[i];
     for (dimension_type j = i + 1; j <= space_dim; ++j) {
-      const Variable x(j - 1);
-      const bool x_dimension_incompatible = x.space_dimension() > g_space_dim;
-      const N& dbm_ij = dbm[i][j];
+      const Coefficient& g_coeff_x = (j > g_space_dim)
+        ? Coefficient(0) : g.coefficient(Variable(j-1));
+      const N& dbm_ij = dbm_i[j];
       const N& dbm_ji = dbm[j][i];
-      N negated_dbm_ji;
-      const bool is_equality
-	= neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
-	&& negated_dbm_ji == dbm_ij;
-      const bool dbm_ij_is_infinity = is_plus_infinity(dbm_ij);
-      const bool dbm_ji_is_infinity = is_plus_infinity(dbm_ji);
-      if (i != 0) {
-	const Variable y(i - 1);
-	const bool y_dimension_incompatible
-	  = y.space_dimension() > g_space_dim;
-	const bool is_trivial_zero
-	  = (x_dimension_incompatible && g.coefficient(y) == 0)
-	  || (y_dimension_incompatible && g.coefficient(x) == 0)
-	  || (x_dimension_incompatible && y_dimension_incompatible);
-	if (is_equality) {
-	  // We have one equality constraint.
-	  // The constraint has form ax - ay = b.
-	  // The scalar product has the form
-	  // 'a * y_i - a * x_j'
-	  // where y_i = g.coefficient(y) and x_j = g.coefficient(x).
-	  // It is not zero when both the coefficients of the
-	  // variables x and y are not zero or when these coefficients
- 	  if (!is_trivial_zero && g.coefficient(x) != g.coefficient(y))
-	    return Poly_Gen_Relation::nothing();
-	}
-	else
-	  // We have the binary inequality constraints.
-	  if (!dbm_ij_is_infinity) {
-	  // The constraint has form ax - ay <= b.
-	  // The scalar product has the form
-	  // 'a * y_i - a * x_j'
-	    if (is_line
-		&& !is_trivial_zero
-		&& g.coefficient(x) != g.coefficient(y))
-	      return Poly_Gen_Relation::nothing();
-	    else
-	      if (g.coefficient(y) < g.coefficient(x))
-		return Poly_Gen_Relation::nothing();
-	  }
-	  else if (!dbm_ji_is_infinity) {
-	    // The constraint has form ay - ax <= b.
-	    // The scalar product has the form
-	    // 'a * x_j - a* y_i'.
-	    if (is_line
-		&& !is_trivial_zero
-		&& g.coefficient(x) != g.coefficient(y))
-	      return Poly_Gen_Relation::nothing();
-	    else if (g.coefficient(x) < g.coefficient(y))
-	      return Poly_Gen_Relation::nothing();
-	  }
+      if (is_additive_inverse(dbm_ji, dbm_ij)) {
+        // We have one equality constraint: den*x - den*y = num.
+        // Compute the scalar product.
+        numer_denom(dbm_ij, num, den);
+        product = 0;
+        add_mul_assign(product, den, g_coeff_y);
+        add_mul_assign(product, -den, g_coeff_x);
+        if (!is_line_or_ray)
+          add_mul_assign(product, num, g.divisor());
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
       }
       else {
-	// Here i == 0.
-	if (is_equality) {
-	  // The constraint has form ax = b.
-	  // To satisfy the constraint it's necessary that the scalar product
-	  // is not zero.It happens when the coefficient of the variable 'x'
-	  // in the generator is not zero, because the scalar
-	  // product has the form:
-	  // 'a * x_i' where x_i = g.coefficient(x)..
-	  if (!x_dimension_incompatible && g.coefficient(x) != 0)
-	    return Poly_Gen_Relation::nothing();
-	}
-	else
-	  // We have the unary inequality constraints.
-	  if (!dbm_ij_is_infinity) {
-	    // The constraint has form ax <= b.
-	    // The scalar product has the form:
-	    // '-a * x_i' where x_i = g.coefficient(x).
-	    if (is_line
-		&& !x_dimension_incompatible
-		&& g.coefficient(x) != 0)
-	      return Poly_Gen_Relation::nothing();
-	    else if (g.coefficient(x) > 0)
-	      return Poly_Gen_Relation::nothing();
-	  }
-	  else if (!dbm_ji_is_infinity) {
-	    // The constraint has form -ax <= b.
-	    // The scalar product has the form:
-	    // 'a * x_i' where x_i = g.coefficient(x).
-	    if (is_line
-		&& !x_dimension_incompatible
-		&& g.coefficient(x) != 0)
-	      return Poly_Gen_Relation::nothing();
-	    else if (g.coefficient(x) < 0)
-	      return Poly_Gen_Relation::nothing();
-	  }
+        // We have 0, 1 or 2 binary inequality constraint/s.
+        if (!is_plus_infinity(dbm_ij)) {
+          // We have the binary inequality constraint: den*x - den*y <= num.
+          // Compute the scalar product.
+          numer_denom(dbm_ij, num, den);
+          product = 0;
+          add_mul_assign(product, den, g_coeff_y);
+          add_mul_assign(product, -den, g_coeff_x);
+          if (!is_line_or_ray)
+            add_mul_assign(product, num, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+
+        if (!is_plus_infinity(dbm_ji)) {
+          // We have the binary inequality constraint: den*y - den*x <= b.
+          // Compute the scalar product.
+          numer_denom(dbm_ji, num, den);
+          product = 0;
+          add_mul_assign(product, den, g_coeff_x);
+          add_mul_assign(product, -den, g_coeff_y);
+          if (!is_line_or_ray)
+            add_mul_assign(product, num, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
       }
     }
   }
+
+  // The generator satisfies all the constraints.
   return Poly_Gen_Relation::subsumes();
 }
 
 template <typename T>
 void
 BD_Shape<T>::shortest_path_closure_assign() const {
-  using Implementation::BD_Shapes::min_assign;
-
   // Do something only if necessary.
   if (marked_empty() || marked_shortest_path_closed())
     return;
@@ -951,41 +1631,41 @@ BD_Shape<T>::shortest_path_closure_assign() const {
     assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
   }
 
-  N sum;
+  DIRTY_TEMP(N, sum);
   for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
-    const DB_Row<N>& xdbm_k = x.dbm[k];
+    const DB_Row<N>& x_dbm_k = x.dbm[k];
     for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
-      DB_Row<N>& xdbm_i = x.dbm[i];
-      const N& xdbm_i_k = xdbm_i[k];
-      if (!is_plus_infinity(xdbm_i_k))
-	for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
-	  const N& xdbm_k_j = xdbm_k[j];
-	  if (!is_plus_infinity(xdbm_k_j)) {
-	    // Rounding upward for correctness.
-	    add_assign_r(sum, xdbm_i_k, xdbm_k_j, ROUND_UP);
-	    min_assign(xdbm_i[j], sum);
-	  }
-	}
+      DB_Row<N>& x_dbm_i = x.dbm[i];
+      const N& x_dbm_i_k = x_dbm_i[k];
+      if (!is_plus_infinity(x_dbm_i_k))
+        for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+          const N& x_dbm_k_j = x_dbm_k[j];
+          if (!is_plus_infinity(x_dbm_k_j)) {
+            // Rounding upward for correctness.
+            add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+            min_assign(x_dbm_i[j], sum);
+          }
+        }
     }
   }
 
-  // Check for emptyness: the BDS is empty if and only if there is a
+  // Check for emptiness: the BDS is empty if and only if there is a
   // negative value on the main diagonal of `dbm'.
   for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
     N& x_dbm_hh = x.dbm[h][h];
-    if (x_dbm_hh < 0) {
-      x.status.set_empty();
+    if (sgn(x_dbm_hh) < 0) {
+      x.set_empty();
       return;
     }
     else {
-      assert(x_dbm_hh == 0);
+      assert(sgn(x_dbm_hh) == 0);
       // Restore PLUS_INFINITY on the main diagonal.
-      x_dbm_hh = PLUS_INFINITY;
+      assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
     }
   }
 
   // The BDS is not empty and it is now shortest-path closed.
-  x.status.set_shortest_path_closed();
+  x.set_shortest_path_closed();
 }
 
 template <typename T>
@@ -995,7 +1675,12 @@ BD_Shape<T>::shortest_path_reduction_assign() const {
   if (marked_shortest_path_reduced())
     return;
 
-  // First find the tighest constraints for this BDS.
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return;
+
+  // First find the tightest constraints for this BDS.
   shortest_path_closure_assign();
 
   // If `*this' is empty, then there is nothing to reduce.
@@ -1012,31 +1697,35 @@ BD_Shape<T>::shortest_path_reduction_assign() const {
   compute_leader_indices(predecessor, leaders);
   const dimension_type num_leaders = leaders.size();
 
-  const dimension_type space_dim = space_dimension();
-  // TODO: directly work on `redundancy_dbm' so as to minimize allocations.
-  std::deque<bool> redundancy_row(space_dim + 1, true);
-  std::vector<std::deque<bool> > redundancy(space_dim + 1, redundancy_row);
+  Bit_Matrix redundancy(space_dim + 1, space_dim + 1);
+  // Init all constraints to be redundant.
+  // TODO: provide an appropriate method to set multiple bits.
+  Bit_Row& red_0 = redundancy[0];
+  for (dimension_type j = space_dim + 1; j-- > 0; )
+    red_0.set(j);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    redundancy[i] = red_0;
 
   // Step 2: flag non-redundant constraints in the (zero-cycle-free)
   // subsystem of bounded differences having only leaders as variables.
-  N c;
+  DIRTY_TEMP(N, c);
   for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
     const dimension_type i = leaders[l_i];
     const DB_Row<N>& dbm_i = dbm[i];
-    std::deque<bool>& redundancy_i = redundancy[i];
+    Bit_Row& redundancy_i = redundancy[i];
     for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
       const dimension_type j = leaders[l_j];
       if (redundancy_i[j]) {
-	const N& dbm_i_j = dbm_i[j];
-	redundancy_i[j] = false;
-	for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
-	  const dimension_type k = leaders[l_k];
-	  add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
-	  if (dbm_i_j >= c) {
-	    redundancy_i[j] = true;
-	    break;
-	  }
-	}
+        const N& dbm_i_j = dbm_i[j];
+        redundancy_i.clear(j);
+        for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+          const dimension_type k = leaders[l_k];
+          add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+          if (dbm_i_j >= c) {
+            redundancy_i.set(j);
+            break;
+          }
+        }
       }
     }
   }
@@ -1051,20 +1740,20 @@ BD_Shape<T>::shortest_path_reduction_assign() const {
     if (i != predecessor[i] && !dealt_with[i]) {
       dimension_type j = i;
       while (true) {
-	const dimension_type pred_j = predecessor[j];
-	if (j == pred_j) {
-	  // We finally found the leader of `i'.
-	  assert(redundancy[i][j]);
-	  redundancy[i][j] = false;
-	  // Here we dealt with `j' (i.e., `pred_j'), but it is useless
-	  // to update `dealt_with' because `j' is a leader.
-	  break;
-	}
-	// We haven't found the leader of `i' yet.
-	assert(redundancy[pred_j][j]);
-	redundancy[pred_j][j] = false;
-	dealt_with[pred_j] = true;
-	j = pred_j;
+        const dimension_type pred_j = predecessor[j];
+        if (j == pred_j) {
+          // We finally found the leader of `i'.
+          assert(redundancy[i][j]);
+          redundancy[i].clear(j);
+          // Here we dealt with `j' (i.e., `pred_j'), but it is useless
+          // to update `dealt_with' because `j' is a leader.
+          break;
+        }
+        // We haven't found the leader of `i' yet.
+        assert(redundancy[pred_j][j]);
+        redundancy[pred_j].clear(j);
+        dealt_with[pred_j] = true;
+        j = pred_j;
       }
     }
 
@@ -1072,7 +1761,7 @@ BD_Shape<T>::shortest_path_reduction_assign() const {
   // it might change its internal representation.
   BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
   std::swap(x.redundancy_dbm, redundancy);
-  x.status.set_shortest_path_reduced();
+  x.set_shortest_path_reduced();
 
   assert(is_shortest_path_reduced());
 }
@@ -1106,10 +1795,13 @@ BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
       N& dbm_ij = dbm_i[j];
       const N& y_dbm_ij = y_dbm_i[j];
       if (dbm_ij < y_dbm_ij)
-	dbm_ij = y_dbm_ij;
+        dbm_ij = y_dbm_ij;
     }
   }
-  // The result is still closed.
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
   assert(OK());
 }
 
@@ -1122,22 +1814,22 @@ BD_Shape<T>::bds_difference_assign(const BD_Shape& y) {
   if (space_dim != y.space_dimension())
     throw_dimension_incompatible("bds_difference_assign(y)", y);
 
-  BD_Shape new_bdiffs(space_dim, EMPTY);
+  BD_Shape new_bd_shape(space_dim, EMPTY);
 
   BD_Shape& x = *this;
 
   x.shortest_path_closure_assign();
-  // The difference of an empty system of bounded differences
-  // and of a system of bounded differences `p' is empty.
+  // The difference of an empty bounded difference shape
+  // and of a bounded difference shape `p' is empty.
   if (x.marked_empty())
     return;
   y.shortest_path_closure_assign();
-  // The difference of a system of bounded differences `p'
-  // and an empty system of bounded differences is `p'.
+  // The difference of a bounded difference shape `p'
+  // and an empty bounded difference shape is `p'.
   if (y.marked_empty())
     return;
 
-  // If both systems of bounded differences are zero-dimensional,
+  // If both bounded difference shapes are zero-dimensional,
   // then at this point they are necessarily universe system of
   // bounded differences, so that their difference is empty.
   if (space_dim == 0) {
@@ -1157,37 +1849,41 @@ BD_Shape<T>::bds_difference_assign(const BD_Shape& y) {
   // of these complementaries with the system x.
   const Constraint_System& y_cs = y.constraints();
   for (Constraint_System::const_iterator i = y_cs.begin(),
-	 y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
     const Constraint& c = *i;
-    // If the system of bounded differences `x' is included
-    // in the system of bounded differences defined by `c',
+    // If the bounded difference shape `x' is included
+    // in the bounded difference shape defined by `c',
     // then `c' _must_ be skipped, as adding its complement to `x'
-    // would result in the empty system of bounded differences,
+    // would result in the empty bounded difference shape,
     // and as we would obtain a result that is less precise
     // than the bds-difference.
     if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
       continue;
     BD_Shape z = x;
     const Linear_Expression e = Linear_Expression(c);
-    bool change = false;
-    if (c.is_nonstrict_inequality())
-      change = z.add_constraint_and_minimize(e <= 0);
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_bd_shape.bds_hull_assign(z);
     if (c.is_equality()) {
-      BD_Shape w = x;
-      if (w.add_constraint_and_minimize(e <= 0))
-	new_bdiffs.bds_hull_assign(w);
-      change = z.add_constraint_and_minimize(e >= 0);
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_bd_shape.bds_hull_assign(z);
     }
-    if (change)
-      new_bdiffs.bds_hull_assign(z);
   }
-  *this = new_bdiffs;
-  // The result is still closed, because both bds_hull_assign() and
-  // add_constraint_and_minimize() preserve closure.
+  *this = new_bd_shape;
   assert(OK());
 }
 
 template <typename T>
+bool
+BD_Shape<T>::simplify_using_context_assign(const BD_Shape& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
+
+template <typename T>
 void
 BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
   // Adding no dimensions is a no-op.
@@ -1199,19 +1895,19 @@ BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
   const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
 
   // To embed an n-dimension space BDS in a (n+m)-dimension space,
-  // we just add `m' rows and columns in the system of bounded differences,
+  // we just add `m' rows and columns in the bounded difference shape,
   // initialized to PLUS_INFINITY.
   dbm.grow(new_space_dim + 1);
 
   // Shortest-path closure is maintained (if it was holding).
   // TODO: see whether reduction can be (efficiently!) maintained too.
   if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    reset_shortest_path_reduced();
 
   // If `*this' was the zero-dim space universe BDS,
   // the we can set the shortest-path closure flag.
   if (was_zero_dim_univ)
-    status.set_shortest_path_closed();
+    set_shortest_path_closed();
 
   assert(OK());
 }
@@ -1232,18 +1928,18 @@ BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
     dbm.grow(m + 1);
     if (!marked_empty()) {
       for (dimension_type i = m + 1; i-- > 0; ) {
-	DB_Row<N>& dbm_i = dbm[i];
-	for (dimension_type j = m + 1; j-- > 0; )
-	  if (i != j)
-	    assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+        DB_Row<N>& dbm_i = dbm[i];
+        for (dimension_type j = m + 1; j-- > 0; )
+          if (i != j)
+            assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
       }
-      status.set_shortest_path_closed();
+      set_shortest_path_closed();
     }
     assert(OK());
     return;
   }
 
-  // To project an n-dimension space system of bounded differences
+  // To project an n-dimension space bounded difference shape
   // in a (n+m)-dimension space, we add `m' rows and columns.
   // In the first row and column of the matrix we add `zero' from
   // the (n+1)-th position to the end.
@@ -1258,7 +1954,7 @@ BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
   }
 
   if (marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
+    reset_shortest_path_closed();
   assert(OK());
 }
 
@@ -1273,19 +1969,18 @@ BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
     return;
   }
 
-  // Dimension-compatibility check: the variable having
-  // maximum cardinality is the one occurring last in the set.
-  const dimension_type max_dim_to_be_removed = to_be_removed.rbegin()->id();
   const dimension_type old_space_dim = space_dimension();
-  if (max_dim_to_be_removed >= old_space_dim)
-    throw_dimension_incompatible("remove_space_dimensions(vs)",
-				 max_dim_to_be_removed);
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_removed.space_dimension();
+  if (old_space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
 
   // Shortest-path closure is necessary to keep precision.
   shortest_path_closure_assign();
 
-  // When removing _all_ dimensions from a BDS,
-  // we obtain the zero-dimensional BDS.
+  // When removing _all_ dimensions from a BDS, we obtain the
+  // zero-dimensional BDS.
   const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
   if (new_space_dim == 0) {
     dbm.resize_no_copy(1);
@@ -1296,27 +1991,34 @@ BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
     return;
   }
 
+  // Handle the case of an empty BD_Shape.
+  if (marked_empty()) {
+    dbm.resize_no_copy(new_space_dim + 1);
+    assert(OK());
+    return;
+  }
+
   // Shortest-path closure is maintained.
   // TODO: see whether reduction can be (efficiently!) maintained too.
   if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    reset_shortest_path_reduced();
 
-  // For each variable to remove, we erase the corresponding column and
-  // row by shifting the other columns and rows, than are not removed,
-  // respectively left and above.
+  // For each variable to remove, we fill the corresponding column and
+  // row by shifting respectively left and above those
+  // columns and rows, that will not be removed.
   Variables_Set::const_iterator tbr = to_be_removed.begin();
   Variables_Set::const_iterator tbr_end = to_be_removed.end();
-  dimension_type dst = tbr->id() + 1;
+  dimension_type dst = *tbr + 1;
   dimension_type src = dst + 1;
   for (++tbr; tbr != tbr_end; ++tbr) {
-    const dimension_type tbr_next = tbr->id() + 1;
+    const dimension_type tbr_next = *tbr + 1;
     // All other columns and rows are moved respectively to the left
     // and above.
     while (src < tbr_next) {
-      dbm[dst] = dbm[src];
+      std::swap(dbm[dst], dbm[src]);
       for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
-	DB_Row<N>& dbm_i = dbm[i];
-	dbm_i[dst] = dbm_i[src];
+        DB_Row<N>& dbm_i = dbm[i];
+        assign_or_swap(dbm_i[dst], dbm_i[src]);
       }
       ++dst;
       ++src;
@@ -1326,10 +2028,10 @@ BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
 
   // Moving the remaining rows and columns.
   while (src <= old_space_dim) {
-    dbm[dst] = dbm[src];
+    std::swap(dbm[dst], dbm[src]);
     for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
       DB_Row<N>& dbm_i = dbm[i];
-      dbm_i[dst] = dbm_i[src];
+      assign_or_swap(dbm_i[dst], dbm_i[src]);
     }
     ++src;
     ++dst;
@@ -1341,9 +2043,9 @@ BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
 }
 
 template <typename T>
-template <typename PartialFunction>
+template <typename Partial_Function>
 void
-BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
+BD_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
   const dimension_type space_dim = space_dimension();
   // TODO: this implementation is just an executable specification.
   if (space_dim == 0)
@@ -1352,7 +2054,6 @@ BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
   if (pfunc.has_empty_codomain()) {
     // All dimensions vanish: the BDS becomes zero_dimensional.
     remove_higher_space_dimensions(0);
-    assert(OK());
     return;
   }
 
@@ -1363,7 +2064,7 @@ BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
     shortest_path_closure_assign();
 
   // If the BDS is empty, then it is sufficient to adjust the
-  // space dimension of the system of bounded differences.
+  // space dimension of the bounded difference shape.
   if (marked_empty()) {
     remove_higher_space_dimensions(new_space_dim);
     return;
@@ -1372,36 +2073,36 @@ BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
   // Shortest-path closure is maintained (if it was holding).
   // TODO: see whether reduction can be (efficiently!) maintained too.
   if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    reset_shortest_path_reduced();
 
   // We create a new matrix with the new space dimension.
   DB_Matrix<N> x(new_space_dim+1);
   // First of all we must map the unary constraints, because
   // there is the fictitious variable `zero', that can't be mapped
   // at all.
-  const DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_0 = dbm[0];
   DB_Row<N>& x_0 = x[0];
   for (dimension_type j = 1; j <= space_dim; ++j) {
     dimension_type new_j;
     if (pfunc.maps(j - 1, new_j)) {
-      x_0[new_j + 1] = dbm_0[j];
-      x[new_j + 1][0] = dbm[j][0];
+      assign_or_swap(x_0[new_j + 1], dbm_0[j]);
+      assign_or_swap(x[new_j + 1][0], dbm[j][0]);
     }
   }
   // Now we map the binary constraints, exchanging the indexes.
   for (dimension_type i = 1; i <= space_dim; ++i) {
     dimension_type new_i;
     if (pfunc.maps(i - 1, new_i)) {
-      const DB_Row<N>& dbm_i = dbm[i];
+      DB_Row<N>& dbm_i = dbm[i];
       ++new_i;
       DB_Row<N>& x_new_i = x[new_i];
       for (dimension_type j = i+1; j <= space_dim; ++j) {
-	dimension_type new_j;
-	if (pfunc.maps(j - 1, new_j)) {
-	  ++new_j;
-	  x_new_i[new_j] = dbm_i[j];
-	  x[new_j][new_i] = dbm[j][i];
-	}
+        dimension_type new_j;
+        if (pfunc.maps(j - 1, new_j)) {
+          ++new_j;
+          assign_or_swap(x_new_i[new_j], dbm_i[j]);
+          assign_or_swap(x[new_j][new_i], dbm[j][i]);
+        }
       }
     }
   }
@@ -1419,7 +2120,7 @@ BD_Shape<T>::intersection_assign(const BD_Shape& y) {
   if (space_dim != y.space_dimension())
     throw_dimension_incompatible("intersection_assign(y)", y);
 
-  // If one of the two systems of bounded differences is empty,
+  // If one of the two bounded difference shapes is empty,
   // the intersection is empty.
   if (marked_empty())
     return;
@@ -1428,13 +2129,13 @@ BD_Shape<T>::intersection_assign(const BD_Shape& y) {
     return;
   }
 
-  // If both systems of bounded differences are zero-dimensional,
+  // If both bounded difference shapes are zero-dimensional,
   // then at this point they are necessarily non-empty,
   // so that their intersection is non-empty too.
   if (space_dim == 0)
     return;
 
-  // To intersect two systems of bounded differences we compare
+  // To intersect two bounded difference shapes we compare
   // the constraints and we choose the less values.
   bool changed = false;
   for (dimension_type i = space_dim + 1; i-- > 0; ) {
@@ -1444,14 +2145,14 @@ BD_Shape<T>::intersection_assign(const BD_Shape& y) {
       N& dbm_ij = dbm_i[j];
       const N& y_dbm_ij = y_dbm_i[j];
       if (dbm_ij > y_dbm_ij) {
-	dbm_ij = y_dbm_ij;
-	changed = true;
+        dbm_ij = y_dbm_ij;
+        changed = true;
       }
     }
   }
 
   if (changed && marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
+    reset_shortest_path_closed();
   assert(OK());
 }
 
@@ -1459,8 +2160,8 @@ template <typename T>
 template <typename Iterator>
 void
 BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
-				       Iterator first, Iterator last,
-				       unsigned* tp) {
+                                       Iterator first, Iterator last,
+                                       unsigned* tp) {
   const dimension_type space_dim = space_dimension();
 
   // Dimension-compatibility check.
@@ -1476,7 +2177,7 @@ BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
   }
 #endif
 
-  // If both systems of bounded differences are zero-dimensional,
+  // If both bounded difference shapes are zero-dimensional,
   // since `*this' contains `y', we simply return `*this'.
   if (space_dim == 0)
     return;
@@ -1515,87 +2216,92 @@ BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
       N& dbm_ij = dbm_i[j];
       const N& y_dbm_ij = y_dbm_i[j];
       if (y_dbm_ij < dbm_ij) {
-	Iterator k = std::lower_bound(first, last, dbm_ij);
-	if (k != last) {
-	  if (dbm_ij < *k)
-	    assign_r(dbm_ij, *k, ROUND_UP);
-	}
-	else
-	  dbm_ij = PLUS_INFINITY;
+        Iterator k = std::lower_bound(first, last, dbm_ij);
+        if (k != last) {
+          if (dbm_ij < *k)
+            assign_r(dbm_ij, *k, ROUND_UP);
+        }
+        else
+          assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
       }
     }
   }
-  status.reset_shortest_path_closed();
+  reset_shortest_path_closed();
   assert(OK());
 }
 
 template <typename T>
 void
 BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
-				BD_Shape& limiting_shape) const {
-  using Implementation::BD_Shapes::div_round_up;
-
+                                BD_Shape& limiting_shape) const {
   const dimension_type cs_space_dim = cs.space_dimension();
   // Private method: the caller has to ensure the following.
   assert(cs_space_dim <= space_dimension());
 
+  shortest_path_closure_assign();
   bool changed = false;
-  for (Constraint_System::const_iterator i = cs.begin(),
-	 iend = cs.end(); i != iend; ++i) {
-    const Constraint& c = *i;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(minus_c_term);
+  DIRTY_TEMP(N, d);
+  DIRTY_TEMP(N, d1);
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
     dimension_type num_vars = 0;
     dimension_type i = 0;
     dimension_type j = 0;
-    TEMP_INTEGER(coeff);
     // Constraints that are not bounded differences are ignored.
     if (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) {
       // Select the cell to be modified for the "<=" part of the constraint,
       // and set `coeff' to the absolute value of itself.
-      const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
-      const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+      const bool negative = (coeff < 0);
+      const N& x = negative ? dbm[i][j] : dbm[j][i];
+      const N& y = negative ? dbm[j][i] : dbm[i][j];
       DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
-      N& ls_x = (coeff < 0) ? ls_dbm[i][j] : ls_dbm[j][i];
-      N& ls_y = (coeff < 0) ? ls_dbm[j][i] : ls_dbm[i][j];
-      if (coeff < 0)
-	coeff = -coeff;
+      N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+      N& ls_y = negative ? ls_dbm[j][i] : ls_dbm[i][j];
+      if (negative)
+        neg_assign(coeff);
       // Compute the bound for `x', rounding towards plus infinity.
-      N d;
       div_round_up(d, c.inhomogeneous_term(), coeff);
-      if (x <= d)
-	if (c.is_inequality())
-	  if (ls_x > d) {
-	    ls_x = d;
-	    changed = true;
-	  }
-	else {
-	  // Compute the bound for `y', rounding towards plus infinity.
-	  div_round_up(d, -c.inhomogeneous_term(), coeff);
-	  if (y <= d)
-	    if (ls_y > d) {
-	      ls_y = d;
-	      changed = true;
-	    }
-
+      if (x <= d) {
+        if (c.is_inequality()) {
+          if (ls_x > d) {
+            ls_x = d;
+            changed = true;
+          }
 	}
+        else {
+          // Compute the bound for `y', rounding towards plus infinity.
+          neg_assign(minus_c_term, c.inhomogeneous_term());
+          div_round_up(d1, minus_c_term, coeff);
+          if (y <= d1)
+	    if((ls_x >= d && ls_y > d1) || (ls_x > d && ls_y >= d1)) {
+	      ls_x = d;
+	      ls_y = d1;
+	      changed = true;
+          }
+        }
+      }
     }
   }
 
   // In general, adding a constraint does not preserve the shortest-path
-  // closure of the system of bounded differences.
+  // closure of the bounded difference shape.
   if (changed && limiting_shape.marked_shortest_path_closed())
-    limiting_shape.status.reset_shortest_path_closed();
+    limiting_shape.reset_shortest_path_closed();
 }
 
 template <typename T>
 void
 BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
-					       const Constraint_System& cs,
-					       unsigned* tp) {
+                                               const Constraint_System& cs,
+                                               unsigned* tp) {
   // Dimension-compatibility check.
   const dimension_type space_dim = space_dimension();
   if (space_dim != y.space_dimension())
     throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
-				 y);
+                                 y);
 
   // `cs' must be dimension-compatible with the two systems
   // of bounded differences.
@@ -1633,7 +2339,6 @@ BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
   get_limiting_shape(cs, limiting_shape);
   CC76_extrapolation_assign(y, tp);
   intersection_assign(limiting_shape);
-  assert(OK());
 }
 
 template <typename T>
@@ -1688,45 +2393,45 @@ BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
   for (dimension_type i = space_dim + 1; i-- > 0; ) {
     DB_Row<N>& dbm_i = dbm[i];
     const DB_Row<N>& y_dbm_i = y.dbm[i];
-    const std::deque<bool>& y_redundancy_i = y.redundancy_dbm[i];
+    const Bit_Row& y_redundancy_i = y.redundancy_dbm[i];
     for (dimension_type j = space_dim + 1; j-- > 0; ) {
       N& dbm_ij = dbm_i[j];
       // Note: in the following line the use of `!=' (as opposed to
       // the use of `<' that would seem -but is not- equivalent) is
       // intentional.
       if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
-	dbm_ij = PLUS_INFINITY;
+        assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
     }
   }
   // NOTE: this will also reset the shortest-path reduction flag,
   // even though the dbm is still in reduced form. However, the
   // current implementation invariant requires that any reduced dbm
   // is closed too.
-  status.reset_shortest_path_closed();
+  reset_shortest_path_closed();
   assert(OK());
 }
 
 template <typename T>
 void
 BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
-						 const Constraint_System& cs,
-						 unsigned* tp) {
+                                                 const Constraint_System& cs,
+                                                 unsigned* tp) {
   // Dimension-compatibility check.
   const dimension_type space_dim = space_dimension();
   if (space_dim != y.space_dimension())
     throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
-				 y);
+                                 y);
   // `cs' must be dimension-compatible with the two systems
   // of bounded differences.
   const dimension_type cs_space_dim = cs.space_dimension();
   if (space_dim < cs_space_dim)
     throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
-				  "(y, cs)");
+                                  "(y, cs)");
 
   // Strict inequalities are not allowed.
   if (cs.has_strict_inequalities())
     throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
-				  "(y, cs)");
+                                  "(y, cs)");
 
   // The limited BHMZ05-extrapolation between two systems of bounded
   // differences in a zero-dimensional space is a system of bounded
@@ -1754,7 +2459,6 @@ BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
   get_limiting_shape(cs, limiting_shape);
   BHMZ05_widening_assign(y, tp);
   intersection_assign(limiting_shape);
-  assert(OK());
 }
 
 template <typename T>
@@ -1775,7 +2479,7 @@ BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
   }
 #endif
 
-  // If both systems of bounded differences are zero-dimensional,
+  // If both bounded difference shapes are zero-dimensional,
   // since `y' contains `*this', we simply return `*this'.
   if (space_dim == 0)
     return;
@@ -1799,15 +2503,15 @@ BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
       N& dbm_ij = dbm_i[j];
       const N& y_dbm_ij = y_dbm_i[j];
       if (!is_plus_infinity(dbm_ij)
-	  && !is_plus_infinity(y_dbm_ij)
-	  && dbm_ij != y_dbm_ij) {
-	dbm_ij = y_dbm_ij;
-	changed = true;
+          && !is_plus_infinity(y_dbm_ij)
+          && dbm_ij != y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
       }
     }
   }
   if (changed && marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
+    reset_shortest_path_closed();
   assert(OK());
 }
 
@@ -1815,10 +2519,12 @@ template <typename T>
 void
 BD_Shape<T>
 ::deduce_v_minus_u_bounds(const dimension_type v,
-			  const dimension_type last_v,
-			  const Linear_Expression& sc_expr,
-			  Coefficient_traits::const_reference sc_den,
-			  const N& pos_sum) {
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_den,
+                          const N& ub_v) {
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(ub_v));
   // Deduce constraints of the form `v - u', where `u != v'.
   // Note: the shortest-path closure is able to deduce the constraint
   // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
@@ -1827,44 +2533,46 @@ BD_Shape<T>
   // greater than zero. In particular:
   // if `q >= 1',    then `v - u <= ub_v - ub_u';
   // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
-  mpq_class mpq_sc_den;
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
   assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
   const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP(N, up_approx);
   // No need to consider indices greater than `last_v'.
   for (dimension_type u = last_v; u > 0; --u)
     if (u != v) {
       const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
-      if (expr_u > 0)
-	if (expr_u >= sc_den)
-	  // Deducing `v - u <= ub_v - ub_u'.
-	  sub_assign_r(dbm[u][v], pos_sum, dbm_0[u], ROUND_UP);
-	else {
-	  DB_Row<N>& dbm_u = dbm[u];
-	  const N& dbm_u0 = dbm_u[0];
-	  if (!is_plus_infinity(dbm_u0)) {
-	    // Let `ub_u' and `lb_u' be the known upper and lower bound
-	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
-	    // rational coefficient of `u' in `sc_expr/sc_den',
-	    // the upper bound for `v - u' is computed as
-	    // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
-	    // `pos_sum + (-lb_u) - q * (ub_u + (-lb_u))'.
-	    mpq_class minus_lb_u;
-	    assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
-	    mpq_class q;
-	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
-	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
-	    mpq_class ub_u;
-	    assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED);
-	    // Compute `ub_u - lb_u'.
-	    add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
-	    // Compute `(-lb_u) - q * (ub_u - lb_u)'.
-	    sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
-	    N up_approx;
-	    assign_r(up_approx, minus_lb_u, ROUND_UP);
-	    // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
-	    add_assign_r(dbm_u[v], pos_sum, up_approx, ROUND_UP);
-	  }
-	}
+      if (expr_u > 0) {
+        if (expr_u >= sc_den)
+          // Deducing `v - u <= ub_v - ub_u'.
+          sub_assign_r(dbm[u][v], ub_v, dbm_0[u], ROUND_UP);
+        else {
+          DB_Row<N>& dbm_u = dbm[u];
+          const N& dbm_u0 = dbm_u[0];
+          if (!is_plus_infinity(dbm_u0)) {
+            // Let `ub_u' and `lb_u' be the known upper and lower bound
+            // for `u', respectively. Letting `q = expr_u/sc_den' be the
+            // rational coefficient of `u' in `sc_expr/sc_den',
+            // the upper bound for `v - u' is computed as
+            // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+            // `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+            assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+            assign_r(q, expr_u, ROUND_NOT_NEEDED);
+            div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+            assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED);
+            // Compute `ub_u - lb_u'.
+            add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+            // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+            sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+            assign_r(up_approx, minus_lb_u, ROUND_UP);
+            // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+            add_assign_r(dbm_u[v], ub_v, up_approx, ROUND_UP);
+          }
+        }
+      }
     }
 }
 
@@ -1872,10 +2580,12 @@ template <typename T>
 void
 BD_Shape<T>
 ::deduce_u_minus_v_bounds(const dimension_type v,
-			  const dimension_type last_v,
-			  const Linear_Expression& sc_expr,
-			  Coefficient_traits::const_reference sc_den,
-			  const N& neg_sum) {
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_den,
+                          const N& minus_lb_v) {
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(minus_lb_v));
   // Deduce constraints of the form `u - v', where `u != v'.
   // Note: the shortest-path closure is able to deduce the constraint
   // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
@@ -1884,98 +2594,559 @@ BD_Shape<T>
   // greater than zero. In particular:
   // if `q >= 1',    then `u - v <= lb_u - lb_v';
   // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
-  mpq_class mpq_sc_den;
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
   assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
   DB_Row<N>& dbm_0 = dbm[0];
   DB_Row<N>& dbm_v = dbm[v];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP(N, up_approx);
   // No need to consider indices greater than `last_v'.
   for (dimension_type u = last_v; u > 0; --u)
     if (u != v) {
       const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
-      if (expr_u > 0)
-	if (expr_u >= sc_den)
-	  // Deducing `u - v <= lb_u - lb_v',
-	  // i.e., `u - v <= (-lb_v) - (-lb_u)'.
-	  sub_assign_r(dbm_v[u], neg_sum, dbm[u][0], ROUND_UP);
-	else {
-	  const N& dbm_0u = dbm_0[u];
-	  if (!is_plus_infinity(dbm_0u)) {
-	    // Let `ub_u' and `lb_u' be the known upper and lower bound
-	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
-	    // rational coefficient of `u' in `sc_expr/sc_den',
-	    // the upper bound for `u - v' is computed as
-	    // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
-	    // `ub_u - q * (ub_u + (-lb_u)) + neg_sum'.
-	    mpq_class ub_u;
-	    assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
-	    mpq_class q;
-	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
-	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
-	    mpq_class minus_lb_u;
-	    assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED);
-	    // Compute `ub_u - lb_u'.
-	    add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
-	    // Compute `ub_u - q * (ub_u - lb_u)'.
-	    sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
-	    N up_approx;
-	    assign_r(up_approx, ub_u, ROUND_UP);
-	    // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
-	    add_assign_r(dbm_v[u], up_approx, neg_sum, ROUND_UP);
-	  }
-	}
+      if (expr_u > 0) {
+        if (expr_u >= sc_den)
+          // Deducing `u - v <= lb_u - lb_v',
+          // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+          sub_assign_r(dbm_v[u], minus_lb_v, dbm[u][0], ROUND_UP);
+        else {
+          const N& dbm_0u = dbm_0[u];
+          if (!is_plus_infinity(dbm_0u)) {
+            // Let `ub_u' and `lb_u' be the known upper and lower bound
+            // for `u', respectively. Letting `q = expr_u/sc_den' be the
+            // rational coefficient of `u' in `sc_expr/sc_den',
+            // the upper bound for `u - v' is computed as
+            // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+            // `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+            assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+            assign_r(q, expr_u, ROUND_NOT_NEEDED);
+            div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+            assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED);
+            // Compute `ub_u - lb_u'.
+            add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+            // Compute `ub_u - q * (ub_u - lb_u)'.
+            sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+            assign_r(up_approx, ub_u, ROUND_UP);
+            // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+            add_assign_r(dbm_v[u], up_approx, minus_lb_v, ROUND_UP);
+          }
+        }
+      }
     }
 }
 
 template <typename T>
 void
-BD_Shape<T>::affine_image(const Variable var,
-			  const Linear_Expression& expr,
-			  Coefficient_traits::const_reference denominator) {
-  using Implementation::BD_Shapes::div_round_up;
-
-  // The denominator cannot be zero.
-  if (denominator == 0)
-    throw_generic("affine_image(v, e, d)", "d == 0");
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
 
-  // Dimension-compatibility checks.
-  // The dimension of `expr' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type space_dim = space_dimension();
-  const dimension_type expr_space_dim = expr.space_dimension();
-  if (space_dim < expr_space_dim)
-    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+template <typename T>
+void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
 
-  // `var' should be one of the dimensions of the shape.
-  const dimension_type v = var.id() + 1;
-  if (v > space_dim)
-    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type dim = var.id();
+  if (space_dimension() < dim)
+    throw_dimension_incompatible("unconstrain(var)", dim);
 
-  // The image of an empty BDS is empty too.
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
   shortest_path_closure_assign();
+
+  // If the shape is empty, this is a no-op.
   if (marked_empty())
     return;
 
-  const Coefficient& b = expr.inhomogeneous_term();
-  // Number of non-zero coefficients in `expr': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t = 0;
-  // Index of the last non-zero coefficient in `expr', if any.
-  dimension_type w = 0;
-  // Get information about the number of non-zero coefficients in `expr'.
-  for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
-      if (t++ == 1)
-	break;
-      else
-	w = i+1;
+  forget_all_dbm_constraints(dim+1);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  assert(OK());
+}
 
-  // Now we know the form of `expr':
-  // - If t == 0, then expr == b, with `b' a constant;
-  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
-  //   variable; in this second case we have to check whether `a' is
-  //   equal to `denominator' or `-denominator', since otherwise we have
-  //   to fall back on the general form;
-  // - If t == 2, the `expr' is of the general form.
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu)
+    forget_all_dbm_constraints(*tbu + 1);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine(const Variable var,
+                    const Relation_Symbol relsym,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator) {
+  assert(denominator != 0);
+  const dimension_type expr_space_dim = expr.space_dimension();
+  assert(space_dimension() >= expr_space_dim);
+  const dimension_type v = var.id() + 1;
+  assert(v <= space_dimension());
+  assert(expr.coefficient(var) == 0);
+  assert(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
+
+  // Since we are only able to record bounded differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.coefficient(Variable(w-1)) != denominator)
+    t = 2;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w != v' and `a == denominator';
+  // - If t == 2, the `expr' is of the general form.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    return;
+  }
+
+  if (t == 1) {
+    // Case 2: expr == a*w + b, w != v, a == denominator.
+    assert(expr.coefficient(Variable(w-1)) == denominator);
+    DIRTY_TEMP(N, d);
+    switch (relsym) {
+    case EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_den);
+      add_dbm_constraint(v, w, d);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_den);
+      add_dbm_constraint(v, w, d);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    return;
+  }
+
+  // Here t == 2, so that either
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, or
+  // expr == a*w + b, w != v and a != denominator.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  DIRTY_TEMP(N, sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  // Speculative allocation of temporaries that are used in most
+  // of the computational traces starting from this point (also loops).
+  TEMP_INTEGER(minus_sc_i);
+  DIRTY_TEMP(N, coeff_i);
+
+  switch (relsym) {
+  case EQUAL:
+    {
+      DIRTY_TEMP(N, neg_sum);
+      // Indices of the variables that are unbounded in `this->dbm'.
+      // (The initializations are just to quiet a compiler warning.)
+      dimension_type neg_pinf_index = 0;
+      // Number of unbounded variables found.
+      dimension_type neg_pinf_count = 0;
+
+      // Compute an upper approximation for `expr' into `sum',
+      // taking into account the sign of `denominator'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `sc_expr'.
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `expr'.
+      for (dimension_type i = w; i > 0; --i) {
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        if (sign_i > 0) {
+          assign_r(coeff_i, sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_i = dbm_0[i];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i;
+            }
+          }
+        }
+        else if (sign_i < 0) {
+          neg_assign(minus_sc_i, sc_i);
+          // Note: using temporary named `coeff_i' to store -coeff_i.
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_i = dbm_0[i];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i;
+            }
+          }
+        }
+      }
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1 && neg_pinf_count > 1) {
+        assert(OK());
+        return;
+      }
+
+      // In the following, shortest-path closure will be definitely lost.
+      reset_shortest_path_closed();
+
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+
+      // Exploit the upper approximation, if possible.
+      if (pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_den != 1)
+          div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+        // Add the upper bound constraint, if meaningful.
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          dbm[0][v] = sum;
+          // Deduce constraints of the form `v - u', where `u != v'.
+          deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+        }
+        else
+          // Here `pinf_count == 1'.
+          if (pinf_index != v
+              && sc_expr.coefficient(Variable(pinf_index-1)) == sc_den)
+            // Add the constraint `v - pinf_index <= sum'.
+            dbm[pinf_index][v] = sum;
+      }
+
+      // Exploit the lower approximation, if possible.
+      if (neg_pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_den != 1)
+          div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+        // Add the lower bound constraint, if meaningful.
+        if (neg_pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          DB_Row<N>& dbm_v = dbm[v];
+          dbm_v[0] = neg_sum;
+          // Deduce constraints of the form `u - v', where `u != v'.
+          deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+        }
+        else
+          // Here `neg_pinf_count == 1'.
+          if (neg_pinf_index != v
+              && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+            // Add the constraint `v - neg_pinf_index >= -neg_sum',
+            // i.e., `neg_pinf_index - v <= neg_sum'.
+            dbm[v][neg_pinf_index] = neg_sum;
+      }
+    }
+    break;
+
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `expr' into `sum',
+    // taking into account the sign of `denominator'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+        continue;
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_den' is known to be
+      // positive, this amounts to rounding downwards, which is achieved
+      // by rounding upwards `minus_sc-den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+      break;
+
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+        continue;
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_den' is known to be positive,
+      // this amounts to rounding downwards, which is achieved by rounding
+      // upwards `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+          && expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+  }
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
   TEMP_INTEGER(minus_den);
   neg_assign(minus_den, denominator);
 
@@ -1985,7 +3156,7 @@ BD_Shape<T>::affine_image(const Variable var,
     forget_all_dbm_constraints(v);
     // Shortest-path closure is preserved, but not reduction.
     if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
+      reset_shortest_path_reduced();
     // Add the constraint `var == b/denominator'.
     add_dbm_constraint(0, v, b, denominator);
     add_dbm_constraint(v, 0, b, minus_den);
@@ -1999,84 +3170,84 @@ BD_Shape<T>::affine_image(const Variable var,
     if (a == denominator || a == minus_den) {
       // Case 2: expr == a*w + b, with a == +/- denominator.
       if (w == v) {
-	// `expr' is of the form: a*v + b.
-	if (a == denominator) {
-	  if (b == 0)
-	    // The transformation is the identity function.
-	    return;
-	  else {
-	    // Translate all the constraints on `var',
-	    // adding or subtracting the value `b/denominator'.
-	    N d;
-	    div_round_up(d, b, denominator);
-	    N c;
-	    div_round_up(c, b, minus_den);
-	    DB_Row<N>& dbm_v = dbm[v];
-	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
-	      N& dbm_vi = dbm_v[i];
-	      add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
-	      N& dbm_iv = dbm[i][v];
-	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
-	    }
-	    // Both shortest-path closure and reduction are preserved.
-	  }
-	}
-	else {
-	  // Here `a == -denominator'.
-	  // Remove the binary constraints on `var'.
-	  forget_binary_dbm_constraints(v);
-	  // Swap the unary constraints on `var'.
-	  std::swap(dbm[v][0], dbm[0][v]);
-	  // Shortest-path closure is not preserved.
-	  status.reset_shortest_path_closed();
-	  if (b != 0) {
-	    // Translate the unary constraints on `var',
-	    // adding or subtracting the value `b/denominator'.
-	    N c;
-	    div_round_up(c, b, minus_den);
-	    N& dbm_v0 = dbm[v][0];
-	    add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
-	    N d;
-	    div_round_up(d, b, denominator);
-	    N& dbm_0v = dbm[0][v];
-	    add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
-	  }
-	}
+        // `expr' is of the form: a*v + b.
+        if (a == denominator) {
+          if (b == 0)
+            // The transformation is the identity function.
+            return;
+          else {
+            // Translate all the constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_den);
+            DB_Row<N>& dbm_v = dbm[v];
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+            }
+            // Both shortest-path closure and reduction are preserved.
+          }
+        }
+        else {
+          // Here `a == -denominator'.
+          // Remove the binary constraints on `var'.
+          forget_binary_dbm_constraints(v);
+          // Swap the unary constraints on `var'.
+          std::swap(dbm[v][0], dbm[0][v]);
+          // Shortest-path closure is not preserved.
+          reset_shortest_path_closed();
+          if (b != 0) {
+            // Translate the unary constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_den);
+            N& dbm_v0 = dbm[v][0];
+            add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            N& dbm_0v = dbm[0][v];
+            add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+          }
+        }
       }
       else {
-	// Here `w != v', so that `expr' is of the form
-	// +/-denominator * w + b.
-	// Remove all constraints on `var'.
-	forget_all_dbm_constraints(v);
-	// Shortest-path closure is preserved, but not reduction.
-	if (marked_shortest_path_reduced())
-	  status.reset_shortest_path_reduced();
-	if (a == denominator) {
-	  // Add the new constraint `v - w == b/denominator'.
-	  add_dbm_constraint(w, v, b, denominator);
-	  add_dbm_constraint(v, w, b, minus_den);
-	}
-	else {
-	  // Here a == -denominator, so that we should be adding
-	  // the constraint `v + w == b/denominator'.
-	  // Approximate it by computing lower and upper bounds for `w'.
-	  const N& dbm_w0 = dbm[w][0];
-	  if (!is_plus_infinity(dbm_w0)) {
-	    // Add the constraint `v <= b/denominator - lower_w'.
-	    N d;
-	    div_round_up(d, b, denominator);
-	    add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
-	    status.reset_shortest_path_closed();
-	  }
-	  const N& dbm_0w = dbm[0][w];
-	  if (!is_plus_infinity(dbm_0w)) {
-	    // Add the constraint `v >= b/denominator - upper_w'.
-	    N c;
-	    div_round_up(c, b, minus_den);
-	    add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
-	    status.reset_shortest_path_closed();
-	  }
-	}
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+          add_dbm_constraint(v, w, b, minus_den);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+          const N& dbm_0w = dbm[0][w];
+          if (!is_plus_infinity(dbm_0w)) {
+            // Add the constraint `v >= b/denominator - upper_w'.
+            DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_den);
+            add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
       }
       assert(OK());
       return;
@@ -2110,8 +3281,8 @@ BD_Shape<T>::affine_image(const Variable var,
     minus_expr = -expr;
   const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-  N pos_sum;
-  N neg_sum;
+  DIRTY_TEMP(N, pos_sum);
+  DIRTY_TEMP(N, neg_sum);
   // Indices of the variables that are unbounded in `this->dbm'.
   // (The initializations are just to quiet a compiler warning.)
   dimension_type pos_pinf_index = 0;
@@ -2125,61 +3296,61 @@ BD_Shape<T>::affine_image(const Variable var,
   assign_r(neg_sum, minus_sc_b, ROUND_UP);
 
   // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP(N, coeff_i);
+  TEMP_INTEGER(minus_sc_i);
   // Note: indices above `w' can be disregarded, as they all have
   // a zero coefficient in `sc_expr'.
-  const DB_Row<N>& dbm_0 = dbm[0];
   for (dimension_type i = w; i > 0; --i) {
     const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
     const int sign_i = sgn(sc_i);
     if (sign_i > 0) {
-      N coeff_i;
       assign_r(coeff_i, sc_i, ROUND_UP);
       // Approximating `sc_expr'.
       if (pos_pinf_count <= 1) {
-	const N& up_approx_i = dbm_0[i];
-	if (!is_plus_infinity(up_approx_i))
-	  add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
-	else {
-	  ++pos_pinf_count;
-	  pos_pinf_index = i;
-	}
+        const N& up_approx_i = dbm_0[i];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
       }
       // Approximating `-sc_expr'.
       if (neg_pinf_count <= 1) {
-	const N& up_approx_minus_i = dbm[i][0];
-	if (!is_plus_infinity(up_approx_minus_i))
-	  add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
-	else {
-	  ++neg_pinf_count;
-	  neg_pinf_index = i;
-	}
+        const N& up_approx_minus_i = dbm[i][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i;
+        }
       }
     }
     else if (sign_i < 0) {
-      TEMP_INTEGER(minus_sc_i);
       neg_assign(minus_sc_i, sc_i);
-      N minus_coeff_i;
-      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
       // Approximating `sc_expr'.
       if (pos_pinf_count <= 1) {
-	const N& up_approx_minus_i = dbm[i][0];
-	if (!is_plus_infinity(up_approx_minus_i))
-	  add_mul_assign_r(pos_sum,
-			   minus_coeff_i, up_approx_minus_i, ROUND_UP);
-	else {
-	  ++pos_pinf_count;
-	  pos_pinf_index = i;
-	}
+        const N& up_approx_minus_i = dbm[i][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
       }
       // Approximating `-sc_expr'.
       if (neg_pinf_count <= 1) {
-	const N& up_approx_i = dbm_0[i];
-	if (!is_plus_infinity(up_approx_i))
-	  add_mul_assign_r(neg_sum, minus_coeff_i, up_approx_i, ROUND_UP);
-	else {
-	  ++neg_pinf_count;
-	  neg_pinf_index = i;
-	}
+        const N& up_approx_i = dbm_0[i];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i;
+        }
       }
     }
   }
@@ -2188,7 +3359,7 @@ BD_Shape<T>::affine_image(const Variable var,
   forget_all_dbm_constraints(v);
   // Shortest-path closure is maintained, but not reduction.
   if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    reset_shortest_path_reduced();
   // Return immediately if no approximation could be computed.
   if (pos_pinf_count > 1 && neg_pinf_count > 1) {
     assert(OK());
@@ -2196,57 +3367,64 @@ BD_Shape<T>::affine_image(const Variable var,
   }
 
   // In the following, shortest-path closure will be definitely lost.
-  status.reset_shortest_path_closed();
-
-  // Before computing quotients, the denominator should be approximated
-  // towards zero. Since `sc_den' is known to be positive, this amounts to
-  // rounding downwards, which is achieved as usual by rounding upwards
-  // `minus_sc_den' and negating again the result.
-  N down_sc_den;
-  assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-  neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+  reset_shortest_path_closed();
 
   // Exploit the upper approximation, if possible.
   if (pos_pinf_count <= 1) {
     // Compute quotient (if needed).
-    if (down_sc_den != 1)
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
       div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    }
     // Add the upper bound constraint, if meaningful.
     if (pos_pinf_count == 0) {
       // Add the constraint `v <= pos_sum'.
-      DB_Row<N>& dbm_0 = dbm[0];
-      assign_r(dbm_0[v], pos_sum, ROUND_UP);
+      dbm[0][v] = pos_sum;
       // Deduce constraints of the form `v - u', where `u != v'.
       deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
     }
     else
       // Here `pos_pinf_count == 1'.
       if (pos_pinf_index != v
-	  && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
-	// Add the constraint `v - pos_pinf_index <= pos_sum'.
-	assign_r(dbm[pos_pinf_index][v], pos_sum, ROUND_UP);
+          && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
   }
 
   // Exploit the lower approximation, if possible.
   if (neg_pinf_count <= 1) {
     // Compute quotient (if needed).
-    if (down_sc_den != 1)
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
       div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    }
     // Add the lower bound constraint, if meaningful.
     if (neg_pinf_count == 0) {
       // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
       DB_Row<N>& dbm_v = dbm[v];
-      assign_r(dbm_v[0], neg_sum, ROUND_UP);
+      dbm_v[0] = neg_sum;
       // Deduce constraints of the form `u - v', where `u != v'.
       deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
     }
     else
       // Here `neg_pinf_count == 1'.
       if (neg_pinf_index != v
-	  && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
-	// Add the constraint `v - neg_pinf_index >= -neg_sum',
-	// i.e., `neg_pinf_index - v <= neg_sum'.
-	assign_r(dbm[v][neg_pinf_index], neg_sum, ROUND_UP);
+          && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+        // Add the constraint `v - neg_pinf_index >= -neg_sum',
+        // i.e., `neg_pinf_index - v <= neg_sum'.
+        dbm[v][neg_pinf_index] = neg_sum;
   }
 
   assert(OK());
@@ -2255,8 +3433,8 @@ BD_Shape<T>::affine_image(const Variable var,
 template <typename T>
 void
 BD_Shape<T>::affine_preimage(const Variable var,
-			     const Linear_Expression& expr,
-			     Coefficient_traits::const_reference denominator) {
+                             const Linear_Expression& expr,
+                             Coefficient_traits::const_reference denominator) {
   // The denominator cannot be zero.
   if (denominator == 0)
     throw_generic("affine_preimage(v, e, d)", "d == 0");
@@ -2270,7 +3448,7 @@ BD_Shape<T>::affine_preimage(const Variable var,
     throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
 
   // `var' should be one of the dimensions of
-  // the systems of bounded differences.
+  // the bounded difference shapes.
   const dimension_type v = var.id() + 1;
   if (v > space_dim)
     throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
@@ -2288,11 +3466,12 @@ BD_Shape<T>::affine_preimage(const Variable var,
   dimension_type j = 0;
   // Get information about the number of non-zero coefficients in `expr'.
   for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
+    if (expr.coefficient(Variable(i)) != 0) {
       if (t++ == 1)
-	break;
+        break;
       else
         j = i;
+    }
 
   // Now we know the form of `expr':
   // - If t == 0, then expr = b, with `b' a constant;
@@ -2306,7 +3485,7 @@ BD_Shape<T>::affine_preimage(const Variable var,
     forget_all_dbm_constraints(v);
     // Shortest-path closure is preserved, but not reduction.
     if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
+      reset_shortest_path_reduced();
     assert(OK());
     return;
   }
@@ -2317,17 +3496,17 @@ BD_Shape<T>::affine_preimage(const Variable var,
     if (a == denominator || a == -denominator) {
       // Case 2: expr = a*w + b, with a = +/- denominator.
       if (j == var.id())
-	// Apply affine_image() on the inverse of this transformation.
-	affine_image(var, a*var - b, denominator);
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, a);
       else {
-	// `expr == a*w + b', where `w != v'.
-	// Remove all constraints on `var'.
-	forget_all_dbm_constraints(v);
-	// Shortest-path closure is preserved, but not reduction.
-	if (marked_shortest_path_reduced())
-	  status.reset_shortest_path_reduced();
+        // `expr == a*w + b', where `w != v'.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        assert(OK());
       }
-      assert(OK());
       return;
     }
   }
@@ -2343,25 +3522,336 @@ BD_Shape<T>::affine_preimage(const Variable var,
     inverse -= expr;
     affine_image(var, inverse, expr_v);
   }
-  else {
-    // Transformation not invertible: all constraints on `var' are lost.
-    forget_all_dbm_constraints(v);
-    // Shortest-path closure is preserved, but not reduction.
-    if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
+  else {
+    // Transformation not invertible: all constraints on `var' are lost.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > bds_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (bds_space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (bds_space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  // Any image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = ub_expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `ub_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `ub_expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = ub_space_dim; i-- > 0; )
+    if (ub_expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
+
+  // Now we know the form of `ub_expr':
+  // - If t == 0, then ub_expr == b, with `b' a constant;
+  // - If t == 1, then ub_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `ub_expr' is of the general form.
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  if (t == 0) {
+    // Case 1: ub_expr == b.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    // Add the constraint `var <= b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `ub_expr'.
+    const Coefficient& a = ub_expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // Here `var' occurs in `ub_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var = Variable(bds_space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `ub_expr'.
+        affine_image(new_var, ub_expr, denominator);
+        // NOTE: enforce shortest-path closure for precision.
+        shortest_path_closure_assign();
+        assert(!marked_empty());
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        // Now apply the affine upper bound, as recorded in `new_var'.
+        add_constraint(var <= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(bds_space_dim);
+        return;
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+        assert(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // ub_expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, ub_expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `ub_expr' into `pos_sum'
+  // taking into account the sign of `denominator'.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -ub_expr;
+  const Linear_Expression& sc_expr = is_sc ? ub_expr : minus_expr;
+
+  DIRTY_TEMP(N, pos_sum);
+  // Index of the variable that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP(N, coeff_i);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (dimension_type i = w; i > 0; --i) {
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
+      }
+    }
+  }
+  // Apply the affine lower bound.
+  generalized_affine_image(var,
+                           GREATER_OR_EQUAL,
+                           lb_expr,
+                           denominator);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1) {
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
   }
-  assert(OK());
+
+  const Coefficient& lb_expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var = Variable(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (lb_expr_v + denominator)*var;
+  TEMP_INTEGER(lb_inverse_den);
+  neg_assign(lb_inverse_den, lb_expr_v);
+  affine_image(new_var, lb_inverse, lb_inverse_den);
+  shortest_path_closure_assign();
+  assert(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(lb_inverse_den))
+    add_constraint(var >= new_var);
+  else
+    add_constraint(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim);
+  return;
 }
 
 template <typename T>
 void
 BD_Shape<T>::generalized_affine_image(const Variable var,
-				      const Relation_Symbol relsym,
-				      const Linear_Expression& expr,
-				      Coefficient_traits::const_reference
-				      denominator) {
-  using Implementation::BD_Shapes::div_round_up;
-
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& expr,
+                                      Coefficient_traits::const_reference
+                                      denominator) {
   // The denominator cannot be zero.
   if (denominator == 0)
     throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
@@ -2373,25 +3863,29 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
   const dimension_type expr_space_dim = expr.space_dimension();
   if (space_dim < expr_space_dim)
     throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
-				 "e", expr);
+                                 "e", expr);
 
   // `var' should be one of the dimensions of the BDS.
   const dimension_type v = var.id() + 1;
   if (v > space_dim)
     throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
-				 var.id());
+                                 var.id());
 
   // The relation symbol cannot be a strict relation symbol.
   if (relsym == LESS_THAN || relsym == GREATER_THAN)
     throw_generic("generalized_affine_image(v, r, e, d)",
-  		  "r is a strict relation symbol and "
-  		  "*this is a BD_Shape");
+                    "r is a strict relation symbol and "
+                    "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
 
   if (relsym == EQUAL) {
     // The relation symbol is "==":
     // this is just an affine image computation.
     affine_image(var, expr, denominator);
-    assert(OK());
     return;
   }
 
@@ -2408,11 +3902,12 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
   dimension_type w = 0;
   // Get information about the number of non-zero coefficients in `expr'.
   for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
+    if (expr.coefficient(Variable(i)) != 0) {
       if (t++ == 1)
-	break;
+        break;
       else
-	w = i+1;
+        w = i+1;
+    }
 
   // Now we know the form of `expr':
   // - If t == 0, then expr == b, with `b' a constant;
@@ -2431,13 +3926,13 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     // Remove all constraints on `var'.
     forget_all_dbm_constraints(v);
     // Both shortest-path closure and reduction are lost.
-    status.reset_shortest_path_closed();
+    reset_shortest_path_closed();
     switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
+    case LESS_OR_EQUAL:
       // Add the constraint `var <= b/denominator'.
       add_dbm_constraint(0, v, b, denominator);
       break;
-    case GREATER_THAN_OR_EQUAL:
+    case GREATER_OR_EQUAL:
       // Add the constraint `var >= b/denominator',
       // i.e., `-var <= -b/denominator',
       add_dbm_constraint(v, 0, b, minus_den);
@@ -2445,7 +3940,6 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     default:
       // We already dealt with the other cases.
       throw std::runtime_error("PPL internal error");
-      break;
     }
     assert(OK());
     return;
@@ -2456,120 +3950,119 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     const Coefficient& a = expr.coefficient(Variable(w-1));
     if (a == denominator || a == minus_den) {
       // Case 2: expr == a*w + b, with a == +/- denominator.
-      N d;
+      DIRTY_TEMP(N, d);
       switch (relsym) {
-      case LESS_THAN_OR_EQUAL:
-	div_round_up(d, b, denominator);
-	if (w == v) {
-	  // `expr' is of the form: a*v + b.
-	  // Shortest-path closure and reduction are not preserved.
-	  status.reset_shortest_path_closed();
-	  if (a == denominator) {
-	    // Translate each constraint `v - w <= dbm_wv'
-	    // into the constraint `v - w <= dbm_wv + b/denominator';
-	    // forget each constraint `w - v <= dbm_vw'.
-	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
-	      N& dbm_iv = dbm[i][v];
-	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
-	      dbm_v[i] = PLUS_INFINITY;
-	    }
-	  }
-	  else {
-	    // Here `a == -denominator'.
-	    // Translate the constraint `0 - v <= dbm_v0'
-	    // into the constraint `0 - v <= dbm_v0 + b/denominator'.
-	    N& dbm_v0 = dbm_v[0];
-	    add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
-	    // Forget all the other constraints on `v'.
-	    dbm_v0 = PLUS_INFINITY;
-	    forget_binary_dbm_constraints(v);
-	  }
-	}
-	else {
-	  // Here `w != v', so that `expr' is of the form
-	  // +/-denominator * w + b, with `w != v'.
-	  // Remove all constraints on `v'.
-	  forget_all_dbm_constraints(v);
-	  // Shortest-path closure is preserved, but not reduction.
-	  if (marked_shortest_path_reduced())
-	    status.reset_shortest_path_reduced();
-	  if (a == denominator)
-	    // Add the new constraint `v - w <= b/denominator'.
-	    add_dbm_constraint(w, v, d);
-	  else {
-	    // Here a == -denominator, so that we should be adding
-	    // the constraint `v <= b/denominator - w'.
-	    // Approximate it by computing a lower bound for `w'.
-	    const N& dbm_w0 = dbm[w][0];
-	    if (!is_plus_infinity(dbm_w0)) {
-	      // Add the constraint `v <= b/denominator - lb_w'.
-	      add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
-	      // Shortest-path closure is not preserved.
-	      status.reset_shortest_path_closed();
-	    }
-	  }
-	}
-	break;
-
-      case GREATER_THAN_OR_EQUAL:
-	div_round_up(d, b, minus_den);
-	if (w == v) {
-	  // `expr' is of the form: a*w + b.
-	  // Shortest-path closure and reduction are not preserved.
-	  status.reset_shortest_path_closed();
-	  if (a == denominator) {
-	    // Translate each constraint `w - v <= dbm_vw'
-	    // into the constraint `w - v <= dbm_vw - b/denominator';
-	    // forget each constraint `v - w <= dbm_wv'.
-	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
-	      N& dbm_vi = dbm_v[i];
-	      add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
-	      dbm[i][v] = PLUS_INFINITY;
-	    }
-	  }
-	  else {
-	    // Here `a == -denominator'.
-	    // Translate the constraint `0 - v <= dbm_v0'
-	    // into the constraint `0 - v <= dbm_0v - b/denominator'.
-	    N& dbm_0v = dbm_0[v];
-	    add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
-	    // Forget all the other constraints on `v'.
-	    dbm_0v = PLUS_INFINITY;
-	    forget_binary_dbm_constraints(v);
-	  }
-	}
-	else {
-	  // Here `w != v', so that `expr' is of the form
-	  // +/-denominator * w + b, with `w != v'.
-	  // Remove all constraints on `v'.
-	  forget_all_dbm_constraints(v);
-	  // Shortest-path closure is preserved, but not reduction.
-	  if (marked_shortest_path_reduced())
-	    status.reset_shortest_path_reduced();
-	  if (a == denominator)
-	    // Add the new constraint `v - w >= b/denominator',
-	    // i.e., `w - v <= -b/denominator'.
-	    add_dbm_constraint(v, w, d);
-	  else {
-	    // Here a == -denominator, so that we should be adding
-	    // the constraint `v >= -w + b/denominator',
-	    // i.e., `-v <= w - b/denominator'.
-	    // Approximate it by computing an upper bound for `w'.
-	    const N& dbm_0w = dbm_0[w];
-	    if (!is_plus_infinity(dbm_0w)) {
-	      // Add the constraint `-v <= ub_w - b/denominator'.
-	      add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
-	      // Shortest-path closure is not preserved.
-	      status.reset_shortest_path_closed();
-	    }
-	  }
-	}
-	break;
+      case LESS_OR_EQUAL:
+        div_round_up(d, b, denominator);
+        if (w == v) {
+          // `expr' is of the form: a*v + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `v - w <= dbm_wv'
+            // into the constraint `v - w <= dbm_wv + b/denominator';
+            // forget each constraint `w - v <= dbm_vw'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+              assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+            N& dbm_v0 = dbm_v[0];
+            add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_v0, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w <= b/denominator'.
+            add_dbm_constraint(w, v, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v <= b/denominator - w'.
+            // Approximate it by computing a lower bound for `w'.
+            const N& dbm_w0 = dbm[w][0];
+            if (!is_plus_infinity(dbm_w0)) {
+              // Add the constraint `v <= b/denominator - lb_w'.
+              add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
+
+      case GREATER_OR_EQUAL:
+        div_round_up(d, b, minus_den);
+        if (w == v) {
+          // `expr' is of the form: a*w + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `w - v <= dbm_vw'
+            // into the constraint `w - v <= dbm_vw - b/denominator';
+            // forget each constraint `v - w <= dbm_wv'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+              assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_0v - b/denominator'.
+            N& dbm_0v = dbm_0[v];
+            add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_0v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w >= b/denominator',
+            // i.e., `w - v <= -b/denominator'.
+            add_dbm_constraint(v, w, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v >= -w + b/denominator',
+            // i.e., `-v <= w - b/denominator'.
+            // Approximate it by computing an upper bound for `w'.
+            const N& dbm_0w = dbm_0[w];
+            if (!is_plus_infinity(dbm_0w)) {
+              // Add the constraint `-v <= ub_w - b/denominator'.
+              add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
 
       default:
-	// We already dealt with the other cases.
-	throw std::runtime_error("PPL internal error");
-	break;
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
       }
       assert(OK());
       return;
@@ -2598,15 +4091,19 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     minus_expr = -expr;
   const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-  N sum;
+  DIRTY_TEMP(N, sum);
   // Index of variable that is unbounded in `this->dbm'.
   // (The initialization is just to quiet a compiler warning.)
   dimension_type pinf_index = 0;
   // Number of unbounded variables found.
   dimension_type pinf_count = 0;
 
+  // Speculative allocation of temporaries to be used in the following loops.
+  DIRTY_TEMP(N, coeff_i);
+  TEMP_INTEGER(minus_sc_i);
+
   switch (relsym) {
-  case LESS_THAN_OR_EQUAL:
+  case LESS_OR_EQUAL:
     // Compute an upper approximation for `sc_expr' into `sum'.
 
     // Approximate the inhomogeneous term.
@@ -2618,22 +4115,20 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
       const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
       const int sign_i = sgn(sc_i);
       if (sign_i == 0)
-	continue;
+        continue;
       // Choose carefully: we are approximating `sc_expr'.
       const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
       if (is_plus_infinity(approx_i)) {
-	if (++pinf_count > 1)
-	  break;
-	pinf_index = i;
-	continue;
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
       }
-      N coeff_i;
       if (sign_i > 0)
-	assign_r(coeff_i, sc_i, ROUND_UP);
+        assign_r(coeff_i, sc_i, ROUND_UP);
       else {
-	TEMP_INTEGER(minus_sc_i);
-	neg_assign(minus_sc_i, sc_i);
-	assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
       }
       add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
     }
@@ -2642,7 +4137,7 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     forget_all_dbm_constraints(v);
     // Shortest-path closure is preserved, but not reduction.
     if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
+      reset_shortest_path_reduced();
     // Return immediately if no approximation could be computed.
     if (pinf_count > 1) {
       assert(OK());
@@ -2655,7 +4150,7 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
       // towards zero. Since `sc_den' is known to be positive, this amounts to
       // rounding downwards, which is achieved as usual by rounding upwards
       // `minus_sc_den' and negating again the result.
-      N down_sc_den;
+      DIRTY_TEMP(N, down_sc_den);
       assign_r(down_sc_den, minus_sc_den, ROUND_UP);
       neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
       div_assign_r(sum, sum, down_sc_den, ROUND_UP);
@@ -2669,12 +4164,12 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     }
     else if (pinf_count == 1)
       if (pinf_index != v
-	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
-	// Add the constraint `v - pinf_index <= sum'.
-	add_dbm_constraint(pinf_index, v, sum);
+          && expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
     break;
 
-  case GREATER_THAN_OR_EQUAL:
+  case GREATER_OR_EQUAL:
     // Compute an upper approximation for `-sc_expr' into `sum'.
     // Note: approximating `-sc_expr' from above and then negating the
     // result is the same as approximating `sc_expr' from below.
@@ -2686,22 +4181,20 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
       const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
       const int sign_i = sgn(sc_i);
       if (sign_i == 0)
-	continue;
+        continue;
       // Choose carefully: we are approximating `-sc_expr'.
       const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
       if (is_plus_infinity(approx_i)) {
-	if (++pinf_count > 1)
-	  break;
-	pinf_index = i;
-	continue;
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
       }
-      N coeff_i;
       if (sign_i > 0)
-	assign_r(coeff_i, sc_i, ROUND_UP);
+        assign_r(coeff_i, sc_i, ROUND_UP);
       else {
-	TEMP_INTEGER(minus_sc_i);
-	neg_assign(minus_sc_i, sc_i);
-	assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
       }
       add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
     }
@@ -2710,7 +4203,7 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     forget_all_dbm_constraints(v);
     // Shortest-path closure is preserved, but not reduction.
     if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
+      reset_shortest_path_reduced();
     // Return immediately if no approximation could be computed.
     if (pinf_count > 1) {
       assert(OK());
@@ -2723,7 +4216,7 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
       // towards zero. Since `sc_den' is known to be positive, this amounts to
       // rounding downwards, which is achieved as usual by rounding upwards
       // `minus_sc_den' and negating again the result.
-      N down_sc_den;
+      DIRTY_TEMP(N, down_sc_den);
       assign_r(down_sc_den, minus_sc_den, ROUND_UP);
       neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
       div_assign_r(sum, sum, down_sc_den, ROUND_UP);
@@ -2737,16 +4230,15 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
     }
     else if (pinf_count == 1)
       if (pinf_index != v
-	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
-	// Add the constraint `v - pinf_index >= -sum',
-	// i.e., `pinf_index - v <= sum'.
-	add_dbm_constraint(v, pinf_index, sum);
+          && expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
     break;
 
   default:
     // We already dealt with the other cases.
     throw std::runtime_error("PPL internal error");
-    break;
   }
   assert(OK());
 }
@@ -2754,8 +4246,8 @@ BD_Shape<T>::generalized_affine_image(const Variable var,
 template <typename T>
 void
 BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
-				      const Relation_Symbol relsym,
-				      const Linear_Expression& rhs) {
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
   // Dimension-compatibility checks.
   // The dimension of `lhs' should not be greater than the dimension
   // of `*this'.
@@ -2763,20 +4255,25 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
   const dimension_type lhs_space_dim = lhs.space_dimension();
   if (space_dim < lhs_space_dim)
     throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
-				 "e1", lhs);
+                                 "e1", lhs);
 
   // The dimension of `rhs' should not be greater than the dimension
   // of `*this'.
   const dimension_type rhs_space_dim = rhs.space_dimension();
   if (space_dim < rhs_space_dim)
     throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
-				 "e2", rhs);
+                                 "e2", rhs);
 
   // Strict relation symbols are not admitted for BDSs.
   if (relsym == LESS_THAN || relsym == GREATER_THAN)
     throw_generic("generalized_affine_image(e1, r, e2)",
-		  "r is a strict relation symbol and "
-		  "*this is a BD_Shape");
+                  "r is a strict relation symbol and "
+                  "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
 
   // The image of an empty BDS is empty.
   shortest_path_closure_assign();
@@ -2790,11 +4287,12 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
   dimension_type j_lhs = 0;
   // Compute the number of the non-zero components of `lhs'.
   for (dimension_type i = lhs_space_dim; i-- > 0; )
-    if (lhs.coefficient(Variable(i)) != 0)
+    if (lhs.coefficient(Variable(i)) != 0) {
       if (t_lhs++ == 1)
-	break;
+        break;
       else
-	j_lhs = i;
+        j_lhs = i;
+    }
 
   const Coefficient& b_lhs = lhs.inhomogeneous_term();
 
@@ -2807,19 +4305,18 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
     // TODO: if it is not a bounded difference, should we compute
     // approximations for this constraint?
     switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
+    case LESS_OR_EQUAL:
       add_constraint(lhs <= rhs);
       break;
     case EQUAL:
       add_constraint(lhs == rhs);
       break;
-    case GREATER_THAN_OR_EQUAL:
+    case GREATER_OR_EQUAL:
       add_constraint(lhs >= rhs);
       break;
     default:
       // We already dealt with the other cases.
       throw std::runtime_error("PPL internal error");
-      break;
     }
   }
   else if (t_lhs == 1) {
@@ -2830,11 +4327,12 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
     // Compute a sign-corrected relation symbol.
     const Coefficient& den = lhs.coefficient(v);
     Relation_Symbol new_relsym = relsym;
-    if (den < 0)
-      if (relsym == LESS_THAN_OR_EQUAL)
-	new_relsym = GREATER_THAN_OR_EQUAL;
-      else if (relsym == GREATER_THAN_OR_EQUAL)
-	new_relsym = LESS_THAN_OR_EQUAL;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
     Linear_Expression expr = rhs - b_lhs;
     generalized_affine_image(v, new_relsym, expr, den);
   }
@@ -2845,34 +4343,33 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
     std::vector<Variable> lhs_vars;
     for (dimension_type i = lhs_space_dim; i-- > 0; )
       if (lhs.coefficient(Variable(i)) != 0) {
-	lhs_vars.push_back(Variable(i));
-	if (rhs.coefficient(Variable(i)) != 0)
-	  lhs_vars_intersects_rhs_vars = true;
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
       }
 
     if (!lhs_vars_intersects_rhs_vars) {
       // `lhs' and `rhs' variables are disjoint.
-      // Cylindrificate on all variables in the lhs.
+      // Existentially quantify all variables in the lhs.
       for (dimension_type i = lhs_vars.size(); i-- > 0; )
-	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
       // Constrain the left hand side expression so that it is related to
       // the right hand side expression as dictated by `relsym'.
       // TODO: if the following constraint is NOT a bounded difference,
       // it will be simply ignored. Should we compute approximations for it?
       switch (relsym) {
-      case LESS_THAN_OR_EQUAL:
-	add_constraint(lhs <= rhs);
-	break;
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
       case EQUAL:
-	add_constraint(lhs == rhs);
-	break;
-      case GREATER_THAN_OR_EQUAL:
-	add_constraint(lhs >= rhs);
-	break;
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
       default:
-	// We already dealt with the other cases.
-	throw std::runtime_error("PPL internal error");
-	break;
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
       }
     }
     else {
@@ -2881,7 +4378,7 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
 #if 1 // Simplified computation (see the TODO note below).
 
       for (dimension_type i = lhs_vars.size(); i-- > 0; )
-	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
 
 #else // Currently unnecessarily complex computation.
 
@@ -2896,12 +4393,12 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
       // ensures some approximation is tried even when the constraint
       // is not a bounded difference.
       affine_image(new_var, rhs);
-      // Cylindrificate on all variables in the lhs.
+      // Existentially quantify all variables in the lhs.
       // NOTE: enforce shortest-path closure for precision.
       shortest_path_closure_assign();
       assert(!marked_empty());
       for (dimension_type i = lhs_vars.size(); i-- > 0; )
-	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
       // Constrain the new dimension so that it is related to
       // the left hand side as dictated by `relsym'.
       // TODO: each one of the following constraints is definitely NOT
@@ -2909,19 +4406,18 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
       // Thus, the method add_constraint() will simply ignore it.
       // Should we compute approximations for this constraint?
       switch (relsym) {
-      case LESS_THAN_OR_EQUAL:
-	add_constraint(lhs <= new_var);
-	break;
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= new_var);
+        break;
       case EQUAL:
-	add_constraint(lhs == new_var);
-	break;
-      case GREATER_THAN_OR_EQUAL:
-	add_constraint(lhs >= new_var);
-	break;
+        add_constraint(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= new_var);
+        break;
       default:
-	// We already dealt with the other cases.
-	throw std::runtime_error("PPL internal error");
-	break;
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
       }
       // Remove the temporarily added dimension.
       remove_higher_space_dimensions(space_dim-1);
@@ -2935,12 +4431,10 @@ BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
 template <typename T>
 void
 BD_Shape<T>::generalized_affine_preimage(const Variable var,
-					 const Relation_Symbol relsym,
-					 const Linear_Expression& expr,
-					 Coefficient_traits::const_reference
-					 denominator) {
-  using Implementation::BD_Shapes::div_round_up;
-
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
   // The denominator cannot be zero.
   if (denominator == 0)
     throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
@@ -2952,29 +4446,33 @@ BD_Shape<T>::generalized_affine_preimage(const Variable var,
   const dimension_type expr_space_dim = expr.space_dimension();
   if (space_dim < expr_space_dim)
     throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
-				 "e", expr);
+                                 "e", expr);
 
   // `var' should be one of the dimensions of the BDS.
   const dimension_type v = var.id() + 1;
   if (v > space_dim)
     throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
-				 var.id());
+                                 var.id());
 
   // The relation symbol cannot be a strict relation symbol.
   if (relsym == LESS_THAN || relsym == GREATER_THAN)
     throw_generic("generalized_affine_preimage(v, r, e, d)",
-  		  "r is a strict relation symbol and "
-  		  "*this is a BD_Shape");
+                    "r is a strict relation symbol and "
+                    "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
 
   if (relsym == EQUAL) {
     // The relation symbol is "==":
     // this is just an affine preimage computation.
     affine_preimage(var, expr, denominator);
-    assert(OK());
     return;
   }
 
-  // The image of an empty BDS is empty too.
+  // The preimage of an empty BDS is empty too.
   shortest_path_closure_assign();
   if (marked_empty())
     return;
@@ -2983,8 +4481,8 @@ BD_Shape<T>::generalized_affine_preimage(const Variable var,
   // computed as the image of its inverse relation.
   const Coefficient& expr_v = expr.coefficient(var);
   if (expr_v != 0) {
-    const Relation_Symbol reversed_relsym = (relsym == LESS_THAN_OR_EQUAL)
-      ? GREATER_THAN_OR_EQUAL : LESS_THAN_OR_EQUAL;
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
     const Linear_Expression inverse
       = expr - (expr_v + denominator)*var;
     TEMP_INTEGER(inverse_den);
@@ -2995,284 +4493,185 @@ BD_Shape<T>::generalized_affine_preimage(const Variable var,
     return;
   }
 
-  // Here `var_coefficient == 0', so that the preimage cannot
-  // be easily computed by inverting the affine relation.
-  // Shrink the BD shape by adding the constraint induced
-  // by the affine relation.
-  const Coefficient& b = expr.inhomogeneous_term();
-  // Number of non-zero coefficients in `expr': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t = 0;
-  // Index of the last non-zero coefficient in `expr', if any.
-  dimension_type j = 0;
-  // Get information about the number of non-zero coefficients in `expr'.
-  for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
-      if (t++ == 1)
-	break;
-      else
-	j = i+1;
+  refine(var, relsym, expr, denominator);
+  // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  assert(OK());
+}
 
-  // Now we know the form of `expr':
-  // - If t == 0, then expr == b, with `b' a constant;
-  // - If t == 1, then expr == a*j + b, where `j != v';
-  // - If t == 2, the `expr' is of the general form.
-  DB_Row<N>& dbm_0 = dbm[0];
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (bds_space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
 
-  if (t == 0) {
-    // Case 1: expr == b.
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      // Add the constraint `var <= b/denominator'.
-      add_dbm_constraint(0, v, b, denominator);
-      break;
-    case GREATER_THAN_OR_EQUAL:
-      // Add the constraint `var >= b/denominator',
-      // i.e., `-var <= -b/denominator',
-      add_dbm_constraint(v, 0, -b, denominator);
-      break;
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (bds_space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_preimage(e1, r, e2)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
+
+  // The preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
     }
-  }
-  else if (t == 1) {
-    // Value of the one and only non-zero coefficient in `expr'.
-    const Coefficient& expr_j = expr.coefficient(Variable(j-1));
-    N d;
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      div_round_up(d, b, denominator);
-      // Note that: `j != v', so that `expr' is of the form
-      // expr_j * j + b, with `j != v'.
-      if (expr_j == denominator)
-	// Add the new constraint `v - j <= b/denominator'.
-	add_dbm_constraint(j, v, d);
-      else {
-	// Here expr_j != denominator, so that we should be adding
-	// the constraint `v <= b/denominator - j'.
-	N sum;
-	// Approximate the homogeneous part of `expr'.
-	const int sign_j = sgn(expr_j);
-	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
-	if (!is_plus_infinity(approx_j)) {
-	  N coeff_j;
-	  if (sign_j > 0)
-	    assign_r(coeff_j, expr_j, ROUND_UP);
-	  else {
-	    TEMP_INTEGER(minus_expr_j);
-	    neg_assign(minus_expr_j, expr_j);
-	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
-	  }
-	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
-	  add_dbm_constraint(0, v, sum);
-	}
-      }
-      break;
 
-    case GREATER_THAN_OR_EQUAL:
-      div_round_up(d, -b, denominator);
-      // Note that: `j != v', so that `expr' is of the form
-      // expr_j * j + b, with `j != v'.
-      if (expr_j == denominator)
-	// Add the new constraint `v - j >= b/denominator'.
-	add_dbm_constraint(j, v, d);
-      else {
-	// Here expr_j != denominator, so that we should be adding
-	// the constraint `v <= b/denominator - j'.
-	N sum;
-	// Approximate the homogeneous part of `expr_j'.
-	const int sign_j = sgn(expr_j);
-	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
-	if (!is_plus_infinity(approx_j)) {
-	  N coeff_j;
-	  if (sign_j > 0)
-	    assign_r(coeff_j, expr_j, ROUND_UP);
-	  else {
-	    TEMP_INTEGER(minus_expr_j);
-	    neg_assign(minus_expr_j, expr_j);
-	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
-	  }
-	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
-	  add_dbm_constraint(0, v, sum);
-	}
-      }
-      break;
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
 
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In this case, preimage and image happen to be the same.
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
     }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, den);
   }
   else {
-    // Here t == 2, so that
-    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
-    const bool is_sc = (denominator > 0);
-    TEMP_INTEGER(minus_b);
-    neg_assign(minus_b, b);
-    const Coefficient& sc_b = is_sc ? b : minus_b;
-    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
-    TEMP_INTEGER(minus_den);
-    neg_assign(minus_den, denominator);
-    const Coefficient& sc_den = is_sc ? denominator : minus_den;
-    const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
-    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
-    // when `denominator' is negative. Do not use it unless you are sure
-    // it has been correctly assigned.
-    Linear_Expression minus_expr;
-    if (!is_sc)
-      minus_expr = -expr;
-    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
-
-    N sum;
-    // Index of variable that is unbounded in `this->dbm'.
-    // (The initialization is just to quiet a compiler warning.)
-    dimension_type pinf_index = 0;
-    // Number of unbounded variables found.
-    dimension_type pinf_count = 0;
-
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      // Compute an upper approximation for `expr' into `sum',
-      // taking into account the sign of `denominator'.
-
-      // Approximate the inhomogeneous term.
-      assign_r(sum, sc_b, ROUND_UP);
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
 
-      // Approximate the homogeneous part of `sc_expr'.
-      // Note: indices above `w' can be disregarded, as they all have
-      // a zero coefficient in `expr'.
-      for (dimension_type i = j; i > 0; --i) {
-	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-	const int sign_i = sgn(sc_i);
-	if (sign_i == 0)
-	  continue;
-	// Choose carefully: we are approximating `sc_expr'.
-	const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
-	if (is_plus_infinity(approx_i)) {
-	  if (++pinf_count > 1)
-	    break;
-	  pinf_index = i;
-	  continue;
-	}
-	N coeff_i;
-	if (sign_i > 0)
-	  assign_r(coeff_i, sc_i, ROUND_UP);
-	else {
-	  TEMP_INTEGER(minus_sc_i);
-	  neg_assign(minus_sc_i, sc_i);
-	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
-	}
-	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
-      }
-
-      // Divide by the (sign corrected) denominator (if needed).
-      if (sc_den != 1) {
-	// Before computing the quotient, the denominator should be
-	// approximated towards zero. Since `sc_den' is known to be
-	// positive, this amounts to rounding downwards, which is achieved
-	// by rounding upwards `minus_sc-den' and negating again the result.
-	N down_sc_den;
-	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
-	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
-      }
-
-      if (pinf_count == 0) {
-	// Add the constraint `v <= sum'.
-	add_dbm_constraint(0, v, sum);
-	// Deduce constraints of the form `v - u', where `u != v'.
-	deduce_v_minus_u_bounds(v, j, sc_expr, sc_den, sum);
-      }
-      else if (pinf_count == 1)
-	if (expr.coefficient(Variable(pinf_index-1)) == denominator)
-	  // Add the constraint `v - pinf_index <= sum'.
-	  add_dbm_constraint(pinf_index, v, sum);
-      break;
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
 
-    case GREATER_THAN_OR_EQUAL:
-      // Compute an upper approximation for `-sc_expr' into `sum'.
-      // Note: approximating `-sc_expr' from above and then negating the
-      // result is the same as approximating `sc_expr' from below.
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
 
-      // Approximate the inhomogeneous term.
-      assign_r(sum, minus_sc_b, ROUND_UP);
-
-      // Approximate the homogeneous part of `-sc_expr'.
-      for (dimension_type i = j; i > 0; --i) {
-	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-	const int sign_i = sgn(sc_i);
-	if (sign_i == 0)
-	  continue;
-	// Choose carefully: we are approximating `-sc_expr'.
-	const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
-	if (is_plus_infinity(approx_i)) {
-	  if (++pinf_count > 1)
-	    break;
-	  pinf_index = i;
-	  continue;
-	}
-	N coeff_i;
-	if (sign_i > 0)
-	  assign_r(coeff_i, sc_i, ROUND_UP);
-	else {
-	  TEMP_INTEGER(minus_sc_i);
-	  neg_assign(minus_sc_i, sc_i);
-	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
-	}
-	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
-      }
-
-      // Divide by the (sign corrected) denominator (if needed).
-      if (sc_den != 1) {
-	// Before computing the quotient, the denominator should be
-	// approximated towards zero. Since `sc_den' is known to be positive,
-	// this amounts to rounding downwards, which is achieved by rounding
-	// upwards `minus_sc_den' and negating again the result.
-	N down_sc_den;
-	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
-	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
-      }
-
-      if (pinf_count == 0) {
-	// Add the constraint `v >= -sum', i.e., `-v <= sum'.
-	add_dbm_constraint(v, 0, sum);
-	// Deduce constraints of the form `u - v', where `u != v'.
-	deduce_u_minus_v_bounds(v, j, sc_expr, sc_den, sum);
-      }
-      else if (pinf_count == 1)
-	if (pinf_index != v
-	    && expr.coefficient(Variable(pinf_index-1)) == denominator)
-	  // Add the constraint `v - pinf_index >= -sum',
-	  // i.e., `pinf_index - v <= sum'.
-	  add_dbm_constraint(v, pinf_index, sum);
-      break;
+      // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+    }
+    else {
 
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
+      // Some variables in `lhs' also occur in `rhs'.
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(bds_space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `lhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, lhs);
+      // Existentiallly quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == a_rhs*v + b_rhs' where `a_rhs' is in {0, 1},
+      // then one of the following constraints will be added,
+      // since it is a bounded difference. Else the method add_constraint()
+      // will ignore it, 'cause the constraint is NOT a bounded
+      // difference.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(new_var <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(bds_space_dim);
     }
   }
 
-  // If the shrunk BD_Shape is empty, its preimage is empty too.
-  if (is_empty())
-    return;
-  forget_all_dbm_constraints(v);
-  // Shortest-path closure is preserved, but not reduction.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
   assert(OK());
 }
 
 template <typename T>
 Constraint_System
 BD_Shape<T>::constraints() const {
-  using Implementation::BD_Shapes::numer_denom;
-
   Constraint_System cs;
   const dimension_type space_dim = space_dimension();
   if (space_dim == 0) {
@@ -3297,23 +4696,21 @@ BD_Shape<T>::constraints() const {
       const Variable x(j-1);
       const N& dbm_0j = dbm_0[j];
       const N& dbm_j0 = dbm[j][0];
-      N negated_dbm_j0;
-      if (neg_assign_r(negated_dbm_j0, dbm_j0, ROUND_NOT_NEEDED) == V_EQ
-	  && negated_dbm_j0 == dbm_0j) {
-	// We have a unary equality constraint.
-	numer_denom(dbm_0j, b, a);
-	cs.insert(a*x == b);
+      if (is_additive_inverse(dbm_j0, dbm_0j)) {
+        // We have a unary equality constraint.
+        numer_denom(dbm_0j, b, a);
+        cs.insert(a*x == b);
       }
       else {
-	// We have 0, 1 or 2 unary inequality constraints.
-	if (!is_plus_infinity(dbm_0j)) {
-	  numer_denom(dbm_0j, b, a);
-	  cs.insert(a*x <= b);
-	}
-	if (!is_plus_infinity(dbm_j0)) {
-	  numer_denom(dbm_j0, b, a);
-	  cs.insert(-a*x <= b);
-	}
+        // We have 0, 1 or 2 unary inequality constraints.
+        if (!is_plus_infinity(dbm_0j)) {
+          numer_denom(dbm_0j, b, a);
+          cs.insert(a*x <= b);
+        }
+        if (!is_plus_infinity(dbm_j0)) {
+          numer_denom(dbm_j0, b, a);
+          cs.insert(-a*x <= b);
+        }
       }
     }
 
@@ -3322,27 +4719,25 @@ BD_Shape<T>::constraints() const {
       const Variable y(i-1);
       const DB_Row<N>& dbm_i = dbm[i];
       for (dimension_type j = i + 1; j <= space_dim; ++j) {
-	const Variable x(j-1);
-	const N& dbm_ij = dbm_i[j];
-	const N& dbm_ji = dbm[j][i];
-	N negated_dbm_ji;
-	if (neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
-	    && negated_dbm_ji == dbm_ij) {
-	  // We have a binary equality constraint.
-	  numer_denom(dbm_ij, b, a);
-	  cs.insert(a*x - a*y == b);
-	}
-	else {
-	  // We have 0, 1 or 2 binary inequality constraints.
-	  if (!is_plus_infinity(dbm_ij)) {
-	    numer_denom(dbm_ij, b, a);
-	    cs.insert(a*x - a*y <= b);
-	  }
-	  if (!is_plus_infinity(dbm_ji)) {
-	    numer_denom(dbm_ji, b, a);
-	    cs.insert(a*y - a*x <= b);
-	  }
-	}
+        const Variable x(j-1);
+        const N& dbm_ij = dbm_i[j];
+        const N& dbm_ji = dbm[j][i];
+        if (is_additive_inverse(dbm_ji, dbm_ij)) {
+          // We have a binary equality constraint.
+          numer_denom(dbm_ij, b, a);
+          cs.insert(a*x - a*y == b);
+        }
+        else {
+          // We have 0, 1 or 2 binary inequality constraints.
+          if (!is_plus_infinity(dbm_ij)) {
+            numer_denom(dbm_ij, b, a);
+            cs.insert(a*x - a*y <= b);
+          }
+          if (!is_plus_infinity(dbm_ji)) {
+            numer_denom(dbm_ji, b, a);
+            cs.insert(a*y - a*x <= b);
+          }
+        }
       }
     }
   }
@@ -3352,8 +4747,6 @@ BD_Shape<T>::constraints() const {
 template <typename T>
 Constraint_System
 BD_Shape<T>::minimized_constraints() const {
-  using Implementation::BD_Shapes::numer_denom;
-
   shortest_path_reduction_assign();
   Constraint_System cs;
   const dimension_type space_dim = space_dimension();
@@ -3382,57 +4775,146 @@ BD_Shape<T>::minimized_constraints() const {
     const DB_Row<N>& dbm_0 = dbm[0];
     for (dimension_type i = 1; i <= space_dim; ++i) {
       const dimension_type leader = leaders[i];
-      if (i != leader)
-	// Generate the constraint relating `i' and its leader.
-	if (leader == 0) {
-	  // A unary equality has to be generated.
-	  assert(!is_plus_infinity(dbm_0[i]));
-	  numer_denom(dbm_0[i], num, den);
-	  cs.insert(den*Variable(i-1) == num);
-	}
-	else {
-	  // A binary equality has to be generated.
-	  assert(!is_plus_infinity(dbm[i][leader]));
-	  numer_denom(dbm[i][leader], num, den);
-	  cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
-	}
+      if (i != leader) {
+        // Generate the constraint relating `i' and its leader.
+        if (leader == 0) {
+          // A unary equality has to be generated.
+          assert(!is_plus_infinity(dbm_0[i]));
+          numer_denom(dbm_0[i], num, den);
+          cs.insert(den*Variable(i-1) == num);
+        }
+        else {
+          // A binary equality has to be generated.
+          assert(!is_plus_infinity(dbm[i][leader]));
+          numer_denom(dbm[i][leader], num, den);
+          cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+        }
+      }
     }
 
     // Go through the leaders to generate inequality constraints.
     // First generate all the unary inequalities.
-    const std::deque<bool>& red_0 = redundancy_dbm[0];
+    const Bit_Row& red_0 = redundancy_dbm[0];
     for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
       const dimension_type i = leader_indices[l_i];
       if (!red_0[i]) {
-	numer_denom(dbm_0[i], num, den);
-	cs.insert(den*Variable(i-1) <= num);
+        numer_denom(dbm_0[i], num, den);
+        cs.insert(den*Variable(i-1) <= num);
       }
       if (!redundancy_dbm[i][0]) {
-	numer_denom(dbm[i][0], num, den);
-	cs.insert(-den*Variable(i-1) <= num);
+        numer_denom(dbm[i][0], num, den);
+        cs.insert(-den*Variable(i-1) <= num);
       }
     }
     // Then generate all the binary inequalities.
     for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
       const dimension_type i = leader_indices[l_i];
       const DB_Row<N>& dbm_i = dbm[i];
-      const std::deque<bool>& red_i = redundancy_dbm[i];
+      const Bit_Row& red_i = redundancy_dbm[i];
       for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
-	const dimension_type j = leader_indices[l_j];
-	if (!red_i[j]) {
-	  numer_denom(dbm_i[j], num, den);
-	  cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
-	}
-	if (!redundancy_dbm[j][i]) {
-	  numer_denom(dbm[j][i], num, den);
-	  cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
-	}
+        const dimension_type j = leader_indices[l_j];
+        if (!red_i[j]) {
+          numer_denom(dbm_i[j], num, den);
+          cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
+        }
+        if (!redundancy_dbm[j][i]) {
+          numer_denom(dbm[j][i], num, den);
+          cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
+        }
       }
     }
   }
   return cs;
 }
 
+template <typename T>
+void
+BD_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  dimension_type old_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > old_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting BDS should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_generic("expand_dimension(v, m)",
+                  "adding m new space dimensions exceeds "
+                  "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  const dimension_type v_id = var.id() + 1;
+  const DB_Row<N>& dbm_v = dbm[v_id];
+  for (dimension_type i = old_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const N& dbm_i_v = dbm[i][v_id];
+    const N& dbm_v_i = dbm_v[i];
+    for (dimension_type j = old_dim+1; j < old_dim+m+1; ++j) {
+      dbm_i[j] = dbm_i_v;
+      dbm[j][i] = dbm_v_i;
+    }
+  }
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                   Variable var) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the BDS.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
+                                 "v", var);
+
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
+    return;
+
+  // All variables in `to_be_folded' should be dimensions of the BDS.
+  if (to_be_folded.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, ...)",
+                                 to_be_folded.space_dimension());
+
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
+    throw_generic("fold_space_dimensions(tbf, v)",
+                  "v should not occur in tbf");
+
+  shortest_path_closure_assign();
+  if (!marked_empty()) {
+    // Recompute the elements of the row and the column corresponding
+    // to variable `var' by taking the join of their value with the
+    // value of the corresponding elements in the row and column of the
+    // variable `to_be_folded'.
+    const dimension_type v_id = var.id() + 1;
+    DB_Row<N>& dbm_v = dbm[v_id];
+    for (Variables_Set::const_iterator i = to_be_folded.begin(),
+           tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+      const dimension_type tbf_id = *i + 1;
+      const DB_Row<N>& dbm_tbf = dbm[tbf_id];
+      for (dimension_type j = space_dim + 1; j-- > 0; ) {
+        max_assign(dbm[j][v_id], dbm[j][tbf_id]);
+        max_assign(dbm_v[j], dbm_tbf[j]);
+      }
+    }
+  }
+  remove_space_dimensions(to_be_folded);
+}
+
 /*! \relates Parma_Polyhedra_Library::BD_Shape */
 template <typename T>
 std::ostream&
@@ -3441,107 +4923,103 @@ IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
   if (c.is_universe())
     s << "true";
   else {
-    // We control empty system of bounded differences.
+    // We control empty bounded difference shape.
     dimension_type n = c.space_dimension();
     if (c.marked_empty())
       s << "false";
     else {
+      DIRTY_TEMP(N, v);
       bool first = true;
       for (dimension_type i = 0; i <= n; ++i)
-	for (dimension_type j = i + 1; j <= n; ++j) {
-	  const N& c_i_j = c.dbm[i][j];
-	  const N& c_j_i = c.dbm[j][i];
-	  N negated_c_ji;
-	  if (neg_assign_r(negated_c_ji, c_j_i, ROUND_NOT_NEEDED) == V_EQ
-	      && negated_c_ji == c_i_j) {
-	    // We will print an equality.
-	    if (first)
-	      first = false;
-	    else
-	      s << ", ";
-	    if (i == 0) {
-	      // We have got a equality constraint with one Variable.
-	      s << Variable(j - 1);
-	      s << " == " << c_i_j;
-	    }
-	    else {
-	      // We have got a equality constraint with two Variables.
-	      if (c_i_j >= 0) {
-		s << Variable(j - 1);
-		s << " - ";
-		s << Variable(i - 1);
-		s << " == " << c_i_j;
-	      }
-	      else {
-		s << Variable(i - 1);
-		s << " - ";
-		s << Variable(j - 1);
-		s << " == " << c_j_i;
-	      }
-	    }
-	  }
-	  else {
-	    // We will print a non-strict inequality.
-	    if (!is_plus_infinity(c_j_i)) {
-	      if (first)
-		first = false;
-	      else
-		s << ", ";
-	      if (i == 0) {
-		// We have got a constraint with an only Variable.
-		s << Variable(j - 1);
-		N v;
-		neg_assign_r(v, c_j_i, ROUND_DOWN);
-		s << " >= " << v;
-	      }
-	      else {
-		// We have got a constraint with two Variables.
-		if (c_j_i >= 0) {
-		  s << Variable(i - 1);
-		  s << " - ";
-		  s << Variable(j - 1);
-		  s << " <= " << c_j_i;
-		}
-		else {
-		  s << Variable(j - 1);
-		  s << " - ";
-		  s << Variable(i - 1);
-		  N v;
-		  neg_assign_r(v, c_j_i, ROUND_DOWN);
-		  s << " >= " << v;
-		}
-	      }
-	    }
-	    if (!is_plus_infinity(c_i_j)) {
-	      if (first)
-		first = false;
-	      else
-		s << ", ";
-	      if (i == 0) {
-		// We have got a constraint with an only Variable.
-		s << Variable(j - 1);
-		s << " <= " << c_i_j;
-	      }
-	      else {
-		// We have got a constraint with two Variables.
-		if (c_i_j >= 0) {
-		  s << Variable(j - 1);
-		  s << " - ";
-		  s << Variable(i - 1);
-		  s << " <= " << c_i_j;
-		}
-		else {
-		  s << Variable(i - 1);
-		  s << " - ";
-		  s << Variable(j - 1);
-		  N v;
-		  neg_assign_r(v, c_i_j, ROUND_DOWN);
-		  s << " >= " << v;
-		}
-	      }
-	    }
-	  }
-	}
+        for (dimension_type j = i + 1; j <= n; ++j) {
+          const N& c_i_j = c.dbm[i][j];
+          const N& c_j_i = c.dbm[j][i];
+          if (is_additive_inverse(c_j_i, c_i_j)) {
+            // We will print an equality.
+            if (first)
+              first = false;
+            else
+              s << ", ";
+            if (i == 0) {
+              // We have got a equality constraint with one Variable.
+              s << Variable(j - 1);
+              s << " == " << c_i_j;
+            }
+            else {
+              // We have got a equality constraint with two Variables.
+              if (sgn(c_i_j) >= 0) {
+                s << Variable(j - 1);
+                s << " - ";
+                s << Variable(i - 1);
+                s << " == " << c_i_j;
+              }
+              else {
+                s << Variable(i - 1);
+                s << " - ";
+                s << Variable(j - 1);
+                s << " == " << c_j_i;
+              }
+            }
+          }
+          else {
+            // We will print a non-strict inequality.
+            if (!is_plus_infinity(c_j_i)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with an only Variable.
+                s << Variable(j - 1);
+                neg_assign_r(v, c_j_i, ROUND_DOWN);
+                s << " >= " << v;
+              }
+              else {
+                // We have got a constraint with two Variables.
+                if (sgn(c_j_i) >= 0) {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  s << " <= " << c_j_i;
+                }
+                else {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  neg_assign_r(v, c_j_i, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+            if (!is_plus_infinity(c_i_j)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with an only Variable.
+                s << Variable(j - 1);
+                s << " <= " << c_i_j;
+              }
+              else {
+                // We have got a constraint with two Variables.
+                if (sgn(c_i_j) >= 0) {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  s << " <= " << c_i_j;
+                }
+                else {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  neg_assign_r(v, c_i_j, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+          }
+        }
     }
   }
   return s;
@@ -3553,19 +5031,11 @@ BD_Shape<T>::ascii_dump(std::ostream& s) const {
   status.ascii_dump(s);
   s << "\n";
   dbm.ascii_dump(s);
-  // Redundancy info.
   s << "\n";
-  const char separator = ' ';
-  const dimension_type nrows = redundancy_dbm.size();
-  s << nrows << separator << "\n";
-  for (dimension_type i = 0; i < nrows;  ++i) {
-    for (dimension_type j = 0; j < nrows; ++j)
-      s << redundancy_dbm[i][j] << separator;
-    s << "\n";
-  }
+  redundancy_dbm.ascii_dump(s);
 }
 
-PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>);
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>)
 
 template <typename T>
 bool
@@ -3574,23 +5044,19 @@ BD_Shape<T>::ascii_load(std::istream& s) {
     return false;
   if (!dbm.ascii_load(s))
     return false;
-  // Load redundancy info.
-  dimension_type nrows;
-   if (!(s >> nrows))
+  if (!redundancy_dbm.ascii_load(s))
     return false;
-  redundancy_dbm.clear();
-  redundancy_dbm.reserve(nrows);
-  std::deque<bool> redundancy_row(nrows, false);
-  for (dimension_type i = 0; i < nrows;  ++i) {
-    for (dimension_type j = 0; j < nrows; ++j)
-      if (!(s >> redundancy_row[j]))
-	return false;
-    redundancy_dbm.push_back(redundancy_row);
-  }
   return true;
 }
 
 template <typename T>
+memory_size_type
+BD_Shape<T>::external_memory_in_bytes() const {
+  return dbm.external_memory_in_bytes()
+    + redundancy_dbm.external_memory_in_bytes();
+}
+
+template <typename T>
 bool
 BD_Shape<T>::OK() const {
   // Check whether the difference-bound matrix is well-formed.
@@ -3611,9 +5077,9 @@ BD_Shape<T>::OK() const {
     if (is_minus_infinity(dbm[i][j])) {
 #ifndef NDEBUG
       using namespace Parma_Polyhedra_Library::IO_Operators;
-      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
-		<< dbm[i][i] << "!"
-		<< std::endl;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                << dbm[i][j] << "!"
+                << std::endl;
 #endif
       return false;
     }
@@ -3624,8 +5090,8 @@ BD_Shape<T>::OK() const {
 #ifndef NDEBUG
       using namespace Parma_Polyhedra_Library::IO_Operators;
       std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
-		<< dbm[i][i] << "!  (+inf was expected.)"
-		<< std::endl;
+                << dbm[i][i] << "!  (+inf was expected.)"
+                << std::endl;
 #endif
       return false;
     }
@@ -3633,41 +5099,47 @@ BD_Shape<T>::OK() const {
   // Check whether the shortest-path closure information is legal.
   if (marked_shortest_path_closed()) {
     BD_Shape x = *this;
-    x.status.reset_shortest_path_closed();
+    x.reset_shortest_path_closed();
     x.shortest_path_closure_assign();
     if (x.dbm != dbm) {
 #ifndef NDEBUG
       std::cerr << "BD_Shape is marked as closed but it is not!"
-		<< std::endl;
+                << std::endl;
 #endif
       return false;
     }
   }
 
-  // Check whether the shortest-path reduction information is legal.
-  if (marked_shortest_path_reduced()) {
-    // A non-redundant constraint cannot be equal to PLUS_INFINITY.
-    for (dimension_type i = dbm.num_rows(); i-- > 0; )
-      for (dimension_type j = dbm.num_rows(); j-- > 0; )
-	if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise shortest-path closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the shortest-path reduction information is legal.
+    if (marked_shortest_path_reduced()) {
+      // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+      for (dimension_type i = dbm.num_rows(); i-- > 0; )
+        for (dimension_type j = dbm.num_rows(); j-- > 0; )
+          if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
 #ifndef NDEBUG
-	  using namespace Parma_Polyhedra_Library::IO_Operators;
-	  std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
-		    << dbm[i][i] << " is marked as non-redundant!"
-		    << std::endl;
+            using namespace Parma_Polyhedra_Library::IO_Operators;
+            std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                      << dbm[i][j] << " is marked as non-redundant!"
+                      << std::endl;
 #endif
-	  return false;
-	}
+            return false;
+          }
 
-    BD_Shape x = *this;
-    x.status.reset_shortest_path_reduced();
-    x.shortest_path_reduction_assign();
-    if (x.redundancy_dbm != redundancy_dbm) {
+      BD_Shape x = *this;
+      x.reset_shortest_path_reduced();
+      x.shortest_path_reduction_assign();
+      if (x.redundancy_dbm != redundancy_dbm) {
 #ifndef NDEBUG
-      std::cerr << "BD_Shape is marked as reduced but it is not!"
-		<< std::endl;
+        std::cerr << "BD_Shape is marked as reduced but it is not!"
+                  << std::endl;
 #endif
-      return false;
+        return false;
+      }
     }
   }
 
@@ -3678,10 +5150,9 @@ BD_Shape<T>::OK() const {
 template <typename T>
 void
 BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const BD_Shape& y) const {
+                                          const BD_Shape& y) const {
   std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
     << "this->space_dimension() == " << space_dimension()
     << ", y->space_dimension() == " << y.space_dimension() << ".";
   throw std::invalid_argument(s.str());
@@ -3690,10 +5161,9 @@ BD_Shape<T>::throw_dimension_incompatible(const char* method,
 template <typename T>
 void
 BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  dimension_type required_dim) const {
+                                          dimension_type required_dim) const {
   std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
     << "this->space_dimension() == " << space_dimension()
     << ", required dimension == " << required_dim << ".";
   throw std::invalid_argument(s.str());
@@ -3702,10 +5172,9 @@ BD_Shape<T>::throw_dimension_incompatible(const char* method,
 template <typename T>
 void
 BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const Constraint& c) const {
+                                          const Constraint& c) const {
   std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
     << "this->space_dimension() == " << space_dimension()
     << ", c->space_dimension == " << c.space_dimension() << ".";
   throw std::invalid_argument(s.str());
@@ -3714,10 +5183,20 @@ BD_Shape<T>::throw_dimension_incompatible(const char* method,
 template <typename T>
 void
 BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const Generator& g) const {
+                                          const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Generator& g) const {
   std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
     << "this->space_dimension() == " << space_dimension()
     << ", g->space_dimension == " << g.space_dimension() << ".";
   throw std::invalid_argument(s.str());
@@ -3735,7 +5214,7 @@ BD_Shape<T>::throw_constraint_incompatible(const char* method) {
 template <typename T>
 void
 BD_Shape<T>::throw_expression_too_complex(const char* method,
-					  const Linear_Expression& e) {
+                                          const Linear_Expression& e) {
   using namespace IO_Operators;
   std::ostringstream s;
   s << "PPL::BD_Shape::" << method << ":" << std::endl
@@ -3747,24 +5226,21 @@ BD_Shape<T>::throw_expression_too_complex(const char* method,
 template <typename T>
 void
 BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const char* name_row,
-					  const Linear_Expression& y) const {
+                                          const char* name_row,
+                                          const Linear_Expression& y) const {
   std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
     << "this->space_dimension() == " << space_dimension()
     << ", " << name_row << "->space_dimension() == "
     << y.space_dimension() << ".";
   throw std::invalid_argument(s.str());
 }
 
-
 template <typename T>
 void
 BD_Shape<T>::throw_generic(const char* method, const char* reason) {
   std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
     << reason;
   throw std::invalid_argument(s.str());
 }
diff --git a/src/BD_Shape.types.hh b/src/BD_Shape.types.hh
index 60aec43..df6a1cc 100644
--- a/src/BD_Shape.types.hh
+++ b/src/BD_Shape.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/BHRZ03_Certificate.cc b/src/BHRZ03_Certificate.cc
index 654bea9..e00b47f 100644
--- a/src/BHRZ03_Certificate.cc
+++ b/src/BHRZ03_Certificate.cc
@@ -1,12 +1,12 @@
 /* BHRZ03_Certificate class implementation
    (non-inline member functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "BHRZ03_Certificate.defs.hh"
 
diff --git a/src/BHRZ03_Certificate.defs.hh b/src/BHRZ03_Certificate.defs.hh
index fc02296..27ad2ed 100644
--- a/src/BHRZ03_Certificate.defs.hh
+++ b/src/BHRZ03_Certificate.defs.hh
@@ -1,11 +1,11 @@
 /* BHRZ03_Certificate class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -73,7 +73,7 @@ public:
     Returns <CODE>true</CODE> if and only if the certificate for
     polyhedron \p ph is strictly smaller than \p *this.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool is_stabilizing(const Polyhedron& ph) const;
 
   //! A total ordering on BHRZ03 certificates.
@@ -89,7 +89,7 @@ public:
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   //! Check if gathered information is meaningful.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool OK() const;
 
 private:
diff --git a/src/BHRZ03_Certificate.inlines.hh b/src/BHRZ03_Certificate.inlines.hh
index 3e4277f..ca8db16 100644
--- a/src/BHRZ03_Certificate.inlines.hh
+++ b/src/BHRZ03_Certificate.inlines.hh
@@ -1,11 +1,11 @@
 /* BHRZ03_Certificate class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/BHRZ03_Certificate.types.hh b/src/BHRZ03_Certificate.types.hh
index 2185260..888d7fa 100644
--- a/src/BHRZ03_Certificate.types.hh
+++ b/src/BHRZ03_Certificate.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Bit_Matrix.cc b/src/Bit_Matrix.cc
new file mode 100644
index 0000000..d28f44c
--- /dev/null
+++ b/src/Bit_Matrix.cc
@@ -0,0 +1,243 @@
+/* Bit_Matrix class implementation (non-inline functions).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+
+#include "Bit_Matrix.defs.hh"
+#include "globals.defs.hh"
+#include <iostream>
+#include <string>
+#include <climits>
+
+#include "swapping_sort.icc"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Bit_Matrix&
+PPL::Bit_Matrix::operator=(const Bit_Matrix& y){
+  rows = y.rows;
+  row_size = y.row_size;
+  assert(OK());
+  return *this;
+}
+
+void
+PPL::Bit_Matrix::sort_rows() {
+  typedef std::vector<Bit_Row>::iterator Iter;
+  // Sorting without removing duplicates.
+  Iter first = rows.begin();
+  Iter last = rows.end();
+  swapping_sort(first, last, Bit_Row_Less_Than());
+  // Moving all the duplicate elements at the end of the vector.
+  Iter new_last = swapping_unique(first, last);
+  // Removing duplicates.
+  rows.erase(new_last, last);
+  assert(OK());
+}
+
+void
+PPL::Bit_Matrix::add_row(const Bit_Row& row) {
+  const dimension_type new_rows_size = rows.size() + 1;
+  if (rows.capacity() < new_rows_size) {
+    // Reallocation will take place.
+    std::vector<Bit_Row> new_rows;
+    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_rows_size, Bit_Row());
+    // Put the new row in place.
+    dimension_type i = new_rows_size-1;
+    new_rows[i] = row;
+    // Steal the old rows.
+    while (i-- > 0)
+      new_rows[i].swap(rows[i]);
+    // Put the new rows into place.
+    std::swap(rows, new_rows);
+  }
+  else
+    // Reallocation will NOT take place: append a new empty row.
+    rows.push_back(row);
+  assert(OK());
+}
+
+void
+PPL::Bit_Matrix::transpose() {
+  const Bit_Matrix& x = *this;
+  const dimension_type nrows = num_rows();
+  const dimension_type ncols = num_columns();
+  Bit_Matrix tmp(ncols, nrows);
+  for (dimension_type i = nrows; i-- > 0; )
+    for (unsigned long j = x[i].last(); j != ULONG_MAX; j = x[i].prev(j))
+      tmp[j].set(i);
+  swap(tmp);
+  assert(OK());
+}
+
+void
+PPL::Bit_Matrix::transpose_assign(const Bit_Matrix& y) {
+  const dimension_type y_nrows = y.num_rows();
+  const dimension_type y_ncols = y.num_columns();
+  Bit_Matrix tmp(y_ncols, y_nrows);
+  for (dimension_type i = y_nrows; i-- > 0; )
+    for (unsigned long j = y[i].last(); j != ULONG_MAX; j = y[i].prev(j))
+      tmp[j].set(i);
+  swap(tmp);
+  assert(OK());
+}
+
+void
+PPL::Bit_Matrix::resize(dimension_type new_n_rows,
+		       dimension_type new_n_columns) {
+  assert(OK());
+  const dimension_type old_num_rows = num_rows();
+  if (new_n_columns < row_size) {
+    const dimension_type num_preserved_rows
+      = std::min(old_num_rows, new_n_rows);
+    Bit_Matrix& x = *this;
+    for (dimension_type i = num_preserved_rows; i-- > 0; )
+      x[i].clear_from(new_n_columns);
+  }
+  row_size = new_n_columns;
+  if (new_n_rows > old_num_rows) {
+    if (rows.capacity() < new_n_rows) {
+      // Reallocation will take place.
+      std::vector<Bit_Row> new_rows;
+      new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_rows.insert(new_rows.end(), new_n_rows, Bit_Row());
+      // Steal the old rows.
+      for (dimension_type i = old_num_rows; i-- > 0; )
+	new_rows[i].swap(rows[i]);
+      // Put the new vector into place.
+      std::swap(rows, new_rows);
+    }
+    else
+      // Reallocation will NOT take place.
+      rows.insert(rows.end(), new_n_rows - old_num_rows, Bit_Row());
+  }
+  else if (new_n_rows < old_num_rows)
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+
+  assert(OK());
+}
+
+void
+PPL::Bit_Matrix::ascii_dump(std::ostream& s) const {
+  const Bit_Matrix& x = *this;
+  const char separator = ' ';
+  s << num_rows() << separator << 'x' << separator
+    << num_columns() << "\n";
+  for (dimension_type i = 0; i < num_rows(); ++i) {
+    for (dimension_type j = 0; j < num_columns(); ++j)
+      s << x[i][j] << separator;
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Bit_Matrix)
+
+bool
+PPL::Bit_Matrix::ascii_load(std::istream& s) {
+  Bit_Matrix& x = *this;
+  dimension_type nrows;
+  dimension_type ncols;
+  std::string str;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+    return false;
+  resize(nrows, ncols);
+
+  for (dimension_type i = 0; i < num_rows(); ++i)
+    for (dimension_type j = 0; j < num_columns(); ++j) {
+      int bit;
+      if (!(s >> bit))
+	return false;
+      if (bit)
+	x[i].set(j);
+      else
+	x[i].clear(j);
+    }
+
+  // Check invariants.
+  assert(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Bit_Matrix::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(Row);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes();
+  return n;
+}
+
+bool
+PPL::Bit_Matrix::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const Bit_Matrix& x = *this;
+  for (dimension_type i = num_rows(); i-- > 1; ) {
+    const Bit_Row& row = x[i];
+    if (!row.OK())
+      return false;
+    else if (row.last() != ULONG_MAX && row.last() >= row_size) {
+#ifndef NDEBUG
+      cerr << "Bit_Matrix[" << i << "] is a row with too many bits!"
+	   << endl
+	   << "(row_size == " << row_size
+	   << ", row.last() == " << row.last() << ")"
+	   << endl;
+#endif
+      return false;
+    }
+  }
+  return true;
+}
+
+#ifndef NDEBUG
+bool
+PPL::Bit_Matrix::check_sorted() const {
+  const Bit_Matrix& x = *this;
+  for (dimension_type i = num_rows(); i-- > 1; )
+    if (compare(x[i-1], x[i]) > 0)
+      return false;
+  return true;
+}
+#endif
+
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+bool
+PPL::operator==(const Bit_Matrix& x, const Bit_Matrix& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows()
+      || x.num_columns() != y.num_columns())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
diff --git a/src/Bit_Matrix.defs.hh b/src/Bit_Matrix.defs.hh
new file mode 100644
index 0000000..966cff5
--- /dev/null
+++ b/src/Bit_Matrix.defs.hh
@@ -0,0 +1,179 @@
+/* Bit_Matrix class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bit_Matrix_defs_hh
+#define PPL_Bit_Matrix_defs_hh 1
+
+#include "Bit_Matrix.types.hh"
+#include "Linear_System.defs.hh"
+#include "Bit_Row.defs.hh"
+#include <vector>
+#include <iosfwd>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Matrix {
+public:
+  //! Default constructor.
+  Bit_Matrix();
+
+  //! Construct a bit matrix with \p n_rows rows and \p n_columns columns.
+  Bit_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+  //! Copy-constructor.
+  Bit_Matrix(const Bit_Matrix& y);
+
+  //! Destructor.
+  ~Bit_Matrix();
+
+  //! Assignment operator.
+  Bit_Matrix& operator=(const Bit_Matrix& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Bit_Matrix& y);
+
+  //! Subscript operator.
+  Bit_Row& operator[](dimension_type k);
+
+  //! Constant subscript operator.
+  const Bit_Row& operator[](dimension_type k) const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  //! Transposes the matrix.
+  void transpose();
+
+  //! Makes \p *this a transposed copy of \p y.
+  void transpose_assign(const Bit_Matrix& y);
+
+  //! Returns the maximum number of rows of a Bit_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the number of columns of \p *this.
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows of \p *this.
+  dimension_type num_rows() const;
+
+  //! Sorts the rows and removes duplicates.
+  void sort_rows();
+
+  //! Looks for \p row in \p *this, which is assumed to be sorted.
+  /*!
+    \return
+    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+    \param row
+    The row that will be searched for in the matrix.
+
+    Given a sorted bit matrix (this ensures better efficiency),
+    tells whether it contains the given row.
+  */
+  bool sorted_contains(const Bit_Row& row) const;
+
+  //! Adds \p row to \p *this.
+  void add_row(const Bit_Row& row);
+
+  //! Erases the rows from the \p first_to_erase -th to the last one.
+  void rows_erase_to_end(dimension_type first_to_erase);
+
+  //! Erases the columns from the \p first_to_erase -th to the last one.
+  void columns_erase_to_end(dimension_type first_to_erase);
+
+  //! Resizes the matrix copying the old contents.
+  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+  bool check_sorted() const;
+#endif
+
+private:
+  //! Contains the rows of the matrix.
+  std::vector<Bit_Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  /*! \ingroup PPL_CXX_interface */
+  struct Bit_Row_Less_Than {
+    bool operator()(const Bit_Row& x, const Bit_Row& y) const;
+  };
+
+  friend
+  void Parma_Polyhedra_Library::
+  Linear_System::sort_and_remove_with_sat(Bit_Matrix& sat);
+
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Matrix& x, const Bit_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Matrix& x, const Bit_Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Bit_Matrix& x,
+	  Parma_Polyhedra_Library::Bit_Matrix& y);
+
+} // namespace std
+
+#include "Bit_Matrix.inlines.hh"
+
+#endif // !defined(PPL_Bit_Matrix_defs_hh)
diff --git a/src/Bit_Matrix.inlines.hh b/src/Bit_Matrix.inlines.hh
new file mode 100644
index 0000000..ab7170a
--- /dev/null
+++ b/src/Bit_Matrix.inlines.hh
@@ -0,0 +1,151 @@
+/* Bit_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bit_Matrix_inlines_hh
+#define PPL_Bit_Matrix_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Matrix::Bit_Matrix()
+  : rows(),
+    row_size(0) {
+}
+
+inline dimension_type
+Bit_Matrix::max_num_rows() {
+  return std::vector<Bit_Row>().max_size();
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const dimension_type n_rows,
+		       const dimension_type n_columns)
+  : rows(n_rows),
+    row_size(n_columns) {
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const Bit_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size) {
+}
+
+inline
+Bit_Matrix::~Bit_Matrix() {
+}
+
+inline void
+Bit_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
+  // The first row to be erased cannot be greater
+  // than the actual number of the rows of the matrix.
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+  assert(OK());
+}
+
+inline void
+Bit_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
+  // The first column to be erased cannot be greater
+  // than the actual number of the columns of the matrix.
+  assert(first_to_erase <= row_size);
+  row_size = first_to_erase;
+  assert(OK());
+}
+
+inline void
+Bit_Matrix::swap(Bit_Matrix& y) {
+  std::swap(row_size, y.row_size);
+  std::swap(rows, y.rows);
+}
+
+inline Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline const Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Bit_Matrix::num_columns() const {
+  return row_size;
+}
+
+inline dimension_type
+Bit_Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline void
+Bit_Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Bit_Row>().swap(rows);
+  row_size = 0;
+}
+
+inline memory_size_type
+Bit_Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Bit_Matrix::Bit_Row_Less_Than::
+operator()(const Bit_Row& x, const Bit_Row& y) const {
+  return compare(x, y) < 0;
+}
+
+inline bool
+Bit_Matrix::sorted_contains(const Bit_Row& row) const {
+  assert(check_sorted());
+  return std::binary_search(rows.begin(), rows.end(), row,
+			    Bit_Row_Less_Than());
+}
+
+/*! \relates Bit_Matrix */
+inline bool
+operator!=(const Bit_Matrix& x, const Bit_Matrix& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Bit_Matrix& x,
+     Parma_Polyhedra_Library::Bit_Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Bit_Matrix_inlines_hh)
diff --git a/src/Bit_Matrix.types.hh b/src/Bit_Matrix.types.hh
new file mode 100644
index 0000000..da7c595
--- /dev/null
+++ b/src/Bit_Matrix.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Bit_Matrix_types_hh
+#define PPL_Bit_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Matrix_types_hh)
diff --git a/src/Bit_Row.cc b/src/Bit_Row.cc
new file mode 100644
index 0000000..c0e260c
--- /dev/null
+++ b/src/Bit_Row.cc
@@ -0,0 +1,347 @@
+/* Bit_Row class implementation (non-inline functions).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+
+#include "Bit_Row.defs.hh"
+#include <cassert>
+#include <climits>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#define PPL_BITS_PER_GMP_LIMB (PPL_SIZEOF_MP_LIMB_T*CHAR_BIT)
+
+#if !PPL_HAVE_DECL_FFS || PPL_SIZEOF_MP_LIMB_T != PPL_SIZEOF_INT
+unsigned int
+PPL::Bit_Row::first_one(mp_limb_t w) {
+  unsigned int r = 0;
+  w = w & -w;
+#if PPL_SIZEOF_MP_LIMB_T == 8
+  if ((w & 0xffffffff) == 0) {
+    w >>= 32;
+    r += 32;
+  }
+#elif PPL_SIZEOF_MP_LIMB_T != 4
+#error "Size of mp_limb_t not supported by Bit_Row::first_one(mp_limb_t w)."
+#endif
+  if ((w & 0xffff) == 0) {
+    w >>= 16;
+    r += 16;
+  }
+  if ((w & 0xff) == 0) {
+    w >>= 8;
+    r += 8;
+  }
+  if (w & 0xf0)
+    r += 4;
+  if (w & 0xcc)
+    r += 2;
+  if (w & 0xaa)
+    r += 1;
+  return r;
+}
+#endif // !PPL_HAVE_DECL_FFS || PPL_SIZEOF_MP_LIMB_T != PPL_SIZEOF_INT
+
+unsigned int
+PPL::Bit_Row::last_one(mp_limb_t w) {
+  unsigned int r = 0;
+#if PPL_SIZEOF_MP_LIMB_T == 8
+  if (w & 0xffffffff00000000) {
+    w >>= 32;
+    r += 32;
+  }
+#elif PPL_SIZEOF_MP_LIMB_T != 4
+#error "Size of mp_limb_t not supported by Bit_Row::last_one(mp_limb_t w)."
+#endif
+  if (w & 0xffff0000) {
+    w >>= 16;
+    r += 16;
+  }
+  if (w & 0xff00) {
+    w >>= 8;
+    r += 8;
+  }
+  if (w & 0xf0) {
+    w >>= 4;
+    r += 4;
+  }
+  if (w & 0xc) {
+    w >>= 2;
+    r += 2;
+  }
+  if (w & 0x2)
+    r += 1;
+  return r;
+}
+
+unsigned long
+PPL::Bit_Row::first() const {
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size >= 0);
+  mp_size_t li = 0;
+  mp_srcptr p = vec->_mp_d;
+  for (; li < vec_size; ++li, ++p) {
+    const mp_limb_t limb = *p;
+    if (limb != 0)
+      return li*PPL_BITS_PER_GMP_LIMB + first_one(limb);
+  }
+  return ULONG_MAX;
+}
+
+unsigned long
+PPL::Bit_Row::next(unsigned long position) const {
+  ++position;
+
+  // The alternative implementation using the mpz_scan1() function
+  // of GMP was measured to be slower that ours.  Here it is, in
+  // case mpz_scan1() is improved.
+  //
+  // unsigned long r = mpz_scan1(vec, position);
+  // return (r == ULONG_MAX) ? -1 : r;
+
+  mp_size_t li = position / PPL_BITS_PER_GMP_LIMB;
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size >= 0);
+  if (li >= vec_size)
+    return ULONG_MAX;
+
+  // Get the first limb.
+  mp_srcptr p = vec->_mp_d + li;
+
+  // Mask off any bits before `position' in the first limb.
+  mp_limb_t limb = *p & (~(mp_limb_t) 0) << (position % PPL_BITS_PER_GMP_LIMB);
+
+  while (true) {
+    if (limb != 0)
+      return li*PPL_BITS_PER_GMP_LIMB + first_one(limb);
+    ++li;
+    if (li == vec_size)
+      break;
+    ++p;
+    limb = *p;
+  }
+  return ULONG_MAX;
+}
+
+unsigned long
+PPL::Bit_Row::last() const {
+  mp_size_t li = vec->_mp_size;
+  assert(li >= 0);
+  if (li == 0)
+    return ULONG_MAX;
+  --li;
+  const mp_srcptr p = vec->_mp_d + li;
+  const mp_limb_t limb = *p;
+  assert(limb != 0);
+  return li*PPL_BITS_PER_GMP_LIMB + last_one(limb);
+}
+
+unsigned long
+PPL::Bit_Row::prev(unsigned long position) const {
+  if (position == 0)
+    return ULONG_MAX;
+
+  --position;
+
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size > 0);
+  mp_size_t li = position / PPL_BITS_PER_GMP_LIMB;
+
+  mp_limb_t limb;
+  mp_srcptr p = vec->_mp_d;
+
+  // Get the first limb.
+  if (li >= vec_size) {
+    li = vec_size - 1;
+    p += li;
+    limb = *p;
+  }
+  else {
+    const mp_limb_t mask
+      = (~(mp_limb_t) 0)
+      >> (PPL_BITS_PER_GMP_LIMB - 1 - position % PPL_BITS_PER_GMP_LIMB);
+    p += li;
+    limb = *p & mask;
+  }
+
+  while (true) {
+    if (limb != 0)
+      return li*PPL_BITS_PER_GMP_LIMB + last_one(limb);
+    if (li == 0)
+      break;
+    --li;
+    --p;
+    limb = *p;
+  }
+  return ULONG_MAX;
+}
+
+bool
+PPL::Bit_Row::operator[](const unsigned long k) const {
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size >= 0);
+
+  unsigned long i = k / GMP_NUMB_BITS;
+  if (i >= static_cast<unsigned long>(vec_size))
+    return false;
+
+  mp_limb_t limb = *(vec->_mp_d + i);
+  return (limb >> (k % GMP_NUMB_BITS)) & 1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+int
+PPL::compare(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  mp_size_t size = (x_size > y_size ? y_size : x_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl != yl) {
+      // Get the ones where they are different.
+      const mp_limb_t diff = xl ^ yl;
+      // First bit that is different.
+      const mp_limb_t mask = diff & ~(diff-1);
+      return (xl & mask) ? 1 : -1;
+    }
+    ++xp;
+    ++yp;
+    --size;
+  }
+  return x_size == y_size ? 0 : (x_size > y_size ? 1 : -1);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::subset_or_equal(const Bit_Row& x, const Bit_Row& y) {
+  mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    if (*xp & ~*yp)
+      return false;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+		     bool& strict_subset) {
+  mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  strict_subset = (x_size < y_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl & ~yl)
+      return false;
+    if (!strict_subset && xl != yl)
+      strict_subset = true;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::strict_subset(const Bit_Row& x, const Bit_Row& y) {
+  mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  bool different = (x_size < y_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl & ~yl)
+      return false;
+    if (!different && xl != yl)
+      different = true;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return different;
+}
+
+/*! \relates Bit_Row */
+bool
+PPL::operator==(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_vec_size = x.vec->_mp_size;
+  assert(x_vec_size >= 0);
+  const mp_size_t y_vec_size = y.vec->_mp_size;
+  assert(y_vec_size >= 0);
+
+  if (x_vec_size != y_vec_size)
+    return false;
+
+  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) == 0;
+}
+
+/*! \relates Bit_Row */
+bool
+PPL::operator!=(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_vec_size = x.vec->_mp_size;
+  assert(x_vec_size >= 0);
+  const mp_size_t y_vec_size = y.vec->_mp_size;
+  assert(y_vec_size >= 0);
+
+  if (x_vec_size != y_vec_size)
+    return true;
+
+  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) != 0;
+}
+
+bool
+PPL::Bit_Row::OK() const {
+  const mp_size_t vec_size = vec->_mp_size;
+  const mp_size_t vec_alloc = vec->_mp_alloc;
+  return vec_size >= 0
+    && vec_alloc >= vec_size
+    && (vec_size == 0 || mpz_getlimbn(vec, vec_size-1) != 0);
+}
diff --git a/src/Bit_Row.defs.hh b/src/Bit_Row.defs.hh
new file mode 100644
index 0000000..aeed4fc
--- /dev/null
+++ b/src/Bit_Row.defs.hh
@@ -0,0 +1,222 @@
+/* Bit_Row class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bit_Row_defs_hh
+#define PPL_Bit_Row_defs_hh 1
+
+#include "Bit_Row.types.hh"
+#include "globals.types.hh"
+#include <iosfwd>
+#include <gmp.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Bit_Row
+  Compares \p x with \p y starting from the least significant bits.
+  The ordering is total and has the following property: if \p x and \p y
+  are two rows seen as sets of naturals, if \p x is a strict subset
+  of \p y, then \p x comes before \p y.
+
+  Returns
+  - -1 if \p x comes before \p y in the ordering;
+  -  0 if \p x and \p y are equal;
+  -  1 if \p x comes after \p y in the ordering.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Set-theoretic inclusion test: sets \p strict_subset to a Boolean
+  indicating whether the inclusion is strict or not.
+
+  \relates Bit_Row
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+		     bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic union.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic intersection.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic difference.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row in a matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Row {
+public:
+  //! Default constructor.
+  Bit_Row();
+
+  //! Copy-constructor.
+  Bit_Row(const Bit_Row& y);
+
+  //! Destructor.
+  ~Bit_Row();
+
+  //! Assignment operator.
+  Bit_Row& operator=(const Bit_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Bit_Row& y);
+
+  //! Returns the truth value corresponding to the bit in position \p k.
+  bool operator[](unsigned long k) const;
+
+  //! Sets the bit in position \p k.
+  void set(unsigned long k);
+
+  //! Sets bits up to position \p k (excluded).
+  void set_until(unsigned long k);
+
+  //! Clears the bit in position \p k.
+  void clear(unsigned long k);
+
+  //! Clears bits from position \p k (included) onward.
+  void clear_from(unsigned long k);
+
+  //! Clears all the bits of the row.
+  void clear();
+
+  friend int compare(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator==(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator!=(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+			      bool& strict_subset);
+  friend bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+  friend void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+  friend void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+  friend void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+  unsigned long first() const;
+
+  /*! \brief
+    Returns the index of the first set bit after \p position
+    or ULONG_MAX if no bit after \p position is set.
+  */
+  unsigned long next(unsigned long position) const;
+
+  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+  unsigned long last() const;
+
+  /*! \brief
+    Returns the index of the first set bit before \p position
+    or ULONG_MAX if no bits before \p position is set.
+  */
+  unsigned long prev(unsigned long position) const;
+
+  //! Returns the number of set bits in the row.
+  unsigned long count_ones() const;
+
+  //! Returns <CODE>true</CODE> if no bit is set in the row.
+  bool empty() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied
+  bool OK() const;
+
+private:
+  //! Bit-vector representing the row.
+  mpz_t vec;
+
+  //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
+  static unsigned int first_one(mp_limb_t w);
+
+  //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
+  static unsigned int last_one(mp_limb_t w);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Bit_Row& x,
+	  Parma_Polyhedra_Library::Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator y);
+
+} // namespace std
+
+#include "Bit_Row.inlines.hh"
+
+#endif // !defined(PPL_Bit_Row_defs_hh)
diff --git a/src/Bit_Row.inlines.hh b/src/Bit_Row.inlines.hh
new file mode 100644
index 0000000..706df9f
--- /dev/null
+++ b/src/Bit_Row.inlines.hh
@@ -0,0 +1,150 @@
+/* Bit_Row class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bit_Row_inlines_hh
+#define PPL_Bit_Row_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <cassert>
+// For the declaration of ffs(3).
+#include <strings.h>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Row::Bit_Row() {
+  mpz_init(vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y) {
+  mpz_init_set(vec, y.vec);
+}
+
+inline
+Bit_Row::~Bit_Row() {
+  mpz_clear(vec);
+}
+
+inline Bit_Row&
+Bit_Row::operator=(const Bit_Row& y) {
+  mpz_set(vec, y.vec);
+  return *this;
+}
+
+inline void
+Bit_Row::set(const unsigned long k) {
+  mpz_setbit(vec, k);
+}
+
+inline void
+Bit_Row::clear(const unsigned long k) {
+  mpz_clrbit(vec, k);
+}
+
+inline void
+Bit_Row::clear_from(const unsigned long k) {
+  mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Bit_Row::count_ones() const {
+  assert(vec->_mp_size >= 0);
+  return mpn_popcount(vec->_mp_d, vec->_mp_size);
+}
+
+inline bool
+Bit_Row::empty() const {
+  return mpz_sgn(vec) == 0;
+}
+
+inline void
+Bit_Row::swap(Bit_Row& y) {
+  mpz_swap(vec, y.vec);
+}
+
+inline void
+Bit_Row::clear() {
+  mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Bit_Row::external_memory_in_bytes() const {
+  return vec[0]._mp_alloc * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Bit_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+#if PPL_HAVE_DECL_FFS && PPL_SIZEOF_MP_LIMB_T == PPL_SIZEOF_INT
+
+inline unsigned int
+Bit_Row::first_one(mp_limb_t w) {
+  return ffs(w)-1;
+}
+
+#endif
+
+/*! \relates Bit_Row */
+inline void
+set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
+  mpz_ior(z.vec, x.vec, y.vec);
+}
+
+/*! \relates Bit_Row */
+inline void
+set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
+  mpz_and(z.vec, x.vec, y.vec);
+}
+
+/*! \relates Bit_Row */
+inline void
+set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
+  DIRTY_TEMP0(mpz_class, complement_y);
+  mpz_com(complement_y.get_mpz_t(), y.vec);
+  mpz_and(z.vec, x.vec, complement_y.get_mpz_t());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+inline void
+swap(Parma_Polyhedra_Library::Bit_Row& x,
+     Parma_Polyhedra_Library::Bit_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Bit_Row_inlines_hh)
diff --git a/src/Bit_Row.types.hh b/src/Bit_Row.types.hh
new file mode 100644
index 0000000..2541aee
--- /dev/null
+++ b/src/Bit_Row.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Bit_Row_types_hh
+#define PPL_Bit_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Row_types_hh)
diff --git a/src/Boundary.defs.hh b/src/Boundary.defs.hh
new file mode 100644
index 0000000..2712910
--- /dev/null
+++ b/src/Boundary.defs.hh
@@ -0,0 +1,745 @@
+/* Interval boundary functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Boundary_defs_hh
+#define PPL_Boundary_defs_hh 1
+
+#include "Checked_Number.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Boundary_NS {
+
+struct Unbounded {
+  Unbounded() {
+  }
+};
+
+const Unbounded UNBOUNDED;
+
+struct Property {
+  enum Type {
+    SPECIAL_,
+    OPEN_,
+    NORMALIZED_
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+static const Property SPECIAL(Property::SPECIAL_);
+static const Property OPEN(Property::OPEN_);
+static const Property NORMALIZED(Property::NORMALIZED_);
+
+enum Boundary_Type {
+  LOWER = ROUND_DOWN,
+  UPPER = ROUND_UP
+};
+
+inline Rounding_Dir
+round_dir_check(Boundary_Type t, bool check = false) {
+  if (check)
+    return static_cast<Rounding_Dir>(t | ROUND_FPU_CHECK_INEXACT);
+  else
+    return static_cast<Rounding_Dir>(t);
+}
+
+template <typename T, typename Info>
+inline Result
+special_set_boundary_infinity(Boundary_Type type, T&, Info& info) {
+  assert(Info::store_special);
+  info.set_boundary_property(type, SPECIAL);
+  return V_EQ;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_boundary_infinity(Boundary_Type, const T&, const Info&) {
+  return true;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_open(Boundary_Type, const T&, const Info&) {
+  return !Info::may_contain_infinity;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::store_special && !Info::may_contain_infinity
+      && normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::may_contain_infinity
+      && is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline Result
+set_unbounded(Boundary_Type type, T& x, Info& info) {
+  COMPILE_TIME_CHECK(Info::store_special
+		     || std::numeric_limits<T>::is_bounded
+		     || std::numeric_limits<T>::has_infinity,
+		     "Unbounded is not representable");
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, ROUND_UP);
+  else
+    r = assign_r(x, PLUS_INFINITY, ROUND_DOWN);
+  if (r == V_EQ && !Info::may_contain_infinity)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  /*
+  COMPILE_TIME_CHECK(Info::store_special
+		     || std::numeric_limits<T>::has_infinity,
+		     "Minus infinity is not representable");
+  */
+  if (open)
+    assert(type == LOWER);
+  else
+    assert(Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special) {
+    assert(type == LOWER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+  assert(r != VC_MINUS_INFINITY);
+  if (open || r != V_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  /*
+  COMPILE_TIME_CHECK(Info::store_special
+		     || std::numeric_limits<T>::has_infinity,
+		     "Minus infinity is not representable");
+  */
+  if (open)
+    assert(type == UPPER);
+  else
+    assert(Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special) {
+    assert(type == UPPER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+  assert(r != VC_MINUS_INFINITY);
+  if (open || r != V_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  assert(open || Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+  else
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+  assert(r == V_EQ);
+  if (open)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+shrink(Boundary_Type type, T& x, Info& info) {
+  Result r;
+  if (type == LOWER) {
+    r = info.restrict(x, V_GT);
+    if (r != V_GT)
+      return r;
+  } else {
+    r = info.restrict(x, V_LT);
+    if (r != V_LT)
+      return r;
+  }
+  info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline bool
+is_unbounded(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special)
+    return info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info);
+  else if (std::numeric_limits<T>::has_infinity) {
+    if (type == LOWER)
+      return Parma_Polyhedra_Library::is_minus_infinity(x);
+    else
+      return Parma_Polyhedra_Library::is_plus_infinity(x);
+  }
+  else if (std::numeric_limits<T>::is_bounded) {
+    if (type == LOWER)
+      return x == std::numeric_limits<T>::min();
+    else
+      return x == std::numeric_limits<T>::max();
+  } else
+    return false;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (type == LOWER)
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_reverse_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (!Info::may_contain_infinity)
+    return false;
+  else if (type == LOWER)
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_minus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == LOWER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL)
+	&& special_is_boundary_infinity(type, x, info);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_plus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == UPPER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL)
+	&& special_is_boundary_infinity(type, x, info);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special)
+    return info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info);
+  else
+    return normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) {
+  return !Info::store_special
+    && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline int
+is_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (is_boundary_infinity(type, x, info))
+    return type == LOWER ? -1 : 1;
+  else if (is_reverse_infinity(type, x, info))
+    return type == UPPER ? -1 : 1;
+  else
+    return 0;
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity_closed(Boundary_Type type, const T& x, const Info& info) {
+  return Info::may_contain_infinity
+    && !info.get_boundary_property(type, OPEN)
+    && is_boundary_infinity(type, x, info);
+}
+
+template <typename Info>
+inline bool
+boundary_infinity_is_open(Boundary_Type type, const Info& info) {
+  return !Info::may_contain_infinity ||
+    info.get_boundary_property(type, OPEN);
+}
+
+template <typename T, typename Info>
+inline int
+sgn_b(Boundary_Type type, const T& x, const Info& info) {
+  if (info.get_boundary_property(type, SPECIAL) &&
+      special_is_boundary_infinity(type, x, info))
+    return type == LOWER ? -1 : 1;
+  else
+    // The following Parma_Polyhedra_Library:: qualification is to work
+    // around a bug of GCC 4.0.x.
+    return Parma_Polyhedra_Library::sgn(x);
+}
+
+template <typename T, typename Info>
+inline int
+sgn(Boundary_Type type, const T& x, const Info& info) {
+  int sign = sgn_b(type, x, info);
+  if (x == 0 && info.get_boundary_property(type, OPEN))
+    return type == LOWER ? -1 : 1;
+  else
+    return sign;
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+eq(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (type1 == type2) {
+    if (is_open(type1, x1, info1)
+	!= is_open(type2, x2, info2))
+      return false;
+  }
+  else if (is_open(type1, x1, info1)
+	   || is_open(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1))
+    return is_minus_infinity(type2, x2, info2);
+  else if (is_plus_infinity(type1, x1, info1))
+    return is_plus_infinity(type2, x2, info2);
+  else if (is_minus_infinity(type2, x2, info2) ||
+	   is_plus_infinity(type2, x2, info2))
+    return false;
+  else
+    return equal(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+lt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (is_open(type1, x1, info1)) {
+    if (type1 == UPPER
+	&& (type2 == LOWER
+	    || !is_open(type2, x2, info2)))
+      goto le;
+  }
+  else if (type2 == LOWER
+	   && is_open(type2, x2, info2)) {
+  le:
+    if (is_minus_infinity(type1, x1, info1)
+	|| is_plus_infinity(type2, x2, info2))
+      return true;
+    if (is_plus_infinity(type1, x1, info1)
+	|| is_minus_infinity(type2, x2, info2))
+      return false;
+    else
+      return less_or_equal(x1, x2);
+  }
+  if (is_plus_infinity(type1, x1, info1)
+      || is_minus_infinity(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1)
+      || is_plus_infinity(type2, x2, info2))
+    return true;
+  else
+    return less_than(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+gt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return lt(type2, x2, info2, type1, x1, info1);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+le(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !gt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+ge(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !lt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T, typename Info>
+inline Result
+adjust_boundary(Boundary_Type type, T& x, Info& info,
+		bool open, Result r) {
+  if (type == LOWER) {
+    switch (r) {
+    case V_NEG_OVERFLOW:
+      open = true;
+      /* Fall through */
+    case VC_MINUS_INFINITY:
+      if (!Info::store_special)
+	return r;
+      if (open)
+	info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_GT:
+      open = true;
+      /* Fall through */
+    case V_GE:
+    case V_EQ:
+      if (open)
+	shrink(type, x, info);
+      // FIXME: what to return?
+      return r;
+    default:
+      assert(false);
+      return VC_NAN;
+    }
+  }
+  else {
+    switch (r) {
+    case V_POS_OVERFLOW:
+      open = true;
+      /* Fall through */
+    case VC_PLUS_INFINITY:
+      if (!Info::store_special)
+	return r;
+      if (open)
+	info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_LT:
+      open = true;
+      /* Fall through */
+    case V_LE:
+    case V_EQ:
+      if (open)
+	shrink(type, x, info);
+      // FIXME: what to return?
+      return r;
+    default:
+      assert(false);
+      return VC_NAN;
+    }
+  }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+complement(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  assert(to_type != type);
+  bool shrink;
+  if (info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info)) {
+    shrink = !special_is_open(type, x, info);
+    if (type == LOWER)
+      return set_minus_infinity(to_type, to, to_info, shrink);
+    else
+      return set_plus_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = !normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+assign(Boundary_Type to_type, To& to, To_Info& to_info,
+       Boundary_Type type, const T& x, const Info& info,
+       bool shrink = false) {
+  assert(to_type == type);
+  if (info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info)) {
+    shrink = shrink || special_is_open(type, x, info);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = shrink || normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  if (lt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (lt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  if (gt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (gt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+neg_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  assert(to_type != type);
+  bool shrink;
+  if (info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info)) {
+    shrink = special_is_open(type, x, info);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = neg_assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+add_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  assert(type1 == type2);
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1) &&
+      !is_boundary_infinity_closed(type2, x2, info2);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2) &&
+      !is_boundary_infinity_closed(type1, x1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  // FIXME: extended handling is not needed
+  Result r = add_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+sub_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  assert(type1 != type2);
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1) &&
+      !is_boundary_infinity_closed(type2, x2, info2);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2) &&
+      !is_boundary_infinity_closed(type1, x1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  // FIXME: extended handling is not needed
+  Result r = sub_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1) &&
+      !is_boundary_infinity_closed(type2, x2, info2);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2) &&
+      !is_boundary_infinity_closed(type1, x1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  assert(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = mul_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info>
+inline Result
+set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool shrink) {
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+	     Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+	     Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  bool shrink;
+  if (x1s != 0) {
+    if (x2s != 0)
+      return mul_assign(to_type, to, to_info,
+			type1, x1, info1,
+			type2, x2, info2);
+    else
+      shrink = info2.get_boundary_property(type2, OPEN);
+  }
+  else {
+    shrink = info1.get_boundary_property(type1, OPEN)
+      && (x2s != 0 || info2.get_boundary_property(type2, OPEN));
+  }
+  return set_zero(to_type, to, to_info, shrink);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2);
+    return set_zero(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  assert(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = div_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+	     Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+	     Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  bool shrink;
+  if (x1s != 0) {
+    if (x2s != 0)
+      return div_assign(to_type, to, to_info,
+			type1, x1, info1,
+			type2, x2, info2);
+    else {
+      // FIXME: restrictions
+      return set_boundary_infinity(to_type, to, to_info, true);
+    }
+  }
+  else {
+    shrink = info1.get_boundary_property(type1, OPEN)
+      && !is_boundary_infinity_closed(type2, x2, info2);
+    return set_zero(to_type, to, to_info, shrink);
+  }
+}
+
+} // namespace Boundary_NS
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Boundary_defs_hh)
diff --git a/src/Bounding_Box.cc b/src/Bounding_Box.cc
deleted file mode 100644
index a9b88ce..0000000
--- a/src/Bounding_Box.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Bounding_Box class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-#include "Bounding_Box.defs.hh"
-#include "Variable.defs.hh"
-#include "Constraint.defs.hh"
-#include "Constraint_System.inlines.hh"
-#include <iostream>
-
-namespace PPL = Parma_Polyhedra_Library;
-
-template <typename Iterator>
-void
-PPL::Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
-					Iterator first, Iterator last) {
-  for (dimension_type i = vec.size(); i-- > 0; ) {
-    Interval& x_vec_i = vec[i];
-    const Interval& y_vec_i = y.vec[i];
-
-    // Upper bound.
-    UBoundary& x_ub = x_vec_i.upper_bound();
-    ERational& x_ubb = x_ub.bound();
-    const ERational& y_ubb = y_vec_i.upper_bound().bound();
-    assert(y_ubb <= x_ubb);
-    if (y_ubb < x_ubb) {
-      Iterator k = std::lower_bound(first, last, x_ubb);
-      if (k != last) {
-	if (x_ubb < *k)
-	  x_ubb = *k;
-      }
-      else
-	x_ub = UBoundary(ERational(PLUS_INFINITY), UBoundary::OPEN);
-    }
-
-    // Lower bound.
-    LBoundary& x_lb = x_vec_i.lower_bound();
-    ERational& x_lbb = x_lb.bound();
-    const ERational& y_lbb = y_vec_i.lower_bound().bound();
-    assert(y_lbb >= x_lbb);
-    if (y_lbb > x_lbb) {
-      Iterator k = std::lower_bound(first, last, x_lbb);
-      if (k != last) {
-	if (x_lbb < *k)
-	  if (k != first)
-	    x_lbb = *--k;
-	  else
-	    x_lb = LBoundary(ERational(MINUS_INFINITY), LBoundary::OPEN);
-      }
-      else
-	x_lbb = *--k;
-    }
-  }
-}
-
-void
-PPL::Bounding_Box::CC76_widening_assign(const Bounding_Box& y) {
-  static ERational stop_points[] = {
-    ERational(-2, ROUND_NOT_NEEDED),
-    ERational(-1, ROUND_NOT_NEEDED),
-    ERational(0, ROUND_NOT_NEEDED),
-    ERational(1, ROUND_NOT_NEEDED),
-    ERational(2, ROUND_NOT_NEEDED)
-  };
-  CC76_widening_assign(y,
-		       stop_points,
-		       stop_points
-		       + sizeof(stop_points)/sizeof(stop_points[0]));
-}
-
-PPL::Constraint_System
-PPL::Bounding_Box::constraints() const {
-  Constraint_System cs;
-  dimension_type space_dim = space_dimension();
-  if (space_dim == 0) {
-    if (is_empty())
-      cs = Constraint_System::zero_dim_empty();
-  }
-  else if (is_empty())
-    cs.insert(0*Variable(space_dim-1) <= -1);
-  else {
-    // KLUDGE: in the future `cs' will be constructed of the right dimension.
-    // For the time being, we force the dimension with the following line.
-    cs.insert(0*Variable(space_dim-1) <= 0);
-
-    for (dimension_type k = 0; k < space_dim; ++k) {
-      bool closed = false;
-      PPL::Coefficient n;
-      PPL::Coefficient d;
-      if (get_lower_bound(k, closed, n, d)) {
-	if (closed)
-	  cs.insert(d*Variable(k) >= n);
-	else
-	  cs.insert(d*Variable(k) > n);
-      }
-      if (get_upper_bound(k, closed, n, d)) {
-	if (closed)
-	  cs.insert(d*Variable(k) <= n);
-	else
-	  cs.insert(d*Variable(k) < n);
-      }
-    }
-  }
-  return cs;
-}
-
-/*! \relates Parma_Polyhedra_Library::Bounding_Box */
-std::ostream&
-PPL::IO_Operators::operator<<(std::ostream& s, const PPL::Bounding_Box& bbox) {
-  if (bbox.is_empty()) {
-    s << "empty";
-    return s;
-  }
-  const dimension_type dimension = bbox.space_dimension();
-  for (dimension_type k = 0; k < dimension; ++k) {
-    bool closed = false;
-    PPL::Coefficient n;
-    PPL::Coefficient d;
-    if (bbox.get_lower_bound(k, closed, n, d)) {
-      s << (closed ? "[" : "(")
-	<< n;
-      if (d != 1)
-	s << "/" << d;
-      s << ", ";
-    }
-    else
-      s << "(-inf, ";
-    if (bbox.get_upper_bound(k, closed, n, d)) {
-      s << n;
-      if (d != 1)
-	s << "/" << d;
-      s << (closed ? "]" : ")");
-    }
-    else
-      s << "+inf)";
-    s << "\n";
-  }
-  return s;
-}
diff --git a/src/Bounding_Box.defs.hh b/src/Bounding_Box.defs.hh
deleted file mode 100644
index c8fceda..0000000
--- a/src/Bounding_Box.defs.hh
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Bounding_Box class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Bounding_Box_defs_hh
-#define PPL_Bounding_Box_defs_hh 1
-
-#include "Coefficient.types.hh"
-#include "globals.types.hh"
-#include "Coefficient.defs.hh"
-#include "Interval.defs.hh"
-#include "Constraint_System.defs.hh"
-#include <vector>
-#include <iosfwd>
-
-namespace Parma_Polyhedra_Library {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A not necessarily closed bounding-box.
-/*! \ingroup PPL_CXX_interface
-  A Bounding_Box object represents the Cartesian product of \f$n\f$
-  not necessarily closed and possibly unbounded intervals,
-  where \f$n\f$ is the space dimension of the box.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Bounding_Box {
-public:
-  //! Constructs a universe bounding box of dimension \p num_dimensions.
-  Bounding_Box(dimension_type num_dimensions);
-
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
-
-  /*! \brief
-    Returns a reference the interval that bounds
-    the box on the <CODE>k</CODE>-th space dimension.
-  */
-  const Interval& operator[](dimension_type k) const;
-
-  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
-  bool is_empty() const;
-
-  /*! \brief
-    If the <CODE>k</CODE>-th space dimension is unbounded below, returns
-    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
-    \p closed, \p n and \p d accordingly.
-
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-
-    An undefined behavior is obtained if \p k is greater than
-    or equal to the space dimension of \p *this.
-  */
-  bool get_lower_bound(dimension_type k, bool& closed,
-		       Coefficient& n, Coefficient& d) const;
-
-  /*! \brief
-    If the <CODE>k</CODE>-th space dimension is unbounded above, returns
-    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
-    \p closed, \p n and \p d accordingly.
-
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
-
-    An undefined behavior is obtained if \p k is greater than
-    or equal to the space dimension of \p *this.
-  */
-  bool get_upper_bound(dimension_type k, bool& closed,
-		       Coefficient& n, Coefficient& d) const;
-
-  //! Causes the box to become empty, i.e., to represent the empty set.
-  void set_empty();
-
-  /*! \brief
-    Raises the lower bound of the interval corresponding
-    to the <CODE>k</CODE>-th space dimension.
-
-    Intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
-    An undefined behavior is obtained if \p k is greater than or equal to
-    the space dimension of \p *this or if \p d is equal to zero.
-  */
-  void raise_lower_bound(dimension_type k, bool closed,
-			 Coefficient_traits::const_reference n,
-			 Coefficient_traits::const_reference d);
-
-  /*! \brief
-    Lowers the upper bound of the interval corresponding
-    to the <CODE>k</CODE>-th space dimension.
-
-    Intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
-    is <CODE>false</CODE>.
-    An undefined behavior is obtained if \p k is greater than or equal to
-    the space dimension of \p *this or if \p d is equal to zero.
-  */
-  void lower_upper_bound(dimension_type k, bool closed,
-			 Coefficient_traits::const_reference n,
-			 Coefficient_traits::const_reference d);
-
-  //! Returns a system of constraints corresponding to \p *this.
-  Constraint_System constraints() const;
-
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
-
-    \param y
-    A bounding box that <EM>must</EM> be contained in \p *this.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void CC76_widening_assign(const Bounding_Box& y);
-
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
-
-    \param y
-    A bounding box that <EM>must</EM> be contained in \p *this.
-
-    \param first
-    An iterator that points to the first stop-point.
-
-    \param last
-    An iterator that points one past the last stop-point.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  template <typename Iterator>
-  void CC76_widening_assign(const Bounding_Box& y,
-			    Iterator first, Iterator last);
-
-private:
-  /*! \brief
-    A vector of rational intervals, one for each dimension
-    of the vector space.
-  */
-  std::vector<Interval> vec;
-  /*! \brief
-    A boolean flag indicating emptiness of the bounding box.
-    Only meaningful when \p empty_up_to_date is <CODE>true</CODE>.
-  */
-  mutable bool empty;
-  //! Tells whether or not the flag \p empty is meaningful.
-  mutable bool empty_up_to_date;
-
-  //! Records the stop points for CC76_widening_assign(const Bounding_Box&).
-  static ERational default_stop_points[];
-};
-
-namespace IO_Operators {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Bounding_Box */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-std::ostream& operator<<(std::ostream& s, const Bounding_Box& bbox);
-
-} // namespace IO_Operators
-
-} // namespace Parma_Polyhedra_Library
-
-#include "Bounding_Box.inlines.hh"
-
-#endif // !defined(PPL_Bounding_Box_defs_hh)
diff --git a/src/Bounding_Box.inlines.hh b/src/Bounding_Box.inlines.hh
deleted file mode 100644
index 9f41ac0..0000000
--- a/src/Bounding_Box.inlines.hh
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Bounding_Box class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Bounding_Box_inlines_hh
-#define PPL_Bounding_Box_inlines_hh 1
-
-namespace Parma_Polyhedra_Library {
-
-inline
-Bounding_Box::Bounding_Box(dimension_type num_dimensions)
-  : vec(num_dimensions), empty(false), empty_up_to_date(true) {
-}
-
-inline dimension_type
-Bounding_Box::space_dimension() const {
-  return vec.size();
-}
-
-inline const Interval&
-Bounding_Box::operator[](const dimension_type k) const {
-  assert(k < vec.size());
-  return vec[k];
-}
-
-inline bool
-Bounding_Box::is_empty() const {
-  if (empty_up_to_date)
-    return empty;
-  else {
-    empty_up_to_date = true;
-    for (dimension_type k = vec.size(); k-- > 0; )
-      if (vec[k].is_empty()) {
-	empty = true;
-	return true;
-      }
-    empty = false;
-    return false;
-  }
-}
-
-inline bool
-Bounding_Box::get_lower_bound(const dimension_type k, bool& closed,
-			      Coefficient& n, Coefficient& d) const {
-  assert(k < vec.size());
-  const LBoundary& lb = vec[k].lower_bound();
-  const ERational& lr = lb.bound();
-
-  if (is_plus_infinity(lr) || is_minus_infinity(lr))
-    return false;
-
-  closed = lb.is_closed();
-  n = raw_value(lr).get_num();
-  d = raw_value(lr).get_den();
-
-  return true;
-}
-
-inline bool
-Bounding_Box::get_upper_bound(const dimension_type k, bool& closed,
-			     Coefficient& n, Coefficient& d) const {
-  assert(k < vec.size());
-  const UBoundary& ub = vec[k].upper_bound();
-  const ERational& ur = ub.bound();
-
-  if (is_plus_infinity(ur) || is_minus_infinity(ur))
-    return false;
-
-  closed = ub.is_closed();
-  n = raw_value(ur).get_num();
-  d = raw_value(ur).get_den();
-
-  return true;
-}
-
-inline void
-Bounding_Box::set_empty() {
-  for (dimension_type k = vec.size(); k-- > 0; )
-    vec[k].set_empty();
-  empty = empty_up_to_date = true;
-}
-
-inline void
-Bounding_Box::raise_lower_bound(const dimension_type k, const bool closed,
-				Coefficient_traits::const_reference n,
-				Coefficient_traits::const_reference d) {
-  assert(k < vec.size());
-  assert(d != 0);
-  mpq_class q;
-  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-  q.canonicalize();
-  vec[k].raise_lower_bound(LBoundary(ERational(q, ROUND_NOT_NEEDED),
-				     (closed
-				      ? LBoundary::CLOSED
-				      : LBoundary::OPEN)));
-  empty_up_to_date = false;
-}
-
-inline void
-Bounding_Box::lower_upper_bound(const dimension_type k, const bool closed,
-				Coefficient_traits::const_reference n,
-				Coefficient_traits::const_reference d) {
-  assert(k < vec.size());
-  assert(d != 0);
-  mpq_class q;
-  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-  q.canonicalize();
-  vec[k].lower_upper_bound(UBoundary(ERational(q, ROUND_NOT_NEEDED),
-				     (closed
-				      ? UBoundary::CLOSED
-				      : UBoundary::OPEN)));
-  empty_up_to_date = false;
-}
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Bounding_Box_inlines_hh)
diff --git a/src/Bounding_Box.types.hh b/src/Bounding_Box.types.hh
deleted file mode 100644
index 8ed42d8..0000000
--- a/src/Bounding_Box.types.hh
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is free software; as a special exception the author 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. */
-
-#ifndef PPL_Bounding_Box_types_hh
-#define PPL_Bounding_Box_types_hh 1
-
-namespace Parma_Polyhedra_Library {
-
-class Bounding_Box;
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Bounding_Box_types_hh)
diff --git a/src/Box.cc b/src/Box.cc
new file mode 100644
index 0000000..78c7700
--- /dev/null
+++ b/src/Box.cc
@@ -0,0 +1,76 @@
+/* Box class implementation (non-inline functions).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "Box.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+PPL::extract_interval_constraint(const Constraint& c,
+				 const dimension_type c_space_dim,
+				 dimension_type& c_num_vars,
+				 dimension_type& c_only_var) {
+  // Check for preconditions.
+  assert(c.space_dimension() == c_space_dim);
+  assert(c_num_vars == 0 && c_only_var == 0);
+  // Collect the non-zero components of `c'.
+  for (dimension_type i = c_space_dim; i-- > 0; )
+    if (c.coefficient(Variable(i)) != 0) {
+      if (c_num_vars == 0) {
+	c_only_var = i;
+	++c_num_vars;
+      }
+      else
+	// Constraint `c' is not an interval constraint.
+	return false;
+    }
+  return true;
+}
+
+bool
+PPL::extract_interval_congruence(const Congruence& cg,
+			 	 const dimension_type cg_space_dim,
+				 dimension_type& cg_num_vars,
+				 dimension_type& cg_only_var) {
+  // Check for preconditions.
+  assert(cg.space_dimension() == cg_space_dim);
+  assert(cg_num_vars == 0 && cg_only_var == 0);
+  // Only equality congruences can be intervals.
+  assert(cg.is_equality());
+
+  // Collect the non-zero components of `cg'.
+  for (dimension_type i = cg_space_dim; i-- > 0; )
+    if (cg.coefficient(Variable(i)) != 0) {
+      if (cg_num_vars == 0) {
+	cg_only_var = i;
+	++cg_num_vars;
+      }
+      else
+	// Congruence `cg' is not an interval congruence.
+	return false;
+    }
+  return true;
+}
diff --git a/src/Box.defs.hh b/src/Box.defs.hh
new file mode 100644
index 0000000..58793c2
--- /dev/null
+++ b/src/Box.defs.hh
@@ -0,0 +1,1998 @@
+/* Box class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Box_defs_hh
+#define PPL_Box_defs_hh 1
+
+#include "Box.types.hh"
+#include "globals.types.hh"
+#include "Coefficient.defs.hh"
+#include "Variable.types.hh"
+#include "Variables_Set.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint.types.hh"
+#include "Constraint.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator.types.hh"
+#include "Generator_System.types.hh"
+#include "Congruence.types.hh"
+#include "Congruence_System.types.hh"
+#include "BD_Shape.types.hh"
+#include "Octagonal_Shape.types.hh"
+#include "Poly_Con_Relation.types.hh"
+#include "Poly_Gen_Relation.types.hh"
+#include "Polyhedron.types.hh"
+#include "Grid.types.hh"
+#include "Partially_Reduced_Product.types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename ITV>
+bool operator==(const Box<ITV>& x, const Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename ITV>
+bool operator!=(const Box<ITV>& x, const Box<ITV>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream& operator<<(std::ostream& s, const Box<ITV>& box);
+
+} // namespace IO_Operators
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box
+  Helper function for computing distances.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+	  typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const Box<ITV>& x, const Box<ITV>& y,
+		    Rounding_Dir dir,
+		    Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A not necessarily closed, iso-oriented hyperrectangle.
+/*! \ingroup PPL_CXX_interface
+  A Box object represents the Cartesian product of \f$n\f$
+  not necessarily closed and possibly unbounded intervals
+  represented by objects of class \p ITV,
+  where \f$n\f$ is the space dimension of the box.
+*/
+template <typename ITV>
+class Parma_Polyhedra_Library::Box {
+public:
+  //! The type of intervals used to implement the box.
+  typedef ITV interval_type;
+
+  //! Returns the maximum space dimension that a Box can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty box of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the box;
+
+    \param kind
+    Specifies whether the universe or the empty box has to be built.
+  */
+  explicit Box(dimension_type num_dimensions = 0,
+	       Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Box(const Box& y,
+      Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename Other_ITV>
+  explicit Box(const Box<Other_ITV>& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box from the system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref bounding_boxes "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+  */
+  explicit Box(const Constraint_System& cs);
+
+  //! Builds a box recycling a system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref bounding_boxes "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a box from the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Box(const Generator_System& gs);
+
+  //! Builds a box recycling the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \param gs
+    The generator system describing the polyhedron to be approximated.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  Box(const Generator_System& gs, Recycle_Input dummy);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they may have contributed to the space dimension).
+  */
+  explicit Box(const Congruence_System& cgs);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs, recycling \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they will contribute to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds a box containing the BDS \p bds.
+  /*!
+    Builds the smallest box containing \p bds using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const BD_Shape<T>& bds,
+	       Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the octagonal shape \p oct.
+  /*!
+    Builds the smallest box containing \p oct using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const Octagonal_Shape<T>& oct,
+	       Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the polyhedron \p ph.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the built box is the
+    smallest one containing \p ph.
+  */
+  explicit Box(const Polyhedron& ph,
+	       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box containing the grid \p gr.
+  /*!
+    Builds the smallest box containing \p gr using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  explicit Box(const Grid& ph,
+	       Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the partially reduced product \p dp.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+  */
+  template <typename D1, typename D2, typename R>
+  explicit Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+	       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Box& operator=(const Box& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void swap(Box& y);
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Box
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty box.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe box.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded box.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool contains(const Box&) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Box&) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Box
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Box
+  //@{
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+    FIXME: this is not true.
+
+    \param c
+    The constraint to be added. If it is not an interval constraint, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+     Use the constraints in \p cs to refine \p *this.
+     FIXME: this is not true.
+
+     \param  cs
+     The constraints to be added. Constraints that are not interval
+     constraints will be simply ignored.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+    FIXME: this is not true.
+
+    \param  cs
+    The constraints to be added. Constraints that are not interval
+    constraints will be simply ignored.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used. If it is not a non-relational
+    equality, the box is not changed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used. Congruences that are
+    not non-relational equalities are not added although their
+    space dimension is checked for compatibility.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param cgs
+    The congruences to be used. Congruences that are
+    not non-relational equalities are not added although their
+    space dimension is checked for compatibility. The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest box containing the convex union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void box_hull_assign(const Box& y);
+
+  //! Same as box_hull_assign.
+  void upper_bound_assign(const Box& y);
+
+  /*! \brief
+    If the box-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool box_hull_assign_if_exact(const Box& y);
+
+  //! Same as box_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void box_difference_assign(const Box& y);
+
+  //! Same as box_difference_assign.
+  void difference_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Box& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_widening_assign(const Box& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop-point.
+
+    \param last
+    An iterator that points one past the last stop-point.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_widening_assign(const Box& y,
+			    Iterator first, Iterator last);
+
+  //! Same as CC76_widening_assign(y, tp).
+  void widening_assign(const Box& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened box.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Box& y,
+					 const Constraint_System& cs,
+					 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A Box that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const Box& y);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old box into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    box, which is defined by a system of interval constraints in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the box and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new box, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Seeing a box as a set of tuples (its points),
+    assigns to \p *this all the tuples that can be obtained by concatenating,
+    in the order given, a tuple of \p *this with a tuple of \p y.
+
+    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the boxes
+    corresponding, on entry, to \p *this and \p y, respectively.
+    Upon successful completion, \p *this will represent the box
+    \f$R \sseq \Rset^{n+m}\f$ such that
+    \f[
+      R \defeq
+          \Bigl\{\,
+            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+          \Bigm|
+            (x_1, \ldots, x_n)^\transpose \in B,
+            (y_1, \ldots, y_m)^\transpose \in D
+          \,\Bigl\}.
+    \f]
+    Another way of seeing it is as follows: first increases the space
+    dimension of \p *this by adding \p y.space_dimension() new
+    dimensions; then adds to the system of constraints of \p *this a
+    renamed-apart version of the constraints of \p y.
+  */
+  void concatenate_assign(const Box& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  /*! \brief
+    Returns a reference the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  const ITV& get_interval(Variable var) const;
+
+  /*! \brief
+    Sets to \p i the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void set_interval(Variable var, const ITV& i);
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded below, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_lower_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded above, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_upper_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences approximating \p *this.
+  Congruence_System congruences() const;
+
+  //! Returns a minimized system of congruences approximating \p *this.
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+private:
+  template <typename Other_ITV>
+  friend class Parma_Polyhedra_Library::Box;
+
+  friend bool
+  operator==<ITV>(const Box<ITV>& x, const Box<ITV>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library
+  ::IO_Operators::operator<<<>(std::ostream& s, const Box<ITV>& box);
+
+  template <typename Specialization, typename Temp, typename To, typename I>
+  friend bool Parma_Polyhedra_Library::l_m_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Box<I>& x, const Box<I>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+  //! The type of sequence used to implement the box.
+  typedef std::vector<ITV> Sequence;
+
+  /*! \brief
+    The type of intervals used by inner computations when trying to limit
+    the cumulative effect of approximation errors.
+  */
+  typedef ITV Tmp_Interval_Type;
+
+  //! A sequence of intervals, one for each dimension of the vector space.
+  Sequence seq;
+
+#define PPL_IN_Box_CLASS
+#include "Box_Status.idefs.hh"
+#undef PPL_IN_Box_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the box is known to be empty.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+public:
+  //! Causes the box to become empty, i.e., to represent the empty set.
+  void set_empty();
+
+private:
+  //! Marks \p *this as definitely not empty.
+  void set_nonempty();
+
+  //! Asserts the validity of the empty flag of \p *this.
+  void set_empty_up_to_date();
+
+  //! Invalidates empty flag of \p *this.
+  void reset_empty_up_to_date();
+
+  /*! \brief
+    Checks the hard way whether \p *this is an empty box:
+    returns <CODE>true</CODE> if and only if it is so.
+  */
+  bool check_empty() const;
+
+   /*! \brief
+     Returns a reference the interval that bounds
+     the box on the <CODE>k</CODE>-th space dimension.
+   */
+  const ITV& operator[](dimension_type k) const;
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+    FIXME: this is not true.
+
+    \param c
+    The constraint to be added. If it is not an interval constraint, it
+    will be simply ignored.  If it is dimension-incompatible with \p *this,
+    the behavior is undefined.
+  */
+  void add_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+    FIXME: this is not true.
+
+    \param  cs
+    The constraints to be added. Constraints that are not interval
+    constraints will be simply ignored.  If it is
+    dimension-incompatible with \p *this, the behavior is undefined.
+  */
+  void add_constraints_no_check(const Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+    FIXME: this is not true.
+
+    \param cg
+    The congruence to be added. If it is not a non-relational equality
+    congruence, it will be ignored.  If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void add_congruence_no_check(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+    FIXME: this is not true.
+
+    \param cgs
+    The congruences to be added. Congruences that are not non-relational
+    equality congruences will be ignored.  If it is
+    dimension-incompatible with \p *this, the behavior is undefined.
+  */
+  void add_congruences_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+    FIXME: this is not true.
+
+    \param cg
+    The congruence to be added. If it is not a non-relational equality
+    congruence, it will be ignored.  If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+    FIXME: this is not true.
+
+    \param cgs
+    The congruences to be added. Congruences that are not non-relational
+    equality congruences will be ignored.  If it is
+    dimension-incompatible with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added. If it is dimension-incompatible with
+    \p *this, the behavior is undefined.
+
+    FIXME: mention the possibility of non-termination.
+
+    \if Include_Implementation_Details
+
+    For any expression \f$e\f$, we denote by
+    \f$\left\uparrow e \right\uparrow\f$ (resp., \f$\left\downarrow e
+    \right\downarrow\f$) the result of any computation that is
+    guaranteed to yield an upper (resp., lower) approximation of
+    \f$e\f$.  So there exists \f$\epsilon \in \Rset\f$ with
+    \f$\epsilon \geq 0\f$ such that
+    \f$\left\uparrow e \right\uparrow = e + \epsilon\f$.
+    If \f$\epsilon = 0\f$ we say that the computation of
+    \f$\left\uparrow e \right\uparrow\f$ is <EM>exact</EM>;
+    we say it is <EM>inexact</EM> otherwise.
+    Similarly for \f$\left\downarrow e \right\downarrow\f$.
+
+    Consider a constraint of the general form
+    \f[
+      z + \sum_{i \in I}{a_ix_i} \relsym 0,
+    \f]
+    where \f$z \in \Zset\f$, \f$I\f$ is a set of indices,
+    \f$a_i \in \Zset\f$ with \f$a_i \neq 0\f$ for each \f$i \in I\f$, and
+    \f$\mathord{\relsym} \in \{ \mathord{\geq}, \mathord{>}, \mathord{=} \}\f$.
+    The set \f$I\f$ is subdivided into the disjoint sets \f$P\f$ and \f$N\f$
+    such that, for each \f$i \in I\f$, \f$a_i > 0\f$ if \f$i \in P\f$ and
+    \f$a_i < 0\f$ if \f$i \in N\f$.
+    Suppose that, for each \f$i \in P \union N\f$ a variation interval
+    \f$\chi_i \sseq \Rset\f$ is known for \f$x_i\f$ and that the infimum
+    and the supremum of \f$\chi_i\f$ are denoted, respectively,
+    by \f$\chi_i^\mathrm{l}\f$ and \f$\chi_i^\mathrm{u}\f$, where
+    \f$\chi_i^\mathrm{l}, \chi_i^\mathrm{u} \in \Rset \union \{ -\infty, +\infty \}\f$.
+
+    For each \f$k \in P\f$, we have
+    \f[
+      x_k
+        \relsym
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_ix_i}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_ix_i}
+            \Biggr).
+    \f]
+    Thus, if \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P \setdiff \{ k \}\f$,
+    we have
+    \f[
+      x_k
+        \geq
+          \Biggl\downarrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{l}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+            \Biggr)
+          \Biggr\downarrow
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$P \setdiff \{ k \}\f$,
+    \f[
+      x_k
+        \leq
+          \Biggl\uparrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{u}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+            \Biggr)
+          \Biggl\uparrow.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+
+    For each \f$k \in N\f$, we have
+    \f[
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_ix_i}
+          - \sum_{i \in P}{a_ix_i}
+        \Biggr)
+          \relsym
+            x_k.
+    \f]
+    Thus, if
+    \f$\chi_i^\mathrm{l} \in \Rset\f$
+    for each \f$i \in N \setdiff \{ k \}\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P\f$,
+    we have
+    \f[
+      \Biggl\uparrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{u}}
+        \Biggr)
+      \Biggl\uparrow
+        \geq
+          x_k
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N \setdiff \{ k \}\f$
+    and \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in P\f$,
+    \f[
+      \Biggl\downarrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{l}}
+        \Biggr)
+      \Biggl\downarrow
+        \leq
+          x_k.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    \endif
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+    The constraints to be added. If it is dimension-incompatible with
+    \p *this, the behavior is undefined.
+
+    FIXME: mention the possibility of non-termination.
+  */
+  void refine_no_check(const Constraint_System& cs);
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p *this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+				    const Box& x) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Constraint_System& cs) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Congruence_System& cgs) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* name_row,
+				    const Linear_Expression& y) const;
+
+  static void throw_space_dimension_overflow(const char* method,
+					     const char* reason);
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+					   const Linear_Expression& e);
+
+  static void throw_generic(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns the relations holding between an interval and
+  an interval constraint.
+
+  \param i
+  The interval;
+
+  \param constraint_type
+  The constraint type;
+
+  \param num
+  The numerator of the constraint bound;
+
+  \param den
+  The denominator of the constraint bound
+
+  The interval constraint has the form
+  <CODE>den * Variable(0) relsym num</CODE>
+  where relsym is  <CODE>==</CODE>,  <CODE>></CODE> or  <CODE>>=</CODE>
+  depending on the <CODE>constraint_type</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+                  const Constraint::Type constraint_type,
+                  Coefficient_traits::const_reference num,
+                  Coefficient_traits::const_reference den = 1);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as an interval constraint.
+/*! \relates Box
+  \return
+  <CODE>true</CODE> if the constraint \p c is an
+  \ref bounding_boxes "interval constraint";
+  <CODE>false</CODE> otherwise.
+
+  \param c
+  The constraint to be decoded.
+
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
+
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0 and 1.
+
+  \param c_only_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the only variable having
+  a non-zero coefficient in \p c.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool extract_interval_constraint(const Constraint& c,
+				 dimension_type c_space_dim,
+				 dimension_type& c_num_vars,
+				 dimension_type& c_only_var);
+
+bool extract_interval_congruence(const Congruence& cg,
+				 dimension_type cg_space_dim,
+				 dimension_type& cg_num_vars,
+				 dimension_type& cg_only_var);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Box_Status.inlines.hh"
+#include "Box.inlines.hh"
+#include "Box.templates.hh"
+
+#endif // !defined(PPL_Box_defs_hh)
diff --git a/src/Box.inlines.hh b/src/Box.inlines.hh
new file mode 100644
index 0000000..01e4b06
--- /dev/null
+++ b/src/Box.inlines.hh
@@ -0,0 +1,605 @@
+/* Box class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Box_inlines_hh
+#define PPL_Box_inlines_hh 1
+
+#include "Boundary.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include "distances.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline bool
+Box<ITV>::marked_empty() const {
+  return status.test_empty_up_to_date() && status.test_empty();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty() {
+  status.set_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_nonempty() {
+  status.reset_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty_up_to_date() {
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::reset_empty_up_to_date() {
+  return status.reset_empty_up_to_date();
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Box& y, Complexity_Class)
+  : seq(y.seq), status(y.status) {
+}
+
+template <typename ITV>
+inline Box<ITV>&
+Box<ITV>::operator=(const Box& y) {
+  seq = y.seq;
+  status = y.status;
+  return *this;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::swap(Box& y) {
+  Box& x = *this;
+  std::swap(x.seq, y.seq);
+  std::swap(x.status, y.status);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cs);
+  this->swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Generator_System& gs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(gs);
+  this->swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cgs);
+  this->swap(tmp);
+}
+
+template <typename ITV>
+inline memory_size_type
+Box<ITV>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::space_dimension() const {
+  return seq.size();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return Sequence().max_size() - 1;
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::operator[](const dimension_type k) const {
+  assert(k < seq.size());
+  return seq[k];
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::get_interval(const Variable var) const {
+  if (space_dimension() < var.space_dimension())
+    throw_dimension_incompatible("get_interval(v)", "v", var);
+
+  if (is_empty()) {
+    static ITV empty_interval(EMPTY);
+    return empty_interval;
+  }
+
+  return seq[var.id()];
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_interval(const Variable var, const ITV& i) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < var.space_dimension())
+    throw_dimension_incompatible("set_interval(v, i)", "v", var);
+
+  if (is_empty() && space_dim >= 2)
+    // If the box is empty, and has dimension >= 2, setting only one
+    // interval will not make it non-empty.
+    return;
+
+  seq[var.id()] = i;
+  reset_empty_up_to_date();
+
+  assert(OK());
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::is_empty() const {
+  return marked_empty() || check_empty();
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+			Coefficient& sup_n, Coefficient& sup_d,
+			bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+			Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+			Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+			Coefficient& inf_n, Coefficient& inf_d,
+			bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+			Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+			Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::strictly_contains(const Box& y) const {
+  const Box& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::upper_bound_assign(const Box& y) {
+  Box& x = *this;
+  x.box_hull_assign(y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::box_hull_assign_if_exact(const Box&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::upper_bound_assign_if_exact(const Box& y) {
+  Box& x = *this;
+  return x.box_hull_assign_if_exact(y);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::expand_space_dimension(const Variable var,
+				      const dimension_type m) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting Box should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_generic("expand_dimension(v, m)",
+		  "adding m new space dimensions exceeds "
+		  "the maximum allowed space dimension");
+
+  // To expand the space dimension corresponding to variable `var',
+  // we append to the box `m' copies of the corresponding interval.
+  seq.insert(seq.end(), m, seq[var.id()]);
+  assert(OK());
+}
+
+template <typename ITV>
+inline bool
+operator!=(const Box<ITV>& x, const Box<ITV>& y) {
+  return !(x == y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::get_lower_bound(const dimension_type k, bool& closed,
+			       Coefficient& n, Coefficient& d) const {
+  assert(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.lower_is_unbounded())
+    return false;
+
+  closed = !seq_k.lower_is_open();
+
+  DIRTY_TEMP0(mpq_class, lr);
+  assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED);
+  n = lr.get_num();
+  d = lr.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::get_upper_bound(const dimension_type k, bool& closed,
+			       Coefficient& n, Coefficient& d) const {
+  assert(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.upper_is_unbounded())
+    return false;
+
+  closed = !seq_k.upper_is_open();
+
+  DIRTY_TEMP0(mpq_class, ur);
+  assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED);
+  n = ur.get_num();
+  d = ur.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::difference_assign(const Box& y) {
+  Box& x = *this;
+  x.box_difference_assign(y);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  add_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", cs);
+
+  add_constraints_no_check(cs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  add_congruence_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruences(const Congruence_System& cgs) {
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", cgs);
+  add_congruences_no_check(cgs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Box<T>::widening_assign(const Box& y, unsigned* tp) {
+  CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+inline Congruence_System
+Box<ITV>::minimized_congruences() const {
+  // Only equalities can be congruences and these are already minimized.
+  return congruences();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_constraints(cs)", cs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_congruences(cgs)", cgs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cgs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::unconstrain(const Variable var) {
+  const dimension_type dim = var.id();
+  // Dimension-compatibility check.
+  if (dim > space_dimension())
+    throw_dimension_incompatible("unconstrain(var)", dim);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for `var' before cylindrification.
+  ITV& seq_var = seq[dim];
+  if (seq_var.is_empty())
+    set_empty();
+  else
+    seq_var.assign(UNIVERSE);
+  assert(OK());
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_inlines_hh)
diff --git a/src/Box.templates.hh b/src/Box.templates.hh
new file mode 100644
index 0000000..3849d57
--- /dev/null
+++ b/src/Box.templates.hh
@@ -0,0 +1,3700 @@
+/* Box class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Box_templates_hh
+#define PPL_Box_templates_hh 1
+
+#include "Variables_Set.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator_System.defs.hh"
+#include "Generator_System.inlines.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "Polyhedron.defs.hh"
+#include "Grid.defs.hh"
+#include "BD_Shape.defs.hh"
+#include "Octagonal_Shape.defs.hh"
+#include "MIP_Problem.defs.hh"
+#include "Rational_Interval.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Box(dimension_type num_dimensions, Degenerate_Element kind)
+  : seq(num_dimensions <= max_space_dimension()
+	? num_dimensions
+	: (throw_space_dimension_overflow("Box(n, k)",
+					  "n exceeds the maximum "
+					  "allowed space dimension"),
+	   num_dimensions)),
+    status() {
+  // In a box that is marked empty the intervals are completely
+  // meaningless: we exploit this by avoiding their initialization.
+  if (kind == UNIVERSE) {
+    for (dimension_type i = num_dimensions; i-- > 0; )
+      seq[i].assign(UNIVERSE);
+    set_empty_up_to_date();
+  }
+  else
+    set_empty();
+  assert(OK());
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs)
+  : seq(cs.space_dimension() <= max_space_dimension()
+	? cs.space_dimension()
+	: (throw_space_dimension_overflow("Box(cs)",
+					  "cs exceeds the maximum "
+					  "allowed space dimension"),
+	   cs.space_dimension())),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_constraints_no_check(cs);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs)
+  : seq(cgs.space_dimension() <= max_space_dimension()
+	? cgs.space_dimension()
+	: (throw_space_dimension_overflow("Box(cgs)",
+					  "cgs exceeds the maximum "
+					  "allowed space dimension"),
+	   cgs.space_dimension())),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cgs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_congruences_no_check(cgs);
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Box(const Box<Other_ITV>& y, Complexity_Class)
+  : seq(y.space_dimension()),
+    // FIXME: why the following does not work?
+    // status(y.status) {
+    status() {
+  // FIXME: remove when the above is fixed.
+  if (y.marked_empty())
+    set_empty();
+
+  if (!y.marked_empty())
+    for (dimension_type k = y.space_dimension(); k-- > 0; )
+      seq[k].assign(y.seq[k]);
+  assert(OK());
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Generator_System& gs)
+  : seq(gs.space_dimension() <= max_space_dimension()
+	? gs.space_dimension()
+	: (throw_space_dimension_overflow("Box(gs)",
+					  "gs exceeds the maximum "
+					  "allowed space dimension"),
+	   gs.space_dimension())),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty box.
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  DIRTY_TEMP0(mpq_class, q);
+  bool point_seen = false;
+  // Going through all the points.
+  for (Generator_System::const_iterator
+	 gs_i = gs_begin; gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    if (g.is_point()) {
+      const Coefficient& d = g.divisor();
+      if (point_seen) {
+	// This is not the first point: `seq' already contains valid values.
+	for (dimension_type i = space_dim; i-- > 0; ) {
+	  assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+	  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	  q.canonicalize();
+	  seq[i].join_assign(q);
+	}
+      }
+      else {
+	// This is the first point seen: initialize `seq'.
+	point_seen = true;
+	for (dimension_type i = space_dim; i-- > 0; ) {
+	  assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+	  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	  q.canonicalize();
+	  seq[i].assign(q);
+	}
+      }
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::Box<ITV>::Box(gs):\n"
+				"the non-empty generator system gs "
+				"contains no points.");
+
+  // Going through all the lines, rays and closure points.
+  ITV q_interval;
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (dimension_type i = space_dim; i-- > 0; )
+	if (g.coefficient(Variable(i)) != 0)
+	  seq[i].assign(UNIVERSE);
+      break;
+    case Generator::RAY:
+      for (dimension_type i = space_dim; i-- > 0; )
+	switch (sgn(g.coefficient(Variable(i)))) {
+	case 1:
+	  seq[i].upper_set(UNBOUNDED);
+	  break;
+	case -1:
+	  seq[i].lower_set(UNBOUNDED);
+	  break;
+	default:
+	  break;
+	}
+      break;
+    case Generator::CLOSURE_POINT:
+      {
+	const Coefficient& d = g.divisor();
+	for (dimension_type i = space_dim; i-- > 0; ) {
+	  assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+	  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	  q.canonicalize();
+	  ITV& seq_i = seq[i];
+	  seq_i.lower_widen(q, true);
+	  seq_i.upper_widen(q, true);
+	}
+      }
+      break;
+    default:
+      // Points already dealt with.
+      break;
+    }
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const BD_Shape<T>& bds, Complexity_Class)
+  : seq(bds.space_dimension() <= max_space_dimension()
+	? bds.space_dimension()
+	: (throw_space_dimension_overflow("Box(bds)",
+					  "bds exceeds the maximum "
+					  "allowed space dimension"),
+	   bds.space_dimension())),
+    status() {
+  // Expose all the interval constraints.
+  bds.shortest_path_closure_assign();
+  if (bds.marked_empty()) {
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    assert(OK());
+    return;
+  }
+
+  DIRTY_TEMP(typename BD_Shape<T>::coefficient_type, tmp);
+  const DB_Row<typename BD_Shape<T>::coefficient_type>& dbm_0 = bds.dbm[0];
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    // Set the upper bound.
+    const typename BD_Shape<T>::coefficient_type& u = dbm_0[i+1];
+    if (is_plus_infinity(u))
+      seq_i.upper_set_uninit(UNBOUNDED);
+    else
+      seq_i.upper_set_uninit(u);
+
+    // Set the lower bound.
+    const typename BD_Shape<T>::coefficient_type& negated_l = bds.dbm[i+1][0];
+    if (is_plus_infinity(negated_l))
+      seq_i.lower_set_uninit(UNBOUNDED);
+    else {
+      neg_assign_r(tmp, negated_l, ROUND_DOWN);
+      seq_i.lower_set_uninit(tmp);
+    }
+
+    // Complete the interval initialization.
+    seq_i.complete_init();
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const Octagonal_Shape<T>& oct, Complexity_Class)
+  : seq(oct.space_dimension() <= max_space_dimension()
+	? oct.space_dimension()
+	: (throw_space_dimension_overflow("Box(oct)",
+					  "oct exceeds the maximum "
+					  "allowed space dimension"),
+	   oct.space_dimension())),
+    status() {
+  // Expose all the interval constraints.
+  oct.strong_closure_assign();
+  if (oct.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
+
+  DIRTY_TEMP0(mpq_class, bound);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    const dimension_type ii = 2*i;
+    const dimension_type cii = ii + 1;
+
+    // Set the upper bound.
+    const typename Octagonal_Shape<T>::coefficient_type& twice_ub
+      = oct.matrix[cii][ii];
+    if (!is_plus_infinity(twice_ub)) {
+      assign_r(bound, twice_ub, ROUND_NOT_NEEDED);
+      div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED);
+      seq_i.upper_set_uninit(bound);
+    }
+    else
+      seq_i.upper_set_uninit(UNBOUNDED);
+
+    // Set the lower bound.
+    const typename Octagonal_Shape<T>::coefficient_type& twice_lb
+      = oct.matrix[ii][cii];
+    if (!is_plus_infinity(twice_lb)) {
+      assign_r(bound, twice_lb, ROUND_NOT_NEEDED);
+      neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+      div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED);
+      seq_i.lower_set_uninit(bound);
+    }
+    else
+      seq_i.lower_set_uninit(UNBOUNDED);
+    seq_i.complete_init();
+  }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Polyhedron& ph, Complexity_Class complexity)
+  : seq(ph.space_dimension() <= max_space_dimension()
+	? ph.space_dimension()
+	: (throw_space_dimension_overflow("Box(ph)",
+					  "ph exceeds the maximum "
+					  "allowed space dimension"),
+	   ph.space_dimension())),
+    status() {
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  // We do not need to bother about `complexity' if:
+  // a) the polyhedron is already marked empty; or ...
+  if (ph.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // b) the polyhedron is zero-dimensional; or ...
+  const dimension_type space_dim = ph.space_dimension();
+  if (space_dim == 0)
+    return;
+
+  // c) the polyhedron is already described by a generator system.
+  if (ph.generators_are_up_to_date() && !ph.has_pending_constraints()) {
+    Box tmp(ph.generators());
+    swap(tmp);
+    return;
+  }
+
+  // Here generators are not up-to-date or there are pending constraints.
+  assert(ph.constraints_are_up_to_date());
+
+  if (complexity == POLYNOMIAL_COMPLEXITY) {
+    // Extract easy-to-find bounds from constraints.
+    Box tmp(ph.simplified_constraints(), Recycle_Input());
+    swap(tmp);
+  }
+  else if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(space_dim);
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+	     ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+	const Constraint& c = *i;
+	if (c.is_strict_inequality())
+	  lp.add_constraint(Linear_Expression(c) >= 0);
+	else
+	  lp.add_constraint(c);
+      }
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      set_empty();
+      return;
+    }
+    // Get all the bounds for the space dimensions.
+    Generator g(point());
+    DIRTY_TEMP0(mpq_class, bound);
+    DIRTY_TEMP(Coefficient, bound_num);
+    DIRTY_TEMP(Coefficient, bound_den);
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      ITV& seq_i = seq[i];
+      lp.set_objective_function(Variable(i));
+      // Evaluate upper bound.
+      lp.set_optimization_mode(MAXIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, bound_num, bound_den);
+	assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED);
+	assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED);
+	assert(is_canonical(bound));
+	seq_i.upper_set_uninit(bound);
+      }
+      else
+	seq_i.upper_set_uninit(UNBOUNDED);
+      // Evaluate optimal lower bound.
+      lp.set_optimization_mode(MINIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, bound_num, bound_den);
+	assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED);
+	assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED);
+	assert(is_canonical(bound));
+	seq_i.lower_set_uninit(bound);
+      }
+      else
+	seq_i.lower_set_uninit(UNBOUNDED);
+      seq_i.complete_init();
+    }
+  }
+  else {
+    assert(complexity == ANY_COMPLEXITY);
+    if (ph.is_empty())
+      set_empty();
+    else {
+      Box tmp(ph.generators());
+      swap(tmp);
+    }
+  }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Grid& gr, Complexity_Class)
+  : seq(gr.space_dimension() <= max_space_dimension()
+	? gr.space_dimension()
+	: (throw_space_dimension_overflow("Box(gr)",
+					  "gr exceeds the maximum "
+					  "allowed space dimension"),
+	   gr.space_dimension())),
+    status() {
+
+  // FIXME: here we are not taking advantage of intervals with restrictions!
+
+  if (gr.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  dimension_type space_dim = gr.space_dimension();
+
+  if (space_dim == 0)
+    return;
+
+  if (!gr.generators_are_up_to_date() && !gr.update_generators()) {
+    // Updating found the grid empty.
+    set_empty();
+    return;
+  }
+
+  assert(!gr.gen_sys.empty());
+
+  // Create a vector to record which dimensions are bounded.
+  std::vector<bool> bounded_interval(space_dim, true);
+
+  const Grid_Generator *first_point = 0;
+  // Clear the bound flag in `bounded_interval' for all dimensions in
+  // which a line or sequence of points extends away from a single
+  // value in the dimension.
+  // FIXME: this computation should be provided by the Grid class.
+  // FIXME: remove the declaration making Box a friend of Grid_Generator
+  //        when this is done.
+  for (Grid_Generator_System::const_iterator gs_i = gr.gen_sys.begin(),
+	 gs_end = gr.gen_sys.end(); gs_i != gs_end; ++gs_i) {
+    Grid_Generator& g = const_cast<Grid_Generator&>(*gs_i);
+    if (g.is_point()) {
+      if (first_point == 0) {
+	first_point = &g;
+	continue;
+      }
+      const Grid_Generator& point = *first_point;
+      // Convert the point `g' to a parameter.
+      for (dimension_type dim = space_dim; dim-- > 0; )
+	g[dim] -= point[dim];
+      g.set_divisor(point.divisor());
+    }
+    for (dimension_type col = space_dim; col > 0; )
+      if (g[col--] != 0)
+	bounded_interval[col] = false;
+  }
+
+  // For each dimension that is bounded by the grid, set both bounds
+  // of the interval to the value of the associated coefficient in a
+  // generator point.
+  assert(first_point != 0);
+  const Grid_Generator& point = *first_point;
+  DIRTY_TEMP0(mpq_class, bound);
+  const Coefficient& divisor = point.divisor();
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    if (bounded_interval[i]) {
+      assign_r(bound.get_num(), point[i+1], ROUND_NOT_NEEDED);
+      assign_r(bound.get_den(), divisor, ROUND_NOT_NEEDED);
+      bound.canonicalize();
+      seq_i.assign(bound);
+    }
+    else
+      seq_i.assign(UNIVERSE);
+  }
+}
+
+template <typename ITV>
+template <typename D1, typename D2, typename R>
+Box<ITV>::Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+              Complexity_Class complexity)
+  : seq(dp.space_dimension() <= max_space_dimension()
+	? dp.space_dimension()
+	: (throw_space_dimension_overflow("Box(dp)",
+					  "dp exceeds the maximum "
+					  "allowed space dimension"),
+	   dp.space_dimension())),
+    status() {
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  for (dimension_type i = dp.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+
+  {
+    Box tmp(dp.domain1(), complexity);
+    intersection_assign(tmp);
+  }
+
+  {
+    Box tmp(dp.domain2(), complexity);
+    intersection_assign(tmp);
+  }
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  // To embed an n-dimension space box in a (n+m)-dimension space,
+  // we just add `m' new universe elements to the sequence.
+  seq.insert(seq.end(), m, ITV());
+  for (dimension_type sz = seq.size(), i = sz - m; i < sz; ++i)
+    seq[i].assign(UNIVERSE);
+  assert(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  // A add `m' new zero elements to the sequence.
+  seq.insert(seq.end(), m, ITV());
+  for (dimension_type sz = seq.size(), i = sz - m; i < sz; ++i)
+    seq[i].assign(0);
+
+  assert(OK());
+}
+
+template <typename ITV>
+bool
+operator==(const Box<ITV>& x, const Box<ITV>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  if (x.is_empty())
+    return y.is_empty();
+
+  if (y.is_empty())
+    return x.is_empty();
+
+  for (dimension_type k = x_space_dim; k-- > 0; )
+    if (x.seq[k] != y.seq[k])
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::bounds(const Linear_Expression& expr, const bool from_above) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+				  ? "bounds_from_above(e)"
+				  : "bounds_from_below(e)"), "e", expr);
+  // A zero-dimensional or empty Box bounds everything.
+  if (space_dim == 0 || is_empty())
+    return true;
+
+  const int from_above_sign = from_above ? 1 : -1;
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    switch (sgn(expr.coefficient(Variable(i))) * from_above_sign) {
+    case 1:
+      if (seq[i].upper_is_unbounded())
+	return false;
+      break;
+    case 0:
+      // Nothing to do.
+      break;
+    case -1:
+      if (seq[i].lower_is_unbounded())
+	return false;
+      break;
+    }
+  return true;
+}
+
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+		  const Constraint::Type constraint_type,
+		  Coefficient_traits::const_reference num,
+		  Coefficient_traits::const_reference den) {
+
+  if (i.is_universe())
+    return Poly_Con_Relation::strictly_intersects();
+
+  DIRTY_TEMP0(mpq_class, bound);
+  assign_r(bound.get_num(), num, ROUND_NOT_NEEDED);
+  assign_r(bound.get_den(), den, ROUND_NOT_NEEDED);
+  bound.canonicalize();
+  neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+  const bool is_lower_bound = (den > 0);
+
+  DIRTY_TEMP0(mpq_class, bound_diff);
+  if (constraint_type == Constraint::EQUALITY) {
+    if (i.lower_is_unbounded()) {
+      assert(!i.upper_is_unbounded());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::strictly_intersects();
+      case 0:
+	return i.upper_is_open()
+	  ? Poly_Con_Relation::is_disjoint()
+	  : Poly_Con_Relation::strictly_intersects();
+      case -1:
+	return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::is_disjoint();
+      case 0:
+	if (i.lower_is_open())
+	  return Poly_Con_Relation::is_disjoint();
+        if (i.is_singleton())
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+	if (i.upper_is_unbounded())
+	  return Poly_Con_Relation::strictly_intersects();
+	else {
+	  assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+	  sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+	  switch (sgn(bound_diff)) {
+	  case 1:
+	    return Poly_Con_Relation::strictly_intersects();
+	  case 0:
+	    if (i.upper_is_open())
+	      return Poly_Con_Relation::is_disjoint();
+	    else
+	      return Poly_Con_Relation::strictly_intersects();
+	  case -1:
+	    return Poly_Con_Relation::is_disjoint();
+	  }
+	}
+      }
+    }
+  }
+
+  assert(constraint_type != Constraint::EQUALITY);
+  if (is_lower_bound) {
+    if (i.lower_is_unbounded()) {
+      assert(!i.upper_is_unbounded());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::strictly_intersects();
+      case 0:
+	if (constraint_type == Constraint::STRICT_INEQUALITY
+	    || i.upper_is_open())
+	  return Poly_Con_Relation::is_disjoint();
+	else
+	  return Poly_Con_Relation::strictly_intersects();
+      case -1:
+	return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::is_included();
+      case 0:
+	if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+	    || i.lower_is_open()) {
+	  Poly_Con_Relation result = Poly_Con_Relation::is_included();
+	  if (i.is_singleton())
+	    result = result && Poly_Con_Relation::saturates();
+	  return result;
+	}
+	else {
+	  assert(constraint_type == Constraint::STRICT_INEQUALITY
+		 && !i.lower_is_open());
+	  if (i.is_singleton())
+	    return Poly_Con_Relation::is_disjoint()
+	      && Poly_Con_Relation::saturates();
+	  else
+	    return Poly_Con_Relation::strictly_intersects();
+	}
+      case -1:
+	if (i.upper_is_unbounded())
+	  return Poly_Con_Relation::strictly_intersects();
+	else {
+	  assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+	  sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+	  switch (sgn(bound_diff)) {
+	  case 1:
+	    return Poly_Con_Relation::strictly_intersects();
+	  case 0:
+	    if (constraint_type == Constraint::STRICT_INEQUALITY
+		|| i.upper_is_open())
+	      return Poly_Con_Relation::is_disjoint();
+	    else
+	      return Poly_Con_Relation::strictly_intersects();
+	  case -1:
+	    return Poly_Con_Relation::is_disjoint();
+	  }
+	}
+      }
+    }
+  }
+  else {
+    // `c' is an upper bound.
+    if (i.upper_is_unbounded())
+      return Poly_Con_Relation::strictly_intersects();
+    else {
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case -1:
+	return Poly_Con_Relation::is_included();
+      case 0:
+	if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+	    || i.upper_is_open()) {
+	  Poly_Con_Relation result = Poly_Con_Relation::is_included();
+	  if (i.is_singleton())
+	    result = result && Poly_Con_Relation::saturates();
+	  return result;
+	}
+	else {
+	  assert(constraint_type == Constraint::STRICT_INEQUALITY
+		 && !i.upper_is_open());
+	  if (i.is_singleton())
+	    return Poly_Con_Relation::is_disjoint()
+	      && Poly_Con_Relation::saturates();
+	  else
+	    return Poly_Con_Relation::strictly_intersects();
+	}
+      case 1:
+	if (i.lower_is_unbounded())
+	  return Poly_Con_Relation::strictly_intersects();
+	else {
+	  assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+	  sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+	  switch (sgn(bound_diff)) {
+	  case -1:
+	    return Poly_Con_Relation::strictly_intersects();
+	  case 0:
+	    if (constraint_type == Constraint::STRICT_INEQUALITY
+		|| i.lower_is_open())
+	      return Poly_Con_Relation::is_disjoint();
+	    else
+	      return Poly_Con_Relation::strictly_intersects();
+	  case 1:
+	    return Poly_Con_Relation::is_disjoint();
+	  }
+	}
+      }
+    }
+  }
+
+  // Quiet a compiler warning: this program point is unreachable.
+  throw std::runtime_error("PPL internal error");
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+   if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+  }
+
+  if (cg.is_equality()) {
+    const Constraint c(cg);
+    return relation_with(c);
+  }
+
+  DIRTY_TEMP0(Rational_Interval, r);
+  DIRTY_TEMP0(Rational_Interval, t);
+  DIRTY_TEMP0(mpq_class, m);
+  r = 0;
+  for (dimension_type i = cg.space_dimension(); i-- > 0; ) {
+    const Coefficient& cg_i = cg.coefficient(Variable(i));
+    if (sgn(cg_i) != 0) {
+      assign_r(m, cg_i, ROUND_NOT_NEEDED);
+      // FIXME: an add_mul_assign() method would come handy here.
+      t = seq[i];
+      t *= m;
+      r += t;
+    }
+  }
+
+  if (r.lower_is_unbounded() || r.upper_is_unbounded())
+    return Poly_Con_Relation::strictly_intersects();
+
+
+  // Find the value that satisfies the congruence and is
+  // nearest to the lower bound such that the point lies on or above it.
+
+  TEMP_INTEGER(lower);
+  TEMP_INTEGER(mod);
+  TEMP_INTEGER(v);
+  mod = cg.modulus();
+  v = cg.inhomogeneous_term() % mod;
+  assign_r(lower, r.lower(), ROUND_DOWN);
+  v -= ((lower / mod) * mod);
+  if (v + lower > 0)
+    v -= mod;
+  return interval_relation(r, Constraint::EQUALITY, v);
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+	|| (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+
+  if (extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var))
+    if (c_num_vars == 0)
+      // c is a trivial constraint.
+      switch (sgn(c.inhomogeneous_term())) {
+      case -1:
+	return Poly_Con_Relation::is_disjoint();
+      case 0:
+	if (c.is_strict_inequality())
+	  return Poly_Con_Relation::saturates()
+	    && Poly_Con_Relation::is_disjoint();
+	else
+	  return Poly_Con_Relation::saturates()
+	    && Poly_Con_Relation::is_included();
+      case 1:
+	return Poly_Con_Relation::is_included();
+      }
+    else {
+      // c is an interval constraint.
+      return interval_relation(seq[c_only_var],
+			       c.type(),
+			       c.inhomogeneous_term(),
+			       c.coefficient(Variable(c_only_var)));
+    }
+  else {
+    // Deal with a non-trivial and non-interval constraint.
+    DIRTY_TEMP0(Rational_Interval, r);
+    DIRTY_TEMP0(Rational_Interval, t);
+    DIRTY_TEMP0(mpq_class, m);
+    r = 0;
+    for (dimension_type i = c.space_dimension(); i-- > 0; ) {
+      const Coefficient& c_i = c.coefficient(Variable(i));
+      if (sgn(c_i) != 0) {
+        assign_r(m, c_i, ROUND_NOT_NEEDED);
+	// FIXME: an add_mul_assign() method would come handy here.
+	t = seq[i];
+	t *= m;
+	r += t;
+      }
+    }
+    return interval_relation(r,
+			     c.type(),
+			     c.inhomogeneous_term());
+  }
+
+  // Quiet a compiler warning: this program point is unreachable.
+  throw std::runtime_error("PPL internal error");
+}
+
+template <typename ITV>
+Poly_Gen_Relation
+Box<ITV>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The empty box cannot subsume a generator.
+  if (is_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe box in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (g.is_line_or_ray()) {
+    if (g.is_line()) {
+      for (dimension_type i = g_space_dim; i-- > 0; )
+	if (g.coefficient(Variable(i)) != 0 && !seq[i].is_universe())
+	  return Poly_Gen_Relation::nothing();
+      return Poly_Gen_Relation::subsumes();
+    }
+    else {
+      assert(g.is_ray());
+      for (dimension_type i = g_space_dim; i-- > 0; )
+	switch (sgn(g.coefficient(Variable(i)))) {
+	case 1:
+	  if (!seq[i].upper_is_unbounded())
+	    return Poly_Gen_Relation::nothing();
+	  break;
+	case 0:
+	  break;
+	case -1:
+	  if (!seq[i].lower_is_unbounded())
+	    return Poly_Gen_Relation::nothing();
+	  break;
+	}
+      return Poly_Gen_Relation::subsumes();
+    }
+  }
+
+  // Here `g' is a point or closure point.
+  const Coefficient& g_divisor = g.divisor();
+  DIRTY_TEMP0(mpq_class, g_coord);
+  DIRTY_TEMP0(mpq_class, bound);
+  for (dimension_type i = g_space_dim; i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    if (seq_i.is_universe())
+      continue;
+    assign_r(g_coord.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    assign_r(g_coord.get_den(), g_divisor, ROUND_NOT_NEEDED);
+    g_coord.canonicalize();
+    // Check lower bound.
+    if (!seq_i.lower_is_unbounded()) {
+      assign_r(bound, seq_i.lower(), ROUND_NOT_NEEDED);
+      if (g_coord <= bound) {
+	if (seq_i.lower_is_open()) {
+	  if (g.is_point() || g_coord != bound)
+	    return Poly_Gen_Relation::nothing();
+	}
+	else if (g_coord != bound)
+	  return Poly_Gen_Relation::nothing();
+      }
+    }
+    // Check upper bound.
+    if (!seq_i.upper_is_unbounded()) {
+      assign_r(bound, seq_i.upper(), ROUND_NOT_NEEDED);
+      if (g_coord >= bound) {
+	if (seq_i.upper_is_open()) {
+	  if (g.is_point() || g_coord != bound)
+	    return Poly_Gen_Relation::nothing();
+	}
+	else if (g_coord != bound)
+	  return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+  return Poly_Gen_Relation::subsumes();
+}
+
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+				  ? "maximize(e, ...)"
+				  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim Box first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  // For an empty Box we simply return false.
+  if (is_empty())
+    return false;
+
+  DIRTY_TEMP0(mpq_class, result);
+  assign_r(result, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  bool is_included = true;
+  const int maximize_sign = maximize ? 1 : -1;
+  DIRTY_TEMP0(mpq_class, bound_i);
+  DIRTY_TEMP0(mpq_class, expr_i);
+  for (dimension_type i = expr_space_dim; i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    assign_r(expr_i, expr.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    switch (sgn(expr_i) * maximize_sign) {
+    case 1:
+      if (seq_i.upper_is_unbounded())
+	return false;
+      assign_r(bound_i, seq_i.upper(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.upper_is_open())
+	is_included = false;
+      break;
+    case 0:
+      // Nothing to do.
+      break;
+    case -1:
+      if (seq_i.lower_is_unbounded())
+	return false;
+      assign_r(bound_i, seq_i.lower(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.lower_is_open())
+	is_included = false;
+      break;
+    }
+  }
+  // Extract output info.
+  assert(is_canonical(result));
+  ext_n = result.get_num();
+  ext_d = result.get_den();
+  included = is_included;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included,
+                  Generator& g) const {
+  if (!max_min(expr, maximize, ext_n, ext_d, included))
+    return false;
+
+  // Compute generator `g'.
+  Linear_Expression g_expr;
+  DIRTY_TEMP(Coefficient, g_divisor);
+  g_divisor = 1;
+  const int maximize_sign = maximize ? 1 : -1;
+  DIRTY_TEMP0(mpq_class, g_coord);
+  DIRTY_TEMP(Coefficient, num);
+  DIRTY_TEMP(Coefficient, den);
+  DIRTY_TEMP(Coefficient, lcm);
+  DIRTY_TEMP(Coefficient, factor);
+  for (dimension_type i = space_dimension(); i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    switch (sgn(expr.coefficient(Variable(i))) * maximize_sign) {
+    case 1:
+      assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+      break;
+    case 0:
+      // If 0 belongs to the interval, choose it
+      // (and directly proceed to the next iteration).
+      // FIXME: name qualification issue.
+      if (seq_i.contains(0))
+	continue;
+      if (!seq_i.lower_is_unbounded())
+	if (seq_i.lower_is_open())
+	  if (!seq_i.upper_is_unbounded())
+	    if (seq_i.upper_is_open()) {
+	      // Bounded and open interval: compute middle point.
+	      assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+	      DIRTY_TEMP0(mpq_class, q_seq_i_upper);
+	      assign_r(q_seq_i_upper, seq_i.upper(), ROUND_NOT_NEEDED);
+	      g_coord += q_seq_i_upper;
+	      g_coord /= 2;
+	    }
+	    else
+	      // The upper bound is in the interval.
+	      assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+	  else {
+	    // Lower is open, upper is unbounded.
+	    assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+	    ++g_coord;
+	  }
+	else
+	  // The lower bound is in the interval.
+	  assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      else {
+	// Lower is unbounded, hence upper is bounded
+	// (since we know that 0 does not belong to the interval).
+	assert(!seq_i.upper_is_unbounded());
+	assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+	if (seq_i.upper_is_open())
+	  --g_coord;
+      }
+      break;
+    case -1:
+      assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      break;
+    }
+    // Add g_coord * Variable(i) to the generator.
+    assign_r(den, g_coord.get_den(), ROUND_NOT_NEEDED);
+    lcm_assign(lcm, g_divisor, den);
+    exact_div_assign(factor, lcm, g_divisor);
+    g_expr *= factor;
+    exact_div_assign(factor, lcm, den);
+    assign_r(num, g_coord.get_num(), ROUND_NOT_NEEDED);
+    num *= factor;
+    g_expr += num * Variable(i);
+    g_divisor = lcm;
+  }
+  g = Generator::point(g_expr, g_divisor);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("contains(y)", y);
+
+  // If `y' is empty, then `x' contains `y'.
+  if (y.is_empty())
+    return true;
+
+  // If `x' is empty, then `x' cannot contain `y'.
+  if (x.is_empty())
+    return false;
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (!x.seq[k].contains(y.seq[k]))
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_disjoint_from(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If any of `x' or `y' is marked empty, then they are disjoint.
+  // Note: no need to use `is_empty', as the following loop is anyway correct.
+  if (x.marked_empty() || y.marked_empty())
+    return true;
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (x.seq[k].is_disjoint_from(y.seq[k]))
+      return true;
+  return false;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::OK() const {
+  if (status.test_empty_up_to_date() && !status.test_empty()) {
+    Box tmp = *this;
+    tmp.reset_empty_up_to_date();
+    if (tmp.check_empty()) {
+#ifndef NDEBUG
+      std::cerr << "The box is empty, but it is marked as non-empty."
+		<< std::endl;
+#endif // NDEBUG
+      return false;
+    }
+  }
+
+  // A box that is not marked empty must have meaningful intervals.
+  if (!marked_empty()) {
+    for (dimension_type k = seq.size(); k-- > 0; )
+      if (!seq[k].OK())
+	return false;
+  }
+
+  return true;
+}
+
+template <typename ITV>
+dimension_type
+Box<ITV>::affine_dimension() const {
+  dimension_type d = space_dimension();
+  // A zero-space-dim box always has affine dimension zero.
+  if (d == 0)
+    return 0;
+
+  // An empty box has affine dimension zero.
+  if (is_empty())
+    return 0;
+
+  for (dimension_type k = d; k-- > 0; )
+    if (seq[k].is_singleton())
+      --d;
+
+  return d;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::check_empty() const {
+  assert(!marked_empty());
+  Box<ITV>& x = const_cast<Box<ITV>&>(*this);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (seq[k].is_empty()) {
+      x.set_empty();
+      return true;
+    }
+  x.set_nonempty();;
+  return false;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_universe() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_universe())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_topologically_closed() const {
+  if (!ITV::info_type::store_open || is_empty())
+    return true;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_topologically_closed())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_discrete() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_singleton())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_bounded() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (seq[k].is_unbounded())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains_integer_point() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].contains_integer_point())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::constrains(Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  if (marked_empty() || !seq[var_space_dim-1].is_universe())
+    return true;
+  // Now force an emptiness check.
+  return is_empty();
+}
+
+template <typename ITV>
+void
+Box<ITV>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a box in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for each of the variables in
+  // `to_be_unconstrained' before cylindrification.
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) {
+    ITV& seq_tbu = seq[*tbu];
+    if (!seq_tbu.is_empty())
+      seq_tbu.assign(UNIVERSE);
+    else {
+      set_empty();
+      break;
+    }
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::topological_closure_assign() {
+  if (!ITV::info_type::store_open || is_empty())
+    return;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    seq[k].topological_closure_assign();
+}
+
+template <typename ITV>
+void
+Box<ITV>::intersection_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two boxes is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both boxes are zero-dimensional, then at this point they are
+  // necessarily non-empty, so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // FIXME: here we may conditionally exploit a capability of the
+  // underlying interval to eagerly detect empty results.
+  reset_empty_up_to_date();
+
+  for (dimension_type k = space_dim; k-- > 0; )
+    x.seq[k].intersect_assign(y.seq[k]);
+
+  assert(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::box_hull_assign(const Box& y) {
+  Box& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("box_hull_assign(y)", y);
+
+  // The hull of a box with an empty box is equal to the first box.
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty()) {
+    x = y;
+    return;
+  }
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    x.seq[k].join_assign(y.seq[k]);
+
+  assert(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::concatenate_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is marked empty, the result will be empty too.
+  if (y.marked_empty())
+    x.set_empty();
+
+  // If `y' is a 0-dim space box, there is nothing left to do.
+  if (y_space_dim == 0)
+    return;
+
+  // Here `y_space_dim > 0', so that a non-trivial concatenation will occur:
+  // make sure that reallocation will occur once at most.
+  x.seq.reserve(x_space_dim + y_space_dim);
+
+  // If `x' is marked empty, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x.marked_empty()) {
+    x.seq.insert(x.seq.end(), y_space_dim, ITV());
+    assert(x.OK());
+    return;
+  }
+
+  // Here neither `x' nor `y' are marked empty: concatenate them.
+  std::copy(y.seq.begin(), y.seq.end(),
+	    std::back_insert_iterator<Sequence>(x.seq));
+  // Update the `empty_up_to_date' flag.
+  if (!y.status.test_empty_up_to_date())
+    reset_empty_up_to_date();
+
+  assert(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::box_difference_assign(const Box& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("box_difference_assign(y)", y);
+
+  Box& x = *this;
+  if (x.is_empty() || y.is_empty())
+    return;
+
+  // If `x' is zero-dimensional, then at this point both `x' and `y'
+  // are the universe box, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  dimension_type index_non_contained = space_dim;
+  dimension_type number_non_contained = 0;
+  for (dimension_type i = space_dim; i-- > 0; )
+    if (!y.seq[i].contains(x.seq[i])) {
+      if (++number_non_contained == 1)
+	index_non_contained = i;
+      else
+	break;
+    }
+
+  switch (number_non_contained) {
+  case 0:
+    // `y' covers `x': the difference is empty.
+    x.set_empty();
+    break;
+  case 1:
+    x.seq[index_non_contained].difference_assign(y.seq[index_non_contained]);
+    break;
+  default:
+    // Nothing to do: the difference is `x'.
+    break;
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+bool
+Box<ITV>::simplify_using_context_assign(const Box& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::time_elapse_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("time_elapse_assign(y)", y);
+
+  // Dealing with the zero-dimensional case.
+  if (x_space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  // Note: if possible, avoid cost of checking for emptiness.
+  if (x.marked_empty() || y.marked_empty()
+      || x.is_empty() || y.is_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    ITV& x_seq_i = x.seq[i];
+    const ITV& y_seq_i = y.seq[i];
+    if (!x_seq_i.lower_is_unbounded())
+      if (y_seq_i.lower_is_unbounded() || y_seq_i.lower() < 0)
+	x_seq_i.lower_set(UNBOUNDED);
+    if (!x_seq_i.upper_is_unbounded())
+      if (y_seq_i.upper_is_unbounded() || y_seq_i.upper() > 0)
+	x_seq_i.upper_set(UNBOUNDED);
+  }
+  assert(x.OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a box in a zero-dimensional space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
+
+  const dimension_type old_space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  const dimension_type tbr_space_dim = to_be_removed.space_dimension();
+  if (old_space_dim < tbr_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)",
+				 tbr_space_dim);
+
+  const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
+
+  // If the box is empty (this must be detected), then resizing is all
+  // what is needed.  If it is not empty and we are removing _all_ the
+  // dimensions then, again, resizing suffices.
+  if (is_empty() || new_space_dim == 0) {
+    seq.resize(new_space_dim);
+    assert(OK());
+    return;
+  }
+
+  // For each variable to be removed, we fill the corresponding interval
+  // by shifting left those intervals that will not be removed.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst = *tbr;
+  dimension_type src = dst + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    const dimension_type tbr_next = *tbr;
+    // All intervals in between are moved to the left.
+    while (src < tbr_next)
+      seq[dst++].swap(seq[src++]);
+    ++src;
+  }
+  // Moving the remaining intervals.
+  while (src < old_space_dim)
+    seq[dst++].swap(seq[src++]);
+
+  assert(dst == new_space_dim);
+  seq.resize(new_space_dim);
+
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::remove_higher_space_dimensions(const dimension_type new_dim) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  const dimension_type old_dim = space_dimension();
+  if (new_dim > old_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dim);
+
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space box.
+  if (new_dim == old_dim) {
+    assert(OK());
+    return;
+  }
+
+  seq.erase(seq.begin() + new_dim, seq.end());
+  assert(OK());
+}
+
+template <typename ITV>
+template <typename Partial_Function>
+void
+Box<ITV>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the box becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If the box is empty, then simply adjust the space dimension.
+  if (is_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // We create a new Box with the new space dimension.
+  Box<ITV> tmp(new_space_dim);
+  // Map the intervals, exchanging the indexes.
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i, new_i))
+      seq[i].swap(tmp.seq[new_i]);
+  }
+  swap(tmp);
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                const Variable var) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the box.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
+    return;
+
+  // All variables in `to_be_folded' should be dimensions of the box.
+  if (to_be_folded.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, ...)",
+				 to_be_folded.space_dimension());
+
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
+    throw_generic("fold_space_dimensions(tbf, v)",
+		  "v should not occur in tbf");
+
+  // Note: the check for emptiness is needed for correctness.
+  if (!is_empty()) {
+    // Join the interval corresponding to variable `var' with the intervals
+    // corresponding to the variables in `to_be_folded'.
+    ITV& seq_v = seq[var.id()];
+    for (Variables_Set::const_iterator i = to_be_folded.begin(),
+	   tbf_end = to_be_folded.end(); i != tbf_end; ++i)
+      seq_v.join_assign(seq[*i]);
+  }
+  remove_space_dimensions(to_be_folded);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraint_no_check(const Constraint& c) {
+  assert(!marked_empty());
+
+  const dimension_type c_space_dim = c.space_dimension();
+  assert(c_space_dim <= space_dimension());
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+  // Constraints that are not interval constraints are ignored.
+  if (!extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var))
+    return;
+
+  if (c_num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+	|| c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
+
+  assert(c_num_vars == 1);
+  const Coefficient& d = c.coefficient(Variable(c_only_var));
+  const Coefficient& n = c.inhomogeneous_term();
+  // The constraint `c' is of the form
+  // `Variable(c_only_var-1) + n / d rel 0', where
+  // `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining intervals, this is
+  // (morally) turned into `Variable(c_only_var-1) rel -n/d'.
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `n/d' into `-n/d'.
+  q = -q;
+
+  ITV& seq_c = seq[c_only_var];
+  const Constraint::Type c_type = c.type();
+  switch (c_type) {
+  case Constraint::EQUALITY:
+    seq_c.refine_existential(EQUAL, q);
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    seq_c.refine_existential((d > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL, q);
+    // FIXME: this assertion fails due to a bug in refine.
+    assert(seq_c.OK());
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    seq_c.refine_existential((d > 0) ? GREATER_THAN : LESS_THAN, q);
+    break;
+  }
+  // FIXME: do check the value returned by `refine' and
+  // set `empty' and `empty_up_to_date' as appropriate.
+  reset_empty_up_to_date();
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraints_no_check(const Constraint_System& cs) {
+  assert(cs.space_dimension() <= space_dimension());
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    add_constraint_no_check(*i);
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruence_no_check(const Congruence& cg) {
+  assert(!marked_empty());
+
+  const dimension_type cg_space_dim = cg.space_dimension();
+  assert(cg_space_dim <= space_dimension());
+
+  // Only equality congruences can be intervals.
+  if (!cg.is_equality())
+    return;
+
+  dimension_type cg_num_vars = 0;
+  dimension_type cg_only_var = 0;
+  // Congruences that are not interval congruences are ignored.
+  if (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var))
+    return;
+
+  if (cg_num_vars == 0) {
+    // Dealing with a trivial congruence.
+    if (cg.inhomogeneous_term() != 0)
+      set_empty();
+    return;
+  }
+
+  assert(cg_num_vars == 1);
+  const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+  const Coefficient& n = cg.inhomogeneous_term();
+  // The congruence `cg' is of the form
+  // `Variable(cg_only_var-1) + n / d rel 0', where
+  // `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining intervals, this is
+  // (morally) turned into `Variable(cg_only_var-1) rel -n/d'.
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `n/d' into `-n/d'.
+  q = -q;
+
+  ITV& seq_c = seq[cg_only_var];
+  seq_c.refine_existential(EQUAL, q);
+  // FIXME: do check the value returned by `refine' and
+  // set `empty' and `empty_up_to_date' as appropriate.
+  reset_empty_up_to_date();
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruences_no_check(const Congruence_System& cgs) {
+  assert(cgs.space_dimension() <= space_dimension());
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    add_congruence_no_check(*i);
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence& cg) {
+  assert(!marked_empty());
+
+  const dimension_type cg_space_dim = cg.space_dimension();
+  assert(cg_space_dim <= space_dimension());
+
+  // Only equality congruences can be intervals.
+  if (!cg.is_equality())
+    return;
+
+  dimension_type cg_num_vars = 0;
+  dimension_type cg_only_var = 0;
+  // Congruences that are not interval congruences are ignored.
+  if (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var))
+    return;
+
+  if (cg_num_vars == 0) {
+    // Dealing with a trivial congruence.
+    if (cg.inhomogeneous_term() != 0)
+      set_empty();
+    return;
+  }
+
+  assert(cg_num_vars == 1);
+  const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+  const Coefficient& n = cg.inhomogeneous_term();
+  // The congruence `cg' is of the form
+  // `Variable(cg_only_var-1) + n / d rel 0', where
+  // `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining intervals, this is
+  // (morally) turned into `Variable(cg_only_var-1) rel -n/d'.
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `n/d' into `-n/d'.
+  q = -q;
+
+  ITV& seq_c = seq[cg_only_var];
+  seq_c.refine_existential(EQUAL, q);
+  // FIXME: do check the value returned by `refine' and
+  // set `empty' and `empty_up_to_date' as appropriate.
+  reset_empty_up_to_date();
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence_System& cgs) {
+  assert(cgs.space_dimension() <= space_dimension());
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+  assert(OK());
+}
+
+#if 1
+namespace {
+
+inline bool
+refine_no_check_check_result(Result r, Ternary& open) {
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_POS_OVERFLOW:
+  case V_UNKNOWN_NEG_OVERFLOW:
+  case V_UNKNOWN_POS_OVERFLOW:
+    return true;
+  case V_LT:
+  case V_GT:
+    open = T_YES;
+    return false;
+  case V_LE:
+  case V_GE:
+    if (open == T_NO)
+      open = T_MAYBE;
+    return false;
+  case V_EQ:
+    return false;
+  default:
+    assert(false);
+    return true;
+  }
+}
+
+} // namespace
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+  assert(c.space_dimension() <= space_dimension());
+
+  typedef
+    typename Select_Temp_Boundary_Type<typename ITV::boundary_type>::type
+    Temp_Boundary_Type;
+
+  dimension_type c_space_dim = c.space_dimension();
+  Constraint::Type c_type = c.type();
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+  Result r;
+  Temp_Boundary_Type t_bound;
+  Temp_Boundary_Type t_a;
+  Temp_Boundary_Type t_x;
+  Ternary open;
+  for (dimension_type k = c_space_dim; k-- > 0; ) {
+    const Coefficient& a_k = c.coefficient(Variable(k));
+    int sgn_a_k = sgn(a_k);
+    if (sgn_a_k == 0)
+      continue;
+    if (sgn_a_k > 0) {
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+	maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.lower_is_unbounded())
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.upper_is_unbounded())
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+
+      // Refine the lower bound of `seq[k]' with `t_bound'.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].lower_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    maybe_refine_upper_1:
+      if (c_type != Constraint::EQUALITY)
+	continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.upper_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.lower_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].upper_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    }
+    else {
+      assert(sgn_a_k < 0);
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+	maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.lower_is_unbounded())
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.upper_is_unbounded())
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].upper_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    maybe_refine_upper_2:
+      if (c_type != Constraint::EQUALITY)
+	continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.upper_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.lower_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+
+      // Refine the lower bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].lower_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    }
+  next_k:
+    ;
+  }
+}
+
+#else
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+  assert(c.space_dimension() <= space_dimension());
+
+  dimension_type c_space_dim = c.space_dimension();
+  ITV k[c_space_dim];
+  ITV p[c_space_dim];
+  for (dimension_type i = c_space_dim; i-- > 0; ) {
+    k[i] = c.coefficient(Variable(i));
+    ITV& p_i = p[i];
+    p_i = seq[i];
+    p_i.mul_assign(p_i, k[i]);
+  }
+  const Coefficient& inhomogeneous_term = c.inhomogeneous_term();
+  for (dimension_type i = c_space_dim; i-- > 0; ) {
+    int sgn_coefficient_i = sgn(c.coefficient(Variable(i)));
+    if (sgn_coefficient_i == 0)
+      continue;
+    ITV q(inhomogeneous_term);
+    for (dimension_type j = c_space_dim; j-- > 0; ) {
+      if (i == j)
+	continue;
+      q.add_assign(q, p[j]);
+    }
+    q.div_assign(q, k[i]);
+    q.neg_assign(q);
+    Relation_Symbol rel;
+    switch (c.type()) {
+    case Constraint::EQUALITY:
+      rel = EQUAL;
+      break;
+    case Constraint::NONSTRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_THAN : LESS_THAN;
+      break;
+    }
+    seq[i].refine_existential(rel, q);
+    // FIXME: could/should we exploit the return value of refine_existential,
+    //        in case it is available?
+    // FIMXE: should we instead be lazy and do not even bother about
+    //        the possibility the interval becomes empty apart from setting
+    //        empty_up_to_date = false?
+    if (seq[i].is_empty()) {
+      set_empty();
+      break;
+    }
+  }
+
+  assert(OK());
+}
+
+#endif
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint_System& cs) {
+  assert(cs.space_dimension() <= space_dimension());
+
+  bool changed;
+  do {
+    Sequence copy(seq);
+    for (Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i)
+      refine_no_check(*i);
+
+    // Check if the client has requested abandoning all expensive
+    // computations.  If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    changed = (copy != seq);
+  } while (changed);
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_image(const Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  Tmp_Interval_Type expr_value, temp0, temp1;
+  expr_value.assign(expr.inhomogeneous_term());
+  for (dimension_type i = expr_space_dim; i-- > 0; ) {
+    const Coefficient& coeff = expr.coefficient(Variable(i));
+    if (coeff != 0) {
+      temp0.assign(coeff);
+      temp1.assign(seq[i]);
+      temp0.mul_assign(temp0, temp1);
+      expr_value.add_assign(expr_value, temp0);
+    }
+  }
+  if (denominator != 1) {
+    temp0.assign(denominator);
+    expr_value.div_assign(expr_value, temp0);
+  }
+  seq[var.id()].assign(expr_value);
+
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_preimage(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference
+                          denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type x_space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (x_space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x_space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  const Coefficient& expr_v = expr.coefficient(var);
+  const bool invertible = (expr_v != 0);
+  if (!invertible) {
+    Tmp_Interval_Type expr_value, temp0, temp1;
+    expr_value.assign(expr.inhomogeneous_term());
+    for (dimension_type i = expr_space_dim; i-- > 0; ) {
+      const Coefficient& coeff = expr.coefficient(Variable(i));
+      if (coeff != 0) {
+	temp0.assign(coeff);
+	temp1.assign(seq[i]);
+	temp0.mul_assign(temp0, temp1);
+	expr_value.add_assign(expr_value, temp0);
+      }
+    }
+    if (denominator != 1) {
+      temp0.assign(denominator);
+      expr_value.div_assign(expr_value, temp0);
+    }
+    ITV& x_seq_v = seq[var.id()];
+    expr_value.intersect_assign(x_seq_v);
+    if (expr_value.is_empty())
+      set_empty();
+    else
+      x_seq_v.assign(UNIVERSE);
+  }
+  else {
+    // The affine transformation is invertible.
+    // CHECKME: for efficiency, would it be meaningful to avoid
+    // the computation of inverse by partially evaluating the call
+    // to affine_image?
+    Linear_Expression inverse;
+    inverse -= expr;
+    inverse += (expr_v + denominator) * var;
+    affine_image(var, inverse, expr_v);
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+				 "ub", ub_expr);
+    // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
+
+  // Add the constraint implied by the `lb_expr' and `ub_expr'.
+  if (denominator > 0)
+    add_constraint(lb_expr <= ub_expr);
+  else
+    add_constraint(lb_expr >= ub_expr);
+
+  // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+  if (lb_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `ub_expr'.
+    generalized_affine_image(var,
+			     LESS_OR_EQUAL,
+			     ub_expr,
+			     denominator);
+    if (denominator > 0)
+      add_constraint(lb_expr <= denominator*var);
+    else
+      add_constraint(denominator*var <= lb_expr);
+  }
+  else if (ub_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `lb_expr'.
+    generalized_affine_image(var,
+			     GREATER_OR_EQUAL,
+			     lb_expr,
+			     denominator);
+    if (denominator > 0)
+      add_constraint(denominator*var <= ub_expr);
+    else
+      add_constraint(ub_expr <= denominator*var);
+  }
+  else {
+    // Here `var' occurs in both `lb_expr' and `ub_expr'.  As boxes
+    // can only use the non-relational constraints, we find the
+    // maximum/minimum values `ub_expr' and `lb_expr' obtain with the
+    // box and use these instead of the `ub-expr' and `lb-expr'.
+    DIRTY_TEMP(Coefficient, max_num);
+    DIRTY_TEMP(Coefficient, max_den);
+    bool max_included;
+    DIRTY_TEMP(Coefficient, min_num);
+    DIRTY_TEMP(Coefficient, min_den);
+    bool min_included;
+    ITV& seq_v = seq[var.id()];
+    if (maximize(ub_expr, max_num, max_den, max_included)) {
+      if (minimize(lb_expr, min_num, min_den, min_included)) {
+	// The `ub_expr' has a maximum value and the `lb_expr'
+	// has a minimum value for the box.
+	// Set the bounds for `var' using the minimum for `lb_expr'.
+	min_den *= denominator;
+	DIRTY_TEMP0(mpq_class, q);
+	assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	(denominator > 0)
+	  ? seq_v.lower_set(q, !min_included)
+	  : seq_v.upper_set(q, !min_included);
+	// Now make the maximum of lb_expr the upper bound.  If the
+	// maximum is not at a box point, then inequality is strict.
+	max_den *= denominator;
+	assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	(denominator > 0)
+	  ? seq_v.upper_set(q, !max_included)
+	  : seq_v.lower_set(q, !max_included);
+      }
+      else {
+	// The `ub_expr' has a maximum value but the `lb_expr'
+	// has no minimum value for the box.
+	// Set the bounds for `var' using the maximum for `lb_expr'.
+	DIRTY_TEMP0(mpq_class, q);
+	max_den *= denominator;
+	assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	if (denominator > 0) {
+	  seq_v.lower_set(UNBOUNDED);
+	  seq_v.upper_set(q, !max_included);
+	}
+	else {
+	  seq_v.upper_set(UNBOUNDED);
+	  seq_v.lower_set(q, !max_included);
+	}
+      }
+    }
+    else if (minimize(lb_expr, min_num, min_den, min_included)) {
+	// The `ub_expr' has no maximum value but the `lb_expr'
+	// has a minimum value for the box.
+	// Set the bounds for `var' using the minimum for `lb_expr'.
+	min_den *= denominator;
+	DIRTY_TEMP0(mpq_class, q);
+	assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	if (denominator > 0) {
+	  seq_v.upper_set(UNBOUNDED);
+	  seq_v.lower_set(q, !min_included);
+	}
+	else {
+	  seq_v.lower_set(UNBOUNDED);
+	  seq_v.upper_set(q, !min_included);
+	}
+    }
+    else {
+      // The `ub_expr' has no maximum value and the `lb_expr'
+      // has no minimum value for the box.
+      // So we set the bounds to be unbounded.
+      seq_v.upper_set(UNBOUNDED);
+      seq_v.lower_set(UNBOUNDED);
+    }
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  const dimension_type space_dim = space_dimension();
+  if (denominator == 0)
+    throw_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+				 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  const bool negative_denom = (denominator < 0);
+  const Coefficient& lb_var_coeff = lb_expr.coefficient(var);
+  const Coefficient& ub_var_coeff = ub_expr.coefficient(var);
+
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // independent of `var', then impose it now.
+  if (lb_var_coeff == ub_var_coeff) {
+    if (negative_denom)
+      add_constraint(lb_expr >= ub_expr);
+    else
+      add_constraint(lb_expr <= ub_expr);
+  }
+
+  ITV& seq_var = seq[var.id()];
+  if (!seq_var.is_universe()) {
+    // We want to work with a positive denominator,
+    // so the sign and its (unsigned) value are separated.
+    TEMP_INTEGER(pos_denominator);
+    pos_denominator = denominator;
+    if (negative_denom)
+      neg_assign(pos_denominator, pos_denominator);
+    // Store all the information about the upper and lower bounds
+    // for `var' before making this interval unbounded.
+    bool open_lower = seq_var.lower_is_open();
+    bool unbounded_lower = seq_var.lower_is_unbounded();
+    DIRTY_TEMP0(mpq_class, q_seq_var_lower);
+    DIRTY_TEMP(Coefficient, num_lower);
+    DIRTY_TEMP(Coefficient, den_lower);
+    if (!unbounded_lower) {
+      assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED);
+      assign_r(num_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED);
+      assign_r(den_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(den_lower, den_lower);
+      num_lower *= pos_denominator;
+      seq_var.lower_set(UNBOUNDED);
+    }
+    bool open_upper = seq_var.upper_is_open();
+    bool unbounded_upper = seq_var.upper_is_unbounded();
+    DIRTY_TEMP0(mpq_class, q_seq_var_upper);
+    DIRTY_TEMP(Coefficient, num_upper);
+    DIRTY_TEMP(Coefficient, den_upper);
+    if (!unbounded_upper) {
+      assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED);
+      assign_r(num_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED);
+      assign_r(den_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(den_upper, den_upper);
+      num_upper *= pos_denominator;
+      seq_var.upper_set(UNBOUNDED);
+    }
+
+    if (!unbounded_lower) {
+      // `lb_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the lower bound for `var',
+      // and adding the lower bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_lb_expr(ub_expr);
+      revised_lb_expr -= ub_var_coeff * var;
+      DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, den_lower);
+      revised_lb_expr *= d;
+      revised_lb_expr += num_lower;
+
+      // Find the minimum value for the revised lower bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      DIRTY_TEMP(Coefficient, den);
+      if (minimize(revised_lb_expr, num_lower, den, included)) {
+        den_lower *= (den * ub_var_coeff);
+        DIRTY_TEMP0(mpq_class, q);
+        assign_r(q.get_num(), num_lower, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), den_lower, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        open_lower |= !included;
+        if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom)
+          seq_var.lower_narrow(q, open_lower);
+        else
+          seq_var.upper_narrow(q, open_lower);
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+
+    if (!unbounded_upper) {
+      // `ub_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the upper bound for `var',
+      // and adding the upper bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_ub_expr(lb_expr);
+      revised_ub_expr -= lb_var_coeff * var;
+      DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, den_upper);
+      revised_ub_expr *= d;
+      revised_ub_expr += num_upper;
+
+      // Find the maximum value for the revised upper bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      DIRTY_TEMP(Coefficient, den);
+      if (maximize(revised_ub_expr, num_upper, den, included)) {
+        den_upper *= (den * lb_var_coeff);
+        DIRTY_TEMP0(mpq_class, q);
+        assign_r(q.get_num(), num_upper, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), den_upper, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        open_upper |= !included;
+        if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom)
+          seq_var.upper_narrow(q, open_upper);
+        else
+          seq_var.lower_narrow(q, open_upper);
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+  }
+
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // dependent on `var', then impose on the new box.
+  if (lb_var_coeff != ub_var_coeff) {
+    if (denominator > 0)
+      add_constraint(lb_expr <= ub_expr);
+    else
+      add_constraint(lb_expr >= ub_expr);
+  }
+
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "v", var);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+		  "r is the disequality relation symbol");
+
+  // First compute the affine image.
+  affine_image(var, expr, denominator);
+
+  if (relsym == EQUAL)
+    // The affine relation is indeed an affine function.
+    return;
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
+
+  ITV& seq_var = seq[var.id()];
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    seq_var.lower_set(UNBOUNDED);
+    break;
+  case LESS_THAN:
+    seq_var.lower_set(UNBOUNDED);
+    if (!seq_var.upper_is_unbounded())
+      seq_var.refine_existential(LESS_THAN, seq_var.upper());
+    break;
+  case GREATER_OR_EQUAL:
+    seq_var.upper_set(UNBOUNDED);
+    break;
+  case GREATER_THAN:
+    seq_var.upper_set(UNBOUNDED);
+    if (!seq_var.lower_is_unbounded())
+      seq_var.refine_existential(GREATER_THAN, seq_var.lower());
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    throw std::runtime_error("PPL internal error");
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator)
+{
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+			   "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "v", var);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                  "r is the disequality relation symbol");
+
+  // Check whether the affine relation is indeed an affine function.
+  if (relsym == EQUAL) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Compute the reversed relation symbol to simplify later coding.
+  Relation_Symbol reversed_relsym;
+  switch (relsym) {
+  case LESS_THAN:
+    reversed_relsym = GREATER_THAN;
+    break;
+  case LESS_OR_EQUAL:
+    reversed_relsym = GREATER_OR_EQUAL;
+    break;
+  case GREATER_OR_EQUAL:
+    reversed_relsym = LESS_OR_EQUAL;
+    break;
+  case GREATER_THAN:
+    reversed_relsym = LESS_THAN;
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    throw std::runtime_error("PPL internal error");
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_coefficient != 0) {
+    Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    TEMP_INTEGER(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
+    Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denominator))
+      ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse_expr,
+			     inverse_denominator);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the box by adding the constraint induced
+  // by the affine relation.
+  // First, compute the maximum and minimum value reached by
+  // `denominator*var' on the box as we need to use non-relational
+  // expressions.
+  DIRTY_TEMP(Coefficient, max_num);
+  DIRTY_TEMP(Coefficient, max_den);
+  bool max_included;
+  bool bound_above = maximize(denominator*var, max_num, max_den, max_included);
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  bool bound_below = minimize(denominator*var, min_num, min_den, min_included);
+  // Use the correct relation symbol
+  const Relation_Symbol corrected_relsym
+    = (denominator > 0) ? relsym : reversed_relsym;
+  // Revise the expression to take into account the denominator of the
+  // maximum/minimim value for `var'.
+  DIRTY_TEMP(Linear_Expression, revised_expr);
+  dimension_type dim = space_dim;
+  TEMP_INTEGER(d);
+  if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) {
+    if (bound_below) {
+      for ( ; dim > 0; dim--) {
+        d = min_den * expr.coefficient(Variable(dim - 1));
+        revised_expr
+          += d * Variable(dim - 1);
+      }
+    }
+  }
+  else {
+    if (bound_above) {
+      for ( ; dim > 0; dim--) {
+        d = max_den * expr.coefficient(Variable(dim - 1));
+        revised_expr
+          += d * Variable(dim - 1);
+      }
+    }
+  }
+
+  switch (corrected_relsym) {
+  case LESS_THAN:
+    if (bound_below)
+      add_constraint(min_num < revised_expr);
+    break;
+  case LESS_OR_EQUAL:
+    if (bound_below)
+      (min_included)
+        ? add_constraint(min_num <= revised_expr)
+        : add_constraint(min_num < revised_expr);
+    break;
+  case GREATER_OR_EQUAL:
+    if (bound_above)
+      (max_included)
+        ? add_constraint(max_num >= revised_expr)
+        : add_constraint(max_num > revised_expr);
+    break;
+  case GREATER_THAN:
+    if (bound_above)
+      add_constraint(max_num > revised_expr);
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    throw std::runtime_error("PPL internal error");
+  }
+  // If the shrunk box is empty, its preimage is empty too.
+  if (is_empty())
+    return;
+  ITV& seq_v = seq[var.id()];
+  seq_v.lower_set(UNBOUNDED);
+  seq_v.upper_set(UNBOUNDED);
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is the disequality relation symbol");
+
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the maximum and minimum value reached by the rhs on the box.
+  DIRTY_TEMP(Coefficient, max_num);
+  DIRTY_TEMP(Coefficient, max_den);
+  bool max_included;
+  bool max_rhs = maximize(rhs, max_num, max_den, max_included);
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  bool min_rhs = minimize(rhs, min_num, min_den, min_included);
+
+  // Check whether there is 0, 1 or more thna one variable in the lhs
+  // and record the variable with the highest dimension; set the box
+  // intervals to be unbounded for all other dimensions with non-zero
+  // coefficients in the lhs.
+  bool has_var = false;
+  bool has_more_than_one_var = false;
+  // Initialization is just to avoid an annoying warning.
+  dimension_type has_var_id = 0;
+  for ( ; lhs_space_dim > 0; --lhs_space_dim)
+    if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0) {
+      if (has_var) {
+        ITV& seq_i = seq[lhs_space_dim - 1];
+        seq_i.lower_set(UNBOUNDED);
+        seq_i.upper_set(UNBOUNDED);
+        has_more_than_one_var = true;
+      }
+      else {
+        has_var = true;
+        has_var_id = lhs_space_dim - 1;
+      }
+    }
+
+  if (has_more_than_one_var) {
+    // There is more than one dimension with non-zero coefficient, so
+    // we cannot have any information about the dimensions in the lhs.
+    // Since all but the highest dimension with non-zero coefficient
+    // in the lhs have been set unbounded, it remains to set the
+    // highest dimension in the lhs unbounded.
+    ITV& seq_var = seq[has_var_id];
+    seq_var.lower_set(UNBOUNDED);
+    seq_var.upper_set(UNBOUNDED);
+    assert(OK());
+    return;
+  }
+
+  if (has_var) {
+    // There is exactly one dimension with non-zero coefficient.
+    ITV& seq_var = seq[has_var_id];
+
+    // Compute the new bounds for this dimension defined by the rhs
+    // expression.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    const Coefficient& coeff = lhs.coefficient(Variable(has_var_id));
+    DIRTY_TEMP0(mpq_class, q_max);
+    DIRTY_TEMP0(mpq_class, q_min);
+    if (max_rhs) {
+      max_num -= inhomo * max_den;
+      max_den *= coeff;
+      assign_r(q_max.get_num(), max_num, ROUND_NOT_NEEDED);
+      assign_r(q_max.get_den(), max_den, ROUND_NOT_NEEDED);
+      q_max.canonicalize();
+    }
+    if (min_rhs) {
+      min_num -= inhomo * min_den;
+      min_den *= coeff;
+      assign_r(q_min.get_num(), min_num, ROUND_NOT_NEEDED);
+      assign_r(q_min.get_den(), min_den, ROUND_NOT_NEEDED);
+      q_min.canonicalize();
+    }
+
+    // The choice as to which bounds should be set depends on the sign
+    // of the coefficient of the dimension `has_var_id' in the lhs.
+    if (coeff > 0)
+      // The coefficient of the dimension in the lhs is +ve.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        seq_var.lower_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.upper_set(q_max, !max_included)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case LESS_THAN:
+        seq_var.lower_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.upper_set(q_max, true)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case EQUAL:
+        max_rhs
+          ? seq_var.upper_set(q_max, !max_included)
+          : seq_var.upper_set(UNBOUNDED);
+          min_rhs
+            ? seq_var.lower_set(q_min, !min_included)
+            : seq_var.lower_set(UNBOUNDED);
+          break;
+      case GREATER_OR_EQUAL:
+        seq_var.upper_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.lower_set(q_min, !min_included)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      case GREATER_THAN:
+        seq_var.upper_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.lower_set(q_min, true)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        throw std::runtime_error("PPL internal error");
+      }
+    else
+      // The coefficient of the dimension in the lhs is -ve.
+      switch (relsym) {
+      case GREATER_OR_EQUAL:
+        seq_var.lower_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.upper_set(q_min, !min_included)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case GREATER_THAN:
+        seq_var.lower_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.upper_set(q_min, true)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case EQUAL:
+        max_rhs
+          ? seq_var.lower_set(q_max, !max_included)
+          : seq_var.lower_set(UNBOUNDED);
+          min_rhs
+            ? seq_var.upper_set(q_min, !min_included)
+            : seq_var.upper_set(UNBOUNDED);
+          break;
+      case LESS_OR_EQUAL:
+        seq_var.upper_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.lower_set(q_max, !max_included)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      case LESS_THAN:
+        seq_var.upper_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.lower_set(q_max, true)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        throw std::runtime_error("PPL internal error");
+      }
+  }
+
+  else {
+    // The lhs is a constant value, so we just need to add the
+    // appropriate constraint.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    switch (relsym) {
+    case LESS_THAN:
+      add_constraint(inhomo < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      add_constraint(inhomo <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(inhomo == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      add_constraint(inhomo >= rhs);
+      break;
+    case GREATER_THAN:
+      add_constraint(inhomo > rhs);
+      break;
+    default:
+      // The NOT_EQUAL case has been already dealt with.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is the disequality relation symbol");
+
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
+
+  // For any dimension occurring in the lhs, swap and change the sign
+  // of this component for the rhs and lhs.  Then use these in a call
+  // to generalized_affine_image/3.
+  Linear_Expression revised_lhs = lhs;
+  Linear_Expression revised_rhs = rhs;
+  for (dimension_type d = lhs_space_dim; d-- > 0; ) {
+    const Variable& var = Variable(d);
+    if (lhs.coefficient(var) != 0) {
+      DIRTY_TEMP(Coefficient, temp);
+      temp = rhs.coefficient(var) + lhs.coefficient(var);
+      revised_rhs -= temp * var;
+      revised_lhs -= temp * var;
+    }
+  }
+  generalized_affine_image(revised_lhs, relsym, revised_rhs);
+  assert(OK());
+}
+
+template <typename ITV>
+template <typename Iterator>
+void
+Box<ITV>::CC76_widening_assign(const Box& y, Iterator first, Iterator last) {
+  if (y.is_empty())
+    return;
+
+  for (dimension_type i = seq.size(); i-- > 0; )
+    seq[i].CC76_widening_assign(y.seq[i], first, last);
+
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::CC76_widening_assign(const Box& y, unsigned* tp) {
+  static typename ITV::boundary_type stop_points[] = {
+    typename ITV::boundary_type(-2),
+    typename ITV::boundary_type(-1),
+    typename ITV::boundary_type(0),
+    typename ITV::boundary_type(1),
+    typename ITV::boundary_type(2)
+  };
+
+  Box& x = *this;
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Box<ITV> x_tmp(x);
+    x_tmp.CC76_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!x.contains(x_tmp))
+      --(*tp);
+    return;
+  }
+  x.CC76_widening_assign(y,
+			 stop_points,
+			 stop_points
+			 + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+template <typename ITV>
+void
+Box<ITV>::limited_CC76_extrapolation_assign(const Box& y,
+                                            const Constraint_System& cs,
+                                            unsigned* tp) {
+  // FIXME: should take into account cs.
+  used(cs);
+  Box& x = *this;
+  x.CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+void
+Box<ITV>::CC76_narrowing_assign(const Box& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const Box x_copy = *this;
+    const Box y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
+
+  // If both boxes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.is_empty())
+    return;
+  // If `*this' is empty, we return.
+  if (is_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& x_i = seq[i];
+    const ITV& y_i = y.seq[i];
+    if (!x_i.lower_is_unbounded()
+	&& !y_i.lower_is_unbounded()
+	&& x_i.lower() != y_i.lower())
+      x_i.lower() = y_i.lower();
+    if (!x_i.upper_is_unbounded()
+	&& !y_i.upper_is_unbounded()
+	&& x_i.upper() != y_i.upper())
+      x_i.upper() = y_i.upper();
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::constraints() const {
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      DIRTY_TEMP(Coefficient, n);
+      DIRTY_TEMP(Coefficient, d);
+      if (get_lower_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) >= n);
+	else
+	  cs.insert(d*Variable(k) > n);
+      }
+      if (get_upper_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) <= n);
+	else
+	  cs.insert(d*Variable(k) < n);
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::minimized_constraints() const {
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  // Make sure emptiness is detected.
+  else if (is_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      DIRTY_TEMP(Coefficient, n);
+      DIRTY_TEMP(Coefficient, d);
+      if (get_lower_bound(k, closed, n, d)) {
+	if (closed)
+	  // Make sure equality constraints are detected.
+	  if (seq[k].is_singleton()) {
+	    cs.insert(d*Variable(k) == n);
+	    continue;
+	  }
+	  else
+	    cs.insert(d*Variable(k) >= n);
+	else
+	  cs.insert(d*Variable(k) > n);
+      }
+      if (get_upper_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) <= n);
+	else
+	  cs.insert(d*Variable(k) < n);
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename ITV>
+Congruence_System
+Box<ITV>::congruences() const {
+  Congruence_System cgs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+  }
+  // Make sure emptiness is detected.
+  else if (is_empty())
+    cgs.insert((0*Variable(space_dim-1) %= -1) / 0);
+  else {
+    // KLUDGE: in the future `cgs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cgs.insert(0*Variable(space_dim-1) %= 0);
+
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      DIRTY_TEMP(Coefficient, n);
+      DIRTY_TEMP(Coefficient, d);
+      if (get_lower_bound(k, closed, n, d) && closed)
+	  // Make sure equality congruences are detected.
+	  if (seq[k].is_singleton())
+	    cgs.insert((d*Variable(k) %= n) / 0);
+    }
+  }
+  return cgs;
+}
+
+template <typename ITV>
+memory_size_type
+Box<ITV>::external_memory_in_bytes() const {
+  memory_size_type n = seq.capacity() * sizeof(ITV);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    n += seq[k].external_memory_in_bytes();
+  return n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Box<ITV>& box) {
+  if (box.is_empty())
+    s << "false";
+  else if (box.is_universe())
+    s << "true";
+  else
+    for (dimension_type k = 0,
+	   space_dim = box.space_dimension(); k < space_dim; ) {
+      s << Variable(k) << " in " << box[k];
+      ++k;
+      if (k < space_dim)
+	s << ", ";
+      else
+	break;
+    }
+  return s;
+}
+
+template <typename ITV>
+void
+Box<ITV>::ascii_dump(std::ostream& s) const {
+  const char separator = ' ';
+  status.ascii_dump(s);
+  const dimension_type space_dim = space_dimension();
+  s << "space_dim" << separator << space_dim;
+  s << "\n";
+  for (dimension_type i = 0; i < space_dim;  ++i)
+    seq[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(ITV, Box<ITV>)
+
+template <typename ITV>
+bool
+Box<ITV>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+
+  std::string str;
+  dimension_type space_dim;
+  if (!(s >> str) || str != "space_dim")
+    return false;
+  if (!(s >> space_dim))
+    return false;
+
+  seq.clear();
+  ITV seq_i;
+  for (dimension_type i = 0; i < space_dim;  ++i) {
+    if (seq_i.ascii_load(s))
+      seq.push_back(seq_i);
+    else
+      return false;
+  }
+
+  // Check invariants.
+  assert(OK());
+  return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Box& y) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << this->space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::throw_dimension_incompatible(const char* method,
+			       dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint_System& cs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cs->space_dimension == " << cs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence_System& cgs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cgs->space_dimension == " << cgs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_expression_too_complex(const char* method,
+                                       const Linear_Expression& e) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const char* name_row,
+                                       const Linear_Expression& e) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << e.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_generic(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_space_dimension_overflow(const char* method,
+                                         const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << reason;
+  throw std::length_error(s.str());
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+	  typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const Box<ITV>& x, const Box<ITV>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0, Temp& tmp1, Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim boxes are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires a check for emptiness.
+  (void) x.is_empty();
+  (void) y.is_empty();
+  // If one of two boxes is empty, then they are equal if and only if
+  // the other box is empty too.
+  if (x.marked_empty() || y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty()) {
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+      return true;
+    }
+    else
+      goto pinf;
+  }
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    const ITV& x_i = x.seq[i];
+    const ITV& y_i = y.seq[i];
+    // Dealing with the lower bounds.
+    if (x_i.lower_is_unbounded()) {
+      if (!y_i.lower_is_unbounded())
+	goto pinf;
+    }
+    else if (y_i.lower_is_unbounded())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.lower() > y_i.lower()) {
+	maybe_assign(tmp1p, tmp1, x_i.lower(), dir);
+	maybe_assign(tmp2p, tmp2, y_i.lower(), inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i.lower(), dir);
+	maybe_assign(tmp2p, tmp2, x_i.lower(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+    // Dealing with the lower bounds.
+    if (x_i.upper_is_unbounded())
+      if (y_i.upper_is_unbounded())
+	continue;
+      else
+	goto pinf;
+    else if (y_i.upper_is_unbounded())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.upper() > y_i.upper()) {
+	maybe_assign(tmp1p, tmp1, x_i.upper(), dir);
+	maybe_assign(tmp2p, tmp2, y_i.upper(), inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i.upper(), dir);
+	maybe_assign(tmp2p, tmp2, x_i.upper(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+
+ pinf:
+  assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_templates_hh)
diff --git a/src/Box.types.hh b/src/Box.types.hh
new file mode 100644
index 0000000..0bd47d1
--- /dev/null
+++ b/src/Box.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Box_types_hh
+#define PPL_Box_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+class Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_types_hh)
diff --git a/src/Box_Status.idefs.hh b/src/Box_Status.idefs.hh
new file mode 100644
index 0000000..980590d
--- /dev/null
+++ b/src/Box_Status.idefs.hh
@@ -0,0 +1,114 @@
+/* Box<ITV>::Status class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Box_Status_idefs_hh
+#define PPL_Box_Status_idefs_hh 1
+
+#ifndef PPL_IN_Box_CLASS
+#error "Do not include Box_Status.idefs.hh directly; use Box.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a Box<ITV> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>empty up-to-date</EM>: the empty flag is meaningful;
+  - <EM>empty</EM>: the box is the empty set.
+  - <EM>universe</EM>: the box is universe \f$n\f$-dimensional vector space
+     \f$\Rset^n\f$.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>empty up-to-date</EM> and <EM>empty</EM> excludes <EM>universe</EM>.
+*/
+class Status;
+
+class Status {
+public:
+  //! By default Status is the empty set of assertion.
+  Status();
+
+  //! Ordinary copy-constructor.
+  Status(const Status& y);
+
+  //! Copy-constructor from a box of different type.
+  template <typename Other_ITV>
+  Status(const typename Box<Other_ITV>::Status& y);
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_empty_up_to_date() const;
+  void reset_empty_up_to_date();
+  void set_empty_up_to_date();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_universe() const;
+  void reset_universe();
+  void set_universe();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t NONE             = 0U;
+  static const flags_t EMPTY_UP_TO_DATE = 1U << 0;
+  static const flags_t EMPTY            = 1U << 1;
+  static const flags_t UNIVERSE         = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Box_Status_idefs_hh)
diff --git a/src/Box_Status.inlines.hh b/src/Box_Status.inlines.hh
new file mode 100644
index 0000000..43f2074
--- /dev/null
+++ b/src/Box_Status.inlines.hh
@@ -0,0 +1,227 @@
+/* Box<ITV>::Status class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Box_Status_inlines_hh
+#define PPL_Box_Status_inlines_hh 1
+
+#include <string>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(const Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Status::Status(const typename Box<Other_ITV>::Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status()
+  : flags(NONE) {
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty_up_to_date() const {
+  return test_any(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty_up_to_date() {
+  reset(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty_up_to_date() {
+  set(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty() {
+  set(EMPTY);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_universe() const {
+  return test_any(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_universe() {
+  reset(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_universe() {
+  set(UNIVERSE);
+}
+
+template <typename ITV>
+bool
+Box<ITV>::Status::OK() const {
+  if (test_empty_up_to_date()
+      && test_empty()
+      && test_universe()) {
+#ifndef NDEBUG
+    std::cerr
+      << "The status asserts emptiness and universality at the same time."
+      << std::endl;
+#endif
+    return false;
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Boxes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string empty_up_to_date = "EUP";
+const std::string empty = "EM";
+const std::string universe = "UN";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Box::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+template <typename ITV>
+void
+Box<ITV>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Boxes;
+  s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << sep
+    << (test_empty() ? yes : no) << empty << sep
+    << (test_universe() ? yes : no) << universe << sep;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box<ITV>::Status)
+
+template <typename ITV>
+bool
+Box<ITV>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Boxes;
+  bool positive;
+
+  if (!get_field(s, Implementation::Boxes::empty_up_to_date, positive))
+    return false;
+  if (positive)
+    set_empty_up_to_date();
+
+  if (!get_field(s, Implementation::Boxes::empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, universe, positive))
+    return false;
+  if (positive)
+    set_universe();
+  else
+    reset_universe();
+
+  // Check invariants.
+  assert(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_Status_inlines_hh)
diff --git a/src/COPYING.cc.dist b/src/COPYING.cc.dist
index 457adbb..04994b1 100644
--- a/src/COPYING.cc.dist
+++ b/src/COPYING.cc.dist
@@ -1,286 +1,627 @@
 extern const char* const COPYING_array[] = {
-  "\t\t    GNU GENERAL PUBLIC LICENSE",
-  "\t\t       Version 2, June 1991",
+  "                    GNU GENERAL PUBLIC LICENSE",
+  "                       Version 3, 29 June 2007",
   "",
-  " Copyright (C) 1989, 1991 Free Software Foundation, Inc.",
-  "                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA",
+  " Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>",
   " Everyone is permitted to copy and distribute verbatim copies",
   " of this license document, but changing it is not allowed.",
   "",
-  "\t\t\t    Preamble",
+  "                            Preamble",
   "",
-  "  The licenses for most software are designed to take away your",
-  "freedom to share and change it.  By contrast, the GNU General Public",
-  "License is intended to guarantee your freedom to share and change free",
-  "software--to make sure the software is free for all its users.  This",
-  "General Public License applies to most of the Free Software",
-  "Foundation's software and to any other program whose authors commit to",
-  "using it.  (Some other Free Software Foundation software is covered by",
-  "the GNU Library General Public License instead.)  You can apply it to",
+  "  The GNU General Public License is a free, copyleft license for",
+  "software and other kinds of works.",
+  "",
+  "  The licenses for most software and other practical works are designed",
+  "to take away your freedom to share and change the works.  By contrast,",
+  "the GNU General Public License is intended to guarantee your freedom to",
+  "share and change all versions of a program--to make sure it remains free",
+  "software for all its users.  We, the Free Software Foundation, use the",
+  "GNU General Public License for most of our software; it applies also to",
+  "any other work released this way by its authors.  You can apply it to",
   "your programs, 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.",
+  "them 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 software, or if you modify it.",
+  "  To protect your rights, we need to prevent others from denying you",
+  "these rights or asking you to surrender the rights.  Therefore, you have",
+  "certain responsibilities if you distribute copies of the software, or if",
+  "you modify it: responsibilities to respect the freedom of others.",
   "",
   "  For example, if you distribute copies of such a program, whether",
-  "gratis or for a fee, you must give the recipients all the rights that",
-  "you have.  You must make sure that they, too, receive or can get the",
-  "source code.  And you must show them these terms so they know their",
-  "rights.",
-  "",
-  "  We protect your rights with two steps: (1) copyright the software, and",
-  "(2) offer you this license which gives you legal permission to copy,",
-  "distribute and/or modify the software.",
-  "",
-  "  Also, for each author's protection and ours, we want to make certain",
-  "that everyone understands that there is no warranty for this free",
-  "software.  If the software is modified by someone else and passed on, we",
-  "want its recipients to know that what they have is not the original, so",
-  "that any problems introduced by others will not reflect on the original",
-  "authors' reputations.",
-  "",
-  "  Finally, any free program is threatened constantly by software",
-  "patents.  We wish to avoid the danger that redistributors of a free",
-  "program will individually obtain patent licenses, in effect making the",
-  "program proprietary.  To prevent this, we have made it clear that any",
-  "patent must be licensed for everyone's free use or not licensed at all.",
+  "gratis or for a fee, you must pass on to the recipients the same",
+  "freedoms that you received.  You must make sure that they, too, receive",
+  "or can get the source code.  And you must show them these terms so they",
+  "know their rights.",
+  "",
+  "  Developers that use the GNU GPL protect your rights with two steps:",
+  "(1) assert copyright on the software, and (2) offer you this License",
+  "giving you legal permission to copy, distribute and/or modify it.",
+  "",
+  "  For the developers' and authors' protection, the GPL clearly explains",
+  "that there is no warranty for this free software.  For both users' and",
+  "authors' sake, the GPL requires that modified versions be marked as",
+  "changed, so that their problems will not be attributed erroneously to",
+  "authors of previous versions.",
+  "",
+  "  Some devices are designed to deny users access to install or run",
+  "modified versions of the software inside them, although the manufacturer",
+  "can do so.  This is fundamentally incompatible with the aim of",
+  "protecting users' freedom to change the software.  The systematic",
+  "pattern of such abuse occurs in the area of products for individuals to",
+  "use, which is precisely where it is most unacceptable.  Therefore, we",
+  "have designed this version of the GPL to prohibit the practice for those",
+  "products.  If such problems arise substantially in other domains, we",
+  "stand ready to extend this provision to those domains in future versions",
+  "of the GPL, as needed to protect the freedom of users.",
+  "",
+  "  Finally, every program is threatened constantly by software patents.",
+  "States should not allow patents to restrict development and use of",
+  "software on general-purpose computers, but in those that do, we wish to",
+  "avoid the special danger that patents applied to a free program could",
+  "make it effectively proprietary.  To prevent this, the GPL assures that",
+  "patents cannot be used to render the program non-free.",
   "",
   "  The precise terms and conditions for copying, distribution and",
   "modification follow.",
-  "
",
-  "\t\t    GNU GENERAL PUBLIC LICENSE",
-  "   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION",
-  "",
-  "  0. This License applies to any program or other work which contains",
-  "a notice placed by the copyright holder saying it may be distributed",
-  "under the terms of this General Public License.  The \"Program\", below,",
-  "refers to any such program or work, and a \"work based on the Program\"",
-  "means either the Program or any derivative work under copyright law:",
-  "that is to say, a work containing the Program or a portion of it,",
-  "either verbatim or with modifications and/or translated into another",
-  "language.  (Hereinafter, translation is included without limitation in",
-  "the term \"modification\".)  Each licensee is addressed as \"you\".",
-  "",
-  "Activities other than copying, distribution and modification are not",
-  "covered by this License; they are outside its scope.  The act of",
-  "running the Program is not restricted, and the output from the Program",
-  "is covered only if its contents constitute a work based on the",
-  "Program (independent of having been made by running the Program).",
-  "Whether that is true depends on what the Program does.",
-  "",
-  "  1. You may copy and distribute verbatim copies of the Program's",
-  "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 give any other recipients of the Program a copy of this License",
-  "along with the Program.",
-  "",
-  "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.",
-  "",
-  "  2. You may modify your copy or copies of the Program or any portion",
-  "of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices",
-  "    stating that you changed the files and the date of any change.",
-  "",
-  "    b) You must cause any work that you distribute or publish, that in",
-  "    whole or in part contains or is derived from the Program or any",
-  "    part thereof, to be licensed as a whole at no charge to all third",
-  "    parties under the terms of this License.",
-  "",
-  "    c) If the modified program normally reads commands interactively",
-  "    when run, you must cause it, when started running for such",
-  "    interactive use in the most ordinary way, to print or display an",
-  "    announcement including an appropriate copyright notice and a",
-  "    notice that there is no warranty (or else, saying that you provide",
-  "    a warranty) and that users may redistribute the program under",
-  "    these conditions, and telling the user how to view a copy of this",
-  "    License.  (Exception: if the Program itself is interactive but",
-  "    does not normally print such an announcement, your work based on",
-  "    the Program is not required to print an announcement.)",
-  "
",
-  "These requirements apply to the modified work as a whole.  If",
-  "identifiable sections of that work are not derived from the Program,",
-  "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 Program, 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 Program.",
-  "",
-  "In addition, mere aggregation of another work not based on the Program",
-  "with the Program (or with a work based on the Program) on a volume of",
-  "a storage or distribution medium does not bring the other work under",
-  "the scope of this License.",
-  "",
-  "  3. You may copy and distribute the Program (or a work based on it,",
-  "under Section 2) in object code or executable form under the terms of",
-  "Sections 1 and 2 above provided that you also do one of the following:",
-  "",
-  "    a) 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; or,",
-  "",
-  "    b) Accompany it with a written offer, valid for at least three",
-  "    years, to give any third party, for a charge no more than your",
-  "    cost of physically performing source distribution, a complete",
-  "    machine-readable copy of the corresponding source code, to be",
-  "    distributed under the terms of Sections 1 and 2 above on a medium",
-  "    customarily used for software interchange; or,",
-  "",
-  "    c) Accompany it with the information you received as to the offer",
-  "    to distribute corresponding source code.  (This alternative is",
-  "    allowed only for noncommercial distribution and only if you",
-  "    received the program in object code or executable form with such",
-  "    an offer, in accord with Subsection b above.)",
-  "",
-  "The source code for a work means the preferred form of the work for",
-  "making modifications to it.  For an executable work, 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 executable.  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.",
-  "",
-  "If distribution of executable or 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 counts as",
-  "distribution of the source code, even though third parties are not",
-  "compelled to copy the source along with the object code.",
-  "
",
-  "  4. You may not copy, modify, sublicense, or distribute the Program",
-  "except as expressly provided under this License.  Any attempt",
-  "otherwise to copy, modify, sublicense or distribute the Program 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.",
-  "",
-  "  5. 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 Program or its derivative works.  These actions are",
-  "prohibited by law if you do not accept this License.  Therefore, by",
-  "modifying or distributing the Program (or any work based on the",
-  "Program), you indicate your acceptance of this License to do so, and",
-  "all its terms and conditions for copying, distributing or modifying",
-  "the Program or works based on it.",
-  "",
-  "  6. Each time you redistribute the Program (or any work based on the",
-  "Program), the recipient automatically receives a license from the",
-  "original licensor to copy, distribute or modify the Program 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",
+  "",
+  "                       TERMS AND CONDITIONS",
+  "",
+  "  0. Definitions.",
+  "",
+  "  \"This License\" refers to version 3 of the GNU General Public License.",
+  "",
+  "  \"Copyright\" also means copyright-like laws that apply to other kinds of",
+  "works, such as semiconductor masks.",
+  "",
+  "  \"The Program\" refers to any copyrightable work licensed under this",
+  "License.  Each licensee is addressed as \"you\".  \"Licensees\" and",
+  "\"recipients\" may be individuals or organizations.",
+  "",
+  "  To \"modify\" a work means to copy from or adapt all or part of the work",
+  "in a fashion requiring copyright permission, other than the making of an",
+  "exact copy.  The resulting work is called a \"modified version\" of the",
+  "earlier work or a work \"based on\" the earlier work.",
+  "",
+  "  A \"covered work\" means either the unmodified Program or a work based",
+  "on the Program.",
+  "",
+  "  To \"propagate\" a work means to do anything with it that, without",
+  "permission, would make you directly or secondarily liable for",
+  "infringement under applicable copyright law, except executing it on a",
+  "computer or modifying a private copy.  Propagation includes copying,",
+  "distribution (with or without modification), making available to the",
+  "public, and in some countries other activities as well.",
+  "",
+  "  To \"convey\" a work means any kind of propagation that enables other",
+  "parties to make or receive copies.  Mere interaction with a user through",
+  "a computer network, with no transfer of a copy, is not conveying.",
+  "",
+  "  An interactive user interface displays \"Appropriate Legal Notices\"",
+  "to the extent that it includes a convenient and prominently visible",
+  "feature that (1) displays an appropriate copyright notice, and (2)",
+  "tells the user that there is no warranty for the work (except to the",
+  "extent that warranties are provided), that licensees may convey the",
+  "work under this License, and how to view a copy of this License.  If",
+  "the interface presents a list of user commands or options, such as a",
+  "menu, a prominent item in the list meets this criterion.",
+  "",
+  "  1. Source Code.",
+  "",
+  "  The \"source code\" for a work means the preferred form of the work",
+  "for making modifications to it.  \"Object code\" means any non-source",
+  "form of a work.",
+  "",
+  "  A \"Standard Interface\" means an interface that either is an official",
+  "standard defined by a recognized standards body, or, in the case of",
+  "interfaces specified for a particular programming language, one that",
+  "is widely used among developers working in that language.",
+  "",
+  "  The \"System Libraries\" of an executable work include anything, other",
+  "than the work as a whole, that (a) is included in the normal form of",
+  "packaging a Major Component, but which is not part of that Major",
+  "Component, and (b) serves only to enable use of the work with that",
+  "Major Component, or to implement a Standard Interface for which an",
+  "implementation is available to the public in source code form.  A",
+  "\"Major Component\", in this context, means a major essential component",
+  "(kernel, window system, and so on) of the specific operating system",
+  "(if any) on which the executable work runs, or a compiler used to",
+  "produce the work, or an object code interpreter used to run it.",
+  "",
+  "  The \"Corresponding Source\" for a work in object code form means all",
+  "the source code needed to generate, install, and (for an executable",
+  "work) run the object code and to modify the work, including scripts to",
+  "control those activities.  However, it does not include the work's",
+  "System Libraries, or general-purpose tools or generally available free",
+  "programs which are used unmodified in performing those activities but",
+  "which are not part of the work.  For example, Corresponding Source",
+  "includes interface definition files associated with source files for",
+  "the work, and the source code for shared libraries and dynamically",
+  "linked subprograms that the work is specifically designed to require,",
+  "such as by intimate data communication or control flow between those",
+  "subprograms and other parts of the work.",
+  "",
+  "  The Corresponding Source need not include anything that users",
+  "can regenerate automatically from other parts of the Corresponding",
+  "Source.",
+  "",
+  "  The Corresponding Source for a work in source code form is that",
+  "same work.",
+  "",
+  "  2. Basic Permissions.",
+  "",
+  "  All rights granted under this License are granted for the term of",
+  "copyright on the Program, and are irrevocable provided the stated",
+  "conditions are met.  This License explicitly affirms your unlimited",
+  "permission to run the unmodified Program.  The output from running a",
+  "covered work is covered by this License only if the output, given its",
+  "content, constitutes a covered work.  This License acknowledges your",
+  "rights of fair use or other equivalent, as provided by copyright law.",
+  "",
+  "  You may make, run and propagate covered works that you do not",
+  "convey, without conditions so long as your license otherwise remains",
+  "in force.  You may convey covered works to others for the sole purpose",
+  "of having them make modifications exclusively for you, or provide you",
+  "with facilities for running those works, provided that you comply with",
+  "the terms of this License in conveying all material for which you do",
+  "not control copyright.  Those thus making or running the covered works",
+  "for you must do so exclusively on your behalf, under your direction",
+  "and control, on terms that prohibit them from making any copies of",
+  "your copyrighted material outside their relationship with you.",
+  "",
+  "  Conveying under any other circumstances is permitted solely under",
+  "the conditions stated below.  Sublicensing is not allowed; section 10",
+  "makes it unnecessary.",
+  "",
+  "  3. Protecting Users' Legal Rights From Anti-Circumvention Law.",
+  "",
+  "  No covered work shall be deemed part of an effective technological",
+  "measure under any applicable law fulfilling obligations under article",
+  "11 of the WIPO copyright treaty adopted on 20 December 1996, or",
+  "similar laws prohibiting or restricting circumvention of such",
+  "measures.",
+  "",
+  "  When you convey a covered work, you waive any legal power to forbid",
+  "circumvention of technological measures to the extent such circumvention",
+  "is effected by exercising rights under this License with respect to",
+  "the covered work, and you disclaim any intention to limit operation or",
+  "modification of the work as a means of enforcing, against the work's",
+  "users, your or third parties' legal rights to forbid circumvention of",
+  "technological measures.",
+  "",
+  "  4. Conveying Verbatim Copies.",
+  "",
+  "  You may convey verbatim copies of the Program's source code as you",
+  "receive it, in any medium, provided that you conspicuously and",
+  "appropriately publish on each copy an appropriate copyright notice;",
+  "keep intact all notices stating that this License and any",
+  "non-permissive terms added in accord with section 7 apply to the code;",
+  "keep intact all notices of the absence of any warranty; and give all",
+  "recipients a copy of this License along with the Program.",
+  "",
+  "  You may charge any price or no price for each copy that you convey,",
+  "and you may offer support or warranty protection for a fee.",
+  "",
+  "  5. Conveying Modified Source Versions.",
+  "",
+  "  You may convey a work based on the Program, or the modifications to",
+  "produce it from the Program, in the form of source code under the",
+  "terms of section 4, provided that you also meet all of these conditions:",
+  "",
+  "    a) The work must carry prominent notices stating that you modified",
+  "    it, and giving a relevant date.",
+  "",
+  "    b) The work must carry prominent notices stating that it is",
+  "    released under this License and any conditions added under section",
+  "    7.  This requirement modifies the requirement in section 4 to",
+  "    \"keep intact all notices\".",
+  "",
+  "    c) You must license the entire work, as a whole, under this",
+  "    License to anyone who comes into possession of a copy.  This",
+  "    License will therefore apply, along with any applicable section 7",
+  "    additional terms, to the whole of the work, and all its parts,",
+  "    regardless of how they are packaged.  This License gives no",
+  "    permission to license the work in any other way, but it does not",
+  "    invalidate such permission if you have separately received it.",
+  "",
+  "    d) If the work has interactive user interfaces, each must display",
+  "    Appropriate Legal Notices; however, if the Program has interactive",
+  "    interfaces that do not display Appropriate Legal Notices, your",
+  "    work need not make them do so.",
+  "",
+  "  A compilation of a covered work with other separate and independent",
+  "works, which are not by their nature extensions of the covered work,",
+  "and which are not combined with it such as to form a larger program,",
+  "in or on a volume of a storage or distribution medium, is called an",
+  "\"aggregate\" if the compilation and its resulting copyright are not",
+  "used to limit the access or legal rights of the compilation's users",
+  "beyond what the individual works permit.  Inclusion of a covered work",
+  "in an aggregate does not cause this License to apply to the other",
+  "parts of the aggregate.",
+  "",
+  "  6. Conveying Non-Source Forms.",
+  "",
+  "  You may convey a covered work in object code form under the terms",
+  "of sections 4 and 5, provided that you also convey the",
+  "machine-readable Corresponding Source under the terms of this License,",
+  "in one of these ways:",
+  "",
+  "    a) Convey the object code in, or embodied in, a physical product",
+  "    (including a physical distribution medium), accompanied by the",
+  "    Corresponding Source fixed on a durable physical medium",
+  "    customarily used for software interchange.",
+  "",
+  "    b) Convey the object code in, or embodied in, a physical product",
+  "    (including a physical distribution medium), accompanied by a",
+  "    written offer, valid for at least three years and valid for as",
+  "    long as you offer spare parts or customer support for that product",
+  "    model, to give anyone who possesses the object code either (1) a",
+  "    copy of the Corresponding Source for all the software in the",
+  "    product that is covered by this License, on a durable physical",
+  "    medium customarily used for software interchange, for a price no",
+  "    more than your reasonable cost of physically performing this",
+  "    conveying of source, or (2) access to copy the",
+  "    Corresponding Source from a network server at no charge.",
+  "",
+  "    c) Convey individual copies of the object code with a copy of the",
+  "    written offer to provide the Corresponding Source.  This",
+  "    alternative is allowed only occasionally and noncommercially, and",
+  "    only if you received the object code with such an offer, in accord",
+  "    with subsection 6b.",
+  "",
+  "    d) Convey the object code by offering access from a designated",
+  "    place (gratis or for a charge), and offer equivalent access to the",
+  "    Corresponding Source in the same way through the same place at no",
+  "    further charge.  You need not require recipients to copy the",
+  "    Corresponding Source along with the object code.  If the place to",
+  "    copy the object code is a network server, the Corresponding Source",
+  "    may be on a different server (operated by you or a third party)",
+  "    that supports equivalent copying facilities, provided you maintain",
+  "    clear directions next to the object code saying where to find the",
+  "    Corresponding Source.  Regardless of what server hosts the",
+  "    Corresponding Source, you remain obligated to ensure that it is",
+  "    available for as long as needed to satisfy these requirements.",
+  "",
+  "    e) Convey the object code using peer-to-peer transmission, provided",
+  "    you inform other peers where the object code and Corresponding",
+  "    Source of the work are being offered to the general public at no",
+  "    charge under subsection 6d.",
+  "",
+  "  A separable portion of the object code, whose source code is excluded",
+  "from the Corresponding Source as a System Library, need not be",
+  "included in conveying the object code work.",
+  "",
+  "  A \"User Product\" is either (1) a \"consumer product\", which means any",
+  "tangible personal property which is normally used for personal, family,",
+  "or household purposes, or (2) anything designed or sold for incorporation",
+  "into a dwelling.  In determining whether a product is a consumer product,",
+  "doubtful cases shall be resolved in favor of coverage.  For a particular",
+  "product received by a particular user, \"normally used\" refers to a",
+  "typical or common use of that class of product, regardless of the status",
+  "of the particular user or of the way in which the particular user",
+  "actually uses, or expects or is expected to use, the product.  A product",
+  "is a consumer product regardless of whether the product has substantial",
+  "commercial, industrial or non-consumer uses, unless such uses represent",
+  "the only significant mode of use of the product.",
+  "",
+  "  \"Installation Information\" for a User Product means any methods,",
+  "procedures, authorization keys, or other information required to install",
+  "and execute modified versions of a covered work in that User Product from",
+  "a modified version of its Corresponding Source.  The information must",
+  "suffice to ensure that the continued functioning of the modified object",
+  "code is in no case prevented or interfered with solely because",
+  "modification has been made.",
+  "",
+  "  If you convey an object code work under this section in, or with, or",
+  "specifically for use in, a User Product, and the conveying occurs as",
+  "part of a transaction in which the right of possession and use of the",
+  "User Product is transferred to the recipient in perpetuity or for a",
+  "fixed term (regardless of how the transaction is characterized), the",
+  "Corresponding Source conveyed under this section must be accompanied",
+  "by the Installation Information.  But this requirement does not apply",
+  "if neither you nor any third party retains the ability to install",
+  "modified object code on the User Product (for example, the work has",
+  "been installed in ROM).",
+  "",
+  "  The requirement to provide Installation Information does not include a",
+  "requirement to continue to provide support service, warranty, or updates",
+  "for a work that has been modified or installed by the recipient, or for",
+  "the User Product in which it has been modified or installed.  Access to a",
+  "network may be denied when the modification itself materially and",
+  "adversely affects the operation of the network or violates the rules and",
+  "protocols for communication across the network.",
+  "",
+  "  Corresponding Source conveyed, and Installation Information provided,",
+  "in accord with this section must be in a format that is publicly",
+  "documented (and with an implementation available to the public in",
+  "source code form), and must require no special password or key for",
+  "unpacking, reading or copying.",
+  "",
+  "  7. Additional Terms.",
+  "",
+  "  \"Additional permissions\" are terms that supplement the terms of this",
+  "License by making exceptions from one or more of its conditions.",
+  "Additional permissions that are applicable to the entire Program shall",
+  "be treated as though they were included in this License, to the extent",
+  "that they are valid under applicable law.  If additional permissions",
+  "apply only to part of the Program, that part may be used separately",
+  "under those permissions, but the entire Program remains governed by",
+  "this License without regard to the additional permissions.",
+  "",
+  "  When you convey a copy of a covered work, you may at your option",
+  "remove any additional permissions from that copy, or from any part of",
+  "it.  (Additional permissions may be written to require their own",
+  "removal in certain cases when you modify the work.)  You may place",
+  "additional permissions on material, added by you to a covered work,",
+  "for which you have or can give appropriate copyright permission.",
+  "",
+  "  Notwithstanding any other provision of this License, for material you",
+  "add to a covered work, you may (if authorized by the copyright holders of",
+  "that material) supplement the terms of this License with terms:",
+  "",
+  "    a) Disclaiming warranty or limiting liability differently from the",
+  "    terms of sections 15 and 16 of this License; or",
+  "",
+  "    b) Requiring preservation of specified reasonable legal notices or",
+  "    author attributions in that material or in the Appropriate Legal",
+  "    Notices displayed by works containing it; or",
+  "",
+  "    c) Prohibiting misrepresentation of the origin of that material, or",
+  "    requiring that modified versions of such material be marked in",
+  "    reasonable ways as different from the original version; or",
+  "",
+  "    d) Limiting the use for publicity purposes of names of licensors or",
+  "    authors of the material; or",
+  "",
+  "    e) Declining to grant rights under trademark law for use of some",
+  "    trade names, trademarks, or service marks; or",
+  "",
+  "    f) Requiring indemnification of licensors and authors of that",
+  "    material by anyone who conveys the material (or modified versions of",
+  "    it) with contractual assumptions of liability to the recipient, for",
+  "    any liability that these contractual assumptions directly impose on",
+  "    those licensors and authors.",
+  "",
+  "  All other non-permissive additional terms are considered \"further",
+  "restrictions\" within the meaning of section 10.  If the Program as you",
+  "received it, or any part of it, contains a notice stating that it is",
+  "governed by this License along with a term that is a further",
+  "restriction, you may remove that term.  If a license document contains",
+  "a further restriction but permits relicensing or conveying under this",
+  "License, you may add to a covered work material governed by the terms",
+  "of that license document, provided that the further restriction does",
+  "not survive such relicensing or conveying.",
+  "",
+  "  If you add terms to a covered work in accord with this section, you",
+  "must place, in the relevant source files, a statement of the",
+  "additional terms that apply to those files, or a notice indicating",
+  "where to find the applicable terms.",
+  "",
+  "  Additional terms, permissive or non-permissive, may be stated in the",
+  "form of a separately written license, or stated as exceptions;",
+  "the above requirements apply either way.",
+  "",
+  "  8. Termination.",
+  "",
+  "  You may not propagate or modify a covered work except as expressly",
+  "provided under this License.  Any attempt otherwise to propagate or",
+  "modify it is void, and will automatically terminate your rights under",
+  "this License (including any patent licenses granted under the third",
+  "paragraph of section 11).",
+  "",
+  "  However, if you cease all violation of this License, then your",
+  "license from a particular copyright holder is reinstated (a)",
+  "provisionally, unless and until the copyright holder explicitly and",
+  "finally terminates your license, and (b) permanently, if the copyright",
+  "holder fails to notify you of the violation by some reasonable means",
+  "prior to 60 days after the cessation.",
+  "",
+  "  Moreover, your license from a particular copyright holder is",
+  "reinstated permanently if the copyright holder notifies you of the",
+  "violation by some reasonable means, this is the first time you have",
+  "received notice of violation of this License (for any work) from that",
+  "copyright holder, and you cure the violation prior to 30 days after",
+  "your receipt of the notice.",
+  "",
+  "  Termination of your rights under this section does not terminate the",
+  "licenses of parties who have received copies or rights from you under",
+  "this License.  If your rights have been terminated and not permanently",
+  "reinstated, you do not qualify to receive new licenses for the same",
+  "material under section 10.",
+  "",
+  "  9. Acceptance Not Required for Having Copies.",
+  "",
+  "  You are not required to accept this License in order to receive or",
+  "run a copy of the Program.  Ancillary propagation of a covered work",
+  "occurring solely as a consequence of using peer-to-peer transmission",
+  "to receive a copy likewise does not require acceptance.  However,",
+  "nothing other than this License grants you permission to propagate or",
+  "modify any covered work.  These actions infringe copyright if you do",
+  "not accept this License.  Therefore, by modifying or propagating a",
+  "covered work, you indicate your acceptance of this License to do so.",
+  "",
+  "  10. Automatic Licensing of Downstream Recipients.",
+  "",
+  "  Each time you convey a covered work, the recipient automatically",
+  "receives a license from the original licensors, to run, modify and",
+  "propagate that work, subject to this License.  You are not responsible",
+  "for enforcing compliance by third parties with this License.",
+  "",
+  "  An \"entity transaction\" is a transaction transferring control of an",
+  "organization, or substantially all assets of one, or subdividing an",
+  "organization, or merging organizations.  If propagation of a covered",
+  "work results from an entity transaction, each party to that",
+  "transaction who receives a copy of the work also receives whatever",
+  "licenses to the work the party's predecessor in interest had or could",
+  "give under the previous paragraph, plus a right to possession of the",
+  "Corresponding Source of the work from the predecessor in interest, if",
+  "the predecessor has it or can get it with reasonable efforts.",
+  "",
+  "  You may not impose any further restrictions on the exercise of the",
+  "rights granted or affirmed under this License.  For example, you may",
+  "not impose a license fee, royalty, or other charge for exercise of",
+  "rights granted under this License, and you may not initiate litigation",
+  "(including a cross-claim or counterclaim in a lawsuit) alleging that",
+  "any patent claim is infringed by making, using, selling, offering for",
+  "sale, or importing the Program or any portion of it.",
+  "",
+  "  11. Patents.",
+  "",
+  "  A \"contributor\" is a copyright holder who authorizes use under this",
+  "License of the Program or a work on which the Program is based.  The",
+  "work thus licensed is called the contributor's \"contributor version\".",
+  "",
+  "  A contributor's \"essential patent claims\" are all patent claims",
+  "owned or controlled by the contributor, whether already acquired or",
+  "hereafter acquired, that would be infringed by some manner, permitted",
+  "by this License, of making, using, or selling its contributor version,",
+  "but do not include claims that would be infringed only as a",
+  "consequence of further modification of the contributor version.  For",
+  "purposes of this definition, \"control\" includes the right to grant",
+  "patent sublicenses in a manner consistent with the requirements of",
   "this License.",
   "",
-  "  7. 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",
+  "  Each contributor grants you a non-exclusive, worldwide, royalty-free",
+  "patent license under the contributor's essential patent claims, to",
+  "make, use, sell, offer for sale, import and otherwise run, modify and",
+  "propagate the contents of its contributor version.",
+  "",
+  "  In the following three paragraphs, a \"patent license\" is any express",
+  "agreement or commitment, however denominated, not to enforce a patent",
+  "(such as an express permission to practice a patent or covenant not to",
+  "sue for patent infringement).  To \"grant\" such a patent license to a",
+  "party means to make such an agreement or commitment not to enforce a",
+  "patent against the party.",
+  "",
+  "  If you convey a covered work, knowingly relying on a patent license,",
+  "and the Corresponding Source of the work is not available for anyone",
+  "to copy, free of charge and under the terms of this License, through a",
+  "publicly available network server or other readily accessible means,",
+  "then you must either (1) cause the Corresponding Source to be so",
+  "available, or (2) arrange to deprive yourself of the benefit of the",
+  "patent license for this particular work, or (3) arrange, in a manner",
+  "consistent with the requirements of this License, to extend the patent",
+  "license to downstream recipients.  \"Knowingly relying\" means you have",
+  "actual knowledge that, but for the patent license, your conveying the",
+  "covered work in a country, or your recipient's use of the covered work",
+  "in a country, would infringe one or more identifiable patents in that",
+  "country that you have reason to believe are valid.",
+  "",
+  "  If, pursuant to or in connection with a single transaction or",
+  "arrangement, you convey, or propagate by procuring conveyance of, a",
+  "covered work, and grant a patent license to some of the parties",
+  "receiving the covered work authorizing them to use, propagate, modify",
+  "or convey a specific copy of the covered work, then the patent license",
+  "you grant is automatically extended to all recipients of the covered",
+  "work and works based on it.",
+  "",
+  "  A patent license is \"discriminatory\" if it does not include within",
+  "the scope of its coverage, prohibits the exercise of, or is",
+  "conditioned on the non-exercise of one or more of the rights that are",
+  "specifically granted under this License.  You may not convey a covered",
+  "work if you are a party to an arrangement with a third party that is",
+  "in the business of distributing software, under which you make payment",
+  "to the third party based on the extent of your activity of conveying",
+  "the work, and under which the third party grants, to any of the",
+  "parties who would receive the covered work from you, a discriminatory",
+  "patent license (a) in connection with copies of the covered work",
+  "conveyed by you (or copies made from those copies), or (b) primarily",
+  "for and in connection with specific products or compilations that",
+  "contain the covered work, unless you entered into that arrangement,",
+  "or that patent license was granted, prior to 28 March 2007.",
+  "",
+  "  Nothing in this License shall be construed as excluding or limiting",
+  "any implied license or other defenses to infringement that may",
+  "otherwise be available to you under applicable patent law.",
+  "",
+  "  12. No Surrender of Others' Freedom.",
+  "",
+  "  If 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 Program at all.  For example, if a patent",
-  "license would not permit royalty-free redistribution of the Program 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 Program.",
-  "",
-  "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.",
-  "
",
-  "  8. If the distribution and/or use of the Program is restricted in",
-  "certain countries either by patents or by copyrighted interfaces, the",
-  "original copyright holder who places the Program 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.",
-  "",
-  "  9. The Free Software Foundation may publish revised and/or new versions",
-  "of the General Public License from time to time.  Such new versions will",
+  "excuse you from the conditions of this License.  If you cannot convey a",
+  "covered work so as to satisfy simultaneously your obligations under this",
+  "License and any other pertinent obligations, then as a consequence you may",
+  "not convey it at all.  For example, if you agree to terms that obligate you",
+  "to collect a royalty for further conveying from those to whom you convey",
+  "the Program, the only way you could satisfy both those terms and this",
+  "License would be to refrain entirely from conveying the Program.",
+  "",
+  "  13. Use with the GNU Affero General Public License.",
+  "",
+  "  Notwithstanding any other provision of this License, you have",
+  "permission to link or combine any covered work with a work licensed",
+  "under version 3 of the GNU Affero General Public License into a single",
+  "combined work, and to convey the resulting work.  The terms of this",
+  "License will continue to apply to the part which is the covered work,",
+  "but the special requirements of the GNU Affero General Public License,",
+  "section 13, concerning interaction through a network will apply to the",
+  "combination as such.",
+  "",
+  "  14. Revised Versions of this License.",
+  "",
+  "  The Free Software Foundation may publish revised and/or new versions of",
+  "the GNU 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 Program",
-  "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 Program does not specify a version number of",
-  "this License, you may choose any version ever published by the Free Software",
-  "Foundation.",
-  "",
-  "  10. If you wish to incorporate parts of the Program into other free",
-  "programs whose distribution conditions are different, 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.",
-  "",
-  "\t\t\t    NO WARRANTY",
-  "",
-  "  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY",
-  "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN",
-  "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES",
-  "PROVIDE THE PROGRAM \"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 PROGRAM IS WITH YOU.  SHOULD THE",
-  "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,",
-  "REPAIR OR CORRECTION.",
-  "",
-  "  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER",
-  "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE",
-  "POSSIBILITY OF SUCH DAMAGES.",
-  "",
-  "\t\t     END OF TERMS AND CONDITIONS",
-  "
",
-  "\t    How to Apply These Terms to Your New Programs",
+  "  Each version is given a distinguishing version number.  If the",
+  "Program specifies that a certain numbered version of the GNU General",
+  "Public License \"or any later version\" applies to it, you have the",
+  "option of following the terms and conditions either of that numbered",
+  "version or of any later version published by the Free Software",
+  "Foundation.  If the Program does not specify a version number of the",
+  "GNU General Public License, you may choose any version ever published",
+  "by the Free Software Foundation.",
+  "",
+  "  If the Program specifies that a proxy can decide which future",
+  "versions of the GNU General Public License can be used, that proxy's",
+  "public statement of acceptance of a version permanently authorizes you",
+  "to choose that version for the Program.",
+  "",
+  "  Later license versions may give you additional or different",
+  "permissions.  However, no additional obligations are imposed on any",
+  "author or copyright holder as a result of your choosing to follow a",
+  "later version.",
+  "",
+  "  15. Disclaimer of Warranty.",
+  "",
+  "  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY",
+  "APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT",
+  "HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"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 PROGRAM",
+  "IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF",
+  "ALL NECESSARY SERVICING, REPAIR OR CORRECTION.",
+  "",
+  "  16. Limitation of Liability.",
+  "",
+  "  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING",
+  "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS",
+  "THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),",
+  "EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF",
+  "SUCH DAMAGES.",
+  "",
+  "  17. Interpretation of Sections 15 and 16.",
+  "",
+  "  If the disclaimer of warranty and limitation of liability provided",
+  "above cannot be given local legal effect according to their terms,",
+  "reviewing courts shall apply local law that most closely approximates",
+  "an absolute waiver of all civil liability in connection with the",
+  "Program, unless a warranty or assumption of liability accompanies a",
+  "copy of the Program in return for a fee.",
+  "",
+  "                     END OF TERMS AND CONDITIONS",
+  "",
+  "            How to Apply These Terms to Your New Programs",
   "",
   "  If you develop a new program, and you want it to be of the greatest",
   "possible use to the public, the best way to achieve this is to make it",
@@ -288,15 +629,15 @@ extern const char* const COPYING_array[] = {
   "",
   "  To do so, attach the following notices to the program.  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",
+  "state 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 program's name and a brief idea of what it does.>",
   "    Copyright (C) <year>  <name of author>",
   "",
-  "    This program is free software; you can redistribute it and/or modify",
+  "    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",
+  "    the Free Software Foundation, either version 3 of the License, or",
   "    (at your option) any later version.",
   "",
   "    This program is distributed in the hope that it will be useful,",
@@ -305,38 +646,31 @@ extern const char* const COPYING_array[] = {
   "    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA",
-  "",
+  "    along with this program.  If not, see <http://www.gnu.org/licenses/>.",
   "",
   "Also add information on how to contact you by electronic and paper mail.",
   "",
-  "If the program is interactive, make it output a short notice like this",
-  "when it starts in an interactive mode:",
+  "  If the program does terminal interaction, make it output a short",
+  "notice like this when it starts in an interactive mode:",
   "",
-  "    Gnomovision version 69, Copyright (C) year name of author",
-  "    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.",
+  "    <program>  Copyright (C) <year>  <name of author>",
+  "    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.",
   "    This is free software, and you are welcome to redistribute it",
   "    under certain conditions; type `show c' for details.",
   "",
   "The hypothetical commands `show w' and `show c' should show the appropriate",
-  "parts of the General Public License.  Of course, the commands you use may",
-  "be called something other than `show w' and `show c'; they could even be",
-  "mouse-clicks or menu items--whatever suits your program.",
-  "",
-  "You should also get your employer (if you work as a programmer) or your",
-  "school, if any, to sign a \"copyright disclaimer\" for the program, if",
-  "necessary.  Here is a sample; alter the names:",
-  "",
-  "  Yoyodyne, Inc., hereby disclaims all copyright interest in the program",
-  "  `Gnomovision' (which makes passes at compilers) written by James Hacker.",
-  "",
-  "  <signature of Ty Coon>, 1 April 1989",
-  "  Ty Coon, President of Vice",
-  "",
-  "This General Public License does not permit incorporating your program into",
-  "proprietary programs.  If your program is a subroutine library, you may",
-  "consider it more useful to permit linking proprietary applications with the",
-  "library.  If this is what you want to do, use the GNU Library General",
-  "Public License instead of this License.",
+  "parts of the General Public License.  Of course, your program's commands",
+  "might be different; for a GUI interface, you would use an \"about box\".",
+  "",
+  "  You should also get your employer (if you work as a programmer) or school,",
+  "if any, to sign a \"copyright disclaimer\" for the program, if necessary.",
+  "For more information on this, and how to apply and follow the GNU GPL, see",
+  "<http://www.gnu.org/licenses/>.",
+  "",
+  "  The GNU General Public License does not permit incorporating your program",
+  "into proprietary programs.  If your program is a subroutine library, you",
+  "may consider it more useful to permit linking proprietary applications with",
+  "the library.  If this is what you want to do, use the GNU Lesser General",
+  "Public License instead of this License.  But first, please read",
+  "<http://www.gnu.org/philosophy/why-not-lgpl.html>.",
   0};
diff --git a/src/CREDITS.cc.dist b/src/CREDITS.cc.dist
index 7c0bc6a..80b6eb7 100644
--- a/src/CREDITS.cc.dist
+++ b/src/CREDITS.cc.dist
@@ -48,14 +48,6 @@ extern const char* const CREDITS_array[] = {
   "                        widening operators for weakly relational",
   "                        domains.  She is still working on this.",
   "",
-  "  David Merchat         [5] (University of Parma) is helping us with",
-  "                        the generation of the library's documentation",
-  "                        using Doxygen.",
-  "",
-  "  Matthew Mundell       [6] (University of Leeds) is working on the",
-  "                        implementation of rational grids.  He also",
-  "                        helps on other implementation issues.",
-  "",
   "  Andrea Pescetti       (University of Parma) is helping with the",
   "                        library's documentation.  Andrea was also one",
   "                        of the four students with which the PPL",
@@ -65,7 +57,7 @@ extern const char* const CREDITS_array[] = {
   "                        implementation of bounded differences",
   "                        and octagons.",
   "",
-  "  Alessandro Zaccagnini [7] (University of Parma) has helped with",
+  "  Alessandro Zaccagnini [5] (University of Parma) has helped with",
   "                        the efficient implementation of GCD and LCM",
   "                        for checked numbers.  He is now working on the",
   "                        definitions of interval arithmetic operations.",
@@ -100,6 +92,14 @@ extern const char* const CREDITS_array[] = {
   "  Maximiliano Marchesi  (University of Parma) helped to improve the",
   "                        documentation for bounded differences.",
   "",
+  "  David Merchat         (formerly at the University of Parma) helped us",
+  "                        with the generation of the library's documentation",
+  "                        using Doxygen.",
+  "",
+  "  Matthew Mundell       [6] (formerly at the University of Leeds) worked",
+  "                        on the implementation of rational grids.  He has",
+  "                        also helped on other implementation issues.",
+  "",
   "  Angela Stazzone       (former student of the University of Parma)",
   "                        worked on the library's documentation.",
   "",
@@ -129,36 +129,36 @@ extern const char* const CREDITS_array[] = {
   "                        and/or refresh the notions needed for",
   "                        developing the PPL library.",
   "",
-  "  Marco Comini          [8] (University of Udine) allowed us to use his",
+  "  Marco Comini          [7] (University of Udine) allowed us to use his",
   "                        Mac OS X machine to work on portability to",
   "                        that platform.",
   "",
-  "  Bruno Haible          [9] (ILOG) made it possible (by writing the",
+  "  Bruno Haible          [8] (ILOG) made it possible (by writing the",
   "                        AC_LIB_LINKFLAGS macro and explaining how",
   "                        to use it) to allow the use of versions of the",
   "                        GMP library installed into nonstandard places.",
   "",
-  "  Bertrand Jeannet      [10] (IRISA) wrote the New Polka library [11]",
+  "  Bertrand Jeannet      [9] (IRISA) wrote the New Polka library [10]",
   "                        and made it available.",
   "",
   "  Herve' Le Verge       (r.i.p.) wrote and published an implementation",
-  "                        [12] of the Chernikova's algorithm [13] that",
+  "                        [11] of the Chernikova's algorithm [12] that",
   "                        has set the stage for subsequent",
   "                        implementation work, including our own.",
   "",
-  "  Francesco Logozzo     [14] (Ecole Polytechnique) helped us straighten",
+  "  Francesco Logozzo     [13] (Ecole Polytechnique) helped us straighten",
   "                        out some portability issues on Cygwin.",
   "",
-  "  Costantino Medori     [15] (University of Parma) helped us on the",
+  "  Costantino Medori     [14] (University of Parma) helped us on the",
   "                        mathematical aspects of the development.",
   "",
-  "  Fred Mesnard          [16] (University of La Reunion), the main author",
-  "                        of cTI [17], has worked with us at one of the",
+  "  Fred Mesnard          [15] (University of La Reunion), the main author",
+  "                        of cTI [16], has worked with us at one of the",
   "                        first applications of the PPL: the \"cTI\"",
   "                        data-flow analyzer, which performs a linear",
   "                        size relation analysis using a domain of",
   "                        convex polyhedra.  The China data-flow",
-  "                        analyzer [18] uses the Parma Polyhedra Library",
+  "                        analyzer [17] uses the Parma Polyhedra Library",
   "                        to perform the same analysis.  We have been",
   "                        running China against an old version of cTI",
   "                        that did not use the PPL, using them to",
@@ -175,26 +175,26 @@ extern const char* const CREDITS_array[] = {
   "     ``Pure and Applied Mathematics'';",
   "",
   "  2. MURST project ``Automatic Program Certification by Abstract",
-  "     Interpretation'' [19];",
+  "     Interpretation'' [18];",
   "",
   "  3. MURST project ``Abstract Interpretation, Type Systems and",
   "     Control-Flow Analysis''.",
   "",
   "  4. MURST project ``Automatic Aggregate- and Number-Reasoning for",
   "     Computing: from Decision Algorithms to Constraint Programming",
-  "     with Multisets, Sets, and Maps'' [20].",
+  "     with Multisets, Sets, and Maps'' [19].",
   "",
   "  5. MURST project ``Constraint Based Verification of Reactive",
-  "     Systems'' [21].",
+  "     Systems'' [20].",
   "",
   "  6. MURST project ``AIDA - Abstract Interpretation: Design and",
-  "     Applications'' [22].",
+  "     Applications'' [21].",
   "",
   "  7. Royal Society Joint project 2004/R1-EU (UK-Italy)",
   "     ``Automatic Detection of Unstable Numerical Computations''.",
   "",
   "  8. EPSRC (UK) project EP/C520726/1",
-  "     ``Numerical Domains for Software Analysis'' [23].",
+  "     ``Numerical Domains for Software Analysis'' [22].",
   "",
   "--------",
   "",
@@ -202,23 +202,22 @@ extern const char* const CREDITS_array[] = {
   " [2] http://www.comp.leeds.ac.uk/hill/",
   " [3] http://www.cs.unipr.it/~zaffanella/",
   " [4] http://www.comp.leeds.ac.uk/katyd/",
-  " [5] http://www.cs.unipr.it/~merchat/",
+  " [5] http://www.math.unipr.it/~zaccagni/",
   " [6] http://www.mundell.ukfsn.org/",
-  " [7] http://www.math.unipr.it/~zaccagni/",
-  " [8] http://www.dimi.uniud.it/~comini/",
-  " [9] http://www.haible.de/bruno/",
-  "[10] http://www.irisa.fr/prive/Bertrand.Jeannet/",
-  "[11] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html",
-  "[12] http://www.cs.unipr.it/ppl/Documentation/chernikova.c",
-  "[13] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92",
-  "[14] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/",
-  "[15] http://www.math.unipr.it/~medori/",
-  "[16] http://www.univ-reunion.fr/~fred/",
-  "[17] http://www.cs.unipr.it/cTI/",
-  "[18] http://www.cs.unipr.it/China/",
-  "[19] http://theory.sci.univr.it/p40/",
-  "[20] http://www.cs.unipr.it/Projects/COFIN01",
-  "[21] http://www.disi.unige.it/person/DelzannoG/cover/",
-  "[22] http://www.cs.unipr.it/Projects/AIDA/",
-  "[23] http://www.comp.leeds.ac.uk/hill/linda/",
+  " [7] http://www.dimi.uniud.it/~comini/",
+  " [8] http://www.haible.de/bruno/",
+  " [9] http://www.irisa.fr/prive/Bertrand.Jeannet/",
+  "[10] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html",
+  "[11] http://www.cs.unipr.it/ppl/Documentation/chernikova.c",
+  "[12] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92",
+  "[13] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/",
+  "[14] http://www.math.unipr.it/~medori/",
+  "[15] http://www.univ-reunion.fr/~fred/",
+  "[16] http://www.cs.unipr.it/cTI/",
+  "[17] http://www.cs.unipr.it/China/",
+  "[18] http://theory.sci.univr.it/p40/",
+  "[19] http://www.cs.unipr.it/Projects/COFIN01",
+  "[20] http://www.disi.unige.it/person/DelzannoG/cover/",
+  "[21] http://www.cs.unipr.it/Projects/AIDA/",
+  "[22] http://www.comp.leeds.ac.uk/hill/linda/",
   0};
diff --git a/src/C_Integer.hh b/src/C_Integer.hh
new file mode 100644
index 0000000..2700744
--- /dev/null
+++ b/src/C_Integer.hh
@@ -0,0 +1,175 @@
+/* C integers info.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_C_Integer_hh
+#define PPL_C_Integer_hh 1
+
+#include "meta_programming.hh"
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing.  In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+struct C_Integer : public False { };
+
+template <>
+struct C_Integer<signed char> : public True {
+  enum { is_signed = true };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef unsigned char other_type;
+  static const signed char min = SCHAR_MIN;
+  static const signed char max = SCHAR_MAX;
+};
+
+template <>
+struct C_Integer<signed short> : public True {
+  enum { is_signed = true };
+  typedef signed char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef unsigned short other_type;
+  static const signed short min = SHRT_MIN;
+  static const signed short max = SHRT_MAX;
+};
+
+template <>
+struct C_Integer<signed int> : public True {
+  enum { is_signed = true };
+  typedef signed short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef unsigned int other_type;
+  static const signed int min = INT_MIN;
+  static const signed int max = INT_MAX;
+};
+
+template <>
+struct C_Integer<signed long> : public True {
+  enum { is_signed = true };
+  typedef signed int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef unsigned long other_type;
+  static const signed long min = LONG_MIN;
+  static const signed long max = LONG_MAX;
+};
+
+template <>
+struct C_Integer<signed long long> : public True {
+  enum { is_signed = true };
+  typedef signed long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef unsigned long long other_type;
+  static const signed long long min = LLONG_MIN;
+  static const signed long long max = LLONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned char> : public True {
+  enum { is_signed = false };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef signed char other_type;
+  static const unsigned char min = 0;
+  static const unsigned char max = UCHAR_MAX;
+};
+
+template <>
+struct C_Integer<unsigned short> : public True {
+  enum { is_signed = false };
+  typedef unsigned char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef signed short other_type;
+  static const unsigned short min = 0;
+  static const unsigned short max = USHRT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned int> : public True {
+  enum { is_signed = false };
+  typedef unsigned short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef signed int other_type;
+  static const unsigned int min = 0;
+  static const unsigned int max = UINT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long> : public True {
+  enum { is_signed = false };
+  typedef unsigned int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef signed long other_type;
+  static const unsigned long min = 0;
+  static const unsigned long max = ULONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long long> : public True {
+  enum { is_signed = false };
+  typedef unsigned long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef signed long long other_type;
+  static const unsigned long long min = 0;
+  static const unsigned long long max = ULLONG_MAX;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Integer_hh)
diff --git a/src/C_Polyhedron.cc b/src/C_Polyhedron.cc
index 4dcb67b..7b6d23f 100644
--- a/src/C_Polyhedron.cc
+++ b/src/C_Polyhedron.cc
@@ -1,11 +1,11 @@
 /* C_Polyhedron class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,15 +20,16 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "C_Polyhedron.defs.hh"
 #include "NNC_Polyhedron.defs.hh"
+#include "Grid.defs.hh"
 #include "algorithms.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
 
-PPL::C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y)
+PPL::C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
   : Polyhedron(NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
   const Constraint_System& cs = y.constraints();
   for (Constraint_System::const_iterator i = cs.begin(),
@@ -52,12 +53,13 @@ PPL::C_Polyhedron::C_Polyhedron(const Congruence_System& cgs)
   add_congruences(cgs);
 }
 
-PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs)
+PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs, Recycle_Input)
   : Polyhedron(NECESSARILY_CLOSED,
 	       cgs.space_dimension() <= max_space_dimension()
 	       ? cgs.space_dimension()
 	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(cgs)",
+						 "NNC_Polyhedron"
+						 "(cgs, recycle)",
 						 "the space dimension of cgs "
 						 "exceeds the maximum allowed "
 						 "space dimension"), 0),
@@ -65,6 +67,19 @@ PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs)
   add_congruences(cgs);
 }
 
+PPL::C_Polyhedron::C_Polyhedron(const Grid& grid, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       grid.space_dimension() <= max_space_dimension()
+	       ? grid.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(grid)",
+						 "the space dimension of grid "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+	       UNIVERSE) {
+  add_constraints(grid.constraints());
+}
+
 bool
 PPL::C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron& q) {
   return PPL::poly_hull_assign_if_exact(*this, q);
diff --git a/src/C_Polyhedron.defs.hh b/src/C_Polyhedron.defs.hh
index 7dc1d7f..6540609 100644
--- a/src/C_Polyhedron.defs.hh
+++ b/src/C_Polyhedron.defs.hh
@@ -1,11 +1,11 @@
 /* C_Polyhedron class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,6 +26,9 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "C_Polyhedron.types.hh"
 #include "NNC_Polyhedron.types.hh"
 #include "Polyhedron.defs.hh"
+#include "Grid.types.hh"
+#include "BD_Shape.types.hh"
+#include "Octagonal_Shape.types.hh"
 
 //! A closed convex polyhedron.
 /*! \ingroup PPL_CXX_interface
@@ -89,13 +92,17 @@ public:
 
     \param cs
     The system of constraints defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
 
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
     \exception std::invalid_argument
     Thrown if the system of constraints contains strict inequalities.
   */
-  explicit C_Polyhedron(Constraint_System& cs);
+  C_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
 
   //! Builds a C polyhedron from a system of generators.
   /*!
@@ -116,71 +123,130 @@ public:
 
     \param gs
     The system of generators defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
 
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
     \exception std::invalid_argument
     Thrown if the system of generators is not empty but has no points,
     or if it contains closure points.
   */
-  explicit C_Polyhedron(Generator_System& gs);
+  C_Polyhedron(Generator_System& gs, Recycle_Input dummy);
 
   //! Builds a C polyhedron from a system of congruences.
   /*!
     The polyhedron inherits the space dimension of the congruence system.
 
     \param cgs
-    The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
+    The system of congruences defining the polyhedron.
   */
   explicit C_Polyhedron(const Congruence_System& cgs);
 
-  //! Builds an C polyhedron recycling a system of congruences.
+  //! Builds a C polyhedron recycling a system of congruences.
   /*!
     The polyhedron inherits the space dimension of the congruence
     system.
 
     \param cgs
     The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
   */
-  explicit C_Polyhedron(Congruence_System& cgs);
+  C_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
 
   /*! \brief
     Builds a C polyhedron representing the topological closure
     of the NNC polyhedron \p y.
+
+    \param y
+    The NNC polyhedron to be used;
+
+    \param complexity
+    This argument is ignored.
   */
-  explicit C_Polyhedron(const NNC_Polyhedron& y);
+  explicit C_Polyhedron(const NNC_Polyhedron& y,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Builds a C polyhedron out of a generic, interval-based bounding box.
+  //! Builds a C polyhedron out of a box.
   /*!
-    For a description of the methods that should be provided by
-    the template class Box, see the documentation of the protected method:
-      template \<typename Box\>
-      Polyhedron::Polyhedron(Topology topol, const Box& box);
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
+    The algorithm used has polynomial complexity.
 
     \param box
-    The bounding box representing the polyhedron to be built;
+    The box representing the polyhedron to be approximated;
 
-    \param dummy
-    A dummy tag to syntactically differentiate this one from the other
-    constructors.
+    \param complexity
+    This argument is ignored.
 
     \exception std::length_error
     Thrown if the space dimension of \p box exceeds the maximum allowed
     space dimension.
+  */
+  template <typename Interval>
+  explicit C_Polyhedron(const Box<Interval>& box,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-    \exception std::invalid_argument
-    Thrown if \p box has intervals that are not topologically closed
-    (i.e., having some finite but open bounds).
+  //! Builds a C polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BDS and is
+    the most precise that includes the BDS.
+
+    \param bd
+    The BDS used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit C_Polyhedron(const BD_Shape<U>& bd,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
   */
-  template <typename Box>
-  C_Polyhedron(const Box& box, From_Bounding_Box dummy);
+  template <typename U>
+  explicit C_Polyhedron(const Octagonal_Shape<U>& os,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
+
+    \param grid
+    The grid used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit C_Polyhedron(const Grid& grid,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
   //! Ordinary copy-constructor.
-  C_Polyhedron(const C_Polyhedron& y);
+  /*!
+    The complexity argument is ignored.
+  */
+  C_Polyhedron(const C_Polyhedron& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
 
   /*! \brief
     The assignment operator.
diff --git a/src/C_Polyhedron.inlines.hh b/src/C_Polyhedron.inlines.hh
index 75efd0d..003a085 100644
--- a/src/C_Polyhedron.inlines.hh
+++ b/src/C_Polyhedron.inlines.hh
@@ -1,11 +1,11 @@
 /* C_Polyhedron class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,6 +29,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace Parma_Polyhedra_Library {
 
 inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline
 C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
 			   Degenerate_Element kind)
   : Polyhedron(NECESSARILY_CLOSED,
@@ -55,15 +59,16 @@ C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
 }
 
 inline
-C_Polyhedron::C_Polyhedron(Constraint_System& cs)
+C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input)
   : Polyhedron(NECESSARILY_CLOSED,
 	       cs.space_dimension() <= max_space_dimension()
 	       ? cs
 	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
+						 "C_Polyhedron(cs, recycle)",
 						 "the space dimension of cs "
 						 "exceeds the maximum allowed "
-						 "space dimension"), cs)) {
+						 "space dimension"), cs),
+	       Recycle_Input()) {
 }
 
 inline
@@ -72,27 +77,28 @@ C_Polyhedron::C_Polyhedron(const Generator_System& gs)
 	       gs.space_dimension() <= max_space_dimension()
 	       ? gs
 	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
+						 "C_Polyhedron(gs)",
 						 "the space dimension of gs "
 						 "exceeds the maximum allowed "
-						 "space dimension"), gs)){
+						 "space dimension"), gs)) {
 }
 
 inline
-C_Polyhedron::C_Polyhedron(Generator_System& gs)
+C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input)
   : Polyhedron(NECESSARILY_CLOSED,
 	       gs.space_dimension() <= max_space_dimension()
 	       ? gs
 	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
+						 "C_Polyhedron(gs, recycle)",
 						 "the space dimension of gs "
 						 "exceeds the maximum allowed "
-						 "space dimension"), gs)){
+						 "space dimension"), gs),
+	       Recycle_Input()) {
 }
 
-template <typename Box>
+template <typename Interval>
 inline
-C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
+C_Polyhedron::C_Polyhedron(const Box<Interval>& box, Complexity_Class)
   : Polyhedron(NECESSARILY_CLOSED,
 	       box.space_dimension() <= max_space_dimension()
 	       ? box
@@ -103,8 +109,38 @@ C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
 						 "space dimension"), box)) {
 }
 
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       bd.space_dimension() <= max_space_dimension()
+	       ? bd.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(bd): ",
+						 "the space dimension of bd "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       os.space_dimension() <= max_space_dimension()
+	       ? os.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(os): ",
+						 "the space dimension of os "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(os.constraints());
+}
+
 inline
-C_Polyhedron::C_Polyhedron(const C_Polyhedron& y)
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y, Complexity_Class)
   : Polyhedron(y) {
 }
 
@@ -121,10 +157,6 @@ C_Polyhedron::operator=(const NNC_Polyhedron& y) {
   return *this;
 }
 
-inline
-C_Polyhedron::~C_Polyhedron() {
-}
-
 inline bool
 C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
   return poly_hull_assign_if_exact(y);
diff --git a/src/C_Polyhedron.types.hh b/src/C_Polyhedron.types.hh
index b048063..70f7f7a 100644
--- a/src/C_Polyhedron.types.hh
+++ b/src/C_Polyhedron.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Checked_Number.cc b/src/Checked_Number.cc
index 58b7ba9..cf262b2 100644
--- a/src/Checked_Number.cc
+++ b/src/Checked_Number.cc
@@ -1,11 +1,11 @@
 /* Checked_Number class implementation
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,15 +20,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include "Checked_Number.defs.hh"
 
 namespace Parma_Polyhedra_Library {
 
-Minus_Infinity MINUS_INFINITY;
-Plus_Infinity PLUS_INFINITY;
-Not_A_Number NOT_A_NUMBER;
-
 void
 throw_result_exception(Result r) {
   switch (r) {
diff --git a/src/Checked_Number.defs.hh b/src/Checked_Number.defs.hh
index ca73522..e0152cc 100644
--- a/src/Checked_Number.defs.hh
+++ b/src/Checked_Number.defs.hh
@@ -1,11 +1,11 @@
 /* Checked_Number class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,51 +25,29 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "Checked_Number.types.hh"
 #include "checked.defs.hh"
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include <iosfwd>
 
 namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Checked_Number_Transparent_Policy {
-  //! Checks for overflowed result.
-  static const int check_overflow = 0;
-
-  //! Checks for attempts to add infinities with different sign.
-  static const int check_inf_add_inf = 0;
-
-  //! Checks for attempts to sub infinities with same sign.
-  static const int check_inf_sub_inf = 0;
-
-  //! Checks for attempts to mul infinities by zero.
-  static const int check_inf_mul_zero = 0;
-
-  //! Checks for attempts to divide by zero.
-  static const int check_div_zero = 0;
-
-  //! Checks for attempts to divide infinities.
-  static const int check_inf_div_inf = 0;
-
-  //! Checks for attempts to compute remainder of infinities.
-  static const int check_inf_mod = 0;
-
-  //! Checks for attempts to take the square root of a negative number.
-  static const int check_sqrt_neg = 0;
-
-  //! Handles not-a-number special value.
-  static const int handle_nan = 0;
-
-  //! Handles infinity special values.
-  static const int handle_infinity = 0;
-
-  //! Representation is identical to primitive.
-  static const int convertible = 1;
-
-  //! Checks for FPU inexact result.
-  static const int fpu_check_inexact = 0;
-
-  //! Checks for NaN arguments
-  static const int check_nan_args = 0;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Checked_Number_Default_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, false);
+  const_bool_nodef(has_infinity, false);
+  const_bool_nodef(convertible, true);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, true);
   static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
   static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
   static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
@@ -80,56 +58,58 @@ struct Checked_Number_Transparent_Policy {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Checked_Number_Default_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 0;
-  static const int handle_infinity = 0;
-  static const int convertible = 1;
-  static const int fpu_check_inexact = 0;
-  static const int check_nan_args = 1;
-  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+  // Do not uncomment the following.
+  // The compile time error on conversions is the expected behavior.
+  // const_bool_nodef(convertible, false);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, true);
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+  static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+  // Do not uncomment the following.
+  // The compile time error is the expected behavior.
+  // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
   static void handle_result(Result r);
 };
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Extended_Number_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 1;
-  static const int handle_infinity = 1;
-  // Don't uncomment the following.
-  // The compile time error on conversions is the expected behaviour.
-  // static const int convertible = 0;
-#ifdef DEBUG_ROUND_NOT_NEEDED
-  static const int fpu_check_inexact = 1;
-#else
-  static const int fpu_check_inexact = 0;
-#endif
-  static const int check_nan_args = 1;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct WRD_Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+  // Do not uncomment the following.
+  // The compile time error on conversions is the expected behavior.
+  // const_bool_nodef(convertible, false);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, false);
   static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
   static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
-  // Don't uncomment the following.
-  // The compile time error is the expected behaviour.
+  // Do not uncomment the following.
+  // The compile time error is the expected behavior.
   // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
   // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
   // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
@@ -138,17 +118,47 @@ struct Extended_Number_Policy {
   static void handle_result(Result r);
 };
 
-typedef Checked::Check_Overflow_Policy Default_To_Policy;
-typedef Checked_Number_Transparent_Policy Default_From_Policy;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Check_Overflow_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+  const_bool_nodef(convertible, true);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, true);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_From_Wrapper;
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
-struct Native_Checked_From_Wrapper {
-  typedef Default_From_Policy Policy;
+struct Native_Checked_From_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Checked_Number_Transparent_Policy<T> Policy;
   static const T& raw_value(const T& v) {
     return v;
   }
 };
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T, typename P>
 struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
   typedef P Policy;
@@ -157,14 +167,26 @@ struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
   }
 };
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_To_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
-struct Native_Checked_To_Wrapper {
-  typedef Default_To_Policy Policy;
+struct Native_Checked_To_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Check_Overflow_Policy<T> Policy;
   static T& raw_value(T& v) {
     return v;
   }
 };
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T, typename P>
 struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
   typedef P Policy;
@@ -173,6 +195,19 @@ struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
   }
 };
 
+/*! \ingroup PPL_CXX_interface */
+template <typename T>
+struct Is_Checked : public False { };
+
+/*! \ingroup PPL_CXX_interface */
+template <typename T, typename P>
+struct Is_Checked<Checked_Number<T, P> > : public True { };
+
+/*! \ingroup PPL_CXX_interface */
+template <typename T>
+struct Is_Native_Or_Checked
+  : public Bool<Is_Native<T>::value || Is_Checked<T>::value> { };
+
 //! A wrapper for numeric types implementing a given policy.
 /*! \ingroup PPL_CXX_interface
   The wrapper and related functions implement an interface which is common
@@ -199,48 +234,48 @@ public:
   Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
 
   //! Direct initialization from a signed char and rounding mode.
-  Checked_Number(const signed char y, Rounding_Dir dir);
+  Checked_Number(signed char y, Rounding_Dir dir);
 
   //! Direct initialization from a signed short and rounding mode.
-  Checked_Number(const signed short y, Rounding_Dir dir);
+  Checked_Number(signed short y, Rounding_Dir dir);
 
   //! Direct initialization from a signed int and rounding mode.
-  Checked_Number(const signed int y, Rounding_Dir dir);
+  Checked_Number(signed int y, Rounding_Dir dir);
 
   //! Direct initialization from a signed long and rounding mode.
-  Checked_Number(const signed long y, Rounding_Dir dir);
+  Checked_Number(signed long y, Rounding_Dir dir);
 
   //! Direct initialization from a signed long long and rounding mode.
-  Checked_Number(const signed long long y, Rounding_Dir dir);
+  Checked_Number(signed long long y, Rounding_Dir dir);
 
   //! Direct initialization from an unsigned char and rounding mode.
-  Checked_Number(const unsigned char y, Rounding_Dir dir);
+  Checked_Number(unsigned char y, Rounding_Dir dir);
 
   //! Direct initialization from an unsigned short and rounding mode.
-  Checked_Number(const unsigned short y, Rounding_Dir dir);
+  Checked_Number(unsigned short y, Rounding_Dir dir);
 
   //! Direct initialization from an unsigned int and rounding mode.
-  Checked_Number(const unsigned int y, Rounding_Dir dir);
+  Checked_Number(unsigned int y, Rounding_Dir dir);
 
   //! Direct initialization from an unsigned long and rounding mode.
-  Checked_Number(const unsigned long y, Rounding_Dir dir);
+  Checked_Number(unsigned long y, Rounding_Dir dir);
 
   //! Direct initialization from an unsigned long long and rounding mode.
-  Checked_Number(const unsigned long long y, Rounding_Dir dir);
+  Checked_Number(unsigned long long y, Rounding_Dir dir);
 
 #if PPL_SUPPORTED_FLOAT
   //! Direct initialization from a float and rounding mode.
-  Checked_Number(const float y, Rounding_Dir dir);
+  Checked_Number(float y, Rounding_Dir dir);
 #endif
 
 #if PPL_SUPPORTED_DOUBLE
   //! Direct initialization from a double and rounding mode.
-  Checked_Number(const double y, Rounding_Dir dir);
+  Checked_Number(double y, Rounding_Dir dir);
 #endif
 
 #if PPL_SUPPORTED_LONG_DOUBLE
   //! Direct initialization from a long double and rounding mode.
-  Checked_Number(const long double y, Rounding_Dir dir);
+  Checked_Number(long double y, Rounding_Dir dir);
 #endif
 
   //! Direct initialization from a rational and rounding mode.
@@ -252,57 +287,48 @@ public:
   //! Direct initialization from a C string and rounding mode.
   Checked_Number(const char* y, Rounding_Dir dir);
 
-  //! Direct initialization from minus infinity and rounding mode.
-  Checked_Number(const Minus_Infinity& y, Rounding_Dir dir);
-
-  //! Direct initialization from plus infinity and rounding mode.
-  Checked_Number(const Plus_Infinity& y, Rounding_Dir dir);
-
-  //! Direct initialization from NAN and rounding mode.
-  Checked_Number(const Not_A_Number& y, Rounding_Dir dir);
-
   //! Direct initialization from a Checked_Number, default rounding mode.
   template <typename From, typename From_Policy>
   explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
 
   //! Direct initialization from a signed char, default rounding mode.
-  Checked_Number(const signed char y);
+  Checked_Number(signed char y);
 
   //! Direct initialization from a signed short, default rounding mode.
-  Checked_Number(const signed short y);
+  Checked_Number(signed short y);
 
   //! Direct initialization from a signed int, default rounding mode.
-  Checked_Number(const signed int y);
+  Checked_Number(signed int y);
 
   //! Direct initialization from a signed long, default rounding mode.
-  Checked_Number(const signed long y);
+  Checked_Number(signed long y);
 
   //! Direct initialization from a signed long long, default rounding mode.
-  Checked_Number(const signed long long y);
+  Checked_Number(signed long long y);
 
   //! Direct initialization from an unsigned char, default rounding mode.
-  Checked_Number(const unsigned char y);
+  Checked_Number(unsigned char y);
 
   //! Direct initialization from an unsigned short, default rounding mode.
-  Checked_Number(const unsigned short y);
+  Checked_Number(unsigned short y);
 
   //! Direct initialization from an unsigned int, default rounding mode.
-  Checked_Number(const unsigned int y);
+  Checked_Number(unsigned int y);
 
   //! Direct initialization from an unsigned long, default rounding mode.
-  Checked_Number(const unsigned long y);
+  Checked_Number(unsigned long y);
 
   //! Direct initialization from an unsigned long long, default rounding mode.
-  Checked_Number(const unsigned long long y);
+  Checked_Number(unsigned long long y);
 
   //! Direct initialization from a float, default rounding mode.
-  Checked_Number(const float y);
+  Checked_Number(float y);
 
   //! Direct initialization from a double, default rounding mode.
-  Checked_Number(const double y);
+  Checked_Number(double y);
 
   //! Direct initialization from a long double, default rounding mode.
-  Checked_Number(const long double y);
+  Checked_Number(long double y);
 
   //! Direct initialization from a rational, default rounding mode.
   Checked_Number(const mpq_class& y);
@@ -313,15 +339,6 @@ public:
   //! Direct initialization from a C string, default rounding mode.
   Checked_Number(const char* y);
 
-  //! Direct initialization from minus infinity, default rounding mode.
-  Checked_Number(const Minus_Infinity& y);
-
-  //! Direct initialization from plus infinity, default rounding mode.
-  Checked_Number(const Plus_Infinity& y);
-
-  //! Direct initialization from NAN, default rounding mode.
-  Checked_Number(const Not_A_Number& y);
-
   //@} // Constructors
 
   //! \name Accessors and Conversions
@@ -367,15 +384,6 @@ public:
   template <typename From>
   Checked_Number& operator=(const From& y);
 
-  //! Assignment operator.
-  Checked_Number& operator=(const Not_A_Number& y);
-
-  //! Assignment operator.
-  Checked_Number& operator=(const Minus_Infinity& y);
-
-  //! Assignment operator.
-  Checked_Number& operator=(const Plus_Infinity& y);
-
   //! Add and assign operator.
   template <typename From_Policy>
   Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
@@ -384,11 +392,10 @@ public:
   Checked_Number& operator+=(const T& y);
 
   //! Add and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator+=(const Checked_Number<From, From_Policy>& y);
-
   template <typename From>
-  Checked_Number& operator+=(const From& y);
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator+=(const From& y);
 
   //! Subtract and assign operator.
   template <typename From_Policy>
@@ -398,12 +405,10 @@ public:
   Checked_Number& operator-=(const T& y);
 
   //! Subtract and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator-=(const Checked_Number<From, From_Policy>& y);
-
-  //! Subtract and assign operator.
   template <typename From>
-  Checked_Number& operator-=(const From& y);
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator-=(const From& y);
 
   //! Multiply and assign operator.
   template <typename From_Policy>
@@ -411,14 +416,12 @@ public:
 
   //! Multiply and assign operator.
   Checked_Number& operator*=(const T& y);
-  template <typename From, typename From_Policy>
-
-  //! Multiply and assign operator.
-  Checked_Number& operator*=(const Checked_Number<From, From_Policy>& y);
 
   //! Multiply and assign operator.
   template <typename From>
-  Checked_Number& operator*=(const From& y);
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator*=(const From& y);
 
   //! Divide and assign operator.
   template <typename From_Policy>
@@ -428,12 +431,10 @@ public:
   Checked_Number& operator/=(const T& y);
 
   //! Divide and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator/=(const Checked_Number<From, From_Policy>& y);
-
-  //! Divide and assign operator.
   template <typename From>
-  Checked_Number& operator/=(const From& y);
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator/=(const From& y);
 
   //! Compute remainder and assign operator.
   template <typename From_Policy>
@@ -443,12 +444,10 @@ public:
   Checked_Number& operator%=(const T& y);
 
   //! Compute remainder and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator%=(const Checked_Number<From, From_Policy>& y);
-
-  //! Compute remainder and assign operator.
   template <typename From>
-  Checked_Number& operator%=(const From& y);
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>& >::type
+  operator%=(const From& y);
 
   //@} // Assignment Operators
 
@@ -475,29 +474,58 @@ private:
   T v;
 };
 
-template <typename T, typename Policy>
-bool is_not_a_number(const Checked_Number<T, Policy>& x);
-template <typename T, typename Policy>
-bool is_minus_infinity(const Checked_Number<T, Policy>& x);
-template <typename T, typename Policy>
-bool is_plus_infinity(const Checked_Number<T, Policy>& x);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Slow_Copy<Checked_Number<T, P> > : public Bool<Slow_Copy<T>::value> {};
 
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+is_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x);
+
+/*! \relates Checked_Number */
 template <typename To>
-Result assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir);
-template <typename To>
-Result assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir);
-template <typename To>
-Result assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir);
-template <typename To>
-Result assign_r(To& to, const char* x, Rounding_Dir dir);
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
 template <typename To, typename To_Policy>
-Result assign_r(To& to, char* x, Rounding_Dir dir);
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, char* x, Rounding_Dir dir);
 
 #define FUNC1(name) \
 template <typename To, typename From> \
-Result name(To& to, const From& x, Rounding_Dir dir);
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+name(To& to, const From& x, Rounding_Dir dir);
 
 FUNC1(assign_r)
+FUNC1(floor_assign_r)
+FUNC1(ceil_assign_r)
+FUNC1(trunc_assign_r)
 FUNC1(neg_assign_r)
 FUNC1(abs_assign_r)
 FUNC1(sqrt_assign_r)
@@ -506,7 +534,10 @@ FUNC1(sqrt_assign_r)
 
 #define FUNC1(name) \
 template <typename To, typename From> \
-Result name(To& to, const From& x, int exp, Rounding_Dir dir);
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+name(To& to, const From& x, int exp, Rounding_Dir dir);
 
 FUNC1(mul2exp_assign_r)
 FUNC1(div2exp_assign_r)
@@ -515,12 +546,17 @@ FUNC1(div2exp_assign_r)
 
 #define FUNC2(name) \
 template <typename To, typename From1, typename From2> \
-Result name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+                   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
 
 FUNC2(add_assign_r)
 FUNC2(sub_assign_r)
 FUNC2(mul_assign_r)
 FUNC2(div_assign_r)
+FUNC2(idiv_assign_r)
 FUNC2(rem_assign_r)
 FUNC2(gcd_assign_r)
 FUNC2(lcm_assign_r)
@@ -530,35 +566,25 @@ FUNC2(sub_mul_assign_r)
 #undef FUNC2
 
 #define FUNC4(name) \
-template <typename To1, typename From1, typename From2,		\
-	  typename To2, typename To3>				\
-Result name(To1& to, const From1& x, const From2& y,		\
-	    To2& s, To3& t, Rounding_Dir dir);
+template <typename To1, typename To2, typename To3, \
+	  typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To1>::value \
+                   && Is_Native_Or_Checked<To2>::value \
+                   && Is_Native_Or_Checked<To3>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+		   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+name(To1& to, To2& s, To3& t, \
+     const From1& x, const From2& y, \
+     Rounding_Dir dir);
 
 FUNC4(gcdext_assign_r)
 
 #undef FUNC4
 
-//! Swaps \p *this with \p y.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
-
 //! \name Accessor Functions
 //@{
 
-//! Returns a const reference to the underlying native integer value.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-const T&
-raw_value(const Checked_Number<T, Policy>& x);
-
-//! Returns a reference to the underlying native integer value.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-T&
-raw_value(Checked_Number<T, Policy>& x);
-
 //@} // Accessor Functions
 
 //! \name Memory Size Inspection Functions
@@ -573,7 +599,7 @@ total_memory_in_bytes(const Checked_Number<T, Policy>& x);
 //! Returns the size in bytes of the memory managed by \p x.
 /*! \relates Checked_Number */
 template <typename T, typename Policy>
-size_t
+memory_size_type
 external_memory_in_bytes(const Checked_Number<T, Policy>& x);
 
 //@} // Memory Size Inspection Functions
@@ -593,12 +619,66 @@ template <typename T, typename Policy>
 Checked_Number<T, Policy>
 operator-(const Checked_Number<T, Policy>& x);
 
+//! Assigns to \p x largest integral value not greater than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x smallest integral value not less than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x smallest integral value not less than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Round \p x to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
 //! Assigns to \p x its negation.
 /*! \relates Checked_Number */
 template <typename T, typename Policy>
 void
 neg_assign(Checked_Number<T, Policy>& x);
 
+//! Assigns to \p x the negation of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
 //! Assigns to \p x the value <CODE>x + y * z</CODE>.
 /*! \relates Checked_Number */
 template <typename T, typename Policy>
@@ -631,10 +711,10 @@ gcd_assign(Checked_Number<T, Policy>& x,
 template <typename T, typename Policy>
 void
 gcdext_assign(Checked_Number<T, Policy>& x,
-	      const Checked_Number<T, Policy>& y,
-	      const Checked_Number<T, Policy>& z,
 	      Checked_Number<T, Policy>& s,
-	      Checked_Number<T, Policy>& t);
+	      Checked_Number<T, Policy>& t,
+	      const Checked_Number<T, Policy>& y,
+	      const Checked_Number<T, Policy>& z);
 
 //! Assigns to \p x the least common multiple of \p y and \p z.
 /*! \relates Checked_Number */
@@ -671,51 +751,99 @@ void sqrt_assign(Checked_Number<T, Policy>& x,
 
 //! Equality operator.
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator==(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator==(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+equal(const T1& x, const T2& y);
 
 //! Disequality operator.
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator!=(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator!=(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+not_equal(const T1& x, const T2& y);
 
 //! Greater than or equal to operator.
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator>=(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator>=(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+greater_or_equal(const T1& x, const T2& y);
 
 //! Greater than operator.
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator>(const Checked_Number<T1, Policy1>& x,
-	  const Checked_Number<T2, Policy2>& y);
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator>(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+greater_than(const T1& x, const T2& y);
 
 //! Less than or equal to operator.
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator<=(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator<=(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+less_or_equal(const T1& x, const T2& y);
 
 //! Less than operator.
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator<(const Checked_Number<T1, Policy1>& x,
-	  const Checked_Number<T2, Policy2>& y);
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator<(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+less_than(const T1& x, const T2& y);
 
 /*! \brief
   Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
@@ -723,9 +851,9 @@ operator<(const Checked_Number<T1, Policy1>& x,
 
   \relates Checked_Number
 */
-template <typename T, typename Policy>
-int
-sgn(const Checked_Number<T, Policy>& x);
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type \
+sgn(const From& x);
 
 /*! \brief
   Returns a negative, zero or positive value depending on whether
@@ -733,11 +861,11 @@ sgn(const Checked_Number<T, Policy>& x);
 
   \relates Checked_Number
 */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-int
-cmp(const Checked_Number<T1, Policy1>& x,
-    const Checked_Number<T2, Policy2>& y);
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y);
 
 //@} // Relational Operators and Comparison Functions
 
@@ -745,10 +873,10 @@ cmp(const Checked_Number<T1, Policy1>& x,
 //@{
 
 /*! \relates Checked_Number */
-template <typename T, typename Policy>
-Result
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
 output(std::ostream& os,
-       const Checked_Number<T, Policy>& x,
+       const T& x,
        const Numeric_Format& fmt,
        Rounding_Dir dir);
 
@@ -758,6 +886,11 @@ template <typename T, typename Policy>
 std::ostream&
 operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
 
+//! Ascii dump for native or checked.
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t);
+
 //! Input function.
 /*!
   \relates Checked_Number
@@ -879,9 +1012,9 @@ digits  : DIGIT						;
 							;
 \endcode
 */
-template <typename T, typename Policy>
-Result
-input(std::istream& is, Checked_Number<T, Policy>& x, Rounding_Dir dir);
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir);
 
 //! Input operator.
 /*! \relates Checked_Number */
@@ -889,6 +1022,11 @@ template <typename T, typename Policy>
 std::istream&
 operator>>(std::istream& is, Checked_Number<T, Policy>& x);
 
+//! Ascii load for native or checked.
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::ostream& s, T& t);
+
 //@} // Input-Output Operators
 
 void throw_result_exception(Result r);
@@ -905,9 +1043,24 @@ template <typename T>
 T
 not_a_number();
 
+//! Swaps \p x with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+template <typename T, typename Policy>
+struct FPU_Related<Checked_Number<T, Policy> > : public FPU_Related<T> {};
+
+template <typename T>
+void maybe_reset_fpu_inexact();
+
+template <typename T>
+int maybe_check_fpu_inexact();
+
 } // namespace Parma_Polyhedra_Library
 
 #include "Checked_Number.inlines.hh"
 #include "checked_numeric_limits.hh"
+#include "Checked_Number.templates.hh"
 
 #endif // !defined(PPL_Checked_Number_defs_hh)
diff --git a/src/Checked_Number.inlines.hh b/src/Checked_Number.inlines.hh
index 0445da2..ee4925f 100644
--- a/src/Checked_Number.inlines.hh
+++ b/src/Checked_Number.inlines.hh
@@ -1,11 +1,11 @@
 /* Checked_Number class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,6 +23,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Checked_Number_inlines_hh
 #define PPL_Checked_Number_inlines_hh 1
 
+#include "globals.defs.hh"
 #include <stdexcept>
 #include <sstream>
 
@@ -32,7 +33,7 @@ inline Rounding_Dir
 rounding_dir(Rounding_Dir dir) {
   if (dir == ROUND_NOT_NEEDED) {
 #ifdef DEBUG_ROUND_NOT_NEEDED
-    return ROUND_DIRECT;
+    return ROUND_DIRECT & ROUND_FPU_CHECK_INEXACT;
 #else
     return ROUND_IGNORE;
 #endif
@@ -55,8 +56,9 @@ check_result(Result r, Rounding_Dir dir) {
 }
 
 
+template <typename T>
 inline void
-Checked_Number_Transparent_Policy::handle_result(Result) {
+Checked_Number_Transparent_Policy<T>::handle_result(Result) {
 }
 
 inline void
@@ -71,6 +73,12 @@ Extended_Number_Policy::handle_result(Result r) {
     throw_result_exception(r);
 }
 
+inline void
+WRD_Extended_Number_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
 template <typename T, typename Policy>
 inline
 Checked_Number<T, Policy>::Checked_Number()
@@ -80,21 +88,23 @@ Checked_Number<T, Policy>::Checked_Number()
 template <typename T, typename Policy>
 inline
 Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
-  // TODO: avoid default construction of value member
-  Checked::copy<Policy>(v, y.raw_value());
+  // TODO: avoid default construction of value member.
+  Checked::copy<Policy, Policy>(v, y.raw_value());
 }
 
 template <typename T, typename Policy>
 template <typename From, typename From_Policy>
 inline
 Checked_Number<T, Policy>
-::Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
+::Checked_Number(const Checked_Number<From, From_Policy>& y,
+		 Rounding_Dir dir) {
+  // TODO: avoid default construction of value member.
   Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
 				     (v,
 				      y.raw_value(),
 				      rounding_dir(dir)),
-				     dir));
+				     dir)
+			);
 }
 
 template <typename T, typename Policy>
@@ -102,7 +112,7 @@ template <typename From, typename From_Policy>
 inline
 Checked_Number<T, Policy>
 ::Checked_Number(const Checked_Number<From, From_Policy>& y) {
-  // TODO: avoid default construction of value member
+  // TODO: avoid default construction of value member.
   Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
   Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
 				     (v,
@@ -111,18 +121,24 @@ Checked_Number<T, Policy>
 				     dir));
 }
 
-// TODO: avoid default construction of value member
+// TODO: avoid default construction of value member.
 #define DEF_CTOR(type) \
 template <typename T, typename Policy> \
 inline \
 Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
-  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
-} \
-template <typename T, typename Policy> \
-inline \
-Checked_Number<T, Policy>::Checked_Number(const type x) { \
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
-  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+  Policy::handle_result							\
+    (check_result(Checked::assign_ext<Policy, Checked_Number_Transparent_Policy<type> >	\
+		  (v, x, rounding_dir(dir)),				\
+		  dir));						\
+}									\
+template <typename T, typename Policy>					\
+inline									\
+Checked_Number<T, Policy>::Checked_Number(const type x) {		\
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;			\
+  Policy::handle_result							\
+    (check_result(Checked::assign_ext<Policy, Checked_Number_Transparent_Policy<type> >	\
+		  (v, x, rounding_dir(dir)),				\
+		  dir));						\
 }
 
 #define COND_0(...)
@@ -169,94 +185,38 @@ Checked_Number<T, Policy>::Checked_Number(const char* x) {
 				     dir));
 }
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x,
-					  Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
-
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = ROUND_IGNORE;
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
-
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x,
-					  Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
-
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
-
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x,
-					  Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
-
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
-
 template <typename T>
-inline bool
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
 is_minus_infinity(const T& x) {
-  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
 }
 
 template <typename T>
-inline bool
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
 is_plus_infinity(const T& x) {
-  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
 }
 
 template <typename T>
-inline bool
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+is_infinity(const T& x) {
+  return is_minus_infinity(x) ? -1 : is_plus_infinity(x) ? 1 : 0;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
 is_not_a_number(const T& x) {
-  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
 }
 
 template <typename T>
-inline bool
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
 is_integer(const T& x) {
-  return Checked::is_int<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+  return Checked::is_int<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
 }
 
 template <typename T, typename Policy>
@@ -326,48 +286,49 @@ is_plus_infinity(const Checked_Number<T, Policy>& x) {
 template <typename T, typename Policy>
 inline memory_size_type
 total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
-  return Checked::total_memory_in_bytes(x.raw_value());
+  return total_memory_in_bytes(x.raw_value());
 }
 
 /*! \relates Checked_Number */
 template <typename T, typename Policy>
 inline memory_size_type
 external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
-  return Checked::external_memory_in_bytes(x.raw_value());
+  return external_memory_in_bytes(x.raw_value());
 }
 
-template <typename To>
-inline Result
-assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir) {
-  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
-}
-template <typename To>
-inline Result
-assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir) {
-  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
-}
-template <typename To>
-inline Result
-assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir) {
-  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
-}
 
+/*! \relates Checked_Number */
 template <typename To>
-inline Result
+inline typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
 assign_r(To& to, const char* x, Rounding_Dir dir) {
   std::istringstream s(x);
-  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), s, rounding_dir(dir)), dir);
+  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>
+		      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+				s,
+				rounding_dir(dir)),
+		      dir);
 }
 
 #define FUNC1(name, func) \
-template <typename To, typename From> \
-inline Result \
-name(To& to, const From& x, Rounding_Dir dir) { \
-  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), rounding_dir(dir)), dir); \
+template <typename To, typename From>					\
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type                                 \
+name(To& to, const From& x, Rounding_Dir dir) {				\
+  return								\
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>	\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From>		\
+		 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+			   Native_Checked_From_Wrapper<From>::raw_value(x), \
+			   rounding_dir(dir)), dir);			\
 }
 
 FUNC1(construct, construct_ext)
 FUNC1(assign_r, assign_ext)
+FUNC1(floor_assign_r, floor_ext)
+FUNC1(ceil_assign_r, ceil_ext)
+FUNC1(trunc_assign_r, trunc_ext)
 FUNC1(neg_assign_r, neg_ext)
 FUNC1(abs_assign_r, abs_ext)
 FUNC1(sqrt_assign_r, sqrt_ext)
@@ -375,10 +336,20 @@ FUNC1(sqrt_assign_r, sqrt_ext)
 #undef FUNC1
 
 #define FUNC1(name, func) \
-template <typename To, typename From> \
-inline Result \
-name(To& to, const From& x, int exp, Rounding_Dir dir) { \
-  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), exp, rounding_dir(dir)), dir); \
+template <typename To, typename From>					\
+inline typename Enable_If<Is_Native_Or_Checked<To>::value		\
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type					\
+name(To& to, const From& x, int exp, Rounding_Dir dir) {		\
+  return								\
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>	\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From>		\
+		 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+			   Native_Checked_From_Wrapper<From>::raw_value(x), \
+			   exp,						\
+			   rounding_dir(dir)),				\
+		 dir);							\
 }
 
 FUNC1(mul2exp_assign_r, mul2exp_ext)
@@ -387,18 +358,30 @@ FUNC1(div2exp_assign_r, div2exp_ext)
 #undef FUNC1
 
 #define FUNC2(name, func) \
-template <typename To, \
-          typename From1, \
-	  typename From2> \
-inline Result \
-name(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
-  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From1>::Policy, typename Native_Checked_From_Wrapper<From2>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From1>::raw_value(x), Native_Checked_From_Wrapper<From2>::raw_value(y), rounding_dir(dir)), dir); \
+template <typename To, typename From1, typename From2>			\
+inline typename Enable_If<Is_Native_Or_Checked<To>::value		\
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type					\
+name(To& to, const From1& x, const From2& y, Rounding_Dir dir) {	\
+  return								\
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>	\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From1>		\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From2>		\
+		 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+			   Native_Checked_From_Wrapper<From1>::raw_value(x), \
+			   Native_Checked_From_Wrapper<From2>::raw_value(y), \
+			   rounding_dir(dir)),				\
+		 dir);							\
 }
 
 FUNC2(add_assign_r, add_ext)
 FUNC2(sub_assign_r, sub_ext)
 FUNC2(mul_assign_r, mul_ext)
 FUNC2(div_assign_r, div_ext)
+FUNC2(idiv_assign_r, idiv_ext)
 FUNC2(rem_assign_r, rem_ext)
 FUNC2(gcd_assign_r, gcd_ext)
 FUNC2(lcm_assign_r, lcm_ext)
@@ -409,25 +392,30 @@ FUNC2(sub_mul_assign_r, sub_mul_ext)
 
 #define FUNC4(name, func)						\
 template <typename To1,							\
-          typename From1,						\
-          typename From2,						\
           typename To2,							\
-	  typename To3>							\
-inline Result								\
-name(To1& to, const From1& x, const From2& y, To2& s, To3& t,		\
+	  typename To3,							\
+          typename From1,						\
+          typename From2>						\
+inline typename Enable_If<Is_Native_Or_Checked<To1>::value		\
+                          && Is_Native_Or_Checked<To2>::value           \
+                          && Is_Native_Or_Checked<To3>::value           \
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type					\
+name(To1& to, To2& s, To3& t, const From1& x, const From2& y,		\
      Rounding_Dir dir) {						\
   return								\
     check_result							\
     (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,	\
-                   typename Native_Checked_From_Wrapper<From1>::Policy,	\
-                   typename Native_Checked_From_Wrapper<From2>::Policy,	\
                    typename Native_Checked_To_Wrapper<To2>::Policy,	\
-                   typename Native_Checked_To_Wrapper<To3>::Policy>	\
+                   typename Native_Checked_To_Wrapper<To3>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From1>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From2>::Policy>	\
      (Native_Checked_To_Wrapper<To1>::raw_value(to),			\
-      Native_Checked_From_Wrapper<From1>::raw_value(x),			\
-      Native_Checked_From_Wrapper<From2>::raw_value(y),			\
       Native_Checked_To_Wrapper<To2>::raw_value(s),			\
       Native_Checked_To_Wrapper<To3>::raw_value(t),			\
+      Native_Checked_From_Wrapper<From1>::raw_value(x),			\
+      Native_Checked_From_Wrapper<From2>::raw_value(y),			\
       rounding_dir(dir)),						\
      dir);								\
 }
@@ -458,17 +446,10 @@ DEF_INCREMENT(operator --, sub_assign_r)
 
 #undef DEF_INCREMENT
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline void
-swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
-  std::swap(x.raw_value(), y.raw_value());
-}
-
 template <typename T, typename Policy>
 inline Checked_Number<T, Policy>&
 Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
-  Checked::copy<Policy>(v, y.raw_value());
+  Checked::copy<Policy, Policy>(v, y.raw_value());
   return *this;
 }
 template <typename T, typename Policy>
@@ -486,24 +467,6 @@ Checked_Number<T, Policy>::operator=(const From& y) {
   Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
   return *this;
 }
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Not_A_Number& y) {
-  Policy::handle_result(assign_r(*this, y, ROUND_IGNORE));
-  return *this;
-}
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Minus_Infinity& y) {
-  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
-  return *this;
-}
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Plus_Infinity& y) {
-  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
-  return *this;
-}
 
 #define DEF_BINARY_OP_ASSIGN(f, fun) \
 template <typename T, typename Policy> \
@@ -522,17 +485,9 @@ Checked_Number<T, Policy>::f(const T& y) { \
   return *this; \
 } \
 template <typename T, typename Policy> \
-template <typename From, typename From_Policy> \
-inline Checked_Number<T, Policy>& \
-Checked_Number<T, Policy>::f(const Checked_Number<From, From_Policy>& y) { \
-  Checked_Number<T, Policy> cy(y); \
-  Policy::handle_result(fun(*this, *this, cy, \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return *this; \
-} \
-template <typename T, typename Policy> \
 template <typename From> \
-inline Checked_Number<T, Policy>& \
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, \
+                          Checked_Number<T, Policy>& >::type \
 Checked_Number<T, Policy>::f(const From& y) { \
   Checked_Number<T, Policy> cy(y); \
   Policy::handle_result(fun(*this, *this, cy, \
@@ -548,91 +503,52 @@ DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
 
 #undef DEF_BINARY_OP_ASSIGN
 
-#define DEF_BINARY_OP_TYPE(f, fun, Type) \
+#define DEF_BINARY_OP(f, fun) \
 template <typename T, typename Policy> \
 inline Checked_Number<T, Policy> \
-f(const Type x, const Checked_Number<T, Policy>& y) { \
+f(const Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r; \
+  Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename Type, typename T, typename Policy>	\
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+f(const Type& x, const Checked_Number<T, Policy>& y) { \
   Checked_Number<T, Policy> r(x); \
   Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
   return r; \
 } \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy> \
-f(const Checked_Number<T, Policy>& x, const Type y) { \
+template <typename T, typename Policy, typename Type>	\
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+f(const Checked_Number<T, Policy>& x, const Type& y) { \
   Checked_Number<T, Policy> r(y); \
   Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
   return r; \
 }
 
-#define DEF_BINARY_OP(f, fun) \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy> \
-f(const Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
-  Checked_Number<T, Policy> r; \
-  Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
-  return r; \
-} \
-DEF_BINARY_OP_TYPE(f, fun, signed char) \
-DEF_BINARY_OP_TYPE(f, fun, signed short) \
-DEF_BINARY_OP_TYPE(f, fun, signed int) \
-DEF_BINARY_OP_TYPE(f, fun, signed long) \
-DEF_BINARY_OP_TYPE(f, fun, signed long long) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned char) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned short) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned int) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned long) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned long long) \
-COND(PPL_SUPPORTED_FLOAT, DEF_BINARY_OP_TYPE(f, fun, float)) \
-COND(PPL_SUPPORTED_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, double)) \
-COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, long double)) \
-DEF_BINARY_OP_TYPE(f, fun, mpz_class&) \
-DEF_BINARY_OP_TYPE(f, fun, mpq_class&)
-
 DEF_BINARY_OP(operator +, add_assign_r)
 DEF_BINARY_OP(operator -, sub_assign_r)
 DEF_BINARY_OP(operator *, mul_assign_r)
 DEF_BINARY_OP(operator /, div_assign_r)
 DEF_BINARY_OP(operator %, rem_assign_r)
 
-#undef DEF_BINARY_OP_TYPE
 #undef DEF_BINARY_OP
 
-#define DEF_COMPARE_TYPE(f, fun, Type) \
-template <typename From, typename From_Policy> \
-inline bool \
-f(const Type x, const Checked_Number<From, From_Policy>& y) { \
-  return Checked::fun<Default_From_Policy, From_Policy>(x, y.raw_value()); \
-} \
-template <typename From, typename From_Policy> \
-inline bool \
-f(const Checked_Number<From, From_Policy>& x, const Type y) { \
-  return Checked::fun<From_Policy, Default_From_Policy>(x.raw_value(), y); \
-}
-
-#define DEF_COMPARE(f, fun) \
-template <typename T1, typename Policy1, \
-          typename T2, typename Policy2> \
-inline bool \
-f(const Checked_Number<T1, Policy1>& x, \
-  const Checked_Number<T2, Policy2>& y) { \
-  return Checked::fun<Policy1, Policy2>(x.raw_value(), y.raw_value()); \
-} \
-DEF_COMPARE_TYPE(f, fun, signed char) \
-DEF_COMPARE_TYPE(f, fun, signed short) \
-DEF_COMPARE_TYPE(f, fun, signed int) \
-DEF_COMPARE_TYPE(f, fun, signed long) \
-DEF_COMPARE_TYPE(f, fun, signed long long) \
-DEF_COMPARE_TYPE(f, fun, unsigned char) \
-DEF_COMPARE_TYPE(f, fun, unsigned short) \
-DEF_COMPARE_TYPE(f, fun, unsigned int) \
-DEF_COMPARE_TYPE(f, fun, unsigned long) \
-DEF_COMPARE_TYPE(f, fun, unsigned long long) \
-COND(PPL_SUPPORTED_FLOAT, DEF_COMPARE_TYPE(f, fun, float)) \
-COND(PPL_SUPPORTED_DOUBLE, DEF_COMPARE_TYPE(f, fun, double)) \
-COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_COMPARE_TYPE(f, fun, long double)) \
-DEF_COMPARE_TYPE(f, fun, mpz_class&) \
-DEF_COMPARE_TYPE(f, fun, mpq_class&)
-
+#define DEF_COMPARE(f, fun)						\
+template <typename T1, typename T2>					\
+inline									\
+typename Enable_If<Is_Native_Or_Checked<T1>::value                      \
+                   && Is_Native_Or_Checked<T2>::value                   \
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),	\
+		   bool>::type						\
+f(const T1& x, const T2& y) {						\
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy,	\
+    		      typename Native_Checked_From_Wrapper<T2>::Policy>	\
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),			\
+     Native_Checked_From_Wrapper<T2>::raw_value(y));			\
+}
 
 DEF_COMPARE(operator ==, eq_ext)
 DEF_COMPARE(operator !=, ne_ext)
@@ -641,7 +557,27 @@ DEF_COMPARE(operator >, gt_ext)
 DEF_COMPARE(operator <=, le_ext)
 DEF_COMPARE(operator <, lt_ext)
 
-#undef DEF_COMPARE_TYPE
+#undef DEF_COMPARE
+
+#define DEF_COMPARE(f, fun)						\
+template <typename T1, typename T2>					\
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value		\
+			  && Is_Native_Or_Checked<T2>::value,		\
+                          bool>::type					\
+f(const T1& x, const T2& y) {						\
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy,	\
+    		      typename Native_Checked_From_Wrapper<T2>::Policy>	\
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),			\
+     Native_Checked_From_Wrapper<T2>::raw_value(y));			\
+}
+
+DEF_COMPARE(equal, eq_ext)
+DEF_COMPARE(not_equal, ne_ext)
+DEF_COMPARE(greater_or_equal, ge_ext)
+DEF_COMPARE(greater_than, gt_ext)
+DEF_COMPARE(less_or_equal, le_ext)
+DEF_COMPARE(less_than, lt_ext)
+
 #undef DEF_COMPARE
 
 /*! \relates Checked_Number */
@@ -685,21 +621,36 @@ f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
 #define DEF_ASSIGN_FUN5_5(f, fun)					\
 template <typename T, typename Policy>					\
 inline void								\
-f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y,	\
-  const Checked_Number<T, Policy>& z,					\
-  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t) {		\
-  Policy::handle_result(fun(x, y, z, s, t, Policy::ROUND_DEFAULT_FUNCTION)); \
+f(Checked_Number<T, Policy>& x,						\
+  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t,		\
+  const Checked_Number<T, Policy>& y,					\
+  const Checked_Number<T, Policy>& z) {					\
+  Policy::handle_result(fun(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
 }
 
 DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
 
+DEF_ASSIGN_FUN2_1(floor_assign, floor_assign_r)
+DEF_ASSIGN_FUN2_2(floor_assign, floor_assign_r)
+
+DEF_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r)
+DEF_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r)
+
+DEF_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r)
+DEF_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r)
+
 DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
 DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
 
+DEF_ASSIGN_FUN2_1(abs_assign, abs_assign_r)
+DEF_ASSIGN_FUN2_2(abs_assign, abs_assign_r)
+
 DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
 
 DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
 
+DEF_ASSIGN_FUN3_3(rem_assign, rem_assign_r)
+
 DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
 
 DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
@@ -720,10 +671,10 @@ exact_div_assign(Checked_Number<T, Policy>& x,
 }
 
 /*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline int
-sgn(const Checked_Number<T, Policy>& x) {
-  Result r = Checked::sgn_ext<Policy>(x.raw_value());
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type
+sgn(const From& x) {
+  Result r = Checked::sgn_ext<typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_From_Wrapper<From>::raw_value(x));
   switch (r) {
   case V_LT:
     return -1;
@@ -737,12 +688,16 @@ sgn(const Checked_Number<T, Policy>& x) {
 }
 
 /*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-inline int
-cmp(const Checked_Number<T1, Policy1>& x,
-    const Checked_Number<T2, Policy2>& y) {
-  Result r = Checked::cmp_ext<Policy1, Policy2>(x.raw_value(), y.raw_value());
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y) {
+  Result r
+    = Checked::cmp_ext<typename Native_Checked_From_Wrapper<From1>::Policy,
+                       typename Native_Checked_From_Wrapper<From2>::Policy>
+                 (Native_Checked_From_Wrapper<From1>::raw_value(x),
+		  Native_Checked_From_Wrapper<From2>::raw_value(y));
   switch (r) {
   case V_LT:
     return -1;
@@ -756,14 +711,15 @@ cmp(const Checked_Number<T1, Policy1>& x,
 }
 
 /*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline Result
-output(std::ostream& os, const Checked_Number<T, Policy>& x,
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os, const T& x,
        const Numeric_Format& fmt, Rounding_Dir dir) {
-  return check_result(Checked::output_ext<Policy>(os,
-						  x.raw_value(),
-						  fmt,
-						  rounding_dir(dir)),
+  return check_result(Checked::output_ext<typename Native_Checked_From_Wrapper<T>::Policy>
+		      (os,
+		       Native_Checked_From_Wrapper<T>::raw_value(x),
+		       fmt,
+		       rounding_dir(dir)),
 		      dir);
 }
 
@@ -776,12 +732,13 @@ operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
 }
 
 /*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline Result
-input(Checked_Number<T, Policy>& x, std::istream& is, Rounding_Dir dir) {
-  return check_result(Checked::input_ext<Policy>(x.raw_value(),
-						 is,
-						 rounding_dir(dir)),
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir) {
+  return check_result(Checked::input_ext<typename Native_Checked_To_Wrapper<T>::Policy>
+		      (Native_Checked_To_Wrapper<T>::raw_value(x),
+		       is,
+		       rounding_dir(dir)),
 		      dir);
 }
 
@@ -815,6 +772,30 @@ not_a_number() {
   return NOT_A_NUMBER;
 }
 
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+  using std::swap;
+  swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T>
+inline void
+maybe_reset_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_reset_inexact();
+}
+
+template <typename T>
+inline int
+maybe_check_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_check_inexact();
+  else
+    return 0;
+}
+
 } // namespace Parma_Polyhedra_Library
 
 #endif // !defined(PPL_Checked_Number_inlines_hh)
diff --git a/src/Checked_Number.templates.hh b/src/Checked_Number.templates.hh
new file mode 100644
index 0000000..a82ed13
--- /dev/null
+++ b/src/Checked_Number.templates.hh
@@ -0,0 +1,147 @@
+/* Checked_Number class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Checked_Number_templates_hh
+#define PPL_Checked_Number_templates_hh 1
+
+#include <cassert>
+#include <iomanip>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t) {
+  if (std::numeric_limits<T>::is_exact)
+    // An exact datatype: pretty printer is accurate.
+    s << t;
+  else {
+    // An inexact datatype (probably floating point):
+    // first dump its hexadecimal representation ...
+    const std::ios_base::fmtflags old_flags = s.flags();
+    s << std::hex;
+    const unsigned char* p = reinterpret_cast<const unsigned char*>(&t);
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      s << std::setw(2) << std::setfill('0');
+      s << static_cast<unsigned>(p[i]);
+    }
+    s.flags(old_flags);
+    // ... and then pretty print it for readability.
+    s << " (" << t << ")";
+  }
+}
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::istream& s, T& t) {
+  if (std::numeric_limits<T>::is_exact)
+    // An exact datatype: input from pretty printed version is accurate.
+    return (s >> t);
+  else {
+    // An inexact datatype (probably floating point):
+    // first load its hexadecimal representation ...
+    std::string str;
+    if (!(s >> str) || str.size() != 2*sizeof(T))
+      return false;
+    unsigned char* p = reinterpret_cast<unsigned char*>(&t);
+    // CHECKME: any (portable) simpler way?
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      unsigned byte_value = 0;
+      for (unsigned j = 0; j < 2; ++j) {
+        byte_value <<= 4;
+        unsigned half_byte_value;
+        // Interpret single hex character.
+        switch (str[2*i+j]) {
+        case '0':
+          half_byte_value = 0;
+          break;
+        case '1':
+          half_byte_value = 1;
+          break;
+        case '2':
+          half_byte_value = 2;
+          break;
+        case '3':
+          half_byte_value = 3;
+          break;
+        case '4':
+          half_byte_value = 4;
+          break;
+        case '5':
+          half_byte_value = 5;
+          break;
+        case '6':
+          half_byte_value = 6;
+          break;
+        case '7':
+          half_byte_value = 7;
+          break;
+        case '8':
+          half_byte_value = 8;
+          break;
+        case '9':
+          half_byte_value = 9;
+          break;
+        case 'A':
+        case 'a':
+          half_byte_value = 10;
+          break;
+        case 'B':
+        case 'b':
+          half_byte_value = 11;
+          break;
+        case 'C':
+        case 'c':
+          half_byte_value = 12;
+          break;
+        case 'D':
+        case 'd':
+          half_byte_value = 13;
+          break;
+        case 'E':
+        case 'e':
+          half_byte_value = 14;
+          break;
+        case 'F':
+        case 'f':
+          half_byte_value = 15;
+          break;
+        default:
+          return false;
+        }
+        byte_value += half_byte_value;
+      }
+      assert(byte_value <= 255);
+      p[i] = static_cast<unsigned char>(byte_value);
+    }
+    // ... then read and discard pretty printed value.
+    if (!(s >> str))
+      return false;
+    const unsigned sz = str.size();
+    return sz > 2 && str[0] == '(' && str[sz-1] == ')';
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_templates_hh)
diff --git a/src/Checked_Number.types.hh b/src/Checked_Number.types.hh
index 0f0ad38..130c6d1 100644
--- a/src/Checked_Number.types.hh
+++ b/src/Checked_Number.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Coefficient.cc b/src/Coefficient.cc
index f1983df..d14c4ee 100644
--- a/src/Coefficient.cc
+++ b/src/Coefficient.cc
@@ -1,11 +1,11 @@
 /* Coefficient class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,6 +20,45 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Coefficient.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+void
+Coefficient_constants_initialize() {
+}
+
+void
+Coefficient_constants_finalize() {
+}
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+const Coefficient* Coefficient_zero_p = 0;
+const Coefficient* Coefficient_one_p = 0;
+
+void
+Coefficient_constants_initialize() {
+  assert(Coefficient_zero_p == 0);
+  Coefficient_zero_p = new Coefficient(0);
+
+  assert(Coefficient_one_p == 0);
+  Coefficient_one_p = new Coefficient(1);
+}
+
+void
+Coefficient_constants_finalize() {
+  assert(Coefficient_zero_p != 0);
+  delete Coefficient_zero_p;
+  Coefficient_zero_p = 0;
+
+  assert(Coefficient_one_p != 0);
+  delete Coefficient_one_p;
+  Coefficient_one_p = 0;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Coefficient.defs.hh b/src/Coefficient.defs.hh
index 6355525..4934a46 100644
--- a/src/Coefficient.defs.hh
+++ b/src/Coefficient.defs.hh
@@ -1,11 +1,11 @@
 /* Coefficient class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,18 +26,31 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Coefficient.types.hh"
 #include <iosfwd>
 
-#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
 #include "Checked_Number.defs.hh"
 #include "checked_int.inlines.hh"
 #endif
 
-#ifdef GMP_INTEGERS
+#ifdef PPL_GMP_INTEGERS
 #include "GMP_Integer.defs.hh"
 #endif
 
 namespace Parma_Polyhedra_Library {
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Initializes the Coefficient constants.
+#endif
+void Coefficient_constants_initialize();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Finalizes the Coefficient constants.
+#endif
+void Coefficient_constants_finalize();
+
+//! Returns a const reference to a Coefficient with value 0.
 Coefficient_traits::const_reference Coefficient_zero();
+
+//! Returns a const reference to a Coefficient with value 1.
 Coefficient_traits::const_reference Coefficient_one();
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Coefficient.inlines.hh b/src/Coefficient.inlines.hh
index ae5535c..68ae20b 100644
--- a/src/Coefficient.inlines.hh
+++ b/src/Coefficient.inlines.hh
@@ -1,11 +1,11 @@
 /* Coefficient class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,17 +25,36 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
 inline Coefficient_traits::const_reference
 Coefficient_zero() {
-  static Coefficient z(0);
-  return z;
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient zero(0);
+  return zero;
 }
 
 inline Coefficient_traits::const_reference
 Coefficient_one() {
-  static Coefficient o(1);
-  return o;
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient one(1);
+  return one;
 }
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  extern const Coefficient* Coefficient_zero_p;
+  return *Coefficient_zero_p;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  extern const Coefficient* Coefficient_one_p;
+  assert(*Coefficient_one_p != 0);
+  return *Coefficient_one_p;
+}
+#endif
 
 } // namespace Parma_Polyhedra_Library
 
diff --git a/src/Coefficient.types.hh b/src/Coefficient.types.hh
index 5d45236..2954012 100644
--- a/src/Coefficient.types.hh
+++ b/src/Coefficient.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -14,14 +14,14 @@ PURPOSE. */
 
 #include "Checked_Number.defs.hh"
 
-#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
 
 namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Coefficient traits specialization for 8 bits checked integers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Policy>
 struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
   //! The type used for references to const 8 bit checked integers.
@@ -31,7 +31,7 @@ struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Coefficient traits specialization for 16 bits checked integers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Policy>
 struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
   //! The type used for references to const 16 bit checked integers.
@@ -41,7 +41,7 @@ struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Coefficient traits specialization for 32 bits checked integers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Policy>
 struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
   //! The type used for references to const 32 bit checked integers.
@@ -51,7 +51,7 @@ struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Coefficient traits specialization for 64 bits checked integers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Policy>
 struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
   //! The type used for references to const 64 bit checked integers.
@@ -60,9 +60,9 @@ struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
 
 } // namespace Parma_Polyhedra_Library
 
-#endif // defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
 
-#ifdef GMP_INTEGERS
+#ifdef PPL_GMP_INTEGERS
 #include "GMP_Integer.types.hh"
 #endif
 
@@ -86,12 +86,12 @@ namespace Parma_Polyhedra_Library {
       for native integral types with no overflow detection
       (available template instances are as above).
 */
-typedef COEFFICIENT_TYPE Coefficient;
+typedef PPL_COEFFICIENT_TYPE Coefficient;
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! An alias for easily naming the coefficient traits.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Coefficient_traits_template.hh b/src/Coefficient_traits_template.hh
index 7dff40e..c4c341c 100644
--- a/src/Coefficient_traits_template.hh
+++ b/src/Coefficient_traits_template.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -17,7 +17,7 @@ namespace Parma_Polyhedra_Library {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Coefficient traits.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Coefficient>
 struct Coefficient_traits_template {
 };
diff --git a/src/Congruence.cc b/src/Congruence.cc
index a50c15d..03d62df 100644
--- a/src/Congruence.cc
+++ b/src/Congruence.cc
@@ -1,11 +1,11 @@
 /* Congruence class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Congruence.defs.hh"
 
@@ -41,7 +41,6 @@ PPL::Congruence::Congruence(const Constraint& c)
 	   c),
 	c.space_dimension() + 2,
 	compute_capacity(c.space_dimension() + 2, Row::max_size())) {
-
   (*this)[size()-1] = 0;
 }
 
@@ -54,7 +53,7 @@ PPL::Congruence::Congruence(const Constraint& c,
 	   c),
 	sz,
 	capacity) {
-
+  assert(sz > 1);
   (*this)[sz-1] = 0;
 }
 
@@ -88,7 +87,7 @@ PPL::Congruence::normalize() {
   if (sz == 0)
     return;
 
-  Coefficient_traits::const_reference mod = modulus();
+  const Coefficient& mod = modulus();
   if (mod == 0)
     return;
 
@@ -107,9 +106,9 @@ PPL::Congruence::strong_normalize() {
   Row::normalize();
 }
 
-/*! \relates Parma_Polyhedra_Library::Congruence */
 PPL::Congruence
-PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+PPL::Congruence::create(const Linear_Expression& e1,
+			const Linear_Expression& e2) {
   // Ensure that diff is created with capacity for the modulus.
   dimension_type dim, e1_dim, e2_dim;
   e1_dim = e1.space_dimension();
@@ -121,7 +120,7 @@ PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
   Linear_Expression diff(e1_dim > e2_dim ? e1 : e2,
 			 dim + 2);
   diff -= (e1_dim > e2_dim ? e2 : e1);
-  Congruence cg(diff, 1, false);
+  Congruence cg(diff, 1);
   return cg;
 }
 
@@ -147,10 +146,11 @@ PPL::Congruence::throw_dimension_incompatible(const char* method,
 /*! \relates Parma_Polyhedra_Library::Congruence */
 std::ostream&
 PPL::IO_Operators::operator<<(std::ostream& s, const Congruence& c) {
-  const int num_variables = c.space_dimension();
+  const dimension_type num_variables = c.space_dimension();
+  TEMP_INTEGER(cv);
   bool first = true;
-  for (int v = 0; v < num_variables; ++v) {
-    Coefficient cv = c.coefficient(Variable(v));
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    cv = c.coefficient(Variable(v));
     if (cv != 0) {
       if (!first) {
 	if (cv > 0)
@@ -182,8 +182,8 @@ PPL::Congruence::is_trivial_true() const {
   if ((is_equality() && inhomogeneous_term() == 0)
       || (is_proper_congruence()
 	  && (inhomogeneous_term() % modulus() == 0))) {
-    for (unsigned i = 1; i <= space_dimension(); i++)
-      if ((*this)[i] != 0)
+    for (unsigned i = space_dimension(); i > 0; --i)
+      if (operator[](i) != 0)
 	return false;
     return true;
   }
@@ -196,8 +196,8 @@ PPL::Congruence::is_trivial_false() const {
       || (is_proper_congruence()
 	  && ((inhomogeneous_term() % modulus()) == 0)))
     return false;
-  for (unsigned i = 1; i <= space_dimension(); i++)
-    if ((*this)[i] != 0)
+  for (unsigned i = space_dimension(); i > 0; --i)
+    if (operator[](i) != 0)
       return false;
   return true;
 }
@@ -205,38 +205,54 @@ PPL::Congruence::is_trivial_false() const {
 void
 PPL::Congruence::ascii_dump(std::ostream& s) const {
   const Row& x = *this;
-  dimension_type x_size = x.size();
-  for (dimension_type i = 0; i < x_size - 1; ++i)
-    s << x[i] << ' ';
-  if (x_size)
+  const dimension_type x_size = x.size();
+  s << "size " << x_size << " ";
+  if (x_size > 0) {
+    for (dimension_type i = 0; i < x_size - 1; ++i)
+      s << x[i] << ' ';
     s << "m " << x[x_size - 1];
+  }
   s << std::endl;
 }
 
-PPL_OUTPUT_DEFINITIONS(Congruence);
+PPL_OUTPUT_DEFINITIONS(Congruence)
 
 bool
 PPL::Congruence::ascii_load(std::istream& s) {
   std::string str;
-  Congruence& x = *this;
-  dimension_type col = 0;
-  while (col < x.size() - 1)
-    if (!(s >> x[col]))
-      return false;
-    else
-      col++;
-
-  if (!(s >> str) || str.compare("m"))
+  if (!(s >> str) || str != "size")
     return false;
-
-  if (!(s >> x[col]))
+  dimension_type new_size;
+  if (!(s >> new_size))
     return false;
 
+  Row& x = *this;
+  const dimension_type old_size = x.size();
+  if (new_size < old_size)
+    x.shrink(new_size);
+  else if (new_size > old_size) {
+    Row y(new_size, Row::Flags());
+    x.swap(y);
+  }
+
+  if (new_size > 0) {
+    for (dimension_type col = 0; col < new_size - 1; ++col)
+      if (!(s >> x[col]))
+	return false;
+    if (!(s >> str) || (str.compare("m") != 0))
+      return false;
+    if (!(s >> x[new_size-1]))
+      return false;
+  }
   return true;
 }
 
 bool
 PPL::Congruence::OK() const {
+  // A Congruence must be a valid Row.
+  if (!Row::OK())
+    return false;
+
   // Modulus check.
   if (modulus() < 0) {
 #ifndef NDEBUG
@@ -249,3 +265,28 @@ PPL::Congruence::OK() const {
   // All tests passed.
   return true;
 }
+
+const PPL::Congruence* PPL::Congruence::zero_dim_false_p = 0;
+const PPL::Congruence* PPL::Congruence::zero_dim_integrality_p = 0;
+
+void
+PPL::Congruence::initialize() {
+  assert(zero_dim_false_p == 0);
+  zero_dim_false_p
+    = new Congruence((Linear_Expression::zero() %= Coefficient(-1)) / 0);
+
+  assert(zero_dim_integrality_p == 0);
+  zero_dim_integrality_p
+    = new Congruence(Linear_Expression::zero() %= Coefficient(-1));
+}
+
+void
+PPL::Congruence::finalize() {
+  assert(zero_dim_false_p != 0);
+  delete zero_dim_false_p;
+  zero_dim_false_p = 0;
+
+  assert(zero_dim_integrality_p != 0);
+  delete zero_dim_integrality_p;
+  zero_dim_integrality_p = 0;
+}
diff --git a/src/Congruence.defs.hh b/src/Congruence.defs.hh
index d4f4059..e5c918d 100644
--- a/src/Congruence.defs.hh
+++ b/src/Congruence.defs.hh
@@ -1,11 +1,11 @@
 /* Congruence class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,8 +35,6 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Congruence_System.defs.hh"
 #include <iosfwd>
 
-namespace PPL = Parma_Polyhedra_Library;
-
 namespace Parma_Polyhedra_Library {
 
 namespace IO_Operators {
@@ -76,8 +74,7 @@ operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
 //! Returns the congruence \f$e = n \pmod{1}\f$.
 /*! \relates Congruence */
 Congruence
-operator%=(const Linear_Expression& e,
-	   const Coefficient_traits::const_reference n);
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
 
 //! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
 /*!
@@ -87,14 +84,12 @@ operator%=(const Linear_Expression& e,
   \relates Congruence
 */
 Congruence
-operator/(const Congruence& cg,
-	  const Coefficient_traits::const_reference k);
+operator/(const Congruence& cg, Coefficient_traits::const_reference k);
 
 //! Creates a congruence from \p c, with \p m as the modulus.
 /*! \relates Congruence */
 Congruence
-operator/(const Constraint& c,
-	  const Coefficient_traits::const_reference m);
+operator/(const Constraint& c, Coefficient_traits::const_reference m);
 
 } // namespace Parma_Polyhedra_Library
 
@@ -191,12 +186,12 @@ swap(Parma_Polyhedra_Library::Congruence& x,
   \code
   Congruence cg1((x - 5*y + 3*z %= 4) / 5);
   cout << "Congruence cg1: " << cg1 << endl;
-  Coefficient m = cg1.modulus();
+  const Coefficient& m = cg1.modulus();
   if (m == 0)
     cout << "Congruence cg1 is an equality." << endl;
   else {
     Linear_Expression e;
-    for (int i = cg1.space_dimension() - 1; i >= 0; --i)
+    for (dimension_type i = cg1.space_dimension(); i-- > 0; )
       e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
       e += 2 * cg1.inhomogeneous_term();
     Congruence cg2((e %= 0) / m);
@@ -256,7 +251,7 @@ public:
     the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
   */
   Congruence&
-  operator/=(const Coefficient_traits::const_reference k);
+  operator/=(Coefficient_traits::const_reference k);
 
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this is a trivially
@@ -300,6 +295,12 @@ public:
   bool is_equal_at_dimension(dimension_type dim,
 			     const Congruence& cg) const;
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   /*! \brief
     Returns a reference to the true (zero-dimension space) congruence
     \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
@@ -313,6 +314,18 @@ public:
   */
   static const Congruence& zero_dim_false();
 
+  //! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  //! Returns the congruence \f$e = n \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  //! Returns the congruence \f$n = e \pmod{1}\f$.
+  static Congruence
+  create(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
   /*! \brief
     Returns a lower bound to the total size in bytes of the memory
     occupied by \p *this.
@@ -322,14 +335,14 @@ public:
   //! Returns the size in bytes of the memory managed by \p *this.
   memory_size_type external_memory_in_bytes() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation of the internal
     representation of \p *this.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
   //! Checks if all the invariants are satisfied.
@@ -360,9 +373,18 @@ protected:
   void strong_normalize();
 
 private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the false (zero-dimension space) congruence \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence* zero_dim_false_p;
 
-  //! Returns a reference to the modulus of \p *this.
-  Coefficient& modulus();
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+    also known as the <EM>integrality congruence</EM>.
+  */
+  static const Congruence* zero_dim_integrality_p;
 
   //! Marks this congruence as a linear equality.
   void set_is_equality();
@@ -393,25 +415,17 @@ private:
 
   //! Constructs from Linear_Expression \p le, using modulus \p m.
   /*!
-     Builds a congruence with modulus \p m, stealing the coefficients
-     from \p le.
-
-     \param le
-     The Linear_Expression holding the coefficients.
+    Builds a congruence with modulus \p m, stealing the coefficients
+    from \p le.
 
-     \param m
-     The modulus for the congruence.
+    \param le
+    The Linear_Expression holding the coefficients.
 
-     \param capacity
-     If <CODE>true</CODE> then the size of the \p le row is expanded
-     and the modulus is stored in the extra space.  In this case it is
-     assumed that \p le has spare capacity of at least one element.
-     If <CODE>false</CODE> then the modulus is stored in the last
-     element of the \p le row.
+    \param m
+    The modulus for the congruence, which must be zero or greater.
   */
   Congruence(Linear_Expression& le,
-	     Coefficient_traits::const_reference m,
-	     bool capacity = true);
+	     Coefficient_traits::const_reference m);
 
   //! Swaps \p *this with \p y.
   void swap(Congruence& y);
@@ -433,40 +447,33 @@ private:
 			       Variable v) const;
 
   friend Congruence
-  PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
-
-  friend Congruence
-  PPL::operator%=(const Linear_Expression& e,
-		  const Coefficient_traits::const_reference n);
-
-  friend Congruence
-  PPL::operator/(const Congruence& cg,
-		 const Coefficient_traits::const_reference k);
-
+  operator/(const Congruence& cg, Coefficient_traits::const_reference k);
   friend Congruence
-  PPL::operator/(const Constraint& c,
-		 const Coefficient_traits::const_reference m);
+  operator/(const Constraint& c, Coefficient_traits::const_reference m);
 
   friend bool
-  PPL::operator==(const Congruence& x, const Congruence& y);
+  operator==(const Congruence& x, const Congruence& y);
 
   friend bool
-  PPL::operator!=(const Congruence& x, const Congruence& y);
+  operator!=(const Congruence& x, const Congruence& y);
 
   friend std::ostream&
-  PPL::IO_Operators::operator<<(std::ostream& s,
-				const Congruence_System& cgs);
-
-  friend class PPL::Scalar_Products;
-  friend class PPL::Congruence_System;
-  friend class PPL::Congruence_System::const_iterator;
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<(std::ostream& s,
+	       const Congruence_System& cgs);
+
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Congruence_System;
+  friend class Parma_Polyhedra_Library::Congruence_System::const_iterator;
   // FIXME: The following friend declaration is at least for
   //        operator[] access in Grid::conversion.
-  friend class PPL::Grid;
-  friend class PPL::Linear_Expression;
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::Linear_Expression;
 
   friend void
-  std::swap(PPL::Congruence& x, PPL::Congruence& y);
+  std::swap(Parma_Polyhedra_Library::Congruence& x,
+	    Parma_Polyhedra_Library::Congruence& y);
 };
 
 #include "Congruence.inlines.hh"
diff --git a/src/Congruence.inlines.hh b/src/Congruence.inlines.hh
index e318657..cc620d9 100644
--- a/src/Congruence.inlines.hh
+++ b/src/Congruence.inlines.hh
@@ -1,11 +1,11 @@
 /* Congruence class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,8 +23,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Congruence_inlines_hh
 #define PPL_Congruence_inlines_hh 1
 
-#include "Constraint.defs.hh"
 #include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
 
 #include <sstream>
 
@@ -55,54 +55,78 @@ inline
 Congruence::~Congruence() {
 }
 
-inline const Congruence&
-Congruence::zero_dim_integrality() {
-  static const Congruence zdi(Linear_Expression::zero() %= Coefficient(-1));
-  return zdi;
-}
-
-inline const Congruence&
-Congruence::zero_dim_false() {
-  static const Congruence
-    zdf((Linear_Expression::zero() %= Coefficient_one()) / 0);
-  return zdf;
+inline
+Congruence::Congruence(Linear_Expression& le,
+		       Coefficient_traits::const_reference m) {
+  Row::swap(static_cast<Row&>(le));
+  assert(m >= 0);
+  (*this)[size()-1] = m;
 }
 
-inline Congruence&
-Congruence::operator=(const Congruence& c) {
-  Row::operator=(c);
-  return *this;
+inline Congruence
+Congruence::create(const Linear_Expression& e,
+		   Coefficient_traits::const_reference n) {
+  // Ensure that diff has capacity for the modulus.
+  Linear_Expression diff(e, e.space_dimension() + 2);
+  diff -= n;
+  Congruence cg(diff, 1);
+  return cg;
 }
 
-/*! \relates Parma_Polyhedra_Library::Congruence */
 inline Congruence
-operator%=(const Linear_Expression& e,
-	   const Coefficient_traits::const_reference n) {
+Congruence::create(Coefficient_traits::const_reference n,
+		   const Linear_Expression& e) {
   // Ensure that diff has capacity for the modulus.
   Linear_Expression diff(e, e.space_dimension() + 2);
   diff -= n;
-  Congruence cg(diff, 1, false);
+  Congruence cg(diff, 1);
   return cg;
 }
 
 /*! \relates Parma_Polyhedra_Library::Congruence */
 inline Congruence
-operator/(const Congruence& cg,
-	  const Coefficient_traits::const_reference k) {
-  Congruence ret (cg, k);
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return Congruence::create(e1, e2);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return Congruence::create(e, n);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k) {
+  Congruence ret(cg, k);
   return ret;
 }
 
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+  return *zero_dim_integrality_p;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+  return *zero_dim_false_p;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& c) {
+  Row::operator=(c);
+  return *this;
+}
+
 /*! \relates Congruence */
 inline Congruence
-operator/(const Constraint& c,
-	  const Coefficient_traits::const_reference m) {
-  Congruence ret (c);
+operator/(const Constraint& c, Coefficient_traits::const_reference m) {
+  Congruence ret(c);
   return ret / m;
 }
 
 inline Congruence&
-Congruence::operator/=(const Coefficient_traits::const_reference k) {
+Congruence::operator/=(Coefficient_traits::const_reference k) {
   if (k >= 0)
     (*this)[size()-1] *= k;
   else
@@ -152,13 +176,7 @@ Congruence::inhomogeneous_term() const {
 
 inline Coefficient_traits::const_reference
 Congruence::modulus() const {
-  assert(size() > 0);
-  return (*this)[size()-1];
-}
-
-inline Coefficient&
-Congruence::modulus() {
-  assert(size() > 0);
+  assert(size() > 1);
   return (*this)[size()-1];
 }
 
@@ -180,7 +198,7 @@ Congruence::is_equal_at_dimension(dimension_type dim,
 
 inline void
 Congruence::set_is_equality() {
-  modulus() = 0;
+  (*this)[size()-1] = 0;
 }
 
 inline void
@@ -199,19 +217,6 @@ Congruence::total_memory_in_bytes() const {
   return Row::total_memory_in_bytes();
 }
 
-inline
-Congruence::Congruence(Linear_Expression& le,
-		       Coefficient_traits::const_reference m,
-		       bool capacity) {
-  Row::swap(static_cast<Row&>(le));
-  if (capacity)
-    Row::expand_within_capacity(size()+1);
-  if (m >= 0)
-    (*this)[size()-1] = m;
-  else
-    (*this)[size()-1] = -m;
-}
-
 inline void
 Congruence::swap(Congruence& y) {
   Row::swap(y);
diff --git a/src/Congruence.types.hh b/src/Congruence.types.hh
index 3d57459..a6bc34e 100644
--- a/src/Congruence.types.hh
+++ b/src/Congruence.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Congruence_System.cc b/src/Congruence_System.cc
index 3f40eea..b95e3b2 100644
--- a/src/Congruence_System.cc
+++ b/src/Congruence_System.cc
@@ -1,11 +1,11 @@
 /* Congruence_System class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Congruence_System.defs.hh"
 #include "Congruence_System.inlines.hh"
@@ -38,7 +38,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace PPL = Parma_Polyhedra_Library;
 
 PPL::Congruence_System::Congruence_System(const Constraint_System& cs)
-  : Matrix(0, 2) {
+  : Matrix(0, cs.space_dimension() + 2) {
   for (Constraint_System::const_iterator i = cs.begin(),
 	 cs_end = cs.end(); i != cs_end; ++i)
     if (i->is_equality())
@@ -50,18 +50,19 @@ PPL::Congruence_System::
 increase_space_dimension(const dimension_type new_space_dim) {
   assert(space_dimension() <= new_space_dim);
 
-  dimension_type cols_to_add = new_space_dim - space_dimension();
+  const dimension_type cols_to_add = new_space_dim - space_dimension();
 
-  if (cols_to_add)
+  if (cols_to_add) {
     if (num_rows()) {
-      dimension_type old_num_cols = num_columns();
+      const dimension_type old_num_columns = num_columns();
       add_zero_columns(cols_to_add);
       // Move the moduli.
-      swap_columns(num_columns() - 1, old_num_cols - 1);
+      swap_columns(num_columns() - 1, old_num_columns - 1);
     }
     else
       // Empty system.
       add_zero_columns(cols_to_add);
+  }
 
   assert(OK());
   return true;
@@ -75,7 +76,7 @@ PPL::Congruence_System::insert_verbatim(const Congruence& cg) {
   if (cg_size > old_num_columns) {
     // Resize the system, if necessary.
     add_zero_columns(cg_size - old_num_columns);
-    if (num_rows() != 0)
+    if (!has_no_rows())
       // Move the moduli to the last column.
       swap_columns(old_num_columns - 1, cg_size - 1);
     add_row(cg);
@@ -96,7 +97,7 @@ PPL::Congruence_System::insert_verbatim(const Congruence& cg) {
 
 void
 PPL::Congruence_System::insert(const Constraint& c) {
-  dimension_type cg_size = c.space_dimension() + 2;
+  const dimension_type cg_size = c.space_dimension() + 2;
   const dimension_type old_num_columns = num_columns();
   if (cg_size < old_num_columns) {
     // Create a congruence of the required size from `c'.
@@ -107,7 +108,7 @@ PPL::Congruence_System::insert(const Constraint& c) {
     if (cg_size > old_num_columns) {
       // Resize the system, if necessary.
       add_zero_columns(cg_size - old_num_columns);
-      if (num_rows() != 0)
+      if (!has_no_rows())
 	// Move the moduli to the last column.
 	swap_columns(old_num_columns - 1, cg_size - 1);
     }
@@ -123,18 +124,18 @@ void
 PPL::Congruence_System::recycling_insert(Congruence_System& cgs) {
   const dimension_type old_num_rows = num_rows();
   const dimension_type cgs_num_rows = cgs.num_rows();
-  const dimension_type old_num_cols = num_columns();
-  dimension_type cgs_num_cols = cgs.num_columns();
-  if (old_num_cols >= cgs_num_cols)
+  const dimension_type old_num_columns = num_columns();
+  dimension_type cgs_num_columns = cgs.num_columns();
+  if (old_num_columns >= cgs_num_columns)
     add_zero_rows(cgs_num_rows, Row::Flags());
   else {
     add_zero_rows_and_columns(cgs_num_rows,
-			      cgs_num_cols - old_num_cols,
+			      cgs_num_columns - old_num_columns,
 			      Row::Flags());
     // Swap the modulus column into the new last column.
-    swap_columns(old_num_cols - 1, num_columns() - 1);
+    swap_columns(old_num_columns - 1, num_columns() - 1);
   }
-  --cgs_num_cols; // Convert to modulus index.
+  --cgs_num_columns; // Convert to modulus index.
   const dimension_type mod_index = num_columns() - 1;
   for (dimension_type i = cgs_num_rows; i-- > 0; ) {
     // Swap one coefficient at a time into the newly added rows, instead
@@ -142,9 +143,9 @@ PPL::Congruence_System::recycling_insert(Congruence_System& cgs) {
     // have the same capacities as the existing rows.
     Congruence& new_cg = operator[](old_num_rows + i);
     Congruence& old_cg = cgs[i];
-    for (dimension_type j = cgs_num_cols; j-- > 0; )
+    for (dimension_type j = cgs_num_columns; j-- > 0; )
       std::swap(new_cg[j], old_cg[j]);
-    std::swap(new_cg[mod_index], old_cg[cgs_num_cols]); // Modulus.
+    std::swap(new_cg[mod_index], old_cg[cgs_num_columns]); // Modulus.
   }
 
   assert(OK());
@@ -154,29 +155,29 @@ void
 PPL::Congruence_System::insert(const Congruence_System& y) {
   Congruence_System& x = *this;
 
-  const dimension_type x_n_rows = x.num_rows();
-  const dimension_type y_n_rows = y.num_rows();
-  const dimension_type old_n_cols = x.num_columns();
-  const dimension_type y_n_cols = y.num_columns();
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type y_num_rows = y.num_rows();
+  const dimension_type old_num_columns = x.num_columns();
+  const dimension_type y_num_columns = y.num_columns();
   // Grow to the required size.
-  if (old_n_cols >= y_n_cols)
-    add_zero_rows(y_n_rows, Row::Flags());
+  if (old_num_columns >= y_num_columns)
+    add_zero_rows(y_num_rows, Row::Flags());
   else {
-    add_zero_rows_and_columns(y_n_rows,
-			      y_n_cols - old_n_cols,
+    add_zero_rows_and_columns(y_num_rows,
+			      y_num_columns - old_num_columns,
 			      Row::Flags());
     // Swap the modulus column into the new last column.
-    swap_columns(old_n_cols - 1, num_columns() - 1);
+    swap_columns(old_num_columns - 1, num_columns() - 1);
   }
 
   // Copy the rows of `y', forcing size and capacity.
   const dimension_type x_mod_index = x.num_columns() - 1;
-  const dimension_type y_mod_index = y_n_cols - 1;
-  for (dimension_type i = y_n_rows; i-- > 0; ) {
+  const dimension_type y_mod_index = y_num_columns - 1;
+  for (dimension_type i = y_num_rows; i-- > 0; ) {
     Row copy(y[i], x.row_size, x.row_capacity);
     // Swap the modulus to the correct column.
     std::swap(copy[x_mod_index], copy[y_mod_index]);
-    std::swap(copy, x[x_n_rows+i]);
+    std::swap(copy, x[x_num_rows+i]);
   }
   assert(OK());
 }
@@ -197,21 +198,19 @@ PPL::Congruence_System::normalize_moduli() {
 	return;
     }
     while (row > 0) {
-      TEMP_INTEGER(modulus);
-      modulus = operator[](--row).modulus();
+      const Coefficient& modulus = operator[](--row).modulus();
       if (modulus > 0)
 	lcm_assign(lcm, lcm, modulus);
     }
 
     // Represent every row using the LCM as the modulus.
+    TEMP_INTEGER(factor);
     dimension_type row_size = operator[](0).size();
-    for (dimension_type row = num_rows(); row-- > 0; ) {
-      TEMP_INTEGER(modulus);
-      modulus = operator[](row).modulus();
+    for (row = num_rows(); row-- > 0; ) {
+      const Coefficient& modulus = operator[](row).modulus();
       if (modulus <= 0 || modulus == lcm)
 	continue;
-      TEMP_INTEGER(factor);
-      factor = lcm / modulus;
+      exact_div_assign(factor, lcm, modulus);
       for (dimension_type col = row_size; col-- > 0; )
 	operator[](row)[col] *= factor;
       operator[](row)[row_size-1] = lcm;
@@ -225,8 +224,8 @@ PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const {
   if (num_rows() != cgs.num_rows())
     return false;
 
-  for (dimension_type row = 0; row < cgs.num_rows(); ++row)
-    for (dimension_type col = 0; col < cgs.num_columns(); ++col) {
+  for (dimension_type row = cgs.num_rows(); row-- > 0; )
+    for (dimension_type col = cgs.num_columns(); col-- > 0; ) {
       if (operator[](row)[col] == cgs[row][col])
 	continue;
       return false;
@@ -237,7 +236,7 @@ PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const {
 bool
 PPL::Congruence_System::has_linear_equalities() const {
   const Congruence_System& cgs = *this;
-  dimension_type modulus_index = cgs.num_columns() - 1;
+  const dimension_type modulus_index = cgs.num_columns() - 1;
   for (dimension_type i = cgs.num_rows(); i-- > 0; )
     if (cgs[i][modulus_index] == 0)
       return true;
@@ -312,7 +311,7 @@ PPL::Congruence_System::has_a_free_dimension() const {
   dimension_type free_dims = space_dim;
   for (dimension_type row = num_rows(); row-- > 0; ) {
     const Congruence& cg = operator[](row);
-    for (dimension_type dim = 0; dim < space_dim; ++dim)
+    for (dimension_type dim = space_dim; dim-- > 0; )
       if (free_dim[dim] && cg[dim+1] != 0) {
 	if (--free_dims == 0) {
 	  // All dimensions are constrained.
@@ -321,8 +320,8 @@ PPL::Congruence_System::has_a_free_dimension() const {
 	  // Check that there are free_dims dimensions marked free
 	  // in free_dim.
 	  dimension_type count = 0;
-	  for (dimension_type dim = 0; dim < space_dim; ++dim)
-	    count += free_dim[dim];
+	  for (dimension_type i = space_dim; i-- > 0; )
+	    count += free_dim[i];
 	  assert(count == free_dims);
 #endif
 	  return true;
@@ -345,8 +344,8 @@ affine_preimage(dimension_type v,
   assert(expr.space_dimension() <= space_dimension());
   assert(denominator > 0);
 
-  const dimension_type n_columns = num_columns();
-  const dimension_type n_rows = num_rows();
+  const dimension_type num_columns = this->num_columns();
+  const dimension_type num_rows = this->num_rows();
   const dimension_type expr_size = expr.size();
   const bool not_invertible = (v >= expr_size || expr[v] == 0);
   Congruence_System& x = *this;
@@ -354,7 +353,7 @@ affine_preimage(dimension_type v,
   if (denominator == 1)
     // Optimized computation only considering columns having indexes <
     // expr_size.
-    for (dimension_type i = n_rows; i-- > 0; ) {
+    for (dimension_type i = num_rows; i-- > 0; ) {
       Congruence& row = x[i];
       Coefficient& row_v = row[v];
       if (row_v != 0) {
@@ -369,11 +368,11 @@ affine_preimage(dimension_type v,
       }
     }
   else
-    for (dimension_type i = n_rows; i-- > 0; ) {
+    for (dimension_type i = num_rows; i-- > 0; ) {
       Congruence& row = x[i];
       Coefficient& row_v = row[v];
       if (row_v != 0) {
-	for (dimension_type j = n_columns; j-- > 0; )
+	for (dimension_type j = num_columns; j-- > 0; )
 	  if (j != v) {
 	    Coefficient& row_j = row[j];
 	    row_j *= denominator;
@@ -400,30 +399,47 @@ PPL::Congruence_System::ascii_dump(std::ostream& s) const {
       x[i].ascii_dump(s);
 }
 
-PPL_OUTPUT_DEFINITIONS(Congruence_System);
+PPL_OUTPUT_DEFINITIONS(Congruence_System)
 
 bool
 PPL::Congruence_System::ascii_load(std::istream& s) {
   std::string str;
-  dimension_type nrows;
-  dimension_type ncols;
-  if (!(s >> nrows))
+  dimension_type num_rows;
+  dimension_type num_columns;
+  if (!(s >> num_rows))
     return false;
   if (!(s >> str))
     return false;
-  if (!(s >> ncols))
+  if (!(s >> num_columns))
     return false;
-  resize_no_copy(nrows, ncols);
+  resize_no_copy(num_rows, num_columns);
 
   Congruence_System& x = *this;
   for (dimension_type i = 0; i < x.num_rows(); ++i)
-    x[i].ascii_load(s);
+    if (!x[i].ascii_load(s))
+      return false;
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
 
+const PPL::Congruence_System* PPL::Congruence_System::zero_dim_empty_p = 0;
+
+void
+PPL::Congruence_System::initialize() {
+  assert(zero_dim_empty_p == 0);
+  zero_dim_empty_p
+    = new Congruence_System(Congruence::zero_dim_false());
+}
+
+void
+PPL::Congruence_System::finalize() {
+  assert(zero_dim_empty_p != 0);
+  delete zero_dim_empty_p;
+  zero_dim_empty_p = 0;
+}
+
 bool
 PPL::Congruence_System::OK() const {
   // A Congruence_System must be a valid Matrix.
@@ -503,7 +519,7 @@ PPL::Congruence_System::add_unit_rows_and_columns(dimension_type dims) {
 
   col += dims - 1;
   // Set the diagonal element of each added row.
-  for (dimension_type row = 0; row < dims; ++row)
+  for (dimension_type row = dims; row-- > 0; )
     const_cast<Coefficient&>(operator[](row)[col - row]) = 1;
 }
 
@@ -515,11 +531,6 @@ PPL::Congruence_System::concatenate(const Congruence_System& const_cgs) {
   dimension_type added_rows = cgs.num_rows();
   dimension_type added_columns = cgs.space_dimension();
 
-  if (added_rows == 0) {
-    increase_space_dimension(space_dimension() + added_columns);
-    return;
-  }
-
   dimension_type old_num_rows = num_rows();
   dimension_type old_modi = num_columns() - 1;
   dimension_type old_space_dim = space_dimension();
@@ -531,7 +542,7 @@ PPL::Congruence_System::concatenate(const Congruence_System& const_cgs) {
   dimension_type modi = num_columns() - 1;
 
   // Swap the modulus and the new last column, in the old rows.
-  for (dimension_type i = 0; i < old_num_rows; ++i) {
+  for (dimension_type i = old_num_rows; i-- > 0; ) {
     Congruence& cg = operator[](i);
     std::swap(cg[old_modi], cg[modi]);
   }
@@ -544,7 +555,28 @@ PPL::Congruence_System::concatenate(const Congruence_System& const_cgs) {
     // The inhomogeneous term is moved to the same column.
     std::swap(cg_new[0], cg_old[0]);
     // All homogeneous terms are shifted by `space_dim' columns.
-    for (dimension_type j = 1; j < cgs_num_columns; ++j)
+    for (dimension_type j = cgs_num_columns; j-- > 1; )
       std::swap(cg_old[j], cg_new[old_space_dim + j]);
   }
 }
+
+void
+PPL::Congruence_System
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  dimension_type space_dim = space_dimension();
+
+  assert(new_dimension <= space_dim);
+
+  // The removal of no dimensions from any system is a no-op.  Note
+  // that this case also captures the only legal removal of dimensions
+  // from a system in a 0-dim space.
+  if (new_dimension == space_dim)
+    return;
+
+  // Swap the modulus column into the column that will become the last
+  // column.
+  swap_columns(new_dimension + 1, space_dim + 1);
+
+  remove_trailing_columns(space_dim - new_dimension);
+  assert(OK());
+}
diff --git a/src/Congruence_System.defs.hh b/src/Congruence_System.defs.hh
index f7f175d..425b775 100644
--- a/src/Congruence_System.defs.hh
+++ b/src/Congruence_System.defs.hh
@@ -1,11 +1,11 @@
 /* Congruence_System class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -47,13 +47,6 @@ operator<<(std::ostream& s, const Congruence_System& cgs);
 
 } // namespace IO_Operators
 
-// Put this in the namespace here to declare it a friend later.
-
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
-/*! \relates Congruence_System */
-bool
-operator==(const Congruence_System& x, const Congruence_System& y);
-
 } // namespace Parma_Polyhedra_Library
 
 
@@ -193,7 +186,7 @@ public:
     inserted.
 
     \exception std::invalid_argument
-    Thrown if \p c is a relation.
+    Thrown if \p c is a relational constraint.
   */
   void insert(const Constraint& c);
 
@@ -213,6 +206,12 @@ public:
   */
   void recycling_insert(Congruence_System& cgs);
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   //! Returns the system containing only Congruence::zero_dim_false().
   static const Congruence_System& zero_dim_empty();
 
@@ -291,6 +290,9 @@ public:
     void skip_forward();
   };
 
+  //! Returns <CODE>true</CODE> if and only if \p *this has no congruences.
+  bool empty() const;
+
   /*! \brief
     Returns the const_iterator pointing to the first congruence, if \p
     *this is not empty; otherwise, returns the past-the-end
@@ -308,18 +310,18 @@ public:
     Matrix, each row in the system is a valid Congruence and the
     number of columns is consistent with the number of congruences.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool OK() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns
-    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
   //! Returns the total size in bytes of the memory occupied by \p *this.
@@ -346,16 +348,36 @@ public:
     positive.
 
     Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
-    (c+dims)\f$ matrix \f$\bigl({0 \atop A}{B \atop A}\bigr)\f$ where
-    \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
-    \f$\bigl({0 \atop 1}{1 \atop 0}\bigr)\f$.  The matrix is expanded
-    avoiding reallocation whenever possible.
+    (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{A} \genfrac{}{}{0pt}{}{B}{A}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{1} \genfrac{}{}{0pt}{}{1}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
   */
   void add_unit_rows_and_columns(dimension_type dims);
 
+protected:
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+  bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Congruence::zero_dim_false().
+  */
+  static const Congruence_System* zero_dim_empty_p;
+
+  //! Builds an empty (i.e. zero rows) system of dimension \p d.
+  explicit Congruence_System(dimension_type d);
+
   /*! \brief
     Concatenates copies of the congruences from \p cgs onto \p *this.
 
+    \param cgs
+    The congruence system to append to \p this.  The number of rows in
+    \p cgs must be strictly positive.
+
     The matrix for the new system of congruences is obtained by
     leaving the old system in the upper left-hand side and placing the
     congruences of \p cgs in the lower right-hand side, and padding
@@ -363,13 +385,6 @@ public:
   */
   void concatenate(const Congruence_System& cgs);
 
-protected:
-
-  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
-  bool satisfies_all_congruences(const Grid_Generator& g) const;
-
-private:
-
   //! Adjusts all expressions to have the same moduli.
   void normalize_moduli();
 
@@ -378,7 +393,7 @@ private:
     \p new_space_dim must at least equal to the current space
     dimension.
   */
-  bool increase_space_dimension(const dimension_type new_space_dim);
+  bool increase_space_dimension(dimension_type new_space_dim);
 
   /*! \brief
     Inserts in \p *this an exact copy of the congruence \p cg,
@@ -390,7 +405,6 @@ private:
   void insert_verbatim(const Congruence& cg);
 
   friend class const_iterator;
-  // FIXME: Reduce the dependence on this declaration.
   friend class Grid;
   friend class Grid_Certificate;
 
@@ -398,8 +412,7 @@ private:
 			Parma_Polyhedra_Library::Congruence_System& y);
 
   friend bool
-  Parma_Polyhedra_Library::operator==(const Congruence_System& x,
-				      const Congruence_System& y);
+  operator==(const Congruence_System& x, const Congruence_System& y);
 
   //! Returns the \p k- th congruence of the system.
   Congruence& operator[](dimension_type k);
@@ -460,19 +473,29 @@ private:
 		       const Linear_Expression& expr,
 		       Coefficient_traits::const_reference denominator);
 
+  /*! \brief
+    Removes the higher dimensions of the system so that the resulting
+    system will have dimension \p new_dimension.
+
+    The value of \p new_dimension must be at most the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
   //! Resizes the system without worrying about the old contents.
   /*!
-    \param new_n_rows
+    \param new_num_rows
     The number of rows of the resized system;
 
-    \param new_n_columns
+    \param new_num_columns
     The number of columns of the resized system.
 
     The system is expanded to the specified dimensions avoiding
     reallocation whenever possible.
     The contents of the original system is lost.
   */
-  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+  void resize_no_copy(dimension_type new_num_rows,
+		      dimension_type new_num_columns);
 };
 
 // Congruence_System.inlines.hh is not included here on purpose.
diff --git a/src/Congruence_System.inlines.hh b/src/Congruence_System.inlines.hh
index 0a3d776..89e2708 100644
--- a/src/Congruence_System.inlines.hh
+++ b/src/Congruence_System.inlines.hh
@@ -1,11 +1,11 @@
 /* Congruence_System class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,6 +27,23 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+inline Congruence&
+Congruence_System::operator[](const dimension_type k) {
+  return static_cast<Congruence&>(Matrix::operator[](k));
+}
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+  return static_cast<const Congruence&>(Matrix::operator[](k));
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+  insert_verbatim(cg);
+  static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
+  assert(OK());
+}
+
 inline
 Congruence_System::Congruence_System()
   : Matrix(0, 2) {
@@ -50,6 +67,11 @@ Congruence_System::Congruence_System(const Congruence_System& cs)
 }
 
 inline
+Congruence_System::Congruence_System(const dimension_type d)
+  : Matrix(0, d + 2) {
+}
+
+inline
 Congruence_System::~Congruence_System() {
 }
 
@@ -59,16 +81,6 @@ Congruence_System::operator=(const Congruence_System& y) {
   return *this;
 }
 
-inline Congruence&
-Congruence_System::operator[](const dimension_type k) {
-  return static_cast<Congruence&>(Matrix::operator[](k));
-}
-
-inline const Congruence&
-Congruence_System::operator[](const dimension_type k) const {
-  return static_cast<const Congruence&>(Matrix::operator[](k));
-}
-
 inline dimension_type
 Congruence_System::max_space_dimension() {
   return Matrix::max_num_columns() - 2;
@@ -86,22 +98,15 @@ Congruence_System::clear() {
 }
 
 inline void
-Congruence_System::insert(const Congruence& cg) {
-  insert_verbatim(cg);
-  static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
-  assert(OK());
-}
-
-inline void
-Congruence_System::resize_no_copy(const dimension_type new_n_rows,
-				  const dimension_type new_n_columns) {
-  Matrix::resize_no_copy(new_n_rows, new_n_columns, Row::Flags());
+Congruence_System::resize_no_copy(const dimension_type new_num_rows,
+				  const dimension_type new_num_columns) {
+  Matrix::resize_no_copy(new_num_rows, new_num_columns, Row::Flags());
 }
 
 inline const Congruence_System&
 Congruence_System::zero_dim_empty() {
-  static const Congruence_System zdf(Congruence::zero_dim_false());
-  return zdf;
+  assert(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
 }
 
 inline
@@ -179,6 +184,11 @@ Congruence_System::end() const {
   return i;
 }
 
+inline bool
+Congruence_System::empty() const {
+  return begin() == end();
+}
+
 inline void
 Congruence_System::swap(Congruence_System& y) {
   Matrix::swap(y);
diff --git a/src/Congruence_System.types.hh b/src/Congruence_System.types.hh
index 2d8c64a..1b0eee7 100644
--- a/src/Congruence_System.types.hh
+++ b/src/Congruence_System.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Constraint.cc b/src/Constraint.cc
index 95f6154..08415e0 100644
--- a/src/Constraint.cc
+++ b/src/Constraint.cc
@@ -1,11 +1,11 @@
 /* Constraint class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,11 +20,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Constraint.defs.hh"
-
 #include "Variable.defs.hh"
+#include "Congruence.defs.hh"
 #include <iostream>
 #include <sstream>
 #include <stdexcept>
@@ -32,6 +32,15 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace PPL = Parma_Polyhedra_Library;
 
 void
+PPL::Constraint::throw_invalid_argument(const char* method,
+					const char* message) const {
+  std::ostringstream s;
+  s << "PPL::Constraint::" << method << ":" << std::endl
+    << message;
+  throw std::invalid_argument(s.str());
+}
+
+void
 PPL::Constraint::throw_dimension_incompatible(const char* method,
 					      const char* name_var,
 					      const Variable v) const {
@@ -49,6 +58,41 @@ PPL::Constraint::construct_epsilon_geq_zero() {
   return c;
 }
 
+PPL::Constraint::Constraint(const Congruence& cg)
+  : Linear_Row(cg.is_equality()
+	       // Size includes extra column for the inhomogeneous term.
+	       ? cg.space_dimension() + 1
+	       : (throw_invalid_argument("Constraint(cg)",
+					 "congruence cg must be an equality."),
+		  0),
+	       // Capacity also includes a column for the epsilon coefficient.
+	       compute_capacity(cg.space_dimension() + 2, Row::max_size()),
+	       Flags(NECESSARILY_CLOSED, LINE_OR_EQUALITY)) {
+  Constraint& c = *this;
+  // Copy coefficients and inhomogeneous term.
+  for (dimension_type i = cg.space_dimension() + 1; i-- > 0; )
+    c[i] = cg[i];
+  // Enforce normalization.
+  strong_normalize();
+}
+
+PPL::Constraint::Constraint(const Congruence& cg,
+			    dimension_type sz,
+			    dimension_type capacity)
+  : Linear_Row(cg.is_equality()
+	       ? sz
+	       : (throw_invalid_argument("Constraint(cg, sz, c)",
+					 "congruence cg must be an equality."),
+		  0),
+	       capacity,
+	       Flags(NECESSARILY_CLOSED, LINE_OR_EQUALITY)) {
+  Constraint& c = *this;
+  // Copy coefficients.
+  assert(sz > 0);
+  while (sz-- > 0)
+    c[sz] = cg[sz];
+}
+
 bool
 PPL::Constraint::is_tautological() const {
   assert(size() > 0);
@@ -172,13 +216,57 @@ PPL::Constraint::is_equivalent_to(const Constraint& y) const {
   return true;
 }
 
+const PPL::Constraint* PPL::Constraint::zero_dim_false_p = 0;
+const PPL::Constraint* PPL::Constraint::zero_dim_positivity_p = 0;
+const PPL::Constraint* PPL::Constraint::epsilon_geq_zero_p = 0;
+const PPL::Constraint* PPL::Constraint::epsilon_leq_one_p = 0;
+
+void
+PPL::Constraint::initialize() {
+  assert(zero_dim_false_p == 0);
+  zero_dim_false_p
+    = new Constraint(Linear_Expression::zero() == Coefficient_one());
+
+  assert(zero_dim_positivity_p == 0);
+  zero_dim_positivity_p
+    = new Constraint(Linear_Expression::zero() <= Coefficient_one());
+
+  assert(epsilon_geq_zero_p == 0);
+  epsilon_geq_zero_p
+    = new Constraint(construct_epsilon_geq_zero());
+
+  assert(epsilon_leq_one_p == 0);
+  epsilon_leq_one_p
+    = new Constraint(Linear_Expression::zero() < Coefficient_one());
+}
+
+void
+PPL::Constraint::finalize() {
+  assert(zero_dim_false_p != 0);
+  delete zero_dim_false_p;
+  zero_dim_false_p = 0;
+
+  assert(zero_dim_positivity_p != 0);
+  delete zero_dim_positivity_p;
+  zero_dim_positivity_p = 0;
+
+  assert(epsilon_geq_zero_p != 0);
+  delete epsilon_geq_zero_p;
+  epsilon_geq_zero_p = 0;
+
+  assert(epsilon_leq_one_p != 0);
+  delete epsilon_leq_one_p;
+  epsilon_leq_one_p = 0;
+}
+
 /*! \relates Parma_Polyhedra_Library::Constraint */
 std::ostream&
 PPL::IO_Operators::operator<<(std::ostream& s, const Constraint& c) {
-  const int num_variables = c.space_dimension();
+  const dimension_type num_variables = c.space_dimension();
+  TEMP_INTEGER(cv);
   bool first = true;
-  for (int v = 0; v < num_variables; ++v) {
-    Coefficient cv = c.coefficient(Variable(v));
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    cv = c.coefficient(Variable(v));
     if (cv != 0) {
       if (!first) {
 	if (cv > 0)
@@ -234,11 +322,15 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Constraint::Type& t) {
   return s;
 }
 
-PPL_OUTPUT_DEFINITIONS(Constraint);
+PPL_OUTPUT_DEFINITIONS(Constraint)
 
 bool
 PPL::Constraint::OK() const {
-  // Topology consistency check.
+  // Check the underlying Linear_Row object.
+  if (!Linear_Row::OK())
+    return false;
+
+  // Topology consistency checks.
   const dimension_type min_size = is_necessarily_closed() ? 1 : 2;
   if (size() < min_size) {
 #ifndef NDEBUG
@@ -252,6 +344,14 @@ PPL::Constraint::OK() const {
     return false;
   }
 
+  if (is_equality() && !is_necessarily_closed() && (*this)[size() - 1] != 0) {
+#ifndef NDEBUG
+    std::cerr << "Illegal constraint: an equality cannot be strict."
+	      << std::endl;
+#endif
+    return false;
+  }
+
   // Normalization check.
   Constraint tmp = *this;
   tmp.strong_normalize();
diff --git a/src/Constraint.defs.hh b/src/Constraint.defs.hh
index 95880de..f59232e 100644
--- a/src/Constraint.defs.hh
+++ b/src/Constraint.defs.hh
@@ -1,11 +1,11 @@
 /* Constraint class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,6 +30,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Linear_Expression.defs.hh"
 #include "Constraint_System.defs.hh"
 #include "Polyhedron.types.hh"
+#include "Congruence.types.hh"
 #include <iosfwd>
 
 namespace Parma_Polyhedra_Library {
@@ -50,10 +51,17 @@ operator!=(const Constraint& x, const Constraint& y);
 /*! \relates Constraint */
 Constraint
 operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 = \p v2.
+/*! \relates Constraint */
+Constraint
+operator==(Variable v1, Variable v2);
+
 //! Returns the constraint \p e = \p n.
 /*! \relates Constraint */
 Constraint
 operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
 //! Returns the constraint \p n = \p e.
 /*! \relates Constraint */
 Constraint
@@ -63,10 +71,17 @@ operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
 /*! \relates Constraint */
 Constraint
 operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \<= \p v2.
+/*! \relates Constraint */
+Constraint
+operator<=(Variable v1, Variable v2);
+
 //! Returns the constraint \p e \<= \p n.
 /*! \relates Constraint */
 Constraint
 operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
 //! Returns the constraint \p n \<= \p e.
 /*! \relates Constraint */
 Constraint
@@ -76,10 +91,17 @@ operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
 /*! \relates Constraint */
 Constraint
 operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \>= \p v2.
+/*! \relates Constraint */
+Constraint
+operator>=(Variable v1, Variable v2);
+
 //! Returns the constraint \p e \>= \p n.
 /*! \relates Constraint */
 Constraint
 operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
 //! Returns the constraint \p n \>= \p e.
 /*! \relates Constraint */
 Constraint
@@ -89,10 +111,17 @@ operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
 /*! \relates Constraint */
 Constraint
 operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \< \p v2.
+/*! \relates Constraint */
+Constraint
+operator<(Variable v1, Variable v2);
+
 //! Returns the constraint \p e \< \p n.
 /*! \relates Constraint */
 Constraint
 operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
 //! Returns the constraint \p n \< \p e.
 /*! \relates Constraint */
 Constraint
@@ -102,10 +131,17 @@ operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
 /*! \relates Constraint */
 Constraint
 operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \> \p v2.
+/*! \relates Constraint */
+Constraint
+operator>(Variable v1, Variable v2);
+
 //! Returns the constraint \p e \> \p n.
 /*! \relates Constraint */
 Constraint
 operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
 //! Returns the constraint \p n \> \p e.
 /*! \relates Constraint */
 Constraint
@@ -205,7 +241,7 @@ void swap(Parma_Polyhedra_Library::Constraint& x,
     cout << "Constraint c1 is not an inequality." << endl;
   else {
     Linear_Expression e;
-    for (int i = c1.space_dimension() - 1; i >= 0; i--)
+    for (dimension_type i = c1.space_dimension(); i-- > 0; )
       e += c1.coefficient(Variable(i)) * Variable(i);
     e += c1.inhomogeneous_term();
     Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
@@ -226,6 +262,13 @@ public:
   //! Ordinary copy-constructor.
   Constraint(const Constraint& c);
 
+  //! Copy-constructs from equality congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p cg is a proper congruence.
+  */
+  explicit Constraint(const Congruence& cg);
+
   //! Destructor.
   ~Constraint();
 
@@ -285,6 +328,12 @@ public:
   //! Returns the inhomogeneous term of \p *this.
   Coefficient_traits::const_reference inhomogeneous_term() const;
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
   static const Constraint& zero_dim_false();
 
@@ -340,12 +389,12 @@ public:
   */
   bool is_equivalent_to(const Constraint& y) const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
     Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
 #endif
@@ -358,6 +407,32 @@ public:
   void swap(Constraint& y);
 
 private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  */
+  static const Constraint* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) constraint \f$0 \leq 1\f$, also
+    known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint* zero_dim_positivity_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  */
+  static const Constraint* epsilon_geq_zero_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint* epsilon_leq_one_p;
+
   friend class Parma_Polyhedra_Library::Congruence;
   friend class Parma_Polyhedra_Library::Scalar_Products;
   friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
@@ -379,6 +454,16 @@ private:
   */
   Constraint(Linear_Expression& e, Type type, Topology topology);
 
+  //! Constructs from a congruence, with specified size and capacity.
+  Constraint(const Congruence& cg, dimension_type sz, dimension_type capacity);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
   /*! \brief
     Throws a <CODE>std::invalid_argument</CODE> exception
     containing the appropriate error message.
@@ -389,54 +474,45 @@ private:
 			       Variable v) const;
 
   friend Constraint
-  Parma_Polyhedra_Library::operator==(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
+  operator==(const Linear_Expression& e1, const Linear_Expression& e2);
   friend Constraint
-  Parma_Polyhedra_Library::operator==(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  operator==(Variable v1, Variable v2);
   friend Constraint
-  Parma_Polyhedra_Library::operator==(Coefficient_traits::const_reference n,
-				      const Linear_Expression& e);
+  operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Constraint
+  operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
 
   friend Constraint
-  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
+  operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator>=(Variable v1, Variable v2);
   friend Constraint
-  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
   friend Constraint
-  Parma_Polyhedra_Library::operator>=(Coefficient_traits::const_reference n,
-				      const Linear_Expression& e);
+  operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
 
   friend Constraint
-  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
+  operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
   friend Constraint
-  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
   friend Constraint
-  Parma_Polyhedra_Library::operator<=(Coefficient_traits::const_reference n,
-				      const Linear_Expression& e);
+  operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
 
   friend Constraint
-  Parma_Polyhedra_Library::operator>(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
+  operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator>(Variable v1, Variable v2);
   friend Constraint
-  Parma_Polyhedra_Library::operator>(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
   friend Constraint
-  Parma_Polyhedra_Library::operator>(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+  operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
 
   friend Constraint
-  Parma_Polyhedra_Library::operator<(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
+  operator<(const Linear_Expression& e1, const Linear_Expression& e2);
   friend Constraint
-  Parma_Polyhedra_Library::operator<(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
   friend Constraint
-  Parma_Polyhedra_Library::operator<(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+  operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
 
   //! Copy-constructor with given size.
   Constraint(const Constraint& c, dimension_type sz);
diff --git a/src/Constraint.inlines.hh b/src/Constraint.inlines.hh
index c213ecb..acbcea6 100644
--- a/src/Constraint.inlines.hh
+++ b/src/Constraint.inlines.hh
@@ -1,11 +1,11 @@
 /* Constraint class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -154,6 +154,14 @@ operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
 
 /*! \relates Constraint */
 inline Constraint
+operator==(const Variable v1, const Variable v2) {
+  Linear_Expression diff
+    = (v1.space_dimension() < v2.space_dimension()) ? v1-v2 : v2-v1;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
 operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
   Linear_Expression diff = e1 - e2;
   Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
@@ -164,6 +172,13 @@ operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
 
 /*! \relates Constraint */
 inline Constraint
+operator>=(const Variable v1, const Variable v2) {
+  Linear_Expression diff = v1-v2;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
 operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
   Linear_Expression diff;
   // Setting the epsilon coefficient to -1.
@@ -183,6 +198,16 @@ operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
 
 /*! \relates Constraint */
 inline Constraint
+operator>(const Variable v1, const Variable v2) {
+  Linear_Expression diff = v1-v2;
+  diff -= Variable(std::max(v1.space_dimension(), v2.space_dimension()));
+  return Constraint(diff,
+                    Constraint::STRICT_INEQUALITY,
+                    NOT_NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
 operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
   Linear_Expression diff = n - e;
   Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
@@ -259,6 +284,12 @@ operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
 
 /*! \relates Constraint */
 inline Constraint
+operator<=(const Variable v1, const Variable v2) {
+  return v2 >= v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
 operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
   return e >= n;
 }
@@ -277,6 +308,12 @@ operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
 
 /*! \relates Constraint */
 inline Constraint
+operator<(const Variable v1, const Variable v2) {
+  return v2 > v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
 operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
   return e > n;
 }
@@ -289,27 +326,26 @@ operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
 
 inline const Constraint&
 Constraint::zero_dim_false() {
-  static const Constraint zdf(Linear_Expression::zero() == Coefficient_one());
-  return zdf;
+  assert(zero_dim_false_p != 0);
+  return *zero_dim_false_p;
 }
 
 inline const Constraint&
 Constraint::zero_dim_positivity() {
-  static const Constraint zdp(Linear_Expression::zero() <= Coefficient_one());
-  return zdp;
+  assert(zero_dim_positivity_p != 0);
+  return *zero_dim_positivity_p;
 }
 
 inline const Constraint&
 Constraint::epsilon_geq_zero() {
-  static const Constraint eps_geq_zero = construct_epsilon_geq_zero();
-  return eps_geq_zero;
+  assert(epsilon_geq_zero_p != 0);
+  return *epsilon_geq_zero_p;
 }
 
 inline const Constraint&
 Constraint::epsilon_leq_one() {
-  static const Constraint
-    eps_leq_one(Linear_Expression::zero() < Coefficient_one());
-  return eps_leq_one;
+  assert(epsilon_leq_one_p != 0);
+  return *epsilon_leq_one_p;
 }
 
 inline void
diff --git a/src/Constraint.types.hh b/src/Constraint.types.hh
index 6750d8c..658b684 100644
--- a/src/Constraint.types.hh
+++ b/src/Constraint.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Constraint_System.cc b/src/Constraint_System.cc
index 8ab6f17..48fcf24 100644
--- a/src/Constraint_System.cc
+++ b/src/Constraint_System.cc
@@ -1,11 +1,11 @@
 /* Constraint_System class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,12 +20,14 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Constraint_System.defs.hh"
 #include "Constraint_System.inlines.hh"
 #include "Generator.defs.hh"
 #include "Scalar_Products.defs.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
 #include <cassert>
 #include <string>
 #include <vector>
@@ -34,6 +36,15 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace PPL = Parma_Polyhedra_Library;
 
+PPL::Constraint_System::Constraint_System(const Congruence_System& cgs)
+  : Linear_System(NECESSARILY_CLOSED, 0, cgs.space_dimension() + 1) {
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); i != cgs_end; ++i)
+    if (i->is_equality())
+      // TODO: Consider adding a recycling_insert to save the extra copy here.
+      insert(Constraint(*i));
+}
+
 bool
 PPL::Constraint_System::
 adjust_topology_and_space_dimension(const Topology new_topology,
@@ -87,7 +98,7 @@ adjust_topology_and_space_dimension(const Topology new_topology,
     return true;
   }
 
-  // Here `num_rows() > 0'.
+  // Here the constraint system is not empty.
   if (cols_to_be_added > 0)
     if (old_topology != new_topology)
       if (new_topology == NECESSARILY_CLOSED) {
@@ -172,7 +183,7 @@ adjust_topology_and_space_dimension(const Topology new_topology,
     }
   else
     // Here `cols_to_be_added == 0'.
-    if (old_topology != new_topology)
+    if (old_topology != new_topology) {
       if (new_topology == NECESSARILY_CLOSED) {
 	// A NOT_NECESSARILY_CLOSED constraint system
 	// can be converted to a NECESSARILY_CLOSED one
@@ -188,6 +199,7 @@ adjust_topology_and_space_dimension(const Topology new_topology,
 	add_zero_columns(1);
 	set_not_necessarily_closed();
       }
+    }
   // We successfully adjusted space dimensions and topology.
   assert(OK());
   return true;
@@ -485,7 +497,7 @@ PPL::Constraint_System::ascii_dump(std::ostream& s) const {
   }
 }
 
-PPL_OUTPUT_DEFINITIONS(Constraint_System);
+PPL_OUTPUT_DEFINITIONS(Constraint_System)
 
 bool
 PPL::Constraint_System::ascii_load(std::istream& s) {
@@ -553,11 +565,27 @@ PPL::Constraint_System::ascii_load(std::istream& s) {
     // Reaching this point means that the input was illegal.
     return false;
   }
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
 
+const PPL::Constraint_System* PPL::Constraint_System::zero_dim_empty_p = 0;
+
+void
+PPL::Constraint_System::initialize() {
+  assert(zero_dim_empty_p == 0);
+  zero_dim_empty_p
+    = new Constraint_System(Constraint::zero_dim_false());
+}
+
+void
+PPL::Constraint_System::finalize() {
+  assert(zero_dim_empty_p != 0);
+  delete zero_dim_empty_p;
+  zero_dim_empty_p = 0;
+}
+
 bool
 PPL::Constraint_System::OK() const {
   // A Constraint_System must be a valid Linear_System; do not check for
diff --git a/src/Constraint_System.defs.hh b/src/Constraint_System.defs.hh
index 53789bf..0b56e72 100644
--- a/src/Constraint_System.defs.hh
+++ b/src/Constraint_System.defs.hh
@@ -1,11 +1,11 @@
 /* Constraint_System class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,7 +29,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Generator.types.hh"
 #include "Polyhedron.types.hh"
 #include "Constraint.types.hh"
-#include "LP_Problem.types.hh"
+#include "Congruence_System.types.hh"
 #include <iterator>
 #include <iosfwd>
 
@@ -132,6 +132,9 @@ public:
   //! Builds the singleton system containing only constraint \p c.
   explicit Constraint_System(const Constraint& c);
 
+  //! Builds a system containing copies of any equalities in \p cgs.
+  explicit Constraint_System(const Congruence_System& cgs);
+
   //! Ordinary copy-constructor.
   Constraint_System(const Constraint_System& cs);
 
@@ -165,9 +168,14 @@ public:
   */
   void insert(const Constraint& c);
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   /*! \brief
-    Returns the singleton system containing only
-    Constraint::zero_dim_false().
+    Returns the singleton system containing only Constraint::zero_dim_false().
   */
   static const Constraint_System& zero_dim_empty();
 
@@ -246,6 +254,9 @@ public:
     void skip_forward();
   };
 
+  //! Returns <CODE>true</CODE> if and only if \p *this has no constraints.
+  bool empty() const;
+
   /*! \brief
     Returns the const_iterator pointing to the first constraint,
     if \p *this is not empty;
@@ -262,18 +273,18 @@ public:
     Returns <CODE>true</CODE> if and only if \p *this is a valid
     Linear_System and each row in the system is a valid Constraint.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool OK() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
     Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
   //! Returns the total size in bytes of the memory occupied by \p *this.
@@ -286,13 +297,16 @@ public:
   void swap(Constraint_System& y);
 
 private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System* zero_dim_empty_p;
+
   friend class const_iterator;
   friend class Parma_Polyhedra_Library::Polyhedron;
-  friend class Parma_Polyhedra_Library::LP_Problem;
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
-				      const Polyhedron& y);
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
 
   //! Builds an empty system of constraints having the specified topology.
   explicit Constraint_System(Topology topol);
@@ -371,7 +385,7 @@ private:
   dimension_type num_inequalities() const;
 
   /*! \brief
-    Applies Gaussian's elimination and back-substitution so as
+    Applies Gaussian elimination and back-substitution so as
     to provide a partial simplification of the system of constraints.
 
     It is assumed that the system has no pending constraints.
diff --git a/src/Constraint_System.inlines.hh b/src/Constraint_System.inlines.hh
index be17a33..6706fde 100644
--- a/src/Constraint_System.inlines.hh
+++ b/src/Constraint_System.inlines.hh
@@ -1,11 +1,11 @@
 /* Constraint_System class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -92,8 +92,8 @@ Constraint_System::clear() {
 
 inline const Constraint_System&
 Constraint_System::zero_dim_empty() {
-  static const Constraint_System zdf(Constraint::zero_dim_false());
-  return zdf;
+  assert(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
 }
 
 inline
@@ -171,6 +171,11 @@ Constraint_System::end() const {
   return i;
 }
 
+inline bool
+Constraint_System::empty() const {
+  return begin() == end();
+}
+
 inline void
 Constraint_System::add_low_level_constraints() {
   if (is_necessarily_closed())
diff --git a/src/Constraint_System.types.hh b/src/Constraint_System.types.hh
index 37b718c..63dac30 100644
--- a/src/Constraint_System.types.hh
+++ b/src/Constraint_System.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/DB_Matrix.defs.hh b/src/DB_Matrix.defs.hh
index 9a76a2f..02946ba 100644
--- a/src/DB_Matrix.defs.hh
+++ b/src/DB_Matrix.defs.hh
@@ -1,11 +1,11 @@
 /* DB_Matrix class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,7 +39,7 @@ namespace IO_Operators {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Output operator.
 /*! \relates Parma_Polyhedra_Library::DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 std::ostream&
 operator<<(std::ostream& s, const DB_Matrix<T>& c);
@@ -52,11 +52,11 @@ operator<<(std::ostream& s, const DB_Matrix<T>& c);
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! The base class for the square matrices.
 /*! \ingroup PPL_CXX_interface
-  The templatic class DB_Matrix<T> allows for the representation of
+  The template class DB_Matrix<T> allows for the representation of
   a square matrix of T objects.
   Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 class Parma_Polyhedra_Library::DB_Matrix {
 public:
@@ -91,7 +91,7 @@ public:
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   //! A read-only iterator over the rows of the matrix.
   /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   class const_iterator {
   private:
     typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
@@ -209,15 +209,21 @@ public:
   const DB_Row<T>& operator[](dimension_type k) const;
   //@}
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE>
-    if successful, <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
 
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 };
@@ -227,7 +233,7 @@ namespace std {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
 	  Parma_Polyhedra_Library::DB_Matrix<T>& y);
@@ -240,14 +246,14 @@ namespace Parma_Polyhedra_Library {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
 
@@ -263,12 +269,12 @@ bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
   All computations are performed using the temporary variables
   \p tmp0, \p tmp1 and \p tmp2.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Temp, typename To, typename T>
 bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 				 const DB_Matrix<T>& x,
 				 const DB_Matrix<T>& y,
-				 const Rounding_Dir dir,
+				 Rounding_Dir dir,
 				 Temp& tmp0,
 				 Temp& tmp1,
 				 Temp& tmp2);
@@ -285,12 +291,12 @@ bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
   All computations are performed using the temporary variables
   \p tmp0, \p tmp1 and \p tmp2.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Temp, typename To, typename T>
 bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 			       const DB_Matrix<T>& x,
 			       const DB_Matrix<T>& y,
-			       const Rounding_Dir dir,
+			       Rounding_Dir dir,
 			       Temp& tmp0,
 			       Temp& tmp1,
 			       Temp& tmp2);
@@ -307,12 +313,12 @@ bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
   All computations are performed using the temporary variables
   \p tmp0, \p tmp1 and \p tmp2.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Temp, typename To, typename T>
 bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 				 const DB_Matrix<T>& x,
 				 const DB_Matrix<T>& y,
-				 const Rounding_Dir dir,
+				 Rounding_Dir dir,
 				 Temp& tmp0,
 				 Temp& tmp1,
 				 Temp& tmp2);
@@ -320,5 +326,6 @@ bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 } // namespace Parma_Polyhedra_Library
 
 #include "DB_Matrix.inlines.hh"
+#include "DB_Matrix.templates.hh"
 
 #endif // !defined(PPL_DB_Matrix_defs_hh)
diff --git a/src/DB_Matrix.inlines.hh b/src/DB_Matrix.inlines.hh
index dbd67ff..8421935 100644
--- a/src/DB_Matrix.inlines.hh
+++ b/src/DB_Matrix.inlines.hh
@@ -1,11 +1,11 @@
 /* DB_Matrix class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,6 +25,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "globals.defs.hh"
 #include "Checked_Number.defs.hh"
+#include "distances.defs.hh"
 #include <cassert>
 #include <iostream>
 
@@ -51,6 +52,12 @@ DB_Matrix<T>::max_num_columns() {
 }
 
 template <typename T>
+inline memory_size_type
+DB_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
 inline
 DB_Matrix<T>::const_iterator::const_iterator()
   : i(Iter()) {
@@ -159,7 +166,7 @@ DB_Matrix<T>::num_rows() const {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 inline bool
 operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
@@ -168,18 +175,6 @@ operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
 
 template <typename T>
 inline
-DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
-  : rows(n_rows),
-    row_size(n_rows),
-    row_capacity(compute_capacity(n_rows, max_num_columns())) {
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0; i < n_rows; ++i)
-    rows[i].construct(n_rows, row_capacity);
-  assert(OK());
-}
-
-template <typename T>
-inline
 DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
   : rows(y.rows),
     row_size(y.row_size),
@@ -187,19 +182,6 @@ DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
 }
 
 template <typename T>
-template <typename U>
-inline
-DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
-  : rows(y.rows.size()),
-    row_size(y.row_size),
-    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
-    rows[i].construct_upward_approximation(y[i], row_capacity);
-  assert(OK());
-}
-
-template <typename T>
 inline DB_Matrix<T>&
 DB_Matrix<T>::operator=(const DB_Matrix& y) {
   // Without the following guard against auto-assignments we would
@@ -217,252 +199,9 @@ DB_Matrix<T>::operator=(const DB_Matrix& y) {
   return *this;
 }
 
-template <typename T>
-void
-DB_Matrix<T>::grow(const dimension_type new_n_rows) {
-  const dimension_type old_n_rows = rows.size();
-  assert(new_n_rows >= old_n_rows);
-
-  if (new_n_rows > old_n_rows) {
-    if (new_n_rows <= row_capacity) {
-      // We can recycle the old rows.
-      if (rows.capacity() < new_n_rows) {
-	// Reallocation will take place.
-	std::vector<DB_Row<T> > new_rows;
-	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
-	// Construct the new rows.
-	dimension_type i = new_n_rows;
-	while (i-- > old_n_rows)
-	  new_rows[i].construct(new_n_rows, row_capacity);
-	// Steal the old rows.
-	++i;
-	while (i-- > 0)
-	  new_rows[i].swap(rows[i]);
-	// Put the new vector into place.
-	std::swap(rows, new_rows);
-      }
-      else {
-	// Reallocation will NOT take place.
-	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
-	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
-	  rows[i].construct(new_n_rows, row_capacity);
-      }
-    }
-    else {
-      // We cannot even recycle the old rows.
-      DB_Matrix new_matrix;
-      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
-      // Construct the new rows.
-      new_matrix.row_size = new_n_rows;
-      new_matrix.row_capacity = compute_capacity(new_n_rows,
-						 max_num_columns());
-      dimension_type i = new_n_rows;
-      while (i-- > old_n_rows)
-	new_matrix.rows[i].construct(new_matrix.row_size,
-				     new_matrix.row_capacity);
-      // Copy the old rows.
-      ++i;
-      while (i-- > 0) {
-	DB_Row<T> new_row(rows[i],
-			  new_matrix.row_size,
-			  new_matrix.row_capacity);
-	std::swap(new_matrix.rows[i], new_row);
-      }
-      // Put the new vector into place.
-      swap(new_matrix);
-      return;
-    }
-  }
-  // Here we have the right number of rows.
-  if (new_n_rows > row_size) {
-    // We need more columns.
-    if (new_n_rows <= row_capacity)
-      // But we have enough capacity: we resize existing rows.
-      for (dimension_type i = old_n_rows; i-- > 0; )
-	rows[i].expand_within_capacity(new_n_rows);
-    else {
-      // Capacity exhausted: we must reallocate the rows and
-      // make sure all the rows have the same capacity.
-      const dimension_type new_row_capacity
-	= compute_capacity(new_n_rows, max_num_columns());
-      for (dimension_type i = old_n_rows; i-- > 0; ) {
-	DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
-	std::swap(rows[i], new_row);
-      }
-      row_capacity = new_row_capacity;
-    }
-    // Rows have grown or shrunk.
-    row_size = new_n_rows;
-  }
-}
-
-template <typename T>
-void
-DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
-  dimension_type old_n_rows = rows.size();
-
-  if (new_n_rows > old_n_rows) {
-    // Rows will be inserted.
-    if (new_n_rows <= row_capacity) {
-      // We can recycle the old rows.
-      if (rows.capacity() < new_n_rows) {
-	// Reallocation (of vector `rows') will take place.
-	std::vector<DB_Row<T> > new_rows;
-	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
-	// Construct the new rows (be careful: each new row must have
-	// the same capacity as each one of the old rows).
-	dimension_type i = new_n_rows;
-	while (i-- > old_n_rows)
-	  new_rows[i].construct(new_n_rows, row_capacity);
-	// Steal the old rows.
-	++i;
-	while (i-- > 0)
-	  new_rows[i].swap(rows[i]);
-	// Put the new vector into place.
-	std::swap(rows, new_rows);
-      }
-      else {
-	// Reallocation (of vector `rows') will NOT take place.
-	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
-	// Be careful: each new row must have
-	// the same capacity as each one of the old rows.
-	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
-	  rows[i].construct(new_n_rows, row_capacity);
-      }
-    }
-    else {
-      // We cannot even recycle the old rows: allocate a new matrix and swap.
-      DB_Matrix new_matrix(new_n_rows);
-      swap(new_matrix);
-      return;
-    }
-  }
-  else if (new_n_rows < old_n_rows) {
-    // Drop some rows.
-    rows.erase(rows.begin() + new_n_rows, rows.end());
-    // Shrink the existing rows.
-    for (dimension_type i = new_n_rows; i-- > 0; )
-      rows[i].shrink(new_n_rows);
-    old_n_rows = new_n_rows;
-  }
-  // Here we have the right number of rows.
-  if (new_n_rows > row_size) {
-    // We need more columns.
-    if (new_n_rows <= row_capacity)
-      // But we have enough capacity: we resize existing rows.
-      for (dimension_type i = old_n_rows; i-- > 0; )
-	rows[i].expand_within_capacity(new_n_rows);
-    else {
-      // Capacity exhausted: we must reallocate the rows and
-      // make sure all the rows have the same capacity.
-      const dimension_type new_row_capacity
-	= compute_capacity(new_n_rows, max_num_columns());
-      for (dimension_type i = old_n_rows; i-- > 0; ) {
-	DB_Row<T> new_row(new_n_rows, new_row_capacity);
-	std::swap(rows[i], new_row);
-      }
-      row_capacity = new_row_capacity;
-    }
-  }
-  // DB_Rows have grown or shrunk.
-  row_size = new_n_rows;
-}
-
-template <typename T>
-void
-DB_Matrix<T>::ascii_dump(std::ostream& s) const {
-  const DB_Matrix<T>& x = *this;
-  const char separator = ' ';
-  const dimension_type nrows = x.num_rows();
-  s << nrows << separator << "\n";
-  for (dimension_type i = 0; i < nrows;  ++i) {
-    for (dimension_type j = 0; j < nrows; ++j) {
-      using namespace IO_Operators;
-      s << x[i][j] << separator;
-    }
-    s << "\n";
-  }
-}
-
-PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>);
-
-template <typename T>
-bool
-DB_Matrix<T>::ascii_load(std::istream& s) {
-  dimension_type nrows;
-   if (!(s >> nrows))
-    return false;
-  resize_no_copy(nrows);
-  DB_Matrix& x = *this;
-  for (dimension_type i = 0; i < nrows;  ++i)
-    for (dimension_type j = 0; j < nrows; ++j) {
-      Result r = input(x[i][j], s, ROUND_UP);
-      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
-      if (!s || r == V_CVT_STR_UNK)
-	return false;
-    }
-  // Check for well-formedness.
-  assert(OK());
-  return true;
-}
-
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-inline bool
-operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
-  const dimension_type x_num_rows = x.num_rows();
-  if (x_num_rows != y.num_rows())
-    return false;
-  for (dimension_type i = x_num_rows; i-- > 0; )
-    if (x[i] != y[i])
-      return false;
-  return true;
-}
-
-template <typename To, typename From>
-struct maybe_assign_struct {
-  static inline Result
-  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
-    // When `To' and `From' are different types, we make the conversion
-    // and use `tmp'.
-    top = &tmp;
-    return assign_r(tmp, from, dir);
-  }
-};
-
-template <typename Type>
-struct maybe_assign_struct<Type, Type> {
-  static inline Result
-  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
-    // When the types are the same, conversion is unnecessary.
-    top = &from;
-    return V_EQ;
-  }
-};
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Assigns to \p top a pointer to a location that holds the
-  conversion, according to \p dir, of \p from to type \p To.  When
-  necessary, and only when necessary, the variable \p tmp is used to
-  hold the result of conversion.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename To, typename From>
-inline Result
-maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
-  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
-}
-
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Specialization, typename Temp, typename To, typename T>
 inline bool
 l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
@@ -487,7 +226,7 @@ l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 	  continue;
 	else {
 	pinf:
-	  r = PLUS_INFINITY;
+	  assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
 	  return true;
 	}
       }
@@ -505,7 +244,7 @@ l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 	maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
       }
       sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
-      assert(tmp1 >= 0);
+      assert(sgn(tmp1) >= 0);
       Specialization::combine(tmp0, tmp1, dir);
     }
   }
@@ -514,21 +253,9 @@ l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
   return true;
 }
 
-template <typename Temp>
-struct Rectilinear_Distance_Specialization {
-  static inline void
-  combine(Temp& running, const Temp& current, Rounding_Dir dir) {
-    add_assign_r(running, running, current, dir);
-  }
-
-  static inline void
-  finalize(Temp&, Rounding_Dir) {
-  }
-};
-
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Temp, typename To, typename T>
 inline bool
 rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
@@ -547,23 +274,9 @@ rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 }
 
 
-template <typename Temp>
-struct Euclidean_Distance_Specialization {
-  static inline void
-  combine(Temp& running, Temp& current, Rounding_Dir dir) {
-    mul_assign_r(current, current, current, dir);
-    add_assign_r(running, running, current, dir);
-  }
-
-  static inline void
-  finalize(Temp& running, Rounding_Dir dir) {
-    sqrt_assign_r(running, running, dir);
-  }
-};
-
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Temp, typename To, typename T>
 inline bool
 euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
@@ -581,23 +294,9 @@ euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 								  tmp2);
 }
 
-
-template <typename Temp>
-struct L_Infinity_Distance_Specialization {
-  static inline void
-  combine(Temp& running, const Temp& current, Rounding_Dir) {
-    if (current > running)
-      running = current;
-  }
-
-  static inline void
-  finalize(Temp&, Rounding_Dir) {
-  }
-};
-
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Temp, typename To, typename T>
 inline bool
 l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
@@ -615,58 +314,13 @@ l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
 								   tmp2);
 }
 
-template <typename T>
-bool
-DB_Matrix<T>::OK() const {
-#ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
-#endif
-
-  // The matrix must be square.
-  if (num_rows() != row_size) {
-#ifndef NDEBUG
-    cerr << "DB_Matrix has fewer columns than rows:\n"
-	 << "row_size is " << row_size
-	 << ", num_rows() is " << num_rows() << "!"
-	 << endl;
-#endif
-    return false;
-  }
-
-  const DB_Matrix& x = *this;
-  const dimension_type n_rows = x.num_rows();
-  for (dimension_type i = 0; i < n_rows; ++i) {
-    if (!x[i].OK(row_size, row_capacity))
-      return false;
-  }
-
-  // All checks passed.
-  return true;
-}
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates Parma_Polyhedra_Library::DB_Matrix */  //FIXME!!
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-std::ostream&
-IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
-  const dimension_type n = c.num_rows();
-  for (dimension_type i = 0; i < n; ++i) {
-    for (dimension_type j = 0; j < n; ++j)
-      s << c[i][j] << " ";
-    s << "\n";
-  }
-  return s;
-}
-
 } // namespace Parma_Polyhedra_Library
 
 namespace std {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates Parma_Polyhedra_Library::DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 inline void
 swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
diff --git a/src/DB_Matrix.templates.hh b/src/DB_Matrix.templates.hh
new file mode 100644
index 0000000..13149b2
--- /dev/null
+++ b/src/DB_Matrix.templates.hh
@@ -0,0 +1,317 @@
+/* DB_Matrix class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_DB_Matrix_templates_hh
+#define PPL_DB_Matrix_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+  : rows(n_rows),
+    row_size(n_rows),
+    row_capacity(compute_capacity(n_rows, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_rows, row_capacity);
+  assert(OK());
+}
+
+template <typename T>
+template <typename U>
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+  : rows(y.rows.size()),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+    rows[i].construct_upward_approximation(y[i], row_capacity);
+  assert(OK());
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+  const dimension_type old_n_rows = rows.size();
+  assert(new_n_rows >= old_n_rows);
+
+  if (new_n_rows > old_n_rows) {
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows.
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows.
+      DB_Matrix new_matrix;
+      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+      // Construct the new rows.
+      new_matrix.row_size = new_n_rows;
+      new_matrix.row_capacity = compute_capacity(new_n_rows,
+						 max_num_columns());
+      dimension_type i = new_n_rows;
+      while (i-- > old_n_rows)
+	new_matrix.rows[i].construct(new_matrix.row_size,
+				     new_matrix.row_capacity);
+      // Copy the old rows.
+      ++i;
+      while (i-- > 0) {
+	// FIXME: copying may be unnecessarily costly.
+	DB_Row<T> new_row(rows[i],
+			  new_matrix.row_size,
+			  new_matrix.row_capacity);
+	std::swap(new_matrix.rows[i], new_row);
+      }
+      // Put the new vector into place.
+      swap(new_matrix);
+      return;
+    }
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	// FIXME: copying may be unnecessarily costly.
+	DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+    // Rows have grown or shrunk.
+    row_size = new_n_rows;
+  }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+  dimension_type old_n_rows = rows.size();
+
+  if (new_n_rows > old_n_rows) {
+    // Rows will be inserted.
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation (of vector `rows') will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows (be careful: each new row must have
+	// the same capacity as each one of the old rows).
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation (of vector `rows') will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	// Be careful: each new row must have
+	// the same capacity as each one of the old rows.
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      DB_Matrix new_matrix(new_n_rows);
+      swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+    // Shrink the existing rows.
+    for (dimension_type i = new_n_rows; i-- > 0; )
+      rows[i].shrink(new_n_rows);
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	DB_Row<T> new_row(new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+  }
+  // DB_Rows have grown or shrunk.
+  row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const DB_Matrix<T>& x = *this;
+  const char separator = ' ';
+  const dimension_type nrows = x.num_rows();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j) {
+      using namespace IO_Operators;
+      s << x[i][j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>)
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type nrows;
+   if (!(s >> nrows))
+    return false;
+  resize_no_copy(nrows);
+  DB_Matrix& x = *this;
+  for (dimension_type i = 0; i < nrows;  ++i)
+    for (dimension_type j = 0; j < nrows; ++j) {
+      Result r = input(x[i][j], s, ROUND_UP);
+      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+      if (!s || r == V_CVT_STR_UNK)
+	return false;
+    }
+
+  // Check invariants.
+  assert(OK());
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename T>
+memory_size_type
+DB_Matrix<T>::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(DB_Row<T>);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes(row_capacity);
+  return n;
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The matrix must be square.
+  if (num_rows() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Matrix has fewer columns than rows:\n"
+	 << "row_size is " << row_size
+	 << ", num_rows() is " << num_rows() << "!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  const DB_Matrix& x = *this;
+  const dimension_type n_rows = x.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+  const dimension_type n = c.num_rows();
+  for (dimension_type i = 0; i < n; ++i) {
+    for (dimension_type j = 0; j < n; ++j)
+      s << c[i][j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_templates_hh)
diff --git a/src/DB_Matrix.types.hh b/src/DB_Matrix.types.hh
index 3163bc8..0e8f06e 100644
--- a/src/DB_Matrix.types.hh
+++ b/src/DB_Matrix.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/DB_Row.defs.hh b/src/DB_Row.defs.hh
index 5ecd770..50a000f 100644
--- a/src/DB_Row.defs.hh
+++ b/src/DB_Row.defs.hh
@@ -1,11 +1,11 @@
 /* DB_Row class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,17 +29,21 @@ site: http://www.cs.unipr.it/ppl/ .*/
 #include <cstddef>
 #include <vector>
 
-#ifndef EXTRA_ROW_DEBUG
+#ifndef PPL_DB_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \brief
-  When EXTRA_ROW_DEBUG evaluates to <CODE>true</CODE>, each instance
+  When PPL_DB_ROW_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each instance
   of the class DB_Row carries its own capacity; this enables extra
   consistency checks to be performed.
   \ingroup PPL_CXX_interface
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-#define EXTRA_ROW_DEBUG 0
-#endif
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_DB_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_DB_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_DB_ROW_EXTRA_DEBUG)
 
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
@@ -48,7 +52,7 @@ site: http://www.cs.unipr.it/ppl/ .*/
   Exception-safety is the only responsibility of this class: it has
   to ensure that its \p impl member is correctly deallocated.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
 public:
@@ -63,10 +67,10 @@ public:
   //! A pointer to the actual implementation.
   Impl* impl;
 
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   //! The capacity of \p impl (only available during debugging).
   dimension_type capacity_;
-#endif // EXTRA_ROW_DEBUG
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 
 private:
   //! Private and unimplemented: copy construction is not allowed.
@@ -110,7 +114,7 @@ private:
   returns <CODE>true</CODE> if and only if \p *this satisfies all
   its invariants.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
 public:
@@ -261,6 +265,30 @@ public:
   //! Returns the past-the-end const iterator.
   const_iterator end() const;
 
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
   //! Checks if all the invariants are satisfied.
   bool OK(dimension_type row_size, dimension_type row_capacity) const;
 
@@ -270,10 +298,10 @@ private:
   //! Exception-safe copy construction mechanism for coefficients.
   void copy_construct_coefficients(const DB_Row& y);
 
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   //! Returns the capacity of the row (only available during debugging).
   dimension_type capacity() const;
-#endif // defined(EXTRA_ROW_DEBUG)
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 };
 
 namespace Parma_Polyhedra_Library {
@@ -281,7 +309,7 @@ namespace Parma_Polyhedra_Library {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! \name Classical comparison operators.
 //@{
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 /*! \relates DB_Row */
 template <typename T>
 bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
@@ -291,7 +319,7 @@ template <typename T>
 bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //@}
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 } // namespace Parma_Polyhedra_Library
 
@@ -303,7 +331,7 @@ bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
   DB_Row objects and, in particular, of the corresponding memory
   allocation functions.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
 public:
@@ -383,13 +411,27 @@ public:
   const T& operator[](dimension_type k) const;
   //@}
 
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
 private:
+  friend class DB_Row<T>;
+
   //! The number of coefficients in the row.
   dimension_type size_;
 
   //! The vector of coefficients.
   T vec_[
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
 	       1
 #endif
   ];
@@ -409,7 +451,7 @@ namespace std {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::DB_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
 	  Parma_Polyhedra_Library::DB_Row<T>& y);
@@ -417,7 +459,7 @@ void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::iter_swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::DB_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
 	       ::iterator x,
@@ -427,5 +469,6 @@ void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
 } // namespace std
 
 #include "DB_Row.inlines.hh"
+#include "DB_Row.templates.hh"
 
 #endif // !defined(PPL_DB_Row_defs_hh)
diff --git a/src/DB_Row.inlines.hh b/src/DB_Row.inlines.hh
index bc246df..7628027 100644
--- a/src/DB_Row.inlines.hh
+++ b/src/DB_Row.inlines.hh
@@ -1,11 +1,11 @@
 /* DB_Row class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,7 +34,7 @@ template <typename T>
 inline void*
 DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
 					   const dimension_type capacity) {
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   return ::operator new(fixed_size + capacity*sizeof(T));
 #else
   assert(capacity >= 1);
@@ -55,6 +55,27 @@ DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
 }
 
 template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl
+::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(T)
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+    - 1*sizeof(T)
+#endif
+    + external_memory_in_bytes();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
+
+template <typename T>
 inline dimension_type
 DB_Row_Impl_Handler<T>::Impl::max_size() {
   return size_t(-1)/sizeof(T);
@@ -94,37 +115,12 @@ template <typename T>
 inline
 DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
   : impl(0) {
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   capacity_ = 0;
 #endif
 }
 
 template <typename T>
-template <typename U>
-void
-DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
-  const dimension_type y_size = y.size();
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0; i < y_size; ++i) {
-    construct(vec_[i], y[i], ROUND_UP);
-    bump_size();
-  }
-#else
-  assert(y_size > 0);
-  if (y_size > 0) {
-    vec_[0] = y[0];
-    bump_size();
-    // Construct in direct order: will destroy in reverse order.
-    for (dimension_type i = 1; i < y_size; ++i) {
-      construct(vec_[i], y[i], ROUND_UP);
-      bump_size();
-    }
-  }
-#endif
-}
-
-template <typename T>
 inline
 DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
   delete impl;
@@ -156,13 +152,13 @@ DB_Row<T>::size() const {
   return this->impl->size();
 }
 
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
 template <typename T>
 inline dimension_type
 DB_Row<T>::capacity() const {
   return this->capacity_;
 }
-#endif // EXTRA_ROW_DEBUG
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 
 template <typename T>
 inline
@@ -173,19 +169,19 @@ DB_Row<T>::DB_Row()
 template <typename T>
 inline void
 DB_Row<T>::allocate(
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
 	       const
 #endif
 	       dimension_type capacity) {
   DB_Row<T>& x = *this;
   assert(capacity <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   if (capacity == 0)
     ++capacity;
 #endif
   assert(x.impl == 0);
   x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   assert(x.capacity_ == 0);
   x.capacity_ = capacity;
 #endif
@@ -196,7 +192,7 @@ inline void
 DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
   DB_Row<T>& x = *this;
   assert(x.impl);
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   assert(new_size <= x.capacity_);
 #endif
   x.impl->expand_within_capacity(new_size);
@@ -207,7 +203,7 @@ inline void
 DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
   DB_Row<T>& x = *this;
   assert(x.impl && y.impl);
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   assert(y.size() <= x.capacity_);
 #endif
   x.impl->copy_construct_coefficients(*(y.impl));
@@ -306,7 +302,7 @@ inline void
 DB_Row<T>::swap(DB_Row& y) {
   DB_Row<T>& x = *this;
   std::swap(x.impl, y.impl);
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   std::swap(x.capacity_, y.capacity_);
 #endif
 }
@@ -316,7 +312,7 @@ inline void
 DB_Row<T>::assign(DB_Row& y) {
   DB_Row<T>& x = *this;
   x.impl = y.impl;
-#if EXTRA_ROW_DEBUG
+#if PPL_DB_ROW_EXTRA_DEBUG
   x.capacity_ = y.capacity_;
 #endif
 }
@@ -347,178 +343,61 @@ DB_Row<T>::operator[](const dimension_type k) const {
 }
 
 template <typename T>
-inline void
-DB_Row_Impl_Handler<T>::
-Impl::expand_within_capacity(const dimension_type new_size) {
-  assert(size() <= new_size && new_size <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // vec_[0] is already constructed.
-  if (size() == 0 && new_size > 0)
-    bump_size();
-#endif
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = size(); i < new_size; ++i) {
-    new (&vec_[i]) T(PLUS_INFINITY);
-    bump_size();
-  }
-}
-
-template <typename T>
-void
-DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
-  const dimension_type old_size = size();
-  assert(new_size <= old_size);
-  // Since ~T() does not throw exceptions, nothing here does.
-  set_size(new_size);
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // Make sure we do not try to destroy vec_[0].
-  if (new_size == 0)
-    ++new_size;
-#endif
-  // We assume construction was done "forward".
-  // We thus perform destruction "backward".
-  for (dimension_type i = old_size; i-- > new_size; )
-    vec_[i].~T();
-}
-
-template <typename T>
-void
-DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
-  const dimension_type y_size = y.size();
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0; i < y_size; ++i) {
-    new (&vec_[i]) T(y.vec_[i]);
-    bump_size();
-  }
-#else
-  assert(y_size > 0);
-  if (y_size > 0) {
-    vec_[0] = y.vec_[0];
-    bump_size();
-    // Construct in direct order: will destroy in reverse order.
-    for (dimension_type i = 1; i < y_size; ++i) {
-      new (&vec_[i]) T(y.vec_[i]);
-      bump_size();
-    }
-  }
-#endif
-}
-
-template <typename T>
-typename DB_Row<T>::iterator
+inline typename DB_Row<T>::iterator
 DB_Row<T>::begin() {
   DB_Row<T>& x = *this;
   return iterator(x.impl->vec_);
 }
 
 template <typename T>
-typename DB_Row<T>::iterator
+inline typename DB_Row<T>::iterator
 DB_Row<T>::end() {
   DB_Row<T>& x = *this;
   return iterator(x.impl->vec_ + x.impl->size_);
 }
 
 template <typename T>
-typename DB_Row<T>::const_iterator
+inline typename DB_Row<T>::const_iterator
 DB_Row<T>::begin() const {
   const DB_Row<T>& x = *this;
   return const_iterator(x.impl->vec_);
 }
 
 template <typename T>
-typename DB_Row<T>::const_iterator
+inline typename DB_Row<T>::const_iterator
 DB_Row<T>::end() const {
   const DB_Row<T>& x = *this;
   return const_iterator(x.impl->vec_ + x.impl->size_);
 }
 
 template <typename T>
-inline bool
-DB_Row<T>::OK(const dimension_type row_size,
-	      const dimension_type
-#if EXTRA_ROW_DEBUG
-	      row_capacity
-#endif
-	      ) const {
-#ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
-#endif
-
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes(dimension_type capacity) const {
   const DB_Row<T>& x = *this;
+  return x.impl->total_memory_in_bytes(capacity);
+}
 
-  bool is_broken = false;
-#if EXTRA_ROW_DEBUG
-# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  if (x.capacity_ == 0) {
-    cerr << "Illegal row capacity: is 0, should be at least 1"
-	 << endl;
-    is_broken = true;
-  }
-  else if (x.capacity_ == 1 && row_capacity == 0)
-    // This is fine.
-    ;
-  else
-# endif
-  if (x.capacity_ != row_capacity) {
-    cerr << "DB_Row capacity mismatch: is " << x.capacity_
-	 << ", should be " << row_capacity << "."
-	 << endl;
-    is_broken = true;
-  }
-#endif
-  if (x.size() != row_size) {
-#ifndef NDEBUG
-    cerr << "DB_Row size mismatch: is " << x.size()
-	 << ", should be " << row_size << "."
-	 << endl;
-#endif
-    is_broken = true;
-  }
-#if EXTRA_ROW_DEBUG
-  if (x.capacity_ < x.size()) {
-#ifndef NDEBUG
-    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
-	 << ", size is " << x.size() << "."
-	 << endl;
-#endif
-    is_broken = true;
-  }
-#endif
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
 
-  for (dimension_type i = x.size(); i-- > 0; ) {
-    const T& element = x[i];
-    // Not OK is bad.
-    if (!element.OK()) {
-      is_broken = true;
-      break;
-    }
-    // In addition, nans should never occur.
-    if (is_not_a_number(element)) {
-#ifndef NDEBUG
-      cerr << "Not-a-number found in DB_Row."
-	   << endl;
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes() const {
+  const DB_Row<T>& x = *this;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  return x.impl->total_memory_in_bytes(x.capacity_);
+#else
+  return x.impl->total_memory_in_bytes();
 #endif
-      is_broken = true;
-      break;
-    }
-  }
-
-  return !is_broken;
 }
 
-
-/*! \relates DB_Row */
 template <typename T>
-inline bool
-operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
-  if (x.size() != y.size())
-    return false;
-  for (dimension_type i = x.size(); i-- > 0; )
-    if (x[i] != y[i])
-      return false;
-  return true;
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
 }
 
 /*! \relates DB_Row */
diff --git a/src/DB_Row.templates.hh b/src/DB_Row.templates.hh
new file mode 100644
index 0000000..2b8abb1
--- /dev/null
+++ b/src/DB_Row.templates.hh
@@ -0,0 +1,212 @@
+/* DB_Row class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_DB_Row_templates_hh
+#define PPL_DB_Row_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    construct(vec_[i], y[i], ROUND_UP);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      construct(vec_[i], y[i], ROUND_UP);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  assert(size() <= new_size && new_size <= max_size());
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // vec_[0] is already constructed.
+  if (size() == 0 && new_size > 0)
+    bump_size();
+#endif
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED);
+    bump_size();
+  }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  assert(new_size <= old_size);
+  // Since ~T() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) T(y.vec_[i]);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) T(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+}
+
+template <typename T>
+memory_size_type
+DB_Row_Impl_Handler<T>::Impl::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += Parma_Polyhedra_Library::external_memory_in_bytes(vec_[i]);
+  return n;
+}
+
+template <typename T>
+bool
+DB_Row<T>::OK(const dimension_type row_size,
+	      const dimension_type
+#if PPL_DB_ROW_EXTRA_DEBUG
+	      row_capacity
+#endif
+	      ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const DB_Row<T>& x = *this;
+  bool is_broken = false;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (x.capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+	 << endl;
+    is_broken = true;
+  }
+  else if (x.capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (x.capacity_ != row_capacity) {
+    cerr << "DB_Row capacity mismatch: is " << x.capacity_
+	 << ", should be " << row_capacity << "."
+	 << endl;
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+  if (x.size() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Row size mismatch: is " << x.size()
+	 << ", should be " << row_size << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+	 << ", size is " << x.size() << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+  for (dimension_type i = x.size(); i-- > 0; ) {
+    const T& element = x[i];
+    // Not OK is bad.
+    if (!element.OK()) {
+      is_broken = true;
+      break;
+    }
+    // In addition, nans should never occur.
+    if (is_not_a_number(element)) {
+#ifndef NDEBUG
+      cerr << "Not-a-number found in DB_Row."
+	   << endl;
+#endif
+      is_broken = true;
+      break;
+    }
+  }
+
+  return !is_broken;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+  if (x.size() != y.size())
+    return false;
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_templates_hh)
diff --git a/src/DB_Row.types.hh b/src/DB_Row.types.hh
index 97cb9e8..1257366 100644
--- a/src/DB_Row.types.hh
+++ b/src/DB_Row.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -14,10 +14,10 @@ PURPOSE. */
 
 namespace Parma_Polyhedra_Library {
 
-template <typename BT>
+template <typename T>
 class DB_Row_Impl_Handler;
 
-template <typename BT>
+template <typename T>
 class DB_Row;
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Determinate.defs.hh b/src/Determinate.defs.hh
index 6fd91bb..727f3b2 100644
--- a/src/Determinate.defs.hh
+++ b/src/Determinate.defs.hh
@@ -1,11 +1,11 @@
 /* Determinate class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,8 +39,8 @@ namespace Parma_Polyhedra_Library {
 
   \relates Determinate
 */
-template <typename PH>
-bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
+template <typename PS>
+bool operator==(const Determinate<PS>& x, const Determinate<PS>& y);
 
 /*! \brief
   Returns <CODE>true</CODE> if and only if
@@ -48,16 +48,16 @@ bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
 
   \relates Determinate
 */
-template <typename PH>
-bool operator!=(const Determinate<PH>& x, const Determinate<PH>& y);
+template <typename PS>
+bool operator!=(const Determinate<PS>& x, const Determinate<PS>& y);
 
 namespace IO_Operators {
 
 //! Output operator.
 /*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
+template <typename PS>
 std::ostream&
-operator<<(std::ostream&, const Determinate<PH>&);
+operator<<(std::ostream&, const Determinate<PS>&);
 
 } // namespace IO_Operators
 
@@ -65,7 +65,7 @@ operator<<(std::ostream&, const Determinate<PH>&);
 
 //! Wraps a PPL class into a determinate constraint system interface.
 /*! \ingroup PPL_CXX_interface */
-template <typename PH>
+template <typename PS>
 class Parma_Polyhedra_Library::Determinate {
 public:
   //! \name Constructors and Destructor
@@ -75,7 +75,7 @@ public:
     Injection operator: builds the determinate constraint system element
     corresponding to the base-level element \p p.
   */
-  Determinate(const PH& p);
+  Determinate(const PS& p);
 
   /*! \brief
     Injection operator: builds the determinate constraint system element
@@ -100,7 +100,7 @@ public:
   //@{
 
   //! Returns a const reference to the embedded element.
-  const PH& element() const;
+  const PS& element() const;
 
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this is the top of the
@@ -135,6 +135,12 @@ public:
   */
   memory_size_type external_memory_in_bytes() const;
 
+  /*!
+    Returns <CODE>true</CODE> if and only if this domain
+    has a nontrivial weakening operator.
+  */
+  static bool has_nontrivial_weakening();
+
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 
@@ -150,6 +156,9 @@ public:
   //! Assigns to \p *this the meet of \p *this and \p y.
   void meet_assign(const Determinate& y);
 
+  //! Assigns to \p *this the result of weakening \p *this with \p y.
+  void weakening_assign(const Determinate& y);
+
   /*! \brief
     Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
     of \p *this and \p y, taken in this order.
@@ -157,14 +166,14 @@ public:
   void concatenate_assign(const Determinate& y);
 
   //! Returns a reference to the embedded element.
-  PH& element();
+  PS& element();
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     On return from this method, the representation of \p *this
     is not shared by different Determinate objects.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   void mutate();
 
   //! Assignment operator.
@@ -179,17 +188,17 @@ public:
   //! A function adapter for the Determinate class.
   /*! \ingroup PPL_CXX_interface
     It lifts a Binary_Operator_Assign function object, taking arguments
-    of type PH, producing the corresponding function object taking
-    arguments of type Determinate<PH>.
+    of type PS, producing the corresponding function object taking
+    arguments of type Determinate<PS>.
 
     The template parameter Binary_Operator_Assign is supposed to
     implement an <EM>apply and assign</EM> function, i.e., a function
-    having signature <CODE>void foo(PH& x, const PH& y)</CODE> that
+    having signature <CODE>void foo(PS& x, const PS& y)</CODE> that
     applies an operator to \c x and \c y and assigns the result to \c x.
     For instance, such a function object is obtained by
     <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   template <typename Binary_Operator_Assign>
   class Binary_Operator_Assign_Lifter {
   public:
@@ -210,7 +219,7 @@ public:
     Helper function returning a Binary_Operator_Assign_Lifter object,
     also allowing for the deduction of template arguments.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   template <typename Binary_Operator_Assign>
   static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
   lift_op_assign(Binary_Operator_Assign op_assign);
@@ -243,7 +252,7 @@ private:
 
   public:
     //! A possibly shared base-level domain element.
-    PH ph;
+    PS ph;
 
     /*! \brief
       Builds a new representation by creating a domain element
@@ -252,7 +261,7 @@ private:
     Rep(dimension_type num_dimensions, Degenerate_Element kind);
 
     //! Builds a new representation by copying base-level element \p p.
-    Rep(const PH& p);
+    Rep(const PS& p);
 
     //! Builds a new representation by copying the constraints in \p cs.
     Rep(const Constraint_System& cs);
@@ -295,9 +304,9 @@ private:
   Rep* prep;
 
   friend bool
-  operator==<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+  operator==<PS>(const Determinate<PS>& x, const Determinate<PS>& y);
   friend bool
-  operator!=<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+  operator!=<PS>(const Determinate<PS>& x, const Determinate<PS>& y);
 };
 
 
@@ -305,9 +314,9 @@ namespace std {
 
 //! Specializes <CODE>std::swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
-void swap(Parma_Polyhedra_Library::Determinate<PH>& x,
-	  Parma_Polyhedra_Library::Determinate<PH>& y);
+template <typename PS>
+void swap(Parma_Polyhedra_Library::Determinate<PS>& x,
+	  Parma_Polyhedra_Library::Determinate<PS>& y);
 
 } // namespace std
 
diff --git a/src/Determinate.inlines.hh b/src/Determinate.inlines.hh
index b6d9a1f..91a924a 100644
--- a/src/Determinate.inlines.hh
+++ b/src/Determinate.inlines.hh
@@ -1,11 +1,11 @@
 /* Determinate class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,105 +27,105 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Rep::Rep(dimension_type num_dimensions,
+Determinate<PS>::Rep::Rep(dimension_type num_dimensions,
 			  Degenerate_Element kind)
   : references(0), ph(num_dimensions, kind) {
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Rep::Rep(const PH& p)
+Determinate<PS>::Rep::Rep(const PS& p)
   : references(0), ph(p) {
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Rep::Rep(const Constraint_System& cs)
+Determinate<PS>::Rep::Rep(const Constraint_System& cs)
   : references(0), ph(cs) {
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Rep::Rep(const Congruence_System& cgs)
+Determinate<PS>::Rep::Rep(const Congruence_System& cgs)
   : references(0), ph(cgs) {
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Rep::~Rep() {
+Determinate<PS>::Rep::~Rep() {
   assert(references == 0);
 }
 
-template <typename PH>
+template <typename PS>
 inline void
-Determinate<PH>::Rep::new_reference() const {
+Determinate<PS>::Rep::new_reference() const {
   ++references;
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::Rep::del_reference() const {
+Determinate<PS>::Rep::del_reference() const {
   return --references == 0;
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::Rep::is_shared() const {
+Determinate<PS>::Rep::is_shared() const {
   return references > 1;
 }
 
-template <typename PH>
+template <typename PS>
 inline memory_size_type
-Determinate<PH>::Rep::external_memory_in_bytes() const {
+Determinate<PS>::Rep::external_memory_in_bytes() const {
   return ph.external_memory_in_bytes();
 }
 
-template <typename PH>
+template <typename PS>
 inline memory_size_type
-Determinate<PH>::Rep::total_memory_in_bytes() const {
+Determinate<PS>::Rep::total_memory_in_bytes() const {
   return sizeof(*this) + external_memory_in_bytes();
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Determinate(const PH& ph)
+Determinate<PS>::Determinate(const PS& ph)
   : prep(new Rep(ph)) {
   prep->new_reference();
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Determinate(const Constraint_System& cs)
+Determinate<PS>::Determinate(const Constraint_System& cs)
   : prep(new Rep(cs)) {
   prep->new_reference();
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Determinate(const Congruence_System& cgs)
+Determinate<PS>::Determinate(const Congruence_System& cgs)
   : prep(new Rep(cgs)) {
   prep->new_reference();
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::Determinate(const Determinate& y)
+Determinate<PS>::Determinate(const Determinate& y)
   : prep(y.prep) {
   prep->new_reference();
 }
 
-template <typename PH>
+template <typename PS>
 inline
-Determinate<PH>::~Determinate() {
+Determinate<PS>::~Determinate() {
   if (prep->del_reference())
     delete prep;
 }
 
-template <typename PH>
-inline Determinate<PH>&
-Determinate<PH>::operator=(const Determinate& y) {
+template <typename PS>
+inline Determinate<PS>&
+Determinate<PS>::operator=(const Determinate& y) {
   y.prep->new_reference();
   if (prep->del_reference())
     delete prep;
@@ -133,15 +133,15 @@ Determinate<PH>::operator=(const Determinate& y) {
   return *this;
 }
 
-template <typename PH>
+template <typename PS>
 inline void
-Determinate<PH>::swap(Determinate& y) {
+Determinate<PS>::swap(Determinate& y) {
   std::swap(prep, y.prep);
 }
 
-template <typename PH>
+template <typename PS>
 inline void
-Determinate<PH>::mutate() {
+Determinate<PS>::mutate() {
   if (prep->is_shared()) {
     Rep* new_prep = new Rep(prep->ph);
     (void) prep->del_reference();
@@ -150,85 +150,99 @@ Determinate<PH>::mutate() {
   }
 }
 
-template <typename PH>
-inline const PH&
-Determinate<PH>::element() const {
+template <typename PS>
+inline const PS&
+Determinate<PS>::element() const {
   return prep->ph;
 }
 
-template <typename PH>
-inline PH&
-Determinate<PH>::element() {
+template <typename PS>
+inline PS&
+Determinate<PS>::element() {
   mutate();
   return prep->ph;
 }
 
-template <typename PH>
+template <typename PS>
 inline void
-Determinate<PH>::upper_bound_assign(const Determinate& y) {
+Determinate<PS>::upper_bound_assign(const Determinate& y) {
   element().upper_bound_assign(y.element());
 }
 
-template <typename PH>
+template <typename PS>
 inline void
-Determinate<PH>::meet_assign(const Determinate& y) {
+Determinate<PS>::meet_assign(const Determinate& y) {
   element().intersection_assign(y.element());
 }
 
-template <typename PH>
+template <typename PS>
+inline bool
+Determinate<PS>::has_nontrivial_weakening() {
+  // FIXME
+  return true;
+}
+
+template <typename PS>
+inline void
+Determinate<PS>::weakening_assign(const Determinate& y) {
+  // FIXME
+  element().difference_assign(y.element());
+}
+
+template <typename PS>
 inline void
-Determinate<PH>::concatenate_assign(const Determinate& y) {
+Determinate<PS>::concatenate_assign(const Determinate& y) {
   element().concatenate_assign(y.element());
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::definitely_entails(const Determinate& y) const {
+Determinate<PS>::definitely_entails(const Determinate& y) const {
   return prep == y.prep || y.prep->ph.contains(prep->ph);
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::is_definitely_equivalent_to(const Determinate& y) const {
+Determinate<PS>::is_definitely_equivalent_to(const Determinate& y) const {
   return prep == y.prep || prep->ph == y.prep->ph;
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::is_top() const {
+Determinate<PS>::is_top() const {
   return prep->ph.is_universe();
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::is_bottom() const {
+Determinate<PS>::is_bottom() const {
   return prep->ph.is_empty();
 }
 
-template <typename PH>
+template <typename PS>
 inline memory_size_type
-Determinate<PH>::external_memory_in_bytes() const {
+Determinate<PS>::external_memory_in_bytes() const {
   return prep->total_memory_in_bytes();
 }
 
-template <typename PH>
+template <typename PS>
 inline memory_size_type
-Determinate<PH>::total_memory_in_bytes() const {
+Determinate<PS>::total_memory_in_bytes() const {
   return sizeof(*this) + external_memory_in_bytes();
 }
 
-template <typename PH>
+template <typename PS>
 inline bool
-Determinate<PH>::OK() const {
+Determinate<PS>::OK() const {
   return prep->ph.OK();
 }
 
 namespace IO_Operators {
 
 /*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
+template <typename PS>
 inline std::ostream&
-operator<<(std::ostream& s, const Determinate<PH>& x) {
+operator<<(std::ostream& s, const Determinate<PS>& x) {
   s << x.element();
   return s;
 }
@@ -236,40 +250,40 @@ operator<<(std::ostream& s, const Determinate<PH>& x) {
 } // namespace IO_Operators
 
 /*! \relates Determinate */
-template <typename PH>
+template <typename PS>
 inline bool
-operator==(const Determinate<PH>& x, const Determinate<PH>& y) {
+operator==(const Determinate<PS>& x, const Determinate<PS>& y) {
   return x.prep == y.prep || x.prep->ph == y.prep->ph;
 }
 
 /*! \relates Determinate */
-template <typename PH>
+template <typename PS>
 inline bool
-operator!=(const Determinate<PH>& x, const Determinate<PH>& y) {
+operator!=(const Determinate<PS>& x, const Determinate<PS>& y) {
   return x.prep != y.prep && x.prep->ph != y.prep->ph;
 }
 
-template <typename PH>
+template <typename PS>
 template <typename Binary_Operator_Assign>
 inline
-Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Determinate<PS>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
 Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
   : op_assign_(op_assign) {
 }
 
-template <typename PH>
+template <typename PS>
 template <typename Binary_Operator_Assign>
 inline void
-Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Determinate<PS>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
 operator()(Determinate& x, const Determinate& y) const {
   op_assign_(x.element(), y.element());
 }
 
-template <typename PH>
+template <typename PS>
 template <typename Binary_Operator_Assign>
 inline
-Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
-Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
+Determinate<PS>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PS>::lift_op_assign(Binary_Operator_Assign op_assign) {
   return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
 }
 
@@ -279,10 +293,10 @@ Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
 namespace std {
 
 /*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
+template <typename PS>
 inline void
-swap(Parma_Polyhedra_Library::Determinate<PH>& x,
-     Parma_Polyhedra_Library::Determinate<PH>& y) {
+swap(Parma_Polyhedra_Library::Determinate<PS>& x,
+     Parma_Polyhedra_Library::Determinate<PS>& y) {
   x.swap(y);
 }
 
diff --git a/src/Determinate.types.hh b/src/Determinate.types.hh
index 71c514e..606786e 100644
--- a/src/Determinate.types.hh
+++ b/src/Determinate.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -14,7 +14,7 @@ PURPOSE. */
 
 namespace Parma_Polyhedra_Library {
 
-template <typename PH>
+template <typename PS>
 class Determinate;
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Float.cc b/src/Float.cc
index c6b05b1..5c06c44 100644
--- a/src/Float.cc
+++ b/src/Float.cc
@@ -1,11 +1,11 @@
 /* IEC 559 floating point format related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include "Float.defs.hh"
 
 namespace Parma_Polyhedra_Library {
diff --git a/src/Float.defs.hh b/src/Float.defs.hh
index de0519c..15674c7 100644
--- a/src/Float.defs.hh
+++ b/src/Float.defs.hh
@@ -1,11 +1,11 @@
 /* IEC 559 floating point format related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,16 +23,11 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Float_defs_hh
 #define PPL_Float_defs_hh 1
 
+#include "meta_programming.hh"
 #include "compiler.hh"
 #include <gmp.h>
 #include <cassert>
 #include <cmath>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
 
 #ifndef NAN
 #define NAN (HUGE_VAL - HUGE_VAL)
@@ -42,7 +37,7 @@ namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_ieee754_single {
   uint32_t word;
@@ -72,10 +67,10 @@ struct float_ieee754_single {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_ieee754_double {
-#ifdef WORDS_BIGENDIAN
+#ifdef PPL_WORDS_BIGENDIAN
   uint32_t msp;
   uint32_t lsp;
 #else
@@ -110,10 +105,10 @@ struct float_ieee754_double {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_intel_double_extended {
-#ifdef WORDS_BIGENDIAN
+#ifdef PPL_WORDS_BIGENDIAN
   uint32_t msp;
   uint64_t lsp;
 #else
@@ -149,10 +144,10 @@ struct float_intel_double_extended {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_ieee754_quad {
-#ifdef WORDS_BIGENDIAN
+#ifdef PPL_WORDS_BIGENDIAN
   uint64_t msp;
   uint64_t lsp;
 #else
@@ -187,18 +182,15 @@ struct float_ieee754_quad {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
-class Float {
-public:
-  static const bool fpu_related = false;
-};
+class Float : public False { };
 
 #if PPL_SUPPORTED_FLOAT
 template <>
-class Float<float> {
+class Float<float> : public True {
 public:
-  typedef CXX_FLOAT_BINARY_FORMAT Binary;
+  typedef PPL_CXX_FLOAT_BINARY_FORMAT Binary;
   union {
     float number;
     Binary binary;
@@ -206,15 +198,14 @@ public:
   Float();
   Float(float v);
   float value();
-  static const bool fpu_related = true;
 };
 #endif
 
 #if PPL_SUPPORTED_DOUBLE
 template <>
-class Float<double> {
+class Float<double> : public True {
 public:
-  typedef CXX_DOUBLE_BINARY_FORMAT Binary;
+  typedef PPL_CXX_DOUBLE_BINARY_FORMAT Binary;
   union {
     double number;
     Binary binary;
@@ -222,15 +213,14 @@ public:
   Float();
   Float(double v);
   double value();
-  static const bool fpu_related = true;
 };
 #endif
 
 #if PPL_SUPPORTED_LONG_DOUBLE
 template <>
-class Float<long double> {
+class Float<long double> : public True {
 public:
-  typedef CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
+  typedef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
   union {
     long double number;
     Binary binary;
@@ -238,7 +228,6 @@ public:
   Float();
   Float(long double v);
   long double value();
-  static const bool fpu_related = true;
 };
 #endif
 
diff --git a/src/Float.inlines.hh b/src/Float.inlines.hh
index cb1c86c..52fce60 100644
--- a/src/Float.inlines.hh
+++ b/src/Float.inlines.hh
@@ -1,11 +1,11 @@
 /* IEC 559 floating point format related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,12 +24,6 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_Float_inlines_hh 1
 
 #include <climits>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
 
 namespace Parma_Polyhedra_Library {
 
@@ -68,12 +62,12 @@ float_ieee754_single::sign_bit() const {
 
 inline void
 float_ieee754_single::dec() {
-  word--;
+  --word;
 }
 
 inline void
 float_ieee754_single::inc() {
-  word++;
+  ++word;
 }
 
 inline void
@@ -132,21 +126,21 @@ float_ieee754_double::sign_bit() const {
 inline void
 float_ieee754_double::dec() {
   if (lsp == 0) {
-    msp--;
+    --msp;
     lsp = LSP_MAX;
   }
   else
-    lsp--;
+    --lsp;
 }
 
 inline void
 float_ieee754_double::inc() {
   if (lsp == LSP_MAX) {
-    msp++;
+    ++msp;
     lsp = 0;
   }
   else
-    lsp++;
+    ++lsp;
 }
 
 inline void
@@ -218,21 +212,21 @@ float_intel_double_extended::sign_bit() const {
 inline void
 float_intel_double_extended::dec() {
   if ((lsp & LSP_DMAX) == 0) {
-    msp--;
+    --msp;
     lsp = (msp & MSP_NEG_INF) == 0 ? LSP_DMAX : LSP_NMAX;
   }
   else
-    lsp--;
+    --lsp;
 }
 
 inline void
 float_intel_double_extended::inc() {
   if ((lsp & LSP_DMAX) == LSP_DMAX) {
-    msp++;
+    ++msp;
     lsp = LSP_DMAX + 1;
   }
   else
-    lsp++;
+    ++lsp;
 }
 
 inline void
@@ -296,21 +290,21 @@ float_ieee754_quad::sign_bit() const {
 inline void
 float_ieee754_quad::dec() {
   if (lsp == 0) {
-    msp--;
+    --msp;
     lsp = LSP_MAX;
   }
   else
-    lsp--;
+    --lsp;
 }
 
 inline void
 float_ieee754_quad::inc() {
   if (lsp == LSP_MAX) {
-    msp++;
+    ++msp;
     lsp = 0;
   }
   else
-    lsp++;
+    ++lsp;
 }
 
 inline void
@@ -334,7 +328,7 @@ float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
     << (MANTISSA_BITS - 64);
 }
 
-#ifdef CXX_FLOAT_BINARY_FORMAT
+#ifdef PPL_CXX_FLOAT_BINARY_FORMAT
 inline
 Float<float>::Float() {
 }
@@ -350,7 +344,7 @@ Float<float>::value() {
 }
 #endif
 
-#ifdef CXX_DOUBLE_BINARY_FORMAT
+#ifdef PPL_CXX_DOUBLE_BINARY_FORMAT
 inline
 Float<double>::Float() {
 }
@@ -366,7 +360,7 @@ Float<double>::value() {
 }
 #endif
 
-#ifdef CXX_LONG_DOUBLE_BINARY_FORMAT
+#ifdef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT
 inline
 Float<long double>::Float() {
 }
diff --git a/src/GMP_Integer.defs.hh b/src/GMP_Integer.defs.hh
index 7d17567..d0bb4c9 100644
--- a/src/GMP_Integer.defs.hh
+++ b/src/GMP_Integer.defs.hh
@@ -1,11 +1,11 @@
 /* GMP_Integer class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -45,12 +45,16 @@ mpz_class& raw_value(GMP_Integer& x);
 //! \name Memory Size Inspection Functions
 //@{
 
+#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns the total size in bytes of the memory occupied by \p x.
 /*! \relates GMP_Integer */
+#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 memory_size_type total_memory_in_bytes(const GMP_Integer& x);
 
+#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns the size in bytes of the memory managed by \p x.
 /*! \relates GMP_Integer */
+#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 memory_size_type external_memory_in_bytes(const GMP_Integer& x);
 
 //@} // Memory Size Inspection Functions
@@ -66,6 +70,19 @@ void neg_assign(GMP_Integer& x);
 /*! \relates GMP_Integer */
 void neg_assign(GMP_Integer& x, const GMP_Integer& y);
 
+//! Assigns to \p x its absolute value.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the remainder of the division of \p y by \p z.
+/*! \relates GMP_Integer */
+void rem_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
 //! Assigns to \p x the greatest common divisor of \p y and \p z.
 /*! \relates GMP_Integer */
 void gcd_assign(GMP_Integer& x,
@@ -76,9 +93,8 @@ void gcd_assign(GMP_Integer& x,
   Assigns to \p x the greatest common divisor of \p y and \p z, and to
   \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
 */
-void gcdext_assign(GMP_Integer& x,
-		   const GMP_Integer& y, const GMP_Integer& z,
-		   GMP_Integer& s, GMP_Integer& t);
+void gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+		   const GMP_Integer& y, const GMP_Integer& z);
 
 //! Assigns to \p x the least common multiple of \p y and \p z.
 /*! \relates GMP_Integer */
@@ -121,16 +137,6 @@ int cmp(const GMP_Integer& x, const GMP_Integer& y);
 
 } // namespace Parma_Polyhedra_Library
 
-
-namespace std {
-
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::GMP_Integer */
-void swap(Parma_Polyhedra_Library::GMP_Integer& x,
-	  Parma_Polyhedra_Library::GMP_Integer& y);
-
-} // namespace std
-
 #include "GMP_Integer.inlines.hh"
 
 #endif // !defined(PPL_GMP_Integer_defs_hh)
diff --git a/src/GMP_Integer.inlines.hh b/src/GMP_Integer.inlines.hh
index c301cd3..5021618 100644
--- a/src/GMP_Integer.inlines.hh
+++ b/src/GMP_Integer.inlines.hh
@@ -1,11 +1,11 @@
 /* GMP_Integer class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,14 +36,28 @@ neg_assign(GMP_Integer& x, const GMP_Integer& y) {
 }
 
 inline void
+abs_assign(GMP_Integer& x) {
+  mpz_abs(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_abs(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
 gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
   mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
 }
 
 inline void
-gcdext_assign(GMP_Integer& x,
-	      const GMP_Integer& y, const GMP_Integer& z,
-	      GMP_Integer& s, GMP_Integer& t) {
+rem_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_tdiv_r(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+	      const GMP_Integer& y, const GMP_Integer& z) {
   mpz_gcdext(x.get_mpz_t(),
 	     s.get_mpz_t(), t.get_mpz_t(),
 	     y.get_mpz_t(), z.get_mpz_t());
@@ -90,23 +104,6 @@ raw_value(GMP_Integer& x) {
   return x;
 }
 
-inline memory_size_type
-external_memory_in_bytes(const GMP_Integer& x) {
-  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
-}
-
-inline memory_size_type
-total_memory_in_bytes(const GMP_Integer& x) {
-  return sizeof(x) + external_memory_in_bytes(x);
-}
-
 } // namespace Parma_Polyhedra_Library
 
-/*! \relates Parma_Polyhedra_Library::GMP_Integer */
-inline void
-std::swap(Parma_Polyhedra_Library::GMP_Integer& x,
-	  Parma_Polyhedra_Library::GMP_Integer& y) {
-  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
-}
-
 #endif // !defined(PPL_GMP_Integer_inlines_hh)
diff --git a/src/GMP_Integer.types.hh b/src/GMP_Integer.types.hh
index 37f802c..6952cdc 100644
--- a/src/GMP_Integer.types.hh
+++ b/src/GMP_Integer.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -14,6 +14,7 @@ PURPOSE. */
 
 #include "Coefficient_traits_template.hh"
 #include <gmpxx.h>
+#include "mp_std_bits.defs.hh"
 
 namespace Parma_Polyhedra_Library {
 
@@ -31,7 +32,7 @@ typedef mpz_class GMP_Integer;
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Coefficient traits specialization for unbounded integers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <>
 struct Coefficient_traits_template<GMP_Integer> {
   //! The type used for references to const unbounded integers.
diff --git a/src/Generator.cc b/src/Generator.cc
index 778d353..f4526d2 100644
--- a/src/Generator.cc
+++ b/src/Generator.cc
@@ -1,11 +1,11 @@
 /* Generator class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Generator.defs.hh"
 
@@ -157,12 +157,37 @@ PPL::Generator::is_equivalent_to(const Generator& y) const {
   return true;
 }
 
+const PPL::Generator* PPL::Generator::zero_dim_point_p = 0;
+const PPL::Generator* PPL::Generator::zero_dim_closure_point_p = 0;
+
+void
+PPL::Generator::initialize() {
+  assert(zero_dim_point_p == 0);
+  zero_dim_point_p
+    = new Generator(point());
+
+  assert(zero_dim_closure_point_p == 0);
+  zero_dim_closure_point_p
+    = new Generator(closure_point());
+}
+
+void
+PPL::Generator::finalize() {
+  assert(zero_dim_point_p != 0);
+  delete zero_dim_point_p;
+  zero_dim_point_p = 0;
+
+  assert(zero_dim_closure_point_p != 0);
+  delete zero_dim_closure_point_p;
+  zero_dim_closure_point_p = 0;
+}
+
 /*! \relates Parma_Polyhedra_Library::Generator */
 std::ostream&
 PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
   bool needed_divisor = false;
   bool extra_parentheses = false;
-  const int num_variables = g.space_dimension();
+  const dimension_type num_variables = g.space_dimension();
   Generator::Type t = g.type();
   switch (t) {
   case Generator::LINE:
@@ -179,8 +204,8 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
   any_point:
     if (g[0] != 1) {
       needed_divisor = true;
-      int num_non_zero_coefficients = 0;
-      for (int v = 0; v < num_variables; ++v)
+      dimension_type num_non_zero_coefficients = 0;
+      for (dimension_type v = 0; v < num_variables; ++v)
 	if (g[v+1] != 0)
 	  if (++num_non_zero_coefficients > 1) {
 	    extra_parentheses = true;
@@ -191,9 +216,10 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
     break;
   }
 
+  TEMP_INTEGER(gv);
   bool first = true;
-  for (int v = 0; v < num_variables; ++v) {
-    Coefficient gv = g[v+1];
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    gv = g[v+1];
     if (gv != 0) {
       if (!first) {
 	if (gv > 0)
@@ -286,11 +312,13 @@ PPL::Generator::is_matching_closure_point(const Generator& p) const {
   }
 }
 
-PPL_OUTPUT_DEFINITIONS(Generator);
+PPL_OUTPUT_DEFINITIONS(Generator)
 
 bool
 PPL::Generator::OK() const {
-  const Generator& g = *this;
+  // Check the underlying Linear_Row object.
+  if (!Linear_Row::OK())
+    return false;
 
   // Topology consistency check.
   const dimension_type min_size = is_necessarily_closed() ? 1 : 2;
@@ -307,6 +335,7 @@ PPL::Generator::OK() const {
   }
 
   // Normalization check.
+  const Generator& g = *this;
   Generator tmp = g;
   tmp.strong_normalize();
   if (tmp != g) {
diff --git a/src/Generator.defs.hh b/src/Generator.defs.hh
index 57caab1..8a3e245 100644
--- a/src/Generator.defs.hh
+++ b/src/Generator.defs.hh
@@ -1,11 +1,11 @@
 /* Generator class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,6 +34,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Polyhedron.types.hh"
 #include "Grid_Generator.types.hh"
 #include "Grid_Generator_System.types.hh"
+#include "Checked_Number.defs.hh"
+#include "distances.defs.hh"
 #include <iosfwd>
 
 namespace Parma_Polyhedra_Library {
@@ -217,7 +219,7 @@ void swap(Parma_Polyhedra_Library::Generator& x,
   if (g1.is_point()) {
     cout << "Point g1: " << g1 << endl;
     Linear_Expression e;
-    for (int i = g1.space_dimension() - 1; i >= 0; i--)
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
       e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
     Generator g2 = closure_point(e, g1.divisor());
     cout << "Closure point g2: " << g2 << endl;
@@ -319,7 +321,7 @@ public:
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool is_line_or_ray() const;
 
   //! Returns <CODE>true</CODE> if and only if \p *this is a point.
@@ -343,6 +345,12 @@ public:
   */
   Coefficient_traits::const_reference divisor() const;
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
   static const Generator& zero_dim_point();
 
@@ -369,12 +377,12 @@ public:
   */
   bool is_equivalent_to(const Generator& y) const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
     Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
 #endif
@@ -388,6 +396,18 @@ public:
 
 private:
   /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator* zero_dim_point_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$, as a closure point.
+  */
+  static const Generator* zero_dim_closure_point_p;
+
+  /*! \brief
     Builds a generator of type \p type and topology \p topology,
     stealing the coefficients from \p e.
   */
@@ -492,6 +512,203 @@ bool operator==(const Generator& x, const Generator& y);
 /*! \relates Generator */
 bool operator!=(const Generator& x, const Generator& y);
 
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
 
 namespace IO_Operators {
 
diff --git a/src/Generator.inlines.hh b/src/Generator.inlines.hh
index b66f4f1..99e61ce 100644
--- a/src/Generator.inlines.hh
+++ b/src/Generator.inlines.hh
@@ -1,11 +1,11 @@
 /* Generator class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -147,14 +147,14 @@ Generator::total_memory_in_bytes() const {
 
 inline const Generator&
 Generator::zero_dim_point() {
-  static const Generator zdp = point();
-  return zdp;
+  assert(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
 }
 
 inline const Generator&
 Generator::zero_dim_closure_point() {
-  static const Generator zdcp = closure_point();
-  return zdcp;
+  assert(zero_dim_closure_point_p != 0);
+  return *zero_dim_closure_point_p;
 }
 
 /*! \relates Generator */
@@ -209,6 +209,180 @@ Generator::swap(Generator& y) {
   Linear_Row::swap(y);
 }
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Generator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const Generator& x,
+		    const Generator& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  // Generator kind compatibility check: we only compute distances
+  // between (closure) points.
+  if (x.is_line_or_ray() || y.is_line_or_ray())
+    return false;
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // All zero-dim generators have distance zero.
+  if (x_space_dim == 0) {
+    assign_r(r, 0, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  DIRTY_TEMP0(mpq_class, x_coord);
+  DIRTY_TEMP0(mpq_class, y_coord);
+  DIRTY_TEMP0(mpq_class, x_div);
+  DIRTY_TEMP0(mpq_class, y_div);
+  assign_r(x_div, x.divisor(), ROUND_NOT_NEEDED);
+  assign_r(y_div, y.divisor(), ROUND_NOT_NEEDED);
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    assign_r(x_coord, x.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(x_coord, x_coord, x_div, ROUND_NOT_NEEDED);
+    assign_r(y_coord, y.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(y_coord, y_coord, y_div, ROUND_NOT_NEEDED);
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+
+    if (x_coord > y_coord) {
+      maybe_assign(tmp1p, tmp1, x_coord, dir);
+      maybe_assign(tmp2p, tmp2, y_coord, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_coord, dir);
+      maybe_assign(tmp2p, tmp2, x_coord, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    assert(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Generator& x,
+			    const Generator& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Generator& x,
+			    const Generator& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Generator& x,
+			    const Generator& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Generator& x,
+			  const Generator& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Generator& x,
+			  const Generator& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Generator& x,
+			  const Generator& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Generator& x,
+			   const Generator& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Generator& x,
+			   const Generator& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Generator& x,
+			   const Generator& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To>(r, x, y, dir);
+}
+
 } // namespace Parma_Polyhedra_Library
 
 namespace std {
diff --git a/src/Generator.types.hh b/src/Generator.types.hh
index 6ed070c..8a8152f 100644
--- a/src/Generator.types.hh
+++ b/src/Generator.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Generator_System.cc b/src/Generator_System.cc
index 821ef2f..866efca 100644
--- a/src/Generator_System.cc
+++ b/src/Generator_System.cc
@@ -1,11 +1,11 @@
 /* Generator_System class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Generator_System.defs.hh"
 #include "Generator_System.inlines.hh"
@@ -44,8 +44,8 @@ adjust_topology_and_space_dimension(const Topology new_topology,
   const Topology old_topology = topology();
   dimension_type cols_to_be_added = new_space_dim - old_space_dim;
 
-  // Dealing with empty constraint systems first.
-  if (num_rows() == 0) {
+  // Dealing with empty generator systems first.
+  if (has_no_rows()) {
     if (num_columns() == 0)
       if (new_topology == NECESSARILY_CLOSED) {
 	add_zero_columns(cols_to_be_added + 1);
@@ -85,7 +85,7 @@ adjust_topology_and_space_dimension(const Topology new_topology,
     return true;
   }
 
-  // Here `num_rows() > 0'.
+  // Here the generator systen is not empty.
   if (cols_to_be_added > 0)
     if (old_topology != new_topology)
       if (new_topology == NECESSARILY_CLOSED) {
@@ -150,7 +150,7 @@ adjust_topology_and_space_dimension(const Topology new_topology,
     }
   else
     // Here `cols_to_be_added == 0'.
-    if (old_topology != new_topology)
+    if (old_topology != new_topology) {
       if (new_topology == NECESSARILY_CLOSED) {
 	// A NOT_NECESSARILY_CLOSED generator system
 	// can be converted in to a NECESSARILY_CLOSED one
@@ -172,6 +172,7 @@ adjust_topology_and_space_dimension(const Topology new_topology,
 	  gs[i][eps_index] = gs[i][0];
 	set_not_necessarily_closed();
       }
+    }
   // We successfully adjusted dimensions and topology.
   assert(OK());
   return true;
@@ -235,7 +236,7 @@ PPL::Generator_System::has_closure_points() const {
     return false;
   // Adopt the point of view of the user.
   for (Generator_System::const_iterator i = begin(),
-	 iend = end(); i != iend; ++i)
+	 this_end = end(); i != this_end; ++i)
     if (i->is_closure_point())
       return true;
   return false;
@@ -447,7 +448,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
 	// If that is the case, then we have to do something only if
 	// the generator is a point.
 	if (sp_sign == 0) {
-	  if (g.is_point())
+	  if (g.is_point()) {
 	    if (first_point_or_nonsaturating_ray_sign == 2)
 	      // It is the first time that we find a point and
 	      // we have not found a non-saturating ray yet.
@@ -456,6 +457,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
 	      // We already found a point or a non-saturating ray.
 	      if (first_point_or_nonsaturating_ray_sign != 0)
 		return Poly_Con_Relation::strictly_intersects();
+	  }
 	}
 	else
 	  // Here we know that sp_sign != 0.
@@ -505,7 +507,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
       // The hyperplane implicitly defined by the non-strict inequality `c'
       // is included in the set of points satisfying `c'.
       result = result && Poly_Con_Relation::is_included();
-      // The following boolean variable will be set to `false'
+      // The following Boolean variable will be set to `false'
       // as soon as either we find (any) point or we find a
       // non-saturating ray.
       bool first_point_or_nonsaturating_ray = true;
@@ -517,7 +519,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
 	// inequality. If that is the case, then we have to do something
 	// only if the generator is a point.
 	if (sp_sign == 0) {
-	  if (g.is_point())
+	  if (g.is_point()) {
 	    if (first_point_or_nonsaturating_ray)
 	      // It is the first time that we have a point and
 	      // we have not found a non-saturating ray yet.
@@ -528,6 +530,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
 		// Since g saturates c, we have a strict intersection if
 		// none of the generators seen so far are included in `c'.
 		return Poly_Con_Relation::strictly_intersects();
+	  }
 	}
 	else
 	  // Here we know that sp_sign != 0.
@@ -616,7 +619,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
       // The hyperplane implicitly defined by the strict inequality `c'
       // is disjoint from the set of points satisfying `c'.
       result = result && Poly_Con_Relation::is_disjoint();
-      // The following boolean variable will be set to `false'
+      // The following Boolean variable will be set to `false'
       // as soon as either we find (any) point or we find a
       // non-saturating ray.
       bool first_point_or_nonsaturating_ray = true;
@@ -629,7 +632,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
 	// If that is the case, then we have to do something
 	// only if the generator is a point.
 	if (sp_sign == 0) {
-	  if (g.is_point())
+	  if (g.is_point()) {
 	    if (first_point_or_nonsaturating_ray)
 	      // It is the first time that we have a point and
 	      // we have not found a non-saturating ray yet.
@@ -638,6 +641,7 @@ PPL::Generator_System::relation_with(const Constraint& c) const {
 	      // We already found a point or a non-saturating ray before.
 	      if (result == Poly_Con_Relation::is_included())
 		return Poly_Con_Relation::strictly_intersects();
+	  }
 	}
 	else
 	  // Here we know that sp_sign != 0.
@@ -861,7 +865,7 @@ PPL::Generator_System::ascii_dump(std::ostream& s) const {
   }
 }
 
-PPL_OUTPUT_DEFINITIONS(Generator_System);
+PPL_OUTPUT_DEFINITIONS(Generator_System)
 
 bool
 PPL::Generator_System::ascii_load(std::istream& s) {
@@ -934,8 +938,7 @@ PPL::Generator_System::ascii_load(std::istream& s) {
     return false;
   }
 
-  // Checking for well-formedness.
-
+  // Check invariants.
   assert(OK());
   return true;
 }
@@ -998,6 +1001,22 @@ PPL::Generator_System::remove_invalid_lines_and_rays() {
   gs.erase_to_end(n_rows);
 }
 
+const PPL::Generator_System* PPL::Generator_System::zero_dim_univ_p = 0;
+
+void
+PPL::Generator_System::initialize() {
+  assert(zero_dim_univ_p == 0);
+  zero_dim_univ_p
+    = new Generator_System(Generator::zero_dim_point());
+}
+
+void
+PPL::Generator_System::finalize() {
+  assert(zero_dim_univ_p != 0);
+  delete zero_dim_univ_p;
+  zero_dim_univ_p = 0;
+}
+
 bool
 PPL::Generator_System::OK() const {
   // A Generator_System must be a valid Linear_System; do not check for
diff --git a/src/Generator_System.defs.hh b/src/Generator_System.defs.hh
index 6fdb704..6e4ea15 100644
--- a/src/Generator_System.defs.hh
+++ b/src/Generator_System.defs.hh
@@ -1,11 +1,11 @@
 /* Generator_System class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -180,7 +180,7 @@ void swap(Parma_Polyhedra_Library::Generator_System& x,
     will be available, where original generators may have been
     reordered, removed (if they are duplicate or redundant), etc.
 */
-class Parma_Polyhedra_Library::Generator_System : private Linear_System {
+class Parma_Polyhedra_Library::Generator_System : protected Linear_System {
 public:
   //! Default constructor: builds an empty system of generators.
   Generator_System();
@@ -215,9 +215,14 @@ public:
   */
   void insert(const Generator& g);
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   /*! \brief
-    Returns the singleton system containing only
-    Generator::zero_dim_point().
+    Returns the singleton system containing only Generator::zero_dim_point().
   */
   static const Generator_System& zero_dim_univ();
 
@@ -305,6 +310,9 @@ public:
     void skip_forward();
   };
 
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
   /*! \brief
     Returns the const_iterator pointing to the first generator,
     if \p *this is not empty;
@@ -322,19 +330,19 @@ public:
   */
   bool OK() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
     Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
 
     Resizes the matrix of generators using the numbers of rows and columns
     read from \p s, then initializes the coordinates of each generator
     and its type reading the contents from \p s.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
   //! Returns the total size in bytes of the memory occupied by \p *this.
@@ -347,13 +355,17 @@ public:
   void swap(Generator_System& y);
 
 private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System* zero_dim_univ_p;
+
   friend class const_iterator;
   friend class Parma_Polyhedra_Library::Polyhedron;
   friend class Parma_Polyhedra_Library::Grid_Generator_System;
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
-				      const Polyhedron& y);
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
 
   //! Builds an empty system of generators having the specified topology.
   explicit Generator_System(Topology topol);
@@ -486,7 +498,7 @@ private:
   void remove_invalid_lines_and_rays();
 
   /*! \brief
-    Applies Gaussian's elimination and back-substitution so as
+    Applies Gaussian elimination and back-substitution so as
     to provide a partial simplification of the system of generators.
 
     It is assumed that the system has no pending generators.
diff --git a/src/Generator_System.inlines.hh b/src/Generator_System.inlines.hh
index fc6471b..6f00016 100644
--- a/src/Generator_System.inlines.hh
+++ b/src/Generator_System.inlines.hh
@@ -1,11 +1,11 @@
 /* Generator_System class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -154,6 +154,11 @@ const_iterator(const Linear_System::const_iterator& iter,
   : i(iter), gsp(&gsys) {
 }
 
+inline bool
+Generator_System::empty() const {
+  return Linear_System::has_no_rows();
+}
+
 inline Generator_System::const_iterator
 Generator_System::begin() const {
   const_iterator i(Linear_System::begin(), *this);
@@ -170,8 +175,8 @@ Generator_System::end() const {
 
 inline const Generator_System&
 Generator_System::zero_dim_univ() {
-  static const Generator_System zdu(Generator::zero_dim_point());
-  return zdu;
+  assert(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
 }
 
 inline void
diff --git a/src/Generator_System.types.hh b/src/Generator_System.types.hh
index 0166685..1a03715 100644
--- a/src/Generator_System.types.hh
+++ b/src/Generator_System.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Grid.defs.hh b/src/Grid.defs.hh
index c4652b0..7ba5fe5 100644
--- a/src/Grid.defs.hh
+++ b/src/Grid.defs.hh
@@ -1,11 +1,11 @@
 /* Grid class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,11 +23,12 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Grid_defs_hh
 #define PPL_Grid_defs_hh 1
 
-#define STRONG_REDUCTION
+#define STRONG_REDUCTION 1
 
 #include "Grid.types.hh"
 #include "globals.defs.hh"
 #include "Variable.defs.hh"
+#include "Variables_Set.types.hh"
 #include "Linear_Expression.defs.hh"
 #include "Constraint.defs.hh"
 #include "Constraint_System.defs.hh"
@@ -40,21 +41,15 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Poly_Con_Relation.defs.hh"
 #include "Poly_Gen_Relation.defs.hh"
 #include "Grid_Certificate.types.hh"
+#include "Box.types.hh"
+#include "Polyhedron.defs.hh"
+#include "Polyhedron.types.hh"
+#include "Polyhedron.inlines.hh"
+#include "BD_Shape.types.hh"
+#include "Octagonal_Shape.types.hh"
 #include <vector>
 #include <iosfwd>
 
-// Dimension kind vector tracing
-#define print_dim_kinds(msg, dim_kinds)					\
-  std::cout << msg << "dim_kinds:";					\
-  for (Dimension_Kinds::iterator i = dim_kinds.begin(); i != dim_kinds.end(); ++i) \
-    std::cout << " " << *i;						\
-  std::cout << std::endl;
-#if 0
-#define trace_dim_kinds(msg, dim_kinds) print_dim_kinds(msg, dim_kinds)
-#else
-#define trace_dim_kinds(msg, dim_kinds)
-#endif
-
 namespace Parma_Polyhedra_Library {
 
 namespace IO_Operators {
@@ -105,17 +100,12 @@ bool operator!=(const Grid& x, const Grid& y);
   sect_rational_grids) and it is always possible to obtain either
   representation.
   That is, if we know the system of congruences, we can obtain
-  from this the system of generators that define the same grid
+  from this a system of generators that define the same grid
   and vice versa.
   These systems can contain redundant members, or they can be in the
   minimal form.
-  Most operators on grids are provided with two implementations:
-  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
-  also enforces the minimization of the representations,
-  and returns the boolean value <CODE>false</CODE> whenever
-  the resulting grid turns out to be empty.
 
-  A key attributes of any grid is its space dimension (the dimension
+  A key attribute of any grid is its space dimension (the dimension
   \f$n \in \Nset\f$ of the enclosing vector space):
 
   - all grids, the empty ones included, are endowed with a space
@@ -207,9 +197,9 @@ bool operator!=(const Grid& x, const Grid& y);
   generators (a point, and two lines).
   \code
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(0*x + 0*y));
-  gr.add_generator(grid_line(x));
-  gr.add_generator(grid_line(y));
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_line(x));
+  gr.add_grid_generator(grid_line(y));
   \endcode
   Note that a generator system must contain a point when describing
   a grid.  To ensure that this is always the case it is required
@@ -256,9 +246,9 @@ bool operator!=(const Grid& x, const Grid& y);
   <CODE>affine_image</CODE>:
   \code
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(0*x + 0*y));
-  gr.add_generator(grid_point(4*x + 0*y));
-  gr.add_generator(grid_point(0*x + 2*y));
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
   Linear_Expression expr = x + 3;
   gr.affine_image(x, expr);
   \endcode
@@ -289,9 +279,9 @@ bool operator!=(const Grid& x, const Grid& y);
   <CODE>affine_preimage</CODE>:
   \code
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(0*x + 0*y));
-  gr.add_generator(grid_point(4*x + 0*y));
-  gr.add_generator(grid_point(0*x + 2*y));
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
   Linear_Expression expr = x + 3;
   gr.affine_preimage(x, expr);
   \endcode
@@ -361,9 +351,24 @@ bool operator!=(const Grid& x, const Grid& y);
 
 class Parma_Polyhedra_Library::Grid {
 public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
+
   //! Returns the maximum space dimension all kinds of Grid can handle.
   static dimension_type max_space_dimension();
 
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
   //! Builds a grid having the specified properties.
   /*!
     \param num_dimensions
@@ -377,7 +382,7 @@ public:
     dimension.
   */
   explicit Grid(dimension_type num_dimensions = 0,
-		const Degenerate_Element kind = UNIVERSE);
+		Degenerate_Element kind = UNIVERSE);
 
   //! Builds a grid, copying a system of congruences.
   /*!
@@ -398,13 +403,17 @@ public:
 
     \param cgs
     The system of congruences defining the grid.  Its data-structures
-    will be recycled to build the grid.
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
     \exception std::length_error
     Thrown if \p num_dimensions exceeds the maximum allowed space
     dimension.
   */
-  explicit Grid(Congruence_System& cgs);
+  Grid(Congruence_System& cgs, Recycle_Input dummy);
 
   //! Builds a grid, copying a system of constraints.
   /*!
@@ -424,15 +433,20 @@ public:
     The grid inherits the space dimension of the constraint system.
 
     \param cs
-    The system of constraints defining the grid.
+    The system of constraints defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
     \exception std::length_error
     Thrown if \p num_dimensions exceeds the maximum allowed space
     dimension.
   */
-  explicit Grid(Constraint_System& cs);
+  Grid(Constraint_System& cs, Recycle_Input dummy);
 
-  //! Builds a grid, copying a system of generators.
+  //! Builds a grid, copying a system of grid generators.
   /*!
     The grid inherits the space dimension of the generator system.
 
@@ -448,13 +462,17 @@ public:
   */
   explicit Grid(const Grid_Generator_System& const_gs);
 
-  //! Builds a grid, recycling a system of generators.
+  //! Builds a grid, recycling a system of grid generators.
   /*!
     The grid inherits the space dimension of the generator system.
 
     \param gs
     The system of generators defining the grid.  Its data-structures
-    will be recycled to build the grid.
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
     \exception std::invalid_argument
     Thrown if the system of generators is not empty but has no points.
@@ -462,69 +480,67 @@ public:
     \exception std::length_error
     Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
   */
-  explicit Grid(Grid_Generator_System& gs);
+  Grid(Grid_Generator_System& gs, Recycle_Input dummy);
 
-  //! Builds a grid out of a generic, interval-based bounding box.
+  //! Builds a grid out of a box.
   /*!
+    The grid inherits the space dimension of the box.
+    The built grid is the most precise grid that includes the box.
+
     \param box
-    The bounding box representing the grid to be built.  The box can
-    contain only point and universe intervals;
+    The box representing the grid to be built.
 
-    \param dummy
-    A dummy tag to make this constructor syntactically unique.
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
     \exception std::length_error
     Thrown if the space dimension of \p box exceeds the maximum
     allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Grid(const Box<Interval>& box,
+                Complexity_Class complexity = ANY_COMPLEXITY);
 
-    \exception std::invalid_argument
-    Thrown if \p box contains at least one interval with: a
-    topologically open bound, a single bound, or two bounds which have
-    space between them.
+  //! Builds a grid out of a bounded-difference shape.
+  /*!
+    The grid inherits the space dimension of the BDS.
+    The built grid is the most precise grid that includes the BDS.
 
-    The template class Box must provide the following methods.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the bounding box.
-    \code
-      bool is_empty() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the bounding box
-    describes the empty set.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
+    \param bd
+    The BDS representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
   */
-  template <typename Box>
-  Grid(const Box& box, From_Bounding_Box dummy);
+  template <typename U>
+  explicit Grid(const BD_Shape<U>& bd,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a grid out of an octagonal shape.
+  /*!
+    The grid inherits the space dimension of the octagonal shape.
+    The built grid is the most precise grid that includes the octagonal shape.
+
+    \param os
+    The octagonal shape representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Grid(const Octagonal_Shape<U>& os,
+                Complexity_Class complexity = ANY_COMPLEXITY);
 
   //! Builds a grid out of a generic, interval-based covering box.
   /*!
@@ -565,7 +581,7 @@ public:
     returns <CODE>true</CODE> if and only if the covering box
     describes the empty set.
     \code
-      bool get_lower_bound(dimension_type k, bool closed,
+      bool get_lower_bound(dimension_type k, bool& closed,
                            Coefficient& n, Coefficient& d) const
     \endcode
     Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
@@ -581,7 +597,7 @@ public:
     have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
     the unique representation for zero.
     \code
-      bool get_upper_bound(dimension_type k, bool closed,
+      bool get_upper_bound(dimension_type k, bool& closed,
                            Coefficient& n, Coefficient& d) const
     \endcode
     Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
@@ -597,8 +613,33 @@ public:
   template <typename Box>
   Grid(const Box& box, From_Covering_Box dummy);
 
+  /*! \brief
+    Builds a grid from a polyhedron using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the grid built is the
+    smallest one containing \p ph.
+
+    The grid inherits the space dimension of polyhedron.
+
+    \param ph
+    The polyhedron.
+
+    \param complexity
+    The complexity class.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Polyhedron& ph,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
   //! Ordinary copy-constructor.
-  Grid(const Grid& y);
+  /*!
+    The complexity argument is ignored.
+  */
+  Grid(const Grid& y,
+       Complexity_Class complexity = ANY_COMPLEXITY);
 
   /*! \brief
     The assignment operator.  (\p *this and \p y can be
@@ -618,17 +659,29 @@ public:
   */
   dimension_type affine_dimension() const;
 
+  /*! \brief
+    Returns a system of equality constraints satisfied by \p *this
+    with the same affine dimension as \p *this.
+  */
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Returns a minimal system of equality constraints satisfied by
+    \p *this with the same affine dimension as \p *this.
+  */
+  Constraint_System minimized_constraints() const;
+
   //! Returns the system of congruences.
   const Congruence_System& congruences() const;
 
-  //! Returns the system of congruences in reduced form.
+  //! Returns the system of congruences in minimal form.
   const Congruence_System& minimized_congruences() const;
 
   //! Returns the system of generators.
-  const Grid_Generator_System& generators() const;
+  const Grid_Generator_System& grid_generators() const;
 
   //! Returns the minimized system of generators.
-  const Grid_Generator_System& minimized_generators() const;
+  const Grid_Generator_System& minimized_grid_generators() const;
 
   //! Returns the relations holding between \p *this and \p cg.
   /*
@@ -649,21 +702,36 @@ public:
   Poly_Gen_Relation
   relation_with(const Grid_Generator& g) const;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is an empty
-    grid.
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
   */
-  bool is_empty() const;
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Generator& g) const;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is a universe
-    grid.
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
   */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns \c true if and only if \p *this is an empty grid.
+  bool is_empty() const;
+
+  //! Returns \c true if and only if \p *this is a universe grid.
   bool is_universe() const;
 
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this is a
     topologically closed subset of the vector space.
+
+    A grid is always topologically closed.
   */
   bool is_topologically_closed() const;
 
@@ -687,6 +755,21 @@ public:
   //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
   bool is_bounded() const;
 
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
   //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
   /*!
     This method is the same as bounds_from_below.
@@ -768,7 +851,7 @@ public:
   */
   bool maximize(const Linear_Expression& expr,
 		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-		Grid_Generator& point) const;
+		Generator& point) const;
 
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this is not empty and
@@ -833,7 +916,7 @@ public:
   */
   bool minimize(const Linear_Expression& expr,
 		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-		Grid_Generator& point) const;
+		Generator& point) const;
 
   //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
   /*!
@@ -851,82 +934,6 @@ public:
   */
   bool strictly_contains(const Grid& y) const;
 
-  //! Uses \p *this to shrink a generic, interval-based bounding box.
-  /*!
-    \param box
-    The bounding box to be shrunk.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p box are dimension-incompatible, or if \p
-    box contains any topologically open bounds.
-
-    The template class Box must provide the following methods
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the bounding box.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
-    \code
-      set_empty()
-    \endcode
-    Causes the box to become empty, i.e., to represent the empty set.
-    \code
-      raise_lower_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-    \code
-      lower_upper_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-
-    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
-    will be called at most once for each possible value for <CODE>k</CODE>
-    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
-    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
-    is positive, \f$0/1\f$ being the unique representation for zero.
-    The same guarantee is offered for the function
-    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
-  */
-  template <typename Box>
-  void shrink_bounding_box(Box& box) const;
-
   //! Writes the covering box for \p *this into \p box.
   /*!
     The covering box is a set of upper and lower values for each
@@ -953,48 +960,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p box are dimension-incompatible.
-
-    The template class Box must provide the following methods
-    \code
-      Box(dimension_type space_dimension)
-    \endcode
-    Creates a universe box of space_dimension dimensions.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the covering box.
-    \code
-      set_empty()
-    \endcode
-    Causes the box to become empty, i.e., to represent the empty set.
-    \code
-      raise_lower_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-    \code
-      lower_upper_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-
-    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
-    will be called at most once for each possible value for <CODE>k</CODE>
-    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
-    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
-    is positive, \f$0/1\f$ being the unique representation for zero.
-    The same guarantee is offered for the function
-    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
   */
-  template <typename Box>
-  void get_covering_box(Box& box) const;
+  template <typename Interval>
+  void get_covering_box(Box<Interval>& box) const;
 
   //! Checks if all the invariants are satisfied.
   /*!
@@ -1046,6 +1014,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and congruence \p cg are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_congruence_and_minimize(const Congruence& c);
 
@@ -1058,22 +1029,25 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and constraint \p c are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_congruence_and_minimize(const Constraint& c);
 
   /*! \brief
-    Adds a copy of generator \p g to the system of generators of \p
-    *this.
+    Adds a copy of grid generator \p g to the system of generators of
+    \p *this.
 
     \exception std::invalid_argument
     Thrown if \p *this and generator \p g are dimension-incompatible,
     or if \p *this is an empty grid and \p g is not a point.
   */
-  void add_generator(const Grid_Generator& g);
+  void add_grid_generator(const Grid_Generator& g);
 
   /*! \brief
-    Adds a copy of generator \p g to the system of generators of \p
-    *this, reducing the result.
+    Adds a copy of grid generator \p g to the system of generators of
+    \p *this, reducing the result.
 
     \return
     <CODE>false</CODE> if and only if the result is empty.
@@ -1081,8 +1055,11 @@ public:
     \exception std::invalid_argument
     Thrown if \p *this and generator \p g are dimension-incompatible,
     or if \p *this is an empty grid and \p g is not a point.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  bool add_generator_and_minimize(const Grid_Generator& g);
+  bool add_grid_generator_and_minimize(const Grid_Generator& g);
 
   //! Adds a copy of each congruence in \p cgs to \p *this.
   /*!
@@ -1109,8 +1086,8 @@ public:
   //! Adds the congruences in \p cgs to *this.
   /*!
     \param cgs
-    The congruence system that will be recycled, adding its
-    congruences to the system of congruences of \p *this.
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
@@ -1124,14 +1101,13 @@ public:
   //! Adds the equality constraints in \p cs to \p *this.
   /*!
     \param cs
-    The constraint system from which constraints will be considered
-    for addition to the system of congruences of \p *this.
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
 
     \warning
-
     The only assumption that can be made about \p cs upon successful
     or exceptional return is that it can be safely destroyed.
   */
@@ -1150,6 +1126,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_congruences_and_minimize(const Congruence_System& cgs);
 
@@ -1166,6 +1145,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_congruences_and_minimize(const Constraint_System& cs);
 
@@ -1177,8 +1159,8 @@ public:
     <CODE>false</CODE> if and only if the result is empty.
 
     \param cgs
-    The congruence system that will be recycled, adding its
-    congruences to the system of congruences of \p *this.
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cgs are dimension-incompatible.
@@ -1186,6 +1168,9 @@ public:
     \warning
     The only assumption that can be made about \p cgs upon successful
     or exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
 
@@ -1195,8 +1180,8 @@ public:
     <CODE>false</CODE> if and only if the result is empty.
 
     \param cs
-    The constraint system that will be recycled, adding its
-    equalities to the system of congruences of \p *this.
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
@@ -1204,6 +1189,9 @@ public:
     \warning
     The only assumption that can be made about \p cs upon successful
     or exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_recycled_congruences_and_minimize(Constraint_System& cs);
 
@@ -1211,6 +1199,9 @@ public:
   /*!
     The addition can only affect \p *this if \p c is an equality.
 
+    \param c
+    The constraint.
+
     \exception std::invalid_argument
     Thrown if \p *this and \p c are dimension-incompatible.
   */
@@ -1220,16 +1211,25 @@ public:
   /*!
     The addition can only affect \p *this if \p c is an equality.
 
+    \param c
+    The constraint.
+
     \return
     <CODE>false</CODE> if and only if the result is empty.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p c are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_constraint_and_minimize(const Constraint& c);
 
   //! Adds copies of the equality constraints in \p cs to \p *this.
   /*!
+    \param cs
+    The constraints to be added.
+
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
   */
@@ -1239,16 +1239,26 @@ public:
     Adds copies of the equality constraints in \p cs to \p *this,
     reducing the result.
 
+    \param cs
+    The constraints to be added.
+
     \return
     <CODE>false</CODE> if and only if the result is empty.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_constraints_and_minimize(const Constraint_System& cs);
 
   //! Adds the equality constraints in \p cs to \p *this.
   /*!
+    \param cs
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
+
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are dimension-incompatible.
 
@@ -1259,6 +1269,12 @@ public:
   void add_recycled_constraints(Constraint_System& cs);
 
   /*! \brief
+    Adds the equality constraints in \p cs to \p *this, reducing the
+    result.
+
+    \param cs
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
     \return
     <CODE>false</CODE> if and only if the result is empty.
@@ -1269,9 +1285,53 @@ public:
     \warning
     The only assumption that can be made about \p cs upon successful
     or exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_recycled_constraints_and_minimize(Constraint_System& cs);
 
+  //! Uses a copy of the congruence \p cg to refine \p *this.
+  /*!
+    \param cg
+    The congruence used.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+ //! Uses a copy of the congruences in \p cgs to refine \p *this.
+  /*!
+    \param cgs
+    The congruences used.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  //! Uses a copy of the constraint \p c to refine \p *this.
+  /*!
+
+    \param c
+    The constraint used. If it is not an equality, it will be ignored
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Uses a copy of the constraints in \p cs to refine \p *this.
+  /*!
+    \param cs
+    The constraints used. Constraints that are not equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
   /*! \brief
     Adds a copy of the generators in \p gs to the system of generators
     of \p *this.
@@ -1285,26 +1345,24 @@ public:
     \p *this is empty and the system of generators \p gs is not empty,
     but has no points.
   */
-  void add_generators(const Grid_Generator_System& gs);
+  void add_grid_generators(const Grid_Generator_System& gs);
 
   /*! \brief
     Adds the generators in \p gs to the system of generators of \p
     *this.
 
     \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p gs are dimension-incompatible, or if
-    \p *this is empty and the system of generators \p gs is not empty,
-    but has no points.
+    Thrown if \p *this and \p gs are dimension-incompatible.
 
     \warning
     The only assumption that can be made about \p gs upon successful
     or exceptional return is that it can be safely destroyed.
   */
-  void add_recycled_generators(Grid_Generator_System& gs);
+  void add_recycled_grid_generators(Grid_Generator_System& gs);
 
   /*! \brief
     Adds a copy of the generators in \p gs to the system of generators
@@ -1321,8 +1379,11 @@ public:
     Thrown if \p *this and \p gs are dimension-incompatible, or if \p
     *this is empty and the system of generators \p gs is not empty,
     but has no points.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  bool add_generators_and_minimize(const Grid_Generator_System& gs);
+  bool add_grid_generators_and_minimize(const Grid_Generator_System& gs);
 
   /*! \brief
     Adds the generators in \p gs to the system of generators of \p
@@ -1332,23 +1393,49 @@ public:
     <CODE>false</CODE> if and only if the result is empty.
 
     \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
-    *this is empty and the system of generators \p gs is not empty,
-    but has no points.
+    Thrown if \p *this and \p gs are dimension-incompatible.
 
     \warning
     The only assumption that can be made about \p gs upon successful
     or exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_grid_generators_and_minimize(Grid_Generator_System& gs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
   */
-  bool add_recycled_generators_and_minimize(Grid_Generator_System& gs);
+  void unconstrain(Variable var);
 
   /*! \brief
-    Assigns to \p *this the intersection of \p *this and \p y.  The
-    result is not guaranteed to be reduced.
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p y are dimension-incompatible.
@@ -1364,6 +1451,9 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p y are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool intersection_assign_and_minimize(const Grid& y);
 
@@ -1384,12 +1474,22 @@ public:
 
     \exception std::invalid_argument
     Thrown if \p *this and \p y are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool join_assign_and_minimize(const Grid& y);
 
   //! Same as join_assign(y).
   void upper_bound_assign(const Grid& y);
 
+  //! Same as join_assign_and_minimize(y).
+  /*!
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  void upper_bound_assign_and_minimize(const Grid& y);
+
   /*! \brief
     If the join of \p *this and \p y is exact it is assigned to \p
     *this and <CODE>true</CODE> is returned, otherwise
@@ -1419,6 +1519,17 @@ public:
   void difference_assign(const Grid& y);
 
   /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Grid& y);
+
+  /*! \brief
     Assigns to \p *this the \ref Grid_Affine_Transformation
     "affine image" of \p
     *this under the function mapping variable \p var to the affine
@@ -1557,6 +1668,10 @@ public:
     \param var
     The left hand side variable of the generalized affine relation;
 
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
     \param expr
     The numerator of the right hand side affine expression;
 
@@ -1567,19 +1682,21 @@ public:
     \param modulus
     The modulus of the congruence lhs %= rhs.  A modulus of zero
     indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+    of zero.
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p expr and \p *this are
     dimension-incompatible or if \p var is not a space dimension of \p
     *this.
   */
-  void generalized_affine_image(Variable var,
-				const Linear_Expression& expr,
-				Coefficient_traits::const_reference denominator
-				= Coefficient_one(),
-				Coefficient_traits::const_reference modulus
-				= Coefficient_one());
+  void
+  generalized_affine_image(Variable var,
+			   Relation_Symbol relsym,
+			   const Linear_Expression& expr,
+			   Coefficient_traits::const_reference denominator
+			   = Coefficient_one(),
+			   Coefficient_traits::const_reference modulus
+			   = Coefficient_zero());
 
   /*! \brief
     Assigns to \p *this the preimage of \p *this with respect to the
@@ -1590,6 +1707,10 @@ public:
     \param var
     The left hand side variable of the generalized affine relation;
 
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
     \param expr
     The numerator of the right hand side affine expression;
 
@@ -1600,19 +1721,21 @@ public:
     \param modulus
     The modulus of the congruence lhs %= rhs.  A modulus of zero
     indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+    of zero.
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p expr and \p *this are
     dimension-incompatible or if \p var is not a space dimension of \p
     *this.
   */
-  void generalized_affine_preimage(Variable var,
-				   const Linear_Expression& expr,
-				   Coefficient_traits::const_reference denominator
-				   = Coefficient_one(),
-				   Coefficient_traits::const_reference modulus
-				   = Coefficient_one());
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one(),
+			      Coefficient_traits::const_reference modulus
+			      = Coefficient_zero());
 
   /*! \brief
     Assigns to \p *this the image of \p *this with respect to
@@ -1622,22 +1745,28 @@ public:
     \param lhs
     The left hand side affine expression.
 
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
     \param rhs
     The right hand side affine expression.
 
     \param modulus
     The modulus of the congruence lhs %= rhs.  A modulus of zero
     indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+    of zero.
 
     \exception std::invalid_argument
     Thrown if \p *this is dimension-incompatible with \p lhs or \p
     rhs.
   */
-  void generalized_affine_image(const Linear_Expression& lhs,
-				const Linear_Expression& rhs,
-				Coefficient_traits::const_reference modulus
-				= Coefficient_one());
+  void
+  generalized_affine_image(const Linear_Expression& lhs,
+			   Relation_Symbol relsym,
+			   const Linear_Expression& rhs,
+			   Coefficient_traits::const_reference modulus
+			   = Coefficient_zero());
 
   /*! \brief
     Assigns to \p *this the preimage of \p *this with respect to the
@@ -1647,22 +1776,92 @@ public:
     \param lhs
     The left hand side affine expression;
 
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
     \param rhs
     The right hand side affine expression;
 
     \param modulus
     The modulus of the congruence lhs %= rhs.  A modulus of zero
     indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+    of zero.
 
     \exception std::invalid_argument
     Thrown if \p *this is dimension-incompatible with \p lhs or \p
     rhs.
   */
-  void generalized_affine_preimage(const Linear_Expression& lhs,
-				   const Linear_Expression& rhs,
-				   Coefficient_traits::const_reference modulus
-				   = Coefficient_one());
+  void
+  generalized_affine_preimage(const Linear_Expression& lhs,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& rhs,
+			      Coefficient_traits::const_reference modulus
+			      = Coefficient_zero());
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
 
   /*! \brief
     Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
@@ -1678,8 +1877,46 @@ public:
 
   /*! \brief
     Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using congruence systems.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void congruence_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using generator systems.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void generator_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
     "Grid widening" between \p *this and \p y.
 
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
+
     \param y
     A grid that <EM>must</EM> be contained in \p *this;
 
@@ -1694,6 +1931,54 @@ public:
   void widening_assign(const Grid& y, unsigned* tp = NULL);
 
   /*! \brief
+    Improves the result of the congruence variant of
+    \ref Grid_Widening "Grid widening" computation by also enforcing
+    those congruences in \p cgs that are satisfied by all the points
+    of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_congruence_extrapolation_assign(const Grid& y,
+					       const Congruence_System& cgs,
+					       unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the generator variant of the
+    \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_generator_extrapolation_assign(const Grid& y,
+					      const Congruence_System& cgs,
+					      unsigned* tp = NULL);
+
+  /*! \brief
     Improves the result of the \ref Grid_Widening "Grid widening"
     computation by also enforcing those congruences in \p cgs that are
     satisfied by all the points of \p *this.
@@ -1908,11 +2193,12 @@ public:
 
   //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  friend bool Parma_Polyhedra_Library::operator==(const Grid& x,
-						  const Grid& y);
+  friend bool operator==(const Grid& x, const Grid& y);
 
   friend class Parma_Polyhedra_Library::Grid_Certificate;
 
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
   //! \name Miscellaneous Member Functions
   //@{
 
@@ -1925,17 +2211,15 @@ public:
   */
   void swap(Grid& y);
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-
-     \return
-     <CODE>true</CODE> if successful, else <CODE>false</CODE>.
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
   //! Returns the total size in bytes of the memory occupied by \p *this.
@@ -1944,6 +2228,14 @@ public:
   //! Returns the size in bytes of the memory managed by \p *this.
   memory_size_type external_memory_in_bytes() const;
 
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
   //@} // Miscellaneous Member Functions
 
 private:
@@ -1983,23 +2275,35 @@ private:
   // types is last to first.
   Dimension_Kinds dim_kinds;
 
+  //! Builds a grid universe or empty grid.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    specifies whether the universe or the empty grid has to be built.
+  */
+  void construct(dimension_type num_dimensions, Degenerate_Element kind);
+
   //! Builds a grid from a system of congruences.
   /*!
     The grid inherits the space dimension of the congruence system.
 
     \param cgs
-    The system of congruences defining the grid.
+    The system of congruences defining the grid. Its data-structures
+    may be recycled to build the grid.
   */
-  void construct(const Congruence_System& cgs);
+  void construct(Congruence_System& cgs);
 
-  //! Builds a grid from a system of generators.
+  //! Builds a grid from a system of grid generators.
   /*!
     The grid inherits the space dimension of the generator system.
 
-    \param gs
-    The system of generators defining the grid;
+    \param ggs
+    The system of grid generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
   */
-  void construct(const Grid_Generator_System& gs);
+  void construct(Grid_Generator_System& ggs);
 
   //! \name Private Verifiers: Verify if Individual Flags are Set
   //@{
@@ -2063,7 +2367,7 @@ private:
   //! Sets \p status to express that congruences are out of date.
   void clear_congruences_up_to_date();
 
-  //! Sets \p status to express that parameters are out of date.
+  //! Sets \p status to express that generators are out of date.
   void clear_generators_up_to_date();
 
   //! Sets \p status to express that congruences are no longer minimized.
@@ -2078,11 +2382,7 @@ private:
   //@{
 
   //! Updates and minimizes the congruences from the generators.
-  /*!
-    \return
-    Always <CODE>true</CODE>.
-  */
-  bool update_congruences() const;
+  void update_congruences() const;
 
   //! Updates and minimizes the generators from the congruences.
   /*!
@@ -2178,9 +2478,9 @@ private:
     \p included and \p point are left untouched.
   */
   bool max_min(const Linear_Expression& expr,
-	       char* method_call,
+	       const char* method_call,
 	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
-	       Grid_Generator* point = NULL) const;
+	       Generator* point = NULL) const;
 
   //! \name Widening- and Extrapolation-Related Functions
   //@{
@@ -2189,6 +2489,10 @@ private:
   void select_wider_congruences(const Grid& y,
 				Congruence_System& selected_cgs) const;
 
+  //! Copies widened generators from \p y to \p widened_ggs.
+  void select_wider_generators(const Grid& y,
+				Grid_Generator_System& widened_ggs) const;
+
   //@} // Widening- and Extrapolation-Related Functions
 
   //! Adds new space dimensions to the given systems.
@@ -2207,7 +2511,7 @@ private:
   */
   void add_space_dimensions(Congruence_System& cgs,
 			    Grid_Generator_System& gs,
-			    const dimension_type dims);
+			    dimension_type dims);
 
   //! Adds new space dimensions to the given systems.
   /*!
@@ -2225,7 +2529,7 @@ private:
   */
   void add_space_dimensions(Grid_Generator_System& gs,
 			    Congruence_System& cgs,
-			    const dimension_type dims);
+			    dimension_type dims);
 
   //! \name Minimization-related Static Member Functions
   //@{
@@ -2235,32 +2539,52 @@ private:
     Converts \p sys to an equivalent system in which the divisors are
     of equal value.
 
-    \return
-    The new system divisor, or zero if \p divisor was zero.
-
     \param sys
-    The generator system to be normalized.
+    The generator system to be normalized.  It must have at least one
+    row.
 
     \param divisor
-    An extra divisor to include in the calculation of the common
-    divisor of \p sys.
+    A reference to the initial value of the divisor.  The resulting
+    value of this object is the new system divisor.
 
     \param first_point
     If \p first_point has a value other than NULL then it is taken as
     the first point in \p sys, and it is assumed that any following
     points have the same divisor as \p first_point.
   */
-  static Coefficient
+  static void
   normalize_divisors(Grid_Generator_System& sys,
-		     Coefficient_traits::const_reference divisor
-		     = Coefficient_one(),
-		     Grid_Generator* first_point = NULL);
+		     Coefficient& divisor,
+		     const Grid_Generator* first_point = NULL);
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys);
 
   //! Normalize all the divisors in \p sys and \p gen_sys.
   /*!
     Modify \p sys and \p gen_sys to use the same single divisor value
     for all generators, leaving each system representing the grid it
     represented originally.
+
+    \param sys
+    The first of the generator systems to be normalized.
+
+    \param gen_sys
+    The second of the generator systems to be normalized.  This system
+    must have at least one row and the divisors of the generators in
+    this system must be equal.
+
+    \exception std::runtime_error
+    Thrown if all rows in \p gen_sys are lines and/or parameters.
   */
   static void normalize_divisors(Grid_Generator_System& sys,
 				 Grid_Generator_System& gen_sys);
@@ -2314,7 +2638,7 @@ private:
   */
   // A member of Grid for access to Matrix::rows.
   static void reduce_equality_with_equality(Congruence& row,
-					    Congruence& pivot,
+					    const Congruence& pivot,
 					    dimension_type col);
 
   //! Reduces \p row using \p pivot.
@@ -2341,7 +2665,7 @@ private:
   */
   // A member of Grid for access to Matrix::rows.
   static void reduce_parameter_with_line(Grid_Generator& row,
-					 Grid_Generator& pivot,
+					 const Grid_Generator& pivot,
 					 dimension_type col,
 					 Grid_Generator_System& sys);
 
@@ -2353,10 +2677,11 @@ private:
   */
   // A member of Grid for access to Matrix::rows.
   static void reduce_congruence_with_equality(Congruence& row,
-					      Congruence& pivot,
+					      const Congruence& pivot,
 					      dimension_type col,
 					      Congruence_System& sys);
 
+#ifdef STRONG_REDUCTION
   //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
   /*!
     Only consider from index \p start to index \p end of the row at \p
@@ -2367,21 +2692,24 @@ private:
   static void reduce_reduced(M& sys, dimension_type dim,
 			     dimension_type pivot_index,
 			     dimension_type start, dimension_type end,
-			     Dimension_Kinds& dim_kinds,
+			     const Dimension_Kinds& dim_kinds,
 			     bool generators = true);
+#endif
 
   //! Multiply the elements of \p dest by \p multiplier.
   // A member of Grid for access to Matrix::rows and cgs::operator[].
   static void multiply_grid(const Coefficient& multiplier,
 			    Congruence& cg, Congruence_System& dest,
-			    const dimension_type num_rows,
-			    const dimension_type num_dims);
+			    dimension_type num_rows,
+			    dimension_type num_dims);
 
   //! Multiply the elements of \p dest by \p multiplier.
   // A member of Grid for access to Grid_Generator::operator[].
-  static void multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
-			    Grid_Generator_System& dest, const dimension_type num_rows,
-			    const dimension_type num_dims);
+  static void multiply_grid(const Coefficient& multiplier,
+			    Grid_Generator& gen,
+			    Grid_Generator_System& dest,
+			    dimension_type num_rows,
+			    dimension_type num_dims);
 
   /*! \brief
     If \p sys is lower triangular return <CODE>true</CODE>, else
@@ -2441,6 +2769,9 @@ protected:
 				    const char* g_name,
 				    const Grid_Generator& g) const;
   void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
 				    const char* cgs_name,
 				    const Congruence_System& cgs) const;
   void throw_dimension_incompatible(const char* method,
@@ -2451,7 +2782,7 @@ protected:
 				    const Grid_Generator_System& gs) const;
   void throw_dimension_incompatible(const char* method,
 				    const char* var_name,
-				    const Variable var) const;
+				    Variable var) const;
   void throw_dimension_incompatible(const char* method,
 				    dimension_type required_space_dim) const;
 
diff --git a/src/Grid.inlines.hh b/src/Grid.inlines.hh
index 8a256b2..9d0ad57 100644
--- a/src/Grid.inlines.hh
+++ b/src/Grid.inlines.hh
@@ -1,11 +1,11 @@
 /* Grid class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,20 +25,20 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "Grid_Generator.defs.hh"
 #include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
 #include <algorithm>
 
 namespace Parma_Polyhedra_Library {
 
 inline dimension_type
 Grid::max_space_dimension() {
-  using std::min;
   // One dimension is reserved to have a value of type dimension_type
   // that does not represent a legal dimension.
-  return min(std::numeric_limits<dimension_type>::max() - 1,
-	     min(Congruence_System::max_space_dimension(),
-		 Grid_Generator_System::max_space_dimension()
-		 )
-	     );
+  return std::min(std::numeric_limits<dimension_type>::max() - 1,
+		  std::min(Congruence_System::max_space_dimension(),
+			   Grid_Generator_System::max_space_dimension()
+			   )
+		  );
 }
 
 inline void
@@ -47,57 +47,126 @@ Grid::set_congruences_up_to_date() {
 }
 
 inline
-Grid::Grid(const Congruence_System& ccgs) {
-  if (ccgs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(ccgs)",
-				   "the space dimension of ccgs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(ccgs);
+Grid::Grid(dimension_type num_dimensions,
+	   const Degenerate_Element kind)
+  : con_sys(),
+    gen_sys(num_dimensions > max_space_dimension()
+	    ? (throw_space_dimension_overflow("Grid(n, k)",
+					      "n exceeds the maximum "
+					      "allowed space dimension"),
+	       0)
+	    : num_dimensions) {
+  construct(num_dimensions, kind);
+  assert(OK());
 }
 
 inline
-Grid::Grid(Congruence_System& cgs) {
-  if (cgs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(cgs)",
-				   "the space dimension of cgs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
+Grid::Grid(const Congruence_System& cgs)
+  : con_sys(cgs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(cgs)",
+					     "the space dimension of cgs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : cgs.space_dimension()),
+    gen_sys(cgs.space_dimension()) {
+  Congruence_System cgs_copy(cgs);
+  construct(cgs_copy);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs, Recycle_Input)
+  : con_sys(cgs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(cgs, recycle)",
+					     "the space dimension of cgs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : cgs.space_dimension()),
+    gen_sys(cgs.space_dimension()) {
   construct(cgs);
 }
 
 inline
-Grid::Grid(const Grid_Generator_System& gs) {
-  if (gs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(gs)",
-				   "the space dimension of gs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(gs);
+Grid::Grid(const Grid_Generator_System& ggs)
+  : con_sys(ggs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(ggs)",
+					     "the space dimension of ggs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : ggs.space_dimension()),
+    gen_sys(ggs.space_dimension()) {
+  Grid_Generator_System ggs_copy(ggs);
+  construct(ggs_copy);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& ggs, Recycle_Input)
+  : con_sys(ggs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(ggs, recycle)",
+					     "the space dimension of ggs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : ggs.space_dimension()),
+    gen_sys(ggs.space_dimension()) {
+  construct(ggs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const BD_Shape<U>& bd,
+           Complexity_Class)
+  : con_sys(bd.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(bd)",
+					     "the space dimension of bd "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : bd.space_dimension()),
+    gen_sys(bd.space_dimension()) {
+  Congruence_System cgs = bd.congruences();
+  construct(cgs);
 }
 
+template <typename U>
 inline
-Grid::Grid(Grid_Generator_System& gs) {
-  if (gs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(gs)",
-				   "the space dimension of gs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(gs);
+Grid::Grid(const Octagonal_Shape<U>& os,
+           Complexity_Class)
+  : con_sys(os.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(os)",
+					     "the space dimension of os "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : os.space_dimension()),
+    gen_sys(os.space_dimension()) {
+  Congruence_System cgs = os.congruences();
+  construct(cgs);
 }
 
 inline
 Grid::~Grid() {
 }
 
+inline dimension_type
+Grid::space_dimension() const {
+  return space_dim;
+}
+
 inline memory_size_type
 Grid::total_memory_in_bytes() const {
   return sizeof(*this) + external_memory_in_bytes();
 }
 
-inline dimension_type
-Grid::space_dimension() const {
-  return space_dim;
+inline int32_t
+Grid::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
+
+inline Constraint_System
+Grid::constraints() const {
+    return Constraint_System(congruences());;
+}
+
+inline Constraint_System
+Grid::minimized_constraints() const {
+    return Constraint_System(minimized_congruences());;
 }
 
 inline void
@@ -105,6 +174,11 @@ Grid::upper_bound_assign(const Grid& y) {
   join_assign(y);
 }
 
+inline void
+Grid::upper_bound_assign_and_minimize(const Grid& y) {
+  join_assign_and_minimize(y);
+}
+
 inline bool
 Grid::upper_bound_assign_if_exact(const Grid& y) {
   return join_assign_if_exact(y);
@@ -124,6 +198,27 @@ Grid::swap(Grid& y) {
   std::swap(dim_kinds, y.dim_kinds);
 }
 
+inline void
+Grid::refine_with_congruence(const Congruence& cg) {
+  add_congruence(cg);
+}
+
+inline void
+Grid::refine_with_congruences(const Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+inline bool
+Grid::can_recycle_constraint_systems() {
+  return true;
+}
+
+
+inline bool
+Grid::can_recycle_congruence_systems() {
+  return true;
+}
+
 } // namespace Parma_Polyhedra_Library
 
 /*! \relates Parma_Polyhedra_Library::Grid */
@@ -225,7 +320,7 @@ Grid::maximize(const Linear_Expression& expr,
 inline bool
 Grid::maximize(const Linear_Expression& expr,
 	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-	       Grid_Generator& point) const {
+	       Generator& point) const {
   return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
 }
 
@@ -238,10 +333,17 @@ Grid::minimize(const Linear_Expression& expr,
 inline bool
 Grid::minimize(const Linear_Expression& expr,
 	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-	       Grid_Generator& point) const {
+	       Generator& point) const {
   return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
 }
 
+inline void
+Grid::normalize_divisors(Grid_Generator_System& sys) {
+  TEMP_INTEGER(divisor);
+  divisor = 1;
+  normalize_divisors(sys, divisor);
+}
+
 /*! \relates Grid */
 inline bool
 operator!=(const Grid& x, const Grid& y) {
diff --git a/src/Grid.templates.hh b/src/Grid.templates.hh
index deb8acf..58e1e04 100644
--- a/src/Grid.templates.hh
+++ b/src/Grid.templates.hh
@@ -1,11 +1,11 @@
 /* Grid class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,20 +23,19 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Grid_templates_hh
 #define PPL_Grid_templates_hh 1
 
-#include "Interval.defs.hh"
 #include "Grid_Generator.defs.hh"
 #include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
 #include <algorithm>
 #include <deque>
 
 namespace Parma_Polyhedra_Library {
 
-template <typename Box>
-Grid::Grid(const Box& box, From_Bounding_Box dummy)
+template <typename Interval>
+Grid::Grid(const Box<Interval>& box,
+           Complexity_Class)
   : con_sys(),
-    gen_sys(NECESSARILY_CLOSED) {
-  used(dummy);
-
+    gen_sys() {
   if (box.space_dimension() > max_space_dimension())
     throw_space_dimension_overflow("Grid(box, from_bounding_box)",
 				   "the space dimension of box "
@@ -45,20 +44,6 @@ Grid::Grid(const Box& box, From_Bounding_Box dummy)
 
   space_dim = box.space_dimension();
 
-  TEMP_INTEGER(l_n);
-  TEMP_INTEGER(l_d);
-
-  // Check that all bounds are closed.  This must be done before the
-  // empty check below, in case an open bound makes the grid empty.
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    bool closed;
-    // FIXME: Perhaps introduce box::is_bounded_and_closed.
-    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
-    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
-  }
-
   if (box.is_empty()) {
     // Empty grid.
     set_empty();
@@ -71,31 +56,47 @@ Grid::Grid(const Box& box, From_Bounding_Box dummy)
   else {
     // Initialize the space dimension as indicated by the box.
     con_sys.increase_space_dimension(space_dim);
-    // Add congruences according to `box'.
+    // Add congruences and generators according to `box'.
+    TEMP_INTEGER(l_n);
+    TEMP_INTEGER(l_d);
     TEMP_INTEGER(u_n);
     TEMP_INTEGER(u_d);
+    gen_sys.insert(grid_point(0*Variable(space_dim-1)));
+    Grid_Generator& point = gen_sys[0];
     for (dimension_type k = space_dim; k-- > 0; ) {
-      bool closed;
+      bool closed = false;
       // TODO: Consider producing the system(s) in minimized form.
-      // FIXME: Also create the generator system.
       if (box.get_lower_bound(k, closed, l_n, l_d)) {
 	if (box.get_upper_bound(k, closed, u_n, u_d))
 	  if (l_n * u_d == u_n * l_d) {
 	    // A point interval sets dimension k of every point to a
 	    // single value.
 	    con_sys.insert(l_d * Variable(k) == l_n);
+
+	    // Scale the point to use as divisor the lcm of the
+	    // divisors of the existing point and the lower bound.
+	    const Coefficient& point_divisor = point.divisor();
+	    gcd_assign(u_n, l_d, point_divisor);
+	    // `u_n' now holds the gcd.
+	    exact_div_assign(u_n, point_divisor, u_n);
+	    if (l_d < 0)
+	      neg_assign(u_n);
+	    // l_d * u_n == abs(l_d * (point_divisor / gcd(l_d, point_divisor)))
+	    point.scale_to_divisor(l_d * u_n);
+	    // Set dimension k of the point to the lower bound.
+	    if (l_d < 0)
+	      neg_assign(u_n);
+	    // point[k + 1] = l_n * point_divisor / gcd(l_d, point_divisor)
+	    point[k + 1] = l_n * u_n;
+
 	    continue;
 	  }
-	// The only valid bounded interval is a point interval.
-	throw_invalid_argument("Grid(box, from_bounding_box)", "box");
       }
-      else if (box.get_upper_bound(k, closed, u_n, u_d))
-	// An interval can only be a point or the universe.
-	throw_invalid_argument("Grid(box, from_covering_box)",
-			       "box");
       // A universe interval allows any value in dimension k.
+      gen_sys.insert(grid_line(Variable(k)));
     }
     set_congruences_up_to_date();
+    set_generators_up_to_date();
     gen_sys.unset_pending_rows();
     gen_sys.set_sorted(false);
   }
@@ -104,10 +105,9 @@ Grid::Grid(const Box& box, From_Bounding_Box dummy)
 }
 
 template <typename Box>
-Grid::Grid(const Box& box, From_Covering_Box dummy)
+Grid::Grid(const Box& box, From_Covering_Box)
   : con_sys(),
-    gen_sys(NECESSARILY_CLOSED) {
-  used(dummy);
+    gen_sys() {
 
   if (box.space_dimension() > max_space_dimension())
     throw_space_dimension_overflow("Grid(box, from_covering_box)",
@@ -120,10 +120,10 @@ Grid::Grid(const Box& box, From_Covering_Box dummy)
   TEMP_INTEGER(l_n);
   TEMP_INTEGER(l_d);
 
-  // Check that all bounds are closed.  This must be done before the
-  // empty check below, in case an open bound makes the grid empty.
+  // Check that all bounds are closed.  This check must be done before
+  // the empty test below, as an open bound might mean an empty box.
   for (dimension_type k = space_dim; k-- > 0; ) {
-    bool closed;
+    bool closed = false;
     // FIXME: Perhaps introduce box::is_bounded_and_closed.
     if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
       throw_invalid_argument("Grid(box, from_covering_box)", "box");
@@ -147,24 +147,50 @@ Grid::Grid(const Box& box, From_Covering_Box dummy)
     TEMP_INTEGER(u_n);
     TEMP_INTEGER(u_d);
     TEMP_INTEGER(d);
+    gen_sys.insert(grid_point(0*Variable(space_dim-1)));
+    Grid_Generator& point = gen_sys[0];
     for (dimension_type k = space_dim; k-- > 0; ) {
-      bool closed;
+      bool closed = false;
       // TODO: Consider producing the system(s) in minimized form.
-      // FIXME: Also create the generator system.
       if (box.get_lower_bound(k, closed, l_n, l_d)) {
+
+	const Coefficient& point_divisor = point.divisor();
+	assert(l_d > 0);
+	assert(point_divisor > 0);
+	// Use `d' to hold the gcd.
+	gcd_assign(d, l_d, point_divisor);
+	// Scale the point to use as divisor the lcm of the existing
+	// point divisor and the divisor of the lower bound.
+	exact_div_assign(d, point_divisor, d);
+	// l_d * d == abs(l_d) * (point_divisor / gcd(l_d, point_divisor))
+	point.scale_to_divisor(l_d * d);
+	// Set dimension k of the point to the lower bound.
+	// point[k + 1] = l_n * (point_divisor / gcd(l_d, point_divisor))
+	point[k + 1] = l_n * d;
+
 	if (box.get_upper_bound(k, closed, u_n, u_d)) {
-	  if (l_n * u_d == u_n * l_d)
+	  if (l_n * u_d == u_n * l_d) {
 	    // A point interval allows any point along the dimension
 	    // k axis.
+	    gen_sys.insert(grid_line(Variable(k)));
 	    continue;
+	  }
+	  assert(l_d > 0);
+	  assert(u_d > 0);
 	  gcd_assign(d, l_d, u_d);
 	  // `d' is the gcd of the divisors.
-	  l_n *= (u_d / d);
-	  d = l_d / d;
-	  // `d' is now the smallest integer expression of the size
-	  // of l_d relative to u_d.  `d * u_d' is the lcm of the
-	  // divisors.
-	  con_sys.insert((d * u_d * Variable(k) %= l_n) / ((u_n * d) - l_n));
+	  exact_div_assign(l_d, l_d, d);
+	  exact_div_assign(d, u_d, d);
+	  l_n *= d;
+	  // `l_d' is now the smallest integer expression of the size of
+	  // the original l_d relative to u_d.
+	  u_n = (u_n * l_d) - l_n;
+	  // `u_n' is now the distance between u_n and l_n (given a
+	  // divisor of lcm of l_d and u_d.
+	  l_d *= u_d;
+	  // `l_d' is now the lcm of the divisors.
+	  con_sys.insert((l_d * Variable(k) %= l_n) / u_n);
+	  gen_sys.insert(parameter(u_n * Variable(k), l_d));
 	}
 	else
 	  // An interval bounded only from below produces an
@@ -172,9 +198,24 @@ Grid::Grid(const Box& box, From_Covering_Box dummy)
 	  con_sys.insert(l_d * Variable(k) == l_n);
       }
       else
-	if (box.get_upper_bound(k, closed, u_n, u_d))
+	if (box.get_upper_bound(k, closed, u_n, u_d)) {
+	  const Coefficient& point_divisor = point.divisor();
+	  assert(u_d > 0);
+	  assert(point_divisor > 0);
+	  // Use `d' to hold the gcd.
+	  gcd_assign(d, u_d, point_divisor);
+	  // Scale the point to use as divisor the lcm of the existing
+	  // point divisor and the divisor of the lower bound.
+	  exact_div_assign(d, point_divisor, d);
+	  // u_d * d == abs(u_d) * (point_divisor / gcd(u_d, point_divisor))
+	  point.scale_to_divisor(u_d * d);
+	  // Set dimension k of the point to the lower bound.
+	  // point[k + 1] = u_n * (point_divisor / gcd(u_d, point_divisor))
+	  point[k + 1] = u_n * d;
+
 	  // An interval bounded only from above produces an equality.
 	  con_sys.insert(u_d * Variable(k) == u_n);
+	}
 	else {
 	  // Any universe interval produces an empty grid.
 	  set_empty();
@@ -182,7 +223,9 @@ Grid::Grid(const Box& box, From_Covering_Box dummy)
 	  return;
 	}
     }
+    normalize_divisors(gen_sys);
     set_congruences_up_to_date();
+    set_generators_up_to_date();
     gen_sys.set_sorted(false);
     gen_sys.unset_pending_rows();
   }
@@ -190,97 +233,15 @@ Grid::Grid(const Box& box, From_Covering_Box dummy)
   assert(OK());
 }
 
-template <typename Box>
+template <typename Interval>
 void
-Grid::shrink_bounding_box(Box& box) const {
-  // Dimension-compatibility check.
-  if (space_dim > box.space_dimension())
-    throw_dimension_incompatible("shrink_bounding_box(box)", "box",
-				 box.space_dimension());
-
-  TEMP_INTEGER(l_n);
-  TEMP_INTEGER(l_d);
-
-  // Check that all bounds are closed.
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    bool closed;
-    // FIXME: Perhaps introduce box::is_bounded_and_closed.
-    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("shrink_bounding_box(box)", "box");
-    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("shrink_bounding_box(box)", "box");
-  }
-
-  if (marked_empty()) {
-    box.set_empty();
-    return;
-  }
-  if (space_dim == 0)
-    return;
-  if (!generators_are_up_to_date() && !update_generators()) {
-    // Updating found the grid empty.
-    box.set_empty();
-    return;
-  }
-
-  assert(gen_sys.num_generators() > 0);
-
-  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
-  dimension_type num_rows = gen_sys.num_generators();
-
-  // Create a vector to record which dimensions are bounded.
-  std::vector<bool> bounded_interval(num_dims, true);
-
-  const Grid_Generator *first_point = NULL;
-  // Clear the bound flag in `bounded_interval' for all dimensions in
-  // which a line or sequence of points extends away from a single
-  // value in the dimension.
-  for (dimension_type row = 0; row < num_rows; ++row) {
-    Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
-    if (gen.is_point()) {
-      if (first_point == NULL) {
-	first_point = &gen_sys[row];
-	continue;
-      }
-      const Grid_Generator& point = *first_point;
-      // Convert the point `gen' to a parameter.
-      for (dimension_type dim = 0; dim < num_dims; ++dim)
-	gen[dim] -= point[dim];
-      gen.divisor() = point.divisor();
-    }
-    for (dimension_type col = num_dims; col > 0; )
-      if (gen[col--] != 0)
-	bounded_interval[col] = false;
-  }
-
-  // Attempt to set both bounds of each boundable interval to the
-  // value of the associated coefficient in the point.
-  const Grid_Generator& point = *first_point;
-  TEMP_INTEGER(divisor);
-  TEMP_INTEGER(gcd);
-  TEMP_INTEGER(bound);
-  TEMP_INTEGER(reduced_divisor);
-  divisor = point.divisor();
-  for (dimension_type dim = 0; dim < num_dims; ++dim)
-    if (bounded_interval[dim]) {
-      // Reduce the bound fraction first.
-      gcd_assign(gcd, point[dim+1], divisor);
-      exact_div_assign(bound, point[dim+1], gcd);
-      exact_div_assign(reduced_divisor, divisor, gcd);
-      box.raise_lower_bound(dim, true, bound, reduced_divisor);
-      box.lower_upper_bound(dim, true, bound, reduced_divisor);
-    }
-}
-
-template <typename Box>
-void
-Grid::get_covering_box(Box& box) const {
+Grid::get_covering_box(Box<Interval>& box) const {
   // Dimension-compatibility check.
   if (space_dim > box.space_dimension())
     throw_dimension_incompatible("get_covering_box(box)", "box",
 				 box.space_dimension());
 
-  Box new_box(box.space_dimension());
+  Box<Interval> new_box(box.space_dimension());
 
   if (marked_empty()) {
     box = new_box;
@@ -297,15 +258,13 @@ Grid::get_covering_box(Box& box) const {
     return;
   }
 
-  assert(gen_sys.num_generators() > 0);
+  assert(!gen_sys.has_no_rows());
 
   dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
-  dimension_type num_rows = gen_sys.num_generators();
+  dimension_type num_rows = gen_sys.num_rows();
 
-  TEMP_INTEGER(divisor);
   TEMP_INTEGER(gcd);
   TEMP_INTEGER(bound);
-  TEMP_INTEGER(reduced_divisor);
 
   if (num_rows > 1) {
     Row interval_sizes(num_dims, Row::Flags());
@@ -325,8 +284,7 @@ Grid::get_covering_box(Box& box) const {
 	  if (!interval_emptiness[dim] && gen[dim+1] != 0) {
 	    // Empty interval, set both bounds for associated
       	    // dimension to zero.
-	    new_box.lower_upper_bound(dim, true, 0, 1);
-	    new_box.raise_lower_bound(dim, true, 0, 1);
+            new_box.add_constraint(Variable(dim) == 0);
 	    interval_emptiness[dim] = true;
 	  }
 	continue;
@@ -338,11 +296,14 @@ Grid::get_covering_box(Box& box) const {
 	}
 	const Grid_Generator& point = *first_point;
 	// Convert the point `gen' to a parameter.
-	for (dimension_type dim = 0; dim <= num_dims; ++dim)
+	dimension_type dim = num_dims;
+	do {
 	  gen[dim] -= point[dim];
-	gen.divisor() = point.divisor();
+	}
+	while (dim-- > 0);
+	gen.set_divisor(point.divisor());
       }
-      for (dimension_type dim = 0; dim < num_dims; ++dim)
+      for (dimension_type dim = num_dims; dim-- > 0; )
 	if (!interval_emptiness[dim])
 	  gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
     }
@@ -352,9 +313,9 @@ Grid::get_covering_box(Box& box) const {
     // addition of the lower bound and the shortest distance in the
     // given dimension between any two grid points.
     const Grid_Generator& point = *first_point;
-    divisor = point.divisor();
+    const Coefficient& divisor = point.divisor();
     TEMP_INTEGER(lower_bound);
-    for (dimension_type dim = 0; dim < num_dims; ++dim) {
+    for (dimension_type dim = num_dims; dim-- > 0; ) {
       if (interval_emptiness[dim])
 	continue;
 
@@ -367,7 +328,7 @@ Grid::get_covering_box(Box& box) const {
 	// leaving the sign the same.
 	lower_bound %= interval_sizes[dim];
 	// Check if the lowest value the other side of the origin is
-	// closer to the origin, prefering the lowest positive if they
+	// closer to the origin, preferring the lowest positive if they
 	// are equal.
 	if (lower_bound > 0) {
 	  if (interval_sizes[dim] - lower_bound < lower_bound)
@@ -381,31 +342,34 @@ Grid::get_covering_box(Box& box) const {
 	bound = interval_sizes[dim] + lower_bound;
 	gcd_assign(gcd, bound, divisor);
 	exact_div_assign(bound, bound, gcd);
-	exact_div_assign(reduced_divisor, divisor, gcd);
-	new_box.lower_upper_bound(dim, true, bound, reduced_divisor);
+	exact_div_assign(gcd, divisor, gcd);
+	// `gcd' now holds the reduced divisor.
+        new_box.add_constraint(gcd*Variable(dim) <= bound);
       }
 
       // Reduce the bound fraction first.
       gcd_assign(gcd, lower_bound, divisor);
       exact_div_assign(lower_bound, lower_bound, gcd);
-      exact_div_assign(reduced_divisor, divisor, gcd);
-      new_box.raise_lower_bound(dim, true, lower_bound, reduced_divisor);
+      exact_div_assign(gcd, divisor, gcd);
+      // `gcd' now holds the reduced divisor.
+      new_box.add_constraint(gcd*Variable(dim) >= lower_bound);
     }
   }
   else {
     const Grid_Generator& point = gen_sys[0];
-    divisor = point.divisor();
+    const Coefficient& divisor = point.divisor();
     // The covering box of a single point has only lower bounds.
-    for (dimension_type dim = 0; dim < num_dims; ++dim) {
+    for (dimension_type dim = num_dims; dim-- > 0; ) {
       // Reduce the bound fraction first.
       gcd_assign(gcd, point[dim+1], divisor);
       exact_div_assign(bound, point[dim+1], gcd);
-      exact_div_assign(reduced_divisor, divisor, gcd);
-      new_box.raise_lower_bound(dim, true, bound, reduced_divisor);
+      exact_div_assign(gcd, divisor, gcd);
+      // `gcd' now holds the reduced divisor.
+      new_box.add_constraint(gcd*Variable(dim) >= bound);
     }
   }
 
-  box = new_box;
+  box.swap(new_box);
 }
 
 template <typename Partial_Function>
@@ -459,8 +423,11 @@ Grid::map_space_dimensions(const Partial_Function& pfunc) {
 	dimension_type j = i;
 	do {
 	  visited[j] = true;
-	  dimension_type k;
-	  (void) pfunc.maps(j, k);
+	  // The following initialization is only to make the compiler happy.
+	  dimension_type k = 0;
+	  if (!pfunc.maps(j, k))
+	    throw_invalid_argument("map_space_dimensions(pfunc)",
+				   " pfunc is inconsistent");
 	  if (k == j)
 	    // Cycle of length 1: skip it.
 	    goto skip;
@@ -498,9 +465,9 @@ Grid::map_space_dimensions(const Partial_Function& pfunc) {
   // If control gets here, then `pfunc' is not a permutation and some
   // dimensions must be projected away.
 
-  const Grid_Generator_System& old_gensys = generators();
+  const Grid_Generator_System& old_gensys = grid_generators();
 
-  if (old_gensys.num_generators() == 0) {
+  if (old_gensys.has_no_rows()) {
     // The grid is empty.
     Grid new_grid(new_space_dimension, EMPTY);
     std::swap(*this, new_grid);
@@ -526,10 +493,8 @@ Grid::map_space_dimensions(const Partial_Function& pfunc) {
     if (i->is_point())
       break;
   assert(i != old_gensys_end);
-  Coefficient_traits::const_reference system_divisor = i->divisor();
-  for (Grid_Generator_System::const_iterator i = old_gensys.begin();
-       i != old_gensys_end;
-       ++i) {
+  const Coefficient& system_divisor = i->divisor();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i) {
     const Grid_Generator& old_g = *i;
     Linear_Expression e(0 * Variable(new_space_dimension-1));
     bool all_zeroes = true;
@@ -564,6 +529,83 @@ Grid::map_space_dimensions(const Partial_Function& pfunc) {
   assert(OK(true));
 }
 
+#ifdef STRONG_REDUCTION
+template <typename M, typename R>
+void
+Grid::reduce_reduced(M& sys,
+		     const dimension_type dim,
+		     const dimension_type pivot_index,
+		     const dimension_type start,
+		     const dimension_type end,
+		     const Dimension_Kinds& dim_kinds,
+		     const bool generators) {
+  R& pivot = sys[pivot_index];
+
+  const Coefficient& pivot_dim = pivot[dim];
+
+  if (pivot_dim == 0)
+    return;
+
+  TEMP_INTEGER(pivot_dim_half);
+  pivot_dim_half = (pivot_dim + 1) / 2;
+  Dimension_Kind row_kind = dim_kinds[dim];
+  Dimension_Kind line_or_equality, virtual_kind;
+  int jump;
+  if (generators) {
+    line_or_equality = LINE;
+    virtual_kind = GEN_VIRTUAL;
+    jump = -1;
+  }
+  else {
+    line_or_equality = EQUALITY;
+    virtual_kind = CON_VIRTUAL;
+    jump = 1;
+  }
+
+  TEMP_INTEGER(num_rows_to_subtract);
+  TEMP_INTEGER(row_dim_remainder);
+  for (dimension_type row_index = pivot_index, kinds_index = dim + jump;
+       row_index-- > 0;
+       kinds_index += jump) {
+    // Move over any virtual rows.
+    while (dim_kinds[kinds_index] == virtual_kind)
+      kinds_index += jump;
+
+    // row_kind CONGRUENCE is included as PARAMETER
+    if (row_kind == line_or_equality
+	|| (row_kind == PARAMETER
+	    && dim_kinds[kinds_index] == PARAMETER)) {
+      R& row = sys[row_index];
+
+      const Coefficient& row_dim = row[dim];
+      // num_rows_to_subtract may be positive or negative.
+      num_rows_to_subtract = row_dim / pivot_dim;
+
+      // Ensure that after subtracting num_rows_to_subtract * r_dim
+      // from row_dim, -pivot_dim_half < row_dim <= pivot_dim_half.
+      // E.g., if pivot[dim] = 9, then after strong reduction
+      // -5 < row_dim <= 5.
+      row_dim_remainder = row_dim % pivot_dim;
+      if (row_dim_remainder < 0) {
+	if (row_dim_remainder <= -pivot_dim_half)
+	  --num_rows_to_subtract;
+      }
+      else if (row_dim_remainder > 0 && row_dim_remainder > pivot_dim_half)
+	++num_rows_to_subtract;
+
+      // Subtract num_rows_to_subtract copies of pivot from row i.  Only the
+      // entries from dim need to be subtracted, as the preceding
+      // entries are all zero.
+      // If num_rows_to_subtract is negative, these copies of pivot are
+      // added to row i.
+      if (num_rows_to_subtract != 0)
+	for (dimension_type col = start; col <= end; ++col)
+	  sub_mul_assign(row[col], num_rows_to_subtract, pivot[col]);
+    }
+  }
+}
+#endif // STRONG_REDUCTION
+
 } // namespace Parma_Polyhedra_Library
 
 #endif // !defined(PPL_Grid_templates_hh)
diff --git a/src/Grid.types.hh b/src/Grid.types.hh
index a0ce3d6..3bbe471 100644
--- a/src/Grid.types.hh
+++ b/src/Grid.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Grid_Certificate.cc b/src/Grid_Certificate.cc
index a03de1c..015dd37 100644
--- a/src/Grid_Certificate.cc
+++ b/src/Grid_Certificate.cc
@@ -1,12 +1,12 @@
 /* Grid_Certificate class implementation
    (non-inline member functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid_Certificate.defs.hh"
 
@@ -49,8 +49,7 @@ PPL::Grid_Certificate::Grid_Certificate(const Grid& cgr)
 	// Calculate number of congruences from generators.
  	num_proper_congruences
 	  = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
-	num_equalities
-	  = gr.space_dimension() + 1 - gr.gen_sys.num_generators();
+	num_equalities = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
       }
       else {
 	// Minimize gr congruence system.  As in Polyhedron assume
@@ -73,26 +72,27 @@ PPL::Grid_Certificate::Grid_Certificate(const Grid& cgr)
       // gr contains at least one point.
       Grid::simplify(gr.gen_sys, gr.dim_kinds);
       // If gen_sys contained rows before being reduced, it should
-      // contain at least a single point afterwards.
-      assert(gr.gen_sys.num_generators() > 0);
+      // contain at least a single point afterward.
+      assert(!gr.gen_sys.empty());
       gr.set_generators_minimized();
     }
     // Calculate number of congruences from generators.
     num_proper_congruences
       = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
     num_equalities
-      = gr.space_dimension() + 1 - gr.gen_sys.num_generators();
+      = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
   }
 }
 
 int
 PPL::Grid_Certificate::compare(const Grid_Certificate& y) const {
   assert(OK() && y.OK());
-  if (num_equalities == y.num_equalities)
+  if (num_equalities == y.num_equalities) {
     if (num_proper_congruences == y.num_proper_congruences)
       return 0;
     else
       return num_proper_congruences > y.num_proper_congruences ? 1 : -1;
+  }
   return num_equalities > y.num_equalities ? 1 : -1;
 }
 
diff --git a/src/Grid_Certificate.defs.hh b/src/Grid_Certificate.defs.hh
index 7e9e941..4bcd4d3 100644
--- a/src/Grid_Certificate.defs.hh
+++ b/src/Grid_Certificate.defs.hh
@@ -1,11 +1,11 @@
 /* Grid_Certificate class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -70,7 +70,7 @@ public:
     Returns <CODE>true</CODE> if and only if the certificate for grid
     \p gr is strictly smaller than \p *this.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool is_stabilizing(const Grid& gr) const;
 
   //! A total ordering on Grid certificates.
@@ -86,7 +86,7 @@ public:
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   //! Check if gathered information is meaningful.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool OK() const;
 
 private:
diff --git a/src/Grid_Certificate.inlines.hh b/src/Grid_Certificate.inlines.hh
index 419834d..94be10f 100644
--- a/src/Grid_Certificate.inlines.hh
+++ b/src/Grid_Certificate.inlines.hh
@@ -1,11 +1,11 @@
 /* Grid_Certificate class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Grid_Certificate.types.hh b/src/Grid_Certificate.types.hh
index 54c2e15..1ccb060 100644
--- a/src/Grid_Certificate.types.hh
+++ b/src/Grid_Certificate.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Grid_Generator.cc b/src/Grid_Generator.cc
index 8dcbc3d..f6fd43e 100644
--- a/src/Grid_Generator.cc
+++ b/src/Grid_Generator.cc
@@ -1,11 +1,11 @@
 /* Grid_Generator class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid_Generator.defs.hh"
 #include <iostream>
@@ -51,7 +51,7 @@ PPL::Grid_Generator::parameter(const Linear_Expression& e,
   // Using this constructor saves reallocation when creating the
   // coefficients.
   Grid_Generator gg(g);
-  gg.divisor() = d;
+  gg.set_divisor(d);
 
   // If the divisor is negative, negate it and all the coefficients of
   // the parameter.  This ensures that divisors are always positive.
@@ -63,8 +63,8 @@ PPL::Grid_Generator::parameter(const Linear_Expression& e,
 }
 
 PPL::Grid_Generator
-PPL::Grid_Generator::point(const Linear_Expression& e,
-			   Coefficient_traits::const_reference d) {
+PPL::Grid_Generator::grid_point(const Linear_Expression& e,
+				Coefficient_traits::const_reference d) {
   if (d == 0)
     throw std::invalid_argument("PPL::grid_point(e, d):\n"
 				"d == 0.");
@@ -89,7 +89,7 @@ PPL::Grid_Generator::point(const Linear_Expression& e,
 }
 
 PPL::Grid_Generator
-PPL::Grid_Generator::line(const Linear_Expression& e) {
+PPL::Grid_Generator::grid_line(const Linear_Expression& e) {
   // The origin of the space cannot be a line.
   if (e.all_homogeneous_terms_are_zero())
     throw std::invalid_argument("PPL::grid_line(e):\n"
@@ -128,6 +128,74 @@ PPL::Grid_Generator::coefficient_swap(Grid_Generator& y) {
     std::swap(operator[](j), y[j]);
 }
 
+void
+PPL::Grid_Generator::ascii_dump(std::ostream& s) const {
+  const Grid_Generator& x = *this;
+  const dimension_type x_size = x.size();
+  s << "size " << x_size << " ";
+  for (dimension_type i = 0; i < x_size; ++i)
+    s << x[i] << ' ';
+  switch (x.type()) {
+  case Generator::LINE:
+    s << "L";
+    break;
+  case Generator::RAY:
+    s << "Q";
+    break;
+  case Generator::POINT:
+    s << "P";
+    break;
+  }
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator)
+
+bool
+PPL::Grid_Generator::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "size")
+    return false;
+  dimension_type new_size;
+  if (!(s >> new_size))
+    return false;
+
+  Row& x = *this;
+  const dimension_type old_size = x.size();
+  if (new_size < old_size)
+    x.shrink(new_size);
+  else if (new_size > old_size) {
+    Row y(new_size, Row::Flags());
+    x.swap(y);
+  }
+
+  for (dimension_type col = 0; col < new_size; ++col)
+    if (!(s >> x[col]))
+      return false;
+
+  if (!(s >> str))
+    return false;
+  if (str == "L")
+    set_is_line();
+  else if (str == "P" || str == "Q")
+    set_is_ray_or_point();
+  else
+    return false;
+
+  return true;
+}
+
+void
+PPL::Grid_Generator::set_is_parameter() {
+  if (is_line())
+    set_is_parameter_or_point();
+  else if (!is_line_or_parameter()) {
+    // The generator is a point.
+    Generator::operator[](size() - 1) = Generator::operator[](0);
+    Generator::operator[](0) = 0;
+  }
+}
+
 bool
 PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const {
   const Grid_Generator& x = *this;
@@ -139,20 +207,20 @@ PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const {
   if (x_type != y.type())
     return false;
 
-  Grid_Generator tem(*this);
-  Grid_Generator tem_y(y);
+  Grid_Generator tmp = *this;
+  Grid_Generator tmp_y = y;
   dimension_type& last = x_space_dim;
   ++last;
   if (x_type == POINT || x_type == LINE) {
-    tem[last] = 0;
-    tem_y[last] = 0;
+    tmp[last] = 0;
+    tmp_y[last] = 0;
   }
   // Normalize the copies, including the divisor column.
-  tem.Row::normalize();
-  tem_y.Row::normalize();
+  tmp.Row::normalize();
+  tmp_y.Row::normalize();
   // Check for equality.
   while (last-- > 0)
-    if (tem[last] != tem_y[last])
+    if (tmp[last] != tmp_y[last])
       return false;
   return true;
 }
@@ -185,8 +253,8 @@ PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) {
 				  "d == 0.");
 
     TEMP_INTEGER(factor);
-    factor = d / divisor();
-    divisor() = d;
+    exact_div_assign(factor, d, divisor());
+    set_divisor(d);
     assert(factor > 0);
     if (factor > 1)
       for (dimension_type col = size() - 2; col >= 1; --col)
@@ -194,19 +262,35 @@ PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) {
   }
 }
 
+const PPL::Grid_Generator* PPL::Grid_Generator::zero_dim_point_p = 0;
+
+void
+PPL::Grid_Generator::initialize() {
+  assert(zero_dim_point_p == 0);
+  zero_dim_point_p
+    = new Grid_Generator(grid_point());
+}
+
+void
+PPL::Grid_Generator::finalize() {
+  assert(zero_dim_point_p != 0);
+  delete zero_dim_point_p;
+  zero_dim_point_p = 0;
+}
+
 /*! \relates Parma_Polyhedra_Library::Grid_Generator */
 std::ostream&
 PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
   bool need_divisor = false;
   bool extra_parentheses = false;
-  const int num_variables = g.space_dimension();
+  const dimension_type num_variables = g.space_dimension();
   Grid_Generator::Type t = g.type();
   switch (t) {
   case Grid_Generator::LINE:
     s << "l(";
     break;
   case Grid_Generator::PARAMETER:
-    s << "r(";
+    s << "q(";
     if (g[num_variables + 1] == 1)
       break;
     goto any_point;
@@ -215,8 +299,8 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
     if (g[0] > 1) {
     any_point:
       need_divisor = true;
-      int num_non_zero_coefficients = 0;
-      for (int v = 0; v < num_variables; ++v)
+      dimension_type num_non_zero_coefficients = 0;
+      for (dimension_type v = 0; v < num_variables; ++v)
 	if (g[v+1] != 0)
 	  if (++num_non_zero_coefficients > 1) {
 	    extra_parentheses = true;
@@ -227,9 +311,10 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
     break;
   }
 
+  TEMP_INTEGER(gv);
   bool first = true;
-  for (int v = 0; v < num_variables; ++v) {
-    Coefficient gv = g[v+1];
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    gv = g[v+1];
     if (gv != 0) {
       if (!first) {
 	if (gv > 0)
@@ -283,7 +368,7 @@ bool
 PPL::Grid_Generator::OK() const {
   if (!is_necessarily_closed()) {
 #ifndef NDEBUG
-    std::cerr << "Grid_Generator Generator should be necessarily closed."
+    std::cerr << "Grid_Generator should be necessarily closed."
 	      << std::endl;
 #endif
     return false;
@@ -335,5 +420,3 @@ PPL::Grid_Generator::OK() const {
   // All tests passed.
   return true;
 }
-
-PPL_OUTPUT_DEFINITIONS(Grid_Generator);
diff --git a/src/Grid_Generator.defs.hh b/src/Grid_Generator.defs.hh
index 33dc032..298f1ba 100644
--- a/src/Grid_Generator.defs.hh
+++ b/src/Grid_Generator.defs.hh
@@ -1,11 +1,11 @@
 /* Grid_Generator class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,9 +24,13 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_Grid_Generator_defs_hh 1
 
 #include "Grid_Generator.types.hh"
+#include "Coefficient.defs.hh"
 #include "Grid_Generator_System.defs.hh"
 #include "Generator.defs.hh"
 #include "Grid.types.hh"
+// FIXME: this inclusion must be removed along with the friend declaration
+//        befriending class Box.
+#include "Box.types.hh"
 #include <iosfwd>
 
 namespace Parma_Polyhedra_Library {
@@ -52,30 +56,30 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
 
 } // namespace std
 
-//! A line, parameter or point.
+//! A grid line, parameter or grid point.
 /*! \ingroup PPL_CXX_interface
   An object of the class Grid_Generator is one of the following:
 
-  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+  - a grid_line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
 
   - a parameter
     \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
 
-  - a point
+  - a grid_point
     \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
 
   where \f$n\f$ is the dimension of the space
-  and, for points and parameters, \f$d > 0\f$ is the divisor.
+  and, for grid_points and parameters, \f$d > 0\f$ is the divisor.
 
   \par How to build a grid generator.
   Each type of generator is built by applying the corresponding
-  function (<CODE>line</CODE>, <CODE>parameter</CODE> or <CODE>point</CODE>)
-  to a linear expression;
+  function (<CODE>grid_line</CODE>, <CODE>parameter</CODE>
+  or <CODE>grid_point</CODE>) to a linear expression;
   the space dimension of the generator is defined as the space dimension
   of the corresponding linear expression.
   Linear expressions used to define a generator should be homogeneous
   (any constant term will be simply ignored).
-  When defining points and parameters, an optional Coefficient argument
+  When defining grid points and parameters, an optional Coefficient argument
   can be used as a common <EM>divisor</EM> for all the coefficients
   occurring in the provided linear expression;
   the default value for this argument is 1.
@@ -91,7 +95,7 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   \endcode
 
   \par Example 1
-  The following code builds a line with direction \f$x-y-z\f$
+  The following code builds a grid line with direction \f$x-y-z\f$
   and having space dimension \f$3\f$:
   \code
   Grid_Generator l = grid_line(x - y - z);
@@ -122,7 +126,7 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   \endcode
 
   \par Example 3
-  The following code builds the point
+  The following code builds the grid point
   \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
   \code
   Grid_Generator p = grid_point(1*x + 0*y + 2*z);
@@ -142,7 +146,7 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   \code
   Grid_Generator origin2 = grid_point(0*y);
   \endcode
-  The following two lines of code both define the only point
+  The following two lines of code both define the only grid point
   having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
   In the second case we exploit the fact that the first argument
   of the function <CODE>point</CODE> is optional.
@@ -152,7 +156,7 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   \endcode
 
   \par Example 4
-  The point \f$\vect{p}\f$ specified in Example 3 above
+  The grid point \f$\vect{p}\f$ specified in Example 3 above
   can also be obtained with the following code,
   where we provide a non-default value for the second argument
   of the function <CODE>grid_point</CODE> (the divisor):
@@ -161,7 +165,7 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   \endcode
   Obviously, the divisor can be used to specify
   points having some non-integer (but rational) coordinates.
-  For instance, the point
+  For instance, the grid point
   \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
   can be specified by the following code:
   \code
@@ -170,7 +174,7 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   If a zero divisor is provided, an exception is thrown.
 
   \par Example 5
-  Parameters, like points can have a divisor.
+  Parameters, like grid points can have a divisor.
   For instance, the parameter
   \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
   \code
@@ -194,49 +198,96 @@ void swap(Parma_Polyhedra_Library::Grid_Generator& x,
   \par Example 6
   The following code shows how it is possible to access each single
   coefficient of a grid generator.
-  If <CODE>g1</CODE> is a point having coordinates
+  If <CODE>g1</CODE> is a grid point having coordinates
   \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
   we construct the parameter <CODE>g2</CODE> having coordinates
   \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
   \code
   if (g1.is_point()) {
-    cout << "Point g1: " << g1 << endl;
+    cout << "Grid point g1: " << g1 << endl;
     Linear_Expression e;
-    for (int i = g1.space_dimension() - 1; i >= 0; i--)
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
       e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
     Grid_Generator g2 = parameter(e, g1.divisor());
     cout << "Parameter g2: " << g2 << endl;
   }
   else
-    cout << "Grid Generator g1 is not a point." << endl;
+    cout << "Grid Generator g1 is not a grid point." << endl;
   \endcode
-  Therefore, for the point
+  Therefore, for the grid point
   \code
   Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
   \endcode
   we would obtain the following output:
   \code
-  Point g1: p((2*A - B + 3*C)/2)
+  Grid point g1: p((2*A - B + 3*C)/2)
   Parameter g2: parameter((2*A - 2*B + 9*C)/2)
   \endcode
-  When working with points and parameters, be careful not to confuse
+  When working with grid points and parameters, be careful not to confuse
   the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
   these are equivalent only when the divisor is 1.
 */
 class Parma_Polyhedra_Library::Grid_Generator : private Generator {
 public:
-  // FIXME: Add wrappers of any other public Generator methods.
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Grid_Generator grid_line(const Linear_Expression& e);
+
+  //! Returns the parameter of direction \p e and size \p e/d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator parameter(const Linear_Expression& e
+				  = Linear_Expression::zero(),
+				  Coefficient_traits::const_reference d
+				  = Coefficient_one());
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator grid_point(const Linear_Expression& e
+				   = Linear_Expression::zero(),
+				   Coefficient_traits::const_reference d
+				   = Coefficient_one());
+
+  //! Ordinary copy-constructor.
+  Grid_Generator(const Grid_Generator& g);
+
+  //! Destructor.
+  ~Grid_Generator();
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Grid_Generator& g);
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Generator& g);
+
+  //! Returns the maximum space dimension a Grid_Generator can handle.
+  static dimension_type max_space_dimension();
 
   //! Returns the dimension of the vector space enclosing \p *this.
   dimension_type space_dimension() const;
 
   //! The generator type.
   enum Type {
-    /*! The generator is a line. */
+    /*! The generator is a grid line. */
     LINE,
     /*! The generator is a parameter. */
     PARAMETER,
-    /*! The generator is a point. */
+    /*! The generator is a grid point. */
     POINT
   };
 
@@ -264,45 +315,13 @@ public:
   */
   bool is_parameter_or_point() const;
 
-  //! Returns the line of direction \p e.
-  /*!
-    \exception std::invalid_argument
-    Thrown if the homogeneous part of \p e represents the origin of
-    the vector space.
-  */
-  static Grid_Generator line(const Linear_Expression& e);
-
-  //! Returns the parameter at \p e.
-  /*!
-    Both \p e and \p d are optional arguments, with default values
-    Linear_Expression::zero() and Coefficient_one(), respectively.
-
-    \exception std::invalid_argument
-    Thrown if \p d is zero.
-  */
-  static Grid_Generator parameter(const Linear_Expression& e
-				  = Linear_Expression::zero(),
-				  Coefficient_traits::const_reference d
-				  = Coefficient_one());
-
-  //! Returns the point at \p e / \p d.
+  //! Returns the coefficient of \p v in \p *this.
   /*!
-    Both \p e and \p d are optional arguments, with default values
-    Linear_Expression::zero() and Coefficient_one(), respectively.
-
     \exception std::invalid_argument
-    Thrown if \p d is zero.
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
   */
-  static Grid_Generator point(const Linear_Expression& e
-			      = Linear_Expression::zero(),
-			      Coefficient_traits::const_reference d
-			      = Coefficient_one());
-
-  //! Assignment operator.
-  Grid_Generator& operator=(const Grid_Generator& g);
-
-  //! Assignment operator.
-  Grid_Generator& operator=(const Generator& g);
+  Coefficient_traits::const_reference coefficient(Variable v) const;
 
   //! Returns the divisor of \p *this.
   /*!
@@ -311,6 +330,15 @@ public:
   */
   Coefficient_traits::const_reference divisor() const;
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Grid_Generator& zero_dim_point();
+
   /*! \brief
     Returns a lower bound to the total size in bytes of the memory
     occupied by \p *this.
@@ -332,19 +360,28 @@ public:
   bool is_equal_to(const Grid_Generator& y) const;
 
   /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p gg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+			     const Grid_Generator& gg) const;
+
+  /*! \brief
     Returns <CODE>true</CODE> if and only if all the homogeneous terms
     of \p *this are \f$0\f$.
   */
   bool all_homogeneous_terms_are_zero() const;
 
-  /*! \brief
-    Scales \p *this to be represented with a divisor of \p d (if
-    \*this is a parameter or point).
+  PPL_OUTPUT_DECLARATIONS
 
-    \exception std::invalid_argument
-    Thrown if \p d is zero.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-  void scale_to_divisor(Coefficient_traits::const_reference d);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
   //! Checks if all the invariants are satisfied.
   bool OK() const;
@@ -356,24 +393,30 @@ public:
     Swaps \p *this with \p y, leaving \p *this with the original
     capacity.
 
-    All up to and including the last element of the smaller of \p
-    *this and \p y are swapped.  The parameter divisor element of \p y
-    is swapped with the divisor element of \p *this.
+    All elements up to and including the last element of the smaller
+    of \p *this and \p y are swapped.  The parameter divisor element
+    of \p y is swapped with the divisor element of \p *this.
   */
   void coefficient_swap(Grid_Generator& y);
 
-  PPL_OUTPUT_DECLARATIONS;
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Grid_Generator* zero_dim_point_p;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    Scales \p *this to be represented with a divisor of \p d (if
+    \*this is a parameter or point).
+
+    It is assumed that \p d is a multiple of the current divisor.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+  void scale_to_divisor(Coefficient_traits::const_reference d);
 
-private:
   /*! \brief
     Constructs from polyhedron generator \p g, stealing the underlying
     data structures from \p g.
@@ -389,12 +432,12 @@ private:
   //! Negates the elements from index \p start to index \p end.
   void negate(dimension_type start, dimension_type end);
 
-  //! Returns the divisor of \p *this.
+  //! Sets the divisor of \p *this to \p d.
   /*!
     \exception std::invalid_argument
     Thrown if \p *this is a line.
   */
-  Coefficient& divisor();
+  void set_divisor(Coefficient_traits::const_reference d);
 
   //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
   void set_is_line();
@@ -402,6 +445,9 @@ private:
   //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
   void set_is_parameter_or_point();
 
+  //! Converts the Grid_Generator into a parameter.
+  void set_is_parameter();
+
   /*! \brief
     Strong normalization: ensures that different Grid_Generator
     objects represent different hyperplanes or hyperspaces.
@@ -429,14 +475,23 @@ private:
   friend std::ostream&
   IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
   // FIXME: The following friend declaration is for operator[] and
-  //        divisor() access in Grid::conversion and Grid::simplify.
+  //        divisor() access in Grid::conversion, Grid::simplify,
+  //        Grid::relation_with(c) and Grid::Grid(box, *).
   friend class Grid;
 
+
+  // FIXME: The following friend declaration is for the use of operator[]
+  //        in Box<Interval>::Box(const Grid&, Complexity_Class),
+  //        and should be removed as soon as the computation there is moved
+  //        to the Grid class.
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
   friend class Grid_Generator_System;
   friend class Grid_Generator_System::const_iterator;
   friend class Congruence_System;
   friend class Scalar_Products;
   friend class Topology_Adjusted_Scalar_Product_Sign;
+  friend class Linear_Expression;
 };
 
 
@@ -444,7 +499,7 @@ namespace Parma_Polyhedra_Library {
 
 /*! \brief
   Shorthand for Grid_Generator
-  Grid_Generator::line(const Linear_Expression& e).
+  Grid_Generator::grid_line(const Linear_Expression& e).
 */
 /*! \relates Grid_Generator */
 Grid_Generator grid_line(const Linear_Expression& e);
@@ -461,7 +516,7 @@ parameter(const Linear_Expression& e = Linear_Expression::zero(),
 
 /*! \brief
   Shorthand for Grid_Generator
-  Grid_Generator::point(const Linear_Expression& e,
+  Grid_Generator::grid_point(const Linear_Expression& e,
   Coefficient_traits::const_reference d).
 */
 /*! \relates Grid_Generator */
diff --git a/src/Grid_Generator.inlines.hh b/src/Grid_Generator.inlines.hh
index 24de1d9..2ada931 100644
--- a/src/Grid_Generator.inlines.hh
+++ b/src/Grid_Generator.inlines.hh
@@ -1,11 +1,11 @@
 /* Grid Generator class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,17 +23,44 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Grid_Generator_inlines_hh
 #define PPL_Grid_Generator_inlines_hh 1
 
-#include "Grid_Generator.defs.hh"
-
 namespace Parma_Polyhedra_Library {
 
 inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g)
+  : Generator(g) {
+}
+
+inline
+Grid_Generator::~Grid_Generator() {
+}
+
+inline
 Grid_Generator::Grid_Generator(Generator g)
   : Generator(Generator::point()) {
   Generator::swap(g);
 }
 
 inline dimension_type
+Grid_Generator::size() const {
+  return Generator::size();
+}
+
+inline dimension_type
+Grid_Generator::max_space_dimension() {
+  return Generator::max_space_dimension() - 1;
+}
+
+inline Coefficient&
+Grid_Generator::operator[](dimension_type k) {
+  return Generator::operator[](k);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::operator[](dimension_type k) const {
+  return Generator::operator[](k);
+}
+
+inline dimension_type
 Grid_Generator::space_dimension() const {
   return Generator::space_dimension() - 1;
 }
@@ -80,6 +107,31 @@ Grid_Generator::is_parameter_or_point() const {
 }
 
 inline void
+Grid_Generator::set_divisor(Coefficient_traits::const_reference d) {
+  assert(!is_line());
+  if (is_line_or_parameter())
+    Generator::operator[](size() - 1) = d;
+  else
+    Generator::operator[](0) = d;
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return Generator::operator[](size() - 1);
+  else
+    return Generator::operator[](0);
+}
+
+inline bool
+Grid_Generator::is_equal_at_dimension(dimension_type dim,
+				      const Grid_Generator& gg) const {
+  return operator[](dim) * gg.divisor() == gg[dim] * divisor();
+}
+
+inline void
 Grid_Generator::set_is_line() {
   Generator::set_is_line();
 }
@@ -107,22 +159,11 @@ Grid_Generator::negate(dimension_type start, dimension_type end) {
     neg_assign(operator[](start++));
 }
 
-inline Coefficient&
-Grid_Generator::divisor() {
-  if (is_line())
-    throw_invalid_argument("divisor()", "*this is a line");
-  if (is_line_or_parameter())
-    return Generator::operator[](size() - 1);
-  return Generator::operator[](0);
-}
-
 inline Coefficient_traits::const_reference
-Grid_Generator::divisor() const {
-  if (is_line())
-    throw_invalid_argument("divisor()", "*this is a line");
-  if (is_line_or_parameter())
-    return Generator::operator[](size() - 1);
-  return Generator::operator[](0);
+Grid_Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Generator::coefficient(v);
 }
 
 inline memory_size_type
@@ -135,41 +176,22 @@ Grid_Generator::external_memory_in_bytes() const {
   return Generator::external_memory_in_bytes();
 }
 
+inline const Grid_Generator&
+Grid_Generator::zero_dim_point() {
+  assert(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
+
 inline void
 Grid_Generator::strong_normalize() {
   Generator::strong_normalize();
 }
 
-inline dimension_type
-Grid_Generator::size() const {
-  return Generator::size();
-}
-
 inline void
 Grid_Generator::swap(Grid_Generator& y) {
   Generator::swap(y);
 }
 
-inline void
-Grid_Generator::ascii_dump(std::ostream& s) const {
-  Generator::ascii_dump(s);
-}
-
-inline bool
-Grid_Generator::ascii_load(std::istream& s) {
-  return Generator::ascii_load(s);
-}
-
-inline Coefficient&
-Grid_Generator::operator[](dimension_type k) {
-  return Generator::operator[](k);
-}
-
-inline Coefficient_traits::const_reference
-Grid_Generator::operator[](dimension_type k) const {
-  return Generator::operator[](k);
-}
-
 /*! \relates Grid_Generator */
 inline bool
 operator==(const Grid_Generator& x, const Grid_Generator& y) {
@@ -185,7 +207,7 @@ operator!=(const Grid_Generator& x, const Grid_Generator& y) {
 /*! \relates Grid_Generator */
 inline Grid_Generator
 grid_line(const Linear_Expression& e) {
-  return Grid_Generator::line(e);
+  return Grid_Generator::grid_line(e);
 }
 
 /*! \relates Grid_Generator */
@@ -199,7 +221,7 @@ parameter(const Linear_Expression& e,
 inline Grid_Generator
 grid_point(const Linear_Expression& e,
 	   Coefficient_traits::const_reference d) {
-  return Grid_Generator::point(e, d);
+  return Grid_Generator::grid_point(e, d);
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_Generator.types.hh b/src/Grid_Generator.types.hh
index 62d396c..4beb2bc 100644
--- a/src/Grid_Generator.types.hh
+++ b/src/Grid_Generator.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Grid_Generator_System.cc b/src/Grid_Generator_System.cc
index 0db91da..68db21a 100644
--- a/src/Grid_Generator_System.cc
+++ b/src/Grid_Generator_System.cc
@@ -1,11 +1,11 @@
 /* Grid_Generator_System class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,12 +20,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
-
+#include <ppl-config.h>
 #include "Grid_Generator_System.defs.hh"
 #include "Grid_Generator_System.inlines.hh"
 #include "Scalar_Products.defs.hh"
-
+#include "Variables_Set.defs.hh"
 #include <cassert>
 #include <iostream>
 
@@ -35,19 +34,19 @@ void
 PPL::Grid_Generator_System::recycling_insert(Grid_Generator_System& gs) {
   const dimension_type old_num_rows = num_rows();
   const dimension_type gs_num_rows = gs.num_rows();
-  const dimension_type old_num_cols = num_columns();
-  const dimension_type gs_num_cols = gs.num_columns();
-  if (old_num_cols >= gs_num_cols)
+  const dimension_type old_num_columns = num_columns();
+  const dimension_type gs_num_columns = gs.num_columns();
+  if (old_num_columns >= gs_num_columns)
     add_zero_rows(gs_num_rows,
 		  Linear_Row::Flags(NECESSARILY_CLOSED,
 				    Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
   else {
     add_zero_rows_and_columns(gs_num_rows,
-			      gs_num_cols - old_num_cols,
+			      gs_num_columns - old_num_columns,
 			      Linear_Row::Flags(NECESSARILY_CLOSED,
 						Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
     // Swap the parameter divisor column into the new last column.
-    swap_columns(old_num_cols - 1, num_columns() - 1);
+    swap_columns(old_num_columns - 1, num_columns() - 1);
   }
   set_index_first_pending_row(old_num_rows + gs_num_rows);
   // Swap one coefficient at a time into the newly added rows, instead
@@ -60,19 +59,19 @@ PPL::Grid_Generator_System::recycling_insert(Grid_Generator_System& gs) {
 void
 PPL::Grid_Generator_System::recycling_insert(Grid_Generator& g) {
   dimension_type old_num_rows = num_rows();
-  const dimension_type old_num_cols = num_columns();
-  const dimension_type g_num_cols = g.size();
-  if (old_num_cols >= g_num_cols)
+  const dimension_type old_num_columns = num_columns();
+  const dimension_type g_num_columns = g.size();
+  if (old_num_columns >= g_num_columns)
     add_zero_rows(1,
 		  Linear_Row::Flags(NECESSARILY_CLOSED,
 				    Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
   else {
     add_zero_rows_and_columns(1,
-			      g_num_cols - old_num_cols,
+			      g_num_columns - old_num_columns,
 			      Linear_Row::Flags(NECESSARILY_CLOSED,
 						Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
     // Swap the parameter divisor column into the new last column.
-    swap_columns(old_num_cols - 1, num_columns() - 1);
+    swap_columns(old_num_columns - 1, num_columns() - 1);
   }
   set_index_first_pending_row(old_num_rows + 1);
   // Swap one coefficient at a time into the newly added rows, instead
@@ -172,13 +171,13 @@ PPL::Grid_Generator_System
   assert(expr.space_dimension() <= x.space_dimension());
   assert(denominator > 0);
 
-  const dimension_type n_columns = x.num_columns();
-  const dimension_type n_rows = x.num_rows();
+  const dimension_type num_columns = x.num_columns();
+  const dimension_type num_rows = x.num_rows();
 
   // Compute the numerator of the affine transformation and assign it
   // to the column of `*this' indexed by `v'.
   TEMP_INTEGER(numerator);
-  for (dimension_type i = n_rows; i-- > 0; ) {
+  for (dimension_type i = num_rows; i-- > 0; ) {
     Grid_Generator& row = x[i];
     Scalar_Products::assign(numerator, expr, row);
     std::swap(numerator, row[v]);
@@ -188,9 +187,9 @@ PPL::Grid_Generator_System
     // Since we want integer elements in the matrix,
     // we multiply by `denominator' all the columns of `*this'
     // having an index different from `v'.
-    for (dimension_type i = n_rows; i-- > 0; ) {
+    for (dimension_type i = num_rows; i-- > 0; ) {
       Grid_Generator& row = x[i];
-      for (dimension_type j = n_columns; j-- > 0; )
+      for (dimension_type j = num_columns; j-- > 0; )
 	if (j != v)
 	  row[j] *= denominator;
     }
@@ -202,87 +201,60 @@ PPL::Grid_Generator_System
     x.remove_invalid_lines_and_rays();
 }
 
-PPL_OUTPUT_DEFINITIONS(Grid_Generator_System);
+PPL_OUTPUT_DEFINITIONS(Grid_Generator_System)
+
+void
+PPL::Grid_Generator_System::ascii_dump(std::ostream& s) const {
+  const dimension_type num_rows = this->num_rows();
+  s << num_rows << " x " << num_columns() << '\n';
+  for (dimension_type i = 0; i < num_rows; ++i)
+    operator[](i).ascii_dump(s);
+}
 
 bool
 PPL::Grid_Generator_System::ascii_load(std::istream& s) {
-  // This is a copy of Generator_System::ascii_load, to force
-  // Grid_Generator_System::OK to be called, in order to work around
-  // the assertions in Linear_System::OK.
-
-  // FIXME: Gridify this.  Add an ascii_dump to match.
-
-  std::string str;
-  if (!(s >> str) || str != "topology")
-    return false;
-  if (!(s >> str))
-    return false;
-  if (str == "NECESSARILY_CLOSED")
-    set_necessarily_closed();
-  else {
-    if (str != "NOT_NECESSARILY_CLOSED")
-      return false;
-    set_not_necessarily_closed();
-  }
-
-  dimension_type nrows;
-  dimension_type ncols;
-  if (!(s >> nrows))
+  dimension_type num_rows;
+  dimension_type num_columns;
+  if (!(s >> num_rows))
     return false;
+  std::string str;
   if (!(s >> str))
     return false;
-  if (!(s >> ncols))
+  if (!(s >> num_columns))
       return false;
-  resize_no_copy(nrows, ncols);
+  resize_no_copy(num_rows, num_columns);
 
-  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
-    return false;
-  set_sorted(str == "(sorted)");
-  dimension_type index;
-  if (!(s >> str) || str != "index_first_pending")
-    return false;
-  if (!(s >> index))
-    return false;
-  set_index_first_pending_row(index);
+  set_sorted(false);
+  set_index_first_pending_row(num_rows);
 
   Grid_Generator_System& x = *this;
-  for (dimension_type i = 0; i < x.num_rows(); ++i) {
-    for (dimension_type j = 0; j < x.num_columns(); ++j)
-      if (!(s >> const_cast<Coefficient&>(x[i][j])))
-	return false;
-
-    if (!(s >> str))
+  for (dimension_type i = 0; i < num_rows; ++i)
+    if (!x[i].ascii_load(s))
       return false;
-    if (str == "L")
-      x[i].set_is_line();
-    else
-      x[i].set_is_ray_or_point();
-
-    // Checking for equality of actual and declared types.
-    switch (x[i].type()) {
-    case Grid_Generator::LINE:
-      if (str == "L")
-	continue;
-      break;
-    case Grid_Generator::PARAMETER:
-      if (str == "R")
-	continue;
-      break;
-    case Grid_Generator::POINT:
-      if (str == "P")
-	continue;
-      break;
-    }
-    // Reaching this point means that the input was illegal.
-    return false;
-  }
-
-  // Checking for well-formedness.
 
+  // Check invariants.
   assert(OK());
+
   return true;
 }
 
+const PPL::Grid_Generator_System*
+PPL::Grid_Generator_System::zero_dim_univ_p = 0;
+
+void
+PPL::Grid_Generator_System::initialize() {
+  assert(zero_dim_univ_p == 0);
+  zero_dim_univ_p
+    = new Grid_Generator_System(Grid_Generator::zero_dim_point());
+}
+
+void
+PPL::Grid_Generator_System::finalize() {
+  assert(zero_dim_univ_p != 0);
+  delete zero_dim_univ_p;
+  zero_dim_univ_p = 0;
+}
+
 bool
 PPL::Grid_Generator_System::OK() const {
   if (topology() == NOT_NECESSARILY_CLOSED) {
@@ -345,74 +317,51 @@ PPL::Grid_Generator_System
   // Swap the parameter divisor column into the new last column.
   swap_columns(col, col + dims);
   // Set the diagonal element of each added rows.
-  dimension_type rows = num_rows();
-  for (dimension_type row = rows - dims; row < rows; ++row, ++col)
+  dimension_type num_rows = this->num_rows();
+  for (dimension_type row = num_rows - dims; row < num_rows; ++row, ++col)
     const_cast<Coefficient&>(operator[](row)[col]) = 1;
 }
 
 void
 PPL::Grid_Generator_System
 ::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // Dimension-compatibility assertion.
+  assert(space_dimension() >= to_be_removed.space_dimension());
+
   // The removal of no dimensions from any system is a no-op.  This
   // case also captures the only legal removal of dimensions from a
   // 0-dim system.
   if (to_be_removed.empty())
     return;
 
-  // Dimension-compatibility check: the variable having maximum space
-  // dimension is the one occurring last in the set.
-  const dimension_type
-    min_space_dim = to_be_removed.rbegin()->space_dimension();
-  if (space_dimension() < min_space_dim) {
-    std::ostringstream s;
-    s << "PPL::Grid_Generator_System::remove_space_dimensions(vs):\n"
-      << "this->space_dimension() == " << space_dimension()
-      << ", required space dimension == " << min_space_dim << ".";
-    throw std::invalid_argument(s.str());
-  }
-
   // For each variable to be removed, replace the corresponding column
   // by shifting left the columns to the right that will be kept.
   Variables_Set::const_iterator tbr = to_be_removed.begin();
   Variables_Set::const_iterator tbr_end = to_be_removed.end();
-  dimension_type dst_col = tbr->space_dimension();
+  dimension_type dst_col = *tbr+1;
   dimension_type src_col = dst_col + 1;
   for (++tbr; tbr != tbr_end; ++tbr) {
-    dimension_type tbr_col = tbr->space_dimension();
+    const dimension_type tbr_col = *tbr+1;
     // Move all columns in between to the left.
     while (src_col < tbr_col)
-      // FIXME: consider whether Linear_System must have a swap_columns()
-      // method.  If the answer is "no", remove this Matrix:: qualification.
       Matrix::swap_columns(dst_col++, src_col++);
     ++src_col;
   }
   // Move any remaining columns.
-  const dimension_type num_cols = num_columns();
-  while (src_col < num_cols)
-    // FIXME: consider whether Linear_System must have a swap_columns()
-    // method.  If the answer is "no", remove this Matrix:: qualification.
+  const dimension_type num_columns = this->num_columns();
+  while (src_col < num_columns)
     Matrix::swap_columns(dst_col++, src_col++);
 
   // The number of remaining columns is `dst_col'.
-  Matrix::remove_trailing_columns(num_cols - dst_col);
-
-
-
-  remove_invalid_lines_and_rays();
+  Matrix::remove_trailing_columns(num_columns - dst_col);
 }
 
 void
 PPL::Grid_Generator_System
-::remove_higher_space_dimensions(dimension_type new_dimension) {
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
   dimension_type space_dim = space_dimension();
-  // Dimension-compatibility check.
-  if (new_dimension > space_dim) {
-    std::ostringstream s;
-    s << "PPL::Grid_Generator_System::remove_higher_space_dimensions(n):\n"
-      << "this->space_dimension() == " << space_dim
-      << ", required space dimension == " << new_dimension << ".";
-    throw std::invalid_argument(s.str());
-  }
+
+  assert(new_dimension <= space_dim);
 
   // The removal of no dimensions from any system is a no-op.  Note
   // that this case also captures the only legal removal of dimensions
@@ -424,6 +373,5 @@ PPL::Grid_Generator_System
   // become the last column.
   swap_columns(new_dimension + 1, space_dim + 1);
   Matrix::remove_trailing_columns(space_dim - new_dimension);
-  remove_invalid_lines_and_rays();
   assert(OK());
 }
diff --git a/src/Grid_Generator_System.defs.hh b/src/Grid_Generator_System.defs.hh
index 7496fd6..ecad7be 100644
--- a/src/Grid_Generator_System.defs.hh
+++ b/src/Grid_Generator_System.defs.hh
@@ -1,11 +1,11 @@
 /* Grid_Generator_System class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,7 +26,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Grid_Generator_System.types.hh"
 #include "Generator_System.defs.hh"
 #include "Grid_Generator.types.hh"
-#include "Variable.defs.hh"
+#include "Variables_Set.types.hh"
 #include <iosfwd>
 
 namespace Parma_Polyhedra_Library {
@@ -177,19 +177,23 @@ void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
 class Parma_Polyhedra_Library::Grid_Generator_System
   : private Generator_System {
 public:
-  // FIXME: Add wrappers of any other public Generator_System methods.
-
   //! Default constructor: builds an empty system of generators.
   Grid_Generator_System();
 
-  //! Ordinary copy-constructor.
-  Grid_Generator_System(const Grid_Generator_System& gs);
+  //! Builds the singleton system containing only generator \p g.
+  explicit Grid_Generator_System(const Grid_Generator& g);
 
   //! Builds an empty system of generators of dimension \p dim.
   explicit Grid_Generator_System(dimension_type dim);
 
-  //! Builds the singleton system containing only generator \p g.
-  explicit Grid_Generator_System(const Grid_Generator& g);
+  //! Ordinary copy-constructor.
+  Grid_Generator_System(const Grid_Generator_System& gs);
+
+  //! Destructor.
+  ~Grid_Generator_System();
+
+  //! Assignment operator.
+  Grid_Generator_System& operator=(const Grid_Generator_System& y);
 
   //! Returns the maximum space dimension a Grid_Generator_System can handle.
   static dimension_type max_space_dimension();
@@ -225,6 +229,18 @@ public:
   */
   void recycling_insert(Grid_Generator_System& gs);
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only
+    Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System& zero_dim_univ();
+
   //! An iterator over a system of grid generators
   /*! \ingroup PPL_CXX_interface
     A const_iterator is used to provide read-only access
@@ -297,6 +313,9 @@ public:
     const_iterator(const Generator_System::const_iterator& y);
   };
 
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
   /*! \brief
     Returns the const_iterator pointing to the first generator, if \p
     *this is not empty; otherwise, returns the past-the-end
@@ -307,15 +326,82 @@ public:
   //! Returns the past-the-end const_iterator.
   const_iterator end() const;
 
-  //! Swaps \p *this with \p y.
-  void swap(Grid_Generator_System& y);
+  //! Returns the number of rows (generators) in the system.
+  dimension_type num_rows() const;
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  //! Returns the number of parameters in the system.
+  dimension_type num_parameters() const;
+
+  //! Returns the number of lines in the system.
+  dimension_type num_lines() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more points.
+  */
+  bool has_points() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  bool is_equal_to(const Grid_Generator_System& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Grid_Generator.
+  */
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
   //! Returns the total size in bytes of the memory occupied by \p *this.
   memory_size_type total_memory_in_bytes() const;
 
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator_System& y);
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System* zero_dim_univ_p;
+
+  friend class Grid;
+
+  friend bool
+  operator==(const Grid_Generator_System& x, const Grid_Generator_System& y);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Returns the \p k- th generator of the system.
+  Grid_Generator& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Grid_Generator& operator[](dimension_type k) const;
+
   //! Assigns to a given variable an affine expression.
   /*!
     \param v
@@ -349,52 +435,6 @@ public:
 		    const Linear_Expression& expr,
 		    Coefficient_traits::const_reference denominator);
 
-  //! Returns the number of generators in the system.
-  dimension_type num_generators() const;
-
-  //! Returns the number of parameters in the system.
-  dimension_type num_parameters() const;
-
-  //! Returns the number of lines in the system.
-  dimension_type num_lines() const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this contains one or
-    more points.
-  */
-  bool has_points() const;
-
-  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
-  bool is_equal_to(const Grid_Generator_System y) const;
-
-  //! Returns the \p k- th generator of the system.
-  Grid_Generator& operator[](dimension_type k);
-
-  //! Returns a constant reference to the \p k- th generator of the system.
-  const Grid_Generator& operator[](dimension_type k) const;
-
-  PPL_OUTPUT_DECLARATIONS;
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns
-    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-
-    Resizes the matrix of generators using the numbers of rows and columns
-    read from \p s, then initializes the coordinates of each generator
-    and its type reading the contents from \p s.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
-
-  //! Checks if all the invariants are satisfied.
-  /*!
-    Returns <CODE>true</CODE> if and only if \p *this is a valid
-    Linear_System and each row in the system is a valid Grid_Generator.
-  */
-  bool OK() const;
-
   /*! \brief
     Adds \p dims rows and \p dims columns of zeroes to the matrix,
     initializing the added rows as in the universe system.
@@ -404,18 +444,19 @@ public:
     positive.
 
     Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
-    \times (c+dims)\f$ matrix \f$\bigl({A \atop 0}{0 \atop B}\bigr)\f$
-    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the
-    form \f$\bigl({1 \atop 0}{0 \atop 1}\bigr)\f$.  The matrix is
-    expanded avoiding reallocation whenever possible.
+    \times (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{A}{0} \genfrac{}{}{0pt}{}{0}{B}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{1}{0} \genfrac{}{}{0pt}{}{0}{1}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
   */
   void add_universe_rows_and_columns(dimension_type dims);
 
   //! Removes all the specified dimensions from the generator system.
   /*!
-    \exception std::invalid_argument
-    Thrown if the highest space dimension of the variables in \p
-    to_be_removed is higher than the space dimension of \p *this.
+    The space dimension of the variable with the highest space
+    dimension in \p to_be_removed must be at most the space dimension
+    of \p this.
   */
   void remove_space_dimensions(const Variables_Set& to_be_removed);
 
@@ -423,43 +464,25 @@ public:
     Removes the higher dimensions of the system so that the resulting
     system will have dimension \p new_dimension.
 
-    \exception std::invalid_argument
-    Thrown if the \p new_dimension is higher than the space dimension
+    The value of \p new_dimension must be at most the space dimension
     of \p *this.
   */
   void remove_higher_space_dimensions(dimension_type new_dimension);
 
-private:
-  friend bool operator==(const Grid_Generator_System& x,
-			 const Grid_Generator_System& y);
-  // FIXME: The following friend declaration grants Grid::conversion
-  //        access to Matrix (for the Grid::reduce_reduced call) and
-  //        Matrix::resize_no_copy, and the following methods.
-  friend class Grid;
-
-  //! Sets the sortedness flag of the system to \p b.
-  void set_sorted(bool b);
-
-  //! Sets the index to indicate that the system has no pending rows.
-  void unset_pending_rows();
-
-  //! Sets the index of the first pending row to \p i.
-  void set_index_first_pending_row(dimension_type i);
-
   //! Resizes the system without worrying about the old contents.
   /*!
-    \param new_n_rows
+    \param new_num_rows
     The number of rows of the resized system;
 
-    \param new_n_columns
+    \param new_num_columns
     The number of columns of the resized system.
 
     The system is expanded to the specified dimensions avoiding
     reallocation whenever possible.
     The contents of the original system is lost.
   */
-  void resize_no_copy(dimension_type new_n_rows,
-		      dimension_type new_n_columns);
+  void resize_no_copy(dimension_type new_num_rows,
+		      dimension_type new_num_columns);
 
   /*! \brief
     Returns the number of columns of the matrix (i.e., the size of the
diff --git a/src/Grid_Generator_System.inlines.hh b/src/Grid_Generator_System.inlines.hh
index 729ed84..04e5f39 100644
--- a/src/Grid_Generator_System.inlines.hh
+++ b/src/Grid_Generator_System.inlines.hh
@@ -1,11 +1,11 @@
 /* Grid_Generator_System class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,6 +28,49 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+  Generator_System::set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+  Generator_System::unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+  Generator_System::set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System::resize_no_copy(const dimension_type new_num_rows,
+				      const dimension_type new_num_columns) {
+  Generator_System::resize_no_copy(new_num_rows, new_num_columns);
+}
+
+inline dimension_type
+Grid_Generator_System::num_columns() const {
+  return Generator_System::num_columns();
+}
+
+inline void
+Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
+  return Generator_System::erase_to_end(first_to_erase);
+}
+
+inline void
+Grid_Generator_System
+::permute_columns(const std::vector<dimension_type>& cycles) {
+  return Generator_System::permute_columns(cycles);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const {
+  return operator==(static_cast<const Generator_System&>(*this),
+		    static_cast<const Generator_System&>(y));
+}
+
 inline
 Grid_Generator_System::Grid_Generator_System()
   : Generator_System(NECESSARILY_CLOSED) {
@@ -53,6 +96,16 @@ Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
   set_sorted(false);
 }
 
+inline
+Grid_Generator_System::~Grid_Generator_System() {
+}
+
+inline Grid_Generator_System&
+Grid_Generator_System::operator=(const Grid_Generator_System& y) {
+  Generator_System::operator=(y);
+  return *this;
+}
+
 inline dimension_type
 Grid_Generator_System::max_space_dimension() {
   // Grid generators use an extra column for the parameter divisor.
@@ -66,6 +119,12 @@ Grid_Generator_System::space_dimension() const {
   return Generator_System::space_dimension() - 1;
 }
 
+inline const Grid_Generator_System&
+Grid_Generator_System::zero_dim_univ() {
+  assert(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
+}
+
 inline void
 Grid_Generator_System::clear() {
   Generator_System::clear();
@@ -91,7 +150,7 @@ Grid_Generator_System::total_memory_in_bytes() const {
 }
 
 inline dimension_type
-Grid_Generator_System::num_generators() const {
+Grid_Generator_System::num_rows() const {
   return Generator_System::num_rows();
 }
 
@@ -163,6 +222,17 @@ Grid_Generator_System
   return Generator_System::const_iterator::operator!=(y);
 }
 
+inline bool
+Grid_Generator_System::empty() const {
+  return Generator_System::empty();
+}
+
+inline
+Grid_Generator_System
+::const_iterator::const_iterator(const Generator_System::const_iterator& y)
+  : Generator_System::const_iterator::const_iterator(y) {
+}
+
 inline Grid_Generator_System::const_iterator
 Grid_Generator_System::begin() const {
   return static_cast<Grid_Generator_System::const_iterator>
@@ -175,12 +245,6 @@ Grid_Generator_System::end() const {
     (Generator_System::end());
 }
 
-inline
-Grid_Generator_System
-::const_iterator::const_iterator(const Generator_System::const_iterator& y)
-  : Generator_System::const_iterator::const_iterator(y) {
-}
-
 inline bool
 Grid_Generator_System::has_points() const {
   return Generator_System::has_points();
@@ -196,54 +260,6 @@ Grid_Generator_System::operator[](const dimension_type k) const {
   return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
 }
 
-inline void
-Grid_Generator_System::ascii_dump(std::ostream& s) const {
-  return Generator_System::ascii_dump(s);
-}
-
-inline void
-Grid_Generator_System::set_sorted(bool b) {
-  Generator_System::set_sorted(b);
-}
-
-inline void
-Grid_Generator_System::unset_pending_rows() {
-  Generator_System::unset_pending_rows();
-}
-
-inline void
-Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
-  Generator_System::set_index_first_pending_row(i);
-}
-
-inline void
-Grid_Generator_System::resize_no_copy(const dimension_type new_n_rows,
-				      const dimension_type new_n_columns) {
-  Generator_System::resize_no_copy(new_n_rows, new_n_columns);
-}
-
-inline dimension_type
-Grid_Generator_System::num_columns() const {
-  return Generator_System::num_columns();
-}
-
-inline void
-Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
-  return Generator_System::erase_to_end(first_to_erase);
-}
-
-inline void
-Grid_Generator_System
-::permute_columns(const std::vector<dimension_type>& cycles) {
-  return Generator_System::permute_columns(cycles);
-}
-
-inline bool
-Grid_Generator_System::is_equal_to(const Grid_Generator_System y) const {
-  return operator==(static_cast<const Generator_System&>(*this),
-		    static_cast<const Generator_System&>(y));
-}
-
 /*! \relates Grid_Generator_System */
 inline bool
 operator==(const Grid_Generator_System& x,
diff --git a/src/Grid_Generator_System.types.hh b/src/Grid_Generator_System.types.hh
index b0ced3b..5d06605 100644
--- a/src/Grid_Generator_System.types.hh
+++ b/src/Grid_Generator_System.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Grid_Status.cc b/src/Grid_Status.cc
index de09253..240ab73 100644
--- a/src/Grid_Status.cc
+++ b/src/Grid_Status.cc
@@ -1,11 +1,11 @@
 /* Grid::Status class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid.defs.hh"
 #include <iostream>
@@ -78,11 +78,11 @@ PPL::Grid::Status::ascii_dump(std::ostream& s) const {
     << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
     << ' '
     << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
-    << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd << ' '
+    << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd
     << std::endl;
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Grid::Status);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Grid::Status)
 
 bool
 PPL::Grid::Status::ascii_load(std::istream& s) {
@@ -154,7 +154,7 @@ PPL::Grid::Status::ascii_load(std::istream& s) {
   else
     reset_sat_g_up_to_date();
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
diff --git a/src/Grid_Status.idefs.hh b/src/Grid_Status.idefs.hh
index c87ae6a..3396fb0 100644
--- a/src/Grid_Status.idefs.hh
+++ b/src/Grid_Status.idefs.hh
@@ -1,11 +1,11 @@
 /* Grid::Status class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,8 +20,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#ifndef PPL_Grid_Status_defs_hh
-#define PPL_Grid_Status_defs_hh 1
+#ifndef PPL_Grid_Status_idefs_hh
+#define PPL_Grid_Status_idefs_hh 1
 
 #ifndef PPL_IN_Grid_CLASS
 #error "Do not include Grid_Status.idefs.hh directly; use Grid.defs.hh instead."
@@ -118,12 +118,12 @@ public:
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns
-    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
 
@@ -164,4 +164,4 @@ private:
   void reset(flags_t mask);
 };
 
-#endif // !defined(PPL_Grid_Status_defs_hh)
+#endif // !defined(PPL_Grid_Status_idefs_hh)
diff --git a/src/Grid_Status.inlines.hh b/src/Grid_Status.inlines.hh
index 9ee87f9..6b470c5 100644
--- a/src/Grid_Status.inlines.hh
+++ b/src/Grid_Status.inlines.hh
@@ -1,11 +1,11 @@
 /* Grid::Status class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Grid_chdims.cc b/src/Grid_chdims.cc
index 2d9d2c4..ea3fb96 100644
--- a/src/Grid_chdims.cc
+++ b/src/Grid_chdims.cc
@@ -1,12 +1,12 @@
 /* Grid class implementation
    (non-inline operators that may change the dimension of the vector space).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,36 +21,35 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid.defs.hh"
+#include "Variables_Set.defs.hh"
 #include <cassert>
 
-#define BE_LAZY 1
-
 namespace PPL = Parma_Polyhedra_Library;
 
 // Used for add_space_dimensions_and_embed.
-inline void
+void
 PPL::Grid::add_space_dimensions(Congruence_System& cgs,
 				Grid_Generator_System& gs,
 				const dimension_type dims) {
   assert(cgs.num_columns() - 1 == gs.space_dimension() + 1);
   assert(dims > 0);
 
-  dimension_type tem = cgs.num_columns() - 1;
+  const dimension_type old_modulus_index = cgs.num_columns() - 1;
   cgs.add_zero_columns(dims);
   // Move the moduli.
-  cgs.swap_columns(tem, tem + dims);
+  cgs.swap_columns(old_modulus_index, old_modulus_index + dims);
 
   if (congruences_are_minimized() || generators_are_minimized())
-    dim_kinds.resize(tem + dims, CON_VIRTUAL /* a.k.a. LINE */);
+    dim_kinds.resize(old_modulus_index + dims, CON_VIRTUAL /* a.k.a. LINE */);
 
   gs.add_universe_rows_and_columns(dims);
 }
 
 // Used for add_space_dimensions_and_project.
-inline void
+void
 PPL::Grid::add_space_dimensions(Grid_Generator_System& gs,
 				Congruence_System& cgs,
 				const dimension_type dims) {
@@ -243,7 +242,8 @@ PPL::Grid::concatenate_assign(const Grid& y) {
     return;
   }
 
-  congruences_are_up_to_date() || update_congruences();
+  if (!congruences_are_up_to_date())
+    update_congruences();
 
   con_sys.concatenate(y.congruences());
 
@@ -267,10 +267,8 @@ PPL::Grid::remove_space_dimensions(const Variables_Set& to_be_removed) {
     return;
   }
 
-  // Dimension-compatibility check: the variable having maximum space
-  // dimension is the one occurring last in the set.
-  const dimension_type
-    min_space_dim = to_be_removed.rbegin()->space_dimension();
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_removed.space_dimension();
   if (space_dim < min_space_dim)
     throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
 
@@ -292,9 +290,6 @@ PPL::Grid::remove_space_dimensions(const Variables_Set& to_be_removed) {
     return;
   }
 
-  // FIXME: Can this operate on the congruence system if only the
-  //        congruence system is up to date?
-
   gen_sys.remove_space_dimensions(to_be_removed);
 
   clear_congruences_up_to_date();
@@ -307,7 +302,7 @@ PPL::Grid::remove_space_dimensions(const Variables_Set& to_be_removed) {
 }
 
 void
-PPL::Grid::remove_higher_space_dimensions(dimension_type new_dimension) {
+PPL::Grid::remove_higher_space_dimensions(const dimension_type new_dimension) {
   // Dimension-compatibility check.
   if (new_dimension > space_dim)
     throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
@@ -321,8 +316,7 @@ PPL::Grid::remove_higher_space_dimensions(dimension_type new_dimension) {
     return;
   }
 
-  if (marked_empty()
-      || (!generators_are_up_to_date() && !update_generators())) {
+  if (is_empty()) {
     // Removing dimensions from the empty grid just updates the space
     // dimension.
     space_dim = new_dimension;
@@ -338,20 +332,57 @@ PPL::Grid::remove_higher_space_dimensions(dimension_type new_dimension) {
     return;
   }
 
-  gen_sys.remove_higher_space_dimensions(new_dimension);
-
-#if 0
-  // FIXME: Perhaps add something like remove_rows_and_columns(dims)
-  //        to Grid_Generator_System for this.
-  if (generators_are_minimized()) {
-    gen_sys.erase_to_end(new_dimension + 1);
+  // Favor the generators, as is done by is_empty().
+  if (generators_are_up_to_date()) {
+    gen_sys.remove_higher_space_dimensions(new_dimension);
+    if (generators_are_minimized()) {
+      // Count the actual number of rows that are now redundant.
+      dimension_type num_redundant = 0;
+      const dimension_type num_old_gs = space_dim - new_dimension;
+      for (dimension_type row = 0; row < num_old_gs; ++row)
+	dim_kinds[row] == GEN_VIRTUAL || ++num_redundant;
+      if (num_redundant > 0) {
+	// Chop zero rows from end of system, to keep minimal form.
+	gen_sys.erase_to_end(gen_sys.num_rows() - num_redundant);
+	gen_sys.unset_pending_rows();
+      }
+      dim_kinds.erase(dim_kinds.begin() + new_dimension + 1, dim_kinds.end());
+      // TODO: Consider if it is worth also preserving the congruences
+      //       if they are also in minimal form.
+    }
+    clear_congruences_up_to_date();
+    // Extend the zero dim false congruence system to the appropriate
+    // dimension and then swap it with `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_false());
+    // Extra 2 columns for inhomogeneous term and modulus.
+    cgs.increase_space_dimension(new_dimension + 2);
+    con_sys.swap(cgs);
+  }
+  else {
+    assert(congruences_are_minimized());
+    con_sys.remove_higher_space_dimensions(new_dimension);
+    // Count the actual number of rows that are now redundant.
+    dimension_type num_redundant = 0;
+    for (dimension_type row = space_dim; row > new_dimension; --row)
+      dim_kinds[row] == CON_VIRTUAL || ++num_redundant;
+    if (num_redundant > 0) {
+      dimension_type rows = con_sys.num_rows();
+      // Shuffle the remaining rows upwards.
+      for (dimension_type low = 0, high = num_redundant;
+	   high < rows;
+	   ++high, ++low)
+	std::swap(con_sys[low], con_sys[high]);
+      // Chop newly redundant rows from end of system, to keep minimal
+      // form.
+      con_sys.erase_to_end(rows - num_redundant);
+    }
     dim_kinds.erase(dim_kinds.begin() + new_dimension + 1, dim_kinds.end());
+    clear_generators_up_to_date();
+    // Replace gen_sys with an empty system of the right dimension.
+    // Extra 2 columns for inhomogeneous term and modulus.
+    Grid_Generator_System gs(new_dimension + 2);
+    gen_sys.swap(gs);
   }
-#else
-  clear_generators_minimized();
-#endif
-
-  clear_congruences_up_to_date();
 
   // Update the space dimension.
   space_dim = new_dimension;
@@ -361,7 +392,7 @@ PPL::Grid::remove_higher_space_dimensions(dimension_type new_dimension) {
 
 void
 PPL::Grid::expand_space_dimension(Variable var, dimension_type m) {
-  // FIXME: this implementation is _really_ an executable specification.
+  // TODO: this implementation is _really_ an executable specification.
 
   // `var' must be one of the dimensions of the vector space.
   if (var.space_dimension() > space_dim)
@@ -412,7 +443,7 @@ PPL::Grid::expand_space_dimension(Variable var, dimension_type m) {
 void
 PPL::Grid::fold_space_dimensions(const Variables_Set& to_be_folded,
 				 Variable var) {
-  // FIXME: this implementation is _really_ an executable specification.
+  // TODO: this implementation is _really_ an executable specification.
 
   // `var' should be one of the dimensions of the grid.
   if (var.space_dimension() > space_dim)
@@ -423,21 +454,29 @@ PPL::Grid::fold_space_dimensions(const Variables_Set& to_be_folded,
     return;
 
   // All variables in `to_be_folded' must be dimensions of the grid.
-  if (to_be_folded.rbegin()->space_dimension() > space_dim)
+  if (to_be_folded.space_dimension() > space_dim)
     throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
-				 "*tbf.rbegin()",
-				 *to_be_folded.rbegin());
+				 "tbf.space_dimension()",
+				 to_be_folded.space_dimension());
 
-  // Moreover, `var' must not occur in `to_be_folded'.
-  if (to_be_folded.find(var) != to_be_folded.end())
+  // Moreover, `var.id()' must not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
     throw_invalid_argument("fold_space_dimensions(tbf, v)",
 			   "v should not occur in tbf");
-
-  for (Variables_Set::const_iterator i = to_be_folded.begin(),
-	 tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
-    Grid copy = *this;
-    copy.affine_image(var, Linear_Expression(*i));
-    join_assign(copy);
+  // All of the affine images we are going to compute are not invertible,
+  // hence we will need to compute the grid generators of the polyhedron.
+  // Since we keep taking copies, make sure that a single conversion
+  // from congruences to grid generators is computed.
+  (void) grid_generators();
+  // Having grid generators, we now know if the grid is empty:
+  // in that case, folding is equivalent to just removing space dimensions.
+  if (!marked_empty()) {
+    for (Variables_Set::const_iterator i = to_be_folded.begin(),
+           tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+      Grid copy = *this;
+      copy.affine_image(var, Linear_Expression(Variable(*i)));
+      join_assign(copy);
+    }
   }
   remove_space_dimensions(to_be_folded);
   assert(OK());
diff --git a/src/Grid_conversion.cc b/src/Grid_conversion.cc
index 6137362..78c585c 100644
--- a/src/Grid_conversion.cc
+++ b/src/Grid_conversion.cc
@@ -1,11 +1,11 @@
 /* Grid class implementation: conversion().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,19 +20,13 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid.defs.hh"
 #include <cstddef>
 
 namespace Parma_Polyhedra_Library {
 
-#define TRACE(x)
-//#define TRACE(x) x
-
-TRACE(using std::endl);
-TRACE(using std::cerr);
-
 // X 0 0 0  upside down, so  x x x X
 // x X 0 0                   x x X 0
 // x x X 0                   x X 0 0
@@ -42,30 +36,32 @@ TRACE(using std::cerr);
 bool
 Grid::lower_triangular(const Congruence_System& sys,
 		       const Dimension_Kinds& dim_kinds) {
-  dimension_type num_cols = sys.num_columns() - 1;
-  dimension_type row = sys.num_rows();
+  const dimension_type num_columns = sys.num_columns() - 1;
 
   // Check for easy square failure case.
-  if (row > num_cols)
+  if (sys.num_rows() > num_columns)
     return false;
 
   // Check triangularity.
-  for (dimension_type dim = 0; dim < num_cols; ++dim) {
+
+  dimension_type row = 0;
+  for (dimension_type dim = num_columns; dim-- > 0; ) {
     if (dim_kinds[dim] == CON_VIRTUAL)
       continue;
-    const Congruence& cg = sys[--row];
+    const Congruence& cg = sys[row];
+    ++row;
     // Check diagonal.
     if (cg[dim] <= 0)
       return false;
     // Check elements following diagonal.
     dimension_type col = dim;
-    while (++col < num_cols)
+    while (++col < num_columns)
       if (cg[col] != 0)
 	return false;
   }
 
   // Check squareness.
-  return row == 0;
+  return row == sys.num_rows();
 }
 
 // X x x x
@@ -77,34 +73,34 @@ Grid::lower_triangular(const Congruence_System& sys,
 bool
 Grid::upper_triangular(const Grid_Generator_System& sys,
 		       const Dimension_Kinds& dim_kinds) {
-  dimension_type num_cols = sys.space_dimension() + 1;
-  dimension_type row = sys.num_generators();
+  dimension_type num_columns = sys.space_dimension() + 1;
+  dimension_type row = sys.num_rows();
 
   // Check for easy square fail case.
-  if (row > num_cols)
+  if (row > num_columns)
     return false;
 
   // Check triangularity.
-  while (num_cols > 0) {
-    --num_cols;
-    if (dim_kinds[num_cols] == GEN_VIRTUAL)
+  while (num_columns > 0) {
+    --num_columns;
+    if (dim_kinds[num_columns] == GEN_VIRTUAL)
       continue;
     const Grid_Generator& gen = sys[--row];
     // Check diagonal.
-    if (gen[num_cols] <= 0)
+    if (gen[num_columns] <= 0)
       return false;
     // Check elements preceding diagonal.
-    dimension_type col = num_cols;
+    dimension_type col = num_columns;
     while (col-- > 0)
       if (gen[col] != 0)
 	return false;
   }
 
   // Check for squareness.
-  return num_cols == row;
+  return num_columns == row;
 }
 
-inline void
+void
 Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
 		    Grid_Generator_System& dest, const dimension_type num_rows,
 		    const dimension_type num_dims) {
@@ -113,21 +109,21 @@ Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
 
   if (gen.is_line())
     // Multiply every element of the line.
-    for (dimension_type column = 0; column < num_dims; ++column)
+    for (dimension_type column = num_dims; column-- > 0; )
       gen[column] *= multiplier;
   else {
     assert(gen.is_parameter_or_point());
     // Multiply every element of every parameter.
-    for (dimension_type index = 0; index < num_rows; ++index) {
+    for (dimension_type index = num_rows; index-- > 0; ) {
       Grid_Generator& generator = dest[index];
       if (generator.is_parameter_or_point())
-	for (dimension_type column = 0; column < num_dims; ++column)
+	for (dimension_type column = num_dims; column-- > 0; )
 	  generator[column] *= multiplier;
     }
   }
 }
 
-inline void
+void
 Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg,
 		    Congruence_System& dest, const dimension_type num_rows,
 		    const dimension_type num_dims) {
@@ -136,69 +132,60 @@ Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg,
 
   if (cg.is_proper_congruence())
     // Multiply every element of every congruence.
-    for (dimension_type index = 0; index < num_rows; ++index) {
+    for (dimension_type index = num_rows; index-- > 0; ) {
       Congruence& congruence = dest[index];
       if (congruence.is_proper_congruence())
-	for (dimension_type column = 0; column < num_dims; ++column)
+	for (dimension_type column = num_dims; column-- > 0; )
 	  congruence[column] *= multiplier;
     }
   else {
     assert(cg.is_equality());
     // Multiply every element of the equality.
-    for (dimension_type column = 0; column < num_dims; ++column)
+    for (dimension_type column = num_dims; column-- > 0; )
       cg[column] *= multiplier;
   }
 }
 
-// TODO: Rename the next two methods to convert and this file
+// TODO: Rename the next two methods to convert and this file to
 //       Grid_convert.cc (and equivalently for Polyhedron) to use
 //       verbs consistently as function and method names.
 
 void
 Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
 		 Dimension_Kinds& dim_kinds) {
-  TRACE(cerr << "============= convert gs to cgs" << endl);
-  TRACE(cerr << "source:" << endl);
-  TRACE(source.ascii_dump(cerr));
-  TRACE(cerr << "dest:" << endl);
-  TRACE(dest.ascii_dump(cerr));
-  trace_dim_kinds("gs to cgs ", dim_kinds);
-
   // Quite similar to the congruence to generator version below.
   // Changes here may be needed there too.
 
   assert(upper_triangular(source, dim_kinds));
 
-  // Initialise matrix row number counters and compute the LCM of the
+  // Initialize matrix row number counters and compute the LCM of the
   // diagonal entries of the parameters in `source'.
   //
-  // The top-down order of the parameter system rows corresponds to
-  // the left-right order of the dimensions.
-  dimension_type source_num_rows = 0;
-  // The congruence system rows have a bottom-up ordering.
+  // The top-down order of the generator system rows corresponds to
+  // the left-right order of the dimensions, while the congruence
+  // system rows have a bottom-up ordering.
   dimension_type dest_num_rows = 0;
   TEMP_INTEGER(diagonal_lcm);
   diagonal_lcm = 1;
   const dimension_type dims = source.space_dimension() + 1;
-  for (dimension_type dim = 0; dim < dims; ++dim)
+  dimension_type source_index = source.num_rows();
+  for (dimension_type dim = dims; dim-- > 0; )
     if (dim_kinds[dim] == GEN_VIRTUAL)
       // Virtual generators map to equalities.
       ++dest_num_rows;
     else {
+      --source_index;
       if (dim_kinds[dim] == PARAMETER) {
-	// Dimension `dim' has a parameter row at `source_num_rows' in
+	// Dimension `dim' has a parameter row at `source_index' in
 	// `source', so include in `diagonal_lcm' the `dim'th element
 	// of that row.
-	lcm_assign(diagonal_lcm, diagonal_lcm, source[source_num_rows][dim]);
+	lcm_assign(diagonal_lcm, diagonal_lcm, source[source_index][dim]);
 	// Parameters map to proper congruences.
 	++dest_num_rows;
       }
       // Lines map to virtual congruences.
-      ++source_num_rows;
     }
-  TRACE(cerr << "diagonal_lcm: " << diagonal_lcm << endl);
-  TRACE(cerr << "source_num_rows: " << source_num_rows << endl);
-  TRACE(cerr << "dest_num_rows: " << dest_num_rows << endl);
+  assert(source_index == 0);
 
   // `source' must be regular.
   if (diagonal_lcm == 0)
@@ -210,41 +197,36 @@ Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
   // In `dest' initialize row types and elements, including setting
   // the diagonal elements to the inverse ratio of the `source'
   // diagonal elements.
-  dimension_type source_index = 0, dest_index = dest_num_rows - 1;
-  for (dimension_type dim = 0; dim < dims; ++dim) {
-    TRACE(cerr << "init dim " << dim << endl);
-    if (dim_kinds[dim] == LINE) {
-      TRACE(cerr << "  line" << endl);
-      ++source_index;
-    }
+  dimension_type dest_index = 0;
+  source_index = source.num_rows();
+  for (dimension_type dim = dims; dim-- > 0; ) {
+    if (dim_kinds[dim] == LINE)
+      --source_index;
     else {
       Congruence& cg = dest[dest_index];
-      for (dimension_type j = 0; j < dim; j++)
+      for (dimension_type j = dim; j-- > 0; )
 	cg[j] = 0;
-      for (dimension_type j = dim + 1; j < dims; j++)
+      for (dimension_type j = dim + 1; j < dims; ++j)
 	cg[j] = 0;
 
       if (dim_kinds[dim] == GEN_VIRTUAL) {
-	TRACE(cerr << "  gen_virtual" << endl);
 	cg[dims] = 0;		// An equality.
 	cg[dim] = 1;
       }
       else {
 	assert(dim_kinds[dim] == PARAMETER);
-	TRACE(cerr << "  parameter" << endl);
+	--source_index;
 	cg[dims] = 1;		// A proper congruence.
-	cg[dim] = diagonal_lcm / source[source_index][dim];
-	++source_index;
+	exact_div_assign(cg[dim], diagonal_lcm, source[source_index][dim]);
       }
-      --dest_index;
+      ++dest_index;
     }
   }
 
+  assert(source_index == 0);
+  assert(dest_index == dest_num_rows);
   assert(lower_triangular(dest, dim_kinds));
 
-  TRACE(cerr << "dest after init:" << endl);
-  TRACE(dest.ascii_dump(cerr));
-
   // Convert.
   //
   // `source_index' and `dest_index' hold the positions of pivot rows
@@ -252,37 +234,30 @@ Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
   // reverse of the order in `source', so the rows are iterated from
   // last to first (index 0) in `source' and from first to last in
   // `dest'.
-  source_index = source_num_rows;
+  source_index = source.num_rows();
   dest_index = 0;
+  TEMP_INTEGER(multiplier);
 
   for (dimension_type dim = dims; dim-- > 0; ) {
-    TRACE(cerr << "dim: " << dim << endl);
-
     if (dim_kinds[dim] != GEN_VIRTUAL) {
       --source_index;
-      TEMP_INTEGER(source_dim);
-      source_dim = source[source_index][dim];
+      const Coefficient& source_dim = source[source_index][dim];
 
       // In the rows in `dest' above `dest_index' divide each element
       // at column `dim' by `source_dim'.
       for (dimension_type row = dest_index; row-- > 0; ) {
-	TRACE(cerr << "  row " << row << endl);
-	TRACE(dest.ascii_dump(cerr));
-
 	Congruence& cg = dest[row];
 
 	// Multiply the representation of `dest' such that entry `dim'
         // of `g' is a multiple of `source_dim'.  This ensures that
         // the result of the division that follows is a whole number.
-	TEMP_INTEGER(multiplier);
 	gcd_assign(multiplier, cg[dim], source_dim);
-	multiplier = source_dim / multiplier;
+	exact_div_assign(multiplier, source_dim, multiplier);
 	multiply_grid(multiplier, cg, dest, dest_num_rows, dims);
 
-	cg[dim] /= source_dim;
+	Coefficient& cg_dim = cg[dim];
+	exact_div_assign(cg_dim, cg_dim, source_dim);
       }
-      TRACE(cerr << "dest after dividing grid:" << endl);
-      TRACE(dest.ascii_dump(cerr));
     }
 
     // Invert and transpose the source row at `source_index' into the
@@ -291,48 +266,37 @@ Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
     // Consider each dimension `dim_prec' that precedes `dim', as the
     // rows in `dest' that follow `dim_index' have zeroes at index
     // `dim'.
-    dimension_type tem_source_index = source_index;
+    dimension_type tmp_source_index = source_index;
     if (dim_kinds[dim] != LINE)
       ++dest_index;
     for (dimension_type dim_prec = dim; dim_prec-- > 0; ) {
-      TRACE(cerr << "  dim_prec: " << dim_prec);
-      TRACE(cerr << "  dest_index: " << dest_index);
-      TRACE(cerr << "  tem_source_index: " << tem_source_index << endl);
       if (dim_kinds[dim_prec] != GEN_VIRTUAL) {
-	--tem_source_index;
-	TEMP_INTEGER(source_dim);
-	source_dim = source[tem_source_index][dim];
-	TRACE(cerr << "  rows:" << endl);
+	--tmp_source_index;
+	const Coefficient& source_dim = source[tmp_source_index][dim];
 	// In order to compute the transpose of the inverse of
-	// `source', subtract source[tem_source_index][dim] times the
+	// `source', subtract source[tmp_source_index][dim] times the
 	// column vector in `dest' at `dim' from the column vector in
 	// `dest' at `dim_prec'.
 	//
 	// I.e., for each row `dest_index' in `dest' that is above the
-	// row `dest_index', subtract dest[tem_source_index][dim]
+	// row `dest_index', subtract dest[tmp_source_index][dim]
 	// times the entry `dim' from the entry at `dim_prec'.
 	for (dimension_type row = dest_index; row-- > 0; ) {
 	  assert(row < dest_num_rows);
-	  TRACE(cerr << "       " << row << endl);
 	  Congruence& cg = dest[row];
-	  cg[dim_prec] -= source_dim * cg[dim];
+	  sub_mul_assign(cg[dim_prec], source_dim, cg[dim]);
 	}
       }
     }
-
-    TRACE(cerr << "dest after processing preceding rows:" << endl);
-    TRACE(dest.ascii_dump(cerr));
   }
   // Set the modulus in every congruence.
-  Coefficient_traits::const_reference modulus = dest[dest_num_rows - 1][0];
-  for (dimension_type row = 0; row < dest_num_rows; ++row) {
+  const Coefficient& modulus = dest[dest_num_rows - 1][0];
+  for (dimension_type row = dest_num_rows; row-- > 0; ) {
     Congruence& cg = dest[row];
     if (cg[dims] > 0)
       // `cg' is a proper congruence.
       cg[dims] = modulus;
   }
-  TRACE(cerr << "dest after setting moduli:" << endl);
-  TRACE(dest.ascii_dump(cerr));
 
   assert(lower_triangular(dest, dim_kinds));
 
@@ -342,31 +306,18 @@ Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
       // Factor the "diagonal" congruence out of the preceding rows.
       reduce_reduced<Congruence_System, Congruence>
 	(dest, dim, i++, 0, dim, dim_kinds, false);
-  TRACE(cerr << "dest after strong reduction:" << endl);
-  TRACE(dest.ascii_dump(cerr));
 #endif
-
-  trace_dim_kinds("gs to cgs end ", dim_kinds);
-
-  TRACE(cerr << "------------------- gs to cgs conversion done." << endl);
 }
 
 void
 Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
 		 Dimension_Kinds& dim_kinds) {
-  TRACE(cerr << "============= convert cgs to gs" << endl);
-  TRACE(cerr << "source:" << endl);
-  TRACE(source.ascii_dump(cerr));
-  TRACE(cerr << "dest:" << endl);
-  TRACE(dest.ascii_dump(cerr));
-  trace_dim_kinds("cgs to gs ", dim_kinds);
-
   // Quite similar to the generator to congruence version above.
   // Changes here may be needed there too.
 
   assert(lower_triangular(source, dim_kinds));
 
-  // Initialise matrix row number counters and compute the LCM of the
+  // Initialize matrix row number counters and compute the LCM of the
   // diagonal entries of the proper congruences in `source'.
   dimension_type source_num_rows = 0, dest_num_rows = 0;
   TEMP_INTEGER(diagonal_lcm);
@@ -388,9 +339,6 @@ Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
       // Equalities map to virtual generators.
       ++source_num_rows;
     }
-  TRACE(cerr << "diagonal_lcm: " << diagonal_lcm << endl);
-  TRACE(cerr << "source_num_rows: " << source_num_rows << endl);
-  TRACE(cerr << "dest_num_rows: " << dest_num_rows << endl);
 
   // `source' must be regular.
   if (diagonal_lcm == 0)
@@ -410,28 +358,24 @@ Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
   // The generator system has a bottom-up ordering.
   dimension_type dest_index = dest_num_rows - 1;
   for (dimension_type dim = dims; dim-- > 0; ) {
-    TRACE(cerr << "init dim " << dim << endl);
     if (dim_kinds[dim] == EQUALITY) {
-      TRACE(cerr << "  equality" << endl);
       ++source_index;
     }
     else {
       Grid_Generator& g = dest[dest_index];
-      for (dimension_type j = 0; j < dim; ++j)
+      for (dimension_type j = dim; j-- > 0; )
 	g[j] = 0;
       for (dimension_type j = dim + 1; j < dims; ++j)
 	g[j] = 0;
 
       if (dim_kinds[dim] == CON_VIRTUAL) {
-	TRACE(cerr << "  con_virtual" << endl);
 	g.set_is_line();
 	g[dim] = 1;
       }
       else {
 	assert(dim_kinds[dim] == PROPER_CONGRUENCE);
-	TRACE(cerr << "  proper_congruence" << endl);
 	g.set_is_parameter_or_point();
-	g[dim] = diagonal_lcm / source[source_index][dim];
+	exact_div_assign(g[dim], diagonal_lcm, source[source_index][dim]);
 	++source_index;
       }
       --dest_index;
@@ -440,9 +384,6 @@ Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
 
   assert(upper_triangular(dest, dim_kinds));
 
-  TRACE(cerr << "dest after init:" << endl);
-  TRACE(dest.ascii_dump(cerr));
-
   // Convert.
   //
   // `source_index' and `dest_index' hold the positions of pivot rows
@@ -452,36 +393,29 @@ Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
   // `dest'.
   source_index = source_num_rows;
   dest_index = 0;
+  TEMP_INTEGER(reduced_source_dim);
 
   for (dimension_type dim = 0; dim < dims; ++dim) {
-    TRACE(cerr << "dim: " << dim << endl);
-
     if (dim_kinds[dim] != CON_VIRTUAL) {
       --source_index;
-      TEMP_INTEGER(source_dim);
-      source_dim = source[source_index][dim];
+      const Coefficient& source_dim = source[source_index][dim];
 
       // In the rows in `dest' above `dest_index' divide each element
       // at column `dim' by `source_dim'.
       for (dimension_type row = dest_index; row-- > 0; ) {
-	TRACE(cerr << "  row " << row << endl);
-	TRACE(dest.ascii_dump(cerr));
-
 	Grid_Generator& g = dest[row];
 
 	// Multiply the representation of `dest' such that entry `dim'
         // of `g' is a multiple of `source_dim'.  This ensures that
         // the result of the division that follows is a whole number.
-	TEMP_INTEGER(red_source_dim);
-	gcd_assign(red_source_dim, g[dim], source_dim);
-	red_source_dim = source_dim / red_source_dim;
-	multiply_grid(red_source_dim, g, dest, dest_num_rows,
+	gcd_assign(reduced_source_dim, g[dim], source_dim);
+	exact_div_assign(reduced_source_dim, source_dim, reduced_source_dim);
+	multiply_grid(reduced_source_dim, g, dest, dest_num_rows,
 		      dims + 1 /* parameter divisor */);
 
-	g[dim] /= source_dim;
+	Coefficient& g_dim = g[dim];
+	exact_div_assign(g_dim, g_dim, source_dim);
       }
-      TRACE(cerr << "dest after dividing grid:" << endl);
-      TRACE(dest.ascii_dump(cerr));
     }
 
     // Invert and transpose the source row at `source_index' into the
@@ -490,36 +424,28 @@ Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
     // Consider each dimension `dim_fol' that follows `dim', as the
     // rows in `dest' that follow row `dest_index' are zero at index
     // `dim'.
-    dimension_type tem_source_index = source_index;
+    dimension_type tmp_source_index = source_index;
     if (dim_kinds[dim] != EQUALITY)
       ++dest_index;
     for (dimension_type dim_fol = dim + 1; dim_fol < dims; ++dim_fol) {
-      TRACE(cerr << "  dim_fol: " << dim_fol);
-      TRACE(cerr << "  dest_index: " << dest_index);
-      TRACE(cerr << "  tem_source_index: " << tem_source_index << endl);
       if (dim_kinds[dim_fol] != CON_VIRTUAL) {
-	--tem_source_index;
-	TEMP_INTEGER(source_dim);
-	source_dim = source[tem_source_index][dim];
-	TRACE(cerr << "  rows:" << endl);
+	--tmp_source_index;
+	const Coefficient& source_dim = source[tmp_source_index][dim];
 	// In order to compute the transpose of the inverse of
-	// `source', subtract source[tem_source_index][dim] times the
+	// `source', subtract source[tmp_source_index][dim] times the
 	// column vector in `dest' at `dim' from the column vector in
 	// `dest' at `dim_fol'.
 	//
 	// I.e., for each row `dest_index' in `dest' that is above the
-	// row `dest_index', subtract dest[tem_source_index][dim]
+	// row `dest_index', subtract dest[tmp_source_index][dim]
 	// times the entry `dim' from the entry at `dim_fol'.
 	for (dimension_type row = dest_index; row-- > 0; ) {
 	  assert(row < dest_num_rows);
-	  TRACE(cerr << "       " << row << endl);
 	  Grid_Generator& g = dest[row];
-	  g[dim_fol] -= source_dim * g[dim];
+	  sub_mul_assign(g[dim_fol], source_dim, g[dim]);
 	}
       }
     }
-    TRACE(cerr << "dest after processing preceding rows:" << endl);
-    TRACE(dest.ascii_dump(cerr));
   }
 
   assert(upper_triangular(dest, dim_kinds));
@@ -530,30 +456,21 @@ Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
       // Factor the "diagonal" generator out of the preceding rows.
       reduce_reduced<Grid_Generator_System, Grid_Generator>
 	(dest, dim, i++, dim, dims - 1, dim_kinds);
-  TRACE(cerr << "dest after strong reduction:" << endl);
-  TRACE(dest.ascii_dump(cerr));
 #endif
 
   // Ensure that the parameter divisors are the same as the divisor of
   // the point.
-  Coefficient_traits::const_reference system_divisor = dest[0][0];
-  for (dimension_type row = 1, dim = 1; dim < dims; ++dim)
+  const Coefficient& system_divisor = dest[0][0];
+  for (dimension_type row = dest.num_rows() - 1, dim = dims;
+       dim-- > 1; )
     switch (dim_kinds[dim]) {
     case PARAMETER:
-      dest[row].divisor() = system_divisor;
+      dest[row].set_divisor(system_divisor);
     case LINE:
-      ++row;
+      --row;
     case GEN_VIRTUAL:
       break;
     }
-  TRACE(cerr << "dest after updating param divisors:" << endl);
-  TRACE(dest.ascii_dump(cerr));
-
-  trace_dim_kinds("cgs to gs end ", dim_kinds);
-
-  TRACE(cerr << "------------------- cgs to gs conversion done." << endl);
 }
 
-#undef TRACE
-
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_nonpublic.cc b/src/Grid_nonpublic.cc
index 66a8a7e..3a8f894 100644
--- a/src/Grid_nonpublic.cc
+++ b/src/Grid_nonpublic.cc
@@ -1,12 +1,12 @@
 /* Grid class implementation
    (non-inline private or protected functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid.defs.hh"
 #include "Grid_Generator.defs.hh"
@@ -42,18 +42,73 @@ site: http://www.cs.unipr.it/ppl/ . */
   we collect enough information to decide which is the better
   implementation alternative.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 #define BE_LAZY 1
 
 namespace PPL = Parma_Polyhedra_Library;
 
 void
-PPL::Grid::construct(const Congruence_System& ccgs) {
-  // Protecting against space dimension overflow is up to the caller.
-  assert(ccgs.space_dimension() <= max_space_dimension());
+PPL::Grid::construct(dimension_type num_dimensions,
+		     const Degenerate_Element kind) {
+  space_dim = num_dimensions;
+
+  if (kind == EMPTY) {
+    // Set emptiness directly instead of with set_empty, as gen_sys is
+    // already correctly initialized.
+
+    status.set_empty();
+
+    // Extend the zero dim false congruence system to the appropriate
+    // dimension and then store it in `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_false());
+    cgs.increase_space_dimension(space_dim);
+    const_cast<Congruence_System&>(con_sys).swap(cgs);
+
+    assert(OK());
+    return;
+  }
+
+  if (num_dimensions > 0) {
+    con_sys.increase_space_dimension(num_dimensions);
+
+    // Initialize both systems to universe representations.
+
+    set_congruences_minimized();
+    set_generators_minimized();
+    dim_kinds.resize(num_dimensions + 1);
+
+    // Extend the zero dim integrality congruence system to the
+    // appropriate dimension and then store it in `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_integrality());
+    cgs.increase_space_dimension(space_dim);
+    cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
+    con_sys.swap(cgs);
+
+    dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */;
+
+    // Trivially true point.
+    gen_sys.insert(grid_point(0*(Variable(0))));
 
-  // TODO: this implementation is just an executable specification.
-  Congruence_System cgs = ccgs;
+    // A line for each dimension.
+    dimension_type dim = 0;
+    while (dim < num_dimensions) {
+      gen_sys.insert(grid_line(Variable(dim)));
+      dim_kinds[++dim] = CON_VIRTUAL /* a.k.a. LINE */;
+    }
+  }
+  else
+    set_zero_dim_univ();
+}
+
+void
+PPL::Grid::construct(Congruence_System& cgs) {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(cgs.space_dimension() <= max_space_dimension());
+  // Preparing con_sys and gen_sys is up to the caller.
+  assert(cgs.space_dimension() == con_sys.space_dimension());
+  assert(cgs.space_dimension() == gen_sys.space_dimension());
+  assert(con_sys.has_no_rows());
+  assert(gen_sys.has_no_rows());
 
   // Set the space dimension.
   space_dim = cgs.space_dimension();
@@ -71,53 +126,53 @@ PPL::Grid::construct(const Congruence_System& ccgs) {
       for (dimension_type i = cgs.num_rows(); i-- > 0; )
 	if (cgs[i].is_trivial_false()) {
 	  // Inconsistent congruence found: the grid is empty.
-	  // FIXME: Initialize con_sys to the correct dimension in the
-	  //        caller constructors, and copy the necessary parts
-	  //        of set_empty into here.
-	  set_empty();
+	  status.set_empty();
+	  // Insert the zero dim false congruence system into `con_sys'.
+	  // `gen_sys' is already in empty form.
+	  con_sys.insert(Congruence::zero_dim_false());
 	  assert(OK());
 	  return;
 	}
     set_zero_dim_univ();
   }
-
   assert(OK());
 }
 
 void
-PPL::Grid::construct(const Grid_Generator_System& const_gs) {
+PPL::Grid::construct(Grid_Generator_System& ggs) {
   // Protecting against space dimension overflow is up to the caller.
-  assert(const_gs.space_dimension() <= max_space_dimension());
-
-  // TODO: this implementation is just an executable specification.
-  Grid_Generator_System gs = const_gs;
+  assert(ggs.space_dimension() <= max_space_dimension());
+  // Preparing con_sys and gen_sys is up to the caller.
+  assert(ggs.space_dimension() == con_sys.space_dimension());
+  assert(ggs.space_dimension() == gen_sys.space_dimension());
+  assert(con_sys.has_no_rows());
+  assert(gen_sys.has_no_rows());
 
   // Set the space dimension.
-  space_dim = gs.space_dimension();
+  space_dim = ggs.space_dimension();
 
   // An empty set of generators defines the empty grid.
-  if (gs.num_generators() == 0) {
-    // FIXME: Initialize gen_sys to the correct dimension in the
-    //        caller constructors, and copy the necessary parts of
-    //        set_empty into here.
-    set_empty();
+  if (ggs.has_no_rows()) {
+    status.set_empty();
+    // Insert the zero dim false congruence system into `con_sys'.
+    // `gen_sys' is already in empty form.
+    con_sys.insert(Congruence::zero_dim_false());
     return;
   }
 
   // Non-empty valid generator systems have a supporting point, at least.
-  if (!gs.has_points())
-    throw_invalid_generators("Grid(const_gs)", "gs");
+  if (!ggs.has_points())
+    throw_invalid_generators("Grid(ggs)", "ggs");
 
-  if (space_dim > 0) {
-    // Steal the rows from `gs'.
-    std::swap(gen_sys, gs);
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Steal the rows from `ggs'.
+    std::swap(gen_sys, ggs);
     normalize_divisors(gen_sys);
-
     // Generators are now up-to-date.
     set_generators_up_to_date();
   }
-  else
-    set_zero_dim_univ();
 
   assert(OK());
 }
@@ -149,7 +204,7 @@ PPL::Grid::quick_equivalence_test(const Grid& y) const {
   if (x.generators_are_minimized() && y.generators_are_minimized()) {
     // Equivalent minimized generator systems have:
     //  - the same number of generators; ...
-    if (x.gen_sys.num_generators() != y.gen_sys.num_generators())
+    if (x.gen_sys.num_rows() != y.gen_sys.num_rows())
       return Grid::TVB_FALSE;
     //  - the same number of lines; ...
     const dimension_type x_num_lines = x.gen_sys.num_lines();
@@ -168,11 +223,12 @@ PPL::Grid::quick_equivalence_test(const Grid& y) const {
   // TODO: Consider minimizing the systems and re-performing these
   //       checks.
 
-  if (css_normalized)
+  if (css_normalized) {
     if (x.con_sys == y.con_sys)
       return Grid::TVB_TRUE;
     else
       return Grid::TVB_FALSE;
+  }
 
   return Grid::TVB_DONT_KNOW;
 }
@@ -189,12 +245,14 @@ PPL::Grid::is_included_in(const Grid& y) const {
   if (!x.generators_are_up_to_date() && !x.update_generators())
     // Updating found `x' empty.
     return true;
-  y.congruences_are_up_to_date() || y.update_congruences();
+  if (!y.congruences_are_up_to_date())
+    y.update_congruences();
 #else
   if (!x.generators_are_minimized() && !x.minimize())
     // Minimizing found `x' empty.
     return true;
-  y.congruences_are_minimized() || y.minimize();
+  if (!y.congruences_are_minimized())
+    y.minimize();
 #endif
 
   assert(x.OK());
@@ -203,7 +261,7 @@ PPL::Grid::is_included_in(const Grid& y) const {
   const Grid_Generator_System& gs = x.gen_sys;
   const Congruence_System& cgs = y.con_sys;
 
-  dimension_type num_rows = gs.num_generators();
+  dimension_type num_rows = gs.num_rows();
   for (dimension_type i = num_rows; i-- > 0; )
     if (!cgs.satisfies_all_congruences(gs[i]))
       return false;
@@ -226,7 +284,7 @@ PPL::Grid::bounds(const Linear_Expression& expr,
     return true;
 
   // The generators are up to date.
-  for (dimension_type i = gen_sys.num_generators(); i-- > 0; ) {
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
     const Grid_Generator& g = gen_sys[i];
     // Only lines and parameters in `*this' can cause `expr' to be
     // unbounded.
@@ -242,9 +300,9 @@ PPL::Grid::bounds(const Linear_Expression& expr,
 
 bool
 PPL::Grid::max_min(const Linear_Expression& expr,
-		   char* method_call,
+		   const char* method_call,
 		   Coefficient& ext_n, Coefficient& ext_d, bool& included,
-		   Grid_Generator* point) const {
+		   Generator* point) const {
   if (bounds(expr, method_call)) {
     if (marked_empty())
       return false;
@@ -253,9 +311,10 @@ PPL::Grid::max_min(const Linear_Expression& expr,
       ext_d = 1;
       included = true;
       if (point)
-	*point = Grid_Generator::point();
+	*point = Generator::point();
       return true;
     }
+    // Grid::bounds above ensures the generators are up to date.
     if (!generators_are_minimized()) {
       // Minimize the generator system.
       Grid& gr = const_cast<Grid&>(*this);
@@ -275,8 +334,10 @@ PPL::Grid::max_min(const Linear_Expression& expr,
 
     included = true;
     if (point) {
-      *point = gen;
-      point->strong_normalize();
+      Linear_Expression e;
+      for (dimension_type i = space_dim; i-- > 0; )
+	e += gen.coefficient(Variable(i)) * Variable(i);
+      *point = Generator::point(e, gen.divisor());
     }
     return true;
   }
@@ -289,7 +350,7 @@ PPL::Grid::set_zero_dim_univ() {
   space_dim = 0;
   con_sys.clear();
   gen_sys.clear();
-  gen_sys.insert(Grid_Generator::point());
+  gen_sys.insert(grid_point());
 }
 
 void
@@ -307,12 +368,12 @@ PPL::Grid::set_empty() {
   const_cast<Congruence_System&>(con_sys).swap(cgs);
 }
 
-bool
+void
 PPL::Grid::update_congruences() const {
   // The caller must ensure that the generators are up to date.
   assert(space_dim > 0);
   assert(!marked_empty());
-  assert(gen_sys.num_generators() > 0);
+  assert(!gen_sys.has_no_rows());
   assert(gen_sys.space_dimension() > 0);
 
   Grid& gr = const_cast<Grid&>(*this);
@@ -321,8 +382,8 @@ PPL::Grid::update_congruences() const {
     gr.simplify(gr.gen_sys, gr.dim_kinds);
 
   // `gen_sys' contained rows before being reduced, so it should
-  // contain at least a single point afterwards.
-  assert(gen_sys.num_generators() > 0);
+  // contain at least a single point afterward.
+  assert(!gen_sys.has_no_rows());
 
   // Populate `con_sys' with congruences characterizing the grid
   // described by `gen_sys'.
@@ -331,7 +392,6 @@ PPL::Grid::update_congruences() const {
   // Both systems are minimized.
   gr.set_congruences_minimized();
   gr.set_generators_minimized();
-  return true;
 }
 
 bool
@@ -418,63 +478,77 @@ PPL::Grid::minimize() const {
 void
 PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
 			      Grid_Generator_System& gen_sys) {
+#ifndef NDEBUG
+  const dimension_type num_rows = gen_sys.num_rows();
+#endif
+  assert(num_rows > 0);
+
+  // Find the first point in gen_sys.
   dimension_type row = 0;
-  dimension_type num_rows = gen_sys.num_generators();
-  // Find first point in gen_sys.
-  while (gen_sys[row].is_line_or_parameter())
-    if (++row == num_rows)
-      // All rows are lines or parameters; generators should always
-      // contain a point.
-      throw std::runtime_error("PPL::Grid::normalize_divisors(sys, gen_sys).");
+  while (gen_sys[row].is_line_or_parameter()) {
+    ++row;
+    // gen_sys should have at least one point.
+    assert(row < num_rows);
+  }
   Grid_Generator& first_point = gen_sys[row];
-  Coefficient_traits::const_reference gen_sys_divisor = first_point.divisor();
-  Coefficient divisor = normalize_divisors(sys, gen_sys_divisor);
+  const Coefficient& gen_sys_divisor = first_point.divisor();
+
+#ifndef NDEBUG
+  // Check that the divisors in gen_sys are equal.
+  for (dimension_type i = row + 1; i < num_rows; ++i) {
+    Grid_Generator& g = gen_sys[i];
+    if (g.is_parameter_or_point())
+      assert(gen_sys_divisor == g.divisor());
+  }
+#endif // !defined(NDEBUG)
+
+  TEMP_INTEGER(divisor);
+  divisor = gen_sys_divisor;
+  // Adjust sys to include the gen_sys divisor.
+  normalize_divisors(sys, divisor);
   if (divisor != gen_sys_divisor)
-    // The divisors of the points in gen_sys are always the same, so
-    // the new divisor will be the LCM of this value and `divisor',
-    // hence the third argument.
+    // Adjust gen_sys to use the new divisor.
+    //
+    // The points and parameters in gen_sys share a common divisor
+    // value, so the new divisor will be the LCM of this common
+    // divisor and `divisor', hence the third argument.
     normalize_divisors(gen_sys, divisor, &first_point);
 }
 
-PPL::Coefficient
+void
 PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
-			      Coefficient_traits::const_reference divisor,
-			      Grid_Generator* first_point) {
+			      Coefficient& divisor,
+			      const Grid_Generator* first_point) {
   assert(divisor >= 0);
   if (sys.space_dimension() > 0 && divisor > 0) {
-    TEMP_INTEGER(lcm);
-    lcm = divisor;
-
     dimension_type row = 0;
-    dimension_type num_rows = sys.num_generators();
+    dimension_type num_rows = sys.num_rows();
 
     if (first_point)
-      lcm_assign(lcm, lcm, (*first_point).divisor());
+      lcm_assign(divisor, divisor, (*first_point).divisor());
     else {
+      assert(num_rows > 0);
       // Move to the first point or parameter.
       while (sys[row].is_line())
 	if (++row == num_rows)
 	  // All rows are lines.
-	  return divisor;
+	  return;
 
-      // Calculate the LCM of `divisor' and the divisor of every
-      // point or parameter.
+      // Calculate the LCM of the given divisor and the divisor of
+      // every point or parameter.
       while (row < num_rows) {
-	Grid_Generator& g = sys[row];
+	const Grid_Generator& g = sys[row];
 	if (g.is_parameter_or_point())
-	  lcm_assign(lcm, lcm, g.divisor());
+	  lcm_assign(divisor, divisor, g.divisor());
 	++row;
       }
     }
 
-    // Represent every point and every parameter using the LCM as the
-    // divisor.
-    for (dimension_type row = 0; row < num_rows; ++row)
-      sys[row].scale_to_divisor(lcm);
-
-    return lcm;
+    // Represent every point and every parameter using the newly
+    // calculated divisor.
+    for (row = num_rows; row-- > 0; )
+      sys[row].scale_to_divisor(divisor);
   }
-  return divisor;
 }
 
 void
@@ -541,6 +615,13 @@ PPL::Grid::throw_dimension_incompatible(const char* method,
 
 void
 PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* g_name,
+					const Generator& g) const {
+  throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
 					const char* cgs_name,
 					const Congruence_System& cgs) const {
   throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
diff --git a/src/Grid_public.cc b/src/Grid_public.cc
index 7afe635..cf985d4 100644
--- a/src/Grid_public.cc
+++ b/src/Grid_public.cc
@@ -1,11 +1,11 @@
 /* Grid class implementation (non-inline public functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid.defs.hh"
 #include "Topology.hh"
@@ -31,69 +31,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace PPL = Parma_Polyhedra_Library;
 
-PPL::Grid::Grid(dimension_type num_dimensions,
-		const Degenerate_Element kind)
-  : con_sys(),
-    gen_sys(num_dimensions > max_space_dimension()
-	    ? (throw_space_dimension_overflow("Grid(n, k)",
-					      "n exceeds the maximum "
-					      "allowed space dimension"),
-	       0)
-	    : num_dimensions) {
-
-  space_dim = num_dimensions;
-
-  if (kind == EMPTY) {
-    // Set emptiness directly instead of with set_empty, as gen_sys is
-    // already correctly initialized.
-
-    status.set_empty();
-
-    // Extend the zero dim false congruence system to the appropriate
-    // dimension and then store it in `con_sys'.
-    Congruence_System cgs(Congruence::zero_dim_false());
-    cgs.increase_space_dimension(space_dim);
-    const_cast<Congruence_System&>(con_sys).swap(cgs);
-
-    assert(OK());
-    return;
-  }
-
-  if (num_dimensions > 0) {
-    con_sys.increase_space_dimension(num_dimensions);
-
-    // Initialise both systems to universe representations.
-
-    set_congruences_minimized();
-    set_generators_minimized();
-    dim_kinds.resize(num_dimensions + 1);
-
-    // Extend the zero dim integrality congruence system to the
-    // appropriate dimension and then store it in `con_sys'.
-    Congruence_System cgs(Congruence::zero_dim_integrality());
-    cgs.increase_space_dimension(space_dim);
-    cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
-    con_sys.swap(cgs);
+// TODO: In the Grid constructors adapt and use the given system if it
+//       is modifiable, instead of using a copy.
 
-    dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */;
-
-    // Trivially true point.
-    gen_sys.insert(grid_point(0*(Variable(0))));
-
-    // A line for each dimension.
-    dimension_type dim = 0;
-    while (dim < num_dimensions) {
-      gen_sys.insert(grid_line(Variable(dim++)));
-      dim_kinds[dim] = CON_VIRTUAL /* a.k.a. LINE */;
-    }
-  }
-  else
-    set_zero_dim_univ();
-
-  assert(OK());
-}
-
-PPL::Grid::Grid(const Grid& y)
+PPL::Grid::Grid(const Grid& y, Complexity_Class)
   : con_sys(),
     gen_sys(),
     status(y.status),
@@ -115,37 +56,181 @@ PPL::Grid::Grid(const Grid& y)
   }
 }
 
-PPL::Grid::Grid(const Constraint_System& ccs) {
-  if (ccs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(ccs)",
-				   "the space dimension of ccs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
+PPL::Grid::Grid(const Constraint_System& ccs)
+  : con_sys(ccs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(ccs)",
+					     "the space dimension of ccs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : ccs.space_dimension()),
+    gen_sys(ccs.space_dimension()) {
+  space_dim = ccs.space_dimension();
+
+  if (space_dim == 0) {
+    // See if an inconsistent constraint has been passed.
+    for (Constraint_System::const_iterator i = ccs.begin(),
+         ccs_end = ccs.end(); i != ccs_end; ++i)
+      if (i->is_inconsistent()) {
+	// Inconsistent constraint found: the grid is empty.
+	status.set_empty();
+	// Insert the zero dim false congruence system into `con_sys'.
+	// `gen_sys' is already in empty form.
+	con_sys.insert(Congruence::zero_dim_false());
+	assert(OK());
+	return;
+      }
+    set_zero_dim_univ();
+    assert(OK());
+    return;
+  }
+
   Congruence_System cgs;
-  cgs.insert(0*Variable(ccs.space_dimension() - 1) %= 1);
+  cgs.insert(0*Variable(space_dim - 1) %= 1);
   for (Constraint_System::const_iterator i = ccs.begin(),
-         ccs_end = ccs.end(); i != ccs_end; ++i)
+	 ccs_end = ccs.end(); i != ccs_end; ++i)
     if (i->is_equality())
       cgs.insert(*i);
   construct(cgs);
 }
 
-PPL::Grid::Grid(Constraint_System& cs) {
-  if (cs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(cs)",
-				   "the space dimension of cs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  // FIXME: Adapt and use cs instead of using a copy.
+PPL::Grid::Grid(Constraint_System& cs, Recycle_Input)
+ : con_sys(cs.space_dimension() > max_space_dimension()
+	   ? throw_space_dimension_overflow("Grid(cs, recycle)",
+					    "the space dimension of cs "
+					    "exceeds the maximum allowed "
+					    "space dimension"), 0
+	   : cs.space_dimension()),
+   gen_sys(cs.space_dimension()) {
+  space_dim = cs.space_dimension();
+
+  if (space_dim == 0) {
+    // See if an inconsistent constraint has been passed.
+    for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+      if (i->is_inconsistent()) {
+	// Inconsistent constraint found: the grid is empty.
+	status.set_empty();
+	// Insert the zero dim false congruence system into `con_sys'.
+	// `gen_sys' is already in empty form.
+	con_sys.insert(Congruence::zero_dim_false());
+	assert(OK());
+	return;
+      }
+    set_zero_dim_univ();
+    assert(OK());
+    return;
+  }
+
   Congruence_System cgs;
-  cgs.insert(0*Variable(cs.space_dimension() - 1) %= 1);
+  cgs.insert(0*Variable(space_dim - 1) %= 1);
   for (Constraint_System::const_iterator i = cs.begin(),
-         cs_end = cs.end(); i != cs_end; ++i)
+	 cs_end = cs.end(); i != cs_end; ++i)
     if (i->is_equality())
       cgs.insert(*i);
   construct(cgs);
 }
 
+PPL::Grid::Grid(const Polyhedron& ph,
+                Complexity_Class complexity)
+  : con_sys(ph.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(ph)",
+					     "the space dimension of ph "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : ph.space_dimension()),
+    gen_sys(ph.space_dimension()) {
+  space_dim = ph.space_dimension();
+
+  // A zero-dim polyhedron causes no complexity problems.
+  if (space_dim == 0) {
+    if (ph.is_empty())
+      set_empty();
+    else
+      set_zero_dim_univ();
+    return;
+  }
+
+  // A polyhedron known to be empty causes no complexity problems.
+  if (ph.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  bool use_constraints = ph.constraints_are_minimized()
+    || !ph.generators_are_up_to_date();
+
+  // Minimize the constraint description if it is needed and
+  // the complexity allows it.
+  if (use_constraints && complexity == ANY_COMPLEXITY)
+    if (!ph.minimize()) {
+      set_empty();
+      return;
+    }
+
+  if (use_constraints) {
+    // Only the equality constraints need be used.
+    assert(ph.constraints_are_up_to_date());
+    const Constraint_System& cs = ph.constraints();
+    Congruence_System cgs;
+    cgs.insert(0*Variable(space_dim - 1) %= 1);
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i)
+      if (i->is_equality())
+        cgs.insert(*i);
+    construct(cgs);
+  }
+  else {
+    gen_sys = Grid_Generator_System(space_dim);
+    // First find a point or closure point and convert it to a
+    // grid point and add to the (initially empty) set of grid generators.
+    assert(ph.generators_are_up_to_date());
+    const Generator_System& gs = ph.generators();
+    Grid_Generator_System ggs(space_dim);
+    Linear_Expression point_expr;
+    Coefficient point_divisor;
+    for (Generator_System::const_iterator g = gs.begin(),
+           gs_end = gs.end(); g != gs_end; ++g) {
+      if (g->is_point() || g->is_closure_point()) {
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          const Variable v(i);
+          point_expr += g->coefficient(v) * v;
+          point_divisor = g->divisor();
+        }
+        ggs.insert(grid_point(point_expr, point_divisor));
+        break;
+      }
+    }
+    // Add grid lines for all the other generators.
+    // If the polyhedron's generator is a (closure) point, the grid line must
+    // have the direction given by a line that joins the grid point already
+    // inserted and the new point.
+    TEMP_INTEGER(coeff);
+    for (Generator_System::const_iterator g = gs.begin(),
+           gs_end = gs.end(); g != gs_end; ++g) {
+      Linear_Expression e;
+      if (g->is_point() || g->is_closure_point()) {
+        Coefficient g_divisor = g->divisor();
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          const Variable v(i);
+          coeff = point_expr.coefficient(v) * g_divisor;
+          coeff -= g->coefficient(v) * point_divisor;
+          e += coeff * v;
+        }
+        if (e.all_homogeneous_terms_are_zero())
+          continue;
+      }
+      else
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          const Variable v(i);
+          e += g->coefficient(v) * v;
+        }
+      ggs.insert(grid_line(e));
+    }
+    construct(ggs);
+  }
+  assert(OK());
+}
+
 PPL::Grid&
 PPL::Grid::operator=(const Grid& y) {
   space_dim = y.space_dim;
@@ -169,13 +254,18 @@ PPL::Grid::affine_dimension() const {
   if (space_dim == 0 || is_empty())
     return 0;
 
-  // FIXME: Use the minimized congruence system, or the generator
-  //        system in any form.
-
-  const Congruence_System& cgs = minimized_congruences();
+  if (generators_are_up_to_date()) {
+    if (generators_are_minimized())
+      return gen_sys.num_rows() - 1;
+    if (!(congruences_are_up_to_date() && congruences_are_minimized()))
+      return minimized_grid_generators().num_rows() - 1;
+  }
+  else
+    minimized_congruences();
+  assert(congruences_are_minimized());
   dimension_type d = space_dim;
-  for (dimension_type i = cgs.num_rows(); i-- > 0; )
-    if (cgs[i].is_equality())
+  for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+    if (con_sys[i].is_equality())
       --d;
   return d;
 }
@@ -187,29 +277,18 @@ PPL::Grid::congruences() const {
 
   if (space_dim == 0) {
     // Zero-dimensional universe.
-    assert(con_sys.num_columns() == 2 && con_sys.num_rows() == 0);
+    assert(con_sys.num_rows() == 0 && con_sys.num_columns() == 2);
     return con_sys;
   }
 
-  congruences_are_up_to_date() || update_congruences();
+  if (!congruences_are_up_to_date())
+    update_congruences();
 
   return con_sys;
 }
 
 const PPL::Congruence_System&
 PPL::Grid::minimized_congruences() const {
-  if (space_dim == 0) {
-    if (!marked_empty()) {
-      // Ensure the congruences are minimal by extending a zero dim
-      // universe congruence system to the appropriate dimension and
-      // then storing it in `con_sys'.
-      Congruence_System cgs(Congruence::zero_dim_integrality());
-      cgs.increase_space_dimension(space_dim);
-      cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
-      const_cast<Congruence_System&>(con_sys).swap(cgs);
-    }
-    return con_sys;
-  }
   if (congruences_are_up_to_date() && !congruences_are_minimized()) {
     // Minimize the congruences.
     Grid& gr = const_cast<Grid&>(*this);
@@ -222,15 +301,15 @@ PPL::Grid::minimized_congruences() const {
 }
 
 const PPL::Grid_Generator_System&
-PPL::Grid::generators() const {
+PPL::Grid::grid_generators() const {
   if (space_dim == 0) {
     assert(gen_sys.space_dimension() == 0
-	   && gen_sys.num_generators() == (marked_empty() ? 0 : 1));
+	   && gen_sys.num_rows() == (marked_empty() ? 0 : 1));
     return gen_sys;
   }
 
   if (marked_empty()) {
-    assert(gen_sys.num_generators() == 0);
+    assert(gen_sys.has_no_rows());
     return gen_sys;
   }
 
@@ -244,15 +323,15 @@ PPL::Grid::generators() const {
 }
 
 const PPL::Grid_Generator_System&
-PPL::Grid::minimized_generators() const {
+PPL::Grid::minimized_grid_generators() const {
   if (space_dim == 0) {
     assert(gen_sys.space_dimension() == 0
-	   && gen_sys.num_generators() == (marked_empty() ? 0 : 1));
+	   && gen_sys.num_rows() == (marked_empty() ? 0 : 1));
     return gen_sys;
   }
 
   if (marked_empty()) {
-    assert(gen_sys.num_generators() == 0);
+    assert(gen_sys.has_no_rows());
     return gen_sys;
   }
 
@@ -280,32 +359,31 @@ PPL::Grid::relation_with(const Congruence& cg) const {
     throw_dimension_incompatible("relation_with(cg)", "cg", cg);
 
   if (marked_empty())
-    return Poly_Con_Relation::is_included()
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
       && Poly_Con_Relation::is_disjoint();
 
-  if (space_dim == 0)
-    // FIXME: Confirm that the relation with the false cg is correct.
-    //        Does the false congruence define the empty grid?  If so,
-    //        is the empty grid disjoint from the universe grid?
-    if (cg.inhomogeneous_term() == 0)
-      return Poly_Con_Relation::is_included();
-    else if (cg.is_equality())
+  if (space_dim == 0) {
+    if (cg.is_trivial_false())
       return Poly_Con_Relation::is_disjoint();
+    else if (cg.is_equality())
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
     else if (cg.inhomogeneous_term() % cg.modulus() == 0)
-      return Poly_Con_Relation::is_included();
-    else
-      // cg is false.
-      return Poly_Con_Relation::is_disjoint();
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+  }
 
   if (!generators_are_up_to_date() && !update_generators())
     // Updating found the grid empty.
-    return Poly_Con_Relation::is_included()
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
       && Poly_Con_Relation::is_disjoint();
 
   // Return one of the relations
   // 'strictly_intersects'   a strict subset of the grid points satisfy cg
   // 'is_included'	     every grid point satisfies cg
-  // 'is_disjoint'	     cg and the grid occupy seperate spaces.
+  // 'is_disjoint'	     cg and the grid occupy separate spaces.
 
   // There is always a point.
 
@@ -314,24 +392,24 @@ PPL::Grid::relation_with(const Congruence& cg) const {
   TEMP_INTEGER(point_sp);
   point_sp = 0;
 
-  TEMP_INTEGER(modulus);
-  modulus = cg.modulus();
+  const Coefficient& modulus = cg.modulus();
 
   TEMP_INTEGER(div);
-  div = 0;
+  div = modulus;
+
+  TEMP_INTEGER(sp);
 
   bool known_to_intersect = false;
 
   for (Grid_Generator_System::const_iterator g = gen_sys.begin(),
          gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) {
-    TEMP_INTEGER(sp);
     Scalar_Products::assign(sp, cg, *g);
 
     switch (g->type()) {
 
     case Grid_Generator::POINT:
       if (cg.is_proper_congruence())
-	sp %= modulus;
+	sp %= div;
       if (sp == 0)
 	// The point satisfies the congruence.
 	if (point_sp == 0)
@@ -349,9 +427,9 @@ PPL::Grid::relation_with(const Congruence& cg) const {
 	}
 	else {
 	  // A previously considered point p failed to satisfy cg such that
-	  // `point_sp' = `scalar_prod(p,cg)'
+	  // `point_sp' = `scalar_prod(p, cg)'
 	  // so, if we consider the parameter g-p instead of g, we have
-	  // scalar_prod(g-p, cg) = scalar_prod(g,cg) - scalar_prod(p,cg)
+	  // scalar_prod(g-p, cg) = scalar_prod(g, cg) - scalar_prod(p, cg)
 	  //                      = sp - point_sp
 	  sp -= point_sp;
 
@@ -367,7 +445,7 @@ PPL::Grid::relation_with(const Congruence& cg) const {
 
     case Grid_Generator::PARAMETER:
       if (cg.is_proper_congruence())
-	sp %= (modulus * g->divisor());
+	sp %= (div * g->divisor());
       if (sp == 0)
 	// Parameter g satisfies the cg so the relation depends
 	// entirely on the other generators.
@@ -383,7 +461,8 @@ PPL::Grid::relation_with(const Congruence& cg) const {
       if (point_sp != 0)
 	// At least one of any previously encountered points fails to
 	// satisfy cg.
-	if (point_sp == div)
+	if (point_sp % div == 0)
+	  //////	if (point_sp == div)
 	  // There is also a grid point that satisfies cg.
 	  return Poly_Con_Relation::strictly_intersects();
 
@@ -412,9 +491,15 @@ PPL::Grid::relation_with(const Congruence& cg) const {
     }
   }
 
-  if (point_sp == 0)
-    // Every generator satisfied the cg.
-    return Poly_Con_Relation::is_included();
+  if (point_sp == 0) {
+    if (cg.is_equality())
+      // Every generator satisfied the cg.
+      return Poly_Con_Relation::is_included()
+        && Poly_Con_Relation::saturates();
+    else
+      // Every generator satisfied the cg.
+      return Poly_Con_Relation::is_included();
+  }
 
   assert(!known_to_intersect);
   return Poly_Con_Relation::is_disjoint();
@@ -435,7 +520,8 @@ PPL::Grid::relation_with(const Grid_Generator& g) const {
   if (space_dim == 0)
     return Poly_Gen_Relation::subsumes();
 
-  congruences_are_up_to_date() || update_congruences();
+  if (!congruences_are_up_to_date())
+    update_congruences();
 
   return
     con_sys.satisfies_all_congruences(g)
@@ -443,6 +529,146 @@ PPL::Grid::relation_with(const Grid_Generator& g) const {
     : Poly_Gen_Relation::nothing();
 }
 
+PPL::Poly_Gen_Relation
+PPL::Grid::relation_with(const Generator& g) const {
+  dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", "g", g);
+
+  // The empty grid cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe grid in a zero-dimensional space subsumes all the
+  // generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  Linear_Expression expr;
+  for (dimension_type i = g_space_dim; i-- > 0; ) {
+    const Variable v(i);
+    expr += g.coefficient(v) * v;
+  }
+  Grid_Generator gg(grid_point());
+  if (g.is_point() || g.is_closure_point())
+    // Points and closure points are converted to grid points.
+    gg = grid_point(expr, g.divisor());
+  else
+    // The generator is a ray or line.
+    // In both cases, we convert it to a grid line
+    gg = grid_line(expr);
+
+  return
+    con_sys.satisfies_all_congruences(gg)
+    ? Poly_Gen_Relation::subsumes()
+    : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Con_Relation
+PPL::Grid::relation_with(const Constraint& c) const {
+  // Dimension-compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("relation_with(c)", "c", c);
+
+  if (c.is_equality()) {
+    Congruence cg(c);
+    return relation_with(cg);
+  }
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      &&  Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (c.is_inconsistent())
+      if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+	// The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+	// thus, the zero-dimensional point also saturates it.
+	return Poly_Con_Relation::saturates()
+	  && Poly_Con_Relation::is_disjoint();
+      else
+	return Poly_Con_Relation::is_disjoint();
+    else if (c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (!generators_are_up_to_date() && !update_generators())
+    // Updating found the grid empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  // Return one of the relations
+  // 'strictly_intersects'   a strict subset of the grid points satisfy c
+  // 'is_included'	     every grid point satisfies c
+  // 'is_disjoint'	     c and the grid occupy separate spaces.
+
+  // There is always a point.
+
+  bool point_is_included = false;
+  bool point_saturates = false;
+  const Grid_Generator* first_point = NULL;
+
+  for (Grid_Generator_System::const_iterator g = gen_sys.begin(),
+         gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g)
+    switch (g->type()) {
+
+    case Grid_Generator::POINT:
+      {
+	Grid_Generator& gen = const_cast<Grid_Generator&>(*g);
+	if (first_point == NULL) {
+	  first_point = &gen;
+	  const int sign = Scalar_Products::sign(c, gen);
+	  Constraint::Type type = c.type();
+	  if ((type == Constraint::NONSTRICT_INEQUALITY && sign == 0)) {
+	    point_saturates = true;
+	  }
+	  else if (sign > 0)
+	    point_is_included = true;
+	  break;
+	}
+	// Else convert g to a parameter, and continue into the
+	// parameter case.
+	gen.set_is_parameter();
+	const Grid_Generator& first = *first_point;
+	for (dimension_type i = gen.size() - 1; i-- > 0; )
+	  gen[i] -= first[i];
+      }
+
+    case Grid_Generator::PARAMETER:
+    case Grid_Generator::LINE:
+      Grid_Generator& gen = const_cast<Grid_Generator&>(*g);
+      if (gen.is_line_or_parameter())
+	for (dimension_type i = c.space_dimension(); i-- > 0; ) {
+	  Variable v(i);
+	  if (c.coefficient(v) != 0 && gen.coefficient(v) != 0)
+	    return Poly_Con_Relation::strictly_intersects();
+	}
+      break;
+    }
+
+  if (point_saturates)
+    // Any parameters and lines are also included.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included();
+  if (point_is_included)
+    // Any parameters and lines are also included.
+    return Poly_Con_Relation::is_included();
+  return Poly_Con_Relation::is_disjoint();
+}
+
 bool
 PPL::Grid::is_empty() const {
   if (marked_empty())
@@ -506,12 +732,12 @@ PPL::Grid::is_bounded() const {
 
   // TODO: Consider using con_sys when gen_sys is out of date.
 
-  if (gen_sys.num_generators() > 1) {
+  if (gen_sys.num_rows() > 1) {
     // Check if all generators are the same point.
     const Grid_Generator& first_point = gen_sys[0];
     if (first_point.is_line_or_parameter())
       return false;
-    for (dimension_type row = gen_sys.num_generators(); row-- > 0; ) {
+    for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) {
       const Grid_Generator& gen = gen_sys[row];
       if (gen.is_line_or_parameter() || gen != first_point)
 	return false;
@@ -523,83 +749,110 @@ PPL::Grid::is_bounded() const {
 bool
 PPL::Grid::is_discrete() const {
   // A zero-dimensional or empty grid is discrete.
-  if (space_dim == 0 || marked_empty())
-    return true;
-
-  if (generators_are_minimized()) {
-  line_search:
-    // Search for lines in the minimized generator system.
-    for (dimension_type row = gen_sys.num_generators(); row-- > 1; )
-      if (gen_sys[row].is_line())
-	return false;
+  if (space_dim == 0
+      || marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
     return true;
-  }
 
-  if (congruences_are_minimized())
-    return con_sys.has_a_free_dimension();
+  // Search for lines in the generator system.
+  for (dimension_type row = gen_sys.num_rows(); row-- > 1; )
+    if (gen_sys[row].is_line())
+      return false;
 
-  Grid& gr = const_cast<Grid&>(*this);
-  if (generators_are_up_to_date()) {
-    // Minimize the generator system.
-    gr.simplify(gr.gen_sys, gr.dim_kinds);
-    gr.set_generators_minimized();
+  // The system of generators is composed only by
+  // points and parameters: the polyhedron is discrete.
+  return true;
+}
 
-    goto line_search;
-  }
+bool
+PPL::Grid::is_topologically_closed() const {
+  return true;
+}
 
-  // Generators are out of date.
+bool
+PPL::Grid::contains_integer_point() const {
+  // Empty grids have no points.
+  if (marked_empty())
+    return false;
 
-  // Minimize the congruence system to find out whether it is empty.
-  if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
-    // The congruence system reduced to the empty grid.
-    gr.set_empty();
+  // A zero-dimensional, universe grid has, by convention, an
+  // integer point.
+  if (space_dim == 0)
     return true;
-  }
-  gr.set_congruences_minimized();
 
-  return gr.con_sys.has_a_free_dimension();
+  // A grid has an integer point if its intersection with the integer
+  // grid is non-empty.
+  Congruence_System cgs;
+  for (dimension_type var_index = space_dim; var_index-- > 0; )
+    cgs.insert(Variable(var_index) %= 0);
+
+  Grid gr = *this;
+  gr.add_congruences(cgs);
+  return !gr.is_empty();
 }
 
 bool
-PPL::Grid::is_topologically_closed() const {
-  // Any empty or zero-dimensional grid is closed.
-  if (marked_empty() || space_dim == 0)
-    return true;
+PPL::Grid::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
 
-  if (generators_are_minimized()) {
-  param_search:
-    // Search for a parameter in the minimized generator system.
-    for (dimension_type row = gen_sys.num_generators(); row-- > 1; )
-      if (gen_sys[row].is_parameter())
-	return false;
+  // An empty grid constrains all variables.
+  if (marked_empty())
     return true;
-  }
 
-  if (congruences_are_minimized()) {
-  proper_cg_search:
-    // Search for a proper congruence following the integrality
-    // congruence, in the minimized congruence system.
-    for (dimension_type row = con_sys.num_rows() - 1; row-- > 0; )
-      if (con_sys[row].is_proper_congruence())
+  if (generators_are_up_to_date()) {
+    // Since generators are up-to-date, the generator system (since it is
+    // well formed) contains a point.  Hence the grid is not empty.
+    if (congruences_are_up_to_date())
+      // Here a variable is constrained if and only if it is
+      // syntactically constrained.
+      goto syntactic_check;
+
+    if (generators_are_minimized()) {
+      // Try a quick, incomplete check for the universe grid:
+      // a universe polyhedron constrains no variable.
+      // Count the number of lines (they are linearly independent).
+      dimension_type num_lines = 0;
+      for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+	if (gen_sys[i].is_line())
+	  ++num_lines;
+
+      if (num_lines == space_dim)
 	return false;
-    return true;
-  }
+    }
 
-  Grid& gr = const_cast<Grid&>(*this);
-  if (generators_are_up_to_date()) {
-    gr.simplify(gr.gen_sys, gr.dim_kinds);
-    gr.set_generators_minimized();
-    goto param_search;
+    // Scan generators: perhaps we will find line(var).
+    const dimension_type var_id = var.id();
+    for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+      const Grid_Generator& g_i = gen_sys[i];
+      if (g_i.is_line()) {
+	if (sgn(g_i.coefficient(var)) != 0) {
+	  for (dimension_type j = 0; j < space_dim; ++j)
+	    if (g_i.coefficient(Variable(j)) != 0 && j != var_id)
+	      goto next;
+          return true;
+	}
+      }
+    next:
+      ;
+    }
+
+    // We are still here: at least we know that the grid is not empty.
+    update_congruences();
+    goto syntactic_check;
   }
 
-  // Minimize the congruence system.
-  if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
-    // The congruence system reduced to the empty grid.
-    gr.set_empty();
+  // We must minimize to detect emptiness and obtain constraints.
+  if (!minimize())
     return true;
-  }
-  gr.set_congruences_minimized();
-  goto proper_cg_search;
+
+ syntactic_check:
+  for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+    if (con_sys[i].coefficient(var) != 0)
+      return true;
+  return false;
 }
 
 bool
@@ -638,8 +891,8 @@ PPL::Grid::OK(bool check_not_empty) const {
   // congruences `con_sys' is empty, and the generator system contains
   // one point.
   if (space_dim == 0) {
-    if (con_sys.num_rows() == 0)
-      if (gen_sys.num_generators() == 1 && gen_sys[0].is_point())
+    if (con_sys.has_no_rows())
+      if (gen_sys.num_rows() == 1 && gen_sys[0].is_point())
 	return true;
 #ifndef NDEBUG
     cerr << "Zero-dimensional grid should have an empty congruence" << endl
@@ -660,9 +913,6 @@ PPL::Grid::OK(bool check_not_empty) const {
   }
 
   {
-    // This block is to limit the scope of num_columns, at least for
-    // GCC < 3.4.
-
     // The expected number of columns in the congruence and generator
     // systems, if they are not empty.
     const dimension_type num_columns = space_dim + 1;
@@ -690,14 +940,11 @@ PPL::Grid::OK(bool check_not_empty) const {
       }
 
       // Check if the system of generators is well-formed.
-      if (!gen_sys.OK()) {
-#ifndef NDEBUG
-	cerr << "gen_sys OK failed." << endl;
-#endif
+      if (!gen_sys.OK())
 	goto fail;
-      }
+
       // Check each generator in the system.
-      for (dimension_type i = gen_sys.num_generators(); i-- > 0; ) {
+      for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
 	const Grid_Generator& g = gen_sys[i];
 
 	if (g.size() < 1) {
@@ -708,9 +955,9 @@ PPL::Grid::OK(bool check_not_empty) const {
 	}
       }
 
-      // A non-empty system of generators describing a grid is valid iff
-      // it contains a point.
-      if (gen_sys.num_generators() > 0 && !gen_sys.has_points()) {
+      // A non-empty system of generators describing a grid is valid
+      // if and only if it contains a point.
+      if (!gen_sys.has_no_rows() && !gen_sys.has_points()) {
 #ifndef NDEBUG
 	cerr << "Non-empty generator system declared up-to-date "
 	     << "has no points!"
@@ -739,13 +986,12 @@ PPL::Grid::OK(bool check_not_empty) const {
 	}
 
 	// Check that dim_kinds corresponds to the row kinds in gen_sys.
-	for (dimension_type dim = 0, row = 0;
-	     dim < space_dim + 1;
-	     ++dim, assert(row <= dim)) {
+	for (dimension_type dim = space_dim,
+	       row = gen_sys.num_rows(); dim > 0; assert(row <= dim), --dim) {
 	  if (dim_kinds[dim] == GEN_VIRTUAL
-	      || (gen_sys[row++].is_parameter_or_point()
+	      || (gen_sys[--row].is_parameter_or_point()
 		  && dim_kinds[dim] == PARAMETER)
-	      || (assert(gen_sys[row-1].is_line()), dim_kinds[dim] == LINE))
+	      || (assert(gen_sys[row].is_line()), dim_kinds[dim] == LINE))
 	    continue;
 #ifndef NDEBUG
 	  cerr << "Kinds in dim_kinds should match those in gen_sys."
@@ -759,12 +1005,12 @@ PPL::Grid::OK(bool check_not_empty) const {
 	Dimension_Kinds dk = dim_kinds;
 	// `gs' is minimized and marked_empty returned false, so `gs'
 	// should contain rows.
-	assert(gs.num_generators() > 0);
+	assert(!gs.has_no_rows());
 	simplify(gs, dk);
 	// gs contained rows before being reduced, so it should
-	// contain at least a single point afterwards.
-	assert(gs.num_generators() > 0);
-	for (dimension_type row = 0; row < gen_sys.num_generators(); ++row) {
+	// contain at least a single point afterward.
+	assert(!gs.has_no_rows());
+	for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) {
 	  Grid_Generator& g = gs[row];
 	  const Grid_Generator& g_copy = gen_sys[row];
 	  if (g.is_equal_to(g_copy))
@@ -782,26 +1028,22 @@ PPL::Grid::OK(bool check_not_empty) const {
       }
 
     } // if (congruences_are_up_to_date())
-  } // scope block
+  }
 
   if (congruences_are_up_to_date()) {
     // Check if the system of congruences is well-formed.
-    if (!con_sys.OK()) {
-#ifndef NDEBUG
-      cerr << "con_sys OK failed." << endl;
-#endif
+    if (!con_sys.OK())
       goto fail;
-    }
 
-    Grid tem_gr = *this;
-    Congruence_System cs_copy = tem_gr.con_sys;
+    Grid tmp_gr = *this;
+    Congruence_System cs_copy = tmp_gr.con_sys;
 
-    // Clear the generators in tem_gr.
+    // Clear the generators in tmp_gr.
     Grid_Generator_System gs(space_dim);
-    std::swap(tem_gr.gen_sys, gs);
-    tem_gr.clear_generators_up_to_date();
+    std::swap(tmp_gr.gen_sys, gs);
+    tmp_gr.clear_generators_up_to_date();
 
-    if (!tem_gr.update_generators()) {
+    if (!tmp_gr.update_generators()) {
       if (check_not_empty) {
 	// Want to know the satisfiability of the congruences.
 #ifndef NDEBUG
@@ -847,13 +1089,11 @@ PPL::Grid::OK(bool check_not_empty) const {
       }
 
       // Check that dim_kinds corresponds to the row kinds in con_sys.
-      for (dimension_type dim = 0, row = con_sys.num_rows() - 1;
-	   dim < space_dim + 1;
-	   ++dim) {
+      for (dimension_type dim = space_dim, row = 0; dim > 0; --dim) {
 	if (dim_kinds[dim] == CON_VIRTUAL
-	    || (con_sys[row--].is_proper_congruence()
+	    || (con_sys[row++].is_proper_congruence()
 		&& dim_kinds[dim] == PROPER_CONGRUENCE)
-	    || (assert(con_sys[row+1].is_equality()),
+	    || (assert(con_sys[row-1].is_equality()),
 		dim_kinds[dim] == EQUALITY))
 	  continue;
 #ifndef NDEBUG
@@ -893,7 +1133,8 @@ PPL::Grid::add_congruence(const Congruence& cg) {
     return;
   }
 
-  congruences_are_up_to_date() || update_congruences();
+  if (!congruences_are_up_to_date())
+    update_congruences();
 
   con_sys.insert(cg);
 
@@ -933,7 +1174,7 @@ PPL::Grid::add_congruence_and_minimize(const Constraint& c) {
 }
 
 void
-PPL::Grid::add_generator(const Grid_Generator& g) {
+PPL::Grid::add_grid_generator(const Grid_Generator& g) {
   // The dimension of `g' must be at most space_dim.
   const dimension_type g_space_dim = g.space_dimension();
   if (space_dim < g_space_dim)
@@ -977,10 +1218,10 @@ PPL::Grid::add_generator(const Grid_Generator& g) {
 }
 
 bool
-PPL::Grid::add_generator_and_minimize(const Grid_Generator& g) {
+PPL::Grid::add_grid_generator_and_minimize(const Grid_Generator& g) {
   // TODO: this is just an executable specification.
   Grid_Generator_System gs(g);
-  return add_recycled_generators_and_minimize(gs);
+  return add_recycled_grid_generators_and_minimize(gs);
 }
 
 void
@@ -991,7 +1232,7 @@ PPL::Grid::add_recycled_congruences(Congruence_System& cgs) {
   if (space_dim < cgs_space_dim)
     throw_dimension_incompatible("add_recycled_congruences(cgs)", "cgs", cgs);
 
-  if (cgs.num_rows() == 0)
+  if (cgs.has_no_rows())
     return;
 
   if (space_dim == 0) {
@@ -1012,7 +1253,8 @@ PPL::Grid::add_recycled_congruences(Congruence_System& cgs) {
   }
 
   // The congruences are required.
-  congruences_are_up_to_date() || update_congruences();
+  if (!congruences_are_up_to_date())
+    update_congruences();
 
   // Swap (instead of copying) the coefficients of `cgs' (which is
   // writable).
@@ -1066,7 +1308,7 @@ PPL::Grid::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
 				 "cgs", cgs);
 
   // Adding no congruences: just minimize.
-  if (cgs.num_rows() == 0)
+  if (cgs.has_no_rows())
     return minimize();
 
   // Dealing with zero-dimensional space grids first.
@@ -1086,7 +1328,8 @@ PPL::Grid::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
   if (marked_empty())
     return false;
 
-  congruences_are_up_to_date() || update_congruences();
+  if (!congruences_are_up_to_date())
+    update_congruences();
 
   con_sys.recycling_insert(cgs);
 
@@ -1192,7 +1435,7 @@ PPL::Grid::add_recycled_constraints_and_minimize(Constraint_System& cs) {
 }
 
 void
-PPL::Grid::add_recycled_generators(Grid_Generator_System& gs) {
+PPL::Grid::add_recycled_grid_generators(Grid_Generator_System& gs) {
   // Dimension-compatibility check:
   // the dimension of `gs' can not be greater than space_dim.
   const dimension_type gs_space_dim = gs.space_dimension();
@@ -1200,25 +1443,25 @@ PPL::Grid::add_recycled_generators(Grid_Generator_System& gs) {
     throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs);
 
   // Adding no generators leaves the grid the same.
-  if (gs.num_generators() == 0)
+  if (gs.has_no_rows())
     return;
 
   // Adding valid generators to a zero-dimensional grid transforms it
   // to the zero-dimensional universe grid.
   if (space_dim == 0) {
     if (marked_empty())
-      if (gs.has_points())
-	set_zero_dim_univ();
-      else
-	throw_invalid_generators("add_recycled_generators(gs)", "gs");
+      set_zero_dim_univ();
+    else
+      assert(gs.has_points());
     assert(OK(true));
     return;
   }
 
-  if (!marked_empty()
-      && (generators_are_up_to_date() || update_generators())) {
+  if (!marked_empty()) {
     // The grid contains at least one point.
 
+    if (!generators_are_up_to_date())
+      update_generators();
     normalize_divisors(gs, gen_sys);
 
     gen_sys.recycling_insert(gs);
@@ -1252,14 +1495,15 @@ PPL::Grid::add_recycled_generators(Grid_Generator_System& gs) {
 }
 
 void
-PPL::Grid::add_generators(const Grid_Generator_System& gs) {
+PPL::Grid::add_grid_generators(const Grid_Generator_System& gs) {
   // TODO: this is just an executable specification.
   Grid_Generator_System gs_copy = gs;
-  add_recycled_generators(gs_copy);
+  add_recycled_grid_generators(gs_copy);
 }
 
 bool
-PPL::Grid::add_recycled_generators_and_minimize(Grid_Generator_System& gs) {
+PPL
+::Grid::add_recycled_grid_generators_and_minimize(Grid_Generator_System& gs) {
   // Dimension-compatibility check: the dimension of `gs' must be less
   // than or equal to that of space_dim.
   const dimension_type gs_space_dim = gs.space_dimension();
@@ -1268,18 +1512,16 @@ PPL::Grid::add_recycled_generators_and_minimize(Grid_Generator_System& gs) {
 				 "gs", gs);
 
   // Adding no generators is equivalent to just requiring reduction.
-  if (gs.num_generators() == 0)
+  if (gs.has_no_rows())
     return minimize();
 
   // Adding valid generators to a zero-dimensional grid produces the
   // zero-dimensional universe grid.
   if (space_dim == 0) {
     if (marked_empty())
-      if (gs.has_points())
-	set_zero_dim_univ();
-      else
-	throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
-				 "gs");
+      set_zero_dim_univ();
+    else
+      assert(gs.has_points());
     assert(OK(true));
     return true;
   }
@@ -1287,12 +1529,15 @@ PPL::Grid::add_recycled_generators_and_minimize(Grid_Generator_System& gs) {
   // Adjust `gs' to the right dimension.
   gs.insert(parameter(0*Variable(space_dim-1)));
 
-  if (!marked_empty()
-      && (generators_are_up_to_date() || update_generators())) {
+  if (!marked_empty()) {
     // The grid contains at least one point.
+
+    if (!generators_are_up_to_date())
+      update_generators();
     normalize_divisors(gs, gen_sys);
 
-    for (dimension_type row = 0; row < gs.num_generators(); ++row)
+    for (dimension_type row = 0,
+	   gs_num_rows = gs.num_rows(); row < gs_num_rows; ++row)
       gen_sys.recycling_insert(gs[row]);
   }
   else {
@@ -1312,10 +1557,90 @@ PPL::Grid::add_recycled_generators_and_minimize(Grid_Generator_System& gs) {
 }
 
 bool
-PPL::Grid::add_generators_and_minimize(const Grid_Generator_System& gs) {
+PPL::Grid::add_grid_generators_and_minimize(const Grid_Generator_System& gs) {
   // TODO: this is just an executable specification.
   Grid_Generator_System gs_copy = gs;
-  return add_recycled_generators_and_minimize(gs_copy);
+  return add_recycled_grid_generators_and_minimize(gs_copy);
+}
+
+void
+PPL::Grid::refine_with_constraint(const Constraint& c) {
+  // FIXME: This is a currently copy of add_constraint() since that will
+  //        be changed to throw an exception unless the constraint
+  //        is an equality.
+  // The dimension of `c' must be at most `space_dim'.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+  if (c.is_equality()) {
+    Congruence cg(c);
+    add_congruence(cg);
+  }
+}
+
+void
+PPL::Grid::refine_with_constraints(const Constraint_System& cs) {
+  // FIXME: This is a currently copy of add_constraints() since that will
+  //        be changed to throw an exception unless the constraint
+  //        is an equality.
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", "cs", cs);
+  Congruence_System cgs(cs);
+  add_recycled_congruences(cgs);
+}
+
+void
+PPL::Grid::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  if (space_dim < var.id())
+    throw_dimension_incompatible("unconstrain(var)", var.id());
+
+  // Do something only if the grid is non-empty.
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  assert(generators_are_up_to_date());
+  Grid_Generator l = grid_line(var);
+  gen_sys.recycling_insert(l);
+  // With the added generator, congruences are out of date.
+  clear_congruences_up_to_date();
+  clear_generators_minimized();
+  assert(OK());
+}
+
+void
+PPL::Grid::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a grid in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Do something only if the grid is non-empty.
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  assert(generators_are_up_to_date());
+  // Since `gen_sys' is not empty, the space dimension of the inserted
+  // generators are automatically adjusted.
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) {
+    Grid_Generator l = grid_line(Variable(*tbu));
+    gen_sys.recycling_insert(l);
+  }
+  // Constraints are no longer up-to-date.
+  clear_generators_minimized();
+  clear_congruences_up_to_date();
+  assert(OK());
 }
 
 void
@@ -1339,10 +1664,12 @@ PPL::Grid::intersection_assign(const Grid& y) {
     return;
 
   // The congruences must be up-to-date.
-  x.congruences_are_up_to_date() || x.update_congruences();
-  y.congruences_are_up_to_date() || y.update_congruences();
+  if (!x.congruences_are_up_to_date())
+    x.update_congruences();
+  if (!y.congruences_are_up_to_date())
+    y.update_congruences();
 
-  if (y.con_sys.num_rows() > 0 ) {
+  if (!y.con_sys.has_no_rows()) {
     x.con_sys.insert(y.con_sys);
     // Grid_Generators may be out of date and congruences may have changed
     // from minimal form.
@@ -1350,8 +1677,7 @@ PPL::Grid::intersection_assign(const Grid& y) {
     x.clear_congruences_minimized();
   }
 
-  // `y' should still contain a point.
-  assert(x.OK() && y.OK(true));
+  assert(x.OK() && y.OK());
 }
 
 bool
@@ -1426,6 +1752,10 @@ PPL::Grid::join_assign_if_exact(const Grid& y) {
     return true;
   }
 
+  // The above test 'x.is_included_in(y)' will ensure the generators of x
+  // are up to date.
+  assert(generators_are_up_to_date());
+
   Grid x_copy = x;
   x_copy.join_assign(y);
   x_copy.grid_difference_assign(y);
@@ -1484,7 +1814,7 @@ PPL::Grid::grid_difference_assign(const Grid& y) {
     if (cg.is_proper_congruence()) {
       const Linear_Expression e = Linear_Expression(cg);
       // Congruence cg is ((e %= 0) / m).
-      Coefficient_traits::const_reference m = cg.modulus();
+      const Coefficient& m = cg.modulus();
       // If x is included in the grid defined by the congruences cg
       // and its 2-complement (i.e. the grid defined by the congruence
       // (2e %= 0) / m) then add the 2-complement to the potential
@@ -1505,6 +1835,13 @@ PPL::Grid::grid_difference_assign(const Grid& y) {
   assert(OK());
 }
 
+bool
+PPL::Grid::simplify_using_context_assign(const Grid& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
+
 void
 PPL::Grid::affine_image(const Variable var,
 			const Linear_Expression& expr,
@@ -1551,9 +1888,9 @@ PPL::Grid::affine_image(const Variable var,
 	con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]);
       }
       else {
-	// The new denominator is negative:
-	// we negate everything once more, as Congruence_System::affine_preimage()
-	// requires the third argument to be positive.
+	// The new denominator is negative: we negate everything once
+	// more, as Congruence_System::affine_preimage() requires the
+	// third argument to be positive.
 	inverse = expr;
 	inverse[var_space_dim] = denominator;
 	neg_assign(inverse[var_space_dim]);
@@ -1630,9 +1967,9 @@ affine_preimage(const Variable var,
 	gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]);
       }
       else {
-	// The new denominator is negative:
-	// we negate everything once more, as Grid_Generator_System::affine_image()
-	// requires the third argument to be positive.
+	// The new denominator is negative: we negate everything once
+	// more, as Grid_Generator_System::affine_image() requires the
+	// third argument to be positive.
 	inverse = expr;
 	inverse[var_space_dim] = denominator;
 	neg_assign(inverse[var_space_dim]);
@@ -1662,30 +1999,56 @@ affine_preimage(const Variable var,
 void
 PPL::Grid::
 generalized_affine_image(const Variable var,
+			 const Relation_Symbol relsym,
 			 const Linear_Expression& expr,
 			 Coefficient_traits::const_reference denominator,
 			 Coefficient_traits::const_reference modulus) {
+
   // The denominator cannot be zero.
   if (denominator == 0)
-    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+    throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+                           "d == 0");
 
   // Dimension-compatibility checks.
   // The dimension of `expr' should not be greater than the dimension
   // of `*this'.
   const dimension_type expr_space_dim = expr.space_dimension();
   if (space_dim < expr_space_dim)
-    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d, m)",
 				 "e", expr);
   // `var' should be one of the dimensions of the grid.
   const dimension_type var_space_dim = var.space_dimension();
   if (space_dim < var_space_dim)
-    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d, m)",
 				 "v", var);
 
   // Any image of an empty grid is empty.
   if (marked_empty())
     return;
 
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    add_grid_generator(grid_line(var));
+
+    assert(OK());
+    return;
+  }
+
+  assert(relsym == EQUAL);
+
   affine_image(var, expr, denominator);
 
   if (modulus == 0)
@@ -1693,7 +2056,8 @@ generalized_affine_image(const Variable var,
 
   // Modulate dimension `var' according to `modulus'.
 
-  generators_are_up_to_date() || minimize();
+  if (!generators_are_up_to_date())
+    minimize();
 
   // Test if minimization, possibly in affine_image, found an empty
   // grid.
@@ -1715,9 +2079,12 @@ generalized_affine_image(const Variable var,
 
 void PPL::Grid::
 generalized_affine_preimage(const Variable var,
+			    const Relation_Symbol relsym,
 			    const Linear_Expression& expr,
 			    Coefficient_traits::const_reference denominator,
 			    Coefficient_traits::const_reference modulus) {
+
+
   // The denominator cannot be zero.
   if (denominator == 0)
     throw_invalid_argument("generalized_affine_preimage(v, e, d, m)",
@@ -1735,6 +2102,29 @@ generalized_affine_preimage(const Variable var,
     throw_dimension_incompatible("generalized_affine_preimage(v, e, d, m)",
 				 "v", var);
 
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    add_grid_generator(grid_line(var));
+
+    assert(OK());
+    return;
+  }
+
+  assert(relsym == EQUAL);
+
   // Check whether the affine relation is an affine function.
   if (modulus == 0) {
     affine_preimage(var, expr, denominator);
@@ -1743,16 +2133,17 @@ generalized_affine_preimage(const Variable var,
 
   // Check whether the preimage of this affine relation can be easily
   // computed as the image of its inverse relation.
-  Coefficient_traits::const_reference var_coefficient = expr.coefficient(var);
+  const Coefficient& var_coefficient = expr.coefficient(var);
   if (var_space_dim <= expr_space_dim && var_coefficient != 0) {
     Linear_Expression inverse_expr
       = expr - (denominator + var_coefficient) * var;
-    Coefficient inverse_denominator = - var_coefficient;
+    TEMP_INTEGER(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
     if (modulus < 0)
-      generalized_affine_image(var, inverse_expr, inverse_denominator,
+      generalized_affine_image(var, EQUAL, inverse_expr, inverse_denominator,
 			       - modulus);
     else
-      generalized_affine_image(var, inverse_expr, inverse_denominator,
+      generalized_affine_image(var, EQUAL, inverse_expr, inverse_denominator,
 			       modulus);
     return;
   }
@@ -1766,16 +2157,17 @@ generalized_affine_preimage(const Variable var,
     add_congruence((denominator*var %= expr) / denominator /= modulus);
 
   // If the resulting grid is empty, its preimage is empty too.
-  // Note: DO check for emptyness here, as we will later add a line.
+  // Note: DO check for emptiness here, as we will later add a line.
   if (is_empty())
     return;
-  add_generator(grid_line(var));
+  add_grid_generator(grid_line(var));
   assert(OK());
 }
 
 void
 PPL::Grid::
 generalized_affine_image(const Linear_Expression& lhs,
+			 const Relation_Symbol relsym,
 			 const Linear_Expression& rhs,
 			 Coefficient_traits::const_reference modulus) {
   // Dimension-compatibility checks.
@@ -1796,18 +2188,42 @@ generalized_affine_image(const Linear_Expression& lhs,
   if (marked_empty())
     return;
 
-  TEMP_INTEGER(mod);
-  if (modulus < 0)
-    mod = -modulus;
-  else
-    mod = modulus;
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_image(e1, r, e2, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    for (dimension_type i = space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0)
+	add_grid_generator(grid_line(Variable(i)));
+
+    assert(OK());
+    return;
+  }
+
+  assert(relsym == EQUAL);
+
+  TEMP_INTEGER(tmp_modulus);
+  tmp_modulus = modulus;
+  if (tmp_modulus < 0)
+    neg_assign(tmp_modulus);
 
   // Compute the actual space dimension of `lhs',
   // i.e., the highest dimension having a non-zero coefficient in `lhs'.
   do {
     if (lhs_space_dim == 0) {
       // All variables have zero coefficients, so `lhs' is a constant.
-      add_congruence((lhs %= rhs) / mod);
+      add_congruence((lhs %= rhs) / tmp_modulus);
       return;
     }
   }
@@ -1821,7 +2237,7 @@ generalized_affine_image(const Linear_Expression& lhs,
   bool lhs_vars_intersect_rhs_vars = false;
   for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
     if (lhs.coefficient(Variable(i)) != 0) {
-      new_lines.insert(Grid_Generator::line(Variable(i)));
+      new_lines.insert(grid_line(Variable(i)));
       if (rhs.coefficient(Variable(i)) != 0)
 	lhs_vars_intersect_rhs_vars = true;
     }
@@ -1833,17 +2249,19 @@ generalized_affine_image(const Linear_Expression& lhs,
     add_space_dimensions_and_embed(1);
 
     // Constrain the new dimension to be equal to the right hand side.
-    // TODO: Use add_congruence_and_minimize() when it has been updated.
+    // TODO: Use add_congruence() when it has been updated.
     Congruence_System new_cgs1(new_var == rhs);
-    if (add_recycled_congruences_and_minimize(new_cgs1)) {
+    add_recycled_congruences(new_cgs1);
+    if (!is_empty()) {
       // The grid still contains points.
 
-      // Cylindrificate on all the variables occurring in the left
+      // Existentially quantify all the variables occurring in the left
       // hand side expression.
 
-      // Ajust `new_lines' to the right dimension.
+      // Adjust `new_lines' to the right dimension.
       new_lines.insert(parameter(0*Variable(space_dim-1)));
-      // Add the lines to `gen_sys'.
+      // Add the lines to `gen_sys' (first make sure they are up-to-date).
+      update_generators();
       gen_sys.recycling_insert(new_lines);
       normalize_divisors(gen_sys);
       // Update the flags.
@@ -1851,9 +2269,9 @@ generalized_affine_image(const Linear_Expression& lhs,
       clear_generators_minimized();
 
       // Constrain the new dimension so that it is congruent to the left
-      // hand side expression modulo `mod'.
+      // hand side expression modulo `modulus'.
       // TODO: Use add_congruence() when it has been updated.
-      Congruence_System new_cgs2((lhs %= new_var) / mod);
+      Congruence_System new_cgs2((lhs %= new_var) / tmp_modulus);
       add_recycled_congruences(new_cgs2);
     }
 
@@ -1868,13 +2286,13 @@ generalized_affine_image(const Linear_Expression& lhs,
     if (is_empty())
       return;
 
-    // Cylindrificate on all the variables occurring in the left hand
+    // Existentially quantify all the variables occurring in the left hand
     // side expression.
-    add_recycled_generators(new_lines);
+    add_recycled_grid_generators(new_lines);
 
     // Constrain the left hand side expression so that it is congruent to
-    // the right hand side expression modulo `mod'.
-    add_congruence((lhs %= rhs) / mod);
+    // the right hand side expression modulo `modulus'.
+    add_congruence((lhs %= rhs) / tmp_modulus);
   }
 
   assert(OK());
@@ -1882,8 +2300,10 @@ generalized_affine_image(const Linear_Expression& lhs,
 
 void PPL::Grid::
 generalized_affine_preimage(const Linear_Expression& lhs,
+			    const Relation_Symbol relsym,
 			    const Linear_Expression& rhs,
 			    Coefficient_traits::const_reference modulus) {
+
   // The dimension of `lhs' must be at most the dimension of `*this'.
   dimension_type lhs_space_dim = lhs.space_dimension();
   if (space_dim < lhs_space_dim)
@@ -1899,11 +2319,35 @@ generalized_affine_preimage(const Linear_Expression& lhs,
   if (marked_empty())
     return;
 
-  TEMP_INTEGER(mod);
-  if (modulus < 0)
-    mod = -modulus;
-  else
-    mod = modulus;
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_preimage(e1, r, e2, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0)
+	add_grid_generator(grid_line(Variable(i)));
+
+    assert(OK());
+    return;
+  }
+
+  assert(relsym == EQUAL);
+
+  TEMP_INTEGER(tmp_modulus);
+  tmp_modulus = modulus;
+  if (tmp_modulus < 0)
+    neg_assign(tmp_modulus);
 
   // Compute the actual space dimension of `lhs',
   // i.e., the highest dimension having a non-zero coefficient in `lhs'.
@@ -1911,7 +2355,7 @@ generalized_affine_preimage(const Linear_Expression& lhs,
     if (lhs_space_dim == 0) {
       // All variables have zero coefficients, so `lhs' is a constant.
       // In this case, preimage and image happen to be the same.
-      add_congruence((lhs %= rhs) / mod);
+      add_congruence((lhs %= rhs) / tmp_modulus);
       return;
     }
   }
@@ -1925,7 +2369,7 @@ generalized_affine_preimage(const Linear_Expression& lhs,
   bool lhs_vars_intersect_rhs_vars = false;
   for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
     if (lhs.coefficient(Variable(i)) != 0) {
-      new_lines.insert(Grid_Generator::line(Variable(i)));
+      new_lines.insert(grid_line(Variable(i)));
       if (rhs.coefficient(Variable(i)) != 0)
 	lhs_vars_intersect_rhs_vars = true;
     }
@@ -1937,17 +2381,19 @@ generalized_affine_preimage(const Linear_Expression& lhs,
     add_space_dimensions_and_embed(1);
 
     // Constrain the new dimension to be equal to `lhs'
-    // TODO: Use add_congruence_and_minimize() when it has been updated.
+    // TODO: Use add_congruence() when it has been updated.
     Congruence_System new_cgs1(new_var == lhs);
-    if (add_recycled_congruences_and_minimize(new_cgs1)) {
+    add_recycled_congruences(new_cgs1);
+    if (!is_empty()) {
       // The grid still contains points.
 
-      // Cylindrificate on all the variables occurring in the left
+      // Existentially quantify all the variables occurring in the left
       // hand side
 
-      // Ajust `new_lines' to the right dimension.
+      // Adjust `new_lines' to the right dimension.
       new_lines.insert(parameter(0*Variable(space_dim-1)));
-      // Add the lines to `gen_sys'.
+      // Add the lines to `gen_sys' (first make sure they are up-to-date).
+      update_generators();
       gen_sys.recycling_insert(new_lines);
       normalize_divisors(gen_sys);
       // Update the flags.
@@ -1955,9 +2401,9 @@ generalized_affine_preimage(const Linear_Expression& lhs,
       clear_generators_minimized();
 
       // Constrain the new dimension so that it is related to
-      // the right hand side modulo `mod'.
+      // the right hand side modulo `modulus'.
       // TODO: Use add_congruence() when it has been updated.
-      Congruence_System new_cgs2((rhs %= new_var) / mod);
+      Congruence_System new_cgs2((rhs %= new_var) / tmp_modulus);
       add_recycled_congruences(new_cgs2);
     }
 
@@ -1970,22 +2416,104 @@ generalized_affine_preimage(const Linear_Expression& lhs,
 
     // Constrain the left hand side expression so that it is congruent to
     // the right hand side expression modulo `mod'.
-    add_congruence((lhs %= rhs) / mod);
+    add_congruence((lhs %= rhs) / tmp_modulus);
 
     // Any image of an empty grid is empty.
     if (is_empty())
       return;
 
-    // FIXME: Confirm that it is OK for this to follow the
-    //        add_congruence, whereas in the branch above (and in
-    //        affine_image, and in Polyhedron) it comes first.
-    // Cylindrificate on all the variables occurring in `lhs'.
-    add_recycled_generators(new_lines);
+    // Existentially quantify all the variables occurring in `lhs'.
+    add_recycled_grid_generators(new_lines);
   }
   assert(OK());
 }
 
 void
+PPL::Grid::
+bounded_affine_image(const Variable var,
+		     const Linear_Expression& lb_expr,
+		     const Linear_Expression& ub_expr,
+		     Coefficient_traits::const_reference denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+				 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+				 "ub", ub_expr);
+
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // In all other cases, generalized_affine_preimage() must
+  // just add a line in the direction of var.
+  generalized_affine_image(var,
+			   LESS_OR_EQUAL,
+			   ub_expr,
+			   denominator);
+
+  assert(OK());
+}
+
+
+void
+PPL::Grid::
+bounded_affine_preimage(const Variable var,
+			const Linear_Expression& lb_expr,
+			const Linear_Expression& ub_expr,
+			Coefficient_traits::const_reference denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+				 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // In all other cases, generalized_affine_preimage() must
+  // just add a line in the direction of var.
+  generalized_affine_preimage(var,
+			      LESS_OR_EQUAL,
+			      ub_expr,
+			      denominator);
+
+  assert(OK());
+}
+
+void
 PPL::Grid::time_elapse_assign(const Grid& y) {
   Grid& x = *this;
   // Check dimension-compatibility.
@@ -2011,19 +2539,15 @@ PPL::Grid::time_elapse_assign(const Grid& y) {
 
   // At this point both generator systems are up-to-date.
   Grid_Generator_System gs = y.gen_sys;
-  dimension_type gs_num_rows = gs.num_generators();
+  dimension_type gs_num_rows = gs.num_rows();
 
   normalize_divisors(gs, gen_sys);
 
   for (dimension_type i = gs_num_rows; i-- > 0; ) {
     Grid_Generator& g = gs[i];
-    if (g.is_point()) {
+    if (g.is_point())
       // Transform the point into a parameter.
-      TEMP_INTEGER(div);
-      div = g.divisor();
-      g.divisor() = 0;
-      g.divisor() = div;
-    }
+      g.set_is_parameter();
   }
 
   if (gs_num_rows == 0)
@@ -2096,7 +2620,8 @@ PPL::Grid::is_disjoint_from(const Grid& y) const {
   if (space_dim != y.space_dim)
     throw_dimension_incompatible("is_disjoint_from(y)", "y", y);
   Grid z = *this;
-  return !z.intersection_assign_and_minimize(y);
+  z.intersection_assign(y);
+  return z.is_empty();
 }
 
 void
@@ -2127,7 +2652,7 @@ PPL::Grid::ascii_dump(std::ostream& s) const {
   s << endl;
 }
 
-PPL_OUTPUT_DEFINITIONS(Grid);
+PPL_OUTPUT_DEFINITIONS(Grid)
 
 bool
 PPL::Grid::ascii_load(std::istream& s) {
@@ -2192,8 +2717,7 @@ PPL::Grid::ascii_load(std::istream& s) {
     }
   }
 
-
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
diff --git a/src/Grid_simplify.cc b/src/Grid_simplify.cc
index 66a2cbe..2182a87 100644
--- a/src/Grid_simplify.cc
+++ b/src/Grid_simplify.cc
@@ -1,11 +1,11 @@
 /* Grid class implementation: simplify().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,200 +20,136 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include <cassert>
 
 #include "Grid.defs.hh"
 
 namespace Parma_Polyhedra_Library {
 
-#define TRACE(x)
-//#define TRACE(x) x
-
-TRACE(using std::endl);
-TRACE(using std::cerr);
-
-#ifdef STRONG_REDUCTION
-template <typename M, typename R>
 void
-Grid::reduce_reduced(M& sys, dimension_type dim, dimension_type pivot_index,
-		     dimension_type start, dimension_type end,
-		     Dimension_Kinds& dim_kinds, bool generators) {
-  R& pivot = sys[pivot_index];
-
-  TEMP_INTEGER(pivot_dim);
-  pivot_dim = pivot[dim];
-
-  if (pivot_dim == 0)
-    return;
-
-  TEMP_INTEGER(pivot_dim_half);
-  pivot_dim_half = (pivot_dim + 1) / 2;
-  Dimension_Kind row_kind = dim_kinds[dim];
-  Dimension_Kind line_or_equality, virtual_kind;
-  int jump;
-  if (generators) {
-    line_or_equality = LINE;
-    virtual_kind = GEN_VIRTUAL;
-    jump = -1;
-  } else {
-    line_or_equality = EQUALITY;
-    virtual_kind = CON_VIRTUAL;
-    jump = 1;
-  }
-
-  for (dimension_type row_index = pivot_index, kinds_index = dim + jump;
-       row_index-- > 0;
-       kinds_index += jump) {
-    // Move over any virtual rows.
-    while (dim_kinds[kinds_index] == virtual_kind)
-      kinds_index += jump;
-
-    if (row_kind == line_or_equality
-	|| (row_kind == PARAMETER // a.k.a. CONGRUENCE
-	    && dim_kinds[kinds_index] == PARAMETER)) {
-      R& row = sys[row_index];
-
-      TEMP_INTEGER(row_dim);
-      row_dim = row[dim];
-      // num_rows_to_subtract may be positive or negative.
-      TEMP_INTEGER(num_rows_to_subtract);
-      num_rows_to_subtract = row_dim / pivot_dim;
-
-      // Ensure that after subtracting num_rows_to_subtract * r_dim
-      // from row_dim,
-      // -pivot_dim_half < row_dim <= pivot_dim_half.  E.g., if pivot[dim] =
-      // 9, then after strong reduction -5 < row_dim <= 5.
-      Coefficient& row_dim_rem = row_dim;
-      row_dim_rem %= pivot_dim;
-      if (row_dim_rem < 0) {
-	if (row_dim_rem <= -pivot_dim_half)
-	  --num_rows_to_subtract;
-      }
-      else if (row_dim_rem > 0 && row_dim_rem > pivot_dim_half)
-	num_rows_to_subtract++;
-
-      // Subtract num_rows_to_subtract copies of pivot from row i.  Only the
-      // entries from dim need to be subtracted, as the preceding
-      // entries are all zero.
-      // If num_rows_to_subtract is negative, these copies of pivot are
-      // added to row i.
-      if (num_rows_to_subtract != 0)
-	for (dimension_type col = start; col <= end; ++col)
-	  row[col] -= num_rows_to_subtract * pivot[col];
-    }
-  }
-}
-#endif // STRONG_REDUCTION
-
-inline void
 Grid::reduce_line_with_line(Grid_Generator& row, Grid_Generator& pivot,
 			    dimension_type column) {
-  TRACE(cerr << "reduce_line_with_line" << endl);
-
-  TEMP_INTEGER(gcd);
-  gcd_assign(gcd, pivot[column], row[column]);
+  const Coefficient& pivot_column = pivot[column];
+  Coefficient& row_column = row[column];
+  TEMP_INTEGER(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
   // Store the reduced ratio between pivot[column] and row[column].
-  TEMP_INTEGER(red_pivot_col);
-  TEMP_INTEGER(red_row_col);
-  red_pivot_col = pivot[column] / gcd;
-  red_row_col = row[column] / gcd;
+  TEMP_INTEGER(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
   // Multiply row, then subtract from it a multiple of pivot such that
   // the result in row[column] is zero.
-  row[column] = 0;
-  for (dimension_type col = pivot.size() - 2 /* parameter divisor, index */;
+  row_column = 0;
+  // pivot.size() - 1 is the index for the parameter divisor so we
+  // start reducing the line at index pivot.size() - 2.
+  for (dimension_type col = pivot.size() - 2;
        col > column;
-       --col)
-    row[col] = (red_pivot_col * row[col]) - (red_row_col * pivot[col]);
+       --col) {
+    Coefficient& row_col = row[col];
+    row_col *= reduced_pivot_col;
+    sub_mul_assign(row_col, reduced_row_col, pivot[col]);
+  }
 }
 
-inline void
-Grid::reduce_equality_with_equality(Congruence& row, Congruence& pivot,
-				    dimension_type column) {
-  TRACE(cerr << "reduce_equality_with_equality" << endl);
+void
+Grid::reduce_equality_with_equality(Congruence& row,
+				    const Congruence& pivot,
+				    const dimension_type column) {
   // Assume two equalities.
   assert(row.modulus() == 0 && pivot.modulus() == 0);
 
-  TEMP_INTEGER(gcd);
-  gcd_assign(gcd, pivot[column], row[column]);
+  const Coefficient& pivot_column = pivot[column];
+  Coefficient& row_column = row[column];
+  TEMP_INTEGER(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
   // Store the reduced ratio between pivot[column] and row[column].
-  TEMP_INTEGER(red_pivot_col);
-  TEMP_INTEGER(red_row_col);
-  red_pivot_col = pivot[column] / gcd;
-  red_row_col = row[column] / gcd;
+  TEMP_INTEGER(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
   // Multiply row, then subtract from it a multiple of pivot such that
   // the result in row[column] is zero.
-  row[column] = 0;
-  for (dimension_type col = 0; col < column; ++col)
-    row[col] = (red_pivot_col * row[col]) - (red_row_col * pivot[col]);
+  row_column = 0;
+  for (dimension_type col = column; col-- > 0; ) {
+    Coefficient& row_col = row[col];
+    row_col *= reduced_pivot_col;
+    sub_mul_assign(row_col, reduced_row_col, pivot[col]);
+  }
 }
 
 template <typename R>
 void
 Grid::reduce_pc_with_pc(R& row, R& pivot,
-			dimension_type column,
-			dimension_type start,
-			dimension_type end) {
-  TEMP_INTEGER(gcd);
+			const dimension_type column,
+			const dimension_type start,
+			const dimension_type end) {
+  Coefficient& pivot_column = pivot[column];
+  Coefficient& row_column = row[column];
+
   TEMP_INTEGER(s);
   TEMP_INTEGER(t);
-  gcdext_assign(gcd, pivot[column], row[column], s, t);
+  TEMP_INTEGER(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcdext_assign(reduced_row_col, s, t, pivot_column, row_column);
   // Now pivot[column] * s + row[column] * t == gcd.
-  TRACE(cerr << "  gcd " << gcd << ", s " << s << ", t " << t << endl);
 
   // Store the reduced ratio between pivot[column] and row[column].
-  TEMP_INTEGER(red_pivot_col);
-  TEMP_INTEGER(red_row_col);
-  red_pivot_col = pivot[column] / gcd;
-  red_row_col = row[column] / gcd;
-  TRACE(cerr << "  red_pivot_col " << red_pivot_col
-	     << ", red_row_col " << red_row_col << endl);
+  TEMP_INTEGER(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  pivot_column = reduced_row_col /* gcd */;
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
 
   // Multiply row, then subtract from it a multiple of pivot such that
-  // the result in row[column] is zero.  Afterwards, multiply pivot,
+  // the result in row[column] is zero.  Afterward, multiply pivot,
   // then add to it a (possibly negative) multiple of row such that
   // the result in pivot[column] is the smallest possible positive
   // integer.
   assert(pivot.size() > 0);
   assert(row.size() > 0);
-  pivot[column] = gcd;
-  row[column] = 0;
+  row_column = 0;
+  TEMP_INTEGER(old_pivot_col);
   for (dimension_type col = start; col < end; ++col) {
-    TEMP_INTEGER(pivot_col);
-    TEMP_INTEGER(row_col);
-    pivot_col = pivot[col];
-    row_col = row[col];
-    pivot[col] = (s * pivot_col) + (t * row_col);
-    row[col] = (red_pivot_col * row_col) - (red_row_col * pivot_col);
+    Coefficient& pivot_col = pivot[col];
+    old_pivot_col = pivot_col;
+    pivot_col *= s;
+    Coefficient& row_col = row[col];
+    add_mul_assign(pivot_col, t, row_col);
+    row_col *= reduced_pivot_col;
+    sub_mul_assign(row_col, reduced_row_col, old_pivot_col);
   }
 }
 
 void
 Grid::reduce_parameter_with_line(Grid_Generator& row,
-				 Grid_Generator& pivot,
-				 dimension_type column,
+				 const Grid_Generator& pivot,
+				 const dimension_type column,
 				 Grid_Generator_System& sys) {
   // Very similar to reduce_congruence_with_equality below.  Any
   // change here may be needed there too.
-  TRACE(cerr << "reduce_parameter_with_line" << endl);
 
-  dimension_type num_cols = sys.num_columns() - 1 /* parameter divisor */;
+  const Coefficient& pivot_column = pivot[column];
+  Coefficient& row_column = row[column];
+
+  // Subtract one to allow for the parameter divisor column
+  const dimension_type num_columns = sys.num_columns() - 1;
 
   // If the elements at column in row and pivot are the same, then
   // just subtract pivot from row.
-  if (row[column] == pivot[column]) {
-    for (dimension_type col = 0; col < num_cols; ++col)
+  if (row_column == pivot_column) {
+    for (dimension_type col = num_columns; col-- > 0; )
       row[col] -= pivot[col];
     return;
   }
 
-  TEMP_INTEGER(gcd);
-  gcd_assign(gcd, pivot[column], row[column]);
+  TEMP_INTEGER(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
   // Store the reduced ratio between pivot[column] and row[column].
-  TEMP_INTEGER(red_pivot_col);
-  TEMP_INTEGER(red_row_col);
-  red_pivot_col = pivot[column] / gcd;
-  red_row_col = row[column] / gcd;
+  TEMP_INTEGER(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
 
   // Multiply row such that a multiple of pivot can be subtracted from
   // it below to render row[column] zero.  This requires multiplying
@@ -222,72 +158,76 @@ Grid::reduce_parameter_with_line(Grid_Generator& row,
   // Ensure that the multiplier is positive, so that the preceding
   // diagonals (including the divisor) remain positive.  It's safe to
   // swap the signs as row[column] will still come out 0.
-  if (red_pivot_col < 0) {
-    neg_assign(red_pivot_col);
-    neg_assign(red_row_col);
+  if (reduced_pivot_col < 0) {
+    neg_assign(reduced_pivot_col);
+    neg_assign(reduced_row_col);
   }
 #endif
-  for (dimension_type index = 0; index < sys.num_generators(); ++index) {
-    Grid_Generator& row = sys[index];
-    if (row.is_parameter_or_point())
-      for (dimension_type col = 0; col < num_cols; ++col)
-        row[col] *= red_pivot_col;
+  for (dimension_type index = sys.num_rows(); index-- > 0; ) {
+    Grid_Generator& gen = sys[index];
+    if (gen.is_parameter_or_point())
+      for (dimension_type col = num_columns; col-- > 0; )
+        gen[col] *= reduced_pivot_col;
   }
   // Subtract from row a multiple of pivot such that the result in
   // row[column] is zero.
-  row[column] = 0;
-  for (dimension_type col = num_cols - 1; col > column; --col)
-    row[col] -= red_row_col * pivot[col];
+  row_column = 0;
+  for (dimension_type col = num_columns - 1; col > column; --col)
+    sub_mul_assign(row[col], reduced_row_col, pivot[col]);
 }
 
 void
 Grid::reduce_congruence_with_equality(Congruence& row,
-				      Congruence& pivot,
-				      dimension_type column,
+				      const Congruence& pivot,
+				      const dimension_type column,
 				      Congruence_System& sys) {
   // Very similar to reduce_parameter_with_line above.  Any change
   // here may be needed there too.
-  TRACE(cerr << "reduce_congruence_with_equality" << endl);
   assert(row.modulus() > 0 && pivot.modulus() == 0);
 
-  dimension_type num_cols = sys.num_columns();
+  const Coefficient& pivot_column = pivot[column];
+  Coefficient& row_column = row[column];
+
+  dimension_type num_columns = sys.num_columns();
 
   // If the elements at `column' in row and pivot are the same, then
   // just subtract `pivot' from `row'.
-  if (row[column] == pivot[column]) {
-    for (dimension_type col = 0; col < num_cols; ++col)
+  if (row_column == pivot_column) {
+    for (dimension_type col = num_columns; col-- > 0; )
       row[col] -= pivot[col];
     return;
   }
 
-  TEMP_INTEGER(gcd);
-  gcd_assign(gcd, pivot[column], row[column]);
-  TEMP_INTEGER(red_pivot_col);
-  TEMP_INTEGER(red_row_a);
-  red_pivot_col = pivot[column] / gcd;
-  red_row_a = row[column] / gcd;
-  // Ensure that `red_pivot_col' is positive, so that the modulus
+  TEMP_INTEGER(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
+  TEMP_INTEGER(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+  // Ensure that `reduced_pivot_col' is positive, so that the modulus
   // remains positive when multiplying the proper congruences below.
   // It's safe to swap the signs as row[column] will still come out 0.
-  if (red_pivot_col < 0) {
-    neg_assign(red_pivot_col);
-    neg_assign(red_row_a);
+  if (reduced_pivot_col < 0) {
+    neg_assign(reduced_pivot_col);
+    neg_assign(reduced_row_col);
   }
-  // Multiply `row', including the modulus, by red_pivot_col.  To keep
-  // all the moduli the same this requires multiplying all the other
-  // proper congruences in the same way.
-  for (dimension_type index = 0; index < sys.num_rows(); ++index) {
-    Congruence& row = sys[index];
-    if (row.is_proper_congruence())
-      for (dimension_type col = 0; col < num_cols; ++col)
-        row[col] *= red_pivot_col;
+  // Multiply `row', including the modulus, by reduced_pivot_col.  To
+  // keep all the moduli the same this requires multiplying all the
+  // other proper congruences in the same way.
+  for (dimension_type index = sys.num_rows(); index-- > 0; ) {
+    Congruence& cg = sys[index];
+    if (cg.is_proper_congruence())
+      for (dimension_type col = num_columns; col-- > 0; )
+        cg[col] *= reduced_pivot_col;
   }
-  --num_cols;			// Modulus.
-  row[column] = 0;
+  // Column num_columns contains the modulus, so start at the next
+  // column.
+  --num_columns;
+  row_column = 0;
   // Subtract from row a multiple of pivot such that the result in
   // row[column] is zero.
-  for (dimension_type col = 0; col < column; ++col)
-    row[col] -= red_row_a * pivot[col];
+  for (dimension_type col = column; col-- > 0; )
+    sub_mul_assign(row[col], reduced_row_col, pivot[col]);
 }
 
 #ifndef NDEBUG
@@ -296,7 +236,7 @@ bool
 Grid::rows_are_zero(M& system, dimension_type first,
 		    dimension_type last, dimension_type row_size) {
   while (first <= last) {
-    R& row = system[first++];
+    const R& row = system[first++];
     for (dimension_type col = 0; col < row_size; ++col)
       if (row[col] != 0)
 	return false;
@@ -307,48 +247,37 @@ Grid::rows_are_zero(M& system, dimension_type first,
 
 void
 Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
-  TRACE(cerr << "==== simplify (reduce) gs:" << endl);
-  TRACE(cerr << "sys:" << endl);
-  TRACE(sys.ascii_dump(cerr));
-  assert(sys.num_generators() > 0);
-  assert(sys.num_columns() > 0); // For reduce_pc_with_pc.
+  assert(!sys.has_no_rows());
+  // For reduce_pc_with_pc.
+  assert(sys.num_columns() > 0);
 
   // Changes here may also be required in the congruence version
   // below.
 
-  dimension_type num_cols = sys.num_columns() - 1 /* parameter divisor */;
+  // Subtract one to allow for the parameter divisor column
+  const dimension_type num_columns = sys.num_columns() - 1;
 
-  if (dim_kinds.size() != num_cols)
-    dim_kinds.resize(num_cols);
+  if (dim_kinds.size() != num_columns)
+    dim_kinds.resize(num_columns);
 
-  dimension_type num_rows = sys.num_generators();
-  TRACE(cerr << "  num_rows " << num_rows << endl);
+  const dimension_type num_rows = sys.num_rows();
 
   // For each dimension `dim' move or construct a row into position
   // `pivot_index' such that the row has zero in all elements
   // following column `dim' and a value other than zero in column
   // `dim'.
   dimension_type pivot_index = 0;
-  for (dimension_type dim = 0; dim < num_cols; ++dim) {
-    TRACE(cerr << "dim " << dim << endl);
-    trace_dim_kinds("  ", dim_kinds);
-
+  for (dimension_type dim = 0; dim < num_columns; ++dim) {
     // Consider the pivot and following rows.
     dimension_type row_index = pivot_index;
-    TRACE(cerr << "  row_index " << row_index << endl);
 
     // Move down over rows which have zero in column `dim'.
-    while (row_index < num_rows && sys[row_index][dim] == 0) {
-      TRACE(cerr << "  .");
+    while (row_index < num_rows && sys[row_index][dim] == 0)
       ++row_index;
-    }
-    TRACE(cerr << endl);
 
-    if (row_index == num_rows) {
+    if (row_index == num_rows)
       // Element in column `dim' is zero in all rows from the pivot.
-      TRACE(cerr << "  Marking virtual row" << endl);
       dim_kinds[dim] = GEN_VIRTUAL;
-    }
     else {
       if (row_index != pivot_index)
 	std::swap(sys[row_index], sys[pivot_index]);
@@ -357,10 +286,8 @@ Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
 
       // Change the matrix so that the value at `dim' in every row
       // following `pivot_index' is 0, leaving an equivalent grid.
-      TRACE(cerr << "  Reducing all following rows" << endl);
       while (row_index < num_rows - 1) {
 	++row_index;
-	TRACE(cerr << "    row_index " << row_index << endl);
 
 	Grid_Generator& row = sys[row_index];
 
@@ -382,7 +309,7 @@ Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
 	    reduce_parameter_with_line(row, pivot, dim, sys);
 	  else {
 	    assert(pivot.is_parameter_or_point());
-	    reduce_pc_with_pc(row, pivot, dim, dim + 1, num_cols);
+	    reduce_pc_with_pc(row, pivot, dim, dim + 1, num_columns);
 	  }
 	}
       }
@@ -397,29 +324,28 @@ Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
 #ifdef STRONG_REDUCTION
       // Ensure a positive follows the leading zeros.
       if (pivot[dim] < 0)
-	pivot.negate(dim, num_cols - 1);
-      TRACE(cerr << "  rr pivot_index " << pivot_index << endl);
-      TRACE(sys.ascii_dump(cerr));
+	pivot.negate(dim, num_columns - 1);
+
       // Factor this row out of the preceding rows.
       reduce_reduced<Grid_Generator_System, Grid_Generator>
-	(sys, dim, pivot_index, dim, num_cols - 1, dim_kinds);
+	(sys, dim, pivot_index, dim, num_columns - 1, dim_kinds);
 #endif
 
       ++pivot_index;
     }
-    TRACE(sys.ascii_dump(cerr));
   }
-  trace_dim_kinds("gs simpl end ", dim_kinds);
 
   // Clip any zero rows from the end of the matrix.
   if (num_rows > pivot_index) {
-    TRACE(cerr << "clipping trailing" << endl);
 #ifndef NDEBUG
-    bool ret = rows_are_zero<Grid_Generator_System,Grid_Generator>
+    const bool ret = rows_are_zero<Grid_Generator_System, Grid_Generator>
       (sys,
-       pivot_index,		 // index of first
-       sys.num_generators() - 1, // index of last
-       sys.num_columns() - 1);	 // row size
+       // index of first
+       pivot_index,
+       // index of last
+       sys.num_rows() - 1,
+       // row size
+       sys.num_columns() - 1);
     assert(ret == true);
 #endif
     sys.erase_to_end(pivot_index);
@@ -429,30 +355,24 @@ Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
 
   // Ensure that the parameter divisors are the same as the system
   // divisor.
-  TRACE(cerr << "updating param divisors" << endl);
-  Coefficient_traits::const_reference system_divisor = sys[0][0];
-  for (dimension_type row = 1, dim = 1, num_cols = sys.num_columns() - 1;
-       dim < num_cols;
-       ++dim)
+  const Coefficient& system_divisor = sys[0][0];
+  for (dimension_type row = sys.num_rows() - 1,
+	 dim = sys.num_columns() - 2;
+       dim > 0; --dim)
     switch (dim_kinds[dim]) {
     case PARAMETER:
-      sys[row].divisor() = system_divisor;
+      sys[row].set_divisor(system_divisor);
     case LINE:
-      ++row;
+      --row;
     case GEN_VIRTUAL:
       break;
     }
 
   assert(sys.OK());
-
-  TRACE(cerr << "---- simplify (reduce) gs done." << endl);
 }
 
 bool
 Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
-  TRACE(cerr << "======== simplify (reduce) cgs:" << endl);
-  TRACE(cerr << "sys:" << endl);
-  TRACE(sys.ascii_dump(cerr));
   assert(sys.num_columns() > 2);
 
   // Changes here may also be required in the generator version above.
@@ -461,40 +381,30 @@ Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
   //       added to con_sys.
   sys.normalize_moduli();
 
-  dimension_type num_cols = sys.num_columns() - 1 /* modulus */;
+  const dimension_type num_columns = sys.num_columns() - 1 /* modulus */;
 
-  if (dim_kinds.size() != num_cols)
-    dim_kinds.resize(num_cols);
+  if (dim_kinds.size() != num_columns)
+    dim_kinds.resize(num_columns);
 
-  dimension_type num_rows = sys.num_rows();
-  TRACE(cerr << "  num_rows " << num_rows << endl);
+  const dimension_type num_rows = sys.num_rows();
 
   // For each dimension `dim' move or construct a row into position
   // `pivot_index' such that the row has a value of zero in all
   // elements preceding column `dim' and some other value in column
   // `dim'.
   dimension_type pivot_index = 0;
-  for (dimension_type dim = num_cols; dim-- > 0; ) {
-    TRACE(cerr << "dim " << dim << endl);
-    trace_dim_kinds("  ", dim_kinds);
-
+  for (dimension_type dim = num_columns; dim-- > 0; ) {
     // Consider the pivot and following rows.
     dimension_type row_index = pivot_index;
-    TRACE(cerr << "  row_index " << row_index << endl);
 
     // Move down over rows which have zero in column `dim'.
-    while (row_index < num_rows && sys[row_index][dim] == 0) {
-      TRACE(cerr << "  .");
+    while (row_index < num_rows && sys[row_index][dim] == 0)
       ++row_index;
-    }
-    TRACE(cerr << endl);
 
-    if (row_index == num_rows) {
+    if (row_index == num_rows)
       // Element in column `dim' is zero in all rows from the pivot,
       // or `sys' is empty of rows.
-      TRACE(cerr << "  Marking virtual row" << endl);
       dim_kinds[dim] = CON_VIRTUAL;
-    }
     else {
       // row_index != num_rows
       if (row_index != pivot_index)
@@ -504,10 +414,8 @@ Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
 
       // Change the matrix so that the value at `dim' in every row
       // following `pivot_index' is 0, leaving an equivalent grid.
-      TRACE(cerr << "  Reducing all following rows" << endl);
       while (row_index < num_rows - 1) {
 	++row_index;
-	TRACE(cerr << "    row_index " << row_index << endl);
 
 	Congruence& row = sys[row_index];
 
@@ -551,32 +459,10 @@ Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
 #endif
       ++pivot_index;
     }
-    TRACE(sys.ascii_dump(cerr));
-  } // end for (dimension_type dim = num_cols; dim-- > 0; )
-
-  dimension_type& reduced_num_rows = pivot_index; // For clearer naming.
-
-  // Clip any zero rows from the end of the matrix.
-  if (num_rows > 1 && num_rows > reduced_num_rows) {
-    TRACE(cerr << "clipping trailing" << endl);
-#ifndef NDEBUG
-    bool ret = rows_are_zero<Congruence_System,Congruence>
-      (sys,
-       reduced_num_rows,	// index of first
-       num_rows - 1,		// index of last
-       num_cols);		// row size
-    assert(ret == true);
-#endif
-    // Don't erase the last row as this will be changed to the integrality row.
-    // FIXME Simplify and improve code if possible.
-    if (reduced_num_rows > 0)
-      sys.erase_to_end(reduced_num_rows);
-    else
-      sys.erase_to_end(1);
-  }
+  } // end for (dimension_type dim = num_columns; dim-- > 0; )
 
-  assert(sys.num_rows() == reduced_num_rows
-	 || (sys.num_rows() == 1 && reduced_num_rows == 0));
+  // For clearer naming.
+  dimension_type& reduced_num_rows = pivot_index;
 
   if (reduced_num_rows > 0) {
     // If the last row is false then make it the equality 1 = 0, and
@@ -600,28 +486,59 @@ Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
       std::swap(sys.rows[0], sys.rows.back());
       sys.erase_to_end(1);
 
-      trace_dim_kinds("cgs simpl end ", dim_kinds);
       assert(sys.OK());
-      TRACE(cerr << "---- simplify (reduce) cgs done (empty)." << endl);
       return true;
     }
   }
-  else if (num_rows > 0) {
-    assert(sys.num_rows() == 1);
-    // All columns up to the modulus column must have been zero, set
-    // up the integrality congruence.
+  else {
+    // Either sys is empty (it defines the universe) or every column
+    // before the modulus column contains only zeroes.
+
+    // Set up the integrality congruence.
     dim_kinds[0] = PROPER_CONGRUENCE;
-    sys[0][num_cols] = 1;
+    if (num_rows == 0) {
+      sys.add_zero_rows(1,
+			Linear_Row::Flags(NECESSARILY_CLOSED,
+					  Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+      Congruence& cg = sys[0];
+      cg[num_columns] = 1;
+      cg[0] = 1;
+
+      assert(sys.OK());
+      return false;
+    }
+    sys[0][num_columns] = 1;
+    // Ensure that, after any zero row clipping below, a single row
+    // will remain for the integrality congruence.
     reduced_num_rows = 1;
   }
 
+  // Clip any zero rows from the end of the matrix.
+  if (num_rows > 1 && num_rows > reduced_num_rows) {
+#ifndef NDEBUG
+    const bool ret = rows_are_zero<Congruence_System, Congruence>
+      (sys,
+       // index of first
+       reduced_num_rows,
+       // index of last
+       num_rows - 1,
+       // row size
+       num_columns);
+    assert(ret == true);
+#endif
+    sys.erase_to_end(reduced_num_rows);
+  }
+
+  assert(sys.num_rows() == reduced_num_rows);
+
   // Ensure that the last row is the integrality congruence.
-  dimension_type mod_index = num_cols;
+  const dimension_type mod_index = num_columns;
   if (dim_kinds[0] == CON_VIRTUAL) {
     // The last row is virtual, append the integrality congruence.
     dim_kinds[0] = PROPER_CONGRUENCE;
-    sys.add_zero_rows(1, Linear_Row::Flags(NECESSARILY_CLOSED,
-					   Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+    sys.add_zero_rows(1,
+		      Linear_Row::Flags(NECESSARILY_CLOSED,
+					Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
     Congruence& new_last_row = sys[reduced_num_rows];
     new_last_row[mod_index] = 1;
     // Try use an existing modulus.
@@ -649,12 +566,8 @@ Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
     (sys, 0, reduced_num_rows - 1, 0, 0, dim_kinds, false);
 #endif
 
-  trace_dim_kinds("cgs simpl end ", dim_kinds);
   assert(sys.OK());
-  TRACE(cerr << "---- simplify (reduce) cgs done." << endl);
   return false;
 }
 
-#undef TRACE
-
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_widenings.cc b/src/Grid_widenings.cc
index 4635c42..46b0876 100644
--- a/src/Grid_widenings.cc
+++ b/src/Grid_widenings.cc
@@ -1,12 +1,12 @@
 /* Grid class implementation
    (non-inline widening-related member functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Grid.defs.hh"
 
@@ -72,15 +72,15 @@ PPL::Grid::select_wider_congruences(const Grid& y,
 }
 
 void
-PPL::Grid::widening_assign(const Grid& const_y, unsigned* tp) {
+PPL::Grid::congruence_widening_assign(const Grid& const_y, unsigned* tp) {
   Grid& x = *this;
   Grid& y = const_cast<Grid&>(const_y);
   // Dimension-compatibility check.
   if (x.space_dim != y.space_dim)
     throw_dimension_incompatible("widening_assign(y)", "y", y);
 
-  // As noted in definitions.dox, stable behaviour is only garaunteed
-  // if y is contained in or equal to x.
+  // Stable behavior is only guaranteed if y is contained in or equal
+  // to x.
 #ifndef NDEBUG
   {
     // Assume y is contained in or equal to x.
@@ -156,6 +156,314 @@ PPL::Grid::widening_assign(const Grid& const_y, unsigned* tp) {
 }
 
 void
+PPL::Grid::limited_congruence_extrapolation_assign(const Grid& y,
+						   const Congruence_System& cgs,
+						   unsigned* tp) {
+  Grid& x = *this;
+
+  // Check dimension compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+				 "y", y);
+  // `cgs' must be dimension-compatible with the two grids.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (x.space_dim < cgs_space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+				 "cgs", cgs);
+
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  // If `cgs' is empty (of rows), fall back to ordinary widening.
+  if (cgs_num_rows == 0) {
+    x.widening_assign(y, tp);
+    return;
+  }
+
+#ifndef NDEBUG
+  {
+    // Assume that y is contained in or equal to x.
+    const Grid x_copy = x;
+    const Grid y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited widening between two grids in a zero-dimensional
+  // space is also a grid in a zero-dimensional space.
+  if (x.space_dim == 0)
+    return;
+
+  // Update the generators of `x': these are used to select, from the
+  // congruences in `cgs', those that must be added to the widened
+  // grid.
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // `x' is empty.
+    return;
+
+  if (tp == NULL || *tp == 0) {
+    // Widening may change the grid, so add the congruences.
+    Congruence_System new_cgs;
+    // The congruences to be added need only be satisfied by all the
+    // generators of `x', as `y <= x'.  Iterate upwards here, to keep
+    // the relative ordering of congruences (just for aesthetics).
+    for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+      const Congruence& cg = cgs[i];
+      if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+	new_cgs.insert(cg);
+    }
+    x.congruence_widening_assign(y, tp);
+    x.add_congruences(new_cgs);
+  }
+  else
+    // There are tokens, so widening will leave the grid the same.
+    x.congruence_widening_assign(y, tp);
+
+  assert(OK());
+}
+
+void
+PPL::Grid::select_wider_generators(const Grid& y,
+				   Grid_Generator_System& ggs_selected) const {
+  // Private method: the caller must ensure the following conditions
+  // (beside the inclusion `y <= x').
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty());
+  assert(!y.marked_empty());
+  assert(generators_are_minimized());
+  assert(y.generators_are_minimized());
+
+  // Note: row counters start at 0, to preserve the original order in
+  // the selected generators.
+  for (dimension_type dim = 0, x_row = 0, y_row = 0;
+       dim <= gen_sys.space_dimension(); ++dim) {
+    assert(dim_kinds[dim] == LINE
+           || y.dim_kinds[dim] == GEN_VIRTUAL
+	   || dim_kinds[dim] == y.dim_kinds[dim]);
+    switch (dim_kinds[dim]) {
+    case PARAMETER:
+      {
+	const Grid_Generator& gg = gen_sys[x_row];
+	const Grid_Generator& y_gg = y.gen_sys[y_row];
+	if (gg.is_equal_at_dimension(dim, y_gg))
+	  // The leading diagonal entry is equal.
+	  ggs_selected.insert(gg);
+        else {
+          Linear_Expression e;
+          for (dimension_type i = gg.space_dimension(); i-- > 0; )
+            e += gg.coefficient(Variable(i)) * Variable(i);
+          ggs_selected.insert(grid_line(e));
+	}
+	++x_row;
+	++y_row;
+      }
+      break;
+    case LINE:
+      ggs_selected.insert(gen_sys[x_row]);
+      ++x_row;
+      ++y_row;
+      break;
+    case GEN_VIRTUAL:
+      y.dim_kinds[dim] == GEN_VIRTUAL || ++y_row;
+      break;
+    }
+  }
+}
+
+void
+PPL::Grid::generator_widening_assign(const Grid& const_y, unsigned* tp) {
+  Grid& x = *this;
+  Grid& y = const_cast<Grid&>(const_y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("generator_widening_assign(y)", "y", y);
+
+  // Stable behavior is only guaranteed if y is contained in or equal
+  // to x.
+#ifndef NDEBUG
+  {
+    // Assume y is contained in or equal to x.
+    const Grid x_copy = x;
+    const Grid y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // Leave `x' the same if `x' or `y' is zero-dimensional or empty.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // Ensure that the `x' generators are in minimal form.
+  if (x.generators_are_up_to_date()) {
+    if (!x.generators_are_minimized()) {
+      simplify(x.gen_sys, x.dim_kinds);
+      assert(!x.gen_sys.has_no_rows());
+      x.set_generators_minimized();
+    }
+  }
+  else
+    x.update_generators();
+
+  if (x.marked_empty())
+    return;
+
+  // Ensure that the `y' generators are in minimal form.
+  if (y.generators_are_up_to_date()) {
+    if (!y.generators_are_minimized()) {
+      simplify(y.gen_sys, y.dim_kinds);
+      assert(!y.gen_sys.has_no_rows());
+      y.set_generators_minimized();
+    }
+  }
+  else
+    y.update_generators();
+
+  if (gen_sys.num_rows() > y.gen_sys.num_rows())
+    return;
+
+  if (gen_sys.num_lines() > y.gen_sys.num_lines())
+    return;
+
+  // Copy into `ggs' the generators of `x' that are common to `y',
+  // according to the grid widening.
+  Grid_Generator_System ggs;
+  x.select_wider_generators(y, ggs);
+
+  if (ggs.num_parameters() == gen_sys.num_parameters())
+    // All parameters are kept as parameters, thus the result is `x'.
+    return;
+
+  // A strict subset of the parameters was selected.
+
+  Grid result(x.space_dim, EMPTY);
+  result.add_recycled_grid_generators(ggs);
+
+  // Check whether we are using the widening-with-tokens technique
+  // and there are still tokens available.
+  if (tp && *tp > 0) {
+    // There are tokens available.  If `result' is not a subset of
+    // `x', then it is less precise and we use one of the available
+    // tokens.
+    if (!x.contains(result))
+      --(*tp);
+  }
+  else
+    // No tokens.
+    std::swap(x, result);
+
+  assert(x.OK(true));
+}
+
+void
+PPL::Grid::limited_generator_extrapolation_assign(const Grid& y,
+						  const Congruence_System& cgs,
+						  unsigned* tp) {
+  Grid& x = *this;
+
+  // Check dimension compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+				 "y", y);
+  // `cgs' must be dimension-compatible with the two grids.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (x.space_dim < cgs_space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+				 "cgs", cgs);
+
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  // If `cgs' is empty (of rows), fall back to ordinary widening.
+  if (cgs_num_rows == 0) {
+    x.generator_widening_assign(y, tp);
+    return;
+  }
+
+#ifndef NDEBUG
+  {
+    // Assume that y is contained in or equal to x.
+    const Grid x_copy = x;
+    const Grid y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited widening between two grids in a zero-dimensional
+  // space is also a grid in a zero-dimensional space.
+  if (x.space_dim == 0)
+    return;
+
+  // Update the generators of `x': these are used to select, from the
+  // congruences in `cgs', those that must be added to the widened
+  // grid.
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // `x' is empty.
+    return;
+
+  if (tp == NULL || *tp == 0) {
+    // Widening may change the grid, so add the congruences.
+    Congruence_System new_cgs;
+    // The congruences to be added need only be satisfied by all the
+    // generators of `x', as `y <= x'.  Iterate upwards here, to keep
+    // the relative ordering of congruences (just for aesthetics).
+    for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+      const Congruence& cg = cgs[i];
+      if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+	new_cgs.insert(cg);
+    }
+    x.generator_widening_assign(y, tp);
+    x.add_congruences(new_cgs);
+  }
+  else
+    // There are tokens, so widening will leave the grid the same.
+    x.generator_widening_assign(y, tp);
+
+  assert(OK());
+}
+
+void
+PPL::Grid::widening_assign(const Grid& const_y, unsigned* tp) {
+  Grid& x = *this;
+  Grid& y = const_cast<Grid&>(const_y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+  // Stable behavior is only guaranteed if y is contained in or equal
+  // to x.
+#ifndef NDEBUG
+  {
+    // Assume y is contained in or equal to x.
+    const Grid x_copy = x;
+    const Grid y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If the `x' congruences are up to date and `y' congruences are up
+  // to date use the congruence widening.
+  if (x.congruences_are_up_to_date() && y.congruences_are_up_to_date()) {
+    x.congruence_widening_assign(y, tp);
+    return;
+  }
+
+  // If the `x' generators are up to date and `y' generators are up to
+  // date use the generator widening.
+  if (x.generators_are_up_to_date() && y.generators_are_up_to_date()) {
+    x.generator_widening_assign(y, tp);
+    return;
+  }
+
+  x.congruence_widening_assign(y, tp);
+}
+
+void
 PPL::Grid::limited_extrapolation_assign(const Grid& y,
 					const Congruence_System& cgs,
 					unsigned* tp) {
@@ -171,7 +479,7 @@ PPL::Grid::limited_extrapolation_assign(const Grid& y,
     throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
 				 "cgs", cgs);
 
-  dimension_type cgs_num_rows = cgs.num_rows();
+  const dimension_type cgs_num_rows = cgs.num_rows();
   // If `cgs' is empty (of rows), fall back to ordinary widening.
   if (cgs_num_rows == 0) {
     x.widening_assign(y, tp);
diff --git a/src/H79_Certificate.cc b/src/H79_Certificate.cc
index c8841d2..6f365f6 100644
--- a/src/H79_Certificate.cc
+++ b/src/H79_Certificate.cc
@@ -1,12 +1,12 @@
 /* H79_Certificate class implementation
    (non-inline member functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "H79_Certificate.defs.hh"
 
diff --git a/src/H79_Certificate.defs.hh b/src/H79_Certificate.defs.hh
index 650f8e3..f21c909 100644
--- a/src/H79_Certificate.defs.hh
+++ b/src/H79_Certificate.defs.hh
@@ -1,11 +1,11 @@
 /* H79_Certificate class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/H79_Certificate.inlines.hh b/src/H79_Certificate.inlines.hh
index 5d951f7..4a0c8b0 100644
--- a/src/H79_Certificate.inlines.hh
+++ b/src/H79_Certificate.inlines.hh
@@ -1,11 +1,11 @@
 /* H79_Certificate class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/H79_Certificate.types.hh b/src/H79_Certificate.types.hh
index d7ea746..93121f3 100644
--- a/src/H79_Certificate.types.hh
+++ b/src/H79_Certificate.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Has_Assign_Or_Swap.hh b/src/Has_Assign_Or_Swap.hh
new file mode 100644
index 0000000..ae8db76
--- /dev/null
+++ b/src/Has_Assign_Or_Swap.hh
@@ -0,0 +1,53 @@
+/* Has_Assign_Or_Swap classes declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Has_Assign_Or_Swap_hh
+#define PPL_Has_Assign_Or_Swap_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is not present by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Has_Assign_Or_Swap : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is present if it is present (!).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Has_Assign_Or_Swap<T,
+			  typename Enable_If_Is<void (T::*)(T& x),
+						&T::assign_or_swap>::type>
+  : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Has_Assign_Or_Swap_hh)
diff --git a/src/Init.cc b/src/Init.cc
index bbbc410..ccb6525 100644
--- a/src/Init.cc
+++ b/src/Init.cc
@@ -1,11 +1,11 @@
 /* Init class implementation (non-inline functions and static variables).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,12 +20,24 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Init.defs.hh"
 #include "Variable.defs.hh"
 #include "fpu.defs.hh"
+#include "Rounding_Dir.defs.hh"
 #include "checked.defs.hh"
+#include "Coefficient.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
+#include "Generator.defs.hh"
+#include "Congruence.defs.hh"
+#include "Grid_Generator.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Generator_System.defs.hh"
+#include "Congruence_System.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include "Polyhedron.defs.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
 
@@ -35,7 +47,7 @@ PPL::fpu_rounding_direction_type PPL::Init::old_rounding_direction;
 
 extern "C" void
 set_GMP_memory_allocation_functions(void)
-#if CXX_SUPPORTS_ATTRIBUTE_WEAK
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
   __attribute__((weak));
 
 void
@@ -50,11 +62,29 @@ PPL::Init::Init() {
   if (count++ == 0) {
     // ... the GMP memory allocation functions are set, ...
     set_GMP_memory_allocation_functions();
-    // ... and the default output function for Variable objects is set.
+    // ... the default output function for Variable objects is set, ...
     Variable::set_output_function(Variable::default_output_function);
+    // ... the Coefficient constants are initialized, ...
+    Coefficient_constants_initialize();
+    // ... the Linear_Expression class is initialized, ...
+    Linear_Expression::initialize();
+    // ... the Constraint, Generator, Congruence, Grid_Generator,
+    // Constraint_System, Generator_System, Congruence_System,
+    // Grid_Generator_System and Polyhedron classes are initialized, ...
+    Constraint::initialize();
+    Generator::initialize();
+    Congruence::initialize();
+    Grid_Generator::initialize();
+    Constraint_System::initialize();
+    Generator_System::initialize();
+    Congruence_System::initialize();
+    Grid_Generator_System::initialize();
+    Polyhedron::initialize();
 #if PPL_CAN_CONTROL_FPU
+    // ... and the FPU rounding direction is set.
+    fpu_initialize_control_functions();
     old_rounding_direction = fpu_get_rounding_direction();
-    fpu_set_rounding_direction(ROUND_DIRECT);
+    fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
 #endif
     // FIXME: is 3200 a magic number?
     set_rational_sqrt_precision_parameter(3200);
@@ -65,7 +95,25 @@ PPL::Init::~Init() {
   // Only when the last Init object is destroyed...
   if (--count == 0) {
 #if PPL_CAN_CONTROL_FPU
+    // ... the FPU rounding direction is restored, ...
     fpu_set_rounding_direction(old_rounding_direction);
 #endif
+    // ... the Polyhedron, Grid_Generator_System, Congruence_System,
+    // Generator_System, Constraint_System, Grid_Generator,
+    // Congruence, Generator and Constraint classes are finalized
+    // IN THAT ORDER, ...
+    Polyhedron::finalize();
+    Grid_Generator_System::finalize();
+    Congruence_System::finalize();
+    Generator_System::finalize();
+    Constraint_System::finalize();
+    Grid_Generator::finalize();
+    Congruence::finalize();
+    Generator::finalize();
+    Constraint::finalize();
+    // ... the Linear_Expression class is finalized, ...
+    Linear_Expression::finalize();
+    // ... and the Coefficient constants are finalized.
+    Coefficient_constants_finalize();
   }
 }
diff --git a/src/Init.defs.hh b/src/Init.defs.hh
index 16b3fb5..9637d50 100644
--- a/src/Init.defs.hh
+++ b/src/Init.defs.hh
@@ -1,11 +1,11 @@
 /* Init class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,6 +26,30 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Init.types.hh"
 #include "fpu.types.hh"
 
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+void set_rounding_for_PPL();
+
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
+
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+void restore_pre_PPL_rounding();
+
+} // namespace Parma_Polyhedra_Library
+
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Class for initialization and finalization.
 /*! \ingroup PPL_CXX_interface
@@ -38,20 +62,25 @@ site: http://www.cs.unipr.it/ppl/ . */
   only one of them will initialize and properly finalize
   the library.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 class Parma_Polyhedra_Library::Init {
-private:
-  //! Count the number of objects created.
-  static unsigned int count;
-  static fpu_rounding_direction_type old_rounding_direction;
-
 public:
   //! Initializes the PPL.
   Init();
 
   //! Finalizes the PPL.
   ~Init();
+
+private:
+  //! Count the number of objects created.
+  static unsigned int count;
+  static fpu_rounding_direction_type old_rounding_direction;
+
+  friend void set_rounding_for_PPL();
+  friend void restore_pre_PPL_rounding();
 };
 
+#include "Init.inlines.hh"
+
+
 #endif // !defined(PPL_Init_defs_hh)
diff --git a/src/Init.inlines.hh b/src/Init.inlines.hh
new file mode 100644
index 0000000..4fd0401
--- /dev/null
+++ b/src/Init.inlines.hh
@@ -0,0 +1,47 @@
+/* Init class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Init_inlines_hh
+#define PPL_Init_inlines_hh 1
+
+#include "fpu.defs.hh"
+#include "Rounding_Dir.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+set_rounding_for_PPL() {
+#if PPL_CAN_CONTROL_FPU
+    fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+#endif
+}
+
+inline void
+restore_pre_PPL_rounding() {
+#if PPL_CAN_CONTROL_FPU
+  fpu_set_rounding_direction(Init::old_rounding_direction);
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Init_inlines_hh)
diff --git a/src/Init.types.hh b/src/Init.types.hh
index e44df35..d5dbc34 100644
--- a/src/Init.types.hh
+++ b/src/Init.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Interval.cc b/src/Interval.cc
deleted file mode 100644
index 73e4e1c..0000000
--- a/src/Interval.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Non-inline functions for the Interval class and its constituents.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-
-#include "Interval.defs.hh"
-#include <iostream>
-
-namespace PPL = Parma_Polyhedra_Library;
-
-bool
-PPL::LBoundary::OK() const {
-  if (flag != POS && flag != ZERO) {
-#ifndef NDEBUG
-    std::cerr << "Invalid flag in LBoundary: " << flag << std::endl;
-#endif
-    return false;
-  }
-  return true;
-}
-
-bool
-PPL::UBoundary::OK() const {
-  if (flag != NEG && flag != ZERO) {
-#ifndef NDEBUG
-    std::cerr << "Invalid flag in UBoundary: " << flag << std::endl;
-#endif
-    return false;
-  }
-  return true;
-}
-
-bool
-PPL::Interval::OK() const {
-  return lower.OK() && upper.OK();
-}
diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh
index 952e693..09f0b3d 100644
--- a/src/Interval.defs.hh
+++ b/src/Interval.defs.hh
@@ -1,11 +1,11 @@
 /* Declarations for the Interval class and its constituents.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,182 +23,865 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Interval_defs_hh
 #define PPL_Interval_defs_hh 1
 
+#include "globals.defs.hh"
+#include "meta_programming.hh"
+#include "assign_or_swap.hh"
 #include "Interval.types.hh"
-#include "Coefficient.defs.hh"
-#include "Checked_Number.defs.hh"
-#include <gmpxx.h>
+#include "Interval_Info.defs.hh"
 #include <iosfwd>
 
-namespace Parma_Polyhedra_Library {
-
-typedef Checked_Number<mpq_class, Extended_Number_Policy> ERational;
-
-}
+// Temporary!
+#include <iostream>
 
 namespace Parma_Polyhedra_Library {
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x is less than \p y.
-/*! \relates Boundary */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator<(const Boundary& x, const Boundary& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x is greater than \p y.
-/*! \relates Boundary */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator>(const Boundary& x, const Boundary& y);
+enum I_Result {
+  I_EMPTY = 0,
+  /*
+  I_L_EQ = V_EQ,
+  I_L_GT = V_GT,
+  I_L_GE = V_GE,
+  I_U_EQ = V_EQ << 6,
+  I_U_LT = V_LT << 6,
+  I_U_LE = V_LE << 6,
+  */
+  I_MAYBE_EMPTY = 1 << 12,
+  I_SINGULARITIES = 1 << 13
+};
 
-} // namespace Parma_Polyhedra_Library
+enum Ternary { T_YES, T_NO, T_MAYBE };
 
+inline I_Result
+combine(Result l, Result u) {
+  return static_cast<I_Result>(l | (u << 6));
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An extended rational bound of an interval.
-/*! \ingroup PPL_CXX_interface
-  An object of class Boundary represents either an upper or a lower
-  bound of an interval over the set of extended rational numbers.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Boundary {
-protected:
-  //! Kinds of bounds.
-  enum Flag {
-    //! An open upper bound.
-    NEG = -1,
-    //! A closed (lower or upper) bound.
-    ZERO = 0,
-    //! An open lower bound.
-    POS = 1
-  };
-
-  //! The extended rational value of the bound.
-  ERational value;
-  //! The kind of the bound.
-  Flag flag;
-
-  //! Builds a bound of kind \p f and having value \p v.
-  Boundary(const ERational& v, Flag f);
-
-  friend bool
-  Parma_Polyhedra_Library::operator<(const Boundary& x, const Boundary& y);
-  friend bool
-  Parma_Polyhedra_Library::operator>(const Boundary& x, const Boundary& y);
+inline Result
+lower(I_Result r) {
+  return static_cast<Result>(r & 63);
+}
 
-public:
-  //! Returns <CODE>true</CODE> if and only if \p *this is a closed bound.
-  bool is_closed() const;
+inline Result
+upper(I_Result r) {
+  return static_cast<Result>((r >> 6) & 63);
+}
 
-  //! Returns a const reference to the value of the bound.
-  const ERational& bound() const;
+template <typename Info>
+inline bool
+unrepresentability_error(I_Result r, const Info&) {
+  return !Info::store_special
+    && (is_special(lower(r)) || is_special(upper(r)));
+}
 
-  //! Returns a reference to the value of the bound.
-  ERational& bound();
-};
+using namespace Boundary_NS;
+using namespace Interval_NS;
 
+struct Interval_Base {};
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The lower bound of an extended rational interval.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::LBoundary : public Boundary {
-public:
-  //! Kinds of lower bounds.
-  enum Open_Closed {
-    //! An open lower bound.
-    OPEN = Boundary::POS,
-    //! A closed lower bound.
-    CLOSED = Boundary::ZERO
-  };
-
-  //! Builds a lower bound of kind \p f and having value \p v.
-  LBoundary(const ERational& v, Open_Closed f);
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+template <typename T, typename Enable = void>
+struct Is_Singleton : public Is_Native_Or_Checked<T> {};
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The upper bound of an extended rational interval.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::UBoundary : public Boundary {
-public:
-  //! Kinds of upper bounds.
-  enum Open_Closed {
-    //! An open upper bound.
-    OPEN = Boundary::NEG,
-    //! A closed upper bound.
-    CLOSED = Boundary::ZERO
-  };
-
-  //! Builds an upper bound of kind \p f and having value \p v.
-  UBoundary(const ERational& v, Open_Closed f);
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+template <typename T>
+struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A interval over the set of rational numbers.
+//! A generic, not necessarily closed, possibly restricted interval.
 /*! \ingroup PPL_CXX_interface
-  An object of class Interval represents a closed/half-closed/open
-  interval over the set of rational numbers \f$\Qset\f$.
-
-  Note that, even though the implementation is capable to represent
-  any interval on the set of <EM>extended</EM> rational numbers,
-  the available public methods only allows for the construction
-  and manipulation of intervals over \f$\Qset\f$.
-  Namely, it is not possible to create a non-empty interval having
-  a <EM>closed</EM> bound whose value is \f$-\infty\f$ or \f$+\infty\f$.
+  FIXME: to be written.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-
-class Parma_Polyhedra_Library::Interval {
-public:
-  //! Constructs the universe interval \f$(-\infty, +\infty) = \Qset\f$.
-  Interval();
-
-  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
-  bool is_empty() const;
-
-  //! Returns a const reference to the interval's lower bound.
-  const LBoundary& lower_bound() const;
-
-  //! Returns a reference to the interval's lower bound.
-  LBoundary& lower_bound();
+template <typename Boundary, typename Info>
+class Interval : public Interval_Base, private Info {
+private:
+  COMPILE_TIME_CHECK(!Info::store_special
+		     || !std::numeric_limits<Boundary>::has_infinity,
+		     "store_special is meaningless"
+		     " when boundary type may contains infinity");
+  Info& w_info() const {
+    return const_cast<Interval&>(*this);
+  }
+  bool is_empty_nocache() const {
+    return lt(UPPER, upper(), info(), LOWER, lower(), info());
+  }
+  bool is_singleton_nocache() const {
+    return eq(LOWER, lower(), info(), UPPER, upper(), info());
+  }
+  Result lower_normalize() const {
+    Result r;
+    if (info().get_boundary_property(LOWER, NORMALIZED)
+	|| info().get_boundary_property(LOWER, SPECIAL))
+      r = V_EQ;
+    else {
+      if (info().get_boundary_property(LOWER, OPEN)) {
+	r = info().restrict(lower(), V_GT);
+	if (r != V_GT)
+	  w_info().set_boundary_property(LOWER, OPEN, false);
+      }
+      else {
+	r = info().restrict(lower(), V_GE);
+	if (r == V_GT)
+	  w_info().set_boundary_property(LOWER, OPEN);
+      }
+      w_info().set_boundary_property(LOWER, NORMALIZED);
+    }
+    return r;
+  }
+  Result upper_normalize() const {
+    Result r;
+    if (info().get_boundary_property(UPPER, NORMALIZED)
+	|| info().get_boundary_property(UPPER, SPECIAL))
+      r = V_EQ;
+    else {
+      if (info().get_boundary_property(UPPER, OPEN)) {
+	r = info().restrict(upper(), V_LT);
+	if (r != V_LT)
+	  w_info().set_boundary_property(UPPER, OPEN, false);
+      }
+      else {
+	r = info().restrict(upper(), V_LE);
+	if (r == V_LT)
+	  w_info().set_boundary_property(UPPER, OPEN);
+      }
+      w_info().set_boundary_property(UPPER, NORMALIZED);
+    }
+    return r;
+  }
 
-  //! Returns a const reference to the interval's upper bound.
-  const UBoundary& upper_bound() const;
 
-  //! Returns a reference to the interval's upper bound.
-  UBoundary& upper_bound();
+public:
+  typedef Boundary boundary_type;
+  typedef Info info_type;
+
+  typedef Interval_NS::Property Property;
+
+  void lower_load() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    lower_loaded = 1;
+#endif
+  }
+
+  void upper_load() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    upper_loaded = 1;
+#endif
+  }
+
+  void complete_init() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    assert(lower_loaded);
+    assert(upper_loaded);
+    completed = 1;
+#endif
+  }
+
+  void complete_init_internal() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    lower_loaded = 1;
+    upper_loaded = 1;
+    completed = 1;
+#endif
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator=(const T& x) {
+    assign(x);
+    return *this;
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator+=(const T& x) {
+    add_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator-=(const T& x) {
+    sub_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator*=(const T& x) {
+    mul_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator/=(const T& x) {
+    div_assign(*this, x);
+    return *this;
+  }
+
+  //! Swaps \p *this with \p y.
+  void swap(Interval& y);
+
+  Info& info() {
+    return *this;
+  }
+
+  const Info& info() const {
+    return *this;
+  }
+
+  Boundary& lower() {
+    return lower_;
+  }
+
+  const Boundary& lower() const {
+    return lower_;
+  }
+
+  Boundary& upper() {
+    return upper_;
+  }
+
+  const Boundary& upper() const {
+    return upper_;
+  }
+
+  Ternary is_empty_cached() const {
+    if (info().get_interval_property(CARDINALITY_0))
+      return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO;
+    else if (info().get_interval_property(CARDINALITY_IS))
+      return T_NO;
+    else
+      return T_MAYBE;
+  }
+
+  Ternary is_singleton_cached() const {
+    if (info().get_interval_property(CARDINALITY_1))
+      return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO;
+    else if (info().get_interval_property(CARDINALITY_IS))
+      return T_NO;
+    else
+      return T_MAYBE;
+  }
+
+  bool is_empty() const {
+    switch (is_empty_cached()) {
+    case T_NO:
+      return false;
+    case T_YES:
+      return true;
+    case T_MAYBE:
+      bool r = is_empty_nocache();
+      if (r) {
+	w_info().set_interval_property(CARDINALITY_IS, r);
+	w_info().set_interval_property(CARDINALITY_1, false);
+      }
+      w_info().set_interval_property(CARDINALITY_0);
+      return r;
+    }
+    assert(false);
+    return false;
+  }
+
+  bool is_singleton() const {
+    switch (is_singleton_cached()) {
+    case T_NO:
+      return false;
+    case T_YES:
+      return true;
+    case T_MAYBE:
+      bool r = is_singleton_nocache();
+      if (r) {
+	w_info().set_interval_property(CARDINALITY_IS, r);
+	w_info().set_interval_property(CARDINALITY_0, false);
+      }
+      w_info().set_interval_property(CARDINALITY_1);
+      return r;
+    }
+    assert(false);
+    return false;
+  }
+
+  bool has_restriction() const {
+    return info().has_restriction();
+  }
+
+  I_Result normalize() const {
+    assert(OK());
+    if (has_restriction()) {
+      Result rl = lower_normalize();
+      Result ru = upper_normalize();
+      // FIXME: this invalidation is not needed if interval is unchanged
+      invalidate_cardinality_cache();
+      info().normalize();
+      assert(OK());
+      return combine(rl, ru);
+    }
+    else
+      return combine(V_EQ, V_EQ);
+  }
+
+  bool lower_is_open() const {
+    assert(OK());
+    return is_open(LOWER, lower(), info());
+  }
+
+  bool upper_is_open() const {
+    assert(OK());
+    return is_open(UPPER, upper(), info());
+  }
+
+  Result lower_shrink() {
+    assert(OK());
+    return shrink(LOWER, lower(), info());
+  }
+
+  Result upper_shrink() {
+    assert(OK());
+    return shrink(UPPER, upper(), info());
+  }
+
+  bool lower_is_unbounded() const {
+    assert(OK());
+    return Boundary_NS::is_unbounded(LOWER, lower(), info());
+  }
+
+  bool upper_is_unbounded() const {
+    assert(OK());
+    return Boundary_NS::is_unbounded(UPPER, upper(), info());
+  }
+
+  bool is_unbounded() const {
+    assert(OK());
+    return lower_is_unbounded() || upper_is_unbounded();
+  }
+
+  bool is_universe() const {
+    assert(OK());
+    return lower_is_unbounded() && upper_is_unbounded()
+      && !has_restriction();
+  }
+
+  void invalidate_cardinality_cache() const {
+    w_info().set_interval_property(CARDINALITY_IS, false);
+    w_info().set_interval_property(CARDINALITY_0, false);
+    w_info().set_interval_property(CARDINALITY_1, false);
+  }
+
+  template <typename T>
+  I_Result lower_set_uninit(const T& x, bool open = false) {
+    info().clear_boundary_properties(LOWER);
+    Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open));
+    lower_load();
+    return combine(rl, V_EQ);
+  }
+
+  I_Result lower_set_uninit(const Unbounded&) {
+    info().clear_boundary_properties(LOWER);
+    Result rl = set_unbounded(LOWER, lower(), info());
+    lower_load();
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result lower_set(const T& x, bool open = false) {
+    assert(OK());
+    info().clear_boundary_properties(LOWER);
+    Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open));
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  I_Result lower_set(const Unbounded&) {
+    assert(OK());
+    info().clear_boundary_properties(LOWER);
+    Result rl = set_unbounded(LOWER, lower(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result lower_narrow(const T& x, bool open = false) {
+    assert(OK());
+    if (ge(LOWER, lower(), info(), LOWER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return lower_set(x, open);
+  }
+
+  template <typename T>
+  I_Result lower_widen(const T& x, bool open = false) {
+    assert(OK());
+    if (le(LOWER, lower(), info(), LOWER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return lower_set(x, open);
+  }
+
+  I_Result lower_widen(const Unbounded&) {
+    assert(OK());
+    if (lower_is_unbounded())
+      return combine(V_EQ, V_EQ);
+    info().clear_boundary_properties(LOWER);
+    Result rl = set_unbounded(LOWER, lower(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result upper_set_uninit(const T& x, bool open = false) {
+    info().clear_boundary_properties(UPPER);
+    Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open));
+    upper_load();
+    return combine(rl, V_EQ);
+  }
+  I_Result upper_set_uninit(const Unbounded&) {
+    info().clear_boundary_properties(UPPER);
+    Result rl = set_unbounded(UPPER, upper(), info());
+    upper_load();
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result upper_set(const T& x, bool open = false) {
+    assert(OK());
+    info().clear_boundary_properties(UPPER);
+    Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open));
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  I_Result upper_set(const Unbounded&) {
+    assert(OK());
+    info().clear_boundary_properties(UPPER);
+    Result rl = set_unbounded(UPPER, upper(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result upper_narrow(const T& x, bool open = false) {
+    assert(OK());
+    if (le(UPPER, upper(), info(), UPPER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return upper_set(x, open);
+  }
+
+  template <typename T>
+  I_Result upper_widen(const T& x, bool open = false) {
+    assert(OK());
+    if (ge(UPPER, upper(), info(), UPPER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return upper_set(x, open);
+  }
+
+  I_Result upper_widen(const Unbounded&) {
+    assert(OK());
+    if (upper_is_unbounded())
+      return combine(V_EQ, V_EQ);
+    info().clear_boundary_properties(UPPER);
+    Result rl = set_unbounded(UPPER, upper(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  I_Result assign(Degenerate_Element e) {
+    info().clear();
+    switch (e) {
+    case EMPTY:
+      info().set_interval_property(CARDINALITY_IS);
+      info().set_interval_property(CARDINALITY_0);
+      lower_set_uninit(1);
+      upper_set_uninit(0);
+      break;
+    case UNIVERSE:
+      info().set_interval_property(CARDINALITY_0, true);
+      info().set_interval_property(CARDINALITY_1, true);
+      lower_set_uninit(UNBOUNDED);
+      upper_set_uninit(UNBOUNDED);
+      break;
+    default:
+      assert(0);
+      break;
+    }
+    complete_init();
+    assert(OK());
+    return I_EMPTY;
+  }
+
+  I_Result set_infinities() {
+    info().clear();
+    info().set_interval_property(CARDINALITY_0, true);
+    info().set_interval_property(CARDINALITY_1, true);
+    // FIXME: what about restrictions?
+    Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+    Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+    complete_init_internal();
+    assert(OK());
+    return combine(rl, ru);
+  }
+
+  bool is_topologically_closed() const {
+    assert(OK());
+    return !Info::store_open
+      || is_empty()
+      || ((lower_is_unbounded() || !lower_is_open())
+          && (upper_is_unbounded() || !upper_is_open()));
+  }
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign() {
+    if (!Info::store_open || is_empty())
+      return;
+
+    if (!lower_is_unbounded())
+      info().set_boundary_property(LOWER, OPEN, false);
+
+    if (!upper_is_unbounded())
+      info().set_boundary_property(UPPER, OPEN, false);
+  }
+
+  bool is_infinity() const {
+    assert(OK());
+    if (is_reverse_infinity(LOWER, lower(), info()))
+      return 1;
+    else if (is_reverse_infinity(UPPER, upper(), info()))
+      return -1;
+    else
+      return 0;
+  }
+
+  bool contains_integer_point() const {
+    assert(OK());
+    if (is_empty())
+      return false;
+    if (is_unbounded())
+      return true;
+    Boundary l;
+    if (lower_is_open()) {
+      add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
+      floor_assign_r(l, l, ROUND_DOWN);
+    }
+    else
+      ceil_assign_r(l, lower(), ROUND_DOWN);
+    Boundary u;
+    if (upper_is_open()) {
+      sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
+      ceil_assign_r(u, u, ROUND_UP);
+    }
+    else
+      floor_assign_r(u, upper(), ROUND_UP);
+    return u >= l;
+  }
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+  bool OK() const {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    if (!completed) {
+	std::cerr << "The interval initialization has not been completed."
+                  << std::endl;
+	return false;
+    }
+#endif
+#if 0
+    if (!Info::may_be_empty && is_empty()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is unexpectedly empty.\n";
+#endif
+	return false;
+    }
+#endif
+
+    if (is_open(LOWER, lower(), info())) {
+      if (is_plus_infinity(LOWER, lower(), info())) {
+#ifndef NDEBUG
+	std::cerr << "The lower boundary is +inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+	     && (is_minus_infinity(LOWER, lower(), info())
+		 || is_plus_infinity(LOWER, lower(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The lower boundary is unexpectedly infinity.\n";
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(LOWER, SPECIAL)) {
+      if (is_not_a_number(lower())) {
+#ifndef NDEBUG
+	std::cerr << "The lower boundary is not a number.\n";
+#endif
+	return false;
+      }
+#if 0
+      if (info().get_boundary_property(LOWER, NORMALIZED)
+	  && !info().is_restricted(lower())) {
+#ifndef NDEBUG
+	std::cerr << "The lower boundary is marked to be normalized, "
+                  << "but it is not.\n";
+#endif
+	return false;
+      }
+#endif
+    }
+
+    if (is_open(UPPER, upper(), info())) {
+      if (is_minus_infinity(UPPER, upper(), info())) {
+#ifndef NDEBUG
+	std::cerr << "The upper boundary is -inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+	     && (is_minus_infinity(UPPER, upper(), info())
+		 || is_plus_infinity(UPPER, upper(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The upper boundary is unexpectedly infinity."
+                << std::endl;
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(UPPER, SPECIAL)) {
+      if (is_not_a_number(upper())) {
+#ifndef NDEBUG
+	std::cerr << "The upper boundary is not a number.\n";
+#endif
+	return false;
+      }
+#if 0
+      if (info().get_boundary_property(UPPER, NORMALIZED)
+	  && !info().is_restricted(upper())) {
+#ifndef NDEBUG
+	std::cerr << "The upper boundary is marked to be normalized, "
+                  << "but it is not.\n";
+#endif
+	return false;
+      }
+#endif
+    }
+
+    Ternary t;
+
+    t = is_empty_cached();
+    if (t == T_YES) {
+      if (!is_empty_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be empty, "
+                  << "but actually it is not empty.\n";
+#endif
+	return false;
+      }
+    }
+    else if (t == T_NO) {
+      if (is_empty_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be not empty, "
+                  << "but actually it is empty.\n";
+#endif
+	return false;
+      }
+    }
+
+    t = is_singleton_cached();
+    if (t == T_YES) {
+      if (!is_singleton_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be singleton, "
+                  << "but actually it is not singleton.\n";
+#endif
+	return false;
+      }
+    }
+    else if (t == T_NO) {
+      if (is_singleton_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be not singleton, "
+                  << "but actually it is singleton.\n";
+#endif
+	return false;
+      }
+    }
+
+    if (info().get_interval_property(CARDINALITY_IS) &&
+	info().get_interval_property(CARDINALITY_0)
+        == info().get_interval_property(CARDINALITY_1)) {
+#ifndef NDEBUG
+      std::cerr << "The interval is marked to know its cardinality, "
+                << "but this is unspecified or ambiguous.\n";
+#endif
+      return false;
+    }
+
+    // Everything OK.
+    return true;
+  }
+
+  Interval()
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    : lower_loaded(0), upper_loaded(0), completed(0)
+#endif
+  {
+  }
+
+  template <typename T>
+  explicit Interval(const T& x)
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    : lower_loaded(0), upper_loaded(0), completed(0)
+#endif
+  {
+    assign(x);
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+  contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+  strictly_contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  is_disjoint_from(const T& y) const;
+
+  template <typename From1, typename From2>
+  I_Result assign(const From1& l, const From2& u);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  assign(const From& x);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  join_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  join_assign(const From1& x, const From2& y);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  intersect_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  intersect_assign(const From1& x, const From2& y);
 
   /*! \brief
-    Raises the interval's lower bound, if \p new_lower is higher
-    than the current one.
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p *this and \p x.
   */
-  void raise_lower_bound(LBoundary new_lower);
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  difference_assign(const From& x);
 
   /*! \brief
-    Lowers the interval's upper bound, if \p new_upper is lower
-    than the current one.
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p x and \p y.
   */
-  void lower_upper_bound(UBoundary new_upper);
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  difference_assign(const From1& x, const From2& y);
 
-  //! Turns \p *this into the empty interval.
-  void set_empty();
+  /*! \brief
+    Refines \p to according to the existential relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \exists b \in \mathtt{x} \st a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  refine_existential(Relation_Symbol rel, const From& x);
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+  /*! \brief
+    Refines \p to so that it satisfies the universal relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \forall b \in \mathtt{x} \itc a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  refine_universal(Relation_Symbol rel, const From& x);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  neg_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  add_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  sub_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  mul_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  div_assign(const From1& x, const From2& y);
+
+  template <typename From, typename Iterator>
+  typename Enable_If<Is_Interval<From>::value, void>::type
+  CC76_widening_assign(const From& y, Iterator first, Iterator last);
 
 private:
-  //! The interval's lower bound.
-  LBoundary lower;
-
-  //! The interval's upper bound.
-  UBoundary upper;
+  Boundary lower_;
+  Boundary upper_;
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+  unsigned int lower_loaded:1;
+  unsigned int upper_loaded:1;
+  unsigned int completed:1;
+#endif
 };
 
+} // namespace Parma_Polyhedra_Library
+
 #include "Interval.inlines.hh"
+#include "Interval.templates.hh"
 
 #endif // !defined(PPL_Interval_defs_hh)
diff --git a/src/Interval.inlines.hh b/src/Interval.inlines.hh
index d93c3ac..a49618c 100644
--- a/src/Interval.inlines.hh
+++ b/src/Interval.inlines.hh
@@ -1,11 +1,11 @@
 /* Inline functions for the Interval class and its constituents.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,105 +23,1241 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Interval_inlines_hh
 #define PPL_Interval_inlines_hh 1
 
-#include <cassert>
-#include "Checked_Number.defs.hh"
-#include "checked_mpz.inlines.hh"
-
 namespace Parma_Polyhedra_Library {
 
-inline
-Boundary::Boundary(const ERational& v, Flag f)
-  : value(v), flag(f) {
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::external_memory_in_bytes() const {
+  return Parma_Polyhedra_Library::external_memory_in_bytes(lower())
+    + Parma_Polyhedra_Library::external_memory_in_bytes(upper());
+}
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
 }
 
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::swap(Interval<Boundary, Info>& y) {
+  std::swap(lower(), y.lower());
+  std::swap(upper(), y.upper());
+  std::swap(info(), y.info());
+}
+
+template <typename Boundary, typename Info>
+inline bool
+f_is_empty(const Interval<Boundary, Info>& x) {
+  return x.is_empty();
+}
+template <typename Boundary, typename Info>
 inline bool
-Boundary::is_closed() const {
-  return flag == ZERO;
+f_is_singleton(const Interval<Boundary, Info>& x) {
+  return x.is_singleton();
+}
+template <typename Boundary, typename Info>
+inline int
+is_infinity(const Interval<Boundary, Info>& x) {
+  return x.is_infinity();
+}
+
+namespace Interval_NS {
+
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_lower(const Interval<Boundary, Info>& x) {
+  return x.lower();
+}
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_upper(const Interval<Boundary, Info>& x) {
+  return x.upper();
+}
+template <typename Boundary, typename Info>
+inline const Info&
+f_info(const Interval<Boundary, Info>& x) {
+  return x.info();
 }
 
-inline const ERational&
-Boundary::bound() const {
-  return value;
+struct Scalar_As_Interval_Policy {
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, true);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Restriction_None<Interval_Info_Null<Scalar_As_Interval_Policy> > Scalar_As_Interval_Info;
+
+const Scalar_As_Interval_Info SCALAR_INFO;
+
+typedef Interval_Restriction_None<Interval_Info_Null_Open<Scalar_As_Interval_Policy> > Scalar_As_Interval_Info_Open;
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_lower(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_upper(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const Scalar_As_Interval_Info&>::type
+f_info(const T&) {
+  return SCALAR_INFO;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Scalar_As_Interval_Info_Open>::type
+f_info(const T&, bool open) {
+  return Scalar_As_Interval_Info_Open(open);
 }
 
-inline ERational&
-Boundary::bound() {
-  return value;
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_empty(const T& x) {
+  return is_not_a_number(x);
 }
 
-inline
-LBoundary::LBoundary(const ERational& v, Open_Closed f)
-  : Boundary(v, f == CLOSED ? ZERO : POS) {
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_singleton(const T& x) {
+  return !f_is_empty(x);
 }
 
-inline
-UBoundary::UBoundary(const ERational& v, Open_Closed f)
-  : Boundary(v, f == CLOSED ? ZERO : NEG) {
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Ternary>::type
+f_is_empty_lazy(const T& x) {
+  if (f_info(x).get_interval_property(CARDINALITY_0))
+    return f_info(x).get_interval_property(CARDINALITY_IS) ? T_YES : T_NO;
+  else
+    return T_MAYBE;
 }
 
-/*! \relates Boundary */
+} // namespace Interval_NS
+
 inline bool
-operator<(const Boundary& x, const Boundary& y) {
-  return x.value < y.value ||
-    (x.value == y.value && x.flag < y.flag);
+is_integer(const char*) {
+  // FIXME:
+  return false;
 }
 
-/*! \relates Boundary */
 inline bool
-operator>(const Boundary& x, const Boundary& y) {
-  return y < x;
+is_not_a_number(const char*) {
+  // FIXME:
+  return false;
 }
 
-inline
-Interval::Interval()
-  : lower(ERational(MINUS_INFINITY), LBoundary::OPEN),
-    upper(ERational(PLUS_INFINITY), UBoundary::OPEN) {
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+is_singleton_integer(const T& x) {
+  return is_singleton(x) && is_integer(f_lower(x));
 }
 
+template <typename T1, typename T2>
 inline bool
-Interval::is_empty() const {
-  return lower > upper;
+same_object(const T1&, const T2&) {
+  return false;
 }
 
-inline const LBoundary&
-Interval::lower_bound() const {
-  return lower;
+template <typename T>
+inline bool
+same_object(const T& x, const T& y) {
+  return &x == &y;
 }
 
-inline LBoundary&
-Interval::lower_bound() {
-  return lower;
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+check_empty_arg(const T& x) {
+  if (f_info(x).may_be_empty)
+    return f_is_empty(x);
+  else {
+    assert(!f_is_empty(x));
+    return false;
+  }
 }
 
-inline const UBoundary&
-Interval::upper_bound() const {
-  return upper;
+template <typename Boundary, typename Info>
+inline I_Result
+check_empty_result(const Interval<Boundary, Info>& x, I_Result r) {
+  if (Info::check_empty_result && f_is_empty(x))
+    return I_EMPTY;
+  else
+    return static_cast<I_Result>(r | I_MAYBE_EMPTY);
 }
 
-inline UBoundary&
-Interval::upper_bound() {
-  return upper;
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value || Is_Interval<T1>::value)
+			   && (Is_Singleton<T2>::value || Is_Interval<T2>::value)
+			   && (Is_Interval<T1>::value || Is_Interval<T2>::value)),
+			  bool>::type
+operator==(const T1& x, const T2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x))
+    return check_empty_arg(y);
+  else if (check_empty_arg(y))
+    return false;
+  return eq_restriction(f_info(x), f_info(y))
+    && eq(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y))
+    && eq(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
 }
 
-inline void
-Interval::raise_lower_bound(LBoundary new_lower) {
-  if (new_lower > lower)
-    lower = new_lower;
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value || Is_Interval<T1>::value)
+			   && (Is_Singleton<T2>::value || Is_Interval<T2>::value)
+			   && (Is_Interval<T1>::value || Is_Interval<T2>::value)),
+			  bool>::type
+operator!=(const T1& x, const T2& y) {
+  return !(x == y);
 }
 
-inline void
-Interval::lower_upper_bound(UBoundary new_upper) {
-  if (new_upper < upper)
-    upper = new_upper;
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::contains(const T& y) const {
+  assert(OK());
+  assert(f_OK(y));
+  if (check_empty_arg(y))
+    return true;
+  if (check_empty_arg(*this))
+    return false;
+  if (!contains_restriction(info(), f_info(y)))
+      return false;
+  return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+    && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
 }
 
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::strictly_contains(const T& y) const {
+  assert(OK());
+  assert(f_OK(y));
+  if (check_empty_arg(y))
+    return !check_empty_arg(*this);
+  if (check_empty_arg(*this))
+    return false;
+  if (!contains_restriction(y))
+      return false;
+  else if (!eq_restriction(*this, y))
+    return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+      && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+  return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+	  && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)))
+    || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+	&& gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::is_disjoint_from(const T& y) const {
+  assert(OK());
+  assert(f_OK(y));
+  if (check_empty_arg(*this) || check_empty_arg(y))
+    return true;
+//   CHECKME.
+//   if (!contains_restriction(info(), f_info(y)))
+//       return false;
+  return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))
+    || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline I_Result
+Interval<To_Boundary, To_Info>::assign(const From1& l, const From2& u) {
+  info().clear();
+  Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, l, f_info(l));
+  Result ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, u, f_info(u));
+  complete_init_internal();
+  assert(OK());
+  // The following Parma_Polyhedra_Library:: qualification is to work
+  // around a bug in version 10.0 of the Intel C/C++ compiler.
+  return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::assign(const From& x) {
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!assign_restriction(to_info, x))
+    return assign(EMPTY);
+  Result rl = Boundary_NS::assign(LOWER, lower(), to_info,
+				  LOWER, f_lower(x), f_info(x));
+  Result ru = Boundary_NS::assign(UPPER, upper(), to_info,
+				  UPPER, f_upper(x), f_info(x));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From& x) {
+  assert(f_OK(x));
+  if (check_empty_arg(*this))
+    return assign(x);
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  if (!join_restriction(info(), *this, x))
+    return assign(EMPTY);
+  info().set_interval_property(CARDINALITY_IS, false);
+  info().set_interval_property(CARDINALITY_0);
+  info().set_interval_property(CARDINALITY_1, false);
+  Result rl, ru;
+  rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x))
+    return assign(y);
+  if (check_empty_arg(y))
+    return assign(x);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!join_restriction(to_info, x, y))
+    return assign(EMPTY);
+  to_info.set_interval_property(CARDINALITY_0);
+  Result rl, ru;
+  rl = min_assign(LOWER, lower(), to_info,
+		  LOWER, f_lower(x), f_info(x),
+		  LOWER, f_lower(y), f_info(y));
+  ru = max_assign(UPPER, upper(), to_info,
+		  UPPER, f_upper(x), f_info(x),
+		  UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From& x) {
+  assert(f_OK(x));
+  if (!intersect_restriction(info(), *this, x))
+    return assign(EMPTY);
+  // FIXME: more accurate?
+  invalidate_cardinality_cache();
+  Result rl, ru;
+  rl = max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  ru = min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  assert(OK());
+  // The following Parma_Polyhedra_Library:: qualification is to work
+  // around a bug in version 10.0 of the Intel C/C++ compiler.
+  return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From1& x,
+                                                 const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!intersect_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  rl = max_assign(LOWER, lower(), to_info,
+		  LOWER, f_lower(x), f_info(x),
+		  LOWER, f_lower(y), f_info(y));
+  ru = min_assign(UPPER, upper(), to_info,
+		  UPPER, f_upper(x), f_info(x),
+		  UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  // The following Parma_Polyhedra_Library:: qualification is to work
+  // around a bug in version 10.0 of the Intel C/C++ compiler.
+  return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From& x) {
+  assert(f_OK(x));
+  if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)) ||
+      gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+    return combine(V_EQ, V_EQ);
+  bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  Result rl = V_EQ, ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x));
+  }
+  else if (nu)
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x));
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From1& x,
+                                                  const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y)) ||
+      gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y)))
+    return assign(x);
+  bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y));
+  bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+  Result rl = V_EQ, ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else {
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y));
+      ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+    }
+  }
+  else if (nu) {
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  }
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>
+::refine_existential(Relation_Symbol rel, const From& x) {
+  assert(OK());
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      UPPER, f_upper(x), f_info(x), true);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      UPPER, f_upper(x), f_info(x));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      LOWER, f_lower(x), f_info(x), true);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      LOWER, f_lower(x), f_info(x));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case EQUAL:
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (!f_is_singleton(x))
+	return combine(V_EQ, V_EQ);
+      if (check_empty_arg(*this))
+	return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	lower_shrink();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	upper_shrink();
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, V_EQ));
+    }
+  default:
+    assert(false);
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::refine_universal(Relation_Symbol rel,
+                                                 const From& x) {
+  assert(OK());
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      LOWER, f_lower(x), SCALAR_INFO, !is_open(LOWER, f_lower(x), f_info(x)));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      LOWER, f_lower(x), SCALAR_INFO);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      UPPER, f_upper(x), SCALAR_INFO, !is_open(UPPER, f_upper(x), f_info(x)));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      UPPER, f_upper(x), SCALAR_INFO);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case EQUAL:
+    if (!f_is_singleton(x))
+      return assign(EMPTY);
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (check_empty_arg(*this))
+	return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	lower_shrink();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	upper_shrink();
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, V_EQ));
+    }
+  default:
+    assert(false);
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::neg_assign(const From& x) {
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!neg_restriction(to_info, x))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x));
+  ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::add_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  if (inf) {
+    if (Parma_Polyhedra_Library::is_infinity(y) == -inf)
+      return assign(EMPTY);
+  }
+  else
+    inf = Parma_Polyhedra_Library::is_infinity(y);
+  if (inf < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf > 0)
+    return assign(PLUS_INFINITY);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!add_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info,
+				      LOWER, f_lower(x), f_info(x),
+				      LOWER, f_lower(y), f_info(y));
+  Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info,
+				      UPPER, f_upper(x), f_info(x),
+				      UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::sub_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  if (inf) {
+    if (Parma_Polyhedra_Library::is_infinity(y) == inf)
+      return assign(EMPTY);
+  }
+  else
+    inf = -Parma_Polyhedra_Library::is_infinity(y);
+  if (inf < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf > 0)
+    return assign(PLUS_INFINITY);
+
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!sub_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info,
+			       LOWER, f_lower(x), f_info(x),
+			       UPPER, f_upper(y), f_info(y));
+  ru = Boundary_NS::sub_assign(UPPER, upper(), to_info,
+			       UPPER, f_upper(x), f_info(x),
+			       LOWER, f_lower(y), f_info(y));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+/**
++---------+-----------+-----------+-----------------+
+|    *    |  yl > 0   |  yu < 0   |  yl < 0, yu > 0 |
++---------+-----------+-----------+-----------------+
+| xl > 0  |xl*yl,xu*yu|xu*yl,xl*yu|   xu*yl,xu*yu   |
++---------+-----------+-----------+-----------------+
+| xu < 0  |xl*yu,xu*yl|xu*yu,xl*yl|   xl*yu,xl*yl   |
++---------+-----------+-----------+-----------------+
+|xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),|
+|         |           |           |max(xl*yl,xu*yu) |
++---------+-----------+-----------+-----------------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::mul_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = xls > 0 ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = yls > 0 ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  int ls, us;
+  if (inf) {
+    ls = yls;
+    us = yus;
+    goto inf;
+  }
+  else {
+    inf = Parma_Polyhedra_Library::is_infinity(y);
+    if (inf) {
+      ls = xls;
+      us = xus;
+    inf:
+      if (ls == 0 && us == 0)
+	return assign(EMPTY);
+      if (ls == -us)
+	return set_infinities();
+      if (ls < 0 || us < 0)
+	inf = -inf;
+      if (inf < 0)
+	return assign(MINUS_INFINITY);
+      else
+	return assign(PLUS_INFINITY);
+    }
+  }
+
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!mul_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+
+  if (xls >= 0) {
+    if (yls >= 0) {
+      // 0 <= xl <= xu, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else if (yus <= 0) {
+      // 0 <= xl <= xu, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      // 0 <= xl <= xu, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else if (xus <= 0) {
+    if (yls >= 0) {
+      // xl <= xu <= 0, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (yus <= 0) {
+      // xl <= xu <= 0, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else {
+      // xl <= xu <= 0, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yls >= 0) {
+    // xl < 0 < xu, 0 <= yl <= yu
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+		      LOWER, f_lower(x), f_info(x), xls,
+		      UPPER, f_upper(y), f_info(y), yus);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+		      UPPER, f_upper(x), f_info(x), xus,
+		      UPPER, f_upper(y), f_info(y), yus);
+  }
+  else if (yus <= 0) {
+    // xl < 0 < xu, yl <= yu <= 0
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+		      UPPER, f_upper(x), f_info(x), xus,
+		      LOWER, f_lower(y), f_info(y), yls);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+		      LOWER, f_lower(x), f_info(x), xls,
+		      LOWER, f_lower(y), f_info(y), yls);
+  }
+  else {
+    // xl < 0 < xu, yl < 0 < yu
+    DIRTY_TEMP(To_Boundary, tmp);
+    DIRTY_TEMP(To_Info, tmp_info);
+    tmp_info.clear();
+    Result tmp_r;
+    tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info,
+				    UPPER, f_upper(x), f_info(x),
+				    LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info,
+				 LOWER, f_lower(x), f_info(x),
+				 UPPER, f_upper(y), f_info(y));
+    if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) {
+      to_lower = tmp;
+      rl = tmp_r;
+    }
+    tmp_info.clear();
+    tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info,
+				    UPPER, f_upper(x), f_info(x),
+				    UPPER, f_upper(y), f_info(y));
+    ru = Boundary_NS::mul_assign(UPPER, upper(), to_info,
+				 LOWER, f_lower(x), f_info(x),
+				 LOWER, f_lower(y), f_info(y));
+    if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) {
+      upper() = tmp;
+      ru = tmp_r;
+    }
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+/**
++-----------+-----------+-----------+
+|     /     |  yu < 0   |  yl > 0   |
++-----------+-----------+-----------+
+|   xu<=0   |xu/yl,xl/yu|xl/yl,xu/yu|
++-----------+-----------+-----------+
+|xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl|
++-----------+-----------+-----------+
+|   xl>=0   |xu/yu,xl/yl|xl/yu,xu/yl|
++-----------+-----------+-----------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::div_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = yls > 0 ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  if (yls == 0 && yus == 0)
+    return assign(EMPTY);
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  if (inf) {
+    if (Parma_Polyhedra_Library::is_infinity(y))
+      return assign(EMPTY);
+    if (yls == -yus)
+      return set_infinities();
+    if (yls < 0 || yus < 0)
+      inf = -inf;
+    if (inf < 0)
+      return assign(MINUS_INFINITY);
+    else
+      return assign(PLUS_INFINITY);
+  }
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = xls > 0 ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!div_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+  if (yls >= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yus <= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else {
+    // FIXME: restrictions
+    return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES);
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator+(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator-(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator*(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator/(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename Boundary, typename Info>
+inline std::ostream&
+operator<<(std::ostream& os, const Interval<Boundary, Info>& x) {
+  // assert(x.OK());
+  if (check_empty_arg(x))
+    return os << "[]";
+  if (x.is_singleton()) {
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+    return os;
+  }
+  os << (x.lower_is_open() ? "(" : "[");
+  if (x.info().get_boundary_property(LOWER, SPECIAL))
+    os << "-inf";
+  else
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << ", ";
+  if (x.info().get_boundary_property(UPPER, SPECIAL))
+    os << "+inf";
+  else
+    output(os, x.upper(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << (x.upper_is_open() ? ")" : "]");
+  output_restriction(os, x.info());
+  return os;
+}
+
+template <typename Boundary, typename Info>
 inline void
-Interval::set_empty() {
-  lower = LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN);
-  upper = UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN);
-  assert(is_empty());
+Interval<Boundary, Info>::ascii_dump(std::ostream& s) const {
+  using Parma_Polyhedra_Library::ascii_dump;
+  s << "info ";
+  info().ascii_dump(s);
+  s << " lower ";
+  ascii_dump(s, lower());
+  s << " upper ";
+  ascii_dump(s, upper());
+  s << '\n';
 }
 
+template <typename Boundary, typename Info>
+inline bool
+Interval<Boundary, Info>::ascii_load(std::istream& s) {
+  using Parma_Polyhedra_Library::ascii_load;
+  std::string str;
+  if (!(s >> str) || str != "info")
+    return false;
+  if (!info().ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "lower")
+    return false;
+  if (!ascii_load(s, lower()))
+    return false;
+  if (!(s >> str) || str != "upper")
+    return false;
+  if (!ascii_load(s, upper()))
+    return false;
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+  complete_init_internal();
+#endif
+  assert(OK());
+  return true;
+}
+
+/*! \brief
+  Helper class to select the appropriate numerical type to perform
+  boundary computations so as to reduce the chances of overflow without
+  incurring too much overhead.
+*/
+template <typename Interval_Boundary_Type> struct Select_Temp_Boundary_Type;
+
+template <typename Interval_Boundary_Type>
+struct Select_Temp_Boundary_Type {
+  typedef Interval_Boundary_Type type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<float> {
+  typedef double type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long long> {
+  typedef signed long long type;
+};
+
 } // namespace Parma_Polyhedra_Library
 
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Interval */
+template <typename Boundary, typename Info>
+inline void
+swap(Parma_Polyhedra_Library::Interval<Boundary, Info>& x,
+     Parma_Polyhedra_Library::Interval<Boundary, Info>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
 #endif // !defined(PPL_Interval_inlines_hh)
diff --git a/src/Interval.templates.hh b/src/Interval.templates.hh
new file mode 100644
index 0000000..ef9c119
--- /dev/null
+++ b/src/Interval.templates.hh
@@ -0,0 +1,208 @@
+/* Interval class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_templates_hh
+#define PPL_Interval_templates_hh 1
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+template <typename From, typename Iterator>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::CC76_widening_assign(const From& y,
+					       Iterator first,
+					       Iterator last) {
+  // We assume that `y' is contained in or equal to `*this'.
+  assert(contains(y));
+  Interval<Boundary, Info>& x = *this;
+
+  // Upper bound.
+  if (!x.upper_is_unbounded()) {
+    Boundary& x_ub = x.upper();
+    const Boundary& y_ub = y.upper();
+    assert(!y.upper_is_unbounded() && y_ub <= x_ub);
+    if (y_ub < x_ub) {
+      Iterator k = std::lower_bound(first, last, x_ub);
+      if (k != last) {
+	if (x_ub < *k)
+	  x_ub = *k;
+      }
+      else
+	x.upper_set(UNBOUNDED);
+    }
+  }
+
+  // Lower bound.
+  if (!x.lower_is_unbounded()) {
+    Boundary& x_lb = x.lower();
+    const Boundary& y_lb = y.lower();
+    assert(!y.lower_is_unbounded() && y_lb >= x_lb);
+    if (y_lb > x_lb) {
+      Iterator k = std::lower_bound(first, last, x_lb);
+      if (k != last) {
+	if (x_lb < *k) { 
+	  if (k != first)
+	    x_lb = *--k;
+	  else
+	    x.lower_set(UNBOUNDED);
+	}
+      }
+      else
+	x_lb = *--k;
+    }
+  }
+}
+
+template <typename Boundary, typename Info>
+inline std::istream&
+operator>>(std::istream& is, Interval<Boundary, Info>& x) {
+  // Eat leading white space.
+  int c;
+  do {
+    c = is.get();
+  } while (isspace(c));
+
+  // Get the opening parenthesis and handle the empty interval case.
+  bool lower_open = false;
+  if (c == '(')
+    lower_open = true;
+  else if (c == '[') {
+    c = is.get();
+    if (c == ']') {
+      // Empty interval.
+      x.assign(EMPTY);
+      return is;
+    }
+    else
+      is.unget();
+  }
+  else {
+    is.unget();
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Get the lower bound.
+  Boundary lower_bound;
+  Result lower_r  = input(lower_bound, is, ROUND_DOWN);
+  if (lower_r == V_CVT_STR_UNK || lower_r == VC_NAN) {
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Match the comma separating the lower and upper bounds.
+  do {
+    c = is.get();
+  } while (isspace(c));
+  if (c != ',') {
+    is.unget();
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Get the upper bound.
+  Boundary upper_bound;
+  Result upper_r = input(upper_bound, is, ROUND_UP);
+  if (upper_r == V_CVT_STR_UNK || upper_r == VC_NAN) {
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Get the closing parenthesis.
+  do {
+    c = is.get();
+  } while (isspace(c));
+  bool upper_open = false;
+  if (c == ')')
+    upper_open = true;
+  else if (c != ']') {
+    is.unget();
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Buld interval.
+  bool lower_unbounded = false;
+  bool upper_unbounded = false;
+  switch (lower_r) {
+  case V_EQ:
+    break;
+  case V_LE:
+    lower_open = true;
+    break;
+  case VC_MINUS_INFINITY:
+  case V_NEG_OVERFLOW:
+    lower_unbounded = true;
+    break;
+  case VC_PLUS_INFINITY:
+  case V_POS_OVERFLOW:
+    if (upper_r == VC_PLUS_INFINITY || upper_r == V_POS_OVERFLOW)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  default:
+    assert(false);
+  }
+  switch (upper_r) {
+  case V_EQ:
+    break;
+  case V_GE:
+    upper_open = true;
+    break;
+  case VC_MINUS_INFINITY:
+  case V_NEG_OVERFLOW:
+    if (lower_r == VC_MINUS_INFINITY || lower_r == V_NEG_OVERFLOW)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  case VC_PLUS_INFINITY:
+  case V_POS_OVERFLOW:
+    upper_unbounded = true;
+    break;
+  default:
+    assert(false);
+  }
+
+  if (!lower_unbounded
+      && !upper_unbounded
+      && (lower_bound > upper_bound
+	  || (lower_open && lower_bound == upper_bound)))
+    x.assign(EMPTY);
+  else {
+    x.assign(UNIVERSE);
+    if (!lower_unbounded)
+      x.refine_existential((lower_open ? GREATER_THAN : GREATER_OR_EQUAL),
+			   lower_bound);
+    if (!upper_unbounded)
+      x.refine_existential((upper_open ? LESS_THAN : LESS_OR_EQUAL),
+			   upper_bound);
+  }
+  return is;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_templates_hh)
diff --git a/src/Interval.types.hh b/src/Interval.types.hh
index 0195f98..7ccb708 100644
--- a/src/Interval.types.hh
+++ b/src/Interval.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -14,9 +14,7 @@ PURPOSE. */
 
 namespace Parma_Polyhedra_Library {
 
-class Boundary;
-class LBoundary;
-class UBoundary;
+template <typename Boundary, typename Info>
 class Interval;
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Interval_Info.defs.hh b/src/Interval_Info.defs.hh
new file mode 100644
index 0000000..970c5f4
--- /dev/null
+++ b/src/Interval_Info.defs.hh
@@ -0,0 +1,300 @@
+/* Interval_Info class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_Info_defs_hh
+#define PPL_Interval_Info_defs_hh 1
+
+#include "Boundary.defs.hh"
+#include "Interval_Restriction.defs.hh"
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interval_NS {
+
+struct Property {
+  enum Type {
+    CARDINALITY_0_,
+    CARDINALITY_1_,
+    CARDINALITY_IS_
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+const Property CARDINALITY_0(Property::CARDINALITY_0_);
+const Property CARDINALITY_1(Property::CARDINALITY_1_);
+const Property CARDINALITY_IS(Property::CARDINALITY_IS_);
+
+template <typename T>
+inline void
+reset_bits(T& bits) {
+  bits = 0;
+}
+
+template <typename T>
+inline void
+reset_bit(T& bits, unsigned int bit) {
+  bits &= ~(static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bit(T& bits, unsigned int bit, bool value) {
+  if (value)
+    bits |= static_cast<T>(1) << bit;
+  else
+    reset_bit(bits, bit);
+}
+
+template <typename T>
+inline bool
+get_bit(const T& bits, unsigned int bit) {
+  return bits & (static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bits(T& bits, unsigned int start, unsigned int len, T value) {
+  bits &= ~(((static_cast<T>(1) << len) - 1) << start);
+  bits |= value << start;
+}
+
+template <typename T>
+inline T
+get_bits(T& bits, unsigned int start, unsigned int len) {
+  return (bits >> start) & ((static_cast<T>(1) << len) - 1);
+}
+
+} // namespace Interval_NS
+
+using namespace Interval_NS;
+using namespace Boundary_NS;
+
+
+template <typename Policy>
+class Interval_Info_Null {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_empty_result, Policy::check_empty_result);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_normalized, false);
+  const_bool_nodef(cache_empty, false);
+  const_bool_nodef(cache_singleton, false);
+  void clear() {
+  }
+  void clear_boundary_properties(Boundary_Type) {
+  }
+
+  template <typename Property>
+  void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_boundary_property(Boundary_Type, const Property&) const {
+    return Property::unsupported_value;
+  }
+  template <typename Property>
+  void set_interval_property(const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_interval_property(const Property&) const {
+    return Property::unsupported_value;
+  }
+
+  //! Swaps \p *this with \p y.
+  void swap(Interval_Info_Null& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+};
+
+template <typename Policy>
+class Interval_Info_Null_Open : public Interval_Info_Null<Policy> {
+public:
+  const_bool_nodef(store_open, true);
+  Interval_Info_Null_Open(bool o)
+    : open(o) {
+  }
+  bool get_boundary_property(Boundary_Type, const Boundary_NS::Property& p) const {
+    switch (p.type) {
+    case Boundary_NS::Property::OPEN_:
+      return open;
+    default:
+      return Boundary_NS::Property::unsupported_value;
+    }
+  }
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+private:
+  bool open;
+};
+
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_empty_result, Policy::check_empty_result);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, Policy::store_special);
+  const_bool_nodef(store_open, Policy::store_open);
+  const_bool_nodef(cache_normalized, Policy::cache_normalized);
+  const_bool_nodef(cache_empty, Policy::cache_empty);
+  const_bool_nodef(cache_singleton, Policy::cache_singleton);
+  const_int_nodef(lower_special_bit, Policy::next_bit);
+  const_int_nodef(lower_open_bit, lower_special_bit + store_special);
+  const_int_nodef(lower_normalized_bit, lower_open_bit + store_open);
+  const_int_nodef(upper_special_bit, lower_normalized_bit + cache_normalized);
+  const_int_nodef(upper_open_bit, upper_special_bit + store_special);
+  const_int_nodef(upper_normalized_bit, upper_open_bit + store_open);
+  const_int_nodef(cardinality_is_bit, upper_normalized_bit + cache_normalized);
+  const_int_nodef(cardinality_0_bit, cardinality_is_bit + (cache_empty || cache_singleton));
+  const_int_nodef(cardinality_1_bit, cardinality_0_bit + cache_empty);
+  const_int_nodef(next_bit, cardinality_1_bit + cache_singleton);
+  Interval_Info_Bitset() {
+    // FIXME: would we have speed benefits with uninitialized info?
+    // (Dirty_Temp)
+    clear();
+  }
+
+  void clear() {
+    reset_bits(bitset);
+  }
+  void clear_boundary_properties(Boundary_Type t) {
+    set_boundary_property(t, SPECIAL, false);
+    set_boundary_property(t, OPEN, false);
+  }
+  void set_boundary_property(Boundary_Type t, const Boundary_NS::Property& p, bool value = true) {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (store_special) {
+	if (t == LOWER)
+	  set_bit(bitset, lower_special_bit, value);
+	else
+	  set_bit(bitset, upper_special_bit, value);
+      }
+      break;
+    case Boundary_NS::Property::OPEN_:
+      if (store_open) {
+	if (t == LOWER)
+	  set_bit(bitset, lower_open_bit, value);
+	else
+	  set_bit(bitset, upper_open_bit, value);
+      }
+      break;
+    case Boundary_NS::Property::NORMALIZED_:
+      if (cache_normalized) {
+	if (t == LOWER)
+	  set_bit(bitset, lower_normalized_bit, value);
+	else
+	  set_bit(bitset, upper_normalized_bit, value);
+      }
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_boundary_property(Boundary_Type t, const Boundary_NS::Property& p) const {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (!store_special)
+	return false;
+      if (t == LOWER)
+	return get_bit(bitset, lower_special_bit);
+      else
+	return get_bit(bitset, upper_special_bit);
+    case Boundary_NS::Property::OPEN_:
+      if (!store_open)
+	return false;
+      else if (t == LOWER)
+	return get_bit(bitset, lower_open_bit);
+      else
+	return get_bit(bitset, upper_open_bit);
+    case Boundary_NS::Property::NORMALIZED_:
+      if (!cache_normalized)
+	return false;
+      else if (t == LOWER)
+	return get_bit(bitset, lower_normalized_bit);
+      else
+	return get_bit(bitset, upper_normalized_bit);
+    default:
+      return false;
+    }
+  }
+  void set_interval_property(const Interval_NS::Property& p, bool value = true) {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      if (cache_empty)
+	set_bit(bitset, cardinality_0_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_1_:
+      if (cache_singleton)
+	set_bit(bitset, cardinality_1_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_IS_:
+      if (cache_empty || cache_singleton)
+	set_bit(bitset, cardinality_is_bit, value);
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_interval_property(Interval_NS::Property p) const {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      return cache_empty && get_bit(bitset, cardinality_0_bit);
+    case Interval_NS::Property::CARDINALITY_1_:
+      return cache_singleton && get_bit(bitset, cardinality_1_bit);
+    case Interval_NS::Property::CARDINALITY_IS_:
+      return (cache_empty || cache_singleton) && get_bit(bitset, cardinality_is_bit);
+    default:
+      return false;
+    }
+  }
+
+  //! Swaps \p *this with \p y.
+  void swap(Interval_Info_Bitset& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+protected:
+  T bitset;
+};
+
+}
+
+#include "Interval_Info.inlines.hh"
+
+#endif // !defined(PPL_Interval_Info_defs_hh)
diff --git a/src/Interval_Info.inlines.hh b/src/Interval_Info.inlines.hh
new file mode 100644
index 0000000..93cc1bc
--- /dev/null
+++ b/src/Interval_Info.inlines.hh
@@ -0,0 +1,121 @@
+/* Interval_Info class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_Info_inlines_hh
+#define PPL_Interval_Info_inlines_hh 1
+
+#include <iomanip>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::swap(Interval_Info_Null<Policy>&) {
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::ascii_dump(std::ostream& s) const {
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null<Policy>::ascii_load(std::istream& s) {
+  return true;
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null_Open<Policy>::ascii_dump(std::ostream& s) const {
+  s << (open ? "open" : "closed");
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null_Open<Policy>::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str))
+    return false;
+  if (str == "open") {
+    open = true;
+    return true;
+  }
+  if (str == "closed") {
+    open = false;
+    return true;
+  }
+  return false;
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::swap(Interval_Info_Bitset<T, Policy>& y) {
+  std::swap(bitset, y.bitset);
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::ascii_dump(std::ostream& s) const {
+  std::ios_base::fmtflags old = s.flags();
+  s << std::hex << bitset;
+  s.flags(old);
+}
+
+template <typename T, typename Policy>
+inline bool
+Interval_Info_Bitset<T, Policy>::ascii_load(std::istream& s) {
+  std::ios_base::fmtflags old = s.flags();
+  if (s >> std::hex >> bitset) {
+    s.flags(old);
+    return s;
+  }
+  else
+    return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Interval_Info_Null */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+inline void
+swap(Parma_Polyhedra_Library::Interval_Info_Null<Policy>& x,
+     Parma_Polyhedra_Library::Interval_Info_Null<Policy>& y) {
+  x.swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Interval_Info_Bitset */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+inline void
+swap(Parma_Polyhedra_Library::Interval_Info_Bitset<T, Policy>& x,
+     Parma_Polyhedra_Library::Interval_Info_Bitset<T, Policy>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Interval_Info_inlines_hh)
diff --git a/src/Interval_Info.types.hh b/src/Interval_Info.types.hh
new file mode 100644
index 0000000..9c8b34c
--- /dev/null
+++ b/src/Interval_Info.types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Interval_Info_types_hh
+#define PPL_Interval_Info_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+class Interval_Info_Null;
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_Info_types_hh)
diff --git a/src/Interval_Restriction.defs.hh b/src/Interval_Restriction.defs.hh
new file mode 100644
index 0000000..3c9a11a
--- /dev/null
+++ b/src/Interval_Restriction.defs.hh
@@ -0,0 +1,867 @@
+/* Interval_Restriction class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_Restriction_defs_hh
+#define PPL_Interval_Restriction_defs_hh 1
+
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include "assign_or_swap.hh"
+
+namespace Parma_Polyhedra_Library {
+
+struct Interval_Base;
+
+template <typename T, typename Enable = void>
+struct Boundary_Value {
+  typedef T type;
+};
+
+template <typename T>
+struct Boundary_Value<T, typename Enable_If<Is_Same_Or_Derived<Interval_Base, T>::value>::type > {
+  typedef typename T::boundary_type type;
+};
+
+class Interval_Restriction_None_Base {
+public:
+  bool has_restriction() const {
+    return false;
+  }
+  void normalize() const {
+  }
+  template <typename T>
+  Result restrict(T&, Result dir) const {
+    return dir;
+  }
+};
+
+inline bool
+eq_restriction(const Interval_Restriction_None_Base&, const Interval_Restriction_None_Base) {
+  return true;
+}
+
+template <typename T>
+inline bool
+contains_restriction(const Interval_Restriction_None_Base&, const T&) {
+  return true;
+}
+
+template <typename T>
+inline bool
+assign_restriction(Interval_Restriction_None_Base&, const T&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+join_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+intersect_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+diff_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T>
+inline bool
+neg_restriction(Interval_Restriction_None_Base&, const T&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+add_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+sub_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+mul_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+div_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+inline void
+output_restriction(std::ostream&, const Interval_Restriction_None_Base&) {
+}
+
+template <typename Base>
+class Interval_Restriction_None : public Interval_Restriction_None_Base,
+				  public Base {
+public:
+  Interval_Restriction_None() {
+  };
+  template <typename T>
+  Interval_Restriction_None(const T& init)
+    : Base(init) {
+  }
+};
+
+class Interval_Restriction_Integer_Base {
+};
+
+template <typename Base>
+class Interval_Restriction_Integer : public Interval_Restriction_Integer_Base, public Base {
+public:
+  Interval_Restriction_Integer() {
+  }
+  void set_integer(bool v = true) {
+    return set_bit(Base::bitset, integer_bit, v);
+  }
+  bool get_integer() const {
+    return get_bit(Base::bitset, integer_bit);
+  }
+
+  const_int_nodef(integer_bit, Base::next_bit);
+  const_int_nodef(next_bit, integer_bit + 1);
+  bool has_restriction() const {
+    return get_integer();
+  }
+  void normalize() const {
+  }
+  template <typename T>
+  Result restrict(T& x, Result dir) const {
+    if (!has_restriction())
+      return dir;
+    switch (dir) {
+    case V_GT:
+      if (is_integer(x))
+	return add_assign_r(x, x, static_cast<T>(1), ROUND_DOWN);
+      /* Fall through */
+    case V_GE:
+      return ceil_assign_r(x, x, ROUND_DOWN);
+    case V_LT:
+      if (is_integer(x))
+	sub_assign_r(x, x, static_cast<T>(1), ROUND_UP);
+      /* Fall through */
+    case V_LE:
+      return floor_assign_r(x, x, ROUND_UP);
+    default:
+      assert(false);
+      return dir;
+    }
+  }
+};
+
+class Simple_Restriction_Integer : public Interval_Restriction_Integer_Base {
+public:
+  Simple_Restriction_Integer(bool i)
+    : integer(i) {
+  }
+  bool get_integer() const {
+    return integer;
+  }
+private:
+  bool integer;
+};
+
+template <typename From, typename Base, typename Enable = void>
+struct Restriction_Integer;
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Native_Or_Checked<From>::value>::type> {
+  typedef Simple_Restriction_Integer type;
+  static type get(const From& x) {
+    return Simple_Restriction_Integer(is_integer(x));
+  }
+};
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_None_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer type;
+  static type get(const From& x) {
+    return Simple_Restriction_Integer(x.is_singleton() && is_integer(x.lower()));
+  }
+};
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, typename From::info_type>::value>::type> {
+  typedef Interval_Restriction_Integer<Base> type;
+  static const type& get(const From& x) {
+    return x.info();
+  }
+};
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T2>::value, bool>::type
+eq_restriction(const T1& x, const T2& y) {
+  return x.get_integer() == y.get_integer();
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T2>::value, bool>::type
+contains_restriction(const T1& x, const T2& y) {
+  return !x.get_integer() || y.get_integer();
+}
+
+template <typename Base, typename From>
+inline bool
+assign_restriction(Interval_Restriction_Integer<Base>& to, const From& x) {
+  to.set_integer(Restriction_Integer<From, Base>::get(x).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+join_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+intersect_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 || Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+diff_restriction(Interval_Restriction_Integer<Base>& to,
+		 const From1& x, const From2&) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer());
+  return true;
+}
+
+template <typename Base, typename From>
+inline bool
+neg_restriction(Interval_Restriction_Integer<Base>& to, const From& x) {
+  to.set_integer(Restriction_Integer<From, Base>::get(x).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+add_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+sub_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+mul_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+div_restriction(Interval_Restriction_Integer<Base>& to, const From1&, const From2&) {
+  to.set_integer(false);
+  return true;
+}
+
+template <typename Base>
+inline void
+output_restriction(std::ostream& s, const Interval_Restriction_Integer<Base>& x) {
+  if (x.get_integer())
+    s << "i";
+}
+
+class Interval_Restriction_Integer_Modulo_Base {
+};
+
+template <typename T, typename Base>
+class Interval_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base, public Base {
+public:
+  COMPILE_TIME_CHECK(std::numeric_limits<T>::is_exact, "Type for modulo values must be exact.");
+  Interval_Restriction_Integer_Modulo() {
+    // FIXME: would we have speed benefits with uninitialized info?
+    // (Dirty_Temp)
+    clear();
+  }
+  bool has_restriction() const {
+    return divisor != 0;
+  }
+  void clear() {
+    remainder = 0;
+    divisor = 0;
+    Base::clear();
+  }
+  void normalize() const {
+  }
+  template <typename V>
+  Result restrict(V& x, Result dir) const {
+    if (!has_restriction())
+      return dir;
+    DIRTY_TEMP(V, n);
+    DIRTY_TEMP(V, div);
+    Result r;
+    r = assign_r(div, divisor, ROUND_CHECK);
+    assert(r == V_EQ);
+    int s;
+    r = rem_assign_r(n, x, div, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    s = sgn(n);
+    switch (dir) {
+    case V_GT:
+      if (s >= 0) {
+	r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return add_assign_r(x, x, n, ROUND_DOWN);
+      }
+      else
+	return sub_assign_r(x, x, n, ROUND_DOWN);
+    case V_GE:
+      if (s > 0) {
+	r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return add_assign_r(x, x, n, ROUND_DOWN);
+      }
+      else if (s < 0)
+	return sub_assign_r(x, x, n, ROUND_DOWN);
+      else
+	return V_EQ;
+    case V_LT:
+      if (s <= 0) {
+	r = add_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return sub_assign_r(x, x, n, ROUND_UP);
+      }
+      else
+	return sub_assign_r(x, x, n, ROUND_UP);
+    case V_LE:
+      if (s < 0) {
+	r = add_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return sub_assign_r(x, x, n, ROUND_UP);
+      }
+      else if (s > 0)
+	return sub_assign_r(x, x, n, ROUND_UP);
+      else
+	return V_EQ;
+    default:
+      assert(false);
+      return dir;
+    }
+  }
+  void assign_or_swap(Interval_Restriction_Integer_Modulo& x) {
+    Parma_Polyhedra_Library::assign_or_swap(remainder, x.remainder);
+    Parma_Polyhedra_Library::assign_or_swap(divisor, x.divisor);
+  }
+  typedef T modulo_type;
+  T remainder;
+  T divisor;
+};
+
+template <typename T, typename Base>
+struct Slow_Copy<Interval_Restriction_Integer_Modulo<T, Base> > : public Bool<Slow_Copy<T>::value> {};
+
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer type;
+  static type get(const From& x) {
+    return Simple_Restriction_Integer(x.info().divisor != 0);
+  }
+};
+
+template <typename T>
+struct Simple_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base {
+  template <typename From>
+  Simple_Restriction_Integer_Modulo(const From& r, const From& d)
+    : remainder(r), divisor(d) {
+  }
+  typedef T modulo_type;
+  T remainder;
+  T divisor;
+};
+
+template <typename From, typename T, typename Base, typename Enable = void>
+struct Restriction_Integer_Modulo;
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Native_Or_Checked<From>::value>::type> {
+  typedef Simple_Restriction_Integer_Modulo<T> type;
+  static const type& get(const From& x) {
+    static const type integer(0, 1);
+    static const type not_integer(0, 0);
+    if (is_integer(x))
+      return integer;
+    else
+      return not_integer;
+  }
+};
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_None_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer_Modulo<T> type;
+  static const type& get(const From& x) {
+    static const type integer(0, 1);
+    static const type not_integer(0, 0);
+    if (x.is_singleton() && is_integer(x.lower()))
+      return integer;
+    else
+      return not_integer;
+  }
+};
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer_Modulo<T> type;
+  static const type& get(const From& x) {
+    static const type integer(0, 1);
+    static const type not_integer(0, 0);
+    if (x.info().get_integer())
+      return integer;
+    else
+      return not_integer;
+  }
+};
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, typename From::info_type>::value>::type> {
+  typedef Interval_Restriction_Integer_Modulo<T, Base> type;
+  static const type& get(const From& x) {
+    return x.info();
+  }
+};
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T2>::value, bool>::type
+eq_restriction(const T1& x, const T2& y) {
+  return x.remainder == y.remainder
+    && x.divisor == y.divisor;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T2>::value, bool>::type
+contains_restriction(const T1& x, const T2& y) {
+  if (x.divisor == 0)
+    return true;
+  if (y.divisor == 0)
+    return false;
+  if (x.divisor == y.divisor)
+    return x.remainder == y.remainder;
+  DIRTY_TEMP(typename T1::modulo_type, v);
+  Result r;
+  r = rem_assign_r(v, y.divisor, x.divisor, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+  if (v != 0)
+    return false;
+  r = rem_assign_r(v, y.remainder, x.divisor, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+  return v == x.remainder;
+}
+
+template <typename T, typename Base>
+inline bool
+set_unrestricted(Interval_Restriction_Integer_Modulo<T, Base>& to) {
+  to.remainder = 0;
+  to.divisor = 0;
+  return true;
+}
+
+template <typename T, typename Base>
+inline bool
+set_integer(Interval_Restriction_Integer_Modulo<T, Base>& to) {
+  to.remainder = 0;
+  to.divisor = 1;
+  return true;
+}
+
+template <typename T, typename Base, typename From>
+inline bool
+assign_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From& x) {
+  to.remainder = Restriction_Integer_Modulo<From, T, Base>::get(x).remainder;
+  to.divisor = Restriction_Integer_Modulo<From, T, Base>::get(x).divisor;
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+join_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  else if (rx.divisor == 1 && ry.divisor == 1
+      && is_singleton(x) && is_singleton(y)) {
+    DIRTY_TEMP(typename Boundary_Value<From1>::type, a);
+    DIRTY_TEMP(typename Boundary_Value<From2>::type, b);
+    Result r;
+    r = abs_assign_r(a, f_lower(x), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = abs_assign_r(b, f_lower(y), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    if (a > b)
+      r = sub_assign_r(a, a, b, ROUND_CHECK);
+    else
+      r = sub_assign_r(a, b, a, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(to.divisor, a, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = rem_assign_r(b, b, a, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(to.remainder, b, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+  }
+  else if (contains_restriction(rx, ry)) {
+    to.remainder = rx.remainder;
+    to.divisor = rx.divisor;
+  }
+  else if (contains_restriction(ry, rx)) {
+    to.remainder = ry.remainder;
+    to.divisor = ry.divisor;
+  }
+  else
+    return set_integer(to);
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+intersect_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (rx.divisor == 0) {
+    to.remainder = ry.remainder;
+    to.divisor = ry.divisor;
+    return true;
+  }
+  if (ry.divisor == 0) {
+    to.remainder = rx.remainder;
+    to.divisor = rx.divisor;
+    return true;
+  }
+  DIRTY_TEMP(T, g);
+  Result r;
+  r = gcd_assign_r(g, rx.divisor, ry.divisor, ROUND_DIRECT);
+  if (r != V_EQ)
+    return set_integer(to);
+  DIRTY_TEMP(T, d);
+  if (rx.remainder > ry.remainder)
+    r = sub_assign_r(d, rx.remainder, ry.remainder, ROUND_DIRECT);
+  else
+    r = sub_assign_r(d, ry.remainder, rx.remainder, ROUND_DIRECT);
+  if (r != V_EQ)
+    return set_integer(to);
+  r = div_assign_r(d, d, g, ROUND_DIRECT);
+  if (r != V_EQ)
+    return false;
+  r = lcm_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_DIRECT);
+  if (r != V_EQ)
+    return set_integer(to);
+  // FIXME: to be completed
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+diff_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to,
+		 const From1& x, const From2& y) {
+  // FIXME: to be written
+  return true;
+}
+
+template <typename T, typename Base, typename From>
+inline bool
+neg_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From& x) {
+  return assign_restriction(to, x);
+}
+
+template <typename T>
+inline void
+addmod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) {
+  Result r;
+  if (std::numeric_limits<T>::is_bounded) {
+    r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    if (x <= to) {
+      r = add_assign_r(to, x, y, ROUND_NOT_NEEDED);
+      assert(r == V_EQ);
+    }
+    else {
+      r = sub_assign_r(to, x, to, ROUND_NOT_NEEDED);
+      assert(r == V_EQ);
+    }
+  }
+  else {
+    r = add_assign_r(to, x, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+}
+
+template <typename M, typename T>
+inline bool
+assign_rem(M& rem, const T& n, const M& div) {
+  DIRTY_TEMP(T, divisor);
+  DIRTY_TEMP(T, remainder);
+  Result r;
+  r = assign_r(divisor, div, ROUND_CHECK);
+  if (r != V_EQ)
+    return false;
+  r = rem_assign_r(remainder, n, divisor, ROUND_CHECK);
+  if (r != V_EQ)
+    return false;
+  if (sgn(remainder) < 0) {
+    r = add_assign_r(remainder, remainder, divisor, ROUND_CHECK);
+    if (r != V_EQ)
+      return false;
+  }
+  r = assign_r(rem, remainder, ROUND_CHECK);
+  return r == V_EQ;
+}
+
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+add_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  Result r;
+  DIRTY_TEMP(T, rem);
+  if (is_singleton(x)) {
+    if (is_singleton(y))
+      return set_integer(to);
+    if (!assign_rem(rem, f_lower(x), ry.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    addmod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor);
+  }
+  else if (is_singleton(y)) {
+    if (!assign_rem(rem, f_lower(y), rx.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    addmod(to.remainder, rx.remainder, rem, to.divisor, to.divisor);
+  }
+  else {
+    r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    addmod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor);
+  }
+  return true;
+}
+
+template <typename T>
+inline void
+submod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) {
+  Result r;
+  if (x >= y) {
+    r = sub_assign_r(to, x, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  else {
+    r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = add_assign_r(to, x, to, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+sub_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  Result r;
+  DIRTY_TEMP(T, rem);
+  if (is_singleton(x)) {
+    if (is_singleton(y))
+      return set_integer(to);
+    if (!assign_rem(rem, f_lower(x), ry.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    submod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor);
+  }
+  else if (is_singleton(y)) {
+    if (!assign_rem(rem, f_lower(y), rx.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    submod(to.remainder, rx.remainder, rem, to.divisor, to.divisor);
+  }
+  else {
+    r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    submod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor);
+  }
+  return true;
+}
+
+template <typename T>
+inline void
+mulmod(T& to, const T& x, const T& y, const T& to_m) {
+  Result r;
+  if (std::numeric_limits<T>::is_bounded) {
+    DIRTY_TEMP0(mpz_class, a);
+    DIRTY_TEMP0(mpz_class, b);
+    r = assign_r(a, x, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = assign_r(b, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = mul_assign_r(a, a, b, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = assign_r(b, to_m, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = rem_assign_r(a, a, b, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = assign_r(to, a, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  else {
+    r = mul_assign_r(to, x, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+}
+
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+mul_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  Result r;
+  DIRTY_TEMP(T, mul);
+  if (is_singleton(x)) {
+    if (is_singleton(y))
+      return set_integer(to);
+    DIRTY_TEMP(typename Boundary_Value<From1>::type, n);
+    r = abs_assign_r(n, f_lower(x), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(mul, n, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.remainder, mul, ry.remainder, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.divisor, mul, ry.divisor, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+  }
+  else if (is_singleton(y)) {
+    DIRTY_TEMP(typename Boundary_Value<From2>::type, n);
+    r = abs_assign_r(n, f_lower(y), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(mul, n, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.remainder, rx.remainder, mul, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.divisor, rx.divisor, mul, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+  }
+  else {
+    r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    mulmod(to.remainder, rx.remainder, ry.remainder, to.divisor);
+  }
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+div_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  if (is_singleton(y)) {
+    if (is_singleton(x)) {
+      // FIXME: to be written
+    }
+  }
+  return set_unrestricted(to);
+}
+
+template <typename T, typename Base>
+inline void
+output_restriction(std::ostream& s, const Interval_Restriction_Integer_Modulo<T, Base>& x) {
+  if (x.divisor == 1)
+    s << "i";
+  else if (x.divisor != 0)
+    s << "{" << x.remainder << "%" << x.divisor << "}";
+}
+
+}
+
+#endif // !defined(PPL_Interval_Info_defs_hh)
diff --git a/src/LP_Problem.cc b/src/LP_Problem.cc
deleted file mode 100644
index 1576ffb..0000000
--- a/src/LP_Problem.cc
+++ /dev/null
@@ -1,1035 +0,0 @@
-/* LP_Problem class implementation: non-inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-#include "LP_Problem.defs.hh"
-#include "globals.types.hh"
-#include "globals.defs.hh"
-#include "Row.defs.hh"
-#include "Matrix.defs.hh"
-#include "Linear_Row.defs.hh"
-#include "Linear_System.defs.hh"
-#include "Linear_Expression.defs.hh"
-#include "Constraint_System.defs.hh"
-#include "Constraint_System.inlines.hh"
-#include "Generator.defs.hh"
-#include <stdexcept>
-#include <sstream>
-#include <map>
-#include <deque>
-#include <set>
-#include <algorithm>
-
-#ifndef PPL_NOISY_SIMPLEX
-#define PPL_NOISY_SIMPLEX 0
-#endif
-
-#ifdef PPL_NOISY_SIMPLEX
-#include <iostream>
-#endif
-
-#ifndef PPL_SIMPLEX_ENABLE_STEEPEST_EDGE
-#define PPL_SIMPLEX_ENABLE_STEEPEST_EDGE 1
-#endif
-
-namespace PPL = Parma_Polyhedra_Library;
-
-#if PPL_NOISY_SIMPLEX
-namespace {
-
-unsigned long num_iterations = 0;
-
-} // namespace
-#endif // PPL_NOISY_SIMPLEX
-
-PPL::dimension_type
-PPL::LP_Problem::steepest_edge() const {
-  const dimension_type tableau_num_rows = tableau.num_rows();
-  assert(tableau_num_rows == base.size());
-  // The square of the lcm of all the coefficients of variables in base.
-  TEMP_INTEGER(squared_lcm_basis);
-  // The normalization factor for each coefficient in the tableau.
-  std::vector<Coefficient> norm_factor(tableau_num_rows);
-  {
-    // Compute the lcm of all the coefficients of variables in base.
-    TEMP_INTEGER(lcm_basis);
-    lcm_basis = 1;
-    for (dimension_type i = tableau_num_rows; i-- > 0; )
-      lcm_assign(lcm_basis, lcm_basis, tableau[i][base[i]]);
-    // Compute normalization factors.
-    for (dimension_type i = tableau_num_rows; i-- > 0; )
-      exact_div_assign(norm_factor[i], lcm_basis, tableau[i][base[i]]);
-    // Compute the square of `lcm_basis', exploiting the fact that
-    // `lcm_basis' will no longer be needed.
-    lcm_basis *= lcm_basis;
-    std::swap(squared_lcm_basis, lcm_basis);
-  }
-
-  // Defined here to avoid repeated (de-)allocations.
-  TEMP_INTEGER(challenger_num);
-  TEMP_INTEGER(scalar_value);
-  TEMP_INTEGER(challenger_den);
-  TEMP_INTEGER(challenger_value);
-  TEMP_INTEGER(current_value);
-
-  TEMP_INTEGER(current_num);
-  TEMP_INTEGER(current_den);
-  dimension_type entering_index = 0;
-  const int cost_sign = sgn(working_cost[working_cost.size() - 1]);
-  for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
-    const Coefficient& cost_j = working_cost[j];
-    if (sgn(cost_j) == cost_sign) {
-      // We can't compute the (exact) square root of abs(\Delta x_j).
-      // The workaround is to compute the square of `cost[j]'.
-      challenger_num = cost_j * cost_j;
-      // Due to our integer implementation, the `1' term in the denominator
-      // of the original formula has to be replaced by `squared_lcm_basis'.
-      challenger_den = squared_lcm_basis;
-      for (dimension_type i = tableau_num_rows; i-- > 0; ) {
-	const Coefficient& tableau_ij = tableau[i][j];
-	// Note: this test speeds up the GMP computation.
-	if (tableau_ij != 0) {
-	  scalar_value = tableau_ij * norm_factor[i];
-	  add_mul_assign(challenger_den, scalar_value, scalar_value);
-	}
-      }
-      // Initialization during the first loop.
-      if (entering_index == 0) {
-	std::swap(current_num, challenger_num);
-	std::swap(current_den, challenger_den);
-	entering_index = j;
- 	continue;
-      }
-      challenger_value = challenger_num * current_den;
-      current_value = current_num * challenger_den;
-      // Update the values, if the challeger wins.
-      if (challenger_value > current_value) {
-	std::swap(current_num, challenger_num);
-	std::swap(current_den, challenger_den);
-	entering_index = j;
-      }
-    }
-  }
-  return entering_index;
-}
-
-// See pag. 47 of Papadimitriou.
-
-PPL::dimension_type
-PPL::LP_Problem::get_entering_var_index() const {
-  // The variable entering the base is the first one whose coefficient
-  // in the cost function has the same sign the cost function itself.
-  // If no such variable exists, then we met the optimality condition
-  // (and return 0 to the caller).
-
-  // Get the "sign" of the cost function.
-  const dimension_type cost_sign_index = working_cost.size() - 1;
-  const int cost_sign = sgn(working_cost[cost_sign_index]);
-  assert(cost_sign != 0);
-  for (dimension_type i = 1; i < cost_sign_index; ++i)
-    if (sgn(working_cost[i]) == cost_sign)
-      return i;
-  // No variable has to enter the base:
-  // the cost function was optimized.
-  return 0;
-}
-
-void
-PPL::LP_Problem::linear_combine(Row& x,
-				const Row& y,
-				const dimension_type k) {
-  assert(x.size() == y.size());
-  assert(y[k] != 0 && x[k] != 0);
-  // Let g be the GCD between `x[k]' and `y[k]'.
-  // For each i the following computes
-  //   x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
-  TEMP_INTEGER(normalized_x_k);
-  TEMP_INTEGER(normalized_y_k);
-  normalize2(x[k], y[k], normalized_x_k, normalized_y_k);
-  for (dimension_type i = x.size(); i-- > 0; )
-    if (i != k) {
-      Coefficient& x_i = x[i];
-      x_i *= normalized_y_k;
-      // Note: the test speeds up the GMP computation.
-      const Coefficient& y_i = y[i];
-      if (y_i != 0)
-	sub_mul_assign(x_i, y_i, normalized_x_k);
-    }
-  x[k] = 0;
-  x.normalize();
-}
-
-// See pag 42-43 of Papadimitriou.
-
-void
-PPL::LP_Problem::swap_base(const dimension_type entering_var_index,
-			   const dimension_type exiting_base_index) {
-  const Row& tableau_out = tableau[exiting_base_index];
-  // Linearly combine the constraints.
-  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
-    Row& tableau_i = tableau[i];
-    if (i != exiting_base_index && tableau_i[entering_var_index] != 0)
-      linear_combine(tableau_i, tableau_out, entering_var_index);
-  }
-  // Linearly combine the cost function.
-  if (working_cost[entering_var_index] != 0)
-    linear_combine(working_cost, tableau_out, entering_var_index);
-  // Adjust the base.
-  base[exiting_base_index] = entering_var_index;
-}
-
-// See pag. 47 + 50 of Papadimitriou.
-
-PPL::dimension_type
-PPL::LP_Problem
-::get_exiting_base_index(const dimension_type entering_var_index) const  {
-  // The variable exiting the base should be associated to a tableau
-  // constraint such that the ratio
-  // tableau[i][entering_var_index] / tableau[i][base[i]]
-  // is strictly positive and minimal.
-
-  // Find the first tableau constraint `c' having a positive value for
-  //   tableau[i][entering_var_index] / tableau[i][base[i]]
-  const dimension_type tableau_num_rows = tableau.num_rows();
-  dimension_type exiting_base_index = tableau_num_rows;
-  for (dimension_type i = 0; i < tableau_num_rows; ++i) {
-    const Row& t_i = tableau[i];
-    const int num_sign = sgn(t_i[entering_var_index]);
-    if (num_sign != 0 && num_sign == sgn(t_i[base[i]])) {
-      exiting_base_index = i;
-      break;
-    }
-  }
-  // Check for unboundedness.
-  if (exiting_base_index == tableau_num_rows)
-    return tableau_num_rows;
-
-  // Reaching this point means that a variable will definitely exit the base.
-  TEMP_INTEGER(lcm);
-  TEMP_INTEGER(current_min);
-  TEMP_INTEGER(challenger);
-  for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) {
-    const Row& t_i = tableau[i];
-    const Coefficient& t_ie = t_i[entering_var_index];
-    const Coefficient& t_ib = t_i[base[i]];
-    const int t_ie_sign = sgn(t_ie);
-    if (t_ie_sign != 0 && t_ie_sign == sgn(t_ib)) {
-      const Row& t_e = tableau[exiting_base_index];
-      const Coefficient& t_ee = t_e[entering_var_index];
-      lcm_assign(lcm, t_ee, t_ie);
-      exact_div_assign(current_min, lcm, t_ee);
-      current_min *= t_e[0];
-      current_min = abs(current_min);
-      exact_div_assign(challenger, lcm, t_ie);
-      challenger *= t_i[0];
-      challenger = abs(challenger);
-      current_min -= challenger;
-      const int sign = sgn(current_min);
-      if (sign > 0
-	  || (sign == 0 && base[i] < base[exiting_base_index]))
-	exiting_base_index = i;
-    }
-  }
-  return exiting_base_index;
-}
-
-// See pag 49 of Papadimitriou.
-
-bool
-PPL::LP_Problem::compute_simplex() {
-  assert(tableau.num_columns() == working_cost.size());
-  const dimension_type tableau_num_rows = tableau.num_rows();
-  while (true) {
-    // Choose the index of the variable entering the base, if any.
-    const dimension_type entering_var_index
-#if PPL_SIMPLEX_ENABLE_STEEPEST_EDGE
-      = steepest_edge();
-#else
-      = get_entering_var_index();
-#endif
-    // If no entering index was computed, the problem is solved.
-    if (entering_var_index == 0)
-      return true;
-
-    // Choose the index of the row exiting the base.
-    const dimension_type exiting_base_index
-      = get_exiting_base_index(entering_var_index);
-    // If no exiting index was computed, the problem is unbounded.
-    if (exiting_base_index == tableau_num_rows)
-      return false;
-
-    // We have not reached the optimality or unbounded condition:
-    // compute the new base and the corresponding vertex of the
-    // feasible region.
-    swap_base(entering_var_index, exiting_base_index);
-#if PPL_NOISY_SIMPLEX
-    ++num_iterations;
-    if (num_iterations % 200 == 0)
-      std::cout << "Primal Simplex: iteration "
-		<< num_iterations << "." << std::endl;
-#endif
-  }
-}
-
-// See pag 28  Papadimitriou.
-
-void
-PPL::LP_Problem::prepare_first_phase() {
-  // We negate the row if tableau[i][0] <= 0 to get the inhomogeneous term > 0.
-  // This simplifies the insertion of the slack variables: the value of the
-  // slack variable of every constraint will be 1.
-  const dimension_type tableau_old_n_cols = tableau.num_columns();
-  for (dimension_type i = tableau.num_rows(); i-- > 0 ; ) {
-    Row& tableau_i = tableau[i];
-    if (tableau_i[0] > 0)
-      for (dimension_type j = tableau_old_n_cols; j-- > 0; )
-	neg_assign(tableau_i[j]);
-  }
-
-  // Add the columns for all the slack variables, plus an additional
-  // column for the sign of the cost function, provided we are not going
-  // to exceed the maximum number of allowed columns.
-  if (tableau.max_num_columns() - tableau_old_n_cols <= tableau.num_rows())
-    throw std::length_error("PPL::LP_Problem:\nthe maximum size of an "
-			    "internal data structure has been exceeded "
-			    "while solving the LP_Problem.");
-  tableau.add_zero_columns(tableau.num_rows() + 1);
-  // Set the working cost function with the right size.
-  working_cost = Row(tableau.num_columns(), Row::Flags());
-
-  // Modify the tableau and the new cost function by adding
-  // the slack variables (which enter the base).
-  // As for the cost function, all the slack variables should have
-  // coefficient -1.
-  for (dimension_type i = 0; i < tableau.num_rows(); ++i) {
-    const dimension_type j = tableau_old_n_cols + i;
-    tableau[i][j] = 1;
-    working_cost[j] = -1;
-    base[i] = j;
-  }
-
-  // Set the extra-coefficient of the cost functions to record its sign.
-  // This is done to keep track of the possible sign's inversion.
-  const dimension_type last_obj_index = working_cost.size() - 1;
-  working_cost[last_obj_index] = 1;
-
-  // Express the problem in terms of the variables in base.
-  for (dimension_type i = tableau.num_rows(); i-- > 0; )
-    linear_combine(working_cost, tableau[i], base[i]);
-}
-
-// See pag 55-56 Papadimitriou.
-
-void
-PPL::LP_Problem::erase_slacks() {
-  const dimension_type tableau_last_index = tableau.num_columns() - 1;
-  dimension_type tableau_n_rows = tableau.num_rows();
-  const dimension_type first_slack_index = tableau_last_index - tableau_n_rows;
-
-  // Step 1: try to remove from the base all the remaining slack variables.
-  for (dimension_type i = 0; i < tableau_n_rows; ++i)
-    if (base[i] >= first_slack_index) {
-      // Search for a non-zero element to enter the base.
-      Row& tableau_i = tableau[i];
-      bool redundant = true;
-      for (dimension_type j = first_slack_index; j-- > 1; )
-	if (tableau_i[j] != 0) {
-	  swap_base(j, i);
-	  redundant = false;
-	  break;
-	}
-      if (redundant) {
-	// No original variable entered the base:
-	// the constraint is redundant and should be deleted.
-	--tableau_n_rows;
-	if (i < tableau_n_rows) {
-	  // Replace the redundant row with the last one,
-	  // taking care of adjusting the iteration index.
-	  tableau_i.swap(tableau[tableau_n_rows]);
-	  base[i] = base[tableau_n_rows];
-	  --i;
-	}
-	tableau.erase_to_end(tableau_n_rows);
-	base.pop_back();
-      }
-    }
-
-  // Step 2: Adjust data structures so as to enter phase 2 of the simplex.
-
-  // Compute the dimensions of the new tableau.
-  const dimension_type new_tableau_n_cols = first_slack_index + 1;
-  const dimension_type new_tableau_last_index = first_slack_index;
-
-  // Adjust the number of columns of `tableau'.
-  tableau.remove_trailing_columns(tableau.num_columns() - new_tableau_n_cols);
-  // Zero the last column of the tableau.
-  for (dimension_type i = tableau_n_rows; i-- > 0; )
-    tableau[i][new_tableau_last_index] = 0;
-
-  // ... then properly set the element in the (new) last column,
-  // encoding the kind of optimization; ...
-  working_cost[new_tableau_last_index] = working_cost[tableau_last_index];
-  // ... and finally remove redundant columns.
-  const dimension_type working_cost_new_size = working_cost.size() -
-    (tableau_last_index - new_tableau_last_index);
-  working_cost.shrink(working_cost_new_size);
-}
-
-// See pag 55 of Papadimitriou.
-
-PPL::LP_Problem_Status
-PPL::LP_Problem::compute_tableau() {
-  assert(tableau.num_rows() == 0);
-  assert(dim_map.size() == 0);
-  // Note: exploiting friendship so as to efficiently access the
-  // coefficients of each constraint.
-  Linear_System& cs = input_cs;
-  const dimension_type cs_num_rows = cs.num_rows();
-  const dimension_type cs_num_cols = cs.num_columns();
-
-  // Step 1:
-  // determine variables that are constrained to be nonnegative,
-  // detect (non-negativity or tautology) constraints that will not
-  // be part of the tableau and count the number of slack variables.
-
-  // Counters determining the dimensions of the tableau:
-  // initialized here, they will be updated while examining `cs'.
-  dimension_type tableau_num_rows = cs_num_rows;
-  dimension_type tableau_num_cols = 2*cs_num_cols - 1;
-  dimension_type num_slack_variables = 0;
-
-  // On exit, `is_tableau_constraint[i]' will be true if and only if
-  // `cs[i]' is neither a tautology (e.g., 1 >= 0) nor a non-negativity
-  // constraint (e.g., X >= 0).
-  std::deque<bool> is_tableau_constraint(cs_num_rows, true);
-
-  // On exit, `nonnegative_variable[j]' will be true if and only if
-  // Variable(j) is bound to be nonnegative in `cs'.
-  std::deque<bool> nonnegative_variable(cs_num_cols - 1, false);
-
-  // Process each row of the `cs' matrix.
-  for (dimension_type i = cs_num_rows; i-- > 0; ) {
-    const Linear_Row& cs_i = cs[i];
-    bool found_a_nonzero_coeff = false;
-    bool found_many_nonzero_coeffs = false;
-    dimension_type nonzero_coeff_column_index = 0;
-    for (dimension_type j = cs_num_cols; j-- > 1; ) {
-      if (cs_i[j] != 0)
-	if (found_a_nonzero_coeff) {
-	  found_many_nonzero_coeffs = true;
-	  if (cs_i.is_ray_or_point_or_inequality())
-	    ++num_slack_variables;
-	  break;
-	}
-	else {
-	  nonzero_coeff_column_index = j;
-	  found_a_nonzero_coeff = true;
-	}
-    }
-    // If more than one coefficient is nonzero,
-    // continue with next constraint.
-    if (found_many_nonzero_coeffs)
-      continue;
-
-    if (!found_a_nonzero_coeff) {
-      // All coefficients are 0.
-      // The constraint is either trivially true or trivially false.
-      if (cs_i.is_ray_or_point_or_inequality()) {
-	if (cs_i[0] < 0)
-	  // A constraint such as -1 >= 0 is trivially false.
-	  return UNFEASIBLE_LP_PROBLEM;
-      }
-      else
-	// The constraint is an equality.
-	if (cs_i[0] != 0)
-	  // A constraint such as 1 == 0 is trivially false.
-	  return UNFEASIBLE_LP_PROBLEM;
-      // Here the constraint is trivially true.
-      is_tableau_constraint[i] = false;
-      --tableau_num_rows;
-      continue;
-    }
-    else {
-      // Here we have only one nonzero coefficient.
-      /*
-
-      We have the following methods:
-      A) Do split the variable and do add the constraint in the tableau.
-      B) Don't split the variable and do add the constraint in the tableau.
-      C) Don't split the variable and don't add the constraint in the tableau.
-
-      Let the constraint be (a*v + b relsym 0).
-      These are the 12 possible combinations we can have:
-                a |  b | relsym | method
-      ----------------------------------
-      1)       >0 | >0 |   >=   |   A
-      2)       >0 | >0 |   ==   |   A
-      3)       <0 | <0 |   >=   |   A
-      4)       >0 | =0 |   ==   |   B
-      5)       >0 | <0 |   ==   |   B
-      Note:    <0 | >0 |   ==   | impossible by strong normalization
-      Note:    <0 | =0 |   ==   | impossible by strong normalization
-      Note:    <0 | <0 |   ==   | impossible by strong normalization
-      6)       >0 | <0 |   >=   |   B
-      7)       >0 | =0 |   >=   |   C
-      8)       <0 | >0 |   >=   |   A
-      9)       <0 | =0 |   >=   |   A
-
-      The next lines will apply the correct method to each case.
-      */
-
-      // The variable index is not equal to the column index.
-      const dimension_type nonzero_var_index = nonzero_coeff_column_index - 1;
-
-      const int sgn_a = sgn(cs_i[nonzero_coeff_column_index]);
-      const int sgn_b = sgn(cs_i[0]);
-      // Cases 1-3: apply method A.
-      if (sgn_a == sgn_b) {
-	if (cs_i.is_ray_or_point_or_inequality())
-	  ++num_slack_variables;
-      }
-      // Cases 4-5: apply method B.
-      else if (cs_i.is_line_or_equality()) {
-	if (!nonnegative_variable[nonzero_var_index]) {
-	  nonnegative_variable[nonzero_var_index] = true;
-	  --tableau_num_cols;
-	}
-      }
-      // Case 6: apply method B.
-      else if (sgn_b < 0) {
-	if (!nonnegative_variable[nonzero_var_index]) {
-	  nonnegative_variable[nonzero_var_index] = true;
-	  --tableau_num_cols;
-	}
-	++num_slack_variables;
-      }
-      // Case 7: apply method C.
-      else if (sgn_a > 0) {
-	if (!nonnegative_variable[nonzero_var_index]) {
-	  nonnegative_variable[nonzero_var_index] = true;
-	  --tableau_num_cols;
-	}
-	is_tableau_constraint[i] = false;
-	--tableau_num_rows;
-      }
-      // Cases 8-9: apply method A.
-      else
-	++num_slack_variables;
-    }
-  }
-
-  // The slack variables will be columns in the tableau.
-  tableau_num_cols += num_slack_variables;
-
-  // Now we can fill the map.
-  for (dimension_type i = 0, j = nonnegative_variable.size(),
-	 nnv_size = j; i < nnv_size; ++i)
-    if (!nonnegative_variable[i]) {
-      dim_map.insert(std::make_pair(i, j));
-      ++j;
-    }
-
-  // Step 2:
-  // set the dimensions for the tableau and the cost function.
-  if (tableau_num_rows > 0) {
-    if (tableau_num_cols > tableau.max_num_columns())
-      throw std::length_error("PPL::LP_Problem:\nthe maximum size of an "
-			      "internal data structure has been exceeded "
-			      "while solving the LP_Problem.");
-    tableau.add_zero_rows_and_columns(tableau_num_rows,
-				      tableau_num_cols,
-				      Row::Flags());
-  }
-
-  // Phase 3:
-  // insert all the (possibly transformed) constraints that are not
-  // nonnegativity constraints. The transformation includes both
-  // the variable splitting (for variables that are unconstrained
-  // in sign) and the addition of slack variables (for inequalities
-  // in the original problem).
-
-  for (dimension_type k = tableau_num_rows, slack_index = tableau_num_cols,
-	 i = cs_num_rows; i-- > 0; )
-    if (is_tableau_constraint[i]) {
-      // Copy the original constraint in the tableau.
-      Row& tableau_k = tableau[--k];
-      const Linear_Row& cs_i = cs[i];
-      for (dimension_type j = cs_num_cols; j-- > 0; )
-	tableau_k[j] = cs_i[j];
-      // Add the slack variable, if needed.
-      if (cs_i.is_ray_or_point_or_inequality())
-	tableau_k[--slack_index] = -1;
-    }
-
-  // Split the variables in the tableau and cost function.
-  typedef std::map<dimension_type, dimension_type>::const_iterator iter;
-  for (iter map_itr = dim_map.begin(),
-	 map_end = dim_map.end(); map_itr != map_end; ++map_itr) {
-    const dimension_type original_var = (map_itr->first) + 1;
-    const dimension_type split_var = (map_itr->second) + 1;
-    for (dimension_type i = tableau_num_rows; i-- > 0; ) {
-      Row& tableau_i = tableau[i];
-      tableau_i[split_var] = -tableau_i[original_var];
-    }
-  }
-
-  // If there is no constraint in the tableau, then the feasible region
-  // is only delimited by non-negativity constraints. Therefore,
-  // the problem is unbounded as soon as the cost function has
-  // a variable with a positive coefficient.
-  if (tableau_num_rows == 0)
-    for (dimension_type i = tableau_num_cols; i-- > 1; )
-      if (input_obj_function[i] > 0){
-	status = UNBOUNDED;
-	return UNBOUNDED_LP_PROBLEM;
-      }
-  // The problem is neither trivially unfeasible nor trivially unbounded.
-  // The tableau was successfull computed and the caller has to figure
-  // out which case applies.
-  status = OPTIMIZED;
-  return OPTIMIZED_LP_PROBLEM;
-}
-
-bool
-PPL::LP_Problem::is_in_base(const dimension_type var_index,
-			    dimension_type& row_index) const {
-  for (row_index = base.size(); row_index-- > 0; )
-    if (base[row_index] == var_index)
-      return true;
-  return false;
-}
-
-PPL::Generator
-PPL::LP_Problem::compute_generator() const {
-  // We will store in num[] and in den[] the numerators and
-  // the denominators of every variable of the original problem.
-  dimension_type original_space_dim = input_cs.space_dimension();
-  std::vector<Coefficient> num(original_space_dim);
-  std::vector<Coefficient> den(original_space_dim);
-  dimension_type row = 0;
-
-  // We start to compute num[] and den[].
-  typedef std::map<dimension_type, dimension_type>::const_iterator iter;
-  iter map_end = dim_map.end();
-
-  for (dimension_type i = original_space_dim; i-- > 0; ) {
-    Coefficient& num_i = num[i];
-    Coefficient& den_i = den[i];
-    // Get the value of the variable from the tableau
-    // (if it is not a basic variable, the value is 0).
-    if (is_in_base(i+1, row)) {
-      const Row& t_row = tableau[row];
-      if (t_row[i+1] > 0) {
-	num_i= -t_row[0];
-	den_i= t_row[i+1];
-      }
-      else {
-	num_i= t_row[0];
-	den_i= -t_row[i+1];
-      }
-    }
-    else {
-      num_i = 0;
-      den_i = 1;
-    }
-    // Check whether the variable was split.
-    iter map_iter = dim_map.find(i);
-    if (map_iter != map_end) {
-      // The variable was split: get the value for the negative component,
-      // having index map[i] + 1.
-      const dimension_type split_i = map_iter->second;
-      // Like before, we he have to check if the variable is in base.
-      if (is_in_base(split_i+1, row)) {
-	const Row& t_row = tableau[row];
-	TEMP_INTEGER(split_num);
-	TEMP_INTEGER(split_den);
-	if (t_row[split_i+1] > 0) {
-	  split_num = -t_row[0];
-	  split_den = t_row[split_i+1];
-	}
-	else {
-	  split_num = t_row[0];
-	  split_den = -t_row[split_i+1];
-	}
-	// We compute the lcm to compute subsequently the difference
-	// between the 2 variables.
-	TEMP_INTEGER(lcm);
-	lcm_assign(lcm, den_i, split_den);
-	exact_div_assign(den_i, lcm, den_i);
-	exact_div_assign(split_den, lcm, split_den);
-	num_i *= den_i;
-	sub_mul_assign(num_i, split_num, split_den);
-	if (num_i == 0)
-	  den_i = 1;
-	else
-	  den_i = lcm;
-      }
-      // Note: if the negative component was not in base, then
-      // it has value zero and there is nothing left to do.
-    }
-  }
-
-  // Compute the lcm of all denominators.
-  TEMP_INTEGER(lcm);
-  lcm = den[0];
-  for (dimension_type i = 1; i < original_space_dim; ++i)
-    lcm_assign(lcm, lcm, den[i]);
-  // Use the denominators to store the numerators' multipliers
-  // and then compute the normalized numerators.
-  for (dimension_type i = original_space_dim; i-- > 0; ) {
-    exact_div_assign(den[i], lcm, den[i]);
-    num[i] *= den[i];
-  }
-
-  // Finally, build the generator.
-  Linear_Expression expr;
-  for (dimension_type i = original_space_dim; i-- > 0; )
-    expr += num[i] * Variable(i);
-  return point(expr, lcm);
-}
-
-void
-PPL::LP_Problem::second_phase() {
-  // Second_phase requires that *this is satisfiable.
-  assert(status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED);
-  // In the following cases the problem is already solved.
-  if (status == UNBOUNDED || status == OPTIMIZED)
-    return;
-
-  // Negate the cost function if we are minimizing.
-  Row new_cost = input_obj_function;
-  if (opt_mode == MINIMIZATION)
-    for (dimension_type i = new_cost.size(); i-- > 0; )
-      neg_assign(new_cost[i]);
-
-  // Substitute properly the cost funcion in the `costs' Matrix.
-  const dimension_type cost_zero_size = working_cost.size();
-  Row tmp_cost = Row(new_cost, cost_zero_size, cost_zero_size);
-  tmp_cost.swap(working_cost);
-  working_cost[cost_zero_size-1] = 1;
-  // Split the variable in the original cost function as defined in the
-  // `dim_map' variable.
-  typedef std::map<dimension_type, dimension_type>::const_iterator iter;
-  for (iter map_itr = dim_map.begin(),
-	 map_end = dim_map.end(); map_itr != map_end; ++map_itr){
-    const dimension_type original_var = (map_itr->first) + 1;
-    const dimension_type split_var = (map_itr->second) + 1;
-    working_cost[split_var] = -working_cost[original_var];
-  }
-
-  // Here the first phase problem succeeded with optimum value zero.
-  // Express the old cost function in terms of the computed base.
-  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
-    const dimension_type base_i = base[i];
-    if (working_cost[base_i] != 0)
-      linear_combine(working_cost, tableau[i], base_i);
-  }
-  // Solve the second phase problem.
-  bool second_phase_successful = compute_simplex();
-
-#if PPL_NOISY_SIMPLEX
-  std::cout << "LP_Problem::solve: 2nd phase ended at iteration "
-	    << num_iterations << "." << std::endl;
-#endif
-  if (second_phase_successful) {
-    last_generator = compute_generator();
-    status = OPTIMIZED;
-  }
-  else
-    status = UNBOUNDED;
-  assert(OK());
-}
-
-void
-PPL::LP_Problem::evaluate_objective_function(const Generator& evaluating_point,
-					     Coefficient& ext_n,
-					     Coefficient& ext_d) const {
-  const dimension_type ep_space_dim = evaluating_point.space_dimension();
-  if (space_dimension() < ep_space_dim)
-    throw std::invalid_argument("PPL::LP_Problem::"
-				"evaluate_objective_function(p, n, d):\n"
-				"*this and p are dimension incompatible.");
-  if (!evaluating_point.is_point())
-    throw std::invalid_argument("PPL::LP_Problem::"
-				"evaluate_objective_function(p, n, d):\n"
-				"p is not a point.");
-
-  // Compute the smallest space dimension  between `input_obj_function'
-  // and `evaluating_point'.
-  const dimension_type space_dim
-    = std::min(ep_space_dim, input_obj_function.space_dimension());
-  // Compute the optimal value of the cost function.
-  ext_n = input_obj_function.inhomogeneous_term();
-  for (dimension_type i = space_dim; i-- > 0; )
-    ext_n += evaluating_point.coefficient(Variable(i))
-      * input_obj_function.coefficient(Variable(i));
-  // Numerator and denominator should be coprime.
-  normalize2(ext_n, evaluating_point.divisor(), ext_n, ext_d);
-}
-
-bool
-PPL::LP_Problem::is_satisfiable() const {
-#if PPL_NOISY_SIMPLEX
-  num_iterations = 0;
-#endif
-  // Check for the `status' attribute in trivial cases.
-  switch (status) {
-  case UNSATISFIABLE:
-    return false;
-  case SATISFIABLE:
-    return true;
-  case UNBOUNDED:
-    return true;
-  case OPTIMIZED:
-    return true;
-  case PARTIALLY_SATISFIABLE:
-    return false;
-  case UNSOLVED:
-    break;
-  }
-
-  LP_Problem& x = const_cast<LP_Problem&>(*this);
-
-  // The space dimension of the solution to be computed.
-  // Note: here we can not use method Constraint_System::space_dimension(),
-  // because if the constraint system is NNC, then even the epsilon
-  // dimension has to be interpreted as a normal dimension.
-  const dimension_type space_dim = x.input_cs.num_columns() - 1;
-
-  // Reset internal objects.
-  x.tableau.clear();
-  x.dim_map.clear();
-  // Compute the initial tableau.
-  LP_Problem_Status s_status = x.compute_tableau();
-
-  // Check for trivial cases.
-  switch (s_status) {
-  case UNFEASIBLE_LP_PROBLEM:
-    return false;
-  case UNBOUNDED_LP_PROBLEM:
-    // A feasible point has to be returned: the origin.
-    // Ensure the right space dimension is obtained.
-    x.last_generator = point(0*Variable(space_dim-1));
-    return true;
-  case OPTIMIZED_LP_PROBLEM:
-    // Check for the special case of an empty tableau,
-    // in which case an optimizing solution is the origin.
-    if (x.tableau.num_rows() == 0) {
-      // Ensure the right space dimension is obtained.
-      x.last_generator = point(0*Variable(space_dim-1));
-      return true;
-    }
-    break;
-  }
-
-#if PPL_NOISY_SIMPLEX
-  num_iterations = 0;
-#endif
-
-  // Actually solve the LP problem.
-  x.base = std::vector<dimension_type> (x.tableau.num_rows());
-
-  // This will contain the new cost function for the 1st phase problem.
-  // Adds the necessary slack variables to get the 1st phase problem.
-  x.prepare_first_phase();
-  // Solve the first phase of the primal simplex algorithm.
-  bool first_phase_successful = x.compute_simplex();
-
-#if PPL_NOISY_SIMPLEX
-  std::cout << "LP_Problem::solve: 1st phase ended at iteration "
-	    << num_iterations << "." << std::endl;
-#endif
-  // If the first phase problem was not solved or if we found an optimum
-  // value different from zero, then the origianl problem is unfeasible.
-  if (!first_phase_successful || x.working_cost[0] != 0){
-    x.status = UNSATISFIABLE;
-    return false;
-  }
-
-  // The first phase has found a feasible solution. If only a satisfiability
-  // check was requested, we can return that feasible solution.
-  // Store the last succesfully computed generator.
-  x.last_generator = compute_generator();
-  x.status = SATISFIABLE;
-  // Erase the slack variables.
-  x.erase_slacks();
-  return true;
-}
-
-bool
-PPL::LP_Problem::OK() const {
-#ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
-#endif
-
-  // Constraint system should contain no strict inequalities.
-  if (input_cs.has_strict_inequalities()) {
-#ifndef NDEBUG
-    cerr << "The feasible region of the LP_Problem is defined by "
-	 << "a constraint system containing strict inequalities."
-	 << endl;
-#endif
-    return false;
-  }
-
-  // Constraint system and objective function should be dimension compatible.
-  const dimension_type space_dim = input_cs.space_dimension();
-  if (space_dim < input_obj_function.space_dimension()) {
-#ifndef NDEBUG
-    cerr << "The LP_Problem and the objective function have "
-	 << "incompatible space dimensions ("
-	 << space_dim << " < " << input_obj_function.space_dimension() << ")."
-	 << endl;
-#endif
-    return false;
-  }
-
-  if (status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED) {
-    // Here `last_generator' has to be meaningful.
-    // Check for dimension compatibility and actual feasibility.
-    if (space_dim != last_generator.space_dimension()) {
-#ifndef NDEBUG
-      cerr << "The LP_Problem and the cached feasible point have "
-	   << "incompatible space dimensions ("
-	   << space_dim << " != " << last_generator.space_dimension() << ")."
-	   << endl;
-#endif
-      return false;
-    }
-    if (!input_cs.satisfies_all_constraints(last_generator)) {
-#ifndef NDEBUG
-      cerr << "The cached feasible point does not belong to "
-	   << "the feasible region of the LP_Problem."
-	   << endl;
-#endif
-      return false;
-    }
-
-    const dimension_type tableau_nrows = tableau.num_rows();
-    const dimension_type tableau_ncols = tableau.num_columns();
-
-    // The number of rows in the tableau and base should be equal.
-    if (tableau_nrows != base.size()) {
-#ifndef NDEBUG
-      cerr << "tableau and base have incompatible sizes" << endl;
-#endif
-      return false;
-    }
-
-    // The number of columns in the tableau and working_cost should be equal.
-    if (tableau_ncols != working_cost.size()) {
-#ifndef NDEBUG
-      cerr << "tableau and working_cost have incompatible sizes" << endl;
-#endif
-      return false;
-    }
-
-    // The vector base should contain indices of tableau's columns.
-    for (dimension_type i = base.size(); i-- > 0; )
-      if (base[i] > tableau_ncols) {
-#ifndef NDEBUG
-	cerr << "base contains an invalid column index" << endl;
-#endif
-	return false;
-      }
-
-    // dim_map should encode an injective function having
-    // disjoint domain and range.
-    std::set<dimension_type> domain;
-    std::set<dimension_type> range;
-    typedef std::map<dimension_type, dimension_type>::const_iterator Iter;
-    for (Iter i = dim_map.begin(), iend = dim_map.end(); i != iend; ++i) {
-      domain.insert(i->first);
-      range.insert(i->second);
-    }
-    if (domain.size() != range.size()
-	|| domain.end() != std::find_first_of(domain.begin(), domain.end(),
-					      range.begin(), range.end())) {
-#ifndef NDEBUG
-      cerr << "dim_map encodes an invalid map" << endl;
-#endif
-      return false;
-    }
-  }
-  // TODO: further tests will be added when supporting incremental
-  // computations.
-
-  // All checks passed.
-  return true;
-}
-
-void
-PPL::LP_Problem::ascii_dump(std::ostream& s) const {
-  using namespace IO_Operators;
-
-  s << "input_cs\n";
-  input_cs.ascii_dump(s);
-  s << "\ninput_obj_function\n";
-  input_obj_function.ascii_dump(s);
-  s << "\nopt_mode " << (opt_mode == MAXIMIZATION ? "MAX" : "MIN") << "\n";
-
-  s << "\nstatus: ";
-  switch (status) {
-  case UNSATISFIABLE:
-    s << "UNSAT";
-    break;
-  case SATISFIABLE:
-    s << "SATIS";
-    break;
-  case UNBOUNDED:
-    s << "UNBOU";
-    break;
-  case OPTIMIZED:
-    s << "OPTIM";
-    break;
-  case PARTIALLY_SATISFIABLE:
-    s << "P_SAT";
-    break;
-  case UNSOLVED:
-    s << "UNSOL";
-    break;
-  }
-  s << "\n";
-
-  s << "\ntableau\n";
-  tableau.ascii_dump(s);
-  s << "\nworking_cost\n";
-  working_cost.ascii_dump(s);
-
-  const dimension_type base_size = base.size();
-  s << "\nbase (" << base_size << ")\n";
-  for (dimension_type i = 0; i != base_size; ++i)
-    s << base[i] << ' ';
-
-  const dimension_type dim_map_size = dim_map.size();
-  s << "\ndim_map (" << dim_map_size << ")\n";
-  for (std::map<dimension_type, dimension_type>::const_iterator
-	 i = dim_map.begin(), iend = dim_map.end(); i != iend; ++i)
-    s << Variable(i->first) << "->" << Variable(i->second) << ' ';
-
-  s << "\nlast_generator\n";
-  last_generator.ascii_dump(s);
-  s << "\n";
-}
-
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(LP_Problem);
diff --git a/src/LP_Problem.defs.hh b/src/LP_Problem.defs.hh
deleted file mode 100644
index 3f5e7db..0000000
--- a/src/LP_Problem.defs.hh
+++ /dev/null
@@ -1,394 +0,0 @@
-/* LP_Problem class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_LP_Problem_defs_hh
-#define PPL_LP_Problem_defs_hh 1
-
-#include "LP_Problem.types.hh"
-#include "globals.types.hh"
-#include "Row.defs.hh"
-#include "Matrix.defs.hh"
-#include "Constraint_System.defs.hh"
-#include "Linear_Expression.defs.hh"
-#include "Constraint.types.hh"
-#include "Generator.defs.hh"
-#include <vector>
-#include <map>
-#include <iosfwd>
-
-//! A Linear Programming problem.
-/*! \ingroup PPL_CXX_interface */
-class Parma_Polyhedra_Library::LP_Problem {
-public:
-  //! Default constructor: builds a trivial LP problem.
-  /*!
-    The trivial LP problem requires to maximize the objective function
-    \f$0\f$ on the zero-dimensional vector space under no constraints
-    at all: the origin of the vector space is the optimal solution.
-  */
-  LP_Problem();
-
-  /*! \brief
-    Builds an LP problem from the constraint system \p cs, the objective
-    function \p obj and optimization mode \p mode.
-
-    \param cs
-    The constraint system defining the feasible region for the LP problem.
-
-    \param obj
-    The objective function for the LP problem (optional argument with
-    default value \f$0\f$).
-
-    \param mode
-    The optimization mode (optional argument with default value
-    <CODE>MAXIMIZATION</CODE>).
-
-    \exception std::invalid_argument
-    Thrown if the constraint system contains any strict inequality
-    or if the space dimension of the objective function is strictly
-    greater than the space dimension of the constraint system.
-  */
-  explicit LP_Problem(const Constraint_System& cs,
-		      const Linear_Expression& obj = Linear_Expression::zero(),
-		      Optimization_Mode mode = MAXIMIZATION);
-
-  //! Ordinary copy-constructor.
-  LP_Problem(const LP_Problem& y);
-
-  //! Destructor.
-  ~LP_Problem();
-
-  //! Assignment operator.
-  LP_Problem& operator=(const LP_Problem& y);
-
-  //! Returns the maximum space dimension a LP_Problem can handle.
-  static dimension_type max_space_dimension();
-
-  //! Returns the space dimension of the current LP problem.
-  dimension_type space_dimension() const;
-
-  //! Returns the constraints defining the current feasible region.
-  const Constraint_System& constraints() const;
-
-  //! Returns the current objective function.
-  const Linear_Expression& objective_function() const;
-
-  //! Returns the current optimization mode.
-  Optimization_Mode optimization_mode() const;
-
-  //! Resets \p *this to be equal to the trivial LP problem.
-  void clear();
-
-  /*! \brief
-    Adds a copy of constraint \p c to the current LP problem,
-    increasing the number of space dimensions if needed.
-
-    \exception std::invalid_argument
-    Thrown if the constraint \p c is a strict inequality.
-  */
-  void add_constraint(const Constraint& c);
-
-  /*! \brief
-    Adds a copy of the constraints in \p cs to the current LP problem,
-    increasing the number of space dimensions if needed.
-
-    \exception std::invalid_argument
-    Thrown if the constraint system \p cs contains any strict inequality.
-  */
-  void add_constraints(const Constraint_System& cs);
-
-  //! Sets the objective function to \p obj.
-  /*!
-    \exception std::invalid_argument
-    Thrown if the space dimension of \p obj is strictly greater than
-    the space dimension of \p *this.
-  */
-  void set_objective_function(const Linear_Expression& obj);
-
-  //! Sets the optimization mode to \p mode.
-  void set_optimization_mode(Optimization_Mode mode);
-
-  //! Checks satisfiability of \p *this.
-  /*!
-    \return
-    <CODE>true</CODE> if and only if the LP problem is satisfiable.
-  */
-  bool is_satisfiable() const;
-
-  //! Optimizes the current LP problem using the primal simplex algorithm.
-  /*!
-    \return
-    An LP_Problem_Status flag indicating the outcome of the optimization
-    attempt (unfeasible, unbounded or optimized problem).
-  */
-  LP_Problem_Status solve() const;
-
-  /*! \brief
-    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
-    of evaluating the objective function on \p evaluating_point.
-
-    \param evaluating_point
-    The point on which the objective function will be evaluated.
-
-    \param num
-    On exit will contain the numerator of the evaluated value.
-
-    \param den
-    On exit will contain the denominator of the evaluated value.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p evaluating_point are dimension-incompatible
-    or if the generator \p evaluating_point is not a point.
-  */
-  void evaluate_objective_function(const Generator& evaluating_point,
-				   Coefficient& num,
-				   Coefficient& den) const;
-
-  //! Returns a feasible point for \p *this, if it exists.
-  /*!
-    \exception std::domain_error
-    Thrown if the LP problem is not satisfiable.
-  */
-  const Generator& feasible_point() const;
-
-  //! Returns an optimal point for \p *this, if it exists.
-  /*!
-    \exception std::domain_error
-    Thrown if \p *this doesn't not have an optimizing point, i.e.,
-    if the LP problem is unbounded or not satisfiable.
-  */
-  const Generator& optimizing_point() const;
-
-  /*! \brief
-    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
-    the solution of the optimization problem.
-
-    \exception std::domain_error
-    Thrown if \p *this doesn't not have an optimizing point, i.e.,
-    if the LP problem is unbounded or not satisfiable.
-  */
-  void optimal_value(Coefficient& num, Coefficient& den) const;
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-
-  PPL_OUTPUT_DECLARATIONS;
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
-
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
-
-  //! Swaps \p *this with \p y.
-  void swap(LP_Problem& y);
-
-private:
-  //! The matrix encoding the current feasible region in tableau form.
-  Matrix tableau;
-  //! The working cost function.
-  Row working_cost;
-  //! The current basic solution.
-  std::vector<dimension_type> base;
-  //! A mapping between original variables and split ones.
-  /*!
-    Contains all the pairs (i, j) such that Variable(i) (that was not found
-    to be constrained in sign) has been split into two nonnegative variables.
-    The "positive" one is represented again by Variable(i), and
-    the "negative" one is represented by Variable(j).
-  */
-  std::map<dimension_type, dimension_type> dim_map;
-
-  //! An enumerated type describing the internal status of the LP problem.
-  enum Status {
-    //! The LP problem has not been solved yet.
-    UNSOLVED,
-    //! The LP problem is unsatisfiable.
-    UNSATISFIABLE,
-    //! The LP problem is satisfiable; a feasible solution has been computed.
-    SATISFIABLE,
-    //! The LP problem is unbounded; a feasible solution has been computed.
-    UNBOUNDED,
-    //! The LP problem is optimized; an optimal solution has been computed.
-    OPTIMIZED,
-    /*! \brief
-      The feasible region of the LP problem has been changed by adding
-      new constraints; a feasible solution for the old constraints has
-      been computed.
-    */
-    PARTIALLY_SATISFIABLE
-  };
-
-  //! The internal state of the LP problem.
-  Status status;
-
-  //! The constraint system describing the feasible region.
-  Constraint_System input_cs;
-
-  //! The objective function to be optimized.
-  Linear_Expression input_obj_function;
-
-  //! The optimization mode requested.
-  Optimization_Mode opt_mode;
-
-  //! The last successfully computed feasible or optimizing point.
-  Generator last_generator;
-
-  /*! \brief
-    Optimizes the current LP problem using the second phase of the
-    primal simplex algorithm.
-  */
-  void second_phase();
-
-  /*! \brief
-    Assigns to \p this->tableau a simplex tableau representing the
-    current LP problem, inserting into \p this->dim_map the information
-    that is required to recover the original LP problem.
-
-    \return
-    <CODE>UNFEASIBLE_LP_PROBLEM</CODE> if the constraint system contains
-    any trivially unfeasible constraint (tableau was not computed);
-    <CODE>UNBOUNDED_LP_PROBLEM</CODE> if the problem is trivially unbounded
-    (the computed tableau contains no constraints);
-    <CODE>OPTIMIZED_LP_PROBLEM></CODE> if the problem is neither trivially
-    unfeasible nor trivially unbounded (the tableau was computed successfully).
-  */
-  LP_Problem_Status compute_tableau();
-
-  /*! \brief
-    Checks for optimality and, if it does not hold, computes the column
-    index of the variable entering the base of the LP problem.
-    Implemented with anti-cycling rule.
-
-    \return
-    The column index of the variable that enters the base. If no such
-    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
-  */
-  dimension_type get_entering_var_index() const;
-
-  /*! \brief
-    Computes the row index of the variable exiting the base
-    of the LP problem. Implemented with anti-cycling rules.
-
-    \return
-    The row index of the variable exiting the base.
-
-    \param entering_var_index
-    The column index of the variable entering the base.
-  */
-  dimension_type
-  get_exiting_base_index(dimension_type entering_var_index) const;
-
-  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
-  /*!
-    \param x
-    The Row that will be combined with \p y object.
-
-    \param y
-    The Row that will be combined with \p x object.
-
-    \param k
-    The position of \p *this that have to be \f$0\f$.
-
-    Computes a linear combination of \p x and \p y having
-    the element of index \p k equal to \f$0\f$. Then it assigns
-    the resulting Linear_Row to \p x and normalizes it.
-  */
-  static void linear_combine(Row& x, const Row& y, const dimension_type k);
-
-  /*! \brief
-    Swaps two variables in base during the simplex algorithm,
-    performing the needed linear combinations.
-
-    \param entering_var_index
-    The index of the variable entering the base.
-
-    \param exiting_base_index
-    The index of the row exiting the base.
-  */
-  void swap_base(const dimension_type entering_var_index,
-		 const dimension_type exiting_base_index);
-
-  /*! \brief
-    Checks for optimality and, if it does not hold, computes the column
-    index of the variable entering the base of the LP problem.
-
-    \return
-    The column index of the variable that enters the base. If no such
-    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
-
-    To compute the entering_index, the steepest edge algorithm chooses
-    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
-    largest in absolute value, where
-    \f[
-      \|\Delta x^{j} \|
-        = \left(
-            1+\sum_{i=1}^{m} \alpha_{ij}^2
-          \right)^{\frac{1}{2}}.
-    \f]
-    Recall that, due to the Integer implementation of the algorithm, our
-    tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
-    can be computed dividing the value of the cofficient by the value of
-    the variable in base. Obviously the result may not be an Integer, so
-    we will proceed in another way: the following code will compute the
-    lcm of all the variables in base to get the good ``weight'' of each
-    Coefficient of the tableau.
-  */
-  dimension_type steepest_edge() const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and if only the algorithm successfully
-    computed a feasible solution.
-  */
-  bool compute_simplex();
-
-  /*! \brief
-    Adds the slack variables to satisfy the standard form of a LP problem,
-    inserts the "sign" to the cost functions, and makes the
-    necessary swaps to express the problem with the 1st phase base.
-  */
-  void prepare_first_phase();
-
-  /*! \brief
-    Drop unnecessary slack variables from the tableau and get ready
-    for the second phase of the simplex algorithm.
-  */
-  void erase_slacks();
-
-  bool is_in_base(const dimension_type var_index,
-		  dimension_type& row_index) const;
-
-  Generator compute_generator() const;
-};
-
-#include "LP_Problem.inlines.hh"
-
-#endif // !defined(PPL_LP_Problem_defs_hh)
diff --git a/src/LP_Problem.inlines.hh b/src/LP_Problem.inlines.hh
deleted file mode 100644
index ec0197e..0000000
--- a/src/LP_Problem.inlines.hh
+++ /dev/null
@@ -1,267 +0,0 @@
-/* LP_Problem class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_LP_Problem_inlines_hh
-#define PPL_LP_Problem_inlines_hh 1
-
-#include "Constraint.defs.hh"
-#include "Constraint_System.defs.hh"
-#include <stdexcept>
-
-namespace Parma_Polyhedra_Library {
-
-inline
-LP_Problem::LP_Problem()
-  : tableau(), working_cost(0, Row::Flags()),
-    base(),  dim_map(), status(OPTIMIZED),
-    input_cs(), input_obj_function(), opt_mode(MAXIMIZATION),
-    last_generator(point()) {
-  assert(OK());
-}
-
-inline
-LP_Problem::LP_Problem(const Constraint_System& cs,
-		       const Linear_Expression& obj,
-		       const Optimization_Mode mode)
-  : tableau(), working_cost(0, Row::Flags()),
-    base(), dim_map(), status(UNSOLVED),
-    input_cs(!cs.has_strict_inequalities()
-	     ? cs
-	     : (throw std::invalid_argument("PPL::LP_Problem::"
-			   "LP_Problem(cs, obj, m):\n"
-			   "cs contains strict inequalities."),
-		cs)),
-    input_obj_function(obj.space_dimension() <= cs.space_dimension()
-		       ? obj
-		       : (throw std::invalid_argument("PPL::LP_Problem::"
-			             "LP_Problem(cs, obj, m):\n"
-				     "cs and obj have "
-				     "incompatible space dimensions."),
-			  obj)),
-    opt_mode(mode),
-    last_generator(point()) {
-  assert(OK());
-}
-
-inline
-LP_Problem::LP_Problem(const LP_Problem& y)
-  : tableau(y.tableau), working_cost(y.working_cost),
-    base(y.base), dim_map(y.dim_map), status(y.status),
-    input_cs(y.input_cs), input_obj_function(y.input_obj_function),
-    opt_mode(y.opt_mode), last_generator(y.last_generator) {
-  assert(OK());
-}
-
-inline
-LP_Problem::~LP_Problem() {
-}
-
-inline void
-LP_Problem::swap(LP_Problem& y) {
-  std::swap(tableau, y.tableau);
-  std::swap(working_cost, y.working_cost);
-  std::swap(base, y.base);
-  std::swap(dim_map, y.dim_map);
-  std::swap(status, y.status);
-  std::swap(input_cs, y.input_cs);
-  std::swap(input_obj_function, y.input_obj_function);
-  std::swap(opt_mode, y.opt_mode);
-  std::swap(last_generator, y.last_generator);
-}
-
-inline LP_Problem&
-LP_Problem::operator=(const LP_Problem& y) {
-  LP_Problem tmp(y);
-  swap(tmp);
-  return *this;
-}
-
-inline dimension_type
-LP_Problem::max_space_dimension() {
-  return Constraint_System::max_space_dimension();
-}
-
-inline dimension_type
-LP_Problem::space_dimension() const {
-  return input_cs.space_dimension();
-}
-
-inline const Constraint_System&
-LP_Problem::constraints() const {
-  return input_cs;
-}
-
-inline const Linear_Expression&
-LP_Problem::objective_function() const {
-  return input_obj_function;
-}
-
-inline Optimization_Mode
-LP_Problem::optimization_mode() const {
-  return opt_mode;
-}
-
-inline void
-LP_Problem::clear() {
-  LP_Problem tmp;
-  swap(tmp);
-}
-
-inline void
-LP_Problem::add_constraint(const Constraint& c) {
-  if (c.is_strict_inequality())
-    throw std::invalid_argument("PPL::LP_Problem::add_constraint(c):\n"
-				"c is a strict inequality.");
-  input_cs.insert(c);
-  if (status != UNSATISFIABLE)
-    // TODO: apply an incremental version of the simplex algorithm,
-    // setting `status' to PARTIALLY_SATISFIABLE;
-    status = UNSOLVED;
-}
-
-inline void
-LP_Problem::add_constraints(const Constraint_System& cs) {
-  if (cs.has_strict_inequalities())
-    throw std::invalid_argument("PPL::LP_Problem::add_constraints(cs):\n"
-				"cs contains strict inequalities.");
-  const dimension_type cs_num_rows = cs.num_rows();
-  for (dimension_type i = cs_num_rows; i-- > 0; )
-    input_cs.insert(cs[i]);
-  if (status != UNSATISFIABLE)
-    // TODO: apply an incremental version of the simplex algorithm,
-    // setting `status' to PARTIALLY_SATISFIABLE;
-    status = UNSOLVED;
-  assert(OK());
-}
-
-inline void
-LP_Problem::set_objective_function(const Linear_Expression& obj) {
-  if (space_dimension() < obj.space_dimension())
-    throw std::invalid_argument("PPL::LP_Problem::"
-				"set_objective_function(obj):\n"
-				"*this and obj are dimension incompatible.");
-  switch (status) {
-  case UNBOUNDED:
-    status = SATISFIABLE;
-    break;
-  case OPTIMIZED:
-    status = SATISFIABLE;
-    break;
-  default:
-    break;
-  }
-  input_obj_function = obj;
-  assert(OK());
-}
-
-inline void
-LP_Problem::set_optimization_mode(Optimization_Mode mode) {
-  if (opt_mode == mode)
-    return;
-  switch (status) {
-  case UNBOUNDED:
-    status = SATISFIABLE;
-    break;
-  case OPTIMIZED:
-    status = SATISFIABLE;
-    break;
-  default:
-    break;
-  }
-  opt_mode = mode;
-  assert(OK());
-}
-
-inline LP_Problem_Status
-LP_Problem::solve() const {
-  if (is_satisfiable()) {
-    LP_Problem& x = const_cast<LP_Problem&>(*this);
-    x.second_phase();
-    if (x.status == UNBOUNDED)
-      return UNBOUNDED_LP_PROBLEM;
-    if (x.status == OPTIMIZED)
-      return OPTIMIZED_LP_PROBLEM;
-  }
-  return UNFEASIBLE_LP_PROBLEM;
-}
-
-inline const Generator&
-LP_Problem::feasible_point() const {
-  if (is_satisfiable()) {
-    assert(OK());
-    return last_generator;
-  }
-  throw std::domain_error("PPL::LP_Problem::feasible_point():\n"
-			  "*this is not satisfiable.");
-}
-
-inline const Generator&
-LP_Problem::optimizing_point() const {
-  if (solve() == OPTIMIZED_LP_PROBLEM)
-    return last_generator;
-  throw std::domain_error("PPL::LP_Problem::optimizing_point():\n"
-			  "*this doesn't have an optimizing point.");
-}
-
-inline void
-LP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
-  const Generator& g_ref = optimizing_point();
-  evaluate_objective_function(g_ref, num, den);
-  assert(OK());
-}
-
-inline memory_size_type
-LP_Problem::external_memory_in_bytes() const {
-  memory_size_type n
-    = tableau.external_memory_in_bytes()
-    + working_cost.external_memory_in_bytes()
-    + input_cs.external_memory_in_bytes()
-    + input_obj_function.external_memory_in_bytes()
-    + last_generator.external_memory_in_bytes();
-  // Adding the external memory for `base'.
-  n += base.capacity() * sizeof(dimension_type);
-  // Adding the external memory for `dim_map'.
-  // CHECK ME: just a lower approximation?
-  n += dim_map.size()
-    * sizeof(std::map<dimension_type, dimension_type>::value_type);
-  return n;
-}
-
-inline memory_size_type
-LP_Problem::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
-
-} // namespace Parma_Polyhedra_Library
-
-namespace std {
-
-/*! \relates Parma_Polyhedra_Library::LP_Problem */
-inline void
-swap(Parma_Polyhedra_Library::LP_Problem& x,
-     Parma_Polyhedra_Library::LP_Problem& y) {
-  x.swap(y);
-}
-
-} // namespace std
-
-#endif // !defined(PPL_LP_Problem_inlines_hh)
diff --git a/src/LP_Problem.types.hh b/src/LP_Problem.types.hh
deleted file mode 100644
index ea812e1..0000000
--- a/src/LP_Problem.types.hh
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is free software; as a special exception the author 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. */
-
-#ifndef PPL_LP_Problem_types_hh
-#define PPL_LP_Problem_types_hh 1
-
-namespace Parma_Polyhedra_Library {
-
-//! Possible outcomes of the LP_Problem solver.
-/*! \ingroup PPL_CXX_interface */
-enum LP_Problem_Status {
-  //! The problem is unfeasible.
-  UNFEASIBLE_LP_PROBLEM,
-  //! The problem is unbounded.
-  UNBOUNDED_LP_PROBLEM,
-  //! The problem has an optimal solution.
-  OPTIMIZED_LP_PROBLEM
-};
-
-class LP_Problem;
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_LP_Problem_types_hh)
diff --git a/src/Limits.hh b/src/Limits.hh
deleted file mode 100644
index 3fec349..0000000
--- a/src/Limits.hh
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Limits for native integer types.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Limits_hh
-#define PPL_Limits_hh 1
-
-#include <climits>
-
-// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
-// C99 is not yet included into the C++ standard.
-// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
-// Some compilers (such as Comeau C++ up to and including version 4.3.3)
-// define nothing.  In this last case we make a reasonable guess.
-#ifndef LLONG_MIN
-#if defined(LONG_LONG_MIN)
-#define LLONG_MIN LONG_LONG_MIN
-#elif SIZEOF_LONG_LONG == 8
-#define LLONG_MIN 0x8000000000000000LL
-#endif
-#endif
-
-#ifndef LLONG_MAX
-#if defined(LONG_LONG_MAX)
-#define LLONG_MAX LONG_LONG_MAX
-#elif SIZEOF_LONG_LONG == 8
-#define LLONG_MAX 0x7fffffffffffffffLL
-#endif
-#endif
-
-#ifndef ULLONG_MAX
-#if defined(ULONG_LONG_MAX)
-#define ULLONG_MAX ULONG_LONG_MAX
-#elif SIZEOF_UNSIGNED_LONG_LONG == 8
-#define ULLONG_MAX 0xffffffffffffffffULL
-#endif
-#endif
-
-namespace Parma_Polyhedra_Library {
-
-/*
-  The only reason to use these definitions instead of std::numeric_limits
-  is a missing optimization in GCC 3.4.1.
-*/
-
-template <typename T>
-struct Limits;
-
-#define signed_limits(type, prefix) \
-template <> \
-struct Limits<type> { \
-	static const type min = prefix ## _MIN; \
-	static const type max = prefix ## _MAX; \
-}
-
-#define unsigned_limits(type, prefix) \
-template <> \
-struct Limits<type> { \
-	static const type min = 0; \
-	static const type max = prefix ## _MAX; \
-}
-
-signed_limits(signed char, SCHAR);
-signed_limits(short, SHRT);
-signed_limits(int, INT);
-signed_limits(long, LONG);
-signed_limits(long long, LLONG);
-
-unsigned_limits(unsigned char, UCHAR);
-unsigned_limits(unsigned short, USHRT);
-unsigned_limits(unsigned int, UINT);
-unsigned_limits(unsigned long, ULONG);
-unsigned_limits(unsigned long long, ULLONG);
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Limits_hh)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc
index 5fd2a3b..1083fcd 100644
--- a/src/Linear_Expression.cc
+++ b/src/Linear_Expression.cc
@@ -1,11 +1,11 @@
 /* Linear_Expression class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,11 +21,12 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Linear_Expression.defs.hh"
 #include "Constraint.defs.hh"
 #include "Generator.defs.hh"
+#include "Grid_Generator.defs.hh"
 #include "Congruence.defs.hh"
 #include <stdexcept>
 
@@ -46,6 +47,29 @@ PPL::Linear_Expression::Linear_Expression(const Generator& g)
     e[i] = g[i];
 }
 
+PPL::Linear_Expression::Linear_Expression(const Grid_Generator& g)
+  : Linear_Row(g.space_dimension() + 1, Linear_Row::Flags()) {
+  Linear_Expression& e = *this;
+  // Do not copy the divisor of `g'.
+  for (dimension_type i = size(); --i > 0; )
+    e[i] = g[i];
+}
+
+const PPL::Linear_Expression* PPL::Linear_Expression::zero_p = 0;
+
+void
+PPL::Linear_Expression::initialize() {
+  assert(zero_p == 0);
+  zero_p = new Linear_Expression(Coefficient_zero());
+}
+
+void
+PPL::Linear_Expression::finalize() {
+  assert(zero_p != 0);
+  delete zero_p;
+  zero_p = 0;
+}
+
 PPL::Linear_Expression::Linear_Expression(const Congruence& cg)
   : Linear_Row(cg.space_dimension() + 1, Linear_Row::Flags()) {
   Linear_Expression& e = *this;
@@ -53,7 +77,6 @@ PPL::Linear_Expression::Linear_Expression(const Congruence& cg)
     e[i] = cg[i];
 }
 
-
 /*! \relates Parma_Polyhedra_Library::Linear_Expression */
 PPL::Linear_Expression
 PPL::operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
@@ -237,17 +260,17 @@ PPL::operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
 
 bool
 PPL::Linear_Expression::OK() const {
-  dimension_type sz = size();
-  return Linear_Row::OK(sz, sz);
+  return Linear_Row::OK();
 }
 
 /*! \relates Parma_Polyhedra_Library::Linear_Expression */
 std::ostream&
 PPL::IO_Operators::operator<<(std::ostream& s, const Linear_Expression& e) {
-  const int num_variables = e.space_dimension();
+  const dimension_type num_variables = e.space_dimension();
+  TEMP_INTEGER(ev);
   bool first = true;
-  for (int v = 0; v < num_variables; ++v) {
-    Coefficient ev = e[v+1];
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    ev = e[v+1];
     if (ev != 0) {
       if (!first) {
 	if (ev > 0)
@@ -267,7 +290,8 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Linear_Expression& e) {
     }
   }
   // Inhomogeneous term.
-  Coefficient it = e[0];
+  TEMP_INTEGER(it);
+  it = e[0];
   if (it != 0) {
     if (!first) {
       if (it > 0)
@@ -287,3 +311,5 @@ PPL::IO_Operators::operator<<(std::ostream& s, const Linear_Expression& e) {
     s << Coefficient_zero();
   return s;
 }
+
+PPL_OUTPUT_DEFINITIONS(Linear_Expression)
diff --git a/src/Linear_Expression.defs.hh b/src/Linear_Expression.defs.hh
index b822e14..94e36ce 100644
--- a/src/Linear_Expression.defs.hh
+++ b/src/Linear_Expression.defs.hh
@@ -1,11 +1,11 @@
 /* Linear_Expression class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,22 +38,11 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Grid_Generator_System.types.hh"
 #include "Polyhedron.types.hh"
 #include "Grid.types.hh"
-#include "LP_Problem.types.hh"
 #include <cstddef>
 
 namespace Parma_Polyhedra_Library {
 // Put them in the namespace here to declare them friend later.
 
-//! Returns the congruence \p e1 = \p e2 \p \pmod{1}.
-/*! \relates Congruence */
-Congruence
-operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
-
-//! Returns the congruence \p e = \p n \p \pmod{1}.
-/*! \relates Congruence */
-Congruence
-operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
-
 //! Returns the linear expression \p e1 + \p e2.
 /*! \relates Linear_Expression */
 Linear_Expression
@@ -262,7 +251,7 @@ public:
   explicit Linear_Expression(Coefficient_traits::const_reference n);
 
   //! Builds the linear expression corresponding to the variable \p v.
-  /*! \relates Linear_Expression
+  /*!
     \exception std::length_error
     Thrown if the space dimension of \p v exceeds
     <CODE>Linear_Expression::max_space_dimension()</CODE>.
@@ -296,6 +285,17 @@ public:
   */
   explicit Linear_Expression(const Generator& g);
 
+  /*! \brief
+    Builds the linear expression corresponding to grid generator \p g
+    (for points, parameters and lines the divisor is not copied).
+
+    Given the grid generator
+    \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+    The inhomogeneous term of the linear expression is always 0.
+  */
+  explicit Linear_Expression(const Grid_Generator& g);
+
   //! Builds the linear expression corresponding to congruence \p cg.
   /*!
     Given the congruence
@@ -316,6 +316,12 @@ public:
   //! Returns the inhomogeneous term of \p *this.
   Coefficient_traits::const_reference inhomogeneous_term() const;
 
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
   //! Returns the (zero-dimension space) constant 0.
   static const Linear_Expression& zero();
 
@@ -328,6 +334,17 @@ public:
   //! Returns the size in bytes of the memory managed by \p *this.
   memory_size_type external_memory_in_bytes() const;
 
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 
@@ -335,6 +352,12 @@ public:
   void swap(Linear_Expression& y);
 
 private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the (zero-dimension space) constant 0.
+  */
+  static const Linear_Expression* zero_p;
+
   friend class Parma_Polyhedra_Library::Scalar_Products;
   friend class Parma_Polyhedra_Library::Constraint;
   friend class Parma_Polyhedra_Library::Generator;
@@ -344,7 +367,6 @@ private:
   // FIXME: the following friend declaration should be avoided.
   friend class Parma_Polyhedra_Library::Polyhedron;
   friend class Parma_Polyhedra_Library::Grid;
-  friend class Parma_Polyhedra_Library::LP_Problem;
 
   // FIXME: the following friend declaration is only to grant access to
   // Constraint_System::affine_preimage().
@@ -372,71 +394,60 @@ private:
   */
   Linear_Expression(dimension_type sz, bool);
 
+  /*! \brief
+    Builds the linear expression corresponding to the difference of
+    \p v and \p w.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p v or the one of \p w exceed
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v, Variable w);
+
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
+  operator+(const Linear_Expression& e1, const Linear_Expression& e2);
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+  operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
 
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
+  operator-(const Linear_Expression& e);
 
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
+  operator-(const Linear_Expression& e1, const Linear_Expression& e2);
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+  operator-(Variable v, Variable w);
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
 
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+  operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
   friend Linear_Expression
-  Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
 
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
-				      const Linear_Expression& e2);
+  operator+=(Linear_Expression& e1, const Linear_Expression& e2);
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
-				      Variable v);
+  operator+=(Linear_Expression& e, Variable v);
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
 
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
-				      const Linear_Expression& e2);
+  operator-=(Linear_Expression& e1, const Linear_Expression& e2);
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
-				      Variable v);
+  operator-=(Linear_Expression& e, Variable v);
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
 
   friend Linear_Expression&
-  Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
 
   friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
-						    const Linear_Expression& e);
-
-  friend Congruence
-  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
-
-  friend Congruence
-  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<(std::ostream& s, const Linear_Expression& e);
 };
 
 #include "Linear_Expression.inlines.hh"
diff --git a/src/Linear_Expression.inlines.hh b/src/Linear_Expression.inlines.hh
index ae0f301..80c31ac 100644
--- a/src/Linear_Expression.inlines.hh
+++ b/src/Linear_Expression.inlines.hh
@@ -1,11 +1,11 @@
 /* Linear_Expression class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -58,6 +58,24 @@ Linear_Expression::Linear_Expression(const Variable v)
 }
 
 inline
+Linear_Expression::Linear_Expression(const Variable v, const Variable w)
+  : Linear_Row() {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > max_space_dimension())
+    throw std::length_error("PPL::Linear_Expression::"
+                            "Linear_Expression(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  construct(space_dim+1, Linear_Row::Flags());
+  if (v_space_dim != w_space_dim) {
+    (*this)[v_space_dim] = 1;
+    (*this)[w_space_dim] = -1;
+  }
+}
+
+inline
 Linear_Expression::Linear_Expression(const Linear_Expression& e)
   : Linear_Row(e) {
 }
@@ -97,8 +115,8 @@ Linear_Expression::inhomogeneous_term() const {
 
 inline const Linear_Expression&
 Linear_Expression::zero() {
-  static Linear_Expression z = Linear_Expression(Coefficient_zero());
-  return z;
+  assert(zero_p != 0);
+  return *zero_p;
 }
 
 inline memory_size_type
@@ -152,8 +170,7 @@ operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
 /*! \relates Linear_Expression */
 inline Linear_Expression
 operator-(const Variable v, const Variable w) {
-  // FIXME: provide a better implementation.
-  return Linear_Expression(v) - Linear_Expression(w);
+  return Linear_Expression(v, w);
 }
 
 /*! \relates Linear_Expression */
@@ -195,6 +212,16 @@ Linear_Expression::swap(Linear_Expression& y) {
   Linear_Row::swap(y);
 }
 
+inline void
+Linear_Expression::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Linear_Expression::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
 } // namespace Parma_Polyhedra_Library
 
 
diff --git a/src/Linear_Expression.types.hh b/src/Linear_Expression.types.hh
index 3858003..2e8593d 100644
--- a/src/Linear_Expression.types.hh
+++ b/src/Linear_Expression.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Linear_Row.cc b/src/Linear_Row.cc
index 7d77920..5d785b2 100644
--- a/src/Linear_Row.cc
+++ b/src/Linear_Row.cc
@@ -1,11 +1,11 @@
 /* Linear_Row class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Linear_Row.defs.hh"
 #include "Coefficient.defs.hh"
@@ -154,7 +154,7 @@ PPL::Linear_Row::Flags::ascii_dump(std::ostream& s) const {
     << is_nnc;
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row::Flags);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row::Flags)
 
 bool
 PPL::Linear_Row::Flags::ascii_load(std::istream& s) {
@@ -167,7 +167,7 @@ PPL::Linear_Row::Flags::ascii_load(std::istream& s) {
     if (!(s >> str))
       return false;
     if (str[0] == '+')
-      set_bits(1 << Row::Flags::first_free_bit + bit);
+      set_bits(1 << (Row::Flags::first_free_bit + bit));
     else if (str[0] != '-')
       return false;
     if (str.compare(1, strlen(bit_names[bit]), bit_names[bit]) != 0)
@@ -179,7 +179,8 @@ PPL::Linear_Row::Flags::ascii_load(std::istream& s) {
 void
 PPL::Linear_Row::ascii_dump(std::ostream& s) const {
   const Row& x = *this;
-  dimension_type x_size = x.size();
+  const dimension_type x_size = x.size();
+  s << "size " << x_size << " ";
   for (dimension_type i = 0; i < x_size; ++i)
     s << x[i] << ' ';
   s << "f ";
@@ -187,14 +188,27 @@ PPL::Linear_Row::ascii_dump(std::ostream& s) const {
   s << "\n";
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row)
 
 bool
 PPL::Linear_Row::ascii_load(std::istream& s) {
-  Row& x = *this;
   std::string str;
-  const dimension_type x_size = x.size();
-  for (dimension_type col = 0; col < x_size; ++col)
+  if (!(s >> str) || str != "size")
+    return false;
+  dimension_type new_size;
+  if (!(s >> new_size))
+    return false;
+
+  Row& x = *this;
+  const dimension_type old_size = x.size();
+  if (new_size < old_size)
+    x.shrink(new_size);
+  else if (new_size > old_size) {
+    Row y(new_size, Row::Flags());
+    x.swap(y);
+  }
+
+  for (dimension_type col = 0; col < new_size; ++col)
     if (!(s >> x[col]))
       return false;
   if (!(s >> str) || (str.compare("f") != 0))
@@ -203,6 +217,11 @@ PPL::Linear_Row::ascii_load(std::istream& s) {
 }
 
 bool
+PPL::Linear_Row::OK() const {
+  return Row::OK();
+}
+
+bool
 PPL::Linear_Row::OK(const dimension_type row_size,
 		    const dimension_type row_capacity) const {
   return Row::OK(row_size, row_capacity);
diff --git a/src/Linear_Row.defs.hh b/src/Linear_Row.defs.hh
index 8088795..ea11b54 100644
--- a/src/Linear_Row.defs.hh
+++ b/src/Linear_Row.defs.hh
@@ -1,11 +1,11 @@
 /* Linear_Row class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -119,7 +119,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
   linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 class Parma_Polyhedra_Library::Linear_Row : public Row {
 public:
@@ -139,7 +139,7 @@ public:
     or not) and the kind (line/equality or ray/point/inequality)
     of a Linear_Row object.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   class Flags : public Row::Flags {
   public:
     //! Default constructor: builds an object where all flags are invalid.
@@ -174,12 +174,12 @@ public:
     */
     bool operator!=(const Flags& y) const;
 
-    PPL_OUTPUT_DECLARATIONS;
+    PPL_OUTPUT_DECLARATIONS
 
-    //! Uses the ASCII Flags representation from \p s to recreate *this.
-    /*!
-      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-      otherwise.  The ASCII representation is as output by \ref ascii_dump.
+    /*! \brief
+      Loads from \p s an ASCII representation (as produced by
+      ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
     */
     bool ascii_load(std::istream& s);
 
@@ -365,16 +365,22 @@ public:
   */
   bool all_homogeneous_terms_are_zero() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
-  //! Uses the ASCII Linear_Row representation from \p s to recreate *this.
-  /*!
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
 
   //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Checks if all the invariants are satisfied and that the actual
+    size and capacity match the values provided as arguments.
+  */
   bool OK(dimension_type row_size, dimension_type row_capacity) const;
 
 private:
@@ -429,7 +435,7 @@ bool operator!=(const Linear_Row& x, const Linear_Row& y);
   - +1, if \p y is smaller than \p x and they \e are parallel;
   - +2, if \p y is smaller than \p x and they are \e not parallel.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 int compare(const Linear_Row& x, const Linear_Row& y);
 
 } // namespace Parma_Polyhedra_Library
@@ -440,14 +446,14 @@ namespace std {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::Linear_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void swap(Parma_Polyhedra_Library::Linear_Row& x,
 	  Parma_Polyhedra_Library::Linear_Row& y);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::iter_swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::Linear_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
 	       std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
 
diff --git a/src/Linear_Row.inlines.hh b/src/Linear_Row.inlines.hh
index 9444163..cbc2eba 100644
--- a/src/Linear_Row.inlines.hh
+++ b/src/Linear_Row.inlines.hh
@@ -1,11 +1,11 @@
 /* Linear_Row class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Linear_Row.types.hh b/src/Linear_Row.types.hh
index 618a4cd..2f3939a 100644
--- a/src/Linear_Row.types.hh
+++ b/src/Linear_Row.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Linear_System.cc b/src/Linear_System.cc
index e65fc2b..cf2fcca 100644
--- a/src/Linear_System.cc
+++ b/src/Linear_System.cc
@@ -1,11 +1,11 @@
 /* Linear_System class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,12 +20,12 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Linear_System.defs.hh"
 #include "Coefficient.defs.hh"
 #include "Row.defs.hh"
-#include "Saturation_Matrix.defs.hh"
+#include "Bit_Matrix.defs.hh"
 #include "Scalar_Products.defs.hh"
 #include <algorithm>
 #include <iostream>
@@ -131,7 +131,7 @@ PPL::Linear_System::ascii_dump(std::ostream& s) const {
     x[i].ascii_dump(s);
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_System);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_System)
 
 bool
 PPL::Linear_System::ascii_load(std::istream& s) {
@@ -173,7 +173,7 @@ PPL::Linear_System::ascii_load(std::istream& s) {
     if (!x[row].ascii_load(s))
       return false;
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK(true));
   return true;
 }
@@ -200,16 +200,14 @@ PPL::Linear_System::insert(const Linear_Row& r) {
       swap_columns(old_num_columns - 1, r_size - 1);
     add_row(r);
   }
-  else if (r_size < old_num_columns)
-    if (is_necessarily_closed() || old_num_rows == 0)
-      add_row(Linear_Row(r, old_num_columns, row_capacity));
-    else {
-      // Create a resized copy of the row (and move the epsilon
-      // coefficient to its last position).
-      Linear_Row tmp_row(r, old_num_columns, row_capacity);
+  else if (r_size < old_num_columns) {
+    // Create a resized copy of the row.
+    Linear_Row tmp_row(r, old_num_columns, row_capacity);
+    // If needed, move the epsilon coefficient to the last position.
+    if (!is_necessarily_closed())
       std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]);
-      add_row(tmp_row);
-    }
+    add_row(tmp_row);
+  }
   else
     // Here r_size == old_num_columns.
     add_row(r);
@@ -289,11 +287,11 @@ PPL::Linear_System::add_rows(const Linear_System& y) {
   assert(num_pending_rows() == 0);
 
   // Adding no rows is a no-op.
-  if (y.num_rows() == 0)
+  if (y.has_no_rows())
     return;
 
   // Check if sortedness is preserved.
-  if (is_sorted())
+  if (is_sorted()) {
     if (!y.is_sorted() || y.num_pending_rows() > 0)
       set_sorted(false);
     else {
@@ -302,6 +300,7 @@ PPL::Linear_System::add_rows(const Linear_System& y) {
       if (n_rows > 0)
 	set_sorted(compare((*this)[n_rows-1], y[0]) <= 0);
     }
+  }
 
   // Add the rows of `y' as if they were pending.
   add_pending_rows(y);
@@ -340,7 +339,7 @@ PPL::Linear_System::sort_rows(const dimension_type first_row,
   std::vector<Row>::iterator new_last = swapping_unique(first, last);
   // Finally, remove duplicates.
   rows.erase(new_last, last);
-  // NOTE: we cannot check for well-formedness of the system here,
+  // NOTE: we cannot check all invariants of the system here,
   // because the caller still has to update `index_first_pending'.
 }
 
@@ -453,28 +452,31 @@ PPL::Linear_System::add_pending_row(const Linear_Row::Flags flags) {
 void
 PPL::Linear_System::normalize() {
   Linear_System& x = *this;
+  const dimension_type nrows = x.num_rows();
   // We normalize also the pending rows.
-  for (dimension_type i = num_rows(); i-- > 0; )
+  for (dimension_type i = nrows; i-- > 0; )
     x[i].normalize();
-  set_sorted(false);
+  set_sorted(nrows <= 1);
 }
 
 void
 PPL::Linear_System::strong_normalize() {
   Linear_System& x = *this;
+  const dimension_type nrows = x.num_rows();
   // We strongly normalize also the pending rows.
-  for (dimension_type i = num_rows(); i-- > 0; )
+  for (dimension_type i = nrows; i-- > 0; )
     x[i].strong_normalize();
-  set_sorted(false);
+  set_sorted(nrows <= 1);
 }
 
 void
 PPL::Linear_System::sign_normalize() {
   Linear_System& x = *this;
+  const dimension_type nrows = x.num_rows();
   // We sign-normalize also the pending rows.
   for (dimension_type i = num_rows(); i-- > 0; )
     x[i].sign_normalize();
-  set_sorted(false);
+  set_sorted(nrows <= 1);
 }
 
 /*! \relates Parma_Polyhedra_Library::Linear_System */
@@ -498,7 +500,7 @@ PPL::operator==(const Linear_System& x, const Linear_System& y) {
 }
 
 void
-PPL::Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat) {
+PPL::Linear_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
   Linear_System& sys = *this;
   // We can only sort the non-pending part of the system.
   assert(sys.first_pending_row() == sat.num_rows());
@@ -508,11 +510,11 @@ PPL::Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat) {
   }
 
   // First, sort `sys' (keeping `sat' consistent) without removing duplicates.
-  With_Saturation_Matrix_iterator first(sys.rows.begin(), sat.rows.begin());
-  With_Saturation_Matrix_iterator last = first + sat.num_rows();
+  With_Bit_Matrix_iterator first(sys.rows.begin(), sat.rows.begin());
+  With_Bit_Matrix_iterator last = first + sat.num_rows();
   swapping_sort(first, last, Row_Less_Than());
   // Second, move duplicates in `sys' to the end (keeping `sat' consistent).
-  With_Saturation_Matrix_iterator new_last = swapping_unique(first, last);
+  With_Bit_Matrix_iterator new_last = swapping_unique(first, last);
 
   const dimension_type num_duplicates = last - new_last;
   const dimension_type new_first_pending_row
@@ -594,6 +596,7 @@ PPL::Linear_System
   // lines or equalities, all of which occur before the first ray
   // or point or inequality.
   assert(x.OK(true));
+  assert(x.num_columns() >= 1);
   assert(x.num_pending_rows() == 0);
   assert(n_lines_or_equalities <= x.num_lines_or_equalities());
 #ifndef NDEBUG
@@ -605,7 +608,7 @@ PPL::Linear_System
   const dimension_type ncols = x.num_columns();
   // Trying to keep sortedness.
   bool still_sorted = x.is_sorted();
-  // This deque of booleans will be used to flag those rows that,
+  // This deque of Booleans will be used to flag those rows that,
   // before exiting, need to be re-checked for sortedness.
   std::deque<bool> check_for_sortedness;
   if (still_sorted)
@@ -672,7 +675,7 @@ PPL::Linear_System
   }
 
   // Trying to keep sortedness.
-  for (dimension_type i = 0; still_sorted && i < nrows-1; ++i)
+  for (dimension_type i = 0; still_sorted && i+1 < nrows; ++i)
     if (check_for_sortedness[i])
       // Have to check sortedness of `x[i]' with respect to `x[i+1]'.
       still_sorted = (compare(x[i], x[i+1]) <= 0);
@@ -703,7 +706,7 @@ PPL::Linear_System::simplify() {
       }
       ++n_lines_or_equalities;
     }
-  // Apply Gaussian's elimination to the subsystem of lines/equalities.
+  // Apply Gaussian elimination to the subsystem of lines/equalities.
   const dimension_type rank = x.gauss(n_lines_or_equalities);
   // Eliminate any redundant line/equality that has been detected.
   if (rank < n_lines_or_equalities) {
@@ -844,7 +847,7 @@ PPL::Linear_System::OK(const bool check_strong_normalized) const {
 
   // An empty system is OK,
   // unless it is an NNC system with exactly one column.
-  if (num_rows() == 0)
+  if (has_no_rows()) {
     if (is_necessarily_closed() || num_columns() != 1)
       return true;
     else {
@@ -853,6 +856,7 @@ PPL::Linear_System::OK(const bool check_strong_normalized) const {
 #endif
       return false;
     }
+  }
 
   // A non-empty system will contain constraints or generators; in
   // both cases it must have at least one column for the inhomogeneous
diff --git a/src/Linear_System.defs.hh b/src/Linear_System.defs.hh
index ebc440b..4f8694c 100644
--- a/src/Linear_System.defs.hh
+++ b/src/Linear_System.defs.hh
@@ -1,11 +1,11 @@
 /* Linear_System class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,8 +25,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "Linear_System.types.hh"
 #include "Row.types.hh"
-#include "Saturation_Row.types.hh"
-#include "Saturation_Matrix.types.hh"
+#include "Bit_Row.types.hh"
+#include "Bit_Matrix.types.hh"
 #include "Matrix.defs.hh"
 #include "Topology.hh"
 #include "Linear_Row.defs.hh"
@@ -49,7 +49,7 @@ site: http://www.cs.unipr.it/ppl/ . */
    - a Boolean flag that, when <CODE>true</CODE>, ensures that the
      non-pending prefix of the sequence of rows is sorted.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 class Parma_Polyhedra_Library::Linear_System : public Matrix {
 public:
@@ -84,7 +84,7 @@ public:
     copies pending rows as pending from the one that transforms
     pending rows into non-pending ones.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   struct With_Pending {
   };
 
@@ -290,16 +290,16 @@ public:
   */
   void sort_pending_and_remove_duplicates();
 
-  class With_Saturation_Matrix_iterator;
+  class With_Bit_Matrix_iterator;
 
   /*! \brief
     Sorts the system, removing duplicates, keeping the saturation
     matrix consistent.
 
     \param sat
-    Saturation matrix with rows corresponding to the rows of \p *this.
+    Bit matrix with rows corresponding to the rows of \p *this.
   */
-  void sort_and_remove_with_sat(Saturation_Matrix& sat);
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
 
   //! Minimizes the subsystem of equations contained in \p *this.
   /*!
@@ -328,7 +328,7 @@ public:
   void back_substitute(dimension_type n_lines_or_equalities);
 
   /*! \brief
-    Applies Gaussian's elimination and back-substitution so as to
+    Applies Gaussian elimination and back-substitution so as to
     simplify the linear system.
   */
   void simplify();
@@ -342,15 +342,15 @@ public:
   //! Clears the system deallocating all its rows.
   void clear();
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
-    if successful, <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
 
     Reads into a Linear_System object the information produced by the
-    output of <CODE>ascii_dump()</CODE>.  The specialized methods
+    output of ascii_dump(std::ostream&) const.  The specialized methods
     provided by Constraint_System and Generator_System take care of
     properly reading the contents of the system.
   */
@@ -400,7 +400,7 @@ namespace std {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::Linear_System */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void swap(Parma_Polyhedra_Library::Linear_System& x,
 	  Parma_Polyhedra_Library::Linear_System& y);
 
@@ -411,31 +411,30 @@ namespace Parma_Polyhedra_Library {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
 /*! \relates Linear_System */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 bool operator==(const Linear_System& x, const Linear_System& y);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
 /*! \relates Linear_System */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 bool operator!=(const Linear_System& x, const Linear_System& y);
 
 } // namespace Parma_Polyhedra_Library
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An iterator keeping a Linear_System consistent with a Saturation_Matrix.
+//! An iterator keeping a Linear_System consistent with a Bit_Matrix.
 /*! \ingroup PPL_CXX_interface
   An iterator on the vector of Row objects encoded in a Linear_System
   extended to maintain a corresponding iterator on a vector of
-  Saturation_Row objects.  Access to values is always done on the Row
-  objects, but iterator
-  movements and swaps are done on both components.
+  Bit_Row objects.  Access to values is always done on the Row
+  objects, but iterator movements and swaps are done on both components.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator {
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator {
 public:
   typedef std::vector<Row>::iterator Iter1;
-  typedef std::vector<Saturation_Row>::iterator Iter2;
+  typedef std::vector<Bit_Row>::iterator Iter2;
 
 private:
   Iter1 i1;
@@ -450,51 +449,51 @@ public:
   typedef std::iterator_traits<Iter1>::reference reference;
 
   //! Constructor.
-  With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+  With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2);
 
   //! Copy-constructor.
-  With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y);
+  With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y);
 
   //! Destructor.
-  ~With_Saturation_Matrix_iterator();
+  ~With_Bit_Matrix_iterator();
 
   //! Assignment operator.
-  With_Saturation_Matrix_iterator&
-  operator=(const With_Saturation_Matrix_iterator& y);
+  With_Bit_Matrix_iterator&
+  operator=(const With_Bit_Matrix_iterator& y);
 
   //! \name Operators Implementing Iterator Movement
   //@{
-  With_Saturation_Matrix_iterator& operator++();
-  With_Saturation_Matrix_iterator operator++(int);
+  With_Bit_Matrix_iterator& operator++();
+  With_Bit_Matrix_iterator operator++(int);
 
-  With_Saturation_Matrix_iterator& operator--();
-  With_Saturation_Matrix_iterator operator--(int);
+  With_Bit_Matrix_iterator& operator--();
+  With_Bit_Matrix_iterator operator--(int);
 
-  With_Saturation_Matrix_iterator& operator+=(difference_type d);
-  With_Saturation_Matrix_iterator operator+(difference_type d) const;
+  With_Bit_Matrix_iterator& operator+=(difference_type d);
+  With_Bit_Matrix_iterator operator+(difference_type d) const;
 
-  With_Saturation_Matrix_iterator& operator-=(difference_type d);
-  With_Saturation_Matrix_iterator operator-(difference_type d) const;
+  With_Bit_Matrix_iterator& operator-=(difference_type d);
+  With_Bit_Matrix_iterator operator-(difference_type d) const;
   //@}
 
   //! Distance operator.
-  difference_type operator-(const With_Saturation_Matrix_iterator& y) const;
+  difference_type operator-(const With_Bit_Matrix_iterator& y) const;
 
   //! \name Comparisons between Iterators
   //@{
-  bool operator==(const With_Saturation_Matrix_iterator& y) const;
-  bool operator!=(const With_Saturation_Matrix_iterator& y) const;
-  bool operator<(const With_Saturation_Matrix_iterator& y) const;
+  bool operator==(const With_Bit_Matrix_iterator& y) const;
+  bool operator!=(const With_Bit_Matrix_iterator& y) const;
+  bool operator<(const With_Bit_Matrix_iterator& y) const;
   //@}
 
-  //! Dereferencing operator.
+  //! Dereference operator.
   reference operator*() const;
 
   //! Access-through operator.
   pointer operator->() const;
 
-  //! Swaps the pointed Row objects while keeping Saturation_Matrix consistent.
-  void iter_swap(const With_Saturation_Matrix_iterator& y) const;
+  //! Swaps the pointed Row objects while keeping Bit_Matrix consistent.
+  void iter_swap(const With_Bit_Matrix_iterator& y) const;
 
 };
 
@@ -502,13 +501,13 @@ namespace std {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void
 iter_swap(Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator x,
+	  ::Linear_System::With_Bit_Matrix_iterator x,
 	  Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator y);
+	  ::Linear_System::With_Bit_Matrix_iterator y);
 
 } // namespace std
 
diff --git a/src/Linear_System.inlines.hh b/src/Linear_System.inlines.hh
index 99e8a98..34bd265 100644
--- a/src/Linear_System.inlines.hh
+++ b/src/Linear_System.inlines.hh
@@ -1,11 +1,11 @@
 /* Linear_System class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,7 +23,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Linear_System_inlines_hh
 #define PPL_Linear_System_inlines_hh 1
 
-#include "Saturation_Row.defs.hh"
+#include "Bit_Row.defs.hh"
 
 namespace Parma_Polyhedra_Library {
 
@@ -158,14 +158,14 @@ Linear_System::resize_no_copy(const dimension_type new_n_rows,
 inline void
 Linear_System::set_necessarily_closed() {
   row_topology = NECESSARILY_CLOSED;
-  if (num_rows() > 0)
+  if (!has_no_rows())
     set_rows_topology();
 }
 
 inline void
 Linear_System::set_not_necessarily_closed() {
   row_topology = NOT_NECESSARILY_CLOSED;
-  if (num_rows() > 0)
+  if (!has_no_rows())
     set_rows_topology();
 }
 
@@ -250,125 +250,125 @@ swap(Parma_Polyhedra_Library::Linear_System& x,
 namespace Parma_Polyhedra_Library {
 
 inline
-Linear_System::With_Saturation_Matrix_iterator::
-With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2)
+Linear_System::With_Bit_Matrix_iterator::
+With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2)
   : i1(iter1), i2(iter2) {
 }
 
 inline
-Linear_System::With_Saturation_Matrix_iterator::
-With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y)
+Linear_System::With_Bit_Matrix_iterator::
+With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y)
   : i1(y.i1), i2(y.i2) {
 }
 
 inline
-Linear_System::With_Saturation_Matrix_iterator::
-~With_Saturation_Matrix_iterator() {
+Linear_System::With_Bit_Matrix_iterator::
+~With_Bit_Matrix_iterator() {
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::
-operator=(const With_Saturation_Matrix_iterator& y) {
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::
+operator=(const With_Bit_Matrix_iterator& y) {
   i1 = y.i1;
   i2 = y.i2;
   return *this;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator++() {
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator++() {
   ++i1;
   ++i2;
   return *this;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::operator++(int) {
-  With_Saturation_Matrix_iterator tmp = *this;
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::operator++(int) {
+  With_Bit_Matrix_iterator tmp = *this;
   operator++();
   return tmp;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator--() {
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator--() {
   --i1;
   --i2;
   return *this;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::operator--(int) {
-  With_Saturation_Matrix_iterator tmp = *this;
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::operator--(int) {
+  With_Bit_Matrix_iterator tmp = *this;
   operator--();
   return tmp;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator+=(difference_type d) {
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator+=(difference_type d) {
   i1 += d;
   i2 += d;
   return *this;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::
 operator+(difference_type d) const {
-  With_Saturation_Matrix_iterator tmp = *this;
+  With_Bit_Matrix_iterator tmp = *this;
   tmp += d;
   return tmp;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator-=(difference_type d) {
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator-=(difference_type d) {
   i1 -= d;
   i2 -= d;
   return *this;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::
 operator-(difference_type d) const {
-  With_Saturation_Matrix_iterator tmp = *this;
+  With_Bit_Matrix_iterator tmp = *this;
   tmp -= d;
   return tmp;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator::difference_type
-Linear_System::With_Saturation_Matrix_iterator::
-operator-(const With_Saturation_Matrix_iterator& y) const {
+inline Linear_System::With_Bit_Matrix_iterator::difference_type
+Linear_System::With_Bit_Matrix_iterator::
+operator-(const With_Bit_Matrix_iterator& y) const {
   return i1 - y.i1;
 }
 
 inline bool
-Linear_System::With_Saturation_Matrix_iterator::
-operator==(const With_Saturation_Matrix_iterator& y) const {
+Linear_System::With_Bit_Matrix_iterator::
+operator==(const With_Bit_Matrix_iterator& y) const {
   return i1 == y.i1;
 }
 
 inline bool
-Linear_System::With_Saturation_Matrix_iterator::
-operator!=(const With_Saturation_Matrix_iterator& y) const {
+Linear_System::With_Bit_Matrix_iterator::
+operator!=(const With_Bit_Matrix_iterator& y) const {
   return i1 != y.i1;
 }
 
 inline bool
-Linear_System::With_Saturation_Matrix_iterator::
-operator<(const With_Saturation_Matrix_iterator& y) const {
+Linear_System::With_Bit_Matrix_iterator::
+operator<(const With_Bit_Matrix_iterator& y) const {
   return i1 < y.i1;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator::reference
-Linear_System::With_Saturation_Matrix_iterator::operator*() const {
+inline Linear_System::With_Bit_Matrix_iterator::reference
+Linear_System::With_Bit_Matrix_iterator::operator*() const {
   return *i1;
 }
 
-inline Linear_System::With_Saturation_Matrix_iterator::pointer
-Linear_System::With_Saturation_Matrix_iterator::operator->() const {
+inline Linear_System::With_Bit_Matrix_iterator::pointer
+Linear_System::With_Bit_Matrix_iterator::operator->() const {
   return &*i1;
 }
 
 inline void
-Linear_System::With_Saturation_Matrix_iterator::
-iter_swap(const With_Saturation_Matrix_iterator& y) const {
+Linear_System::With_Bit_Matrix_iterator::
+iter_swap(const With_Bit_Matrix_iterator& y) const {
   std::iter_swap(i1, y.i1);
   std::iter_swap(i2, y.i2);
 }
@@ -378,13 +378,13 @@ iter_swap(const With_Saturation_Matrix_iterator& y) const {
 namespace std {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 inline void
 iter_swap(Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator x,
+	  ::Linear_System::With_Bit_Matrix_iterator x,
 	  Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator y) {
+	  ::Linear_System::With_Bit_Matrix_iterator y) {
   x.iter_swap(y);
 }
 
diff --git a/src/Linear_System.types.hh b/src/Linear_System.types.hh
index 52a2c13..dfc3aef 100644
--- a/src/Linear_System.types.hh
+++ b/src/Linear_System.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/MIP_Problem.cc b/src/MIP_Problem.cc
new file mode 100644
index 0000000..a21c5ac
--- /dev/null
+++ b/src/MIP_Problem.cc
@@ -0,0 +1,2122 @@
+/* MIP_Problem class implementation: non-inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "MIP_Problem.defs.hh"
+#include "globals.defs.hh"
+#include "Row.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <stdexcept>
+#include <deque>
+#include <algorithm>
+#include <cmath>
+
+#ifndef PPL_NOISY_SIMPLEX
+#define PPL_NOISY_SIMPLEX 0
+#endif
+
+#ifndef PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT
+#define PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT 1
+#endif
+
+#ifndef PPL_SIMPLEX_USE_MIP_HEURISTIC
+#define PPL_SIMPLEX_USE_MIP_HEURISTIC 1
+#endif
+
+#ifdef PPL_NOISY_SIMPLEX
+#include <iostream>
+#endif
+
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_NOISY_SIMPLEX
+namespace {
+
+unsigned long num_iterations = 0;
+
+} // namespace
+#endif // PPL_NOISY_SIMPLEX
+
+PPL::MIP_Problem::MIP_Problem(const dimension_type dim)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0, Row::Flags()),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    initialized(false),
+    input_cs(),
+    first_pending_constraint(0),
+    input_obj_function(),
+    opt_mode(MAXIMIZATION),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::MIP_Problem(dim, cs, obj, "
+			    "mode):\n"
+			    "dim exceeds the maximum allowed "
+			    "space dimension.");
+  assert(OK());
+}
+
+PPL::MIP_Problem::MIP_Problem(const dimension_type dim,
+			      const Constraint_System& cs,
+			      const Linear_Expression& obj,
+			      const Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0, Row::Flags()),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    initialized(false),
+    input_cs(),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::MIP_Problem(dim, cs, obj, "
+			    "mode):\n"
+			    "dim exceeds the maximum allowed"
+			    "space dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, cs, obj,"
+      << " mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds dim == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraint system.
+  if (cs.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, cs, obj, mode):\n"
+      << "cs.space_dimension == " << cs.space_dimension() << " exceeds dim == "
+      << dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  if (cs.has_strict_inequalities())
+    throw std::invalid_argument("PPL::MIP_Problem::"
+				"MIP_Problem(d, cs, obj, m):\n"
+				"cs contains strict inequalities.");
+  // Actually copy the constraints.
+  input_cs.insert(input_cs.end(), cs.begin(), cs.end());
+  assert(OK());
+}
+
+void
+PPL::MIP_Problem::add_constraint(const Constraint& c) {
+  if (space_dimension() < c.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::add_constraint(c):\n"
+      << "c.space_dimension() == "<< c.space_dimension() << " exceeds "
+      "this->space_dimension == " << space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  if (c.is_strict_inequality())
+    throw std::invalid_argument("PPL::MIP_Problem::add_constraint(c):\n"
+				"c is a strict inequality.");
+  input_cs.push_back(c);
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  assert(OK());
+}
+
+void
+PPL::MIP_Problem::add_constraints(const Constraint_System& cs) {
+  if (space_dimension() < cs.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::add_constraints(cs):\n"
+      << "cs.space_dimension() == " << cs.space_dimension()
+      << " exceeds this->space_dimension() == " << this->space_dimension()
+      << ".";
+    throw std::invalid_argument(s.str());
+  }
+  if (cs.has_strict_inequalities())
+    throw std::invalid_argument("PPL::MIP_Problem::add_constraints(cs):\n"
+				"cs contains strict inequalities.");
+  input_cs.insert(input_cs.end(), cs.begin(), cs.end());
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  assert(OK());
+}
+
+void
+PPL::MIP_Problem::set_objective_function(const Linear_Expression& obj) {
+  if (space_dimension() < obj.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::set_objective_function(obj):\n"
+      << "obj.space_dimension() == " << obj.space_dimension()
+      << " exceeds this->space_dimension == " << space_dimension()
+      << ".";
+    throw std::invalid_argument(s.str());
+  }
+  input_obj_function = obj;
+  if (status == UNBOUNDED || status == OPTIMIZED)
+    status = SATISFIABLE;
+  assert(OK());
+}
+
+const PPL::Generator&
+PPL::MIP_Problem::feasible_point() const {
+  if (is_satisfiable())
+    return last_generator;
+  else
+    throw std::domain_error("PPL::MIP_Problem::feasible_point():\n"
+			    "*this is not satisfiable.");
+}
+
+const PPL::Generator&
+PPL::MIP_Problem::optimizing_point() const {
+  if (solve() == OPTIMIZED_MIP_PROBLEM)
+    return last_generator;
+  else
+    throw std::domain_error("PPL::MIP_Problem::optimizing_point():\n"
+ 			    "*this doesn't have an optimizing point.");
+}
+
+bool
+PPL::MIP_Problem::is_satisfiable() const {
+  // Check `status' to filter out trivial cases.
+  switch (status) {
+  case UNSATISFIABLE:
+    assert(OK());
+    return false;
+  case SATISFIABLE:
+    // Intentionally fall through
+  case UNBOUNDED:
+    // Intentionally fall through.
+  case OPTIMIZED:
+    assert(OK());
+    return true;
+  case PARTIALLY_SATISFIABLE:
+    { // LP case.
+      if (i_variables.empty())
+	return is_lp_satisfiable();
+      // MIP Case.
+      const Variables_Set this_variables_set = integer_space_dimensions();
+      MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+      Generator p = point();
+      // This disable the Variable integrality check in OK() until we will
+      // find a feasible point.
+      x.i_variables.clear();
+      x.is_lp_satisfiable();
+         if (is_mip_satisfiable(x, p, this_variables_set)) {
+	x.last_generator = p;
+	x.status = SATISFIABLE;
+	// Restore i_variables;
+    	x.i_variables = this_variables_set;
+	return true;
+	 }
+      else {
+	x.status = UNSATISFIABLE;
+	// Restore i_variables;
+    	x.i_variables = this_variables_set;
+	return false;
+      }
+    }
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL internal error");
+}
+
+PPL::MIP_Problem_Status
+PPL::MIP_Problem::solve() const{
+  switch (status) {
+  case UNSATISFIABLE:
+    assert(OK());
+    return UNFEASIBLE_MIP_PROBLEM;
+  case UNBOUNDED:
+    assert(OK());
+    return UNBOUNDED_MIP_PROBLEM;
+  case OPTIMIZED:
+    assert(OK());
+    return OPTIMIZED_MIP_PROBLEM;
+  case SATISFIABLE:
+    // Intentionally fall through
+  case PARTIALLY_SATISFIABLE:
+    {
+      MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+      if (i_variables.empty()) {
+	// LP Problem case.
+	if (is_lp_satisfiable()) {
+	  x.second_phase();
+	  if (x.status == UNBOUNDED)
+	    return UNBOUNDED_MIP_PROBLEM;
+	  else {
+	    assert(x.status == OPTIMIZED);
+	    return OPTIMIZED_MIP_PROBLEM;
+	  }
+	}
+	return UNFEASIBLE_MIP_PROBLEM;
+      }
+      // MIP Problem case.
+      // This disable the Variable integrality check in OK() until we will find
+      // an optimizing point.
+      const Variables_Set this_variables_set = integer_space_dimensions();
+      x.i_variables.clear();
+      if (x.is_lp_satisfiable())
+	x.second_phase();
+      else {
+	x.status = UNSATISFIABLE;
+	// Restore i_variables;
+	x.i_variables = this_variables_set;
+	return UNFEASIBLE_MIP_PROBLEM;
+      }
+      DIRTY_TEMP0(mpq_class, incumbent_solution);
+      Generator g = point();
+      bool have_incumbent_solution = false;
+
+      MIP_Problem mip_copy(*this);
+      // Treat this MIP_Problem as an LP one: we have to deal with
+      // the relaxation in solve_mip().
+      mip_copy.i_variables.clear();
+      MIP_Problem_Status mip_status = solve_mip(have_incumbent_solution,
+						incumbent_solution, g,
+						mip_copy,
+						this_variables_set);
+      // Restore i_variables;
+      x.i_variables = this_variables_set;
+      switch (mip_status) {
+      case UNFEASIBLE_MIP_PROBLEM:
+	x.status = UNSATISFIABLE;
+	break;
+      case UNBOUNDED_MIP_PROBLEM:
+	x.status = UNBOUNDED;
+	// A feasible point has been set in `solve_mip()', so that
+	// a call to `feasible_point' will be successful.
+	x.last_generator = g;
+	break;
+      case OPTIMIZED_MIP_PROBLEM:
+	x.status = OPTIMIZED;
+	// Set the internal generator.
+	x.last_generator = g;
+	break;
+      }
+      assert(OK());
+      return mip_status;
+    }
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL internal error");
+}
+
+void
+PPL::MIP_Problem::add_space_dimensions_and_embed(const dimension_type m) {
+  // The space dimension of the resulting MIP problem should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw std::length_error("PPL::MIP_Problem::"
+			    "add_space_dimensions_and_embed(m):\n"
+			    "adding m new space dimensions exceeds "
+			    "the maximum allowed space dimension.");
+  external_space_dim += m;
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  assert(OK());
+}
+
+void
+PPL::MIP_Problem
+::add_to_integer_space_dimensions(const Variables_Set& i_vars) {
+  if (i_vars.space_dimension() > external_space_dim)
+    throw std::invalid_argument("PPL::MIP_Problem::"
+				"add_to_integer_space_dimension(i_vars):\n"
+				"*this and i_vars are dimension"
+				"incompatible.");
+  const dimension_type original_size = i_variables.size();
+  i_variables.insert(i_vars.begin(), i_vars.end());
+  // If a new integral variable was inserted, set the internal status to
+  // PARTIALLY_SATISFIABLE.
+  if (i_variables.size() != original_size && status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+}
+
+bool
+PPL::MIP_Problem::is_in_base(const dimension_type var_index,
+			     dimension_type& row_index) const {
+  for (row_index = base.size(); row_index-- > 0; )
+    if (base[row_index] == var_index)
+      return true;
+  return false;
+}
+
+void
+PPL::MIP_Problem::merge_split_variables(dimension_type var_index,
+					std::vector<dimension_type>&
+					unfeasible_tableau_rows) {
+  const dimension_type tableau_nrows = tableau.num_rows();
+  const dimension_type column = mapping[var_index].second;
+
+  for (dimension_type i = 0; i < tableau_nrows; ++i) {
+    // In the following case the negative side of the split variable is
+    // in base: this means that the constraint will be nonfeasible.
+    if (base[i] == mapping[var_index].second) {
+      // CHECKME: I do not know if is possible that the positive and
+      // the negative part of a split variable can be together in
+      // base: it seems that this case is not possible. The algorithm
+      // requires that condition.
+#ifndef NDEBUG
+      for (dimension_type j = 0; j < tableau_nrows; ++j) {
+ 	dimension_type dummy = 0;
+	assert(!is_in_base(mapping[var_index].first, dummy));
+      }
+#endif
+      // We set base[i] to zero to keep track that that the constraint is not
+      // feasible by `last_generator'.
+      base[i] = 0;
+      unfeasible_tableau_rows.push_back(i);
+    }
+  }
+
+  const dimension_type tableau_cols = tableau.num_columns();
+  // Remove the column.
+  if (column != tableau_cols - 1) {
+    std::vector<dimension_type> cycle;
+    for (dimension_type j = tableau_cols - 1; j >= column; --j)
+      cycle.push_back(j);
+    cycle.push_back(0);
+    tableau.permute_columns(cycle);
+  }
+  tableau.remove_trailing_columns(1);
+
+  // var_index is no longer split.
+  mapping[var_index].second = 0;
+
+  // Adjust data structured, `shifting' the proper columns to the left by 1.
+  const dimension_type base_size = base.size();
+  for (dimension_type i = base_size; i-- > 0; )
+    if (base[i] > column)
+      --base[i];
+  const dimension_type mapping_size = mapping.size();
+  for (dimension_type i = mapping_size; i-- > 0; ) {
+    if (mapping[i].first > column)
+      --mapping[i].first;
+    if (mapping[i].second > column)
+      --mapping[i].second;
+  }
+}
+
+bool
+PPL::MIP_Problem::is_satisfied(const Constraint& c, const Generator& g) {
+  // Scalar_Products::sign() requires the second argument to be at least
+  // as large as the first one.
+  int sp_sign = g.space_dimension() <= c.space_dimension()
+    ? Scalar_Products::sign(g, c)
+    : Scalar_Products::sign(c, g);
+  return c.is_inequality() ? sp_sign >= 0 : sp_sign == 0;
+}
+
+bool
+PPL::MIP_Problem::is_saturated(const Constraint& c, const Generator& g) {
+  // Scalar_Products::sign() requires the second argument to be at least
+  // as large as the first one.
+  int sp_sign = g.space_dimension() <= c.space_dimension()
+    ? Scalar_Products::sign(g, c)
+    : Scalar_Products::sign(c, g);
+  return sp_sign == 0;
+}
+
+bool
+PPL::MIP_Problem::parse_constraints(dimension_type& tableau_num_rows,
+				    dimension_type& num_slack_variables,
+				    std::deque<bool>& is_tableau_constraint,
+				    std::deque<bool>& nonnegative_variable,
+				    std::vector<dimension_type>&
+				    unfeasible_tableau_rows,
+				    std::deque<bool>& satisfied_ineqs) {
+  satisfied_ineqs.clear();
+  satisfied_ineqs.insert(satisfied_ineqs.end(), input_cs.size(),
+			 false);
+
+  const dimension_type cs_num_rows = input_cs.size();
+  const dimension_type cs_space_dim = external_space_dim;
+
+  // Step 1:
+  // determine variables that are constrained to be nonnegative,
+  // detect (non-negativity or tautology) constraints that will not
+  // be part of the tableau and count the number of slack variables.
+
+  // Counters determining the dimensions of the tableau:
+  // initialized here, they will be updated while examining `cs'.
+  tableau_num_rows = cs_num_rows;
+  dimension_type tableau_num_cols = 2*cs_space_dim;
+  num_slack_variables = 0;
+
+  // On exit, `is_tableau_constraint[i]' will be true if and only if
+  // `cs[i]' is neither a tautology (e.g., 1 >= 0) nor a non-negativity
+  // constraint (e.g., X >= 0).
+  is_tableau_constraint = std::deque<bool> (cs_num_rows, true);
+
+  // On exit, `nonnegative_variable[j]' will be true if and only if
+  // Variable(j) is bound to be nonnegative in `cs'.
+  nonnegative_variable = std::deque<bool> (cs_space_dim, false);
+
+  // Check for already known information about space dimensions and
+  // store them in `nonnegative_variable'.
+  const dimension_type mapping_size = mapping.size();
+  for (dimension_type i = std::min(mapping_size, cs_space_dim+1); i-- > 1; )
+    if (mapping[i].second == 0) {
+      nonnegative_variable[i-1] = true;
+      --tableau_num_cols;
+    }
+
+  // Process each row of the `cs' matrix.
+  for (dimension_type i = cs_num_rows; i-- > first_pending_constraint; ) {
+    const Constraint& cs_i = input_cs[i];
+    bool found_a_nonzero_coeff = false;
+    bool found_many_nonzero_coeffs = false;
+    dimension_type nonzero_coeff_column_index = 0;
+    for (dimension_type sd = cs_i.space_dimension(); sd-- > 0; ) {
+      if (cs_i.coefficient(Variable(sd)) != 0) {
+	if (found_a_nonzero_coeff) {
+	  found_many_nonzero_coeffs = true;
+	  if (cs_i.is_inequality())
+	    ++num_slack_variables;
+	  break;
+	}
+	else {
+	  nonzero_coeff_column_index = sd + 1;
+	  found_a_nonzero_coeff = true;
+	}
+      }
+    }
+    // If more than one coefficient is nonzero,
+    // continue with next constraint.
+    if (found_many_nonzero_coeffs) {
+      // CHECKME: Is it true that in the first phase we can apply
+      // `is_satisfied()' with the generator `point()'?  If so, the following
+      // code works even if we do not have a feasible point.
+      // Check for satisfiability of the inequality. This can be done if we
+      // have a feasible point of *this.
+      if (cs_i.is_inequality() && is_satisfied(cs_i, last_generator))
+	satisfied_ineqs[i] = true;
+      continue;
+    }
+
+    if (!found_a_nonzero_coeff) {
+      // All coefficients are 0.
+      // The constraint is either trivially true or trivially false.
+      if (cs_i.is_inequality()) {
+	if (cs_i.inhomogeneous_term() < 0)
+	  // A constraint such as -1 >= 0 is trivially false.
+	  return false;
+      }
+      else
+	// The constraint is an equality.
+	if (cs_i.inhomogeneous_term() != 0)
+	  // A constraint such as 1 == 0 is trivially false.
+	  return false;
+      // Here the constraint is trivially true.
+      is_tableau_constraint[i] = false;
+      --tableau_num_rows;
+      continue;
+    }
+    else {
+      // Here we have only one nonzero coefficient.
+      /*
+
+      We have the following methods:
+      A) Do split the variable and do add the constraint
+         in the tableau.
+      B) Do not split the variable and do add the constraint
+         in the tableau.
+      C) Do not split the variable and do not add the constraint
+         in the tableau.
+
+      Let the constraint be (a*v + b relsym 0).
+      These are the 12 possible combinations we can have:
+                a |  b | relsym | method
+      ----------------------------------
+      1)       >0 | >0 |   >=   |   A
+      2)       >0 | >0 |   ==   |   A
+      3)       <0 | <0 |   >=   |   A
+      4)       >0 | =0 |   ==   |   B
+      5)       >0 | <0 |   ==   |   B
+      Note:    <0 | >0 |   ==   | impossible by strong normalization
+      Note:    <0 | =0 |   ==   | impossible by strong normalization
+      Note:    <0 | <0 |   ==   | impossible by strong normalization
+      6)       >0 | <0 |   >=   |   B
+      7)       >0 | =0 |   >=   |   C
+      8)       <0 | >0 |   >=   |   A
+      9)       <0 | =0 |   >=   |   A
+
+      The next lines will apply the correct method to each case.
+      */
+
+      // The variable index is not equal to the column index.
+      const dimension_type nonzero_var_index = nonzero_coeff_column_index - 1;
+
+      const int sgn_a
+	= sgn(cs_i.coefficient(Variable(nonzero_coeff_column_index-1)));
+      const int sgn_b = sgn(cs_i.inhomogeneous_term());
+      // Cases 1-3: apply method A.
+      if (sgn_a == sgn_b) {
+	if (cs_i.is_inequality())
+	  ++num_slack_variables;
+      }
+      // Cases 4-5: apply method B.
+      else if (cs_i.is_equality()) {
+	if (!nonnegative_variable[nonzero_var_index]) {
+	  nonnegative_variable[nonzero_var_index] = true;
+	  --tableau_num_cols;
+	}
+      }
+      // Case 6: apply method B.
+      else if (sgn_b < 0) {
+	if (!nonnegative_variable[nonzero_var_index]) {
+	  nonnegative_variable[nonzero_var_index] = true;
+	  --tableau_num_cols;
+	}
+	++num_slack_variables;
+      }
+      // Case 7: apply method C.
+      else if (sgn_a > 0) {
+	// This is the most important case in the incrementality solving:
+	// merge two variables.
+	if (!nonnegative_variable[nonzero_var_index]) {
+	  nonnegative_variable[nonzero_var_index] = true;
+	  --tableau_num_cols;
+	  if (nonzero_coeff_column_index < mapping_size)
+	    merge_split_variables(nonzero_coeff_column_index,
+				  unfeasible_tableau_rows);
+	  is_tableau_constraint[i] = false;
+	}
+	else
+	  is_tableau_constraint[i] = false;
+	--tableau_num_rows;
+      }
+      // Cases 8-9: apply method A.
+      else
+	++num_slack_variables;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::MIP_Problem::process_pending_constraints() {
+  const dimension_type num_original_rows = tableau.num_rows();
+  dimension_type new_rows = 0;
+  dimension_type new_slacks = 0;
+  dimension_type new_var_columns = 0;
+  std::deque<bool> is_tableau_constraint;
+  std::deque<bool> nonnegative_variable;
+  std::vector<dimension_type> unfeasible_tableau_rows;
+  std::deque<bool> satisfied_ineqs;
+  // Check the new constraints to adjust the data structures.
+  // If `false' is returned, the pending constraints are trivially
+  // unfeasible.
+  if (!parse_constraints(new_rows, new_slacks, is_tableau_constraint,
+			 nonnegative_variable, unfeasible_tableau_rows,
+			 satisfied_ineqs)) {
+    status = UNSATISFIABLE;
+    return false;
+  };
+
+  const dimension_type first_free_tableau_index = tableau.num_columns()-1;
+
+  if (external_space_dim > internal_space_dim) {
+    const dimension_type space_diff = external_space_dim - internal_space_dim;
+    for (dimension_type i = 0, j = 0; i < space_diff; ++i, ++j) {
+      // Set `mapping' properly to store that every variable is split.
+      // In the following case the value of the original variable can be
+      // negative.
+      if (!nonnegative_variable[internal_space_dim+i]) {
+	mapping.push_back(std::make_pair(first_free_tableau_index+j,
+					 first_free_tableau_index+1+j));
+	++j;
+	new_var_columns += 2;
+      }
+      // The variable is nonnegative.
+      else {
+	mapping.push_back(std::make_pair(first_free_tableau_index+j, 0));
+	++new_var_columns;
+      }
+    }
+  }
+
+  // Resize the tableau and adding the necessary columns for artificial and
+  // slack variables.
+  dimension_type num_satisfied_ineqs = std::count(satisfied_ineqs.begin(),
+						  satisfied_ineqs.end(),
+						  true);
+  const dimension_type unfeasible_tableau_rows_size
+    = unfeasible_tableau_rows.size();
+  const dimension_type artificial_cols
+    = new_rows + unfeasible_tableau_rows_size - num_satisfied_ineqs;
+  const dimension_type new_total_columns
+    = new_var_columns + new_slacks + artificial_cols;
+  if (new_rows > 0)
+    tableau.add_zero_rows(new_rows, Row::Flags());
+  if (new_total_columns > 0)
+    tableau.add_zero_columns(new_total_columns);
+  dimension_type tableau_num_rows = tableau.num_rows();
+
+  // The following vector will be useful know if a constraint is feasible
+  // and does not require an additional artificial variable.
+  std::deque<bool> worked_out_row (tableau_num_rows, false);
+  dimension_type tableau_num_columns = tableau.num_columns();
+
+  // Sync the `base' vector size to the new tableau: fill with zeros to encode
+  // that these rows are not OK and must be adjusted.
+  base.insert(base.end(), new_rows, 0);
+  const dimension_type base_size = base.size();
+
+  // These indexes will be used to insert slack and artificial variables.
+  dimension_type slack_index = tableau_num_columns - artificial_cols - 1;
+  dimension_type artificial_index = slack_index;
+
+  // The first column index of the tableau that contains an
+  // artificial variable. Encode with 0 the fact the there are not
+  // artificial variables.
+  const dimension_type begin_artificials = artificial_cols > 0
+    ? artificial_index : 0;
+
+  // Proceed with the insertion of the constraints.
+  for (dimension_type k = tableau_num_rows, i = input_cs.size();
+       i-- > first_pending_constraint;  )
+    if (is_tableau_constraint[i]) {
+      // Copy the original constraint in the tableau.
+      Row& tableau_k = tableau[--k];
+      const Constraint& cs_i = input_cs[i];
+      for (dimension_type sd = cs_i.space_dimension(); sd-- > 0; ) {
+	tableau_k[mapping[sd+1].first] = cs_i.coefficient(Variable(sd));
+	// Split if needed.
+	if (mapping[sd+1].second != 0)
+	  neg_assign(tableau_k[mapping[sd+1].second],
+		     tableau_k[mapping[sd+1].first]);
+      }
+      tableau_k[mapping[0].first] = cs_i.inhomogeneous_term();
+      // Split if needed.
+      if (mapping[0].second != 0)
+	tableau_k[mapping[0].second] = -cs_i.inhomogeneous_term();
+
+      // Add the slack variable, if needed.
+      if (cs_i.is_inequality()) {
+	tableau_k[--slack_index] = -1;
+	// If the constraint is already satisfied, we will not use artificial
+	// variables to compute a feasible base: this to speed up
+	// the algorithm.
+	  if (satisfied_ineqs[i]) {
+	    base[k] = slack_index;
+	    worked_out_row[k] = true;
+	  }
+      }
+      for (dimension_type j = base_size; j-- > 0; )
+	if (k != j && tableau_k[base[j]] != 0 && base[j] != 0)
+	  linear_combine(tableau_k, tableau[j], base[j]);
+    }
+
+  // We negate the row if tableau[i][0] <= 0 to get the inhomogeneous term > 0.
+  // This simplifies the insertion of the artificial variables: the value of
+  // each artificial variable will be 1.
+  for (dimension_type i = tableau_num_rows; i-- > 0 ; ) {
+    Row& tableau_i = tableau[i];
+    if (tableau_i[0] > 0)
+      for (dimension_type j = tableau_num_columns; j-- > 0; )
+	neg_assign(tableau_i[j]);
+  }
+
+  // Set the working cost function with the right size.
+  working_cost = Row(tableau_num_columns, Row::Flags());
+
+  // Insert artificial variables for the nonfeasible constraints.
+  for (dimension_type i = 0; i < unfeasible_tableau_rows_size; ++i) {
+    tableau[unfeasible_tableau_rows[i]][artificial_index] = 1;
+    working_cost[artificial_index] = -1;
+    base[unfeasible_tableau_rows[i]] = artificial_index;
+    ++artificial_index;
+  }
+
+  // Modify the tableau and the new cost function by adding
+  // the artificial variables (which enter the base). Note that if an
+  // inequality was satisfied by `last_generator', this will be not processed.
+  // This information in encoded in `worked_out_row'.
+  // As for the cost function, all the artificial variables should have
+  // coefficient -1.
+  for (dimension_type i = num_original_rows; i < tableau_num_rows; ++i) {
+    if (worked_out_row[i])
+      continue;
+    tableau[i][artificial_index] = 1;
+    working_cost[artificial_index] = -1;
+    base[i] = artificial_index;
+    ++artificial_index;
+  }
+  // The last column index of the tableau containing an artificial variable.
+  const dimension_type end_artificials = artificial_index - 1;
+
+  // Set the extra-coefficient of the cost functions to record its sign.
+  // This is done to keep track of the possible sign's inversion.
+  const dimension_type last_obj_index = working_cost.size() - 1;
+  working_cost[last_obj_index] = 1;
+
+  // Express the problem in terms of the variables in base.
+  for (dimension_type i = tableau_num_rows; i-- > 0; )
+    if (working_cost[base[i]] != 0)
+      linear_combine(working_cost, tableau[i], base[i]);
+
+  // Deal with zero dimensional problems.
+  if (space_dimension() == 0) {
+    status = OPTIMIZED;
+    last_generator = point();
+    return true;
+  }
+  // Deal with trivial cases.
+  // If there is no constraint in the tableau, then the feasible region
+  // is only delimited by non-negativity constraints. Therefore,
+  // the problem is unbounded as soon as the cost function has
+  // a variable with a positive coefficient.
+ if (tableau_num_rows == 0) {
+    const dimension_type input_obj_function_size
+      = input_obj_function.space_dimension();
+    for (dimension_type i = input_obj_function_size; i-- > 0; )
+      // If a the value of a variable in the objective function is
+      // different from zero, the final status is unbounded.
+      // In the first part the variable is constrained to be greater or equal
+      // than zero.
+      if ((((input_obj_function.coefficient(Variable(i)) > 0
+	     && opt_mode == MAXIMIZATION)
+	    || (input_obj_function.coefficient(Variable(i)) < 0
+		&& opt_mode == MINIMIZATION)) && mapping[i].second == 0)
+	  // In the following case the variable is unconstrained.
+	  || (input_obj_function.coefficient(Variable(i)) != 0
+	      && mapping[i].second != 0)) {
+	// Ensure the right space dimension is obtained.
+	last_generator = point(0 * Variable(space_dimension()-1));
+	status = UNBOUNDED;
+	return true;
+      }
+
+    // The problem is neither trivially unfeasible nor trivially unbounded.
+    // The tableau was successful computed and the caller has to figure
+    // out which case applies.
+    status = OPTIMIZED;
+    // Ensure the right space dimension is obtained.
+    last_generator = point(0*Variable(space_dimension()-1));
+    assert(OK());
+    return true;
+  }
+
+  // Now we are ready to solve the first phase.
+  bool first_phase_succesful = compute_simplex();
+
+#if PPL_NOISY_SIMPLEX
+  std::cout << "MIP_Problem::solve: 1st phase ended at iteration "
+ 	    << num_iterations << "." << std::endl;
+#endif
+
+  if (!first_phase_succesful || working_cost[0] != 0) {
+    // The feasible region is empty.
+    status = UNSATISFIABLE;
+    return false;
+  }
+
+  // Prepare *this for a possible second phase.
+  if (begin_artificials != 0)
+    erase_artificials(begin_artificials, end_artificials);
+  compute_generator();
+  status = SATISFIABLE;
+  assert(OK());
+  return true;
+}
+#if PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT
+
+// This is the only place in the library where we use doubles for
+// internal purposes.  However, we may have PPL_SUPPORTED_DOUBLE
+// defined to 0 if we were unable to detect the binary format
+// used by doubles.
+#if PPL_SUPPORTED_DOUBLE
+#define STEEPEST_EDGE_FP_TYPE double
+#define STEEPEST_EDGE_SQRT sqrt
+#define STEEPEST_EDGE_FABS fabs
+#else
+#define STEEPEST_EDGE_FP_TYPE float
+#define STEEPEST_EDGE_SQRT sqrtf
+#define STEEPEST_EDGE_FABS fabsf
+#endif
+
+PPL::dimension_type
+PPL::MIP_Problem::steepest_edge_entering_index() const {
+  DIRTY_TEMP0(mpq_class, real_coeff);
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  assert(tableau_num_rows == base.size());
+  STEEPEST_EDGE_FP_TYPE challenger_num = 0.0;
+  STEEPEST_EDGE_FP_TYPE challenger_den = 0.0;
+  STEEPEST_EDGE_FP_TYPE current_value = 0.0;
+  dimension_type entering_index = 0;
+  const int cost_sign = sgn(working_cost[working_cost.size() - 1]);
+  for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
+    const Coefficient& cost_j = working_cost[j];
+    if (sgn(cost_j) == cost_sign) {
+      // We cannot compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      assign_r(challenger_num, cost_j, ROUND_IGNORE);
+      challenger_num = STEEPEST_EDGE_FABS(challenger_num);
+      // Due to our integer implementation, the `1' term in the denominator
+      // of the original formula has to be replaced by `squared_lcm_basis'.
+      challenger_den = 1.0;
+      for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+	const Row& tableau_i = tableau[i];
+	const Coefficient& tableau_ij = tableau_i[j];
+	if (tableau_ij != 0) {
+	  assert(tableau_i[base[i]] != 0);
+	  assign_r(real_coeff.get_num(), tableau_ij, ROUND_NOT_NEEDED);
+	  assign_r(real_coeff.get_den(), tableau_i[base[i]], ROUND_NOT_NEEDED);
+	  real_coeff.canonicalize();
+	  STEEPEST_EDGE_FP_TYPE float_tableau_value;
+	  assign_r(float_tableau_value, real_coeff, ROUND_IGNORE);
+	  challenger_den += float_tableau_value * float_tableau_value;
+	}
+      }
+      STEEPEST_EDGE_FP_TYPE challenger_value
+        = challenger_num / STEEPEST_EDGE_SQRT(challenger_den);
+      // Initialize `current_value' during the first iteration.
+      // Otherwise update if the challenger wins.
+      if (entering_index == 0 || challenger_value > current_value) {
+	current_value = challenger_value;
+	entering_index = j;
+      }
+    }
+  }
+  return entering_index;
+}
+
+#undef STEEPEST_EDGE_FP_TYPE
+#undef STEEPEST_EDGE_SQRT
+#undef STEEPEST_EDGE_FABS
+
+#else
+PPL::dimension_type
+PPL::MIP_Problem::steepest_edge_entering_index() const {
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  assert(tableau_num_rows == base.size());
+  // The square of the lcm of all the coefficients of variables in base.
+  TEMP_INTEGER(squared_lcm_basis);
+  // The normalization factor for each coefficient in the tableau.
+  std::vector<Coefficient> norm_factor(tableau_num_rows);
+  {
+    // Compute the lcm of all the coefficients of variables in base.
+    TEMP_INTEGER(lcm_basis);
+    lcm_basis = 1;
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      lcm_assign(lcm_basis, lcm_basis, tableau[i][base[i]]);
+    // Compute normalization factors.
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      exact_div_assign(norm_factor[i], lcm_basis, tableau[i][base[i]]);
+    // Compute the square of `lcm_basis', exploiting the fact that
+    // `lcm_basis' will no longer be needed.
+    lcm_basis *= lcm_basis;
+    std::swap(squared_lcm_basis, lcm_basis);
+  }
+
+  // Defined here to avoid repeated (de-)allocations.
+  TEMP_INTEGER(challenger_num);
+  TEMP_INTEGER(scalar_value);
+  TEMP_INTEGER(challenger_den);
+  TEMP_INTEGER(challenger_value);
+  TEMP_INTEGER(current_value);
+
+  TEMP_INTEGER(current_num);
+  TEMP_INTEGER(current_den);
+  dimension_type entering_index = 0;
+  const int cost_sign = sgn(working_cost[working_cost.size() - 1]);
+  for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
+    const Coefficient& cost_j = working_cost[j];
+    if (sgn(cost_j) == cost_sign) {
+      // We cannot compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      challenger_num = cost_j * cost_j;
+      // Due to our integer implementation, the `1' term in the denominator
+      // of the original formula has to be replaced by `squared_lcm_basis'.
+      challenger_den = squared_lcm_basis;
+      for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+	const Coefficient& tableau_ij = tableau[i][j];
+	// FIXME: the test seems to speed up the GMP computation.
+	if (tableau_ij != 0) {
+	  scalar_value = tableau_ij * norm_factor[i];
+	  add_mul_assign(challenger_den, scalar_value, scalar_value);
+	}
+      }
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+	std::swap(current_num, challenger_num);
+	std::swap(current_den, challenger_den);
+	entering_index = j;
+ 	continue;
+      }
+      challenger_value = challenger_num * current_den;
+      current_value = current_num * challenger_den;
+      // Update the values, if the challenger wins.
+      if (challenger_value > current_value) {
+	std::swap(current_num, challenger_num);
+	std::swap(current_den, challenger_den);
+	entering_index = j;
+      }
+    }
+  }
+  return entering_index;
+}
+#endif // PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT
+
+// See page 47 of [PapadimitriouS98].
+PPL::dimension_type
+PPL::MIP_Problem::textbook_entering_index() const {
+  // The variable entering the base is the first one whose coefficient
+  // in the cost function has the same sign the cost function itself.
+  // If no such variable exists, then we met the optimality condition
+  // (and return 0 to the caller).
+
+  // Get the "sign" of the cost function.
+  const dimension_type cost_sign_index = working_cost.size() - 1;
+  const int cost_sign = sgn(working_cost[cost_sign_index]);
+  assert(cost_sign != 0);
+  for (dimension_type i = 1; i < cost_sign_index; ++i)
+    if (sgn(working_cost[i]) == cost_sign)
+      return i;
+  // No variable has to enter the base:
+  // the cost function was optimized.
+  return 0;
+}
+
+void
+PPL::MIP_Problem::linear_combine(Row& x,
+				 const Row& y,
+				 const dimension_type k) {
+  assert(x.size() == y.size());
+  assert(y[k] != 0 && x[k] != 0);
+  // Let g be the GCD between `x[k]' and `y[k]'.
+  // For each i the following computes
+  //   x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+  TEMP_INTEGER(normalized_x_k);
+  TEMP_INTEGER(normalized_y_k);
+  normalize2(x[k], y[k], normalized_x_k, normalized_y_k);
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (i != k) {
+      Coefficient& x_i = x[i];
+      x_i *= normalized_y_k;
+#if 1
+      // FIXME: the test seems to speed up the GMP computation.
+      const Coefficient& y_i = y[i];
+      if (y_i != 0)
+	sub_mul_assign(x_i, y_i, normalized_x_k);
+#else
+      sub_mul_assign(x_i, y[i], normalized_x_k);
+#endif // 1
+    }
+  x[k] = 0;
+  x.normalize();
+}
+
+// See pages 42-43 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::pivot(const dimension_type entering_var_index,
+			const dimension_type exiting_base_index) {
+  const Row& tableau_out = tableau[exiting_base_index];
+  // Linearly combine the constraints.
+  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+    Row& tableau_i = tableau[i];
+    if (i != exiting_base_index && tableau_i[entering_var_index] != 0)
+      linear_combine(tableau_i, tableau_out, entering_var_index);
+  }
+  // Linearly combine the cost function.
+  if (working_cost[entering_var_index] != 0)
+    linear_combine(working_cost, tableau_out, entering_var_index);
+  // Adjust the base.
+  base[exiting_base_index] = entering_var_index;
+}
+
+// See pages 47 and 50 of [PapadimitriouS98].
+PPL::dimension_type
+PPL::MIP_Problem
+::get_exiting_base_index(const dimension_type entering_var_index) const  {
+  // The variable exiting the base should be associated to a tableau
+  // constraint such that the ratio
+  // tableau[i][entering_var_index] / tableau[i][base[i]]
+  // is strictly positive and minimal.
+
+  // Find the first tableau constraint `c' having a positive value for
+  // tableau[i][entering_var_index] / tableau[i][base[i]]
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  dimension_type exiting_base_index = tableau_num_rows;
+  for (dimension_type i = 0; i < tableau_num_rows; ++i) {
+    const Row& t_i = tableau[i];
+    const int num_sign = sgn(t_i[entering_var_index]);
+    if (num_sign != 0 && num_sign == sgn(t_i[base[i]])) {
+      exiting_base_index = i;
+      break;
+    }
+  }
+  // Check for unboundedness.
+  if (exiting_base_index == tableau_num_rows)
+    return tableau_num_rows;
+
+  // Reaching this point means that a variable will definitely exit the base.
+  TEMP_INTEGER(lcm);
+  TEMP_INTEGER(current_min);
+  TEMP_INTEGER(challenger);
+  for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) {
+    const Row& t_i = tableau[i];
+    const Coefficient& t_ie = t_i[entering_var_index];
+    const Coefficient& t_ib = t_i[base[i]];
+    const int t_ie_sign = sgn(t_ie);
+    if (t_ie_sign != 0 && t_ie_sign == sgn(t_ib)) {
+      const Row& t_e = tableau[exiting_base_index];
+      const Coefficient& t_ee = t_e[entering_var_index];
+      lcm_assign(lcm, t_ee, t_ie);
+      exact_div_assign(current_min, lcm, t_ee);
+      current_min *= t_e[0];
+      abs_assign(current_min);
+      exact_div_assign(challenger, lcm, t_ie);
+      challenger *= t_i[0];
+      abs_assign(challenger);
+      current_min -= challenger;
+      const int sign = sgn(current_min);
+      if (sign > 0
+	  || (sign == 0 && base[i] < base[exiting_base_index]))
+	exiting_base_index = i;
+    }
+  }
+  return exiting_base_index;
+}
+
+// See page 49 of [PapadimitriouS98].
+#if PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT
+bool
+PPL::MIP_Problem::compute_simplex() {
+  const unsigned long allowed_non_increasing_loops = 200;
+  unsigned long non_increased_times = 0;
+  bool call_textbook = false;
+  TEMP_INTEGER(cost_sgn_coeff);
+  TEMP_INTEGER(current_num);
+  TEMP_INTEGER(current_den);
+  TEMP_INTEGER(challenger);
+  TEMP_INTEGER(current);
+  cost_sgn_coeff = working_cost[working_cost.size()-1];
+  current_num = working_cost[0];
+  if (cost_sgn_coeff < 0)
+    neg_assign(current_num);
+  abs_assign(current_den, cost_sgn_coeff);
+  assert(tableau.num_columns() == working_cost.size());
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  while (true) {
+    // Choose the index of the variable entering the base, if any.
+    const dimension_type entering_var_index = call_textbook
+      ? textbook_entering_index() : steepest_edge_entering_index();
+
+    // If no entering index was computed, the problem is solved.
+    if (entering_var_index == 0)
+      return true;
+
+    // Choose the index of the row exiting the base.
+    const dimension_type exiting_base_index
+      = get_exiting_base_index(entering_var_index);
+    // If no exiting index was computed, the problem is unbounded.
+    if (exiting_base_index == tableau_num_rows)
+      return false;
+
+    // Check if the client has requested abandoning all expensive
+    // computations. If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // We have not reached the optimality or unbounded condition:
+    // compute the new base and the corresponding vertex of the
+    // feasible region.
+    pivot(entering_var_index, exiting_base_index);
+
+    // Now begins the objective function's value check to choose between
+    // the `textbook' and the float `steepest-edge' technique.
+    cost_sgn_coeff = working_cost[working_cost.size()-1];
+
+    challenger = working_cost[0];
+    if (cost_sgn_coeff < 0)
+      neg_assign(challenger);
+    challenger *= current_den;
+    abs_assign(current, cost_sgn_coeff);
+    current *= current_num;
+#if PPL_NOISY_SIMPLEX
+    ++num_iterations;
+    if (num_iterations % 200 == 0)
+      std::cout << "Primal Simplex: iteration "
+		<< num_iterations << "." << std::endl;
+#endif
+     //  If the following condition fails, probably there's a bug.
+    assert(challenger >= current);
+    // If the value of the objective function does not improve,
+    // keep track of that.
+    if (challenger == current) {
+      ++non_increased_times;
+      // In the following case we will proceed using the `textbook'
+      // technique, until the objective function is not improved.
+      if (non_increased_times > allowed_non_increasing_loops)
+	call_textbook = true;
+    }
+    // The objective function has an improvement, reset `non_increased_times'.
+    else {
+      non_increased_times = 0;
+      if (call_textbook)
+	call_textbook = false;
+    }
+    current_num = working_cost[0];
+    if (cost_sgn_coeff < 0)
+      neg_assign(current_num);
+    abs_assign(current_den, cost_sgn_coeff);
+  }
+}
+
+#else
+bool
+PPL::MIP_Problem::compute_simplex() {
+  assert(tableau.num_columns() == working_cost.size());
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  while (true) {
+    // Choose the index of the variable entering the base, if any.
+    const dimension_type entering_var_index = steepest_edge_entering_index();
+    // If no entering index was computed, the problem is solved.
+    if (entering_var_index == 0)
+      return true;
+
+    // Choose the index of the row exiting the base.
+    const dimension_type exiting_base_index
+      = get_exiting_base_index(entering_var_index);
+    // If no exiting index was computed, the problem is unbounded.
+    if (exiting_base_index == tableau_num_rows)
+      return false;
+
+    // Check if the client has requested abandoning all expensive
+    // computations. If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // We have not reached the optimality or unbounded condition:
+    // compute the new base and the corresponding vertex of the
+    // feasible region.
+    pivot(entering_var_index, exiting_base_index);
+#if PPL_NOISY_SIMPLEX
+    ++num_iterations;
+    if (num_iterations % 200 == 0)
+      std::cout << "Primal Simplex: iteration "
+                << num_iterations << "." << std::endl;
+#endif
+  }
+}
+#endif // PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT
+
+
+// See pages 55-56 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::erase_artificials(const dimension_type begin_artificials,
+				    const dimension_type end_artificials) {
+  const dimension_type tableau_last_index = tableau.num_columns() - 1;
+  dimension_type tableau_n_rows = tableau.num_rows();
+  // Step 1: try to remove from the base all the remaining slack variables.
+  for (dimension_type i = 0; i < tableau_n_rows; ++i)
+    if (begin_artificials <= base[i] && base[i] <= end_artificials) {
+      // Search for a non-zero element to enter the base.
+      Row& tableau_i = tableau[i];
+      bool redundant = true;
+      for (dimension_type j = end_artificials+1; j-- > 1; )
+	if (!(begin_artificials <= j && j <= end_artificials)
+	    && tableau_i[j] != 0) {
+	  pivot(j, i);
+	  redundant = false;
+	  break;
+	}
+      if (redundant) {
+	// No original variable entered the base:
+	// the constraint is redundant and should be deleted.
+	--tableau_n_rows;
+	if (i < tableau_n_rows) {
+	  // Replace the redundant row with the last one,
+	  // taking care of adjusting the iteration index.
+	  tableau_i.swap(tableau[tableau_n_rows]);
+	  base[i] = base[tableau_n_rows];
+	  --i;
+	}
+	tableau.erase_to_end(tableau_n_rows);
+	base.pop_back();
+      }
+    }
+
+
+  // Step 2: Adjust data structures so as to enter phase 2 of the simplex.
+
+  // Compute the dimensions of the new tableau.
+  dimension_type num_artificials = 0;
+  for (dimension_type i = end_artificials + 1; i-- > 1; )
+    if (begin_artificials <= i && i <= end_artificials) {
+      ++num_artificials;
+      tableau.remove_trailing_columns(1);
+    }
+
+  // Zero the last column of the tableau.
+  for (dimension_type i = tableau_n_rows; i-- > 0; )
+    tableau[i][tableau.num_columns()-1] = 0;
+
+  // ... then properly set the element in the (new) last column,
+  // encoding the kind of optimization; ...
+  working_cost[tableau.num_columns()-1] = working_cost[tableau_last_index];
+  // ... and finally remove redundant columns.
+  const dimension_type working_cost_new_size = working_cost.size() -
+    num_artificials;
+  working_cost.shrink(working_cost_new_size);
+}
+
+// See page 55 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::compute_generator() const {
+  // We will store in num[] and in den[] the numerators and
+  // the denominators of every variable of the original problem.
+  std::vector<Coefficient> num(external_space_dim);
+  std::vector<Coefficient> den(external_space_dim);
+  dimension_type row = 0;
+
+  TEMP_INTEGER(lcm);
+  // Speculatively allocate temporaries out of loop.
+  TEMP_INTEGER(split_num);
+  TEMP_INTEGER(split_den);
+
+  // We start to compute num[] and den[].
+  for (dimension_type i = external_space_dim; i-- > 0; ) {
+    Coefficient& num_i = num[i];
+    Coefficient& den_i = den[i];
+    // Get the value of the variable from the tableau
+    // (if it is not a basic variable, the value is 0).
+    const dimension_type original_var = mapping[i+1].first;
+    if (is_in_base(original_var, row)) {
+      const Row& t_row = tableau[row];
+      if (t_row[original_var] > 0) {
+	neg_assign(num_i, t_row[0]);
+	den_i = t_row[original_var];
+      }
+      else {
+	num_i = t_row[0];
+	neg_assign(den_i, t_row[original_var]);
+      }
+    }
+    else {
+      num_i = 0;
+      den_i = 1;
+    }
+    // Check whether the variable was split.
+    const dimension_type split_var = mapping[i+1].second;
+    if (split_var != 0) {
+      // The variable was split: get the value for the negative component,
+      // having index mapping[i+1].second .
+      // Like before, we he have to check if the variable is in base.
+      if (is_in_base(split_var, row)) {
+	const Row& t_row = tableau[row];
+	if (t_row[split_var] > 0) {
+	  split_num = -t_row[0];
+	  split_den = t_row[split_var];
+	}
+	else {
+	  split_num = t_row[0];
+ 	  split_den = -t_row[split_var];
+	}
+	// We compute the lcm to compute subsequently the difference
+	// between the 2 variables.
+	lcm_assign(lcm, den_i, split_den);
+	exact_div_assign(den_i, lcm, den_i);
+	exact_div_assign(split_den, lcm, split_den);
+	num_i *= den_i;
+	sub_mul_assign(num_i, split_num, split_den);
+	if (num_i == 0)
+	  den_i = 1;
+	else
+	  den_i = lcm;
+      }
+      // Note: if the negative component was not in base, then
+      // it has value zero and there is nothing left to do.
+    }
+  }
+
+  // Compute the lcm of all denominators.
+  lcm = den[0];
+  for (dimension_type i = 1; i < external_space_dim; ++i)
+    lcm_assign(lcm, lcm, den[i]);
+  // Use the denominators to store the numerators' multipliers
+  // and then compute the normalized numerators.
+  for (dimension_type i = external_space_dim; i-- > 0; ) {
+    exact_div_assign(den[i], lcm, den[i]);
+    num[i] *= den[i];
+  }
+
+  // Finally, build the generator.
+  Linear_Expression expr;
+  for (dimension_type i = external_space_dim; i-- > 0; )
+    expr += num[i] * Variable(i);
+
+  MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+  x.last_generator = point(expr, lcm);
+}
+
+void
+PPL::MIP_Problem::second_phase() {
+  // Second_phase requires that *this is satisfiable.
+  assert(status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED);
+  // In the following cases the problem is already solved.
+  if (status == UNBOUNDED || status == OPTIMIZED)
+    return;
+
+  // Build the objective function for the second phase.
+  const dimension_type input_obj_function_sd
+    = input_obj_function.space_dimension();
+  Row new_cost(input_obj_function_sd + 1, Row::Flags());
+  for (dimension_type i = input_obj_function_sd; i-- > 0; )
+    new_cost[i+1] = input_obj_function.coefficient(Variable(i));
+  new_cost[0] = input_obj_function.inhomogeneous_term();
+
+  // Negate the cost function if we are minimizing.
+  if (opt_mode == MINIMIZATION)
+    for (dimension_type i = new_cost.size(); i-- > 0; )
+      neg_assign(new_cost[i]);
+
+  // Substitute properly the cost function in the `costs' matrix.
+  const dimension_type cost_zero_size = working_cost.size();
+  Row tmp_cost = Row(new_cost, cost_zero_size, cost_zero_size);
+  tmp_cost.swap(working_cost);
+  working_cost[cost_zero_size-1] = 1;
+
+  // Split the variables the cost function.
+  for (dimension_type i = new_cost.size(); i-- > 1; ) {
+    const dimension_type original_var = mapping[i].first;
+    const dimension_type split_var = mapping[i].second;
+    working_cost[original_var] = new_cost[i];
+    if (mapping[i].second != 0)
+      working_cost[split_var] = - new_cost[i];
+  }
+  // Here the first phase problem succeeded with optimum value zero.
+  // Express the old cost function in terms of the computed base.
+  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+    const dimension_type base_i = base[i];
+    if (working_cost[base_i] != 0)
+      linear_combine(working_cost, tableau[i], base_i);
+  }
+  // Solve the second phase problem.
+  bool second_phase_successful = compute_simplex();
+  compute_generator();
+#if PPL_NOISY_SIMPLEX
+  std::cout << "MIP_Problem::solve: 2nd phase ended at iteration "
+	    << num_iterations << "." << std::endl;
+#endif
+  status = second_phase_successful ? OPTIMIZED : UNBOUNDED;
+  assert(OK());
+}
+
+void
+PPL::MIP_Problem
+::evaluate_objective_function(const Generator& evaluating_point,
+			      Coefficient& ext_n,
+			      Coefficient& ext_d) const {
+  const dimension_type ep_space_dim = evaluating_point.space_dimension();
+  if (space_dimension() < ep_space_dim)
+    throw std::invalid_argument("PPL::MIP_Problem::"
+				"evaluate_objective_function(p, n, d):\n"
+				"*this and p are dimension incompatible.");
+  if (!evaluating_point.is_point())
+    throw std::invalid_argument("PPL::MIP_Problem::"
+				"evaluate_objective_function(p, n, d):\n"
+				"p is not a point.");
+
+  // Compute the smallest space dimension  between `input_obj_function'
+  // and `evaluating_point'.
+  const dimension_type working_space_dim
+    = std::min(ep_space_dim, input_obj_function.space_dimension());
+  // Compute the optimal value of the cost function.
+  const Coefficient& divisor = evaluating_point.divisor();
+  ext_n = input_obj_function.inhomogeneous_term() * divisor;
+  for (dimension_type i = working_space_dim; i-- > 0; )
+    ext_n += evaluating_point.coefficient(Variable(i))
+      * input_obj_function.coefficient(Variable(i));
+  // Numerator and denominator should be coprime.
+  normalize2(ext_n, divisor, ext_n, ext_d);
+}
+
+bool
+PPL::MIP_Problem::is_lp_satisfiable() const {
+#if PPL_NOISY_SIMPLEX
+  num_iterations = 0;
+#endif
+  switch (status) {
+  case UNSATISFIABLE:
+    return false;
+  case SATISFIABLE:
+   // Intentionally fall through.
+  case UNBOUNDED:
+    // Intentionally fall through.
+  case OPTIMIZED:
+    // Intentionally fall through.
+    return true;
+  case PARTIALLY_SATISFIABLE:
+    {
+    MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+  // This code tries to handle the case that happens if the tableau is
+  // empty, so it must be initialized.
+  if (tableau.num_columns() == 0) {
+    // Add two columns, the first that handles the inhomogeneous term and
+    // the second that represent the `sign'.
+    x.tableau.add_zero_columns(2);
+    // Sync `mapping' for the inhomogeneous term.
+    x.mapping.push_back(std::make_pair(0, 0));
+    // The internal data structures are ready, so prepare for more
+    // assertion to be checked.
+    x.initialized = true;
+  }
+
+  // Apply incrementality to the pending constraint system.
+  x.process_pending_constraints();
+  // Update `first_pending_constraint': no more pending.
+  x.first_pending_constraint = input_cs.size();
+  // Update also `internal_space_dim'.
+  x.internal_space_dim = x.external_space_dim;
+  assert(OK());
+  return (status != UNSATISFIABLE);
+    }
+  }
+  // We should not be here!
+  throw std::runtime_error("PPL internal error");
+}
+
+PPL::MIP_Problem_Status
+PPL::MIP_Problem::solve_mip(bool& have_incumbent_solution,
+			    mpq_class& incumbent_solution_value,
+			    Generator& incumbent_solution_point,
+			    MIP_Problem& lp,
+			    const Variables_Set& i_vars) {
+  // Solve the problem as a non MIP one, it must be done internally.
+  PPL::MIP_Problem_Status lp_status;
+  if (lp.is_lp_satisfiable()) {
+    lp.second_phase();
+    lp_status = (lp.status == OPTIMIZED) ? OPTIMIZED_MIP_PROBLEM
+      : UNBOUNDED_MIP_PROBLEM;
+  }
+  else
+    return UNFEASIBLE_MIP_PROBLEM;
+
+  DIRTY_TEMP0(mpq_class, tmp_rational);
+
+  Generator p = point();
+  TEMP_INTEGER(tmp_coeff1);
+  TEMP_INTEGER(tmp_coeff2);
+
+  if (lp_status == UNBOUNDED_MIP_PROBLEM)
+    p = lp.last_generator;
+  else {
+    assert(lp_status == OPTIMIZED_MIP_PROBLEM);
+    // Do not call optimizing_point().
+    p = lp.last_generator;
+    lp.evaluate_objective_function(p, tmp_coeff1, tmp_coeff2);
+    assign_r(tmp_rational.get_num(), tmp_coeff1, ROUND_NOT_NEEDED);
+    assign_r(tmp_rational.get_den(), tmp_coeff2, ROUND_NOT_NEEDED);
+    assert(is_canonical(tmp_rational));
+    if (have_incumbent_solution
+	&& ((lp.optimization_mode() == MAXIMIZATION
+ 	     && tmp_rational <= incumbent_solution_value)
+ 	    || (lp.optimization_mode() == MINIMIZATION
+		&& tmp_rational >= incumbent_solution_value)))
+      // Abandon this path.
+      return lp_status;
+  }
+
+  bool found_satisfiable_generator = true;
+  TEMP_INTEGER(gcd);
+  const Coefficient& p_divisor = p.divisor();
+  dimension_type nonint_dim;
+  for (Variables_Set::const_iterator v_begin = i_vars.begin(),
+	 v_end = i_vars.end(); v_begin != v_end; ++v_begin) {
+    gcd_assign(gcd, p.coefficient(Variable(*v_begin)), p_divisor);
+    if (gcd != p_divisor) {
+      nonint_dim = *v_begin;
+      found_satisfiable_generator = false;
+      break;
+    }
+  }
+  if (found_satisfiable_generator) {
+    // All the coordinates of `point' are satisfiable.
+    if (lp_status == UNBOUNDED_MIP_PROBLEM) {
+      // This is a point that belongs to the MIP_Problem.
+      // In this way we are sure that we will return every time
+      // a feasible point if requested by the user.
+      incumbent_solution_point = p;
+      return lp_status;
+    }
+    if (!have_incumbent_solution
+	|| (lp.optimization_mode() == MAXIMIZATION
+	    && tmp_rational > incumbent_solution_value)
+	|| tmp_rational < incumbent_solution_value) {
+      incumbent_solution_value = tmp_rational;
+      incumbent_solution_point = p;
+      have_incumbent_solution = true;
+#if PPL_NOISY_SIMPLEX
+      TEMP_INTEGER(num);
+      TEMP_INTEGER(den);
+      lp.evaluate_objective_function(p, num, den);
+      std::cerr << "new value found: " << num << "/" << den << std::endl;
+#endif
+    }
+    return lp_status;
+  }
+
+  assert(nonint_dim < lp.space_dimension());
+
+  assign_r(tmp_rational.get_num(), p.coefficient(Variable(nonint_dim)),
+	   ROUND_NOT_NEEDED);
+  assign_r(tmp_rational.get_den(), p_divisor, ROUND_NOT_NEEDED);
+  tmp_rational.canonicalize();
+  assign_r(tmp_coeff1, tmp_rational, ROUND_DOWN);
+  assign_r(tmp_coeff2, tmp_rational, ROUND_UP);
+  {
+    MIP_Problem lp_aux = lp;
+    lp_aux.add_constraint(Variable(nonint_dim) <= tmp_coeff1);
+    solve_mip(have_incumbent_solution, incumbent_solution_value,
+	      incumbent_solution_point, lp_aux, i_vars);
+  }
+  // TODO: change this when we will be able to remove constraints.
+  lp.add_constraint(Variable(nonint_dim) >= tmp_coeff2);
+  solve_mip(have_incumbent_solution, incumbent_solution_value,
+	    incumbent_solution_point, lp, i_vars);
+  return have_incumbent_solution ? lp_status : UNFEASIBLE_MIP_PROBLEM;
+}
+
+bool
+PPL::MIP_Problem::choose_branching_variable(const MIP_Problem& mip,
+					    const Variables_Set& i_vars,
+					    dimension_type& branching_index) {
+  // Insert here the variables that don't satisfy the integrality condition.
+  const Constraint_Sequence& input_cs = mip.input_cs;
+  const Generator& last_generator = mip.last_generator;
+  const Coefficient& last_generator_divisor = last_generator.divisor();
+  Variables_Set candidate_variables;
+
+  TEMP_INTEGER(gcd);
+  for (Variables_Set::const_iterator v_it = i_vars.begin(),
+	 v_end = i_vars.end(); v_it != v_end; ++v_it) {
+    gcd_assign(gcd,
+	       last_generator.coefficient(Variable(*v_it)),
+	       last_generator_divisor);
+    if (gcd != last_generator_divisor)
+      candidate_variables.insert(*v_it);
+  }
+  // If this set is empty, we have finished.
+  if (candidate_variables.empty())
+    return true;
+
+  // Check how many `active constraints' we have and track them.
+  const dimension_type input_cs_num_rows = input_cs.size();
+  std::deque<bool> satisfiable_constraints (input_cs_num_rows, false);
+  for (dimension_type i = input_cs_num_rows; i-- > 0; )
+    // An equality is an `active constraint' by definition.
+    // If we have an inequality, check if it is an `active constraint'.
+    if (input_cs[i].is_equality()
+	|| is_saturated(input_cs[i], last_generator))
+      satisfiable_constraints[i] = true;
+
+  dimension_type current_num_appearances = 0;
+  dimension_type winning_num_appearances = 0;
+
+  // For every candidate variable, check how many times this appear in the
+  // active constraints.
+  for (Variables_Set::const_iterator v_it = candidate_variables.begin(),
+	 v_end = candidate_variables.end(); v_it != v_end; ++v_it) {
+    current_num_appearances = 0;
+    for (dimension_type i = input_cs_num_rows; i-- > 0; )
+      if (satisfiable_constraints[i]
+	  && *v_it < input_cs[i].space_dimension()
+	  && input_cs[i].coefficient(Variable(*v_it)) != 0)
+	++current_num_appearances;
+    if (current_num_appearances >= winning_num_appearances) {
+      winning_num_appearances = current_num_appearances;
+      branching_index = *v_it;
+    }
+  }
+  return false;
+}
+
+bool
+PPL::MIP_Problem::is_mip_satisfiable(MIP_Problem& lp, Generator& p,
+				     const Variables_Set& i_vars) {
+  // Solve the problem as a non MIP one, it must be done internally.
+  if (!lp.is_lp_satisfiable())
+    return false;
+  DIRTY_TEMP0(mpq_class, tmp_rational);
+
+  TEMP_INTEGER(tmp_coeff1);
+  TEMP_INTEGER(tmp_coeff2);
+  p = lp.last_generator;
+
+  bool found_satisfiable_generator = true;
+  dimension_type nonint_dim;
+  const Coefficient& p_divisor = p.divisor();
+
+#if PPL_SIMPLEX_USE_MIP_HEURISTIC
+  found_satisfiable_generator
+    = choose_branching_variable(lp, i_vars, nonint_dim);
+#else
+  TEMP_INTEGER(gcd);
+  for (Variables_Set::const_iterator v_begin = i_vars.begin(),
+	 v_end = i_vars.end(); v_begin != v_end; ++v_begin) {
+    gcd_assign(gcd, p.coefficient(Variable(*v_begin)), p_divisor);
+    if (gcd != p_divisor) {
+      nonint_dim = *v_begin;
+      found_satisfiable_generator = false;
+      break;
+    }
+  }
+#endif
+
+  if (found_satisfiable_generator)
+    return true;
+
+
+  assert(nonint_dim < lp.space_dimension());
+
+  assign_r(tmp_rational.get_num(), p.coefficient(Variable(nonint_dim)),
+	   ROUND_NOT_NEEDED);
+  assign_r(tmp_rational.get_den(), p_divisor, ROUND_NOT_NEEDED);
+  tmp_rational.canonicalize();
+  assign_r(tmp_coeff1, tmp_rational, ROUND_DOWN);
+  assign_r(tmp_coeff2, tmp_rational, ROUND_UP);
+  {
+    MIP_Problem lp_aux = lp;
+    lp_aux.add_constraint(Variable(nonint_dim) <= tmp_coeff1);
+    if (is_mip_satisfiable(lp_aux, p, i_vars))
+      return true;
+  }
+  lp.add_constraint(Variable(nonint_dim) >= tmp_coeff2);
+  return is_mip_satisfiable(lp, p, i_vars);
+}
+
+bool
+PPL::MIP_Problem::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+  const dimension_type input_cs_num_rows = input_cs.size();
+  // Check that every member used is OK.
+
+  for (dimension_type i = input_cs_num_rows; i-- > 0; )
+    if (!input_cs[i].OK())
+      return false;
+
+  if (!tableau.OK() || !input_obj_function.OK() || !last_generator.OK())
+    return false;
+
+  // Constraint system should contain no strict inequalities.
+  for (dimension_type i = input_cs_num_rows; i-- > 0; )
+    if (input_cs[i].is_strict_inequality()) {
+#ifndef NDEBUG
+      cerr << "The feasible region of the MIP_Problem is defined by "
+	   << "a constraint system containing strict inequalities."
+	   << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+  // Constraint system and objective function should be dimension compatible.
+  if (external_space_dim < input_obj_function.space_dimension()) {
+#ifndef NDEBUG
+    cerr << "The MIP_Problem and the objective function have "
+	 << "incompatible space dimensions ("
+	 << external_space_dim << " < "
+	 << input_obj_function.space_dimension() << ")."
+	 << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (status != UNSATISFIABLE && initialized) {
+    // Here `last_generator' has to be meaningful.
+    // Check for dimension compatibility and actual feasibility.
+    if (external_space_dim != last_generator.space_dimension()) {
+#ifndef NDEBUG
+      cerr << "The MIP_Problem and the cached feasible point have "
+ 	   << "incompatible space dimensions ("
+ 	   << external_space_dim << " != "
+	   << last_generator.space_dimension() << ")."
+ 	   << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+    for (dimension_type i = 0; i < first_pending_constraint; ++i)
+      if (!is_satisfied(input_cs[i], last_generator)) {
+#ifndef NDEBUG
+	cerr << "The cached feasible point does not belong to "
+	     << "the feasible region of the MIP_Problem."
+	     << endl;
+	ascii_dump(cerr);
+#endif
+	return false;
+      }
+
+    // Check that every integer declared variable is really integer.
+    // in the solution found.
+    if (!i_variables.empty()) {
+      TEMP_INTEGER(gcd);
+      for (Variables_Set::const_iterator v_it = i_variables.begin(),
+	     v_end = i_variables.end(); v_it != v_end; ++v_it) {
+	gcd_assign(gcd, last_generator.coefficient(Variable(*v_it)),
+		   last_generator.divisor());
+	if (gcd != last_generator.divisor())
+	  return false;
+      }
+    }
+
+    const dimension_type tableau_nrows = tableau.num_rows();
+    const dimension_type tableau_ncols = tableau.num_columns();
+
+    // The number of rows in the tableau and base should be equal.
+    if (tableau_nrows != base.size()) {
+#ifndef NDEBUG
+      cerr << "tableau and base have incompatible sizes" << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+    // The size of `mapping' should be equal to the space dimension
+    // of `input_cs' plus one.
+    if (mapping.size() != external_space_dim + 1) {
+#ifndef NDEBUG
+      cerr << "`input_cs' and `mapping' have incompatible sizes" << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+    // The number of columns in the tableau and working_cost should be equal.
+    if (tableau_ncols != working_cost.size()) {
+#ifndef NDEBUG
+      cerr << "tableau and working_cost have incompatible sizes" << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+    // The vector base should contain indices of tableau's columns.
+    for (dimension_type i = base.size(); i-- > 0; ) {
+      if (base[i] > tableau_ncols) {
+#ifndef NDEBUG
+	cerr << "base contains an invalid column index" << endl;
+	ascii_dump(cerr);
+#endif
+	return false;
+      }
+      // tableau[i][base[i] must be different from zero.
+      // tableau[i][base[j], with i different from j, must not be a zero.
+      for (dimension_type j = tableau_nrows; j-- > 0; )
+	if (i != j && tableau[j][base[i]] != 0) {
+#ifndef NDEBUG
+	  cerr << "tableau[i][base[i] must be different from zero" << endl;
+	  ascii_dump(cerr);
+#endif
+	  return false;
+	}
+      if (tableau[i][base[i]] == 0) {
+#ifndef NDEBUG
+	cerr << "tableau[i][base[j], with i different from j, must not be "
+	     << "a zero" << endl;
+	ascii_dump(cerr);
+#endif
+	return false;
+      }
+    }
+
+    // The last column of the tableau must contain only zeroes.
+    for (dimension_type i = tableau_nrows; i-- > 0; )
+      if (tableau[i][tableau_ncols-1] != 0) {
+#ifndef NDEBUG
+	cerr << "the last column of the tableau must contain only"
+	  "zeroes"<< endl;
+	ascii_dump(cerr);
+#endif
+	return false;
+      }
+   }
+
+   // All checks passed.
+   return true;
+}
+
+void
+PPL::MIP_Problem::ascii_dump(std::ostream& s) const {
+  using namespace IO_Operators;
+  s << "\nexternal_space_dim: " << external_space_dim << " \n";
+  s << "\ninternal_space_dim: " << internal_space_dim << " \n";
+
+  const dimension_type input_cs_size = input_cs.size();
+
+  s << "\ninput_cs( " << input_cs_size << " )\n";
+  for (dimension_type i = 0; i < input_cs_size; ++i)
+    input_cs[i].ascii_dump(s);
+
+  s << "\nfirst_pending_constraint: " <<  first_pending_constraint
+    << std::endl;
+
+  s << "\ninput_obj_function\n";
+  input_obj_function.ascii_dump(s);
+  s << "\nopt_mode "
+    << (opt_mode == MAXIMIZATION ? "MAXIMIZATION" : "MINIMIZATION") << "\n";
+
+  s << "\nstatus: ";
+  switch (status) {
+  case UNSATISFIABLE:
+    s << "UNSATISFIABLE";
+    break;
+  case SATISFIABLE:
+    s << "SATISFIABLE";
+    break;
+  case UNBOUNDED:
+    s << "UNBOUNDED";
+    break;
+  case OPTIMIZED:
+    s << "OPTIMIZED";
+    break;
+  case PARTIALLY_SATISFIABLE:
+    s << "PARTIALLY_SATISFIABLE";
+    break;
+  }
+  s << "\n";
+
+  s << "\ntableau\n";
+  tableau.ascii_dump(s);
+  s << "\nworking_cost( " << working_cost.size()<< " )\n";
+  working_cost.ascii_dump(s);
+
+  const dimension_type base_size = base.size();
+  s << "\nbase( " << base_size << " )\n";
+  for (dimension_type i = 0; i != base_size; ++i)
+    s << base[i] << ' ';
+
+  s << "\nlast_generator\n";
+  last_generator.ascii_dump(s);
+
+  const dimension_type mapping_size = mapping.size();
+  s << "\nmapping( " << mapping_size << " )\n";
+  for (dimension_type i = 1; i < mapping_size; ++i)
+    s << "\n"<< i << " -> " << mapping[i].first << " -> " << mapping[i].second
+      << ' ';
+
+  s << "\n\ninteger_variables";
+  i_variables.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(MIP_Problem)
+
+bool
+PPL::MIP_Problem::ascii_load(std::istream& s) {
+  std::string str;
+if (!(s >> str) || str != "external_space_dim:")
+    return false;
+
+if (!(s >> external_space_dim))
+    return false;
+
+if (!(s >> str) || str != "internal_space_dim:")
+    return false;
+
+if (!(s >> internal_space_dim))
+    return false;
+
+ if (!(s >> str) || str != "input_cs(")
+    return false;
+
+  dimension_type input_cs_size;
+
+  if (!(s >> input_cs_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  Constraint c(Constraint::zero_dim_positivity());
+  for (dimension_type i = 0; i < input_cs_size; ++i) {
+    if (!c.ascii_load(s))
+      return false;
+    input_cs.push_back(c);
+  }
+
+  if (!(s >> str) || str != "first_pending_constraint:")
+    return false;
+
+  if (!(s >> first_pending_constraint))
+    return false;
+
+  if (!(s >> str) || str != "input_obj_function")
+    return false;
+
+  if (!input_obj_function.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "opt_mode")
+    return false;
+
+  if (!(s >> str))
+    return false;
+
+  if (str == "MAXIMIZATION")
+    set_optimization_mode(MAXIMIZATION);
+  else {
+    if (str != "MINIMIZATION")
+      return false;
+    set_optimization_mode(MINIMIZATION);
+  }
+
+  if (!(s >> str) || str != "status:")
+    return false;
+
+  if (!(s >> str))
+    return false;
+
+  if (str == "UNSATISFIABLE")
+    status = UNSATISFIABLE;
+  else if (str == "SATISFIABLE")
+    status = SATISFIABLE;
+  else if (str == "UNBOUNDED")
+    status = UNBOUNDED;
+  else if (str == "OPTIMIZED")
+    status = OPTIMIZED;
+  else if (str == "PARTIALLY_SATISFIABLE")
+    status = PARTIALLY_SATISFIABLE;
+  else
+    return false;
+
+  if (!(s >> str) || str != "tableau")
+    return false;
+
+  if (!tableau.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "working_cost(")
+    return false;
+
+  dimension_type working_cost_dim;
+
+  if (!(s >> working_cost_dim))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  if (!working_cost.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "base(")
+    return false;
+
+  dimension_type base_size;
+  if (!(s >> base_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  dimension_type base_value;
+  for (dimension_type i = 0; i != base_size; ++i) {
+    if (!(s >> base_value))
+      return false;
+    base.push_back(base_value);
+  }
+
+  if (!(s >> str) || str != "last_generator")
+    return false;
+
+  if (!last_generator.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "mapping(")
+    return false;
+
+  dimension_type mapping_size;
+  if (!(s >> mapping_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  dimension_type first_value;
+  dimension_type second_value;
+  dimension_type index;
+
+  // The first `mapping' index is never used, so we initialize
+  // it pushing back a dummy value.
+  if (tableau.num_columns() != 0)
+    mapping.push_back(std::make_pair(0, 0));
+
+  for (dimension_type i = 1; i < mapping_size; ++i) {
+    if (!(s >> index))
+      return false;
+    if (!(s >> str) || str != "->")
+      return false;
+    if (!(s >> first_value))
+      return false;
+    if (!(s >> str) || str != "->")
+      return false;
+    if (!(s >> second_value))
+      return false;
+    mapping.push_back(std::make_pair(first_value, second_value));
+  }
+
+  if (!(s >> str) || str != "integer_variables")
+    return false;
+
+  if (!i_variables.ascii_load(s))
+    return false;
+
+  assert(OK());
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const MIP_Problem& lp) {
+  s << "Constraints:";
+  for (MIP_Problem::const_iterator i = lp.constraints_begin(),
+	 i_end = lp.constraints_end(); i != i_end; ++i)
+    s << "\n" << *i;
+  s << "\nObjective function: "
+    << lp.objective_function()
+    << "\nOptimization mode: "
+    << (lp.optimization_mode() == MAXIMIZATION
+	? "MAXIMIZATION"
+	: "MINIMIZATION");
+  s << "\nInteger variables: " << lp.integer_space_dimensions();
+ return s;
+}
diff --git a/src/MIP_Problem.defs.hh b/src/MIP_Problem.defs.hh
new file mode 100644
index 0000000..91cc792
--- /dev/null
+++ b/src/MIP_Problem.defs.hh
@@ -0,0 +1,749 @@
+/* MIP_Problem class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_MIP_Problem_defs_hh
+#define PPL_MIP_Problem_defs_hh 1
+
+#include "MIP_Problem.types.hh"
+#include "globals.types.hh"
+#include "Row.defs.hh"
+#include "Matrix.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.types.hh"
+#include "Constraint_System.types.hh"
+#include "Generator.defs.hh"
+#include "Variables_Set.defs.hh"
+#include <vector>
+#include <deque>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const MIP_Problem& lp);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+  An object of this class encodes a mixed integer (linear) programming problem.
+  The MIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the feasible region, by means of a finite set of linear equality
+     and non-strict inequality constraints;
+   - the subset of the unknown variables that range over the integers
+     (the other variables implicitly ranging over the reals);
+   - the objective function, described by a Linear_Expression;
+   - the optimization mode (either maximization or minimization).
+
+  The class provides support for the (incremental) solution of the
+  MIP problem based on variations of the revised simplex method and
+  on branch-and-bound techniques. The result of the resolution
+  process is expressed in terms of an enumeration, encoding the
+  feasibility and the unboundedness of the optimization problem.
+  The class supports simple feasibility tests (i.e., no optimization),
+  as well as the extraction of an optimal (resp., feasible) point,
+  provided the MIP_Problem is optimizable (resp., feasible).
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given MIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of constraints,
+  the change of objective function and the change of optimization mode.
+*/
+class Parma_Polyhedra_Library::MIP_Problem {
+public:
+  //! Builds a trivial MIP problem.
+  /*!
+    A trivial MIP problem requires to maximize the objective function
+    \f$0\f$ on a vector space under no constraints at all:
+    the origin of the vector space is an optimal solution.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this
+    (optional argument with default value \f$0\f$).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+  explicit MIP_Problem(dimension_type dim = 0);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode;
+    those dimensions whose indices occur in \p int_vars are
+    constrained to take an integer value.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param int_vars
+    The set of variables' indexes that are constrained to take integer values.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality,
+    if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) or the space dimension
+    of the integer variable set is strictly greater than \p dim.
+  */
+  template <typename In>
+  MIP_Problem(dimension_type dim,
+	      In first, In last,
+	      const Variables_Set& int_vars,
+	      const Linear_Expression& obj = Linear_Expression::zero(),
+	      Optimization_Mode mode = MAXIMIZATION);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality
+    or if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) is strictly
+    greater than \p dim.
+  */
+template <typename In>
+MIP_Problem(dimension_type dim,
+	    In first, In last,
+	    const Linear_Expression& obj = Linear_Expression::zero(),
+	    Optimization_Mode mode = MAXIMIZATION);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim from the constraint
+    system \p cs, the objective function \p obj and optimization mode \p mode.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param cs
+    The constraint system defining the feasible region.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system contains any strict inequality
+    or if the space dimension of the constraint system (resp., the
+    objective function) is strictly greater than \p dim.
+  */
+  MIP_Problem(dimension_type dim,
+	      const Constraint_System& cs,
+	      const Linear_Expression& obj = Linear_Expression::zero(),
+	      Optimization_Mode mode = MAXIMIZATION);
+
+  //! Ordinary copy-constructor.
+  MIP_Problem(const MIP_Problem& y);
+
+  //! Destructor.
+  ~MIP_Problem();
+
+  //! Assignment operator.
+  MIP_Problem& operator=(const MIP_Problem& y);
+
+  //! Returns the maximum space dimension an MIP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the MIP problem.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a set containing all the variables' indexes constrained
+    to be integral.
+  */
+  const Variables_Set& integer_space_dimensions() const;
+
+private:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint> Constraint_Sequence;
+
+public:
+  /*! \brief
+    A type alias for the read-only iterator on the constraints
+    defining the feasible region.
+  */
+  typedef Constraint_Sequence::const_iterator const_iterator;
+
+  /*! \brief
+    Returns a read-only iterator to the first constraint defining
+    the feasible region.
+  */
+  const_iterator constraints_begin() const;
+
+  /*! \brief
+    Returns a past-the-end read-only iterator to the sequence of
+    constraints defining the feasible region.
+  */
+  const_iterator constraints_end() const;
+
+  //! Returns the objective function.
+  const Linear_Expression& objective_function() const;
+
+  //! Returns the optimization mode.
+  Optimization_Mode optimization_mode() const;
+
+  //! Resets \p *this to be equal to the trivial MIP problem.
+  /*!
+    The space dimension is reset to \f$0\f$.
+  */
+  void clear();
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old MIP problem
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new MIP problem; they are initially unconstrained.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Sets the variables whose indexes are in set \p i_vars to be
+    integer space dimensions.
+
+    \exception std::invalid_argument
+    Thrown if some index in \p i_vars does not correspond to
+    a space dimension in \p *this.
+  */
+  void add_to_integer_space_dimensions(const Variables_Set& i_vars);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint \p c is a strict inequality or if its space
+    dimension is strictly greater than the space dimension of \p *this.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains any strict inequality
+    or if its space dimension is strictly greater than the space dimension
+    of \p *this.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Sets the objective function to \p obj.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p obj is strictly greater than
+    the space dimension of \p *this.
+  */
+  void set_objective_function(const Linear_Expression& obj);
+
+  //! Sets the optimization mode to \p mode.
+  void set_optimization_mode(Optimization_Mode mode);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the MIP problem.
+  /*!
+    \return
+    An MIP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible, unbounded or optimized problem).
+  */
+  MIP_Problem_Status solve() const;
+
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+    of evaluating the objective function on \p evaluating_point.
+
+    \param evaluating_point
+    The point on which the objective function will be evaluated.
+
+    \param num
+    On exit will contain the numerator of the evaluated value.
+
+    \param den
+    On exit will contain the denominator of the evaluated value.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p evaluating_point are dimension-incompatible
+    or if the generator \p evaluating_point is not a point.
+  */
+  void evaluate_objective_function(const Generator& evaluating_point,
+				   Coefficient& num,
+				   Coefficient& den) const;
+
+  //! Returns a feasible point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if the MIP problem is not satisfiable.
+  */
+  const Generator& feasible_point() const;
+
+  //! Returns an optimal point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  const Generator& optimizing_point() const;
+
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+    the solution of the optimization problem.
+
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  void optimal_value(Coefficient& num, Coefficient& den) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(MIP_Problem& y);
+
+private:
+  //! The dimension of the vector space.
+  dimension_type external_space_dim;
+
+  /*! \brief
+    The space dimension of the current (partial) solution of the
+    MIP problem; it may be smaller than \p external_space_dim.
+  */
+  dimension_type internal_space_dim;
+
+  //! The matrix encoding the current feasible region in tableau form.
+  Matrix tableau;
+
+  //! The working cost function.
+  Row working_cost;
+
+  //! A map between the variables of `input_cs' and `tableau'.
+  /*!
+    Contains all the pairs (i, j) such that mapping[i].first encodes the index
+    of the column in the tableau where input_cs[i] is stored; mapping[i].second
+    not a zero, encodes the split part of the tableau of input_cs[i].
+    The "positive" one is represented by mapping[i].first and
+    the "negative" one is represented by mapping[i].second.
+  */
+  std::vector<std::pair<dimension_type, dimension_type> > mapping;
+
+  //! The current basic solution.
+  std::vector<dimension_type> base;
+
+  //! An enumerated type describing the internal status of the MIP problem.
+  enum Status {
+    //! The MIP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The MIP problem is satisfiable; a feasible solution has been computed.
+    SATISFIABLE,
+    //! The MIP problem is unbounded; a feasible solution has been computed.
+    UNBOUNDED,
+    //! The MIP problem is optimized; an optimal solution has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the MIP problem has been changed by adding
+      new space dimensions or new constraints; a feasible solution for
+      the old feasible region is still available.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the MIP problem.
+  Status status;
+
+  /*! \brief
+    A Boolean encoding whether or not internal data structures have
+    already been properly sized and populated: useful to allow for
+    deeper checks in method OK().
+  */
+  bool initialized;
+
+  //! The sequence of constraints describing the feasible region.
+  Constraint_Sequence input_cs;
+
+  //! The first index of `input_cs' containing a pending constraint.
+  dimension_type first_pending_constraint;
+
+  //! The objective function to be optimized.
+  Linear_Expression input_obj_function;
+
+  //! The optimization mode requested.
+  Optimization_Mode opt_mode;
+
+  //! The last successfully computed feasible or optimizing point.
+  Generator last_generator;
+
+  /*! \brief
+    A set containing all the indexes of variables that are constrained
+    to have an integer value.
+  */
+  Variables_Set i_variables;
+
+  //! Processes the pending constraints of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the MIP problem is satisfiable after
+    processing the pending constraints, <CODE>false</CODE> otherwise.
+  */
+  bool process_pending_constraints();
+
+  /*! \brief
+    Optimizes the MIP problem using the second phase of the
+    primal simplex algorithm.
+  */
+  void second_phase();
+
+  /*! \brief
+    Assigns to \p this->tableau a simplex tableau representing the
+    MIP problem, inserting into \p this->mapping the information
+    that is required to recover the original MIP problem.
+
+    \return
+    <CODE>UNFEASIBLE_MIP_PROBLEM</CODE> if the constraint system contains
+    any trivially unfeasible constraint (tableau was not computed);
+    <CODE>UNBOUNDED_MIP_PROBLEM</CODE> if the problem is trivially unbounded
+    (the computed tableau contains no constraints);
+    <CODE>OPTIMIZED_MIP_PROBLEM></CODE> if the problem is neither trivially
+    unfeasible nor trivially unbounded (the tableau was computed successfully).
+  */
+  MIP_Problem_Status compute_tableau(std::vector<dimension_type>&
+				    worked_out_row);
+
+  /*! \brief
+    Parses the pending constraints to gather information on
+    how to resize the tableau.
+
+    \return
+    <CODE>UNSATISFIABLE</CODE> if is detected a trivially false constraint,
+    <CODE>SATISFIABLE</CODE> otherwise.
+
+    \param new_num_rows
+    This will store the number of rows that has to be added to the original
+    tableau.
+
+    \param num_slack_variables
+    This will store the number of slack variables that has to be added to
+    the original tableau.
+
+    \param is_tableau_constraint
+    Every element of this vector will be set to <CODE>true</CODE> if the
+    associated pending constraint has to be inserted in the tableau,
+    <CODE>false</CODE> otherwise.
+
+    \param nonnegative_variable
+    This will encode for each variable if this one was split or not.
+    Every element of this vector will be set to <CODE>true</CODE> if the
+    associated variable is split, <CODE>false</CODE> otherwise.
+
+    \param unfeasible_tableau_rows
+    This will contain all the row indexes of the tableau that are no more
+    satisfied after adding more constraints to \p *this.
+
+    \param satisfied_ineqs
+    This will contain all the row indexes of the tableau that are already
+    satisfied by `last_generator' and do not require artificial variables to
+    have a starting feasible base.
+
+  */
+  bool parse_constraints(dimension_type& new_num_rows,
+			 dimension_type& num_slack_variables,
+			 std::deque<bool>& is_tableau_constraint,
+			 std::deque<bool>& nonnegative_variable,
+			 std::vector<dimension_type>& unfeasible_tableau_rows,
+			 std::deque<bool>& satisfied_ineqs);
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the MIP problem.
+    Implemented with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is returned.
+  */
+  dimension_type textbook_entering_index() const;
+
+  /*! \brief
+    Computes the row index of the variable exiting the base
+    of the MIP problem. Implemented with anti-cycling rules.
+
+    \return
+    The row index of the variable exiting the base.
+
+    \param entering_var_index
+    The column index of the variable entering the base.
+  */
+  dimension_type
+  get_exiting_base_index(dimension_type entering_var_index) const;
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The Row that will be combined with \p y object.
+
+    \param y
+    The Row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p x and normalizes it.
+  */
+  static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+  /*! \brief
+    Performs the pivoting operation on the tableau.
+
+    \param entering_var_index
+    The index of the variable entering the base.
+
+    \param exiting_base_index
+    The index of the row exiting the base.
+  */
+  void pivot(dimension_type entering_var_index,
+	     dimension_type exiting_base_index);
+
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the MIP problem.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is returned.
+
+    To compute the entering_index, the steepest edge algorithm chooses
+    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+    largest in absolute value, where
+    \f[
+      \|\Delta x^{j} \|
+        = \left(
+            1+\sum_{i=1}^{m} \alpha_{ij}^2
+          \right)^{\frac{1}{2}}.
+    \f]
+    Recall that, due to the Integer implementation of the algorithm, our
+    tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
+    can be computed dividing the value of the coefficient by the value of
+    the variable in base. Obviously the result may not be an Integer, so
+    we will proceed in another way: the following code will compute the
+    lcm of all the variables in base to get the good ``weight'' of each
+    Coefficient of the tableau.
+  */
+  dimension_type steepest_edge_entering_index() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+  */
+  bool compute_simplex();
+
+  /*! \brief
+    Drop unnecessary artificial variables from the tableau and get ready
+    for the second phase of the simplex algorithm.
+  */
+  void erase_artificials(dimension_type begin_artificials,
+			 dimension_type end_artificials);
+
+  bool is_in_base(dimension_type var_index,
+		  dimension_type& row_index) const;
+
+  /*! \brief
+    Computes a valid generator that satisfies all the constraints of the
+    Linear Programming problem associated to \p *this.
+  */
+  void compute_generator() const;
+
+  /*! \brief
+    Merges previously split variables in the tableau if a nonnegativity
+    constraint is detected.
+
+    \param var_index
+    The index of the variable that has to be merged.
+
+    \param nonfeasible_cs
+    This will contain all the row indexes that are no more satisfied by
+    the computed generator after merging a variable.
+  */
+  void merge_split_variables(dimension_type var_index,
+			      std::vector<dimension_type>& nonfeasible_cs);
+
+  //! Returns <CODE>true</CODE> if and only if \p c is satisfied by \p g.
+  static bool is_satisfied(const Constraint& c, const Generator& g);
+
+  //! Returns <CODE>true</CODE> if and only if \p c is saturated by \p g.
+  static bool is_saturated(const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Returns a status that encodes the solution of the MIP problem.
+
+    \param have_incumbent_solution
+    It is used to store if the solving process has found a provisional
+    optimum point.
+
+    \param incumbent_solution_value
+    Encodes the evaluated value of the provisional optimum point found.
+
+    \param incumbent_solution_point
+    If the method returns `OPTIMIZED', this will contain the optimality point.
+
+    \param mip
+    The problem that has to be solved.
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+  */
+  static MIP_Problem_Status solve_mip(bool& have_incumbent_solution,
+				      mpq_class& incumbent_solution_value,
+				      Generator& incumbent_solution_point,
+				      MIP_Problem& mip,
+				      const Variables_Set& i_vars);
+
+  bool is_lp_satisfiable() const;
+
+  /*! \brief
+    Used with MIP_Problems with a non empty `i_vars',
+    returns <CODE>true</CODE> if and if only a MIP problem is satisfiable,
+    returns <CODE>false</CODE> otherwise.
+
+    \param mip
+    The problem that has to be solved.
+
+    \param p
+    This will encode the feasible point, only if <CODE>true</CODE> is returned.
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+  */
+  static bool is_mip_satisfiable(MIP_Problem& mip, Generator& p,
+				 const Variables_Set& i_vars);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only `last_generator' satisfies all the
+    integrality coditions.
+
+    \param mip
+    The MIP problem.
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+
+    \param branching_index
+    If <CODE>false</CODE> is returned, this will encode the variable index on
+    which must be applied the `branch and bound' algorithm.
+  */
+  static bool choose_branching_variable(const MIP_Problem& mip,
+					const Variables_Set& i_vars,
+					dimension_type& branching_index);
+};
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+void swap(Parma_Polyhedra_Library::MIP_Problem& x,
+	  Parma_Polyhedra_Library::MIP_Problem& y);
+
+} // namespace std
+
+#include "MIP_Problem.inlines.hh"
+#include "MIP_Problem.templates.hh"
+
+#endif // !defined(PPL_MIP_Problem_defs_hh)
diff --git a/src/MIP_Problem.inlines.hh b/src/MIP_Problem.inlines.hh
new file mode 100644
index 0000000..88e4c74
--- /dev/null
+++ b/src/MIP_Problem.inlines.hh
@@ -0,0 +1,175 @@
+/* MIP_Problem class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_MIP_Problem_inlines_hh
+#define PPL_MIP_Problem_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+MIP_Problem::max_space_dimension() {
+  return Constraint::max_space_dimension();
+}
+
+inline dimension_type
+MIP_Problem::space_dimension() const {
+  return external_space_dim;
+}
+
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    tableau(y.tableau),
+    working_cost(y.working_cost),
+    mapping(y.mapping),
+    base(y.base),
+    status(y.status),
+    initialized(y.initialized),
+    input_cs(y.input_cs),
+    first_pending_constraint(y.first_pending_constraint),
+    input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode),
+    last_generator(y.last_generator),
+    i_variables(y.i_variables) {
+  assert(OK());
+}
+
+inline
+MIP_Problem::~MIP_Problem() {
+}
+
+
+inline void
+MIP_Problem::set_optimization_mode(const Optimization_Mode mode) {
+  if (opt_mode != mode) {
+    opt_mode = mode;
+    if (status == UNBOUNDED || status == OPTIMIZED)
+      status = SATISFIABLE;
+    assert(OK());
+  }
+}
+
+inline const Linear_Expression&
+MIP_Problem::objective_function() const {
+  return input_obj_function;
+}
+
+inline Optimization_Mode
+MIP_Problem::optimization_mode() const {
+  return opt_mode;
+}
+
+inline void
+MIP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
+  const Generator& g = optimizing_point();
+  evaluate_objective_function(g, num, den);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_begin() const {
+  return input_cs.begin();
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_end() const {
+  return input_cs.end();
+}
+
+inline const Variables_Set&
+MIP_Problem::integer_space_dimensions() const {
+  return i_variables;
+}
+
+inline void
+MIP_Problem::swap(MIP_Problem& y) {
+  std::swap(external_space_dim, y.external_space_dim);
+  std::swap(internal_space_dim, y.internal_space_dim);
+  std::swap(tableau, y.tableau);
+  std::swap(working_cost, y.working_cost);
+  std::swap(mapping, y.mapping);
+  std::swap(initialized, y.initialized);
+  std::swap(base, y.base);
+  std::swap(status, y.status);
+  std::swap(input_cs, y.input_cs);
+  std::swap(first_pending_constraint, y.first_pending_constraint);
+  std::swap(input_obj_function, y.input_obj_function);
+  std::swap(opt_mode, y.opt_mode);
+  std::swap(last_generator, y.last_generator);
+  std::swap(i_variables, y.i_variables);
+}
+
+inline MIP_Problem&
+MIP_Problem::operator=(const MIP_Problem& y) {
+  MIP_Problem tmp(y);
+  swap(tmp);
+  return *this;
+}
+
+inline void
+MIP_Problem::clear() {
+  MIP_Problem tmp;
+  swap(tmp);
+}
+
+inline memory_size_type
+MIP_Problem::external_memory_in_bytes() const {
+  memory_size_type n
+    = tableau.external_memory_in_bytes()
+    + working_cost.external_memory_in_bytes()
+    + input_obj_function.external_memory_in_bytes()
+    + last_generator.external_memory_in_bytes();
+  // Adding the external memory for `input_cs'.
+  n += input_cs.capacity() * sizeof(Constraint);
+  for (const_iterator i = input_cs.begin(),
+	 i_end = input_cs.end(); i != i_end; ++i)
+    n += (i->external_memory_in_bytes());
+  // Adding the external memory for `base'.
+  n += base.capacity() * sizeof(dimension_type);
+  // Adding the external memory for `mapping'.
+  n += mapping.capacity() * sizeof(std::pair<dimension_type, dimension_type>);
+  return n;
+}
+
+inline memory_size_type
+MIP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+inline void
+swap(Parma_Polyhedra_Library::MIP_Problem& x,
+     Parma_Polyhedra_Library::MIP_Problem& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_MIP_Problem_inlines_hh)
diff --git a/src/MIP_Problem.templates.hh b/src/MIP_Problem.templates.hh
new file mode 100644
index 0000000..714477c
--- /dev/null
+++ b/src/MIP_Problem.templates.hh
@@ -0,0 +1,156 @@
+/* MIP_Problem class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_MIP_Problem_templates_hh
+#define PPL_MIP_Problem_templates_hh 1
+
+#include "Variables_Set.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+MIP_Problem::MIP_Problem(const dimension_type dim,
+			 In first,
+			 In last,
+			 const Variables_Set& int_vars,
+			 const Linear_Expression& obj,
+			 const Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0, Row::Flags()),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    initialized(false),
+    input_cs(),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables(int_vars) {
+  // Check that integer Variables_Set does not exceed the space dimension
+  // of the problem.
+  if (i_variables.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem"
+      << "(dim, first, last, int_vars, obj, mode):\n"
+      << "dim == "<< external_space_dim << " and int_vars.space_dimension() =="
+      << " " << i_variables.space_dimension() << " are dimension"
+      "incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+
+   // Check for space dimension overflow.
+   if (dim > max_space_dimension())
+     throw std::length_error("PPL::MIP_Problem:: MIP_Problem(dim, first, "
+			     "last, int_vars, obj, mode):\n"
+			     "dim exceeds the maximum allowed"
+			     "space dimension.");
+   // Check the objective function.
+   if (obj.space_dimension() > dim) {
+     std::ostringstream s;
+     s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+       << "int_vars, obj, mode):\n"
+       << "obj.space_dimension() == "<< obj.space_dimension()
+       << " exceeds d == "<< dim << ".";
+     throw std::invalid_argument(s.str());
+   }
+   // Check the constraints.
+   for (In i = first; i != last; ++i) {
+     if (i->is_strict_inequality())
+       throw std::invalid_argument("PPL::MIP_Problem::"
+				   "MIP_Problem(dim, first, last, int_vars,"
+				   "obj, mode):\nrange [first, last) contains"
+				   "a strict inequality constraint.");
+     if (i->space_dimension() > dim) {
+       std::ostringstream s;
+       s << "PPL::MIP_Problem::"
+	 << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+	 << "range [first, last) contains a constraint having space"
+	 << "dimension  == " << i->space_dimension() << " that exceeds"
+	 "this->space_dimension == " << dim << ".";
+       throw std::invalid_argument(s.str());
+     }
+     input_cs.push_back(*i);
+   }
+   assert(OK());
+}
+
+template <typename In>
+MIP_Problem::MIP_Problem(dimension_type dim,
+			 In first, In last,
+			 const Linear_Expression& obj,
+			 Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0, Row::Flags()),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    initialized(false),
+    input_cs(),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::"
+			    "MIP_Problem(dim, first, last, obj, mode):\n"
+			    "dim exceeds the maximum allowed space "
+			    "dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+      << " obj, mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds d == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraints.
+  for (In i = first; i != last; ++i) {
+    if (i->is_strict_inequality())
+      throw std::invalid_argument("PPL::MIP_Problem::"
+				  "MIP_Problem(dim, first, last, obj, mode):\n"
+				  "range [first, last) contains a strict "
+				  "inequality constraint.");
+    if (i->space_dimension() > dim) {
+      std::ostringstream s;
+      s << "PPL::MIP_Problem::"
+	<< "MIP_Problem(dim, first, last, obj, mode):\n"
+	<< "range [first, last) contains a constraint having space"
+	<< "dimension" << " == " << i->space_dimension() << " that exceeds"
+	"this->space_dimension == " << dim << ".";
+      throw std::invalid_argument(s.str());
+    }
+    input_cs.push_back(*i);
+  }
+  assert(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_templates_hh)
diff --git a/src/MIP_Problem.types.hh b/src/MIP_Problem.types.hh
new file mode 100644
index 0000000..f1537e5
--- /dev/null
+++ b/src/MIP_Problem.types.hh
@@ -0,0 +1,32 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_MIP_Problem_types_hh
+#define PPL_MIP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum MIP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_MIP_PROBLEM,
+  //! The problem is unbounded.
+  UNBOUNDED_MIP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_MIP_PROBLEM
+};
+
+class MIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_types_hh)
diff --git a/src/Makefile.am b/src/Makefile.am
index c14ffe0..b37279d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -51,8 +51,9 @@
 #	    0.7			    4:0:0
 #	    0.8			    5:0:0
 #	    0.9			    6:0:0
+#	    0.10		    7:0:0
 
-LIBPPL_LT_CURRENT =  6
+LIBPPL_LT_CURRENT =  7
 LIBPPL_LT_REVISION = 0
 LIBPPL_LT_AGE =      0
 
@@ -68,8 +69,7 @@ COPYING.cc \
 CREDITS.cc
 
 ppl_config_LDADD = \
-libppl.la \
- at extra_libraries@
+libppl.la
 
 if USE_NATIVE_INTEGERS
 
@@ -102,13 +102,25 @@ endif
 INCLUDE_FILES = \
 namespaces.hh \
 compiler.hh \
+meta_programming.hh \
+Slow_Copy.hh \
+Has_Assign_Or_Swap.hh \
+assign_or_swap.hh \
+mp_std_bits.defs.hh \
+mp_std_bits.inlines.hh \
+Temp.defs.hh \
+Temp.inlines.hh \
+Temp.templates.hh \
 Coefficient_traits_template.hh \
 Checked_Number.types.hh \
 $(COEFFICIENT_TYPES_INCLUDE_FILES) \
 Coefficient.types.hh \
 globals.types.hh \
+iterator_to_const.types.hh \
+distances.types.hh \
+Interval_Info.types.hh \
 Interval.types.hh \
-Bounding_Box.types.hh \
+Box.types.hh \
 Constraint.types.hh \
 Generator.types.hh \
 Grid_Generator.types.hh \
@@ -118,16 +130,17 @@ Row.types.hh \
 Linear_Row.types.hh \
 Matrix.types.hh \
 Variable.types.hh \
+Variables_Set.types.hh \
 Linear_Expression.types.hh \
 Linear_System.types.hh \
-Saturation_Row.types.hh \
-Saturation_Matrix.types.hh \
+Bit_Row.types.hh \
+Bit_Matrix.types.hh \
 Constraint_System.types.hh \
 Generator_System.types.hh \
 Grid_Generator_System.types.hh \
 Congruence_System.types.hh \
 Scalar_Products.types.hh \
-LP_Problem.types.hh \
+MIP_Problem.types.hh \
 Poly_Con_Relation.types.hh \
 Poly_Gen_Relation.types.hh \
 BHRZ03_Certificate.types.hh \
@@ -141,10 +154,12 @@ Ptr_Iterator.types.hh \
 DB_Row.types.hh \
 DB_Matrix.types.hh \
 BD_Shape.types.hh \
+OR_Matrix.types.hh \
+Octagonal_Shape.types.hh \
 fpu.types.hh \
 Float.defs.hh \
 Float.inlines.hh \
-Limits.hh \
+C_Integer.hh \
 fpu.defs.hh \
 fpu-c99.inlines.hh \
 fpu-ia32.inlines.hh \
@@ -164,20 +179,38 @@ checked_mpq.inlines.hh \
 checked_ext.inlines.hh \
 Checked_Number.defs.hh \
 Checked_Number.inlines.hh \
-mp_numeric_limits.hh \
+Checked_Number.templates.hh \
 checked_numeric_limits.hh \
 $(COEFFICIENT_DEFS_INCLUDE_FILES) \
 Coefficient.defs.hh \
 Coefficient.inlines.hh \
 globals.defs.hh \
 globals.inlines.hh \
+math_utilities.defs.hh \
+math_utilities.inlines.hh \
+iterator_to_const.defs.hh \
+iterator_to_const.inlines.hh \
+distances.defs.hh \
+distances.inlines.hh \
+Boundary.defs.hh \
+Interval_Info.defs.hh \
+Interval_Info.inlines.hh \
+Interval_Restriction.defs.hh \
 Interval.defs.hh \
 Interval.inlines.hh \
-Bounding_Box.defs.hh \
-Bounding_Box.inlines.hh \
+Interval.templates.hh \
+Box.defs.hh \
+Box_Status.inlines.hh \
+Box.inlines.hh \
+Box.templates.hh \
+Rational_Interval.hh \
+Rational_Box.hh \
 Variable.defs.hh \
 Variable.inlines.hh \
+Variables_Set.defs.hh \
+Variables_Set.inlines.hh \
 Init.defs.hh \
+Init.inlines.hh \
 initializer.hh \
 Topology.hh \
 Row.defs.hh \
@@ -186,12 +219,12 @@ Linear_Row.defs.hh \
 Linear_Row.inlines.hh \
 Matrix.defs.hh \
 Matrix.inlines.hh \
-Saturation_Row.defs.hh \
-Saturation_Row.inlines.hh \
+Bit_Row.defs.hh \
+Bit_Row.inlines.hh \
 Linear_System.defs.hh \
 Linear_System.inlines.hh \
-Saturation_Matrix.defs.hh \
-Saturation_Matrix.inlines.hh \
+Bit_Matrix.defs.hh \
+Bit_Matrix.inlines.hh \
 Constraint_System.defs.hh \
 Generator_System.defs.hh \
 Grid_Generator_System.defs.hh \
@@ -203,8 +236,8 @@ Constraint.inlines.hh \
 Constraint_System.inlines.hh \
 Generator.defs.hh \
 Generator.inlines.hh \
-Grid_Generator.inlines.hh \
 Grid_Generator.defs.hh \
+Grid_Generator.inlines.hh \
 Congruence.defs.hh \
 Congruence.inlines.hh \
 Generator_System.inlines.hh \
@@ -212,8 +245,9 @@ Grid_Generator_System.inlines.hh \
 Congruence_System.inlines.hh \
 Scalar_Products.defs.hh \
 Scalar_Products.inlines.hh \
-LP_Problem.defs.hh \
-LP_Problem.inlines.hh \
+MIP_Problem.defs.hh \
+MIP_Problem.inlines.hh \
+MIP_Problem.templates.hh \
 Poly_Con_Relation.defs.hh \
 Poly_Con_Relation.inlines.hh \
 Poly_Gen_Relation.defs.hh \
@@ -243,12 +277,21 @@ Ptr_Iterator.defs.hh \
 Ptr_Iterator.inlines.hh \
 DB_Row.defs.hh \
 DB_Row.inlines.hh \
+DB_Row.templates.hh \
 DB_Matrix.defs.hh \
 DB_Matrix.inlines.hh \
+DB_Matrix.templates.hh \
 BD_Shape.defs.hh \
 BDS_Status.inlines.hh \
 BD_Shape.inlines.hh \
 BD_Shape.templates.hh \
+OR_Matrix.defs.hh \
+OR_Matrix.inlines.hh \
+OR_Matrix.templates.hh \
+Octagonal_Shape.defs.hh \
+Og_Status.inlines.hh \
+Octagonal_Shape.inlines.hh \
+Octagonal_Shape.templates.hh \
 Determinate.types.hh \
 Determinate.defs.hh \
 Determinate.inlines.hh \
@@ -256,23 +299,41 @@ Powerset.types.hh \
 Powerset.defs.hh \
 Powerset.inlines.hh \
 Powerset.templates.hh \
-Polyhedra_Powerset.types.hh \
-Polyhedra_Powerset.defs.hh \
-Polyhedra_Powerset.inlines.hh \
-Polyhedra_Powerset.templates.hh \
+Pointset_Powerset.types.hh \
+Pointset_Powerset.defs.hh \
+Pointset_Powerset.inlines.hh \
+Pointset_Powerset.templates.hh \
+Partially_Reduced_Product.types.hh \
+Partially_Reduced_Product.defs.hh \
+Partially_Reduced_Product.inlines.hh \
+Partially_Reduced_Product.templates.hh \
+Any_Pointset.types.hh \
+Any_Pointset.defs.hh \
+Any_Pointset.inlines.hh \
 max_space_dimension.hh \
 algorithms.hh
+#Ask_Tell.types.hh \
+#Ask_Tell.defs.hh \
+#Ask_Tell.inlines.hh \
+#Ask_Tell.templates.hh \
+#Pointset_Ask_Tell.types.hh \
+#Pointset_Ask_Tell.defs.hh \
+#Pointset_Ask_Tell.inlines.hh \
+#Pointset_Ask_Tell.templates.hh
 
 NESTED_INCLUDE_FILES = \
 Ph_Status.idefs.hh \
 Grid_Status.idefs.hh \
-BDS_Status.idefs.hh
+Box_Status.idefs.hh \
+BDS_Status.idefs.hh \
+Og_Status.idefs.hh
 
 libppl_la_SOURCES = \
-Bounding_Box.cc \
+Box.cc \
 checked.cc \
 Checked_Number.cc \
 Float.cc \
+fpu-ia32.cc \
 Constraint.cc \
 Constraint_System.cc \
 Congruence.cc \
@@ -283,12 +344,11 @@ Generator.cc \
 Grid_Generator.cc \
 Init.cc \
 Coefficient.cc \
-Interval.cc \
 Linear_Expression.cc \
 Linear_System.cc \
 Matrix.cc \
 Scalar_Products.cc \
-LP_Problem.cc \
+MIP_Problem.cc \
 Poly_Con_Relation.cc \
 Poly_Gen_Relation.cc \
 BHRZ03_Certificate.cc \
@@ -305,33 +365,37 @@ Grid_public.cc \
 Grid_chdims.cc \
 Grid_widenings.cc \
 BD_Shape.cc \
-Polyhedra_Powerset.cc \
+Octagonal_Shape.cc \
+Pointset_Powerset.cc \
 Row.cc \
 Linear_Row.cc \
-Saturation_Matrix.cc \
-Saturation_Row.cc \
+Bit_Matrix.cc \
+Bit_Row.cc \
 Ph_Status.cc \
 Grid_Status.cc \
 Variable.cc \
+Variables_Set.cc \
 conversion.cc \
 minimize.cc \
 simplify.cc \
 Grid_conversion.cc \
 Grid_simplify.cc \
 globals.cc \
+mp_std_bits.cc \
 version.cc \
 $(INCLUDE_FILES) \
 $(NESTED_INCLUDE_FILES) \
 swapping_sort.icc
+#Pointset_Ask_Tell.cc
 
 if NO_UNDEFINED
 
 NO_UNDEFINED_FLAG = -no-undefined
 
-libppl_la_LIBADD = @extra_libraries@
-
 endif NO_UNDEFINED
 
+libppl_la_LIBADD = @extra_libraries@
+
 libppl_la_LDFLAGS = \
 $(NO_UNDEFINED_FLAG) \
 -version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
diff --git a/src/Makefile.in b/src/Makefile.in
index e55f707..f4d4cfa 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -67,18 +67,15 @@
 #	    0.7			    4:0:0
 #	    0.8			    5:0:0
 #	    0.9			    6:0:0
+#	    0.10		    7:0:0
 
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -98,7 +95,8 @@ DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/ppl-config.cc.in \
 	$(srcdir)/version.hh.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -108,8 +106,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -127,40 +135,45 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
 libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libppl_la_DEPENDENCIES =
-am__libppl_la_SOURCES_DIST = Bounding_Box.cc checked.cc \
-	Checked_Number.cc Float.cc Constraint.cc Constraint_System.cc \
+am__libppl_la_SOURCES_DIST = Box.cc checked.cc Checked_Number.cc \
+	Float.cc fpu-ia32.cc Constraint.cc Constraint_System.cc \
 	Congruence.cc Congruence_System.cc Generator_System.cc \
 	Grid_Generator_System.cc Generator.cc Grid_Generator.cc \
-	Init.cc Coefficient.cc Interval.cc Linear_Expression.cc \
-	Linear_System.cc Matrix.cc Scalar_Products.cc LP_Problem.cc \
+	Init.cc Coefficient.cc Linear_Expression.cc Linear_System.cc \
+	Matrix.cc Scalar_Products.cc MIP_Problem.cc \
 	Poly_Con_Relation.cc Poly_Gen_Relation.cc \
 	BHRZ03_Certificate.cc H79_Certificate.cc Grid_Certificate.cc \
 	Polyhedron_nonpublic.cc Polyhedron_public.cc \
 	Polyhedron_chdims.cc Polyhedron_widenings.cc C_Polyhedron.cc \
 	NNC_Polyhedron.cc Grid_nonpublic.cc Grid_public.cc \
 	Grid_chdims.cc Grid_widenings.cc BD_Shape.cc \
-	Polyhedra_Powerset.cc Row.cc Linear_Row.cc \
-	Saturation_Matrix.cc Saturation_Row.cc Ph_Status.cc \
-	Grid_Status.cc Variable.cc conversion.cc minimize.cc \
+	Octagonal_Shape.cc Pointset_Powerset.cc Row.cc Linear_Row.cc \
+	Bit_Matrix.cc Bit_Row.cc Ph_Status.cc Grid_Status.cc \
+	Variable.cc Variables_Set.cc conversion.cc minimize.cc \
 	simplify.cc Grid_conversion.cc Grid_simplify.cc globals.cc \
-	version.cc namespaces.hh compiler.hh \
+	mp_std_bits.cc version.cc namespaces.hh compiler.hh \
+	meta_programming.hh Slow_Copy.hh Has_Assign_Or_Swap.hh \
+	assign_or_swap.hh mp_std_bits.defs.hh mp_std_bits.inlines.hh \
+	Temp.defs.hh Temp.inlines.hh Temp.templates.hh \
 	Coefficient_traits_template.hh Checked_Number.types.hh \
 	GMP_Integer.types.hh Coefficient.types.hh globals.types.hh \
-	Interval.types.hh Bounding_Box.types.hh Constraint.types.hh \
-	Generator.types.hh Grid_Generator.types.hh Congruence.types.hh \
-	Init.types.hh Row.types.hh Linear_Row.types.hh Matrix.types.hh \
-	Variable.types.hh Linear_Expression.types.hh \
-	Linear_System.types.hh Saturation_Row.types.hh \
-	Saturation_Matrix.types.hh Constraint_System.types.hh \
-	Generator_System.types.hh Grid_Generator_System.types.hh \
-	Congruence_System.types.hh Scalar_Products.types.hh \
-	LP_Problem.types.hh Poly_Con_Relation.types.hh \
-	Poly_Gen_Relation.types.hh BHRZ03_Certificate.types.hh \
-	H79_Certificate.types.hh Grid_Certificate.types.hh \
-	Polyhedron.types.hh C_Polyhedron.types.hh \
-	NNC_Polyhedron.types.hh Grid.types.hh Ptr_Iterator.types.hh \
-	DB_Row.types.hh DB_Matrix.types.hh BD_Shape.types.hh \
-	fpu.types.hh Float.defs.hh Float.inlines.hh Limits.hh \
+	iterator_to_const.types.hh distances.types.hh \
+	Interval_Info.types.hh Interval.types.hh Box.types.hh \
+	Constraint.types.hh Generator.types.hh Grid_Generator.types.hh \
+	Congruence.types.hh Init.types.hh Row.types.hh \
+	Linear_Row.types.hh Matrix.types.hh Variable.types.hh \
+	Variables_Set.types.hh Linear_Expression.types.hh \
+	Linear_System.types.hh Bit_Row.types.hh Bit_Matrix.types.hh \
+	Constraint_System.types.hh Generator_System.types.hh \
+	Grid_Generator_System.types.hh Congruence_System.types.hh \
+	Scalar_Products.types.hh MIP_Problem.types.hh \
+	Poly_Con_Relation.types.hh Poly_Gen_Relation.types.hh \
+	BHRZ03_Certificate.types.hh H79_Certificate.types.hh \
+	Grid_Certificate.types.hh Polyhedron.types.hh \
+	C_Polyhedron.types.hh NNC_Polyhedron.types.hh Grid.types.hh \
+	Ptr_Iterator.types.hh DB_Row.types.hh DB_Matrix.types.hh \
+	BD_Shape.types.hh OR_Matrix.types.hh Octagonal_Shape.types.hh \
+	fpu.types.hh Float.defs.hh Float.inlines.hh C_Integer.hh \
 	fpu.defs.hh fpu-c99.inlines.hh fpu-ia32.inlines.hh \
 	fpu-none.inlines.hh fpu-sparc.inlines.hh Rounding_Dir.defs.hh \
 	Rounding_Dir.inlines.hh Result.defs.hh Result.inlines.hh \
@@ -168,29 +181,37 @@ am__libppl_la_SOURCES_DIST = Bounding_Box.cc checked.cc \
 	checked_int.inlines.hh checked_float.inlines.hh \
 	checked_mpz.inlines.hh checked_mpq.inlines.hh \
 	checked_ext.inlines.hh Checked_Number.defs.hh \
-	Checked_Number.inlines.hh mp_numeric_limits.hh \
+	Checked_Number.inlines.hh Checked_Number.templates.hh \
 	checked_numeric_limits.hh GMP_Integer.defs.hh \
 	GMP_Integer.inlines.hh Coefficient.defs.hh \
 	Coefficient.inlines.hh globals.defs.hh globals.inlines.hh \
-	Interval.defs.hh Interval.inlines.hh Bounding_Box.defs.hh \
-	Bounding_Box.inlines.hh Variable.defs.hh Variable.inlines.hh \
-	Init.defs.hh initializer.hh Topology.hh Row.defs.hh \
-	Row.inlines.hh Linear_Row.defs.hh Linear_Row.inlines.hh \
-	Matrix.defs.hh Matrix.inlines.hh Saturation_Row.defs.hh \
-	Saturation_Row.inlines.hh Linear_System.defs.hh \
-	Linear_System.inlines.hh Saturation_Matrix.defs.hh \
-	Saturation_Matrix.inlines.hh Constraint_System.defs.hh \
-	Generator_System.defs.hh Grid_Generator_System.defs.hh \
-	Congruence_System.defs.hh Linear_Expression.defs.hh \
-	Linear_Expression.inlines.hh Constraint.defs.hh \
-	Constraint.inlines.hh Constraint_System.inlines.hh \
-	Generator.defs.hh Generator.inlines.hh \
-	Grid_Generator.inlines.hh Grid_Generator.defs.hh \
-	Congruence.defs.hh Congruence.inlines.hh \
-	Generator_System.inlines.hh Grid_Generator_System.inlines.hh \
-	Congruence_System.inlines.hh Scalar_Products.defs.hh \
-	Scalar_Products.inlines.hh LP_Problem.defs.hh \
-	LP_Problem.inlines.hh Poly_Con_Relation.defs.hh \
+	math_utilities.defs.hh math_utilities.inlines.hh \
+	iterator_to_const.defs.hh iterator_to_const.inlines.hh \
+	distances.defs.hh distances.inlines.hh Boundary.defs.hh \
+	Interval_Info.defs.hh Interval_Info.inlines.hh \
+	Interval_Restriction.defs.hh Interval.defs.hh \
+	Interval.inlines.hh Interval.templates.hh Box.defs.hh \
+	Box_Status.inlines.hh Box.inlines.hh Box.templates.hh \
+	Rational_Interval.hh Rational_Box.hh Variable.defs.hh \
+	Variable.inlines.hh Variables_Set.defs.hh \
+	Variables_Set.inlines.hh Init.defs.hh Init.inlines.hh \
+	initializer.hh Topology.hh Row.defs.hh Row.inlines.hh \
+	Linear_Row.defs.hh Linear_Row.inlines.hh Matrix.defs.hh \
+	Matrix.inlines.hh Bit_Row.defs.hh Bit_Row.inlines.hh \
+	Linear_System.defs.hh Linear_System.inlines.hh \
+	Bit_Matrix.defs.hh Bit_Matrix.inlines.hh \
+	Constraint_System.defs.hh Generator_System.defs.hh \
+	Grid_Generator_System.defs.hh Congruence_System.defs.hh \
+	Linear_Expression.defs.hh Linear_Expression.inlines.hh \
+	Constraint.defs.hh Constraint.inlines.hh \
+	Constraint_System.inlines.hh Generator.defs.hh \
+	Generator.inlines.hh Grid_Generator.defs.hh \
+	Grid_Generator.inlines.hh Congruence.defs.hh \
+	Congruence.inlines.hh Generator_System.inlines.hh \
+	Grid_Generator_System.inlines.hh Congruence_System.inlines.hh \
+	Scalar_Products.defs.hh Scalar_Products.inlines.hh \
+	MIP_Problem.defs.hh MIP_Problem.inlines.hh \
+	MIP_Problem.templates.hh Poly_Con_Relation.defs.hh \
 	Poly_Con_Relation.inlines.hh Poly_Gen_Relation.defs.hh \
 	Poly_Gen_Relation.inlines.hh BHRZ03_Certificate.defs.hh \
 	BHRZ03_Certificate.inlines.hh H79_Certificate.defs.hh \
@@ -203,60 +224,75 @@ am__libppl_la_SOURCES_DIST = Bounding_Box.cc checked.cc \
 	NNC_Polyhedron.inlines.hh Widening_Function.types.hh \
 	Widening_Function.defs.hh Widening_Function.inlines.hh \
 	Ptr_Iterator.defs.hh Ptr_Iterator.inlines.hh DB_Row.defs.hh \
-	DB_Row.inlines.hh DB_Matrix.defs.hh DB_Matrix.inlines.hh \
-	BD_Shape.defs.hh BDS_Status.inlines.hh BD_Shape.inlines.hh \
-	BD_Shape.templates.hh Determinate.types.hh Determinate.defs.hh \
-	Determinate.inlines.hh Powerset.types.hh Powerset.defs.hh \
-	Powerset.inlines.hh Powerset.templates.hh \
-	Polyhedra_Powerset.types.hh Polyhedra_Powerset.defs.hh \
-	Polyhedra_Powerset.inlines.hh Polyhedra_Powerset.templates.hh \
+	DB_Row.inlines.hh DB_Row.templates.hh DB_Matrix.defs.hh \
+	DB_Matrix.inlines.hh DB_Matrix.templates.hh BD_Shape.defs.hh \
+	BDS_Status.inlines.hh BD_Shape.inlines.hh \
+	BD_Shape.templates.hh OR_Matrix.defs.hh OR_Matrix.inlines.hh \
+	OR_Matrix.templates.hh Octagonal_Shape.defs.hh \
+	Og_Status.inlines.hh Octagonal_Shape.inlines.hh \
+	Octagonal_Shape.templates.hh Determinate.types.hh \
+	Determinate.defs.hh Determinate.inlines.hh Powerset.types.hh \
+	Powerset.defs.hh Powerset.inlines.hh Powerset.templates.hh \
+	Pointset_Powerset.types.hh Pointset_Powerset.defs.hh \
+	Pointset_Powerset.inlines.hh Pointset_Powerset.templates.hh \
+	Partially_Reduced_Product.types.hh \
+	Partially_Reduced_Product.defs.hh \
+	Partially_Reduced_Product.inlines.hh \
+	Partially_Reduced_Product.templates.hh Any_Pointset.types.hh \
+	Any_Pointset.defs.hh Any_Pointset.inlines.hh \
 	max_space_dimension.hh algorithms.hh Ph_Status.idefs.hh \
-	Grid_Status.idefs.hh BDS_Status.idefs.hh swapping_sort.icc
+	Grid_Status.idefs.hh Box_Status.idefs.hh BDS_Status.idefs.hh \
+	Og_Status.idefs.hh swapping_sort.icc
 am__objects_1 =
 am__objects_2 = $(am__objects_1) $(am__objects_1)
-am_libppl_la_OBJECTS = Bounding_Box.lo checked.lo Checked_Number.lo \
-	Float.lo Constraint.lo Constraint_System.lo Congruence.lo \
+am_libppl_la_OBJECTS = Box.lo checked.lo Checked_Number.lo Float.lo \
+	fpu-ia32.lo Constraint.lo Constraint_System.lo Congruence.lo \
 	Congruence_System.lo Generator_System.lo \
 	Grid_Generator_System.lo Generator.lo Grid_Generator.lo \
-	Init.lo Coefficient.lo Interval.lo Linear_Expression.lo \
-	Linear_System.lo Matrix.lo Scalar_Products.lo LP_Problem.lo \
+	Init.lo Coefficient.lo Linear_Expression.lo Linear_System.lo \
+	Matrix.lo Scalar_Products.lo MIP_Problem.lo \
 	Poly_Con_Relation.lo Poly_Gen_Relation.lo \
 	BHRZ03_Certificate.lo H79_Certificate.lo Grid_Certificate.lo \
 	Polyhedron_nonpublic.lo Polyhedron_public.lo \
 	Polyhedron_chdims.lo Polyhedron_widenings.lo C_Polyhedron.lo \
 	NNC_Polyhedron.lo Grid_nonpublic.lo Grid_public.lo \
 	Grid_chdims.lo Grid_widenings.lo BD_Shape.lo \
-	Polyhedra_Powerset.lo Row.lo Linear_Row.lo \
-	Saturation_Matrix.lo Saturation_Row.lo Ph_Status.lo \
-	Grid_Status.lo Variable.lo conversion.lo minimize.lo \
+	Octagonal_Shape.lo Pointset_Powerset.lo Row.lo Linear_Row.lo \
+	Bit_Matrix.lo Bit_Row.lo Ph_Status.lo Grid_Status.lo \
+	Variable.lo Variables_Set.lo conversion.lo minimize.lo \
 	simplify.lo Grid_conversion.lo Grid_simplify.lo globals.lo \
-	version.lo $(am__objects_2) $(am__objects_1)
+	mp_std_bits.lo version.lo $(am__objects_2) $(am__objects_1)
 libppl_la_OBJECTS = $(am_libppl_la_OBJECTS)
+libppl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_la_LDFLAGS) $(LDFLAGS) -o $@
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
 am_ppl_config_OBJECTS = ppl-config.$(OBJEXT) BUGS.$(OBJEXT) \
 	COPYING.$(OBJEXT) CREDITS.$(OBJEXT)
 ppl_config_OBJECTS = $(am_ppl_config_OBJECTS)
 ppl_config_DEPENDENCIES = libppl.la
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(libppl_la_SOURCES) $(ppl_config_SOURCES)
 DIST_SOURCES = $(am__libppl_la_SOURCES_DIST) $(ppl_config_SOURCES)
 includeHEADERS_INSTALL = $(INSTALL_HEADER)
@@ -265,39 +301,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -307,53 +322,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -362,56 +375,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -423,10 +410,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -435,26 +426,44 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-LIBPPL_LT_CURRENT = 6
+LIBPPL_LT_CURRENT = 7
 LIBPPL_LT_REVISION = 0
 LIBPPL_LT_AGE = 0
 AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src @extra_includes@
@@ -466,8 +475,7 @@ COPYING.cc \
 CREDITS.cc
 
 ppl_config_LDADD = \
-libppl.la \
- at extra_libraries@
+libppl.la
 
 @USE_CHECKED_INTEGERS_TRUE at COEFFICIENT_TYPES_INCLUDE_FILES = 
 @USE_GMP_INTEGERS_TRUE at COEFFICIENT_TYPES_INCLUDE_FILES = \
@@ -485,13 +493,25 @@ libppl.la \
 INCLUDE_FILES = \
 namespaces.hh \
 compiler.hh \
+meta_programming.hh \
+Slow_Copy.hh \
+Has_Assign_Or_Swap.hh \
+assign_or_swap.hh \
+mp_std_bits.defs.hh \
+mp_std_bits.inlines.hh \
+Temp.defs.hh \
+Temp.inlines.hh \
+Temp.templates.hh \
 Coefficient_traits_template.hh \
 Checked_Number.types.hh \
 $(COEFFICIENT_TYPES_INCLUDE_FILES) \
 Coefficient.types.hh \
 globals.types.hh \
+iterator_to_const.types.hh \
+distances.types.hh \
+Interval_Info.types.hh \
 Interval.types.hh \
-Bounding_Box.types.hh \
+Box.types.hh \
 Constraint.types.hh \
 Generator.types.hh \
 Grid_Generator.types.hh \
@@ -501,16 +521,17 @@ Row.types.hh \
 Linear_Row.types.hh \
 Matrix.types.hh \
 Variable.types.hh \
+Variables_Set.types.hh \
 Linear_Expression.types.hh \
 Linear_System.types.hh \
-Saturation_Row.types.hh \
-Saturation_Matrix.types.hh \
+Bit_Row.types.hh \
+Bit_Matrix.types.hh \
 Constraint_System.types.hh \
 Generator_System.types.hh \
 Grid_Generator_System.types.hh \
 Congruence_System.types.hh \
 Scalar_Products.types.hh \
-LP_Problem.types.hh \
+MIP_Problem.types.hh \
 Poly_Con_Relation.types.hh \
 Poly_Gen_Relation.types.hh \
 BHRZ03_Certificate.types.hh \
@@ -524,10 +545,12 @@ Ptr_Iterator.types.hh \
 DB_Row.types.hh \
 DB_Matrix.types.hh \
 BD_Shape.types.hh \
+OR_Matrix.types.hh \
+Octagonal_Shape.types.hh \
 fpu.types.hh \
 Float.defs.hh \
 Float.inlines.hh \
-Limits.hh \
+C_Integer.hh \
 fpu.defs.hh \
 fpu-c99.inlines.hh \
 fpu-ia32.inlines.hh \
@@ -547,20 +570,38 @@ checked_mpq.inlines.hh \
 checked_ext.inlines.hh \
 Checked_Number.defs.hh \
 Checked_Number.inlines.hh \
-mp_numeric_limits.hh \
+Checked_Number.templates.hh \
 checked_numeric_limits.hh \
 $(COEFFICIENT_DEFS_INCLUDE_FILES) \
 Coefficient.defs.hh \
 Coefficient.inlines.hh \
 globals.defs.hh \
 globals.inlines.hh \
+math_utilities.defs.hh \
+math_utilities.inlines.hh \
+iterator_to_const.defs.hh \
+iterator_to_const.inlines.hh \
+distances.defs.hh \
+distances.inlines.hh \
+Boundary.defs.hh \
+Interval_Info.defs.hh \
+Interval_Info.inlines.hh \
+Interval_Restriction.defs.hh \
 Interval.defs.hh \
 Interval.inlines.hh \
-Bounding_Box.defs.hh \
-Bounding_Box.inlines.hh \
+Interval.templates.hh \
+Box.defs.hh \
+Box_Status.inlines.hh \
+Box.inlines.hh \
+Box.templates.hh \
+Rational_Interval.hh \
+Rational_Box.hh \
 Variable.defs.hh \
 Variable.inlines.hh \
+Variables_Set.defs.hh \
+Variables_Set.inlines.hh \
 Init.defs.hh \
+Init.inlines.hh \
 initializer.hh \
 Topology.hh \
 Row.defs.hh \
@@ -569,12 +610,12 @@ Linear_Row.defs.hh \
 Linear_Row.inlines.hh \
 Matrix.defs.hh \
 Matrix.inlines.hh \
-Saturation_Row.defs.hh \
-Saturation_Row.inlines.hh \
+Bit_Row.defs.hh \
+Bit_Row.inlines.hh \
 Linear_System.defs.hh \
 Linear_System.inlines.hh \
-Saturation_Matrix.defs.hh \
-Saturation_Matrix.inlines.hh \
+Bit_Matrix.defs.hh \
+Bit_Matrix.inlines.hh \
 Constraint_System.defs.hh \
 Generator_System.defs.hh \
 Grid_Generator_System.defs.hh \
@@ -586,8 +627,8 @@ Constraint.inlines.hh \
 Constraint_System.inlines.hh \
 Generator.defs.hh \
 Generator.inlines.hh \
-Grid_Generator.inlines.hh \
 Grid_Generator.defs.hh \
+Grid_Generator.inlines.hh \
 Congruence.defs.hh \
 Congruence.inlines.hh \
 Generator_System.inlines.hh \
@@ -595,8 +636,9 @@ Grid_Generator_System.inlines.hh \
 Congruence_System.inlines.hh \
 Scalar_Products.defs.hh \
 Scalar_Products.inlines.hh \
-LP_Problem.defs.hh \
-LP_Problem.inlines.hh \
+MIP_Problem.defs.hh \
+MIP_Problem.inlines.hh \
+MIP_Problem.templates.hh \
 Poly_Con_Relation.defs.hh \
 Poly_Con_Relation.inlines.hh \
 Poly_Gen_Relation.defs.hh \
@@ -626,12 +668,21 @@ Ptr_Iterator.defs.hh \
 Ptr_Iterator.inlines.hh \
 DB_Row.defs.hh \
 DB_Row.inlines.hh \
+DB_Row.templates.hh \
 DB_Matrix.defs.hh \
 DB_Matrix.inlines.hh \
+DB_Matrix.templates.hh \
 BD_Shape.defs.hh \
 BDS_Status.inlines.hh \
 BD_Shape.inlines.hh \
 BD_Shape.templates.hh \
+OR_Matrix.defs.hh \
+OR_Matrix.inlines.hh \
+OR_Matrix.templates.hh \
+Octagonal_Shape.defs.hh \
+Og_Status.inlines.hh \
+Octagonal_Shape.inlines.hh \
+Octagonal_Shape.templates.hh \
 Determinate.types.hh \
 Determinate.defs.hh \
 Determinate.inlines.hh \
@@ -639,23 +690,41 @@ Powerset.types.hh \
 Powerset.defs.hh \
 Powerset.inlines.hh \
 Powerset.templates.hh \
-Polyhedra_Powerset.types.hh \
-Polyhedra_Powerset.defs.hh \
-Polyhedra_Powerset.inlines.hh \
-Polyhedra_Powerset.templates.hh \
+Pointset_Powerset.types.hh \
+Pointset_Powerset.defs.hh \
+Pointset_Powerset.inlines.hh \
+Pointset_Powerset.templates.hh \
+Partially_Reduced_Product.types.hh \
+Partially_Reduced_Product.defs.hh \
+Partially_Reduced_Product.inlines.hh \
+Partially_Reduced_Product.templates.hh \
+Any_Pointset.types.hh \
+Any_Pointset.defs.hh \
+Any_Pointset.inlines.hh \
 max_space_dimension.hh \
 algorithms.hh
 
+#Ask_Tell.types.hh \
+#Ask_Tell.defs.hh \
+#Ask_Tell.inlines.hh \
+#Ask_Tell.templates.hh \
+#Pointset_Ask_Tell.types.hh \
+#Pointset_Ask_Tell.defs.hh \
+#Pointset_Ask_Tell.inlines.hh \
+#Pointset_Ask_Tell.templates.hh
 NESTED_INCLUDE_FILES = \
 Ph_Status.idefs.hh \
 Grid_Status.idefs.hh \
-BDS_Status.idefs.hh
+Box_Status.idefs.hh \
+BDS_Status.idefs.hh \
+Og_Status.idefs.hh
 
 libppl_la_SOURCES = \
-Bounding_Box.cc \
+Box.cc \
 checked.cc \
 Checked_Number.cc \
 Float.cc \
+fpu-ia32.cc \
 Constraint.cc \
 Constraint_System.cc \
 Congruence.cc \
@@ -666,12 +735,11 @@ Generator.cc \
 Grid_Generator.cc \
 Init.cc \
 Coefficient.cc \
-Interval.cc \
 Linear_Expression.cc \
 Linear_System.cc \
 Matrix.cc \
 Scalar_Products.cc \
-LP_Problem.cc \
+MIP_Problem.cc \
 Poly_Con_Relation.cc \
 Poly_Gen_Relation.cc \
 BHRZ03_Certificate.cc \
@@ -688,27 +756,31 @@ Grid_public.cc \
 Grid_chdims.cc \
 Grid_widenings.cc \
 BD_Shape.cc \
-Polyhedra_Powerset.cc \
+Octagonal_Shape.cc \
+Pointset_Powerset.cc \
 Row.cc \
 Linear_Row.cc \
-Saturation_Matrix.cc \
-Saturation_Row.cc \
+Bit_Matrix.cc \
+Bit_Row.cc \
 Ph_Status.cc \
 Grid_Status.cc \
 Variable.cc \
+Variables_Set.cc \
 conversion.cc \
 minimize.cc \
 simplify.cc \
 Grid_conversion.cc \
 Grid_simplify.cc \
 globals.cc \
+mp_std_bits.cc \
 version.cc \
 $(INCLUDE_FILES) \
 $(NESTED_INCLUDE_FILES) \
 swapping_sort.icc
 
+#Pointset_Ask_Tell.cc
 @NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
- at NO_UNDEFINED_TRUE@libppl_la_LIBADD = @extra_libraries@
+libppl_la_LIBADD = @extra_libraries@
 libppl_la_LDFLAGS = \
 $(NO_UNDEFINED_FLAG) \
 -version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
@@ -767,21 +839,21 @@ ppl-config.cc: $(top_builddir)/config.status $(srcdir)/ppl-config.cc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
 	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
 	  if test -f $$p; then \
 	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
 	  else :; fi; \
 	done
 
 uninstall-libLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
 	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
 	done
 
 clean-libLTLIBRARIES:
@@ -793,18 +865,18 @@ clean-libLTLIBRARIES:
 	  rm -f "$${dir}/so_locations"; \
 	done
 libppl.la: $(libppl_la_OBJECTS) $(libppl_la_DEPENDENCIES) 
-	$(CXXLINK) -rpath $(libdir) $(libppl_la_LDFLAGS) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS)
+	$(libppl_la_LINK) -rpath $(libdir) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS)
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
 	@list='$(bin_PROGRAMS)'; for p in $$list; do \
 	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
 	  if test -f $$p \
 	     || test -f $$p1 \
 	  ; then \
 	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
 	  else :; fi; \
 	done
 
@@ -824,7 +896,7 @@ clean-binPROGRAMS:
 	done
 ppl-config$(EXEEXT): $(ppl_config_OBJECTS) $(ppl_config_DEPENDENCIES) 
 	@rm -f ppl-config$(EXEEXT)
-	$(CXXLINK) $(ppl_config_LDFLAGS) $(ppl_config_OBJECTS) $(ppl_config_LDADD) $(LIBS)
+	$(CXXLINK) $(ppl_config_OBJECTS) $(ppl_config_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -835,7 +907,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BD_Shape.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BHRZ03_Certificate.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BUGS.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bounding_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bit_Matrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bit_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Box.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/COPYING.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CREDITS.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/C_Polyhedron.Plo at am__quote@
@@ -860,51 +934,52 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_widenings.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H79_Certificate.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Init.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Interval.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/LP_Problem.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Row.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/MIP_Problem.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Matrix.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Octagonal_Shape.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Ph_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pointset_Powerset.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Con_Relation.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Gen_Relation.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedra_Powerset.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_chdims.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_nonpublic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_public.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_widenings.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Row.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Saturation_Matrix.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Saturation_Row.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Scalar_Products.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variable.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variables_Set.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/checked.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/conversion.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fpu-ia32.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/globals.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minimize.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mp_std_bits.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl-config.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplify.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/version.Plo at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -914,13 +989,9 @@ mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
 install-includeHEADERS: $(include_HEADERS)
 	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
 	@list='$(include_HEADERS)'; for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  f=$(am__strip_dir) \
@@ -941,8 +1012,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -954,8 +1025,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -965,13 +1036,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -985,22 +1055,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -1022,7 +1091,7 @@ install-binPROGRAMS: install-libLTLIBRARIES
 
 installdirs:
 	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) install-am
@@ -1060,7 +1129,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -1074,12 +1143,20 @@ info-am:
 
 install-data-am: install-includeHEADERS
 
+install-dvi: install-dvi-am
+
 install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -1101,22 +1178,25 @@ ps: ps-am
 ps-am:
 
 uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
-	uninstall-info-am uninstall-libLTLIBRARIES
+	uninstall-libLTLIBRARIES
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
 	clean-generic clean-libLTLIBRARIES clean-libtool ctags \
 	dist-hook distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-binPROGRAMS \
-	install-data install-data-am install-exec install-exec-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
 	install-includeHEADERS install-info install-info-am \
-	install-libLTLIBRARIES install-man install-strip installcheck \
+	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-includeHEADERS uninstall-info-am \
-	uninstall-libLTLIBRARIES
+	uninstall-includeHEADERS uninstall-libLTLIBRARIES
 
 
 ppl_include_files.hh: $(INCLUDE_FILES) Makefile
diff --git a/src/Matrix.cc b/src/Matrix.cc
index 77e97a2..399af35 100644
--- a/src/Matrix.cc
+++ b/src/Matrix.cc
@@ -1,11 +1,11 @@
 /* Matrix class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Matrix.defs.hh"
 #include "Row.defs.hh"
@@ -293,7 +293,7 @@ PPL::Matrix::ascii_dump(std::ostream& s) const {
     x[i].ascii_dump(s);
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Matrix);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Matrix)
 
 bool
 PPL::Matrix::ascii_load(std::istream& s) {
@@ -314,7 +314,7 @@ PPL::Matrix::ascii_load(std::istream& s) {
     if (!x[row].ascii_load(s))
       return false;
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
diff --git a/src/Matrix.defs.hh b/src/Matrix.defs.hh
index bb6ce48..8e17a38 100644
--- a/src/Matrix.defs.hh
+++ b/src/Matrix.defs.hh
@@ -1,11 +1,11 @@
 /* Matrix class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -40,7 +40,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   to the number of columns of the matrix), are also bound to have the
   same capacity.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 class Parma_Polyhedra_Library::Matrix {
 public:
@@ -86,7 +86,7 @@ public:
     A const_iterator is used to provide read-only access
     to each row contained in a Matrix object.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   class const_iterator {
   private:
     typedef std::vector<Row>::const_iterator Iter;
@@ -140,6 +140,17 @@ public:
     bool operator!=(const const_iterator& y) const;
   };
 
+  //! Returns <CODE>true</CODE> if and only if \p *this has no rows.
+  /*!
+    \note
+    The unusual naming for this method is \em intentional:
+    we do not want it to be named \c empty because this would cause
+    an error prone name clash with the corresponding methods in derived
+    classes Constraint_System and Congruence_System (which have a
+    different semantics).
+  */
+  bool has_no_rows() const;
+
   /*! \brief
     Returns the const_iterator pointing to the first row, if \p *this is
     not empty; otherwise, returns the past-the-end const_iterator.
@@ -173,7 +184,7 @@ public:
     Flags for the newly added rows.
 
     Turns the \f$r \times c\f$ matrix \f$M\f$ into
-    the \f$(r+n) \times c\f$ matrix \f$M \choose 0\f$.
+    the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
     The matrix is expanded avoiding reallocation whenever possible.
   */
   void add_zero_rows(dimension_type n, Row::Flags row_flags);
@@ -202,7 +213,7 @@ public:
 
     Turns the \f$r \times c\f$ matrix \f$M\f$ into
     the \f$(r+n) \times (c+m)\f$ matrix
-    \f$\bigl({M \atop 0}{0 \atop 0}\bigr)\f$.
+    \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$.
     The matrix is expanded avoiding reallocation whenever possible.
   */
   void add_zero_rows_and_columns(dimension_type n, dimension_type m,
@@ -216,7 +227,7 @@ public:
 
     Turns the \f$r \times c\f$ matrix \f$M\f$ into
     the \f$(r+1) \times c\f$ matrix
-    \f$\bigl({M \atop 0}\bigr)\f$.
+    \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
     The matrix is expanded avoiding reallocation whenever possible.
   */
   void add_row(const Row& y);
@@ -229,7 +240,7 @@ public:
 
     Turns the \f$r \times c\f$ matrix \f$M\f$ into
     the \f$(r+1) \times c\f$ matrix
-    \f$\bigl({M \atop 0}\bigr)\f$.
+    \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
     The matrix is expanded avoiding reallocation whenever possible.
   */
   void add_recycled_row(Row& y);
@@ -298,12 +309,12 @@ public:
   //! Clears the matrix deallocating all its rows.
   void clear();
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
 
@@ -328,7 +339,7 @@ namespace std {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   //! Specializes <CODE>std::swap</CODE>.
   /*! \relates Parma_Polyhedra_Library::Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void swap(Parma_Polyhedra_Library::Matrix& x,
 	  Parma_Polyhedra_Library::Matrix& y);
 
@@ -340,13 +351,13 @@ namespace Parma_Polyhedra_Library {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
 /*! \relates Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 bool operator==(const Matrix& x, const Matrix& y);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
 /*! \relates Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 bool operator!=(const Matrix& x, const Matrix& y);
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Matrix.inlines.hh b/src/Matrix.inlines.hh
index 1eeb38c..ea81727 100644
--- a/src/Matrix.inlines.hh
+++ b/src/Matrix.inlines.hh
@@ -1,11 +1,11 @@
 /* Matrix class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -96,6 +96,11 @@ Matrix::const_iterator::operator!=(const const_iterator& y) const {
   return !operator==(y);
 }
 
+inline bool
+Matrix::has_no_rows() const {
+  return rows.empty();
+}
+
 inline Matrix::const_iterator
 Matrix::begin() const {
   return const_iterator(rows.begin());
diff --git a/src/Matrix.types.hh b/src/Matrix.types.hh
index 0871cc9..3a38a6a 100644
--- a/src/Matrix.types.hh
+++ b/src/Matrix.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/NNC_Polyhedron.cc b/src/NNC_Polyhedron.cc
index 6106113..b2ce323 100644
--- a/src/NNC_Polyhedron.cc
+++ b/src/NNC_Polyhedron.cc
@@ -1,11 +1,11 @@
 /* NNC_Polyhedron class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,15 +20,16 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "NNC_Polyhedron.defs.hh"
 #include "C_Polyhedron.defs.hh"
+#include "Grid.defs.hh"
 #include "algorithms.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
 
-PPL::NNC_Polyhedron::NNC_Polyhedron(const C_Polyhedron& y)
+PPL::NNC_Polyhedron::NNC_Polyhedron(const C_Polyhedron& y, Complexity_Class)
   : Polyhedron(NOT_NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
   add_constraints(y.constraints());
   assert(OK());
@@ -45,19 +46,35 @@ PPL::NNC_Polyhedron::NNC_Polyhedron(const Congruence_System& cgs)
 						 "space dimension"), 0),
 	       UNIVERSE) {
   add_congruences(cgs);
+  assert(OK());
 }
 
-PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs)
+PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs, Recycle_Input)
   : Polyhedron(NOT_NECESSARILY_CLOSED,
 	       cgs.space_dimension() <= max_space_dimension()
 	       ? cgs.space_dimension()
 	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(cgs)",
+						 "NNC_Polyhedron"
+						 "(cgs, recycle)",
 						 "the space dimension of cgs "
 						 "exceeds the maximum allowed "
 						 "space dimension"), 0),
 	       UNIVERSE) {
   add_congruences(cgs);
+  assert(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Grid& grid, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       grid.space_dimension() <= max_space_dimension()
+	       ? grid.space_dimension()
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "C_Polyhedron(grid)",
+						 "the space dimension of grid "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+	       UNIVERSE) {
+  add_constraints(grid.constraints());
 }
 
 bool
diff --git a/src/NNC_Polyhedron.defs.hh b/src/NNC_Polyhedron.defs.hh
index f2f1a15..f08b414 100644
--- a/src/NNC_Polyhedron.defs.hh
+++ b/src/NNC_Polyhedron.defs.hh
@@ -1,11 +1,11 @@
 /* NNC_Polyhedron class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,6 +26,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "C_Polyhedron.types.hh"
 #include "NNC_Polyhedron.types.hh"
 #include "Polyhedron.defs.hh"
+#include "Grid.types.hh"
 
 //! A not necessarily closed convex polyhedron.
 /*! \ingroup PPL_CXX_interface
@@ -75,10 +76,14 @@ public:
 
     \param cs
     The system of constraints defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
   */
-  explicit NNC_Polyhedron(Constraint_System& cs);
+  NNC_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
 
   //! Builds an NNC polyhedron from a system of generators.
   /*!
@@ -98,13 +103,17 @@ public:
 
     \param gs
     The system of generators defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
 
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
     \exception std::invalid_argument
     Thrown if the system of generators is not empty but has no points.
   */
-  explicit NNC_Polyhedron(Generator_System& gs);
+  NNC_Polyhedron(Generator_System& gs, Recycle_Input dummy);
 
   //! Builds an NNC polyhedron from a system of congruences.
   /*!
@@ -112,7 +121,7 @@ public:
 
     \param cgs
     The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
   */
   explicit NNC_Polyhedron(const Congruence_System& cgs);
@@ -124,37 +133,96 @@ public:
 
     \param cgs
     The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
   */
-  explicit NNC_Polyhedron(Congruence_System& cgs);
+  NNC_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
 
   //! Builds an NNC polyhedron from the C polyhedron \p y.
-  explicit NNC_Polyhedron(const C_Polyhedron& y);
+  /*!
+    \param y
+    The C polyhedron to be used;
 
-  //! Builds an NNC polyhedron out of a generic, interval-based bounding box.
+    \param complexity
+    This argument is ignored.
+  */
+  explicit NNC_Polyhedron(const C_Polyhedron& y,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an NNC polyhedron out of a box.
   /*!
-    For a description of the methods that should be provided by
-    the template class Box, see the documentation of the protected method:
-      template \<typename Box\>
-      Polyhedron::Polyhedron(Topology topol, const Box& box);
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
 
     \param box
-    The bounding box representing the polyhedron to be built;
+    The box representing the polyhedron to be built;
 
-    \param dummy
-    A dummy tag to syntactically differentiate this one from the other
-    constructors.
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
     \exception std::length_error
     Thrown if the space dimension of \p box exceeds the maximum allowed
     space dimension.
   */
-  template <typename Box>
-  NNC_Polyhedron(const Box& box, From_Bounding_Box dummy);
+  template <typename Interval>
+  explicit NNC_Polyhedron(const Box<Interval>& box,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an NNC polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
+
+    \param grid
+    The grid used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit NNC_Polyhedron(const Grid& grid,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a NNC polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BD shape
+    and is the most precise that includes the BD shape.
+
+    \param bd
+    The BD shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const BD_Shape<U>& bd,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a NNC polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const Octagonal_Shape<U>& os,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
 
   //! Ordinary copy-constructor.
-  NNC_Polyhedron(const NNC_Polyhedron& y);
+  NNC_Polyhedron(const NNC_Polyhedron& y,
+                 Complexity_Class complexity = ANY_COMPLEXITY);
 
   /*! \brief
     The assignment operator.
diff --git a/src/NNC_Polyhedron.inlines.hh b/src/NNC_Polyhedron.inlines.hh
index 7c27be6..3e6ff5c 100644
--- a/src/NNC_Polyhedron.inlines.hh
+++ b/src/NNC_Polyhedron.inlines.hh
@@ -1,11 +1,11 @@
 /* NNC_Polyhedron class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,6 +28,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace Parma_Polyhedra_Library {
 
 inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline
 NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
 			       Degenerate_Element kind)
   : Polyhedron(NOT_NECESSARILY_CLOSED,
@@ -54,15 +58,16 @@ NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
 }
 
 inline
-NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs)
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input)
   : Polyhedron(NOT_NECESSARILY_CLOSED,
 	       cs.space_dimension() <= max_space_dimension()
 	       ? cs
 	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(cs)",
+						 "NNC_Polyhedron(cs, recycle)",
 						 "the space dimension of cs "
 						 "exceeds the maximum allowed "
-						 "space dimension"), cs)) {
+						 "space dimension"), cs),
+	       Recycle_Input()) {
 }
 
 inline
@@ -78,20 +83,21 @@ NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
 }
 
 inline
-NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs)
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input)
   : Polyhedron(NOT_NECESSARILY_CLOSED,
 	       gs.space_dimension() <= max_space_dimension()
 	       ? gs
 	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(gs)",
+						 "NNC_Polyhedron(gs, recycle)",
 						 "the space dimension of gs "
 						 "exceeds the maximum allowed "
-						 "space dimension"), gs)) {
+						 "space dimension"), gs),
+	       Recycle_Input()) {
 }
 
-template <typename Box>
+template <typename Interval>
 inline
-NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
+NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>& box, Complexity_Class)
   : Polyhedron(NOT_NECESSARILY_CLOSED,
 	       box.space_dimension() <= max_space_dimension()
 	       ? box
@@ -102,8 +108,38 @@ NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
 						 "space dimension"), box)) {
 }
 
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       bd.space_dimension() <= max_space_dimension()
+	       ? bd.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(bd): ",
+						 "the space dimension of bd "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
+
+template <typename U>
 inline
-NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y)
+NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       os.space_dimension() <= max_space_dimension()
+	       ? os.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(os): ",
+						 "the space dimension of os "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(os.constraints());
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
   : Polyhedron(y) {
 }
 
@@ -120,10 +156,6 @@ NNC_Polyhedron::operator=(const C_Polyhedron& y) {
   return *this;
 }
 
-inline
-NNC_Polyhedron::~NNC_Polyhedron() {
-}
-
 inline bool
 NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
   return poly_hull_assign_if_exact(y);
diff --git a/src/NNC_Polyhedron.types.hh b/src/NNC_Polyhedron.types.hh
index cd415c5..0775962 100644
--- a/src/NNC_Polyhedron.types.hh
+++ b/src/NNC_Polyhedron.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Numeric_Format.defs.hh b/src/Numeric_Format.defs.hh
index fc84c3b..574f6cb 100644
--- a/src/Numeric_Format.defs.hh
+++ b/src/Numeric_Format.defs.hh
@@ -1,11 +1,11 @@
 /* Numeric format.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/OR_Matrix.defs.hh b/src/OR_Matrix.defs.hh
new file mode 100644
index 0000000..df71301
--- /dev/null
+++ b/src/OR_Matrix.defs.hh
@@ -0,0 +1,589 @@
+/* OR_Matrix class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .  */
+
+#ifndef PPL_OR_Matrix_defs_hh
+#define PPL_OR_Matrix_defs_hh 1
+
+#include "globals.defs.hh"
+#include "Ptr_Iterator.defs.hh"
+#include "OR_Matrix.types.hh"
+#include "DB_Row.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <cstddef>
+#include <iosfwd>
+
+#ifndef PPL_OR_MATRIX_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When PPL_OR_MATRIX_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each
+  instance of the class OR_Matrix::Pseudo_Row carries its own size;
+  this enables extra consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_OR_MATRIX_EXTRA_DEBUG)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const OR_Matrix<T>& m);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix representing octagonal constraints.
+/*!
+  An OR_Matrix object is a DB_Row object that allows
+  the representation of a \em pseudo-triangular matrix,
+  like the following:
+
+<PRE>
+         _ _
+   0    |_|_|
+   1    |_|_|_ _
+   2    |_|_|_|_|
+   3    |_|_|_|_|_ _
+   4    |_|_|_|_|_|_|
+   5    |_|_|_|_|_|_|
+         . . .
+         _ _ _ _ _ _       _
+ 2n-2   |_|_|_|_|_|_| ... |_|
+ 2n-1   |_|_|_|_|_|_| ... |_|
+         0 1 2 3 4 5  ... 2n-1
+
+</PRE>
+
+  It is characterized by parameter n that defines the structure,
+  and such that there are 2*n rows (and 2*n columns).
+  It provides row_iterators for the access to the rows
+  and element_iterators for the access to the elements.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+template <typename T>
+class Parma_Polyhedra_Library::OR_Matrix {
+private:
+  /*! \brief
+    An object that behaves like a matrix's row with respect to
+    the subscript operators.
+  */
+  template <typename U>
+  class Pseudo_Row {
+  public:
+    /*! \brief
+      Copy-constructor allowing the construction of a const pseudo-row
+      from a non-const pseudo-row.
+      Ordinary copy constructor.
+    */
+    template <typename V>
+    Pseudo_Row(const Pseudo_Row<V>& y);
+
+    //! Destructor.
+    ~Pseudo_Row();
+
+    //! Subscript operator.
+    U& operator[](dimension_type k) const;
+
+    //! Default constructor: creates a past-the-end object.
+    Pseudo_Row();
+
+    //! Assignment operator.
+    Pseudo_Row& operator=(const Pseudo_Row& y);
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+  private:
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  public:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Private constructor for a Pseudo_Row with size \p s beginning at \p y.
+    Pseudo_Row(U& y, dimension_type s);
+
+#else // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Private constructor for a Pseudo_Row beginning at \p y.
+    explicit Pseudo_Row(U& y);
+
+#endif // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Holds a reference to the beginning of this row.
+    U* first;
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  private:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! The size of the row.
+    dimension_type size_;
+
+    //! Returns the size of the row.
+    dimension_type size() const;
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+    template <typename V> friend class Pseudo_Row;
+    template <typename V> friend class any_row_iterator;
+    friend class OR_Matrix;
+  }; // class Pseudo_Row
+
+public:
+  //! A (non const) reference to a matrix's row.
+  typedef Pseudo_Row<T> row_reference_type;
+
+  //! A const reference to a matrix's row.
+  typedef Pseudo_Row<const T> const_row_reference_type;
+
+private:
+  /*! \brief
+    A template class to derive both OR_Matrix::iterator
+    and OR_Matrix::const_iterator.
+  */
+  template <typename U>
+  class any_row_iterator {
+  public:
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Pseudo_Row<U> value_type;
+    typedef long difference_type;
+    typedef const Pseudo_Row<U>* pointer;
+    typedef const Pseudo_Row<U>& reference;
+
+    //! Constructor to build past-the-end objects.
+    any_row_iterator(dimension_type n_rows);
+
+    /*! \brief
+      Builds an iterator pointing at the beginning of an OR_Matrix whose
+      first element is \p base;
+    */
+    explicit any_row_iterator(U& base);
+
+    /*! \brief
+      Copy-constructor allowing the construction of a const_iterator
+      from a non-const iterator.
+    */
+    template <typename V>
+    any_row_iterator(const any_row_iterator<V>& y);
+
+    /*! \brief
+      Assignment operator allowing the assignment of a non-const iterator
+      to a const_iterator.
+    */
+    template <typename V>
+    any_row_iterator& operator=(const any_row_iterator<V>& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    any_row_iterator& operator++();
+
+    //! Postfix increment operator.
+    any_row_iterator operator++(int);
+
+    //! Prefix decrement operator.
+    any_row_iterator& operator--();
+
+    //! Postfix decrement operator.
+    any_row_iterator operator--(int);
+
+    //! Subscript operator.
+    reference operator[](difference_type m) const;
+
+    //! Assignment-increment operator.
+    any_row_iterator& operator+=(difference_type m);
+
+    //! Assignment-decrement operator.
+    any_row_iterator& operator-=(difference_type m);
+
+    //! Returns the difference between \p *this and \p y.
+    difference_type operator-(const any_row_iterator& y) const;
+
+    //! Returns the sum of \p *this and \p m.
+    any_row_iterator operator+(difference_type m) const;
+
+    //! Returns the difference of \p *this and \p m.
+    any_row_iterator operator-(difference_type m) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is equal to \p y.
+    bool operator==(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this
+      is different from \p y.
+    */
+    bool operator!=(const any_row_iterator& y) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is less than \p y.
+    bool operator<(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is less than
+      or equal to \p y.
+    */
+    bool operator<=(const any_row_iterator& y) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is greater than \p y.
+    bool operator>(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is greater than
+      or equal to \p y.
+    */
+    bool operator>=(const any_row_iterator& y) const;
+
+    dimension_type row_size() const;
+
+    dimension_type index() const;
+
+  private:
+    //! Represents the beginning of a row.
+    Pseudo_Row<U> value;
+
+    //! External index.
+    dimension_type e;
+
+    //! Internal index: <CODE>i = (e+1)*(e+1)/2</CODE>.
+    dimension_type i;
+
+    template <typename V> friend class any_row_iterator;
+  }; // class any_row_iterator
+
+public:
+  //! A (non const) row iterator.
+  typedef any_row_iterator<T> row_iterator;
+
+  //! A const row iterator.
+  typedef any_row_iterator<const T> const_row_iterator;
+
+  //! A (non const) element iterator.
+  typedef typename DB_Row<T>::iterator element_iterator;
+
+  //! A const element iterator.
+  typedef typename DB_Row<T>::const_iterator const_element_iterator;
+
+public:
+  //! Returns the maximum number of rows of a OR_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Builds a matrix with specified dimensions.
+  /*!
+    \param space_dim
+    The space dimension of the matrix that will be created.
+
+    This constructor creates a matrix with \p 2*space_dim rows.
+    Each element is initialized to plus infinity.
+  */
+  OR_Matrix(dimension_type space_dim);
+
+  //! Copy-constructor.
+  OR_Matrix(const OR_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit OR_Matrix(const OR_Matrix<U>& y);
+
+  //! Destructor.
+  ~OR_Matrix();
+
+  //! Assignment operator.
+  OR_Matrix& operator=(const OR_Matrix& y);
+
+private:
+  template <typename U> friend class OR_Matrix;
+
+  //! Contains the rows of the matrix.
+  /*!
+    A DB_Row which contains the rows of the OR_Matrix
+    inserting each successive row to the end of the vec.
+    To contain all the elements of OR_Matrix the size of the DB_Row
+    is 2*n*(n+1), where the n is the characteristic parameter of
+    OR_Matrix.
+  */
+  DB_Row<T> vec;
+
+  //! Contains the dimension of the space of the matrix.
+  dimension_type space_dim;
+
+  //! Contains the capacity of \p vec.
+  dimension_type vec_capacity;
+
+  //! Private and not implemented: default construction is not allowed.
+  OR_Matrix();
+
+  /*! \brief
+    Returns the index into <CODE>vec</CODE> of the first element
+    of the row of index \p k.
+  */
+  static dimension_type row_first_element_index(dimension_type k);
+
+public:
+  //! Returns the size of the row of index \p k.
+  static dimension_type row_size(dimension_type k);
+
+  //! Swaps \p *this with \p y.
+  void swap(OR_Matrix& y);
+
+
+  //! Makes the matrix grow by adding more space dimensions.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Adds new rows of right dimension to the end if
+    there is enough capacity; otherwise, creates a new matrix,
+    with the specified dimension, copying the old elements
+    in the upper part of the new matrix, which is
+    then assigned to \p *this.
+    Each new element is initialized to plus infinity.
+  */
+  void grow(dimension_type new_dim);
+
+  //! Makes the matrix shrink by removing the last space dimensions.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Erases from matrix to the end the rows with index
+    greater than 2*new_dim-1.
+  */
+  void shrink(dimension_type new_dim);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    If the new dimension is greater than the old one, it adds new rows
+    of right dimension to the end if there is enough capacity; otherwise,
+    it creates a new matrix, with the specified dimension, which is
+    then assigned to \p *this.
+    If the new dimension is less than the old one, it erase from the matrix
+    the rows having index greater than 2*new_dim-1
+  */
+  void resize_no_copy(dimension_type new_dim);
+
+  //! Returns the space-dimension of the matrix.
+  dimension_type space_dimension() const;
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  row_reference_type operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const_row_reference_type operator[](dimension_type k) const;
+  //@}
+
+
+  /*! \brief
+    Returns an iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  row_iterator row_begin();
+
+  //! Returns the past-the-end const_iterator.
+  row_iterator row_end();
+
+  /*! \brief
+    Returns a const row iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_row_iterator row_begin() const;
+
+  //! Returns the past-the-end const row iterator.
+  const_row_iterator row_end() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  element_iterator element_begin();
+
+  //! Returns the past-the-end const_iterator.
+  element_iterator element_end();
+
+  /*! \brief
+    Returns a const element iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_element_iterator element_begin() const;
+
+  //! Returns the past-the-end const element iterator.
+  const_element_iterator element_end() const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  friend bool operator==<T>(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Parma_Polyhedra_Library::OR_Matrix<T>& x,
+	  Parma_Polyhedra_Library::OR_Matrix<T>& y);
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const OR_Matrix<T>& x,
+				 const OR_Matrix<T>& y,
+				 Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const OR_Matrix<T>& x,
+			       const OR_Matrix<T>& y,
+			       Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const OR_Matrix<T>& x,
+				 const OR_Matrix<T>& y,
+				 Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "OR_Matrix.inlines.hh"
+#include "OR_Matrix.templates.hh"
+
+#endif // !defined(PPL_OR_Matrix_defs_hh)
diff --git a/src/OR_Matrix.inlines.hh b/src/OR_Matrix.inlines.hh
new file mode 100644
index 0000000..c1863cd
--- /dev/null
+++ b/src/OR_Matrix.inlines.hh
@@ -0,0 +1,716 @@
+/* OR_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_OR_Matrix_inlines_hh
+#define PPL_OR_Matrix_inlines_hh 1
+
+#include "globals.defs.hh"
+#include "Checked_Number.defs.hh"
+#include "C_Polyhedron.defs.hh"
+#include "distances.defs.hh"
+#include <cassert>
+#include <algorithm>
+#include "checked.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_first_element_index(const dimension_type k) {
+  return ((k+1)*(k+1))/2;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_size(const dimension_type k) {
+  return (k+2) & ~dimension_type(1);
+}
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::Pseudo_Row<U>::size() const {
+  return size_;
+}
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row()
+  : first(0)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(0)
+#endif
+{
+  // FIXME: is zeroing necessary/wanted?
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(U& y
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+		, dimension_type s
+#endif
+		)
+  : first(&y)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(s)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(const Pseudo_Row<V>& y)
+  : first(y.first)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    , size_(y.size_)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline OR_Matrix<T>::Pseudo_Row<U>&
+OR_Matrix<T>::Pseudo_Row<U>::operator=(const Pseudo_Row& y) {
+  first = y.first;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  size_ = y.size_;
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::~Pseudo_Row() {
+}
+
+template <typename T>
+template <typename U>
+inline U&
+OR_Matrix<T>::Pseudo_Row<U>::operator[](const dimension_type k) const {
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  assert(k < size_);
+#endif
+  return *(first + k);
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const dimension_type n_rows)
+#if 0
+  : e(n_rows)
+#else
+  : value(),
+    e(n_rows),
+    // This zeroing will just silence an annoying compiler warning.
+    i(0)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>::any_row_iterator(U& base)
+  :  value(base
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+	   , OR_Matrix<T>::row_size(0)
+#endif
+	   ),
+     e(0),
+     i(0) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const any_row_iterator<V>& y)
+  : value(y.value),
+    e(y.e),
+    i(y.i) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator=(const any_row_iterator<V>& y) {
+  value = y.value;
+  e = y.e;
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::reference
+OR_Matrix<T>::any_row_iterator<U>::operator*() const {
+  return value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::pointer
+OR_Matrix<T>::any_row_iterator<U>::operator->() const {
+  return &value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator++() {
+  ++e;
+  dimension_type increment = e;
+  if (e % 2) {
+    ++increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    value.size_ += 2;
+#endif
+  }
+  i += increment;
+  value.first += increment;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator++(int) {
+  any_row_iterator old = *this;
+  ++(*this);
+  return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator--() {
+  dimension_type decrement = e + 1;
+  --e;
+  if (e % 2) {
+    ++decrement;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    value.size_ -= 2;
+#endif
+  }
+  i -= decrement;
+  value.first -= decrement;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator--(int) {
+  any_row_iterator old = *this;
+  --(*this);
+  return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator+=(difference_type m) {
+  difference_type increment = m + m*m/2 + m*e;
+  if (e%2 == 0 && m%2 == 1)
+    ++increment;
+  e += m;
+  i += increment;
+  value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  // FIXME!!!
+  value.size_ = OR_Matrix::row_size(e);
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator-=(difference_type m) {
+  return *this += -m;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::difference_type
+OR_Matrix<T>::any_row_iterator<U>::operator-(const any_row_iterator& y) const {
+  return e - y.e;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator+(difference_type m) const {
+  any_row_iterator r = *this;
+  r += m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator-(const difference_type m) const {
+  any_row_iterator r = *this;
+  r -= m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator==(const any_row_iterator& y) const {
+  return e == y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator!=(const any_row_iterator& y) const {
+  return e != y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator<(const any_row_iterator& y) const {
+  return e < y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator<=(const any_row_iterator& y) const {
+  return e <= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator>(const any_row_iterator& y) const {
+  return e > y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator>=(const any_row_iterator& y) const {
+  return e >= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::row_size() const {
+  return (e+2) & ~dimension_type(1);
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::index() const {
+  return e;
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_begin() {
+  return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_end() {
+  return row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_begin() const {
+  return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_end() const {
+  return const_row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_begin() {
+  return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_end() {
+  return vec.end();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_begin() const {
+  return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_end() const {
+  return vec.end();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::swap(OR_Matrix& y) {
+  std::swap(vec, y.vec);
+  std::swap(space_dim, y.space_dim);
+  std::swap(vec_capacity, y.vec_capacity);
+}
+
+//! Returns the integer square root of \p x.
+inline unsigned long
+isqrt(unsigned long x) {
+  unsigned long r = 0;
+  for (unsigned long t = 0x40000000; t; t >>= 2) {
+    unsigned long s = r + t;
+    if (s <= x) {
+      x -= s;
+      r = s + t;
+    }
+    r >>= 1;
+  }
+  return r;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::max_num_rows() {
+  // Compute the maximum number of rows that
+  // are contained in a DB_Row that allocates
+  // a pseudo-triangular matrix.
+  dimension_type k = isqrt(2*DB_Row<T>::max_size() + 1);
+  return (k-1) & ~dimension_type(1);
+}
+
+template <typename T>
+inline memory_size_type
+OR_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const dimension_type dim)
+  : vec(2*dim*(dim+1)),
+    space_dim(dim),
+    vec_capacity(vec.size()) {
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::~OR_Matrix() {
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) {
+  return row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+			    , row_size(k)
+#endif
+			    );
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) const {
+  return const_row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+				  , row_size(k)
+#endif
+				  );
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::num_rows() const {
+  return 2*space_dimension();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::clear() {
+  OR_Matrix<T>(0).swap(*this);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return x.space_dim == y.space_dim && x.vec == y.vec;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix& y)
+  : vec(y.vec),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix<U>& y)
+  : vec(),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size())) {
+  vec.construct_upward_approximation(y.vec, vec_capacity);
+  assert(OK());
+}
+
+template <typename T>
+inline OR_Matrix<T>&
+OR_Matrix<T>::operator=(const OR_Matrix& y) {
+  vec = y.vec;
+  space_dim = y.space_dim;
+  vec_capacity = compute_capacity(y.vec.size());
+  return *this;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::grow(const dimension_type new_dim) {
+  assert(new_dim >= space_dim);
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      element_iterator j = new_matrix.element_begin();
+      for (element_iterator i = element_begin(),
+	     mend = element_end(); i != mend; ++i, ++j)
+	assign_or_swap(*j, *i);
+      swap(new_matrix);
+    }
+  }
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::shrink(const dimension_type new_dim) {
+  assert(new_dim <= space_dim);
+  const dimension_type new_size = 2*new_dim*(new_dim + 1);
+  vec.shrink(new_size);
+  space_dim = new_dim;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::resize_no_copy(const dimension_type new_dim) {
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      swap(new_matrix);
+    }
+  }
+  else if (new_dim < space_dim)
+    shrink(new_dim);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const OR_Matrix<T>& x,
+		    const OR_Matrix<T>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (typename OR_Matrix<T>::const_element_iterator
+	 i = x.element_begin(), j = y.element_begin(),
+	 mat_end = x.element_end(); i != mat_end; ++i, ++j) {
+    const T& x_i = *i;
+    const T& y_i = *j;
+    if (is_plus_infinity(x_i)) {
+      if (is_plus_infinity(y_i))
+	continue;
+      else {
+      pinf:
+	assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+	return true;
+      }
+    }
+    else if (is_plus_infinity(y_i))
+      goto pinf;
+
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+    if (x_i > y_i) {
+      maybe_assign(tmp1p, tmp1, x_i, dir);
+      maybe_assign(tmp2p, tmp2, y_i, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_i, dir);
+      maybe_assign(tmp2p, tmp2, x_i, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    assert(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const OR_Matrix<T>& x,
+			    const OR_Matrix<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+								    dir,
+								    tmp0,
+								    tmp1,
+								    tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const OR_Matrix<T>& x,
+			  const OR_Matrix<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+								  dir,
+								  tmp0,
+								  tmp1,
+								  tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const OR_Matrix<T>& x,
+			   const OR_Matrix<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+								   dir,
+								   tmp0,
+								   tmp1,
+								   tmp2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::OR_Matrix<T>& x,
+     Parma_Polyhedra_Library::OR_Matrix<T>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+
+#endif // !defined(PPL_OR_Matrix_inlines_hh)
diff --git a/src/OR_Matrix.templates.hh b/src/OR_Matrix.templates.hh
new file mode 100644
index 0000000..4f3a281
--- /dev/null
+++ b/src/OR_Matrix.templates.hh
@@ -0,0 +1,124 @@
+/* OR_Matrix class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_OR_Matrix_templates_hh
+#define PPL_OR_Matrix_templates_hh 1
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+memory_size_type
+OR_Matrix<T>::external_memory_in_bytes() const{
+  return vec.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+OR_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+  // The right number of cells should be in use.
+  const dimension_type dim = space_dimension();
+  if (vec.size() != 2*dim*(dim + 1)) {
+#ifndef NDEBUG
+    cerr << "OR_Matrix has a wrong number of cells:\n"
+	 << "vec.size() is " << vec.size()
+	 << ", expected size is " << 2*dim*(dim+1) << "!\n";
+#endif
+    return false;
+  }
+
+  // The underlying DB_Row should be OK.
+  if (!vec.OK(vec.size(), vec_capacity))
+    return false;
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+OR_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const OR_Matrix<T>& x = *this;
+  const char separator = ' ';
+  dimension_type space = x.space_dimension();
+  s << space << separator << "\n";
+  for (const_row_iterator i = x.row_begin(),
+	 x_row_end = x.row_end(); i != x_row_end; ++i) {
+    const_row_reference_type r = *i;
+    dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      using namespace IO_Operators;
+      s << r[j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, OR_Matrix<T>)
+
+template <typename T>
+bool
+OR_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type space;
+  if (!(s >> space))
+    return false;
+  resize_no_copy(space);
+  for (row_iterator i = row_begin(),
+	 this_row_end = row_end(); i != this_row_end; ++i) {
+    row_reference_type r_i = *i;
+    const dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      Result r = input(r_i[j], s, ROUND_UP);
+      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+      if (!s || r == V_CVT_STR_UNK)
+	return false;
+    }
+  }
+  assert(OK());
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const OR_Matrix<T>& m) {
+  for (typename OR_Matrix<T>::const_row_iterator m_iter = m.row_begin(),
+	 m_end = m.row_end(); m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<T>::const_row_reference_type r_m = *m_iter;
+    const dimension_type mr_size = m_iter.row_size();
+    for (dimension_type j = 0; j < mr_size; ++j)
+      s << r_m[j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_OR_Matrix_templates_hh)
diff --git a/src/OR_Matrix.types.hh b/src/OR_Matrix.types.hh
new file mode 100644
index 0000000..fa79217
--- /dev/null
+++ b/src/OR_Matrix.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_OR_Matrix_types_hh
+#define PPL_OR_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class OR_Matrix;
+
+}
+
+#endif // !defined(PPL_OR_Matrix_types_hh)
diff --git a/src/Octagonal_Shape.cc b/src/Octagonal_Shape.cc
new file mode 100644
index 0000000..b7eb0d8
--- /dev/null
+++ b/src/Octagonal_Shape.cc
@@ -0,0 +1,100 @@
+/* Octagonal_Shape class implementation (non-inline functions).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "Octagonal_Shape.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+PPL::extract_octagonal_difference(const Constraint& c,
+				  const dimension_type c_space_dim,
+				  dimension_type& c_num_vars,
+				  dimension_type& c_first_var,
+				  dimension_type& c_second_var,
+				  Coefficient& c_coeff,
+				  Coefficient& c_term) {
+  // Check for preconditions.
+  assert(c.space_dimension() == c_space_dim);
+  assert(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+  // Store the indices of the non-zero components of `c',
+  dimension_type non_zero_index[2] = { 0, 0 };
+  // Collect the non-zero components of `c'.
+  for (dimension_type i = c_space_dim; i-- > 0; )
+    if (c.coefficient(Variable(i)) != 0) {
+      if (c_num_vars <= 1)
+	non_zero_index[c_num_vars++] = i;
+      else
+	// Constraint `c' is not an octagonal difference.
+	return false;
+    }
+
+  // Make sure that `c' is indeed an octagonal difference,
+  // i.e., it has one of the following forms:
+  //           0           <=/= b, if c_num_vars == 0;
+  //   (+/-) a*x           <=/= b, if c_num_vars == 1;
+  //   (+/-) a*x (+/-) a*y <=/= b, if c_num_vars == 2.
+  c_term = c.inhomogeneous_term();
+  switch (c_num_vars) {
+  case 2:
+    {
+      const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0]));
+      const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1]));
+      if (c0 != c1 && c0 != -c1)
+	// Constraint `c' is not an octagonal difference.
+	return false;
+      c_first_var = non_zero_index[0];
+      c_second_var = non_zero_index[1];
+      c_first_var *= 2;
+      if (sgn(c0) < 0)
+	++c_first_var;
+      c_second_var *= 2;
+      if (sgn(c1) > 0)
+	++c_second_var;
+      c_coeff = c0;
+    }
+    break;
+  case 1:
+    {
+      c_term *= 2;
+      c_first_var = non_zero_index[0];
+      c_first_var *= 2;
+      if (sgn(c.coefficient(Variable(non_zero_index[0]))) < 0) {
+	c_second_var = c_first_var;
+	++c_first_var;
+      }
+      else
+	c_second_var = c_first_var + 1;
+      c_coeff = c.coefficient(Variable(non_zero_index[0]));
+    }
+    break;
+  default:
+    assert(c_num_vars == 0);
+    break;
+  }
+  return true;
+}
+
diff --git a/src/Octagonal_Shape.defs.hh b/src/Octagonal_Shape.defs.hh
new file mode 100644
index 0000000..e1902e2
--- /dev/null
+++ b/src/Octagonal_Shape.defs.hh
@@ -0,0 +1,1980 @@
+/* Octagonal_Shape class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_defs_hh
+#define PPL_Octagonal_Shape_defs_hh 1
+
+#include "Octagonal_Shape.types.hh"
+#include "globals.types.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+#include "Congruence.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Congruence_System.types.hh"
+#include "OR_Matrix.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "Polyhedron.types.hh"
+#include "Box.types.hh"
+#include "Grid.types.hh"
+#include "BD_Shape.types.hh"
+#include "Variable.defs.hh"
+#include "Variables_Set.types.hh"
+#include "Checked_Number.defs.hh"
+#include <vector>
+#include <cstddef>
+#include <climits>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape
+  Writes a textual representation of \p oct on \p s:
+  <CODE>false</CODE> is written if \p oct is an empty polyhedron;
+  <CODE>true</CODE> is written if \p oct is a universe polyhedron;
+  a system of constraints defining \p oct is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const Octagonal_Shape<T>& oct);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same octagon.
+
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different shapes.
+
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as an octagonal difference.
+/*! \relates Octagonal_Shape
+  \return
+  <CODE>true</CODE> if the constraint \p c is an octagonal difference;
+  <CODE>false</CODE> otherwise.
+
+  \param c
+  The constraint to be decoded.
+
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
+
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0, 1 and 2.
+
+  \param c_first_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the first variable having
+  a non-zero coefficient in \p c.
+
+  \param c_second_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+  then it will be set to the index of the second variable having
+  a non-zero coefficient in \p c.
+
+  \param c_coeff
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the value of the first non-zero coefficient
+  in \p c.
+
+  \param c_term
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the right value of the inhomogeneous term
+  of \p c.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool extract_octagonal_difference(const Constraint& c,
+                                  dimension_type c_space_dim,
+                                  dimension_type& c_num_vars,
+                                  dimension_type& c_first_var,
+                                  dimension_type& c_second_var,
+                                  Coefficient& c_coeff,
+                                  Coefficient& c_term);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the index coherent to \p i.
+/*! \relates Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type coherent_index(dimension_type i);
+
+} // namespace Parma_Polyhedra_Library
+
+//! An octagonal shape.
+/*!
+  The class template Octagonal_Shape<T> allows for the efficient
+  representation of a restricted kind of <EM>topologically closed</EM>
+  convex polyhedra called <EM>octagonal shapes</EM> (OSs, for short).
+  The name comes from the fact that, in a vector space of dimension 2,
+  bounded OSs are polygons with at most eight sides.
+  The closed affine half-spaces that characterize the OS can be expressed
+  by constraints of the form
+  \f[
+    ax_i + bx_j \leq k
+  \f]
+  where \f$a, b \in \{-1, 0, 1\}\f$ and \f$k\f$ is a rational number,
+  which are called <EM>octagonal constraints</EM>.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  octagonal constraints. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for OSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.  At the
+  interface level, octagonal constraints are specified using objects of
+  type Constraint: such a constraint is an octagonal constraint if it is
+  of the form
+    \f[
+      \pm a_i x_i \pm a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above Constraint object will be mapped
+  into a <EM>correct</EM> approximation that, depending on the expressive
+  power of the chosen template argument \p T, may loose some precision.
+  In particular, constraint objects that do not encode an octagonal
+  constraint will be simply (and safely) ignored.
+
+  For instance, a Constraint object encoding \f$3x + 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x + y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x + y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x + y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, a Constraint object encoding \f$3x - y \leq 1\f$
+  will be safely ignored in all of the above cases.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds an OS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+  Since only those constraints having the syntactic form of an
+  <EM>octagonal constraint</EM> are considered, the following code
+  will build the same OS as above (i.e., the constraints 7, 8, and 9
+  are ignored):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    cs.insert(x - 3*y <= 5);    // (7)
+    cs.insert(x - y + z <= 5);  // (8)
+    cs.insert(x + y + z <= 5);  // (9)
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Octagonal_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining an OS.
+  */
+#ifndef NDEBUG
+  typedef Checked_Number<T, Extended_Number_Policy> N;
+#else
+  typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+  //! The numeric base type upon which OSs are built.
+  typedef T coefficient_type_base;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining an OS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that an OS can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain cannot recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain cannot recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds an universe or empty OS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the OS;
+
+    \param kind
+    Specifies whether the universe or the empty OS has to be built.
+  */
+  explicit Octagonal_Shape(dimension_type num_dimensions = 0,
+                           Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Octagonal_Shape(const Octagonal_Shape& x,
+                  Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const Octagonal_Shape<U>& y,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS from the system of constraints \p cs.
+  /*!
+    The OS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref Octagonal_Shapes "octagonal constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints \p cs contains strict inequalities.
+  */
+  explicit Octagonal_Shape(const Constraint_System& cs);
+
+  //! Builds an OS from a system of congruences.
+  /*!
+    The OS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences: some elements may be safely ignored.
+  */
+  explicit Octagonal_Shape(const Congruence_System& cgs);
+
+  //! Builds an OS from the system of generators \p gs.
+  /*!
+    Builds the smallest OS containing the polyhedron defined by \p gs.
+    The OS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Octagonal_Shape(const Generator_System& gs);
+
+  //! Builds an OS from the polyhedron \p ph.
+  /*!
+    Builds an OS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the OS built is the
+    smallest one containing \p ph.
+  */
+  explicit Octagonal_Shape(const Polyhedron& ph,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS out of a box.
+  /*!
+    The OS inherits the space dimension of the box.
+    The built OS is the most precise OS that includes the box.
+
+    \param box
+    The bounding box representing the BDS to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Octagonal_Shape(const Box<Interval>& box,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS that approximates a grid.
+  /*!
+    The OS inherits the space dimension of the grid.
+    The built OS is the most precise OS that includes the grid.
+
+    \param grid
+    The grid used to build the OS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Octagonal_Shape(const Grid& grid,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS from a bd shape.
+  /*!
+    The OS inherits the space dimension of the bd shape.
+    The built OS is the most precise OS that includes the bd shape.
+
+    \param bd
+    The bd shape used to build the OS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const BD_Shape<U>& bd,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Octagonal_Shape& operator=(const Octagonal_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with octagon \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  void swap(Octagonal_Shape& y);
+
+  //! Destructor.
+  ~Octagonal_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Octagonal_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Octagonal_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Octagonal_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Octagonal_Shape& y) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the congruence \p cg.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty OS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe OS.
+  bool is_universe() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded OS.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains (at least) an integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Octagonal_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Octagonal_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    defining \p *this.
+
+    \param c
+    The constraint to be added. If it is not an octagonal constraint, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is a strict inequality.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not octagonal
+    constraints will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  // FIXME
+  /*! \brief
+    Adds the congruences in \p cs to the system of congruences
+    of \p *this (without minimizing the result).
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of octagonal
+    constraints defining \p *this.
+
+    \param c
+    The constraint. If it is not a octagonal constraint, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    octagonal constraints  of \p *this.
+
+    \param cg
+    The congruence. If it is not a octagonal equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    octagonal constraints defining \p *this.
+
+    \param  cs
+    The constraint system to be used. Constraints that are not octagonal
+    are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    octagonal constraints defining \p *this.
+
+    \param  cgs
+    The congruence system to be used. Congruences that are not octagonal
+    equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest OS that contains
+    the convex union of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void oct_hull_assign(const Octagonal_Shape& y);
+
+  //! Same as oct_hull_assign.
+  void upper_bound_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    If the oct-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool oct_hull_assign_if_exact(const Octagonal_Shape& y);
+
+  //! Same as oct_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest octagon containing the set difference
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void oct_difference_assign(const Octagonal_Shape& y);
+
+  //! Same as oct_difference_assign.
+  void difference_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference  denominator
+                    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+    /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+/*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+         \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Octagonal_Shape& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop_point.
+
+    \param last
+    An iterator that points to the last stop_point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  //! Same as BHMZ05_widening_assign(y, tp).
+  void widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened OS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if there is in \p cs a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Restores from \p y the constraints of \p *this, lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    An OS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_narrowing_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened OS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old OS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new OS,
+    which is characterized by a system of constraints in which the variables
+    running through the new dimensions are not constrained.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the OS
+    and does not embed it in the new space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes
+    in the new OS, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Octagonal_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  friend bool
+  operator==<T>(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! The matrix that represents the octagonal shape.
+  OR_Matrix<N> matrix;
+
+  //! Dimension of the space of the octagonal shape.
+  dimension_type space_dim;
+
+  // Please, do not move the following include directive:
+  // `Og_Status.idefs.hh' must be included exactly at this point.
+  // And please do not remove the space separating `#' from `include':
+  // this ensures that the directive will not be moved during the
+  // procedure that automatically creates the library's include file
+  // (see `Makefile.am' in the `src' directory).
+#define PPL_IN_Octagonal_Shape_CLASS
+#include "Og_Status.idefs.hh"
+#undef PPL_IN_Octagonal_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! Returns <CODE>true</CODE> if the OS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  //! Returns <CODE>true</CODE> if the OS is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \c this->matrix is known to be
+    strongly closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \c this->matrix is not strongly closed.
+  */
+  bool marked_strongly_closed() const;
+
+  //! Turns \p *this into a zero-dimensional universe OS.
+  void set_zero_dim_univ();
+
+  //! Turns \p *this into an empty OS.
+  void set_empty();
+
+  //! Marks \p *this as strongly closed.
+  void set_strongly_closed();
+
+  //! Marks \p *this as possibly not strongly closed.
+  void reset_strongly_closed();
+
+  N& matrix_at(dimension_type i, dimension_type j);
+  const N& matrix_at(dimension_type i, dimension_type j) const;
+
+  //! Adds the constraint <CODE>matrix[i][j] <= k</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                const N& k);
+
+  //! Adds the constraint <CODE>matrix[i][j] <= num/den</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                Coefficient_traits::const_reference num,
+                                Coefficient_traits::const_reference den);
+
+  /*! \brief
+    Adds to the Octagonal_Shape the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var,
+              Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
+
+  //! Removes all the constraints on variable \p v_id.
+  void forget_all_octagonal_constraints(dimension_type v_id);
+
+  //! Removes all binary constraints on variable \p v_id.
+  void forget_binary_octagonal_constraints(dimension_type v_id);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>v - u \<= k</CODE> and <CODE>v + u \<= k</CODE>,
+    starting from \p ub_v, which is an upper bound for \c v
+    computed according to \p sc_expr and \p sc_den.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>v - u \<= ub_v - lb_u</CODE> and <CODE>v + u \<= ub_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of the upper bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>v - u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>v + u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>v + u \<= ub_v + lb_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u)</CODE>.
+  */
+  void deduce_v_pm_u_bounds(dimension_type v_id,
+                            dimension_type last_id,
+                            const Linear_Expression& sc_expr,
+                            Coefficient_traits::const_reference sc_den,
+                            const N& ub_v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>-v + u \<= k</CODE> and <CODE>-v - u \<= k</CODE>,
+    starting from \p minus_lb_v, which is the negation of a lower bound
+    for \c v computed according to \p sc_expr and \p sc_den.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>-v - u \<= -lb_v - lb_u</CODE> and
+    <CODE>-v + u \<= -lb_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of (the negation of) the lower bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>-v + u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>-v + u \<= -lb_v + lb_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>-v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>-v - u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>-v - u \<= -lb_v - ub_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>-v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u)</CODE>.
+  */
+  void deduce_minus_v_pm_u_bounds(dimension_type v,
+                                  dimension_type last_v,
+                                  const Linear_Expression& sc_expr,
+                                  Coefficient_traits::const_reference sc_den,
+                                  const N& minus_lb_v);
+
+  /*! \brief
+    Adds to \p limiting_octagon the octagonal differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_octagon(const Constraint_System& cs,
+                            Octagonal_Shape& limiting_octagon) const;
+  //! Compute the (zero-equivalence classes) successor relation.
+  /*!
+    It is assumed that the octagon is not empty and strongly closed.
+  */
+  void compute_successors(std::vector<dimension_type>& successor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& successor,
+                       std::vector<dimension_type>& no_sing_leaders,
+                       bool& exist_sing_class,
+                       dimension_type& sing_leader) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+  //! Removes the redundant constraints from \c this->matrix.
+  void strong_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \c this->matrix
+    is strongly reduced.
+  */
+  bool is_strongly_reduced() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if in the octagon taken two at a time
+    unary constraints, there is also the constraint that represent their sum.
+  */
+  bool is_strong_coherent() const;
+
+  bool tight_coherence_would_make_empty() const;
+
+  //! Assigns to \c this->matrix its strong closure.
+  /*!
+    Strong closure is a necessary condition for the precision and/or
+    the correctness of many methods. It explicitly records into \c matrix
+    those constraints that are implicitly obtainable by the other ones,
+    therefore obtaining a canonical representation for the OS.
+  */
+  void strong_closure_assign() const;
+
+  //! Applies the strong-coherence step to \c this->matrix.
+  void strong_coherence_assign();
+
+  //! Puts in \p *this all implicit constraints and computes the tighter ones.
+  /*!
+    \param var
+    The variable of the altered constraints.
+
+    The octagon `*this' was transitively closed except for the constraint on
+    variable `var'. This operation costs only \f$O(n^2)\f$.
+
+  */
+  void incremental_strong_closure_assign(Variable var) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d and
+    \p included are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const Octagonal_Shape<T>& c);
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const Octagonal_Shape& x) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* name_row,
+                                    const Linear_Expression& y) const;
+
+  void throw_constraint_incompatible(const char* method) const;
+
+  void throw_expression_too_complex(const char* method,
+                                    const Linear_Expression& e) const;
+
+  void throw_generic(const char* method, const char* reason) const;
+  //@} // Exception Throwers
+
+  static T default_stop_points[];
+};
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::Octagonal_Shape<T>& x,
+          Parma_Polyhedra_Library::Octagonal_Shape<T>& y);
+
+} // namespace std
+
+#include "Og_Status.inlines.hh"
+#include "Octagonal_Shape.inlines.hh"
+#include "Octagonal_Shape.templates.hh"
+
+#endif // !defined(PPL_Octagonal_Shape_defs_hh)
diff --git a/src/Octagonal_Shape.inlines.hh b/src/Octagonal_Shape.inlines.hh
new file mode 100644
index 0000000..13297a3
--- /dev/null
+++ b/src/Octagonal_Shape.inlines.hh
@@ -0,0 +1,774 @@
+/* Octagonal_Shape class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_inlines_hh
+#define PPL_Octagonal_Shape_inlines_hh 1
+
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "C_Polyhedron.defs.hh"
+#include "Grid.defs.hh"
+#include "BD_Shape.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+// FIXME: find the appropriate place for this.
+/*! \relates Octagonal_Shape */
+inline dimension_type
+coherent_index(const dimension_type i) {
+  return (i%2) ? i-1 : i+1;
+}
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::max_space_dimension() {
+  return OR_Matrix<N>::max_num_rows()/2;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_strongly_closed() const {
+  return status.test_strongly_closed();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_empty() {
+  status.set_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_strongly_closed() {
+  status.set_strongly_closed();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::reset_strongly_closed() {
+  status.reset_strongly_closed();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const dimension_type num_dimensions,
+				    const Degenerate_Element kind)
+  : matrix(num_dimensions), space_dim(num_dimensions), status() {
+  if (kind == EMPTY)
+    set_empty();
+  else if (num_dimensions > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class)
+  : matrix(y.matrix), space_dim(y.space_dim), status(y.status) {
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape<U>& y,
+                                    Complexity_Class)
+  : matrix(y.matrix), space_dim(y.space_dim), status() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs)
+  : matrix(cs.space_dimension()),
+    space_dim(cs.space_dimension()),
+    status() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_constraints(cs);
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Congruence_System& cgs)
+  : matrix(cgs.space_dimension()),
+    space_dim(cgs.space_dimension()),
+    status() {
+  if (cgs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_congruences(cgs);
+  return;
+}
+
+template <typename T>
+template <typename Interval>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Box<Interval>& box,
+                                    Complexity_Class)
+  : matrix(box.space_dimension()),
+    space_dim(box.space_dimension()),
+    status() {
+  if (box.space_dimension() > 0)
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+  add_constraints(box.constraints());
+  return;
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Grid& grid,
+                                    Complexity_Class)
+  : matrix(grid.space_dimension()),
+    space_dim(grid.space_dimension()),
+    status() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+  add_congruences(grid.congruences());
+  return;
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const BD_Shape<U>& bd,
+                                    Complexity_Class)
+  : matrix(bd.space_dimension()),
+    space_dim(bd.space_dimension()),
+    status() {
+  if (bd.space_dimension() > 0)
+    // A (non zero-dim) universe OS is shortest-path closed.
+    set_strongly_closed();
+  add_constraints(bd.constraints());
+  return;
+}
+
+template <typename T>
+inline Congruence_System
+Octagonal_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
+
+template <typename T>
+inline Octagonal_Shape<T>&
+Octagonal_Shape<T>::operator=(const Octagonal_Shape& y) {
+  matrix = y.matrix;
+  space_dim = y.space_dim;
+  status = y.status;
+  return *this;
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::~Octagonal_Shape() {
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::swap(Octagonal_Shape& y) {
+  std::swap(matrix, y.matrix);
+  std::swap(space_dim, y.space_dim);
+  std::swap(status, y.status);
+}
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_empty() const {
+  strong_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+			     Coefficient& sup_n, Coefficient& sup_d,
+			     bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+			     Coefficient& sup_n, Coefficient& sup_d,
+			     bool& maximum,
+			     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+			     Coefficient& inf_n, Coefficient& inf_d,
+			     bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+			     Coefficient& inf_n, Coefficient& inf_d,
+			     bool& minimum,
+			     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_topologically_closed() const {
+  return true;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::topological_closure_assign() {
+  // Nothing to be done.
+  return;
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  if (x.space_dim != y.space_dim)
+    // Dimension-incompatible OSs are different.
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
+
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+  // If one of two octagons is empty, then they are equal if and only if
+  // the other octagon is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Strong closure is a canonical form.
+  return x.matrix == y.matrix;
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline const typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+			      const dimension_type j) const {
+  assert(i < matrix.num_rows() && j < matrix.num_rows());
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+			      const dimension_type j) {
+  assert(i < matrix.num_rows() && j < matrix.num_rows());
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline Constraint_System
+Octagonal_Shape<T>::minimized_constraints() const {
+  strong_reduction_assign();
+  return constraints();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_octagonal_constraint(const dimension_type i,
+					     const dimension_type j,
+					     const N& k) {
+  // Private method: the caller has to ensure the following.
+#ifndef NDEBUG
+  assert(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  assert(j < m_i.row_size());
+#endif
+  N& r_i_j = matrix[i][j];
+  if (r_i_j > k) {
+    r_i_j = k;
+    if (marked_strongly_closed())
+      reset_strongly_closed();
+  }
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::add_octagonal_constraint(const dimension_type i,
+			   const dimension_type j,
+			   Coefficient_traits::const_reference num,
+			   Coefficient_traits::const_reference den) {
+#ifndef NDEBUG
+  // Private method: the caller has to ensure the following.
+  assert(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  assert(j < m_i.row_size());
+  assert(den != 0);
+#endif
+  DIRTY_TEMP(N, k);
+  div_round_up(k, num, den);
+  add_octagonal_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_constraints(const Constraint_System& cs) {
+  Constraint_System::const_iterator i_end = cs.end();
+  for (Constraint_System::const_iterator i = cs.begin(); i != i_end; ++i)
+    add_constraint(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  add_constraints(cs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  Constraint_System::const_iterator i_end = cs.end();
+  for (Constraint_System::const_iterator i = cs.begin(); i != i_end; ++i)
+    refine_with_constraint(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  refine_with_constraints(cs);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimension(nd)",
+				 new_dimension);
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from an octagon in a 0-dim space.
+  if (new_dimension == space_dim) {
+    assert(OK());
+    return;
+  }
+
+  strong_closure_assign();
+  matrix.shrink(new_dimension);
+  // When we remove all dimensions from a non-empty octagon,
+  // we obtain the zero-dimensional universe octagon.
+  if (new_dimension == 0 && !marked_empty())
+    set_zero_dim_univ();
+  space_dim = new_dimension;
+  assert(OK());
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::widening_assign(const Octagonal_Shape& y, unsigned* tp) {
+  BHMZ05_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+					      unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+			    stop_points,
+			    stop_points
+			    + sizeof(stop_points)/sizeof(stop_points[0]),
+			    tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::time_elapse_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // See the polyhedra documentation.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.time_elapse_assign(py);
+  Octagonal_Shape<T> x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::strictly_contains(const Octagonal_Shape& y) const {
+  const Octagonal_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::upper_bound_assign(const Octagonal_Shape& y) {
+  oct_hull_assign(y);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::oct_hull_assign_if_exact(const Octagonal_Shape&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+  return oct_hull_assign_if_exact(y);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::difference_assign(const Octagonal_Shape& y) {
+  oct_difference_assign(y);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Octagonal_Shape<T>& x,
+			    const Octagonal_Shape<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
+
+  return rectilinear_distance_assign(r, x.matrix, y.matrix, dir,
+				     tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Octagonal_Shape<T>& x,
+			    const Octagonal_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Octagonal_Shape<T>& x,
+			    const Octagonal_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Octagonal_Shape<T>& x,
+			  const Octagonal_Shape<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
+
+  return euclidean_distance_assign(r, x.matrix, y.matrix, dir,
+				   tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Octagonal_Shape<T>& x,
+			  const Octagonal_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Octagonal_Shape<T>& x,
+			  const Octagonal_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Octagonal_Shape<T>& x,
+			   const Octagonal_Shape<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
+
+  return l_infinity_distance_assign(r, x.matrix, y.matrix, dir,
+				    tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Octagonal_Shape<T>& x,
+			   const Octagonal_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Octagonal_Shape<T>& x,
+			   const Octagonal_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline memory_size_type
+Octagonal_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+Octagonal_Shape<T>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::Octagonal_Shape<T>& x,
+     Parma_Polyhedra_Library::Octagonal_Shape<T>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Octagonal_Shape_inlines_hh)
diff --git a/src/Octagonal_Shape.templates.hh b/src/Octagonal_Shape.templates.hh
new file mode 100644
index 0000000..54c9e62
--- /dev/null
+++ b/src/Octagonal_Shape.templates.hh
@@ -0,0 +1,6417 @@
+/* Octagonal_Shape class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_templates_hh
+#define PPL_Octagonal_Shape_templates_hh 1
+
+#include "Generator_System.defs.hh"
+#include "Generator_System.inlines.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include <cassert>
+#include <vector>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Polyhedron& ph,
+                                    const Complexity_Class complexity)
+  : matrix(0), space_dim(0), status() {
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = Octagonal_Shape(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = Octagonal_Shape(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  assert(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = Octagonal_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our OSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality())
+          lp.add_constraint(Linear_Expression(c) >= 0);
+        else
+          lp.add_constraint(c);
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = Octagonal_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Start with a universe OS that will be refined by the simplex.
+    *this = Octagonal_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 0; i < num_dimensions; ++i) {
+      Variable x(i);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        num *= 2;
+        div_round_up(matrix[2*i+1][2*i], num, den);
+      }
+      // Evaluate optimal upper bounds for `x + y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(x + y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up(matrix[2*i+1][2*j], num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]),
+                       num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `y - x <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]),
+                       num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `-x - y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(-x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+           div_round_up(matrix[2*i][2*j+1], num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        num *= 2;
+        div_round_up(matrix[2*i][2*i+1], num, den);
+      }
+    }
+    set_strongly_closed();
+    assert(OK());
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  *this = Octagonal_Shape(ph.constraints());
+}
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs)
+  : matrix(gs.space_dimension()),
+    space_dim(gs.space_dimension()),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    return;
+  }
+
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typename OR_Matrix<N>::row_iterator mat_begin = matrix.row_begin();
+
+  DIRTY_TEMP(N, tmp);
+  bool mat_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!mat_initialized) {
+        // When handling the first (closure) point, we initialize the matrix.
+        mat_initialized = true;
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the hyperplanes passing in the point
+            // and having the octagonal gradient.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplanes: X_i - X_j = P_i - P_j.
+            div_round_up(x_i[dj], g_j - g_i, d);
+            div_round_up(x_ii[dj+1], g_i - g_j, d);
+            // Hyperplanes: X_i + X_j = P_i + P_j.
+            div_round_up(x_i[dj+1], -g_j - g_i, d);
+            div_round_up(x_ii[dj], g_i + g_j, d);
+          }
+          // Hyperplanes: X_i = P_i.
+          div_round_up(x_i[di+1], -g_i - g_i, d);
+          div_round_up(x_ii[di], g_i + g_i, d);
+        }
+      }
+      else {
+        // This is not the first point: the matrix already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the straight lines passing in the point
+            // and having the octagonal gradient; compute maxima values.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplane: X_i - X_j = max (P_i - P_j, const).
+            div_round_up(tmp, g_j - g_i, d);
+            max_assign(x_i[dj], tmp);
+            div_round_up(tmp, g_i - g_j, d);
+            max_assign(x_ii[dj+1], tmp);
+            // Hyperplane: X_i + X_j = max (P_i + P_j, const).
+            div_round_up(tmp, -g_j - g_i, d);
+            max_assign(x_i[dj+1], tmp);
+            div_round_up(tmp, g_i + g_j, d);
+            max_assign(x_ii[dj], tmp);
+          }
+          // Hyperplane: X_i = max (P_i, const).
+          div_round_up(tmp, -g_i - g_i, d);
+          max_assign(x_i[di+1], tmp);
+          div_round_up(tmp, g_i + g_i, d);
+          max_assign(x_ii[di], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::Octagonal_Shape<T>"
+                                "::Octagonal_Shape(gs):\n"
+                                "the non-empty generator system gs "
+                                "contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::LINE:
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any line the right limit.
+            if (g_i != g_j) {
+              // Hyperplane: X_i - X_j <=/>= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            if (g_i != -g_j) {
+              // Hyperplane: X_i + X_j <=/>= +Inf.
+              assign_r(x_i[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          if (g_i != 0) {
+            // Hyperplane: X_i <=/>= +Inf.
+            assign_r(x_i[di+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+        }
+      break;
+    case Generator::RAY:
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any ray the right limit in the case
+            // of the binary constraints.
+            if (g_i < g_j)
+              // Hyperplane: X_i - X_j >= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > g_j)
+              // Hyperplane: X_i - X_j <= +Inf.
+              assign_r(x_ii[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i < -g_j)
+              // Hyperplane: X_i + X_j >= +Inf.
+              assign_r(x_i[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > -g_j)
+              // Hyperplane: X_i + X_j <= +Inf.
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+          // Case: unary constraints.
+          if (g_i < 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_i[di+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          if (g_i > 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        }
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("add_constraint(c)", c);
+  // Strict inequalities are not allowed.
+  if (c.is_strict_inequality())
+   throw_constraint_incompatible("add_constraint(c)");
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  // Constraints that are not octagonal differences are ignored.
+  if (!extract_octagonal_difference(c, c_space_dim, num_vars,
+                                    i, j, coeff, term))
+    return;
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i%2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
+
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    add_constraint(expr == 0);
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  // Constraints that are not octagonal differences are ignored.
+  if (!extract_octagonal_difference(c, c_space_dim, num_vars,
+                                    i, j, coeff, term))
+    return;
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i%2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
+
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    refine_with_constraint(expr == 0);
+  }
+  assert(OK());
+}
+
+template <typename T>
+dimension_type
+Octagonal_Shape<T>::affine_dimension() const {
+  const dimension_type n_rows = matrix.num_rows();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (n_rows == 0)
+    return 0;
+
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `leaders' is used to represent non-singular
+  // equivalence classes:
+  // `leaders[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class);
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  // Due to the splitting of variables, the affine dimension is the
+  // number of non-singular positive zero-equivalence classes.
+  dimension_type affine_dim = 0;
+  for (dimension_type i = 0; i < n_rows; i += 2)
+    // Note: disregard the singular equivalence class.
+    if (leaders[i] == i && leaders[i+1] == i+1)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+Octagonal_Shape<T>::minimized_congruences() const {
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs;
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cgs.insert((0*Variable(space_dim-1) %= 1) / 0);
+  else {
+    // KLUDGE: in the future `cgs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cgs.insert(0*Variable(space_dim-1) == 0);
+
+    // The vector `leaders' is used to represent equivalence classes:
+    // `leaders[i] == i' if and only if `i' is the leader of its
+    // equivalence class (i.e., the minimum index in the class);
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
+
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 0, i_end = 2*space_dim; i != i_end; i += 2) {
+      const dimension_type lead_i = leaders[i];
+      if (i == lead_i) {
+        if (leaders[i+1] == i)
+          // `i' is the leader of the singular equivalence class.
+          goto singular;
+        else
+          // `i' is the leader of a non-singular equivalence class.
+          continue;
+      }
+      else {
+        // `i' is not a leader.
+        if (leaders[i+1] == lead_i)
+          // `i' belongs to the singular equivalence class.
+          goto singular;
+        else
+          // `i' does not belong to the singular equivalence class.
+          goto non_singular;
+      }
+
+    singular:
+      // `i' belongs to the singular equivalence class:
+      // we have a unary equality constraint.
+      {
+        const Variable x(i/2);
+        const N& c_ii_i = matrix[i+1][i];
+#ifndef NDEBUG
+        const N& c_i_ii = matrix[i][i+1];
+        assert(is_additive_inverse(c_i_ii, c_ii_i));
+#endif
+        numer_denom(c_ii_i, num, den);
+        den *= 2;
+        cgs.insert(den*x == num);
+      }
+      continue;
+
+    non_singular:
+      // `i' does not belong to the singular equivalence class.
+      // we have a binary equality constraint.
+      {
+        const N& c_i_li = matrix[i][lead_i];
+#ifndef NDEBUG
+        const N& c_ii_lii = matrix[i+1][lead_i+1];
+        assert(is_additive_inverse(c_ii_lii, c_i_li));
+#endif
+        const Variable x(lead_i/2);
+        const Variable y(i/2);
+        numer_denom(c_i_li, num, den);
+        cgs.insert(den*x - den*y == num);
+      }
+      continue;
+    }
+  }
+  return cgs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::concatenate_assign(const Octagonal_Shape& y) {
+  // If `y' is an empty 0-dim space octagon, let `*this' become empty.
+  // If `y' is an universal 0-dim space octagon, we simply return.
+  if (y.space_dim == 0) {
+    if (y.marked_empty())
+      set_empty();
+    return;
+  }
+
+  // If `*this' is an empty 0-dim space octagon, then it is sufficient
+  // to adjust the dimension of the vector space.
+  if (space_dim == 0 && marked_empty()) {
+    add_space_dimensions_and_embed(y.space_dim);
+    return;
+  }
+
+  // This is the old number of rows in the matrix. It is equal to
+  // the first index of columns to change.
+  dimension_type old_num_rows = matrix.num_rows();
+  // First we increase the space dimension of `*this' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new octagon is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // (where they are at the present) and placing the constraints of `y' in the
+  // lower right-hand side.
+  add_space_dimensions_and_embed(y.space_dim);
+  typename OR_Matrix<N>::const_element_iterator
+    y_it = y.matrix.element_begin();
+  for(typename OR_Matrix<N>::row_iterator i = matrix.row_begin()+old_num_rows,
+        matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::row_reference_type r = *i;
+    dimension_type rs_i = i.row_size();
+    for (dimension_type j = old_num_rows; j < rs_i; ++j, ++y_it)
+      r[j] = *y_it;
+  }
+
+  // The concatenation doesn't preserve the closure.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", y);
+
+  // The zero-dimensional universe octagon contains any other
+  // dimension-compatible octagon.
+  // The zero-dimensional empty octagon only contains another
+  // zero-dimensional empty octagon.
+  if (space_dim == 0) {
+    if (!marked_empty())
+      return true;
+    else
+      return y.marked_empty();
+  }
+
+  // `y' needs to be transitively closed.
+  y.strong_closure_assign();
+  // An empty octagon is in any other dimension-compatible octagons.
+  if (y.marked_empty())
+    return true;
+
+  // `*this' contains `y' if and only if every element of `*this'
+  // is greater than or equal to the correspondent one of `y'.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), j = y.matrix.element_begin(),
+         matrix_element_end = matrix.element_end(); i != matrix_element_end; ++i, ++j)
+    if (*i < *j)
+      return false;
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_disjoint_from(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If one Octagonal_Shape is empty, the Octagonal_Shapes are disjoint.
+  strong_closure_assign();
+  if (marked_empty())
+    return true;
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return true;
+
+  // Two Octagonal_Shapes are disjoint if and only if their intersection
+  // is empty, i.e., if and only if there exists a variable such that
+  // the upper bound of the constraint on that variable in the first
+  // Octagonal_Shape is strictly less than the lower bound of
+  // the correspomding constraint in the second Octagonal_Shape or vice versa.
+
+  const dimension_type n_rows = matrix.num_rows();
+
+  typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+
+  const Row_Iterator y_begin = y.matrix.row_begin();
+  const Row_Iterator y_end = y.matrix.row_end();
+
+  DIRTY_TEMP(N, neg_y_ci_cj);
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ci = (i%2) ? *(i_iter-1) : *(i_iter+1);
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      Row_Reference m_cj = *(m_begin + cj);
+      const N& m_i_j = (j < rs_i) ? m_i[j] : m_cj[ci];
+      Row_Reference y_ci = *(y_begin + ci);
+      Row_Reference y_j = *(y_begin + j);
+      const N& y_ci_cj = (j < rs_i) ? y_ci[cj] : y_j[i];
+      neg_assign_r(neg_y_ci_cj, y_ci_cj, ROUND_UP);
+      if (m_i_j < neg_y_ci_cj)
+        return true;
+    }
+  }
+  return false;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_universe() const {
+  // An empty octagon isn't, of course, universe.
+  if (marked_empty())
+    return false;
+
+  // If the octagon is non-empty and zero-dimensional,
+  // then it is necessarily the universe octagon.
+  if (space_dim == 0)
+    return true;
+
+  // An universe octagon can only contains trivial  constraints.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i)
+    if (!is_plus_infinity(*i))
+      return false;
+
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_bounded() const {
+  strong_closure_assign();
+  // A zero-dimensional or empty octagon is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  // A bounded octagon never can contains trivial constraints.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    const dimension_type i_index = i.index();
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (i_index != j)
+        if (is_plus_infinity(x_i[j]))
+          return false;
+  }
+
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains_integer_point() const {
+  // Force strong closure.
+  if (is_empty())
+    return false;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
+
+  // A strongly closed and consistent Octagonal_Shape defined by
+  // integer constraints can only be empty due to tight coeherence.
+  if (std::numeric_limits<T>::is_integer)
+    return !tight_coherence_would_make_empty();
+
+  // Build an integer Octagonal_Shape oct_z with bounds at least as
+  // tight as those in *this and then recheck for emptiness, also
+  // exploiting tight-coherence.
+  Octagonal_Shape<mpz_class> oct_z(space_dim);
+  oct_z.reset_strongly_closed();
+
+  typedef Octagonal_Shape<mpz_class>::N Z;
+  DIRTY_TEMP(N, tmp);
+  bool all_integers = true;
+  typename OR_Matrix<N>::const_element_iterator x_i = matrix.element_begin();
+  for (typename OR_Matrix<Z>::element_iterator
+         z_i = oct_z.matrix.element_begin(),
+         z_end = oct_z.matrix.element_end(); z_i != z_end; ++z_i, ++x_i) {
+    const N& d = *x_i;
+    if (is_plus_infinity(d))
+      continue;
+    if (is_integer(d))
+      assign_r(*z_i, d, ROUND_NOT_NEEDED);
+    else {
+      all_integers = false;
+      Z& d_z = *z_i;
+      // Copy d into d_z, but rounding downwards.
+      neg_assign_r(tmp, d, ROUND_NOT_NEEDED);
+      assign_r(d_z, tmp, ROUND_UP);
+      neg_assign_r(d_z, d_z, ROUND_NOT_NEEDED);
+    }
+  }
+  // Restore strong closure.
+  if (all_integers)
+    // oct_z unchanged, so it is still strongly closed.
+    oct_z.set_strongly_closed();
+  else {
+    // oct_z changed: recompute strong closure.
+    oct_z.strong_closure_assign();
+    if (oct_z.marked_empty())
+      return false;
+  }
+  return !oct_z.tight_coherence_would_make_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // A polyhedron known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
+
+  // Check whether `var' is syntactically constrained.
+  const dimension_type n_v = 2*(var_space_dim - 1);
+  typename OR_Matrix<N>::const_row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::const_row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::const_row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    if (!is_plus_infinity(r_v[h]) || !is_plus_infinity(r_cv[h]))
+      return true;
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::const_row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::const_row_reference_type r = *m_iter;
+    if (!is_plus_infinity(r[n_v]) || !is_plus_infinity(r[n_v+1]))
+      return true;
+  }
+
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strong_coherent() const {
+  // This method is only used by method OK() so as to check if a
+  // strongly closed matrix is also strong-coherent, as it must be.
+  const dimension_type num_rows = matrix.num_rows();
+
+  // Allocated here once and for all.
+  DIRTY_TEMP(N, semi_sum);
+  // The strong-coherence is: for every indexes i and j (and i != j)
+  // matrix[i][j] <= (matrix[i][ci] + matrix[cj][j])/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    const N& m_i_ci = m_i[coherent_index(i)];
+    for (dimension_type j = matrix.row_size(i); j-- > 0; )
+      // Note: on the main diagonal only PLUS_INFINITY can occur.
+      if (i != j) {
+        const N& m_cj_j = matrix[coherent_index(j)][j];
+        if (!is_plus_infinity(m_i_ci)
+            && !is_plus_infinity(m_cj_j)) {
+          // Compute (m_i_ci + m_cj_j)/2 into `semi_sum',
+          // rounding the result towards plus infinity.
+          add_assign_r(semi_sum, m_i_ci, m_cj_j, ROUND_UP);
+          div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+          if (m_i[j] > semi_sum)
+            return false;
+        }
+      }
+  }
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strongly_reduced() const {
+  // This method is only used in assertions: efficiency is not a must.
+
+  // An empty octagon is already transitively reduced.
+  if (marked_empty())
+    return true;
+
+  Octagonal_Shape x = *this;
+  // The matrix representing an OS is strongly reduced if, by removing
+  // any constraint, the resulting matrix describes a different OS.
+  for (typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    const dimension_type i = iter.index();
+    for (dimension_type j = iter.row_size(); j-- > 0; ) {
+      if (!is_plus_infinity(m_i[j])) {
+        Octagonal_Shape x_copy = *this;
+        assign_r(x_copy.matrix[i][j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (x == x_copy)
+          return false;
+      }
+    }
+  }
+  // The octagon is just reduced.
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::bounds(const Linear_Expression& expr,
+                           const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+  strong_closure_assign();
+
+  // A zero-dimensional or empty octagon bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
+
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (from_above) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  if (extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                   i, j, coeff, term)) {
+    if (num_vars == 0)
+      return true;
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    return !is_plus_infinity(m_i[j]);
+  }
+  else {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode mode_bounds =
+      from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    return (mip.solve() == OPTIMIZED_MIP_PROBLEM);
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (maximize) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  if (!extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                    i, j, coeff, term)) {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // `c' is an octagonal constraint.
+    if (num_vars == 0) {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    DIRTY_TEMP(N, d);
+    if (!is_plus_infinity(m_i[j])) {
+      const Coefficient& b = expr.inhomogeneous_term();
+      TEMP_INTEGER(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of a variable
+      // of `expr'.
+      DIRTY_TEMP(N, coeff_expr);
+      const Coefficient& coeff_i = expr.coefficient(Variable(i/2));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        TEMP_INTEGER(minus_coeff_i);
+        neg_assign(minus_coeff_i, expr.coefficient(Variable(i/2)));
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      if (num_vars == 1) {
+        DIRTY_TEMP(N, m_i_j);
+        div2exp_assign_r(m_i_j, m_i[j], 1, ROUND_UP);
+        add_mul_assign_r(d, coeff_expr, m_i_j, ROUND_UP);
+      }
+      else
+        add_mul_assign_r(d, coeff_expr, m_i[j], ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
+
+    // The `expr' is unbounded.
+    return false;
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included, Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+  if (!is_universe()) {
+    // We use MIP_Problems to handle constraints that are not
+    // octagonal difference.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      g = mip.optimizing_point();
+      mip.evaluate_objective_function(g, ext_n, ext_d);
+      included = true;
+      return true;
+    }
+  }
+  // The `expr' is unbounded.
+  return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
+  dimension_type cg_space_dim = cg.space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim) {
+    throw_dimension_incompatible("relation_with(cg)", cg);
+  }
+
+  // If the congruence is an equality,
+  // find the relation with the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    return relation_with(c);
+  }
+
+  strong_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  TEMP_INTEGER(mod);
+  mod = cg.modulus();
+  Linear_Expression le;
+  for (dimension_type i = cg_space_dim; i-- > 0; )
+    le += cg.coefficient(Variable(i)) * Variable(i);
+  bool bounded_below = minimize(le, min_num, min_den, min_included);
+
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  TEMP_INTEGER(v);
+  TEMP_INTEGER(lower_num);
+  TEMP_INTEGER(lower_den);
+  TEMP_INTEGER(lower);
+  assign_r(lower_num, min_num, ROUND_NOT_NEEDED);
+  assign_r(lower_den, min_den, ROUND_NOT_NEEDED);
+  v -= cg.inhomogeneous_term();
+  lower = lower_num / lower_den;
+  v += ((lower / mod) * mod);
+  if (v * lower_den < lower_num)
+    v += mod;
+  const Constraint& c(le == v);
+  return relation_with(c);
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+  dimension_type c_space_dim = c.space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  // The closure needs to make explicit the implicit constraints.
+  strong_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    // Trivially false zero-dimensional constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+
+    // Trivially true zero-dimensional constraint.
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(c_term);
+  if (!extract_octagonal_difference(c, c_space_dim, num_vars,
+                                    i, j, coeff, c_term)) {
+    // Constraints that are not octagonal differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le;
+    for (dimension_type k = c_space_dim; k-- > 0; ) {
+      Variable vk(k);
+      le += c.coefficient(vk) * vk;
+    }
+    DIRTY_TEMP(Coefficient, max_num);
+    DIRTY_TEMP(Coefficient, max_den);
+    bool max_included;
+    DIRTY_TEMP(Coefficient, min_num);
+    DIRTY_TEMP(Coefficient, min_den);
+    bool min_included;
+    bool bounded_above = maximize(le, max_num, max_den, max_included);
+    bool bounded_below = minimize(le, min_num, min_den, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(min_num)) {
+      case 1:
+        if (c.is_equality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return  Poly_Con_Relation::strictly_intersects();
+        return  Poly_Con_Relation::is_included();
+      case -1:
+        return  Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_num += c.inhomogeneous_term() * max_den;
+      switch (sgn(max_num)) {
+      case 1:
+        return  Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_num += c.inhomogeneous_term() * max_den;
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(max_num)) {
+      case 1:
+        switch (sgn(min_num)) {
+        case 1:
+          if (c.is_equality())
+            return  Poly_Con_Relation::is_disjoint();
+          return  Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return  Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::strictly_intersects();
+          return  Poly_Con_Relation::is_included();
+        case -1:
+          return  Poly_Con_Relation::strictly_intersects();
+        }
+     case 0:
+        if (min_num == 0) {
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return  Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of constraint.
+  typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+  const N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  // Select the cell to be checked for the ">=" part of constraint.
+  // Select the right row of the cell.
+  if (i%2 == 0)
+    ++i_iter;
+  else
+    --i_iter;
+  typename OR_Matrix<N>::const_row_reference_type m_ci = *i_iter;
+  const N& m_ci_cj = m_ci[coherent_index(j)];
+  TEMP_INTEGER(numer);
+  TEMP_INTEGER(denom);
+  // The following variables of mpq_class type are used to be precise
+  // when the octagon is defined by integer constraints.
+  DIRTY_TEMP0(mpq_class, q_x);
+  DIRTY_TEMP0(mpq_class, q_y);
+  DIRTY_TEMP0(mpq_class, d);
+  DIRTY_TEMP0(mpq_class, d1);
+  DIRTY_TEMP0(mpq_class, c_den);
+  DIRTY_TEMP0(mpq_class, q_den);
+  assign_r(c_den, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c_term, ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_den, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_den, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(m_i_j)) {
+    if (!is_plus_infinity(m_ci_cj)) {
+      // `*this' is in the following form:
+      // `-m_ci_cj <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-m_ci_cj > d' (`-m_ci_cj >= d' if c is a strict inequality),
+      // i.e. if `m_ci_cj < d1' (`m_ci_cj <= d1' if c is a strict inequality).
+      numer_denom(m_ci_cj, numer, denom);
+      assign_r(q_den, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
+
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
+
+  // Here `m_i_j' is not plus-infinity.
+  numer_denom(m_i_j, numer, denom);
+  assign_r(q_den, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(m_ci_cj)) {
+    numer_denom(m_ci_cj, numer, denom);
+    assign_r(q_den, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `m_ci_cj < d1' (`m_ci_cj <= d1' if `c' is a strict inequality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
+
+  // Here `m_ci_cj' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `m_i_j < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
+
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
+
+#if 0
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+  using namespace IO_Operators;
+  C_Polyhedron ph(constraints());
+  Poly_Con_Relation p_ret = ph.relation_with(c);
+  Poly_Con_Relation o_ret = this->real_relation_with(c);
+  if (p_ret != o_ret) {
+    std::cout << "Relation of" <<std::endl
+              << *this << std::endl
+              << "a.k.a." << std::endl
+              << ph << std::endl
+              << "with" << std::endl
+              << c << std::endl
+              << "gives " << o_ret << " with Octagonal_Shape" << std::endl
+              << "and " << p_ret << " with C_Polyhedron" << std::endl;
+  }
+  return o_ret;
+}
+#endif
+
+template <typename T>
+Poly_Gen_Relation
+Octagonal_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The closure needs to make explicit the implicit constraints and if the
+  // octagon is empty.
+  strong_closure_assign();
+
+  // The empty octagon cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe octagon in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
+
+  // The relation between the octagon and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the octagon.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the octagon.
+
+  typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  TEMP_INTEGER(product);
+
+  // We find in `*this' all the constraints.
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ii = *(i_iter+1);
+    const N& m_i_ii = m_i[i+1];
+    const N& m_ii_i = m_ii[i];
+    // We have the unary constraints.
+    const Variable x(i/2);
+    const Coefficient& g_coeff_x = (x.space_dimension() > g_space_dim)
+      ? Coefficient(0) : g.coefficient(x);
+    if (is_additive_inverse(m_i_ii, m_ii_i)) {
+      // The constraint has form ax = b.
+      // To satisfy the constraint it's necessary that the scalar product
+      // is not zero. The scalar product has the form:
+      // 'den * g_coeff_x - num * g.divisor()'.
+      numer_denom(m_ii_i, num, den);
+      den *= 2;
+      product = den * g_coeff_x;
+      // Note that if the generator `g' is a line or a ray,
+      // its divisor is zero.
+      if (!is_line_or_ray) {
+        neg_assign(num);
+        add_mul_assign(product, num, g.divisor());
+      }
+      if (product != 0)
+        return Poly_Gen_Relation::nothing();
+    }
+    // We have 0, 1 or 2 inequality constraints.
+    else {
+      if (!is_plus_infinity(m_i_ii)) {
+        // The constraint has form -ax <= b.
+        // If the generator is a line it's necessary to check if
+        // the scalar product is not zero, if it is positive otherwise.
+        numer_denom(m_i_ii, num, den);
+        den *= -2;
+        product = den * g_coeff_x;
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num, g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form:
+          // '-den * g.coeff_x - num * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+      if (!is_plus_infinity(m_ii_i)) {
+        // The constraint has form ax <= b.
+        numer_denom(m_ii_i, num, den);
+        den *= 2;
+        product = den * g_coeff_x;
+         // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num , g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form:
+          // 'den * g_coeff_x - num * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+
+  // We have the binary constraints.
+  for (Row_Iterator i_iter = m_begin ; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ii = *(i_iter+1);
+    for (dimension_type j = 0; j < i; j += 2) {
+      const N& m_i_j = m_i[j];
+      const N& m_ii_jj = m_ii[j+1];
+      const N& m_ii_j = m_ii[j];
+      const N& m_i_jj = m_i[j+1];
+      const Variable x(j/2);
+      const Variable y(i/2);
+      const Coefficient& g_coeff_x = (x.space_dimension() > g_space_dim)
+        ? Coefficient(0) : g.coefficient(x);
+      const Coefficient& g_coeff_y = (y.space_dimension() > g_space_dim)
+        ? Coefficient(0) : g.coefficient(y);
+
+      // FIXME! Find better names.
+      const bool is_binary_equality = is_additive_inverse(m_ii_jj, m_i_j);
+      const bool is_a_binary_equality = is_additive_inverse(m_i_jj, m_ii_j);
+      if (is_binary_equality) {
+        // The constraint has form ax - ay = b.
+        // The scalar product has the form
+        // 'den * coeff_x - den * coeff_y - num * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_i_j, num, den);
+        product = den * g_coeff_x;
+        neg_assign(den);
+        add_mul_assign(product, den, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_j)) {
+          // The constraint has form ax - ay <= b.
+          // The scalar product has the form
+          // 'den * coeff_x - den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_j, num, den);
+          product = den * g_coeff_x;
+          neg_assign(den);
+          add_mul_assign(product, den, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_jj)) {
+          // The constraint has form -ax + ay <= b.
+          // The scalar product has the form
+          // '-den * coeff_x + den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_jj, num, den);
+          product = den * g_coeff_y;
+          neg_assign(den);
+          add_mul_assign(product, den, g_coeff_x);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+
+      if (is_a_binary_equality) {
+        // The constraint has form ax + ay = b.
+        // The scalar product has the form
+        // 'den * coeff_x + den * coeff_y - num * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_ii_j, num, den);
+        product = den * g_coeff_x;
+        add_mul_assign(product, den, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_jj)) {
+          // The constraint has form -ax - ay <= b.
+          // The scalar product has the form
+          // '-den * coeff_x - den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_jj, num, den);
+          neg_assign(den);
+          product = den * g_coeff_x;
+          add_mul_assign(product, den, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_j)) {
+          // The constraint has form ax + ay <= b.
+          // The scalar product has the form
+          // 'den * coeff_x + den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_j, num, den);
+          product = den * g_coeff_x;
+          add_mul_assign(product, den, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
+  // If this point is reached the constraint 'g' satisfies
+  // all the constraints in the octagon.
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_closure_assign() const {
+  // Do something only if necessary (zero-dim implies strong closure).
+  if (marked_empty() || marked_strongly_closed() || space_dim == 0)
+    return;
+
+  // Even though the octagon will not change, its internal representation
+  // is going to be modified by the closure algorithm.
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+
+  const dimension_type n_rows = x.matrix.num_rows();
+  const Row_Iterator m_begin = x.matrix.row_begin();
+  const Row_Iterator m_end = x.matrix.row_end();
+
+  // Fill the main diagonal with zeros.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    assert(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
+
+  // This algorithm is given by two steps: the first one is a simple
+  // adaptation of the `shortest-path closure' using the Floyd-Warshall
+  // algorithm; the second one is the `strong-coherence' algorithm.
+  // It is important to note that after the strong-coherence,
+  // the octagon is still shortest-path closed and hence, strongly closed.
+
+  // Recall that, given an index `h', we indicate with `ch' the coherent
+  // index, i.e., the index such that:
+  //   ch = h + 1, if h is an even number;
+  //   ch = h - 1, if h is an odd number.
+
+  typename OR_Matrix<N>::element_iterator iter_ij;
+  std::vector<N> vec_k(n_rows);
+  std::vector<N> vec_ck(n_rows);
+  DIRTY_TEMP(N, sum1);
+  DIRTY_TEMP(N, sum2);
+  Row_Reference x_k;
+  Row_Reference x_ck;
+  Row_Reference x_i;
+  Row_Reference x_ci;
+
+  // Since the index `j' of the inner loop will go from 0 up to `i',
+  // the three nested loops have to be executed twice.
+  for (int twice = 0; twice < 2; ++twice) {
+
+    Row_Iterator x_k_iter = m_begin;
+    Row_Iterator x_i_iter = m_begin;
+    for (dimension_type k = 0; k < n_rows; k += 2) {
+      const dimension_type ck = k+1;
+      // Re-initialize the element iterator.
+      iter_ij = x.matrix.element_begin();
+      // Compute the row references `x_k' and `x_ck'.
+      x_k  = *x_k_iter;
+      ++x_k_iter;
+      x_ck = *x_k_iter;
+      ++x_k_iter;
+
+      for (dimension_type i = 0; i <= k; i += 2) {
+        const dimension_type ci = i+1;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_k[i];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_k[ci];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ck[i];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_ck[ci];
+      }
+      x_i_iter = x_k_iter;
+      for (dimension_type i = k+2; i < n_rows; i += 2) {
+        const dimension_type ci = i+1;
+        x_i = *x_i_iter;
+        ++x_i_iter;
+        x_ci = *x_i_iter;
+        ++x_i_iter;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_ci[ck];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_i[ck];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ci[k];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_i[k];
+      }
+
+      for (dimension_type i = 0; i < n_rows; ++i) {
+        const dimension_type ci = coherent_index(i);
+        const N& vec_k_ci = vec_k[ci];
+        const N& vec_ck_ci = vec_ck[ci];
+        // Unfolding two iterations on `j': this ensures that
+        // the loop exit condition `j <= i' is OK.
+        for (dimension_type j = 0; j <= i; ) {
+          // First iteration:
+          // sum1 = x_i_k + x_k_j == x_ck_ci + x_k_j;
+          // sum2 = x_i_ck + x_ck_j == x_k_ci + x_ck_j.
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the first iteration: loop index control.
+          ++j;
+          ++iter_ij;
+          // Second iteration: ditto.
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the second iteration: loop index control.
+          ++j;
+          ++iter_ij;
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value in the main diagonal.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      assert(sgn(x_i_i) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // Step 2: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_coherence_assign() {
+  // The strong-coherence is: for every indexes i and j
+  // m_i_j <= (m_i_ci + m_cj_j)/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  DIRTY_TEMP(N, semi_sum);
+  for (typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin(),
+         i_end = matrix.row_end(); i_iter != i_end; ++i_iter) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i_iter;
+    const dimension_type i = i_iter.index();
+    const N& x_i_ci = x_i[coherent_index(i)];
+    // Avoid to do unnecessary sums.
+    if (!is_plus_infinity(x_i_ci))
+      for (dimension_type j = 0, rs_i = i_iter.row_size(); j < rs_i; ++j)
+        if (i != j) {
+          const N& x_cj_j = matrix[coherent_index(j)][j];
+          if (!is_plus_infinity(x_cj_j)) {
+            add_assign_r(semi_sum, x_i_ci, x_cj_j, ROUND_UP);
+            div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+            min_assign(x_i[j], semi_sum);
+          }
+        }
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::tight_coherence_would_make_empty() const {
+  assert(std::numeric_limits<N>::is_integer);
+  assert(marked_strongly_closed());
+  const dimension_type space_dim = space_dimension();
+  for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+    const dimension_type ci = i+1;
+    const N& mat_i_ci = matrix[i][ci];
+    if (!is_plus_infinity(mat_i_ci)
+        // Check for oddness of `mat_i_ci'.
+        && !is_even(mat_i_ci)
+        // Check for zero-equivalence of `i' and `ci'.
+        && is_additive_inverse(mat_i_ci, matrix[ci][i]))
+      return true;
+  }
+  return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::incremental_strong_closure_assign(const Variable var) const {
+  // `var' should be one of the dimensions of the octagon.
+  if (var.id() >= space_dim)
+    throw_dimension_incompatible("incremental_strong_closure_assign(v)",
+                                 var.id());
+
+  // Do something only if necessary.
+  if (marked_empty() || marked_strongly_closed())
+    return;
+
+  // Zero-dimensional octagons are necessarily strongly closed.
+  if (space_dim == 0)
+    return;
+
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+
+  const Row_Iterator m_begin = x.matrix.row_begin();
+  const Row_Iterator m_end = x.matrix.row_end();
+
+  // Fill the main diagonal with zeros.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    assert(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
+
+  // Using the incremental Floyd-Warshall algorithm.
+  // Step 1: Improve all constraints on variable `var'.
+  const dimension_type v = 2*var.id();
+  const dimension_type cv = v+1;
+  Row_Iterator v_iter = m_begin + v;
+  Row_Iterator cv_iter = v_iter + 1;
+  Row_Reference x_v = *v_iter;
+  Row_Reference x_cv = *cv_iter;
+  const dimension_type rs_v = v_iter.row_size();
+  const dimension_type n_rows = x.matrix.num_rows();
+  DIRTY_TEMP(N, sum);
+  for (Row_Iterator k_iter = m_begin; k_iter != m_end; ++k_iter) {
+    const dimension_type k = k_iter.index();
+    const dimension_type ck = coherent_index(k);
+    const dimension_type rs_k = k_iter.row_size();
+    Row_Reference x_k = *k_iter;
+    Row_Reference x_ck = (k%2) ? *(k_iter-1) : *(k_iter+1);
+
+    for (Row_Iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+      const dimension_type i = i_iter.index();
+      const dimension_type ci = coherent_index(i);
+      const dimension_type rs_i = i_iter.row_size();
+      Row_Reference x_i = *i_iter;
+      Row_Reference x_ci = (i%2) ? *(i_iter-1) : *(i_iter+1);
+
+      const N& x_i_k = (k < rs_i) ? x_i[k] : x_ck[ci];
+      if (!is_plus_infinity(x_i_k)) {
+        const N& x_k_v = (v < rs_k) ? x_k[v] : x_cv[ck];
+        if (!is_plus_infinity(x_k_v)) {
+          add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+          N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+          min_assign(x_i_v, sum);
+        }
+        const N& x_k_cv = (cv < rs_k) ? x_k[cv] : x_v[ck];
+        if (!is_plus_infinity(x_k_cv)) {
+          add_assign_r(sum, x_i_k, x_k_cv, ROUND_UP);
+          N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+          min_assign(x_i_cv, sum);
+        }
+      }
+      const N& x_k_i = (i < rs_k) ? x_k[i] : x_ci[ck];
+      if (!is_plus_infinity(x_k_i)) {
+        const N& x_v_k = (k < rs_v) ? x_v[k] : x_ck[cv];
+        if (!is_plus_infinity(x_v_k)) {
+          N& x_v_i = (i < rs_v) ? x_v[i] : x_ci[cv];
+          add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+          min_assign(x_v_i, sum);
+        }
+        const N& x_cv_k = (k < rs_v) ? x_cv[k] : x_ck[v];
+        if (!is_plus_infinity(x_cv_k)) {
+          N& x_cv_i = (i < rs_v) ? x_cv[i] : x_ci[v];
+          add_assign_r(sum, x_cv_k, x_k_i, ROUND_UP);
+          min_assign(x_cv_i, sum);
+        }
+      }
+
+    }
+  }
+
+  // Step 2: improve the other bounds by using the precise bounds
+  // for the constraints on `var'.
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    Row_Reference x_i = *i_iter;
+    Row_Reference x_ci = (i%2) ? *(i_iter-1) : *(i_iter+1);
+    const N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+    // TODO: see if it is possible to optimize this inner loop
+    // by splitting it into several parts, so as to avoid
+    // conditional expressions.
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      Row_Reference x_cj = *(m_begin+cj);
+      N& x_i_j = (j < rs_i) ? x_i[j] : x_cj[ci];
+      if (!is_plus_infinity(x_i_v)) {
+        const N& x_v_j = (j < rs_v) ? x_v[j] : x_cj[cv];
+        if (!is_plus_infinity(x_v_j)) {
+          add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+      const N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+      if (!is_plus_infinity(x_i_cv)) {
+        const N& x_cv_j = (j < rs_v) ? x_cv[j] : x_cj[v];
+        if (!is_plus_infinity(x_cv_j)) {
+          add_assign_r(sum, x_i_cv, x_cv_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value on the main diagonal.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      // Restore PLUS_INFINITY on the main diagonal.
+      assert(sgn(x_i_i) == 0);
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // Step 3: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_successors(std::vector<dimension_type>& successor) const {
+  assert(!marked_empty() && marked_strongly_closed());
+  assert(successor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `successor' is used to indicate which variable
+  // immediately follows a given one in the corresponding equivalence class.
+  const dimension_type successor_size = matrix.num_rows();
+  // Initially, each variable is successor of its own zero-equivalence class.
+  successor.reserve(successor_size);
+  for (dimension_type i = 0; i < successor_size; ++i)
+    successor.push_back(i);
+  // Now compute actual successors.
+  for (dimension_type i = successor_size; i-- > 0; )  {
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin()+i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    typename OR_Matrix<N>::const_row_reference_type m_ci = (i%2) ?
+          *(i_iter-1) : *(i_iter+1);
+    for (dimension_type j = 0; j < i; ++j) {
+    //for (dimension_type j = i; j-- > 0; ) {
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as successor the variable having the greatest index.
+        successor[j] = i;
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& leaders) const {
+  assert(!marked_empty() && marked_strongly_closed());
+  assert(leaders.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `leaders' is used to indicate the smallest variable
+  // that belongs to the corresponding equivalence class.
+  const dimension_type leader_size = matrix.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  leaders.reserve(leader_size);
+  for (dimension_type i = 0; i < leader_size; ++i)
+    leaders.push_back(i);
+  // Now compute actual leaders.
+  for (typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end();
+       i_iter != matrix_row_end; ++i_iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    dimension_type i = i_iter.index();
+    typename OR_Matrix<N>::const_row_reference_type m_ci =
+      (i%2) ? *(i_iter-1) : *(i_iter+1);
+    for (dimension_type j = 0; j < i; ++j) {
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as leader the variable having the smaller index.
+        leaders[i] = leaders[j];
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& successor,
+                  std::vector<dimension_type>& no_sing_leaders,
+                  bool& exist_sing_class,
+                  dimension_type& sing_leader) const {
+  assert(!marked_empty() && marked_strongly_closed());
+  assert(no_sing_leaders.size() == 0);
+  dimension_type successor_size = successor.size();
+  std::deque<bool> dealt_with(successor_size, false);
+  for (dimension_type i = 0; i < successor_size; ++i) {
+    dimension_type next_i = successor[i];
+    if (!dealt_with[i]) {
+      // The index is a leader.
+      // Now check if it is a leader of a singular class or not.
+      if (next_i == coherent_index(i)) {
+        exist_sing_class = true;
+        sing_leader = i;
+      }
+      else
+        no_sing_leaders.push_back(i);
+    }
+    // The following index isn't a leader.
+    dealt_with[next_i] = true;
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_reduction_assign() const {
+  // Zero-dimensional Octagonal shapes are necessarily reduced.
+  if (space_dim == 0)
+    return;
+
+  // First find the tightest constraints for this octagon.
+  strong_closure_assign();
+
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is strongly
+  // closed, this happens if and only if matrix[i][j] == -matrix[ci][cj].
+  std::vector<dimension_type> no_sing_leaders;
+  dimension_type sing_leader = 0;
+  bool exist_sing_class = false;
+  std::vector<dimension_type> successor;
+  compute_successors(successor);
+  compute_leaders(successor, no_sing_leaders, exist_sing_class, sing_leader);
+  const dimension_type num_no_sing_leaders = no_sing_leaders.size();
+
+  Octagonal_Shape aux(space_dim);
+  // Step 2: add to auxiliary octagon only non-redundant
+  // constraints and construct a 0-cycle using only
+  // the leaders of the non-singular classes.
+  for (dimension_type li = 0; li < num_no_sing_leaders; ++li) {
+    const dimension_type i = no_sing_leaders[li];
+    const dimension_type ci = coherent_index(i);
+    typename OR_Matrix<N>::const_row_reference_type m_i =
+      *(matrix.row_begin()+i);
+    typename OR_Matrix<N>::row_reference_type aux_i =
+      *(aux.matrix.row_begin()+i);
+    if (i%2 == 0) {
+      // Each positive equivalence class must have a single 0-cycle
+      // connecting all equivalent variables in increasing order.
+      // Note: by coherence assumption, the variables in the
+      // corresponding negative equivalence class are
+      // automatically connected.
+      if (i != successor[i]) {
+        dimension_type j = i;
+        dimension_type next_j = successor[j];
+        while (j != next_j) {
+          aux.matrix[next_j][j] = matrix[next_j][j];
+          j = next_j;
+          next_j = successor[j];
+        }
+        const dimension_type cj = coherent_index(j);
+        aux.matrix[cj][ci] = matrix[cj][ci];
+      }
+    }
+
+    dimension_type rs_li = (li%2) ? li :li+1;
+    // Check if the constraint is redundant.
+    DIRTY_TEMP(N, tmp);
+    for (dimension_type lj = 0 ; lj <= rs_li; ++lj) {
+      const dimension_type j = no_sing_leaders[lj];
+      const dimension_type cj = coherent_index(j);
+      const N& m_i_j = m_i[j];
+      const N& m_i_ci = m_i[ci];
+      bool to_add = true;
+      // Control if the constraint is redundant by strong-coherence,
+      // that is:
+      // m_i_j >= (m_i_ci + m_cj_j)/2,   where j != ci.
+      if (j != ci) {
+        add_assign_r(tmp, m_i_ci, matrix[cj][j], ROUND_UP);
+        div2exp_assign_r(tmp, tmp, 1, ROUND_UP);
+        if (m_i_j >= tmp) {
+          to_add = false;
+          continue;
+        }
+      }
+      // Control if the constraint is redundant by strong closure, that is
+      // if there is a path from i to j (i = i_0, ... , i_n = j), such that
+      // m_i_j = sum_{k=0}^{n-1} m_{i_k}_{i_(k+1)}.
+      // Since the octagon is already strongly closed, the above relation
+      // is reduced to three case, in accordance with k, i, j inter-depend:
+      // exit k such that
+      // 1.) m_i_j >= m_i_k   + m_cj_ck,   if k < j < i; or
+      // 2.) m_i_j >= m_i_k   + m_k,_j,    if j < k < i; or
+      // 3.) m_i_j >= m_ck_ci + m_k_j,     if j < i < k.
+      // Note: `i > j'.
+      for (dimension_type lk = 0; lk < num_no_sing_leaders; ++lk) {
+        const dimension_type k = no_sing_leaders[lk];
+        if (k != i && k != j) {
+          dimension_type ck = coherent_index(k);
+          if (k < j)
+            // Case 1.
+            add_assign_r(tmp, m_i[k], matrix[cj][ck], ROUND_UP);
+          else if (k < i)
+            // Case 2.
+            add_assign_r(tmp, m_i[k], matrix[k][j], ROUND_UP);
+          else
+            // Case 3.
+            add_assign_r(tmp, matrix[ck][ci], matrix[k][j], ROUND_UP);
+
+          // Checks if the constraint is redundant.
+          if (m_i_j >= tmp) {
+            to_add = false;
+            break;
+          }
+        }
+      }
+
+      // The constraint is not redundant.
+      if (to_add)
+        aux_i[j] = m_i_j;
+    }
+  }
+
+  // If there exist a singular equivalence class, then it must have a
+  // single 0-cycle connecting all the positive and negative equivalent
+  // variables.
+  // Note: the singular class is not connected with the other classes.
+  if (exist_sing_class) {
+    aux.matrix[sing_leader][sing_leader+1]
+      = matrix[sing_leader][sing_leader+1];
+    if (successor[sing_leader+1] != sing_leader+1) {
+      dimension_type j = sing_leader;
+      dimension_type next_jj = successor[j+1];
+      while (next_jj != j+1) {
+        aux.matrix[next_jj][j] = matrix[next_jj][j];
+        j = next_jj;
+        next_jj = successor[j+1];
+      }
+      aux.matrix[j+1][j] = matrix[j+1][j];
+    }
+    else
+      aux.matrix[sing_leader+1][sing_leader]
+        = matrix[sing_leader+1][sing_leader];
+  }
+
+  Octagonal_Shape<T>& x = const_cast<Octagonal_Shape<T>&>(*this);
+  aux.reset_strongly_closed();
+
+#ifndef NDEBUG
+  {
+    // We assume that `aux' is equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = aux;
+    assert(x_copy == y_copy);
+  }
+#endif
+
+  std::swap(x, aux);
+  assert(is_strongly_reduced());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>::oct_hull_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("oct_hull_assign(y)", y);
+
+  // The hull of an octagon `x' with an empty octagon is `x'.
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The oct-hull is obtained by computing maxima.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end; ++i, ++j)
+    max_assign(*i, *j);
+
+  // The result is still closed.
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::oct_difference_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("oct_difference_assign(y)", y);
+
+  Octagonal_Shape& x = *this;
+
+  // Being lazy here is only harmful.
+  // We close.
+  x.strong_closure_assign();
+  // The difference of an empty octagon and of an octagon `p' is empty.
+  if (x.marked_empty())
+    return;
+  // The difference of a octagon `p' and an empty octagon is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both octagons are zero-dimensional,
+  // then at this point they are necessarily universe octagons,
+  // so that their difference is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  Octagonal_Shape new_oct(space_dim, EMPTY);
+  // We take a constraint of the octagon y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementaries with the octagon x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the octagon `x' is included the octagon defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty octagon, and as we would obtain
+    // a result that is less precise than the oct_difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    Octagonal_Shape z = x;
+    const Linear_Expression e = Linear_Expression(c);
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_oct.oct_hull_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_oct.oct_hull_assign(z);
+    }
+  }
+  *this = new_oct;
+  assert(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>
+::simplify_using_context_assign(const Octagonal_Shape& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_embed(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type new_dim = space_dim + m;
+  const bool was_zero_dim_univ = !marked_empty() && space_dim == 0;
+
+  // To embed an n-dimension space octagon in a (n+m)-dimension space,
+  // we just add `m' variables in the matrix of constraints.
+  matrix.grow(new_dim);
+  space_dim = new_dim;
+  // If `*this' was the zero-dim space universe octagon,
+  // then we can set the strongly closure flag.
+  if (was_zero_dim_univ)
+    set_strongly_closed();
+
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_project(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type n = matrix.num_rows();
+
+  // To project an n-dimension space OS in a (space_dim+m)-dimension space,
+  // we just add `m' columns and rows in the matrix of constraints.
+  add_space_dimensions_and_embed(m);
+  // We insert 0 where it needs.
+  // Attention: now num_rows of matrix is update!
+  for (typename OR_Matrix<N>::row_iterator i = matrix.row_begin() + n,
+         matrix_row_end =  matrix.row_end(); i != matrix_row_end; i += 2) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i;
+    typename OR_Matrix<N>::row_reference_type x_ci = *(i+1);
+    const dimension_type ind = i.index();
+    assign_r(x_i[ind+1], 0, ROUND_NOT_NEEDED);
+    assign_r(x_ci[ind], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a octagon in a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_removed.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - to_be_removed.size();
+
+  strong_closure_assign();
+  // When removing _all_ dimensions from an octagon,
+  // we obtain the zero-dimensional octagon.
+  if (new_space_dim == 0) {
+    matrix.shrink(0);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    space_dim = 0;
+    assert(OK());
+    return;
+  }
+
+  // We consider every variable and we check if it is to be removed.
+  // If it is to be removed, we pass to the successive one, elsewhere
+  // we move its elements in the right position.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  dimension_type ftr = *tbr;
+  dimension_type ftr_size = 2*ftr*(ftr+1);
+  typename OR_Matrix<N>::element_iterator
+    iter = matrix.element_begin()+ftr_size;
+
+  dimension_type i = ftr + 1;
+  while (i < space_dim) {
+    if (to_be_removed.count(i) != 0)
+      ++i;
+    else {
+      typename OR_Matrix<N>::row_iterator
+        row_iter = matrix.row_begin()+2*i;
+      typename OR_Matrix<N>::row_reference_type
+        row_ref = *row_iter;
+      typename OR_Matrix<N>::row_reference_type
+        row_ref1 = *(++row_iter);
+      // If variable(j) is to remove, we pass another variable,
+      // else we shift its cells to up right.
+      // Attention: first we shift the cells corrispondent to the first
+      // row of variable(j), then we shift the cells corrispondent to the
+      // second row. We recall that every variable is represented
+      // in the `matrix' by two rows and two rows.
+      for (dimension_type j = 0; j <= i; ++j)
+        if (to_be_removed.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref[2*j]);
+          assign_or_swap(*(iter++), row_ref[2*j+1]);
+        }
+      for (dimension_type j = 0; j <= i; ++j)
+        if (to_be_removed.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref1[2*j]);
+          assign_or_swap(*(iter++), row_ref1[2*j+1]);
+        }
+      ++i;
+    }
+  }
+  // Update the space dimension.
+  matrix.shrink(new_space_dim);
+  space_dim = new_space_dim;
+  assert(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+Octagonal_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the octagon becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    strong_closure_assign();
+
+  // If the octagon is empty, then it is sufficient to adjust
+  // the space dimension of the octagon.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // We create a new matrix with the new space dimension.
+  OR_Matrix<N> x(new_space_dim);
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+
+  Row_Iterator m_begin = x.row_begin();
+  Row_Iterator m_end = x.row_end();
+
+  for (Row_Iterator i_iter = matrix.row_begin(), i_end = matrix.row_end();
+       i_iter != i_end; i_iter += 2) {
+    dimension_type new_i;
+    dimension_type i = i_iter.index()/2;
+    // We copy and place in the position into `x' the only cells of
+    // the `matrix' that refer to both mapped variables,
+    // the variable `i' and `j'.
+    if (pfunc.maps(i, new_i)) {
+      Row_Reference r_i = *i_iter;
+      Row_Reference r_ii = *(i_iter + 1);
+      dimension_type double_new_i = 2*new_i;
+      Row_Iterator x_iter = m_begin + double_new_i;
+      Row_Reference x_i = *x_iter;
+      Row_Reference x_ii = *(x_iter + 1);
+      for (dimension_type j = 0; j <= i; ++j) {
+        dimension_type new_j;
+        // If also the second variable is mapped, we work.
+        if (pfunc.maps(j, new_j)) {
+          dimension_type dj = 2*j;
+          dimension_type double_new_j = 2*new_j;
+          // Mapped the constraints, exchanging the indexes.
+          // Attention: our matrix is pseudo-triangular.
+          // If new_j > new_i, we must consider, as rows, the rows of
+          // the variable new_j, and not of new_i ones.
+          if (new_i >= new_j) {
+            assign_or_swap(x_i[double_new_j], r_i[dj]);
+            assign_or_swap(x_ii[double_new_j], r_ii[dj]);
+            assign_or_swap(x_ii[double_new_j+1], r_ii[dj + 1]);
+            assign_or_swap(x_i[double_new_j+1], r_i[dj + 1]);
+          }
+          else {
+            Row_Iterator xj_iter = m_begin + double_new_j;
+            Row_Reference x_j = *xj_iter;
+            Row_Reference x_jj = *(xj_iter + 1);
+            assign_or_swap(x_jj[double_new_i+1], r_i[dj]);
+            assign_or_swap(x_jj[double_new_i], r_ii[dj]);
+            assign_or_swap(x_j[double_new_i+1], r_i[dj+1]);
+            assign_or_swap(x_j[double_new_i], r_ii[dj+1]);
+          }
+
+        }
+      }
+    }
+  }
+
+  std::swap(matrix, x);
+  space_dim = new_space_dim;
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::intersection_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two octagons is empty, the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+  // If both octagons are zero-dimensional,then at this point
+  // they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two octagons we compare the constraints
+  // and we choose the less values.
+  bool changed = false;
+
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+    const N& y_elem = *j;
+    if (y_elem < elem) {
+      elem = y_elem;
+      changed = true;
+    }
+  }
+
+  // This method not preserve the closure.
+  if (changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                              Iterator first, Iterator last,
+                                              unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If both octagons are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  strong_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.strong_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    const N& y_elem = *j;
+    N& elem = *i;
+    if (y_elem < elem) {
+      Iterator k = std::lower_bound(first, last, elem);
+      if (k != last) {
+        if (elem < *k)
+          assign_r(elem, *k, ROUND_UP);
+      }
+      else
+assign_r(        elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::get_limiting_octagon(const Constraint_System& cs,
+                       Octagonal_Shape& limiting_octagon) const {
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  assert(cs_space_dim <= space_dim);
+
+  strong_closure_assign();
+  bool is_oct_changed = false;
+
+  // Allocate temporaries outside of the loop.
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  DIRTY_TEMP(N, d);
+
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not octagonal differences are ignored.
+    if (!extract_octagonal_difference(c, cs_space_dim, num_vars, i, j,
+                                      coeff, term))
+      continue;
+
+    typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+    typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+    typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+    typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+    Row_iterator m_begin = matrix.row_begin();
+    // Select the cell to be modified for the "<=" part of the constraint.
+    Row_iterator i_iter = m_begin + i;
+    Row_reference m_i = *i_iter;
+    OR_Matrix<N>& lo_mat = limiting_octagon.matrix;
+    Row_Iterator lo_iter = lo_mat.row_begin() + i;
+    Row_Reference lo_m_i = *lo_iter;
+    N& lo_m_i_j = lo_m_i[j];
+    if (coeff < 0)
+      neg_assign(coeff);
+    // Compute the bound for `m_i_j', rounding towards plus infinity.
+    div_round_up(d, term, coeff);
+    if (m_i[j] <= d)
+      if (c.is_inequality()) {
+        if (lo_m_i_j > d) {
+          lo_m_i_j = d;
+          is_oct_changed = true;
+        }
+        else {
+          // Select the right row of the cell.
+          if (i%2 == 0) {
+            ++i_iter;
+            ++lo_iter;
+          }
+          else {
+            --i_iter;
+            --lo_iter;
+          }
+          Row_reference m_ci = *i_iter;
+          Row_Reference lo_m_ci = *lo_iter;
+          // Select the right column of the cell.
+          dimension_type cj = coherent_index(j);
+          N& lo_m_ci_cj = lo_m_ci[cj];
+          neg_assign(term);
+          div_round_up(d, term, coeff);
+          if (m_ci[cj] <= d && lo_m_ci_cj > d) {
+            lo_m_ci_cj = d;
+            is_oct_changed = true;
+          }
+        }
+      }
+  }
+  // In general, adding a constraint does not preserve the strongly
+  // closure of the octagon.
+  if (is_oct_changed && limiting_octagon.marked_strongly_closed())
+    limiting_octagon.reset_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                    const Constraint_System& cs,
+                                    unsigned* tp) {
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::BHMZ05_widening_assign(const Octagonal_Shape& y,
+                                           unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  assert(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  assert(marked_strongly_closed() && y.marked_strongly_closed());
+  // Minimize `y'.
+  y.strong_reduction_assign();
+
+  // Extrapolate unstable bounds.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+       matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+    if (*j != elem)
+      assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                      const Constraint_System& cs,
+                                      unsigned* tp) {
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+  // The limited BHMZ05-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::CC76_narrowing_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
+
+  // If both octagons are zero-dimensional, since `*this' contains `y',
+  // we simply return '*this'.
+  if (space_dim == 0)
+    return;
+
+  y.strong_closure_assign();
+  // If `y' is empty, since `y' contains `*this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // We consider a constraint of `*this', if its value is `plus_infinity',
+  // we take the value of the corresponding constraint of `y'.
+  bool is_oct_changed = false;
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+       matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+     if (!is_plus_infinity(*i)
+         && !is_plus_infinity(*j)
+         && *i != *j) {
+      *i = *j;
+      is_oct_changed = true;
+    }
+  }
+
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_v_pm_u_bounds(const dimension_type v_id,
+                       const dimension_type last_id,
+                       const Linear_Expression& sc_expr,
+                       Coefficient_traits::const_reference sc_den,
+                       const N& ub_v) {
+  // Private method: the caller has to ensure the following.
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(ub_v));
+
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_cv = matrix[n_v+1];
+
+  // Speculatively allocate temporaries out of the loop.
+  DIRTY_TEMP(N, half);
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, minus_q);
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP0(mpq_class, lb_u);
+  DIRTY_TEMP(N, up_approx);
+  TEMP_INTEGER(minus_expr_u);
+
+  for (dimension_type u_id = last_id+1; u_id-- > 0; ) {
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id));
+    // Skip the case when `expr_u == 0'.
+    if (expr_u == 0)
+      continue;
+
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `v - u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_den) {
+        // Here q >= 1: deducing `v - u <= ub_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_cu_u / 2.
+        div2exp_assign_r(half, matrix[n_u+1][n_u], 1, ROUND_UP);
+        N& m_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v] : m_cv[n_u+1];
+        sub_assign_r(m_v_minus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u+1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v - u' is
+          // computed as `ub_v - (q * ub_u + (1-q) * lb_u)',
+          // i.e., `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+          assign_r(minus_lb_u, m_u_cu, ROUND_NOT_NEEDED);
+          div2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(ub_u, matrix[n_u+1][n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+          N& m_v_minus_u = (n_v < n_u) ? m_u[n_v] : m_cv[n_u+1];
+          add_assign_r(m_v_minus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      assert(expr_u < 0);
+      // If `expr_u' is negative, we can improve `v + u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_den) {
+        // Here q <= -1: Deducing `v + u <= ub_v + lb_u'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_u_cu / 2.
+        div2exp_assign_r(half, matrix[n_u][n_u+1], 1, ROUND_UP);
+        N& m_v_plus_u = (n_v < n_u) ? matrix[n_u+1][n_v] : m_cv[n_u];
+        sub_assign_r(m_v_plus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u+1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v + u' is
+          // computed as `ub_v + ((-q) * lb_u + (1+q) * ub_u)',
+          // i.e., `ub_v + ub_u + (-q) * (lb_u - ub_u)'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(minus_q, minus_expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(minus_q, minus_q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED);
+          div2exp_assign_r(lb_u, lb_u, 1, ROUND_NOT_NEEDED);
+          neg_assign_r(lb_u, lb_u, ROUND_NOT_NEEDED);
+          // Compute `lb_u - ub_u'.
+          sub_assign_r(lb_u, lb_u, ub_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u + (-q) * (lb_u - ub_u)'.
+          add_mul_assign_r(ub_u, minus_q, lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `v + u <= ub_v + ((-q) * lb_u + (1+q) * ub_u)'.
+          N& m_v_plus_u = (n_v < n_u) ? m_cu[n_v] : m_cv[n_u];
+          add_assign_r(m_v_plus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_minus_v_pm_u_bounds(const dimension_type v_id,
+                             const dimension_type last_id,
+                             const Linear_Expression& sc_expr,
+                             Coefficient_traits::const_reference sc_den,
+                             const N& minus_lb_v) {
+  // Private method: the caller has to ensure the following.
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(minus_lb_v));
+
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_v = matrix[n_v];
+
+  // Speculatively allocate temporaries out of the loop.
+  DIRTY_TEMP(N, half);
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP(N, up_approx);
+  TEMP_INTEGER(minus_expr_u);
+
+  for (dimension_type u_id = last_id+1; u_id-- > 0; ) {
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id));
+    // Skip the case when `expr_u == 0'.
+    if (expr_u == 0)
+      continue;
+
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `-v + u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_den) {
+        // Here q >= 1: deducing `-v + u <= lb_u - lb_v',
+        // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_u_cu / 2.
+        div2exp_assign_r(half, matrix[n_u][n_u+1], 1, ROUND_UP);
+        N& m_u_minus_v = (n_v < n_u) ? matrix[n_u+1][n_v+1] : m_v[n_u];
+        sub_assign_r(m_u_minus_v, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u+1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `u - v' is
+          // computed as `(q * lb_u + (1-q) * ub_u) - lb_v',
+          // i.e., `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED);
+          div2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(minus_lb_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `u - v <= -lb_v - (q * lb_u + (1-q) * ub_u)'.
+          N& m_u_minus_v = (n_v < n_u) ? m_cu[n_v+1] : m_v[n_u];
+          add_assign_r(m_u_minus_v, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      assert(expr_u < 0);
+      // If `expr_u' is negative, we can improve `-v - u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_den) {
+        // Here q <= -1: Deducing `-v - u <= -lb_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_cu_u / 2.
+        div2exp_assign_r(half, matrix[n_u+1][n_u], 1, ROUND_UP);
+        N& m_minus_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v+1] : m_v[n_u+1];
+        sub_assign_r(m_minus_v_minus_u, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u+1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `-v - u' is
+          // computed as `-lb_v - ((-q)*ub_u + (1+q)*lb_u)',
+          // i.e., `minus_lb_v - lb_u + q*(ub_u - lb_u)'.
+          assign_r(ub_u, matrix[n_u+1][n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, m_u[n_u+1], ROUND_NOT_NEEDED);
+          div2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `-lb_u + q*(ub_u - lb_u)'.
+          add_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `-v - u <= -lb_v - ((-q) * ub_u + (1+q) * lb_u)'.
+          N& m_minus_v_minus_u = (n_v < n_u) ? m_u[n_v+1] : m_v[n_u+1];
+          add_assign_r(m_minus_v_minus_u, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_all_octagonal_constraints(const dimension_type v_id) {
+  assert(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    assign_r(r_v[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_binary_octagonal_constraints(const dimension_type v_id) {
+  assert(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type k = n_v; k-- > 0; ) {
+    assign_r(r_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type dim = var.id();
+  if (space_dimension() < dim)
+    throw_dimension_incompatible("unconstrain(var)", dim);
+
+  // Enforce strong closure for precision.
+  strong_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  forget_all_octagonal_constraints(dim);
+  // Strong closure is preserved.
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Enforce strong closure for precision.
+  strong_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu)
+    forget_all_octagonal_constraints(*tbu);
+  // Strong closure is preserved.
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  assert(denominator != 0);
+  const dimension_type expr_space_dim = expr.space_dimension();
+  assert(space_dim >= expr_space_dim);
+  const dimension_type var_id = var.id();
+  assert(var_id <= space_dim);
+  assert(expr.coefficient(var) == 0);
+  assert(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+
+  // Variable index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*j + b, where `j != v';
+  // - If t == 2, the `expr' is of the general form.
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const dimension_type n_var = 2*var_id;
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  // Since we are only able to record octagonal differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.coefficient(Variable(w_id)) != denominator
+      && expr.coefficient(Variable(w_id)) != minus_den)
+    t = 2;
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+      add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  else if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    const dimension_type n_w = 2*w_id;
+    switch (relsym) {
+    case EQUAL:
+      if (w_coeff == denominator)
+        // Add the new constraint `var - w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w, n_var, b, denominator);
+          add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+        }
+        else {
+          add_octagonal_constraint(n_var+1, n_w+1, b, denominator);
+          add_octagonal_constraint(n_var, n_w, b, minus_den);
+        }
+      else
+        // Add the new constraint `var + w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w+1, n_var, b, denominator);
+          add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+        }
+        else {
+          add_octagonal_constraint(n_var+1, n_w, b, denominator);
+          add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+        }
+      break;
+    case LESS_OR_EQUAL:
+      {
+        DIRTY_TEMP(N, d);
+        div_round_up(d, b, denominator);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraints `v - w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var, d);
+          else
+            add_octagonal_constraint(n_var+1, n_w+1, d);
+        }
+        else if (w_coeff == minus_den) {
+          // Add the new constraints `v + w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w+1, n_var, d);
+          else
+            add_octagonal_constraint(n_var+1, n_w, d);
+        }
+        break;
+      }
+
+    case GREATER_OR_EQUAL:
+      {
+        DIRTY_TEMP(N, d);
+        div_round_up(d, b, minus_den);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraint `v - w >= b/denominator',
+          // i.e.,  `-v + w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w+1, n_var+1, d);
+          else
+            add_octagonal_constraint(n_var, n_w, d);
+        }
+        else if (w_coeff == minus_den) {
+          // Add the new constraints `v + w >= b/denominator',
+          // i.e.,  `-v - w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var+1, d);
+          else
+            add_octagonal_constraint(n_var, n_w+1, d);
+        }
+        break;
+      }
+
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  else {
+    // Here t == 2, so that
+    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+    const bool is_sc = (denominator > 0);
+    TEMP_INTEGER(minus_b);
+    neg_assign(minus_b, b);
+    const Coefficient& sc_b = is_sc ? b : minus_b;
+    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+    const Coefficient& sc_den = is_sc ? denominator : minus_den;
+    const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+    // when `denominator' is negative. Do not use it unless you are sure
+    // it has been correctly assigned.
+    Linear_Expression minus_expr;
+    if (!is_sc)
+      minus_expr = -expr;
+    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+    DIRTY_TEMP(N, sum);
+    // Index of variable that is unbounded in `this'.
+    // (The initialization is just to quiet a compiler warning.)
+    dimension_type pinf_index = 0;
+    // Number of unbounded variables found.
+    dimension_type pinf_count = 0;
+
+    switch (relsym) {
+    case EQUAL:
+      {
+        DIRTY_TEMP(N, neg_sum);
+        // Index of variable that is unbounded in `this'.
+        // (The initialization is just to quiet a compiler warning.)
+        dimension_type neg_pinf_index = 0;
+        // Number of unbounded variables found.
+        dimension_type neg_pinf_count = 0;
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+        assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        DIRTY_TEMP(N, coeff_i);
+        DIRTY_TEMP(N, half);
+        TEMP_INTEGER(minus_sc_i);
+        DIRTY_TEMP(N, minus_coeff_i);
+        // Note: indices above `w' can be disregarded, as they all have
+        // a zero coefficient in `sc_expr'.
+        for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_reference m_i = *m_iter;
+          ++m_iter;
+          Row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i > 0) {
+            assign_r(coeff_i, sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i+1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+          else if (sign_i < 0) {
+            neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+            assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i+1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+        }
+        // Return immediately if no approximation could be computed.
+        if (pinf_count > 1 && neg_pinf_count > 1) {
+          assert(OK());
+          return;
+        }
+
+        // In the following, strong closure will be definitely lost.
+        reset_strongly_closed();
+
+        // Exploit the upper approximation, if possible.
+        if (pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_den != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_den' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_den'
+            // and negating again the result.
+            DIRTY_TEMP(N, down_sc_den);
+            assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+            neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+            div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+          }
+          // Add the upper bound constraint, if meaningful.
+          if (pinf_count == 0) {
+            // Add the constraint `v <= sum'.
+            DIRTY_TEMP(N, double_sum);
+            mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+            matrix[n_var+1][n_var] = double_sum;
+            // Deduce constraints of the form `v +/- u', where `u != v'.
+            deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, sum);
+          }
+          else
+            // Here `pinf_count == 1'.
+            if (pinf_index != var_id) {
+              const Coefficient& ppi =
+                sc_expr.coefficient(Variable(pinf_index));
+              if (ppi == sc_den)
+                // Add the constraint `v - pinf_index <= sum'.
+                if (var_id < pinf_index)
+                  matrix[2*pinf_index][n_var] = sum;
+                else
+                  matrix[n_var+1][2*pinf_index+1] = sum;
+              else
+                if (ppi == minus_sc_den) {
+                  // Add the constraint `v + pinf_index <= sum'.
+                  if (var_id < pinf_index)
+                    matrix[2*pinf_index+1][n_var] = sum;
+                  else
+                    matrix[n_var+1][2*pinf_index] = sum;
+                }
+            }
+        }
+
+        // Exploit the lower approximation, if possible.
+        if (neg_pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_den != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_den' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_den'
+            // and negating again the result.
+            DIRTY_TEMP(N, down_sc_den);
+            assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+            neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+            div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+          }
+          // Add the lower bound constraint, if meaningful.
+          if (neg_pinf_count == 0) {
+            // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+            DIRTY_TEMP(N, double_neg_sum);
+            mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE);
+            matrix[n_var][n_var+1] = double_neg_sum;
+            // Deduce constraints of the form `-v +/- u', where `u != v'.
+            deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, neg_sum);
+          }
+          else
+            // Here `neg_pinf_count == 1'.
+            if (neg_pinf_index != var_id) {
+              const Coefficient& npi =
+                sc_expr.coefficient(Variable(neg_pinf_index));
+              if (npi == sc_den)
+                // Add the constraint `v - neg_pinf_index >= -neg_sum',
+                // i.e., `neg_pinf_index - v <= neg_sum'.
+                if (neg_pinf_index < var_id)
+                  matrix[n_var][2*neg_pinf_index] = neg_sum;
+                else
+                  matrix[2*neg_pinf_index+1][n_var+1] = neg_sum;
+              else
+                if (npi == minus_sc_den) {
+                  // Add the constraint `v + neg_pinf_index >= -neg_sum',
+                  // i.e., `-neg_pinf_index - v <= neg_sum'.
+                  if (neg_pinf_index < var_id)
+                    matrix[n_var][2*neg_pinf_index+1] = neg_sum;
+                  else
+                    matrix[2*neg_pinf_index][n_var+1] = neg_sum;
+                }
+            }
+        }
+        break;
+      }
+
+    case LESS_OR_EQUAL:
+      {
+        // Compute an upper approximation for `expr' into `sum',
+        // taking into account the sign of `denominator'.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        DIRTY_TEMP(N, coeff_i);
+        DIRTY_TEMP(N, approx_i);
+        TEMP_INTEGER(minus_sc_i);
+        // Note: indices above `w_id' can be disregarded, as they all have
+        // a zero coefficient in `expr'.
+        for (Row_Iterator m_iter = m_begin, m_end = m_iter + (2*w_id) + 2;
+             m_iter != m_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_Reference m_i = *m_iter;
+          ++m_iter;
+          Row_Reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i+1];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_den != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_den' is known to be
+          // positive, this amounts to rounding downwards, which is achieved
+          // by rounding upwards `minus_sc-den' and negating again the result.
+          DIRTY_TEMP(N, down_sc_den);
+          assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+          neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          DIRTY_TEMP(N, double_sum);
+          mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+          add_octagonal_constraint(n_var+1, n_var, double_sum);
+          // Deduce constraints of the form `v +/- u', where `u != v'.
+          deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              add_octagonal_constraint(pinf_ind, n_var, sum);
+            else
+              add_octagonal_constraint(n_var+1, pinf_ind+1, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_den) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                add_octagonal_constraint(pinf_ind+1, n_var, sum);
+              else
+                add_octagonal_constraint(n_var+1, pinf_ind, sum);
+            }
+          }
+        }
+        break;
+      }
+
+    case GREATER_OR_EQUAL:
+      {
+        // Compute an upper approximation for `-sc_expr' into `sum'.
+        // Note: approximating `-sc_expr' from above and then negating the
+        // result is the same as approximating `sc_expr' from below.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `-sc_expr'.
+        DIRTY_TEMP(N, coeff_i);
+        DIRTY_TEMP(N, approx_i);
+        TEMP_INTEGER(minus_sc_i);
+        for (Row_Iterator m_iter = m_begin, m_end = m_iter + (2*w_id) + 2;
+             m_iter != m_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_Reference m_i = *m_iter;
+          ++m_iter;
+          Row_Reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `-sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_i[n_i+1] : m_ci[n_i];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_den != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_den' is known to be positive,
+          // this amounts to rounding downwards, which is achieved by rounding
+          // upwards `minus_sc_den' and negating again the result.
+          DIRTY_TEMP(N, down_sc_den);
+          assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+          neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          DIRTY_TEMP(N, double_sum);
+          mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+          add_octagonal_constraint(n_var, n_var+1, double_sum);
+          // Deduce constraints of the form `-v +/- u', where `u != v'.
+          deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_den, sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              add_octagonal_constraint(n_var, pinf_ind, sum);
+            else
+              add_octagonal_constraint(pinf_ind+1, n_var, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_den) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                add_octagonal_constraint(n_var, pinf_ind+1, sum);
+              else
+                add_octagonal_constraint(pinf_ind, n_var+1, sum);
+            }
+          }
+        }
+        break;
+      }
+
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_image(const Variable var,
+                                 const Linear_Expression& expr,
+                                 Coefficient_traits::const_reference
+                                 denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id()+1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `expr'.
+  // The `expr' must not be in two or plus variables.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  TEMP_INTEGER(minus_den);
+  neg_assign_r(minus_den, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    // Add the constraint `var == b/denominator'.
+    add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+    add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_den) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Here `expr' is of the form: +/- denominator * v + b.
+        if (w_coeff == denominator) {
+          if (b == 0)
+            // The transformation is the identity function.
+            return;
+          else {
+            // Translate all the constraints on `var' adding or
+            // subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            DIRTY_TEMP(N, minus_d);
+            div_round_up(minus_d, b, minus_den);
+            Row_Iterator m_iter = m_begin + n_var;
+            N& m_v_cv = (*m_iter)[n_var+1];
+            ++m_iter;
+            N& m_cv_v = (*m_iter)[n_var];
+            ++m_iter;
+            // NOTE: delay update of m_v_cv and m_cv_v.
+            for ( ;m_iter != m_end; ++m_iter) {
+              Row_Reference m_i = *m_iter;
+              N& m_i_v = m_i[n_var];
+              add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+              N& m_i_cv = m_i[n_var+1];
+              add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+            }
+            // Now update m_v_cv and m_cv_v.
+            mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+            add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+            mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE);
+            add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+           }
+          reset_strongly_closed();
+        }
+
+        else {
+          // Here `w_coeff == -denominator'.
+          // Remove the binary constraints on `var'.
+          forget_binary_octagonal_constraints(var_id);
+           Row_Iterator m_iter = m_begin + n_var;
+          N& m_v_cv = (*m_iter)[n_var+1];
+          ++m_iter;
+          N& m_cv_v = (*m_iter)[n_var];
+          // Swap the unary constraints on `var'.
+          std::swap(m_v_cv, m_cv_v);
+          // Strong closure is not preserved.
+          reset_strongly_closed();
+          if (b != 0) {
+            // Translate all the constraints on `var' adding or
+            // subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            DIRTY_TEMP(N, minus_d);
+            div_round_up(minus_d, b, minus_den);
+            ++m_iter;
+            for ( ;m_iter != m_end; ++m_iter) {
+              Row_Reference m_i = *m_iter;
+              N& m_i_v = m_i[n_var];
+              add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+              N& m_i_cv = m_i[n_var+1];
+              add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+            }
+            mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+            add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+            mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE);
+            add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+          }
+          incremental_strong_closure_assign(var);
+         }
+      }
+
+      else {
+        // Here `w != var', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w = b/denominator'.
+        if (w_coeff == denominator)
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w, n_var, b, denominator);
+            add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+          }
+          else {
+            add_octagonal_constraint(n_var+1, n_w+1, b, denominator);
+            add_octagonal_constraint(n_var, n_w, b, minus_den);
+          }
+        else
+          // Add the new constraint `var + w = b/denominator'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w+1, n_var, b, denominator);
+            add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+          }
+          else {
+            add_octagonal_constraint(n_var+1, n_w, b, denominator);
+            add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+          }
+        incremental_strong_closure_assign(var);
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  DIRTY_TEMP(N, pos_sum);
+  DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  DIRTY_TEMP(N, coeff_i);
+  DIRTY_TEMP(N, minus_coeff_i);
+  DIRTY_TEMP(N, half);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i+1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i+1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
+
+  // Remove all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    assert(OK());
+    return;
+  }
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      DIRTY_TEMP(N, double_pos_sum);
+      mul2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_IGNORE);
+      matrix[n_var+1][n_var] = double_pos_sum;
+      // Deduce constraints of the form `v +/- u', where `u != v'.
+      deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != var_id) {
+        const Coefficient& ppi = sc_expr.coefficient(Variable(pos_pinf_index));
+        if (ppi == sc_den)
+          // Add the constraint `v - pos_pinf_index <= pos_sum'.
+          if (var_id < pos_pinf_index)
+            matrix[2*pos_pinf_index][n_var] = pos_sum;
+          else
+            matrix[n_var+1][2*pos_pinf_index+1] = pos_sum;
+        else
+          if (ppi == minus_sc_den) {
+            // Add the constraint `v + pos_pinf_index <= pos_sum'.
+            if (var_id < pos_pinf_index)
+              matrix[2*pos_pinf_index+1][n_var] = pos_sum;
+            else
+              matrix[n_var+1][2*pos_pinf_index] = pos_sum;
+          }
+      }
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DIRTY_TEMP(N, double_neg_sum);
+      mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE);
+      matrix[n_var][n_var+1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_den)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index+1][n_var+1] = neg_sum;
+        else
+          if (npi == minus_sc_den) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index+1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var+1] = neg_sum;
+          }
+      }
+  }
+
+  incremental_strong_closure_assign(var);
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_preimage(const Variable var,
+                                    const Linear_Expression& expr,
+                                    Coefficient_traits::const_reference
+                                    denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id()+1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of the non-zero coefficients of `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == -denominator) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, w_coeff);
+      }
+      else {
+        // `expr == w_coeff*w + b', where `w != var'.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        assert(OK());
+      }
+      return;
+    }
+  }
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& coeff_v = expr.coefficient(var);
+  if (coeff_v != 0) {
+    if (coeff_v > 0) {
+      // The transformation is invertible.
+      Linear_Expression inverse = ((coeff_v + denominator)*var);
+      inverse -= expr;
+      affine_image(var, inverse, coeff_v);
+    }
+    else {
+      // The transformation is invertible.
+      TEMP_INTEGER(minus_coeff_v);
+      neg_assign(minus_coeff_v, coeff_v);
+      Linear_Expression inverse = ((minus_coeff_v - denominator)*var);
+      inverse += expr;
+      affine_image(var, inverse, minus_coeff_v);
+    }
+  }
+  else {
+    // The transformation is not invertible: all constraints on `var' are lost.
+    forget_all_octagonal_constraints(var_id);
+    assert(OK());
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression&  expr ,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", "e",
+                                 expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var.id()+1);
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+                    "r is a strict relation symbol and "
+                    "*this is an Octagonal_Shape");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `expr'.
+  // The `expr' must not be in two or plus variables.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  TEMP_INTEGER(minus_den);
+  neg_assign_r(minus_den, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr = b.
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    // Strong closure is lost.
+    reset_strongly_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= n/denominator',
+      // i.e., `-var <= -b/denominator'.
+      add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_den) {
+      // Case 2: expr == w_coeff*w + b, with w_coeff == +/- denominator.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        {
+          DIRTY_TEMP(N, d);
+          div_round_up(d, b, denominator);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate all the constraints of the form `v - w <= cost'
+              // into the constraint `v - w <= cost + b/denominator';
+              // forget each constraint `w - v <= cost1'.
+              Row_Iterator m_iter = m_begin + n_var;
+              Row_Reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var+1];
+              ++m_iter;
+              Row_Reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ;m_iter != m_end; ++m_iter) {
+                Row_Reference m_i = *m_iter;
+                N& m_i_v = m_i[n_var];
+                add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+                assign_r(m_i[n_var+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                assign_r(m_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_cv[k], m_cv[k], d, ROUND_UP);
+              }
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_v_cv = matrix[n_var][n_var+1];
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(matrix[n_var+1][n_var], m_v_cv, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is the form
+            // +/- denominator*w + b.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            if (w_coeff == denominator) {
+              // Add the new constraint `v - w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var+1, n_w+1, b, denominator);
+            }
+            else {
+              // Add the new constraint `v + w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w+1, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var+1, n_w, b, denominator);
+            }
+          }
+          break;
+        }
+
+      case GREATER_OR_EQUAL:
+        {
+          DIRTY_TEMP(N, d);
+          div_round_up(d, b, minus_den);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate each constraint `w - v <= cost'
+              // into the constraint `w - v <= cost - b/denominator';
+              // forget each constraint `v - w <= cost1'.
+              Row_Iterator m_iter = m_begin + n_var;
+              Row_Reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var+1];
+              ++m_iter;
+              Row_Reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ;m_iter != m_end; ++m_iter) {
+                Row_Reference m_i = *m_iter;
+                assign_r(m_i[n_var], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_i[n_var+1], m_i[n_var+1], d, ROUND_UP);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                add_assign_r(m_v[k], m_v[k], d, ROUND_UP);
+                assign_r(m_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(m_v_cv, m_v_cv, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_cv_v = matrix[n_var+1][n_var];
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(matrix[n_var][n_var+1], m_cv_v, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is of the form
+            // +/-denominator * w + b, with `w != v'.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            // We have got an expression of the following form:
+            // var1 + n, with `var1' != `var'.
+            // We remove all constraints of the form `var (+/- var1) >= const'
+            // and we add the new constraint `var +/- var1 >= n/denominator'.
+            if (w_coeff == denominator) {
+              // Add the new constraint `var - w >= b/denominator',
+              // i.e., `w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+              else
+                add_octagonal_constraint(n_var, n_w, b, minus_den);
+            }
+            else {
+              // Add the new constraint `var + w >= b/denominator',
+              // i.e., `-w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+              else
+                add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+            }
+          }
+          break;
+        }
+
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->matrix'.
+  // (The initialization is just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    {
+      // Compute an upper approximation for `sc_expr' into `sum'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      // Approximate the homogeneous part of `sc_expr'.
+      DIRTY_TEMP(N, coeff_i);
+      DIRTY_TEMP(N, approx_i);
+      TEMP_INTEGER(minus_sc_i);
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i+1];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+      // Remove all constraints on `v'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        assert(OK());
+        return;
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_den' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_den' and negating again the result.
+        DIRTY_TEMP(N, down_sc_den);
+        assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+        neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+        // Add the constraint `v <= pos_sum'.
+        DIRTY_TEMP(N, double_sum);
+        mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+        matrix[n_var+1][n_var] = double_sum;
+        // Deduce constraints of the form `v +/- u', where `u != v'.
+        deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              matrix[2*pinf_index][n_var] = sum;
+            else
+              matrix[n_var+1][2*pinf_index+1] = sum;
+          }
+          else {
+            if (pi == minus_den) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                matrix[2*pinf_index+1][n_var] = sum;
+              else
+                matrix[n_var+1][2*pinf_index] = sum;
+            }
+          }
+        }
+      break;
+    }
+
+  case GREATER_OR_EQUAL:
+    {
+      // Compute an upper approximation for `-sc_expr' into `sum'.
+      // Note: approximating `-sc_expr' from above and then negating the
+      // result is the same as approximating `sc_expr' from below.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, minus_sc_b, ROUND_UP);
+      DIRTY_TEMP(N, coeff_i);
+      TEMP_INTEGER(minus_sc_i);
+      DIRTY_TEMP(N, approx_i);
+      // Approximate the homogeneous part of `-sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `-sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_i[n_i+1] : m_ci[n_i];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Remove all constraints on `var'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        assert(OK());
+        return;
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_den' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_den' and negating again the result.
+        DIRTY_TEMP(N, down_sc_den);
+        assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+        neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+        // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+        DIRTY_TEMP(N, double_sum);
+        mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+        matrix[n_var][n_var+1] = double_sum;
+        // Deduce constraints of the form `-v +/- u', where `u != v'.
+        deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              matrix[n_var][2*pinf_index] = sum;
+            else
+              matrix[2*pinf_index+1][n_var+1] = sum;
+          }
+          else {
+            if (pi == minus_den) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                matrix[n_var][2*pinf_index+1] = sum;
+              else
+                matrix[2*pinf_index][n_var+1] = sum;
+            }
+          }
+        }
+      break;
+    }
+
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+  }
+  incremental_strong_closure_assign(var);
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                             const Relation_Symbol relsym,
+                                             const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is an Octagonal_Shape");
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
+    }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is an octagonal difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs' or
+    // `rhs == a*v + a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not an octagonal difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, den);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
+
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // an octagonal difference (since it has 3 variables at least).
+      // Thus, the method add_constraint() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= new_var);
+        break;
+      case EQUAL:
+        add_constraint(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_image(const Variable var,
+                                         const Linear_Expression& lb_expr,
+                                         const Linear_Expression& ub_expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 var.id()+1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lb_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `lb_expr', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `lb_expr'.
+  // The `expr' must not be in two or plus variables.
+  for (dimension_type i = lb_space_dim; i-- > 0; )
+    if (lb_expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = lb_expr.inhomogeneous_term();
+  TEMP_INTEGER(minus_den);
+  neg_assign_r(minus_den, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `lb_expr':
+  // - If t == 0, then lb_expr == b, with `b' a constant;
+  // - If t == 1, then lb_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `lb_expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: lb_expr == b.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    // Add the constraint `var >= b/denominator'.
+    add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `lb_expr'.
+    const Coefficient& w_coeff = lb_expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_den) {
+      // Case 2: lb_expr = w_coeff*w + b, with w_coeff = +/- denominator.
+     if (w_id == var_id) {
+        // Here `var' occurs in `lb_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var = Variable(space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `lb_expr'.
+        // Here `lb_expr' is of the form: +/- denominator * v + b.
+        affine_image(new_var, lb_expr, denominator);
+        // Enforce the strong closure for precision.
+        strong_closure_assign();
+        assert(!marked_empty());
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Now apply the affine lower bound, as recorded in `new_var'
+        add_constraint(var >= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(space_dim-1);
+        return;
+      }
+      else {
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Here `w != var', so that `lb_expr' is of the form
+        // +/-denominator * w + b.
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w >= b/denominator'.
+        if (w_coeff == denominator)
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+          else
+            add_octagonal_constraint(n_var, n_w, b, minus_den);
+        else {
+          // Add the new constraint `var + w >= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+          else
+            add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+        }
+        assert(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -lb_expr;
+  const Linear_Expression& sc_expr = is_sc ? lb_expr : minus_expr;
+
+  DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  DIRTY_TEMP(N, coeff_i);
+  DIRTY_TEMP(N, minus_coeff_i);
+  DIRTY_TEMP(N, half);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i+1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
+
+  // Apply the affine upper bound.
+  generalized_affine_image(var,
+                           LESS_OR_EQUAL,
+                           ub_expr,
+                           denominator);
+
+  // Return immediately if no approximation could be computed.
+  if (neg_pinf_count > 1) {
+    return;
+  }
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DIRTY_TEMP(N, double_neg_sum);
+      mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE);
+      matrix[n_var][n_var+1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_den)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index+1][n_var+1] = neg_sum;
+        else
+          if (npi == minus_sc_den) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index+1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var+1] = neg_sum;
+          }
+      }
+  }
+
+  assert(OK());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference
+                              denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var.id()+1);
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                    "r is a strict relation symbol and "
+                    "*this is an Octagonal_Shape");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // The image of an empty octagon is empty too.
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    TEMP_INTEGER(inverse_den);
+    neg_assign(inverse_den, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the Octagonal_Shape by adding the constraint induced
+  // by the affine relation.
+  refine(var, relsym, expr, denominator);
+
+  // If the shrunk OS is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is an Octagonal_Shape");
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
+    }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // in this case, preimage and image happen to be the same.
+  if (t_lhs == 0) {
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, den);
+  }
+
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
+
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+
+      // Any image of an empty octagon is empty.
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not an octagonal difference.
+      affine_image(new_var, lhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == v + b_rhs' or `rhs == -v + b_rhs' or `rhs == b_rhs',
+      // one of the following constraints will be added, because they
+      // are octagonal differences.
+      // Else the following constraints are NOT octagonal differences,
+      // so the method add_constraint() will ignore them.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(new_var <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+    }
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_preimage(const Variable var,
+                                            const Linear_Expression& lb_expr,
+                                            const Linear_Expression& ub_expr,
+                                            Coefficient_traits::const_reference
+                                            denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 var.id()+1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
+  }
+
+  const Coefficient& expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var = Variable(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (expr_v + denominator)*var;
+  TEMP_INTEGER(inverse_den);
+  neg_assign(inverse_den, expr_v);
+  affine_image(new_var, lb_inverse, inverse_den);
+  strong_closure_assign();
+  assert(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(inverse_den))
+    add_constraint(var >= new_var) ;
+  else
+    add_constraint(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim-1);
+  return;
+}
+
+template <typename T>
+Constraint_System
+Octagonal_Shape<T>::constraints() const {
+  Constraint_System cs;
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+    typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+    Row_Iterator m_begin = matrix.row_begin();
+    Row_Iterator m_end = matrix.row_end();
+
+    TEMP_INTEGER(a);
+    TEMP_INTEGER(b);
+
+    // Go through all the unary constraints in `matrix'.
+    for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+      const dimension_type i = i_iter.index();
+      const Variable x(i/2);
+      const N& c_i_ii = (*i_iter)[i+1];
+      ++i_iter;
+      const N& c_ii_i = (*i_iter)[i];
+      ++i_iter;
+      // Go through unary constraints.
+      if (is_additive_inverse(c_i_ii, c_ii_i)) {
+        // We have a unary equality constraint.
+        numer_denom(c_ii_i, b, a);
+        a *= 2;
+        cs.insert(a*x == b);
+      }
+      else {
+        // We have 0, 1 or 2 inequality constraints.
+        if (!is_plus_infinity(c_i_ii)) {
+          numer_denom(c_i_ii, b, a);
+          a *= 2;
+          cs.insert(-a*x <= b);
+        }
+        if (!is_plus_infinity(c_ii_i)) {
+          numer_denom(c_ii_i, b, a);
+          a *= 2;
+          cs.insert(a*x <= b);
+        }
+      }
+    }
+    //  Go through all the binary constraints in `matrix'.
+    for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+      const dimension_type i = i_iter.index();
+      Row_Reference r_i = *i_iter;
+      ++i_iter;
+      Row_Reference r_ii = *i_iter;
+      ++i_iter;
+      const Variable y(i/2);
+      for (dimension_type j = 0; j < i; j += 2) {
+        const N& c_i_j = r_i[j];
+        const N& c_ii_jj = r_ii[j+1];
+        const Variable x(j/2);
+        if (is_additive_inverse(c_ii_jj, c_i_j)) {
+          // We have an equality constraint of the form ax - ay = b.
+          numer_denom(c_i_j, b, a);
+          cs.insert(a*x - a*y == b);
+        }
+        else {
+          // We have 0, 1 or 2 inequality constraints.
+          if (!is_plus_infinity(c_i_j)) {
+            numer_denom(c_i_j, b, a);
+            cs.insert(a*x - a*y <= b);
+          }
+          if (!is_plus_infinity(c_ii_jj)) {
+            numer_denom(c_ii_jj, b, a);
+            cs.insert(a*y - a*x <= b);
+          }
+        }
+
+        const N& c_ii_j = r_ii[j];
+        const N& c_i_jj = r_i[j+1];
+        if (is_additive_inverse(c_i_jj, c_ii_j)) {
+          // We have an equality constraint of the form ax + ay = b.
+          numer_denom(c_ii_j, b, a);
+          cs.insert(a*x + a*y == b);
+        }
+        else {
+          // We have 0, 1 or 2 inequality constraints.
+          if (!is_plus_infinity(c_i_jj)) {
+            numer_denom(c_i_jj, b, a);
+            cs.insert(-a*x - a*y <= b);
+          }
+          if (!is_plus_infinity(c_ii_j)) {
+            numer_denom(c_ii_j, b, a);
+            cs.insert(a*x + a*y <= b);
+          }
+        }
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  // `var' should be one of the dimensions of the vector space.
+  const dimension_type var_id = var.id();
+  if (var_id+1 > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", var_id+1);
+
+  // The space dimension of the resulting octagon should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_generic("expand_dimension(v, m)",
+                  "adding m new space dimensions exceeds "
+                  "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Keep track of the dimension before adding the new ones.
+  const dimension_type old_num_rows = matrix.num_rows();
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  Row_iterator v_iter = m_begin + n_var;
+  Row_reference m_v = *v_iter;
+  Row_reference m_cv = *(v_iter+1);
+
+  for (Row_Iterator i_iter = m_begin + old_num_rows; i_iter != m_end;
+       i_iter += 2) {
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ci = *(i_iter+1);
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = i+1;
+    m_i[ci] = m_v[n_var+1];
+    m_ci[i] = m_cv[n_var];
+    for (dimension_type j = 0; j < n_var; ++j) {
+      m_i[j] = m_v[j];
+      m_ci[j] = m_cv[j];
+    }
+    for (dimension_type j = n_var+2; j < old_num_rows; ++j) {
+      Row_Iterator j_iter = m_begin + j;
+      Row_Reference m_j = *j_iter;
+      Row_Reference m_cj = (j%2) ? *(j_iter-1) : *(j_iter+1);
+      m_i[j] = m_cj[n_var+1];
+      m_ci[j] = m_cj[n_var];
+    }
+  }
+  // In general, adding a constraint does not preserve the strong closure
+  // of the octagon.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                          Variable var) {
+  // `var' should be one of the dimensions of the octagon.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
+    return;
+
+  // All variables in `to_be_folded' should be dimensions of the octagon.
+  if (to_be_folded.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, ...)",
+                                 to_be_folded.space_dimension());
+
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
+    throw_generic("fold_space_dimensions(tbf, v)",
+                  "v should not occur in tbf");
+
+  // Recompute the elements of the row and the column corresponding
+  // to variable `var' by taking the join of their value with the
+  // value of the corresponding elements in the row and column of the
+  // variable `to_be_folded'.
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+
+  strong_closure_assign();
+  const dimension_type n_rows = matrix.num_rows();
+  const dimension_type n_var = 2*var.id();
+  Row_Iterator v_iter = m_begin + n_var;
+  Row_Reference m_v = *v_iter;
+  Row_Reference m_cv = *(v_iter+1);
+  for (Variables_Set::const_iterator i = to_be_folded.begin(),
+         tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+    const dimension_type tbf_id = *i;
+    const dimension_type tbf_var = 2*tbf_id;
+    Row_Iterator tbf_iter = m_begin + tbf_var;
+    Row_Reference m_tbf = *tbf_iter;
+    Row_Reference m_ctbf = *(tbf_iter+1);
+    max_assign(m_v[n_var+1], m_tbf[tbf_var+1]);
+    max_assign(m_cv[n_var], m_ctbf[tbf_var]);
+
+    const dimension_type min_id = std::min(n_var, tbf_var);
+    const dimension_type max_id = std::max(n_var, tbf_var);
+
+    for (dimension_type j = 0; j < min_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      max_assign(m_v[j], m_tbf[j]);
+      max_assign(m_cv[j], m_ctbf[j]);
+      max_assign(m_cv[cj], m_ctbf[cj]);
+      max_assign(m_v[cj], m_tbf[cj]);
+    }
+    for (dimension_type j = min_id+2; j < max_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      Row_Iterator j_iter = m_begin + j;
+      Row_Reference m_j = *j_iter;
+      Row_Reference m_cj = (j%2) ? *(j_iter-1) : *(j_iter+1);
+      if (n_var == min_id) {
+        max_assign(m_cj[n_var+1], m_tbf[j]);
+        max_assign(m_cj[n_var], m_ctbf[j]);
+        max_assign(m_j[n_var], m_ctbf[cj]);
+        max_assign(m_j[n_var+1], m_tbf[cj]);
+      }
+      else {
+        max_assign(m_v[j], m_cj[tbf_var+1]);
+        max_assign(m_cv[j], m_cj[tbf_var]);
+        max_assign(m_cv[cj], m_j[tbf_var]);
+        max_assign(m_v[cj], m_j[tbf_var+1]);
+      }
+    }
+    for (dimension_type j = max_id+2; j < n_rows; ++j) {
+      Row_Iterator j_iter = m_begin + j;
+      Row_Reference m_j = *j_iter;
+      Row_Reference m_cj = (j%2) ? *(j_iter-1) : *(j_iter+1);
+      max_assign(m_cj[n_var+1], m_cj[tbf_var+1]);
+      max_assign(m_cj[n_var], m_cj[tbf_var]);
+      max_assign(m_j[n_var], m_j[tbf_var]);
+      max_assign(m_j[n_var+1], m_j[tbf_var+1]);
+    }
+  }
+  remove_space_dimensions(to_be_folded);
+}
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape<T>& x) {
+  // Handle special cases first.
+  if (x.marked_empty()) {
+    s << "false";
+    return s;
+  }
+  if (x.is_universe()) {
+    s << "true";
+    return s;
+  }
+
+  typedef typename Octagonal_Shape<T>::coefficient_type N;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+  // Records whether or not we still have to print the first constraint.
+  bool first = true;
+
+  Row_Iterator m_begin = x.matrix.row_begin();
+  Row_Iterator m_end = x.matrix.row_end();
+
+  // Temporaries.
+  DIRTY_TEMP(N, negation);
+  DIRTY_TEMP(N, half);
+  // Go through all the unary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i = Variable(i/2);
+    const N& x_i_ii = (*i_iter)[i+1];
+    ++i_iter;
+    const N& x_ii_i = (*i_iter)[i];
+    ++i_iter;
+    // Check whether or not it is an equality constraint.
+    if (is_additive_inverse(x_i_ii, x_ii_i)) {
+      // It is an equality.
+      assert(!is_plus_infinity(x_i_ii) && !is_plus_infinity(x_ii_i));
+      if (first)
+        first = false;
+      else
+        s << ", ";
+      // If the value bound can NOT be divided by 2 exactly,
+      // then we output the constraint `2*v_i == bound'.
+      if (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ)
+        s << v_i << " == " << half;
+      else
+        s << "2*" << v_i << " == " << x_ii_i;
+    }
+    else {
+      // We will print unary non-strict inequalities, if any.
+      if (!is_plus_infinity(x_i_ii)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        neg_assign_r(negation, x_i_ii, ROUND_NOT_NEEDED);
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i >= negation'.
+        if (div2exp_assign_r(half, negation, 1, ROUND_UP) == V_EQ)
+          s << v_i << " >= " << half;
+        else
+          s << "2*" << v_i << " >= " << negation;
+      }
+      if (!is_plus_infinity(x_ii_i)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i <= bound'.
+        if (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ)
+          s << v_i << " <= " << half;
+        else
+          s << "2*" << v_i << " <= " << x_ii_i;
+      }
+    }
+  }
+
+  // Go through all the binary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i = Variable(i/2);
+    Row_Reference r_i = *i_iter;
+    ++i_iter;
+    Row_Reference r_ii = *i_iter;
+    ++i_iter;
+
+    for (dimension_type j = 0; j < i; j += 2) {
+      const Variable v_j = Variable(j/2);
+      // Print binary differences.
+      const N& x_ii_jj = r_ii[j+1];
+      const N& x_i_j = r_i[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(x_ii_jj, x_i_j)) {
+        // It is an equality.
+        assert(!is_plus_infinity(x_i_j) && !is_plus_infinity(x_ii_jj));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        if (sgn(x_i_j) >= 0)
+          s << v_j << " - " << v_i << " == " << x_i_j;
+        else
+          s << v_i << " - " << v_j << " == " << x_ii_jj;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(x_i_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(x_i_j) >= 0)
+            s << v_j << " - " << v_i << " <= " << x_i_j;
+          else {
+            neg_assign_r(negation, x_i_j, ROUND_DOWN);
+            s << v_i << " - " << v_j << " >= " << negation;
+          }
+        }
+        if (!is_plus_infinity(x_ii_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(x_ii_jj) >= 0)
+            s << v_i << " - " << v_j << " <= " << x_ii_jj;
+          else {
+            neg_assign_r(negation, x_ii_jj, ROUND_DOWN);
+            s << v_j << " - " << v_i << " >= " << negation;
+          }
+        }
+      }
+      // Print binary sums.
+      const N& x_i_jj = r_i[j+1];
+      const N& x_ii_j = r_ii[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(x_i_jj, x_ii_j)) {
+        // It is an equality.
+        assert(!is_plus_infinity(x_i_jj) && !is_plus_infinity(x_ii_j));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        s << v_j << " + " << v_i << " == " << x_ii_j;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(x_i_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          neg_assign_r(negation, x_i_jj, ROUND_DOWN);
+          s << v_j << " + " << v_i << " >= " << negation;
+        }
+        if (!is_plus_infinity(x_ii_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          s << v_j << " + " << v_i << " <= " << x_ii_j;
+        }
+      }
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::ascii_dump(std::ostream& s) const {
+  s << "space_dim "
+    << space_dim
+    << "\n";
+  status.ascii_dump(s);
+  s << "\n";
+  matrix.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, Octagonal_Shape<T>)
+
+template <typename T>
+bool
+Octagonal_Shape<T>::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!matrix.ascii_load(s))
+    return false;
+
+  assert(OK());
+  return true;
+}
+
+template <typename T>
+memory_size_type
+Octagonal_Shape<T>::external_memory_in_bytes() const {
+  return matrix.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::OK() const {
+  // Check whether the matrix is well-formed.
+  if (!matrix.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // All empty octagons are OK.
+  if (marked_empty())
+    return true;
+
+  // 0-dim universe octagon is OK.
+  if (space_dim == 0)
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (is_minus_infinity(x_i[j])) {
+#ifndef NDEBUG
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        std::cerr << "Octagonal_Shape::"
+                  << "matrix[" << i.index() << "][" << j << "] = "
+                  << x_i[j] << "!"
+                  << std::endl;
+#endif
+        return false;
+      }
+  }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         m_end = matrix.row_end(); i != m_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type r = *i;
+    const N& m_i_i = r[i.index()];
+    if (!is_plus_infinity(m_i_i)) {
+#ifndef NDEBUG
+      const dimension_type j = i.index();
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "Octagonal_Shape::matrix[" << j << "][" << j << "] = "
+                << m_i_i << "!  (+inf was expected.)\n";
+#endif
+      return false;
+    }
+  }
+
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise strong closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the closure information is legal.
+    if (marked_strongly_closed()) {
+      Octagonal_Shape x = *this;
+      x.reset_strongly_closed();
+      x.strong_closure_assign();
+      if (x.matrix != matrix) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is marked as strongly closed "
+                  << "but it is not!\n";
+#endif
+        return false;
+      }
+    }
+
+    // A closed octagon must be strong-coherent.
+    if (marked_strongly_closed())
+      if (!is_strong_coherent()) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is not strong-coherent!\n";
+#endif
+        return false;
+      }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const Octagonal_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_constraint_incompatible(const char* method) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_expression_too_complex(const char* method,
+                               const Linear_Expression& e) const {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const char* name_row,
+                               const Linear_Expression& y) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_generic(const char* method,
+                                  const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << reason;
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Octagonal_Shape_templates_hh)
diff --git a/src/Octagonal_Shape.types.hh b/src/Octagonal_Shape.types.hh
new file mode 100644
index 0000000..eb9e47d
--- /dev/null
+++ b/src/Octagonal_Shape.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Octagonal_Shape_types_hh
+#define PPL_Octagonal_Shape_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Octagonal_Shape;
+
+}
+
+#endif // !defined(PPL_Octagonal_Shape_types_hh)
diff --git a/src/Og_Status.idefs.hh b/src/Og_Status.idefs.hh
new file mode 100644
index 0000000..bcf2c28
--- /dev/null
+++ b/src/Og_Status.idefs.hh
@@ -0,0 +1,110 @@
+/* Octagonal_Shape<T>::Status class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Og_Status_idefs_hh
+#define PPL_Og_Status_idefs_hh 1
+
+#ifndef PPL_IN_Octagonal_Shape_CLASS
+#error "Do not include Og_Status.idefs.hh directly; use Octagonal_Shape.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a Octagonal_Shape<T> object.
+/*!
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>strongly closed</EM>: the Octagonal_Shape object is strongly
+    closed, so that all the constraints are as tight as possible.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_strongly_closed() const;
+  void reset_strongly_closed();
+  void set_strongly_closed();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! \brief
+  //! Writes to \p s an ASCII representation of the internal
+  //! representation of \p *this.
+  void ascii_dump(std::ostream& s) const;
+
+  //! \brief
+  //! Loads from \p s an ASCII representation (as produced by
+  //! ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+  //! Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV   = 0U;
+  static const flags_t EMPTY           = 1U << 0;
+  static const flags_t STRONGLY_CLOSED = 1U << 1;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+
+};
+
+#endif // !defined(PPL_Og_Status_idefs_hh)
diff --git a/src/Og_Status.inlines.hh b/src/Og_Status.inlines.hh
new file mode 100644
index 0000000..ef8315a
--- /dev/null
+++ b/src/Og_Status.inlines.hh
@@ -0,0 +1,225 @@
+/* Octagonal_Shape<T>::Status class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Og_Status_inlines_hh
+#define PPL_Og_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_strongly_closed() const {
+  return test_any(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_strongly_closed() {
+  reset(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_strongly_closed() {
+  set(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string strong_closed = "SC";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape<T>::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Octagonal_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ
+    << sep
+    << (test_empty() ? yes : no) << empty
+    << sep
+    << sep
+    << (test_strongly_closed() ? yes : no) << strong_closed
+    << sep;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Octagonal_Shapes;
+  bool positive;
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, strong_closed, positive))
+    return false;
+  if (positive)
+    set_strongly_closed();
+  else
+    reset_strongly_closed();
+
+  // Check invariants.
+  assert(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Og_Status_inlines_hh)
diff --git a/src/Partially_Reduced_Product.defs.hh b/src/Partially_Reduced_Product.defs.hh
new file mode 100644
index 0000000..42b5827
--- /dev/null
+++ b/src/Partially_Reduced_Product.defs.hh
@@ -0,0 +1,1535 @@
+/* Partially_Reduced_Product class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_defs_hh
+#define PPL_Partially_Reduced_Product_defs_hh 1
+
+#include "Partially_Reduced_Product.types.hh"
+#include "globals.types.hh"
+#include "globals.defs.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+#include "Congruence.types.hh"
+#include "Grid_Generator.types.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Congruence_System.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "Variables_Set.types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Partially_Reduced_Product
+  Writes a textual representation of \p dp on \p s.
+*/
+template <typename D1, typename D2, typename R>
+std::ostream&
+operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are pairwise equal.
+
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+		const Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are not pairwise equal.
+
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+		const Partially_Reduced_Product<D1, D2, R>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/*! \brief
+  This class provides the reduction method for the Smash_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class propagates emptiness between its components.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Smash_Reduction {
+public:
+  //! Default constructor.
+  Smash_Reduction();
+
+  /*! brief
+    The smash reduction operator for propagating emptiness between the
+    domain elements \p d1 and \p d2.
+
+    If either of the the domain elements \p d1 or \p d2 is empty
+    then the other is also set empty.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Smash_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Constraints_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class adds the constraints defining each of the component
+  domains to the other component.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Constraints_Reduction {
+public:
+  //! Default constructor.
+  Constraints_Reduction();
+
+  /*! brief
+    The constraints reduction operator for sharing constraints between the
+    domains.
+
+    The minimized constraint system defining the domain element \p d1
+    is added to \p d2 and the minimized constraint system  defining \p d2
+    is added to \p d1.
+    In each case, the donor domain must provide a constraint system
+    in minimal form; this must define a polyhedron in which the
+    donor element is contained.
+    The recipient domain selects a subset of these constraints
+    that it can add to the recipient element.
+    For example: if the domain \p D1 is the Grid domain and \p D2
+    the NNC Polyhedron domain, then only the equality constraints are copied
+    from \p d1 to \p d2 and from \p d2 to \p d1.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Constraints_Reduction();
+};
+
+/*! brief
+  This class provides the reduction method for the Direct_Product domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain template parameter \p R. This class does no reduction at all.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::No_Reduction {
+public:
+  //! Default constructor.
+  No_Reduction();
+
+  /*! \brief
+    The null reduction operator.
+
+    The parameters \p d1 and \p d2 are ignored.
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~No_Reduction();
+};
+
+//! The partially reduced product of two abstractions.
+/*! \ingroup PPL_CXX_interface
+
+  \warning
+  At present, the supported instantiations for the
+  two domain templates \p D1 and \p D2 are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape<T></CODE>,
+  <CODE>BD_Shape<T></CODE>,
+  <CODE>Box<T></CODE>.
+
+  An object of the class <CODE>Partially_Reduced_Product<D1, D2, R></CODE>
+  represents the (partially reduced) product of two pointset domains \p D1
+  and \p D2 where the form of any reduction is defined by the
+  reduction class \p R.
+
+  Suppose \f$D_1\f$ and \f$D_2\f$ are two abstract domains
+  with concretization functions:
+  \f$\fund{\gamma_1}{D_1}{\Rset^n}\f$ and
+  \f$\fund{\gamma_2}{D_2}{\Rset^n}\f$, respectively.
+
+  The partially reduced product \f$D = D_1 \times D_2\f$,
+  for any reduction class \p R, has a concretization
+  \f$\fund{\gamma}{D}{\Rset^n}\f$
+  where, if \f$d = (d_1, d_2) \in D\f$
+  \f[
+    \gamma(d) = \gamma_1(d_1) \inters \gamma_2(d_2).
+  \f]
+
+  The operations are defined to be the result of applying the corresponding
+  operations on each of the components provided the product is already reduced
+  by the reduction method defined by \p R.
+  In particular, if \p R is the <CODE>No_Reduction<D1, D2></CODE> class,
+  then the class <CODE>Partially_Reduced_Product<D1, D2, R></CODE> domain
+  is the direct product as defined in \ref CC79 "[CC79]".
+
+  How the results on the components are interpreted and
+  combined depend on the specific test.
+  For example, the test for emptiness will first make sure
+  the product is reduced (using the reduction method provided by \p R
+  if it is not already known to be reduced) and then test if either component
+  is empty; thus, if \p R defines no reduction between its components and
+  \f$d = (G, P) \in (\Gset \times \Pset)\f$
+  is a direct product in one dimension where \f$G\f$ denotes the set of
+  numbers that are integral multiples of 3 while \f$P\f$ denotes the
+  set of numbers between 1 and 2, then an operation that tests for
+  emptiness should return false.
+  However, the test for the universe returns true if and only if the
+  test <CODE>is_universe()</CODE> on both components returns true.
+
+  \par
+  In all the examples it is assumed that the template \c R is the
+  <CODE>No_Reduction<D1, D2></CODE> class and that variables
+  \c x and \c y are defined (where they are used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a direct product of a Grid and NNC Polyhedron,
+  corresponding to the positive even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> >
+    dp(cgs);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  \endcode
+
+  \par Example 2
+  The following code builds the same product
+  in \f$\Rset^2\f$:
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(2);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((y %= 0) / 2);
+  \endcode
+
+  \par Example 3
+  The following code will write "dp is empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((x %= 1) / 2);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
+  else
+    cout << "dp is not empty." << endl;
+  \endcode
+
+  \par Example 4
+  The following code will write "dp is not empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_constraint(x >= 1);
+  dp.add_constraint(x <= 1);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
+  else
+    cout << "dp is not empty." << endl;
+  \endcode
+*/
+
+template <typename D1, typename D2, typename R>
+class Parma_Polyhedra_Library::Partially_Reduced_Product {
+public:
+  /*! brief
+    Returns the maximum space dimension this product
+    can handle.
+  */
+  static dimension_type max_space_dimension();
+
+  //! Builds an object having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the pair;
+
+    \param kind
+    Specifies whether a universe or an empty pair has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(dimension_type num_dimensions = 0,
+				     Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a pair, copying a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Congruence_System& cgs);
+
+  //! Builds a pair, recycling a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences to be approximates by the pair.
+    Its data-structures may be recycled to build the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(Congruence_System& cgs);
+
+  //! Builds a pair, copying a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Constraint_System& cs);
+
+  //! Builds a pair, recycling a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p cs exceeds the maximum allowed
+    space dimension.
+  */
+  explicit Partially_Reduced_Product(Constraint_System& cs);
+
+  //! Builds a product, from a C polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
+
+    \param ph
+    The polyhedron to be approximated by the product.
+
+    \param complexity
+    The complexity that will not be exceeded.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product, from an NNC polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
+
+    \param ph
+    The polyhedron to be approximated by the product.
+
+    \param complexity
+    The complexity that will not be exceeded.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product, from a grid.
+  /*!
+    Builds a product containing \p gr.
+    The product inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be approximated by the product.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const Grid& gr,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of a box.
+  /*!
+    Builds a product containing \p box.
+    The product inherits the space dimension of the box.
+
+    \param box
+    The box representing the pair to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  Partially_Reduced_Product(const Box<Interval>& box,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of a BD shape.
+  /*!
+    Builds a product containing \p bd.
+    The product inherits the space dimension of the BD shape.
+
+    \param bd
+    The BD shape representing the product to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const BD_Shape<U>& bd,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of an octagonal shape.
+  /*!
+    Builds a product containing \p os.
+    The product inherits the space dimension of the octagonal shape.
+
+    \param os
+    The octagonal shape representing the product to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const Octagonal_Shape<U>& os,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy-constructor.
+  Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename E1, typename E2, typename S>
+  explicit
+  Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Partially_Reduced_Product& operator=(const Partially_Reduced_Product& y);
+
+  //! \name Member Functions that Do Not Modify the Partially_Reduced_Product
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns the minimum \ref Affine_Independence_and_Affine_Dimension
+    "affine dimension"
+    (see also \ref Grid_Affine_Dimension "grid affine dimension")
+    of the components of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a constant reference to the first of the pair.
+  const D1& domain1() const;
+
+  //! Returns a constant reference to the second of the pair.
+  const D2& domain2() const;
+
+  //! Returns a system of constraints which approximates \p *this.
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Returns a system of constraints which approximates \p *this, in
+    reduced form.
+  */
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences which approximates \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a system of congruences which approximates \p *this, in
+    reduced form.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+
+    Returns the Poly_Con_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r implies <CODE>is_included()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_included()</CODE>;
+    \p r implies <CODE>saturates()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>saturates()</CODE>;
+    \p r implies <CODE>is_disjoint()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_disjoint()</CODE>;
+    and \p r implies <CODE>nothing()</CODE>
+    if and only if both \p r1 and \p r2 imply
+    <CODE>strictly_intersects()</CODE>.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+
+    Returns the Poly_Gen_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r = <CODE>subsumes()</CODE>
+    if and only if \p r1 = \p r2 = <CODE>subsumes()</CODE>;
+    and \p r = <CODE>nothing()</CODE>
+    if and only if one or both of \p r1 and \p r2 = <CODE>nothing()</CODE>;
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if either of the components
+    of \p *this are empty.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are the universe.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are topologically closed subsets of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    componentwise disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Partially_Reduced_Product& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is discrete.
+  */
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is bounded.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+    \param point
+    When maximization succeeds, will be assigned a generator point
+    where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below i \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+    \param point
+    When minimization succeeds, will be assigned a generator point
+    where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    contains the corresponding component of \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Partially_Reduced_Product& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    strictly contains the corresponding component of \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Partially_Reduced_Product& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Partially_Reduced_Product
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Partially_Reduced_Product
+  //@{
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Adds a copy of the congruences in \p cgs to \p *this.
+  /*!
+    \param cgs
+    The congruence system to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added that may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  //! Adds a copy of the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  //! Adds the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added that may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  /*! \brief
+    Assigns to \p *this the componentwise intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+    If it is exact on each of the components of \p *this, <CODE>true</CODE>
+    is returned, otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an approximation of the set-theoretic difference
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Single_Update_Affine_Functions
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref  Single_Update_Affine_Functions
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym
+    (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Time_Elapse_Operator
+    "time-elapse" between \p *this and \p y.
+    (See also \ref Grid_Time_Elapse "time-elapse".)
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Partially_Reduced_Product& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  // TODO: Add a way to call other widenings.
+
+  // CHECKME: This may not be a real widening; it depends on the reduction
+  //          class R and the widening used.
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    "widening" between \p *this and \p y.
+
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
+
+    \param y
+    A product that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Partially_Reduced_Product& y,
+                       unsigned* tp = NULL);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the components
+    of \p *this in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions and does not embed the components
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to the first (resp., second) component of \p *this
+    the "concatenation" of the first (resp., second) components
+    of \p *this and \p y, taken in this order.
+    See also \ref Concatenating_Polyhedra and \ref Grid_Concatenate.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Partially_Reduced_Product& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template class <CODE>Partial_Function</CODE> must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing \p *this.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==<>(const Partially_Reduced_Product<D1, D2, R>& x,
+			   const Partially_Reduced_Product<D1, D2, R>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::
+  operator<<<>(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Partially_Reduced_Product();
+
+  /*! \brief
+    Swaps \p *this with product \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void swap(Partially_Reduced_Product& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+  //! Reduce.
+  /*
+    \return
+    <CODE>true</CODE> if and only if either of the resulting component
+    is strictly contained in the respective original.
+  */
+  bool reduce() const;
+
+protected:
+  //! The type of the first component.
+  typedef D1 Domain1;
+
+  //! The type of the second component.
+  typedef D2 Domain2;
+
+  //! The first component.
+  D1 d1;
+
+  //! The second component.
+  D2 d2;
+
+protected:
+  //! Clears the reduced flag.
+  void clear_reduced_flag() const;
+
+  //! Sets the reduced flag.
+  void set_reduced_flag() const;
+
+  //! Return <CODE>true</CODE> if and only if the reduced flag is set.
+  bool is_reduced() const;
+
+  /*! \brief
+    Flag to record whether the components are reduced with respect
+    to each other and the reduction class.
+  */
+  bool reduced;
+};
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  This class is temporary and will be removed when template typedefs will
+  be supported in C++.
+
+  When template typedefs will be supported in C++, what now is verbosely
+  denoted by Domain_Product<Domain1, Domain2>::Direct_Product will simply
+  be denoted by Direct_Product<Domain1, Domain2>.
+*/
+template <typename D1, typename D2>
+class Domain_Product {
+public:
+  typedef Partially_Reduced_Product<D1, D2, No_Reduction<D1, D2> >
+  Direct_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Smash_Reduction<D1, D2> >
+  Smash_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Constraints_Reduction<D1, D2> >
+  Constraints_Product;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+  template <typename D1, typename D2, typename R>
+void swap(Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& x,
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& y);
+
+} // namespace std
+
+#include "Partially_Reduced_Product.inlines.hh"
+
+#endif // !defined(PPL_Partially_Reduced_Product_defs_hh)
diff --git a/src/Partially_Reduced_Product.inlines.hh b/src/Partially_Reduced_Product.inlines.hh
new file mode 100644
index 0000000..9fb4829
--- /dev/null
+++ b/src/Partially_Reduced_Product.inlines.hh
@@ -0,0 +1,762 @@
+/* Partially_Reduced_Product class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_inlines_hh
+#define PPL_Partially_Reduced_Product_inlines_hh 1
+
+#include "compiler.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::max_space_dimension() {
+  return std::min(D1::max_space_dimension(), D2::max_space_dimension());
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(dimension_type num_dimensions,
+			    const Degenerate_Element kind)
+  : d1(num_dimensions, kind), d2(num_dimensions, kind) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Congruence_System& ccgs)
+  : d1(ccgs), d2(ccgs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Congruence_System& cgs)
+  : d1(const_cast<const Congruence_System&>(cgs)), d2(cgs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Constraint_System& ccs)
+  : d1(ccs), d2(ccs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Constraint_System& cs)
+  : d1(const_cast<const Constraint_System&>(cs)), d2(cs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Grid& gr, Complexity_Class)
+  : d1(gr), d2(gr) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Interval>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Box<Interval>& box, Complexity_Class)
+  : d1(box), d2(box) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const BD_Shape<U>& bd, Complexity_Class)
+  : d1(bd), d2(bd) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Octagonal_Shape<U>& os, Complexity_Class)
+  : d1(os), d2(os) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class)
+  : d1(y.d1), d2(y.d2) {
+  reduced = y.reduced;
+}
+
+template <typename D1, typename D2, typename R>
+template <typename E1, typename E2, typename S>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity)
+  : d1(y.domain1(), complexity), d2(y.domain2(), complexity) {
+  /* Even if y is reduced, the built product may not be reduced as
+     the reduction method may have changed (i.e., S != R). */
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>::~Partially_Reduced_Product() {
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::external_memory_in_bytes() const {
+  return d1.external_memory_in_bytes() + d2.external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::space_dimension() const {
+  assert(d1.space_dimension() == d2.space_dimension());
+  return d1.space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::affine_dimension() const {
+  reduce();
+  const dimension_type d1_dim = d1.affine_dimension();
+  const dimension_type d2_dim = d2.affine_dimension();
+  return std::min(d1_dim, d2_dim);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variable var) {
+  reduce();
+  d1.unconstrain(var);
+  d2.unconstrain(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variables_Set& to_be_unconstrained) {
+  reduce();
+  d1.unconstrain(to_be_unconstrained);
+  d2.unconstrain(to_be_unconstrained);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::intersection_assign(const Partially_Reduced_Product& y) {
+  d1.intersection_assign(y.d1);
+  d2.intersection_assign(y.d2);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::difference_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.difference_assign(y.d1);
+  d2.difference_assign(y.d2);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.upper_bound_assign(y.d1);
+  d2.upper_bound_assign(y.d2);
+  // CHECKME: if upper_bound_assign is not a least_upper_bound
+  //          it may not be reduced.
+  // clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign_if_exact(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  D1 d1_copy = d1;
+  bool ub_exact = d1_copy.upper_bound_assign_if_exact(y.d1);
+  if (!ub_exact)
+    return false;
+  ub_exact = d2.upper_bound_assign_if_exact(y.d2);
+  if (!ub_exact)
+    return false;
+  std::swap(d1,d1_copy);
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_image(Variable var,
+	       const Linear_Expression& expr,
+	       Coefficient_traits::const_reference denominator) {
+  d1.affine_image(var, expr, denominator);
+  d2.affine_image(var, expr, denominator);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_preimage(Variable var,
+		  const Linear_Expression& expr,
+		  Coefficient_traits::const_reference denominator) {
+  d1.affine_preimage(var, expr, denominator);
+  d2.affine_preimage(var, expr, denominator);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(Variable var,
+			   const Relation_Symbol relsym,
+			   const Linear_Expression& expr,
+			   Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_image(var, relsym, expr, denominator);
+  d2.generalized_affine_image(var, relsym, expr, denominator);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(Variable var,
+			      const Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_preimage(var, relsym, expr, denominator);
+  d2.generalized_affine_preimage(var, relsym, expr, denominator);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(const Linear_Expression& lhs,
+			   const Relation_Symbol relsym,
+			   const Linear_Expression& rhs) {
+  d1.generalized_affine_image(lhs, relsym, rhs);
+  d2.generalized_affine_image(lhs, relsym, rhs);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  d1.generalized_affine_preimage(lhs, relsym, rhs);
+  d2.generalized_affine_preimage(lhs, relsym, rhs);
+}
+
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::time_elapse_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  d1.time_elapse_assign(y.d1);
+  d2.time_elapse_assign(y.d2);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::topological_closure_assign() {
+  d1.topological_closure_assign();
+  d2.topological_closure_assign();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::swap(Partially_Reduced_Product& y) {
+  std::swap(d1, y.d1);
+  std::swap(d2, y.d2);
+  std::swap(reduced, y.reduced);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_constraint(const Constraint& c) {
+  d1.add_constraint(c);
+  d2.add_constraint(c);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_constraint(const Constraint& c) {
+  d1.refine_with_constraint(c);
+  d2.refine_with_constraint(c);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_congruence(const Congruence& cg) {
+  d1.add_congruence(cg);
+  d2.add_congruence(cg);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_congruence(const Congruence& cg) {
+  d1.refine_with_congruence(cg);
+  d2.refine_with_congruence(cg);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_constraints(const Constraint_System& cs) {
+  d1.add_constraints(cs);
+  d2.add_constraints(cs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_constraints(const Constraint_System& cs) {
+  d1.refine_with_constraints(cs);
+  d2.refine_with_constraints(cs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_congruences(const Congruence_System& cgs) {
+  d1.add_congruences(cgs);
+  d2.add_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_congruences(const Congruence_System& cgs) {
+  d1.refine_with_congruences(cgs);
+  d2.refine_with_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline Partially_Reduced_Product<D1, D2, R>&
+Partially_Reduced_Product<D1, D2, R>
+::operator=(const Partially_Reduced_Product& y) {
+  d1 = y.d1;
+  d2 = y.d2;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D1&
+Partially_Reduced_Product<D1, D2, R>::domain1() const {
+  reduce();
+  return d1;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D2&
+Partially_Reduced_Product<D1, D2, R>::domain2() const {
+  reduce();
+  return d2;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_empty() const {
+  reduce();
+  return d1.is_empty() || d2.is_empty();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_universe() const {
+  return d1.is_universe() && d2.is_universe();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_topologically_closed() const {
+  reduce();
+  return d1.is_topologically_closed() && d2.is_topologically_closed();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::is_disjoint_from(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.is_disjoint_from(y.d1) || d2.is_disjoint_from(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_discrete() const {
+  reduce();
+  return d1.is_discrete() || d2.is_discrete();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_bounded() const {
+  reduce();
+  return d1.is_bounded() || d2.is_bounded();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_above(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_above(expr) || d2.bounds_from_above(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_below(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_below(expr) || d2.bounds_from_below(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::constrains(Variable var) const {
+  reduce();
+  return d1.constrains(var) || d2.constrains(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::widening_assign(const Partially_Reduced_Product& y,
+                  unsigned* tp) {
+  // FIXME: In general this is _NOT_ a widening since the reduction
+  //        may mean that the sequence does not satisfy the ascending
+  //        chain condition.
+  //        However, for the direct, smash and constraints product
+  //        it may be ok - but this still needs checking.
+  reduce();
+  y.reduce();
+  d1.widening_assign(y.d1, tp);
+  d2.widening_assign(y.d2, tp);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_embed(dimension_type m) {
+  d1.add_space_dimensions_and_embed(m);
+  d2.add_space_dimensions_and_embed(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_project(dimension_type m) {
+  d1.add_space_dimensions_and_project(m);
+  d2.add_space_dimensions_and_project(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::concatenate_assign(const Partially_Reduced_Product& y) {
+  d1.concatenate_assign(y.d1);
+  d2.concatenate_assign(y.d2);
+  if (!is_reduced() || !y.is_reduced())
+    clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  d1.remove_space_dimensions(to_be_removed);
+  d2.remove_space_dimensions(to_be_removed);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  d1.remove_higher_space_dimensions(new_dimension);
+  d2.remove_higher_space_dimensions(new_dimension);
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Partial_Function>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::map_space_dimensions(const Partial_Function& pfunc) {
+  d1.map_space_dimensions(pfunc);
+  d2.map_space_dimensions(pfunc);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::expand_space_dimension(Variable var, dimension_type m) {
+  d1.expand_space_dimension(var, m);
+  d2.expand_space_dimension(var, m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::fold_space_dimensions(const Variables_Set& to_be_folded,
+			Variable var) {
+  d1.fold_space_dimensions(to_be_folded, var);
+  d2.fold_space_dimensions(to_be_folded, var);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.contains(y.d1) && d2.contains(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::strictly_contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return (d1.contains(y.d1) && d2.strictly_contains(y.d2))
+    || (d2.contains(y.d2) && d1.strictly_contains(y.d1));
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::reduce() const {
+  Partially_Reduced_Product& dp
+    = const_cast<Partially_Reduced_Product&>(*this);
+  if (dp.is_reduced())
+    return false;
+  R r;
+  r.product_reduce(dp.d1, dp.d2);
+  set_reduced_flag();
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_reduced() const {
+  return reduced;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::clear_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = false;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::set_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = true;
+}
+
+// FIXME: Improve this name.
+PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product)
+
+  template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const {
+  s << "Domain 1:\n";
+  d1.ascii_dump(s);
+  s << "Domain 2:\n";
+  d2.ascii_dump(s);
+}
+
+template <typename D1, typename D2, typename R>
+inline int32_t
+Partially_Reduced_Product<D1, D2, R>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+	   const Partially_Reduced_Product<D1, D2, R>& y) {
+  x.reduce();
+  y.reduce();
+  return x.d1 == y.d1 && x.d2 == y.d2;
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+	   const Partially_Reduced_Product<D1, D2, R>& y) {
+  return !(x == y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& pd) {
+  return s << "Domain 1:\n"
+	   << pd.d1
+	   << "Domain 2:\n"
+	   << pd.d2;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::No_Reduction() {
+}
+
+template <typename D1, typename D2>
+void No_Reduction<D1, D2>::product_reduce(D1&, D2&) {
+}
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::~No_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+void Constraints_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d2.is_empty()) {
+    if (!d1.is_empty()) {
+      D1 new_d1(d1.space_dimension(), EMPTY);
+      std::swap(d1, new_d1);
+    }
+  }
+  else if (d1.is_empty()) {
+    D2 new_d2(d2.space_dimension(), EMPTY);
+    std::swap(d2, new_d2);
+  }
+  else {
+    d1.add_constraints(d2.minimized_constraints());
+    d2.add_constraints(d1.minimized_constraints());
+  }
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::~Constraints_Reduction() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline void
+std::swap(Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& x,
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& y) {
+  x.swap(y);
+}
+
+#endif // !defined(PPL_Partially_Reduced_Product_inlines_hh)
diff --git a/src/Partially_Reduced_Product.templates.hh b/src/Partially_Reduced_Product.templates.hh
new file mode 100644
index 0000000..5d06e25
--- /dev/null
+++ b/src/Partially_Reduced_Product.templates.hh
@@ -0,0 +1,462 @@
+/* Partially_Reduced_Product class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_templates_hh
+#define PPL_Partially_Reduced_Product_templates_hh 1
+
+#include "Grid_Generator.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+	 cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  return cs;
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::minimized_constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+	 cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  if (cs.has_strict_inequalities()) {
+    NNC_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+  else {
+    C_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+	 cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  return cgs;
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::minimized_congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+	 cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  Grid gr(cgs);
+  return gr.minimized_congruences();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_constraints(Constraint_System& cs) {
+  if (d1.can_recycle_constraint_systems()) {
+    d2.add_constraints(cs);
+    d1.add_recycled_constraints(cs);
+  }
+  else
+    if (d2.can_recycle_constraint_systems()) {
+      d1.add_constraints(cs);
+      d2.add_recycled_constraints(cs);
+    }
+    else {
+      d1.add_constraints(cs);
+      d2.add_constraints(cs);
+    }
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_congruences(Congruence_System& cgs) {
+  if (d1.can_recycle_congruence_systems()) {
+    d2.add_congruences(cgs);
+    d1.add_recycled_congruences(cgs);
+  }
+  else
+    if (d2.can_recycle_congruence_systems()) {
+      d1.add_congruences(cgs);
+      d2.add_recycled_congruences(cgs);
+    }
+    else {
+      d1.add_congruences(cgs);
+      d2.add_congruences(cgs);
+    }
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Gen_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Generator& g) const {
+  reduce();
+  if (Poly_Gen_Relation::nothing() == d1.relation_with(g)
+      || Poly_Gen_Relation::nothing() == d2.relation_with(g))
+    return Poly_Gen_Relation::nothing();
+  else
+    return Poly_Gen_Relation::subsumes();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Constraint& c) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(c);
+  Poly_Con_Relation relation2 = d2.relation_with(c);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Congruence& cg) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(cg);
+  Poly_Con_Relation relation2 = d2.relation_with(cg);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+	   Coefficient& sup_n,
+	   Coefficient& sup_d,
+	   bool& maximum) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient sup1_n;
+  Coefficient sup1_d;
+  Coefficient sup2_n;
+  Coefficient sup2_d;
+  bool maximum1;
+  bool maximum2;
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+  }
+  return true;
+ }
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+	   Coefficient& inf_n,
+	   Coefficient& inf_d,
+	   bool& minimum) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient inf1_n;
+  Coefficient inf1_d;
+  Coefficient inf2_n;
+  Coefficient inf2_d;
+  bool minimum1;
+  bool minimum2;
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+  }
+  return true;
+ }
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+	   Coefficient& sup_n,
+	   Coefficient& sup_d,
+	   bool& maximum,
+	   Generator& pnt) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient sup1_n;
+  Coefficient sup1_d;
+  Coefficient sup2_n;
+  Coefficient sup2_d;
+  bool maximum1;
+  bool maximum2;
+  Generator pnt1(point());
+  Generator pnt2(point());
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, pnt1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, pnt2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    pnt = pnt2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    pnt = pnt1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    pnt = pnt1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    pnt = pnt2;
+  }
+  return true;
+ }
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+	   Coefficient& inf_n,
+	   Coefficient& inf_d,
+	   bool& minimum,
+	   Generator& pnt) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient inf1_n;
+  Coefficient inf1_d;
+  Coefficient inf2_n;
+  Coefficient inf2_d;
+  bool minimum1;
+  bool minimum2;
+  Generator pnt1(point());
+  Generator pnt2(point());
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, pnt1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, pnt2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    pnt = pnt2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    pnt = pnt1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    pnt = pnt1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    pnt = pnt2;
+  }
+  return true;
+ }
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::OK() const {
+  if (reduced) {
+    Partially_Reduced_Product<D1, D2, R> pd1 = *this;
+    Partially_Reduced_Product<D1, D2, R> pd2 = *this;
+    /* Force pd1 reduction */
+    pd1.clear_reduced_flag();
+    pd1.reduce();
+    if (pd1 != pd2)
+      return false;
+  }
+  return d1.OK() && d2.OK();
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>::ascii_load(std::istream& s) {
+  std::string str;
+  return ((s >> str) && str == "Domain"
+	  && (s >> str) && str == "1:"
+	  && d1.ascii_load(s)
+	  && (s >> str) && str == "Domain"
+	  && (s >> str) && str == "2:"
+	  && d2.ascii_load(s));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+void Smash_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d2.is_empty()) {
+    if (!d1.is_empty()) {
+      D1 new_d1(d1.space_dimension(), EMPTY);
+      std::swap(d1, new_d1);
+    }
+  }
+  else if (d1.is_empty()) {
+    D2 new_d2(d2.space_dimension(), EMPTY);
+    std::swap(d2, new_d2);
+  }
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::~Smash_Reduction() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_templates_hh)
diff --git a/src/Partially_Reduced_Product.types.hh b/src/Partially_Reduced_Product.types.hh
new file mode 100644
index 0000000..3b548f6
--- /dev/null
+++ b/src/Partially_Reduced_Product.types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Partially_Reduced_Product_types_hh
+#define PPL_Partially_Reduced_Product_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+class Smash_Reduction;
+
+template <typename D1, typename D2>
+class Constraints_Reduction;
+
+template <typename D1, typename D2>
+class No_Reduction;
+
+template <typename D1, typename D2, typename R>
+class Partially_Reduced_Product;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_types_hh)
diff --git a/src/Ph_Status.cc b/src/Ph_Status.cc
index 1557cff..b0da2ea 100644
--- a/src/Ph_Status.cc
+++ b/src/Ph_Status.cc
@@ -1,11 +1,11 @@
 /* Polyhedron::Status class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Polyhedron.defs.hh"
 #include <iostream>
@@ -81,7 +81,7 @@ PPL::Polyhedron::Status::ascii_dump(std::ostream& s) const {
     << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd << ' ';
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Polyhedron::Status);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Polyhedron::Status)
 
 bool
 PPL::Polyhedron::Status::ascii_load(std::istream& s) {
@@ -153,7 +153,7 @@ PPL::Polyhedron::Status::ascii_load(std::istream& s) {
   else
     reset_sat_g_up_to_date();
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
diff --git a/src/Ph_Status.idefs.hh b/src/Ph_Status.idefs.hh
index c0e03d5..a013797 100644
--- a/src/Ph_Status.idefs.hh
+++ b/src/Ph_Status.idefs.hh
@@ -1,11 +1,11 @@
 /* Polyhedron::Status class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,8 +20,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#ifndef PPL_Status_defs_hh
-#define PPL_Status_defs_hh 1
+#ifndef PPL_Status_idefs_hh
+#define PPL_Status_idefs_hh 1
 
 #ifndef PPL_IN_Polyhedron_CLASS
 #error "Do not include Ph_Status.idefs.hh directly; use Polyhedron.defs.hh instead."
@@ -133,12 +133,12 @@ public:
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
 
@@ -179,4 +179,4 @@ private:
   void reset(flags_t mask);
 };
 
-#endif // !defined(PPL_Status_defs_hh)
+#endif // !defined(PPL_Status_idefs_hh)
diff --git a/src/Ph_Status.inlines.hh b/src/Ph_Status.inlines.hh
index 2eddc51..dd03969 100644
--- a/src/Ph_Status.inlines.hh
+++ b/src/Ph_Status.inlines.hh
@@ -1,11 +1,11 @@
 /* Polyhedron::Status class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Pointset_Powerset.cc b/src/Pointset_Powerset.cc
new file mode 100644
index 0000000..56840f4
--- /dev/null
+++ b/src/Pointset_Powerset.cc
@@ -0,0 +1,326 @@
+/* Pointset_Powerset class implementation: non-inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "Pointset_Powerset.defs.hh"
+#include "Grid.defs.hh"
+#include <utility>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+template <>
+void
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::poly_difference_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  // Ensure omega-reduction.
+  x.omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence = x.sequence;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+    const NNC_Polyhedron& py = yi->element();
+    Sequence tmp_sequence;
+    for (Sequence_const_iterator nsi = new_sequence.begin(),
+	   ns_end = new_sequence.end(); nsi != ns_end; ++nsi) {
+      std::pair<NNC_Polyhedron, Pointset_Powerset<NNC_Polyhedron> > partition
+	= linear_partition(py, nsi->element());
+      const Pointset_Powerset<NNC_Polyhedron>& residues = partition.second;
+      // Append the contents of `residues' to `tmp_sequence'.
+      std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+    }
+    std::swap(tmp_sequence, new_sequence);
+  }
+  std::swap(x.sequence, new_sequence);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+bool
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+    if (!check_containment(yi->element(), x))
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+bool
+PPL::check_containment(const NNC_Polyhedron& ph,
+		       const Pointset_Powerset<NNC_Polyhedron>& ps) {
+  if (ph.is_empty())
+    return true;
+  Pointset_Powerset<NNC_Polyhedron> tmp(ph.space_dimension(), EMPTY);
+  tmp.add_disjunct(ph);
+  for (Pointset_Powerset<NNC_Polyhedron>::const_iterator
+	 i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+    const NNC_Polyhedron& pi = i->element();
+    for (Pointset_Powerset<NNC_Polyhedron>::iterator
+	   j = tmp.begin(); j != tmp.end(); ) {
+      const NNC_Polyhedron& pj = j->element();
+      if (pi.contains(pj))
+	j = tmp.drop_disjunct(j);
+      else
+	++j;
+    }
+    if (tmp.empty())
+      return true;
+    else {
+      Pointset_Powerset<NNC_Polyhedron> new_disjuncts(ph.space_dimension(),
+						      EMPTY);
+      for (Pointset_Powerset<NNC_Polyhedron>::iterator
+	     j = tmp.begin(); j != tmp.end(); ) {
+	const NNC_Polyhedron& pj = j->element();
+	if (pj.is_disjoint_from(pi))
+	  ++j;
+	else {
+	  std::pair<NNC_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+	    partition = linear_partition(pi, pj);
+	  new_disjuncts.upper_bound_assign(partition.second);
+	  j = tmp.drop_disjunct(j);
+	}
+      }
+      tmp.upper_bound_assign(new_disjuncts);
+    }
+  }
+  return false;
+}
+
+
+namespace {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Uses the congruence \p c to approximately partition the grid \p qq.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p qq and congruence \p c is stored
+  in \p qq, whereas a finite set of grids whose set-theoretic union
+  contains the intersection of \p qq with the negation of \p c
+  is added, as a set of new disjuncts, to the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+approximate_partition_aux(const PPL::Congruence& c,
+			  PPL::Grid& qq,
+			  PPL::Pointset_Powerset<PPL::Grid>& r) {
+  using namespace PPL;
+  const Coefficient& c_modulus = c.modulus();
+  Grid qq_copy(qq);
+  qq.add_congruence(c);
+  if (qq.is_empty()) {
+    r.add_disjunct(qq_copy);
+    return true;
+  }
+
+  Congruence_System cgs = qq.congruences();
+  Congruence_System cgs_copy = qq_copy.congruences();
+  // When c is an equality, not satisfied by Grid qq
+  // then add qq to the set r. There is no finite
+  // partition in this case.
+  if (c_modulus == 0) {
+    if (cgs.num_equalities() != cgs_copy.num_equalities()) {
+      r.add_disjunct(qq_copy);
+      return false;
+    }
+    return true;
+  }
+
+  // When c is a proper congruence but, in qq, this direction has
+  // no congruence, then add qq to the set r. There is no finite
+  // partition in this case.
+  if (cgs.num_proper_congruences() != cgs_copy.num_proper_congruences()) {
+    r.add_disjunct(qq_copy);
+    return false;
+  }
+
+  // When  c is a proper congruence and qq also is discrete
+  // in this direction, then there is a finite partition and that
+  // is added to r.
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+  Linear_Expression le(c);
+  le -= c_inhomogeneous_term;
+  TEMP_INTEGER(n);
+  rem_assign(n, c_inhomogeneous_term, c_modulus);
+  if (n < 0)
+    n += c_modulus;
+  TEMP_INTEGER(i);
+  for (i = c_modulus; i-- > 0; )
+    if (i != n) {
+      Grid qqq(qq_copy);
+      qqq.add_congruence((le+i %= 0) / c_modulus);
+      if (!qqq.is_empty())
+	r.add_disjunct(qqq);
+    }
+  return true;
+}
+
+} // namespace
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+std::pair<PPL::Grid, PPL::Pointset_Powerset<PPL::Grid> >
+PPL::approximate_partition(const Grid& p, const Grid& q,
+			   bool& finite_partition) {
+  using namespace PPL;
+  finite_partition = true;
+  Pointset_Powerset<Grid> r(p.space_dimension(), EMPTY);
+  // Ensure that the congruence system of q is minimized
+  // before copying and calling approximate_partition_aux().
+  (void) q.minimized_congruences();
+  Grid qq = q;
+  const Congruence_System& pcs = p.congruences();
+  for (Congruence_System::const_iterator i = pcs.begin(),
+	 pcs_end = pcs.end(); i != pcs_end; ++i)
+    if (!approximate_partition_aux(*i, qq, r)) {
+      finite_partition = false;
+      Pointset_Powerset<Grid> s(q);
+      return std::make_pair(qq, s);
+    }
+  return std::make_pair(qq, r);
+}
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+bool
+PPL::check_containment(const Grid& ph,
+		       const Pointset_Powerset<Grid>& ps) {
+  if (ph.is_empty())
+    return true;
+  Pointset_Powerset<Grid> tmp(ph.space_dimension(), EMPTY);
+  tmp.add_disjunct(ph);
+  for (Pointset_Powerset<Grid>::const_iterator
+	 i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+    const Grid& pi = i->element();
+    for (Pointset_Powerset<Grid>::iterator
+	   j = tmp.begin(); j != tmp.end(); ) {
+      const Grid& pj = j->element();
+      if (pi.contains(pj))
+	j = tmp.drop_disjunct(j);
+      else
+	++j;
+    }
+    if (tmp.empty())
+      return true;
+    else {
+      Pointset_Powerset<Grid> new_disjuncts(ph.space_dimension(),
+						      EMPTY);
+      for (Pointset_Powerset<Grid>::iterator
+	     j = tmp.begin(); j != tmp.end(); ) {
+	const Grid& pj = j->element();
+	if (pj.is_disjoint_from(pi))
+	  ++j;
+	else {
+          bool finite_partition;
+	  std::pair<Grid, Pointset_Powerset<Grid> >
+	    partition = approximate_partition(pi, pj, finite_partition);
+
+          // If there is a finite partition, then we add the new
+          // disjuncts to the temporary set of disjuncts and drop pj.
+          // If there is no finite partition, then by the
+          // specification of approximate_partition(), we can
+          // ignore checking the remaining temporary disjuncts as they
+          // will all have the same lines and equalities and therefore
+          // also not have a finite partition wrt pi.
+          if (!finite_partition)
+            break;
+	  new_disjuncts.upper_bound_assign(partition.second);
+	  j = tmp.drop_disjunct(j);
+	}
+      }
+      tmp.upper_bound_assign(new_disjuncts);
+    }
+  }
+  return false;
+}
+
+template <>
+void
+PPL::Pointset_Powerset<PPL::Grid>
+::poly_difference_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  // Ensure omega-reduction.
+  x.omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence = x.sequence;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+    const Grid& py = yi->element();
+    Sequence tmp_sequence;
+    for (Sequence_const_iterator nsi = new_sequence.begin(),
+	   ns_end = new_sequence.end(); nsi != ns_end; ++nsi) {
+      bool finite_partition;
+      std::pair<Grid, Pointset_Powerset<Grid> > partition
+	= approximate_partition(py, nsi->element(), finite_partition);
+      const Pointset_Powerset<Grid>& residues = partition.second;
+      // Append the contents of `residues' to `tmp_sequence'.
+      std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+    }
+    std::swap(tmp_sequence, new_sequence);
+  }
+  std::swap(x.sequence, new_sequence);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+bool
+PPL::Pointset_Powerset<PPL::Grid>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+    if (!check_containment(yi->element(), x))
+      return false;
+  return true;
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+                    Complexity_Class)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+			 (NNC_Polyhedron(i->element())));
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+                    Complexity_Class)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (Pointset_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<C_Polyhedron>
+			 (C_Polyhedron(i->element())));
+
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of C_Polyhedron, by
+  // enforcing topological closure, may have made different elements
+  // comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
diff --git a/src/Pointset_Powerset.defs.hh b/src/Pointset_Powerset.defs.hh
new file mode 100644
index 0000000..c96f69f
--- /dev/null
+++ b/src/Pointset_Powerset.defs.hh
@@ -0,0 +1,1449 @@
+/* Pointset_Powerset class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_defs_hh
+#define PPL_Pointset_Powerset_defs_hh
+
+#include "Pointset_Powerset.types.hh"
+#include "globals.defs.hh"
+#include "BHRZ03_Certificate.types.hh"
+#include "Constraint.types.hh"
+#include "Constraint_System.types.hh"
+#include "Congruence.types.hh"
+#include "Congruence_System.types.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include "Polyhedron.defs.hh"
+#include "Grid.defs.hh"
+#include "Partially_Reduced_Product.defs.hh"
+#include "Variables_Set.types.hh"
+#include "Determinate.defs.hh"
+#include "Powerset.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL polyhedra.
+/*! \ingroup PPL_CXX_interface */
+/*!
+  \warning
+  At present, the supported instantiations for the
+  disjunct domain template \p PS are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape<T></CODE>,
+  <CODE>BD_Shape<T></CODE>,
+  <CODE>Box<T></CODE>.
+*/
+template <typename PS>
+class Parma_Polyhedra_Library::Pointset_Powerset
+  : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PS> > {
+public:
+  typedef PS element_type;
+
+private:
+  typedef Determinate<PS> CS;
+  typedef Powerset<CS> Base;
+
+public:
+  //! Returns the maximum space dimension a Pointset_Powerset<PS> can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors
+  //@{
+
+  //! Builds a universe (top) or empty (bottom) Pointset_Powerset.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the powerset;
+
+    \param kind
+    Specifies whether the universe or the empty powerset has to be built.
+  */
+  explicit
+  Pointset_Powerset(dimension_type num_dimensions = 0,
+		    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Pointset_Powerset(const Pointset_Powerset& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Conversion constructor: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PS</CODE>.
+
+    \param y
+    The powerset to be used to build the new powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+  */
+  template <typename QH>
+  explicit Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Creates a Pointset_Powerset from a product
+    This will be craeted as a single disjunct of type PS that
+    approximates the product.
+  */
+   template <typename QH1, typename QH2, typename R>
+   explicit
+     Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of constraints \p cs.
+  */
+  explicit Pointset_Powerset(const Constraint_System& cs);
+
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of congruences \p cgs.
+  */
+  explicit Pointset_Powerset(const Congruence_System& cgs);
+
+
+  //! Builds a pointset_powerset out of a closed polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
+
+    \param ph
+    The closed polyhedron to be used to build the powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const C_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of an nnc polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
+
+    \param ph
+    The closed polyhedron to be used to build the powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const NNC_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+
+  //! Builds a pointset_powerset out of a grid.
+  /*!
+    If the grid is nonempty, builds a powerset containing a single
+    disjunct approximating the grid. Builds the empty powerset
+    otherwise. The powerset inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const Grid& gr,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of an octagonal shape.
+  /*!
+    If the octagonal shape is nonempty, builds a powerset
+    containing a single disjunct approximating the octagonal
+    shape. Builds the empty powerset otherwise. The powerset
+    inherits the space dimension of the octagonal shape.
+
+    \param os
+    The octagonal shape to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const Octagonal_Shape<T>& os,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of a bd shape.
+  /*!
+    If the bd shape is nonempty, builds a powerset containing a
+    single disjunct approximating the bd shape. Builds the empty
+    powerset otherwise.  The powerset inherits the space dimension
+    of the bd shape.
+
+    \param bds
+    The bd shape to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bdss exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const BD_Shape<T>& bds,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of a box.
+  /*!
+    If the box is nonempty, builds a powerset containing a single
+    disjunct approximating the box. Builds the empty powerset
+    otherwise.  The powerset inherits the space dimension of the box.
+
+    \param box
+    The box to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Pointset_Powerset(const Box<Interval>& box,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Pointset_Powerset
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type affine_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty powerset.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is the top element of the powerser lattice.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the disjuncts
+    in \p *this are topologically closed.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all elements in \p *this
+    are bounded.
+  */
+  bool is_bounded() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Pointset_Powerset& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+
+    \note
+    A variable is constrained if there exists a non-redundant disjunct
+    that is constraining the variable: this definition relies on the
+    powerset lattice structure and may be somewhat different from the
+    geometric intuition.
+    For instance, variable \f$x\f$ is constrained in the powerset
+    \f[
+      \mathit{ps} = \bigl\{ \{ x \geq 0 \}, \{ x \leq 0 \} \bigr\},
+    \f]
+    even though \f$\mathit{ps}\f$ is geometrically equal to the
+    whole vector space.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this geometrically
+    covers \p y, i.e., if any point (in some element) of \p y is also
+    a point (of some element) of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_covers(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is geometrically
+    equal to \p y, i.e., if (the elements of) \p *this and \p y
+    contain the same set of points.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_equals(const Pointset_Powerset& y) const;
+
+  /*! brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Pointset_Powerset& y) const;
+
+  /*! brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is strictly contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Pointset_Powerset
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Pointset_Powerset
+  //@{
+
+  //! Adds to \p *this the disjunct \p ph.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p ph are dimension-incompatible.
+  */
+  void add_disjunct(const PS& ph);
+
+  //! Intersects \p *this with constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Intersects \p *this with the constraint \p c, minimizing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  //! Intersects \p *this with the constraints in \p cs.
+  /*!
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Intersects \p *this with the constraints in \p cs,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  //! Intersects \p *this with congruence \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_congruence(const Congruence& c);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Intersects \p *this with the congruence \p c, minimizing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Congruence& c);
+
+  //! Intersects \p *this with the congruences in \p cgs.
+  /*!
+    \param cgs
+    The congruences to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Intersects \p *this with the congruences in \p cs,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The congruences to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each disjunct in \p *this
+    with each disjunct in \p y and collecting all these intersections.
+  */
+  void intersection_assign(const Pointset_Powerset& y);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each disjunct in \p *this
+    with each disjunct in \p y, minimizing the result
+    and collecting all these intersections.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool intersection_assign_and_minimize(const Pointset_Powerset& y);
+
+  //! Assigns to \p *this the difference of \p *this and \p y.
+  // FIXME: document the intended semantics.
+  void poly_difference_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this an (a smallest)
+    over-approximation as a powerset of the disjunct domain of the
+    set-theoretical difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Powerset_Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_preimage(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    The result is obtained by computing the pairwise
+    \ref Time_Elapse_Operator "time elapse" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void time_elapse_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assign to \p *this the result of (recursively) merging together
+    the pairs of disjuncts whose upper-bound is the same as their
+    set-theoretical union.
+
+    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different disjuncts
+    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+  */
+  void pairwise_reduce();
+
+  /*! \brief
+    Assigns to \p *this the result of applying the
+    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+    to \p *this and \p y, using the widening function \p wf
+    and the cardinality threshold \p max_disjuncts.
+
+    \param y
+    A powerset that <EM>must</EM> definitely entail \p *this;
+
+    \param wf
+    The widening function to be used on polyhedra objects. It is obtained
+    from the corresponding widening method by using the helper function
+    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+    \param max_disjuncts
+    The maximum number of disjuncts occurring in the powerset \p *this
+    <EM>before</EM> starting the computation. If this number is exceeded,
+    some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    For a description of the extrapolation operator,
+    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+  */
+  template <typename Widening>
+  void BGP99_extrapolation_assign(const Pointset_Powerset& y,
+				  Widening wf,
+				  unsigned max_disjuncts);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref pps_certificate_widening "BHZ03-widening"
+    between \p *this and \p y, using the widening function \p wf
+    certified by the convergence certificate \p Cert.
+
+    \param y
+    The finite powerset computed in the previous iteration step.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param wf
+    The widening function to be used on disjuncts.
+    It is obtained from the corresponding widening method by using
+    the helper function widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    In order to obtain a proper widening operator, the template parameter
+    \p Cert should be a finite convergence certificate for the base-level
+    widening function \p wf; otherwise, an extrapolation operator is
+    obtained.
+    For a description of the methods that should be provided
+    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+  */
+  template <typename Cert, typename Widening>
+  void BHZ03_widening_assign(const Pointset_Powerset& y, Widening wf);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Pointset_Powerset& operator=(const Pointset_Powerset& y);
+
+  /*! \brief
+    Conversion assignment: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PS</CODE>
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  template <typename QH>
+  Pointset_Powerset& operator=(const Pointset_Powerset<QH>& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Pointset_Powerset& y);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    and embeds each disjunct in \p *this in the new space.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    without embedding the disjuncts in \p *this in the new space.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  //! Assigns to \p *this the concatenation of \p *this and \p y.
+  /*!
+    The result is obtained by computing the pairwise
+    \ref Concatenating_Polyhedra "concatenation" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void concatenate_assign(const Pointset_Powerset& y);
+
+  //! Removes all the specified space dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher space dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a partial function.
+
+    See also Polyhedron::map_space_dimensions.
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+  typedef typename Base::size_type size_type;
+  typedef typename Base::value_type value_type;
+  typedef typename Base::iterator iterator;
+  typedef typename Base::const_iterator const_iterator;
+  typedef typename Base::reverse_iterator reverse_iterator;
+  typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+private:
+  typedef typename Base::Sequence Sequence;
+  typedef typename Base::Sequence_iterator Sequence_iterator;
+  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  /*! \brief
+    Assigns to \p to_be_enlarged a
+    \ref Powerset_Meet_Preserving_Simplification
+    "powerset meet-preserving enlargement" of itself with respect to \p *this.
+    If \c false is returned, then the intersection is empty.
+
+    \note
+    It is assumed that \p *this and \p to_be_enlarged are
+    topology-compatible and dimension-compatible.
+  */
+  bool intersection_preserving_enlarge_element(PS& to_be_enlarged) const;
+
+  /*! \brief
+    Assigns to \p *this the result of applying the BGP99 heuristics
+    to \p *this and \p y, using the widening function \p wf.
+  */
+  template <typename Widening>
+  void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf);
+
+  //! Records in \p cert_ms the certificates for this set of disjuncts.
+  template <typename Cert>
+  void collect_certificates(std::map<Cert, size_type,
+			             typename Cert::Compare>& cert_ms) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the current set of dijsuncts
+    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+  */
+  template <typename Cert>
+  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                                                   typename Cert::Compare>&
+				    y_cert_ms) const;
+
+  // FIXME: here it should be enough to befriend the template constructor
+  // template <typename QH>
+  // Pointset_Powerset(const Pointset_Powerset<QH>&),
+  // but, apparently, this cannot be done.
+  friend class Pointset_Powerset<NNC_Polyhedron>;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Pointset_Powerset
+  Let \p p and \p q be two polyhedra.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PS, Pointset_Powerset\<NNC_Polyhedron\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p;
+  - the set-theoretical union of <CODE>r.first</CODE> with all the
+    elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+
+  \if Include_Implementation_Details
+
+  See
+  <A HREF="http://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
+  this paper</A> for more information about the implementation.
+  \endif
+*/
+template <typename PS>
+std::pair<PS, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PS& p, const PS& q);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+		  const Pointset_Powerset<NNC_Polyhedron>& ps);
+
+
+/*! \brief
+  Partitions the grid \p q with respect to grid \p p if and only if
+  such a partition is finite.
+
+  \relates Parma_Polyhedra_Library::Pointset_Powerset
+  Let \p p and \p q be two grids.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PS, Pointset_Powerset\<Grid\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - If there is a finite partition of \p q wrt \p p
+    the Boolean <CODE>finite_partition</CODE> is set to true and
+    <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p and the set-theoretical
+    union of <CODE>r.first</CODE> with all the elements of
+    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+  - Otherwise the Boolean <CODE>finite_partition</CODE> is set to false
+    and the singleton set that contains \p q is stored in
+    <CODE>r.second</CODE>r.
+*/
+std::pair<Grid, Pointset_Powerset<Grid> >
+approximate_partition(const Grid& p, const Grid& q, bool& finite_partition);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the grids \p ps contains the grid \p g.
+
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const Grid& ph,
+		  const Pointset_Powerset<Grid>& ps);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the objects in \p ps contains \p ph.
+
+  \relates Pointset_Powerset
+  \note
+  It is assumed that the template parameter PS can be converted
+  without precision loss into an NNC_Polyhedron; otherwise,
+  an incorrect result might be obtained.
+*/
+template <typename PS>
+bool
+check_containment(const PS& ph, const Pointset_Powerset<PS>& ps);
+
+// CHECKME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+                    Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+                    Complexity_Class);
+
+template <>
+void
+Pointset_Powerset<NNC_Polyhedron>
+::poly_difference_assign(const Pointset_Powerset& y);
+
+template <>
+void
+Pointset_Powerset<Grid>
+::poly_difference_assign(const Pointset_Powerset& y);
+
+template <>
+bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+template <>
+bool
+Pointset_Powerset<Grid>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+template <typename PS>
+void swap(Parma_Polyhedra_Library::Pointset_Powerset<PS>& x,
+	  Parma_Polyhedra_Library::Pointset_Powerset<PS>& y);
+
+} // namespace std
+
+#include "Pointset_Powerset.inlines.hh"
+#include "Pointset_Powerset.templates.hh"
+
+#endif // !defined(PPL_Pointset_Powerset_defs_hh)
diff --git a/src/Pointset_Powerset.inlines.hh b/src/Pointset_Powerset.inlines.hh
new file mode 100644
index 0000000..4e82d8f
--- /dev/null
+++ b/src/Pointset_Powerset.inlines.hh
@@ -0,0 +1,337 @@
+/* Pointset_Powerset class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_inlines_hh
+#define PPL_Pointset_Powerset_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Congruence.defs.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PS>
+inline dimension_type
+Pointset_Powerset<PS>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename PS>
+inline dimension_type
+Pointset_Powerset<PS>::max_space_dimension() {
+  return PS::max_space_dimension();
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(dimension_type num_dimensions,
+					 Degenerate_Element kind)
+  : Base(), space_dim(num_dimensions) {
+  Pointset_Powerset& x = *this;
+  if (kind == UNIVERSE)
+    x.sequence.push_back(Determinate<PS>(PS(num_dimensions, kind)));
+  assert(x.OK());
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Pointset_Powerset& y,
+                                         Complexity_Class)
+  : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const C_Polyhedron& ph,
+                                         Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PS>(PS(ph, complexity)));
+  x.reduced = false;
+  assert(OK());
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const NNC_Polyhedron& ph,
+                                         Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PS>(PS(ph, complexity)));
+  assert(OK());
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Grid& gr,
+                                         Complexity_Class)
+  : Base(), space_dim(gr.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!gr.is_empty()) {
+    x.sequence.push_back(Determinate<PS>(PS(gr)));
+  }
+  assert(OK());
+}
+
+template <typename PS>
+template <typename QH1, typename QH2, typename R>
+inline
+Pointset_Powerset<PS>
+::Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                    Complexity_Class complexity)
+  : Base(), space_dim(prp.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (prp.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PS>(PS(prp, complexity)));
+  x.reduced = false;
+  assert(OK());
+}
+
+template <typename PS>
+template <typename Interval>
+Pointset_Powerset<PS>::Pointset_Powerset(const Box<Interval>& box,
+                                         Complexity_Class)
+  : Base(), space_dim(box.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!box.is_empty())
+    x.sequence.push_back(Determinate<PS>(PS(box)));
+  assert(OK());
+}
+
+template <typename PS>
+template <typename T>
+Pointset_Powerset<PS>::Pointset_Powerset(const Octagonal_Shape<T>& os,
+                                         Complexity_Class)
+  : Base(), space_dim(os.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!os.is_empty())
+    x.sequence.push_back(Determinate<PS>(PS(os)));
+  assert(OK());
+}
+
+template <typename PS>
+template <typename T>
+Pointset_Powerset<PS>::Pointset_Powerset(const BD_Shape<T>& bds,
+                                         Complexity_Class)
+  : Base(), space_dim(bds.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!bds.is_empty())
+    x.sequence.push_back(Determinate<PS>(PS(bds)));
+  assert(OK());
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Constraint_System& cs)
+  : Base(Determinate<PS>(cs)), space_dim(cs.space_dimension()) {
+  assert(OK());
+}
+
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Congruence_System& cgs)
+  : Base(Determinate<PS>(cgs)), space_dim(cgs.space_dimension()) {
+  assert(OK());
+}
+
+template <typename PS>
+inline Pointset_Powerset<PS>&
+Pointset_Powerset<PS>::operator=(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::operator=(y);
+  x.space_dim = y.space_dim;
+  return x;
+}
+
+template <typename PS>
+inline void
+Pointset_Powerset<PS>::swap(Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::swap(y);
+  std::swap(x.space_dim, y.space_dim);
+}
+
+template <typename PS>
+template <typename QH>
+inline Pointset_Powerset<PS>&
+Pointset_Powerset<PS>::operator=(const Pointset_Powerset<QH>& y) {
+  Pointset_Powerset& x = *this;
+  Pointset_Powerset<PS> pps(y);
+  x.swap(pps);
+  return x;
+}
+
+template <typename PS>
+inline void
+Pointset_Powerset<PS>::intersection_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PS::intersection_assign)));
+}
+
+template <typename PS>
+inline bool
+Pointset_Powerset<PS>
+::intersection_assign_and_minimize(const Pointset_Powerset& y) {
+  intersection_assign(y);
+  return !is_empty();
+}
+
+template <typename PS>
+inline void
+Pointset_Powerset<PS>::time_elapse_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PS::time_elapse_assign)));
+}
+
+template <typename PS>
+inline bool
+Pointset_Powerset<PS>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy);
+}
+
+template <typename PS>
+inline bool
+Pointset_Powerset<PS>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Pointset_Powerset<Grid>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <>
+inline bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PS>
+inline memory_size_type
+Pointset_Powerset<PS>::external_memory_in_bytes() const {
+  return Base::external_memory_in_bytes();
+}
+
+template <typename PS>
+inline memory_size_type
+Pointset_Powerset<PS>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PS>
+inline int32_t
+Pointset_Powerset<PS>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
+
+template <typename PS>
+inline void
+Pointset_Powerset<PS>
+::poly_difference_assign(const Pointset_Powerset& y) {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  Pointset_Powerset<NNC_Polyhedron> nnc_this(*this);
+  Pointset_Powerset<NNC_Polyhedron> nnc_y(y);
+  nnc_this.poly_difference_assign(nnc_y);
+  *this = nnc_this;
+}
+
+template <typename PS>
+inline void
+Pointset_Powerset<PS>
+::difference_assign(const Pointset_Powerset& y) {
+  poly_difference_assign(y);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PS>
+inline bool
+check_containment(const PS& ph, const Pointset_Powerset<PS>& ps) {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
+  const Pointset_Powerset<NNC_Polyhedron> pps(ps);
+  return check_containment(pph, pps);
+}
+
+/*! \relates Pointset_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+		  const Pointset_Powerset<C_Polyhedron>& ps) {
+  return check_containment(NNC_Polyhedron(ph),
+			   Pointset_Powerset<NNC_Polyhedron>(ps));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+template <typename PS>
+inline void
+swap(Parma_Polyhedra_Library::Pointset_Powerset<PS>& x,
+     Parma_Polyhedra_Library::Pointset_Powerset<PS>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Pointset_Powerset_inlines_hh)
diff --git a/src/Pointset_Powerset.templates.hh b/src/Pointset_Powerset.templates.hh
new file mode 100644
index 0000000..3addfc4
--- /dev/null
+++ b/src/Pointset_Powerset.templates.hh
@@ -0,0 +1,1556 @@
+/* Pointset_Powerset class implementation: non-inline template functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_templates_hh
+#define PPL_Pointset_Powerset_templates_hh 1
+
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include "Variables_Set.defs.hh"
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_disjunct(const PS& ph) {
+  Pointset_Powerset& x = *this;
+  if (x.space_dimension() != ph.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PS>::add_disjunct(ph):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "ph.space_dimension() == " << ph.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  x.sequence.push_back(Determinate<PS>(ph));
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+			 (NNC_Polyhedron(i->element(), complexity)));
+  // FIXME: the following is a bug!
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
+
+template <typename PS>
+template <typename QH>
+Pointset_Powerset<PS>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<PS>(PS(i->element(), complexity)));
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of PS may have made
+  // different QH elements to become comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::concatenate_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  x.omega_reduce();
+  y.omega_reduce();
+  Pointset_Powerset<PS> new_x(x.space_dim + y.space_dim, EMPTY);
+  for (const_iterator xi = x.begin(), x_end = x.end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      CS zi = *xi;
+      zi.concatenate_assign(*yi);
+      assert(!zi.is_bottom());
+      new_x.sequence.push_back(zi);
+    }
+    ++xi;
+    if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
+      // Hurry up!
+      PS xph = xi->element();
+      for (++xi; xi != x_end; ++xi)
+	xph.upper_bound_assign(xi->element());
+      const_iterator yi = y_begin;
+      PS yph = yi->element();
+      for (++yi; yi != y_end; ++yi)
+	yph.upper_bound_assign(yi->element());
+      xph.concatenate_assign(yph);
+      x.swap(new_x);
+      x.add_disjunct(xph);
+      assert(x.OK());
+      return;
+    }
+  }
+  x.swap(new_x);
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraint(c);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::add_constraint_and_minimize(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraint_and_minimize(c))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_constraint(c);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraints(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::
+add_constraints_and_minimize(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraints_and_minimize(cs))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_constraints(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_congruence(const Congruence& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_congruence(c);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_congruence(const Congruence& cg) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_congruence(cg);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::add_congruence_and_minimize(const Congruence& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_congruence_and_minimize(c))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_congruences(const Congruence_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_congruences(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_congruences(const Congruence_System& cgs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_congruences(cgs);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::
+add_congruences_and_minimize(const Congruence_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_congruences_and_minimize(cs))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::unconstrain(const Variable var) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().unconstrain(var);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().unconstrain(to_be_unconstrained);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_space_dimensions_and_embed(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_embed(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_space_dimensions_and_project(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_project(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::
+remove_space_dimensions(const Variables_Set& to_be_removed) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_removed = to_be_removed.size();
+  if (num_removed > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_space_dimensions(to_be_removed);
+      x.reduced = false;
+    }
+    x.space_dim -= num_removed;
+    assert(x.OK());
+  }
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::remove_higher_space_dimensions(dimension_type
+						      new_dimension) {
+  Pointset_Powerset& x = *this;
+  if (new_dimension < x.space_dim) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_higher_space_dimensions(new_dimension);
+      x.reduced = false;
+    }
+    x.space_dim = new_dimension;
+    assert(x.OK());
+  }
+}
+
+template <typename PS>
+template <typename Partial_Function>
+void
+Pointset_Powerset<PS>::map_space_dimensions(const Partial_Function& pfunc) {
+  Pointset_Powerset& x = *this;
+  if (x.is_bottom()) {
+    dimension_type n = 0;
+    for (dimension_type i = x.space_dim; i-- > 0; ) {
+      dimension_type new_i;
+      if (pfunc.maps(i, new_i))
+	++n;
+    }
+    x.space_dim = n;
+  }
+  else {
+    Sequence_iterator s_begin = x.sequence.begin();
+    for (Sequence_iterator si = s_begin,
+	   s_end = x.sequence.end(); si != s_end; ++si)
+      si->element().map_space_dimensions(pfunc);
+    x.space_dim = s_begin->element().space_dimension();
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::expand_space_dimension(Variable var,
+                                              dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().expand_space_dimension(var, m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                             Variable var) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_folded = to_be_folded.size();
+  if (num_folded > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si)
+      si->element().fold_space_dimensions(to_be_folded, var);
+  }
+  x.space_dim -= num_folded;
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::affine_image(Variable var,
+                                    const Linear_Expression& expr,
+                                    Coefficient_traits::const_reference
+                                    denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().affine_image(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::affine_preimage(Variable var,
+                                       const Linear_Expression& expr,
+                                       Coefficient_traits::const_reference
+                                       denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().affine_preimage(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_image(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_preimage(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_image(Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_image(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_preimage(Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator) {  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_preimage(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().bounded_affine_image(var, lb_expr, ub_expr, denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().bounded_affine_preimage(var, lb_expr, ub_expr,
+                                          denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+dimension_type
+Pointset_Powerset<PS>::affine_dimension() const {
+  // The affine dimension of the powerset is the affine dimension of
+  // the smallest vector space in which it can be embedded.
+  const Pointset_Powerset& x = *this;
+  C_Polyhedron x_ph(space_dim, EMPTY);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    PS pi(si->element());
+    if (!pi.is_empty()) {
+      C_Polyhedron phi(space_dim);
+      const Constraint_System& cs = pi.minimized_constraints();
+      for (Constraint_System::const_iterator i = cs.begin(),
+             cs_end = cs.end(); i != cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_equality())
+          phi.add_constraint(c);
+      }
+      x_ph.poly_hull_assign(phi);
+    }
+  }
+
+  return x_ph.affine_dimension();
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_universe() const {
+  const Pointset_Powerset& x = *this;
+  // Exploit omega-reduction, if already computed.
+  if (x.is_omega_reduced())
+    return x.size() == 1 && x.begin()->element().is_universe();
+
+  // A powerset is universe iff one of its disjuncts is.
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->element().is_universe()) {
+      // Speculative omega-reduction, if it is worth.
+      if (x.size() > 1) {
+        Pointset_Powerset<PS> universe(x.space_dimension(), UNIVERSE);
+        Pointset_Powerset& xx = const_cast<Pointset_Powerset&>(x);
+        xx.swap(universe);
+      }
+      return true;
+    }
+  return false;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_empty() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_empty())
+      return false;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_discrete() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_discrete())
+      return false;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_topologically_closed() const {
+  const Pointset_Powerset& x = *this;
+  // The powerset must be omega-reduced before checking
+  // topological closure.
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_topologically_closed())
+      return false;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_bounded() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_bounded())
+      return false;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::constrains(Variable var) const {
+  const Pointset_Powerset& x = *this;
+  // `var' should be one of the dimensions of the powerset.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x.space_dimension() < var_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PS>::constrains(v):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "v.space_dimension() == " << var_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // omega_reduction needed, since a redundant disjunct may constrain var.
+  x.omega_reduce();
+  // An empty powerset constrains all variables.
+  if (x.is_empty())
+    return true;
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->element().constrains(var))
+      return true;
+  return false;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_disjoint_from(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    const PS& pi = si->element();
+    for (Sequence_const_iterator sj = y.sequence.begin(),
+           s_end = y.sequence.end(); sj != s_end; ++sj) {
+      const PS& pj = sj->element();
+      if (!pi.is_disjoint_from(pj))
+        return false;
+    }
+  }
+  return true;
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::topological_closure_assign() {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().topological_closure_assign();
+  assert(x.OK());
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::intersection_preserving_enlarge_element(PS& to_be_enlarged) const {
+  // FIXME: this is just an executable specification.
+  const Pointset_Powerset& context = *this;
+  assert(context.space_dimension() == to_be_enlarged.space_dimension());
+  bool nonempty_intersection = false;
+  // TODO: maybe use a *sorted* constraint system?
+  PS enlarged(context.space_dimension(), UNIVERSE);
+  for (Sequence_const_iterator si = context.sequence.begin(),
+         s_end = context.sequence.end(); si != s_end; ++si) {
+    PS context_i(si->element());
+    context_i.intersection_assign(enlarged);
+    PS enlarged_i(to_be_enlarged);
+    nonempty_intersection
+      |= enlarged_i.simplify_using_context_assign(context_i);
+    // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'?
+    enlarged.intersection_assign(enlarged_i);
+  }
+  to_be_enlarged.swap(enlarged);
+  return nonempty_intersection;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::simplify_using_context_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ) {
+    // TODO: check whether it would be useful (i.e., more efficient)
+    // to eagerly test whether *si is omega-redundant due to any of
+    // the elements preceding it (which have been already enlarged).
+    if (y.intersection_preserving_enlarge_element(si->element()))
+      ++si;
+    else
+      // Intersection with `*si' is empty: drop the disjunct.
+      si = x.sequence.erase(si);
+  }
+  x.reduced = false;
+  assert(x.OK());
+  return !x.sequence.empty();
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::contains(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         s_end = y.sequence.end(); si != s_end; ++si) {
+    const PS& pi = si->element();
+    bool pi_is_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           s_end = x.sequence.end();
+         (sj != s_end && !pi_is_contained); ++sj) {
+      const PS& pj = sj->element();
+      if (pj.contains(pi))
+        pi_is_contained = true;
+    }
+    if (!pi_is_contained)
+      return false;
+  }
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::strictly_contains(const Pointset_Powerset& y) const {
+  /* omega reduction ensures that a disjunct of y cannot be strictly
+     contained in one disjunct and also contained but not strictly
+     contained in another disjunct of *this */
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         s_end = y.sequence.end(); si != s_end; ++si) {
+    const PS& pi = si->element();
+    bool pi_is_strictly_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           s_end = x.sequence.end();
+         (sj != s_end && !pi_is_strictly_contained); ++sj) {
+      const PS& pj = sj->element();
+      if (pj.strictly_contains(pi))
+        pi_is_strictly_contained = true;
+    }
+    if (!pi_is_strictly_contained)
+      return false;
+  }
+  return true;
+}
+
+template <typename PS>
+Poly_Con_Relation
+Pointset_Powerset<PS>::relation_with(const Congruence& cg) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in cg if every disjunct is included in cg */
+  bool is_included = true;
+  /* *this is disjoint with cg if every disjunct is disjoint with cg */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with cg if some disjunct strictly
+     intersects with cg */
+  bool is_strictly_intersecting = false;
+  /* *this saturates cg if some disjunct saturates cg and
+     every disjunct is either disjoint from cg or saturates cg */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->element().relation_with(cg);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
+}
+
+template <typename PS>
+Poly_Con_Relation
+Pointset_Powerset<PS>::relation_with(const Constraint& c) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in c if every disjunct is included in c */
+  bool is_included = true;
+  /* *this is disjoint with c if every disjunct is disjoint with c */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with c if some disjunct strictly
+     intersects with c */
+  bool is_strictly_intersecting = false;
+  /* *this saturates c if some disjunct saturates c and
+     every disjunct is either disjoint from c or saturates c */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->element().relation_with(c);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
+}
+
+template <typename PS>
+Poly_Gen_Relation
+Pointset_Powerset<PS>::relation_with(const Generator& g) const {
+  const Pointset_Powerset& x = *this;
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Gen_Relation relation_i = si->element().relation_with(g);
+    if (relation_i.implies(Poly_Gen_Relation::subsumes()))
+      return Poly_Gen_Relation::subsumes();
+  }
+
+  return Poly_Gen_Relation::nothing();
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::bounds_from_above(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().bounds_from_above(expr))
+      return false;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::bounds_from_below(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().bounds_from_below(expr))
+      return false;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::maximize(const Linear_Expression& expr,
+                                Coefficient& sup_n,
+                                Coefficient& sup_d,
+                                bool& maximum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
+
+  Coefficient supt_n = 0;
+  Coefficient supt_d = 1;
+  bool maxt = 0;
+
+  Coefficient supi_n = 0;
+  Coefficient supi_d = 1;
+  bool maxi = 0;
+  TEMP_INTEGER(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().maximize(expr, supi_n, supi_d, maxi))
+      return false;
+    else
+      if (first) {
+        first = false;
+        supt_n = supi_n;
+        supt_d = supi_d;
+        maxt = maxi;
+      }
+      else {
+        tmp = (supt_n * supi_d) - (supi_n * supt_d);
+        if (tmp < 0) {
+          supt_n = supi_n;
+          supt_d = supi_d;
+          maxt = maxi;
+        }
+        else if (tmp == 0)
+          maxt = maxt || maxi;
+      }
+  }
+  sup_n = supt_n;
+  sup_d = supt_d;
+  maximum = maxt;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::maximize(const Linear_Expression& expr,
+                                Coefficient& sup_n,
+                                Coefficient& sup_d,
+                                bool& maximum,
+                                Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
+
+  Coefficient supt_n = 0;
+  Coefficient supt_d = 1;
+  bool maxt = 0;
+  Generator gt = point();
+
+  Coefficient supi_n = 0;
+  Coefficient supi_d = 1;
+  bool maxi = 0;
+  Generator gi = point();
+  TEMP_INTEGER(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().maximize(expr, supi_n, supi_d, maxi, gi))
+      return false;
+    else
+      if (first) {
+        first = false;
+        supt_n = supi_n;
+        supt_d = supi_d;
+        maxt = maxi;
+        gt = gi;
+      }
+      else {
+        tmp = (supt_n * supi_d) - (supi_n * supt_d);
+        if (tmp < 0) {
+          supt_n = supi_n;
+          supt_d = supi_d;
+          maxt = maxi;
+          gt = gi;
+        }
+        else if (tmp == 0) {
+          maxt = maxt || maxi;
+          gt = gi;
+        }
+      }
+  }
+  sup_n = supt_n;
+  sup_d = supt_d;
+  maximum = maxt;
+  g = gt;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::minimize(const Linear_Expression& expr,
+                                Coefficient& inf_n,
+                                Coefficient& inf_d,
+                                bool& minimum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
+
+  Coefficient inft_n = 0;
+  Coefficient inft_d = 1;
+  bool mint = 0;
+
+  Coefficient infi_n = 0;
+  Coefficient infi_d = 1;
+  bool mini = 0;
+  TEMP_INTEGER(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().minimize(expr, infi_n, infi_d, mini))
+      return false;
+    else
+      if (first) {
+        first = false;
+        inft_n = infi_n;
+        inft_d = infi_d;
+        mint = mini;
+      }
+      else {
+        tmp = (inft_n * infi_d) - (infi_n * inft_d);
+        if (tmp > 0) {
+          inft_n = infi_n;
+          inft_d = infi_d;
+          mint = mini;
+        }
+        else if (tmp == 0)
+          mint = mint || mini;
+      }
+  }
+  inf_n = inft_n;
+  inf_d = inft_d;
+  minimum = mint;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::minimize(const Linear_Expression& expr,
+                                Coefficient& inf_n,
+                                Coefficient& inf_d,
+                                bool& minimum,
+                                Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
+
+  Coefficient inft_n = 0;
+  Coefficient inft_d = 1;
+  bool mint = 0;
+  Generator gt = point();
+
+  Coefficient infi_n = 0;
+  Coefficient infi_d = 1;
+  bool mini = 0;
+  Generator gi = point();
+  TEMP_INTEGER(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().minimize(expr, infi_n, infi_d, mini, gi))
+      return false;
+    else
+      if (first) {
+        first = false;
+        inft_n = infi_n;
+        inft_d = infi_d;
+        mint = mini;
+        gt = gi;
+      }
+      else {
+        tmp = (inft_n * infi_d) - (infi_n * inft_d);
+        if (tmp > 0) {
+          inft_n = infi_n;
+          inft_d = infi_d;
+          mint = mini;
+          gt = gi;
+        }
+        else if (tmp == 0) {
+          mint = mint || mini;
+          gt = gi;
+        }
+      }
+  }
+  inf_n = inft_n;
+  inf_d = inft_d;
+  minimum = mint;
+  g = gt;
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::contains_integer_point() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (si->element().contains_integer_point())
+      return true;
+  return false;
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::pairwise_reduce() {
+  Pointset_Powerset& x = *this;
+  // It is wise to omega-reduce before pairwise-reducing.
+  x.omega_reduce();
+
+  size_type n = x.size();
+  size_type deleted;
+  do {
+    Pointset_Powerset new_x(x.space_dim, EMPTY);
+    std::deque<bool> marked(n, false);
+    deleted = 0;
+    Sequence_iterator s_begin = x.sequence.begin();
+    Sequence_iterator s_end = x.sequence.end();
+    unsigned si_index = 0;
+    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+      if (marked[si_index])
+	continue;
+      PS& pi = si->element();
+      Sequence_const_iterator sj = si;
+      unsigned sj_index = si_index;
+      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+	if (marked[sj_index])
+	  continue;
+	const PS& pj = sj->element();
+	if (pi.upper_bound_assign_if_exact(pj)) {
+	  marked[si_index] = marked[sj_index] = true;
+	  // FIXME: check whether the preservation of reduction was
+	  // actually meant here.
+	  new_x.add_non_bottom_disjunct_preserve_reduction(pi);
+	  ++deleted;
+	  goto next;
+	}
+      }
+    next:
+      ;
+    }
+    iterator nx_begin = new_x.begin();
+    iterator nx_end = new_x.end();
+    unsigned xi_index = 0;
+    for (const_iterator xi = x.begin(),
+	   x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+      if (!marked[xi_index])
+	nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*xi,
+								    nx_begin,
+								    nx_end);
+    std::swap(x.sequence, new_x.sequence);
+    n -= deleted;
+  } while (deleted > 0);
+  assert(x.OK());
+}
+
+template <typename PS>
+template <typename Widening>
+void
+Pointset_Powerset<PS>::
+BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PS> x_copy = x;
+    const Pointset_Powerset<PS> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  size_type n = x.size();
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  std::deque<bool> marked(n, false);
+  const_iterator x_begin = x.begin();
+  const_iterator x_end = x.end();
+  unsigned i_index = 0;
+  for (const_iterator i = x_begin,
+	 y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+    for (const_iterator j = y_begin; j != y_end; ++j) {
+      const PS& pi = i->element();
+      const PS& pj = j->element();
+      if (pi.contains(pj)) {
+	PS pi_copy = pi;
+	wf(pi_copy, pj);
+	// FIXME: check whether the preservation of reduction was
+	// actually meant here.
+	new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy);
+	marked[i_index] = true;
+      }
+    }
+  iterator nx_begin = new_x.begin();
+  iterator nx_end = new_x.end();
+  i_index = 0;
+  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+    if (!marked[i_index])
+      nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*i,
+								  nx_begin,
+								  nx_end);
+  std::swap(x.sequence, new_x.sequence);
+  assert(x.OK());
+  assert(x.is_omega_reduced());
+}
+
+template <typename PS>
+template <typename Widening>
+void
+Pointset_Powerset<PS>::
+BGP99_extrapolation_assign(const Pointset_Powerset& y,
+			   Widening wf,
+			   unsigned max_disjuncts) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PS> x_copy = x;
+    const Pointset_Powerset<PS> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  x.pairwise_reduce();
+  if (max_disjuncts != 0)
+    x.collapse(max_disjuncts);
+  x.BGP99_heuristics_assign(y, wf);
+}
+
+template <typename PS>
+template <typename Cert>
+void
+Pointset_Powerset<PS>::
+collect_certificates(std::map<Cert, size_type,
+                     typename Cert::Compare>& cert_ms) const {
+  const Pointset_Powerset& x = *this;
+  assert(x.is_omega_reduced());
+  assert(cert_ms.size() == 0);
+  for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
+    Cert ph_cert(i->element());
+    ++cert_ms[ph_cert];
+  }
+}
+
+template <typename PS>
+template <typename Cert>
+bool
+Pointset_Powerset<PS>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                             typename Cert::Compare>& y_cert_ms
+			     ) const {
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset x_cert_ms;
+  collect_certificates(x_cert_ms);
+  typename Cert_Multiset::const_iterator
+    xi = x_cert_ms.begin(),
+    x_cert_ms_end = x_cert_ms.end(),
+    yi = y_cert_ms.begin(),
+    y_cert_ms_end = y_cert_ms.end();
+  while (xi != x_cert_ms_end && yi != y_cert_ms_end) {
+    const Cert& xi_cert = xi->first;
+    const Cert& yi_cert = yi->first;
+    switch (xi_cert.compare(yi_cert)) {
+    case 0:
+      // xi_cert == yi_cert: check the number of multiset occurrences.
+      {
+	const size_type& xi_count = xi->second;
+	const size_type& yi_count = yi->second;
+	if (xi_count == yi_count) {
+	  // Same number of occurrences: compare the next pair.
+	  ++xi;
+	  ++yi;
+	}
+	else
+	  // Different number of occurrences: can decide ordering.
+	  return xi_count < yi_count;
+	break;
+      }
+    case 1:
+      // xi_cert > yi_cert: it is not stabilizing.
+      return false;
+
+    case -1:
+      // xi_cert < yi_cert: it is stabilizing.
+      return true;
+    }
+  }
+  // Here xi == x_cert_ms_end or yi == y_cert_ms_end.
+  // Stabilization is achieved if `y_cert_ms' still has other elements.
+  return yi != y_cert_ms_end;
+}
+
+template <typename PS>
+template <typename Cert, typename Widening>
+void
+Pointset_Powerset<PS>::BHZ03_widening_assign(const Pointset_Powerset& y,
+                                             Widening wf) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PS> x_copy = x;
+    const Pointset_Powerset<PS> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  // First widening technique: do nothing.
+
+  // If `y' is the empty collection, do nothing.
+  assert(x.size() > 0);
+  if (y.size() == 0)
+    return;
+
+  // Compute the poly-hull of `x'.
+  PS x_hull(x.space_dim, EMPTY);
+  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+    x_hull.upper_bound_assign(i->element());
+
+  // Compute the poly-hull of `y'.
+  PS y_hull(y.space_dim, EMPTY);
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    y_hull.upper_bound_assign(i->element());
+  // Compute the certificate for `y_hull'.
+  const Cert y_hull_cert(y_hull);
+
+  // If the hull is stabilizing, do nothing.
+  int hull_stabilization = y_hull_cert.compare(x_hull);
+  if (hull_stabilization == 1)
+    return;
+
+  // Multiset ordering is only useful when `y' is not a singleton.
+  const bool y_is_not_a_singleton = y.size() > 1;
+
+  // The multiset certificate for `y':
+  // we want to be lazy about its computation.
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset y_cert_ms;
+  bool y_cert_ms_computed = false;
+
+  if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // Collect the multiset certificate for `y'.
+    y.collect_certificates(y_cert_ms);
+    y_cert_ms_computed = true;
+    // If multiset ordering is stabilizing, do nothing.
+    if (x.is_cert_multiset_stabilizing(y_cert_ms))
+      return;
+  }
+
+  // Second widening technique: try the BGP99 powerset heuristics.
+  Pointset_Powerset<PS> bgp99_heuristics = x;
+  bgp99_heuristics.BGP99_heuristics_assign(y, wf);
+
+  // Compute the poly-hull of `bgp99_heuristics'.
+  PS bgp99_heuristics_hull(x.space_dim, EMPTY);
+  for (const_iterator i = bgp99_heuristics.begin(),
+	 bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
+    bgp99_heuristics_hull.upper_bound_assign(i->element());
+
+  // Check for stabilization and, if successful,
+  // commit to the result of the extrapolation.
+  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+  if (hull_stabilization == 1) {
+    // The poly-hull is stabilizing.
+    std::swap(x, bgp99_heuristics);
+    return;
+  }
+  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // If not already done, compute multiset certificate for `y'.
+    if (!y_cert_ms_computed) {
+      y.collect_certificates(y_cert_ms);
+      y_cert_ms_computed = true;
+    }
+    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, bgp99_heuristics);
+      return;
+    }
+    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+    // Note that pairwise-reduction does not affect the computation
+    // of the poly-hulls, so that we only have to check the multiset
+    // certificate relation.
+    Pointset_Powerset<PS> reduced_bgp99_heuristics(bgp99_heuristics);
+    reduced_bgp99_heuristics.pairwise_reduce();
+    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, reduced_bgp99_heuristics);
+      return;
+    }
+  }
+
+  // Fourth widening technique: this is applicable only when
+  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+    // Compute (y_hull \widen bgp99_heuristics_hull).
+    PS ph = bgp99_heuristics_hull;
+    wf(ph, y_hull);
+    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+    ph.difference_assign(bgp99_heuristics_hull);
+    x.add_disjunct(ph);
+    return;
+  }
+
+  // Fall back to the computation of the poly-hull.
+  Pointset_Powerset<PS> x_hull_singleton(x.space_dim, EMPTY);
+  x_hull_singleton.add_disjunct(x_hull);
+  std::swap(x, x_hull_singleton);
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::ascii_dump(std::ostream& s) const {
+  const Pointset_Powerset& x = *this;
+  s << "size " << x.size()
+    << "\nspace_dim " << x.space_dim
+    << "\n";
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+    xi->element().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PS, Pointset_Powerset<PS>)
+
+  template <typename PS>
+bool
+Pointset_Powerset<PS>::ascii_load(std::istream& s) {
+  Pointset_Powerset& x = *this;
+  std::string str;
+
+  if (!(s >> str) || str != "size")
+    return false;
+
+  size_type sz;
+
+  if (!(s >> sz))
+    return false;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> x.space_dim))
+    return false;
+
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  while (sz-- > 0) {
+    PS ph;
+    if (!ph.ascii_load(s))
+      return false;
+    new_x.add_disjunct(ph);
+  }
+  x.swap(new_x);
+
+  // Check invariants.
+  assert(x.OK());
+  return true;
+}
+
+template <typename PS>
+bool
+Pointset_Powerset<PS>::OK() const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+    const PS& pi = xi->element();
+    if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+		<< " in an element of the sequence,\nshould be "
+		<< x.space_dim << "."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  return x.Base::OK();
+}
+
+namespace Implementation {
+
+namespace Pointset_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p qq according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p qq and constraint \p c is stored
+  in \p qq, whereas the intersection of \p qq with the negation of \p c
+  is added as a new disjunct of the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PS>
+void
+linear_partition_aux(const Constraint& c,
+		     PS& qq,
+		     Pointset_Powerset<NNC_Polyhedron>& r) {
+  Linear_Expression le(c);
+  const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+  NNC_Polyhedron qqq(qq);
+  qqq.add_constraint(neg_c);
+  if (!qqq.is_empty())
+    r.add_disjunct(qqq);
+  qq.add_constraint(c);
+}
+
+} // namespace Pointset_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Pointset_Powerset */
+template <typename PS>
+std::pair<PS, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PS& p, const PS& q) {
+  using Implementation::Pointset_Powersets::linear_partition_aux;
+
+  Pointset_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+  PS qq = q;
+  const Constraint_System& pcs = p.constraints();
+  for (Constraint_System::const_iterator i = pcs.begin(),
+	 pcs_end = pcs.end(); i != pcs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality()) {
+      Linear_Expression le(c);
+      linear_partition_aux(le <= 0, qq, r);
+      linear_partition_aux(le >= 0, qq, r);
+    }
+    else
+      linear_partition_aux(c, qq, r);
+  }
+  return std::make_pair(qq, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_templates_hh)
diff --git a/src/Pointset_Powerset.types.hh b/src/Pointset_Powerset.types.hh
new file mode 100644
index 0000000..7157441
--- /dev/null
+++ b/src/Pointset_Powerset.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Pointset_Powerset_types_hh
+#define PPL_Pointset_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Pointset_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_types_hh)
diff --git a/src/Poly_Con_Relation.cc b/src/Poly_Con_Relation.cc
index a67f8d9..7d759aa 100644
--- a/src/Poly_Con_Relation.cc
+++ b/src/Poly_Con_Relation.cc
@@ -1,11 +1,11 @@
 /* Poly_Con_Relation class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Poly_Con_Relation.defs.hh"
 
@@ -62,7 +62,7 @@ PPL::Poly_Con_Relation::ascii_dump(std::ostream& s) const {
   }
 }
 
-PPL_OUTPUT_DEFINITIONS(Poly_Con_Relation);
+PPL_OUTPUT_DEFINITIONS(Poly_Con_Relation)
 
 /*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
 std::ostream&
diff --git a/src/Poly_Con_Relation.defs.hh b/src/Poly_Con_Relation.defs.hh
index 2b885a4..550a668 100644
--- a/src/Poly_Con_Relation.defs.hh
+++ b/src/Poly_Con_Relation.defs.hh
@@ -1,11 +1,11 @@
 /* Poly_Con_Relation class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -100,20 +100,15 @@ private:
   Poly_Con_Relation(flags_t mask);
 
   friend bool
-  Parma_Polyhedra_Library::operator==(const Poly_Con_Relation& x,
-				      const Poly_Con_Relation& y);
-
+  operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
   friend bool
-  Parma_Polyhedra_Library::operator!=(const Poly_Con_Relation& x,
-				      const Poly_Con_Relation& y);
+  operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
 
   friend Poly_Con_Relation
-  Parma_Polyhedra_Library::operator&&(const Poly_Con_Relation& x,
-				      const Poly_Con_Relation& y);
+  operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
 
   friend Poly_Con_Relation
-  Parma_Polyhedra_Library::operator-(const Poly_Con_Relation& x,
-				     const Poly_Con_Relation& y);
+  operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
 
   friend std::ostream&
   Parma_Polyhedra_Library::
@@ -156,7 +151,7 @@ public:
   */
   static Poly_Con_Relation saturates();
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   //! True if and only if \p *this implies \p y.
   bool implies(const Poly_Con_Relation& y) const;
diff --git a/src/Poly_Con_Relation.inlines.hh b/src/Poly_Con_Relation.inlines.hh
index b0432af..6776431 100644
--- a/src/Poly_Con_Relation.inlines.hh
+++ b/src/Poly_Con_Relation.inlines.hh
@@ -1,11 +1,11 @@
 /* Poly_Con_Relation class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Poly_Con_Relation.types.hh b/src/Poly_Con_Relation.types.hh
index 70b12ac..f34b738 100644
--- a/src/Poly_Con_Relation.types.hh
+++ b/src/Poly_Con_Relation.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Poly_Gen_Relation.cc b/src/Poly_Gen_Relation.cc
index 5a0d4ef..18a65be 100644
--- a/src/Poly_Gen_Relation.cc
+++ b/src/Poly_Gen_Relation.cc
@@ -1,11 +1,11 @@
 /* Poly_Gen_Relation class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Poly_Gen_Relation.defs.hh"
 
@@ -50,7 +50,7 @@ PPL::Poly_Gen_Relation::ascii_dump(std::ostream& s) const {
   }
 }
 
-PPL_OUTPUT_DEFINITIONS(Poly_Gen_Relation);
+PPL_OUTPUT_DEFINITIONS(Poly_Gen_Relation)
 
 /*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
 std::ostream&
diff --git a/src/Poly_Gen_Relation.defs.hh b/src/Poly_Gen_Relation.defs.hh
index 8a6ade3..0eb3878 100644
--- a/src/Poly_Gen_Relation.defs.hh
+++ b/src/Poly_Gen_Relation.defs.hh
@@ -1,11 +1,11 @@
 /* Poly_Gen_Relation class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -94,20 +94,15 @@ private:
   Poly_Gen_Relation(flags_t mask);
 
   friend bool
-  Parma_Polyhedra_Library::operator==(const Poly_Gen_Relation& x,
-				      const Poly_Gen_Relation& y);
-
+  operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
   friend bool
-  Parma_Polyhedra_Library::operator!=(const Poly_Gen_Relation& x,
-				      const Poly_Gen_Relation& y);
+  operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
 
   friend Poly_Gen_Relation
-  Parma_Polyhedra_Library::operator&&(const Poly_Gen_Relation& x,
-				      const Poly_Gen_Relation& y);
+  operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
 
   friend Poly_Gen_Relation
-  Parma_Polyhedra_Library::operator-(const Poly_Gen_Relation& x,
-				     const Poly_Gen_Relation& y);
+  operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
 
   friend std::ostream&
   Parma_Polyhedra_Library::
@@ -129,7 +124,7 @@ public:
   //! Adding the generator would not change the polyhedron.
   static Poly_Gen_Relation subsumes();
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
   //! True if and only if \p *this implies \p y.
   bool implies(const Poly_Gen_Relation& y) const;
diff --git a/src/Poly_Gen_Relation.inlines.hh b/src/Poly_Gen_Relation.inlines.hh
index a6b34d3..d568b66 100644
--- a/src/Poly_Gen_Relation.inlines.hh
+++ b/src/Poly_Gen_Relation.inlines.hh
@@ -1,11 +1,11 @@
 /* Poly_Gen_Relation class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Poly_Gen_Relation.types.hh b/src/Poly_Gen_Relation.types.hh
index ffc3ac9..95d347e 100644
--- a/src/Poly_Gen_Relation.types.hh
+++ b/src/Poly_Gen_Relation.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Polyhedra_Powerset.cc b/src/Polyhedra_Powerset.cc
deleted file mode 100644
index eda0b73..0000000
--- a/src/Polyhedra_Powerset.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/* Polyhedra_Powerset class implementation: non-inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-#include "Polyhedra_Powerset.defs.hh"
-#include <utility>
-
-namespace PPL = Parma_Polyhedra_Library;
-
-// FIXME: Commented out so as to avoid a bug in GCC 3.3.3.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
-// template <>
-// template <>
-// PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
-// ::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
-//   : Base(), space_dim(y.space_dimension()) {
-//   Polyhedra_Powerset& x = *this;
-//   for (Polyhedra_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
-// 	 y_end = y.end(); i != y_end; ++i)
-//     x.sequence.push_back(Determinate<NNC_Polyhedron>(
-//                            NNC_Polyhedron(i->element()))
-// 			 );
-//   x.reduced = y.reduced;
-//   assert(x.OK());
-// }
-
-// FIXME: Commented out so as to avoid a bug in GCC 3.3.3.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
-// template <>
-// template <>
-// PPL::Polyhedra_Powerset<PPL::C_Polyhedron>
-// ::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
-//   : Base(), space_dim(y.space_dimension()) {
-//   Polyhedra_Powerset& x = *this;
-//   for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
-// 	 y_end = y.end(); i != y_end; ++i)
-//     x.sequence.push_back(Determinate<C_Polyhedron>(
-//                            C_Polyhedron(i->element()))
-// 			 );
-//   // Note: this might be non-reduced even when `y' is known to be
-//   // omega-reduced, because the constructor of C_Polyhedron, by
-//   // enforcing topological closure, may have made different elements
-//   // comparable.
-//   x.reduced = false;
-//   assert(x.OK());
-// }
-
-template <>
-void
-PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
-::poly_difference_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  // Ensure omega-reduction.
-  x.omega_reduce();
-  y.omega_reduce();
-  Sequence new_sequence = x.sequence;
-  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
-    const NNC_Polyhedron& py = yi->element();
-    Sequence tmp_sequence;
-    for (Sequence_const_iterator nsi = new_sequence.begin(),
-	   ns_end = new_sequence.end(); nsi != ns_end; ++nsi) {
-      std::pair<NNC_Polyhedron, Polyhedra_Powerset<NNC_Polyhedron> > partition
-	= linear_partition(py, nsi->element());
-      const Polyhedra_Powerset<NNC_Polyhedron>& residues = partition.second;
-      // Append the contents of `residues' to `tmp_sequence'.
-      std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
-    }
-    std::swap(tmp_sequence, new_sequence);
-  }
-  std::swap(x.sequence, new_sequence);
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <>
-bool
-PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
-::geometrically_covers(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset& x = *this;
-  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
-    if (!check_containment(yi->element(), x))
-      return false;
-  return true;
-}
-
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
-bool
-PPL::check_containment(const NNC_Polyhedron& ph,
-		       const Polyhedra_Powerset<NNC_Polyhedron>& ps) {
-  Polyhedra_Powerset<NNC_Polyhedron> tmp(ph.space_dimension(), EMPTY);
-  tmp.add_disjunct(ph);
-  for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator
-	 i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
-    const NNC_Polyhedron& pi = i->element();
-    for (Polyhedra_Powerset<NNC_Polyhedron>::iterator
-	   j = tmp.begin(); j != tmp.end(); ) {
-      const NNC_Polyhedron& pj = j->element();
-      if (pi.contains(pj))
-	j = tmp.drop_disjunct(j);
-      else
-	++j;
-    }
-    if (tmp.empty())
-      return true;
-    else {
-      Polyhedra_Powerset<NNC_Polyhedron> new_disjuncts(ph.space_dimension(),
-						       EMPTY);
-      for (Polyhedra_Powerset<NNC_Polyhedron>::iterator
-	     j = tmp.begin(); j != tmp.end(); ) {
-	const NNC_Polyhedron& pj = j->element();
-	if (pj.is_disjoint_from(pi))
-	  ++j;
-	else {
-	  std::pair<NNC_Polyhedron, Polyhedra_Powerset<NNC_Polyhedron> >
-	    partition = linear_partition(pi, pj);
-	  new_disjuncts.upper_bound_assign(partition.second);
-	  j = tmp.drop_disjunct(j);
-	}
-      }
-      tmp.upper_bound_assign(new_disjuncts);
-    }
-  }
-  return false;
-}
diff --git a/src/Polyhedra_Powerset.defs.hh b/src/Polyhedra_Powerset.defs.hh
deleted file mode 100644
index e0341e4..0000000
--- a/src/Polyhedra_Powerset.defs.hh
+++ /dev/null
@@ -1,553 +0,0 @@
-/* Polyhedra_Powerset class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Polyhedra_Powerset_defs_hh
-#define PPL_Polyhedra_Powerset_defs_hh
-
-#include "Polyhedra_Powerset.types.hh"
-#include "globals.defs.hh"
-#include "BHRZ03_Certificate.types.hh"
-#include "Constraint.types.hh"
-#include "Constraint_System.types.hh"
-#include "Congruence.types.hh"
-#include "Congruence_System.types.hh"
-#include "C_Polyhedron.types.hh"
-#include "NNC_Polyhedron.types.hh"
-#include "Polyhedron.defs.hh"
-#include "Variable.defs.hh"
-#include "Determinate.defs.hh"
-#include "Powerset.defs.hh"
-#include <iosfwd>
-#include <list>
-#include <map>
-
-//! The powerset construction instantiated on PPL polyhedra.
-/*! \ingroup PPL_CXX_interface */
-template <typename PH>
-class Parma_Polyhedra_Library::Polyhedra_Powerset
-  : public Parma_Polyhedra_Library::Powerset
-<Parma_Polyhedra_Library::Determinate<PH> > {
-public:
-  typedef PH element_type;
-
-private:
-  typedef Determinate<PH> CS;
-  typedef Powerset<CS> Base;
-
-public:
-  //! Returns the maximum space dimension a Polyhedra_Powerset<PH> can handle.
-  static dimension_type max_space_dimension();
-
-  //! \name Constructors
-  //@{
-
-  //! Builds a universe (top) or empty (bottom) Polyhedra_Powerset.
-  /*!
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the powerset;
-
-    \param kind
-    Specifies whether the universe or the empty powerset has to be built.
-  */
-  explicit
-  Polyhedra_Powerset(dimension_type num_dimensions = 0,
-		     Degenerate_Element kind = UNIVERSE);
-
-  //! Ordinary copy-constructor.
-  Polyhedra_Powerset(const Polyhedra_Powerset& y);
-
-  /*! \brief
-    If \p ph is nonempty, builds a powerset containing only \p ph.
-    Builds the empty powerset otherwise.
-  */
-  explicit Polyhedra_Powerset(const PH& ph);
-
-  /*! \brief
-    Copy-constructor allowing a source powerset with elements of a
-    different polyhedron kind.
-  */
-  template <typename QH>
-  explicit Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
-
-  /*! \brief
-    Creates a Polyhedra_Powerset with a single polyhedron
-    with the same information contents as \p cs.
-  */
-  explicit Polyhedra_Powerset(const Constraint_System& cs);
-
-  //! Creates a Polyhedra_Powerset with a single polyhedron
-  //! with the same information contents as \p cgs.
-  explicit Polyhedra_Powerset(const Congruence_System& cgs);
-
-  //@} // Constructors and Destructor
-
-  //! \name Member Functions that Do Not Modify the Powerset of Polyhedra
-  //@{
-
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this geometrically
-    covers \p y, i.e., if any point (in some element) of \p y is also
-    a point (of some element) of \p *this.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-
-    \warning
-    This may be <EM>really</EM> expensive!
-  */
-  bool geometrically_covers(const Polyhedra_Powerset& y) const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is geometrically
-    equal to \p y, i.e., if (the elements of) \p *this and \p y
-    contain the same set of points.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-
-    \warning
-    This may be <EM>really</EM> expensive!
-  */
-  bool geometrically_equals(const Polyhedra_Powerset& y) const;
-
-  /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
-  */
-  memory_size_type total_memory_in_bytes() const;
-
-  /*! \brief
-    Returns a lower bound to the size in bytes of the memory
-    managed by \p *this.
-  */
-  memory_size_type external_memory_in_bytes() const;
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-
-  //@} // Member Functions that Do Not Modify the Powerset
-
-  //! \name Space Dimension Preserving Member Functions that May Modify the Powerset of Polyhedra
-  //@{
-
-  //! Adds to \p *this the disjunct \p ph.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p ph are dimension-incompatible.
-  */
-  void add_disjunct(const PH& ph);
-
-  //! Intersects \p *this with constraint \p c.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are topology-incompatible
-    or dimension-incompatible.
-  */
-  void add_constraint(const Constraint& c);
-
-  //! Intersects \p *this with the constraint \p c, minimizing the result.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p c are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool add_constraint_and_minimize(const Constraint& c);
-
-  //! Intersects \p *this with the constraints in \p cs.
-  /*!
-    \param cs
-    The constraints to intersect with.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void add_constraints(const Constraint_System& cs);
-
-  /*! \brief
-    Intersects \p *this with the constraints in \p cs,
-    minimizing the result.
-
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
-
-    \param cs
-    The constraints to intersect with.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool add_constraints_and_minimize(const Constraint_System& cs);
-
-  /*! \brief
-    Assign to \p *this the result of (recursively) merging together
-    the pairs of polyhedra whose poly-hull is the same as their
-    set-theoretical union.
-
-    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different polyhedra
-    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
-  */
-  void pairwise_reduce();
-
-  /*! \brief
-    Assigns to \p *this the result of applying the
-    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
-    to \p *this and \p y, using the widening function \p wf
-    and the cardinality threshold \p max_disjuncts.
-
-    \param y
-    A finite powerset of polyhedra.
-    It <EM>must</EM> definitely entail \p *this;
-
-    \param wf
-    The widening function to be used on polyhedra objects. It is obtained
-    from the corresponding widening method by using the helper function
-    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
-    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
-    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
-
-    \param max_disjuncts
-    The maximum number of disjuncts occurring in the powerset \p *this
-    <EM>before</EM> starting the computation. If this number is exceeded,
-    some of the disjuncts in \p *this are collapsed (i.e., joined together).
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-
-    For a description of the extrapolation operator,
-    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
-  */
-  template <typename Widening>
-  void BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
-				  Widening wf,
-				  unsigned max_disjuncts);
-
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref pps_certificate_widening "BHZ03-widening"
-    between \p *this and \p y, using the widening function \p wf
-    certified by the convergence certificate \p Cert.
-
-    \param y
-    The finite powerset of polyhedra computed in the previous iteration step.
-    It <EM>must</EM> definitely entail \p *this;
-
-    \param wf
-    The widening function to be used on polyhedra objects.
-    It is obtained from the corresponding widening method by using
-    the helper function widen_fun_ref. Legal values are, e.g.,
-    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
-    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-
-    \warning
-    In order to obtain a proper widening operator, the template parameter
-    \p Cert should be a finite convergence certificate for the base-level
-    widening function \p wf; otherwise, an extrapolation operator is
-    obtained.
-    For a description of the methods that should be provided
-    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
-  */
-  template <typename Cert, typename Widening>
-  void BHZ03_widening_assign(const Polyhedra_Powerset& y, Widening wf);
-
-  //@} // Space Dimension Preserving Member Functions that May Modify [...]
-
-  //! \name Member Functions that May Modify the Dimension of the Vector Space
-  //@{
-
-  /*! \brief
-    The assignment operator
-    (\p *this and \p y can be dimension-incompatible).
-  */
-  Polyhedra_Powerset& operator=(const Polyhedra_Powerset& y);
-
-  /*! \brief
-    Assignment operator allowing a source powerset with elements of a
-    different polyhedron kind
-    (\p *this and \p y can be dimension-incompatible).
-  */
-  template <typename QH>
-  Polyhedra_Powerset& operator=(const Polyhedra_Powerset<QH>& y);
-
-  //! Swaps \p *this with \p y.
-  void swap(Polyhedra_Powerset& y);
-
-  /*! \brief
-    Adds \p m new dimensions to the vector space containing \p *this
-    and embeds each polyhedron in \p *this in the new space.
-  */
-  void add_space_dimensions_and_embed(dimension_type m);
-
-  /*! \brief
-    Adds \p m new dimensions to the vector space containing \p *this
-    without embedding the polyhedra in \p *this in the new space.
-  */
-  void add_space_dimensions_and_project(dimension_type m);
-
-  //! Assigns to \p *this the intersection of \p *this and \p y.
-  /*!
-    The result is obtained by intersecting each polyhedron in \p *this
-    with each polyhedron in \p y and collecting all these intersections.
-  */
-  void intersection_assign(const Polyhedra_Powerset& y);
-
-  //! Assigns to \p *this the difference of \p *this and \p y.
-  /*!
-    The result is obtained by computing the
-    \ref Convex_Polyhedral_Difference "poly-difference" of each polyhedron
-    in \p *this with each polyhedron in \p y and collecting all these
-    differences.
-  */
-  void poly_difference_assign(const Polyhedra_Powerset& y);
-
-  //! Assigns to \p *this the concatenation of \p *this and \p y.
-  /*!
-    The result is obtained by computing the pairwise
-    \ref Concatenating_Polyhedra "concatenation" of each polyhedron
-    in \p *this with each polyhedron in \p y.
-  */
-  void concatenate_assign(const Polyhedra_Powerset& y);
-
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
-
-    The result is obtained by computing the pairwise
-    \ref Time_Elapse_Operator "time elapse" of each polyhedron
-    in \p *this with each polyhedron in \p y.
-  */
-  void time_elapse_assign(const Polyhedra_Powerset& y);
-
-  //! Removes all the specified space dimensions.
-  /*!
-    \param to_be_removed
-    The set of Variable objects corresponding to the space dimensions
-    to be removed.
-
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with one of the
-    Variable objects contained in \p to_be_removed.
-  */
-  void remove_space_dimensions(const Variables_Set& to_be_removed);
-
-  /*! \brief
-    Removes the higher space dimensions so that the resulting space
-    will have dimension \p new_dimension.
-
-    \exception std::invalid_argument
-    Thrown if \p new_dimensions is greater than the space dimension
-    of \p *this.
-  */
-  void remove_higher_space_dimensions(dimension_type new_dimension);
-
-  /*! \brief
-    Remaps the dimensions of the vector space according to
-    a partial function.
-
-    See also Polyhedron::map_space_dimensions.
-  */
-  template <typename Partial_Function>
-  void map_space_dimensions(const Partial_Function& pfunc);
-
-  //@} // Member Functions that May Modify the Dimension of the Vector Space
-
-public:
-  typedef typename Base::size_type size_type;
-  typedef typename Base::value_type value_type;
-  typedef typename Base::iterator iterator;
-  typedef typename Base::const_iterator const_iterator;
-  typedef typename Base::reverse_iterator reverse_iterator;
-  typedef typename Base::const_reverse_iterator const_reverse_iterator;
-
-  PPL_OUTPUT_DECLARATIONS;
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
-    if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
-
-private:
-  typedef typename Base::Sequence Sequence;
-  typedef typename Base::Sequence_iterator Sequence_iterator;
-  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
-
-  //! The number of dimensions of the enclosing vector space.
-  dimension_type space_dim;
-
-  /*! \brief
-    Assigns to \p *this the result of applying the BGP99 heuristics
-    to \p *this and \p y, using the widening function \p wf.
-  */
-  template <typename Widening>
-  void BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf);
-
-  //! Records in \p cert_ms the certificates for this set of polyhedra.
-  template <typename Cert>
-  void collect_certificates(std::map<Cert, size_type,
-		                     typename Cert::Compare>& cert_ms) const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the current set of polyhedra
-    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
-  */
-  template <typename Cert>
-  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
-                                                   typename Cert::Compare>&
-				    y_cert_ms) const;
-
-  // FIXME: here it should be enough to befriend the templatic constructor
-  //   template <typename QH>
-  //   Polyhedra_Powerset(const Polyhedra_Powerset<QH>&)
-  // but, apparently, this cannot be done.
-  // As a workaround, we could use
-  //   friend class Polyhedra_Powerset<NNC_Polyhedron>
-  // but GCC 3.3.3 has a bug that causes its rejection.
-  // So, temporarily, we make all Polyhedra_Powerset's friends of each other.
-  template <typename QH> friend class Polyhedra_Powerset;
-};
-
-
-namespace Parma_Polyhedra_Library {
-
-//! Partitions \p q with respect to \p p.
-/*! \relates Polyhedra_Powerset
-  Let \p p and \p q be two polyhedra.
-  The function returns an object <CODE>r</CODE> of type
-  <CODE>std::pair\<PH, Polyhedra_Powerset\<NNC_Polyhedron\> \></CODE>
-  such that
-  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
-  - <CODE>r.second</CODE> has the property that all its elements are
-    pairwise disjoint and disjoint from \p p;
-  - the union of <CODE>r.first</CODE> with all the elements of
-    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE> is the
-    representation of a partition of \p q).
-
-  \if Include_Implementation_Details
-
-  See
-  <A HREF="http://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
-  this paper</A> for more information about the implementation.
-  \endif
-*/
-template <typename PH>
-std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
-linear_partition(const PH& p, const PH& q);
-
-/*! \brief
-  Returns <CODE>true</CODE> if and only if the union of
-  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
-
-  \relates Polyhedra_Powerset
-*/
-bool
-check_containment(const NNC_Polyhedron& ph,
-		  const Polyhedra_Powerset<NNC_Polyhedron>& ps);
-
-/*! \brief
-  Returns <CODE>true</CODE> if and only if the union of
-  the objects in \p ps contains \p ph.
-
-  \relates Polyhedra_Powerset
-  \note
-  It is assumed that the template parameter PH can be converted
-  without precision loss into an NNC_Polyhedron; otherwise,
-  an incorrect result might be obtained.
-*/
-template <typename PH>
-bool
-check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps);
-
-// CHECK ME: according to the Intel compiler, the declaration of the
-// following specialization (of the class template parameter) should come
-// before the declaration of the corresponding full specialization
-// (where the member template parameter is specialized too).
-template <>
-template <typename QH>
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
-
-// CHECK ME: according to the Intel compiler, the declaration of the
-// following specialization (of the class template parameter) should come
-// before the declaration of the corresponding full specialization
-// (where the member template parameter is specialized too).
-template <>
-template <typename QH>
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
-
-// Non-inline full specializations should be declared here
-// so as to inhibit multiple instantiations of the generic template.
-template <>
-template <>
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y);
-
-template <>
-template <>
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y);
-
-template <>
-void
-Polyhedra_Powerset<NNC_Polyhedron>
-::poly_difference_assign(const Polyhedra_Powerset& y);
-
-template <>
-bool
-Polyhedra_Powerset<NNC_Polyhedron>
-::geometrically_covers(const Polyhedra_Powerset& y) const;
-
-} // namespace Parma_Polyhedra_Library
-
-
-namespace std {
-
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
-template <typename PH>
-void swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
-	  Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y);
-
-} // namespace std
-
-#include "Polyhedra_Powerset.inlines.hh"
-#include "Polyhedra_Powerset.templates.hh"
-
-#endif // !defined(PPL_Polyhedra_Powerset_defs_hh)
diff --git a/src/Polyhedra_Powerset.inlines.hh b/src/Polyhedra_Powerset.inlines.hh
deleted file mode 100644
index 5c1b615..0000000
--- a/src/Polyhedra_Powerset.inlines.hh
+++ /dev/null
@@ -1,268 +0,0 @@
-/* Polyhedra_Powerset class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Polyhedra_Powerset_inlines_hh
-#define PPL_Polyhedra_Powerset_inlines_hh 1
-
-#include "Constraint.defs.hh"
-#include "Constraint_System.defs.hh"
-#include "Constraint_System.inlines.hh"
-#include "Congruence.defs.hh"
-#include "Congruence_System.defs.hh"
-#include "Congruence_System.inlines.hh"
-#include "C_Polyhedron.defs.hh"
-#include "NNC_Polyhedron.defs.hh"
-#include <algorithm>
-#include <deque>
-
-namespace Parma_Polyhedra_Library {
-
-template <typename PH>
-inline dimension_type
-Polyhedra_Powerset<PH>::space_dimension() const {
-  return space_dim;
-}
-
-template <typename PH>
-inline dimension_type
-Polyhedra_Powerset<PH>::max_space_dimension() {
-  return PH::max_space_dimension();
-}
-
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(dimension_type num_dimensions,
-					   Degenerate_Element kind)
-  : Base(), space_dim(num_dimensions) {
-  Polyhedra_Powerset& x = *this;
-  if (kind == UNIVERSE)
-    x.sequence.push_back(Determinate<PH>(PH(num_dimensions, kind)));
-  assert(x.OK());
-}
-
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Polyhedra_Powerset& y)
-  : Base(y), space_dim(y.space_dim) {
-}
-
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const PH& ph)
-  : Base(ph), space_dim(ph.space_dimension()) {
-}
-
-// FIXME: This full specialization is declared inline and placed here
-// just as a workaround to a bug in GCC 3.3.3. In principle, it should
-// not be declared inline and moved in Polyhedra_Powerset.cc.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
-template <>
-template <>
-inline
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (Polyhedra_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<NNC_Polyhedron>(
-                           NNC_Polyhedron(i->element()))
-			 );
-  x.reduced = y.reduced;
-  assert(x.OK());
-}
-
-// FIXME: This full specialization is declared inline and placed here
-// just as a workaround to a bug in GCC 3.3.3. In principle, it should
-// not be declared inline and moved in Polyhedra_Powerset.cc.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
-template <>
-template <>
-inline
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<C_Polyhedron>(
-                           C_Polyhedron(i->element()))
-			 );
-  // Note: this might be non-reduced even when `y' is known to be
-  // omega-reduced, because the constructor of C_Polyhedron, by
-  // enforcing topological closure, may have made different elements
-  // comparable.
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs)
-  // FIXME: calling Base(Determinate<PH>(cs)) will automatically handle
-  // the flag `reduced', but it will also force a non-emptiness test
-  // on the constraint system `cs'.
-  : Base(), space_dim(cs.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  x.sequence.push_back(Determinate<PH>(cs));
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Congruence_System& cgs)
-  // FIXME: calling Base(Determinate<PH>(cgs)) will automatically handle
-  // the flag `reduced', but it will also force a non-emptiness test
-  // on the congruence system `cgs'.
-  : Base(), space_dim(cgs.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  x.sequence.push_back(Determinate<PH>(cgs));
-  x.reduced = false;
-  assert(OK());
-}
-
-template <typename PH>
-inline Polyhedra_Powerset<PH>&
-Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.Base::operator=(y);
-  x.space_dim = y.space_dim;
-  return x;
-}
-
-template <typename PH>
-inline void
-Polyhedra_Powerset<PH>::swap(Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.Base::swap(y);
-  std::swap(x.space_dim, y.space_dim);
-}
-
-template <typename PH>
-template <typename QH>
-inline Polyhedra_Powerset<PH>&
-Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset<QH>& y) {
-  Polyhedra_Powerset& x = *this;
-  Polyhedra_Powerset<PH> pps(y);
-  x.swap(pps);
-  return x;
-}
-
-template <typename PH>
-inline void
-Polyhedra_Powerset<PH>::intersection_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.pairwise_apply_assign
-    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::intersection_assign)));
-}
-
-template <typename PH>
-inline void
-Polyhedra_Powerset<PH>::time_elapse_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.pairwise_apply_assign
-    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::time_elapse_assign)));
-}
-
-template <typename PH>
-inline bool
-Polyhedra_Powerset<PH>
-::geometrically_covers(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
-  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
-  return xx.geometrically_covers(yy);
-}
-
-template <typename PH>
-inline bool
-Polyhedra_Powerset<PH>
-::geometrically_equals(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
-  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
-  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
-}
-
-template <>
-inline bool
-Polyhedra_Powerset<NNC_Polyhedron>
-::geometrically_equals(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset& x = *this;
-  return x.geometrically_covers(y) && y.geometrically_covers(x);
-}
-
-template <typename PH>
-inline memory_size_type
-Polyhedra_Powerset<PH>::external_memory_in_bytes() const {
-  return Base::external_memory_in_bytes();
-}
-
-template <typename PH>
-inline memory_size_type
-Polyhedra_Powerset<PH>::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
-
-template <>
-inline void
-Polyhedra_Powerset<C_Polyhedron>
-::poly_difference_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset<NNC_Polyhedron> nnc_this(*this);
-  Polyhedra_Powerset<NNC_Polyhedron> nnc_y(y);
-  nnc_this.poly_difference_assign(nnc_y);
-  *this = nnc_this;
-}
-
-/*! \relates Polyhedra_Powerset */
-template <typename PH>
-inline bool
-check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps) {
-  const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
-  const Polyhedra_Powerset<NNC_Polyhedron> pps(ps);
-  return check_containment(pph, pps);
-}
-
-/*! \relates Polyhedra_Powerset */
-template <>
-inline bool
-check_containment(const C_Polyhedron& ph,
-		  const Polyhedra_Powerset<C_Polyhedron>& ps) {
-  return check_containment(NNC_Polyhedron(ph),
-			   Polyhedra_Powerset<NNC_Polyhedron>(ps));
-}
-
-} // namespace Parma_Polyhedra_Library
-
-
-namespace std {
-
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
-template <typename PH>
-inline void
-swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
-     Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y) {
-  x.swap(y);
-}
-
-} // namespace std
-
-#endif // !defined(PPL_Polyhedra_Powerset_inlines_hh)
diff --git a/src/Polyhedra_Powerset.templates.hh b/src/Polyhedra_Powerset.templates.hh
deleted file mode 100644
index 9616002..0000000
--- a/src/Polyhedra_Powerset.templates.hh
+++ /dev/null
@@ -1,684 +0,0 @@
-/* Polyhedra_Powerset class implementation: non-inline template functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Polyhedra_Powerset_templates_hh
-#define PPL_Polyhedra_Powerset_templates_hh 1
-
-#include "Constraint.defs.hh"
-#include "Constraint_System.defs.hh"
-#include "Constraint_System.inlines.hh"
-#include "C_Polyhedron.defs.hh"
-#include "NNC_Polyhedron.defs.hh"
-#include <algorithm>
-#include <deque>
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
-
-namespace Parma_Polyhedra_Library {
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_disjunct(const PH& ph) {
-  Polyhedra_Powerset& x = *this;
-  if (x.space_dimension() != ph.space_dimension()) {
-    std::ostringstream s;
-    s << "PPL::Polyhedra_Powerset<PH>::add_disjunct(ph):\n"
-      << "this->space_dimension() == " << x.space_dimension() << ", "
-      << "ph.space_dimension() == " << ph.space_dimension() << ".";
-    throw std::invalid_argument(s.str());
-  }
-  x.sequence.push_back(Determinate<PH>(ph));
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <>
-template <typename QH>
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<NNC_Polyhedron>(
-                           NNC_Polyhedron(i->element().constraints()))
-			 );
-  x.reduced = y.reduced;
-  assert(x.OK());
-}
-
-template <>
-template <typename QH>
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<C_Polyhedron>(
-                           C_Polyhedron(i->element().constraints()))
-			 );
-  // Note: this might be non-reduced even when `y' is known to be
-  // omega-reduced, because the constructor of C_Polyhedron, by
-  // enforcing topological closure, may have made different elements
-  // comparable.
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::concatenate_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  // Ensure omega-reduction here, since what follows has quadratic complexity.
-  x.omega_reduce();
-  y.omega_reduce();
-  Polyhedra_Powerset<PH> new_x(x.space_dim + y.space_dim, EMPTY);
-  for (const_iterator xi = x.begin(), x_end = x.end(),
-	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
-    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
-      CS zi = *xi;
-      zi.concatenate_assign(*yi);
-      assert(!zi.is_bottom());
-      new_x.sequence.push_back(zi);
-    }
-    ++xi;
-    if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
-      // Hurry up!
-      PH xph = xi->element();
-      for (++xi; xi != x_end; ++xi)
-	xph.upper_bound_assign(xi->element());
-      const_iterator yi = y_begin;
-      PH yph = yi->element();
-      for (++yi; yi != y_end; ++yi)
-	yph.upper_bound_assign(yi->element());
-      xph.concatenate_assign(yph);
-      x.swap(new_x);
-      x.add_disjunct(xph);
-      assert(x.OK());
-      return;
-    }
-  }
-  x.swap(new_x);
-  assert(x.OK());
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_constraint(const Constraint& c) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_constraint(c);
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::add_constraint_and_minimize(const Constraint& c) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; )
-    if (!si->element().add_constraint_and_minimize(c))
-      si = x.sequence.erase(si);
-    else {
-      x.reduced = false;
-      ++si;
-    }
-  assert(x.OK());
-  return !x.empty();
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_constraints(const Constraint_System& cs) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_constraints(cs);
-  x.reduced = false;
-  assert(x.OK());
-}
-
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::
-add_constraints_and_minimize(const Constraint_System& cs) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; )
-    if (!si->element().add_constraints_and_minimize(cs))
-      si = x.sequence.erase(si);
-    else {
-      x.reduced = false;
-      ++si;
-    }
-  assert(x.OK());
-  return !x.empty();
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_space_dimensions_and_embed(dimension_type m) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_space_dimensions_and_embed(m);
-  x.space_dim += m;
-  assert(x.OK());
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_space_dimensions_and_project(dimension_type m) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_space_dimensions_and_project(m);
-  x.space_dim += m;
-  assert(x.OK());
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::
-remove_space_dimensions(const Variables_Set& to_be_removed) {
-  Polyhedra_Powerset& x = *this;
-  Variables_Set::size_type num_removed = to_be_removed.size();
-  if (num_removed > 0) {
-    for (Sequence_iterator si = x.sequence.begin(),
-	   s_end = x.sequence.end(); si != s_end; ++si) {
-      si->element().remove_space_dimensions(to_be_removed);
-      x.reduced = false;
-    }
-    x.space_dim -= num_removed;
-    assert(x.OK());
-  }
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::remove_higher_space_dimensions(dimension_type
-						       new_dimension) {
-  Polyhedra_Powerset& x = *this;
-  if (new_dimension < x.space_dim) {
-    for (Sequence_iterator si = x.sequence.begin(),
-	   s_end = x.sequence.end(); si != s_end; ++si) {
-      si->element().remove_higher_space_dimensions(new_dimension);
-      x.reduced = false;
-    }
-    x.space_dim = new_dimension;
-    assert(x.OK());
-  }
-}
-
-template <typename PH>
-template <typename Partial_Function>
-void
-Polyhedra_Powerset<PH>::map_space_dimensions(const Partial_Function& pfunc) {
-  Polyhedra_Powerset& x = *this;
-  if (x.is_bottom()) {
-    dimension_type n = 0;
-    for (dimension_type i = x.space_dim; i-- > 0; ) {
-      dimension_type new_i;
-      if (pfunc.maps(i, new_i))
-	++n;
-    }
-    x.space_dim = n;
-  }
-  else {
-    Sequence_iterator s_begin = x.sequence.begin();
-    for (Sequence_iterator si = s_begin,
-	   s_end = x.sequence.end(); si != s_end; ++si)
-      si->element().map_space_dimensions(pfunc);
-    x.space_dim = s_begin->element().space_dimension();
-    x.reduced = false;
-  }
-  assert(x.OK());
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::pairwise_reduce() {
-  Polyhedra_Powerset& x = *this;
-  // It is wise to omega-reduce before pairwise-reducing.
-  x.omega_reduce();
-
-  size_type n = x.size();
-  size_type deleted;
-  do {
-    Polyhedra_Powerset new_x(x.space_dim, EMPTY);
-    std::deque<bool> marked(n, false);
-    deleted = 0;
-    Sequence_iterator s_begin = x.sequence.begin();
-    Sequence_iterator s_end = x.sequence.end();
-    unsigned si_index = 0;
-    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
-      if (marked[si_index])
-	continue;
-      PH& pi = si->element();
-      Sequence_const_iterator sj = si;
-      unsigned sj_index = si_index;
-      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
-	if (marked[sj_index])
-	  continue;
-	const PH& pj = sj->element();
-	if (pi.upper_bound_assign_if_exact(pj)) {
-	  marked[si_index] = marked[sj_index] = true;
-	  new_x.add_non_bottom_disjunct(pi);
-	  ++deleted;
-	  goto next;
-	}
-      }
-    next:
-      ;
-    }
-    iterator nx_begin = new_x.begin();
-    iterator nx_end = new_x.end();
-    unsigned xi_index = 0;
-    for (const_iterator xi = x.begin(),
-	   x_end = x.end(); xi != x_end; ++xi, ++xi_index)
-      if (!marked[xi_index])
-	nx_begin = new_x.add_non_bottom_disjunct(*xi, nx_begin, nx_end);
-    std::swap(x.sequence, new_x.sequence);
-    n -= deleted;
-  } while (deleted > 0);
-  assert(x.OK());
-}
-
-template <typename PH>
-template <typename Widening>
-void
-Polyhedra_Powerset<PH>::
-BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf) {
-  // `x' is the current iteration value.
-  Polyhedra_Powerset& x = *this;
-
-#ifndef NDEBUG
-  {
-    // We assume that `y' entails `x'.
-    const Polyhedra_Powerset<PH> x_copy = x;
-    const Polyhedra_Powerset<PH> y_copy = y;
-    assert(y_copy.definitely_entails(x_copy));
-  }
-#endif
-
-  size_type n = x.size();
-  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
-  std::deque<bool> marked(n, false);
-  const_iterator x_begin = x.begin();
-  const_iterator x_end = x.end();
-  unsigned i_index = 0;
-  for (const_iterator i = x_begin,
-	 y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
-    for (const_iterator j = y_begin; j != y_end; ++j) {
-      const PH& pi = i->element();
-      const PH& pj = j->element();
-      if (pi.contains(pj)) {
-	PH pi_copy = pi;
-	wf(pi_copy, pj);
-	new_x.add_non_bottom_disjunct(pi_copy);
-	marked[i_index] = true;
-      }
-    }
-  iterator nx_begin = new_x.begin();
-  iterator nx_end = new_x.end();
-  i_index = 0;
-  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
-    if (!marked[i_index])
-      nx_begin = new_x.add_non_bottom_disjunct(*i, nx_begin, nx_end);
-  std::swap(x.sequence, new_x.sequence);
-  assert(x.OK());
-  assert(x.is_omega_reduced());
-}
-
-template <typename PH>
-template <typename Widening>
-void
-Polyhedra_Powerset<PH>::
-BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
-			   Widening wf,
-			   unsigned max_disjuncts) {
-  // `x' is the current iteration value.
-  Polyhedra_Powerset& x = *this;
-
-#ifndef NDEBUG
-  {
-    // We assume that `y' entails `x'.
-    const Polyhedra_Powerset<PH> x_copy = x;
-    const Polyhedra_Powerset<PH> y_copy = y;
-    assert(y_copy.definitely_entails(x_copy));
-  }
-#endif
-
-  x.pairwise_reduce();
-  if (max_disjuncts != 0)
-    x.collapse(max_disjuncts);
-  x.BGP99_heuristics_assign(y, wf);
-}
-
-template <typename PH>
-template <typename Cert>
-void
-Polyhedra_Powerset<PH>::
-collect_certificates(std::map<Cert, size_type,
-		              typename Cert::Compare>& cert_ms) const {
-  const Polyhedra_Powerset& x = *this;
-  assert(x.is_omega_reduced());
-  assert(cert_ms.size() == 0);
-  for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
-    Cert ph_cert(i->element());
-    ++cert_ms[ph_cert];
-  }
-}
-
-template <typename PH>
-template <typename Cert>
-bool
-Polyhedra_Powerset<PH>::
-is_cert_multiset_stabilizing(const std::map<Cert, size_type,
-			                    typename Cert::Compare>& y_cert_ms
-			     ) const {
-  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
-  Cert_Multiset x_cert_ms;
-  collect_certificates(x_cert_ms);
-  typename Cert_Multiset::const_iterator
-    xi = x_cert_ms.begin(),
-    xend = x_cert_ms.end(),
-    yi = y_cert_ms.begin(),
-    yend = y_cert_ms.end();
-  while (xi != xend && yi != yend) {
-    const Cert& xi_cert = xi->first;
-    const Cert& yi_cert = yi->first;
-    switch (xi_cert.compare(yi_cert)) {
-    case 0:
-      // xi_cert == yi_cert: check the number of multiset occurrences.
-      {
-	const size_type& xi_count = xi->second;
-	const size_type& yi_count = yi->second;
-	if (xi_count == yi_count) {
-	  // Same number of occurrences: compare the next pair.
-	  ++xi;
-	  ++yi;
-	}
-	else
-	  // Different number of occurrences: can decide ordering.
-	  return xi_count < yi_count;
-	break;
-      }
-    case 1:
-      // xi_cert > yi_cert: it is not stabilizing.
-      return false;
-
-    case -1:
-      // xi_cert < yi_cert: it is stabilizing.
-      return true;
-    }
-  }
-  // Here xi == xend or yi == yend.
-  // Stabilization is achieved if `y_cert_ms' still has other elements.
-  return yi != yend;
-}
-
-template <typename PH>
-template <typename Cert, typename Widening>
-void
-Polyhedra_Powerset<PH>::BHZ03_widening_assign(const Polyhedra_Powerset& y,
-					      Widening wf) {
-  // `x' is the current iteration value.
-  Polyhedra_Powerset& x = *this;
-
-#ifndef NDEBUG
-  {
-    // We assume that `y' entails `x'.
-    const Polyhedra_Powerset<PH> x_copy = x;
-    const Polyhedra_Powerset<PH> y_copy = y;
-    assert(y_copy.definitely_entails(x_copy));
-  }
-#endif
-
-  // First widening technique: do nothing.
-
-  // If `y' is the empty collection, do nothing.
-  assert(x.size() > 0);
-  if (y.size() == 0)
-    return;
-
-  // Compute the poly-hull of `x'.
-  PH x_hull(x.space_dim, EMPTY);
-  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
-    x_hull.upper_bound_assign(i->element());
-
-  // Compute the poly-hull of `y'.
-  PH y_hull(y.space_dim, EMPTY);
-  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
-    y_hull.upper_bound_assign(i->element());
-  // Compute the certificate for `y_hull'.
-  const Cert y_hull_cert(y_hull);
-
-  // If the hull is stabilizing, do nothing.
-  int hull_stabilization = y_hull_cert.compare(x_hull);
-  if (hull_stabilization == 1)
-    return;
-
-  // Multiset ordering is only useful when `y' is not a singleton.
-  const bool y_is_not_a_singleton = y.size() > 1;
-
-  // The multiset certificate for `y':
-  // we want to be lazy about its computation.
-  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
-  Cert_Multiset y_cert_ms;
-  bool y_cert_ms_computed = false;
-
-  if (hull_stabilization == 0 && y_is_not_a_singleton) {
-    // Collect the multiset certificate for `y'.
-    y.collect_certificates(y_cert_ms);
-    y_cert_ms_computed = true;
-    // If multiset ordering is stabilizing, do nothing.
-    if (x.is_cert_multiset_stabilizing(y_cert_ms))
-      return;
-  }
-
-  // Second widening technique: try the BGP99 powerset heuristics.
-  Polyhedra_Powerset<PH> bgp99_heuristics = x;
-  bgp99_heuristics.BGP99_heuristics_assign(y, wf);
-
-  // Compute the poly-hull of `bgp99_heuristics'.
-  PH bgp99_heuristics_hull(x.space_dim, EMPTY);
-  for (const_iterator i = bgp99_heuristics.begin(),
-	 bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
-    bgp99_heuristics_hull.upper_bound_assign(i->element());
-
-  // Check for stabilization and, if successful,
-  // commit to the result of the extrapolation.
-  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
-  if (hull_stabilization == 1) {
-    // The poly-hull is stabilizing.
-    std::swap(x, bgp99_heuristics);
-    return;
-  }
-  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
-    // If not already done, compute multiset certificate for `y'.
-    if (!y_cert_ms_computed) {
-      y.collect_certificates(y_cert_ms);
-      y_cert_ms_computed = true;
-    }
-    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
-      std::swap(x, bgp99_heuristics);
-      return;
-    }
-    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
-    // Note that pairwise-reduction does not affect the computation
-    // of the poly-hulls, so that we only have to check the multiset
-    // certificate relation.
-    Polyhedra_Powerset<PH> reduced_bgp99_heuristics(bgp99_heuristics);
-    reduced_bgp99_heuristics.pairwise_reduce();
-    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
-      std::swap(x, reduced_bgp99_heuristics);
-      return;
-    }
-  }
-
-  // Fourth widening technique: this is applicable only when
-  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
-  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
-    // Compute (y_hull \widen bgp99_heuristics_hull).
-    PH ph = bgp99_heuristics_hull;
-    wf(ph, y_hull);
-    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
-    ph.difference_assign(bgp99_heuristics_hull);
-    x.add_disjunct(ph);
-    return;
-  }
-
-  // Fall back to the computation of the poly-hull.
-  Polyhedra_Powerset<PH> x_hull_singleton(x.space_dim, EMPTY);
-  x_hull_singleton.add_disjunct(x_hull);
-  std::swap(x, x_hull_singleton);
-}
-
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::ascii_dump(std::ostream& s) const {
-  const Polyhedra_Powerset& x = *this;
-  s << "size " << x.size()
-    << "\nspace_dim " << x.space_dim
-    << "\n";
-  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
-    xi->element().ascii_dump(s);
-}
-
-PPL_OUTPUT_TEMPLATE_DEFINITIONS(PH, Polyhedra_Powerset<PH>);
-
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::ascii_load(std::istream& s) {
-  Polyhedra_Powerset& x = *this;
-  std::string str;
-
-  if (!(s >> str) || str != "size")
-    return false;
-
-  size_type sz;
-
-  if (!(s >> sz))
-    return false;
-
-  if (!(s >> str) || str != "space_dim")
-    return false;
-
-  if (!(s >> x.space_dim))
-    return false;
-
-  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
-  while (sz-- > 0) {
-    PH ph;
-    if (!ph.ascii_load(s))
-      return false;
-    new_x.add_disjunct(ph);
-  }
-  x.swap(new_x);
-
-  // Check for well-formedness.
-  assert(x.OK());
-  return true;
-}
-
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::OK() const {
-  const Polyhedra_Powerset& x = *this;
-  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
-    const PH& pi = xi->element();
-    if (pi.space_dimension() != x.space_dim) {
-#ifndef NDEBUG
-      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
-		<< " in an element of the sequence,\nshould be "
-		<< x.space_dim << "."
-		<< std::endl;
-#endif
-      return false;
-    }
-  }
-  return x.Base::OK();
-}
-
-
-namespace Implementation {
-
-namespace Polyhedra_Powersets {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Partitions polyhedron \p qq according to constraint \p c.
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset
-  On exit, the intersection of \p qq and constraint \p c is stored
-  in \p qq, whereas the intersection of \p qq with the negation of \p c
-  is added as a new disjunct of the powerset \p r.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename PH>
-void
-linear_partition_aux(const Constraint& c,
-		     PH& qq,
-		     Polyhedra_Powerset<NNC_Polyhedron>& r) {
-  Linear_Expression le(c);
-  Constraint neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
-  NNC_Polyhedron qqq(qq);
-  if (qqq.add_constraint_and_minimize(neg_c))
-    r.add_disjunct(qqq);
-  qq.add_constraint(c);
-}
-
-} // namespace Polyhedra_Powersets
-
-} // namespace Implementation
-
-
-/*! \relates Polyhedra_Powerset */
-template <typename PH>
-std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
-linear_partition(const PH& p, const PH& q) {
-  using Implementation::Polyhedra_Powersets::linear_partition_aux;
-
-  Polyhedra_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
-  PH qq = q;
-  const Constraint_System& pcs = p.constraints();
-  for (Constraint_System::const_iterator i = pcs.begin(),
-	 pcs_end = pcs.end(); i != pcs_end; ++i) {
-    const Constraint c = *i;
-    if (c.is_equality()) {
-      Linear_Expression le(c);
-      linear_partition_aux(le <= 0, qq, r);
-      linear_partition_aux(le >= 0, qq, r);
-    }
-    else
-      linear_partition_aux(c, qq, r);
-  }
-  return std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >(qq, r);
-}
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Polyhedra_Powerset_templates_hh)
diff --git a/src/Polyhedra_Powerset.types.hh b/src/Polyhedra_Powerset.types.hh
deleted file mode 100644
index e4a05fc..0000000
--- a/src/Polyhedra_Powerset.types.hh
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is free software; as a special exception the author 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. */
-
-#ifndef PPL_Polyhedra_Powerset_types_hh
-#define PPL_Polyhedra_Powerset_types_hh 1
-
-namespace Parma_Polyhedra_Library {
-
-template <typename PH>
-class Polyhedra_Powerset;
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Polyhedra_Powerset_types_hh)
diff --git a/src/Polyhedron.defs.hh b/src/Polyhedron.defs.hh
index 6ed78bd..ea0764b 100644
--- a/src/Polyhedron.defs.hh
+++ b/src/Polyhedron.defs.hh
@@ -1,11 +1,11 @@
 /* Polyhedron class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,21 +26,27 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Polyhedron.types.hh"
 #include "globals.types.hh"
 #include "Variable.defs.hh"
-#include "Linear_Expression.defs.hh"
+#include "Variables_Set.types.hh"
+#include "Linear_Expression.types.hh"
 #include "Constraint_System.defs.hh"
 #include "Constraint_System.inlines.hh"
 #include "Generator_System.defs.hh"
 #include "Generator_System.inlines.hh"
 #include "Congruence_System.defs.hh"
 #include "Congruence_System.inlines.hh"
-#include "Saturation_Matrix.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
+#include "Bit_Matrix.defs.hh"
+#include "Constraint.types.hh"
 #include "Generator.types.hh"
-#include "Congruence.defs.hh"
+#include "Congruence.types.hh"
 #include "Poly_Con_Relation.defs.hh"
 #include "Poly_Gen_Relation.defs.hh"
 #include "BHRZ03_Certificate.types.hh"
 #include "H79_Certificate.types.hh"
+#include "Box.types.hh"
 #include "BD_Shape.types.hh"
+#include "Octagonal_Shape.types.hh"
 #include <vector>
 #include <iosfwd>
 
@@ -98,11 +104,6 @@ bool operator!=(const Polyhedron& x, const Polyhedron& y);
   and vice versa.
   These systems can contain redundant members: in this case we say
   that they are not in the minimal form.
-  Most operators on polyhedra are provided with two implementations:
-  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
-  also enforces the minimization of the representations,
-  and returns the Boolean value <CODE>false</CODE> whenever
-  the resulting polyhedron turns out to be empty.
 
   Two key attributes of any polyhedron are its topological kind
   (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
@@ -350,9 +351,29 @@ bool operator!=(const Polyhedron& x, const Polyhedron& y);
 
 class Parma_Polyhedra_Library::Polyhedron {
 public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
+
   //! Returns the maximum space dimension all kinds of Polyhedron can handle.
   static dimension_type max_space_dimension();
 
+  /*! \brief
+    Returns \c true indicating that this domain has methods that
+    can recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
 protected:
   //! Builds a polyhedron having the specified properties.
   /*!
@@ -370,7 +391,11 @@ protected:
 	     Degenerate_Element kind);
 
   //! Ordinary copy-constructor.
-  Polyhedron(const Polyhedron& y);
+  /*!
+    The complexity argument is ignored.
+  */
+  Polyhedron(const Polyhedron& y,
+             Complexity_Class complexity = ANY_COMPLEXITY);
 
   //! Builds a polyhedron from a system of constraints.
   /*!
@@ -396,13 +421,17 @@ protected:
 
     \param cs
     The system of constraints defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
 
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
     \exception std::invalid_argument
     Thrown if the topology of \p cs is incompatible with \p topol.
   */
-  Polyhedron(Topology topol, Constraint_System& cs);
+  Polyhedron(Topology topol, Constraint_System& cs, Recycle_Input dummy);
 
   //! Builds a polyhedron from a system of generators.
   /*!
@@ -429,72 +458,36 @@ protected:
 
     \param gs
     The system of generators defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
+    declared <CODE>const</CODE> because its data-structures may be
     recycled to build the polyhedron.
 
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
     \exception std::invalid_argument
     Thrown if the topology of \p gs is incompatible with \p topol,
     or if the system of generators is not empty but has no points.
   */
-  Polyhedron(Topology topol, Generator_System& gs);
+  Polyhedron(Topology topol, Generator_System& gs, Recycle_Input dummy);
 
-  //! Builds a polyhedron out of a generic, interval-based bounding box.
+  //! Builds a polyhedron from a box.
   /*!
+    This will use an algorithm whose complexity is polynomial and build
+    the smallest polyhedron with topology \p topol containing \p box.
+
     \param topol
     The topology of the polyhedron;
 
     \param box
-    The bounding box representing the polyhedron to be built.
-
-    \exception std::invalid_argument
-    Thrown if \p box has intervals that are incompatible with \p topol.
+    The box representing the polyhedron to be built;
 
-    The template class Box must provide the following methods.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the polyhedron
-    represented by the bounding box.
-    \code
-      bool is_empty() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the bounding box
-    describes the empty set.
-    The <CODE>is_empty()</CODE> method will always be called before the
-    methods below.  However, if <CODE>is_empty()</CODE> returns
-    <CODE>true</CODE>, none of the functions below will be called.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
+    \param complexity
+    This argument is ignored.
   */
-  template <typename Box>
-  Polyhedron(Topology topol, const Box& box);
+  template <typename Interval>
+  Polyhedron(Topology topol, const Box<Interval>& box,
+             Complexity_Class complexity = ANY_COMPLEXITY);
 
   /*! \brief
     The assignment operator.
@@ -528,6 +521,22 @@ public:
   //! Returns the system of generators, with no redundant generator.
   const Generator_System& minimized_generators() const;
 
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a system of (equality) congruences satisfied by \p *this,
+    with no redundant congruences and having the same affine dimension
+    as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns a universe system of grid generators.
+  Grid_Generator_System grid_generators() const;
+
+  //! Returns a universe system of grid generators.
+  Grid_Generator_System minimized_grid_generators() const;
+
   /*! \brief
     Returns the relations holding between the polyhedron \p *this
     and the constraint \p c.
@@ -547,6 +556,15 @@ public:
   Poly_Gen_Relation relation_with(const Generator& g) const;
 
   /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this is
     an empty polyhedron.
   */
@@ -572,6 +590,9 @@ public:
   */
   bool is_disjoint_from(const Polyhedron& y) const;
 
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this
     is a bounded polyhedron.
@@ -579,6 +600,21 @@ public:
   bool is_bounded() const;
 
   /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
     Returns <CODE>true</CODE> if and only if \p expr is
     bounded from above in \p *this.
 
@@ -640,7 +676,7 @@ public:
     \param maximum
     <CODE>true</CODE> if and only if the supremum is also the maximum value;
 
-    \param point
+    \param g
     When maximization succeeds, will be assigned the point or
     closure point where \p expr reaches its supremum value.
 
@@ -649,11 +685,11 @@ public:
 
     If \p *this is empty or \p expr is not bounded from above,
     <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
-    and \p point are left untouched.
+    and \p g are left untouched.
   */
   bool maximize(const Linear_Expression& expr,
 		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-		Generator& point) const;
+		Generator& g) const;
 
   /*! \brief
     Returns <CODE>true</CODE> if and only if \p *this is not empty
@@ -699,7 +735,7 @@ public:
     \param minimum
     <CODE>true</CODE> if and only if the infimum is also the minimum value;
 
-    \param point
+    \param g
     When minimization succeeds, will be assigned a point or
     closure point where \p expr reaches its infimum value.
 
@@ -708,11 +744,11 @@ public:
 
     If \p *this is empty or \p expr is not bounded from below,
     <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
-    and \p point are left untouched.
+    and \p g are left untouched.
   */
   bool minimize(const Linear_Expression& expr,
 		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-		Generator& point) const;
+		Generator& g) const;
 
   //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
   /*!
@@ -730,75 +766,6 @@ public:
   */
   bool strictly_contains(const Polyhedron& y) const;
 
-  /*! \brief
-    Uses \p *this to shrink a generic, interval-based bounding box.
-    Assigns to \p box the intersection of \p box with the smallest
-    bounding box containing \p *this.
-
-    \param box
-    The bounding box to be shrunk;
-
-    \param complexity
-    The complexity class of the algorithm to be used.
-
-    If the polyhedron \p *this or \p box is empty, then the empty box
-    is returned.
-
-    If \p *this and \p box are non-empty, then, for
-    each space dimension \f$k\f$ with variable \f$\mathrm{var}\f$, let
-    \f$u\f$ be the upper and \f$l\f$ the lower bound of the smallest
-    interval containing \p *this.
-
-    If \f$l\f$ is infinite, then \p box is unaltered; if \f$l\f$ is
-    finite, then the \p box interval for space dimension \f$k\f$ is
-    (destructively) intersected with \f$[l, +\mathrm{infty})\f$ if a
-    point of \p *this satisfies \f$\mathrm{var} == l\f$ and with
-    \f$(l, +\mathrm{infty})\f$ otherwise.
-
-    Similarly, if \f$u\f$ is infinite, then \p box is unaltered; if
-    \f$u\f$ is finite, then the \p box interval for space dimension
-    \f$k\f$ is (destructively) intersected with \f$(-\mathrm{infty},
-    u]\f$ if a point of \p *this satisfies \f$\mathrm{var} == u\f$ and
-    with \f$(-\mathrm{infty}, u)\f$ otherwise.
-
-    The template class Box must provide the following methods, whose
-    return values, if any, are simply ignored.
-    \code
-      set_empty()
-    \endcode
-    causes the box to become empty, i.e., to represent the empty set.
-    \code
-      raise_lower_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
-    \code
-      lower_upper_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
-    is <CODE>false</CODE>.
-
-    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
-    will be called at most once for each possible value for <CODE>k</CODE>
-    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
-    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
-    is positive, \f$0/1\f$ being the unique representation for zero.
-    The same guarantee is offered for the function
-    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
-  */
-  template <typename Box>
-  void shrink_bounding_box(Box& box,
-			   Complexity_Class complexity = ANY_COMPLEXITY) const;
-
   //! Checks if all the invariants are satisfied.
   /*!
     \return
@@ -827,6 +794,10 @@ public:
     Adds a copy of constraint \p c to the system of constraints
     of \p *this (without minimizing the result).
 
+    \param c
+    The constraint that will be added to the system of
+    constraints of \p *this.
+
     \exception std::invalid_argument
     Thrown if \p *this and constraint \p c are topology-incompatible
     or dimension-incompatible.
@@ -837,12 +808,19 @@ public:
     Adds a copy of constraint \p c to the system of constraints
     of \p *this, minimizing the result
 
+    \param c
+    The constraint that will be added to the system of
+    constraints of \p *this.
+
     \return
     <CODE>false</CODE> if and only if the result is empty.
 
     \exception std::invalid_argument
     Thrown if \p *this and constraint \p c are topology-incompatible
     or dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_constraint_and_minimize(const Constraint& c);
 
@@ -868,20 +846,52 @@ public:
     Thrown if \p *this and generator \p g are topology-incompatible or
     dimension-incompatible, or if \p *this is an empty polyhedron and
     \p g is not a point.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_generator_and_minimize(const Generator& g);
 
+  //! Domain compatibility method.
+  void add_grid_generator(const Grid_Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is empty else <CODE>false</CODE>.
+  /*!
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_grid_generator_and_minimize(const Grid_Generator& g) const;
+
   /*! \brief
-    Adds a copy of congruence \p cg to the system of congruences of \p
-    *this (without minimizing the result).
+    Adds a copy of congruence \p cg to \p *this,
+    if \p cg can be exactly represented by a polyhedron.
 
     \exception std::invalid_argument
-    Thrown if \p *this and congruence \p cg are topology-incompatible
-    or dimension-incompatible.
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    of if \p cg is a proper congruence which is neither a tautology,
+    nor a contradiction
   */
   void add_congruence(const Congruence& cg);
 
   /*! \brief
+    Adds a copy of congruence \p cg to \p *this,
+    if \p cg can be exactly represented by a polyhedron,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    of if \p cg is a proper congruence which is neither a tautology,
+    nor a contradiction
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Congruence& cg);
+
+  /*! \brief
     Adds a copy of the constraints in \p cs to the system
     of constraints of \p *this (without minimizing the result).
 
@@ -900,8 +910,8 @@ public:
     of \p *this (without minimizing the result).
 
     \param cs
-    The constraint system that will be recycled, adding its
-    constraints to the system of constraints of \p *this.
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are topology-incompatible or
@@ -927,6 +937,9 @@ public:
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are topology-incompatible or
     dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_constraints_and_minimize(const Constraint_System& cs);
 
@@ -938,8 +951,8 @@ public:
     <CODE>false</CODE> if and only if the result is empty.
 
     \param cs
-    The constraint system that will be recycled, adding its
-    constraints to the system of constraints of \p *this.
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are topology-incompatible or
@@ -948,6 +961,9 @@ public:
     \warning
     The only assumption that can be made on \p cs upon successful or
     exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_recycled_constraints_and_minimize(Constraint_System& cs);
 
@@ -971,8 +987,8 @@ public:
     of \p *this (without minimizing the result).
 
     \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p gs are topology-incompatible or
@@ -1000,6 +1016,9 @@ public:
     Thrown if \p *this and \p gs are topology-incompatible or
     dimension-incompatible, or if \p *this is empty and the the system
     of generators \p gs is not empty, but has no points.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_generators_and_minimize(const Generator_System& gs);
 
@@ -1011,8 +1030,8 @@ public:
     <CODE>false</CODE> if and only if the result is empty.
 
     \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p gs are topology-incompatible or
@@ -1022,24 +1041,161 @@ public:
     \warning
     The only assumption that can be made on \p gs upon successful or
     exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool add_recycled_generators_and_minimize(Generator_System& gs);
 
   /*! \brief
-    Adds to \p *this constraints equivalent to the congruences in \p
-    cgs (without minimizing the result).
+    Adds a copy of the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
 
     \param cgs
-    Contains the congruences that will be added to the system of
-    constraints of \p *this.
+    The congruences to be added.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p cgs are topology-incompatible or
-    dimension-incompatible.
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
   */
   void add_congruences(const Congruence_System& cgs);
 
   /*! \brief
+    Adds a copy of the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
+
+    \param cgs
+    The congruences to be added. Its elements may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Adds the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    The congruences to be added. Its elements may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of constraints
+    of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of congruences of
+    \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system
+    of constraints of \p *this.
+
+    \param cs
+    Contains the constraints used to refine the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Refines \p *this with constraints equivalent to the congruences
+    in \p cgs.
+
+    \param cgs
+    Contains the congruences used to refine the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  /*! \brief
     Assigns to \p *this the intersection of \p *this and \p y.
     The result is not guaranteed to be minimized.
 
@@ -1059,6 +1215,9 @@ public:
     \exception std::invalid_argument
     Thrown if \p *this and \p y are topology-incompatible or
     dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool intersection_assign_and_minimize(const Polyhedron& y);
 
@@ -1082,6 +1241,9 @@ public:
     \exception std::invalid_argument
     Thrown if \p *this and \p y are topology-incompatible or
     dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
   bool poly_hull_assign_and_minimize(const Polyhedron& y);
 
@@ -1103,6 +1265,17 @@ public:
   void difference_assign(const Polyhedron& y);
 
   /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Polyhedron& y);
+
+  /*! \brief
     Assigns to \p *this the
     \ref Single_Update_Affine_Functions "affine image"
     of \p *this under the function mapping variable \p var to the
@@ -1116,7 +1289,7 @@ public:
 
     \param denominator
     The denominator of the affine expression (optional argument with
-    default value 1.)
+    default value 1).
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p expr and \p *this are
@@ -1210,7 +1383,7 @@ public:
 
     \param denominator
     The denominator of the affine expression (optional argument with
-    default value 1.)
+    default value 1).
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p expr and \p *this are
@@ -1306,7 +1479,7 @@ public:
 
     \param denominator
     The denominator of the right hand side affine expression (optional
-    argument with default value 1.)
+    argument with default value 1).
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p expr and \p *this are
@@ -1315,10 +1488,10 @@ public:
     relation symbol.
   */
   void generalized_affine_image(Variable var,
-				const Relation_Symbol relsym,
+				Relation_Symbol relsym,
 				const Linear_Expression& expr,
 				Coefficient_traits::const_reference denominator
-				  = Coefficient_one());
+				= Coefficient_one());
 
   /*! \brief
     Assigns to \p *this the preimage of \p *this with respect to the
@@ -1338,7 +1511,7 @@ public:
 
     \param denominator
     The denominator of the right hand side affine expression (optional
-    argument with default value 1.)
+    argument with default value 1).
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p expr and \p *this are
@@ -1348,7 +1521,7 @@ public:
   */
   void
   generalized_affine_preimage(Variable var,
-			      const Relation_Symbol relsym,
+			      Relation_Symbol relsym,
 			      const Linear_Expression& expr,
 			      Coefficient_traits::const_reference denominator
 			      = Coefficient_one());
@@ -1374,7 +1547,7 @@ public:
     relation symbol.
   */
   void generalized_affine_image(const Linear_Expression& lhs,
-				const Relation_Symbol relsym,
+				Relation_Symbol relsym,
 				const Linear_Expression& rhs);
 
   /*! \brief
@@ -1398,7 +1571,7 @@ public:
     relation symbol.
   */
   void generalized_affine_preimage(const Linear_Expression& lhs,
-				   const Relation_Symbol relsym,
+				   Relation_Symbol relsym,
 				   const Linear_Expression& rhs);
 
   /*!
@@ -1420,7 +1593,7 @@ public:
 
     \param denominator
     The (common) denominator for the lower and upper bounding
-    affine expressions (optional argument with default value 1.)
+    affine expressions (optional argument with default value 1).
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
@@ -1452,7 +1625,7 @@ public:
 
     \param denominator
     The (common) denominator for the lower and upper bounding
-    affine expressions (optional argument with default value 1.)
+    affine expressions (optional argument with default value 1).
 
     \exception std::invalid_argument
     Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
@@ -1564,6 +1737,9 @@ public:
   */
   void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
 
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
   /*! \brief
     Improves the result of the \ref H79_widening "H79-widening"
     computation by also enforcing those constraints in \p cs that are
@@ -1801,8 +1977,7 @@ public:
 
   //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  friend bool Parma_Polyhedra_Library::operator==(const Polyhedron& x,
-						  const Polyhedron& y);
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
 
   //! \name Miscellaneous Member Functions
   //@{
@@ -1819,15 +1994,15 @@ public:
   */
   void swap(Polyhedron& y);
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
     Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
     Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   bool ascii_load(std::istream& s);
 
   //! Returns the total size in bytes of the memory occupied by \p *this.
@@ -1836,6 +2011,14 @@ public:
   //! Returns the size in bytes of the memory managed by \p *this.
   memory_size_type external_memory_in_bytes() const;
 
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
   //@} // Miscellaneous Member Functions
 
 private:
@@ -1846,10 +2029,10 @@ private:
   Generator_System gen_sys;
 
   //! The saturation matrix having constraints on its columns.
-  Saturation_Matrix sat_c;
+  Bit_Matrix sat_c;
 
   //! The saturation matrix having generators on its columns.
-  Saturation_Matrix sat_g;
+  Bit_Matrix sat_g;
 
 #define PPL_IN_Polyhedron_CLASS
 #include "Ph_Status.idefs.hh"
@@ -1870,6 +2053,15 @@ private:
   */
   bool is_necessarily_closed() const;
 
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of constraints
+    of \p *this.
+
+    \param c The constraint to be added. If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
   //! \name Private Verifiers: Verify if Individual Flags are Set
   //@{
 
@@ -2201,6 +2393,9 @@ private:
   */
   bool strongly_minimize_generators() const;
 
+  //! If constraints are up-to-date, obtain a simplified copy of them.
+  Constraint_System simplified_constraints() const;
+
   //@} // Weak and Strong Minimization of Descriptions
 
   enum Three_Valued_Boolean {
@@ -2253,7 +2448,7 @@ private:
     <CODE>true</CODE> if and only if the extremum of \p expr can
     actually be reached in \p * this;
 
-    \param point
+    \param g
     When maximization or minimization succeeds, will be assigned
     a point or closure point where \p expr reaches the
     corresponding extremum value.
@@ -2263,12 +2458,12 @@ private:
 
     If \p *this is empty or \p expr is not bounded in the appropriate
     direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
-    \p included and \p point are left untouched.
+    \p included and \p g are left untouched.
   */
   bool max_min(const Linear_Expression& expr,
-	       const bool maximize,
+	       bool maximize,
 	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
-	       Generator& point) const;
+	       Generator& g) const;
 
   //! \name Widening- and Extrapolation-Related Functions
   //@{
@@ -2332,8 +2527,8 @@ private:
   */
   static void add_space_dimensions(Linear_System& mat1,
 				   Linear_System& mat2,
-				   Saturation_Matrix& sat1,
-				   Saturation_Matrix& sat2,
+				   Bit_Matrix& sat1,
+				   Bit_Matrix& sat2,
 				   dimension_type add_dim);
 
   //! \name Minimization-Related Static Member Functions
@@ -2344,7 +2539,7 @@ private:
   static bool minimize(bool con_to_gen,
 		       Linear_System& source,
 		       Linear_System& dest,
-		       Saturation_Matrix& sat);
+		       Bit_Matrix& sat);
 
   /*! \brief
     Adds given constraints and builds minimized corresponding generators
@@ -2354,7 +2549,7 @@ private:
   static bool add_and_minimize(bool con_to_gen,
 			       Linear_System& source1,
 			       Linear_System& dest,
-			       Saturation_Matrix& sat,
+			       Bit_Matrix& sat,
 			       const Linear_System& source2);
 
   /*! \brief
@@ -2365,14 +2560,14 @@ private:
   static bool add_and_minimize(bool con_to_gen,
 			       Linear_System& source,
 			       Linear_System& dest,
-			       Saturation_Matrix& sat);
+			       Bit_Matrix& sat);
 
   //! Performs the conversion from constraints to generators and vice versa.
   // Detailed Doxygen comment to be found in file conversion.cc.
   static dimension_type conversion(Linear_System& source,
 				   dimension_type start,
 				   Linear_System& dest,
-				   Saturation_Matrix& sat,
+				   Bit_Matrix& sat,
 				   dimension_type num_lines_or_equalities);
 
   /*! \brief
@@ -2380,11 +2575,31 @@ private:
     <CODE>conversion()</CODE>.
   */
   // Detailed Doxygen comment to be found in file simplify.cc.
-  static int simplify(Linear_System& mat, Saturation_Matrix& sat);
+  static dimension_type simplify(Linear_System& mat, Bit_Matrix& sat);
 
   //@} // Minimization-Related Static Member Functions
 
+  /*! \brief
+    Pointer to an array used by simplify().
+
+    Holds (between class initialization and finalization) a pointer to
+    an array, allocated with operator new[](), of
+    simplify_num_saturators_size elements.
+  */
+  static dimension_type* simplify_num_saturators_p;
+
+  /*! \brief
+    Dimension of an array used by simplify().
+
+    Holds (between class initialization and finalization) the size of the
+    array pointed to by simplify_num_saturators_p.
+  */
+  static size_t simplify_num_saturators_size;
+
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
   template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename T> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  friend class Parma_Polyhedra_Library::Grid;
   friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
   friend class Parma_Polyhedra_Library::H79_Certificate;
 
@@ -2440,7 +2655,7 @@ protected:
 				    const Congruence_System& cgs) const;
   void throw_dimension_incompatible(const char* method,
 				    const char* var_name,
-				    const Variable var) const;
+				    Variable var) const;
   void throw_dimension_incompatible(const char* method,
 				    dimension_type required_space_dim) const;
 
diff --git a/src/Polyhedron.inlines.hh b/src/Polyhedron.inlines.hh
index e9265c0..bf892f7 100644
--- a/src/Polyhedron.inlines.hh
+++ b/src/Polyhedron.inlines.hh
@@ -1,11 +1,11 @@
 /* Polyhedron class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,9 +23,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Polyhedron_inlines_hh
 #define PPL_Polyhedron_inlines_hh 1
 
-#include "Interval.defs.hh"
 #include "Generator.defs.hh"
-#include "LP_Problem.defs.hh"
+#include "compiler.hh"
 #include <algorithm>
 #include <deque>
 
@@ -37,6 +36,16 @@ Polyhedron::total_memory_in_bytes() const {
 }
 
 inline dimension_type
+Polyhedron::space_dimension() const {
+  return space_dim;
+}
+
+inline int32_t
+Polyhedron::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
+
+inline dimension_type
 Polyhedron::max_space_dimension() {
   using std::min;
   // One dimension is reserved to have a value of type dimension_type
@@ -56,17 +65,17 @@ Polyhedron::topology() const {
 }
 
 inline bool
+Polyhedron::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+inline bool
 Polyhedron::is_necessarily_closed() const {
   // We can check either one of the two matrices.
   // (`con_sys' is slightly better, since it is placed at offset 0.)
   return con_sys.is_necessarily_closed();
 }
 
-inline dimension_type
-Polyhedron::space_dimension() const {
-  return space_dim;
-}
-
 inline void
 Polyhedron::upper_bound_assign(const Polyhedron& y) {
   poly_hull_assign(y);
@@ -77,6 +86,11 @@ Polyhedron::difference_assign(const Polyhedron& y) {
   poly_difference_assign(y);
 }
 
+inline void
+Polyhedron::widening_assign(const Polyhedron& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
+
 inline
 Polyhedron::~Polyhedron() {
 }
@@ -93,6 +107,17 @@ Polyhedron::swap(Polyhedron& y) {
   std::swap(space_dim, y.space_dim);
 }
 
+inline bool
+Polyhedron::can_recycle_constraint_systems() {
+  return true;
+}
+
+
+inline bool
+Polyhedron::can_recycle_congruence_systems() {
+  return false;
+}
+
 } // namespace Parma_Polyhedra_Library
 
 /*! \relates Parma_Polyhedra_Library::Polyhedron */
@@ -161,6 +186,18 @@ Polyhedron::can_have_something_pending() const {
     && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
 }
 
+inline bool
+Polyhedron::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date and
+  // there are no pending constraints, then the generator system
+  // (since it is well formed) contains a point.
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    return false;
+  return !minimize();
+}
+
 inline void
 Polyhedron::set_constraints_up_to_date() {
   status.set_c_up_to_date();
@@ -276,18 +313,6 @@ Polyhedron::process_pending() const {
 }
 
 inline bool
-Polyhedron::is_empty() const {
-  if (marked_empty())
-    return true;
-  // Try a fast-fail test: if generators are up-to-date and
-  // there are no pending constraints, then the generator system
-  // (since it is well formed) contains a point.
-  if (generators_are_up_to_date() && !has_pending_constraints())
-    return false;
-  return !minimize();
-}
-
-inline bool
 Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
   return bounds(expr, true);
 }
@@ -327,6 +352,65 @@ Polyhedron::minimize(const Linear_Expression& expr,
   return max_min(expr, false, inf_n, inf_d, minimum, g);
 }
 
+inline Constraint_System
+Polyhedron::simplified_constraints() const {
+  assert(constraints_are_up_to_date());
+  Constraint_System cs(con_sys);
+  if (cs.num_pending_rows() > 0)
+    cs.unset_pending_rows();
+  if (has_pending_constraints() || !constraints_are_minimized())
+    cs.simplify();
+  return cs;
+}
+
+inline Congruence_System
+Polyhedron::congruences() const {
+  return Congruence_System(minimized_constraints());
+}
+
+inline Congruence_System
+Polyhedron::minimized_congruences() const {
+  return Congruence_System(minimized_constraints());
+}
+
+inline Grid_Generator_System
+Polyhedron::minimized_grid_generators() const {
+  return grid_generators();
+}
+
+inline bool
+Polyhedron::add_congruence_and_minimize(const Congruence& cg) {
+  add_congruence(cg);
+  return minimize();
+}
+
+inline bool
+Polyhedron::add_congruences_and_minimize(const Congruence_System& cgs) {
+  add_congruences(cgs);
+  return minimize();
+}
+
+inline void
+Polyhedron::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+inline bool
+Polyhedron::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
+  return add_congruences_and_minimize(cgs);
+}
+
+inline void
+Polyhedron::add_grid_generator(const Grid_Generator& g) const {
+  used(g);
+}
+
+inline bool
+Polyhedron::add_grid_generator_and_minimize(const Grid_Generator& g) const {
+  used(g);
+  return !is_empty();
+}
+
 /*! \relates Polyhedron */
 inline bool
 operator!=(const Polyhedron& x, const Polyhedron& y) {
diff --git a/src/Polyhedron.templates.hh b/src/Polyhedron.templates.hh
index 24fbcfb..0cdad31 100644
--- a/src/Polyhedron.templates.hh
+++ b/src/Polyhedron.templates.hh
@@ -1,11 +1,11 @@
 /* Polyhedron class implementation: non-inline template functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,16 +23,17 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Polyhedron_templates_hh
 #define PPL_Polyhedron_templates_hh 1
 
-#include "Interval.defs.hh"
 #include "Generator.defs.hh"
-#include "LP_Problem.defs.hh"
+#include "MIP_Problem.defs.hh"
 #include <algorithm>
 #include <deque>
 
 namespace Parma_Polyhedra_Library {
 
-template <typename Box>
-Polyhedron::Polyhedron(Topology topol, const Box& box)
+template <typename Interval>
+Polyhedron::Polyhedron(Topology topol,
+                       const Box<Interval>& box,
+                       Complexity_Class)
   : con_sys(topol),
     gen_sys(topol),
     sat_c(),
@@ -57,47 +58,73 @@ Polyhedron::Polyhedron(Topology topol, const Box& box)
   // this constraint will be removed at the end.
   con_sys.insert(Variable(space_dim - 1) >= 0);
 
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    // See if we have a valid lower bound.
-    bool l_closed = false;
-    Coefficient l_n, l_d;
-    bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
-    if (l_bounded && topol == NECESSARILY_CLOSED && !l_closed)
-      throw_invalid_argument("C_Polyhedron(const Box& box):",
-			     " box has an open lower bound");
-    // See if we have a valid upper bound.
-    bool u_closed = false;
-    Coefficient u_n, u_d;
-    bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
-    if (u_bounded && topol == NECESSARILY_CLOSED && !u_closed)
-      throw_invalid_argument("C_Polyhedron(const Box& box):",
-			     " box has an open upper bound");
-
-    // See if we have an implicit equality constraint.
-    if (l_bounded && u_bounded
-	&& l_closed && u_closed
-	&& l_n == u_n && l_d == u_d) {
-      // Add the constraint `l_d*v_k == l_n'.
-      con_sys.insert(l_d * Variable(k) == l_n);
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+  TEMP_INTEGER(u_n);
+  TEMP_INTEGER(u_d);
+
+  if (topol == NECESSARILY_CLOSED) {
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * Variable(k) == l_n);
+      }
+      else {
+        if (l_bounded)
+          // Add the constraint `l_d*v_k >= l_n'.
+          con_sys.insert(l_d * Variable(k) >= l_n);
+        if (u_bounded)
+          // Add the constraint `u_d*v_k <= u_n'.
+          con_sys.insert(u_d * Variable(k) <= u_n);
+      }
     }
-    else {
-      // Check if a lower bound constraint is required.
-      if (l_bounded) {
-       if (l_closed)
-	 // Add the constraint `l_d*v_k >= l_n'.
-	 con_sys.insert(l_d * Variable(k) >= l_n);
-       else
-	 // Add the constraint `l_d*v_k > l_n'.
-	 con_sys.insert(l_d * Variable(k) > l_n);
+  }
+  else {
+    // topol == NOT_NECESSARILY_CLOSED
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * Variable(k) == l_n);
       }
-      // Check if an upper bound constraint is required.
-      if (u_bounded) {
-       if (u_closed)
-	 // Add the constraint `u_d*v_k <= u_n'.
-	 con_sys.insert(u_d * Variable(k) <= u_n);
-       else
-	 // Add the constraint `u_d*v_k < u_n'.
-	 con_sys.insert(u_d * Variable(k) < u_n);
+      else {
+        // Check if a lower bound constraint is required.
+        if (l_bounded) {
+          if (l_closed)
+            // Add the constraint `l_d*v_k >= l_n'.
+            con_sys.insert(l_d * Variable(k) >= l_n);
+          else
+            // Add the constraint `l_d*v_k > l_n'.
+            con_sys.insert(l_d * Variable(k) > l_n);
+        }
+        // Check if an upper bound constraint is required.
+        if (u_bounded) {
+          if (u_closed)
+            // Add the constraint `u_d*v_k <= u_n'.
+            con_sys.insert(u_d * Variable(k) <= u_n);
+          else
+            // Add the constraint `u_d*v_k < u_n'.
+            con_sys.insert(u_d * Variable(k) < u_n);
+        }
       }
     }
   }
@@ -117,247 +144,6 @@ Polyhedron::Polyhedron(Topology topol, const Box& box)
   assert(OK());
 }
 
-template <typename Box>
-void
-Polyhedron::shrink_bounding_box(Box& box, Complexity_Class complexity) const {
-  bool reduce_complexity = (complexity != ANY_COMPLEXITY);
-  if (!reduce_complexity
-      || (!has_something_pending() && constraints_are_minimized())) {
-    // If the constraint system is minimized, the test `is_universe()'
-    // is not exponential.
-    if (is_universe())
-      return;
-  }
-  if (reduce_complexity) {
-    if (marked_empty()
-	|| (generators_are_up_to_date() && gen_sys.num_rows() == 0)) {
-      box.set_empty();
-      return;
-    }
-    else if (constraints_are_up_to_date()) {
-      // See if there is at least one inconsistent constraint in `con_sys'.
-      for (Constraint_System::const_iterator i = con_sys.begin(),
-	     cs_end = con_sys.end(); i != cs_end; ++i)
-	if (i->is_inconsistent()) {
-	  box.set_empty();
-	  return;
-	}
-      // If `complexity' allows it, use the LP_Problem solver to determine
-      // whether or not the polyhedron is empty.
-      if (complexity == SIMPLEX_COMPLEXITY
-	  // TODO: find a workaround for NNC polyhedra.
-	  && is_necessarily_closed()) {
-	LP_Problem lp(con_sys);
-	if (!lp.is_satisfiable()) {
-	  box.set_empty();
-	  return;
-	}
-      }
-    }
-  }
-  else
-    // The flag `reduce_complexity' is `false'.
-    // Note that the test `is_empty()' is exponential in the worst case.
-    if (is_empty()) {
-      box.set_empty();
-      return;
-    }
-
-  if (space_dim == 0)
-    return;
-
-  // The following vectors will store the lower and upper bound
-  // for each dimension.
-  // Lower bounds are initialized to open plus infinity.
-  std::vector<LBoundary>
-    lower_bound(space_dim,
-		LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN));
-  // Upper bounds are initialized to open minus infinity.
-  std::vector<UBoundary>
-    upper_bound(space_dim,
-		UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN));
-
-  if (!reduce_complexity && has_something_pending())
-    process_pending();
-
-  // TODO: use simplex to derive variable bounds, if the complexity
-  // is SIMPLEX_COMPLEXITY.
-
-  if (reduce_complexity &&
-       (!generators_are_up_to_date() || has_pending_constraints())) {
-    // Extract easy-to-find bounds from constraints.
-    assert(constraints_are_up_to_date());
-
-    // We must copy `con_sys' to a temporary matrix,
-    // as we need to simplify all of the matrix
-    // (not just the non-pending part of it).
-    Constraint_System cs(con_sys);
-    if (cs.num_pending_rows() > 0)
-      cs.unset_pending_rows();
-    if (has_pending_constraints() || !constraints_are_minimized())
-      cs.simplify();
-
-    const Constraint_System::const_iterator cs_begin = cs.begin();
-    const Constraint_System::const_iterator cs_end = cs.end();
-
-    for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i) {
-      dimension_type varid = space_dim;
-      const Constraint& c = *i;
-      // After `simplify()' some constraints may have become inconsistent.
-      if (c.is_inconsistent()) {
-	box.set_empty();
-	return;
-      }
-      for (dimension_type j = space_dim; j-- > 0; ) {
-	// We look for constraints of the form `Variable(j) == k',
-	// `Variable(j) >= k', and `Variable(j) > k'.
-	if (c.coefficient(Variable(j)) != 0)
-	  if (varid != space_dim) {
-	    varid = space_dim;
-	    break;
-	  }
-	  else
-	    varid = j;
-      }
-      if (varid != space_dim) {
-	Coefficient_traits::const_reference d = c.coefficient(Variable(varid));
-	Coefficient_traits::const_reference n = c.inhomogeneous_term();
-	// The constraint `c' is of the form
-	// `Variable(varid) + n / d rel 0', where
-	// `rel' is either the relation `==', `>=', or `>'.
-	// For the purpose of shrinking intervals, this is
-	// (morally) turned into `Variable(varid) rel -n/d'.
-	mpq_class q;
-	assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-	assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-	q.canonicalize();
-	// Turn `n/d' into `-n/d'.
-	q = -q;
-	const ERational r(q, ROUND_NOT_NEEDED);
-	const Constraint::Type c_type = c.type();
-	switch (c_type) {
-	case Constraint::EQUALITY:
-	  lower_bound[varid] = LBoundary(r, LBoundary::CLOSED);
-	  upper_bound[varid] = UBoundary(r, UBoundary::CLOSED);
-	  break;
-	case Constraint::NONSTRICT_INEQUALITY:
-	case Constraint::STRICT_INEQUALITY:
-	  if (d > 0)
-	  // If `d' is strictly positive, we have a constraint of the
-	  // form `Variable(varid) >= k' or `Variable(varid) > k'.
-	    lower_bound[varid]
-	      = LBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
-			      ? LBoundary::CLOSED
-			      : LBoundary::OPEN));
-	  else {
-	    // Otherwise, we are sure that `d' is strictly negative
-	    // and, in this case, we have a constraint of the form
-	    // `Variable(varid) <= k' or `Variable(varid) < k'.
-	    assert(d < 0);
-	    upper_bound[varid]
-	      = UBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
-			      ? UBoundary::CLOSED
-			      : UBoundary::OPEN));
-	  }
-	  break;
-	}
-      }
-    }
-  }
-  else {
-    // We are in the case where either the generators are up-to-date
-    // or reduced complexity is not required.
-    // Get the generators for *this.
-
-    // We have not to copy `gen_sys', because in this case
-    // we only read the generators.
-    const Generator_System& gs = gen_sys;
-
-    // We first need to identify those axes that are unbounded below
-    // and/or above.
-    for (Generator_System::const_iterator i = gs.begin(),
-	   gs_end = gs.end(); i != gs_end; ++i) {
-      // Note: using an iterator, we read also the pending part of the matrix.
-      const Generator& g = *i;
-      Generator::Type g_type = g.type();
-      switch (g_type) {
-      case Generator::LINE:
-	// Any axes `j' in which the coefficient is non-zero is unbounded
-	// both below and above.
-	for (dimension_type j = space_dim; j-- > 0; )
-	  if (g.coefficient(Variable(j)) != 0) {
-	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
-				       LBoundary::OPEN);
-	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
-				       UBoundary::OPEN);
-	  }
-	break;
-      case Generator::RAY:
-	// Axes in which the coefficient is negative are unbounded below.
-	// Axes in which the coefficient is positive are unbounded above.
-	for (dimension_type j = space_dim; j-- > 0; ) {
-	  int sign = sgn(g.coefficient(Variable(j)));
-	  if (sign < 0)
-	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
-				       LBoundary::OPEN);
-	  else if (sign > 0)
-	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
-				       UBoundary::OPEN);
-	}
-	break;
-      case Generator::POINT:
-      case Generator::CLOSURE_POINT:
-	{
-	  Coefficient_traits::const_reference d = g.divisor();
-	  for (dimension_type j = space_dim; j-- > 0; ) {
-	    Coefficient_traits::const_reference n = g.coefficient(Variable(j));
-	    mpq_class q;
-	    assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-	    assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-	    q.canonicalize();
-	    const ERational r(q, ROUND_NOT_NEEDED);
-	    LBoundary lb(r,(g_type == Generator::CLOSURE_POINT
-			    ? LBoundary::OPEN
-			    : LBoundary::CLOSED));
-	    if (lb < lower_bound[j])
-	      lower_bound[j] = lb;
-	    UBoundary ub(r, (g_type == Generator::CLOSURE_POINT
-			     ? UBoundary::OPEN
-			     : UBoundary::CLOSED));
-	    if (ub > upper_bound[j])
-	      upper_bound[j] = ub;
-	  }
-	}
-	break;
-      }
-    }
-  }
-
-  TEMP_INTEGER(n);
-  TEMP_INTEGER(d);
-
-  // Now shrink the bounded axes.
-  for (dimension_type j = space_dim; j-- > 0; ) {
-    // Lower bound.
-    const LBoundary& lb = lower_bound[j];
-    const ERational& lr = lb.bound();
-    if (!is_plus_infinity(lr) && !is_minus_infinity(lr)) {
-      n = raw_value(lr).get_num();
-      d = raw_value(lr).get_den();
-      box.raise_lower_bound(j, lb.is_closed(), n, d);
-    }
-
-    // Upper bound.
-    const UBoundary& ub = upper_bound[j];
-    const ERational& ur = ub.bound();
-    if (!is_plus_infinity(ur) && !is_minus_infinity(ur)) {
-      n = raw_value(ur).get_num();
-      d = raw_value(ur).get_den();
-      box.lower_upper_bound(j, ub.is_closed(), n, d);
-    }
-  }
-}
-
 template <typename Partial_Function>
 void
 Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
@@ -454,7 +240,7 @@ Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
   // If there are pending constraints, using `generators()' we process them.
   const Generator_System& old_gensys = generators();
 
-  if (old_gensys.num_rows() == 0) {
+  if (old_gensys.has_no_rows()) {
     // The polyhedron is empty.
     Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
     std::swap(*this, new_polyhedron);
diff --git a/src/Polyhedron.types.hh b/src/Polyhedron.types.hh
index ea057dc..943edc8 100644
--- a/src/Polyhedron.types.hh
+++ b/src/Polyhedron.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Polyhedron_chdims.cc b/src/Polyhedron_chdims.cc
index b472465..8adc0de 100644
--- a/src/Polyhedron_chdims.cc
+++ b/src/Polyhedron_chdims.cc
@@ -1,12 +1,12 @@
 /* Polyhedron class implementation
    (non-inline operators that may change the dimension of the vector space).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,9 +21,10 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Polyhedron.defs.hh"
+#include "Variables_Set.defs.hh"
 #include <cassert>
 
 #define BE_LAZY 1
@@ -33,8 +34,8 @@ namespace PPL = Parma_Polyhedra_Library;
 void
 PPL::Polyhedron::add_space_dimensions(Linear_System& sys1,
 				      Linear_System& sys2,
-				      Saturation_Matrix& sat1,
-				      Saturation_Matrix& sat2,
+				      Bit_Matrix& sat1,
+				      Bit_Matrix& sat2,
 				      dimension_type add_dim) {
   assert(sys1.topology() == sys2.topology());
   assert(sys1.num_columns() == sys2.num_columns());
@@ -130,7 +131,7 @@ PPL::Polyhedron::add_space_dimensions_and_embed(dimension_type m) {
   // as the second argument.
   if (constraints_are_up_to_date())
     if (generators_are_up_to_date()) {
-      // `sat_c' must be up to date for add_space_dimensions(...).
+      // `sat_c' must be up to date for add_space_dimensions().
       if (!sat_c_is_up_to_date())
 	update_sat_c();
       // Adds rows and/or columns to both matrices.
@@ -205,7 +206,7 @@ PPL::Polyhedron::add_space_dimensions_and_project(dimension_type m) {
   }
 
   if (space_dim == 0) {
-    assert(status.test_zero_dim_univ() && gen_sys.num_rows() == 0);
+    assert(status.test_zero_dim_univ() && gen_sys.has_no_rows());
     // The system of generators for this polyhedron has only
     // the origin as a point.
     // In an NNC polyhedron, all points have to be accompanied
@@ -230,7 +231,7 @@ PPL::Polyhedron::add_space_dimensions_and_project(dimension_type m) {
   // giving the system of constraints as the second argument.
   if (constraints_are_up_to_date())
     if (generators_are_up_to_date()) {
-      // `sat_g' must be up to date for add_space_dimensions(...).
+      // `sat_g' must be up to date for add_space_dimensions().
       if (!sat_g_is_up_to_date())
 	update_sat_g();
       // Adds rows and/or columns to both matrices.
@@ -289,14 +290,13 @@ PPL::Polyhedron::concatenate_assign(const Polyhedron& y) {
 
   // The space dimension of the resulting polyhedron should not
   // overflow the maximum allowed space dimension.
-  if (y.space_dim > max_space_dimension() - space_dimension())
+  const dimension_type added_columns = y.space_dim;
+  if (added_columns > max_space_dimension() - space_dim)
     throw_space_dimension_overflow(topology(),
 				   "concatenate_assign(y)",
 				   "concatenation exceeds the maximum "
 				   "allowed space dimension");
 
-  const dimension_type added_columns = y.space_dim;
-
   // If `*this' or `y' are empty polyhedra, it is sufficient to adjust
   // the dimension of the space.
   if (marked_empty() || y.marked_empty()) {
@@ -349,8 +349,7 @@ PPL::Polyhedron::concatenate_assign(const Polyhedron& y) {
   for (dimension_type i = added_rows; i-- > 0; ) {
     Constraint& c_old = cs[i];
     Constraint& c_new = con_sys[old_num_rows + i];
-    // Method `add_zero_rows_and_columns', by default, added
-    // inequalities.
+    // Method `add_zero_rows_and_columns', by default, added inequalities.
     if (c_old.is_equality())
       c_new.set_is_equality();
     // The inhomogeneous term is not displaced.
@@ -423,10 +422,8 @@ PPL::Polyhedron::remove_space_dimensions(const Variables_Set& to_be_removed) {
     return;
   }
 
-  // Dimension-compatibility check: the variable having
-  // maximum space dimension is the one occurring last in the set.
-  const dimension_type
-    min_space_dim = to_be_removed.rbegin()->space_dimension();
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_removed.space_dimension();
   if (space_dim < min_space_dim)
     throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
 
@@ -458,10 +455,10 @@ PPL::Polyhedron::remove_space_dimensions(const Variables_Set& to_be_removed) {
   // by shifting left those columns that will not be removed.
   Variables_Set::const_iterator tbr = to_be_removed.begin();
   Variables_Set::const_iterator tbr_end = to_be_removed.end();
-  dimension_type dst_col = tbr->space_dimension();
+  dimension_type dst_col = *tbr + 1;
   dimension_type src_col = dst_col + 1;
   for (++tbr; tbr != tbr_end; ++tbr) {
-    dimension_type tbr_col = tbr->space_dimension();
+    const dimension_type tbr_col = *tbr + 1;
     // All columns in between are moved to the left.
     while (src_col < tbr_col)
       gen_sys.Matrix::swap_columns(dst_col++, src_col++);
@@ -616,21 +613,30 @@ PPL::Polyhedron::fold_space_dimensions(const Variables_Set& to_be_folded,
     return;
 
   // All variables in `to_be_folded' should be dimensions of the polyhedron.
-  if (to_be_folded.rbegin()->space_dimension() > space_dim)
+  if (to_be_folded.space_dimension() > space_dim)
     throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
-				 "*tbf.rbegin()",
-				 *to_be_folded.rbegin());
+				 "tbf.space_dimension()",
+				 to_be_folded.space_dimension());
 
-  // Moreover, `var' should not occur in `to_be_folded'.
-  if (to_be_folded.find(var) != to_be_folded.end())
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
     throw_invalid_argument("fold_space_dimensions(tbf, v)",
 			   "v should not occur in tbf");
 
-  for (Variables_Set::const_iterator i = to_be_folded.begin(),
-	 tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
-    Polyhedron copy = *this;
-    copy.affine_image(var, Linear_Expression(*i));
-    poly_hull_assign(copy);
+  // All of the affine images we are going to compute are not invertible,
+  // hence we will need to compute the generators of the polyehdron.
+  // Since we keep taking copies, make sure that a single conversion
+  // from constraints to generators is computed.
+  (void) generators();
+  // Having generators, we now know if the polyhedron is empty:
+  // in that case, folding is equivalent to just removing space dimensions.
+  if (!marked_empty()) {
+    for (Variables_Set::const_iterator i = to_be_folded.begin(),
+           tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+      Polyhedron copy = *this;
+      copy.affine_image(var, Linear_Expression(Variable(*i)));
+      poly_hull_assign(copy);
+    }
   }
   remove_space_dimensions(to_be_folded);
   assert(OK());
diff --git a/src/Polyhedron_nonpublic.cc b/src/Polyhedron_nonpublic.cc
index 66e75b6..70c3500 100644
--- a/src/Polyhedron_nonpublic.cc
+++ b/src/Polyhedron_nonpublic.cc
@@ -1,12 +1,12 @@
 /* Polyhedron class implementation
    (non-inline private or protected functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,7 +21,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Polyhedron.defs.hh"
 #include "Scalar_Products.defs.hh"
@@ -41,7 +41,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   we collect enough information to decide which is the better
   implementation alternative.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 #define BE_LAZY 1
 
 namespace PPL = Parma_Polyhedra_Library;
@@ -67,7 +67,7 @@ PPL::Polyhedron::Polyhedron(const Topology topol,
   assert(OK());
 }
 
-PPL::Polyhedron::Polyhedron(const Polyhedron& y)
+PPL::Polyhedron::Polyhedron(const Polyhedron& y, Complexity_Class)
   : con_sys(y.topology()),
     gen_sys(y.topology()),
     status(y.status),
@@ -133,7 +133,9 @@ PPL::Polyhedron::Polyhedron(const Topology topol, const Constraint_System& ccs)
   assert(OK());
 }
 
-PPL::Polyhedron::Polyhedron(const Topology topol, Constraint_System& cs)
+PPL::Polyhedron::Polyhedron(const Topology topol,
+			    Constraint_System& cs,
+			    Recycle_Input)
   : con_sys(topol),
     gen_sys(topol),
     sat_c(),
@@ -145,8 +147,8 @@ PPL::Polyhedron::Polyhedron(const Topology topol, Constraint_System& cs)
   const dimension_type cs_space_dim = cs.space_dimension();
   if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim))
     throw_topology_incompatible((topol == NECESSARILY_CLOSED)
-				? "C_Polyhedron(cs)"
-				: "NNC_Polyhedron(cs)", "cs", cs);
+				? "C_Polyhedron(cs, recycle)"
+				: "NNC_Polyhedron(cs, recycle)", "cs", cs);
 
   // Set the space dimension.
   space_dim = cs_space_dim;
@@ -191,7 +193,7 @@ PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& cgs)
   Generator_System gs = cgs;
 
   // An empty set of generators defines the empty polyhedron.
-  if (gs.num_rows() == 0) {
+  if (gs.has_no_rows()) {
     space_dim = gs.space_dimension();
     status.set_empty();
     assert(OK());
@@ -242,7 +244,9 @@ PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& cgs)
   assert(OK());
 }
 
-PPL::Polyhedron::Polyhedron(const Topology topol, Generator_System& gs)
+PPL::Polyhedron::Polyhedron(const Topology topol,
+			    Generator_System& gs,
+			    Recycle_Input)
   : con_sys(topol),
     gen_sys(topol),
     sat_c(),
@@ -251,7 +255,7 @@ PPL::Polyhedron::Polyhedron(const Topology topol, Generator_System& gs)
   assert(gs.space_dimension() <= max_space_dimension());
 
   // An empty set of generators defines the empty polyhedron.
-  if (gs.num_rows() == 0) {
+  if (gs.has_no_rows()) {
     space_dim = gs.space_dimension();
     status.set_empty();
     assert(OK());
@@ -261,15 +265,15 @@ PPL::Polyhedron::Polyhedron(const Topology topol, Generator_System& gs)
   // Non-empty valid generator systems have a supporting point, at least.
   if (!gs.has_points())
     throw_invalid_generators((topol == NECESSARILY_CLOSED)
-			     ? "C_Polyhedron(gs)"
-			     : "NNC_Polyhedron(gs)", "gs");
+			     ? "C_Polyhedron(gs, recycle)"
+			     : "NNC_Polyhedron(gs, recycle)", "gs");
 
   const dimension_type gs_space_dim = gs.space_dimension();
   // Try to adapt `gs' to the required topology.
   if (!gs.adjust_topology_and_space_dimension(topol, gs_space_dim))
     throw_topology_incompatible((topol == NECESSARILY_CLOSED)
-				? "C_Polyhedron(gs)"
-				: "NNC_Polyhedron(gs)", "gs", gs);
+				? "C_Polyhedron(gs, recycle)"
+				: "NNC_Polyhedron(gs, recycle)", "gs", gs);
 
   if (gs_space_dim > 0) {
     // Stealing the rows from `gs'.
@@ -552,7 +556,7 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
 			 const bool maximize,
 			 Coefficient& ext_n, Coefficient& ext_d,
 			 bool& included,
-			 Generator& point) const {
+			 Generator& g) const {
   // The dimension of `expr' should not be greater than the dimension
   // of `*this'.
   const dimension_type expr_space_dim = expr.space_dimension();
@@ -561,6 +565,19 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
 				  ? "maximize(e, ...)"
 				  : "minimize(e, ...)"), "e", expr);
 
+  // Deal with zero-dim polyhedra first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
   // For an empty polyhedron we simply return false.
   if (marked_empty()
       || (has_pending_constraints() && !process_pending_constraints())
@@ -570,7 +587,7 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
   // The polyhedron has updated, possibly pending generators.
   // The following loop will iterate through the generator
   // to find the extremum.
-  mpq_class extremum;
+  DIRTY_TEMP0(mpq_class, extremum);
 
   // True if we have no other candidate extremum to compare with.
   bool first_candidate = true;
@@ -585,13 +602,13 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
 
   TEMP_INTEGER(sp);
   for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
-    const Generator& g = gen_sys[i];
-    Scalar_Products::homogeneous_assign(sp, expr, g);
+    const Generator& gen_sys_i = gen_sys[i];
+    Scalar_Products::homogeneous_assign(sp, expr, gen_sys_i);
     // Lines and rays in `*this' can cause `expr' to be unbounded.
-    if (g.is_line_or_ray()) {
+    if (gen_sys_i.is_line_or_ray()) {
       const int sp_sign = sgn(sp);
       if (sp_sign != 0
-	  && (g.is_line()
+	  && (gen_sys_i.is_line()
 	      || (maximize && sp_sign > 0)
 	      || (!maximize && sp_sign < 0)))
 	// `expr' is unbounded in `*this'.
@@ -599,14 +616,14 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
     }
     else {
       // We have a point or a closure point.
-      assert(g.is_point() || g.is_closure_point());
+      assert(gen_sys_i.is_point() || gen_sys_i.is_closure_point());
       // Notice that we are ignoring the constant term in `expr' here.
       // We will add it to the extremum as soon as we find it.
-      mpq_class candidate;
+      DIRTY_TEMP0(mpq_class, candidate);
       assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
-      assign_r(candidate.get_den(), g[0], ROUND_NOT_NEEDED);
+      assign_r(candidate.get_den(), gen_sys_i[0], ROUND_NOT_NEEDED);
       candidate.canonicalize();
-      const bool g_is_point = g.is_point();
+      const bool g_is_point = gen_sys_i.is_point();
       if (first_candidate
 	  || (maximize
 	      && (candidate > extremum
@@ -628,7 +645,7 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
   }
 
   // Add in the constant term in `expr'.
-  mpz_class n;
+  DIRTY_TEMP0(mpz_class, n);
   assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
   extremum += n;
 
@@ -638,7 +655,7 @@ PPL::Polyhedron::max_min(const Linear_Expression& expr,
   ext_n = Coefficient(extremum.get_num());
   ext_d = Coefficient(extremum.get_den());
   included = ext_included;
-  point = gen_sys[ext_position];
+  g = gen_sys[ext_position];
 
   return true;
 }
@@ -892,7 +909,7 @@ PPL::Polyhedron::obtain_sorted_constraints() const {
   assert(constraints_are_up_to_date());
   // `con_sys' will be sorted up to `index_first_pending'.
   Polyhedron& x = const_cast<Polyhedron&>(*this);
-  if (!x.con_sys.is_sorted())
+  if (!x.con_sys.is_sorted()) {
     if (x.sat_g_is_up_to_date()) {
       // Sorting constraints keeping `sat_g' consistent.
       x.con_sys.sort_and_remove_with_sat(x.sat_g);
@@ -910,6 +927,7 @@ PPL::Polyhedron::obtain_sorted_constraints() const {
       // If neither `sat_g' nor `sat_c' are up-to-date,
       // we just sort the constraints.
       x.con_sys.sort_rows();
+  }
 
   assert(con_sys.check_sorted());
 }
@@ -919,7 +937,7 @@ PPL::Polyhedron::obtain_sorted_generators() const {
   assert(generators_are_up_to_date());
   // `gen_sys' will be sorted up to `index_first_pending'.
   Polyhedron& x = const_cast<Polyhedron&>(*this);
-  if (!x.gen_sys.is_sorted())
+  if (!x.gen_sys.is_sorted()) {
     if (x.sat_c_is_up_to_date()) {
       // Sorting generators keeping 'sat_c' consistent.
       x.gen_sys.sort_and_remove_with_sat(x.sat_c);
@@ -937,6 +955,7 @@ PPL::Polyhedron::obtain_sorted_generators() const {
       // If neither `sat_g' nor `sat_c' are up-to-date, we just sort
       // the generators.
       x.gen_sys.sort_rows();
+  }
 
   assert(gen_sys.check_sorted());
 }
@@ -1073,12 +1092,12 @@ PPL::Polyhedron::strongly_minimize_constraints() const {
     x.sat_g.transpose_assign(sat_c);
   }
 
-  // These Saturation_Row's will be later used as masks in order to
+  // These Bit_Row's will be later used as masks in order to
   // check saturation conditions restricted to particular subsets of
   // the generator system.
-  Saturation_Row sat_all_but_rays;
-  Saturation_Row sat_all_but_points;
-  Saturation_Row sat_all_but_closure_points;
+  Bit_Row sat_all_but_rays;
+  Bit_Row sat_all_but_points;
+  Bit_Row sat_all_but_closure_points;
 
   const dimension_type gs_rows = gen_sys.num_rows();
   const dimension_type n_lines = gen_sys.num_lines();
@@ -1098,13 +1117,13 @@ PPL::Polyhedron::strongly_minimize_constraints() const {
       throw std::runtime_error("PPL internal error: "
 			       "strongly_minimize_constraints.");
     }
-  Saturation_Row sat_lines_and_rays;
+  Bit_Row sat_lines_and_rays;
   set_union(sat_all_but_points, sat_all_but_closure_points,
 	    sat_lines_and_rays);
-  Saturation_Row sat_lines_and_closure_points;
+  Bit_Row sat_lines_and_closure_points;
   set_union(sat_all_but_rays, sat_all_but_points,
 	    sat_lines_and_closure_points);
-  Saturation_Row sat_lines;
+  Bit_Row sat_lines;
   set_union(sat_lines_and_rays, sat_lines_and_closure_points,
 	    sat_lines);
 
@@ -1118,13 +1137,13 @@ PPL::Polyhedron::strongly_minimize_constraints() const {
   // eps-redundancy and eventually move them to the bottom part of the
   // system.
   Constraint_System& cs = x.con_sys;
-  Saturation_Matrix& sat = x.sat_g;
+  Bit_Matrix& sat = x.sat_g;
   dimension_type cs_rows = cs.num_rows();
   const dimension_type eps_index = cs.num_columns() - 1;
   for (dimension_type i = 0; i < cs_rows; )
     if (cs[i].is_strict_inequality()) {
       // First, check if it is saturated by no closure points
-      Saturation_Row sat_ci;
+      Bit_Row sat_ci;
       set_union(sat[i], sat_lines_and_closure_points, sat_ci);
       if (sat_ci == sat_lines) {
 	// It is saturated by no closure points.
@@ -1201,15 +1220,16 @@ PPL::Polyhedron::strongly_minimize_constraints() const {
 
     // If we haven't found an upper bound for the epsilon dimension,
     // then we have to check whether such an upper bound is implied
-    // by the remaining constraints (exploiting teh simplex algorithm).
+    // by the remaining constraints (exploiting the simplex algorithm).
     if (!found_eps_leq_one) {
-      LP_Problem lp;
+      MIP_Problem lp;
       // KLUDGE: temporarily mark the constraint system as if it was
       // necessarily closed, so that we can interpret the epsilon
       // dimension as a standard dimension. Be careful to reset the
       // topology of `cs' even on exceptional execution path.
       cs.set_necessarily_closed();
       try {
+	lp.add_space_dimensions_and_embed(cs.space_dimension());
 	lp.add_constraints(cs);
 	cs.set_not_necessarily_closed();
       }
@@ -1220,11 +1240,11 @@ PPL::Polyhedron::strongly_minimize_constraints() const {
       // The objective function is `epsilon'.
       lp.set_objective_function(Variable(x.space_dim));
       lp.set_optimization_mode(MAXIMIZATION);
-      LP_Problem_Status status = lp.solve();
-      assert(status != UNFEASIBLE_LP_PROBLEM);
+      MIP_Problem_Status status = lp.solve();
+      assert(status != UNFEASIBLE_MIP_PROBLEM);
       // If the epsilon dimension is actually unbounded,
       // then add the eps_leq_one constraint.
-      if (status == UNBOUNDED_LP_PROBLEM)
+      if (status == UNBOUNDED_MIP_PROBLEM)
 	cs.insert(Constraint::epsilon_leq_one());
     }
   }
@@ -1256,9 +1276,9 @@ PPL::Polyhedron::strongly_minimize_generators() const {
     x.sat_c.transpose_assign(sat_g);
   }
 
-  // This Saturation_Row will have all and only the indexes
+  // This Bit_Row will have all and only the indexes
   // of strict inequalities set to 1.
-  Saturation_Row sat_all_but_strict_ineq;
+  Bit_Row sat_all_but_strict_ineq;
   const dimension_type cs_rows = con_sys.num_rows();
   const dimension_type n_equals = con_sys.num_equalities();
   for (dimension_type i = cs_rows; i-- > n_equals; )
@@ -1271,15 +1291,15 @@ PPL::Polyhedron::strongly_minimize_generators() const {
   // For all points in the generator system, check for eps-redundancy
   // and eventually move them to the bottom part of the system.
   Generator_System& gs = const_cast<Generator_System&>(gen_sys);
-  Saturation_Matrix& sat = const_cast<Saturation_Matrix&>(sat_c);
+  Bit_Matrix& sat = const_cast<Bit_Matrix&>(sat_c);
   dimension_type gs_rows = gs.num_rows();
   const dimension_type n_lines = gs.num_lines();
   const dimension_type eps_index = gs.num_columns() - 1;
   for (dimension_type i = n_lines; i < gs_rows; )
     if (gs[i].is_point()) {
-      // Compute the Saturation_Row corresponding to the candidate point
+      // Compute the Bit_Row corresponding to the candidate point
       // when strict inequality constraints are ignored.
-      Saturation_Row sat_gi;
+      Bit_Row sat_gi;
       set_union(sat[i], sat_all_but_strict_ineq, sat_gi);
       // Check if the candidate point is actually eps-redundant:
       // namely, if there exists another point that saturates
diff --git a/src/Polyhedron_public.cc b/src/Polyhedron_public.cc
index d662ca0..e19f6c1 100644
--- a/src/Polyhedron_public.cc
+++ b/src/Polyhedron_public.cc
@@ -1,11 +1,11 @@
 /* Polyhedron class implementation (non-inline public functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,11 +20,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
-
+#include <ppl-config.h>
 #include "Polyhedron.defs.hh"
 #include "Scalar_Products.defs.hh"
-
+#include "MIP_Problem.defs.hh"
+#include <cstdlib>
 #include <cassert>
 #include <iostream>
 
@@ -34,6 +34,24 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace PPL = Parma_Polyhedra_Library;
 
+PPL::dimension_type* PPL::Polyhedron::simplify_num_saturators_p = 0;
+
+size_t PPL::Polyhedron::simplify_num_saturators_size = 0;
+
+void
+PPL::Polyhedron::initialize() {
+  assert(simplify_num_saturators_p == 0);
+  assert(simplify_num_saturators_size == 0);
+  simplify_num_saturators_p = new dimension_type[simplify_num_saturators_size];
+}
+
+void
+PPL::Polyhedron::finalize() {
+  delete [] simplify_num_saturators_p;
+  simplify_num_saturators_p = 0;
+  simplify_num_saturators_size = 0;
+}
+
 PPL::dimension_type
 PPL::Polyhedron::affine_dimension() const {
   if (is_empty())
@@ -53,7 +71,7 @@ PPL::Polyhedron::constraints() const {
   if (marked_empty()) {
     // We want `con_sys' to only contain the unsatisfiable constraint
     // of the appropriate dimension.
-    if (con_sys.num_rows() == 0) {
+    if (con_sys.has_no_rows()) {
       // The 0-dim unsatisfiable constraint is extended to
       // the appropriate dimension and then stored in `con_sys'.
       Constraint_System unsat_cs = Constraint_System::zero_dim_empty();
@@ -70,8 +88,8 @@ PPL::Polyhedron::constraints() const {
   }
 
   if (space_dim == 0) {
-    // zero-dimensional universe.
-    assert(con_sys.num_columns() == 0 && con_sys.num_rows() == 0);
+    // Zero-dimensional universe.
+    assert(con_sys.num_rows() == 0 && con_sys.num_columns() == 0);
     return con_sys;
   }
 
@@ -107,7 +125,7 @@ PPL::Polyhedron::minimized_constraints() const {
 const PPL::Generator_System&
 PPL::Polyhedron::generators() const {
   if (marked_empty()) {
-    assert(gen_sys.num_rows() == 0);
+    assert(gen_sys.has_no_rows());
     // We want `gen_sys' to have the appropriate space dimension,
     // even though it is an empty generator system.
     if (gen_sys.space_dimension() != space_dim) {
@@ -119,7 +137,7 @@ PPL::Polyhedron::generators() const {
   }
 
   if (space_dim == 0) {
-    assert(gen_sys.num_columns() == 0 && gen_sys.num_rows() == 0);
+    assert(gen_sys.num_rows() == 0 && gen_sys.num_columns() == 0);
     return Generator_System::zero_dim_univ();
   }
 
@@ -129,7 +147,7 @@ PPL::Polyhedron::generators() const {
   if ((has_pending_constraints() && !process_pending_constraints())
       || (!generators_are_up_to_date() && !update_generators())) {
     // We have just discovered that `*this' is empty.
-    assert(gen_sys.num_rows() == 0);
+    assert(gen_sys.has_no_rows());
     // We want `gen_sys' to have the appropriate space dimension,
     // even though it is an empty generator system.
     if (gen_sys.space_dimension() != space_dim) {
@@ -172,6 +190,18 @@ PPL::Polyhedron::minimized_generators() const {
   return generators();
 }
 
+PPL::Grid_Generator_System
+PPL::Polyhedron::grid_generators() const {
+  Grid_Generator_System ggs(space_dim);
+  // Trivially true point.
+  ggs.insert(grid_point(0*(Variable(0))));
+  // A line for each dimension.
+  dimension_type dim = 0;
+  while (dim < space_dim)
+    ggs.insert(grid_line(Variable(dim)));
+  return ggs;
+}
+
 PPL::Poly_Con_Relation
 PPL::Polyhedron::relation_with(const Constraint& c) const {
   // Dimension-compatibility check.
@@ -183,7 +213,7 @@ PPL::Polyhedron::relation_with(const Constraint& c) const {
       && Poly_Con_Relation::is_included()
       && Poly_Con_Relation::is_disjoint();
 
-  if (space_dim == 0)
+  if (space_dim == 0) {
     if (c.is_inconsistent())
       if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
 	// The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
@@ -200,6 +230,7 @@ PPL::Polyhedron::relation_with(const Constraint& c) const {
       // neither the positivity constraint 1 >= 0,
       // nor the strict positivity constraint 1 > 0.
       return Poly_Con_Relation::is_included();
+  }
 
   if ((has_pending_constraints() && !process_pending_constraints())
       || (!generators_are_up_to_date() && !update_generators()))
@@ -237,6 +268,104 @@ PPL::Polyhedron::relation_with(const Generator& g) const {
     : Poly_Gen_Relation::nothing();
 }
 
+PPL::Poly_Con_Relation
+PPL::Polyhedron::relation_with(const Congruence& cg) const {
+  dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (space_dim < cg_space_dim)
+    throw_dimension_incompatible("relation_with(cg)", "cg", cg);
+
+  if (cg.is_equality()) {
+    const Constraint c(cg);
+    return relation_with(c);
+  }
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+  }
+
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // The polyhedron is empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  // Find the equality corresponding to the congruence (ignoring the modulus).
+  Linear_Expression expr;
+  for (dimension_type i = cg_space_dim; i-- > 0; ) {
+    const Variable v(i);
+    expr += cg.coefficient(v) * v;
+  }
+  expr += cg.inhomogeneous_term();
+  Constraint c(expr == 0);
+
+  // The polyhedron is non-empty so that there exists a point.
+  // For an arbitrary generator point find the scalar product with
+  // the equality.
+  TEMP_INTEGER(point_val);
+
+  for (Generator_System::const_iterator g = gen_sys.begin(),
+         gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) {
+    if (g->is_point()) {
+      Scalar_Products::assign(point_val, c, *g);
+      break;
+    }
+  }
+
+  // Find the 2 hyperplanes that satisfies the congruence and are
+  // nearest to the point such that the point lies on or between these
+  // hyperplanes.
+  // Then use the relations between the polyhedron and the corresponding
+  // half-spaces to determine its relation with the congruence.
+  const Coefficient& modulus = cg.modulus();
+
+  TEMP_INTEGER(div);
+  div = modulus;
+
+  TEMP_INTEGER(nearest);
+  nearest = (point_val / div) * div;
+
+  point_val -= nearest;
+  expr -= nearest;
+  if (point_val == 0)
+     return relation_with(expr == 0);
+
+  Linear_Expression next_expr;
+  if (point_val > 0) {
+     next_expr = expr - modulus;
+  }
+  else {
+    expr = - (expr);
+    next_expr = expr - modulus;
+  }
+
+  Poly_Con_Relation relations = relation_with(expr >= 0);
+  assert(!relations.implies(Poly_Con_Relation::saturates())
+	 && !relations.implies(Poly_Con_Relation::is_disjoint()));
+  if (relations.implies(Poly_Con_Relation::strictly_intersects()))
+    return Poly_Con_Relation::strictly_intersects();
+
+  assert(relations == Poly_Con_Relation::is_included());
+  Poly_Con_Relation next_relations = relation_with(next_expr <= 0);
+  assert(!next_relations.implies(Poly_Con_Relation::saturates())
+	 && !next_relations.implies(Poly_Con_Relation::is_disjoint()));
+  if (next_relations.implies(Poly_Con_Relation::strictly_intersects()))
+    return Poly_Con_Relation::strictly_intersects();
+
+  assert(next_relations == Poly_Con_Relation::is_included());
+  return Poly_Con_Relation::is_disjoint();
+}
+
 bool
 PPL::Polyhedron::is_universe() const {
   if (marked_empty())
@@ -428,6 +557,212 @@ PPL::Polyhedron::is_topologically_closed() const {
 }
 
 bool
+PPL::Polyhedron::contains_integer_point() const {
+  // Any empty polyhedron does not contain integer points.
+  if (marked_empty())
+    return false;
+
+  // A zero-dimensional, universe polyhedron has, by convention, an
+  // integer point.
+  if (space_dim == 0)
+    return true;
+
+  // CHECKME: do we really want to call conversion to check for emptiness?
+  if (has_pending_constraints() && !process_pending())
+    // Empty again.
+    return true;
+
+  // FIXME: do also exploit info regarding rays and lines, if possible.
+  // Is any integer point already available?
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+      if (gen_sys[i].is_point() && gen_sys[i].divisor() == 1)
+	return true;
+
+  const Constraint_System& cs = constraints();
+#if 0 // TEMPORARILY DISABLED.
+  MIP_Problem mip(space_dim,
+		  cs.begin(), cs.end(),
+		  Variables_Set(Variable(0), Variable(space_dim-1)));
+#else
+  // FIXME: temporary workaround, to be removed as soon as the MIP
+  // problem class will correctly and precisely handle
+  // ((strict) in-) equality constraints having all integer variables.
+  MIP_Problem mip(space_dim);
+  mip.add_to_integer_space_dimensions(Variables_Set(Variable(0),
+						    Variable(space_dim-1)));
+  TEMP_INTEGER(homogeneous_gcd);
+  TEMP_INTEGER(gcd);
+  DIRTY_TEMP0(mpq_class, rational_inhomogeneous);
+  TEMP_INTEGER(tightened_inhomogeneous);
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+	 cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    const Constraint::Type c_type = c.type();
+    const Coefficient& inhomogeneous = c.inhomogeneous_term();
+    if (c_type == Constraint::STRICT_INEQUALITY) {
+      // CHECKME: should we change the behavior of Linear_Expression(c) ?
+      // Compute the GCD of the coefficients of c
+      // (disregarding the inhomogeneous term and the espilon dimension).
+      homogeneous_gcd = 0;
+      for (dimension_type i = space_dim; i-- > 0; )
+	gcd_assign(homogeneous_gcd,
+		   homogeneous_gcd, c.coefficient(Variable(i)));
+      Linear_Expression le;
+      for (dimension_type i = space_dim; i-- > 0; )
+	le += (c.coefficient(Variable(i)) / homogeneous_gcd) * Variable(i);
+      // Add the integer part of `inhomogeneous'.
+      le += (inhomogeneous / homogeneous_gcd);
+      // Further tighten the constraint if the inhomogeneous term
+      // was integer, i.e., if `homogeneous_gcd' divides `inhomogeneous'.
+      gcd_assign(gcd, homogeneous_gcd, inhomogeneous);
+      if (gcd == homogeneous_gcd)
+	le -= 1;
+      mip.add_constraint(le >= 0);
+    }
+    else {
+      // Equality or non-strict inequality.
+      // If possible, avoid useless gcd computations.
+      if (inhomogeneous == 0)
+	// The inhomogeneous term cannot be tightened.
+	mip.add_constraint(c);
+      else {
+	// Compute the GCD of the coefficients of c
+	// (disregarding the inhomogeneous term)
+	// to see whether or not the inhomogeneous term can be tightened.
+	homogeneous_gcd = 0;
+	for (dimension_type i = space_dim; i-- > 0; )
+	  gcd_assign(homogeneous_gcd,
+		     homogeneous_gcd, c.coefficient(Variable(i)));
+	if (homogeneous_gcd == 1)
+	  // The normalized inhomogeneous term is integer:
+	  // add the constraint as-is.
+	  mip.add_constraint(c);
+	else {
+	  assert(homogeneous_gcd > 1);
+	  // Here the normalized inhomogeneous term is rational:
+	  // the constraint has to be tightened.
+#ifndef NDEBUG
+	  // `homogeneous_gcd' does not divide `inhomogeneous'.
+	  // FIXME: add a divisibility test for Coefficient.
+	  gcd_assign(gcd, homogeneous_gcd, inhomogeneous);
+	  assert(gcd == 1);
+#endif
+	  if (c.type() == Constraint::EQUALITY)
+	    return false;
+	  // Extract the homogeneous part of the constraint.
+	  Linear_Expression le = Linear_Expression(c);
+	  le -= inhomogeneous;
+	  // Tighten the inhomogeneous term.
+	  assign_r(rational_inhomogeneous.get_num(),
+		   inhomogeneous, ROUND_NOT_NEEDED);
+	  assign_r(rational_inhomogeneous.get_den(),
+		   homogeneous_gcd, ROUND_NOT_NEEDED);
+	  // Note: canonicalization is not needed (as gcd == 1).
+	  assert(is_canonical(rational_inhomogeneous));
+	  assign_r(tightened_inhomogeneous,
+		   rational_inhomogeneous, ROUND_DOWN);
+	  tightened_inhomogeneous *= homogeneous_gcd;
+	  le += tightened_inhomogeneous;
+	  mip.add_constraint(le >= 0);
+	}
+      }
+    }
+  }
+#endif // TEMPORARY WORKAROUND.
+  return mip.is_satisfiable();
+}
+
+bool
+PPL::Polyhedron::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // An empty polyhedron constrains all variables.
+  if (marked_empty())
+    return true;
+
+  if (generators_are_up_to_date() && !has_pending_constraints()) {
+    // Since generators are up-to-date and there are no pending
+    // constraints, the generator system (since it is well formed)
+    // contains a point.  Hence the polyhedron is not empty.
+    if (constraints_are_up_to_date() && !has_pending_generators())
+      // Here a variable is constrained if and only if it is
+      // syntactically constrained.
+      goto syntactic_check;
+
+    if (generators_are_minimized()) {
+      // Try a quick, incomplete check for the universe polyhedron:
+      // a universe polyhedron constrains no variable.
+      // Count the number of non-pending
+      // (hence, linearly independent) lines.
+      dimension_type num_lines = 0;
+      const dimension_type first_pending = gen_sys.first_pending_row();
+      for (dimension_type i = first_pending; i-- > 0; )
+	if (gen_sys[i].is_line())
+	  ++num_lines;
+
+      if (num_lines == space_dim)
+	return false;
+    }
+
+    // Scan generators: perhaps we will find a generator equivalent to
+    // line(var) or a pair of generators equivalent to ray(-var) and
+    // ray(var).
+    bool have_positive_ray = false;
+    bool have_negative_ray = false;
+    const dimension_type var_id = var.id();
+    for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+      const Generator& gen_sys_i = gen_sys[i];
+      if (gen_sys_i.is_line_or_ray()) {
+	const Linear_Row& row = gen_sys_i;
+	const int sign = sgn(row.coefficient(var_id));
+	if (sign != 0) {
+	  for (dimension_type j = space_dim+1; --j > 0; )
+	    if (j != var_id && row[j] != 0)
+	      goto next;
+	  if (gen_sys_i.is_line())
+	    return true;
+	  if (sign > 0)
+	    if (have_negative_ray)
+	      return true;
+	    else
+	      have_positive_ray = true;
+	  else if (have_positive_ray)
+	    return true;
+	  else
+	    have_negative_ray = true;
+	}
+      }
+    next:
+      ;
+    }
+
+    // We are still here: at least we know that, since generators are
+    // up-to-date and there are no pending constraints, then the
+    // generator system (since it is well formed) contains a point.
+    // Hence the polyhedron is not empty.
+    if (has_pending_generators())
+      process_pending_generators();
+    else if (!constraints_are_up_to_date())
+      update_constraints();
+    goto syntactic_check;
+  }
+
+  // We must minimize to detect emptiness and obtain constraints.
+  if (!minimize())
+    return true;
+
+ syntactic_check:
+  for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+    if (con_sys[i].coefficient(var) != 0)
+      return true;
+  return false;
+}
+
+bool
 PPL::Polyhedron::OK(bool check_not_empty) const {
 #ifndef NDEBUG
   using std::endl;
@@ -477,7 +812,7 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
 #endif
       goto bomb;
     }
-    if (con_sys.num_rows() == 0)
+    if (con_sys.has_no_rows())
       return true;
     else {
       if (con_sys.space_dimension() != space_dim) {
@@ -521,7 +856,7 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
 #endif
       goto bomb;
     }
-    if (con_sys.num_rows() != 0 || gen_sys.num_rows() != 0) {
+    if (!con_sys.has_no_rows() || !gen_sys.has_no_rows()) {
 #ifndef NDEBUG
       cerr << "Zero-dimensional polyhedron with a non-empty"
 	   << endl
@@ -624,7 +959,7 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
 
     // A non-empty system of generators describing a polyhedron
     // is valid if and only if it contains a point.
-    if (gen_sys.num_rows() > 0 && !gen_sys.has_points()) {
+    if (!gen_sys.has_no_rows() && !gen_sys.has_points()) {
 #ifndef NDEBUG
       cerr << "Non-empty generator system declared up-to-date "
 	   << "has no points!"
@@ -674,7 +1009,7 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
       gs_without_pending.erase_to_end(gen_sys.first_pending_row());
       gs_without_pending.unset_pending_rows();
       Generator_System copy_of_gen_sys = gs_without_pending;
-      Saturation_Matrix new_sat_c;
+      Bit_Matrix new_sat_c;
       minimize(false, copy_of_gen_sys, new_con_sys, new_sat_c);
       const dimension_type copy_num_lines = copy_of_gen_sys.num_lines();
       if (gs_without_pending.num_rows() != copy_of_gen_sys.num_rows()
@@ -780,20 +1115,19 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
     cs_without_pending.erase_to_end(con_sys.first_pending_row());
     cs_without_pending.unset_pending_rows();
     Constraint_System copy_of_con_sys = cs_without_pending;
-    Generator_System new_gen_sys(topology());
-    Saturation_Matrix new_sat_g;
+    bool empty = false;
+    if (check_not_empty || constraints_are_minimized()) {
+      Generator_System new_gen_sys(topology());
+      Bit_Matrix new_sat_g;
+      empty = minimize(true, copy_of_con_sys, new_gen_sys, new_sat_g);
+    }
 
-    if (minimize(true, copy_of_con_sys, new_gen_sys, new_sat_g)) {
-      if (check_not_empty) {
-	// Want to know the satisfiability of the constraints.
+    if (empty && check_not_empty) {
 #ifndef NDEBUG
-	cerr << "Unsatisfiable system of constraints!"
-	     << endl;
+      cerr << "Unsatisfiable system of constraints!"
+	   << endl;
 #endif
-	goto bomb;
-      }
-      // The polyhedron is empty, there is nothing else to check.
-      return true;
+      goto bomb;
     }
 
     if (constraints_are_minimized()) {
@@ -841,7 +1175,7 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
   if (sat_c_is_up_to_date())
     for (dimension_type i = sat_c.num_rows(); i-- > 0; ) {
       const Generator tmp_gen = gen_sys[i];
-      const Saturation_Row tmp_sat = sat_c[i];
+      const Bit_Row tmp_sat = sat_c[i];
       for (dimension_type j = sat_c.num_columns(); j-- > 0; )
 	if (Scalar_Products::sign(con_sys[j], tmp_gen) != tmp_sat[j]) {
 #ifndef NDEBUG
@@ -855,7 +1189,7 @@ PPL::Polyhedron::OK(bool check_not_empty) const {
   if (sat_g_is_up_to_date())
     for (dimension_type i = sat_g.num_rows(); i-- > 0; ) {
       const Constraint tmp_con = con_sys[i];
-      const Saturation_Row tmp_sat = sat_g[i];
+      const Bit_Row tmp_sat = sat_g[i];
       for (dimension_type j = sat_g.num_columns(); j-- > 0; )
 	if (Scalar_Products::sign(tmp_con, gen_sys[j]) != tmp_sat[j]) {
 #ifndef NDEBUG
@@ -909,63 +1243,7 @@ PPL::Polyhedron::add_constraint(const Constraint& c) {
   if (space_dim < c.space_dimension())
     throw_dimension_incompatible("add_constraint(c)", "c", c);
 
-  // Adding a new constraint to an empty polyhedron
-  // results in an empty polyhedron.
-  if (marked_empty())
-    return;
-
-  // Dealing with a zero-dimensional space polyhedron first.
-  if (space_dim == 0) {
-    if (!c.is_tautological())
-      set_empty();
-    return;
-  }
-
-  // The constraints (possibly with pending rows) are required.
-  if (has_pending_generators())
-    process_pending_generators();
-  else if (!constraints_are_up_to_date())
-    update_constraints();
-
-  const bool adding_pending = can_have_something_pending();
-
-  // Here we know that the system of constraints has at least a row.
-  if (c.is_necessarily_closed() || !is_necessarily_closed())
-    // Since `con_sys' is not empty, the topology and space dimension
-    // of the inserted constraint are automatically adjusted.
-    if (adding_pending)
-      con_sys.insert_pending(c);
-    else
-      con_sys.insert(c);
-  else {
-    // Note: here we have a _legal_ topology mismatch, because
-    // `c' is NOT a strict inequality.
-    // However, by barely invoking `con_sys.insert(c)' we would
-    // cause a change in the topology of `con_sys', which is wrong.
-    // Thus, we insert a "topology corrected" copy of `c'.
-    Linear_Expression nc_expr = Linear_Expression(c);
-    if (c.is_equality())
-      if (adding_pending)
-	con_sys.insert_pending(nc_expr == 0);
-      else
-	con_sys.insert(nc_expr == 0);
-    else
-      if (adding_pending)
-	con_sys.insert_pending(nc_expr >= 0);
-      else
-	con_sys.insert(nc_expr >= 0);
-  }
-
-  if (adding_pending)
-    set_constraints_pending();
-  else {
-    // Constraints are not minimized and generators are not up-to-date.
-    clear_constraints_minimized();
-    clear_generators_up_to_date();
-  }
-  // Note: the constraint system may have become unsatisfiable, thus
-  // we do not check for satisfiability.
-  assert(OK());
+  refine_no_check(c);
 }
 
 void
@@ -990,6 +1268,8 @@ PPL::Polyhedron::add_congruence(const Congruence& cg) {
   if (cg.is_equality()) {
     Linear_Expression le(cg);
     Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+    // Enforce normalization.
+    c.strong_normalize();
     add_constraint(c);
   }
 }
@@ -1017,11 +1297,12 @@ PPL::Polyhedron::add_generator(const Generator& g) {
     // It is not possible to create 0-dim rays or lines.
     assert(g.is_point() || g.is_closure_point());
     // Closure points can only be inserted in non-empty polyhedra.
-    if (marked_empty())
+    if (marked_empty()) {
       if (g.type() != Generator::POINT)
 	throw_invalid_generator("add_generator(g)", "g");
       else
 	status.set_zero_dim_univ();
+    }
     assert(OK());
     return;
   }
@@ -1154,7 +1435,7 @@ PPL::Polyhedron::add_recycled_constraints(Constraint_System& cs) {
     throw_dimension_incompatible("add_recycled_constraints(cs)", "cs", cs);
 
   // Adding no constraints is a no-op.
-  if (cs.num_rows() == 0)
+  if (cs.has_no_rows())
     return;
 
   if (space_dim == 0) {
@@ -1243,7 +1524,7 @@ PPL::Polyhedron::add_recycled_constraints_and_minimize(Constraint_System& cs) {
 				 "cs", cs);
 
   // Adding no constraints: just minimize.
-  if (cs.num_rows() == 0)
+  if (cs.has_no_rows())
     return minimize();
 
   // Dealing with zero-dimensional space polyhedra first.
@@ -1314,7 +1595,7 @@ PPL::Polyhedron::add_recycled_generators(Generator_System& gs) {
     throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs);
 
   // Adding no generators is a no-op.
-  if (gs.num_rows() == 0)
+  if (gs.has_no_rows())
     return;
 
   // Adding valid generators to a zero-dimensional polyhedron
@@ -1416,7 +1697,7 @@ PPL::Polyhedron::add_recycled_generators_and_minimize(Generator_System& gs) {
 				 "gs", gs);
 
   // Adding no generators is equivalent to just requiring minimization.
-  if (gs.num_rows() == 0)
+  if (gs.has_no_rows())
     return minimize();
 
   // Adding valid generators to a zero-dimensional polyhedron
@@ -1455,7 +1736,7 @@ PPL::Polyhedron::add_recycled_generators_and_minimize(Generator_System& gs) {
 
   if (minimize()) {
     obtain_sorted_generators_with_sat_g();
-    // This call to `add_and_minimize(...)' cannot return `false'.
+    // This call to `add_and_minimize()' cannot return `false'.
     add_and_minimize(false, gen_sys, con_sys, sat_g, gs);
     clear_sat_c_up_to_date();
   }
@@ -1497,7 +1778,9 @@ PPL::Polyhedron::add_congruences(const Congruence_System& cgs) {
     if (i->is_equality()) {
       Linear_Expression le(*i);
       Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
-      // FIXME: Steal the row in c when adding it to cs.
+      // Enforce normalization.
+      c.strong_normalize();
+      // TODO: Consider stealing the row in c when adding it to cs.
       cs.insert(c);
       inserted = true;
     }
@@ -1508,6 +1791,287 @@ PPL::Polyhedron::add_congruences(const Congruence_System& cgs) {
 }
 
 void
+PPL::Polyhedron::refine_with_constraint(const Constraint& c) {
+  // Dimension-compatibility check:
+  // the dimension of `c' can not be greater than space_dim.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+
+  refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::refine_with_congruence(const Congruence& cg) {
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+  // Adding a new congruence to an empty polyhedron results in an
+  // empty polyhedron.
+  if (marked_empty())
+    return;
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    if (!cg.is_trivial_true())
+      set_empty();
+    return;
+  }
+
+  if (cg.is_equality()) {
+    Linear_Expression le(cg);
+    Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+    // Enforce normalization.
+    c.strong_normalize();
+    add_constraint(c);
+  }
+}
+
+
+void
+PPL::Polyhedron::refine_with_constraints(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+
+  // Dimension-compatibility check:
+  // the dimension of `cs' can not be greater than space_dim.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_dimension_incompatible("refine_with_constraints(cs)a",
+				 "cs", cs);
+
+  // Adding no constraints is a no-op.
+  if (cs.has_no_rows())
+    return;
+
+  if (space_dim == 0) {
+    // In a 0-dimensional space the constraints are
+    // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+    // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+    // In a system of constraints `begin()' and `end()' are equal
+    // if and only if the system only contains tautologies.
+    if (cs.begin() != cs.end())
+      // There is a constraint, it must be inconsistent,
+      // the polyhedron is empty.
+      status.set_empty();
+    return;
+  }
+
+  if (marked_empty())
+    return;
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  const bool adding_pending = can_have_something_pending();
+  for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+    const Constraint& c = cs[i];
+
+    if (c.is_necessarily_closed() || !is_necessarily_closed())
+      // Since `con_sys' is not empty, the topology and space dimension
+      // of the inserted constraint are automatically adjusted.
+      if (adding_pending)
+        con_sys.insert_pending(c);
+      else
+        con_sys.insert(c);
+    else {
+      // Here we know that *this is necessarily closed so even if c is
+      // topologically closed, by barely invoking `con_sys.insert(c)' we
+      // would cause a change in the topology of `con_sys', which is
+      // wrong.  Thus, we insert a topology closed and "topology
+      // corrected" version of `c'.
+      Linear_Expression nc_expr = Linear_Expression(c);
+      if (c.is_equality())
+        if (adding_pending)
+          con_sys.insert_pending(nc_expr == 0);
+        else
+          con_sys.insert(nc_expr == 0);
+      else
+        if (adding_pending)
+          con_sys.insert_pending(nc_expr >= 0);
+        else
+          con_sys.insert(nc_expr >= 0);
+    }
+  }
+
+  if (adding_pending)
+    set_constraints_pending();
+  else {
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check:
+  // the dimension of `cgs' can not be greater than space_dim.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+  Constraint_System cs;
+  bool inserted = false;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    if (i->is_equality()) {
+      Linear_Expression le(*i);
+      Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+      // Enforce normalization.
+      c.strong_normalize();
+      // TODO: Consider stealing the row in c when adding it to cs.
+      cs.insert(c);
+      inserted = true;
+    }
+  // Only add cgs if congruences were inserted into cgs, as the
+  // dimension of cs must be at most that of the polyhedron.
+  if (inserted)
+    add_recycled_constraints(cs);
+}
+
+void
+PPL::Polyhedron::refine_no_check(const Constraint& c) {
+  // Dimension-compatibility check:
+  // the dimension of `c' can not be greater than space_dim.
+  assert(space_dim >= c.space_dimension());
+
+  // Adding a new constraint to an empty polyhedron
+  // results in an empty polyhedron.
+  if (marked_empty())
+    return;
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    if (!c.is_tautological())
+      set_empty();
+    return;
+  }
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  const bool adding_pending = can_have_something_pending();
+
+  if (c.is_necessarily_closed() || !is_necessarily_closed())
+    // Since `con_sys' is not empty, the topology and space dimension
+    // of the inserted constraint are automatically adjusted.
+    if (adding_pending)
+      con_sys.insert_pending(c);
+    else
+      con_sys.insert(c);
+  else {
+    // Here we know that the system of constraints has at least a row.
+    // However, by barely invoking `con_sys.insert(c)' we would
+    // cause a change in the topology of `con_sys', which is wrong.
+    // Thus, we insert a "topology corrected" copy of `c'.
+    Linear_Expression nc_expr = Linear_Expression(c);
+    if (c.is_equality())
+      if (adding_pending)
+        con_sys.insert_pending(nc_expr == 0);
+      else
+        con_sys.insert(nc_expr == 0);
+    else
+      if (adding_pending)
+        con_sys.insert_pending(nc_expr >= 0);
+      else
+        con_sys.insert(nc_expr >= 0);
+  }
+
+  if (adding_pending)
+    set_constraints_pending();
+  else {
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  if (space_dim < var.id())
+    throw_dimension_incompatible("unconstrain(var)", var.id());
+
+  // Do something only if the polyhedron is non-empty.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  assert(generators_are_up_to_date());
+  // Since `gen_sys' is not empty, the topology and space dimension
+  // of the inserted generator are automatically adjusted.
+  if (can_have_something_pending()) {
+    gen_sys.insert_pending(Generator::line(var));
+    set_generators_pending();
+  }
+  else {
+    gen_sys.insert(Generator::line(var));
+    // After adding the new generator,
+    // constraints are no longer up-to-date.
+    clear_generators_minimized();
+    clear_constraints_up_to_date();
+  }
+  assert(OK(true));
+}
+
+void
+PPL::Polyhedron::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a polyhedron in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Do something only if the polyhedron is non-empty.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  assert(generators_are_up_to_date());
+  // Since `gen_sys' is not empty, the topology and space dimension
+  // of the inserted generators are automatically adjusted.
+  Variables_Set::const_iterator tbu = to_be_unconstrained.begin();
+  Variables_Set::const_iterator tbu_end = to_be_unconstrained.end();
+  if (can_have_something_pending()) {
+    for ( ; tbu != tbu_end; ++tbu)
+      gen_sys.insert_pending(Generator::line(Variable(*tbu)));
+    set_generators_pending();
+  }
+  else {
+    for ( ; tbu != tbu_end; ++tbu)
+      gen_sys.insert(Generator::line(Variable(*tbu)));
+    // After adding the new generators,
+    // constraints are no longer up-to-date.
+    clear_generators_minimized();
+    clear_constraints_up_to_date();
+  }
+  assert(OK(true));
+}
+
+void
 PPL::Polyhedron::intersection_assign(const Polyhedron& y) {
   Polyhedron& x = *this;
   // Topology compatibility check.
@@ -1641,6 +2205,445 @@ PPL::Polyhedron::intersection_assign_and_minimize(const Polyhedron& y) {
   return !empty;
 }
 
+namespace {
+
+struct Ruled_Out_Pair {
+  PPL::dimension_type constraint_index;
+  PPL::dimension_type num_ruled_out;
+};
+
+struct Ruled_Out_Less_Than {
+  bool operator()(const Ruled_Out_Pair& x,
+                  const Ruled_Out_Pair& y) const {
+    return x.num_ruled_out > y.num_ruled_out;
+  }
+};
+
+bool
+add_to_system_and_check_independence(PPL::Linear_System& eq_sys,
+                                     const PPL::Linear_Row& eq) {
+  // Check if equality eqn is linear independent from eq_sys.
+  assert(eq.is_line_or_equality());
+  eq_sys.insert(eq);
+  const PPL::dimension_type eq_sys_num_rows = eq_sys.num_rows();
+  const PPL::dimension_type rank = eq_sys.gauss(eq_sys_num_rows);
+  if (rank == eq_sys_num_rows)
+    // eq is linear independent.
+    return true;
+  else {
+    // eq is not linear independent.
+    assert(rank == eq_sys_num_rows - 1);
+    eq_sys.erase_to_end(rank);
+    return false;
+  }
+}
+
+/*
+  Modifies the vector of pointers \p p_ineqs, setting to 0 those entries
+  that point to redundant inequalities or masked equalities.
+  The redundancy test is based on saturation matrix \p sat and
+  on knowing that there exists \p rank nonredundant equalities
+  (they are implicit, i.e., not explicitly listed in \p p_ineqs).
+*/
+void
+drop_redundant_inequalities(std::vector<const PPL::Constraint*>& p_ineqs,
+                            const PPL::Topology topology,
+                            const PPL::Bit_Matrix& sat,
+                            const PPL::dimension_type rank) {
+  using namespace Parma_Polyhedra_Library;
+  const dimension_type num_rows = p_ineqs.size();
+  assert(num_rows > 0);
+  // `rank' is the rank of the (implicit) system of equalities.
+  const dimension_type space_dim = p_ineqs[0]->space_dimension();
+  assert(space_dim > 0 && space_dim >= rank);
+  const dimension_type num_coefficients
+    = space_dim + (topology == NECESSARILY_CLOSED ? 0 : 1);
+  const dimension_type min_sat = num_coefficients - rank;
+  const dimension_type num_cols_sat = sat.num_columns();
+
+  // Perform quick redundancy test based on the number of saturators.
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    if (sat[i].empty())
+      // Masked equalities are redundant.
+      p_ineqs[i] = 0;
+    else {
+      const dimension_type num_sat = num_cols_sat - sat[i].count_ones();
+      if (num_sat < min_sat)
+        p_ineqs[i] = 0;
+    }
+  }
+
+  // Re-examine remaining inequalities.
+  // Iteration index `i' is _intentionally_ increasing.
+  for (dimension_type i = 0; i < num_rows; ++i) {
+    if (p_ineqs[i]) {
+      for (dimension_type j = 0; j < num_rows; ++j) {
+        bool strict_subset;
+        if (p_ineqs[j] && i != j
+            && subset_or_equal(sat[j], sat[i], strict_subset)) {
+          if (strict_subset) {
+            p_ineqs[i] = 0;
+            break;
+          }
+          else
+            // Here `sat[j] == sat[i]'.
+            p_ineqs[j] = 0;
+        }
+      }
+    }
+  }
+}
+
+} // namespace
+
+bool
+PPL::Polyhedron::simplify_using_context_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("simplify_using_context_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("simplify_using_context_assign(y)", "y", y);
+
+  // Filter away the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.is_empty()) {
+      x.status.set_zero_dim_univ();
+      return false;
+    }
+    else
+      return !x.is_empty();
+  }
+
+  // If `y' is empty, the biggest enlargement for `x' is the universe.
+  if (!y.minimize()) {
+    Polyhedron ph(x.topology(), x.space_dim, UNIVERSE);
+    swap(ph);
+    return false;
+  }
+
+  // If `x' is empty, the intersection is empty.
+  if (!x.minimize()) {
+    // Search for a constraint of `y' that is not a tautology.
+    assert(!y.has_pending_generators() && y.constraints_are_up_to_date());
+    for (dimension_type i = y.con_sys.num_rows(); i-- > 0; ) {
+      const Constraint& y_con_sys_i = y.con_sys[i];
+      if (!y_con_sys_i.is_tautological()) {
+        // Found: we obtain a constraint `c' contradicting the one we
+        // found, and assign to `x' the polyhedron `ph' with `c' as
+        // the only constraint.
+        Polyhedron ph(x.topology(), x.space_dim, UNIVERSE);
+        Linear_Expression le(y_con_sys_i);
+        switch (y_con_sys_i.type()) {
+        case Constraint::EQUALITY:
+          ph.add_constraint(le == 1);
+          break;
+        case Constraint::NONSTRICT_INEQUALITY:
+          ph.add_constraint(le <= -1);
+          break;
+        case Constraint::STRICT_INEQUALITY:
+          ph.add_constraint(le == 0);
+          break;
+        }
+        swap(ph);
+        assert(OK());
+	return false;
+      }
+    }
+    // `y' is the universe: `x' cannot be enlarged.
+    return false;
+  }
+
+  assert(x.constraints_are_minimized()
+         && !x.has_something_pending()
+         && y.generators_are_minimized()
+         && !y.has_something_pending());
+  const Constraint_System& x_cs = x.con_sys;
+  const dimension_type x_cs_num_rows = x_cs.num_rows();
+  const Generator_System& y_gs = y.gen_sys;
+
+  // Record into `redundant_by_y' the info about which constraints of
+  // `x' are redundant in the context `y'.  Count the number of
+  // redundancies found.
+  std::vector<bool> redundant_by_y(x_cs_num_rows, false);
+  dimension_type num_redundant_by_y = 0;
+  for (dimension_type i = 0; i < x_cs_num_rows; ++i)
+    if (y_gs.satisfied_by_all_generators(x_cs[i])) {
+      redundant_by_y[i] = true;
+      ++num_redundant_by_y;
+    }
+
+  Constraint_System result_cs;
+
+  if (num_redundant_by_y < x_cs_num_rows) {
+    // Some constraints were not identified as redundant (yet?).
+    const Constraint_System& y_cs = y.con_sys;
+    const dimension_type y_cs_num_rows = y_cs.num_rows();
+    // Compute into `z' the minimized intersection of `x' and `y'.
+    const bool x_first = (x_cs_num_rows > y_cs_num_rows);
+    Polyhedron z(x_first ? x : y);
+    if (x_first)
+      z.add_constraints(y_cs);
+    else {
+      // Only copy (and then recycle) the non-redundant constraints.
+      Constraint_System tmp_cs;
+      for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+        if (!redundant_by_y[i])
+          tmp_cs.insert(x_cs[i]);
+      }
+      z.add_recycled_constraints(tmp_cs);
+    }
+    if (!z.minimize()) {
+      // The objective function is the default, zero.
+      // We do not care about minimization or maximization, since
+      // we are only interested in satisfiability.
+      MIP_Problem lp;
+      if (x.is_necessarily_closed()) {
+        lp.add_space_dimensions_and_embed(x.space_dim);
+        lp.add_constraints(y_cs);
+      }
+      else {
+        // KLUDGE: temporarily mark `y_cs' if it was necessarily
+        // closed, so that we can interpret the epsilon dimension as a
+        // standard dimension. Be careful to reset the topology of `cs'
+        // even on exceptional execution path.
+        const_cast<Constraint_System&>(y_cs).set_necessarily_closed();
+        try {
+          lp.add_space_dimensions_and_embed(x.space_dim+1);
+          lp.add_constraints(y_cs);
+          const_cast<Constraint_System&>(y_cs).set_not_necessarily_closed();
+        }
+        catch (...) {
+          const_cast<Constraint_System&>(y_cs).set_not_necessarily_closed();
+          throw;
+        }
+      }
+      // We apply the following heuristics here: constraints of `x' that
+      // are not made redundant by `y' are added to `lp' depending on
+      // the number of generators of `y' they rule out (the more generators
+      // they rule out, the sooner they are added).  Of course, as soon
+      // as `lp' becomes unsatisfiable, we stopp adding.
+      std::vector<Ruled_Out_Pair>
+        ruled_out_vec(x_cs_num_rows - num_redundant_by_y);
+      for (dimension_type i = 0, j = 0; i < x_cs_num_rows; ++i) {
+        if (!redundant_by_y[i]) {
+          const Constraint& c = x_cs[i];
+          Topology_Adjusted_Scalar_Product_Sign sps(c);
+          dimension_type num_ruled_out_generators = 0;
+          for (Generator_System::const_iterator k = y_gs.begin(),
+                 y_gs_end = y_gs.end(); k != y_gs_end; ++k) {
+            const Generator& g = *k;
+            const int sp_sign = sps(g, c);
+            if (x.is_necessarily_closed()) {
+              if (g.is_line()) {
+                // Lines must saturate the constraint.
+                if (sp_sign != 0)
+                  goto ruled_out;
+              }
+              else {
+                // `g' is either a ray, a point or a closure point.
+                if (c.is_inequality()) {
+                  // `c' is a non-strict inequality.
+                  if (sp_sign < 0)
+                    goto ruled_out;
+                }
+                else
+                  // `c' is an equality.
+                  if (sp_sign != 0)
+                    goto ruled_out;
+              }
+            }
+            else
+              // The topology is not necessarily closed.
+              switch (g.type()) {
+              case Generator::LINE:
+                // Lines must saturate the constraint.
+                if (sp_sign != 0)
+                  goto ruled_out;
+                break;
+              case Generator::POINT:
+                // Have to perform the special test when dealing with
+                // a strict inequality.
+                switch (c.type()) {
+                case Constraint::EQUALITY:
+                  if (sp_sign != 0)
+                    goto ruled_out;
+                  break;
+                case Constraint::NONSTRICT_INEQUALITY:
+                  if (sp_sign < 0)
+                    goto ruled_out;
+                  break;
+                case Constraint::STRICT_INEQUALITY:
+                  if (sp_sign <= 0)
+                    goto ruled_out;
+                  break;
+                }
+                break;
+              case Generator::RAY:
+                // Intentionally fall through.
+              case Generator::CLOSURE_POINT:
+                if (c.is_inequality()) {
+                  // Constraint `c' is either a strict or a non-strict
+                  // inequality.
+                  if (sp_sign < 0)
+                    goto ruled_out;
+                }
+                else
+                  // Constraint `c' is an equality.
+                  if (sp_sign != 0)
+                    goto ruled_out;
+                break;
+              }
+
+            // If we reach this point, `g' satisfies `c'.
+            continue;
+          ruled_out:
+            ++num_ruled_out_generators;
+          }
+          ruled_out_vec[j].constraint_index = i;
+          ruled_out_vec[j].num_ruled_out = num_ruled_out_generators;
+          ++j;
+        }
+      }
+      std::sort(ruled_out_vec.begin(), ruled_out_vec.end(),
+                Ruled_Out_Less_Than());
+
+      for (std::vector<Ruled_Out_Pair>::const_iterator
+             j = ruled_out_vec.begin(), rov_end = ruled_out_vec.end();
+           j != rov_end;
+           ++j) {
+        const Constraint& c = x_cs[j->constraint_index];
+        result_cs.insert(c);
+        lp.add_constraint(c);
+        MIP_Problem_Status status = lp.solve();
+        if (status == UNFEASIBLE_MIP_PROBLEM) {
+          Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE);
+          result_ph.add_constraints(result_cs);
+          x.swap(result_ph);
+          assert(x.OK());
+          return false;
+        }
+      }
+      // Cannot exit from here.
+      assert(false);
+    }
+    else {
+      // Here `z' is not empty and minimized.
+      assert(z.constraints_are_minimized()
+             && z.generators_are_minimized()
+             && !z.has_something_pending());
+      const Constraint_System& z_cs = z.con_sys;
+      const Generator_System& z_gs = z.gen_sys;
+      const dimension_type z_gs_num_rows = z_gs.num_rows();
+
+      // Compute the number of equalities in x_cs, y_cs and z_cs
+      // (exploiting minimal form knowledge).
+      dimension_type x_cs_num_eq = 0;
+      while (x_cs[x_cs_num_eq].is_equality())
+        ++x_cs_num_eq;
+      dimension_type y_cs_num_eq = 0;
+      while (y_cs[y_cs_num_eq].is_equality())
+        ++y_cs_num_eq;
+      dimension_type z_cs_num_eq = 0;
+      while (z_cs[z_cs_num_eq].is_equality())
+        ++z_cs_num_eq;
+      assert(x_cs_num_eq <= z_cs_num_eq && y_cs_num_eq <= z_cs_num_eq);
+
+      // Identify non-redundant equalities.
+      Constraint_System nonred_eq;
+      dimension_type num_nonred_eq = 0;
+      const dimension_type needed_nonred_eq = z_cs_num_eq - y_cs_num_eq;
+      Linear_System eqs(x.topology());
+      if (needed_nonred_eq > 0) {
+        // Populate eqs with the equalities from y.
+        for (dimension_type i = 0; i < y_cs_num_eq; ++i)
+          eqs.insert(y_cs[i]);
+        // Try to find another `needed_nonred_eq' linear independent
+        // equalities among those from x.
+        for (dimension_type i = 0; i < x_cs_num_eq; ++i) {
+          const Constraint& x_cs_i = x_cs[i];
+          if (add_to_system_and_check_independence(eqs, x_cs_i)) {
+            // x_cs_i is linear independent.
+            nonred_eq.insert(x_cs_i);
+            ++num_nonred_eq;
+            if (num_nonred_eq == needed_nonred_eq)
+              // Already found all the needed equalities.
+              break;
+          }
+        }
+        // NOTE: if num_nonred_eq < needed_nonred_eq
+        // then we haven't found all the needed equalities yet:
+        // this means that some inequalities from x actually holds
+        // as "masked" equalities in the context of y.
+        assert(eqs.num_rows() <= z_cs_num_eq);
+        assert(num_nonred_eq <= needed_nonred_eq);
+        assert(z_cs_num_eq - eqs.num_rows()
+               == needed_nonred_eq - num_nonred_eq);
+      }
+
+      // Identify non-redundant inequalities.
+      // Avoid useless copies (no modifications are needed).
+      std::vector<const Constraint*> p_nonred_ineq;
+      // Fill p_nonred_ineq with (pointers to) inequalities from y_cs ...
+      for (dimension_type i = y_cs_num_eq; i < y_cs_num_rows; ++i)
+        p_nonred_ineq.push_back(&y_cs[i]);
+      // ... and (pointers to) non-redundant inequalities from x_cs.
+      for (dimension_type i = x_cs_num_eq; i < x_cs_num_rows; ++i)
+        if (!redundant_by_y[i])
+          p_nonred_ineq.push_back(&x_cs[i]);
+
+      const dimension_type p_nonred_ineq_size = p_nonred_ineq.size();
+      const dimension_type y_cs_num_ineq = y_cs_num_rows - y_cs_num_eq;
+
+      // Compute saturation info.
+      const dimension_type sat_num_rows = p_nonred_ineq_size;
+      Bit_Matrix sat(sat_num_rows, z_gs_num_rows);
+      for (dimension_type i = sat_num_rows; i-- > 0; ) {
+        const Constraint& nonred_ineq_i = *(p_nonred_ineq[i]);
+        Bit_Row& sat_i = sat[i];
+        for (dimension_type j = z_gs_num_rows; j-- > 0; )
+          if (Scalar_Products::sign(nonred_ineq_i, z_gs[j]))
+            sat_i.set(j);
+        if (sat_i.empty() && num_nonred_eq < needed_nonred_eq) {
+          // `nonred_ineq_i' is actually masking an equality
+          // and we are still looking for some masked inequalities.
+          // Iteration goes downwards, so the inequality comes from x_cs.
+          assert(i >= y_cs_num_ineq);
+          // Check if the equality is independent in eqs.
+          Linear_Row masked_eq = Linear_Row(nonred_ineq_i);
+          masked_eq.set_is_line_or_equality();
+          masked_eq.sign_normalize();
+          if (add_to_system_and_check_independence(eqs, masked_eq)) {
+            // It is independent: add the _inequality_ to nonred_eq.
+            nonred_eq.insert(nonred_ineq_i);
+            ++num_nonred_eq;
+          }
+        }
+      }
+      // Here we have already found all the needed (masked) equalities.
+      assert(num_nonred_eq == needed_nonred_eq);
+
+      drop_redundant_inequalities(p_nonred_ineq, x.topology(),
+                                  sat, z_cs_num_eq);
+
+      // Place the nonredundant (masked) equalities into result_cs.
+      result_cs.swap(nonred_eq);
+      // Add to result_cs the nonredundant inequalities from x_cs,
+      // i.e., those having indices no smaller than y_cs_num_ineq.
+      for (dimension_type i = y_cs_num_ineq; i < p_nonred_ineq_size; ++i)
+        if (p_nonred_ineq[i])
+          result_cs.insert(*p_nonred_ineq[i]);
+    }
+  }
+
+  Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE);
+  result_ph.add_constraints(result_cs);
+  x.swap(result_ph);
+  assert(x.OK());
+  return true;
+}
+
 void
 PPL::Polyhedron::poly_hull_assign(const Polyhedron& y) {
   Polyhedron& x = *this;
@@ -1804,12 +2807,13 @@ PPL::Polyhedron::poly_difference_assign(const Polyhedron& y) {
     return;
   }
 
-  Polyhedron new_polyhedron(topology(), x.space_dim, EMPTY);
-
   // Being lazy here is only harmful.
   // `minimize()' will process any pending constraints or generators.
+  if (!y.minimize())
+    return;
   x.minimize();
-  y.minimize();
+
+  Polyhedron new_polyhedron(topology(), x.space_dim, EMPTY);
 
   const Constraint_System& y_cs = y.constraints();
   for (Constraint_System::const_iterator i = y_cs.begin(),
@@ -2048,7 +3052,7 @@ bounded_affine_image(const Variable var,
   if (lb_expr.coefficient(var) == 0) {
     // Here `var' may only occur in `ub_expr'.
     generalized_affine_image(var,
-			     LESS_THAN_OR_EQUAL,
+			     LESS_OR_EQUAL,
 			     ub_expr,
 			     denominator);
     if (denominator > 0)
@@ -2059,7 +3063,7 @@ bounded_affine_image(const Variable var,
   else if (ub_expr.coefficient(var) == 0) {
     // Here `var' only occurs in `lb_expr'.
     generalized_affine_image(var,
-			     GREATER_THAN_OR_EQUAL,
+			     GREATER_OR_EQUAL,
 			     lb_expr,
 			     denominator);
     if (denominator > 0)
@@ -2073,19 +3077,14 @@ bounded_affine_image(const Variable var,
     const Variable new_var = Variable(space_dim);
     add_space_dimensions_and_embed(1);
     // Constrain the new dimension to be equal to `ub_expr'.
-    // (we force minimization because we will need the generators).
-    add_constraint_and_minimize(denominator*new_var == ub_expr);
+    add_constraint(denominator*new_var == ub_expr);
     // Apply the affine lower bound.
     generalized_affine_image(var,
-			     GREATER_THAN_OR_EQUAL,
+			     GREATER_OR_EQUAL,
 			     lb_expr,
 			     denominator);
-    // Now apply the affine upper bound, as recorded in `new_var'
-    // (we force minimization because we will need the generators).
-    if (denominator > 0)
-      add_constraint_and_minimize(var <= new_var);
-    else
-      add_constraint_and_minimize(new_var <= var);
+    // Now apply the affine upper bound, as recorded in `new_var'.
+    add_constraint(new_var >= var);
     // Remove the temporarily added dimension.
     remove_higher_space_dimensions(space_dim-1);
   }
@@ -2133,11 +3132,7 @@ bounded_affine_preimage(const Variable var,
       add_constraint(ub_expr <= denominator*var);
       add_constraint(denominator*var <= lb_expr);
     }
-    // Any image of an empty polyhedron is empty.
-    // Note: DO check for emptyness here, as we will later add a line.
-    if (is_empty())
-      return;
-    add_generator(line(var));
+    unconstrain(var);
   }
   else {
     // Here `var' occurs in `lb_expr' or `ub_expr'.
@@ -2196,6 +3191,10 @@ generalized_affine_image(const Variable var,
       && (relsym == LESS_THAN || relsym == GREATER_THAN))
     throw_invalid_argument("generalized_affine_image(v, r, e, d)",
 			   "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+			   "r is the disequality relation symbol");
 
   // First compute the affine image.
   affine_image(var, expr, denominator);
@@ -2205,15 +3204,15 @@ generalized_affine_image(const Variable var,
     return;
 
   // Any image of an empty polyhedron is empty.
-  // Note: DO check for emptyness here, as we will later add a ray.
+  // Note: DO check for emptiness here, as we will later add a ray.
   if (is_empty())
     return;
 
   switch (relsym) {
-  case LESS_THAN_OR_EQUAL:
+  case LESS_OR_EQUAL:
     add_generator(ray(-var));
     break;
-  case GREATER_THAN_OR_EQUAL:
+  case GREATER_OR_EQUAL:
     add_generator(ray(var));
     break;
   case LESS_THAN:
@@ -2224,7 +3223,8 @@ generalized_affine_image(const Variable var,
       assert(!is_necessarily_closed());
       // While adding the ray, we minimize the generators
       // in order to avoid adding too many redundant generators later.
-      add_generator_and_minimize(ray(relsym == GREATER_THAN ? var : -var));
+      add_generator(ray(relsym == GREATER_THAN ? var : -var));
+      minimize();
       // We split each point of the generator system into two generators:
       // a closure point, having the same coordinates of the given point,
       // and another point, having the same coordinates for all but the
@@ -2250,8 +3250,8 @@ generalized_affine_image(const Variable var,
       clear_sat_g_up_to_date();
     }
     break;
-  case EQUAL:
-    // This case was already dealt with before.
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
     throw std::runtime_error("PPL internal error");
   }
   assert(OK());
@@ -2285,6 +3285,10 @@ generalized_affine_preimage(const Variable var,
       && (relsym == LESS_THAN || relsym == GREATER_THAN))
     throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
 			   "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+			   "r is the disequality relation symbol");
 
   // Check whether the affine relation is indeed an affine function.
   if (relsym == EQUAL) {
@@ -2298,19 +3302,18 @@ generalized_affine_preimage(const Variable var,
   case LESS_THAN:
     reversed_relsym = GREATER_THAN;
     break;
-  case LESS_THAN_OR_EQUAL:
-    reversed_relsym = GREATER_THAN_OR_EQUAL;
+  case LESS_OR_EQUAL:
+    reversed_relsym = GREATER_OR_EQUAL;
     break;
-  case GREATER_THAN_OR_EQUAL:
-    reversed_relsym = LESS_THAN_OR_EQUAL;
+  case GREATER_OR_EQUAL:
+    reversed_relsym = LESS_OR_EQUAL;
     break;
   case GREATER_THAN:
     reversed_relsym = LESS_THAN;
     break;
   default:
-    // The EQUAL case has been already dealt with.
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
     throw std::runtime_error("PPL internal error");
-    break;
   }
 
   // Check whether the preimage of this affine relation can be easily
@@ -2319,7 +3322,8 @@ generalized_affine_preimage(const Variable var,
   if (var_coefficient != 0) {
     Linear_Expression inverse_expr
       = expr - (denominator + var_coefficient) * var;
-    Coefficient inverse_denominator = - var_coefficient;
+    TEMP_INTEGER(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
     Relation_Symbol inverse_relsym
       = (sgn(denominator) == sgn(inverse_denominator))
       ? relsym : reversed_relsym;
@@ -2338,25 +3342,20 @@ generalized_affine_preimage(const Variable var,
   case LESS_THAN:
     add_constraint(denominator*var < expr);
     break;
-  case LESS_THAN_OR_EQUAL:
+  case LESS_OR_EQUAL:
     add_constraint(denominator*var <= expr);
     break;
-  case GREATER_THAN_OR_EQUAL:
+  case GREATER_OR_EQUAL:
     add_constraint(denominator*var >= expr);
     break;
   case GREATER_THAN:
     add_constraint(denominator*var > expr);
     break;
-  case EQUAL:
-    // We already dealt with this case.
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
     throw std::runtime_error("PPL internal error");
-    break;
   }
-  // If the shrunk polyhedron is empty, its preimage is empty too.
-  // Note: DO check for emptyness here, as we will later add a line.
-  if (is_empty())
-    return;
-  add_generator(line(var));
+  unconstrain(var);
   assert(OK());
 }
 
@@ -2383,6 +3382,10 @@ PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
       && (relsym == LESS_THAN || relsym == GREATER_THAN))
     throw_invalid_argument("generalized_affine_image(e1, r, e2)",
 			   "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+			   "r is the disequality relation symbol");
 
   // Any image of an empty polyhedron is empty.
   if (marked_empty())
@@ -2400,18 +3403,21 @@ PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
     case LESS_THAN:
       add_constraint(lhs < rhs);
       break;
-    case LESS_THAN_OR_EQUAL:
+    case LESS_OR_EQUAL:
       add_constraint(lhs <= rhs);
       break;
     case EQUAL:
       add_constraint(lhs == rhs);
       break;
-    case GREATER_THAN_OR_EQUAL:
+    case GREATER_OR_EQUAL:
       add_constraint(lhs >= rhs);
       break;
     case GREATER_THAN:
       add_constraint(lhs > rhs);
       break;
+    case NOT_EQUAL:
+      // The NOT_EQUAL case has been already dealt with.
+      throw std::runtime_error("PPL internal error");
     }
     return;
   }
@@ -2437,30 +3443,33 @@ PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
 
     // Constrain the new dimension to be equal to the right hand side.
     // (check for emptiness because we will add lines).
-    if (add_constraint_and_minimize(new_var == rhs)) {
-      // Cylindrificate on all the variables occurring in the left hand side
-      // (we force minimization because we will need the constraints).
-      add_recycled_generators_and_minimize(new_lines);
+    add_constraint(new_var == rhs);
+    if (!is_empty()) {
+      // Existentially quantify the variables in the left hand side.
+      add_recycled_generators(new_lines);
 
       // Constrain the new dimension so that it is related to
       // the left hand side as dictated by `relsym'
       // (we force minimization because we will need the generators).
       switch (relsym) {
       case LESS_THAN:
-	add_constraint_and_minimize(lhs < new_var);
+	add_constraint(lhs < new_var);
 	break;
-      case LESS_THAN_OR_EQUAL:
-	add_constraint_and_minimize(lhs <= new_var);
+      case LESS_OR_EQUAL:
+	add_constraint(lhs <= new_var);
 	break;
       case EQUAL:
-	add_constraint_and_minimize(lhs == new_var);
+	add_constraint(lhs == new_var);
 	break;
-      case GREATER_THAN_OR_EQUAL:
-	add_constraint_and_minimize(lhs >= new_var);
+      case GREATER_OR_EQUAL:
+	add_constraint(lhs >= new_var);
 	break;
       case GREATER_THAN:
-	add_constraint_and_minimize(lhs > new_var);
+	add_constraint(lhs > new_var);
 	break;
+      case NOT_EQUAL:
+	// The NOT_EQUAL case has been already dealt with.
+	throw std::runtime_error("PPL internal error");
       }
     }
     // Remove the temporarily added dimension.
@@ -2471,13 +3480,12 @@ PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
     // there is no need to add a further dimension.
 
     // Any image of an empty polyhedron is empty.
-    // Note: DO check for emptyness here, as we will add lines.
+    // Note: DO check for emptiness here, as we will add lines.
     if (is_empty())
       return;
 
-    // Cylindrificate on all the variables occurring in the left hand side
-    // (we force minimization because we will need the constraints).
-    add_recycled_generators_and_minimize(new_lines);
+    // Existentially quantify the variables in the left hand side.
+    add_recycled_generators(new_lines);
 
     // Constrain the left hand side expression so that it is related to
     // the right hand side expression as dictated by `relsym'.
@@ -2485,18 +3493,21 @@ PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
     case LESS_THAN:
       add_constraint(lhs < rhs);
       break;
-    case LESS_THAN_OR_EQUAL:
+    case LESS_OR_EQUAL:
       add_constraint(lhs <= rhs);
       break;
     case EQUAL:
       add_constraint(lhs == rhs);
       break;
-    case GREATER_THAN_OR_EQUAL:
+    case GREATER_OR_EQUAL:
       add_constraint(lhs >= rhs);
       break;
     case GREATER_THAN:
       add_constraint(lhs > rhs);
       break;
+    case NOT_EQUAL:
+      // The NOT_EQUAL case has been already dealt with.
+      throw std::runtime_error("PPL internal error");
     }
   }
   assert(OK());
@@ -2525,6 +3536,10 @@ PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs,
       && (relsym == LESS_THAN || relsym == GREATER_THAN))
     throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
 			   "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+			   "r is the disequality relation symbol");
 
   // Any preimage of an empty polyhedron is empty.
   if (marked_empty())
@@ -2564,30 +3579,32 @@ PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs,
 
     // Constrain the new dimension to be equal to `lhs'
     // (also check for emptiness because we have to add lines).
-    if (add_constraint_and_minimize(new_var == lhs)) {
-      // Cylindrificate on all the variables occurring in the left hand side
-      // (we force minimization because we will need the constraints).
-      add_recycled_generators_and_minimize(new_lines);
+    add_constraint(new_var == lhs);
+    if (!is_empty()) {
+      // Existentially quantify the variables in the left hand side.
+      add_recycled_generators(new_lines);
 
       // Constrain the new dimension so that it is related to
-      // the right hand side as dictated by `relsym'
-      // (we force minimization because we will need the generators).
+      // the right hand side as dictated by `relsym'.
       switch (relsym) {
       case LESS_THAN:
-	add_constraint_and_minimize(new_var < rhs);
+	add_constraint(new_var < rhs);
 	break;
-      case LESS_THAN_OR_EQUAL:
-	add_constraint_and_minimize(new_var <= rhs);
+      case LESS_OR_EQUAL:
+	add_constraint(new_var <= rhs);
 	break;
       case EQUAL:
-	add_constraint_and_minimize(new_var == rhs);
+	add_constraint(new_var == rhs);
 	break;
-      case GREATER_THAN_OR_EQUAL:
-	add_constraint_and_minimize(new_var >= rhs);
+      case GREATER_OR_EQUAL:
+	add_constraint(new_var >= rhs);
 	break;
       case GREATER_THAN:
-	add_constraint_and_minimize(new_var > rhs);
+	add_constraint(new_var > rhs);
 	break;
+      case NOT_EQUAL:
+	// The NOT_EQUAL case has been already dealt with.
+	throw std::runtime_error("PPL internal error");
       }
     }
     // Remove the temporarily added dimension.
@@ -2603,24 +3620,27 @@ PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs,
     case LESS_THAN:
       add_constraint(lhs < rhs);
       break;
-    case LESS_THAN_OR_EQUAL:
+    case LESS_OR_EQUAL:
       add_constraint(lhs <= rhs);
       break;
     case EQUAL:
       add_constraint(lhs == rhs);
       break;
-    case GREATER_THAN_OR_EQUAL:
+    case GREATER_OR_EQUAL:
       add_constraint(lhs >= rhs);
       break;
     case GREATER_THAN:
       add_constraint(lhs > rhs);
       break;
+    case NOT_EQUAL:
+      // The NOT_EQUAL case has been already dealt with.
+      throw std::runtime_error("PPL internal error");
     }
     // Any image of an empty polyhedron is empty.
-    // Note: DO check for emptyness here, as we will add lines.
+    // Note: DO check for emptiness here, as we will add lines.
     if (is_empty())
       return;
-    // Cylindrificate on all the variables occurring in `lhs'.
+    // Existentially quantify all the variables occurring in `lhs'.
     add_recycled_generators(new_lines);
   }
   assert(OK());
@@ -2870,7 +3890,7 @@ PPL::Polyhedron::contains(const Polyhedron& y) const {
 bool
 PPL::Polyhedron::is_disjoint_from(const Polyhedron& y) const {
   Polyhedron z = *this;
-  z.intersection_assign_and_minimize(y);
+  z.intersection_assign(y);
   return z.is_empty();
 }
 
@@ -2895,7 +3915,7 @@ PPL::Polyhedron::ascii_dump(std::ostream& s) const {
   s << "\n";
 }
 
-PPL_OUTPUT_DEFINITIONS(Polyhedron);
+PPL_OUTPUT_DEFINITIONS(Polyhedron)
 
 bool
 PPL::Polyhedron::ascii_load(std::istream& s) {
@@ -2940,7 +3960,7 @@ PPL::Polyhedron::ascii_load(std::istream& s) {
   if (!sat_g.ascii_load(s))
     return false;
 
-  // Check for well-formedness.
+  // Check invariants.
   assert(OK());
   return true;
 }
diff --git a/src/Polyhedron_widenings.cc b/src/Polyhedron_widenings.cc
index 49bf651..188a8f2 100644
--- a/src/Polyhedron_widenings.cc
+++ b/src/Polyhedron_widenings.cc
@@ -1,12 +1,12 @@
 /* Polyhedron class implementation
    (non-inline widening-related member functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,12 +21,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Polyhedron.defs.hh"
-
 #include "BHRZ03_Certificate.defs.hh"
-#include "Bounding_Box.defs.hh"
+#include "Rational_Box.hh"
 #include "Scalar_Products.defs.hh"
 #include <cassert>
 #include <iostream>
@@ -81,10 +80,18 @@ PPL::Polyhedron
 	 && y.constraints_are_minimized()
 	 && y.generators_are_up_to_date());
 
+  // FIXME: this is a workaround for NNC polyhedra.
+  if (!y.is_necessarily_closed()) {
+    // Force strong minimization of constraints.
+    y.strongly_minimize_constraints();
+    // Recompute generators (without compromising constraint minimization).
+    y.update_generators();
+  }
+
   // Obtain a sorted copy of `y.sat_g'.
   if (!y.sat_g_is_up_to_date())
     y.update_sat_g();
-  Saturation_Matrix tmp_sat_g = y.sat_g;
+  Bit_Matrix tmp_sat_g = y.sat_g;
   // Remove from `tmp_sat_g' the rows corresponding to tautologies
   // (i.e., the positivity or epsilon-bounding constraints):
   // this is needed in order to widen the polyhedron and not the
@@ -107,7 +114,7 @@ PPL::Polyhedron
   // (built starting from the given constraint and `y.gen_sys')
   // is a row of the saturation matrix `tmp_sat_g'.
 
-  // CHECK ME: the following comment is only applicable when `y.gen_sys'
+  // CHECKME: the following comment is only applicable when `y.gen_sys'
   // is minimized. In that case, the comment suggests that it would be
   // possible to use a fast (but incomplete) redundancy test based on
   // the number of saturators in `buffer'.
@@ -116,8 +123,8 @@ PPL::Polyhedron
   // it will not appear in the resulting constraint system,
   // because `tmp_sat_g' is built starting from a minimized polyhedron.
 
-  // The size of `buffer' will reach sat.num_columns() bit.
-  Saturation_Row buffer;
+  // The size of `buffer' will reach sat.num_columns() bits.
+  Bit_Row buffer;
   // Note: the loop index `i' goes upward to avoid reversing
   // the ordering of the chosen constraints.
   for (dimension_type i = 0, end = con_sys.num_rows(); i < end; ++i) {
@@ -129,7 +136,10 @@ PPL::Polyhedron
     for (dimension_type j = y.gen_sys.num_rows(); j-- > 0; ) {
       const int sp_sgn = Scalar_Products::sign(ci, y.gen_sys[j]);
       // We are assuming that `y <= x'.
-      assert(sp_sgn >= 0);
+      assert(sp_sgn >= 0
+	     || (!is_necessarily_closed()
+		 && ci.is_strict_inequality()
+		 && y.gen_sys[j].is_point()));
       if (sp_sgn > 0)
 	buffer.set(j);
     }
@@ -146,8 +156,8 @@ void
 PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
   Polyhedron& x = *this;
   // Topology compatibility check.
-  const Topology tpl = x.topology();
-  if (tpl != y.topology())
+  const Topology topol = x.topology();
+  if (topol != y.topology())
     throw_topology_incompatible("H79_widening_assign(y)", "y", y);
   // Dimension-compatibility check.
   if (x.space_dim != y.space_dim)
@@ -183,17 +193,18 @@ PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
     // to also hold for the corresponding eps-representations:
     // this is obtained by intersecting the two eps-representations.
     Polyhedron& yy = const_cast<Polyhedron&>(y);
-    if (!yy.intersection_assign_and_minimize(x))
-      // `y' is empty: the result is `x'.
+    yy.intersection_assign(x);
+    if (yy.is_empty())
+      // The result is `x'.
       return;
   }
 
   // If we only have the generators of `x' and the dimensions of
   // the two polyhedra are the same, we can compute the standard
-  // widening by using the specification in CousotH78, therefore
+  // widening by using the specification in [CousotH78], therefore
   // avoiding converting from generators to constraints.
   if (x.has_pending_generators() || !x.constraints_are_up_to_date()) {
-    Constraint_System CH78_cs(tpl);
+    Constraint_System CH78_cs(topol);
     x.select_CH78_constraints(y, CH78_cs);
 
     if (CH78_cs.num_rows() == y.con_sys.num_rows()) {
@@ -206,7 +217,7 @@ PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
     // constraints, since it is a subset of the former.
     else if (CH78_cs.num_equalities() == y.con_sys.num_equalities()) {
       // Let `x' be defined by the constraints in `CH78_cs'.
-      Polyhedron CH78(tpl, x.space_dim, UNIVERSE);
+      Polyhedron CH78(topol, x.space_dim, UNIVERSE);
       CH78.add_recycled_constraints(CH78_cs);
 
       // Check whether we are using the widening-with-tokens technique
@@ -241,11 +252,11 @@ PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
 
   // Copy into `H79_cs' the constraints of `x' that are common to `y',
   // according to the definition of the H79 widening.
-  Constraint_System H79_cs(tpl);
-  Constraint_System x_minus_H79_cs(tpl);
+  Constraint_System H79_cs(topol);
+  Constraint_System x_minus_H79_cs(topol);
   x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
 
-  if (x_minus_H79_cs.num_rows() == 0)
+  if (x_minus_H79_cs.has_no_rows())
     // We selected all of the constraints of `x',
     // thus the result of the widening is `x'.
     return;
@@ -254,7 +265,7 @@ PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
     // NOTE: as `x.con_sys' was not necessarily in minimal form,
     // this does not imply that the result strictly includes `x'.
     // Let `H79' be defined by the constraints in `H79_cs'.
-    Polyhedron H79(tpl, x.space_dim, UNIVERSE);
+    Polyhedron H79(topol, x.space_dim, UNIVERSE);
     H79.add_recycled_constraints(H79_cs);
 
     // Check whether we are using the widening-with-tokens technique
@@ -360,11 +371,8 @@ void
 PPL::Polyhedron::bounded_H79_extrapolation_assign(const Polyhedron& y,
 						  const Constraint_System& cs,
 						  unsigned* tp) {
-  const dimension_type space_dim = space_dimension();
-  Bounding_Box x_box(space_dim);
-  Bounding_Box y_box(space_dim);
-  shrink_bounding_box(x_box, ANY_COMPLEXITY);
-  y.shrink_bounding_box(y_box, ANY_COMPLEXITY);
+  Rational_Box x_box(*this, ANY_COMPLEXITY);
+  Rational_Box y_box(y, ANY_COMPLEXITY);
   x_box.CC76_widening_assign(y_box);
   limited_H79_extrapolation_assign(y, cs, tp);
   // TODO: see if some copies can be avoided.
@@ -404,9 +412,9 @@ PPL::Polyhedron
   if (x_minus_H79_cs_num_rows <= 1)
     return false;
 
-  const Topology tpl = x.topology();
-  Constraint_System combining_cs(tpl);
-  Constraint_System new_cs(tpl);
+  const Topology topol = x.topology();
+  Constraint_System combining_cs(topol);
+  Constraint_System new_cs(topol);
 
   // Consider the points that belong to both `x.gen_sys' and `y.gen_sys'.
   // For NNC polyhedra, the role of points is played by closure points.
@@ -452,11 +460,12 @@ PPL::Polyhedron
 	    e += Linear_Expression(combining_cs[h]);
 	  }
 
-	  if (!e.all_homogeneous_terms_are_zero())
+	  if (!e.all_homogeneous_terms_are_zero()) {
 	    if (strict_inequality)
 	      new_cs.insert(e > 0);
 	    else
 	      new_cs.insert(e >= 0);
+	  }
 	}
       }
     }
@@ -477,7 +486,9 @@ PPL::Polyhedron
   // The resulting polyhedron is obtained by adding the constraints
   // in `new_cs' to polyhedron `H79'.
   Polyhedron result = H79;
-  result.add_recycled_constraints_and_minimize(new_cs);
+  result.add_recycled_constraints(new_cs);
+  // Force minimization.
+  result.minimize();
 
   // Check for stabilization with respect to `y_cert' and improvement
   // over `H79'.
@@ -544,8 +555,10 @@ PPL::Polyhedron::BHRZ03_evolving_points(const Polyhedron& y,
 
   // Be non-intrusive.
   Polyhedron result = x;
-  result.add_recycled_generators_and_minimize(candidate_rays);
-  result.intersection_assign_and_minimize(H79);
+  result.add_recycled_generators(candidate_rays);
+  result.intersection_assign(H79);
+  // Force minimization.
+  result.minimize();
 
   // Check for stabilization with respect to `y_cert' and improvement
   // over `H79'.
@@ -627,15 +640,15 @@ PPL::Polyhedron::BHRZ03_evolving_rays(const Polyhedron& y,
   }
 
   // If there are no candidate rays, we cannot obtain stabilization.
-  if (candidate_rays.num_rows() == 0)
+  if (candidate_rays.has_no_rows())
     return false;
 
   // Be non-intrusive.
   Polyhedron result = x;
-  // Add to `result' the rays in `candidate_rays'
-  result.add_recycled_generators_and_minimize(candidate_rays);
-  // Intersect with `H79'.
-  result.intersection_assign_and_minimize(H79);
+  result.add_recycled_generators(candidate_rays);
+  result.intersection_assign(H79);
+  // Force minimization.
+  result.minimize();
 
   // Check for stabilization with respect to `y' and improvement over `H79'.
   if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
@@ -673,29 +686,13 @@ PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) {
   if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
     return;
 
+  // `y.con_sys' and `y.gen_sys' should be in minimal form.
+  if (!y.minimize())
+    // `y' is empty: the result is `x'.
+    return;
   // `x.con_sys' and `x.gen_sys' should be in minimal form.
   x.minimize();
 
-  // `y.con_sys' and `y.gen_sys' should be in minimal form.
-  if (y.is_necessarily_closed()) {
-    if (!y.minimize())
-      // `y' is empty: the result is `x'.
-      return;
-  }
-  else {
-    // Dealing with a NNC polyhedron.
-    // To obtain a correct reasoning when comparing
-    // the constraints of `x' with the generators of `y',
-    // we enforce the inclusion relation holding between
-    // the two NNC polyhedra `x' and `y' (i.e., `y <= x')
-    // to also hold for the corresponding eps-representations:
-    // this is obtained by intersecting the two eps-representations.
-    Polyhedron& yy = const_cast<Polyhedron&>(y);
-    if (!yy.intersection_assign_and_minimize(x))
-      // `y' is empty: the result is `x'.
-      return;
-  }
-
   // Compute certificate info for polyhedron `y'.
   BHRZ03_Certificate y_cert(y);
 
@@ -719,18 +716,20 @@ PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) {
   // Copy into `H79_cs' the constraints that are common to `x' and `y',
   // according to the definition of the H79 widening.
   // The other ones are copied into `x_minus_H79_cs'.
-  const Topology tpl = x.topology();
-  Constraint_System H79_cs(tpl);
-  Constraint_System x_minus_H79_cs(tpl);
+  const Topology topol = x.topology();
+  Constraint_System H79_cs(topol);
+  Constraint_System x_minus_H79_cs(topol);
   x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
 
   // We cannot have selected all of the rows, since otherwise
   // the iteration should have been immediately stabilizing.
-  assert(x_minus_H79_cs.num_rows() > 0);
+  assert(!x_minus_H79_cs.has_no_rows());
   // Be careful to obtain the right space dimension
   // (because `H79_cs' may be empty).
-  Polyhedron H79(tpl, x.space_dim, UNIVERSE);
-  H79.add_recycled_constraints_and_minimize(H79_cs);
+  Polyhedron H79(topol, x.space_dim, UNIVERSE);
+  H79.add_recycled_constraints(H79_cs);
+  // Force minimization.
+  H79.minimize();
 
   // NOTE: none of the following widening heuristics is intrusive:
   // they will modify `x' only when returning successfully.
@@ -755,7 +754,6 @@ PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) {
 
 #ifndef NDEBUG
   // The H79 widening is always stabilizing.
-  x.minimize();
   assert(y_cert.is_stabilizing(x));
 #endif
 }
@@ -849,11 +847,8 @@ PPL::Polyhedron
 ::bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
 				      const Constraint_System& cs,
 				      unsigned* tp) {
-  const dimension_type space_dim = space_dimension();
-  Bounding_Box x_box(space_dim);
-  Bounding_Box y_box(space_dim);
-  shrink_bounding_box(x_box, ANY_COMPLEXITY);
-  y.shrink_bounding_box(y_box, ANY_COMPLEXITY);
+  Rational_Box x_box(*this, ANY_COMPLEXITY);
+  Rational_Box y_box(y, ANY_COMPLEXITY);
   x_box.CC76_widening_assign(y_box);
   limited_BHRZ03_extrapolation_assign(y, cs, tp);
   // TODO: see if some copies can be avoided.
diff --git a/src/Powerset.defs.hh b/src/Powerset.defs.hh
index 6600a99..43520f9 100644
--- a/src/Powerset.defs.hh
+++ b/src/Powerset.defs.hh
@@ -1,11 +1,11 @@
 /* Powerset class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,6 +24,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_Powerset_defs_hh
 
 #include "Powerset.types.hh"
+#include "iterator_to_const.defs.hh"
 #include <iosfwd>
 #include <iterator>
 #include <list>
@@ -67,7 +68,7 @@ operator<<(std::ostream& s, const Powerset<D>& x);
   that the disjuncts cannot be overwritten. Rather, by using the class
   <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
   (possibly so as to later add back modified versions).  As an example
-  of iterator usage, the following templatic function drops from
+  of iterator usage, the following template function drops from
   powerset \p ps all the disjuncts that would have become redundant by
   the addition of an external element \p d.
 
@@ -166,7 +167,7 @@ public:
 
   //@} // Constructors and Destructor
 
-  //! \name Member Functions that Do Not Modify the Powerset Element
+  //! \name Member Functions that Do Not Modify the Powerset Object
   //@{
 
   /*! \brief
@@ -207,7 +208,7 @@ public:
   // FIXME: document and perhaps use an enum instead of a bool.
   bool OK(bool disallow_bottom = false) const;
 
-  //@} // Member Functions that Do Not Modify the Powerset Element
+  //@} // Member Functions that Do Not Modify the Powerset Object
 
 protected:
   //! A powerset is implemented as a sequence of elements.
@@ -234,9 +235,6 @@ public:
   typedef typename Sequence::size_type size_type;
   typedef typename Sequence::value_type value_type;
 
-  class omega_iterator;
-  class omega_const_iterator;
-
   /*! \brief
     Alias for a <EM>read-only</EM> bidirectional %iterator on the
     disjuncts of a Powerset element.
@@ -247,12 +245,14 @@ public:
     <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
     while still ensuring a correct handling of Omega-reduction.
   */
-  typedef omega_iterator iterator;
+  typedef iterator_to_const<Sequence> iterator;
+
   //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
-  typedef omega_const_iterator const_iterator;
+  typedef const_iterator_to_const<Sequence> const_iterator;
 
   //! The reverse iterator type built from Powerset::iterator.
   typedef std::reverse_iterator<iterator> reverse_iterator;
+
   //! The reverse iterator type built from Powerset::const_iterator.
   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
@@ -272,7 +272,10 @@ public:
   //! Returns the number of disjuncts.
   size_type size() const;
 
-  //! Returns <CODE>true</CODE> if and only if there are no disjuncts.
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there are no disjuncts in
+    \p *this.
+  */
   bool empty() const;
 
   /*! \brief
@@ -298,14 +301,17 @@ public:
     is not empty; otherwise, returns the before-the-start reverse_iterator.
   */
   reverse_iterator rbegin();
+
   //! Returns the before-the-start reverse_iterator.
   reverse_iterator rend();
+
   /*! \brief
     Returns a const_reverse_iterator pointing to the last disjunct,
     if \p *this is not empty; otherwise, returns the before-the-start
     const_reverse_iterator.
   */
   const_reverse_iterator rbegin() const;
+
   //! Returns the before-the-start const_reverse_iterator.
   const_reverse_iterator rend() const;
 
@@ -326,7 +332,7 @@ public:
 
   //@} // Member Functions for the Direct Manipulation of Disjuncts
 
-  //! \name Member Functions that May Modify the Powerset Element
+  //! \name Member Functions that May Modify the Powerset Object
   //@{
 
   //! The assignment operator.
@@ -344,6 +350,15 @@ public:
   */
   void upper_bound_assign(const Powerset& y);
 
+  /*! \brief
+    Assigns to \p *this the least upper bound of \p *this and \p y
+    and returns \c true.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Powerset& y);
+
   //! Assigns to \p *this the meet of \p *this and \p y.
   void meet_assign(const Powerset& y);
 
@@ -380,16 +395,21 @@ protected:
     elements in these positions that would be made Omega-redundant by the
     addition of \p d are dropped and \p d is added to the reduced
     sequence.
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
   */
-  iterator add_non_bottom_disjunct(const D& d,
-				   iterator first,
-				   iterator last);
+  iterator add_non_bottom_disjunct_preserve_reduction(const D& d,
+						      iterator first,
+						      iterator last);
 
   /*! \brief
-    Adds to \p *this the disjunct \p d,
-    assuming \p d is not the bottom element.
+    Adds to \p *this the disjunct \p d, assuming \p d is not the
+    bottom element and preserving Omega-reduction.
+
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
   */
-  void add_non_bottom_disjunct(const D& d);
+  void add_non_bottom_disjunct_preserve_reduction(const D& d);
 
   /*! \brief
     Assigns to \p *this the result of applying \p op_assign pairwise
@@ -417,193 +437,6 @@ private:
   void collapse(Sequence_iterator sink);
 };
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A %const_iterator on the disjuncts of a Powerset element.
-/*! \ingroup PPL_CXX_interface
-  This class implements a read-only bidirectional iterator
-  on the sequence of disjuncts.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-class Parma_Polyhedra_Library::Powerset<D>::omega_const_iterator {
-protected:
-  //! The type of the underlying %const_iterator.
-  typedef typename Powerset::Sequence::const_iterator Base;
-
-  //! A shortcut for naming traits.
-  typedef typename std::iterator_traits<Base> Traits;
-
-  //! A %const_iterator on the sequence of elements.
-  Base base;
-
-  //! Constructs from the lower-level const_iterator.
-  omega_const_iterator(const Base& b);
-
-  friend class Powerset;
-
-public:
-  // Same traits of the underlying const_iterator.
-  typedef typename Traits::iterator_category iterator_category;
-  typedef typename Traits::value_type value_type;
-  typedef typename Traits::difference_type difference_type;
-  typedef typename Traits::pointer pointer;
-  typedef typename Traits::reference reference;
-
-  //! Default constructor.
-  omega_const_iterator();
-
-  //! Copy constructor.
-  omega_const_iterator(const omega_const_iterator& y);
-
-  //! Constructs from the corresponding non-const iterator.
-  omega_const_iterator(const omega_iterator& y);
-
-  //! Dereference operator.
-  reference operator*() const;
-
-  //! Indirect member selector.
-  pointer operator->() const;
-
-  //! Prefix increment operator.
-  omega_const_iterator& operator++();
-
-  //! Postfix increment operator.
-  omega_const_iterator operator++(int);
-
-  //! Prefix decrement operator.
-  omega_const_iterator& operator--();
-
-  //! Postfix decrement operator.
-  omega_const_iterator operator--(int);
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are identical.
-  */
-  bool operator==(const omega_const_iterator& y) const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are different.
-  */
-  bool operator!=(const omega_const_iterator& y) const;
-};
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An iterator on the disjuncts of a Powerset element.
-/*! \ingroup PPL_CXX_interface
-  This class implements a <EM>read-only</EM> bidirectional iterator
-  on the sequence of disjuncts. That is, by using an instance of
-  this iterator class it is not possible to overwrite the disjuncts
-  contained in a Powerset element. However, using such an instance
-  allows for the removal of disjuncts by using methods
-  <CODE>Powerset::drop_disjunct(iterator position)</CODE> and
-  <CODE>Powerset::drop_disjuncts(iterator first, iterator last)</CODE>.
-  Such a policy is needed to allow for a reliable use of the Boolean
-  flag <CODE>Powerset::reduced</CODE>.
-
-  \note
-  For any developers' need, (low-level) iterators on the sequence of
-  disjuncts are still available by accessing the protected member
-  <CODE>Powerset::sequence</CODE>.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-class Parma_Polyhedra_Library::Powerset<D>::omega_iterator {
-protected:
-  //! The type of the underlying mutable iterator.
-  typedef typename Powerset::Sequence::iterator Base;
-
-  //! A shortcut for naming the const_iterator traits.
-  typedef typename
-  std::iterator_traits<typename Powerset::Sequence::const_iterator> Traits;
-
-  //! A (mutable) iterator on the sequence of elements.
-  Base base;
-
-  //! Constructs from the lower-level iterator.
-  omega_iterator(const Base& b);
-
-  friend class Powerset;
-  friend Powerset<D>::omega_const_iterator
-  ::omega_const_iterator(const omega_iterator& y);
-
-public:
-  // Same traits of the const_iterator, therefore
-  // forbidding the direct modification of sequence elements.
-  typedef typename Traits::iterator_category iterator_category;
-  typedef typename Traits::value_type value_type;
-  typedef typename Traits::difference_type difference_type;
-  typedef typename Traits::pointer pointer;
-  typedef typename Traits::reference reference;
-
-  //! Default constructor.
-  omega_iterator();
-
-  //! Copy constructor.
-  omega_iterator(const omega_iterator& y);
-
-  //! Dereference operator.
-  reference operator*() const;
-
-  //! Indirect access operator.
-  pointer operator->() const;
-
-  //! Prefix increment operator.
-  omega_iterator& operator++();
-
-  //! Postfix increment operator.
-  omega_iterator operator++(int);
-
-  //! Prefix decrement operator.
-  omega_iterator& operator--();
-
-  //! Postfix decrement operator.
-  omega_iterator operator--(int);
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are identical.
-  */
-  bool operator==(const omega_iterator& y) const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are different.
-  */
-  bool operator!=(const omega_iterator& y) const;
-};
-
-namespace Parma_Polyhedra_Library {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Mixed comparison operator: returns <CODE>true</CODE> if and only
-  if (the const version of) \p x is identical to \p y.
-
-  \relates Powerset::omega_const_iterator
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-bool
-operator==(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Mixed comparison operator: returns <CODE>true</CODE> if and only
-  if (the const version of) \p x is different from \p y.
-
-  \relates Powerset::omega_const_iterator
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-bool
-operator!=(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y);
-
-} // namespace Parma_Polyhedra_Library
-
 namespace std {
 
 //! Specializes <CODE>std::swap</CODE>.
diff --git a/src/Powerset.inlines.hh b/src/Powerset.inlines.hh
index 8085fbe..d860056 100644
--- a/src/Powerset.inlines.hh
+++ b/src/Powerset.inlines.hh
@@ -1,11 +1,11 @@
 /* Powerset class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,176 +29,6 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace Parma_Polyhedra_Library {
 
 template <typename D>
-inline
-Powerset<D>::omega_iterator::omega_iterator()
-  : base() {
-}
-
-template <typename D>
-inline
-Powerset<D>::omega_iterator::omega_iterator(const omega_iterator& y)
-  : base(y.base) {
-}
-
-template <typename D>
-inline
-Powerset<D>::omega_iterator::omega_iterator(const Base& b)
-  : base(b) {
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_iterator::reference
-Powerset<D>::omega_iterator::operator*() const {
-  return *base;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_iterator::pointer
-Powerset<D>::omega_iterator::operator->() const {
-  return &*base;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_iterator&
-Powerset<D>::omega_iterator::operator++() {
-  ++base;
-  return *this;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_iterator
-Powerset<D>::omega_iterator::operator++(int) {
-  omega_iterator tmp = *this;
-  operator++();
-  return tmp;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_iterator&
-Powerset<D>::omega_iterator::operator--() {
-  --base;
-  return *this;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_iterator
-Powerset<D>::omega_iterator::operator--(int) {
-  omega_iterator tmp = *this;
-  operator--();
-  return tmp;
-}
-
-template <typename D>
-inline bool
-Powerset<D>::omega_iterator::operator==(const omega_iterator& y) const {
-  return base == y.base;
-}
-
-template <typename D>
-inline bool
-Powerset<D>::omega_iterator::operator!=(const omega_iterator& y) const {
-  return !operator==(y);
-}
-
-template <typename D>
-inline
-Powerset<D>::omega_const_iterator::omega_const_iterator()
-  : base() {
-}
-
-template <typename D>
-inline
-Powerset<D>
-::omega_const_iterator::omega_const_iterator(const omega_const_iterator& y)
-  : base(y.base) {
-}
-
-template <typename D>
-inline
-Powerset<D>::omega_const_iterator::omega_const_iterator(const Base& b)
-  : base(b) {
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator::reference
-Powerset<D>::omega_const_iterator::operator*() const {
-  return *base;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator::pointer
-Powerset<D>::omega_const_iterator::operator->() const {
-  return &*base;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator&
-Powerset<D>::omega_const_iterator::operator++() {
-  ++base;
-  return *this;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator
-Powerset<D>::omega_const_iterator::operator++(int) {
-  omega_const_iterator tmp = *this;
-  operator++();
-  return tmp;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator&
-Powerset<D>::omega_const_iterator::operator--() {
-  --base;
-  return *this;
-}
-
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator
-Powerset<D>::omega_const_iterator::operator--(int) {
-  omega_const_iterator tmp = *this;
-  operator--();
-  return tmp;
-}
-
-template <typename D>
-inline bool
-Powerset<D>
-::omega_const_iterator::operator==(const omega_const_iterator& y) const {
-  return base == y.base;
-}
-
-template <typename D>
-inline bool
-Powerset<D>
-::omega_const_iterator::operator!=(const omega_const_iterator& y) const {
-  return !operator==(y);
-}
-
-template <typename D>
-inline
-Powerset<D>
-::omega_const_iterator::omega_const_iterator(const omega_iterator& y)
-  : base(y.base) {
-}
-
-/*! \relates Powerset::omega_const_iterator */
-template <typename D>
-inline bool
-operator==(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y) {
-  return Powerset<D>::omega_const_iterator(x).operator==(y);
-}
-
-/*! \relates Powerset::omega_const_iterator */
-template <typename D>
-inline bool
-operator!=(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y) {
-  return !(x == y);
-}
-
-template <typename D>
 inline typename Powerset<D>::iterator
 Powerset<D>::begin() {
   return sequence.begin();
@@ -306,9 +136,8 @@ Powerset<D>::Powerset()
 template <typename D>
 inline
 Powerset<D>::Powerset(const D& d)
-  : sequence(), reduced(true) {
-  if (!d.is_bottom())
-    sequence.push_back(d);
+  : sequence(), reduced(false) {
+  sequence.push_back(d);
   assert(OK());
 }
 
@@ -319,16 +148,16 @@ Powerset<D>::~Powerset() {
 
 template <typename D>
 inline void
-Powerset<D>::add_non_bottom_disjunct(const D& d) {
-  assert(!d.is_bottom());
-  add_non_bottom_disjunct(d, begin(), end());
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d) {
+  // !d.is_bottom() is asserted by the callee.
+  add_non_bottom_disjunct_preserve_reduction(d, begin(), end());
 }
 
 template <typename D>
 inline void
 Powerset<D>::add_disjunct(const D& d) {
-  if (!d.is_bottom())
-    add_non_bottom_disjunct(d);
+  sequence.push_back(d);
+  reduced = false;
 }
 
 /*! \relates Powerset */
@@ -376,6 +205,13 @@ Powerset<D>::upper_bound_assign(const Powerset& y) {
 }
 
 template <typename D>
+inline bool
+Powerset<D>::upper_bound_assign_if_exact(const Powerset& y) {
+  least_upper_bound_assign(y);
+  return true;
+}
+
+template <typename D>
 inline memory_size_type
 Powerset<D>::total_memory_in_bytes() const {
   return sizeof(*this) + external_memory_in_bytes();
diff --git a/src/Powerset.templates.hh b/src/Powerset.templates.hh
index 3fce827..71237bf 100644
--- a/src/Powerset.templates.hh
+++ b/src/Powerset.templates.hh
@@ -1,11 +1,11 @@
 /* Powerset class implementation: non-inline template functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -146,9 +146,10 @@ Powerset<D>::is_omega_reduced() const {
 
 template <typename D>
 typename Powerset<D>::iterator
-Powerset<D>::add_non_bottom_disjunct(const D& d,
-				      iterator first,
-				      iterator last) {
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d,
+							iterator first,
+							iterator last) {
+  assert(!d.is_bottom());
   for (iterator xi = first; xi != last; ) {
     const D& xv = *xi;
     if (d.definitely_entails(xv))
@@ -162,6 +163,7 @@ Powerset<D>::add_non_bottom_disjunct(const D& d,
       ++xi;
   }
   sequence.push_back(d);
+  assert(OK());
   return first;
 }
 
@@ -207,7 +209,7 @@ template <typename D>
 template <typename Binary_Operator_Assign>
 void
 Powerset<D>::pairwise_apply_assign(const Powerset& y,
-				    Binary_Operator_Assign op_assign) {
+				   Binary_Operator_Assign op_assign) {
   // Ensure omega-reduction here, since what follows has quadratic complexity.
   omega_reduce();
   y.omega_reduce();
@@ -223,6 +225,7 @@ Powerset<D>::pairwise_apply_assign(const Powerset& y,
   // Put the new sequence in place.
   std::swap(sequence, new_sequence);
   reduced = false;
+  assert(OK());
 }
 
 template <typename D>
@@ -234,7 +237,10 @@ Powerset<D>::least_upper_bound_assign(const Powerset& y) {
   iterator old_begin = begin();
   iterator old_end = end();
   for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
-    old_begin = add_non_bottom_disjunct(*i, old_begin, old_end);
+    old_begin = add_non_bottom_disjunct_preserve_reduction(*i,
+							   old_begin,
+							   old_end);
+  assert(OK());
 }
 
 namespace IO_Operators {
diff --git a/src/Powerset.types.hh b/src/Powerset.types.hh
index 4198773..e83beed 100644
--- a/src/Powerset.types.hh
+++ b/src/Powerset.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Ptr_Iterator.defs.hh b/src/Ptr_Iterator.defs.hh
index 6b8f2d4..ec9438d 100644
--- a/src/Ptr_Iterator.defs.hh
+++ b/src/Ptr_Iterator.defs.hh
@@ -1,11 +1,11 @@
 /* Ptr_Iterator class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -62,7 +62,7 @@ Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! A class to define STL const and non-const iterators from pointer types.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename P>
 class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
   : public std::iterator<typename std::iterator_traits<P>::iterator_category,
@@ -160,10 +160,12 @@ private:
   Parma_Polyhedra_Library::Implementation::
   operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
+#ifndef __INTEL_COMPILER
   friend Ptr_Iterator<P>
   Parma_Polyhedra_Library::Implementation::
   operator+<>(typename Ptr_Iterator<P>::difference_type m,
 	      const Ptr_Iterator<P>& y);
+#endif
 };
 
 #include "Ptr_Iterator.inlines.hh"
diff --git a/src/Ptr_Iterator.inlines.hh b/src/Ptr_Iterator.inlines.hh
index dc886b8..72ae57b 100644
--- a/src/Ptr_Iterator.inlines.hh
+++ b/src/Ptr_Iterator.inlines.hh
@@ -1,11 +1,11 @@
 /* Ptr_Iterator class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Ptr_Iterator.types.hh b/src/Ptr_Iterator.types.hh
index 3d7b646..b2bdf35 100644
--- a/src/Ptr_Iterator.types.hh
+++ b/src/Ptr_Iterator.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Rational_Box.hh b/src/Rational_Box.hh
new file mode 100644
index 0000000..3ce2965
--- /dev/null
+++ b/src/Rational_Box.hh
@@ -0,0 +1,38 @@
+/* Rational_Box class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Rational_Box_hh
+#define PPL_Rational_Box_hh 1
+
+#include "Rational_Interval.hh"
+#include "Box.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A box with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Box<Rational_Interval> Rational_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rational_Box_hh)
diff --git a/src/Rational_Interval.hh b/src/Rational_Interval.hh
new file mode 100644
index 0000000..79d7fe5
--- /dev/null
+++ b/src/Rational_Interval.hh
@@ -0,0 +1,56 @@
+/* Rational_Interval class declaration and implementation.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Rational_Interval_hh
+#define PPL_Rational_Interval_hh 1
+
+#include "Interval.defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Rational_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef
+Interval_Restriction_None<Interval_Info_Bitset<unsigned int,
+                                               Rational_Interval_Info_Policy> >
+Rational_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpq_class, Rational_Interval_Info> Rational_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rational_Interval_hh)
diff --git a/src/Result.defs.hh b/src/Result.defs.hh
index e0c5073..86c68ee 100644
--- a/src/Result.defs.hh
+++ b/src/Result.defs.hh
@@ -1,11 +1,11 @@
 /* Result enum and supporting function declarations.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,8 +29,6 @@ namespace Parma_Polyhedra_Library {
 /*! \ingroup PPL_CXX_interface */
 enum Result {
 
-  VC_MASK = 48,
-
   //! \hideinitializer Ordinary result class.
   VC_NORMAL = 0,
 
@@ -104,12 +102,16 @@ enum Result {
   V_UNKNOWN_POS_OVERFLOW = 59,
 
   //! \hideinitializer Unordered comparison.
-  V_UNORD_COMP = 60
+  V_UNORD_COMP = 60,
+
+  VC_MASK = 48
 };
 
-bool is_special(Result r);
+//! Extracts the class part of \p r (normal, minus/plus infinity or nan).
 Result classify(Result r);
-Result sign(Result r);
+
+//! Returns <CODE>true</CODE> if and only if the class or \p r is not normal.
+bool is_special(Result r);
 
 } // namespace Parma_Polyhedra_Library
 
diff --git a/src/Result.inlines.hh b/src/Result.inlines.hh
index 3ff1a97..66bcb1d 100644
--- a/src/Result.inlines.hh
+++ b/src/Result.inlines.hh
@@ -1,11 +1,11 @@
 /* Result supporting functions implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,38 +23,20 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Result_inlines_hh
 #define PPL_Result_inlines_hh 1
 
-#include <cassert>
-
 namespace Parma_Polyhedra_Library {
 
+/*! \relates Parma_Polyhedra_Library::Result */
 inline Result
 classify(Result r) {
   return static_cast<Result>(r & VC_MASK);
 }
 
+/*! \relates Parma_Polyhedra_Library::Result */
 inline bool
 is_special(Result r) {
   return classify(r) != VC_NORMAL;
 }
 
-inline Result
-sign(Result r) {
-  switch (r) {
-  case V_LT:
-  case V_EQ:
-  case V_GT:
-  case VC_NAN:
-    return r;
-  case VC_MINUS_INFINITY:
-    return V_LT;
-  case VC_PLUS_INFINITY:
-    return V_GT;
-  default:
-    assert(false);
-    return VC_NAN;
-  }
-}
-
 } // namespace Parma_Polyhedra_Library
 
 #endif // !defined(PPL_Result_inlines_hh)
diff --git a/src/Rounding_Dir.defs.hh b/src/Rounding_Dir.defs.hh
index 6f44dd2..d9fe794 100644
--- a/src/Rounding_Dir.defs.hh
+++ b/src/Rounding_Dir.defs.hh
@@ -1,11 +1,11 @@
 /* Declaration of Rounding_Dir and related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,26 +34,32 @@ enum Rounding_Dir {
   /*! \hideinitializer
     Round toward \f$-\infty\f$.
   */
-  ROUND_DOWN = FPU_DOWNWARD,
+  ROUND_DOWN = 0,
 
   /*! \hideinitializer
     Round toward \f$+\infty\f$.
   */
-  ROUND_UP = FPU_UPWARD,
+  ROUND_UP = 1,
 
   /*! \hideinitializer
     Rounding is delegated to lower level. Result info is evaluated lazily.
   */
-  ROUND_IGNORE = -1,
+  ROUND_IGNORE = 6,
   ROUND_NATIVE = ROUND_IGNORE,
 
   /*! \hideinitializer
     Rounding is not needed: client code must ensure the operation is exact.
   */
-  ROUND_NOT_NEEDED = -2,
+  ROUND_NOT_NEEDED = 7,
 
   ROUND_DIRECT = ROUND_UP,
-  ROUND_INVERSE = ROUND_DOWN
+  ROUND_INVERSE = ROUND_DOWN,
+
+  ROUND_DIR_MASK = 7,
+
+  ROUND_FPU_CHECK_INEXACT = 8,
+
+  ROUND_CHECK = ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT
 };
 
 /*! \brief
@@ -62,6 +68,17 @@ enum Rounding_Dir {
 */
 Rounding_Dir inverse(Rounding_Dir dir);
 
+Rounding_Dir round_dir(Rounding_Dir dir);
+bool round_down(Rounding_Dir dir);
+bool round_up(Rounding_Dir dir);
+bool round_ignore(Rounding_Dir dir);
+bool round_direct(Rounding_Dir dir);
+bool round_inverse(Rounding_Dir dir);
+
+bool round_fpu_check_inexact(Rounding_Dir dir);
+
+fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
+
 } // namespace Parma_Polyhedra_Library
 
 #include "Rounding_Dir.inlines.hh"
diff --git a/src/Rounding_Dir.inlines.hh b/src/Rounding_Dir.inlines.hh
index 2304410..77e895a 100644
--- a/src/Rounding_Dir.inlines.hh
+++ b/src/Rounding_Dir.inlines.hh
@@ -1,11 +1,11 @@
 /* Inline functions operating on enum Rounding_Dir values.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,24 +23,76 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Rounding_Dir_inlines_hh
 #define PPL_Rounding_Dir_inlines_hh 1
 
-#include "Rounding_Dir.defs.hh"
+#include <cassert>
 
 namespace Parma_Polyhedra_Library {
 
+inline Rounding_Dir
+round_dir(Rounding_Dir dir) {
+  return static_cast<Rounding_Dir>(dir & ROUND_DIR_MASK);
+}
+
+inline bool
+round_down(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DOWN;
+}
+
+inline bool
+round_up(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_UP;
+}
+
+inline bool
+round_ignore(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_IGNORE;
+}
+
+inline bool
+round_direct(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DIRECT;
+}
+
+inline bool
+round_inverse(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_INVERSE;
+}
+
+inline bool
+round_fpu_check_inexact(Rounding_Dir dir) {
+  return dir & ROUND_FPU_CHECK_INEXACT;
+}
+
+inline fpu_rounding_direction_type
+round_fpu_dir(Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    return static_cast<fpu_rounding_direction_type>(FPU_UPWARD);
+  case ROUND_DOWN:
+    return static_cast<fpu_rounding_direction_type>(FPU_DOWNWARD);
+  default:
+    assert(0);
+    return static_cast<fpu_rounding_direction_type>(FPU_UPWARD);
+  }
+}
+
 /*! \relates Parma_Polyhedra_Library::Rounding_Dir */
 inline Rounding_Dir
 inverse(Rounding_Dir dir) {
-  switch (dir) {
+  Rounding_Dir d = round_dir(dir);
+  switch (d) {
   case ROUND_UP:
-    return ROUND_DOWN;
+    d = ROUND_DOWN;
+    break;
   case ROUND_DOWN:
-    return ROUND_UP;
-  case ROUND_IGNORE:
-    return ROUND_IGNORE;
+    d = ROUND_UP;
+    break;
   default:
     assert(false);
-    return ROUND_IGNORE;
+    /* Fall through */
+  case ROUND_IGNORE:
+    return dir;
   }
+  return static_cast<Rounding_Dir>((dir & ~ROUND_DIR_MASK) | d);
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/Row.cc b/src/Row.cc
index 5f10255..1324c2e 100644
--- a/src/Row.cc
+++ b/src/Row.cc
@@ -1,11 +1,11 @@
 /* Row class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Row.defs.hh"
 #include "Coefficient.defs.hh"
@@ -34,7 +34,7 @@ void
 PPL::Row_Impl_Handler::
 Impl::expand_within_capacity(const dimension_type new_size) {
   assert(size() <= new_size && new_size <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   // vec_[0] is already constructed.
   if (size() == 0 && new_size > 0)
     bump_size();
@@ -51,7 +51,7 @@ PPL::Row_Impl_Handler::Impl::shrink(dimension_type new_size) {
   assert(new_size <= old_size);
   // Since ~Coefficient() does not throw exceptions, nothing here does.
   set_size(new_size);
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   // Make sure we do not try to destroy vec_[0].
   if (new_size == 0)
     ++new_size;
@@ -65,7 +65,7 @@ PPL::Row_Impl_Handler::Impl::shrink(dimension_type new_size) {
 void
 PPL::Row_Impl_Handler::Impl::copy_construct_coefficients(const Impl& y) {
   const dimension_type y_size = y.size();
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   for (dimension_type i = 0; i < y_size; ++i) {
     new (&vec_[i]) Coefficient(y.vec_[i]);
     bump_size();
@@ -143,7 +143,7 @@ PPL::Row::Flags::ascii_dump(std::ostream& s) const {
   s.flags(f);
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row::Flags);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row::Flags)
 
 bool
 PPL::Row::Flags::ascii_load(std::istream& s) {
@@ -162,6 +162,7 @@ void
 PPL::Row::ascii_dump(std::ostream& s) const {
   const Row& x = *this;
   const dimension_type x_size = x.size();
+  s << "size " << x_size << " ";
   for (dimension_type i = 0; i < x_size; ++i)
     s << x[i] << ' ';
   s << "f ";
@@ -169,14 +170,27 @@ PPL::Row::ascii_dump(std::ostream& s) const {
   s << "\n";
 }
 
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row);
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row)
 
 bool
 PPL::Row::ascii_load(std::istream& s) {
-  Row& x = *this;
   std::string str;
-  const dimension_type x_size = x.size();
-  for (dimension_type col = 0; col < x_size; ++col)
+  if (!(s >> str) || str != "size")
+    return false;
+  dimension_type new_size;
+  if (!(s >> new_size))
+    return false;
+
+  Row& x = *this;
+  const dimension_type old_size = x.size();
+  if (new_size < old_size)
+    x.shrink(new_size);
+  else if (new_size > old_size) {
+    Row y(new_size, Row::Flags());
+    x.swap(y);
+  }
+
+  for (dimension_type col = 0; col < new_size; ++col)
     if (!(s >> x[col]))
       return false;
   if (!(s >> str) || (str.compare("f") != 0))
@@ -193,30 +207,22 @@ PPL::Row_Impl_Handler::Impl::external_memory_in_bytes() const {
 }
 
 bool
-PPL::Row::OK(const dimension_type row_size,
-	     const dimension_type
-#if EXTRA_ROW_DEBUG
-	     row_capacity
-#endif
-	     ) const {
+PPL::Row::OK() const {
 #ifndef NDEBUG
   using std::endl;
   using std::cerr;
 #endif
 
   bool is_broken = false;
-#if EXTRA_ROW_DEBUG
-# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   if (capacity_ == 0) {
     cerr << "Illegal row capacity: is 0, should be at least 1"
 	 << endl;
     is_broken = true;
   }
-  else if (capacity_ == 1 && row_capacity == 0)
-    // This is fine.
-    ;
   else
-# endif
+# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   if (capacity_ > max_size()) {
     cerr << "Row capacity exceeds the maximum allowed size:"
 	 << endl
@@ -225,13 +231,7 @@ PPL::Row::OK(const dimension_type row_size,
 	 << endl;
     is_broken = true;
   }
-  if (capacity_ != row_capacity) {
-    cerr << "Row capacity mismatch: is " << capacity_
-	 << ", should be " << row_capacity << "."
-	 << endl;
-    is_broken = true;
-  }
-#endif
+#endif // PPL_ROW_EXTRA_DEBUG
   if (size() > max_size()) {
 #ifndef NDEBUG
     cerr << "Row size exceeds the maximum allowed size:"
@@ -242,24 +242,58 @@ PPL::Row::OK(const dimension_type row_size,
 #endif
     is_broken = true;
   }
-  if (size() != row_size) {
+#if PPL_ROW_EXTRA_DEBUG
+  if (capacity_ < size()) {
 #ifndef NDEBUG
-    cerr << "Row size mismatch: is " << size()
-	 << ", should be " << row_size << "."
+    cerr << "Row is completely broken: capacity is " << capacity_
+	 << ", size is " << size() << "."
 	 << endl;
 #endif
     is_broken = true;
   }
-#if EXTRA_ROW_DEBUG
-  if (capacity_ < size()) {
+#endif // PPL_ROW_EXTRA_DEBUG
+  return !is_broken;
+}
+
+bool
+PPL::Row::OK(const dimension_type row_size,
+	     const dimension_type
+#if PPL_ROW_EXTRA_DEBUG
+	     row_capacity
+#endif
+	     ) const {
 #ifndef NDEBUG
-    cerr << "Row is completely broken: capacity is " << capacity_
-	 << ", size is " << size() << "."
-	 << endl;
+  using std::endl;
+  using std::cerr;
 #endif
+
+  bool is_broken = !OK();
+
+#if PPL_ROW_EXTRA_DEBUG
+  // Check the declared capacity.
+# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity_ != row_capacity) {
+    cerr << "Row capacity mismatch: is " << capacity_
+	 << ", should be " << row_capacity << "."
+	 << endl;
     is_broken = true;
   }
+#endif // PPL_ROW_EXTRA_DEBUG
+
+  // Check the declared size.
+  if (size() != row_size) {
+#ifndef NDEBUG
+    cerr << "Row size mismatch: is " << size()
+	 << ", should be " << row_size << "."
+	 << endl;
 #endif
+    is_broken = true;
+  }
   return !is_broken;
 }
 
diff --git a/src/Row.defs.hh b/src/Row.defs.hh
index c3ca460..ad58c6b 100644
--- a/src/Row.defs.hh
+++ b/src/Row.defs.hh
@@ -1,11 +1,11 @@
 /* Row class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,20 +29,24 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <vector>
 #include <limits>
 
-#ifndef EXTRA_ROW_DEBUG
+#ifndef PPL_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*!
   \brief
   Enables extra debugging information for class Row.
 
   \ingroup PPL_CXX_interface
-  When <CODE>EXTRA_ROW_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+  When <CODE>PPL_ROW_EXTRA_DEBUG</CODE> evaluates to <CODE>true</CODE>,
   each instance of the class Row carries its own capacity; this enables
   extra consistency checks to be performed.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-#define EXTRA_ROW_DEBUG 0
-#endif
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_ROW_EXTRA_DEBUG)
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! The handler of the actual Row implementation.
@@ -50,7 +54,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   Exception-safety is the only responsibility of this class: it has
   to ensure that its \p impl member is correctly deallocated.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 class Parma_Polyhedra_Library::Row_Impl_Handler {
 public:
   //! Default constructor.
@@ -64,10 +68,10 @@ public:
   //! A pointer to the actual implementation.
   Impl* impl;
 
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   //! The capacity of \p impl (only available during debugging).
   dimension_type capacity_;
-#endif // EXTRA_ROW_DEBUG
+#endif // PPL_ROW_EXTRA_DEBUG
 
 private:
   //! Private and unimplemented: copy construction is not allowed.
@@ -80,7 +84,7 @@ private:
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! A finite sequence of coefficients.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
 public:
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
@@ -89,7 +93,7 @@ public:
     unsigned integral type.
     \ingroup PPL_CXX_interface
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
   class Flags {
   public:
     //! Constructs an object with all the flags unset.
@@ -104,7 +108,7 @@ public:
     */
     bool operator!=(const Flags& y) const;
 
-    PPL_OUTPUT_DECLARATIONS;
+    PPL_OUTPUT_DECLARATIONS
 
     //! Uses the ASCII Flags representation from \p s to recreate *this.
     /*!
@@ -289,12 +293,12 @@ public:
   */
   void normalize();
 
-  PPL_OUTPUT_DECLARATIONS;
+  PPL_OUTPUT_DECLARATIONS
 
-  //! Uses the ASCII Row representation at \p s to recreate *this.
-  /*!
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
   bool ascii_load(std::istream& s);
 
@@ -323,16 +327,22 @@ public:
   memory_size_type external_memory_in_bytes(dimension_type capacity) const;
 
   //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Checks if all the invariants are satisfied and that the actual
+    size and capacity match the values provided as arguments.
+  */
   bool OK(dimension_type row_size, dimension_type row_capacity) const;
 
 private:
   //! Exception-safe copy construction mechanism for coefficients.
   void copy_construct_coefficients(const Row& y);
 
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   //! Returns the capacity of the row (only available during debugging).
   dimension_type capacity() const;
-#endif // EXTRA_ROW_DEBUG
+#endif // PPL_ROW_EXTRA_DEBUG
 };
 
 namespace Parma_Polyhedra_Library {
@@ -353,14 +363,14 @@ namespace std {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void swap(Parma_Polyhedra_Library::Row& x,
 	  Parma_Polyhedra_Library::Row& y);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::iter_swap</CODE>.
 /*! \relates Parma_Polyhedra_Library::Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
 	       std::vector<Parma_Polyhedra_Library::Row>::iterator y);
 
@@ -374,7 +384,7 @@ void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
   objects and, in particular, of the corresponding memory allocation
   functions.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
 public:
   //! \name Custom allocator and deallocator
@@ -476,7 +486,7 @@ private:
 
   //! The vector of coefficients.
   Coefficient vec_[
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
 	       1
 #endif
   ];
diff --git a/src/Row.inlines.hh b/src/Row.inlines.hh
index a850267..e28bdaa 100644
--- a/src/Row.inlines.hh
+++ b/src/Row.inlines.hh
@@ -1,11 +1,11 @@
 /* Row class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,7 +23,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Row_inlines_hh
 #define PPL_Row_inlines_hh 1
 
-#include "globals.defs.hh"
+#include "math_utilities.defs.hh"
 #include <cassert>
 #include <algorithm>
 
@@ -73,7 +73,7 @@ Row::Flags::operator!=(const Flags& y) const {
 inline void*
 Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
 				     const dimension_type capacity) {
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   return ::operator new(fixed_size + capacity*sizeof(Coefficient));
 #else
   assert(capacity >= 1);
@@ -148,7 +148,7 @@ Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
   return
     sizeof(*this)
     + capacity*sizeof(Coefficient)
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
     - 1*sizeof(Coefficient)
 #endif
     + external_memory_in_bytes();
@@ -181,7 +181,7 @@ Row::flags() {
   return impl->flags();
 }
 
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
 inline dimension_type
 Row::capacity() const {
   return capacity_;
@@ -191,7 +191,7 @@ Row::capacity() const {
 inline
 Row_Impl_Handler::Row_Impl_Handler()
   : impl(0) {
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   capacity_ = 0;
 #endif
 }
@@ -208,19 +208,19 @@ Row::Row()
 
 inline void
 Row::allocate(
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
 	       const
 #endif
 	       dimension_type capacity,
 	       const Flags f) {
   assert(capacity <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
   if (capacity == 0)
     ++capacity;
 #endif
   assert(impl == 0);
   impl = new (capacity) Impl(f);
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   assert(capacity_ == 0);
   capacity_ = capacity;
 #endif
@@ -229,7 +229,7 @@ Row::allocate(
 inline void
 Row::expand_within_capacity(const dimension_type new_size) {
   assert(impl);
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   assert(new_size <= capacity_);
 #endif
   impl->expand_within_capacity(new_size);
@@ -238,7 +238,7 @@ Row::expand_within_capacity(const dimension_type new_size) {
 inline void
 Row::copy_construct_coefficients(const Row& y) {
   assert(impl && y.impl);
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   assert(y.size() <= capacity_);
 #endif
   impl->copy_construct_coefficients(*(y.impl));
@@ -316,7 +316,7 @@ Row::shrink(const dimension_type new_size) {
 inline void
 Row::swap(Row& y) {
   std::swap(impl, y.impl);
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   std::swap(capacity_, y.capacity_);
 #endif
 }
@@ -324,7 +324,7 @@ Row::swap(Row& y) {
 inline void
 Row::assign(Row& y) {
   impl = y.impl;
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   capacity_ = y.capacity_;
 #endif
 }
@@ -363,7 +363,7 @@ Row::total_memory_in_bytes(dimension_type capacity) const {
 
 inline memory_size_type
 Row::external_memory_in_bytes() const {
-#if EXTRA_ROW_DEBUG
+#if PPL_ROW_EXTRA_DEBUG
   return impl->total_memory_in_bytes(capacity_);
 #else
   return impl->total_memory_in_bytes();
diff --git a/src/Row.types.hh b/src/Row.types.hh
index 3a7fb38..5f487af 100644
--- a/src/Row.types.hh
+++ b/src/Row.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Saturation_Matrix.cc b/src/Saturation_Matrix.cc
deleted file mode 100644
index f3ab2b4..0000000
--- a/src/Saturation_Matrix.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-/* Saturation_Matrix class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-
-#include "Saturation_Matrix.defs.hh"
-#include "globals.defs.hh"
-#include <iostream>
-#include <string>
-
-#include "swapping_sort.icc"
-
-namespace PPL = Parma_Polyhedra_Library;
-
-PPL::Saturation_Matrix&
-PPL::Saturation_Matrix::operator=(const Saturation_Matrix& y){
-  rows = y.rows;
-  row_size = y.row_size;
-  assert(OK());
-  return *this;
-}
-
-void
-PPL::Saturation_Matrix::sort_rows() {
-  typedef std::vector<Saturation_Row>::iterator Iter;
-  // Sorting without removing duplicates.
-  Iter first = rows.begin();
-  Iter last = rows.end();
-  swapping_sort(first, last, Saturation_Row_Less_Than());
-  // Moving all the duplicate elements at the end of the vector.
-  Iter new_last = swapping_unique(first, last);
-  // Removing duplicates.
-  rows.erase(new_last, last);
-  assert(OK());
-}
-
-void
-PPL::Saturation_Matrix::add_row(const Saturation_Row& row) {
-  const dimension_type new_rows_size = rows.size() + 1;
-  if (rows.capacity() < new_rows_size) {
-    // Reallocation will take place.
-    std::vector<Saturation_Row> new_rows;
-    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
-    new_rows.insert(new_rows.end(), new_rows_size, Saturation_Row());
-    // Put the new row in place.
-    dimension_type i = new_rows_size-1;
-    new_rows[i] = row;
-    // Steal the old rows.
-    while (i-- > 0)
-      new_rows[i].swap(rows[i]);
-    // Put the new rows into place.
-    std::swap(rows, new_rows);
-  }
-  else
-    // Reallocation will NOT take place: append a new empty row.
-    rows.push_back(row);
-  assert(OK());
-}
-
-void
-PPL::Saturation_Matrix::transpose() {
-  const Saturation_Matrix& x = *this;
-  const dimension_type nrows = num_rows();
-  const dimension_type ncols = num_columns();
-  Saturation_Matrix tmp(ncols, nrows);
-  for (dimension_type i = nrows; i-- > 0; )
-    for (unsigned long j = x[i].last(); j != ULONG_MAX; j = x[i].prev(j))
-      tmp[j].set(i);
-  swap(tmp);
-  assert(OK());
-}
-
-void
-PPL::Saturation_Matrix::transpose_assign(const Saturation_Matrix& y) {
-  const dimension_type y_nrows = y.num_rows();
-  const dimension_type y_ncols = y.num_columns();
-  Saturation_Matrix tmp(y_ncols, y_nrows);
-  for (dimension_type i = y_nrows; i-- > 0; )
-    for (unsigned long j = y[i].last(); j != ULONG_MAX; j = y[i].prev(j))
-      tmp[j].set(i);
-  swap(tmp);
-  assert(OK());
-}
-
-void
-PPL::Saturation_Matrix::resize(dimension_type new_n_rows,
-		       dimension_type new_n_columns) {
-  assert(OK());
-  const dimension_type old_num_rows = num_rows();
-  if (new_n_columns < row_size) {
-    const dimension_type num_preserved_rows
-      = std::min(old_num_rows, new_n_rows);
-    Saturation_Matrix& x = *this;
-    for (dimension_type i = num_preserved_rows; i-- > 0; )
-      x[i].clear_from(new_n_columns);
-  }
-  row_size = new_n_columns;
-  if (new_n_rows > old_num_rows) {
-    if (rows.capacity() < new_n_rows) {
-      // Reallocation will take place.
-      std::vector<Saturation_Row> new_rows;
-      new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-      new_rows.insert(new_rows.end(), new_n_rows, Saturation_Row());
-      // Steal the old rows.
-      for (dimension_type i = old_num_rows; i-- > 0; )
-	new_rows[i].swap(rows[i]);
-      // Put the new vector into place.
-      std::swap(rows, new_rows);
-    }
-    else
-      // Reallocation will NOT take place.
-      rows.insert(rows.end(), new_n_rows - old_num_rows, Saturation_Row());
-  }
-  else if (new_n_rows < old_num_rows)
-    // Drop some rows.
-    rows.erase(rows.begin() + new_n_rows, rows.end());
-
-  assert(OK());
-}
-
-void
-PPL::Saturation_Matrix::ascii_dump(std::ostream& s) const {
-  const Saturation_Matrix& x = *this;
-  const char separator = ' ';
-  s << num_rows() << separator << 'x' << separator
-    << num_columns() << "\n";
-  for (dimension_type i = 0; i < num_rows(); ++i) {
-    for (dimension_type j = 0; j < num_columns(); ++j)
-      s << x[i][j] << separator;
-    s << "\n";
-  }
-}
-
-PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Saturation_Matrix);
-
-bool
-PPL::Saturation_Matrix::ascii_load(std::istream& s) {
-  Saturation_Matrix& x = *this;
-  dimension_type nrows;
-  dimension_type ncols;
-  std::string str;
-  if (!(s >> nrows))
-    return false;
-  if (!(s >> str))
-    return false;
-  if (!(s >> ncols))
-    return false;
-  resize(nrows, ncols);
-
-  for (dimension_type i = 0; i < num_rows(); ++i)
-    for (dimension_type j = 0; j < num_columns(); ++j) {
-      int bit;
-      if (!(s >> bit))
-	return false;
-      if (bit)
-	x[i].set(j);
-      else
-	x[i].clear(j);
-    }
-  // Check for well-formedness.
-  assert(OK());
-  return true;
-}
-
-PPL::memory_size_type
-PPL::Saturation_Matrix::external_memory_in_bytes() const {
-  memory_size_type n = rows.capacity() * sizeof(Row);
-  for (dimension_type i = num_rows(); i-- > 0; )
-    n += rows[i].external_memory_in_bytes();
-  return n;
-}
-
-bool
-PPL::Saturation_Matrix::OK() const {
-#ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
-#endif
-
-  const Saturation_Matrix& x = *this;
-  for (dimension_type i = num_rows(); i-- > 1; ) {
-    const Saturation_Row& row = x[i];
-    if (!row.OK())
-      return false;
-    else if (row.last() != ULONG_MAX && row.last() >= row_size) {
-#ifndef NDEBUG
-      cerr << "Saturation_Matrix[" << i << "] is a row with too many bits!"
-	   << endl
-	   << "(row_size == " << row_size
-	   << ", row.last() == " << row.last() << ")"
-	   << endl;
-#endif
-      return false;
-    }
-  }
-  return true;
-}
-
-#ifndef NDEBUG
-bool
-PPL::Saturation_Matrix::check_sorted() const {
-  const Saturation_Matrix& x = *this;
-  for (dimension_type i = num_rows(); i-- > 1; )
-    if (compare(x[i-1], x[i]) > 0)
-      return false;
-  return true;
-}
-#endif
diff --git a/src/Saturation_Matrix.defs.hh b/src/Saturation_Matrix.defs.hh
deleted file mode 100644
index 264c3c8..0000000
--- a/src/Saturation_Matrix.defs.hh
+++ /dev/null
@@ -1,177 +0,0 @@
-/* Saturation_Matrix class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Saturation_Matrix_defs_hh
-#define PPL_Saturation_Matrix_defs_hh 1
-
-#include "Saturation_Matrix.types.hh"
-#include "Linear_System.defs.hh"
-#include "Saturation_Row.defs.hh"
-#include <vector>
-#include <iosfwd>
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A saturation matrix.
-/*! \ingroup PPL_CXX_interface
-  A saturation matrix is used to encode the relation between the
-  generators and the constraints of a polyhedron: if a generator
-  saturates a constraint the corresponding element of the saturation
-  matrix is \f$0\f$, otherwise (i.e., if the generator satisfies but
-  does not saturate the constraint) the corresponding element is \f$1\f$.
-  \note
-  since the constraints and generators are taken from the same polyhedron
-  description, it cannot be the case that a generator <EM>violates</EM>
-  a constraint.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-
-class Parma_Polyhedra_Library::Saturation_Matrix {
-public:
-  //! Default constructor.
-  Saturation_Matrix();
-
-  /*! \brief
-    Construct a saturation matrix with \p n_rows rows
-    and \p n_columns columns.
-  */
-  Saturation_Matrix(dimension_type n_rows, dimension_type n_columns);
-
-  //! Copy-constructor.
-  Saturation_Matrix(const Saturation_Matrix& y);
-
-  //! Destructor.
-  ~Saturation_Matrix();
-
-  //! Assignment operator.
-  Saturation_Matrix& operator=(const Saturation_Matrix& y);
-
-  //! Swaps \p *this with \p y.
-  void swap(Saturation_Matrix& y);
-
-  //! Subscript operator.
-  Saturation_Row& operator[](dimension_type k);
-
-  //! Constant subscript operator.
-  const Saturation_Row& operator[](dimension_type k) const;
-
-  //! Clears the matrix deallocating all its rows.
-  void clear();
-
-  //! Transposes the matrix.
-  void transpose();
-
-  //! Makes \p *this a transposed copy of \p y.
-  void transpose_assign(const Saturation_Matrix& y);
-
-  //! Returns the maximum number of rows of a Saturation_Matrix.
-  static dimension_type max_num_rows();
-
-  //! Returns the number of columns of \p *this.
-  dimension_type num_columns() const;
-
-  //! Returns the number of rows of \p *this.
-  dimension_type num_rows() const;
-
-  //! Sorts the rows and removes duplicates.
-  void sort_rows();
-
-  //! Looks for \p row in \p *this, which is assumed to be sorted.
-  /*!
-    \return
-    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
-
-    \param row
-    The row that will be searched for in the matrix.
-
-    Given a sorted saturation matrix (this ensures better efficiency),
-    tells whether it contains the given row.
-  */
-  bool sorted_contains(const Saturation_Row& row) const;
-
-  //! Adds \p row to \p *this.
-  void add_row(const Saturation_Row& row);
-
-  //! Erases the rows from the \p first_to_erase -th to the last one.
-  void rows_erase_to_end(dimension_type first_to_erase);
-
-  //! Erases the columns from the \p first_to_erase -th to the last one.
-  void columns_erase_to_end(dimension_type first_to_erase);
-
-  //! Resizes the matrix copying the old contents.
-  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-
-  PPL_OUTPUT_DECLARATIONS;
-
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
-  */
-  bool ascii_load(std::istream& s);
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
-
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
-
-#ifndef NDEBUG
-  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
-  bool check_sorted() const;
-#endif
-
-private:
-  //! Contains the rows of the matrix.
-  std::vector<Saturation_Row> rows;
-
-  //! Size of the initialized part of each row.
-  dimension_type row_size;
-
-  //! Ordering predicate (used when implementing the sort algorithm).
-  /*! \ingroup PPL_CXX_interface */
-  struct Saturation_Row_Less_Than {
-    bool operator()(const Saturation_Row& x, const Saturation_Row& y) const;
-  };
-
-  friend
-  void Parma_Polyhedra_Library::
-  Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat);
-
-};
-
-namespace std {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
-	  Parma_Polyhedra_Library::Saturation_Matrix& y);
-
-} // namespace std
-
-#include "Saturation_Matrix.inlines.hh"
-
-#endif // !defined(PPL_Saturation_Matrix_defs_hh)
diff --git a/src/Saturation_Matrix.inlines.hh b/src/Saturation_Matrix.inlines.hh
deleted file mode 100644
index ad7b477..0000000
--- a/src/Saturation_Matrix.inlines.hh
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Saturation_Matrix class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Saturation_Matrix_inlines_hh
-#define PPL_Saturation_Matrix_inlines_hh 1
-
-#include <algorithm>
-#include <cassert>
-
-namespace Parma_Polyhedra_Library {
-
-inline
-Saturation_Matrix::Saturation_Matrix()
-  : rows(),
-    row_size(0) {
-}
-
-inline dimension_type
-Saturation_Matrix::max_num_rows() {
-  return std::vector<Saturation_Row>().max_size();
-}
-
-inline
-Saturation_Matrix::Saturation_Matrix(const dimension_type n_rows,
-		     const dimension_type n_columns)
-  : rows(n_rows),
-    row_size(n_columns) {
-}
-
-inline
-Saturation_Matrix::Saturation_Matrix(const Saturation_Matrix& y)
-  : rows(y.rows),
-    row_size(y.row_size) {
-}
-
-inline
-Saturation_Matrix::~Saturation_Matrix() {
-}
-
-inline void
-Saturation_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
-  // The first row to be erased cannot be greater
-  // than the actual number of the rows of the matrix.
-  assert(first_to_erase <= rows.size());
-  if (first_to_erase < rows.size())
-    rows.erase(rows.begin() + first_to_erase, rows.end());
-  assert(OK());
-}
-
-inline void
-Saturation_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
-  // The first column to be erased cannot be greater
-  // than the actual number of the columns of the matrix.
-  assert(first_to_erase <= row_size);
-  row_size = first_to_erase;
-  assert(OK());
-}
-
-inline void
-Saturation_Matrix::swap(Saturation_Matrix& y) {
-  std::swap(row_size, y.row_size);
-  std::swap(rows, y.rows);
-}
-
-inline Saturation_Row&
-Saturation_Matrix::operator[](const dimension_type k) {
-  assert(k < rows.size());
-  return rows[k];
-}
-
-inline const Saturation_Row&
-Saturation_Matrix::operator[](const dimension_type k) const {
-  assert(k < rows.size());
-  return rows[k];
-}
-
-inline dimension_type
-Saturation_Matrix::num_columns() const {
-  return row_size;
-}
-
-inline dimension_type
-Saturation_Matrix::num_rows() const {
-  return rows.size();
-}
-
-inline void
-Saturation_Matrix::clear() {
-  // Clear `rows' and minimize its capacity.
-  std::vector<Saturation_Row>().swap(rows);
-  row_size = 0;
-}
-
-inline memory_size_type
-Saturation_Matrix::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
-
-inline bool
-Saturation_Matrix::Saturation_Row_Less_Than::
-operator()(const Saturation_Row& x, const Saturation_Row& y) const {
-  return compare(x, y) < 0;
-}
-
-inline bool
-Saturation_Matrix::sorted_contains(const Saturation_Row& row) const {
-  assert(check_sorted());
-  return std::binary_search(rows.begin(), rows.end(), row,
-			    Saturation_Row_Less_Than());
-}
-
-} // namespace Parma_Polyhedra_Library
-
-
-namespace std {
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
-inline void
-swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
-     Parma_Polyhedra_Library::Saturation_Matrix& y) {
-  x.swap(y);
-}
-
-} // namespace std
-
-#endif // !defined(PPL_Saturation_Matrix_inlines_hh)
diff --git a/src/Saturation_Matrix.types.hh b/src/Saturation_Matrix.types.hh
deleted file mode 100644
index 489b6ea..0000000
--- a/src/Saturation_Matrix.types.hh
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is free software; as a special exception the author 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. */
-
-#ifndef PPL_Saturation_Matrix_types_hh
-#define PPL_Saturation_Matrix_types_hh 1
-
-namespace Parma_Polyhedra_Library {
-
-class Saturation_Matrix;
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Saturation_Matrix_types_hh)
diff --git a/src/Saturation_Row.cc b/src/Saturation_Row.cc
deleted file mode 100644
index 55c2533..0000000
--- a/src/Saturation_Row.cc
+++ /dev/null
@@ -1,347 +0,0 @@
-/* Saturation_Row class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-
-#include "Saturation_Row.defs.hh"
-#include <cassert>
-#include <climits>
-
-namespace PPL = Parma_Polyhedra_Library;
-
-#define BITS_PER_GMP_LIMB (SIZEOF_MP_LIMB_T*CHAR_BIT)
-
-#if !HAVE_DECL_FFS || SIZEOF_MP_LIMB_T != SIZEOF_INT
-unsigned int
-PPL::Saturation_Row::first_one(mp_limb_t w) {
-  unsigned int r = 0;
-  w = w & -w;
-#if SIZEOF_MP_LIMB_T == 8
-  if ((w & 0xffffffff) == 0) {
-    w >>= 32;
-    r += 32;
-  }
-#elif SIZEOF_MP_LIMB_T != 4
-#error "Size of mp_limb_t not supported by Saturation_Row::first_one(mp_limb_t w)."
-#endif
-  if ((w & 0xffff) == 0) {
-    w >>= 16;
-    r += 16;
-  }
-  if ((w & 0xff) == 0) {
-    w >>= 8;
-    r += 8;
-  }
-  if (w & 0xf0)
-    r += 4;
-  if (w & 0xcc)
-    r += 2;
-  if (w & 0xaa)
-    r += 1;
-  return r;
-}
-#endif // !HAVE_DECL_FFS || SIZEOF_MP_LIMB_T != SIZEOF_INT
-
-unsigned int
-PPL::Saturation_Row::last_one(mp_limb_t w) {
-  unsigned int r = 0;
-#if SIZEOF_MP_LIMB_T == 8
-  if (w & 0xffffffff00000000) {
-    w >>= 32;
-    r += 32;
-  }
-#elif SIZEOF_MP_LIMB_T != 4
-#error "Size of mp_limb_t not supported by Saturation_Row::last_one(mp_limb_t w)."
-#endif
-  if (w & 0xffff0000) {
-    w >>= 16;
-    r += 16;
-  }
-  if (w & 0xff00) {
-    w >>= 8;
-    r += 8;
-  }
-  if (w & 0xf0) {
-    w >>= 4;
-    r += 4;
-  }
-  if (w & 0xc) {
-    w >>= 2;
-    r += 2;
-  }
-  if (w & 0x2)
-    r += 1;
-  return r;
-}
-
-unsigned long
-PPL::Saturation_Row::first() const {
-  const mp_size_t vec_size = vec->_mp_size;
-  assert(vec_size >= 0);
-  mp_size_t li = 0;
-  mp_srcptr p = vec->_mp_d;
-  for (; li < vec_size; ++li, ++p) {
-    const mp_limb_t limb = *p;
-    if (limb != 0)
-      return li*BITS_PER_GMP_LIMB + first_one(limb);
-  }
-  return ULONG_MAX;
-}
-
-unsigned long
-PPL::Saturation_Row::next(unsigned long position) const {
-  ++position;
-
-  // The alternative implementation using the mpz_scan1() function
-  // of GMP was measured to be slower that ours.  Here it is, in
-  // case mpz_scan1() is improved.
-  //
-  // unsigned long r = mpz_scan1(vec, position);
-  // return (r == ULONG_MAX) ? -1 : r;
-
-  mp_size_t li = position / BITS_PER_GMP_LIMB;
-  const mp_size_t vec_size = vec->_mp_size;
-  assert(vec_size >= 0);
-  if (li >= vec_size)
-    return ULONG_MAX;
-
-  // Get the first limb.
-  mp_srcptr p = vec->_mp_d + li;
-
-  // Mask off any bits before `position' in the first limb.
-  mp_limb_t limb = *p & (~(mp_limb_t) 0) << (position % BITS_PER_GMP_LIMB);
-
-  while (true) {
-    if (limb != 0)
-      return li*BITS_PER_GMP_LIMB + first_one(limb);
-    ++li;
-    if (li == vec_size)
-      break;
-    ++p;
-    limb = *p;
-  }
-  return ULONG_MAX;
-}
-
-unsigned long
-PPL::Saturation_Row::last() const {
-  mp_size_t li = vec->_mp_size;
-  assert(li >= 0);
-  if (li == 0)
-    return ULONG_MAX;
-  --li;
-  const mp_srcptr p = vec->_mp_d + li;
-  const mp_limb_t limb = *p;
-  assert(limb != 0);
-  return li*BITS_PER_GMP_LIMB + last_one(limb);
-}
-
-unsigned long
-PPL::Saturation_Row::prev(unsigned long position) const {
-  if (position == 0)
-    return ULONG_MAX;
-
-  --position;
-
-  const mp_size_t vec_size = vec->_mp_size;
-  assert(vec_size > 0);
-  mp_size_t li = position / BITS_PER_GMP_LIMB;
-
-  mp_limb_t limb;
-  mp_srcptr p = vec->_mp_d;
-
-  // Get the first limb.
-  if (li >= vec_size) {
-    li = vec_size - 1;
-    p += li;
-    limb = *p;
-  }
-  else {
-    const mp_limb_t mask
-      = (~(mp_limb_t) 0)
-      >> (BITS_PER_GMP_LIMB - 1 - position % BITS_PER_GMP_LIMB);
-    p += li;
-    limb = *p & mask;
-  }
-
-  while (true) {
-    if (limb != 0)
-      return li*BITS_PER_GMP_LIMB + last_one(limb);
-    if (li == 0)
-      break;
-    --li;
-    --p;
-    limb = *p;
-  }
-  return ULONG_MAX;
-}
-
-bool
-PPL::Saturation_Row::operator[](const unsigned long k) const {
-  const mp_size_t vec_size = vec->_mp_size;
-  assert(vec_size >= 0);
-
-  unsigned long i = k / GMP_NUMB_BITS;
-  if (i >= static_cast<unsigned long>(vec_size))
-    return false;
-
-  mp_limb_t limb = *(vec->_mp_d + i);
-  return (limb >> (k % GMP_NUMB_BITS)) & 1;
-}
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-int
-PPL::compare(const Saturation_Row& x, const Saturation_Row& y) {
-  const mp_size_t x_size = x.vec->_mp_size;
-  assert(x_size >= 0);
-  const mp_size_t y_size = y.vec->_mp_size;
-  assert(y_size >= 0);
-  mp_size_t size = (x_size > y_size ? y_size : x_size);
-  mp_srcptr xp = x.vec->_mp_d;
-  mp_srcptr yp = y.vec->_mp_d;
-  while (size > 0) {
-    const mp_limb_t xl = *xp;
-    const mp_limb_t yl = *yp;
-    if (xl != yl) {
-      // Get the one's where they are different.
-      const mp_limb_t diff = xl ^ yl;
-      // First bit that is different.
-      const mp_limb_t mask = diff & ~(diff-1);
-      return (xl & mask) ? 1 : -1;
-    }
-    ++xp;
-    ++yp;
-    --size;
-  }
-  return x_size == y_size ? 0 : (x_size > y_size ? 1 : -1);
-}
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-bool
-PPL::subset_or_equal(const Saturation_Row& x, const Saturation_Row& y) {
-  mp_size_t x_size = x.vec->_mp_size;
-  assert(x_size >= 0);
-  mp_size_t y_size = y.vec->_mp_size;
-  assert(y_size >= 0);
-  if (x_size > y_size)
-    return false;
-  mp_srcptr xp = x.vec->_mp_d;
-  mp_srcptr yp = y.vec->_mp_d;
-  while (x_size > 0) {
-    if (*xp & ~*yp)
-      return false;
-    ++xp;
-    ++yp;
-    --x_size;
-  }
-  return true;
-}
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-bool
-PPL::subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
-		     bool& strict_subset) {
-  mp_size_t x_size = x.vec->_mp_size;
-  assert(x_size >= 0);
-  mp_size_t y_size = y.vec->_mp_size;
-  assert(y_size >= 0);
-  if (x_size > y_size)
-    return false;
-  strict_subset = (x_size < y_size);
-  mp_srcptr xp = x.vec->_mp_d;
-  mp_srcptr yp = y.vec->_mp_d;
-  while (x_size > 0) {
-    const mp_limb_t xl = *xp;
-    const mp_limb_t yl = *yp;
-    if (xl & ~yl)
-      return false;
-    if (!strict_subset && xl != yl)
-      strict_subset = true;
-    ++xp;
-    ++yp;
-    --x_size;
-  }
-  return true;
-}
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-bool
-PPL::strict_subset(const Saturation_Row& x, const Saturation_Row& y) {
-  mp_size_t x_size = x.vec->_mp_size;
-  assert(x_size >= 0);
-  mp_size_t y_size = y.vec->_mp_size;
-  assert(y_size >= 0);
-  if (x_size > y_size)
-    return false;
-  bool different = (x_size < y_size);
-  mp_srcptr xp = x.vec->_mp_d;
-  mp_srcptr yp = y.vec->_mp_d;
-  while (x_size > 0) {
-    const mp_limb_t xl = *xp;
-    const mp_limb_t yl = *yp;
-    if (xl & ~yl)
-      return false;
-    if (!different && xl != yl)
-      different = true;
-    ++xp;
-    ++yp;
-    --x_size;
-  }
-  return different;
-}
-
-/*! \relates Saturation_Row */
-bool
-PPL::operator==(const Saturation_Row& x, const Saturation_Row& y) {
-  const mp_size_t x_vec_size = x.vec->_mp_size;
-  assert(x_vec_size >= 0);
-  const mp_size_t y_vec_size = y.vec->_mp_size;
-  assert(y_vec_size >= 0);
-
-  if (x_vec_size != y_vec_size)
-    return false;
-
-  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) == 0;
-}
-
-/*! \relates Saturation_Row */
-bool
-PPL::operator!=(const Saturation_Row& x, const Saturation_Row& y) {
-  const mp_size_t x_vec_size = x.vec->_mp_size;
-  assert(x_vec_size >= 0);
-  const mp_size_t y_vec_size = y.vec->_mp_size;
-  assert(y_vec_size >= 0);
-
-  if (x_vec_size != y_vec_size)
-    return true;
-
-  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) != 0;
-}
-
-bool
-PPL::Saturation_Row::OK() const {
-  const mp_size_t vec_size = vec->_mp_size;
-  const mp_size_t vec_alloc = vec->_mp_alloc;
-  return vec_size >= 0
-    && vec_alloc >= vec_size
-    && (vec_size == 0 || mpz_getlimbn(vec, vec_size-1) != 0);
-}
diff --git a/src/Saturation_Row.defs.hh b/src/Saturation_Row.defs.hh
deleted file mode 100644
index 29c6d14..0000000
--- a/src/Saturation_Row.defs.hh
+++ /dev/null
@@ -1,239 +0,0 @@
-/* Saturation_Row class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Saturation_Row_defs_hh
-#define PPL_Saturation_Row_defs_hh 1
-
-#include "Saturation_Row.types.hh"
-#include "globals.types.hh"
-#include <iosfwd>
-#include <gmp.h>
-#include <vector>
-
-namespace Parma_Polyhedra_Library {
-
-// Put them in the namespace here to declare them friends later.
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator==(const Saturation_Row& x, const Saturation_Row& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator!=(const Saturation_Row& x, const Saturation_Row& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The basic comparison function.
-/*! \relates Saturation_Row
-  Compares \p x with \p y starting from the least significant bits.
-  The ordering is total and has the following property: if \p x and \p y
-  are two rows seen as sets of naturals, if \p x is a strict subset
-  of \p y, then \p x comes before \p y.
-
-  Returns
-  - -1 if \p x comes before \p y in the ordering;
-  -  0 if \p x and \p y are equal;
-  -  1 if \p x comes after \p y in the ordering.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-int compare(const Saturation_Row& x, const Saturation_Row& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Set-theoretic inclusion test.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Set-theoretic inclusion test: sets \p strict_subset to a boolean
-  indicating whether the inclusion is strict or not.
-
-  \relates Saturation_Row
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
-		     bool& strict_subset);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Set-theoretic strict inclusion test.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool strict_subset(const Saturation_Row& x, const Saturation_Row& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Set-theoretic union.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void set_union(const Saturation_Row& x,
-	       const Saturation_Row& y,
-	       Saturation_Row& z);
-
-} // namespace Parma_Polyhedra_Library
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A row of a saturation matrix.
-/*! \ingroup PPL_CXX_interface
-  An object of this class represents a single row of a saturation matrix.
-  The saturation row corresponds to a constraint and a system of generators
-  (resp., a generator and a system of constraints) and records whether or
-  not the constraint is saturated by each one of the generators (resp.,
-  the generator saturates each one of the constraints).
-
-  The saturation relation is encoded by using a bitset, so that the
-  constraint is saturated by the \f$i\f$-th generator in the system
-  (resp., the generator saturates the \f$i\f$-th constraint in the system)
-  if and only if the \f$i\f$-th bit is not set.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Saturation_Row {
-public:
-  //! Default constructor.
-  Saturation_Row();
-
-  //! Copy-constructor.
-  Saturation_Row(const Saturation_Row& y);
-
-  //! Destructor.
-  ~Saturation_Row();
-
-  //! Assignment operator.
-  Saturation_Row& operator=(const Saturation_Row& y);
-
-  //! Swaps \p *this with \p y.
-  void swap(Saturation_Row& y);
-
-  //! Returns the truth value corresponding to the bit in position \p k.
-  bool operator[](unsigned long k) const;
-
-  //! Sets the bit in position \p k.
-  void set(unsigned long k);
-
-  //! Clears the bit in position \p k.
-  void clear(unsigned long k);
-
-  //! Clears bits from position \p k (included) onward.
-  void clear_from(unsigned long k);
-
-  //! Clears all the bits of the row.
-  void clear();
-
-  friend int
-  Parma_Polyhedra_Library::compare(const Saturation_Row& x,
-				   const Saturation_Row& y);
-
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Saturation_Row& x,
-				      const Saturation_Row& y);
-
-  friend bool
-  Parma_Polyhedra_Library::operator!=(const Saturation_Row& x,
-				      const Saturation_Row& y);
-
-  friend bool
-  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
-					   const Saturation_Row& y);
-
-  friend bool
-  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
-					   const Saturation_Row& y,
-					   bool& strict_subset);
-
-  friend bool
-  Parma_Polyhedra_Library::strict_subset(const Saturation_Row& x,
-					 const Saturation_Row& y);
-
-  friend void
-  Parma_Polyhedra_Library::set_union(const Saturation_Row& x,
-				     const Saturation_Row& y,
-				     Saturation_Row& z);
-
-  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
-  unsigned long first() const;
-
-  /*! \brief
-    Returns the index of the first set bit after \p position
-    or ULONG_MAX if no bit after \p position is set.
-  */
-  unsigned long next(unsigned long position) const;
-
-  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
-  unsigned long last() const;
-
-  /*! \brief
-    Returns the index of the first set bit before \p position
-    or ULONG_MAX if no bits before \p position is set.
-  */
-  unsigned long prev(unsigned long position) const;
-
-  //! Returns the number of set bits in the row.
-  unsigned long count_ones() const;
-
-  //! Returns <CODE>true</CODE> if no bit is set in the row.
-  bool empty() const;
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
-
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
-
-  //! Checks if all the invariants are satisfied
-  bool OK() const;
-
-private:
-  //! Bit-vector representing the row.
-  mpz_t vec;
-
-  //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
-  static unsigned int first_one(mp_limb_t w);
-
-  //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
-  static unsigned int last_one(mp_limb_t w);
-};
-
-namespace std {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Saturation_Row& x,
-	  Parma_Polyhedra_Library::Saturation_Row& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void
-iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
-	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y);
-
-} // namespace std
-
-#include "Saturation_Row.inlines.hh"
-
-#endif // !defined(PPL_Saturation_Row_defs_hh)
diff --git a/src/Saturation_Row.inlines.hh b/src/Saturation_Row.inlines.hh
deleted file mode 100644
index e8e9d4f..0000000
--- a/src/Saturation_Row.inlines.hh
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Saturation_Row class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_Saturation_Row_inlines_hh
-#define PPL_Saturation_Row_inlines_hh 1
-
-#include <cassert>
-// For the declaration of ffs(3).
-#include <cstring>
-
-namespace Parma_Polyhedra_Library {
-
-inline
-Saturation_Row::Saturation_Row() {
-  mpz_init(vec);
-}
-
-inline
-Saturation_Row::Saturation_Row(const Saturation_Row& y) {
-  mpz_init_set(vec, y.vec);
-}
-
-inline
-Saturation_Row::~Saturation_Row() {
-  mpz_clear(vec);
-}
-
-inline Saturation_Row&
-Saturation_Row::operator=(const Saturation_Row& y) {
-  mpz_set(vec, y.vec);
-  return *this;
-}
-
-inline void
-Saturation_Row::set(const unsigned long k) {
-  mpz_setbit(vec, k);
-}
-
-inline void
-Saturation_Row::clear(const unsigned long k) {
-  mpz_clrbit(vec, k);
-}
-
-inline void
-Saturation_Row::clear_from(const unsigned long k) {
-  mpz_tdiv_r_2exp(vec, vec, k);
-}
-
-inline unsigned long
-Saturation_Row::count_ones() const {
-  assert(vec->_mp_size >= 0);
-  return mpn_popcount(vec->_mp_d, vec->_mp_size);
-}
-
-inline bool
-Saturation_Row::empty() const {
-  return mpz_sgn(vec) == 0;
-}
-
-inline void
-Saturation_Row::swap(Saturation_Row& y) {
-  mpz_swap(vec, y.vec);
-}
-
-inline void
-Saturation_Row::clear() {
-  mpz_set_ui(vec, 0UL);
-}
-
-inline memory_size_type
-Saturation_Row::external_memory_in_bytes() const {
-  return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
-}
-
-inline memory_size_type
-Saturation_Row::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
-
-#if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
-
-inline unsigned int
-Saturation_Row::first_one(mp_limb_t w) {
-  return ffs(w)-1;
-}
-
-#endif
-
-/*! \relates Saturation_Row */
-inline void
-set_union(const Saturation_Row& x, const Saturation_Row& y,
-	  Saturation_Row& z) {
-  mpz_ior(z.vec, x.vec, y.vec);
-}
-
-} // namespace Parma_Polyhedra_Library
-
-
-namespace std {
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-inline void
-swap(Parma_Polyhedra_Library::Saturation_Row& x,
-     Parma_Polyhedra_Library::Saturation_Row& y) {
-  x.swap(y);
-}
-
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-inline void
-iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
-	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
-  swap(*x, *y);
-}
-
-} // namespace std
-
-#endif // !defined(PPL_Saturation_Row_inlines_hh)
diff --git a/src/Saturation_Row.types.hh b/src/Saturation_Row.types.hh
deleted file mode 100644
index 8a97747..0000000
--- a/src/Saturation_Row.types.hh
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is free software; as a special exception the author 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. */
-
-#ifndef PPL_Saturation_Row_types_hh
-#define PPL_Saturation_Row_types_hh 1
-
-namespace Parma_Polyhedra_Library {
-
-class Saturation_Row;
-
-} // namespace Parma_Polyhedra_Library
-
-#endif // !defined(PPL_Saturation_Row_types_hh)
diff --git a/src/Scalar_Products.cc b/src/Scalar_Products.cc
index 0c9dec3..e2fbeb8 100644
--- a/src/Scalar_Products.cc
+++ b/src/Scalar_Products.cc
@@ -1,11 +1,11 @@
 /* Scalar_Products class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Scalar_Products.defs.hh"
 #include "Coefficient.defs.hh"
@@ -41,6 +41,18 @@ PPL::Scalar_Products::assign(Coefficient& z,
 
 void
 PPL::Scalar_Products::assign(Coefficient& z,
+			     const Constraint& x, const Generator& y) {
+  // Scalar product is only defined if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+  for (dimension_type i = x.size(); i-- > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
 			     const Grid_Generator& x, const Congruence& y) {
   // Scalar product is only defined if `x' and `y' are
   // dimension-compatible.
@@ -54,6 +66,19 @@ PPL::Scalar_Products::assign(Coefficient& z,
 
 void
 PPL::Scalar_Products::assign(Coefficient& z,
+			     const Constraint& x,
+			     const Grid_Generator& y) {
+  // Scalar product is only defined if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+  for (dimension_type i = x.size(); i-- > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
 			     const Congruence& x, const Grid_Generator& y) {
   // Scalar product is only defined if `x' and `y' are
   // dimension-compatible.
@@ -119,3 +144,17 @@ PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
     // The following line optimizes the computation of z += x[i] * y[i].
     add_mul_assign(z, x[i], y[i]);
 }
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+					 const Grid_Generator& x,
+					 const Constraint& y) {
+  // Scalar product is only defined if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() - 1 <= y.size());
+  z = 0;
+  // Note the pre-decrement of `i': last iteration should be for `i == 1'.
+  for (dimension_type i = x.size() - 1; --i > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
diff --git a/src/Scalar_Products.defs.hh b/src/Scalar_Products.defs.hh
index c22a3f8..9a51a84 100644
--- a/src/Scalar_Products.defs.hh
+++ b/src/Scalar_Products.defs.hh
@@ -1,11 +1,11 @@
 /* Scalar_Products class definition.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -40,7 +40,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   that the space dimension of the first object <CODE>x</CODE> is less
   than or equal to the space dimension of the second object <CODE>y</CODE>.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 class Parma_Polyhedra_Library::Scalar_Products {
 public:
   //! Computes the scalar product of \p x and \p y and assigns it to \p z.
@@ -49,6 +49,9 @@ public:
   static void assign(Coefficient& z, const Constraint& c, const Generator& g);
   //! Computes the scalar product of \p g and \p c and assigns it to \p z.
   static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Constraint& c, const Grid_Generator& g);
   //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
   static void assign(Coefficient& z,
 		     const Grid_Generator& g, const Congruence& cg);
@@ -62,6 +65,8 @@ public:
   static int sign(const Constraint& c, const Generator& g);
   //! Returns the sign of the scalar product between \p g and \p c.
   static int sign(const Generator& g, const Constraint& c);
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Grid_Generator& g);
 
   /*! \brief
     Computes the \e reduced scalar product of \p x and \p y,
@@ -123,6 +128,12 @@ public:
 				 const Linear_Expression& e,
 				 const Generator& g);
   //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p c,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Grid_Generator& g, const Constraint& c);
+  //! \brief
   //! Computes the \e homogeneous scalar product of \p g and \p cg,
   //! where the inhomogeneous terms are ignored,
   //! and assigns the result to \p z.
@@ -151,12 +162,16 @@ public:
   //! where the inhomogeneous terms are ignored,
   static int homogeneous_sign(const Linear_Expression& e,
 			      const Grid_Generator& g);
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p g and \p c,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Grid_Generator& g, const Constraint& c);
 };
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Scalar product sign function object depending on topology.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
 public:
   //! Constructs the function object according to the topology of \p c.
diff --git a/src/Scalar_Products.inlines.hh b/src/Scalar_Products.inlines.hh
index 95bb409..1bc63d3 100644
--- a/src/Scalar_Products.inlines.hh
+++ b/src/Scalar_Products.inlines.hh
@@ -1,11 +1,11 @@
 /* Scalar_Products class implementation (inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -66,6 +66,13 @@ Scalar_Products::sign(const Generator& g, const Constraint& c) {
 }
 
 inline int
+Scalar_Products::sign(const Constraint& c, const Grid_Generator& g) {
+  TEMP_INTEGER(z);
+  assign(z, c, g);
+  return sgn(z);
+}
+
+inline int
 Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
   return reduced_sign(static_cast<const Linear_Row&>(c),
 		      static_cast<const Linear_Row&>(g));
@@ -109,6 +116,14 @@ Scalar_Products::homogeneous_sign(const Linear_Expression& e,
 			  static_cast<const Linear_Row&>(g));
 }
 
+inline int
+Scalar_Products::homogeneous_sign(const Grid_Generator& g,
+				  const Constraint& c) {
+  TEMP_INTEGER(z);
+  homogeneous_assign(z, g, c);
+  return sgn(z);
+}
+
 inline
 Topology_Adjusted_Scalar_Product_Sign
 ::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
diff --git a/src/Scalar_Products.types.hh b/src/Scalar_Products.types.hh
index b363999..49dd522 100644
--- a/src/Scalar_Products.types.hh
+++ b/src/Scalar_Products.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Slow_Copy.hh b/src/Slow_Copy.hh
new file mode 100644
index 0000000..8994e85
--- /dev/null
+++ b/src/Slow_Copy.hh
@@ -0,0 +1,60 @@
+/* Basic Slow_Copy classes declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Slow_Copy_hh
+#define PPL_Slow_Copy_hh 1
+
+#include "meta_programming.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are not slow by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Slow_Copy : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpz_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpz_class> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpq_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpq_class> : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Slow_Copy_hh)
diff --git a/src/Temp.defs.hh b/src/Temp.defs.hh
new file mode 100644
index 0000000..09c3b97
--- /dev/null
+++ b/src/Temp.defs.hh
@@ -0,0 +1,160 @@
+/* Temp_* classes declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Temp_defs_hh
+#define PPL_Temp_defs_hh 1
+
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A pool of temporary items of type \p T.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Item {
+public:
+  //! Obtains a refeence to a temporary item.
+  static Temp_Item& obtain();
+
+  //! Releases the temporary item \p p.
+  static void release(Temp_Item& p);
+
+  //! Returns a reference to the encapsulated item.
+  T& item();
+
+private:
+  //! The encapsulated item.
+  T item_;
+
+  //! Pointer to the next item in the free list.
+  Temp_Item* next;
+
+  //! Head of the free list.
+  static Temp_Item* free_list_head;
+
+  //! Default constructor.
+  Temp_Item();
+
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Item(const Temp_Item&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Item& operator=(const Temp_Item&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An holder for a reference to a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Reference_Holder {
+public:
+  //! Constructs an holder holding \p p.
+  Temp_Reference_Holder(Temp_Item<T>& p);
+
+  //! Destructor.
+  ~Temp_Reference_Holder();
+
+  //! Returns a reference to the held item.
+  T& item();
+
+private:
+  //! The held item, encapsulated.
+  Temp_Item<T>& held;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An (fake) holder for the value of a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Value_Holder {
+public:
+  //! Constructs a fake holder.
+  Temp_Value_Holder();
+
+  //! Returns the value of the held item.
+  T item();
+
+private:
+  //! The held item.
+  T item_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for handling temporaries with a global free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Temp_From_Free_List {
+  //! The type of the temporaries.
+  typedef T& type;
+
+  //! The type of the holder.
+  typedef Temp_Reference_Holder<T> holder_type;
+
+  //! Obtain the holder for a new temporary.
+  static holder_type obtain_holder();
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for handling temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Temp_From_Local_Variable {
+  //! The type of the temporaries.
+  typedef T type;
+
+  //! The type of the holder.
+  typedef Temp_Value_Holder<T> holder_type;
+
+  //! Obtain the holder for a new temporary.
+  static holder_type obtain_holder();
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for the efficient handling of temporaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+class Dirty_Temp;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with a free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<Slow_Copy<T>::value>::type>
+  : public Temp_From_Free_List<T> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<!Slow_Copy<T>::value>::type>
+  : public Temp_From_Local_Variable<T> {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Temp.inlines.hh"
+#include "Temp.templates.hh"
+
+#endif // !defined(PPL_Temp_defs_hh)
diff --git a/src/Temp.inlines.hh b/src/Temp.inlines.hh
new file mode 100644
index 0000000..a9b09f6
--- /dev/null
+++ b/src/Temp.inlines.hh
@@ -0,0 +1,115 @@
+/* Temp_* classes implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Temp_inlines_hh
+#define PPL_Temp_inlines_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Temp_Item<T>::Temp_Item()
+  : item_() {
+}
+
+template <typename T>
+inline T&
+Temp_Item<T>::item() {
+    return item_;
+}
+
+template <typename T>
+inline Temp_Item<T>&
+Temp_Item<T>::obtain() {
+  if (free_list_head != 0) {
+    Temp_Item* p = free_list_head;
+    free_list_head = free_list_head->next;
+    return *p;
+  }
+  else
+    return *new Temp_Item();
+}
+
+template <typename T>
+inline void
+Temp_Item<T>::release(Temp_Item& p) {
+  p.next = free_list_head;
+  free_list_head = &p;
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::Temp_Reference_Holder(Temp_Item<T>& p)
+  : held(p) {
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::~Temp_Reference_Holder() {
+  Temp_Item<T>::release(held);
+}
+
+template <typename T>
+inline T&
+Temp_Reference_Holder<T>::item() {
+  return held.item();
+}
+
+template <typename T>
+inline
+Temp_Value_Holder<T>::Temp_Value_Holder() {
+}
+
+template <typename T>
+inline T
+Temp_Value_Holder<T>::item() {
+  return item_;
+}
+
+template <typename T>
+inline typename Temp_From_Free_List<T>::holder_type
+Temp_From_Free_List<T>::obtain_holder() {
+  return Temp_Reference_Holder<T>(Temp_Item<T>::obtain());
+}
+
+template <typename T>
+inline typename Temp_From_Local_Variable<T>::holder_type
+Temp_From_Local_Variable<T>::obtain_holder() {
+  return Temp_Value_Holder<T>();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#define DIRTY_TEMP(T, id)						\
+  typename Parma_Polyhedra_Library::Dirty_Temp<T>::holder_type holder ## id = \
+    Parma_Polyhedra_Library::Dirty_Temp<T>::obtain_holder();		\
+  typename Parma_Polyhedra_Library::Dirty_Temp<T>::type id =		\
+    holder ## id.item()
+
+#define DIRTY_TEMP0(T, id)						\
+  Parma_Polyhedra_Library::Dirty_Temp<T>::holder_type holder ## id =	\
+    Parma_Polyhedra_Library::Dirty_Temp<T>::obtain_holder();		\
+  Parma_Polyhedra_Library::Dirty_Temp<T>::type id = holder ## id.item()
+
+#endif // !defined(PPL_Temp_inlines_hh)
diff --git a/src/Temp.templates.hh b/src/Temp.templates.hh
new file mode 100644
index 0000000..4c9f802
--- /dev/null
+++ b/src/Temp.templates.hh
@@ -0,0 +1,33 @@
+/* Temp_* classes implementation: non-inline template members.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Temp_templates_hh
+#define PPL_Temp_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Temp_Item<T>* Temp_Item<T>::free_list_head = 0;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Temp_templates_hh)
diff --git a/src/Topology.hh b/src/Topology.hh
index 1c9d7a2..b2e39fc 100644
--- a/src/Topology.hh
+++ b/src/Topology.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -17,7 +17,7 @@ namespace Parma_Polyhedra_Library {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Kinds of polyhedra domains.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 enum Topology {
   NECESSARILY_CLOSED = 0,
   NOT_NECESSARILY_CLOSED = 1
diff --git a/src/Variable.cc b/src/Variable.cc
index f6707ed..bcc9711 100644
--- a/src/Variable.cc
+++ b/src/Variable.cc
@@ -1,11 +1,11 @@
 /* Variable class implementation (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,10 +20,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
-
+#include <ppl-config.h>
 #include "Variable.defs.hh"
-
 #include <iostream>
 
 namespace PPL = Parma_Polyhedra_Library;
diff --git a/src/Variable.defs.hh b/src/Variable.defs.hh
index ae623c9..77d7ba7 100644
--- a/src/Variable.defs.hh
+++ b/src/Variable.defs.hh
@@ -1,11 +1,11 @@
 /* Variable class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -83,7 +83,7 @@ public:
   //! Builds the variable corresponding to the Cartesian axis of index \p i.
   /*!
     \exception std::length_error
-    Thrown if the <CODE>i+1</CODE> exceeds
+    Thrown if <CODE>i+1</CODE> exceeds
     <CODE>Variable::max_space_dimension()</CODE>.
   */
   explicit Variable(dimension_type i);
@@ -145,12 +145,4 @@ private:
 
 #include "Variable.inlines.hh"
 
-namespace Parma_Polyhedra_Library {
-
-//! An std::set containing variables in increasing order of dimension index.
-/*! \ingroup PPL_CXX_interface */
-typedef std::set<Variable, Variable::Compare> Variables_Set;
-
-} // namespace Parma_Polyhedra_Library
-
 #endif // !defined(PPL_Variable_defs_hh)
diff --git a/src/Variable.inlines.hh b/src/Variable.inlines.hh
index 7be957c..ad09b50 100644
--- a/src/Variable.inlines.hh
+++ b/src/Variable.inlines.hh
@@ -1,11 +1,11 @@
 /* Variable class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/src/Variable.types.hh b/src/Variable.types.hh
index 58d4a05..08dae0d 100644
--- a/src/Variable.types.hh
+++ b/src/Variable.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/Variables_Set.cc b/src/Variables_Set.cc
new file mode 100644
index 0000000..ced56aa
--- /dev/null
+++ b/src/Variables_Set.cc
@@ -0,0 +1,90 @@
+/* Variables_Set class implementation (non-inline functions).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "Variables_Set.defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Variables_Set::Variables_Set(const Variable& v, const Variable& w)
+  : Base() {
+  for (dimension_type d = v.id(), last = w.id(); d <= last; ++d)
+    insert(d);
+}
+
+bool
+PPL::Variables_Set::OK() const {
+  for (const_iterator i = begin(), set_end = end(); i != set_end; ++i)
+    if (!Variable(*i).OK())
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Variables_Set& vs) {
+  s << '{';
+  for (Variables_Set::const_iterator i = vs.begin(),
+	 vs_end = vs.end(); i != vs_end; ) {
+    s << ' ' << Variable(*i++);
+    if (i != vs_end)
+      s << ',';
+  }
+  s << " }";
+  return s;
+}
+
+void
+PPL::Variables_Set::ascii_dump(std::ostream& s) const {
+  dimension_type variables_set_size = size();
+  s << "\nvariables( " << variables_set_size << " )\n";
+  for (Variables_Set::const_iterator i = begin(),
+	 i_end = end(); i != i_end; ++i)
+    s << *i << " ";
+}
+
+PPL_OUTPUT_DEFINITIONS(Variables_Set)
+
+bool
+PPL::Variables_Set::ascii_load(std::istream& s) {
+  clear();
+  std::string str;
+ if (!(s >> str) || str != "variables(")
+    return false;
+
+  dimension_type size;
+
+  if (!(s >> size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  dimension_type variable_value;
+  for (dimension_type i = 0; i < size; ++i) {
+    if (!(s >> variable_value))
+      return false;
+    insert(variable_value);
+  }
+  return true;
+}
diff --git a/src/Variables_Set.defs.hh b/src/Variables_Set.defs.hh
new file mode 100644
index 0000000..11a4a9c
--- /dev/null
+++ b/src/Variables_Set.defs.hh
@@ -0,0 +1,108 @@
+/* Variables_Set class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Variables_Set_defs_hh
+#define PPL_Variables_Set_defs_hh 1
+
+#include "Variables_Set.types.hh"
+#include "Variable.defs.hh"
+#include "globals.types.hh"
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+operator<<(std::ostream& s, const Variables_Set& v);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! An std::set of variables' indexes.
+class Parma_Polyhedra_Library::Variables_Set
+  : public std::set<dimension_type> {
+private:
+  typedef std::set<dimension_type> Base;
+
+public:
+  //! Builds the empty set of variable indexes.
+  Variables_Set();
+
+  //! Builds the singleton set of indexes containing <CODE>v.id()</CODE>;
+  explicit Variables_Set(const Variable& v);
+
+  /*! \brief
+    Builds the set of variables's indexes in the range from
+    <CODE>v.id()</CODE> to <CODE>w.id()</CODE>.
+
+    If <CODE>v.id() <= w.id()</CODE>, this constructor builds the
+    set of variables' indexes
+    <CODE>v.id()</CODE>, <CODE>v.id()+1</CODE>, ..., <CODE>w.id()</CODE>.
+    The empty set it built otherwise.
+  */
+  Variables_Set(const Variable& v, const Variable& w);
+
+  //! Returns the maximum space dimension a Variables_Set can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns the dimension of the smallest vector space enclosing all
+    the variables whose indexes are in the set.
+  */
+  dimension_type space_dimension() const;
+
+  //! Inserts the index of variavle \p v into the set.
+  void insert(Variable v);
+  // The `insert' method above overloads (instead of hiding) the
+  // other `insert' method of std::set.
+  using Base::insert;
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+};
+
+#include "Variables_Set.inlines.hh"
+
+#endif // !defined(PPL_Variables_Set_defs_hh)
diff --git a/src/Variables_Set.inlines.hh b/src/Variables_Set.inlines.hh
new file mode 100644
index 0000000..63630eb
--- /dev/null
+++ b/src/Variables_Set.inlines.hh
@@ -0,0 +1,74 @@
+/* Variables_Set class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Variables_Set_inlines_hh
+#define PPL_Variables_Set_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Variables_Set::Variables_Set()
+  : Base() {
+}
+
+inline void
+Variables_Set::insert(const Variable v) {
+  insert(v.id());
+}
+
+inline
+Variables_Set::Variables_Set(const Variable& v)
+  : Base() {
+  insert(v);
+}
+
+inline dimension_type
+Variables_Set::max_space_dimension() {
+  return Variable::max_space_dimension();
+}
+
+inline dimension_type
+Variables_Set::space_dimension() const {
+  reverse_iterator i = rbegin();
+  return i == rend() ? 0 : *i+1;
+}
+
+inline memory_size_type
+Variables_Set::external_memory_in_bytes() const {
+  // We assume sets are implemented by means of red-black trees that
+  // require to store the color (we assume an enum) and three pointers
+  // to the parent, left and right child, respectively.
+  enum color { red, black };
+  return size() * (sizeof(color) + 3*sizeof(void*) + sizeof(dimension_type));
+}
+
+inline memory_size_type
+Variables_Set::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variables_Set_inlines_hh)
diff --git a/src/Variables_Set.types.hh b/src/Variables_Set.types.hh
new file mode 100644
index 0000000..cdae2ef
--- /dev/null
+++ b/src/Variables_Set.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_Variables_Set_types_hh
+#define PPL_Variables_Set_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variables_Set_types_hh)
diff --git a/src/Widening_Function.defs.hh b/src/Widening_Function.defs.hh
index 4b95190..6ba7efc 100644
--- a/src/Widening_Function.defs.hh
+++ b/src/Widening_Function.defs.hh
@@ -1,11 +1,11 @@
 /* Widening_Function class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,7 +29,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Wraps a widening method into a function object.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename PH>
 class Parma_Polyhedra_Library::Widening_Function {
 public:
@@ -56,7 +56,7 @@ private:
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Wraps a limited widening method into a function object.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename PH, typename CS>
 class Parma_Polyhedra_Library::Limited_Widening_Function {
 public:
@@ -95,7 +95,7 @@ namespace Parma_Polyhedra_Library {
 
 //! Wraps a widening method into a function object.
 /*!
-  \relates Polyhedra_Powerset
+  \relates Pointset_Powerset
 
   \param wm
   The widening method.
@@ -106,7 +106,7 @@ widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
 
 //! Wraps a limited widening method into a function object.
 /*!
-  \relates Polyhedra_Powerset
+  \relates Pointset_Powerset
 
   \param lwm
   The limited widening method.
diff --git a/src/Widening_Function.inlines.hh b/src/Widening_Function.inlines.hh
index 33d254d..89b730a 100644
--- a/src/Widening_Function.inlines.hh
+++ b/src/Widening_Function.inlines.hh
@@ -1,11 +1,11 @@
 /* Widening_Function class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -53,14 +53,14 @@ operator()(PH& x, const PH& y, unsigned* tp) const {
   (x.*lw_method)(y, limiting_cs, tp);
 }
 
-/*! \relates Polyhedra_Powerset */
+/*! \relates Pointset_Powerset */
 template <typename PH>
 inline Widening_Function<PH>
 widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
   return Widening_Function<PH>(wm);
 }
 
-/*! \relates Polyhedra_Powerset */
+/*! \relates Pointset_Powerset */
 template <typename PH, typename CS>
 inline Limited_Widening_Function<PH, CS>
 widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
diff --git a/src/Widening_Function.types.hh b/src/Widening_Function.types.hh
index 2bc68b8..4c1f895 100644
--- a/src/Widening_Function.types.hh
+++ b/src/Widening_Function.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/src/algorithms.hh b/src/algorithms.hh
index 37f0eca..47b30f6 100644
--- a/src/algorithms.hh
+++ b/src/algorithms.hh
@@ -1,11 +1,11 @@
 /* A collection of useful convex polyhedra algorithms: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,7 +24,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_algorithms_hh 1
 
 #include "NNC_Polyhedron.defs.hh"
-#include "Polyhedra_Powerset.defs.hh"
+#include "Pointset_Powerset.defs.hh"
 #include <utility>
 #include <cassert>
 
@@ -38,24 +38,24 @@ namespace Parma_Polyhedra_Library {
 
   \relates Polyhedron
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename PH>
 bool
 poly_hull_assign_if_exact(PH& p, const PH& q);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates Polyhedron */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename PH>
 bool
 poly_hull_assign_if_exact(PH& p, const PH& q) {
   PH phull = p;
   NNC_Polyhedron nnc_p(p);
   phull.poly_hull_assign(q);
-  std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+  std::pair<PH, Pointset_Powerset<NNC_Polyhedron> >
     partition = linear_partition(q, phull);
-  const Polyhedra_Powerset<NNC_Polyhedron>& s = partition.second;
-  typedef Polyhedra_Powerset<NNC_Polyhedron>::const_iterator iter;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
   for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
     // The polyhedral hull is exact if and only if all the elements
     // of the partition of the polyhedral hull of `p' and `q' with
diff --git a/src/assign_or_swap.hh b/src/assign_or_swap.hh
new file mode 100644
index 0000000..5039f5f
--- /dev/null
+++ b/src/assign_or_swap.hh
@@ -0,0 +1,69 @@
+/* The assign_or_swap() utility functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_assign_or_swap_hh
+#define PPL_assign_or_swap_hh 1
+
+#include "meta_programming.hh"
+#include "Has_Assign_Or_Swap.hh"
+#include "Slow_Copy.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is an assign_or_swap() method, use it.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Has_Assign_Or_Swap<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to.assign_or_swap(from);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() method but copies are not slow, copy.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && !Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to = from;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() and copies are slow, delegate to std::swap().
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  std::swap(to, from);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_assign_or_swap_hh)
diff --git a/src/checked.cc b/src/checked.cc
index bb79ec3..043483c 100644
--- a/src/checked.cc
+++ b/src/checked.cc
@@ -1,11 +1,11 @@
 /* Helper functions for checked numbers
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,8 +20,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include "checked.defs.hh"
+#include <climits>
 
 namespace Parma_Polyhedra_Library {
 
@@ -195,7 +196,7 @@ parse_number_part(std::istream& is, number_struct& num) {
       goto fractional;
     case FRACTIONAL:
       if (get_digit(c, num.base) >= 0) {
-	exponent_offset--;
+	--exponent_offset;
 	if (c != '0' || !num.mantissa.empty())
 	  num.mantissa += (char) c;
 	empty_mantissa = false;
@@ -247,7 +248,7 @@ parse_number_part(std::istream& is, number_struct& num) {
     unsigned int n = num.mantissa.size();
     while (n > 0 && num.mantissa[n - 1] == '0') {
       --n;
-      exponent_offset++;
+      ++exponent_offset;
     }
     num.mantissa.erase(n);
     bool neg;
diff --git a/src/checked.defs.hh b/src/checked.defs.hh
index 47ae3a3..4a59e7d 100644
--- a/src/checked.defs.hh
+++ b/src/checked.defs.hh
@@ -1,11 +1,11 @@
 /* Abstract checked arithmetic function container
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,32 +25,16 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include <iostream>
 #include <gmpxx.h>
+#include "mp_std_bits.defs.hh"
+#include "Temp.defs.hh"
 #include "Rounding_Dir.defs.hh"
 #include "Numeric_Format.defs.hh"
+#include "Float.defs.hh"
 
 namespace Parma_Polyhedra_Library {
 
 namespace Checked {
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A policy checking for overflows.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Check_Overflow_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 0;
-  static const int handle_infinity = 0;
-  static const int convertible = 1;
-  static const int fpu_check_inexact = 0;
-  static const int check_nan_args = 1;
-};
 
 // It is a pity that function partial specialization is not permitted
 // by C++.  To (partly) overcome this limitation, we use class
@@ -116,215 +100,226 @@ inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a
 }
 
 #define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
-template <typename Policy, typename type1, typename type2> \
+template <typename Policy1, typename Policy2, typename type1, typename type2>	     \
 struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2> \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
 inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2); \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2>::function(arg1, arg2); \
 }
 
 #define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
-template <typename Policy, typename type1, typename type2> \
+template <typename Policy1, typename Policy2, typename type1, typename type2>		\
 struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2> \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
 inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1); \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2>::function(arg1, arg2, a1); \
 }
 
 #define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
-template <typename Policy, typename type1, typename type2> \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
 struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2> \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
 inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1, a2); \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2>::function(arg1, arg2, a1, a2); \
 }
 
 #define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
-template <typename Policy, typename type1, typename type2, typename type3> \
+template <typename Policy1, typename Policy2, typename Policy3, typename type1, typename type2, typename type3> \
 struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2, typename type3> \
+template <typename Policy1, typename Policy2, typename Policy3, typename type1, typename type2, typename type3> \
 inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
 }
 
 #define DECLARE_FUN5_0_1(name, ret_type,				\
 			 qual1, type1, qual2, type2, qual3, type3,	\
 			 qual4, type4, qual5, type5,			\
 			 after1)					\
-template <typename Policy,						\
+template <typename Policy1, typename Policy2, typename Policy3,		\
+	  typename Policy4,typename Policy5,				\
 	  typename type1, typename type2, typename type3,		\
 	  typename type4, typename type5>				\
 struct FUNCTION_CLASS(name);						\
-template <typename Policy,						\
+template <typename Policy1, typename Policy2, typename Policy3,		\
+	  typename Policy4,typename Policy5,				\
 	  typename type1, typename type2, typename type3,		\
 	  typename type4, typename type5>				\
 inline ret_type name(qual1 type1& arg1, qual2 type2& arg2,		\
 		     qual3 type3& arg3, qual4 type4& arg4,		\
 		     qual5 type5& arg5,	after1 a1) {			\
-  return FUNCTION_CLASS(name)<Policy, type1, type2, type3, type4, type5> \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, Policy4, Policy5, type1, type2, type3, type4, type5> \
     ::function(arg1, arg2, arg3, arg4, arg5, a1);			\
 }
 
-#define SPECIALIZE_FUN1_0_0(name, suf, ret_type, qual, type) \
+#define SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(qual type& arg) { \
-    return name ## _ ## suf<Policy>(arg); \
+    return func<Policy>(arg); \
   } \
 };
 
-#define SPECIALIZE_FUN1_0_1(name, suf, ret_type, qual, type, after1) \
+#define SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(qual type& arg, after1 a1) { \
-    return name ## _ ## suf<Policy>(arg, a1); \
+    return func<Policy>(arg, a1); \
   } \
 };
 
-#define SPECIALIZE_FUN1_0_2(name, suf, ret_type, qual, type, after1, after2) \
+#define SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type, after1, after2) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(arg, a1, a2); \
+    return func<Policy>(arg, a1, a2); \
   } \
 };
 
-#define SPECIALIZE_FUN1_0_3(name, suf, ret_type, qual, type, after1, after2, after3) \
+#define SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type, after1, after2, after3) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
-    return name ## _ ## suf<Policy>(arg, a1, a2, a3); \
+    return func<Policy>(arg, a1, a2, a3); \
   } \
 };
 
-#define SPECIALIZE_FUN1_1_1(name, suf, ret_type, before1, qual, type, after1) \
+#define SPECIALIZE_FUN1_1_1(name, func, ret_type, before1, qual, type, after1) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
-    return name ## _ ## suf<Policy>(b1, arg, a1); \
+    return func<Policy>(b1, arg, a1); \
   } \
 };
 
-#define SPECIALIZE_FUN1_1_2(name, suf, ret_type, before1, qual, type, after1, after2) \
+#define SPECIALIZE_FUN1_1_2(name, func, ret_type, before1, qual, type, after1, after2) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(b1, arg, a1, a2); \
+    return func<Policy>(b1, arg, a1, a2); \
   } \
 };
 
-#define SPECIALIZE_FUN1_2_2(name, suf, ret_type, before1, before2, qual, type, after1, after2) \
+#define SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, qual, type, after1, after2) \
 template <typename Policy> \
 struct FUNCTION_CLASS(name)<Policy, type> { \
   static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(b1, b2, arg, a1, a2); \
+    return func<Policy>(b1, b2, arg, a1, a2); \
   } \
 };
 
-#define SPECIALIZE_FUN2_0_0(name, suf, ret_type, qual1, type1, qual2, type2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+#define SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy1, typename Policy2>				\
+struct FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2> { \
   static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
-    return name ## _ ## suf<Policy>(arg1, arg2); \
+    return func<Policy1, Policy2>(arg1, arg2); \
   } \
 };
 
-#define SPECIALIZE_FUN2_0_1(name, suf, ret_type, qual1, type1, qual2, type2, after1) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+#define SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy1, typename Policy2> \
+struct FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2> { \
   static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
-    return name ## _ ## suf<Policy>(arg1, arg2, a1); \
+    return func<Policy1, Policy2>(arg1, arg2, a1); \
   } \
 };
 
-#define SPECIALIZE_FUN2_0_2(name, suf, ret_type, qual1, type1, qual2, type2, after1, after2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+#define SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy1, typename Policy2> \
+struct FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2> { \
   static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(arg1, arg2, a1, a2); \
+    return func<Policy1, Policy2>(arg1, arg2, a1, a2); \
   } \
 };
 
-#define SPECIALIZE_FUN3_0_1(name, suf, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name) <Policy, type1, type2, type3> { \
+#define SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy1, typename Policy2, typename Policy3>			\
+struct FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, type1, type2, type3> { \
   static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
-    return name ## _ ## suf<Policy>(arg1, arg2, arg3, a1); \
+    return func<Policy1, Policy2, Policy3>(arg1, arg2, arg3, a1); \
   } \
 };
 
-#define SPECIALIZE_FUN5_0_1(name, suf, ret_type,			\
+#define SPECIALIZE_FUN5_0_1(name, func, ret_type,			\
 			    qual1, type1, qual2, type2, qual3, type3,	\
 			    qual4, type4, qual5, type5, after1)		\
-template <typename Policy>						\
-struct FUNCTION_CLASS(name) <Policy,					\
-			     type1, type2, type3, type4, type5> {	\
+  template <typename Policy1, typename Policy2, typename Policy3,	\
+	    typename Policy4, typename Policy5>				\
+  struct FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, Policy4, Policy5, \
+			       type1, type2, type3, type4, type5> {	\
   static inline Result							\
   function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3,	\
 	   qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) {		\
-    return name ## _ ## suf<Policy>(arg1, arg2, arg3, arg4, arg5, a1);	\
+    return func<Policy1, Policy2, Policy3, Policy4, Policy5>(arg1, arg2, arg3, arg4, arg5, a1);	\
   }									\
 };
 
 #define nonconst
 
-#define SPECIALIZE_COPY(suf, Type) \
-  SPECIALIZE_FUN2_0_0(copy, suf, void, nonconst, Type, const, Type)
-#define SPECIALIZE_SGN(suf, From) \
-  SPECIALIZE_FUN1_0_0(sgn, suf, Result, const, From)
-#define SPECIALIZE_CMP(suf, Type1, Type2) \
-  SPECIALIZE_FUN2_0_0(cmp, suf, Result, const, Type1, const, Type2)
-#define SPECIALIZE_SET_SPECIAL(suf, Type) \
-  SPECIALIZE_FUN1_0_1(set_special, suf, Result, nonconst, Type, Result)
-#define SPECIALIZE_CLASSIFY(suf, Type) \
-  SPECIALIZE_FUN1_0_3(classify, suf, Result, const, Type, bool, bool, bool)
-#define SPECIALIZE_IS_NAN(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_nan, suf, bool, const, Type)
-#define SPECIALIZE_IS_MINF(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_minf, suf, bool, const, Type)
-#define SPECIALIZE_IS_PINF(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_pinf, suf, bool, const, Type)
-#define SPECIALIZE_IS_INT(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_int, suf, bool, const, Type)
-#define SPECIALIZE_CONSTRUCT(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(construct, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_ASSIGN(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(assign, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_NEG(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(neg, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_ABS(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(abs, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_SQRT(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(sqrt, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_ADD(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(add, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_SUB(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(sub, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_MUL(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_DIV(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(div, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_REM(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(rem, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_MUL2EXP(suf, To, From) \
-  SPECIALIZE_FUN2_0_2(mul2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
-#define SPECIALIZE_DIV2EXP(suf, To, From) \
-  SPECIALIZE_FUN2_0_2(div2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
-#define SPECIALIZE_ADD_MUL(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(add_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_SUB_MUL(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(sub_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_GCD(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(gcd, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_GCDEXT(suf, To1, From1, From2, To2, To3)		\
-  SPECIALIZE_FUN5_0_1(gcdext, suf, Result, nonconst, To1,		\
-		      const, From1, const, From2, nonconst, To2, nonconst, To3, Rounding_Dir)
-#define SPECIALIZE_LCM(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(lcm, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_INPUT(suf, Type) \
-  SPECIALIZE_FUN1_0_2(input, suf, Result, nonconst, Type, std::istream&, Rounding_Dir)
-#define SPECIALIZE_OUTPUT(suf, Type) \
-  SPECIALIZE_FUN1_1_2(output, suf, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+#define SPECIALIZE_COPY(func, Type) \
+  SPECIALIZE_FUN2_0_0(copy, func, void, nonconst, Type, const, Type)
+#define SPECIALIZE_SGN(func, From) \
+  SPECIALIZE_FUN1_0_0(sgn, func, Result, const, From)
+#define SPECIALIZE_CMP(func, Type1, Type2) \
+  SPECIALIZE_FUN2_0_0(cmp, func, Result, const, Type1, const, Type2)
+#define SPECIALIZE_SET_SPECIAL(func, Type) \
+  SPECIALIZE_FUN1_0_1(set_special, func, Result, nonconst, Type, Result)
+#define SPECIALIZE_CLASSIFY(func, Type) \
+  SPECIALIZE_FUN1_0_3(classify, func, Result, const, Type, bool, bool, bool)
+#define SPECIALIZE_IS_NAN(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_nan, func, bool, const, Type)
+#define SPECIALIZE_IS_MINF(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_minf, func, bool, const, Type)
+#define SPECIALIZE_IS_PINF(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_pinf, func, bool, const, Type)
+#define SPECIALIZE_IS_INT(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_int, func, bool, const, Type)
+#define SPECIALIZE_CONSTRUCT(func, To, From) \
+  SPECIALIZE_FUN2_0_1(construct, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ASSIGN(func, To, From) \
+  SPECIALIZE_FUN2_0_1(assign, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_FLOOR(func, To, From) \
+  SPECIALIZE_FUN2_0_1(floor, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_CEIL(func, To, From) \
+  SPECIALIZE_FUN2_0_1(ceil, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_TRUNC(func, To, From) \
+  SPECIALIZE_FUN2_0_1(trunc, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_NEG(func, To, From) \
+  SPECIALIZE_FUN2_0_1(neg, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ABS(func, To, From) \
+  SPECIALIZE_FUN2_0_1(abs, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_SQRT(func, To, From) \
+  SPECIALIZE_FUN2_0_1(sqrt, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ADD(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(mul, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_DIV(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(div, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_REM(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(rem, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_IDIV(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(idiv, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL2EXP(func, To, From) \
+  SPECIALIZE_FUN2_0_2(mul2exp, func, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_DIV2EXP(func, To, From) \
+  SPECIALIZE_FUN2_0_2(div2exp, func, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_ADD_MUL(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add_mul, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB_MUL(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub_mul, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCD(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(gcd, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCDEXT(func, To1, From1, From2, To2, To3)		\
+  SPECIALIZE_FUN5_0_1(gcdext, func, Result, nonconst, To1,		\
+		      nonconst, To2, nonconst, To3, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_LCM(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(lcm, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_INPUT(func, Type) \
+  SPECIALIZE_FUN1_0_2(input, func, Result, nonconst, Type, std::istream&, Rounding_Dir)
+#define SPECIALIZE_OUTPUT(func, Type) \
+  SPECIALIZE_FUN1_1_2(output, func, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
 
 
 DECLARE_FUN2_0_0(copy,        void, nonconst, Type1, const, Type2)
@@ -338,6 +333,9 @@ DECLARE_FUN1_0_0(is_pinf,     bool, const, Type)
 DECLARE_FUN1_0_0(is_int,      bool, const, Type)
 DECLARE_FUN2_0_1(construct,   Result, nonconst, To, const, From, Rounding_Dir)
 DECLARE_FUN2_0_1(assign,      Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(floor,       Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(ceil,        Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(trunc,       Result, nonconst, To, const, From, Rounding_Dir)
 DECLARE_FUN2_0_1(neg,         Result, nonconst, To, const, From, Rounding_Dir)
 DECLARE_FUN2_0_1(abs,         Result, nonconst, To, const, From, Rounding_Dir)
 DECLARE_FUN2_0_1(sqrt,        Result, nonconst, To, const, From, Rounding_Dir)
@@ -346,13 +344,13 @@ DECLARE_FUN3_0_1(sub,         Result, nonconst, To, const, From1, const, From2,
 DECLARE_FUN3_0_1(mul,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN3_0_1(div,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN3_0_1(rem,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(idiv,        Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN2_0_2(mul2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
 DECLARE_FUN2_0_2(div2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
 DECLARE_FUN3_0_1(add_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN3_0_1(sub_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN3_0_1(gcd,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN5_0_1(gcdext,      Result, nonconst, To1, const, From1, const, From2,
-		                      nonconst, To2, nonconst, To3, Rounding_Dir)
+DECLARE_FUN5_0_1(gcdext,      Result, nonconst, To1, nonconst, To2, nonconst, To3, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN3_0_1(lcm,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
 DECLARE_FUN1_0_2(input,       Result, nonconst, Type, std::istream&, Rounding_Dir)
 DECLARE_FUN1_1_2(output,      Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
@@ -364,22 +362,65 @@ Result input_mpq(mpq_class& to, std::istream& is);
 
 } // namespace Checked
 
-struct Minus_Infinity {
-};
+#define MINUS_INFINITY float(-HUGE_VAL)
+#define PLUS_INFINITY float(HUGE_VAL)
+#define NOT_A_NUMBER float(NAN)
 
-struct Plus_Infinity {
-};
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Checked_Number_Transparent_Policy {
+  //! Checks for overflowed result.
+  const_bool_nodef(check_overflow, false);
+
+  //! Checks for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
 
-struct Not_A_Number {
+  //! Checks for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Checks for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Checks for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Checks for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Checks for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Handles not-a-number special value.
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+
+  //! Handles infinity special values.
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+
+  //! Representation is identical to primitive.
+  const_bool_nodef(convertible, true);
+
+  //! When true, requests to check for FPU inexact result are honored.
+  const_bool_nodef(fpu_check_inexact, false);
+
+  //! Return VC_NAN on NaN result also for native extended.
+  const_bool_nodef(check_nan_result, false);
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
 };
 
-extern Minus_Infinity MINUS_INFINITY;
-extern Plus_Infinity PLUS_INFINITY;
-extern Not_A_Number NOT_A_NUMBER;
+typedef Checked_Number_Transparent_Policy<float> Special_Float_Policy;
 
 } // namespace Parma_Polyhedra_Library
 
-
 #define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
 
 #include "checked.inlines.hh"
diff --git a/src/checked.inlines.hh b/src/checked.inlines.hh
index e96cd9e..8b29ad3 100644
--- a/src/checked.inlines.hh
+++ b/src/checked.inlines.hh
@@ -1,11 +1,11 @@
 /* Abstract checked arithmetic functions: fall-backs.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,51 +20,211 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include "compiler.hh"
 #include "globals.types.hh"
+#include "meta_programming.hh"
+#include "C_Integer.hh"
 #include <cassert>
 
 namespace Parma_Polyhedra_Library {
 
 namespace Checked {
 
+template <typename T1, typename T2>
+struct Safe_Conversion : public False {
+};
+template <typename T>
+struct Safe_Conversion<T, T> : public True {
+};
+
+#define safe_conversion(To, From)					\
+  template <> struct Safe_Conversion<To, From> : public True { }
+
+safe_conversion(signed short, signed char);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT
+safe_conversion(signed short, unsigned char);
+#endif
+
+safe_conversion(signed int, signed char);
+safe_conversion(signed int, signed short);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT
+safe_conversion(signed int, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT
+safe_conversion(signed int, unsigned short);
+#endif
+
+safe_conversion(signed long, signed char);
+safe_conversion(signed long, signed short);
+safe_conversion(signed long, signed int);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG
+safe_conversion(signed long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG
+safe_conversion(signed long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG
+safe_conversion(signed long, unsigned int);
+#endif
+
+safe_conversion(signed long long, signed char);
+safe_conversion(signed long long, signed short);
+safe_conversion(signed long long, signed int);
+safe_conversion(signed long long, signed long);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned long);
+#endif
+
+safe_conversion(unsigned short, unsigned char);
+
+safe_conversion(unsigned int, unsigned char);
+safe_conversion(unsigned int, unsigned short);
+
+safe_conversion(unsigned long, unsigned char);
+safe_conversion(unsigned long, unsigned short);
+safe_conversion(unsigned long, unsigned int);
+
+safe_conversion(unsigned long long, unsigned char);
+safe_conversion(unsigned long long, unsigned short);
+safe_conversion(unsigned long long, unsigned int);
+safe_conversion(unsigned long long, unsigned long);
+
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed char);
+safe_conversion(float, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed short);
+safe_conversion(float, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed int);
+safe_conversion(float, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed long);
+safe_conversion(float, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed long long);
+safe_conversion(float, unsigned long long);
+#endif
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed char);
+safe_conversion(double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed short);
+safe_conversion(double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed int);
+safe_conversion(double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed long);
+safe_conversion(double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed long long);
+safe_conversion(double, unsigned long long);
+#endif
+safe_conversion(double, float);
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed char);
+safe_conversion(long double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed short);
+safe_conversion(long double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed int);
+safe_conversion(long double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed long);
+safe_conversion(long double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed long long);
+safe_conversion(long double, unsigned long long);
+#endif
+safe_conversion(long double, float);
+safe_conversion(long double, double);
+
+safe_conversion(mpz_class, signed char);
+safe_conversion(mpz_class, signed short);
+safe_conversion(mpz_class, signed int);
+safe_conversion(mpz_class, signed long);
+//safe_conversion(mpz_class, signed long long);
+safe_conversion(mpz_class, unsigned char);
+safe_conversion(mpz_class, unsigned short);
+safe_conversion(mpz_class, unsigned int);
+safe_conversion(mpz_class, unsigned long);
+//safe_conversion(mpz_class, unsigned long long);
+
+safe_conversion(mpq_class, signed char);
+safe_conversion(mpq_class, signed short);
+safe_conversion(mpq_class, signed int);
+safe_conversion(mpq_class, signed long);
+//safe_conversion(mpq_class, signed long long);
+safe_conversion(mpq_class, unsigned char);
+safe_conversion(mpq_class, unsigned short);
+safe_conversion(mpq_class, unsigned int);
+safe_conversion(mpq_class, unsigned long);
+//safe_conversion(mpq_class, unsigned long long);
+safe_conversion(mpq_class, float);
+safe_conversion(mpq_class, double);
+//safe_conversion(mpq_class, long double);
+
 template <typename Policy, typename Type>
-struct FUNCTION_CLASS(construct)<Policy, Type, Type> {
+struct FUNCTION_CLASS(construct)<Policy, Policy, Type, Type> {
   static inline Result function(Type& to, const Type& from, Rounding_Dir) {
     new (&to) Type(from);
     return V_EQ;
   }
 };
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 struct FUNCTION_CLASS(construct) {
   static inline Result function(To& to, const From& from, Rounding_Dir dir) {
     new (&to) To();
-    return assign<Policy>(to, from, dir);
+    return assign<To_Policy, From_Policy>(to, from, dir);
   }
 };
 
-template <typename Policy, typename Type>
-struct FUNCTION_CLASS(assign)<Policy, Type, Type> {
-  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
-    to = from;
-    return V_EQ;
-  }
-};
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_exact(To& to, const From& from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
 
-template <typename Policy, typename Type>
-inline void
+template <typename To_Policy, typename From_Policy, typename Type>
+inline typename Enable_If<Is_Same<To_Policy, From_Policy>::value, void>::type
 copy_generic(Type& to, const Type& from) {
   to = from;
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 abs_generic(To& to, const From& from, Rounding_Dir dir) {
   if (from < 0)
-    return neg<Policy>(to, from, dir);
-  to = from;
-  return V_EQ;
+    return neg<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign<To_Policy, From_Policy>(to, from, dir);
 }
 
 inline Result
@@ -98,35 +258,43 @@ sub(Result r1, Result r2) {
   return add(r1, neg(r2));
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From>
 inline void
 gcd_exact_noabs(To& to, const From& x, const From& y) {
   To nx = x;
   To ny = y;
   To rm;
   while (ny != 0) {
-    /* The following is derived from the assumption that x % y
-       is always representable. This is true for both native integers
-       and iec559 floating point numbers */
-    rem<Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
+    // The following is derived from the assumption that x % y
+    // is always representable. This is true for both native integers
+    // and IEC 559 floating point numbers.
+    rem<To_Policy, From1_Policy, From2_Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
     nx = ny;
     ny = rm;
   }
   to = nx;
 }
 
-template <typename Policy, typename To, typename From1, typename From2>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
 inline Result
 gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  gcd_exact_noabs<Policy>(to, x, y);
-  return abs<Policy>(to, to, dir);
+  gcd_exact_noabs<To_Policy, From1_Policy, From2_Policy>(to, x, y);
+  return abs<To_Policy, To_Policy>(to, to, dir);
 }
 
-template <typename Policy, typename To1,
-	  typename From1, typename From2, typename To2, typename To3>
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+	  typename From1_Policy, typename From2_Policy,
+	  typename To1, typename To2, typename To3,
+	  typename From1, typename From2>
 inline Result
-gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
+gcdext_exact(To1& to, To2& s, To3& t, const From1& x, const From2& y,
 	     Rounding_Dir dir) {
+  // In case this becomes a bottleneck, we may consider using the
+  // Stehle'-Zimmermann algorithm (see R. Crandall and C. Pomerance,
+  // Prime Numbers - A Computational Perspective, Second Edition,
+  // Springer, 2005).
   if (y == 0) {
     if (x == 0) {
       s = 0;
@@ -139,7 +307,7 @@ gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
       else
 	s = 1;
       t = 0;
-      return abs<Policy>(to, x, dir);
+      return abs<To1_Policy, From1_Policy>(to, x, dir);
     }
   }
 
@@ -149,19 +317,19 @@ gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
   bool negative_y = y < 0;
 
   Result r;
-  r = abs<Policy>(to, x, dir);
+  r = abs<To1_Policy, From1_Policy>(to, x, dir);
   if (r != V_EQ)
     return r;
 
   From2 ay;
-  r = abs<Policy>(ay, y, dir);
+  r = abs<To1_Policy, From2_Policy>(ay, y, dir);
   if (r != V_EQ)
     return r;
 
-  // If COPY_GMP is defined then s is favoured when the absolute
+  // If COPY_GMP is defined then s is favored when the absolute
   // values of the given numbers are equal.  For instance if x and y
   // are both 5 then s will be 1 and t will be 0, instead of the other
-  // way round.  This is to match the behaviour of GMP.
+  // way round.  This is to match the behavior of GMP.
 #define COPY_GMP
 #ifdef COPY_GMP
   if (to == ay)
@@ -193,16 +361,17 @@ gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
  sign_check:
 #endif
   if (negative_x) {
-    r = neg<Policy>(s, s, dir);
+    r = neg<To2_Policy, To2_Policy>(s, s, dir);
     if (r != V_EQ)
       return r;
   }
   if (negative_y)
-    return neg<Policy>(t, t, dir);
+    return neg<To3_Policy, To3_Policy>(t, t, dir);
   return V_EQ;
 }
 
-template <typename Policy, typename To, typename From1, typename From2>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
 inline Result
 lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
   if (x == 0 || y == 0) {
@@ -211,19 +380,19 @@ lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
   }
   To nx, ny;
   Result r;
-  r = abs<Policy>(nx, x, dir);
+  r = abs<From1_Policy, From1_Policy>(nx, x, dir);
   if (r != V_EQ)
     return r;
-  r = abs<Policy>(ny, y, dir);
+  r = abs<From2_Policy, From2_Policy>(ny, y, dir);
   if (r != V_EQ)
     return r;
   To gcd;
-  gcd_exact_noabs<Policy>(gcd, nx, ny);
-  /* The following is derived from the assumption that x / gcd(x, y)
-     is always representable. This is true for both native integers
-     and iec559 floating point numbers */
-  div<Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
-  return mul<Policy>(to, to, ny, dir);
+  gcd_exact_noabs<To_Policy, From1_Policy, From2_Policy>(gcd, nx, ny);
+  // The following is derived from the assumption that x / gcd(x, y)
+  // is always representable. This is true for both native integers
+  // and IEC 559 floating point numbers.
+  div<To_Policy, From1_Policy, To_Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
+  return mul<To_Policy, To_Policy, From2_Policy>(to, to, ny, dir);
 }
 
 template <typename Policy, typename Type>
@@ -236,12 +405,170 @@ sgn_generic(const Type& x) {
   return V_LT;
 }
 
-template <typename Policy, typename Type>
+template <typename T1, typename T2, typename Enable = void>
+struct Safe_Int_Comparison : public False {
+};
+
+template <typename T1, typename T2>
+struct Safe_Int_Comparison<T1, T2, typename Enable_If<(C_Integer<T1>::value && C_Integer<T2>::value)>::type>
+  : public Bool<(C_Integer<T1>::is_signed
+		 ? (C_Integer<T2>::is_signed
+		    || sizeof(T2) < sizeof(T1)
+		    || sizeof(T2) < sizeof(int))
+		 : (!C_Integer<T2>::is_signed
+		    || sizeof(T1) < sizeof(T2)
+		    || sizeof(T1) < sizeof(int)))> {
+};
+
+
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+			   || Safe_Conversion<T1, T2>::value
+			   || Safe_Conversion<T2, T1>::value), bool>::type
+lt(const T1& x, const T2& y) {
+  return x < y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+			   || Safe_Conversion<T1, T2>::value
+			   || Safe_Conversion<T2, T1>::value), bool>::type
+le(const T1& x, const T2& y) {
+  return x <= y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+			   || Safe_Conversion<T1, T2>::value
+			   || Safe_Conversion<T2, T1>::value), bool>::type
+eq(const T1& x, const T2& y) {
+  return x == y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+lt(const S& x, const U& y) {
+  return x < 0 || x < y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+lt(const U& x, const S& y) {
+  return y >= 0 && x < y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+le(const S& x, const U& y) {
+  return x < 0 || x <= y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+le(const U& x, const S& y) {
+  return y >= 0 && x <= y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+eq(const S& x, const U& y) {
+  return x >= 0 && x == y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+eq(const U& x, const S& y) {
+  return y >= 0 && x == y;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+			   && !Safe_Conversion<T2, T1>::value
+			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+eq(const T1& x, const T2& y) {
+  DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_CHECK);
+  return r == V_EQ && x == tmp;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+			   && !Safe_Conversion<T2, T1>::value
+			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+lt(const T1& x, const T2& y) {
+  DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_UP);
+  switch (r) {
+  case V_POS_OVERFLOW:
+  case VC_PLUS_INFINITY:
+    return true;
+  case V_EQ:
+  case V_LT:
+  case V_LE:
+    return x < tmp;
+  default:
+    return false;
+  }
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+			   && !Safe_Conversion<T2, T1>::value
+			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+le(const T1& x, const T2& y) {
+  DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, static_cast<Rounding_Dir>(ROUND_UP | ROUND_FPU_CHECK_INEXACT));
+  switch (r) {
+  case V_POS_OVERFLOW:
+  case VC_PLUS_INFINITY:
+    return true;
+  case V_EQ:
+    return x <= tmp;
+  case V_LT:
+    return x < tmp;
+  default:
+    return false;
+  }
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+lt_p(const Type1& x, const Type2& y) {
+  return lt(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+le_p(const Type1& x, const Type2& y) {
+  return le(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+eq_p(const Type1& x, const Type2& y) {
+  return eq(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
 inline Result
-cmp_generic(const Type& x, const Type& y) {
-  if (x > y)
+cmp_generic(const Type1& x, const Type2& y) {
+  if (lt(y, x))
     return V_GT;
-  if (x < y)
+  if (lt(x, y))
     return V_LT;
   return V_EQ;
 }
@@ -249,29 +576,17 @@ cmp_generic(const Type& x, const Type& y) {
 template <typename Policy, typename Type>
 inline Result
 input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
-  mpq_class q;
+  DIRTY_TEMP0(mpq_class, q);
   Result r = input_mpq(q, is);
   if (r == VC_MINUS_INFINITY)
-    return assign<Policy>(to, MINUS_INFINITY, dir);
+    return assign<Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
   if (r == VC_PLUS_INFINITY)
-    return assign<Policy>(to, PLUS_INFINITY, dir);
+    return assign<Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   if (r == V_EQ)
-    return assign<Policy>(to, q, dir);
+    return assign<Policy, void>(to, q, dir);
   return set_special<Policy>(to, r);
 }
 
-template <typename T>
-inline memory_size_type
-external_memory_in_bytes(T) {
-  return 0;
-}
-
-template <typename T>
-inline memory_size_type
-total_memory_in_bytes(T& x) {
-  return sizeof(x) + external_memory_in_bytes(x);
-}
-
 } // namespace Checked
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/checked_ext.inlines.hh b/src/checked_ext.inlines.hh
index d905724..6b58195 100644
--- a/src/checked_ext.inlines.hh
+++ b/src/checked_ext.inlines.hh
@@ -1,11 +1,11 @@
 /* Checked extended arithmetic functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,56 +22,76 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+template <typename T> struct FPU_Related : public False {};
+template <> struct FPU_Related<float> : public True {};
+template <> struct FPU_Related<double> : public True {};
+template <> struct FPU_Related<long double> : public True {};
+
 namespace Checked {
 
-#define handle_ext_natively(T) (Float<T>::fpu_related)
+template <typename T>
+inline bool
+handle_ext_natively(const T&) {
+  return FPU_Related<T>::value;
+}
+
+template <typename Policy, typename Type>
+inline bool
+ext_to_handle(const Type& x) {
+  return !handle_ext_natively(x)
+    && (Policy::has_infinity || Policy::has_nan);
+}
 
 template <typename Policy, typename Type>
 inline Result
 sgn_ext(const Type& x) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x)))
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x))
     return VC_NAN;
   else if (is_minf<Policy>(x))
     return V_LT;
   else if (is_pinf<Policy>(x))
     return V_GT;
-  else
+  else {
+  native:
     return sgn<Policy>(x);
+  }
 }
 
 template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
-construct_ext(To& to, const From& from, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+construct_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
-    return construct<To_Policy>(to, NOT_A_NUMBER, dir);
-  else if (is_minf<From_Policy>(from))
-    return construct<To_Policy>(to, MINUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(from))
-    return construct<To_Policy>(to, PLUS_INFINITY, dir);
+  if (is_nan<From_Policy>(x))
+    return construct<To_Policy, Special_Float_Policy>(to, NOT_A_NUMBER, dir);
+  else if (is_minf<From_Policy>(x))
+    return construct<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return construct<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else {
   native:
-    return construct<To_Policy>(to, from, dir);
+    return construct<To_Policy, From_Policy>(to, x, dir);
   }
 }
 
 template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
-assign_ext(To& to, const From& from, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+assign_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+  if (is_nan<From_Policy>(x))
     return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(from))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(from))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else {
   native:
-    return assign<To_Policy>(to, from, dir);
+    return assign<To_Policy, From_Policy>(to, x, dir);
   }
 }
 
@@ -79,17 +99,71 @@ template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
 neg_ext(To& to, const From& x, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+  if (is_nan<From_Policy>(x))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
   else {
   native:
-    return neg<To_Policy>(to, x, dir);
+    return neg<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+floor_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return floor<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+ceil_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return ceil<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+trunc_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return trunc<To_Policy, From_Policy>(to, x, dir);
   }
 }
 
@@ -97,15 +171,15 @@ template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
 abs_ext(To& to, const From& x, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+  if (is_nan<From_Policy>(x))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else {
   native:
-    return abs<To_Policy>(to, x, dir);
+    return abs<To_Policy, From_Policy>(to, x, dir);
   }
 }
 
@@ -113,12 +187,9 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From1_Policy>(x)) {
     if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
@@ -137,15 +208,15 @@ add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
   else {
     if (is_minf<From2_Policy>(y)) {
     minf:
-      return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
     }
     else if (is_pinf<From2_Policy>(y)) {
     pinf:
-      return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
     }
     else {
     native:
-      return add<To_Policy>(to, x, y, dir);
+      return add<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -154,12 +225,9 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From1_Policy>(x)) {
     if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
@@ -178,15 +246,15 @@ sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
   else {
     if (is_pinf<From2_Policy>(y)) {
     minf:
-      return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
     }
     else if (is_minf<From2_Policy>(y)) {
     pinf:
-      return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
     }
     else {
     native:
-      return sub<To_Policy>(to, x, y, dir);
+      return sub<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -195,12 +263,9 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   if (is_minf<From1_Policy>(x)) {
     switch (sgn_ext<From2_Policy>(y)) {
@@ -232,15 +297,15 @@ mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
       default:
 	goto inf_mul_zero;
       }
-    } else if (is_pinf<From2_Policy>(y)) {
+    }
+    else if (is_pinf<From2_Policy>(y)) {
       switch (sgn<From1_Policy>(x)) {
       case V_LT:
       minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
       case V_GT:
       pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
-	goto pinf;
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
       default:
       inf_mul_zero:
 	assert(To_Policy::check_inf_mul_zero);
@@ -249,7 +314,7 @@ mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
     }
     else {
     native:
-      return mul<To_Policy>(to, x, y, dir);
+      return mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -259,13 +324,11 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
-      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   if (is_minf<From1_Policy>(x)) {
     switch (sgn_ext<From2_Policy>(y)) {
@@ -297,7 +360,8 @@ add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
       default:
 	goto inf_mul_zero;
       }
-    } else if (is_pinf<From2_Policy>(y)) {
+    }
+    else if (is_pinf<From2_Policy>(y)) {
       switch (sgn<From1_Policy>(x)) {
       case V_LT:
       a_minf:
@@ -322,14 +386,14 @@ add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
     else {
       if (is_minf<To_Policy>(to)) {
       minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
       }
       if (is_pinf<To_Policy>(to)) {
       pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
       }
     native:
-      return add_mul<To_Policy>(to, x, y, dir);
+      return add_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -338,13 +402,11 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
-      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   if (is_minf<From1_Policy>(x)) {
     switch (sgn_ext<From2_Policy>(y)) {
@@ -376,7 +438,8 @@ sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
       default:
 	goto inf_mul_zero;
       }
-    } else if (is_pinf<From2_Policy>(y)) {
+    }
+    else if (is_pinf<From2_Policy>(y)) {
       switch (sgn<From1_Policy>(x)) {
       case V_LT:
       a_minf:
@@ -401,14 +464,14 @@ sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
     else {
       if (is_minf<To_Policy>(to)) {
       minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
       }
       if (is_pinf<To_Policy>(to)) {
       pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
       }
     native:
-      return sub_mul<To_Policy>(to, x, y, dir);
+      return sub_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -417,12 +480,66 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return set_special<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+      default:
+      div_zero:
+	assert(To_Policy::check_div_zero);
+	return set_special<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return div<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   if (is_minf<From1_Policy>(x)) {
     if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
@@ -449,10 +566,10 @@ div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
       switch (sgn<From2_Policy>(y)) {
       case V_LT:
       minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
       case V_GT:
       pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
       default:
       div_zero:
 	assert(To_Policy::check_div_zero);
@@ -467,7 +584,7 @@ div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
     }
     else {
     native:
-      return div<To_Policy>(to, x, y, dir);
+      return idiv<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -477,12 +594,9 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
     goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
 		   || is_pinf<From1_Policy>(x)))
@@ -494,7 +608,7 @@ rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
     }
     else {
     native:
-      return rem<To_Policy>(to, x, y, dir);
+      return rem<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
     }
   }
 }
@@ -503,17 +617,17 @@ template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
 mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+  if (is_nan<From_Policy>(x))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From_Policy>(x))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
   else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else {
   native:
-    return mul2exp<To_Policy>(to, x, exp, dir);
+    return mul2exp<To_Policy, From_Policy>(to, x, exp, dir);
   }
 }
 
@@ -521,17 +635,17 @@ template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
 div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+  if (is_nan<From_Policy>(x))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From_Policy>(x))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
   else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else {
   native:
-    return div2exp<To_Policy>(to, x, exp, dir);
+    return div2exp<To_Policy, From_Policy>(to, x, exp, dir);
   }
 }
 
@@ -539,17 +653,17 @@ template <typename To_Policy, typename From_Policy,
 	  typename To, typename From>
 inline Result
 sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
+  if (!ext_to_handle<From_Policy>(x))
     goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+  if (is_nan<From_Policy>(x))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From_Policy>(x))
     return set_special<To_Policy>(to, V_SQRT_NEG);
   else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else {
   native:
-    return sqrt<To_Policy>(to, x, dir);
+    return sqrt<To_Policy, From_Policy>(to, x, dir);
   }
 }
 
@@ -557,25 +671,24 @@ template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
     return abs_ext<To_Policy, From2_Policy>(to, y, dir);
   else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
     return abs_ext<To_Policy, From1_Policy>(to, x, dir);
   else
-    return gcd<To_Policy>(to, x, y, dir);
+    return gcd<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
 }
 
-template <typename To1_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To2_Policy, typename To3_Policy,
-	  typename To1, typename From1, typename From2, typename To2, typename To3>
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+	  typename From1_Policy, typename From2_Policy,
+	  typename To1, typename To2, typename To3,
+	  typename From1, typename From2>
 inline Result
-gcdext_ext(To1& to, const From1& x, const From2& y,
-	   To2& s, To3& t, Rounding_Dir dir) {
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+	   Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To1_Policy>(to, VC_NAN);
   else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
     s = 0;
@@ -588,31 +701,29 @@ gcdext_ext(To1& to, const From1& x, const From2& y,
     return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
   }
   else
-    return gcdext<To1_Policy>(to, x, y, s, t, dir);
+    return gcdext<To1_Policy, To2_Policy, To3_Policy, From1_Policy, From2_Policy>(to, s, t, x, y, dir);
 }
 
 template <typename To_Policy, typename From1_Policy, typename From2_Policy,
 	  typename To, typename From1, typename From2>
 inline Result
 lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
     return set_special<To_Policy>(to, VC_NAN);
   else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
 	   || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
   else
-    return lcm<To_Policy>(to, x, y, dir);
+    return lcm<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
 }
 
 template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline Result
 cmp_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
     goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
     return V_UNORD_COMP;
   else if (is_minf<Policy1>(x))
     return is_minf<Policy2>(y) ? V_EQ : V_LT;
@@ -624,7 +735,7 @@ cmp_ext(const Type1& x, const Type2& y) {
     if (is_pinf<Policy2>(y))
       return V_LT;
   native:
-    return cmp<Policy1>(x, y);
+    return cmp<Policy1, Policy2>(x, y);
   }
 }
 
@@ -632,111 +743,80 @@ template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline bool
 lt_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
     goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
     return false;
   if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
     return false;
   if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
     return true;
  native:
-  return x < y;
+  return lt_p<Policy1, Policy2>(x, y);
 }
 
 template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline bool
 gt_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
-    return false;
-  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
-    return true;
- native:
-  return x > y;
+  return lt_ext<Policy1, Policy2>(y, x);
 }
 
 template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline bool
 le_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
     goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
     return false;
   if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
     return true;
   if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
     return false;
  native:
-  return x <= y;
+  return le_p<Policy1, Policy2>(x, y);
 }
 
 template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline bool
 ge_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
-    return true;
-  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
-    return false;
- native:
-  return x >= y;
+  return le_ext<Policy1, Policy2>(y, x);
 }
 
 template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline bool
 eq_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
     goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
     return false;
   if (is_minf<Policy1>(x))
     return is_minf<Policy2>(y);
   if (is_pinf<Policy1>(x))
     return is_pinf<Policy2>(y);
+  else if (is_minf<Policy2>(y) || is_pinf<Policy2>(y))
+    return false;
  native:
-  return x == y;
+  return eq_p<Policy1, Policy2>(x, y);
 }
 
 template <typename Policy1, typename Policy2,
 	  typename Type1, typename Type2>
 inline bool
 ne_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return true;
-  if (is_minf<Policy1>(x))
-    return !is_minf<Policy2>(y);
-  if (is_pinf<Policy1>(x))
-    return !is_pinf<Policy2>(y);
- native:
-  return x != y;
+  return !eq_ext<Policy1, Policy2>(x, y);
 }
 
 template <typename Policy, typename Type>
 inline Result
 output_ext(std::ostream& os, const Type& x,
 	   const Numeric_Format& format, Rounding_Dir dir) {
-  if (handle_ext_natively(Type))
+  if (!ext_to_handle<Policy>(x))
     goto native;
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))) {
+  if (is_nan<Policy>(x)) {
     os << "nan";
     return VC_NAN;
   }
diff --git a/src/checked_float.inlines.hh b/src/checked_float.inlines.hh
index 63af0ea..010eeba 100644
--- a/src/checked_float.inlines.hh
+++ b/src/checked_float.inlines.hh
@@ -1,11 +1,11 @@
 /* Specialized "checked" functions for native floating-point numbers.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,7 +23,6 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_checked_float_inlines_hh
 #define PPL_checked_float_inlines_hh 1
 
-#include "Float.defs.hh"
 #ifndef __alpha
 #include <cmath>
 #endif
@@ -34,58 +33,74 @@ namespace Checked {
 
 inline float
 fma(float x, float y, float z) {
-#if HAVE_DECL_FMAF && !defined(__alpha)
+#if PPL_HAVE_DECL_FMAF && !defined(__alpha)
   return ::fmaf(x, y, z);
 #else
   return x*y + z;
 #endif
 }
 
-#if HAVE_DECL_RINTF
-inline float
-rint(float x) {
-  return ::rintf(x);
-}
-#endif
-
 inline double
 fma(double x, double y, double z) {
-#if HAVE_DECL_FMA && !defined(__alpha)
+#if PPL_HAVE_DECL_FMA && !defined(__alpha)
   return ::fma(x, y, z);
 #else
   return x*y + z;
 #endif
 }
 
-inline double
-rint(double x) {
-  return ::rint(x);
-}
-
 inline long double
 fma(long double x, long double y, long double z) {
-#if HAVE_DECL_FMAL && !defined(__alpha)
+#if PPL_HAVE_DECL_FMAL && !defined(__alpha)
   return ::fmal(x, y, z);
 #else
   return x*y + z;
 #endif
 }
 
-#if HAVE_DECL_RINTL
+#if PPL_HAVE_DECL_RINTF
+inline float
+rint(float x) {
+  return ::rintf(x);
+}
+#endif
+
+inline double
+rint(double x) {
+  return ::rint(x);
+}
+
+#if PPL_HAVE_DECL_RINTL
 inline long double
 rint(long double x) {
   return ::rintl(x);
 }
+#elif !PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+// If proper long doubles are not provided, this is most likely
+// because long double and double are the same type: use rint().
+inline long double
+rint(long double x) {
+  return ::rint(x);
+}
+#elif defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// On Cygwin, we have proper long doubles but rintl() is not defined:
+// luckily, one machine instruction is enough to save the day.
+inline long double
+rint(long double x) {
+  long double i;
+  __asm__ ("frndint" : "=t" (i) : "0" (x));
+  return i;
+}
 #endif
 
 inline bool
 fpu_direct_rounding(Rounding_Dir dir) {
-  return dir == ROUND_DIRECT || dir == ROUND_IGNORE;
+  return round_direct(dir) || round_ignore(dir);
 }
 
 inline bool
 fpu_inverse_rounding(Rounding_Dir dir) {
-  return dir == ROUND_INVERSE;
+  return round_inverse(dir);
 }
 
 // The FPU mode is "round down".
@@ -114,39 +129,31 @@ fpu_inverse_rounding(Rounding_Dir dir) {
 
 inline float
 limit_precision(float v) {
-  volatile float x = v;
+  float x = v;
+  avoid_cse(x);
   return x;
 }
 
 inline double
 limit_precision(double v) {
-  volatile double x = v;
+  double x = v;
+  avoid_cse(x);
   return x;
 }
 
 inline long double
 limit_precision(long double v) {
-#if __GNUC__ >= 4
   return v;
-#else
-  // Not really needed for floating point operations done with the
-  // maximum available precision, but this avoids a bug in GCC 3.4.3
-  // that causes excessive optimization compiling -(-a * b).
-  // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21032
-  // and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21067.
-  volatile long double x = v;
-  return x;
-#endif
 }
 
 template <typename Policy, typename T>
 inline Result
 classify_float(const T v, bool nan, bool inf, bool sign) {
   Float<T> f(v);
-  if ((nan || sign) && f.u.binary.is_nan())
+  if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan()))
     return VC_NAN;
   if (inf) {
-    int i = f.u.binary.is_inf();
+    int i = CHECK_P(Policy::has_infinity, f.u.binary.is_inf());
     if (i < 0)
       return VC_MINUS_INFINITY;
     if (i > 0)
@@ -166,29 +173,27 @@ template <typename Policy, typename T>
 inline bool
 is_nan_float(const T v) {
   Float<T> f(v);
-  return f.u.binary.is_nan();
+  return CHECK_P(Policy::has_nan, f.u.binary.is_nan());
 }
 
 template <typename Policy, typename T>
+inline int
+is_inf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, f.u.binary.is_inf());
+}
+template <typename Policy, typename T>
 inline bool
 is_minf_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_inf() < 0;
+  return is_inf_float<Policy>(v) < 0;
 }
 
 template <typename Policy, typename T>
 inline bool
 is_pinf_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_inf() > 0;
+  return is_inf_float<Policy>(v) > 0;
 }
 
-template <typename T>
-inline bool
-is_inf_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_inf() != 0;
-}
 
 template <typename Policy, typename T>
 inline bool
@@ -256,7 +261,7 @@ succ_float(T& v) {
 template <typename Policy, typename To>
 inline Result
 round_lt_float(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     pred_float(to);
     return V_GT;
   }
@@ -266,27 +271,34 @@ round_lt_float(To& to, Rounding_Dir dir) {
 template <typename Policy, typename To>
 inline Result
 round_gt_float(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
+  if (round_up(dir)) {
     succ_float(to);
     return V_LT;
   }
   return V_GT;
 }
 
+
 template <typename Policy>
 inline void
 prepare_inexact(Rounding_Dir dir) {
-  if (Policy::fpu_check_inexact && dir != ROUND_IGNORE)
+  if (Policy::fpu_check_inexact && round_fpu_check_inexact(dir))
     fpu_reset_inexact();
 }
 
 template <typename Policy>
 inline Result
 result_relation(Rounding_Dir dir) {
-  if (Policy::fpu_check_inexact) {
-    if (!fpu_check_inexact())
+  if (Policy::fpu_check_inexact && round_fpu_check_inexact(dir)) {
+    switch (fpu_check_inexact()) {
+    case 0:
       return V_EQ;
-    switch (dir) {
+    case -1:
+      goto unknown;
+    case 1:
+      break;
+    }
+    switch (round_dir(dir)) {
     case ROUND_DOWN:
       return V_GT;
     case ROUND_UP:
@@ -296,7 +308,8 @@ result_relation(Rounding_Dir dir) {
     }
   }
   else {
-    switch (dir) {
+  unknown:
+    switch (round_dir(dir)) {
     case ROUND_DOWN:
       return V_GE;
     case ROUND_UP:
@@ -307,201 +320,293 @@ result_relation(Rounding_Dir dir) {
   }
 }
 
-template <typename Policy, typename From, typename To>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_float_float_exact(To& to, const From from, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
   to = from;
   return V_EQ;
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = from;
   else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(-from);
+    to = -static_cast<To>(-from);
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(from);
     to = from;
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename From, typename To>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_float_float(To& to, const From from, Rounding_Dir dir) {
   if (sizeof(From) > sizeof(To))
-    return assign_float_float_inexact<Policy>(to, from, dir);
+    return assign_float_float_inexact<To_Policy, From_Policy>(to, from, dir);
   else
-    return assign_float_float_exact<Policy>(to, from, dir);
+    return assign_float_float_exact<To_Policy, From_Policy>(to, from, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+floor_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (fpu_direct_rounding(ROUND_DOWN))
+    to = rint(from);
+  else if (fpu_inverse_rounding(ROUND_DOWN))
+    to = -limit_precision(rint(-from));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(ROUND_DOWN));
+    avoid_cse(from);
+    to = rint(from);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+ceil_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (fpu_direct_rounding(ROUND_UP))
+    to = rint(from);
+  else if (fpu_inverse_rounding(ROUND_UP))
+    to = -limit_precision(rint(-from));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(ROUND_UP));
+    avoid_cse(from);
+    to = rint(from);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+trunc_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (from >= 0)
+    return floor<To_Policy, From_Policy>(to, from, dir);
+  else
+    return ceil<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 neg_float(Type& to, const Type from, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
   to = -from;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
 inline Result
 add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_add_inf, is_inf_float(x) && x == -y))
-    return V_INF_ADD_INF;
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_inf_add_inf
+      && is_inf_float<From1_Policy>(x) && x == -y)
+    return set_special<To_Policy>(to, V_INF_ADD_INF);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = x + y;
   else if (fpu_inverse_rounding(dir))
     to = -limit_precision(-x - y);
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
     to = x + y;
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
 inline Result
 sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_sub_inf, is_inf_float(x) && x == y))
-    return V_INF_SUB_INF;
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_inf_sub_inf
+      && is_inf_float<From1_Policy>(x) && x == y)
+    return set_special<To_Policy>(to, V_INF_SUB_INF);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = x - y;
   else if (fpu_inverse_rounding(dir))
     to = -limit_precision(y - x);
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
     to = x - y;
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
 inline Result
 mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_mul_zero, (x == 0 && is_inf_float(y)) ||
-	    (y == 0 && is_inf_float(x))))
-      return V_INF_MUL_ZERO;
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y)) ||
+	  (y == 0 && is_inf_float<From1_Policy>(x))))
+    return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = x * y;
   else if (fpu_inverse_rounding(dir))
     to = -limit_precision(x * -y);
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
     to = x * y;
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
 inline Result
 div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_div_inf, is_inf_float(x) && is_inf_float(y)))
-      return V_INF_DIV_INF;
-  if (CHECK_P(Policy::check_div_zero, y == 0)) {
-    to = NAN;
-    return V_DIV_ZERO;
-  }
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_inf_div_inf
+      && is_inf_float<From1_Policy>(x) && is_inf_float<From2_Policy>(y))
+    return set_special<To_Policy>(to, V_INF_DIV_INF);
+  if (To_Policy::check_div_zero && y == 0)
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = x / y;
   else if (fpu_inverse_rounding(dir))
     to = -limit_precision(x / -y);
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
     to = x / y;
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
 inline Result
-rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_mod, is_inf_float(x)))
-    return V_INF_MOD;
-  if (CHECK_P(Policy::check_div_zero, y == 0)) {
-    to = NAN;
-    return V_MOD_ZERO;
+idiv_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type temp;
+  // The inexact check is useless
+  dir = round_dir(dir);
+  Result r = div<To_Policy, From1_Policy, From2_Policy>(temp, x, y, dir);
+  if (is_special(r)) {
+    to = temp;
+    return r;
   }
+  Result r1 = trunc<To_Policy, To_Policy>(to, temp, ROUND_NOT_NEEDED);
+  assert(r1 == V_EQ);
+  if (r == V_EQ || to != temp)
+    return r1;
+  // FIXME: Prove that it's impossibile to return a strict relation
+  return dir == ROUND_UP ? V_LE : V_GE;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (To_Policy::check_inf_mod && is_inf_float<From1_Policy>(x))
+    return set_special<To_Policy>(to, V_INF_MOD);
+  if (To_Policy::check_div_zero && y == 0)
+    return set_special<To_Policy>(to, V_MOD_ZERO);
   to = std::fmod(x, y);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+struct Float_2exp {
+  const_bool_nodef(has_nan, false);
+  const_bool_nodef(has_infinity, false);
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
   if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
-  return mul<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+  return mul<To_Policy, From_Policy, Float_2exp>(to, x, static_cast<Type>(1ULL << exp), dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
   if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
-  return div<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+  return div<To_Policy, From_Policy, Float_2exp>(to, x, static_cast<Type>(1ULL << exp), dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 abs_float(Type& to, const Type from, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  to = from < 0 ? -from : from;
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  to = std::abs(from);
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0)) {
-    to = NAN;
-    return V_SQRT_NEG;
-  }
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (To_Policy::check_sqrt_neg && from < 0)
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = std::sqrt(from);
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(from);
     to = std::sqrt(from);
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  return result_relation<To_Policy>(dir);
 }
 
 template <typename Policy, typename Type>
@@ -510,7 +615,7 @@ sgn_float(const Type x) {
   return classify<Policy>(x, false, false, true);
 }
 
-template <typename Policy, typename Type>
+template <typename Policy1, typename Policy2, typename Type>
 inline Result
 cmp_float(const Type x, const Type y) {
   if (x > y)
@@ -522,40 +627,35 @@ cmp_float(const Type x, const Type y) {
   return V_UNORD_COMP;
 }
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_float_int_exact(To& to, const From from, Rounding_Dir) {
-  to = from;
-  return V_EQ;
-}
-
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
-  prepare_inexact<Policy>(dir);
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = from;
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(from);
     to = from;
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_float_int(To& to, const From from, Rounding_Dir dir) {
   if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
-    return assign_float_int_inexact<Policy>(to, from, dir);
+    return assign_float_int_inexact<To_Policy, From_Policy>(to, from, dir);
   else
-    return assign_float_int_exact<Policy>(to, from, dir);
+    return assign_exact<To_Policy, From_Policy>(to, from, dir);
 }
 
 template <typename Policy, typename T>
 inline Result
 set_neg_overflow_float(T& to, Rounding_Dir dir) {
-  switch (dir) {
+  switch (round_dir(dir)) {
   case ROUND_UP:
     {
       Float<T> f;
@@ -572,7 +672,7 @@ set_neg_overflow_float(T& to, Rounding_Dir dir) {
 template <typename Policy, typename T>
 inline Result
 set_pos_overflow_float(T& to, Rounding_Dir dir) {
-  switch (dir) {
+  switch (round_dir(dir)) {
   case ROUND_DOWN:
     {
       Float<T> f;
@@ -586,7 +686,7 @@ set_pos_overflow_float(T& to, Rounding_Dir dir) {
   }
 }
 
-template <typename Policy, typename T>
+template <typename To_Policy, typename From_Policy, typename T>
 inline Result
 assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
 {
@@ -597,11 +697,11 @@ assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
     return V_EQ;
   }
   size_t exponent = mpz_sizeinbase(from, 2) - 1;
-  if (exponent > (size_t) Float<T>::Binary::EXPONENT_MAX) {
+  if (exponent > static_cast<size_t>(Float<T>::Binary::EXPONENT_MAX)) {
     if (sign < 0)
-      return set_neg_overflow_float<Policy>(to, dir);
+      return set_neg_overflow_float<To_Policy>(to, dir);
     else
-      return set_pos_overflow_float<Policy>(to, dir);
+      return set_pos_overflow_float<To_Policy>(to, dir);
   }
   unsigned long zeroes = mpn_scan1(from->_mp_d, 0);
   size_t meaningful_bits = exponent - zeroes;
@@ -619,21 +719,21 @@ assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
   to = f.value();
   if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
     if (sign < 0)
-      return round_lt_float<Policy>(to, dir);
+      return round_lt_float<To_Policy>(to, dir);
     else
-      return round_gt_float<Policy>(to, dir);
+      return round_gt_float<To_Policy>(to, dir);
   }
   return V_EQ;
 }
 
-template <typename Policy, typename T>
+template <typename To_Policy, typename From_Policy, typename T>
 inline Result
 assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
 {
   const mpz_class& _num = from.get_num();
   const mpz_class& _den = from.get_den();
   if (_den == 1)
-    return assign_float_mpz<Policy>(to, _num, dir);
+    return assign_float_mpz<To_Policy, From_Policy>(to, _num, dir);
   mpz_srcptr num = _num.get_mpz_t();
   mpz_srcptr den = _den.get_mpz_t();
   int sign = mpz_sgn(num);
@@ -642,16 +742,16 @@ assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
     to = 0;
   inexact:
     if (sign < 0)
-      return round_lt_float<Policy>(to, dir);
+      return round_lt_float<To_Policy>(to, dir);
     else
-      return round_gt_float<Policy>(to, dir);
+      return round_gt_float<To_Policy>(to, dir);
   }
-  if (exponent > (signed int) Float<T>::Binary::EXPONENT_MAX + 1) {
+  if (exponent > static_cast<signed int>(Float<T>::Binary::EXPONENT_MAX + 1)) {
   overflow:
     if (sign < 0)
-      return set_neg_overflow_float<Policy>(to, dir);
+      return set_neg_overflow_float<To_Policy>(to, dir);
     else
-      return set_pos_overflow_float<Policy>(to, dir);
+      return set_pos_overflow_float<To_Policy>(to, dir);
   }
   unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
   if (exponent < Float<T>::Binary::EXPONENT_MIN)
@@ -679,11 +779,12 @@ assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
   }
   else
     --exponent;
-  if (exponent > (signed int)Float<T>::Binary::EXPONENT_MAX) {
+  if (exponent > static_cast<signed int>(Float<T>::Binary::EXPONENT_MAX)) {
     mpz_clear(mantissa);
     goto overflow;
-  } else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
-    /* Denormalized */
+  }
+  else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+    // Denormalized.
     exponent = Float<T>::Binary::EXPONENT_MIN - 1;
   }
   Float<T> f(to);
@@ -695,44 +796,57 @@ assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
 inline Result
 add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y)) ||
+	  (y == 0 && is_inf_float<From1_Policy>(x))))
+    return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = fma(x, y, to);
   else if (fpu_inverse_rounding(dir))
     to = -limit_precision(fma(-x, y, -to));
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
     to = fma(x, y, to);
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  prepare_inexact<Policy>(dir);
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y)) ||
+	  (y == 0 && is_inf_float<From1_Policy>(x))))
+    return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
   if (fpu_direct_rounding(dir))
     to = fma(x, -y, to);
   else if (fpu_inverse_rounding(dir))
     to = -limit_precision(fma(x, y, -to));
   else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
     to = fma(x, -y, to);
+    avoid_cse(to);
     fpu_restore_rounding_direction(old);
   }
-  return result_relation<Policy>(dir);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
 }
 
 template <typename Policy, typename Type>
@@ -749,188 +863,172 @@ output_float(std::ostream& os, const Type from, const Numeric_Format&,
     os << "nan";
   else {
     int old_precision = os.precision(10000);
+    // FIXME: here correctness depends on the behavior of the standard
+    // output operator which, in turn, may depend on the behavior
+    // of printf().  The C99 standard, 7.19.6#13, does not give
+    // enough guarantees.  We could not find something similar
+    // in the C++ standard, but perhaps there is a concrete danger here.
     os << from;
     os.precision(old_precision);
   }
   return V_EQ;
 }
 
-template <typename Policy, typename To>
-inline Result
-assign_float_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
-  to = -HUGE_VAL;
-  return V_EQ;
-}
-
-template <typename Policy, typename To>
-inline Result
-assign_float_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
-  to = HUGE_VAL;
-  return V_EQ;
-}
-
-template <typename Policy, typename To>
-inline Result
-assign_float_nan(To& to, const Not_A_Number&, Rounding_Dir) {
-  to = NAN;
-  return V_EQ;
-}
-
 #if PPL_SUPPORTED_FLOAT
-SPECIALIZE_ASSIGN(float_float_exact, float, float)
+SPECIALIZE_ASSIGN(assign_float_float_exact, float, float)
 #if PPL_SUPPORTED_DOUBLE
-SPECIALIZE_ASSIGN(float_float, float, double)
-SPECIALIZE_ASSIGN(float_float_exact, double, float)
+SPECIALIZE_ASSIGN(assign_float_float, float, double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, double, float)
 #endif
 #if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_ASSIGN(float_float, float, long double)
-SPECIALIZE_ASSIGN(float_float_exact, long double, float)
+SPECIALIZE_ASSIGN(assign_float_float, float, long double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, long double, float)
 #endif
 #endif
 
 #if PPL_SUPPORTED_DOUBLE
-SPECIALIZE_ASSIGN(float_float_exact, double, double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, double, double)
 #if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_ASSIGN(float_float, double, long double)
-SPECIALIZE_ASSIGN(float_float_exact, long double, double)
+SPECIALIZE_ASSIGN(assign_float_float, double, long double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, long double, double)
 #endif
 #endif
 
 #if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_ASSIGN(float_float_exact, long double, long double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, long double, long double)
 #endif
 
 #if PPL_SUPPORTED_FLOAT
-SPECIALIZE_CLASSIFY(float, float)
-SPECIALIZE_IS_NAN(float, float)
-SPECIALIZE_IS_MINF(float, float)
-SPECIALIZE_IS_PINF(float, float)
-SPECIALIZE_SET_SPECIAL(float, float)
-SPECIALIZE_ASSIGN(float_int, float, signed char)
-SPECIALIZE_ASSIGN(float_int, float, signed short)
-SPECIALIZE_ASSIGN(float_int, float, signed int)
-SPECIALIZE_ASSIGN(float_int, float, signed long)
-SPECIALIZE_ASSIGN(float_int, float, signed long long)
-SPECIALIZE_ASSIGN(float_int, float, unsigned char)
-SPECIALIZE_ASSIGN(float_int, float, unsigned short)
-SPECIALIZE_ASSIGN(float_int, float, unsigned int)
-SPECIALIZE_ASSIGN(float_int, float, unsigned long)
-SPECIALIZE_ASSIGN(float_int, float, unsigned long long)
-SPECIALIZE_ASSIGN(float_mpz, float, mpz_class)
-SPECIALIZE_ASSIGN(float_mpq, float, mpq_class)
-SPECIALIZE_COPY(generic, float)
-SPECIALIZE_IS_INT(float, float)
-SPECIALIZE_ASSIGN(float_minf, float, Minus_Infinity)
-SPECIALIZE_ASSIGN(float_pinf, float, Plus_Infinity)
-SPECIALIZE_ASSIGN(float_nan, float, Not_A_Number)
-SPECIALIZE_NEG(float, float, float)
-SPECIALIZE_ABS(float, float, float)
-SPECIALIZE_ADD(float, float, float, float)
-SPECIALIZE_SUB(float, float, float, float)
-SPECIALIZE_MUL(float, float, float, float)
-SPECIALIZE_DIV(float, float, float, float)
-SPECIALIZE_REM(float, float, float, float)
-SPECIALIZE_MUL2EXP(float, float, float)
-SPECIALIZE_DIV2EXP(float, float, float)
-SPECIALIZE_SQRT(float, float, float)
-SPECIALIZE_GCD(exact, float, float, float)
-SPECIALIZE_GCDEXT(exact, float, float, float, float, float)
-SPECIALIZE_LCM(gcd_exact, float, float, float)
-SPECIALIZE_SGN(float, float)
-SPECIALIZE_CMP(float, float, float)
-SPECIALIZE_ADD_MUL(float, float, float, float)
-SPECIALIZE_SUB_MUL(float, float, float, float)
-SPECIALIZE_INPUT(generic, float)
-SPECIALIZE_OUTPUT(float, float)
+SPECIALIZE_CLASSIFY(classify_float, float)
+SPECIALIZE_IS_NAN(is_nan_float, float)
+SPECIALIZE_IS_MINF(is_minf_float, float)
+SPECIALIZE_IS_PINF(is_pinf_float, float)
+SPECIALIZE_SET_SPECIAL(set_special_float, float)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed char)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed short)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed int)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed long)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed long long)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned char)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned short)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned int)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long long)
+SPECIALIZE_ASSIGN(assign_float_mpz, float, mpz_class)
+SPECIALIZE_ASSIGN(assign_float_mpq, float, mpq_class)
+SPECIALIZE_COPY(copy_generic, float)
+SPECIALIZE_IS_INT(is_int_float, float)
+SPECIALIZE_FLOOR(floor_float, float, float)
+SPECIALIZE_CEIL(ceil_float, float, float)
+SPECIALIZE_TRUNC(trunc_float, float, float)
+SPECIALIZE_NEG(neg_float, float, float)
+SPECIALIZE_ABS(abs_float, float, float)
+SPECIALIZE_ADD(add_float, float, float, float)
+SPECIALIZE_SUB(sub_float, float, float, float)
+SPECIALIZE_MUL(mul_float, float, float, float)
+SPECIALIZE_DIV(div_float, float, float, float)
+SPECIALIZE_REM(rem_float, float, float, float)
+SPECIALIZE_MUL2EXP(mul2exp_float, float, float)
+SPECIALIZE_DIV2EXP(div2exp_float, float, float)
+SPECIALIZE_SQRT(sqrt_float, float, float)
+SPECIALIZE_GCD(gcd_exact, float, float, float)
+SPECIALIZE_GCDEXT(gcdext_exact, float, float, float, float, float)
+SPECIALIZE_LCM(lcm_gcd_exact, float, float, float)
+SPECIALIZE_SGN(sgn_float, float)
+SPECIALIZE_CMP(cmp_float, float, float)
+SPECIALIZE_ADD_MUL(add_mul_float, float, float, float)
+SPECIALIZE_SUB_MUL(sub_mul_float, float, float, float)
+SPECIALIZE_INPUT(input_generic, float)
+SPECIALIZE_OUTPUT(output_float, float)
 #endif
 
 #if PPL_SUPPORTED_DOUBLE
-SPECIALIZE_CLASSIFY(float, double)
-SPECIALIZE_IS_NAN(float, double)
-SPECIALIZE_IS_MINF(float, double)
-SPECIALIZE_IS_PINF(float, double)
-SPECIALIZE_SET_SPECIAL(float, double)
-SPECIALIZE_ASSIGN(float_int, double, signed char)
-SPECIALIZE_ASSIGN(float_int, double, signed short)
-SPECIALIZE_ASSIGN(float_int, double, signed int)
-SPECIALIZE_ASSIGN(float_int, double, signed long)
-SPECIALIZE_ASSIGN(float_int, double, signed long long)
-SPECIALIZE_ASSIGN(float_int, double, unsigned char)
-SPECIALIZE_ASSIGN(float_int, double, unsigned short)
-SPECIALIZE_ASSIGN(float_int, double, unsigned int)
-SPECIALIZE_ASSIGN(float_int, double, unsigned long)
-SPECIALIZE_ASSIGN(float_int, double, unsigned long long)
-SPECIALIZE_ASSIGN(float_mpz, double, mpz_class)
-SPECIALIZE_ASSIGN(float_mpq, double, mpq_class)
-SPECIALIZE_COPY(generic, double)
-SPECIALIZE_IS_INT(float, double)
-SPECIALIZE_ASSIGN(float_minf, double, Minus_Infinity)
-SPECIALIZE_ASSIGN(float_pinf, double, Plus_Infinity)
-SPECIALIZE_ASSIGN(float_nan, double, Not_A_Number)
-SPECIALIZE_NEG(float, double, double)
-SPECIALIZE_ABS(float, double, double)
-SPECIALIZE_ADD(float, double, double, double)
-SPECIALIZE_SUB(float, double, double, double)
-SPECIALIZE_MUL(float, double, double, double)
-SPECIALIZE_DIV(float, double, double, double)
-SPECIALIZE_REM(float, double, double, double)
-SPECIALIZE_MUL2EXP(float, double, double)
-SPECIALIZE_DIV2EXP(float, double, double)
-SPECIALIZE_SQRT(float, double, double)
-SPECIALIZE_GCD(exact, double, double, double)
-SPECIALIZE_GCDEXT(exact, double, double, double, double, double)
-SPECIALIZE_LCM(gcd_exact, double, double, double)
-SPECIALIZE_SGN(float, double)
-SPECIALIZE_CMP(float, double, double)
-SPECIALIZE_ADD_MUL(float, double, double, double)
-SPECIALIZE_SUB_MUL(float, double, double, double)
-SPECIALIZE_INPUT(generic, double)
-SPECIALIZE_OUTPUT(float, double)
+SPECIALIZE_CLASSIFY(classify_float, double)
+SPECIALIZE_IS_NAN(is_nan_float, double)
+SPECIALIZE_IS_MINF(is_minf_float, double)
+SPECIALIZE_IS_PINF(is_pinf_float, double)
+SPECIALIZE_SET_SPECIAL(set_special_float, double)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed char)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed short)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed int)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed long)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed long long)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned char)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned short)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned int)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long long)
+SPECIALIZE_ASSIGN(assign_float_mpz, double, mpz_class)
+SPECIALIZE_ASSIGN(assign_float_mpq, double, mpq_class)
+SPECIALIZE_COPY(copy_generic, double)
+SPECIALIZE_IS_INT(is_int_float, double)
+SPECIALIZE_FLOOR(floor_float, double, double)
+SPECIALIZE_CEIL(ceil_float, double, double)
+SPECIALIZE_TRUNC(trunc_float, double, double)
+SPECIALIZE_NEG(neg_float, double, double)
+SPECIALIZE_ABS(abs_float, double, double)
+SPECIALIZE_ADD(add_float, double, double, double)
+SPECIALIZE_SUB(sub_float, double, double, double)
+SPECIALIZE_MUL(mul_float, double, double, double)
+SPECIALIZE_DIV(div_float, double, double, double)
+SPECIALIZE_REM(rem_float, double, double, double)
+SPECIALIZE_MUL2EXP(mul2exp_float, double, double)
+SPECIALIZE_DIV2EXP(div2exp_float, double, double)
+SPECIALIZE_SQRT(sqrt_float, double, double)
+SPECIALIZE_GCD(gcd_exact, double, double, double)
+SPECIALIZE_GCDEXT(gcdext_exact, double, double, double, double, double)
+SPECIALIZE_LCM(lcm_gcd_exact, double, double, double)
+SPECIALIZE_SGN(sgn_float, double)
+SPECIALIZE_CMP(cmp_float, double, double)
+SPECIALIZE_ADD_MUL(add_mul_float, double, double, double)
+SPECIALIZE_SUB_MUL(sub_mul_float, double, double, double)
+SPECIALIZE_INPUT(input_generic, double)
+SPECIALIZE_OUTPUT(output_float, double)
 #endif
 
 #if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_CLASSIFY(float, long double)
-SPECIALIZE_IS_NAN(float, long double)
-SPECIALIZE_IS_MINF(float, long double)
-SPECIALIZE_IS_PINF(float, long double)
-SPECIALIZE_SET_SPECIAL(float, long double)
-SPECIALIZE_ASSIGN(float_int, long double, signed char)
-SPECIALIZE_ASSIGN(float_int, long double, signed short)
-SPECIALIZE_ASSIGN(float_int, long double, signed int)
-SPECIALIZE_ASSIGN(float_int, long double, signed long)
-SPECIALIZE_ASSIGN(float_int, long double, signed long long)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned char)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned short)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned int)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned long)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned long long)
-SPECIALIZE_ASSIGN(float_mpz, long double, mpz_class)
-SPECIALIZE_ASSIGN(float_mpq, long double, mpq_class)
-SPECIALIZE_COPY(generic, long double)
-SPECIALIZE_IS_INT(float, long double)
-SPECIALIZE_ASSIGN(float_minf, long double, Minus_Infinity)
-SPECIALIZE_ASSIGN(float_pinf, long double, Plus_Infinity)
-SPECIALIZE_ASSIGN(float_nan, long double, Not_A_Number)
-SPECIALIZE_NEG(float, long double, long double)
-SPECIALIZE_ABS(float, long double, long double)
-SPECIALIZE_ADD(float, long double, long double, long double)
-SPECIALIZE_SUB(float, long double, long double, long double)
-SPECIALIZE_MUL(float, long double, long double, long double)
-SPECIALIZE_DIV(float, long double, long double, long double)
-SPECIALIZE_REM(float, long double, long double, long double)
-SPECIALIZE_MUL2EXP(float, long double, long double)
-SPECIALIZE_DIV2EXP(float, long double, long double)
-SPECIALIZE_SQRT(float, long double, long double)
-SPECIALIZE_GCD(exact, long double, long double, long double)
-SPECIALIZE_GCDEXT(exact, long double, long double, long double,
+SPECIALIZE_CLASSIFY(classify_float, long double)
+SPECIALIZE_IS_NAN(is_nan_float, long double)
+SPECIALIZE_IS_MINF(is_minf_float, long double)
+SPECIALIZE_IS_PINF(is_pinf_float, long double)
+SPECIALIZE_SET_SPECIAL(set_special_float, long double)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed char)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed short)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed int)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed long)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed long long)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned char)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned short)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned int)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long long)
+SPECIALIZE_ASSIGN(assign_float_mpz, long double, mpz_class)
+SPECIALIZE_ASSIGN(assign_float_mpq, long double, mpq_class)
+SPECIALIZE_COPY(copy_generic, long double)
+SPECIALIZE_IS_INT(is_int_float, long double)
+SPECIALIZE_FLOOR(floor_float, long double, long double)
+SPECIALIZE_CEIL(ceil_float, long double, long double)
+SPECIALIZE_TRUNC(trunc_float, long double, long double)
+SPECIALIZE_NEG(neg_float, long double, long double)
+SPECIALIZE_ABS(abs_float, long double, long double)
+SPECIALIZE_ADD(add_float, long double, long double, long double)
+SPECIALIZE_SUB(sub_float, long double, long double, long double)
+SPECIALIZE_MUL(mul_float, long double, long double, long double)
+SPECIALIZE_DIV(div_float, long double, long double, long double)
+SPECIALIZE_REM(rem_float, long double, long double, long double)
+SPECIALIZE_MUL2EXP(mul2exp_float, long double, long double)
+SPECIALIZE_DIV2EXP(div2exp_float, long double, long double)
+SPECIALIZE_SQRT(sqrt_float, long double, long double)
+SPECIALIZE_GCD(gcd_exact, long double, long double, long double)
+SPECIALIZE_GCDEXT(gcdext_exact, long double, long double, long double,
 		  long double, long double)
-SPECIALIZE_LCM(gcd_exact, long double, long double, long double)
-SPECIALIZE_SGN(float, long double)
-SPECIALIZE_CMP(float, long double, long double)
-SPECIALIZE_ADD_MUL(float, long double, long double, long double)
-SPECIALIZE_SUB_MUL(float, long double, long double, long double)
-SPECIALIZE_INPUT(generic, long double)
-SPECIALIZE_OUTPUT(float, long double)
+SPECIALIZE_LCM(lcm_gcd_exact, long double, long double, long double)
+SPECIALIZE_SGN(sgn_float, long double)
+SPECIALIZE_CMP(cmp_float, long double, long double)
+SPECIALIZE_ADD_MUL(add_mul_float, long double, long double, long double)
+SPECIALIZE_SUB_MUL(sub_mul_float, long double, long double, long double)
+SPECIALIZE_INPUT(input_generic, long double)
+SPECIALIZE_OUTPUT(output_float, long double)
 #endif
 
 } // namespace Checked
diff --git a/src/checked_int.inlines.hh b/src/checked_int.inlines.hh
index 303d5b3..16e7893 100644
--- a/src/checked_int.inlines.hh
+++ b/src/checked_int.inlines.hh
@@ -1,11 +1,11 @@
 /* Specialized "checked" functions for native integer numbers.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,24 +23,18 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_checked_int_inlines_hh
 #define PPL_checked_int_inlines_hh 1
 
-#include "Limits.hh"
+#include "C_Integer.hh"
 #include <cerrno>
 #include <cstdlib>
 #include <climits>
 #include <string>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
 
-#if !HAVE_DECL_STRTOLL
+#if !PPL_HAVE_DECL_STRTOLL
 signed long long
 strtoll(const char* nptr, char** endptr, int base);
 #endif
 
-#if !HAVE_DECL_STRTOULL
+#if !PPL_HAVE_DECL_STRTOULL
 unsigned long long
 strtoull(const char* nptr, char** endptr, int base);
 #endif
@@ -49,57 +43,57 @@ namespace Parma_Polyhedra_Library {
 
 namespace Checked {
 
-#ifndef HAVE_INT_FAST16_T
+#ifndef PPL_HAVE_INT_FAST16_T
 typedef int16_t int_fast16_t;
 #endif
 
-#ifndef HAVE_INT_FAST32_T
+#ifndef PPL_HAVE_INT_FAST32_T
 typedef int32_t int_fast32_t;
 #endif
 
-#ifndef HAVE_INT_FAST64_T
+#ifndef PPL_HAVE_INT_FAST64_T
 typedef int64_t int_fast64_t;
 #endif
 
-#ifndef HAVE_UINT_FAST16_T
+#ifndef PPL_HAVE_UINT_FAST16_T
 typedef uint16_t uint_fast16_t;
 #endif
 
-#ifndef HAVE_UINT_FAST32_T
+#ifndef PPL_HAVE_UINT_FAST32_T
 typedef uint32_t uint_fast32_t;
 #endif
 
-#ifndef HAVE_UINT_FAST64_T
+#ifndef PPL_HAVE_UINT_FAST64_T
 typedef uint64_t uint_fast64_t;
 #endif
 
 template <typename Policy, typename Type>
 struct Extended_Int {
-  static const Type plus_infinity = Limits<Type>::max;
-  static const Type minus_infinity = (Limits<Type>::min >= 0
-				      ? Limits<Type>::max - 1
-				      : Limits<Type>::min);
-  static const Type not_a_number = (Limits<Type>::min >= 0
-				    ? Limits<Type>::max - Policy::handle_infinity * 2
-				    : Limits<Type>::min + Policy::handle_infinity);
-  static const Type min = (Limits<Type>::min
-			   + (Limits<Type>::min >= 0 ? 0
-			      : (Policy::handle_infinity + Policy::handle_nan)));
-  static const Type max = (Limits<Type>::max
-			   - (Limits<Type>::min >= 0
-			      ? (2 * Policy::handle_infinity + Policy::handle_nan)
-			      : Policy::handle_infinity));
+  static const Type plus_infinity = C_Integer<Type>::max;
+  static const Type minus_infinity = (C_Integer<Type>::min >= 0
+				      ? C_Integer<Type>::max - 1
+				      : C_Integer<Type>::min);
+  static const Type not_a_number = (C_Integer<Type>::min >= 0
+				    ? C_Integer<Type>::max - Policy::has_infinity * 2
+				    : C_Integer<Type>::min + Policy::has_infinity);
+  static const Type min = (C_Integer<Type>::min
+			   + (C_Integer<Type>::min >= 0 ? 0
+			      : (Policy::has_infinity + Policy::has_nan)));
+  static const Type max = (C_Integer<Type>::max
+			   - (C_Integer<Type>::min >= 0
+			      ? (2 * Policy::has_infinity + Policy::has_nan)
+			      : Policy::has_infinity));
 };
 
 template <typename Policy, typename To>
 inline Result
 set_neg_overflow_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
+  if (round_up(dir)) {
     to = Extended_Int<Policy, To>::min;
     return V_LT;
   }
   else {
-    if (Policy::handle_infinity) {
+    if (Policy::has_infinity) {
       to = Extended_Int<Policy, To>::minus_infinity;
       return V_GT;
     }
@@ -110,12 +104,12 @@ set_neg_overflow_int(To& to, Rounding_Dir dir) {
 template <typename Policy, typename To>
 inline Result
 set_pos_overflow_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     to = Extended_Int<Policy, To>::max;
     return V_GT;
   }
   else {
-    if (Policy::handle_infinity) {
+    if (Policy::has_infinity) {
       to = Extended_Int<Policy, To>::plus_infinity;
       return V_LT;
     }
@@ -126,8 +120,8 @@ set_pos_overflow_int(To& to, Rounding_Dir dir) {
 template <typename Policy, typename To>
 inline Result
 round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
-    to--;
+  if (round_down(dir)) {
+    --to;
     return V_GT;
   }
   return V_LT;
@@ -136,8 +130,8 @@ round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
 template <typename Policy, typename To>
 inline Result
 round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
-    to++;
+  if (round_up(dir)) {
+    ++to;
     return V_LT;
   }
   return V_GT;
@@ -146,15 +140,16 @@ round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
 template <typename Policy, typename To>
 inline Result
 round_lt_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     if (to == Extended_Int<Policy, To>::min) {
-      if (Policy::handle_infinity) {
+      if (Policy::has_infinity) {
 	to = Extended_Int<Policy, To>::minus_infinity;
 	return V_GT;
       }
       return V_NEG_OVERFLOW;
-    } else {
-      to--;
+    }
+    else {
+      --to;
       return V_GT;
     }
   }
@@ -164,42 +159,43 @@ round_lt_int(To& to, Rounding_Dir dir) {
 template <typename Policy, typename To>
 inline Result
 round_gt_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
+  if (round_up(dir)) {
     if (to == Extended_Int<Policy, To>::max) {
-      if (Policy::handle_infinity) {
+      if (Policy::has_infinity) {
 	to = Extended_Int<Policy, To>::plus_infinity;
 	return V_LT;
       }
       return V_POS_OVERFLOW;
-    } else {
-      to++;
+    }
+    else {
+      ++to;
       return V_LT;
     }
   }
   return V_GT;
 }
 
-SPECIALIZE_COPY(generic, signed char)
-SPECIALIZE_COPY(generic, signed short)
-SPECIALIZE_COPY(generic, signed int)
-SPECIALIZE_COPY(generic, signed long)
-SPECIALIZE_COPY(generic, signed long long)
-SPECIALIZE_COPY(generic, unsigned char)
-SPECIALIZE_COPY(generic, unsigned short)
-SPECIALIZE_COPY(generic, unsigned int)
-SPECIALIZE_COPY(generic, unsigned long)
-SPECIALIZE_COPY(generic, unsigned long long)
+SPECIALIZE_COPY(copy_generic, signed char)
+SPECIALIZE_COPY(copy_generic, signed short)
+SPECIALIZE_COPY(copy_generic, signed int)
+SPECIALIZE_COPY(copy_generic, signed long)
+SPECIALIZE_COPY(copy_generic, signed long long)
+SPECIALIZE_COPY(copy_generic, unsigned char)
+SPECIALIZE_COPY(copy_generic, unsigned short)
+SPECIALIZE_COPY(copy_generic, unsigned int)
+SPECIALIZE_COPY(copy_generic, unsigned long)
+SPECIALIZE_COPY(copy_generic, unsigned long long)
 
 template <typename Policy, typename Type>
 inline Result
 classify_int(const Type v, bool nan, bool inf, bool sign) {
-  if (Policy::handle_nan
+  if (Policy::has_nan
       && (nan || sign)
       && v == Extended_Int<Policy, Type>::not_a_number)
     return VC_NAN;
   if (!inf & !sign)
     return VC_NORMAL;
-  if (Policy::handle_infinity) {
+  if (Policy::has_infinity) {
     if (v == Extended_Int<Policy, Type>::minus_infinity)
       return inf ? VC_MINUS_INFINITY : V_LT;
     if (v == Extended_Int<Policy, Type>::plus_infinity)
@@ -215,69 +211,69 @@ classify_int(const Type v, bool nan, bool inf, bool sign) {
   return VC_NORMAL;
 }
 
-SPECIALIZE_CLASSIFY(int, signed char)
-SPECIALIZE_CLASSIFY(int, signed short)
-SPECIALIZE_CLASSIFY(int, signed int)
-SPECIALIZE_CLASSIFY(int, signed long)
-SPECIALIZE_CLASSIFY(int, signed long long)
-SPECIALIZE_CLASSIFY(int, unsigned char)
-SPECIALIZE_CLASSIFY(int, unsigned short)
-SPECIALIZE_CLASSIFY(int, unsigned int)
-SPECIALIZE_CLASSIFY(int, unsigned long)
-SPECIALIZE_CLASSIFY(int, unsigned long long)
+SPECIALIZE_CLASSIFY(classify_int, signed char)
+SPECIALIZE_CLASSIFY(classify_int, signed short)
+SPECIALIZE_CLASSIFY(classify_int, signed int)
+SPECIALIZE_CLASSIFY(classify_int, signed long)
+SPECIALIZE_CLASSIFY(classify_int, signed long long)
+SPECIALIZE_CLASSIFY(classify_int, unsigned char)
+SPECIALIZE_CLASSIFY(classify_int, unsigned short)
+SPECIALIZE_CLASSIFY(classify_int, unsigned int)
+SPECIALIZE_CLASSIFY(classify_int, unsigned long)
+SPECIALIZE_CLASSIFY(classify_int, unsigned long long)
 
 template <typename Policy, typename Type>
 inline bool
 is_nan_int(const Type v) {
-  return Policy::handle_nan && v == Extended_Int<Policy, Type>::not_a_number;
+  return Policy::has_nan && v == Extended_Int<Policy, Type>::not_a_number;
 }
 
-SPECIALIZE_IS_NAN(int, signed char)
-SPECIALIZE_IS_NAN(int, signed short)
-SPECIALIZE_IS_NAN(int, signed int)
-SPECIALIZE_IS_NAN(int, signed long)
-SPECIALIZE_IS_NAN(int, signed long long)
-SPECIALIZE_IS_NAN(int, unsigned char)
-SPECIALIZE_IS_NAN(int, unsigned short)
-SPECIALIZE_IS_NAN(int, unsigned int)
-SPECIALIZE_IS_NAN(int, unsigned long)
-SPECIALIZE_IS_NAN(int, unsigned long long)
+SPECIALIZE_IS_NAN(is_nan_int, signed char)
+SPECIALIZE_IS_NAN(is_nan_int, signed short)
+SPECIALIZE_IS_NAN(is_nan_int, signed int)
+SPECIALIZE_IS_NAN(is_nan_int, signed long)
+SPECIALIZE_IS_NAN(is_nan_int, signed long long)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned char)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned short)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned int)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned long)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned long long)
 
 template <typename Policy, typename Type>
 inline bool
 is_minf_int(const Type v) {
-  return Policy::handle_infinity
+  return Policy::has_infinity
     && v == Extended_Int<Policy, Type>::minus_infinity;
 }
 
-SPECIALIZE_IS_MINF(int, signed char)
-SPECIALIZE_IS_MINF(int, signed short)
-SPECIALIZE_IS_MINF(int, signed int)
-SPECIALIZE_IS_MINF(int, signed long)
-SPECIALIZE_IS_MINF(int, signed long long)
-SPECIALIZE_IS_MINF(int, unsigned char)
-SPECIALIZE_IS_MINF(int, unsigned short)
-SPECIALIZE_IS_MINF(int, unsigned int)
-SPECIALIZE_IS_MINF(int, unsigned long)
-SPECIALIZE_IS_MINF(int, unsigned long long)
+SPECIALIZE_IS_MINF(is_minf_int, signed char)
+SPECIALIZE_IS_MINF(is_minf_int, signed short)
+SPECIALIZE_IS_MINF(is_minf_int, signed int)
+SPECIALIZE_IS_MINF(is_minf_int, signed long)
+SPECIALIZE_IS_MINF(is_minf_int, signed long long)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned char)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned short)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned int)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned long)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned long long)
 
 template <typename Policy, typename Type>
 inline bool
 is_pinf_int(const Type v) {
-  return Policy::handle_infinity
+  return Policy::has_infinity
     && v == Extended_Int<Policy, Type>::plus_infinity;
 }
 
-SPECIALIZE_IS_PINF(int, signed char)
-SPECIALIZE_IS_PINF(int, signed short)
-SPECIALIZE_IS_PINF(int, signed int)
-SPECIALIZE_IS_PINF(int, signed long)
-SPECIALIZE_IS_PINF(int, signed long long)
-SPECIALIZE_IS_PINF(int, unsigned char)
-SPECIALIZE_IS_PINF(int, unsigned short)
-SPECIALIZE_IS_PINF(int, unsigned int)
-SPECIALIZE_IS_PINF(int, unsigned long)
-SPECIALIZE_IS_PINF(int, unsigned long long)
+SPECIALIZE_IS_PINF(is_pinf_int, signed char)
+SPECIALIZE_IS_PINF(is_pinf_int, signed short)
+SPECIALIZE_IS_PINF(is_pinf_int, signed int)
+SPECIALIZE_IS_PINF(is_pinf_int, signed long)
+SPECIALIZE_IS_PINF(is_pinf_int, signed long long)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned char)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned short)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned int)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned long)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned long long)
 
 template <typename Policy, typename Type>
 inline bool
@@ -285,31 +281,31 @@ is_int_int(const Type v) {
   return !is_nan<Policy>(v);
 }
 
-SPECIALIZE_IS_INT(int, signed char)
-SPECIALIZE_IS_INT(int, signed short)
-SPECIALIZE_IS_INT(int, signed int)
-SPECIALIZE_IS_INT(int, signed long)
-SPECIALIZE_IS_INT(int, signed long long)
-SPECIALIZE_IS_INT(int, unsigned char)
-SPECIALIZE_IS_INT(int, unsigned short)
-SPECIALIZE_IS_INT(int, unsigned int)
-SPECIALIZE_IS_INT(int, unsigned long)
-SPECIALIZE_IS_INT(int, unsigned long long)
+SPECIALIZE_IS_INT(is_int_int, signed char)
+SPECIALIZE_IS_INT(is_int_int, signed short)
+SPECIALIZE_IS_INT(is_int_int, signed int)
+SPECIALIZE_IS_INT(is_int_int, signed long)
+SPECIALIZE_IS_INT(is_int_int, signed long long)
+SPECIALIZE_IS_INT(is_int_int, unsigned char)
+SPECIALIZE_IS_INT(is_int_int, unsigned short)
+SPECIALIZE_IS_INT(is_int_int, unsigned int)
+SPECIALIZE_IS_INT(is_int_int, unsigned long)
+SPECIALIZE_IS_INT(is_int_int, unsigned long long)
 
 template <typename Policy, typename Type>
 inline Result
 set_special_int(Type& v, Result r) {
   Result t = classify(r);
-  if (Policy::handle_nan && t == VC_NAN)
+  if (Policy::has_nan && t == VC_NAN)
     v = Extended_Int<Policy, Type>::not_a_number;
-  else if (Policy::handle_infinity) {
+  else if (Policy::has_infinity) {
     switch (t) {
     case VC_MINUS_INFINITY:
       v = Extended_Int<Policy, Type>::minus_infinity;
-      break;
+      return V_EQ;
     case VC_PLUS_INFINITY:
       v = Extended_Int<Policy, Type>::plus_infinity;
-      break;
+      return V_EQ;
     default:
       break;
     }
@@ -317,65 +313,70 @@ set_special_int(Type& v, Result r) {
   return r;
 }
 
-SPECIALIZE_SET_SPECIAL(int, signed char)
-SPECIALIZE_SET_SPECIAL(int, signed short)
-SPECIALIZE_SET_SPECIAL(int, signed int)
-SPECIALIZE_SET_SPECIAL(int, signed long)
-SPECIALIZE_SET_SPECIAL(int, signed long long)
-SPECIALIZE_SET_SPECIAL(int, unsigned char)
-SPECIALIZE_SET_SPECIAL(int, unsigned short)
-SPECIALIZE_SET_SPECIAL(int, unsigned int)
-SPECIALIZE_SET_SPECIAL(int, unsigned long)
-SPECIALIZE_SET_SPECIAL(int, unsigned long long)
-
-template <typename Policy, typename To, typename From>
+SPECIALIZE_SET_SPECIAL(set_special_int, signed char)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed short)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed int)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed long)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed long long)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned char)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned short)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned int)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned long)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(To) <= sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from < static_cast<From>(Extended_Int<Policy, To>::min)))
-      return set_neg_overflow_int<Policy>(to, dir);
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+	  && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
+	      || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
+    if (CHECK_P(To_Policy::check_overflow,
+		from < static_cast<From>(Extended_Int<To_Policy, To>::min)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = To(from);
   return V_EQ;
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
   if (sizeof(To) <= sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = To(from);
   return V_EQ;
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_overflow, from < 0))
-    return set_neg_overflow_int<Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, from < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
   if (sizeof(To) < sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = To(from);
   return V_EQ;
 }
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(To) <= sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+	  && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = To(from);
   return V_EQ;
@@ -383,25 +384,25 @@ assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
 
 
 #define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_signed_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_signed_int, Larger, Smaller)
+SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Larger, Smaller)
 
 #define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Larger, Smaller)
+SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Larger, Smaller)
 
 #define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_signed_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_unsigned_int, Larger, Smaller)
+SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Larger, Smaller)
 
 #define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_unsigned_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_signed_int, Larger, Smaller)
+SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Larger, Smaller)
 
 #define ASSIGN_SIGNED(Type) \
-SPECIALIZE_ASSIGN(signed_int_signed_int, Type, Type)
+SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Type, Type)
 #define ASSIGN_UNSIGNED(Type) \
-SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Type, Type)
+SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Type, Type)
 
 ASSIGN_SIGNED(signed char)
 ASSIGN_SIGNED(signed short)
@@ -460,76 +461,100 @@ ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
 ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
 ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
 
-template <typename Policy, typename To, typename From>
+template <typename To_Policy, typename From_Policy, typename To, typename From>
 inline Result
 assign_int_float(To& to, const From from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_overflow, (from < Extended_Int<Policy, To>::min)))
-    return set_neg_overflow_int<Policy>(to, dir);
-  if (CHECK_P(Policy::check_overflow, (from > Extended_Int<Policy, To>::max)))
-    return set_pos_overflow_int<Policy>(to, dir);
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      to = Extended_Int<To_Policy, To>::minus_infinity;
+      return V_EQ;
+    }
+    if (round_up(dir)) {
+      to = Extended_Int<To_Policy, To>::min;
+      return V_LT;
+    }
+    return VC_MINUS_INFINITY;
+  }
+  else if (is_pinf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      to = Extended_Int<To_Policy, To>::plus_infinity;
+      return V_EQ;
+    }
+    if (round_down(dir)) {
+      to = Extended_Int<To_Policy, To>::max;
+      return V_GT;
+    }
+    return VC_PLUS_INFINITY;
+  }
+  if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int<To_Policy, To>::min)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int<To_Policy, To>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
   to = static_cast<To>(from);
-  if (dir == ROUND_IGNORE)
+  if (round_ignore(dir))
     return V_LGE;
   if (from < to)
-    return round_lt_int<Policy>(to, dir);
+    return round_lt_int<To_Policy>(to, dir);
   else if (from > to)
-    return round_gt_int<Policy>(to, dir);
+    return round_gt_int<To_Policy>(to, dir);
   else
     return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(int_float, signed char, float)
-SPECIALIZE_ASSIGN(int_float, signed short, float)
-SPECIALIZE_ASSIGN(int_float, signed int, float)
-SPECIALIZE_ASSIGN(int_float, signed long, float)
-SPECIALIZE_ASSIGN(int_float, signed long long, float)
-SPECIALIZE_ASSIGN(int_float, unsigned char, float)
-SPECIALIZE_ASSIGN(int_float, unsigned short, float)
-SPECIALIZE_ASSIGN(int_float, unsigned int, float)
-SPECIALIZE_ASSIGN(int_float, unsigned long, float)
-SPECIALIZE_ASSIGN(int_float, unsigned long long, float)
-
-SPECIALIZE_ASSIGN(int_float, signed char, double)
-SPECIALIZE_ASSIGN(int_float, signed short, double)
-SPECIALIZE_ASSIGN(int_float, signed int, double)
-SPECIALIZE_ASSIGN(int_float, signed long, double)
-SPECIALIZE_ASSIGN(int_float, signed long long, double)
-SPECIALIZE_ASSIGN(int_float, unsigned char, double)
-SPECIALIZE_ASSIGN(int_float, unsigned short, double)
-SPECIALIZE_ASSIGN(int_float, unsigned int, double)
-SPECIALIZE_ASSIGN(int_float, unsigned long, double)
-SPECIALIZE_ASSIGN(int_float, unsigned long long, double)
-
-SPECIALIZE_ASSIGN(int_float, signed char, long double)
-SPECIALIZE_ASSIGN(int_float, signed short, long double)
-SPECIALIZE_ASSIGN(int_float, signed int, long double)
-SPECIALIZE_ASSIGN(int_float, signed long, long double)
-SPECIALIZE_ASSIGN(int_float, signed long long, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned char, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned short, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned int, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned long, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned long long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed char, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed short, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed int, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed long, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed long long, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned char, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned short, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned int, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, float)
+
+SPECIALIZE_ASSIGN(assign_int_float, signed char, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed short, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed int, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long long, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned char, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned short, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned int, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, double)
+
+SPECIALIZE_ASSIGN(assign_int_float, signed char, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed short, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed int, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned char, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned short, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned int, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, long double)
 
 #undef ASSIGN2_SIGNED_SIGNED
 #undef ASSIGN2_UNSIGNED_UNSIGNED
 #undef ASSIGN2_UNSIGNED_SIGNED
 #undef ASSIGN2_SIGNED_UNSIGNED
 
-template <typename Policy, typename To>
+template <typename To_Policy, typename From_Policy, typename To>
 inline Result
 assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
   if (sizeof(To) <= sizeof(signed long)) {
-    if (!Policy::check_overflow) {
+    if (!To_Policy::check_overflow) {
       to = from.get_si();
       return V_EQ;
     }
     if (from.fits_slong_p()) {
       signed long v = from.get_si();
-      if (v < Limits<To>::min)
-	return set_neg_overflow_int<Policy>(to, dir);
-      if (v > Limits<To>::max)
-	return set_pos_overflow_int<Policy>(to, dir);
+      if (v < C_Integer<To>::min)
+	return set_neg_overflow_int<To_Policy>(to, dir);
+      if (v > C_Integer<To>::max)
+	return set_pos_overflow_int<To_Policy>(to, dir);
       to = v;
       return V_EQ;
     }
@@ -546,37 +571,37 @@ assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
       mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
       if (v >= 0) {
 	if (::sgn(from) < 0)
-	  return neg<Policy>(to, v, dir);
+	  return neg<To_Policy, To_Policy>(to, v, dir);
 	to = v;
 	return V_EQ;
       }
     }
   }
   return ::sgn(from) < 0
-    ? set_neg_overflow_int<Policy>(to, dir)
-    : set_pos_overflow_int<Policy>(to, dir);
+    ? set_neg_overflow_int<To_Policy>(to, dir)
+    : set_pos_overflow_int<To_Policy>(to, dir);
 }
 
-SPECIALIZE_ASSIGN(signed_int_mpz, signed char, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed short, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed int, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed long, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed long long, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed char, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed short, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed int, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long long, mpz_class)
 
-template <typename Policy, typename To>
+template <typename To_Policy, typename From_Policy, typename To>
 inline Result
 assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_overflow, ::sgn(from) < 0))
-    return set_neg_overflow_int<Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, ::sgn(from) < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
   if (sizeof(To) <= sizeof(unsigned long)) {
-    if (!Policy::check_overflow) {
+    if (!To_Policy::check_overflow) {
       to = from.get_ui();
       return V_EQ;
     }
     if (from.fits_ulong_p()) {
       unsigned long v = from.get_ui();
-      if (v > Limits<To>::max)
-	return set_pos_overflow_int<Policy>(to, dir);
+      if (v > C_Integer<To>::max)
+	return set_pos_overflow_int<To_Policy>(to, dir);
       to = v;
       return V_EQ;
     }
@@ -592,25 +617,25 @@ assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
       return V_EQ;
     }
   }
-  return set_pos_overflow_int<Policy>(to, dir);
+  return set_pos_overflow_int<To_Policy>(to, dir);
 }
 
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned char, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned short, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned int, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long long, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned char, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned short, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned int, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long long, mpz_class)
 
-template <typename Policy, typename To>
+template <typename To_Policy, typename From_Policy, typename To>
 inline Result
 assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
   mpz_srcptr n = from.get_num().get_mpz_t();
   mpz_srcptr d = from.get_den().get_mpz_t();
-  mpz_class q;
+  DIRTY_TEMP0(mpz_class, q);
   mpz_ptr _q = q.get_mpz_t();
-  if (dir == ROUND_IGNORE) {
+  if (round_ignore(dir)) {
     mpz_tdiv_q(_q, n, d);
-    Result r = assign<Policy>(to, q, dir);
+    Result r = assign<To_Policy, void>(to, q, dir);
     if (r != V_EQ)
       return r;
     return V_LGE;
@@ -621,100 +646,29 @@ assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
   mpz_tdiv_qr(_q, rem, n, d);
   sign = mpz_sgn(rem);
   mpz_clear(rem);
-  Result r = assign<Policy>(to, q, dir);
+  Result r = assign<To_Policy, void>(to, q, dir);
   if (r != V_EQ)
     return r;
   switch (sign) {
   case -1:
-    return round_lt_int<Policy>(to, dir);
+    return round_lt_int<To_Policy>(to, dir);
   case 1:
-    return round_gt_int<Policy>(to, dir);
+    return round_gt_int<To_Policy>(to, dir);
   default:
     return V_EQ;
   }
 }
 
-SPECIALIZE_ASSIGN(int_mpq, signed char, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed short, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed int, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed long, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed long long, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned char, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned short, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned int, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned long, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned long long, mpq_class)
-
-template <typename Policy, typename To>
-inline Result
-assign_int_minf(To& to, const Minus_Infinity&, Rounding_Dir dir) {
-  if (Policy::handle_infinity) {
-    to = Extended_Int<Policy, To>::minus_infinity;
-    return V_EQ;
-  }
-  if (dir == ROUND_UP) {
-    to = Extended_Int<Policy, To>::min;
-    return V_LT;
-  }
-  return VC_MINUS_INFINITY;
-}
-
-template <typename Policy, typename To>
-inline Result
-assign_int_pinf(To& to, const Plus_Infinity&, Rounding_Dir dir) {
-  if (Policy::handle_infinity) {
-    to = Extended_Int<Policy, To>::plus_infinity;
-    return V_EQ;
-  }
-  if (dir == ROUND_DOWN) {
-    to = Extended_Int<Policy, To>::max;
-    return V_GT;
-  }
-  return VC_PLUS_INFINITY;
-}
-
-template <typename Policy, typename To>
-inline Result
-assign_int_nan(To& to, const Not_A_Number&, Rounding_Dir) {
-  if (Policy::handle_nan) {
-    to = Extended_Int<Policy, To>::not_a_number;
-    return V_EQ;
-  }
-  return VC_NAN;
-}
-
-SPECIALIZE_ASSIGN(int_minf, signed char, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed short, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed int, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed long, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed long long, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned char, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned short, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned int, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned long, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned long long, Minus_Infinity)
-
-SPECIALIZE_ASSIGN(int_pinf, signed char, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed short, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed int, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed long, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed long long, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned char, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned short, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned int, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned long, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned long long, Plus_Infinity)
-
-SPECIALIZE_ASSIGN(int_nan, signed char, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed short, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed int, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed long, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed long long, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned char, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned short, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned int, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned long, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed char, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed short, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed int, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed long, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed long long, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned char, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned short, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned int, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long long, mpq_class)
 
 #if UCHAR_MAX == 0xff
 #define CHAR_BITS 8
@@ -752,7 +706,7 @@ SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
 template <typename T>
 struct Larger;
 
-// The following may be tuned for performance on specific architecture.
+// The following may be tuned for performance on specific architectures.
 //
 // Current guidelines:
 //   - avoid division where possible (larger type variant for mul)
@@ -760,243 +714,243 @@ struct Larger;
 
 template <>
 struct Larger<signed char> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast16_t Type_For_Neg;
-  typedef int_fast16_t  Type_For_Add;
-  typedef int_fast16_t  Type_For_Sub;
-  typedef int_fast16_t  Type_For_Mul;
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef int_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef int_fast16_t type_for_mul;
 };
 
 template <>
 struct Larger<unsigned char> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast16_t Type_For_Neg;
-  typedef uint_fast16_t Type_For_Add;
-  typedef int_fast16_t Type_For_Sub;
-  typedef uint_fast16_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef uint_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef uint_fast16_t type_for_mul;
 };
 
 template <>
 struct Larger<signed short> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast32_t Type_For_Neg;
-  typedef int_fast32_t Type_For_Add;
-  typedef int_fast32_t Type_For_Sub;
-  typedef int_fast32_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef int_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef int_fast32_t type_for_mul;
 };
 
 template <>
 struct Larger<unsigned short> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast32_t Type_For_Neg;
-  typedef uint_fast32_t Type_For_Add;
-  typedef int_fast32_t Type_For_Sub;
-  typedef uint_fast32_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef uint_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef uint_fast32_t type_for_mul;
 };
 
 template <>
 struct Larger<signed int> {
-  static const bool use_for_neg = (LONG_BITS == 64);
-  static const bool use_for_add = (LONG_BITS == 64);
-  static const bool use_for_sub = (LONG_BITS == 64);
-  static const bool use_for_mul = true;
-  typedef int_fast64_t Type_For_Neg;
-  typedef int_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef int_fast64_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
 };
 
 template <>
 struct Larger<unsigned int> {
-  static const bool use_for_neg = (LONG_BITS == 64);
-  static const bool use_for_add = (LONG_BITS == 64);
-  static const bool use_for_sub = (LONG_BITS == 64);
-  static const bool use_for_mul = true;
-  typedef int_fast64_t Type_For_Neg;
-  typedef uint_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef uint_fast64_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
 };
 
 template <>
 struct Larger<signed long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = (LONG_BITS == 32);
-  typedef int_fast64_t Type_For_Neg;
-  typedef int_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef int_fast64_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
 };
 
 template <>
 struct Larger<unsigned long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = (LONG_BITS == 32);
-  typedef int_fast64_t Type_For_Neg;
-  typedef uint_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef uint_fast64_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
 };
 
 template <>
 struct Larger<signed long long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = false;
-  typedef int_fast64_t Type_For_Neg;
-  typedef int_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef int_fast64_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
 };
 
 template <>
 struct Larger<unsigned long long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = false;
-  typedef int_fast64_t Type_For_Neg;
-  typedef uint_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef uint_fast64_t Type_For_Mul;
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
 };
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Neg l = x;
+  typename Larger<Type>::type_for_neg l = x;
   l = -l;
-  return assign<Policy>(to, l, dir);
+  return assign<To_Policy, To_Policy>(to, l, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Add l = x;
+  typename Larger<Type>::type_for_add l = x;
   l += y;
-  return assign<Policy>(to, l, dir);
+  return assign<To_Policy, To_Policy>(to, l, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Sub l = x;
+  typename Larger<Type>::type_for_sub l = x;
   l -= y;
-  return assign<Policy>(to, l, dir);
+  return assign<To_Policy, To_Policy>(to, l, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Mul l = x;
+  typename Larger<Type>::type_for_mul l = x;
   l *= y;
-  return assign<Policy>(to, l, dir);
+  return assign<To_Policy, To_Policy>(to, l, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_neg)
-    return neg_int_larger<Policy>(to, from, dir);
-  if (CHECK_P(Policy::check_overflow,
-	      (from < -Extended_Int<Policy, Type>::max)))
-    return set_pos_overflow_int<Policy>(to, dir);
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+	      (from < -Extended_Int<To_Policy, Type>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
   to = -from;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_neg)
-    return neg_int_larger<Policy>(to, from, dir);
-  if (CHECK_P(Policy::check_overflow, from != 0))
-    return set_neg_overflow_int<Policy>(to, dir);
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow, from != 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
   to = from;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_add)
-    return add_int_larger<Policy>(to, x, y, dir);
-  if (Policy::check_overflow) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
     if (y >= 0) {
-      if (x > Extended_Int<Policy, Type>::max - y)
-	return set_pos_overflow_int<Policy>(to, dir);
+      if (x > Extended_Int<To_Policy, Type>::max - y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
     }
-    else if (x < Extended_Int<Policy, Type>::min - y)
-	return set_neg_overflow_int<Policy>(to, dir);
+    else if (x < Extended_Int<To_Policy, Type>::min - y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
   }
   to = x + y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_add)
-    return add_int_larger<Policy>(to, x, y, dir);
-  if (CHECK_P(Policy::check_overflow,
-	      (x > Extended_Int<Policy, Type>::max - y)))
-    return set_pos_overflow_int<Policy>(to, dir);
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+	      (x > Extended_Int<To_Policy, Type>::max - y)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
   to = x + y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_sub)
-    return sub_int_larger<Policy>(to, x, y, dir);
-  if (Policy::check_overflow) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
     if (y >= 0) {
-      if (x < Extended_Int<Policy, Type>::min + y)
-	return set_neg_overflow_int<Policy>(to, dir);
+      if (x < Extended_Int<To_Policy, Type>::min + y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
     }
-    else if (x > Extended_Int<Policy, Type>::max + y)
-	return set_pos_overflow_int<Policy>(to, dir);
+    else if (x > Extended_Int<To_Policy, Type>::max + y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = x - y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_sub)
-    return sub_int_larger<Policy>(to, x, y, dir);
-  if (CHECK_P(Policy::check_overflow,
-	      (x < Extended_Int<Policy, Type>::min + y)))
-    return set_neg_overflow_int<Policy>(to, dir);
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+	      (x < Extended_Int<To_Policy, Type>::min + y)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
   to = x - y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_mul)
-    return mul_int_larger<Policy>(to, x, y, dir);
-  if (!Policy::check_overflow) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
     to = x * y;
     return V_EQ;
   }
@@ -1005,37 +959,37 @@ mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
     return V_EQ;
   }
   if (y == -1)
-    return neg_signed_int<Policy>(to, x, dir);
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
   if (x >= 0) {
     if (y > 0) {
-      if (x > Extended_Int<Policy, Type>::max / y)
-	return set_pos_overflow_int<Policy>(to, dir);
+      if (x > Extended_Int<To_Policy, Type>::max / y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
     }
     else {
-      if (x > Extended_Int<Policy, Type>::min / y)
-	return set_neg_overflow_int<Policy>(to, dir);
+      if (x > Extended_Int<To_Policy, Type>::min / y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
     }
   }
   else {
     if (y < 0) {
-      if (x < Extended_Int<Policy, Type>::max / y)
-	return set_pos_overflow_int<Policy>(to, dir);
+      if (x < Extended_Int<To_Policy, Type>::max / y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
     }
     else {
-      if (x < Extended_Int<Policy, Type>::min / y)
-	return set_neg_overflow_int<Policy>(to, dir);
+      if (x < Extended_Int<To_Policy, Type>::min / y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
     }
   }
   to = x * y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_mul)
-    return mul_int_larger<Policy>(to, x, y, dir);
-  if (!Policy::check_overflow) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
     to = x * y;
     return V_EQ;
   }
@@ -1043,95 +997,124 @@ mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
     to = 0;
     return V_EQ;
   }
-  if (x > Extended_Int<Policy, Type>::max / y)
-    return set_pos_overflow_int<Policy>(to, dir);
+  if (x > Extended_Int<To_Policy, Type>::max / y)
+    return set_pos_overflow_int<To_Policy>(to, dir);
   to = x * y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_div_zero, y == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
-  if (Policy::check_overflow && y == -1)
-    return neg_signed_int<Policy>(to, x, dir);
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
   to = x / y;
-  if (dir == ROUND_IGNORE)
+  if (round_ignore(dir))
     return V_LGE;
   Type m = x % y;
   if (m < 0)
-    return round_lt_int_no_overflow<Policy>(to, dir);
+    return round_lt_int_no_overflow<To_Policy>(to, dir);
   else if (m > 0)
-    return round_gt_int_no_overflow<Policy>(to, dir);
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
   else
     return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_div_zero, y == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
   to = x / y;
-  if (dir == ROUND_IGNORE)
+  if (round_ignore(dir))
     return V_GE;
   Type m = x % y;
   if (m == 0)
     return V_EQ;
-  return round_gt_int<Policy>(to, dir);
+  return round_gt_int<To_Policy>(to, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+idiv_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
-rem_int(Type& to, const Type x, const Type y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, y == 0))
-    return set_special<Policy>(to, V_MOD_ZERO);
+idiv_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+rem_signed_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
   to = x % y;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+rem_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
     to = 0;
-    if (dir == ROUND_IGNORE)
+    if (round_ignore(dir))
       return V_GE;
     if (x == 0)
       return V_EQ;
-    return round_gt_int_no_overflow<Policy>(to, dir);
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
   }
   to = x >> exp;
-  if (dir == ROUND_IGNORE)
+  if (round_ignore(dir))
     return V_GE;
   if (x & ((static_cast<Type>(1) << exp) - 1))
-    return round_gt_int_no_overflow<Policy>(to, dir);
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
   else
     return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
   zero:
     to = 0;
-    if (dir == ROUND_IGNORE)
+    if (round_ignore(dir))
       return V_LGE;
     if (x < 0)
-      return round_lt_int_no_overflow<Policy>(to, dir);
+      return round_lt_int_no_overflow<To_Policy>(to, dir);
     else if (x > 0)
-      return round_gt_int_no_overflow<Policy>(to, dir);
+      return round_gt_int_no_overflow<To_Policy>(to, dir);
     else
       return V_EQ;
   }
   if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
-    if (x == Limits<Type>::min) {
+    if (x == C_Integer<Type>::min) {
       to = -1;
       return V_EQ;
     }
@@ -1139,32 +1122,32 @@ div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
   }
 #if 0
   to = x / (static_cast<Type>(1) << exp);
-  if (dir == ROUND_IGNORE)
+  if (round_ignore(dir))
     return V_GE;
   Type r = x % (static_cast<Type>(1) << exp);
   if (r < 0)
-    return round_lt_int_no_overflow<Policy>(to, dir);
+    return round_lt_int_no_overflow<To_Policy>(to, dir);
   else if (r > 0)
-    return round_gt_int_no_overflow<Policy>(to, dir);
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
   else
     return V_EQ;
 #else
   // Faster but compiler implementation dependent (see C++98 5.8.3)
   to = x >> exp;
-  if (dir == ROUND_IGNORE)
+  if (round_ignore(dir))
     return V_GE;
   if (x & ((static_cast<Type>(1) << exp) - 1))
-    return round_gt_int_no_overflow<Policy>(to, dir);
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
   return V_EQ;
 #endif
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  if (!Policy::check_overflow) {
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  if (!To_Policy::check_overflow) {
     to = x << exp;
     return V_EQ;
   }
@@ -1173,31 +1156,31 @@ mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
       to = 0;
       return V_EQ;
     }
-    return set_pos_overflow_int<Policy>(to, dir);
+    return set_pos_overflow_int<To_Policy>(to, dir);
   }
   if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
-    return set_pos_overflow_int<Policy>(to, dir);
+    return set_pos_overflow_int<To_Policy>(to, dir);
   Type n = x << exp;
-  if (n > Extended_Int<Policy, Type>::max)
-    return set_pos_overflow_int<Policy>(to, dir);
+  if (n > Extended_Int<To_Policy, Type>::max)
+    return set_pos_overflow_int<To_Policy>(to, dir);
   to = n;
   return V_EQ;
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  if (!Policy::check_overflow) {
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  if (!To_Policy::check_overflow) {
     to = x << exp;
     return V_EQ;
   }
   if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
     if (x < 0)
-      return set_neg_overflow_int<Policy>(to, dir);
+      return set_neg_overflow_int<To_Policy>(to, dir);
     else if (x > 0)
-      return set_pos_overflow_int<Policy>(to, dir);
+      return set_pos_overflow_int<To_Policy>(to, dir);
     else {
       to = 0;
       return V_EQ;
@@ -1208,17 +1191,17 @@ mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
   Type n;
   if (x < 0) {
     if ((x & mask) != mask)
-      return set_neg_overflow_int<Policy>(to, dir);
+      return set_neg_overflow_int<To_Policy>(to, dir);
     n = x << exp;
-    if (n < Extended_Int<Policy, Type>::min)
-      return set_neg_overflow_int<Policy>(to, dir);
+    if (n < Extended_Int<To_Policy, Type>::min)
+      return set_neg_overflow_int<To_Policy>(to, dir);
   }
   else {
     if (x & mask)
-      return set_pos_overflow_int<Policy>(to, dir);
+      return set_pos_overflow_int<To_Policy>(to, dir);
     n = x << exp;
-    if (n > Extended_Int<Policy, Type>::max)
-      return set_pos_overflow_int<Policy>(to, dir);
+    if (n > Extended_Int<To_Policy, Type>::max)
+      return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = n;
   return V_EQ;
@@ -1226,7 +1209,7 @@ mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
 
 template <typename Type>
 inline void
-isqrtrem_(Type& q, Type& r, const Type from) {
+isqrtrem(Type& q, Type& r, const Type from) {
   q = 0;
   r = from;
   Type t(1);
@@ -1240,31 +1223,31 @@ isqrtrem_(Type& q, Type& r, const Type from) {
   }
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
   Type rem;
-  isqrtrem_(to, rem, from);
-  if (dir == ROUND_IGNORE)
+  isqrtrem(to, rem, from);
+  if (round_ignore(dir))
     return V_GE;
   if (rem == 0)
     return V_EQ;
-  return round_gt_int<Policy>(to, dir);
+  return round_gt_int<To_Policy>(to, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From_Policy, typename Type>
 inline Result
 sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
-    return set_special<Policy>(to, V_SQRT_NEG);
-  return sqrt_unsigned_int<Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  return sqrt_unsigned_int<To_Policy, From_Policy>(to, from, dir);
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
   Type z;
-  Result r = mul<Policy>(z, x, y, dir);
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
   switch (r) {
   case V_NEG_OVERFLOW:
   case V_LT:
@@ -1272,37 +1255,37 @@ add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
       to = z;
       return r;
     }
-    return set_special<Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+    return set_special<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
   case V_POS_OVERFLOW:
   case V_GT:
     if (to >= 0) {
       to = z;
       return r;
     }
-    return set_special<Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+    return set_special<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
   default:
-    return add<Policy>(to, to, z, dir);
+    return add<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
   }
 }
 
-template <typename Policy, typename Type>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
 inline Result
 sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
   Type z;
-  Result r = mul<Policy>(z, x, y, dir);
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
   switch (r) {
   case V_NEG_OVERFLOW:
   case V_LT:
     if (to >= 0)
-      return set_pos_overflow_int<Policy>(to, dir);
+      return set_pos_overflow_int<To_Policy>(to, dir);
     return V_UNKNOWN_NEG_OVERFLOW;
   case V_POS_OVERFLOW:
   case V_GT:
     if (to <= 0)
-      return set_neg_overflow_int<Policy>(to, dir);
+      return set_neg_overflow_int<To_Policy>(to, dir);
     return V_UNKNOWN_POS_OVERFLOW;
   default:
-    return sub<Policy>(to, to, z, dir);
+    return sub<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
   }
 }
 
@@ -1310,7 +1293,7 @@ template <typename Policy, typename Type>
 inline Result
 output_char(std::ostream& os, Type& from,
 	    const Numeric_Format&, Rounding_Dir) {
-  os << (int) from;
+  os << static_cast<int>(from);
   return V_EQ;
 }
 
@@ -1321,214 +1304,258 @@ output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
   return V_EQ;
 }
 
-SPECIALIZE_NEG(signed_int, signed char, signed char)
-SPECIALIZE_NEG(signed_int, signed short, signed short)
-SPECIALIZE_NEG(signed_int, signed int, signed int)
-SPECIALIZE_NEG(signed_int, signed long, signed long)
-SPECIALIZE_NEG(signed_int, signed long long, signed long long)
-SPECIALIZE_NEG(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_NEG(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_NEG(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_NEG(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_NEG(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_ADD(signed_int, signed char, signed char, signed char)
-SPECIALIZE_ADD(signed_int, signed short, signed short, signed short)
-SPECIALIZE_ADD(signed_int, signed int, signed int, signed int)
-SPECIALIZE_ADD(signed_int, signed long, signed long, signed long)
-SPECIALIZE_ADD(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_ADD(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_ADD(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_ADD(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_ADD(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_ADD(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_SUB(signed_int, signed char, signed char, signed char)
-SPECIALIZE_SUB(signed_int, signed short, signed short, signed short)
-SPECIALIZE_SUB(signed_int, signed int, signed int, signed int)
-SPECIALIZE_SUB(signed_int, signed long, signed long, signed long)
-SPECIALIZE_SUB(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_SUB(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_SUB(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_SUB(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_SUB(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_SUB(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_MUL(signed_int, signed char, signed char, signed char)
-SPECIALIZE_MUL(signed_int, signed short, signed short, signed short)
-SPECIALIZE_MUL(signed_int, signed int, signed int, signed int)
-SPECIALIZE_MUL(signed_int, signed long, signed long, signed long)
-SPECIALIZE_MUL(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_MUL(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_MUL(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_MUL(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_MUL(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_MUL(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_DIV(signed_int, signed char, signed char, signed char)
-SPECIALIZE_DIV(signed_int, signed short, signed short, signed short)
-SPECIALIZE_DIV(signed_int, signed int, signed int, signed int)
-SPECIALIZE_DIV(signed_int, signed long, signed long, signed long)
-SPECIALIZE_DIV(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_DIV(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_DIV(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_DIV(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_DIV(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_DIV(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_REM(int, signed char, signed char, signed char)
-SPECIALIZE_REM(int, signed short, signed short, signed short)
-SPECIALIZE_REM(int, signed int, signed int, signed int)
-SPECIALIZE_REM(int, signed long, signed long, signed long)
-SPECIALIZE_REM(int, signed long long, signed long long, signed long long)
-SPECIALIZE_REM(int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_REM(int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_REM(int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_REM(int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_REM(int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_MUL2EXP(signed_int, signed char, signed char)
-SPECIALIZE_MUL2EXP(signed_int, signed short, signed short)
-SPECIALIZE_MUL2EXP(signed_int, signed int, signed int)
-SPECIALIZE_MUL2EXP(signed_int, signed long, signed long)
-SPECIALIZE_MUL2EXP(signed_int, signed long long, signed long long)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_DIV2EXP(signed_int, signed char, signed char)
-SPECIALIZE_DIV2EXP(signed_int, signed short, signed short)
-SPECIALIZE_DIV2EXP(signed_int, signed int, signed int)
-SPECIALIZE_DIV2EXP(signed_int, signed long, signed long)
-SPECIALIZE_DIV2EXP(signed_int, signed long long, signed long long)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_SQRT(signed_int, signed char, signed char)
-SPECIALIZE_SQRT(signed_int, signed short, signed short)
-SPECIALIZE_SQRT(signed_int, signed int, signed int)
-SPECIALIZE_SQRT(signed_int, signed long, signed long)
-SPECIALIZE_SQRT(signed_int, signed long long, signed long long)
-SPECIALIZE_SQRT(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_SQRT(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_SQRT(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_SQRT(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_SQRT(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_ABS(generic, signed char, signed char)
-SPECIALIZE_ABS(generic, signed short, signed short)
-SPECIALIZE_ABS(generic, signed int, signed int)
-SPECIALIZE_ABS(generic, signed long, signed long)
-SPECIALIZE_ABS(generic, signed long long, signed long long)
-SPECIALIZE_ABS(generic, unsigned char, unsigned char)
-SPECIALIZE_ABS(generic, unsigned short, unsigned short)
-SPECIALIZE_ABS(generic, unsigned int, unsigned int)
-SPECIALIZE_ABS(generic, unsigned long, unsigned long)
-SPECIALIZE_ABS(generic, unsigned long long, unsigned long long)
-
-SPECIALIZE_GCD(exact, signed char, signed char, signed char)
-SPECIALIZE_GCD(exact, signed short, signed short, signed short)
-SPECIALIZE_GCD(exact, signed int, signed int, signed int)
-SPECIALIZE_GCD(exact, signed long, signed long, signed long)
-SPECIALIZE_GCD(exact, signed long long, signed long long, signed long long)
-SPECIALIZE_GCD(exact, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_GCD(exact, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_GCD(exact, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_GCD(exact, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_GCD(exact, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_GCDEXT(exact, signed char, signed char, signed char, signed char, signed char)
-SPECIALIZE_GCDEXT(exact, signed short, signed short, signed short, signed short, signed short)
-SPECIALIZE_GCDEXT(exact, signed int, signed int, signed int, signed int, signed int)
-SPECIALIZE_GCDEXT(exact, signed long, signed long, signed long, signed long, signed long)
-SPECIALIZE_GCDEXT(exact, signed long long, signed long long, signed long long, signed long long, signed long long)
-SPECIALIZE_GCDEXT(exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_GCDEXT(exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_GCDEXT(exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_GCDEXT(exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_GCDEXT(exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_LCM(gcd_exact, signed char, signed char, signed char)
-SPECIALIZE_LCM(gcd_exact, signed short, signed short, signed short)
-SPECIALIZE_LCM(gcd_exact, signed int, signed int, signed int)
-SPECIALIZE_LCM(gcd_exact, signed long, signed long, signed long)
-SPECIALIZE_LCM(gcd_exact, signed long long, signed long long, signed long long)
-SPECIALIZE_LCM(gcd_exact, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_LCM(gcd_exact, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_LCM(gcd_exact, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_LCM(gcd_exact, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_LCM(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_SGN(generic, signed char)
-SPECIALIZE_SGN(generic, signed short)
-SPECIALIZE_SGN(generic, signed int)
-SPECIALIZE_SGN(generic, signed long)
-SPECIALIZE_SGN(generic, signed long long)
-SPECIALIZE_SGN(generic, unsigned char)
-SPECIALIZE_SGN(generic, unsigned short)
-SPECIALIZE_SGN(generic, unsigned int)
-SPECIALIZE_SGN(generic, unsigned long)
-SPECIALIZE_SGN(generic, unsigned long long)
-
-SPECIALIZE_CMP(generic, signed char, signed char)
-SPECIALIZE_CMP(generic, signed short, signed short)
-SPECIALIZE_CMP(generic, signed int, signed int)
-SPECIALIZE_CMP(generic, signed long, signed long)
-SPECIALIZE_CMP(generic, signed long long, signed long long)
-SPECIALIZE_CMP(generic, unsigned char, unsigned char)
-SPECIALIZE_CMP(generic, unsigned short, unsigned short)
-SPECIALIZE_CMP(generic, unsigned int, unsigned int)
-SPECIALIZE_CMP(generic, unsigned long, unsigned long)
-SPECIALIZE_CMP(generic, unsigned long long, unsigned long long)
-
-SPECIALIZE_ADD_MUL(int, signed char, signed char, signed char)
-SPECIALIZE_ADD_MUL(int, signed short, signed short, signed short)
-SPECIALIZE_ADD_MUL(int, signed int, signed int, signed int)
-SPECIALIZE_ADD_MUL(int, signed long, signed long, signed long)
-SPECIALIZE_ADD_MUL(int, signed long long, signed long long, signed long long)
-SPECIALIZE_ADD_MUL(int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_ADD_MUL(int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_ADD_MUL(int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_ADD_MUL(int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_ADD_MUL(int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_SUB_MUL(int, signed char, signed char, signed char)
-SPECIALIZE_SUB_MUL(int, signed short, signed short, signed short)
-SPECIALIZE_SUB_MUL(int, signed int, signed int, signed int)
-SPECIALIZE_SUB_MUL(int, signed long, signed long, signed long)
-SPECIALIZE_SUB_MUL(int, signed long long, signed long long, signed long long)
-SPECIALIZE_SUB_MUL(int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_SUB_MUL(int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_SUB_MUL(int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_SUB_MUL(int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_SUB_MUL(int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_INPUT(generic, signed char)
-SPECIALIZE_INPUT(generic, signed short)
-SPECIALIZE_INPUT(generic, signed int)
-SPECIALIZE_INPUT(generic, signed long)
-SPECIALIZE_INPUT(generic, signed long long)
-SPECIALIZE_INPUT(generic, unsigned char)
-SPECIALIZE_INPUT(generic, unsigned short)
-SPECIALIZE_INPUT(generic, unsigned int)
-SPECIALIZE_INPUT(generic, unsigned long)
-SPECIALIZE_INPUT(generic, unsigned long long)
-
-SPECIALIZE_OUTPUT(char, signed char)
-SPECIALIZE_OUTPUT(int, signed short)
-SPECIALIZE_OUTPUT(int, signed int)
-SPECIALIZE_OUTPUT(int, signed long)
-SPECIALIZE_OUTPUT(int, signed long long)
-SPECIALIZE_OUTPUT(char, unsigned char)
-SPECIALIZE_OUTPUT(int, unsigned short)
-SPECIALIZE_OUTPUT(int, unsigned int)
-SPECIALIZE_OUTPUT(int, unsigned long)
-SPECIALIZE_OUTPUT(int, unsigned long long)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed char, signed char)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed short, signed short)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed int, signed int)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long, signed long)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long long, signed long long)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed char, signed char)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed short, signed short)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed int, signed int)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long, signed long)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long long, signed long long)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed char, signed char)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed short, signed short)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed int, signed int)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long, signed long)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long long, signed long long)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_NEG(neg_signed_int, signed char, signed char)
+SPECIALIZE_NEG(neg_signed_int, signed short, signed short)
+SPECIALIZE_NEG(neg_signed_int, signed int, signed int)
+SPECIALIZE_NEG(neg_signed_int, signed long, signed long)
+SPECIALIZE_NEG(neg_signed_int, signed long long, signed long long)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD(add_signed_int, signed char, signed char, signed char)
+SPECIALIZE_ADD(add_signed_int, signed short, signed short, signed short)
+SPECIALIZE_ADD(add_signed_int, signed int, signed int, signed int)
+SPECIALIZE_ADD(add_signed_int, signed long, signed long, signed long)
+SPECIALIZE_ADD(add_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD(add_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD(add_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD(add_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD(add_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD(add_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB(sub_signed_int, signed char, signed char, signed char)
+SPECIALIZE_SUB(sub_signed_int, signed short, signed short, signed short)
+SPECIALIZE_SUB(sub_signed_int, signed int, signed int, signed int)
+SPECIALIZE_SUB(sub_signed_int, signed long, signed long, signed long)
+SPECIALIZE_SUB(sub_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL(mul_signed_int, signed char, signed char, signed char)
+SPECIALIZE_MUL(mul_signed_int, signed short, signed short, signed short)
+SPECIALIZE_MUL(mul_signed_int, signed int, signed int, signed int)
+SPECIALIZE_MUL(mul_signed_int, signed long, signed long, signed long)
+SPECIALIZE_MUL(mul_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV(div_signed_int, signed char, signed char, signed char)
+SPECIALIZE_DIV(div_signed_int, signed short, signed short, signed short)
+SPECIALIZE_DIV(div_signed_int, signed int, signed int, signed int)
+SPECIALIZE_DIV(div_signed_int, signed long, signed long, signed long)
+SPECIALIZE_DIV(div_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_DIV(div_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_DIV(div_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_DIV(div_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_DIV(div_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_DIV(div_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_IDIV(idiv_signed_int, signed char, signed char, signed char)
+SPECIALIZE_IDIV(idiv_signed_int, signed short, signed short, signed short)
+SPECIALIZE_IDIV(idiv_signed_int, signed int, signed int, signed int)
+SPECIALIZE_IDIV(idiv_signed_int, signed long, signed long, signed long)
+SPECIALIZE_IDIV(idiv_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_REM(rem_signed_int, signed char, signed char, signed char)
+SPECIALIZE_REM(rem_signed_int, signed short, signed short, signed short)
+SPECIALIZE_REM(rem_signed_int, signed int, signed int, signed int)
+SPECIALIZE_REM(rem_signed_int, signed long, signed long, signed long)
+SPECIALIZE_REM(rem_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_REM(rem_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_REM(rem_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_REM(rem_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_REM(rem_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_REM(rem_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed char, signed char)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed short, signed short)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed int, signed int)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long, signed long)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long long, signed long long)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed char, signed char)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed short, signed short)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed int, signed int)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long, signed long)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long long, signed long long)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_SQRT(sqrt_signed_int, signed char, signed char)
+SPECIALIZE_SQRT(sqrt_signed_int, signed short, signed short)
+SPECIALIZE_SQRT(sqrt_signed_int, signed int, signed int)
+SPECIALIZE_SQRT(sqrt_signed_int, signed long, signed long)
+SPECIALIZE_SQRT(sqrt_signed_int, signed long long, signed long long)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ABS(abs_generic, signed char, signed char)
+SPECIALIZE_ABS(abs_generic, signed short, signed short)
+SPECIALIZE_ABS(abs_generic, signed int, signed int)
+SPECIALIZE_ABS(abs_generic, signed long, signed long)
+SPECIALIZE_ABS(abs_generic, signed long long, signed long long)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCD(gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_GCD(gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_GCD(gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_GCD(gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_GCD(gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_GCD(gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCD(gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCD(gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCD(gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCD(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCDEXT(gcdext_exact, signed char, signed char, signed char, signed char, signed char)
+SPECIALIZE_GCDEXT(gcdext_exact, signed short, signed short, signed short, signed short, signed short)
+SPECIALIZE_GCDEXT(gcdext_exact, signed int, signed int, signed int, signed int, signed int)
+SPECIALIZE_GCDEXT(gcdext_exact, signed long, signed long, signed long, signed long, signed long)
+SPECIALIZE_GCDEXT(gcdext_exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_LCM(lcm_gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_LCM(lcm_gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_LCM(lcm_gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_LCM(lcm_gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_LCM(lcm_gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SGN(sgn_generic, signed char)
+SPECIALIZE_SGN(sgn_generic, signed short)
+SPECIALIZE_SGN(sgn_generic, signed int)
+SPECIALIZE_SGN(sgn_generic, signed long)
+SPECIALIZE_SGN(sgn_generic, signed long long)
+SPECIALIZE_SGN(sgn_generic, unsigned char)
+SPECIALIZE_SGN(sgn_generic, unsigned short)
+SPECIALIZE_SGN(sgn_generic, unsigned int)
+SPECIALIZE_SGN(sgn_generic, unsigned long)
+SPECIALIZE_SGN(sgn_generic, unsigned long long)
+
+SPECIALIZE_CMP(cmp_generic, signed char, signed char)
+SPECIALIZE_CMP(cmp_generic, signed short, signed short)
+SPECIALIZE_CMP(cmp_generic, signed int, signed int)
+SPECIALIZE_CMP(cmp_generic, signed long, signed long)
+SPECIALIZE_CMP(cmp_generic, signed long long, signed long long)
+SPECIALIZE_CMP(cmp_generic, unsigned char, unsigned char)
+SPECIALIZE_CMP(cmp_generic, unsigned short, unsigned short)
+SPECIALIZE_CMP(cmp_generic, unsigned int, unsigned int)
+SPECIALIZE_CMP(cmp_generic, unsigned long, unsigned long)
+SPECIALIZE_CMP(cmp_generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD_MUL(add_mul_int, signed char, signed char, signed char)
+SPECIALIZE_ADD_MUL(add_mul_int, signed short, signed short, signed short)
+SPECIALIZE_ADD_MUL(add_mul_int, signed int, signed int, signed int)
+SPECIALIZE_ADD_MUL(add_mul_int, signed long, signed long, signed long)
+SPECIALIZE_ADD_MUL(add_mul_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB_MUL(sub_mul_int, signed char, signed char, signed char)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed short, signed short, signed short)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed int, signed int, signed int)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed long, signed long, signed long)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_INPUT(input_generic, signed char)
+SPECIALIZE_INPUT(input_generic, signed short)
+SPECIALIZE_INPUT(input_generic, signed int)
+SPECIALIZE_INPUT(input_generic, signed long)
+SPECIALIZE_INPUT(input_generic, signed long long)
+SPECIALIZE_INPUT(input_generic, unsigned char)
+SPECIALIZE_INPUT(input_generic, unsigned short)
+SPECIALIZE_INPUT(input_generic, unsigned int)
+SPECIALIZE_INPUT(input_generic, unsigned long)
+SPECIALIZE_INPUT(input_generic, unsigned long long)
+
+SPECIALIZE_OUTPUT(output_char, signed char)
+SPECIALIZE_OUTPUT(output_int, signed short)
+SPECIALIZE_OUTPUT(output_int, signed int)
+SPECIALIZE_OUTPUT(output_int, signed long)
+SPECIALIZE_OUTPUT(output_int, signed long long)
+SPECIALIZE_OUTPUT(output_char, unsigned char)
+SPECIALIZE_OUTPUT(output_int, unsigned short)
+SPECIALIZE_OUTPUT(output_int, unsigned int)
+SPECIALIZE_OUTPUT(output_int, unsigned long)
+SPECIALIZE_OUTPUT(output_int, unsigned long long)
 
 } // namespace Checked
 
diff --git a/src/checked_mpq.inlines.hh b/src/checked_mpq.inlines.hh
index ce5e380..3c6c4bb 100644
--- a/src/checked_mpq.inlines.hh
+++ b/src/checked_mpq.inlines.hh
@@ -1,11 +1,11 @@
 /* Specialized "checked" functions for GMP's mpq_class numbers.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,14 +34,14 @@ namespace Checked {
 template <typename Policy>
 inline Result
 classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
-  if ((Policy::handle_nan || Policy::handle_infinity)
+  if ((Policy::has_nan || Policy::has_infinity)
       && ::sgn(v.get_den()) == 0) {
     int s = ::sgn(v.get_num());
-    if (Policy::handle_nan && (nan || sign) && s == 0)
+    if (Policy::has_nan && (nan || sign) && s == 0)
       return VC_NAN;
     if (!inf && !sign)
       return VC_NORMAL;
-    if (Policy::handle_infinity) {
+    if (Policy::has_infinity) {
       if (s < 0)
 	return inf ? VC_MINUS_INFINITY : V_LT;
       if (s > 0)
@@ -53,64 +53,68 @@ classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
   return VC_NORMAL;
 }
 
-SPECIALIZE_CLASSIFY(mpq, mpq_class)
+SPECIALIZE_CLASSIFY(classify_mpq, mpq_class)
 
 template <typename Policy>
 inline bool
 is_nan_mpq(const mpq_class& v) {
-  return Policy::handle_nan
+  return Policy::has_nan
     && ::sgn(v.get_den()) == 0
     && ::sgn(v.get_num()) == 0;
 }
 
-SPECIALIZE_IS_NAN(mpq, mpq_class)
+SPECIALIZE_IS_NAN(is_nan_mpq, mpq_class)
 
 template <typename Policy>
 inline bool
 is_minf_mpq(const mpq_class& v) {
-  return Policy::handle_infinity
+  return Policy::has_infinity
     && ::sgn(v.get_den()) == 0
     && ::sgn(v.get_num()) < 0;
 }
 
-SPECIALIZE_IS_MINF(mpq, mpq_class)
+SPECIALIZE_IS_MINF(is_minf_mpq, mpq_class)
 
 template <typename Policy>
 inline bool
 is_pinf_mpq(const mpq_class& v) {
-  return Policy::handle_infinity
+  return Policy::has_infinity
     && ::sgn(v.get_den()) == 0
     && ::sgn(v.get_num()) > 0;
 }
 
-SPECIALIZE_IS_PINF(mpq, mpq_class)
+SPECIALIZE_IS_PINF(is_pinf_mpq, mpq_class)
 
 template <typename Policy>
 inline bool
 is_int_mpq(const mpq_class& v) {
-  return !is_nan<Policy>(v) && v.get_den() == 1;
+  if ((Policy::has_infinity || Policy::has_nan)
+      && ::sgn(v.get_den()) == 0)
+    return !(Policy::has_nan && ::sgn(v.get_num()) == 0);
+  else
+    return v.get_den() == 1;
 }
 
-SPECIALIZE_IS_INT(mpq, mpq_class)
+SPECIALIZE_IS_INT(is_int_mpq, mpq_class)
 
 template <typename Policy>
 inline Result
 set_special_mpq(mpq_class& v, Result r) {
   Result c = classify(r);
-  if (Policy::handle_nan && c == VC_NAN) {
+  if (Policy::has_nan && c == VC_NAN) {
     v.get_num() = 0;
     v.get_den() = 0;
   }
-  else if (Policy::handle_infinity) {
+  else if (Policy::has_infinity) {
     switch (c) {
     case VC_MINUS_INFINITY:
       v.get_num() = -1;
       v.get_den() = 0;
-      break;
+      return V_EQ;
     case VC_PLUS_INFINITY:
       v.get_num() = 1;
       v.get_den() = 0;
-      break;
+      return V_EQ;
     default:
       break;
     }
@@ -118,61 +122,89 @@ set_special_mpq(mpq_class& v, Result r) {
   return r;
 }
 
-SPECIALIZE_SET_SPECIAL(mpq, mpq_class)
+SPECIALIZE_SET_SPECIAL(set_special_mpq, mpq_class)
 
-SPECIALIZE_COPY(generic, mpq_class)
+SPECIALIZE_COPY(copy_generic, mpq_class)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
   new (&to) mpq_class(from);
   return V_EQ;
 }
 
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, mpz_class)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed char)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed short)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed int)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed long)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned char)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned short)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned int)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned long)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, float)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, double)
-
-template <typename Policy, typename From>
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, mpz_class)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed char)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed short)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed int)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed long)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned char)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned short)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned int)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
-construct_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
-  // FIXME: this is an incredibly inefficient implementation!
-  new (&to) mpq_class;
-  std::stringstream ss;
-  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
-  return input_mpq(to, ss);
+construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir) {
+  if (is_nan<From_Policy>(from)) {
+    if (To_Policy::has_nan) {
+      new (&to) mpq_class();
+      return set_special<To_Policy>(to, VC_NAN);
+    }
+    else
+      return VC_NAN;
+  }
+  else if (is_minf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpq_class();
+      return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+    }
+    else
+      return VC_MINUS_INFINITY;
+  }
+  else if (is_pinf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpq_class();
+      return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+    }
+    else
+      return VC_PLUS_INFINITY;
+  }
+  new (&to) mpq_class(from);
+  return V_EQ;
 }
 
-SPECIALIZE_CONSTRUCT(mpq_long_double, mpq_class, long double)
-
-template <typename Policy, typename From>
+SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, float)
+SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, double)
+
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpq_class)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpz_class)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed char)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed short)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed int)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed long)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned char)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned short)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned int)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
-assign_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+  else if (is_pinf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_PLUS_INFINITY);
   to = from;
   return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, mpz_class)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed char)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed short)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed int)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed long)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned char)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned short)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned int)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned long)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, float)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, double)
+SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float)
+SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
   if (sizeof(From) <= sizeof(signed long))
@@ -191,9 +223,9 @@ assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
   return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpq_signed_int, mpq_class, signed long long)
+SPECIALIZE_ASSIGN(assign_mpq_signed_int, mpq_class, signed long long)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
   if (sizeof(From) <= sizeof(unsigned long))
@@ -205,114 +237,147 @@ assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
   return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpq_unsigned_int, mpq_class, unsigned long long)
+SPECIALIZE_ASSIGN(assign_mpq_unsigned_int, mpq_class, unsigned long long)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy>
 inline Result
-assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
-  // FIXME: this is an incredibly inefficient implementation!
-  std::stringstream ss;
-  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
-  return input_mpq(to, ss);
+floor_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_fdiv_q(to.get_num().get_mpz_t(),
+	     from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpq_long_double, mpq_class, long double)
+SPECIALIZE_FLOOR(floor_mpq, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
+inline Result
+ceil_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_cdiv_q(to.get_num().get_mpz_t(),
+	     from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+SPECIALIZE_CEIL(ceil_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+trunc_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_tdiv_q(to.get_num().get_mpz_t(),
+	     from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+SPECIALIZE_TRUNC(trunc_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
 inline Result
 neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
   mpq_neg(to.get_mpq_t(), from.get_mpq_t());
   return V_EQ;
 }
 
-SPECIALIZE_NEG(mpq, mpq_class, mpq_class)
+SPECIALIZE_NEG(neg_mpq, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
   to = x + y;
   return V_EQ;
 }
 
-SPECIALIZE_ADD(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_ADD(add_mpq, mpq_class, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
   to = x - y;
   return V_EQ;
 }
 
-SPECIALIZE_SUB(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_SUB(sub_mpq, mpq_class, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
   to = x * y;
   return V_EQ;
 }
 
-SPECIALIZE_MUL(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_MUL(mul_mpq, mpq_class, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
   to = x / y;
   return V_EQ;
 }
 
-SPECIALIZE_DIV(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return trunc<To_Policy, To_Policy>(to, to, dir);
+}
+
+SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
-    return set_special<Policy>(to, V_MOD_ZERO);
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
   to = x / y;
   to.get_num() %= to.get_den();
   return V_EQ;
 }
 
-SPECIALIZE_REM(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
   to.get_den() = x.get_den();
   to.canonicalize();
   return V_EQ;
 }
 
-SPECIALIZE_MUL2EXP(mpq, mpq_class, mpq_class)
+SPECIALIZE_MUL2EXP(mul2exp_mpq, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   to.get_num() = x.get_num();
   mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
   to.canonicalize();
   return V_EQ;
 }
 
-SPECIALIZE_DIV2EXP(mpq, mpq_class, mpq_class)
+SPECIALIZE_DIV2EXP(div2exp_mpq, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
   to = abs(from);
   return V_EQ;
 }
 
-SPECIALIZE_ABS(mpq, mpq_class, mpq_class)
+SPECIALIZE_ABS(abs_mpq, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
 	    Rounding_Dir) {
@@ -320,9 +385,9 @@ add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
   return V_EQ;
 }
 
-SPECIALIZE_ADD_MUL(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_ADD_MUL(add_mul_mpq, mpq_class, mpq_class, mpq_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
 	    Rounding_Dir) {
@@ -330,40 +395,47 @@ sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
   return V_EQ;
 }
 
-SPECIALIZE_SUB_MUL(mpq, mpq_class, mpq_class, mpq_class)
+SPECIALIZE_SUB_MUL(sub_mul_mpq, mpq_class, mpq_class, mpq_class)
 
 extern unsigned long rational_sqrt_precision_parameter;
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
-    return set_special<Policy>(to, V_SQRT_NEG);
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
   const unsigned long k = rational_sqrt_precision_parameter;
   mpz_class& to_num = to.get_num();
-  mul2exp<Policy>(to_num, from.get_num(), 2*k, dir);
-  Result rdiv = div<Policy>(to_num, to_num, from.get_den(), dir);
-  Result rsqrt = sqrt<Policy>(to_num, to_num, dir);
+  mul2exp<To_Policy, From_Policy>(to_num, from.get_num(), 2*k, dir);
+  Result rdiv
+    = div<To_Policy, To_Policy, To_Policy>(to_num,
+					   to_num, from.get_den(), dir);
+  Result rsqrt = sqrt<To_Policy, To_Policy>(to_num, to_num, dir);
   mpz_class& to_den = to.get_den();
   to_den = 1;
-  mul2exp<Policy>(to_den, to_den, k, dir);
+  mul2exp<To_Policy, To_Policy>(to_den, to_den, k, dir);
   to.canonicalize();
   return rdiv != V_EQ ? rdiv : rsqrt;
 }
 
-SPECIALIZE_SQRT(mpq, mpq_class, mpq_class)
+SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class)
 
 template <typename Policy>
 inline Result
-input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir) {
   Result r = input_mpq(to, is);
-  if (r == VC_MINUS_INFINITY)
-    return assign<Policy>(to, MINUS_INFINITY, dir);
-  if (r == VC_PLUS_INFINITY)
-    return assign<Policy>(to, PLUS_INFINITY, dir);
-  return set_special<Policy>(to, r);
+  switch (classify(r)) {
+  case VC_MINUS_INFINITY:
+  case VC_PLUS_INFINITY:
+  case VC_NAN:
+    return set_special<Policy>(to, r);
+  default:
+    return r;
+  }
 }
 
+SPECIALIZE_INPUT(input_mpq, mpq_class)
+
 template <typename Policy>
 inline Result
 output_mpq(std::ostream& os,
@@ -374,15 +446,25 @@ output_mpq(std::ostream& os,
   return V_EQ;
 }
 
-SPECIALIZE_INPUT(mpq, mpq_class)
-SPECIALIZE_OUTPUT(mpq, mpq_class)
+SPECIALIZE_OUTPUT(output_mpq, mpq_class)
 
-inline memory_size_type
-external_memory_in_bytes(const mpq_class& x) {
-  return external_memory_in_bytes(x.get_num())
-    + external_memory_in_bytes(x.get_den());
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output<From_Policy>(ss, from, Numeric_Format(), dir);
+  return input_mpq(to, ss);
 }
 
+SPECIALIZE_ASSIGN(assign_mpq_long_double, mpq_class, long double)
+
 } // namespace Checked
 
 //! Returns the precision parameter used for rational square root calculations.
diff --git a/src/checked_mpz.inlines.hh b/src/checked_mpz.inlines.hh
index 71d83de..d5fd0d4 100644
--- a/src/checked_mpz.inlines.hh
+++ b/src/checked_mpz.inlines.hh
@@ -1,11 +1,11 @@
 /* Specialized "checked" functions for GMP's mpz_class numbers.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,6 +23,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_checked_mpz_inlines_hh
 #define PPL_checked_mpz_inlines_hh 1
 
+#include <sstream>
+
 namespace Parma_Polyhedra_Library {
 
 namespace Checked {
@@ -30,7 +32,7 @@ namespace Checked {
 template <typename Policy>
 inline Result
 round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     --to;
     return V_GT;
   }
@@ -40,17 +42,16 @@ round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
 template <typename Policy>
 inline Result
 round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
+  if (round_up(dir)) {
     ++to;
     return V_LT;
   }
   return V_GT;
 }
 
-// FIXME: change this when Autoconf will support AC_C_TYPEOF.
-#ifdef __GNUC__
+#ifdef PPL_HAVE_TYPEOF
 //! Type of the _mp_size field of GMP's __mpz_struct.
-typedef __typeof__(__mpz_struct()._mp_size) mp_size_field_t;
+typedef typeof(__mpz_struct()._mp_size) mp_size_field_t;
 #else
 //! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
 typedef int mp_size_field_t;
@@ -69,18 +70,18 @@ set_mp_size(mpz_class &v, mp_size_field_t size) {
 template <typename Policy>
 inline Result
 classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
-  if (Policy::handle_nan || Policy::handle_infinity) {
+  if (Policy::has_nan || Policy::has_infinity) {
     mp_size_field_t s = get_mp_size(v);
-    if (Policy::handle_nan
+    if (Policy::has_nan
 	&& (nan || sign)
-	&& s == Limits<mp_size_field_t>::min + 1)
+	&& s == C_Integer<mp_size_field_t>::min + 1)
       return VC_NAN;
     if (!inf && !sign)
       return VC_NORMAL;
-    if (Policy::handle_infinity) {
-      if (s == Limits<mp_size_field_t>::min)
+    if (Policy::has_infinity) {
+      if (s == C_Integer<mp_size_field_t>::min)
 	return inf ? VC_MINUS_INFINITY : V_LT;
-      if (s == Limits<mp_size_field_t>::max)
+      if (s == C_Integer<mp_size_field_t>::max)
 	return inf ? VC_PLUS_INFINITY : V_GT;
     }
   }
@@ -89,34 +90,34 @@ classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
   return VC_NORMAL;
 }
 
-SPECIALIZE_CLASSIFY(mpz, mpz_class)
+SPECIALIZE_CLASSIFY(classify_mpz, mpz_class)
 
 template <typename Policy>
 inline bool
 is_nan_mpz(const mpz_class& v) {
-  return Policy::handle_nan
-    && get_mp_size(v) == Limits<mp_size_field_t>::min + 1;
+  return Policy::has_nan
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min + 1;
 }
 
-SPECIALIZE_IS_NAN(mpz, mpz_class)
+SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class)
 
 template <typename Policy>
 inline bool
 is_minf_mpz(const mpz_class& v) {
-  return Policy::handle_infinity
-    && get_mp_size(v) == Limits<mp_size_field_t>::min;
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min;
 }
 
-SPECIALIZE_IS_MINF(mpz, mpz_class)
+SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class)
 
 template <typename Policy>
 inline bool
 is_pinf_mpz(const mpz_class& v) {
-  return Policy::handle_infinity
-    && get_mp_size(v) == Limits<mp_size_field_t>::max;
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::max;
 }
 
-SPECIALIZE_IS_PINF(mpz, mpz_class)
+SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class)
 
 template <typename Policy>
 inline bool
@@ -124,22 +125,22 @@ is_int_mpz(const mpz_class& v) {
   return !is_nan<Policy>(v);
 }
 
-SPECIALIZE_IS_INT(mpz, mpz_class)
+SPECIALIZE_IS_INT(is_int_mpz, mpz_class)
 
 template <typename Policy>
 inline Result
 set_special_mpz(mpz_class& v, Result r) {
   Result c = classify(r);
-  if (Policy::handle_nan && c == VC_NAN)
-    set_mp_size(v, Limits<mp_size_field_t>::min + 1);
-  else if (Policy::handle_infinity) {
+  if (Policy::has_nan && c == VC_NAN)
+    set_mp_size(v, C_Integer<mp_size_field_t>::min + 1);
+  else if (Policy::has_infinity) {
     switch (c) {
     case VC_MINUS_INFINITY:
-      set_mp_size(v, Limits<mp_size_field_t>::min);
-      break;
+      set_mp_size(v, C_Integer<mp_size_field_t>::min);
+      return V_EQ;
     case VC_PLUS_INFINITY:
-      set_mp_size(v, Limits<mp_size_field_t>::max);
-      break;
+      set_mp_size(v, C_Integer<mp_size_field_t>::max);
+      return V_EQ;
     default:
       break;
     }
@@ -147,53 +148,85 @@ set_special_mpz(mpz_class& v, Result r) {
   return r;
 }
 
-SPECIALIZE_SET_SPECIAL(mpz, mpz_class)
+SPECIALIZE_SET_SPECIAL(set_special_mpz, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline void
 copy_mpz(mpz_class& to, const mpz_class& from) {
-  if (is_nan_mpz<Policy>(from) ||
-      is_minf_mpz<Policy>(from) || is_pinf_mpz<Policy>(from))
-    set_mp_size(to, get_mp_size(from));
-  else
+  if (is_nan_mpz<From_Policy>(from))
+    assert(To_Policy::has_nan);
+  else if (is_minf_mpz<From_Policy>(from) || is_pinf_mpz<From_Policy>(from))
+    assert(To_Policy::has_infinity);
+  else {
     to = from;
+    return;
+  }
+  set_mp_size(to, get_mp_size(from));
 }
 
-SPECIALIZE_COPY(mpz, mpz_class)
+SPECIALIZE_COPY(copy_mpz, mpz_class)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
     new (&to) mpz_class(from);
     return V_EQ;
 }
 
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed char)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed short)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed int)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed long)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned char)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned short)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned int)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned long)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed char)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed short)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed int)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed long)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned char)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned short)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned int)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned long)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
-assign_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
-    to = static_cast<signed long>(from);
-    return V_EQ;
+construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir) {
+  if (is_nan<From_Policy>(from)) {
+    if (To_Policy::has_nan) {
+      new (&to) mpz_class();
+      return set_special<To_Policy>(to, VC_NAN);
+    }
+    else
+      return VC_NAN;
+  }
+  else if (is_minf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpz_class();
+      return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+    }
+    else
+      return VC_MINUS_INFINITY;
+  }
+  else if (is_pinf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpz_class();
+      return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+    }
+    else
+      return VC_PLUS_INFINITY;
+  }
+  new (&to) mpz_class(from);
+  return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed char)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed short)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed int)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed long)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned char)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned short)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned int)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned long)
+SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, float)
+SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, double)
 
-template <typename Policy, typename From>
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, mpz_class)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed char)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed short)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed int)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed long)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned char)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned short)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned int)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
   if (sizeof(From) <= sizeof(signed long))
@@ -211,9 +244,9 @@ assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
   return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpz_signed_int, mpz_class, signed long long)
+SPECIALIZE_ASSIGN(assign_mpz_signed_int, mpz_class, signed long long)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
   if (sizeof(From) <= sizeof(unsigned long))
@@ -223,203 +256,214 @@ assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
   return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpz_unsigned_int, mpz_class, unsigned long long)
+SPECIALIZE_ASSIGN(assign_mpz_unsigned_int, mpz_class, unsigned long long)
 
-template <typename Policy, typename From>
+template <typename To_Policy, typename From_Policy, typename From>
 inline Result
 assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
-  if (dir == ROUND_IGNORE) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+  else if (is_pinf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+  if (round_ignore(dir)) {
     to = from;
     return V_LGE;
   }
   From n = rint(from);
   to = n;
   if (from < n)
-    return round_lt_mpz<Policy>(to, dir);
+    return round_lt_mpz<To_Policy>(to, dir);
   else if (from > n)
-    return round_gt_mpz<Policy>(to, dir);
+    return round_gt_mpz<To_Policy>(to, dir);
   else
     return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpz_float, mpz_class, float)
-SPECIALIZE_ASSIGN(mpz_float, mpz_class, double)
+SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float)
+SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output<From_Policy>(ss, from, Numeric_Format(), dir);
+  DIRTY_TEMP0(mpq_class, tmp);
+#ifndef NDEBUG
+  Result r =
+#endif
+    input_mpq(tmp, ss);
+  assert(r == V_EQ);
+  return assign<To_Policy, From_Policy>(to, tmp, dir);
+}
+
+SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double)
+
+template <typename To_Policy, typename From_Policy>
 inline Result
 assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
-  if (dir == ROUND_IGNORE) {
+  if (round_ignore(dir)) {
     to = from;
     return V_LGE;
   }
   mpz_srcptr n = from.get_num().get_mpz_t();
   mpz_srcptr d = from.get_den().get_mpz_t();
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     mpz_fdiv_q(to.get_mpz_t(), n, d);
     return mpz_divisible_p(n, d) ? V_EQ : V_GT;
   }
   else {
-    assert(dir == ROUND_UP);
+    assert(round_up(dir));
     mpz_cdiv_q(to.get_mpz_t(), n, d);
     return mpz_divisible_p(n, d) ? V_EQ : V_LT;
   }
 }
 
-SPECIALIZE_ASSIGN(mpz_mpq, mpz_class, mpq_class)
-
-template <typename Policy, typename To>
-inline Result
-assign_mp_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
-  if (Policy::handle_infinity) {
-    set_special<Policy>(to, VC_MINUS_INFINITY);
-    return V_EQ;
-  }
-  return VC_MINUS_INFINITY;
-}
+SPECIALIZE_ASSIGN(assign_mpz_mpq, mpz_class, mpq_class)
 
-template <typename Policy, typename To>
-inline Result
-assign_mp_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
-  if (Policy::handle_infinity) {
-    set_special<Policy>(to, VC_PLUS_INFINITY);
-    return V_EQ;
-  }
-  return VC_PLUS_INFINITY;
-}
+SPECIALIZE_FLOOR(assign_exact, mpz_class, mpz_class)
+SPECIALIZE_CEIL(assign_exact, mpz_class, mpz_class)
+SPECIALIZE_TRUNC(assign_exact, mpz_class, mpz_class)
 
-template <typename Policy, typename To>
-inline Result
-assign_mp_nan(To& to, const Not_A_Number&, Rounding_Dir) {
-  if (Policy::handle_nan) {
-    set_special<Policy>(to, VC_NAN);
-    return V_EQ;
-  }
-  return VC_NAN;
-}
-
-SPECIALIZE_ASSIGN(mp_minf, mpz_class, Minus_Infinity)
-SPECIALIZE_ASSIGN(mp_pinf, mpz_class, Plus_Infinity)
-SPECIALIZE_ASSIGN(mp_nan, mpz_class, Not_A_Number)
-SPECIALIZE_ASSIGN(mp_minf, mpq_class, Minus_Infinity)
-SPECIALIZE_ASSIGN(mp_pinf, mpq_class, Plus_Infinity)
-SPECIALIZE_ASSIGN(mp_nan, mpq_class, Not_A_Number)
-
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
   mpz_neg(to.get_mpz_t(), from.get_mpz_t());
   return V_EQ;
 }
 
-SPECIALIZE_NEG(mpz, mpz_class, mpz_class)
+SPECIALIZE_NEG(neg_mpz, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
   to = x + y;
   return V_EQ;
 }
 
-SPECIALIZE_ADD(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_ADD(add_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
   to = x - y;
   return V_EQ;
 }
 
-SPECIALIZE_SUB(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_SUB(sub_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
   to = x * y;
   return V_EQ;
 }
 
-SPECIALIZE_MUL(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_MUL(mul_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
 	Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
   mpz_srcptr n = x.get_mpz_t();
   mpz_srcptr d = y.get_mpz_t();
-  if (dir == ROUND_IGNORE) {
+  if (round_ignore(dir)) {
+    // FIXME: is this correct?
     mpz_divexact(to.get_mpz_t(), n, d);
     return V_LGE;
   }
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     mpz_fdiv_q(to.get_mpz_t(), n, d);
     return mpz_divisible_p(n, d) ? V_EQ : V_GT;
   }
   else {
-    assert(dir == ROUND_UP);
+    assert(round_up(dir));
     mpz_cdiv_q(to.get_mpz_t(), n, d);
     return mpz_divisible_p(n, d) ? V_EQ : V_LT;
   }
 }
 
-SPECIALIZE_DIV(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  mpz_tdiv_q(to.get_mpz_t(), n, d);
+  return V_EQ;
+}
+
+SPECIALIZE_IDIV(idiv_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
-    return set_special<Policy>(to, V_MOD_ZERO);
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
   to = x % y;
   return V_EQ;
 }
 
-SPECIALIZE_REM(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
   return V_EQ;
 }
 
-SPECIALIZE_MUL2EXP(mpz, mpz_class, mpz_class)
+SPECIALIZE_MUL2EXP(mul2exp_mpz, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
   if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
   mpz_srcptr n = x.get_mpz_t();
-  if (dir == ROUND_IGNORE) {
+  if (round_ignore(dir)) {
     mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
     return V_LGE;
   }
-  if (dir == ROUND_DOWN) {
+  if (round_down(dir)) {
     mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
     return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
   }
   else {
-    assert(dir == ROUND_UP);
+    assert(round_up(dir));
     mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
     return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
   }
 }
 
-SPECIALIZE_DIV2EXP(mpz, mpz_class, mpz_class)
+SPECIALIZE_DIV2EXP(div2exp_mpz, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
   to = abs(from);
   return V_EQ;
 }
 
-SPECIALIZE_ABS(mpz, mpz_class, mpz_class)
+SPECIALIZE_ABS(abs_mpz, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
 	    Rounding_Dir) {
@@ -427,9 +471,9 @@ add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
   return V_EQ;
 }
 
-SPECIALIZE_ADD_MUL(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_ADD_MUL(add_mul_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
 	    Rounding_Dir) {
@@ -437,54 +481,55 @@ sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
   return V_EQ;
 }
 
-SPECIALIZE_SUB_MUL(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_SUB_MUL(sub_mul_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
   mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
   return V_EQ;
 }
 
-SPECIALIZE_GCD(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_GCD(gcd_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
-gcdext_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
-	   mpz_class& s, mpz_class& t, Rounding_Dir) {
-  mpz_gcdext(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(),
-	     s.get_mpz_t(), t.get_mpz_t());
+gcdext_mpz(mpz_class& to, mpz_class& s, mpz_class& t,
+	   const mpz_class& x, const mpz_class& y,
+	   Rounding_Dir) {
+  mpz_gcdext(to.get_mpz_t(), s.get_mpz_t(), t.get_mpz_t(),
+	     x.get_mpz_t(), y.get_mpz_t());
   return V_EQ;
 }
 
-SPECIALIZE_GCDEXT(mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_GCDEXT(gcdext_mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
 inline Result
 lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
   mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
   return V_EQ;
 }
 
-SPECIALIZE_LCM(mpz, mpz_class, mpz_class, mpz_class)
+SPECIALIZE_LCM(lcm_mpz, mpz_class, mpz_class, mpz_class)
 
-template <typename Policy>
+template <typename To_Policy, typename From_Policy>
 inline Result
 sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
-    return set_special<Policy>(to, V_SQRT_NEG);
-  if (dir == ROUND_IGNORE) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  if (round_ignore(dir)) {
     to = sqrt(from);
     return V_GE;
   }
-  mpz_class r;
+  DIRTY_TEMP0(mpz_class, r);
   mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
   if (r == 0)
     return V_EQ;
-  return round_gt_mpz<Policy>(to, dir);
+  return round_gt_mpz<To_Policy>(to, dir);
 }
 
-SPECIALIZE_SQRT(mpz, mpz_class, mpz_class)
+SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class)
 
 template <typename Policy, typename Type>
 inline Result
@@ -493,18 +538,18 @@ sgn_mp(const Type& x) {
   return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
 }
 
-SPECIALIZE_SGN(mp, mpz_class)
-SPECIALIZE_SGN(mp, mpq_class)
+SPECIALIZE_SGN(sgn_mp, mpz_class)
+SPECIALIZE_SGN(sgn_mp, mpq_class)
 
-template <typename Policy, typename Type>
+template <typename Policy1, typename Policy2, typename Type>
 inline Result
 cmp_mp(const Type& x, const Type& y) {
   int i = ::cmp(x, y);
   return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
 }
 
-SPECIALIZE_CMP(mp, mpz_class, mpz_class)
-SPECIALIZE_CMP(mp, mpq_class, mpq_class)
+SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class)
+SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class)
 
 template <typename Policy>
 inline Result
@@ -514,13 +559,8 @@ output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
   return V_EQ;
 }
 
-SPECIALIZE_INPUT(generic, mpz_class)
-SPECIALIZE_OUTPUT(mpz, mpz_class)
-
-inline memory_size_type
-external_memory_in_bytes(const mpz_class& x) {
-  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
-}
+SPECIALIZE_INPUT(input_generic, mpz_class)
+SPECIALIZE_OUTPUT(output_mpz, mpz_class)
 
 } // namespace Checked
 
diff --git a/src/checked_numeric_limits.hh b/src/checked_numeric_limits.hh
index a79ac60..1e77fb1 100644
--- a/src/checked_numeric_limits.hh
+++ b/src/checked_numeric_limits.hh
@@ -1,11 +1,11 @@
 /* Specializations of std::numeric_limits for "checked" types.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,42 +25,43 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "Checked_Number.defs.hh"
 #include "checked_int.inlines.hh"
-#include "mp_numeric_limits.hh"
 #include <limits>
 
 namespace std {
 
+using namespace Parma_Polyhedra_Library;
+
 #define PPL_SPECIALIZE_LIMITS_INT(T)					\
 /*! \brief Partial specialization of std::numeric_limits. */		\
 template <typename Policy>						\
-class numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+class numeric_limits<Checked_Number<T, Policy> > \
   : public numeric_limits<T> {						\
  private:								\
-  typedef Parma_Polyhedra_Library::Checked_Number<T, Policy> Type;	\
+  typedef Checked_Number<T, Policy> Type;	\
 									\
  public:								\
-  static const bool has_infinity = Policy::handle_infinity;		\
-  static const bool has_quiet_NaN =  Policy::handle_nan;			\
+  static const bool has_infinity = Policy::has_infinity;		\
+  static const bool has_quiet_NaN =  Policy::has_nan;		\
 									\
   static Type min() {							\
-    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::min; \
+    return Checked::Extended_Int<Policy, T>::min; \
   }									\
 									\
   static Type max() {							\
-    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::max; \
+    return Checked::Extended_Int<Policy, T>::max; \
   }									\
 									\
   static Type infinity() {						\
     return								\
-      Policy::handle_infinity						\
-      ? Parma_Polyhedra_Library::PLUS_INFINITY				\
+      Policy::has_infinity						\
+      ? PLUS_INFINITY				\
       : static_cast<Type>(0);						\
   }									\
 									\
   static Type quiet_NaN() {						\
     return								\
-      Policy::handle_nan							\
-      ? Parma_Polyhedra_Library::NOT_A_NUMBER				\
+      Policy::has_nan						\
+      ? NOT_A_NUMBER				\
       : static_cast<Type>(0);						\
   }									\
 };
@@ -82,7 +83,7 @@ PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
 #define PPL_SPECIALIZE_LIMITS_FLOAT(T)					\
 /*! \brief Partial specialization of std::numeric_limits. */		\
 template <typename Policy>						\
-struct numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+struct numeric_limits<Checked_Number<T, Policy> > \
   : public numeric_limits<T> {						\
 };
 
@@ -100,58 +101,58 @@ PPL_SPECIALIZE_LIMITS_FLOAT(long double)
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Partial specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Policy>
 class
-numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> >
+numeric_limits<Checked_Number<mpz_class, Policy> >
   : public numeric_limits<mpz_class> {
 private:
-  typedef Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> Type;
+  typedef Checked_Number<mpz_class, Policy> Type;
 
 public:
-  static const bool has_infinity = Policy::handle_infinity;
-  static const bool has_quiet_NaN =  Policy::handle_nan;
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
 
   static Type infinity() {
     return
-      Policy::handle_infinity
-      ? Parma_Polyhedra_Library::PLUS_INFINITY
+      Policy::has_infinity
+      ? PLUS_INFINITY
       : static_cast<Type>(0);
   }
 
   static Type quiet_NaN() {
     return
-      Policy::handle_nan
-      ? Parma_Polyhedra_Library::NOT_A_NUMBER
+      Policy::has_nan
+      ? NOT_A_NUMBER
       : static_cast<Type>(0);
   }
 };
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Partial specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename Policy>
 class
-numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> >
+numeric_limits<Checked_Number<mpq_class, Policy> >
 : public numeric_limits<mpq_class> {
 private:
-  typedef Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> Type;
+  typedef Checked_Number<mpq_class, Policy> Type;
 
 public:
-  static const bool has_infinity = Policy::handle_infinity;
-  static const bool has_quiet_NaN =  Policy::handle_nan;
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
 
   static Type infinity() {
     return
-      Policy::handle_infinity
-      ? Parma_Polyhedra_Library::PLUS_INFINITY
+      Policy::has_infinity
+      ? PLUS_INFINITY
       : static_cast<Type>(0);
   }
 
   static Type quiet_NaN() {
     return
-      Policy::handle_nan
-      ? Parma_Polyhedra_Library::NOT_A_NUMBER
+      Policy::has_nan
+      ? NOT_A_NUMBER
       : static_cast<Type>(0);
   }
 };
diff --git a/src/compiler.hh b/src/compiler.hh
index 657f469..7de482f 100644
--- a/src/compiler.hh
+++ b/src/compiler.hh
@@ -1,11 +1,11 @@
 /* C++ compiler related stuff.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,13 +26,31 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Used to avoid unused variable warnings from the compiler.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op function that allows to avoid unused variable warnings from
+  the compiler.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 inline void
 used(const T&) {
 }
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op function that prevents the compiler to subject the argument to CSE.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void avoid_cse(const T& x) {
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+  __asm__ __volatile__ ("" : "+m" (const_cast<T&>(x)));
+#else
+  // FIXME: is it possible to achieve the same effect in a portable way?
+  used(x);
+#endif
+}
+
 } // namespace Parma_Polyhedra_Library
 
 #endif // !defined(PPL_compiler_hh)
diff --git a/src/conversion.cc b/src/conversion.cc
index c60ffe4..9d82b73 100644
--- a/src/conversion.cc
+++ b/src/conversion.cc
@@ -1,11 +1,11 @@
 /* Polyhedron class implementation: conversion().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,15 +20,17 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Linear_Row.defs.hh"
 #include "Linear_System.defs.hh"
-#include "Saturation_Row.defs.hh"
-#include "Saturation_Matrix.defs.hh"
+#include "Bit_Row.defs.hh"
+#include "Bit_Matrix.defs.hh"
 #include "Polyhedron.defs.hh"
 #include "Scalar_Products.defs.hh"
+#include "Temp.defs.hh"
 #include <cstddef>
+#include <climits>
 
 namespace PPL = Parma_Polyhedra_Library;
 
@@ -129,9 +131,9 @@ namespace PPL = Parma_Polyhedra_Library;
     -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair;
     -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair.
 
-  Using Farkas' lemma we can prove that these two problems are
+  Using Farkas' Lemma we can prove that these two problems are
   computationally equivalent (i.e., linear-time reducible to each other).
-  Farkas' lemma establishes a fundamental property of vectors in
+  Farkas' Lemma establishes a fundamental property of vectors in
   \f$\Rset^n\f$ that, in a sense, captures the essence of duality.
   Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let
   \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors.
@@ -177,7 +179,7 @@ namespace PPL = Parma_Polyhedra_Library;
     \exists \vect{\lambda} \geq \vect{0}
       \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
   \f$,
-  which, by Farkas' lemma is equivalent to
+  which, by Farkas' Lemma is equivalent to
   \f$
     \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies
                                  \langle \vect{y}, \vect{x} \rangle \geq 0)
@@ -191,7 +193,7 @@ namespace PPL = Parma_Polyhedra_Library;
     \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies
     \langle \vect{x}, \vect{z} \rangle \geq 0)
   \f$.
-  By Farkas' lemma, this is equivalent to
+  By Farkas' Lemma, this is equivalent to
   \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
   \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$,
   which is equivalent to what we wanted to prove, that is,
@@ -216,7 +218,7 @@ namespace PPL = Parma_Polyhedra_Library;
   \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
   \vect{z} = C^\mathrm{T}\vect{\mu}\f$
   and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$.
-  By Farkas' lemma, the assumption
+  By Farkas' Lemma, the assumption
   \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
   \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$,
   is equivalent to
@@ -350,7 +352,7 @@ PPL::dimension_type
 PPL::Polyhedron::conversion(Linear_System& source,
 			    const dimension_type start,
 			    Linear_System& dest,
-			    Saturation_Matrix& sat,
+			    Bit_Matrix& sat,
 			    dimension_type num_lines_or_equalities) {
   dimension_type source_num_rows = source.num_rows();
   dimension_type dest_num_rows = dest.num_rows();
@@ -394,10 +396,11 @@ PPL::Polyhedron::conversion(Linear_System& source,
     // otherwise the scalar product below will bomb.
     assert(source_num_columns == dest_num_columns);
 
-    // `scalar_prod[i]' will contain the scalar product
-    // of the constraint `source_k' and the generator `dest[i]'.
-    // This product is 0 iff the generator saturates the constraint.
-    static std::vector<Coefficient> scalar_prod;
+    // `scalar_prod[i]' will contain the scalar product of the
+    // constraint `source_k' and the generator `dest[i]'.  This
+    // product is 0 if and only if the generator saturates the
+    // constraint.
+    DIRTY_TEMP0(std::vector<Coefficient>, scalar_prod);
     const int needed_space = dest_num_rows - scalar_prod.size();
     if (needed_space > 0)
       scalar_prod.insert(scalar_prod.end(), needed_space, Coefficient_zero());
@@ -412,7 +415,7 @@ PPL::Polyhedron::conversion(Linear_System& source,
 	// The generator does not saturate the constraint.
 	break;
 #if REACTIVE_ABANDONING
-      // Check if the client has requested abandoning all exponential
+      // Check if the client has requested abandoning all expensive
       // computations.  If so, the exception specified by the client
       // is thrown now.
       maybe_abandon();
@@ -548,7 +551,7 @@ PPL::Polyhedron::conversion(Linear_System& source,
       // does not saturate the constraint `source_k'.  Therefore, if
       // the constraint is an inequality, we set to 1 the
       // corresponding element of `sat' ...
-      Saturation_Row& sat_nle = sat[num_lines_or_equalities];
+      Bit_Row& sat_nle = sat[num_lines_or_equalities];
       if (source_k.is_ray_or_point_or_inequality())
 	sat_nle.set(k);
       // ... otherwise, the constraint is an equality which is
@@ -667,7 +670,7 @@ PPL::Polyhedron::conversion(Linear_System& source,
 	      // If there exist another generator that saturates
 	      // all the constraints saturated by both `dest[i]' and
 	      // `dest[j]', then they are NOT adjacent.
-	      Saturation_Row new_satrow;
+	      Bit_Row new_satrow;
 	      assert(sat[i].last() == ULONG_MAX || sat[i].last() < k);
 	      assert(sat[j].last() == ULONG_MAX || sat[j].last() < k);
 	      // Being the union of `sat[i]' and `sat[j]',
@@ -805,7 +808,7 @@ PPL::Polyhedron::conversion(Linear_System& source,
       }
     }
 #if !REACTIVE_ABANDONING
-    // Check if the client has requested abandoning all exponential
+    // Check if the client has requested abandoning all expensive
     // computations.  If so, the exception specified by the client
     // is thrown now.
     maybe_abandon();
diff --git a/src/distances.defs.hh b/src/distances.defs.hh
new file mode 100644
index 0000000..c698c17
--- /dev/null
+++ b/src/distances.defs.hh
@@ -0,0 +1,53 @@
+/* Class declarations for several distances.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_distances_defs_hh
+#define PPL_distances_defs_hh 1
+
+#include "distances.types.hh"
+#include "Rounding_Dir.defs.hh"
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Rectilinear_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Euclidean_Distance_Specialization {
+  static void combine(Temp& running, Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp& running, Rounding_Dir dir);
+};
+
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::L_Infinity_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+#include "distances.inlines.hh"
+
+#endif // !defined(PPL_distances_defs_hh)
diff --git a/src/distances.inlines.hh b/src/distances.inlines.hh
new file mode 100644
index 0000000..d261859
--- /dev/null
+++ b/src/distances.inlines.hh
@@ -0,0 +1,112 @@
+/* Inline functions implementing distances.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_distances_inlines_hh
+#define PPL_distances_inlines_hh 1
+
+#include "Result.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+// A struct to work around the lack of partial specialization
+// of function templates in C++.
+template <typename To, typename From>
+struct maybe_assign_struct {
+  static inline Result
+  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+    // When `To' and `From' are different types, we make the conversion
+    // and use `tmp'.
+    top = &tmp;
+    return assign_r(tmp, from, dir);
+  }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+  static inline Result
+  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+    // When the types are the same, conversion is unnecessary.
+    top = &from;
+    return V_EQ;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Assigns to \p top a pointer to a location that holds the
+  conversion, according to \p dir, of \p from to type \p To.  When
+  necessary, and only when necessary, the variable \p tmp is used to
+  hold the result of conversion.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
+						   const Temp& current,
+						   Rounding_Dir dir) {
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
+						 Temp& current,
+						 Rounding_Dir dir) {
+  mul_assign_r(current, current, current, dir);
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
+						  Rounding_Dir dir) {
+  sqrt_assign_r(running, running, dir);
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
+						  const Temp& current,
+						  Rounding_Dir) {
+  if (current > running)
+    running = current;
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_distances_inlines_hh)
diff --git a/src/distances.types.hh b/src/distances.types.hh
new file mode 100644
index 0000000..ddb932e
--- /dev/null
+++ b/src/distances.types.hh
@@ -0,0 +1,28 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_distances_types_hh
+#define PPL_distances_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization;
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization;
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_distances_types_hh)
diff --git a/src/fpu-c99.inlines.hh b/src/fpu-c99.inlines.hh
index 629faf6..d64724a 100644
--- a/src/fpu-c99.inlines.hh
+++ b/src/fpu-c99.inlines.hh
@@ -1,11 +1,11 @@
 /* C99 Floating point unit related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#ifdef HAVE_FENV_H
+#ifdef PPL_HAVE_FENV_H
 #include <fenv.h>
 
 #ifdef FE_TONEAREST
@@ -38,9 +38,13 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+inline void
+fpu_initialize_control_functions() {
+}
+
 inline fpu_rounding_direction_type
 fpu_get_rounding_direction() {
-  return fegetround();
+  return static_cast<fpu_rounding_direction_type>(fegetround());
 }
 
 inline void
@@ -50,7 +54,8 @@ fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
 
 inline fpu_rounding_control_word_type
 fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
-  fpu_rounding_direction_type old = fegetround();
+  fpu_rounding_control_word_type old
+    = static_cast<fpu_rounding_control_word_type>(fegetround());
   fesetround(dir);
   return old;
 }
@@ -60,12 +65,6 @@ fpu_reset_inexact() {
   feclearexcept(FE_INEXACT);
 }
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
-  fpu_reset_inexact();
-  return fpu_save_rounding_direction(dir);
-}
-
 inline void
 fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
   fesetround(w);
@@ -78,4 +77,4 @@ fpu_check_inexact() {
 
 } // namespace Parma_Polyhedra_Library
 
-#endif // !defined(HAVE_FENV_H)
+#endif // !defined(PPL_HAVE_FENV_H)
diff --git a/src/fpu-ia32.cc b/src/fpu-ia32.cc
new file mode 100644
index 0000000..32e57ae
--- /dev/null
+++ b/src/fpu-ia32.cc
@@ -0,0 +1,67 @@
+/* IA-32 floating point unit non-inline related functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#if defined(PPL_FPMATH_MAY_USE_SSE) && defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+#include "fpu.defs.hh"
+#include <csetjmp>
+#include <csignal>
+
+namespace {
+
+jmp_buf env;
+
+void
+illegal_instruction_catcher(int) {
+  signal(SIGILL, SIG_DFL);
+  longjmp(env, 1);
+}
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+bool have_sse_unit = true;
+
+void
+detect_sse_unit() {
+  if (setjmp(env)) {
+    // We will end up here if sse_get_control() raises SIGILL.
+    have_sse_unit = false;
+    goto restore_sigill_handler;
+  }
+
+  // Install our own signal handler for SIGILL.
+  signal(SIGILL, illegal_instruction_catcher);
+  (void) sse_get_control();
+  // sse_get_control() did not raise SIGILL: we have an SSE unit.
+  have_sse_unit = true;
+
+ restore_sigill_handler:
+  // Restore the default signal handler for SIGILL.
+  signal(SIGILL, SIG_DFL);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(PPL_FPMATH_MAY_USE_SSE) && defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
diff --git a/src/fpu-ia32.inlines.hh b/src/fpu-ia32.inlines.hh
index ce9bfd7..c2289c3 100644
--- a/src/fpu-ia32.inlines.hh
+++ b/src/fpu-ia32.inlines.hh
@@ -1,11 +1,11 @@
-/* ia32 floating point unit related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* IA-32 floating point unit inline related functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,31 +21,37 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "compiler.hh"
+#include <csetjmp>
+#include <csignal>
 
-#define FPU_INVALID      0x01
-#define FPU_DIVBYZERO    0x04
-#define FPU_OVERFLOW     0x08
-#define FPU_UNDERFLOW    0x10
-#define FPU_INEXACT      0x20
+#define FPU_INVALID       0x01
+#define FPU_DIVBYZERO     0x04
+#define FPU_OVERFLOW      0x08
+#define FPU_UNDERFLOW     0x10
+#define FPU_INEXACT       0x20
 
 #define FPU_ALL_EXCEPT \
   (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
 
-#define FPU_TONEAREST    0
-#define FPU_DOWNWARD     0x400
-#define FPU_UPWARD       0x800
-#define FPU_TOWARDZERO   0xc00
+#define FPU_TONEAREST     0
+#define FPU_DOWNWARD      0x400
+#define FPU_UPWARD        0x800
+#define FPU_TOWARDZERO    0xc00
 
 #define FPU_ROUNDING_MASK 0xc00
 
+#define SSE_INEXACT       0x20
+
 #define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+#define PPL_SSE_CONTROL_DEFAULT_BASE 0x1f80
+
 // This MUST be congruent with the definition of ROUND_DIRECT
 #define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+#define PPL_SSE_CONTROL_DEFAULT (PPL_SSE_CONTROL_DEFAULT_BASE | (FPU_UPWARD << 3))
 
 namespace Parma_Polyhedra_Library {
 
-typedef struct
-{
+typedef struct {
   unsigned short control_word;
   unsigned short unused1;
   unsigned short status_word;
@@ -64,19 +70,20 @@ typedef struct
 inline int
 fpu_get_control() {
   unsigned short cw;
-  __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw) : : "memory");
   return cw;
 }
 
 inline void
-fpu_set_control(unsigned short cw) {
-  __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
+fpu_set_control(int c) {
+  unsigned short cw = static_cast<unsigned short>(c);
+  __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw) : "memory");
 }
 
 inline int
 fpu_get_status() {
-  int sw;
-  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw));
+  unsigned short sw;
+  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw) : : "memory");
   return sw;
 }
 
@@ -84,51 +91,106 @@ inline void
 fpu_clear_status(unsigned short bits) {
   /* There is no fldsw instruction */
   ia32_fenv_t env;
-  __asm__ ("fnstenv %0" : "=m" (env));
-  env.status_word &= ~bits;
-  __asm__ ("fldenv %0" : : "m" (env));
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (env));
+  env.status_word = static_cast<unsigned short>(env.status_word & ~bits);
+  __asm__ __volatile__ ("fldenv %0" : : "m" (env) : "memory");
 }
 
 inline void
 fpu_clear_exceptions() {
-  __asm__ __volatile__ ("fnclex" : /* No outputs.  */);
+  __asm__ __volatile__ ("fnclex" : /* No outputs.  */ : : "memory");
+}
+
+#if PPL_FPMATH_MAY_USE_SSE
+inline void
+sse_set_control(unsigned int cw) {
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&cw) : "memory");
+}
+
+inline unsigned int
+sse_get_control() {
+  unsigned int cw;
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory");
+  return cw;
+}
+#endif
+
+inline void
+fpu_initialize_control_functions() {
+#if PPL_FPMATH_MAY_USE_SSE
+  extern void detect_sse_unit();
+  detect_sse_unit();
+#endif
 }
 
 inline fpu_rounding_direction_type
 fpu_get_rounding_direction() {
-  return fpu_get_control() & FPU_ROUNDING_MASK;
+  return static_cast<fpu_rounding_direction_type>(fpu_get_control() & FPU_ROUNDING_MASK);
 }
 
 inline void
 fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+#if PPL_FPMATH_MAY_USE_387
   fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
 }
 
 inline fpu_rounding_control_word_type
 fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+#if PPL_FPMATH_MAY_USE_387
   fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
-  return 0;
+#endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+  return static_cast<fpu_rounding_control_word_type>(0);
 }
 
 inline void
 fpu_reset_inexact() {
+#if PPL_FPMATH_MAY_USE_387
   fpu_clear_exceptions();
-}
-
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
-  fpu_reset_inexact();
-  return fpu_save_rounding_direction(dir);
+#endif
+#if PPL_FPMATH_MAY_USE_SSE
+  // NOTE: on entry to this function the current rounding mode
+  // has to be the default one.
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
 }
 
 inline void
 fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+#if PPL_FPMATH_MAY_USE_387
   fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+#endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
 }
 
 inline int
 fpu_check_inexact() {
-  return (fpu_get_status() & FPU_INEXACT) ? 1 : 0;
+#if PPL_FPMATH_MAY_USE_387
+  if (fpu_get_status() & FPU_INEXACT)
+    return 1;
+#endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit && (sse_get_control() & SSE_INEXACT))
+    return 1;
+#endif
+  return 0;
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/fpu-none.inlines.hh b/src/fpu-none.inlines.hh
index 83c1b09..55d32ca 100644
--- a/src/fpu-none.inlines.hh
+++ b/src/fpu-none.inlines.hh
@@ -1,11 +1,11 @@
 /* Null floating point unit related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,6 +24,12 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+inline void
+fpu_initialize_control_functions() {
+  throw std::logic_error("PPL::fpu_initialize_control_functions():"
+			 " cannot control the FPU");
+}
+
 inline int
 fpu_get_rounding_direction() {
   throw std::logic_error("PPL::fpu_get_rounding_direction():"
@@ -48,12 +54,6 @@ fpu_reset_inexact() {
 			 " cannot control the FPU");
 }
 
-inline int
-fpu_save_rounding_direction_reset_inexact(int dir) {
-  throw std::logic_error("PPL::fpu_save_rounding_direction_reset_inexact():"
-			 " cannot control the FPU");
-}
-
 inline void
 fpu_restore_rounding_direction(int dir) {
   throw std::logic_error("PPL::fpu_restore_rounding_direction():"
diff --git a/src/fpu-sparc.inlines.hh b/src/fpu-sparc.inlines.hh
index 804ea0d..b1e5d37 100644
--- a/src/fpu-sparc.inlines.hh
+++ b/src/fpu-sparc.inlines.hh
@@ -1,11 +1,11 @@
 /* SPARC floating point unit related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#ifdef HAVE_IEEEFP_H
+#ifdef PPL_HAVE_IEEEFP_H
 #include <ieeefp.h>
 
 #define FPU_TONEAREST ((int) FP_RN)
@@ -30,9 +30,13 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+inline void
+fpu_initialize_control_functions() {
+}
+
 inline fpu_rounding_direction_type
 fpu_get_rounding_direction() {
-  return fpgetround();
+  return static_cast<fpu_rounding_direction_type>(fpgetround());
 }
 
 inline void
@@ -42,7 +46,7 @@ fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
 
 inline fpu_rounding_control_word_type
 fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
-  return fpsetround((fp_rnd) dir);
+  return static_cast<fpu_rounding_control_word_type>(fpsetround((fp_rnd) dir));
 }
 
 inline void
@@ -52,12 +56,6 @@ fpu_reset_inexact() {
   fpsetmask(except);
 }
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
-  fpu_reset_inexact();
-  return fpu_save_rounding_direction((fp_rnd) dir);
-}
-
 inline void
 fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
   fpsetround((fp_rnd) w);
@@ -70,4 +68,4 @@ fpu_check_inexact() {
 
 } // namespace Parma_Polyhedra_Library
 
-#endif // !defined(HAVE_IEEEFP_H)
+#endif // !defined(PPL_HAVE_IEEEFP_H)
diff --git a/src/fpu.defs.hh b/src/fpu.defs.hh
index 3d9e218..3582c1c 100644
--- a/src/fpu.defs.hh
+++ b/src/fpu.defs.hh
@@ -1,11 +1,11 @@
 /* Floating point unit related functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,6 +27,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
+//! Initializes the FPU control functions.
+void
+fpu_initialize_control_functions();
+
 //! Returns the current FPU rounding direction.
 fpu_rounding_direction_type
 fpu_get_rounding_direction();
@@ -69,15 +73,15 @@ fpu_check_inexact();
 
 } // namespace Parma_Polyhedra_Library
 
-#if defined(__i386__)
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
 #include "fpu-ia32.inlines.hh"
-#elif defined(HAVE_FENV_H)
-#include "fpu-c99.inlines.hh"
-#elif defined(HAVE_IEEEFP_H)						\
+#elif defined(PPL_HAVE_IEEEFP_H)					\
   && (defined(__sparc)							\
       || defined(sparc)							\
       || defined(__sparc__))
 #include "fpu-sparc.inlines.hh"
+#elif defined(PPL_HAVE_FENV_H)
+#include "fpu-c99.inlines.hh"
 #else
 #include "fpu-none.inlines.hh"
 #endif
diff --git a/src/fpu.types.hh b/src/fpu.types.hh
index 3f9183a..e10d451 100644
--- a/src/fpu.types.hh
+++ b/src/fpu.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -12,14 +12,14 @@ PURPOSE. */
 #ifndef PPL_fpu_types_hh
 #define PPL_fpu_types_hh 1
 
-#ifdef HAVE_IEEEFP_H
+#ifdef PPL_HAVE_IEEEFP_H
 #include <ieeefp.h>
 #endif
 
 namespace Parma_Polyhedra_Library {
 
-typedef int fpu_rounding_direction_type;
-typedef int fpu_rounding_control_word_type;
+enum fpu_rounding_direction_type {};
+enum fpu_rounding_control_word_type {};
 
 } // namespace Parma_Polyhedra_Library
 
diff --git a/src/globals.cc b/src/globals.cc
index a04b6a2..04b55af 100644
--- a/src/globals.cc
+++ b/src/globals.cc
@@ -1,11 +1,11 @@
 /* Definitions of global objects.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "globals.defs.hh"
 #include "Constraint.defs.hh"
@@ -28,6 +28,5 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace PPL = Parma_Polyhedra_Library;
 
-PPL::Coefficient_free_list_element* PPL::Coefficient_free_list_first = 0;
-
 const PPL::Throwable* volatile PPL::abandon_expensive_computations = 0;
+
diff --git a/src/globals.defs.hh b/src/globals.defs.hh
index f4da042..7d726cd 100644
--- a/src/globals.defs.hh
+++ b/src/globals.defs.hh
@@ -1,11 +1,11 @@
 /* Declarations of global objects.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,8 +24,12 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_globals_defs_hh 1
 
 #include "globals.types.hh"
-#include "Coefficient.defs.hh"
+#include "C_Integer.hh"
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include "Temp.defs.hh"
 #include <exception>
+#include <gmpxx.h>
 
 namespace Parma_Polyhedra_Library {
 
@@ -34,71 +38,21 @@ dimension_type
 not_a_dimension();
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A node of the list of available coefficients.
-/*! \ingroup PPL_CXX_interface */
-// FIXME: rewrite the comment.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Coefficient_free_list_element {
-private:
-  Coefficient i;
-  Coefficient_free_list_element* p;
-
-public:
-  Coefficient_free_list_element()
-    : i() {
-  }
-
-  Coefficient& integer() {
-    return i;
-  }
-
-  Coefficient_free_list_element*& next() {
-    return p;
-  }
-};
-
-extern Coefficient_free_list_element* Coefficient_free_list_first;
-
-inline Coefficient&
-get_tmp_Coefficient() {
-  Coefficient* p;
-  if (Coefficient_free_list_first != 0) {
-    p = &Coefficient_free_list_first->integer();
-    Coefficient_free_list_first = Coefficient_free_list_first->next();
-  }
-  else
-    p = reinterpret_cast<Coefficient*>(new Coefficient_free_list_element());
-  return *p;
-}
+/*! \brief
+  Make sure swap() is specialized when needed.
 
-inline void
-release_tmp_Coefficient(Coefficient& i) {
-  Coefficient_free_list_element& e
-    = reinterpret_cast<Coefficient_free_list_element&>(i);
-  e.next() = Coefficient_free_list_first;
-  Coefficient_free_list_first = &e;
+  This will cause a compile-time error whenever a specialization for \p T
+  is beneficial but missing.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Slow_Copy<T>::value, void>::type
+swap(T&, T&) {
+  COMPILE_TIME_CHECK(!Slow_Copy<T>::value, "missing swap specialization");
 }
 
-class Temp_Coefficient_Holder {
-private:
-  Coefficient& hold;
-
-public:
-  Temp_Coefficient_Holder(Coefficient& i)
-    : hold(i) {
-  }
-  ~Temp_Coefficient_Holder() {
-    release_tmp_Coefficient(hold);
-  }
-};
-
-#if 1
-#define TEMP_INTEGER(id) \
-Coefficient& id = get_tmp_Coefficient(); \
-Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
-#else
-#define TEMP_INTEGER(id) static Coefficient id
-#endif
+// FIXME: write a comment for this.
+#define TEMP_INTEGER(id) DIRTY_TEMP0(Coefficient, id)
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Speculative allocation function.
@@ -119,11 +73,15 @@ Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
   for our vector-like data structures. In all cases, the speculative
   allocation will not exceed \p maximum_size.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 dimension_type
 compute_capacity(dimension_type requested_size,
 		 dimension_type maximum_size);
 
+// FIXME!!!
+dimension_type
+compute_capacity(dimension_type requested_size);
+
 //! User objects the PPL can throw.
 /*! \ingroup PPL_CXX_interface
   This abstract base class should be instantiated by those users
@@ -177,40 +135,19 @@ maybe_abandon();
 
 //! A tag class.
 /*! \ingroup PPL_CXX_interface
-  Tag class to differentiate the C_Polyhedron and NNC_Polyhedron
-  constructors that build a polyhedron out of a bounding box.
+  Tag class to make the Grid covering box constructor unique.
 */
-struct From_Bounding_Box {
+struct From_Covering_Box {
 };
 
 //! A tag class.
 /*! \ingroup PPL_CXX_interface
-  Tag class to make the Grid covering box constructor unique.
+  Tag class to distinguish those constructors that recycle the data
+  structures of their arguments, instead of taking a copy.
 */
-struct From_Covering_Box {
+struct Recycle_Input {
 };
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
-  divided by \f$g\f$ are assigned to \p nx and \p ny, respectively.
-
-  \note
-  \p x and \p nx may be the same object and likewise for
-  \p y and \p ny.  Any other aliasing results in undefined behavior.
-*/
-#endif
-void
-normalize2(Coefficient_traits::const_reference x,
-	   Coefficient_traits::const_reference y,
-	   Coefficient& nx, Coefficient& ny);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns a mask for the lowest \p n bits,
-#endif
-template <typename T>
-T low_bits_mask(unsigned n);
-
 // Turn s into a string: PPL_STR(x + y) => "x + y".
 #define PPL_STR(s) #s
 // Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
@@ -229,7 +166,7 @@ T low_bits_mask(unsigned n);
   void ascii_dump() const;					\
   void ascii_dump(std::ostream& s) const;			\
   void print() const;
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 #define PPL_OUTPUT_DEFINITIONS(class_name)			\
   void								\
@@ -269,6 +206,48 @@ T low_bits_mask(unsigned n);
     std::cerr << *this;							\
   }
 
+// FIXME: The class_prefix has changed from
+//        PPL_OUTPUT_TEMPLATE_DEFINITIONS, to work around `,'.
+//        Perhaps PPL_OUTPUT_TEMPLATE_DEFINITIONS should be changed to
+//        match this.
+#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,		\
+						type_symbol2,		\
+						class_prefix)		\
+  template <typename type_symbol1, typename type_symbol2>		\
+  void									\
+  class_prefix<type_symbol1, type_symbol2>::ascii_dump() const {	\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol1, typename type_symbol2>		\
+  void									\
+  class_prefix<type_symbol1, type_symbol2>::print() const {		\
+    using namespace IO_Operators;					\
+    std::cerr << *this;							\
+  }
+
+// FIXME: Copy and edit of PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS
+#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,		\
+						type_symbol2,		\
+						type_symbol3,		\
+						class_prefix)		\
+  template <typename type_symbol1, typename type_symbol2,		\
+            typename type_symbol3>					\
+  void									\
+  class_prefix<type_symbol1, type_symbol2, type_symbol3>::ascii_dump()	\
+    const {								\
+    ascii_dump(std::cerr);						\
+  }									\
+                                                                     	\
+    template <typename type_symbol1, typename type_symbol2,		\
+              typename type_symbol3>					\
+    void								\
+    class_prefix<type_symbol1, type_symbol2, type_symbol3>::print()	\
+      const {								\
+      using namespace IO_Operators;					\
+      std::cerr << *this;						\
+    }
+
 #define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
   template <typename type_symbol>					\
   void									\
@@ -283,6 +262,135 @@ T low_bits_mask(unsigned n);
 	      << "for " PPL_XSTR(class_prefix) << "." << std::endl;	\
   }
 
+template <typename T, long long v, typename Enable = void>
+struct Fit : public False {
+};
+
+template <typename T, long long v>
+struct Fit<T, v, typename Enable_If<C_Integer<T>::value>::type>  {
+  enum {
+    value = (v >= static_cast<long long>(C_Integer<T>::min)
+             && v <= static_cast<long long>(C_Integer<T>::max))
+  };
+};
+
+template <typename T, long long v>
+struct TConstant {
+  static const T value = v;
+};
+
+
+template <typename T, long long v>
+const T TConstant<T, v>::value;
+
+template <typename T, long long v, bool prefer_signed = true,
+	  typename Enable = void>
+struct Constant_ : public TConstant<T, v> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+		 typename Enable_If<(Fit<typename C_Integer<T>::smaller_signed_type, v>::value
+				     && (prefer_signed ||
+					 !Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_signed_type, v, prefer_signed> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+		 typename Enable_If<(Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value
+				     && (!prefer_signed ||
+					 !Fit<typename C_Integer<T>::smaller_signed_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_unsigned_type, v, prefer_signed> {
+};
+
+template <long long v, bool prefer_signed = true>
+struct Constant : public Constant_<long long, v, prefer_signed> {
+};
+
+//! \name Memory Size Inspection Functions
+//@{
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the total size in bytes of the memory
+  occupied by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the size in bytes of the memory managed
+  by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpq_class& x);
+
+//@} // Memory Size Inspection Functions
+
+
+template <typename T, typename Enable = void>
+struct Has_OK : public False { };
+
+template <typename T>
+struct Has_OK<T, typename Enable_If_Is<bool (T::*)() const, &T::OK>::type>
+  : public True {
+};
+
+template <typename T>
+inline typename Enable_If<Has_OK<T>::value, bool>::type
+f_OK(const T& to) {
+  return to.OK();
+}
+
+#define FOK(T) inline bool f_OK(const T&) { return true; }
+
+FOK(char)
+FOK(signed char)
+FOK(unsigned char)
+FOK(signed short)
+FOK(unsigned short)
+FOK(signed int)
+FOK(unsigned int)
+FOK(signed long)
+FOK(unsigned long)
+FOK(signed long long)
+FOK(unsigned long long)
+FOK(float)
+FOK(double)
+FOK(long double)
+FOK(mpz_class)
+FOK(mpq_class)
+
 } // namespace Parma_Polyhedra_Library
 
 #include "globals.inlines.hh"
diff --git a/src/globals.inlines.hh b/src/globals.inlines.hh
index f9f1dc2..6daa844 100644
--- a/src/globals.inlines.hh
+++ b/src/globals.inlines.hh
@@ -1,11 +1,11 @@
 /* Implementation of global objects: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,7 +23,6 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_globals_inlines_hh
 #define PPL_globals_inlines_hh 1
 
-#include "Coefficient.defs.hh"
 #include <limits>
 #include <cassert>
 
@@ -58,21 +57,48 @@ compute_capacity(const dimension_type requested_size,
   //   : maximum_size;
 }
 
-inline void
-normalize2(Coefficient_traits::const_reference x,
-	   Coefficient_traits::const_reference y,
-	   Coefficient& nx, Coefficient& ny) {
-  TEMP_INTEGER(gcd);
-  gcd_assign(gcd, x, y);
-  exact_div_assign(nx, x, gcd);
-  exact_div_assign(ny, y, gcd);
+// FIXME!!!
+inline dimension_type
+compute_capacity(const dimension_type requested_size) {
+  // Speculation factor 2.
+  return 2*(requested_size + 1);
+  // Speculation factor 1.5.
+  // return requested_size + requested_size/2 + 1;
 }
 
 template <typename T>
-inline T
-low_bits_mask(const unsigned n) {
-  assert(n < unsigned(std::numeric_limits<T>::digits));
-  return n == 0 ? 0 : ~(~(T(0u)) << n);
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&) {
+  return 0;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&) {
+  return sizeof(T);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+  return x.get_mpz_t()[0]._mp_alloc * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpz_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+  return external_memory_in_bytes(x.get_num())
+    + external_memory_in_bytes(x.get_den());
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpq_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/globals.types.hh b/src/globals.types.hh
index 08d9bfa..a9c7521 100644
--- a/src/globals.types.hh
+++ b/src/globals.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
@@ -39,13 +39,15 @@ enum Relation_Symbol {
   //! Less than.
   LESS_THAN,
   //! Less than or equal to.
-  LESS_THAN_OR_EQUAL,
+  LESS_OR_EQUAL,
   //! Equal to.
   EQUAL,
   //! Greater than or equal to.
-  GREATER_THAN_OR_EQUAL,
+  GREATER_OR_EQUAL,
   //! Greater than.
-  GREATER_THAN
+  GREATER_THAN,
+  //! Not equal to.
+  NOT_EQUAL
 };
 
 //! Complexity pseudo-classes.
diff --git a/src/initializer.hh b/src/initializer.hh
index 0c48f20..5796a29 100644
--- a/src/initializer.hh
+++ b/src/initializer.hh
@@ -1,11 +1,11 @@
 /* Nifty counter object for the initialization of the library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,10 +25,41 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "Init.defs.hh"
 
+#ifndef PPL_NO_AUTOMATIC_INITIALIZATION
 namespace {
 
 Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
 
 } // namespace
+#else
+namespace {
+
+Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p;
+
+} // namespace
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Initializes the library.
+inline void
+initialize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  if (Parma_Polyhedra_Library_initializer_p == 0)
+    Parma_Polyhedra_Library_initializer_p = new Init();
+#endif
+}
+
+//! Finalizes the library.
+inline void
+finalize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  assert(Parma_Polyhedra_Library_initializer_p != 0);
+  delete Parma_Polyhedra_Library_initializer_p;
+  Parma_Polyhedra_Library_initializer_p = 0;
+#endif
+}
+
+} //namespace Parma_Polyhedra_Library
 
 #endif // !defined(PPL_initializer_hh)
diff --git a/src/iterator_to_const.defs.hh b/src/iterator_to_const.defs.hh
new file mode 100644
index 0000000..98cadb8
--- /dev/null
+++ b/src/iterator_to_const.defs.hh
@@ -0,0 +1,221 @@
+/* iterator_to_const and const_iterator_to_const class declarations.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_iterator_to_const_hh
+#define PPL_iterator_to_const_hh 1
+
+#include "iterator_to_const.types.hh"
+#include "Powerset.types.hh"
+//#include "Ask_Tell.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This template class implements a bidirectional <EM>read-only</EM>
+  iterator on the sequence of objects <CODE>Container</CODE>.
+  By using this iterator class it is not possible to modify the objects
+  contained in <CODE>Container</CODE>; rather, object modification has
+  to be implemented by object replacement, i.e., by using the methods
+  provided by <CODE>Container</CODE> to remove/insert objects.
+  Such a policy (a modifiable container of read-only objects) allows
+  for a reliable enforcement of invariants (such as sortedness of the
+  objects in the sequence).
+
+  \note
+  For any developers' need, suitable friend declarations allow for
+  accessing the low-level iterators on the sequence of objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::iterator_to_const {
+private:
+  //! The type of the underlying mutable iterator.
+  typedef typename Container::iterator Base;
+
+  //! A shortcut for naming the const_iterator traits.
+  typedef typename
+  std::iterator_traits<typename Container::const_iterator> Traits;
+
+  //! A (mutable) iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level iterator.
+  iterator_to_const(const Base& b);
+
+  friend class const_iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+  //template <typename T> friend class Ask_Tell;
+
+public:
+  // Same traits of the const_iterator, therefore
+  // forbidding the direct modification of sequence elements.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  iterator_to_const();
+
+  //! Copy constructor.
+  iterator_to_const(const iterator_to_const& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect access operator.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const iterator_to_const& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This class, besides implementing a read-only bidirectional iterator
+  on a read-only sequence of objects, ensures interoperability
+  with template class iterator_to_const.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::const_iterator_to_const {
+private:
+  //! The type of the underlying %const_iterator.
+  typedef typename Container::const_iterator Base;
+
+  //! A shortcut for naming traits.
+  typedef typename std::iterator_traits<Base> Traits;
+
+  //! A %const_iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level const_iterator.
+  const_iterator_to_const(const Base& b);
+
+  friend class iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+  //template <typename T> friend class Ask_Tell;
+
+public:
+  // Same traits of the underlying const_iterator.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  const_iterator_to_const();
+
+  //! Copy constructor.
+  const_iterator_to_const(const const_iterator_to_const& y);
+
+  //! Constructs from the corresponding non-const iterator.
+  const_iterator_to_const(const iterator_to_const<Container>& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  const_iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  const_iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  const_iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  const_iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const const_iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const const_iterator_to_const& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is identical to \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator==(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is different from \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator!=(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "iterator_to_const.inlines.hh"
+
+#endif // !defined(PPL_iterator_to_const_hh)
diff --git a/src/iterator_to_const.inlines.hh b/src/iterator_to_const.inlines.hh
new file mode 100644
index 0000000..297ce5e
--- /dev/null
+++ b/src/iterator_to_const.inlines.hh
@@ -0,0 +1,201 @@
+/* iterator_to_const and const_iterator_to_const class implementations:
+   inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_iterator_to_const_inlines_hh
+#define PPL_iterator_to_const_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::reference
+iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::pointer
+iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator++(int) {
+  iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator--(int) {
+  iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator==(const iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator!=(const iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const const_iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::reference
+const_iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::pointer
+const_iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator++(int) {
+  const_iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator--(int) {
+  const_iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator==(const const_iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator!=(const const_iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const iterator_to_const<Container>& y)
+  : base(y.base) {
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator==(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y) {
+  return const_iterator_to_const<Container>(x).operator==(y);
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator!=(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_iterator_to_const_inlines_hh)
diff --git a/src/iterator_to_const.types.hh b/src/iterator_to_const.types.hh
new file mode 100644
index 0000000..95107ce
--- /dev/null
+++ b/src/iterator_to_const.types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_iterator_to_const_types_hh
+#define PPL_iterator_to_const_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+class iterator_to_const;
+
+template <typename Container>
+class const_iterator_to_const;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_iterator_to_const_types_hh)
diff --git a/src/math_utilities.defs.hh b/src/math_utilities.defs.hh
new file mode 100644
index 0000000..c9e139c
--- /dev/null
+++ b/src/math_utilities.defs.hh
@@ -0,0 +1,110 @@
+/* Declarations of some math utility functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_math_utilities_defs_hh
+#define PPL_math_utilities_defs_hh 1
+
+#include "Coefficient.types.hh"
+#include "Checked_Number.defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+void
+numer_denom(const Checked_Number<T, Policy>& from,
+	    Coefficient& num, Coefficient& den);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+void
+div_round_up(Checked_Number<T, Policy>& to,
+	     Coefficient_traits::const_reference x,
+	     Coefficient_traits::const_reference y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+min_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+max_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is an even number.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+bool
+is_even(const Checked_Number<T, Policy>& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \f$x = -y\f$.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+bool
+is_additive_inverse(const Checked_Number<T, Policy>& x,
+		    const Checked_Number<T, Policy>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+  divided by \f$g\f$ are assigned to \p nx and \p ny, respectively.
+
+  \note
+  \p x and \p nx may be the same object and likewise for
+  \p y and \p ny.  Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is in canonical form.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+is_canonical(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T
+low_bits_mask(unsigned n);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "math_utilities.inlines.hh"
+
+#endif // !defined(PPL_math_utilities_defs_hh)
diff --git a/src/math_utilities.inlines.hh b/src/math_utilities.inlines.hh
new file mode 100644
index 0000000..6aa7ed9
--- /dev/null
+++ b/src/math_utilities.inlines.hh
@@ -0,0 +1,120 @@
+/* Implementation of some math utility functions: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_math_utilities_inlines_hh
+#define PPL_math_utilities_inlines_hh 1
+
+#include "Coefficient.defs.hh"
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny) {
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, x, y);
+  exact_div_assign(nx, x, gcd);
+  exact_div_assign(ny, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+  assert(n < unsigned(std::numeric_limits<T>::digits));
+  return n == 0 ? 0 : ~(~(T(0u)) << n);
+}
+
+template <typename T, typename Policy>
+inline void
+numer_denom(const Checked_Number<T, Policy>& from,
+	    Coefficient& num, Coefficient& den) {
+  assert(!is_not_a_number(from)
+	 && !is_minus_infinity(from)
+	 && !is_plus_infinity(from));
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q, from, ROUND_NOT_NEEDED);
+  num = q.get_num();
+  den = q.get_den();
+}
+
+template <typename T, typename Policy>
+inline void
+div_round_up(Checked_Number<T, Policy>& to,
+	     Coefficient_traits::const_reference x,
+	     Coefficient_traits::const_reference y) {
+  DIRTY_TEMP0(mpq_class, qx);
+  DIRTY_TEMP0(mpq_class, qy);
+  // Note: this code assumes that a Coefficient is always convertible
+  // to an mpq_class without loss of precision.
+  assign_r(qx, x, ROUND_NOT_NEEDED);
+  assign_r(qy, y, ROUND_NOT_NEEDED);
+  div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
+  assign_r(to, qx, ROUND_UP);
+}
+
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+  if (x > y)
+    x = y;
+}
+
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+  if (x < y)
+    x = y;
+}
+
+template <typename T, typename Policy>
+inline bool
+is_even(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> half_x;
+  return div2exp_assign_r(half_x, x, 1, ROUND_DIRECT) == V_EQ
+    && is_integer(half_x);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_additive_inverse(const Checked_Number<T, Policy>& x,
+		    const Checked_Number<T, Policy>& y) {
+  Checked_Number<T, Policy> negated_x;
+  return neg_assign_r(negated_x, x, ROUND_DIRECT) == V_EQ
+    && negated_x == y;
+}
+
+inline bool
+is_canonical(const mpq_class& x) {
+  if (x.get_den() <= 0)
+    return false;
+  DIRTY_TEMP0(mpq_class, temp);
+  temp = x;
+  temp.canonicalize();
+  return temp.get_num() == x.get_num();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_math_utilities_inlines_hh)
diff --git a/src/max_space_dimension.hh b/src/max_space_dimension.hh
index c986da4..fb6386e 100644
--- a/src/max_space_dimension.hh
+++ b/src/max_space_dimension.hh
@@ -1,11 +1,11 @@
 /* Definition of functions yielding maximal space dimensions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,7 +26,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Polyhedron.defs.hh"
 #include "C_Polyhedron.defs.hh"
 #include "NNC_Polyhedron.defs.hh"
-#include "Polyhedra_Powerset.defs.hh"
+#include "Grid.defs.hh"
+#include "Rational_Box.hh"
+#include "BD_Shape.defs.hh"
+#include "Octagonal_Shape.defs.hh"
 #include <algorithm>
 
 namespace Parma_Polyhedra_Library {
@@ -34,13 +37,38 @@ namespace Parma_Polyhedra_Library {
 //! Returns the maximum space dimension this library can handle.
 inline dimension_type
 max_space_dimension() {
-  using std::min;
-  return
-    min(Polyhedron::max_space_dimension(),
-	min(Polyhedra_Powerset<C_Polyhedron>::max_space_dimension(),
-	    Polyhedra_Powerset<NNC_Polyhedron>::max_space_dimension()
-	    )
-	);
+  // Note: we assume that the powerset and the ask-and-tell construction
+  // do not limit the space dimension more than their parameters.
+  static bool computed = false;
+  static dimension_type d = not_a_dimension();
+  if (!computed) {
+    d = Variable::max_space_dimension();
+    d = std::min(d, C_Polyhedron::max_space_dimension());
+    d = std::min(d, NNC_Polyhedron::max_space_dimension());
+    d = std::min(d, Grid::max_space_dimension());
+    // FIXME: what about all other boxes?
+    d = std::min(d, Rational_Box::max_space_dimension());
+    d = std::min(d, BD_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<float>::max_space_dimension());
+    d = std::min(d, BD_Shape<double>::max_space_dimension());
+    d = std::min(d, BD_Shape<long double>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpq_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<float>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<long double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpq_class>::max_space_dimension());
+    computed = true;
+  }
+  return d;
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/src/meta_programming.hh b/src/meta_programming.hh
new file mode 100644
index 0000000..a9a251f
--- /dev/null
+++ b/src/meta_programming.hh
@@ -0,0 +1,338 @@
+/* Metaprogramming utilities.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_meta_programming_hh
+#define PPL_meta_programming_hh 1
+
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>bool</CODE>, called \p name
+  and with value \p value.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_bool_nodef(name, value)		\
+  enum { name = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>int</CODE>, called \p name
+  and with value \p value.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_int_nodef(name, value) \
+  enum { name = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  The value of the constant is accessible
+  by means of the syntax <CODE>name()</CODE>.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_value_nodef(type, name, value)	\
+  static type name() {				\
+    return value;				\
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  A constant reference to the constant
+  is accessible by means of the syntax <CODE>name()</CODE>.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_ref_nodef(type, name, value)				\
+  static const type& name() {						\
+    static type name(value);						\
+    return name;							\
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, so the class is declared but not defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Compile_Time_Check;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the specialized case with \p b equal to <CODE>true</CODE>,
+  so the class is declared and (trivially) defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Compile_Time_Check<true> {
+};
+
+#define COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix
+#define COMPILE_TIME_CHECK_AUX(e, suffix)				\
+  enum {								\
+    /* If e evaluates to false, then the sizeof cannot be compiled. */  \
+    COMPILE_TIME_CHECK_NAME(suffix)					\
+    = sizeof(Parma_Polyhedra_Library::					\
+	     Compile_Time_Check<static_cast<bool>(e)>)			\
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Produces a compilation error if the compile-time constant \p e does
+  not evaluate to <CODE>true</CODE>
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define COMPILE_TIME_CHECK(e, msg) COMPILE_TIME_CHECK_AUX(e, __LINE__)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to \p b.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Bool {
+  enum {
+    value = b
+  };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct True : public Bool<true> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>false</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct False : public Bool<false> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which \p T1 and \p T2 can be different.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T1, typename T2>
+struct Is_Same : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+  \ingroup PPL_CXX_interface
+  This is the specialization in which \p T1 and \p T2 are equal.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Same<T, T> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p Base is the same type as \p Derived
+  or \p Derived is a class derived from \p Base.
+
+  \ingroup PPL_CXX_interface
+  \note
+  Care must be taken to use this predicate with template classes.
+  Suppose we have
+  \code
+  template <typename T> struct B;
+  template <typename T> struct D : public B<T>;
+  \endcode
+  Of course, we cannot test if, for some type variable <CODE>U</CODE>,
+  we have <CODE>Is_Same_Or_Derived<B<U>, Type>::value == true</CODE>.
+  But we can do as follows:
+  \code
+  struct B_Base {
+  };
+
+  template <typename T> struct B : public B_Base;
+  \endcode
+  This enables us to enquire
+  <CODE>Is_Same_Or_Derived<B_Base, Type>::value</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Base, typename Derived>
+struct Is_Same_Or_Derived {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A class that is constructible from just anything.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct Any {
+    //! The universal constructor.
+    template <typename T>
+    Any(const T&);
+  };
+
+  //! Overloading with \p Base.
+  static char func(const Base&);
+
+  //! Overloading with \p Any.
+  static double func(Any);
+
+  //! A function obtaining a const reference to a \p Derived object.
+  static const Derived& derived_object();
+
+  COMPILE_TIME_CHECK(sizeof(char) != sizeof(double),
+		     "architecture with sizeof(char) == sizeof(double) (!?)");
+
+  enum {
+    /*!
+      Assuming <CODE>sizeof(char) != sizeof(double)</CODE>, the C++
+      overload resolution mechanism guarantees that \p value evaluates
+      to <CODE>true</CODE> if and only if \p Base is the same type
+      as \p Derived or \p Derived is a class derived from \p Base.
+    */
+    value = (sizeof(func(derived_object())) == sizeof(char))
+  };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which the <CODE>type</CODE> member
+  is not present.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b, typename T = void>
+struct Enable_If {
+};
+
+template <typename Type, Type, typename T = void>
+struct Enable_If_Is {
+  typedef T type;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the specialization in which the <CODE>type</CODE> member
+  is present.
+
+  \note
+  Let <CODE>T</CODE>, <CODE>T1</CODE> and <CODE>T2</CODE> be any type
+  expressions and suppose we have some template function
+  <CODE>T f(T1, T2)</CODE>.  If we want to declare a specialization
+  that is enabled only if some compile-time checkable condition holds,
+  we simply declare the specialization by
+  \code
+  template ...
+  typename Enable_If<condition, T>::type
+  foo(T1 x, T2 y);
+  \endcode
+  For all the instantiations of the template parameters that cause
+  <CODE>condition</CODE> to evaluate to <CODE>false</CODE>,
+  the <CODE>Enable_If<condition, T>::type</CODE> member will not be defined.
+  Hence, for that instantiations, the specialization will not be eligible.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Enable_If<true, T> {
+  typedef T type;
+};
+
+template <typename T>
+struct Is_Native : public False {
+};
+
+template <> struct Is_Native<signed char> : public True { };
+template <> struct Is_Native<signed short> : public True { };
+template <> struct Is_Native<signed int> : public True { };
+template <> struct Is_Native<signed long> : public True { };
+template <> struct Is_Native<signed long long> : public True { };
+template <> struct Is_Native<unsigned char> : public True { };
+template <> struct Is_Native<unsigned short> : public True { };
+template <> struct Is_Native<unsigned int> : public True { };
+template <> struct Is_Native<unsigned long> : public True { };
+template <> struct Is_Native<unsigned long long> : public True { };
+
+#if PPL_SUPPORTED_FLOAT
+template <> struct Is_Native<float> : public True { };
+#endif
+#if PPL_SUPPORTED_DOUBLE
+template <> struct Is_Native<double> : public True { };
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <> struct Is_Native<long double> : public True { };
+#endif
+
+template <> struct Is_Native<mpz_class> : public True { };
+
+template <> struct Is_Native<mpq_class> : public True { };
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_meta_programming_hh)
diff --git a/src/minimize.cc b/src/minimize.cc
index 1725d30..f387331 100644
--- a/src/minimize.cc
+++ b/src/minimize.cc
@@ -1,11 +1,11 @@
 /* Polyhedron class implementation: minimize() and add_and_minimize().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,10 +20,10 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include "Linear_Row.defs.hh"
 #include "Linear_System.defs.hh"
-#include "Saturation_Matrix.defs.hh"
+#include "Bit_Matrix.defs.hh"
 #include "Polyhedron.defs.hh"
 #include <stdexcept>
 
@@ -69,7 +69,7 @@ bool
 PPL::Polyhedron::minimize(const bool con_to_gen,
 			  Linear_System& source,
 			  Linear_System& dest,
-			  Saturation_Matrix& sat) {
+			  Bit_Matrix& sat) {
   // Topologies have to agree.
   assert(source.topology() == dest.topology());
   // `source' cannot be empty: even if it is an empty constraint system,
@@ -77,7 +77,7 @@ PPL::Polyhedron::minimize(const bool con_to_gen,
   // the positive constraint. It also cannot be an empty generator system,
   // since this function is always called starting from a non-empty
   // polyhedron.
-  assert(source.num_rows() > 0);
+  assert(!source.has_no_rows());
 
   // Sort the source system, if necessary.
   if (!source.is_sorted())
@@ -125,7 +125,7 @@ PPL::Polyhedron::minimize(const bool con_to_gen,
   //       portion of `tmp_sat' is the sub-matrix consisting of
   //       the first 0 columns: thus the relevant portion correctly
   //       characterizes the initial saturation information.
-  Saturation_Matrix tmp_sat(dest_num_rows, source.num_rows());
+  Bit_Matrix tmp_sat(dest_num_rows, source.num_rows());
 
   // By invoking the function conversion(), we populate `dest' with
   // the generators characterizing the polyhedron described by all
@@ -218,7 +218,7 @@ PPL::Polyhedron::minimize(const bool con_to_gen,
   pair (\p source1, \p dest) and a system of new constraints \p source2,
   modifies \p source1 by adding to it the constraints of \p source2 that
   are not in \p source1. Then, by invoking
-  <CODE>add_and_minimize(bool, Linear_System&, Linear_System&, Saturation_Matrix&)</CODE>,
+  <CODE>add_and_minimize(bool, Linear_System&, Linear_System&, Bit_Matrix&)</CODE>,
   processes the added constraints obtaining a new DD pair.
 
   This method treats also the dual case, i.e., adding new generators to
@@ -233,10 +233,10 @@ bool
 PPL::Polyhedron::add_and_minimize(const bool con_to_gen,
 				  Linear_System& source1,
 				  Linear_System& dest,
-				  Saturation_Matrix& sat,
+				  Bit_Matrix& sat,
 				  const Linear_System& source2) {
   // `source1' and `source2' cannot be empty.
-  assert(source1.num_rows() > 0 && source2.num_rows() > 0);
+  assert(!source1.has_no_rows() && !source2.has_no_rows());
   // `source1' and `source2' must have the same number of columns
   // to be merged.
   assert(source1.num_columns() == source2.num_columns());
@@ -334,7 +334,7 @@ bool
 PPL::Polyhedron::add_and_minimize(const bool con_to_gen,
 				  Linear_System& source,
 				  Linear_System& dest,
-				  Saturation_Matrix& sat) {
+				  Bit_Matrix& sat) {
   assert(source.num_pending_rows() > 0);
   assert(source.num_columns() == dest.num_columns());
   assert(source.is_sorted());
diff --git a/src/mp_numeric_limits.hh b/src/mp_numeric_limits.hh
deleted file mode 100644
index ff69f14..0000000
--- a/src/mp_numeric_limits.hh
+++ /dev/null
@@ -1,157 +0,0 @@
-/* Specializations of std::numeric_limits for multi-precision types.
-   This will become obsolete when GMP and MPFR will provide the
-   specializations by themselves.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_mp_numeric_limits_hh
-#define PPL_mp_numeric_limits_hh 1
-
-#include <gmpxx.h>
-#include <limits>
-
-namespace std {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <>
-class numeric_limits<mpz_class> {
-private:
-  typedef mpz_class Type;
-
-public:
-  static const bool is_specialized = true;
-  static const int digits = 0;
-  static const int digits10 = 0;
-  static const bool is_signed = true;
-  static const bool is_integer = true;
-  static const bool is_exact = true;
-  static const int radix = 2;
-  static const int min_exponent = 0;
-  static const int min_exponent10 = 0;
-  static const int max_exponent = 0;
-  static const int max_exponent10 = 0;
-  static const bool has_infinity = false;
-  static const bool has_quiet_NaN =  false;
-  static const bool has_signaling_NaN = false;
-  static const float_denorm_style has_denorm = denorm_absent;
-  static const bool has_denorm_loss = false;
-  static const bool is_iec559 = false;
-  static const bool is_bounded = false;
-  static const bool is_modulo = false;
-  static const bool traps = false;
-  static const bool tinyness_before = false;
-  static const float_round_style round_style = round_toward_zero;
-
-  static Type min() {
-    return static_cast<Type>(0);
-  }
-
-  static Type max() {
-    return static_cast<Type>(0);
-  }
-
-  static Type epsilon() {
-    return static_cast<Type>(0);
-  }
-
-  static Type round_error() {
-    return static_cast<Type>(0);
-  }
-
-  static Type infinity() {
-    return static_cast<Type>(0);
-  }
-
-  static Type quiet_NaN() {
-    return static_cast<Type>(0);
-  }
-
-  static Type denorm_min() {
-    return static_cast<Type>(1);
-  }
-};
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <>
-class numeric_limits<mpq_class> {
-private:
-  typedef mpq_class Type;
-
-public:
-  static const bool is_specialized = true;
-  static const int digits = 0;
-  static const int digits10 = 0;
-  static const bool is_signed = true;
-  static const bool is_integer = false;
-  static const bool is_exact = true;
-  static const int radix = 2;
-  static const int min_exponent = 0;
-  static const int min_exponent10 = 0;
-  static const int max_exponent = 0;
-  static const int max_exponent10 = 0;
-  static const bool has_infinity = false;
-  static const bool has_quiet_NaN =  false;
-  static const bool has_signaling_NaN = false;
-  static const float_denorm_style has_denorm = denorm_absent;
-  static const bool has_denorm_loss = false;
-  static const bool is_iec559 = false;
-  static const bool is_bounded = false;
-  static const bool is_modulo = false;
-  static const bool traps = false;
-  static const bool tinyness_before = false;
-  static const float_round_style round_style = round_toward_zero;
-
-  static Type min() {
-    return static_cast<Type>(0);
-  }
-
-  static Type max() {
-    return static_cast<Type>(0);
-  }
-
-  static Type epsilon() {
-    return static_cast<Type>(0);
-  }
-
-  static Type round_error() {
-    return static_cast<Type>(0);
-  }
-
-  static Type infinity() {
-    return static_cast<Type>(0);
-  }
-
-  static Type quiet_NaN() {
-    return static_cast<Type>(0);
-  }
-
-  static Type denorm_min() {
-    return static_cast<Type>(0);
-  }
-};
-
-} // namespace std
-
-#endif // !defined(PPL_mp_numeric_limits_hh)
diff --git a/src/mp_std_bits.cc b/src/mp_std_bits.cc
new file mode 100644
index 0000000..af9325e
--- /dev/null
+++ b/src/mp_std_bits.cc
@@ -0,0 +1,72 @@
+/* Definitions of specializations of std::numeric_limits objects for
+   multi-precision types.  This will become obsolete when GMP and MPFR
+   will provide the specializations by themselves.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "mp_std_bits.defs.hh"
+
+const bool std::numeric_limits<mpz_class>::is_specialized;
+const int std::numeric_limits<mpz_class>::digits;
+const int std::numeric_limits<mpz_class>::digits10;
+const bool std::numeric_limits<mpz_class>::is_signed;
+const bool std::numeric_limits<mpz_class>::is_integer;
+const bool std::numeric_limits<mpz_class>::is_exact;
+const int std::numeric_limits<mpz_class>::radix;
+const int std::numeric_limits<mpz_class>::min_exponent;
+const int std::numeric_limits<mpz_class>::min_exponent10;
+const int std::numeric_limits<mpz_class>::max_exponent;
+const int std::numeric_limits<mpz_class>::max_exponent10;
+const bool std::numeric_limits<mpz_class>::has_infinity;
+const bool std::numeric_limits<mpz_class>::has_quiet_NaN;
+const bool std::numeric_limits<mpz_class>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<mpz_class>::has_denorm;
+const bool std::numeric_limits<mpz_class>::has_denorm_loss;
+const bool std::numeric_limits<mpz_class>::is_iec559;
+const bool std::numeric_limits<mpz_class>::is_bounded;
+const bool std::numeric_limits<mpz_class>::is_modulo;
+const bool std::numeric_limits<mpz_class>::traps;
+const bool std::numeric_limits<mpz_class>::tininess_before;
+const std::float_round_style std::numeric_limits<mpz_class>::round_style;
+
+const bool std::numeric_limits<mpq_class>::is_specialized;
+const int std::numeric_limits<mpq_class>::digits;
+const int std::numeric_limits<mpq_class>::digits10;
+const bool std::numeric_limits<mpq_class>::is_signed;
+const bool std::numeric_limits<mpq_class>::is_integer;
+const bool std::numeric_limits<mpq_class>::is_exact;
+const int std::numeric_limits<mpq_class>::radix;
+const int std::numeric_limits<mpq_class>::min_exponent;
+const int std::numeric_limits<mpq_class>::min_exponent10;
+const int std::numeric_limits<mpq_class>::max_exponent;
+const int std::numeric_limits<mpq_class>::max_exponent10;
+const bool std::numeric_limits<mpq_class>::has_infinity;
+const bool std::numeric_limits<mpq_class>::has_quiet_NaN;
+const bool std::numeric_limits<mpq_class>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<mpq_class>::has_denorm;
+const bool std::numeric_limits<mpq_class>::has_denorm_loss;
+const bool std::numeric_limits<mpq_class>::is_iec559;
+const bool std::numeric_limits<mpq_class>::is_bounded;
+const bool std::numeric_limits<mpq_class>::is_modulo;
+const bool std::numeric_limits<mpq_class>::traps;
+const bool std::numeric_limits<mpq_class>::tininess_before;
+const std::float_round_style std::numeric_limits<mpq_class>::round_style;
diff --git a/src/mp_std_bits.defs.hh b/src/mp_std_bits.defs.hh
new file mode 100644
index 0000000..6aa3d24
--- /dev/null
+++ b/src/mp_std_bits.defs.hh
@@ -0,0 +1,169 @@
+/* Declarations of specializations of std:: objects for
+   multi-precision types.  This will become obsolete when GMP and MPFR
+   will provide the specializations by themselves.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_mp_std_bits_defs_hh
+#define PPL_mp_std_bits_defs_hh 1
+
+#include <gmpxx.h>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpz_class& x, mpz_class& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpq_class& x, mpq_class& y);
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpz_class> {
+private:
+  typedef mpz_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = true;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tininess_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(1);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpq_class> {
+private:
+  typedef mpq_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = false;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tininess_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+#include "mp_std_bits.inlines.hh"
+
+#endif // !defined(PPL_mp_std_bits_defs_hh)
diff --git a/src/mp_std_bits.inlines.hh b/src/mp_std_bits.inlines.hh
new file mode 100644
index 0000000..17c8c1d
--- /dev/null
+++ b/src/mp_std_bits.inlines.hh
@@ -0,0 +1,38 @@
+/* Definitions of specializations of std:: functions and methods for
+   multi-precision types.  This will become obsolete when GMP and MPFR
+   will provide the specializations by themselves.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_mp_std_bits_inlines_hh
+#define PPL_mp_std_bits_inlines_hh 1
+
+inline void
+swap(mpz_class& x, mpz_class& y) {
+  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+swap(mpq_class& x, mpq_class& y) {
+  mpq_swap(x.get_mpq_t(), y.get_mpq_t());
+}
+
+#endif // !defined(PPL_mp_std_bits_inlines_hh)
diff --git a/src/namespaces.hh b/src/namespaces.hh
index 93c5083..05c2393 100644
--- a/src/namespaces.hh
+++ b/src/namespaces.hh
@@ -1,11 +1,11 @@
 /* Documentation for used namespaces.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,7 +31,7 @@ namespace Parma_Polyhedra_Library {
 /*! \ingroup PPL_CXX_interface
   This is done so that the library's input/output operators
   do not interfere with those the user might want to define.
-  In fact, it is highly unlikely that any pre-defined I/O
+  In fact, it is highly unlikely that any predefined I/O
   operator will suit the needs of a client application.
   On the other hand, those applications for which the PPL
   I/O operator are enough can easily obtain access to them.
@@ -61,14 +61,14 @@ namespace IO_Operators {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Types and functions implementing checked numbers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 namespace Checked {
 } // namespace Checked
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! %Implementation related data and functions.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 namespace Implementation {
 } // namespace Implementation
 
diff --git a/src/ppl-config.cc b/src/ppl-config.cc
index a572e14..a54c627 100644
--- a/src/ppl-config.cc
+++ b/src/ppl-config.cc
@@ -1,12 +1,12 @@
 /* A program to enquire about the configuration of the PPL  -*- C++ -*-
    and of the applications using it.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,11 +38,11 @@ namespace PPL = Parma_Polyhedra_Library;
 #include <stdexcept>
 #include <string>
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 #include <getopt.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
+#ifdef PPL_HAVE_UNISTD_H
 // Include this for `getopt()': especially important if we do not have
 // <getopt.h>.
 #include <unistd.h>
@@ -76,7 +76,7 @@ Format required_format = NO_FORMAT;
 
 Interface required_interface = NO_INTERFACE;
 
-#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 2"
+#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 3"
 
 std::string prefix;
 std::string exec_prefix;
@@ -111,7 +111,7 @@ bool required_credits = false;
 
 unsigned num_required_items = 0;
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 struct option long_options[] = {
   {"help",              no_argument,       0, 'h'},
   {"format",            required_argument, 0, 'F'},
@@ -176,7 +176,7 @@ static const char* usage_string
 "  -c, --copying            prints detailed licensing information\n"
 "  -u, --bugs               prints bug reporting information\n"
 "  -r, --credits            prints credits\n"
-#ifndef HAVE_GETOPT_H
+#ifndef PPL_HAVE_GETOPT_H
 "\n"
 "NOTE: this version does not support long options.\n"
 #endif
@@ -227,7 +227,7 @@ strcaseeq(const char* s1, const char* s2) {
 void
 process_options(int argc, char* argv[]) {
   while (true) {
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
     int option_index = 0;
     int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
 			&option_index);
@@ -643,10 +643,10 @@ main(int argc, char* argv[]) try {
   }
 
   if (required_cflags)
-    portray("CFLAGS", "-W -Wall  -g -O2");
+    portray("CFLAGS", " -g -O2 -frounding-math  -W -Wall");
 
   if (required_cxxflags)
-    portray("CXXFLAGS", "-W -Wall  -g -O2");
+    portray("CXXFLAGS", " -g -O2 -frounding-math  -W -Wall");
 
   if (required_ldflags) {
     std::string s = "${exec_prefix}/lib";
@@ -666,9 +666,9 @@ main(int argc, char* argv[]) try {
       s += ldflags;
     }
     if (required_library) {
-      if (s.length() > 0 && strlen(" -lm -L/usr/local/lib -lgmpxx -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2 -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2/../../.. -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/distrib/objdir/gcc -L/usr/local/lib -lgmp -R/usr/local/lib -lm -L/usr/local/lib -lgcc_s -lc -R/usr/local/lib") > 0)
+      if (s.length() > 0 && strlen(" -lm -lgmpxx -lgmp") > 0)
 	s += ' ';
-      s += " -lm -L/usr/local/lib -lgmpxx -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2 -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2/../../.. -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/distrib/objdir/gcc -L/usr/local/lib -lgmp -R/usr/local/lib -lm -L/usr/local/lib -lgcc_s -lc -R/usr/local/lib";
+      s += " -lm -lgmpxx -lgmp";
     }
     else {
       assert(required_application);
diff --git a/src/ppl-config.cc.in b/src/ppl-config.cc.in
index 4ed2a06..3aa1d77 100644
--- a/src/ppl-config.cc.in
+++ b/src/ppl-config.cc.in
@@ -1,12 +1,12 @@
 /* A program to enquire about the configuration of the PPL  -*- C++ -*-
    and of the applications using it.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,11 +38,11 @@ namespace PPL = Parma_Polyhedra_Library;
 #include <stdexcept>
 #include <string>
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 #include <getopt.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
+#ifdef PPL_HAVE_UNISTD_H
 // Include this for `getopt()': especially important if we do not have
 // <getopt.h>.
 #include <unistd.h>
@@ -76,7 +76,7 @@ Format required_format = NO_FORMAT;
 
 Interface required_interface = NO_INTERFACE;
 
-#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 2"
+#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 3"
 
 std::string prefix;
 std::string exec_prefix;
@@ -111,7 +111,7 @@ bool required_credits = false;
 
 unsigned num_required_items = 0;
 
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
 struct option long_options[] = {
   {"help",              no_argument,       0, 'h'},
   {"format",            required_argument, 0, 'F'},
@@ -176,7 +176,7 @@ static const char* usage_string
 "  -c, --copying            prints detailed licensing information\n"
 "  -u, --bugs               prints bug reporting information\n"
 "  -r, --credits            prints credits\n"
-#ifndef HAVE_GETOPT_H
+#ifndef PPL_HAVE_GETOPT_H
 "\n"
 "NOTE: this version does not support long options.\n"
 #endif
@@ -227,7 +227,7 @@ strcaseeq(const char* s1, const char* s2) {
 void
 process_options(int argc, char* argv[]) {
   while (true) {
-#ifdef HAVE_GETOPT_H
+#ifdef PPL_HAVE_GETOPT_H
     int option_index = 0;
     int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
 			&option_index);
diff --git a/src/ppl.hh.dist b/src/ppl.hh.dist
index f8b6702..8a8e9ca 100644
--- a/src/ppl.hh.dist
+++ b/src/ppl.hh.dist
@@ -1,11 +1,11 @@
 /* This is the header file of the Parma Polyhedra Library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,274 +24,500 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_ppl_hh 1
 
 #ifdef NDEBUG
-# define PPL_SAVE_NDEBUG 1
+# define PPL_SAVE_NDEBUG NDEBUG
 # undef NDEBUG
 #endif
 
-// Automatically generated from PPL source file ../config.h line 1
-/* config.h.  Generated by configure.  */
-/* config.h.in.  Generated from configure.ac by autoheader.  */
+#ifdef __STDC_LIMIT_MACROS
+# define PPL_SAVE_STDC_LIMIT_MACROS __STDC_LIMIT_MACROS
+#endif
 
+// Automatically generated from PPL source file ../ppl-config.h line 1
+#ifndef _PPL_CONFIG_H
+#define _PPL_CONFIG_H 1
+ 
+/* ppl-config.h. Generated automatically at end of configure. */
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
 
-#ifndef PPL_ppl_config_h
-#define PPL_ppl_config_h 1
+/* ABI-breaking extra assertions are enabled when this is defined. */
+/* #undef ABI_BREAKING_EXTRA_DEBUG */
 
+/* Not zero if the FPU can be controlled. */
+#ifndef PPL_CAN_CONTROL_FPU 
+#define PPL_CAN_CONTROL_FPU  1 
+#endif
 
 /* Defined if the integral type to be used for coefficients is a checked one.
    */
 /* #undef CHECKED_INTEGERS */
 
 /* The number of bits of coefficients; 0 if unbounded. */
-#define COEFFICIENT_BITS 0
+#ifndef PPL_COEFFICIENT_BITS 
+#define PPL_COEFFICIENT_BITS  0 
+#endif
 
 /* The integral type used to represent coefficients. */
-#define COEFFICIENT_TYPE mpz_class
+#ifndef PPL_COEFFICIENT_TYPE 
+#define PPL_COEFFICIENT_TYPE  mpz_class 
+#endif
+
+/* This contains the options with which `configure' was invoked. */
+#ifndef PPL_CONFIGURE_OPTIONS 
+#define PPL_CONFIGURE_OPTIONS  "" 
+#endif
 
 /* The binary format of C++ doubles, if supported; undefined otherwise. */
-#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
+#ifndef PPL_CXX_DOUBLE_BINARY_FORMAT 
+#define PPL_CXX_DOUBLE_BINARY_FORMAT  float_ieee754_double 
+#endif
 
 /* The binary format of C++ floats, if supported; undefined otherwise. */
-#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
+#ifndef PPL_CXX_FLOAT_BINARY_FORMAT 
+#define PPL_CXX_FLOAT_BINARY_FORMAT  float_ieee754_single 
+#endif
+
+/* Not zero if the C++ compiler has the remainder bug. */
+#ifndef PPL_CXX_HAS_REMAINDER_BUG 
+#define PPL_CXX_HAS_REMAINDER_BUG  1 
+#endif
 
 /* The binary format of C++ long doubles, if supported; undefined otherwise.
    */
-#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+#ifndef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT 
+#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT  float_intel_double_extended 
+#endif
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+   range or precision than double. */
+#ifndef PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE 
+#define PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE  1 
+#endif
 
 /* Not zero if the C++ compiler supports __attribute__ ((weak)). */
-#define CXX_SUPPORTS_ATTRIBUTE_WEAK 1
+#ifndef PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK 
+#define PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK  1 
+#endif
 
 /* Not zero if the C++ compiler supports flexible arrays. */
-#define CXX_SUPPORTS_FLEXIBLE_ARRAYS 1
+#ifndef PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS 
+#define PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS  1 
+#endif
+
+/* Defined if floating point arithmetics may use the 387 unit. */
+#ifndef PPL_FPMATH_MAY_USE_387 
+#define PPL_FPMATH_MAY_USE_387  1 
+#endif
+
+/* Defined if floating point arithmetics may use the SSE instruction set. */
+#ifndef PPL_FPMATH_MAY_USE_SSE 
+#define PPL_FPMATH_MAY_USE_SSE  1 
+#endif
+
+/* Defined if GLPK provides glp_term_hook(). */
+#ifndef PPL_GLPK_HAS_GLP_TERM_HOOK 
+#define PPL_GLPK_HAS_GLP_TERM_HOOK  1 
+#endif
+
+/* Defined if GLPK provides glp_term_out(). */
+#ifndef PPL_GLPK_HAS_GLP_TERM_OUT 
+#define PPL_GLPK_HAS_GLP_TERM_OUT  1 
+#endif
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+/* #undef GLPK_HAS_LIB_SET_PRINT_HOOK */
 
-/* Enable more assertions when defined. */
-/* #undef EXTRA_ROW_DEBUG */
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+#ifndef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK 
+#define PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK  1 
+#endif
 
 /* Defined if the integral type to be used for coefficients is GMP's one. */
-#define GMP_INTEGERS 1
+#ifndef PPL_GMP_INTEGERS 
+#define PPL_GMP_INTEGERS  1 
+#endif
 
 /* Not zero if GMP has been compiled with support for exceptions. */
-#define GMP_SUPPORTS_EXCEPTIONS 1
+#ifndef PPL_GMP_SUPPORTS_EXCEPTIONS 
+#define PPL_GMP_SUPPORTS_EXCEPTIONS  1 
+#endif
 
 /* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
-#define HAVE_DECL_FFS 1
+#ifndef PPL_HAVE_DECL_FFS 
+#define PPL_HAVE_DECL_FFS  1 
+#endif
 
 /* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
-#define HAVE_DECL_FMA 1
+#ifndef PPL_HAVE_DECL_FMA 
+#define PPL_HAVE_DECL_FMA  1 
+#endif
 
 /* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
    */
-#define HAVE_DECL_FMAF 1
+#ifndef PPL_HAVE_DECL_FMAF 
+#define PPL_HAVE_DECL_FMAF  1 
+#endif
 
 /* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
    */
-#define HAVE_DECL_FMAL 1
+#ifndef PPL_HAVE_DECL_FMAL 
+#define PPL_HAVE_DECL_FMAL  1 
+#endif
 
 /* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
    */
-#define HAVE_DECL_GETENV 1
+#ifndef PPL_HAVE_DECL_GETENV 
+#define PPL_HAVE_DECL_GETENV  1 
+#endif
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+   don't. */
+#ifndef PPL_HAVE_DECL_GETRUSAGE 
+#define PPL_HAVE_DECL_GETRUSAGE  1 
+#endif
 
 /* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
    */
-#define HAVE_DECL_RINTF 1
+#ifndef PPL_HAVE_DECL_RINTF 
+#define PPL_HAVE_DECL_RINTF  1 
+#endif
 
 /* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
    */
-#define HAVE_DECL_RINTL 1
+#ifndef PPL_HAVE_DECL_RINTL 
+#define PPL_HAVE_DECL_RINTL  1 
+#endif
 
 /* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
    don't. */
-#define HAVE_DECL_RLIMIT_AS 1
+#ifndef PPL_HAVE_DECL_RLIMIT_AS 
+#define PPL_HAVE_DECL_RLIMIT_AS  1 
+#endif
 
 /* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
    don't. */
-#define HAVE_DECL_RLIMIT_DATA 1
+#ifndef PPL_HAVE_DECL_RLIMIT_DATA 
+#define PPL_HAVE_DECL_RLIMIT_DATA  1 
+#endif
 
 /* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
    don't. */
-#define HAVE_DECL_RLIMIT_RSS 1
+#ifndef PPL_HAVE_DECL_RLIMIT_RSS 
+#define PPL_HAVE_DECL_RLIMIT_RSS  1 
+#endif
 
 /* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
    don't. */
-#define HAVE_DECL_RLIMIT_VMEM 0
+#ifndef PPL_HAVE_DECL_RLIMIT_VMEM 
+#define PPL_HAVE_DECL_RLIMIT_VMEM  0 
+#endif
 
 /* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
    */
-#define HAVE_DECL_STRTOD 1
+#ifndef PPL_HAVE_DECL_STRTOD 
+#define PPL_HAVE_DECL_STRTOD  1 
+#endif
 
 /* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
    */
-#define HAVE_DECL_STRTOF 1
+#ifndef PPL_HAVE_DECL_STRTOF 
+#define PPL_HAVE_DECL_STRTOF  1 
+#endif
 
 /* Define to 1 if you have the declaration of `strtold', and to 0 if you
    don't. */
-#define HAVE_DECL_STRTOLD 1
+#ifndef PPL_HAVE_DECL_STRTOLD 
+#define PPL_HAVE_DECL_STRTOLD  1 
+#endif
 
 /* Define to 1 if you have the declaration of `strtoll', and to 0 if you
    don't. */
-#define HAVE_DECL_STRTOLL 1
+#ifndef PPL_HAVE_DECL_STRTOLL 
+#define PPL_HAVE_DECL_STRTOLL  1 
+#endif
 
 /* Define to 1 if you have the declaration of `strtoull', and to 0 if you
    don't. */
-#define HAVE_DECL_STRTOULL 1
+#ifndef PPL_HAVE_DECL_STRTOULL 
+#define PPL_HAVE_DECL_STRTOULL  1 
+#endif
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
+#ifndef PPL_HAVE_DLFCN_H 
+#define PPL_HAVE_DLFCN_H  1 
+#endif
 
 /* Define to 1 if you have the <fenv.h> header file. */
-#define HAVE_FENV_H 1
+#ifndef PPL_HAVE_FENV_H 
+#define PPL_HAVE_FENV_H  1 
+#endif
 
 /* Define to 1 if you have the <getopt.h> header file. */
-#define HAVE_GETOPT_H 1
+#ifndef PPL_HAVE_GETOPT_H 
+#define PPL_HAVE_GETOPT_H  1 
+#endif
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+/* #undef HAVE_GLPK_GLPK_H */
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#ifndef PPL_HAVE_GLPK_H 
+#define PPL_HAVE_GLPK_H  1 
+#endif
 
 /* Define to 1 if you have the <ieeefp.h> header file. */
 /* #undef HAVE_IEEEFP_H */
 
 /* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
+#ifndef PPL_HAVE_INTTYPES_H 
+#define PPL_HAVE_INTTYPES_H  1 
+#endif
 
 /* Define to 1 if the system has the type `int_fast16_t'. */
-#define HAVE_INT_FAST16_T 1
+#ifndef PPL_HAVE_INT_FAST16_T 
+#define PPL_HAVE_INT_FAST16_T  1 
+#endif
 
 /* Define to 1 if the system has the type `int_fast32_t'. */
-#define HAVE_INT_FAST32_T 1
+#ifndef PPL_HAVE_INT_FAST32_T 
+#define PPL_HAVE_INT_FAST32_T  1 
+#endif
 
 /* Define to 1 if the system has the type `int_fast64_t'. */
-#define HAVE_INT_FAST64_T 1
+#ifndef PPL_HAVE_INT_FAST64_T 
+#define PPL_HAVE_INT_FAST64_T  1 
+#endif
 
 /* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
+#ifndef PPL_HAVE_MEMORY_H 
+#define PPL_HAVE_MEMORY_H  1 
+#endif
 
 /* Define to 1 if you have the <signal.h> header file. */
-#define HAVE_SIGNAL_H 1
+#ifndef PPL_HAVE_SIGNAL_H 
+#define PPL_HAVE_SIGNAL_H  1 
+#endif
 
 /* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
+#ifndef PPL_HAVE_STDINT_H 
+#define PPL_HAVE_STDINT_H  1 
+#endif
 
 /* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
+#ifndef PPL_HAVE_STDLIB_H 
+#define PPL_HAVE_STDLIB_H  1 
+#endif
 
 /* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
+#ifndef PPL_HAVE_STRINGS_H 
+#define PPL_HAVE_STRINGS_H  1 
+#endif
 
 /* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
+#ifndef PPL_HAVE_STRING_H 
+#define PPL_HAVE_STRING_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
+#ifndef PPL_HAVE_SYS_RESOURCE_H 
+#define PPL_HAVE_SYS_RESOURCE_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
+#ifndef PPL_HAVE_SYS_STAT_H 
+#define PPL_HAVE_SYS_STAT_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
+#ifndef PPL_HAVE_SYS_TIME_H 
+#define PPL_HAVE_SYS_TIME_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
+#ifndef PPL_HAVE_SYS_TYPES_H 
+#define PPL_HAVE_SYS_TYPES_H  1 
+#endif
+
+/* Define to 1 if the system has the type `timeval'. */
+#ifndef PPL_HAVE_TIMEVAL 
+#define PPL_HAVE_TIMEVAL  1 
+#endif
+
+/* Define to 1 if typeof works with your compiler. */
+#ifndef PPL_HAVE_TYPEOF 
+#define PPL_HAVE_TYPEOF  1 
+#endif
 
 /* Define to 1 if the system has the type `uint_fast16_t'. */
-#define HAVE_UINT_FAST16_T 1
+#ifndef PPL_HAVE_UINT_FAST16_T 
+#define PPL_HAVE_UINT_FAST16_T  1 
+#endif
 
 /* Define to 1 if the system has the type `uint_fast32_t'. */
-#define HAVE_UINT_FAST32_T 1
+#ifndef PPL_HAVE_UINT_FAST32_T 
+#define PPL_HAVE_UINT_FAST32_T  1 
+#endif
 
 /* Define to 1 if the system has the type `uint_fast64_t'. */
-#define HAVE_UINT_FAST64_T 1
+#ifndef PPL_HAVE_UINT_FAST64_T 
+#define PPL_HAVE_UINT_FAST64_T  1 
+#endif
 
 /* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
+#ifndef PPL_HAVE_UNISTD_H 
+#define PPL_HAVE_UNISTD_H  1 
+#endif
 
 /* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */
-#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+#ifndef PPL_HAVE___MPZ_STRUCT__MP_ALLOC 
+#define PPL_HAVE___MPZ_STRUCT__MP_ALLOC  1 
+#endif
 
 /* Define to 1 if `_mp_d' is member of `__mpz_struct'. */
-#define HAVE___MPZ_STRUCT__MP_D 1
+#ifndef PPL_HAVE___MPZ_STRUCT__MP_D 
+#define PPL_HAVE___MPZ_STRUCT__MP_D  1 
+#endif
 
 /* Define to 1 if `_mp_size' is member of `__mpz_struct'. */
-#define HAVE___MPZ_STRUCT__MP_SIZE 1
+#ifndef PPL_HAVE___MPZ_STRUCT__MP_SIZE 
+#define PPL_HAVE___MPZ_STRUCT__MP_SIZE  1 
+#endif
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#ifndef PPL_LT_OBJDIR 
+#define PPL_LT_OBJDIR  ".libs/" 
+#endif
 
 /* Defined if the integral type to be used for coefficients is a native one.
    */
 /* #undef NATIVE_INTEGERS */
 
 /* Assertions are disabled when this is defined. */
-#define NDEBUG 1
-
-/* Name of package */
-#define PACKAGE "ppl"
+#ifndef PPL_NDEBUG 
+#define PPL_NDEBUG  1 
+#endif
 
 /* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "ppl-devel at cs.unipr.it"
+#ifndef PPL_PACKAGE_BUGREPORT 
+#define PPL_PACKAGE_BUGREPORT  "ppl-devel at cs.unipr.it" 
+#endif
 
 /* Define to the full name of this package. */
-#define PACKAGE_NAME "the Parma Polyhedra Library"
+#ifndef PPL_PACKAGE_NAME 
+#define PPL_PACKAGE_NAME  "the Parma Polyhedra Library" 
+#endif
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "the Parma Polyhedra Library 0.9"
+#ifndef PPL_PACKAGE_STRING 
+#define PPL_PACKAGE_STRING  "the Parma Polyhedra Library 0.10pre27" 
+#endif
 
 /* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "ppl"
+#ifndef PPL_PACKAGE_TARNAME 
+#define PPL_PACKAGE_TARNAME  "ppl" 
+#endif
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "0.9"
-
-/* Not zero if the FPU can be controlled. */
-#define PPL_CAN_CONTROL_FPU 1
+#ifndef PPL_PACKAGE_VERSION 
+#define PPL_PACKAGE_VERSION  "0.10pre27" 
+#endif
 
-/* This contains the options with which `configure' was invoked. */
-#define PPL_CONFIGURE_OPTIONS ""
+/* The size of `char', as computed by sizeof. */
+#ifndef PPL_SIZEOF_CHAR 
+#define PPL_SIZEOF_CHAR  1 
+#endif
 
-/* Not zero if doubles are supported. */
-#define PPL_SUPPORTED_DOUBLE 1
+/* The size of `double', as computed by sizeof. */
+#ifndef PPL_SIZEOF_DOUBLE 
+#define PPL_SIZEOF_DOUBLE  8 
+#endif
 
-/* Not zero if floats are supported. */
-#define PPL_SUPPORTED_FLOAT 1
+/* The size of `float', as computed by sizeof. */
+#ifndef PPL_SIZEOF_FLOAT 
+#define PPL_SIZEOF_FLOAT  4 
+#endif
 
-/* Not zero if long doubles are supported. */
-#define PPL_SUPPORTED_LONG_DOUBLE 1
+/* The size of `fp', as computed by sizeof. */
+#ifndef PPL_SIZEOF_FP 
+#define PPL_SIZEOF_FP  8 
+#endif
 
-/* The size of a `double', as computed by sizeof. */
-#define SIZEOF_DOUBLE 8
+/* The size of `int', as computed by sizeof. */
+#ifndef PPL_SIZEOF_INT 
+#define PPL_SIZEOF_INT  4 
+#endif
 
-/* The size of a `float', as computed by sizeof. */
-#define SIZEOF_FLOAT 4
+/* The size of `int*', as computed by sizeof. */
+#ifndef PPL_SIZEOF_INTP 
+#define PPL_SIZEOF_INTP  8 
+#endif
 
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
+/* The size of `long', as computed by sizeof. */
+#ifndef PPL_SIZEOF_LONG 
+#define PPL_SIZEOF_LONG  8 
+#endif
 
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
+/* The size of `long double', as computed by sizeof. */
+#ifndef PPL_SIZEOF_LONG_DOUBLE 
+#define PPL_SIZEOF_LONG_DOUBLE  16 
+#endif
 
-/* The size of a `long double', as computed by sizeof. */
-#define SIZEOF_LONG_DOUBLE 12
+/* The size of `long long', as computed by sizeof. */
+#ifndef PPL_SIZEOF_LONG_LONG 
+#define PPL_SIZEOF_LONG_LONG  8 
+#endif
 
-/* The size of a `long long', as computed by sizeof. */
-#define SIZEOF_LONG_LONG 8
+/* The size of `mp_limb_t', as computed by sizeof. */
+#ifndef PPL_SIZEOF_MP_LIMB_T 
+#define PPL_SIZEOF_MP_LIMB_T  8 
+#endif
 
-/* The size of a `mp_limb_t', as computed by sizeof. */
-#define SIZEOF_MP_LIMB_T 4
+/* The size of `short', as computed by sizeof. */
+#ifndef PPL_SIZEOF_SHORT 
+#define PPL_SIZEOF_SHORT  2 
+#endif
 
-/* The size of a `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
+/* The size of `size_t', as computed by sizeof. */
+#ifndef PPL_SIZEOF_SIZE_T 
+#define PPL_SIZEOF_SIZE_T  8 
+#endif
 
-/* The size of a `unsigned', as computed by sizeof. */
-#define SIZEOF_UNSIGNED 4
+/* Define to 1 if you have the ANSI C header files. */
+#ifndef PPL_STDC_HEADERS 
+#define PPL_STDC_HEADERS  1 
+#endif
 
-/* The size of a `unsigned long', as computed by sizeof. */
-#define SIZEOF_UNSIGNED_LONG 4
+/* Not zero if doubles are supported. */
+#ifndef PPL_SUPPORTED_DOUBLE 
+#define PPL_SUPPORTED_DOUBLE  1 
+#endif
 
-/* The size of a `unsigned long long', as computed by sizeof. */
-#define SIZEOF_UNSIGNED_LONG_LONG 8
+/* Not zero if floats are supported. */
+#ifndef PPL_SUPPORTED_FLOAT 
+#define PPL_SUPPORTED_FLOAT  1 
+#endif
 
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
+/* Not zero if long doubles are supported. */
+#ifndef PPL_SUPPORTED_LONG_DOUBLE 
+#define PPL_SUPPORTED_LONG_DOUBLE  1 
+#endif
 
-/* Version number of package */
-#define VERSION "0.9"
+/* Defined if the Parma Watchdog Library is enabled. */
+#ifndef PPL_WATCHDOG_LIBRARY_ENABLED 
+#define PPL_WATCHDOG_LIBRARY_ENABLED  1 
+#endif
 
 /* Define to 1 if your processor stores words with the most significant byte
    first (like Motorola and SPARC, unlike Intel and VAX). */
 /* #undef WORDS_BIGENDIAN */
 
+/* When defined and libstdc++ is used, it is used in debug mode. */
+/* #undef _GLIBCXX_DEBUG */
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+/* #undef _GLIBCXX_DEBUG_PEDANTIC */
+
 /* Define to empty if `const' does not conform to ANSI C. */
 /* #undef const */
 
@@ -301,21 +527,36 @@ site: http://www.cs.unipr.it/ppl/ . */
 /* #undef inline */
 #endif
 
+/* Define to __typeof__ if your compiler spells it that way. */
+/* #undef typeof */
+
+
+#ifdef PPL_NDEBUG
+# define NDEBUG 1
+#endif
 
 /*
   In order for the definition of `int64_t' to be seen by Comeau C/C++,
   we must make sure <stdint.h> is included before <sys/types.hh> is
   (even indirectly) included.
+
+  Moreover we need to define __STDC_LIMIT_MACROS before the first
+  inclusion of <stdint.h> in order to have the macros defined also in C++.
 */
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
 #endif
 
-#endif /* !defined(PPL_ppl_config_h) */
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
 
+ 
+/* once: _PPL_CONFIG_H */
+#endif
 // Automatically generated from PPL source file ../src/version.hh line 1
 /* Declaration of macros and functions providing version  -*- C++ -*-
    and licensing information.
@@ -328,7 +569,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 //! The minor number of the PPL version.
 /*! \ingroup PPL_CXX_interface */
-#define PPL_VERSION_MINOR 9
+#define PPL_VERSION_MINOR 10
 
 //! The revision number of the PPL version.
 /*! \ingroup PPL_CXX_interface */
@@ -339,7 +580,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   releases and nonzero for development snapshots.
   \ingroup PPL_CXX_interface
 */
-#define PPL_VERSION_BETA 0
+#define PPL_VERSION_BETA 27
 
 //! A string containing the PPL version.
 /*! \ingroup PPL_CXX_interface
@@ -353,7 +594,7 @@ site: http://www.cs.unipr.it/ppl/ . */
   PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
   neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
 */
-#define PPL_VERSION "0.9"
+#define PPL_VERSION "0.10pre27"
 
 namespace Parma_Polyhedra_Library {
 
@@ -387,7 +628,7 @@ const char* banner();
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/namespaces.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/namespaces.hh line 1
 /* Documentation for used namespaces.
 */
 
@@ -400,7 +641,7 @@ namespace Parma_Polyhedra_Library {
 /*! \ingroup PPL_CXX_interface
   This is done so that the library's input/output operators
   do not interfere with those the user might want to define.
-  In fact, it is highly unlikely that any pre-defined I/O
+  In fact, it is highly unlikely that any predefined I/O
   operator will suit the needs of a client application.
   On the other hand, those applications for which the PPL
   I/O operator are enough can easily obtain access to them.
@@ -430,14 +671,14 @@ namespace IO_Operators {
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Types and functions implementing checked numbers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 namespace Checked {
 } // namespace Checked
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! %Implementation related data and functions.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 namespace Implementation {
 } // namespace Implementation
 
@@ -466,7 +707,7 @@ namespace std {
 } // namespace std
 
 
-// Automatically generated from PPL source file ../src/compiler.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/compiler.hh line 1
 /* C++ compiler related stuff.
 */
 
@@ -474,2965 +715,1666 @@ namespace std {
 namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Used to avoid unused variable warnings from the compiler.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op function that allows to avoid unused variable warnings from
+  the compiler.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
 inline void
 used(const T&) {
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Coefficient_traits_template.hh line 1
-
-
-namespace Parma_Polyhedra_Library {
-
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Coefficient traits.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Coefficient>
-struct Coefficient_traits_template {
-};
-
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Checked_Number.types.hh line 1
-
-
-// Automatically generated from PPL source file ../src/Checked_Number.types.hh line 16
-
-namespace Parma_Polyhedra_Library {
-
-struct Checked_Number_Default_Policy;
-struct Extended_Number_Policy;
-
-template <typename T, typename Policy = Checked_Number_Default_Policy>
-class Checked_Number;
+/*! \brief
+  No-op function that prevents the compiler to subject the argument to CSE.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void avoid_cse(const T& x) {
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+  __asm__ __volatile__ ("" : "+m" (const_cast<T&>(x)));
+#else
+  // FIXME: is it possible to achieve the same effect in a portable way?
+  used(x);
+#endif
+}
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/GMP_Integer.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/meta_programming.hh line 1
+/* Metaprogramming utilities.
+*/
 
 
-// Automatically generated from PPL source file ../src/GMP_Integer.types.hh line 16
 #include <gmpxx.h>
 
 namespace Parma_Polyhedra_Library {
 
-/*! \class Parma_Polyhedra_Library::GMP_Integer
-  \brief
-  Unbounded integers as provided by the GMP library.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>bool</CODE>, called \p name
+  and with value \p value.
 
   \ingroup PPL_CXX_interface
-  GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
-  defined in the C++ interface of the GMP library.
-  For more information, see <CODE>http://www.swox.com/gmp/</CODE>
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
 */
-typedef mpz_class GMP_Integer;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_bool_nodef(name, value)		\
+  enum { name = (value) }
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Coefficient traits specialization for unbounded integers.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <>
-struct Coefficient_traits_template<GMP_Integer> {
-  //! The type used for references to const unbounded integers.
-  typedef const GMP_Integer& const_reference;
-};
-
-} // namespace Parma_Polyhedra_Library
+/*! \brief
+  Declares a per-class constant of type <CODE>int</CODE>, called \p name
+  and with value \p value.
 
-// Automatically generated from PPL source file ../src/Coefficient.types.hh line 1
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_int_nodef(name, value) \
+  enum { name = (value) }
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  The value of the constant is accessible
+  by means of the syntax <CODE>name()</CODE>.
 
-// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 1
-/* Checked_Number class declaration.
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
 */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_value_nodef(type, name, value)	\
+  static type name() {				\
+    return value;				\
+  }
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  A constant reference to the constant
+  is accessible by means of the syntax <CODE>name()</CODE>.
 
-// Automatically generated from PPL source file ../src/checked.defs.hh line 1
-/* Abstract checked arithmetic function container
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
 */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_ref_nodef(type, name, value)				\
+  static const type& name() {						\
+    static type name(value);						\
+    return name;							\
+  }
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
 
-#include <iostream>
-#include <gmpxx.h>
-// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 1
-/* Declaration of Rounding_Dir and related functions.
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, so the class is declared but not defined.
 */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Compile_Time_Check;
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
 
-// Automatically generated from PPL source file ../src/Result.defs.hh line 1
-/* Result enum and supporting function declarations.
+  \ingroup PPL_CXX_interface
+  This is the specialized case with \p b equal to <CODE>true</CODE>,
+  so the class is declared and (trivially) defined.
 */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Compile_Time_Check<true> {
+};
 
+#define COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix
+#define COMPILE_TIME_CHECK_AUX(e, suffix)				\
+  enum {								\
+    /* If e evaluates to false, then the sizeof cannot be compiled. */  \
+    COMPILE_TIME_CHECK_NAME(suffix)					\
+    = sizeof(Parma_Polyhedra_Library::					\
+	     Compile_Time_Check<static_cast<bool>(e)>)			\
+  }
 
-namespace Parma_Polyhedra_Library {
-
-//! Possible outcomes of a checked arithmetic computation.
-/*! \ingroup PPL_CXX_interface */
-enum Result {
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Produces a compilation error if the compile-time constant \p e does
+  not evaluate to <CODE>true</CODE>
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define COMPILE_TIME_CHECK(e, msg) COMPILE_TIME_CHECK_AUX(e, __LINE__)
 
-  VC_MASK = 48,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to \p b.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Bool {
+  enum {
+    value = b
+  };
+};
 
-  //! \hideinitializer Ordinary result class.
-  VC_NORMAL = 0,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct True : public Bool<true> {
+};
 
-  //! \hideinitializer The computed result is inexact and rounded up.
-  V_LT = 1,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>false</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct False : public Bool<false> {
+};
 
-  //! \hideinitializer The computed result is inexact and rounded down.
-  V_GT = 2,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
 
-  //! \hideinitializer The computed result is exact.
-  V_EQ = 4,
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which \p T1 and \p T2 can be different.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T1, typename T2>
+struct Is_Same : public False {
+};
 
-  //! \hideinitializer The computed result is inexact.
-  V_NE = V_LT | V_GT,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
 
-  //! \hideinitializer The computed result may be inexact and rounded up.
-  V_LE = V_EQ | V_LT,
+  \ingroup PPL_CXX_interface
+  This is the specialization in which \p T1 and \p T2 are equal.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Same<T, T> : public True {
+};
 
-  //! \hideinitializer The computed result may be inexact and rounded down.
-  V_GE = V_EQ | V_GT,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p Base is the same type as \p Derived
+  or \p Derived is a class derived from \p Base.
 
-  //! \hideinitializer The computed result may be inexact.
-  V_LGE = V_LT | V_EQ | V_GT,
+  \ingroup PPL_CXX_interface
+  \note
+  Care must be taken to use this predicate with template classes.
+  Suppose we have
+  \code
+  template <typename T> struct B;
+  template <typename T> struct D : public B<T>;
+  \endcode
+  Of course, we cannot test if, for some type variable <CODE>U</CODE>,
+  we have <CODE>Is_Same_Or_Derived<B<U>, Type>::value == true</CODE>.
+  But we can do as follows:
+  \code
+  struct B_Base {
+  };
 
-  //! \hideinitializer Negative infinity unrepresentable result class.
-  VC_MINUS_INFINITY = 16,
+  template <typename T> struct B : public B_Base;
+  \endcode
+  This enables us to enquire
+  <CODE>Is_Same_Or_Derived<B_Base, Type>::value</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Base, typename Derived>
+struct Is_Same_Or_Derived {
 
-  //! \hideinitializer A negative overflow occurred.
-  V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A class that is constructible from just anything.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct Any {
+    //! The universal constructor.
+    template <typename T>
+    Any(const T&);
+  };
 
-  //! \hideinitializer Positive infinity unrepresentable result class.
-  VC_PLUS_INFINITY = 32,
+  //! Overloading with \p Base.
+  static char func(const Base&);
 
-  //! \hideinitializer A positive overflow occurred.
-  V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT,
+  //! Overloading with \p Any.
+  static double func(Any);
 
-  //! \hideinitializer Not a number result class.
-  VC_NAN = 48,
+  //! A function obtaining a const reference to a \p Derived object.
+  static const Derived& derived_object();
 
-  //! \hideinitializer Converting from unknown string.
-  V_CVT_STR_UNK = 49,
+  COMPILE_TIME_CHECK(sizeof(char) != sizeof(double),
+		     "architecture with sizeof(char) == sizeof(double) (!?)");
 
-  //! \hideinitializer Dividing by zero.
-  V_DIV_ZERO = 50,
+  enum {
+    /*!
+      Assuming <CODE>sizeof(char) != sizeof(double)</CODE>, the C++
+      overload resolution mechanism guarantees that \p value evaluates
+      to <CODE>true</CODE> if and only if \p Base is the same type
+      as \p Derived or \p Derived is a class derived from \p Base.
+    */
+    value = (sizeof(func(derived_object())) == sizeof(char))
+  };
+};
 
-  //! \hideinitializer Adding two infinities having opposite signs.
-  V_INF_ADD_INF = 51,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
 
-  //! \hideinitializer Dividing two infinities.
-  V_INF_DIV_INF = 52,
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which the <CODE>type</CODE> member
+  is not present.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b, typename T = void>
+struct Enable_If {
+};
 
-  //! \hideinitializer Taking the modulus of an infinity.
-  V_INF_MOD = 53,
+template <typename Type, Type, typename T = void>
+struct Enable_If_Is {
+  typedef T type;
+};
 
-  //! \hideinitializer Multiplying an infinity by zero.
-  V_INF_MUL_ZERO = 54,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
 
-  //! \hideinitializer Subtracting two infinities having the same sign.
-  V_INF_SUB_INF = 55,
+  \ingroup PPL_CXX_interface
+  This is the specialization in which the <CODE>type</CODE> member
+  is present.
 
-  //! \hideinitializer Computing a remainder modulo zero.
-  V_MOD_ZERO = 56,
+  \note
+  Let <CODE>T</CODE>, <CODE>T1</CODE> and <CODE>T2</CODE> be any type
+  expressions and suppose we have some template function
+  <CODE>T f(T1, T2)</CODE>.  If we want to declare a specialization
+  that is enabled only if some compile-time checkable condition holds,
+  we simply declare the specialization by
+  \code
+  template ...
+  typename Enable_If<condition, T>::type
+  foo(T1 x, T2 y);
+  \endcode
+  For all the instantiations of the template parameters that cause
+  <CODE>condition</CODE> to evaluate to <CODE>false</CODE>,
+  the <CODE>Enable_If<condition, T>::type</CODE> member will not be defined.
+  Hence, for that instantiations, the specialization will not be eligible.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Enable_If<true, T> {
+  typedef T type;
+};
 
-  //! \hideinitializer Taking the square root of a negative number.
-  V_SQRT_NEG = 57,
+template <typename T>
+struct Is_Native : public False {
+};
 
-  //! \hideinitializer Unknown result due to intermediate negative overflow.
-  V_UNKNOWN_NEG_OVERFLOW = 58,
+template <> struct Is_Native<signed char> : public True { };
+template <> struct Is_Native<signed short> : public True { };
+template <> struct Is_Native<signed int> : public True { };
+template <> struct Is_Native<signed long> : public True { };
+template <> struct Is_Native<signed long long> : public True { };
+template <> struct Is_Native<unsigned char> : public True { };
+template <> struct Is_Native<unsigned short> : public True { };
+template <> struct Is_Native<unsigned int> : public True { };
+template <> struct Is_Native<unsigned long> : public True { };
+template <> struct Is_Native<unsigned long long> : public True { };
 
-  //! \hideinitializer Unknown result due to intermediate positive overflow.
-  V_UNKNOWN_POS_OVERFLOW = 59,
+#if PPL_SUPPORTED_FLOAT
+template <> struct Is_Native<float> : public True { };
+#endif
+#if PPL_SUPPORTED_DOUBLE
+template <> struct Is_Native<double> : public True { };
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <> struct Is_Native<long double> : public True { };
+#endif
 
-  //! \hideinitializer Unordered comparison.
-  V_UNORD_COMP = 60
-};
+template <> struct Is_Native<mpz_class> : public True { };
 
-bool is_special(Result r);
-Result classify(Result r);
-Result sign(Result r);
+template <> struct Is_Native<mpq_class> : public True { };
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Result.inlines.hh line 1
-/* Result supporting functions implementation: inline functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Slow_Copy.hh line 1
+/* Basic Slow_Copy classes declarations.
 */
 
 
-#include <cassert>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Slow_Copy.hh line 27
+#include <gmpxx.h>
 
 namespace Parma_Polyhedra_Library {
 
-inline Result
-classify(Result r) {
-  return static_cast<Result>(r & VC_MASK);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are not slow by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Slow_Copy : public False {
+};
 
-inline bool
-is_special(Result r) {
-  return classify(r) != VC_NORMAL;
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpz_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpz_class> : public True {
+};
 
-inline Result
-sign(Result r) {
-  switch (r) {
-  case V_LT:
-  case V_EQ:
-  case V_GT:
-  case VC_NAN:
-    return r;
-  case VC_MINUS_INFINITY:
-    return V_LT;
-  case VC_PLUS_INFINITY:
-    return V_GT;
-  default:
-    assert(false);
-    return VC_NAN;
-  }
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpq_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpq_class> : public True {
+};
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Result.defs.hh line 117
-
-// Automatically generated from PPL source file ../src/fpu.defs.hh line 1
-/* Floating point unit related functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Has_Assign_Or_Swap.hh line 1
+/* Has_Assign_Or_Swap classes declarations.
 */
 
 
-// Automatically generated from PPL source file ../src/fpu.types.hh line 1
-
-
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Has_Assign_Or_Swap.hh line 27
 
 namespace Parma_Polyhedra_Library {
 
-typedef int fpu_rounding_direction_type;
-typedef int fpu_rounding_control_word_type;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is not present by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Has_Assign_Or_Swap : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is present if it is present (!).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Has_Assign_Or_Swap<T,
+			  typename Enable_If_Is<void (T::*)(T& x),
+						&T::assign_or_swap>::type>
+  : public True {
+};
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/fpu.defs.hh line 27
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/assign_or_swap.hh line 1
+/* The assign_or_swap() utility functions.
+*/
 
-namespace Parma_Polyhedra_Library {
 
-//! Returns the current FPU rounding direction.
-fpu_rounding_direction_type
-fpu_get_rounding_direction();
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/assign_or_swap.hh line 29
 
-//! Sets the FPU rounding direction to \p dir.
-void
-fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+namespace Parma_Polyhedra_Library {
 
-/*! \brief
-  Sets the FPU rounding direction to \p dir and returns the rounding
-  control word previously in use.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is an assign_or_swap() method, use it.
 */
-fpu_rounding_control_word_type
-fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Has_Assign_Or_Swap<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to.assign_or_swap(from);
+}
 
-/*! \brief
-  Sets the FPU rounding direction to \p dir, clears the <EM>inexact
-  computation</EM> status, and returns the rounding control word
-  previously in use.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() method but copies are not slow, copy.
 */
-fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
-
-//! Restores the FPU rounding rounding control word to \p cw.
-void
-fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
-
-//! Clears the <EM>inexact computation</EM> status.
-void
-fpu_reset_inexact();
-
-/*! \brief
-  Queries the <EM>inexact computation</EM> status.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && !Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to = from;
+}
 
-  Returns 0 if the computation was definitely exact, 1 if it was
-  definitely inexact, -1 if definite exactness information is unavailable.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() and copies are slow, delegate to std::swap().
 */
-int
-fpu_check_inexact();
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  std::swap(to, from);
+}
 
 } // namespace Parma_Polyhedra_Library
 
-#if defined(__i386__)
-// Automatically generated from PPL source file ../src/fpu-ia32.inlines.hh line 1
-/* ia32 floating point unit related functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/mp_std_bits.defs.hh line 1
+/* Declarations of specializations of std:: objects for
+   multi-precision types.  This will become obsolete when GMP and MPFR
+   will provide the specializations by themselves.
 */
 
-// Automatically generated from PPL source file ../src/fpu-ia32.inlines.hh line 24
 
-#define FPU_INVALID      0x01
-#define FPU_DIVBYZERO    0x04
-#define FPU_OVERFLOW     0x08
-#define FPU_UNDERFLOW    0x10
-#define FPU_INEXACT      0x20
+#include <gmpxx.h>
+#include <limits>
 
-#define FPU_ALL_EXCEPT \
-  (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpz_class& x, mpz_class& y);
 
-#define FPU_TONEAREST    0
-#define FPU_DOWNWARD     0x400
-#define FPU_UPWARD       0x800
-#define FPU_TOWARDZERO   0xc00
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpq_class& x, mpq_class& y);
 
-#define FPU_ROUNDING_MASK 0xc00
+namespace std {
 
-#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
-// This MUST be congruent with the definition of ROUND_DIRECT
-#define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpz_class> {
+private:
+  typedef mpz_class Type;
 
-namespace Parma_Polyhedra_Library {
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = true;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tininess_before = false;
+  static const float_round_style round_style = round_toward_zero;
 
-typedef struct
-{
-  unsigned short control_word;
-  unsigned short unused1;
-  unsigned short status_word;
-  unsigned short unused2;
-  unsigned short tags;
-  unsigned short unused3;
-  unsigned int eip;
-  unsigned short cs_selector;
-  unsigned int opcode:11;
-  unsigned int unused4:5;
-  unsigned int data_offset;
-  unsigned short data_selector;
-  unsigned short unused5;
-} ia32_fenv_t;
+  static Type min() {
+    return static_cast<Type>(0);
+  }
 
-inline int
-fpu_get_control() {
-  unsigned short cw;
-  __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
-  return cw;
-}
+  static Type max() {
+    return static_cast<Type>(0);
+  }
 
-inline void
-fpu_set_control(unsigned short cw) {
-  __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
-}
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
 
-inline int
-fpu_get_status() {
-  int sw;
-  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw));
-  return sw;
-}
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
 
-inline void
-fpu_clear_status(unsigned short bits) {
-  /* There is no fldsw instruction */
-  ia32_fenv_t env;
-  __asm__ ("fnstenv %0" : "=m" (env));
-  env.status_word &= ~bits;
-  __asm__ ("fldenv %0" : : "m" (env));
-}
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
 
-inline void
-fpu_clear_exceptions() {
-  __asm__ __volatile__ ("fnclex" : /* No outputs.  */);
-}
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
 
-inline fpu_rounding_direction_type
-fpu_get_rounding_direction() {
-  return fpu_get_control() & FPU_ROUNDING_MASK;
-}
+  static Type denorm_min() {
+    return static_cast<Type>(1);
+  }
+};
 
-inline void
-fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
-  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpq_class> {
+private:
+  typedef mpq_class Type;
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
-  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
-  return 0;
-}
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = false;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tininess_before = false;
+  static const float_round_style round_style = round_toward_zero;
 
-inline void
-fpu_reset_inexact() {
-  fpu_clear_exceptions();
-}
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/mp_std_bits.inlines.hh line 1
+/* Definitions of specializations of std:: functions and methods for
+   multi-precision types.  This will become obsolete when GMP and MPFR
+   will provide the specializations by themselves.
+*/
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
-  fpu_reset_inexact();
-  return fpu_save_rounding_direction(dir);
-}
 
 inline void
-fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
-  fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+swap(mpz_class& x, mpz_class& y) {
+  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
 }
 
-inline int
-fpu_check_inexact() {
-  return (fpu_get_status() & FPU_INEXACT) ? 1 : 0;
+inline void
+swap(mpq_class& x, mpq_class& y) {
+  mpq_swap(x.get_mpq_t(), y.get_mpq_t());
 }
 
-} // namespace Parma_Polyhedra_Library
-// Automatically generated from PPL source file ../src/fpu.defs.hh line 74
-#elif defined(HAVE_FENV_H)
-// Automatically generated from PPL source file ../src/fpu-c99.inlines.hh line 1
-/* C99 Floating point unit related functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/mp_std_bits.defs.hh line 168
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Temp.defs.hh line 1
+/* Temp_* classes declarations.
 */
 
-#ifdef HAVE_FENV_H
-#include <fenv.h>
 
-#ifdef FE_TONEAREST
-#define FPU_TONEAREST FE_TONEAREST
-#endif
-#ifdef FE_UPWARD
-#define FPU_UPWARD FE_UPWARD
-#endif
-#ifdef FE_DOWNWARD
-#define FPU_DOWNWARD FE_DOWNWARD
-#endif
-#ifdef FE_TOWARDZERO
-#define FPU_TOWARDZERO FE_TOWARDZERO
-#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Temp.defs.hh line 28
 
 namespace Parma_Polyhedra_Library {
 
-inline fpu_rounding_direction_type
-fpu_get_rounding_direction() {
-  return fegetround();
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A pool of temporary items of type \p T.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Item {
+public:
+  //! Obtains a refeence to a temporary item.
+  static Temp_Item& obtain();
 
-inline void
-fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
-  fesetround(dir);
-}
+  //! Releases the temporary item \p p.
+  static void release(Temp_Item& p);
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
-  fpu_rounding_direction_type old = fegetround();
-  fesetround(dir);
-  return old;
-}
+  //! Returns a reference to the encapsulated item.
+  T& item();
 
-inline void
-fpu_reset_inexact() {
-  feclearexcept(FE_INEXACT);
-}
+private:
+  //! The encapsulated item.
+  T item_;
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
-  fpu_reset_inexact();
-  return fpu_save_rounding_direction(dir);
-}
+  //! Pointer to the next item in the free list.
+  Temp_Item* next;
 
-inline void
-fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
-  fesetround(w);
-}
+  //! Head of the free list.
+  static Temp_Item* free_list_head;
 
-inline int
-fpu_check_inexact() {
-  return fetestexcept(FE_INEXACT) != 0;
-}
+  //! Default constructor.
+  Temp_Item();
 
-} // namespace Parma_Polyhedra_Library
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Item(const Temp_Item&);
 
-#endif // !defined(HAVE_FENV_H)
-// Automatically generated from PPL source file ../src/fpu.defs.hh line 76
-#elif defined(HAVE_IEEEFP_H)						\
-  && (defined(__sparc)							\
-      || defined(sparc)							\
-      || defined(__sparc__))
-// Automatically generated from PPL source file ../src/fpu-sparc.inlines.hh line 1
-/* SPARC floating point unit related functions.
-*/
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Item& operator=(const Temp_Item&);
+};
 
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An holder for a reference to a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Reference_Holder {
+public:
+  //! Constructs an holder holding \p p.
+  Temp_Reference_Holder(Temp_Item<T>& p);
 
-#define FPU_TONEAREST ((int) FP_RN)
-#define FPU_UPWARD ((int) FP_RP)
-#define FPU_DOWNWARD ((int) FP_RM)
-#define FPU_TOWARDZERO ((int) FP_RZ)
+  //! Destructor.
+  ~Temp_Reference_Holder();
 
-namespace Parma_Polyhedra_Library {
+  //! Returns a reference to the held item.
+  T& item();
 
-inline fpu_rounding_direction_type
-fpu_get_rounding_direction() {
-  return fpgetround();
-}
+private:
+  //! The held item, encapsulated.
+  Temp_Item<T>& held;
+};
 
-inline void
-fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
-  fpsetround((fp_rnd) dir);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An (fake) holder for the value of a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Value_Holder {
+public:
+  //! Constructs a fake holder.
+  Temp_Value_Holder();
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
-  return fpsetround((fp_rnd) dir);
-}
+  //! Returns the value of the held item.
+  T item();
 
-inline void
-fpu_reset_inexact() {
-  fp_except except = fpgetmask();
-  except &= ~FP_X_IMP;
-  fpsetmask(except);
-}
+private:
+  //! The held item.
+  T item_;
+};
 
-inline fpu_rounding_control_word_type
-fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
-  fpu_reset_inexact();
-  return fpu_save_rounding_direction((fp_rnd) dir);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for handling temporaries with a global free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Temp_From_Free_List {
+  //! The type of the temporaries.
+  typedef T& type;
 
-inline void
-fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
-  fpsetround((fp_rnd) w);
-}
+  //! The type of the holder.
+  typedef Temp_Reference_Holder<T> holder_type;
 
-inline int
-fpu_check_inexact() {
-  return (fpgetmask() & FP_X_IMP) ? 1 : 0;
-}
+  //! Obtain the holder for a new temporary.
+  static holder_type obtain_holder();
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for handling temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Temp_From_Local_Variable {
+  //! The type of the temporaries.
+  typedef T type;
+
+  //! The type of the holder.
+  typedef Temp_Value_Holder<T> holder_type;
+
+  //! Obtain the holder for a new temporary.
+  static holder_type obtain_holder();
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for the efficient handling of temporaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+class Dirty_Temp;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with a free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<Slow_Copy<T>::value>::type>
+  : public Temp_From_Free_List<T> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<!Slow_Copy<T>::value>::type>
+  : public Temp_From_Local_Variable<T> {
+};
 
 } // namespace Parma_Polyhedra_Library
 
-#endif // !defined(HAVE_IEEEFP_H)
-// Automatically generated from PPL source file ../src/fpu.defs.hh line 81
-#else
-// Automatically generated from PPL source file ../src/fpu-none.inlines.hh line 1
-/* Null floating point unit related functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Temp.inlines.hh line 1
+/* Temp_* classes implementation: inline functions.
 */
 
-#include <stdexcept>
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Temp.inlines.hh line 27
 
 namespace Parma_Polyhedra_Library {
 
-inline int
-fpu_get_rounding_direction() {
-  throw std::logic_error("PPL::fpu_get_rounding_direction():"
-			 " cannot control the FPU");
+template <typename T>
+inline
+Temp_Item<T>::Temp_Item()
+  : item_() {
 }
 
-inline void
-fpu_set_rounding_direction(int dir) {
-  throw std::logic_error("PPL::fpu_set_rounding_direction():"
-			 " cannot control the FPU");
+template <typename T>
+inline T&
+Temp_Item<T>::item() {
+    return item_;
 }
 
-inline int
-fpu_save_rounding_direction(int dir) {
-  throw std::logic_error("PPL::fpu_save_rounding_direction():"
-			 " cannot control the FPU");
+template <typename T>
+inline Temp_Item<T>&
+Temp_Item<T>::obtain() {
+  if (free_list_head != 0) {
+    Temp_Item* p = free_list_head;
+    free_list_head = free_list_head->next;
+    return *p;
+  }
+  else
+    return *new Temp_Item();
 }
 
+template <typename T>
 inline void
-fpu_reset_inexact() {
-  throw std::logic_error("PPL::fpu_reset_inexact():"
-			 " cannot control the FPU");
+Temp_Item<T>::release(Temp_Item& p) {
+  p.next = free_list_head;
+  free_list_head = &p;
 }
 
-inline int
-fpu_save_rounding_direction_reset_inexact(int dir) {
-  throw std::logic_error("PPL::fpu_save_rounding_direction_reset_inexact():"
-			 " cannot control the FPU");
+template <typename T>
+inline
+Temp_Reference_Holder<T>::Temp_Reference_Holder(Temp_Item<T>& p)
+  : held(p) {
 }
 
-inline void
-fpu_restore_rounding_direction(int dir) {
-  throw std::logic_error("PPL::fpu_restore_rounding_direction():"
-			 " cannot control the FPU");
+template <typename T>
+inline
+Temp_Reference_Holder<T>::~Temp_Reference_Holder() {
+  Temp_Item<T>::release(held);
 }
 
-inline int
-fpu_check_inexact() {
-  throw std::logic_error("PPL::fpu_check_inexact():"
-			 " cannot control the FPU");
+template <typename T>
+inline T&
+Temp_Reference_Holder<T>::item() {
+  return held.item();
 }
 
-} // namespace Parma_Polyhedra_Library
-// Automatically generated from PPL source file ../src/fpu.defs.hh line 83
-#endif
-
-// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 28
+template <typename T>
+inline
+Temp_Value_Holder<T>::Temp_Value_Holder() {
+}
 
-namespace Parma_Polyhedra_Library {
+template <typename T>
+inline T
+Temp_Value_Holder<T>::item() {
+  return item_;
+}
 
-//! Rounding directions for arithmetic computations.
-/*! \ingroup PPL_CXX_interface */
-enum Rounding_Dir {
-  /*! \hideinitializer
-    Round toward \f$-\infty\f$.
-  */
-  ROUND_DOWN = FPU_DOWNWARD,
+template <typename T>
+inline typename Temp_From_Free_List<T>::holder_type
+Temp_From_Free_List<T>::obtain_holder() {
+  return Temp_Reference_Holder<T>(Temp_Item<T>::obtain());
+}
 
-  /*! \hideinitializer
-    Round toward \f$+\infty\f$.
-  */
-  ROUND_UP = FPU_UPWARD,
+template <typename T>
+inline typename Temp_From_Local_Variable<T>::holder_type
+Temp_From_Local_Variable<T>::obtain_holder() {
+  return Temp_Value_Holder<T>();
+}
 
-  /*! \hideinitializer
-    Rounding is delegated to lower level. Result info is evaluated lazily.
-  */
-  ROUND_IGNORE = -1,
-  ROUND_NATIVE = ROUND_IGNORE,
+} // namespace Parma_Polyhedra_Library
 
-  /*! \hideinitializer
-    Rounding is not needed: client code must ensure the operation is exact.
-  */
-  ROUND_NOT_NEEDED = -2,
+#define DIRTY_TEMP(T, id)						\
+  typename Parma_Polyhedra_Library::Dirty_Temp<T>::holder_type holder ## id = \
+    Parma_Polyhedra_Library::Dirty_Temp<T>::obtain_holder();		\
+  typename Parma_Polyhedra_Library::Dirty_Temp<T>::type id =		\
+    holder ## id.item()
 
-  ROUND_DIRECT = ROUND_UP,
-  ROUND_INVERSE = ROUND_DOWN
-};
+#define DIRTY_TEMP0(T, id)						\
+  Parma_Polyhedra_Library::Dirty_Temp<T>::holder_type holder ## id =	\
+    Parma_Polyhedra_Library::Dirty_Temp<T>::obtain_holder();		\
+  Parma_Polyhedra_Library::Dirty_Temp<T>::type id = holder ## id.item()
 
-/*! \brief
-  Returns the inverse rounding mode of \p dir,
-  <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Temp.templates.hh line 1
+/* Temp_* classes implementation: non-inline template members.
 */
-Rounding_Dir inverse(Rounding_Dir dir);
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Temp_Item<T>* Temp_Item<T>::free_list_head = 0;
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Rounding_Dir.inlines.hh line 1
-/* Inline functions operating on enum Rounding_Dir values.
-*/
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Temp.defs.hh line 159
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient_traits_template.hh line 1
 
-// Automatically generated from PPL source file ../src/Rounding_Dir.inlines.hh line 27
 
 namespace Parma_Polyhedra_Library {
 
-/*! \relates Parma_Polyhedra_Library::Rounding_Dir */
-inline Rounding_Dir
-inverse(Rounding_Dir dir) {
-  switch (dir) {
-  case ROUND_UP:
-    return ROUND_DOWN;
-  case ROUND_DOWN:
-    return ROUND_UP;
-  case ROUND_IGNORE:
-    return ROUND_IGNORE;
-  default:
-    assert(false);
-    return ROUND_IGNORE;
-  }
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 68
-
-
-// Automatically generated from PPL source file ../src/Numeric_Format.defs.hh line 1
-/* Numeric format.
-*/
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.types.hh line 1
 
 
-// Automatically generated from PPL source file ../src/Numeric_Format.defs.hh line 28
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.types.hh line 16
 
 namespace Parma_Polyhedra_Library {
 
-class Numeric_Format {
-};
+struct Checked_Number_Default_Policy;
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy = Checked_Number_Default_Policy>
+class Checked_Number;
 
 } // namespace Parma_Polyhedra_Library
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.types.hh line 1
 
-// Automatically generated from PPL source file ../src/checked.defs.hh line 30
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.types.hh line 16
+#include <gmpxx.h>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.types.hh line 18
 
 namespace Parma_Polyhedra_Library {
 
-namespace Checked {
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+  \brief
+  Unbounded integers as provided by the GMP library.
+
+  \ingroup PPL_CXX_interface
+  GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+  defined in the C++ interface of the GMP library.
+  For more information, see <CODE>http://www.swox.com/gmp/</CODE>
+*/
+typedef mpz_class GMP_Integer;
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A policy checking for overflows.
+//! Coefficient traits specialization for unbounded integers.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Check_Overflow_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 0;
-  static const int handle_infinity = 0;
-  static const int convertible = 1;
-  static const int fpu_check_inexact = 0;
-  static const int check_nan_args = 1;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+  //! The type used for references to const unbounded integers.
+  typedef const GMP_Integer& const_reference;
 };
 
-// It is a pity that function partial specialization is not permitted
-// by C++.  To (partly) overcome this limitation, we use class
-// encapsulated functions and partial specialization of containing
-// classes.
+} // namespace Parma_Polyhedra_Library
 
-#define FUNCTION_CLASS(name) name ## _function_struct
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.types.hh line 1
 
-#define DECLARE_FUN1_0_0(name, ret_type, qual, type) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(qual type& arg) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(arg); \
-}
 
-#define DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(qual type& arg, after1 a1) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1); \
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.defs.hh line 1
+/* Checked_Number class declaration.
+*/
 
-#define DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(qual type& arg, after1 a1, after2 a2) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2); \
-}
 
-#define DECLARE_FUN1_0_3(name, ret_type, qual, type, after1, after2, after3) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(qual type& arg, after1 a1, after2 a2, after3 a3) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2, a3); \
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked.defs.hh line 1
+/* Abstract checked arithmetic function container
+*/
 
-#define DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(before1 b1, qual type& arg, after1 a1) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1); \
-}
 
-#define DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, after1, after2) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(before1 b1, qual type& arg, after1 a1, after2 a2) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1, a2); \
-}
+#include <iostream>
+#include <gmpxx.h>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rounding_Dir.defs.hh line 1
+/* Declaration of Rounding_Dir and related functions.
+*/
 
-#define DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, after1, after2) \
-template <typename Policy, typename type> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type> \
-inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
-  return FUNCTION_CLASS(name)<Policy, type>::function(b1, b2, arg, a1, a2); \
-}
 
-#define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
-template <typename Policy, typename type1, typename type2> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2> \
-inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2); \
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Result.defs.hh line 1
+/* Result enum and supporting function declarations.
+*/
 
-#define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
-template <typename Policy, typename type1, typename type2> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2> \
-inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1); \
-}
 
-#define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
-template <typename Policy, typename type1, typename type2> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2> \
-inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1, a2); \
-}
+namespace Parma_Polyhedra_Library {
 
-#define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
-template <typename Policy, typename type1, typename type2, typename type3> \
-struct FUNCTION_CLASS(name); \
-template <typename Policy, typename type1, typename type2, typename type3> \
-inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
-  return FUNCTION_CLASS(name)<Policy, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
-}
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
 
-#define DECLARE_FUN5_0_1(name, ret_type,				\
-			 qual1, type1, qual2, type2, qual3, type3,	\
-			 qual4, type4, qual5, type5,			\
-			 after1)					\
-template <typename Policy,						\
-	  typename type1, typename type2, typename type3,		\
-	  typename type4, typename type5>				\
-struct FUNCTION_CLASS(name);						\
-template <typename Policy,						\
-	  typename type1, typename type2, typename type3,		\
-	  typename type4, typename type5>				\
-inline ret_type name(qual1 type1& arg1, qual2 type2& arg2,		\
-		     qual3 type3& arg3, qual4 type4& arg4,		\
-		     qual5 type5& arg5,	after1 a1) {			\
-  return FUNCTION_CLASS(name)<Policy, type1, type2, type3, type4, type5> \
-    ::function(arg1, arg2, arg3, arg4, arg5, a1);			\
-}
+  //! \hideinitializer Ordinary result class.
+  VC_NORMAL = 0,
 
-#define SPECIALIZE_FUN1_0_0(name, suf, ret_type, qual, type) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(qual type& arg) { \
-    return name ## _ ## suf<Policy>(arg); \
-  } \
-};
+  //! \hideinitializer The computed result is inexact and rounded up.
+  V_LT = 1,
 
-#define SPECIALIZE_FUN1_0_1(name, suf, ret_type, qual, type, after1) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(qual type& arg, after1 a1) { \
-    return name ## _ ## suf<Policy>(arg, a1); \
-  } \
-};
+  //! \hideinitializer The computed result is inexact and rounded down.
+  V_GT = 2,
 
-#define SPECIALIZE_FUN1_0_2(name, suf, ret_type, qual, type, after1, after2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(arg, a1, a2); \
-  } \
-};
+  //! \hideinitializer The computed result is exact.
+  V_EQ = 4,
 
-#define SPECIALIZE_FUN1_0_3(name, suf, ret_type, qual, type, after1, after2, after3) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
-    return name ## _ ## suf<Policy>(arg, a1, a2, a3); \
-  } \
-};
+  //! \hideinitializer The computed result is inexact.
+  V_NE = V_LT | V_GT,
 
-#define SPECIALIZE_FUN1_1_1(name, suf, ret_type, before1, qual, type, after1) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
-    return name ## _ ## suf<Policy>(b1, arg, a1); \
-  } \
-};
+  //! \hideinitializer The computed result may be inexact and rounded up.
+  V_LE = V_EQ | V_LT,
 
-#define SPECIALIZE_FUN1_1_2(name, suf, ret_type, before1, qual, type, after1, after2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(b1, arg, a1, a2); \
-  } \
-};
+  //! \hideinitializer The computed result may be inexact and rounded down.
+  V_GE = V_EQ | V_GT,
 
-#define SPECIALIZE_FUN1_2_2(name, suf, ret_type, before1, before2, qual, type, after1, after2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type> { \
-  static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(b1, b2, arg, a1, a2); \
-  } \
-};
+  //! \hideinitializer The computed result may be inexact.
+  V_LGE = V_LT | V_EQ | V_GT,
 
-#define SPECIALIZE_FUN2_0_0(name, suf, ret_type, qual1, type1, qual2, type2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
-  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
-    return name ## _ ## suf<Policy>(arg1, arg2); \
-  } \
-};
+  //! \hideinitializer Negative infinity unrepresentable result class.
+  VC_MINUS_INFINITY = 16,
 
-#define SPECIALIZE_FUN2_0_1(name, suf, ret_type, qual1, type1, qual2, type2, after1) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
-  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
-    return name ## _ ## suf<Policy>(arg1, arg2, a1); \
-  } \
-};
+  //! \hideinitializer A negative overflow occurred.
+  V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT,
 
-#define SPECIALIZE_FUN2_0_2(name, suf, ret_type, qual1, type1, qual2, type2, after1, after2) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
-  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
-    return name ## _ ## suf<Policy>(arg1, arg2, a1, a2); \
-  } \
-};
+  //! \hideinitializer Positive infinity unrepresentable result class.
+  VC_PLUS_INFINITY = 32,
 
-#define SPECIALIZE_FUN3_0_1(name, suf, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
-template <typename Policy> \
-struct FUNCTION_CLASS(name) <Policy, type1, type2, type3> { \
-  static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
-    return name ## _ ## suf<Policy>(arg1, arg2, arg3, a1); \
-  } \
-};
+  //! \hideinitializer A positive overflow occurred.
+  V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT,
 
-#define SPECIALIZE_FUN5_0_1(name, suf, ret_type,			\
-			    qual1, type1, qual2, type2, qual3, type3,	\
-			    qual4, type4, qual5, type5, after1)		\
-template <typename Policy>						\
-struct FUNCTION_CLASS(name) <Policy,					\
-			     type1, type2, type3, type4, type5> {	\
-  static inline Result							\
-  function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3,	\
-	   qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) {		\
-    return name ## _ ## suf<Policy>(arg1, arg2, arg3, arg4, arg5, a1);	\
-  }									\
-};
+  //! \hideinitializer Not a number result class.
+  VC_NAN = 48,
 
-#define nonconst
+  //! \hideinitializer Converting from unknown string.
+  V_CVT_STR_UNK = 49,
 
-#define SPECIALIZE_COPY(suf, Type) \
-  SPECIALIZE_FUN2_0_0(copy, suf, void, nonconst, Type, const, Type)
-#define SPECIALIZE_SGN(suf, From) \
-  SPECIALIZE_FUN1_0_0(sgn, suf, Result, const, From)
-#define SPECIALIZE_CMP(suf, Type1, Type2) \
-  SPECIALIZE_FUN2_0_0(cmp, suf, Result, const, Type1, const, Type2)
-#define SPECIALIZE_SET_SPECIAL(suf, Type) \
-  SPECIALIZE_FUN1_0_1(set_special, suf, Result, nonconst, Type, Result)
-#define SPECIALIZE_CLASSIFY(suf, Type) \
-  SPECIALIZE_FUN1_0_3(classify, suf, Result, const, Type, bool, bool, bool)
-#define SPECIALIZE_IS_NAN(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_nan, suf, bool, const, Type)
-#define SPECIALIZE_IS_MINF(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_minf, suf, bool, const, Type)
-#define SPECIALIZE_IS_PINF(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_pinf, suf, bool, const, Type)
-#define SPECIALIZE_IS_INT(suf, Type) \
-  SPECIALIZE_FUN1_0_0(is_int, suf, bool, const, Type)
-#define SPECIALIZE_CONSTRUCT(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(construct, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_ASSIGN(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(assign, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_NEG(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(neg, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_ABS(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(abs, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_SQRT(suf, To, From) \
-  SPECIALIZE_FUN2_0_1(sqrt, suf, Result, nonconst, To, const, From, Rounding_Dir)
-#define SPECIALIZE_ADD(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(add, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_SUB(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(sub, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_MUL(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_DIV(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(div, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_REM(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(rem, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_MUL2EXP(suf, To, From) \
-  SPECIALIZE_FUN2_0_2(mul2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
-#define SPECIALIZE_DIV2EXP(suf, To, From) \
-  SPECIALIZE_FUN2_0_2(div2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
-#define SPECIALIZE_ADD_MUL(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(add_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_SUB_MUL(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(sub_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_GCD(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(gcd, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_GCDEXT(suf, To1, From1, From2, To2, To3)		\
-  SPECIALIZE_FUN5_0_1(gcdext, suf, Result, nonconst, To1,		\
-		      const, From1, const, From2, nonconst, To2, nonconst, To3, Rounding_Dir)
-#define SPECIALIZE_LCM(suf, To, From1, From2) \
-  SPECIALIZE_FUN3_0_1(lcm, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-#define SPECIALIZE_INPUT(suf, Type) \
-  SPECIALIZE_FUN1_0_2(input, suf, Result, nonconst, Type, std::istream&, Rounding_Dir)
-#define SPECIALIZE_OUTPUT(suf, Type) \
-  SPECIALIZE_FUN1_1_2(output, suf, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+  //! \hideinitializer Dividing by zero.
+  V_DIV_ZERO = 50,
 
+  //! \hideinitializer Adding two infinities having opposite signs.
+  V_INF_ADD_INF = 51,
 
-DECLARE_FUN2_0_0(copy,        void, nonconst, Type1, const, Type2)
-DECLARE_FUN1_0_0(sgn,         Result, const, From)
-DECLARE_FUN2_0_0(cmp,         Result, const, Type1, const, Type2)
-DECLARE_FUN1_0_1(set_special, Result, nonconst, Type, Result)
-DECLARE_FUN1_0_3(classify,    Result, const, Type, bool, bool, bool)
-DECLARE_FUN1_0_0(is_nan,      bool, const, Type)
-DECLARE_FUN1_0_0(is_minf,     bool, const, Type)
-DECLARE_FUN1_0_0(is_pinf,     bool, const, Type)
-DECLARE_FUN1_0_0(is_int,      bool, const, Type)
-DECLARE_FUN2_0_1(construct,   Result, nonconst, To, const, From, Rounding_Dir)
-DECLARE_FUN2_0_1(assign,      Result, nonconst, To, const, From, Rounding_Dir)
-DECLARE_FUN2_0_1(neg,         Result, nonconst, To, const, From, Rounding_Dir)
-DECLARE_FUN2_0_1(abs,         Result, nonconst, To, const, From, Rounding_Dir)
-DECLARE_FUN2_0_1(sqrt,        Result, nonconst, To, const, From, Rounding_Dir)
-DECLARE_FUN3_0_1(add,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN3_0_1(sub,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN3_0_1(mul,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN3_0_1(div,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN3_0_1(rem,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN2_0_2(mul2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
-DECLARE_FUN2_0_2(div2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
-DECLARE_FUN3_0_1(add_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN3_0_1(sub_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN3_0_1(gcd,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN5_0_1(gcdext,      Result, nonconst, To1, const, From1, const, From2,
-		                      nonconst, To2, nonconst, To3, Rounding_Dir)
-DECLARE_FUN3_0_1(lcm,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
-DECLARE_FUN1_0_2(input,       Result, nonconst, Type, std::istream&, Rounding_Dir)
-DECLARE_FUN1_1_2(output,      Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+  //! \hideinitializer Dividing two infinities.
+  V_INF_DIV_INF = 52,
 
-template <typename Policy, typename To>
-Result round(To& to, Result r, Rounding_Dir dir);
+  //! \hideinitializer Taking the modulus of an infinity.
+  V_INF_MOD = 53,
 
-Result input_mpq(mpq_class& to, std::istream& is);
+  //! \hideinitializer Multiplying an infinity by zero.
+  V_INF_MUL_ZERO = 54,
 
-} // namespace Checked
+  //! \hideinitializer Subtracting two infinities having the same sign.
+  V_INF_SUB_INF = 55,
 
-struct Minus_Infinity {
-};
+  //! \hideinitializer Computing a remainder modulo zero.
+  V_MOD_ZERO = 56,
 
-struct Plus_Infinity {
-};
+  //! \hideinitializer Taking the square root of a negative number.
+  V_SQRT_NEG = 57,
+
+  //! \hideinitializer Unknown result due to intermediate negative overflow.
+  V_UNKNOWN_NEG_OVERFLOW = 58,
+
+  //! \hideinitializer Unknown result due to intermediate positive overflow.
+  V_UNKNOWN_POS_OVERFLOW = 59,
+
+  //! \hideinitializer Unordered comparison.
+  V_UNORD_COMP = 60,
 
-struct Not_A_Number {
+  VC_MASK = 48
 };
 
-extern Minus_Infinity MINUS_INFINITY;
-extern Plus_Infinity PLUS_INFINITY;
-extern Not_A_Number NOT_A_NUMBER;
+//! Extracts the class part of \p r (normal, minus/plus infinity or nan).
+Result classify(Result r);
+
+//! Returns <CODE>true</CODE> if and only if the class or \p r is not normal.
+bool is_special(Result r);
 
 } // namespace Parma_Polyhedra_Library
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Result.inlines.hh line 1
+/* Result supporting functions implementation: inline functions.
+*/
 
-#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
 
-// Automatically generated from PPL source file ../src/checked.inlines.hh line 1
-/* Abstract checked arithmetic functions: fall-backs.
-*/
+namespace Parma_Polyhedra_Library {
 
-// Automatically generated from PPL source file ../src/globals.types.hh line 1
+/*! \relates Parma_Polyhedra_Library::Result */
+inline Result
+classify(Result r) {
+  return static_cast<Result>(r & VC_MASK);
+}
 
+/*! \relates Parma_Polyhedra_Library::Result */
+inline bool
+is_special(Result r) {
+  return classify(r) != VC_NORMAL;
+}
 
-#include <cstddef>
+} // namespace Parma_Polyhedra_Library
 
-namespace Parma_Polyhedra_Library {
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Result.defs.hh line 119
 
-//! An unsigned integral type for representing space dimensions.
-/*! \ingroup PPL_CXX_interface */
-typedef size_t dimension_type;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.defs.hh line 1
+/* Floating point unit related functions.
+*/
 
-//! An unsigned integral type for representing memory size in bytes.
-/*! \ingroup PPL_CXX_interface */
-typedef size_t memory_size_type;
 
-//! Kinds of degenerate abstract elements.
-/*! \ingroup PPL_CXX_interface */
-enum Degenerate_Element {
-  //! The universe element, i.e., the whole vector space.
-  UNIVERSE,
-  //! The empty element, i.e., the empty set.
-  EMPTY
-};
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.types.hh line 1
 
-//! Relation symbols.
-/*! \ingroup PPL_CXX_interface */
-enum Relation_Symbol {
-  //! Less than.
-  LESS_THAN,
-  //! Less than or equal to.
-  LESS_THAN_OR_EQUAL,
-  //! Equal to.
-  EQUAL,
-  //! Greater than or equal to.
-  GREATER_THAN_OR_EQUAL,
-  //! Greater than.
-  GREATER_THAN
-};
 
-//! Complexity pseudo-classes.
-/*! \ingroup PPL_CXX_interface */
-enum Complexity_Class {
-  //! Worst-case polynomial complexity.
-  POLYNOMIAL_COMPLEXITY,
-  //! Worst-case exponential complexity but typically polynomial behavior.
-  SIMPLEX_COMPLEXITY,
-  //! Any complexity.
-  ANY_COMPLEXITY
-};
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
 
-//! Possible optimization modes.
-/*! \ingroup PPL_CXX_interface */
-enum Optimization_Mode {
-  //! Minimization is requested.
-  MINIMIZATION,
-  //! Maximization is requested.
-  MAXIMIZATION
-};
+namespace Parma_Polyhedra_Library {
+
+enum fpu_rounding_direction_type {};
+enum fpu_rounding_control_word_type {};
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/checked.inlines.hh line 25
-#include <cassert>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.defs.hh line 27
 
 namespace Parma_Polyhedra_Library {
 
-namespace Checked {
+//! Initializes the FPU control functions.
+void
+fpu_initialize_control_functions();
 
-template <typename Policy, typename Type>
-struct FUNCTION_CLASS(construct)<Policy, Type, Type> {
-  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
-    new (&to) Type(from);
-    return V_EQ;
-  }
-};
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
 
-template <typename Policy, typename To, typename From>
-struct FUNCTION_CLASS(construct) {
-  static inline Result function(To& to, const From& from, Rounding_Dir dir) {
-    new (&to) To();
-    return assign<Policy>(to, from, dir);
-  }
-};
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
 
-template <typename Policy, typename Type>
-struct FUNCTION_CLASS(assign)<Policy, Type, Type> {
-  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
-    to = from;
-    return V_EQ;
-  }
-};
+/*! \brief
+  Sets the FPU rounding direction to \p dir and returns the rounding
+  control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
 
-template <typename Policy, typename Type>
-inline void
-copy_generic(Type& to, const Type& from) {
-  to = from;
-}
+/*! \brief
+  Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+  computation</EM> status, and returns the rounding control word
+  previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
 
-template <typename Policy, typename To, typename From>
-inline Result
-abs_generic(To& to, const From& from, Rounding_Dir dir) {
-  if (from < 0)
-    return neg<Policy>(to, from, dir);
-  to = from;
-  return V_EQ;
-}
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
 
-inline Result
-neg(Result r) {
-  assert(!is_special(r));
-  Result ret = static_cast<Result>(r & V_EQ);
-  if (r & V_LT)
-    ret = static_cast<Result>(ret | V_GT);
-  if (r & V_GT)
-    ret = static_cast<Result>(ret | V_LT);
-  return ret;
-}
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
 
-inline Result
-add(Result r1, Result r2) {
-  assert(!is_special(r1));
-  assert(!is_special(r2));
-  if (r1 == V_EQ)
-    return r2;
-  if (r2 == V_EQ)
-    return r1;
-  if (((r1 & V_LT) && (r2 & V_GT))
-      || ((r1 & V_GT) && (r2 & V_LT)))
-    return V_LGE;
-  return static_cast<Result>((((r1 & r2) & V_EQ) ? V_EQ : 0) |
-			       (r1 & (V_LT | V_GT)));
-}
+/*! \brief
+  Queries the <EM>inexact computation</EM> status.
 
-inline Result
-sub(Result r1, Result r2) {
-  return add(r1, neg(r2));
-}
+  Returns 0 if the computation was definitely exact, 1 if it was
+  definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
 
-template <typename Policy, typename To, typename From>
-inline void
-gcd_exact_noabs(To& to, const From& x, const From& y) {
-  To nx = x;
-  To ny = y;
-  To rm;
-  while (ny != 0) {
-    /* The following is derived from the assumption that x % y
-       is always representable. This is true for both native integers
-       and iec559 floating point numbers */
-    rem<Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
-    nx = ny;
-    ny = rm;
-  }
-  to = nx;
-}
+} // namespace Parma_Polyhedra_Library
 
-template <typename Policy, typename To, typename From1, typename From2>
-inline Result
-gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  gcd_exact_noabs<Policy>(to, x, y);
-  return abs<Policy>(to, to, dir);
-}
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu-ia32.inlines.hh line 1
+/* IA-32 floating point unit inline related functions.
+*/
 
-template <typename Policy, typename To1,
-	  typename From1, typename From2, typename To2, typename To3>
-inline Result
-gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
-	     Rounding_Dir dir) {
-  if (y == 0) {
-    if (x == 0) {
-      s = 0;
-      t = 1;
-      return V_EQ;
-    }
-    else {
-      if (x < 0)
-	s = -1;
-      else
-	s = 1;
-      t = 0;
-      return abs<Policy>(to, x, dir);
-    }
-  }
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu-ia32.inlines.hh line 24
+#include <csetjmp>
+#include <csignal>
 
-  s = 1;
-  t = 0;
-  bool negative_x = x < 0;
-  bool negative_y = y < 0;
+#define FPU_INVALID       0x01
+#define FPU_DIVBYZERO     0x04
+#define FPU_OVERFLOW      0x08
+#define FPU_UNDERFLOW     0x10
+#define FPU_INEXACT       0x20
 
-  Result r;
-  r = abs<Policy>(to, x, dir);
-  if (r != V_EQ)
-    return r;
+#define FPU_ALL_EXCEPT \
+  (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
 
-  From2 ay;
-  r = abs<Policy>(ay, y, dir);
-  if (r != V_EQ)
-    return r;
+#define FPU_TONEAREST     0
+#define FPU_DOWNWARD      0x400
+#define FPU_UPWARD        0x800
+#define FPU_TOWARDZERO    0xc00
 
-  // If COPY_GMP is defined then s is favoured when the absolute
-  // values of the given numbers are equal.  For instance if x and y
-  // are both 5 then s will be 1 and t will be 0, instead of the other
-  // way round.  This is to match the behaviour of GMP.
-#define COPY_GMP
-#ifdef COPY_GMP
-  if (to == ay)
-    goto sign_check;
-#endif
+#define FPU_ROUNDING_MASK 0xc00
 
-  {
-    To2 v1 = 0;
-    To3 v2 = 1;
-    To1 v3 = static_cast<To1>(ay);
-    while (true) {
-      To1 q = to / v3;
-      // Remainder, next candidate GCD.
-      To1 t3 = to - q*v3;
-      To2 t1 = s - static_cast<To2>(q)*v1;
-      To3 t2 = t - static_cast<To3>(q)*v2;
-      s = v1;
-      t = v2;
-      to = v3;
-      if (t3 == 0)
-	break;
-      v1 = t1;
-      v2 = t2;
-      v3 = t3;
-    }
-  }
+#define SSE_INEXACT       0x20
 
-#ifdef COPY_GMP
- sign_check:
-#endif
-  if (negative_x) {
-    r = neg<Policy>(s, s, dir);
-    if (r != V_EQ)
-      return r;
-  }
-  if (negative_y)
-    return neg<Policy>(t, t, dir);
-  return V_EQ;
-}
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+#define PPL_SSE_CONTROL_DEFAULT_BASE 0x1f80
 
-template <typename Policy, typename To, typename From1, typename From2>
-inline Result
-lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (x == 0 || y == 0) {
-    to = 0;
-    return V_EQ;
-  }
-  To nx, ny;
-  Result r;
-  r = abs<Policy>(nx, x, dir);
-  if (r != V_EQ)
-    return r;
-  r = abs<Policy>(ny, y, dir);
-  if (r != V_EQ)
-    return r;
-  To gcd;
-  gcd_exact_noabs<Policy>(gcd, nx, ny);
-  /* The following is derived from the assumption that x / gcd(x, y)
-     is always representable. This is true for both native integers
-     and iec559 floating point numbers */
-  div<Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
-  return mul<Policy>(to, to, ny, dir);
-}
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+#define PPL_SSE_CONTROL_DEFAULT (PPL_SSE_CONTROL_DEFAULT_BASE | (FPU_UPWARD << 3))
 
-template <typename Policy, typename Type>
-inline Result
-sgn_generic(const Type& x) {
-  if (x > 0)
-    return V_GT;
-  if (x == 0)
-    return V_EQ;
-  return V_LT;
-}
+namespace Parma_Polyhedra_Library {
 
-template <typename Policy, typename Type>
-inline Result
-cmp_generic(const Type& x, const Type& y) {
-  if (x > y)
-    return V_GT;
-  if (x < y)
-    return V_LT;
-  return V_EQ;
-}
+typedef struct {
+  unsigned short control_word;
+  unsigned short unused1;
+  unsigned short status_word;
+  unsigned short unused2;
+  unsigned short tags;
+  unsigned short unused3;
+  unsigned int eip;
+  unsigned short cs_selector;
+  unsigned int opcode:11;
+  unsigned int unused4:5;
+  unsigned int data_offset;
+  unsigned short data_selector;
+  unsigned short unused5;
+} ia32_fenv_t;
 
-template <typename Policy, typename Type>
-inline Result
-input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
-  mpq_class q;
-  Result r = input_mpq(q, is);
-  if (r == VC_MINUS_INFINITY)
-    return assign<Policy>(to, MINUS_INFINITY, dir);
-  if (r == VC_PLUS_INFINITY)
-    return assign<Policy>(to, PLUS_INFINITY, dir);
-  if (r == V_EQ)
-    return assign<Policy>(to, q, dir);
-  return set_special<Policy>(to, r);
+inline int
+fpu_get_control() {
+  unsigned short cw;
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw) : : "memory");
+  return cw;
 }
 
-template <typename T>
-inline memory_size_type
-external_memory_in_bytes(T) {
-  return 0;
+inline void
+fpu_set_control(int c) {
+  unsigned short cw = static_cast<unsigned short>(c);
+  __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw) : "memory");
 }
 
-template <typename T>
-inline memory_size_type
-total_memory_in_bytes(T& x) {
-  return sizeof(x) + external_memory_in_bytes(x);
+inline int
+fpu_get_status() {
+  unsigned short sw;
+  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw) : : "memory");
+  return sw;
 }
 
-} // namespace Checked
+inline void
+fpu_clear_status(unsigned short bits) {
+  /* There is no fldsw instruction */
+  ia32_fenv_t env;
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (env));
+  env.status_word = static_cast<unsigned short>(env.status_word & ~bits);
+  __asm__ __volatile__ ("fldenv %0" : : "m" (env) : "memory");
+}
 
-} // namespace Parma_Polyhedra_Library
-// Automatically generated from PPL source file ../src/checked_int.inlines.hh line 1
-/* Specialized "checked" functions for native integer numbers.
-*/
+inline void
+fpu_clear_exceptions() {
+  __asm__ __volatile__ ("fnclex" : /* No outputs.  */ : : "memory");
+}
 
+#if PPL_FPMATH_MAY_USE_SSE
+inline void
+sse_set_control(unsigned int cw) {
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&cw) : "memory");
+}
 
-// Automatically generated from PPL source file ../src/Limits.hh line 1
-/* Limits for native integer types.
-*/
+inline unsigned int
+sse_get_control() {
+  unsigned int cw;
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory");
+  return cw;
+}
+#endif
 
+inline void
+fpu_initialize_control_functions() {
+#if PPL_FPMATH_MAY_USE_SSE
+  extern void detect_sse_unit();
+  detect_sse_unit();
+#endif
+}
 
-#include <climits>
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fpu_get_control() & FPU_ROUNDING_MASK);
+}
 
-// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
-// C99 is not yet included into the C++ standard.
-// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
-// Some compilers (such as Comeau C++ up to and including version 4.3.3)
-// define nothing.  In this last case we make a reasonable guess.
-#ifndef LLONG_MIN
-#if defined(LONG_LONG_MIN)
-#define LLONG_MIN LONG_LONG_MIN
-#elif SIZEOF_LONG_LONG == 8
-#define LLONG_MIN 0x8000000000000000LL
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+#if PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
 #endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
 #endif
+}
 
-#ifndef LLONG_MAX
-#if defined(LONG_LONG_MAX)
-#define LLONG_MAX LONG_LONG_MAX
-#elif SIZEOF_LONG_LONG == 8
-#define LLONG_MAX 0x7fffffffffffffffLL
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+#if PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
 #endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
 #endif
+  return static_cast<fpu_rounding_control_word_type>(0);
+}
 
-#ifndef ULLONG_MAX
-#if defined(ULONG_LONG_MAX)
-#define ULLONG_MAX ULONG_LONG_MAX
-#elif SIZEOF_UNSIGNED_LONG_LONG == 8
-#define ULLONG_MAX 0xffffffffffffffffULL
+inline void
+fpu_reset_inexact() {
+#if PPL_FPMATH_MAY_USE_387
+  fpu_clear_exceptions();
 #endif
+#if PPL_FPMATH_MAY_USE_SSE
+  // NOTE: on entry to this function the current rounding mode
+  // has to be the default one.
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
 #endif
-
-namespace Parma_Polyhedra_Library {
-
-/*
-  The only reason to use these definitions instead of std::numeric_limits
-  is a missing optimization in GCC 3.4.1.
-*/
-
-template <typename T>
-struct Limits;
-
-#define signed_limits(type, prefix) \
-template <> \
-struct Limits<type> { \
-	static const type min = prefix ## _MIN; \
-	static const type max = prefix ## _MAX; \
 }
 
-#define unsigned_limits(type, prefix) \
-template <> \
-struct Limits<type> { \
-	static const type min = 0; \
-	static const type max = prefix ## _MAX; \
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+#if PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+#endif
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
 }
 
-signed_limits(signed char, SCHAR);
-signed_limits(short, SHRT);
-signed_limits(int, INT);
-signed_limits(long, LONG);
-signed_limits(long long, LLONG);
-
-unsigned_limits(unsigned char, UCHAR);
-unsigned_limits(unsigned short, USHRT);
-unsigned_limits(unsigned int, UINT);
-unsigned_limits(unsigned long, ULONG);
-unsigned_limits(unsigned long long, ULLONG);
-
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/checked_int.inlines.hh line 27
-#include <cerrno>
-#include <cstdlib>
-#include <climits>
-#include <string>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
+inline int
+fpu_check_inexact() {
+#if PPL_FPMATH_MAY_USE_387
+  if (fpu_get_status() & FPU_INEXACT)
+    return 1;
 #endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
+#if PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit && (sse_get_control() & SSE_INEXACT))
+    return 1;
 #endif
+  return 0;
+}
 
-#if !HAVE_DECL_STRTOLL
-signed long long
-strtoll(const char* nptr, char** endptr, int base);
-#endif
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.defs.hh line 78
+#elif defined(PPL_HAVE_IEEEFP_H)					\
+  && (defined(__sparc)							\
+      || defined(sparc)							\
+      || defined(__sparc__))
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu-sparc.inlines.hh line 1
+/* SPARC floating point unit related functions.
+*/
 
-#if !HAVE_DECL_STRTOULL
-unsigned long long
-strtoull(const char* nptr, char** endptr, int base);
-#endif
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define FPU_TONEAREST ((int) FP_RN)
+#define FPU_UPWARD ((int) FP_RP)
+#define FPU_DOWNWARD ((int) FP_RM)
+#define FPU_TOWARDZERO ((int) FP_RZ)
 
 namespace Parma_Polyhedra_Library {
 
-namespace Checked {
+inline void
+fpu_initialize_control_functions() {
+}
 
-#ifndef HAVE_INT_FAST16_T
-typedef int16_t int_fast16_t;
-#endif
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fpgetround());
+}
 
-#ifndef HAVE_INT_FAST32_T
-typedef int32_t int_fast32_t;
-#endif
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpsetround((fp_rnd) dir);
+}
 
-#ifndef HAVE_INT_FAST64_T
-typedef int64_t int_fast64_t;
-#endif
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  return static_cast<fpu_rounding_control_word_type>(fpsetround((fp_rnd) dir));
+}
 
-#ifndef HAVE_UINT_FAST16_T
-typedef uint16_t uint_fast16_t;
-#endif
+inline void
+fpu_reset_inexact() {
+  fp_except except = fpgetmask();
+  except &= ~FP_X_IMP;
+  fpsetmask(except);
+}
 
-#ifndef HAVE_UINT_FAST32_T
-typedef uint32_t uint_fast32_t;
-#endif
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fpsetround((fp_rnd) w);
+}
 
-#ifndef HAVE_UINT_FAST64_T
-typedef uint64_t uint_fast64_t;
+inline int
+fpu_check_inexact() {
+  return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_IEEEFP_H)
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.defs.hh line 83
+#elif defined(PPL_HAVE_FENV_H)
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu-c99.inlines.hh line 1
+/* C99 Floating point unit related functions.
+*/
+
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+
+#ifdef FE_TONEAREST
+#define FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define FPU_TOWARDZERO FE_TOWARDZERO
 #endif
 
-template <typename Policy, typename Type>
-struct Extended_Int {
-  static const Type plus_infinity = Limits<Type>::max;
-  static const Type minus_infinity = (Limits<Type>::min >= 0
-				      ? Limits<Type>::max - 1
-				      : Limits<Type>::min);
-  static const Type not_a_number = (Limits<Type>::min >= 0
-				    ? Limits<Type>::max - Policy::handle_infinity * 2
-				    : Limits<Type>::min + Policy::handle_infinity);
-  static const Type min = (Limits<Type>::min
-			   + (Limits<Type>::min >= 0 ? 0
-			      : (Policy::handle_infinity + Policy::handle_nan)));
-  static const Type max = (Limits<Type>::max
-			   - (Limits<Type>::min >= 0
-			      ? (2 * Policy::handle_infinity + Policy::handle_nan)
-			      : Policy::handle_infinity));
-};
+namespace Parma_Polyhedra_Library {
 
-template <typename Policy, typename To>
-inline Result
-set_neg_overflow_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
-    to = Extended_Int<Policy, To>::min;
-    return V_LT;
-  }
-  else {
-    if (Policy::handle_infinity) {
-      to = Extended_Int<Policy, To>::minus_infinity;
-      return V_GT;
-    }
-    return V_NEG_OVERFLOW;
-  }
+inline void
+fpu_initialize_control_functions() {
 }
 
-template <typename Policy, typename To>
-inline Result
-set_pos_overflow_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
-    to = Extended_Int<Policy, To>::max;
-    return V_GT;
-  }
-  else {
-    if (Policy::handle_infinity) {
-      to = Extended_Int<Policy, To>::plus_infinity;
-      return V_LT;
-    }
-    return V_POS_OVERFLOW;
-  }
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fegetround());
 }
 
-template <typename Policy, typename To>
-inline Result
-round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
-    to--;
-    return V_GT;
-  }
-  return V_LT;
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fesetround(dir);
 }
 
-template <typename Policy, typename To>
-inline Result
-round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
-    to++;
-    return V_LT;
-  }
-  return V_GT;
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_rounding_control_word_type old
+    = static_cast<fpu_rounding_control_word_type>(fegetround());
+  fesetround(dir);
+  return old;
 }
 
-template <typename Policy, typename To>
-inline Result
-round_lt_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
-    if (to == Extended_Int<Policy, To>::min) {
-      if (Policy::handle_infinity) {
-	to = Extended_Int<Policy, To>::minus_infinity;
-	return V_GT;
-      }
-      return V_NEG_OVERFLOW;
-    } else {
-      to--;
-      return V_GT;
-    }
-  }
-  return V_LT;
+inline void
+fpu_reset_inexact() {
+  feclearexcept(FE_INEXACT);
 }
 
-template <typename Policy, typename To>
-inline Result
-round_gt_int(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
-    if (to == Extended_Int<Policy, To>::max) {
-      if (Policy::handle_infinity) {
-	to = Extended_Int<Policy, To>::plus_infinity;
-	return V_LT;
-      }
-      return V_POS_OVERFLOW;
-    } else {
-      to++;
-      return V_LT;
-    }
-  }
-  return V_GT;
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fesetround(w);
 }
 
-SPECIALIZE_COPY(generic, signed char)
-SPECIALIZE_COPY(generic, signed short)
-SPECIALIZE_COPY(generic, signed int)
-SPECIALIZE_COPY(generic, signed long)
-SPECIALIZE_COPY(generic, signed long long)
-SPECIALIZE_COPY(generic, unsigned char)
-SPECIALIZE_COPY(generic, unsigned short)
-SPECIALIZE_COPY(generic, unsigned int)
-SPECIALIZE_COPY(generic, unsigned long)
-SPECIALIZE_COPY(generic, unsigned long long)
-
-template <typename Policy, typename Type>
-inline Result
-classify_int(const Type v, bool nan, bool inf, bool sign) {
-  if (Policy::handle_nan
-      && (nan || sign)
-      && v == Extended_Int<Policy, Type>::not_a_number)
-    return VC_NAN;
-  if (!inf & !sign)
-    return VC_NORMAL;
-  if (Policy::handle_infinity) {
-    if (v == Extended_Int<Policy, Type>::minus_infinity)
-      return inf ? VC_MINUS_INFINITY : V_LT;
-    if (v == Extended_Int<Policy, Type>::plus_infinity)
-      return inf ? VC_PLUS_INFINITY : V_GT;
-  }
-  if (sign) {
-    if (v < 0)
-      return V_LT;
-    if (v > 0)
-      return V_GT;
-    return V_EQ;
-  }
-  return VC_NORMAL;
+inline int
+fpu_check_inexact() {
+  return fetestexcept(FE_INEXACT) != 0;
 }
 
-SPECIALIZE_CLASSIFY(int, signed char)
-SPECIALIZE_CLASSIFY(int, signed short)
-SPECIALIZE_CLASSIFY(int, signed int)
-SPECIALIZE_CLASSIFY(int, signed long)
-SPECIALIZE_CLASSIFY(int, signed long long)
-SPECIALIZE_CLASSIFY(int, unsigned char)
-SPECIALIZE_CLASSIFY(int, unsigned short)
-SPECIALIZE_CLASSIFY(int, unsigned int)
-SPECIALIZE_CLASSIFY(int, unsigned long)
-SPECIALIZE_CLASSIFY(int, unsigned long long)
+} // namespace Parma_Polyhedra_Library
 
-template <typename Policy, typename Type>
-inline bool
-is_nan_int(const Type v) {
-  return Policy::handle_nan && v == Extended_Int<Policy, Type>::not_a_number;
-}
+#endif // !defined(PPL_HAVE_FENV_H)
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.defs.hh line 85
+#else
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu-none.inlines.hh line 1
+/* Null floating point unit related functions.
+*/
 
-SPECIALIZE_IS_NAN(int, signed char)
-SPECIALIZE_IS_NAN(int, signed short)
-SPECIALIZE_IS_NAN(int, signed int)
-SPECIALIZE_IS_NAN(int, signed long)
-SPECIALIZE_IS_NAN(int, signed long long)
-SPECIALIZE_IS_NAN(int, unsigned char)
-SPECIALIZE_IS_NAN(int, unsigned short)
-SPECIALIZE_IS_NAN(int, unsigned int)
-SPECIALIZE_IS_NAN(int, unsigned long)
-SPECIALIZE_IS_NAN(int, unsigned long long)
+#include <stdexcept>
 
-template <typename Policy, typename Type>
-inline bool
-is_minf_int(const Type v) {
-  return Policy::handle_infinity
-    && v == Extended_Int<Policy, Type>::minus_infinity;
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+  throw std::logic_error("PPL::fpu_initialize_control_functions():"
+			 " cannot control the FPU");
 }
 
-SPECIALIZE_IS_MINF(int, signed char)
-SPECIALIZE_IS_MINF(int, signed short)
-SPECIALIZE_IS_MINF(int, signed int)
-SPECIALIZE_IS_MINF(int, signed long)
-SPECIALIZE_IS_MINF(int, signed long long)
-SPECIALIZE_IS_MINF(int, unsigned char)
-SPECIALIZE_IS_MINF(int, unsigned short)
-SPECIALIZE_IS_MINF(int, unsigned int)
-SPECIALIZE_IS_MINF(int, unsigned long)
-SPECIALIZE_IS_MINF(int, unsigned long long)
+inline int
+fpu_get_rounding_direction() {
+  throw std::logic_error("PPL::fpu_get_rounding_direction():"
+			 " cannot control the FPU");
+}
 
-template <typename Policy, typename Type>
-inline bool
-is_pinf_int(const Type v) {
-  return Policy::handle_infinity
-    && v == Extended_Int<Policy, Type>::plus_infinity;
+inline void
+fpu_set_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_set_rounding_direction():"
+			 " cannot control the FPU");
 }
 
-SPECIALIZE_IS_PINF(int, signed char)
-SPECIALIZE_IS_PINF(int, signed short)
-SPECIALIZE_IS_PINF(int, signed int)
-SPECIALIZE_IS_PINF(int, signed long)
-SPECIALIZE_IS_PINF(int, signed long long)
-SPECIALIZE_IS_PINF(int, unsigned char)
-SPECIALIZE_IS_PINF(int, unsigned short)
-SPECIALIZE_IS_PINF(int, unsigned int)
-SPECIALIZE_IS_PINF(int, unsigned long)
-SPECIALIZE_IS_PINF(int, unsigned long long)
+inline int
+fpu_save_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction():"
+			 " cannot control the FPU");
+}
 
-template <typename Policy, typename Type>
-inline bool
-is_int_int(const Type v) {
-  return !is_nan<Policy>(v);
+inline void
+fpu_reset_inexact() {
+  throw std::logic_error("PPL::fpu_reset_inexact():"
+			 " cannot control the FPU");
 }
 
-SPECIALIZE_IS_INT(int, signed char)
-SPECIALIZE_IS_INT(int, signed short)
-SPECIALIZE_IS_INT(int, signed int)
-SPECIALIZE_IS_INT(int, signed long)
-SPECIALIZE_IS_INT(int, signed long long)
-SPECIALIZE_IS_INT(int, unsigned char)
-SPECIALIZE_IS_INT(int, unsigned short)
-SPECIALIZE_IS_INT(int, unsigned int)
-SPECIALIZE_IS_INT(int, unsigned long)
-SPECIALIZE_IS_INT(int, unsigned long long)
+inline void
+fpu_restore_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+			 " cannot control the FPU");
+}
 
-template <typename Policy, typename Type>
-inline Result
-set_special_int(Type& v, Result r) {
-  Result t = classify(r);
-  if (Policy::handle_nan && t == VC_NAN)
-    v = Extended_Int<Policy, Type>::not_a_number;
-  else if (Policy::handle_infinity) {
-    switch (t) {
-    case VC_MINUS_INFINITY:
-      v = Extended_Int<Policy, Type>::minus_infinity;
-      break;
-    case VC_PLUS_INFINITY:
-      v = Extended_Int<Policy, Type>::plus_infinity;
-      break;
-    default:
-      break;
-    }
-  }
-  return r;
+inline int
+fpu_check_inexact() {
+  throw std::logic_error("PPL::fpu_check_inexact():"
+			 " cannot control the FPU");
 }
 
-SPECIALIZE_SET_SPECIAL(int, signed char)
-SPECIALIZE_SET_SPECIAL(int, signed short)
-SPECIALIZE_SET_SPECIAL(int, signed int)
-SPECIALIZE_SET_SPECIAL(int, signed long)
-SPECIALIZE_SET_SPECIAL(int, signed long long)
-SPECIALIZE_SET_SPECIAL(int, unsigned char)
-SPECIALIZE_SET_SPECIAL(int, unsigned short)
-SPECIALIZE_SET_SPECIAL(int, unsigned int)
-SPECIALIZE_SET_SPECIAL(int, unsigned long)
-SPECIALIZE_SET_SPECIAL(int, unsigned long long)
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/fpu.defs.hh line 87
+#endif
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(To) <= sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from < static_cast<From>(Extended_Int<Policy, To>::min)))
-      return set_neg_overflow_int<Policy>(to, dir);
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
-  }
-  to = To(from);
-  return V_EQ;
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rounding_Dir.defs.hh line 28
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(To) <= sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
-  }
-  to = To(from);
-  return V_EQ;
-}
+namespace Parma_Polyhedra_Library {
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_overflow, from < 0))
-    return set_neg_overflow_int<Policy>(to, dir);
-  if (sizeof(To) < sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
-  }
-  to = To(from);
-  return V_EQ;
-}
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+  /*! \hideinitializer
+    Round toward \f$-\infty\f$.
+  */
+  ROUND_DOWN = 0,
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(To) <= sizeof(From)) {
-    if (CHECK_P(Policy::check_overflow,
-		from > static_cast<From>(Extended_Int<Policy, To>::max)))
-      return set_pos_overflow_int<Policy>(to, dir);
-  }
-  to = To(from);
-  return V_EQ;
-}
+  /*! \hideinitializer
+    Round toward \f$+\infty\f$.
+  */
+  ROUND_UP = 1,
 
+  /*! \hideinitializer
+    Rounding is delegated to lower level. Result info is evaluated lazily.
+  */
+  ROUND_IGNORE = 6,
+  ROUND_NATIVE = ROUND_IGNORE,
 
-#define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_signed_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_signed_int, Larger, Smaller)
+  /*! \hideinitializer
+    Rounding is not needed: client code must ensure the operation is exact.
+  */
+  ROUND_NOT_NEEDED = 7,
 
-#define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Larger, Smaller)
+  ROUND_DIRECT = ROUND_UP,
+  ROUND_INVERSE = ROUND_DOWN,
 
-#define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_signed_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_unsigned_int, Larger, Smaller)
+  ROUND_DIR_MASK = 7,
 
-#define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
-SPECIALIZE_ASSIGN(signed_int_unsigned_int, Smaller, Larger) \
-SPECIALIZE_ASSIGN(unsigned_int_signed_int, Larger, Smaller)
+  ROUND_FPU_CHECK_INEXACT = 8,
 
-#define ASSIGN_SIGNED(Type) \
-SPECIALIZE_ASSIGN(signed_int_signed_int, Type, Type)
-#define ASSIGN_UNSIGNED(Type) \
-SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Type, Type)
+  ROUND_CHECK = ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT
+};
 
-ASSIGN_SIGNED(signed char)
-ASSIGN_SIGNED(signed short)
-ASSIGN_SIGNED(signed int)
-ASSIGN_SIGNED(signed long)
-ASSIGN_SIGNED(signed long long)
-ASSIGN_UNSIGNED(unsigned char)
-ASSIGN_UNSIGNED(unsigned short)
-ASSIGN_UNSIGNED(unsigned int)
-ASSIGN_UNSIGNED(unsigned long)
-ASSIGN_UNSIGNED(unsigned long long)
+/*! \brief
+  Returns the inverse rounding mode of \p dir,
+  <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
 
-ASSIGN2_SIGNED_SIGNED(signed char, signed short)
-ASSIGN2_SIGNED_SIGNED(signed char, signed int)
-ASSIGN2_SIGNED_SIGNED(signed char, signed long)
-ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
-ASSIGN2_SIGNED_SIGNED(signed short, signed int)
-ASSIGN2_SIGNED_SIGNED(signed short, signed long)
-ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
-ASSIGN2_SIGNED_SIGNED(signed int, signed long)
-ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
-ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
-ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
-ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
-ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
-ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
-ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
-ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
-ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
-ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
-ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
-ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
-ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
-ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
-ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
-ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
-ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
-ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
-ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
-ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
-ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
-ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+Rounding_Dir round_dir(Rounding_Dir dir);
+bool round_down(Rounding_Dir dir);
+bool round_up(Rounding_Dir dir);
+bool round_ignore(Rounding_Dir dir);
+bool round_direct(Rounding_Dir dir);
+bool round_inverse(Rounding_Dir dir);
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_int_float(To& to, const From from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_overflow, (from < Extended_Int<Policy, To>::min)))
-    return set_neg_overflow_int<Policy>(to, dir);
-  if (CHECK_P(Policy::check_overflow, (from > Extended_Int<Policy, To>::max)))
-    return set_pos_overflow_int<Policy>(to, dir);
-  to = static_cast<To>(from);
-  if (dir == ROUND_IGNORE)
-    return V_LGE;
-  if (from < to)
-    return round_lt_int<Policy>(to, dir);
-  else if (from > to)
-    return round_gt_int<Policy>(to, dir);
-  else
-    return V_EQ;
-}
+bool round_fpu_check_inexact(Rounding_Dir dir);
 
-SPECIALIZE_ASSIGN(int_float, signed char, float)
-SPECIALIZE_ASSIGN(int_float, signed short, float)
-SPECIALIZE_ASSIGN(int_float, signed int, float)
-SPECIALIZE_ASSIGN(int_float, signed long, float)
-SPECIALIZE_ASSIGN(int_float, signed long long, float)
-SPECIALIZE_ASSIGN(int_float, unsigned char, float)
-SPECIALIZE_ASSIGN(int_float, unsigned short, float)
-SPECIALIZE_ASSIGN(int_float, unsigned int, float)
-SPECIALIZE_ASSIGN(int_float, unsigned long, float)
-SPECIALIZE_ASSIGN(int_float, unsigned long long, float)
-
-SPECIALIZE_ASSIGN(int_float, signed char, double)
-SPECIALIZE_ASSIGN(int_float, signed short, double)
-SPECIALIZE_ASSIGN(int_float, signed int, double)
-SPECIALIZE_ASSIGN(int_float, signed long, double)
-SPECIALIZE_ASSIGN(int_float, signed long long, double)
-SPECIALIZE_ASSIGN(int_float, unsigned char, double)
-SPECIALIZE_ASSIGN(int_float, unsigned short, double)
-SPECIALIZE_ASSIGN(int_float, unsigned int, double)
-SPECIALIZE_ASSIGN(int_float, unsigned long, double)
-SPECIALIZE_ASSIGN(int_float, unsigned long long, double)
-
-SPECIALIZE_ASSIGN(int_float, signed char, long double)
-SPECIALIZE_ASSIGN(int_float, signed short, long double)
-SPECIALIZE_ASSIGN(int_float, signed int, long double)
-SPECIALIZE_ASSIGN(int_float, signed long, long double)
-SPECIALIZE_ASSIGN(int_float, signed long long, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned char, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned short, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned int, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned long, long double)
-SPECIALIZE_ASSIGN(int_float, unsigned long long, long double)
+fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
 
-#undef ASSIGN2_SIGNED_SIGNED
-#undef ASSIGN2_UNSIGNED_UNSIGNED
-#undef ASSIGN2_UNSIGNED_SIGNED
-#undef ASSIGN2_SIGNED_UNSIGNED
+} // namespace Parma_Polyhedra_Library
 
-template <typename Policy, typename To>
-inline Result
-assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
-  if (sizeof(To) <= sizeof(signed long)) {
-    if (!Policy::check_overflow) {
-      to = from.get_si();
-      return V_EQ;
-    }
-    if (from.fits_slong_p()) {
-      signed long v = from.get_si();
-      if (v < Limits<To>::min)
-	return set_neg_overflow_int<Policy>(to, dir);
-      if (v > Limits<To>::max)
-	return set_pos_overflow_int<Policy>(to, dir);
-      to = v;
-      return V_EQ;
-    }
-  }
-  else {
-    mpz_srcptr m = from.get_mpz_t();
-    size_t sz = mpz_size(m);
-    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
-      if (sz == 0) {
-	to = 0;
-	return V_EQ;
-      }
-      To v;
-      mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
-      if (v >= 0) {
-	if (::sgn(from) < 0)
-	  return neg<Policy>(to, v, dir);
-	to = v;
-	return V_EQ;
-      }
-    }
-  }
-  return ::sgn(from) < 0
-    ? set_neg_overflow_int<Policy>(to, dir)
-    : set_pos_overflow_int<Policy>(to, dir);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rounding_Dir.inlines.hh line 1
+/* Inline functions operating on enum Rounding_Dir values.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline Rounding_Dir
+round_dir(Rounding_Dir dir) {
+  return static_cast<Rounding_Dir>(dir & ROUND_DIR_MASK);
 }
 
-SPECIALIZE_ASSIGN(signed_int_mpz, signed char, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed short, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed int, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed long, mpz_class)
-SPECIALIZE_ASSIGN(signed_int_mpz, signed long long, mpz_class)
+inline bool
+round_down(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DOWN;
+}
 
-template <typename Policy, typename To>
-inline Result
-assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_overflow, ::sgn(from) < 0))
-    return set_neg_overflow_int<Policy>(to, dir);
-  if (sizeof(To) <= sizeof(unsigned long)) {
-    if (!Policy::check_overflow) {
-      to = from.get_ui();
-      return V_EQ;
-    }
-    if (from.fits_ulong_p()) {
-      unsigned long v = from.get_ui();
-      if (v > Limits<To>::max)
-	return set_pos_overflow_int<Policy>(to, dir);
-      to = v;
-      return V_EQ;
-    }
-  }
-  else {
-    mpz_srcptr m = from.get_mpz_t();
-    size_t sz = mpz_size(m);
-    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
-      if (sz == 0)
-	to = 0;
-      else
-	mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
-      return V_EQ;
-    }
-  }
-  return set_pos_overflow_int<Policy>(to, dir);
+inline bool
+round_up(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_UP;
 }
 
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned char, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned short, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned int, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long, mpz_class)
-SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long long, mpz_class)
+inline bool
+round_ignore(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_IGNORE;
+}
 
-template <typename Policy, typename To>
-inline Result
-assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
-  mpz_srcptr n = from.get_num().get_mpz_t();
-  mpz_srcptr d = from.get_den().get_mpz_t();
-  mpz_class q;
-  mpz_ptr _q = q.get_mpz_t();
-  if (dir == ROUND_IGNORE) {
-    mpz_tdiv_q(_q, n, d);
-    Result r = assign<Policy>(to, q, dir);
-    if (r != V_EQ)
-      return r;
-    return V_LGE;
-  }
-  mpz_t rem;
-  int sign;
-  mpz_init(rem);
-  mpz_tdiv_qr(_q, rem, n, d);
-  sign = mpz_sgn(rem);
-  mpz_clear(rem);
-  Result r = assign<Policy>(to, q, dir);
-  if (r != V_EQ)
-    return r;
-  switch (sign) {
-  case -1:
-    return round_lt_int<Policy>(to, dir);
-  case 1:
-    return round_gt_int<Policy>(to, dir);
-  default:
-    return V_EQ;
-  }
+inline bool
+round_direct(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DIRECT;
 }
 
-SPECIALIZE_ASSIGN(int_mpq, signed char, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed short, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed int, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed long, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, signed long long, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned char, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned short, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned int, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned long, mpq_class)
-SPECIALIZE_ASSIGN(int_mpq, unsigned long long, mpq_class)
+inline bool
+round_inverse(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_INVERSE;
+}
 
-template <typename Policy, typename To>
-inline Result
-assign_int_minf(To& to, const Minus_Infinity&, Rounding_Dir dir) {
-  if (Policy::handle_infinity) {
-    to = Extended_Int<Policy, To>::minus_infinity;
-    return V_EQ;
-  }
-  if (dir == ROUND_UP) {
-    to = Extended_Int<Policy, To>::min;
-    return V_LT;
-  }
-  return VC_MINUS_INFINITY;
+inline bool
+round_fpu_check_inexact(Rounding_Dir dir) {
+  return dir & ROUND_FPU_CHECK_INEXACT;
 }
 
-template <typename Policy, typename To>
-inline Result
-assign_int_pinf(To& to, const Plus_Infinity&, Rounding_Dir dir) {
-  if (Policy::handle_infinity) {
-    to = Extended_Int<Policy, To>::plus_infinity;
-    return V_EQ;
-  }
-  if (dir == ROUND_DOWN) {
-    to = Extended_Int<Policy, To>::max;
-    return V_GT;
+inline fpu_rounding_direction_type
+round_fpu_dir(Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    return static_cast<fpu_rounding_direction_type>(FPU_UPWARD);
+  case ROUND_DOWN:
+    return static_cast<fpu_rounding_direction_type>(FPU_DOWNWARD);
+  default:
+    assert(0);
+    return static_cast<fpu_rounding_direction_type>(FPU_UPWARD);
   }
-  return VC_PLUS_INFINITY;
 }
 
-template <typename Policy, typename To>
-inline Result
-assign_int_nan(To& to, const Not_A_Number&, Rounding_Dir) {
-  if (Policy::handle_nan) {
-    to = Extended_Int<Policy, To>::not_a_number;
-    return V_EQ;
+/*! \relates Parma_Polyhedra_Library::Rounding_Dir */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+  Rounding_Dir d = round_dir(dir);
+  switch (d) {
+  case ROUND_UP:
+    d = ROUND_DOWN;
+    break;
+  case ROUND_DOWN:
+    d = ROUND_UP;
+    break;
+  default:
+    assert(false);
+    /* Fall through */
+  case ROUND_IGNORE:
+    return dir;
   }
-  return VC_NAN;
-}
-
-SPECIALIZE_ASSIGN(int_minf, signed char, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed short, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed int, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed long, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, signed long long, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned char, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned short, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned int, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned long, Minus_Infinity)
-SPECIALIZE_ASSIGN(int_minf, unsigned long long, Minus_Infinity)
-
-SPECIALIZE_ASSIGN(int_pinf, signed char, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed short, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed int, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed long, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, signed long long, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned char, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned short, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned int, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned long, Plus_Infinity)
-SPECIALIZE_ASSIGN(int_pinf, unsigned long long, Plus_Infinity)
-
-SPECIALIZE_ASSIGN(int_nan, signed char, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed short, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed int, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed long, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, signed long long, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned char, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned short, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned int, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned long, Not_A_Number)
-SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
+  return static_cast<Rounding_Dir>((dir & ~ROUND_DIR_MASK) | d);
+}
 
-#if UCHAR_MAX == 0xff
-#define CHAR_BITS 8
-#else
-#error "Unexpected max for unsigned char"
-#endif
+} // namespace Parma_Polyhedra_Library
 
-#if USHRT_MAX == 0xffff
-#define SHRT_BITS 16
-#else
-#error "Unexpected max for unsigned short"
-#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rounding_Dir.defs.hh line 85
 
-#if UINT_MAX == 0xffffffff
-#define INT_BITS 32
-#else
-#error "Unexpected max for unsigned int"
-#endif
 
-#if ULONG_MAX == 0xffffffffUL
-#define LONG_BITS 32
-#elif ULONG_MAX == 0xffffffffffffffffULL
-#define LONG_BITS 64
-#else
-#error "Unexpected max for unsigned long"
-#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Numeric_Format.defs.hh line 1
+/* Numeric format.
+*/
 
-#if ULLONG_MAX == 0xffffffffffffffffULL
-#define LONG_LONG_BITS 64
-#else
-#error "Unexpected max for unsigned long long"
-#endif
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Numeric_Format.defs.hh line 28
 
-template <typename T>
-struct Larger;
-
-// The following may be tuned for performance on specific architecture.
-//
-// Current guidelines:
-//   - avoid division where possible (larger type variant for mul)
-//   - use larger type variant for types smaller than architecture bit size
-
-template <>
-struct Larger<signed char> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast16_t Type_For_Neg;
-  typedef int_fast16_t  Type_For_Add;
-  typedef int_fast16_t  Type_For_Sub;
-  typedef int_fast16_t  Type_For_Mul;
-};
-
-template <>
-struct Larger<unsigned char> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast16_t Type_For_Neg;
-  typedef uint_fast16_t Type_For_Add;
-  typedef int_fast16_t Type_For_Sub;
-  typedef uint_fast16_t Type_For_Mul;
-};
-
-template <>
-struct Larger<signed short> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast32_t Type_For_Neg;
-  typedef int_fast32_t Type_For_Add;
-  typedef int_fast32_t Type_For_Sub;
-  typedef int_fast32_t Type_For_Mul;
-};
-
-template <>
-struct Larger<unsigned short> {
-  static const bool use_for_neg = true;
-  static const bool use_for_add = true;
-  static const bool use_for_sub = true;
-  static const bool use_for_mul = true;
-  typedef int_fast32_t Type_For_Neg;
-  typedef uint_fast32_t Type_For_Add;
-  typedef int_fast32_t Type_For_Sub;
-  typedef uint_fast32_t Type_For_Mul;
-};
-
-template <>
-struct Larger<signed int> {
-  static const bool use_for_neg = (LONG_BITS == 64);
-  static const bool use_for_add = (LONG_BITS == 64);
-  static const bool use_for_sub = (LONG_BITS == 64);
-  static const bool use_for_mul = true;
-  typedef int_fast64_t Type_For_Neg;
-  typedef int_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef int_fast64_t Type_For_Mul;
-};
-
-template <>
-struct Larger<unsigned int> {
-  static const bool use_for_neg = (LONG_BITS == 64);
-  static const bool use_for_add = (LONG_BITS == 64);
-  static const bool use_for_sub = (LONG_BITS == 64);
-  static const bool use_for_mul = true;
-  typedef int_fast64_t Type_For_Neg;
-  typedef uint_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef uint_fast64_t Type_For_Mul;
-};
-
-template <>
-struct Larger<signed long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = (LONG_BITS == 32);
-  typedef int_fast64_t Type_For_Neg;
-  typedef int_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef int_fast64_t Type_For_Mul;
-};
-
-template <>
-struct Larger<unsigned long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = (LONG_BITS == 32);
-  typedef int_fast64_t Type_For_Neg;
-  typedef uint_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef uint_fast64_t Type_For_Mul;
-};
-
-template <>
-struct Larger<signed long long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = false;
-  typedef int_fast64_t Type_For_Neg;
-  typedef int_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef int_fast64_t Type_For_Mul;
-};
+namespace Parma_Polyhedra_Library {
 
-template <>
-struct Larger<unsigned long long> {
-  static const bool use_for_neg = false;
-  static const bool use_for_add = false;
-  static const bool use_for_sub = false;
-  static const bool use_for_mul = false;
-  typedef int_fast64_t Type_For_Neg;
-  typedef uint_fast64_t Type_For_Add;
-  typedef int_fast64_t Type_For_Sub;
-  typedef uint_fast64_t Type_For_Mul;
+class Numeric_Format {
 };
 
-template <typename Policy, typename Type>
-inline Result
-neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Neg l = x;
-  l = -l;
-  return assign<Policy>(to, l, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Add l = x;
-  l += y;
-  return assign<Policy>(to, l, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Sub l = x;
-  l -= y;
-  return assign<Policy>(to, l, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  typename Larger<Type>::Type_For_Mul l = x;
-  l *= y;
-  return assign<Policy>(to, l, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_neg)
-    return neg_int_larger<Policy>(to, from, dir);
-  if (CHECK_P(Policy::check_overflow,
-	      (from < -Extended_Int<Policy, Type>::max)))
-    return set_pos_overflow_int<Policy>(to, dir);
-  to = -from;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_neg)
-    return neg_int_larger<Policy>(to, from, dir);
-  if (CHECK_P(Policy::check_overflow, from != 0))
-    return set_neg_overflow_int<Policy>(to, dir);
-  to = from;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_add)
-    return add_int_larger<Policy>(to, x, y, dir);
-  if (Policy::check_overflow) {
-    if (y >= 0) {
-      if (x > Extended_Int<Policy, Type>::max - y)
-	return set_pos_overflow_int<Policy>(to, dir);
-    }
-    else if (x < Extended_Int<Policy, Type>::min - y)
-	return set_neg_overflow_int<Policy>(to, dir);
-  }
-  to = x + y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_add)
-    return add_int_larger<Policy>(to, x, y, dir);
-  if (CHECK_P(Policy::check_overflow,
-	      (x > Extended_Int<Policy, Type>::max - y)))
-    return set_pos_overflow_int<Policy>(to, dir);
-  to = x + y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_sub)
-    return sub_int_larger<Policy>(to, x, y, dir);
-  if (Policy::check_overflow) {
-    if (y >= 0) {
-      if (x < Extended_Int<Policy, Type>::min + y)
-	return set_neg_overflow_int<Policy>(to, dir);
-    }
-    else if (x > Extended_Int<Policy, Type>::max + y)
-	return set_pos_overflow_int<Policy>(to, dir);
-  }
-  to = x - y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_sub)
-    return sub_int_larger<Policy>(to, x, y, dir);
-  if (CHECK_P(Policy::check_overflow,
-	      (x < Extended_Int<Policy, Type>::min + y)))
-    return set_neg_overflow_int<Policy>(to, dir);
-  to = x - y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_mul)
-    return mul_int_larger<Policy>(to, x, y, dir);
-  if (!Policy::check_overflow) {
-    to = x * y;
-    return V_EQ;
-  }
-  if (y == 0) {
-    to = 0;
-    return V_EQ;
-  }
-  if (y == -1)
-    return neg_signed_int<Policy>(to, x, dir);
-  if (x >= 0) {
-    if (y > 0) {
-      if (x > Extended_Int<Policy, Type>::max / y)
-	return set_pos_overflow_int<Policy>(to, dir);
-    }
-    else {
-      if (x > Extended_Int<Policy, Type>::min / y)
-	return set_neg_overflow_int<Policy>(to, dir);
-    }
-  }
-  else {
-    if (y < 0) {
-      if (x < Extended_Int<Policy, Type>::max / y)
-	return set_pos_overflow_int<Policy>(to, dir);
-    }
-    else {
-      if (x < Extended_Int<Policy, Type>::min / y)
-	return set_neg_overflow_int<Policy>(to, dir);
-    }
-  }
-  to = x * y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (Policy::check_overflow && Larger<Type>::use_for_mul)
-    return mul_int_larger<Policy>(to, x, y, dir);
-  if (!Policy::check_overflow) {
-    to = x * y;
-    return V_EQ;
-  }
-  if (y == 0) {
-    to = 0;
-    return V_EQ;
-  }
-  if (x > Extended_Int<Policy, Type>::max / y)
-    return set_pos_overflow_int<Policy>(to, dir);
-  to = x * y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_div_zero, y == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
-  if (Policy::check_overflow && y == -1)
-    return neg_signed_int<Policy>(to, x, dir);
-  to = x / y;
-  if (dir == ROUND_IGNORE)
-    return V_LGE;
-  Type m = x % y;
-  if (m < 0)
-    return round_lt_int_no_overflow<Policy>(to, dir);
-  else if (m > 0)
-    return round_gt_int_no_overflow<Policy>(to, dir);
-  else
-    return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_div_zero, y == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
-  to = x / y;
-  if (dir == ROUND_IGNORE)
-    return V_GE;
-  Type m = x % y;
-  if (m == 0)
-    return V_EQ;
-  return round_gt_int<Policy>(to, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-rem_int(Type& to, const Type x, const Type y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, y == 0))
-    return set_special<Policy>(to, V_MOD_ZERO);
-  to = x % y;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
-  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
-    to = 0;
-    if (dir == ROUND_IGNORE)
-      return V_GE;
-    if (x == 0)
-      return V_EQ;
-    return round_gt_int_no_overflow<Policy>(to, dir);
-  }
-  to = x >> exp;
-  if (dir == ROUND_IGNORE)
-    return V_GE;
-  if (x & ((static_cast<Type>(1) << exp) - 1))
-    return round_gt_int_no_overflow<Policy>(to, dir);
-  else
-    return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
-  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
-  zero:
-    to = 0;
-    if (dir == ROUND_IGNORE)
-      return V_LGE;
-    if (x < 0)
-      return round_lt_int_no_overflow<Policy>(to, dir);
-    else if (x > 0)
-      return round_gt_int_no_overflow<Policy>(to, dir);
-    else
-      return V_EQ;
-  }
-  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
-    if (x == Limits<Type>::min) {
-      to = -1;
-      return V_EQ;
-    }
-    goto zero;
-  }
-#if 0
-  to = x / (static_cast<Type>(1) << exp);
-  if (dir == ROUND_IGNORE)
-    return V_GE;
-  Type r = x % (static_cast<Type>(1) << exp);
-  if (r < 0)
-    return round_lt_int_no_overflow<Policy>(to, dir);
-  else if (r > 0)
-    return round_gt_int_no_overflow<Policy>(to, dir);
-  else
-    return V_EQ;
-#else
-  // Faster but compiler implementation dependent (see C++98 5.8.3)
-  to = x >> exp;
-  if (dir == ROUND_IGNORE)
-    return V_GE;
-  if (x & ((static_cast<Type>(1) << exp) - 1))
-    return round_gt_int_no_overflow<Policy>(to, dir);
-  return V_EQ;
-#endif
-}
-
-template <typename Policy, typename Type>
-inline Result
-mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  if (!Policy::check_overflow) {
-    to = x << exp;
-    return V_EQ;
-  }
-  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
-    if (x == 0) {
-      to = 0;
-      return V_EQ;
-    }
-    return set_pos_overflow_int<Policy>(to, dir);
-  }
-  if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
-    return set_pos_overflow_int<Policy>(to, dir);
-  Type n = x << exp;
-  if (n > Extended_Int<Policy, Type>::max)
-    return set_pos_overflow_int<Policy>(to, dir);
-  to = n;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  if (!Policy::check_overflow) {
-    to = x << exp;
-    return V_EQ;
-  }
-  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
-    if (x < 0)
-      return set_neg_overflow_int<Policy>(to, dir);
-    else if (x > 0)
-      return set_pos_overflow_int<Policy>(to, dir);
-    else {
-      to = 0;
-      return V_EQ;
-    }
-  }
-  Type mask = ((static_cast<Type>(1) << exp) - 1)
-    << (sizeof(Type) * 8 - 1 - exp);
-  Type n;
-  if (x < 0) {
-    if ((x & mask) != mask)
-      return set_neg_overflow_int<Policy>(to, dir);
-    n = x << exp;
-    if (n < Extended_Int<Policy, Type>::min)
-      return set_neg_overflow_int<Policy>(to, dir);
-  }
-  else {
-    if (x & mask)
-      return set_pos_overflow_int<Policy>(to, dir);
-    n = x << exp;
-    if (n > Extended_Int<Policy, Type>::max)
-      return set_pos_overflow_int<Policy>(to, dir);
-  }
-  to = n;
-  return V_EQ;
-}
-
-template <typename Type>
-inline void
-isqrtrem_(Type& q, Type& r, const Type from) {
-  q = 0;
-  r = from;
-  Type t(1);
-  for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) {
-    Type s = q + t;
-    if (s <= r) {
-      r -= s;
-      q = s + t;
-    }
-    q >>= 1;
-  }
-}
-
-template <typename Policy, typename Type>
-inline Result
-sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
-  Type rem;
-  isqrtrem_(to, rem, from);
-  if (dir == ROUND_IGNORE)
-    return V_GE;
-  if (rem == 0)
-    return V_EQ;
-  return round_gt_int<Policy>(to, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
-    return set_special<Policy>(to, V_SQRT_NEG);
-  return sqrt_unsigned_int<Policy>(to, from, dir);
-}
-
-template <typename Policy, typename Type>
-inline Result
-add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  Type z;
-  Result r = mul<Policy>(z, x, y, dir);
-  switch (r) {
-  case V_NEG_OVERFLOW:
-  case V_LT:
-    if (to <= 0) {
-      to = z;
-      return r;
-    }
-    return set_special<Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
-  case V_POS_OVERFLOW:
-  case V_GT:
-    if (to >= 0) {
-      to = z;
-      return r;
-    }
-    return set_special<Policy>(to, V_UNKNOWN_POS_OVERFLOW);
-  default:
-    return add<Policy>(to, to, z, dir);
-  }
-}
-
-template <typename Policy, typename Type>
-inline Result
-sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  Type z;
-  Result r = mul<Policy>(z, x, y, dir);
-  switch (r) {
-  case V_NEG_OVERFLOW:
-  case V_LT:
-    if (to >= 0)
-      return set_pos_overflow_int<Policy>(to, dir);
-    return V_UNKNOWN_NEG_OVERFLOW;
-  case V_POS_OVERFLOW:
-  case V_GT:
-    if (to <= 0)
-      return set_neg_overflow_int<Policy>(to, dir);
-    return V_UNKNOWN_POS_OVERFLOW;
-  default:
-    return sub<Policy>(to, to, z, dir);
-  }
-}
-
-template <typename Policy, typename Type>
-inline Result
-output_char(std::ostream& os, Type& from,
-	    const Numeric_Format&, Rounding_Dir) {
-  os << (int) from;
-  return V_EQ;
-}
-
-template <typename Policy, typename Type>
-inline Result
-output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
-  os << from;
-  return V_EQ;
-}
-
-SPECIALIZE_NEG(signed_int, signed char, signed char)
-SPECIALIZE_NEG(signed_int, signed short, signed short)
-SPECIALIZE_NEG(signed_int, signed int, signed int)
-SPECIALIZE_NEG(signed_int, signed long, signed long)
-SPECIALIZE_NEG(signed_int, signed long long, signed long long)
-SPECIALIZE_NEG(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_NEG(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_NEG(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_NEG(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_NEG(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_ADD(signed_int, signed char, signed char, signed char)
-SPECIALIZE_ADD(signed_int, signed short, signed short, signed short)
-SPECIALIZE_ADD(signed_int, signed int, signed int, signed int)
-SPECIALIZE_ADD(signed_int, signed long, signed long, signed long)
-SPECIALIZE_ADD(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_ADD(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_ADD(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_ADD(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_ADD(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_ADD(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_SUB(signed_int, signed char, signed char, signed char)
-SPECIALIZE_SUB(signed_int, signed short, signed short, signed short)
-SPECIALIZE_SUB(signed_int, signed int, signed int, signed int)
-SPECIALIZE_SUB(signed_int, signed long, signed long, signed long)
-SPECIALIZE_SUB(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_SUB(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_SUB(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_SUB(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_SUB(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_SUB(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_MUL(signed_int, signed char, signed char, signed char)
-SPECIALIZE_MUL(signed_int, signed short, signed short, signed short)
-SPECIALIZE_MUL(signed_int, signed int, signed int, signed int)
-SPECIALIZE_MUL(signed_int, signed long, signed long, signed long)
-SPECIALIZE_MUL(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_MUL(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_MUL(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_MUL(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_MUL(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_MUL(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_DIV(signed_int, signed char, signed char, signed char)
-SPECIALIZE_DIV(signed_int, signed short, signed short, signed short)
-SPECIALIZE_DIV(signed_int, signed int, signed int, signed int)
-SPECIALIZE_DIV(signed_int, signed long, signed long, signed long)
-SPECIALIZE_DIV(signed_int, signed long long, signed long long, signed long long)
-SPECIALIZE_DIV(unsigned_int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_DIV(unsigned_int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_DIV(unsigned_int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_DIV(unsigned_int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_DIV(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_REM(int, signed char, signed char, signed char)
-SPECIALIZE_REM(int, signed short, signed short, signed short)
-SPECIALIZE_REM(int, signed int, signed int, signed int)
-SPECIALIZE_REM(int, signed long, signed long, signed long)
-SPECIALIZE_REM(int, signed long long, signed long long, signed long long)
-SPECIALIZE_REM(int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_REM(int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_REM(int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_REM(int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_REM(int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_MUL2EXP(signed_int, signed char, signed char)
-SPECIALIZE_MUL2EXP(signed_int, signed short, signed short)
-SPECIALIZE_MUL2EXP(signed_int, signed int, signed int)
-SPECIALIZE_MUL2EXP(signed_int, signed long, signed long)
-SPECIALIZE_MUL2EXP(signed_int, signed long long, signed long long)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_MUL2EXP(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_DIV2EXP(signed_int, signed char, signed char)
-SPECIALIZE_DIV2EXP(signed_int, signed short, signed short)
-SPECIALIZE_DIV2EXP(signed_int, signed int, signed int)
-SPECIALIZE_DIV2EXP(signed_int, signed long, signed long)
-SPECIALIZE_DIV2EXP(signed_int, signed long long, signed long long)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_DIV2EXP(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_SQRT(signed_int, signed char, signed char)
-SPECIALIZE_SQRT(signed_int, signed short, signed short)
-SPECIALIZE_SQRT(signed_int, signed int, signed int)
-SPECIALIZE_SQRT(signed_int, signed long, signed long)
-SPECIALIZE_SQRT(signed_int, signed long long, signed long long)
-SPECIALIZE_SQRT(unsigned_int, unsigned char, unsigned char)
-SPECIALIZE_SQRT(unsigned_int, unsigned short, unsigned short)
-SPECIALIZE_SQRT(unsigned_int, unsigned int, unsigned int)
-SPECIALIZE_SQRT(unsigned_int, unsigned long, unsigned long)
-SPECIALIZE_SQRT(unsigned_int, unsigned long long, unsigned long long)
-
-SPECIALIZE_ABS(generic, signed char, signed char)
-SPECIALIZE_ABS(generic, signed short, signed short)
-SPECIALIZE_ABS(generic, signed int, signed int)
-SPECIALIZE_ABS(generic, signed long, signed long)
-SPECIALIZE_ABS(generic, signed long long, signed long long)
-SPECIALIZE_ABS(generic, unsigned char, unsigned char)
-SPECIALIZE_ABS(generic, unsigned short, unsigned short)
-SPECIALIZE_ABS(generic, unsigned int, unsigned int)
-SPECIALIZE_ABS(generic, unsigned long, unsigned long)
-SPECIALIZE_ABS(generic, unsigned long long, unsigned long long)
-
-SPECIALIZE_GCD(exact, signed char, signed char, signed char)
-SPECIALIZE_GCD(exact, signed short, signed short, signed short)
-SPECIALIZE_GCD(exact, signed int, signed int, signed int)
-SPECIALIZE_GCD(exact, signed long, signed long, signed long)
-SPECIALIZE_GCD(exact, signed long long, signed long long, signed long long)
-SPECIALIZE_GCD(exact, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_GCD(exact, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_GCD(exact, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_GCD(exact, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_GCD(exact, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_GCDEXT(exact, signed char, signed char, signed char, signed char, signed char)
-SPECIALIZE_GCDEXT(exact, signed short, signed short, signed short, signed short, signed short)
-SPECIALIZE_GCDEXT(exact, signed int, signed int, signed int, signed int, signed int)
-SPECIALIZE_GCDEXT(exact, signed long, signed long, signed long, signed long, signed long)
-SPECIALIZE_GCDEXT(exact, signed long long, signed long long, signed long long, signed long long, signed long long)
-SPECIALIZE_GCDEXT(exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_GCDEXT(exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_GCDEXT(exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_GCDEXT(exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_GCDEXT(exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_LCM(gcd_exact, signed char, signed char, signed char)
-SPECIALIZE_LCM(gcd_exact, signed short, signed short, signed short)
-SPECIALIZE_LCM(gcd_exact, signed int, signed int, signed int)
-SPECIALIZE_LCM(gcd_exact, signed long, signed long, signed long)
-SPECIALIZE_LCM(gcd_exact, signed long long, signed long long, signed long long)
-SPECIALIZE_LCM(gcd_exact, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_LCM(gcd_exact, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_LCM(gcd_exact, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_LCM(gcd_exact, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_LCM(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_SGN(generic, signed char)
-SPECIALIZE_SGN(generic, signed short)
-SPECIALIZE_SGN(generic, signed int)
-SPECIALIZE_SGN(generic, signed long)
-SPECIALIZE_SGN(generic, signed long long)
-SPECIALIZE_SGN(generic, unsigned char)
-SPECIALIZE_SGN(generic, unsigned short)
-SPECIALIZE_SGN(generic, unsigned int)
-SPECIALIZE_SGN(generic, unsigned long)
-SPECIALIZE_SGN(generic, unsigned long long)
-
-SPECIALIZE_CMP(generic, signed char, signed char)
-SPECIALIZE_CMP(generic, signed short, signed short)
-SPECIALIZE_CMP(generic, signed int, signed int)
-SPECIALIZE_CMP(generic, signed long, signed long)
-SPECIALIZE_CMP(generic, signed long long, signed long long)
-SPECIALIZE_CMP(generic, unsigned char, unsigned char)
-SPECIALIZE_CMP(generic, unsigned short, unsigned short)
-SPECIALIZE_CMP(generic, unsigned int, unsigned int)
-SPECIALIZE_CMP(generic, unsigned long, unsigned long)
-SPECIALIZE_CMP(generic, unsigned long long, unsigned long long)
-
-SPECIALIZE_ADD_MUL(int, signed char, signed char, signed char)
-SPECIALIZE_ADD_MUL(int, signed short, signed short, signed short)
-SPECIALIZE_ADD_MUL(int, signed int, signed int, signed int)
-SPECIALIZE_ADD_MUL(int, signed long, signed long, signed long)
-SPECIALIZE_ADD_MUL(int, signed long long, signed long long, signed long long)
-SPECIALIZE_ADD_MUL(int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_ADD_MUL(int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_ADD_MUL(int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_ADD_MUL(int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_ADD_MUL(int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_SUB_MUL(int, signed char, signed char, signed char)
-SPECIALIZE_SUB_MUL(int, signed short, signed short, signed short)
-SPECIALIZE_SUB_MUL(int, signed int, signed int, signed int)
-SPECIALIZE_SUB_MUL(int, signed long, signed long, signed long)
-SPECIALIZE_SUB_MUL(int, signed long long, signed long long, signed long long)
-SPECIALIZE_SUB_MUL(int, unsigned char, unsigned char, unsigned char)
-SPECIALIZE_SUB_MUL(int, unsigned short, unsigned short, unsigned short)
-SPECIALIZE_SUB_MUL(int, unsigned int, unsigned int, unsigned int)
-SPECIALIZE_SUB_MUL(int, unsigned long, unsigned long, unsigned long)
-SPECIALIZE_SUB_MUL(int, unsigned long long, unsigned long long, unsigned long long)
-
-SPECIALIZE_INPUT(generic, signed char)
-SPECIALIZE_INPUT(generic, signed short)
-SPECIALIZE_INPUT(generic, signed int)
-SPECIALIZE_INPUT(generic, signed long)
-SPECIALIZE_INPUT(generic, signed long long)
-SPECIALIZE_INPUT(generic, unsigned char)
-SPECIALIZE_INPUT(generic, unsigned short)
-SPECIALIZE_INPUT(generic, unsigned int)
-SPECIALIZE_INPUT(generic, unsigned long)
-SPECIALIZE_INPUT(generic, unsigned long long)
-
-SPECIALIZE_OUTPUT(char, signed char)
-SPECIALIZE_OUTPUT(int, signed short)
-SPECIALIZE_OUTPUT(int, signed int)
-SPECIALIZE_OUTPUT(int, signed long)
-SPECIALIZE_OUTPUT(int, signed long long)
-SPECIALIZE_OUTPUT(char, unsigned char)
-SPECIALIZE_OUTPUT(int, unsigned short)
-SPECIALIZE_OUTPUT(int, unsigned int)
-SPECIALIZE_OUTPUT(int, unsigned long)
-SPECIALIZE_OUTPUT(int, unsigned long long)
-
-} // namespace Checked
-
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/checked_float.inlines.hh line 1
-/* Specialized "checked" functions for native floating-point numbers.
-*/
-
 
-// Automatically generated from PPL source file ../src/Float.defs.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Float.defs.hh line 1
 /* IEC 559 floating point format related functions.
 */
 
 
-// Automatically generated from PPL source file ../src/Float.defs.hh line 27
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Float.defs.hh line 28
 #include <gmp.h>
 #include <cassert>
 #include <cmath>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
 
 #ifndef NAN
 #define NAN (HUGE_VAL - HUGE_VAL)
@@ -3442,7 +2384,7 @@ namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_ieee754_single {
   uint32_t word;
@@ -3472,10 +2414,10 @@ struct float_ieee754_single {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_ieee754_double {
-#ifdef WORDS_BIGENDIAN
+#ifdef PPL_WORDS_BIGENDIAN
   uint32_t msp;
   uint32_t lsp;
 #else
@@ -3510,10 +2452,10 @@ struct float_ieee754_double {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_intel_double_extended {
-#ifdef WORDS_BIGENDIAN
+#ifdef PPL_WORDS_BIGENDIAN
   uint32_t msp;
   uint64_t lsp;
 #else
@@ -3549,10 +2491,10 @@ struct float_intel_double_extended {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
 struct float_ieee754_quad {
-#ifdef WORDS_BIGENDIAN
+#ifdef PPL_WORDS_BIGENDIAN
   uint64_t msp;
   uint64_t lsp;
 #else
@@ -3587,18 +2529,15 @@ struct float_ieee754_quad {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename T>
-class Float {
-public:
-  static const bool fpu_related = false;
-};
+class Float : public False { };
 
 #if PPL_SUPPORTED_FLOAT
 template <>
-class Float<float> {
+class Float<float> : public True {
 public:
-  typedef CXX_FLOAT_BINARY_FORMAT Binary;
+  typedef PPL_CXX_FLOAT_BINARY_FORMAT Binary;
   union {
     float number;
     Binary binary;
@@ -3606,15 +2545,14 @@ public:
   Float();
   Float(float v);
   float value();
-  static const bool fpu_related = true;
 };
 #endif
 
 #if PPL_SUPPORTED_DOUBLE
 template <>
-class Float<double> {
+class Float<double> : public True {
 public:
-  typedef CXX_DOUBLE_BINARY_FORMAT Binary;
+  typedef PPL_CXX_DOUBLE_BINARY_FORMAT Binary;
   union {
     double number;
     Binary binary;
@@ -3622,15 +2560,14 @@ public:
   Float();
   Float(double v);
   double value();
-  static const bool fpu_related = true;
 };
 #endif
 
 #if PPL_SUPPORTED_LONG_DOUBLE
 template <>
-class Float<long double> {
+class Float<long double> : public True {
 public:
-  typedef CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
+  typedef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
   union {
     long double number;
     Binary binary;
@@ -3638,24 +2575,17 @@ public:
   Float();
   Float(long double v);
   long double value();
-  static const bool fpu_related = true;
 };
 #endif
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Float.inlines.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Float.inlines.hh line 1
 /* IEC 559 floating point format related functions.
 */
 
 
 #include <climits>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
 
 namespace Parma_Polyhedra_Library {
 
@@ -3694,12 +2624,12 @@ float_ieee754_single::sign_bit() const {
 
 inline void
 float_ieee754_single::dec() {
-  word--;
+  --word;
 }
 
 inline void
 float_ieee754_single::inc() {
-  word++;
+  ++word;
 }
 
 inline void
@@ -3758,21 +2688,21 @@ float_ieee754_double::sign_bit() const {
 inline void
 float_ieee754_double::dec() {
   if (lsp == 0) {
-    msp--;
+    --msp;
     lsp = LSP_MAX;
   }
   else
-    lsp--;
+    --lsp;
 }
 
 inline void
 float_ieee754_double::inc() {
   if (lsp == LSP_MAX) {
-    msp++;
+    ++msp;
     lsp = 0;
   }
   else
-    lsp++;
+    ++lsp;
 }
 
 inline void
@@ -3844,21 +2774,21 @@ float_intel_double_extended::sign_bit() const {
 inline void
 float_intel_double_extended::dec() {
   if ((lsp & LSP_DMAX) == 0) {
-    msp--;
+    --msp;
     lsp = (msp & MSP_NEG_INF) == 0 ? LSP_DMAX : LSP_NMAX;
   }
   else
-    lsp--;
+    --lsp;
 }
 
 inline void
 float_intel_double_extended::inc() {
   if ((lsp & LSP_DMAX) == LSP_DMAX) {
-    msp++;
+    ++msp;
     lsp = LSP_DMAX + 1;
   }
   else
-    lsp++;
+    ++lsp;
 }
 
 inline void
@@ -3922,21 +2852,21 @@ float_ieee754_quad::sign_bit() const {
 inline void
 float_ieee754_quad::dec() {
   if (lsp == 0) {
-    msp--;
+    --msp;
     lsp = LSP_MAX;
   }
   else
-    lsp--;
+    --lsp;
 }
 
 inline void
 float_ieee754_quad::inc() {
   if (lsp == LSP_MAX) {
-    msp++;
+    ++msp;
     lsp = 0;
   }
   else
-    lsp++;
+    ++lsp;
 }
 
 inline void
@@ -3960,7 +2890,7 @@ float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
     << (MANTISSA_BITS - 64);
 }
 
-#ifdef CXX_FLOAT_BINARY_FORMAT
+#ifdef PPL_CXX_FLOAT_BINARY_FORMAT
 inline
 Float<float>::Float() {
 }
@@ -3976,7 +2906,7 @@ Float<float>::value() {
 }
 #endif
 
-#ifdef CXX_DOUBLE_BINARY_FORMAT
+#ifdef PPL_CXX_DOUBLE_BINARY_FORMAT
 inline
 Float<double>::Float() {
 }
@@ -3992,7 +2922,7 @@ Float<double>::value() {
 }
 #endif
 
-#ifdef CXX_LONG_DOUBLE_BINARY_FORMAT
+#ifdef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT
 inline
 Float<long double>::Float() {
 }
@@ -4011,10165 +2941,36652 @@ Float<long double>::value() {
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Float.defs.hh line 248
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Float.defs.hh line 237
 
-// Automatically generated from PPL source file ../src/checked_float.inlines.hh line 27
-#ifndef __alpha
-#include <cmath>
-#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked.defs.hh line 33
 
 namespace Parma_Polyhedra_Library {
 
 namespace Checked {
 
-inline float
-fma(float x, float y, float z) {
-#if HAVE_DECL_FMAF && !defined(__alpha)
-  return ::fmaf(x, y, z);
-#else
-  return x*y + z;
-#endif
+
+// It is a pity that function partial specialization is not permitted
+// by C++.  To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define FUNCTION_CLASS(name) name ## _function_struct
+
+#define DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg); \
 }
 
-#if HAVE_DECL_RINTF
-inline float
-rint(float x) {
-  return ::rintf(x);
+#define DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1); \
 }
-#endif
 
-inline double
-fma(double x, double y, double z) {
-#if HAVE_DECL_FMA && !defined(__alpha)
-  return ::fma(x, y, z);
-#else
-  return x*y + z;
-#endif
+#define DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2); \
 }
 
-inline double
-rint(double x) {
-  return ::rint(x);
+#define DECLARE_FUN1_0_3(name, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2, a3); \
 }
 
-inline long double
-fma(long double x, long double y, long double z) {
-#if HAVE_DECL_FMAL && !defined(__alpha)
-  return ::fmal(x, y, z);
-#else
-  return x*y + z;
-#endif
+#define DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1); \
 }
 
-#if HAVE_DECL_RINTL
-inline long double
-rint(long double x) {
-  return ::rintl(x);
+#define DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1, a2); \
 }
-#endif
 
-inline bool
-fpu_direct_rounding(Rounding_Dir dir) {
-  return dir == ROUND_DIRECT || dir == ROUND_IGNORE;
+#define DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, b2, arg, a1, a2); \
 }
 
-inline bool
-fpu_inverse_rounding(Rounding_Dir dir) {
-  return dir == ROUND_INVERSE;
+#define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy1, typename Policy2, typename type1, typename type2>	     \
+struct FUNCTION_CLASS(name); \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2>::function(arg1, arg2); \
 }
 
-// The FPU mode is "round down".
-//
-// The result of the rounded down multiplication is thus computed directly.
-//
-//   a = 0.3
-//   b = 0.1
-//   c_i = a * b = 0.03
-//   c = c_i = 0.0
-//
-// To obtain the result of the rounded up multiplication
-// we do -(-a * b).
-//
-//   a = 0.3
-//   b = 0.1
-//   c_i = -a * b = -0.03
-//
-// Here c_i should be forced to lose excess precision, otherwise the
-// FPU will truncate using the rounding mode in force, which is "round down".
-//
-//   c_i = -c_i = 0.03
-//   c = c_i = 0.0
-//
-// Wrong result: we should have obtained c = 0.1.
+#define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy1, typename Policy2, typename type1, typename type2>		\
+struct FUNCTION_CLASS(name); \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2>::function(arg1, arg2, a1); \
+}
 
-inline float
-limit_precision(float v) {
-  volatile float x = v;
-  return x;
+#define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy1, typename Policy2, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2>::function(arg1, arg2, a1, a2); \
 }
 
-inline double
-limit_precision(double v) {
-  volatile double x = v;
-  return x;
+#define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy1, typename Policy2, typename Policy3, typename type1, typename type2, typename type3> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy1, typename Policy2, typename Policy3, typename type1, typename type2, typename type3> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
 }
 
-inline long double
-limit_precision(long double v) {
-#if __GNUC__ >= 4
-  return v;
-#else
-  // Not really needed for floating point operations done with the
-  // maximum available precision, but this avoids a bug in GCC 3.4.3
-  // that causes excessive optimization compiling -(-a * b).
-  // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21032
-  // and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21067.
-  volatile long double x = v;
-  return x;
-#endif
+#define DECLARE_FUN5_0_1(name, ret_type,				\
+			 qual1, type1, qual2, type2, qual3, type3,	\
+			 qual4, type4, qual5, type5,			\
+			 after1)					\
+template <typename Policy1, typename Policy2, typename Policy3,		\
+	  typename Policy4,typename Policy5,				\
+	  typename type1, typename type2, typename type3,		\
+	  typename type4, typename type5>				\
+struct FUNCTION_CLASS(name);						\
+template <typename Policy1, typename Policy2, typename Policy3,		\
+	  typename Policy4,typename Policy5,				\
+	  typename type1, typename type2, typename type3,		\
+	  typename type4, typename type5>				\
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2,		\
+		     qual3 type3& arg3, qual4 type4& arg4,		\
+		     qual5 type5& arg5,	after1 a1) {			\
+  return FUNCTION_CLASS(name)<Policy1, Policy2, Policy3, Policy4, Policy5, type1, type2, type3, type4, type5> \
+    ::function(arg1, arg2, arg3, arg4, arg5, a1);			\
 }
 
-template <typename Policy, typename T>
-inline Result
-classify_float(const T v, bool nan, bool inf, bool sign) {
-  Float<T> f(v);
-  if ((nan || sign) && f.u.binary.is_nan())
-    return VC_NAN;
-  if (inf) {
-    int i = f.u.binary.is_inf();
-    if (i < 0)
-      return VC_MINUS_INFINITY;
-    if (i > 0)
-      return VC_PLUS_INFINITY;
-  }
-  if (sign) {
-    if (v < 0)
-      return V_LT;
-    if (v > 0)
-      return V_GT;
+#define SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg) { \
+    return func<Policy>(arg); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1) { \
+    return func<Policy>(arg, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
+    return func<Policy>(arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+    return func<Policy>(arg, a1, a2, a3); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_1_1(name, func, ret_type, before1, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
+    return func<Policy>(b1, arg, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_1_2(name, func, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+    return func<Policy>(b1, arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+    return func<Policy>(b1, b2, arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy1, typename Policy2>				\
+struct FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
+    return func<Policy1, Policy2>(arg1, arg2); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy1, typename Policy2> \
+struct FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
+    return func<Policy1, Policy2>(arg1, arg2, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy1, typename Policy2> \
+struct FUNCTION_CLASS(name)<Policy1, Policy2, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
+    return func<Policy1, Policy2>(arg1, arg2, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy1, typename Policy2, typename Policy3>			\
+struct FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, type1, type2, type3> { \
+  static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
+    return func<Policy1, Policy2, Policy3>(arg1, arg2, arg3, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN5_0_1(name, func, ret_type,			\
+			    qual1, type1, qual2, type2, qual3, type3,	\
+			    qual4, type4, qual5, type5, after1)		\
+  template <typename Policy1, typename Policy2, typename Policy3,	\
+	    typename Policy4, typename Policy5>				\
+  struct FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, Policy4, Policy5, \
+			       type1, type2, type3, type4, type5> {	\
+  static inline Result							\
+  function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3,	\
+	   qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) {		\
+    return func<Policy1, Policy2, Policy3, Policy4, Policy5>(arg1, arg2, arg3, arg4, arg5, a1);	\
+  }									\
+};
+
+#define nonconst
+
+#define SPECIALIZE_COPY(func, Type) \
+  SPECIALIZE_FUN2_0_0(copy, func, void, nonconst, Type, const, Type)
+#define SPECIALIZE_SGN(func, From) \
+  SPECIALIZE_FUN1_0_0(sgn, func, Result, const, From)
+#define SPECIALIZE_CMP(func, Type1, Type2) \
+  SPECIALIZE_FUN2_0_0(cmp, func, Result, const, Type1, const, Type2)
+#define SPECIALIZE_SET_SPECIAL(func, Type) \
+  SPECIALIZE_FUN1_0_1(set_special, func, Result, nonconst, Type, Result)
+#define SPECIALIZE_CLASSIFY(func, Type) \
+  SPECIALIZE_FUN1_0_3(classify, func, Result, const, Type, bool, bool, bool)
+#define SPECIALIZE_IS_NAN(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_nan, func, bool, const, Type)
+#define SPECIALIZE_IS_MINF(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_minf, func, bool, const, Type)
+#define SPECIALIZE_IS_PINF(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_pinf, func, bool, const, Type)
+#define SPECIALIZE_IS_INT(func, Type) \
+  SPECIALIZE_FUN1_0_0(is_int, func, bool, const, Type)
+#define SPECIALIZE_CONSTRUCT(func, To, From) \
+  SPECIALIZE_FUN2_0_1(construct, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ASSIGN(func, To, From) \
+  SPECIALIZE_FUN2_0_1(assign, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_FLOOR(func, To, From) \
+  SPECIALIZE_FUN2_0_1(floor, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_CEIL(func, To, From) \
+  SPECIALIZE_FUN2_0_1(ceil, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_TRUNC(func, To, From) \
+  SPECIALIZE_FUN2_0_1(trunc, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_NEG(func, To, From) \
+  SPECIALIZE_FUN2_0_1(neg, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ABS(func, To, From) \
+  SPECIALIZE_FUN2_0_1(abs, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_SQRT(func, To, From) \
+  SPECIALIZE_FUN2_0_1(sqrt, func, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ADD(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(mul, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_DIV(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(div, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_REM(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(rem, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_IDIV(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(idiv, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL2EXP(func, To, From) \
+  SPECIALIZE_FUN2_0_2(mul2exp, func, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_DIV2EXP(func, To, From) \
+  SPECIALIZE_FUN2_0_2(div2exp, func, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_ADD_MUL(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add_mul, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB_MUL(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub_mul, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCD(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(gcd, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCDEXT(func, To1, From1, From2, To2, To3)		\
+  SPECIALIZE_FUN5_0_1(gcdext, func, Result, nonconst, To1,		\
+		      nonconst, To2, nonconst, To3, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_LCM(func, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(lcm, func, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_INPUT(func, Type) \
+  SPECIALIZE_FUN1_0_2(input, func, Result, nonconst, Type, std::istream&, Rounding_Dir)
+#define SPECIALIZE_OUTPUT(func, Type) \
+  SPECIALIZE_FUN1_1_2(output, func, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+
+DECLARE_FUN2_0_0(copy,        void, nonconst, Type1, const, Type2)
+DECLARE_FUN1_0_0(sgn,         Result, const, From)
+DECLARE_FUN2_0_0(cmp,         Result, const, Type1, const, Type2)
+DECLARE_FUN1_0_1(set_special, Result, nonconst, Type, Result)
+DECLARE_FUN1_0_3(classify,    Result, const, Type, bool, bool, bool)
+DECLARE_FUN1_0_0(is_nan,      bool, const, Type)
+DECLARE_FUN1_0_0(is_minf,     bool, const, Type)
+DECLARE_FUN1_0_0(is_pinf,     bool, const, Type)
+DECLARE_FUN1_0_0(is_int,      bool, const, Type)
+DECLARE_FUN2_0_1(construct,   Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(assign,      Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(floor,       Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(ceil,        Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(trunc,       Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(neg,         Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(abs,         Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(sqrt,        Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN3_0_1(add,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(mul,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(div,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(rem,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(idiv,        Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN2_0_2(mul2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN2_0_2(div2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN3_0_1(add_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(gcd,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN5_0_1(gcdext,      Result, nonconst, To1, nonconst, To2, nonconst, To3, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(lcm,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN1_0_2(input,       Result, nonconst, Type, std::istream&, Rounding_Dir)
+DECLARE_FUN1_1_2(output,      Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+} // namespace Checked
+
+#define MINUS_INFINITY float(-HUGE_VAL)
+#define PLUS_INFINITY float(HUGE_VAL)
+#define NOT_A_NUMBER float(NAN)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Checked_Number_Transparent_Policy {
+  //! Checks for overflowed result.
+  const_bool_nodef(check_overflow, false);
+
+  //! Checks for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Checks for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Checks for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Checks for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Checks for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Checks for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Handles not-a-number special value.
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+
+  //! Handles infinity special values.
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+
+  //! Representation is identical to primitive.
+  const_bool_nodef(convertible, true);
+
+  //! When true, requests to check for FPU inexact result are honored.
+  const_bool_nodef(fpu_check_inexact, false);
+
+  //! Return VC_NAN on NaN result also for native extended.
+  const_bool_nodef(check_nan_result, false);
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
+};
+
+typedef Checked_Number_Transparent_Policy<float> Special_Float_Policy;
+
+} // namespace Parma_Polyhedra_Library
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked.inlines.hh line 1
+/* Abstract checked arithmetic functions: fall-backs.
+*/
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/globals.types.hh line 1
+
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+  //! The universe element, i.e., the whole vector space.
+  UNIVERSE,
+  //! The empty element, i.e., the empty set.
+  EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+enum Relation_Symbol {
+  //! Less than.
+  LESS_THAN,
+  //! Less than or equal to.
+  LESS_OR_EQUAL,
+  //! Equal to.
+  EQUAL,
+  //! Greater than or equal to.
+  GREATER_OR_EQUAL,
+  //! Greater than.
+  GREATER_THAN,
+  //! Not equal to.
+  NOT_EQUAL
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+  //! Worst-case polynomial complexity.
+  POLYNOMIAL_COMPLEXITY,
+  //! Worst-case exponential complexity but typically polynomial behavior.
+  SIMPLEX_COMPLEXITY,
+  //! Any complexity.
+  ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+  //! Minimization is requested.
+  MINIMIZATION,
+  //! Maximization is requested.
+  MAXIMIZATION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Integer.hh line 1
+/* C integers info.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Integer.hh line 27
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing.  In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+struct C_Integer : public False { };
+
+template <>
+struct C_Integer<signed char> : public True {
+  enum { is_signed = true };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef unsigned char other_type;
+  static const signed char min = SCHAR_MIN;
+  static const signed char max = SCHAR_MAX;
+};
+
+template <>
+struct C_Integer<signed short> : public True {
+  enum { is_signed = true };
+  typedef signed char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef unsigned short other_type;
+  static const signed short min = SHRT_MIN;
+  static const signed short max = SHRT_MAX;
+};
+
+template <>
+struct C_Integer<signed int> : public True {
+  enum { is_signed = true };
+  typedef signed short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef unsigned int other_type;
+  static const signed int min = INT_MIN;
+  static const signed int max = INT_MAX;
+};
+
+template <>
+struct C_Integer<signed long> : public True {
+  enum { is_signed = true };
+  typedef signed int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef unsigned long other_type;
+  static const signed long min = LONG_MIN;
+  static const signed long max = LONG_MAX;
+};
+
+template <>
+struct C_Integer<signed long long> : public True {
+  enum { is_signed = true };
+  typedef signed long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef unsigned long long other_type;
+  static const signed long long min = LLONG_MIN;
+  static const signed long long max = LLONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned char> : public True {
+  enum { is_signed = false };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef signed char other_type;
+  static const unsigned char min = 0;
+  static const unsigned char max = UCHAR_MAX;
+};
+
+template <>
+struct C_Integer<unsigned short> : public True {
+  enum { is_signed = false };
+  typedef unsigned char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef signed short other_type;
+  static const unsigned short min = 0;
+  static const unsigned short max = USHRT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned int> : public True {
+  enum { is_signed = false };
+  typedef unsigned short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef signed int other_type;
+  static const unsigned int min = 0;
+  static const unsigned int max = UINT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long> : public True {
+  enum { is_signed = false };
+  typedef unsigned int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef signed long other_type;
+  static const unsigned long min = 0;
+  static const unsigned long max = ULONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long long> : public True {
+  enum { is_signed = false };
+  typedef unsigned long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef signed long long other_type;
+  static const unsigned long long min = 0;
+  static const unsigned long long max = ULLONG_MAX;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked.inlines.hh line 26
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename T1, typename T2>
+struct Safe_Conversion : public False {
+};
+template <typename T>
+struct Safe_Conversion<T, T> : public True {
+};
+
+#define safe_conversion(To, From)					\
+  template <> struct Safe_Conversion<To, From> : public True { }
+
+safe_conversion(signed short, signed char);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT
+safe_conversion(signed short, unsigned char);
+#endif
+
+safe_conversion(signed int, signed char);
+safe_conversion(signed int, signed short);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT
+safe_conversion(signed int, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT
+safe_conversion(signed int, unsigned short);
+#endif
+
+safe_conversion(signed long, signed char);
+safe_conversion(signed long, signed short);
+safe_conversion(signed long, signed int);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG
+safe_conversion(signed long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG
+safe_conversion(signed long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG
+safe_conversion(signed long, unsigned int);
+#endif
+
+safe_conversion(signed long long, signed char);
+safe_conversion(signed long long, signed short);
+safe_conversion(signed long long, signed int);
+safe_conversion(signed long long, signed long);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG < PPL_SIZEOF_LONG_LONG
+safe_conversion(signed long long, unsigned long);
+#endif
+
+safe_conversion(unsigned short, unsigned char);
+
+safe_conversion(unsigned int, unsigned char);
+safe_conversion(unsigned int, unsigned short);
+
+safe_conversion(unsigned long, unsigned char);
+safe_conversion(unsigned long, unsigned short);
+safe_conversion(unsigned long, unsigned int);
+
+safe_conversion(unsigned long long, unsigned char);
+safe_conversion(unsigned long long, unsigned short);
+safe_conversion(unsigned long long, unsigned int);
+safe_conversion(unsigned long long, unsigned long);
+
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed char);
+safe_conversion(float, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed short);
+safe_conversion(float, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed int);
+safe_conversion(float, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed long);
+safe_conversion(float, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_FLOAT - 2
+safe_conversion(float, signed long long);
+safe_conversion(float, unsigned long long);
+#endif
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed char);
+safe_conversion(double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed short);
+safe_conversion(double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed int);
+safe_conversion(double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed long);
+safe_conversion(double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_DOUBLE - 4
+safe_conversion(double, signed long long);
+safe_conversion(double, unsigned long long);
+#endif
+safe_conversion(double, float);
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed char);
+safe_conversion(long double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed short);
+safe_conversion(long double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed int);
+safe_conversion(long double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed long);
+safe_conversion(long double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+safe_conversion(long double, signed long long);
+safe_conversion(long double, unsigned long long);
+#endif
+safe_conversion(long double, float);
+safe_conversion(long double, double);
+
+safe_conversion(mpz_class, signed char);
+safe_conversion(mpz_class, signed short);
+safe_conversion(mpz_class, signed int);
+safe_conversion(mpz_class, signed long);
+//safe_conversion(mpz_class, signed long long);
+safe_conversion(mpz_class, unsigned char);
+safe_conversion(mpz_class, unsigned short);
+safe_conversion(mpz_class, unsigned int);
+safe_conversion(mpz_class, unsigned long);
+//safe_conversion(mpz_class, unsigned long long);
+
+safe_conversion(mpq_class, signed char);
+safe_conversion(mpq_class, signed short);
+safe_conversion(mpq_class, signed int);
+safe_conversion(mpq_class, signed long);
+//safe_conversion(mpq_class, signed long long);
+safe_conversion(mpq_class, unsigned char);
+safe_conversion(mpq_class, unsigned short);
+safe_conversion(mpq_class, unsigned int);
+safe_conversion(mpq_class, unsigned long);
+//safe_conversion(mpq_class, unsigned long long);
+safe_conversion(mpq_class, float);
+safe_conversion(mpq_class, double);
+//safe_conversion(mpq_class, long double);
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(construct)<Policy, Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    new (&to) Type(from);
     return V_EQ;
   }
-  return VC_NORMAL;
-}
+};
 
-template <typename Policy, typename T>
-inline bool
-is_nan_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_nan();
-}
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+struct FUNCTION_CLASS(construct) {
+  static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+    new (&to) To();
+    return assign<To_Policy, From_Policy>(to, from, dir);
+  }
+};
 
-template <typename Policy, typename T>
-inline bool
-is_minf_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_inf() < 0;
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_exact(To& to, const From& from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
 }
 
-template <typename Policy, typename T>
-inline bool
-is_pinf_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_inf() > 0;
+template <typename To_Policy, typename From_Policy, typename Type>
+inline typename Enable_If<Is_Same<To_Policy, From_Policy>::value, void>::type
+copy_generic(Type& to, const Type& from) {
+  to = from;
 }
 
-template <typename T>
-inline bool
-is_inf_float(const T v) {
-  Float<T> f(v);
-  return f.u.binary.is_inf() != 0;
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+  if (from < 0)
+    return neg<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign<To_Policy, From_Policy>(to, from, dir);
 }
 
-template <typename Policy, typename T>
-inline bool
-is_int_float(const T v) {
-  return rint(v) == v;
+inline Result
+neg(Result r) {
+  assert(!is_special(r));
+  Result ret = static_cast<Result>(r & V_EQ);
+  if (r & V_LT)
+    ret = static_cast<Result>(ret | V_GT);
+  if (r & V_GT)
+    ret = static_cast<Result>(ret | V_LT);
+  return ret;
 }
 
-template <typename Policy, typename T>
 inline Result
-set_special_float(T& v, Result r) {
-  switch (classify(r)) {
-  case VC_MINUS_INFINITY:
-    v = -HUGE_VAL;
-    break;
-  case VC_PLUS_INFINITY:
-    v = HUGE_VAL;
-    break;
-  case VC_NAN:
-    v = NAN;
-    break;
-  default:
-    break;
-  }
-  return r;
+add(Result r1, Result r2) {
+  assert(!is_special(r1));
+  assert(!is_special(r2));
+  if (r1 == V_EQ)
+    return r2;
+  if (r2 == V_EQ)
+    return r1;
+  if (((r1 & V_LT) && (r2 & V_GT))
+      || ((r1 & V_GT) && (r2 & V_LT)))
+    return V_LGE;
+  return static_cast<Result>((((r1 & r2) & V_EQ) ? V_EQ : 0) |
+			       (r1 & (V_LT | V_GT)));
 }
 
-template <typename T>
-inline void
-pred_float(T& v) {
-  Float<T> f(v);
-  assert(!f.u.binary.is_nan());
-  assert(f.u.binary.is_inf() >= 0);
-  if (f.u.binary.is_zero() > 0) {
-    f.u.binary.negate();
-    f.u.binary.inc();
-  }
-  else if (f.u.binary.sign_bit()) {
-    f.u.binary.inc();
-  }
-  else {
-    f.u.binary.dec();
-  }
-  v = f.value();
+inline Result
+sub(Result r1, Result r2) {
+  return add(r1, neg(r2));
 }
 
-template <typename T>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From>
 inline void
-succ_float(T& v) {
-  Float<T> f(v);
-  assert(!f.u.binary.is_nan());
-  assert(f.u.binary.is_inf() <= 0);
-  if (f.u.binary.is_zero() < 0) {
-    f.u.binary.negate();
-    f.u.binary.inc();
-  }
-  else if (!f.u.binary.sign_bit()) {
-    f.u.binary.inc();
-  }
-  else {
-    f.u.binary.dec();
+gcd_exact_noabs(To& to, const From& x, const From& y) {
+  To nx = x;
+  To ny = y;
+  To rm;
+  while (ny != 0) {
+    // The following is derived from the assumption that x % y
+    // is always representable. This is true for both native integers
+    // and IEC 559 floating point numbers.
+    rem<To_Policy, From1_Policy, From2_Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
+    nx = ny;
+    ny = rm;
   }
-  v = f.value();
+  to = nx;
 }
 
-template <typename Policy, typename To>
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
 inline Result
-round_lt_float(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
-    pred_float(to);
-    return V_GT;
-  }
-  return V_LT;
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  gcd_exact_noabs<To_Policy, From1_Policy, From2_Policy>(to, x, y);
+  return abs<To_Policy, To_Policy>(to, to, dir);
 }
 
-template <typename Policy, typename To>
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+	  typename From1_Policy, typename From2_Policy,
+	  typename To1, typename To2, typename To3,
+	  typename From1, typename From2>
 inline Result
-round_gt_float(To& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
-    succ_float(to);
-    return V_LT;
+gcdext_exact(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+	     Rounding_Dir dir) {
+  // In case this becomes a bottleneck, we may consider using the
+  // Stehle'-Zimmermann algorithm (see R. Crandall and C. Pomerance,
+  // Prime Numbers - A Computational Perspective, Second Edition,
+  // Springer, 2005).
+  if (y == 0) {
+    if (x == 0) {
+      s = 0;
+      t = 1;
+      return V_EQ;
+    }
+    else {
+      if (x < 0)
+	s = -1;
+      else
+	s = 1;
+      t = 0;
+      return abs<To1_Policy, From1_Policy>(to, x, dir);
+    }
   }
-  return V_GT;
-}
 
-template <typename Policy>
-inline void
-prepare_inexact(Rounding_Dir dir) {
-  if (Policy::fpu_check_inexact && dir != ROUND_IGNORE)
-    fpu_reset_inexact();
-}
-
-template <typename Policy>
-inline Result
-result_relation(Rounding_Dir dir) {
-  if (Policy::fpu_check_inexact) {
-    if (!fpu_check_inexact())
-      return V_EQ;
-    switch (dir) {
-    case ROUND_DOWN:
+  s = 1;
+  t = 0;
+  bool negative_x = x < 0;
+  bool negative_y = y < 0;
+
+  Result r;
+  r = abs<To1_Policy, From1_Policy>(to, x, dir);
+  if (r != V_EQ)
+    return r;
+
+  From2 ay;
+  r = abs<To1_Policy, From2_Policy>(ay, y, dir);
+  if (r != V_EQ)
+    return r;
+
+  // If COPY_GMP is defined then s is favored when the absolute
+  // values of the given numbers are equal.  For instance if x and y
+  // are both 5 then s will be 1 and t will be 0, instead of the other
+  // way round.  This is to match the behavior of GMP.
+#define COPY_GMP
+#ifdef COPY_GMP
+  if (to == ay)
+    goto sign_check;
+#endif
+
+  {
+    To2 v1 = 0;
+    To3 v2 = 1;
+    To1 v3 = static_cast<To1>(ay);
+    while (true) {
+      To1 q = to / v3;
+      // Remainder, next candidate GCD.
+      To1 t3 = to - q*v3;
+      To2 t1 = s - static_cast<To2>(q)*v1;
+      To3 t2 = t - static_cast<To3>(q)*v2;
+      s = v1;
+      t = v2;
+      to = v3;
+      if (t3 == 0)
+	break;
+      v1 = t1;
+      v2 = t2;
+      v3 = t3;
+    }
+  }
+
+#ifdef COPY_GMP
+ sign_check:
+#endif
+  if (negative_x) {
+    r = neg<To2_Policy, To2_Policy>(s, s, dir);
+    if (r != V_EQ)
+      return r;
+  }
+  if (negative_y)
+    return neg<To3_Policy, To3_Policy>(t, t, dir);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (x == 0 || y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  To nx, ny;
+  Result r;
+  r = abs<From1_Policy, From1_Policy>(nx, x, dir);
+  if (r != V_EQ)
+    return r;
+  r = abs<From2_Policy, From2_Policy>(ny, y, dir);
+  if (r != V_EQ)
+    return r;
+  To gcd;
+  gcd_exact_noabs<To_Policy, From1_Policy, From2_Policy>(gcd, nx, ny);
+  // The following is derived from the assumption that x / gcd(x, y)
+  // is always representable. This is true for both native integers
+  // and IEC 559 floating point numbers.
+  div<To_Policy, From1_Policy, To_Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
+  return mul<To_Policy, To_Policy, From2_Policy>(to, to, ny, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_generic(const Type& x) {
+  if (x > 0)
+    return V_GT;
+  if (x == 0)
+    return V_EQ;
+  return V_LT;
+}
+
+template <typename T1, typename T2, typename Enable = void>
+struct Safe_Int_Comparison : public False {
+};
+
+template <typename T1, typename T2>
+struct Safe_Int_Comparison<T1, T2, typename Enable_If<(C_Integer<T1>::value && C_Integer<T2>::value)>::type>
+  : public Bool<(C_Integer<T1>::is_signed
+		 ? (C_Integer<T2>::is_signed
+		    || sizeof(T2) < sizeof(T1)
+		    || sizeof(T2) < sizeof(int))
+		 : (!C_Integer<T2>::is_signed
+		    || sizeof(T1) < sizeof(T2)
+		    || sizeof(T1) < sizeof(int)))> {
+};
+
+
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+			   || Safe_Conversion<T1, T2>::value
+			   || Safe_Conversion<T2, T1>::value), bool>::type
+lt(const T1& x, const T2& y) {
+  return x < y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+			   || Safe_Conversion<T1, T2>::value
+			   || Safe_Conversion<T2, T1>::value), bool>::type
+le(const T1& x, const T2& y) {
+  return x <= y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+			   || Safe_Conversion<T1, T2>::value
+			   || Safe_Conversion<T2, T1>::value), bool>::type
+eq(const T1& x, const T2& y) {
+  return x == y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+lt(const S& x, const U& y) {
+  return x < 0 || x < y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+lt(const U& x, const S& y) {
+  return y >= 0 && x < y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+le(const S& x, const U& y) {
+  return x < 0 || x <= y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+le(const U& x, const S& y) {
+  return y >= 0 && x <= y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+eq(const S& x, const U& y) {
+  return x >= 0 && x == y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+			   && C_Integer<U>::value
+			   && C_Integer<S>::is_signed), bool>::type
+eq(const U& x, const S& y) {
+  return y >= 0 && x == y;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+			   && !Safe_Conversion<T2, T1>::value
+			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+eq(const T1& x, const T2& y) {
+  DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_CHECK);
+  return r == V_EQ && x == tmp;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+			   && !Safe_Conversion<T2, T1>::value
+			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+lt(const T1& x, const T2& y) {
+  DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_UP);
+  switch (r) {
+  case V_POS_OVERFLOW:
+  case VC_PLUS_INFINITY:
+    return true;
+  case V_EQ:
+  case V_LT:
+  case V_LE:
+    return x < tmp;
+  default:
+    return false;
+  }
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+			   && !Safe_Conversion<T2, T1>::value
+			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+le(const T1& x, const T2& y) {
+  DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, static_cast<Rounding_Dir>(ROUND_UP | ROUND_FPU_CHECK_INEXACT));
+  switch (r) {
+  case V_POS_OVERFLOW:
+  case VC_PLUS_INFINITY:
+    return true;
+  case V_EQ:
+    return x <= tmp;
+  case V_LT:
+    return x < tmp;
+  default:
+    return false;
+  }
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+lt_p(const Type1& x, const Type2& y) {
+  return lt(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+le_p(const Type1& x, const Type2& y) {
+  return le(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+eq_p(const Type1& x, const Type2& y) {
+  return eq(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline Result
+cmp_generic(const Type1& x, const Type2& y) {
+  if (lt(y, x))
+    return V_GT;
+  if (lt(x, y))
+    return V_LT;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+  DIRTY_TEMP0(mpq_class, q);
+  Result r = input_mpq(q, is);
+  if (r == VC_MINUS_INFINITY)
+    return assign<Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  if (r == VC_PLUS_INFINITY)
+    return assign<Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  if (r == V_EQ)
+    return assign<Policy, void>(to, q, dir);
+  return set_special<Policy>(to, r);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_int.inlines.hh line 1
+/* Specialized "checked" functions for native integer numbers.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_int.inlines.hh line 27
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+
+#if !PPL_HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !PPL_HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef PPL_HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+  static const Type plus_infinity = C_Integer<Type>::max;
+  static const Type minus_infinity = (C_Integer<Type>::min >= 0
+				      ? C_Integer<Type>::max - 1
+				      : C_Integer<Type>::min);
+  static const Type not_a_number = (C_Integer<Type>::min >= 0
+				    ? C_Integer<Type>::max - Policy::has_infinity * 2
+				    : C_Integer<Type>::min + Policy::has_infinity);
+  static const Type min = (C_Integer<Type>::min
+			   + (C_Integer<Type>::min >= 0 ? 0
+			      : (Policy::has_infinity + Policy::has_nan)));
+  static const Type max = (C_Integer<Type>::max
+			   - (C_Integer<Type>::min >= 0
+			      ? (2 * Policy::has_infinity + Policy::has_nan)
+			      : Policy::has_infinity));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT;
+  }
+  else {
+    if (Policy::has_infinity) {
+      to = Extended_Int<Policy, To>::minus_infinity;
       return V_GT;
-    case ROUND_UP:
-      return V_LT;
-    default:
-      return V_NE;
     }
+    return V_NEG_OVERFLOW;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT;
   }
   else {
-    switch (dir) {
-    case ROUND_DOWN:
-      return V_GE;
-    case ROUND_UP:
-      return V_LE;
+    if (Policy::has_infinity) {
+      to = Extended_Int<Policy, To>::plus_infinity;
+      return V_LT;
+    }
+    return V_POS_OVERFLOW;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    if (to == Extended_Int<Policy, To>::min) {
+      if (Policy::has_infinity) {
+	to = Extended_Int<Policy, To>::minus_infinity;
+	return V_GT;
+      }
+      return V_NEG_OVERFLOW;
+    }
+    else {
+      --to;
+      return V_GT;
+    }
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    if (to == Extended_Int<Policy, To>::max) {
+      if (Policy::has_infinity) {
+	to = Extended_Int<Policy, To>::plus_infinity;
+	return V_LT;
+      }
+      return V_POS_OVERFLOW;
+    }
+    else {
+      ++to;
+      return V_LT;
+    }
+  }
+  return V_GT;
+}
+
+SPECIALIZE_COPY(copy_generic, signed char)
+SPECIALIZE_COPY(copy_generic, signed short)
+SPECIALIZE_COPY(copy_generic, signed int)
+SPECIALIZE_COPY(copy_generic, signed long)
+SPECIALIZE_COPY(copy_generic, signed long long)
+SPECIALIZE_COPY(copy_generic, unsigned char)
+SPECIALIZE_COPY(copy_generic, unsigned short)
+SPECIALIZE_COPY(copy_generic, unsigned int)
+SPECIALIZE_COPY(copy_generic, unsigned long)
+SPECIALIZE_COPY(copy_generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+  if (Policy::has_nan
+      && (nan || sign)
+      && v == Extended_Int<Policy, Type>::not_a_number)
+    return VC_NAN;
+  if (!inf & !sign)
+    return VC_NORMAL;
+  if (Policy::has_infinity) {
+    if (v == Extended_Int<Policy, Type>::minus_infinity)
+      return inf ? VC_MINUS_INFINITY : V_LT;
+    if (v == Extended_Int<Policy, Type>::plus_infinity)
+      return inf ? VC_PLUS_INFINITY : V_GT;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(classify_int, signed char)
+SPECIALIZE_CLASSIFY(classify_int, signed short)
+SPECIALIZE_CLASSIFY(classify_int, signed int)
+SPECIALIZE_CLASSIFY(classify_int, signed long)
+SPECIALIZE_CLASSIFY(classify_int, signed long long)
+SPECIALIZE_CLASSIFY(classify_int, unsigned char)
+SPECIALIZE_CLASSIFY(classify_int, unsigned short)
+SPECIALIZE_CLASSIFY(classify_int, unsigned int)
+SPECIALIZE_CLASSIFY(classify_int, unsigned long)
+SPECIALIZE_CLASSIFY(classify_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+  return Policy::has_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+SPECIALIZE_IS_NAN(is_nan_int, signed char)
+SPECIALIZE_IS_NAN(is_nan_int, signed short)
+SPECIALIZE_IS_NAN(is_nan_int, signed int)
+SPECIALIZE_IS_NAN(is_nan_int, signed long)
+SPECIALIZE_IS_NAN(is_nan_int, signed long long)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned char)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned short)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned int)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned long)
+SPECIALIZE_IS_NAN(is_nan_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+  return Policy::has_infinity
+    && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+SPECIALIZE_IS_MINF(is_minf_int, signed char)
+SPECIALIZE_IS_MINF(is_minf_int, signed short)
+SPECIALIZE_IS_MINF(is_minf_int, signed int)
+SPECIALIZE_IS_MINF(is_minf_int, signed long)
+SPECIALIZE_IS_MINF(is_minf_int, signed long long)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned char)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned short)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned int)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned long)
+SPECIALIZE_IS_MINF(is_minf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+  return Policy::has_infinity
+    && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+SPECIALIZE_IS_PINF(is_pinf_int, signed char)
+SPECIALIZE_IS_PINF(is_pinf_int, signed short)
+SPECIALIZE_IS_PINF(is_pinf_int, signed int)
+SPECIALIZE_IS_PINF(is_pinf_int, signed long)
+SPECIALIZE_IS_PINF(is_pinf_int, signed long long)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned char)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned short)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned int)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned long)
+SPECIALIZE_IS_PINF(is_pinf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+  return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(is_int_int, signed char)
+SPECIALIZE_IS_INT(is_int_int, signed short)
+SPECIALIZE_IS_INT(is_int_int, signed int)
+SPECIALIZE_IS_INT(is_int_int, signed long)
+SPECIALIZE_IS_INT(is_int_int, signed long long)
+SPECIALIZE_IS_INT(is_int_int, unsigned char)
+SPECIALIZE_IS_INT(is_int_int, unsigned short)
+SPECIALIZE_IS_INT(is_int_int, unsigned int)
+SPECIALIZE_IS_INT(is_int_int, unsigned long)
+SPECIALIZE_IS_INT(is_int_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+set_special_int(Type& v, Result r) {
+  Result t = classify(r);
+  if (Policy::has_nan && t == VC_NAN)
+    v = Extended_Int<Policy, Type>::not_a_number;
+  else if (Policy::has_infinity) {
+    switch (t) {
+    case VC_MINUS_INFINITY:
+      v = Extended_Int<Policy, Type>::minus_infinity;
+      return V_EQ;
+    case VC_PLUS_INFINITY:
+      v = Extended_Int<Policy, Type>::plus_infinity;
+      return V_EQ;
     default:
-      return V_LGE;
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(set_special_int, signed char)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed short)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed int)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed long)
+SPECIALIZE_SET_SPECIAL(set_special_int, signed long long)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned char)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned short)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned int)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned long)
+SPECIALIZE_SET_SPECIAL(set_special_int, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+	  && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
+	      || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
+    if (CHECK_P(To_Policy::check_overflow,
+		from < static_cast<From>(Extended_Int<To_Policy, To>::min)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_overflow, from < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)) {
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+	  && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
+    if (CHECK_P(To_Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+
+#define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Larger, Smaller)
+
+#define ASSIGN_SIGNED(Type) \
+SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Type, Type)
+#define ASSIGN_UNSIGNED(Type) \
+SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Type, Type)
+
+ASSIGN_SIGNED(signed char)
+ASSIGN_SIGNED(signed short)
+ASSIGN_SIGNED(signed int)
+ASSIGN_SIGNED(signed long)
+ASSIGN_SIGNED(signed long long)
+ASSIGN_UNSIGNED(unsigned char)
+ASSIGN_UNSIGNED(unsigned short)
+ASSIGN_UNSIGNED(unsigned int)
+ASSIGN_UNSIGNED(unsigned long)
+ASSIGN_UNSIGNED(unsigned long long)
+
+ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      to = Extended_Int<To_Policy, To>::minus_infinity;
+      return V_EQ;
+    }
+    if (round_up(dir)) {
+      to = Extended_Int<To_Policy, To>::min;
+      return V_LT;
+    }
+    return VC_MINUS_INFINITY;
+  }
+  else if (is_pinf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      to = Extended_Int<To_Policy, To>::plus_infinity;
+      return V_EQ;
+    }
+    if (round_down(dir)) {
+      to = Extended_Int<To_Policy, To>::max;
+      return V_GT;
     }
+    return VC_PLUS_INFINITY;
   }
+  if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int<To_Policy, To>::min)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int<To_Policy, To>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = static_cast<To>(from);
+  if (round_ignore(dir))
+    return V_LGE;
+  if (from < to)
+    return round_lt_int<To_Policy>(to, dir);
+  else if (from > to)
+    return round_gt_int<To_Policy>(to, dir);
+  else
+    return V_EQ;
 }
 
-template <typename Policy, typename From, typename To>
-inline Result
-assign_float_float_exact(To& to, const From from, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  to = from;
-  return V_EQ;
-}
+SPECIALIZE_ASSIGN(assign_int_float, signed char, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed short, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed int, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed long, float)
+SPECIALIZE_ASSIGN(assign_int_float, signed long long, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned char, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned short, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned int, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long, float)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, float)
+
+SPECIALIZE_ASSIGN(assign_int_float, signed char, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed short, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed int, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long, double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long long, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned char, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned short, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned int, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long, double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, double)
+
+SPECIALIZE_ASSIGN(assign_int_float, signed char, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed short, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed int, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, signed long long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned char, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned short, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned int, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long, long double)
+SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, long double)
+
+#undef ASSIGN2_SIGNED_SIGNED
+#undef ASSIGN2_UNSIGNED_UNSIGNED
+#undef ASSIGN2_UNSIGNED_SIGNED
+#undef ASSIGN2_SIGNED_UNSIGNED
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(signed long)) {
+    if (!To_Policy::check_overflow) {
+      to = from.get_si();
+      return V_EQ;
+    }
+    if (from.fits_slong_p()) {
+      signed long v = from.get_si();
+      if (v < C_Integer<To>::min)
+	return set_neg_overflow_int<To_Policy>(to, dir);
+      if (v > C_Integer<To>::max)
+	return set_pos_overflow_int<To_Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0) {
+	to = 0;
+	return V_EQ;
+      }
+      To v;
+      mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+      if (v >= 0) {
+	if (::sgn(from) < 0)
+	  return neg<To_Policy, To_Policy>(to, v, dir);
+	to = v;
+	return V_EQ;
+      }
+    }
+  }
+  return ::sgn(from) < 0
+    ? set_neg_overflow_int<To_Policy>(to, dir)
+    : set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed char, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed short, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed int, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long, mpz_class)
+SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_overflow, ::sgn(from) < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (sizeof(To) <= sizeof(unsigned long)) {
+    if (!To_Policy::check_overflow) {
+      to = from.get_ui();
+      return V_EQ;
+    }
+    if (from.fits_ulong_p()) {
+      unsigned long v = from.get_ui();
+      if (v > C_Integer<To>::max)
+	return set_pos_overflow_int<To_Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0)
+	to = 0;
+      else
+	mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+      return V_EQ;
+    }
+  }
+  return set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned char, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned short, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned int, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long, mpz_class)
+SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  DIRTY_TEMP0(mpz_class, q);
+  mpz_ptr _q = q.get_mpz_t();
+  if (round_ignore(dir)) {
+    mpz_tdiv_q(_q, n, d);
+    Result r = assign<To_Policy, void>(to, q, dir);
+    if (r != V_EQ)
+      return r;
+    return V_LGE;
+  }
+  mpz_t rem;
+  int sign;
+  mpz_init(rem);
+  mpz_tdiv_qr(_q, rem, n, d);
+  sign = mpz_sgn(rem);
+  mpz_clear(rem);
+  Result r = assign<To_Policy, void>(to, q, dir);
+  if (r != V_EQ)
+    return r;
+  switch (sign) {
+  case -1:
+    return round_lt_int<To_Policy>(to, dir);
+  case 1:
+    return round_gt_int<To_Policy>(to, dir);
+  default:
+    return V_EQ;
+  }
+}
+
+SPECIALIZE_ASSIGN(assign_int_mpq, signed char, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed short, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed int, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed long, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, signed long long, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned char, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned short, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned int, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long, mpq_class)
+SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long long, mpq_class)
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architectures.
+//
+// Current guidelines:
+//   - avoid division where possible (larger type variant for mul)
+//   - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<signed char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef int_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef uint_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef uint_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed short> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef int_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef int_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef uint_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef uint_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<signed int> {
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_neg l = x;
+  l = -l;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_add l = x;
+  l += y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_sub l = x;
+  l -= y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_mul l = x;
+  l *= y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+	      (from < -Extended_Int<To_Policy, Type>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow, from != 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
+    if (y >= 0) {
+      if (x > Extended_Int<To_Policy, Type>::max - y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else if (x < Extended_Int<To_Policy, Type>::min - y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
+  }
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+	      (x > Extended_Int<To_Policy, Type>::max - y)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
+    if (y >= 0) {
+      if (x < Extended_Int<To_Policy, Type>::min + y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+    else if (x > Extended_Int<To_Policy, Type>::max + y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+	      (x < Extended_Int<To_Policy, Type>::min + y)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  if (x >= 0) {
+    if (y > 0) {
+      if (x > Extended_Int<To_Policy, Type>::max / y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else {
+      if (x > Extended_Int<To_Policy, Type>::min / y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+  }
+  else {
+    if (y < 0) {
+      if (x < Extended_Int<To_Policy, Type>::max / y)
+	return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else {
+      if (x < Extended_Int<To_Policy, Type>::min / y)
+	return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+  }
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (x > Extended_Int<To_Policy, Type>::max / y)
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  if (round_ignore(dir))
+    return V_LGE;
+  Type m = x % y;
+  if (m < 0)
+    return round_lt_int_no_overflow<To_Policy>(to, dir);
+  else if (m > 0)
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  if (round_ignore(dir))
+    return V_GE;
+  Type m = x % y;
+  if (m == 0)
+    return V_EQ;
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+idiv_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+idiv_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+rem_signed_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+rem_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+    to = 0;
+    if (round_ignore(dir))
+      return V_GE;
+    if (x == 0)
+      return V_EQ;
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  }
+  to = x >> exp;
+  if (round_ignore(dir))
+    return V_GE;
+  if (x & ((static_cast<Type>(1) << exp) - 1))
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+  zero:
+    to = 0;
+    if (round_ignore(dir))
+      return V_LGE;
+    if (x < 0)
+      return round_lt_int_no_overflow<To_Policy>(to, dir);
+    else if (x > 0)
+      return round_gt_int_no_overflow<To_Policy>(to, dir);
+    else
+      return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+    if (x == C_Integer<Type>::min) {
+      to = -1;
+      return V_EQ;
+    }
+    goto zero;
+  }
+#if 0
+  to = x / (static_cast<Type>(1) << exp);
+  if (round_ignore(dir))
+    return V_GE;
+  Type r = x % (static_cast<Type>(1) << exp);
+  if (r < 0)
+    return round_lt_int_no_overflow<To_Policy>(to, dir);
+  else if (r > 0)
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+#else
+  // Faster but compiler implementation dependent (see C++98 5.8.3)
+  to = x >> exp;
+  if (round_ignore(dir))
+    return V_GE;
+  if (x & ((static_cast<Type>(1) << exp) - 1))
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  return V_EQ;
+#endif
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  if (!To_Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+    if (x == 0) {
+      to = 0;
+      return V_EQ;
+    }
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  Type n = x << exp;
+  if (n > Extended_Int<To_Policy, Type>::max)
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = n;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  if (!To_Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+    if (x < 0)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    else if (x > 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    else {
+      to = 0;
+      return V_EQ;
+    }
+  }
+  Type mask = ((static_cast<Type>(1) << exp) - 1)
+    << (sizeof(Type) * 8 - 1 - exp);
+  Type n;
+  if (x < 0) {
+    if ((x & mask) != mask)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    n = x << exp;
+    if (n < Extended_Int<To_Policy, Type>::min)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+  }
+  else {
+    if (x & mask)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    n = x << exp;
+    if (n > Extended_Int<To_Policy, Type>::max)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = n;
+  return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrtrem(Type& q, Type& r, const Type from) {
+  q = 0;
+  r = from;
+  Type t(1);
+  for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) {
+    Type s = q + t;
+    if (s <= r) {
+      r -= s;
+      q = s + t;
+    }
+    q >>= 1;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  Type rem;
+  isqrtrem(to, rem, from);
+  if (round_ignore(dir))
+    return V_GE;
+  if (rem == 0)
+    return V_EQ;
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  return sqrt_unsigned_int<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_LT:
+    if (to <= 0) {
+      to = z;
+      return r;
+    }
+    return set_special<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case V_POS_OVERFLOW:
+  case V_GT:
+    if (to >= 0) {
+      to = z;
+      return r;
+    }
+    return set_special<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    return add<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_LT:
+    if (to >= 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    return V_UNKNOWN_NEG_OVERFLOW;
+  case V_POS_OVERFLOW:
+  case V_GT:
+    if (to <= 0)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    return V_UNKNOWN_POS_OVERFLOW;
+  default:
+    return sub<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+	    const Numeric_Format&, Rounding_Dir) {
+  os << static_cast<int>(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed char, signed char)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed short, signed short)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed int, signed int)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long, signed long)
+SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long long, signed long long)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed char, signed char)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed short, signed short)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed int, signed int)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long, signed long)
+SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long long, signed long long)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed char, signed char)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed short, signed short)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed int, signed int)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long, signed long)
+SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long long, signed long long)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_NEG(neg_signed_int, signed char, signed char)
+SPECIALIZE_NEG(neg_signed_int, signed short, signed short)
+SPECIALIZE_NEG(neg_signed_int, signed int, signed int)
+SPECIALIZE_NEG(neg_signed_int, signed long, signed long)
+SPECIALIZE_NEG(neg_signed_int, signed long long, signed long long)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_NEG(neg_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD(add_signed_int, signed char, signed char, signed char)
+SPECIALIZE_ADD(add_signed_int, signed short, signed short, signed short)
+SPECIALIZE_ADD(add_signed_int, signed int, signed int, signed int)
+SPECIALIZE_ADD(add_signed_int, signed long, signed long, signed long)
+SPECIALIZE_ADD(add_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD(add_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD(add_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD(add_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD(add_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD(add_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB(sub_signed_int, signed char, signed char, signed char)
+SPECIALIZE_SUB(sub_signed_int, signed short, signed short, signed short)
+SPECIALIZE_SUB(sub_signed_int, signed int, signed int, signed int)
+SPECIALIZE_SUB(sub_signed_int, signed long, signed long, signed long)
+SPECIALIZE_SUB(sub_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB(sub_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL(mul_signed_int, signed char, signed char, signed char)
+SPECIALIZE_MUL(mul_signed_int, signed short, signed short, signed short)
+SPECIALIZE_MUL(mul_signed_int, signed int, signed int, signed int)
+SPECIALIZE_MUL(mul_signed_int, signed long, signed long, signed long)
+SPECIALIZE_MUL(mul_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_MUL(mul_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV(div_signed_int, signed char, signed char, signed char)
+SPECIALIZE_DIV(div_signed_int, signed short, signed short, signed short)
+SPECIALIZE_DIV(div_signed_int, signed int, signed int, signed int)
+SPECIALIZE_DIV(div_signed_int, signed long, signed long, signed long)
+SPECIALIZE_DIV(div_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_DIV(div_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_DIV(div_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_DIV(div_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_DIV(div_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_DIV(div_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_IDIV(idiv_signed_int, signed char, signed char, signed char)
+SPECIALIZE_IDIV(idiv_signed_int, signed short, signed short, signed short)
+SPECIALIZE_IDIV(idiv_signed_int, signed int, signed int, signed int)
+SPECIALIZE_IDIV(idiv_signed_int, signed long, signed long, signed long)
+SPECIALIZE_IDIV(idiv_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_REM(rem_signed_int, signed char, signed char, signed char)
+SPECIALIZE_REM(rem_signed_int, signed short, signed short, signed short)
+SPECIALIZE_REM(rem_signed_int, signed int, signed int, signed int)
+SPECIALIZE_REM(rem_signed_int, signed long, signed long, signed long)
+SPECIALIZE_REM(rem_signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_REM(rem_unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_REM(rem_unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_REM(rem_unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_REM(rem_unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_REM(rem_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed char, signed char)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed short, signed short)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed int, signed int)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long, signed long)
+SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long long, signed long long)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed char, signed char)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed short, signed short)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed int, signed int)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long, signed long)
+SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long long, signed long long)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_SQRT(sqrt_signed_int, signed char, signed char)
+SPECIALIZE_SQRT(sqrt_signed_int, signed short, signed short)
+SPECIALIZE_SQRT(sqrt_signed_int, signed int, signed int)
+SPECIALIZE_SQRT(sqrt_signed_int, signed long, signed long)
+SPECIALIZE_SQRT(sqrt_signed_int, signed long long, signed long long)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ABS(abs_generic, signed char, signed char)
+SPECIALIZE_ABS(abs_generic, signed short, signed short)
+SPECIALIZE_ABS(abs_generic, signed int, signed int)
+SPECIALIZE_ABS(abs_generic, signed long, signed long)
+SPECIALIZE_ABS(abs_generic, signed long long, signed long long)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCD(gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_GCD(gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_GCD(gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_GCD(gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_GCD(gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_GCD(gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCD(gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCD(gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCD(gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCD(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCDEXT(gcdext_exact, signed char, signed char, signed char, signed char, signed char)
+SPECIALIZE_GCDEXT(gcdext_exact, signed short, signed short, signed short, signed short, signed short)
+SPECIALIZE_GCDEXT(gcdext_exact, signed int, signed int, signed int, signed int, signed int)
+SPECIALIZE_GCDEXT(gcdext_exact, signed long, signed long, signed long, signed long, signed long)
+SPECIALIZE_GCDEXT(gcdext_exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCDEXT(gcdext_exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_LCM(lcm_gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_LCM(lcm_gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_LCM(lcm_gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_LCM(lcm_gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_LCM(lcm_gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_LCM(lcm_gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SGN(sgn_generic, signed char)
+SPECIALIZE_SGN(sgn_generic, signed short)
+SPECIALIZE_SGN(sgn_generic, signed int)
+SPECIALIZE_SGN(sgn_generic, signed long)
+SPECIALIZE_SGN(sgn_generic, signed long long)
+SPECIALIZE_SGN(sgn_generic, unsigned char)
+SPECIALIZE_SGN(sgn_generic, unsigned short)
+SPECIALIZE_SGN(sgn_generic, unsigned int)
+SPECIALIZE_SGN(sgn_generic, unsigned long)
+SPECIALIZE_SGN(sgn_generic, unsigned long long)
+
+SPECIALIZE_CMP(cmp_generic, signed char, signed char)
+SPECIALIZE_CMP(cmp_generic, signed short, signed short)
+SPECIALIZE_CMP(cmp_generic, signed int, signed int)
+SPECIALIZE_CMP(cmp_generic, signed long, signed long)
+SPECIALIZE_CMP(cmp_generic, signed long long, signed long long)
+SPECIALIZE_CMP(cmp_generic, unsigned char, unsigned char)
+SPECIALIZE_CMP(cmp_generic, unsigned short, unsigned short)
+SPECIALIZE_CMP(cmp_generic, unsigned int, unsigned int)
+SPECIALIZE_CMP(cmp_generic, unsigned long, unsigned long)
+SPECIALIZE_CMP(cmp_generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD_MUL(add_mul_int, signed char, signed char, signed char)
+SPECIALIZE_ADD_MUL(add_mul_int, signed short, signed short, signed short)
+SPECIALIZE_ADD_MUL(add_mul_int, signed int, signed int, signed int)
+SPECIALIZE_ADD_MUL(add_mul_int, signed long, signed long, signed long)
+SPECIALIZE_ADD_MUL(add_mul_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD_MUL(add_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB_MUL(sub_mul_int, signed char, signed char, signed char)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed short, signed short, signed short)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed int, signed int, signed int)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed long, signed long, signed long)
+SPECIALIZE_SUB_MUL(sub_mul_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_INPUT(input_generic, signed char)
+SPECIALIZE_INPUT(input_generic, signed short)
+SPECIALIZE_INPUT(input_generic, signed int)
+SPECIALIZE_INPUT(input_generic, signed long)
+SPECIALIZE_INPUT(input_generic, signed long long)
+SPECIALIZE_INPUT(input_generic, unsigned char)
+SPECIALIZE_INPUT(input_generic, unsigned short)
+SPECIALIZE_INPUT(input_generic, unsigned int)
+SPECIALIZE_INPUT(input_generic, unsigned long)
+SPECIALIZE_INPUT(input_generic, unsigned long long)
+
+SPECIALIZE_OUTPUT(output_char, signed char)
+SPECIALIZE_OUTPUT(output_int, signed short)
+SPECIALIZE_OUTPUT(output_int, signed int)
+SPECIALIZE_OUTPUT(output_int, signed long)
+SPECIALIZE_OUTPUT(output_int, signed long long)
+SPECIALIZE_OUTPUT(output_char, unsigned char)
+SPECIALIZE_OUTPUT(output_int, unsigned short)
+SPECIALIZE_OUTPUT(output_int, unsigned int)
+SPECIALIZE_OUTPUT(output_int, unsigned long)
+SPECIALIZE_OUTPUT(output_int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_float.inlines.hh line 1
+/* Specialized "checked" functions for native floating-point numbers.
+*/
+
+
+#ifndef __alpha
+#include <cmath>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+fma(float x, float y, float z) {
+#if PPL_HAVE_DECL_FMAF && !defined(__alpha)
+  return ::fmaf(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline double
+fma(double x, double y, double z) {
+#if PPL_HAVE_DECL_FMA && !defined(__alpha)
+  return ::fma(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline long double
+fma(long double x, long double y, long double z) {
+#if PPL_HAVE_DECL_FMAL && !defined(__alpha)
+  return ::fmal(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if PPL_HAVE_DECL_RINTF
+inline float
+rint(float x) {
+  return ::rintf(x);
+}
+#endif
+
+inline double
+rint(double x) {
+  return ::rint(x);
+}
+
+#if PPL_HAVE_DECL_RINTL
+inline long double
+rint(long double x) {
+  return ::rintl(x);
+}
+#elif !PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+// If proper long doubles are not provided, this is most likely
+// because long double and double are the same type: use rint().
+inline long double
+rint(long double x) {
+  return ::rint(x);
+}
+#elif defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// On Cygwin, we have proper long doubles but rintl() is not defined:
+// luckily, one machine instruction is enough to save the day.
+inline long double
+rint(long double x) {
+  long double i;
+  __asm__ ("frndint" : "=t" (i) : "0" (x));
+  return i;
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+  return round_direct(dir) || round_ignore(dir);
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+  return round_inverse(dir);
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = a * b = 0.03
+//   c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+//   c_i = -c_i = 0.03
+//   c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline float
+limit_precision(float v) {
+  float x = v;
+  avoid_cse(x);
+  return x;
+}
+
+inline double
+limit_precision(double v) {
+  double x = v;
+  avoid_cse(x);
+  return x;
+}
+
+inline long double
+limit_precision(long double v) {
+  return v;
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+  Float<T> f(v);
+  if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan()))
+    return VC_NAN;
+  if (inf) {
+    int i = CHECK_P(Policy::has_infinity, f.u.binary.is_inf());
+    if (i < 0)
+      return VC_MINUS_INFINITY;
+    if (i > 0)
+      return VC_PLUS_INFINITY;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return VC_NORMAL;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_nan, f.u.binary.is_nan());
+}
+
+template <typename Policy, typename T>
+inline int
+is_inf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, f.u.binary.is_inf());
+}
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+  return is_inf_float<Policy>(v) < 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+  return is_inf_float<Policy>(v) > 0;
+}
+
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+  return rint(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+set_special_float(T& v, Result r) {
+  switch (classify(r)) {
+  case VC_MINUS_INFINITY:
+    v = -HUGE_VAL;
+    break;
+  case VC_PLUS_INFINITY:
+    v = HUGE_VAL;
+    break;
+  case VC_NAN:
+    v = NAN;
+    break;
+  default:
+    break;
+  }
+  return r;
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+  Float<T> f(v);
+  assert(!f.u.binary.is_nan());
+  assert(f.u.binary.is_inf() >= 0);
+  if (f.u.binary.is_zero() > 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+  Float<T> f(v);
+  assert(!f.u.binary.is_nan());
+  assert(f.u.binary.is_inf() <= 0);
+  if (f.u.binary.is_zero() < 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (!f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    pred_float(to);
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    succ_float(to);
+    return V_LT;
+  }
+  return V_GT;
+}
+
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact && round_fpu_check_inexact(dir))
+    fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact && round_fpu_check_inexact(dir)) {
+    switch (fpu_check_inexact()) {
+    case 0:
+      return V_EQ;
+    case -1:
+      goto unknown;
+    case 1:
+      break;
+    }
+    switch (round_dir(dir)) {
+    case ROUND_DOWN:
+      return V_GT;
+    case ROUND_UP:
+      return V_LT;
+    default:
+      return V_NE;
+    }
+  }
+  else {
+  unknown:
+    switch (round_dir(dir)) {
+    case ROUND_DOWN:
+      return V_GE;
+    case ROUND_UP:
+      return V_LE;
+    default:
+      return V_LGE;
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else if (fpu_inverse_rounding(dir))
+    to = -static_cast<To>(-from);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(from);
+    to = from;
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) > sizeof(To))
+    return assign_float_float_inexact<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign_float_float_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+floor_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (fpu_direct_rounding(ROUND_DOWN))
+    to = rint(from);
+  else if (fpu_inverse_rounding(ROUND_DOWN))
+    to = -limit_precision(rint(-from));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(ROUND_DOWN));
+    avoid_cse(from);
+    to = rint(from);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+ceil_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (fpu_direct_rounding(ROUND_UP))
+    to = rint(from);
+  else if (fpu_inverse_rounding(ROUND_UP))
+    to = -limit_precision(rint(-from));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(ROUND_UP));
+    avoid_cse(from);
+    to = rint(from);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+trunc_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (from >= 0)
+    return floor<To_Policy, From_Policy>(to, from, dir);
+  else
+    return ceil<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_add_inf
+      && is_inf_float<From1_Policy>(x) && x == -y)
+    return set_special<To_Policy>(to, V_INF_ADD_INF);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x + y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(-x - y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
+    to = x + y;
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_sub_inf
+      && is_inf_float<From1_Policy>(x) && x == y)
+    return set_special<To_Policy>(to, V_INF_SUB_INF);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x - y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(y - x);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
+    to = x - y;
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y)) ||
+	  (y == 0 && is_inf_float<From1_Policy>(x))))
+    return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x * y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(x * -y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
+    to = x * y;
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_div_inf
+      && is_inf_float<From1_Policy>(x) && is_inf_float<From2_Policy>(y))
+    return set_special<To_Policy>(to, V_INF_DIV_INF);
+  if (To_Policy::check_div_zero && y == 0)
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x / y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(x / -y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
+    to = x / y;
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+idiv_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type temp;
+  // The inexact check is useless
+  dir = round_dir(dir);
+  Result r = div<To_Policy, From1_Policy, From2_Policy>(temp, x, y, dir);
+  if (is_special(r)) {
+    to = temp;
+    return r;
+  }
+  Result r1 = trunc<To_Policy, To_Policy>(to, temp, ROUND_NOT_NEEDED);
+  assert(r1 == V_EQ);
+  if (r == V_EQ || to != temp)
+    return r1;
+  // FIXME: Prove that it's impossibile to return a strict relation
+  return dir == ROUND_UP ? V_LE : V_GE;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (To_Policy::check_inf_mod && is_inf_float<From1_Policy>(x))
+    return set_special<To_Policy>(to, V_INF_MOD);
+  if (To_Policy::check_div_zero && y == 0)
+    return set_special<To_Policy>(to, V_MOD_ZERO);
+  to = std::fmod(x, y);
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return V_EQ;
+}
+
+struct Float_2exp {
+  const_bool_nodef(has_nan, false);
+  const_bool_nodef(has_infinity, false);
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (exp < 0)
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+  return mul<To_Policy, From_Policy, Float_2exp>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (exp < 0)
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+  return div<To_Policy, From_Policy, Float_2exp>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  to = std::abs(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_nan_result && is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (To_Policy::check_sqrt_neg && from < 0)
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = std::sqrt(from);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(from);
+    to = std::sqrt(from);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_float(const Type x) {
+  return classify<Policy>(x, false, false, true);
+}
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result
+cmp_float(const Type x, const Type y) {
+  if (x > y)
+    return V_GT;
+  if (x < y)
+    return V_LT;
+  if (x == y)
+    return V_EQ;
+  return V_UNORD_COMP;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(from);
+    to = from;
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
+    return assign_float_int_inexact<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    {
+      Float<T> f;
+      f.u.binary.set_max(true);
+      to = f.value();
+      return V_LT;
+    }
+  default:
+    to = -HUGE_VAL;
+    return V_GT;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_DOWN:
+    {
+      Float<T> f;
+      f.u.binary.set_max(false);
+      to = f.value();
+      return V_GT;
+    }
+  default:
+    to = HUGE_VAL;
+    return V_LT;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
+{
+  mpz_srcptr from = _from.get_mpz_t();
+  int sign = mpz_sgn(from);
+  if (sign == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  size_t exponent = mpz_sizeinbase(from, 2) - 1;
+  if (exponent > static_cast<size_t>(Float<T>::Binary::EXPONENT_MAX)) {
+    if (sign < 0)
+      return set_neg_overflow_float<To_Policy>(to, dir);
+    else
+      return set_pos_overflow_float<To_Policy>(to, dir);
+  }
+  unsigned long zeroes = mpn_scan1(from->_mp_d, 0);
+  size_t meaningful_bits = exponent - zeroes;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  if (exponent > Float<T>::Binary::MANTISSA_BITS)
+    mpz_tdiv_q_2exp(mantissa,
+		    from,
+		    exponent - Float<T>::Binary::MANTISSA_BITS);
+  else
+    mpz_mul_2exp(mantissa, from, Float<T>::Binary::MANTISSA_BITS - exponent);
+  Float<T> f(to);
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+    if (sign < 0)
+      return round_lt_float<To_Policy>(to, dir);
+    else
+      return round_gt_float<To_Policy>(to, dir);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
+{
+  const mpz_class& _num = from.get_num();
+  const mpz_class& _den = from.get_den();
+  if (_den == 1)
+    return assign_float_mpz<To_Policy, From_Policy>(to, _num, dir);
+  mpz_srcptr num = _num.get_mpz_t();
+  mpz_srcptr den = _den.get_mpz_t();
+  int sign = mpz_sgn(num);
+  signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2);
+  if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+    to = 0;
+  inexact:
+    if (sign < 0)
+      return round_lt_float<To_Policy>(to, dir);
+    else
+      return round_gt_float<To_Policy>(to, dir);
+  }
+  if (exponent > static_cast<signed int>(Float<T>::Binary::EXPONENT_MAX + 1)) {
+  overflow:
+    if (sign < 0)
+      return set_neg_overflow_float<To_Policy>(to, dir);
+    else
+      return set_pos_overflow_float<To_Policy>(to, dir);
+  }
+  unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+  if (exponent < Float<T>::Binary::EXPONENT_MIN)
+    needed_bits -= Float<T>::Binary::EXPONENT_MIN - exponent;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  signed long shift = needed_bits - exponent;
+  if (shift > 0) {
+    mpz_mul_2exp(mantissa, num, shift);
+    num = mantissa;
+  }
+  else if (shift < 0) {
+    mpz_mul_2exp(mantissa, den, -shift);
+    den = mantissa;
+  }
+  mpz_t r;
+  mpz_init(r);
+  mpz_tdiv_qr(mantissa, r, num, den);
+  size_t bits = mpz_sizeinbase(mantissa, 2);
+  bool inexact = (mpz_sgn(r) != 0);
+  mpz_clear(r);
+  if (bits == needed_bits + 1) {
+    inexact = (inexact || mpz_odd_p(mantissa));
+    mpz_div_2exp(mantissa, mantissa, 1);
+  }
+  else
+    --exponent;
+  if (exponent > static_cast<signed int>(Float<T>::Binary::EXPONENT_MAX)) {
+    mpz_clear(mantissa);
+    goto overflow;
+  }
+  else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+    // Denormalized.
+    exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+  }
+  Float<T> f(to);
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (inexact)
+    goto inexact;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y)) ||
+	  (y == 0 && is_inf_float<From1_Policy>(x))))
+    return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = fma(x, y, to);
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(fma(-x, y, -to));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
+    to = fma(x, y, to);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y)) ||
+	  (y == 0 && is_inf_float<From1_Policy>(x))))
+    return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = fma(x, -y, to);
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(fma(x, y, -to));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(round_fpu_dir(dir));
+    avoid_cse(x);
+    avoid_cse(y);
+    to = fma(x, -y, to);
+    avoid_cse(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::check_nan_result && is_nan<To_Policy>(to))
+    return VC_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+	     Rounding_Dir) {
+  if (from == 0)
+    os << "0";
+  else if (is_minf<Policy>(from))
+    os << "-inf";
+  else if (is_pinf<Policy>(from))
+    os << "+inf";
+  else if (is_nan<Policy>(from))
+    os << "nan";
+  else {
+    int old_precision = os.precision(10000);
+    // FIXME: here correctness depends on the behavior of the standard
+    // output operator which, in turn, may depend on the behavior
+    // of printf().  The C99 standard, 7.19.6#13, does not give
+    // enough guarantees.  We could not find something similar
+    // in the C++ standard, but perhaps there is a concrete danger here.
+    os << from;
+    os.precision(old_precision);
+  }
+  return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_ASSIGN(assign_float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(assign_float_float, float, double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(assign_float_float, float, long double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(assign_float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(assign_float_float, double, long double)
+SPECIALIZE_ASSIGN(assign_float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(assign_float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_CLASSIFY(classify_float, float)
+SPECIALIZE_IS_NAN(is_nan_float, float)
+SPECIALIZE_IS_MINF(is_minf_float, float)
+SPECIALIZE_IS_PINF(is_pinf_float, float)
+SPECIALIZE_SET_SPECIAL(set_special_float, float)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed char)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed short)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed int)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed long)
+SPECIALIZE_ASSIGN(assign_float_int, float, signed long long)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned char)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned short)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned int)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long)
+SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long long)
+SPECIALIZE_ASSIGN(assign_float_mpz, float, mpz_class)
+SPECIALIZE_ASSIGN(assign_float_mpq, float, mpq_class)
+SPECIALIZE_COPY(copy_generic, float)
+SPECIALIZE_IS_INT(is_int_float, float)
+SPECIALIZE_FLOOR(floor_float, float, float)
+SPECIALIZE_CEIL(ceil_float, float, float)
+SPECIALIZE_TRUNC(trunc_float, float, float)
+SPECIALIZE_NEG(neg_float, float, float)
+SPECIALIZE_ABS(abs_float, float, float)
+SPECIALIZE_ADD(add_float, float, float, float)
+SPECIALIZE_SUB(sub_float, float, float, float)
+SPECIALIZE_MUL(mul_float, float, float, float)
+SPECIALIZE_DIV(div_float, float, float, float)
+SPECIALIZE_REM(rem_float, float, float, float)
+SPECIALIZE_MUL2EXP(mul2exp_float, float, float)
+SPECIALIZE_DIV2EXP(div2exp_float, float, float)
+SPECIALIZE_SQRT(sqrt_float, float, float)
+SPECIALIZE_GCD(gcd_exact, float, float, float)
+SPECIALIZE_GCDEXT(gcdext_exact, float, float, float, float, float)
+SPECIALIZE_LCM(lcm_gcd_exact, float, float, float)
+SPECIALIZE_SGN(sgn_float, float)
+SPECIALIZE_CMP(cmp_float, float, float)
+SPECIALIZE_ADD_MUL(add_mul_float, float, float, float)
+SPECIALIZE_SUB_MUL(sub_mul_float, float, float, float)
+SPECIALIZE_INPUT(input_generic, float)
+SPECIALIZE_OUTPUT(output_float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_CLASSIFY(classify_float, double)
+SPECIALIZE_IS_NAN(is_nan_float, double)
+SPECIALIZE_IS_MINF(is_minf_float, double)
+SPECIALIZE_IS_PINF(is_pinf_float, double)
+SPECIALIZE_SET_SPECIAL(set_special_float, double)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed char)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed short)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed int)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed long)
+SPECIALIZE_ASSIGN(assign_float_int, double, signed long long)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned char)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned short)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned int)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long)
+SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long long)
+SPECIALIZE_ASSIGN(assign_float_mpz, double, mpz_class)
+SPECIALIZE_ASSIGN(assign_float_mpq, double, mpq_class)
+SPECIALIZE_COPY(copy_generic, double)
+SPECIALIZE_IS_INT(is_int_float, double)
+SPECIALIZE_FLOOR(floor_float, double, double)
+SPECIALIZE_CEIL(ceil_float, double, double)
+SPECIALIZE_TRUNC(trunc_float, double, double)
+SPECIALIZE_NEG(neg_float, double, double)
+SPECIALIZE_ABS(abs_float, double, double)
+SPECIALIZE_ADD(add_float, double, double, double)
+SPECIALIZE_SUB(sub_float, double, double, double)
+SPECIALIZE_MUL(mul_float, double, double, double)
+SPECIALIZE_DIV(div_float, double, double, double)
+SPECIALIZE_REM(rem_float, double, double, double)
+SPECIALIZE_MUL2EXP(mul2exp_float, double, double)
+SPECIALIZE_DIV2EXP(div2exp_float, double, double)
+SPECIALIZE_SQRT(sqrt_float, double, double)
+SPECIALIZE_GCD(gcd_exact, double, double, double)
+SPECIALIZE_GCDEXT(gcdext_exact, double, double, double, double, double)
+SPECIALIZE_LCM(lcm_gcd_exact, double, double, double)
+SPECIALIZE_SGN(sgn_float, double)
+SPECIALIZE_CMP(cmp_float, double, double)
+SPECIALIZE_ADD_MUL(add_mul_float, double, double, double)
+SPECIALIZE_SUB_MUL(sub_mul_float, double, double, double)
+SPECIALIZE_INPUT(input_generic, double)
+SPECIALIZE_OUTPUT(output_float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_CLASSIFY(classify_float, long double)
+SPECIALIZE_IS_NAN(is_nan_float, long double)
+SPECIALIZE_IS_MINF(is_minf_float, long double)
+SPECIALIZE_IS_PINF(is_pinf_float, long double)
+SPECIALIZE_SET_SPECIAL(set_special_float, long double)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed char)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed short)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed int)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed long)
+SPECIALIZE_ASSIGN(assign_float_int, long double, signed long long)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned char)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned short)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned int)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long)
+SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long long)
+SPECIALIZE_ASSIGN(assign_float_mpz, long double, mpz_class)
+SPECIALIZE_ASSIGN(assign_float_mpq, long double, mpq_class)
+SPECIALIZE_COPY(copy_generic, long double)
+SPECIALIZE_IS_INT(is_int_float, long double)
+SPECIALIZE_FLOOR(floor_float, long double, long double)
+SPECIALIZE_CEIL(ceil_float, long double, long double)
+SPECIALIZE_TRUNC(trunc_float, long double, long double)
+SPECIALIZE_NEG(neg_float, long double, long double)
+SPECIALIZE_ABS(abs_float, long double, long double)
+SPECIALIZE_ADD(add_float, long double, long double, long double)
+SPECIALIZE_SUB(sub_float, long double, long double, long double)
+SPECIALIZE_MUL(mul_float, long double, long double, long double)
+SPECIALIZE_DIV(div_float, long double, long double, long double)
+SPECIALIZE_REM(rem_float, long double, long double, long double)
+SPECIALIZE_MUL2EXP(mul2exp_float, long double, long double)
+SPECIALIZE_DIV2EXP(div2exp_float, long double, long double)
+SPECIALIZE_SQRT(sqrt_float, long double, long double)
+SPECIALIZE_GCD(gcd_exact, long double, long double, long double)
+SPECIALIZE_GCDEXT(gcdext_exact, long double, long double, long double,
+		  long double, long double)
+SPECIALIZE_LCM(lcm_gcd_exact, long double, long double, long double)
+SPECIALIZE_SGN(sgn_float, long double)
+SPECIALIZE_CMP(cmp_float, long double, long double)
+SPECIALIZE_ADD_MUL(add_mul_float, long double, long double, long double)
+SPECIALIZE_SUB_MUL(sub_mul_float, long double, long double, long double)
+SPECIALIZE_INPUT(input_generic, long double)
+SPECIALIZE_OUTPUT(output_float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_mpz.inlines.hh line 1
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+*/
+
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+#ifdef PPL_HAVE_TYPEOF
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef typeof(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+  return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+  v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+  if (Policy::has_nan || Policy::has_infinity) {
+    mp_size_field_t s = get_mp_size(v);
+    if (Policy::has_nan
+	&& (nan || sign)
+	&& s == C_Integer<mp_size_field_t>::min + 1)
+      return VC_NAN;
+    if (!inf && !sign)
+      return VC_NORMAL;
+    if (Policy::has_infinity) {
+      if (s == C_Integer<mp_size_field_t>::min)
+	return inf ? VC_MINUS_INFINITY : V_LT;
+      if (s == C_Integer<mp_size_field_t>::max)
+	return inf ? VC_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return sgn<Policy>(v);
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(classify_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+  return Policy::has_nan
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min + 1;
+}
+
+SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min;
+}
+
+SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::max;
+}
+
+SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+  return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(is_int_mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+set_special_mpz(mpz_class& v, Result r) {
+  Result c = classify(r);
+  if (Policy::has_nan && c == VC_NAN)
+    set_mp_size(v, C_Integer<mp_size_field_t>::min + 1);
+  else if (Policy::has_infinity) {
+    switch (c) {
+    case VC_MINUS_INFINITY:
+      set_mp_size(v, C_Integer<mp_size_field_t>::min);
+      return V_EQ;
+    case VC_PLUS_INFINITY:
+      set_mp_size(v, C_Integer<mp_size_field_t>::max);
+      return V_EQ;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(set_special_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+  if (is_nan_mpz<From_Policy>(from))
+    assert(To_Policy::has_nan);
+  else if (is_minf_mpz<From_Policy>(from) || is_pinf_mpz<From_Policy>(from))
+    assert(To_Policy::has_infinity);
+  else {
+    to = from;
+    return;
+  }
+  set_mp_size(to, get_mp_size(from));
+}
+
+SPECIALIZE_COPY(copy_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    new (&to) mpz_class(from);
+    return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed char)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed short)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed int)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed long)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned char)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned short)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned int)
+SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir) {
+  if (is_nan<From_Policy>(from)) {
+    if (To_Policy::has_nan) {
+      new (&to) mpz_class();
+      return set_special<To_Policy>(to, VC_NAN);
+    }
+    else
+      return VC_NAN;
+  }
+  else if (is_minf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpz_class();
+      return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+    }
+    else
+      return VC_MINUS_INFINITY;
+  }
+  else if (is_pinf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpz_class();
+      return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+    }
+    else
+      return VC_PLUS_INFINITY;
+  }
+  new (&to) mpz_class(from);
+  return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, float)
+SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, double)
+
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, mpz_class)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed char)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed short)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed int)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed long)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned char)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned short)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned int)
+SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(assign_mpz_signed_int, mpz_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else
+    mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(assign_mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+  else if (is_pinf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+  if (round_ignore(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  From n = rint(from);
+  to = n;
+  if (from < n)
+    return round_lt_mpz<To_Policy>(to, dir);
+  else if (from > n)
+    return round_gt_mpz<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float)
+SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output<From_Policy>(ss, from, Numeric_Format(), dir);
+  DIRTY_TEMP0(mpq_class, tmp);
+#ifndef NDEBUG
+  Result r =
+#endif
+    input_mpq(tmp, ss);
+  assert(r == V_EQ);
+  return assign<To_Policy, From_Policy>(to, tmp, dir);
+}
+
+SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (round_ignore(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  if (round_down(dir)) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+  }
+  else {
+    assert(round_up(dir));
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_ASSIGN(assign_mpz_mpq, mpz_class, mpq_class)
+
+SPECIALIZE_FLOOR(assign_exact, mpz_class, mpz_class)
+SPECIALIZE_CEIL(assign_exact, mpz_class, mpz_class)
+SPECIALIZE_TRUNC(assign_exact, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(neg_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD(add_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB(sub_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_MUL(mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  if (round_ignore(dir)) {
+    // FIXME: is this correct?
+    mpz_divexact(to.get_mpz_t(), n, d);
+    return V_LGE;
+  }
+  if (round_down(dir)) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+  }
+  else {
+    assert(round_up(dir));
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  mpz_tdiv_q(to.get_mpz_t(), n, d);
+  return V_EQ;
+}
+
+SPECIALIZE_IDIV(idiv_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mul2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  mpz_srcptr n = x.get_mpz_t();
+  if (round_ignore(dir)) {
+    mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+    return V_LGE;
+  }
+  if (round_down(dir)) {
+    mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
+  }
+  else {
+    assert(round_up(dir));
+    mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_DIV2EXP(div2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+SPECIALIZE_ABS(abs_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	    Rounding_Dir) {
+  mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_ADD_MUL(add_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	    Rounding_Dir) {
+  mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_SUB_MUL(sub_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_GCD(gcd_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcdext_mpz(mpz_class& to, mpz_class& s, mpz_class& t,
+	   const mpz_class& x, const mpz_class& y,
+	   Rounding_Dir) {
+  mpz_gcdext(to.get_mpz_t(), s.get_mpz_t(), t.get_mpz_t(),
+	     x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_GCDEXT(gcdext_mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_LCM(lcm_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  if (round_ignore(dir)) {
+    to = sqrt(from);
+    return V_GE;
+  }
+  DIRTY_TEMP0(mpz_class, r);
+  mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+  if (r == 0)
+    return V_EQ;
+  return round_gt_mpz<To_Policy>(to, dir);
+}
+
+SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_mp(const Type& x) {
+  int i = ::sgn(x);
+  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_SGN(sgn_mp, mpz_class)
+SPECIALIZE_SGN(sgn_mp, mpq_class)
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result
+cmp_mp(const Type& x, const Type& y) {
+  int i = ::cmp(x, y);
+  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class)
+SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+	   Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_INPUT(input_generic, mpz_class)
+SPECIALIZE_OUTPUT(output_mpz, mpz_class)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_mpq.inlines.hh line 1
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+*/
+
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+  if ((Policy::has_nan || Policy::has_infinity)
+      && ::sgn(v.get_den()) == 0) {
+    int s = ::sgn(v.get_num());
+    if (Policy::has_nan && (nan || sign) && s == 0)
+      return VC_NAN;
+    if (!inf && !sign)
+      return VC_NORMAL;
+    if (Policy::has_infinity) {
+      if (s < 0)
+	return inf ? VC_MINUS_INFINITY : V_LT;
+      if (s > 0)
+	return inf ? VC_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return sgn<Policy>(v);
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(classify_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+  return Policy::has_nan
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) == 0;
+}
+
+SPECIALIZE_IS_NAN(is_nan_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+  return Policy::has_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) < 0;
+}
+
+SPECIALIZE_IS_MINF(is_minf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+  return Policy::has_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) > 0;
+}
+
+SPECIALIZE_IS_PINF(is_pinf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+  if ((Policy::has_infinity || Policy::has_nan)
+      && ::sgn(v.get_den()) == 0)
+    return !(Policy::has_nan && ::sgn(v.get_num()) == 0);
+  else
+    return v.get_den() == 1;
+}
+
+SPECIALIZE_IS_INT(is_int_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+set_special_mpq(mpq_class& v, Result r) {
+  Result c = classify(r);
+  if (Policy::has_nan && c == VC_NAN) {
+    v.get_num() = 0;
+    v.get_den() = 0;
+  }
+  else if (Policy::has_infinity) {
+    switch (c) {
+    case VC_MINUS_INFINITY:
+      v.get_num() = -1;
+      v.get_den() = 0;
+      return V_EQ;
+    case VC_PLUS_INFINITY:
+      v.get_num() = 1;
+      v.get_den() = 0;
+      return V_EQ;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(set_special_mpq, mpq_class)
+
+SPECIALIZE_COPY(copy_generic, mpq_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, mpz_class)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed char)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed short)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed int)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed long)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned char)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned short)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned int)
+SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir) {
+  if (is_nan<From_Policy>(from)) {
+    if (To_Policy::has_nan) {
+      new (&to) mpq_class();
+      return set_special<To_Policy>(to, VC_NAN);
+    }
+    else
+      return VC_NAN;
+  }
+  else if (is_minf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpq_class();
+      return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+    }
+    else
+      return VC_MINUS_INFINITY;
+  }
+  else if (is_pinf<From_Policy>(from)) {
+    if (To_Policy::has_infinity) {
+      new (&to) mpq_class();
+      return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+    }
+    else
+      return VC_PLUS_INFINITY;
+  }
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, float)
+SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, double)
+
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpq_class)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpz_class)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed char)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed short)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed int)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed long)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned char)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned short)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned int)
+SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_MINUS_INFINITY);
+  else if (is_pinf<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_PLUS_INFINITY);
+  to = from;
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float)
+SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_num().get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(assign_mpq_signed_int, mpq_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else {
+    mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(assign_mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+floor_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_fdiv_q(to.get_num().get_mpz_t(),
+	     from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+SPECIALIZE_FLOOR(floor_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+ceil_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_cdiv_q(to.get_num().get_mpz_t(),
+	     from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+SPECIALIZE_CEIL(ceil_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+trunc_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_tdiv_q(to.get_num().get_mpz_t(),
+	     from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+SPECIALIZE_TRUNC(trunc_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(neg_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD(add_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB(sub_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_MUL(mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return V_EQ;
+}
+
+SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0))
+    return set_special<To_Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return trunc<To_Policy, To_Policy>(to, to, dir);
+}
+
+SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0))
+    return set_special<To_Policy>(to, V_MOD_ZERO);
+  to = x / y;
+  to.get_num() %= to.get_den();
+  return V_EQ;
+}
+
+SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+  to.get_den() = x.get_den();
+  to.canonicalize();
+  return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mul2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<To_Policy, From_Policy>(to, x, -exp, dir);
+  to.get_num() = x.get_num();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+SPECIALIZE_DIV2EXP(div2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+SPECIALIZE_ABS(abs_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+	    Rounding_Dir) {
+  to += x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD_MUL(add_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+	    Rounding_Dir) {
+  to -= x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB_MUL(sub_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned long rational_sqrt_precision_parameter;
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  const unsigned long k = rational_sqrt_precision_parameter;
+  mpz_class& to_num = to.get_num();
+  mul2exp<To_Policy, From_Policy>(to_num, from.get_num(), 2*k, dir);
+  Result rdiv
+    = div<To_Policy, To_Policy, To_Policy>(to_num,
+					   to_num, from.get_den(), dir);
+  Result rsqrt = sqrt<To_Policy, To_Policy>(to_num, to_num, dir);
+  mpz_class& to_den = to.get_den();
+  to_den = 1;
+  mul2exp<To_Policy, To_Policy>(to_den, to_den, k, dir);
+  to.canonicalize();
+  return rdiv != V_EQ ? rdiv : rsqrt;
+}
+
+SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir) {
+  Result r = input_mpq(to, is);
+  switch (classify(r)) {
+  case VC_MINUS_INFINITY:
+  case VC_PLUS_INFINITY:
+  case VC_NAN:
+    return set_special<Policy>(to, r);
+  default:
+    return r;
+  }
+}
+
+SPECIALIZE_INPUT(input_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+	   const mpq_class& from,
+	   const Numeric_Format&,
+	   Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_OUTPUT(output_mpq, mpq_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output<From_Policy>(ss, from, Numeric_Format(), dir);
+  return input_mpq(to, ss);
+}
+
+SPECIALIZE_ASSIGN(assign_mpq_long_double, mpq_class, long double)
+
+} // namespace Checked
+
+//! Returns the precision parameter used for rational square root calculations.
+inline unsigned
+rational_sqrt_precision_parameter() {
+  return Checked::rational_sqrt_precision_parameter;
+}
+
+//! Sets the precision parameter used for rational square root calculations.
+/*!
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for rational square root calculations to \p p.
+
+  \exception std::invalid_argument
+  Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_rational_sqrt_precision_parameter(const unsigned p) {
+  if (p <= INT_MAX)
+    Checked::rational_sqrt_precision_parameter = p;
+  else
+    throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(p)"
+				" with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_ext.inlines.hh line 1
+/* Checked extended arithmetic functions.
+*/
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T> struct FPU_Related : public False {};
+template <> struct FPU_Related<float> : public True {};
+template <> struct FPU_Related<double> : public True {};
+template <> struct FPU_Related<long double> : public True {};
+
+namespace Checked {
+
+template <typename T>
+inline bool
+handle_ext_natively(const T&) {
+  return FPU_Related<T>::value;
+}
+
+template <typename Policy, typename Type>
+inline bool
+ext_to_handle(const Type& x) {
+  return !handle_ext_natively(x)
+    && (Policy::has_infinity || Policy::has_nan);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_ext(const Type& x) {
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x))
+    return VC_NAN;
+  else if (is_minf<Policy>(x))
+    return V_LT;
+  else if (is_pinf<Policy>(x))
+    return V_GT;
+  else {
+  native:
+    return sgn<Policy>(x);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+construct_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return construct<To_Policy, Special_Float_Policy>(to, NOT_A_NUMBER, dir);
+  else if (is_minf<From_Policy>(x))
+    return construct<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return construct<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return construct<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+assign_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return assign<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else {
+  native:
+    return neg<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+floor_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return floor<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+ceil_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return ceil<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+trunc_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return trunc<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return abs<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+      goto inf_add_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+    inf_add_inf:
+      return set_special<To_Policy>(to, V_INF_ADD_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+    minf:
+      return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+    pinf:
+      return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return add<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+      goto inf_sub_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+    inf_sub_inf:
+      return set_special<To_Policy>(to, V_INF_SUB_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_pinf<From2_Policy>(y)) {
+    minf:
+      return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+    }
+    else if (is_minf<From2_Policy>(y)) {
+    pinf:
+      return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return sub<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto pinf;
+    case V_GT:
+      goto minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto minf;
+    case V_GT:
+      goto pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+    native:
+      return mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_pinf;
+    case V_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_minf;
+    case V_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto a_pinf;
+      case V_GT:
+	goto a_minf;
+      default:
+	goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      a_minf:
+	if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+	  goto inf_add_inf;
+	else
+	  goto minf;
+      case V_GT:
+      a_pinf:
+	if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+	inf_add_inf:
+	  return set_special<To_Policy>(to, V_INF_ADD_INF);
+	}
+	else
+	  goto pinf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+      }
+    native:
+      return add_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_pinf;
+    case V_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_minf;
+    case V_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto a_pinf;
+      case V_GT:
+	goto a_minf;
+      default:
+	goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      a_minf:
+	if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+	  goto inf_sub_inf;
+	else
+	  goto pinf;
+      case V_GT:
+      a_pinf:
+	if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+	inf_sub_inf:
+	  return set_special<To_Policy>(to, V_INF_SUB_INF);
+	}
+	else
+	  goto minf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+      }
+    native:
+      return sub_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return set_special<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+      default:
+      div_zero:
+	assert(To_Policy::check_div_zero);
+	return set_special<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return div<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return set_special<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+      default:
+      div_zero:
+	assert(To_Policy::check_div_zero);
+	return set_special<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return idiv<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+		   || is_pinf<From1_Policy>(x)))
+    return set_special<To_Policy>(to, V_INF_MOD);
+  else {
+    if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = x;
+      return V_EQ;
+    }
+    else {
+    native:
+      return rem<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return mul2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return div2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return sqrt<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+    return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+  else
+    return gcd<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+	  typename From1_Policy, typename From2_Policy,
+	  typename To1, typename To2, typename To3,
+	  typename From1, typename From2>
+inline Result
+gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+	   Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To1_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+    s = 0;
+    t = y > 0 ? -1 : 1;
+    return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+  }
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+    s = x > 0 ? -1 : 1;
+    t = 0;
+    return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+  }
+  else
+    return gcdext<To1_Policy, To2_Policy, To3_Policy, From1_Policy, From2_Policy>(to, s, t, x, y, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+	   || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return assign<To_Policy, Special_Float_Policy>(to, PLUS_INFINITY, dir);
+  else
+    return lcm<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline Result
+cmp_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return V_UNORD_COMP;
+  else if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y) ? V_EQ : V_LT;
+  else if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y) ? V_EQ : V_GT;
+  else {
+    if (is_minf<Policy2>(y))
+      return V_GT;
+    if (is_pinf<Policy2>(y))
+      return V_LT;
+  native:
+    return cmp<Policy1, Policy2>(x, y);
+  }
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+ native:
+  return lt_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+  return lt_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+ native:
+  return le_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+  return le_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y);
+  else if (is_minf<Policy2>(y) || is_pinf<Policy2>(y))
+    return false;
+ native:
+  return eq_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+  return !eq_ext<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+	   const Numeric_Format& format, Rounding_Dir dir) {
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x)) {
+    os << "nan";
+    return VC_NAN;
+  }
+  if (is_minf<Policy>(x)) {
+    os << "-inf";
+    return V_EQ;
+  }
+  if (is_pinf<Policy>(x)) {
+    os << "+inf";
+    return V_EQ;
+  }
+ native:
+  return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+  return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked.defs.hh line 432
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.defs.hh line 30
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Checked_Number_Default_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, false);
+  const_bool_nodef(has_infinity, false);
+  const_bool_nodef(convertible, true);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, true);
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+  // Do not uncomment the following.
+  // The compile time error on conversions is the expected behavior.
+  // const_bool_nodef(convertible, false);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, true);
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+  static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+  // Do not uncomment the following.
+  // The compile time error is the expected behavior.
+  // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct WRD_Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+  // Do not uncomment the following.
+  // The compile time error on conversions is the expected behavior.
+  // const_bool_nodef(convertible, false);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, false);
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+  static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+  // Do not uncomment the following.
+  // The compile time error is the expected behavior.
+  // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Check_Overflow_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+  const_bool_nodef(convertible, true);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(check_nan_result, true);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_From_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_From_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Checked_Number_Transparent_Policy<T> Policy;
+  static const T& raw_value(const T& v) {
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static const T& raw_value(const Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_To_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_To_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Check_Overflow_Policy<T> Policy;
+  static T& raw_value(T& v) {
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static T& raw_value(Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+/*! \ingroup PPL_CXX_interface */
+template <typename T>
+struct Is_Checked : public False { };
+
+/*! \ingroup PPL_CXX_interface */
+template <typename T, typename P>
+struct Is_Checked<Checked_Number<T, P> > : public True { };
+
+/*! \ingroup PPL_CXX_interface */
+template <typename T>
+struct Is_Native_Or_Checked
+  : public Bool<Is_Native<T>::value || Is_Checked<T>::value> { };
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+  The wrapper and related functions implement an interface which is common
+  to all kinds of coefficient types, therefore allowing for a uniform
+  coding style. This class also implements the policy encoded by the
+  second template parameter. The default policy is to perform the detection
+  of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+  //! \name Constructors
+  //@{
+
+  //! Default constructor.
+  Checked_Number();
+
+  //! Copy-constructor.
+  Checked_Number(const Checked_Number& y);
+
+  //! Direct initialization from a Checked_Number and rounding mode.
+  template <typename From, typename From_Policy>
+  Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed char and rounding mode.
+  Checked_Number(signed char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed short and rounding mode.
+  Checked_Number(signed short y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed int and rounding mode.
+  Checked_Number(signed int y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long and rounding mode.
+  Checked_Number(signed long y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long long and rounding mode.
+  Checked_Number(signed long long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned char and rounding mode.
+  Checked_Number(unsigned char y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned short and rounding mode.
+  Checked_Number(unsigned short y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned int and rounding mode.
+  Checked_Number(unsigned int y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long and rounding mode.
+  Checked_Number(unsigned long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long long and rounding mode.
+  Checked_Number(unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+  //! Direct initialization from a float and rounding mode.
+  Checked_Number(float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+  //! Direct initialization from a double and rounding mode.
+  Checked_Number(double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+  //! Direct initialization from a long double and rounding mode.
+  Checked_Number(long double y, Rounding_Dir dir);
+#endif
+
+  //! Direct initialization from a rational and rounding mode.
+  Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from an unbounded integer and rounding mode.
+  Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from a C string and rounding mode.
+  Checked_Number(const char* y, Rounding_Dir dir);
+
+  //! Direct initialization from a Checked_Number, default rounding mode.
+  template <typename From, typename From_Policy>
+  explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+  //! Direct initialization from a signed char, default rounding mode.
+  Checked_Number(signed char y);
+
+  //! Direct initialization from a signed short, default rounding mode.
+  Checked_Number(signed short y);
+
+  //! Direct initialization from a signed int, default rounding mode.
+  Checked_Number(signed int y);
+
+  //! Direct initialization from a signed long, default rounding mode.
+  Checked_Number(signed long y);
+
+  //! Direct initialization from a signed long long, default rounding mode.
+  Checked_Number(signed long long y);
+
+  //! Direct initialization from an unsigned char, default rounding mode.
+  Checked_Number(unsigned char y);
+
+  //! Direct initialization from an unsigned short, default rounding mode.
+  Checked_Number(unsigned short y);
+
+  //! Direct initialization from an unsigned int, default rounding mode.
+  Checked_Number(unsigned int y);
+
+  //! Direct initialization from an unsigned long, default rounding mode.
+  Checked_Number(unsigned long y);
+
+  //! Direct initialization from an unsigned long long, default rounding mode.
+  Checked_Number(unsigned long long y);
+
+  //! Direct initialization from a float, default rounding mode.
+  Checked_Number(float y);
+
+  //! Direct initialization from a double, default rounding mode.
+  Checked_Number(double y);
+
+  //! Direct initialization from a long double, default rounding mode.
+  Checked_Number(long double y);
+
+  //! Direct initialization from a rational, default rounding mode.
+  Checked_Number(const mpq_class& y);
+
+  //! Direct initialization from an unbounded integer, default rounding mode.
+  Checked_Number(const mpz_class& y);
+
+  //! Direct initialization from a C string, default rounding mode.
+  Checked_Number(const char* y);
+
+  //@} // Constructors
+
+  //! \name Accessors and Conversions
+  //@{
+
+  //! Conversion operator: returns a copy of the underlying numeric value.
+  operator T() const;
+
+  //! Returns a reference to the underlying numeric value.
+  T& raw_value();
+
+  //! Returns a const reference to the underlying numeric value.
+  const T& raw_value() const;
+
+  //@} // Accessors and Conversions
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Classifies *this.
+  /*!
+    Returns the appropriate Result characterizing:
+    - whether \p *this is NAN,
+      if \p nan is <CODE>true</CODE>;
+    - whether \p *this is a (positive or negative) infinity,
+      if \p inf is <CODE>true</CODE>;
+    - the sign of \p *this,
+      if \p sign is <CODE>true</CODE>.
+  */
+  Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+  //! \name Assignment Operators
+  //@{
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Checked_Number& y);
+
+  //! Assignment operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator=(const Checked_Number<From, From_Policy>& y);
+
+  //! Assignment operator.
+  template <typename From>
+  Checked_Number& operator=(const From& y);
+
+  //! Add and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+  //! Add and assign operator.
+  Checked_Number& operator+=(const T& y);
+
+  //! Add and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator+=(const From& y);
+
+  //! Subtract and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  Checked_Number& operator-=(const T& y);
+
+  //! Subtract and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator-=(const From& y);
+
+  //! Multiply and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const T& y);
+
+  //! Multiply and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator*=(const From& y);
+
+  //! Divide and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+  //! Divide and assign operator.
+  Checked_Number& operator/=(const T& y);
+
+  //! Divide and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>&>::type
+  operator/=(const From& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  Checked_Number& operator%=(const T& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+		     Checked_Number<T, Policy>& >::type
+  operator%=(const From& y);
+
+  //@} // Assignment Operators
+
+
+  //! \name Increment and Decrement Operators
+  //@{
+
+  //! Pre-increment operator.
+  Checked_Number& operator++();
+
+  //! Post-increment operator.
+  Checked_Number  operator++(int);
+
+  //! Pre-decrement operator.
+  Checked_Number& operator--();
+
+  //! Post-decrement operator.
+  Checked_Number  operator--(int);
+
+  //@} // Increment and Decrement Operators
+
+private:
+  //! The underlying numeric value.
+  T v;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Slow_Copy<Checked_Number<T, P> > : public Bool<Slow_Copy<T>::value> {};
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+is_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x);
+
+/*! \relates Checked_Number */
+template <typename To>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename To_Policy>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+name(To& to, const From& x, Rounding_Dir dir);
+
+FUNC1(assign_r)
+FUNC1(floor_assign_r)
+FUNC1(ceil_assign_r)
+FUNC1(trunc_assign_r)
+FUNC1(neg_assign_r)
+FUNC1(abs_assign_r)
+FUNC1(sqrt_assign_r)
+
+#undef FUNC1
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+name(To& to, const From& x, int exp, Rounding_Dir dir);
+
+FUNC1(mul2exp_assign_r)
+FUNC1(div2exp_assign_r)
+
+#undef FUNC1
+
+#define FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+                   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+FUNC2(add_assign_r)
+FUNC2(sub_assign_r)
+FUNC2(mul_assign_r)
+FUNC2(div_assign_r)
+FUNC2(idiv_assign_r)
+FUNC2(rem_assign_r)
+FUNC2(gcd_assign_r)
+FUNC2(lcm_assign_r)
+FUNC2(add_mul_assign_r)
+FUNC2(sub_mul_assign_r)
+
+#undef FUNC2
+
+#define FUNC4(name) \
+template <typename To1, typename To2, typename To3, \
+	  typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To1>::value \
+                   && Is_Native_Or_Checked<To2>::value \
+                   && Is_Native_Or_Checked<To3>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+		   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+name(To1& to, To2& s, To3& t, \
+     const From1& x, const From2& y, \
+     Rounding_Dir dir);
+
+FUNC4(gcdext_assign_r)
+
+#undef FUNC4
+
+//! \name Accessor Functions
+//@{
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+size_t
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x smallest integral value not less than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x smallest integral value not less than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Round \p x to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+	       const Checked_Number<T, Policy>& y,
+	       const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+	       const Checked_Number<T, Policy>& y,
+	       const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+	   const Checked_Number<T, Policy>& y,
+	   const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  Assigns to \p x the greatest common divisor of \p y and \p z,
+  setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+	      Checked_Number<T, Policy>& s,
+	      Checked_Number<T, Policy>& t,
+	      const Checked_Number<T, Policy>& y,
+	      const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+	   const Checked_Number<T, Policy>& y,
+	   const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates Checked_Number
+  The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y,
+		 const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator==(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+equal(const T1& x, const T2& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator!=(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+not_equal(const T1& x, const T2& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator>=(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+greater_or_equal(const T1& x, const T2& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator>(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+greater_than(const T1& x, const T2& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator<=(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+less_or_equal(const T1& x, const T2& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+		   bool>::type
+operator<(const T1& x, const T2& y);
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+			  && Is_Native_Or_Checked<T2>::value,
+			  bool>::type
+less_than(const T1& x, const T2& y);
+
+/*! \brief
+  Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+  of \p x is negative, zero or positive, respectively.
+
+  \relates Checked_Number
+*/
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type \
+sgn(const From& x);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates Checked_Number
+*/
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os,
+       const T& x,
+       const Numeric_Format& fmt,
+       Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Ascii dump for native or checked.
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t);
+
+//! Input function.
+/*!
+  \relates Checked_Number
+
+  \param is
+  Input stream to read from;
+
+  \param x
+  Number (possibly extended) to assign to in case of successful reading;
+
+  \param dir
+  Rounding mode to be applied.
+
+  \return
+  Result of the input operation.  Success, success with imprecision,
+  overflow, parsing error: all possibilities are taken into account,
+  checked for, and properly reported.
+
+  This function attempts reading a (possibly extended) number from the given
+  stream \p is, possibly rounding as specified by \p dir, assigning the result
+  to \p x upon success, and returning the appropriate Result.
+
+  The input syntax allows the specification of:
+  - plain base-10 integer numbers as <CODE>34976098</CODE>,
+    <CODE>-77</CODE> and <CODE>+13</CODE>;
+  - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+    and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+    <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+  - base-10 rational numbers in fraction notation as
+    <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+  - base-10 rational numbers in fraction/scientific notation as
+    <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+    (meaning \f$3/580000\f$);
+  - base-10 rational numbers in floating point notation as
+    <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+    <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+  - base-10 rational numbers in floating point scientific notation as
+    <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+    (meaning \f$-220001/100\f$);
+  - integers and rationals (in fractional, floating point and scientific
+    notations) specified by using Mathematica-style bases, in the range
+    from 2 to 36, as
+    <CODE>2^^11</CODE> (meaning \f$3\f$),
+    <CODE>36^^z</CODE> (meaning \f$35\f$),
+    <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+    <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+    <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+    <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+    <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+    <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+    <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+    note that the base and the exponent are always written as plain
+    base-10 integer numbers; also, when an ambiguity may arise, the
+    character <CODE>e</CODE> is interpreted as a digit, so that
+    <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+    <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+  - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+    the Mathematica-style prefix <CODE>16^^</CODE>;
+  - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+    (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+    and <CODE>nan</CODE> (meaning "not a number").
+
+  The rationale behind the accepted syntax can be summarized as follows:
+  - if the syntax is accepted by Mathematica, then this function
+    accepts it with the same semantics;
+  - if the syntax is acceptable as standard C++ integer or floating point
+    literal (except for octal notation and type suffixes, which are not
+    supported), then this function accepts it with the same semantics;
+  - natural extensions of the above are accepted with the natural
+    extensions of the semantics;
+  - special values are accepted.
+
+  Valid syntax is more formally and completely specified by the
+  following grammar, with the additional provisos that everything is
+  <EM>case insensitive</EM>, that the syntactic category
+  <CODE>BDIGIT</CODE> is further restricted by the current base
+  and that for all bases above 14, any <CODE>e</CODE> is always
+  interpreted as a digit and never as a delimiter for the exponent part
+  (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number	: NAN					INF	: 'inf'
+	| SIGN INF					;
+	| INF
+	| num					NAN	: 'nan'
+	| num DIV num					;
+	;
+						SIGN	: '-'
+num     : unum						| '+'
+        | SIGN unum					;
+
+unum	: unum1					EXP	: 'e'
+	| HEX unum1					| '*^'
+	| base BASE unum1				;
+	;
+						POINT	: '.'
+unum1	: mantissa					;
+	| mantissa EXP exponent
+	;					DIV	: '/'
+							;
+mantissa: bdigits
+        | POINT bdigits				MINUS	: '-'
+	| bdigits POINT					;
+	| bdigits POINT bdigits
+	;					PLUS	: '+'
+						;
+exponent: SIGN digits
+	| digits				HEX	: '0x'
+	;					;
+
+bdigits : BDIGIT				BASE	: '^^'
+	| bdigits BDIGIT				;
+	;
+						DIGIT   : '0' .. '9'
+digits  : DIGIT						;
+	| digits DIGIT
+	;					BDIGIT  : '0' .. '9'
+							| 'a' .. 'z'
+							;
+\endcode
+*/
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//! Ascii load for native or checked.
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::ostream& s, T& t);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+//! Swaps \p x with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+template <typename T, typename Policy>
+struct FPU_Related<Checked_Number<T, Policy> > : public FPU_Related<T> {};
+
+template <typename T>
+void maybe_reset_fpu_inexact();
+
+template <typename T>
+int maybe_check_fpu_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.inlines.hh line 1
+/* Checked_Number class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/globals.defs.hh line 1
+/* Declarations of global objects.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/globals.defs.hh line 31
+#include <exception>
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Make sure swap() is specialized when needed.
+
+  This will cause a compile-time error whenever a specialization for \p T
+  is beneficial but missing.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Slow_Copy<T>::value, void>::type
+swap(T&, T&) {
+  COMPILE_TIME_CHECK(!Slow_Copy<T>::value, "missing swap specialization");
+}
+
+// FIXME: write a comment for this.
+#define TEMP_INTEGER(id) DIRTY_TEMP0(Coefficient, id)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+  \return
+  The actual capacity to be allocated.
+
+  \param requested_size
+  The number of elements we need.
+
+  \param maximum_size
+  The maximum number of elements to be allocated. It is assumed
+  to be no less than \p requested_size.
+
+  Computes a capacity given a requested size.
+  Allows for speculative allocation aimed at reducing the number of
+  reallocations enough to guarantee amortized constant insertion time
+  for our vector-like data structures. In all cases, the speculative
+  allocation will not exceed \p maximum_size.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+compute_capacity(dimension_type requested_size,
+		 dimension_type maximum_size);
+
+// FIXME!!!
+dimension_type
+compute_capacity(dimension_type requested_size);
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+class Throwable {
+public:
+  //! Throws the user defined exception object.
+  virtual void throw_me() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Throwable();
+};
+
+/*! \brief
+  A pointer to an exception object.
+
+  \ingroup PPL_CXX_interface
+  This pointer, which is initialized to zero, is repeatedly checked
+  along any super-linear (i.e., computationally expensive) computation
+  path in the library.
+  When it is found nonzero the exception it points to is thrown.
+  In other words, making this pointer point to an exception (and
+  leaving it in this state) ensures that the library will return
+  control to the client application, possibly by throwing the given
+  exception, within a time that is a linear function of the size
+  of the representation of the biggest object (powerset of polyhedra,
+  polyhedron, system of constraints or generators) on which the library
+  is operating upon.
+
+  \note
+  The only sensible way to assign to this pointer is from within a
+  signal handler or from a parallel thread.  For this reason, the
+  library, apart from ensuring that the pointer is initially set to zero,
+  never assigns to it.  In particular, it does not zero it again when
+  the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the pointer abandon_expensive_computations is found
+  to be nonzero, the exception it points to is thrown.
+
+  \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to make the Grid covering box constructor unique.
+*/
+struct From_Covering_Box {
+};
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to distinguish those constructors that recycle the data
+  structures of their arguments, instead of taking a copy.
+*/
+struct Recycle_Input {
+};
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define PPL_OUTPUT_DECLARATIONS						\
+  /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+  void ascii_dump() const;						\
+  /*! \brief Writes to \p s an ASCII representation of \p *this. */	\
+  void ascii_dump(std::ostream& s) const;				\
+  /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */	\
+  void print() const;
+#else
+#define PPL_OUTPUT_DECLARATIONS					\
+  void ascii_dump() const;					\
+  void ascii_dump(std::ostream& s) const;			\
+  void print() const;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#define PPL_OUTPUT_DEFINITIONS(class_name)			\
+  void								\
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {	\
+    ascii_dump(std::cerr);					\
+  }								\
+								\
+  void								\
+  Parma_Polyhedra_Library::class_name::print() const {		\
+    using namespace IO_Operators;				\
+    std::cerr << *this;						\
+  }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name)			\
+  void									\
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {		\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  void									\
+  Parma_Polyhedra_Library::class_name::print() const {			\
+    std::cerr << "No user level output operator defined "		\
+	      << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix)	\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::ascii_dump() const {					\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::print() const {						\
+    using namespace IO_Operators;					\
+    std::cerr << *this;							\
+  }
+
+// FIXME: The class_prefix has changed from
+//        PPL_OUTPUT_TEMPLATE_DEFINITIONS, to work around `,'.
+//        Perhaps PPL_OUTPUT_TEMPLATE_DEFINITIONS should be changed to
+//        match this.
+#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,		\
+						type_symbol2,		\
+						class_prefix)		\
+  template <typename type_symbol1, typename type_symbol2>		\
+  void									\
+  class_prefix<type_symbol1, type_symbol2>::ascii_dump() const {	\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol1, typename type_symbol2>		\
+  void									\
+  class_prefix<type_symbol1, type_symbol2>::print() const {		\
+    using namespace IO_Operators;					\
+    std::cerr << *this;							\
+  }
+
+// FIXME: Copy and edit of PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS
+#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,		\
+						type_symbol2,		\
+						type_symbol3,		\
+						class_prefix)		\
+  template <typename type_symbol1, typename type_symbol2,		\
+            typename type_symbol3>					\
+  void									\
+  class_prefix<type_symbol1, type_symbol2, type_symbol3>::ascii_dump()	\
+    const {								\
+    ascii_dump(std::cerr);						\
+  }									\
+                                                                     	\
+    template <typename type_symbol1, typename type_symbol2,		\
+              typename type_symbol3>					\
+    void								\
+    class_prefix<type_symbol1, type_symbol2, type_symbol3>::print()	\
+      const {								\
+      using namespace IO_Operators;					\
+      std::cerr << *this;						\
+    }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::ascii_dump() const {					\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::print() const {						\
+    std::cerr << "No user level output operator defined "		\
+	      << "for " PPL_XSTR(class_prefix) << "." << std::endl;	\
+  }
+
+template <typename T, long long v, typename Enable = void>
+struct Fit : public False {
+};
+
+template <typename T, long long v>
+struct Fit<T, v, typename Enable_If<C_Integer<T>::value>::type>  {
+  enum {
+    value = (v >= static_cast<long long>(C_Integer<T>::min)
+             && v <= static_cast<long long>(C_Integer<T>::max))
+  };
+};
+
+template <typename T, long long v>
+struct TConstant {
+  static const T value = v;
+};
+
+
+template <typename T, long long v>
+const T TConstant<T, v>::value;
+
+template <typename T, long long v, bool prefer_signed = true,
+	  typename Enable = void>
+struct Constant_ : public TConstant<T, v> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+		 typename Enable_If<(Fit<typename C_Integer<T>::smaller_signed_type, v>::value
+				     && (prefer_signed ||
+					 !Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_signed_type, v, prefer_signed> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+		 typename Enable_If<(Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value
+				     && (!prefer_signed ||
+					 !Fit<typename C_Integer<T>::smaller_signed_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_unsigned_type, v, prefer_signed> {
+};
+
+template <long long v, bool prefer_signed = true>
+struct Constant : public Constant_<long long, v, prefer_signed> {
+};
+
+//! \name Memory Size Inspection Functions
+//@{
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the total size in bytes of the memory
+  occupied by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the size in bytes of the memory managed
+  by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpq_class& x);
+
+//@} // Memory Size Inspection Functions
+
+
+template <typename T, typename Enable = void>
+struct Has_OK : public False { };
+
+template <typename T>
+struct Has_OK<T, typename Enable_If_Is<bool (T::*)() const, &T::OK>::type>
+  : public True {
+};
+
+template <typename T>
+inline typename Enable_If<Has_OK<T>::value, bool>::type
+f_OK(const T& to) {
+  return to.OK();
+}
+
+#define FOK(T) inline bool f_OK(const T&) { return true; }
+
+FOK(char)
+FOK(signed char)
+FOK(unsigned char)
+FOK(signed short)
+FOK(unsigned short)
+FOK(signed int)
+FOK(unsigned int)
+FOK(signed long)
+FOK(unsigned long)
+FOK(signed long long)
+FOK(unsigned long long)
+FOK(float)
+FOK(double)
+FOK(long double)
+FOK(mpz_class)
+FOK(mpq_class)
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/globals.inlines.hh line 1
+/* Implementation of global objects: inline functions.
+*/
+
+
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+  return std::numeric_limits<dimension_type>::max();
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+  if (const Throwable* p = abandon_expensive_computations)
+    p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+		 const dimension_type maximum_size) {
+  assert(requested_size <= maximum_size);
+  // Speculation factor 2.
+  return (requested_size < maximum_size / 2)
+    ? 2*(requested_size + 1)
+    : maximum_size;
+  // Speculation factor 1.5.
+  // return (maximum_size - requested_size > requested_size/2)
+  //   ? requested_size + requested_size/2 + 1
+  //   : maximum_size;
+}
+
+// FIXME!!!
+inline dimension_type
+compute_capacity(const dimension_type requested_size) {
+  // Speculation factor 2.
+  return 2*(requested_size + 1);
+  // Speculation factor 1.5.
+  // return requested_size + requested_size/2 + 1;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&) {
+  return 0;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&) {
+  return sizeof(T);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+  return x.get_mpz_t()[0]._mp_alloc * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpz_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+  return external_memory_in_bytes(x.get_num())
+    + external_memory_in_bytes(x.get_den());
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpq_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/globals.defs.hh line 397
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.inlines.hh line 27
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    return ROUND_DIRECT & ROUND_FPU_CHECK_INEXACT;
+#else
+    return ROUND_IGNORE;
+#endif
+  }
+  return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED && !is_special(r)) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    // FIXME: this is wrong. If an overflow happens the Result may be
+    // V_LT or V_GT. What's the better way to cope with that?
+    assert(r == V_EQ);
+#else
+    return V_EQ;
+#endif
+  }
+  return r;
+}
+
+
+template <typename T>
+inline void
+Checked_Number_Transparent_Policy<T>::handle_result(Result) {
+}
+
+inline void
+Checked_Number_Default_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+inline void
+WRD_Extended_Number_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+  // TODO: avoid default construction of value member.
+  Checked::copy<Policy, Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y,
+		 Rounding_Dir dir) {
+  // TODO: avoid default construction of value member.
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+				     (v,
+				      y.raw_value(),
+				      rounding_dir(dir)),
+				     dir)
+			);
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+  // TODO: avoid default construction of value member.
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+				     (v,
+				      y.raw_value(),
+				      rounding_dir(dir)),
+				     dir));
+}
+
+// TODO: avoid default construction of value member.
+#define DEF_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
+  Policy::handle_result							\
+    (check_result(Checked::assign_ext<Policy, Checked_Number_Transparent_Policy<type> >	\
+		  (v, x, rounding_dir(dir)),				\
+		  dir));						\
+}									\
+template <typename T, typename Policy>					\
+inline									\
+Checked_Number<T, Policy>::Checked_Number(const type x) {		\
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;			\
+  Policy::handle_result							\
+    (check_result(Checked::assign_ext<Policy, Checked_Number_Transparent_Policy<type> >	\
+		  (v, x, rounding_dir(dir)),				\
+		  dir));						\
+}
+
+#define COND_0(...)
+#define COND_1(...) __VA_ARGS__
+#define COND_(if, ...) COND_##if(__VA_ARGS__)
+#define COND(if, ...) COND_(if, __VA_ARGS__)
+
+DEF_CTOR(signed char)
+DEF_CTOR(signed short)
+DEF_CTOR(signed int)
+DEF_CTOR(signed long)
+DEF_CTOR(signed long long)
+DEF_CTOR(unsigned char)
+DEF_CTOR(unsigned short)
+DEF_CTOR(unsigned int)
+DEF_CTOR(unsigned long)
+DEF_CTOR(unsigned long long)
+COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float))
+COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double))
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double))
+DEF_CTOR(mpq_class&)
+DEF_CTOR(mpz_class&)
+
+#undef DEF_CTOR
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+							    s,
+							    rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x) {
+  std::istringstream s(x);
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+							    s,
+							    rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x) {
+  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x) {
+  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+is_infinity(const T& x) {
+  return is_minus_infinity(x) ? -1 : is_plus_infinity(x) ? 1 : 0;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x) {
+  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x) {
+  return Checked::is_int<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+  if (Policy::convertible)
+    return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+  return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+  return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+  return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+  return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+  return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return external_memory_in_bytes(x.raw_value());
+}
+
+
+/*! \relates Checked_Number */
+template <typename To>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>
+		      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+				s,
+				rounding_dir(dir)),
+		      dir);
+}
+
+#define FUNC1(name, func) \
+template <typename To, typename From>					\
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type                                 \
+name(To& to, const From& x, Rounding_Dir dir) {				\
+  return								\
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>	\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From>		\
+		 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+			   Native_Checked_From_Wrapper<From>::raw_value(x), \
+			   rounding_dir(dir)), dir);			\
+}
+
+FUNC1(construct, construct_ext)
+FUNC1(assign_r, assign_ext)
+FUNC1(floor_assign_r, floor_ext)
+FUNC1(ceil_assign_r, ceil_ext)
+FUNC1(trunc_assign_r, trunc_ext)
+FUNC1(neg_assign_r, neg_ext)
+FUNC1(abs_assign_r, abs_ext)
+FUNC1(sqrt_assign_r, sqrt_ext)
+
+#undef FUNC1
+
+#define FUNC1(name, func) \
+template <typename To, typename From>					\
+inline typename Enable_If<Is_Native_Or_Checked<To>::value		\
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type					\
+name(To& to, const From& x, int exp, Rounding_Dir dir) {		\
+  return								\
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>	\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From>		\
+		 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+			   Native_Checked_From_Wrapper<From>::raw_value(x), \
+			   exp,						\
+			   rounding_dir(dir)),				\
+		 dir);							\
+}
+
+FUNC1(mul2exp_assign_r, mul2exp_ext)
+FUNC1(div2exp_assign_r, div2exp_ext)
+
+#undef FUNC1
+
+#define FUNC2(name, func) \
+template <typename To, typename From1, typename From2>			\
+inline typename Enable_If<Is_Native_Or_Checked<To>::value		\
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type					\
+name(To& to, const From1& x, const From2& y, Rounding_Dir dir) {	\
+  return								\
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>	\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From1>		\
+		 ::Policy,						\
+		 typename Native_Checked_From_Wrapper<From2>		\
+		 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+			   Native_Checked_From_Wrapper<From1>::raw_value(x), \
+			   Native_Checked_From_Wrapper<From2>::raw_value(y), \
+			   rounding_dir(dir)),				\
+		 dir);							\
+}
+
+FUNC2(add_assign_r, add_ext)
+FUNC2(sub_assign_r, sub_ext)
+FUNC2(mul_assign_r, mul_ext)
+FUNC2(div_assign_r, div_ext)
+FUNC2(idiv_assign_r, idiv_ext)
+FUNC2(rem_assign_r, rem_ext)
+FUNC2(gcd_assign_r, gcd_ext)
+FUNC2(lcm_assign_r, lcm_ext)
+FUNC2(add_mul_assign_r, add_mul_ext)
+FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef FUNC2
+
+#define FUNC4(name, func)						\
+template <typename To1,							\
+          typename To2,							\
+	  typename To3,							\
+          typename From1,						\
+          typename From2>						\
+inline typename Enable_If<Is_Native_Or_Checked<To1>::value		\
+                          && Is_Native_Or_Checked<To2>::value           \
+                          && Is_Native_Or_Checked<To3>::value           \
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type					\
+name(To1& to, To2& s, To3& t, const From1& x, const From2& y,		\
+     Rounding_Dir dir) {						\
+  return								\
+    check_result							\
+    (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,	\
+                   typename Native_Checked_To_Wrapper<To2>::Policy,	\
+                   typename Native_Checked_To_Wrapper<To3>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From1>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From2>::Policy>	\
+     (Native_Checked_To_Wrapper<To1>::raw_value(to),			\
+      Native_Checked_To_Wrapper<To2>::raw_value(s),			\
+      Native_Checked_To_Wrapper<To3>::raw_value(t),			\
+      Native_Checked_From_Wrapper<From1>::raw_value(x),			\
+      Native_Checked_From_Wrapper<From2>::raw_value(y),			\
+      rounding_dir(dir)),						\
+     dir);								\
+}
+
+FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef FUNC4
+
+#define DEF_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+  Policy::handle_result(fun(*this, *this, T(1), \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+  T r = v;\
+  Policy::handle_result(fun(*this, *this, T(1), \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r;\
+}
+
+DEF_INCREMENT(operator ++, add_assign_r)
+DEF_INCREMENT(operator --, sub_assign_r)
+
+#undef DEF_INCREMENT
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+  Checked::copy<Policy, Policy>(v, y.raw_value());
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>
+::operator=(const Checked_Number<From, From_Policy>& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+
+#define DEF_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+  Policy::handle_result(fun(*this, *this, y, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+  Policy::handle_result(fun(*this, *this, y, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, \
+                          Checked_Number<T, Policy>& >::type \
+Checked_Number<T, Policy>::f(const From& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result(fun(*this, *this, cy, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+}
+
+DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef DEF_BINARY_OP_ASSIGN
+
+#define DEF_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r; \
+  Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename Type, typename T, typename Policy>	\
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+f(const Type& x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r(x); \
+  Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename T, typename Policy, typename Type>	\
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+f(const Checked_Number<T, Policy>& x, const Type& y) { \
+  Checked_Number<T, Policy> r(y); \
+  Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+}
+
+DEF_BINARY_OP(operator +, add_assign_r)
+DEF_BINARY_OP(operator -, sub_assign_r)
+DEF_BINARY_OP(operator *, mul_assign_r)
+DEF_BINARY_OP(operator /, div_assign_r)
+DEF_BINARY_OP(operator %, rem_assign_r)
+
+#undef DEF_BINARY_OP
+
+#define DEF_COMPARE(f, fun)						\
+template <typename T1, typename T2>					\
+inline									\
+typename Enable_If<Is_Native_Or_Checked<T1>::value                      \
+                   && Is_Native_Or_Checked<T2>::value                   \
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),	\
+		   bool>::type						\
+f(const T1& x, const T2& y) {						\
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy,	\
+    		      typename Native_Checked_From_Wrapper<T2>::Policy>	\
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),			\
+     Native_Checked_From_Wrapper<T2>::raw_value(y));			\
+}
+
+DEF_COMPARE(operator ==, eq_ext)
+DEF_COMPARE(operator !=, ne_ext)
+DEF_COMPARE(operator >=, ge_ext)
+DEF_COMPARE(operator >, gt_ext)
+DEF_COMPARE(operator <=, le_ext)
+DEF_COMPARE(operator <, lt_ext)
+
+#undef DEF_COMPARE
+
+#define DEF_COMPARE(f, fun)						\
+template <typename T1, typename T2>					\
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value		\
+			  && Is_Native_Or_Checked<T2>::value,		\
+                          bool>::type					\
+f(const T1& x, const T2& y) {						\
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy,	\
+    		      typename Native_Checked_From_Wrapper<T2>::Policy>	\
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),			\
+     Native_Checked_From_Wrapper<T2>::raw_value(y));			\
+}
+
+DEF_COMPARE(equal, eq_ext)
+DEF_COMPARE(not_equal, ne_ext)
+DEF_COMPARE(greater_or_equal, ge_ext)
+DEF_COMPARE(greater_than, gt_ext)
+DEF_COMPARE(less_or_equal, le_ext)
+DEF_COMPARE(less_than, lt_ext)
+
+#undef DEF_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+  return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> r;
+  Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+  return r;
+}
+
+#define DEF_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x) { \
+  Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION));	\
+}
+
+#define DEF_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+  const Checked_Number<T, Policy>& z) { \
+  Policy::handle_result(fun(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN5_5(f, fun)					\
+template <typename T, typename Policy>					\
+inline void								\
+f(Checked_Number<T, Policy>& x,						\
+  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t,		\
+  const Checked_Number<T, Policy>& y,					\
+  const Checked_Number<T, Policy>& z) {					\
+  Policy::handle_result(fun(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+DEF_ASSIGN_FUN2_1(floor_assign, floor_assign_r)
+DEF_ASSIGN_FUN2_2(floor_assign, floor_assign_r)
+
+DEF_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r)
+DEF_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r)
+
+DEF_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r)
+DEF_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r)
+
+DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+DEF_ASSIGN_FUN2_1(abs_assign, abs_assign_r)
+DEF_ASSIGN_FUN2_2(abs_assign, abs_assign_r)
+
+DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(rem_assign, rem_assign_r)
+
+DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef DEF_ASSIGN_FUN2_1
+#undef DEF_ASSIGN_FUN2_2
+#undef DEF_ASSIGN_FUN3_2
+#undef DEF_ASSIGN_FUN3_3
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y,
+		 const Checked_Number<T, Policy>& z) {
+  Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type
+sgn(const From& x) {
+  Result r = Checked::sgn_ext<typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_From_Wrapper<From>::raw_value(x));
+  switch (r) {
+  case V_LT:
+    return -1;
+  case V_EQ:
+    return 0;
+  case V_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y) {
+  Result r
+    = Checked::cmp_ext<typename Native_Checked_From_Wrapper<From1>::Policy,
+                       typename Native_Checked_From_Wrapper<From2>::Policy>
+                 (Native_Checked_From_Wrapper<From1>::raw_value(x),
+		  Native_Checked_From_Wrapper<From2>::raw_value(y));
+  switch (r) {
+  case V_LT:
+    return -1;
+  case V_EQ:
+    return 0;
+  case V_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os, const T& x,
+       const Numeric_Format& fmt, Rounding_Dir dir) {
+  return check_result(Checked::output_ext<typename Native_Checked_From_Wrapper<T>::Policy>
+		      (os,
+		       Native_Checked_From_Wrapper<T>::raw_value(x),
+		       fmt,
+		       rounding_dir(dir)),
+		      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+  Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+  return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir) {
+  return check_result(Checked::input_ext<typename Native_Checked_To_Wrapper<T>::Policy>
+		      (Native_Checked_To_Wrapper<T>::raw_value(x),
+		       is,
+		       rounding_dir(dir)),
+		      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+				Checked_Number<T, Policy>& x) {
+  Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+  if (r == V_CVT_STR_UNK)
+    is.setstate(std::ios::failbit);
+  else
+    Policy::handle_result(r);
+  return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+  return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+  return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+  return NOT_A_NUMBER;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+  using std::swap;
+  swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T>
+inline void
+maybe_reset_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_reset_inexact();
+}
+
+template <typename T>
+inline int
+maybe_check_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_check_inexact();
+  else
+    return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_numeric_limits.hh line 1
+/* Specializations of std::numeric_limits for "checked" types.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/checked_numeric_limits.hh line 28
+#include <limits>
+
+namespace std {
+
+using namespace Parma_Polyhedra_Library;
+
+#define PPL_SPECIALIZE_LIMITS_INT(T)					\
+/*! \brief Partial specialization of std::numeric_limits. */		\
+template <typename Policy>						\
+class numeric_limits<Checked_Number<T, Policy> > \
+  : public numeric_limits<T> {						\
+ private:								\
+  typedef Checked_Number<T, Policy> Type;	\
+									\
+ public:								\
+  static const bool has_infinity = Policy::has_infinity;		\
+  static const bool has_quiet_NaN =  Policy::has_nan;		\
+									\
+  static Type min() {							\
+    return Checked::Extended_Int<Policy, T>::min; \
+  }									\
+									\
+  static Type max() {							\
+    return Checked::Extended_Int<Policy, T>::max; \
+  }									\
+									\
+  static Type infinity() {						\
+    return								\
+      Policy::has_infinity						\
+      ? PLUS_INFINITY				\
+      : static_cast<Type>(0);						\
+  }									\
+									\
+  static Type quiet_NaN() {						\
+    return								\
+      Policy::has_nan						\
+      ? NOT_A_NUMBER				\
+      : static_cast<Type>(0);						\
+  }									\
+};
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T)					\
+/*! \brief Partial specialization of std::numeric_limits. */		\
+template <typename Policy>						\
+struct numeric_limits<Checked_Number<T, Policy> > \
+  : public numeric_limits<T> {						\
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpz_class, Policy> >
+  : public numeric_limits<mpz_class> {
+private:
+  typedef Checked_Number<mpz_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
+
+  static Type infinity() {
+    return
+      Policy::has_infinity
+      ? PLUS_INFINITY
+      : static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return
+      Policy::has_nan
+      ? NOT_A_NUMBER
+      : static_cast<Type>(0);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+  typedef Checked_Number<mpq_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
+
+  static Type infinity() {
+    return
+      Policy::has_infinity
+      ? PLUS_INFINITY
+      : static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return
+      Policy::has_nan
+      ? NOT_A_NUMBER
+      : static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.templates.hh line 1
+/* Checked_Number class implementation: non-inline template functions.
+*/
+
+
+#include <cassert>
+#include <iomanip>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t) {
+  if (std::numeric_limits<T>::is_exact)
+    // An exact datatype: pretty printer is accurate.
+    s << t;
+  else {
+    // An inexact datatype (probably floating point):
+    // first dump its hexadecimal representation ...
+    const std::ios_base::fmtflags old_flags = s.flags();
+    s << std::hex;
+    const unsigned char* p = reinterpret_cast<const unsigned char*>(&t);
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      s << std::setw(2) << std::setfill('0');
+      s << static_cast<unsigned>(p[i]);
+    }
+    s.flags(old_flags);
+    // ... and then pretty print it for readability.
+    s << " (" << t << ")";
+  }
+}
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::istream& s, T& t) {
+  if (std::numeric_limits<T>::is_exact)
+    // An exact datatype: input from pretty printed version is accurate.
+    return (s >> t);
+  else {
+    // An inexact datatype (probably floating point):
+    // first load its hexadecimal representation ...
+    std::string str;
+    if (!(s >> str) || str.size() != 2*sizeof(T))
+      return false;
+    unsigned char* p = reinterpret_cast<unsigned char*>(&t);
+    // CHECKME: any (portable) simpler way?
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      unsigned byte_value = 0;
+      for (unsigned j = 0; j < 2; ++j) {
+        byte_value <<= 4;
+        unsigned half_byte_value;
+        // Interpret single hex character.
+        switch (str[2*i+j]) {
+        case '0':
+          half_byte_value = 0;
+          break;
+        case '1':
+          half_byte_value = 1;
+          break;
+        case '2':
+          half_byte_value = 2;
+          break;
+        case '3':
+          half_byte_value = 3;
+          break;
+        case '4':
+          half_byte_value = 4;
+          break;
+        case '5':
+          half_byte_value = 5;
+          break;
+        case '6':
+          half_byte_value = 6;
+          break;
+        case '7':
+          half_byte_value = 7;
+          break;
+        case '8':
+          half_byte_value = 8;
+          break;
+        case '9':
+          half_byte_value = 9;
+          break;
+        case 'A':
+        case 'a':
+          half_byte_value = 10;
+          break;
+        case 'B':
+        case 'b':
+          half_byte_value = 11;
+          break;
+        case 'C':
+        case 'c':
+          half_byte_value = 12;
+          break;
+        case 'D':
+        case 'd':
+          half_byte_value = 13;
+          break;
+        case 'E':
+        case 'e':
+          half_byte_value = 14;
+          break;
+        case 'F':
+        case 'f':
+          half_byte_value = 15;
+          break;
+        default:
+          return false;
+        }
+        byte_value += half_byte_value;
+      }
+      assert(byte_value <= 255);
+      p[i] = static_cast<unsigned char>(byte_value);
+    }
+    // ... then read and discard pretty printed value.
+    if (!(s >> str))
+      return false;
+    const unsigned sz = str.size();
+    return sz > 2 && str[0] == '(' && str[sz-1] == ')';
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Checked_Number.defs.hh line 1065
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.types.hh line 16
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+  //! The type used for references to const 8 bit checked integers.
+  typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+  //! The type used for references to const 16 bit checked integers.
+  typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+  //! The type used for references to const 32 bit checked integers.
+  typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+  //! The type used for references to const 64 bit checked integers.
+  typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+#ifdef PPL_GMP_INTEGERS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.types.hh line 67
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators,
+  intervals, bounding boxes and so on. Depending on the chosen
+  configuration options (see file <CODE>README.configure</CODE>),
+  a Coefficient may actually be:
+    - The GMP_Integer type, which in turn is an alias for the
+      <CODE>mpz_class</CODE> type implemented by the C++ interface
+      of the GMP library (this is the default configuration);
+    - An instance of the Checked_Number class template: with its default
+      policy (Checked_Number_Default_Policy), this implements overflow
+      detection on top of a native integral type (available template
+      instances include checked integers having 8, 16, 32 or 64 bits);
+      with the Checked_Number_Transparent_Policy, this is a wrapper
+      for native integral types with no overflow detection
+      (available template instances are as above).
+*/
+typedef PPL_COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/iterator_to_const.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+class iterator_to_const;
+
+template <typename Container>
+class const_iterator_to_const;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/distances.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization;
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization;
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Info.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+class Interval_Info_Null;
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+class Box;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Init.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Row_Impl_Handler;
+class Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variable.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variables_Set.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Expression.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Scalar_Products.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum MIP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_MIP_PROBLEM,
+  //! The problem is unbounded.
+  UNBOUNDED_MIP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_MIP_PROBLEM
+};
+
+class MIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Con_Relation.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Gen_Relation.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BHRZ03_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/H79_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Polyhedron.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/NNC_Polyhedron.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ptr_Iterator.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Row_Impl_Handler;
+
+template <typename T>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class OR_Matrix;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Octagonal_Shape;
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.defs.hh line 1
+/* GMP_Integer class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.defs.hh line 28
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates GMP_Integer */
+#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type total_memory_in_bytes(const GMP_Integer& x);
+
+#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates GMP_Integer */
+#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type external_memory_in_bytes(const GMP_Integer& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the remainder of the division of \p y by \p z.
+/*! \relates GMP_Integer */
+void rem_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+  Assigns to \p x the greatest common divisor of \p y and \p z, and to
+  \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+		   const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+		    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+		    const GMP_Integer& y, const GMP_Integer& z);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates GMP_Integer
+  The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+		      const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.inlines.hh line 1
+/* GMP_Integer class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+  mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x) {
+  mpz_abs(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_abs(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+rem_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_tdiv_r(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+	      const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcdext(x.get_mpz_t(),
+	     s.get_mpz_t(), t.get_mpz_t(),
+	     y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  assert(y % z == 0);
+  mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+  return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+  return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+  return x;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/GMP_Integer.defs.hh line 141
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.defs.hh line 1
+/* Coefficient class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.defs.hh line 27
+#include <iosfwd>
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.defs.hh line 32
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.defs.hh line 36
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Initializes the Coefficient constants.
+#endif
+void Coefficient_constants_initialize();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Finalizes the Coefficient constants.
+#endif
+void Coefficient_constants_finalize();
+
+//! Returns a const reference to a Coefficient with value 0.
+Coefficient_traits::const_reference Coefficient_zero();
+
+//! Returns a const reference to a Coefficient with value 1.
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.inlines.hh line 1
+/* Coefficient class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient zero(0);
+  return zero;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient one(1);
+  return one;
+}
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  extern const Coefficient* Coefficient_zero_p;
+  return *Coefficient_zero_p;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  extern const Coefficient* Coefficient_one_p;
+  assert(*Coefficient_one_p != 0);
+  return *Coefficient_one_p;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Coefficient.defs.hh line 59
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/math_utilities.defs.hh line 1
+/* Declarations of some math utility functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/math_utilities.defs.hh line 28
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+void
+numer_denom(const Checked_Number<T, Policy>& from,
+	    Coefficient& num, Coefficient& den);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+void
+div_round_up(Checked_Number<T, Policy>& to,
+	     Coefficient_traits::const_reference x,
+	     Coefficient_traits::const_reference y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+min_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+max_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is an even number.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+bool
+is_even(const Checked_Number<T, Policy>& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \f$x = -y\f$.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+bool
+is_additive_inverse(const Checked_Number<T, Policy>& x,
+		    const Checked_Number<T, Policy>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+  divided by \f$g\f$ are assigned to \p nx and \p ny, respectively.
+
+  \note
+  \p x and \p nx may be the same object and likewise for
+  \p y and \p ny.  Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is in canonical form.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+is_canonical(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T
+low_bits_mask(unsigned n);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/math_utilities.inlines.hh line 1
+/* Implementation of some math utility functions: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/math_utilities.inlines.hh line 27
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny) {
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, x, y);
+  exact_div_assign(nx, x, gcd);
+  exact_div_assign(ny, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+  assert(n < unsigned(std::numeric_limits<T>::digits));
+  return n == 0 ? 0 : ~(~(T(0u)) << n);
+}
+
+template <typename T, typename Policy>
+inline void
+numer_denom(const Checked_Number<T, Policy>& from,
+	    Coefficient& num, Coefficient& den) {
+  assert(!is_not_a_number(from)
+	 && !is_minus_infinity(from)
+	 && !is_plus_infinity(from));
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q, from, ROUND_NOT_NEEDED);
+  num = q.get_num();
+  den = q.get_den();
+}
+
+template <typename T, typename Policy>
+inline void
+div_round_up(Checked_Number<T, Policy>& to,
+	     Coefficient_traits::const_reference x,
+	     Coefficient_traits::const_reference y) {
+  DIRTY_TEMP0(mpq_class, qx);
+  DIRTY_TEMP0(mpq_class, qy);
+  // Note: this code assumes that a Coefficient is always convertible
+  // to an mpq_class without loss of precision.
+  assign_r(qx, x, ROUND_NOT_NEEDED);
+  assign_r(qy, y, ROUND_NOT_NEEDED);
+  div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
+  assign_r(to, qx, ROUND_UP);
+}
+
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+  if (x > y)
+    x = y;
+}
+
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+  if (x < y)
+    x = y;
+}
+
+template <typename T, typename Policy>
+inline bool
+is_even(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> half_x;
+  return div2exp_assign_r(half_x, x, 1, ROUND_DIRECT) == V_EQ
+    && is_integer(half_x);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_additive_inverse(const Checked_Number<T, Policy>& x,
+		    const Checked_Number<T, Policy>& y) {
+  Checked_Number<T, Policy> negated_x;
+  return neg_assign_r(negated_x, x, ROUND_DIRECT) == V_EQ
+    && negated_x == y;
+}
+
+inline bool
+is_canonical(const mpq_class& x) {
+  if (x.get_den() <= 0)
+    return false;
+  DIRTY_TEMP0(mpq_class, temp);
+  temp = x;
+  temp.canonicalize();
+  return temp.get_num() == x.get_num();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/math_utilities.defs.hh line 109
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/iterator_to_const.defs.hh line 1
+/* iterator_to_const and const_iterator_to_const class declarations.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Powerset.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/iterator_to_const.defs.hh line 28
+//#include "Ask_Tell.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This template class implements a bidirectional <EM>read-only</EM>
+  iterator on the sequence of objects <CODE>Container</CODE>.
+  By using this iterator class it is not possible to modify the objects
+  contained in <CODE>Container</CODE>; rather, object modification has
+  to be implemented by object replacement, i.e., by using the methods
+  provided by <CODE>Container</CODE> to remove/insert objects.
+  Such a policy (a modifiable container of read-only objects) allows
+  for a reliable enforcement of invariants (such as sortedness of the
+  objects in the sequence).
+
+  \note
+  For any developers' need, suitable friend declarations allow for
+  accessing the low-level iterators on the sequence of objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::iterator_to_const {
+private:
+  //! The type of the underlying mutable iterator.
+  typedef typename Container::iterator Base;
+
+  //! A shortcut for naming the const_iterator traits.
+  typedef typename
+  std::iterator_traits<typename Container::const_iterator> Traits;
+
+  //! A (mutable) iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level iterator.
+  iterator_to_const(const Base& b);
+
+  friend class const_iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+  //template <typename T> friend class Ask_Tell;
+
+public:
+  // Same traits of the const_iterator, therefore
+  // forbidding the direct modification of sequence elements.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  iterator_to_const();
+
+  //! Copy constructor.
+  iterator_to_const(const iterator_to_const& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect access operator.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const iterator_to_const& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This class, besides implementing a read-only bidirectional iterator
+  on a read-only sequence of objects, ensures interoperability
+  with template class iterator_to_const.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::const_iterator_to_const {
+private:
+  //! The type of the underlying %const_iterator.
+  typedef typename Container::const_iterator Base;
+
+  //! A shortcut for naming traits.
+  typedef typename std::iterator_traits<Base> Traits;
+
+  //! A %const_iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level const_iterator.
+  const_iterator_to_const(const Base& b);
+
+  friend class iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+  //template <typename T> friend class Ask_Tell;
+
+public:
+  // Same traits of the underlying const_iterator.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  const_iterator_to_const();
+
+  //! Copy constructor.
+  const_iterator_to_const(const const_iterator_to_const& y);
+
+  //! Constructs from the corresponding non-const iterator.
+  const_iterator_to_const(const iterator_to_const<Container>& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  const_iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  const_iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  const_iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  const_iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const const_iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const const_iterator_to_const& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is identical to \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator==(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is different from \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator!=(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/iterator_to_const.inlines.hh line 1
+/* iterator_to_const and const_iterator_to_const class implementations:
+   inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::reference
+iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::pointer
+iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator++(int) {
+  iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator--(int) {
+  iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator==(const iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator!=(const iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const const_iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::reference
+const_iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::pointer
+const_iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator++(int) {
+  const_iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator--(int) {
+  const_iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator==(const const_iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator!=(const const_iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const iterator_to_const<Container>& y)
+  : base(y.base) {
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator==(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y) {
+  return const_iterator_to_const<Container>(x).operator==(y);
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator!=(const iterator_to_const<Container>& x,
+	   const const_iterator_to_const<Container>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/iterator_to_const.defs.hh line 220
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/distances.defs.hh line 1
+/* Class declarations for several distances.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/distances.defs.hh line 28
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Rectilinear_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Euclidean_Distance_Specialization {
+  static void combine(Temp& running, Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp& running, Rounding_Dir dir);
+};
+
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::L_Infinity_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/distances.inlines.hh line 1
+/* Inline functions implementing distances.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/distances.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+// A struct to work around the lack of partial specialization
+// of function templates in C++.
+template <typename To, typename From>
+struct maybe_assign_struct {
+  static inline Result
+  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+    // When `To' and `From' are different types, we make the conversion
+    // and use `tmp'.
+    top = &tmp;
+    return assign_r(tmp, from, dir);
+  }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+  static inline Result
+  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+    // When the types are the same, conversion is unnecessary.
+    top = &from;
+    return V_EQ;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Assigns to \p top a pointer to a location that holds the
+  conversion, according to \p dir, of \p from to type \p To.  When
+  necessary, and only when necessary, the variable \p tmp is used to
+  hold the result of conversion.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
+						   const Temp& current,
+						   Rounding_Dir dir) {
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
+						 Temp& current,
+						 Rounding_Dir dir) {
+  mul_assign_r(current, current, current, dir);
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
+						  Rounding_Dir dir) {
+  sqrt_assign_r(running, running, dir);
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
+						  const Temp& current,
+						  Rounding_Dir) {
+  if (current > running)
+    running = current;
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/distances.defs.hh line 52
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Boundary.defs.hh line 1
+/* Interval boundary functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Boundary.defs.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+namespace Boundary_NS {
+
+struct Unbounded {
+  Unbounded() {
+  }
+};
+
+const Unbounded UNBOUNDED;
+
+struct Property {
+  enum Type {
+    SPECIAL_,
+    OPEN_,
+    NORMALIZED_
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+static const Property SPECIAL(Property::SPECIAL_);
+static const Property OPEN(Property::OPEN_);
+static const Property NORMALIZED(Property::NORMALIZED_);
+
+enum Boundary_Type {
+  LOWER = ROUND_DOWN,
+  UPPER = ROUND_UP
+};
+
+inline Rounding_Dir
+round_dir_check(Boundary_Type t, bool check = false) {
+  if (check)
+    return static_cast<Rounding_Dir>(t | ROUND_FPU_CHECK_INEXACT);
+  else
+    return static_cast<Rounding_Dir>(t);
+}
+
+template <typename T, typename Info>
+inline Result
+special_set_boundary_infinity(Boundary_Type type, T&, Info& info) {
+  assert(Info::store_special);
+  info.set_boundary_property(type, SPECIAL);
+  return V_EQ;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_boundary_infinity(Boundary_Type, const T&, const Info&) {
+  return true;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_open(Boundary_Type, const T&, const Info&) {
+  return !Info::may_contain_infinity;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::store_special && !Info::may_contain_infinity
+      && normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::may_contain_infinity
+      && is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline Result
+set_unbounded(Boundary_Type type, T& x, Info& info) {
+  COMPILE_TIME_CHECK(Info::store_special
+		     || std::numeric_limits<T>::is_bounded
+		     || std::numeric_limits<T>::has_infinity,
+		     "Unbounded is not representable");
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, ROUND_UP);
+  else
+    r = assign_r(x, PLUS_INFINITY, ROUND_DOWN);
+  if (r == V_EQ && !Info::may_contain_infinity)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  /*
+  COMPILE_TIME_CHECK(Info::store_special
+		     || std::numeric_limits<T>::has_infinity,
+		     "Minus infinity is not representable");
+  */
+  if (open)
+    assert(type == LOWER);
+  else
+    assert(Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special) {
+    assert(type == LOWER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+  assert(r != VC_MINUS_INFINITY);
+  if (open || r != V_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  /*
+  COMPILE_TIME_CHECK(Info::store_special
+		     || std::numeric_limits<T>::has_infinity,
+		     "Minus infinity is not representable");
+  */
+  if (open)
+    assert(type == UPPER);
+  else
+    assert(Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special) {
+    assert(type == UPPER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+  assert(r != VC_MINUS_INFINITY);
+  if (open || r != V_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  assert(open || Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+  else
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+  assert(r == V_EQ);
+  if (open)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+shrink(Boundary_Type type, T& x, Info& info) {
+  Result r;
+  if (type == LOWER) {
+    r = info.restrict(x, V_GT);
+    if (r != V_GT)
+      return r;
+  } else {
+    r = info.restrict(x, V_LT);
+    if (r != V_LT)
+      return r;
+  }
+  info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline bool
+is_unbounded(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special)
+    return info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info);
+  else if (std::numeric_limits<T>::has_infinity) {
+    if (type == LOWER)
+      return Parma_Polyhedra_Library::is_minus_infinity(x);
+    else
+      return Parma_Polyhedra_Library::is_plus_infinity(x);
+  }
+  else if (std::numeric_limits<T>::is_bounded) {
+    if (type == LOWER)
+      return x == std::numeric_limits<T>::min();
+    else
+      return x == std::numeric_limits<T>::max();
+  } else
+    return false;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (type == LOWER)
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_reverse_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (!Info::may_contain_infinity)
+    return false;
+  else if (type == LOWER)
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_minus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == LOWER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL)
+	&& special_is_boundary_infinity(type, x, info);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_plus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == UPPER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL)
+	&& special_is_boundary_infinity(type, x, info);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special)
+    return info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info);
+  else
+    return normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) {
+  return !Info::store_special
+    && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline int
+is_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (is_boundary_infinity(type, x, info))
+    return type == LOWER ? -1 : 1;
+  else if (is_reverse_infinity(type, x, info))
+    return type == UPPER ? -1 : 1;
+  else
+    return 0;
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity_closed(Boundary_Type type, const T& x, const Info& info) {
+  return Info::may_contain_infinity
+    && !info.get_boundary_property(type, OPEN)
+    && is_boundary_infinity(type, x, info);
+}
+
+template <typename Info>
+inline bool
+boundary_infinity_is_open(Boundary_Type type, const Info& info) {
+  return !Info::may_contain_infinity ||
+    info.get_boundary_property(type, OPEN);
+}
+
+template <typename T, typename Info>
+inline int
+sgn_b(Boundary_Type type, const T& x, const Info& info) {
+  if (info.get_boundary_property(type, SPECIAL) &&
+      special_is_boundary_infinity(type, x, info))
+    return type == LOWER ? -1 : 1;
+  else
+    // The following Parma_Polyhedra_Library:: qualification is to work
+    // around a bug of GCC 4.0.x.
+    return Parma_Polyhedra_Library::sgn(x);
+}
+
+template <typename T, typename Info>
+inline int
+sgn(Boundary_Type type, const T& x, const Info& info) {
+  int sign = sgn_b(type, x, info);
+  if (x == 0 && info.get_boundary_property(type, OPEN))
+    return type == LOWER ? -1 : 1;
+  else
+    return sign;
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+eq(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (type1 == type2) {
+    if (is_open(type1, x1, info1)
+	!= is_open(type2, x2, info2))
+      return false;
+  }
+  else if (is_open(type1, x1, info1)
+	   || is_open(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1))
+    return is_minus_infinity(type2, x2, info2);
+  else if (is_plus_infinity(type1, x1, info1))
+    return is_plus_infinity(type2, x2, info2);
+  else if (is_minus_infinity(type2, x2, info2) ||
+	   is_plus_infinity(type2, x2, info2))
+    return false;
+  else
+    return equal(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+lt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (is_open(type1, x1, info1)) {
+    if (type1 == UPPER
+	&& (type2 == LOWER
+	    || !is_open(type2, x2, info2)))
+      goto le;
+  }
+  else if (type2 == LOWER
+	   && is_open(type2, x2, info2)) {
+  le:
+    if (is_minus_infinity(type1, x1, info1)
+	|| is_plus_infinity(type2, x2, info2))
+      return true;
+    if (is_plus_infinity(type1, x1, info1)
+	|| is_minus_infinity(type2, x2, info2))
+      return false;
+    else
+      return less_or_equal(x1, x2);
+  }
+  if (is_plus_infinity(type1, x1, info1)
+      || is_minus_infinity(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1)
+      || is_plus_infinity(type2, x2, info2))
+    return true;
+  else
+    return less_than(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+gt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return lt(type2, x2, info2, type1, x1, info1);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+le(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !gt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+ge(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !lt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T, typename Info>
+inline Result
+adjust_boundary(Boundary_Type type, T& x, Info& info,
+		bool open, Result r) {
+  if (type == LOWER) {
+    switch (r) {
+    case V_NEG_OVERFLOW:
+      open = true;
+      /* Fall through */
+    case VC_MINUS_INFINITY:
+      if (!Info::store_special)
+	return r;
+      if (open)
+	info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_GT:
+      open = true;
+      /* Fall through */
+    case V_GE:
+    case V_EQ:
+      if (open)
+	shrink(type, x, info);
+      // FIXME: what to return?
+      return r;
+    default:
+      assert(false);
+      return VC_NAN;
+    }
+  }
+  else {
+    switch (r) {
+    case V_POS_OVERFLOW:
+      open = true;
+      /* Fall through */
+    case VC_PLUS_INFINITY:
+      if (!Info::store_special)
+	return r;
+      if (open)
+	info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_LT:
+      open = true;
+      /* Fall through */
+    case V_LE:
+    case V_EQ:
+      if (open)
+	shrink(type, x, info);
+      // FIXME: what to return?
+      return r;
+    default:
+      assert(false);
+      return VC_NAN;
+    }
+  }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+complement(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  assert(to_type != type);
+  bool shrink;
+  if (info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info)) {
+    shrink = !special_is_open(type, x, info);
+    if (type == LOWER)
+      return set_minus_infinity(to_type, to, to_info, shrink);
+    else
+      return set_plus_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = !normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+assign(Boundary_Type to_type, To& to, To_Info& to_info,
+       Boundary_Type type, const T& x, const Info& info,
+       bool shrink = false) {
+  assert(to_type == type);
+  if (info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info)) {
+    shrink = shrink || special_is_open(type, x, info);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = shrink || normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  if (lt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (lt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  if (gt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (gt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+neg_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type, const T& x, const Info& info) {
+  assert(to_type != type);
+  bool shrink;
+  if (info.get_boundary_property(type, SPECIAL)
+      && special_is_boundary_infinity(type, x, info)) {
+    shrink = special_is_open(type, x, info);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = neg_assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+add_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  assert(type1 == type2);
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1) &&
+      !is_boundary_infinity_closed(type2, x2, info2);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2) &&
+      !is_boundary_infinity_closed(type1, x1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  // FIXME: extended handling is not needed
+  Result r = add_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+sub_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  assert(type1 != type2);
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1) &&
+      !is_boundary_infinity_closed(type2, x2, info2);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2) &&
+      !is_boundary_infinity_closed(type1, x1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  // FIXME: extended handling is not needed
+  Result r = sub_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1) &&
+      !is_boundary_infinity_closed(type2, x2, info2);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2) &&
+      !is_boundary_infinity_closed(type1, x1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  assert(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = mul_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info>
+inline Result
+set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool shrink) {
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open || to_info.has_restriction())));
+  Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+	     Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+	     Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  bool shrink;
+  if (x1s != 0) {
+    if (x2s != 0)
+      return mul_assign(to_type, to, to_info,
+			type1, x1, info1,
+			type2, x2, info2);
+    else
+      shrink = info2.get_boundary_property(type2, OPEN);
+  }
+  else {
+    shrink = info1.get_boundary_property(type1, OPEN)
+      && (x2s != 0 || info2.get_boundary_property(type2, OPEN));
+  }
+  return set_zero(to_type, to, to_info, shrink);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+	   Boundary_Type type1, const T1& x1, const Info1& info1,
+	   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    shrink = boundary_infinity_is_open(type1, info1);
+    return set_boundary_infinity(to_type, to, to_info, shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    shrink = boundary_infinity_is_open(type2, info2);
+    return set_zero(to_type, to, to_info, shrink);
+  }
+  shrink = normal_is_open(type1, x1, info1)
+    || normal_is_open(type2, x2, info2);
+  bool check = (To_Info::check_inexact
+		|| (!shrink && (To_Info::store_open
+				|| to_info.has_restriction())));
+  assert(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = div_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, shrink, r);
+}
+
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+	     Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+	     Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  bool shrink;
+  if (x1s != 0) {
+    if (x2s != 0)
+      return div_assign(to_type, to, to_info,
+			type1, x1, info1,
+			type2, x2, info2);
+    else {
+      // FIXME: restrictions
+      return set_boundary_infinity(to_type, to, to_info, true);
+    }
+  }
+  else {
+    shrink = info1.get_boundary_property(type1, OPEN)
+      && !is_boundary_infinity_closed(type2, x2, info2);
+    return set_zero(to_type, to, to_info, shrink);
+  }
+}
+
+} // namespace Boundary_NS
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Info.defs.hh line 1
+/* Interval_Info class declaration and implementation.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Restriction.defs.hh line 1
+/* Interval_Restriction class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Restriction.defs.hh line 29
+
+namespace Parma_Polyhedra_Library {
+
+struct Interval_Base;
+
+template <typename T, typename Enable = void>
+struct Boundary_Value {
+  typedef T type;
+};
+
+template <typename T>
+struct Boundary_Value<T, typename Enable_If<Is_Same_Or_Derived<Interval_Base, T>::value>::type > {
+  typedef typename T::boundary_type type;
+};
+
+class Interval_Restriction_None_Base {
+public:
+  bool has_restriction() const {
+    return false;
+  }
+  void normalize() const {
+  }
+  template <typename T>
+  Result restrict(T&, Result dir) const {
+    return dir;
+  }
+};
+
+inline bool
+eq_restriction(const Interval_Restriction_None_Base&, const Interval_Restriction_None_Base) {
+  return true;
+}
+
+template <typename T>
+inline bool
+contains_restriction(const Interval_Restriction_None_Base&, const T&) {
+  return true;
+}
+
+template <typename T>
+inline bool
+assign_restriction(Interval_Restriction_None_Base&, const T&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+join_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+intersect_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+diff_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T>
+inline bool
+neg_restriction(Interval_Restriction_None_Base&, const T&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+add_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+sub_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+mul_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+template <typename T1, typename T2>
+inline bool
+div_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) {
+  return true;
+}
+
+inline void
+output_restriction(std::ostream&, const Interval_Restriction_None_Base&) {
+}
+
+template <typename Base>
+class Interval_Restriction_None : public Interval_Restriction_None_Base,
+				  public Base {
+public:
+  Interval_Restriction_None() {
+  };
+  template <typename T>
+  Interval_Restriction_None(const T& init)
+    : Base(init) {
+  }
+};
+
+class Interval_Restriction_Integer_Base {
+};
+
+template <typename Base>
+class Interval_Restriction_Integer : public Interval_Restriction_Integer_Base, public Base {
+public:
+  Interval_Restriction_Integer() {
+  }
+  void set_integer(bool v = true) {
+    return set_bit(Base::bitset, integer_bit, v);
+  }
+  bool get_integer() const {
+    return get_bit(Base::bitset, integer_bit);
+  }
+
+  const_int_nodef(integer_bit, Base::next_bit);
+  const_int_nodef(next_bit, integer_bit + 1);
+  bool has_restriction() const {
+    return get_integer();
+  }
+  void normalize() const {
+  }
+  template <typename T>
+  Result restrict(T& x, Result dir) const {
+    if (!has_restriction())
+      return dir;
+    switch (dir) {
+    case V_GT:
+      if (is_integer(x))
+	return add_assign_r(x, x, static_cast<T>(1), ROUND_DOWN);
+      /* Fall through */
+    case V_GE:
+      return ceil_assign_r(x, x, ROUND_DOWN);
+    case V_LT:
+      if (is_integer(x))
+	sub_assign_r(x, x, static_cast<T>(1), ROUND_UP);
+      /* Fall through */
+    case V_LE:
+      return floor_assign_r(x, x, ROUND_UP);
+    default:
+      assert(false);
+      return dir;
+    }
+  }
+};
+
+class Simple_Restriction_Integer : public Interval_Restriction_Integer_Base {
+public:
+  Simple_Restriction_Integer(bool i)
+    : integer(i) {
+  }
+  bool get_integer() const {
+    return integer;
+  }
+private:
+  bool integer;
+};
+
+template <typename From, typename Base, typename Enable = void>
+struct Restriction_Integer;
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Native_Or_Checked<From>::value>::type> {
+  typedef Simple_Restriction_Integer type;
+  static type get(const From& x) {
+    return Simple_Restriction_Integer(is_integer(x));
+  }
+};
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_None_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer type;
+  static type get(const From& x) {
+    return Simple_Restriction_Integer(x.is_singleton() && is_integer(x.lower()));
+  }
+};
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, typename From::info_type>::value>::type> {
+  typedef Interval_Restriction_Integer<Base> type;
+  static const type& get(const From& x) {
+    return x.info();
+  }
+};
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T2>::value, bool>::type
+eq_restriction(const T1& x, const T2& y) {
+  return x.get_integer() == y.get_integer();
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Base, T2>::value, bool>::type
+contains_restriction(const T1& x, const T2& y) {
+  return !x.get_integer() || y.get_integer();
+}
+
+template <typename Base, typename From>
+inline bool
+assign_restriction(Interval_Restriction_Integer<Base>& to, const From& x) {
+  to.set_integer(Restriction_Integer<From, Base>::get(x).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+join_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+intersect_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 || Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+diff_restriction(Interval_Restriction_Integer<Base>& to,
+		 const From1& x, const From2&) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer());
+  return true;
+}
+
+template <typename Base, typename From>
+inline bool
+neg_restriction(Interval_Restriction_Integer<Base>& to, const From& x) {
+  to.set_integer(Restriction_Integer<From, Base>::get(x).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+add_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+sub_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+mul_restriction(Interval_Restriction_Integer<Base>& to, const From1& x, const From2& y) {
+  to.set_integer(Restriction_Integer<From1, Base>::get(x).get_integer()
+		 && Restriction_Integer<From2, Base>::get(y).get_integer());
+  return true;
+}
+
+template <typename Base, typename From1, typename From2>
+inline bool
+div_restriction(Interval_Restriction_Integer<Base>& to, const From1&, const From2&) {
+  to.set_integer(false);
+  return true;
+}
+
+template <typename Base>
+inline void
+output_restriction(std::ostream& s, const Interval_Restriction_Integer<Base>& x) {
+  if (x.get_integer())
+    s << "i";
+}
+
+class Interval_Restriction_Integer_Modulo_Base {
+};
+
+template <typename T, typename Base>
+class Interval_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base, public Base {
+public:
+  COMPILE_TIME_CHECK(std::numeric_limits<T>::is_exact, "Type for modulo values must be exact.");
+  Interval_Restriction_Integer_Modulo() {
+    // FIXME: would we have speed benefits with uninitialized info?
+    // (Dirty_Temp)
+    clear();
+  }
+  bool has_restriction() const {
+    return divisor != 0;
+  }
+  void clear() {
+    remainder = 0;
+    divisor = 0;
+    Base::clear();
+  }
+  void normalize() const {
+  }
+  template <typename V>
+  Result restrict(V& x, Result dir) const {
+    if (!has_restriction())
+      return dir;
+    DIRTY_TEMP(V, n);
+    DIRTY_TEMP(V, div);
+    Result r;
+    r = assign_r(div, divisor, ROUND_CHECK);
+    assert(r == V_EQ);
+    int s;
+    r = rem_assign_r(n, x, div, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    s = sgn(n);
+    switch (dir) {
+    case V_GT:
+      if (s >= 0) {
+	r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return add_assign_r(x, x, n, ROUND_DOWN);
+      }
+      else
+	return sub_assign_r(x, x, n, ROUND_DOWN);
+    case V_GE:
+      if (s > 0) {
+	r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return add_assign_r(x, x, n, ROUND_DOWN);
+      }
+      else if (s < 0)
+	return sub_assign_r(x, x, n, ROUND_DOWN);
+      else
+	return V_EQ;
+    case V_LT:
+      if (s <= 0) {
+	r = add_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return sub_assign_r(x, x, n, ROUND_UP);
+      }
+      else
+	return sub_assign_r(x, x, n, ROUND_UP);
+    case V_LE:
+      if (s < 0) {
+	r = add_assign_r(n, div, n, ROUND_NOT_NEEDED);
+	assert(r == V_EQ);
+	return sub_assign_r(x, x, n, ROUND_UP);
+      }
+      else if (s > 0)
+	return sub_assign_r(x, x, n, ROUND_UP);
+      else
+	return V_EQ;
+    default:
+      assert(false);
+      return dir;
+    }
+  }
+  void assign_or_swap(Interval_Restriction_Integer_Modulo& x) {
+    Parma_Polyhedra_Library::assign_or_swap(remainder, x.remainder);
+    Parma_Polyhedra_Library::assign_or_swap(divisor, x.divisor);
+  }
+  typedef T modulo_type;
+  T remainder;
+  T divisor;
+};
+
+template <typename T, typename Base>
+struct Slow_Copy<Interval_Restriction_Integer_Modulo<T, Base> > : public Bool<Slow_Copy<T>::value> {};
+
+
+template <typename From, typename Base>
+struct Restriction_Integer<From, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer type;
+  static type get(const From& x) {
+    return Simple_Restriction_Integer(x.info().divisor != 0);
+  }
+};
+
+template <typename T>
+struct Simple_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base {
+  template <typename From>
+  Simple_Restriction_Integer_Modulo(const From& r, const From& d)
+    : remainder(r), divisor(d) {
+  }
+  typedef T modulo_type;
+  T remainder;
+  T divisor;
+};
+
+template <typename From, typename T, typename Base, typename Enable = void>
+struct Restriction_Integer_Modulo;
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Native_Or_Checked<From>::value>::type> {
+  typedef Simple_Restriction_Integer_Modulo<T> type;
+  static const type& get(const From& x) {
+    static const type integer(0, 1);
+    static const type not_integer(0, 0);
+    if (is_integer(x))
+      return integer;
+    else
+      return not_integer;
+  }
+};
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_None_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer_Modulo<T> type;
+  static const type& get(const From& x) {
+    static const type integer(0, 1);
+    static const type not_integer(0, 0);
+    if (x.is_singleton() && is_integer(x.lower()))
+      return integer;
+    else
+      return not_integer;
+  }
+};
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Base, typename From::info_type>::value>::type> {
+  typedef Simple_Restriction_Integer_Modulo<T> type;
+  static const type& get(const From& x) {
+    static const type integer(0, 1);
+    static const type not_integer(0, 0);
+    if (x.info().get_integer())
+      return integer;
+    else
+      return not_integer;
+  }
+};
+
+template <typename From, typename T, typename Base>
+struct Restriction_Integer_Modulo<From, T, Base, typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, typename From::info_type>::value>::type> {
+  typedef Interval_Restriction_Integer_Modulo<T, Base> type;
+  static const type& get(const From& x) {
+    return x.info();
+  }
+};
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T2>::value, bool>::type
+eq_restriction(const T1& x, const T2& y) {
+  return x.remainder == y.remainder
+    && x.divisor == y.divisor;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T1>::value && Is_Same_Or_Derived<Interval_Restriction_Integer_Modulo_Base, T2>::value, bool>::type
+contains_restriction(const T1& x, const T2& y) {
+  if (x.divisor == 0)
+    return true;
+  if (y.divisor == 0)
+    return false;
+  if (x.divisor == y.divisor)
+    return x.remainder == y.remainder;
+  DIRTY_TEMP(typename T1::modulo_type, v);
+  Result r;
+  r = rem_assign_r(v, y.divisor, x.divisor, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+  if (v != 0)
+    return false;
+  r = rem_assign_r(v, y.remainder, x.divisor, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+  return v == x.remainder;
+}
+
+template <typename T, typename Base>
+inline bool
+set_unrestricted(Interval_Restriction_Integer_Modulo<T, Base>& to) {
+  to.remainder = 0;
+  to.divisor = 0;
+  return true;
+}
+
+template <typename T, typename Base>
+inline bool
+set_integer(Interval_Restriction_Integer_Modulo<T, Base>& to) {
+  to.remainder = 0;
+  to.divisor = 1;
+  return true;
+}
+
+template <typename T, typename Base, typename From>
+inline bool
+assign_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From& x) {
+  to.remainder = Restriction_Integer_Modulo<From, T, Base>::get(x).remainder;
+  to.divisor = Restriction_Integer_Modulo<From, T, Base>::get(x).divisor;
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+join_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  else if (rx.divisor == 1 && ry.divisor == 1
+      && is_singleton(x) && is_singleton(y)) {
+    DIRTY_TEMP(typename Boundary_Value<From1>::type, a);
+    DIRTY_TEMP(typename Boundary_Value<From2>::type, b);
+    Result r;
+    r = abs_assign_r(a, f_lower(x), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = abs_assign_r(b, f_lower(y), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    if (a > b)
+      r = sub_assign_r(a, a, b, ROUND_CHECK);
+    else
+      r = sub_assign_r(a, b, a, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(to.divisor, a, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = rem_assign_r(b, b, a, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(to.remainder, b, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+  }
+  else if (contains_restriction(rx, ry)) {
+    to.remainder = rx.remainder;
+    to.divisor = rx.divisor;
+  }
+  else if (contains_restriction(ry, rx)) {
+    to.remainder = ry.remainder;
+    to.divisor = ry.divisor;
+  }
+  else
+    return set_integer(to);
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+intersect_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (rx.divisor == 0) {
+    to.remainder = ry.remainder;
+    to.divisor = ry.divisor;
+    return true;
+  }
+  if (ry.divisor == 0) {
+    to.remainder = rx.remainder;
+    to.divisor = rx.divisor;
+    return true;
+  }
+  DIRTY_TEMP(T, g);
+  Result r;
+  r = gcd_assign_r(g, rx.divisor, ry.divisor, ROUND_DIRECT);
+  if (r != V_EQ)
+    return set_integer(to);
+  DIRTY_TEMP(T, d);
+  if (rx.remainder > ry.remainder)
+    r = sub_assign_r(d, rx.remainder, ry.remainder, ROUND_DIRECT);
+  else
+    r = sub_assign_r(d, ry.remainder, rx.remainder, ROUND_DIRECT);
+  if (r != V_EQ)
+    return set_integer(to);
+  r = div_assign_r(d, d, g, ROUND_DIRECT);
+  if (r != V_EQ)
+    return false;
+  r = lcm_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_DIRECT);
+  if (r != V_EQ)
+    return set_integer(to);
+  // FIXME: to be completed
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+diff_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to,
+		 const From1& x, const From2& y) {
+  // FIXME: to be written
+  return true;
+}
+
+template <typename T, typename Base, typename From>
+inline bool
+neg_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From& x) {
+  return assign_restriction(to, x);
+}
+
+template <typename T>
+inline void
+addmod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) {
+  Result r;
+  if (std::numeric_limits<T>::is_bounded) {
+    r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    if (x <= to) {
+      r = add_assign_r(to, x, y, ROUND_NOT_NEEDED);
+      assert(r == V_EQ);
+    }
+    else {
+      r = sub_assign_r(to, x, to, ROUND_NOT_NEEDED);
+      assert(r == V_EQ);
+    }
+  }
+  else {
+    r = add_assign_r(to, x, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+}
+
+template <typename M, typename T>
+inline bool
+assign_rem(M& rem, const T& n, const M& div) {
+  DIRTY_TEMP(T, divisor);
+  DIRTY_TEMP(T, remainder);
+  Result r;
+  r = assign_r(divisor, div, ROUND_CHECK);
+  if (r != V_EQ)
+    return false;
+  r = rem_assign_r(remainder, n, divisor, ROUND_CHECK);
+  if (r != V_EQ)
+    return false;
+  if (sgn(remainder) < 0) {
+    r = add_assign_r(remainder, remainder, divisor, ROUND_CHECK);
+    if (r != V_EQ)
+      return false;
+  }
+  r = assign_r(rem, remainder, ROUND_CHECK);
+  return r == V_EQ;
+}
+
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+add_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  Result r;
+  DIRTY_TEMP(T, rem);
+  if (is_singleton(x)) {
+    if (is_singleton(y))
+      return set_integer(to);
+    if (!assign_rem(rem, f_lower(x), ry.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    addmod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor);
+  }
+  else if (is_singleton(y)) {
+    if (!assign_rem(rem, f_lower(y), rx.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    addmod(to.remainder, rx.remainder, rem, to.divisor, to.divisor);
+  }
+  else {
+    r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    addmod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor);
+  }
+  return true;
+}
+
+template <typename T>
+inline void
+submod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) {
+  Result r;
+  if (x >= y) {
+    r = sub_assign_r(to, x, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  else {
+    r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = add_assign_r(to, x, to, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED);
+  assert(r == V_EQ);
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+sub_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  Result r;
+  DIRTY_TEMP(T, rem);
+  if (is_singleton(x)) {
+    if (is_singleton(y))
+      return set_integer(to);
+    if (!assign_rem(rem, f_lower(x), ry.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    submod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor);
+  }
+  else if (is_singleton(y)) {
+    if (!assign_rem(rem, f_lower(y), rx.divisor))
+      return set_integer(to);
+    r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    submod(to.remainder, rx.remainder, rem, to.divisor, to.divisor);
+  }
+  else {
+    r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    submod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor);
+  }
+  return true;
+}
+
+template <typename T>
+inline void
+mulmod(T& to, const T& x, const T& y, const T& to_m) {
+  Result r;
+  if (std::numeric_limits<T>::is_bounded) {
+    DIRTY_TEMP0(mpz_class, a);
+    DIRTY_TEMP0(mpz_class, b);
+    r = assign_r(a, x, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = assign_r(b, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = mul_assign_r(a, a, b, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = assign_r(b, to_m, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = rem_assign_r(a, a, b, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = assign_r(to, a, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+  else {
+    r = mul_assign_r(to, x, y, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+  }
+}
+
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+mul_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  typedef Restriction_Integer_Modulo<From1, T, Base> Rx;
+  const typename Rx::type& rx = Rx::get(x);
+  if (rx.divisor == 0)
+    return set_unrestricted(to);
+  typedef Restriction_Integer_Modulo<From2, T, Base> Ry;
+  const typename Ry::type& ry = Ry::get(y);
+  if (ry.divisor == 0)
+    return set_unrestricted(to);
+  Result r;
+  DIRTY_TEMP(T, mul);
+  if (is_singleton(x)) {
+    if (is_singleton(y))
+      return set_integer(to);
+    DIRTY_TEMP(typename Boundary_Value<From1>::type, n);
+    r = abs_assign_r(n, f_lower(x), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(mul, n, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.remainder, mul, ry.remainder, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.divisor, mul, ry.divisor, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+  }
+  else if (is_singleton(y)) {
+    DIRTY_TEMP(typename Boundary_Value<From2>::type, n);
+    r = abs_assign_r(n, f_lower(y), ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = assign_r(mul, n, ROUND_CHECK);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.remainder, rx.remainder, mul, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+    r = mul_assign_r(to.divisor, rx.divisor, mul, ROUND_NOT_NEEDED);
+    if (r != V_EQ)
+      return set_integer(to);
+  }
+  else {
+    r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED);
+    assert(r == V_EQ);
+    mulmod(to.remainder, rx.remainder, ry.remainder, to.divisor);
+  }
+  return true;
+}
+
+template <typename T, typename Base, typename From1, typename From2>
+inline bool
+div_restriction(Interval_Restriction_Integer_Modulo<T, Base>& to, const From1& x, const From2& y) {
+  if (is_singleton(y)) {
+    if (is_singleton(x)) {
+      // FIXME: to be written
+    }
+  }
+  return set_unrestricted(to);
+}
+
+template <typename T, typename Base>
+inline void
+output_restriction(std::ostream& s, const Interval_Restriction_Integer_Modulo<T, Base>& x) {
+  if (x.divisor == 1)
+    s << "i";
+  else if (x.divisor != 0)
+    s << "{" << x.remainder << "%" << x.divisor << "}";
+}
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Info.defs.hh line 28
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interval_NS {
+
+struct Property {
+  enum Type {
+    CARDINALITY_0_,
+    CARDINALITY_1_,
+    CARDINALITY_IS_
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+const Property CARDINALITY_0(Property::CARDINALITY_0_);
+const Property CARDINALITY_1(Property::CARDINALITY_1_);
+const Property CARDINALITY_IS(Property::CARDINALITY_IS_);
+
+template <typename T>
+inline void
+reset_bits(T& bits) {
+  bits = 0;
+}
+
+template <typename T>
+inline void
+reset_bit(T& bits, unsigned int bit) {
+  bits &= ~(static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bit(T& bits, unsigned int bit, bool value) {
+  if (value)
+    bits |= static_cast<T>(1) << bit;
+  else
+    reset_bit(bits, bit);
+}
+
+template <typename T>
+inline bool
+get_bit(const T& bits, unsigned int bit) {
+  return bits & (static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bits(T& bits, unsigned int start, unsigned int len, T value) {
+  bits &= ~(((static_cast<T>(1) << len) - 1) << start);
+  bits |= value << start;
+}
+
+template <typename T>
+inline T
+get_bits(T& bits, unsigned int start, unsigned int len) {
+  return (bits >> start) & ((static_cast<T>(1) << len) - 1);
+}
+
+} // namespace Interval_NS
+
+using namespace Interval_NS;
+using namespace Boundary_NS;
+
+
+template <typename Policy>
+class Interval_Info_Null {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_empty_result, Policy::check_empty_result);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_normalized, false);
+  const_bool_nodef(cache_empty, false);
+  const_bool_nodef(cache_singleton, false);
+  void clear() {
+  }
+  void clear_boundary_properties(Boundary_Type) {
+  }
+
+  template <typename Property>
+  void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_boundary_property(Boundary_Type, const Property&) const {
+    return Property::unsupported_value;
+  }
+  template <typename Property>
+  void set_interval_property(const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_interval_property(const Property&) const {
+    return Property::unsupported_value;
+  }
+
+  //! Swaps \p *this with \p y.
+  void swap(Interval_Info_Null& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+};
+
+template <typename Policy>
+class Interval_Info_Null_Open : public Interval_Info_Null<Policy> {
+public:
+  const_bool_nodef(store_open, true);
+  Interval_Info_Null_Open(bool o)
+    : open(o) {
+  }
+  bool get_boundary_property(Boundary_Type, const Boundary_NS::Property& p) const {
+    switch (p.type) {
+    case Boundary_NS::Property::OPEN_:
+      return open;
+    default:
+      return Boundary_NS::Property::unsupported_value;
+    }
+  }
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+private:
+  bool open;
+};
+
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_empty_result, Policy::check_empty_result);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, Policy::store_special);
+  const_bool_nodef(store_open, Policy::store_open);
+  const_bool_nodef(cache_normalized, Policy::cache_normalized);
+  const_bool_nodef(cache_empty, Policy::cache_empty);
+  const_bool_nodef(cache_singleton, Policy::cache_singleton);
+  const_int_nodef(lower_special_bit, Policy::next_bit);
+  const_int_nodef(lower_open_bit, lower_special_bit + store_special);
+  const_int_nodef(lower_normalized_bit, lower_open_bit + store_open);
+  const_int_nodef(upper_special_bit, lower_normalized_bit + cache_normalized);
+  const_int_nodef(upper_open_bit, upper_special_bit + store_special);
+  const_int_nodef(upper_normalized_bit, upper_open_bit + store_open);
+  const_int_nodef(cardinality_is_bit, upper_normalized_bit + cache_normalized);
+  const_int_nodef(cardinality_0_bit, cardinality_is_bit + (cache_empty || cache_singleton));
+  const_int_nodef(cardinality_1_bit, cardinality_0_bit + cache_empty);
+  const_int_nodef(next_bit, cardinality_1_bit + cache_singleton);
+  Interval_Info_Bitset() {
+    // FIXME: would we have speed benefits with uninitialized info?
+    // (Dirty_Temp)
+    clear();
+  }
+
+  void clear() {
+    reset_bits(bitset);
+  }
+  void clear_boundary_properties(Boundary_Type t) {
+    set_boundary_property(t, SPECIAL, false);
+    set_boundary_property(t, OPEN, false);
+  }
+  void set_boundary_property(Boundary_Type t, const Boundary_NS::Property& p, bool value = true) {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (store_special) {
+	if (t == LOWER)
+	  set_bit(bitset, lower_special_bit, value);
+	else
+	  set_bit(bitset, upper_special_bit, value);
+      }
+      break;
+    case Boundary_NS::Property::OPEN_:
+      if (store_open) {
+	if (t == LOWER)
+	  set_bit(bitset, lower_open_bit, value);
+	else
+	  set_bit(bitset, upper_open_bit, value);
+      }
+      break;
+    case Boundary_NS::Property::NORMALIZED_:
+      if (cache_normalized) {
+	if (t == LOWER)
+	  set_bit(bitset, lower_normalized_bit, value);
+	else
+	  set_bit(bitset, upper_normalized_bit, value);
+      }
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_boundary_property(Boundary_Type t, const Boundary_NS::Property& p) const {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (!store_special)
+	return false;
+      if (t == LOWER)
+	return get_bit(bitset, lower_special_bit);
+      else
+	return get_bit(bitset, upper_special_bit);
+    case Boundary_NS::Property::OPEN_:
+      if (!store_open)
+	return false;
+      else if (t == LOWER)
+	return get_bit(bitset, lower_open_bit);
+      else
+	return get_bit(bitset, upper_open_bit);
+    case Boundary_NS::Property::NORMALIZED_:
+      if (!cache_normalized)
+	return false;
+      else if (t == LOWER)
+	return get_bit(bitset, lower_normalized_bit);
+      else
+	return get_bit(bitset, upper_normalized_bit);
+    default:
+      return false;
+    }
+  }
+  void set_interval_property(const Interval_NS::Property& p, bool value = true) {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      if (cache_empty)
+	set_bit(bitset, cardinality_0_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_1_:
+      if (cache_singleton)
+	set_bit(bitset, cardinality_1_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_IS_:
+      if (cache_empty || cache_singleton)
+	set_bit(bitset, cardinality_is_bit, value);
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_interval_property(Interval_NS::Property p) const {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      return cache_empty && get_bit(bitset, cardinality_0_bit);
+    case Interval_NS::Property::CARDINALITY_1_:
+      return cache_singleton && get_bit(bitset, cardinality_1_bit);
+    case Interval_NS::Property::CARDINALITY_IS_:
+      return (cache_empty || cache_singleton) && get_bit(bitset, cardinality_is_bit);
+    default:
+      return false;
+    }
+  }
+
+  //! Swaps \p *this with \p y.
+  void swap(Interval_Info_Bitset& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+protected:
+  T bitset;
+};
+
+}
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Info.inlines.hh line 1
+/* Interval_Info class implementation: inline functions.
+*/
+
+
+#include <iomanip>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::swap(Interval_Info_Null<Policy>&) {
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::ascii_dump(std::ostream& s) const {
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null<Policy>::ascii_load(std::istream& s) {
+  return true;
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null_Open<Policy>::ascii_dump(std::ostream& s) const {
+  s << (open ? "open" : "closed");
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null_Open<Policy>::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str))
+    return false;
+  if (str == "open") {
+    open = true;
+    return true;
+  }
+  if (str == "closed") {
+    open = false;
+    return true;
+  }
+  return false;
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::swap(Interval_Info_Bitset<T, Policy>& y) {
+  std::swap(bitset, y.bitset);
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::ascii_dump(std::ostream& s) const {
+  std::ios_base::fmtflags old = s.flags();
+  s << std::hex << bitset;
+  s.flags(old);
+}
+
+template <typename T, typename Policy>
+inline bool
+Interval_Info_Bitset<T, Policy>::ascii_load(std::istream& s) {
+  std::ios_base::fmtflags old = s.flags();
+  if (s >> std::hex >> bitset) {
+    s.flags(old);
+    return s;
+  }
+  else
+    return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Interval_Info_Null */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+inline void
+swap(Parma_Polyhedra_Library::Interval_Info_Null<Policy>& x,
+     Parma_Polyhedra_Library::Interval_Info_Null<Policy>& y) {
+  x.swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Interval_Info_Bitset */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+inline void
+swap(Parma_Polyhedra_Library::Interval_Info_Bitset<T, Policy>& x,
+     Parma_Polyhedra_Library::Interval_Info_Bitset<T, Policy>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval_Info.defs.hh line 299
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval.defs.hh line 1
+/* Declarations for the Interval class and its constituents.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval.defs.hh line 31
+#include <iosfwd>
+
+// Temporary!
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+enum I_Result {
+  I_EMPTY = 0,
+  /*
+  I_L_EQ = V_EQ,
+  I_L_GT = V_GT,
+  I_L_GE = V_GE,
+  I_U_EQ = V_EQ << 6,
+  I_U_LT = V_LT << 6,
+  I_U_LE = V_LE << 6,
+  */
+  I_MAYBE_EMPTY = 1 << 12,
+  I_SINGULARITIES = 1 << 13
+};
+
+enum Ternary { T_YES, T_NO, T_MAYBE };
+
+inline I_Result
+combine(Result l, Result u) {
+  return static_cast<I_Result>(l | (u << 6));
+}
+
+inline Result
+lower(I_Result r) {
+  return static_cast<Result>(r & 63);
+}
+
+inline Result
+upper(I_Result r) {
+  return static_cast<Result>((r >> 6) & 63);
+}
+
+template <typename Info>
+inline bool
+unrepresentability_error(I_Result r, const Info&) {
+  return !Info::store_special
+    && (is_special(lower(r)) || is_special(upper(r)));
+}
+
+using namespace Boundary_NS;
+using namespace Interval_NS;
+
+struct Interval_Base {};
+
+template <typename T, typename Enable = void>
+struct Is_Singleton : public Is_Native_Or_Checked<T> {};
+
+template <typename T>
+struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
+
+//! A generic, not necessarily closed, possibly restricted interval.
+/*! \ingroup PPL_CXX_interface
+  FIXME: to be written.
+*/
+template <typename Boundary, typename Info>
+class Interval : public Interval_Base, private Info {
+private:
+  COMPILE_TIME_CHECK(!Info::store_special
+		     || !std::numeric_limits<Boundary>::has_infinity,
+		     "store_special is meaningless"
+		     " when boundary type may contains infinity");
+  Info& w_info() const {
+    return const_cast<Interval&>(*this);
+  }
+  bool is_empty_nocache() const {
+    return lt(UPPER, upper(), info(), LOWER, lower(), info());
+  }
+  bool is_singleton_nocache() const {
+    return eq(LOWER, lower(), info(), UPPER, upper(), info());
+  }
+  Result lower_normalize() const {
+    Result r;
+    if (info().get_boundary_property(LOWER, NORMALIZED)
+	|| info().get_boundary_property(LOWER, SPECIAL))
+      r = V_EQ;
+    else {
+      if (info().get_boundary_property(LOWER, OPEN)) {
+	r = info().restrict(lower(), V_GT);
+	if (r != V_GT)
+	  w_info().set_boundary_property(LOWER, OPEN, false);
+      }
+      else {
+	r = info().restrict(lower(), V_GE);
+	if (r == V_GT)
+	  w_info().set_boundary_property(LOWER, OPEN);
+      }
+      w_info().set_boundary_property(LOWER, NORMALIZED);
+    }
+    return r;
+  }
+  Result upper_normalize() const {
+    Result r;
+    if (info().get_boundary_property(UPPER, NORMALIZED)
+	|| info().get_boundary_property(UPPER, SPECIAL))
+      r = V_EQ;
+    else {
+      if (info().get_boundary_property(UPPER, OPEN)) {
+	r = info().restrict(upper(), V_LT);
+	if (r != V_LT)
+	  w_info().set_boundary_property(UPPER, OPEN, false);
+      }
+      else {
+	r = info().restrict(upper(), V_LE);
+	if (r == V_LT)
+	  w_info().set_boundary_property(UPPER, OPEN);
+      }
+      w_info().set_boundary_property(UPPER, NORMALIZED);
+    }
+    return r;
+  }
+
+
+public:
+  typedef Boundary boundary_type;
+  typedef Info info_type;
+
+  typedef Interval_NS::Property Property;
+
+  void lower_load() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    lower_loaded = 1;
+#endif
+  }
+
+  void upper_load() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    upper_loaded = 1;
+#endif
+  }
+
+  void complete_init() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    assert(lower_loaded);
+    assert(upper_loaded);
+    completed = 1;
+#endif
+  }
+
+  void complete_init_internal() {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    lower_loaded = 1;
+    upper_loaded = 1;
+    completed = 1;
+#endif
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator=(const T& x) {
+    assign(x);
+    return *this;
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator+=(const T& x) {
+    add_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator-=(const T& x) {
+    sub_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator*=(const T& x) {
+    mul_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator/=(const T& x) {
+    div_assign(*this, x);
+    return *this;
+  }
+
+  //! Swaps \p *this with \p y.
+  void swap(Interval& y);
+
+  Info& info() {
+    return *this;
+  }
+
+  const Info& info() const {
+    return *this;
+  }
+
+  Boundary& lower() {
+    return lower_;
+  }
+
+  const Boundary& lower() const {
+    return lower_;
+  }
+
+  Boundary& upper() {
+    return upper_;
+  }
+
+  const Boundary& upper() const {
+    return upper_;
+  }
+
+  Ternary is_empty_cached() const {
+    if (info().get_interval_property(CARDINALITY_0))
+      return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO;
+    else if (info().get_interval_property(CARDINALITY_IS))
+      return T_NO;
+    else
+      return T_MAYBE;
+  }
+
+  Ternary is_singleton_cached() const {
+    if (info().get_interval_property(CARDINALITY_1))
+      return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO;
+    else if (info().get_interval_property(CARDINALITY_IS))
+      return T_NO;
+    else
+      return T_MAYBE;
+  }
+
+  bool is_empty() const {
+    switch (is_empty_cached()) {
+    case T_NO:
+      return false;
+    case T_YES:
+      return true;
+    case T_MAYBE:
+      bool r = is_empty_nocache();
+      if (r) {
+	w_info().set_interval_property(CARDINALITY_IS, r);
+	w_info().set_interval_property(CARDINALITY_1, false);
+      }
+      w_info().set_interval_property(CARDINALITY_0);
+      return r;
+    }
+    assert(false);
+    return false;
+  }
+
+  bool is_singleton() const {
+    switch (is_singleton_cached()) {
+    case T_NO:
+      return false;
+    case T_YES:
+      return true;
+    case T_MAYBE:
+      bool r = is_singleton_nocache();
+      if (r) {
+	w_info().set_interval_property(CARDINALITY_IS, r);
+	w_info().set_interval_property(CARDINALITY_0, false);
+      }
+      w_info().set_interval_property(CARDINALITY_1);
+      return r;
+    }
+    assert(false);
+    return false;
+  }
+
+  bool has_restriction() const {
+    return info().has_restriction();
+  }
+
+  I_Result normalize() const {
+    assert(OK());
+    if (has_restriction()) {
+      Result rl = lower_normalize();
+      Result ru = upper_normalize();
+      // FIXME: this invalidation is not needed if interval is unchanged
+      invalidate_cardinality_cache();
+      info().normalize();
+      assert(OK());
+      return combine(rl, ru);
+    }
+    else
+      return combine(V_EQ, V_EQ);
+  }
+
+  bool lower_is_open() const {
+    assert(OK());
+    return is_open(LOWER, lower(), info());
+  }
+
+  bool upper_is_open() const {
+    assert(OK());
+    return is_open(UPPER, upper(), info());
+  }
+
+  Result lower_shrink() {
+    assert(OK());
+    return shrink(LOWER, lower(), info());
+  }
+
+  Result upper_shrink() {
+    assert(OK());
+    return shrink(UPPER, upper(), info());
+  }
+
+  bool lower_is_unbounded() const {
+    assert(OK());
+    return Boundary_NS::is_unbounded(LOWER, lower(), info());
+  }
+
+  bool upper_is_unbounded() const {
+    assert(OK());
+    return Boundary_NS::is_unbounded(UPPER, upper(), info());
+  }
+
+  bool is_unbounded() const {
+    assert(OK());
+    return lower_is_unbounded() || upper_is_unbounded();
+  }
+
+  bool is_universe() const {
+    assert(OK());
+    return lower_is_unbounded() && upper_is_unbounded()
+      && !has_restriction();
+  }
+
+  void invalidate_cardinality_cache() const {
+    w_info().set_interval_property(CARDINALITY_IS, false);
+    w_info().set_interval_property(CARDINALITY_0, false);
+    w_info().set_interval_property(CARDINALITY_1, false);
+  }
+
+  template <typename T>
+  I_Result lower_set_uninit(const T& x, bool open = false) {
+    info().clear_boundary_properties(LOWER);
+    Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open));
+    lower_load();
+    return combine(rl, V_EQ);
+  }
+
+  I_Result lower_set_uninit(const Unbounded&) {
+    info().clear_boundary_properties(LOWER);
+    Result rl = set_unbounded(LOWER, lower(), info());
+    lower_load();
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result lower_set(const T& x, bool open = false) {
+    assert(OK());
+    info().clear_boundary_properties(LOWER);
+    Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open));
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  I_Result lower_set(const Unbounded&) {
+    assert(OK());
+    info().clear_boundary_properties(LOWER);
+    Result rl = set_unbounded(LOWER, lower(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result lower_narrow(const T& x, bool open = false) {
+    assert(OK());
+    if (ge(LOWER, lower(), info(), LOWER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return lower_set(x, open);
+  }
+
+  template <typename T>
+  I_Result lower_widen(const T& x, bool open = false) {
+    assert(OK());
+    if (le(LOWER, lower(), info(), LOWER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return lower_set(x, open);
+  }
+
+  I_Result lower_widen(const Unbounded&) {
+    assert(OK());
+    if (lower_is_unbounded())
+      return combine(V_EQ, V_EQ);
+    info().clear_boundary_properties(LOWER);
+    Result rl = set_unbounded(LOWER, lower(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result upper_set_uninit(const T& x, bool open = false) {
+    info().clear_boundary_properties(UPPER);
+    Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open));
+    upper_load();
+    return combine(rl, V_EQ);
+  }
+  I_Result upper_set_uninit(const Unbounded&) {
+    info().clear_boundary_properties(UPPER);
+    Result rl = set_unbounded(UPPER, upper(), info());
+    upper_load();
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result upper_set(const T& x, bool open = false) {
+    assert(OK());
+    info().clear_boundary_properties(UPPER);
+    Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open));
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  I_Result upper_set(const Unbounded&) {
+    assert(OK());
+    info().clear_boundary_properties(UPPER);
+    Result rl = set_unbounded(UPPER, upper(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  template <typename T>
+  I_Result upper_narrow(const T& x, bool open = false) {
+    assert(OK());
+    if (le(UPPER, upper(), info(), UPPER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return upper_set(x, open);
+  }
+
+  template <typename T>
+  I_Result upper_widen(const T& x, bool open = false) {
+    assert(OK());
+    if (ge(UPPER, upper(), info(), UPPER, x, f_info(x, open)))
+      return combine(V_EQ, V_EQ);
+    return upper_set(x, open);
+  }
+
+  I_Result upper_widen(const Unbounded&) {
+    assert(OK());
+    if (upper_is_unbounded())
+      return combine(V_EQ, V_EQ);
+    info().clear_boundary_properties(UPPER);
+    Result rl = set_unbounded(UPPER, upper(), info());
+    invalidate_cardinality_cache();
+    assert(OK());
+    return combine(rl, V_EQ);
+  }
+
+  I_Result assign(Degenerate_Element e) {
+    info().clear();
+    switch (e) {
+    case EMPTY:
+      info().set_interval_property(CARDINALITY_IS);
+      info().set_interval_property(CARDINALITY_0);
+      lower_set_uninit(1);
+      upper_set_uninit(0);
+      break;
+    case UNIVERSE:
+      info().set_interval_property(CARDINALITY_0, true);
+      info().set_interval_property(CARDINALITY_1, true);
+      lower_set_uninit(UNBOUNDED);
+      upper_set_uninit(UNBOUNDED);
+      break;
+    default:
+      assert(0);
+      break;
+    }
+    complete_init();
+    assert(OK());
+    return I_EMPTY;
+  }
+
+  I_Result set_infinities() {
+    info().clear();
+    info().set_interval_property(CARDINALITY_0, true);
+    info().set_interval_property(CARDINALITY_1, true);
+    // FIXME: what about restrictions?
+    Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+    Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+    complete_init_internal();
+    assert(OK());
+    return combine(rl, ru);
+  }
+
+  bool is_topologically_closed() const {
+    assert(OK());
+    return !Info::store_open
+      || is_empty()
+      || ((lower_is_unbounded() || !lower_is_open())
+          && (upper_is_unbounded() || !upper_is_open()));
+  }
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign() {
+    if (!Info::store_open || is_empty())
+      return;
+
+    if (!lower_is_unbounded())
+      info().set_boundary_property(LOWER, OPEN, false);
+
+    if (!upper_is_unbounded())
+      info().set_boundary_property(UPPER, OPEN, false);
+  }
+
+  bool is_infinity() const {
+    assert(OK());
+    if (is_reverse_infinity(LOWER, lower(), info()))
+      return 1;
+    else if (is_reverse_infinity(UPPER, upper(), info()))
+      return -1;
+    else
+      return 0;
+  }
+
+  bool contains_integer_point() const {
+    assert(OK());
+    if (is_empty())
+      return false;
+    if (is_unbounded())
+      return true;
+    Boundary l;
+    if (lower_is_open()) {
+      add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
+      floor_assign_r(l, l, ROUND_DOWN);
+    }
+    else
+      ceil_assign_r(l, lower(), ROUND_DOWN);
+    Boundary u;
+    if (upper_is_open()) {
+      sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
+      ceil_assign_r(u, u, ROUND_UP);
+    }
+    else
+      floor_assign_r(u, upper(), ROUND_UP);
+    return u >= l;
+  }
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+  bool OK() const {
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    if (!completed) {
+	std::cerr << "The interval initialization has not been completed."
+                  << std::endl;
+	return false;
+    }
+#endif
+#if 0
+    if (!Info::may_be_empty && is_empty()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is unexpectedly empty.\n";
+#endif
+	return false;
+    }
+#endif
+
+    if (is_open(LOWER, lower(), info())) {
+      if (is_plus_infinity(LOWER, lower(), info())) {
+#ifndef NDEBUG
+	std::cerr << "The lower boundary is +inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+	     && (is_minus_infinity(LOWER, lower(), info())
+		 || is_plus_infinity(LOWER, lower(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The lower boundary is unexpectedly infinity.\n";
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(LOWER, SPECIAL)) {
+      if (is_not_a_number(lower())) {
+#ifndef NDEBUG
+	std::cerr << "The lower boundary is not a number.\n";
+#endif
+	return false;
+      }
+#if 0
+      if (info().get_boundary_property(LOWER, NORMALIZED)
+	  && !info().is_restricted(lower())) {
+#ifndef NDEBUG
+	std::cerr << "The lower boundary is marked to be normalized, "
+                  << "but it is not.\n";
+#endif
+	return false;
+      }
+#endif
+    }
+
+    if (is_open(UPPER, upper(), info())) {
+      if (is_minus_infinity(UPPER, upper(), info())) {
+#ifndef NDEBUG
+	std::cerr << "The upper boundary is -inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+	     && (is_minus_infinity(UPPER, upper(), info())
+		 || is_plus_infinity(UPPER, upper(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The upper boundary is unexpectedly infinity."
+                << std::endl;
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(UPPER, SPECIAL)) {
+      if (is_not_a_number(upper())) {
+#ifndef NDEBUG
+	std::cerr << "The upper boundary is not a number.\n";
+#endif
+	return false;
+      }
+#if 0
+      if (info().get_boundary_property(UPPER, NORMALIZED)
+	  && !info().is_restricted(upper())) {
+#ifndef NDEBUG
+	std::cerr << "The upper boundary is marked to be normalized, "
+                  << "but it is not.\n";
+#endif
+	return false;
+      }
+#endif
+    }
+
+    Ternary t;
+
+    t = is_empty_cached();
+    if (t == T_YES) {
+      if (!is_empty_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be empty, "
+                  << "but actually it is not empty.\n";
+#endif
+	return false;
+      }
+    }
+    else if (t == T_NO) {
+      if (is_empty_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be not empty, "
+                  << "but actually it is empty.\n";
+#endif
+	return false;
+      }
+    }
+
+    t = is_singleton_cached();
+    if (t == T_YES) {
+      if (!is_singleton_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be singleton, "
+                  << "but actually it is not singleton.\n";
+#endif
+	return false;
+      }
+    }
+    else if (t == T_NO) {
+      if (is_singleton_nocache()) {
+#ifndef NDEBUG
+	std::cerr << "The interval is marked to be not singleton, "
+                  << "but actually it is singleton.\n";
+#endif
+	return false;
+      }
+    }
+
+    if (info().get_interval_property(CARDINALITY_IS) &&
+	info().get_interval_property(CARDINALITY_0)
+        == info().get_interval_property(CARDINALITY_1)) {
+#ifndef NDEBUG
+      std::cerr << "The interval is marked to know its cardinality, "
+                << "but this is unspecified or ambiguous.\n";
+#endif
+      return false;
+    }
+
+    // Everything OK.
+    return true;
+  }
+
+  Interval()
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    : lower_loaded(0), upper_loaded(0), completed(0)
+#endif
+  {
+  }
+
+  template <typename T>
+  explicit Interval(const T& x)
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+    : lower_loaded(0), upper_loaded(0), completed(0)
+#endif
+  {
+    assign(x);
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+  contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+  strictly_contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  is_disjoint_from(const T& y) const;
+
+  template <typename From1, typename From2>
+  I_Result assign(const From1& l, const From2& u);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  assign(const From& x);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  join_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  join_assign(const From1& x, const From2& y);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  intersect_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  intersect_assign(const From1& x, const From2& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p *this and \p x.
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  difference_assign(const From& x);
+
+  /*! \brief
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p x and \p y.
+  */
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  difference_assign(const From1& x, const From2& y);
+
+  /*! \brief
+    Refines \p to according to the existential relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \exists b \in \mathtt{x} \st a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  refine_existential(Relation_Symbol rel, const From& x);
+
+  /*! \brief
+    Refines \p to so that it satisfies the universal relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \forall b \in \mathtt{x} \itc a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  refine_universal(Relation_Symbol rel, const From& x);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  neg_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  add_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  sub_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  mul_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+		      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  div_assign(const From1& x, const From2& y);
+
+  template <typename From, typename Iterator>
+  typename Enable_If<Is_Interval<From>::value, void>::type
+  CC76_widening_assign(const From& y, Iterator first, Iterator last);
+
+private:
+  Boundary lower_;
+  Boundary upper_;
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+  unsigned int lower_loaded:1;
+  unsigned int upper_loaded:1;
+  unsigned int completed:1;
+#endif
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval.inlines.hh line 1
+/* Inline functions for the Interval class and its constituents.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::external_memory_in_bytes() const {
+  return Parma_Polyhedra_Library::external_memory_in_bytes(lower())
+    + Parma_Polyhedra_Library::external_memory_in_bytes(upper());
+}
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::swap(Interval<Boundary, Info>& y) {
+  std::swap(lower(), y.lower());
+  std::swap(upper(), y.upper());
+  std::swap(info(), y.info());
+}
+
+template <typename Boundary, typename Info>
+inline bool
+f_is_empty(const Interval<Boundary, Info>& x) {
+  return x.is_empty();
+}
+template <typename Boundary, typename Info>
+inline bool
+f_is_singleton(const Interval<Boundary, Info>& x) {
+  return x.is_singleton();
+}
+template <typename Boundary, typename Info>
+inline int
+is_infinity(const Interval<Boundary, Info>& x) {
+  return x.is_infinity();
+}
+
+namespace Interval_NS {
+
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_lower(const Interval<Boundary, Info>& x) {
+  return x.lower();
+}
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_upper(const Interval<Boundary, Info>& x) {
+  return x.upper();
+}
+template <typename Boundary, typename Info>
+inline const Info&
+f_info(const Interval<Boundary, Info>& x) {
+  return x.info();
+}
+
+struct Scalar_As_Interval_Policy {
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, true);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Restriction_None<Interval_Info_Null<Scalar_As_Interval_Policy> > Scalar_As_Interval_Info;
+
+const Scalar_As_Interval_Info SCALAR_INFO;
+
+typedef Interval_Restriction_None<Interval_Info_Null_Open<Scalar_As_Interval_Policy> > Scalar_As_Interval_Info_Open;
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_lower(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_upper(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const Scalar_As_Interval_Info&>::type
+f_info(const T&) {
+  return SCALAR_INFO;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Scalar_As_Interval_Info_Open>::type
+f_info(const T&, bool open) {
+  return Scalar_As_Interval_Info_Open(open);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_empty(const T& x) {
+  return is_not_a_number(x);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_singleton(const T& x) {
+  return !f_is_empty(x);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Ternary>::type
+f_is_empty_lazy(const T& x) {
+  if (f_info(x).get_interval_property(CARDINALITY_0))
+    return f_info(x).get_interval_property(CARDINALITY_IS) ? T_YES : T_NO;
+  else
+    return T_MAYBE;
+}
+
+} // namespace Interval_NS
+
+inline bool
+is_integer(const char*) {
+  // FIXME:
+  return false;
+}
+
+inline bool
+is_not_a_number(const char*) {
+  // FIXME:
+  return false;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+is_singleton_integer(const T& x) {
+  return is_singleton(x) && is_integer(f_lower(x));
+}
+
+template <typename T1, typename T2>
+inline bool
+same_object(const T1&, const T2&) {
+  return false;
+}
+
+template <typename T>
+inline bool
+same_object(const T& x, const T& y) {
+  return &x == &y;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+check_empty_arg(const T& x) {
+  if (f_info(x).may_be_empty)
+    return f_is_empty(x);
+  else {
+    assert(!f_is_empty(x));
+    return false;
+  }
+}
+
+template <typename Boundary, typename Info>
+inline I_Result
+check_empty_result(const Interval<Boundary, Info>& x, I_Result r) {
+  if (Info::check_empty_result && f_is_empty(x))
+    return I_EMPTY;
+  else
+    return static_cast<I_Result>(r | I_MAYBE_EMPTY);
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value || Is_Interval<T1>::value)
+			   && (Is_Singleton<T2>::value || Is_Interval<T2>::value)
+			   && (Is_Interval<T1>::value || Is_Interval<T2>::value)),
+			  bool>::type
+operator==(const T1& x, const T2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x))
+    return check_empty_arg(y);
+  else if (check_empty_arg(y))
+    return false;
+  return eq_restriction(f_info(x), f_info(y))
+    && eq(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y))
+    && eq(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value || Is_Interval<T1>::value)
+			   && (Is_Singleton<T2>::value || Is_Interval<T2>::value)
+			   && (Is_Interval<T1>::value || Is_Interval<T2>::value)),
+			  bool>::type
+operator!=(const T1& x, const T2& y) {
+  return !(x == y);
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::contains(const T& y) const {
+  assert(OK());
+  assert(f_OK(y));
+  if (check_empty_arg(y))
+    return true;
+  if (check_empty_arg(*this))
+    return false;
+  if (!contains_restriction(info(), f_info(y)))
+      return false;
+  return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+    && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::strictly_contains(const T& y) const {
+  assert(OK());
+  assert(f_OK(y));
+  if (check_empty_arg(y))
+    return !check_empty_arg(*this);
+  if (check_empty_arg(*this))
+    return false;
+  if (!contains_restriction(y))
+      return false;
+  else if (!eq_restriction(*this, y))
+    return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+      && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+  return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+	  && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)))
+    || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+	&& gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::is_disjoint_from(const T& y) const {
+  assert(OK());
+  assert(f_OK(y));
+  if (check_empty_arg(*this) || check_empty_arg(y))
+    return true;
+//   CHECKME.
+//   if (!contains_restriction(info(), f_info(y)))
+//       return false;
+  return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))
+    || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline I_Result
+Interval<To_Boundary, To_Info>::assign(const From1& l, const From2& u) {
+  info().clear();
+  Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, l, f_info(l));
+  Result ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, u, f_info(u));
+  complete_init_internal();
+  assert(OK());
+  // The following Parma_Polyhedra_Library:: qualification is to work
+  // around a bug in version 10.0 of the Intel C/C++ compiler.
+  return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::assign(const From& x) {
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!assign_restriction(to_info, x))
+    return assign(EMPTY);
+  Result rl = Boundary_NS::assign(LOWER, lower(), to_info,
+				  LOWER, f_lower(x), f_info(x));
+  Result ru = Boundary_NS::assign(UPPER, upper(), to_info,
+				  UPPER, f_upper(x), f_info(x));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From& x) {
+  assert(f_OK(x));
+  if (check_empty_arg(*this))
+    return assign(x);
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  if (!join_restriction(info(), *this, x))
+    return assign(EMPTY);
+  info().set_interval_property(CARDINALITY_IS, false);
+  info().set_interval_property(CARDINALITY_0);
+  info().set_interval_property(CARDINALITY_1, false);
+  Result rl, ru;
+  rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x))
+    return assign(y);
+  if (check_empty_arg(y))
+    return assign(x);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!join_restriction(to_info, x, y))
+    return assign(EMPTY);
+  to_info.set_interval_property(CARDINALITY_0);
+  Result rl, ru;
+  rl = min_assign(LOWER, lower(), to_info,
+		  LOWER, f_lower(x), f_info(x),
+		  LOWER, f_lower(y), f_info(y));
+  ru = max_assign(UPPER, upper(), to_info,
+		  UPPER, f_upper(x), f_info(x),
+		  UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From& x) {
+  assert(f_OK(x));
+  if (!intersect_restriction(info(), *this, x))
+    return assign(EMPTY);
+  // FIXME: more accurate?
+  invalidate_cardinality_cache();
+  Result rl, ru;
+  rl = max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  ru = min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  assert(OK());
+  // The following Parma_Polyhedra_Library:: qualification is to work
+  // around a bug in version 10.0 of the Intel C/C++ compiler.
+  return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From1& x,
+                                                 const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!intersect_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  rl = max_assign(LOWER, lower(), to_info,
+		  LOWER, f_lower(x), f_info(x),
+		  LOWER, f_lower(y), f_info(y));
+  ru = min_assign(UPPER, upper(), to_info,
+		  UPPER, f_upper(x), f_info(x),
+		  UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  // The following Parma_Polyhedra_Library:: qualification is to work
+  // around a bug in version 10.0 of the Intel C/C++ compiler.
+  return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From& x) {
+  assert(f_OK(x));
+  if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)) ||
+      gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+    return combine(V_EQ, V_EQ);
+  bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  Result rl = V_EQ, ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x));
+  }
+  else if (nu)
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x));
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From1& x,
+                                                  const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y)) ||
+      gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y)))
+    return assign(x);
+  bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y));
+  bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+  Result rl = V_EQ, ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else {
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y));
+      ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+    }
+  }
+  else if (nu) {
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  }
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>
+::refine_existential(Relation_Symbol rel, const From& x) {
+  assert(OK());
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      UPPER, f_upper(x), f_info(x), true);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      UPPER, f_upper(x), f_info(x));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      LOWER, f_lower(x), f_info(x), true);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      LOWER, f_lower(x), f_info(x));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case EQUAL:
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (!f_is_singleton(x))
+	return combine(V_EQ, V_EQ);
+      if (check_empty_arg(*this))
+	return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	lower_shrink();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	upper_shrink();
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, V_EQ));
+    }
+  default:
+    assert(false);
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::refine_universal(Relation_Symbol rel,
+                                                 const From& x) {
+  assert(OK());
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      LOWER, f_lower(x), SCALAR_INFO, !is_open(LOWER, f_lower(x), f_info(x)));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+				      LOWER, f_lower(x), SCALAR_INFO);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, ru));
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      UPPER, f_upper(x), SCALAR_INFO, !is_open(UPPER, f_upper(x), f_info(x)));
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+	return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+				      UPPER, f_upper(x), SCALAR_INFO);
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(rl, V_EQ));
+    }
+  case EQUAL:
+    if (!f_is_singleton(x))
+      return assign(EMPTY);
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (check_empty_arg(*this))
+	return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+	lower_shrink();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+	upper_shrink();
+      invalidate_cardinality_cache();
+      normalize();
+      // The following Parma_Polyhedra_Library:: qualification is to work
+      // around a bug in version 10.0 of the Intel C/C++ compiler.
+      return Parma_Polyhedra_Library::check_empty_result(*this,
+							 combine(V_EQ, V_EQ));
+    }
+  default:
+    assert(false);
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::neg_assign(const From& x) {
+  assert(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!neg_restriction(to_info, x))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x));
+  ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::add_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  if (inf) {
+    if (Parma_Polyhedra_Library::is_infinity(y) == -inf)
+      return assign(EMPTY);
+  }
+  else
+    inf = Parma_Polyhedra_Library::is_infinity(y);
+  if (inf < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf > 0)
+    return assign(PLUS_INFINITY);
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!add_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info,
+				      LOWER, f_lower(x), f_info(x),
+				      LOWER, f_lower(y), f_info(y));
+  Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info,
+				      UPPER, f_upper(x), f_info(x),
+				      UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::sub_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  if (inf) {
+    if (Parma_Polyhedra_Library::is_infinity(y) == inf)
+      return assign(EMPTY);
+  }
+  else
+    inf = -Parma_Polyhedra_Library::is_infinity(y);
+  if (inf < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf > 0)
+    return assign(PLUS_INFINITY);
+
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!sub_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info,
+			       LOWER, f_lower(x), f_info(x),
+			       UPPER, f_upper(y), f_info(y));
+  ru = Boundary_NS::sub_assign(UPPER, upper(), to_info,
+			       UPPER, f_upper(x), f_info(x),
+			       LOWER, f_lower(y), f_info(y));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+/**
++---------+-----------+-----------+-----------------+
+|    *    |  yl > 0   |  yu < 0   |  yl < 0, yu > 0 |
++---------+-----------+-----------+-----------------+
+| xl > 0  |xl*yl,xu*yu|xu*yl,xl*yu|   xu*yl,xu*yu   |
++---------+-----------+-----------+-----------------+
+| xu < 0  |xl*yu,xu*yl|xu*yu,xl*yl|   xl*yu,xl*yl   |
++---------+-----------+-----------+-----------------+
+|xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),|
+|         |           |           |max(xl*yl,xu*yu) |
++---------+-----------+-----------+-----------------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::mul_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = xls > 0 ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = yls > 0 ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  int ls, us;
+  if (inf) {
+    ls = yls;
+    us = yus;
+    goto inf;
+  }
+  else {
+    inf = Parma_Polyhedra_Library::is_infinity(y);
+    if (inf) {
+      ls = xls;
+      us = xus;
+    inf:
+      if (ls == 0 && us == 0)
+	return assign(EMPTY);
+      if (ls == -us)
+	return set_infinities();
+      if (ls < 0 || us < 0)
+	inf = -inf;
+      if (inf < 0)
+	return assign(MINUS_INFINITY);
+      else
+	return assign(PLUS_INFINITY);
+    }
+  }
+
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!mul_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+
+  if (xls >= 0) {
+    if (yls >= 0) {
+      // 0 <= xl <= xu, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else if (yus <= 0) {
+      // 0 <= xl <= xu, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      // 0 <= xl <= xu, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else if (xus <= 0) {
+    if (yls >= 0) {
+      // xl <= xu <= 0, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (yus <= 0) {
+      // xl <= xu <= 0, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else {
+      // xl <= xu <= 0, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yls >= 0) {
+    // xl < 0 < xu, 0 <= yl <= yu
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+		      LOWER, f_lower(x), f_info(x), xls,
+		      UPPER, f_upper(y), f_info(y), yus);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+		      UPPER, f_upper(x), f_info(x), xus,
+		      UPPER, f_upper(y), f_info(y), yus);
+  }
+  else if (yus <= 0) {
+    // xl < 0 < xu, yl <= yu <= 0
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+		      UPPER, f_upper(x), f_info(x), xus,
+		      LOWER, f_lower(y), f_info(y), yls);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+		      LOWER, f_lower(x), f_info(x), xls,
+		      LOWER, f_lower(y), f_info(y), yls);
+  }
+  else {
+    // xl < 0 < xu, yl < 0 < yu
+    DIRTY_TEMP(To_Boundary, tmp);
+    DIRTY_TEMP(To_Info, tmp_info);
+    tmp_info.clear();
+    Result tmp_r;
+    tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info,
+				    UPPER, f_upper(x), f_info(x),
+				    LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info,
+				 LOWER, f_lower(x), f_info(x),
+				 UPPER, f_upper(y), f_info(y));
+    if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) {
+      to_lower = tmp;
+      rl = tmp_r;
+    }
+    tmp_info.clear();
+    tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info,
+				    UPPER, f_upper(x), f_info(x),
+				    UPPER, f_upper(y), f_info(y));
+    ru = Boundary_NS::mul_assign(UPPER, upper(), to_info,
+				 LOWER, f_lower(x), f_info(x),
+				 LOWER, f_lower(y), f_info(y));
+    if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) {
+      upper() = tmp;
+      ru = tmp_r;
+    }
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+/**
++-----------+-----------+-----------+
+|     /     |  yu < 0   |  yl > 0   |
++-----------+-----------+-----------+
+|   xu<=0   |xu/yl,xl/yu|xl/yl,xu/yu|
++-----------+-----------+-----------+
+|xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl|
++-----------+-----------+-----------+
+|   xl>=0   |xu/yu,xl/yl|xl/yu,xu/yl|
++-----------+-----------+-----------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+			   && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::div_assign(const From1& x, const From2& y) {
+  assert(f_OK(x));
+  assert(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = yls > 0 ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  if (yls == 0 && yus == 0)
+    return assign(EMPTY);
+  int inf = Parma_Polyhedra_Library::is_infinity(x);
+  if (inf) {
+    if (Parma_Polyhedra_Library::is_infinity(y))
+      return assign(EMPTY);
+    if (yls == -yus)
+      return set_infinities();
+    if (yls < 0 || yus < 0)
+      inf = -inf;
+    if (inf < 0)
+      return assign(MINUS_INFINITY);
+    else
+      return assign(PLUS_INFINITY);
+  }
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = xls > 0 ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+
+  DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (!div_restriction(to_info, x, y))
+    return assign(EMPTY);
+  Result rl, ru;
+  DIRTY_TEMP(To_Boundary, to_lower);
+  if (yls >= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yus <= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+			UPPER, f_upper(x), f_info(x), xus,
+			UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+			LOWER, f_lower(x), f_info(x), xls,
+			UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else {
+    // FIXME: restrictions
+    return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES);
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  complete_init_internal();
+  assert(OK());
+  return combine(rl, ru);
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator+(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator-(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator*(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator/(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename Boundary, typename Info>
+inline std::ostream&
+operator<<(std::ostream& os, const Interval<Boundary, Info>& x) {
+  // assert(x.OK());
+  if (check_empty_arg(x))
+    return os << "[]";
+  if (x.is_singleton()) {
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+    return os;
+  }
+  os << (x.lower_is_open() ? "(" : "[");
+  if (x.info().get_boundary_property(LOWER, SPECIAL))
+    os << "-inf";
+  else
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << ", ";
+  if (x.info().get_boundary_property(UPPER, SPECIAL))
+    os << "+inf";
+  else
+    output(os, x.upper(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << (x.upper_is_open() ? ")" : "]");
+  output_restriction(os, x.info());
+  return os;
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::ascii_dump(std::ostream& s) const {
+  using Parma_Polyhedra_Library::ascii_dump;
+  s << "info ";
+  info().ascii_dump(s);
+  s << " lower ";
+  ascii_dump(s, lower());
+  s << " upper ";
+  ascii_dump(s, upper());
+  s << '\n';
+}
+
+template <typename Boundary, typename Info>
+inline bool
+Interval<Boundary, Info>::ascii_load(std::istream& s) {
+  using Parma_Polyhedra_Library::ascii_load;
+  std::string str;
+  if (!(s >> str) || str != "info")
+    return false;
+  if (!info().ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "lower")
+    return false;
+  if (!ascii_load(s, lower()))
+    return false;
+  if (!(s >> str) || str != "upper")
+    return false;
+  if (!ascii_load(s, upper()))
+    return false;
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+  complete_init_internal();
+#endif
+  assert(OK());
+  return true;
+}
+
+/*! \brief
+  Helper class to select the appropriate numerical type to perform
+  boundary computations so as to reduce the chances of overflow without
+  incurring too much overhead.
+*/
+template <typename Interval_Boundary_Type> struct Select_Temp_Boundary_Type;
+
+template <typename Interval_Boundary_Type>
+struct Select_Temp_Boundary_Type {
+  typedef Interval_Boundary_Type type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<float> {
+  typedef double type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long long> {
+  typedef signed long long type;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Interval */
+template <typename Boundary, typename Info>
+inline void
+swap(Parma_Polyhedra_Library::Interval<Boundary, Info>& x,
+     Parma_Polyhedra_Library::Interval<Boundary, Info>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval.templates.hh line 1
+/* Interval class implementation: non-inline template functions.
+*/
+
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+template <typename From, typename Iterator>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::CC76_widening_assign(const From& y,
+					       Iterator first,
+					       Iterator last) {
+  // We assume that `y' is contained in or equal to `*this'.
+  assert(contains(y));
+  Interval<Boundary, Info>& x = *this;
+
+  // Upper bound.
+  if (!x.upper_is_unbounded()) {
+    Boundary& x_ub = x.upper();
+    const Boundary& y_ub = y.upper();
+    assert(!y.upper_is_unbounded() && y_ub <= x_ub);
+    if (y_ub < x_ub) {
+      Iterator k = std::lower_bound(first, last, x_ub);
+      if (k != last) {
+	if (x_ub < *k)
+	  x_ub = *k;
+      }
+      else
+	x.upper_set(UNBOUNDED);
+    }
+  }
+
+  // Lower bound.
+  if (!x.lower_is_unbounded()) {
+    Boundary& x_lb = x.lower();
+    const Boundary& y_lb = y.lower();
+    assert(!y.lower_is_unbounded() && y_lb >= x_lb);
+    if (y_lb > x_lb) {
+      Iterator k = std::lower_bound(first, last, x_lb);
+      if (k != last) {
+	if (x_lb < *k) { 
+	  if (k != first)
+	    x_lb = *--k;
+	  else
+	    x.lower_set(UNBOUNDED);
+	}
+      }
+      else
+	x_lb = *--k;
+    }
+  }
+}
+
+template <typename Boundary, typename Info>
+inline std::istream&
+operator>>(std::istream& is, Interval<Boundary, Info>& x) {
+  // Eat leading white space.
+  int c;
+  do {
+    c = is.get();
+  } while (isspace(c));
+
+  // Get the opening parenthesis and handle the empty interval case.
+  bool lower_open = false;
+  if (c == '(')
+    lower_open = true;
+  else if (c == '[') {
+    c = is.get();
+    if (c == ']') {
+      // Empty interval.
+      x.assign(EMPTY);
+      return is;
+    }
+    else
+      is.unget();
+  }
+  else {
+    is.unget();
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Get the lower bound.
+  Boundary lower_bound;
+  Result lower_r  = input(lower_bound, is, ROUND_DOWN);
+  if (lower_r == V_CVT_STR_UNK || lower_r == VC_NAN) {
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Match the comma separating the lower and upper bounds.
+  do {
+    c = is.get();
+  } while (isspace(c));
+  if (c != ',') {
+    is.unget();
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Get the upper bound.
+  Boundary upper_bound;
+  Result upper_r = input(upper_bound, is, ROUND_UP);
+  if (upper_r == V_CVT_STR_UNK || upper_r == VC_NAN) {
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Get the closing parenthesis.
+  do {
+    c = is.get();
+  } while (isspace(c));
+  bool upper_open = false;
+  if (c == ')')
+    upper_open = true;
+  else if (c != ']') {
+    is.unget();
+    is.setstate(std::ios_base::failbit);
+    return is;
+  }
+
+  // Buld interval.
+  bool lower_unbounded = false;
+  bool upper_unbounded = false;
+  switch (lower_r) {
+  case V_EQ:
+    break;
+  case V_LE:
+    lower_open = true;
+    break;
+  case VC_MINUS_INFINITY:
+  case V_NEG_OVERFLOW:
+    lower_unbounded = true;
+    break;
+  case VC_PLUS_INFINITY:
+  case V_POS_OVERFLOW:
+    if (upper_r == VC_PLUS_INFINITY || upper_r == V_POS_OVERFLOW)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  default:
+    assert(false);
+  }
+  switch (upper_r) {
+  case V_EQ:
+    break;
+  case V_GE:
+    upper_open = true;
+    break;
+  case VC_MINUS_INFINITY:
+  case V_NEG_OVERFLOW:
+    if (lower_r == VC_MINUS_INFINITY || lower_r == V_NEG_OVERFLOW)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  case VC_PLUS_INFINITY:
+  case V_POS_OVERFLOW:
+    upper_unbounded = true;
+    break;
+  default:
+    assert(false);
+  }
+
+  if (!lower_unbounded
+      && !upper_unbounded
+      && (lower_bound > upper_bound
+	  || (lower_open && lower_bound == upper_bound)))
+    x.assign(EMPTY);
+  else {
+    x.assign(UNIVERSE);
+    if (!lower_unbounded)
+      x.refine_existential((lower_open ? GREATER_THAN : GREATER_OR_EQUAL),
+			   lower_bound);
+    if (!upper_unbounded)
+      x.refine_existential((upper_open ? LESS_THAN : LESS_OR_EQUAL),
+			   upper_bound);
+  }
+  return is;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Interval.defs.hh line 886
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.defs.hh line 1
+/* Box class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint.defs.hh line 1
+/* Constraint class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Row.defs.hh line 1
+/* Linear_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Row.defs.hh line 1
+/* Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Row.defs.hh line 29
+#include <vector>
+#include <limits>
+
+#ifndef PPL_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+  \brief
+  Enables extra debugging information for class Row.
+
+  \ingroup PPL_CXX_interface
+  When <CODE>PPL_ROW_EXTRA_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+  each instance of the class Row carries its own capacity; this enables
+  extra consistency checks to be performed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_ROW_EXTRA_DEBUG)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Row_Impl_Handler {
+public:
+  //! Default constructor.
+  Row_Impl_Handler();
+
+  //! Destructor.
+  ~Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if PPL_ROW_EXTRA_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // PPL_ROW_EXTRA_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  Row_Impl_Handler(const Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  Row_Impl_Handler& operator=(const Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Wrapper class to represent a set of flags with bits in a native
+    unsigned integral type.
+    \ingroup PPL_CXX_interface
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  class Flags {
+  public:
+    //! Constructs an object with all the flags unset.
+    Flags();
+
+    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+    bool operator==(const Flags& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y
+      are different.
+    */
+    bool operator!=(const Flags& y) const;
+
+    PPL_OUTPUT_DECLARATIONS
+
+    //! Uses the ASCII Flags representation from \p s to recreate *this.
+    /*!
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+      otherwise.  The ASCII representation is as output by
+      \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump.
+    */
+    bool ascii_load(std::istream& s);
+
+  protected:
+    //! A native integral type holding the bits that encode the flags.
+    typedef unsigned int base_type;
+
+    //! Index of the first bit derived classes can use.
+    static const unsigned first_free_bit = 0;
+
+    //! Total number of bits that can be stored.
+    static const unsigned num_bits = std::numeric_limits<base_type>::digits;
+
+    //! Constructs an object with flags set as in \p n.
+    explicit Flags(base_type n);
+
+    //! Returns the integer encoding \p *this.
+    base_type get_bits() const;
+
+    //! Sets the bits in \p mask.
+    void set_bits(base_type mask);
+
+    //! Resets the bits in \p mask.
+    void reset_bits(base_type mask);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if all the bits
+      in \p mask are set.
+    */
+    bool test_bits(base_type mask) const;
+
+  private:
+    //! The integer encoding \p *this.
+    base_type bits;
+
+    friend class Row;
+  };
+
+  //! Pre-constructs a row: construction must be completed by construct().
+  Row();
+
+  //! \name Post-constructors
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size and capacity \p sz and flags \p f.
+  */
+  void construct(dimension_type sz, Flags f);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+    The row flags are set to \p f.
+  */
+  void construct(dimension_type sz, dimension_type capacity, Flags f);
+  //@} // Post-constructors
+
+  //! Tight constructor: resizing may require reallocation.
+  /*!
+    Constructs a row with size and capacity \p sz, and flags \p f.
+  */
+  Row(dimension_type sz, Flags f);
+
+  //! Sizing constructor with capacity.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+    The row flags are set to \p f.
+  */
+  Row(dimension_type sz, dimension_type capacity, Flags f);
+
+  //! Ordinary copy constructor.
+  Row(const Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Row(const Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+  */
+  Row(const Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Row();
+
+  //! Assignment operator.
+  Row& operator=(const Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  /*!
+    To be used with extra care, since it may easily cause memory leaks
+    or undefined behavior.
+  */
+  void assign(Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed Row object, setting
+    flags to \p f and allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the Row object is zero.
+  */
+  void allocate(dimension_type capacity, Flags f);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns a const reference to the flags of \p *this.
+  const Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Flags& flags();
+
+  //! Returns the size() of the largest possible Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of
+    the row and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Checks if all the invariants are satisfied and that the actual
+    size and capacity match the values provided as arguments.
+  */
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Row& y);
+
+#if PPL_ROW_EXTRA_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // PPL_ROW_EXTRA_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Row */
+bool operator==(const Row& x, const Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Row */
+bool operator!=(const Row& x, const Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Row& x,
+	  Parma_Polyhedra_Library::Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+	       std::vector<Parma_Polyhedra_Library::Row>::iterator y);
+
+} // namespace std
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The actual implementation of a Row object.
+/*! \ingroup PPL_CXX_interface
+  The class Row_Impl_Handler::Impl provides the implementation of Row
+  objects and, in particular, of the corresponding memory allocation
+  functions.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
+public:
+  //! \name Custom allocator and deallocator
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity Coefficient objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version:
+    uses the standard operator delete to free the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@} // Custom allocator and deallocator
+
+  //! Constructor.
+  Impl(Row::Flags f);
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Flags accessors
+  //@{
+  //! Returns a const reference to the flags of \p *this.
+  const Row::Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Row::Flags& flags();
+  //@} // Flags accessors
+
+  //! \name Size accessors
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_size the actual size of \p *this.
+  void set_size(dimension_type new_size);
+
+  //! Increment the size of \p *this by 1.
+  void bump_size();
+  //@} // Size accessors
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+private:
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The flags of this row.
+  Row::Flags flags_;
+
+  //! The vector of coefficients.
+  Coefficient vec_[
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       1
+#endif
+  ];
+
+  //! Private and unimplemented: default construction is not allowed.
+  Impl();
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Row.inlines.hh line 1
+/* Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Row.inlines.hh line 27
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Row::Flags::Flags()
+  : bits(0) {
+}
+
+inline
+Row::Flags::Flags(base_type n)
+  : bits(n) {
+}
+
+inline Row::Flags::base_type
+Row::Flags::get_bits() const {
+  return bits;
+}
+
+inline void
+Row::Flags::set_bits(const base_type mask) {
+  bits |= mask;
+}
+
+inline void
+Row::Flags::reset_bits(const base_type mask) {
+  bits &= ~mask;
+}
+
+inline bool
+Row::Flags::test_bits(const base_type mask) const {
+  return (bits & mask) == mask;
+}
+
+inline bool
+Row::Flags::operator==(const Flags& y) const {
+  base_type mask = low_bits_mask<base_type>(first_free_bit);
+  return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Row::Flags::operator!=(const Flags& y) const {
+  return !operator==(y);
+}
+
+inline void*
+Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
+				     const dimension_type capacity) {
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(Coefficient));
+#else
+  assert(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient));
+#endif
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::max_size() {
+  return size_t(-1)/sizeof(Coefficient);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::size() const {
+  return size_;
+}
+
+inline void
+Row_Impl_Handler::Impl::set_size(const dimension_type new_size) {
+  size_ = new_size;
+}
+
+inline void
+Row_Impl_Handler::Impl::bump_size() {
+  ++size_;
+}
+
+inline
+Row_Impl_Handler::Impl::Impl(const Row::Flags f)
+  : size_(0), flags_(f) {
+}
+
+inline
+Row_Impl_Handler::Impl::~Impl() {
+  shrink(0);
+}
+
+inline const Row::Flags&
+Row_Impl_Handler::Impl::flags() const {
+  return flags_;
+}
+
+inline Row::Flags&
+Row_Impl_Handler::Impl::flags() {
+  return flags_;
+}
+
+inline Coefficient&
+Row_Impl_Handler::Impl::operator[](const dimension_type k) {
+  assert(k < size());
+  return vec_[k];
+}
+
+inline Coefficient_traits::const_reference
+Row_Impl_Handler::Impl::operator[](const dimension_type k) const {
+  assert(k < size());
+  return vec_[k];
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(Coefficient)
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+    - 1*sizeof(Coefficient)
+#endif
+    + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
+
+inline dimension_type
+Row::max_size() {
+  return Impl::max_size();
+}
+
+inline dimension_type
+Row::size() const {
+  return impl->size();
+}
+
+inline const Row::Flags&
+Row::flags() const {
+  return impl->flags();
+}
+
+inline Row::Flags&
+Row::flags() {
+  return impl->flags();
+}
+
+#if PPL_ROW_EXTRA_DEBUG
+inline dimension_type
+Row::capacity() const {
+  return capacity_;
+}
+#endif
+
+inline
+Row_Impl_Handler::Row_Impl_Handler()
+  : impl(0) {
+#if PPL_ROW_EXTRA_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+inline
+Row_Impl_Handler::~Row_Impl_Handler() {
+  delete impl;
+}
+
+inline
+Row::Row()
+  : Row_Impl_Handler() {
+}
+
+inline void
+Row::allocate(
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       const
+#endif
+	       dimension_type capacity,
+	       const Flags f) {
+  assert(capacity <= max_size());
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  assert(impl == 0);
+  impl = new (capacity) Impl(f);
+#if PPL_ROW_EXTRA_DEBUG
+  assert(capacity_ == 0);
+  capacity_ = capacity;
+#endif
+}
+
+inline void
+Row::expand_within_capacity(const dimension_type new_size) {
+  assert(impl);
+#if PPL_ROW_EXTRA_DEBUG
+  assert(new_size <= capacity_);
+#endif
+  impl->expand_within_capacity(new_size);
+}
+
+inline void
+Row::copy_construct_coefficients(const Row& y) {
+  assert(impl && y.impl);
+#if PPL_ROW_EXTRA_DEBUG
+  assert(y.size() <= capacity_);
+#endif
+  impl->copy_construct_coefficients(*(y.impl));
+}
+
+inline void
+Row::construct(const dimension_type sz,
+	       const dimension_type capacity,
+	       const Flags f) {
+  assert(sz <= capacity && capacity <= max_size());
+  allocate(capacity, f);
+  expand_within_capacity(sz);
+}
+
+inline void
+Row::construct(const dimension_type sz, const Flags f) {
+  construct(sz, sz, f);
+}
+
+inline
+Row::Row(const dimension_type sz,
+	 const dimension_type capacity,
+	 const Flags f)
+  : Row_Impl_Handler() {
+  construct(sz, capacity, f);
+}
+
+inline
+Row::Row(const dimension_type sz, const Flags f)
+  : Row_Impl_Handler() {
+  construct(sz, f);
+}
+
+inline
+Row::Row(const Row& y)
+  : Row_Impl_Handler() {
+  if (y.impl) {
+    allocate(compute_capacity(y.size(), max_size()), y.flags());
+    copy_construct_coefficients(y);
+  }
+}
+
+inline
+Row::Row(const Row& y,
+	 const dimension_type capacity)
+  : Row_Impl_Handler() {
+  assert(y.impl);
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity, y.flags());
+  copy_construct_coefficients(y);
+}
+
+inline
+Row::Row(const Row& y,
+	 const dimension_type sz,
+	 const dimension_type capacity)
+  : Row_Impl_Handler() {
+  assert(y.impl);
+  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity, y.flags());
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+inline
+Row::~Row() {
+}
+
+inline void
+Row::shrink(const dimension_type new_size) {
+  assert(impl);
+  impl->shrink(new_size);
+}
+
+inline void
+Row::swap(Row& y) {
+  std::swap(impl, y.impl);
+#if PPL_ROW_EXTRA_DEBUG
+  std::swap(capacity_, y.capacity_);
+#endif
+}
+
+inline void
+Row::assign(Row& y) {
+  impl = y.impl;
+#if PPL_ROW_EXTRA_DEBUG
+  capacity_ = y.capacity_;
+#endif
+}
+
+inline Row&
+Row::operator=(const Row& y) {
+  // Copy-construct `tmp' from `y'.
+  Row tmp(y);
+  // Swap the implementation of `*this' with the one of `tmp'.
+  swap(tmp);
+  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+  return *this;
+}
+
+inline Coefficient&
+Row::operator[](const dimension_type k) {
+  assert(impl);
+  return (*impl)[k];
+}
+
+inline Coefficient_traits::const_reference
+Row::operator[](const dimension_type k) const {
+  assert(impl);
+  return (*impl)[k];
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes(dimension_type capacity) const {
+  return impl->total_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes() const {
+#if PPL_ROW_EXTRA_DEBUG
+  return impl->total_memory_in_bytes(capacity_);
+#else
+  return impl->total_memory_in_bytes();
+#endif
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Row */
+inline bool
+operator!=(const Row& x, const Row& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Row.defs.hh line 505
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Topology.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum Topology {
+  NECESSARILY_CLOSED = 0,
+  NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Row.defs.hh line 33
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for linear expressions, constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  The class Linear_Row allows us to build objects of the form
+  \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$,
+  i.e., a finite sequence of coefficients subscripted by a pair of flags,
+  which are both stored in a Linear_Row::Flags object.
+  The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents
+  the <EM>topology</EM> and
+  the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents
+  the <EM>kind</EM> of the Linear_Row object.
+  Note that, even though all the four possible combinations of topology
+  and kind values will result in a legal Linear_Row::Flags object, some
+  of these pose additional constraints on the values of the Linear_Row's
+  coefficients.
+
+  When \f$t = c\f$, we have the following cases
+  (\f$d\f$ is the dimension of the vector space):
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+      represents the equality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+      represents the non-strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+      represents the line of direction
+      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+      represents the ray of direction
+      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$,
+      represents the point
+      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+  When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is
+  associated to the slack variable \f$\epsilon\f$, so that we have the
+  following cases (\f$d\f$ is again the dimension of the vector space,
+  but this time we have \f$d+2\f$ coefficients):
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+      represents the equality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+      represents the non-strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$e < 0\f$, represents the strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+      represents the line of direction
+      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+      represents the ray of direction
+      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$b > 0\f$ and \f$e > 0\f$, represents the point
+      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$b > 0\f$, represents the closure point
+      \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+  So, a Linear_Row can be both a constraint and a generator: it can be an
+  equality, a strict or non-strict inequality, a line, a ray, a point
+  or a closure point.
+
+  The inhomogeneous term of a constraint can be zero or different from zero.
+
+  Points and closure points must have a positive inhomogeneous term
+  (which is used as a common divisor for all the other coefficients),
+  lines and rays must have the inhomogeneous term equal to zero.
+  If needed, the coefficients of points and closure points are negated
+  at creation time so that they satisfy this invariant.
+  The invariant is maintained because, when combining a point or closure
+  point with another generator, we only consider positive combinations.
+
+  The \f$\epsilon\f$ coefficient, when present, is negative for strict
+  inequality constraints, positive for points and equal to zero in all
+  the other cases.
+  Note that the above description corresponds to the end-user, high-level
+  view of a Linear_Row object. In the implementation, to allow for code reuse,
+  it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on
+  the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object
+  on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack
+  variable \f$\epsilon\f$ as an ordinary dimension of the vector space.
+
+  A Linear_Row object implementing a Linear_Expression is always of the form
+  \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
+  linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+class Parma_Polyhedra_Library::Linear_Row : public Row {
+public:
+  //! The possible kinds of Linear_Row objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    The type of the object to which the coefficients refer to,
+    encoding both topology and kind.
+
+    \ingroup PPL_CXX_interface
+    This combines the information about the topology (necessarily closed
+    or not) and the kind (line/equality or ray/point/inequality)
+    of a Linear_Row object.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  class Flags : public Row::Flags {
+  public:
+    //! Default constructor: builds an object where all flags are invalid.
+    Flags();
+
+    //! Builds an object corresponding to the topology \p t.
+    explicit Flags(Topology t);
+
+    //! Builds an object corresponding to the topology \p t and kind \p k.
+    Flags(Topology t, Kind k);
+
+    //! \name Testing and setting the type
+    //@{
+    Topology topology() const;
+    bool is_necessarily_closed() const;
+    bool is_not_necessarily_closed() const;
+    bool is_line_or_equality() const;
+    bool is_ray_or_point_or_inequality() const;
+
+    void set_necessarily_closed();
+    void set_not_necessarily_closed();
+    void set_is_line_or_equality();
+    void set_is_ray_or_point_or_inequality();
+    //@} // Testing and setting the type
+
+    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+    bool operator==(const Flags& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y
+      are different.
+    */
+    bool operator!=(const Flags& y) const;
+
+    PPL_OUTPUT_DECLARATIONS
+
+    /*! \brief
+      Loads from \p s an ASCII representation (as produced by
+      ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    */
+    bool ascii_load(std::istream& s);
+
+  private:
+    //! Builds the type from a bit-mask.
+    explicit Flags(base_type mask);
+
+    //! \name The bits that are currently in use
+    //@{
+    // NB: ascii_load assumes that these are sequential.
+    static const unsigned rpi_validity_bit
+    = Row::Flags::first_free_bit + 0;
+    static const unsigned rpi_bit
+    = Row::Flags::first_free_bit + 1;
+    static const unsigned nnc_validity_bit
+    = Row::Flags::first_free_bit + 2;
+    static const unsigned nnc_bit
+    = Row::Flags::first_free_bit + 3;
+    //@}
+
+  protected:
+    //! Index of the first bit derived classes can use.
+    static const unsigned first_free_bit
+    = Row::Flags::first_free_bit + 4;
+
+    friend class Parma_Polyhedra_Library::Linear_Row;
+  };
+
+  //! Pre-constructs a row: construction must be completed by construct().
+  Linear_Row();
+
+  //! \name Post-constructors
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with type \p t, size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz, Flags f);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity, i.e., it
+    can contain at least \p capacity elements, \p sz of which will be
+    default-constructed now. The row flags are set to \p f.
+  */
+  void construct(dimension_type sz, dimension_type capacity, Flags f);
+  //@} // Post-constructors
+
+  //! Tight constructor: resizing will require reallocation.
+  Linear_Row(dimension_type sz, Flags f);
+
+  //! Sizing constructor with capacity.
+  Linear_Row(dimension_type sz, dimension_type capacity, Flags f);
+
+  //! Ordinary copy constructor.
+  Linear_Row(const Linear_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  Linear_Row(const Linear_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+  */
+  Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Linear_Row();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns a const reference to the flags of \p *this.
+  const Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Flags& flags();
+
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+  //@} // Flags coercion methods
+
+  //! Returns the maximum space dimension a Linear_Row can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the inhomogeneous term.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns the coefficient \f$a_n\f$.
+  Coefficient_traits::const_reference coefficient(dimension_type n) const;
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Linear_Row objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  //! Linearly combines \p *this with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param y
+    The Linear_Row that will be combined with \p *this object;
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p *this and normalizes it.
+  */
+  void linear_combine(const Linear_Row& y, dimension_type k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Checks if all the invariants are satisfied and that the actual
+    size and capacity match the values provided as arguments.
+  */
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  friend class Parma_Polyhedra_Library::Linear_Expression;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Generator;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Row */
+bool operator==(const Linear_Row& x, const Linear_Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Row */
+bool operator!=(const Linear_Row& x, const Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Row
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Linear_Row& x, const Linear_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Linear_Row& x,
+	  Parma_Polyhedra_Library::Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+	       std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Row.inlines.hh line 1
+/* Linear_Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Row.inlines.hh line 27
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_Row::Flags::Flags()
+  : Row::Flags() {
+  // Note that the constructed type has its validity bit unset.
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t)
+  : Row::Flags(t << nnc_bit) {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t, const Kind k)
+  : Row::Flags((k << rpi_bit) | (t << nnc_bit)) {
+#ifndef NDEBUG
+  set_bits((1 << rpi_validity_bit)
+	   | (1 << nnc_validity_bit));
+#endif
+}
+
+inline bool
+Linear_Row::Flags::is_ray_or_point_or_inequality() const {
+  assert(test_bits(1 << rpi_validity_bit));
+  return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline void
+Linear_Row::Flags::set_is_ray_or_point_or_inequality() {
+#ifndef NDEBUG
+  set_bits(1 << rpi_validity_bit);
+#endif
+  set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_line_or_equality() const {
+  assert(test_bits(1 << rpi_validity_bit));
+  return !is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::Flags::set_is_line_or_equality() {
+#ifndef NDEBUG
+  set_bits(1 << rpi_validity_bit);
+#endif
+  reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_not_necessarily_closed() const {
+  assert(test_bits(1 << nnc_validity_bit));
+  return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_necessarily_closed() const {
+  assert(test_bits(1 << nnc_validity_bit));
+  return !is_not_necessarily_closed();
+}
+
+inline void
+Linear_Row::Flags::set_not_necessarily_closed() {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+  set_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline void
+Linear_Row::Flags::set_necessarily_closed() {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+  reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline Topology
+Linear_Row::Flags::topology() const {
+  return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED;
+}
+
+inline bool
+Linear_Row::Flags::operator==(const Flags& y) const {
+  base_type mask = low_bits_mask<base_type>(first_free_bit);
+  return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Linear_Row::Flags::operator!=(const Flags& y) const {
+  return !operator==(y);
+}
+
+inline const Linear_Row::Flags&
+Linear_Row::flags() const {
+  return static_cast<const Flags&>(Row::flags());
+}
+
+inline Linear_Row::Flags&
+Linear_Row::flags() {
+  return static_cast<Flags&>(Row::flags());
+}
+
+inline bool
+Linear_Row::is_necessarily_closed() const {
+  return flags().is_necessarily_closed();
+}
+
+inline dimension_type
+Linear_Row::max_space_dimension() {
+  // The first coefficient holds the inhomogeneous term or the divisor.
+  // In NNC rows, the last coefficient is for the epsilon dimension.
+  return max_size() - 2;
+}
+
+inline dimension_type
+Linear_Row::space_dimension() const {
+  const dimension_type sz = size();
+  return (sz == 0)
+    ? 0
+    : sz - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline
+Linear_Row::Linear_Row()
+  : Row() {
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const dimension_type capacity,
+		      const Flags f) {
+  Row::construct(sz, capacity, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity,
+		       const Flags f) {
+  construct(sz, capacity, f);
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const Flags f) {
+  construct(sz, sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const Flags f) {
+  construct(sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y)
+  : Row(y) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+		       const dimension_type capacity)
+  : Row(y, capacity) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+		       const dimension_type sz, const dimension_type capacity)
+  : Row(y, sz, capacity) {
+}
+
+inline
+Linear_Row::~Linear_Row() {
+}
+
+inline bool
+Linear_Row::is_line_or_equality() const {
+  return flags().is_line_or_equality();
+}
+
+inline bool
+Linear_Row::is_ray_or_point_or_inequality() const {
+  return flags().is_ray_or_point_or_inequality();
+}
+
+inline Topology
+Linear_Row::topology() const {
+  return flags().topology();
+}
+
+inline void
+Linear_Row::set_is_line_or_equality() {
+  flags().set_is_line_or_equality();
+}
+
+inline void
+Linear_Row::set_is_ray_or_point_or_inequality() {
+  flags().set_is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::set_necessarily_closed() {
+  flags().set_necessarily_closed();
+}
+
+inline void
+Linear_Row::set_not_necessarily_closed() {
+  flags().set_not_necessarily_closed();
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::inhomogeneous_term() const {
+  return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::coefficient(const dimension_type k) const {
+  return (*this)[k+1];
+}
+
+inline void
+Linear_Row::strong_normalize() {
+  normalize();
+  sign_normalize();
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator==(const Linear_Row& x, const Linear_Row& y) {
+  return x.flags() == y.flags()
+    && static_cast<const Row&>(x) == static_cast<const Row&>(y);
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator!=(const Linear_Row& x, const Linear_Row& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Row& x,
+     Parma_Polyhedra_Library::Linear_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Row.defs.hh line 463
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variable.defs.hh line 1
+/* Variable class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variable.defs.hh line 29
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable& v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+  The space dimension of a variable is the dimension of the vector space
+  made by all the Cartesian axes having an index less than or equal to
+  that of the considered variable; thus, if a variable has index \f$i\f$,
+  its space dimension is \f$i+1\f$.
+
+  Note that the ``meaning'' of an object of the class Variable
+  is completely specified by the integer index provided to its
+  constructor:
+  be careful not to be mislead by C++ language variable names.
+  For instance, in the following example the linear expressions
+  <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+  since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+  the same Cartesian axis.
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(0);
+  Linear_Expression e1 = x + y;
+  Linear_Expression e2 = y + z;
+  \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+  //! Builds the variable corresponding to the Cartesian axis of index \p i.
+  /*!
+    \exception std::length_error
+    Thrown if <CODE>i+1</CODE> exceeds
+    <CODE>Variable::max_space_dimension()</CODE>.
+  */
+  explicit Variable(dimension_type i);
+
+  //! Returns the index of the Cartesian axis associated to the variable.
+  dimension_type id() const;
+
+  //! Returns the maximum space dimension a Variable can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  /*!
+    The returned value is <CODE>id()+1</CODE>.
+  */
+  dimension_type space_dimension() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Type of output functions.
+  typedef void output_function_type(std::ostream& s, const Variable& v);
+
+  //! Sets the output function to be used for printing Variable objects.
+  static void set_output_function(output_function_type* p);
+
+  //! Returns the pointer to the current output function.
+  static output_function_type* get_output_function();
+
+  //! Binary predicate defining the total ordering on variables.
+  /*! \ingroup PPL_CXX_interface */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(Variable x, Variable y) const;
+  };
+
+private:
+  //! The index of the Cartesian axis.
+  dimension_type varid;
+
+  // The initialization class needs to set the default output function.
+  friend class Init;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Variable& v);
+
+  //! Pointer to the current output function.
+  static output_function_type* current_output_function;
+
+  //! The default output function.
+  static void default_output_function(std::ostream& s, const Variable& v);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variable.inlines.hh line 1
+/* Variable class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variable.inlines.hh line 27
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+  return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+  : varid(i < max_space_dimension()
+	  ? i
+	  : (throw std::length_error("PPL::Variable::Variable(i):\n"
+				     "i exceeds the maximum allowed "
+				     "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+  return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+  return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+  return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+  current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+  return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+  return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+  return less(x, y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variable.defs.hh line 147
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Expression.defs.hh line 1
+/* Linear_Expression class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Expression.defs.hh line 41
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+void swap(Parma_Polyhedra_Library::Linear_Expression& x,
+	  Parma_Polyhedra_Library::Linear_Expression& y);
+
+} // namespace std
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression represents the linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression e1 = 4*x;
+  Linear_Expression e2 = 2*y;
+  Linear_Expression e3 = z;
+  Linear_Expression e = Linear_Expression(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row {
+public:
+  //! Default constructor: returns a copy of Linear_Expression::zero().
+  Linear_Expression();
+
+  //! Ordinary copy-constructor.
+  Linear_Expression(const Linear_Expression& e);
+
+  //! Destructor.
+  ~Linear_Expression();
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression(Coefficient_traits::const_reference n);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v);
+
+  //! Builds the linear expression corresponding to constraint \p c.
+  /*!
+    Given the constraint
+    \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$,
+    where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+    If \p c is an inequality (resp., equality) constraint, then
+    the built linear expression is unique up to a positive
+    (resp., non-zero) factor.
+  */
+  explicit Linear_Expression(const Constraint& c);
+
+  /*! \brief
+    Builds the linear expression corresponding to generator \p g
+    (for points and closure points, the divisor is not copied).
+
+    Given the generator
+    \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+    (where, for lines and rays, we have \f$d = 1\f$),
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+    The inhomogeneous term of the linear expression will always be 0.
+    If \p g is a ray, point or closure point (resp., a line), then
+    the linear expression is unique up to a positive
+    (resp., non-zero) factor.
+  */
+  explicit Linear_Expression(const Generator& g);
+
+  /*! \brief
+    Builds the linear expression corresponding to grid generator \p g
+    (for points, parameters and lines the divisor is not copied).
+
+    Given the grid generator
+    \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+    The inhomogeneous term of the linear expression is always 0.
+  */
+  explicit Linear_Expression(const Grid_Generator& g);
+
+  //! Builds the linear expression corresponding to congruence \p cg.
+  /*!
+    Given the congruence
+    \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$,
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+  */
+  explicit Linear_Expression(const Congruence& cg);
+
+  //! Returns the maximum space dimension a Linear_Expression can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the (zero-dimension space) constant 0.
+  static const Linear_Expression& zero();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Linear_Expression& y);
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the (zero-dimension space) constant 0.
+  */
+  static const Linear_Expression* zero_p;
+
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Generator;
+  // The following declaration grants access to Grid_Generator::parameter.
+  friend class Parma_Polyhedra_Library::Grid_Generator;
+  friend class Parma_Polyhedra_Library::Congruence;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Constraint_System::affine_preimage().
+  friend class Parma_Polyhedra_Library::Constraint_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Generator_System::affine_image().
+  friend class Parma_Polyhedra_Library::Generator_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Congruence_System::affine_preimage().
+  friend class Parma_Polyhedra_Library::Congruence_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Grid_Generator_System::affine_image().
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  //! Copy-constructor with a specified space dimension.
+  Linear_Expression(const Linear_Expression& e, dimension_type sz);
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Expression(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression(dimension_type sz, bool);
+
+  /*! \brief
+    Builds the linear expression corresponding to the difference of
+    \p v and \p w.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p v or the one of \p w exceed
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v, Variable w);
+
+  friend Linear_Expression
+  operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression
+  operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression
+  operator-(const Linear_Expression& e);
+
+  friend Linear_Expression
+  operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression
+  operator-(Variable v, Variable w);
+  friend Linear_Expression
+  operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression
+  operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e, Variable v);
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e, Variable v);
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<(std::ostream& s, const Linear_Expression& e);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Expression.inlines.hh line 1
+/* Linear_Expression class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Expression.inlines.hh line 28
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Linear_Expression::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline
+Linear_Expression::Linear_Expression()
+  : Linear_Row(1, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(dimension_type sz, bool)
+  : Linear_Row(sz, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Variable v)
+  : Linear_Row(v.space_dimension() <= max_space_dimension()
+	       ? v.id() + 2
+	       : (throw std::length_error("PPL::Linear_Expression::"
+					  "Linear_Expression(v):\n"
+					  "v exceeds the maximum allowed "
+					  "space dimension."),
+		  v.id() + 2)
+	       , Linear_Row::Flags()) {
+  (*this)[v.id() + 1] = 1;
+}
+
+inline
+Linear_Expression::Linear_Expression(const Variable v, const Variable w)
+  : Linear_Row() {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > max_space_dimension())
+    throw std::length_error("PPL::Linear_Expression::"
+                            "Linear_Expression(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  construct(space_dim+1, Linear_Row::Flags());
+  if (v_space_dim != w_space_dim) {
+    (*this)[v_space_dim] = 1;
+    (*this)[w_space_dim] = -1;
+  }
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e)
+  : Linear_Row(e) {
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e,
+				     dimension_type sz)
+  : Linear_Row(e, sz, sz) {
+}
+
+inline
+Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
+  : Linear_Row(1, Linear_Row::Flags()) {
+  (*this)[0] = n;
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+  return size() - 1;
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return Coefficient_zero();
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+  return Linear_Row::inhomogeneous_term();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+  assert(zero_p != 0);
+  return *zero_p;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) + Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+  // FIXME: provide a better implementation.
+  return e + Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+  return v + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return -n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+  return Linear_Expression(v, w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) - e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+  // FIXME: provide a better implementation.
+  return e - Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n * e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  e[0] += n;
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  e[0] -= n;
+  return e;
+}
+
+inline void
+Linear_Expression::swap(Linear_Expression& y) {
+  Linear_Row::swap(y);
+}
+
+inline void
+Linear_Expression::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Linear_Expression::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Expression& x,
+     Parma_Polyhedra_Library::Linear_Expression& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_Expression.defs.hh line 454
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint_System.defs.hh line 1
+/* Constraint_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_System.defs.hh line 1
+/* Linear_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Matrix.defs.hh line 1
+/* Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Matrix.defs.hh line 31
+#include <vector>
+#include <cstddef>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A 2-dimensional matrix of coefficients.
+/*! \ingroup PPL_CXX_interface
+  A Matrix object is a sequence of Row objects and is characterized
+  by the matrix dimensions (the number of rows and columns).
+  All the rows in a matrix, besides having the same size (corresponding
+  to the number of columns of the matrix), are also bound to have the
+  same capacity.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+class Parma_Polyhedra_Library::Matrix {
+public:
+  //! Returns the maximum number of rows of a Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns of a Matrix.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    Rows' size and capacity are initialized to \f$0\f$.
+  */
+  Matrix();
+
+  //! Builds a zero matrix with specified dimensions and flags.
+  /*!
+    \param n_rows
+    The number of rows of the matrix that will be created;
+
+    \param n_columns
+    The number of columns of the matrix that will be created.
+
+    \param row_flags
+    The flags used to build the rows of the matrix;
+    by default, the rows will have all flags unset.
+  */
+  Matrix(dimension_type n_rows, dimension_type n_columns,
+	 Row::Flags row_flags = Row::Flags());
+
+  //! Copy-constructor.
+  Matrix(const Matrix& y);
+
+  //! Destructor.
+  ~Matrix();
+
+  //! Assignment operator.
+  Matrix& operator=(const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! An iterator over a matrix.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each row contained in a Matrix object.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  class const_iterator {
+  private:
+    typedef std::vector<Row>::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef std::iterator_traits<Iter>::value_type value_type;
+    typedef std::iterator_traits<Iter>::difference_type difference_type;
+    typedef std::iterator_traits<Iter>::pointer pointer;
+    typedef std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no rows.
+  /*!
+    \note
+    The unusual naming for this method is \em intentional:
+    we do not want it to be named \c empty because this would cause
+    an error prone name clash with the corresponding methods in derived
+    classes Constraint_System and Congruence_System (which have a
+    different semantics).
+  */
+  bool has_no_rows() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row, if \p *this is
+    not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  // FIXME: the following section must become private.
+protected:
+  //! Contains the rows of the matrix.
+  std::vector<Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Capacity allocated for each row.
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void swap(Matrix& y);
+
+  //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param row_flags
+    Flags for the newly added rows.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_rows(dimension_type n, Row::Flags row_flags);
+
+  //! Adds \p n columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_columns(dimension_type n);
+
+  //! Adds \p n rows and \p m columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param m
+    The number of columns to be added: must be strictly positive.
+
+    \param row_flags
+    Flags for the newly added rows.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times (c+m)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_rows_and_columns(dimension_type n, dimension_type m,
+				 Row::Flags row_flags);
+
+  //! Adds a copy of the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be copied: it must have the same number of columns as
+    the matrix.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_row(const Row& y);
+
+  //! Adds the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be added: it must have the same size and capacity as \p
+    *this.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_recycled_row(Row& y);
+
+  //! Makes the matrix shrink by removing its \p n trailing columns.
+  void remove_trailing_columns(dimension_type n);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized matrix;
+
+    \param new_n_columns
+    The number of columns of the resized matrix.
+
+    \param row_flags
+    The flags of the rows eventually added to the matrix.
+
+    The matrix is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original matrix is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns,
+		      Row::Flags row_flags);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_columns(dimension_type i,  dimension_type j);
+
+  //! Permutes the columns of the matrix.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! \name Accessors
+  //@{
+
+  //! Returns the number of columns of the matrix (i.e., the size of the rows).
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+  //@} // Accessors
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  Row& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Erases from the matrix all the rows but those having
+    an index less than \p first_to_erase.
+  */
+  void erase_to_end(dimension_type first_to_erase);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Specializes <CODE>std::swap</CODE>.
+  /*! \relates Parma_Polyhedra_Library::Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Matrix& x,
+	  Parma_Polyhedra_Library::Matrix& y);
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Matrix& x, const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Matrix& x, const Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Matrix.inlines.hh line 1
+/* Matrix class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Matrix.inlines.hh line 27
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Matrix::max_num_rows() {
+  return std::vector<Row>().max_size();
+}
+
+inline dimension_type
+Matrix::max_num_columns() {
+  return Row::max_size();
+}
+
+inline memory_size_type
+Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+Matrix::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+inline Matrix::const_iterator::reference
+Matrix::const_iterator::operator*() const {
+  return *i;
+}
+
+inline Matrix::const_iterator::pointer
+Matrix::const_iterator::operator->() const {
+  return &*i;
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+inline Matrix::const_iterator
+Matrix::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+inline bool
+Matrix::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Matrix::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+inline bool
+Matrix::has_no_rows() const {
+  return rows.empty();
+}
+
+inline Matrix::const_iterator
+Matrix::begin() const {
+  return const_iterator(rows.begin());
+}
+
+inline Matrix::const_iterator
+Matrix::end() const {
+  return const_iterator(rows.end());
+}
+
+inline void
+Matrix::swap(Matrix& y) {
+  std::swap(rows, y.rows);
+  std::swap(row_size, y.row_size);
+  std::swap(row_capacity, y.row_capacity);
+}
+
+inline
+Matrix::Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+inline
+Matrix::Matrix(const Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+inline
+Matrix::~Matrix() {
+}
+
+inline Matrix&
+Matrix::operator=(const Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+inline void
+Matrix::add_row(const Row& y) {
+  Row new_row(y, row_capacity);
+  add_recycled_row(new_row);
+}
+
+inline Row&
+Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline const Row&
+Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline dimension_type
+Matrix::num_columns() const {
+  return row_size;
+}
+
+/*! \relates Matrix */
+inline bool
+operator!=(const Matrix& x, const Matrix& y) {
+  return !(x == y);
+}
+
+inline void
+Matrix::erase_to_end(const dimension_type first_to_erase) {
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+}
+
+inline void
+Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Row>().swap(rows);
+  row_size = 0;
+  row_capacity = 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Matrix& x,
+     Parma_Polyhedra_Library::Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Matrix.defs.hh line 366
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_System.defs.hh line 33
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents either a constraint system
+  or a generator system. Each Linear_System object can be viewed
+  as a finite sequence of strong-normalized Linear_Row objects,
+  where each Linear_Row implements a constraint or a generator.
+  Linear systems are characterized by the matrix of coefficients,
+  also encoding the number, size and capacity of Linear_row objects,
+  as well as a few additional information, including:
+   - the topological kind of (all) the rows;
+   - an indication of whether or not some of the rows in the Linear_System
+     are <EM>pending</EM>, meaning that they still have to undergo
+     an (unspecified) elaboration; if there are pending rows, then these
+     form a proper suffix of the overall sequence of rows;
+   - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+     non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+class Parma_Polyhedra_Library::Linear_System : public Matrix {
+public:
+  //! Builds an empty linear system with specified topology.
+  /*!
+    Rows size and capacity are initialized to \f$0\f$.
+  */
+  Linear_System(Topology topol);
+
+  //! Builds a system with specified topology and dimensions.
+  /*!
+    \param topol
+    The topology of the system that will be created;
+
+    \param n_rows
+    The number of rows of the system that will be created;
+
+    \param n_columns
+    The number of columns of the system that will be created.
+
+    Creates a \p n_rows \f$\times\f$ \p n_columns system whose
+    coefficients are all zero and whose rows are all initialized
+    to be of the given topology.
+  */
+  Linear_System(Topology topol,
+		dimension_type n_rows, dimension_type n_columns);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A tag class.
+  /*! \ingroup PPL_CXX_interface
+    Tag class to differentiate the Linear_System copy-constructor that
+    copies pending rows as pending from the one that transforms
+    pending rows into non-pending ones.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct With_Pending {
+  };
+
+  //! Copy-constructor: pending rows are transformed into non-pending ones.
+  Linear_System(const Linear_System& y);
+
+  //! Full copy-constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, With_Pending);
+
+  //! Assignment operator: pending rows are transformed into non-pending ones.
+  Linear_System& operator=(const Linear_System& y);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Linear_System& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Linear_System& y);
+
+  //! Returns the maximum space dimension a Linear_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the rows in the system.
+  /*!
+    The computation of the space dimension correctly ignores
+    the column encoding the inhomogeneous terms of constraint
+    (resp., the divisors of generators);
+    if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+    also the column of the \f$\epsilon\f$-dimension coefficients
+    will be ignored.
+  */
+  dimension_type space_dimension() const;
+
+  //! Makes the system shrink by removing its \p n trailing columns.
+  void remove_trailing_columns(dimension_type n);
+
+  //! Permutes the columns of the system.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the system has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the \p k-th row of the system.
+  Linear_Row& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the system.
+  const Linear_Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  //! Sign-normalizes the system.
+  void sign_normalize();
+
+  //! \name Accessors
+  //@{
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+  //@} // Accessors
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+  void set_necessarily_closed();
+
+  //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  void set_not_necessarily_closed();
+
+  //! Sets the topology of all rows equal to the system topology.
+  void set_rows_topology();
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Adds \p n rows and columns to the system.
+  /*!
+    \param n
+    The number of rows and columns to be added: must be strictly positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_rows_and_columns(dimension_type n);
+
+  /*! \brief
+    Adds a copy of \p r to the system,
+    automatically resizing the system or the row's copy, if needed.
+  */
+  void insert(const Linear_Row& r);
+
+  /*! \brief
+    Adds a copy of the given row to the pending part of the system,
+    automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(const Linear_Row& r);
+
+  //! Adds a copy of the given row to the system.
+  void add_row(const Linear_Row& r);
+
+  //! Adds a new empty row to the system, setting only its flags.
+  void add_pending_row(Linear_Row::Flags flags);
+
+  //! Adds a copy of the given row to the pending part of the system.
+  void add_pending_row(const Linear_Row& r);
+
+  //! Adds to \p *this a copy of the rows of `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void add_rows(const Linear_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void add_pending_rows(const Linear_System& y);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Sorts the rows (in growing order) form \p first_row to
+    \p last_row and eliminates duplicated ones.
+  */
+  void sort_rows(dimension_type first_row, dimension_type last_row);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Linear_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  class With_Bit_Matrix_iterator;
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as to
+    simplify the linear system.
+  */
+  void simplify();
+
+  /*! \brief
+    Normalizes the system by dividing each row for the GCD of the
+    row's elements.
+  */
+  void normalize();
+
+  //! Clears the system deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Reads into a Linear_System object the information produced by the
+    output of ascii_dump(std::ostream&) const.  The specialized methods
+    provided by Constraint_System and Generator_System take care of
+    properly reading the contents of the system.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \param check_strong_normalized
+    <CODE>true</CODE> if and only if the strong normalization of all
+    the rows in the system has to be checked.
+
+    By default, the strong normalization check is performed.
+    This check may be turned off to avoid useless repeated checking;
+    e.g., when re-checking a well-formed Linear_System after the permutation
+    or deletion of some of its rows.
+  */
+  bool OK(bool check_strong_normalized = true) const;
+
+private:
+  //! The topological kind of the rows in the system.
+  Topology row_topology;
+
+  //! The index of the first pending row.
+  dimension_type index_first_pending;
+
+  /*! \brief
+    <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+    <CODE>bool compare(const Linear_Row&, const Linear_Row&)</CODE>.
+    If <CODE>false</CODE> may not be sorted.
+  */
+  bool sorted;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  struct Row_Less_Than {
+    bool operator()(const Row& x, const Row& y) const;
+  };
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Linear_System& x,
+	  Parma_Polyhedra_Library::Linear_System& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Linear_System& x, const Linear_System& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Linear_System& x, const Linear_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator keeping a Linear_System consistent with a Bit_Matrix.
+/*! \ingroup PPL_CXX_interface
+  An iterator on the vector of Row objects encoded in a Linear_System
+  extended to maintain a corresponding iterator on a vector of
+  Bit_Row objects.  Access to values is always done on the Row
+  objects, but iterator movements and swaps are done on both components.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator {
+public:
+  typedef std::vector<Row>::iterator Iter1;
+  typedef std::vector<Bit_Row>::iterator Iter2;
+
+private:
+  Iter1 i1;
+  Iter2 i2;
+
+public:
+  // Same traits as Iter1.
+  typedef std::iterator_traits<Iter1>::iterator_category iterator_category;
+  typedef std::iterator_traits<Iter1>::value_type value_type;
+  typedef std::iterator_traits<Iter1>::difference_type difference_type;
+  typedef std::iterator_traits<Iter1>::pointer pointer;
+  typedef std::iterator_traits<Iter1>::reference reference;
+
+  //! Constructor.
+  With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+
+  //! Copy-constructor.
+  With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y);
+
+  //! Destructor.
+  ~With_Bit_Matrix_iterator();
+
+  //! Assignment operator.
+  With_Bit_Matrix_iterator&
+  operator=(const With_Bit_Matrix_iterator& y);
+
+  //! \name Operators Implementing Iterator Movement
+  //@{
+  With_Bit_Matrix_iterator& operator++();
+  With_Bit_Matrix_iterator operator++(int);
+
+  With_Bit_Matrix_iterator& operator--();
+  With_Bit_Matrix_iterator operator--(int);
+
+  With_Bit_Matrix_iterator& operator+=(difference_type d);
+  With_Bit_Matrix_iterator operator+(difference_type d) const;
+
+  With_Bit_Matrix_iterator& operator-=(difference_type d);
+  With_Bit_Matrix_iterator operator-(difference_type d) const;
+  //@}
+
+  //! Distance operator.
+  difference_type operator-(const With_Bit_Matrix_iterator& y) const;
+
+  //! \name Comparisons between Iterators
+  //@{
+  bool operator==(const With_Bit_Matrix_iterator& y) const;
+  bool operator!=(const With_Bit_Matrix_iterator& y) const;
+  bool operator<(const With_Bit_Matrix_iterator& y) const;
+  //@}
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Access-through operator.
+  pointer operator->() const;
+
+  //! Swaps the pointed Row objects while keeping Bit_Matrix consistent.
+  void iter_swap(const With_Bit_Matrix_iterator& y) const;
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(Parma_Polyhedra_Library
+	  ::Linear_System::With_Bit_Matrix_iterator x,
+	  Parma_Polyhedra_Library
+	  ::Linear_System::With_Bit_Matrix_iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_System.inlines.hh line 1
+/* Linear_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Row.defs.hh line 1
+/* Bit_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Row.defs.hh line 28
+#include <iosfwd>
+#include <gmp.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Bit_Row
+  Compares \p x with \p y starting from the least significant bits.
+  The ordering is total and has the following property: if \p x and \p y
+  are two rows seen as sets of naturals, if \p x is a strict subset
+  of \p y, then \p x comes before \p y.
+
+  Returns
+  - -1 if \p x comes before \p y in the ordering;
+  -  0 if \p x and \p y are equal;
+  -  1 if \p x comes after \p y in the ordering.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Set-theoretic inclusion test: sets \p strict_subset to a Boolean
+  indicating whether the inclusion is strict or not.
+
+  \relates Bit_Row
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+		     bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic union.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic intersection.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic difference.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row in a matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Row {
+public:
+  //! Default constructor.
+  Bit_Row();
+
+  //! Copy-constructor.
+  Bit_Row(const Bit_Row& y);
+
+  //! Destructor.
+  ~Bit_Row();
+
+  //! Assignment operator.
+  Bit_Row& operator=(const Bit_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Bit_Row& y);
+
+  //! Returns the truth value corresponding to the bit in position \p k.
+  bool operator[](unsigned long k) const;
+
+  //! Sets the bit in position \p k.
+  void set(unsigned long k);
+
+  //! Sets bits up to position \p k (excluded).
+  void set_until(unsigned long k);
+
+  //! Clears the bit in position \p k.
+  void clear(unsigned long k);
+
+  //! Clears bits from position \p k (included) onward.
+  void clear_from(unsigned long k);
+
+  //! Clears all the bits of the row.
+  void clear();
+
+  friend int compare(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator==(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator!=(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+			      bool& strict_subset);
+  friend bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+  friend void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+  friend void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+  friend void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z);
+
+  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+  unsigned long first() const;
+
+  /*! \brief
+    Returns the index of the first set bit after \p position
+    or ULONG_MAX if no bit after \p position is set.
+  */
+  unsigned long next(unsigned long position) const;
+
+  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+  unsigned long last() const;
+
+  /*! \brief
+    Returns the index of the first set bit before \p position
+    or ULONG_MAX if no bits before \p position is set.
+  */
+  unsigned long prev(unsigned long position) const;
+
+  //! Returns the number of set bits in the row.
+  unsigned long count_ones() const;
+
+  //! Returns <CODE>true</CODE> if no bit is set in the row.
+  bool empty() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied
+  bool OK() const;
+
+private:
+  //! Bit-vector representing the row.
+  mpz_t vec;
+
+  //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
+  static unsigned int first_one(mp_limb_t w);
+
+  //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
+  static unsigned int last_one(mp_limb_t w);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Bit_Row& x,
+	  Parma_Polyhedra_Library::Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Row.inlines.hh line 1
+/* Bit_Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Row.inlines.hh line 27
+#include <cassert>
+// For the declaration of ffs(3).
+#include <strings.h>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Row::Bit_Row() {
+  mpz_init(vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y) {
+  mpz_init_set(vec, y.vec);
+}
+
+inline
+Bit_Row::~Bit_Row() {
+  mpz_clear(vec);
+}
+
+inline Bit_Row&
+Bit_Row::operator=(const Bit_Row& y) {
+  mpz_set(vec, y.vec);
+  return *this;
+}
+
+inline void
+Bit_Row::set(const unsigned long k) {
+  mpz_setbit(vec, k);
+}
+
+inline void
+Bit_Row::clear(const unsigned long k) {
+  mpz_clrbit(vec, k);
+}
+
+inline void
+Bit_Row::clear_from(const unsigned long k) {
+  mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Bit_Row::count_ones() const {
+  assert(vec->_mp_size >= 0);
+  return mpn_popcount(vec->_mp_d, vec->_mp_size);
+}
+
+inline bool
+Bit_Row::empty() const {
+  return mpz_sgn(vec) == 0;
+}
+
+inline void
+Bit_Row::swap(Bit_Row& y) {
+  mpz_swap(vec, y.vec);
+}
+
+inline void
+Bit_Row::clear() {
+  mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Bit_Row::external_memory_in_bytes() const {
+  return vec[0]._mp_alloc * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Bit_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+#if PPL_HAVE_DECL_FFS && PPL_SIZEOF_MP_LIMB_T == PPL_SIZEOF_INT
+
+inline unsigned int
+Bit_Row::first_one(mp_limb_t w) {
+  return ffs(w)-1;
+}
+
+#endif
+
+/*! \relates Bit_Row */
+inline void
+set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
+  mpz_ior(z.vec, x.vec, y.vec);
+}
+
+/*! \relates Bit_Row */
+inline void
+set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
+  mpz_and(z.vec, x.vec, y.vec);
+}
+
+/*! \relates Bit_Row */
+inline void
+set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
+  DIRTY_TEMP0(mpz_class, complement_y);
+  mpz_com(complement_y.get_mpz_t(), y.vec);
+  mpz_and(z.vec, x.vec, complement_y.get_mpz_t());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+inline void
+swap(Parma_Polyhedra_Library::Bit_Row& x,
+     Parma_Polyhedra_Library::Bit_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Row.defs.hh line 221
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Linear_System::external_memory_in_bytes() const {
+  return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_System::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Linear_System::is_sorted() const {
+  // The flag `sorted' does not really reflect the sortedness status
+  // of a system (if `sorted' evaluates to `false' nothing is known).
+  // This assertion is used to ensure that the system
+  // is actually sorted when `sorted' value is 'true'.
+  assert(!sorted || check_sorted());
+  return sorted;
+}
+
+inline void
+Linear_System::set_sorted(const bool b) {
+  sorted = b;
+}
+
+inline
+Linear_System::Linear_System(Topology topol)
+  : Matrix(),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true) {
+}
+
+inline
+Linear_System::Linear_System(Topology topol,
+			     dimension_type n_rows, dimension_type n_columns)
+  : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)),
+    row_topology(topol),
+    index_first_pending(n_rows),
+    sorted(true) {
+}
+
+inline dimension_type
+Linear_System::first_pending_row() const {
+  return index_first_pending;
+}
+
+inline dimension_type
+Linear_System::num_pending_rows() const {
+  assert(num_rows() >= first_pending_row());
+  return num_rows() - first_pending_row();
+}
+
+inline void
+Linear_System::unset_pending_rows() {
+  index_first_pending = num_rows();
+}
+
+inline void
+Linear_System::set_index_first_pending_row(const dimension_type i) {
+  index_first_pending = i;
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y)
+  : Matrix(y),
+    row_topology(y.row_topology) {
+  unset_pending_rows();
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  assert(num_pending_rows() == 0);
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y, With_Pending)
+  : Matrix(y),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted) {
+}
+
+inline Linear_System&
+Linear_System::operator=(const Linear_System& y) {
+  Matrix::operator=(y);
+  row_topology = y.row_topology;
+  unset_pending_rows();
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  assert(num_pending_rows() == 0);
+  return *this;
+}
+
+inline void
+Linear_System::assign_with_pending(const Linear_System& y) {
+  Matrix::operator=(y);
+  row_topology = y.row_topology;
+  index_first_pending = y.index_first_pending;
+  sorted = y.sorted;
+}
+
+inline void
+Linear_System::swap(Linear_System& y) {
+  Matrix::swap(y);
+  std::swap(row_topology, y.row_topology);
+  std::swap(index_first_pending, y.index_first_pending);
+  std::swap(sorted, y.sorted);
+}
+
+inline void
+Linear_System::clear() {
+  // Note: do NOT modify the value of `row_topology'.
+  Matrix::clear();
+  index_first_pending = 0;
+  sorted = true;
+}
+
+inline void
+Linear_System::resize_no_copy(const dimension_type new_n_rows,
+			      const dimension_type new_n_columns) {
+  Matrix::resize_no_copy(new_n_rows, new_n_columns,
+			 Linear_Row::Flags(row_topology));
+  // Even though `*this' may happen to keep its sortedness, we believe
+  // that checking such a property is not worth the effort.  In fact,
+  // it is very likely that the system will be overwritten as soon as
+  // we return.
+  set_sorted(false);
+}
+
+inline void
+Linear_System::set_necessarily_closed() {
+  row_topology = NECESSARILY_CLOSED;
+  if (!has_no_rows())
+    set_rows_topology();
+}
+
+inline void
+Linear_System::set_not_necessarily_closed() {
+  row_topology = NOT_NECESSARILY_CLOSED;
+  if (!has_no_rows())
+    set_rows_topology();
+}
+
+inline bool
+Linear_System::is_necessarily_closed() const {
+  return row_topology == NECESSARILY_CLOSED;
+}
+
+inline Linear_Row&
+Linear_System::operator[](const dimension_type k) {
+  return static_cast<Linear_Row&>(Matrix::operator[](k));
+}
+
+inline const Linear_Row&
+Linear_System::operator[](const dimension_type k) const {
+  return static_cast<const Linear_Row&>(Matrix::operator[](k));
+}
+
+inline Topology
+Linear_System::topology() const {
+  return row_topology;
+}
+
+inline dimension_type
+Linear_System::max_space_dimension() {
+  // Column zero holds the inhomogeneous term or the divisor.
+  // In NNC linear systems, the last column holds the coefficient
+  // of the epsilon dimension.
+  return max_num_columns() - 2;
+}
+
+inline dimension_type
+Linear_System::space_dimension() const {
+  const dimension_type n_columns = num_columns();
+  return (n_columns == 0)
+    ? 0
+    : n_columns - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline void
+Linear_System::remove_trailing_columns(const dimension_type n) {
+  Matrix::remove_trailing_columns(n);
+  // Have to re-normalize the rows of the system,
+  // since we removed some coefficients.
+  strong_normalize();
+}
+
+inline void
+Linear_System::permute_columns(const std::vector<dimension_type>& cycles) {
+  Matrix::permute_columns(cycles);
+  // The rows with permuted columns are still normalized but may
+  // be not strongly normalized: sign normalization is necessary.
+  sign_normalize();
+}
+
+/*! \relates Linear_System */
+inline bool
+operator!=(const Linear_System& x, const Linear_System& y) {
+  return !(x == y);
+}
+
+inline bool
+Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const {
+  return compare(static_cast<const Linear_Row&>(x),
+		 static_cast<const Linear_Row&>(y)) < 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+inline void
+swap(Parma_Polyhedra_Library::Linear_System& x,
+     Parma_Polyhedra_Library::Linear_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_System::With_Bit_Matrix_iterator::
+With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2)
+  : i1(iter1), i2(iter2) {
+}
+
+inline
+Linear_System::With_Bit_Matrix_iterator::
+With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y)
+  : i1(y.i1), i2(y.i2) {
+}
+
+inline
+Linear_System::With_Bit_Matrix_iterator::
+~With_Bit_Matrix_iterator() {
+}
+
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::
+operator=(const With_Bit_Matrix_iterator& y) {
+  i1 = y.i1;
+  i2 = y.i2;
+  return *this;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator++() {
+  ++i1;
+  ++i2;
+  return *this;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::operator++(int) {
+  With_Bit_Matrix_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator--() {
+  --i1;
+  --i2;
+  return *this;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::operator--(int) {
+  With_Bit_Matrix_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator+=(difference_type d) {
+  i1 += d;
+  i2 += d;
+  return *this;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::
+operator+(difference_type d) const {
+  With_Bit_Matrix_iterator tmp = *this;
+  tmp += d;
+  return tmp;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator&
+Linear_System::With_Bit_Matrix_iterator::operator-=(difference_type d) {
+  i1 -= d;
+  i2 -= d;
+  return *this;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator
+Linear_System::With_Bit_Matrix_iterator::
+operator-(difference_type d) const {
+  With_Bit_Matrix_iterator tmp = *this;
+  tmp -= d;
+  return tmp;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator::difference_type
+Linear_System::With_Bit_Matrix_iterator::
+operator-(const With_Bit_Matrix_iterator& y) const {
+  return i1 - y.i1;
+}
+
+inline bool
+Linear_System::With_Bit_Matrix_iterator::
+operator==(const With_Bit_Matrix_iterator& y) const {
+  return i1 == y.i1;
+}
+
+inline bool
+Linear_System::With_Bit_Matrix_iterator::
+operator!=(const With_Bit_Matrix_iterator& y) const {
+  return i1 != y.i1;
+}
+
+inline bool
+Linear_System::With_Bit_Matrix_iterator::
+operator<(const With_Bit_Matrix_iterator& y) const {
+  return i1 < y.i1;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator::reference
+Linear_System::With_Bit_Matrix_iterator::operator*() const {
+  return *i1;
+}
+
+inline Linear_System::With_Bit_Matrix_iterator::pointer
+Linear_System::With_Bit_Matrix_iterator::operator->() const {
+  return &*i1;
+}
+
+inline void
+Linear_System::With_Bit_Matrix_iterator::
+iter_swap(const With_Bit_Matrix_iterator& y) const {
+  std::iter_swap(i1, y.i1);
+  std::iter_swap(i2, y.i2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline void
+iter_swap(Parma_Polyhedra_Library
+	  ::Linear_System::With_Bit_Matrix_iterator x,
+	  Parma_Polyhedra_Library
+	  ::Linear_System::With_Bit_Matrix_iterator y) {
+  x.iter_swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Linear_System.defs.hh line 515
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint_System.defs.hh line 33
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Constraint_System
+  Writes <CODE>true</CODE> if \p cs is empty.  Otherwise, writes on
+  \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+void swap(Parma_Polyhedra_Library::Constraint_System& x,
+	  Parma_Polyhedra_Library::Constraint_System& y);
+
+} // namespace std
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+    When inserting constraints in a system, space dimensions are
+    automatically adjusted so that all the constraints in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of constraints corresponding to
+    a square in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+    \endcode
+    Note that:
+    the constraint system is created with space dimension zero;
+    the first and third constraint insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding four strict inequalities to the constraint system
+    of the previous example, we can remove just the four
+    vertices from the square defined above.
+    \code
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 6);
+  cs.insert(x - y < 3);
+  cs.insert(y - x < 3);
+    \endcode
+
+    \par Example 3
+    The following code builds a system of constraints corresponding to
+    a half-strip in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+    \endcode
+
+    \note
+    After inserting a multiset of constraints in a constraint system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> constraint system
+    will be available, where original constraints may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System : private Linear_System {
+public:
+  //! Default constructor: builds an empty system of constraints.
+  Constraint_System();
+
+  //! Builds the singleton system containing only constraint \p c.
+  explicit Constraint_System(const Constraint& c);
+
+  //! Builds a system containing copies of any equalities in \p cgs.
+  explicit Constraint_System(const Congruence_System& cgs);
+
+  //! Ordinary copy-constructor.
+  Constraint_System(const Constraint_System& cs);
+
+  //! Destructor.
+  ~Constraint_System();
+
+  //! Assignment operator.
+  Constraint_System& operator=(const Constraint_System& y);
+
+  //! Returns the maximum space dimension a Constraint_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more strict inequality constraints.
+  */
+  bool has_strict_inequalities() const;
+
+  /*! \brief
+    Removes all the constraints from the constraint system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Constraint& c);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System& zero_dim_empty();
+
+  //! An iterator over a system of constraints.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each constraint contained in a Constraint_System object.
+
+    \par Example
+    The following code prints the system of constraints
+    defining the polyhedron <CODE>ph</CODE>:
+    \code
+  const Constraint_System& cs = ph.constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Constraint,
+			   ptrdiff_t,
+			   const Constraint*,
+			   const Constraint&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Constraint& operator*() const;
+
+    //! Indirect member selector.
+    const Constraint* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Constraint_System;
+
+    //! The const iterator over the matrix of constraints.
+    Linear_System::const_iterator i;
+
+    //! A const pointer to the matrix of constraints.
+    const Linear_System* csp;
+
+    //! Constructor.
+    const_iterator(const Linear_System::const_iterator& iter,
+		   const Constraint_System& csys);
+
+    //! \p *this skips to the next non-trivial constraint.
+    void skip_forward();
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no constraints.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first constraint,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Constraint.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Constraint_System& y);
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System* zero_dim_empty_p;
+
+  friend class const_iterator;
+  friend class Parma_Polyhedra_Library::Polyhedron;
+
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+  //! Builds an empty system of constraints having the specified topology.
+  explicit Constraint_System(Topology topol);
+
+  /*! \brief
+    Builds a system of \p n_rows constraints on a \p n_columns - 1
+    dimensional space (including the \f$\epsilon\f$ dimension, if
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+  */
+  Constraint_System(Topology topol,
+		    dimension_type n_rows, dimension_type n_columns);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the topology and
+    the number of space dimensions given as parameters
+    (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains strict inequalities.
+  */
+  bool adjust_topology_and_space_dimension(Topology topol,
+					   dimension_type num_dimensions);
+
+  //! Returns the \p k- th constraint of the system.
+  Constraint& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th constraint of the system.
+  const Constraint& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+  bool satisfies_all_constraints(const Generator& g) const;
+
+  //! Substitutes a given column of coefficients by a given affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is substituted.
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations
+    (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+    having any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p
+    denominator that will be used as denominator of the affine
+    transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation substitutes the matrix of constraints
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(dimension_type v,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of equality constraints.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of inequality constraints.
+  dimension_type num_inequalities() const;
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as
+    to provide a partial simplification of the system of constraints.
+
+    It is assumed that the system has no pending constraints.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+    It is a pending constraint.
+  */
+  void insert_pending(const Constraint& c);
+
+  //! Adds low-level constraints to the constraint system.
+  void add_low_level_constraints();
+};
+
+// Constraint_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint.defs.hh line 34
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 = \p v2.
+/*! \relates Constraint */
+Constraint
+operator==(Variable v1, Variable v2);
+
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \<= \p v2.
+/*! \relates Constraint */
+Constraint
+operator<=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \>= \p v2.
+/*! \relates Constraint */
+Constraint
+operator>=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \< \p v2.
+/*! \relates Constraint */
+Constraint
+operator<(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \> \p v2.
+/*! \relates Constraint */
+Constraint
+operator>(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+void swap(Parma_Polyhedra_Library::Constraint& x,
+	  Parma_Polyhedra_Library::Constraint& y);
+
+} // namespace std
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Constraint is either:
+  - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+  - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+  - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+  and \f$b\f$ is the integer inhomogeneous term.
+
+  \par How to build a constraint
+  Constraints are typically built by applying a relation symbol
+  to a pair of linear expressions.
+  Available relation symbols are equality (<CODE>==</CODE>),
+  non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+  strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+  The space dimension of a constraint is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality constraint
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Constraint eq_c(3*x + 5*y - z == 0);
+  \endcode
+  The following code builds the (non-strict) inequality constraint
+  \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+  \code
+  Constraint ineq_c(4*x >= 2*y - 13);
+  \endcode
+  The corresponding strict inequality constraint
+  \f$4x > 2y - 13\f$ is obtained as follows:
+  \code
+  Constraint strict_ineq_c(4*x > 2*y - 13);
+  \endcode
+  An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Constraint false_c = Constraint::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Constraint false_c1(Linear_Expression::zero() == 1);
+  Constraint false_c2(Linear_Expression::zero() >= 1);
+  Constraint false_c3(Linear_Expression::zero() > 0);
+  \endcode
+  In contrast, the following code defines an unsatisfiable constraint
+  having space dimension \f$3\f$:
+  \code
+  Constraint false_c(0*z == 1);
+  \endcode
+
+  \par How to inspect a constraint
+  Several methods are provided to examine a constraint and extract
+  all the encoded information: its space dimension, its type
+  (equality, non-strict inequality, strict inequality) and
+  the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access each single
+  coefficient of a constraint. Given an inequality constraint
+  (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+  corresponding to its complement (thus, in this case we want to obtain
+  the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+  \code
+  Constraint c1(x - 5*y + 3*z <= 4);
+  cout << "Constraint c1: " << c1 << endl;
+  if (c1.is_equality())
+    cout << "Constraint c1 is not an inequality." << endl;
+  else {
+    Linear_Expression e;
+    for (dimension_type i = c1.space_dimension(); i-- > 0; )
+      e += c1.coefficient(Variable(i)) * Variable(i);
+    e += c1.inhomogeneous_term();
+    Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+    cout << "Complement c2: " << c2 << endl;
+  }
+  \endcode
+  The actual output is the following:
+  \code
+  Constraint c1: -A + 5*B - 3*C >= -4
+  Complement c2: A - 5*B + 3*C > 4
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint : private Linear_Row {
+public:
+  //! Ordinary copy-constructor.
+  Constraint(const Constraint& c);
+
+  //! Copy-constructs from equality congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p cg is a proper congruence.
+  */
+  explicit Constraint(const Congruence& cg);
+
+  //! Destructor.
+  ~Constraint();
+
+  //! Assignment operator.
+  Constraint& operator=(const Constraint& c);
+
+  //! Returns the maximum space dimension a Constraint can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The constraint type.
+  enum Type {
+    /*! The constraint is an equality. */
+    EQUALITY,
+    /*! The constraint is a non-strict inequality. */
+    NONSTRICT_INEQUALITY,
+    /*! The constraint is a strict inequality. */
+    STRICT_INEQUALITY
+  };
+
+  //! Returns the constraint type of \p *this.
+  Type type() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an equality constraint.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an inequality constraint (either strict or non-strict).
+  */
+  bool is_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a non-strict inequality constraint.
+  */
+  bool is_nonstrict_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a strict inequality constraint.
+  */
+  bool is_strict_inequality() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  static const Constraint& zero_dim_false();
+
+  /*! \brief
+    The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+    also known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint& zero_dim_positivity();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a tautology (i.e., an always true constraint).
+
+    A tautology can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b \geq 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b > 0\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false constraint).
+
+    An inconsistent constraint can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+      where \f$b \neq 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b < 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b \leq 0\f$.
+  */
+  bool is_inconsistent() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent constraints.
+
+    Constraints having different space dimensions are not equivalent.
+    Note that constraints having different types may nonetheless be
+    equivalent, if they both are tautologies or inconsistent.
+  */
+  bool is_equivalent_to(const Constraint& y) const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Constraint& y);
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  */
+  static const Constraint* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) constraint \f$0 \leq 1\f$, also
+    known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint* zero_dim_positivity_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  */
+  static const Constraint* epsilon_geq_zero_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint* epsilon_leq_one_p;
+
+  friend class Parma_Polyhedra_Library::Congruence;
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Constraint_System;
+  friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+
+  friend
+  Parma_Polyhedra_Library
+  ::Linear_Expression::Linear_Expression(const Constraint& c);
+
+  //! Default constructor: private and not implemented.
+  Constraint();
+
+  /*! \brief
+    Builds a constraint of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+  */
+  Constraint(Linear_Expression& e, Type type, Topology topology);
+
+  //! Constructs from a congruence, with specified size and capacity.
+  Constraint(const Congruence& cg, dimension_type sz, dimension_type capacity);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* name_var,
+			       Variable v) const;
+
+  friend Constraint
+  operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator==(Variable v1, Variable v2);
+  friend Constraint
+  operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Constraint
+  operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator>=(Variable v1, Variable v2);
+  friend Constraint
+  operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Constraint
+  operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Constraint
+  operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator>(Variable v1, Variable v2);
+  friend Constraint
+  operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Constraint
+  operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Constraint
+  operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Constraint
+  operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  //! Copy-constructor with given size.
+  Constraint(const Constraint& c, dimension_type sz);
+
+  /*! \brief
+    Builds a new copy of the zero-dimension space constraint
+    \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+  */
+  static Constraint construct_epsilon_geq_zero();
+
+  //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  static const Constraint& epsilon_geq_zero();
+
+  /*! \brief
+    The zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint& epsilon_leq_one();
+
+  //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+  void set_is_equality();
+
+  //! Sets the constraint to be an inequality.
+  /*!
+    Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+    or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+    of the low-level coefficients of the constraint.
+  */
+  void set_is_inequality();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint.inlines.hh line 1
+/* Constraint class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) {
+  assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  Linear_Row::swap(e);
+  flags() = Flags(topology, (type == EQUALITY
+			     ? LINE_OR_EQUALITY
+			     : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+  : Linear_Row(c) {
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type sz)
+  : Linear_Row(c, sz, sz) {
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+  Linear_Row::operator=(c);
+  return *this;
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+  return Linear_Row::space_dimension();
+}
+
+inline bool
+Constraint::is_equality() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+  if (is_equality())
+    return EQUALITY;
+  if (is_necessarily_closed())
+    return NONSTRICT_INEQUALITY;
+  else
+    return ((*this)[size() - 1] < 0)
+      ? STRICT_INEQUALITY
+      : NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+  return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+  return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+  set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+  return Linear_Row::inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+  return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff = e1 - e2;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Variable v1, const Variable v2) {
+  Linear_Expression diff
+    = (v1.space_dimension() < v2.space_dimension()) ? v1-v2 : v2-v1;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff = e1 - e2;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Variable v1, const Variable v2) {
+  Linear_Expression diff = v1-v2;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  const dimension_type e1_dim = e1.space_dimension();
+  const dimension_type e2_dim = e2.space_dimension();
+  if (e1_dim > e2_dim)
+    diff -= Variable(e1_dim);
+  else
+    diff -= Variable(e2_dim);
+  diff += e1;
+  diff -= e2;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Variable v1, const Variable v2) {
+  Linear_Expression diff = v1-v2;
+  diff -= Variable(std::max(v1.space_dimension(), v2.space_dimension()));
+  return Constraint(diff,
+                    Constraint::STRICT_INEQUALITY,
+                    NOT_NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff = n - e;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff = n - e;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  diff -= Variable(e.space_dimension());
+  diff += n;
+  diff -= e;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff = e - n;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff = e - n;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  diff -= Variable(e.space_dimension());
+  diff += e;
+  diff -= n;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  c.set_not_necessarily_closed();
+  c.set_is_inequality();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Variable v1, const Variable v2) {
+  return v2 >= v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Variable v1, const Variable v2) {
+  return v2 > v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+  assert(zero_dim_false_p != 0);
+  return *zero_dim_false_p;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+  assert(zero_dim_positivity_p != 0);
+  return *zero_dim_positivity_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+  assert(epsilon_geq_zero_p != 0);
+  return *epsilon_geq_zero_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+  assert(epsilon_leq_one_p != 0);
+  return *epsilon_leq_one_p;
+}
+
+inline void
+Constraint::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Constraint::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+inline void
+Constraint::swap(Constraint& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+inline void
+swap(Parma_Polyhedra_Library::Constraint& x,
+     Parma_Polyhedra_Library::Constraint& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint.defs.hh line 564
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+class Smash_Reduction;
+
+template <typename D1, typename D2>
+class Constraints_Reduction;
+
+template <typename D1, typename D2>
+class No_Reduction;
+
+template <typename D1, typename D2, typename R>
+class Partially_Reduced_Product;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.defs.hh line 46
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename ITV>
+bool operator==(const Box<ITV>& x, const Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename ITV>
+bool operator!=(const Box<ITV>& x, const Box<ITV>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream& operator<<(std::ostream& s, const Box<ITV>& box);
+
+} // namespace IO_Operators
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box
+  Helper function for computing distances.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+	  typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const Box<ITV>& x, const Box<ITV>& y,
+		    Rounding_Dir dir,
+		    Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A not necessarily closed, iso-oriented hyperrectangle.
+/*! \ingroup PPL_CXX_interface
+  A Box object represents the Cartesian product of \f$n\f$
+  not necessarily closed and possibly unbounded intervals
+  represented by objects of class \p ITV,
+  where \f$n\f$ is the space dimension of the box.
+*/
+template <typename ITV>
+class Parma_Polyhedra_Library::Box {
+public:
+  //! The type of intervals used to implement the box.
+  typedef ITV interval_type;
+
+  //! Returns the maximum space dimension that a Box can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty box of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the box;
+
+    \param kind
+    Specifies whether the universe or the empty box has to be built.
+  */
+  explicit Box(dimension_type num_dimensions = 0,
+	       Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Box(const Box& y,
+      Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename Other_ITV>
+  explicit Box(const Box<Other_ITV>& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box from the system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref bounding_boxes "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+  */
+  explicit Box(const Constraint_System& cs);
+
+  //! Builds a box recycling a system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref bounding_boxes "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a box from the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Box(const Generator_System& gs);
+
+  //! Builds a box recycling the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \param gs
+    The generator system describing the polyhedron to be approximated.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  Box(const Generator_System& gs, Recycle_Input dummy);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they may have contributed to the space dimension).
+  */
+  explicit Box(const Congruence_System& cgs);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs, recycling \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they will contribute to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds a box containing the BDS \p bds.
+  /*!
+    Builds the smallest box containing \p bds using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const BD_Shape<T>& bds,
+	       Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the octagonal shape \p oct.
+  /*!
+    Builds the smallest box containing \p oct using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const Octagonal_Shape<T>& oct,
+	       Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the polyhedron \p ph.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the built box is the
+    smallest one containing \p ph.
+  */
+  explicit Box(const Polyhedron& ph,
+	       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box containing the grid \p gr.
+  /*!
+    Builds the smallest box containing \p gr using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  explicit Box(const Grid& ph,
+	       Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the partially reduced product \p dp.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+  */
+  template <typename D1, typename D2, typename R>
+  explicit Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+	       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Box& operator=(const Box& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void swap(Box& y);
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Box
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty box.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe box.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded box.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool contains(const Box&) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Box&) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Box
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Box
+  //@{
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+    FIXME: this is not true.
+
+    \param c
+    The constraint to be added. If it is not an interval constraint, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+     Use the constraints in \p cs to refine \p *this.
+     FIXME: this is not true.
+
+     \param  cs
+     The constraints to be added. Constraints that are not interval
+     constraints will be simply ignored.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+    FIXME: this is not true.
+
+    \param  cs
+    The constraints to be added. Constraints that are not interval
+    constraints will be simply ignored.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used. If it is not a non-relational
+    equality, the box is not changed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used. Congruences that are
+    not non-relational equalities are not added although their
+    space dimension is checked for compatibility.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param cgs
+    The congruences to be used. Congruences that are
+    not non-relational equalities are not added although their
+    space dimension is checked for compatibility. The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest box containing the convex union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void box_hull_assign(const Box& y);
+
+  //! Same as box_hull_assign.
+  void upper_bound_assign(const Box& y);
+
+  /*! \brief
+    If the box-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool box_hull_assign_if_exact(const Box& y);
+
+  //! Same as box_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void box_difference_assign(const Box& y);
+
+  //! Same as box_difference_assign.
+  void difference_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Box& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_widening_assign(const Box& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop-point.
+
+    \param last
+    An iterator that points one past the last stop-point.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_widening_assign(const Box& y,
+			    Iterator first, Iterator last);
+
+  //! Same as CC76_widening_assign(y, tp).
+  void widening_assign(const Box& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened box.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Box& y,
+					 const Constraint_System& cs,
+					 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A Box that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const Box& y);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old box into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    box, which is defined by a system of interval constraints in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the box and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new box, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Seeing a box as a set of tuples (its points),
+    assigns to \p *this all the tuples that can be obtained by concatenating,
+    in the order given, a tuple of \p *this with a tuple of \p y.
+
+    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the boxes
+    corresponding, on entry, to \p *this and \p y, respectively.
+    Upon successful completion, \p *this will represent the box
+    \f$R \sseq \Rset^{n+m}\f$ such that
+    \f[
+      R \defeq
+          \Bigl\{\,
+            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+          \Bigm|
+            (x_1, \ldots, x_n)^\transpose \in B,
+            (y_1, \ldots, y_m)^\transpose \in D
+          \,\Bigl\}.
+    \f]
+    Another way of seeing it is as follows: first increases the space
+    dimension of \p *this by adding \p y.space_dimension() new
+    dimensions; then adds to the system of constraints of \p *this a
+    renamed-apart version of the constraints of \p y.
+  */
+  void concatenate_assign(const Box& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  /*! \brief
+    Returns a reference the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  const ITV& get_interval(Variable var) const;
+
+  /*! \brief
+    Sets to \p i the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void set_interval(Variable var, const ITV& i);
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded below, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_lower_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded above, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_upper_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences approximating \p *this.
+  Congruence_System congruences() const;
+
+  //! Returns a minimized system of congruences approximating \p *this.
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+private:
+  template <typename Other_ITV>
+  friend class Parma_Polyhedra_Library::Box;
+
+  friend bool
+  operator==<ITV>(const Box<ITV>& x, const Box<ITV>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library
+  ::IO_Operators::operator<<<>(std::ostream& s, const Box<ITV>& box);
+
+  template <typename Specialization, typename Temp, typename To, typename I>
+  friend bool Parma_Polyhedra_Library::l_m_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Box<I>& x, const Box<I>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+  //! The type of sequence used to implement the box.
+  typedef std::vector<ITV> Sequence;
+
+  /*! \brief
+    The type of intervals used by inner computations when trying to limit
+    the cumulative effect of approximation errors.
+  */
+  typedef ITV Tmp_Interval_Type;
+
+  //! A sequence of intervals, one for each dimension of the vector space.
+  Sequence seq;
+
+#define PPL_IN_Box_CLASS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box_Status.idefs.hh line 1
+/* Box<ITV>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Box_CLASS
+#error "Do not include Box_Status.idefs.hh directly; use Box.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a Box<ITV> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>empty up-to-date</EM>: the empty flag is meaningful;
+  - <EM>empty</EM>: the box is the empty set.
+  - <EM>universe</EM>: the box is universe \f$n\f$-dimensional vector space
+     \f$\Rset^n\f$.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>empty up-to-date</EM> and <EM>empty</EM> excludes <EM>universe</EM>.
+*/
+class Status;
+
+class Status {
+public:
+  //! By default Status is the empty set of assertion.
+  Status();
+
+  //! Ordinary copy-constructor.
+  Status(const Status& y);
+
+  //! Copy-constructor from a box of different type.
+  template <typename Other_ITV>
+  Status(const typename Box<Other_ITV>::Status& y);
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_empty_up_to_date() const;
+  void reset_empty_up_to_date();
+  void set_empty_up_to_date();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_universe() const;
+  void reset_universe();
+  void set_universe();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t NONE             = 0U;
+  static const flags_t EMPTY_UP_TO_DATE = 1U << 0;
+  static const flags_t EMPTY            = 1U << 1;
+  static const flags_t UNIVERSE         = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.defs.hh line 1528
+#undef PPL_IN_Box_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the box is known to be empty.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+public:
+  //! Causes the box to become empty, i.e., to represent the empty set.
+  void set_empty();
+
+private:
+  //! Marks \p *this as definitely not empty.
+  void set_nonempty();
+
+  //! Asserts the validity of the empty flag of \p *this.
+  void set_empty_up_to_date();
+
+  //! Invalidates empty flag of \p *this.
+  void reset_empty_up_to_date();
+
+  /*! \brief
+    Checks the hard way whether \p *this is an empty box:
+    returns <CODE>true</CODE> if and only if it is so.
+  */
+  bool check_empty() const;
+
+   /*! \brief
+     Returns a reference the interval that bounds
+     the box on the <CODE>k</CODE>-th space dimension.
+   */
+  const ITV& operator[](dimension_type k) const;
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+    FIXME: this is not true.
+
+    \param c
+    The constraint to be added. If it is not an interval constraint, it
+    will be simply ignored.  If it is dimension-incompatible with \p *this,
+    the behavior is undefined.
+  */
+  void add_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+    FIXME: this is not true.
+
+    \param  cs
+    The constraints to be added. Constraints that are not interval
+    constraints will be simply ignored.  If it is
+    dimension-incompatible with \p *this, the behavior is undefined.
+  */
+  void add_constraints_no_check(const Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+    FIXME: this is not true.
+
+    \param cg
+    The congruence to be added. If it is not a non-relational equality
+    congruence, it will be ignored.  If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void add_congruence_no_check(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+    FIXME: this is not true.
+
+    \param cgs
+    The congruences to be added. Congruences that are not non-relational
+    equality congruences will be ignored.  If it is
+    dimension-incompatible with \p *this, the behavior is undefined.
+  */
+  void add_congruences_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+    FIXME: this is not true.
+
+    \param cg
+    The congruence to be added. If it is not a non-relational equality
+    congruence, it will be ignored.  If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+    FIXME: this is not true.
+
+    \param cgs
+    The congruences to be added. Congruences that are not non-relational
+    equality congruences will be ignored.  If it is
+    dimension-incompatible with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added. If it is dimension-incompatible with
+    \p *this, the behavior is undefined.
+
+    FIXME: mention the possibility of non-termination.
+
+    \if Include_Implementation_Details
+
+    For any expression \f$e\f$, we denote by
+    \f$\left\uparrow e \right\uparrow\f$ (resp., \f$\left\downarrow e
+    \right\downarrow\f$) the result of any computation that is
+    guaranteed to yield an upper (resp., lower) approximation of
+    \f$e\f$.  So there exists \f$\epsilon \in \Rset\f$ with
+    \f$\epsilon \geq 0\f$ such that
+    \f$\left\uparrow e \right\uparrow = e + \epsilon\f$.
+    If \f$\epsilon = 0\f$ we say that the computation of
+    \f$\left\uparrow e \right\uparrow\f$ is <EM>exact</EM>;
+    we say it is <EM>inexact</EM> otherwise.
+    Similarly for \f$\left\downarrow e \right\downarrow\f$.
+
+    Consider a constraint of the general form
+    \f[
+      z + \sum_{i \in I}{a_ix_i} \relsym 0,
+    \f]
+    where \f$z \in \Zset\f$, \f$I\f$ is a set of indices,
+    \f$a_i \in \Zset\f$ with \f$a_i \neq 0\f$ for each \f$i \in I\f$, and
+    \f$\mathord{\relsym} \in \{ \mathord{\geq}, \mathord{>}, \mathord{=} \}\f$.
+    The set \f$I\f$ is subdivided into the disjoint sets \f$P\f$ and \f$N\f$
+    such that, for each \f$i \in I\f$, \f$a_i > 0\f$ if \f$i \in P\f$ and
+    \f$a_i < 0\f$ if \f$i \in N\f$.
+    Suppose that, for each \f$i \in P \union N\f$ a variation interval
+    \f$\chi_i \sseq \Rset\f$ is known for \f$x_i\f$ and that the infimum
+    and the supremum of \f$\chi_i\f$ are denoted, respectively,
+    by \f$\chi_i^\mathrm{l}\f$ and \f$\chi_i^\mathrm{u}\f$, where
+    \f$\chi_i^\mathrm{l}, \chi_i^\mathrm{u} \in \Rset \union \{ -\infty, +\infty \}\f$.
+
+    For each \f$k \in P\f$, we have
+    \f[
+      x_k
+        \relsym
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_ix_i}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_ix_i}
+            \Biggr).
+    \f]
+    Thus, if \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P \setdiff \{ k \}\f$,
+    we have
+    \f[
+      x_k
+        \geq
+          \Biggl\downarrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{l}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+            \Biggr)
+          \Biggr\downarrow
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$P \setdiff \{ k \}\f$,
+    \f[
+      x_k
+        \leq
+          \Biggl\uparrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{u}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+            \Biggr)
+          \Biggl\uparrow.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+
+    For each \f$k \in N\f$, we have
+    \f[
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_ix_i}
+          - \sum_{i \in P}{a_ix_i}
+        \Biggr)
+          \relsym
+            x_k.
+    \f]
+    Thus, if
+    \f$\chi_i^\mathrm{l} \in \Rset\f$
+    for each \f$i \in N \setdiff \{ k \}\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P\f$,
+    we have
+    \f[
+      \Biggl\uparrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{u}}
+        \Biggr)
+      \Biggl\uparrow
+        \geq
+          x_k
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N \setdiff \{ k \}\f$
+    and \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in P\f$,
+    \f[
+      \Biggl\downarrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{l}}
+        \Biggr)
+      \Biggl\downarrow
+        \leq
+          x_k.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    \endif
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+    The constraints to be added. If it is dimension-incompatible with
+    \p *this, the behavior is undefined.
+
+    FIXME: mention the possibility of non-termination.
+  */
+  void refine_no_check(const Constraint_System& cs);
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p *this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+				    const Box& x) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Constraint_System& cs) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Congruence_System& cgs) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* name_row,
+				    const Linear_Expression& y) const;
+
+  static void throw_space_dimension_overflow(const char* method,
+					     const char* reason);
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+					   const Linear_Expression& e);
+
+  static void throw_generic(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns the relations holding between an interval and
+  an interval constraint.
+
+  \param i
+  The interval;
+
+  \param constraint_type
+  The constraint type;
+
+  \param num
+  The numerator of the constraint bound;
+
+  \param den
+  The denominator of the constraint bound
+
+  The interval constraint has the form
+  <CODE>den * Variable(0) relsym num</CODE>
+  where relsym is  <CODE>==</CODE>,  <CODE>></CODE> or  <CODE>>=</CODE>
+  depending on the <CODE>constraint_type</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+                  const Constraint::Type constraint_type,
+                  Coefficient_traits::const_reference num,
+                  Coefficient_traits::const_reference den = 1);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as an interval constraint.
+/*! \relates Box
+  \return
+  <CODE>true</CODE> if the constraint \p c is an
+  \ref bounding_boxes "interval constraint";
+  <CODE>false</CODE> otherwise.
+
+  \param c
+  The constraint to be decoded.
+
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
+
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0 and 1.
+
+  \param c_only_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the only variable having
+  a non-zero coefficient in \p c.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool extract_interval_constraint(const Constraint& c,
+				 dimension_type c_space_dim,
+				 dimension_type& c_num_vars,
+				 dimension_type& c_only_var);
+
+bool extract_interval_congruence(const Congruence& cg,
+				 dimension_type cg_space_dim,
+				 dimension_type& cg_num_vars,
+				 dimension_type& cg_only_var);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box_Status.inlines.hh line 1
+/* Box<ITV>::Status class implementation: inline functions.
+*/
+
+
+#include <string>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(const Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Status::Status(const typename Box<Other_ITV>::Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status()
+  : flags(NONE) {
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty_up_to_date() const {
+  return test_any(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty_up_to_date() {
+  reset(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty_up_to_date() {
+  set(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty() {
+  set(EMPTY);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_universe() const {
+  return test_any(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_universe() {
+  reset(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_universe() {
+  set(UNIVERSE);
+}
+
+template <typename ITV>
+bool
+Box<ITV>::Status::OK() const {
+  if (test_empty_up_to_date()
+      && test_empty()
+      && test_universe()) {
+#ifndef NDEBUG
+    std::cerr
+      << "The status asserts emptiness and universality at the same time."
+      << std::endl;
+#endif
+    return false;
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Boxes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string empty_up_to_date = "EUP";
+const std::string empty = "EM";
+const std::string universe = "UN";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Box::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+template <typename ITV>
+void
+Box<ITV>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Boxes;
+  s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << sep
+    << (test_empty() ? yes : no) << empty << sep
+    << (test_universe() ? yes : no) << universe << sep;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box<ITV>::Status)
+
+template <typename ITV>
+bool
+Box<ITV>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Boxes;
+  bool positive;
+
+  if (!get_field(s, Implementation::Boxes::empty_up_to_date, positive))
+    return false;
+  if (positive)
+    set_empty_up_to_date();
+
+  if (!get_field(s, Implementation::Boxes::empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, universe, positive))
+    return false;
+  if (positive)
+    set_universe();
+  else
+    reset_universe();
+
+  // Check invariants.
+  assert(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.inlines.hh line 1
+/* Box class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint_System.inlines.hh line 1
+/* Constraint_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Constraint_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System()
+  : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c)
+  : Linear_System(c.topology()) {
+  Linear_System::insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+  : Linear_System(cs) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol)
+  : Linear_System(topol) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+				     const dimension_type n_rows,
+				     const dimension_type n_columns)
+  : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+  Linear_System::operator=(y);
+  return *this;
+}
+
+inline Constraint&
+Constraint_System::operator[](const dimension_type k) {
+  return static_cast<Constraint&>(Linear_System::operator[](k));
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+  return static_cast<const Constraint&>(Linear_System::operator[](k));
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+  return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+  return Linear_System::space_dimension();
+}
+
+inline void
+Constraint_System::clear() {
+  Linear_System::clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+  assert(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
+}
+
+inline
+Constraint_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Constraint_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System::const_iterator::~const_iterator() {
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System::const_iterator::operator*() const {
+  return static_cast<const Constraint&>(*i);
+}
+
+inline const Constraint*
+Constraint_System::const_iterator::operator->() const {
+  return static_cast<const Constraint*>(i.operator->());
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Constraint_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Constraint_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Constraint_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+	       const Constraint_System& csys)
+  : i(iter), csp(&csys) {
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::begin() const {
+  const_iterator i(Linear_System::begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::end() const {
+  const const_iterator i(Linear_System::end(), *this);
+  return i;
+}
+
+inline bool
+Constraint_System::empty() const {
+  return begin() == end();
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+  if (is_necessarily_closed())
+    // The positivity constraint.
+    insert(Constraint::zero_dim_positivity());
+  else {
+    // Add the epsilon constraints.
+    insert(Constraint::epsilon_leq_one());
+    insert(Constraint::epsilon_geq_zero());
+  }
+}
+
+inline void
+Constraint_System::swap(Constraint_System& y) {
+  Linear_System::swap(y);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+  return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+  return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Constraint_System::simplify() {
+  Linear_System::simplify();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Constraint_System& x,
+     Parma_Polyhedra_Library::Constraint_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence_System.defs.hh line 1
+/* Congruence_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence_System.defs.hh line 33
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Congruence_System
+  Writes <CODE>true</CODE> if \p cgs is empty.  Otherwise, writes on
+  \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+     Parma_Polyhedra_Library::Congruence_System& y);
+
+} // namespace std
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+    When inserting congruences in a system, space dimensions are
+    automatically adjusted so that all the congruences in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of congruences corresponding to
+    an integer grid in \f$\Rset^2\f$:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert(y %= 0);
+    \endcode
+    Note that:
+    the congruence system is created with space dimension zero;
+    the first and second congruence insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding to the congruence system of the previous example,
+    the congruence \f$x + y = 1 \pmod{2}\f$:
+    \code
+  cgs.insert((x + y %= 1) / 2);
+    \endcode
+    we obtain the grid containing just those integral
+    points where the sum of the \p x and \p y values is odd.
+
+    \par Example 3
+    The following code builds a system of congruences corresponding to
+    the grid in \f$\Zset^2\f$ containing just the integral points on
+    the \p x axis:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert((y %= 0) / 0);
+    \endcode
+
+    \note
+    After inserting a multiset of congruences in a congruence system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> congruence system
+    will be available, where original congruences may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System : private Matrix {
+public:
+  //! Default constructor: builds an empty system of congruences.
+  Congruence_System();
+
+  //! Builds the singleton system containing only congruence \p cg.
+  explicit Congruence_System(const Congruence& cg);
+
+  /*! \brief
+    If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+    singleton system containing only constraint \f$ e_1 = e_2
+    \pmod{0}\f$.
+
+    \exception std::invalid_argument
+    Thrown if \p c is not an equality constraint.
+  */
+  explicit Congruence_System(const Constraint& c);
+
+  //! Builds a system containing copies of any equalities in \p cs.
+  explicit Congruence_System(const Constraint_System& cs);
+
+  //! Ordinary copy-constructor.
+  Congruence_System(const Congruence_System& cgs);
+
+  //! Destructor.
+  ~Congruence_System();
+
+  //! Assignment operator.
+  Congruence_System& operator=(const Congruence_System& cgs);
+
+  //! Returns the maximum space dimension a Congruence_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+    to \p cgs.
+  */
+  bool is_equal_to(const Congruence_System& cgs) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more linear equalities.
+  */
+  bool has_linear_equalities() const;
+
+  //! Removes all the congruences and sets the space dimension to 0.
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruence \p cg, increasing the
+    number of space dimensions if needed.
+
+    The copy of \p cg will be strongly normalized after being
+    inserted.
+  */
+  void insert(const Congruence& cg);
+
+  /*! \brief
+    Inserts in \p *this a copy of the equality constraint \p c, seen
+    as a modulo 0 congruence, increasing the number of space
+    dimensions if needed.
+
+    The modulo 0 congruence will be strongly normalized after being
+    inserted.
+
+    \exception std::invalid_argument
+    Thrown if \p c is a relational constraint.
+  */
+  void insert(const Constraint& c);
+
+  // TODO: Consider adding a recycling_insert(cg).
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruences in \p cgs,
+    increasing the number of space dimensions if needed.
+
+    The inserted copies will be strongly normalized.
+  */
+  void insert(const Congruence_System& cgs);
+
+  /*! \brief
+    Inserts into \p *this the congruences in \p cgs, increasing the
+    number of space dimensions if needed.
+  */
+  void recycling_insert(Congruence_System& cgs);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the system containing only Congruence::zero_dim_false().
+  static const Congruence_System& zero_dim_empty();
+
+  //! An iterator over a system of congruences.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each congruence contained in an object of Congruence_System.
+
+    \par Example
+    The following code prints the system of congruences
+    defining the grid <CODE>gr</CODE>:
+    \code
+  const Congruence_System& cgs = gr.congruences();
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Congruence,
+			   ptrdiff_t,
+			   const Congruence*,
+			   const Congruence&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Congruence& operator*() const;
+
+    //! Indirect member selector.
+    const Congruence* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Congruence_System;
+
+    //! The const iterator over the matrix of congruences.
+    Matrix::const_iterator i;
+
+    //! A const pointer to the matrix of congruences.
+    const Matrix* csp;
+
+    //! Constructor.
+    const_iterator(const Matrix::const_iterator& iter,
+		   const Congruence_System& cgs);
+
+    //! \p *this skips to the next non-trivial congruence.
+    void skip_forward();
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no congruences.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first congruence, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Matrix, each row in the system is a valid Congruence and the
+    number of columns is consistent with the number of congruences.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the number of equalities.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of proper congruences.
+  dimension_type num_proper_congruences() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Congruence_System& cgs);
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the unit congruence system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+    (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{A} \genfrac{}{}{0pt}{}{B}{A}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{1} \genfrac{}{}{0pt}{}{1}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_unit_rows_and_columns(dimension_type dims);
+
+protected:
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+  bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Congruence::zero_dim_false().
+  */
+  static const Congruence_System* zero_dim_empty_p;
+
+  //! Builds an empty (i.e. zero rows) system of dimension \p d.
+  explicit Congruence_System(dimension_type d);
+
+  /*! \brief
+    Concatenates copies of the congruences from \p cgs onto \p *this.
+
+    \param cgs
+    The congruence system to append to \p this.  The number of rows in
+    \p cgs must be strictly positive.
+
+    The matrix for the new system of congruences is obtained by
+    leaving the old system in the upper left-hand side and placing the
+    congruences of \p cgs in the lower right-hand side, and padding
+    with zeroes.
+  */
+  void concatenate(const Congruence_System& cgs);
+
+  //! Adjusts all expressions to have the same moduli.
+  void normalize_moduli();
+
+  //! Increase the number of space dimensions to \p new_space_dim.
+  /*!
+    \p new_space_dim must at least equal to the current space
+    dimension.
+  */
+  bool increase_space_dimension(dimension_type new_space_dim);
+
+  /*! \brief
+    Inserts in \p *this an exact copy of the congruence \p cg,
+    increasing the number of space dimensions if needed.
+
+    This method inserts a copy of \p cg in the given form, instead of
+    first strong normalizing \p cg as \ref insert would do.
+  */
+  void insert_verbatim(const Congruence& cg);
+
+  friend class const_iterator;
+  friend class Grid;
+  friend class Grid_Certificate;
+
+  friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x,
+			Parma_Polyhedra_Library::Congruence_System& y);
+
+  friend bool
+  operator==(const Congruence_System& x, const Congruence_System& y);
+
+  //! Returns the \p k- th congruence of the system.
+  Congruence& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th congruence of the system.
+  const Congruence& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if any of the dimensions in
+    \p *this is free of constraint.
+
+    Any equality or proper congruence affecting a dimension constrains
+    that dimension.
+
+    This method assumes the system is in minimal form.
+  */
+  bool has_a_free_dimension() const;
+
+  /*! \brief
+    Substitutes a given column of coefficients by a given affine
+    expression.
+
+    \param v
+    Index of the column to which the affine transformation is
+    substituted;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations) to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its default value
+    is 1.
+
+    The affine transformation substitutes the matrix of congruences
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(dimension_type v,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator);
+
+  /*! \brief
+    Removes the higher dimensions of the system so that the resulting
+    system will have dimension \p new_dimension.
+
+    The value of \p new_dimension must be at most the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_num_rows
+    The number of rows of the resized system;
+
+    \param new_num_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_num_rows,
+		      dimension_type new_num_columns);
+};
+
+// Congruence_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence_System.inlines.hh line 1
+/* Congruence_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence.defs.hh line 1
+/* Congruence class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence.defs.hh line 36
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+// Put this in the namespace here to declare it a friend later.
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+
+} // namespace IO_Operators
+
+// Put these in the namespace here to declare them friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence */
+void
+swap(Parma_Polyhedra_Library::Congruence& x,
+     Parma_Polyhedra_Library::Congruence& y);
+
+} // namespace std
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Congruence is a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+
+  \par How to build a congruence
+  Congruences \f$\pmod{1}\f$ are typically built by
+  applying the congruence symbol `<CODE>\%=</CODE>'
+  to a pair of linear expressions.
+  Congruences with modulus \p m
+  are typically constructed by building a congruence \f$\pmod{1}\f$
+  using the given pair of linear expressions
+  and then adding the modulus \p m
+  using the modulus symbol is `<CODE>/</CODE>'.
+
+  The space dimension of a congruence is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality congruence
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod1_cg(4*x %= 2*y - 13);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+  \endcode
+  An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Congruence false_cg = Congruence::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+  Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+  \endcode
+  In contrast, the following code defines an unsatisfiable congruence
+  having space dimension \f$3\f$:
+  \code
+  Congruence false_cg3((0*z %= 1) / 0);
+  \endcode
+
+  \par How to inspect a congruence
+  Several methods are provided to examine a congruence and extract
+  all the encoded information: its space dimension, its modulus
+  and the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access the modulus
+  as well as each of the coefficients.
+  Given a congruence with linear expression \p e and modulus \p m
+  (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+  congruence with the same modulus \p m but where the linear
+  expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+  \code
+  Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+  cout << "Congruence cg1: " << cg1 << endl;
+  const Coefficient& m = cg1.modulus();
+  if (m == 0)
+    cout << "Congruence cg1 is an equality." << endl;
+  else {
+    Linear_Expression e;
+    for (dimension_type i = cg1.space_dimension(); i-- > 0; )
+      e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+      e += 2 * cg1.inhomogeneous_term();
+    Congruence cg2((e %= 0) / m);
+    cout << "Congruence cg2: " << cg2 << endl;
+  }
+  \endcode
+  The actual output could be the following:
+  \code
+  Congruence cg1: A - 5*B + 3*C %= 4 / 5
+  Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence : private Row {
+public:
+  //! Ordinary copy-constructor.
+  Congruence(const Congruence& cg);
+
+  //! Copy-constructs (modulo 0) from equality constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p c is a relation.
+  */
+  explicit Congruence(const Constraint& c);
+
+  //! Destructor.
+  ~Congruence();
+
+  //! Assignment operator.
+  Congruence& operator=(const Congruence& cg);
+
+  //! Returns the maximum space dimension a Congruence can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns a const reference to the modulus of \p *this.
+  Coefficient_traits::const_reference modulus() const;
+
+  //! Multiplies \p k into the modulus of \p *this.
+  /*!
+    If called with \p *this representing the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then it returns with *this representing
+    the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence&
+  operator/=(Coefficient_traits::const_reference k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a trivially
+    true congruence.
+
+    Trivially true congruences are of one the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+    where n is the space dimension and m is the modulus.
+  */
+  bool is_trivial_true() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a trivially
+    false congruence.
+
+    Trivially false congruences have one of the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+      where \f$b \neq 0\f$; or
+    - a congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b \neq 0 \pmod{m}\f$.
+  */
+  bool is_trivial_false() const;
+
+  //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+  /*!
+    A congruence with a modulus of 0 is a linear equality.
+  */
+  bool is_proper_congruence() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is an equality.
+  /*!
+    A modulus of zero denotes a linear equality.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+			     const Congruence& cg) const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns a reference to the true (zero-dimension space) congruence
+    \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+    congruence</EM>.
+  */
+  static const Congruence& zero_dim_integrality();
+
+  /*! \brief
+    Returns a reference to the false (zero-dimension space) congruence
+    \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence& zero_dim_false();
+
+  //! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  //! Returns the congruence \f$e = n \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  //! Returns the congruence \f$n = e \pmod{1}\f$.
+  static Congruence
+  create(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+protected:
+
+  //! Normalizes the signs.
+  /*!
+    The signs of the coefficients and the inhomogeneous term are
+    normalized, leaving the first non-zero homogeneous coefficient
+    positive.
+  */
+  void sign_normalize();
+
+  //! Normalizes signs and the inhomogeneous term.
+  /*!
+    Applies sign_normalize, then reduces the inhomogeneous term to the
+    smallest possible positive number.
+  */
+  void normalize();
+
+  //! Calls normalize, then divides out common factors.
+  /*!
+    Strongly normalized Congruences have equivalent semantics if and
+    only if their syntaxes (as output by operator<<) are equal.
+  */
+  void strong_normalize();
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the false (zero-dimension space) congruence \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+    also known as the <EM>integrality congruence</EM>.
+  */
+  static const Congruence* zero_dim_integrality_p;
+
+  //! Marks this congruence as a linear equality.
+  void set_is_equality();
+
+  //! Negates the elements from index \p start to index \p end.
+  void negate(dimension_type start, dimension_type end);
+
+  //! Default constructor: private and not implemented.
+  Congruence();
+
+  //! Copy-constructs with specified size and capacity.
+  Congruence(const Congruence& cg,
+	     dimension_type sz,
+	     dimension_type capacity);
+
+  //! Constructs from a constraint, with specified size and capacity.
+  Congruence(const Constraint& c,
+	     dimension_type sz,
+	     dimension_type capacity);
+
+  //! Copy-constructs from \p cg, multiplying \p k into the modulus.
+  /*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence(const Congruence& cg, Coefficient_traits::const_reference k);
+
+  //! Constructs from Linear_Expression \p le, using modulus \p m.
+  /*!
+    Builds a congruence with modulus \p m, stealing the coefficients
+    from \p le.
+
+    \param le
+    The Linear_Expression holding the coefficients.
+
+    \param m
+    The modulus for the congruence, which must be zero or greater.
+  */
+  Congruence(Linear_Expression& le,
+	     Coefficient_traits::const_reference m);
+
+  //! Swaps \p *this with \p y.
+  void swap(Congruence& y);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* v_name,
+			       Variable v) const;
+
+  friend Congruence
+  operator/(const Congruence& cg, Coefficient_traits::const_reference k);
+  friend Congruence
+  operator/(const Constraint& c, Coefficient_traits::const_reference m);
+
+  friend bool
+  operator==(const Congruence& x, const Congruence& y);
+
+  friend bool
+  operator!=(const Congruence& x, const Congruence& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<(std::ostream& s,
+	       const Congruence_System& cgs);
+
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Congruence_System;
+  friend class Parma_Polyhedra_Library::Congruence_System::const_iterator;
+  // FIXME: The following friend declaration is at least for
+  //        operator[] access in Grid::conversion.
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::Linear_Expression;
+
+  friend void
+  std::swap(Parma_Polyhedra_Library::Congruence& x,
+	    Parma_Polyhedra_Library::Congruence& y);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence.inlines.hh line 1
+/* Congruence class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence.inlines.hh line 28
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(const Congruence& cg)
+  : Row(cg) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+		       dimension_type sz, dimension_type capacity)
+  : Row(cg, sz, capacity) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+		       Coefficient_traits::const_reference k)
+  : Row(cg) {
+  if (k >= 0)
+    (*this)[size()-1] *= k;
+  else
+    (*this)[size()-1] *= -k;
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+		       Coefficient_traits::const_reference m) {
+  Row::swap(static_cast<Row&>(le));
+  assert(m >= 0);
+  (*this)[size()-1] = m;
+}
+
+inline Congruence
+Congruence::create(const Linear_Expression& e,
+		   Coefficient_traits::const_reference n) {
+  // Ensure that diff has capacity for the modulus.
+  Linear_Expression diff(e, e.space_dimension() + 2);
+  diff -= n;
+  Congruence cg(diff, 1);
+  return cg;
+}
+
+inline Congruence
+Congruence::create(Coefficient_traits::const_reference n,
+		   const Linear_Expression& e) {
+  // Ensure that diff has capacity for the modulus.
+  Linear_Expression diff(e, e.space_dimension() + 2);
+  diff -= n;
+  Congruence cg(diff, 1);
+  return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return Congruence::create(e1, e2);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return Congruence::create(e, n);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k) {
+  Congruence ret(cg, k);
+  return ret;
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+  return *zero_dim_integrality_p;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+  return *zero_dim_false_p;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& c) {
+  Row::operator=(c);
+  return *this;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m) {
+  Congruence ret(c);
+  return ret / m;
+}
+
+inline Congruence&
+Congruence::operator/=(Coefficient_traits::const_reference k) {
+  if (k >= 0)
+    (*this)[size()-1] *= k;
+  else
+    (*this)[size()-1] *= -k;
+  return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+  Congruence x_temp(x);
+  Congruence y_temp(y);
+  x_temp.strong_normalize();
+  y_temp.strong_normalize();
+  return static_cast<const Row&>(x_temp) == static_cast<const Row&>(y_temp);
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+  return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+  // The first coefficient holds the inhomogeneous term, while
+  // the last coefficient is for the modulus.
+  return max_size() - 2;
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+  return size() - 2;
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return (*this)[v.id()+1];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+  return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+  assert(size() > 1);
+  return (*this)[size()-1];
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+  return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+  return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(dimension_type dim,
+				  const Congruence& cg) const {
+  return operator[](dim) * cg.modulus() == cg[dim] * modulus();
+}
+
+inline void
+Congruence::set_is_equality() {
+  (*this)[size()-1] = 0;
+}
+
+inline void
+Congruence::negate(dimension_type start, dimension_type end) {
+  while (start <= end)
+    neg_assign(operator[](start++));
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+  return Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+  return Row::total_memory_in_bytes();
+}
+
+inline void
+Congruence::swap(Congruence& y) {
+  Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline void
+swap(Parma_Polyhedra_Library::Congruence& x,
+     Parma_Polyhedra_Library::Congruence& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence.defs.hh line 480
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Congruence_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline Congruence&
+Congruence_System::operator[](const dimension_type k) {
+  return static_cast<Congruence&>(Matrix::operator[](k));
+}
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+  return static_cast<const Congruence&>(Matrix::operator[](k));
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+  insert_verbatim(cg);
+  static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
+  assert(OK());
+}
+
+inline
+Congruence_System::Congruence_System()
+  : Matrix(0, 2) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg)
+  : Matrix(0, 2) {
+  insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c)
+  : Matrix(0, 2) {
+  insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cs)
+  : Matrix(cs) {
+}
+
+inline
+Congruence_System::Congruence_System(const dimension_type d)
+  : Matrix(0, d + 2) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+  Matrix::operator=(y);
+  return *this;
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+  return Matrix::max_num_columns() - 2;
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+  return Matrix::num_columns() - 2;
+}
+
+inline void
+Congruence_System::clear() {
+  Matrix::clear();
+  add_zero_columns(2);		// Modulus and constant term.
+}
+
+inline void
+Congruence_System::resize_no_copy(const dimension_type new_num_rows,
+				  const dimension_type new_num_columns) {
+  Matrix::resize_no_copy(new_num_rows, new_num_columns, Row::Flags());
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+  assert(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+  return static_cast<const Congruence&>(*i);
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+  return static_cast<const Congruence*>(i.operator->());
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Matrix::const_iterator& iter,
+	       const Congruence_System& csys)
+  : i(iter), csp(&csys) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+  const_iterator i(Matrix::begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+  const const_iterator i(Matrix::end(), *this);
+  return i;
+}
+
+inline bool
+Congruence_System::empty() const {
+  return begin() == end();
+}
+
+inline void
+Congruence_System::swap(Congruence_System& y) {
+  Matrix::swap(y);
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+  return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+  return Matrix::total_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+inline void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+     Parma_Polyhedra_Library::Congruence_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.inlines.hh line 32
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline bool
+Box<ITV>::marked_empty() const {
+  return status.test_empty_up_to_date() && status.test_empty();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty() {
+  status.set_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_nonempty() {
+  status.reset_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty_up_to_date() {
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::reset_empty_up_to_date() {
+  return status.reset_empty_up_to_date();
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Box& y, Complexity_Class)
+  : seq(y.seq), status(y.status) {
+}
+
+template <typename ITV>
+inline Box<ITV>&
+Box<ITV>::operator=(const Box& y) {
+  seq = y.seq;
+  status = y.status;
+  return *this;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::swap(Box& y) {
+  Box& x = *this;
+  std::swap(x.seq, y.seq);
+  std::swap(x.status, y.status);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cs);
+  this->swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Generator_System& gs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(gs);
+  this->swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cgs);
+  this->swap(tmp);
+}
+
+template <typename ITV>
+inline memory_size_type
+Box<ITV>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::space_dimension() const {
+  return seq.size();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return Sequence().max_size() - 1;
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::operator[](const dimension_type k) const {
+  assert(k < seq.size());
+  return seq[k];
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::get_interval(const Variable var) const {
+  if (space_dimension() < var.space_dimension())
+    throw_dimension_incompatible("get_interval(v)", "v", var);
+
+  if (is_empty()) {
+    static ITV empty_interval(EMPTY);
+    return empty_interval;
+  }
+
+  return seq[var.id()];
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_interval(const Variable var, const ITV& i) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < var.space_dimension())
+    throw_dimension_incompatible("set_interval(v, i)", "v", var);
+
+  if (is_empty() && space_dim >= 2)
+    // If the box is empty, and has dimension >= 2, setting only one
+    // interval will not make it non-empty.
+    return;
+
+  seq[var.id()] = i;
+  reset_empty_up_to_date();
+
+  assert(OK());
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::is_empty() const {
+  return marked_empty() || check_empty();
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+			Coefficient& sup_n, Coefficient& sup_d,
+			bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+			Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+			Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+			Coefficient& inf_n, Coefficient& inf_d,
+			bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+			Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+			Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::strictly_contains(const Box& y) const {
+  const Box& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::upper_bound_assign(const Box& y) {
+  Box& x = *this;
+  x.box_hull_assign(y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::box_hull_assign_if_exact(const Box&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::upper_bound_assign_if_exact(const Box& y) {
+  Box& x = *this;
+  return x.box_hull_assign_if_exact(y);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::expand_space_dimension(const Variable var,
+				      const dimension_type m) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting Box should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_generic("expand_dimension(v, m)",
+		  "adding m new space dimensions exceeds "
+		  "the maximum allowed space dimension");
+
+  // To expand the space dimension corresponding to variable `var',
+  // we append to the box `m' copies of the corresponding interval.
+  seq.insert(seq.end(), m, seq[var.id()]);
+  assert(OK());
+}
+
+template <typename ITV>
+inline bool
+operator!=(const Box<ITV>& x, const Box<ITV>& y) {
+  return !(x == y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::get_lower_bound(const dimension_type k, bool& closed,
+			       Coefficient& n, Coefficient& d) const {
+  assert(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.lower_is_unbounded())
+    return false;
+
+  closed = !seq_k.lower_is_open();
+
+  DIRTY_TEMP0(mpq_class, lr);
+  assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED);
+  n = lr.get_num();
+  d = lr.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::get_upper_bound(const dimension_type k, bool& closed,
+			       Coefficient& n, Coefficient& d) const {
+  assert(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.upper_is_unbounded())
+    return false;
+
+  closed = !seq_k.upper_is_open();
+
+  DIRTY_TEMP0(mpq_class, ur);
+  assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED);
+  n = ur.get_num();
+  d = ur.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::difference_assign(const Box& y) {
+  Box& x = *this;
+  x.box_difference_assign(y);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  add_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", cs);
+
+  add_constraints_no_check(cs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  add_congruence_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruences(const Congruence_System& cgs) {
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", cgs);
+  add_congruences_no_check(cgs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Box<T>::widening_assign(const Box& y, unsigned* tp) {
+  CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+inline Congruence_System
+Box<ITV>::minimized_congruences() const {
+  // Only equalities can be congruences and these are already minimized.
+  return congruences();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_constraints(cs)", cs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_congruences(cgs)", cgs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cgs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::unconstrain(const Variable var) {
+  const dimension_type dim = var.id();
+  // Dimension-compatibility check.
+  if (dim > space_dimension())
+    throw_dimension_incompatible("unconstrain(var)", dim);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for `var' before cylindrification.
+  ITV& seq_var = seq[dim];
+  if (seq_var.is_empty())
+    set_empty();
+  else
+    seq_var.assign(UNIVERSE);
+  assert(OK());
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Box<ITV>& x,
+			    const Box<ITV>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Box<ITV>& x,
+			  const Box<ITV>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Box<ITV>& x,
+			   const Box<ITV>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.templates.hh line 1
+/* Box class implementation: non-inline template functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variables_Set.defs.hh line 1
+/* Variables_Set class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variables_Set.defs.hh line 29
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+operator<<(std::ostream& s, const Variables_Set& v);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! An std::set of variables' indexes.
+class Parma_Polyhedra_Library::Variables_Set
+  : public std::set<dimension_type> {
+private:
+  typedef std::set<dimension_type> Base;
+
+public:
+  //! Builds the empty set of variable indexes.
+  Variables_Set();
+
+  //! Builds the singleton set of indexes containing <CODE>v.id()</CODE>;
+  explicit Variables_Set(const Variable& v);
+
+  /*! \brief
+    Builds the set of variables's indexes in the range from
+    <CODE>v.id()</CODE> to <CODE>w.id()</CODE>.
+
+    If <CODE>v.id() <= w.id()</CODE>, this constructor builds the
+    set of variables' indexes
+    <CODE>v.id()</CODE>, <CODE>v.id()+1</CODE>, ..., <CODE>w.id()</CODE>.
+    The empty set it built otherwise.
+  */
+  Variables_Set(const Variable& v, const Variable& w);
+
+  //! Returns the maximum space dimension a Variables_Set can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns the dimension of the smallest vector space enclosing all
+    the variables whose indexes are in the set.
+  */
+  dimension_type space_dimension() const;
+
+  //! Inserts the index of variavle \p v into the set.
+  void insert(Variable v);
+  // The `insert' method above overloads (instead of hiding) the
+  // other `insert' method of std::set.
+  using Base::insert;
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variables_Set.inlines.hh line 1
+/* Variables_Set class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variables_Set.inlines.hh line 27
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Variables_Set::Variables_Set()
+  : Base() {
+}
+
+inline void
+Variables_Set::insert(const Variable v) {
+  insert(v.id());
+}
+
+inline
+Variables_Set::Variables_Set(const Variable& v)
+  : Base() {
+  insert(v);
+}
+
+inline dimension_type
+Variables_Set::max_space_dimension() {
+  return Variable::max_space_dimension();
+}
+
+inline dimension_type
+Variables_Set::space_dimension() const {
+  reverse_iterator i = rbegin();
+  return i == rend() ? 0 : *i+1;
+}
+
+inline memory_size_type
+Variables_Set::external_memory_in_bytes() const {
+  // We assume sets are implemented by means of red-black trees that
+  // require to store the color (we assume an enum) and three pointers
+  // to the parent, left and right child, respectively.
+  enum color { red, black };
+  return size() * (sizeof(color) + 3*sizeof(void*) + sizeof(dimension_type));
+}
+
+inline memory_size_type
+Variables_Set::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Variables_Set.defs.hh line 107
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator_System.defs.hh line 1
+/* Generator_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Con_Relation.defs.hh line 1
+/* Poly_Con_Relation class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Con_Relation.defs.hh line 28
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+			     const Poly_Con_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+			    const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+  //! Poly_Con_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING             = 0U;
+  static const flags_t IS_DISJOINT         = 1U << 0;
+  static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+  static const flags_t IS_INCLUDED         = 1U << 2;
+  static const flags_t SATURATES           = 1U << 3;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = IS_DISJOINT
+  | STRICTLY_INTERSECTS
+  | IS_INCLUDED
+  | SATURATES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Con_Relation(flags_t mask);
+
+  friend bool
+  operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+  friend bool
+  operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some foreign
+    language interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Con_Relation nothing();
+
+  /*! \brief
+    The polyhedron and the set of points satisfying
+    the constraint are disjoint.
+  */
+  static Poly_Con_Relation is_disjoint();
+
+  /*! \brief
+    The polyhedron intersects the set of points satisfying
+    the constraint, but it is not included in it.
+  */
+  static Poly_Con_Relation strictly_intersects();
+
+  /*! \brief
+    The polyhedron is included in the set of points satisfying
+    the constraint.
+  */
+  static Poly_Con_Relation is_included();
+
+  /*! \brief
+    The polyhedron is included in the set of points saturating
+    the constraint.
+  */
+  static Poly_Con_Relation saturates();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Con_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Con_Relation.inlines.hh line 1
+/* Poly_Con_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+  return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+  return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+  return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+  return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+  return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Con_Relation.defs.hh line 164
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator_System.defs.hh line 35
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+void swap(Parma_Polyhedra_Library::Generator_System& x,
+	  Parma_Polyhedra_Library::Generator_System& y);
+
+} // namespace std
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+    When inserting generators in a system, space dimensions are automatically
+    adjusted so that all the generators in the system are defined
+    on the same vector space.
+    A system of generators which is meant to define a non-empty
+    polyhedron must include at least one point: the reason is that
+    lines, rays and closure points need a supporting point
+    (lines and rays only specify directions while closure points only
+    specify points in the topological closure of the NNC polyhedron).
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty polyhedron, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a ray having the same direction as
+    the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(ray(x + 0*y));
+    \endcode
+    To define a system of generators indeed corresponding to the set
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \geq 0
+      \,\bigr\},
+    \f]
+    one just has to add the origin:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having four points
+    and corresponding to a square in \f$\Rset^2\f$
+    (the same as Example 1 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+    \endcode
+
+    \par Example 4
+    By using closure points, we can define the \e kernel
+    (i.e., the largest open set included in a given set)
+    of the square defined in the previous example.
+    Note that a supporting point is needed and, for that purpose,
+    any inner point could be considered.
+    \code
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(closure_point(0*x + 0*y));
+  gs.insert(closure_point(0*x + 3*y));
+  gs.insert(closure_point(3*x + 0*y));
+  gs.insert(closure_point(3*x + 3*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having two points
+    and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+    (the same as Example 2 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 1*y));
+  gs.insert(ray(x - y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System : protected Linear_System {
+public:
+  //! Default constructor: builds an empty system of generators.
+  Generator_System();
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Generator_System(const Generator& g);
+
+  //! Ordinary copy-constructor.
+  Generator_System(const Generator_System& gs);
+
+  //! Destructor.
+  ~Generator_System();
+
+  //! Assignment operator.
+  Generator_System& operator=(const Generator_System& y);
+
+  //! Returns the maximum space dimension a Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Generator& g);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System& zero_dim_univ();
+
+  //! An iterator over a system of generators
+  /*! \ingroup PPL_CXX_interface
+      A const_iterator is used to provide read-only access
+      to each generator contained in an object of Generator_System.
+
+      \par Example
+      The following code prints the system of generators
+      of the polyhedron <CODE>ph</CODE>:
+      \code
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    cout << *i << endl;
+      \endcode
+      The same effect can be obtained more concisely by using
+      more features of the STL:
+      \code
+  const Generator_System& gs = ph.generators();
+  copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+      \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Generator,
+			   ptrdiff_t,
+			   const Generator*,
+			   const Generator&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Generator_System;
+
+    //! The const iterator over the Linear_System.
+    Linear_System::const_iterator i;
+
+    //! A const pointer to the Linear_System.
+    const Linear_System* gsp;
+
+    //! Constructor.
+    const_iterator(const Linear_System::const_iterator& iter,
+		   const Generator_System& gsys);
+
+    /*! \brief
+      \p *this skips to the next generator, skipping those
+      closure points that are immediately followed by a matching point.
+    */
+    void skip_forward();
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Generator.
+  */
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Generator_System& y);
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System* zero_dim_univ_p;
+
+  friend class const_iterator;
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+  //! Builds an empty system of generators having the specified topology.
+  explicit Generator_System(Topology topol);
+
+  /*! \brief
+    Builds a system of \p n_rows rays/points on a \p n_columns - 1
+    dimensional space (including the \f$\epsilon\f$ dimension, if
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+  */
+  Generator_System(Topology topol,
+		   dimension_type n_rows, dimension_type n_columns);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the topology and
+    the number of space dimensions given as parameters
+    (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains closure points.
+  */
+  bool adjust_topology_and_space_dimension(Topology topol,
+					   dimension_type num_dimensions);
+
+  /*! \brief
+    For each unmatched closure point in \p *this, adds the
+    corresponding point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more points.
+  */
+  bool has_points() const;
+
+  /*! \brief
+    For each unmatched point in \p *this, adds the corresponding
+    closure point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_closure_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more closure points.
+
+    Note: the check for the presence of closure points is
+    done under the point of view of the user. Namely, we scan
+    the generator system using high-level iterators, so that
+    closure points that are matching the corresponding points
+    will be disregarded.
+  */
+  bool has_closure_points() const;
+
+  //! Returns the \p k- th generator of the system.
+  Generator& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Generator& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns the relations holding between the generator system
+    and the constraint \p c.
+  */
+  Parma_Polyhedra_Library::Poly_Con_Relation
+  relation_with(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  bool satisfied_by_all_generators(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+  */
+  bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+  */
+  bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations (see the Introduction) having
+    any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p denominator
+    that will be used as denominator of the affine transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation assigns to each element of \p v -th
+    column the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(dimension_type v,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of lines of the system.
+  dimension_type num_lines() const;
+
+  //! Returns the number of rays of the system.
+  dimension_type num_rays() const;
+
+  //! Removes all the invalid lines and rays.
+  /*!
+    The invalid lines and rays are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_rays();
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as
+    to provide a partial simplification of the system of generators.
+
+    It is assumed that the system has no pending generators.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(const Generator& g);
+};
+
+// Generator_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator_System.inlines.hh line 1
+/* Generator_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator.defs.hh line 1
+/* Generator class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator.defs.hh line 39
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator */
+void swap(Parma_Polyhedra_Library::Generator& x,
+	  Parma_Polyhedra_Library::Generator& y);
+
+} // namespace std
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a closure point
+    \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+  \par A note on terminology.
+  As observed in Section \ref representation, there are cases when,
+  in order to represent a polyhedron \f$\cP\f$ using the generator system
+  \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+  \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+  of \f$\cP\f$.
+  This situation is even more frequent when working with NNC polyhedra
+  and it is the reason why we prefer to use the word `point'
+  where other libraries use the word `vertex'.
+
+  \par How to build a generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+  or <CODE>closure_point</CODE>) to a linear expression,
+  representing a direction in the space;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and closure points, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Generator l = line(x - y - z);
+  \endcode
+  As mentioned above, the constant term of the linear expression
+  is not relevant. Thus, the following code has the same effect:
+  \code
+  Generator l = line(x - y - z + 15);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Generator l = line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds a ray with the same direction as the
+  line in Example 1:
+  \code
+  Generator r = ray(x - y - z);
+  \endcode
+  As is the case for lines, when specifying a ray the constant term
+  of the linear expression is not relevant; also, an exception is thrown
+  when trying to build a ray from the origin of the space.
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Generator p = point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Generator p = point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Generator origin3 = point(0*x + 0*y + 0*z);
+  Generator origin3_alt = point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Generator origin2 = point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Generator origin0 = Generator::zero_dim_point();
+  Generator origin0_alt = point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>point</CODE> (the divisor):
+  \code
+  Generator p = point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be usefully exploited to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Generator q = point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Closure points are specified in the same way we defined points,
+  but invoking their specific constructor function.
+  For instance, the closure point
+  \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+  \code
+  Generator c = closure_point(1*x + 0*y + 2*z);
+  \endcode
+  For the particular case of the (only) closure point
+  having space dimension zero, we can use any of the following:
+  \code
+  Generator closure_origin0 = Generator::zero_dim_closure_point();
+  Generator closure_origin0_alt = closure_point();
+  \endcode
+
+  \par How to inspect a generator
+  Several methods are provided to examine a generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the closure point <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Generator g2 = closure_point(e, g1.divisor());
+    cout << "Closure point g2: " << g2 << endl;
+  }
+  else
+    cout << "Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Generator g1 = point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Closure point g2: cp((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with (closure) points, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator : private Linear_Row {
+public:
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator line(const Linear_Expression& e);
+
+  //! Returns the ray of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator ray(const Linear_Expression& e);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator point(const Linear_Expression& e
+			 = Linear_Expression::zero(),
+			 Coefficient_traits::const_reference d
+			 = Coefficient_one());
+
+  //! Returns the closure point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator
+  closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+		Coefficient_traits::const_reference d = Coefficient_one());
+
+  //! Ordinary copy-constructor.
+  Generator(const Generator& g);
+
+  //! Destructor.
+  ~Generator();
+
+  //! Assignment operator.
+  Generator& operator=(const Generator& g);
+
+  //! Returns the maximum space dimension a Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a ray. */
+    RAY,
+    /*! The generator is a point. */
+    POINT,
+    /*! The generator is a closure point. */
+    CLOSURE_POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+  bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_line_or_ray() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+  bool is_closure_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! If \p *this is either a point or a closure point, returns its divisor.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is neither a point nor a closure point.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Generator& zero_dim_point();
+
+  /*! \brief
+    Returns, as a closure point,
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator& zero_dim_closure_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Generator& y) const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Generator& y);
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator* zero_dim_point_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$, as a closure point.
+  */
+  static const Generator* zero_dim_closure_point_p;
+
+  /*! \brief
+    Builds a generator of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+  */
+  Generator(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* name_var,
+			       Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+  friend class Parma_Polyhedra_Library::Generator_System;
+  friend class Parma_Polyhedra_Library::Generator_System::const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid_Generator;
+  // This is for access to Row and Linear_Row in `insert'.
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  friend
+  Parma_Polyhedra_Library
+  ::Linear_Expression::Linear_Expression(const Generator& g);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Generator& g);
+
+  //! Copy-constructor with given space dimension.
+  Generator(const Generator& g, dimension_type dimension);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+  bool is_ray_or_point() const;
+
+  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_ray_or_point();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the closure point
+    \p *this has the same \e coordinates of the point \p p.
+
+    It is \e assumed that \p *this is a closure point, \p p is a point
+    and both topologies and space dimensions agree.
+  */
+  bool is_matching_closure_point(const Generator& p) const;
+
+  //! Default constructor: private and not implemented.
+  Generator();
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator Generator::line(const Linear_Expression& e).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e);
+
+//! Shorthand for Generator Generator::ray(const Linear_Expression& e).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e);
+
+/*! \brief
+  Shorthand for Generator
+  Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+      Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+  Shorthand for Generator
+  Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+	      Coefficient_traits::const_reference d = Coefficient_one());
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator.inlines.hh line 1
+/* Generator class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology) {
+  assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+  Linear_Row::swap(e);
+  flags() = Flags(topology, (type == LINE
+			     ? LINE_OR_EQUALITY
+			     : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Generator::Generator(const Generator& g)
+  : Linear_Row(g) {
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type dimension)
+  : Linear_Row(g, dimension, dimension) {
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+  Linear_Row::operator=(g);
+  return *this;
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+  return Linear_Row::space_dimension();
+}
+
+inline bool
+Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+  return (*this)[0] == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+  return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+  if (is_line())
+    return LINE;
+  if (is_line_or_ray())
+    return RAY;
+  if (is_necessarily_closed())
+    return POINT;
+  else {
+    // Checking the value of the epsilon coefficient.
+    const Generator& g = *this;
+    return (g[size() - 1] == 0) ? CLOSURE_POINT : POINT;
+  }
+}
+
+inline bool
+Generator::is_point() const {
+  return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+  return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+  Coefficient_traits::const_reference d = Linear_Row::inhomogeneous_term();
+  if (!is_ray_or_point() || d == 0)
+    throw_invalid_argument("divisor()",
+			   "*this is neither a point nor a closure point");
+  return d;
+}
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+  assert(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+  assert(zero_dim_closure_point_p != 0);
+  return *zero_dim_closure_point_p;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e) {
+  return Generator::line(e);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e) {
+  return Generator::ray(e);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d) {
+  return Generator::point(e, d);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+	      Coefficient_traits::const_reference d) {
+  return Generator::closure_point(e, d);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+  return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+inline void
+Generator::swap(Generator& y) {
+  Linear_Row::swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Generator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const Generator& x,
+		    const Generator& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  // Generator kind compatibility check: we only compute distances
+  // between (closure) points.
+  if (x.is_line_or_ray() || y.is_line_or_ray())
+    return false;
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // All zero-dim generators have distance zero.
+  if (x_space_dim == 0) {
+    assign_r(r, 0, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  DIRTY_TEMP0(mpq_class, x_coord);
+  DIRTY_TEMP0(mpq_class, y_coord);
+  DIRTY_TEMP0(mpq_class, x_div);
+  DIRTY_TEMP0(mpq_class, y_div);
+  assign_r(x_div, x.divisor(), ROUND_NOT_NEEDED);
+  assign_r(y_div, y.divisor(), ROUND_NOT_NEEDED);
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    assign_r(x_coord, x.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(x_coord, x_coord, x_div, ROUND_NOT_NEEDED);
+    assign_r(y_coord, y.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(y_coord, y_coord, y_div, ROUND_NOT_NEEDED);
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+
+    if (x_coord > y_coord) {
+      maybe_assign(tmp1p, tmp1, x_coord, dir);
+      maybe_assign(tmp2p, tmp2, y_coord, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_coord, dir);
+      maybe_assign(tmp2p, tmp2, x_coord, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    assert(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Generator& x,
+			    const Generator& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Generator& x,
+			    const Generator& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Generator& x,
+			    const Generator& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Generator& x,
+			  const Generator& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Generator& x,
+			  const Generator& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Generator& x,
+			  const Generator& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Generator& x,
+			   const Generator& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Generator& x,
+			   const Generator& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Generator& x,
+			   const Generator& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To>(r, x, y, dir);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+inline void
+swap(Parma_Polyhedra_Library::Generator& x,
+     Parma_Polyhedra_Library::Generator& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator.defs.hh line 724
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Generator_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System()
+  : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g)
+  : Linear_System(g.topology()) {
+  Linear_System::insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+  : Linear_System(gs) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol)
+  : Linear_System(topol) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+				   const dimension_type n_rows,
+				   const dimension_type n_columns)
+  : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+  Linear_System::operator=(y);
+  return *this;
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+  return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+  return Linear_System::space_dimension();
+}
+
+inline void
+Generator_System::clear() {
+  Linear_System::clear();
+}
+
+inline Generator&
+Generator_System::operator[](const dimension_type k) {
+  return static_cast<Generator&>(Linear_System::operator[](k));
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+  return static_cast<const Generator&>(Linear_System::operator[](k));
+}
+
+inline
+Generator_System::const_iterator::const_iterator()
+  : i(), gsp(0) {
+}
+
+inline
+Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Generator_System::const_iterator&
+Generator_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  gsp = y.gsp;
+  return *this;
+}
+
+inline const Generator&
+Generator_System::const_iterator::operator*() const {
+  return static_cast<const Generator&>(*i);
+}
+
+inline const Generator*
+Generator_System::const_iterator::operator->() const {
+  return static_cast<const Generator*>(i.operator->());
+}
+
+inline Generator_System::const_iterator&
+Generator_System::const_iterator::operator++() {
+  ++i;
+  if (!gsp->is_necessarily_closed())
+    skip_forward();
+  return *this;
+}
+
+inline Generator_System::const_iterator
+Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Generator_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Generator_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Generator_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+	       const Generator_System& gsys)
+  : i(iter), gsp(&gsys) {
+}
+
+inline bool
+Generator_System::empty() const {
+  return Linear_System::has_no_rows();
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+  const_iterator i(Linear_System::begin(), *this);
+  if (!is_necessarily_closed())
+    i.skip_forward();
+  return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+  const const_iterator i(Linear_System::end(), *this);
+  return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+  assert(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
+}
+
+inline void
+Generator_System::swap(Generator_System& y) {
+  Linear_System::swap(y);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+  return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+  return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Generator_System::simplify() {
+  Linear_System::simplify();
+  remove_invalid_lines_and_rays();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Generator_System& x,
+     Parma_Polyhedra_Library::Generator_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Gen_Relation.defs.hh line 1
+/* Poly_Gen_Relation class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Gen_Relation.defs.hh line 28
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+			     const Poly_Gen_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+			    const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+  //! Poly_Gen_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING  = 0U;
+  static const flags_t SUBSUMES = 1U << 0;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = SUBSUMES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Gen_Relation(flags_t mask);
+
+  friend bool
+  operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+  friend bool
+  operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some foreign
+    language interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Gen_Relation nothing();
+
+  //! Adding the generator would not change the polyhedron.
+  static Poly_Gen_Relation subsumes();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Gen_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Gen_Relation.inlines.hh line 1
+/* Poly_Gen_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+  return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+  return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Poly_Gen_Relation.defs.hh line 137
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.defs.hh line 1
+/* Polyhedron class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator_System.defs.hh line 1
+/* Grid_Generator_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator_System.defs.hh line 30
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid_Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+		const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+	  Parma_Polyhedra_Library::Grid_Generator_System& y);
+
+} // namespace std
+
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Grid_Generator_System is a system of
+    grid generators, i.e., a multiset of objects of the class
+    Grid_Generator (lines, parameters and points).
+    When inserting generators in a system, space dimensions are
+    automatically adjusted so that all the generators in the system
+    are defined on the same vector space.
+    A system of grid generators which is meant to define a non-empty
+    grid must include at least one point: the reason is that
+    lines and parameters need a supporting point
+    (lines only specify directions while parameters only
+    specify direction and distance.
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty grid, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(grid_point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(grid_point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a system of generators corresponding
+    to the grid consisting of all the integral points on the \f$x\f$ axes;
+    that is, all points satisfying the congruence relation
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \pmod{1}\ 0
+      \,\bigr\},
+    \f]
+    \code
+  Grid_Generator_System gs;
+  gs.insert(parameter(x + 0*y));
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having three points
+    corresponding to a non-relational grid consisting of all points
+    whose coordinates are integer multiple of 3.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 3*y));
+  gs.insert(grid_point(3*x + 0*y));
+    \endcode
+
+    \par Example 4
+    By using parameters instead of two of the points we
+    can define the same grid as that defined in the previous example.
+    Note that there has to be at least one point and, for this purpose,
+    any point in the grid could be considered.
+    Thus the following code builds two identical grids from the
+    grid generator systems \p gs and \p gs1.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(0*x + 3*y));
+  gs.insert(parameter(3*x + 0*y));
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(3*x + 3*y));
+  gs1.insert(parameter(0*x + 3*y));
+  gs1.insert(parameter(3*x + 0*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having one point and
+    a parameter corresponding to all the integral points that
+    lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(1*x + 1*y));
+  gs.insert(parameter(1*x - 1*y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a grid generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> grid generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System
+  : private Generator_System {
+public:
+  //! Default constructor: builds an empty system of generators.
+  Grid_Generator_System();
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Grid_Generator_System(const Grid_Generator& g);
+
+  //! Builds an empty system of generators of dimension \p dim.
+  explicit Grid_Generator_System(dimension_type dim);
+
+  //! Ordinary copy-constructor.
+  Grid_Generator_System(const Grid_Generator_System& gs);
+
+  //! Destructor.
+  ~Grid_Generator_System();
+
+  //! Assignment operator.
+  Grid_Generator_System& operator=(const Grid_Generator_System& y);
+
+  //! Returns the maximum space dimension a Grid_Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system and sets its
+    space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts into \p *this a copy of the generator \p g, increasing the
+    number of space dimensions if needed.
+
+    If \p g is an all-zero parameter then the only action is to ensure
+    that the space dimension of \p *this is at least the space
+    dimension of \p g.
+  */
+  void insert(const Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generator \p g, increasing the number of
+    space dimensions if needed.
+  */
+  void recycling_insert(Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generators in \p gs, increasing the
+    number of space dimensions if needed.
+  */
+  void recycling_insert(Grid_Generator_System& gs);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only
+    Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System& zero_dim_univ();
+
+  //! An iterator over a system of grid generators
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Grid_Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the grid <CODE>gr</CODE>:
+    \code
+  const Grid_Generator_System& gs = gr.generators();
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+        gs_end = gs.end(); i != gs_end; ++i)
+    cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+  const Generator_System& gs = gr.generators();
+  copy(gs.begin(), gs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Grid_Generator,
+			   ptrdiff_t,
+			   const Grid_Generator*,
+			   const Grid_Generator&>,
+      private Generator_System::const_iterator {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Grid_Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Grid_Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Grid_Generator_System;
+
+    //! Copy-constructor from Generator_System::const_iterator.
+    const_iterator(const Generator_System::const_iterator& y);
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Returns the number of rows (generators) in the system.
+  dimension_type num_rows() const;
+
+  //! Returns the number of parameters in the system.
+  dimension_type num_parameters() const;
+
+  //! Returns the number of lines in the system.
+  dimension_type num_lines() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more points.
+  */
+  bool has_points() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  bool is_equal_to(const Grid_Generator_System& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Grid_Generator.
+  */
+  bool OK() const;
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = from;
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(-from);
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = from;
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+  PPL_OUTPUT_DECLARATIONS
 
-template <typename Policy, typename From, typename To>
-inline Result
-assign_float_float(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(From) > sizeof(To))
-    return assign_float_float_inexact<Policy>(to, from, dir);
-  else
-    return assign_float_float_exact<Policy>(to, from, dir);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
 
-template <typename Policy, typename Type>
-inline Result
-neg_float(Type& to, const Type from, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  to = -from;
-  return V_EQ;
-}
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-template <typename Policy, typename Type>
-inline Result
-add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_add_inf, is_inf_float(x) && x == -y))
-    return V_INF_ADD_INF;
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = x + y;
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(-x - y);
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = x + y;
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-template <typename Policy, typename Type>
-inline Result
-sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_sub_inf, is_inf_float(x) && x == y))
-    return V_INF_SUB_INF;
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = x - y;
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(y - x);
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = x - y;
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-template <typename Policy, typename Type>
-inline Result
-mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_mul_zero, (x == 0 && is_inf_float(y)) ||
-	    (y == 0 && is_inf_float(x))))
-      return V_INF_MUL_ZERO;
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = x * y;
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(x * -y);
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = x * y;
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator_System& y);
 
-template <typename Policy, typename Type>
-inline Result
-div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_div_inf, is_inf_float(x) && is_inf_float(y)))
-      return V_INF_DIV_INF;
-  if (CHECK_P(Policy::check_div_zero, y == 0)) {
-    to = NAN;
-    return V_DIV_ZERO;
-  }
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = x / y;
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(x / -y);
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = x / y;
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System* zero_dim_univ_p;
 
-template <typename Policy, typename Type>
-inline Result
-rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_inf_mod, is_inf_float(x)))
-    return V_INF_MOD;
-  if (CHECK_P(Policy::check_div_zero, y == 0)) {
-    to = NAN;
-    return V_MOD_ZERO;
-  }
-  to = std::fmod(x, y);
-  return V_EQ;
-}
+  friend class Grid;
 
-template <typename Policy, typename Type>
-inline Result
-mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
-  return mul<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
-}
+  friend bool
+  operator==(const Grid_Generator_System& x, const Grid_Generator_System& y);
 
-template <typename Policy, typename Type>
-inline Result
-div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
-  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
-  return div<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
-}
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
 
-template <typename Policy, typename Type>
-inline Result
-abs_float(Type& to, const Type from, Rounding_Dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  to = from < 0 ? -from : from;
-  return V_EQ;
-}
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
 
-template <typename Policy, typename Type>
-inline Result
-sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
-    return VC_NAN;
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0)) {
-    to = NAN;
-    return V_SQRT_NEG;
-  }
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = std::sqrt(from);
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = std::sqrt(from);
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
 
-template <typename Policy, typename Type>
-inline Result
-sgn_float(const Type x) {
-  return classify<Policy>(x, false, false, true);
-}
+  //! Returns the \p k- th generator of the system.
+  Grid_Generator& operator[](dimension_type k);
 
-template <typename Policy, typename Type>
-inline Result
-cmp_float(const Type x, const Type y) {
-  if (x > y)
-    return V_GT;
-  if (x < y)
-    return V_LT;
-  if (x == y)
-    return V_EQ;
-  return V_UNORD_COMP;
-}
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Grid_Generator& operator[](dimension_type k) const;
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_float_int_exact(To& to, const From from, Rounding_Dir) {
-  to = from;
-  return V_EQ;
-}
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is assigned;
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = from;
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = from;
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
 
-template <typename Policy, typename To, typename From>
-inline Result
-assign_float_int(To& to, const From from, Rounding_Dir dir) {
-  if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
-    return assign_float_int_inexact<Policy>(to, from, dir);
-  else
-    return assign_float_int_exact<Policy>(to, from, dir);
-}
+    \param denominator
+    The denominator of the affine transformation;
 
-template <typename Policy, typename T>
-inline Result
-set_neg_overflow_float(T& to, Rounding_Dir dir) {
-  switch (dir) {
-  case ROUND_UP:
-    {
-      Float<T> f;
-      f.u.binary.set_max(true);
-      to = f.value();
-      return V_LT;
-    }
-  default:
-    to = -HUGE_VAL;
-    return V_GT;
-  }
-}
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations)to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its
+    default value is 1.
 
-template <typename Policy, typename T>
-inline Result
-set_pos_overflow_float(T& to, Rounding_Dir dir) {
-  switch (dir) {
-  case ROUND_DOWN:
-    {
-      Float<T> f;
-      f.u.binary.set_max(false);
-      to = f.value();
-      return V_GT;
-    }
-  default:
-    to = HUGE_VAL;
-    return V_LT;
-  }
-}
+    The affine transformation assigns to each element of \p v -th
+    column the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
 
-template <typename Policy, typename T>
-inline Result
-assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
-{
-  mpz_srcptr from = _from.get_mpz_t();
-  int sign = mpz_sgn(from);
-  if (sign == 0) {
-    to = 0;
-    return V_EQ;
-  }
-  size_t exponent = mpz_sizeinbase(from, 2) - 1;
-  if (exponent > (size_t) Float<T>::Binary::EXPONENT_MAX) {
-    if (sign < 0)
-      return set_neg_overflow_float<Policy>(to, dir);
-    else
-      return set_pos_overflow_float<Policy>(to, dir);
-  }
-  unsigned long zeroes = mpn_scan1(from->_mp_d, 0);
-  size_t meaningful_bits = exponent - zeroes;
-  mpz_t mantissa;
-  mpz_init(mantissa);
-  if (exponent > Float<T>::Binary::MANTISSA_BITS)
-    mpz_tdiv_q_2exp(mantissa,
-		    from,
-		    exponent - Float<T>::Binary::MANTISSA_BITS);
-  else
-    mpz_mul_2exp(mantissa, from, Float<T>::Binary::MANTISSA_BITS - exponent);
-  Float<T> f(to);
-  f.u.binary.build(sign < 0, mantissa, exponent);
-  mpz_clear(mantissa);
-  to = f.value();
-  if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
-    if (sign < 0)
-      return round_lt_float<Policy>(to, dir);
-    else
-      return round_gt_float<Policy>(to, dir);
-  }
-  return V_EQ;
-}
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(dimension_type v,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator);
 
-template <typename Policy, typename T>
-inline Result
-assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
-{
-  const mpz_class& _num = from.get_num();
-  const mpz_class& _den = from.get_den();
-  if (_den == 1)
-    return assign_float_mpz<Policy>(to, _num, dir);
-  mpz_srcptr num = _num.get_mpz_t();
-  mpz_srcptr den = _den.get_mpz_t();
-  int sign = mpz_sgn(num);
-  signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2);
-  if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
-    to = 0;
-  inexact:
-    if (sign < 0)
-      return round_lt_float<Policy>(to, dir);
-    else
-      return round_gt_float<Policy>(to, dir);
-  }
-  if (exponent > (signed int) Float<T>::Binary::EXPONENT_MAX + 1) {
-  overflow:
-    if (sign < 0)
-      return set_neg_overflow_float<Policy>(to, dir);
-    else
-      return set_pos_overflow_float<Policy>(to, dir);
-  }
-  unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
-  if (exponent < Float<T>::Binary::EXPONENT_MIN)
-    needed_bits -= Float<T>::Binary::EXPONENT_MIN - exponent;
-  mpz_t mantissa;
-  mpz_init(mantissa);
-  signed long shift = needed_bits - exponent;
-  if (shift > 0) {
-    mpz_mul_2exp(mantissa, num, shift);
-    num = mantissa;
-  }
-  else if (shift < 0) {
-    mpz_mul_2exp(mantissa, den, -shift);
-    den = mantissa;
-  }
-  mpz_t r;
-  mpz_init(r);
-  mpz_tdiv_qr(mantissa, r, num, den);
-  size_t bits = mpz_sizeinbase(mantissa, 2);
-  bool inexact = (mpz_sgn(r) != 0);
-  mpz_clear(r);
-  if (bits == needed_bits + 1) {
-    inexact = (inexact || mpz_odd_p(mantissa));
-    mpz_div_2exp(mantissa, mantissa, 1);
-  }
-  else
-    --exponent;
-  if (exponent > (signed int)Float<T>::Binary::EXPONENT_MAX) {
-    mpz_clear(mantissa);
-    goto overflow;
-  } else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
-    /* Denormalized */
-    exponent = Float<T>::Binary::EXPONENT_MIN - 1;
-  }
-  Float<T> f(to);
-  f.u.binary.build(sign < 0, mantissa, exponent);
-  mpz_clear(mantissa);
-  to = f.value();
-  if (inexact)
-    goto inexact;
-  return V_EQ;
-}
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the universe system.
 
-template <typename Policy, typename Type>
-inline Result
-add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = fma(x, y, to);
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(fma(-x, y, -to));
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = fma(x, y, to);
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
 
-template <typename Policy, typename Type>
-inline Result
-sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
-      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
-    return VC_NAN;
-  prepare_inexact<Policy>(dir);
-  if (fpu_direct_rounding(dir))
-    to = fma(x, -y, to);
-  else if (fpu_inverse_rounding(dir))
-    to = -limit_precision(fma(x, y, -to));
-  else {
-    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
-    to = fma(x, -y, to);
-    fpu_restore_rounding_direction(old);
-  }
-  return result_relation<Policy>(dir);
-}
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+    \times (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{A}{0} \genfrac{}{}{0pt}{}{0}{B}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{1}{0} \genfrac{}{}{0pt}{}{0}{1}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_universe_rows_and_columns(dimension_type dims);
 
-template <typename Policy, typename Type>
-inline Result
-output_float(std::ostream& os, const Type from, const Numeric_Format&,
-	     Rounding_Dir) {
-  if (from == 0)
-    os << "0";
-  else if (is_minf<Policy>(from))
-    os << "-inf";
-  else if (is_pinf<Policy>(from))
-    os << "+inf";
-  else if (is_nan<Policy>(from))
-    os << "nan";
-  else {
-    int old_precision = os.precision(10000);
-    os << from;
-    os.precision(old_precision);
-  }
-  return V_EQ;
-}
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p to_be_removed must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
 
-template <typename Policy, typename To>
-inline Result
-assign_float_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
-  to = -HUGE_VAL;
-  return V_EQ;
-}
+  /*! \brief
+    Removes the higher dimensions of the system so that the resulting
+    system will have dimension \p new_dimension.
 
-template <typename Policy, typename To>
-inline Result
-assign_float_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
-  to = HUGE_VAL;
-  return V_EQ;
-}
+    The value of \p new_dimension must be at most the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-template <typename Policy, typename To>
-inline Result
-assign_float_nan(To& to, const Not_A_Number&, Rounding_Dir) {
-  to = NAN;
-  return V_EQ;
-}
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_num_rows
+    The number of rows of the resized system;
 
-#if PPL_SUPPORTED_FLOAT
-SPECIALIZE_ASSIGN(float_float_exact, float, float)
-#if PPL_SUPPORTED_DOUBLE
-SPECIALIZE_ASSIGN(float_float, float, double)
-SPECIALIZE_ASSIGN(float_float_exact, double, float)
-#endif
-#if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_ASSIGN(float_float, float, long double)
-SPECIALIZE_ASSIGN(float_float_exact, long double, float)
-#endif
-#endif
+    \param new_num_columns
+    The number of columns of the resized system.
 
-#if PPL_SUPPORTED_DOUBLE
-SPECIALIZE_ASSIGN(float_float_exact, double, double)
-#if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_ASSIGN(float_float, double, long double)
-SPECIALIZE_ASSIGN(float_float_exact, long double, double)
-#endif
-#endif
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_num_rows,
+		      dimension_type new_num_columns);
 
-#if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_ASSIGN(float_float_exact, long double, long double)
-#endif
+  /*! \brief
+    Returns the number of columns of the matrix (i.e., the size of the
+    rows).
+  */
+  dimension_type num_columns() const;
 
-#if PPL_SUPPORTED_FLOAT
-SPECIALIZE_CLASSIFY(float, float)
-SPECIALIZE_IS_NAN(float, float)
-SPECIALIZE_IS_MINF(float, float)
-SPECIALIZE_IS_PINF(float, float)
-SPECIALIZE_SET_SPECIAL(float, float)
-SPECIALIZE_ASSIGN(float_int, float, signed char)
-SPECIALIZE_ASSIGN(float_int, float, signed short)
-SPECIALIZE_ASSIGN(float_int, float, signed int)
-SPECIALIZE_ASSIGN(float_int, float, signed long)
-SPECIALIZE_ASSIGN(float_int, float, signed long long)
-SPECIALIZE_ASSIGN(float_int, float, unsigned char)
-SPECIALIZE_ASSIGN(float_int, float, unsigned short)
-SPECIALIZE_ASSIGN(float_int, float, unsigned int)
-SPECIALIZE_ASSIGN(float_int, float, unsigned long)
-SPECIALIZE_ASSIGN(float_int, float, unsigned long long)
-SPECIALIZE_ASSIGN(float_mpz, float, mpz_class)
-SPECIALIZE_ASSIGN(float_mpq, float, mpq_class)
-SPECIALIZE_COPY(generic, float)
-SPECIALIZE_IS_INT(float, float)
-SPECIALIZE_ASSIGN(float_minf, float, Minus_Infinity)
-SPECIALIZE_ASSIGN(float_pinf, float, Plus_Infinity)
-SPECIALIZE_ASSIGN(float_nan, float, Not_A_Number)
-SPECIALIZE_NEG(float, float, float)
-SPECIALIZE_ABS(float, float, float)
-SPECIALIZE_ADD(float, float, float, float)
-SPECIALIZE_SUB(float, float, float, float)
-SPECIALIZE_MUL(float, float, float, float)
-SPECIALIZE_DIV(float, float, float, float)
-SPECIALIZE_REM(float, float, float, float)
-SPECIALIZE_MUL2EXP(float, float, float)
-SPECIALIZE_DIV2EXP(float, float, float)
-SPECIALIZE_SQRT(float, float, float)
-SPECIALIZE_GCD(exact, float, float, float)
-SPECIALIZE_GCDEXT(exact, float, float, float, float, float)
-SPECIALIZE_LCM(gcd_exact, float, float, float)
-SPECIALIZE_SGN(float, float)
-SPECIALIZE_CMP(float, float, float)
-SPECIALIZE_ADD_MUL(float, float, float, float)
-SPECIALIZE_SUB_MUL(float, float, float, float)
-SPECIALIZE_INPUT(generic, float)
-SPECIALIZE_OUTPUT(float, float)
-#endif
+  /*! \brief
+    Erases from the matrix all the rows but those having an index less
+    than \p first_to_erase.
+  */
+  void erase_to_end(dimension_type first_to_erase);
 
-#if PPL_SUPPORTED_DOUBLE
-SPECIALIZE_CLASSIFY(float, double)
-SPECIALIZE_IS_NAN(float, double)
-SPECIALIZE_IS_MINF(float, double)
-SPECIALIZE_IS_PINF(float, double)
-SPECIALIZE_SET_SPECIAL(float, double)
-SPECIALIZE_ASSIGN(float_int, double, signed char)
-SPECIALIZE_ASSIGN(float_int, double, signed short)
-SPECIALIZE_ASSIGN(float_int, double, signed int)
-SPECIALIZE_ASSIGN(float_int, double, signed long)
-SPECIALIZE_ASSIGN(float_int, double, signed long long)
-SPECIALIZE_ASSIGN(float_int, double, unsigned char)
-SPECIALIZE_ASSIGN(float_int, double, unsigned short)
-SPECIALIZE_ASSIGN(float_int, double, unsigned int)
-SPECIALIZE_ASSIGN(float_int, double, unsigned long)
-SPECIALIZE_ASSIGN(float_int, double, unsigned long long)
-SPECIALIZE_ASSIGN(float_mpz, double, mpz_class)
-SPECIALIZE_ASSIGN(float_mpq, double, mpq_class)
-SPECIALIZE_COPY(generic, double)
-SPECIALIZE_IS_INT(float, double)
-SPECIALIZE_ASSIGN(float_minf, double, Minus_Infinity)
-SPECIALIZE_ASSIGN(float_pinf, double, Plus_Infinity)
-SPECIALIZE_ASSIGN(float_nan, double, Not_A_Number)
-SPECIALIZE_NEG(float, double, double)
-SPECIALIZE_ABS(float, double, double)
-SPECIALIZE_ADD(float, double, double, double)
-SPECIALIZE_SUB(float, double, double, double)
-SPECIALIZE_MUL(float, double, double, double)
-SPECIALIZE_DIV(float, double, double, double)
-SPECIALIZE_REM(float, double, double, double)
-SPECIALIZE_MUL2EXP(float, double, double)
-SPECIALIZE_DIV2EXP(float, double, double)
-SPECIALIZE_SQRT(float, double, double)
-SPECIALIZE_GCD(exact, double, double, double)
-SPECIALIZE_GCDEXT(exact, double, double, double, double, double)
-SPECIALIZE_LCM(gcd_exact, double, double, double)
-SPECIALIZE_SGN(float, double)
-SPECIALIZE_CMP(float, double, double)
-SPECIALIZE_ADD_MUL(float, double, double, double)
-SPECIALIZE_SUB_MUL(float, double, double, double)
-SPECIALIZE_INPUT(generic, double)
-SPECIALIZE_OUTPUT(float, double)
-#endif
+  //! Permutes the columns of the matrix.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
 
-#if PPL_SUPPORTED_LONG_DOUBLE
-SPECIALIZE_CLASSIFY(float, long double)
-SPECIALIZE_IS_NAN(float, long double)
-SPECIALIZE_IS_MINF(float, long double)
-SPECIALIZE_IS_PINF(float, long double)
-SPECIALIZE_SET_SPECIAL(float, long double)
-SPECIALIZE_ASSIGN(float_int, long double, signed char)
-SPECIALIZE_ASSIGN(float_int, long double, signed short)
-SPECIALIZE_ASSIGN(float_int, long double, signed int)
-SPECIALIZE_ASSIGN(float_int, long double, signed long)
-SPECIALIZE_ASSIGN(float_int, long double, signed long long)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned char)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned short)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned int)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned long)
-SPECIALIZE_ASSIGN(float_int, long double, unsigned long long)
-SPECIALIZE_ASSIGN(float_mpz, long double, mpz_class)
-SPECIALIZE_ASSIGN(float_mpq, long double, mpq_class)
-SPECIALIZE_COPY(generic, long double)
-SPECIALIZE_IS_INT(float, long double)
-SPECIALIZE_ASSIGN(float_minf, long double, Minus_Infinity)
-SPECIALIZE_ASSIGN(float_pinf, long double, Plus_Infinity)
-SPECIALIZE_ASSIGN(float_nan, long double, Not_A_Number)
-SPECIALIZE_NEG(float, long double, long double)
-SPECIALIZE_ABS(float, long double, long double)
-SPECIALIZE_ADD(float, long double, long double, long double)
-SPECIALIZE_SUB(float, long double, long double, long double)
-SPECIALIZE_MUL(float, long double, long double, long double)
-SPECIALIZE_DIV(float, long double, long double, long double)
-SPECIALIZE_REM(float, long double, long double, long double)
-SPECIALIZE_MUL2EXP(float, long double, long double)
-SPECIALIZE_DIV2EXP(float, long double, long double)
-SPECIALIZE_SQRT(float, long double, long double)
-SPECIALIZE_GCD(exact, long double, long double, long double)
-SPECIALIZE_GCDEXT(exact, long double, long double, long double,
-		  long double, long double)
-SPECIALIZE_LCM(gcd_exact, long double, long double, long double)
-SPECIALIZE_SGN(float, long double)
-SPECIALIZE_CMP(float, long double, long double)
-SPECIALIZE_ADD_MUL(float, long double, long double, long double)
-SPECIALIZE_SUB_MUL(float, long double, long double, long double)
-SPECIALIZE_INPUT(generic, long double)
-SPECIALIZE_OUTPUT(float, long double)
-#endif
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+};
 
-} // namespace Checked
+// Grid_Generator_System.inlines.hh is not included here on purpose.
 
-} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator_System.inlines.hh line 1
+/* Grid_Generator_System class implementation: inline functions.
+*/
 
-// Automatically generated from PPL source file ../src/checked_mpz.inlines.hh line 1
-/* Specialized "checked" functions for GMP's mpz_class numbers.
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator.defs.hh line 1
+/* Grid_Generator class declaration.
 */
 
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator.defs.hh line 31
+// FIXME: this inclusion must be removed along with the friend declaration
+//        befriending class Box.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator.defs.hh line 34
+#include <iosfwd>
+
 namespace Parma_Polyhedra_Library {
 
-namespace Checked {
+// Put these in the namespace here to declare them friend later.
 
-template <typename Policy>
-inline Result
-round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
-  if (dir == ROUND_DOWN) {
-    --to;
-    return V_GT;
-  }
-  return V_LT;
-}
+namespace IO_Operators {
 
-template <typename Policy>
-inline Result
-round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
-  if (dir == ROUND_UP) {
-    ++to;
-    return V_LT;
-  }
-  return V_GT;
-}
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+void swap(Parma_Polyhedra_Library::Grid_Generator& x,
+	  Parma_Polyhedra_Library::Grid_Generator& y);
 
-// FIXME: change this when Autoconf will support AC_C_TYPEOF.
-#ifdef __GNUC__
-//! Type of the _mp_size field of GMP's __mpz_struct.
-typedef __typeof__(__mpz_struct()._mp_size) mp_size_field_t;
-#else
-//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
-typedef int mp_size_field_t;
-#endif
+} // namespace std
 
-inline mp_size_field_t
-get_mp_size(const mpz_class &v) {
-  return v.get_mpz_t()->_mp_size;
-}
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid_Generator is one of the following:
 
-inline void
-set_mp_size(mpz_class &v, mp_size_field_t size) {
-  v.get_mpz_t()->_mp_size = size;
-}
+  - a grid_line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
 
-template <typename Policy>
-inline Result
-classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
-  if (Policy::handle_nan || Policy::handle_infinity) {
-    mp_size_field_t s = get_mp_size(v);
-    if (Policy::handle_nan
-	&& (nan || sign)
-	&& s == Limits<mp_size_field_t>::min + 1)
-      return VC_NAN;
-    if (!inf && !sign)
-      return VC_NORMAL;
-    if (Policy::handle_infinity) {
-      if (s == Limits<mp_size_field_t>::min)
-	return inf ? VC_MINUS_INFINITY : V_LT;
-      if (s == Limits<mp_size_field_t>::max)
-	return inf ? VC_PLUS_INFINITY : V_GT;
-    }
-  }
-  if (sign)
-    return sgn<Policy>(v);
-  return VC_NORMAL;
-}
+  - a parameter
+    \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
 
-SPECIALIZE_CLASSIFY(mpz, mpz_class)
+  - a grid_point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
 
-template <typename Policy>
-inline bool
-is_nan_mpz(const mpz_class& v) {
-  return Policy::handle_nan
-    && get_mp_size(v) == Limits<mp_size_field_t>::min + 1;
-}
+  where \f$n\f$ is the dimension of the space
+  and, for grid_points and parameters, \f$d > 0\f$ is the divisor.
 
-SPECIALIZE_IS_NAN(mpz, mpz_class)
+  \par How to build a grid generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>grid_line</CODE>, <CODE>parameter</CODE>
+  or <CODE>grid_point</CODE>) to a linear expression;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining grid points and parameters, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
 
-template <typename Policy>
-inline bool
-is_minf_mpz(const mpz_class& v) {
-  return Policy::handle_infinity
-    && get_mp_size(v) == Limits<mp_size_field_t>::min;
-}
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
 
-SPECIALIZE_IS_MINF(mpz, mpz_class)
+  \par Example 1
+  The following code builds a grid line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Grid_Generator l = grid_line(x - y - z);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator l = grid_line(0*x);
+  \endcode
 
-template <typename Policy>
-inline bool
-is_pinf_mpz(const mpz_class& v) {
-  return Policy::handle_infinity
-    && get_mp_size(v) == Limits<mp_size_field_t>::max;
-}
+  \par Example 2
+  The following code builds the parameter as the vector
+  \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+  which has the same direction as the line in Example 1:
+  \code
+  Grid_Generator q = parameter(x - y - z);
+  \endcode
+  Note that, unlike lines, for parameters, the length as well
+  as the direction of the vector represented by the code is significant.
+  Thus \p q is \e not the same as the parameter \p q1 defined by
+  \code
+  Grid_Generator q1 = parameter(2x - 2y - 2z);
+  \endcode
+  By definition, the origin of the space is not a parameter, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator q = parameter(0*x);
+  \endcode
 
-SPECIALIZE_IS_PINF(mpz, mpz_class)
+  \par Example 3
+  The following code builds the grid point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Grid_Generator p = grid_point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+  Grid_Generator origin3_alt = grid_point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Grid_Generator origin2 = grid_point(0*y);
+  \endcode
+  The following two lines of code both define the only grid point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Grid_Generator origin0 = Generator::zero_dim_point();
+  Grid_Generator origin0_alt = grid_point();
+  \endcode
 
-template <typename Policy>
-inline bool
-is_int_mpz(const mpz_class& v) {
-  return !is_nan<Policy>(v);
-}
+  \par Example 4
+  The grid point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>grid_point</CODE> (the divisor):
+  \code
+  Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be used to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the grid point
+  \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
 
-SPECIALIZE_IS_INT(mpz, mpz_class)
+  \par Example 5
+  Parameters, like grid points can have a divisor.
+  For instance, the parameter
+  \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+  \code
+  Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+  \endcode
+  Also, the divisor can be used to specify
+  parameters having some non-integer (but rational) coordinates.
+  For instance, the parameter
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be defined:
+  \code
+  Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
 
-template <typename Policy>
-inline Result
-set_special_mpz(mpz_class& v, Result r) {
-  Result c = classify(r);
-  if (Policy::handle_nan && c == VC_NAN)
-    set_mp_size(v, Limits<mp_size_field_t>::min + 1);
-  else if (Policy::handle_infinity) {
-    switch (c) {
-    case VC_MINUS_INFINITY:
-      set_mp_size(v, Limits<mp_size_field_t>::min);
-      break;
-    case VC_PLUS_INFINITY:
-      set_mp_size(v, Limits<mp_size_field_t>::max);
-      break;
-    default:
-      break;
-    }
+  \par How to inspect a grid generator
+  Several methods are provided to examine a grid generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients and the value of the denominator.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a grid generator.
+  If <CODE>g1</CODE> is a grid point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the parameter <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Grid point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Grid_Generator g2 = parameter(e, g1.divisor());
+    cout << "Parameter g2: " << g2 << endl;
   }
-  return r;
-}
+  else
+    cout << "Grid Generator g1 is not a grid point." << endl;
+  \endcode
+  Therefore, for the grid point
+  \code
+  Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Grid point g1: p((2*A - B + 3*C)/2)
+  Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with grid points and parameters, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator : private Generator {
+public:
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Grid_Generator grid_line(const Linear_Expression& e);
 
-SPECIALIZE_SET_SPECIAL(mpz, mpz_class)
+  //! Returns the parameter of direction \p e and size \p e/d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
 
-template <typename Policy>
-inline void
-copy_mpz(mpz_class& to, const mpz_class& from) {
-  if (is_nan_mpz<Policy>(from) ||
-      is_minf_mpz<Policy>(from) || is_pinf_mpz<Policy>(from))
-    set_mp_size(to, get_mp_size(from));
-  else
-    to = from;
-}
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator parameter(const Linear_Expression& e
+				  = Linear_Expression::zero(),
+				  Coefficient_traits::const_reference d
+				  = Coefficient_one());
 
-SPECIALIZE_COPY(mpz, mpz_class)
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
 
-template <typename Policy, typename From>
-inline Result
-construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
-    new (&to) mpz_class(from);
-    return V_EQ;
-}
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator grid_point(const Linear_Expression& e
+				   = Linear_Expression::zero(),
+				   Coefficient_traits::const_reference d
+				   = Coefficient_one());
 
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed char)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed short)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed int)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed long)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned char)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned short)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned int)
-SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned long)
+  //! Ordinary copy-constructor.
+  Grid_Generator(const Grid_Generator& g);
 
-template <typename Policy, typename From>
-inline Result
-assign_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
-    to = static_cast<signed long>(from);
-    return V_EQ;
-}
+  //! Destructor.
+  ~Grid_Generator();
 
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed char)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed short)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed int)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed long)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned char)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned short)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned int)
-SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned long)
+  //! Assignment operator.
+  Grid_Generator& operator=(const Grid_Generator& g);
 
-template <typename Policy, typename From>
-inline Result
-assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
-  if (sizeof(From) <= sizeof(signed long))
-    to = static_cast<signed long>(from);
-  else {
-    mpz_ptr m = to.get_mpz_t();
-    if (from >= 0)
-      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
-    else {
-      From n = -from;
-      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
-      mpz_neg(m, m);
-    }
-  }
-  return V_EQ;
-}
+  //! Assignment operator.
+  Grid_Generator& operator=(const Generator& g);
 
-SPECIALIZE_ASSIGN(mpz_signed_int, mpz_class, signed long long)
+  //! Returns the maximum space dimension a Grid_Generator can handle.
+  static dimension_type max_space_dimension();
 
-template <typename Policy, typename From>
-inline Result
-assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
-  if (sizeof(From) <= sizeof(unsigned long))
-    to = static_cast<unsigned long>(from);
-  else
-    mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
-  return V_EQ;
-}
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-SPECIALIZE_ASSIGN(mpz_unsigned_int, mpz_class, unsigned long long)
+  //! The generator type.
+  enum Type {
+    /*! The generator is a grid line. */
+    LINE,
+    /*! The generator is a parameter. */
+    PARAMETER,
+    /*! The generator is a grid point. */
+    POINT
+  };
 
-template <typename Policy, typename From>
-inline Result
-assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
-  if (dir == ROUND_IGNORE) {
-    to = from;
-    return V_LGE;
-  }
-  From n = rint(from);
-  to = n;
-  if (from < n)
-    return round_lt_mpz<Policy>(to, dir);
-  else if (from > n)
-    return round_gt_mpz<Policy>(to, dir);
-  else
-    return V_EQ;
-}
+  //! Returns the generator type of \p *this.
+  Type type() const;
 
-SPECIALIZE_ASSIGN(mpz_float, mpz_class, float)
-SPECIALIZE_ASSIGN(mpz_float, mpz_class, double)
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
 
-template <typename Policy>
-inline Result
-assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
-  if (dir == ROUND_IGNORE) {
-    to = from;
-    return V_LGE;
-  }
-  mpz_srcptr n = from.get_num().get_mpz_t();
-  mpz_srcptr d = from.get_den().get_mpz_t();
-  if (dir == ROUND_DOWN) {
-    mpz_fdiv_q(to.get_mpz_t(), n, d);
-    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
-  }
-  else {
-    assert(dir == ROUND_UP);
-    mpz_cdiv_q(to.get_mpz_t(), n, d);
-    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
-  }
-}
+  //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+  bool is_parameter() const;
 
-SPECIALIZE_ASSIGN(mpz_mpq, mpz_class, mpq_class)
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a line or
+    a parameter.
+  */
+  bool is_line_or_parameter() const;
 
-template <typename Policy, typename To>
-inline Result
-assign_mp_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
-  if (Policy::handle_infinity) {
-    set_special<Policy>(to, VC_MINUS_INFINITY);
-    return V_EQ;
-  }
-  return VC_MINUS_INFINITY;
-}
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
 
-template <typename Policy, typename To>
-inline Result
-assign_mp_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
-  if (Policy::handle_infinity) {
-    set_special<Policy>(to, VC_PLUS_INFINITY);
-    return V_EQ;
-  }
-  return VC_PLUS_INFINITY;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row represents a
+    parameter or a point.
+  */
+  bool is_parameter_or_point() const;
 
-template <typename Policy, typename To>
-inline Result
-assign_mp_nan(To& to, const Not_A_Number&, Rounding_Dir) {
-  if (Policy::handle_nan) {
-    set_special<Policy>(to, VC_NAN);
-    return V_EQ;
-  }
-  return VC_NAN;
-}
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
 
-SPECIALIZE_ASSIGN(mp_minf, mpz_class, Minus_Infinity)
-SPECIALIZE_ASSIGN(mp_pinf, mpz_class, Plus_Infinity)
-SPECIALIZE_ASSIGN(mp_nan, mpz_class, Not_A_Number)
-SPECIALIZE_ASSIGN(mp_minf, mpq_class, Minus_Infinity)
-SPECIALIZE_ASSIGN(mp_pinf, mpq_class, Plus_Infinity)
-SPECIALIZE_ASSIGN(mp_nan, mpq_class, Not_A_Number)
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient_traits::const_reference divisor() const;
 
-template <typename Policy>
-inline Result
-neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
-  mpz_neg(to.get_mpz_t(), from.get_mpz_t());
-  return V_EQ;
-}
+  //! Initializes the class.
+  static void initialize();
 
-SPECIALIZE_NEG(mpz, mpz_class, mpz_class)
+  //! Finalizes the class.
+  static void finalize();
 
-template <typename Policy>
-inline Result
-add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  to = x + y;
-  return V_EQ;
-}
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Grid_Generator& zero_dim_point();
 
-SPECIALIZE_ADD(mpz, mpz_class, mpz_class, mpz_class)
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
 
-template <typename Policy>
-inline Result
-sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  to = x - y;
-  return V_EQ;
-}
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-SPECIALIZE_SUB(mpz, mpz_class, mpz_class, mpz_class)
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    equivalent generators.
 
-template <typename Policy>
-inline Result
-mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  to = x * y;
-  return V_EQ;
-}
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Grid_Generator& y) const;
 
-SPECIALIZE_MUL(mpz, mpz_class, mpz_class, mpz_class)
+  //! Returns <CODE>true</CODE> if \p *this is exactly equal to \p y.
+  bool is_equal_to(const Grid_Generator& y) const;
 
-template <typename Policy>
-inline Result
-div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
-	Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
-  mpz_srcptr n = x.get_mpz_t();
-  mpz_srcptr d = y.get_mpz_t();
-  if (dir == ROUND_IGNORE) {
-    mpz_divexact(to.get_mpz_t(), n, d);
-    return V_LGE;
-  }
-  if (dir == ROUND_DOWN) {
-    mpz_fdiv_q(to.get_mpz_t(), n, d);
-    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
-  }
-  else {
-    assert(dir == ROUND_UP);
-    mpz_cdiv_q(to.get_mpz_t(), n, d);
-    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
-  }
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p gg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+			     const Grid_Generator& gg) const;
 
-SPECIALIZE_DIV(mpz, mpz_class, mpz_class, mpz_class)
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous terms
+    of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
 
-template <typename Policy>
-inline Result
-rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
-    return set_special<Policy>(to, V_MOD_ZERO);
-  to = x % y;
-  return V_EQ;
-}
+  PPL_OUTPUT_DECLARATIONS
 
-SPECIALIZE_REM(mpz, mpz_class, mpz_class, mpz_class)
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-template <typename Policy>
-inline Result
-mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
-  return V_EQ;
-}
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-SPECIALIZE_MUL2EXP(mpz, mpz_class, mpz_class)
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator& y);
 
-template <typename Policy>
-inline Result
-div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
-  mpz_srcptr n = x.get_mpz_t();
-  if (dir == ROUND_IGNORE) {
-    mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
-    return V_LGE;
-  }
-  if (dir == ROUND_DOWN) {
-    mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
-    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
-  }
-  else {
-    assert(dir == ROUND_UP);
-    mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
-    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
-  }
-}
+  /*! \brief
+    Swaps \p *this with \p y, leaving \p *this with the original
+    capacity.
 
-SPECIALIZE_DIV2EXP(mpz, mpz_class, mpz_class)
+    All elements up to and including the last element of the smaller
+    of \p *this and \p y are swapped.  The parameter divisor element
+    of \p y is swapped with the divisor element of \p *this.
+  */
+  void coefficient_swap(Grid_Generator& y);
 
-template <typename Policy>
-inline Result
-abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
-  to = abs(from);
-  return V_EQ;
-}
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Grid_Generator* zero_dim_point_p;
 
-SPECIALIZE_ABS(mpz, mpz_class, mpz_class)
+  /*! \brief
+    Scales \p *this to be represented with a divisor of \p d (if
+    \*this is a parameter or point).
 
-template <typename Policy>
-inline Result
-add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
-	    Rounding_Dir) {
-  mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
-  return V_EQ;
-}
+    It is assumed that \p d is a multiple of the current divisor.
 
-SPECIALIZE_ADD_MUL(mpz, mpz_class, mpz_class, mpz_class)
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  void scale_to_divisor(Coefficient_traits::const_reference d);
 
-template <typename Policy>
-inline Result
-sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
-	    Rounding_Dir) {
-  mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
-  return V_EQ;
-}
+  /*! \brief
+    Constructs from polyhedron generator \p g, stealing the underlying
+    data structures from \p g.
 
-SPECIALIZE_SUB_MUL(mpz, mpz_class, mpz_class, mpz_class)
+    The last column in \p g becomes the parameter divisor column of
+    the new Grid_Generator.
+  */
+  explicit Grid_Generator(Generator g);
 
-template <typename Policy>
-inline Result
-gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
-  return V_EQ;
-}
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
 
-SPECIALIZE_GCD(mpz, mpz_class, mpz_class, mpz_class)
+  //! Negates the elements from index \p start to index \p end.
+  void negate(dimension_type start, dimension_type end);
 
-template <typename Policy>
-inline Result
-gcdext_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
-	   mpz_class& s, mpz_class& t, Rounding_Dir) {
-  mpz_gcdext(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(),
-	     s.get_mpz_t(), t.get_mpz_t());
-  return V_EQ;
-}
+  //! Sets the divisor of \p *this to \p d.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  void set_divisor(Coefficient_traits::const_reference d);
 
-SPECIALIZE_GCDEXT(mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
 
-template <typename Policy>
-inline Result
-lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
-  mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
-  return V_EQ;
-}
+  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_parameter_or_point();
 
-SPECIALIZE_LCM(mpz, mpz_class, mpz_class, mpz_class)
+  //! Converts the Grid_Generator into a parameter.
+  void set_is_parameter();
 
-template <typename Policy>
-inline Result
-sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
-    return set_special<Policy>(to, V_SQRT_NEG);
-  if (dir == ROUND_IGNORE) {
-    to = sqrt(from);
-    return V_GE;
-  }
-  mpz_class r;
-  mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
-  if (r == 0)
-    return V_EQ;
-  return round_gt_mpz<Policy>(to, dir);
-}
+  /*! \brief
+    Strong normalization: ensures that different Grid_Generator
+    objects represent different hyperplanes or hyperspaces.
 
-SPECIALIZE_SQRT(mpz, mpz_class, mpz_class)
+    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
 
-template <typename Policy, typename Type>
-inline Result
-sgn_mp(const Type& x) {
-  int i = ::sgn(x);
-  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
-}
+    This is simply a wrapper around the Generator::strong_normalize,
+    which means applying it to a parameter may change the parameter.
+  */
+  void strong_normalize();
 
-SPECIALIZE_SGN(mp, mpz_class)
-SPECIALIZE_SGN(mp, mpq_class)
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
 
-template <typename Policy, typename Type>
-inline Result
-cmp_mp(const Type& x, const Type& y) {
-  int i = ::cmp(x, y);
-  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
-}
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
 
-SPECIALIZE_CMP(mp, mpz_class, mpz_class)
-SPECIALIZE_CMP(mp, mpq_class, mpq_class)
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
 
-template <typename Policy>
-inline Result
-output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
-	   Rounding_Dir) {
-  os << from;
-  return V_EQ;
-}
+  friend std::ostream&
+  IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+  // FIXME: The following friend declaration is for operator[] and
+  //        divisor() access in Grid::conversion, Grid::simplify,
+  //        Grid::relation_with(c) and Grid::Grid(box, *).
+  friend class Grid;
 
-SPECIALIZE_INPUT(generic, mpz_class)
-SPECIALIZE_OUTPUT(mpz, mpz_class)
 
-inline memory_size_type
-external_memory_in_bytes(const mpz_class& x) {
-  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
-}
+  // FIXME: The following friend declaration is for the use of operator[]
+  //        in Box<Interval>::Box(const Grid&, Complexity_Class),
+  //        and should be removed as soon as the computation there is moved
+  //        to the Grid class.
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
 
-} // namespace Checked
+  friend class Grid_Generator_System;
+  friend class Grid_Generator_System::const_iterator;
+  friend class Congruence_System;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+  friend class Linear_Expression;
+};
 
-} // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/checked_mpq.inlines.hh line 1
-/* Specialized "checked" functions for GMP's mpq_class numbers.
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::grid_line(const Linear_Expression& e).
 */
+/*! \relates Grid_Generator */
+Grid_Generator grid_line(const Linear_Expression& e);
 
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::parameter(const Linear_Expression& e,
+  Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+	  Coefficient_traits::const_reference d = Coefficient_one());
 
-#include <sstream>
-#include <climits>
-#include <stdexcept>
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::grid_point(const Linear_Expression& e,
+  Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+	   Coefficient_traits::const_reference d = Coefficient_one());
 
-namespace Parma_Polyhedra_Library {
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
 
-namespace Checked {
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
 
-template <typename Policy>
-inline Result
-classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
-  if ((Policy::handle_nan || Policy::handle_infinity)
-      && ::sgn(v.get_den()) == 0) {
-    int s = ::sgn(v.get_num());
-    if (Policy::handle_nan && (nan || sign) && s == 0)
-      return VC_NAN;
-    if (!inf && !sign)
-      return VC_NORMAL;
-    if (Policy::handle_infinity) {
-      if (s < 0)
-	return inf ? VC_MINUS_INFINITY : V_LT;
-      if (s > 0)
-	return inf ? VC_PLUS_INFINITY : V_GT;
-    }
-  }
-  if (sign)
-    return sgn<Policy>(v);
-  return VC_NORMAL;
-}
 
-SPECIALIZE_CLASSIFY(mpq, mpq_class)
+namespace IO_Operators {
 
-template <typename Policy>
-inline bool
-is_nan_mpq(const mpq_class& v) {
-  return Policy::handle_nan
-    && ::sgn(v.get_den()) == 0
-    && ::sgn(v.get_num()) == 0;
-}
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
 
-SPECIALIZE_IS_NAN(mpq, mpq_class)
+} // namespace IO_Operators
 
-template <typename Policy>
-inline bool
-is_minf_mpq(const mpq_class& v) {
-  return Policy::handle_infinity
-    && ::sgn(v.get_den()) == 0
-    && ::sgn(v.get_num()) < 0;
-}
+} // namespace Parma_Polyhedra_Library
 
-SPECIALIZE_IS_MINF(mpq, mpq_class)
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator.inlines.hh line 1
+/* Grid Generator class implementation: inline functions.
+*/
 
-template <typename Policy>
-inline bool
-is_pinf_mpq(const mpq_class& v) {
-  return Policy::handle_infinity
-    && ::sgn(v.get_den()) == 0
-    && ::sgn(v.get_num()) > 0;
-}
 
-SPECIALIZE_IS_PINF(mpq, mpq_class)
+namespace Parma_Polyhedra_Library {
 
-template <typename Policy>
-inline bool
-is_int_mpq(const mpq_class& v) {
-  return !is_nan<Policy>(v) && v.get_den() == 1;
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g)
+  : Generator(g) {
 }
 
-SPECIALIZE_IS_INT(mpq, mpq_class)
-
-template <typename Policy>
-inline Result
-set_special_mpq(mpq_class& v, Result r) {
-  Result c = classify(r);
-  if (Policy::handle_nan && c == VC_NAN) {
-    v.get_num() = 0;
-    v.get_den() = 0;
-  }
-  else if (Policy::handle_infinity) {
-    switch (c) {
-    case VC_MINUS_INFINITY:
-      v.get_num() = -1;
-      v.get_den() = 0;
-      break;
-    case VC_PLUS_INFINITY:
-      v.get_num() = 1;
-      v.get_den() = 0;
-      break;
-    default:
-      break;
-    }
-  }
-  return r;
+inline
+Grid_Generator::~Grid_Generator() {
 }
 
-SPECIALIZE_SET_SPECIAL(mpq, mpq_class)
-
-SPECIALIZE_COPY(generic, mpq_class)
-
-template <typename Policy, typename From>
-inline Result
-construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
-  new (&to) mpq_class(from);
-  return V_EQ;
+inline
+Grid_Generator::Grid_Generator(Generator g)
+  : Generator(Generator::point()) {
+  Generator::swap(g);
 }
 
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, mpz_class)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed char)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed short)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed int)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed long)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned char)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned short)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned int)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned long)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, float)
-SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, double)
+inline dimension_type
+Grid_Generator::size() const {
+  return Generator::size();
+}
 
-template <typename Policy, typename From>
-inline Result
-construct_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
-  // FIXME: this is an incredibly inefficient implementation!
-  new (&to) mpq_class;
-  std::stringstream ss;
-  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
-  return input_mpq(to, ss);
+inline dimension_type
+Grid_Generator::max_space_dimension() {
+  return Generator::max_space_dimension() - 1;
 }
 
-SPECIALIZE_CONSTRUCT(mpq_long_double, mpq_class, long double)
+inline Coefficient&
+Grid_Generator::operator[](dimension_type k) {
+  return Generator::operator[](k);
+}
 
-template <typename Policy, typename From>
-inline Result
-assign_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
-  to = from;
-  return V_EQ;
+inline Coefficient_traits::const_reference
+Grid_Generator::operator[](dimension_type k) const {
+  return Generator::operator[](k);
 }
 
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, mpz_class)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed char)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed short)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed int)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed long)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned char)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned short)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned int)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned long)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, float)
-SPECIALIZE_ASSIGN(mpq_base, mpq_class, double)
+inline dimension_type
+Grid_Generator::space_dimension() const {
+  return Generator::space_dimension() - 1;
+}
 
-template <typename Policy, typename From>
-inline Result
-assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
-  if (sizeof(From) <= sizeof(signed long))
-    to = static_cast<signed long>(from);
-  else {
-    mpz_ptr m = to.get_num().get_mpz_t();
-    if (from >= 0)
-      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
-    else {
-      From n = -from;
-      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
-      mpz_neg(m, m);
-    }
-    to.get_den() = 1;
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+  switch (Generator::type()) {
+  case Generator::POINT:
+    return POINT;
+  case Generator::RAY:
+    return PARAMETER;
+  case Generator::LINE:
+    return LINE;
+  case Generator::CLOSURE_POINT:
+  default:
+    assert(false);
+    return POINT;
   }
-  return V_EQ;
 }
 
-SPECIALIZE_ASSIGN(mpq_signed_int, mpq_class, signed long long)
+inline bool
+Grid_Generator::is_line() const {
+  return Generator::is_line();
+}
 
-template <typename Policy, typename From>
-inline Result
-assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
-  if (sizeof(From) <= sizeof(unsigned long))
-    to = static_cast<unsigned long>(from);
-  else {
-    mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
-    to.get_den() = 1;
-  }
-  return V_EQ;
+inline bool
+Grid_Generator::is_parameter() const {
+  return is_ray();
 }
 
-SPECIALIZE_ASSIGN(mpq_unsigned_int, mpq_class, unsigned long long)
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+  return is_line_or_ray();
+}
 
-template <typename Policy, typename From>
-inline Result
-assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
-  // FIXME: this is an incredibly inefficient implementation!
-  std::stringstream ss;
-  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
-  return input_mpq(to, ss);
+inline bool
+Grid_Generator::is_point() const {
+  return Generator::is_point();
 }
 
-SPECIALIZE_ASSIGN(mpq_long_double, mpq_class, long double)
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
 
-template <typename Policy>
-inline Result
-neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
-  mpq_neg(to.get_mpq_t(), from.get_mpq_t());
-  return V_EQ;
+inline void
+Grid_Generator::set_divisor(Coefficient_traits::const_reference d) {
+  assert(!is_line());
+  if (is_line_or_parameter())
+    Generator::operator[](size() - 1) = d;
+  else
+    Generator::operator[](0) = d;
 }
 
-SPECIALIZE_NEG(mpq, mpq_class, mpq_class)
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return Generator::operator[](size() - 1);
+  else
+    return Generator::operator[](0);
+}
 
-template <typename Policy>
-inline Result
-add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  to = x + y;
-  return V_EQ;
+inline bool
+Grid_Generator::is_equal_at_dimension(dimension_type dim,
+				      const Grid_Generator& gg) const {
+  return operator[](dim) * gg.divisor() == gg[dim] * divisor();
 }
 
-SPECIALIZE_ADD(mpq, mpq_class, mpq_class, mpq_class)
+inline void
+Grid_Generator::set_is_line() {
+  Generator::set_is_line();
+}
 
-template <typename Policy>
-inline Result
-sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  to = x - y;
-  return V_EQ;
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+  Generator::set_is_ray_or_point();
 }
 
-SPECIALIZE_SUB(mpq, mpq_class, mpq_class, mpq_class)
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+  Generator::operator=(g);
+  return *this;
+}
 
-template <typename Policy>
-inline Result
-mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  to = x * y;
-  return V_EQ;
+inline Grid_Generator&
+Grid_Generator::operator=(const Generator& g) {
+  Generator::operator=(g);
+  return *this;
 }
 
-SPECIALIZE_MUL(mpq, mpq_class, mpq_class, mpq_class)
+inline void
+Grid_Generator::negate(dimension_type start, dimension_type end) {
+  while (start <= end)
+    neg_assign(operator[](start++));
+}
 
-template <typename Policy>
-inline Result
-div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
-    return set_special<Policy>(to, V_DIV_ZERO);
-  to = x / y;
-  return V_EQ;
+inline Coefficient_traits::const_reference
+Grid_Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Generator::coefficient(v);
 }
 
-SPECIALIZE_DIV(mpq, mpq_class, mpq_class, mpq_class)
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+  return Generator::total_memory_in_bytes();
+}
 
-template <typename Policy>
-inline Result
-rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
-  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
-    return set_special<Policy>(to, V_MOD_ZERO);
-  to = x / y;
-  to.get_num() %= to.get_den();
-  return V_EQ;
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+  return Generator::external_memory_in_bytes();
 }
 
-SPECIALIZE_REM(mpq, mpq_class, mpq_class, mpq_class)
+inline const Grid_Generator&
+Grid_Generator::zero_dim_point() {
+  assert(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
 
-template <typename Policy>
-inline Result
-mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return div2exp<Policy>(to, x, -exp, dir);
-  mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
-  to.get_den() = x.get_den();
-  to.canonicalize();
-  return V_EQ;
+inline void
+Grid_Generator::strong_normalize() {
+  Generator::strong_normalize();
 }
 
-SPECIALIZE_MUL2EXP(mpq, mpq_class, mpq_class)
+inline void
+Grid_Generator::swap(Grid_Generator& y) {
+  Generator::swap(y);
+}
 
-template <typename Policy>
-inline Result
-div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
-  if (exp < 0)
-    return mul2exp<Policy>(to, x, -exp, dir);
-  to.get_num() = x.get_num();
-  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
-  to.canonicalize();
-  return V_EQ;
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+  return x.is_equivalent_to(y);
 }
 
-SPECIALIZE_DIV2EXP(mpq, mpq_class, mpq_class)
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+  return !(x == y);
+}
 
-template <typename Policy>
-inline Result
-abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
-  to = abs(from);
-  return V_EQ;
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e) {
+  return Grid_Generator::grid_line(e);
 }
 
-SPECIALIZE_ABS(mpq, mpq_class, mpq_class)
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+	  Coefficient_traits::const_reference d) {
+  return Grid_Generator::parameter(e, d);
+}
 
-template <typename Policy>
-inline Result
-add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
-	    Rounding_Dir) {
-  to += x * y;
-  return V_EQ;
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+	   Coefficient_traits::const_reference d) {
+  return Grid_Generator::grid_point(e, d);
 }
 
-SPECIALIZE_ADD_MUL(mpq, mpq_class, mpq_class, mpq_class)
+} // namespace Parma_Polyhedra_Library
 
-template <typename Policy>
-inline Result
-sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
-	    Rounding_Dir) {
-  to -= x * y;
-  return V_EQ;
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator& x,
+     Parma_Polyhedra_Library::Grid_Generator& y) {
+  x.swap(y);
 }
 
-SPECIALIZE_SUB_MUL(mpq, mpq_class, mpq_class, mpq_class)
+} // namespace std
 
-extern unsigned long rational_sqrt_precision_parameter;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator.defs.hh line 547
 
-template <typename Policy>
-inline Result
-sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
-  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
-    return set_special<Policy>(to, V_SQRT_NEG);
-  const unsigned long k = rational_sqrt_precision_parameter;
-  mpz_class& to_num = to.get_num();
-  mul2exp<Policy>(to_num, from.get_num(), 2*k, dir);
-  Result rdiv = div<Policy>(to_num, to_num, from.get_den(), dir);
-  Result rsqrt = sqrt<Policy>(to_num, to_num, dir);
-  mpz_class& to_den = to.get_den();
-  to_den = 1;
-  mul2exp<Policy>(to_den, to_den, k, dir);
-  to.canonicalize();
-  return rdiv != V_EQ ? rdiv : rsqrt;
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Generator_System.inlines.hh line 28
 
-SPECIALIZE_SQRT(mpq, mpq_class, mpq_class)
+namespace Parma_Polyhedra_Library {
 
-template <typename Policy>
-inline Result
-input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
-  Result r = input_mpq(to, is);
-  if (r == VC_MINUS_INFINITY)
-    return assign<Policy>(to, MINUS_INFINITY, dir);
-  if (r == VC_PLUS_INFINITY)
-    return assign<Policy>(to, PLUS_INFINITY, dir);
-  return set_special<Policy>(to, r);
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+  Generator_System::set_sorted(b);
 }
 
-template <typename Policy>
-inline Result
-output_mpq(std::ostream& os,
-	   const mpq_class& from,
-	   const Numeric_Format&,
-	   Rounding_Dir) {
-  os << from;
-  return V_EQ;
+inline void
+Grid_Generator_System::unset_pending_rows() {
+  Generator_System::unset_pending_rows();
 }
 
-SPECIALIZE_INPUT(mpq, mpq_class)
-SPECIALIZE_OUTPUT(mpq, mpq_class)
-
-inline memory_size_type
-external_memory_in_bytes(const mpq_class& x) {
-  return external_memory_in_bytes(x.get_num())
-    + external_memory_in_bytes(x.get_den());
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+  Generator_System::set_index_first_pending_row(i);
 }
 
-} // namespace Checked
+inline void
+Grid_Generator_System::resize_no_copy(const dimension_type new_num_rows,
+				      const dimension_type new_num_columns) {
+  Generator_System::resize_no_copy(new_num_rows, new_num_columns);
+}
 
-//! Returns the precision parameter used for rational square root calculations.
-inline unsigned
-rational_sqrt_precision_parameter() {
-  return Checked::rational_sqrt_precision_parameter;
+inline dimension_type
+Grid_Generator_System::num_columns() const {
+  return Generator_System::num_columns();
 }
 
-//! Sets the precision parameter used for rational square root calculations.
-/*!
-  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
-  precision parameter used for rational square root calculations to \p p.
+inline void
+Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
+  return Generator_System::erase_to_end(first_to_erase);
+}
 
-  \exception std::invalid_argument
-  Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
-*/
 inline void
-set_rational_sqrt_precision_parameter(const unsigned p) {
-  if (p <= INT_MAX)
-    Checked::rational_sqrt_precision_parameter = p;
-  else
-    throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(p)"
-				" with p > INT_MAX");
+Grid_Generator_System
+::permute_columns(const std::vector<dimension_type>& cycles) {
+  return Generator_System::permute_columns(cycles);
 }
 
-} // namespace Parma_Polyhedra_Library
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const {
+  return operator==(static_cast<const Generator_System&>(*this),
+		    static_cast<const Generator_System&>(y));
+}
 
-// Automatically generated from PPL source file ../src/checked_ext.inlines.hh line 1
-/* Checked extended arithmetic functions.
-*/
+inline
+Grid_Generator_System::Grid_Generator_System()
+  : Generator_System(NECESSARILY_CLOSED) {
+  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1);
+  set_sorted(false);
+}
 
-namespace Parma_Polyhedra_Library {
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+  : Generator_System(gs) {
+}
 
-namespace Checked {
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim)
+  : Generator_System(NECESSARILY_CLOSED) {
+  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1);
+  set_sorted(false);
+}
 
-#define handle_ext_natively(T) (Float<T>::fpu_related)
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
+  : Generator_System(g) {
+  set_sorted(false);
+}
 
-template <typename Policy, typename Type>
-inline Result
-sgn_ext(const Type& x) {
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x)))
-    return VC_NAN;
-  else if (is_minf<Policy>(x))
-    return V_LT;
-  else if (is_pinf<Policy>(x))
-    return V_GT;
-  else
-    return sgn<Policy>(x);
+inline
+Grid_Generator_System::~Grid_Generator_System() {
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-construct_ext(To& to, const From& from, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
-    return construct<To_Policy>(to, NOT_A_NUMBER, dir);
-  else if (is_minf<From_Policy>(from))
-    return construct<To_Policy>(to, MINUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(from))
-    return construct<To_Policy>(to, PLUS_INFINITY, dir);
-  else {
-  native:
-    return construct<To_Policy>(to, from, dir);
-  }
+inline Grid_Generator_System&
+Grid_Generator_System::operator=(const Grid_Generator_System& y) {
+  Generator_System::operator=(y);
+  return *this;
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-assign_ext(To& to, const From& from, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(from))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(from))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else {
-  native:
-    return assign<To_Policy>(to, from, dir);
-  }
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+  // Grid generators use an extra column for the parameter divisor.
+  return Generator_System::max_space_dimension() - 1;
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-neg_ext(To& to, const From& x, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
-  else {
-  native:
-    return neg<To_Policy>(to, x, dir);
-  }
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+  assert(Generator_System::space_dimension() > 0);
+  // Grid generators use an extra column for the parameter divisor.
+  return Generator_System::space_dimension() - 1;
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-abs_ext(To& to, const From& x, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else {
-  native:
-    return abs<To_Policy>(to, x, dir);
-  }
+inline const Grid_Generator_System&
+Grid_Generator_System::zero_dim_univ() {
+  assert(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From1_Policy>(x)) {
-    if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
-      goto inf_add_inf;
-    else
-      goto minf;
-  }
-  else if (is_pinf<From1_Policy>(x)) {
-    if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
-    inf_add_inf:
-      return set_special<To_Policy>(to, V_INF_ADD_INF);
-    }
-    else
-      goto pinf;
-  }
-  else {
-    if (is_minf<From2_Policy>(y)) {
-    minf:
-      return assign<To_Policy>(to, MINUS_INFINITY, dir);
-    }
-    else if (is_pinf<From2_Policy>(y)) {
-    pinf:
-      return assign<To_Policy>(to, PLUS_INFINITY, dir);
-    }
-    else {
-    native:
-      return add<To_Policy>(to, x, y, dir);
-    }
-  }
+inline void
+Grid_Generator_System::clear() {
+  Generator_System::clear();
+  // For grid generators, two extra columns are needed.
+  add_zero_columns(2);
+  set_sorted(false);
+  unset_pending_rows();
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From1_Policy>(x)) {
-    if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
-      goto inf_sub_inf;
-    else
-      goto minf;
-  }
-  else if (is_pinf<From1_Policy>(x)) {
-    if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
-    inf_sub_inf:
-      return set_special<To_Policy>(to, V_INF_SUB_INF);
-    }
-    else
-      goto pinf;
-  }
-  else {
-    if (is_pinf<From2_Policy>(y)) {
-    minf:
-      return assign<To_Policy>(to, MINUS_INFINITY, dir);
-    }
-    else if (is_minf<From2_Policy>(y)) {
-    pinf:
-      return assign<To_Policy>(to, PLUS_INFINITY, dir);
-    }
-    else {
-    native:
-      return sub<To_Policy>(to, x, y, dir);
-    }
-  }
+inline void
+Grid_Generator_System::swap(Grid_Generator_System& y) {
+  Generator_System::swap(y);
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  if (is_minf<From1_Policy>(x)) {
-    switch (sgn_ext<From2_Policy>(y)) {
-    case V_LT:
-      goto pinf;
-    case V_GT:
-      goto minf;
-    default:
-      goto inf_mul_zero;
-    }
-  }
-  else if (is_pinf<From1_Policy>(x)) {
-    switch (sgn_ext<From2_Policy>(y)) {
-    case V_LT:
-      goto minf;
-    case V_GT:
-      goto pinf;
-    default:
-      goto inf_mul_zero;
-    }
-  }
-  else {
-    if (is_minf<From2_Policy>(y)) {
-      switch (sgn<From1_Policy>(x)) {
-      case V_LT:
-	goto pinf;
-      case V_GT:
-	goto minf;
-      default:
-	goto inf_mul_zero;
-      }
-    } else if (is_pinf<From2_Policy>(y)) {
-      switch (sgn<From1_Policy>(x)) {
-      case V_LT:
-      minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
-      case V_GT:
-      pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
-	goto pinf;
-      default:
-      inf_mul_zero:
-	assert(To_Policy::check_inf_mul_zero);
-	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
-      }
-    }
-    else {
-    native:
-      return mul<To_Policy>(to, x, y, dir);
-    }
-  }
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+  return Generator_System::external_memory_in_bytes();
 }
 
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+  return Generator_System::total_memory_in_bytes();
+}
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
-      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  if (is_minf<From1_Policy>(x)) {
-    switch (sgn_ext<From2_Policy>(y)) {
-    case V_LT:
-      goto a_pinf;
-    case V_GT:
-      goto a_minf;
-    default:
-      goto inf_mul_zero;
-    }
-  }
-  else if (is_pinf<From1_Policy>(x)) {
-    switch (sgn_ext<From2_Policy>(y)) {
-    case V_LT:
-      goto a_minf;
-    case V_GT:
-      goto a_pinf;
-    default:
-      goto inf_mul_zero;
-    }
-  }
-  else {
-    if (is_minf<From2_Policy>(y)) {
-      switch (sgn<From1_Policy>(x)) {
-      case V_LT:
-	goto a_pinf;
-      case V_GT:
-	goto a_minf;
-      default:
-	goto inf_mul_zero;
-      }
-    } else if (is_pinf<From2_Policy>(y)) {
-      switch (sgn<From1_Policy>(x)) {
-      case V_LT:
-      a_minf:
-	if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
-	  goto inf_add_inf;
-	else
-	  goto minf;
-      case V_GT:
-      a_pinf:
-	if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
-	inf_add_inf:
-	  return set_special<To_Policy>(to, V_INF_ADD_INF);
-	}
-	else
-	  goto pinf;
-      default:
-      inf_mul_zero:
-	assert(To_Policy::check_inf_mul_zero);
-	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
-      }
-    }
-    else {
-      if (is_minf<To_Policy>(to)) {
-      minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
-      }
-      if (is_pinf<To_Policy>(to)) {
-      pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
-      }
-    native:
-      return add_mul<To_Policy>(to, x, y, dir);
-    }
-  }
+inline dimension_type
+Grid_Generator_System::num_rows() const {
+  return Generator_System::num_rows();
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
-      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  if (is_minf<From1_Policy>(x)) {
-    switch (sgn_ext<From2_Policy>(y)) {
-    case V_LT:
-      goto a_pinf;
-    case V_GT:
-      goto a_minf;
-    default:
-      goto inf_mul_zero;
-    }
-  }
-  else if (is_pinf<From1_Policy>(x)) {
-    switch (sgn_ext<From2_Policy>(y)) {
-    case V_LT:
-      goto a_minf;
-    case V_GT:
-      goto a_pinf;
-    default:
-      goto inf_mul_zero;
-    }
-  }
-  else {
-    if (is_minf<From2_Policy>(y)) {
-      switch (sgn<From1_Policy>(x)) {
-      case V_LT:
-	goto a_pinf;
-      case V_GT:
-	goto a_minf;
-      default:
-	goto inf_mul_zero;
-      }
-    } else if (is_pinf<From2_Policy>(y)) {
-      switch (sgn<From1_Policy>(x)) {
-      case V_LT:
-      a_minf:
-	if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
-	  goto inf_sub_inf;
-	else
-	  goto pinf;
-      case V_GT:
-      a_pinf:
-	if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
-	inf_sub_inf:
-	  return set_special<To_Policy>(to, V_INF_SUB_INF);
-	}
-	else
-	  goto minf;
-      default:
-      inf_mul_zero:
-	assert(To_Policy::check_inf_mul_zero);
-	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
-      }
-    }
-    else {
-      if (is_minf<To_Policy>(to)) {
-      minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
-      }
-      if (is_pinf<To_Policy>(to)) {
-      pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
-      }
-    native:
-      return sub_mul<To_Policy>(to, x, y, dir);
-    }
-  }
+inline dimension_type
+Grid_Generator_System::num_parameters() const {
+  return Generator_System::num_rays();
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  if (is_minf<From1_Policy>(x)) {
-    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
-		|| is_pinf<From2_Policy>(y)))
-      goto inf_div_inf;
-    else {
-      switch (sgn<From2_Policy>(y)) {
-      case V_LT:
-	goto pinf;
-      case V_GT:
-	goto minf;
-      default:
-	goto div_zero;
-      }
-    }
-  }
-  else if (is_pinf<From1_Policy>(x)) {
-    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
-		|| is_pinf<From2_Policy>(y))) {
-    inf_div_inf:
-      return set_special<To_Policy>(to, V_INF_DIV_INF);
-    }
-    else {
-      switch (sgn<From2_Policy>(y)) {
-      case V_LT:
-      minf:
-	return assign<To_Policy>(to, MINUS_INFINITY, dir);
-      case V_GT:
-      pinf:
-	return assign<To_Policy>(to, PLUS_INFINITY, dir);
-      default:
-      div_zero:
-	assert(To_Policy::check_div_zero);
-	return set_special<To_Policy>(to, V_DIV_ZERO);
-      }
-    }
-  }
-  else {
-    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
-      to = 0;
-      return V_EQ;
-    }
-    else {
-    native:
-      return div<To_Policy>(to, x, y, dir);
-    }
-  }
+inline dimension_type
+Grid_Generator_System::num_lines() const {
+  return Generator_System::num_lines();
 }
 
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+  : Generator_System::const_iterator() {
+}
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (handle_ext_natively(To)
-      && handle_ext_natively(From1)
-      && handle_ext_natively(From2))
-    goto native;
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
-		   || is_pinf<From1_Policy>(x)))
-    return set_special<To_Policy>(to, V_INF_MOD);
-  else {
-    if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
-      to = x;
-      return V_EQ;
-    }
-    else {
-    native:
-      return rem<To_Policy>(to, x, y, dir);
-    }
-  }
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : Generator_System::const_iterator(y) {
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(x))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else {
-  native:
-    return mul2exp<To_Policy>(to, x, exp, dir);
-  }
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(x))
-    return assign<To_Policy>(to, MINUS_INFINITY, dir);
-  else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else {
-  native:
-    return div2exp<To_Policy>(to, x, exp, dir);
-  }
+inline
+Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+  return static_cast<Grid_Generator_System::const_iterator&>
+    (Generator_System::const_iterator::operator=(y));
 }
 
-template <typename To_Policy, typename From_Policy,
-	  typename To, typename From>
-inline Result
-sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
-  if (handle_ext_natively(To) && handle_ext_natively(From))
-    goto native;
-  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From_Policy>(x))
-    return set_special<To_Policy>(to, V_SQRT_NEG);
-  else if (is_pinf<From_Policy>(x))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else {
-  native:
-    return sqrt<To_Policy>(to, x, dir);
-  }
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+  return static_cast<const Grid_Generator&>
+    (Generator_System::const_iterator::operator*());
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
-    return abs_ext<To_Policy, From2_Policy>(to, y, dir);
-  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
-    return abs_ext<To_Policy, From1_Policy>(to, x, dir);
-  else
-    return gcd<To_Policy>(to, x, y, dir);
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+  return static_cast<const Grid_Generator*>
+    (Generator_System::const_iterator::operator->());
 }
 
-template <typename To1_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To2_Policy, typename To3_Policy,
-	  typename To1, typename From1, typename From2, typename To2, typename To3>
-inline Result
-gcdext_ext(To1& to, const From1& x, const From2& y,
-	   To2& s, To3& t, Rounding_Dir dir) {
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To1_Policy>(to, VC_NAN);
-  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
-    s = 0;
-    t = y > 0 ? -1 : 1;
-    return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
-  }
-  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
-    s = x > 0 ? -1 : 1;
-    t = 0;
-    return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
-  }
-  else
-    return gcdext<To1_Policy>(to, x, y, s, t, dir);
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+  return static_cast<Grid_Generator_System::const_iterator&>
+    (Generator_System::const_iterator::operator++());
 }
 
-template <typename To_Policy, typename From1_Policy, typename From2_Policy,
-	  typename To, typename From1, typename From2>
-inline Result
-lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
-  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
-      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
-    return set_special<To_Policy>(to, VC_NAN);
-  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
-	   || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
-    return assign<To_Policy>(to, PLUS_INFINITY, dir);
-  else
-    return lcm<To_Policy>(to, x, y, dir);
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
-inline Result
-cmp_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return V_UNORD_COMP;
-  else if (is_minf<Policy1>(x))
-    return is_minf<Policy2>(y) ? V_EQ : V_LT;
-  else if (is_pinf<Policy1>(x))
-    return is_pinf<Policy2>(y) ? V_EQ : V_GT;
-  else {
-    if (is_minf<Policy2>(y))
-      return V_GT;
-    if (is_pinf<Policy2>(y))
-      return V_LT;
-  native:
-    return cmp<Policy1>(x, y);
-  }
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+  return Generator_System::const_iterator::operator==(y);
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
 inline bool
-lt_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
-    return false;
-  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
-    return true;
- native:
-  return x < y;
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+  return Generator_System::const_iterator::operator!=(y);
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
 inline bool
-gt_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
-    return false;
-  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
-    return true;
- native:
-  return x > y;
+Grid_Generator_System::empty() const {
+  return Generator_System::empty();
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
-inline bool
-le_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
-    return true;
-  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
-    return false;
- native:
-  return x <= y;
+inline
+Grid_Generator_System
+::const_iterator::const_iterator(const Generator_System::const_iterator& y)
+  : Generator_System::const_iterator::const_iterator(y) {
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
-inline bool
-ge_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
-    return true;
-  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
-    return false;
- native:
-  return x >= y;
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+  return static_cast<Grid_Generator_System::const_iterator>
+    (Generator_System::begin());
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
-inline bool
-eq_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return false;
-  if (is_minf<Policy1>(x))
-    return is_minf<Policy2>(y);
-  if (is_pinf<Policy1>(x))
-    return is_pinf<Policy2>(y);
- native:
-  return x == y;
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+  return static_cast<Grid_Generator_System::const_iterator>
+    (Generator_System::end());
 }
 
-template <typename Policy1, typename Policy2,
-	  typename Type1, typename Type2>
 inline bool
-ne_ext(const Type1& x, const Type2& y) {
-  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
-    goto native;
-  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
-      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
-    return true;
-  if (is_minf<Policy1>(x))
-    return !is_minf<Policy2>(y);
-  if (is_pinf<Policy1>(x))
-    return !is_pinf<Policy2>(y);
- native:
-  return x != y;
+Grid_Generator_System::has_points() const {
+  return Generator_System::has_points();
 }
 
-template <typename Policy, typename Type>
-inline Result
-output_ext(std::ostream& os, const Type& x,
-	   const Numeric_Format& format, Rounding_Dir dir) {
-  if (handle_ext_natively(Type))
-    goto native;
-  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))) {
-    os << "nan";
-    return VC_NAN;
-  }
-  if (is_minf<Policy>(x)) {
-    os << "-inf";
-    return V_EQ;
-  }
-  if (is_pinf<Policy>(x)) {
-    os << "+inf";
-    return V_EQ;
-  }
- native:
-  return output<Policy>(os, x, format, dir);
+inline Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) {
+  return static_cast<Grid_Generator&>(Generator_System::operator[](k));
 }
 
-template <typename To_Policy, typename To>
-inline Result
-input_ext(To& to, std::istream& is, Rounding_Dir dir) {
-  return input<To_Policy>(to, is, dir);
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+  return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
 }
 
-} // namespace Checked
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+	   const Grid_Generator_System& y) {
+  return x.is_equal_to(y);
+}
 
 } // namespace Parma_Polyhedra_Library
-// Automatically generated from PPL source file ../src/checked.defs.hh line 391
 
-// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 28
 
-namespace Parma_Polyhedra_Library {
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+     Parma_Polyhedra_Library::Grid_Generator_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Matrix.defs.hh line 1
+/* Bit_Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Matrix.defs.hh line 29
+#include <vector>
+#include <iosfwd>
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix of bits.
 /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Checked_Number_Transparent_Policy {
-  //! Checks for overflowed result.
-  static const int check_overflow = 0;
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Matrix {
+public:
+  //! Default constructor.
+  Bit_Matrix();
 
-  //! Checks for attempts to add infinities with different sign.
-  static const int check_inf_add_inf = 0;
+  //! Construct a bit matrix with \p n_rows rows and \p n_columns columns.
+  Bit_Matrix(dimension_type n_rows, dimension_type n_columns);
 
-  //! Checks for attempts to sub infinities with same sign.
-  static const int check_inf_sub_inf = 0;
+  //! Copy-constructor.
+  Bit_Matrix(const Bit_Matrix& y);
 
-  //! Checks for attempts to mul infinities by zero.
-  static const int check_inf_mul_zero = 0;
+  //! Destructor.
+  ~Bit_Matrix();
 
-  //! Checks for attempts to divide by zero.
-  static const int check_div_zero = 0;
+  //! Assignment operator.
+  Bit_Matrix& operator=(const Bit_Matrix& y);
 
-  //! Checks for attempts to divide infinities.
-  static const int check_inf_div_inf = 0;
+  //! Swaps \p *this with \p y.
+  void swap(Bit_Matrix& y);
 
-  //! Checks for attempts to compute remainder of infinities.
-  static const int check_inf_mod = 0;
+  //! Subscript operator.
+  Bit_Row& operator[](dimension_type k);
 
-  //! Checks for attempts to take the square root of a negative number.
-  static const int check_sqrt_neg = 0;
+  //! Constant subscript operator.
+  const Bit_Row& operator[](dimension_type k) const;
 
-  //! Handles not-a-number special value.
-  static const int handle_nan = 0;
+  //! Clears the matrix deallocating all its rows.
+  void clear();
 
-  //! Handles infinity special values.
-  static const int handle_infinity = 0;
+  //! Transposes the matrix.
+  void transpose();
 
-  //! Representation is identical to primitive.
-  static const int convertible = 1;
+  //! Makes \p *this a transposed copy of \p y.
+  void transpose_assign(const Bit_Matrix& y);
 
-  //! Checks for FPU inexact result.
-  static const int fpu_check_inexact = 0;
+  //! Returns the maximum number of rows of a Bit_Matrix.
+  static dimension_type max_num_rows();
 
-  //! Checks for NaN arguments
-  static const int check_nan_args = 0;
-  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
-  static void handle_result(Result r);
-};
+  //! Returns the number of columns of \p *this.
+  dimension_type num_columns() const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Checked_Number_Default_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 0;
-  static const int handle_infinity = 0;
-  static const int convertible = 1;
-  static const int fpu_check_inexact = 0;
-  static const int check_nan_args = 1;
-  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
-  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
-  static void handle_result(Result r);
-};
+  //! Returns the number of rows of \p *this.
+  dimension_type num_rows() const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-struct Extended_Number_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 1;
-  static const int handle_infinity = 1;
-  // Don't uncomment the following.
-  // The compile time error on conversions is the expected behaviour.
-  // static const int convertible = 0;
-#ifdef DEBUG_ROUND_NOT_NEEDED
-  static const int fpu_check_inexact = 1;
-#else
-  static const int fpu_check_inexact = 0;
+  //! Sorts the rows and removes duplicates.
+  void sort_rows();
+
+  //! Looks for \p row in \p *this, which is assumed to be sorted.
+  /*!
+    \return
+    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+    \param row
+    The row that will be searched for in the matrix.
+
+    Given a sorted bit matrix (this ensures better efficiency),
+    tells whether it contains the given row.
+  */
+  bool sorted_contains(const Bit_Row& row) const;
+
+  //! Adds \p row to \p *this.
+  void add_row(const Bit_Row& row);
+
+  //! Erases the rows from the \p first_to_erase -th to the last one.
+  void rows_erase_to_end(dimension_type first_to_erase);
+
+  //! Erases the columns from the \p first_to_erase -th to the last one.
+  void columns_erase_to_end(dimension_type first_to_erase);
+
+  //! Resizes the matrix copying the old contents.
+  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+  bool check_sorted() const;
 #endif
-  static const int check_nan_args = 1;
-  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
-  static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
-  // Don't uncomment the following.
-  // The compile time error is the expected behaviour.
-  // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
-  // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
-  // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
-  // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
-  // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
-  static void handle_result(Result r);
-};
 
-typedef Checked::Check_Overflow_Policy Default_To_Policy;
-typedef Checked_Number_Transparent_Policy Default_From_Policy;
+private:
+  //! Contains the rows of the matrix.
+  std::vector<Bit_Row> rows;
 
-template <typename T>
-struct Native_Checked_From_Wrapper {
-  typedef Default_From_Policy Policy;
-  static const T& raw_value(const T& v) {
-    return v;
-  }
-};
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
 
-template <typename T, typename P>
-struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
-  typedef P Policy;
-  static const T& raw_value(const Checked_Number<T, P>& v) {
-    return v.raw_value();
-  }
-};
+  //! Ordering predicate (used when implementing the sort algorithm).
+  /*! \ingroup PPL_CXX_interface */
+  struct Bit_Row_Less_Than {
+    bool operator()(const Bit_Row& x, const Bit_Row& y) const;
+  };
 
-template <typename T>
-struct Native_Checked_To_Wrapper {
-  typedef Default_To_Policy Policy;
-  static T& raw_value(T& v) {
-    return v;
-  }
-};
+  friend
+  void Parma_Polyhedra_Library::
+  Linear_System::sort_and_remove_with_sat(Bit_Matrix& sat);
 
-template <typename T, typename P>
-struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
-  typedef P Policy;
-  static T& raw_value(Checked_Number<T, P>& v) {
-    return v.raw_value();
-  }
 };
 
-//! A wrapper for numeric types implementing a given policy.
-/*! \ingroup PPL_CXX_interface
-  The wrapper and related functions implement an interface which is common
-  to all kinds of coefficient types, therefore allowing for a uniform
-  coding style. This class also implements the policy encoded by the
-  second template parameter. The default policy is to perform the detection
-  of overflow errors.
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Matrix& x, const Bit_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Matrix& x, const Bit_Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Bit_Matrix& x,
+	  Parma_Polyhedra_Library::Bit_Matrix& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Matrix.inlines.hh line 1
+/* Bit_Matrix class implementation: inline functions.
 */
-template <typename T, typename Policy>
-class Checked_Number {
-public:
 
-  //! \name Constructors
-  //@{
 
-  //! Default constructor.
-  Checked_Number();
+#include <algorithm>
+#include <cassert>
 
-  //! Copy-constructor.
-  Checked_Number(const Checked_Number& y);
+namespace Parma_Polyhedra_Library {
 
-  //! Direct initialization from a Checked_Number and rounding mode.
-  template <typename From, typename From_Policy>
-  Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+inline
+Bit_Matrix::Bit_Matrix()
+  : rows(),
+    row_size(0) {
+}
 
-  //! Direct initialization from a signed char and rounding mode.
-  Checked_Number(const signed char y, Rounding_Dir dir);
+inline dimension_type
+Bit_Matrix::max_num_rows() {
+  return std::vector<Bit_Row>().max_size();
+}
 
-  //! Direct initialization from a signed short and rounding mode.
-  Checked_Number(const signed short y, Rounding_Dir dir);
+inline
+Bit_Matrix::Bit_Matrix(const dimension_type n_rows,
+		       const dimension_type n_columns)
+  : rows(n_rows),
+    row_size(n_columns) {
+}
 
-  //! Direct initialization from a signed int and rounding mode.
-  Checked_Number(const signed int y, Rounding_Dir dir);
+inline
+Bit_Matrix::Bit_Matrix(const Bit_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size) {
+}
 
-  //! Direct initialization from a signed long and rounding mode.
-  Checked_Number(const signed long y, Rounding_Dir dir);
+inline
+Bit_Matrix::~Bit_Matrix() {
+}
 
-  //! Direct initialization from a signed long long and rounding mode.
-  Checked_Number(const signed long long y, Rounding_Dir dir);
+inline void
+Bit_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
+  // The first row to be erased cannot be greater
+  // than the actual number of the rows of the matrix.
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+  assert(OK());
+}
 
-  //! Direct initialization from an unsigned char and rounding mode.
-  Checked_Number(const unsigned char y, Rounding_Dir dir);
+inline void
+Bit_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
+  // The first column to be erased cannot be greater
+  // than the actual number of the columns of the matrix.
+  assert(first_to_erase <= row_size);
+  row_size = first_to_erase;
+  assert(OK());
+}
 
-  //! Direct initialization from an unsigned short and rounding mode.
-  Checked_Number(const unsigned short y, Rounding_Dir dir);
+inline void
+Bit_Matrix::swap(Bit_Matrix& y) {
+  std::swap(row_size, y.row_size);
+  std::swap(rows, y.rows);
+}
 
-  //! Direct initialization from an unsigned int and rounding mode.
-  Checked_Number(const unsigned int y, Rounding_Dir dir);
+inline Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
 
-  //! Direct initialization from an unsigned long and rounding mode.
-  Checked_Number(const unsigned long y, Rounding_Dir dir);
+inline const Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
 
-  //! Direct initialization from an unsigned long long and rounding mode.
-  Checked_Number(const unsigned long long y, Rounding_Dir dir);
+inline dimension_type
+Bit_Matrix::num_columns() const {
+  return row_size;
+}
 
-#if PPL_SUPPORTED_FLOAT
-  //! Direct initialization from a float and rounding mode.
-  Checked_Number(const float y, Rounding_Dir dir);
-#endif
+inline dimension_type
+Bit_Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline void
+Bit_Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Bit_Row>().swap(rows);
+  row_size = 0;
+}
+
+inline memory_size_type
+Bit_Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Bit_Matrix::Bit_Row_Less_Than::
+operator()(const Bit_Row& x, const Bit_Row& y) const {
+  return compare(x, y) < 0;
+}
+
+inline bool
+Bit_Matrix::sorted_contains(const Bit_Row& row) const {
+  assert(check_sorted());
+  return std::binary_search(rows.begin(), rows.end(), row,
+			    Bit_Row_Less_Than());
+}
+
+/*! \relates Bit_Matrix */
+inline bool
+operator!=(const Bit_Matrix& x, const Bit_Matrix& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Bit_Matrix& x,
+     Parma_Polyhedra_Library::Bit_Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Bit_Matrix.defs.hh line 178
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.defs.hh line 50
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Polyhedron
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+  <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+  a minimized system of constraints defining \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same polyhedron.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different polyhedra.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Polyhedron represents a convex polyhedron
+  in the vector space \f$\Rset^n\f$.
+
+  A polyhedron can be specified as either a finite system of constraints
+  or a finite system of generators (see Section \ref representation)
+  and it is always possible to obtain either representation.
+  That is, if we know the system of constraints, we can obtain
+  from this the system of generators that define the same polyhedron
+  and vice versa.
+  These systems can contain redundant members: in this case we say
+  that they are not in the minimal form.
+
+  Two key attributes of any polyhedron are its topological kind
+  (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+  and its space dimension (the dimension \f$n \in \Nset\f$ of
+  the enclosing vector space):
+
+  - all polyhedra, the empty ones included, are endowed with
+    a specific topology and space dimension;
+  - most operations working on a polyhedron and another object
+    (i.e., another polyhedron, a constraint or generator,
+    a set of variables, etc.) will throw an exception if
+    the polyhedron and the object are not both topology-compatible
+    and dimension-compatible (see Section \ref representation);
+  - the topology of a polyhedron cannot be changed;
+    rather, there are constructors for each of the two derived classes
+    that will build a new polyhedron with the topology of that class
+    from another polyhedron from either class and any topology;
+  - the only ways in which the space dimension of a polyhedron can
+    be changed are:
+    - <EM>explicit</EM> calls to operators provided for that purpose;
+    - standard copy, assignment and swap operators.
+
+  Note that four different polyhedra can be defined on
+  the zero-dimension space:
+  the empty polyhedron, either closed or NNC,
+  and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
 
-#if PPL_SUPPORTED_DOUBLE
-  //! Direct initialization from a double and rounding mode.
-  Checked_Number(const double y, Rounding_Dir dir);
-#endif
+  \par Example 1
+  The following code builds a polyhedron corresponding to
+  a square in \f$\Rset^2\f$, given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from a system of generators specifying
+  the four vertices of the square:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+  \endcode
 
-#if PPL_SUPPORTED_LONG_DOUBLE
-  //! Direct initialization from a long double and rounding mode.
-  Checked_Number(const long double y, Rounding_Dir dir);
-#endif
+  \par Example 2
+  The following code builds an unbounded polyhedron
+  corresponding to a half-strip in \f$\Rset^2\f$,
+  given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the system of generators specifying
+  the two vertices of the polyhedron and one ray:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + y));
+  gs.insert(ray(x - y));
+  C_Polyhedron ph(gs);
+  \endcode
 
-  //! Direct initialization from a rational and rounding mode.
-  Checked_Number(const mpq_class& y, Rounding_Dir dir);
+  \par Example 3
+  The following code builds the polyhedron corresponding to
+  a half-plane by adding a single constraint
+  to the universe polyhedron in \f$\Rset^2\f$:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(y >= 0);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the empty polyhedron in the space \f$\Rset^2\f$
+  and inserting the appropriate generators
+  (a point, a ray and a line).
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(ray(y));
+  ph.add_generator(line(x));
+  \endcode
+  Note that, although the above polyhedron has no vertices, we must add
+  one point, because otherwise the result of the Minkowski's sum
+  would be an empty polyhedron.
+  To avoid subtle errors related to the minimization process,
+  it is required that the first generator inserted in an empty
+  polyhedron is a point (otherwise, an exception is thrown).
 
-  //! Direct initialization from an unbounded integer and rounding mode.
-  Checked_Number(const mpz_class& y, Rounding_Dir dir);
+  \par Example 4
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality constraint,
+  thus obtaining the polyhedron corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting polyhedron is
+  \f[
+    \bigl\{\,
+      (2, y)^\transpose \in \Rset^2
+    \bigm|
+      y \in \Rset
+    \,\bigr\}.
+  \f]
 
-  //! Direct initialization from a C string and rounding mode.
-  Checked_Number(const char* y, Rounding_Dir dir);
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting polyhedron is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
 
-  //! Direct initialization from minus infinity and rounding mode.
-  Checked_Number(const Minus_Infinity& y, Rounding_Dir dir);
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(point(0*x + 3*y));
+  ph.add_generator(point(3*x + 0*y));
+  ph.add_generator(point(3*x + 3*y));
+  Linear_Expression expr = x + 4;
+  ph.affine_image(x, expr);
+  \endcode
+  In this example the starting polyhedron is a square in
+  \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+  expression is \f$x+4\f$.  The resulting polyhedron is the same
+  square translated to the right.  Moreover, if the affine
+  transformation for the same variable \p x is \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a diagonal of the square.
 
-  //! Direct initialization from plus infinity and rounding mode.
-  Checked_Number(const Plus_Infinity& y, Rounding_Dir dir);
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y >= 0);
+  ph.add_constraint(y <= 3);
+  Linear_Expression expr = x + 4;
+  ph.affine_preimage(x, expr);
+  \endcode
+  In this example the starting polyhedron, \p var and the affine
+  expression and the denominator are the same as in Example 6,
+  while the resulting polyhedron is again the same square,
+  but translated to the left.
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x+y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
 
-  //! Direct initialization from NAN and rounding mode.
-  Checked_Number(const Not_A_Number& y, Rounding_Dir dir);
+  \par Example 8
+  For this example we use also the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Generator_System gs;
+  gs.insert(point(3*x + y +0*z + 2*w));
+  C_Polyhedron ph(gs);
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  ph.remove_space_dimensions(to_be_removed);
+  \endcode
+  The starting polyhedron is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting polyhedron is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> to_be_removed1;
+  to_be_removed1.insert(y);
+  ph.remove_space_dimensions(to_be_removed1);
+  set<Variable> to_be_removed2;
+  to_be_removed2.insert(z);
+  ph.remove_space_dimensions(to_be_removed2);
+  \endcode
+  In this case, the result is the polyhedron
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p to_be_removed2
+  we are actually removing variable \f$w\f$ of the original polyhedron.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
 
-  //! Direct initialization from a Checked_Number, default rounding mode.
-  template <typename From, typename From_Policy>
-  explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
 
-  //! Direct initialization from a signed char, default rounding mode.
-  Checked_Number(const signed char y);
+  //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+  static dimension_type max_space_dimension();
 
-  //! Direct initialization from a signed short, default rounding mode.
-  Checked_Number(const signed short y);
+  /*! \brief
+    Returns \c true indicating that this domain has methods that
+    can recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
 
-  //! Direct initialization from a signed int, default rounding mode.
-  Checked_Number(const signed int y);
+  //! Initializes the class.
+  static void initialize();
 
-  //! Direct initialization from a signed long, default rounding mode.
-  Checked_Number(const signed long y);
+  //! Finalizes the class.
+  static void finalize();
 
-  //! Direct initialization from a signed long long, default rounding mode.
-  Checked_Number(const signed long long y);
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
 
-  //! Direct initialization from an unsigned char, default rounding mode.
-  Checked_Number(const unsigned char y);
+protected:
+  //! Builds a polyhedron having the specified properties.
+  /*!
+    \param topol
+    The topology of the polyhedron;
 
-  //! Direct initialization from an unsigned short, default rounding mode.
-  Checked_Number(const unsigned short y);
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the polyhedron;
 
-  //! Direct initialization from an unsigned int, default rounding mode.
-  Checked_Number(const unsigned int y);
+    \param kind
+    Specifies whether the universe or the empty polyhedron has to be built.
+  */
+  Polyhedron(Topology topol,
+	     dimension_type num_dimensions,
+	     Degenerate_Element kind);
 
-  //! Direct initialization from an unsigned long, default rounding mode.
-  Checked_Number(const unsigned long y);
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Polyhedron(const Polyhedron& y,
+             Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Direct initialization from an unsigned long long, default rounding mode.
-  Checked_Number(const unsigned long long y);
+  //! Builds a polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
 
-  //! Direct initialization from a float, default rounding mode.
-  Checked_Number(const float y);
+    \param topol
+    The topology of the polyhedron;
 
-  //! Direct initialization from a double, default rounding mode.
-  Checked_Number(const double y);
+    \param cs
+    The system of constraints defining the polyhedron.
 
-  //! Direct initialization from a long double, default rounding mode.
-  Checked_Number(const long double y);
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, const Constraint_System& cs);
 
-  //! Direct initialization from a rational, default rounding mode.
-  Checked_Number(const mpq_class& y);
+  //! Builds a polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
 
-  //! Direct initialization from an unbounded integer, default rounding mode.
-  Checked_Number(const mpz_class& y);
+    \param topol
+    The topology of the polyhedron;
 
-  //! Direct initialization from a C string, default rounding mode.
-  Checked_Number(const char* y);
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
 
-  //! Direct initialization from minus infinity, default rounding mode.
-  Checked_Number(const Minus_Infinity& y);
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-  //! Direct initialization from plus infinity, default rounding mode.
-  Checked_Number(const Plus_Infinity& y);
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, Constraint_System& cs, Recycle_Input dummy);
 
-  //! Direct initialization from NAN, default rounding mode.
-  Checked_Number(const Not_A_Number& y);
+  //! Builds a polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
 
-  //@} // Constructors
+    \param topol
+    The topology of the polyhedron;
 
-  //! \name Accessors and Conversions
-  //@{
+    \param gs
+    The system of generators defining the polyhedron.
 
-  //! Conversion operator: returns a copy of the underlying numeric value.
-  operator T() const;
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, const Generator_System& gs);
 
-  //! Returns a reference to the underlying numeric value.
-  T& raw_value();
+  //! Builds a polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
 
-  //! Returns a const reference to the underlying numeric value.
-  const T& raw_value() const;
+    \param topol
+    The topology of the polyhedron;
 
-  //@} // Accessors and Conversions
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-  //! Classifies *this.
-  /*!
-    Returns the appropriate Result characterizing:
-    - whether \p *this is NAN,
-      if \p nan is <CODE>true</CODE>;
-    - whether \p *this is a (positive or negative) infinity,
-      if \p inf is <CODE>true</CODE>;
-    - the sign of \p *this,
-      if \p sign is <CODE>true</CODE>.
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
   */
-  Result classify(bool nan = true, bool inf = true, bool sign = true) const;
-
-  //! \name Assignment Operators
-  //@{
+  Polyhedron(Topology topol, Generator_System& gs, Recycle_Input dummy);
 
-  //! Assignment operator.
-  Checked_Number& operator=(const Checked_Number& y);
+  //! Builds a polyhedron from a box.
+  /*!
+    This will use an algorithm whose complexity is polynomial and build
+    the smallest polyhedron with topology \p topol containing \p box.
 
-  //! Assignment operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator=(const Checked_Number<From, From_Policy>& y);
+    \param topol
+    The topology of the polyhedron;
 
-  //! Assignment operator.
-  template <typename From>
-  Checked_Number& operator=(const From& y);
+    \param box
+    The box representing the polyhedron to be built;
 
-  //! Assignment operator.
-  Checked_Number& operator=(const Not_A_Number& y);
+    \param complexity
+    This argument is ignored.
+  */
+  template <typename Interval>
+  Polyhedron(Topology topol, const Box<Interval>& box,
+             Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Assignment operator.
-  Checked_Number& operator=(const Minus_Infinity& y);
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Polyhedron& operator=(const Polyhedron& y);
 
-  //! Assignment operator.
-  Checked_Number& operator=(const Plus_Infinity& y);
+public:
+  //! \name Member Functions that Do Not Modify the Polyhedron
+  //@{
 
-  //! Add and assign operator.
-  template <typename From_Policy>
-  Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-  //! Add and assign operator.
-  Checked_Number& operator+=(const T& y);
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
 
-  //! Add and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator+=(const Checked_Number<From, From_Policy>& y);
+  //! Returns the system of constraints.
+  const Constraint_System& constraints() const;
 
-  template <typename From>
-  Checked_Number& operator+=(const From& y);
+  //! Returns the system of constraints, with no redundant constraint.
+  const Constraint_System& minimized_constraints() const;
 
-  //! Subtract and assign operator.
-  template <typename From_Policy>
-  Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+  //! Returns the system of generators.
+  const Generator_System& generators() const;
 
-  //! Subtract and assign operator.
-  Checked_Number& operator-=(const T& y);
+  //! Returns the system of generators, with no redundant generator.
+  const Generator_System& minimized_generators() const;
 
-  //! Subtract and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator-=(const Checked_Number<From, From_Policy>& y);
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
 
-  //! Subtract and assign operator.
-  template <typename From>
-  Checked_Number& operator-=(const From& y);
+  /*! \brief
+    Returns a system of (equality) congruences satisfied by \p *this,
+    with no redundant congruences and having the same affine dimension
+    as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
 
-  //! Multiply and assign operator.
-  template <typename From_Policy>
-  Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+  //! Returns a universe system of grid generators.
+  Grid_Generator_System grid_generators() const;
 
-  //! Multiply and assign operator.
-  Checked_Number& operator*=(const T& y);
-  template <typename From, typename From_Policy>
+  //! Returns a universe system of grid generators.
+  Grid_Generator_System minimized_grid_generators() const;
 
-  //! Multiply and assign operator.
-  Checked_Number& operator*=(const Checked_Number<From, From_Policy>& y);
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the constraint \p c.
 
-  //! Multiply and assign operator.
-  template <typename From>
-  Checked_Number& operator*=(const From& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
 
-  //! Divide and assign operator.
-  template <typename From_Policy>
-  Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the generator \p g.
 
-  //! Divide and assign operator.
-  Checked_Number& operator/=(const T& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
 
-  //! Divide and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator/=(const Checked_Number<From, From_Policy>& y);
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the congruence \p c.
 
-  //! Divide and assign operator.
-  template <typename From>
-  Checked_Number& operator/=(const From& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
 
-  //! Compute remainder and assign operator.
-  template <typename From_Policy>
-  Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty polyhedron.
+  */
+  bool is_empty() const;
 
-  //! Compute remainder and assign operator.
-  Checked_Number& operator%=(const T& y);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe polyhedron.
+  */
+  bool is_universe() const;
 
-  //! Compute remainder and assign operator.
-  template <typename From, typename From_Policy>
-  Checked_Number& operator%=(const Checked_Number<From, From_Policy>& y);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
 
-  //! Compute remainder and assign operator.
-  template <typename From>
-  Checked_Number& operator%=(const From& y);
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Polyhedron& y) const;
 
-  //@} // Assignment Operators
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
 
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded polyhedron.
+  */
+  bool is_bounded() const;
 
-  //! \name Increment and Decrement Operators
-  //@{
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
 
-  //! Pre-increment operator.
-  Checked_Number& operator++();
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
 
-  //! Post-increment operator.
-  Checked_Number  operator++(int);
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
 
-  //! Pre-decrement operator.
-  Checked_Number& operator--();
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
 
-  //! Post-decrement operator.
-  Checked_Number  operator--(int);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
 
-  //@} // Increment and Decrement Operators
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
 
-private:
-  //! The underlying numeric value.
-  T v;
-};
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
 
-template <typename T, typename Policy>
-bool is_not_a_number(const Checked_Number<T, Policy>& x);
-template <typename T, typename Policy>
-bool is_minus_infinity(const Checked_Number<T, Policy>& x);
-template <typename T, typename Policy>
-bool is_plus_infinity(const Checked_Number<T, Policy>& x);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
 
-template <typename To>
-Result assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir);
-template <typename To>
-Result assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir);
-template <typename To>
-Result assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir);
-template <typename To>
-Result assign_r(To& to, const char* x, Rounding_Dir dir);
-template <typename To, typename To_Policy>
-Result assign_r(To& to, char* x, Rounding_Dir dir);
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-#define FUNC1(name) \
-template <typename To, typename From> \
-Result name(To& to, const From& x, Rounding_Dir dir);
+    \param sup_n
+    The numerator of the supremum value;
 
-FUNC1(assign_r)
-FUNC1(neg_assign_r)
-FUNC1(abs_assign_r)
-FUNC1(sqrt_assign_r)
+    \param sup_d
+    The denominator of the supremum value;
 
-#undef FUNC1
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
 
-#define FUNC1(name) \
-template <typename To, typename From> \
-Result name(To& to, const From& x, int exp, Rounding_Dir dir);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-FUNC1(mul2exp_assign_r)
-FUNC1(div2exp_assign_r)
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
 
-#undef FUNC1
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
 
-#define FUNC2(name) \
-template <typename To, typename From1, typename From2> \
-Result name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-FUNC2(add_assign_r)
-FUNC2(sub_assign_r)
-FUNC2(mul_assign_r)
-FUNC2(div_assign_r)
-FUNC2(rem_assign_r)
-FUNC2(gcd_assign_r)
-FUNC2(lcm_assign_r)
-FUNC2(add_mul_assign_r)
-FUNC2(sub_mul_assign_r)
+    \param sup_n
+    The numerator of the supremum value;
 
-#undef FUNC2
+    \param sup_d
+    The denominator of the supremum value;
 
-#define FUNC4(name) \
-template <typename To1, typename From1, typename From2,		\
-	  typename To2, typename To3>				\
-Result name(To1& to, const From1& x, const From2& y,		\
-	    To2& s, To3& t, Rounding_Dir dir);
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
 
-FUNC4(gcdext_assign_r)
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
 
-#undef FUNC4
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-//! Swaps \p *this with \p y.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& g) const;
 
-//! \name Accessor Functions
-//@{
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
 
-//! Returns a const reference to the underlying native integer value.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-const T&
-raw_value(const Checked_Number<T, Policy>& x);
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-//! Returns a reference to the underlying native integer value.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-T&
-raw_value(Checked_Number<T, Policy>& x);
+    \param inf_n
+    The numerator of the infimum value;
 
-//@} // Accessor Functions
+    \param inf_d
+    The denominator of the infimum value;
 
-//! \name Memory Size Inspection Functions
-//@{
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
 
-//! Returns the total size in bytes of the memory occupied by \p x.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-size_t
-total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-//! Returns the size in bytes of the memory managed by \p x.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-size_t
-external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
 
-//@} // Memory Size Inspection Functions
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
 
-//! \name Arithmetic Operators
-//@{
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-//! Unary plus operator.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-Checked_Number<T, Policy>
-operator+(const Checked_Number<T, Policy>& x);
+    \param inf_n
+    The numerator of the infimum value;
 
-//! Unary minus operator.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-Checked_Number<T, Policy>
-operator-(const Checked_Number<T, Policy>& x);
+    \param inf_d
+    The denominator of the infimum value;
 
-//! Assigns to \p x its negation.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void
-neg_assign(Checked_Number<T, Policy>& x);
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
 
-//! Assigns to \p x the value <CODE>x + y * z</CODE>.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void
-add_mul_assign(Checked_Number<T, Policy>& x,
-	       const Checked_Number<T, Policy>& y,
-	       const Checked_Number<T, Policy>& z);
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
 
-//! Assigns to \p x the value <CODE>x - y * z</CODE>.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void
-sub_mul_assign(Checked_Number<T, Policy>& x,
-	       const Checked_Number<T, Policy>& y,
-	       const Checked_Number<T, Policy>& z);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-//! Assigns to \p x the greatest common divisor of \p y and \p z.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void
-gcd_assign(Checked_Number<T, Policy>& x,
-	   const Checked_Number<T, Policy>& y,
-	   const Checked_Number<T, Policy>& z);
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& g) const;
 
-/*! \brief
-  Assigns to \p x the greatest common divisor of \p y and \p z,
-  setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
-*/
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void
-gcdext_assign(Checked_Number<T, Policy>& x,
-	      const Checked_Number<T, Policy>& y,
-	      const Checked_Number<T, Policy>& z,
-	      Checked_Number<T, Policy>& s,
-	      Checked_Number<T, Policy>& t);
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Polyhedron& y) const;
 
-//! Assigns to \p x the least common multiple of \p y and \p z.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void
-lcm_assign(Checked_Number<T, Policy>& x,
-	   const Checked_Number<T, Policy>& y,
-	   const Checked_Number<T, Policy>& z);
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Polyhedron& y) const;
 
-/*! \brief
-  If \p z divides \p y, assigns to \p x the quotient of the integer
-  division of \p y and \p z.
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
 
-  \relates Checked_Number
-  The behavior is undefined if \p z does not divide \p y.
-*/
-template <typename T, typename Policy>
-void
-exact_div_assign(Checked_Number<T, Policy>& x,
-		 const Checked_Number<T, Policy>& y,
-		 const Checked_Number<T, Policy>& z);
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
 
-//! Assigns to \p x the integer square root of \p y.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-void sqrt_assign(Checked_Number<T, Policy>& x,
-		 const Checked_Number<T, Policy>& y);
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
 
-//@} // Arithmetic Operators
+  //@} // Member Functions that Do Not Modify the Polyhedron
 
+  //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+  //@{
 
-//! \name Relational Operators and Comparison Functions
-//@{
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
 
-//! Equality operator.
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator==(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+    \param c
+    The constraint that will be added to the system of
+    constraints of \p *this.
 
-//! Disequality operator.
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator!=(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
 
-//! Greater than or equal to operator.
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator>=(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this, minimizing the result
 
-//! Greater than operator.
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator>(const Checked_Number<T1, Policy1>& x,
-	  const Checked_Number<T2, Policy2>& y);
+    \param c
+    The constraint that will be added to the system of
+    constraints of \p *this.
 
-//! Less than or equal to operator.
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator<=(const Checked_Number<T1, Policy1>& x,
-	   const Checked_Number<T2, Policy2>& y);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-//! Less than operator.
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-bool
-operator<(const Checked_Number<T1, Policy1>& x,
-	  const Checked_Number<T2, Policy2>& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
 
-/*! \brief
-  Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
-  of \p x is negative, zero or positive, respectively.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
 
-  \relates Checked_Number
-*/
-template <typename T, typename Policy>
-int
-sgn(const Checked_Number<T, Policy>& x);
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
 
-/*! \brief
-  Returns a negative, zero or positive value depending on whether
-  \p x is lower than, equal to or greater than \p y, respectively.
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  void add_generator(const Generator& g);
 
-  \relates Checked_Number
-*/
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-int
-cmp(const Checked_Number<T1, Policy1>& x,
-    const Checked_Number<T2, Policy2>& y);
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this, minimizing the result.
 
-//@} // Relational Operators and Comparison Functions
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-//! \name Input-Output Operators
-//@{
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-Result
-output(std::ostream& os,
-       const Checked_Number<T, Policy>& x,
-       const Numeric_Format& fmt,
-       Rounding_Dir dir);
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_generator_and_minimize(const Generator& g);
 
-//! Output operator.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-std::ostream&
-operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+  //! Domain compatibility method.
+  void add_grid_generator(const Grid_Generator& g) const;
 
-//! Input function.
-/*!
-  \relates Checked_Number
+  //! Returns <CODE>true</CODE> if \p *this is empty else <CODE>false</CODE>.
+  /*!
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_grid_generator_and_minimize(const Grid_Generator& g) const;
 
-  \param is
-  Input stream to read from;
+  /*! \brief
+    Adds a copy of congruence \p cg to \p *this,
+    if \p cg can be exactly represented by a polyhedron.
 
-  \param x
-  Number (possibly extended) to assign to in case of successful reading;
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    of if \p cg is a proper congruence which is neither a tautology,
+    nor a contradiction
+  */
+  void add_congruence(const Congruence& cg);
 
-  \param dir
-  Rounding mode to be applied.
+  /*! \brief
+    Adds a copy of congruence \p cg to \p *this,
+    if \p cg can be exactly represented by a polyhedron,
+    minimizing the result.
 
-  \return
-  Result of the input operation.  Success, success with imprecision,
-  overflow, parsing error: all possibilities are taken into account,
-  checked for, and properly reported.
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  This function attempts reading a (possibly extended) number from the given
-  stream \p is, possibly rounding as specified by \p dir, assigning the result
-  to \p x upon success, and returning the appropriate Result.
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    of if \p cg is a proper congruence which is neither a tautology,
+    nor a contradiction
 
-  The input syntax allows the specification of:
-  - plain base-10 integer numbers as <CODE>34976098</CODE>,
-    <CODE>-77</CODE> and <CODE>+13</CODE>;
-  - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
-    and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
-    <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
-  - base-10 rational numbers in fraction notation as
-    <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
-  - base-10 rational numbers in fraction/scientific notation as
-    <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
-    (meaning \f$3/580000\f$);
-  - base-10 rational numbers in floating point notation as
-    <CODE>71.3</CODE> (meaning \f$713/10\f$) and
-    <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
-  - base-10 rational numbers in floating point scientific notation as
-    <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
-    (meaning \f$-220001/100\f$);
-  - integers and rationals (in fractional, floating point and scientific
-    notations) specified by using Mathematica-style bases, in the range
-    from 2 to 36, as
-    <CODE>2^^11</CODE> (meaning \f$3\f$),
-    <CODE>36^^z</CODE> (meaning \f$35\f$),
-    <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
-    <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
-    <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
-    <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
-    <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
-    <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
-    <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
-    note that the base and the exponent are always written as plain
-    base-10 integer numbers; also, when an ambiguity may arise, the
-    character <CODE>e</CODE> is interpreted as a digit, so that
-    <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
-    <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
-  - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
-    the Mathematica-style prefix <CODE>16^^</CODE>;
-  - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
-    (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
-    and <CODE>nan</CODE> (meaning "not a number").
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Congruence& cg);
 
-  The rationale behind the accepted syntax can be summarized as follows:
-  - if the syntax is accepted by Mathematica, then this function
-    accepts it with the same semantics;
-  - if the syntax is acceptable as standard C++ integer or floating point
-    literal (except for octal notation and type suffixes, which are not
-    supported), then this function accepts it with the same semantics;
-  - natural extensions of the above are accepted with the natural
-    extensions of the semantics;
-  - special values are accepted.
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
 
-  Valid syntax is more formally and completely specified by the
-  following grammar, with the additional provisos that everything is
-  <EM>case insensitive</EM>, that the syntactic category
-  <CODE>BDIGIT</CODE> is further restricted by the current base
-  and that for all bases above 14, any <CODE>e</CODE> is always
-  interpreted as a digit and never as a delimiter for the exponent part
-  (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
 
-\code
-number	: NAN					INF	: 'inf'
-	| SIGN INF					;
-	| INF
-	| num					NAN	: 'nan'
-	| num DIV num					;
-	;
-						SIGN	: '-'
-num     : unum						| '+'
-        | SIGN unum					;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
 
-unum	: unum1					EXP	: 'e'
-	| HEX unum1					| '*^'
-	| base BASE unum1				;
-	;
-						POINT	: '.'
-unum1	: mantissa					;
-	| mantissa EXP exponent
-	;					DIV	: '/'
-							;
-mantissa: bdigits
-        | POINT bdigits				MINUS	: '-'
-	| bdigits POINT					;
-	| bdigits POINT bdigits
-	;					PLUS	: '+'
-						;
-exponent: SIGN digits
-	| digits				HEX	: '0x'
-	;					;
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
 
-bdigits : BDIGIT				BASE	: '^^'
-	| bdigits BDIGIT				;
-	;
-						DIGIT   : '0' .. '9'
-digits  : DIGIT						;
-	| digits DIGIT
-	;					BDIGIT  : '0' .. '9'
-							| 'a' .. 'z'
-							;
-\endcode
-*/
-template <typename T, typename Policy>
-Result
-input(std::istream& is, Checked_Number<T, Policy>& x, Rounding_Dir dir);
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
 
-//! Input operator.
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-std::istream&
-operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
 
-//@} // Input-Output Operators
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
 
-void throw_result_exception(Result r);
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this, minimizing the result.
 
-template <typename T>
-T
-plus_infinity();
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-template <typename T>
-T
-minus_infinity();
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
 
-template <typename T>
-T
-not_a_number();
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
 
-} // namespace Parma_Polyhedra_Library
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
 
-// Automatically generated from PPL source file ../src/Checked_Number.inlines.hh line 1
-/* Checked_Number class implementation: inline functions.
-*/
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this, minimizing the result.
 
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-#include <stdexcept>
-#include <sstream>
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
 
-inline Rounding_Dir
-rounding_dir(Rounding_Dir dir) {
-  if (dir == ROUND_NOT_NEEDED) {
-#ifdef DEBUG_ROUND_NOT_NEEDED
-    return ROUND_DIRECT;
-#else
-    return ROUND_IGNORE;
-#endif
-  }
-  return dir;
-}
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
 
-inline Result
-check_result(Result r, Rounding_Dir dir) {
-  if (dir == ROUND_NOT_NEEDED && !is_special(r)) {
-#ifdef DEBUG_ROUND_NOT_NEEDED
-    // FIXME: this is wrong. If an overflow happens the Result may be
-    // V_LT or V_GT. What's the better way to cope with that?
-    assert(r == V_EQ);
-#else
-    return V_EQ;
-#endif
-  }
-  return r;
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
 
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
 
-inline void
-Checked_Number_Transparent_Policy::handle_result(Result) {
-}
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
 
-inline void
-Checked_Number_Default_Policy::handle_result(Result r) {
-  if (is_special(r))
-    throw_result_exception(r);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+  */
+  void add_generators(const Generator_System& gs);
 
-inline void
-Extended_Number_Policy::handle_result(Result r) {
-  if (is_special(r))
-    throw_result_exception(r);
-}
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this (without minimizing the result).
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number()
- : v(0) {
-}
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
-  // TODO: avoid default construction of value member
-  Checked::copy<Policy>(v, y.raw_value());
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
 
-template <typename T, typename Policy>
-template <typename From, typename From_Policy>
-inline
-Checked_Number<T, Policy>
-::Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
-				     (v,
-				      y.raw_value(),
-				      rounding_dir(dir)),
-				     dir));
-}
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Generator_System& gs);
 
-template <typename T, typename Policy>
-template <typename From, typename From_Policy>
-inline
-Checked_Number<T, Policy>
-::Checked_Number(const Checked_Number<From, From_Policy>& y) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
-  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
-				     (v,
-				      y.raw_value(),
-				      rounding_dir(dir)),
-				     dir));
-}
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this, minimizing the result.
 
-// TODO: avoid default construction of value member
-#define DEF_CTOR(type) \
-template <typename T, typename Policy> \
-inline \
-Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
-  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
-} \
-template <typename T, typename Policy> \
-inline \
-Checked_Number<T, Policy>::Checked_Number(const type x) { \
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
-  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-#define COND_0(...)
-#define COND_1(...) __VA_ARGS__
-#define COND_(if, ...) COND_##if(__VA_ARGS__)
-#define COND(if, ...) COND_(if, __VA_ARGS__)
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
 
-DEF_CTOR(signed char)
-DEF_CTOR(signed short)
-DEF_CTOR(signed int)
-DEF_CTOR(signed long)
-DEF_CTOR(signed long long)
-DEF_CTOR(unsigned char)
-DEF_CTOR(unsigned short)
-DEF_CTOR(unsigned int)
-DEF_CTOR(unsigned long)
-DEF_CTOR(unsigned long long)
-COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float))
-COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double))
-COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double))
-DEF_CTOR(mpq_class&)
-DEF_CTOR(mpz_class&)
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the the system
+    of generators \p gs is not empty, but has no points.
 
-#undef DEF_CTOR
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_generators_and_minimize(const Generator_System& gs);
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const char* x, Rounding_Dir dir) {
-  std::istringstream s(x);
-  Policy::handle_result(check_result(Checked::input<Policy>(v,
-							    s,
-							    rounding_dir(dir)),
-				     dir));
-}
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this, minimizing the result.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const char* x) {
-  std::istringstream s(x);
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
-  Policy::handle_result(check_result(Checked::input<Policy>(v,
-							    s,
-							    rounding_dir(dir)),
-				     dir));
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x,
-					  Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = ROUND_IGNORE;
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the the system
+    of generators \p gs is not empty, but has no points.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x,
-					  Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_generators_and_minimize(Generator_System& gs);
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x,
-					  Rounding_Dir dir) {
-  // TODO: avoid default construction of value member
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x) {
-  // TODO: avoid default construction of value member
-  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
-  Policy::handle_result(check_result(Checked::assign<Policy>(v,
-							     x,
-							     rounding_dir(dir)),
-				     dir));
-}
+    \param cgs
+    The congruences to be added.
 
-template <typename T>
-inline bool
-is_minus_infinity(const T& x) {
-  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
+  */
+  void add_congruences(const Congruence_System& cgs);
 
-template <typename T>
-inline bool
-is_plus_infinity(const T& x) {
-  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
-}
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron,
+    minimizing the result.
 
-template <typename T>
-inline bool
-is_not_a_number(const T& x) {
-  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-template <typename T>
-inline bool
-is_integer(const T& x) {
-  return Checked::is_int<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
-}
+    \param cgs
+    The congruences to be added.
 
-template <typename T, typename Policy>
-inline
-Checked_Number<T, Policy>::operator T() const {
-  if (Policy::convertible)
-    return v;
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
 
-template <typename T, typename Policy>
-inline T&
-Checked_Number<T, Policy>::raw_value() {
-  return v;
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cgs);
 
-template <typename T, typename Policy>
-inline const T&
-Checked_Number<T, Policy>::raw_value() const {
-  return v;
-}
+  /*! \brief
+    Adds the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline const T&
-raw_value(const Checked_Number<T, Policy>& x) {
-  return x.raw_value();
-}
+    \param cgs
+    The congruences to be added. Its elements may be recycled.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline T&
-raw_value(Checked_Number<T, Policy>& x) {
-  return x.raw_value();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
 
-template <typename T, typename Policy>
-inline bool
-Checked_Number<T, Policy>::OK() const {
-  return true;
-}
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
 
-template <typename T, typename Policy>
-inline Result
-Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
-  return Checked::classify<Policy>(v, nan, inf, sign);
-}
+  /*! \brief
+    Adds the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron,
+    minimizing the result.
 
-template <typename T, typename Policy>
-inline bool
-is_not_a_number(const Checked_Number<T, Policy>& x) {
-  return Checked::is_nan<Policy>(x.raw_value());
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-template <typename T, typename Policy>
-inline bool
-is_minus_infinity(const Checked_Number<T, Policy>& x) {
-  return Checked::is_minf<Policy>(x.raw_value());
-}
+    \param cgs
+    The congruences to be added. Its elements may be recycled.
 
-template <typename T, typename Policy>
-inline bool
-is_plus_infinity(const Checked_Number<T, Policy>& x) {
-  return Checked::is_pinf<Policy>(x.raw_value());
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline memory_size_type
-total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
-  return Checked::total_memory_in_bytes(x.raw_value());
-}
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline memory_size_type
-external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
-  return Checked::external_memory_in_bytes(x.raw_value());
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
 
-template <typename To>
-inline Result
-assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir) {
-  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
-}
-template <typename To>
-inline Result
-assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir) {
-  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
-}
-template <typename To>
-inline Result
-assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir) {
-  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
-}
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of constraints
+    of \p *this.
 
-template <typename To>
-inline Result
-assign_r(To& to, const char* x, Rounding_Dir dir) {
-  std::istringstream s(x);
-  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), s, rounding_dir(dir)), dir);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
 
-#define FUNC1(name, func) \
-template <typename To, typename From> \
-inline Result \
-name(To& to, const From& x, Rounding_Dir dir) { \
-  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), rounding_dir(dir)), dir); \
-}
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of congruences of
+    \p *this (without minimizing the result).
 
-FUNC1(construct, construct_ext)
-FUNC1(assign_r, assign_ext)
-FUNC1(neg_assign_r, neg_ext)
-FUNC1(abs_assign_r, abs_ext)
-FUNC1(sqrt_assign_r, sqrt_ext)
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
 
-#undef FUNC1
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system
+    of constraints of \p *this.
 
-#define FUNC1(name, func) \
-template <typename To, typename From> \
-inline Result \
-name(To& to, const From& x, int exp, Rounding_Dir dir) { \
-  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), exp, rounding_dir(dir)), dir); \
-}
+    \param cs
+    Contains the constraints used to refine the system of
+    constraints of \p *this.
 
-FUNC1(mul2exp_assign_r, mul2exp_ext)
-FUNC1(div2exp_assign_r, div2exp_ext)
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
 
-#undef FUNC1
+  /*! \brief
+    Refines \p *this with constraints equivalent to the congruences
+    in \p cgs.
 
-#define FUNC2(name, func) \
-template <typename To, \
-          typename From1, \
-	  typename From2> \
-inline Result \
-name(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
-  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From1>::Policy, typename Native_Checked_From_Wrapper<From2>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From1>::raw_value(x), Native_Checked_From_Wrapper<From2>::raw_value(y), rounding_dir(dir)), dir); \
-}
+    \param cgs
+    Contains the congruences used to refine the system of
+    constraints of \p *this.
 
-FUNC2(add_assign_r, add_ext)
-FUNC2(sub_assign_r, sub_ext)
-FUNC2(mul_assign_r, mul_ext)
-FUNC2(div_assign_r, div_ext)
-FUNC2(rem_assign_r, rem_ext)
-FUNC2(gcd_assign_r, gcd_ext)
-FUNC2(lcm_assign_r, lcm_ext)
-FUNC2(add_mul_assign_r, add_mul_ext)
-FUNC2(sub_mul_assign_r, sub_mul_ext)
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
 
-#undef FUNC2
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
 
-#define FUNC4(name, func)						\
-template <typename To1,							\
-          typename From1,						\
-          typename From2,						\
-          typename To2,							\
-	  typename To3>							\
-inline Result								\
-name(To1& to, const From1& x, const From2& y, To2& s, To3& t,		\
-     Rounding_Dir dir) {						\
-  return								\
-    check_result							\
-    (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,	\
-                   typename Native_Checked_From_Wrapper<From1>::Policy,	\
-                   typename Native_Checked_From_Wrapper<From2>::Policy,	\
-                   typename Native_Checked_To_Wrapper<To2>::Policy,	\
-                   typename Native_Checked_To_Wrapper<To3>::Policy>	\
-     (Native_Checked_To_Wrapper<To1>::raw_value(to),			\
-      Native_Checked_From_Wrapper<From1>::raw_value(x),			\
-      Native_Checked_From_Wrapper<From2>::raw_value(y),			\
-      Native_Checked_To_Wrapper<To2>::raw_value(s),			\
-      Native_Checked_To_Wrapper<To3>::raw_value(t),			\
-      rounding_dir(dir)),						\
-     dir);								\
-}
+    \param var
+    The space dimension that will be unconstrained.
 
-FUNC4(gcdext_assign_r, gcdext_ext)
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
 
-#undef FUNC4
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
 
-#define DEF_INCREMENT(f, fun) \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy>& \
-Checked_Number<T, Policy>::f() { \
-  Policy::handle_result(fun(*this, *this, T(1), \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return *this; \
-} \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy> \
-Checked_Number<T, Policy>::f(int) {\
-  T r = v;\
-  Policy::handle_result(fun(*this, *this, T(1), \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return r;\
-}
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
 
-DEF_INCREMENT(operator ++, add_assign_r)
-DEF_INCREMENT(operator --, sub_assign_r)
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
 
-#undef DEF_INCREMENT
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+    The result is not guaranteed to be minimized.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline void
-swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
-  std::swap(x.raw_value(), y.raw_value());
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void intersection_assign(const Polyhedron& y);
 
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
-  Checked::copy<Policy>(v, y.raw_value());
-  return *this;
-}
-template <typename T, typename Policy>
-template <typename From, typename From_Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>
-::operator=(const Checked_Number<From, From_Policy>& y) {
-  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
-  return *this;
-}
-template <typename T, typename Policy>
-template <typename From>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const From& y) {
-  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
-  return *this;
-}
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Not_A_Number& y) {
-  Policy::handle_result(assign_r(*this, y, ROUND_IGNORE));
-  return *this;
-}
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Minus_Infinity& y) {
-  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
-  return *this;
-}
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>&
-Checked_Number<T, Policy>::operator=(const Plus_Infinity& y) {
-  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
-  return *this;
-}
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y,
+    minimizing the result.
 
-#define DEF_BINARY_OP_ASSIGN(f, fun) \
-template <typename T, typename Policy> \
-template <typename From_Policy> \
-inline Checked_Number<T, Policy>& \
-Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
-  Policy::handle_result(fun(*this, *this, y, \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return *this; \
-} \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy>& \
-Checked_Number<T, Policy>::f(const T& y) { \
-  Policy::handle_result(fun(*this, *this, y, \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return *this; \
-} \
-template <typename T, typename Policy> \
-template <typename From, typename From_Policy> \
-inline Checked_Number<T, Policy>& \
-Checked_Number<T, Policy>::f(const Checked_Number<From, From_Policy>& y) { \
-  Checked_Number<T, Policy> cy(y); \
-  Policy::handle_result(fun(*this, *this, cy, \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return *this; \
-} \
-template <typename T, typename Policy> \
-template <typename From> \
-inline Checked_Number<T, Policy>& \
-Checked_Number<T, Policy>::f(const From& y) { \
-  Checked_Number<T, Policy> cy(y); \
-  Policy::handle_result(fun(*this, *this, cy, \
-			    Policy::ROUND_DEFAULT_OPERATOR)); \
-  return *this; \
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r)
-DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
-DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
-DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r)
-DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
 
-#undef DEF_BINARY_OP_ASSIGN
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool intersection_assign_and_minimize(const Polyhedron& y);
 
-#define DEF_BINARY_OP_TYPE(f, fun, Type) \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy> \
-f(const Type x, const Checked_Number<T, Policy>& y) { \
-  Checked_Number<T, Policy> r(x); \
-  Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
-  return r; \
-} \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy> \
-f(const Checked_Number<T, Policy>& x, const Type y) { \
-  Checked_Number<T, Policy> r(y); \
-  Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
-  return r; \
-}
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y.
+    The result is not guaranteed to be minimized.
 
-#define DEF_BINARY_OP(f, fun) \
-template <typename T, typename Policy> \
-inline Checked_Number<T, Policy> \
-f(const Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
-  Checked_Number<T, Policy> r; \
-  Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
-  return r; \
-} \
-DEF_BINARY_OP_TYPE(f, fun, signed char) \
-DEF_BINARY_OP_TYPE(f, fun, signed short) \
-DEF_BINARY_OP_TYPE(f, fun, signed int) \
-DEF_BINARY_OP_TYPE(f, fun, signed long) \
-DEF_BINARY_OP_TYPE(f, fun, signed long long) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned char) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned short) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned int) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned long) \
-DEF_BINARY_OP_TYPE(f, fun, unsigned long long) \
-COND(PPL_SUPPORTED_FLOAT, DEF_BINARY_OP_TYPE(f, fun, float)) \
-COND(PPL_SUPPORTED_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, double)) \
-COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, long double)) \
-DEF_BINARY_OP_TYPE(f, fun, mpz_class&) \
-DEF_BINARY_OP_TYPE(f, fun, mpq_class&)
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_hull_assign(const Polyhedron& y);
 
-DEF_BINARY_OP(operator +, add_assign_r)
-DEF_BINARY_OP(operator -, sub_assign_r)
-DEF_BINARY_OP(operator *, mul_assign_r)
-DEF_BINARY_OP(operator /, div_assign_r)
-DEF_BINARY_OP(operator %, rem_assign_r)
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y,
+    minimizing the result.
 
-#undef DEF_BINARY_OP_TYPE
-#undef DEF_BINARY_OP
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-#define DEF_COMPARE_TYPE(f, fun, Type) \
-template <typename From, typename From_Policy> \
-inline bool \
-f(const Type x, const Checked_Number<From, From_Policy>& y) { \
-  return Checked::fun<Default_From_Policy, From_Policy>(x, y.raw_value()); \
-} \
-template <typename From, typename From_Policy> \
-inline bool \
-f(const Checked_Number<From, From_Policy>& x, const Type y) { \
-  return Checked::fun<From_Policy, Default_From_Policy>(x.raw_value(), y); \
-}
-
-#define DEF_COMPARE(f, fun) \
-template <typename T1, typename Policy1, \
-          typename T2, typename Policy2> \
-inline bool \
-f(const Checked_Number<T1, Policy1>& x, \
-  const Checked_Number<T2, Policy2>& y) { \
-  return Checked::fun<Policy1, Policy2>(x.raw_value(), y.raw_value()); \
-} \
-DEF_COMPARE_TYPE(f, fun, signed char) \
-DEF_COMPARE_TYPE(f, fun, signed short) \
-DEF_COMPARE_TYPE(f, fun, signed int) \
-DEF_COMPARE_TYPE(f, fun, signed long) \
-DEF_COMPARE_TYPE(f, fun, signed long long) \
-DEF_COMPARE_TYPE(f, fun, unsigned char) \
-DEF_COMPARE_TYPE(f, fun, unsigned short) \
-DEF_COMPARE_TYPE(f, fun, unsigned int) \
-DEF_COMPARE_TYPE(f, fun, unsigned long) \
-DEF_COMPARE_TYPE(f, fun, unsigned long long) \
-COND(PPL_SUPPORTED_FLOAT, DEF_COMPARE_TYPE(f, fun, float)) \
-COND(PPL_SUPPORTED_DOUBLE, DEF_COMPARE_TYPE(f, fun, double)) \
-COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_COMPARE_TYPE(f, fun, long double)) \
-DEF_COMPARE_TYPE(f, fun, mpz_class&) \
-DEF_COMPARE_TYPE(f, fun, mpq_class&)
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
 
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool poly_hull_assign_and_minimize(const Polyhedron& y);
 
-DEF_COMPARE(operator ==, eq_ext)
-DEF_COMPARE(operator !=, ne_ext)
-DEF_COMPARE(operator >=, ge_ext)
-DEF_COMPARE(operator >, gt_ext)
-DEF_COMPARE(operator <=, le_ext)
-DEF_COMPARE(operator <, lt_ext)
+  //! Same as poly_hull_assign(y).
+  void upper_bound_assign(const Polyhedron& y);
 
-#undef DEF_COMPARE_TYPE
-#undef DEF_COMPARE
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y. The result is not guaranteed to be minimized.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>
-operator+(const Checked_Number<T, Policy>& x) {
-  return x;
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_difference_assign(const Polyhedron& y);
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline Checked_Number<T, Policy>
-operator-(const Checked_Number<T, Policy>& x) {
-  Checked_Number<T, Policy> r;
-  Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
-  return r;
-}
+  //! Same as poly_difference_assign(y).
+  void difference_assign(const Polyhedron& y);
 
-#define DEF_ASSIGN_FUN2_1(f, fun) \
-template <typename T, typename Policy> \
-inline void \
-f(Checked_Number<T, Policy>& x) { \
-  Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION));	\
-}
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
 
-#define DEF_ASSIGN_FUN2_2(f, fun) \
-template <typename T, typename Policy> \
-inline void \
-f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
-  Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Polyhedron& y);
 
-#define DEF_ASSIGN_FUN3_3(f, fun) \
-template <typename T, typename Policy> \
-inline void \
-f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
-  const Checked_Number<T, Policy>& z) { \
-  Policy::handle_result(fun(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
-}
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
 
-#define DEF_ASSIGN_FUN5_5(f, fun)					\
-template <typename T, typename Policy>					\
-inline void								\
-f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y,	\
-  const Checked_Number<T, Policy>& z,					\
-  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t) {		\
-  Policy::handle_result(fun(x, y, z, s, t, Policy::ROUND_DEFAULT_FUNCTION)); \
-}
+    \param var
+    The variable to which the affine expression is assigned;
 
-DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+    \param expr
+    The numerator of the affine expression;
 
-DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
-DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
 
-DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+    \if Include_Implementation_Details
 
-DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+    When considering the generators of a polyhedron, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
 
-DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
 
-DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
 
-#undef DEF_ASSIGN_FUN2_1
-#undef DEF_ASSIGN_FUN2_2
-#undef DEF_ASSIGN_FUN3_2
-#undef DEF_ASSIGN_FUN3_3
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
 
-template <typename T, typename Policy>
-inline void
-exact_div_assign(Checked_Number<T, Policy>& x,
-		 const Checked_Number<T, Policy>& y,
-		 const Checked_Number<T, Policy>& z) {
-  Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
-}
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the polyhedron and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+	    \vect{\lambda} \in \Rset^{m_1}_+,
+	    \vect{\mu} \in \Rset^{m_2}_+,
+	    \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline int
-sgn(const Checked_Number<T, Policy>& x) {
-  Result r = Checked::sgn_ext<Policy>(x.raw_value());
-  switch (r) {
-  case V_LT:
-    return -1;
-  case V_EQ:
-    return 0;
-  case V_GT:
-    return 1;
-  default:
-    throw(0);
-  }
-}
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
 
-/*! \relates Checked_Number */
-template <typename T1, typename Policy1,
-	  typename T2, typename Policy2>
-inline int
-cmp(const Checked_Number<T1, Policy1>& x,
-    const Checked_Number<T2, Policy2>& y) {
-  Result r = Checked::cmp_ext<Policy1, Policy2>(x.raw_value(), y.raw_value());
-  switch (r) {
-  case V_LT:
-    return -1;
-  case V_EQ:
-    return 0;
-  case V_GT:
-    return 1;
-  default:
-    throw(0);
-  }
-}
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline Result
-output(std::ostream& os, const Checked_Number<T, Policy>& x,
-       const Numeric_Format& fmt, Rounding_Dir dir) {
-  return check_result(Checked::output_ext<Policy>(os,
-						  x.raw_value(),
-						  fmt,
-						  rounding_dir(dir)),
-		      dir);
-}
+    \param var
+    The variable to which the affine expression is substituted;
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline std::ostream&
-operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
-  Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
-  return os;
-}
+    \param expr
+    The numerator of the affine expression;
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline Result
-input(Checked_Number<T, Policy>& x, std::istream& is, Rounding_Dir dir) {
-  return check_result(Checked::input_ext<Policy>(x.raw_value(),
-						 is,
-						 rounding_dir(dir)),
-		      dir);
-}
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-/*! \relates Checked_Number */
-template <typename T, typename Policy>
-inline std::istream& operator>>(std::istream& is,
-				Checked_Number<T, Policy>& x) {
-  Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
-  if (r == V_CVT_STR_UNK)
-    is.setstate(std::ios::failbit);
-  else
-    Policy::handle_result(r);
-  return is;
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
 
-template <typename T>
-inline T
-plus_infinity() {
-  return PLUS_INFINITY;
-}
+    \if Include_Implementation_Details
 
-template <typename T>
-inline T
-minus_infinity() {
-  return MINUS_INFINITY;
-}
+    When considering constraints of a polyhedron, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
 
-template <typename T>
-inline T
-not_a_number() {
-  return NOT_A_NUMBER;
-}
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
 
-} // namespace Parma_Polyhedra_Library
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
 
-// Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 1
-/* Specializations of std::numeric_limits for "checked" types.
-*/
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
 
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the polyhedron, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
 
-// Automatically generated from PPL source file ../src/mp_numeric_limits.hh line 1
-/* Specializations of std::numeric_limits for multi-precision types.
-   This will become obsolete when GMP and MPFR will provide the
-   specializations by themselves.
-*/
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-#include <gmpxx.h>
-#include <limits>
+    \param relsym
+    The relation symbol;
 
-namespace std {
+    \param expr
+    The numerator of the right hand side affine expression;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <>
-class numeric_limits<mpz_class> {
-private:
-  typedef mpz_class Type;
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-public:
-  static const bool is_specialized = true;
-  static const int digits = 0;
-  static const int digits10 = 0;
-  static const bool is_signed = true;
-  static const bool is_integer = true;
-  static const bool is_exact = true;
-  static const int radix = 2;
-  static const int min_exponent = 0;
-  static const int min_exponent10 = 0;
-  static const int max_exponent = 0;
-  static const int max_exponent10 = 0;
-  static const bool has_infinity = false;
-  static const bool has_quiet_NaN =  false;
-  static const bool has_signaling_NaN = false;
-  static const float_denorm_style has_denorm = denorm_absent;
-  static const bool has_denorm_loss = false;
-  static const bool is_iec559 = false;
-  static const bool is_bounded = false;
-  static const bool is_modulo = false;
-  static const bool traps = false;
-  static const bool tinyness_before = false;
-  static const float_round_style round_style = round_toward_zero;
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one());
 
-  static Type min() {
-    return static_cast<Type>(0);
-  }
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-  static Type max() {
-    return static_cast<Type>(0);
-  }
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-  static Type epsilon() {
-    return static_cast<Type>(0);
-  }
+    \param relsym
+    The relation symbol;
 
-  static Type round_error() {
-    return static_cast<Type>(0);
-  }
+    \param expr
+    The numerator of the right hand side affine expression;
 
-  static Type infinity() {
-    return static_cast<Type>(0);
-  }
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-  static Type quiet_NaN() {
-    return static_cast<Type>(0);
-  }
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
 
-  static Type denorm_min() {
-    return static_cast<Type>(1);
-  }
-};
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <>
-class numeric_limits<mpq_class> {
-private:
-  typedef mpq_class Type;
+    \param lhs
+    The left hand side affine expression;
 
-public:
-  static const bool is_specialized = true;
-  static const int digits = 0;
-  static const int digits10 = 0;
-  static const bool is_signed = true;
-  static const bool is_integer = false;
-  static const bool is_exact = true;
-  static const int radix = 2;
-  static const int min_exponent = 0;
-  static const int min_exponent10 = 0;
-  static const int max_exponent = 0;
-  static const int max_exponent10 = 0;
-  static const bool has_infinity = false;
-  static const bool has_quiet_NaN =  false;
-  static const bool has_signaling_NaN = false;
-  static const float_denorm_style has_denorm = denorm_absent;
-  static const bool has_denorm_loss = false;
-  static const bool is_iec559 = false;
-  static const bool is_bounded = false;
-  static const bool is_modulo = false;
-  static const bool traps = false;
-  static const bool tinyness_before = false;
-  static const float_round_style round_style = round_toward_zero;
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
 
-  static Type min() {
-    return static_cast<Type>(0);
-  }
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-  static Type max() {
-    return static_cast<Type>(0);
-  }
+    \param lhs
+    The left hand side affine expression;
 
-  static Type epsilon() {
-    return static_cast<Type>(0);
-  }
+    \param relsym
+    The relation symbol;
 
-  static Type round_error() {
-    return static_cast<Type>(0);
-  }
+    \param rhs
+    The right hand side affine expression.
 
-  static Type infinity() {
-    return static_cast<Type>(0);
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
 
-  static Type quiet_NaN() {
-    return static_cast<Type>(0);
-  }
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-  static Type denorm_min() {
-    return static_cast<Type>(0);
-  }
-};
+    \param var
+    The variable updated by the affine relation;
 
-} // namespace std
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-// Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 29
-#include <limits>
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-namespace std {
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-#define PPL_SPECIALIZE_LIMITS_INT(T)					\
-/*! \brief Partial specialization of std::numeric_limits. */		\
-template <typename Policy>						\
-class numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
-  : public numeric_limits<T> {						\
- private:								\
-  typedef Parma_Polyhedra_Library::Checked_Number<T, Policy> Type;	\
-									\
- public:								\
-  static const bool has_infinity = Policy::handle_infinity;		\
-  static const bool has_quiet_NaN =  Policy::handle_nan;			\
-									\
-  static Type min() {							\
-    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::min; \
-  }									\
-									\
-  static Type max() {							\
-    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::max; \
-  }									\
-									\
-  static Type infinity() {						\
-    return								\
-      Policy::handle_infinity						\
-      ? Parma_Polyhedra_Library::PLUS_INFINITY				\
-      : static_cast<Type>(0);						\
-  }									\
-									\
-  static Type quiet_NaN() {						\
-    return								\
-      Policy::handle_nan							\
-      ? Parma_Polyhedra_Library::NOT_A_NUMBER				\
-      : static_cast<Type>(0);						\
-  }									\
-};
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
 
-PPL_SPECIALIZE_LIMITS_INT(signed char)
-PPL_SPECIALIZE_LIMITS_INT(signed short)
-PPL_SPECIALIZE_LIMITS_INT(signed int)
-PPL_SPECIALIZE_LIMITS_INT(signed long)
-PPL_SPECIALIZE_LIMITS_INT(signed long long)
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-PPL_SPECIALIZE_LIMITS_INT(unsigned char)
-PPL_SPECIALIZE_LIMITS_INT(unsigned short)
-PPL_SPECIALIZE_LIMITS_INT(unsigned int)
-PPL_SPECIALIZE_LIMITS_INT(unsigned long)
-PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+    \param var
+    The variable updated by the affine relation;
 
-#undef PPL_SPECIALIZE_LIMITS_INT
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-#define PPL_SPECIALIZE_LIMITS_FLOAT(T)					\
-/*! \brief Partial specialization of std::numeric_limits. */		\
-template <typename Policy>						\
-struct numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
-  : public numeric_limits<T> {						\
-};
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-#if PPL_SUPPORTED_FLOAT
-PPL_SPECIALIZE_LIMITS_FLOAT(float)
-#endif
-#if PPL_SUPPORTED_DOUBLE
-PPL_SPECIALIZE_LIMITS_FLOAT(double)
-#endif
-#if PPL_SUPPORTED_LONG_DOUBLE
-PPL_SPECIALIZE_LIMITS_FLOAT(long double)
-#endif
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-#undef PPL_SPECIALIZE_LIMITS_FLOAT
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Partial specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Policy>
-class
-numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> >
-  : public numeric_limits<mpz_class> {
-private:
-  typedef Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> Type;
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
 
-public:
-  static const bool has_infinity = Policy::handle_infinity;
-  static const bool has_quiet_NaN =  Policy::handle_nan;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void time_elapse_assign(const Polyhedron& y);
 
-  static Type infinity() {
-    return
-      Policy::handle_infinity
-      ? Parma_Polyhedra_Library::PLUS_INFINITY
-      : static_cast<Type>(0);
-  }
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
 
-  static Type quiet_NaN() {
-    return
-      Policy::handle_nan
-      ? Parma_Polyhedra_Library::NOT_A_NUMBER
-      : static_cast<Type>(0);
-  }
-};
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Partial specialization of std::numeric_limits.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Policy>
-class
-numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> >
-: public numeric_limits<mpq_class> {
-private:
-  typedef Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> Type;
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
 
-public:
-  static const bool has_infinity = Policy::handle_infinity;
-  static const bool has_quiet_NaN =  Policy::handle_nan;
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-  static Type infinity() {
-    return
-      Policy::handle_infinity
-      ? Parma_Polyhedra_Library::PLUS_INFINITY
-      : static_cast<Type>(0);
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
 
-  static Type quiet_NaN() {
-    return
-      Policy::handle_nan
-      ? Parma_Polyhedra_Library::NOT_A_NUMBER
-      : static_cast<Type>(0);
-  }
-};
+  /*! \brief
+    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-} // namespace std
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
 
-// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 912
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
 
-// Automatically generated from PPL source file ../src/Coefficient.types.hh line 16
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Coefficient traits specialization for 8 bits checked integers.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Policy>
-struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
-  //! The type used for references to const 8 bit checked integers.
-  typedef Checked_Number<int8_t, Policy> const_reference;
-};
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Coefficient traits specialization for 16 bits checked integers.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Policy>
-struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
-  //! The type used for references to const 16 bit checked integers.
-  typedef Checked_Number<int16_t, Policy> const_reference;
-};
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Coefficient traits specialization for 32 bits checked integers.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Policy>
-struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
-  //! The type used for references to const 32 bit checked integers.
-  typedef Checked_Number<int32_t, Policy> const_reference;
-};
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Coefficient traits specialization for 64 bits checked integers.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Policy>
-struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
-  //! The type used for references to const 64 bit checked integers.
-  typedef const Checked_Number<int64_t, Policy>& const_reference;
-};
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
 
-} // namespace Parma_Polyhedra_Library
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
 
-#endif // defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
 
-#ifdef GMP_INTEGERS
-// Automatically generated from PPL source file ../src/Coefficient.types.hh line 67
-#endif
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
 
-//! An alias for easily naming the type of PPL coefficients.
-/*! \ingroup PPL_CXX_interface
-  Objects of type Coefficient are used to implement the integral valued
-  coefficients occurring in linear expressions, constraints, generators,
-  intervals, bounding boxes and so on. Depending on the chosen
-  configuration options (see file <CODE>README.configure</CODE>),
-  a Coefficient may actually be:
-    - The GMP_Integer type, which in turn is an alias for the
-      <CODE>mpz_class</CODE> type implemented by the C++ interface
-      of the GMP library (this is the default configuration);
-    - An instance of the Checked_Number class template: with its default
-      policy (Checked_Number_Default_Policy), this implements overflow
-      detection on top of a native integral type (available template
-      instances include checked integers having 8, 16, 32 or 64 bits);
-      with the Checked_Number_Transparent_Policy, this is a wrapper
-      for native integral types with no overflow detection
-      (available template instances are as above).
-*/
-typedef COEFFICIENT_TYPE Coefficient;
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const Polyhedron& y, unsigned* tp = 0);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An alias for easily naming the coefficient traits.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-} // namespace Parma_Polyhedra_Library
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
 
-// Automatically generated from PPL source file ../src/Interval.types.hh line 1
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
 
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Polyhedron& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
 
-class Boundary;
-class LBoundary;
-class UBoundary;
-class Interval;
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
 
-} // namespace Parma_Polyhedra_Library
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
 
-// Automatically generated from PPL source file ../src/Bounding_Box.types.hh line 1
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
 
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Polyhedron& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
 
-class Bounding_Box;
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
 
-} // namespace Parma_Polyhedra_Library
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-// Automatically generated from PPL source file ../src/Constraint.types.hh line 1
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old polyhedron
+    in the new vector space.
 
+    \param m
+    The number of dimensions to add.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-class Constraint;
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
 
-} // namespace Parma_Polyhedra_Library
+  /*! \brief
+    Adds \p m new space dimensions to the polyhedron
+    and does not embed it in the new vector space.
 
-// Automatically generated from PPL source file ../src/Generator.types.hh line 1
+    \param m
+    The number of space dimensions to add.
 
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-namespace Parma_Polyhedra_Library {
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
 
-class Generator;
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
 
-// Automatically generated from PPL source file ../src/Grid_Generator.types.hh line 1
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Polyhedron& y);
 
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
 
-class Grid_Generator;
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
 
-}
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-// Automatically generated from PPL source file ../src/Congruence.types.hh line 1
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
 
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
 
-namespace Parma_Polyhedra_Library {
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the polyhedron.
 
-class Congruence;
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
 
-}
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
 
-// Automatically generated from PPL source file ../src/Init.types.hh line 1
+    \param m
+    The number of replicas to be created.
 
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
 
-class Init;
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
 
-} // namespace Parma_Polyhedra_Library
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
 
-// Automatically generated from PPL source file ../src/Row.types.hh line 1
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
 
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-namespace Parma_Polyhedra_Library {
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-class Row_Impl_Handler;
-class Row;
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
 
-} // namespace Parma_Polyhedra_Library
+  //! \name Miscellaneous Member Functions
+  //@{
 
-// Automatically generated from PPL source file ../src/Linear_Row.types.hh line 1
+  //! Destructor.
+  ~Polyhedron();
 
+  /*! \brief
+    Swaps \p *this with polyhedron \p y.
+    (\p *this and \p y can be dimension-incompatible.)
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void swap(Polyhedron& y);
 
-class Linear_Row;
+  PPL_OUTPUT_DECLARATIONS
 
-} // namespace Parma_Polyhedra_Library
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-// Automatically generated from PPL source file ../src/Matrix.types.hh line 1
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
 
-class Matrix;
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
 
-} // namespace Parma_Polyhedra_Library
+  //@} // Miscellaneous Member Functions
 
-// Automatically generated from PPL source file ../src/Variable.types.hh line 1
+private:
+  //! The system of constraints.
+  Constraint_System con_sys;
 
+  //! The system of generators.
+  Generator_System gen_sys;
 
-namespace Parma_Polyhedra_Library {
+  //! The saturation matrix having constraints on its columns.
+  Bit_Matrix sat_c;
 
-class Variable;
+  //! The saturation matrix having generators on its columns.
+  Bit_Matrix sat_g;
 
-} // namespace Parma_Polyhedra_Library
+#define PPL_IN_Polyhedron_CLASS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ph_Status.idefs.hh line 1
+/* Polyhedron::Status class declaration.
+*/
 
-// Automatically generated from PPL source file ../src/Linear_Expression.types.hh line 1
 
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status.idefs.hh directly; use Polyhedron.defs.hh instead."
+#endif
 
-namespace Parma_Polyhedra_Library {
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>constraints pending</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, which is
+    split in two non-empty subsets: the already processed constraints,
+    which are in minimal form, and the pending constraints, which
+    still have to be processed and may thus be inconsistent or
+    contain redundancies;
+  - <EM>generators pending</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, which is
+    split in two non-empty subsets: the already processed generators,
+    which are in minimal form, and the pending generators, which still
+    have to be processed and may thus contain redundancies;
+  - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending constraints;
+  - <EM>constraints minimized</EM>: the non-pending part of the system
+    of constraints attached to the polyhedron is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the polyhedron is in minimal form;
+  - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending generators and
+    columns indexed by non-pending constraints correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+  - <EM>generators' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending constraints and
+    columns indexed by non-pending generators correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
 
-class Linear_Expression;
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>constraints pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>constraints' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
 
-} // namespace Parma_Polyhedra_Library
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
 
-// Automatically generated from PPL source file ../src/Linear_System.types.hh line 1
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
 
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
 
-namespace Parma_Polyhedra_Library {
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
 
-class Linear_System;
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
 
-} // namespace Parma_Polyhedra_Library
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
 
-// Automatically generated from PPL source file ../src/Saturation_Row.types.hh line 1
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
 
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
 
-namespace Parma_Polyhedra_Library {
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
 
-class Saturation_Row;
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
 
-} // namespace Parma_Polyhedra_Library
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-// Automatically generated from PPL source file ../src/Saturation_Matrix.types.hh line 1
+  PPL_OUTPUT_DECLARATIONS
 
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
 
-namespace Parma_Polyhedra_Library {
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
 
-class Saturation_Matrix;
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bit-masks for the individual assertions
 
-} // namespace Parma_Polyhedra_Library
+  //! This holds the current bitset.
+  flags_t flags;
 
-// Automatically generated from PPL source file ../src/Constraint_System.types.hh line 1
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
 
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
 
-namespace Parma_Polyhedra_Library {
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
 
-class Constraint_System;
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
 
-} // namespace Parma_Polyhedra_Library
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
 
-// Automatically generated from PPL source file ../src/Generator_System.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.defs.hh line 2039
+#undef PPL_IN_Polyhedron_CLASS
 
+  //! The status flags to keep track of the polyhedron's internal state.
+  Status status;
 
-namespace Parma_Polyhedra_Library {
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
 
-class Generator_System;
+  //! Returns the topological kind of the polyhedron.
+  Topology topology() const;
 
-} // namespace Parma_Polyhedra_Library
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the polyhedron
+    is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
 
-// Automatically generated from PPL source file ../src/Grid_Generator_System.types.hh line 1
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of constraints
+    of \p *this.
 
+    \param c The constraint to be added. If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
 
-namespace Parma_Polyhedra_Library {
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
 
-class Grid_Generator_System;
+  //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
 
-}
+  //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+  bool constraints_are_up_to_date() const;
 
-// Automatically generated from PPL source file ../src/Congruence_System.types.hh line 1
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
 
+  //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+  */
+  bool constraints_are_minimized() const;
 
-namespace Parma_Polyhedra_Library {
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+  */
+  bool generators_are_minimized() const;
 
-class Congruence_System;
+  //! Returns <CODE>true</CODE> if there are pending constraints.
+  bool has_pending_constraints() const;
 
-}
+  //! Returns <CODE>true</CODE> if there are pending generators.
+  bool has_pending_generators() const;
 
-// Automatically generated from PPL source file ../src/Scalar_Products.types.hh line 1
+  /*! \brief
+    Returns <CODE>true</CODE> if there are
+    either pending constraints or pending generators.
+  */
+  bool has_something_pending() const;
 
+  //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+  bool can_have_something_pending() const;
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+    is up-to-date.
+  */
+  bool sat_c_is_up_to_date() const;
 
-class Scalar_Products;
-class Topology_Adjusted_Scalar_Product_Sign;
-class Topology_Adjusted_Scalar_Product_Assign;
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+    is up-to-date.
+  */
+  bool sat_g_is_up_to_date() const;
 
-} // namespace Parma_Polyhedra_Library
+  //@} // Private Verifiers: Verify if Individual Flags are Set
 
-// Automatically generated from PPL source file ../src/LP_Problem.types.hh line 1
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
 
+  /*! \brief
+    Sets \p status to express that the polyhedron is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Sets \p status to express that the polyhedron is empty,
+    clearing all corresponding matrices.
+  */
+  void set_empty();
 
-//! Possible outcomes of the LP_Problem solver.
-/*! \ingroup PPL_CXX_interface */
-enum LP_Problem_Status {
-  //! The problem is unfeasible.
-  UNFEASIBLE_LP_PROBLEM,
-  //! The problem is unbounded.
-  UNBOUNDED_LP_PROBLEM,
-  //! The problem has an optimal solution.
-  OPTIMIZED_LP_PROBLEM
-};
+  //! Sets \p status to express that constraints are up-to-date.
+  void set_constraints_up_to_date();
 
-class LP_Problem;
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
 
-} // namespace Parma_Polyhedra_Library
+  //! Sets \p status to express that constraints are minimized.
+  void set_constraints_minimized();
 
-// Automatically generated from PPL source file ../src/Poly_Con_Relation.types.hh line 1
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
 
+  //! Sets \p status to express that constraints are pending.
+  void set_constraints_pending();
 
-namespace Parma_Polyhedra_Library {
+  //! Sets \p status to express that generators are pending.
+  void set_generators_pending();
 
-class Poly_Con_Relation;
+  //! Sets \p status to express that \p sat_c is up-to-date.
+  void set_sat_c_up_to_date();
 
-} // namespace Parma_Polyhedra_Library
+  //! Sets \p status to express that \p sat_g is up-to-date.
+  void set_sat_g_up_to_date();
 
-// Automatically generated from PPL source file ../src/Poly_Gen_Relation.types.hh line 1
+  //@} // State Flag Setters: Set Only the Specified Flags
 
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
 
-namespace Parma_Polyhedra_Library {
+  //! Clears the \p status flag indicating that the polyhedron is empty.
+  void clear_empty();
 
-class Poly_Gen_Relation;
+  //! Sets \p status to express that constraints are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_constraints_up_to_date();
 
-} // namespace Parma_Polyhedra_Library
+  //! Sets \p status to express that generators are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_generators_up_to_date();
 
-// Automatically generated from PPL source file ../src/BHRZ03_Certificate.types.hh line 1
+  //! Sets \p status to express that constraints are no longer minimized.
+  void clear_constraints_minimized();
 
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
 
-namespace Parma_Polyhedra_Library {
+  //! Sets \p status to express that there are no longer pending constraints.
+  void clear_pending_constraints();
 
-class BHRZ03_Certificate;
+  //! Sets \p status to express that there are no longer pending generators.
+  void clear_pending_generators();
 
-} // namespace Parma_Polyhedra_Library
+  //! Sets \p status to express that \p sat_c is no longer up-to-date.
+  void clear_sat_c_up_to_date();
 
-// Automatically generated from PPL source file ../src/H79_Certificate.types.hh line 1
+  //! Sets \p status to express that \p sat_g is no longer up-to-date.
+  void clear_sat_g_up_to_date();
 
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
 
-namespace Parma_Polyhedra_Library {
+  //! \name The Handling of Pending Rows
+  //@{
 
-class H79_Certificate;
+  /*! \brief
+    Processes the pending rows of either description of the polyhedron
+    and obtains a minimized polyhedron.
 
-} // namespace Parma_Polyhedra_Library
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
 
-// Automatically generated from PPL source file ../src/Grid_Certificate.types.hh line 1
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool process_pending() const;
 
+  //! Processes the pending constraints and obtains a minimized polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
 
-namespace Parma_Polyhedra_Library {
+    It is assumed that the polyhedron does have some pending constraints.
+  */
+  bool process_pending_constraints() const;
 
-class Grid_Certificate;
+  //! Processes the pending generators and obtains a minimized polyhedron.
+  /*!
+    It is assumed that the polyhedron does have some pending generators.
+  */
+  void process_pending_generators() const;
 
-}
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a constraint system without pending rows.
 
-// Automatically generated from PPL source file ../src/Polyhedron.types.hh line 1
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  void remove_pending_to_obtain_constraints() const;
 
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a generator system without pending rows.
 
-namespace Parma_Polyhedra_Library {
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
 
-class Polyhedron;
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool remove_pending_to_obtain_generators() const;
 
-} // namespace Parma_Polyhedra_Library
+  //@} // The Handling of Pending Rows
 
-// Automatically generated from PPL source file ../src/C_Polyhedron.types.hh line 1
+  //! \name Updating and Sorting Matrices
+  //@{
 
+  //! Updates constraints starting from generators and minimizes them.
+  /*!
+    The resulting system of constraints is only partially sorted:
+    the equalities are in the upper part of the matrix,
+    while the inequalities in the lower part.
+  */
+  void update_constraints() const;
 
-namespace Parma_Polyhedra_Library {
+  //! Updates generators starting from constraints and minimizes them.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
 
-class C_Polyhedron;
+    The resulting system of generators is only partially sorted:
+    the lines are in the upper part of the matrix,
+    while rays and points are in the lower part.
+    It is illegal to call this method when the Status field
+    already declares the polyhedron to be empty.
+  */
+  bool update_generators() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Updates \p sat_c using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_c to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_c[i][j] = 0,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+        sat\_c[i][j] = 1,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_c() const;
 
-// Automatically generated from PPL source file ../src/NNC_Polyhedron.types.hh line 1
+  //! Updates \p sat_g using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_g to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_g[i][j] = 0,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+        sat\_g[i][j] = 1,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_g() const;
 
+  //! Sorts the matrix of constraints keeping status consistency.
+  /*!
+    It is assumed that constraints are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_g is kept consistent with the sorted matrix
+    of constraints.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints() const;
 
-namespace Parma_Polyhedra_Library {
+  //! Sorts the matrix of generators keeping status consistency.
+  /*!
+    It is assumed that generators are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_c is kept consistent with the sorted matrix
+    of generators.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators() const;
 
-class NNC_Polyhedron;
+  //! Sorts the matrix of constraints and updates \p sat_c.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints_with_sat_c() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Sorts the matrix of generators and updates \p sat_g.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators_with_sat_g() const;
 
-// Automatically generated from PPL source file ../src/Grid.types.hh line 1
+  //@} // Updating and Sorting Matrices
 
+  //! \name Weak and Strong Minimization of Descriptions
+  //@{
 
-namespace Parma_Polyhedra_Library {
+  //! Applies (weak) minimization to both the constraints and generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
 
-class Grid;
+    Minimization is not attempted if the Status field already declares
+    both systems to be minimized.
+  */
+  bool minimize() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Applies strong minimization to the constraints of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_constraints() const;
 
-// Automatically generated from PPL source file ../src/Ptr_Iterator.types.hh line 1
+  //! Applies strong minimization to the generators of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_generators() const;
 
+  //! If constraints are up-to-date, obtain a simplified copy of them.
+  Constraint_System simplified_constraints() const;
 
-namespace Parma_Polyhedra_Library {
+  //@} // Weak and Strong Minimization of Descriptions
 
-namespace Implementation {
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
 
-template <typename P>
-class Ptr_Iterator;
+  //! Polynomial but incomplete equivalence test between polyhedra.
+  Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
 
-} // namespace Implementation
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Polyhedron& y) const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
 
-// Automatically generated from PPL source file ../src/DB_Row.types.hh line 1
+    \param expr
+    The linear expression to test;
 
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
 
-template <typename BT>
-class DB_Row_Impl_Handler;
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
 
-template <typename BT>
-class DB_Row;
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
 
-} // namespace Parma_Polyhedra_Library
+    \param ext_n
+    The numerator of the extremum value;
 
-// Automatically generated from PPL source file ../src/DB_Matrix.types.hh line 1
+    \param ext_d
+    The denominator of the extremum value;
 
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
 
-namespace Parma_Polyhedra_Library {
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
 
-template <typename T>
-class DB_Matrix;
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-} // namespace Parma_Polyhedra_Library
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Generator& g) const;
 
-// Automatically generated from PPL source file ../src/BD_Shape.types.hh line 1
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
 
+  /*! \brief
+    Copies to \p cs_selection the constraints of \p y corresponding
+    to the definition of the CH78-widening of \p *this and \p y.
+  */
+  void select_CH78_constraints(const Polyhedron& y,
+			       Constraint_System& cs_selected) const;
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Splits the constraints of `x' into two subsets, depending on whether
+    or not they are selected to compute the \ref H79_widening "H79-widening"
+    of \p *this and \p y.
+  */
+  void select_H79_constraints(const Polyhedron& y,
+			      Constraint_System& cs_selected,
+			      Constraint_System& cs_not_selected) const;
 
-template <typename T>
-class BD_Shape;
+  bool BHRZ03_combining_constraints(const Polyhedron& y,
+				    const BHRZ03_Certificate& y_cert,
+ 				    const Polyhedron& H79,
+				    const Constraint_System& x_minus_H79_con_sys);
 
-} // namespace Parma_Polyhedra_Library
+  bool BHRZ03_evolving_points(const Polyhedron& y,
+			      const BHRZ03_Certificate& y_cert,
+			      const Polyhedron& H79);
 
-// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 1
-/* GMP_Integer class declaration.
-*/
+  bool BHRZ03_evolving_rays(const Polyhedron& y,
+			    const BHRZ03_Certificate& y_cert,
+			    const Polyhedron& H79);
 
+  //@} // Widening- and Extrapolation-Related Functions
 
-// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 28
-#include <cstddef>
+  //! Adds new space dimensions to the given matrices.
+  /*!
+    \param mat1
+    The matrix to which columns are added;
 
-namespace Parma_Polyhedra_Library {
+    \param mat2
+    The matrix to which rows and columns are added;
 
-//! \name Accessor Functions
-//@{
+    \param sat1
+    The saturation matrix whose columns are indexed by the rows of
+    matrix \p mat1. On entry it is up-to-date;
 
-//! Returns a const reference to the underlying integer value.
-/*! \relates GMP_Integer */
-const mpz_class& raw_value(const GMP_Integer& x);
+    \param sat2
+    The saturation matrix whose columns are indexed by the rows of \p
+    mat2;
 
-//! Returns a reference to the underlying integer value.
-/*! \relates GMP_Integer */
-mpz_class& raw_value(GMP_Integer& x);
+    \param add_dim
+    The number of space dimensions to add.
 
-//@} // Accessor Functions
+    Adds new space dimensions to the vector space modifying the matrices.
+    This function is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE> and
+    <CODE>add_space_dimensions_and_project()</CODE>, passing the matrix of
+    constraints and that of generators (and the corresponding saturation
+    matrices) in different order (see those methods for details).
+  */
+  static void add_space_dimensions(Linear_System& mat1,
+				   Linear_System& mat2,
+				   Bit_Matrix& sat1,
+				   Bit_Matrix& sat2,
+				   dimension_type add_dim);
 
-//! \name Memory Size Inspection Functions
-//@{
+  //! \name Minimization-Related Static Member Functions
+  //@{
 
-//! Returns the total size in bytes of the memory occupied by \p x.
-/*! \relates GMP_Integer */
-memory_size_type total_memory_in_bytes(const GMP_Integer& x);
+  //! Builds and simplifies constraints from generators (or vice versa).
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool minimize(bool con_to_gen,
+		       Linear_System& source,
+		       Linear_System& dest,
+		       Bit_Matrix& sat);
 
-//! Returns the size in bytes of the memory managed by \p x.
-/*! \relates GMP_Integer */
-memory_size_type external_memory_in_bytes(const GMP_Integer& x);
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool add_and_minimize(bool con_to_gen,
+			       Linear_System& source1,
+			       Linear_System& dest,
+			       Bit_Matrix& sat,
+			       const Linear_System& source2);
 
-//@} // Memory Size Inspection Functions
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa. The given constraints are in \p source.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool add_and_minimize(bool con_to_gen,
+			       Linear_System& source,
+			       Linear_System& dest,
+			       Bit_Matrix& sat);
 
-//! \name Arithmetic Operators
-//@{
+  //! Performs the conversion from constraints to generators and vice versa.
+  // Detailed Doxygen comment to be found in file conversion.cc.
+  static dimension_type conversion(Linear_System& source,
+				   dimension_type start,
+				   Linear_System& dest,
+				   Bit_Matrix& sat,
+				   dimension_type num_lines_or_equalities);
 
-//! Assigns to \p x its negation.
-/*! \relates GMP_Integer */
-void neg_assign(GMP_Integer& x);
+  /*! \brief
+    Uses Gauss' elimination method to simplify the result of
+    <CODE>conversion()</CODE>.
+  */
+  // Detailed Doxygen comment to be found in file simplify.cc.
+  static dimension_type simplify(Linear_System& mat, Bit_Matrix& sat);
 
-//! Assigns to \p x the negation of \p y.
-/*! \relates GMP_Integer */
-void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+  //@} // Minimization-Related Static Member Functions
 
-//! Assigns to \p x the greatest common divisor of \p y and \p z.
-/*! \relates GMP_Integer */
-void gcd_assign(GMP_Integer& x,
-		const GMP_Integer& y, const GMP_Integer& z);
+  /*! \brief
+    Pointer to an array used by simplify().
 
-//! Extended GCD.
-/*! \relates GMP_Integer
-  Assigns to \p x the greatest common divisor of \p y and \p z, and to
-  \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
-*/
-void gcdext_assign(GMP_Integer& x,
-		   const GMP_Integer& y, const GMP_Integer& z,
-		   GMP_Integer& s, GMP_Integer& t);
+    Holds (between class initialization and finalization) a pointer to
+    an array, allocated with operator new[](), of
+    simplify_num_saturators_size elements.
+  */
+  static dimension_type* simplify_num_saturators_p;
 
-//! Assigns to \p x the least common multiple of \p y and \p z.
-/*! \relates GMP_Integer */
-void lcm_assign(GMP_Integer& x,
-		const GMP_Integer& y, const GMP_Integer& z);
+  /*! \brief
+    Dimension of an array used by simplify().
 
-//! Assigns to \p x the value <CODE>x + y * z</CODE>.
-/*! \relates GMP_Integer */
-void add_mul_assign(GMP_Integer& x,
-		    const GMP_Integer& y, const GMP_Integer& z);
+    Holds (between class initialization and finalization) the size of the
+    array pointed to by simplify_num_saturators_p.
+  */
+  static size_t simplify_num_saturators_size;
 
-//! Assigns to \p x the value <CODE>x - y * z</CODE>.
-/*! \relates GMP_Integer */
-void sub_mul_assign(GMP_Integer& x,
-		    const GMP_Integer& y, const GMP_Integer& z);
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+  template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename T> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+  friend class Parma_Polyhedra_Library::H79_Certificate;
 
-/*! \brief
-  If \p z divides \p y, assigns to \p x the quotient of the integer
-  division of \p y and \p z.
 
-  \relates GMP_Integer
-  The behavior is undefined if \p z does not divide \p y.
-*/
-void exact_div_assign(GMP_Integer& x,
-		      const GMP_Integer& y, const GMP_Integer& z);
+  //! \name Exception Throwers
+  //@{
+protected:
+  void throw_runtime_error(const char* method) const;
+  void throw_invalid_argument(const char* method, const char* reason) const;
 
-//! Assigns to \p x the integer square root of \p y.
-/*! \relates GMP_Integer */
-void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+  void throw_topology_incompatible(const char* method,
+				   const char* ph_name,
+				   const Polyhedron& ph) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* c_name,
+				   const Constraint& c) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* g_name,
+				   const Generator& g) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* cs_name,
+				   const Constraint_System& cs) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* gs_name,
+				   const Generator_System& gs) const;
 
-/*! \brief
-  Returns a negative, zero or positive value depending on whether
-  \p x is lower than, equal to or greater than \p y, respectively.
+  void throw_dimension_incompatible(const char* method,
+				    const char* other_name,
+				    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* ph_name,
+				    const Polyhedron& ph) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* e_name,
+				    const Linear_Expression& e) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* c_name,
+				    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cg_name,
+				    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cs_name,
+				    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gs_name,
+				    const Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cgs_name,
+				    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* var_name,
+				    Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_space_dim) const;
 
-  \relates GMP_Integer
-*/
-int cmp(const GMP_Integer& x, const GMP_Integer& y);
+  // Note: it has to be a static method, because it can be called inside
+  // constructors (before actually constructing the polyhedron object).
+  static void throw_space_dimension_overflow(Topology topol,
+					     const char* method,
+					     const char* reason);
 
-//@} // Arithmetic Operators
+  void throw_invalid_generator(const char* method,
+			       const char* g_name) const;
+  void throw_invalid_generators(const char* method,
+				const char* gs_name) const;
+  //@} // Exception Throwers
 
-} // namespace Parma_Polyhedra_Library
+};
 
 
 namespace std {
 
 //! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::GMP_Integer */
-void swap(Parma_Polyhedra_Library::GMP_Integer& x,
-	  Parma_Polyhedra_Library::GMP_Integer& y);
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+void swap(Parma_Polyhedra_Library::Polyhedron& x,
+	  Parma_Polyhedra_Library::Polyhedron& y);
 
 } // namespace std
 
-// Automatically generated from PPL source file ../src/GMP_Integer.inlines.hh line 1
-/* GMP_Integer class implementation: inline functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ph_Status.inlines.hh line 1
+/* Polyhedron::Status class implementation: inline functions.
 */
 
 
 namespace Parma_Polyhedra_Library {
 
-inline void
-neg_assign(GMP_Integer& x) {
-  mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+inline
+Polyhedron::Status::Status(flags_t mask)
+  : flags(mask) {
 }
 
-inline void
-neg_assign(GMP_Integer& x, const GMP_Integer& y) {
-  mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+inline
+Polyhedron::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
 }
 
-inline void
-gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
-  mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
 }
 
-inline void
-gcdext_assign(GMP_Integer& x,
-	      const GMP_Integer& y, const GMP_Integer& z,
-	      GMP_Integer& s, GMP_Integer& t) {
-  mpz_gcdext(x.get_mpz_t(),
-	     s.get_mpz_t(), t.get_mpz_t(),
-	     y.get_mpz_t(), z.get_mpz_t());
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+  return flags & mask;
 }
 
 inline void
-lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
-  mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+Polyhedron::Status::set(flags_t mask) {
+  flags |= mask;
 }
 
 inline void
-add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
-  mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+Polyhedron::Status::reset(flags_t mask) {
+  flags &= ~mask;
 }
 
-inline void
-sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
-  mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
 }
 
 inline void
-exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
-  assert(y % z == 0);
-  mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+Polyhedron::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
 }
 
 inline void
-sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
-  mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
-}
-
-inline int
-cmp(const GMP_Integer& x, const GMP_Integer& y) {
-  return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+Polyhedron::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
 }
 
-inline const mpz_class&
-raw_value(const GMP_Integer& x) {
-  return x;
+inline bool
+Polyhedron::Status::test_empty() const {
+  return test_any(EMPTY);
 }
 
-inline mpz_class&
-raw_value(GMP_Integer& x) {
-  return x;
+inline void
+Polyhedron::Status::reset_empty() {
+  reset(EMPTY);
 }
 
-inline memory_size_type
-external_memory_in_bytes(const GMP_Integer& x) {
-  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+inline void
+Polyhedron::Status::set_empty() {
+  flags = EMPTY;
 }
 
-inline memory_size_type
-total_memory_in_bytes(const GMP_Integer& x) {
-  return sizeof(x) + external_memory_in_bytes(x);
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
 }
 
-} // namespace Parma_Polyhedra_Library
-
-/*! \relates Parma_Polyhedra_Library::GMP_Integer */
 inline void
-std::swap(Parma_Polyhedra_Library::GMP_Integer& x,
-	  Parma_Polyhedra_Library::GMP_Integer& y) {
-  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+Polyhedron::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
 }
 
-// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 135
-
-// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 1
-/* Coefficient class declaration.
-*/
-
-
-// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 27
-#include <iosfwd>
-
-#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
-// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 32
-#endif
-
-#ifdef GMP_INTEGERS
-// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 36
-#endif
-
-namespace Parma_Polyhedra_Library {
-
-Coefficient_traits::const_reference Coefficient_zero();
-Coefficient_traits::const_reference Coefficient_one();
-
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Coefficient.inlines.hh line 1
-/* Coefficient class implementation: inline functions.
-*/
-
-
-namespace Parma_Polyhedra_Library {
-
-inline Coefficient_traits::const_reference
-Coefficient_zero() {
-  static Coefficient z(0);
-  return z;
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
 }
 
-inline Coefficient_traits::const_reference
-Coefficient_one() {
-  static Coefficient o(1);
-  return o;
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 46
-
-// Automatically generated from PPL source file ../src/globals.defs.hh line 1
-/* Declarations of global objects.
-*/
-
-
-// Automatically generated from PPL source file ../src/globals.defs.hh line 28
-#include <exception>
-
-namespace Parma_Polyhedra_Library {
-
-//! Returns a value that does not designate a valid dimension.
-dimension_type
-not_a_dimension();
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A node of the list of available coefficients.
-/*! \ingroup PPL_CXX_interface */
-// FIXME: rewrite the comment.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Coefficient_free_list_element {
-private:
-  Coefficient i;
-  Coefficient_free_list_element* p;
-
-public:
-  Coefficient_free_list_element()
-    : i() {
-  }
-
-  Coefficient& integer() {
-    return i;
-  }
-
-  Coefficient_free_list_element*& next() {
-    return p;
-  }
-};
-
-extern Coefficient_free_list_element* Coefficient_free_list_first;
-
-inline Coefficient&
-get_tmp_Coefficient() {
-  Coefficient* p;
-  if (Coefficient_free_list_first != 0) {
-    p = &Coefficient_free_list_first->integer();
-    Coefficient_free_list_first = Coefficient_free_list_first->next();
-  }
-  else
-    p = reinterpret_cast<Coefficient*>(new Coefficient_free_list_element());
-  return *p;
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
 }
 
 inline void
-release_tmp_Coefficient(Coefficient& i) {
-  Coefficient_free_list_element& e
-    = reinterpret_cast<Coefficient_free_list_element&>(i);
-  e.next() = Coefficient_free_list_first;
-  Coefficient_free_list_first = &e;
+Polyhedron::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
 }
 
-class Temp_Coefficient_Holder {
-private:
-  Coefficient& hold;
-
-public:
-  Temp_Coefficient_Holder(Coefficient& i)
-    : hold(i) {
-  }
-  ~Temp_Coefficient_Holder() {
-    release_tmp_Coefficient(hold);
-  }
-};
-
-#if 1
-#define TEMP_INTEGER(id) \
-Coefficient& id = get_tmp_Coefficient(); \
-Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
-#else
-#define TEMP_INTEGER(id) static Coefficient id
-#endif
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Speculative allocation function.
-/*!
-  \return
-  The actual capacity to be allocated.
-
-  \param requested_size
-  The number of elements we need.
-
-  \param maximum_size
-  The maximum number of elements to be allocated. It is assumed
-  to be no less than \p requested_size.
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
 
-  Computes a capacity given a requested size.
-  Allows for speculative allocation aimed at reducing the number of
-  reallocations enough to guarantee amortized constant insertion time
-  for our vector-like data structures. In all cases, the speculative
-  allocation will not exceed \p maximum_size.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-dimension_type
-compute_capacity(dimension_type requested_size,
-		 dimension_type maximum_size);
+inline void
+Polyhedron::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
 
-//! User objects the PPL can throw.
-/*! \ingroup PPL_CXX_interface
-  This abstract base class should be instantiated by those users
-  willing to provide a polynomial upper bound to the time spent
-  by any invocation of a library operator.
-*/
-class Throwable {
-public:
-  //! Throws the user defined exception object.
-  virtual void throw_me() const = 0;
+inline void
+Polyhedron::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
 
-  //! Virtual destructor.
-  virtual ~Throwable();
-};
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
 
-/*! \brief
-  A pointer to an exception object.
+inline void
+Polyhedron::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
 
-  \ingroup PPL_CXX_interface
-  This pointer, which is initialized to zero, is repeatedly checked
-  along any super-linear (i.e., computationally expensive) computation
-  path in the library.
-  When it is found nonzero the exception it points to is thrown.
-  In other words, making this pointer point to an exception (and
-  leaving it in this state) ensures that the library will return
-  control to the client application, possibly by throwing the given
-  exception, within a time that is a linear function of the size
-  of the representation of the biggest object (powerset of polyhedra,
-  polyhedron, system of constraints or generators) on which the library
-  is operating upon.
+inline void
+Polyhedron::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
 
-  \note
-  The only sensible way to assign to this pointer is from within a
-  signal handler or from a parallel thread.  For this reason, the
-  library, apart from ensuring that the pointer is initially set to zero,
-  never assigns to it.  In particular, it does not zero it again when
-  the exception is thrown: it is the client's responsibility to do so.
-*/
-extern const Throwable* volatile abandon_expensive_computations;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  If the pointer abandon_expensive_computations is found
-  to be nonzero, the exception it points to is thrown.
+inline bool
+Polyhedron::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
 
-  \relates Throwable
-*/
-#endif
-void
-maybe_abandon();
+inline void
+Polyhedron::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
 
-//! A tag class.
-/*! \ingroup PPL_CXX_interface
-  Tag class to differentiate the C_Polyhedron and NNC_Polyhedron
-  constructors that build a polyhedron out of a bounding box.
-*/
-struct From_Bounding_Box {
-};
+inline void
+Polyhedron::Status::set_c_pending() {
+  set(CS_PENDING);
+}
 
-//! A tag class.
-/*! \ingroup PPL_CXX_interface
-  Tag class to make the Grid covering box constructor unique.
-*/
-struct From_Covering_Box {
-};
+inline bool
+Polyhedron::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
-  divided by \f$g\f$ are assigned to \p nx and \p ny, respectively.
+inline void
+Polyhedron::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
 
-  \note
-  \p x and \p nx may be the same object and likewise for
-  \p y and \p ny.  Any other aliasing results in undefined behavior.
-*/
-#endif
-void
-normalize2(Coefficient_traits::const_reference x,
-	   Coefficient_traits::const_reference y,
-	   Coefficient& nx, Coefficient& ny);
+inline void
+Polyhedron::Status::set_g_pending() {
+  set(GS_PENDING);
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns a mask for the lowest \p n bits,
-#endif
-template <typename T>
-T low_bits_mask(unsigned n);
 
-// Turn s into a string: PPL_STR(x + y) => "x + y".
-#define PPL_STR(s) #s
-// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
-#define PPL_XSTR(s) PPL_STR(s)
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-#define PPL_OUTPUT_DECLARATIONS						\
-  /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
-  void ascii_dump() const;						\
-  /*! \brief Writes to \p s an ASCII representation of \p *this. */	\
-  void ascii_dump(std::ostream& s) const;				\
-  /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */	\
-  void print() const;
-#else
-#define PPL_OUTPUT_DECLARATIONS					\
-  void ascii_dump() const;					\
-  void ascii_dump(std::ostream& s) const;			\
-  void print() const;
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
 
-#define PPL_OUTPUT_DEFINITIONS(class_name)			\
-  void								\
-  Parma_Polyhedra_Library::class_name::ascii_dump() const {	\
-    ascii_dump(std::cerr);					\
-  }								\
-								\
-  void								\
-  Parma_Polyhedra_Library::class_name::print() const {		\
-    using namespace IO_Operators;				\
-    std::cerr << *this;						\
-  }
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
 
-#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name)			\
-  void									\
-  Parma_Polyhedra_Library::class_name::ascii_dump() const {		\
-    ascii_dump(std::cerr);						\
-  }									\
-									\
-  void									\
-  Parma_Polyhedra_Library::class_name::print() const {			\
-    std::cerr << "No user level output operator defined "		\
-	      << "for class " PPL_XSTR(class_name) << "." << std::endl; \
-  }
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
 
-#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix)	\
-  template <typename type_symbol>					\
-  void									\
-  class_prefix::ascii_dump() const {					\
-    ascii_dump(std::cerr);						\
-  }									\
-									\
-  template <typename type_symbol>					\
-  void									\
-  class_prefix::print() const {						\
-    using namespace IO_Operators;					\
-    std::cerr << *this;							\
-  }
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
 
-#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
-  template <typename type_symbol>					\
-  void									\
-  class_prefix::ascii_dump() const {					\
-    ascii_dump(std::cerr);						\
-  }									\
-									\
-  template <typename type_symbol>					\
-  void									\
-  class_prefix::print() const {						\
-    std::cerr << "No user level output operator defined "		\
-	      << "for " PPL_XSTR(class_prefix) << "." << std::endl;	\
-  }
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/globals.inlines.hh line 1
-/* Implementation of global objects: inline functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.inlines.hh line 1
+/* Polyhedron class implementation: inline functions.
 */
 
 
-// Automatically generated from PPL source file ../src/globals.inlines.hh line 27
-#include <limits>
-#include <cassert>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.inlines.hh line 28
+#include <algorithm>
+#include <deque>
 
 namespace Parma_Polyhedra_Library {
 
-inline dimension_type
-not_a_dimension() {
-  return std::numeric_limits<dimension_type>::max();
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
 }
 
-inline
-Throwable::~Throwable() {
+inline dimension_type
+Polyhedron::space_dimension() const {
+  return space_dim;
 }
 
-inline void
-maybe_abandon() {
-  if (const Throwable* p = abandon_expensive_computations)
-    p->throw_me();
+inline int32_t
+Polyhedron::hash_code() const {
+  return space_dimension() & 0x7fffffff;
 }
 
 inline dimension_type
-compute_capacity(const dimension_type requested_size,
-		 const dimension_type maximum_size) {
-  assert(requested_size <= maximum_size);
-  // Speculation factor 2.
-  return (requested_size < maximum_size / 2)
-    ? 2*(requested_size + 1)
-    : maximum_size;
-  // Speculation factor 1.5.
-  // return (maximum_size - requested_size > requested_size/2)
-  //   ? requested_size + requested_size/2 + 1
-  //   : maximum_size;
+Polyhedron::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+	     min(Constraint_System::max_space_dimension(),
+		 Generator_System::max_space_dimension()
+		 )
+	     );
 }
 
-inline void
-normalize2(Coefficient_traits::const_reference x,
-	   Coefficient_traits::const_reference y,
-	   Coefficient& nx, Coefficient& ny) {
-  TEMP_INTEGER(gcd);
-  gcd_assign(gcd, x, y);
-  exact_div_assign(nx, x, gcd);
-  exact_div_assign(ny, y, gcd);
+inline Topology
+Polyhedron::topology() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.topology();
 }
 
-template <typename T>
-inline T
-low_bits_mask(const unsigned n) {
-  assert(n < unsigned(std::numeric_limits<T>::digits));
-  return n == 0 ? 0 : ~(~(T(0u)) << n);
+inline bool
+Polyhedron::is_discrete() const {
+  return affine_dimension() == 0;
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/globals.defs.hh line 289
-
-// Automatically generated from PPL source file ../src/Interval.defs.hh line 1
-/* Declarations for the Interval class and its constituents.
-*/
+inline bool
+Polyhedron::is_necessarily_closed() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.is_necessarily_closed();
+}
 
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+  poly_hull_assign(y);
+}
 
-// Automatically generated from PPL source file ../src/Interval.defs.hh line 29
-#include <gmpxx.h>
-#include <iosfwd>
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+  poly_difference_assign(y);
+}
 
-namespace Parma_Polyhedra_Library {
+inline void
+Polyhedron::widening_assign(const Polyhedron& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
 
-typedef Checked_Number<mpq_class, Extended_Number_Policy> ERational;
+inline
+Polyhedron::~Polyhedron() {
+}
 
+inline void
+Polyhedron::swap(Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("swap(y)", "y", y);
+  std::swap(con_sys, y.con_sys);
+  std::swap(gen_sys, y.gen_sys);
+  std::swap(sat_c, y.sat_c);
+  std::swap(sat_g, y.sat_g);
+  std::swap(status, y.status);
+  std::swap(space_dim, y.space_dim);
 }
 
-namespace Parma_Polyhedra_Library {
+inline bool
+Polyhedron::can_recycle_constraint_systems() {
+  return true;
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x is less than \p y.
-/*! \relates Boundary */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator<(const Boundary& x, const Boundary& y);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x is greater than \p y.
-/*! \relates Boundary */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator>(const Boundary& x, const Boundary& y);
+inline bool
+Polyhedron::can_recycle_congruence_systems() {
+  return false;
+}
 
 } // namespace Parma_Polyhedra_Library
 
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+inline void
+std::swap(Parma_Polyhedra_Library::Polyhedron& x,
+	  Parma_Polyhedra_Library::Polyhedron& y) {
+  x.swap(y);
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An extended rational bound of an interval.
-/*! \ingroup PPL_CXX_interface
-  An object of class Boundary represents either an upper or a lower
-  bound of an interval over the set of extended rational numbers.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Boundary {
-protected:
-  //! Kinds of bounds.
-  enum Flag {
-    //! An open upper bound.
-    NEG = -1,
-    //! A closed (lower or upper) bound.
-    ZERO = 0,
-    //! An open lower bound.
-    POS = 1
-  };
+namespace Parma_Polyhedra_Library {
 
-  //! The extended rational value of the bound.
-  ERational value;
-  //! The kind of the bound.
-  Flag flag;
+inline bool
+Polyhedron::marked_empty() const {
+  return status.test_empty();
+}
 
-  //! Builds a bound of kind \p f and having value \p v.
-  Boundary(const ERational& v, Flag f);
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
 
-  friend bool
-  Parma_Polyhedra_Library::operator<(const Boundary& x, const Boundary& y);
-  friend bool
-  Parma_Polyhedra_Library::operator>(const Boundary& x, const Boundary& y);
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
 
-public:
-  //! Returns <CODE>true</CODE> if and only if \p *this is a closed bound.
-  bool is_closed() const;
+inline bool
+Polyhedron::constraints_are_minimized() const {
+  return status.test_c_minimized();
+}
 
-  //! Returns a const reference to the value of the bound.
-  const ERational& bound() const;
+inline bool
+Polyhedron::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
 
-  //! Returns a reference to the value of the bound.
-  ERational& bound();
-};
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+  return status.test_sat_c_up_to_date();
+}
 
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+  return status.test_sat_g_up_to_date();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The lower bound of an extended rational interval.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::LBoundary : public Boundary {
-public:
-  //! Kinds of lower bounds.
-  enum Open_Closed {
-    //! An open lower bound.
-    OPEN = Boundary::POS,
-    //! A closed lower bound.
-    CLOSED = Boundary::ZERO
-  };
+inline bool
+Polyhedron::has_pending_constraints() const {
+  return status.test_c_pending();
+}
 
-  //! Builds a lower bound of kind \p f and having value \p v.
-  LBoundary(const ERational& v, Open_Closed f);
+inline bool
+Polyhedron::has_pending_generators() const {
+  return status.test_g_pending();
+}
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+inline bool
+Polyhedron::has_something_pending() const {
+  return status.test_c_pending() || status.test_g_pending();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The upper bound of an extended rational interval.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::UBoundary : public Boundary {
-public:
-  //! Kinds of upper bounds.
-  enum Open_Closed {
-    //! An open upper bound.
-    OPEN = Boundary::NEG,
-    //! A closed upper bound.
-    CLOSED = Boundary::ZERO
-  };
+inline bool
+Polyhedron::can_have_something_pending() const {
+  return constraints_are_minimized()
+    && generators_are_minimized()
+    && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
 
-  //! Builds an upper bound of kind \p f and having value \p v.
-  UBoundary(const ERational& v, Open_Closed f);
+inline bool
+Polyhedron::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date and
+  // there are no pending constraints, then the generator system
+  // (since it is well formed) contains a point.
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    return false;
+  return !minimize();
+}
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+inline void
+Polyhedron::set_constraints_up_to_date() {
+  status.set_c_up_to_date();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A interval over the set of rational numbers.
-/*! \ingroup PPL_CXX_interface
-  An object of class Interval represents a closed/half-closed/open
-  interval over the set of rational numbers \f$\Qset\f$.
+inline void
+Polyhedron::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
 
-  Note that, even though the implementation is capable to represent
-  any interval on the set of <EM>extended</EM> rational numbers,
-  the available public methods only allows for the construction
-  and manipulation of intervals over \f$\Qset\f$.
-  Namely, it is not possible to create a non-empty interval having
-  a <EM>closed</EM> bound whose value is \f$-\infty\f$ or \f$+\infty\f$.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+inline void
+Polyhedron::set_constraints_minimized() {
+  set_constraints_up_to_date();
+  status.set_c_minimized();
+}
 
-class Parma_Polyhedra_Library::Interval {
-public:
-  //! Constructs the universe interval \f$(-\infty, +\infty) = \Qset\f$.
-  Interval();
+inline void
+Polyhedron::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
-  bool is_empty() const;
+inline void
+Polyhedron::set_constraints_pending() {
+  status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+  status.set_g_pending();
+}
 
-  //! Returns a const reference to the interval's lower bound.
-  const LBoundary& lower_bound() const;
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+  status.set_sat_c_up_to_date();
+}
 
-  //! Returns a reference to the interval's lower bound.
-  LBoundary& lower_bound();
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+  status.set_sat_g_up_to_date();
+}
 
-  //! Returns a const reference to the interval's upper bound.
-  const UBoundary& upper_bound() const;
+inline void
+Polyhedron::clear_empty() {
+  status.reset_empty();
+}
 
-  //! Returns a reference to the interval's upper bound.
-  UBoundary& upper_bound();
+inline void
+Polyhedron::clear_constraints_minimized() {
+  status.reset_c_minimized();
+}
 
-  /*! \brief
-    Raises the interval's lower bound, if \p new_lower is higher
-    than the current one.
-  */
-  void raise_lower_bound(LBoundary new_lower);
+inline void
+Polyhedron::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
 
-  /*! \brief
-    Lowers the interval's upper bound, if \p new_upper is lower
-    than the current one.
-  */
-  void lower_upper_bound(UBoundary new_upper);
+inline void
+Polyhedron::clear_pending_constraints() {
+  status.reset_c_pending();
+}
 
-  //! Turns \p *this into the empty interval.
-  void set_empty();
+inline void
+Polyhedron::clear_pending_generators() {
+  status.reset_g_pending();
+}
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+  status.reset_sat_c_up_to_date();
+  // Can get rid of sat_c here.
+}
 
-private:
-  //! The interval's lower bound.
-  LBoundary lower;
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+  status.reset_sat_g_up_to_date();
+  // Can get rid of sat_g here.
+}
 
-  //! The interval's upper bound.
-  UBoundary upper;
-};
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+  clear_pending_constraints();
+  clear_constraints_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
 
-// Automatically generated from PPL source file ../src/Interval.inlines.hh line 1
-/* Inline functions for the Interval class and its constituents.
-*/
+inline void
+Polyhedron::clear_generators_up_to_date() {
+  clear_pending_generators();
+  clear_generators_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
 
+inline bool
+Polyhedron::process_pending() const {
+  assert(space_dim > 0 && !marked_empty());
+  assert(has_something_pending());
 
-#include <cassert>
-// Automatically generated from PPL source file ../src/Interval.inlines.hh line 29
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
 
-namespace Parma_Polyhedra_Library {
+  if (x.has_pending_constraints())
+    return x.process_pending_constraints();
 
-inline
-Boundary::Boundary(const ERational& v, Flag f)
-  : value(v), flag(f) {
+  assert(x.has_pending_generators());
+  x.process_pending_generators();
+  return true;
 }
 
 inline bool
-Boundary::is_closed() const {
-  return flag == ZERO;
-}
-
-inline const ERational&
-Boundary::bound() const {
-  return value;
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
 }
 
-inline ERational&
-Boundary::bound() {
-  return value;
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
 }
 
-inline
-LBoundary::LBoundary(const ERational& v, Open_Closed f)
-  : Boundary(v, f == CLOSED ? ZERO : POS) {
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+		     Coefficient& sup_n, Coefficient& sup_d,
+		     bool& maximum) const {
+  Generator g(point());
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
 }
 
-inline
-UBoundary::UBoundary(const ERational& v, Open_Closed f)
-  : Boundary(v, f == CLOSED ? ZERO : NEG) {
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+		     Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
 }
 
-/*! \relates Boundary */
 inline bool
-operator<(const Boundary& x, const Boundary& y) {
-  return x.value < y.value ||
-    (x.value == y.value && x.flag < y.flag);
+Polyhedron::minimize(const Linear_Expression& expr,
+		     Coefficient& inf_n, Coefficient& inf_d,
+		     bool& minimum) const {
+  Generator g(point());
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
 }
 
-/*! \relates Boundary */
 inline bool
-operator>(const Boundary& x, const Boundary& y) {
-  return y < x;
+Polyhedron::minimize(const Linear_Expression& expr,
+		     Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
 }
 
-inline
-Interval::Interval()
-  : lower(ERational(MINUS_INFINITY), LBoundary::OPEN),
-    upper(ERational(PLUS_INFINITY), UBoundary::OPEN) {
+inline Constraint_System
+Polyhedron::simplified_constraints() const {
+  assert(constraints_are_up_to_date());
+  Constraint_System cs(con_sys);
+  if (cs.num_pending_rows() > 0)
+    cs.unset_pending_rows();
+  if (has_pending_constraints() || !constraints_are_minimized())
+    cs.simplify();
+  return cs;
 }
 
-inline bool
-Interval::is_empty() const {
-  return lower > upper;
+inline Congruence_System
+Polyhedron::congruences() const {
+  return Congruence_System(minimized_constraints());
 }
 
-inline const LBoundary&
-Interval::lower_bound() const {
-  return lower;
+inline Congruence_System
+Polyhedron::minimized_congruences() const {
+  return Congruence_System(minimized_constraints());
 }
 
-inline LBoundary&
-Interval::lower_bound() {
-  return lower;
+inline Grid_Generator_System
+Polyhedron::minimized_grid_generators() const {
+  return grid_generators();
 }
 
-inline const UBoundary&
-Interval::upper_bound() const {
-  return upper;
+inline bool
+Polyhedron::add_congruence_and_minimize(const Congruence& cg) {
+  add_congruence(cg);
+  return minimize();
 }
 
-inline UBoundary&
-Interval::upper_bound() {
-  return upper;
+inline bool
+Polyhedron::add_congruences_and_minimize(const Congruence_System& cgs) {
+  add_congruences(cgs);
+  return minimize();
 }
 
 inline void
-Interval::raise_lower_bound(LBoundary new_lower) {
-  if (new_lower > lower)
-    lower = new_lower;
+Polyhedron::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
 }
 
-inline void
-Interval::lower_upper_bound(UBoundary new_upper) {
-  if (new_upper < upper)
-    upper = new_upper;
+inline bool
+Polyhedron::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
+  return add_congruences_and_minimize(cgs);
 }
 
 inline void
-Interval::set_empty() {
-  lower = LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN);
-  upper = UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN);
-  assert(is_empty());
+Polyhedron::add_grid_generator(const Grid_Generator& g) const {
+  used(g);
 }
 
-} // namespace Parma_Polyhedra_Library
+inline bool
+Polyhedron::add_grid_generator_and_minimize(const Grid_Generator& g) const {
+  used(g);
+  return !is_empty();
+}
 
-// Automatically generated from PPL source file ../src/Interval.defs.hh line 203
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+  return !(x == y);
+}
 
-// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 1
-/* Bounding_Box class declaration.
-*/
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
 
+} // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 1
-/* Constraint_System class declaration.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.templates.hh line 1
+/* Polyhedron class implementation: non-inline template functions.
 */
 
 
-// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 1
-/* Linear_System class declaration.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.defs.hh line 1
+/* MIP_Problem class declaration.
 */
 
 
-// Automatically generated from PPL source file ../src/Matrix.defs.hh line 1
-/* Matrix class declaration.
-*/
-
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.defs.hh line 35
+#include <vector>
+#include <deque>
+#include <iosfwd>
 
-// Automatically generated from PPL source file ../src/Row.defs.hh line 1
-/* Row class declaration.
-*/
+namespace Parma_Polyhedra_Library {
 
+namespace IO_Operators {
 
-// Automatically generated from PPL source file ../src/Row.defs.hh line 29
-#include <vector>
-#include <limits>
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const MIP_Problem& lp);
 
-#ifndef EXTRA_ROW_DEBUG
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*!
-  \brief
-  Enables extra debugging information for class Row.
+} // namespace IO_Operators
 
-  \ingroup PPL_CXX_interface
-  When <CODE>EXTRA_ROW_DEBUG</CODE> evaluates to <CODE>true</CODE>,
-  each instance of the class Row carries its own capacity; this enables
-  extra consistency checks to be performed.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-#define EXTRA_ROW_DEBUG 0
-#endif
+} // namespace Parma_Polyhedra_Library
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The handler of the actual Row implementation.
+//! A Mixed Integer (linear) Programming problem.
 /*! \ingroup PPL_CXX_interface
-  Exception-safety is the only responsibility of this class: it has
-  to ensure that its \p impl member is correctly deallocated.
+  An object of this class encodes a mixed integer (linear) programming problem.
+  The MIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the feasible region, by means of a finite set of linear equality
+     and non-strict inequality constraints;
+   - the subset of the unknown variables that range over the integers
+     (the other variables implicitly ranging over the reals);
+   - the objective function, described by a Linear_Expression;
+   - the optimization mode (either maximization or minimization).
+
+  The class provides support for the (incremental) solution of the
+  MIP problem based on variations of the revised simplex method and
+  on branch-and-bound techniques. The result of the resolution
+  process is expressed in terms of an enumeration, encoding the
+  feasibility and the unboundedness of the optimization problem.
+  The class supports simple feasibility tests (i.e., no optimization),
+  as well as the extraction of an optimal (resp., feasible) point,
+  provided the MIP_Problem is optimizable (resp., feasible).
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given MIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of constraints,
+  the change of objective function and the change of optimization mode.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Row_Impl_Handler {
+class Parma_Polyhedra_Library::MIP_Problem {
 public:
-  //! Default constructor.
-  Row_Impl_Handler();
+  //! Builds a trivial MIP problem.
+  /*!
+    A trivial MIP problem requires to maximize the objective function
+    \f$0\f$ on a vector space under no constraints at all:
+    the origin of the vector space is an optimal solution.
 
-  //! Destructor.
-  ~Row_Impl_Handler();
+    \param dim
+    The dimension of the vector space enclosing \p *this
+    (optional argument with default value \f$0\f$).
 
-  class Impl;
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+  explicit MIP_Problem(dimension_type dim = 0);
 
-  //! A pointer to the actual implementation.
-  Impl* impl;
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode;
+    those dimensions whose indices occur in \p int_vars are
+    constrained to take an integer value.
 
-#if EXTRA_ROW_DEBUG
-  //! The capacity of \p impl (only available during debugging).
-  dimension_type capacity_;
-#endif // EXTRA_ROW_DEBUG
+    \param dim
+    The dimension of the vector space enclosing \p *this.
 
-private:
-  //! Private and unimplemented: copy construction is not allowed.
-  Row_Impl_Handler(const Row_Impl_Handler&);
+    \param first
+    An input iterator to the start of the sequence of constraints.
 
-  //! Private and unimplemented: copy assignment is not allowed.
-  Row_Impl_Handler& operator=(const Row_Impl_Handler&);
-};
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param int_vars
+    The set of variables' indexes that are constrained to take integer values.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality,
+    if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) or the space dimension
+    of the integer variable set is strictly greater than \p dim.
+  */
+  template <typename In>
+  MIP_Problem(dimension_type dim,
+	      In first, In last,
+	      const Variables_Set& int_vars,
+	      const Linear_Expression& obj = Linear_Expression::zero(),
+	      Optimization_Mode mode = MAXIMIZATION);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A finite sequence of coefficients.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
-public:
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Wrapper class to represent a set of flags with bits in a native
-    unsigned integral type.
-    \ingroup PPL_CXX_interface
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  class Flags {
-  public:
-    //! Constructs an object with all the flags unset.
-    Flags();
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode.
 
-    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
-    bool operator==(const Flags& y) const;
+    \param dim
+    The dimension of the vector space enclosing \p *this.
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if \p *this and \p y
-      are different.
-    */
-    bool operator!=(const Flags& y) const;
+    \param first
+    An input iterator to the start of the sequence of constraints.
 
-    PPL_OUTPUT_DECLARATIONS;
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
 
-    //! Uses the ASCII Flags representation from \p s to recreate *this.
-    /*!
-      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-      otherwise.  The ASCII representation is as output by
-      \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump.
-    */
-    bool ascii_load(std::istream& s);
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
 
-  protected:
-    //! A native integral type holding the bits that encode the flags.
-    typedef unsigned int base_type;
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
 
-    //! Index of the first bit derived classes can use.
-    static const unsigned first_free_bit = 0;
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
 
-    //! Total number of bits that can be stored.
-    static const unsigned num_bits = std::numeric_limits<base_type>::digits;
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality
+    or if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) is strictly
+    greater than \p dim.
+  */
+template <typename In>
+MIP_Problem(dimension_type dim,
+	    In first, In last,
+	    const Linear_Expression& obj = Linear_Expression::zero(),
+	    Optimization_Mode mode = MAXIMIZATION);
 
-    //! Constructs an object with flags set as in \p n.
-    explicit Flags(base_type n);
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim from the constraint
+    system \p cs, the objective function \p obj and optimization mode \p mode.
 
-    //! Returns the integer encoding \p *this.
-    base_type get_bits() const;
+    \param dim
+    The dimension of the vector space enclosing \p *this.
 
-    //! Sets the bits in \p mask.
-    void set_bits(base_type mask);
+    \param cs
+    The constraint system defining the feasible region.
 
-    //! Resets the bits in \p mask.
-    void reset_bits(base_type mask);
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if all the bits
-      in \p mask are set.
-    */
-    bool test_bits(base_type mask) const;
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
 
-  private:
-    //! The integer encoding \p *this.
-    base_type bits;
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
 
-    friend class Row;
-  };
+    \exception std::invalid_argument
+    Thrown if the constraint system contains any strict inequality
+    or if the space dimension of the constraint system (resp., the
+    objective function) is strictly greater than \p dim.
+  */
+  MIP_Problem(dimension_type dim,
+	      const Constraint_System& cs,
+	      const Linear_Expression& obj = Linear_Expression::zero(),
+	      Optimization_Mode mode = MAXIMIZATION);
 
-  //! Pre-constructs a row: construction must be completed by construct().
-  Row();
+  //! Ordinary copy-constructor.
+  MIP_Problem(const MIP_Problem& y);
 
-  //! \name Post-constructors
-  //@{
-  //! Constructs properly a default-constructed element.
-  /*!
-    Builds a row with size and capacity \p sz and flags \p f.
+  //! Destructor.
+  ~MIP_Problem();
+
+  //! Assignment operator.
+  MIP_Problem& operator=(const MIP_Problem& y);
+
+  //! Returns the maximum space dimension an MIP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the MIP problem.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a set containing all the variables' indexes constrained
+    to be integral.
   */
-  void construct(dimension_type sz, Flags f);
+  const Variables_Set& integer_space_dimensions() const;
 
-  //! Constructs properly a default-constructed element.
-  /*!
-    \param sz
-    The size of the row that will be constructed;
+private:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint> Constraint_Sequence;
 
-    \param capacity
-    The capacity of the row that will be constructed;
+public:
+  /*! \brief
+    A type alias for the read-only iterator on the constraints
+    defining the feasible region.
+  */
+  typedef Constraint_Sequence::const_iterator const_iterator;
 
-    \param f
-    Flags for the row that will be constructed.
+  /*! \brief
+    Returns a read-only iterator to the first constraint defining
+    the feasible region.
+  */
+  const_iterator constraints_begin() const;
 
-    The row that is constructed has storage for \p capacity elements,
-    \p sz of which are default-constructed now.
-    The row flags are set to \p f.
+  /*! \brief
+    Returns a past-the-end read-only iterator to the sequence of
+    constraints defining the feasible region.
   */
-  void construct(dimension_type sz, dimension_type capacity, Flags f);
-  //@} // Post-constructors
+  const_iterator constraints_end() const;
 
-  //! Tight constructor: resizing may require reallocation.
+  //! Returns the objective function.
+  const Linear_Expression& objective_function() const;
+
+  //! Returns the optimization mode.
+  Optimization_Mode optimization_mode() const;
+
+  //! Resets \p *this to be equal to the trivial MIP problem.
   /*!
-    Constructs a row with size and capacity \p sz, and flags \p f.
+    The space dimension is reset to \f$0\f$.
   */
-  Row(dimension_type sz, Flags f);
+  void clear();
 
-  //! Sizing constructor with capacity.
-  /*!
-    \param sz
-    The size of the row that will be constructed;
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old MIP problem
+    in the new vector space.
 
-    \param capacity
-    The capacity of the row that will be constructed;
+    \param m
+    The number of dimensions to add.
 
-    \param f
-    Flags for the row that will be constructed.
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-    The row that is constructed has storage for \p capacity elements,
-    \p sz of which are default-constructed now.
-    The row flags are set to \p f.
+    The new space dimensions will be those having the highest indexes
+    in the new MIP problem; they are initially unconstrained.
   */
-  Row(dimension_type sz, dimension_type capacity, Flags f);
+  void add_space_dimensions_and_embed(dimension_type m);
 
-  //! Ordinary copy constructor.
-  Row(const Row& y);
+  /*! \brief
+    Sets the variables whose indexes are in set \p i_vars to be
+    integer space dimensions.
 
-  //! Copy constructor with specified capacity.
-  /*!
-    It is assumed that \p capacity is greater than or equal to
-    the size of \p y.
+    \exception std::invalid_argument
+    Thrown if some index in \p i_vars does not correspond to
+    a space dimension in \p *this.
   */
-  Row(const Row& y, dimension_type capacity);
+  void add_to_integer_space_dimensions(const Variables_Set& i_vars);
 
-  //! Copy constructor with specified size and capacity.
-  /*!
-    It is assumed that \p sz is greater than or equal to the size of \p y
-    and, of course, that \p sz is less than or equal to \p capacity.
+  /*! \brief
+    Adds a copy of constraint \p c to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint \p c is a strict inequality or if its space
+    dimension is strictly greater than the space dimension of \p *this.
   */
-  Row(const Row& y, dimension_type sz, dimension_type capacity);
+  void add_constraint(const Constraint& c);
 
-  //! Destructor.
-  ~Row();
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the MIP problem.
 
-  //! Assignment operator.
-  Row& operator=(const Row& y);
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains any strict inequality
+    or if its space dimension is strictly greater than the space dimension
+    of \p *this.
+  */
+  void add_constraints(const Constraint_System& cs);
 
-  //! Swaps \p *this with \p y.
-  void swap(Row& y);
+  //! Sets the objective function to \p obj.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p obj is strictly greater than
+    the space dimension of \p *this.
+  */
+  void set_objective_function(const Linear_Expression& obj);
 
-  //! Assigns the implementation of \p y to \p *this.
+  //! Sets the optimization mode to \p mode.
+  void set_optimization_mode(Optimization_Mode mode);
+
+  //! Checks satisfiability of \p *this.
   /*!
-    To be used with extra care, since it may easily cause memory leaks
-    or undefined behavior.
+    \return
+    <CODE>true</CODE> if and only if the MIP problem is satisfiable.
   */
-  void assign(Row& y);
+  bool is_satisfiable() const;
+
+  //! Optimizes the MIP problem.
+  /*!
+    \return
+    An MIP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible, unbounded or optimized problem).
+  */
+  MIP_Problem_Status solve() const;
 
   /*! \brief
-    Allocates memory for a default constructed Row object, setting
-    flags to \p f and allowing for \p capacity coefficients at most.
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+    of evaluating the objective function on \p evaluating_point.
 
-    It is assumed that no allocation has been performed before
-    (otherwise, a memory leak will occur).
-    After execution, the size of the Row object is zero.
+    \param evaluating_point
+    The point on which the objective function will be evaluated.
+
+    \param num
+    On exit will contain the numerator of the evaluated value.
+
+    \param den
+    On exit will contain the denominator of the evaluated value.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p evaluating_point are dimension-incompatible
+    or if the generator \p evaluating_point is not a point.
   */
-  void allocate(dimension_type capacity, Flags f);
+  void evaluate_objective_function(const Generator& evaluating_point,
+				   Coefficient& num,
+				   Coefficient& den) const;
 
-  //! Expands the row to size \p new_size.
+  //! Returns a feasible point for \p *this, if it exists.
   /*!
-    Adds new positions to the implementation of the row
-    obtaining a new row with size \p new_size.
-    It is assumed that \p new_size is between the current size
-    and capacity of the row.
+    \exception std::domain_error
+    Thrown if the MIP problem is not satisfiable.
   */
-  void expand_within_capacity(dimension_type new_size);
+  const Generator& feasible_point() const;
 
-  //! Shrinks the row by erasing elements at the end.
+  //! Returns an optimal point for \p *this, if it exists.
   /*!
-    Destroys elements of the row implementation
-    from position \p new_size to the end.
-    It is assumed that \p new_size is not greater than the current size.
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
   */
-  void shrink(dimension_type new_size);
+  const Generator& optimizing_point() const;
 
-  //! Returns a const reference to the flags of \p *this.
-  const Flags& flags() const;
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+    the solution of the optimization problem.
 
-  //! Returns a non-const reference to the flags of \p *this.
-  Flags& flags();
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  void optimal_value(Coefficient& num, Coefficient& den) const;
 
-  //! Returns the size() of the largest possible Row.
-  static dimension_type max_size();
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-  //! Gives the number of coefficients currently in use.
-  dimension_type size() const;
+  PPL_OUTPUT_DECLARATIONS
 
-  //! \name Subscript operators
-  //@{
-  //! Returns a reference to the element of the row indexed by \p k.
-  Coefficient& operator[](dimension_type k);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-  //! Returns a constant reference to the element of the row indexed by \p k.
-  Coefficient_traits::const_reference operator[](dimension_type k) const;
-  //@} // Subscript operators
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-  //! Normalizes the modulo of coefficients so that they are mutually prime.
-  /*!
-    Computes the Greatest Common Divisor (GCD) among the elements of
-    the row and normalizes them by the GCD itself.
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(MIP_Problem& y);
+
+private:
+  //! The dimension of the vector space.
+  dimension_type external_space_dim;
+
+  /*! \brief
+    The space dimension of the current (partial) solution of the
+    MIP problem; it may be smaller than \p external_space_dim.
   */
-  void normalize();
+  dimension_type internal_space_dim;
+
+  //! The matrix encoding the current feasible region in tableau form.
+  Matrix tableau;
 
-  PPL_OUTPUT_DECLARATIONS;
+  //! The working cost function.
+  Row working_cost;
 
-  //! Uses the ASCII Row representation at \p s to recreate *this.
+  //! A map between the variables of `input_cs' and `tableau'.
   /*!
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+    Contains all the pairs (i, j) such that mapping[i].first encodes the index
+    of the column in the tableau where input_cs[i] is stored; mapping[i].second
+    not a zero, encodes the split part of the tableau of input_cs[i].
+    The "positive" one is represented by mapping[i].first and
+    the "negative" one is represented by mapping[i].second.
   */
-  bool ascii_load(std::istream& s);
+  std::vector<std::pair<dimension_type, dimension_type> > mapping;
+
+  //! The current basic solution.
+  std::vector<dimension_type> base;
+
+  //! An enumerated type describing the internal status of the MIP problem.
+  enum Status {
+    //! The MIP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The MIP problem is satisfiable; a feasible solution has been computed.
+    SATISFIABLE,
+    //! The MIP problem is unbounded; a feasible solution has been computed.
+    UNBOUNDED,
+    //! The MIP problem is optimized; an optimal solution has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the MIP problem has been changed by adding
+      new space dimensions or new constraints; a feasible solution for
+      the old feasible region is still available.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the MIP problem.
+  Status status;
 
   /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
+    A Boolean encoding whether or not internal data structures have
+    already been properly sized and populated: useful to allow for
+    deeper checks in method OK().
   */
-  memory_size_type total_memory_in_bytes() const;
+  bool initialized;
+
+  //! The sequence of constraints describing the feasible region.
+  Constraint_Sequence input_cs;
+
+  //! The first index of `input_cs' containing a pending constraint.
+  dimension_type first_pending_constraint;
+
+  //! The objective function to be optimized.
+  Linear_Expression input_obj_function;
+
+  //! The optimization mode requested.
+  Optimization_Mode opt_mode;
+
+  //! The last successfully computed feasible or optimizing point.
+  Generator last_generator;
 
   /*! \brief
-    Returns a lower bound to the size in bytes of the memory
-    managed by \p *this.
+    A set containing all the indexes of variables that are constrained
+    to have an integer value.
   */
-  memory_size_type external_memory_in_bytes() const;
+  Variables_Set i_variables;
+
+  //! Processes the pending constraints of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the MIP problem is satisfiable after
+    processing the pending constraints, <CODE>false</CODE> otherwise.
+  */
+  bool process_pending_constraints();
 
   /*! \brief
-    Returns the total size in bytes of the memory occupied by \p *this,
-    provided the capacity of \p *this is given by \p capacity.
+    Optimizes the MIP problem using the second phase of the
+    primal simplex algorithm.
   */
-  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+  void second_phase();
 
   /*! \brief
-    Returns the size in bytes of the memory managed by \p *this,
-    provided the capacity of \p *this is given by \p capacity.
+    Assigns to \p this->tableau a simplex tableau representing the
+    MIP problem, inserting into \p this->mapping the information
+    that is required to recover the original MIP problem.
+
+    \return
+    <CODE>UNFEASIBLE_MIP_PROBLEM</CODE> if the constraint system contains
+    any trivially unfeasible constraint (tableau was not computed);
+    <CODE>UNBOUNDED_MIP_PROBLEM</CODE> if the problem is trivially unbounded
+    (the computed tableau contains no constraints);
+    <CODE>OPTIMIZED_MIP_PROBLEM></CODE> if the problem is neither trivially
+    unfeasible nor trivially unbounded (the tableau was computed successfully).
   */
-  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+  MIP_Problem_Status compute_tableau(std::vector<dimension_type>&
+				    worked_out_row);
 
-  //! Checks if all the invariants are satisfied.
-  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+  /*! \brief
+    Parses the pending constraints to gather information on
+    how to resize the tableau.
 
-private:
-  //! Exception-safe copy construction mechanism for coefficients.
-  void copy_construct_coefficients(const Row& y);
+    \return
+    <CODE>UNSATISFIABLE</CODE> if is detected a trivially false constraint,
+    <CODE>SATISFIABLE</CODE> otherwise.
 
-#if EXTRA_ROW_DEBUG
-  //! Returns the capacity of the row (only available during debugging).
-  dimension_type capacity() const;
-#endif // EXTRA_ROW_DEBUG
-};
+    \param new_num_rows
+    This will store the number of rows that has to be added to the original
+    tableau.
 
-namespace Parma_Polyhedra_Library {
+    \param num_slack_variables
+    This will store the number of slack variables that has to be added to
+    the original tableau.
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
-/*! \relates Row */
-bool operator==(const Row& x, const Row& y);
+    \param is_tableau_constraint
+    Every element of this vector will be set to <CODE>true</CODE> if the
+    associated pending constraint has to be inserted in the tableau,
+    <CODE>false</CODE> otherwise.
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
-/*! \relates Row */
-bool operator!=(const Row& x, const Row& y);
+    \param nonnegative_variable
+    This will encode for each variable if this one was split or not.
+    Every element of this vector will be set to <CODE>true</CODE> if the
+    associated variable is split, <CODE>false</CODE> otherwise.
 
-} // namespace Parma_Polyhedra_Library
+    \param unfeasible_tableau_rows
+    This will contain all the row indexes of the tableau that are no more
+    satisfied after adding more constraints to \p *this.
+
+    \param satisfied_ineqs
+    This will contain all the row indexes of the tableau that are already
+    satisfied by `last_generator' and do not require artificial variables to
+    have a starting feasible base.
+
+  */
+  bool parse_constraints(dimension_type& new_num_rows,
+			 dimension_type& num_slack_variables,
+			 std::deque<bool>& is_tableau_constraint,
+			 std::deque<bool>& nonnegative_variable,
+			 std::vector<dimension_type>& unfeasible_tableau_rows,
+			 std::deque<bool>& satisfied_ineqs);
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the MIP problem.
+    Implemented with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is returned.
+  */
+  dimension_type textbook_entering_index() const;
+
+  /*! \brief
+    Computes the row index of the variable exiting the base
+    of the MIP problem. Implemented with anti-cycling rules.
+
+    \return
+    The row index of the variable exiting the base.
+
+    \param entering_var_index
+    The column index of the variable entering the base.
+  */
+  dimension_type
+  get_exiting_base_index(dimension_type entering_var_index) const;
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The Row that will be combined with \p y object.
+
+    \param y
+    The Row that will be combined with \p x object.
 
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p x and normalizes it.
+  */
+  static void linear_combine(Row& x, const Row& y, const dimension_type k);
 
-namespace std {
+  /*! \brief
+    Performs the pivoting operation on the tableau.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Row& x,
-	  Parma_Polyhedra_Library::Row& y);
+    \param entering_var_index
+    The index of the variable entering the base.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
-	       std::vector<Parma_Polyhedra_Library::Row>::iterator y);
+    \param exiting_base_index
+    The index of the row exiting the base.
+  */
+  void pivot(dimension_type entering_var_index,
+	     dimension_type exiting_base_index);
 
-} // namespace std
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the MIP problem.
 
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is returned.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The actual implementation of a Row object.
-/*! \ingroup PPL_CXX_interface
-  The class Row_Impl_Handler::Impl provides the implementation of Row
-  objects and, in particular, of the corresponding memory allocation
-  functions.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
-public:
-  //! \name Custom allocator and deallocator
-  //@{
+    To compute the entering_index, the steepest edge algorithm chooses
+    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+    largest in absolute value, where
+    \f[
+      \|\Delta x^{j} \|
+        = \left(
+            1+\sum_{i=1}^{m} \alpha_{ij}^2
+          \right)^{\frac{1}{2}}.
+    \f]
+    Recall that, due to the Integer implementation of the algorithm, our
+    tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
+    can be computed dividing the value of the coefficient by the value of
+    the variable in base. Obviously the result may not be an Integer, so
+    we will proceed in another way: the following code will compute the
+    lcm of all the variables in base to get the good ``weight'' of each
+    Coefficient of the tableau.
+  */
+  dimension_type steepest_edge_entering_index() const;
 
   /*! \brief
-    Allocates a chunk of memory able to contain \p capacity Coefficient objects
-    beyond the specified \p fixed_size and returns a pointer to the new
-    allocated memory.
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
   */
-  static void* operator new(size_t fixed_size, dimension_type capacity);
-
-  //! Uses the standard delete operator to free the memory \p p points to.
-  static void operator delete(void* p);
+  bool compute_simplex();
 
   /*! \brief
-    Placement version:
-    uses the standard operator delete to free the memory \p p points to.
+    Drop unnecessary artificial variables from the tableau and get ready
+    for the second phase of the simplex algorithm.
   */
-  static void operator delete(void* p, dimension_type capacity);
-  //@} // Custom allocator and deallocator
+  void erase_artificials(dimension_type begin_artificials,
+			 dimension_type end_artificials);
 
-  //! Constructor.
-  Impl(Row::Flags f);
+  bool is_in_base(dimension_type var_index,
+		  dimension_type& row_index) const;
 
-  //! Destructor.
-  /*!
-    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
-    to delete all the row elements.
+  /*! \brief
+    Computes a valid generator that satisfies all the constraints of the
+    Linear Programming problem associated to \p *this.
   */
-  ~Impl();
+  void compute_generator() const;
 
-  //! Expands the row to size \p new_size.
-  /*!
-    It is assumed that \p new_size is between the current size and capacity.
-  */
-  void expand_within_capacity(dimension_type new_size);
+  /*! \brief
+    Merges previously split variables in the tableau if a nonnegativity
+    constraint is detected.
 
-  //! Shrinks the row by erasing elements at the end.
-  /*!
-    It is assumed that \p new_size is not greater than the current size.
+    \param var_index
+    The index of the variable that has to be merged.
+
+    \param nonfeasible_cs
+    This will contain all the row indexes that are no more satisfied by
+    the computed generator after merging a variable.
   */
-  void shrink(dimension_type new_size);
+  void merge_split_variables(dimension_type var_index,
+			      std::vector<dimension_type>& nonfeasible_cs);
 
-  //! Exception-safe copy construction mechanism for coefficients.
-  void copy_construct_coefficients(const Impl& y);
+  //! Returns <CODE>true</CODE> if and only if \p c is satisfied by \p g.
+  static bool is_satisfied(const Constraint& c, const Generator& g);
 
-  //! Returns the size() of the largest possible Impl.
-  static dimension_type max_size();
+  //! Returns <CODE>true</CODE> if and only if \p c is saturated by \p g.
+  static bool is_saturated(const Constraint& c, const Generator& g);
 
-  //! \name Flags accessors
-  //@{
-  //! Returns a const reference to the flags of \p *this.
-  const Row::Flags& flags() const;
+  /*! \brief
+    Returns a status that encodes the solution of the MIP problem.
 
-  //! Returns a non-const reference to the flags of \p *this.
-  Row::Flags& flags();
-  //@} // Flags accessors
+    \param have_incumbent_solution
+    It is used to store if the solving process has found a provisional
+    optimum point.
 
-  //! \name Size accessors
-  //@{
-  //! Returns the actual size of \p this.
-  dimension_type size() const;
+    \param incumbent_solution_value
+    Encodes the evaluated value of the provisional optimum point found.
 
-  //! Sets to \p new_size the actual size of \p *this.
-  void set_size(dimension_type new_size);
+    \param incumbent_solution_point
+    If the method returns `OPTIMIZED', this will contain the optimality point.
 
-  //! Increment the size of \p *this by 1.
-  void bump_size();
-  //@} // Size accessors
+    \param mip
+    The problem that has to be solved.
 
-  //! \name Subscript operators
-  //@{
-  //! Returns a reference to the element of \p *this indexed by \p k.
-  Coefficient& operator[](dimension_type k);
+    \param i_vars
+    The variables that are constrained to take an integer value.
+  */
+  static MIP_Problem_Status solve_mip(bool& have_incumbent_solution,
+				      mpq_class& incumbent_solution_value,
+				      Generator& incumbent_solution_point,
+				      MIP_Problem& mip,
+				      const Variables_Set& i_vars);
 
-  //! Returns a constant reference to the element of \p *this indexed by \p k.
-  Coefficient_traits::const_reference operator[](dimension_type k) const;
-  //@} // Subscript operators
+  bool is_lp_satisfiable() const;
 
   /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
-  */
-  memory_size_type total_memory_in_bytes() const;
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+    Used with MIP_Problems with a non empty `i_vars',
+    returns <CODE>true</CODE> if and if only a MIP problem is satisfiable,
+    returns <CODE>false</CODE> otherwise.
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+    \param mip
+    The problem that has to be solved.
 
-private:
-  //! The number of coefficients in the row.
-  dimension_type size_;
+    \param p
+    This will encode the feasible point, only if <CODE>true</CODE> is returned.
 
-  //! The flags of this row.
-  Row::Flags flags_;
+    \param i_vars
+    The variables that are constrained to take an integer value.
+  */
+  static bool is_mip_satisfiable(MIP_Problem& mip, Generator& p,
+				 const Variables_Set& i_vars);
 
-  //! The vector of coefficients.
-  Coefficient vec_[
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-	       1
-#endif
-  ];
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only `last_generator' satisfies all the
+    integrality coditions.
 
-  //! Private and unimplemented: default construction is not allowed.
-  Impl();
+    \param mip
+    The MIP problem.
 
-  //! Private and unimplemented: copy construction is not allowed.
-  Impl(const Impl& y);
+    \param i_vars
+    The variables that are constrained to take an integer value.
 
-  //! Private and unimplemented: assignment is not allowed.
-  Impl& operator=(const Impl&);
+    \param branching_index
+    If <CODE>false</CODE> is returned, this will encode the variable index on
+    which must be applied the `branch and bound' algorithm.
+  */
+  static bool choose_branching_variable(const MIP_Problem& mip,
+					const Variables_Set& i_vars,
+					dimension_type& branching_index);
 };
 
-// Automatically generated from PPL source file ../src/Row.inlines.hh line 1
-/* Row class implementation: inline functions.
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+void swap(Parma_Polyhedra_Library::MIP_Problem& x,
+	  Parma_Polyhedra_Library::MIP_Problem& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.inlines.hh line 1
+/* MIP_Problem class implementation: inline functions.
 */
 
 
-// Automatically generated from PPL source file ../src/Row.inlines.hh line 27
-#include <cassert>
-#include <algorithm>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.inlines.hh line 27
+#include <stdexcept>
 
 namespace Parma_Polyhedra_Library {
 
-inline
-Row::Flags::Flags()
-  : bits(0) {
+inline dimension_type
+MIP_Problem::max_space_dimension() {
+  return Constraint::max_space_dimension();
 }
 
-inline
-Row::Flags::Flags(base_type n)
-  : bits(n) {
+inline dimension_type
+MIP_Problem::space_dimension() const {
+  return external_space_dim;
 }
 
-inline Row::Flags::base_type
-Row::Flags::get_bits() const {
-  return bits;
-}
 
-inline void
-Row::Flags::set_bits(const base_type mask) {
-  bits |= mask;
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    tableau(y.tableau),
+    working_cost(y.working_cost),
+    mapping(y.mapping),
+    base(y.base),
+    status(y.status),
+    initialized(y.initialized),
+    input_cs(y.input_cs),
+    first_pending_constraint(y.first_pending_constraint),
+    input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode),
+    last_generator(y.last_generator),
+    i_variables(y.i_variables) {
+  assert(OK());
 }
 
-inline void
-Row::Flags::reset_bits(const base_type mask) {
-  bits &= ~mask;
+inline
+MIP_Problem::~MIP_Problem() {
 }
 
-inline bool
-Row::Flags::test_bits(const base_type mask) const {
-  return (bits & mask) == mask;
-}
 
-inline bool
-Row::Flags::operator==(const Flags& y) const {
-  base_type mask = low_bits_mask<base_type>(first_free_bit);
-  return (get_bits() & mask) == (y.get_bits() & mask);
+inline void
+MIP_Problem::set_optimization_mode(const Optimization_Mode mode) {
+  if (opt_mode != mode) {
+    opt_mode = mode;
+    if (status == UNBOUNDED || status == OPTIMIZED)
+      status = SATISFIABLE;
+    assert(OK());
+  }
 }
 
-inline bool
-Row::Flags::operator!=(const Flags& y) const {
-  return !operator==(y);
+inline const Linear_Expression&
+MIP_Problem::objective_function() const {
+  return input_obj_function;
 }
 
-inline void*
-Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
-				     const dimension_type capacity) {
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  return ::operator new(fixed_size + capacity*sizeof(Coefficient));
-#else
-  assert(capacity >= 1);
-  return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient));
-#endif
+inline Optimization_Mode
+MIP_Problem::optimization_mode() const {
+  return opt_mode;
 }
 
 inline void
-Row_Impl_Handler::Impl::operator delete(void* p) {
-  ::operator delete(p);
+MIP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
+  const Generator& g = optimizing_point();
+  evaluate_objective_function(g, num, den);
 }
 
-inline void
-Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) {
-  ::operator delete(p);
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_begin() const {
+  return input_cs.begin();
 }
 
-inline dimension_type
-Row_Impl_Handler::Impl::max_size() {
-  return size_t(-1)/sizeof(Coefficient);
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_end() const {
+  return input_cs.end();
 }
 
-inline dimension_type
-Row_Impl_Handler::Impl::size() const {
-  return size_;
+inline const Variables_Set&
+MIP_Problem::integer_space_dimensions() const {
+  return i_variables;
 }
 
 inline void
-Row_Impl_Handler::Impl::set_size(const dimension_type new_size) {
-  size_ = new_size;
+MIP_Problem::swap(MIP_Problem& y) {
+  std::swap(external_space_dim, y.external_space_dim);
+  std::swap(internal_space_dim, y.internal_space_dim);
+  std::swap(tableau, y.tableau);
+  std::swap(working_cost, y.working_cost);
+  std::swap(mapping, y.mapping);
+  std::swap(initialized, y.initialized);
+  std::swap(base, y.base);
+  std::swap(status, y.status);
+  std::swap(input_cs, y.input_cs);
+  std::swap(first_pending_constraint, y.first_pending_constraint);
+  std::swap(input_obj_function, y.input_obj_function);
+  std::swap(opt_mode, y.opt_mode);
+  std::swap(last_generator, y.last_generator);
+  std::swap(i_variables, y.i_variables);
 }
 
-inline void
-Row_Impl_Handler::Impl::bump_size() {
-  ++size_;
+inline MIP_Problem&
+MIP_Problem::operator=(const MIP_Problem& y) {
+  MIP_Problem tmp(y);
+  swap(tmp);
+  return *this;
 }
 
-inline
-Row_Impl_Handler::Impl::Impl(const Row::Flags f)
-  : size_(0), flags_(f) {
+inline void
+MIP_Problem::clear() {
+  MIP_Problem tmp;
+  swap(tmp);
 }
 
-inline
-Row_Impl_Handler::Impl::~Impl() {
-  shrink(0);
+inline memory_size_type
+MIP_Problem::external_memory_in_bytes() const {
+  memory_size_type n
+    = tableau.external_memory_in_bytes()
+    + working_cost.external_memory_in_bytes()
+    + input_obj_function.external_memory_in_bytes()
+    + last_generator.external_memory_in_bytes();
+  // Adding the external memory for `input_cs'.
+  n += input_cs.capacity() * sizeof(Constraint);
+  for (const_iterator i = input_cs.begin(),
+	 i_end = input_cs.end(); i != i_end; ++i)
+    n += (i->external_memory_in_bytes());
+  // Adding the external memory for `base'.
+  n += base.capacity() * sizeof(dimension_type);
+  // Adding the external memory for `mapping'.
+  n += mapping.capacity() * sizeof(std::pair<dimension_type, dimension_type>);
+  return n;
 }
 
-inline const Row::Flags&
-Row_Impl_Handler::Impl::flags() const {
-  return flags_;
+inline memory_size_type
+MIP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
 }
 
-inline Row::Flags&
-Row_Impl_Handler::Impl::flags() {
-  return flags_;
-}
+} // namespace Parma_Polyhedra_Library
 
-inline Coefficient&
-Row_Impl_Handler::Impl::operator[](const dimension_type k) {
-  assert(k < size());
-  return vec_[k];
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+inline void
+swap(Parma_Polyhedra_Library::MIP_Problem& x,
+     Parma_Polyhedra_Library::MIP_Problem& y) {
+  x.swap(y);
 }
 
-inline Coefficient_traits::const_reference
-Row_Impl_Handler::Impl::operator[](const dimension_type k) const {
-  assert(k < size());
-  return vec_[k];
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.templates.hh line 1
+/* MIP_Problem class implementation: non-inline template functions.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.templates.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+MIP_Problem::MIP_Problem(const dimension_type dim,
+			 In first,
+			 In last,
+			 const Variables_Set& int_vars,
+			 const Linear_Expression& obj,
+			 const Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0, Row::Flags()),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    initialized(false),
+    input_cs(),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables(int_vars) {
+  // Check that integer Variables_Set does not exceed the space dimension
+  // of the problem.
+  if (i_variables.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem"
+      << "(dim, first, last, int_vars, obj, mode):\n"
+      << "dim == "<< external_space_dim << " and int_vars.space_dimension() =="
+      << " " << i_variables.space_dimension() << " are dimension"
+      "incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+
+   // Check for space dimension overflow.
+   if (dim > max_space_dimension())
+     throw std::length_error("PPL::MIP_Problem:: MIP_Problem(dim, first, "
+			     "last, int_vars, obj, mode):\n"
+			     "dim exceeds the maximum allowed"
+			     "space dimension.");
+   // Check the objective function.
+   if (obj.space_dimension() > dim) {
+     std::ostringstream s;
+     s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+       << "int_vars, obj, mode):\n"
+       << "obj.space_dimension() == "<< obj.space_dimension()
+       << " exceeds d == "<< dim << ".";
+     throw std::invalid_argument(s.str());
+   }
+   // Check the constraints.
+   for (In i = first; i != last; ++i) {
+     if (i->is_strict_inequality())
+       throw std::invalid_argument("PPL::MIP_Problem::"
+				   "MIP_Problem(dim, first, last, int_vars,"
+				   "obj, mode):\nrange [first, last) contains"
+				   "a strict inequality constraint.");
+     if (i->space_dimension() > dim) {
+       std::ostringstream s;
+       s << "PPL::MIP_Problem::"
+	 << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+	 << "range [first, last) contains a constraint having space"
+	 << "dimension  == " << i->space_dimension() << " that exceeds"
+	 "this->space_dimension == " << dim << ".";
+       throw std::invalid_argument(s.str());
+     }
+     input_cs.push_back(*i);
+   }
+   assert(OK());
+}
+
+template <typename In>
+MIP_Problem::MIP_Problem(dimension_type dim,
+			 In first, In last,
+			 const Linear_Expression& obj,
+			 Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0, Row::Flags()),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    initialized(false),
+    input_cs(),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::"
+			    "MIP_Problem(dim, first, last, obj, mode):\n"
+			    "dim exceeds the maximum allowed space "
+			    "dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+      << " obj, mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds d == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraints.
+  for (In i = first; i != last; ++i) {
+    if (i->is_strict_inequality())
+      throw std::invalid_argument("PPL::MIP_Problem::"
+				  "MIP_Problem(dim, first, last, obj, mode):\n"
+				  "range [first, last) contains a strict "
+				  "inequality constraint.");
+    if (i->space_dimension() > dim) {
+      std::ostringstream s;
+      s << "PPL::MIP_Problem::"
+	<< "MIP_Problem(dim, first, last, obj, mode):\n"
+	<< "range [first, last) contains a constraint having space"
+	<< "dimension" << " == " << i->space_dimension() << " that exceeds"
+	"this->space_dimension == " << dim << ".";
+      throw std::invalid_argument(s.str());
+    }
+    input_cs.push_back(*i);
+  }
+  assert(OK());
 }
 
-inline memory_size_type
-Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
-  return
-    sizeof(*this)
-    + capacity*sizeof(Coefficient)
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-    - 1*sizeof(Coefficient)
-#endif
-    + external_memory_in_bytes();
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/MIP_Problem.defs.hh line 748
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.templates.hh line 28
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Polyhedron::Polyhedron(Topology topol,
+                       const Box<Interval>& box,
+                       Complexity_Class)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Initialize the space dimension as indicated by the box.
+  space_dim = box.space_dimension();
+
+  // Check for emptiness.
+  if (box.is_empty()) {
+    set_empty();
+    return;
+  }
+
+  // Zero-dim universe polyhedron.
+  if (space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Insert a dummy constraint of the highest dimension to avoid the
+  // need of resizing the matrix of constraints later;
+  // this constraint will be removed at the end.
+  con_sys.insert(Variable(space_dim - 1) >= 0);
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+  TEMP_INTEGER(u_n);
+  TEMP_INTEGER(u_d);
+
+  if (topol == NECESSARILY_CLOSED) {
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * Variable(k) == l_n);
+      }
+      else {
+        if (l_bounded)
+          // Add the constraint `l_d*v_k >= l_n'.
+          con_sys.insert(l_d * Variable(k) >= l_n);
+        if (u_bounded)
+          // Add the constraint `u_d*v_k <= u_n'.
+          con_sys.insert(u_d * Variable(k) <= u_n);
+      }
+    }
+  }
+  else {
+    // topol == NOT_NECESSARILY_CLOSED
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * Variable(k) == l_n);
+      }
+      else {
+        // Check if a lower bound constraint is required.
+        if (l_bounded) {
+          if (l_closed)
+            // Add the constraint `l_d*v_k >= l_n'.
+            con_sys.insert(l_d * Variable(k) >= l_n);
+          else
+            // Add the constraint `l_d*v_k > l_n'.
+            con_sys.insert(l_d * Variable(k) > l_n);
+        }
+        // Check if an upper bound constraint is required.
+        if (u_bounded) {
+          if (u_closed)
+            // Add the constraint `u_d*v_k <= u_n'.
+            con_sys.insert(u_d * Variable(k) <= u_n);
+          else
+            // Add the constraint `u_d*v_k < u_n'.
+            con_sys.insert(u_d * Variable(k) < u_n);
+        }
+      }
+    }
+  }
+
+  // Adding the low-level constraints.
+  con_sys.add_low_level_constraints();
+  // Now removing the dummy constraint inserted before.
+  dimension_type n_rows = con_sys.num_rows() - 1;
+  con_sys[0].swap(con_sys[n_rows]);
+  con_sys.set_sorted(false);
+  // NOTE: here there are no pending constraints.
+  con_sys.set_index_first_pending_row(n_rows);
+  con_sys.erase_to_end(n_rows);
+
+  // Constraints are up-to-date.
+  set_constraints_up_to_date();
+  assert(OK());
 }
 
-inline memory_size_type
-Row_Impl_Handler::Impl::total_memory_in_bytes() const {
-  // In general, this is a lower bound, as the capacity of *this
-  // may be strictly greater than `size_'
-  return total_memory_in_bytes(size_);
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the polyhedron becomes zero_dimensional.
+    if (marked_empty()
+	|| (has_pending_constraints()
+	    && !remove_pending_to_obtain_generators())
+	|| (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty polyhedron.
+      space_dim = 0;
+      con_sys.clear();
+    }
+    else
+      // Removing all dimensions from a non-empty polyhedron.
+      set_zero_dim_univ();
+
+    assert(OK());
+    return;
+  }
+
+  const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    // We first compute suitable permutation cycles for the columns of
+    // the `con_sys' and `gen_sys' matrices.  We will represent them
+    // with a linear array, using 0 as a terminator for each cycle
+    // (notice that the columns with index 0 of `con_sys' and
+    // `gen_sys' represent the inhomogeneous terms, and thus are
+    // unaffected by the permutation of dimensions).
+    // Cycles of length 1 will be omitted so that, in the worst case,
+    // we will have `space_dim' elements organized in `space_dim/2'
+    // cycles, which means we will have at most `space_dim/2'
+    // terminators.
+    std::vector<dimension_type> cycles;
+    cycles.reserve(space_dim + space_dim/2);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+	dimension_type j = i;
+	do {
+	  visited[j] = true;
+	  // The following initialization is only to make the compiler happy.
+	  dimension_type k = 0;
+	  if (!pfunc.maps(j, k))
+	    throw_invalid_argument("map_space_dimensions(pfunc)",
+				   " pfunc is inconsistent");
+	  if (k == j)
+	    // Cycle of length 1: skip it.
+	    goto skip;
+
+	  cycles.push_back(j+1);
+	  // Go along the cycle.
+	  j = k;
+	} while (!visited[j]);
+	// End of cycle: mark it.
+	cycles.push_back(0);
+      skip:
+	;
+      }
+    }
+
+    // If `cycles' is empty then `pfunc' is the identity.
+    if (cycles.empty())
+      return;
+
+    // Permute all that is up-to-date.  Notice that the contents of
+    // the saturation matrices is unaffected by the permutation of
+    // columns: they remain valid, if they were so.
+    if (constraints_are_up_to_date())
+      con_sys.permute_columns(cycles);
+
+    if (generators_are_up_to_date())
+      gen_sys.permute_columns(cycles);
+
+    assert(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  // If there are pending constraints, using `generators()' we process them.
+  const Generator_System& old_gensys = generators();
+
+  if (old_gensys.has_no_rows()) {
+    // The polyhedron is empty.
+    Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+    std::swap(*this, new_polyhedron);
+    assert(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Generator_System new_gensys;
+  for (Generator_System::const_iterator i = old_gensys.begin(),
+	 old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+    const Generator& old_g = *i;
+    Linear_Expression e(0 * Variable(new_space_dimension-1));
+    bool all_zeroes = true;
+    for (dimension_type j = space_dim; j-- > 0; ) {
+      if (old_g.coefficient(Variable(j)) != 0
+	  && pfunc_maps[j] != not_a_dimension()) {
+	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+	all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Generator::LINE:
+      if (!all_zeroes)
+	new_gensys.insert(line(e));
+      break;
+    case Generator::RAY:
+      if (!all_zeroes)
+	new_gensys.insert(ray(e));
+      break;
+    case Generator::POINT:
+      // A point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(point(e, old_g.divisor()));
+      break;
+    case Generator::CLOSURE_POINT:
+      // A closure point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(closure_point(e, old_g.divisor()));
+      break;
+    }
+  }
+  Polyhedron new_polyhedron(topology(), new_gensys);
+  std::swap(*this, new_polyhedron);
+  assert(OK(true));
 }
 
-inline dimension_type
-Row::max_size() {
-  return Impl::max_size();
-}
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Polyhedron.defs.hh line 2689
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.defs.hh line 1
+/* Grid class declaration.
+*/
+
 
-inline dimension_type
-Row::size() const {
-  return impl->size();
-}
+#define STRONG_REDUCTION 1
 
-inline const Row::Flags&
-Row::flags() const {
-  return impl->flags();
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.defs.hh line 50
+#include <vector>
+#include <iosfwd>
 
-inline Row::Flags&
-Row::flags() {
-  return impl->flags();
-}
+namespace Parma_Polyhedra_Library {
 
-#if EXTRA_ROW_DEBUG
-inline dimension_type
-Row::capacity() const {
-  return capacity_;
-}
-#endif
+namespace IO_Operators {
 
-inline
-Row_Impl_Handler::Row_Impl_Handler()
-  : impl(0) {
-#if EXTRA_ROW_DEBUG
-  capacity_ = 0;
-#endif
-}
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid
+  Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+  is written if \p gr is an empty grid; <CODE>true</CODE> is written
+  if \p gr is a universe grid; a minimized system of congruences
+  defining \p gr is written otherwise, all congruences in one row
+  separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
 
-inline
-Row_Impl_Handler::~Row_Impl_Handler() {
-  delete impl;
-}
+} // namespace IO_Operators
 
-inline
-Row::Row()
-  : Row_Impl_Handler() {
-}
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  grid.
 
-inline void
-Row::allocate(
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-	       const
-#endif
-	       dimension_type capacity,
-	       const Flags f) {
-  assert(capacity <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  if (capacity == 0)
-    ++capacity;
-#endif
-  assert(impl == 0);
-  impl = new (capacity) Impl(f);
-#if EXTRA_ROW_DEBUG
-  assert(capacity_ == 0);
-  capacity_ = capacity;
-#endif
-}
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
 
-inline void
-Row::expand_within_capacity(const dimension_type new_size) {
-  assert(impl);
-#if EXTRA_ROW_DEBUG
-  assert(new_size <= capacity_);
-#endif
-  impl->expand_within_capacity(new_size);
-}
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  grids.
 
-inline void
-Row::copy_construct_coefficients(const Row& y) {
-  assert(impl && y.impl);
-#if EXTRA_ROW_DEBUG
-  assert(y.size() <= capacity_);
-#endif
-  impl->copy_construct_coefficients(*(y.impl));
-}
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
 
-inline void
-Row::construct(const dimension_type sz,
-	       const dimension_type capacity,
-	       const Flags f) {
-  assert(sz <= capacity && capacity <= max_size());
-  allocate(capacity, f);
-  expand_within_capacity(sz);
-}
+} // namespace Parma_Polyhedra_Library
 
-inline void
-Row::construct(const dimension_type sz, const Flags f) {
-  construct(sz, sz, f);
-}
 
-inline
-Row::Row(const dimension_type sz,
-	 const dimension_type capacity,
-	 const Flags f)
-  : Row_Impl_Handler() {
-  construct(sz, capacity, f);
-}
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid represents a rational grid.
 
-inline
-Row::Row(const dimension_type sz, const Flags f)
-  : Row_Impl_Handler() {
-  construct(sz, f);
-}
+  A grid can be specified as either a finite system of congruences
+  or a finite system of generators (see Section \ref
+  sect_rational_grids) and it is always possible to obtain either
+  representation.
+  That is, if we know the system of congruences, we can obtain
+  from this a system of generators that define the same grid
+  and vice versa.
+  These systems can contain redundant members, or they can be in the
+  minimal form.
 
-inline
-Row::Row(const Row& y)
-  : Row_Impl_Handler() {
-  if (y.impl) {
-    allocate(compute_capacity(y.size(), max_size()), y.flags());
-    copy_construct_coefficients(y);
-  }
-}
+  A key attribute of any grid is its space dimension (the dimension
+  \f$n \in \Nset\f$ of the enclosing vector space):
 
-inline
-Row::Row(const Row& y,
-	 const dimension_type capacity)
-  : Row_Impl_Handler() {
-  assert(y.impl);
-  assert(y.size() <= capacity && capacity <= max_size());
-  allocate(capacity, y.flags());
-  copy_construct_coefficients(y);
-}
+  - all grids, the empty ones included, are endowed with a space
+    dimension;
+  - most operations working on a grid and another object (another
+    grid, a congruence, a generator, a set of variables, etc.) will
+    throw an exception if the grid and the object are not
+    dimension-compatible (see Section \ref Grid_Space_Dimensions);
+  - the only ways in which the space dimension of a grid can be
+    changed are with <EM>explicit</EM> calls to operators provided for
+    that purpose, and with standard copy, assignment and swap
+    operators.
 
-inline
-Row::Row(const Row& y,
-	 const dimension_type sz,
-	 const dimension_type capacity)
-  : Row_Impl_Handler() {
-  assert(y.impl);
-  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
-  allocate(capacity, y.flags());
-  copy_construct_coefficients(y);
-  expand_within_capacity(sz);
-}
+  Note that two different grids can be defined on the zero-dimension
+  space: the empty grid and the universe grid \f$R^0\f$.
 
-inline
-Row::~Row() {
-}
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
 
-inline void
-Row::shrink(const dimension_type new_size) {
-  assert(impl);
-  impl->shrink(new_size);
-}
+  \par Example 1
+  The following code builds a grid corresponding to the even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying three of the points:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 2*y));
+  gs.insert(grid_point(2*x + 0*y));
+  Grid gr(gs);
+  \endcode
 
-inline void
-Row::swap(Row& y) {
-  std::swap(impl, y.impl);
-#if EXTRA_ROW_DEBUG
-  std::swap(capacity_, y.capacity_);
-#endif
-}
+  \par Example 2
+  The following code builds a grid corresponding to a line in
+  \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a line:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_line(x + y));
+  Grid gr(gs);
+  \endcode
 
-inline void
-Row::assign(Row& y) {
-  impl = y.impl;
-#if EXTRA_ROW_DEBUG
-  capacity_ = y.capacity_;
-#endif
-}
+  \par Example 3
+  The following code builds a grid corresponding to the integral
+  points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+  by adding an equality and congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  cgs.insert(x %= 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a parameter:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(x + y));
+  Grid gr(gs);
+  \endcode
 
-inline Row&
-Row::operator=(const Row& y) {
-  // Copy-construct `tmp' from `y'.
-  Row tmp(y);
-  // Swap the implementation of `*this' with the one of `tmp'.
-  swap(tmp);
-  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
-  return *this;
-}
+  \par Example 4
+  The following code builds the grid corresponding to a plane by
+  creating the universe grid in \f$\Rset^2\f$:
+  \code
+  Grid gr(2);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+  generators (a point, and two lines).
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_line(x));
+  gr.add_grid_generator(grid_line(y));
+  \endcode
+  Note that a generator system must contain a point when describing
+  a grid.  To ensure that this is always the case it is required
+  that the first generator inserted in an empty grid is a point
+  (otherwise, an exception is thrown).
 
-inline Coefficient&
-Row::operator[](const dimension_type k) {
-  assert(impl);
-  return (*impl)[k];
-}
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe grid in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality congruence,
+  thus obtaining the grid corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting grid is
+  \f[
+  \bigl\{\,
+  (2, y)^\transpose \in \Rset^2
+  \bigm|
+  y \in \Rset
+  \,\bigr\}.
+  \f]
 
-inline Coefficient_traits::const_reference
-Row::operator[](const dimension_type k) const {
-  assert(impl);
-  return (*impl)[k];
-}
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting grid is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
 
-inline memory_size_type
-Row::external_memory_in_bytes(dimension_type capacity) const {
-  return impl->total_memory_in_bytes(capacity);
-}
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_image(x, expr);
+  \endcode
+  In this example the starting grid is all the pairs of \f$x\f$ and
+  \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2.  The considered variable
+  is \f$x\f$ and the affine expression is \f$x+3\f$.  The resulting
+  grid is the given grid translated 3 integers to the right (all the
+  pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2).
+  Moreover, if the affine transformation for the same variable \p x
+  is instead \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is every second integral point along the \f$x=y\f$
+  line, with this line of points repeated at every fourth integral value
+  along the \f$x\f$ axis.
+  Instead, if we do not use an invertible transformation for the
+  same variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every second point along the \f$x=y\f$ line.
 
-inline memory_size_type
-Row::total_memory_in_bytes(dimension_type capacity) const {
-  return sizeof(*this) + external_memory_in_bytes(capacity);
-}
+  \par Example 8
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_preimage(x, expr);
+  \endcode
+  In this example the starting grid, \p var and the affine
+  expression and the denominator are the same as in Example 6, while
+  the resulting grid is similar but translated 3 integers to the
+  left (all the pairs \f$(x, y)\f$
+  where \f$x\f$ is -3 plus an integer multiple of 4 and
+  \f$y\f$ is an integer multiple of 2)..
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is a similar grid to the result in Example 6,
+  only the grid is slanted along \f$x=-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every fourth line parallel to the \f$x\f$
+  axis.
 
-inline memory_size_type
-Row::external_memory_in_bytes() const {
-#if EXTRA_ROW_DEBUG
-  return impl->total_memory_in_bytes(capacity_);
-#else
-  return impl->total_memory_in_bytes();
-#endif
-}
+  \par Example 9
+  For this example we also use the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*x + y +0*z + 2*w));
+  Grid gr(gs);
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  gr.remove_space_dimensions(to_be_removed);
+  \endcode
+  The starting grid is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting grid is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> to_be_removed1;
+  to_be_removed1.insert(y);
+  gr.remove_space_dimensions(to_be_removed1);
+  set<Variable> to_be_removed2;
+  to_be_removed2.insert(z);
+  gr.remove_space_dimensions(to_be_removed2);
+  \endcode
+  In this case, the result is the grid
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p to_be_removed2
+  we are actually removing variable \f$w\f$ of the original grid.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
 
-inline memory_size_type
-Row::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+class Parma_Polyhedra_Library::Grid {
+public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
 
-/*! \relates Row */
-inline bool
-operator!=(const Row& x, const Row& y) {
-  return !(x == y);
-}
+  //! Returns the maximum space dimension all kinds of Grid can handle.
+  static dimension_type max_space_dimension();
 
-} // namespace Parma_Polyhedra_Library
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
 
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
 
-namespace std {
+  //! Builds a grid having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
 
-/*! \relates Parma_Polyhedra_Library::Row */
-inline void
-swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) {
-  x.swap(y);
-}
+    \param kind
+    Specifies whether the universe or the empty grid has to be built.
 
-/*! \relates Parma_Polyhedra_Library::Row */
-inline void
-iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
-	  std::vector<Parma_Polyhedra_Library::Row>::iterator y) {
-  swap(*x, *y);
-}
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(dimension_type num_dimensions = 0,
+		Degenerate_Element kind = UNIVERSE);
 
-} // namespace std
+  //! Builds a grid, copying a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
 
-// Automatically generated from PPL source file ../src/Row.defs.hh line 495
+    \param cgs
+    The system of congruences defining the grid.
 
-// Automatically generated from PPL source file ../src/Matrix.defs.hh line 31
-#include <vector>
-#include <cstddef>
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Congruence_System& cgs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A 2-dimensional matrix of coefficients.
-/*! \ingroup PPL_CXX_interface
-  A Matrix object is a sequence of Row objects and is characterized
-  by the matrix dimensions (the number of rows and columns).
-  All the rows in a matrix, besides having the same size (corresponding
-  to the number of columns of the matrix), are also bound to have the
-  same capacity.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Builds a grid, recycling a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
 
-class Parma_Polyhedra_Library::Matrix {
-public:
-  //! Returns the maximum number of rows of a Matrix.
-  static dimension_type max_num_rows();
+    \param cgs
+    The system of congruences defining the grid.  Its data-structures
+    may be recycled to build the grid.
 
-  //! Returns the maximum number of columns of a Matrix.
-  static dimension_type max_num_columns();
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-  //! Builds an empty matrix.
-  /*!
-    Rows' size and capacity are initialized to \f$0\f$.
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
   */
-  Matrix();
+  Grid(Congruence_System& cgs, Recycle_Input dummy);
 
-  //! Builds a zero matrix with specified dimensions and flags.
+  //! Builds a grid, copying a system of constraints.
   /*!
-    \param n_rows
-    The number of rows of the matrix that will be created;
+    The grid inherits the space dimension of the constraint system.
 
-    \param n_columns
-    The number of columns of the matrix that will be created.
+    \param cs
+    The system of constraints defining the grid.
 
-    \param row_flags
-    The flags used to build the rows of the matrix;
-    by default, the rows will have all flags unset.
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
   */
-  Matrix(dimension_type n_rows, dimension_type n_columns,
-	 Row::Flags row_flags = Row::Flags());
+  explicit Grid(const Constraint_System& cs);
 
-  //! Copy-constructor.
-  Matrix(const Matrix& y);
+  //! Builds a grid, recycling a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
 
-  //! Destructor.
-  ~Matrix();
+    \param cs
+    The system of constraints defining the grid.  Its data-structures
+    may be recycled to build the grid.
 
-  //! Assignment operator.
-  Matrix& operator=(const Matrix& y);
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! An iterator over a matrix.
-  /*! \ingroup PPL_CXX_interface
-    A const_iterator is used to provide read-only access
-    to each row contained in a Matrix object.
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  class const_iterator {
-  private:
-    typedef std::vector<Row>::const_iterator Iter;
-    //! The const iterator on the rows' vector \p rows.
-    Iter i;
+  Grid(Constraint_System& cs, Recycle_Input dummy);
 
-  public:
-    typedef std::forward_iterator_tag iterator_category;
-    typedef std::iterator_traits<Iter>::value_type value_type;
-    typedef std::iterator_traits<Iter>::difference_type difference_type;
-    typedef std::iterator_traits<Iter>::pointer pointer;
-    typedef std::iterator_traits<Iter>::reference reference;
+  //! Builds a grid, copying a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
 
-    //! Default constructor.
-    const_iterator();
+    \param const_gs
+    The system of generators defining the grid.
 
-    /*! \brief
-      Builds a const iterator on the matrix starting from
-      an iterator \p b on the elements of the vector \p rows.
-    */
-    explicit const_iterator(const Iter& b);
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
 
-    //! Ordinary copy-constructor.
-    const_iterator(const const_iterator& y);
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Grid_Generator_System& const_gs);
 
-    //! Assignment operator.
-    const_iterator& operator=(const const_iterator& y);
+  //! Builds a grid, recycling a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
 
-    //! Dereference operator.
-    reference operator*() const;
+    \param gs
+    The system of generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
 
-    //! Indirect member selector.
-    pointer operator->() const;
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-    //! Prefix increment operator.
-    const_iterator& operator++();
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
 
-    //! Postfix increment operator.
-    const_iterator operator++(int);
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  */
+  Grid(Grid_Generator_System& gs, Recycle_Input dummy);
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are identical.
-    */
-    bool operator==(const const_iterator& y) const;
+  //! Builds a grid out of a box.
+  /*!
+    The grid inherits the space dimension of the box.
+    The built grid is the most precise grid that includes the box.
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are different.
-    */
-    bool operator!=(const const_iterator& y) const;
-  };
+    \param box
+    The box representing the grid to be built.
 
-  /*! \brief
-    Returns the const_iterator pointing to the first row, if \p *this is
-    not empty; otherwise, returns the past-the-end const_iterator.
-  */
-  const_iterator begin() const;
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Grid(const Box<Interval>& box,
+                Complexity_Class complexity = ANY_COMPLEXITY);
 
-  // FIXME: the following section must become private.
-protected:
-  //! Contains the rows of the matrix.
-  std::vector<Row> rows;
+  //! Builds a grid out of a bounded-difference shape.
+  /*!
+    The grid inherits the space dimension of the BDS.
+    The built grid is the most precise grid that includes the BDS.
 
-  //! Size of the initialized part of each row.
-  dimension_type row_size;
+    \param bd
+    The BDS representing the grid to be built.
 
-  //! Capacity allocated for each row.
-  dimension_type row_capacity;
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-public:
-  //! Swaps \p *this with \p y.
-  void swap(Matrix& y);
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Grid(const BD_Shape<U>& bd,
+                Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags.
+  //! Builds a grid out of an octagonal shape.
   /*!
-    \param n
-    The number of rows to be added: must be strictly positive.
+    The grid inherits the space dimension of the octagonal shape.
+    The built grid is the most precise grid that includes the octagonal shape.
 
-    \param row_flags
-    Flags for the newly added rows.
+    \param os
+    The octagonal shape representing the grid to be built.
 
-    Turns the \f$r \times c\f$ matrix \f$M\f$ into
-    the \f$(r+n) \times c\f$ matrix \f$M \choose 0\f$.
-    The matrix is expanded avoiding reallocation whenever possible.
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
   */
-  void add_zero_rows(dimension_type n, Row::Flags row_flags);
+  template <typename U>
+  explicit Grid(const Octagonal_Shape<U>& os,
+                Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Adds \p n columns of zeroes to the matrix.
+  //! Builds a grid out of a generic, interval-based covering box.
   /*!
-    \param n
-    The number of columns to be added: must be strictly positive.
+    The covering box is a set of upper and lower values for each
+    dimension.  When a covering box is tiled onto empty space the
+    corners of the tiles form a rectilinear grid.
 
-    Turns the \f$r \times c\f$ matrix \f$M\f$ into
-    the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
-    The matrix is expanded avoiding reallocation whenever possible.
-  */
-  void add_zero_columns(dimension_type n);
+    A box interval with only one bound fixes the values of all grid
+    points in the dimension associated with the box to the value of
+    the bound.  A box interval which has upper and lower bounds of
+    equal value allows all grid points with any value in the dimension
+    associated with the interval.  The presence of a universe interval
+    results in the empty grid.  The empty box produces the empty grid
+    of the same dimension as the box.
 
-  //! Adds \p n rows and \p m columns of zeroes to the matrix.
-  /*!
-    \param n
-    The number of rows to be added: must be strictly positive.
+    \param box
+    The covering box representing the grid to be built;
 
-    \param m
-    The number of columns to be added: must be strictly positive.
+    \param dummy
+    A dummy tag to make this constructor syntactically unique.
 
-    \param row_flags
-    Flags for the newly added rows.
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
 
-    Turns the \f$r \times c\f$ matrix \f$M\f$ into
-    the \f$(r+n) \times (c+m)\f$ matrix
-    \f$\bigl({M \atop 0}{0 \atop 0}\bigr)\f$.
-    The matrix is expanded avoiding reallocation whenever possible.
+    \exception std::invalid_argument
+    Thrown if \p box contains any topologically open bounds.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the covering box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the covering box
+    describes the empty set.
+    \code
+      bool get_lower_bound(dimension_type k, bool& closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool& closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
   */
-  void add_zero_rows_and_columns(dimension_type n, dimension_type m,
-				 Row::Flags row_flags);
+  template <typename Box>
+  Grid(const Box& box, From_Covering_Box dummy);
 
-  //! Adds a copy of the row \p y to the matrix.
-  /*!
-    \param y
-    The row to be copied: it must have the same number of columns as
-    the matrix.
+  /*! \brief
+    Builds a grid from a polyhedron using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the grid built is the
+    smallest one containing \p ph.
 
-    Turns the \f$r \times c\f$ matrix \f$M\f$ into
-    the \f$(r+1) \times c\f$ matrix
-    \f$\bigl({M \atop 0}\bigr)\f$.
-    The matrix is expanded avoiding reallocation whenever possible.
+    The grid inherits the space dimension of polyhedron.
+
+    \param ph
+    The polyhedron.
+
+    \param complexity
+    The complexity class.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
   */
-  void add_row(const Row& y);
+  explicit Grid(const Polyhedron& ph,
+                Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Adds the row \p y to the matrix.
+  //! Ordinary copy-constructor.
   /*!
-    \param y
-    The row to be added: it must have the same size and capacity as \p
-    *this.
+    The complexity argument is ignored.
+  */
+  Grid(const Grid& y,
+       Complexity_Class complexity = ANY_COMPLEXITY);
 
-    Turns the \f$r \times c\f$ matrix \f$M\f$ into
-    the \f$(r+1) \times c\f$ matrix
-    \f$\bigl({M \atop 0}\bigr)\f$.
-    The matrix is expanded avoiding reallocation whenever possible.
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
   */
-  void add_recycled_row(Row& y);
+  Grid& operator=(const Grid& y);
 
-  //! Makes the matrix shrink by removing its \p n trailing columns.
-  void remove_trailing_columns(dimension_type n);
+  //! \name Member Functions that Do Not Modify the Grid
+  //@{
 
-  //! Resizes the matrix without worrying about the old contents.
-  /*!
-    \param new_n_rows
-    The number of rows of the resized matrix;
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-    \param new_n_columns
-    The number of columns of the resized matrix.
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns
+    the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+  */
+  dimension_type affine_dimension() const;
 
-    \param row_flags
-    The flags of the rows eventually added to the matrix.
+  /*! \brief
+    Returns a system of equality constraints satisfied by \p *this
+    with the same affine dimension as \p *this.
+  */
+  Constraint_System constraints() const;
 
-    The matrix is expanded to the specified dimensions avoiding
-    reallocation whenever possible.
-    The contents of the original matrix is lost.
+  /*! \brief
+    Returns a minimal system of equality constraints satisfied by
+    \p *this with the same affine dimension as \p *this.
   */
-  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns,
-		      Row::Flags row_flags);
+  Constraint_System minimized_constraints() const;
 
-  //! Swaps the columns having indexes \p i and \p j.
-  void swap_columns(dimension_type i,  dimension_type j);
+  //! Returns the system of congruences.
+  const Congruence_System& congruences() const;
 
-  //! Permutes the columns of the matrix.
-  /*
-    \param cycles
-    A vector representing the non-trivial cycles of the permutation
-    according to which the columns must be rearranged.
+  //! Returns the system of congruences in minimal form.
+  const Congruence_System& minimized_congruences() const;
 
-    The \p cycles vector contains, one after the other, the
-    non-trivial cycles (i.e., the cycles of length greater than one)
-    of a permutation of non-zero column indexes.  Each cycle is
-    terminated by zero.  For example, assuming the matrix has 6
-    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
-    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
-    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
-    turn can be represented by a vector of 6 elements containing 1, 3,
-    6, 0, 2, 4, 0.
-  */
-  void permute_columns(const std::vector<dimension_type>& cycles);
+  //! Returns the system of generators.
+  const Grid_Generator_System& grid_generators() const;
 
-  //! \name Accessors
-  //@{
+  //! Returns the minimized system of generators.
+  const Grid_Generator_System& minimized_grid_generators() const;
 
-  //! Returns the number of columns of the matrix (i.e., the size of the rows).
-  dimension_type num_columns() const;
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
 
-  //! Returns the number of rows in the matrix.
-  dimension_type num_rows() const;
-  //@} // Accessors
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Grid_Generator& g) const;
 
-  //! \name Subscript operators
-  //@{
-  //! Returns a reference to the \p k-th row of the matrix.
-  Row& operator[](dimension_type k);
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Generator& g) const;
 
-  //! Returns a constant reference to the \p k-th row of the matrix.
-  const Row& operator[](dimension_type k) const;
-  //@} // Subscript operators
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Constraint& c) const;
 
-  //! Clears the matrix deallocating all its rows.
-  void clear();
+  //! Returns \c true if and only if \p *this is an empty grid.
+  bool is_empty() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  //! Returns \c true if and only if \p *this is a universe grid.
+  bool is_universe() const;
 
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
-  */
-  bool ascii_load(std::istream& s);
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+    Returns <CODE>true</CODE> if and only if \p *this is a
+    topologically closed subset of the vector space.
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+    A grid is always topologically closed.
+  */
+  bool is_topologically_closed() const;
 
   /*! \brief
-    Erases from the matrix all the rows but those having
-    an index less than \p first_to_erase.
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
   */
-  void erase_to_end(dimension_type first_to_erase);
+  bool is_disjoint_from(const Grid& y) const;
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  /*!
+    A grid is discrete if it can be defined by a generator system which
+    contains only points and parameters.  This includes the empty grid
+    and any grid in dimension zero.
+  */
+  bool is_discrete() const;
 
-namespace std {
+  //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+  bool is_bounded() const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! Specializes <CODE>std::swap</CODE>.
-  /*! \relates Parma_Polyhedra_Library::Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Matrix& x,
-	  Parma_Polyhedra_Library::Matrix& y);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
 
-} // namespace std
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
 
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
 
-namespace Parma_Polyhedra_Library {
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
-/*! \relates Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator==(const Matrix& x, const Matrix& y);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
-/*! \relates Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator!=(const Matrix& x, const Matrix& y);
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
 
-// Automatically generated from PPL source file ../src/Matrix.inlines.hh line 1
-/* Matrix class implementation: inline functions.
-*/
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
 
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-// Automatically generated from PPL source file ../src/Matrix.inlines.hh line 27
-#include <algorithm>
-#include <cassert>
+    \param sup_n
+    The numerator of the supremum value;
 
-namespace Parma_Polyhedra_Library {
+    \param sup_d
+    The denominator of the supremum value;
 
-inline dimension_type
-Matrix::max_num_rows() {
-  return std::vector<Row>().max_size();
-}
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false.
 
-inline dimension_type
-Matrix::max_num_columns() {
-  return Row::max_size();
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-inline memory_size_type
-Matrix::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
 
-inline
-Matrix::const_iterator::const_iterator()
-  : i(Iter()) {
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
 
-inline
-Matrix::const_iterator::const_iterator(const Iter& b)
-  : i(b) {
-}
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-inline
-Matrix::const_iterator::const_iterator(const const_iterator& y)
-  : i(y.i) {
-}
+    \param sup_n
+    The numerator of the supremum value;
 
-inline Matrix::const_iterator&
-Matrix::const_iterator::operator=(const const_iterator& y) {
-  i = y.i;
-  return *this;
-}
+    \param sup_d
+    The denominator of the supremum value;
 
-inline Matrix::const_iterator::reference
-Matrix::const_iterator::operator*() const {
-  return *i;
-}
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false;
 
-inline Matrix::const_iterator::pointer
-Matrix::const_iterator::operator->() const {
-  return &*i;
-}
+    \param point
+    When maximization succeeds, will be assigned a point where \p expr
+    reaches its supremum value.
 
-inline Matrix::const_iterator&
-Matrix::const_iterator::operator++() {
-  ++i;
-  return *this;
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-inline Matrix::const_iterator
-Matrix::const_iterator::operator++(int) {
-  return const_iterator(i++);
-}
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& point) const;
 
-inline bool
-Matrix::const_iterator::operator==(const const_iterator& y) const {
-  return i == y.i;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value is computed.
 
-inline bool
-Matrix::const_iterator::operator!=(const const_iterator& y) const {
-  return !operator==(y);
-}
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-inline Matrix::const_iterator
-Matrix::begin() const {
-  return const_iterator(rows.begin());
-}
+    \param inf_n
+    The numerator of the infimum value;
 
-inline Matrix::const_iterator
-Matrix::end() const {
-  return const_iterator(rows.end());
-}
+    \param inf_d
+    The denominator of the infimum value;
 
-inline void
-Matrix::swap(Matrix& y) {
-  std::swap(rows, y.rows);
-  std::swap(row_size, y.row_size);
-  std::swap(row_capacity, y.row_capacity);
-}
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false.
 
-inline
-Matrix::Matrix()
-  : rows(),
-    row_size(0),
-    row_capacity(0) {
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-inline
-Matrix::Matrix(const Matrix& y)
-  : rows(y.rows),
-    row_size(y.row_size),
-    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
-}
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
 
-inline
-Matrix::~Matrix() {
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
 
-inline Matrix&
-Matrix::operator=(const Matrix& y) {
-  // Without the following guard against auto-assignments we would
-  // recompute the row capacity based on row size, possibly without
-  // actually increasing the capacity of the rows.  This would lead to
-  // an inconsistent state.
-  if (this != &y) {
-    // The following assignment may do nothing on auto-assignments...
-    rows = y.rows;
-    row_size = y.row_size;
-    // ... hence the following assignment must not be done on
-    // auto-assignments.
-    row_capacity = compute_capacity(y.row_size, max_num_columns());
-  }
-  return *this;
-}
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-inline void
-Matrix::add_row(const Row& y) {
-  Row new_row(y, row_capacity);
-  add_recycled_row(new_row);
-}
+    \param inf_n
+    The numerator of the infimum value;
 
-inline Row&
-Matrix::operator[](const dimension_type k) {
-  assert(k < rows.size());
-  return rows[k];
-}
+    \param inf_d
+    The denominator of the infimum value;
 
-inline const Row&
-Matrix::operator[](const dimension_type k) const {
-  assert(k < rows.size());
-  return rows[k];
-}
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false;
 
-inline dimension_type
-Matrix::num_rows() const {
-  return rows.size();
-}
+    \param point
+    When minimization succeeds, will be assigned a point where \p expr
+    reaches its infimum value.
 
-inline dimension_type
-Matrix::num_columns() const {
-  return row_size;
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-/*! \relates Matrix */
-inline bool
-operator!=(const Matrix& x, const Matrix& y) {
-  return !(x == y);
-}
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& point) const;
 
-inline void
-Matrix::erase_to_end(const dimension_type first_to_erase) {
-  assert(first_to_erase <= rows.size());
-  if (first_to_erase < rows.size())
-    rows.erase(rows.begin() + first_to_erase, rows.end());
-}
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Grid& y) const;
 
-inline void
-Matrix::clear() {
-  // Clear `rows' and minimize its capacity.
-  std::vector<Row>().swap(rows);
-  row_size = 0;
-  row_capacity = 0;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly
+    contains \p y.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Grid& y) const;
 
-namespace std {
+  //! Writes the covering box for \p *this into \p box.
+  /*!
+    The covering box is a set of upper and lower values for each
+    dimension.  When the covering box written into \p box is tiled
+    onto empty space the corners of the tiles form the sparsest
+    rectilinear grid that includes \p *this.
 
-/*! \relates Parma_Polyhedra_Library::Matrix */
-inline void
-swap(Parma_Polyhedra_Library::Matrix& x,
-     Parma_Polyhedra_Library::Matrix& y) {
-  x.swap(y);
-}
+    The value of the lower bound of each interval of the resulting \p
+    box are as close as possible to the origin, with positive values
+    taking preference when the lowest positive value equals the lowest
+    negative value.
 
-} // namespace std
+    If all the points have a single value in a particular dimension of
+    the grid then there is only a lower bound on the interval produced
+    in \p box, and the lower bound denotes the single value for the
+    dimension.  If the coordinates of the points in a particular
+    dimension include every value then the upper and lower bounds of
+    the associated interval in \p box are set equal.  The empty grid
+    produces the empty \p box.  The zero dimension universe grid
+    produces the zero dimension universe box.
 
-// Automatically generated from PPL source file ../src/Matrix.defs.hh line 355
+    \param box
+    The Box into which the covering box is written.
 
-// Automatically generated from PPL source file ../src/Topology.hh line 1
+    \exception std::invalid_argument
+    Thrown if \p *this and \p box are dimension-incompatible.
+  */
+  template <typename Interval>
+  void get_covering_box(Box<Interval>& box) const;
 
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
 
-namespace Parma_Polyhedra_Library {
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Kinds of polyhedra domains.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-enum Topology {
-  NECESSARILY_CLOSED = 0,
-  NOT_NECESSARILY_CLOSED = 1
-};
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
 
-} // namespace Parma_Polyhedra_Library
+  //@} // Member Functions that Do Not Modify the Grid
 
-// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 1
-/* Linear_Row class declaration.
-*/
+  //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+  //@{
 
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
 
-// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 33
+  //! Adds constraint \p c to \p *this.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The base class for linear expressions, constraints and generators.
-/*! \ingroup PPL_CXX_interface
-  The class Linear_Row allows us to build objects of the form
-  \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$,
-  i.e., a finite sequence of coefficients subscripted by a pair of flags,
-  which are both stored in a Linear_Row::Flags object.
-  The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents
-  the <EM>topology</EM> and
-  the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents
-  the <EM>kind</EM> of the Linear_Row object.
-  Note that, even though all the four possible combinations of topology
-  and kind values will result in a legal Linear_Row::Flags object, some
-  of these pose additional constraints on the values of the Linear_Row's
-  coefficients.
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void add_congruence(const Constraint& c);
 
-  When \f$t = c\f$, we have the following cases
-  (\f$d\f$ is the dimension of the vector space):
-    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
-      represents the equality constraint
-      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
-    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
-      represents the non-strict inequality constraint
-      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
-    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
-      represents the line of direction
-      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
-    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
-      represents the ray of direction
-      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
-    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$,
-      represents the point
-      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this, reducing the result
 
-  When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is
-  associated to the slack variable \f$\epsilon\f$, so that we have the
-  following cases (\f$d\f$ is again the dimension of the vector space,
-  but this time we have \f$d+2\f$ coefficients):
-    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
-      represents the equality constraint
-      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
-    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
-      represents the non-strict inequality constraint
-      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
-    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
-      with \f$e < 0\f$, represents the strict inequality constraint
-      \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$.
-    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
-      represents the line of direction
-      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
-    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
-      represents the ray of direction
-      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
-    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
-      with \f$b > 0\f$ and \f$e > 0\f$, represents the point
-      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
-    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$,
-      with \f$b > 0\f$, represents the closure point
-      \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  So, a Linear_Row can be both a constraint and a generator: it can be an
-  equality, a strict or non-strict inequality, a line, a ray, a point
-  or a closure point.
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
 
-  The inhomogeneous term of a constraint can be zero or different from zero.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Congruence& c);
 
-  Points and closure points must have a positive inhomogeneous term
-  (which is used as a common divisor for all the other coefficients),
-  lines and rays must have the inhomogeneous term equal to zero.
-  If needed, the coefficients of points and closure points are negated
-  at creation time so that they satisfy this invariant.
-  The invariant is maintained because, when combining a point or closure
-  point with another generator, we only consider positive combinations.
+  //! Adds a copy of constraint \p c to \p *this, reducing the result.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
 
-  The \f$\epsilon\f$ coefficient, when present, is negative for strict
-  inequality constraints, positive for points and equal to zero in all
-  the other cases.
-  Note that the above description corresponds to the end-user, high-level
-  view of a Linear_Row object. In the implementation, to allow for code reuse,
-  it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on
-  the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object
-  on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack
-  variable \f$\epsilon\f$ as an ordinary dimension of the vector space.
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  A Linear_Row object implementing a Linear_Expression is always of the form
-  \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
-  linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
 
-class Parma_Polyhedra_Library::Linear_Row : public Row {
-public:
-  //! The possible kinds of Linear_Row objects.
-  enum Kind {
-    LINE_OR_EQUALITY = 0,
-    RAY_OR_POINT_OR_INEQUALITY = 1
-  };
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Constraint& c);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    The type of the object to which the coefficients refer to,
-    encoding both topology and kind.
+    Adds a copy of grid generator \p g to the system of generators of
+    \p *this.
 
-    \ingroup PPL_CXX_interface
-    This combines the information about the topology (necessarily closed
-    or not) and the kind (line/equality or ray/point/inequality)
-    of a Linear_Row object.
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  class Flags : public Row::Flags {
-  public:
-    //! Default constructor: builds an object where all flags are invalid.
-    Flags();
+  void add_grid_generator(const Grid_Generator& g);
 
-    //! Builds an object corresponding to the topology \p t.
-    explicit Flags(Topology t);
+  /*! \brief
+    Adds a copy of grid generator \p g to the system of generators of
+    \p *this, reducing the result.
 
-    //! Builds an object corresponding to the topology \p t and kind \p k.
-    Flags(Topology t, Kind k);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-    //! \name Testing and setting the type
-    //@{
-    Topology topology() const;
-    bool is_necessarily_closed() const;
-    bool is_not_necessarily_closed() const;
-    bool is_line_or_equality() const;
-    bool is_ray_or_point_or_inequality() const;
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
 
-    void set_necessarily_closed();
-    void set_not_necessarily_closed();
-    void set_is_line_or_equality();
-    void set_is_ray_or_point_or_inequality();
-    //@} // Testing and setting the type
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_grid_generator_and_minimize(const Grid_Generator& g);
 
-    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
-    bool operator==(const Flags& y) const;
+  //! Adds a copy of each congruence in \p cgs to \p *this.
+  /*!
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if \p *this and \p y
-      are different.
-    */
-    bool operator!=(const Flags& y) const;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
 
-    PPL_OUTPUT_DECLARATIONS;
+  //! Adds a copy of each equality constraint in \p cs to \p *this.
+  /*!
+    \param cs
+    The congruences that will be considered for addition to the system
+    of congruences of \p *this.
 
-    //! Uses the ASCII Flags representation from \p s to recreate *this.
-    /*!
-      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-      otherwise.  The ASCII representation is as output by \ref ascii_dump.
-    */
-    bool ascii_load(std::istream& s);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Constraint_System& cs);
 
-  private:
-    //! Builds the type from a bit-mask.
-    explicit Flags(base_type mask);
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
 
-    //! \name The bits that are currently in use
-    //@{
-    // NB: ascii_load assumes that these are sequential.
-    static const unsigned rpi_validity_bit
-    = Row::Flags::first_free_bit + 0;
-    static const unsigned rpi_bit
-    = Row::Flags::first_free_bit + 1;
-    static const unsigned nnc_validity_bit
-    = Row::Flags::first_free_bit + 2;
-    static const unsigned nnc_bit
-    = Row::Flags::first_free_bit + 3;
-    //@}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  protected:
-    //! Index of the first bit derived classes can use.
-    static const unsigned first_free_bit
-    = Row::Flags::first_free_bit + 4;
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
 
-    friend class Parma_Polyhedra_Library::Linear_Row;
-  };
+  //! Adds the equality constraints in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
-  //! Pre-constructs a row: construction must be completed by construct().
-  Linear_Row();
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  //! \name Post-constructors
-  //@{
-  //! Constructs properly a default-constructed element.
-  /*!
-    Builds a row with type \p t, size \p sz and minimum capacity.
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
   */
-  void construct(dimension_type sz, Flags f);
+  void add_recycled_congruences(Constraint_System& cs);
 
-  //! Constructs properly a default-constructed element.
-  /*!
-    \param sz
-    The size of the row that will be constructed;
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to the system of
+    congruences of \p *this, reducing the result.
 
-    \param capacity
-    The minimum capacity of the row that will be constructed.
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-    \param f
-    Flags for the row that will be constructed.
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
 
-    The row that we are constructing has a minimum capacity, i.e., it
-    can contain at least \p capacity elements, \p sz of which will be
-    default-constructed now. The row flags are set to \p f.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  void construct(dimension_type sz, dimension_type capacity, Flags f);
-  //@} // Post-constructors
+  bool add_congruences_and_minimize(const Congruence_System& cgs);
 
-  //! Tight constructor: resizing will require reallocation.
-  Linear_Row(dimension_type sz, Flags f);
+  /*! \brief
+    Adds a copy of each equality constraint in \p cs to \p *this,
+    reducing the result.
 
-  //! Sizing constructor with capacity.
-  Linear_Row(dimension_type sz, dimension_type capacity, Flags f);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  //! Ordinary copy constructor.
-  Linear_Row(const Linear_Row& y);
+    \param cs
+    Contains the constraints that will be added to the system of
+    congruences of \p *this.
 
-  //! Copy constructor with specified capacity.
-  /*!
-    It is assumed that \p capacity is greater than or equal to \p y size.
-  */
-  Linear_Row(const Linear_Row& y, dimension_type capacity);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  //! Copy constructor with specified size and capacity.
-  /*!
-    It is assumed that \p sz is greater than or equal to the size of \p y
-    and, of course, that \p sz is less than or equal to \p capacity.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity);
+  bool add_congruences_and_minimize(const Constraint_System& cs);
 
-  //! Destructor.
-  ~Linear_Row();
+  /*! \brief
+    Adds the congruences in \p cgs to the system of congruences of \p
+    *this, reducing the result.
 
-  //! \name Flags inspection methods
-  //@{
-  //! Returns a const reference to the flags of \p *this.
-  const Flags& flags() const;
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  //! Returns a non-const reference to the flags of \p *this.
-  Flags& flags();
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
 
-  //! Returns the topological kind of \p *this.
-  Topology topology() const;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the topology
-    of \p *this row is not necessarily closed.
-  */
-  bool is_not_necessarily_closed() const;
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the topology
-    of \p *this row is necessarily closed.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  bool is_necessarily_closed() const;
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this row
-    represents a line or an equality.
-  */
-  bool is_line_or_equality() const;
+  //! Adds the equalities in \p cs to \p *this, reducing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this row
-    represents a ray, a point or an inequality.
-  */
-  bool is_ray_or_point_or_inequality() const;
-  //@} // Flags inspection methods
+    \param cs
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
-  //! \name Flags coercion methods
-  //@{
-  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
-  void set_necessarily_closed();
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
-  void set_not_necessarily_closed();
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
 
-  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
-  void set_is_line_or_equality();
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_congruences_and_minimize(Constraint_System& cs);
 
-  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
-  void set_is_ray_or_point_or_inequality();
-  //@} // Flags coercion methods
+  //! Adds constraint \p c to \p *this.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
 
-  //! Returns the maximum space dimension a Linear_Row can handle.
-  static dimension_type max_space_dimension();
+    \param c
+    The constraint.
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
 
-  //! Returns the inhomogeneous term.
-  Coefficient_traits::const_reference inhomogeneous_term() const;
+  //! Adds constraint \p c to \p *this, reducing the result.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
 
-  //! Returns the coefficient \f$a_n\f$.
-  Coefficient_traits::const_reference coefficient(dimension_type n) const;
+    \param c
+    The constraint.
 
-  /*! \brief
-    Normalizes the sign of the coefficients so that the first non-zero
-    (homogeneous) coefficient of a line-or-equality is positive.
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  void sign_normalize();
+  bool add_constraint_and_minimize(const Constraint& c);
 
-  /*! \brief
-    Strong normalization: ensures that different Linear_Row objects
-    represent different hyperplanes or hyperspaces.
+  //! Adds copies of the equality constraints in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraints to be added.
 
-    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
   */
-  void strong_normalize();
+  void add_constraints(const Constraint_System& cs);
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if the coefficients are
-    strongly normalized.
-  */
-  bool check_strong_normalized() const;
+    Adds copies of the equality constraints in \p cs to \p *this,
+    reducing the result.
 
-  //! Linearly combines \p *this with \p y so that <CODE>*this[k]</CODE> is 0.
-  /*!
-    \param y
-    The Linear_Row that will be combined with \p *this object;
+    \param cs
+    The constraints to be added.
 
-    \param k
-    The position of \p *this that have to be \f$0\f$.
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-    Computes a linear combination of \p *this and \p y having
-    the element of index \p k equal to \f$0\f$. Then it assigns
-    the resulting Linear_Row to \p *this and normalizes it.
-  */
-  void linear_combine(const Linear_Row& y, dimension_type k);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if all the homogeneous
-    terms of \p *this are \f$0\f$.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  bool all_homogeneous_terms_are_zero() const;
-
-  PPL_OUTPUT_DECLARATIONS;
+  bool add_constraints_and_minimize(const Constraint_System& cs);
 
-  //! Uses the ASCII Linear_Row representation from \p s to recreate *this.
+  //! Adds the equality constraints in \p cs to \p *this.
   /*!
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
-    otherwise.  The ASCII representation is as output by \ref ascii_dump.
-  */
-  bool ascii_load(std::istream& s);
+    \param cs
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
-  //! Checks if all the invariants are satisfied.
-  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-private:
-  friend class Parma_Polyhedra_Library::Linear_Expression;
-  friend class Parma_Polyhedra_Library::Constraint;
-  friend class Parma_Polyhedra_Library::Generator;
-};
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Adds the equality constraints in \p cs to \p *this, reducing the
+    result.
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
-/*! \relates Linear_Row */
-bool operator==(const Linear_Row& x, const Linear_Row& y);
+    \param cs
+    The constraint system to be added to \p *this.  The equalities in
+    \p cs may be recycled.
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
-/*! \relates Linear_Row */
-bool operator!=(const Linear_Row& x, const Linear_Row& y);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The basic comparison function.
-/*! \relates Linear_Row
-  \return
-  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  \param x
-  A row of coefficients;
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
 
-  \param y
-  Another row.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
 
-  Compares \p x and \p y, where \p x and \p y may be of different size,
-  in which case the "missing" coefficients are assumed to be zero.
-  The comparison is such that:
-  -# equalities are smaller than inequalities;
-  -# lines are smaller than points and rays;
-  -# the ordering is lexicographic;
-  -# the positions compared are, in decreasing order of significance,
-     1, 2, ..., \p size(), 0;
-  -# the result is negative, zero, or positive if x is smaller than,
-     equal to, or greater than y, respectively;
-  -# when \p x and \p y are different, the absolute value of the
-     result is 1 if the difference is due to the coefficient in
-     position 0; it is 2 otherwise.
+  //! Uses a copy of the congruence \p cg to refine \p *this.
+  /*!
+    \param cg
+    The congruence used.
 
-  When \p x and \p y represent the hyper-planes associated
-  to two equality or inequality constraints, the coefficient
-  at 0 is the known term.
-  In this case, the return value can be characterized as follows:
-  - -2, if \p x is smaller than \p y and they are \e not parallel;
-  - -1, if \p x is smaller than \p y and they \e are parallel;
-  -  0, if \p x and y are equal;
-  - +1, if \p y is smaller than \p x and they \e are parallel;
-  - +2, if \p y is smaller than \p x and they are \e not parallel.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-int compare(const Linear_Row& x, const Linear_Row& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
 
-} // namespace Parma_Polyhedra_Library
+ //! Uses a copy of the congruences in \p cgs to refine \p *this.
+  /*!
+    \param cgs
+    The congruences used.
 
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
 
-namespace std {
+  //! Uses a copy of the constraint \p c to refine \p *this.
+  /*!
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Linear_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Linear_Row& x,
-	  Parma_Polyhedra_Library::Linear_Row& y);
+    \param c
+    The constraint used. If it is not an equality, it will be ignored
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Linear_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
-	       std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
 
-} // namespace std
+  //! Uses a copy of the constraints in \p cs to refine \p *this.
+  /*!
+    \param cs
+    The constraints used. Constraints that are not equalities are ignored.
 
-// Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 1
-/* Linear_Row class implementation: inline functions.
-*/
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
 
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this.
 
-// Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 27
-#include <cassert>
-#include <algorithm>
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  void add_grid_generators(const Grid_Generator_System& gs);
 
-inline
-Linear_Row::Flags::Flags()
-  : Row::Flags() {
-  // Note that the constructed type has its validity bit unset.
-}
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this.
 
-inline
-Linear_Row::Flags::Flags(const Topology t)
-  : Row::Flags(t << nnc_bit) {
-#ifndef NDEBUG
-  set_bits(1 << nnc_validity_bit);
-#endif
-}
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
-inline
-Linear_Row::Flags::Flags(const Topology t, const Kind k)
-  : Row::Flags((k << rpi_bit) | (t << nnc_bit)) {
-#ifndef NDEBUG
-  set_bits((1 << rpi_validity_bit)
-	   | (1 << nnc_validity_bit));
-#endif
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible.
 
-inline bool
-Linear_Row::Flags::is_ray_or_point_or_inequality() const {
-  assert(test_bits(1 << rpi_validity_bit));
-  return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
-}
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_grid_generators(Grid_Generator_System& gs);
 
-inline void
-Linear_Row::Flags::set_is_ray_or_point_or_inequality() {
-#ifndef NDEBUG
-  set_bits(1 << rpi_validity_bit);
-#endif
-  set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
-}
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this, reducing the result.
 
-inline bool
-Linear_Row::Flags::is_line_or_equality() const {
-  assert(test_bits(1 << rpi_validity_bit));
-  return !is_ray_or_point_or_inequality();
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-inline void
-Linear_Row::Flags::set_is_line_or_equality() {
-#ifndef NDEBUG
-  set_bits(1 << rpi_validity_bit);
-#endif
-  reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
-}
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
 
-inline bool
-Linear_Row::Flags::is_not_necessarily_closed() const {
-  assert(test_bits(1 << nnc_validity_bit));
-  return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
+    *this is empty and the system of generators \p gs is not empty,
+    but has no points.
 
-inline bool
-Linear_Row::Flags::is_necessarily_closed() const {
-  assert(test_bits(1 << nnc_validity_bit));
-  return !is_not_necessarily_closed();
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_grid_generators_and_minimize(const Grid_Generator_System& gs);
 
-inline void
-Linear_Row::Flags::set_not_necessarily_closed() {
-#ifndef NDEBUG
-  set_bits(1 << nnc_validity_bit);
-#endif
-  set_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
-}
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this, reducing the result.
 
-inline void
-Linear_Row::Flags::set_necessarily_closed() {
-#ifndef NDEBUG
-  set_bits(1 << nnc_validity_bit);
-#endif
-  reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-inline Topology
-Linear_Row::Flags::topology() const {
-  return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED;
-}
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
 
-inline bool
-Linear_Row::Flags::operator==(const Flags& y) const {
-  base_type mask = low_bits_mask<base_type>(first_free_bit);
-  return (get_bits() & mask) == (y.get_bits() & mask);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible.
 
-inline bool
-Linear_Row::Flags::operator!=(const Flags& y) const {
-  return !operator==(y);
-}
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
 
-inline const Linear_Row::Flags&
-Linear_Row::flags() const {
-  return static_cast<const Flags&>(Row::flags());
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_grid_generators_and_minimize(Grid_Generator_System& gs);
 
-inline Linear_Row::Flags&
-Linear_Row::flags() {
-  return static_cast<Flags&>(Row::flags());
-}
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
 
-inline bool
-Linear_Row::is_necessarily_closed() const {
-  return flags().is_necessarily_closed();
-}
+    \param var
+    The space dimension that will be unconstrained.
 
-inline dimension_type
-Linear_Row::max_space_dimension() {
-  // The first coefficient holds the inhomogeneous term or the divisor.
-  // In NNC rows, the last coefficient is for the epsilon dimension.
-  return max_size() - 2;
-}
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
 
-inline dimension_type
-Linear_Row::space_dimension() const {
-  const dimension_type sz = size();
-  return (sz == 0)
-    ? 0
-    : sz - (is_necessarily_closed() ? 1 : 2);
-}
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
 
-inline
-Linear_Row::Linear_Row()
-  : Row() {
-}
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
 
-inline void
-Linear_Row::construct(const dimension_type sz, const dimension_type capacity,
-		      const Flags f) {
-  Row::construct(sz, capacity, f);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
 
-inline
-Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity,
-		       const Flags f) {
-  construct(sz, capacity, f);
-}
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
 
-inline void
-Linear_Row::construct(const dimension_type sz, const Flags f) {
-  construct(sz, sz, f);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Grid& y);
 
-inline
-Linear_Row::Linear_Row(const dimension_type sz, const Flags f) {
-  construct(sz, f);
-}
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y,
+    reducing the result.
 
-inline
-Linear_Row::Linear_Row(const Linear_Row& y)
-  : Row(y) {
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-inline
-Linear_Row::Linear_Row(const Linear_Row& y,
-		       const dimension_type capacity)
-  : Row(y, capacity) {
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-inline
-Linear_Row::Linear_Row(const Linear_Row& y,
-		       const dimension_type sz, const dimension_type capacity)
-  : Row(y, sz, capacity) {
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool intersection_assign_and_minimize(const Grid& y);
 
-inline
-Linear_Row::~Linear_Row() {
-}
+  /*! \brief
+    Assigns to \p *this the join of \p *this and \p y.
 
-inline bool
-Linear_Row::is_line_or_equality() const {
-  return flags().is_line_or_equality();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void join_assign(const Grid& y);
 
-inline bool
-Linear_Row::is_ray_or_point_or_inequality() const {
-  return flags().is_ray_or_point_or_inequality();
-}
+  /*! \brief
+    Assigns to \p *this the join of \p *this and \p y, reducing the
+    result.
 
-inline Topology
-Linear_Row::topology() const {
-  return flags().topology();
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-inline void
-Linear_Row::set_is_line_or_equality() {
-  flags().set_is_line_or_equality();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-inline void
-Linear_Row::set_is_ray_or_point_or_inequality() {
-  flags().set_is_ray_or_point_or_inequality();
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool join_assign_and_minimize(const Grid& y);
 
-inline void
-Linear_Row::set_necessarily_closed() {
-  flags().set_necessarily_closed();
-}
+  //! Same as join_assign(y).
+  void upper_bound_assign(const Grid& y);
 
-inline void
-Linear_Row::set_not_necessarily_closed() {
-  flags().set_not_necessarily_closed();
-}
+  //! Same as join_assign_and_minimize(y).
+  /*!
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  void upper_bound_assign_and_minimize(const Grid& y);
 
-inline Coefficient_traits::const_reference
-Linear_Row::inhomogeneous_term() const {
-  return (*this)[0];
-}
+  /*! \brief
+    If the join of \p *this and \p y is exact it is assigned to \p
+    *this and <CODE>true</CODE> is returned, otherwise
+    <CODE>false</CODE> is returned.
 
-inline Coefficient_traits::const_reference
-Linear_Row::coefficient(const dimension_type k) const {
-  return (*this)[k+1];
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool join_assign_if_exact(const Grid& y);
 
-inline void
-Linear_Row::strong_normalize() {
-  normalize();
-  sign_normalize();
-}
+  //! Same as join_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const Grid& y);
 
-/*! \relates Linear_Row */
-inline bool
-operator==(const Linear_Row& x, const Linear_Row& y) {
-  return x.flags() == y.flags()
-    && static_cast<const Row&>(x) == static_cast<const Row&>(y);
-}
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Difference "grid-difference" of
+    \p *this and \p y.
 
-/*! \relates Linear_Row */
-inline bool
-operator!=(const Linear_Row& x, const Linear_Row& y) {
-  return !(x == y);
-}
+    The grid difference between grids x and y is the smallest grid
+    containing all the points from x and y that are only in x.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void grid_difference_assign(const Grid& y);
 
+  //! Same as grid_difference_assign(y).
+  void difference_assign(const Grid& y);
 
-namespace std {
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
 
-/*! \relates Parma_Polyhedra_Library::Linear_Row */
-inline void
-swap(Parma_Polyhedra_Library::Linear_Row& x,
-     Parma_Polyhedra_Library::Linear_Row& y) {
-  x.swap(y);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Grid& y);
 
-/*! \relates Parma_Polyhedra_Library::Linear_Row */
-inline void
-iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
-	  std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y) {
-  swap(*x, *y);
-}
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
 
-} // namespace std
+    \param var
+    The variable to which the affine expression is assigned;
 
-// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 457
+    \param expr
+    The numerator of the affine expression;
 
-// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 33
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The base class for systems of constraints and generators.
-/*! \ingroup PPL_CXX_interface
-  An object of this class represents either a constraint system
-  or a generator system. Each Linear_System object can be viewed
-  as a finite sequence of strong-normalized Linear_Row objects,
-  where each Linear_Row implements a constraint or a generator.
-  Linear systems are characterized by the matrix of coefficients,
-  also encoding the number, size and capacity of Linear_row objects,
-  as well as a few additional information, including:
-   - the topological kind of (all) the rows;
-   - an indication of whether or not some of the rows in the Linear_System
-     are <EM>pending</EM>, meaning that they still have to undergo
-     an (unspecified) elaboration; if there are pending rows, then these
-     form a proper suffix of the overall sequence of rows;
-   - a Boolean flag that, when <CODE>true</CODE>, ensures that the
-     non-pending prefix of the sequence of rows is sorted.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
 
-class Parma_Polyhedra_Library::Linear_System : public Matrix {
-public:
-  //! Builds an empty linear system with specified topology.
-  /*!
-    Rows size and capacity are initialized to \f$0\f$.
-  */
-  Linear_System(Topology topol);
+    \if Include_Implementation_Details
 
-  //! Builds a system with specified topology and dimensions.
-  /*!
-    \param topol
-    The topology of the system that will be created;
+    When considering the generators of a grid, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
 
-    \param n_rows
-    The number of rows of the system that will be created;
+    If congruences are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of congruences)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
 
-    \param n_columns
-    The number of columns of the system that will be created.
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
 
-    Creates a \p n_rows \f$\times\f$ \p n_columns system whose
-    coefficients are all zero and whose rows are all initialized
-    to be of the given topology.
-  */
-  Linear_System(Topology topol,
-		dimension_type n_rows, dimension_type n_columns);
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! A tag class.
-  /*! \ingroup PPL_CXX_interface
-    Tag class to differentiate the Linear_System copy-constructor that
-    copies pending rows as pending from the one that transforms
-    pending rows into non-pending ones.
+    \endif
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  struct With_Pending {
-  };
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
 
-  //! Copy-constructor: pending rows are transformed into non-pending ones.
-  Linear_System(const Linear_System& y);
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
 
-  //! Full copy-constructor: pending rows are copied as pending.
-  Linear_System(const Linear_System& y, With_Pending);
+    \param var
+    The variable to which the affine expression is substituted;
 
-  //! Assignment operator: pending rows are transformed into non-pending ones.
-  Linear_System& operator=(const Linear_System& y);
+    \param expr
+    The numerator of the affine expression;
 
-  //! Full assignment operator: pending rows are copied as pending.
-  void assign_with_pending(const Linear_System& y);
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-  //! Swaps \p *this with \p y.
-  void swap(Linear_System& y);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
 
-  //! Returns the maximum space dimension a Linear_System can handle.
-  static dimension_type max_space_dimension();
+    \if Include_Implementation_Details
 
-  //! Returns the space dimension of the rows in the system.
-  /*!
-    The computation of the space dimension correctly ignores
-    the column encoding the inhomogeneous terms of constraint
-    (resp., the divisors of generators);
-    if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
-    also the column of the \f$\epsilon\f$-dimension coefficients
-    will be ignored.
-  */
-  dimension_type space_dimension() const;
+    When considering congruences of a grid, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
 
-  //! Makes the system shrink by removing its \p n trailing columns.
-  void remove_trailing_columns(dimension_type n);
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
 
-  //! Permutes the columns of the system.
-  /*
-    \param cycles
-    A vector representing the non-trivial cycles of the permutation
-    according to which the columns must be rearranged.
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
 
-    The \p cycles vector contains, one after the other, the
-    non-trivial cycles (i.e., the cycles of length greater than one)
-    of a permutation of non-zero column indexes.  Each cycle is
-    terminated by zero.  For example, assuming the system has 6
-    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
-    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
-    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
-    turn can be represented by a vector of 6 elements containing 1, 3,
-    6, 0, 2, 4, 0.
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only congruences remain
+    up-to-date.
+
+    \endif
   */
-  void permute_columns(const std::vector<dimension_type>& cycles);
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
 
-  //! \name Subscript operators
-  //@{
-  //! Returns a reference to the \p k-th row of the system.
-  Linear_Row& operator[](dimension_type k);
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
 
-  //! Returns a constant reference to the \p k-th row of the system.
-  const Linear_Row& operator[](dimension_type k) const;
-  //@} // Subscript operators
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-  //! Strongly normalizes the system.
-  void strong_normalize();
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
 
-  //! Sign-normalizes the system.
-  void sign_normalize();
+    \param expr
+    The numerator of the right hand side affine expression;
 
-  //! \name Accessors
-  //@{
-  //! Returns the system topology.
-  Topology topology() const;
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
 
-  //! Returns the value of the sortedness flag.
-  bool is_sorted() const;
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
   */
-  bool is_necessarily_closed() const;
+  void
+  generalized_affine_image(Variable var,
+			   Relation_Symbol relsym,
+			   const Linear_Expression& expr,
+			   Coefficient_traits::const_reference denominator
+			   = Coefficient_one(),
+			   Coefficient_traits::const_reference modulus
+			   = Coefficient_zero());
 
   /*! \brief
-    Returns the number of rows in the system
-    that represent either lines or equalities.
-  */
-  dimension_type num_lines_or_equalities() const;
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
 
-  //! Returns the index of the first pending row.
-  dimension_type first_pending_row() const;
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-  //! Returns the number of rows that are in the pending part of the system.
-  dimension_type num_pending_rows() const;
-  //@} // Accessors
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is sorted,
-    without checking for duplicates.
-  */
-  bool check_sorted() const;
+    \param expr
+    The numerator of the right hand side affine expression;
 
-  //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
-  void set_necessarily_closed();
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
 
-  //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
-  void set_not_necessarily_closed();
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
 
-  //! Sets the topology of all rows equal to the system topology.
-  void set_rows_topology();
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one(),
+			      Coefficient_traits::const_reference modulus
+			      = Coefficient_zero());
 
-  //! Sets the index to indicate that the system has no pending rows.
-  void unset_pending_rows();
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
 
-  //! Sets the index of the first pending row to \p i.
-  void set_index_first_pending_row(dimension_type i);
+    \param lhs
+    The left hand side affine expression.
 
-  //! Sets the sortedness flag of the system to \p b.
-  void set_sorted(bool b);
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
 
-  //! Resizes the system without worrying about the old contents.
-  /*!
-    \param new_n_rows
-    The number of rows of the resized system;
+    \param rhs
+    The right hand side affine expression.
 
-    \param new_n_columns
-    The number of columns of the resized system.
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
 
-    The system is expanded to the specified dimensions avoiding
-    reallocation whenever possible.
-    The contents of the original system is lost.
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
   */
-  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+  void
+  generalized_affine_image(const Linear_Expression& lhs,
+			   Relation_Symbol relsym,
+			   const Linear_Expression& rhs,
+			   Coefficient_traits::const_reference modulus
+			   = Coefficient_zero());
 
-  //! Adds \p n rows and columns to the system.
-  /*!
-    \param n
-    The number of rows and columns to be added: must be strictly positive.
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
 
-    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
-    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
-    such that
-    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
-    where \f$J\f$ is the specular image
-    of the \f$n \times n\f$ identity matrix.
-  */
-  void add_rows_and_columns(dimension_type n);
+    \param lhs
+    The left hand side affine expression;
 
-  /*! \brief
-    Adds a copy of \p r to the system,
-    automatically resizing the system or the row's copy, if needed.
-  */
-  void insert(const Linear_Row& r);
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
 
-  /*! \brief
-    Adds a copy of the given row to the pending part of the system,
-    automatically resizing the system or the row, if needed.
+    \param rhs
+    The right hand side affine expression;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
   */
-  void insert_pending(const Linear_Row& r);
+  void
+  generalized_affine_preimage(const Linear_Expression& lhs,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& rhs,
+			      Coefficient_traits::const_reference modulus
+			      = Coefficient_zero());
 
-  //! Adds a copy of the given row to the system.
-  void add_row(const Linear_Row& r);
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-  //! Adds a new empty row to the system, setting only its flags.
-  void add_pending_row(Linear_Row::Flags flags);
+    \param var
+    The variable updated by the affine relation;
 
-  //! Adds a copy of the given row to the pending part of the system.
-  void add_pending_row(const Linear_Row& r);
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-  //! Adds to \p *this a copy of the rows of `y'.
-  /*!
-    It is assumed that \p *this has no pending rows.
-  */
-  void add_rows(const Linear_System& y);
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-  //! Adds a copy of the rows of `y' to the pending part of `*this'.
-  void add_pending_rows(const Linear_System& y);
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-  /*! \brief
-    Sorts the non-pending rows (in growing order) and eliminates
-    duplicated ones.
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
   */
-  void sort_rows();
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
 
-  /*! \brief
-    Sorts the rows (in growing order) form \p first_row to
-    \p last_row and eliminates duplicated ones.
-  */
-  void sort_rows(dimension_type first_row, dimension_type last_row);
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-  /*! \brief
-    Assigns to \p *this the result of merging its rows with
-    those of \p y, obtaining a sorted system.
+    \param var
+    The variable updated by the affine relation;
 
-    Duplicated rows will occur only once in the result.
-    On entry, both systems are assumed to be sorted and have
-    no pending rows.
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
   */
-  void merge_rows_assign(const Linear_System& y);
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
 
   /*! \brief
-    Sorts the pending rows and eliminates those that also occur
-    in the non-pending part of the system.
+    Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+    "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-  void sort_pending_and_remove_duplicates();
+  void time_elapse_assign(const Grid& y);
 
-  class With_Saturation_Matrix_iterator;
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
 
   /*! \brief
-    Sorts the system, removing duplicates, keeping the saturation
-    matrix consistent.
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using congruence systems.
 
-    \param sat
-    Saturation matrix with rows corresponding to the rows of \p *this.
-  */
-  void sort_and_remove_with_sat(Saturation_Matrix& sat);
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
 
-  //! Minimizes the subsystem of equations contained in \p *this.
-  /*!
-    This method works only on the equalities of the system:
-    the system is required to be partially sorted, so that
-    all the equalities are grouped at its top; it is assumed that
-    the number of equalities is exactly \p n_lines_or_equalities.
-    The method finds a minimal system for the equalities and
-    returns its rank, i.e., the number of linearly independent equalities.
-    The result is an upper triangular subsystem of equalities:
-    for each equality, the pivot is chosen starting from
-    the right-most columns.
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-  dimension_type gauss(dimension_type n_lines_or_equalities);
+  void congruence_widening_assign(const Grid& y, unsigned* tp = NULL);
 
   /*! \brief
-    Back-substitutes the coefficients to reduce
-    the complexity of the system.
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using generator systems.
 
-    Takes an upper triangular system having \p n_lines_or_equalities rows.
-    For each row, starting from the one having the minimum number of
-    coefficients different from zero, computes the expression of an element
-    as a function of the remaining ones and then substitutes this expression
-    in all the other rows.
-  */
-  void back_substitute(dimension_type n_lines_or_equalities);
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
 
-  /*! \brief
-    Applies Gaussian's elimination and back-substitution so as to
-    simplify the linear system.
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-  void simplify();
+  void generator_widening_assign(const Grid& y, unsigned* tp = NULL);
 
   /*! \brief
-    Normalizes the system by dividing each row for the GCD of the
-    row's elements.
-  */
-  void normalize();
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y.
 
-  //! Clears the system deallocating all its rows.
-  void clear();
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
 
-  PPL_OUTPUT_DECLARATIONS;
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
 
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
-    if successful, <CODE>false</CODE> otherwise.
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
 
-    Reads into a Linear_System object the information produced by the
-    output of <CODE>ascii_dump()</CODE>.  The specialized methods
-    provided by Constraint_System and Generator_System take care of
-    properly reading the contents of the system.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-  bool ascii_load(std::istream& s);
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  void widening_assign(const Grid& y, unsigned* tp = NULL);
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  /*! \brief
+    Improves the result of the congruence variant of
+    \ref Grid_Widening "Grid widening" computation by also enforcing
+    those congruences in \p cgs that are satisfied by all the points
+    of \p *this.
 
-  //! Checks if all the invariants are satisfied.
-  /*!
-    \param check_strong_normalized
-    <CODE>true</CODE> if and only if the strong normalization of all
-    the rows in the system has to be checked.
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
 
-    By default, the strong normalization check is performed.
-    This check may be turned off to avoid useless repeated checking;
-    e.g., when re-checking a well-formed Linear_System after the permutation
-    or deletion of some of its rows.
-  */
-  bool OK(bool check_strong_normalized = true) const;
+    \param cgs
+    The system of congruences used to improve the widened grid;
 
-private:
-  //! The topological kind of the rows in the system.
-  Topology row_topology;
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
 
-  //! The index of the first pending row.
-  dimension_type index_first_pending;
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_congruence_extrapolation_assign(const Grid& y,
+					       const Congruence_System& cgs,
+					       unsigned* tp = NULL);
 
   /*! \brief
-    <CODE>true</CODE> if rows are sorted in the ascending order as defined by
-    <CODE>bool compare(const Linear_Row&, const Linear_Row&)</CODE>.
-    If <CODE>false</CODE> may not be sorted.
-  */
-  bool sorted;
+    Improves the result of the generator variant of the
+    \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
 
-  //! Ordering predicate (used when implementing the sort algorithm).
-  struct Row_Less_Than {
-    bool operator()(const Row& x, const Row& y) const;
-  };
-};
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
 
-namespace std {
+    \param cgs
+    The system of congruences used to improve the widened grid;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Linear_System */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Linear_System& x,
-	  Parma_Polyhedra_Library::Linear_System& y);
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
 
-} // namespace std
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_generator_extrapolation_assign(const Grid& y,
+					      const Congruence_System& cgs,
+					      unsigned* tp = NULL);
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Improves the result of the \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
-/*! \relates Linear_System */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator==(const Linear_System& x, const Linear_System& y);
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
-/*! \relates Linear_System */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator!=(const Linear_System& x, const Linear_System& y);
+    \param cgs
+    The system of congruences used to improve the widened grid;
 
-} // namespace Parma_Polyhedra_Library
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An iterator keeping a Linear_System consistent with a Saturation_Matrix.
-/*! \ingroup PPL_CXX_interface
-  An iterator on the vector of Row objects encoded in a Linear_System
-  extended to maintain a corresponding iterator on a vector of
-  Saturation_Row objects.  Access to values is always done on the Row
-  objects, but iterator
-  movements and swaps are done on both components.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator {
-public:
-  typedef std::vector<Row>::iterator Iter1;
-  typedef std::vector<Saturation_Row>::iterator Iter2;
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_extrapolation_assign(const Grid& y,
+				    const Congruence_System& cgs,
+				    unsigned* tp = NULL);
 
-private:
-  Iter1 i1;
-  Iter2 i2;
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
 
-public:
-  // Same traits as Iter1.
-  typedef std::iterator_traits<Iter1>::iterator_category iterator_category;
-  typedef std::iterator_traits<Iter1>::value_type value_type;
-  typedef std::iterator_traits<Iter1>::difference_type difference_type;
-  typedef std::iterator_traits<Iter1>::pointer pointer;
-  typedef std::iterator_traits<Iter1>::reference reference;
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-  //! Constructor.
-  With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old grid in the new
+    vector space.
 
-  //! Copy-constructor.
-  With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y);
+    \param m
+    The number of dimensions to add.
 
-  //! Destructor.
-  ~With_Saturation_Matrix_iterator();
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-  //! Assignment operator.
-  With_Saturation_Matrix_iterator&
-  operator=(const With_Saturation_Matrix_iterator& y);
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables which are the new dimensions can have any
+    value.  For instance, when starting from the grid \f$\cL \sseq
+    \Rset^2\f$ and adding a third space dimension, the result will be
+    the grid
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
 
-  //! \name Operators Implementing Iterator Movement
-  //@{
-  With_Saturation_Matrix_iterator& operator++();
-  With_Saturation_Matrix_iterator operator++(int);
+  /*! \brief
+    Adds \p m new space dimensions to the grid and does not embed it
+    in the new vector space.
 
-  With_Saturation_Matrix_iterator& operator--();
-  With_Saturation_Matrix_iterator operator--(int);
+    \param m
+    The number of space dimensions to add.
 
-  With_Saturation_Matrix_iterator& operator+=(difference_type d);
-  With_Saturation_Matrix_iterator operator+(difference_type d) const;
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-  With_Saturation_Matrix_iterator& operator-=(difference_type d);
-  With_Saturation_Matrix_iterator operator-(difference_type d) const;
-  //@}
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables running through the new dimensions are all
+    constrained to be equal to 0.  For instance, when starting from
+    the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+    dimension, the result will be the grid
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
 
-  //! Distance operator.
-  difference_type operator-(const With_Saturation_Matrix_iterator& y) const;
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Concatenate "concatenation" of
+    \p *this and \p y, taken in this order.
 
-  //! \name Comparisons between Iterators
-  //@{
-  bool operator==(const With_Saturation_Matrix_iterator& y) const;
-  bool operator!=(const With_Saturation_Matrix_iterator& y) const;
-  bool operator<(const With_Saturation_Matrix_iterator& y) const;
-  //@}
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Grid& y);
 
-  //! Dereferencing operator.
-  reference operator*() const;
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
 
-  //! Access-through operator.
-  pointer operator->() const;
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
 
-  //! Swaps the pointed Row objects while keeping Saturation_Matrix consistent.
-  void iter_swap(const With_Saturation_Matrix_iterator& y) const;
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
 
-};
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-namespace std {
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Grid_Map_Space_Dimensions "partial function".
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void
-iter_swap(Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator x,
-	  Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator y);
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
 
-} // namespace std
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
 
-// Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 1
-/* Linear_System class implementation: inline functions.
-*/
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
 
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the grid.
 
-// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 1
-/* Saturation_Row class declaration.
-*/
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Grid_Map_Space_Dimensions "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
 
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
 
-// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 28
-#include <iosfwd>
-#include <gmp.h>
-#include <vector>
+    \param m
+    The number of replicas to be created.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
 
-// Put them in the namespace here to declare them friends later.
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator==(const Saturation_Row& x, const Saturation_Row& y);
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Grid_Expand_Space_Dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool operator!=(const Saturation_Row& x, const Saturation_Row& y);
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The basic comparison function.
-/*! \relates Saturation_Row
-  Compares \p x with \p y starting from the least significant bits.
-  The ordering is total and has the following property: if \p x and \p y
-  are two rows seen as sets of naturals, if \p x is a strict subset
-  of \p y, then \p x comes before \p y.
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
 
-  Returns
-  - -1 if \p x comes before \p y in the ordering;
-  -  0 if \p x and \p y are equal;
-  -  1 if \p x comes after \p y in the ordering.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-int compare(const Saturation_Row& x, const Saturation_Row& y);
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Set-theoretic inclusion test.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y);
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Set-theoretic inclusion test: sets \p strict_subset to a boolean
-  indicating whether the inclusion is strict or not.
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  \relates Saturation_Row
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
-		     bool& strict_subset);
+  friend bool operator==(const Grid& x, const Grid& y);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Set-theoretic strict inclusion test.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool strict_subset(const Saturation_Row& x, const Saturation_Row& y);
+  friend class Parma_Polyhedra_Library::Grid_Certificate;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Set-theoretic union.
-/*! \relates Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void set_union(const Saturation_Row& x,
-	       const Saturation_Row& y,
-	       Saturation_Row& z);
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
 
-} // namespace Parma_Polyhedra_Library
+  //! \name Miscellaneous Member Functions
+  //@{
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A row of a saturation matrix.
-/*! \ingroup PPL_CXX_interface
-  An object of this class represents a single row of a saturation matrix.
-  The saturation row corresponds to a constraint and a system of generators
-  (resp., a generator and a system of constraints) and records whether or
-  not the constraint is saturated by each one of the generators (resp.,
-  the generator saturates each one of the constraints).
-
-  The saturation relation is encoded by using a bitset, so that the
-  constraint is saturated by the \f$i\f$-th generator in the system
-  (resp., the generator saturates the \f$i\f$-th constraint in the system)
-  if and only if the \f$i\f$-th bit is not set.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Saturation_Row {
-public:
-  //! Default constructor.
-  Saturation_Row();
+  //! Destructor.
+  ~Grid();
 
-  //! Copy-constructor.
-  Saturation_Row(const Saturation_Row& y);
+  /*! \brief
+    Swaps \p *this with grid \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void swap(Grid& y);
 
-  //! Destructor.
-  ~Saturation_Row();
+  PPL_OUTPUT_DECLARATIONS
 
-  //! Assignment operator.
-  Saturation_Row& operator=(const Saturation_Row& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-  //! Swaps \p *this with \p y.
-  void swap(Saturation_Row& y);
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-  //! Returns the truth value corresponding to the bit in position \p k.
-  bool operator[](unsigned long k) const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-  //! Sets the bit in position \p k.
-  void set(unsigned long k);
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
 
-  //! Clears the bit in position \p k.
-  void clear(unsigned long k);
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
 
-  //! Clears bits from position \p k (included) onward.
-  void clear_from(unsigned long k);
+  //@} // Miscellaneous Member Functions
 
-  //! Clears all the bits of the row.
-  void clear();
+private:
 
-  friend int
-  Parma_Polyhedra_Library::compare(const Saturation_Row& x,
-				   const Saturation_Row& y);
+  //! The system of congruences.
+  Congruence_System con_sys;
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Saturation_Row& x,
-				      const Saturation_Row& y);
+  //! The system of generators.
+  Grid_Generator_System gen_sys;
 
-  friend bool
-  Parma_Polyhedra_Library::operator!=(const Saturation_Row& x,
-				      const Saturation_Row& y);
+#define PPL_IN_Grid_CLASS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Status.idefs.hh line 1
+/* Grid::Status class declaration.
+*/
 
-  friend bool
-  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
-					   const Saturation_Row& y);
 
-  friend bool
-  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
-					   const Saturation_Row& y,
-					   bool& strict_subset);
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status.idefs.hh directly; use Grid.defs.hh instead."
+#endif
 
-  friend bool
-  Parma_Polyhedra_Library::strict_subset(const Saturation_Row& x,
-					 const Saturation_Row& y);
+//! A conjunctive assertion about a grid.
+/*!
+  The assertions supported that are in use are:
+  - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the grid is the empty set;
+  - <EM>congruences up-to-date</EM>: the grid is correctly
+    characterized by the attached system of congruences, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the grid is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending congruences;
+  - <EM>congruences minimized</EM>: the non-pending part of the system
+    of congruences attached to the grid is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the grid is in minimal form.
 
-  friend void
-  Parma_Polyhedra_Library::set_union(const Saturation_Row& x,
-				     const Saturation_Row& y,
-				     Saturation_Row& z);
+  Other supported assertions are:
+  - <EM>congruences pending</EM>
+  - <EM>generators pending</EM>
+  - <EM>congruences' saturation matrix up-to-date</EM>
+  - <EM>generators' saturation matrix up-to-date</EM>.
 
-  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
-  unsigned long first() const;
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>congruences pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>congruences' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
 
-  /*! \brief
-    Returns the index of the first set bit after \p position
-    or ULONG_MAX if no bit after \p position is set.
-  */
-  unsigned long next(unsigned long position) const;
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
 
-  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
-  unsigned long last() const;
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
 
-  /*! \brief
-    Returns the index of the first set bit before \p position
-    or ULONG_MAX if no bits before \p position is set.
-  */
-  unsigned long prev(unsigned long position) const;
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
 
-  //! Returns the number of set bits in the row.
-  unsigned long count_ones() const;
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
 
-  //! Returns <CODE>true</CODE> if no bit is set in the row.
-  bool empty() const;
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
 
-  //! Checks if all the invariants are satisfied
-  bool OK() const;
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
 
-private:
-  //! Bit-vector representing the row.
-  mpz_t vec;
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
 
-  //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
-  static unsigned int first_one(mp_limb_t w);
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
 
-  //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
-  static unsigned int last_one(mp_limb_t w);
-};
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-namespace std {
+  PPL_OUTPUT_DECLARATIONS
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Saturation_Row& x,
-	  Parma_Polyhedra_Library::Saturation_Row& y);
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void
-iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
-	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y);
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
 
-} // namespace std
+  //! \name Bitmasks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bitmasks for the individual assertions
 
-// Automatically generated from PPL source file ../src/Saturation_Row.inlines.hh line 1
-/* Saturation_Row class implementation: inline functions.
-*/
+  //! This holds the current bitset.
+  flags_t flags;
 
+  //! Construct from a bitmask.
+  Status(flags_t mask);
 
-#include <cassert>
-// For the declaration of ffs(3).
-#include <cstring>
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
 
-namespace Parma_Polyhedra_Library {
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
 
-inline
-Saturation_Row::Saturation_Row() {
-  mpz_init(vec);
-}
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
 
-inline
-Saturation_Row::Saturation_Row(const Saturation_Row& y) {
-  mpz_init_set(vec, y.vec);
-}
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
 
-inline
-Saturation_Row::~Saturation_Row() {
-  mpz_clear(vec);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.defs.hh line 2251
+#undef PPL_IN_Grid_CLASS
 
-inline Saturation_Row&
-Saturation_Row::operator=(const Saturation_Row& y) {
-  mpz_set(vec, y.vec);
-  return *this;
-}
+  //! The status flags to keep track of the grid's internal state.
+  Status status;
 
-inline void
-Saturation_Row::set(const unsigned long k) {
-  mpz_setbit(vec, k);
-}
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
 
-inline void
-Saturation_Row::clear(const unsigned long k) {
-  mpz_clrbit(vec, k);
-}
+  enum Dimension_Kind {
+    PARAMETER,
+    LINE,
+    GEN_VIRTUAL,
+    PROPER_CONGRUENCE = PARAMETER,
+    CON_VIRTUAL = LINE,
+    EQUALITY = GEN_VIRTUAL
+  };
 
-inline void
-Saturation_Row::clear_from(const unsigned long k) {
-  mpz_tdiv_r_2exp(vec, vec, k);
-}
+  typedef std::vector<Dimension_Kind> Dimension_Kinds;
 
-inline unsigned long
-Saturation_Row::count_ones() const {
-  assert(vec->_mp_size >= 0);
-  return mpn_popcount(vec->_mp_d, vec->_mp_size);
-}
+  // The type of row associated with each dimension.  If the virtual
+  // rows existed then the reduced systems would be square and upper
+  // or lower triangular, and the rows in each would have the types
+  // given in this vector.  As the congruence system is reduced to an
+  // upside-down lower triangular form the ordering of the congruence
+  // types is last to first.
+  Dimension_Kinds dim_kinds;
 
-inline bool
-Saturation_Row::empty() const {
-  return mpz_sgn(vec) == 0;
-}
+  //! Builds a grid universe or empty grid.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
 
-inline void
-Saturation_Row::swap(Saturation_Row& y) {
-  mpz_swap(vec, y.vec);
-}
+    \param kind
+    specifies whether the universe or the empty grid has to be built.
+  */
+  void construct(dimension_type num_dimensions, Degenerate_Element kind);
 
-inline void
-Saturation_Row::clear() {
-  mpz_set_ui(vec, 0UL);
-}
+  //! Builds a grid from a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
 
-inline memory_size_type
-Saturation_Row::external_memory_in_bytes() const {
-  return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
-}
+    \param cgs
+    The system of congruences defining the grid. Its data-structures
+    may be recycled to build the grid.
+  */
+  void construct(Congruence_System& cgs);
 
-inline memory_size_type
-Saturation_Row::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+  //! Builds a grid from a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
 
-#if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
+    \param ggs
+    The system of grid generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
+  */
+  void construct(Grid_Generator_System& ggs);
 
-inline unsigned int
-Saturation_Row::first_one(mp_limb_t w) {
-  return ffs(w)-1;
-}
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
 
-#endif
+  //! Returns <CODE>true</CODE> if the grid is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
 
-/*! \relates Saturation_Row */
-inline void
-set_union(const Saturation_Row& x, const Saturation_Row& y,
-	  Saturation_Row& z) {
-  mpz_ior(z.vec, x.vec, y.vec);
-}
+  //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+  bool congruences_are_up_to_date() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
 
+  //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+  bool congruences_are_minimized() const;
 
-namespace std {
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  bool generators_are_minimized() const;
 
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-inline void
-swap(Parma_Polyhedra_Library::Saturation_Row& x,
-     Parma_Polyhedra_Library::Saturation_Row& y) {
-  x.swap(y);
-}
+  //@} // Private Verifiers: Verify if Individual Flags are Set
 
-/*! \relates Parma_Polyhedra_Library::Saturation_Row */
-inline void
-iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
-	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
-  swap(*x, *y);
-}
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
 
-} // namespace std
+  /*! \brief
+    Sets \p status to express that the grid is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
 
-// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 238
+  /*! \brief
+    Sets \p status to express that the grid is empty, clearing all
+    corresponding matrices.
+  */
+  void set_empty();
 
-// Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 27
+  //! Sets \p status to express that congruences are up-to-date.
+  void set_congruences_up_to_date();
 
-namespace Parma_Polyhedra_Library {
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
 
-inline memory_size_type
-Linear_System::external_memory_in_bytes() const {
-  return Matrix::external_memory_in_bytes();
-}
+  //! Sets \p status to express that congruences are minimized.
+  void set_congruences_minimized();
 
-inline memory_size_type
-Linear_System::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
 
-inline bool
-Linear_System::is_sorted() const {
-  // The flag `sorted' does not really reflect the sortedness status
-  // of a system (if `sorted' evaluates to `false' nothing is known).
-  // This assertion is used to ensure that the system
-  // is actually sorted when `sorted' value is 'true'.
-  assert(!sorted || check_sorted());
-  return sorted;
-}
+  //@} // State Flag Setters: Set Only the Specified Flags
 
-inline void
-Linear_System::set_sorted(const bool b) {
-  sorted = b;
-}
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
 
-inline
-Linear_System::Linear_System(Topology topol)
-  : Matrix(),
-    row_topology(topol),
-    index_first_pending(0),
-    sorted(true) {
-}
+  //! Clears the \p status flag indicating that the grid is empty.
+  void clear_empty();
 
-inline
-Linear_System::Linear_System(Topology topol,
-			     dimension_type n_rows, dimension_type n_columns)
-  : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)),
-    row_topology(topol),
-    index_first_pending(n_rows),
-    sorted(true) {
-}
+  //! Sets \p status to express that congruences are out of date.
+  void clear_congruences_up_to_date();
 
-inline dimension_type
-Linear_System::first_pending_row() const {
-  return index_first_pending;
-}
+  //! Sets \p status to express that generators are out of date.
+  void clear_generators_up_to_date();
 
-inline dimension_type
-Linear_System::num_pending_rows() const {
-  assert(num_rows() >= first_pending_row());
-  return num_rows() - first_pending_row();
-}
+  //! Sets \p status to express that congruences are no longer minimized.
+  void clear_congruences_minimized();
 
-inline void
-Linear_System::unset_pending_rows() {
-  index_first_pending = num_rows();
-}
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
 
-inline void
-Linear_System::set_index_first_pending_row(const dimension_type i) {
-  index_first_pending = i;
-}
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
 
-inline
-Linear_System::Linear_System(const Linear_System& y)
-  : Matrix(y),
-    row_topology(y.row_topology) {
-  unset_pending_rows();
-  // Previously pending rows may violate sortedness.
-  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
-  assert(num_pending_rows() == 0);
-}
+  //! \name Updating Matrices
+  //@{
 
-inline
-Linear_System::Linear_System(const Linear_System& y, With_Pending)
-  : Matrix(y),
-    row_topology(y.row_topology),
-    index_first_pending(y.index_first_pending),
-    sorted(y.sorted) {
-}
+  //! Updates and minimizes the congruences from the generators.
+  void update_congruences() const;
 
-inline Linear_System&
-Linear_System::operator=(const Linear_System& y) {
-  Matrix::operator=(y);
-  row_topology = y.row_topology;
-  unset_pending_rows();
-  // Previously pending rows may violate sortedness.
-  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
-  assert(num_pending_rows() == 0);
-  return *this;
-}
+  //! Updates and minimizes the generators from the congruences.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
 
-inline void
-Linear_System::assign_with_pending(const Linear_System& y) {
-  Matrix::operator=(y);
-  row_topology = y.row_topology;
-  index_first_pending = y.index_first_pending;
-  sorted = y.sorted;
-}
+    It is illegal to call this method when the Status field already
+    declares the grid to be empty.
+  */
+  bool update_generators() const;
 
-inline void
-Linear_System::swap(Linear_System& y) {
-  Matrix::swap(y);
-  std::swap(row_topology, y.row_topology);
-  std::swap(index_first_pending, y.index_first_pending);
-  std::swap(sorted, y.sorted);
-}
+  //@} // Updating Matrices
 
-inline void
-Linear_System::clear() {
-  // Note: do NOT modify the value of `row_topology'.
-  Matrix::clear();
-  index_first_pending = 0;
-  sorted = true;
-}
+  //! \name Minimization of Descriptions
+  //@{
 
-inline void
-Linear_System::resize_no_copy(const dimension_type new_n_rows,
-			      const dimension_type new_n_columns) {
-  Matrix::resize_no_copy(new_n_rows, new_n_columns,
-			 Linear_Row::Flags(row_topology));
-  // Even though `*this' may happen to keep its sortedness, we believe
-  // that checking such a property is not worth the effort.  In fact,
-  // it is very likely that the system will be overwritten as soon as
-  // we return.
-  set_sorted(false);
-}
+  //! Minimizes both the congruences and the generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
 
-inline void
-Linear_System::set_necessarily_closed() {
-  row_topology = NECESSARILY_CLOSED;
-  if (num_rows() > 0)
-    set_rows_topology();
-}
+    Minimization is performed on each system only if the minimized
+    Status field is clear.
+  */
+  bool minimize() const;
 
-inline void
-Linear_System::set_not_necessarily_closed() {
-  row_topology = NOT_NECESSARILY_CLOSED;
-  if (num_rows() > 0)
-    set_rows_topology();
-}
+  //@} // Minimization of Descriptions
 
-inline bool
-Linear_System::is_necessarily_closed() const {
-  return row_topology == NECESSARILY_CLOSED;
-}
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
 
-inline Linear_Row&
-Linear_System::operator[](const dimension_type k) {
-  return static_cast<Linear_Row&>(Matrix::operator[](k));
-}
+  //! Polynomial but incomplete equivalence test between grids.
+  Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
 
-inline const Linear_Row&
-Linear_System::operator[](const dimension_type k) const {
-  return static_cast<const Linear_Row&>(Matrix::operator[](k));
-}
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Grid& y) const;
 
-inline Topology
-Linear_System::topology() const {
-  return row_topology;
-}
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
 
-inline dimension_type
-Linear_System::max_space_dimension() {
-  // Column zero holds the inhomogeneous term or the divisor.
-  // In NNC linear systems, the last column holds the coefficient
-  // of the epsilon dimension.
-  return max_num_columns() - 2;
-}
+    \param expr
+    The linear expression to test;
 
-inline dimension_type
-Linear_System::space_dimension() const {
-  const dimension_type n_columns = num_columns();
-  return (n_columns == 0)
-    ? 0
-    : n_columns - (is_necessarily_closed() ? 1 : 2);
-}
+    \param method_call
+    The call description of the public parent method, for example
+    "bounded_from_above(e)".  Passed to throw_dimension_incompatible,
+    as the first argument.
 
-inline void
-Linear_System::remove_trailing_columns(const dimension_type n) {
-  Matrix::remove_trailing_columns(n);
-  // Have to re-normalize the rows of the system,
-  // since we removed some coefficients.
-  strong_normalize();
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, const char* method_call) const;
 
-inline void
-Linear_System::permute_columns(const std::vector<dimension_type>& cycles) {
-  Matrix::permute_columns(cycles);
-  // The rows with permuted columns are still normalized but may
-  // be not strongly normalized: sign normalization is necessary.
-  sign_normalize();
-}
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
 
-/*! \relates Linear_System */
-inline bool
-operator!=(const Linear_System& x, const Linear_System& y) {
-  return !(x == y);
-}
+    \param method_call
+    The call description of the public parent method, for example
+    "maximize(e)".  Passed to throw_dimension_incompatible, as the
+    first argument;
 
-inline bool
-Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const {
-  return compare(static_cast<const Linear_Row&>(x),
-		 static_cast<const Linear_Row&>(y)) < 0;
-}
+    \param ext_n
+    The numerator of the extremum value;
 
-} // namespace Parma_Polyhedra_Library
+    \param ext_d
+    The denominator of the extremum value;
 
-namespace std {
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr in \p
+    *this can actually be reached (which is always the case);
 
-/*! \relates Parma_Polyhedra_Library::Linear_System */
-inline void
-swap(Parma_Polyhedra_Library::Linear_System& x,
-     Parma_Polyhedra_Library::Linear_System& y) {
-  x.swap(y);
-}
+    \param point
+    When maximization or minimization succeeds, will be assigned the
+    point where \p expr reaches the extremum value.
 
-} // namespace std
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       const char* method_call,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Generator* point = NULL) const;
 
-namespace Parma_Polyhedra_Library {
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
 
-inline
-Linear_System::With_Saturation_Matrix_iterator::
-With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2)
-  : i1(iter1), i2(iter2) {
-}
+  //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+  void select_wider_congruences(const Grid& y,
+				Congruence_System& selected_cgs) const;
 
-inline
-Linear_System::With_Saturation_Matrix_iterator::
-With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y)
-  : i1(y.i1), i2(y.i2) {
-}
+  //! Copies widened generators from \p y to \p widened_ggs.
+  void select_wider_generators(const Grid& y,
+				Grid_Generator_System& widened_ggs) const;
 
-inline
-Linear_System::With_Saturation_Matrix_iterator::
-~With_Saturation_Matrix_iterator() {
-}
+  //@} // Widening- and Extrapolation-Related Functions
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::
-operator=(const With_Saturation_Matrix_iterator& y) {
-  i1 = y.i1;
-  i2 = y.i2;
-  return *this;
-}
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param cgs
+    A congruence system, to which columns are added;
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator++() {
-  ++i1;
-  ++i2;
-  return *this;
-}
+    \param gs
+    A generator system, to which rows and columns are added;
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::operator++(int) {
-  With_Saturation_Matrix_iterator tmp = *this;
-  operator++();
-  return tmp;
-}
+    \param dims
+    The number of space dimensions to add.
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator--() {
-  --i1;
-  --i2;
-  return *this;
-}
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE>.
+  */
+  void add_space_dimensions(Congruence_System& cgs,
+			    Grid_Generator_System& gs,
+			    dimension_type dims);
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::operator--(int) {
-  With_Saturation_Matrix_iterator tmp = *this;
-  operator--();
-  return tmp;
-}
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param gs
+    A generator system, to which columns are added;
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator+=(difference_type d) {
-  i1 += d;
-  i2 += d;
-  return *this;
-}
+    \param cgs
+    A congruence system, to which rows and columns are added;
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::
-operator+(difference_type d) const {
-  With_Saturation_Matrix_iterator tmp = *this;
-  tmp += d;
-  return tmp;
-}
+    \param dims
+    The number of space dimensions to add.
 
-inline Linear_System::With_Saturation_Matrix_iterator&
-Linear_System::With_Saturation_Matrix_iterator::operator-=(difference_type d) {
-  i1 -= d;
-  i2 -= d;
-  return *this;
-}
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_project()</CODE>.
+  */
+  void add_space_dimensions(Grid_Generator_System& gs,
+			    Congruence_System& cgs,
+			    dimension_type dims);
 
-inline Linear_System::With_Saturation_Matrix_iterator
-Linear_System::With_Saturation_Matrix_iterator::
-operator-(difference_type d) const {
-  With_Saturation_Matrix_iterator tmp = *this;
-  tmp -= d;
-  return tmp;
-}
+  //! \name Minimization-related Static Member Functions
+  //@{
 
-inline Linear_System::With_Saturation_Matrix_iterator::difference_type
-Linear_System::With_Saturation_Matrix_iterator::
-operator-(const With_Saturation_Matrix_iterator& y) const {
-  return i1 - y.i1;
-}
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
 
-inline bool
-Linear_System::With_Saturation_Matrix_iterator::
-operator==(const With_Saturation_Matrix_iterator& y) const {
-  return i1 == y.i1;
-}
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
 
-inline bool
-Linear_System::With_Saturation_Matrix_iterator::
-operator!=(const With_Saturation_Matrix_iterator& y) const {
-  return i1 != y.i1;
-}
+    \param divisor
+    A reference to the initial value of the divisor.  The resulting
+    value of this object is the new system divisor.
 
-inline bool
-Linear_System::With_Saturation_Matrix_iterator::
-operator<(const With_Saturation_Matrix_iterator& y) const {
-  return i1 < y.i1;
-}
+    \param first_point
+    If \p first_point has a value other than NULL then it is taken as
+    the first point in \p sys, and it is assumed that any following
+    points have the same divisor as \p first_point.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys,
+		     Coefficient& divisor,
+		     const Grid_Generator* first_point = NULL);
 
-inline Linear_System::With_Saturation_Matrix_iterator::reference
-Linear_System::With_Saturation_Matrix_iterator::operator*() const {
-  return *i1;
-}
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
 
-inline Linear_System::With_Saturation_Matrix_iterator::pointer
-Linear_System::With_Saturation_Matrix_iterator::operator->() const {
-  return &*i1;
-}
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys);
 
-inline void
-Linear_System::With_Saturation_Matrix_iterator::
-iter_swap(const With_Saturation_Matrix_iterator& y) const {
-  std::iter_swap(i1, y.i1);
-  std::iter_swap(i2, y.i2);
-}
+  //! Normalize all the divisors in \p sys and \p gen_sys.
+  /*!
+    Modify \p sys and \p gen_sys to use the same single divisor value
+    for all generators, leaving each system representing the grid it
+    represented originally.
 
-} // namespace Parma_Polyhedra_Library
+    \param sys
+    The first of the generator systems to be normalized.
 
-namespace std {
+    \param gen_sys
+    The second of the generator systems to be normalized.  This system
+    must have at least one row and the divisors of the generators in
+    this system must be equal.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-inline void
-iter_swap(Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator x,
-	  Parma_Polyhedra_Library
-	  ::Linear_System::With_Saturation_Matrix_iterator y) {
-  x.iter_swap(y);
-}
+    \exception std::runtime_error
+    Thrown if all rows in \p gen_sys are lines and/or parameters.
+  */
+  static void normalize_divisors(Grid_Generator_System& sys,
+				 Grid_Generator_System& gen_sys);
 
-} // namespace std
+  /*! \brief
+    Converts generator system \p dest to be equivalent to congruence
+    system \p source.
+  */
+  static void conversion(Congruence_System& source,
+			 Grid_Generator_System& dest,
+			 Dimension_Kinds& dim_kinds);
 
-// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 516
+  /*! \brief
+    Converts congruence system \p dest to be equivalent to generator
+    system \p source.
+  */
+  static void conversion(Grid_Generator_System& source,
+			 Congruence_System& dest,
+			 Dimension_Kinds& dim_kinds);
 
-// Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 33
-#include <iterator>
-#include <iosfwd>
+  //! Converts \p cgs to upper triangular (i.e. minimized) form.
+  /*!
+    Returns <CODE>true</CODE> if \p cgs represents the empty set,
+    otherwise returns <CODE>false</CODE>.
+  */
+  static bool simplify(Congruence_System& cgs,
+		       Dimension_Kinds& dim_kinds);
 
-namespace Parma_Polyhedra_Library {
+  //! Converts \p gs to lower triangular (i.e. minimized) form.
+  /*!
+    Expects \p gs to contain at least one point.
+  */
+  static void simplify(Grid_Generator_System& gs,
+		       Dimension_Kinds& dim_kinds);
 
-namespace IO_Operators {
+  //! Reduces the line \p row using the line \p pivot.
+  /*!
+    Uses the line \p pivot to change the representation of the line \p
+    row so that the element at index \p col of \p row is zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_line_with_line(Grid_Generator& row,
+				    Grid_Generator& pivot,
+				    dimension_type col);
 
-//! Output operator.
-/*!
-  \relates Parma_Polyhedra_Library::Constraint_System
-  Writes <CODE>true</CODE> if \p cs is empty.  Otherwise, writes on
-  \p s the constraints of \p cs, all in one row and separated by ", ".
-*/
-std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+  //! Reduces the equality \p row using the equality \p pivot.
+  /*!
+    Uses the equality \p pivot to change the representation of the
+    equality \p row so that the element at index \p col of \p row is
+    zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_equality_with_equality(Congruence& row,
+					    const Congruence& pivot,
+					    dimension_type col);
 
-} // namespace IO_Operators
+  //! Reduces \p row using \p pivot.
+  /*!
+    Uses the point, parameter or proper congruence at \p pivot to
+    change the representation of the point, parameter or proper
+    congruence at \p row so that the element at index \p col of \p row
+    is zero.  Only elements from index \p start to index \p end are
+    modified (i.e. it is assumed that all other elements are zero).
+  */
+  // Part of Grid for access to Matrix::rows.
+  template <typename R>
+  static void reduce_pc_with_pc(R& row,
+				R& pivot,
+				dimension_type col,
+				dimension_type start,
+				dimension_type end);
 
-// Put it in the namespace here to declare it friend later.
-/*! \relates Polyhedron */
-bool operator==(const Polyhedron& x, const Polyhedron& y);
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the line \p pivot to change the representation of the
+    parameter \p row such that the element at index \p col of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_parameter_with_line(Grid_Generator& row,
+					 const Grid_Generator& pivot,
+					 dimension_type col,
+					 Grid_Generator_System& sys);
 
-} // namespace Parma_Polyhedra_Library
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the equality \p pivot to change the representation of the
+    congruence \p row such that element at index \p col of \p row is
+    zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_congruence_with_equality(Congruence& row,
+					      const Congruence& pivot,
+					      dimension_type col,
+					      Congruence_System& sys);
 
+#ifdef STRONG_REDUCTION
+  //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+  /*!
+    Only consider from index \p start to index \p end of the row at \p
+    pivot_index.  Flag \p generators indicates whether \p sys is a
+    congruence or generator system.
+  */
+  template <typename M, typename R>
+  static void reduce_reduced(M& sys, dimension_type dim,
+			     dimension_type pivot_index,
+			     dimension_type start, dimension_type end,
+			     const Dimension_Kinds& dim_kinds,
+			     bool generators = true);
+#endif
 
-namespace std {
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Matrix::rows and cgs::operator[].
+  static void multiply_grid(const Coefficient& multiplier,
+			    Congruence& cg, Congruence_System& dest,
+			    dimension_type num_rows,
+			    dimension_type num_dims);
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Constraint_System */
-void swap(Parma_Polyhedra_Library::Constraint_System& x,
-	  Parma_Polyhedra_Library::Constraint_System& y);
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Grid_Generator::operator[].
+  static void multiply_grid(const Coefficient& multiplier,
+			    Grid_Generator& gen,
+			    Grid_Generator_System& dest,
+			    dimension_type num_rows,
+			    dimension_type num_dims);
 
-} // namespace std
+  /*! \brief
+    If \p sys is lower triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool lower_triangular(const Congruence_System& sys,
+			       const Dimension_Kinds& dim_kinds);
 
-//! A system of constraints.
-/*! \ingroup PPL_CXX_interface
-    An object of the class Constraint_System is a system of constraints,
-    i.e., a multiset of objects of the class Constraint.
-    When inserting constraints in a system, space dimensions are
-    automatically adjusted so that all the constraints in the system
-    are defined on the same vector space.
+  /*! \brief
+    If \p sys is upper triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool upper_triangular(const Grid_Generator_System& sys,
+			       const Dimension_Kinds& dim_kinds);
 
-    \par
-    In all the examples it is assumed that variables
-    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
-    \code
-  Variable x(0);
-  Variable y(1);
-    \endcode
+#ifndef NDEBUG
+  //! Checks that trailing rows contain only zero terms.
+  /*!
+    If all columns contain zero in the rows of \p system from row
+    index \p first to row index \p last then return <code>true</code>,
+    else return <code>false</code>.  \p row_size gives the number of
+    columns in each row.
 
-    \par Example 1
-    The following code builds a system of constraints corresponding to
-    a square in \f$\Rset^2\f$:
-    \code
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-  cs.insert(y >= 0);
-  cs.insert(y <= 3);
-    \endcode
-    Note that:
-    the constraint system is created with space dimension zero;
-    the first and third constraint insertions increase the space
-    dimension to \f$1\f$ and \f$2\f$, respectively.
+    This method is only used in assertions in the simplify methods.
+  */
+  template <typename M, typename R>
+  static bool rows_are_zero(M& system,
+			    dimension_type first,
+			    dimension_type last,
+			    dimension_type row_size);
+#endif
 
-    \par Example 2
-    By adding four strict inequalities to the constraint system
-    of the previous example, we can remove just the four
-    vertices from the square defined above.
-    \code
-  cs.insert(x + y > 0);
-  cs.insert(x + y < 6);
-  cs.insert(x - y < 3);
-  cs.insert(y - x < 3);
-    \endcode
+  //@} // Minimization-Related Static Member Functions
 
-    \par Example 3
-    The following code builds a system of constraints corresponding to
-    a half-strip in \f$\Rset^2\f$:
-    \code
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  cs.insert(x - y <= 0);
-  cs.insert(x - y + 1 >= 0);
-    \endcode
+  //! \name Exception Throwers
+  //@{
+protected:
+  void throw_runtime_error(const char* method) const;
+  void throw_invalid_argument(const char* method, const char* reason) const;
 
-    \note
-    After inserting a multiset of constraints in a constraint system,
-    there are no guarantees that an <EM>exact</EM> copy of them
-    can be retrieved:
-    in general, only an <EM>equivalent</EM> constraint system
-    will be available, where original constraints may have been
-    reordered, removed (if they are trivial, duplicate or
-    implied by other constraints), linearly combined, etc.
-*/
-class Parma_Polyhedra_Library::Constraint_System : private Linear_System {
-public:
-  //! Default constructor: builds an empty system of constraints.
-  Constraint_System();
+  void throw_dimension_incompatible(const char* method,
+				    const char* other_name,
+				    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gr_name,
+				    const Grid& gr) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* e_name,
+				    const Linear_Expression& e) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cg_name,
+				    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* c_name,
+				    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Grid_Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cgs_name,
+				    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cs_name,
+				    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gs_name,
+				    const Grid_Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* var_name,
+				    Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_space_dim) const;
 
-  //! Builds the singleton system containing only constraint \p c.
-  explicit Constraint_System(const Constraint& c);
+  // Note: it has to be a static method, because it can be called inside
+  // constructors (before actually constructing the grid object).
+  static void throw_space_dimension_overflow(const char* method,
+					     const char* reason);
 
-  //! Ordinary copy-constructor.
-  Constraint_System(const Constraint_System& cs);
+  void throw_invalid_generator(const char* method,
+			       const char* g_name) const;
+  void throw_invalid_generators(const char* method,
+				const char* gs_name) const;
+  //@} // Exception Throwers
 
-  //! Destructor.
-  ~Constraint_System();
+};
 
-  //! Assignment operator.
-  Constraint_System& operator=(const Constraint_System& y);
 
-  //! Returns the maximum space dimension a Constraint_System can handle.
-  static dimension_type max_space_dimension();
+namespace std {
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid */
+void swap(Parma_Polyhedra_Library::Grid& x,
+	  Parma_Polyhedra_Library::Grid& y);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this
-    contains one or more strict inequality constraints.
-  */
-  bool has_strict_inequalities() const;
+} // namespace std
 
-  /*! \brief
-    Removes all the constraints from the constraint system
-    and sets its space dimension to 0.
-  */
-  void clear();
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Status.inlines.hh line 1
+/* Grid::Status class implementation: inline functions.
+*/
 
-  /*! \brief
-    Inserts in \p *this a copy of the constraint \p c,
-    increasing the number of space dimensions if needed.
-  */
-  void insert(const Constraint& c);
 
-  /*! \brief
-    Returns the singleton system containing only
-    Constraint::zero_dim_false().
-  */
-  static const Constraint_System& zero_dim_empty();
+namespace Parma_Polyhedra_Library {
 
-  //! An iterator over a system of constraints.
-  /*! \ingroup PPL_CXX_interface
-    A const_iterator is used to provide read-only access
-    to each constraint contained in a Constraint_System object.
+inline
+Grid::Status::Status(flags_t mask)
+  : flags(mask) {
+}
 
-    \par Example
-    The following code prints the system of constraints
-    defining the polyhedron <CODE>ph</CODE>:
-    \code
-  const Constraint_System& cs = ph.constraints();
-  for (Constraint_System::const_iterator i = cs.begin(),
-         cs_end = cs.end(); i != cs_end; ++i)
-    cout << *i << endl;
-    \endcode
-  */
-  class const_iterator
-    : public std::iterator<std::forward_iterator_tag,
-			   Constraint,
-			   ptrdiff_t,
-			   const Constraint*,
-			   const Constraint&> {
-  public:
-    //! Default constructor.
-    const_iterator();
+inline
+Grid::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
 
-    //! Ordinary copy-constructor.
-    const_iterator(const const_iterator& y);
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
 
-    //! Destructor.
-    ~const_iterator();
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
 
-    //! Assignment operator.
-    const_iterator& operator=(const const_iterator& y);
+inline void
+Grid::Status::set(flags_t mask) {
+  flags |= mask;
+}
 
-    //! Dereference operator.
-    const Constraint& operator*() const;
+inline void
+Grid::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
 
-    //! Indirect member selector.
-    const Constraint* operator->() const;
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
 
-    //! Prefix increment operator.
-    const_iterator& operator++();
+inline void
+Grid::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
 
-    //! Postfix increment operator.
-    const_iterator operator++(int);
+inline void
+Grid::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are identical.
-    */
-    bool operator==(const const_iterator& y) const;
+inline bool
+Grid::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+  reset(EMPTY);
+}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are different.
-    */
-    bool operator!=(const const_iterator& y) const;
+inline void
+Grid::Status::set_empty() {
+  flags = EMPTY;
+}
 
-  private:
-    friend class Constraint_System;
+inline bool
+Grid::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
 
-    //! The const iterator over the matrix of constraints.
-    Linear_System::const_iterator i;
+inline void
+Grid::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
 
-    //! A const pointer to the matrix of constraints.
-    const Linear_System* csp;
+inline void
+Grid::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
 
-    //! Constructor.
-    const_iterator(const Linear_System::const_iterator& iter,
-		   const Constraint_System& csys);
+inline bool
+Grid::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
 
-    //! \p *this skips to the next non-trivial constraint.
-    void skip_forward();
-  };
+inline void
+Grid::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
 
-  /*! \brief
-    Returns the const_iterator pointing to the first constraint,
-    if \p *this is not empty;
-    otherwise, returns the past-the-end const_iterator.
-  */
-  const_iterator begin() const;
+inline void
+Grid::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+inline bool
+Grid::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
 
-  //! Checks if all the invariants are satisfied.
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*!
-    Returns <CODE>true</CODE> if and only if \p *this is a valid
-    Linear_System and each row in the system is a valid Constraint.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool OK() const;
+inline void
+Grid::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
 
-  PPL_OUTPUT_DECLARATIONS;
+inline void
+Grid::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+inline bool
+Grid::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+inline void
+Grid::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+inline void
+Grid::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
 
-  //! Swaps \p *this with \p y.
-  void swap(Constraint_System& y);
 
-private:
-  friend class const_iterator;
-  friend class Parma_Polyhedra_Library::Polyhedron;
-  friend class Parma_Polyhedra_Library::LP_Problem;
+inline bool
+Grid::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
-				      const Polyhedron& y);
+inline void
+Grid::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
 
-  //! Builds an empty system of constraints having the specified topology.
-  explicit Constraint_System(Topology topol);
+inline void
+Grid::Status::set_c_pending() {
+  set(CS_PENDING);
+}
 
-  /*! \brief
-    Builds a system of \p n_rows constraints on a \p n_columns - 1
-    dimensional space (including the \f$\epsilon\f$ dimension, if
-    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
-  */
-  Constraint_System(Topology topol,
-		    dimension_type n_rows, dimension_type n_columns);
+inline bool
+Grid::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
 
-  /*! \brief
-    Adjusts \p *this so that it matches the topology and
-    the number of space dimensions given as parameters
-    (adding or removing columns if needed).
-    Returns <CODE>false</CODE> if and only if \p topol is
-    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
-    contains strict inequalities.
-  */
-  bool adjust_topology_and_space_dimension(Topology topol,
-					   dimension_type num_dimensions);
+inline void
+Grid::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
 
-  //! Returns the \p k- th constraint of the system.
-  Constraint& operator[](dimension_type k);
+inline void
+Grid::Status::set_g_pending() {
+  set(GS_PENDING);
+}
 
-  //! Returns a constant reference to the \p k- th constraint of the system.
-  const Constraint& operator[](dimension_type k) const;
 
-  //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
-  bool satisfies_all_constraints(const Generator& g) const;
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
 
-  //! Substitutes a given column of coefficients by a given affine expression.
-  /*!
-    \param v
-    Index of the column to which the affine transformation is substituted.
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
 
-    \param expr
-    The numerator of the affine transformation:
-    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
 
-    \param denominator
-    The denominator of the affine transformation.
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
 
-    We want to allow affine transformations
-    (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
-    having any rational coefficients. Since the coefficients of the
-    constraints are integers we must also provide an integer \p
-    denominator that will be used as denominator of the affine
-    transformation.
-    The denominator is required to be a positive integer.
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
 
-    The affine transformation substitutes the matrix of constraints
-    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
-    the old one \f$a_{ij}\f$ as follows:
-    \f[
-      {a'}_{ij} =
-        \begin{cases}
-          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
-            \quad \text{for } j \neq v; \\
-          \mathrm{expr}[v] * a_{iv}
-            \quad \text{for } j = v.
-        \end{cases}
-    \f]
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
 
-    \p expr is a constant parameter and unaltered by this computation.
-  */
-  void affine_preimage(dimension_type v,
-		       const Linear_Expression& expr,
-		       Coefficient_traits::const_reference denominator);
+} // namespace Parma_Polyhedra_Library
 
-  //! Returns the number of equality constraints.
-  dimension_type num_equalities() const;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.inlines.hh line 1
+/* Grid class implementation: inline functions.
+*/
 
-  //! Returns the number of inequality constraints.
-  dimension_type num_inequalities() const;
 
-  /*! \brief
-    Applies Gaussian's elimination and back-substitution so as
-    to provide a partial simplification of the system of constraints.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.inlines.hh line 29
+#include <algorithm>
 
-    It is assumed that the system has no pending constraints.
-  */
-  void simplify();
+namespace Parma_Polyhedra_Library {
 
-  /*! \brief
-    Inserts in \p *this a copy of the constraint \p c,
-    increasing the number of space dimensions if needed.
-    It is a pending constraint.
-  */
-  void insert_pending(const Constraint& c);
+inline dimension_type
+Grid::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(std::numeric_limits<dimension_type>::max() - 1,
+		  std::min(Congruence_System::max_space_dimension(),
+			   Grid_Generator_System::max_space_dimension()
+			   )
+		  );
+}
 
-  //! Adds low-level constraints to the constraint system.
-  void add_low_level_constraints();
-};
+inline void
+Grid::set_congruences_up_to_date() {
+  status.set_c_up_to_date();
+}
 
-// Constraint_System.inlines.hh is not included here on purpose.
+inline
+Grid::Grid(dimension_type num_dimensions,
+	   const Degenerate_Element kind)
+  : con_sys(),
+    gen_sys(num_dimensions > max_space_dimension()
+	    ? (throw_space_dimension_overflow("Grid(n, k)",
+					      "n exceeds the maximum "
+					      "allowed space dimension"),
+	       0)
+	    : num_dimensions) {
+  construct(num_dimensions, kind);
+  assert(OK());
+}
 
-// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 31
-#include <vector>
-#include <iosfwd>
+inline
+Grid::Grid(const Congruence_System& cgs)
+  : con_sys(cgs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(cgs)",
+					     "the space dimension of cgs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : cgs.space_dimension()),
+    gen_sys(cgs.space_dimension()) {
+  Congruence_System cgs_copy(cgs);
+  construct(cgs_copy);
+}
 
-namespace Parma_Polyhedra_Library {
+inline
+Grid::Grid(Congruence_System& cgs, Recycle_Input)
+  : con_sys(cgs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(cgs, recycle)",
+					     "the space dimension of cgs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : cgs.space_dimension()),
+    gen_sys(cgs.space_dimension()) {
+  construct(cgs);
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A not necessarily closed bounding-box.
-/*! \ingroup PPL_CXX_interface
-  A Bounding_Box object represents the Cartesian product of \f$n\f$
-  not necessarily closed and possibly unbounded intervals,
-  where \f$n\f$ is the space dimension of the box.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Bounding_Box {
-public:
-  //! Constructs a universe bounding box of dimension \p num_dimensions.
-  Bounding_Box(dimension_type num_dimensions);
+inline
+Grid::Grid(const Grid_Generator_System& ggs)
+  : con_sys(ggs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(ggs)",
+					     "the space dimension of ggs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : ggs.space_dimension()),
+    gen_sys(ggs.space_dimension()) {
+  Grid_Generator_System ggs_copy(ggs);
+  construct(ggs_copy);
+}
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+inline
+Grid::Grid(Grid_Generator_System& ggs, Recycle_Input)
+  : con_sys(ggs.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(ggs, recycle)",
+					     "the space dimension of ggs "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : ggs.space_dimension()),
+    gen_sys(ggs.space_dimension()) {
+  construct(ggs);
+}
 
-  /*! \brief
-    Returns a reference the interval that bounds
-    the box on the <CODE>k</CODE>-th space dimension.
-  */
-  const Interval& operator[](dimension_type k) const;
+template <typename U>
+inline
+Grid::Grid(const BD_Shape<U>& bd,
+           Complexity_Class)
+  : con_sys(bd.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(bd)",
+					     "the space dimension of bd "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : bd.space_dimension()),
+    gen_sys(bd.space_dimension()) {
+  Congruence_System cgs = bd.congruences();
+  construct(cgs);
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
-  bool is_empty() const;
+template <typename U>
+inline
+Grid::Grid(const Octagonal_Shape<U>& os,
+           Complexity_Class)
+  : con_sys(os.space_dimension() > max_space_dimension()
+	    ? throw_space_dimension_overflow("Grid(os)",
+					     "the space dimension of os "
+					     "exceeds the maximum allowed "
+					     "space dimension"), 0
+	    : os.space_dimension()),
+    gen_sys(os.space_dimension()) {
+  Congruence_System cgs = os.congruences();
+  construct(cgs);
+}
 
-  /*! \brief
-    If the <CODE>k</CODE>-th space dimension is unbounded below, returns
-    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
-    \p closed, \p n and \p d accordingly.
+inline
+Grid::~Grid() {
+}
 
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
+inline dimension_type
+Grid::space_dimension() const {
+  return space_dim;
+}
 
-    An undefined behavior is obtained if \p k is greater than
-    or equal to the space dimension of \p *this.
-  */
-  bool get_lower_bound(dimension_type k, bool& closed,
-		       Coefficient& n, Coefficient& d) const;
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-  /*! \brief
-    If the <CODE>k</CODE>-th space dimension is unbounded above, returns
-    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
-    \p closed, \p n and \p d accordingly.
+inline int32_t
+Grid::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
 
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
+inline Constraint_System
+Grid::constraints() const {
+    return Constraint_System(congruences());;
+}
 
-    An undefined behavior is obtained if \p k is greater than
-    or equal to the space dimension of \p *this.
-  */
-  bool get_upper_bound(dimension_type k, bool& closed,
-		       Coefficient& n, Coefficient& d) const;
+inline Constraint_System
+Grid::minimized_constraints() const {
+    return Constraint_System(minimized_congruences());;
+}
 
-  //! Causes the box to become empty, i.e., to represent the empty set.
-  void set_empty();
+inline void
+Grid::upper_bound_assign(const Grid& y) {
+  join_assign(y);
+}
 
-  /*! \brief
-    Raises the lower bound of the interval corresponding
-    to the <CODE>k</CODE>-th space dimension.
+inline void
+Grid::upper_bound_assign_and_minimize(const Grid& y) {
+  join_assign_and_minimize(y);
+}
 
-    Intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
-    An undefined behavior is obtained if \p k is greater than or equal to
-    the space dimension of \p *this or if \p d is equal to zero.
-  */
-  void raise_lower_bound(dimension_type k, bool closed,
-			 Coefficient_traits::const_reference n,
-			 Coefficient_traits::const_reference d);
+inline bool
+Grid::upper_bound_assign_if_exact(const Grid& y) {
+  return join_assign_if_exact(y);
+}
 
-  /*! \brief
-    Lowers the upper bound of the interval corresponding
-    to the <CODE>k</CODE>-th space dimension.
+inline void
+Grid::difference_assign(const Grid& y) {
+  grid_difference_assign(y);
+}
 
-    Intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
-    is <CODE>false</CODE>.
-    An undefined behavior is obtained if \p k is greater than or equal to
-    the space dimension of \p *this or if \p d is equal to zero.
-  */
-  void lower_upper_bound(dimension_type k, bool closed,
-			 Coefficient_traits::const_reference n,
-			 Coefficient_traits::const_reference d);
+inline void
+Grid::swap(Grid& y) {
+  std::swap(con_sys, y.con_sys);
+  std::swap(gen_sys, y.gen_sys);
+  std::swap(status, y.status);
+  std::swap(space_dim, y.space_dim);
+  std::swap(dim_kinds, y.dim_kinds);
+}
 
-  //! Returns a system of constraints corresponding to \p *this.
-  Constraint_System constraints() const;
+inline void
+Grid::refine_with_congruence(const Congruence& cg) {
+  add_congruence(cg);
+}
 
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+inline void
+Grid::refine_with_congruences(const Congruence_System& cgs) {
+  add_congruences(cgs);
+}
 
-    \param y
-    A bounding box that <EM>must</EM> be contained in \p *this.
+inline bool
+Grid::can_recycle_constraint_systems() {
+  return true;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void CC76_widening_assign(const Bounding_Box& y);
 
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+inline bool
+Grid::can_recycle_congruence_systems() {
+  return true;
+}
 
-    \param y
-    A bounding box that <EM>must</EM> be contained in \p *this.
+} // namespace Parma_Polyhedra_Library
 
-    \param first
-    An iterator that points to the first stop-point.
+/*! \relates Parma_Polyhedra_Library::Grid */
+inline void
+std::swap(Parma_Polyhedra_Library::Grid& x,
+	  Parma_Polyhedra_Library::Grid& y) {
+  x.swap(y);
+}
 
-    \param last
-    An iterator that points one past the last stop-point.
+namespace Parma_Polyhedra_Library {
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  template <typename Iterator>
-  void CC76_widening_assign(const Bounding_Box& y,
-			    Iterator first, Iterator last);
+inline bool
+Grid::marked_empty() const {
+  return status.test_empty();
+}
 
-private:
-  /*! \brief
-    A vector of rational intervals, one for each dimension
-    of the vector space.
-  */
-  std::vector<Interval> vec;
-  /*! \brief
-    A boolean flag indicating emptiness of the bounding box.
-    Only meaningful when \p empty_up_to_date is <CODE>true</CODE>.
-  */
-  mutable bool empty;
-  //! Tells whether or not the flag \p empty is meaningful.
-  mutable bool empty_up_to_date;
+inline bool
+Grid::congruences_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
 
-  //! Records the stop points for CC76_widening_assign(const Bounding_Box&).
-  static ERational default_stop_points[];
-};
+inline bool
+Grid::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
 
-namespace IO_Operators {
+inline bool
+Grid::congruences_are_minimized() const {
+  return status.test_c_minimized();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Bounding_Box */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-std::ostream& operator<<(std::ostream& s, const Bounding_Box& bbox);
+inline bool
+Grid::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
 
-} // namespace IO_Operators
+inline void
+Grid::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
 
-} // namespace Parma_Polyhedra_Library
+inline void
+Grid::set_congruences_minimized() {
+  set_congruences_up_to_date();
+  status.set_c_minimized();
+}
 
-// Automatically generated from PPL source file ../src/Bounding_Box.inlines.hh line 1
-/* Bounding_Box class implementation: inline functions.
-*/
+inline void
+Grid::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
 
+inline void
+Grid::clear_empty() {
+  status.reset_empty();
+}
 
-namespace Parma_Polyhedra_Library {
+inline void
+Grid::clear_congruences_minimized() {
+  status.reset_c_minimized();
+}
 
-inline
-Bounding_Box::Bounding_Box(dimension_type num_dimensions)
-  : vec(num_dimensions), empty(false), empty_up_to_date(true) {
+inline void
+Grid::clear_generators_minimized() {
+  status.reset_g_minimized();
 }
 
-inline dimension_type
-Bounding_Box::space_dimension() const {
-  return vec.size();
+inline void
+Grid::clear_congruences_up_to_date() {
+  clear_congruences_minimized();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
 }
 
-inline const Interval&
-Bounding_Box::operator[](const dimension_type k) const {
-  assert(k < vec.size());
-  return vec[k];
+inline void
+Grid::clear_generators_up_to_date() {
+  clear_generators_minimized();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
 }
 
 inline bool
-Bounding_Box::is_empty() const {
-  if (empty_up_to_date)
-    return empty;
-  else {
-    empty_up_to_date = true;
-    for (dimension_type k = vec.size(); k-- > 0; )
-      if (vec[k].is_empty()) {
-	empty = true;
-	return true;
-      }
-    empty = false;
-    return false;
-  }
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_above(e)");
 }
 
 inline bool
-Bounding_Box::get_lower_bound(const dimension_type k, bool& closed,
-			      Coefficient& n, Coefficient& d) const {
-  assert(k < vec.size());
-  const LBoundary& lb = vec[k].lower_bound();
-  const ERational& lr = lb.bound();
-
-  if (is_plus_infinity(lr) || is_minus_infinity(lr))
-    return false;
-
-  closed = lb.is_closed();
-  n = raw_value(lr).get_num();
-  d = raw_value(lr).get_den();
-
-  return true;
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_below(e)");
 }
 
 inline bool
-Bounding_Box::get_upper_bound(const dimension_type k, bool& closed,
-			     Coefficient& n, Coefficient& d) const {
-  assert(k < vec.size());
-  const UBoundary& ub = vec[k].upper_bound();
-  const ERational& ur = ub.bound();
+Grid::maximize(const Linear_Expression& expr,
+	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
 
-  if (is_plus_infinity(ur) || is_minus_infinity(ur))
-    return false;
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+	       Generator& point) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
 
-  closed = ub.is_closed();
-  n = raw_value(ur).get_num();
-  d = raw_value(ur).get_den();
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
 
-  return true;
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+	       Generator& point) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
 }
 
 inline void
-Bounding_Box::set_empty() {
-  for (dimension_type k = vec.size(); k-- > 0; )
-    vec[k].set_empty();
-  empty = empty_up_to_date = true;
+Grid::normalize_divisors(Grid_Generator_System& sys) {
+  TEMP_INTEGER(divisor);
+  divisor = 1;
+  normalize_divisors(sys, divisor);
 }
 
-inline void
-Bounding_Box::raise_lower_bound(const dimension_type k, const bool closed,
-				Coefficient_traits::const_reference n,
-				Coefficient_traits::const_reference d) {
-  assert(k < vec.size());
-  assert(d != 0);
-  mpq_class q;
-  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-  q.canonicalize();
-  vec[k].raise_lower_bound(LBoundary(ERational(q, ROUND_NOT_NEEDED),
-				     (closed
-				      ? LBoundary::CLOSED
-				      : LBoundary::OPEN)));
-  empty_up_to_date = false;
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+  return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+  const Grid& x = *this;
+  return x.contains(y) && !y.contains(x);
 }
 
 inline void
-Bounding_Box::lower_upper_bound(const dimension_type k, const bool closed,
-				Coefficient_traits::const_reference n,
-				Coefficient_traits::const_reference d) {
-  assert(k < vec.size());
-  assert(d != 0);
-  mpq_class q;
-  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-  q.canonicalize();
-  vec[k].lower_upper_bound(UBoundary(ERational(q, ROUND_NOT_NEEDED),
-				     (closed
-				      ? UBoundary::CLOSED
-				      : UBoundary::OPEN)));
-  empty_up_to_date = false;
+Grid::topological_closure_assign() {
+  return;
 }
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 206
-
-// Automatically generated from PPL source file ../src/Variable.defs.hh line 1
-/* Variable class declaration.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.templates.hh line 1
+/* Grid class implementation: inline functions.
 */
 
 
-// Automatically generated from PPL source file ../src/Variable.defs.hh line 29
-#include <iosfwd>
-#include <set>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.templates.hh line 29
+#include <algorithm>
+#include <deque>
 
 namespace Parma_Polyhedra_Library {
 
-namespace IO_Operators {
+template <typename Interval>
+Grid::Grid(const Box<Interval>& box,
+           Complexity_Class)
+  : con_sys(),
+    gen_sys() {
+  if (box.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(box, from_bounding_box)",
+				   "the space dimension of box "
+				   "exceeds the maximum allowed "
+				   "space dimension");
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Variable */
-std::ostream&
-operator<<(std::ostream& s, const Variable& v);
+  space_dim = box.space_dimension();
 
-} // namespace IO_Operators
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    assert(OK());
+    return;
+  }
 
-//! Defines a total ordering on variables.
-/*! \relates Variable */
-bool less(Variable v, Variable w);
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.increase_space_dimension(space_dim);
+    // Add congruences and generators according to `box'.
+    TEMP_INTEGER(l_n);
+    TEMP_INTEGER(l_d);
+    TEMP_INTEGER(u_n);
+    TEMP_INTEGER(u_d);
+    gen_sys.insert(grid_point(0*Variable(space_dim-1)));
+    Grid_Generator& point = gen_sys[0];
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      bool closed = false;
+      // TODO: Consider producing the system(s) in minimized form.
+      if (box.get_lower_bound(k, closed, l_n, l_d)) {
+	if (box.get_upper_bound(k, closed, u_n, u_d))
+	  if (l_n * u_d == u_n * l_d) {
+	    // A point interval sets dimension k of every point to a
+	    // single value.
+	    con_sys.insert(l_d * Variable(k) == l_n);
 
-} // namespace Parma_Polyhedra_Library
+	    // Scale the point to use as divisor the lcm of the
+	    // divisors of the existing point and the lower bound.
+	    const Coefficient& point_divisor = point.divisor();
+	    gcd_assign(u_n, l_d, point_divisor);
+	    // `u_n' now holds the gcd.
+	    exact_div_assign(u_n, point_divisor, u_n);
+	    if (l_d < 0)
+	      neg_assign(u_n);
+	    // l_d * u_n == abs(l_d * (point_divisor / gcd(l_d, point_divisor)))
+	    point.scale_to_divisor(l_d * u_n);
+	    // Set dimension k of the point to the lower bound.
+	    if (l_d < 0)
+	      neg_assign(u_n);
+	    // point[k + 1] = l_n * point_divisor / gcd(l_d, point_divisor)
+	    point[k + 1] = l_n * u_n;
 
-//! A dimension of the vector space.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Variable represents a dimension of the space,
-  that is one of the Cartesian axes.
-  Variables are used as basic blocks in order to build
-  more complex linear expressions.
-  Each variable is identified by a non-negative integer,
-  representing the index of the corresponding Cartesian axis
-  (the first axis has index 0).
-  The space dimension of a variable is the dimension of the vector space
-  made by all the Cartesian axes having an index less than or equal to
-  that of the considered variable; thus, if a variable has index \f$i\f$,
-  its space dimension is \f$i+1\f$.
+	    continue;
+	  }
+      }
+      // A universe interval allows any value in dimension k.
+      gen_sys.insert(grid_line(Variable(k)));
+    }
+    set_congruences_up_to_date();
+    set_generators_up_to_date();
+    gen_sys.unset_pending_rows();
+    gen_sys.set_sorted(false);
+  }
 
-  Note that the ``meaning'' of an object of the class Variable
-  is completely specified by the integer index provided to its
-  constructor:
-  be careful not to be mislead by C++ language variable names.
-  For instance, in the following example the linear expressions
-  <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
-  since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
-  the same Cartesian axis.
-  \code
-  Variable x(0);
-  Variable y(1);
-  Variable z(0);
-  Linear_Expression e1 = x + y;
-  Linear_Expression e2 = y + z;
-  \endcode
+  assert(OK());
+}
 
-*/
-class Parma_Polyhedra_Library::Variable {
+template <typename Box>
+Grid::Grid(const Box& box, From_Covering_Box)
+  : con_sys(),
+    gen_sys() {
 
-public:
-  //! Builds the variable corresponding to the Cartesian axis of index \p i.
-  /*!
-    \exception std::length_error
-    Thrown if the <CODE>i+1</CODE> exceeds
-    <CODE>Variable::max_space_dimension()</CODE>.
-  */
-  explicit Variable(dimension_type i);
+  if (box.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(box, from_covering_box)",
+				   "the space dimension of box "
+				   "exceeds the maximum allowed "
+				   "space dimension");
 
-  //! Returns the index of the Cartesian axis associated to the variable.
-  dimension_type id() const;
+  space_dim = box.space_dimension();
 
-  //! Returns the maximum space dimension a Variable can handle.
-  static dimension_type max_space_dimension();
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  /*!
-    The returned value is <CODE>id()+1</CODE>.
-  */
-  dimension_type space_dimension() const;
+  // Check that all bounds are closed.  This check must be done before
+  // the empty test below, as an open bound might mean an empty box.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed = false;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+  }
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    assert(OK());
+    return;
+  }
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.increase_space_dimension(space_dim);
+    // Add congruences according to `box'.
+    TEMP_INTEGER(u_n);
+    TEMP_INTEGER(u_d);
+    TEMP_INTEGER(d);
+    gen_sys.insert(grid_point(0*Variable(space_dim-1)));
+    Grid_Generator& point = gen_sys[0];
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      bool closed = false;
+      // TODO: Consider producing the system(s) in minimized form.
+      if (box.get_lower_bound(k, closed, l_n, l_d)) {
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+	const Coefficient& point_divisor = point.divisor();
+	assert(l_d > 0);
+	assert(point_divisor > 0);
+	// Use `d' to hold the gcd.
+	gcd_assign(d, l_d, point_divisor);
+	// Scale the point to use as divisor the lcm of the existing
+	// point divisor and the divisor of the lower bound.
+	exact_div_assign(d, point_divisor, d);
+	// l_d * d == abs(l_d) * (point_divisor / gcd(l_d, point_divisor))
+	point.scale_to_divisor(l_d * d);
+	// Set dimension k of the point to the lower bound.
+	// point[k + 1] = l_n * (point_divisor / gcd(l_d, point_divisor))
+	point[k + 1] = l_n * d;
 
-  //! Type of output functions.
-  typedef void output_function_type(std::ostream& s, const Variable& v);
+	if (box.get_upper_bound(k, closed, u_n, u_d)) {
+	  if (l_n * u_d == u_n * l_d) {
+	    // A point interval allows any point along the dimension
+	    // k axis.
+	    gen_sys.insert(grid_line(Variable(k)));
+	    continue;
+	  }
+	  assert(l_d > 0);
+	  assert(u_d > 0);
+	  gcd_assign(d, l_d, u_d);
+	  // `d' is the gcd of the divisors.
+	  exact_div_assign(l_d, l_d, d);
+	  exact_div_assign(d, u_d, d);
+	  l_n *= d;
+	  // `l_d' is now the smallest integer expression of the size of
+	  // the original l_d relative to u_d.
+	  u_n = (u_n * l_d) - l_n;
+	  // `u_n' is now the distance between u_n and l_n (given a
+	  // divisor of lcm of l_d and u_d.
+	  l_d *= u_d;
+	  // `l_d' is now the lcm of the divisors.
+	  con_sys.insert((l_d * Variable(k) %= l_n) / u_n);
+	  gen_sys.insert(parameter(u_n * Variable(k), l_d));
+	}
+	else
+	  // An interval bounded only from below produces an
+	  // equality.
+	  con_sys.insert(l_d * Variable(k) == l_n);
+      }
+      else
+	if (box.get_upper_bound(k, closed, u_n, u_d)) {
+	  const Coefficient& point_divisor = point.divisor();
+	  assert(u_d > 0);
+	  assert(point_divisor > 0);
+	  // Use `d' to hold the gcd.
+	  gcd_assign(d, u_d, point_divisor);
+	  // Scale the point to use as divisor the lcm of the existing
+	  // point divisor and the divisor of the lower bound.
+	  exact_div_assign(d, point_divisor, d);
+	  // u_d * d == abs(u_d) * (point_divisor / gcd(u_d, point_divisor))
+	  point.scale_to_divisor(u_d * d);
+	  // Set dimension k of the point to the lower bound.
+	  // point[k + 1] = u_n * (point_divisor / gcd(u_d, point_divisor))
+	  point[k + 1] = u_n * d;
 
-  //! Sets the output function to be used for printing Variable objects.
-  static void set_output_function(output_function_type* p);
+	  // An interval bounded only from above produces an equality.
+	  con_sys.insert(u_d * Variable(k) == u_n);
+	}
+	else {
+	  // Any universe interval produces an empty grid.
+	  set_empty();
+	  assert(OK());
+	  return;
+	}
+    }
+    normalize_divisors(gen_sys);
+    set_congruences_up_to_date();
+    set_generators_up_to_date();
+    gen_sys.set_sorted(false);
+    gen_sys.unset_pending_rows();
+  }
 
-  //! Returns the pointer to the current output function.
-  static output_function_type* get_output_function();
+  assert(OK());
+}
 
-  //! Binary predicate defining the total ordering on variables.
-  /*! \ingroup PPL_CXX_interface */
-  struct Compare {
-    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
-    bool operator()(Variable x, Variable y) const;
-  };
+template <typename Interval>
+void
+Grid::get_covering_box(Box<Interval>& box) const {
+  // Dimension-compatibility check.
+  if (space_dim > box.space_dimension())
+    throw_dimension_incompatible("get_covering_box(box)", "box",
+				 box.space_dimension());
 
-private:
-  //! The index of the Cartesian axis.
-  dimension_type varid;
+  Box<Interval> new_box(box.space_dimension());
 
-  // The initialization class needs to set the default output function.
-  friend class Init;
+  if (marked_empty()) {
+    box = new_box;
+    box.set_empty();
+    return;
+  }
+  if (space_dim == 0) {
+    return;
+  }
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    box = new_box;
+    box.set_empty();
+    return;
+  }
 
-  friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
-						    const Variable& v);
+  assert(!gen_sys.has_no_rows());
 
-  //! Pointer to the current output function.
-  static output_function_type* current_output_function;
+  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+  dimension_type num_rows = gen_sys.num_rows();
 
-  //! The default output function.
-  static void default_output_function(std::ostream& s, const Variable& v);
-};
+  TEMP_INTEGER(gcd);
+  TEMP_INTEGER(bound);
 
-// Automatically generated from PPL source file ../src/Variable.inlines.hh line 1
-/* Variable class implementation: inline functions.
-*/
+  if (num_rows > 1) {
+    Row interval_sizes(num_dims, Row::Flags());
+    std::vector<bool> interval_emptiness(num_dims, false);
 
+    // Store in `interval_sizes', for each column (that is, for each
+    // dimension), the GCD of all the values in that column where the
+    // row is of type parameter.
 
-// Automatically generated from PPL source file ../src/Variable.inlines.hh line 27
-#include <stdexcept>
+    for (dimension_type dim = num_dims; dim-- > 0; )
+      interval_sizes[dim] = 0;
+    const Grid_Generator *first_point = NULL;
+    for (dimension_type row = 0; row < num_rows; ++row) {
+      Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+      if (gen.is_line()) {
+	for (dimension_type dim = 0; dim < num_dims; ++dim)
+	  if (!interval_emptiness[dim] && gen[dim+1] != 0) {
+	    // Empty interval, set both bounds for associated
+      	    // dimension to zero.
+            new_box.add_constraint(Variable(dim) == 0);
+	    interval_emptiness[dim] = true;
+	  }
+	continue;
+      }
+      if (gen.is_point()) {
+	if (first_point == NULL) {
+	  first_point = &gen_sys[row];
+	  continue;
+	}
+	const Grid_Generator& point = *first_point;
+	// Convert the point `gen' to a parameter.
+	dimension_type dim = num_dims;
+	do {
+	  gen[dim] -= point[dim];
+	}
+	while (dim-- > 0);
+	gen.set_divisor(point.divisor());
+      }
+      for (dimension_type dim = num_dims; dim-- > 0; )
+	if (!interval_emptiness[dim])
+	  gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
+    }
 
-namespace Parma_Polyhedra_Library {
+    // For each dimension set the lower bound of the interval to the
+    // grid value closest to the origin, and the upper bound to the
+    // addition of the lower bound and the shortest distance in the
+    // given dimension between any two grid points.
+    const Grid_Generator& point = *first_point;
+    const Coefficient& divisor = point.divisor();
+    TEMP_INTEGER(lower_bound);
+    for (dimension_type dim = num_dims; dim-- > 0; ) {
+      if (interval_emptiness[dim])
+	continue;
 
-inline dimension_type
-Variable::max_space_dimension() {
-  return not_a_dimension() - 1;
-}
+      lower_bound = point[dim+1];
 
-inline
-Variable::Variable(dimension_type i)
-  : varid(i < max_space_dimension()
-	  ? i
-	  : (throw std::length_error("PPL::Variable::Variable(i):\n"
-				     "i exceeds the maximum allowed "
-				     "variable identifier."), i)) {
-}
+      // If the interval size is zero then all points have the same
+      // value in this dimension, so set only the lower bound.
+      if (interval_sizes[dim] != 0) {
+	// Make the lower bound as close as possible to the origin,
+	// leaving the sign the same.
+	lower_bound %= interval_sizes[dim];
+	// Check if the lowest value the other side of the origin is
+	// closer to the origin, preferring the lowest positive if they
+	// are equal.
+	if (lower_bound > 0) {
+	  if (interval_sizes[dim] - lower_bound < lower_bound)
+	    lower_bound -= interval_sizes[dim];
+	}
+	else if (lower_bound < 0
+		 && interval_sizes[dim] + lower_bound < - lower_bound)
+	  lower_bound += interval_sizes[dim];
 
-inline dimension_type
-Variable::id() const {
-  return varid;
-}
+	// Reduce the bound fraction first.
+	bound = interval_sizes[dim] + lower_bound;
+	gcd_assign(gcd, bound, divisor);
+	exact_div_assign(bound, bound, gcd);
+	exact_div_assign(gcd, divisor, gcd);
+	// `gcd' now holds the reduced divisor.
+        new_box.add_constraint(gcd*Variable(dim) <= bound);
+      }
 
-inline dimension_type
-Variable::space_dimension() const {
-  return varid + 1;
-}
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, lower_bound, divisor);
+      exact_div_assign(lower_bound, lower_bound, gcd);
+      exact_div_assign(gcd, divisor, gcd);
+      // `gcd' now holds the reduced divisor.
+      new_box.add_constraint(gcd*Variable(dim) >= lower_bound);
+    }
+  }
+  else {
+    const Grid_Generator& point = gen_sys[0];
+    const Coefficient& divisor = point.divisor();
+    // The covering box of a single point has only lower bounds.
+    for (dimension_type dim = num_dims; dim-- > 0; ) {
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, point[dim+1], divisor);
+      exact_div_assign(bound, point[dim+1], gcd);
+      exact_div_assign(gcd, divisor, gcd);
+      // `gcd' now holds the reduced divisor.
+      new_box.add_constraint(gcd*Variable(dim) >= bound);
+    }
+  }
 
-inline memory_size_type
-Variable::external_memory_in_bytes() const {
-  return 0;
+  box.swap(new_box);
 }
 
-inline memory_size_type
-Variable::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
 
-inline void
-Variable::set_output_function(output_function_type* p) {
-  current_output_function = p;
-}
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the grid becomes zero_dimensional.
+    if (marked_empty()
+	|| (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty grid.
+      space_dim = 0;
+      set_empty();
+    }
+    else
+      // Removing all dimensions from a non-empty grid.
+      set_zero_dim_univ();
 
-inline Variable::output_function_type*
-Variable::get_output_function() {
-  return current_output_function;
-}
+    assert(OK());
+    return;
+  }
 
-/*! \relates Variable */
-inline bool
-less(const Variable v, const Variable w) {
-  return v.id() < w.id();
-}
+  dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
 
-inline bool
-Variable::Compare::operator()(const Variable x, const Variable y) const {
-  return less(x, y);
-}
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
 
-} // namespace Parma_Polyhedra_Library
+    // We first compute suitable permutation cycles for the columns of
+    // the `con_sys' and `gen_sys' matrices.  We will represent them
+    // with a linear array, using 0 as a terminator for each cycle
+    // (notice that the columns with index 0 of `con_sys' and
+    // `gen_sys' represent the inhomogeneous terms, and thus are
+    // unaffected by the permutation of dimensions).
+    // Cycles of length 1 will be omitted so that, in the worst case,
+    // we will have `space_dim' elements organized in `space_dim/2'
+    // cycles, which means we will have at most `space_dim/2'
+    // terminators.
+    std::vector<dimension_type> cycles;
+    cycles.reserve(space_dim + space_dim/2);
 
-// Automatically generated from PPL source file ../src/Variable.defs.hh line 147
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
 
-namespace Parma_Polyhedra_Library {
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+	dimension_type j = i;
+	do {
+	  visited[j] = true;
+	  // The following initialization is only to make the compiler happy.
+	  dimension_type k = 0;
+	  if (!pfunc.maps(j, k))
+	    throw_invalid_argument("map_space_dimensions(pfunc)",
+				   " pfunc is inconsistent");
+	  if (k == j)
+	    // Cycle of length 1: skip it.
+	    goto skip;
 
-//! An std::set containing variables in increasing order of dimension index.
-/*! \ingroup PPL_CXX_interface */
-typedef std::set<Variable, Variable::Compare> Variables_Set;
+	  cycles.push_back(j+1);
+	  // Go along the cycle.
+	  j = k;
+	} while (!visited[j]);
+	// End of cycle: mark it.
+	cycles.push_back(0);
+      skip:
+	;
+      }
+    }
 
-} // namespace Parma_Polyhedra_Library
+    // If `cycles' is empty then `pfunc' is the identity.
+    if (cycles.empty())
+      return;
 
-// Automatically generated from PPL source file ../src/Init.defs.hh line 1
-/* Init class declaration.
-*/
+    // Permute all that is up-to-date.
+    if (congruences_are_up_to_date()) {
+      con_sys.permute_columns(cycles);
+      clear_congruences_minimized();
+    }
 
+    if (generators_are_up_to_date()) {
+      gen_sys.permute_columns(cycles);
+      clear_generators_minimized();
+    }
 
-// Automatically generated from PPL source file ../src/Init.defs.hh line 28
+    assert(OK());
+    return;
+  }
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Class for initialization and finalization.
-/*! \ingroup PPL_CXX_interface
-  <EM>Nifty Counter</EM> initialization class,
-  ensuring that the library is initialized only once
-  and before its first use.
-  A count of the number of translation units using the library
-  is maintained. A static object of Init type will be declared
-  by each translation unit using the library.  As a result,
-  only one of them will initialize and properly finalize
-  the library.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
 
-class Parma_Polyhedra_Library::Init {
-private:
-  //! Count the number of objects created.
-  static unsigned int count;
-  static fpu_rounding_direction_type old_rounding_direction;
+  const Grid_Generator_System& old_gensys = grid_generators();
 
-public:
-  //! Initializes the PPL.
-  Init();
+  if (old_gensys.has_no_rows()) {
+    // The grid is empty.
+    Grid new_grid(new_space_dimension, EMPTY);
+    std::swap(*this, new_grid);
+    assert(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Grid_Generator_System new_gensys;
+  // Set sortedness, for the assertion met via gs::insert.
+  new_gensys.set_sorted(false);
+  // Get the divisor of the first point.
+  Grid_Generator_System::const_iterator i;
+  Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+    if (i->is_point())
+      break;
+  assert(i != old_gensys_end);
+  const Coefficient& system_divisor = i->divisor();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i) {
+    const Grid_Generator& old_g = *i;
+    Linear_Expression e(0 * Variable(new_space_dimension-1));
+    bool all_zeroes = true;
+    for (dimension_type j = space_dim; j-- > 0; ) {
+      if (old_g.coefficient(Variable(j)) != 0
+	  && pfunc_maps[j] != not_a_dimension()) {
+	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+	all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Grid_Generator::LINE:
+      if (!all_zeroes)
+	new_gensys.insert(grid_line(e));
+      break;
+    case Grid_Generator::PARAMETER:
+      if (!all_zeroes)
+	new_gensys.insert(parameter(e, system_divisor));
+      break;
+    case Grid_Generator::POINT:
+      new_gensys.insert(grid_point(e, old_g.divisor()));
+      break;
+    case Grid_Generator::CLOSURE_POINT:
+    default:
+      assert(0);
+    }
+  }
+
+  Grid new_grid(new_gensys);
+  std::swap(*this, new_grid);
 
-  //! Finalizes the PPL.
-  ~Init();
-};
+  assert(OK(true));
+}
 
-// Automatically generated from PPL source file ../src/initializer.hh line 1
-/* Nifty counter object for the initialization of the library.
-*/
+#ifdef STRONG_REDUCTION
+template <typename M, typename R>
+void
+Grid::reduce_reduced(M& sys,
+		     const dimension_type dim,
+		     const dimension_type pivot_index,
+		     const dimension_type start,
+		     const dimension_type end,
+		     const Dimension_Kinds& dim_kinds,
+		     const bool generators) {
+  R& pivot = sys[pivot_index];
+
+  const Coefficient& pivot_dim = pivot[dim];
+
+  if (pivot_dim == 0)
+    return;
+
+  TEMP_INTEGER(pivot_dim_half);
+  pivot_dim_half = (pivot_dim + 1) / 2;
+  Dimension_Kind row_kind = dim_kinds[dim];
+  Dimension_Kind line_or_equality, virtual_kind;
+  int jump;
+  if (generators) {
+    line_or_equality = LINE;
+    virtual_kind = GEN_VIRTUAL;
+    jump = -1;
+  }
+  else {
+    line_or_equality = EQUALITY;
+    virtual_kind = CON_VIRTUAL;
+    jump = 1;
+  }
 
+  TEMP_INTEGER(num_rows_to_subtract);
+  TEMP_INTEGER(row_dim_remainder);
+  for (dimension_type row_index = pivot_index, kinds_index = dim + jump;
+       row_index-- > 0;
+       kinds_index += jump) {
+    // Move over any virtual rows.
+    while (dim_kinds[kinds_index] == virtual_kind)
+      kinds_index += jump;
+
+    // row_kind CONGRUENCE is included as PARAMETER
+    if (row_kind == line_or_equality
+	|| (row_kind == PARAMETER
+	    && dim_kinds[kinds_index] == PARAMETER)) {
+      R& row = sys[row_index];
+
+      const Coefficient& row_dim = row[dim];
+      // num_rows_to_subtract may be positive or negative.
+      num_rows_to_subtract = row_dim / pivot_dim;
+
+      // Ensure that after subtracting num_rows_to_subtract * r_dim
+      // from row_dim, -pivot_dim_half < row_dim <= pivot_dim_half.
+      // E.g., if pivot[dim] = 9, then after strong reduction
+      // -5 < row_dim <= 5.
+      row_dim_remainder = row_dim % pivot_dim;
+      if (row_dim_remainder < 0) {
+	if (row_dim_remainder <= -pivot_dim_half)
+	  --num_rows_to_subtract;
+      }
+      else if (row_dim_remainder > 0 && row_dim_remainder > pivot_dim_half)
+	++num_rows_to_subtract;
+
+      // Subtract num_rows_to_subtract copies of pivot from row i.  Only the
+      // entries from dim need to be subtracted, as the preceding
+      // entries are all zero.
+      // If num_rows_to_subtract is negative, these copies of pivot are
+      // added to row i.
+      if (num_rows_to_subtract != 0)
+	for (dimension_type col = start; col <= end; ++col)
+	  sub_mul_assign(row[col], num_rows_to_subtract, pivot[col]);
+    }
+  }
+}
+#endif // STRONG_REDUCTION
 
-// Automatically generated from PPL source file ../src/initializer.hh line 27
+} // namespace Parma_Polyhedra_Library
 
-namespace {
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid.defs.hh line 2815
 
-Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.defs.hh line 1
+/* BD_Shape class declaration.
+*/
 
-} // namespace
 
-// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 1
-/* Saturation_Matrix class declaration.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.defs.hh line 1
+/* DB_Matrix class declaration.
 */
 
 
-// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 29
-#include <vector>
-#include <iosfwd>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.defs.hh line 1
+/* DB_Row class declaration.
+*/
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A saturation matrix.
-/*! \ingroup PPL_CXX_interface
-  A saturation matrix is used to encode the relation between the
-  generators and the constraints of a polyhedron: if a generator
-  saturates a constraint the corresponding element of the saturation
-  matrix is \f$0\f$, otherwise (i.e., if the generator satisfies but
-  does not saturate the constraint) the corresponding element is \f$1\f$.
-  \note
-  since the constraints and generators are taken from the same polyhedron
-  description, it cannot be the case that a generator <EM>violates</EM>
-  a constraint.
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ptr_Iterator.defs.hh line 1
+/* Ptr_Iterator class declaration.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 
-class Parma_Polyhedra_Library::Saturation_Matrix {
-public:
-  //! Default constructor.
-  Saturation_Matrix();
 
-  /*! \brief
-    Construct a saturation matrix with \p n_rows rows
-    and \p n_columns columns.
-  */
-  Saturation_Matrix(dimension_type n_rows, dimension_type n_columns);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ptr_Iterator.defs.hh line 27
+#include <iterator>
 
-  //! Copy-constructor.
-  Saturation_Matrix(const Saturation_Matrix& y);
+namespace Parma_Polyhedra_Library {
 
-  //! Destructor.
-  ~Saturation_Matrix();
+namespace Implementation {
 
-  //! Assignment operator.
-  Saturation_Matrix& operator=(const Saturation_Matrix& y);
+template<typename Q, typename R>
+bool operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  //! Swaps \p *this with \p y.
-  void swap(Saturation_Matrix& y);
+template<typename Q, typename R>
+bool operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  //! Subscript operator.
-  Saturation_Row& operator[](dimension_type k);
+template<typename Q, typename R>
+bool operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  //! Constant subscript operator.
-  const Saturation_Row& operator[](dimension_type k) const;
+template<typename Q, typename R>
+bool operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  //! Clears the matrix deallocating all its rows.
-  void clear();
+template<typename Q, typename R>
+bool operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  //! Transposes the matrix.
-  void transpose();
+template<typename Q, typename R>
+bool operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  //! Makes \p *this a transposed copy of \p y.
-  void transpose_assign(const Saturation_Matrix& y);
+template<typename Q, typename R>
+typename Ptr_Iterator<Q>::difference_type operator-(const Ptr_Iterator<Q>& x,
+						    const Ptr_Iterator<R>& y);
 
-  //! Returns the maximum number of rows of a Saturation_Matrix.
-  static dimension_type max_num_rows();
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+			  const Ptr_Iterator<P>& y);
 
-  //! Returns the number of columns of \p *this.
-  dimension_type num_columns() const;
+} // namespace Implementation
 
-  //! Returns the number of rows of \p *this.
-  dimension_type num_rows() const;
+} // namespace Parma_Polyhedra_Library
 
-  //! Sorts the rows and removes duplicates.
-  void sort_rows();
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+  : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+			 typename std::iterator_traits<P>::value_type,
+			 typename std::iterator_traits<P>::difference_type,
+			 typename std::iterator_traits<P>::pointer,
+			 typename std::iterator_traits<P>::reference> {
+public:
+  typedef typename std::iterator_traits<P>::difference_type difference_type;
+  typedef typename std::iterator_traits<P>::reference reference;
+  typedef typename std::iterator_traits<P>::pointer pointer;
 
-  //! Looks for \p row in \p *this, which is assumed to be sorted.
-  /*!
-    \return
-    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+  //! Default constructor: no guarantees.
+  Ptr_Iterator();
 
-    \param row
-    The row that will be searched for in the matrix.
+  //! Construct an iterator pointing at \p q.
+  explicit Ptr_Iterator(const P& q);
 
-    Given a sorted saturation matrix (this ensures better efficiency),
-    tells whether it contains the given row.
+  /*! \brief
+    Copy-constructor allowing the construction of a const_iterator
+    from a non-const iterator.
   */
-  bool sorted_contains(const Saturation_Row& row) const;
+  template<typename Q>
+  Ptr_Iterator(const Ptr_Iterator<Q>& q);
 
-  //! Adds \p row to \p *this.
-  void add_row(const Saturation_Row& row);
+  //! Dereference operator.
+  reference operator*() const;
 
-  //! Erases the rows from the \p first_to_erase -th to the last one.
-  void rows_erase_to_end(dimension_type first_to_erase);
+  //! Indirect member selector.
+  pointer operator->() const;
 
-  //! Erases the columns from the \p first_to_erase -th to the last one.
-  void columns_erase_to_end(dimension_type first_to_erase);
+  //! Subscript operator.
+  reference operator[](const difference_type m) const;
 
-  //! Resizes the matrix copying the old contents.
-  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+  //! Prefix increment operator.
+  Ptr_Iterator& operator++();
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+  //! Postfix increment operator.
+  Ptr_Iterator operator++(int);
+
+  //! Prefix decrement operator
+  Ptr_Iterator& operator--();
 
-  PPL_OUTPUT_DECLARATIONS;
+  //! Postfix decrement operator.
+  Ptr_Iterator operator--(int);
 
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
-  */
-  bool ascii_load(std::istream& s);
+  //! Assignment-increment operator.
+  Ptr_Iterator& operator+=(const difference_type m);
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  //! Assignment-decrement operator.
+  Ptr_Iterator& operator-=(const difference_type m);
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  //! Returns the difference between \p *this and \p y.
+  difference_type operator-(const Ptr_Iterator& y) const;
 
-#ifndef NDEBUG
-  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
-  bool check_sorted() const;
-#endif
+  //! Returns the sum of \p *this and \p m.
+  Ptr_Iterator operator+(const difference_type m) const;
+
+  //! Returns the difference of \p *this and \p m.
+  Ptr_Iterator operator-(const difference_type m) const;
 
 private:
-  //! Contains the rows of the matrix.
-  std::vector<Saturation_Row> rows;
+  //! The base pointer implementing the iterator.
+  P p;
 
-  //! Size of the initialized part of each row.
-  dimension_type row_size;
+  //! Returns the hidden pointer.
+  const P& base() const;
 
-  //! Ordering predicate (used when implementing the sort algorithm).
-  /*! \ingroup PPL_CXX_interface */
-  struct Saturation_Row_Less_Than {
-    bool operator()(const Saturation_Row& x, const Saturation_Row& y) const;
-  };
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-  friend
-  void Parma_Polyhedra_Library::
-  Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat);
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-};
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-namespace std {
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
-	  Parma_Polyhedra_Library::Saturation_Matrix& y);
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
 
-} // namespace std
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend typename Ptr_Iterator<Q>::difference_type
+  Parma_Polyhedra_Library::Implementation::
+  operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+#ifndef __INTEL_COMPILER
+  friend Ptr_Iterator<P>
+  Parma_Polyhedra_Library::Implementation::
+  operator+<>(typename Ptr_Iterator<P>::difference_type m,
+	      const Ptr_Iterator<P>& y);
+#endif
+};
 
-// Automatically generated from PPL source file ../src/Saturation_Matrix.inlines.hh line 1
-/* Saturation_Matrix class implementation: inline functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ptr_Iterator.inlines.hh line 1
+/* Ptr_Iterator class implementation: inline functions.
 */
 
 
@@ -14178,23754 +39595,31039 @@ void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
 
 namespace Parma_Polyhedra_Library {
 
-inline
-Saturation_Matrix::Saturation_Matrix()
-  : rows(),
-    row_size(0) {
-}
+namespace Implementation {
 
-inline dimension_type
-Saturation_Matrix::max_num_rows() {
-  return std::vector<Saturation_Row>().max_size();
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+  return p;
 }
 
+template <typename P>
 inline
-Saturation_Matrix::Saturation_Matrix(const dimension_type n_rows,
-		     const dimension_type n_columns)
-  : rows(n_rows),
-    row_size(n_columns) {
+Ptr_Iterator<P>::Ptr_Iterator()
+  : p(P()) {
 }
 
+template <typename P>
 inline
-Saturation_Matrix::Saturation_Matrix(const Saturation_Matrix& y)
-  : rows(y.rows),
-    row_size(y.row_size) {
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+  : p(q) {
 }
 
+template <typename P>
+template <typename Q>
 inline
-Saturation_Matrix::~Saturation_Matrix() {
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& y)
+  : p(y.base()) {
 }
 
-inline void
-Saturation_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
-  // The first row to be erased cannot be greater
-  // than the actual number of the rows of the matrix.
-  assert(first_to_erase <= rows.size());
-  if (first_to_erase < rows.size())
-    rows.erase(rows.begin() + first_to_erase, rows.end());
-  assert(OK());
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+  return *p;
 }
 
-inline void
-Saturation_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
-  // The first column to be erased cannot be greater
-  // than the actual number of the columns of the matrix.
-  assert(first_to_erase <= row_size);
-  row_size = first_to_erase;
-  assert(OK());
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+  return p;
 }
 
-inline void
-Saturation_Matrix::swap(Saturation_Matrix& y) {
-  std::swap(row_size, y.row_size);
-  std::swap(rows, y.rows);
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+  return p[m];
 }
 
-inline Saturation_Row&
-Saturation_Matrix::operator[](const dimension_type k) {
-  assert(k < rows.size());
-  return rows[k];
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+  ++p;
+  return *this;
 }
 
-inline const Saturation_Row&
-Saturation_Matrix::operator[](const dimension_type k) const {
-  assert(k < rows.size());
-  return rows[k];
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+  return Ptr_Iterator(p++);
 }
 
-inline dimension_type
-Saturation_Matrix::num_columns() const {
-  return row_size;
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+  --p;
+  return *this;
 }
 
-inline dimension_type
-Saturation_Matrix::num_rows() const {
-  return rows.size();
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+  return Ptr_Iterator(p--);
 }
 
-inline void
-Saturation_Matrix::clear() {
-  // Clear `rows' and minimize its capacity.
-  std::vector<Saturation_Row>().swap(rows);
-  row_size = 0;
-}
 
-inline memory_size_type
-Saturation_Matrix::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+  p += m;
+  return *this;
 }
 
-inline bool
-Saturation_Matrix::Saturation_Row_Less_Than::
-operator()(const Saturation_Row& x, const Saturation_Row& y) const {
-  return compare(x, y) < 0;
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+  p -= m;
+  return *this;
 }
 
-inline bool
-Saturation_Matrix::sorted_contains(const Saturation_Row& row) const {
-  assert(check_sorted());
-  return std::binary_search(rows.begin(), rows.end(), row,
-			    Saturation_Row_Less_Than());
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+  return p - y.p;
 }
 
-} // namespace Parma_Polyhedra_Library
-
-
-namespace std {
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+  return Ptr_Iterator(p + m);
+}
 
-/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
-inline void
-swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
-     Parma_Polyhedra_Library::Saturation_Matrix& y) {
-  x.swap(y);
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+  return Ptr_Iterator(p - m);
 }
 
-} // namespace std
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() == y.base();
+}
 
-// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 176
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() != y.base();
+}
 
-// Automatically generated from PPL source file ../src/Generator_System.defs.hh line 1
-/* Generator_System class declaration.
-*/
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() < y.base();
+}
 
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() <= y.base();
+}
 
-// Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 1
-/* Poly_Con_Relation class declaration.
-*/
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() > y.base();
+}
 
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() >= y.base();
+}
 
-// Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 28
-#include <iosfwd>
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() - y.base();
+}
 
-namespace Parma_Polyhedra_Library {
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+	  const Ptr_Iterator<P>& y) {
+  return Ptr_Iterator<P>(m + y.base());
+}
 
-// Put them in the namespace here to declare them friend later.
+} // namespace Implementation
 
-//! True if and only if \p x and \p y are logically equivalent.
-/*! \relates Poly_Con_Relation */
-bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+} // namespace Parma_Polyhedra_Library
 
-//! True if and only if \p x and \p y are not logically equivalent.
-/*! \relates Poly_Con_Relation */
-bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Ptr_Iterator.defs.hh line 172
 
-//! Yields the logical conjunction of \p x and \p y.
-/*! \relates Poly_Con_Relation */
-Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
-			     const Poly_Con_Relation& y);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.defs.hh line 29
+#include <cstddef>
+#include <vector>
 
+#ifndef PPL_DB_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \brief
-  Yields the assertion with all the conjuncts of \p x
-  that are not in \p y.
-
-  \relates Poly_Con_Relation
+  When PPL_DB_ROW_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each instance
+  of the class DB_Row carries its own capacity; this enables extra
+  consistency checks to be performed.
+  \ingroup PPL_CXX_interface
 */
-Poly_Con_Relation operator-(const Poly_Con_Relation& x,
-			    const Poly_Con_Relation& y);
-
-namespace IO_Operators {
-
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
-std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
-
-} // namespace IO_Operators
-
-} // namespace Parma_Polyhedra_Library
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_DB_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_DB_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_DB_ROW_EXTRA_DEBUG)
 
 
-//! The relation between a polyhedron and a constraint.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
 /*! \ingroup PPL_CXX_interface
-  This class implements conjunctions of assertions on the relation
-  between a polyhedron and a constraint.
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
 */
-class Parma_Polyhedra_Library::Poly_Con_Relation {
-private:
-  //! Poly_Con_Relation is implemented by means of a finite bitset.
-  typedef unsigned int flags_t;
-
-  //! \name Bit-masks for the individual assertions
-  //@{
-  static const flags_t NOTHING             = 0U;
-  static const flags_t IS_DISJOINT         = 1U << 0;
-  static const flags_t STRICTLY_INTERSECTS = 1U << 1;
-  static const flags_t IS_INCLUDED         = 1U << 2;
-  static const flags_t SATURATES           = 1U << 3;
-  //@} // Bit-masks for the individual assertions
-
-  //! All assertions together.
-  static const flags_t EVERYTHING
-  = IS_DISJOINT
-  | STRICTLY_INTERSECTS
-  | IS_INCLUDED
-  | SATURATES;
-
-  //! This holds the current bitset.
-  flags_t flags;
-
-  //! True if and only if the conjunction \p x implies the conjunction \p y.
-  static bool implies(flags_t x, flags_t y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+  //! Default constructor.
+  DB_Row_Impl_Handler();
 
-  //! Construct from a bit-mask.
-  Poly_Con_Relation(flags_t mask);
+  //! Destructor.
+  ~DB_Row_Impl_Handler();
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Poly_Con_Relation& x,
-				      const Poly_Con_Relation& y);
+  class Impl;
 
-  friend bool
-  Parma_Polyhedra_Library::operator!=(const Poly_Con_Relation& x,
-				      const Poly_Con_Relation& y);
+  //! A pointer to the actual implementation.
+  Impl* impl;
 
-  friend Poly_Con_Relation
-  Parma_Polyhedra_Library::operator&&(const Poly_Con_Relation& x,
-				      const Poly_Con_Relation& y);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 
-  friend Poly_Con_Relation
-  Parma_Polyhedra_Library::operator-(const Poly_Con_Relation& x,
-				     const Poly_Con_Relation& y);
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
 
-  friend std::ostream&
-  Parma_Polyhedra_Library::
-  IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+  //! Private and unimplemented: copy assignment is not allowed.
+  DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
 
-public:
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Access the internal flags: this is needed for some foreign
-    language interfaces.
-  */
-#endif
-  flags_t get_flags() const;
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+  The class template DB_Row<T> allows for the efficient representation of
+  the single rows of a DB_Matrix. It contains elements of type T stored
+  as a vector. The class T is a family of extended numbers that
+  must provide representation for
+  \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+  <EM>not a number</EM>, since this arises as the ``result'' of
+  undefined sums like \f$ +\infty + (-\infty) \f$).
 
-public:
-  //! The assertion that says nothing.
-  static Poly_Con_Relation nothing();
+  The class T must provide the following methods:
 
-  /*! \brief
-    The polyhedron and the set of points satisfying
-    the constraint are disjoint.
-  */
-  static Poly_Con_Relation is_disjoint();
+  \code
+    T()
+  \endcode
+  is the default constructor: no assumption is made on the particular
+  object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+  (see below).
+  \code
+    ~T()
+  \endcode
+  is the destructor.
+  \code
+    bool is_nan() const
+  \endcode
+  returns <CODE>true</CODE> if and only \p *this represents
+  the  <EM>not a number</EM> value.
+  \code
+    bool OK() const
+  \endcode
+  returns <CODE>true</CODE> if and only if \p *this satisfies all
+  its invariants.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+  //! Pre-constructs a row: construction must be completed by construct().
+  DB_Row();
 
-  /*! \brief
-    The polyhedron intersects the set of points satisfying
-    the constraint, but it is not included in it.
+  //! \name Post-constructors.
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size \p sz and minimum capacity.
   */
-  static Poly_Con_Relation strictly_intersects();
+  void construct(dimension_type sz);
 
-  /*! \brief
-    The polyhedron is included in the set of points satisfying
-    the constraint.
-  */
-  static Poly_Con_Relation is_included();
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed.
 
-  /*! \brief
-    The polyhedron is included in the set of points saturating
-    the constraint.
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity of
+    (i.e., it can contain at least) \p elements, \p sz of which
+    will be constructed now.
   */
-  static Poly_Con_Relation saturates();
+  void construct(dimension_type sz, dimension_type capacity);
 
-  PPL_OUTPUT_DECLARATIONS;
+  //! Constructs properly a conservative approximation of \p y.
+  /*!
+    \param y
+    A row containing the elements whose upward approximations will
+    be used to properly construct \p *this.
 
-  //! True if and only if \p *this implies \p y.
-  bool implies(const Poly_Con_Relation& y) const;
+    \param capacity
+    The capacity of the constructed row.
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+    It is assumed that \p capacity is greater than or equal to the
+    size of \p y.
+  */
+  template <typename U>
+  void construct_upward_approximation(const DB_Row<U>& y,
+				      dimension_type capacity);
 
-// Automatically generated from PPL source file ../src/Poly_Con_Relation.inlines.hh line 1
-/* Poly_Con_Relation class implementation: inline functions.
-*/
+  //@}
 
+  //! Tight constructor: resizing will require reallocation.
+  DB_Row(dimension_type sz);
 
-namespace Parma_Polyhedra_Library {
+  //! Sizing constructor with capacity.
+  DB_Row(dimension_type sz, dimension_type capacity);
 
-inline
-Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
-  : flags(mask) {
-}
+  //! Ordinary copy constructor.
+  DB_Row(const DB_Row& y);
 
-inline Poly_Con_Relation::flags_t
-Poly_Con_Relation::get_flags() const {
-  return flags;
-}
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  DB_Row(const DB_Row& y, dimension_type capacity);
 
-inline Poly_Con_Relation
-Poly_Con_Relation::nothing() {
-  return Poly_Con_Relation(NOTHING);
-}
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+    Any new position is initialized to \f$+\infty\f$.
+  */
+  DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
 
-inline Poly_Con_Relation
-Poly_Con_Relation::is_disjoint() {
-  return Poly_Con_Relation(IS_DISJOINT);
-}
+  //! Destructor.
+  ~DB_Row();
 
-inline Poly_Con_Relation
-Poly_Con_Relation::strictly_intersects() {
-  return Poly_Con_Relation(STRICTLY_INTERSECTS);
-}
+  //! Assignment operator.
+  DB_Row& operator=(const DB_Row& y);
 
-inline Poly_Con_Relation
-Poly_Con_Relation::is_included() {
-  return Poly_Con_Relation(IS_INCLUDED);
-}
+  //! Swaps \p *this with \p y.
+  void swap(DB_Row& y);
 
-inline Poly_Con_Relation
-Poly_Con_Relation::saturates() {
-  return Poly_Con_Relation(SATURATES);
-}
+  //! Assigns the implementation of \p y to \p *this.
+  void assign(DB_Row& y);
 
-inline bool
-Poly_Con_Relation::implies(flags_t x, flags_t y) {
-  return (x & y) == y;
-}
+  /*! \brief
+    Allocates memory for a default constructed DB_Row object,
+    allowing for \p capacity coefficients at most.
 
-inline bool
-Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
-  return implies(flags, y.flags);
-}
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the DB_Row object is zero.
+  */
+  void allocate(dimension_type capacity);
 
-/*! \relates Poly_Con_Relation */
-inline bool
-operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
-  return x.flags == y.flags;
-}
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row. The new positions are initialized
+    to \f$+\infty\f$.
+  */
+  void expand_within_capacity(dimension_type new_size);
 
-/*! \relates Poly_Con_Relation */
-inline bool
-operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
-  return x.flags != y.flags;
-}
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
 
-/*! \relates Poly_Con_Relation */
-inline Poly_Con_Relation
-operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
-  return Poly_Con_Relation(x.flags | y.flags);
-}
+  //! Returns the size() of the largest possible DB_Row.
+  static dimension_type max_size();
 
-/*! \relates Poly_Con_Relation */
-inline Poly_Con_Relation
-operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
-  return Poly_Con_Relation(x.flags & ~y.flags);
-}
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  T& operator[](dimension_type k);
 
-// Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 169
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
 
-// Automatically generated from PPL source file ../src/Generator_System.defs.hh line 35
-#include <iosfwd>
+  //! A (non const) random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<T*> iterator;
 
-namespace Parma_Polyhedra_Library {
+  //! A const random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<const T*> const_iterator;
 
-namespace IO_Operators {
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  iterator begin();
 
-//! Output operator.
-/*!
-  \relates Parma_Polyhedra_Library::Generator_System
-  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
-  \p s the generators of \p gs, all in one row and separated by ", ".
-*/
-std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+  //! Returns the past-the-end iterator.
+  iterator end();
 
-} // namespace IO_Operators
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  const_iterator begin() const;
 
-// Put it in the namespace here to declare it friend later.
-/*! \relates Polyhedron */
-bool operator==(const Polyhedron& x, const Polyhedron& y);
+  //! Returns the past-the-end const iterator.
+  const_iterator end() const;
 
-} // namespace Parma_Polyhedra_Library
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
 
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
 
-namespace std {
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Generator_System */
-void swap(Parma_Polyhedra_Library::Generator_System& x,
-	  Parma_Polyhedra_Library::Generator_System& y);
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
 
-} // namespace std
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
 
-//! A system of generators.
-/*! \ingroup PPL_CXX_interface
-    An object of the class Generator_System is a system of generators,
-    i.e., a multiset of objects of the class Generator
-    (lines, rays, points and closure points).
-    When inserting generators in a system, space dimensions are automatically
-    adjusted so that all the generators in the system are defined
-    on the same vector space.
-    A system of generators which is meant to define a non-empty
-    polyhedron must include at least one point: the reason is that
-    lines, rays and closure points need a supporting point
-    (lines and rays only specify directions while closure points only
-    specify points in the topological closure of the NNC polyhedron).
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
 
-    \par
-     In all the examples it is assumed that variables
-    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
-    \code
-  Variable x(0);
-  Variable y(1);
-    \endcode
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const DB_Row& y);
 
-    \par Example 1
-    The following code defines the line having the same direction
-    as the \f$x\f$ axis (i.e., the first Cartesian axis)
-    in \f$\Rset^2\f$:
-    \code
-  Generator_System gs;
-  gs.insert(line(x + 0*y));
-    \endcode
-    As said above, this system of generators corresponds to
-    an empty polyhedron, because the line has no supporting point.
-    To define a system of generators that does correspond to
-    the \f$x\f$ axis, we can add the following code which
-    inserts the origin of the space as a point:
-    \code
-  gs.insert(point(0*x + 0*y));
-    \endcode
-    Since space dimensions are automatically adjusted, the following
-    code obtains the same effect:
-    \code
-  gs.insert(point(0*x));
-    \endcode
-    In contrast, if we had added the following code, we would have
-    defined a line parallel to the \f$x\f$ axis through
-    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
-    \code
-  gs.insert(point(0*x + 1*y));
-    \endcode
+#if PPL_DB_ROW_EXTRA_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+};
 
-    \par Example 2
-    The following code builds a ray having the same direction as
-    the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
-    \code
-  Generator_System gs;
-  gs.insert(ray(x + 0*y));
-    \endcode
-    To define a system of generators indeed corresponding to the set
-    \f[
-      \bigl\{\,
-        (x, 0)^\transpose \in \Rset^2
-      \bigm|
-        x \geq 0
-      \,\bigr\},
-    \f]
-    one just has to add the origin:
-    \code
-  gs.insert(point(0*x + 0*y));
-    \endcode
+namespace Parma_Polyhedra_Library {
 
-    \par Example 3
-    The following code builds a system of generators having four points
-    and corresponding to a square in \f$\Rset^2\f$
-    (the same as Example 1 for the system of constraints):
-    \code
-  Generator_System gs;
-  gs.insert(point(0*x + 0*y));
-  gs.insert(point(0*x + 3*y));
-  gs.insert(point(3*x + 0*y));
-  gs.insert(point(3*x + 3*y));
-    \endcode
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
 
-    \par Example 4
-    By using closure points, we can define the \e kernel
-    (i.e., the largest open set included in a given set)
-    of the square defined in the previous example.
-    Note that a supporting point is needed and, for that purpose,
-    any inner point could be considered.
-    \code
-  Generator_System gs;
-  gs.insert(point(x + y));
-  gs.insert(closure_point(0*x + 0*y));
-  gs.insert(closure_point(0*x + 3*y));
-  gs.insert(closure_point(3*x + 0*y));
-  gs.insert(closure_point(3*x + 3*y));
-    \endcode
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 
-    \par Example 5
-    The following code builds a system of generators having two points
-    and a ray, corresponding to a half-strip in \f$\Rset^2\f$
-    (the same as Example 2 for the system of constraints):
-    \code
-  Generator_System gs;
-  gs.insert(point(0*x + 0*y));
-  gs.insert(point(0*x + 1*y));
-  gs.insert(ray(x - y));
-    \endcode
+} // namespace Parma_Polyhedra_Library
 
-    \note
-    After inserting a multiset of generators in a generator system,
-    there are no guarantees that an <EM>exact</EM> copy of them
-    can be retrieved:
-    in general, only an <EM>equivalent</EM> generator system
-    will be available, where original generators may have been
-    reordered, removed (if they are duplicate or redundant), etc.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+  The class DB_Row_Impl_Handler::Impl provides the implementation of
+  DB_Row objects and, in particular, of the corresponding memory
+  allocation functions.
 */
-class Parma_Polyhedra_Library::Generator_System : private Linear_System {
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
 public:
-  //! Default constructor: builds an empty system of generators.
-  Generator_System();
-
-  //! Builds the singleton system containing only generator \p g.
-  explicit Generator_System(const Generator& g);
-
-  //! Ordinary copy-constructor.
-  Generator_System(const Generator_System& gs);
-
-  //! Destructor.
-  ~Generator_System();
-
-  //! Assignment operator.
-  Generator_System& operator=(const Generator_System& y);
-
-  //! Returns the maximum space dimension a Generator_System can handle.
-  static dimension_type max_space_dimension();
-
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+  //! \name Custom allocator and deallocator.
+  //@{
 
   /*! \brief
-    Removes all the generators from the generator system
-    and sets its space dimension to 0.
+    Allocates a chunk of memory able to contain \p capacity T objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
   */
-  void clear();
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
 
   /*! \brief
-    Inserts in \p *this a copy of the generator \p g,
-    increasing the number of space dimensions if needed.
+    Placement version: uses the standard operator delete to free
+    the memory \p p points to.
   */
-  void insert(const Generator& g);
+  static void operator delete(void* p, dimension_type capacity);
+  //@}
 
-  /*! \brief
-    Returns the singleton system containing only
-    Generator::zero_dim_point().
+  //! Default constructor.
+  Impl();
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
   */
-  static const Generator_System& zero_dim_univ();
+  ~Impl();
 
-  //! An iterator over a system of generators
-  /*! \ingroup PPL_CXX_interface
-      A const_iterator is used to provide read-only access
-      to each generator contained in an object of Generator_System.
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
 
-      \par Example
-      The following code prints the system of generators
-      of the polyhedron <CODE>ph</CODE>:
-      \code
-  const Generator_System& gs = ph.generators();
-  for (Generator_System::const_iterator i = gs.begin(),
-         gs_end = gs.end(); i != gs_end; ++i)
-    cout << *i << endl;
-      \endcode
-      The same effect can be obtained more concisely by using
-      more features of the STL:
-      \code
-  const Generator_System& gs = ph.generators();
-  copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
-      \endcode
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
   */
-  class const_iterator
-    : public std::iterator<std::forward_iterator_tag,
-			   Generator,
-			   ptrdiff_t,
-			   const Generator*,
-			   const Generator&> {
-  public:
-    //! Default constructor.
-    const_iterator();
+  void shrink(dimension_type new_size);
 
-    //! Ordinary copy-constructor.
-    const_iterator(const const_iterator& y);
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
 
-    //! Destructor.
-    ~const_iterator();
+  /*! \brief
+    Exception-safe upward approximation construction mechanism
+    for coefficients.
+  */
+  template <typename U>
+  void construct_upward_approximation(const U& y);
 
-    //! Assignment operator.
-    const_iterator& operator=(const const_iterator& y);
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
 
-    //! Dereference operator.
-    const Generator& operator*() const;
+  //! \name Size accessors.
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
 
-    //! Indirect member selector.
-    const Generator* operator->() const;
+  //! Sets to \p new_sz the actual size of \p *this.
+  void set_size(dimension_type new_sz);
 
-    //! Prefix increment operator.
-    const_iterator& operator++();
+  //! Increments the size of \p *this by 1.
+  void bump_size();
+  //@}
 
-    //! Postfix increment operator.
-    const_iterator operator++(int);
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  T& operator[](dimension_type k);
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are identical.
-    */
-    bool operator==(const const_iterator& y) const;
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are different.
-    */
-    bool operator!=(const const_iterator& y) const;
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
 
-  private:
-    friend class Generator_System;
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
 
-    //! The const iterator over the Linear_System.
-    Linear_System::const_iterator i;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-    //! A const pointer to the Linear_System.
-    const Linear_System* gsp;
+private:
+  friend class DB_Row<T>;
 
-    //! Constructor.
-    const_iterator(const Linear_System::const_iterator& iter,
-		   const Generator_System& gsys);
+  //! The number of coefficients in the row.
+  dimension_type size_;
 
-    /*! \brief
-      \p *this skips to the next generator, skipping those
-      closure points that are immediately followed by a matching point.
-    */
-    void skip_forward();
-  };
+  //! The vector of coefficients.
+  T vec_[
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       1
+#endif
+  ];
 
-  /*! \brief
-    Returns the const_iterator pointing to the first generator,
-    if \p *this is not empty;
-    otherwise, returns the past-the-end const_iterator.
-  */
-  const_iterator begin() const;
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
 
-  //! Checks if all the invariants are satisfied.
-  /*!
-    Returns <CODE>true</CODE> if and only if \p *this is a valid
-    Linear_System and each row in the system is a valid Generator.
-  */
-  bool OK() const;
+  //! Exception-safe copy construction mechanism.
+  void copy_construct(const Impl& y);
+};
 
-  PPL_OUTPUT_DECLARATIONS;
+namespace std {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+	  Parma_Polyhedra_Library::DB_Row<T>& y);
 
-    Resizes the matrix of generators using the numbers of rows and columns
-    read from \p s, then initializes the coordinates of each generator
-    and its type reading the contents from \p s.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	       ::iterator x,
+	       typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	       ::iterator y);
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+} // namespace std
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.inlines.hh line 1
+/* DB_Row class implementation: inline functions.
+*/
 
-  //! Swaps \p *this with \p y.
-  void swap(Generator_System& y);
 
-private:
-  friend class const_iterator;
-  friend class Parma_Polyhedra_Library::Polyhedron;
-  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+#include <cassert>
+#include <algorithm>
+#include <iostream>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.inlines.hh line 30
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
-				      const Polyhedron& y);
+namespace Parma_Polyhedra_Library {
 
-  //! Builds an empty system of generators having the specified topology.
-  explicit Generator_System(Topology topol);
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+					   const dimension_type capacity) {
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+  assert(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
 
-  /*! \brief
-    Builds a system of \p n_rows rays/points on a \p n_columns - 1
-    dimensional space (including the \f$\epsilon\f$ dimension, if
-    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
-  */
-  Generator_System(Topology topol,
-		   dimension_type n_rows, dimension_type n_columns);
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
 
-  /*! \brief
-    Adjusts \p *this so that it matches the topology and
-    the number of space dimensions given as parameters
-    (adding or removing columns if needed).
-    Returns <CODE>false</CODE> if and only if \p topol is
-    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
-    contains closure points.
-  */
-  bool adjust_topology_and_space_dimension(Topology topol,
-					   dimension_type num_dimensions);
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
 
-  /*! \brief
-    For each unmatched closure point in \p *this, adds the
-    corresponding point.
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl
+::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(T)
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+    - 1*sizeof(T)
+#endif
+    + external_memory_in_bytes();
+}
 
-    It is assumed that the topology of \p *this
-    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
-  */
-  void add_corresponding_points();
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this
-    contains one or more points.
-  */
-  bool has_points() const;
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+  return size_t(-1)/sizeof(T);
+}
 
-  /*! \brief
-    For each unmatched point in \p *this, adds the corresponding
-    closure point.
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+  return size_;
+}
 
-    It is assumed that the topology of \p *this
-    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
-  */
-  void add_corresponding_closure_points();
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+  size_ = new_sz;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this
-    contains one or more closure points.
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+  ++size_;
+}
 
-    Note: the check for the presence of closure points is
-    done under the point of view of the user. Namely, we scan
-    the generator system using high-level iterators, so that
-    closure points that are matching the corresponding points
-    will be disregarded.
-  */
-  bool has_closure_points() const;
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+  : size_(0) {
+}
 
-  //! Returns the \p k- th generator of the system.
-  Generator& operator[](dimension_type k);
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+  shrink(0);
+}
 
-  //! Returns a constant reference to the \p k- th generator of the system.
-  const Generator& operator[](dimension_type k) const;
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+  : impl(0) {
+#if PPL_DB_ROW_EXTRA_DEBUG
+  capacity_ = 0;
+#endif
+}
 
-  /*! \brief
-    Returns the relations holding between the generator system
-    and the constraint \p c.
-  */
-  Parma_Polyhedra_Library::Poly_Con_Relation
-  relation_with(const Constraint& c) const;
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+  delete impl;
+}
 
-  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
-  bool satisfied_by_all_generators(const Constraint& c) const;
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+  assert(k < size());
+  return vec_[k];
+}
 
-  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
-  /*!
-    It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
-  */
-  bool satisfied_by_all_generators_C(const Constraint& c) const;
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+  assert(k < size());
+  return vec_[k];
+}
 
-  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
-  /*!
-    It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
-  */
-  bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+  return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
 
-  //! Assigns to a given variable an affine expression.
-  /*!
-    \param v
-    Index of the column to which the affine transformation is assigned;
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+  return this->impl->size();
+}
 
-    \param expr
-    The numerator of the affine transformation:
-    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+#if PPL_DB_ROW_EXTRA_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+  return this->capacity_;
+}
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 
-    \param denominator
-    The denominator of the affine transformation.
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+  : DB_Row_Impl_Handler<T>() {
+}
 
-    We want to allow affine transformations (see the Introduction) having
-    any rational coefficients. Since the coefficients of the
-    constraints are integers we must also provide an integer \p denominator
-    that will be used as denominator of the affine transformation.
-    The denominator is required to be a positive integer.
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       const
+#endif
+	       dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  assert(capacity <= max_size());
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  assert(x.impl == 0);
+  x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if PPL_DB_ROW_EXTRA_DEBUG
+  assert(x.capacity_ == 0);
+  x.capacity_ = capacity;
+#endif
+}
 
-    The affine transformation assigns to each element of \p v -th
-    column the follow expression:
-    \f[
-      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
-           {\mathrm{denominator}}.
-    \f]
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  assert(x.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  assert(new_size <= x.capacity_);
+#endif
+  x.impl->expand_within_capacity(new_size);
+}
 
-    \p expr is a constant parameter and unaltered by this computation.
-  */
-  void affine_image(dimension_type v,
-		    const Linear_Expression& expr,
-		    Coefficient_traits::const_reference denominator);
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+  DB_Row<T>& x = *this;
+  assert(x.impl && y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  assert(y.size() <= x.capacity_);
+#endif
+  x.impl->copy_construct_coefficients(*(y.impl));
+}
 
-  //! Returns the number of lines of the system.
-  dimension_type num_lines() const;
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+					  const dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  assert(y.impl);
+  x.impl->construct_upward_approximation(*(y.impl));
+}
 
-  //! Returns the number of rays of the system.
-  dimension_type num_rays() const;
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+		     const dimension_type capacity) {
+  assert(sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  expand_within_capacity(sz);
+}
 
-  //! Removes all the invalid lines and rays.
-  /*!
-    The invalid lines and rays are those with all
-    the homogeneous terms set to zero.
-  */
-  void remove_invalid_lines_and_rays();
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+  construct(sz, sz);
+}
 
-  /*! \brief
-    Applies Gaussian's elimination and back-substitution so as
-    to provide a partial simplification of the system of generators.
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+		  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  construct(sz, capacity);
+}
 
-    It is assumed that the system has no pending generators.
-  */
-  void simplify();
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+  construct(sz);
+}
 
-  /*! \brief
-    Inserts in \p *this a copy of the generator \p g,
-    increasing the number of space dimensions if needed.
-    It is a pending generator.
-  */
-  void insert_pending(const Generator& g);
-};
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+  : DB_Row_Impl_Handler<T>() {
+  if (y.impl) {
+    allocate(compute_capacity(y.size(), max_size()));
+    copy_construct_coefficients(y);
+  }
+}
 
-// Generator_System.inlines.hh is not included here on purpose.
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+		  const	dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  assert(y.impl);
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+}
 
-// Automatically generated from PPL source file ../src/Grid_Generator_System.defs.hh line 1
-/* Grid_Generator_System class declaration.
-*/
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+		  const dimension_type sz,
+		  const	dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  assert(y.impl);
+  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
 
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
 
-// Automatically generated from PPL source file ../src/Grid_Generator_System.defs.hh line 30
-#include <iosfwd>
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  assert(x.impl);
+  x.impl->shrink(new_size);
+}
 
-namespace Parma_Polyhedra_Library {
+template <typename T>
+inline void
+DB_Row<T>::swap(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  std::swap(x.impl, y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  std::swap(x.capacity_, y.capacity_);
+#endif
+}
 
-namespace IO_Operators {
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  x.impl = y.impl;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  x.capacity_ = y.capacity_;
+#endif
+}
 
-//! Output operator.
-/*!
-  \relates Parma_Polyhedra_Library::Grid_Generator_System
-  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
-  \p s the generators of \p gs, all in one row and separated by ", ".
-*/
-std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+  // Copy-construct `tmp' from `y'.
+  DB_Row tmp(y);
+  // Swap the implementation of `*this' with the one of `tmp'.
+  swap(tmp);
+  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+  return *this;
+}
 
-} // namespace IO_Operators
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+  DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
-/*! \relates Grid_Generator_System */
-bool operator==(const Grid_Generator_System& x,
-		const Grid_Generator_System& y);
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+  const DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
 
-} // namespace Parma_Polyhedra_Library
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_);
+}
 
-namespace std {
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_ + x.impl->size_);
+}
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
-void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
-	  Parma_Polyhedra_Library::Grid_Generator_System& y);
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_);
+}
 
-} // namespace std
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_ + x.impl->size_);
+}
 
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes(dimension_type capacity) const {
+  const DB_Row<T>& x = *this;
+  return x.impl->total_memory_in_bytes(capacity);
+}
 
-//! A system of grid generators.
-/*! \ingroup PPL_CXX_interface
-    An object of the class Grid_Generator_System is a system of
-    grid generators, i.e., a multiset of objects of the class
-    Grid_Generator (lines, parameters and points).
-    When inserting generators in a system, space dimensions are
-    automatically adjusted so that all the generators in the system
-    are defined on the same vector space.
-    A system of grid generators which is meant to define a non-empty
-    grid must include at least one point: the reason is that
-    lines and parameters need a supporting point
-    (lines only specify directions while parameters only
-    specify direction and distance.
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
 
-    \par
-     In all the examples it is assumed that variables
-    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
-    \code
-  Variable x(0);
-  Variable y(1);
-    \endcode
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes() const {
+  const DB_Row<T>& x = *this;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  return x.impl->total_memory_in_bytes(x.capacity_);
+#else
+  return x.impl->total_memory_in_bytes();
+#endif
+}
 
-    \par Example 1
-    The following code defines the line having the same direction
-    as the \f$x\f$ axis (i.e., the first Cartesian axis)
-    in \f$\Rset^2\f$:
-    \code
-  Grid_Generator_System gs;
-  gs.insert(grid_line(x + 0*y));
-    \endcode
-    As said above, this system of generators corresponds to
-    an empty grid, because the line has no supporting point.
-    To define a system of generators that does correspond to
-    the \f$x\f$ axis, we can add the following code which
-    inserts the origin of the space as a point:
-    \code
-  gs.insert(grid_point(0*x + 0*y));
-    \endcode
-    Since space dimensions are automatically adjusted, the following
-    code obtains the same effect:
-    \code
-  gs.insert(grid_point(0*x));
-    \endcode
-    In contrast, if we had added the following code, we would have
-    defined a line parallel to the \f$x\f$ axis through
-    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
-    \code
-  gs.insert(grid_point(0*x + 1*y));
-    \endcode
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-    \par Example 2
-    The following code builds a system of generators corresponding
-    to the grid consisting of all the integral points on the \f$x\f$ axes;
-    that is, all points satisfying the congruence relation
-    \f[
-      \bigl\{\,
-        (x, 0)^\transpose \in \Rset^2
-      \bigm|
-        x \pmod{1}\ 0
-      \,\bigr\},
-    \f]
-    \code
-  Grid_Generator_System gs;
-  gs.insert(parameter(x + 0*y));
-  gs.insert(grid_point(0*x + 0*y));
-    \endcode
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+  return !(x == y);
+}
 
-    \par Example 3
-    The following code builds a system of generators having three points
-    corresponding to a non-relational grid consisting of all points
-    whose coordinates are integer multiple of 3.
-    \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*x + 0*y));
-  gs.insert(grid_point(0*x + 3*y));
-  gs.insert(grid_point(3*x + 0*y));
-    \endcode
+} // namespace Parma_Polyhedra_Library
 
-    \par Example 4
-    By using parameters instead of two of the points we
-    can define the same grid as that defined in the previous example.
-    Note that there has to be at least one point and, for this purpose,
-    any point in the grid could be considered.
-    Thus the following code builds two identical grids from the
-    grid generator systems \p gs and \p gs1.
-    \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*x + 0*y));
-  gs.insert(parameter(0*x + 3*y));
-  gs.insert(parameter(3*x + 0*y));
-  Grid_Generator_System gs1;
-  gs1.insert(grid_point(3*x + 3*y));
-  gs1.insert(parameter(0*x + 3*y));
-  gs1.insert(parameter(3*x + 0*y));
-    \endcode
 
-    \par Example 5
-    The following code builds a system of generators having one point and
-    a parameter corresponding to all the integral points that
-    lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
-    \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(1*x + 1*y));
-  gs.insert(parameter(1*x - 1*y));
-    \endcode
+namespace std {
 
-    \note
-    After inserting a multiset of generators in a grid generator system,
-    there are no guarantees that an <EM>exact</EM> copy of them
-    can be retrieved:
-    in general, only an <EM>equivalent</EM> grid generator system
-    will be available, where original generators may have been
-    reordered, removed (if they are duplicate or redundant), etc.
-*/
-class Parma_Polyhedra_Library::Grid_Generator_System
-  : private Generator_System {
-public:
-  // FIXME: Add wrappers of any other public Generator_System methods.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+     Parma_Polyhedra_Library::DB_Row<T>& y) {
+  x.swap(y);
+}
 
-  //! Default constructor: builds an empty system of generators.
-  Grid_Generator_System();
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	  ::iterator x,
+	  typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	  ::iterator y) {
+  swap(*x, *y);
+}
 
-  //! Ordinary copy-constructor.
-  Grid_Generator_System(const Grid_Generator_System& gs);
+} // namespace std
 
-  //! Builds an empty system of generators of dimension \p dim.
-  explicit Grid_Generator_System(dimension_type dim);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.templates.hh line 1
+/* DB_Row class implementation: non-inline template functions.
+*/
 
-  //! Builds the singleton system containing only generator \p g.
-  explicit Grid_Generator_System(const Grid_Generator& g);
 
-  //! Returns the maximum space dimension a Grid_Generator_System can handle.
-  static dimension_type max_space_dimension();
+namespace Parma_Polyhedra_Library {
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    construct(vec_[i], y[i], ROUND_UP);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      construct(vec_[i], y[i], ROUND_UP);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+}
 
-  /*! \brief
-    Removes all the generators from the generator system and sets its
-    space dimension to 0.
-  */
-  void clear();
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  assert(size() <= new_size && new_size <= max_size());
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // vec_[0] is already constructed.
+  if (size() == 0 && new_size > 0)
+    bump_size();
+#endif
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED);
+    bump_size();
+  }
+}
 
-  /*! \brief
-    Inserts into \p *this a copy of the generator \p g, increasing the
-    number of space dimensions if needed.
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  assert(new_size <= old_size);
+  // Since ~T() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~T();
+}
 
-    If \p g is an all-zero parameter then the only action is to ensure
-    that the space dimension of \p *this is at least the space
-    dimension of \p g.
-  */
-  void insert(const Grid_Generator& g);
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) T(y.vec_[i]);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) T(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+}
 
-  /*! \brief
-    Inserts into \p *this the generator \p g, increasing the number of
-    space dimensions if needed.
-  */
-  void recycling_insert(Grid_Generator& g);
+template <typename T>
+memory_size_type
+DB_Row_Impl_Handler<T>::Impl::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += Parma_Polyhedra_Library::external_memory_in_bytes(vec_[i]);
+  return n;
+}
 
-  /*! \brief
-    Inserts into \p *this the generators in \p gs, increasing the
-    number of space dimensions if needed.
-  */
-  void recycling_insert(Grid_Generator_System& gs);
+template <typename T>
+bool
+DB_Row<T>::OK(const dimension_type row_size,
+	      const dimension_type
+#if PPL_DB_ROW_EXTRA_DEBUG
+	      row_capacity
+#endif
+	      ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
 
-  //! An iterator over a system of grid generators
-  /*! \ingroup PPL_CXX_interface
-    A const_iterator is used to provide read-only access
-    to each generator contained in an object of Grid_Generator_System.
+  const DB_Row<T>& x = *this;
+  bool is_broken = false;
 
-    \par Example
-    The following code prints the system of generators
-    of the grid <CODE>gr</CODE>:
-    \code
-  const Grid_Generator_System& gs = gr.generators();
-  for (Grid_Generator_System::const_iterator i = gs.begin(),
-        gs_end = gs.end(); i != gs_end; ++i)
-    cout << *i << endl;
-    \endcode
-    The same effect can be obtained more concisely by using
-    more features of the STL:
-    \code
-  const Generator_System& gs = gr.generators();
-  copy(gs.begin(), gs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
-    \endcode
-  */
-  class const_iterator
-    : public std::iterator<std::forward_iterator_tag,
-			   Grid_Generator,
-			   ptrdiff_t,
-			   const Grid_Generator*,
-			   const Grid_Generator&>,
-      private Generator_System::const_iterator {
-  public:
-    //! Default constructor.
-    const_iterator();
+#if PPL_DB_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (x.capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+	 << endl;
+    is_broken = true;
+  }
+  else if (x.capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (x.capacity_ != row_capacity) {
+    cerr << "DB_Row capacity mismatch: is " << x.capacity_
+	 << ", should be " << row_capacity << "."
+	 << endl;
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 
-    //! Ordinary copy-constructor.
-    const_iterator(const const_iterator& y);
+  if (x.size() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Row size mismatch: is " << x.size()
+	 << ", should be " << row_size << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
 
-    //! Destructor.
-    ~const_iterator();
+#if PPL_DB_ROW_EXTRA_DEBUG
+  if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+	 << ", size is " << x.size() << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
 
-    //! Assignment operator.
-    const_iterator& operator=(const const_iterator& y);
+  for (dimension_type i = x.size(); i-- > 0; ) {
+    const T& element = x[i];
+    // Not OK is bad.
+    if (!element.OK()) {
+      is_broken = true;
+      break;
+    }
+    // In addition, nans should never occur.
+    if (is_not_a_number(element)) {
+#ifndef NDEBUG
+      cerr << "Not-a-number found in DB_Row."
+	   << endl;
+#endif
+      is_broken = true;
+      break;
+    }
+  }
 
-    //! Dereference operator.
-    const Grid_Generator& operator*() const;
+  return !is_broken;
+}
 
-    //! Indirect member selector.
-    const Grid_Generator* operator->() const;
+/*! \relates DB_Row */
+template <typename T>
+bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+  if (x.size() != y.size())
+    return false;
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
 
-    //! Prefix increment operator.
-    const_iterator& operator++();
+} // namespace Parma_Polyhedra_Library
 
-    //! Postfix increment operator.
-    const_iterator operator++(int);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Row.defs.hh line 473
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if \p *this and \p y are
-      identical.
-    */
-    bool operator==(const const_iterator& y) const;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.defs.hh line 31
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if \p *this and \p y are
-      different.
-    */
-    bool operator!=(const const_iterator& y) const;
+namespace Parma_Polyhedra_Library {
 
-  private:
-    friend class Grid_Generator_System;
+namespace IO_Operators {
 
-    //! Copy-constructor from Generator_System::const_iterator.
-    const_iterator(const Generator_System::const_iterator& y);
-  };
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
 
-  /*! \brief
-    Returns the const_iterator pointing to the first generator, if \p
-    *this is not empty; otherwise, returns the past-the-end
-    const_iterator.
-  */
-  const_iterator begin() const;
+} // namespace IO_Operators
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+} // namespace Parma_Polyhedra_Library
 
-  //! Swaps \p *this with \p y.
-  void swap(Grid_Generator_System& y);
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+  The template class DB_Matrix<T> allows for the representation of
+  a square matrix of T objects.
+  Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+  //! Returns the maximum number of rows a DB_Matrix can handle.
+  static dimension_type max_num_rows();
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  //! Returns the maximum number of columns a DB_Matrix can handle.
+  static dimension_type max_num_columns();
 
-  //! Assigns to a given variable an affine expression.
+  //! Builds an empty matrix.
   /*!
-    \param v
-    Index of the column to which the affine transformation is assigned;
-
-    \param expr
-    The numerator of the affine transformation:
-    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+    DB_Rows' size and capacity are initialized to \f$0\f$.
+  */
+  DB_Matrix();
 
-    \param denominator
-    The denominator of the affine transformation;
+  //! Builds a square matrix having the specified dimension.
+  explicit DB_Matrix(dimension_type n_rows);
 
-    We allow affine transformations (see the Section \ref
-    rational_grid_operations)to have rational
-    coefficients. Since the coefficients of linear expressions are
-    integers we also provide an integer \p denominator that will
-    be used as denominator of the affine transformation.  The
-    denominator is required to be a positive integer and its
-    default value is 1.
+  //! Copy-constructor.
+  DB_Matrix(const DB_Matrix& y);
 
-    The affine transformation assigns to each element of \p v -th
-    column the follow expression:
-    \f[
-      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
-           {\mathrm{denominator}}.
-    \f]
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit DB_Matrix(const DB_Matrix<U>& y);
 
-    \p expr is a constant parameter and unaltered by this computation.
-  */
-  void affine_image(dimension_type v,
-		    const Linear_Expression& expr,
-		    Coefficient_traits::const_reference denominator);
+  //! Destructor.
+  ~DB_Matrix();
 
-  //! Returns the number of generators in the system.
-  dimension_type num_generators() const;
+  //! Assignment operator.
+  DB_Matrix& operator=(const DB_Matrix& y);
 
-  //! Returns the number of parameters in the system.
-  dimension_type num_parameters() const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A read-only iterator over the rows of the matrix.
+  /*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  class const_iterator {
+  private:
+    typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
 
-  //! Returns the number of lines in the system.
-  dimension_type num_lines() const;
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef typename std::iterator_traits<Iter>::value_type value_type;
+    typedef typename std::iterator_traits<Iter>::difference_type
+    difference_type;
+    typedef typename std::iterator_traits<Iter>::pointer pointer;
+    typedef typename std::iterator_traits<Iter>::reference reference;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this contains one or
-    more points.
-  */
-  bool has_points() const;
+    //! Default constructor.
+    const_iterator();
 
-  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
-  bool is_equal_to(const Grid_Generator_System y) const;
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
 
-  //! Returns the \p k- th generator of the system.
-  Grid_Generator& operator[](dimension_type k);
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
 
-  //! Returns a constant reference to the \p k- th generator of the system.
-  const Grid_Generator& operator[](dimension_type k) const;
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
 
-  PPL_OUTPUT_DECLARATIONS;
+    //! Dereference operator.
+    reference operator*() const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns
-    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    //! Indirect member selector.
+    pointer operator->() const;
 
-    Resizes the matrix of generators using the numbers of rows and columns
-    read from \p s, then initializes the coordinates of each generator
-    and its type reading the contents from \p s.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+    //! Prefix increment operator.
+    const_iterator& operator++();
 
-  //! Checks if all the invariants are satisfied.
-  /*!
-    Returns <CODE>true</CODE> if and only if \p *this is a valid
-    Linear_System and each row in the system is a valid Grid_Generator.
-  */
-  bool OK() const;
+    //! Postfix increment operator.
+    const_iterator operator++(int);
 
-  /*! \brief
-    Adds \p dims rows and \p dims columns of zeroes to the matrix,
-    initializing the added rows as in the universe system.
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
 
-    \param dims
-    The number of rows and columns to be added: must be strictly
-    positive.
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
 
-    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
-    \times (c+dims)\f$ matrix \f$\bigl({A \atop 0}{0 \atop B}\bigr)\f$
-    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the
-    form \f$\bigl({1 \atop 0}{0 \atop 1}\bigr)\f$.  The matrix is
-    expanded avoiding reallocation whenever possible.
+  /*! \brief
+    Returns the const_iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
   */
-  void add_universe_rows_and_columns(dimension_type dims);
+  const_iterator begin() const;
 
-  //! Removes all the specified dimensions from the generator system.
-  /*!
-    \exception std::invalid_argument
-    Thrown if the highest space dimension of the variables in \p
-    to_be_removed is higher than the space dimension of \p *this.
-  */
-  void remove_space_dimensions(const Variables_Set& to_be_removed);
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
 
-  /*! \brief
-    Removes the higher dimensions of the system so that the resulting
-    system will have dimension \p new_dimension.
+private:
+  template <typename U> friend class DB_Matrix;
 
-    \exception std::invalid_argument
-    Thrown if the \p new_dimension is higher than the space dimension
-    of \p *this.
-  */
-  void remove_higher_space_dimensions(dimension_type new_dimension);
+  //! The rows of the matrix.
+  std::vector<DB_Row<T> > rows;
 
-private:
-  friend bool operator==(const Grid_Generator_System& x,
-			 const Grid_Generator_System& y);
-  // FIXME: The following friend declaration grants Grid::conversion
-  //        access to Matrix (for the Grid::reduce_reduced call) and
-  //        Matrix::resize_no_copy, and the following methods.
-  friend class Grid;
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
 
-  //! Sets the sortedness flag of the system to \p b.
-  void set_sorted(bool b);
+  /*! \brief
+    Capacity allocated for each row, i.e., number of
+    <CODE>long</CODE> objects that each row can contain.
+  */
+  dimension_type row_capacity;
 
-  //! Sets the index to indicate that the system has no pending rows.
-  void unset_pending_rows();
+public:
+  //! Swaps \p *this with \p y.
+  void swap(DB_Matrix& y);
 
-  //! Sets the index of the first pending row to \p i.
-  void set_index_first_pending_row(dimension_type i);
 
-  //! Resizes the system without worrying about the old contents.
+  //! Makes the matrix grow by adding more rows and more columns.
   /*!
     \param new_n_rows
-    The number of rows of the resized system;
-
-    \param new_n_columns
-    The number of columns of the resized system.
-
-    The system is expanded to the specified dimensions avoiding
-    reallocation whenever possible.
-    The contents of the original system is lost.
-  */
-  void resize_no_copy(dimension_type new_n_rows,
-		      dimension_type new_n_columns);
-
-  /*! \brief
-    Returns the number of columns of the matrix (i.e., the size of the
-    rows).
-  */
-  dimension_type num_columns() const;
+    The number of rows and columns of the resized matrix.
 
-  /*! \brief
-    Erases from the matrix all the rows but those having an index less
-    than \p first_to_erase.
+    A new matrix, with the specified dimension, is created.
+    The contents of the old matrix are copied in the upper, left-hand
+    corner of the new matrix, which is then assigned to \p *this.
   */
-  void erase_to_end(dimension_type first_to_erase);
+  void grow(dimension_type new_n_rows);
 
-  //! Permutes the columns of the matrix.
-  /*
-    \param cycles
-    A vector representing the non-trivial cycles of the permutation
-    according to which the columns must be rearranged.
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
 
-    The \p cycles vector contains, one after the other, the
-    non-trivial cycles (i.e., the cycles of length greater than one)
-    of a permutation of non-zero column indexes.  Each cycle is
-    terminated by zero.  For example, assuming the matrix has 6
-    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
-    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
-    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
-    turn can be represented by a vector of 6 elements containing 1, 3,
-    6, 0, 2, 4, 0.
+    A new matrix, with the specified dimension, is created without copying
+    the content of the old matrix and assigned to \p *this.
   */
-  void permute_columns(const std::vector<dimension_type>& cycles);
-};
-
-// Grid_Generator_System.inlines.hh is not included here on purpose.
-
-// Automatically generated from PPL source file ../src/Congruence_System.defs.hh line 1
-/* Congruence_System class declaration.
-*/
-
-
-// Automatically generated from PPL source file ../src/Congruence_System.defs.hh line 33
-#include <iosfwd>
+  void resize_no_copy(dimension_type new_n_rows);
 
-namespace Parma_Polyhedra_Library {
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
 
-namespace IO_Operators {
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  DB_Row<T>& operator[](dimension_type k);
 
-//! Output operator.
-/*!
-  \relates Parma_Polyhedra_Library::Congruence_System
-  Writes <CODE>true</CODE> if \p cgs is empty.  Otherwise, writes on
-  \p s the congruences of \p cgs, all in one row and separated by ", ".
-*/
-std::ostream&
-operator<<(std::ostream& s, const Congruence_System& cgs);
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const DB_Row<T>& operator[](dimension_type k) const;
+  //@}
 
-} // namespace IO_Operators
+  PPL_OUTPUT_DECLARATIONS
 
-// Put this in the namespace here to declare it a friend later.
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
-/*! \relates Congruence_System */
-bool
-operator==(const Congruence_System& x, const Congruence_System& y);
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
 
 namespace std {
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 //! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Congruence_System */
-void
-swap(Parma_Polyhedra_Library::Congruence_System& x,
-     Parma_Polyhedra_Library::Congruence_System& y);
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+	  Parma_Polyhedra_Library::DB_Matrix<T>& y);
 
 } // namespace std
 
-//! A system of congruences.
-/*! \ingroup PPL_CXX_interface
-    An object of the class Congruence_System is a system of congruences,
-    i.e., a multiset of objects of the class Congruence.
-    When inserting congruences in a system, space dimensions are
-    automatically adjusted so that all the congruences in the system
-    are defined on the same vector space.
-
-    \par
-    In all the examples it is assumed that variables
-    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
-    \code
-  Variable x(0);
-  Variable y(1);
-    \endcode
-
-    \par Example 1
-    The following code builds a system of congruences corresponding to
-    an integer grid in \f$\Rset^2\f$:
-    \code
-  Congruence_System cgs;
-  cgs.insert(x %= 0);
-  cgs.insert(y %= 0);
-    \endcode
-    Note that:
-    the congruence system is created with space dimension zero;
-    the first and second congruence insertions increase the space
-    dimension to \f$1\f$ and \f$2\f$, respectively.
-
-    \par Example 2
-    By adding to the congruence system of the previous example,
-    the congruence \f$x + y = 1 \pmod{2}\f$:
-    \code
-  cgs.insert((x + y %= 1) / 2);
-    \endcode
-    we obtain the grid containing just those integral
-    points where the sum of the \p x and \p y values is odd.
-
-    \par Example 3
-    The following code builds a system of congruences corresponding to
-    the grid in \f$\Zset^2\f$ containing just the integral points on
-    the \p x axis:
-    \code
-  Congruence_System cgs;
-  cgs.insert(x %= 0);
-  cgs.insert((y %= 0) / 0);
-    \endcode
-
-    \note
-    After inserting a multiset of congruences in a congruence system,
-    there are no guarantees that an <EM>exact</EM> copy of them
-    can be retrieved:
-    in general, only an <EM>equivalent</EM> congruence system
-    will be available, where original congruences may have been
-    reordered, removed (if they are trivial, duplicate or
-    implied by other congruences), linearly combined, etc.
-*/
-class Parma_Polyhedra_Library::Congruence_System : private Matrix {
-public:
-  //! Default constructor: builds an empty system of congruences.
-  Congruence_System();
-
-  //! Builds the singleton system containing only congruence \p cg.
-  explicit Congruence_System(const Congruence& cg);
-
-  /*! \brief
-    If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
-    singleton system containing only constraint \f$ e_1 = e_2
-    \pmod{0}\f$.
 
-    \exception std::invalid_argument
-    Thrown if \p c is not an equality constraint.
-  */
-  explicit Congruence_System(const Constraint& c);
+namespace Parma_Polyhedra_Library {
 
-  //! Builds a system containing copies of any equalities in \p cs.
-  explicit Congruence_System(const Constraint_System& cs);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
 
-  //! Ordinary copy-constructor.
-  Congruence_System(const Congruence_System& cgs);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
 
-  //! Destructor.
-  ~Congruence_System();
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
 
-  //! Assignment operator.
-  Congruence_System& operator=(const Congruence_System& cgs);
+  The direction of the approximation is specified by \p dir.
 
-  //! Returns the maximum space dimension a Congruence_System can handle.
-  static dimension_type max_space_dimension();
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const DB_Matrix<T>& x,
+				 const DB_Matrix<T>& y,
+				 Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is exactly equal
-    to \p cgs.
-  */
-  bool is_equal_to(const Congruence_System& cgs) const;
+  The direction of the approximation is specified by \p dir.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this contains one or
-    more linear equalities.
-  */
-  bool has_linear_equalities() const;
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const DB_Matrix<T>& x,
+			       const DB_Matrix<T>& y,
+			       Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
 
-  //! Removes all the congruences and sets the space dimension to 0.
-  void clear();
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
 
-  /*! \brief
-    Inserts in \p *this a copy of the congruence \p cg, increasing the
-    number of space dimensions if needed.
+  The direction of the approximation is specified by \p dir.
 
-    The copy of \p cg will be strongly normalized after being
-    inserted.
-  */
-  void insert(const Congruence& cg);
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const DB_Matrix<T>& x,
+				 const DB_Matrix<T>& y,
+				 Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
 
-  /*! \brief
-    Inserts in \p *this a copy of the equality constraint \p c, seen
-    as a modulo 0 congruence, increasing the number of space
-    dimensions if needed.
+} // namespace Parma_Polyhedra_Library
 
-    The modulo 0 congruence will be strongly normalized after being
-    inserted.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.inlines.hh line 1
+/* DB_Matrix class implementation: inline functions.
+*/
 
-    \exception std::invalid_argument
-    Thrown if \p c is a relation.
-  */
-  void insert(const Constraint& c);
 
-  // TODO: Consider adding a recycling_insert(cg).
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.inlines.hh line 29
+#include <cassert>
+#include <iostream>
 
-  /*! \brief
-    Inserts in \p *this a copy of the congruences in \p cgs,
-    increasing the number of space dimensions if needed.
+namespace Parma_Polyhedra_Library {
 
-    The inserted copies will be strongly normalized.
-  */
-  void insert(const Congruence_System& cgs);
+template <typename T>
+inline void
+DB_Matrix<T>::swap(DB_Matrix& y) {
+  std::swap(rows, y.rows);
+  std::swap(row_size, y.row_size);
+  std::swap(row_capacity, y.row_capacity);
+}
 
-  /*! \brief
-    Inserts into \p *this the congruences in \p cgs, increasing the
-    number of space dimensions if needed.
-  */
-  void recycling_insert(Congruence_System& cgs);
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+  return std::vector<DB_Row<T> >().max_size();
+}
 
-  //! Returns the system containing only Congruence::zero_dim_false().
-  static const Congruence_System& zero_dim_empty();
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+  return DB_Row<T>::max_size();
+}
 
-  //! An iterator over a system of congruences.
-  /*! \ingroup PPL_CXX_interface
-    A const_iterator is used to provide read-only access
-    to each congruence contained in an object of Congruence_System.
+template <typename T>
+inline memory_size_type
+DB_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-    \par Example
-    The following code prints the system of congruences
-    defining the grid <CODE>gr</CODE>:
-    \code
-  const Congruence_System& cgs = gr.congruences();
-  for (Congruence_System::const_iterator i = cgs.begin(),
-         cgs_end = cgs.end(); i != cgs_end; ++i)
-    cout << *i << endl;
-    \endcode
-  */
-  class const_iterator
-    : public std::iterator<std::forward_iterator_tag,
-			   Congruence,
-			   ptrdiff_t,
-			   const Congruence*,
-			   const Congruence&> {
-  public:
-    //! Default constructor.
-    const_iterator();
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+  : i(Iter()) {
+}
 
-    //! Ordinary copy-constructor.
-    const_iterator(const const_iterator& y);
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
 
-    //! Destructor.
-    ~const_iterator();
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
 
-    //! Assignment operator.
-    const_iterator& operator=(const const_iterator& y);
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
 
-    //! Dereference operator.
-    const Congruence& operator*() const;
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+  return *i;
+}
 
-    //! Indirect member selector.
-    const Congruence* operator->() const;
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+  return &*i;
+}
 
-    //! Prefix increment operator.
-    const_iterator& operator++();
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
 
-    //! Postfix increment operator.
-    const_iterator operator++(int);
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if \p *this and \p y are
-      identical.
-    */
-    bool operator==(const const_iterator& y) const;
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if \p *this and \p y are
-      different.
-    */
-    bool operator!=(const const_iterator& y) const;
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
 
-  private:
-    friend class Congruence_System;
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+  return const_iterator(rows.begin());
+}
 
-    //! The const iterator over the matrix of congruences.
-    Matrix::const_iterator i;
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+  return const_iterator(rows.end());
+}
 
-    //! A const pointer to the matrix of congruences.
-    const Matrix* csp;
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
 
-    //! Constructor.
-    const_iterator(const Matrix::const_iterator& iter,
-		   const Congruence_System& cgs);
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
 
-    //! \p *this skips to the next non-trivial congruence.
-    void skip_forward();
-  };
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
 
-  /*! \brief
-    Returns the const_iterator pointing to the first congruence, if \p
-    *this is not empty; otherwise, returns the past-the-end
-    const_iterator.
-  */
-  const_iterator begin() const;
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+  return rows.size();
+}
 
-  //! Checks if all the invariants are satisfied.
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*!
-    Returns <CODE>true</CODE> if and only if \p *this is a valid
-    Matrix, each row in the system is a valid Congruence and the
-    number of columns is consistent with the number of congruences.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool OK() const;
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
 
-  PPL_OUTPUT_DECLARATIONS;
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns
-    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const DB_Matrix<T>& x,
+		    const DB_Matrix<T>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_num_rows; i-- > 0; ) {
+    const DB_Row<T>& x_i = x[i];
+    const DB_Row<T>& y_i = y[i];
+    for (dimension_type j = x_num_rows; j-- > 0; ) {
+      const T& x_i_j = x_i[j];
+      const T& y_i_j = y_i[j];
+      if (is_plus_infinity(x_i_j)) {
+	if (is_plus_infinity(y_i_j))
+	  continue;
+	else {
+	pinf:
+	  assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+	  return true;
+	}
+      }
+      else if (is_plus_infinity(y_i_j))
+	goto pinf;
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i_j > y_i_j) {
+	maybe_assign(tmp1p, tmp1, x_i_j, dir);
+	maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i_j, dir);
+	maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const DB_Matrix<T>& x,
+			    const DB_Matrix<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+								    dir,
+								    tmp0,
+								    tmp1,
+								    tmp2);
+}
 
-  //! Returns the number of equalities.
-  dimension_type num_equalities() const;
 
-  //! Returns the number of proper congruences.
-  dimension_type num_proper_congruences() const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const DB_Matrix<T>& x,
+			  const DB_Matrix<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+								  dir,
+								  tmp0,
+								  tmp1,
+								  tmp2);
+}
 
-  //! Swaps \p *this with \p y.
-  void swap(Congruence_System& cgs);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const DB_Matrix<T>& x,
+			   const DB_Matrix<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+								   dir,
+								   tmp0,
+								   tmp1,
+								   tmp2);
+}
 
-  /*! \brief
-    Adds \p dims rows and \p dims columns of zeroes to the matrix,
-    initializing the added rows as in the unit congruence system.
+} // namespace Parma_Polyhedra_Library
 
-    \param dims
-    The number of rows and columns to be added: must be strictly
-    positive.
+namespace std {
 
-    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
-    (c+dims)\f$ matrix \f$\bigl({0 \atop A}{B \atop A}\bigr)\f$ where
-    \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
-    \f$\bigl({0 \atop 1}{1 \atop 0}\bigr)\f$.  The matrix is expanded
-    avoiding reallocation whenever possible.
-  */
-  void add_unit_rows_and_columns(dimension_type dims);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+     Parma_Polyhedra_Library::DB_Matrix<T>& y) {
+  x.swap(y);
+}
 
-  /*! \brief
-    Concatenates copies of the congruences from \p cgs onto \p *this.
+} // namespace std
 
-    The matrix for the new system of congruences is obtained by
-    leaving the old system in the upper left-hand side and placing the
-    congruences of \p cgs in the lower right-hand side, and padding
-    with zeroes.
-  */
-  void concatenate(const Congruence_System& cgs);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.templates.hh line 1
+/* DB_Matrix class implementation: non-inline template functions.
+*/
 
-protected:
 
-  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
-  bool satisfies_all_congruences(const Grid_Generator& g) const;
+namespace Parma_Polyhedra_Library {
 
-private:
+template <typename T>
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+  : rows(n_rows),
+    row_size(n_rows),
+    row_capacity(compute_capacity(n_rows, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_rows, row_capacity);
+  assert(OK());
+}
 
-  //! Adjusts all expressions to have the same moduli.
-  void normalize_moduli();
+template <typename T>
+template <typename U>
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+  : rows(y.rows.size()),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+    rows[i].construct_upward_approximation(y[i], row_capacity);
+  assert(OK());
+}
 
-  //! Increase the number of space dimensions to \p new_space_dim.
-  /*!
-    \p new_space_dim must at least equal to the current space
-    dimension.
-  */
-  bool increase_space_dimension(const dimension_type new_space_dim);
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+  const dimension_type old_n_rows = rows.size();
+  assert(new_n_rows >= old_n_rows);
 
-  /*! \brief
-    Inserts in \p *this an exact copy of the congruence \p cg,
-    increasing the number of space dimensions if needed.
+  if (new_n_rows > old_n_rows) {
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows.
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows.
+      DB_Matrix new_matrix;
+      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+      // Construct the new rows.
+      new_matrix.row_size = new_n_rows;
+      new_matrix.row_capacity = compute_capacity(new_n_rows,
+						 max_num_columns());
+      dimension_type i = new_n_rows;
+      while (i-- > old_n_rows)
+	new_matrix.rows[i].construct(new_matrix.row_size,
+				     new_matrix.row_capacity);
+      // Copy the old rows.
+      ++i;
+      while (i-- > 0) {
+	// FIXME: copying may be unnecessarily costly.
+	DB_Row<T> new_row(rows[i],
+			  new_matrix.row_size,
+			  new_matrix.row_capacity);
+	std::swap(new_matrix.rows[i], new_row);
+      }
+      // Put the new vector into place.
+      swap(new_matrix);
+      return;
+    }
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	// FIXME: copying may be unnecessarily costly.
+	DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+    // Rows have grown or shrunk.
+    row_size = new_n_rows;
+  }
+}
 
-    This method inserts a copy of \p cg in the given form, instead of
-    first strong normalizing \p cg as \ref insert would do.
-  */
-  void insert_verbatim(const Congruence& cg);
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+  dimension_type old_n_rows = rows.size();
 
-  friend class const_iterator;
-  // FIXME: Reduce the dependence on this declaration.
-  friend class Grid;
-  friend class Grid_Certificate;
+  if (new_n_rows > old_n_rows) {
+    // Rows will be inserted.
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation (of vector `rows') will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows (be careful: each new row must have
+	// the same capacity as each one of the old rows).
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation (of vector `rows') will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	// Be careful: each new row must have
+	// the same capacity as each one of the old rows.
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      DB_Matrix new_matrix(new_n_rows);
+      swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+    // Shrink the existing rows.
+    for (dimension_type i = new_n_rows; i-- > 0; )
+      rows[i].shrink(new_n_rows);
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	DB_Row<T> new_row(new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+  }
+  // DB_Rows have grown or shrunk.
+  row_size = new_n_rows;
+}
 
-  friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x,
-			Parma_Polyhedra_Library::Congruence_System& y);
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const DB_Matrix<T>& x = *this;
+  const char separator = ' ';
+  const dimension_type nrows = x.num_rows();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j) {
+      using namespace IO_Operators;
+      s << x[i][j] << separator;
+    }
+    s << "\n";
+  }
+}
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Congruence_System& x,
-				      const Congruence_System& y);
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>)
 
-  //! Returns the \p k- th congruence of the system.
-  Congruence& operator[](dimension_type k);
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type nrows;
+   if (!(s >> nrows))
+    return false;
+  resize_no_copy(nrows);
+  DB_Matrix& x = *this;
+  for (dimension_type i = 0; i < nrows;  ++i)
+    for (dimension_type j = 0; j < nrows; ++j) {
+      Result r = input(x[i][j], s, ROUND_UP);
+      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+      if (!s || r == V_CVT_STR_UNK)
+	return false;
+    }
 
-  //! Returns a constant reference to the \p k- th congruence of the system.
-  const Congruence& operator[](dimension_type k) const;
+  // Check invariants.
+  assert(OK());
+  return true;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if any of the dimensions in
-    \p *this is free of constraint.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
 
-    Any equality or proper congruence affecting a dimension constrains
-    that dimension.
+template <typename T>
+memory_size_type
+DB_Matrix<T>::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(DB_Row<T>);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes(row_capacity);
+  return n;
+}
 
-    This method assumes the system is in minimal form.
-  */
-  bool has_a_free_dimension() const;
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
 
-  /*! \brief
-    Substitutes a given column of coefficients by a given affine
-    expression.
+  // The matrix must be square.
+  if (num_rows() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Matrix has fewer columns than rows:\n"
+	 << "row_size is " << row_size
+	 << ", num_rows() is " << num_rows() << "!"
+	 << endl;
+#endif
+    return false;
+  }
 
-    \param v
-    Index of the column to which the affine transformation is
-    substituted;
+  const DB_Matrix& x = *this;
+  const dimension_type n_rows = x.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+  }
 
-    \param expr
-    The numerator of the affine transformation:
-    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+  // All checks passed.
+  return true;
+}
 
-    \param denominator
-    The denominator of the affine transformation.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+  const dimension_type n = c.num_rows();
+  for (dimension_type i = 0; i < n; ++i) {
+    for (dimension_type j = 0; j < n; ++j)
+      s << c[i][j] << " ";
+    s << "\n";
+  }
+  return s;
+}
 
-    We allow affine transformations (see the Section \ref
-    rational_grid_operations) to have rational
-    coefficients. Since the coefficients of linear expressions are
-    integers we also provide an integer \p denominator that will
-    be used as denominator of the affine transformation.  The
-    denominator is required to be a positive integer and its default value
-    is 1.
+} // namespace Parma_Polyhedra_Library
 
-    The affine transformation substitutes the matrix of congruences
-    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
-    the old one \f$a_{ij}\f$ as follows:
-    \f[
-      {a'}_{ij} =
-        \begin{cases}
-          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
-            \quad \text{for } j \neq v; \\
-          \mathrm{expr}[v] * a_{iv}
-            \quad \text{for } j = v.
-        \end{cases}
-    \f]
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/DB_Matrix.defs.hh line 330
 
-    \p expr is a constant parameter and unaltered by this computation.
-  */
-  void affine_preimage(dimension_type v,
-		       const Linear_Expression& expr,
-		       Coefficient_traits::const_reference denominator);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.defs.hh line 47
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
 
-  //! Resizes the system without worrying about the old contents.
-  /*!
-    \param new_n_rows
-    The number of rows of the resized system;
+namespace Parma_Polyhedra_Library {
 
-    \param new_n_columns
-    The number of columns of the resized system.
+namespace IO_Operators {
 
-    The system is expanded to the specified dimensions avoiding
-    reallocation whenever possible.
-    The contents of the original system is lost.
-  */
-  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
-};
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+  Writes a textual representation of \p bds on \p s:
+  <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+  <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+  a system of constraints defining \p bds is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
 
-// Congruence_System.inlines.hh is not included here on purpose.
+} // namespace IO_Operators
 
-// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 1
-/* Linear_Expression class declaration.
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*! \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
 */
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
 
+//! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same BDS.
+/*! \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
 
-// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 42
-#include <cstddef>
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-namespace Parma_Polyhedra_Library {
-// Put them in the namespace here to declare them friend later.
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the congruence \p e1 = \p e2 \p \pmod{1}.
-/*! \relates Congruence */
-Congruence
-operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
 
-//! Returns the congruence \p e = \p n \p \pmod{1}.
-/*! \relates Congruence */
-Congruence
-operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p e1 + \p e2.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p v + \p w.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(Variable v, Variable w);
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
 
-//! Returns the linear expression \p v + \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(Variable v, const Linear_Expression& e);
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p e + \p v.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(const Linear_Expression& e, Variable v);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p n + \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
 
-//! Returns the linear expression \p e + \p n.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator+(const Linear_Expression& e);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression - \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(const Linear_Expression& e);
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
 
-//! Returns the linear expression \p e1 - \p e2.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p v - \p w.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(Variable v, Variable w);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p v - \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(Variable v, const Linear_Expression& e);
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
 
-//! Returns the linear expression \p e - \p v.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(const Linear_Expression& e, Variable v);
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p n - \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p e - \p n.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
 
-//! Returns the linear expression \p n * \p e.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p e * \p n.
-/*! \relates Linear_Expression */
-Linear_Expression
-operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
-/*! \relates Linear_Expression */
-Linear_Expression&
-operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
 
-//! Returns the linear expression \p e + \p v and assigns it to \p e.
-/*! \relates Linear_Expression
-  \exception std::length_error
-  Thrown if the space dimension of \p v exceeds
-  <CODE>Linear_Expression::max_space_dimension()</CODE>.
- */
-Linear_Expression&
-operator+=(Linear_Expression& e, Variable v);
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p e + \p n and assigns it to \p e.
-/*! \relates Linear_Expression */
-Linear_Expression&
-operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
-/*! \relates Linear_Expression */
-Linear_Expression&
-operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
 
-//! Returns the linear expression \p e - \p v and assigns it to \p e.
-/*! \relates Linear_Expression
-  \exception std::length_error
-  Thrown if the space dimension of \p v exceeds
-  <CODE>Linear_Expression::max_space_dimension()</CODE>.
- */
-Linear_Expression&
-operator-=(Linear_Expression& e, Variable v);
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-//! Returns the linear expression \p e - \p n and assigns it to \p e.
-/*! \relates Linear_Expression */
-Linear_Expression&
-operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+  The direction of the approximation is specified by \p dir.
 
-//! Returns the linear expression \p n * \p e and assigns it to \p e.
-/*! \relates Linear_Expression */
-Linear_Expression&
-operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
 
-namespace IO_Operators {
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as a bounded difference.
+/*! \relates BD_Shape
+  \return
+  <CODE>true</CODE> if the constraint \p c is a
+  \ref Bounded_Difference_Shapes "bounded difference";
+  <CODE>false</CODE> otherwise.
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Linear_Expression */
-std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+  \param c
+  The constraint to be decoded.
 
-} // namespace IO_Operators
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
 
-} // namespace Parma_Polyhedra_Library
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0, 1 and 2.
 
+  \param c_first_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the first variable having
+  a non-zero coefficient in \p c.
 
-namespace std {
+  \param c_second_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+  then it will be set to the index of the second variable having
+  a non-zero coefficient in \p c.
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Linear_Expression */
-void swap(Parma_Polyhedra_Library::Linear_Expression& x,
-	  Parma_Polyhedra_Library::Linear_Expression& y);
+  \param c_coeff
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the value of the first non-zero coefficient
+  in \p c.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool extract_bounded_difference(const Constraint& c,
+                                dimension_type c_space_dim,
+                                dimension_type& c_num_vars,
+                                dimension_type& c_first_var,
+                                dimension_type& c_second_var,
+                                Coefficient& c_coeff);
 
-} // namespace std
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+/*! \relates BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+                            std::vector<dimension_type>& indices);
 
-//! A linear expression.
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
 /*! \ingroup PPL_CXX_interface
-  An object of the class Linear_Expression represents the linear expression
-  \f[
-    \sum_{i=0}^{n-1} a_i x_i + b
-  \f]
-  where \f$n\f$ is the dimension of the vector space,
-  each \f$a_i\f$ is the integer coefficient
-  of the \f$i\f$-th variable \f$x_i\f$
-  and \f$b\f$ is the integer for the inhomogeneous term.
+  The class template BD_Shape<T> allows for the efficient representation
+  of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+  called <EM>bounded difference shapes</EM> (BDSs, for short).
+  The name comes from the fact that the closed affine half-spaces that
+  characterize the polyhedron can be expressed by constraints of the form
+  \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+  term \f$k\f$ is a rational number.
 
-  \par How to build a linear expression.
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  bounded differences. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
 
-  Linear expressions are the basic blocks for defining
-  both constraints (i.e., linear equalities or inequalities)
-  and generators (i.e., lines, rays, points and closure points).
-  A full set of functions is defined to provide a convenient interface
-  for building complex linear expressions starting from simpler ones
-  and from objects of the classes Variable and Coefficient:
-  available operators include unary negation,
-  binary addition and subtraction,
-  as well as multiplication by a Coefficient.
-  The space dimension of a linear expression is defined as the maximum
-  space dimension of the arguments used to build it:
-  in particular, the space dimension of a Variable <CODE>x</CODE>
-  is defined as <CODE>x.id()+1</CODE>,
-  whereas all the objects of the class Coefficient have space dimension zero.
+  The user interface for BDSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.  At the
+  interface level, bounded differences are specified using objects of
+  type Constraint: such a constraint is a bounded difference if it is
+  of the form
+    \f[
+      a_i x_i - a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above Constraint object will be mapped
+  into a <EM>correct</EM> approximation that, depending on the expressive
+  power of the chosen template argument \p T, may loose some precision.
+  In particular, constraint objects that do not encode a bounded difference
+  will be simply (and safely) ignored.
 
-  \par Example
-  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
-  having space dimension \f$3\f$:
+  For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x - y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x - y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, a Constraint object encoding \f$3x - y \leq 1\f$
+  will be safely ignored in all of the above cases.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
   \code
-  Linear_Expression e = 4*x - 2*y - z + 14;
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
   \endcode
-  Another way to build the same linear expression is:
+
+  \par Example 1
+  The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
   \code
-  Linear_Expression e1 = 4*x;
-  Linear_Expression e2 = 2*y;
-  Linear_Expression e3 = z;
-  Linear_Expression e = Linear_Expression(14);
-  e += e1 - e2 - e3;
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    BD_Shape<T> bd(cs);
   \endcode
-  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
-  respectively; also, in the fourth line of code, \p e is created
-  with space dimension zero and then extended to space dimension 3
-  in the fifth line.
-*/
-class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row {
-public:
-  //! Default constructor: returns a copy of Linear_Expression::zero().
-  Linear_Expression();
-
-  //! Ordinary copy-constructor.
-  Linear_Expression(const Linear_Expression& e);
-
-  //! Destructor.
-  ~Linear_Expression();
-
-  /*! \brief
-    Builds the linear expression corresponding
-    to the inhomogeneous term \p n.
-  */
-  explicit Linear_Expression(Coefficient_traits::const_reference n);
-
-  //! Builds the linear expression corresponding to the variable \p v.
-  /*! \relates Linear_Expression
-    \exception std::length_error
-    Thrown if the space dimension of \p v exceeds
-    <CODE>Linear_Expression::max_space_dimension()</CODE>.
-  */
-  Linear_Expression(Variable v);
-
-  //! Builds the linear expression corresponding to constraint \p c.
-  /*!
-    Given the constraint
-    \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$,
-    where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
-    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
-    If \p c is an inequality (resp., equality) constraint, then
-    the built linear expression is unique up to a positive
-    (resp., non-zero) factor.
-  */
-  explicit Linear_Expression(const Constraint& c);
-
+  Since only those constraints having the syntactic form of a
+  <EM>bounded difference</EM> are considered, the following code
+  will build the same BDS as above (i.e., the constraints 7, 8, and 9
+  are ignored):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    cs.insert(x + y <= 0);      // 7
+    cs.insert(x - z + x >= 0);  // 8
+    cs.insert(3*z - y <= 1);    // 9
+    BD_Shape<T> bd(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
   /*! \brief
-    Builds the linear expression corresponding to generator \p g
-    (for points and closure points, the divisor is not copied).
-
-    Given the generator
-    \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
-    (where, for lines and rays, we have \f$d = 1\f$),
-    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
-    The inhomogeneous term of the linear expression will always be 0.
-    If \p g is a ray, point or closure point (resp., a line), then
-    the linear expression is unique up to a positive
-    (resp., non-zero) factor.
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining a BDS.
   */
-  explicit Linear_Expression(const Generator& g);
+  typedef Checked_Number<T, Extended_Number_Policy> N;
 
-  //! Builds the linear expression corresponding to congruence \p cg.
-  /*!
-    Given the congruence
-    \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$,
-    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+public:
+  //! The numeric base type upon which bounded differences are built.
+  typedef T coefficient_type_base;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining a BDS.
   */
-  explicit Linear_Expression(const Congruence& cg);
+  typedef N coefficient_type;
 
-  //! Returns the maximum space dimension a Linear_Expression can handle.
+  //! Returns the maximum space dimension that a BDS can handle.
   static dimension_type max_space_dimension();
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
-
-  //! Returns the coefficient of \p v in \p *this.
-  Coefficient_traits::const_reference coefficient(Variable v) const;
-
-  //! Returns the inhomogeneous term of \p *this.
-  Coefficient_traits::const_reference inhomogeneous_term() const;
-
-  //! Returns the (zero-dimension space) constant 0.
-  static const Linear_Expression& zero();
-
   /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
+    Returns \c false indicating that this domain cannot recycle constraints.
   */
-  memory_size_type total_memory_in_bytes() const;
-
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-
-  //! Swaps \p *this with \p y.
-  void swap(Linear_Expression& y);
-
-private:
-  friend class Parma_Polyhedra_Library::Scalar_Products;
-  friend class Parma_Polyhedra_Library::Constraint;
-  friend class Parma_Polyhedra_Library::Generator;
-  // The following declaration grants access to Grid_Generator::parameter.
-  friend class Parma_Polyhedra_Library::Grid_Generator;
-  friend class Parma_Polyhedra_Library::Congruence;
-  // FIXME: the following friend declaration should be avoided.
-  friend class Parma_Polyhedra_Library::Polyhedron;
-  friend class Parma_Polyhedra_Library::Grid;
-  friend class Parma_Polyhedra_Library::LP_Problem;
-
-  // FIXME: the following friend declaration is only to grant access to
-  // Constraint_System::affine_preimage().
-  friend class Parma_Polyhedra_Library::Constraint_System;
+  static bool can_recycle_constraint_systems();
 
-  // FIXME: the following friend declaration is only to grant access to
-  // Generator_System::affine_image().
-  friend class Parma_Polyhedra_Library::Generator_System;
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
 
-  // FIXME: the following friend declaration is only to grant access to
-  // Congruence_System::affine_preimage().
-  friend class Parma_Polyhedra_Library::Congruence_System;
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
 
-  // FIXME: the following friend declaration is only to grant access to
-  // Grid_Generator_System::affine_image().
-  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+  //! Builds a universe or empty BDS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the BDS;
 
-  //! Copy-constructor with a specified space dimension.
-  Linear_Expression(const Linear_Expression& e, dimension_type sz);
+    \param kind
+    Specifies whether the universe or the empty BDS has to be built.
+  */
+  explicit BD_Shape(dimension_type num_dimensions = 0,
+                    Degenerate_Element kind = UNIVERSE);
 
-  //! Implementation sizing constructor.
+  //! Ordinary copy-constructor.
   /*!
-    The bool parameter is just to avoid problems with
-    the constructor Linear_Expression(Coefficient_traits::const_reference n).
+    The complexity argument is ignored.
   */
-  Linear_Expression(dimension_type sz, bool);
-
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
-
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
-
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  BD_Shape(const BD_Shape& y,
+           Complexity_Class complexity = ANY_COMPLEXITY);
 
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
-  friend Linear_Expression
-  Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename U>
+  explicit BD_Shape(const BD_Shape<U>& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
-				      const Linear_Expression& e2);
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
-				      Variable v);
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+  //! Builds a BDS from the system of constraints \p cs.
+  /*!
+    The BDS inherits the space dimension of \p cs.
 
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
-				      const Linear_Expression& e2);
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
-				      Variable v);
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+    \param cs
+    A system of constraints: constraints that are not
+    \ref Bounded_Difference_Shapes "bounded differences"
+    are ignored (even though they may have contributed
+    to the space dimension).
 
-  friend Linear_Expression&
-  Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
+    \exception std::invalid_argument
+    Thrown if the system of constraints \p cs contains strict inequalities.
+  */
+  explicit BD_Shape(const Constraint_System& cs);
 
-  friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
-						    const Linear_Expression& e);
+  //! Builds a BDS from a system of congruences.
+  /*!
+    The BDS inherits the space dimension of \p cgs
 
-  friend Congruence
-  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
+    \param cgs
+    A system of congruences: some elements may be safely ignored.
+  */
+  explicit BD_Shape(const Congruence_System& cgs);
 
-  friend Congruence
-  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
-};
+  //! Builds a BDS from the system of generators \p gs.
+  /*!
+    Builds the smallest BDS containing the polyhedron defined by \p gs.
+    The BDS inherits the space dimension of \p gs.
 
-// Automatically generated from PPL source file ../src/Linear_Expression.inlines.hh line 1
-/* Linear_Expression class implementation: inline functions.
-*/
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit BD_Shape(const Generator_System& gs);
 
+  //! Builds a BDS from the polyhedron \p ph.
+  /*!
+    Builds a BDS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+    smallest one containing \p ph.
+  */
+  explicit BD_Shape(const Polyhedron& ph,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
-// Automatically generated from PPL source file ../src/Linear_Expression.inlines.hh line 28
-#include <stdexcept>
+  //! Builds a BDS that approximates a box.
+  /*!
+    The BDS inherits the space dimension of the box.
+    The built BDS is the most precise BDS that includes the box.
 
-namespace Parma_Polyhedra_Library {
+    \param box
+    The bounding box representing the BDS to be built.
 
-inline dimension_type
-Linear_Expression::max_space_dimension() {
-  return Linear_Row::max_space_dimension();
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-inline
-Linear_Expression::Linear_Expression()
-  : Linear_Row(1, Linear_Row::Flags()) {
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit BD_Shape(const Box<Interval>& box,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
-inline
-Linear_Expression::Linear_Expression(dimension_type sz, bool)
-  : Linear_Row(sz, Linear_Row::Flags()) {
-}
+  //! Builds a BDS out of a grid.
+  /*!
+    The BDS inherits the space dimension of the grid.
+    The built BDS is the most precise BDS that includes the grid.
 
-inline
-Linear_Expression::Linear_Expression(const Variable v)
-  : Linear_Row(v.space_dimension() <= max_space_dimension()
-	       ? v.id() + 2
-	       : (throw std::length_error("PPL::Linear_Expression::"
-					  "Linear_Expression(v):\n"
-					  "v exceeds the maximum allowed "
-					  "space dimension."),
-		  v.id() + 2)
-	       , Linear_Row::Flags()) {
-  (*this)[v.id() + 1] = 1;
-}
+    \param grid
+    The grid used to build the BDS.
 
-inline
-Linear_Expression::Linear_Expression(const Linear_Expression& e)
-  : Linear_Row(e) {
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-inline
-Linear_Expression::~Linear_Expression() {
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit BD_Shape(const Grid& grid,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
-inline
-Linear_Expression::Linear_Expression(const Linear_Expression& e,
-				     dimension_type sz)
-  : Linear_Row(e, sz, sz) {
-}
+  //! Builds a BDS from an octagonal shape.
+  /*!
+    The BDS inherits the space dimension of the octagonal shape.
+    The built BDS is the most precise BDS that includes the octagonal shape.
 
-inline
-Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
-  : Linear_Row(1, Linear_Row::Flags()) {
-  (*this)[0] = n;
-}
+    \param os
+    The octagonal shape used to build the BDS.
 
-inline dimension_type
-Linear_Expression::space_dimension() const {
-  return size() - 1;
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-inline Coefficient_traits::const_reference
-Linear_Expression::coefficient(Variable v) const {
-  if (v.space_dimension() > space_dimension())
-    return Coefficient_zero();
-  return Linear_Row::coefficient(v.id());
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit BD_Shape(const Octagonal_Shape<U>& os,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
-inline Coefficient_traits::const_reference
-Linear_Expression::inhomogeneous_term() const {
-  return Linear_Row::inhomogeneous_term();
-}
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  BD_Shape& operator=(const BD_Shape& y);
 
-inline const Linear_Expression&
-Linear_Expression::zero() {
-  static Linear_Expression z = Linear_Expression(Coefficient_zero());
-  return z;
-}
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void swap(BD_Shape& y);
 
-inline memory_size_type
-Linear_Expression::external_memory_in_bytes() const {
-  return Linear_Row::external_memory_in_bytes();
-}
+  //! Destructor.
+  ~BD_Shape();
 
-inline memory_size_type
-Linear_Expression::total_memory_in_bytes() const {
-  return Linear_Row::total_memory_in_bytes();
-}
+  //@} Constructors, Assignment, Swap and Destructor
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator+(const Linear_Expression& e) {
-  return e;
-}
+  //! \name Member Functions that Do Not Modify the BD_Shape
+  //@{
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  return n + e;
-}
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator+(const Variable v, const Variable w) {
-  // FIXME: provide a better implementation.
-  return Linear_Expression(v) + Linear_Expression(w);
-}
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator+(const Variable v, const Linear_Expression& e) {
-  // FIXME: provide a better implementation.
-  return e + Linear_Expression(v);
-}
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator+(const Linear_Expression& e, const Variable v) {
-  return v + e;
-}
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  return -n + e;
-}
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator-(const Variable v, const Variable w) {
-  // FIXME: provide a better implementation.
-  return Linear_Expression(v) - Linear_Expression(w);
-}
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator-(const Variable v, const Linear_Expression& e) {
-  // FIXME: provide a better implementation.
-  return Linear_Expression(v) - e;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator-(const Linear_Expression& e, const Variable v) {
-  // FIXME: provide a better implementation.
-  return e - Linear_Expression(v);
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression
-operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  return n * e;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
 
-/*! \relates Linear_Expression */
-inline Linear_Expression&
-operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
-  e[0] += n;
-  return e;
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
 
-/*! \relates Linear_Expression */
-inline Linear_Expression&
-operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
-  e[0] -= n;
-  return e;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
 
-inline void
-Linear_Expression::swap(Linear_Expression& y) {
-  Linear_Row::swap(y);
-}
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-} // namespace Parma_Polyhedra_Library
+    \param sup_n
+    The numerator of the supremum value;
 
+    \param sup_d
+    The denominator of the supremum value;
 
-namespace std {
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
 
-/*! \relates Parma_Polyhedra_Library::Linear_Expression */
-inline void
-swap(Parma_Polyhedra_Library::Linear_Expression& x,
-     Parma_Polyhedra_Library::Linear_Expression& y) {
-  x.swap(y);
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-} // namespace std
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
 
-// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 443
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
 
-// Automatically generated from PPL source file ../src/Constraint.defs.hh line 1
-/* Constraint class declaration.
-*/
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
+    \param sup_n
+    The numerator of the supremum value;
 
-// Automatically generated from PPL source file ../src/Constraint.defs.hh line 33
-#include <iosfwd>
+    \param sup_d
+    The denominator of the supremum value;
 
-namespace Parma_Polyhedra_Library {
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
 
-// Put them in the namespace here to declare them friend later.
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
 
-//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
-/*! \relates Constraint */
-bool
-operator==(const Constraint& x, const Constraint& y);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
-/*! \relates Constraint */
-bool
-operator!=(const Constraint& x, const Constraint& y);
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
 
-//! Returns the constraint \p e1 = \p e2.
-/*! \relates Constraint */
-Constraint
-operator==(const Linear_Expression& e1, const Linear_Expression& e2);
-//! Returns the constraint \p e = \p n.
-/*! \relates Constraint */
-Constraint
-operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
-//! Returns the constraint \p n = \p e.
-/*! \relates Constraint */
-Constraint
-operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
 
-//! Returns the constraint \p e1 \<= \p e2.
-/*! \relates Constraint */
-Constraint
-operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
-//! Returns the constraint \p e \<= \p n.
-/*! \relates Constraint */
-Constraint
-operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
-//! Returns the constraint \p n \<= \p e.
-/*! \relates Constraint */
-Constraint
-operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-//! Returns the constraint \p e1 \>= \p e2.
-/*! \relates Constraint */
-Constraint
-operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
-//! Returns the constraint \p e \>= \p n.
-/*! \relates Constraint */
-Constraint
-operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
-//! Returns the constraint \p n \>= \p e.
-/*! \relates Constraint */
-Constraint
-operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+    \param inf_n
+    The numerator of the infimum value;
 
-//! Returns the constraint \p e1 \< \p e2.
-/*! \relates Constraint */
-Constraint
-operator<(const Linear_Expression& e1, const Linear_Expression& e2);
-//! Returns the constraint \p e \< \p n.
-/*! \relates Constraint */
-Constraint
-operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
-//! Returns the constraint \p n \< \p e.
-/*! \relates Constraint */
-Constraint
-operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+    \param inf_d
+    The denominator of the infimum value;
 
-//! Returns the constraint \p e1 \> \p e2.
-/*! \relates Constraint */
-Constraint
-operator>(const Linear_Expression& e1, const Linear_Expression& e2);
-//! Returns the constraint \p e \> \p n.
-/*! \relates Constraint */
-Constraint
-operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
-//! Returns the constraint \p n \> \p e.
-/*! \relates Constraint */
-Constraint
-operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
 
-namespace std {
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Constraint */
-void swap(Parma_Polyhedra_Library::Constraint& x,
-	  Parma_Polyhedra_Library::Constraint& y);
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-} // namespace std
+    \param inf_n
+    The numerator of the infimum value;
 
-//! A linear equality or inequality.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Constraint is either:
-  - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
-  - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
-  - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+    \param inf_d
+    The denominator of the infimum value;
 
-  where \f$n\f$ is the dimension of the space,
-  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
-  and \f$b\f$ is the integer inhomogeneous term.
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
 
-  \par How to build a constraint
-  Constraints are typically built by applying a relation symbol
-  to a pair of linear expressions.
-  Available relation symbols are equality (<CODE>==</CODE>),
-  non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
-  strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
-  The space dimension of a constraint is defined as the maximum
-  space dimension of the arguments of its constructor.
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
 
-  \par
-  In the following examples it is assumed that variables
-  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
-  are defined as follows:
-  \code
-  Variable x(0);
-  Variable y(1);
-  Variable z(2);
-  \endcode
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-  \par Example 1
-  The following code builds the equality constraint
-  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
-  \code
-  Constraint eq_c(3*x + 5*y - z == 0);
-  \endcode
-  The following code builds the (non-strict) inequality constraint
-  \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
-  \code
-  Constraint ineq_c(4*x >= 2*y - 13);
-  \endcode
-  The corresponding strict inequality constraint
-  \f$4x > 2y - 13\f$ is obtained as follows:
-  \code
-  Constraint strict_ineq_c(4*x > 2*y - 13);
-  \endcode
-  An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
-  can be specified as follows:
-  \code
-  Constraint false_c = Constraint::zero_dim_false();
-  \endcode
-  Equivalent, but more involved ways are the following:
-  \code
-  Constraint false_c1(Linear_Expression::zero() == 1);
-  Constraint false_c2(Linear_Expression::zero() >= 1);
-  Constraint false_c3(Linear_Expression::zero() > 0);
-  \endcode
-  In contrast, the following code defines an unsatisfiable constraint
-  having space dimension \f$3\f$:
-  \code
-  Constraint false_c(0*z == 1);
-  \endcode
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
 
-  \par How to inspect a constraint
-  Several methods are provided to examine a constraint and extract
-  all the encoded information: its space dimension, its type
-  (equality, non-strict inequality, strict inequality) and
-  the value of its integer coefficients.
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const BD_Shape& y) const;
 
-  \par Example 2
-  The following code shows how it is possible to access each single
-  coefficient of a constraint. Given an inequality constraint
-  (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
-  corresponding to its complement (thus, in this case we want to obtain
-  the strict inequality constraint \f$x - 5y + 3z > 4\f$).
-  \code
-  Constraint c1(x - 5*y + 3*z <= 4);
-  cout << "Constraint c1: " << c1 << endl;
-  if (c1.is_equality())
-    cout << "Constraint c1 is not an inequality." << endl;
-  else {
-    Linear_Expression e;
-    for (int i = c1.space_dimension() - 1; i >= 0; i--)
-      e += c1.coefficient(Variable(i)) * Variable(i);
-    e += c1.inhomogeneous_term();
-    Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
-    cout << "Complement c2: " << c2 << endl;
-  }
-  \endcode
-  The actual output is the following:
-  \code
-  Constraint c1: -A + 5*B - 3*C >= -4
-  Complement c2: A - 5*B + 3*C > 4
-  \endcode
-  Note that, in general, the particular output obtained can be
-  syntactically different from the (semantically equivalent)
-  constraint considered.
-*/
-class Parma_Polyhedra_Library::Constraint : private Linear_Row {
-public:
-  //! Ordinary copy-constructor.
-  Constraint(const Constraint& c);
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const BD_Shape& y) const;
 
-  //! Destructor.
-  ~Constraint();
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const BD_Shape& y) const;
 
-  //! Assignment operator.
-  Constraint& operator=(const Constraint& c);
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
 
-  //! Returns the maximum space dimension a Constraint can handle.
-  static dimension_type max_space_dimension();
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
 
-  //! The constraint type.
-  enum Type {
-    /*! The constraint is an equality. */
-    EQUALITY,
-    /*! The constraint is a non-strict inequality. */
-    NONSTRICT_INEQUALITY,
-    /*! The constraint is a strict inequality. */
-    STRICT_INEQUALITY
-  };
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+  bool is_empty() const;
 
-  //! Returns the constraint type of \p *this.
-  Type type() const;
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+  bool is_universe() const;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this is an equality constraint.
-  */
-  bool is_equality() const;
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this is an inequality constraint (either strict or non-strict).
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
   */
-  bool is_inequality() const;
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded BDS.
+  bool is_bounded() const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this is a non-strict inequality constraint.
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
   */
-  bool is_nonstrict_inequality() const;
+  bool contains_integer_point() const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this is a strict inequality constraint.
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
   */
-  bool is_strict_inequality() const;
+  bool constrains(Variable var) const;
 
-  //! Returns the coefficient of \p v in \p *this.
-  /*!
-    \exception std::invalid_argument thrown if the index of \p v
-    is greater than or equal to the space dimension of \p *this.
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
   */
-  Coefficient_traits::const_reference coefficient(Variable v) const;
+  bool OK() const;
 
-  //! Returns the inhomogeneous term of \p *this.
-  Coefficient_traits::const_reference inhomogeneous_term() const;
+  //@} Member Functions that Do Not Modify the BD_Shape
 
-  //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
-  static const Constraint& zero_dim_false();
+  //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+  //@{
 
   /*! \brief
-    The true (zero-dimension space) constraint \f$0 \leq 1\f$,
-    also known as <EM>positivity constraint</EM>.
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or if \p c is a strict inequality.
   */
-  static const Constraint& zero_dim_positivity();
+  void add_constraint(const Constraint& c);
 
   /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
-  */
-  memory_size_type total_memory_in_bytes() const;
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this is a tautology (i.e., an always true constraint).
+    \param c
+    The constraint to be added. If it is not a bounded difference, it
+    will be simply ignored.
 
-    A tautology can have either one of the following forms:
-    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
-    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
-      where \f$b \geq 0\f$; or
-    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
-      where \f$b > 0\f$.
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or if \p c is a strict inequality.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  bool is_tautological() const;
+  bool add_constraint_and_minimize(const Constraint& c);
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this is inconsistent (i.e., an always false constraint).
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
 
-    An inconsistent constraint can have either one of the following forms:
-    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
-      where \f$b \neq 0\f$; or
-    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
-      where \f$b < 0\f$; or
-    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
-      where \f$b \leq 0\f$.
+    \param cg
+    The congruence to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
   */
-  bool is_inconsistent() const;
+  void add_congruence(const Congruence& cg);
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this and \p y
-    are equivalent constraints.
+    Adds a copy of congruence \p cg to the system of congruences
+    of \p *this, minimizing the result
 
-    Constraints having different space dimensions are not equivalent.
-    Note that constraints having different types may nonetheless be
-    equivalent, if they both are tautologies or inconsistent.
+    \param cg
+    The congruence to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are topology-incompatible
+    or dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  bool is_equivalent_to(const Constraint& y) const;
+  bool add_congruence_and_minimize(const Congruence& cg);
 
-  PPL_OUTPUT_DECLARATIONS;
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not bounded
+    differences will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
+  */
+  void add_constraints(const Constraint_System& cs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
   */
-#endif
-  bool ascii_load(std::istream& s);
+  void add_recycled_constraints(Constraint_System& cs);
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
 
-  //! Swaps \p *this with \p y.
-  void swap(Constraint& y);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-private:
-  friend class Parma_Polyhedra_Library::Congruence;
-  friend class Parma_Polyhedra_Library::Scalar_Products;
-  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
-  friend class Parma_Polyhedra_Library::Constraint_System;
-  friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
-  // FIXME: the following friend declaration should be avoided.
-  friend class Parma_Polyhedra_Library::Polyhedron;
+    \param  cs
+    The constraints that will be added. Constraints that are not bounded
+    differences will be simply ignored.
 
-  friend
-  Parma_Polyhedra_Library
-  ::Linear_Expression::Linear_Expression(const Constraint& c);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
 
-  //! Default constructor: private and not implemented.
-  Constraint();
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
 
   /*! \brief
-    Builds a constraint of type \p type and topology \p topology,
-    stealing the coefficients from \p e.
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  Constraint(Linear_Expression& e, Type type, Topology topology);
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
 
   /*! \brief
-    Throws a <CODE>std::invalid_argument</CODE> exception
-    containing the appropriate error message.
-  */
-  void
-  throw_dimension_incompatible(const char* method,
-			       const char* name_var,
-			       Variable v) const;
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
 
-  friend Constraint
-  Parma_Polyhedra_Library::operator==(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
-  friend Constraint
-  Parma_Polyhedra_Library::operator==(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
-  friend Constraint
-  Parma_Polyhedra_Library::operator==(Coefficient_traits::const_reference n,
-				      const Linear_Expression& e);
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
 
-  friend Constraint
-  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
-  friend Constraint
-  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
-  friend Constraint
-  Parma_Polyhedra_Library::operator>=(Coefficient_traits::const_reference n,
-				      const Linear_Expression& e);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
 
-  friend Constraint
-  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e1,
-				      const Linear_Expression& e2);
-  friend Constraint
-  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e,
-				      Coefficient_traits::const_reference n);
-  friend Constraint
-  Parma_Polyhedra_Library::operator<=(Coefficient_traits::const_reference n,
-				      const Linear_Expression& e);
+  /*! \brief
+    Adds a copy of the congruences in \p cs to the system
+    of congruences of \p *this, minimizing the result.
 
-  friend Constraint
-  Parma_Polyhedra_Library::operator>(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
-  friend Constraint
-  Parma_Polyhedra_Library::operator>(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
-  friend Constraint
-  Parma_Polyhedra_Library::operator>(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  friend Constraint
-  Parma_Polyhedra_Library::operator<(const Linear_Expression& e1,
-				     const Linear_Expression& e2);
-  friend Constraint
-  Parma_Polyhedra_Library::operator<(const Linear_Expression& e,
-				     Coefficient_traits::const_reference n);
-  friend Constraint
-  Parma_Polyhedra_Library::operator<(Coefficient_traits::const_reference n,
-				     const Linear_Expression& e);
+    \param cs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
 
-  //! Copy-constructor with given size.
-  Constraint(const Constraint& c, dimension_type sz);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cs);
 
+  // FIXME
   /*! \brief
-    Builds a new copy of the zero-dimension space constraint
-    \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+    Adds the congruences in \p cs to the system of congruences
+    of \p *this (without minimizing the result).
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
   */
-  static Constraint construct_epsilon_geq_zero();
+  void add_recycled_congruences(Congruence_System& cgs);
 
-  //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
-  static const Constraint& epsilon_geq_zero();
+  // FIXME
+  /*! \brief
+    Adds the congruences in \p cs to the system of congruences
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
 
   /*! \brief
-    The zero-dimension space constraint \f$\epsilon \leq 1\f$
-    (used to implement NNC polyhedra).
+    Uses a copy of constraint \p c to refine the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint. If it is not a bounded difference, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
   */
-  static const Constraint& epsilon_leq_one();
+  void refine_with_constraint(const Constraint& c);
 
-  //! Sets the constraint type to <CODE>EQUALITY</CODE>.
-  void set_is_equality();
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    bounded differences  of \p *this.
 
-  //! Sets the constraint to be an inequality.
-  /*!
-    Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
-    or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
-    of the low-level coefficients of the constraint.
+    \param cg
+    The congruence. If it is not a bounded difference equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
   */
-  void set_is_inequality();
-};
+  void refine_with_congruence(const Congruence& cg);
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    bounded differences defining \p *this.
 
-namespace IO_Operators {
+    \param  cs
+    The constraint system to be used. Constraints that are not bounded
+    differences are ignored.
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Constraint */
-std::ostream& operator<<(std::ostream& s, const Constraint& c);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Constraint */
-std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    bounded differences defining \p *this.
 
-} // namespace IO_Operators
+    \param  cgs
+    The congruence system to be used. Congruences that are not bounded
+    difference equalities are ignored.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
 
-// Automatically generated from PPL source file ../src/Constraint.inlines.hh line 1
-/* Constraint class implementation: inline functions.
-*/
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
 
+    \param var
+    The space dimension that will be unconstrained.
 
-// Automatically generated from PPL source file ../src/Constraint.inlines.hh line 27
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
 
-inline
-Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) {
-  assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
-  Linear_Row::swap(e);
-  flags() = Flags(topology, (type == EQUALITY
-			     ? LINE_OR_EQUALITY
-			     : RAY_OR_POINT_OR_INEQUALITY));
-}
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const BD_Shape& y);
 
-inline
-Constraint::Constraint(const Constraint& c)
-  : Linear_Row(c) {
-}
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-inline
-Constraint::Constraint(const Constraint& c, const dimension_type sz)
-  : Linear_Row(c, sz, sz) {
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-inline
-Constraint::~Constraint() {
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool intersection_assign_and_minimize(const BD_Shape& y);
 
-inline Constraint&
-Constraint::operator=(const Constraint& c) {
-  Linear_Row::operator=(c);
-  return *this;
-}
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the convex union
+    of \p *this and \p y.
 
-inline dimension_type
-Constraint::max_space_dimension() {
-  return Linear_Row::max_space_dimension();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void bds_hull_assign(const BD_Shape& y);
 
-inline dimension_type
-Constraint::space_dimension() const {
-  return Linear_Row::space_dimension();
-}
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the convex union
+    of \p *this and \p y.
 
-inline bool
-Constraint::is_equality() const {
-  return is_line_or_equality();
-}
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-inline bool
-Constraint::is_inequality() const {
-  return is_ray_or_point_or_inequality();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-inline Constraint::Type
-Constraint::type() const {
-  if (is_equality())
-    return EQUALITY;
-  if (is_necessarily_closed())
-    return NONSTRICT_INEQUALITY;
-  else
-    return ((*this)[size() - 1] < 0)
-      ? STRICT_INEQUALITY
-      : NONSTRICT_INEQUALITY;
-}
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool bds_hull_assign_and_minimize(const BD_Shape& y);
 
-inline bool
-Constraint::is_nonstrict_inequality() const {
-  return type() == NONSTRICT_INEQUALITY;
-}
+  //! Same as bds_hull_assign.
+  void upper_bound_assign(const BD_Shape& y);
 
-inline bool
-Constraint::is_strict_inequality() const {
-  return type() == STRICT_INEQUALITY;
-}
+  /*! \brief
+    If the bds-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
 
-inline void
-Constraint::set_is_equality() {
-  set_is_line_or_equality();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool bds_hull_assign_if_exact(const BD_Shape& y);
 
-inline void
-Constraint::set_is_inequality() {
-  set_is_ray_or_point_or_inequality();
-}
+  //! Same as bds_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const BD_Shape& y);
 
-inline Coefficient_traits::const_reference
-Constraint::coefficient(const Variable v) const {
-  if (v.space_dimension() > space_dimension())
-    throw_dimension_incompatible("coefficient(v)", "v", v);
-  return Linear_Row::coefficient(v.id());
-}
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y.
 
-inline Coefficient_traits::const_reference
-Constraint::inhomogeneous_term() const {
-  return Linear_Row::inhomogeneous_term();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void bds_difference_assign(const BD_Shape& y);
 
-inline memory_size_type
-Constraint::external_memory_in_bytes() const {
-  return Linear_Row::external_memory_in_bytes();
-}
+  //! Same as bds_difference_assign.
+  void difference_assign(const BD_Shape& y);
 
-inline memory_size_type
-Constraint::total_memory_in_bytes() const {
-  return Linear_Row::total_memory_in_bytes();
-}
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
 
-/*! \relates Constraint */
-inline bool
-operator==(const Constraint& x, const Constraint& y) {
-  return x.is_equivalent_to(y);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const BD_Shape& y);
 
-/*! \relates Constraint */
-inline bool
-operator!=(const Constraint& x, const Constraint& y) {
-  return !x.is_equivalent_to(y);
-}
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
 
-/*! \relates Constraint */
-inline Constraint
-operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
-  Linear_Expression diff = e1 - e2;
-  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
-  // Enforce normalization.
-  c.strong_normalize();
-  return c;
-}
+    \param var
+    The variable to which the affine expression is assigned.
 
-/*! \relates Constraint */
-inline Constraint
-operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
-  Linear_Expression diff = e1 - e2;
-  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
-  // Enforce normalization.
-  c.normalize();
-  return c;
-}
+    \param expr
+    The numerator of the affine expression.
 
-/*! \relates Constraint */
-inline Constraint
-operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
-  Linear_Expression diff;
-  // Setting the epsilon coefficient to -1.
-  // NOTE: this also enforces normalization.
-  const dimension_type e1_dim = e1.space_dimension();
-  const dimension_type e2_dim = e2.space_dimension();
-  if (e1_dim > e2_dim)
-    diff -= Variable(e1_dim);
-  else
-    diff -= Variable(e2_dim);
-  diff += e1;
-  diff -= e2;
+    \param denominator
+    The denominator of the affine expression.
 
-  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
-  return c;
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
 
-/*! \relates Constraint */
-inline Constraint
-operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
-  Linear_Expression diff = n - e;
-  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
-  // Enforce normalization.
-  c.strong_normalize();
-  return c;
-}
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
 
-/*! \relates Constraint */
-inline Constraint
-operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
-  Linear_Expression diff = n - e;
-  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
-  // Enforce normalization.
-  c.normalize();
-  return c;
-}
+    \param var
+    The variable to which the affine expression is substituted.
 
-/*! \relates Constraint */
-inline Constraint
-operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
-  Linear_Expression diff;
-  // Setting the epsilon coefficient to -1.
-  // NOTE: this also enforces normalization.
-  diff -= Variable(e.space_dimension());
-  diff += n;
-  diff -= e;
+    \param expr
+    The numerator of the affine expression.
 
-  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
-  return c;
-}
+    \param denominator
+    The denominator of the affine expression.
 
-/*! \relates Constraint */
-inline Constraint
-operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  Linear_Expression diff = e - n;
-  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
-  // Enforce normalization.
-  c.strong_normalize();
-  return c;
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
 
-/*! \relates Constraint */
-inline Constraint
-operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  Linear_Expression diff = e - n;
-  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
-  // Enforce normalization.
-  c.normalize();
-  return c;
-}
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-/*! \relates Constraint */
-inline Constraint
-operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  Linear_Expression diff;
-  // Setting the epsilon coefficient to -1.
-  // NOTE: this also enforces normalization.
-  diff -= Variable(e.space_dimension());
-  diff += e;
-  diff -= n;
+    \param var
+    The left hand side variable of the generalized affine transfer function.
 
-  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
-  c.set_not_necessarily_closed();
-  c.set_is_inequality();
-  return c;
-}
+    \param relsym
+    The relation symbol.
 
-/*! \relates Constraint */
-inline Constraint
-operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
-  return e2 >= e1;
-}
+    \param expr
+    The numerator of the right hand side affine expression.
 
-/*! \relates Constraint */
-inline Constraint
-operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
-  return e >= n;
-}
+    \param denominator
+    The denominator of the right hand side affine expression.
 
-/*! \relates Constraint */
-inline Constraint
-operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  return n >= e;
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
 
-/*! \relates Constraint */
-inline Constraint
-operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
-  return e2 > e1;
-}
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-/*! \relates Constraint */
-inline Constraint
-operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
-  return e > n;
-}
+    \param lhs
+    The left hand side affine expression.
 
-/*! \relates Constraint */
-inline Constraint
-operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
-  return n > e;
-}
+    \param relsym
+    The relation symbol.
 
-inline const Constraint&
-Constraint::zero_dim_false() {
-  static const Constraint zdf(Linear_Expression::zero() == Coefficient_one());
-  return zdf;
-}
+    \param rhs
+    The right hand side affine expression.
 
-inline const Constraint&
-Constraint::zero_dim_positivity() {
-  static const Constraint zdp(Linear_Expression::zero() <= Coefficient_one());
-  return zdp;
-}
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
 
-inline const Constraint&
-Constraint::epsilon_geq_zero() {
-  static const Constraint eps_geq_zero = construct_epsilon_geq_zero();
-  return eps_geq_zero;
-}
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-inline const Constraint&
-Constraint::epsilon_leq_one() {
-  static const Constraint
-    eps_leq_one(Linear_Expression::zero() < Coefficient_one());
-  return eps_leq_one;
-}
+    \param var
+    The left hand side variable of the generalized affine transfer function.
 
-inline void
-Constraint::ascii_dump(std::ostream& s) const {
-  Linear_Row::ascii_dump(s);
-}
+    \param relsym
+    The relation symbol.
 
-inline bool
-Constraint::ascii_load(std::istream& s) {
-  return Linear_Row::ascii_load(s);
-}
+    \param expr
+    The numerator of the right hand side affine expression.
 
-inline void
-Constraint::swap(Constraint& y) {
-  Linear_Row::swap(y);
-}
+    \param denominator
+    The denominator of the right hand side affine expression.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
 
-namespace std {
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-/*! \relates Parma_Polyhedra_Library::Constraint */
-inline void
-swap(Parma_Polyhedra_Library::Constraint& x,
-     Parma_Polyhedra_Library::Constraint& y) {
-  x.swap(y);
-}
+    \param lhs
+    The left hand side affine expression.
 
-} // namespace std
+    \param relsym
+    The relation symbol.
 
-// Automatically generated from PPL source file ../src/Constraint.defs.hh line 488
+    \param rhs
+    The right hand side affine expression.
 
-// Automatically generated from PPL source file ../src/Constraint_System.inlines.hh line 1
-/* Constraint_System class implementation: inline functions.
-*/
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
 
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-// Automatically generated from PPL source file ../src/Constraint_System.inlines.hh line 27
+    \param var
+    The variable updated by the affine relation;
 
-namespace Parma_Polyhedra_Library {
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-inline
-Constraint_System::Constraint_System()
-  : Linear_System(NECESSARILY_CLOSED) {
-}
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-inline
-Constraint_System::Constraint_System(const Constraint& c)
-  : Linear_System(c.topology()) {
-  Linear_System::insert(c);
-}
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-inline
-Constraint_System::Constraint_System(const Constraint_System& cs)
-  : Linear_System(cs) {
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
 
-inline
-Constraint_System::Constraint_System(const Topology topol)
-  : Linear_System(topol) {
-}
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-inline
-Constraint_System::Constraint_System(const Topology topol,
-				     const dimension_type n_rows,
-				     const dimension_type n_columns)
-  : Linear_System(topol, n_rows, n_columns) {
-}
+    \param var
+    The variable updated by the affine relation;
 
-inline
-Constraint_System::~Constraint_System() {
-}
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-inline Constraint_System&
-Constraint_System::operator=(const Constraint_System& y) {
-  Linear_System::operator=(y);
-  return *this;
-}
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-inline Constraint&
-Constraint_System::operator[](const dimension_type k) {
-  return static_cast<Constraint&>(Linear_System::operator[](k));
-}
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-inline const Constraint&
-Constraint_System::operator[](const dimension_type k) const {
-  return static_cast<const Constraint&>(Linear_System::operator[](k));
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
 
-inline dimension_type
-Constraint_System::max_space_dimension() {
-  return Linear_System::max_space_dimension();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const BD_Shape& y);
 
-inline dimension_type
-Constraint_System::space_dimension() const {
-  return Linear_System::space_dimension();
-}
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
 
-inline void
-Constraint_System::clear() {
-  Linear_System::clear();
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-inline const Constraint_System&
-Constraint_System::zero_dim_empty() {
-  static const Constraint_System zdf(Constraint::zero_dim_false());
-  return zdf;
-}
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-inline
-Constraint_System::const_iterator::const_iterator()
-  : i(), csp(0) {
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
 
-inline
-Constraint_System::const_iterator::const_iterator(const const_iterator& y)
-  : i(y.i), csp(y.csp) {
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
 
-inline
-Constraint_System::const_iterator::~const_iterator() {
-}
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-inline Constraint_System::const_iterator&
-Constraint_System::const_iterator::operator=(const const_iterator& y) {
-  i = y.i;
-  csp = y.csp;
-  return *this;
-}
+    \param first
+    An iterator referencing the first stop-point.
 
-inline const Constraint&
-Constraint_System::const_iterator::operator*() const {
-  return static_cast<const Constraint&>(*i);
-}
+    \param last
+    An iterator referencing one past the last stop-point.
 
-inline const Constraint*
-Constraint_System::const_iterator::operator->() const {
-  return static_cast<const Constraint*>(i.operator->());
-}
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-inline Constraint_System::const_iterator&
-Constraint_System::const_iterator::operator++() {
-  ++i;
-  skip_forward();
-  return *this;
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const BD_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
 
-inline Constraint_System::const_iterator
-Constraint_System::const_iterator::operator++(int) {
-  const const_iterator tmp = *this;
-  operator++();
-  return tmp;
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
 
-inline bool
-Constraint_System::const_iterator::operator==(const const_iterator& y) const {
-  return i == y.i;
-}
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-inline bool
-Constraint_System::const_iterator::operator!=(const const_iterator& y) const {
-  return i != y.i;
-}
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-inline
-Constraint_System::const_iterator::
-const_iterator(const Linear_System::const_iterator& iter,
-	       const Constraint_System& csys)
-  : i(iter), csp(&csys) {
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
 
-inline Constraint_System::const_iterator
-Constraint_System::begin() const {
-  const_iterator i(Linear_System::begin(), *this);
-  i.skip_forward();
-  return i;
-}
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-inline Constraint_System::const_iterator
-Constraint_System::end() const {
-  const const_iterator i(Linear_System::end(), *this);
-  return i;
-}
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-inline void
-Constraint_System::add_low_level_constraints() {
-  if (is_necessarily_closed())
-    // The positivity constraint.
-    insert(Constraint::zero_dim_positivity());
-  else {
-    // Add the epsilon constraints.
-    insert(Constraint::epsilon_leq_one());
-    insert(Constraint::epsilon_geq_zero());
-  }
-}
+    \param cs
+    The system of constraints used to improve the widened BDS.
 
-inline void
-Constraint_System::swap(Constraint_System& y) {
-  Linear_System::swap(y);
-}
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-inline memory_size_type
-Constraint_System::external_memory_in_bytes() const {
-  return Linear_System::external_memory_in_bytes();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
 
-inline memory_size_type
-Constraint_System::total_memory_in_bytes() const {
-  return Linear_System::total_memory_in_bytes();
-}
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
 
-inline void
-Constraint_System::simplify() {
-  Linear_System::simplify();
-}
+    \param y
+    A BDS that <EM>must</EM> contain \p *this.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const BD_Shape& y);
 
-namespace std {
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-/*! \relates Parma_Polyhedra_Library::Constraint_System */
-inline void
-swap(Parma_Polyhedra_Library::Constraint_System& x,
-     Parma_Polyhedra_Library::Constraint_System& y) {
-  x.swap(y);
-}
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-} // namespace std
+    \param cs
+    The system of constraints used to improve the widened BDS.
 
-// Automatically generated from PPL source file ../src/Generator.defs.hh line 1
-/* Generator class declaration.
-*/
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const BD_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
 
-// Automatically generated from PPL source file ../src/Generator.defs.hh line 37
-#include <iosfwd>
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
 
-namespace Parma_Polyhedra_Library {
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-// Put them in the namespace here to declare them friend later.
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-namespace IO_Operators {
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Generator */
-std::ostream& operator<<(std::ostream& s, const Generator& g);
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const BD_Shape& y, unsigned* tp = 0);
 
-} // namespace IO_Operators
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-} // namespace Parma_Polyhedra_Library
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
 
-namespace std {
+    \param cs
+    The system of constraints used to improve the widened BDS.
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Generator */
-void swap(Parma_Polyhedra_Library::Generator& x,
-	  Parma_Polyhedra_Library::Generator& y);
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-} // namespace std
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const BD_Shape& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
 
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
 
-//! A line, ray, point or closure point.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Generator is one of the following:
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+  //! Adds \p m new dimensions and embeds the old BDS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
 
-  - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+    The new dimensions will be those having the highest indexes in the new
+    BDS, which is defined by a system of bounded differences in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
 
-  - a point
-    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+  /*! \brief
+    Adds \p m new dimensions to the BDS and does not embed it in
+    the new vector space.
 
-  - a closure point
-    \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+    \param m
+    The number of dimensions to add.
 
-  where \f$n\f$ is the dimension of the space
-  and, for points and closure points, \f$d > 0\f$ is the divisor.
+    The new dimensions will be those having the highest indexes in the
+    new BDS, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
 
-  \par A note on terminology.
-  As observed in Section \ref representation, there are cases when,
-  in order to represent a polyhedron \f$\cP\f$ using the generator system
-  \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
-  \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
-  of \f$\cP\f$.
-  This situation is even more frequent when working with NNC polyhedra
-  and it is the reason why we prefer to use the word `point'
-  where other libraries use the word `vertex'.
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
 
-  \par How to build a generator.
-  Each type of generator is built by applying the corresponding
-  function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
-  or <CODE>closure_point</CODE>) to a linear expression,
-  representing a direction in the space;
-  the space dimension of the generator is defined as the space dimension
-  of the corresponding linear expression.
-  Linear expressions used to define a generator should be homogeneous
-  (any constant term will be simply ignored).
-  When defining points and closure points, an optional Coefficient argument
-  can be used as a common <EM>divisor</EM> for all the coefficients
-  occurring in the provided linear expression;
-  the default value for this argument is 1.
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const BD_Shape& y);
 
-  \par
-  In all the following examples it is assumed that variables
-  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
-  are defined as follows:
-  \code
-  Variable x(0);
-  Variable y(1);
-  Variable z(2);
-  \endcode
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
 
-  \par Example 1
-  The following code builds a line with direction \f$x-y-z\f$
-  and having space dimension \f$3\f$:
-  \code
-  Generator l = line(x - y - z);
-  \endcode
-  As mentioned above, the constant term of the linear expression
-  is not relevant. Thus, the following code has the same effect:
-  \code
-  Generator l = line(x - y - z + 15);
-  \endcode
-  By definition, the origin of the space is not a line, so that
-  the following code throws an exception:
-  \code
-  Generator l = line(0*x);
-  \endcode
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
 
-  \par Example 2
-  The following code builds a ray with the same direction as the
-  line in Example 1:
-  \code
-  Generator r = ray(x - y - z);
-  \endcode
-  As is the case for lines, when specifying a ray the constant term
-  of the linear expression is not relevant; also, an exception is thrown
-  when trying to build a ray from the origin of the space.
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
 
-  \par Example 3
-  The following code builds the point
-  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
-  \code
-  Generator p = point(1*x + 0*y + 2*z);
-  \endcode
-  The same effect can be obtained by using the following code:
-  \code
-  Generator p = point(x + 2*z);
-  \endcode
-  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
-  using either one of the following lines of code:
-  \code
-  Generator origin3 = point(0*x + 0*y + 0*z);
-  Generator origin3_alt = point(0*z);
-  \endcode
-  Note however that the following code would have defined
-  a different point, namely \f$\vect{0} \in \Rset^2\f$:
-  \code
-  Generator origin2 = point(0*y);
-  \endcode
-  The following two lines of code both define the only point
-  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
-  In the second case we exploit the fact that the first argument
-  of the function <CODE>point</CODE> is optional.
-  \code
-  Generator origin0 = Generator::zero_dim_point();
-  Generator origin0_alt = point();
-  \endcode
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-  \par Example 4
-  The point \f$\vect{p}\f$ specified in Example 3 above
-  can also be obtained with the following code,
-  where we provide a non-default value for the second argument
-  of the function <CODE>point</CODE> (the divisor):
-  \code
-  Generator p = point(2*x + 0*y + 4*z, 2);
-  \endcode
-  Obviously, the divisor can be usefully exploited to specify
-  points having some non-integer (but rational) coordinates.
-  For instance, the point
-  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
-  can be specified by the following code:
-  \code
-  Generator q = point(-15*x + 32*y + 21*z, 10);
-  \endcode
-  If a zero divisor is provided, an exception is thrown.
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
 
-  \par Example 5
-  Closure points are specified in the same way we defined points,
-  but invoking their specific constructor function.
-  For instance, the closure point
-  \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
-  \code
-  Generator c = closure_point(1*x + 0*y + 2*z);
-  \endcode
-  For the particular case of the (only) closure point
-  having space dimension zero, we can use any of the following:
-  \code
-  Generator closure_origin0 = Generator::zero_dim_closure_point();
-  Generator closure_origin0_alt = closure_point();
-  \endcode
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
 
-  \par How to inspect a generator
-  Several methods are provided to examine a generator and extract
-  all the encoded information: its space dimension, its type and
-  the value of its integer coefficients.
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
 
-  \par Example 6
-  The following code shows how it is possible to access each single
-  coefficient of a generator.
-  If <CODE>g1</CODE> is a point having coordinates
-  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
-  we construct the closure point <CODE>g2</CODE> having coordinates
-  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
-  \code
-  if (g1.is_point()) {
-    cout << "Point g1: " << g1 << endl;
-    Linear_Expression e;
-    for (int i = g1.space_dimension() - 1; i >= 0; i--)
-      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
-    Generator g2 = closure_point(e, g1.divisor());
-    cout << "Closure point g2: " << g2 << endl;
-  }
-  else
-    cout << "Generator g1 is not a point." << endl;
-  \endcode
-  Therefore, for the point
-  \code
-  Generator g1 = point(2*x - y + 3*z, 2);
-  \endcode
-  we would obtain the following output:
-  \code
-  Point g1: p((2*A - B + 3*C)/2)
-  Closure point g2: cp((2*A - 2*B + 9*C)/2)
-  \endcode
-  When working with (closure) points, be careful not to confuse
-  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
-  these are equivalent only when the divisor of the (closure) point is 1.
-*/
-class Parma_Polyhedra_Library::Generator : private Linear_Row {
-public:
-  //! Returns the line of direction \p e.
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
   /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
     \exception std::invalid_argument
-    Thrown if the homogeneous part of \p e represents the origin of
-    the vector space.
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
   */
-  static Generator line(const Linear_Expression& e);
+  void expand_space_dimension(Variable var, dimension_type m);
 
-  //! Returns the ray of direction \p e.
+  //! Folds the space dimensions in \p to_be_folded into \p var.
   /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
     \exception std::invalid_argument
-    Thrown if the homogeneous part of \p e represents the origin of
-    the vector space.
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
   */
-  static Generator ray(const Linear_Expression& e);
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-  //! Returns the point at \p e / \p d.
-  /*!
-    Both \p e and \p d are optional arguments, with default values
-    Linear_Expression::zero() and Coefficient_one(), respectively.
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-    \exception std::invalid_argument
-    Thrown if \p d is zero.
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-  static Generator point(const Linear_Expression& e
-			 = Linear_Expression::zero(),
-			 Coefficient_traits::const_reference d
-			 = Coefficient_one());
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-  //! Returns the closure point at \p e / \p d.
-  /*!
-    Both \p e and \p d are optional arguments, with default values
-    Linear_Expression::zero() and Coefficient_one(), respectively.
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-    \exception std::invalid_argument
-    Thrown if \p d is zero.
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
   */
-  static Generator
-  closure_point(const Linear_Expression& e = Linear_Expression::zero(),
-		Coefficient_traits::const_reference d = Coefficient_one());
+  int32_t hash_code() const;
 
-  //! Ordinary copy-constructor.
-  Generator(const Generator& g);
+  friend bool operator==<T>(const BD_Shape<T>& x, const BD_Shape<T>& y);
 
-  //! Destructor.
-  ~Generator();
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
 
-  //! Assignment operator.
-  Generator& operator=(const Generator& g);
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
 
-  //! Returns the maximum space dimension a Generator can handle.
-  static dimension_type max_space_dimension();
+  //! The matrix representing the system of bounded differences.
+  DB_Matrix<N> dbm;
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+#define PPL_IN_BD_Shape_CLASS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BDS_Status.idefs.hh line 1
+/* BD_Shape<T>::Status class declaration.
+*/
 
-  //! The generator type.
-  enum Type {
-    /*! The generator is a line. */
-    LINE,
-    /*! The generator is a ray. */
-    RAY,
-    /*! The generator is a point. */
-    POINT,
-    /*! The generator is a closure point. */
-    CLOSURE_POINT
-  };
 
-  //! Returns the generator type of \p *this.
-  Type type() const;
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status.idefs.hh directly; use BD_Shape.defs.hh instead."
+#endif
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
-  bool is_line() const;
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the BDS is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the BDS is the empty set;
+  - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences, so that all the constraints are
+    as tight as possible;
+  - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences and each constraint in such a system
+    is marked as being either redundant or non-redundant.
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
-  bool is_ray() const;
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool is_line_or_ray() const;
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
-  bool is_point() const;
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
-  bool is_closure_point() const;
+  bool test_shortest_path_closed() const;
+  void reset_shortest_path_closed();
+  void set_shortest_path_closed();
 
-  //! Returns the coefficient of \p v in \p *this.
-  /*!
-    \exception std::invalid_argument
-    Thrown if the index of \p v is greater than or equal to the
-    space dimension of \p *this.
-  */
-  Coefficient_traits::const_reference coefficient(Variable v) const;
+  bool test_shortest_path_reduced() const;
+  void reset_shortest_path_reduced();
+  void set_shortest_path_reduced();
+  //@}
 
-  //! If \p *this is either a point or a closure point, returns its divisor.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this is neither a point nor a closure point.
-  */
-  Coefficient_traits::const_reference divisor() const;
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
-  static const Generator& zero_dim_point();
+  PPL_OUTPUT_DECLARATIONS
 
   /*! \brief
-    Returns, as a closure point,
-    the origin of the zero-dimensional space \f$\Rset^0\f$.
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
   */
-  static const Generator& zero_dim_closure_point();
+  bool ascii_load(std::istream& s);
 
-  /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
-  */
-  memory_size_type total_memory_in_bytes() const;
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV         = 0U;
+  static const flags_t EMPTY                 = 1U << 0;
+  static const flags_t SHORTEST_PATH_CLOSED  = 1U << 1;
+  static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.defs.hh line 1824
+#undef PPL_IN_BD_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! A matrix indicating which constraints are redundant.
+  Bit_Matrix redundancy_dbm;
+
+  //! Returns <CODE>true</CODE> if the BDS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this and \p y
-    are equivalent generators.
+    Returns <CODE>true</CODE> if the BDS is known to be empty.
 
-    Generators having different space dimensions are not equivalent.
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
   */
-  bool is_equivalent_to(const Generator& y) const;
+  bool marked_empty() const;
 
-  PPL_OUTPUT_DECLARATIONS;
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+  */
+  bool marked_shortest_path_closed() const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path reduced.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
   */
-#endif
-  bool ascii_load(std::istream& s);
+  bool marked_shortest_path_reduced() const;
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+  //! Turns \p *this into an empty BDS.
+  void set_empty();
 
-  //! Swaps \p *this with \p y.
-  void swap(Generator& y);
+  //! Turns \p *this into an zero-dimensional universe BDS.
+  void set_zero_dim_univ();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_closed();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_reduced();
+
+  //! Marks \p *this as possibly not shortest-path closed.
+  void reset_shortest_path_closed();
+
+  //! Marks \p *this as possibly not shortest-path reduced.
+  void reset_shortest_path_reduced();
+
+  //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+  void shortest_path_closure_assign() const;
 
-private:
   /*! \brief
-    Builds a generator of type \p type and topology \p topology,
-    stealing the coefficients from \p e.
+    Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+    records into <CODE>this->redundancy_dbm</CODE> which of the entries
+    in <CODE>this->dbm</CODE> are redundant.
   */
-  Generator(Linear_Expression& e, Type type, Topology topology);
+  void shortest_path_reduction_assign() const;
 
   /*! \brief
-    Throw a <CODE>std::invalid_argument</CODE> exception
-    containing the appropriate error message.
+    Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+    is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+    correctly flags the redundant entries in <CODE>this->dbm</CODE>.
   */
-  void
-  throw_dimension_incompatible(const char* method,
-			       const char* name_var,
-			       Variable v) const;
+  bool is_shortest_path_reduced() const;
 
-  /*! \brief
-    Throw a <CODE>std::invalid_argument</CODE> exception
-    containing the appropriate error message.
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
   */
-  void
-  throw_invalid_argument(const char* method, const char* reason) const;
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
 
-  friend class Parma_Polyhedra_Library::Scalar_Products;
-  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
-  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
-  friend class Parma_Polyhedra_Library::Generator_System;
-  friend class Parma_Polyhedra_Library::Generator_System::const_iterator;
-  // FIXME: the following friend declaration should be avoided.
-  friend class Parma_Polyhedra_Library::Polyhedron;
-  friend class Parma_Polyhedra_Library::Grid_Generator;
-  // This is for access to Row and Linear_Row in `insert'.
-  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
 
-  friend
-  Parma_Polyhedra_Library
-  ::Linear_Expression::Linear_Expression(const Generator& g);
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
 
-  friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
-						    const Generator& g);
+    \param ext_n
+    The numerator of the extremum value;
 
-  //! Copy-constructor with given space dimension.
-  Generator(const Generator& g, dimension_type dimension);
+    \param ext_d
+    The denominator of the extremum value;
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
-  bool is_ray_or_point() const;
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
 
-  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
-  void set_is_line();
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
 
-  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
-  void set_is_ray_or_point();
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the closure point
-    \p *this has the same \e coordinates of the point \p p.
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
 
-    It is \e assumed that \p *this is a closure point, \p p is a point
-    and both topologies and space dimensions agree.
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
   */
-  bool is_matching_closure_point(const Generator& p) const;
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
 
-  //! Default constructor: private and not implemented.
-  Generator();
-};
+  //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j, const N& k);
 
+  //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j,
+                          Coefficient_traits::const_reference num,
+                          Coefficient_traits::const_reference den);
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Adds to the BDS the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
 
-//! Shorthand for Generator Generator::line(const Linear_Expression& e).
-/*! \relates Generator */
-Generator line(const Linear_Expression& e);
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var, Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
 
-//! Shorthand for Generator Generator::ray(const Linear_Expression& e).
-/*! \relates Generator */
-Generator ray(const Linear_Expression& e);
+  //! Removes all the constraints on row/column \p v.
+  void forget_all_dbm_constraints(dimension_type v);
+  //! Removes all binary constraints on row/column \p v.
+  void forget_binary_dbm_constraints(dimension_type v);
 
-/*! \brief
-  Shorthand for Generator
-  Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+    starting from \p ub_v which is an upper bound for \p v.
 
-  \relates Generator
-*/
-Generator
-point(const Linear_Expression& e = Linear_Expression::zero(),
-      Coefficient_traits::const_reference d = Coefficient_one());
+    The shortest-path closure is able to deduce the constraint
+    <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the upper bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero. In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+  */
+  void deduce_v_minus_u_bounds(dimension_type v,
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_den,
+                               const N& ub_v);
 
-/*! \brief
-  Shorthand for Generator
-  Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+    starting from \p minus_lb_v which is a lower bound for \p v.
 
-  \relates Generator
-*/
-Generator
-closure_point(const Linear_Expression& e = Linear_Expression::zero(),
-	      Coefficient_traits::const_reference d = Coefficient_one());
+    The shortest-path closure is able to deduce the constraint
+    <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the lower bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+  */
+  void deduce_u_minus_v_bounds(dimension_type v,
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_den,
+                               const N& minus_lb_v);
 
-//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
-/*! \relates Generator */
-bool operator==(const Generator& x, const Generator& y);
+  /*! \brief
+    Adds to \p limiting_shape the bounded differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_shape(const Constraint_System& cs,
+                          BD_Shape& limiting_shape) const;
 
-//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
-/*! \relates Generator */
-bool operator!=(const Generator& x, const Generator& y);
+  //! Compute the (zero-equivalence classes) predecessor relation.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_predecessors(std::vector<dimension_type>& predecessor) const;
 
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
 
-namespace IO_Operators {
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const BD_Shape<T>& c);
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Generator */
-std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const BD_Shape& x) const;
 
-} // namespace IO_Operators
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
 
-} // namespace Parma_Polyhedra_Library
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
 
-// Automatically generated from PPL source file ../src/Generator.inlines.hh line 1
-/* Generator class implementation: inline functions.
-*/
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
 
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
 
-namespace Parma_Polyhedra_Library {
+  void throw_dimension_incompatible(const char* method,
+                                    const char* name_row,
+                                    const Linear_Expression& y) const;
 
-inline
-Generator::Generator(Linear_Expression& e, Type type, Topology topology) {
-  assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
-  Linear_Row::swap(e);
-  flags() = Flags(topology, (type == LINE
-			     ? LINE_OR_EQUALITY
-			     : RAY_OR_POINT_OR_INEQUALITY));
-}
+  static void throw_constraint_incompatible(const char* method);
 
-inline
-Generator::Generator(const Generator& g)
-  : Linear_Row(g) {
-}
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& e);
 
-inline
-Generator::Generator(const Generator& g, dimension_type dimension)
-  : Linear_Row(g, dimension, dimension) {
-}
+  static void throw_generic(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
 
-inline
-Generator::~Generator() {
-}
 
-inline Generator&
-Generator::operator=(const Generator& g) {
-  Linear_Row::operator=(g);
-  return *this;
-}
+namespace std {
 
-inline dimension_type
-Generator::max_space_dimension() {
-  return Linear_Row::max_space_dimension();
-}
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+          Parma_Polyhedra_Library::BD_Shape<T>& y);
 
-inline dimension_type
-Generator::space_dimension() const {
-  return Linear_Row::space_dimension();
-}
+} // namespace std
 
-inline bool
-Generator::is_line() const {
-  return is_line_or_equality();
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BDS_Status.inlines.hh line 1
+/* BD_Shape<T>::Status class implementation: inline functions.
+*/
 
-inline bool
-Generator::is_ray_or_point() const {
-  return is_ray_or_point_or_inequality();
-}
 
-inline bool
-Generator::is_line_or_ray() const {
-  return (*this)[0] == 0;
-}
+namespace Parma_Polyhedra_Library {
 
-inline bool
-Generator::is_ray() const {
-  return is_ray_or_point() && is_line_or_ray();
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
 }
 
-inline Generator::Type
-Generator::type() const {
-  if (is_line())
-    return LINE;
-  if (is_line_or_ray())
-    return RAY;
-  if (is_necessarily_closed())
-    return POINT;
-  else {
-    // Checking the value of the epsilon coefficient.
-    const Generator& g = *this;
-    return (g[size() - 1] == 0) ? CLOSURE_POINT : POINT;
-  }
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
 }
 
+template <typename T>
 inline bool
-Generator::is_point() const {
-  return type() == POINT;
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
 }
 
+template <typename T>
 inline bool
-Generator::is_closure_point() const {
-  return type() == CLOSURE_POINT;
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+  return flags & mask;
 }
 
+template <typename T>
 inline void
-Generator::set_is_line() {
-  set_is_line_or_equality();
+BD_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
 }
 
+template <typename T>
 inline void
-Generator::set_is_ray_or_point() {
-  set_is_ray_or_point_or_inequality();
-}
-
-inline Coefficient_traits::const_reference
-Generator::coefficient(const Variable v) const {
-  if (v.space_dimension() > space_dimension())
-    throw_dimension_incompatible("coefficient(v)", "v", v);
-  return Linear_Row::coefficient(v.id());
-}
-
-inline Coefficient_traits::const_reference
-Generator::divisor() const {
-  Coefficient_traits::const_reference d = Linear_Row::inhomogeneous_term();
-  if (!is_ray_or_point() || d == 0)
-    throw_invalid_argument("divisor()",
-			   "*this is neither a point nor a closure point");
-  return d;
-}
-
-inline memory_size_type
-Generator::external_memory_in_bytes() const {
-  return Linear_Row::external_memory_in_bytes();
-}
-
-inline memory_size_type
-Generator::total_memory_in_bytes() const {
-  return Linear_Row::total_memory_in_bytes();
+BD_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
 }
 
-inline const Generator&
-Generator::zero_dim_point() {
-  static const Generator zdp = point();
-  return zdp;
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
 }
 
-inline const Generator&
-Generator::zero_dim_closure_point() {
-  static const Generator zdcp = closure_point();
-  return zdcp;
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
 }
 
-/*! \relates Generator */
-inline Generator
-line(const Linear_Expression& e) {
-  return Generator::line(e);
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
 }
 
-/*! \relates Generator */
-inline Generator
-ray(const Linear_Expression& e) {
-  return Generator::ray(e);
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
 }
 
-/*! \relates Generator */
-inline Generator
-point(const Linear_Expression& e, Coefficient_traits::const_reference d) {
-  return Generator::point(e, d);
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
 }
 
-/*! \relates Generator */
-inline Generator
-closure_point(const Linear_Expression& e,
-	      Coefficient_traits::const_reference d) {
-  return Generator::closure_point(e, d);
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
 }
 
-/*! \relates Generator */
+template <typename T>
 inline bool
-operator==(const Generator& x, const Generator& y) {
-  return x.is_equivalent_to(y);
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+  return test_any(SHORTEST_PATH_CLOSED);
 }
 
-/*! \relates Generator */
-inline bool
-operator!=(const Generator& x, const Generator& y) {
-  return !x.is_equivalent_to(y);
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+  // A system is reduced only if it is also closed.
+  reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
 }
 
+template <typename T>
 inline void
-Generator::ascii_dump(std::ostream& s) const {
-  Linear_Row::ascii_dump(s);
+BD_Shape<T>::Status::set_shortest_path_closed() {
+  set(SHORTEST_PATH_CLOSED);
 }
 
+template <typename T>
 inline bool
-Generator::ascii_load(std::istream& s) {
-  return Linear_Row::ascii_load(s);
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+  return test_any(SHORTEST_PATH_REDUCED);
 }
 
+template <typename T>
 inline void
-Generator::swap(Generator& y) {
-  Linear_Row::swap(y);
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+  reset(SHORTEST_PATH_REDUCED);
 }
 
-} // namespace Parma_Polyhedra_Library
-
-namespace std {
-
-/*! \relates Parma_Polyhedra_Library::Generator */
+template <typename T>
 inline void
-swap(Parma_Polyhedra_Library::Generator& x,
-     Parma_Polyhedra_Library::Generator& y) {
-  x.swap(y);
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+  assert(test_shortest_path_closed());
+  set(SHORTEST_PATH_REDUCED);
 }
 
-} // namespace std
-
-// Automatically generated from PPL source file ../src/Generator.defs.hh line 507
-
-// Automatically generated from PPL source file ../src/Grid_Generator.inlines.hh line 1
-/* Grid Generator class implementation: inline functions.
-*/
-
-
-// Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 1
-/* Grid_Generator class declaration.
-*/
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
 
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
 
-// Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 30
-#include <iosfwd>
+  // Shortest-path reduction implies shortest-path closure.
+  if (test_shortest_path_reduced()) {
+    if (test_shortest_path_closed())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The shortest-path reduction flag should also imply "
+		<< "the closure flag."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
 
-namespace Parma_Polyhedra_Library {
+  // Any other case is OK.
+  return true;
+}
 
-// Put these in the namespace here to declare them friend later.
 
-namespace IO_Operators {
+namespace Implementation {
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Grid_Generator */
-std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+namespace BD_Shapes {
 
-} // namespace IO_Operators
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
 
-} // namespace Parma_Polyhedra_Library
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
 
-namespace std {
+} // namespace BD_Shapes
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Grid_Generator */
-void swap(Parma_Polyhedra_Library::Grid_Generator& x,
-	  Parma_Polyhedra_Library::Grid_Generator& y);
+} // namespace Implementation
 
-} // namespace std
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::BD_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << sep
+    << (test_empty() ? yes : no) << empty << sep
+    << sep
+    << (test_shortest_path_closed() ? yes : no) << sp_closed << sep
+    << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
+}
 
-//! A line, parameter or point.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Grid_Generator is one of the following:
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status)
 
-  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::BD_Shapes;
+  bool positive;
 
-  - a parameter
-    \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
 
-  - a point
-    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
 
-  where \f$n\f$ is the dimension of the space
-  and, for points and parameters, \f$d > 0\f$ is the divisor.
+  if (!get_field(s, sp_closed, positive))
+    return false;
+  if (positive)
+    set_shortest_path_closed();
+  else
+    reset_shortest_path_closed();
 
-  \par How to build a grid generator.
-  Each type of generator is built by applying the corresponding
-  function (<CODE>line</CODE>, <CODE>parameter</CODE> or <CODE>point</CODE>)
-  to a linear expression;
-  the space dimension of the generator is defined as the space dimension
-  of the corresponding linear expression.
-  Linear expressions used to define a generator should be homogeneous
-  (any constant term will be simply ignored).
-  When defining points and parameters, an optional Coefficient argument
-  can be used as a common <EM>divisor</EM> for all the coefficients
-  occurring in the provided linear expression;
-  the default value for this argument is 1.
+  if (!get_field(s, sp_reduced, positive))
+    return false;
+  if (positive)
+    set_shortest_path_reduced();
+  else
+    reset_shortest_path_reduced();
 
-  \par
-  In all the following examples it is assumed that variables
-  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
-  are defined as follows:
-  \code
-  Variable x(0);
-  Variable y(1);
-  Variable z(2);
-  \endcode
+  // Check invariants.
+  assert(OK());
+  return true;
+}
 
-  \par Example 1
-  The following code builds a line with direction \f$x-y-z\f$
-  and having space dimension \f$3\f$:
-  \code
-  Grid_Generator l = grid_line(x - y - z);
-  \endcode
-  By definition, the origin of the space is not a line, so that
-  the following code throws an exception:
-  \code
-  Grid_Generator l = grid_line(0*x);
-  \endcode
+} // namespace Parma_Polyhedra_Library
 
-  \par Example 2
-  The following code builds the parameter as the vector
-  \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
-  which has the same direction as the line in Example 1:
-  \code
-  Grid_Generator q = parameter(x - y - z);
-  \endcode
-  Note that, unlike lines, for parameters, the length as well
-  as the direction of the vector represented by the code is significant.
-  Thus \p q is \e not the same as the parameter \p q1 defined by
-  \code
-  Grid_Generator q1 = parameter(2x - 2y - 2z);
-  \endcode
-  By definition, the origin of the space is not a parameter, so that
-  the following code throws an exception:
-  \code
-  Grid_Generator q = parameter(0*x);
-  \endcode
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.inlines.hh line 1
+/* BD_Shape class implementation: inline functions.
+*/
 
-  \par Example 3
-  The following code builds the point
-  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
-  \code
-  Grid_Generator p = grid_point(1*x + 0*y + 2*z);
-  \endcode
-  The same effect can be obtained by using the following code:
-  \code
-  Grid_Generator p = grid_point(x + 2*z);
-  \endcode
-  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
-  using either one of the following lines of code:
-  \code
-  Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
-  Grid_Generator origin3_alt = grid_point(0*z);
-  \endcode
-  Note however that the following code would have defined
-  a different point, namely \f$\vect{0} \in \Rset^2\f$:
-  \code
-  Grid_Generator origin2 = grid_point(0*y);
-  \endcode
-  The following two lines of code both define the only point
-  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
-  In the second case we exploit the fact that the first argument
-  of the function <CODE>point</CODE> is optional.
-  \code
-  Grid_Generator origin0 = Generator::zero_dim_point();
-  Grid_Generator origin0_alt = grid_point();
-  \endcode
 
-  \par Example 4
-  The point \f$\vect{p}\f$ specified in Example 3 above
-  can also be obtained with the following code,
-  where we provide a non-default value for the second argument
-  of the function <CODE>grid_point</CODE> (the divisor):
-  \code
-  Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
-  \endcode
-  Obviously, the divisor can be used to specify
-  points having some non-integer (but rational) coordinates.
-  For instance, the point
-  \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
-  can be specified by the following code:
-  \code
-  Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
-  \endcode
-  If a zero divisor is provided, an exception is thrown.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Polyhedron.defs.hh line 1
+/* C_Polyhedron class declaration.
+*/
 
-  \par Example 5
-  Parameters, like points can have a divisor.
-  For instance, the parameter
-  \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
-  \code
-  Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
-  \endcode
-  Also, the divisor can be used to specify
-  parameters having some non-integer (but rational) coordinates.
-  For instance, the parameter
-  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
-  can be defined:
-  \code
-  Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
-  \endcode
-  If a zero divisor is provided, an exception is thrown.
 
-  \par How to inspect a grid generator
-  Several methods are provided to examine a grid generator and extract
-  all the encoded information: its space dimension, its type and
-  the value of its integer coefficients and the value of the denominator.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Polyhedron.defs.hh line 32
 
-  \par Example 6
-  The following code shows how it is possible to access each single
-  coefficient of a grid generator.
-  If <CODE>g1</CODE> is a point having coordinates
-  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
-  we construct the parameter <CODE>g2</CODE> having coordinates
-  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
-  \code
-  if (g1.is_point()) {
-    cout << "Point g1: " << g1 << endl;
-    Linear_Expression e;
-    for (int i = g1.space_dimension() - 1; i >= 0; i--)
-      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
-    Grid_Generator g2 = parameter(e, g1.divisor());
-    cout << "Parameter g2: " << g2 << endl;
-  }
-  else
-    cout << "Grid Generator g1 is not a point." << endl;
-  \endcode
-  Therefore, for the point
-  \code
-  Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
-  \endcode
-  we would obtain the following output:
-  \code
-  Point g1: p((2*A - B + 3*C)/2)
-  Parameter g2: parameter((2*A - 2*B + 9*C)/2)
-  \endcode
-  When working with points and parameters, be careful not to confuse
-  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
-  these are equivalent only when the divisor is 1.
-*/
-class Parma_Polyhedra_Library::Grid_Generator : private Generator {
-public:
-  // FIXME: Add wrappers of any other public Generator methods.
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class C_Polyhedron represents a
+    <EM>topologically closed</EM> convex polyhedron
+    in the vector space \f$\Rset^n\f$.
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+    When building a closed polyhedron starting from
+    a system of constraints, an exception is thrown if the system
+    contains a <EM>strict inequality</EM> constraint.
+    Similarly, an exception is thrown when building a closed polyhedron
+    starting from a system of generators containing a <EM>closure point</EM>.
 
-  //! The generator type.
-  enum Type {
-    /*! The generator is a line. */
-    LINE,
-    /*! The generator is a parameter. */
-    PARAMETER,
-    /*! The generator is a point. */
-    POINT
-  };
+    \note
+    Such an exception will be obtained even if the system of
+    constraints (resp., generators) actually defines
+    a topologically closed subset of the vector space, i.e.,
+    even if all the strict inequalities (resp., closure points)
+    in the system happen to be redundant with respect to the
+    system obtained by removing all the strict inequality constraints
+    (resp., all the closure points).
+    In contrast, when building a closed polyhedron starting from
+    an object of the class NNC_Polyhedron,
+    the precise topological closure test will be performed.
+*/
 
-  //! Returns the generator type of \p *this.
-  Type type() const;
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty C polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the C polyhedron;
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
-  bool is_line() const;
+    \param kind
+    Specifies whether a universe or an empty C polyhedron should be built.
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
-  bool is_parameter() const;
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is a line or
-    a parameter.
+    Both parameters are optional:
+    by default, a 0-dimension space universe C polyhedron is built.
   */
-  bool is_line_or_parameter() const;
+  explicit C_Polyhedron(dimension_type num_dimensions = 0,
+			Degenerate_Element kind = UNIVERSE);
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
-  bool is_point() const;
+  //! Builds a C polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this row represents a
-    parameter or a point.
-  */
-  bool is_parameter_or_point() const;
+    \param cs
+    The system of constraints defining the polyhedron.
 
-  //! Returns the line of direction \p e.
-  /*!
     \exception std::invalid_argument
-    Thrown if the homogeneous part of \p e represents the origin of
-    the vector space.
+    Thrown if the system of constraints contains strict inequalities.
   */
-  static Grid_Generator line(const Linear_Expression& e);
+  explicit C_Polyhedron(const Constraint_System& cs);
 
-  //! Returns the parameter at \p e.
+  //! Builds a C polyhedron recycling a system of constraints.
   /*!
-    Both \p e and \p d are optional arguments, with default values
-    Linear_Expression::zero() and Coefficient_one(), respectively.
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
     \exception std::invalid_argument
-    Thrown if \p d is zero.
+    Thrown if the system of constraints contains strict inequalities.
   */
-  static Grid_Generator parameter(const Linear_Expression& e
-				  = Linear_Expression::zero(),
-				  Coefficient_traits::const_reference d
-				  = Coefficient_one());
+  C_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
 
-  //! Returns the point at \p e / \p d.
+  //! Builds a C polyhedron from a system of generators.
   /*!
-    Both \p e and \p d are optional arguments, with default values
-    Linear_Expression::zero() and Coefficient_one(), respectively.
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
 
     \exception std::invalid_argument
-    Thrown if \p d is zero.
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
   */
-  static Grid_Generator point(const Linear_Expression& e
-			      = Linear_Expression::zero(),
-			      Coefficient_traits::const_reference d
-			      = Coefficient_one());
+  explicit C_Polyhedron(const Generator_System& gs);
 
-  //! Assignment operator.
-  Grid_Generator& operator=(const Grid_Generator& g);
+  //! Builds a C polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
 
-  //! Assignment operator.
-  Grid_Generator& operator=(const Generator& g);
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-  //! Returns the divisor of \p *this.
-  /*!
     \exception std::invalid_argument
-    Thrown if \p *this is a line.
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
   */
-  Coefficient_traits::const_reference divisor() const;
+  C_Polyhedron(Generator_System& gs, Recycle_Input dummy);
 
-  /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
+  //! Builds a C polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.
   */
-  memory_size_type total_memory_in_bytes() const;
+  explicit C_Polyhedron(const Congruence_System& cgs);
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  //! Builds a C polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this and \p y are
-    equivalent generators.
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
 
-    Generators having different space dimensions are not equivalent.
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
   */
-  bool is_equivalent_to(const Grid_Generator& y) const;
-
-  //! Returns <CODE>true</CODE> if \p *this is exactly equal to \p y.
-  bool is_equal_to(const Grid_Generator& y) const;
+  C_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if all the homogeneous terms
-    of \p *this are \f$0\f$.
-  */
-  bool all_homogeneous_terms_are_zero() const;
+    Builds a C polyhedron representing the topological closure
+    of the NNC polyhedron \p y.
 
-  /*! \brief
-    Scales \p *this to be represented with a divisor of \p d (if
-    \*this is a parameter or point).
+    \param y
+    The NNC polyhedron to be used;
 
-    \exception std::invalid_argument
-    Thrown if \p d is zero.
+    \param complexity
+    This argument is ignored.
   */
-  void scale_to_divisor(Coefficient_traits::const_reference d);
+  explicit C_Polyhedron(const NNC_Polyhedron& y,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+  //! Builds a C polyhedron out of a box.
+  /*!
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
+    The algorithm used has polynomial complexity.
 
-  //! Swaps \p *this with \p y.
-  void swap(Grid_Generator& y);
+    \param box
+    The box representing the polyhedron to be approximated;
 
-  /*! \brief
-    Swaps \p *this with \p y, leaving \p *this with the original
-    capacity.
+    \param complexity
+    This argument is ignored.
 
-    All up to and including the last element of the smaller of \p
-    *this and \p y are swapped.  The parameter divisor element of \p y
-    is swapped with the divisor element of \p *this.
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
   */
-  void coefficient_swap(Grid_Generator& y);
+  template <typename Interval>
+  explicit C_Polyhedron(const Box<Interval>& box,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-  PPL_OUTPUT_DECLARATIONS;
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+  //! Builds a C polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BDS and is
+    the most precise that includes the BDS.
 
-private:
-  /*! \brief
-    Constructs from polyhedron generator \p g, stealing the underlying
-    data structures from \p g.
+    \param bd
+    The BDS used to build the polyhedron.
 
-    The last column in \p g becomes the parameter divisor column of
-    the new Grid_Generator.
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
   */
-  explicit Grid_Generator(Generator g);
-
-  //! Returns the actual size of \p this.
-  dimension_type size() const;
-
-  //! Negates the elements from index \p start to index \p end.
-  void negate(dimension_type start, dimension_type end);
+  template <typename U>
+  explicit C_Polyhedron(const BD_Shape<U>& bd,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Returns the divisor of \p *this.
+  //! Builds a C polyhedron out of an octagonal shape.
   /*!
-    \exception std::invalid_argument
-    Thrown if \p *this is a line.
-  */
-  Coefficient& divisor();
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
 
-  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
-  void set_is_line();
+    \param os
+    The octagonal shape used to build the polyhedron.
 
-  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
-  void set_is_parameter_or_point();
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit C_Polyhedron(const Octagonal_Shape<U>& os,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-  /*! \brief
-    Strong normalization: ensures that different Grid_Generator
-    objects represent different hyperplanes or hyperspaces.
+  //! Builds a C polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
 
-    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+    \param grid
+    The grid used to build the polyhedron.
 
-    This is simply a wrapper around the Generator::strong_normalize,
-    which means applying it to a parameter may change the parameter.
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
   */
-  void strong_normalize();
-
-  //! Returns a reference to the element of the row indexed by \p k.
-  Coefficient& operator[](dimension_type k);
+  explicit C_Polyhedron(const Grid& grid,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! Returns a constant reference to the element of the row indexed by \p k.
-  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  C_Polyhedron(const C_Polyhedron& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
 
   /*! \brief
-    Throw a <CODE>std::invalid_argument</CODE> exception containing
-    the appropriate error message.
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
   */
-  void
-  throw_invalid_argument(const char* method, const char* reason) const;
-
-  friend std::ostream&
-  IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
-  // FIXME: The following friend declaration is for operator[] and
-  //        divisor() access in Grid::conversion and Grid::simplify.
-  friend class Grid;
+  C_Polyhedron& operator=(const C_Polyhedron& y);
 
-  friend class Grid_Generator_System;
-  friend class Grid_Generator_System::const_iterator;
-  friend class Congruence_System;
-  friend class Scalar_Products;
-  friend class Topology_Adjusted_Scalar_Product_Sign;
-};
+  //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+  C_Polyhedron& operator=(const NNC_Polyhedron& y);
 
+  //! Destructor.
+  ~C_Polyhedron();
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
 
-/*! \brief
-  Shorthand for Grid_Generator
-  Grid_Generator::line(const Linear_Expression& e).
-*/
-/*! \relates Grid_Generator */
-Grid_Generator grid_line(const Linear_Expression& e);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const C_Polyhedron& y);
 
-/*! \brief
-  Shorthand for Grid_Generator
-  Grid_Generator::parameter(const Linear_Expression& e,
-  Coefficient_traits::const_reference d).
-*/
-/*! \relates Grid_Generator */
-Grid_Generator
-parameter(const Linear_Expression& e = Linear_Expression::zero(),
-	  Coefficient_traits::const_reference d = Coefficient_one());
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+};
 
-/*! \brief
-  Shorthand for Grid_Generator
-  Grid_Generator::point(const Linear_Expression& e,
-  Coefficient_traits::const_reference d).
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Polyhedron.inlines.hh line 1
+/* C_Polyhedron class implementation: inline functions.
 */
-/*! \relates Grid_Generator */
-Grid_Generator
-grid_point(const Linear_Expression& e = Linear_Expression::zero(),
-	   Coefficient_traits::const_reference d = Coefficient_one());
-
-//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
-/*! \relates Grid_Generator */
-bool operator==(const Grid_Generator& x, const Grid_Generator& y);
-
-//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
-/*! \relates Grid_Generator */
-bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
-
-
-namespace IO_Operators {
-
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Grid_Generator */
-std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
-
-} // namespace IO_Operators
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 492
 
-// Automatically generated from PPL source file ../src/Grid_Generator.inlines.hh line 27
+#include <algorithm>
+#include <stdexcept>
 
 namespace Parma_Polyhedra_Library {
 
 inline
-Grid_Generator::Grid_Generator(Generator g)
-  : Generator(Generator::point()) {
-  Generator::swap(g);
+C_Polyhedron::~C_Polyhedron() {
 }
 
-inline dimension_type
-Grid_Generator::space_dimension() const {
-  return Generator::space_dimension() - 1;
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+			   Degenerate_Element kind)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       num_dimensions <= max_space_dimension()
+	       ? num_dimensions
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(n, k)",
+						 "n exceeds the maximum "
+						 "allowed space dimension"),
+		  num_dimensions),
+	       kind) {
 }
 
-inline Grid_Generator::Type
-Grid_Generator::type() const {
-  switch (Generator::type()) {
-  case Generator::POINT:
-    return POINT;
-  case Generator::RAY:
-    return PARAMETER;
-  case Generator::LINE:
-    return LINE;
-  case Generator::CLOSURE_POINT:
-  default:
-    assert(false);
-    return POINT;
-  }
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
 }
 
-inline bool
-Grid_Generator::is_line() const {
-  return Generator::is_line();
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs, recycle)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs),
+	       Recycle_Input()) {
 }
 
-inline bool
-Grid_Generator::is_parameter() const {
-  return is_ray();
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(gs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)) {
 }
 
-inline bool
-Grid_Generator::is_line_or_parameter() const {
-  return is_line_or_ray();
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(gs, recycle)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs),
+	       Recycle_Input()) {
 }
 
-inline bool
-Grid_Generator::is_point() const {
-  return Generator::is_point();
+template <typename Interval>
+inline
+C_Polyhedron::C_Polyhedron(const Box<Interval>& box, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       box.space_dimension() <= max_space_dimension()
+	       ? box
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(box): ",
+						 "the space dimension of box "
+						 "exceeds the maximum allowed "
+						 "space dimension"), box)) {
 }
 
-inline bool
-Grid_Generator::is_parameter_or_point() const {
-  return is_ray_or_point_or_inequality();
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       bd.space_dimension() <= max_space_dimension()
+	       ? bd.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(bd): ",
+						 "the space dimension of bd "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
 }
 
-inline void
-Grid_Generator::set_is_line() {
-  Generator::set_is_line();
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       os.space_dimension() <= max_space_dimension()
+	       ? os.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(os): ",
+						 "the space dimension of os "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(os.constraints());
 }
 
-inline void
-Grid_Generator::set_is_parameter_or_point() {
-  Generator::set_is_ray_or_point();
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+  : Polyhedron(y) {
 }
 
-inline Grid_Generator&
-Grid_Generator::operator=(const Grid_Generator& g) {
-  Generator::operator=(g);
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+  Polyhedron::operator=(y);
   return *this;
 }
 
-inline Grid_Generator&
-Grid_Generator::operator=(const Generator& g) {
-  Generator::operator=(g);
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  C_Polyhedron c_y(y);
+  swap(c_y);
   return *this;
 }
 
-inline void
-Grid_Generator::negate(dimension_type start, dimension_type end) {
-  while (start <= end)
-    neg_assign(operator[](start++));
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
 }
 
-inline Coefficient&
-Grid_Generator::divisor() {
-  if (is_line())
-    throw_invalid_argument("divisor()", "*this is a line");
-  if (is_line_or_parameter())
-    return Generator::operator[](size() - 1);
-  return Generator::operator[](0);
-}
+} // namespace Parma_Polyhedra_Library
 
-inline Coefficient_traits::const_reference
-Grid_Generator::divisor() const {
-  if (is_line())
-    throw_invalid_argument("divisor()", "*this is a line");
-  if (is_line_or_parameter())
-    return Generator::operator[](size() - 1);
-  return Generator::operator[](0);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/C_Polyhedron.defs.hh line 278
 
-inline memory_size_type
-Grid_Generator::total_memory_in_bytes() const {
-  return Generator::total_memory_in_bytes();
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.defs.hh line 1
+/* Octagonal_Shape class declaration.
+*/
 
-inline memory_size_type
-Grid_Generator::external_memory_in_bytes() const {
-  return Generator::external_memory_in_bytes();
-}
 
-inline void
-Grid_Generator::strong_normalize() {
-  Generator::strong_normalize();
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.defs.hh line 1
+/* OR_Matrix class declaration.
+*/
 
-inline dimension_type
-Grid_Generator::size() const {
-  return Generator::size();
-}
 
-inline void
-Grid_Generator::swap(Grid_Generator& y) {
-  Generator::swap(y);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.defs.hh line 32
+#include <cstddef>
+#include <iosfwd>
 
-inline void
-Grid_Generator::ascii_dump(std::ostream& s) const {
-  Generator::ascii_dump(s);
-}
+#ifndef PPL_OR_MATRIX_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When PPL_OR_MATRIX_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each
+  instance of the class OR_Matrix::Pseudo_Row carries its own size;
+  this enables extra consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_OR_MATRIX_EXTRA_DEBUG)
 
-inline bool
-Grid_Generator::ascii_load(std::istream& s) {
-  return Generator::ascii_load(s);
-}
+namespace Parma_Polyhedra_Library {
 
-inline Coefficient&
-Grid_Generator::operator[](dimension_type k) {
-  return Generator::operator[](k);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
 
-inline Coefficient_traits::const_reference
-Grid_Generator::operator[](dimension_type k) const {
-  return Generator::operator[](k);
-}
+namespace IO_Operators {
 
-/*! \relates Grid_Generator */
-inline bool
-operator==(const Grid_Generator& x, const Grid_Generator& y) {
-  return x.is_equivalent_to(y);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const OR_Matrix<T>& m);
 
-/*! \relates Grid_Generator */
-inline bool
-operator!=(const Grid_Generator& x, const Grid_Generator& y) {
-  return !(x == y);
-}
+} // namespace IO_Operators
 
-/*! \relates Grid_Generator */
-inline Grid_Generator
-grid_line(const Linear_Expression& e) {
-  return Grid_Generator::line(e);
-}
+} // namespace Parma_Polyhedra_Library
 
-/*! \relates Grid_Generator */
-inline Grid_Generator
-parameter(const Linear_Expression& e,
-	  Coefficient_traits::const_reference d) {
-  return Grid_Generator::parameter(e, d);
-}
 
-/*! \relates Grid_Generator */
-inline Grid_Generator
-grid_point(const Linear_Expression& e,
-	   Coefficient_traits::const_reference d) {
-  return Grid_Generator::point(e, d);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix representing octagonal constraints.
+/*!
+  An OR_Matrix object is a DB_Row object that allows
+  the representation of a \em pseudo-triangular matrix,
+  like the following:
+
+<PRE>
+         _ _
+   0    |_|_|
+   1    |_|_|_ _
+   2    |_|_|_|_|
+   3    |_|_|_|_|_ _
+   4    |_|_|_|_|_|_|
+   5    |_|_|_|_|_|_|
+         . . .
+         _ _ _ _ _ _       _
+ 2n-2   |_|_|_|_|_|_| ... |_|
+ 2n-1   |_|_|_|_|_|_| ... |_|
+         0 1 2 3 4 5  ... 2n-1
+
+</PRE>
+
+  It is characterized by parameter n that defines the structure,
+  and such that there are 2*n rows (and 2*n columns).
+  It provides row_iterators for the access to the rows
+  and element_iterators for the access to the elements.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+template <typename T>
+class Parma_Polyhedra_Library::OR_Matrix {
+private:
+  /*! \brief
+    An object that behaves like a matrix's row with respect to
+    the subscript operators.
+  */
+  template <typename U>
+  class Pseudo_Row {
+  public:
+    /*! \brief
+      Copy-constructor allowing the construction of a const pseudo-row
+      from a non-const pseudo-row.
+      Ordinary copy constructor.
+    */
+    template <typename V>
+    Pseudo_Row(const Pseudo_Row<V>& y);
+
+    //! Destructor.
+    ~Pseudo_Row();
+
+    //! Subscript operator.
+    U& operator[](dimension_type k) const;
+
+    //! Default constructor: creates a past-the-end object.
+    Pseudo_Row();
+
+    //! Assignment operator.
+    Pseudo_Row& operator=(const Pseudo_Row& y);
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+  private:
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  public:
+#endif
 
-} // namespace Parma_Polyhedra_Library
+#if PPL_OR_MATRIX_EXTRA_DEBUG
 
-namespace std {
+    //! Private constructor for a Pseudo_Row with size \p s beginning at \p y.
+    Pseudo_Row(U& y, dimension_type s);
 
-/*! \relates Parma_Polyhedra_Library::Grid_Generator */
-inline void
-swap(Parma_Polyhedra_Library::Grid_Generator& x,
-     Parma_Polyhedra_Library::Grid_Generator& y) {
-  x.swap(y);
-}
+#else // !PPL_OR_MATRIX_EXTRA_DEBUG
 
-} // namespace std
+    //! Private constructor for a Pseudo_Row beginning at \p y.
+    explicit Pseudo_Row(U& y);
 
-// Automatically generated from PPL source file ../src/Congruence.defs.hh line 1
-/* Congruence class declaration.
-*/
+#endif // !PPL_OR_MATRIX_EXTRA_DEBUG
 
+    //! Holds a reference to the beginning of this row.
+    U* first;
 
-// Automatically generated from PPL source file ../src/Congruence.defs.hh line 36
-#include <iosfwd>
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  private:
+#endif
 
-namespace PPL = Parma_Polyhedra_Library;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
 
-namespace Parma_Polyhedra_Library {
+    //! The size of the row.
+    dimension_type size_;
 
-namespace IO_Operators {
+    //! Returns the size of the row.
+    dimension_type size() const;
 
-//! Output operators.
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
 
-/*! \relates Parma_Polyhedra_Library::Congruence */
-std::ostream&
-operator<<(std::ostream& s, const Congruence& c);
+    template <typename V> friend class Pseudo_Row;
+    template <typename V> friend class any_row_iterator;
+    friend class OR_Matrix;
+  }; // class Pseudo_Row
 
-// Put this in the namespace here to declare it a friend later.
+public:
+  //! A (non const) reference to a matrix's row.
+  typedef Pseudo_Row<T> row_reference_type;
 
-/*! \relates Parma_Polyhedra_Library::Congruence_System */
-std::ostream&
-operator<<(std::ostream& s, const Congruence_System& cgs);
+  //! A const reference to a matrix's row.
+  typedef Pseudo_Row<const T> const_row_reference_type;
 
+private:
+  /*! \brief
+    A template class to derive both OR_Matrix::iterator
+    and OR_Matrix::const_iterator.
+  */
+  template <typename U>
+  class any_row_iterator {
+  public:
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Pseudo_Row<U> value_type;
+    typedef long difference_type;
+    typedef const Pseudo_Row<U>* pointer;
+    typedef const Pseudo_Row<U>& reference;
 
-} // namespace IO_Operators
+    //! Constructor to build past-the-end objects.
+    any_row_iterator(dimension_type n_rows);
 
-// Put these in the namespace here to declare them friend later.
+    /*! \brief
+      Builds an iterator pointing at the beginning of an OR_Matrix whose
+      first element is \p base;
+    */
+    explicit any_row_iterator(U& base);
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
-/*! \relates Congruence */
-bool
-operator==(const Congruence& x, const Congruence& y);
+    /*! \brief
+      Copy-constructor allowing the construction of a const_iterator
+      from a non-const iterator.
+    */
+    template <typename V>
+    any_row_iterator(const any_row_iterator<V>& y);
 
-//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
-/*! \relates Congruence */
-bool
-operator!=(const Congruence& x, const Congruence& y);
+    /*! \brief
+      Assignment operator allowing the assignment of a non-const iterator
+      to a const_iterator.
+    */
+    template <typename V>
+    any_row_iterator& operator=(const any_row_iterator<V>& y);
 
-//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
-/*! \relates Congruence */
-Congruence
-operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+    //! Dereference operator.
+    reference operator*() const;
 
-//! Returns the congruence \f$e = n \pmod{1}\f$.
-/*! \relates Congruence */
-Congruence
-operator%=(const Linear_Expression& e,
-	   const Coefficient_traits::const_reference n);
+    //! Indirect member selector.
+    pointer operator->() const;
 
-//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
-/*!
-    If \p cg represents the congruence \f$ e_1 = e_2
-    \pmod{m}\f$, then the result represents the
-    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
-  \relates Congruence
-*/
-Congruence
-operator/(const Congruence& cg,
-	  const Coefficient_traits::const_reference k);
+    //! Prefix increment operator.
+    any_row_iterator& operator++();
 
-//! Creates a congruence from \p c, with \p m as the modulus.
-/*! \relates Congruence */
-Congruence
-operator/(const Constraint& c,
-	  const Coefficient_traits::const_reference m);
+    //! Postfix increment operator.
+    any_row_iterator operator++(int);
 
-} // namespace Parma_Polyhedra_Library
+    //! Prefix decrement operator.
+    any_row_iterator& operator--();
 
-namespace std {
+    //! Postfix decrement operator.
+    any_row_iterator operator--(int);
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Congruence */
-void
-swap(Parma_Polyhedra_Library::Congruence& x,
-     Parma_Polyhedra_Library::Congruence& y);
+    //! Subscript operator.
+    reference operator[](difference_type m) const;
 
-} // namespace std
+    //! Assignment-increment operator.
+    any_row_iterator& operator+=(difference_type m);
 
-//! A linear congruence.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Congruence is a congruence:
-  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+    //! Assignment-decrement operator.
+    any_row_iterator& operator-=(difference_type m);
 
-  where \f$n\f$ is the dimension of the space,
-  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
-  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
-  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
-  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
-  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
-  said to be a proper congruence.
+    //! Returns the difference between \p *this and \p y.
+    difference_type operator-(const any_row_iterator& y) const;
 
-  \par How to build a congruence
-  Congruences \f$\pmod{1}\f$ are typically built by
-  applying the congruence symbol `<CODE>\%=</CODE>'
-  to a pair of linear expressions.
-  Congruences with modulus \p m
-  are typically constructed by building a congruence \f$\pmod{1}\f$
-  using the given pair of linear expressions
-  and then adding the modulus \p m
-  using the modulus symbol is `<CODE>/</CODE>'.
+    //! Returns the sum of \p *this and \p m.
+    any_row_iterator operator+(difference_type m) const;
 
-  The space dimension of a congruence is defined as the maximum
-  space dimension of the arguments of its constructor.
+    //! Returns the difference of \p *this and \p m.
+    any_row_iterator operator-(difference_type m) const;
 
-  \par
-  In the following examples it is assumed that variables
-  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
-  are defined as follows:
-  \code
-  Variable x(0);
-  Variable y(1);
-  Variable z(2);
-  \endcode
+    //! Returns <CODE>true</CODE> if and only if \p *this is equal to \p y.
+    bool operator==(const any_row_iterator& y) const;
 
-  \par Example 1
-  The following code builds the equality congruence
-  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
-  \code
-  Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
-  \endcode
-  The following code builds the congruence
-  \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
-  \code
-  Congruence mod1_cg(4*x %= 2*y - 13);
-  \endcode
-  The following code builds the congruence
-  \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
-  \code
-  Congruence mod2_cg((4*x %= 2*y - 13) / 2);
-  \endcode
-  An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
-  can be specified as follows:
-  \code
-  Congruence false_cg = Congruence::zero_dim_false();
-  \endcode
-  Equivalent, but more involved ways are the following:
-  \code
-  Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
-  Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
-  \endcode
-  In contrast, the following code defines an unsatisfiable congruence
-  having space dimension \f$3\f$:
-  \code
-  Congruence false_cg3((0*z %= 1) / 0);
-  \endcode
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this
+      is different from \p y.
+    */
+    bool operator!=(const any_row_iterator& y) const;
 
-  \par How to inspect a congruence
-  Several methods are provided to examine a congruence and extract
-  all the encoded information: its space dimension, its modulus
-  and the value of its integer coefficients.
+    //! Returns <CODE>true</CODE> if and only if \p *this is less than \p y.
+    bool operator<(const any_row_iterator& y) const;
 
-  \par Example 2
-  The following code shows how it is possible to access the modulus
-  as well as each of the coefficients.
-  Given a congruence with linear expression \p e and modulus \p m
-  (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
-  congruence with the same modulus \p m but where the linear
-  expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
-  \code
-  Congruence cg1((x - 5*y + 3*z %= 4) / 5);
-  cout << "Congruence cg1: " << cg1 << endl;
-  Coefficient m = cg1.modulus();
-  if (m == 0)
-    cout << "Congruence cg1 is an equality." << endl;
-  else {
-    Linear_Expression e;
-    for (int i = cg1.space_dimension() - 1; i >= 0; --i)
-      e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
-      e += 2 * cg1.inhomogeneous_term();
-    Congruence cg2((e %= 0) / m);
-    cout << "Congruence cg2: " << cg2 << endl;
-  }
-  \endcode
-  The actual output could be the following:
-  \code
-  Congruence cg1: A - 5*B + 3*C %= 4 / 5
-  Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
-  \endcode
-  Note that, in general, the particular output obtained can be
-  syntactically different from the (semantically equivalent)
-  congruence considered.
-*/
-class Parma_Polyhedra_Library::Congruence : private Row {
-public:
-  //! Ordinary copy-constructor.
-  Congruence(const Congruence& cg);
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is less than
+      or equal to \p y.
+    */
+    bool operator<=(const any_row_iterator& y) const;
 
-  //! Copy-constructs (modulo 0) from equality constraint \p c.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p c is a relation.
-  */
-  explicit Congruence(const Constraint& c);
+    //! Returns <CODE>true</CODE> if and only if \p *this is greater than \p y.
+    bool operator>(const any_row_iterator& y) const;
 
-  //! Destructor.
-  ~Congruence();
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is greater than
+      or equal to \p y.
+    */
+    bool operator>=(const any_row_iterator& y) const;
 
-  //! Assignment operator.
-  Congruence& operator=(const Congruence& cg);
+    dimension_type row_size() const;
 
-  //! Returns the maximum space dimension a Congruence can handle.
-  static dimension_type max_space_dimension();
+    dimension_type index() const;
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+  private:
+    //! Represents the beginning of a row.
+    Pseudo_Row<U> value;
 
-  //! Returns the coefficient of \p v in \p *this.
-  /*!
-    \exception std::invalid_argument thrown if the index of \p v
-    is greater than or equal to the space dimension of \p *this.
-  */
-  Coefficient_traits::const_reference coefficient(Variable v) const;
+    //! External index.
+    dimension_type e;
 
-  //! Returns the inhomogeneous term of \p *this.
-  Coefficient_traits::const_reference inhomogeneous_term() const;
+    //! Internal index: <CODE>i = (e+1)*(e+1)/2</CODE>.
+    dimension_type i;
 
-  //! Returns a const reference to the modulus of \p *this.
-  Coefficient_traits::const_reference modulus() const;
+    template <typename V> friend class any_row_iterator;
+  }; // class any_row_iterator
 
-  //! Multiplies \p k into the modulus of \p *this.
-  /*!
-    If called with \p *this representing the congruence \f$ e_1 = e_2
-    \pmod{m}\f$, then it returns with *this representing
-    the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
-  */
-  Congruence&
-  operator/=(const Coefficient_traits::const_reference k);
+public:
+  //! A (non const) row iterator.
+  typedef any_row_iterator<T> row_iterator;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is a trivially
-    true congruence.
+  //! A const row iterator.
+  typedef any_row_iterator<const T> const_row_iterator;
 
-    Trivially true congruences are of one the following two forms:
-    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
-    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
-    where n is the space dimension and m is the modulus.
-  */
-  bool is_trivial_true() const;
+  //! A (non const) element iterator.
+  typedef typename DB_Row<T>::iterator element_iterator;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is a trivially
-    false congruence.
+  //! A const element iterator.
+  typedef typename DB_Row<T>::const_iterator const_element_iterator;
 
-    Trivially false congruences have one of the following two forms:
-    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
-      where \f$b \neq 0\f$; or
-    - a congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
-      where \f$b \neq 0 \pmod{m}\f$.
-  */
-  bool is_trivial_false() const;
+public:
+  //! Returns the maximum number of rows of a OR_Matrix.
+  static dimension_type max_num_rows();
 
-  //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+  //! Builds a matrix with specified dimensions.
   /*!
-    A congruence with a modulus of 0 is a linear equality.
-  */
-  bool is_proper_congruence() const;
+    \param space_dim
+    The space dimension of the matrix that will be created.
 
-  //! Returns <CODE>true</CODE> if \p *this is an equality.
-  /*!
-    A modulus of zero denotes a linear equality.
+    This constructor creates a matrix with \p 2*space_dim rows.
+    Each element is initialized to plus infinity.
   */
-  bool is_equality() const;
+  OR_Matrix(dimension_type space_dim);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if \p *this is equal to \p cg in
-    dimension \p dim.
-  */
-  bool is_equal_at_dimension(dimension_type dim,
-			     const Congruence& cg) const;
+  //! Copy-constructor.
+  OR_Matrix(const OR_Matrix& y);
 
-  /*! \brief
-    Returns a reference to the true (zero-dimension space) congruence
-    \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
-    congruence</EM>.
-  */
-  static const Congruence& zero_dim_integrality();
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit OR_Matrix(const OR_Matrix<U>& y);
 
-  /*! \brief
-    Returns a reference to the false (zero-dimension space) congruence
-    \f$0 = 1 \pmod{0}\f$.
-  */
-  static const Congruence& zero_dim_false();
+  //! Destructor.
+  ~OR_Matrix();
 
-  /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
+  //! Assignment operator.
+  OR_Matrix& operator=(const OR_Matrix& y);
+
+private:
+  template <typename U> friend class OR_Matrix;
+
+  //! Contains the rows of the matrix.
+  /*!
+    A DB_Row which contains the rows of the OR_Matrix
+    inserting each successive row to the end of the vec.
+    To contain all the elements of OR_Matrix the size of the DB_Row
+    is 2*n*(n+1), where the n is the characteristic parameter of
+    OR_Matrix.
   */
-  memory_size_type total_memory_in_bytes() const;
+  DB_Row<T> vec;
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  //! Contains the dimension of the space of the matrix.
+  dimension_type space_dim;
 
-  PPL_OUTPUT_DECLARATIONS;
+  //! Contains the capacity of \p vec.
+  dimension_type vec_capacity;
+
+  //! Private and not implemented: default construction is not allowed.
+  OR_Matrix();
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Loads from \p s an ASCII representation of the internal
-    representation of \p *this.
+    Returns the index into <CODE>vec</CODE> of the first element
+    of the row of index \p k.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+  static dimension_type row_first_element_index(dimension_type k);
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+public:
+  //! Returns the size of the row of index \p k.
+  static dimension_type row_size(dimension_type k);
 
-protected:
+  //! Swaps \p *this with \p y.
+  void swap(OR_Matrix& y);
 
-  //! Normalizes the signs.
-  /*!
-    The signs of the coefficients and the inhomogeneous term are
-    normalized, leaving the first non-zero homogeneous coefficient
-    positive.
-  */
-  void sign_normalize();
 
-  //! Normalizes signs and the inhomogeneous term.
+  //! Makes the matrix grow by adding more space dimensions.
   /*!
-    Applies sign_normalize, then reduces the inhomogeneous term to the
-    smallest possible positive number.
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Adds new rows of right dimension to the end if
+    there is enough capacity; otherwise, creates a new matrix,
+    with the specified dimension, copying the old elements
+    in the upper part of the new matrix, which is
+    then assigned to \p *this.
+    Each new element is initialized to plus infinity.
   */
-  void normalize();
+  void grow(dimension_type new_dim);
 
-  //! Calls normalize, then divides out common factors.
+  //! Makes the matrix shrink by removing the last space dimensions.
   /*!
-    Strongly normalized Congruences have equivalent semantics if and
-    only if their syntaxes (as output by operator<<) are equal.
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Erases from matrix to the end the rows with index
+    greater than 2*new_dim-1.
   */
-  void strong_normalize();
+  void shrink(dimension_type new_dim);
 
-private:
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
 
-  //! Returns a reference to the modulus of \p *this.
-  Coefficient& modulus();
+    If the new dimension is greater than the old one, it adds new rows
+    of right dimension to the end if there is enough capacity; otherwise,
+    it creates a new matrix, with the specified dimension, which is
+    then assigned to \p *this.
+    If the new dimension is less than the old one, it erase from the matrix
+    the rows having index greater than 2*new_dim-1
+  */
+  void resize_no_copy(dimension_type new_dim);
 
-  //! Marks this congruence as a linear equality.
-  void set_is_equality();
+  //! Returns the space-dimension of the matrix.
+  dimension_type space_dimension() const;
 
-  //! Negates the elements from index \p start to index \p end.
-  void negate(dimension_type start, dimension_type end);
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
 
-  //! Default constructor: private and not implemented.
-  Congruence();
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  row_reference_type operator[](dimension_type k);
 
-  //! Copy-constructs with specified size and capacity.
-  Congruence(const Congruence& cg,
-	     dimension_type sz,
-	     dimension_type capacity);
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const_row_reference_type operator[](dimension_type k) const;
+  //@}
 
-  //! Constructs from a constraint, with specified size and capacity.
-  Congruence(const Constraint& c,
-	     dimension_type sz,
-	     dimension_type capacity);
 
-  //! Copy-constructs from \p cg, multiplying \p k into the modulus.
-  /*!
-    If \p cg represents the congruence \f$ e_1 = e_2
-    \pmod{m}\f$, then the result represents the
-    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  /*! \brief
+    Returns an iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
   */
-  Congruence(const Congruence& cg, Coefficient_traits::const_reference k);
-
-  //! Constructs from Linear_Expression \p le, using modulus \p m.
-  /*!
-     Builds a congruence with modulus \p m, stealing the coefficients
-     from \p le.
+  row_iterator row_begin();
 
-     \param le
-     The Linear_Expression holding the coefficients.
-
-     \param m
-     The modulus for the congruence.
+  //! Returns the past-the-end const_iterator.
+  row_iterator row_end();
 
-     \param capacity
-     If <CODE>true</CODE> then the size of the \p le row is expanded
-     and the modulus is stored in the extra space.  In this case it is
-     assumed that \p le has spare capacity of at least one element.
-     If <CODE>false</CODE> then the modulus is stored in the last
-     element of the \p le row.
+  /*! \brief
+    Returns a const row iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
   */
-  Congruence(Linear_Expression& le,
-	     Coefficient_traits::const_reference m,
-	     bool capacity = true);
+  const_row_iterator row_begin() const;
 
-  //! Swaps \p *this with \p y.
-  void swap(Congruence& y);
+  //! Returns the past-the-end const row iterator.
+  const_row_iterator row_end() const;
 
   /*! \brief
-    Throws a <CODE>std::invalid_argument</CODE> exception containing
-    error message \p message.
+    Returns an iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
   */
-  void
-  throw_invalid_argument(const char* method, const char* message) const;
+  element_iterator element_begin();
+
+  //! Returns the past-the-end const_iterator.
+  element_iterator element_end();
 
   /*! \brief
-    Throws a <CODE>std::invalid_argument</CODE> exception containing
-    the appropriate error message.
+    Returns a const element iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
   */
-  void
-  throw_dimension_incompatible(const char* method,
-			       const char* v_name,
-			       Variable v) const;
-
-  friend Congruence
-  PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+  const_element_iterator element_begin() const;
 
-  friend Congruence
-  PPL::operator%=(const Linear_Expression& e,
-		  const Coefficient_traits::const_reference n);
+  //! Returns the past-the-end const element iterator.
+  const_element_iterator element_end() const;
 
-  friend Congruence
-  PPL::operator/(const Congruence& cg,
-		 const Coefficient_traits::const_reference k);
+  //! Clears the matrix deallocating all its rows.
+  void clear();
 
-  friend Congruence
-  PPL::operator/(const Constraint& c,
-		 const Coefficient_traits::const_reference m);
+  PPL_OUTPUT_DECLARATIONS
 
-  friend bool
-  PPL::operator==(const Congruence& x, const Congruence& y);
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
 
-  friend bool
-  PPL::operator!=(const Congruence& x, const Congruence& y);
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-  friend std::ostream&
-  PPL::IO_Operators::operator<<(std::ostream& s,
-				const Congruence_System& cgs);
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-  friend class PPL::Scalar_Products;
-  friend class PPL::Congruence_System;
-  friend class PPL::Congruence_System::const_iterator;
-  // FIXME: The following friend declaration is at least for
-  //        operator[] access in Grid::conversion.
-  friend class PPL::Grid;
-  friend class PPL::Linear_Expression;
+  friend bool operator==<T>(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
 
-  friend void
-  std::swap(PPL::Congruence& x, PPL::Congruence& y);
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 };
 
-// Automatically generated from PPL source file ../src/Congruence.inlines.hh line 1
-/* Congruence class implementation: inline functions.
-*/
+namespace std {
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Parma_Polyhedra_Library::OR_Matrix<T>& x,
+	  Parma_Polyhedra_Library::OR_Matrix<T>& y);
 
-// Automatically generated from PPL source file ../src/Congruence.inlines.hh line 28
+} // namespace std
 
-#include <sstream>
 
 namespace Parma_Polyhedra_Library {
 
-inline
-Congruence::Congruence(const Congruence& cg)
-  : Row(cg) {
-}
-
-inline
-Congruence::Congruence(const Congruence& cg,
-		       dimension_type sz, dimension_type capacity)
-  : Row(cg, sz, capacity) {
-}
-
-inline
-Congruence::Congruence(const Congruence& cg,
-		       Coefficient_traits::const_reference k)
-  : Row(cg) {
-  if (k >= 0)
-    (*this)[size()-1] *= k;
-  else
-    (*this)[size()-1] *= -k;
-}
-
-inline
-Congruence::~Congruence() {
-}
-
-inline const Congruence&
-Congruence::zero_dim_integrality() {
-  static const Congruence zdi(Linear_Expression::zero() %= Coefficient(-1));
-  return zdi;
-}
-
-inline const Congruence&
-Congruence::zero_dim_false() {
-  static const Congruence
-    zdf((Linear_Expression::zero() %= Coefficient_one()) / 0);
-  return zdf;
-}
-
-inline Congruence&
-Congruence::operator=(const Congruence& c) {
-  Row::operator=(c);
-  return *this;
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
 
-/*! \relates Parma_Polyhedra_Library::Congruence */
-inline Congruence
-operator%=(const Linear_Expression& e,
-	   const Coefficient_traits::const_reference n) {
-  // Ensure that diff has capacity for the modulus.
-  Linear_Expression diff(e, e.space_dimension() + 2);
-  diff -= n;
-  Congruence cg(diff, 1, false);
-  return cg;
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
 
-/*! \relates Parma_Polyhedra_Library::Congruence */
-inline Congruence
-operator/(const Congruence& cg,
-	  const Coefficient_traits::const_reference k) {
-  Congruence ret (cg, k);
-  return ret;
-}
+  The direction of the approximation is specified by \p dir.
 
-/*! \relates Congruence */
-inline Congruence
-operator/(const Constraint& c,
-	  const Coefficient_traits::const_reference m) {
-  Congruence ret (c);
-  return ret / m;
-}
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const OR_Matrix<T>& x,
+				 const OR_Matrix<T>& y,
+				 Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
 
-inline Congruence&
-Congruence::operator/=(const Coefficient_traits::const_reference k) {
-  if (k >= 0)
-    (*this)[size()-1] *= k;
-  else
-    (*this)[size()-1] *= -k;
-  return *this;
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
 
-/*! \relates Congruence */
-inline bool
-operator==(const Congruence& x, const Congruence& y) {
-  Congruence x_temp(x);
-  Congruence y_temp(y);
-  x_temp.strong_normalize();
-  y_temp.strong_normalize();
-  return static_cast<const Row&>(x_temp) == static_cast<const Row&>(y_temp);
-}
+  The direction of the approximation is specified by \p dir.
 
-/*! \relates Congruence */
-inline bool
-operator!=(const Congruence& x, const Congruence& y) {
-  return !(x == y);
-}
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const OR_Matrix<T>& x,
+			       const OR_Matrix<T>& y,
+			       Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
 
-inline dimension_type
-Congruence::max_space_dimension() {
-  // The first coefficient holds the inhomogeneous term, while
-  // the last coefficient is for the modulus.
-  return max_size() - 2;
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
 
-inline dimension_type
-Congruence::space_dimension() const {
-  return size() - 2;
-}
+  The direction of the approximation is specified by \p dir.
 
-inline Coefficient_traits::const_reference
-Congruence::coefficient(const Variable v) const {
-  if (v.space_dimension() > space_dimension())
-    throw_dimension_incompatible("coefficient(v)", "v", v);
-  return (*this)[v.id()+1];
-}
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const OR_Matrix<T>& x,
+				 const OR_Matrix<T>& y,
+				 Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
 
-inline Coefficient_traits::const_reference
-Congruence::inhomogeneous_term() const {
-  return (*this)[0];
-}
+} // namespace Parma_Polyhedra_Library
 
-inline Coefficient_traits::const_reference
-Congruence::modulus() const {
-  assert(size() > 0);
-  return (*this)[size()-1];
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.inlines.hh line 1
+/* OR_Matrix class implementation: inline functions.
+*/
 
-inline Coefficient&
-Congruence::modulus() {
-  assert(size() > 0);
-  return (*this)[size()-1];
-}
 
-inline bool
-Congruence::is_proper_congruence() const {
-  return modulus() > 0;
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.inlines.hh line 31
+#include <cassert>
+#include <algorithm>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.inlines.hh line 34
 
-inline bool
-Congruence::is_equality() const {
-  return modulus() == 0;
-}
+namespace Parma_Polyhedra_Library {
 
-inline bool
-Congruence::is_equal_at_dimension(dimension_type dim,
-				  const Congruence& cg) const {
-  return operator[](dim) * cg.modulus() == cg[dim] * modulus();
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_first_element_index(const dimension_type k) {
+  return ((k+1)*(k+1))/2;
 }
 
-inline void
-Congruence::set_is_equality() {
-  modulus() = 0;
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_size(const dimension_type k) {
+  return (k+2) & ~dimension_type(1);
 }
 
-inline void
-Congruence::negate(dimension_type start, dimension_type end) {
-  while (start <= end)
-    neg_assign(operator[](start++));
-}
+#if PPL_OR_MATRIX_EXTRA_DEBUG
 
-inline memory_size_type
-Congruence::external_memory_in_bytes() const {
-  return Row::external_memory_in_bytes();
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::Pseudo_Row<U>::size() const {
+  return size_;
 }
 
-inline memory_size_type
-Congruence::total_memory_in_bytes() const {
-  return Row::total_memory_in_bytes();
-}
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
 
+template <typename T>
+template <typename U>
 inline
-Congruence::Congruence(Linear_Expression& le,
-		       Coefficient_traits::const_reference m,
-		       bool capacity) {
-  Row::swap(static_cast<Row&>(le));
-  if (capacity)
-    Row::expand_within_capacity(size()+1);
-  if (m >= 0)
-    (*this)[size()-1] = m;
-  else
-    (*this)[size()-1] = -m;
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row()
+  : first(0)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(0)
+#endif
+{
+  // FIXME: is zeroing necessary/wanted?
 }
 
-inline void
-Congruence::swap(Congruence& y) {
-  Row::swap(y);
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(U& y
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+		, dimension_type s
+#endif
+		)
+  : first(&y)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(s)
+#endif
+{
 }
 
-} // namespace Parma_Polyhedra_Library
-
-namespace std {
-
-/*! \relates Parma_Polyhedra_Library::Congruence */
-inline void
-swap(Parma_Polyhedra_Library::Congruence& x,
-     Parma_Polyhedra_Library::Congruence& y) {
-  x.swap(y);
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(const Pseudo_Row<V>& y)
+  : first(y.first)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    , size_(y.size_)
+#endif
+{
 }
 
-} // namespace std
-
-// Automatically generated from PPL source file ../src/Congruence.defs.hh line 473
-
-// Automatically generated from PPL source file ../src/Generator_System.inlines.hh line 1
-/* Generator_System class implementation: inline functions.
-*/
-
-
-// Automatically generated from PPL source file ../src/Generator_System.inlines.hh line 27
-
-namespace Parma_Polyhedra_Library {
-
-inline
-Generator_System::Generator_System()
-  : Linear_System(NECESSARILY_CLOSED) {
+template <typename T>
+template <typename U>
+inline OR_Matrix<T>::Pseudo_Row<U>&
+OR_Matrix<T>::Pseudo_Row<U>::operator=(const Pseudo_Row& y) {
+  first = y.first;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  size_ = y.size_;
+#endif
+  return *this;
 }
 
+template <typename T>
+template <typename U>
 inline
-Generator_System::Generator_System(const Generator& g)
-  : Linear_System(g.topology()) {
-  Linear_System::insert(g);
+OR_Matrix<T>::Pseudo_Row<U>::~Pseudo_Row() {
 }
 
-inline
-Generator_System::Generator_System(const Generator_System& gs)
-  : Linear_System(gs) {
+template <typename T>
+template <typename U>
+inline U&
+OR_Matrix<T>::Pseudo_Row<U>::operator[](const dimension_type k) const {
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  assert(k < size_);
+#endif
+  return *(first + k);
 }
 
+template <typename T>
+template <typename U>
 inline
-Generator_System::Generator_System(const Topology topol)
-  : Linear_System(topol) {
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const dimension_type n_rows)
+#if 0
+  : e(n_rows)
+#else
+  : value(),
+    e(n_rows),
+    // This zeroing will just silence an annoying compiler warning.
+    i(0)
+#endif
+{
 }
 
+template <typename T>
+template <typename U>
 inline
-Generator_System::Generator_System(const Topology topol,
-				   const dimension_type n_rows,
-				   const dimension_type n_columns)
-  : Linear_System(topol, n_rows, n_columns) {
+OR_Matrix<T>::any_row_iterator<U>::any_row_iterator(U& base)
+  :  value(base
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+	   , OR_Matrix<T>::row_size(0)
+#endif
+	   ),
+     e(0),
+     i(0) {
 }
 
+template <typename T>
+template <typename U>
+template <typename V>
 inline
-Generator_System::~Generator_System() {
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const any_row_iterator<V>& y)
+  : value(y.value),
+    e(y.e),
+    i(y.i) {
 }
 
-inline Generator_System&
-Generator_System::operator=(const Generator_System& y) {
-  Linear_System::operator=(y);
+template <typename T>
+template <typename U>
+template <typename V>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator=(const any_row_iterator<V>& y) {
+  value = y.value;
+  e = y.e;
+  i = y.i;
   return *this;
 }
 
-inline dimension_type
-Generator_System::max_space_dimension() {
-  return Linear_System::max_space_dimension();
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::reference
+OR_Matrix<T>::any_row_iterator<U>::operator*() const {
+  return value;
 }
 
-inline dimension_type
-Generator_System::space_dimension() const {
-  return Linear_System::space_dimension();
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::pointer
+OR_Matrix<T>::any_row_iterator<U>::operator->() const {
+  return &value;
 }
 
-inline void
-Generator_System::clear() {
-  Linear_System::clear();
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator++() {
+  ++e;
+  dimension_type increment = e;
+  if (e % 2) {
+    ++increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    value.size_ += 2;
+#endif
+  }
+  i += increment;
+  value.first += increment;
+  return *this;
 }
 
-inline Generator&
-Generator_System::operator[](const dimension_type k) {
-  return static_cast<Generator&>(Linear_System::operator[](k));
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator++(int) {
+  any_row_iterator old = *this;
+  ++(*this);
+  return old;
 }
 
-inline const Generator&
-Generator_System::operator[](const dimension_type k) const {
-  return static_cast<const Generator&>(Linear_System::operator[](k));
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator--() {
+  dimension_type decrement = e + 1;
+  --e;
+  if (e % 2) {
+    ++decrement;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    value.size_ -= 2;
+#endif
+  }
+  i -= decrement;
+  value.first -= decrement;
+  return *this;
 }
 
-inline
-Generator_System::const_iterator::const_iterator()
-  : i(), gsp(0) {
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator--(int) {
+  any_row_iterator old = *this;
+  --(*this);
+  return old;
 }
 
-inline
-Generator_System::const_iterator::const_iterator(const const_iterator& y)
-  : i(y.i), gsp(y.gsp) {
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator+=(difference_type m) {
+  difference_type increment = m + m*m/2 + m*e;
+  if (e%2 == 0 && m%2 == 1)
+    ++increment;
+  e += m;
+  i += increment;
+  value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  // FIXME!!!
+  value.size_ = OR_Matrix::row_size(e);
+#endif
+  return *this;
 }
 
-inline
-Generator_System::const_iterator::~const_iterator() {
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator-=(difference_type m) {
+  return *this += -m;
 }
 
-inline
-Generator_System::const_iterator&
-Generator_System::const_iterator::operator=(const const_iterator& y) {
-  i = y.i;
-  gsp = y.gsp;
-  return *this;
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::difference_type
+OR_Matrix<T>::any_row_iterator<U>::operator-(const any_row_iterator& y) const {
+  return e - y.e;
 }
 
-inline const Generator&
-Generator_System::const_iterator::operator*() const {
-  return static_cast<const Generator&>(*i);
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator+(difference_type m) const {
+  any_row_iterator r = *this;
+  r += m;
+  return r;
 }
 
-inline const Generator*
-Generator_System::const_iterator::operator->() const {
-  return static_cast<const Generator*>(i.operator->());
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator-(const difference_type m) const {
+  any_row_iterator r = *this;
+  r -= m;
+  return r;
 }
 
-inline Generator_System::const_iterator&
-Generator_System::const_iterator::operator++() {
-  ++i;
-  if (!gsp->is_necessarily_closed())
-    skip_forward();
-  return *this;
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator==(const any_row_iterator& y) const {
+  return e == y.e;
 }
 
-inline Generator_System::const_iterator
-Generator_System::const_iterator::operator++(int) {
-  const const_iterator tmp = *this;
-  operator++();
-  return tmp;
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator!=(const any_row_iterator& y) const {
+  return e != y.e;
 }
 
+template <typename T>
+template <typename U>
 inline bool
-Generator_System::const_iterator::operator==(const const_iterator& y) const {
-  return i == y.i;
+OR_Matrix<T>::any_row_iterator<U>::operator<(const any_row_iterator& y) const {
+  return e < y.e;
 }
 
+template <typename T>
+template <typename U>
 inline bool
-Generator_System::const_iterator::operator!=(const const_iterator& y) const {
-  return i != y.i;
+OR_Matrix<T>::any_row_iterator<U>
+::operator<=(const any_row_iterator& y) const {
+  return e <= y.e;
 }
 
-inline
-Generator_System::const_iterator::
-const_iterator(const Linear_System::const_iterator& iter,
-	       const Generator_System& gsys)
-  : i(iter), gsp(&gsys) {
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator>(const any_row_iterator& y) const {
+  return e > y.e;
 }
 
-inline Generator_System::const_iterator
-Generator_System::begin() const {
-  const_iterator i(Linear_System::begin(), *this);
-  if (!is_necessarily_closed())
-    i.skip_forward();
-  return i;
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator>=(const any_row_iterator& y) const {
+  return e >= y.e;
 }
 
-inline Generator_System::const_iterator
-Generator_System::end() const {
-  const const_iterator i(Linear_System::end(), *this);
-  return i;
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::row_size() const {
+  return (e+2) & ~dimension_type(1);
 }
 
-inline const Generator_System&
-Generator_System::zero_dim_univ() {
-  static const Generator_System zdu(Generator::zero_dim_point());
-  return zdu;
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::index() const {
+  return e;
 }
 
-inline void
-Generator_System::swap(Generator_System& y) {
-  Linear_System::swap(y);
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_begin() {
+  return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]);
 }
 
-inline memory_size_type
-Generator_System::external_memory_in_bytes() const {
-  return Linear_System::external_memory_in_bytes();
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_end() {
+  return row_iterator(num_rows());
 }
 
-inline memory_size_type
-Generator_System::total_memory_in_bytes() const {
-  return Linear_System::total_memory_in_bytes();
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_begin() const {
+  return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]);
 }
 
-inline void
-Generator_System::simplify() {
-  Linear_System::simplify();
-  remove_invalid_lines_and_rays();
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_end() const {
+  return const_row_iterator(num_rows());
 }
 
-} // namespace Parma_Polyhedra_Library
-
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_begin() {
+  return vec.begin();
+}
 
-namespace std {
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_end() {
+  return vec.end();
+}
 
-/*! \relates Parma_Polyhedra_Library::Constraint_System */
-inline void
-swap(Parma_Polyhedra_Library::Generator_System& x,
-     Parma_Polyhedra_Library::Generator_System& y) {
-  x.swap(y);
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_begin() const {
+  return vec.begin();
 }
 
-} // namespace std
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_end() const {
+  return vec.end();
+}
 
-// Automatically generated from PPL source file ../src/Grid_Generator_System.inlines.hh line 1
-/* Grid_Generator_System class implementation: inline functions.
-*/
+template <typename T>
+inline void
+OR_Matrix<T>::swap(OR_Matrix& y) {
+  std::swap(vec, y.vec);
+  std::swap(space_dim, y.space_dim);
+  std::swap(vec_capacity, y.vec_capacity);
+}
 
+//! Returns the integer square root of \p x.
+inline unsigned long
+isqrt(unsigned long x) {
+  unsigned long r = 0;
+  for (unsigned long t = 0x40000000; t; t >>= 2) {
+    unsigned long s = r + t;
+    if (s <= x) {
+      x -= s;
+      r = s + t;
+    }
+    r >>= 1;
+  }
+  return r;
+}
 
-// Automatically generated from PPL source file ../src/Grid_Generator_System.inlines.hh line 28
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::max_num_rows() {
+  // Compute the maximum number of rows that
+  // are contained in a DB_Row that allocates
+  // a pseudo-triangular matrix.
+  dimension_type k = isqrt(2*DB_Row<T>::max_size() + 1);
+  return (k-1) & ~dimension_type(1);
+}
 
-namespace Parma_Polyhedra_Library {
+template <typename T>
+inline memory_size_type
+OR_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
+template <typename T>
 inline
-Grid_Generator_System::Grid_Generator_System()
-  : Generator_System(NECESSARILY_CLOSED) {
-  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1);
-  set_sorted(false);
+OR_Matrix<T>::OR_Matrix(const dimension_type dim)
+  : vec(2*dim*(dim+1)),
+    space_dim(dim),
+    vec_capacity(vec.size()) {
 }
 
+template <typename T>
 inline
-Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
-  : Generator_System(gs) {
+OR_Matrix<T>::~OR_Matrix() {
 }
 
-inline
-Grid_Generator_System::Grid_Generator_System(dimension_type dim)
-  : Generator_System(NECESSARILY_CLOSED) {
-  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1);
-  set_sorted(false);
+template <typename T>
+inline typename OR_Matrix<T>::row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) {
+  return row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+			    , row_size(k)
+#endif
+			    );
 }
 
-inline
-Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
-  : Generator_System(g) {
-  set_sorted(false);
+template <typename T>
+inline typename OR_Matrix<T>::const_row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) const {
+  return const_row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+				  , row_size(k)
+#endif
+				  );
 }
 
+template <typename T>
 inline dimension_type
-Grid_Generator_System::max_space_dimension() {
-  // Grid generators use an extra column for the parameter divisor.
-  return Generator_System::max_space_dimension() - 1;
+OR_Matrix<T>::space_dimension() const {
+  return space_dim;
 }
 
+template <typename T>
 inline dimension_type
-Grid_Generator_System::space_dimension() const {
-  assert(Generator_System::space_dimension() > 0);
-  // Grid generators use an extra column for the parameter divisor.
-  return Generator_System::space_dimension() - 1;
+OR_Matrix<T>::num_rows() const {
+  return 2*space_dimension();
 }
 
+template <typename T>
 inline void
-Grid_Generator_System::clear() {
-  Generator_System::clear();
-  // For grid generators, two extra columns are needed.
-  add_zero_columns(2);
-  set_sorted(false);
-  unset_pending_rows();
+OR_Matrix<T>::clear() {
+  OR_Matrix<T>(0).swap(*this);
 }
 
-inline void
-Grid_Generator_System::swap(Grid_Generator_System& y) {
-  Generator_System::swap(y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return x.space_dim == y.space_dim && x.vec == y.vec;
 }
 
-inline memory_size_type
-Grid_Generator_System::external_memory_in_bytes() const {
-  return Generator_System::external_memory_in_bytes();
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return !(x == y);
 }
 
-inline memory_size_type
-Grid_Generator_System::total_memory_in_bytes() const {
-  return Generator_System::total_memory_in_bytes();
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix& y)
+  : vec(y.vec),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size())) {
 }
 
-inline dimension_type
-Grid_Generator_System::num_generators() const {
-  return Generator_System::num_rows();
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix<U>& y)
+  : vec(),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size())) {
+  vec.construct_upward_approximation(y.vec, vec_capacity);
+  assert(OK());
 }
 
-inline dimension_type
-Grid_Generator_System::num_parameters() const {
-  return Generator_System::num_rays();
+template <typename T>
+inline OR_Matrix<T>&
+OR_Matrix<T>::operator=(const OR_Matrix& y) {
+  vec = y.vec;
+  space_dim = y.space_dim;
+  vec_capacity = compute_capacity(y.vec.size());
+  return *this;
 }
 
-inline dimension_type
-Grid_Generator_System::num_lines() const {
-  return Generator_System::num_lines();
+template <typename T>
+inline void
+OR_Matrix<T>::grow(const dimension_type new_dim) {
+  assert(new_dim >= space_dim);
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      element_iterator j = new_matrix.element_begin();
+      for (element_iterator i = element_begin(),
+	     mend = element_end(); i != mend; ++i, ++j)
+	assign_or_swap(*j, *i);
+      swap(new_matrix);
+    }
+  }
 }
 
-inline
-Grid_Generator_System::const_iterator::const_iterator()
-  : Generator_System::const_iterator() {
+template <typename T>
+inline void
+OR_Matrix<T>::shrink(const dimension_type new_dim) {
+  assert(new_dim <= space_dim);
+  const dimension_type new_size = 2*new_dim*(new_dim + 1);
+  vec.shrink(new_size);
+  space_dim = new_dim;
 }
 
-inline
-Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
-  : Generator_System::const_iterator(y) {
+template <typename T>
+inline void
+OR_Matrix<T>::resize_no_copy(const dimension_type new_dim) {
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      swap(new_matrix);
+    }
+  }
+  else if (new_dim < space_dim)
+    shrink(new_dim);
 }
 
-inline
-Grid_Generator_System::const_iterator::~const_iterator() {
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const OR_Matrix<T>& x,
+		    const OR_Matrix<T>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (typename OR_Matrix<T>::const_element_iterator
+	 i = x.element_begin(), j = y.element_begin(),
+	 mat_end = x.element_end(); i != mat_end; ++i, ++j) {
+    const T& x_i = *i;
+    const T& y_i = *j;
+    if (is_plus_infinity(x_i)) {
+      if (is_plus_infinity(y_i))
+	continue;
+      else {
+      pinf:
+	assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+	return true;
+      }
+    }
+    else if (is_plus_infinity(y_i))
+      goto pinf;
 
-inline
-Grid_Generator_System::const_iterator&
-Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
-  return static_cast<Grid_Generator_System::const_iterator&>
-    (Generator_System::const_iterator::operator=(y));
-}
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+    if (x_i > y_i) {
+      maybe_assign(tmp1p, tmp1, x_i, dir);
+      maybe_assign(tmp2p, tmp2, y_i, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_i, dir);
+      maybe_assign(tmp2p, tmp2, x_i, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    assert(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
 
-inline const Grid_Generator&
-Grid_Generator_System::const_iterator::operator*() const {
-  return static_cast<const Grid_Generator&>
-    (Generator_System::const_iterator::operator*());
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
 }
 
-inline const Grid_Generator*
-Grid_Generator_System::const_iterator::operator->() const {
-  return static_cast<const Grid_Generator*>
-    (Generator_System::const_iterator::operator->());
-}
 
-inline Grid_Generator_System::const_iterator&
-Grid_Generator_System::const_iterator::operator++() {
-  return static_cast<Grid_Generator_System::const_iterator&>
-    (Generator_System::const_iterator::operator++());
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const OR_Matrix<T>& x,
+			    const OR_Matrix<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+								    dir,
+								    tmp0,
+								    tmp1,
+								    tmp2);
 }
 
-inline Grid_Generator_System::const_iterator
-Grid_Generator_System::const_iterator::operator++(int) {
-  const const_iterator tmp = *this;
-  operator++();
-  return tmp;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const OR_Matrix<T>& x,
+			  const OR_Matrix<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+								  dir,
+								  tmp0,
+								  tmp1,
+								  tmp2);
 }
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
 inline bool
-Grid_Generator_System
-::const_iterator::operator==(const const_iterator& y) const {
-  return Generator_System::const_iterator::operator==(y);
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const OR_Matrix<T>& x,
+			   const OR_Matrix<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+								   dir,
+								   tmp0,
+								   tmp1,
+								   tmp2);
 }
 
-inline bool
-Grid_Generator_System
-::const_iterator::operator!=(const const_iterator& y) const {
-  return Generator_System::const_iterator::operator!=(y);
-}
+} // namespace Parma_Polyhedra_Library
 
-inline Grid_Generator_System::const_iterator
-Grid_Generator_System::begin() const {
-  return static_cast<Grid_Generator_System::const_iterator>
-    (Generator_System::begin());
-}
+namespace std {
 
-inline Grid_Generator_System::const_iterator
-Grid_Generator_System::end() const {
-  return static_cast<Grid_Generator_System::const_iterator>
-    (Generator_System::end());
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::OR_Matrix<T>& x,
+     Parma_Polyhedra_Library::OR_Matrix<T>& y) {
+  x.swap(y);
 }
 
-inline
-Grid_Generator_System
-::const_iterator::const_iterator(const Generator_System::const_iterator& y)
-  : Generator_System::const_iterator::const_iterator(y) {
-}
+} // namespace std
 
-inline bool
-Grid_Generator_System::has_points() const {
-  return Generator_System::has_points();
-}
 
-inline Grid_Generator&
-Grid_Generator_System::operator[](const dimension_type k) {
-  return static_cast<Grid_Generator&>(Generator_System::operator[](k));
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.templates.hh line 1
+/* OR_Matrix class implementation: non-inline template functions.
+*/
 
-inline const Grid_Generator&
-Grid_Generator_System::operator[](const dimension_type k) const {
-  return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
-}
 
-inline void
-Grid_Generator_System::ascii_dump(std::ostream& s) const {
-  return Generator_System::ascii_dump(s);
-}
+#include <iostream>
 
-inline void
-Grid_Generator_System::set_sorted(bool b) {
-  Generator_System::set_sorted(b);
-}
+namespace Parma_Polyhedra_Library {
 
-inline void
-Grid_Generator_System::unset_pending_rows() {
-  Generator_System::unset_pending_rows();
+template <typename T>
+memory_size_type
+OR_Matrix<T>::external_memory_in_bytes() const{
+  return vec.external_memory_in_bytes();
 }
 
-inline void
-Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
-  Generator_System::set_index_first_pending_row(i);
-}
+template <typename T>
+bool
+OR_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+  // The right number of cells should be in use.
+  const dimension_type dim = space_dimension();
+  if (vec.size() != 2*dim*(dim + 1)) {
+#ifndef NDEBUG
+    cerr << "OR_Matrix has a wrong number of cells:\n"
+	 << "vec.size() is " << vec.size()
+	 << ", expected size is " << 2*dim*(dim+1) << "!\n";
+#endif
+    return false;
+  }
 
-inline void
-Grid_Generator_System::resize_no_copy(const dimension_type new_n_rows,
-				      const dimension_type new_n_columns) {
-  Generator_System::resize_no_copy(new_n_rows, new_n_columns);
-}
+  // The underlying DB_Row should be OK.
+  if (!vec.OK(vec.size(), vec_capacity))
+    return false;
 
-inline dimension_type
-Grid_Generator_System::num_columns() const {
-  return Generator_System::num_columns();
+  // All checks passed.
+  return true;
 }
 
-inline void
-Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
-  return Generator_System::erase_to_end(first_to_erase);
+template <typename T>
+void
+OR_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const OR_Matrix<T>& x = *this;
+  const char separator = ' ';
+  dimension_type space = x.space_dimension();
+  s << space << separator << "\n";
+  for (const_row_iterator i = x.row_begin(),
+	 x_row_end = x.row_end(); i != x_row_end; ++i) {
+    const_row_reference_type r = *i;
+    dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      using namespace IO_Operators;
+      s << r[j] << separator;
+    }
+    s << "\n";
+  }
 }
 
-inline void
-Grid_Generator_System
-::permute_columns(const std::vector<dimension_type>& cycles) {
-  return Generator_System::permute_columns(cycles);
-}
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, OR_Matrix<T>)
 
-inline bool
-Grid_Generator_System::is_equal_to(const Grid_Generator_System y) const {
-  return operator==(static_cast<const Generator_System&>(*this),
-		    static_cast<const Generator_System&>(y));
+template <typename T>
+bool
+OR_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type space;
+  if (!(s >> space))
+    return false;
+  resize_no_copy(space);
+  for (row_iterator i = row_begin(),
+	 this_row_end = row_end(); i != this_row_end; ++i) {
+    row_reference_type r_i = *i;
+    const dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      Result r = input(r_i[j], s, ROUND_UP);
+      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+      if (!s || r == V_CVT_STR_UNK)
+	return false;
+    }
+  }
+  assert(OK());
+  return true;
 }
 
-/*! \relates Grid_Generator_System */
-inline bool
-operator==(const Grid_Generator_System& x,
-	   const Grid_Generator_System& y) {
-  return x.is_equal_to(y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const OR_Matrix<T>& m) {
+  for (typename OR_Matrix<T>::const_row_iterator m_iter = m.row_begin(),
+	 m_end = m.row_end(); m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<T>::const_row_reference_type r_m = *m_iter;
+    const dimension_type mr_size = m_iter.row_size();
+    for (dimension_type j = 0; j < mr_size; ++j)
+      s << r_m[j] << " ";
+    s << "\n";
+  }
+  return s;
 }
 
 } // namespace Parma_Polyhedra_Library
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/OR_Matrix.defs.hh line 588
 
-namespace std {
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.defs.hh line 45
+#include <vector>
+#include <cstddef>
+#include <climits>
+#include <iosfwd>
 
-/*! \relates Parma_Polyhedra_Library::Constraint_System */
-inline void
-swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
-     Parma_Polyhedra_Library::Grid_Generator_System& y) {
-  x.swap(y);
-}
+namespace Parma_Polyhedra_Library {
 
-} // namespace std
+namespace IO_Operators {
 
-// Automatically generated from PPL source file ../src/Congruence_System.inlines.hh line 1
-/* Congruence_System class implementation: inline functions.
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape
+  Writes a textual representation of \p oct on \p s:
+  <CODE>false</CODE> is written if \p oct is an empty polyhedron;
+  <CODE>true</CODE> is written if \p oct is a universe polyhedron;
+  a system of constraints defining \p oct is written otherwise,
+  all constraints separated by ", ".
 */
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const Octagonal_Shape<T>& oct);
 
+} // namespace IO_Operators
 
-// Automatically generated from PPL source file ../src/Congruence_System.inlines.hh line 27
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same octagon.
 
-namespace Parma_Polyhedra_Library {
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
 
-inline
-Congruence_System::Congruence_System()
-  : Matrix(0, 2) {
-}
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different shapes.
 
-inline
-Congruence_System::Congruence_System(const Congruence& cg)
-  : Matrix(0, 2) {
-  insert(cg);
-}
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
 
-inline
-Congruence_System::Congruence_System(const Constraint& c)
-  : Matrix(0, 2) {
-  insert(c);
-}
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline
-Congruence_System::Congruence_System(const Congruence_System& cs)
-  : Matrix(cs) {
-}
+  The direction of the approximation is specified by \p dir.
 
-inline
-Congruence_System::~Congruence_System() {
-}
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
 
-inline Congruence_System&
-Congruence_System::operator=(const Congruence_System& y) {
-  Matrix::operator=(y);
-  return *this;
-}
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline Congruence&
-Congruence_System::operator[](const dimension_type k) {
-  return static_cast<Congruence&>(Matrix::operator[](k));
-}
+  The direction of the approximation is specified by \p dir.
 
-inline const Congruence&
-Congruence_System::operator[](const dimension_type k) const {
-  return static_cast<const Congruence&>(Matrix::operator[](k));
-}
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
 
-inline dimension_type
-Congruence_System::max_space_dimension() {
-  return Matrix::max_num_columns() - 2;
-}
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline dimension_type
-Congruence_System::space_dimension() const {
-  return Matrix::num_columns() - 2;
-}
+  The direction of the approximation is specified by \p dir.
 
-inline void
-Congruence_System::clear() {
-  Matrix::clear();
-  add_zero_columns(2);		// Modulus and constant term.
-}
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
 
-inline void
-Congruence_System::insert(const Congruence& cg) {
-  insert_verbatim(cg);
-  static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
-  assert(OK());
-}
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline void
-Congruence_System::resize_no_copy(const dimension_type new_n_rows,
-				  const dimension_type new_n_columns) {
-  Matrix::resize_no_copy(new_n_rows, new_n_columns, Row::Flags());
-}
+  The direction of the approximation is specified by \p dir.
 
-inline const Congruence_System&
-Congruence_System::zero_dim_empty() {
-  static const Congruence_System zdf(Congruence::zero_dim_false());
-  return zdf;
-}
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
 
-inline
-Congruence_System::const_iterator::const_iterator()
-  : i(), csp(0) {
-}
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline
-Congruence_System::const_iterator::const_iterator(const const_iterator& y)
-  : i(y.i), csp(y.csp) {
-}
+  The direction of the approximation is specified by \p dir.
 
-inline
-Congruence_System::const_iterator::~const_iterator() {
-}
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
 
-inline Congruence_System::const_iterator&
-Congruence_System::const_iterator::operator=(const const_iterator& y) {
-  i = y.i;
-  csp = y.csp;
-  return *this;
-}
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline const Congruence&
-Congruence_System::const_iterator::operator*() const {
-  return static_cast<const Congruence&>(*i);
-}
+  The direction of the approximation is specified by \p dir.
 
-inline const Congruence*
-Congruence_System::const_iterator::operator->() const {
-  return static_cast<const Congruence*>(i.operator->());
-}
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
 
-inline Congruence_System::const_iterator&
-Congruence_System::const_iterator::operator++() {
-  ++i;
-  skip_forward();
-  return *this;
-}
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline Congruence_System::const_iterator
-Congruence_System::const_iterator::operator++(int) {
-  const const_iterator tmp = *this;
-  operator++();
-  return tmp;
-}
+  The direction of the approximation is specified by \p dir.
 
-inline bool
-Congruence_System::const_iterator::operator==(const const_iterator& y) const {
-  return i == y.i;
-}
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
 
-inline bool
-Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
-  return i != y.i;
-}
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline
-Congruence_System::const_iterator::
-const_iterator(const Matrix::const_iterator& iter,
-	       const Congruence_System& csys)
-  : i(iter), csp(&csys) {
-}
+  The direction of the approximation is specified by \p dir.
 
-inline Congruence_System::const_iterator
-Congruence_System::begin() const {
-  const_iterator i(Matrix::begin(), *this);
-  i.skip_forward();
-  return i;
-}
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
 
-inline Congruence_System::const_iterator
-Congruence_System::end() const {
-  const const_iterator i(Matrix::end(), *this);
-  return i;
-}
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
 
-inline void
-Congruence_System::swap(Congruence_System& y) {
-  Matrix::swap(y);
-}
+  The direction of the approximation is specified by \p dir.
 
-inline memory_size_type
-Congruence_System::external_memory_in_bytes() const {
-  return Matrix::external_memory_in_bytes();
-}
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
 
-inline memory_size_type
-Congruence_System::total_memory_in_bytes() const {
-  return Matrix::total_memory_in_bytes();
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as an octagonal difference.
+/*! \relates Octagonal_Shape
+  \return
+  <CODE>true</CODE> if the constraint \p c is an octagonal difference;
+  <CODE>false</CODE> otherwise.
 
-} // namespace Parma_Polyhedra_Library
+  \param c
+  The constraint to be decoded.
 
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
 
-namespace std {
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0, 1 and 2.
 
-/*! \relates Parma_Polyhedra_Library::Congruence_System */
-inline void
-swap(Parma_Polyhedra_Library::Congruence_System& x,
-     Parma_Polyhedra_Library::Congruence_System& y) {
-  x.swap(y);
-}
+  \param c_first_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the first variable having
+  a non-zero coefficient in \p c.
 
-} // namespace std
+  \param c_second_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+  then it will be set to the index of the second variable having
+  a non-zero coefficient in \p c.
 
-// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 1
-/* Scalar_Products class definition.
+  \param c_coeff
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the value of the first non-zero coefficient
+  in \p c.
+
+  \param c_term
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the right value of the inhomogeneous term
+  of \p c.
 */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool extract_octagonal_difference(const Constraint& c,
+                                  dimension_type c_space_dim,
+                                  dimension_type& c_num_vars,
+                                  dimension_type& c_first_var,
+                                  dimension_type& c_second_var,
+                                  Coefficient& c_coeff,
+                                  Coefficient& c_term);
 
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the index coherent to \p i.
+/*! \relates Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type coherent_index(dimension_type i);
 
-// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 34
+} // namespace Parma_Polyhedra_Library
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A class implementing various scalar product functions.
-/*! \ingroup PPL_CXX_interface
-  When computing the scalar product of (Linear_Row or Constraint or
-  Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
-  that the space dimension of the first object <CODE>x</CODE> is less
-  than or equal to the space dimension of the second object <CODE>y</CODE>.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Scalar_Products {
-public:
-  //! Computes the scalar product of \p x and \p y and assigns it to \p z.
-  static void assign(Coefficient& z, const Linear_Row& x, const Linear_Row& y);
-  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
-  static void assign(Coefficient& z, const Constraint& c, const Generator& g);
-  //! Computes the scalar product of \p g and \p c and assigns it to \p z.
-  static void assign(Coefficient& z, const Generator& g, const Constraint& c);
-  //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
-  static void assign(Coefficient& z,
-		     const Grid_Generator& g, const Congruence& cg);
-  //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
-  static void assign(Coefficient& z,
-		     const Congruence& cg, const Grid_Generator& g);
+//! An octagonal shape.
+/*!
+  The class template Octagonal_Shape<T> allows for the efficient
+  representation of a restricted kind of <EM>topologically closed</EM>
+  convex polyhedra called <EM>octagonal shapes</EM> (OSs, for short).
+  The name comes from the fact that, in a vector space of dimension 2,
+  bounded OSs are polygons with at most eight sides.
+  The closed affine half-spaces that characterize the OS can be expressed
+  by constraints of the form
+  \f[
+    ax_i + bx_j \leq k
+  \f]
+  where \f$a, b \in \{-1, 0, 1\}\f$ and \f$k\f$ is a rational number,
+  which are called <EM>octagonal constraints</EM>.
 
-  //! Returns the sign of the scalar product between \p x and \p y.
-  static int sign(const Linear_Row& x, const Linear_Row& y);
-  //! Returns the sign of the scalar product between \p c and \p g.
-  static int sign(const Constraint& c, const Generator& g);
-  //! Returns the sign of the scalar product between \p g and \p c.
-  static int sign(const Generator& g, const Constraint& c);
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  octagonal constraints. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
 
+  The user interface for OSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.  At the
+  interface level, octagonal constraints are specified using objects of
+  type Constraint: such a constraint is an octagonal constraint if it is
+  of the form
+    \f[
+      \pm a_i x_i \pm a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above Constraint object will be mapped
+  into a <EM>correct</EM> approximation that, depending on the expressive
+  power of the chosen template argument \p T, may loose some precision.
+  In particular, constraint objects that do not encode an octagonal
+  constraint will be simply (and safely) ignored.
+
+  For instance, a Constraint object encoding \f$3x + 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x + y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x + y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x + y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, a Constraint object encoding \f$3x - y \leq 1\f$
+  will be safely ignored in all of the above cases.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds an OS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+  Since only those constraints having the syntactic form of an
+  <EM>octagonal constraint</EM> are considered, the following code
+  will build the same OS as above (i.e., the constraints 7, 8, and 9
+  are ignored):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    cs.insert(x - 3*y <= 5);    // (7)
+    cs.insert(x - y + z <= 5);  // (8)
+    cs.insert(x + y + z <= 5);  // (9)
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Octagonal_Shape {
+private:
   /*! \brief
-    Computes the \e reduced scalar product of \p x and \p y,
-    where the \f$\epsilon\f$ coefficient of \p x is ignored,
-    and assigns the result to \p z.
-  */
-  static void reduced_assign(Coefficient& z,
-			     const Linear_Row& x, const Linear_Row& y);
-  /*! \brief
-    Computes the \e reduced scalar product of \p c and \p g,
-    where the \f$\epsilon\f$ coefficient of \p c is ignored,
-    and assigns the result to \p z.
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining an OS.
   */
-  static void reduced_assign(Coefficient& z,
-			     const Constraint& c, const Generator& g);
+#ifndef NDEBUG
+  typedef Checked_Number<T, Extended_Number_Policy> N;
+#else
+  typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+  //! The numeric base type upon which OSs are built.
+  typedef T coefficient_type_base;
+
   /*! \brief
-    Computes the \e reduced scalar product of \p g and \p c,
-    where the \f$\epsilon\f$ coefficient of \p g is ignored,
-    and assigns the result to \p z.
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining an OS.
   */
-  static void reduced_assign(Coefficient& z,
-			     const Generator& g, const Constraint& c);
-  //! \brief
-  //! Computes the \e reduced scalar product of \p g and \p cg,
-  //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
-  //! and assigns the result to \p z.
-  static void reduced_assign(Coefficient& z,
-			     const Grid_Generator& g, const Congruence& cg);
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that an OS can handle.
+  static dimension_type max_space_dimension();
 
   /*! \brief
-    Returns the sign of the \e reduced scalar product of \p x and \p y,
-    where the \f$\epsilon\f$ coefficient of \p x is ignored.
+    Returns false indicating that this domain cannot recycle constraints
   */
-  static int reduced_sign(const Linear_Row& x, const Linear_Row& y);
+  static bool can_recycle_constraint_systems();
+
   /*! \brief
-    Returns the sign of the \e reduced scalar product of \p c and \p g,
-    where the \f$\epsilon\f$ coefficient of \p c is ignored.
+    Returns false indicating that this domain cannot recycle congruences
   */
-  static int reduced_sign(const Constraint& c, const Generator& g);
-  /*! \brief
-    Returns the sign of the \e reduced scalar product of \p g and \p c,
-    where the \f$\epsilon\f$ coefficient of \p g is ignored.
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds an universe or empty OS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the OS;
+
+    \param kind
+    Specifies whether the universe or the empty OS has to be built.
   */
-  static int reduced_sign(const Generator& g, const Constraint& c);
+  explicit Octagonal_Shape(dimension_type num_dimensions = 0,
+                           Degenerate_Element kind = UNIVERSE);
 
-  /*! \brief
-    Computes the \e homogeneous scalar product of \p x and \p y,
-    where the inhomogeneous terms are ignored,
-    and assigns the result to \p z.
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
   */
-  static void homogeneous_assign(Coefficient& z,
-				 const Linear_Row& x, const Linear_Row& y);
-  /*! \brief
-    Computes the \e homogeneous scalar product of \p e and \p g,
-    where the inhomogeneous terms are ignored,
-    and assigns the result to \p z.
+  Octagonal_Shape(const Octagonal_Shape& x,
+                  Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
   */
-  static void homogeneous_assign(Coefficient& z,
-				 const Linear_Expression& e,
-				 const Generator& g);
-  //! \brief
-  //! Computes the \e homogeneous scalar product of \p g and \p cg,
-  //! where the inhomogeneous terms are ignored,
-  //! and assigns the result to \p z.
-  static void homogeneous_assign(Coefficient& z,
-				 const Grid_Generator& g, const Congruence& cg);
-  //! \brief
-  //! Computes the \e homogeneous scalar product of \p e and \p g,
-  //! where the inhomogeneous terms are ignored,
-  //! and assigns the result to \p z.
-  static void homogeneous_assign(Coefficient& z,
-				 const Linear_Expression& e,
-				 const Grid_Generator& g);
+  template <typename U>
+  explicit Octagonal_Shape(const Octagonal_Shape<U>& y,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
 
-  /*! \brief
-    Returns the sign of the \e homogeneous scalar product of \p x and \p y,
-    where the inhomogeneous terms are ignored.
+  //! Builds an OS from the system of constraints \p cs.
+  /*!
+    The OS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref Octagonal_Shapes "octagonal constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints \p cs contains strict inequalities.
   */
-  static int homogeneous_sign(const Linear_Row& x, const Linear_Row& y);
-  /*! \brief
-    Returns the sign of the \e homogeneous scalar product of \p e and \p g,
-    where the inhomogeneous terms are ignored.
+  explicit Octagonal_Shape(const Constraint_System& cs);
+
+  //! Builds an OS from a system of congruences.
+  /*!
+    The OS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences: some elements may be safely ignored.
   */
-  static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
-  //! \brief
-  //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
-  //! where the inhomogeneous terms are ignored,
-  static int homogeneous_sign(const Linear_Expression& e,
-			      const Grid_Generator& g);
-};
+  explicit Octagonal_Shape(const Congruence_System& cgs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Scalar product sign function object depending on topology.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
-public:
-  //! Constructs the function object according to the topology of \p c.
-  Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
-  //! Constructs the function object according to the topology of \p g.
-  Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+  //! Builds an OS from the system of generators \p gs.
+  /*!
+    Builds the smallest OS containing the polyhedron defined by \p gs.
+    The OS inherits the space dimension of \p gs.
 
-  //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
-  int operator()(const Constraint&, const Generator&) const;
-  //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
-  int operator()(const Generator&, const Constraint&) const;
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Octagonal_Shape(const Generator_System& gs);
 
-private:
-  //! The type of the scalar product sign function pointer.
-  typedef int (*SPS_type)(const Linear_Row&, const Linear_Row&);
+  //! Builds an OS from the polyhedron \p ph.
+  /*!
+    Builds an OS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the OS built is the
+    smallest one containing \p ph.
+  */
+  explicit Octagonal_Shape(const Polyhedron& ph,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
 
-  //! The scalar product sign function pointer.
-  SPS_type sps_fp;
-};
+  //! Builds an OS out of a box.
+  /*!
+    The OS inherits the space dimension of the box.
+    The built OS is the most precise OS that includes the box.
 
-// Automatically generated from PPL source file ../src/Scalar_Products.inlines.hh line 1
-/* Scalar_Products class implementation (inline functions).
-*/
+    \param box
+    The bounding box representing the BDS to be built.
 
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-// Automatically generated from PPL source file ../src/Scalar_Products.inlines.hh line 32
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Octagonal_Shape(const Box<Interval>& box,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
 
-namespace Parma_Polyhedra_Library {
+  //! Builds an OS that approximates a grid.
+  /*!
+    The OS inherits the space dimension of the grid.
+    The built OS is the most precise OS that includes the grid.
 
-inline int
-Scalar_Products::sign(const Linear_Row& x, const Linear_Row& y) {
-  TEMP_INTEGER(z);
-  assign(z, x, y);
-  return sgn(z);
-}
+    \param grid
+    The grid used to build the OS.
 
-inline int
-Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) {
-  TEMP_INTEGER(z);
-  reduced_assign(z, x, y);
-  return sgn(z);
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-inline int
-Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& y) {
-  TEMP_INTEGER(z);
-  homogeneous_assign(z, x, y);
-  return sgn(z);
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Octagonal_Shape(const Grid& grid,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
 
-inline int
-Scalar_Products::sign(const Constraint& c, const Generator& g) {
-  return sign(static_cast<const Linear_Row&>(c),
-	      static_cast<const Linear_Row&>(g));
-}
+  //! Builds an OS from a bd shape.
+  /*!
+    The OS inherits the space dimension of the bd shape.
+    The built OS is the most precise OS that includes the bd shape.
 
-inline int
-Scalar_Products::sign(const Generator& g, const Constraint& c) {
-  return sign(static_cast<const Linear_Row&>(g),
-	      static_cast<const Linear_Row&>(c));
-}
+    \param bd
+    The bd shape used to build the OS.
 
-inline int
-Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
-  return reduced_sign(static_cast<const Linear_Row&>(c),
-		      static_cast<const Linear_Row&>(g));
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-inline int
-Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
-  return reduced_sign(static_cast<const Linear_Row&>(g),
-		      static_cast<const Linear_Row&>(c));
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const BD_Shape<U>& bd,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
 
-inline void
-Scalar_Products::homogeneous_assign(Coefficient& z,
-				    const Linear_Expression& e,
-				    const Generator& g) {
-  homogeneous_assign(z,
-		     static_cast<const Linear_Row&>(e),
-		     static_cast<const Linear_Row&>(g));
-}
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Octagonal_Shape& operator=(const Octagonal_Shape& y);
 
-inline void
-Scalar_Products::homogeneous_assign(Coefficient& z,
-				    const Linear_Expression& e,
-				    const Grid_Generator& g) {
-  homogeneous_assign(z,
-		     static_cast<const Linear_Row&>(e),
-		     static_cast<const Linear_Row&>(g));
-}
+  /*! \brief
+    Swaps \p *this with octagon \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  void swap(Octagonal_Shape& y);
 
-inline int
-Scalar_Products::homogeneous_sign(const Linear_Expression& e,
-				  const Generator& g) {
-  return homogeneous_sign(static_cast<const Linear_Row&>(e),
-			  static_cast<const Linear_Row&>(g));
-}
+  //! Destructor.
+  ~Octagonal_Shape();
 
-inline int
-Scalar_Products::homogeneous_sign(const Linear_Expression& e,
-				  const Grid_Generator& g) {
-  return homogeneous_sign(static_cast<const Linear_Row&>(e),
-			  static_cast<const Linear_Row&>(g));
-}
+  //@} Constructors, Assignment, Swap and Destructor
 
-inline
-Topology_Adjusted_Scalar_Product_Sign
-::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
-  : sps_fp(c.is_necessarily_closed()
-	   ? static_cast<SPS_type>(&Scalar_Products::sign)
-	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
-}
+  //! \name Member Functions that Do Not Modify the Octagonal_Shape
+  //@{
 
-inline
-Topology_Adjusted_Scalar_Product_Sign
-::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
-  : sps_fp(g.is_necessarily_closed()
-	   ? static_cast<SPS_type>(&Scalar_Products::sign)
-	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
-}
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-inline int
-Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
-						  const Generator& g) const {
-  assert(c.space_dimension() <= g.space_dimension());
-  assert(sps_fp == (c.is_necessarily_closed()
-		    ? static_cast<SPS_type>(&Scalar_Products::sign)
-		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
-  return sps_fp(static_cast<const Linear_Row&>(c),
-		static_cast<const Linear_Row&>(g));
-}
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
 
-inline int
-Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
-						  const Constraint& c) const {
-  assert(g.space_dimension() <= c.space_dimension());
-  assert(sps_fp == (g.is_necessarily_closed()
-		    ? static_cast<SPS_type>(&Scalar_Products::sign)
-		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
-  return sps_fp(static_cast<const Linear_Row&>(g),
-		static_cast<const Linear_Row&>(c));
-}
+  //! Returns the system of constraints defining \p *this.
+  Constraint_System constraints() const;
 
-} // namespace Parma_Polyhedra_Library
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
 
-// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 181
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
 
-// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 1
-/* LP_Problem class declaration.
-*/
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
 
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Octagonal_Shape& y) const;
 
-// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 34
-#include <vector>
-#include <map>
-#include <iosfwd>
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Octagonal_Shape& y) const;
 
-//! A Linear Programming problem.
-/*! \ingroup PPL_CXX_interface */
-class Parma_Polyhedra_Library::LP_Problem {
-public:
-  //! Default constructor: builds a trivial LP problem.
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
   /*!
-    The trivial LP problem requires to maximize the objective function
-    \f$0\f$ on the zero-dimensional vector space under no constraints
-    at all: the origin of the vector space is the optimal solution.
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
   */
-  LP_Problem();
+  bool is_disjoint_from(const Octagonal_Shape& y) const;
 
   /*! \brief
-    Builds an LP problem from the constraint system \p cs, the objective
-    function \p obj and optimization mode \p mode.
-
-    \param cs
-    The constraint system defining the feasible region for the LP problem.
+    Returns the relations holding between \p *this and the constraint \p c.
 
-    \param obj
-    The objective function for the LP problem (optional argument with
-    default value \f$0\f$).
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
 
-    \param mode
-    The optimization mode (optional argument with default value
-    <CODE>MAXIMIZATION</CODE>).
+  /*! \brief
+    Returns the relations holding between \p *this and the congruence \p cg.
 
     \exception std::invalid_argument
-    Thrown if the constraint system contains any strict inequality
-    or if the space dimension of the objective function is strictly
-    greater than the space dimension of the constraint system.
+    Thrown if \p *this and \p cg are dimension-incompatible.
   */
-  explicit LP_Problem(const Constraint_System& cs,
-		      const Linear_Expression& obj = Linear_Expression::zero(),
-		      Optimization_Mode mode = MAXIMIZATION);
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
 
-  //! Ordinary copy-constructor.
-  LP_Problem(const LP_Problem& y);
+  /*! \brief
+    Returns the relations holding between \p *this and the generator \p g.
 
-  //! Destructor.
-  ~LP_Problem();
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
 
-  //! Assignment operator.
-  LP_Problem& operator=(const LP_Problem& y);
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty OS.
+  bool is_empty() const;
 
-  //! Returns the maximum space dimension a LP_Problem can handle.
-  static dimension_type max_space_dimension();
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe OS.
+  bool is_universe() const;
 
-  //! Returns the space dimension of the current LP problem.
-  dimension_type space_dimension() const;
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
 
-  //! Returns the constraints defining the current feasible region.
-  const Constraint_System& constraints() const;
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded OS.
+  */
+  bool is_bounded() const;
 
-  //! Returns the current objective function.
-  const Linear_Expression& objective_function() const;
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
 
-  //! Returns the current optimization mode.
-  Optimization_Mode optimization_mode() const;
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains (at least) an integer point.
+  */
+  bool contains_integer_point() const;
 
-  //! Resets \p *this to be equal to the trivial LP problem.
-  void clear();
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
 
   /*! \brief
-    Adds a copy of constraint \p c to the current LP problem,
-    increasing the number of space dimensions if needed.
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
 
     \exception std::invalid_argument
-    Thrown if the constraint \p c is a strict inequality.
+    Thrown if \p expr and \p *this are dimension-incompatible.
   */
-  void add_constraint(const Constraint& c);
+  bool bounds_from_above(const Linear_Expression& expr) const;
 
   /*! \brief
-    Adds a copy of the constraints in \p cs to the current LP problem,
-    increasing the number of space dimensions if needed.
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
 
     \exception std::invalid_argument
-    Thrown if the constraint system \p cs contains any strict inequality.
+    Thrown if \p expr and \p *this are dimension-incompatible.
   */
-  void add_constraints(const Constraint_System& cs);
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
 
-  //! Sets the objective function to \p obj.
-  /*!
     \exception std::invalid_argument
-    Thrown if the space dimension of \p obj is strictly greater than
-    the space dimension of \p *this.
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
   */
-  void set_objective_function(const Linear_Expression& obj);
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
 
-  //! Sets the optimization mode to \p mode.
-  void set_optimization_mode(Optimization_Mode mode);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
 
-  //! Checks satisfiability of \p *this.
-  /*!
-    \return
-    <CODE>true</CODE> if and only if the LP problem is satisfiable.
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
   */
-  bool is_satisfiable() const;
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
 
-  //! Optimizes the current LP problem using the primal simplex algorithm.
-  /*!
-    \return
-    An LP_Problem_Status flag indicating the outcome of the optimization
-    attempt (unfeasible, unbounded or optimized problem).
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
   */
-  LP_Problem_Status solve() const;
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
 
   /*! \brief
-    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
-    of evaluating the objective function on \p evaluating_point.
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
 
-    \param evaluating_point
-    The point on which the objective function will be evaluated.
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-    \param num
-    On exit will contain the numerator of the evaluated value.
+    \param inf_n
+    The numerator of the infimum value;
 
-    \param den
-    On exit will contain the denominator of the evaluated value.
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p evaluating_point are dimension-incompatible
-    or if the generator \p evaluating_point is not a point.
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
   */
-  void evaluate_objective_function(const Generator& evaluating_point,
-				   Coefficient& num,
-				   Coefficient& den) const;
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
 
-  //! Returns a feasible point for \p *this, if it exists.
-  /*!
-    \exception std::domain_error
-    Thrown if the LP problem is not satisfiable.
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Octagonal_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Octagonal_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    defining \p *this.
+
+    \param c
+    The constraint to be added. If it is not an octagonal constraint, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is a strict inequality.
   */
-  const Generator& feasible_point() const;
+  void add_constraint(const Constraint& c);
 
-  //! Returns an optimal point for \p *this, if it exists.
-  /*!
-    \exception std::domain_error
-    Thrown if \p *this doesn't not have an optimizing point, i.e.,
-    if the LP problem is unbounded or not satisfiable.
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not octagonal
+    constraints will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
   */
-  const Generator& optimizing_point() const;
+  void add_constraints(const Constraint_System& cs);
 
   /*! \brief
-    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
-    the solution of the optimization problem.
-
-    \exception std::domain_error
-    Thrown if \p *this doesn't not have an optimizing point, i.e.,
-    if the LP problem is unbounded or not satisfiable.
-  */
-  void optimal_value(Coefficient& num, Coefficient& den) const;
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
 
-  PPL_OUTPUT_DECLARATIONS;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
-
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
-
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  void add_recycled_constraints(Constraint_System& cs);
 
-  //! Swaps \p *this with \p y.
-  void swap(LP_Problem& y);
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
 
-private:
-  //! The matrix encoding the current feasible region in tableau form.
-  Matrix tableau;
-  //! The working cost function.
-  Row working_cost;
-  //! The current basic solution.
-  std::vector<dimension_type> base;
-  //! A mapping between original variables and split ones.
-  /*!
-    Contains all the pairs (i, j) such that Variable(i) (that was not found
-    to be constrained in sign) has been split into two nonnegative variables.
-    The "positive" one is represented again by Variable(i), and
-    the "negative" one is represented by Variable(j).
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
   */
-  std::map<dimension_type, dimension_type> dim_map;
+  void add_congruence(const Congruence& cg);
 
-  //! An enumerated type describing the internal status of the LP problem.
-  enum Status {
-    //! The LP problem has not been solved yet.
-    UNSOLVED,
-    //! The LP problem is unsatisfiable.
-    UNSATISFIABLE,
-    //! The LP problem is satisfiable; a feasible solution has been computed.
-    SATISFIABLE,
-    //! The LP problem is unbounded; a feasible solution has been computed.
-    UNBOUNDED,
-    //! The LP problem is optimized; an optimal solution has been computed.
-    OPTIMIZED,
-    /*! \brief
-      The feasible region of the LP problem has been changed by adding
-      new constraints; a feasible solution for the old constraints has
-      been computed.
-    */
-    PARTIALLY_SATISFIABLE
-  };
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
 
-  //! The internal state of the LP problem.
-  Status status;
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
 
-  //! The constraint system describing the feasible region.
-  Constraint_System input_cs;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
 
-  //! The objective function to be optimized.
-  Linear_Expression input_obj_function;
+  // FIXME
+  /*! \brief
+    Adds the congruences in \p cs to the system of congruences
+    of \p *this (without minimizing the result).
 
-  //! The optimization mode requested.
-  Optimization_Mode opt_mode;
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
 
-  //! The last successfully computed feasible or optimizing point.
-  Generator last_generator;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  /*! \brief
-    Optimizes the current LP problem using the second phase of the
-    primal simplex algorithm.
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
   */
-  void second_phase();
+  void add_recycled_congruences(Congruence_System& cgs);
 
   /*! \brief
-    Assigns to \p this->tableau a simplex tableau representing the
-    current LP problem, inserting into \p this->dim_map the information
-    that is required to recover the original LP problem.
+    Uses a copy of constraint \p c to refine the system of octagonal
+    constraints defining \p *this.
 
-    \return
-    <CODE>UNFEASIBLE_LP_PROBLEM</CODE> if the constraint system contains
-    any trivially unfeasible constraint (tableau was not computed);
-    <CODE>UNBOUNDED_LP_PROBLEM</CODE> if the problem is trivially unbounded
-    (the computed tableau contains no constraints);
-    <CODE>OPTIMIZED_LP_PROBLEM></CODE> if the problem is neither trivially
-    unfeasible nor trivially unbounded (the tableau was computed successfully).
+    \param c
+    The constraint. If it is not a octagonal constraint, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
   */
-  LP_Problem_Status compute_tableau();
+  void refine_with_constraint(const Constraint& c);
 
   /*! \brief
-    Checks for optimality and, if it does not hold, computes the column
-    index of the variable entering the base of the LP problem.
-    Implemented with anti-cycling rule.
+    Uses a copy of congruence \p cg to refine the system of
+    octagonal constraints  of \p *this.
 
-    \return
-    The column index of the variable that enters the base. If no such
-    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+    \param cg
+    The congruence. If it is not a octagonal equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
   */
-  dimension_type get_entering_var_index() const;
+  void refine_with_congruence(const Congruence& cg);
 
   /*! \brief
-    Computes the row index of the variable exiting the base
-    of the LP problem. Implemented with anti-cycling rules.
+    Uses a copy of the constraints in \p cs to refine the system of
+    octagonal constraints defining \p *this.
 
-    \return
-    The row index of the variable exiting the base.
+    \param  cs
+    The constraint system to be used. Constraints that are not octagonal
+    are ignored.
 
-    \param entering_var_index
-    The column index of the variable entering the base.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
   */
-  dimension_type
-  get_exiting_base_index(dimension_type entering_var_index) const;
-
-  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
-  /*!
-    \param x
-    The Row that will be combined with \p y object.
+  void refine_with_constraints(const Constraint_System& cs);
 
-    \param y
-    The Row that will be combined with \p x object.
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    octagonal constraints defining \p *this.
 
-    \param k
-    The position of \p *this that have to be \f$0\f$.
+    \param  cgs
+    The congruence system to be used. Congruences that are not octagonal
+    equalities are ignored.
 
-    Computes a linear combination of \p x and \p y having
-    the element of index \p k equal to \f$0\f$. Then it assigns
-    the resulting Linear_Row to \p x and normalizes it.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
   */
-  static void linear_combine(Row& x, const Row& y, const dimension_type k);
+  void refine_with_congruences(const Congruence_System& cgs);
 
   /*! \brief
-    Swaps two variables in base during the simplex algorithm,
-    performing the needed linear combinations.
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
 
-    \param entering_var_index
-    The index of the variable entering the base.
+    \param var
+    The space dimension that will be unconstrained.
 
-    \param exiting_base_index
-    The index of the row exiting the base.
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
   */
-  void swap_base(const dimension_type entering_var_index,
-		 const dimension_type exiting_base_index);
+  void unconstrain(Variable var);
 
   /*! \brief
-    Checks for optimality and, if it does not hold, computes the column
-    index of the variable entering the base of the LP problem.
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
 
-    \return
-    The column index of the variable that enters the base. If no such
-    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
 
-    To compute the entering_index, the steepest edge algorithm chooses
-    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
-    largest in absolute value, where
-    \f[
-      \|\Delta x^{j} \|
-        = \left(
-            1+\sum_{i=1}^{m} \alpha_{ij}^2
-          \right)^{\frac{1}{2}}.
-    \f]
-    Recall that, due to the Integer implementation of the algorithm, our
-    tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
-    can be computed dividing the value of the cofficient by the value of
-    the variable in base. Obviously the result may not be an Integer, so
-    we will proceed in another way: the following code will compute the
-    lcm of all the variables in base to get the good ``weight'' of each
-    Coefficient of the tableau.
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
   */
-  dimension_type steepest_edge() const;
+  void unconstrain(const Variables_Set& to_be_unconstrained);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and if only the algorithm successfully
-    computed a feasible solution.
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-  bool compute_simplex();
+  void intersection_assign(const Octagonal_Shape& y);
 
   /*! \brief
-    Adds the slack variables to satisfy the standard form of a LP problem,
-    inserts the "sign" to the cost functions, and makes the
-    necessary swaps to express the problem with the 1st phase base.
-  */
-  void prepare_first_phase();
+    Assigns to \p *this the smallest OS that contains
+    the convex union of \p *this and \p y.
 
-  /*! \brief
-    Drop unnecessary slack variables from the tableau and get ready
-    for the second phase of the simplex algorithm.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-  void erase_slacks();
+  void oct_hull_assign(const Octagonal_Shape& y);
 
-  bool is_in_base(const dimension_type var_index,
-		  dimension_type& row_index) const;
+  //! Same as oct_hull_assign.
+  void upper_bound_assign(const Octagonal_Shape& y);
 
-  Generator compute_generator() const;
-};
+  /*! \brief
+    If the oct-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
 
-// Automatically generated from PPL source file ../src/LP_Problem.inlines.hh line 1
-/* LP_Problem class implementation: inline functions.
-*/
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool oct_hull_assign_if_exact(const Octagonal_Shape& y);
 
+  //! Same as oct_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const Octagonal_Shape& y);
 
-// Automatically generated from PPL source file ../src/LP_Problem.inlines.hh line 28
-#include <stdexcept>
+  /*! \brief
+    Assigns to \p *this the smallest octagon containing the set difference
+    of \p *this and \p y.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void oct_difference_assign(const Octagonal_Shape& y);
 
-inline
-LP_Problem::LP_Problem()
-  : tableau(), working_cost(0, Row::Flags()),
-    base(),  dim_map(), status(OPTIMIZED),
-    input_cs(), input_obj_function(), opt_mode(MAXIMIZATION),
-    last_generator(point()) {
-  assert(OK());
-}
+  //! Same as oct_difference_assign.
+  void difference_assign(const Octagonal_Shape& y);
 
-inline
-LP_Problem::LP_Problem(const Constraint_System& cs,
-		       const Linear_Expression& obj,
-		       const Optimization_Mode mode)
-  : tableau(), working_cost(0, Row::Flags()),
-    base(), dim_map(), status(UNSOLVED),
-    input_cs(!cs.has_strict_inequalities()
-	     ? cs
-	     : (throw std::invalid_argument("PPL::LP_Problem::"
-			   "LP_Problem(cs, obj, m):\n"
-			   "cs contains strict inequalities."),
-		cs)),
-    input_obj_function(obj.space_dimension() <= cs.space_dimension()
-		       ? obj
-		       : (throw std::invalid_argument("PPL::LP_Problem::"
-			             "LP_Problem(cs, obj, m):\n"
-				     "cs and obj have "
-				     "incompatible space dimensions."),
-			  obj)),
-    opt_mode(mode),
-    last_generator(point()) {
-  assert(OK());
-}
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
 
-inline
-LP_Problem::LP_Problem(const LP_Problem& y)
-  : tableau(y.tableau), working_cost(y.working_cost),
-    base(y.base), dim_map(y.dim_map), status(y.status),
-    input_cs(y.input_cs), input_obj_function(y.input_obj_function),
-    opt_mode(y.opt_mode), last_generator(y.last_generator) {
-  assert(OK());
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Octagonal_Shape& y);
 
-inline
-LP_Problem::~LP_Problem() {
-}
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
 
-inline void
-LP_Problem::swap(LP_Problem& y) {
-  std::swap(tableau, y.tableau);
-  std::swap(working_cost, y.working_cost);
-  std::swap(base, y.base);
-  std::swap(dim_map, y.dim_map);
-  std::swap(status, y.status);
-  std::swap(input_cs, y.input_cs);
-  std::swap(input_obj_function, y.input_obj_function);
-  std::swap(opt_mode, y.opt_mode);
-  std::swap(last_generator, y.last_generator);
-}
+    \param var
+    The variable to which the affine expression is assigned.
 
-inline LP_Problem&
-LP_Problem::operator=(const LP_Problem& y) {
-  LP_Problem tmp(y);
-  swap(tmp);
-  return *this;
-}
+    \param expr
+    The numerator of the affine expression.
 
-inline dimension_type
-LP_Problem::max_space_dimension() {
-  return Constraint_System::max_space_dimension();
-}
+    \param denominator
+    The denominator of the affine expression.
 
-inline dimension_type
-LP_Problem::space_dimension() const {
-  return input_cs.space_dimension();
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference  denominator
+                    = Coefficient_one());
 
-inline const Constraint_System&
-LP_Problem::constraints() const {
-  return input_cs;
-}
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
 
-inline const Linear_Expression&
-LP_Problem::objective_function() const {
-  return input_obj_function;
-}
+    \param var
+    The variable to which the affine expression is substituted.
 
-inline Optimization_Mode
-LP_Problem::optimization_mode() const {
-  return opt_mode;
-}
+    \param expr
+    The numerator of the affine expression.
 
-inline void
-LP_Problem::clear() {
-  LP_Problem tmp;
-  swap(tmp);
-}
+    \param denominator
+    The denominator of the affine expression.
 
-inline void
-LP_Problem::add_constraint(const Constraint& c) {
-  if (c.is_strict_inequality())
-    throw std::invalid_argument("PPL::LP_Problem::add_constraint(c):\n"
-				"c is a strict inequality.");
-  input_cs.insert(c);
-  if (status != UNSATISFIABLE)
-    // TODO: apply an incremental version of the simplex algorithm,
-    // setting `status' to PARTIALLY_SATISFIABLE;
-    status = UNSOLVED;
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
 
-inline void
-LP_Problem::add_constraints(const Constraint_System& cs) {
-  if (cs.has_strict_inequalities())
-    throw std::invalid_argument("PPL::LP_Problem::add_constraints(cs):\n"
-				"cs contains strict inequalities.");
-  const dimension_type cs_num_rows = cs.num_rows();
-  for (dimension_type i = cs_num_rows; i-- > 0; )
-    input_cs.insert(cs[i]);
-  if (status != UNSATISFIABLE)
-    // TODO: apply an incremental version of the simplex algorithm,
-    // setting `status' to PARTIALLY_SATISFIABLE;
-    status = UNSOLVED;
-  assert(OK());
-}
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-inline void
-LP_Problem::set_objective_function(const Linear_Expression& obj) {
-  if (space_dimension() < obj.space_dimension())
-    throw std::invalid_argument("PPL::LP_Problem::"
-				"set_objective_function(obj):\n"
-				"*this and obj are dimension incompatible.");
-  switch (status) {
-  case UNBOUNDED:
-    status = SATISFIABLE;
-    break;
-  case OPTIMIZED:
-    status = SATISFIABLE;
-    break;
-  default:
-    break;
-  }
-  input_obj_function = obj;
-  assert(OK());
-}
+    \param var
+    The left hand side variable of the generalized affine transfer function.
 
-inline void
-LP_Problem::set_optimization_mode(Optimization_Mode mode) {
-  if (opt_mode == mode)
-    return;
-  switch (status) {
-  case UNBOUNDED:
-    status = SATISFIABLE;
-    break;
-  case OPTIMIZED:
-    status = SATISFIABLE;
-    break;
-  default:
-    break;
-  }
-  opt_mode = mode;
-  assert(OK());
-}
+    \param relsym
+    The relation symbol.
 
-inline LP_Problem_Status
-LP_Problem::solve() const {
-  if (is_satisfiable()) {
-    LP_Problem& x = const_cast<LP_Problem&>(*this);
-    x.second_phase();
-    if (x.status == UNBOUNDED)
-      return UNBOUNDED_LP_PROBLEM;
-    if (x.status == OPTIMIZED)
-      return OPTIMIZED_LP_PROBLEM;
-  }
-  return UNFEASIBLE_LP_PROBLEM;
-}
+    \param expr
+    The numerator of the right hand side affine expression.
 
-inline const Generator&
-LP_Problem::feasible_point() const {
-  if (is_satisfiable()) {
-    assert(OK());
-    return last_generator;
-  }
-  throw std::domain_error("PPL::LP_Problem::feasible_point():\n"
-			  "*this is not satisfiable.");
-}
+    \param denominator
+    The denominator of the right hand side affine expression.
 
-inline const Generator&
-LP_Problem::optimizing_point() const {
-  if (solve() == OPTIMIZED_LP_PROBLEM)
-    return last_generator;
-  throw std::domain_error("PPL::LP_Problem::optimizing_point():\n"
-			  "*this doesn't have an optimizing point.");
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
 
-inline void
-LP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
-  const Generator& g_ref = optimizing_point();
-  evaluate_objective_function(g_ref, num, den);
-  assert(OK());
-}
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-inline memory_size_type
-LP_Problem::external_memory_in_bytes() const {
-  memory_size_type n
-    = tableau.external_memory_in_bytes()
-    + working_cost.external_memory_in_bytes()
-    + input_cs.external_memory_in_bytes()
-    + input_obj_function.external_memory_in_bytes()
-    + last_generator.external_memory_in_bytes();
-  // Adding the external memory for `base'.
-  n += base.capacity() * sizeof(dimension_type);
-  // Adding the external memory for `dim_map'.
-  // CHECK ME: just a lower approximation?
-  n += dim_map.size()
-    * sizeof(std::map<dimension_type, dimension_type>::value_type);
-  return n;
-}
+    \param lhs
+    The left hand side affine expression.
 
-inline memory_size_type
-LP_Problem::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+    \param relsym
+    The relation symbol.
 
-} // namespace Parma_Polyhedra_Library
+    \param rhs
+    The right hand side affine expression.
 
-namespace std {
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
 
-/*! \relates Parma_Polyhedra_Library::LP_Problem */
-inline void
-swap(Parma_Polyhedra_Library::LP_Problem& x,
-     Parma_Polyhedra_Library::LP_Problem& y) {
-  x.swap(y);
-}
+    /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-} // namespace std
+    \param var
+    The variable updated by the affine relation;
 
-// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 393
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-// Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 1
-/* Poly_Gen_Relation class declaration.
-*/
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-// Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 28
-#include <iosfwd>
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
 
-namespace Parma_Polyhedra_Library {
+/*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-// Put them in the namespace here to declare them friend later.
+    \param var
+    The left hand side variable of the generalized affine transfer function.
 
-//! True if and only if \p x and \p y are logically equivalent.
-/*! \relates Poly_Gen_Relation */
-bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+    \param relsym
+    The relation symbol.
 
-//! True if and only if \p x and \p y are not logically equivalent.
-/*! \relates Poly_Gen_Relation */
-bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+    \param expr
+    The numerator of the right hand side affine expression.
 
-//! Yields the logical conjunction of \p x and \p y.
-/*! \relates Poly_Gen_Relation */
-Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
-			     const Poly_Gen_Relation& y);
+    \param denominator
+    The denominator of the right hand side affine expression.
 
-/*! \brief
-  Yields the assertion with all the conjuncts of \p x
-  that are not in \p y.
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
 
-  \relates Poly_Gen_Relation
-*/
-Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
-			    const Poly_Gen_Relation& y);
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-namespace IO_Operators {
+    \param lhs
+    The left hand side affine expression;
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
-std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+    \param relsym
+    The relation symbol;
 
-} // namespace IO_Operators
+    \param rhs
+    The right hand side affine expression.
 
-} // namespace Parma_Polyhedra_Library
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
 
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-//! The relation between a polyhedron and a generator
-/*! \ingroup PPL_CXX_interface
-  This class implements conjunctions of assertions on the relation
-  between a polyhedron and a generator.
-*/
-class Parma_Polyhedra_Library::Poly_Gen_Relation {
-private:
-  //! Poly_Gen_Relation is implemented by means of a finite bitset.
-  typedef unsigned int flags_t;
+         \param var
+    The variable updated by the affine relation;
 
-  //! \name Bit-masks for the individual assertions
-  //@{
-  static const flags_t NOTHING  = 0U;
-  static const flags_t SUBSUMES = 1U << 0;
-  //@} // Bit-masks for the individual assertions
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-  //! All assertions together.
-  static const flags_t EVERYTHING
-  = SUBSUMES;
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-  //! This holds the current bitset.
-  flags_t flags;
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-  //! True if and only if the conjunction \p x implies the conjunction \p y.
-  static bool implies(flags_t x, flags_t y);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
 
-  //! Construct from a bit-mask.
-  Poly_Gen_Relation(flags_t mask);
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
 
-  friend bool
-  Parma_Polyhedra_Library::operator==(const Poly_Gen_Relation& x,
-				      const Poly_Gen_Relation& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Octagonal_Shape& y);
 
-  friend bool
-  Parma_Polyhedra_Library::operator!=(const Poly_Gen_Relation& x,
-				      const Poly_Gen_Relation& y);
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
 
-  friend Poly_Gen_Relation
-  Parma_Polyhedra_Library::operator&&(const Poly_Gen_Relation& x,
-				      const Poly_Gen_Relation& y);
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
 
-  friend Poly_Gen_Relation
-  Parma_Polyhedra_Library::operator-(const Poly_Gen_Relation& x,
-				     const Poly_Gen_Relation& y);
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
 
-  friend std::ostream&
-  Parma_Polyhedra_Library::
-  IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-public:
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Access the internal flags: this is needed for some foreign
-    language interfaces.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
   */
-#endif
-  flags_t get_flags() const;
+  void CC76_extrapolation_assign(const Octagonal_Shape& y, unsigned* tp = 0);
 
-public:
-  //! The assertion that says nothing.
-  static Poly_Gen_Relation nothing();
-
-  //! Adding the generator would not change the polyhedron.
-  static Poly_Gen_Relation subsumes();
-
-  PPL_OUTPUT_DECLARATIONS;
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
 
-  //! True if and only if \p *this implies \p y.
-  bool implies(const Poly_Gen_Relation& y) const;
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
+    \param first
+    An iterator that points to the first stop_point.
 
-// Automatically generated from PPL source file ../src/Poly_Gen_Relation.inlines.hh line 1
-/* Poly_Gen_Relation class implementation: inline functions.
-*/
+    \param last
+    An iterator that points to the last stop_point.
 
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
 
-inline
-Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
-  : flags(mask) {
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" between \p *this and \p y.
 
-inline Poly_Gen_Relation::flags_t
-Poly_Gen_Relation::get_flags() const {
-  return flags;
-}
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
 
-inline Poly_Gen_Relation
-Poly_Gen_Relation::nothing() {
-  return Poly_Gen_Relation(NOTHING);
-}
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-inline Poly_Gen_Relation
-Poly_Gen_Relation::subsumes() {
-  return Poly_Gen_Relation(SUBSUMES);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
 
-inline bool
-Poly_Gen_Relation::implies(flags_t x, flags_t y) {
-  return (x & y) == y;
-}
+  //! Same as BHMZ05_widening_assign(y, tp).
+  void widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
 
-inline bool
-Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
-  return implies(flags, y.flags);
-}
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-/*! \relates Poly_Gen_Relation */
-inline bool
-operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
-  return x.flags == y.flags;
-}
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
 
-/*! \relates Poly_Gen_Relation */
-inline bool
-operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
-  return x.flags != y.flags;
-}
+    \param cs
+    The system of constraints used to improve the widened OS.
 
-/*! \relates Poly_Gen_Relation */
-inline Poly_Gen_Relation
-operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
-  return Poly_Gen_Relation(x.flags | y.flags);
-}
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-/*! \relates Poly_Gen_Relation */
-inline Poly_Gen_Relation
-operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
-  return Poly_Gen_Relation(x.flags & ~y.flags);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if there is in \p cs a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
 
-} // namespace Parma_Polyhedra_Library
+  /*! \brief
+    Restores from \p y the constraints of \p *this, lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
 
-// Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 142
+    \param y
+    An OS that <EM>must</EM> contain \p *this.
 
-// Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 1
-/* BHRZ03_Certificate class declaration.
-*/
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_narrowing_assign(const Octagonal_Shape& y);
 
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-// Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 29
-#include <cassert>
-#include <vector>
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
 
-//! The convergence certificate for the BHRZ03 widening operator.
-/*! \ingroup PPL_CXX_interface
-  Convergence certificates are used to instantiate the BHZ03 framework
-  so as to define widening operators for the finite powerset domain.
+    \param cs
+    The system of constraints used to improve the widened OS.
 
-  \note
-  Each convergence certificate has to be used together with a
-  compatible widening operator. In particular, BHRZ03_Certificate
-  can certify the convergence of both the BHRZ03 and the H79 widenings.
-*/
-class Parma_Polyhedra_Library::BHRZ03_Certificate {
-public:
-  //! Default constructor.
-  BHRZ03_Certificate();
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-  //! Constructor: computes the certificate for \p ph.
-  BHRZ03_Certificate(const Polyhedron& ph);
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
 
-  //! Copy constructor.
-  BHRZ03_Certificate(const BHRZ03_Certificate& y);
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
 
-  //! Destructor.
-  ~BHRZ03_Certificate();
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-  //! The comparison function for certificates.
+  //! Adds \p m new dimensions and embeds the old OS into the new space.
   /*!
-    \return
-    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
-    is smaller than, equal to, or greater than \p y, respectively.
+    \param m
+    The number of dimensions to add.
 
-    Compares \p *this with \p y, using a total ordering which is a
-    refinement of the limited growth ordering relation for the
-    BHRZ03 widening.
+    The new dimensions will be those having the highest indexes in the new OS,
+    which is characterized by a system of constraints in which the variables
+    running through the new dimensions are not constrained.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
   */
-  int compare(const BHRZ03_Certificate& y) const;
-
-  //! Compares \p *this with the certificate for polyhedron \p ph.
-  int compare(const Polyhedron& ph) const;
+  void add_space_dimensions_and_embed(dimension_type m);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Returns <CODE>true</CODE> if and only if the certificate for
-    polyhedron \p ph is strictly smaller than \p *this.
+    Adds \p m new dimensions to the OS
+    and does not embed it in the new space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes
+    in the new OS, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool is_stabilizing(const Polyhedron& ph) const;
+  void add_space_dimensions_and_project(dimension_type m);
 
-  //! A total ordering on BHRZ03 certificates.
-  /*! \ingroup PPL_CXX_interface
-    This binary predicate defines a total ordering on BHRZ03 certificates
-    which is used when storing information about sets of polyhedra.
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
   */
-  struct Compare {
-    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
-    bool operator()(const BHRZ03_Certificate& x,
-		    const BHRZ03_Certificate& y) const;
-  };
+  void concatenate_assign(const Octagonal_Shape& y);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! Check if gathered information is meaningful.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool OK() const;
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
 
-private:
-  //! Affine dimension of the polyhedron.
-  dimension_type affine_dim;
-  //! Dimension of the lineality space of the polyhedron.
-  dimension_type lin_space_dim;
-  //! Cardinality of a non-redundant constraint system for the polyhedron.
-  dimension_type num_constraints;
-  /*! \brief
-    Number of non-redundant points in a generator system
-    for the polyhedron.
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
   */
-  dimension_type num_points;
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
   /*! \brief
-    A vector containing, for each index `0 <= i < space_dim',
-    the number of non-redundant rays in a generator system of the
-    polyhedron having exactly `i' null coordinates.
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
   */
-  std::vector<dimension_type> num_rays_null_coord;
-};
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-// Automatically generated from PPL source file ../src/BHRZ03_Certificate.inlines.hh line 1
-/* BHRZ03_Certificate class implementation: inline functions.
-*/
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
 
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
 
-namespace Parma_Polyhedra_Library {
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
 
-inline
-BHRZ03_Certificate::BHRZ03_Certificate()
-  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
-    num_rays_null_coord() {
-  // This is the certificate for a zero-dim universe polyhedron.
-  assert(OK());
-}
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
 
-inline
-BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
-  : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
-    num_constraints(y.num_constraints), num_points(y.num_points),
-    num_rays_null_coord(y.num_rays_null_coord) {
-}
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
 
-inline
-BHRZ03_Certificate::~BHRZ03_Certificate() {
-}
+    \param m
+    The number of replicas to be created.
 
-inline bool
-BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
-  return compare(ph) == 1;
-}
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
 
-inline bool
-BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
-					const BHRZ03_Certificate& y) const {
-  // For an efficient evaluation of the multiset ordering based
-  // on this lgo relation, we want larger elements to come first.
-  return x.compare(y) == 1;
-}
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-} // namespace Parma_Polyhedra_Library
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
 
-// Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 116
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
 
-// Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 1
-/* H79_Certificate class declaration.
-*/
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
 
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
 
-// Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 29
-#include <cassert>
-#include <vector>
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-//! A convergence certificate for the H79 widening operator.
-/*! \ingroup PPL_CXX_interface
-  Convergence certificates are used to instantiate the BHZ03 framework
-  so as to define widening operators for the finite powerset domain.
-  \note
-  The convergence of the H79 widening can also be certified by
-  BHRZ03_Certificate.
-*/
-class Parma_Polyhedra_Library::H79_Certificate {
-public:
-  //! Default constructor.
-  H79_Certificate();
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  //! Constructor: computes the certificate for \p ph.
-  template <typename PH>
-  H79_Certificate(const PH& ph);
+  PPL_OUTPUT_DECLARATIONS
 
-  //! Constructor: computes the certificate for \p ph.
-  H79_Certificate(const Polyhedron& ph);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-  //! Copy constructor.
-  H79_Certificate(const H79_Certificate& y);
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-  //! Destructor.
-  ~H79_Certificate();
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-  //! The comparison function for certificates.
-  /*!
-    \return
-    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
-    is smaller than, equal to, or greater than \p y, respectively.
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
 
-    Compares \p *this with \p y, using a total ordering which is a
-    refinement of the limited growth ordering relation for the
-    H79 widening.
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
   */
-  int compare(const H79_Certificate& y) const;
-
-  //! Compares \p *this with the certificate for polyhedron \p ph.
-  template <typename PH>
-  int compare(const PH& ph) const;
+  int32_t hash_code() const;
 
-  //! Compares \p *this with the certificate for polyhedron \p ph.
-  int compare(const Polyhedron& ph) const;
+  friend bool
+  operator==<T>(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
 
-  //! A total ordering on H79 certificates.
-  /*! \ingroup PPL_CXX_interface
-    This binary predicate defines a total ordering on H79 certificates
-    which is used when storing information about sets of polyhedra.
-  */
-  struct Compare {
-    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
-    bool operator()(const H79_Certificate& x,
-		    const H79_Certificate& y) const;
-  };
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
 
 private:
-  //! Affine dimension of the polyhedron.
-  dimension_type affine_dim;
-  //! Cardinality of a non-redundant constraint system for the polyhedron.
-  dimension_type num_constraints;
-};
+  template <typename U> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
 
-// Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 1
-/* H79_Certificate class implementation: inline functions.
+  //! The matrix that represents the octagonal shape.
+  OR_Matrix<N> matrix;
+
+  //! Dimension of the space of the octagonal shape.
+  dimension_type space_dim;
+
+  // Please, do not move the following include directive:
+  // `Og_Status.idefs.hh' must be included exactly at this point.
+  // And please do not remove the space separating `#' from `include':
+  // this ensures that the directive will not be moved during the
+  // procedure that automatically creates the library's include file
+  // (see `Makefile.am' in the `src' directory).
+#define PPL_IN_Octagonal_Shape_CLASS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Og_Status.idefs.hh line 1
+/* Octagonal_Shape<T>::Status class declaration.
 */
 
 
-// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 1
-/* Polyhedron class declaration.
+#ifndef PPL_IN_Octagonal_Shape_CLASS
+#error "Do not include Og_Status.idefs.hh directly; use Octagonal_Shape.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a Octagonal_Shape<T> object.
+/*!
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>strongly closed</EM>: the Octagonal_Shape object is strongly
+    closed, so that all the constraints are as tight as possible.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion.
 */
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
 
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
 
-// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 44
-#include <vector>
-#include <iosfwd>
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
 
-namespace Parma_Polyhedra_Library {
+  bool test_strongly_closed() const;
+  void reset_strongly_closed();
+  void set_strongly_closed();
+  //@}
 
-namespace IO_Operators {
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-//! Output operator.
-/*!
-  \relates Parma_Polyhedra_Library::Polyhedron
-  Writes a textual representation of \p ph on \p s:
-  <CODE>false</CODE> is written if \p ph is an empty polyhedron;
-  <CODE>true</CODE> is written if \p ph is a universe polyhedron;
-  a minimized system of constraints defining \p ph is written otherwise,
-  all constraints in one row separated by ", ".
-*/
-std::ostream&
-operator<<(std::ostream& s, const Polyhedron& ph);
+  //! \brief
+  //! Writes to \p s an ASCII representation of the internal
+  //! representation of \p *this.
+  void ascii_dump(std::ostream& s) const;
 
-} // namespace IO_Operators
+  //! \brief
+  //! Loads from \p s an ASCII representation (as produced by
+  //! ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+  //! Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  bool ascii_load(std::istream& s);
 
-/*! \brief
-  Returns <CODE>true</CODE> if and only if
-  \p x and \p y are the same polyhedron.
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
 
-  \relates Polyhedron
-  Note that \p x and \p y may be topology- and/or dimension-incompatible
-  polyhedra: in those cases, the value <CODE>false</CODE> is returned.
-*/
-bool operator==(const Polyhedron& x, const Polyhedron& y);
+  //! \name Bitmasks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV   = 0U;
+  static const flags_t EMPTY           = 1U << 0;
+  static const flags_t STRONGLY_CLOSED = 1U << 1;
+  //@}
 
-/*! \brief
-  Returns <CODE>true</CODE> if and only if
-  \p x and \p y are different polyhedra.
+  //! This holds the current bitset.
+  flags_t flags;
 
-  \relates Polyhedron
-  Note that \p x and \p y may be topology- and/or dimension-incompatible
-  polyhedra: in those cases, the value <CODE>true</CODE> is returned.
-*/
-bool operator!=(const Polyhedron& x, const Polyhedron& y);
+  //! Construct from a bitmask.
+  Status(flags_t mask);
 
-} // namespace Parma_Polyhedra_Library
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
 
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
 
-//! The base class for convex polyhedra.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Polyhedron represents a convex polyhedron
-  in the vector space \f$\Rset^n\f$.
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
 
-  A polyhedron can be specified as either a finite system of constraints
-  or a finite system of generators (see Section \ref representation)
-  and it is always possible to obtain either representation.
-  That is, if we know the system of constraints, we can obtain
-  from this the system of generators that define the same polyhedron
-  and vice versa.
-  These systems can contain redundant members: in this case we say
-  that they are not in the minimal form.
-  Most operators on polyhedra are provided with two implementations:
-  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
-  also enforces the minimization of the representations,
-  and returns the Boolean value <CODE>false</CODE> whenever
-  the resulting polyhedron turns out to be empty.
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+
+};
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.defs.hh line 1642
+#undef PPL_IN_Octagonal_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! Returns <CODE>true</CODE> if the OS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  //! Returns <CODE>true</CODE> if the OS is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
 
-  Two key attributes of any polyhedron are its topological kind
-  (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
-  and its space dimension (the dimension \f$n \in \Nset\f$ of
-  the enclosing vector space):
+  /*! \brief
+    Returns <CODE>true</CODE> if \c this->matrix is known to be
+    strongly closed.
 
-  - all polyhedra, the empty ones included, are endowed with
-    a specific topology and space dimension;
-  - most operations working on a polyhedron and another object
-    (i.e., another polyhedron, a constraint or generator,
-    a set of variables, etc.) will throw an exception if
-    the polyhedron and the object are not both topology-compatible
-    and dimension-compatible (see Section \ref representation);
-  - the topology of a polyhedron cannot be changed;
-    rather, there are constructors for each of the two derived classes
-    that will build a new polyhedron with the topology of that class
-    from another polyhedron from either class and any topology;
-  - the only ways in which the space dimension of a polyhedron can
-    be changed are:
-    - <EM>explicit</EM> calls to operators provided for that purpose;
-    - standard copy, assignment and swap operators.
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \c this->matrix is not strongly closed.
+  */
+  bool marked_strongly_closed() const;
 
-  Note that four different polyhedra can be defined on
-  the zero-dimension space:
-  the empty polyhedron, either closed or NNC,
-  and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+  //! Turns \p *this into a zero-dimensional universe OS.
+  void set_zero_dim_univ();
 
-  \par
-  In all the examples it is assumed that variables
-  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
-  used) as follows:
-  \code
-  Variable x(0);
-  Variable y(1);
-  \endcode
+  //! Turns \p *this into an empty OS.
+  void set_empty();
 
-  \par Example 1
-  The following code builds a polyhedron corresponding to
-  a square in \f$\Rset^2\f$, given as a system of constraints:
-  \code
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-  cs.insert(y >= 0);
-  cs.insert(y <= 3);
-  C_Polyhedron ph(cs);
-  \endcode
-  The following code builds the same polyhedron as above,
-  but starting from a system of generators specifying
-  the four vertices of the square:
-  \code
-  Generator_System gs;
-  gs.insert(point(0*x + 0*y));
-  gs.insert(point(0*x + 3*y));
-  gs.insert(point(3*x + 0*y));
-  gs.insert(point(3*x + 3*y));
-  C_Polyhedron ph(gs);
-  \endcode
+  //! Marks \p *this as strongly closed.
+  void set_strongly_closed();
 
-  \par Example 2
-  The following code builds an unbounded polyhedron
-  corresponding to a half-strip in \f$\Rset^2\f$,
-  given as a system of constraints:
-  \code
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  cs.insert(x - y <= 0);
-  cs.insert(x - y + 1 >= 0);
-  C_Polyhedron ph(cs);
-  \endcode
-  The following code builds the same polyhedron as above,
-  but starting from the system of generators specifying
-  the two vertices of the polyhedron and one ray:
-  \code
-  Generator_System gs;
-  gs.insert(point(0*x + 0*y));
-  gs.insert(point(0*x + y));
-  gs.insert(ray(x - y));
-  C_Polyhedron ph(gs);
-  \endcode
+  //! Marks \p *this as possibly not strongly closed.
+  void reset_strongly_closed();
 
-  \par Example 3
-  The following code builds the polyhedron corresponding to
-  a half-plane by adding a single constraint
-  to the universe polyhedron in \f$\Rset^2\f$:
-  \code
-  C_Polyhedron ph(2);
-  ph.add_constraint(y >= 0);
-  \endcode
-  The following code builds the same polyhedron as above,
-  but starting from the empty polyhedron in the space \f$\Rset^2\f$
-  and inserting the appropriate generators
-  (a point, a ray and a line).
-  \code
-  C_Polyhedron ph(2, EMPTY);
-  ph.add_generator(point(0*x + 0*y));
-  ph.add_generator(ray(y));
-  ph.add_generator(line(x));
-  \endcode
-  Note that, although the above polyhedron has no vertices, we must add
-  one point, because otherwise the result of the Minkowski's sum
-  would be an empty polyhedron.
-  To avoid subtle errors related to the minimization process,
-  it is required that the first generator inserted in an empty
-  polyhedron is a point (otherwise, an exception is thrown).
+  N& matrix_at(dimension_type i, dimension_type j);
+  const N& matrix_at(dimension_type i, dimension_type j) const;
 
-  \par Example 4
-  The following code shows the use of the function
-  <CODE>add_space_dimensions_and_embed</CODE>:
-  \code
-  C_Polyhedron ph(1);
-  ph.add_constraint(x == 2);
-  ph.add_space_dimensions_and_embed(1);
-  \endcode
-  We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
-  Then we add a single equality constraint,
-  thus obtaining the polyhedron corresponding to the singleton set
-  \f$\{ 2 \} \sseq \Rset\f$.
-  After the last line of code, the resulting polyhedron is
-  \f[
-    \bigl\{\,
-      (2, y)^\transpose \in \Rset^2
-    \bigm|
-      y \in \Rset
-    \,\bigr\}.
-  \f]
+  //! Adds the constraint <CODE>matrix[i][j] <= k</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                const N& k);
 
-  \par Example 5
-  The following code shows the use of the function
-  <CODE>add_space_dimensions_and_project</CODE>:
-  \code
-  C_Polyhedron ph(1);
-  ph.add_constraint(x == 2);
-  ph.add_space_dimensions_and_project(1);
-  \endcode
-  The first two lines of code are the same as in Example 4 for
-  <CODE>add_space_dimensions_and_embed</CODE>.
-  After the last line of code, the resulting polyhedron is
-  the singleton set
-  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+  //! Adds the constraint <CODE>matrix[i][j] <= num/den</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                Coefficient_traits::const_reference num,
+                                Coefficient_traits::const_reference den);
 
-  \par Example 6
-  The following code shows the use of the function
-  <CODE>affine_image</CODE>:
-  \code
-  C_Polyhedron ph(2, EMPTY);
-  ph.add_generator(point(0*x + 0*y));
-  ph.add_generator(point(0*x + 3*y));
-  ph.add_generator(point(3*x + 0*y));
-  ph.add_generator(point(3*x + 3*y));
-  Linear_Expression expr = x + 4;
-  ph.affine_image(x, expr);
-  \endcode
-  In this example the starting polyhedron is a square in
-  \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
-  expression is \f$x+4\f$.  The resulting polyhedron is the same
-  square translated to the right.  Moreover, if the affine
-  transformation for the same variable \p x is \f$x+y\f$:
-  \code
-  Linear_Expression expr = x + y;
-  \endcode
-  the resulting polyhedron is a parallelogram with the height equal to
-  the side of the square and the oblique sides parallel to the line
-  \f$x-y\f$.
-  Instead, if we do not use an invertible transformation for the same
-  variable; for example, the affine expression \f$y\f$:
-  \code
-  Linear_Expression expr = y;
-  \endcode
-  the resulting polyhedron is a diagonal of the square.
+  /*! \brief
+    Adds to the Octagonal_Shape the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
 
-  \par Example 7
-  The following code shows the use of the function
-  <CODE>affine_preimage</CODE>:
-  \code
-  C_Polyhedron ph(2);
-  ph.add_constraint(x >= 0);
-  ph.add_constraint(x <= 3);
-  ph.add_constraint(y >= 0);
-  ph.add_constraint(y <= 3);
-  Linear_Expression expr = x + 4;
-  ph.affine_preimage(x, expr);
-  \endcode
-  In this example the starting polyhedron, \p var and the affine
-  expression and the denominator are the same as in Example 6,
-  while the resulting polyhedron is again the same square,
-  but translated to the left.
-  Moreover, if the affine transformation for \p x is \f$x+y\f$
-  \code
-  Linear_Expression expr = x + y;
-  \endcode
-  the resulting polyhedron is a parallelogram with the height equal to
-  the side of the square and the oblique sides parallel to the line
-  \f$x+y\f$.
-  Instead, if we do not use an invertible transformation for the same
-  variable \p x, for example, the affine expression \f$y\f$:
-  \code
-  Linear_Expression expr = y;
-  \endcode
-  the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var,
+              Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
 
-  \par Example 8
-  For this example we use also the variables:
-  \code
-  Variable z(2);
-  Variable w(3);
-  \endcode
-  The following code shows the use of the function
-  <CODE>remove_space_dimensions</CODE>:
-  \code
-  Generator_System gs;
-  gs.insert(point(3*x + y +0*z + 2*w));
-  C_Polyhedron ph(gs);
-  Variables_Set to_be_removed;
-  to_be_removed.insert(y);
-  to_be_removed.insert(z);
-  ph.remove_space_dimensions(to_be_removed);
-  \endcode
-  The starting polyhedron is the singleton set
-  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
-  the resulting polyhedron is
-  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
-  Be careful when removing space dimensions <EM>incrementally</EM>:
-  since dimensions are automatically renamed after each application
-  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
-  results can be obtained.
-  For instance, by using the following code we would obtain
-  a different result:
-  \code
-  set<Variable> to_be_removed1;
-  to_be_removed1.insert(y);
-  ph.remove_space_dimensions(to_be_removed1);
-  set<Variable> to_be_removed2;
-  to_be_removed2.insert(z);
-  ph.remove_space_dimensions(to_be_removed2);
-  \endcode
-  In this case, the result is the polyhedron
-  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
-  when removing the set of dimensions \p to_be_removed2
-  we are actually removing variable \f$w\f$ of the original polyhedron.
-  For the same reason, the operator \p remove_space_dimensions
-  is not idempotent: removing twice the same non-empty set of dimensions
-  is never the same as removing them just once.
-*/
+  //! Removes all the constraints on variable \p v_id.
+  void forget_all_octagonal_constraints(dimension_type v_id);
 
-class Parma_Polyhedra_Library::Polyhedron {
-public:
-  //! Returns the maximum space dimension all kinds of Polyhedron can handle.
-  static dimension_type max_space_dimension();
+  //! Removes all binary constraints on variable \p v_id.
+  void forget_binary_octagonal_constraints(dimension_type v_id);
 
-protected:
-  //! Builds a polyhedron having the specified properties.
+  //! An helper function for the computation of affine relations.
   /*!
-    \param topol
-    The topology of the polyhedron;
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>v - u \<= k</CODE> and <CODE>v + u \<= k</CODE>,
+    starting from \p ub_v, which is an upper bound for \c v
+    computed according to \p sc_expr and \p sc_den.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>v - u \<= ub_v - lb_u</CODE> and <CODE>v + u \<= ub_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of the upper bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>v - u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
 
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the polyhedron;
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>v + u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>v + u \<= ub_v + lb_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u)</CODE>.
+  */
+  void deduce_v_pm_u_bounds(dimension_type v_id,
+                            dimension_type last_id,
+                            const Linear_Expression& sc_expr,
+                            Coefficient_traits::const_reference sc_den,
+                            const N& ub_v);
 
-    \param kind
-    Specifies whether the universe or the empty polyhedron has to be built.
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>-v + u \<= k</CODE> and <CODE>-v - u \<= k</CODE>,
+    starting from \p minus_lb_v, which is the negation of a lower bound
+    for \c v computed according to \p sc_expr and \p sc_den.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>-v - u \<= -lb_v - lb_u</CODE> and
+    <CODE>-v + u \<= -lb_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of (the negation of) the lower bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>-v + u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>-v + u \<= -lb_v + lb_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>-v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>-v - u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>-v - u \<= -lb_v - ub_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>-v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u)</CODE>.
   */
-  Polyhedron(Topology topol,
-	     dimension_type num_dimensions,
-	     Degenerate_Element kind);
+  void deduce_minus_v_pm_u_bounds(dimension_type v,
+                                  dimension_type last_v,
+                                  const Linear_Expression& sc_expr,
+                                  Coefficient_traits::const_reference sc_den,
+                                  const N& minus_lb_v);
 
-  //! Ordinary copy-constructor.
-  Polyhedron(const Polyhedron& y);
+  /*! \brief
+    Adds to \p limiting_octagon the octagonal differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_octagon(const Constraint_System& cs,
+                            Octagonal_Shape& limiting_octagon) const;
+  //! Compute the (zero-equivalence classes) successor relation.
+  /*!
+    It is assumed that the octagon is not empty and strongly closed.
+  */
+  void compute_successors(std::vector<dimension_type>& successor) const;
 
-  //! Builds a polyhedron from a system of constraints.
+  //! Compute the leaders of zero-equivalence classes.
   /*!
-    The polyhedron inherits the space dimension of the constraint system.
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& successor,
+                       std::vector<dimension_type>& no_sing_leaders,
+                       bool& exist_sing_class,
+                       dimension_type& sing_leader) const;
 
-    \param topol
-    The topology of the polyhedron;
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
 
-    \param cs
-    The system of constraints defining the polyhedron.
+  //! Removes the redundant constraints from \c this->matrix.
+  void strong_reduction_assign() const;
 
-    \exception std::invalid_argument
-    Thrown if the topology of \p cs is incompatible with \p topol.
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \c this->matrix
+    is strongly reduced.
   */
-  Polyhedron(Topology topol, const Constraint_System& cs);
+  bool is_strongly_reduced() const;
 
-  //! Builds a polyhedron recycling a system of constraints.
+  /*! \brief
+    Returns <CODE>true</CODE> if in the octagon taken two at a time
+    unary constraints, there is also the constraint that represent their sum.
+  */
+  bool is_strong_coherent() const;
+
+  bool tight_coherence_would_make_empty() const;
+
+  //! Assigns to \c this->matrix its strong closure.
   /*!
-    The polyhedron inherits the space dimension of the constraint system.
+    Strong closure is a necessary condition for the precision and/or
+    the correctness of many methods. It explicitly records into \c matrix
+    those constraints that are implicitly obtainable by the other ones,
+    therefore obtaining a canonical representation for the OS.
+  */
+  void strong_closure_assign() const;
 
-    \param topol
-    The topology of the polyhedron;
+  //! Applies the strong-coherence step to \c this->matrix.
+  void strong_coherence_assign();
 
-    \param cs
-    The system of constraints defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
+  //! Puts in \p *this all implicit constraints and computes the tighter ones.
+  /*!
+    \param var
+    The variable of the altered constraints.
+
+    The octagon `*this' was transitively closed except for the constraint on
+    variable `var'. This operation costs only \f$O(n^2)\f$.
 
-    \exception std::invalid_argument
-    Thrown if the topology of \p cs is incompatible with \p topol.
   */
-  Polyhedron(Topology topol, Constraint_System& cs);
+  void incremental_strong_closure_assign(Variable var) const;
 
-  //! Builds a polyhedron from a system of generators.
+  //! Checks if and how \p expr is bounded in \p *this.
   /*!
-    The polyhedron inherits the space dimension of the generator system.
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
 
-    \param topol
-    The topology of the polyhedron;
+    \param expr
+    The linear expression to test;
 
-    \param gs
-    The system of generators defining the polyhedron.
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
 
     \exception std::invalid_argument
-    Thrown if the topology of \p gs is incompatible with \p topol,
-    or if the system of generators is not empty but has no points.
+    Thrown if \p expr and \p *this are dimension-incompatible.
   */
-  Polyhedron(Topology topol, const Generator_System& gs);
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
 
-  //! Builds a polyhedron recycling a system of generators.
+  //! Maximizes or minimizes \p expr subject to \p *this.
   /*!
-    The polyhedron inherits the space dimension of the generator system.
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
 
-    \param topol
-    The topology of the polyhedron;
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
 
-    \param gs
-    The system of generators defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
 
     \exception std::invalid_argument
-    Thrown if the topology of \p gs is incompatible with \p topol,
-    or if the system of generators is not empty but has no points.
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d and
+    \p included are left untouched.
   */
-  Polyhedron(Topology topol, Generator_System& gs);
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
 
-  //! Builds a polyhedron out of a generic, interval-based bounding box.
+  //! Maximizes or minimizes \p expr subject to \p *this.
   /*!
-    \param topol
-    The topology of the polyhedron;
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
 
-    \param box
-    The bounding box representing the polyhedron to be built.
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
 
     \exception std::invalid_argument
-    Thrown if \p box has intervals that are incompatible with \p topol.
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-    The template class Box must provide the following methods.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the polyhedron
-    represented by the bounding box.
-    \code
-      bool is_empty() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the bounding box
-    describes the empty set.
-    The <CODE>is_empty()</CODE> method will always be called before the
-    methods below.  However, if <CODE>is_empty()</CODE> returns
-    <CODE>true</CODE>, none of the functions below will be called.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
   */
-  template <typename Box>
-  Polyhedron(Topology topol, const Box& box);
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
 
-  /*! \brief
-    The assignment operator.
-    (\p *this and \p y can be dimension-incompatible.)
-  */
-  Polyhedron& operator=(const Polyhedron& y);
 
-public:
-  //! \name Member Functions that Do Not Modify the Polyhedron
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const Octagonal_Shape<T>& c);
+
+  //! \name Exception Throwers
   //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const Octagonal_Shape& x) const;
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
 
-  /*! \brief
-    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
-    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
-    of \p *this.
-  */
-  dimension_type affine_dimension() const;
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
 
-  //! Returns the system of constraints.
-  const Constraint_System& constraints() const;
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
 
-  //! Returns the system of constraints, with no redundant constraint.
-  const Constraint_System& minimized_constraints() const;
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
 
-  //! Returns the system of generators.
-  const Generator_System& generators() const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* name_row,
+                                    const Linear_Expression& y) const;
 
-  //! Returns the system of generators, with no redundant generator.
-  const Generator_System& minimized_generators() const;
+  void throw_constraint_incompatible(const char* method) const;
 
-  /*! \brief
-    Returns the relations holding between the polyhedron \p *this
-    and the constraint \p c.
+  void throw_expression_too_complex(const char* method,
+                                    const Linear_Expression& e) const;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible.
-  */
-  Poly_Con_Relation relation_with(const Constraint& c) const;
+  void throw_generic(const char* method, const char* reason) const;
+  //@} // Exception Throwers
 
-  /*! \brief
-    Returns the relations holding between the polyhedron \p *this
-    and the generator \p g.
+  static T default_stop_points[];
+};
 
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are dimension-incompatible.
-  */
-  Poly_Gen_Relation relation_with(const Generator& g) const;
+namespace std {
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is
-    an empty polyhedron.
-  */
-  bool is_empty() const;
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::Octagonal_Shape<T>& x,
+          Parma_Polyhedra_Library::Octagonal_Shape<T>& y);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this
-    is a universe polyhedron.
-  */
-  bool is_universe() const;
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Og_Status.inlines.hh line 1
+/* Octagonal_Shape<T>::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this
-    is a topologically closed subset of the vector space.
-  */
-  bool is_topologically_closed() const;
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p x and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool is_disjoint_from(const Polyhedron& y) const;
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this
-    is a bounded polyhedron.
-  */
-  bool is_bounded() const;
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p expr is
-    bounded from above in \p *this.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
-  */
-  bool bounds_from_above(const Linear_Expression& expr) const;
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p expr is
-    bounded from below in \p *this.
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
-  */
-  bool bounds_from_below(const Linear_Expression& expr) const;
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_strongly_closed() const {
+  return test_any(STRONGLY_CLOSED);
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty
-    and \p expr is bounded from above in \p *this, in which case
-    the supremum value is computed.
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_strongly_closed() {
+  reset(STRONGLY_CLOSED);
+}
 
-    \param expr
-    The linear expression to be maximized subject to \p *this;
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_strongly_closed() {
+  set(STRONGLY_CLOSED);
+}
 
-    \param sup_n
-    The numerator of the supremum value;
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
 
-    \param sup_d
-    The denominator of the supremum value;
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
 
-    \param maximum
-    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+  // Any other case is OK.
+  return true;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
 
-    If \p *this is empty or \p expr is not bounded from above,
-    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
-    and \p maximum are left untouched.
-  */
-  bool maximize(const Linear_Expression& expr,
-		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+namespace Implementation {
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty
-    and \p expr is bounded from above in \p *this, in which case
-    the supremum value and a point where \p expr reaches it are computed.
+namespace Octagonal_Shapes {
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string strong_closed = "SC";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
 
-    \param expr
-    The linear expression to be maximized subject to \p *this;
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape<T>::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
 
-    \param sup_n
-    The numerator of the supremum value;
+} // namespace Octagonal_Shapes
 
-    \param sup_d
-    The denominator of the supremum value;
+} // namespace Implementation
 
-    \param maximum
-    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Octagonal_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ
+    << sep
+    << (test_empty() ? yes : no) << empty
+    << sep
+    << sep
+    << (test_strongly_closed() ? yes : no) << strong_closed
+    << sep;
+}
 
-    \param point
-    When maximization succeeds, will be assigned the point or
-    closure point where \p expr reaches its supremum value.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Octagonal_Shapes;
+  bool positive;
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
 
-    If \p *this is empty or \p expr is not bounded from above,
-    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
-    and \p point are left untouched.
-  */
-  bool maximize(const Linear_Expression& expr,
-		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-		Generator& point) const;
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty
-    and \p expr is bounded from below in \p *this, in which case
-    the infimum value is computed.
+  if (!get_field(s, strong_closed, positive))
+    return false;
+  if (positive)
+    set_strongly_closed();
+  else
+    reset_strongly_closed();
 
-    \param expr
-    The linear expression to be minimized subject to \p *this;
+  // Check invariants.
+  assert(OK());
+  return true;
+}
 
-    \param inf_n
-    The numerator of the infimum value;
+} // namespace Parma_Polyhedra_Library
 
-    \param inf_d
-    The denominator of the infimum value;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.inlines.hh line 1
+/* Octagonal_Shape class implementation: inline functions.
+*/
 
-    \param minimum
-    <CODE>true</CODE> if and only if the infimum is also the minimum value.
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.inlines.hh line 34
+#include <cassert>
+#include <algorithm>
 
-    If \p *this is empty or \p expr is not bounded from below,
-    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
-    and \p minimum are left untouched.
-  */
-  bool minimize(const Linear_Expression& expr,
-		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+namespace Parma_Polyhedra_Library {
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty
-    and \p expr is bounded from below in \p *this, in which case
-    the infimum value and a point where \p expr reaches it are computed.
+// FIXME: find the appropriate place for this.
+/*! \relates Octagonal_Shape */
+inline dimension_type
+coherent_index(const dimension_type i) {
+  return (i%2) ? i-1 : i+1;
+}
 
-    \param expr
-    The linear expression to be minimized subject to \p *this;
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::max_space_dimension() {
+  return OR_Matrix<N>::max_num_rows()/2;
+}
 
-    \param inf_n
-    The numerator of the infimum value;
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
 
-    \param inf_d
-    The denominator of the infimum value;
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_strongly_closed() const {
+  return status.test_strongly_closed();
+}
 
-    \param minimum
-    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
 
-    \param point
-    When minimization succeeds, will be assigned a point or
-    closure point where \p expr reaches its infimum value.
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_empty() {
+  status.set_empty();
+}
 
-    If \p *this is empty or \p expr is not bounded from below,
-    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
-    and \p point are left untouched.
-  */
-  bool minimize(const Linear_Expression& expr,
-		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-		Generator& point) const;
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_strongly_closed() {
+  status.set_strongly_closed();
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool contains(const Polyhedron& y) const;
+template <typename T>
+inline void
+Octagonal_Shape<T>::reset_strongly_closed() {
+  status.reset_strongly_closed();
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool strictly_contains(const Polyhedron& y) const;
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const dimension_type num_dimensions,
+				    const Degenerate_Element kind)
+  : matrix(num_dimensions), space_dim(num_dimensions), status() {
+  if (kind == EMPTY)
+    set_empty();
+  else if (num_dimensions > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  assert(OK());
+}
 
-  /*! \brief
-    Uses \p *this to shrink a generic, interval-based bounding box.
-    Assigns to \p box the intersection of \p box with the smallest
-    bounding box containing \p *this.
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class)
+  : matrix(y.matrix), space_dim(y.space_dim), status(y.status) {
+}
 
-    \param box
-    The bounding box to be shrunk;
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape<U>& y,
+                                    Complexity_Class)
+  : matrix(y.matrix), space_dim(y.space_dim), status() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
 
-    \param complexity
-    The complexity class of the algorithm to be used.
-
-    If the polyhedron \p *this or \p box is empty, then the empty box
-    is returned.
-
-    If \p *this and \p box are non-empty, then, for
-    each space dimension \f$k\f$ with variable \f$\mathrm{var}\f$, let
-    \f$u\f$ be the upper and \f$l\f$ the lower bound of the smallest
-    interval containing \p *this.
-
-    If \f$l\f$ is infinite, then \p box is unaltered; if \f$l\f$ is
-    finite, then the \p box interval for space dimension \f$k\f$ is
-    (destructively) intersected with \f$[l, +\mathrm{infty})\f$ if a
-    point of \p *this satisfies \f$\mathrm{var} == l\f$ and with
-    \f$(l, +\mathrm{infty})\f$ otherwise.
-
-    Similarly, if \f$u\f$ is infinite, then \p box is unaltered; if
-    \f$u\f$ is finite, then the \p box interval for space dimension
-    \f$k\f$ is (destructively) intersected with \f$(-\mathrm{infty},
-    u]\f$ if a point of \p *this satisfies \f$\mathrm{var} == u\f$ and
-    with \f$(-\mathrm{infty}, u)\f$ otherwise.
-
-    The template class Box must provide the following methods, whose
-    return values, if any, are simply ignored.
-    \code
-      set_empty()
-    \endcode
-    causes the box to become empty, i.e., to represent the empty set.
-    \code
-      raise_lower_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
-    \code
-      lower_upper_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension
-    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
-    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
-    is <CODE>false</CODE>.
-
-    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
-    will be called at most once for each possible value for <CODE>k</CODE>
-    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
-    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
-    is positive, \f$0/1\f$ being the unique representation for zero.
-    The same guarantee is offered for the function
-    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
-  */
-  template <typename Box>
-  void shrink_bounding_box(Box& box,
-			   Complexity_Class complexity = ANY_COMPLEXITY) const;
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs)
+  : matrix(cs.space_dimension()),
+    space_dim(cs.space_dimension()),
+    status() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_constraints(cs);
+}
 
-  //! Checks if all the invariants are satisfied.
-  /*!
-    \return
-    <CODE>true</CODE> if and only if \p *this satisfies all the
-    invariants and either \p check_not_empty is <CODE>false</CODE> or
-    \p *this is not empty.
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Congruence_System& cgs)
+  : matrix(cgs.space_dimension()),
+    space_dim(cgs.space_dimension()),
+    status() {
+  if (cgs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_congruences(cgs);
+  return;
+}
 
-    \param check_not_empty
-    <CODE>true</CODE> if and only if, in addition to checking the
-    invariants, \p *this must be checked to be not empty.
+template <typename T>
+template <typename Interval>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Box<Interval>& box,
+                                    Complexity_Class)
+  : matrix(box.space_dimension()),
+    space_dim(box.space_dimension()),
+    status() {
+  if (box.space_dimension() > 0)
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+  add_constraints(box.constraints());
+  return;
+}
 
-    The check is performed so as to intrude as little as possible.  If
-    the library has been compiled with run-time assertions enabled,
-    error messages are written on <CODE>std::cerr</CODE> in case
-    invariants are violated. This is useful for the purpose of
-    debugging the library.
-  */
-  bool OK(bool check_not_empty = false) const;
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Grid& grid,
+                                    Complexity_Class)
+  : matrix(grid.space_dimension()),
+    space_dim(grid.space_dimension()),
+    status() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+  add_congruences(grid.congruences());
+  return;
+}
 
-  //@} // Member Functions that Do Not Modify the Polyhedron
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const BD_Shape<U>& bd,
+                                    Complexity_Class)
+  : matrix(bd.space_dimension()),
+    space_dim(bd.space_dimension()),
+    status() {
+  if (bd.space_dimension() > 0)
+    // A (non zero-dim) universe OS is shortest-path closed.
+    set_strongly_closed();
+  add_constraints(bd.constraints());
+  return;
+}
 
-  //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
-  //@{
+template <typename T>
+inline Congruence_System
+Octagonal_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
 
-  /*! \brief
-    Adds a copy of constraint \p c to the system of constraints
-    of \p *this (without minimizing the result).
+template <typename T>
+inline Octagonal_Shape<T>&
+Octagonal_Shape<T>::operator=(const Octagonal_Shape& y) {
+  matrix = y.matrix;
+  space_dim = y.space_dim;
+  status = y.status;
+  return *this;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are topology-incompatible
-    or dimension-incompatible.
-  */
-  void add_constraint(const Constraint& c);
+template <typename T>
+inline
+Octagonal_Shape<T>::~Octagonal_Shape() {
+}
 
-  /*! \brief
-    Adds a copy of constraint \p c to the system of constraints
-    of \p *this, minimizing the result
+template <typename T>
+inline void
+Octagonal_Shape<T>::swap(Octagonal_Shape& y) {
+  std::swap(matrix, y.matrix);
+  std::swap(space_dim, y.space_dim);
+  std::swap(status, y.status);
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::space_dimension() const {
+  return space_dim;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are topology-incompatible
-    or dimension-incompatible.
-  */
-  bool add_constraint_and_minimize(const Constraint& c);
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
 
-  /*! \brief
-    Adds a copy of generator \p g to the system of generators
-    of \p *this (without minimizing the result).
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_empty() const {
+  strong_closure_assign();
+  return marked_empty();
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are topology-incompatible or
-    dimension-incompatible, or if \p *this is an empty polyhedron and
-    \p g is not a point.
-  */
-  void add_generator(const Generator& g);
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
 
-  /*! \brief
-    Adds a copy of generator \p g to the system of generators
-    of \p *this, minimizing the result.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+			     Coefficient& sup_n, Coefficient& sup_d,
+			     bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are topology-incompatible or
-    dimension-incompatible, or if \p *this is an empty polyhedron and
-    \p g is not a point.
-  */
-  bool add_generator_and_minimize(const Generator& g);
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+			     Coefficient& sup_n, Coefficient& sup_d,
+			     bool& maximum,
+			     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
 
-  /*! \brief
-    Adds a copy of congruence \p cg to the system of congruences of \p
-    *this (without minimizing the result).
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+			     Coefficient& inf_n, Coefficient& inf_d,
+			     bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and congruence \p cg are topology-incompatible
-    or dimension-incompatible.
-  */
-  void add_congruence(const Congruence& cg);
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+			     Coefficient& inf_n, Coefficient& inf_d,
+			     bool& minimum,
+			     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
 
-  /*! \brief
-    Adds a copy of the constraints in \p cs to the system
-    of constraints of \p *this (without minimizing the result).
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_topologically_closed() const {
+  return true;
+}
 
-    \param cs
-    Contains the constraints that will be added to the system of
-    constraints of \p *this.
+template <typename T>
+inline void
+Octagonal_Shape<T>::topological_closure_assign() {
+  // Nothing to be done.
+  return;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void add_constraints(const Constraint_System& cs);
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  if (x.space_dim != y.space_dim)
+    // Dimension-incompatible OSs are different.
+    return false;
 
-  /*! \brief
-    Adds the constraints in \p cs to the system of constraints
-    of \p *this (without minimizing the result).
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
 
-    \param cs
-    The constraint system that will be recycled, adding its
-    constraints to the system of constraints of \p *this.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+  // If one of two octagons is empty, then they are equal if and only if
+  // the other octagon is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Strong closure is a canonical form.
+  return x.matrix == y.matrix;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  return !(x == y);
+}
 
-    \warning
-    The only assumption that can be made on \p cs upon successful or
-    exceptional return is that it can be safely destroyed.
-  */
-  void add_recycled_constraints(Constraint_System& cs);
+template <typename T>
+inline const typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+			      const dimension_type j) const {
+  assert(i < matrix.num_rows() && j < matrix.num_rows());
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
 
-  /*! \brief
-    Adds a copy of the constraints in \p cs to the system
-    of constraints of \p *this, minimizing the result.
+template <typename T>
+inline typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+			      const dimension_type j) {
+  assert(i < matrix.num_rows() && j < matrix.num_rows());
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+inline Constraint_System
+Octagonal_Shape<T>::minimized_constraints() const {
+  strong_reduction_assign();
+  return constraints();
+}
 
-    \param cs
-    Contains the constraints that will be added to the system of
-    constraints of \p *this.
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_octagonal_constraint(const dimension_type i,
+					     const dimension_type j,
+					     const N& k) {
+  // Private method: the caller has to ensure the following.
+#ifndef NDEBUG
+  assert(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  assert(j < m_i.row_size());
+#endif
+  N& r_i_j = matrix[i][j];
+  if (r_i_j > k) {
+    r_i_j = k;
+    if (marked_strongly_closed())
+      reset_strongly_closed();
+  }
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool add_constraints_and_minimize(const Constraint_System& cs);
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::add_octagonal_constraint(const dimension_type i,
+			   const dimension_type j,
+			   Coefficient_traits::const_reference num,
+			   Coefficient_traits::const_reference den) {
+#ifndef NDEBUG
+  // Private method: the caller has to ensure the following.
+  assert(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  assert(j < m_i.row_size());
+  assert(den != 0);
+#endif
+  DIRTY_TEMP(N, k);
+  div_round_up(k, num, den);
+  add_octagonal_constraint(i, j, k);
+}
 
-  /*! \brief
-    Adds the constraints in \p cs to the system of constraints
-    of \p *this, minimizing the result.
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_constraints(const Constraint_System& cs) {
+  Constraint_System::const_iterator i_end = cs.end();
+  for (Constraint_System::const_iterator i = cs.begin(); i != i_end; ++i)
+    add_constraint(*i);
+}
 
-    \param cs
-    The constraint system that will be recycled, adding its
-    constraints to the system of constraints of \p *this.
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  add_constraints(cs);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
 
-    \warning
-    The only assumption that can be made on \p cs upon successful or
-    exceptional return is that it can be safely destroyed.
-  */
-  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  Constraint_System::const_iterator i_end = cs.end();
+  for (Constraint_System::const_iterator i = cs.begin(); i != i_end; ++i)
+    refine_with_constraint(*i);
+}
 
-  /*! \brief
-    Adds a copy of the generators in \p gs to the system
-    of generators of \p *this (without minimizing the result).
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  refine_with_constraints(cs);
+}
 
-    \param gs
-    Contains the generators that will be added to the system of
-    generators of \p *this.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are topology-incompatible or
-    dimension-incompatible, or if \p *this is empty and the system of
-    generators \p gs is not empty, but has no points.
-  */
-  void add_generators(const Generator_System& gs);
 
-  /*! \brief
-    Adds the generators in \p gs to the system of generators
-    of \p *this (without minimizing the result).
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
 
-    \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimension(nd)",
+				 new_dimension);
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from an octagon in a 0-dim space.
+  if (new_dimension == space_dim) {
+    assert(OK());
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are topology-incompatible or
-    dimension-incompatible, or if \p *this is empty and the system of
-    generators \p gs is not empty, but has no points.
+  strong_closure_assign();
+  matrix.shrink(new_dimension);
+  // When we remove all dimensions from a non-empty octagon,
+  // we obtain the zero-dimensional universe octagon.
+  if (new_dimension == 0 && !marked_empty())
+    set_zero_dim_univ();
+  space_dim = new_dimension;
+  assert(OK());
+}
 
-    \warning
-    The only assumption that can be made on \p gs upon successful or
-    exceptional return is that it can be safely destroyed.
-  */
-  void add_recycled_generators(Generator_System& gs);
+template <typename T>
+inline void
+Octagonal_Shape<T>::widening_assign(const Octagonal_Shape& y, unsigned* tp) {
+  BHMZ05_widening_assign(y, tp);
+}
 
-  /*! \brief
-    Adds a copy of the generators in \p gs to the system
-    of generators of \p *this, minimizing the result.
+template <typename T>
+inline void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+					      unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+			    stop_points,
+			    stop_points
+			    + sizeof(stop_points)/sizeof(stop_points[0]),
+			    tp);
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+inline void
+Octagonal_Shape<T>::time_elapse_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // See the polyhedra documentation.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.time_elapse_assign(py);
+  Octagonal_Shape<T> x(px);
+  swap(x);
+  assert(OK());
+}
 
-    \param gs
-    Contains the generators that will be added to the system of
-    generators of \p *this.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::strictly_contains(const Octagonal_Shape& y) const {
+  const Octagonal_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are topology-incompatible or
-    dimension-incompatible, or if \p *this is empty and the the system
-    of generators \p gs is not empty, but has no points.
-  */
-  bool add_generators_and_minimize(const Generator_System& gs);
+template <typename T>
+inline void
+Octagonal_Shape<T>::upper_bound_assign(const Octagonal_Shape& y) {
+  oct_hull_assign(y);
+}
 
-  /*! \brief
-    Adds the generators in \p gs to the system of generators
-    of \p *this, minimizing the result.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::oct_hull_assign_if_exact(const Octagonal_Shape&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+inline bool
+Octagonal_Shape<T>::upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+  return oct_hull_assign_if_exact(y);
+}
 
-    \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+template <typename T>
+inline void
+Octagonal_Shape<T>::difference_assign(const Octagonal_Shape& y) {
+  oct_difference_assign(y);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are topology-incompatible or
-    dimension-incompatible, or if \p *this is empty and the the system
-    of generators \p gs is not empty, but has no points.
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Octagonal_Shape<T>& x,
+			    const Octagonal_Shape<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
 
-    \warning
-    The only assumption that can be made on \p gs upon successful or
-    exceptional return is that it can be safely destroyed.
-  */
-  bool add_recycled_generators_and_minimize(Generator_System& gs);
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-  /*! \brief
-    Adds to \p *this constraints equivalent to the congruences in \p
-    cgs (without minimizing the result).
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
 
-    \param cgs
-    Contains the congruences that will be added to the system of
-    constraints of \p *this.
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cgs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void add_congruences(const Congruence_System& cgs);
+  return rectilinear_distance_assign(r, x.matrix, y.matrix, dir,
+				     tmp0, tmp1, tmp2);
+}
 
-  /*! \brief
-    Assigns to \p *this the intersection of \p *this and \p y.
-    The result is not guaranteed to be minimized.
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Octagonal_Shape<T>& x,
+			    const Octagonal_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  void intersection_assign(const Polyhedron& y);
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const Octagonal_Shape<T>& x,
+			    const Octagonal_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
 
-  /*! \brief
-    Assigns to \p *this the intersection of \p *this and \p y,
-    minimizing the result.
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Octagonal_Shape<T>& x,
+			  const Octagonal_Shape<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool intersection_assign_and_minimize(const Polyhedron& y);
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
 
-  /*! \brief
-    Assigns to \p *this the poly-hull of \p *this and \p y.
-    The result is not guaranteed to be minimized.
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  void poly_hull_assign(const Polyhedron& y);
+  return euclidean_distance_assign(r, x.matrix, y.matrix, dir,
+				   tmp0, tmp1, tmp2);
+}
 
-  /*! \brief
-    Assigns to \p *this the poly-hull of \p *this and \p y,
-    minimizing the result.
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Octagonal_Shape<T>& x,
+			  const Octagonal_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const Octagonal_Shape<T>& x,
+			  const Octagonal_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  bool poly_hull_assign_and_minimize(const Polyhedron& y);
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Octagonal_Shape<T>& x,
+			   const Octagonal_Shape<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
 
-  //! Same as poly_hull_assign(y).
-  void upper_bound_assign(const Polyhedron& y);
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-  /*! \brief
-    Assigns to \p *this
-    the \ref Convex_Polyhedral_Difference "poly-difference"
-    of \p *this and \p y. The result is not guaranteed to be minimized.
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  void poly_difference_assign(const Polyhedron& y);
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
 
-  //! Same as poly_difference_assign(y).
-  void difference_assign(const Polyhedron& y);
+  return l_infinity_distance_assign(r, x.matrix, y.matrix, dir,
+				    tmp0, tmp1, tmp2);
+}
 
-  /*! \brief
-    Assigns to \p *this the
-    \ref Single_Update_Affine_Functions "affine image"
-    of \p *this under the function mapping variable \p var to the
-    affine expression specified by \p expr and \p denominator.
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Octagonal_Shape<T>& x,
+			   const Octagonal_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
 
-    \param var
-    The variable to which the affine expression is assigned;
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const Octagonal_Shape<T>& x,
+			   const Octagonal_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
 
-    \param expr
-    The numerator of the affine expression;
+template <typename T>
+inline memory_size_type
+Octagonal_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-    \param denominator
-    The denominator of the affine expression (optional argument with
-    default value 1.)
+template <typename T>
+inline int32_t
+Octagonal_Shape<T>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of
-    \p *this.
+} // namespace Parma_Polyhedra_Library
 
-    \if Include_Implementation_Details
+namespace std {
 
-    When considering the generators of a polyhedron, the
-    affine transformation
-    \f[
-      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
-    \f]
-    is assigned to \p var where \p expr is
-    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
-    (\f$b\f$ is the inhomogeneous term).
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::Octagonal_Shape<T>& x,
+     Parma_Polyhedra_Library::Octagonal_Shape<T>& y) {
+  x.swap(y);
+}
 
-    If constraints are up-to-date, it uses the specialized function
-    affine_preimage() (for the system of constraints)
-    and inverse transformation to reach the same result.
-    To obtain the inverse transformation we use the following observation.
+} // namespace std
 
-    Observation:
-    -# The affine transformation is invertible if the coefficient
-       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
-       is different from zero.
-    -# If the transformation is invertible, then we can write
-       \f[
-  	 \mathrm{denominator} * {x'}_\mathrm{var}
-	   = \sum_{i = 0}^{n - 1} a_i x_i + b
-	   = a_\mathrm{var} x_\mathrm{var}
-	     + \sum_{i \neq var} a_i x_i + b,
-       \f]
-       so that the inverse transformation is
-       \f[
-	 a_\mathrm{var} x_\mathrm{var}
-           = \mathrm{denominator} * {x'}_\mathrm{var}
-             - \sum_{i \neq j} a_i x_i - b.
-       \f]
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.templates.hh line 1
+/* Octagonal_Shape class implementation: non-inline template functions.
+*/
 
-    Then, if the transformation is invertible, all the entities that
-    were up-to-date remain up-to-date. Otherwise only generators remain
-    up-to-date.
 
-    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
-    the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
-    matrix representing the points of the polyhedron and
-    \f[
-      P = \bigl\{\,
-            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
-          \bigm|
-            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
-	    \vect{\lambda} \in \Rset^{m_1}_+,
-	    \vect{\mu} \in \Rset^{m_2}_+,
-	    \sum_{i = 0}^{m_2 - 1} \mu_i = 1
-          \,\bigr\}
-    \f]
-    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
-    the resulting polyhedron is
-    \f[
-      P' = \bigl\{\,
-             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
-                     \ldots, x_{n-1})^\mathrm{T}
-           \bigm|
-             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
-           \,\bigr\}.
-    \f]
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.templates.hh line 30
+#include <cassert>
+#include <vector>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
 
-    Affine transformations are, for example:
-    - translations
-    - rotations
-    - symmetries.
-    \endif
-  */
-  void affine_image(Variable var,
-		    const Linear_Expression& expr,
-		    Coefficient_traits::const_reference denominator
-		      = Coefficient_one());
+namespace Parma_Polyhedra_Library {
 
-  /*! \brief
-    Assigns to \p *this the
-    \ref Single_Update_Affine_Functions "affine preimage"
-    of \p *this under the function mapping variable \p var to the
-    affine expression specified by \p expr and \p denominator.
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Polyhedron& ph,
+                                    const Complexity_Class complexity)
+  : matrix(0), space_dim(0), status() {
+  const dimension_type num_dimensions = ph.space_dimension();
 
-    \param var
-    The variable to which the affine expression is substituted;
+  if (ph.marked_empty()) {
+    *this = Octagonal_Shape(num_dimensions, EMPTY);
+    return;
+  }
 
-    \param expr
-    The numerator of the affine expression;
+  if (num_dimensions == 0) {
+    *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+    return;
+  }
 
-    \param denominator
-    The denominator of the affine expression (optional argument with
-    default value 1.)
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = Octagonal_Shape(ph.generators());
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  assert(ph.constraints_are_up_to_date());
 
-    \if Include_Implementation_Details
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
 
-    When considering constraints of a polyhedron, the affine transformation
-    \f[
-      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
-    \f]
-    is assigned to \p var where \p expr is
-    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
-    (\f$b\f$ is the inhomogeneous term).
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = Octagonal_Shape(num_dimensions, EMPTY);
+      return;
+    }
 
-    If generators are up-to-date, then the specialized function
-    affine_image() is used (for the system of generators)
-    and inverse transformation to reach the same result.
-    To obtain the inverse transformation, we use the following observation.
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our OSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
 
-    Observation:
-    -# The affine transformation is invertible if the coefficient
-       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
-       is different from zero.
-    -# If the transformation is invertible, then we can write
-       \f[
-  	 \mathrm{denominator} * {x'}_\mathrm{var}
-	   = \sum_{i = 0}^{n - 1} a_i x_i + b
-           = a_\mathrm{var} x_\mathrm{var}
-               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
-       \f],
-       the inverse transformation is
-       \f[
-	 a_\mathrm{var} x_\mathrm{var}
-           = \mathrm{denominator} * {x'}_\mathrm{var}
-               - \sum_{i \neq j} a_i x_i - b.
-       \f].
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality())
+          lp.add_constraint(Linear_Expression(c) >= 0);
+        else
+          lp.add_constraint(c);
+      }
 
-    Then, if the transformation is invertible, all the entities that
-    were up-to-date remain up-to-date. Otherwise only constraints remain
-    up-to-date.
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = Octagonal_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
 
-    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
-    the constraints of the polyhedron, \f$T\f$ is the affine transformation
-    to apply to \f$P\f$ and
-    \f[
-      P = \bigl\{\,
-            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
-          \bigm|
-            A\vect{x} \geq \vect{0}
-          \,\bigr\}.
-    \f]
-    The resulting polyhedron is
-    \f[
-      P' = \bigl\{\,
-             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
-           \bigm|
-             A'\vect{x} \geq \vect{0}
-           \,\bigr\},
-    \f]
-    where \f$A'\f$ is defined as follows:
-    \f[
-      {a'}_{ij}
-        = \begin{cases}
-            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
-              \quad \mathrm{for } j \neq \mathrm{var}; \\
-            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
-              \quad \text{for } j = \mathrm{var}.
-          \end{cases}
-    \f]
-    \endif
-  */
-  void affine_preimage(Variable var,
-		       const Linear_Expression& expr,
-		       Coefficient_traits::const_reference denominator
-		         = Coefficient_one());
+    // Start with a universe OS that will be refined by the simplex.
+    *this = Octagonal_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 0; i < num_dimensions; ++i) {
+      Variable x(i);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        num *= 2;
+        div_round_up(matrix[2*i+1][2*i], num, den);
+      }
+      // Evaluate optimal upper bounds for `x + y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(x + y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up(matrix[2*i+1][2*j], num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]),
+                       num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `y - x <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]),
+                       num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `-x - y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(-x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+           div_round_up(matrix[2*i][2*j+1], num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        num *= 2;
+        div_round_up(matrix[2*i][2*i+1], num, den);
+      }
+    }
+    set_strongly_closed();
+    assert(OK());
+    return;
+  }
 
-  /*! \brief
-    Assigns to \p *this the image of \p *this with respect to the
-    \ref Generalized_Affine_Relations "generalized affine relation"
-    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
-    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-    by \p relsym.
+  // Extract easy-to-find bounds from constraints.
+  *this = Octagonal_Shape(ph.constraints());
+}
 
-    \param var
-    The left hand side variable of the generalized affine relation;
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs)
+  : matrix(gs.space_dimension()),
+    space_dim(gs.space_dimension()),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    return;
+  }
 
-    \param relsym
-    The relation symbol;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typename OR_Matrix<N>::row_iterator mat_begin = matrix.row_begin();
 
-    \param expr
-    The numerator of the right hand side affine expression;
+  DIRTY_TEMP(N, tmp);
+  bool mat_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!mat_initialized) {
+        // When handling the first (closure) point, we initialize the matrix.
+        mat_initialized = true;
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the hyperplanes passing in the point
+            // and having the octagonal gradient.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplanes: X_i - X_j = P_i - P_j.
+            div_round_up(x_i[dj], g_j - g_i, d);
+            div_round_up(x_ii[dj+1], g_i - g_j, d);
+            // Hyperplanes: X_i + X_j = P_i + P_j.
+            div_round_up(x_i[dj+1], -g_j - g_i, d);
+            div_round_up(x_ii[dj], g_i + g_j, d);
+          }
+          // Hyperplanes: X_i = P_i.
+          div_round_up(x_i[di+1], -g_i - g_i, d);
+          div_round_up(x_ii[di], g_i + g_i, d);
+        }
+      }
+      else {
+        // This is not the first point: the matrix already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the straight lines passing in the point
+            // and having the octagonal gradient; compute maxima values.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplane: X_i - X_j = max (P_i - P_j, const).
+            div_round_up(tmp, g_j - g_i, d);
+            max_assign(x_i[dj], tmp);
+            div_round_up(tmp, g_i - g_j, d);
+            max_assign(x_ii[dj+1], tmp);
+            // Hyperplane: X_i + X_j = max (P_i + P_j, const).
+            div_round_up(tmp, -g_j - g_i, d);
+            max_assign(x_i[dj+1], tmp);
+            div_round_up(tmp, g_i + g_j, d);
+            max_assign(x_ii[dj], tmp);
+          }
+          // Hyperplane: X_i = max (P_i, const).
+          div_round_up(tmp, -g_i - g_i, d);
+          max_assign(x_i[di+1], tmp);
+          div_round_up(tmp, g_i + g_i, d);
+          max_assign(x_ii[di], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
 
-    \param denominator
-    The denominator of the right hand side affine expression (optional
-    argument with default value 1.)
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::Octagonal_Shape<T>"
+                                "::Octagonal_Shape(gs):\n"
+                                "the non-empty generator system gs "
+                                "contains no points.");
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of \p *this
-    or if \p *this is a C_Polyhedron and \p relsym is a strict
-    relation symbol.
-  */
-  void generalized_affine_image(Variable var,
-				const Relation_Symbol relsym,
-				const Linear_Expression& expr,
-				Coefficient_traits::const_reference denominator
-				  = Coefficient_one());
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::LINE:
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any line the right limit.
+            if (g_i != g_j) {
+              // Hyperplane: X_i - X_j <=/>= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            if (g_i != -g_j) {
+              // Hyperplane: X_i + X_j <=/>= +Inf.
+              assign_r(x_i[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          if (g_i != 0) {
+            // Hyperplane: X_i <=/>= +Inf.
+            assign_r(x_i[di+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+        }
+      break;
+    case Generator::RAY:
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          Row_Reference x_i = *(mat_begin+di);
+          Row_Reference x_ii = *(mat_begin+di+1);
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any ray the right limit in the case
+            // of the binary constraints.
+            if (g_i < g_j)
+              // Hyperplane: X_i - X_j >= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > g_j)
+              // Hyperplane: X_i - X_j <= +Inf.
+              assign_r(x_ii[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i < -g_j)
+              // Hyperplane: X_i + X_j >= +Inf.
+              assign_r(x_i[dj+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > -g_j)
+              // Hyperplane: X_i + X_j <= +Inf.
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+          // Case: unary constraints.
+          if (g_i < 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_i[di+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          if (g_i > 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        }
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_strongly_closed();
+  assert(OK());
+}
 
-  /*! \brief
-    Assigns to \p *this the preimage of \p *this with respect to the
-    \ref Generalized_Affine_Relations "generalized affine relation"
-    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
-    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-    by \p relsym.
+template <typename T>
+void
+Octagonal_Shape<T>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("add_constraint(c)", c);
+  // Strict inequalities are not allowed.
+  if (c.is_strict_inequality())
+   throw_constraint_incompatible("add_constraint(c)");
 
-    \param var
-    The left hand side variable of the generalized affine relation;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  // Constraints that are not octagonal differences are ignored.
+  if (!extract_octagonal_difference(c, c_space_dim, num_vars,
+                                    i, j, coeff, term))
+    return;
 
-    \param relsym
-    The relation symbol;
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
 
-    \param expr
-    The numerator of the right hand side affine expression;
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
 
-    \param denominator
-    The denominator of the right hand side affine expression (optional
-    argument with default value 1.)
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i%2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of \p *this
-    or if \p *this is a C_Polyhedron and \p relsym is a strict
-    relation symbol.
-  */
-  void
-  generalized_affine_preimage(Variable var,
-			      const Relation_Symbol relsym,
-			      const Linear_Expression& expr,
-			      Coefficient_traits::const_reference denominator
-			      = Coefficient_one());
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
 
-  /*! \brief
-    Assigns to \p *this the image of \p *this with respect to the
-    \ref Generalized_Affine_Relations "generalized affine relation"
-    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+template <typename T>
+void
+Octagonal_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    add_constraint(expr == 0);
+  }
+  assert(OK());
+}
 
-    \param lhs
-    The left hand side affine expression;
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
 
-    \param relsym
-    The relation symbol;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  // Constraints that are not octagonal differences are ignored.
+  if (!extract_octagonal_difference(c, c_space_dim, num_vars,
+                                    i, j, coeff, term))
+    return;
 
-    \param rhs
-    The right hand side affine expression.
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
-    or if \p *this is a C_Polyhedron and \p relsym is a strict
-    relation symbol.
-  */
-  void generalized_affine_image(const Linear_Expression& lhs,
-				const Relation_Symbol relsym,
-				const Linear_Expression& rhs);
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
 
-  /*! \brief
-    Assigns to \p *this the preimage of \p *this with respect to the
-    \ref Generalized_Affine_Relations "generalized affine relation"
-    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i%2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
 
-    \param lhs
-    The left hand side affine expression;
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
 
-    \param relsym
-    The relation symbol;
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    refine_with_constraint(expr == 0);
+  }
+  assert(OK());
+}
 
-    \param rhs
-    The right hand side affine expression.
+template <typename T>
+dimension_type
+Octagonal_Shape<T>::affine_dimension() const {
+  const dimension_type n_rows = matrix.num_rows();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (n_rows == 0)
+    return 0;
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
-    or if \p *this is a C_Polyhedron and \p relsym is a strict
-    relation symbol.
-  */
-  void generalized_affine_preimage(const Linear_Expression& lhs,
-				   const Relation_Symbol relsym,
-				   const Linear_Expression& rhs);
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  if (marked_empty())
+    return 0;
 
-  /*!
-    \brief
-    Assigns to \p *this the image of \p *this with respect to the
-    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
-    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
-         \leq \mathrm{var}'
-           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+  // The vector `leaders' is used to represent non-singular
+  // equivalence classes:
+  // `leaders[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class);
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
 
-    \param var
-    The variable updated by the affine relation;
+  // Due to the splitting of variables, the affine dimension is the
+  // number of non-singular positive zero-equivalence classes.
+  dimension_type affine_dim = 0;
+  for (dimension_type i = 0; i < n_rows; i += 2)
+    // Note: disregard the singular equivalence class.
+    if (leaders[i] == i && leaders[i+1] == i+1)
+      ++affine_dim;
 
-    \param lb_expr
-    The numerator of the lower bounding affine expression;
+  return affine_dim;
+}
 
-    \param ub_expr
-    The numerator of the upper bounding affine expression;
+template <typename T>
+Congruence_System
+Octagonal_Shape<T>::minimized_congruences() const {
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs;
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cgs.insert((0*Variable(space_dim-1) %= 1) / 0);
+  else {
+    // KLUDGE: in the future `cgs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cgs.insert(0*Variable(space_dim-1) == 0);
 
-    \param denominator
-    The (common) denominator for the lower and upper bounding
-    affine expressions (optional argument with default value 1.)
+    // The vector `leaders' is used to represent equivalence classes:
+    // `leaders[i] == i' if and only if `i' is the leader of its
+    // equivalence class (i.e., the minimum index in the class);
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
-    and \p *this are dimension-incompatible or if \p var is not a space
-    dimension of \p *this.
-  */
-  void bounded_affine_image(Variable var,
-			    const Linear_Expression& lb_expr,
-			    const Linear_Expression& ub_expr,
-			    Coefficient_traits::const_reference denominator
-			    = Coefficient_one());
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 0, i_end = 2*space_dim; i != i_end; i += 2) {
+      const dimension_type lead_i = leaders[i];
+      if (i == lead_i) {
+        if (leaders[i+1] == i)
+          // `i' is the leader of the singular equivalence class.
+          goto singular;
+        else
+          // `i' is the leader of a non-singular equivalence class.
+          continue;
+      }
+      else {
+        // `i' is not a leader.
+        if (leaders[i+1] == lead_i)
+          // `i' belongs to the singular equivalence class.
+          goto singular;
+        else
+          // `i' does not belong to the singular equivalence class.
+          goto non_singular;
+      }
 
-  /*!
-    \brief
-    Assigns to \p *this the preimage of \p *this with respect to the
-    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
-    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
-         \leq \mathrm{var}'
-           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+    singular:
+      // `i' belongs to the singular equivalence class:
+      // we have a unary equality constraint.
+      {
+        const Variable x(i/2);
+        const N& c_ii_i = matrix[i+1][i];
+#ifndef NDEBUG
+        const N& c_i_ii = matrix[i][i+1];
+        assert(is_additive_inverse(c_i_ii, c_ii_i));
+#endif
+        numer_denom(c_ii_i, num, den);
+        den *= 2;
+        cgs.insert(den*x == num);
+      }
+      continue;
 
-    \param var
-    The variable updated by the affine relation;
+    non_singular:
+      // `i' does not belong to the singular equivalence class.
+      // we have a binary equality constraint.
+      {
+        const N& c_i_li = matrix[i][lead_i];
+#ifndef NDEBUG
+        const N& c_ii_lii = matrix[i+1][lead_i+1];
+        assert(is_additive_inverse(c_ii_lii, c_i_li));
+#endif
+        const Variable x(lead_i/2);
+        const Variable y(i/2);
+        numer_denom(c_i_li, num, den);
+        cgs.insert(den*x - den*y == num);
+      }
+      continue;
+    }
+  }
+  return cgs;
+}
 
-    \param lb_expr
-    The numerator of the lower bounding affine expression;
+template <typename T>
+void
+Octagonal_Shape<T>::concatenate_assign(const Octagonal_Shape& y) {
+  // If `y' is an empty 0-dim space octagon, let `*this' become empty.
+  // If `y' is an universal 0-dim space octagon, we simply return.
+  if (y.space_dim == 0) {
+    if (y.marked_empty())
+      set_empty();
+    return;
+  }
 
-    \param ub_expr
-    The numerator of the upper bounding affine expression;
+  // If `*this' is an empty 0-dim space octagon, then it is sufficient
+  // to adjust the dimension of the vector space.
+  if (space_dim == 0 && marked_empty()) {
+    add_space_dimensions_and_embed(y.space_dim);
+    return;
+  }
 
-    \param denominator
-    The (common) denominator for the lower and upper bounding
-    affine expressions (optional argument with default value 1.)
+  // This is the old number of rows in the matrix. It is equal to
+  // the first index of columns to change.
+  dimension_type old_num_rows = matrix.num_rows();
+  // First we increase the space dimension of `*this' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new octagon is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // (where they are at the present) and placing the constraints of `y' in the
+  // lower right-hand side.
+  add_space_dimensions_and_embed(y.space_dim);
+  typename OR_Matrix<N>::const_element_iterator
+    y_it = y.matrix.element_begin();
+  for(typename OR_Matrix<N>::row_iterator i = matrix.row_begin()+old_num_rows,
+        matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::row_reference_type r = *i;
+    dimension_type rs_i = i.row_size();
+    for (dimension_type j = old_num_rows; j < rs_i; ++j, ++y_it)
+      r[j] = *y_it;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
-    and \p *this are dimension-incompatible or if \p var is not a space
-    dimension of \p *this.
-  */
-  void bounded_affine_preimage(Variable var,
-			       const Linear_Expression& lb_expr,
-			       const Linear_Expression& ub_expr,
-			       Coefficient_traits::const_reference denominator
-			       = Coefficient_one());
+  // The concatenation doesn't preserve the closure.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
 
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+template <typename T>
+bool
+Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", y);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  void time_elapse_assign(const Polyhedron& y);
+  // The zero-dimensional universe octagon contains any other
+  // dimension-compatible octagon.
+  // The zero-dimensional empty octagon only contains another
+  // zero-dimensional empty octagon.
+  if (space_dim == 0) {
+    if (!marked_empty())
+      return true;
+    else
+      return y.marked_empty();
+  }
 
-  //! Assigns to \p *this its topological closure.
-  void topological_closure_assign();
+  // `y' needs to be transitively closed.
+  y.strong_closure_assign();
+  // An empty octagon is in any other dimension-compatible octagons.
+  if (y.marked_empty())
+    return true;
 
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+  // `*this' contains `y' if and only if every element of `*this'
+  // is greater than or equal to the correspondent one of `y'.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), j = y.matrix.element_begin(),
+         matrix_element_end = matrix.element_end(); i != matrix_element_end; ++i, ++j)
+    if (*i < *j)
+      return false;
+  return true;
+}
 
-    \param y
-    A polyhedron that <EM>must</EM> be contained in \p *this;
+template <typename T>
+bool
+Octagonal_Shape<T>::is_disjoint_from(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  // If one Octagonal_Shape is empty, the Octagonal_Shapes are disjoint.
+  strong_closure_assign();
+  if (marked_empty())
+    return true;
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+  // Two Octagonal_Shapes are disjoint if and only if their intersection
+  // is empty, i.e., if and only if there exists a variable such that
+  // the upper bound of the constraint on that variable in the first
+  // Octagonal_Shape is strictly less than the lower bound of
+  // the correspomding constraint in the second Octagonal_Shape or vice versa.
+
+  const dimension_type n_rows = matrix.num_rows();
+
+  typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+
+  const Row_Iterator y_begin = y.matrix.row_begin();
+  const Row_Iterator y_end = y.matrix.row_end();
+
+  DIRTY_TEMP(N, neg_y_ci_cj);
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ci = (i%2) ? *(i_iter-1) : *(i_iter+1);
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      Row_Reference m_cj = *(m_begin + cj);
+      const N& m_i_j = (j < rs_i) ? m_i[j] : m_cj[ci];
+      Row_Reference y_ci = *(y_begin + ci);
+      Row_Reference y_j = *(y_begin + j);
+      const N& y_ci_cj = (j < rs_i) ? y_ci[cj] : y_j[i];
+      neg_assign_r(neg_y_ci_cj, y_ci_cj, ROUND_UP);
+      if (m_i_j < neg_y_ci_cj)
+        return true;
+    }
+  }
+  return false;
+}
 
-  /*! \brief
-    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this.
+template <typename T>
+bool
+Octagonal_Shape<T>::is_universe() const {
+  // An empty octagon isn't, of course, universe.
+  if (marked_empty())
+    return false;
 
-    \param y
-    A polyhedron that <EM>must</EM> be contained in \p *this;
+  // If the octagon is non-empty and zero-dimensional,
+  // then it is necessarily the universe octagon.
+  if (space_dim == 0)
+    return true;
 
-    \param cs
-    The system of constraints used to improve the widened polyhedron;
+  // An universe octagon can only contains trivial  constraints.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i)
+    if (!is_plus_infinity(*i))
+      return false;
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  return true;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
-					   const Constraint_System& cs,
-					   unsigned* tp = 0);
+template <typename T>
+bool
+Octagonal_Shape<T>::is_bounded() const {
+  strong_closure_assign();
+  // A zero-dimensional or empty octagon is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
 
-  /*! \brief
-    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this, plus all the constraints
-    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
-    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+  // A bounded octagon never can contains trivial constraints.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    const dimension_type i_index = i.index();
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (i_index != j)
+        if (is_plus_infinity(x_i[j]))
+          return false;
+  }
 
-    \param y
-    A polyhedron that <EM>must</EM> be contained in \p *this;
+  return true;
+}
 
-    \param cs
-    The system of constraints used to improve the widened polyhedron;
+template <typename T>
+bool
+Octagonal_Shape<T>::contains_integer_point() const {
+  // Force strong closure.
+  if (is_empty())
+    return false;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  // A strongly closed and consistent Octagonal_Shape defined by
+  // integer constraints can only be empty due to tight coeherence.
+  if (std::numeric_limits<T>::is_integer)
+    return !tight_coherence_would_make_empty();
+
+  // Build an integer Octagonal_Shape oct_z with bounds at least as
+  // tight as those in *this and then recheck for emptiness, also
+  // exploiting tight-coherence.
+  Octagonal_Shape<mpz_class> oct_z(space_dim);
+  oct_z.reset_strongly_closed();
+
+  typedef Octagonal_Shape<mpz_class>::N Z;
+  DIRTY_TEMP(N, tmp);
+  bool all_integers = true;
+  typename OR_Matrix<N>::const_element_iterator x_i = matrix.element_begin();
+  for (typename OR_Matrix<Z>::element_iterator
+         z_i = oct_z.matrix.element_begin(),
+         z_end = oct_z.matrix.element_end(); z_i != z_end; ++z_i, ++x_i) {
+    const N& d = *x_i;
+    if (is_plus_infinity(d))
+      continue;
+    if (is_integer(d))
+      assign_r(*z_i, d, ROUND_NOT_NEEDED);
+    else {
+      all_integers = false;
+      Z& d_z = *z_i;
+      // Copy d into d_z, but rounding downwards.
+      neg_assign_r(tmp, d, ROUND_NOT_NEEDED);
+      assign_r(d_z, tmp, ROUND_UP);
+      neg_assign_r(d_z, d_z, ROUND_NOT_NEEDED);
+    }
+  }
+  // Restore strong closure.
+  if (all_integers)
+    // oct_z unchanged, so it is still strongly closed.
+    oct_z.set_strongly_closed();
+  else {
+    // oct_z changed: recompute strong closure.
+    oct_z.strong_closure_assign();
+    if (oct_z.marked_empty())
+      return false;
+  }
+  return !oct_z.tight_coherence_would_make_empty();
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
-					   const Constraint_System& cs,
-					   unsigned* tp = 0);
+template <typename T>
+bool
+Octagonal_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // A polyhedron known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
 
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref H79_widening "H79-widening" between \p *this and \p y.
+  // Check whether `var' is syntactically constrained.
+  const dimension_type n_v = 2*(var_space_dim - 1);
+  typename OR_Matrix<N>::const_row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::const_row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::const_row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    if (!is_plus_infinity(r_v[h]) || !is_plus_infinity(r_cv[h]))
+      return true;
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::const_row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::const_row_reference_type r = *m_iter;
+    if (!is_plus_infinity(r[n_v]) || !is_plus_infinity(r[n_v+1]))
+      return true;
+  }
 
-    \param y
-    A polyhedron that <EM>must</EM> be contained in \p *this;
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strong_coherent() const {
+  // This method is only used by method OK() so as to check if a
+  // strongly closed matrix is also strong-coherent, as it must be.
+  const dimension_type num_rows = matrix.num_rows();
+
+  // Allocated here once and for all.
+  DIRTY_TEMP(N, semi_sum);
+  // The strong-coherence is: for every indexes i and j (and i != j)
+  // matrix[i][j] <= (matrix[i][ci] + matrix[cj][j])/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    const N& m_i_ci = m_i[coherent_index(i)];
+    for (dimension_type j = matrix.row_size(i); j-- > 0; )
+      // Note: on the main diagonal only PLUS_INFINITY can occur.
+      if (i != j) {
+        const N& m_cj_j = matrix[coherent_index(j)][j];
+        if (!is_plus_infinity(m_i_ci)
+            && !is_plus_infinity(m_cj_j)) {
+          // Compute (m_i_ci + m_cj_j)/2 into `semi_sum',
+          // rounding the result towards plus infinity.
+          add_assign_r(semi_sum, m_i_ci, m_cj_j, ROUND_UP);
+          div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+          if (m_i[j] > semi_sum)
+            return false;
+        }
+      }
+  }
+  return true;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-  */
-  void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strongly_reduced() const {
+  // This method is only used in assertions: efficiency is not a must.
 
-  /*! \brief
-    Improves the result of the \ref H79_widening "H79-widening"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this.
+  // An empty octagon is already transitively reduced.
+  if (marked_empty())
+    return true;
 
-    \param y
-    A polyhedron that <EM>must</EM> be contained in \p *this;
+  Octagonal_Shape x = *this;
+  // The matrix representing an OS is strongly reduced if, by removing
+  // any constraint, the resulting matrix describes a different OS.
+  for (typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    const dimension_type i = iter.index();
+    for (dimension_type j = iter.row_size(); j-- > 0; ) {
+      if (!is_plus_infinity(m_i[j])) {
+        Octagonal_Shape x_copy = *this;
+        assign_r(x_copy.matrix[i][j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (x == x_copy)
+          return false;
+      }
+    }
+  }
+  // The octagon is just reduced.
+  return true;
+}
 
-    \param cs
-    The system of constraints used to improve the widened polyhedron;
+template <typename T>
+bool
+Octagonal_Shape<T>::bounds(const Linear_Expression& expr,
+                           const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+  strong_closure_assign();
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  // A zero-dimensional or empty octagon bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void limited_H79_extrapolation_assign(const Polyhedron& y,
-					const Constraint_System& cs,
-					unsigned* tp = 0);
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (from_above) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  if (extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                   i, j, coeff, term)) {
+    if (num_vars == 0)
+      return true;
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    return !is_plus_infinity(m_i[j]);
+  }
+  else {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode mode_bounds =
+      from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    return (mip.solve() == OPTIMIZED_MIP_PROBLEM);
+  }
+}
 
-  /*! \brief
-    Improves the result of the \ref H79_widening "H79-widening"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this, plus all the constraints
-    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
-    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
 
-    \param y
-    A polyhedron that <EM>must</EM> be contained in \p *this;
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
 
-    \param cs
-    The system of constraints used to improve the widened polyhedron;
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (maximize) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  if (!extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                    i, j, coeff, term)) {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // `c' is an octagonal constraint.
+    if (num_vars == 0) {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    DIRTY_TEMP(N, d);
+    if (!is_plus_infinity(m_i[j])) {
+      const Coefficient& b = expr.inhomogeneous_term();
+      TEMP_INTEGER(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of a variable
+      // of `expr'.
+      DIRTY_TEMP(N, coeff_expr);
+      const Coefficient& coeff_i = expr.coefficient(Variable(i/2));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        TEMP_INTEGER(minus_coeff_i);
+        neg_assign(minus_coeff_i, expr.coefficient(Variable(i/2)));
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      if (num_vars == 1) {
+        DIRTY_TEMP(N, m_i_j);
+        div2exp_assign_r(m_i_j, m_i[j], 1, ROUND_UP);
+        add_mul_assign_r(d, coeff_expr, m_i_j, ROUND_UP);
+      }
+      else
+        add_mul_assign_r(d, coeff_expr, m_i[j], ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are topology-incompatible or
-    dimension-incompatible.
-  */
-  void bounded_H79_extrapolation_assign(const Polyhedron& y,
-					const Constraint_System& cs,
-					unsigned* tp = 0);
+    // The `expr' is unbounded.
+    return false;
+  }
+}
 
-  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included, Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
 
-  //! \name Member Functions that May Modify the Dimension of the Vector Space
-  //@{
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+  if (!is_universe()) {
+    // We use MIP_Problems to handle constraints that are not
+    // octagonal difference.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      g = mip.optimizing_point();
+      mip.evaluate_objective_function(g, ext_n, ext_d);
+      included = true;
+      return true;
+    }
+  }
+  // The `expr' is unbounded.
+  return false;
+}
 
-  /*! \brief
-    Adds \p m new space dimensions and embeds the old polyhedron
-    in the new vector space.
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
+  dimension_type cg_space_dim = cg.space_dimension();
 
-    \param m
-    The number of dimensions to add.
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim) {
+    throw_dimension_incompatible("relation_with(cg)", cg);
+  }
 
-    \exception std::length_error
-    Thrown if adding \p m new space dimensions would cause the
-    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  // If the congruence is an equality,
+  // find the relation with the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    return relation_with(c);
+  }
 
-    The new space dimensions will be those having the highest indexes
-    in the new polyhedron, which is characterized by a system
-    of constraints in which the variables running through
-    the new dimensions are not constrained.
-    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
-    and adding a third space dimension, the result will be the polyhedron
-    \f[
-      \bigl\{\,
-        (x, y, z)^\transpose \in \Rset^3
-      \bigm|
-        (x, y)^\transpose \in \cP
-      \,\bigr\}.
-    \f]
-  */
-  void add_space_dimensions_and_embed(dimension_type m);
+  strong_closure_assign();
 
-  /*! \brief
-    Adds \p m new space dimensions to the polyhedron
-    and does not embed it in the new vector space.
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
 
-    \param m
-    The number of space dimensions to add.
+  if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
 
-    \exception std::length_error
-    Thrown if adding \p m new space dimensions would cause the
-    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  TEMP_INTEGER(mod);
+  mod = cg.modulus();
+  Linear_Expression le;
+  for (dimension_type i = cg_space_dim; i-- > 0; )
+    le += cg.coefficient(Variable(i)) * Variable(i);
+  bool bounded_below = minimize(le, min_num, min_den, min_included);
+
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  TEMP_INTEGER(v);
+  TEMP_INTEGER(lower_num);
+  TEMP_INTEGER(lower_den);
+  TEMP_INTEGER(lower);
+  assign_r(lower_num, min_num, ROUND_NOT_NEEDED);
+  assign_r(lower_den, min_den, ROUND_NOT_NEEDED);
+  v -= cg.inhomogeneous_term();
+  lower = lower_num / lower_den;
+  v += ((lower / mod) * mod);
+  if (v * lower_den < lower_num)
+    v += mod;
+  const Constraint& c(le == v);
+  return relation_with(c);
+}
 
-    The new space dimensions will be those having the highest indexes
-    in the new polyhedron, which is characterized by a system
-    of constraints in which the variables running through
-    the new dimensions are all constrained to be equal to 0.
-    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
-    and adding a third space dimension, the result will be the polyhedron
-    \f[
-      \bigl\{\,
-        (x, y, 0)^\transpose \in \Rset^3
-      \bigm|
-        (x, y)^\transpose \in \cP
-      \,\bigr\}.
-    \f]
-  */
-  void add_space_dimensions_and_project(dimension_type m);
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+  dimension_type c_space_dim = c.space_dimension();
 
-  /*! \brief
-    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
-    of \p *this and \p y, taken in this order.
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible.
+  // The closure needs to make explicit the implicit constraints.
+  strong_closure_assign();
 
-    \exception std::length_error
-    Thrown if the concatenation would cause the vector space
-    to exceed dimension <CODE>max_space_dimension()</CODE>.
-  */
-  void concatenate_assign(const Polyhedron& y);
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
 
-  //! Removes all the specified dimensions from the vector space.
-  /*!
-    \param to_be_removed
-    The set of Variable objects corresponding to the space dimensions
-    to be removed.
+  if (space_dim == 0) {
+    // Trivially false zero-dimensional constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with one of the
-    Variable objects contained in \p to_be_removed.
-  */
-  void remove_space_dimensions(const Variables_Set& to_be_removed);
+    // Trivially true zero-dimensional constraint.
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
 
-  /*! \brief
-    Removes the higher dimensions of the vector space so that
-    the resulting space will have dimension \p new_dimension.
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(c_term);
+  if (!extract_octagonal_difference(c, c_space_dim, num_vars,
+                                    i, j, coeff, c_term)) {
+    // Constraints that are not octagonal differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le;
+    for (dimension_type k = c_space_dim; k-- > 0; ) {
+      Variable vk(k);
+      le += c.coefficient(vk) * vk;
+    }
+    DIRTY_TEMP(Coefficient, max_num);
+    DIRTY_TEMP(Coefficient, max_den);
+    bool max_included;
+    DIRTY_TEMP(Coefficient, min_num);
+    DIRTY_TEMP(Coefficient, min_den);
+    bool min_included;
+    bool bounded_above = maximize(le, max_num, max_den, max_included);
+    bool bounded_below = minimize(le, min_num, min_den, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(min_num)) {
+      case 1:
+        if (c.is_equality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return  Poly_Con_Relation::strictly_intersects();
+        return  Poly_Con_Relation::is_included();
+      case -1:
+        return  Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_num += c.inhomogeneous_term() * max_den;
+      switch (sgn(max_num)) {
+      case 1:
+        return  Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_num += c.inhomogeneous_term() * max_den;
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(max_num)) {
+      case 1:
+        switch (sgn(min_num)) {
+        case 1:
+          if (c.is_equality())
+            return  Poly_Con_Relation::is_disjoint();
+          return  Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return  Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::strictly_intersects();
+          return  Poly_Con_Relation::is_included();
+        case -1:
+          return  Poly_Con_Relation::strictly_intersects();
+        }
+     case 0:
+        if (min_num == 0) {
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return  Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p new_dimensions is greater than the space dimension of
-    \p *this.
-  */
-  void remove_higher_space_dimensions(dimension_type new_dimension);
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
 
-  /*! \brief
-    Remaps the dimensions of the vector space according to
-    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+  // Select the cell to be checked for the "<=" part of constraint.
+  typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+  const N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
 
-    \param pfunc
-    The partial function specifying the destiny of each space dimension.
+  // Select the cell to be checked for the ">=" part of constraint.
+  // Select the right row of the cell.
+  if (i%2 == 0)
+    ++i_iter;
+  else
+    --i_iter;
+  typename OR_Matrix<N>::const_row_reference_type m_ci = *i_iter;
+  const N& m_ci_cj = m_ci[coherent_index(j)];
+  TEMP_INTEGER(numer);
+  TEMP_INTEGER(denom);
+  // The following variables of mpq_class type are used to be precise
+  // when the octagon is defined by integer constraints.
+  DIRTY_TEMP0(mpq_class, q_x);
+  DIRTY_TEMP0(mpq_class, q_y);
+  DIRTY_TEMP0(mpq_class, d);
+  DIRTY_TEMP0(mpq_class, d1);
+  DIRTY_TEMP0(mpq_class, c_den);
+  DIRTY_TEMP0(mpq_class, q_den);
+  assign_r(c_den, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c_term, ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_den, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_den, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(m_i_j)) {
+    if (!is_plus_infinity(m_ci_cj)) {
+      // `*this' is in the following form:
+      // `-m_ci_cj <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-m_ci_cj > d' (`-m_ci_cj >= d' if c is a strict inequality),
+      // i.e. if `m_ci_cj < d1' (`m_ci_cj <= d1' if c is a strict inequality).
+      numer_denom(m_ci_cj, numer, denom);
+      assign_r(q_den, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
 
-    The template class Partial_Function must provide the following
-    methods.
-    \code
-      bool has_empty_codomain() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the represented partial
-    function has an empty codomain (i.e., it is always undefined).
-    The <CODE>has_empty_codomain()</CODE> method will always be called
-    before the methods below.  However, if
-    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
-    of the functions below will be called.
-    \code
-      dimension_type max_in_codomain() const
-    \endcode
-    returns the maximum value that belongs to the codomain
-    of the partial function.
-    The <CODE>max_in_codomain()</CODE> method is called at most once.
-    \code
-      bool maps(dimension_type i, dimension_type& j) const
-    \endcode
-    Let \f$f\f$ be the represented function and \f$k\f$ be the value
-    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
-    assigned to \p j and <CODE>true</CODE> is returned.
-    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
-    returned.
-    This method is called at most \f$n\f$ times, where \f$n\f$ is the
-    dimension of the vector space enclosing the polyhedron.
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
 
-    The result is undefined if \p pfunc does not encode a partial
-    function with the properties described in the
-    \ref Mapping_the_Dimensions_of_the_Vector_Space
-    "specification of the mapping operator".
-  */
-  template <typename Partial_Function>
-  void map_space_dimensions(const Partial_Function& pfunc);
+  // Here `m_i_j' is not plus-infinity.
+  numer_denom(m_i_j, numer, denom);
+  assign_r(q_den, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(m_ci_cj)) {
+    numer_denom(m_ci_cj, numer, denom);
+    assign_r(q_den, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `m_ci_cj < d1' (`m_ci_cj <= d1' if `c' is a strict inequality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
 
-  //! Creates \p m copies of the space dimension corresponding to \p var.
-  /*!
-    \param var
-    The variable corresponding to the space dimension to be replicated;
+  // Here `m_ci_cj' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `m_i_j < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
 
-    \param m
-    The number of replicas to be created.
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
 
-    \exception std::invalid_argument
-    Thrown if \p var does not correspond to a dimension of the vector space.
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
 
-    \exception std::length_error
-    Thrown if adding \p m new space dimensions would cause the
-    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+#if 0
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+  using namespace IO_Operators;
+  C_Polyhedron ph(constraints());
+  Poly_Con_Relation p_ret = ph.relation_with(c);
+  Poly_Con_Relation o_ret = this->real_relation_with(c);
+  if (p_ret != o_ret) {
+    std::cout << "Relation of" <<std::endl
+              << *this << std::endl
+              << "a.k.a." << std::endl
+              << ph << std::endl
+              << "with" << std::endl
+              << c << std::endl
+              << "gives " << o_ret << " with Octagonal_Shape" << std::endl
+              << "and " << p_ret << " with C_Polyhedron" << std::endl;
+  }
+  return o_ret;
+}
+#endif
 
-    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
-    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
-    then the \f$k\f$-th space dimension is
-    \ref expand_space_dimension "expanded" to \p m new space dimensions
-    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
-  */
-  void expand_space_dimension(Variable var, dimension_type m);
+template <typename T>
+Poly_Gen_Relation
+Octagonal_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type g_space_dim = g.space_dimension();
 
-  //! Folds the space dimensions in \p to_be_folded into \p var.
-  /*!
-    \param to_be_folded
-    The set of Variable objects corresponding to the space dimensions
-    to be folded;
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
 
-    \param var
-    The variable corresponding to the space dimension that is the
-    destination of the folding operation.
+  // The closure needs to make explicit the implicit constraints and if the
+  // octagon is empty.
+  strong_closure_assign();
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p var or with
-    one of the Variable objects contained in \p to_be_folded.
-    Also thrown if \p var is contained in \p to_be_folded.
+  // The empty octagon cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
 
-    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
-    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
-    \p to_be_folded is a set of variables whose maximum space dimension
-    is also less than or equal to \f$n\f$, and \p var is not a member
-    of \p to_be_folded, then the space dimensions corresponding to
-    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
-    into the \f$k\f$-th space dimension.
-  */
-  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+  // A universe octagon in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
 
-  //@} // Member Functions that May Modify the Dimension of the Vector Space
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
 
-  friend bool Parma_Polyhedra_Library::operator==(const Polyhedron& x,
-						  const Polyhedron& y);
+  // The relation between the octagon and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the octagon.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the octagon.
 
-  //! \name Miscellaneous Member Functions
-  //@{
+  typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
 
-  //! Destructor.
-  ~Polyhedron();
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
 
-  /*! \brief
-    Swaps \p *this with polyhedron \p y.
-    (\p *this and \p y can be dimension-incompatible.)
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  TEMP_INTEGER(product);
 
-    \exception std::invalid_argument
-    Thrown if \p x and \p y are topology-incompatible.
-  */
-  void swap(Polyhedron& y);
+  // We find in `*this' all the constraints.
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ii = *(i_iter+1);
+    const N& m_i_ii = m_i[i+1];
+    const N& m_ii_i = m_ii[i];
+    // We have the unary constraints.
+    const Variable x(i/2);
+    const Coefficient& g_coeff_x = (x.space_dimension() > g_space_dim)
+      ? Coefficient(0) : g.coefficient(x);
+    if (is_additive_inverse(m_i_ii, m_ii_i)) {
+      // The constraint has form ax = b.
+      // To satisfy the constraint it's necessary that the scalar product
+      // is not zero. The scalar product has the form:
+      // 'den * g_coeff_x - num * g.divisor()'.
+      numer_denom(m_ii_i, num, den);
+      den *= 2;
+      product = den * g_coeff_x;
+      // Note that if the generator `g' is a line or a ray,
+      // its divisor is zero.
+      if (!is_line_or_ray) {
+        neg_assign(num);
+        add_mul_assign(product, num, g.divisor());
+      }
+      if (product != 0)
+        return Poly_Gen_Relation::nothing();
+    }
+    // We have 0, 1 or 2 inequality constraints.
+    else {
+      if (!is_plus_infinity(m_i_ii)) {
+        // The constraint has form -ax <= b.
+        // If the generator is a line it's necessary to check if
+        // the scalar product is not zero, if it is positive otherwise.
+        numer_denom(m_i_ii, num, den);
+        den *= -2;
+        product = den * g_coeff_x;
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num, g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form:
+          // '-den * g.coeff_x - num * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+      if (!is_plus_infinity(m_ii_i)) {
+        // The constraint has form ax <= b.
+        numer_denom(m_ii_i, num, den);
+        den *= 2;
+        product = den * g_coeff_x;
+         // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num , g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form:
+          // 'den * g_coeff_x - num * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+
+  // We have the binary constraints.
+  for (Row_Iterator i_iter = m_begin ; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ii = *(i_iter+1);
+    for (dimension_type j = 0; j < i; j += 2) {
+      const N& m_i_j = m_i[j];
+      const N& m_ii_jj = m_ii[j+1];
+      const N& m_ii_j = m_ii[j];
+      const N& m_i_jj = m_i[j+1];
+      const Variable x(j/2);
+      const Variable y(i/2);
+      const Coefficient& g_coeff_x = (x.space_dimension() > g_space_dim)
+        ? Coefficient(0) : g.coefficient(x);
+      const Coefficient& g_coeff_y = (y.space_dimension() > g_space_dim)
+        ? Coefficient(0) : g.coefficient(y);
+
+      // FIXME! Find better names.
+      const bool is_binary_equality = is_additive_inverse(m_ii_jj, m_i_j);
+      const bool is_a_binary_equality = is_additive_inverse(m_i_jj, m_ii_j);
+      if (is_binary_equality) {
+        // The constraint has form ax - ay = b.
+        // The scalar product has the form
+        // 'den * coeff_x - den * coeff_y - num * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_i_j, num, den);
+        product = den * g_coeff_x;
+        neg_assign(den);
+        add_mul_assign(product, den, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_j)) {
+          // The constraint has form ax - ay <= b.
+          // The scalar product has the form
+          // 'den * coeff_x - den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_j, num, den);
+          product = den * g_coeff_x;
+          neg_assign(den);
+          add_mul_assign(product, den, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_jj)) {
+          // The constraint has form -ax + ay <= b.
+          // The scalar product has the form
+          // '-den * coeff_x + den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_jj, num, den);
+          product = den * g_coeff_y;
+          neg_assign(den);
+          add_mul_assign(product, den, g_coeff_x);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
 
-  PPL_OUTPUT_DECLARATIONS;
+      if (is_a_binary_equality) {
+        // The constraint has form ax + ay = b.
+        // The scalar product has the form
+        // 'den * coeff_x + den * coeff_y - num * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_ii_j, num, den);
+        product = den * g_coeff_x;
+        add_mul_assign(product, den, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(num);
+          add_mul_assign(product, num, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_jj)) {
+          // The constraint has form -ax - ay <= b.
+          // The scalar product has the form
+          // '-den * coeff_x - den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_jj, num, den);
+          neg_assign(den);
+          product = den * g_coeff_x;
+          add_mul_assign(product, den, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_j)) {
+          // The constraint has form ax + ay <= b.
+          // The scalar product has the form
+          // 'den * coeff_x + den * coeff_y - num * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_j, num, den);
+          product = den * g_coeff_x;
+          add_mul_assign(product, den, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(num);
+            add_mul_assign(product, num, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
+  // If this point is reached the constraint 'g' satisfies
+  // all the constraints in the octagon.
+  return Poly_Gen_Relation::subsumes();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+template <typename T>
+void
+Octagonal_Shape<T>::strong_closure_assign() const {
+  // Do something only if necessary (zero-dim implies strong closure).
+  if (marked_empty() || marked_strongly_closed() || space_dim == 0)
+    return;
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  // Even though the octagon will not change, its internal representation
+  // is going to be modified by the closure algorithm.
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
 
-  //@} // Miscellaneous Member Functions
+  const dimension_type n_rows = x.matrix.num_rows();
+  const Row_Iterator m_begin = x.matrix.row_begin();
+  const Row_Iterator m_end = x.matrix.row_end();
 
-private:
-  //! The system of constraints.
-  Constraint_System con_sys;
+  // Fill the main diagonal with zeros.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    assert(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
 
-  //! The system of generators.
-  Generator_System gen_sys;
+  // This algorithm is given by two steps: the first one is a simple
+  // adaptation of the `shortest-path closure' using the Floyd-Warshall
+  // algorithm; the second one is the `strong-coherence' algorithm.
+  // It is important to note that after the strong-coherence,
+  // the octagon is still shortest-path closed and hence, strongly closed.
+
+  // Recall that, given an index `h', we indicate with `ch' the coherent
+  // index, i.e., the index such that:
+  //   ch = h + 1, if h is an even number;
+  //   ch = h - 1, if h is an odd number.
+
+  typename OR_Matrix<N>::element_iterator iter_ij;
+  std::vector<N> vec_k(n_rows);
+  std::vector<N> vec_ck(n_rows);
+  DIRTY_TEMP(N, sum1);
+  DIRTY_TEMP(N, sum2);
+  Row_Reference x_k;
+  Row_Reference x_ck;
+  Row_Reference x_i;
+  Row_Reference x_ci;
+
+  // Since the index `j' of the inner loop will go from 0 up to `i',
+  // the three nested loops have to be executed twice.
+  for (int twice = 0; twice < 2; ++twice) {
+
+    Row_Iterator x_k_iter = m_begin;
+    Row_Iterator x_i_iter = m_begin;
+    for (dimension_type k = 0; k < n_rows; k += 2) {
+      const dimension_type ck = k+1;
+      // Re-initialize the element iterator.
+      iter_ij = x.matrix.element_begin();
+      // Compute the row references `x_k' and `x_ck'.
+      x_k  = *x_k_iter;
+      ++x_k_iter;
+      x_ck = *x_k_iter;
+      ++x_k_iter;
+
+      for (dimension_type i = 0; i <= k; i += 2) {
+        const dimension_type ci = i+1;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_k[i];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_k[ci];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ck[i];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_ck[ci];
+      }
+      x_i_iter = x_k_iter;
+      for (dimension_type i = k+2; i < n_rows; i += 2) {
+        const dimension_type ci = i+1;
+        x_i = *x_i_iter;
+        ++x_i_iter;
+        x_ci = *x_i_iter;
+        ++x_i_iter;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_ci[ck];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_i[ck];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ci[k];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_i[k];
+      }
 
-  //! The saturation matrix having constraints on its columns.
-  Saturation_Matrix sat_c;
+      for (dimension_type i = 0; i < n_rows; ++i) {
+        const dimension_type ci = coherent_index(i);
+        const N& vec_k_ci = vec_k[ci];
+        const N& vec_ck_ci = vec_ck[ci];
+        // Unfolding two iterations on `j': this ensures that
+        // the loop exit condition `j <= i' is OK.
+        for (dimension_type j = 0; j <= i; ) {
+          // First iteration:
+          // sum1 = x_i_k + x_k_j == x_ck_ci + x_k_j;
+          // sum2 = x_i_ck + x_ck_j == x_k_ci + x_ck_j.
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the first iteration: loop index control.
+          ++j;
+          ++iter_ij;
+          // Second iteration: ditto.
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the second iteration: loop index control.
+          ++j;
+          ++iter_ij;
+        }
+      }
+    }
+  }
 
-  //! The saturation matrix having generators on its columns.
-  Saturation_Matrix sat_g;
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value in the main diagonal.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      assert(sgn(x_i_i) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
 
-#define PPL_IN_Polyhedron_CLASS
-// Automatically generated from PPL source file ../src/Ph_Status.idefs.hh line 1
-/* Polyhedron::Status class declaration.
-*/
+  // Step 2: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
 
+template <typename T>
+void
+Octagonal_Shape<T>::strong_coherence_assign() {
+  // The strong-coherence is: for every indexes i and j
+  // m_i_j <= (m_i_ci + m_cj_j)/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  DIRTY_TEMP(N, semi_sum);
+  for (typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin(),
+         i_end = matrix.row_end(); i_iter != i_end; ++i_iter) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i_iter;
+    const dimension_type i = i_iter.index();
+    const N& x_i_ci = x_i[coherent_index(i)];
+    // Avoid to do unnecessary sums.
+    if (!is_plus_infinity(x_i_ci))
+      for (dimension_type j = 0, rs_i = i_iter.row_size(); j < rs_i; ++j)
+        if (i != j) {
+          const N& x_cj_j = matrix[coherent_index(j)][j];
+          if (!is_plus_infinity(x_cj_j)) {
+            add_assign_r(semi_sum, x_i_ci, x_cj_j, ROUND_UP);
+            div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+            min_assign(x_i[j], semi_sum);
+          }
+        }
+  }
+}
 
-#ifndef PPL_IN_Polyhedron_CLASS
-#error "Do not include Ph_Status.idefs.hh directly; use Polyhedron.defs.hh instead."
-#endif
+template <typename T>
+bool
+Octagonal_Shape<T>::tight_coherence_would_make_empty() const {
+  assert(std::numeric_limits<N>::is_integer);
+  assert(marked_strongly_closed());
+  const dimension_type space_dim = space_dimension();
+  for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+    const dimension_type ci = i+1;
+    const N& mat_i_ci = matrix[i][ci];
+    if (!is_plus_infinity(mat_i_ci)
+        // Check for oddness of `mat_i_ci'.
+        && !is_even(mat_i_ci)
+        // Check for zero-equivalence of `i' and `ci'.
+        && is_additive_inverse(mat_i_ci, matrix[ci][i]))
+      return true;
+  }
+  return false;
+}
 
-//! A conjunctive assertion about a polyhedron.
-/*! \ingroup PPL_CXX_interface
-  The assertions supported are:
-  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
-    vector space \f$\Rset^0 = \{\cdot\}\f$;
-  - <EM>empty</EM>: the polyhedron is the empty set;
-  - <EM>constraints pending</EM>: the polyhedron is correctly
-    characterized by the attached system of constraints, which is
-    split in two non-empty subsets: the already processed constraints,
-    which are in minimal form, and the pending constraints, which
-    still have to be processed and may thus be inconsistent or
-    contain redundancies;
-  - <EM>generators pending</EM>: the polyhedron is correctly
-    characterized by the attached system of generators, which is
-    split in two non-empty subsets: the already processed generators,
-    which are in minimal form, and the pending generators, which still
-    have to be processed and may thus contain redundancies;
-  - <EM>constraints up-to-date</EM>: the polyhedron is correctly
-    characterized by the attached system of constraints, modulo the
-    processing of pending generators;
-  - <EM>generators up-to-date</EM>: the polyhedron is correctly
-    characterized by the attached system of generators, modulo the
-    processing of pending constraints;
-  - <EM>constraints minimized</EM>: the non-pending part of the system
-    of constraints attached to the polyhedron is in minimal form;
-  - <EM>generators minimized</EM>: the non-pending part of the system
-    of generators attached to the polyhedron is in minimal form;
-  - <EM>constraints' saturation matrix up-to-date</EM>: the attached
-    saturation matrix having rows indexed by non-pending generators and
-    columns indexed by non-pending constraints correctly expresses
-    the saturation relation between the attached non-pending constraints
-    and generators;
-  - <EM>generators' saturation matrix up-to-date</EM>: the attached
-    saturation matrix having rows indexed by non-pending constraints and
-    columns indexed by non-pending generators correctly expresses
-    the saturation relation between the attached non-pending constraints
-    and generators;
+template <typename T>
+void
+Octagonal_Shape<T>
+::incremental_strong_closure_assign(const Variable var) const {
+  // `var' should be one of the dimensions of the octagon.
+  if (var.id() >= space_dim)
+    throw_dimension_incompatible("incremental_strong_closure_assign(v)",
+                                 var.id());
 
-  Not all the conjunctions of these elementary assertions constitute
-  a legal Status.  In fact:
-  - <EM>zero-dim universe</EM> excludes any other assertion;
-  - <EM>empty</EM>: excludes any other assertion;
-  - <EM>constraints pending</EM> and <EM>generators pending</EM>
-    are mutually exclusive;
-  - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
-    and <EM>generators minimized</EM>;
-  - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
-    and <EM>generators minimized</EM>;
-  - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
-  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
-  - <EM>constraints' saturation matrix up-to-date</EM> implies both
-    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
-  - <EM>generators' saturation matrix up-to-date</EM> implies both
-    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
-*/
-class Status {
-public:
-  //! By default Status is the <EM>zero-dim universe</EM> assertion.
-  Status();
+  // Do something only if necessary.
+  if (marked_empty() || marked_strongly_closed())
+    return;
 
-  //! \name Test, remove or add an individual assertion from the conjunction
-  //@{
-  bool test_zero_dim_univ() const;
-  void reset_zero_dim_univ();
-  void set_zero_dim_univ();
+  // Zero-dimensional octagons are necessarily strongly closed.
+  if (space_dim == 0)
+    return;
 
-  bool test_empty() const;
-  void reset_empty();
-  void set_empty();
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
 
-  bool test_c_up_to_date() const;
-  void reset_c_up_to_date();
-  void set_c_up_to_date();
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
 
-  bool test_g_up_to_date() const;
-  void reset_g_up_to_date();
-  void set_g_up_to_date();
+  const Row_Iterator m_begin = x.matrix.row_begin();
+  const Row_Iterator m_end = x.matrix.row_end();
 
-  bool test_c_minimized() const;
-  void reset_c_minimized();
-  void set_c_minimized();
+  // Fill the main diagonal with zeros.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    assert(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
 
-  bool test_g_minimized() const;
-  void reset_g_minimized();
-  void set_g_minimized();
+  // Using the incremental Floyd-Warshall algorithm.
+  // Step 1: Improve all constraints on variable `var'.
+  const dimension_type v = 2*var.id();
+  const dimension_type cv = v+1;
+  Row_Iterator v_iter = m_begin + v;
+  Row_Iterator cv_iter = v_iter + 1;
+  Row_Reference x_v = *v_iter;
+  Row_Reference x_cv = *cv_iter;
+  const dimension_type rs_v = v_iter.row_size();
+  const dimension_type n_rows = x.matrix.num_rows();
+  DIRTY_TEMP(N, sum);
+  for (Row_Iterator k_iter = m_begin; k_iter != m_end; ++k_iter) {
+    const dimension_type k = k_iter.index();
+    const dimension_type ck = coherent_index(k);
+    const dimension_type rs_k = k_iter.row_size();
+    Row_Reference x_k = *k_iter;
+    Row_Reference x_ck = (k%2) ? *(k_iter-1) : *(k_iter+1);
+
+    for (Row_Iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+      const dimension_type i = i_iter.index();
+      const dimension_type ci = coherent_index(i);
+      const dimension_type rs_i = i_iter.row_size();
+      Row_Reference x_i = *i_iter;
+      Row_Reference x_ci = (i%2) ? *(i_iter-1) : *(i_iter+1);
+
+      const N& x_i_k = (k < rs_i) ? x_i[k] : x_ck[ci];
+      if (!is_plus_infinity(x_i_k)) {
+        const N& x_k_v = (v < rs_k) ? x_k[v] : x_cv[ck];
+        if (!is_plus_infinity(x_k_v)) {
+          add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+          N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+          min_assign(x_i_v, sum);
+        }
+        const N& x_k_cv = (cv < rs_k) ? x_k[cv] : x_v[ck];
+        if (!is_plus_infinity(x_k_cv)) {
+          add_assign_r(sum, x_i_k, x_k_cv, ROUND_UP);
+          N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+          min_assign(x_i_cv, sum);
+        }
+      }
+      const N& x_k_i = (i < rs_k) ? x_k[i] : x_ci[ck];
+      if (!is_plus_infinity(x_k_i)) {
+        const N& x_v_k = (k < rs_v) ? x_v[k] : x_ck[cv];
+        if (!is_plus_infinity(x_v_k)) {
+          N& x_v_i = (i < rs_v) ? x_v[i] : x_ci[cv];
+          add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+          min_assign(x_v_i, sum);
+        }
+        const N& x_cv_k = (k < rs_v) ? x_cv[k] : x_ck[v];
+        if (!is_plus_infinity(x_cv_k)) {
+          N& x_cv_i = (i < rs_v) ? x_cv[i] : x_ci[v];
+          add_assign_r(sum, x_cv_k, x_k_i, ROUND_UP);
+          min_assign(x_cv_i, sum);
+        }
+      }
 
-  bool test_sat_c_up_to_date() const;
-  void reset_sat_c_up_to_date();
-  void set_sat_c_up_to_date();
+    }
+  }
 
-  bool test_sat_g_up_to_date() const;
-  void reset_sat_g_up_to_date();
-  void set_sat_g_up_to_date();
+  // Step 2: improve the other bounds by using the precise bounds
+  // for the constraints on `var'.
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    Row_Reference x_i = *i_iter;
+    Row_Reference x_ci = (i%2) ? *(i_iter-1) : *(i_iter+1);
+    const N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+    // TODO: see if it is possible to optimize this inner loop
+    // by splitting it into several parts, so as to avoid
+    // conditional expressions.
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      Row_Reference x_cj = *(m_begin+cj);
+      N& x_i_j = (j < rs_i) ? x_i[j] : x_cj[ci];
+      if (!is_plus_infinity(x_i_v)) {
+        const N& x_v_j = (j < rs_v) ? x_v[j] : x_cj[cv];
+        if (!is_plus_infinity(x_v_j)) {
+          add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+      const N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+      if (!is_plus_infinity(x_i_cv)) {
+        const N& x_cv_j = (j < rs_v) ? x_cv[j] : x_cj[v];
+        if (!is_plus_infinity(x_cv_j)) {
+          add_assign_r(sum, x_i_cv, x_cv_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+    }
+  }
 
-  bool test_c_pending() const;
-  void reset_c_pending();
-  void set_c_pending();
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value on the main diagonal.
+  for (Row_Iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      // Restore PLUS_INFINITY on the main diagonal.
+      assert(sgn(x_i_i) == 0);
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
 
-  bool test_g_pending() const;
-  void reset_g_pending();
-  void set_g_pending();
-  //@} // Test, remove or add an individual assertion from the conjunction
+  // Step 3: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_successors(std::vector<dimension_type>& successor) const {
+  assert(!marked_empty() && marked_strongly_closed());
+  assert(successor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `successor' is used to indicate which variable
+  // immediately follows a given one in the corresponding equivalence class.
+  const dimension_type successor_size = matrix.num_rows();
+  // Initially, each variable is successor of its own zero-equivalence class.
+  successor.reserve(successor_size);
+  for (dimension_type i = 0; i < successor_size; ++i)
+    successor.push_back(i);
+  // Now compute actual successors.
+  for (dimension_type i = successor_size; i-- > 0; )  {
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin()+i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    typename OR_Matrix<N>::const_row_reference_type m_ci = (i%2) ?
+          *(i_iter-1) : *(i_iter+1);
+    for (dimension_type j = 0; j < i; ++j) {
+    //for (dimension_type j = i; j-- > 0; ) {
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as successor the variable having the greatest index.
+        successor[j] = i;
+    }
+  }
+}
 
-  PPL_OUTPUT_DECLARATIONS;
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& leaders) const {
+  assert(!marked_empty() && marked_strongly_closed());
+  assert(leaders.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `leaders' is used to indicate the smallest variable
+  // that belongs to the corresponding equivalence class.
+  const dimension_type leader_size = matrix.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  leaders.reserve(leader_size);
+  for (dimension_type i = 0; i < leader_size; ++i)
+    leaders.push_back(i);
+  // Now compute actual leaders.
+  for (typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end();
+       i_iter != matrix_row_end; ++i_iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    dimension_type i = i_iter.index();
+    typename OR_Matrix<N>::const_row_reference_type m_ci =
+      (i%2) ? *(i_iter-1) : *(i_iter+1);
+    for (dimension_type j = 0; j < i; ++j) {
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as leader the variable having the smaller index.
+        leaders[i] = leaders[j];
+    }
+  }
+}
 
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
-  */
-  bool ascii_load(std::istream& s);
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& successor,
+                  std::vector<dimension_type>& no_sing_leaders,
+                  bool& exist_sing_class,
+                  dimension_type& sing_leader) const {
+  assert(!marked_empty() && marked_strongly_closed());
+  assert(no_sing_leaders.size() == 0);
+  dimension_type successor_size = successor.size();
+  std::deque<bool> dealt_with(successor_size, false);
+  for (dimension_type i = 0; i < successor_size; ++i) {
+    dimension_type next_i = successor[i];
+    if (!dealt_with[i]) {
+      // The index is a leader.
+      // Now check if it is a leader of a singular class or not.
+      if (next_i == coherent_index(i)) {
+        exist_sing_class = true;
+        sing_leader = i;
+      }
+      else
+        no_sing_leaders.push_back(i);
+    }
+    // The following index isn't a leader.
+    dealt_with[next_i] = true;
+  }
+}
 
-private:
-  //! Status is implemented by means of a finite bitset.
-  typedef unsigned int flags_t;
+template <typename T>
+void
+Octagonal_Shape<T>::strong_reduction_assign() const {
+  // Zero-dimensional Octagonal shapes are necessarily reduced.
+  if (space_dim == 0)
+    return;
 
-  //! \name Bit-masks for the individual assertions
-  //@{
-  static const flags_t ZERO_DIM_UNIV    = 0U;
-  static const flags_t EMPTY            = 1U << 0;
-  static const flags_t C_UP_TO_DATE     = 1U << 1;
-  static const flags_t G_UP_TO_DATE     = 1U << 2;
-  static const flags_t C_MINIMIZED      = 1U << 3;
-  static const flags_t G_MINIMIZED      = 1U << 4;
-  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
-  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
-  static const flags_t CS_PENDING       = 1U << 7;
-  static const flags_t GS_PENDING       = 1U << 8;
-  //@} // Bit-masks for the individual assertions
+  // First find the tightest constraints for this octagon.
+  strong_closure_assign();
 
-  //! This holds the current bitset.
-  flags_t flags;
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
 
-  //! Construct from a bit-mask.
-  Status(flags_t mask);
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is strongly
+  // closed, this happens if and only if matrix[i][j] == -matrix[ci][cj].
+  std::vector<dimension_type> no_sing_leaders;
+  dimension_type sing_leader = 0;
+  bool exist_sing_class = false;
+  std::vector<dimension_type> successor;
+  compute_successors(successor);
+  compute_leaders(successor, no_sing_leaders, exist_sing_class, sing_leader);
+  const dimension_type num_no_sing_leaders = no_sing_leaders.size();
+
+  Octagonal_Shape aux(space_dim);
+  // Step 2: add to auxiliary octagon only non-redundant
+  // constraints and construct a 0-cycle using only
+  // the leaders of the non-singular classes.
+  for (dimension_type li = 0; li < num_no_sing_leaders; ++li) {
+    const dimension_type i = no_sing_leaders[li];
+    const dimension_type ci = coherent_index(i);
+    typename OR_Matrix<N>::const_row_reference_type m_i =
+      *(matrix.row_begin()+i);
+    typename OR_Matrix<N>::row_reference_type aux_i =
+      *(aux.matrix.row_begin()+i);
+    if (i%2 == 0) {
+      // Each positive equivalence class must have a single 0-cycle
+      // connecting all equivalent variables in increasing order.
+      // Note: by coherence assumption, the variables in the
+      // corresponding negative equivalence class are
+      // automatically connected.
+      if (i != successor[i]) {
+        dimension_type j = i;
+        dimension_type next_j = successor[j];
+        while (j != next_j) {
+          aux.matrix[next_j][j] = matrix[next_j][j];
+          j = next_j;
+          next_j = successor[j];
+        }
+        const dimension_type cj = coherent_index(j);
+        aux.matrix[cj][ci] = matrix[cj][ci];
+      }
+    }
 
-  //! Check whether <EM>all</EM> bits in \p mask are set.
-  bool test_all(flags_t mask) const;
+    dimension_type rs_li = (li%2) ? li :li+1;
+    // Check if the constraint is redundant.
+    DIRTY_TEMP(N, tmp);
+    for (dimension_type lj = 0 ; lj <= rs_li; ++lj) {
+      const dimension_type j = no_sing_leaders[lj];
+      const dimension_type cj = coherent_index(j);
+      const N& m_i_j = m_i[j];
+      const N& m_i_ci = m_i[ci];
+      bool to_add = true;
+      // Control if the constraint is redundant by strong-coherence,
+      // that is:
+      // m_i_j >= (m_i_ci + m_cj_j)/2,   where j != ci.
+      if (j != ci) {
+        add_assign_r(tmp, m_i_ci, matrix[cj][j], ROUND_UP);
+        div2exp_assign_r(tmp, tmp, 1, ROUND_UP);
+        if (m_i_j >= tmp) {
+          to_add = false;
+          continue;
+        }
+      }
+      // Control if the constraint is redundant by strong closure, that is
+      // if there is a path from i to j (i = i_0, ... , i_n = j), such that
+      // m_i_j = sum_{k=0}^{n-1} m_{i_k}_{i_(k+1)}.
+      // Since the octagon is already strongly closed, the above relation
+      // is reduced to three case, in accordance with k, i, j inter-depend:
+      // exit k such that
+      // 1.) m_i_j >= m_i_k   + m_cj_ck,   if k < j < i; or
+      // 2.) m_i_j >= m_i_k   + m_k,_j,    if j < k < i; or
+      // 3.) m_i_j >= m_ck_ci + m_k_j,     if j < i < k.
+      // Note: `i > j'.
+      for (dimension_type lk = 0; lk < num_no_sing_leaders; ++lk) {
+        const dimension_type k = no_sing_leaders[lk];
+        if (k != i && k != j) {
+          dimension_type ck = coherent_index(k);
+          if (k < j)
+            // Case 1.
+            add_assign_r(tmp, m_i[k], matrix[cj][ck], ROUND_UP);
+          else if (k < i)
+            // Case 2.
+            add_assign_r(tmp, m_i[k], matrix[k][j], ROUND_UP);
+          else
+            // Case 3.
+            add_assign_r(tmp, matrix[ck][ci], matrix[k][j], ROUND_UP);
+
+          // Checks if the constraint is redundant.
+          if (m_i_j >= tmp) {
+            to_add = false;
+            break;
+          }
+        }
+      }
 
-  //! Check whether <EM>at least one</EM> bit in \p mask is set.
-  bool test_any(flags_t mask) const;
+      // The constraint is not redundant.
+      if (to_add)
+        aux_i[j] = m_i_j;
+    }
+  }
 
-  //! Set the bits in \p mask.
-  void set(flags_t mask);
+  // If there exist a singular equivalence class, then it must have a
+  // single 0-cycle connecting all the positive and negative equivalent
+  // variables.
+  // Note: the singular class is not connected with the other classes.
+  if (exist_sing_class) {
+    aux.matrix[sing_leader][sing_leader+1]
+      = matrix[sing_leader][sing_leader+1];
+    if (successor[sing_leader+1] != sing_leader+1) {
+      dimension_type j = sing_leader;
+      dimension_type next_jj = successor[j+1];
+      while (next_jj != j+1) {
+        aux.matrix[next_jj][j] = matrix[next_jj][j];
+        j = next_jj;
+        next_jj = successor[j+1];
+      }
+      aux.matrix[j+1][j] = matrix[j+1][j];
+    }
+    else
+      aux.matrix[sing_leader+1][sing_leader]
+        = matrix[sing_leader+1][sing_leader];
+  }
 
-  //! Reset the bits in \p mask.
-  void reset(flags_t mask);
-};
+  Octagonal_Shape<T>& x = const_cast<Octagonal_Shape<T>&>(*this);
+  aux.reset_strongly_closed();
 
-// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 1856
-#undef PPL_IN_Polyhedron_CLASS
+#ifndef NDEBUG
+  {
+    // We assume that `aux' is equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = aux;
+    assert(x_copy == y_copy);
+  }
+#endif
 
-  //! The status flags to keep track of the polyhedron's internal state.
-  Status status;
+  std::swap(x, aux);
+  assert(is_strongly_reduced());
+}
 
-  //! The number of dimensions of the enclosing vector space.
-  dimension_type space_dim;
 
-  //! Returns the topological kind of the polyhedron.
-  Topology topology() const;
+template <typename T>
+void
+Octagonal_Shape<T>::oct_hull_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("oct_hull_assign(y)", y);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the polyhedron
-    is necessarily closed.
-  */
-  bool is_necessarily_closed() const;
+  // The hull of an octagon `x' with an empty octagon is `x'.
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
 
-  //! \name Private Verifiers: Verify if Individual Flags are Set
-  //@{
+  // The oct-hull is obtained by computing maxima.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end; ++i, ++j)
+    max_assign(*i, *j);
 
-  //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
-  /*!
-    The return value <CODE>false</CODE> does not necessarily
-    implies that \p *this is non-empty.
-  */
-  bool marked_empty() const;
+  // The result is still closed.
+  assert(OK());
+}
 
-  //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
-  bool constraints_are_up_to_date() const;
+template <typename T>
+void
+Octagonal_Shape<T>::oct_difference_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("oct_difference_assign(y)", y);
 
-  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
-  bool generators_are_up_to_date() const;
+  Octagonal_Shape& x = *this;
 
-  //! Returns <CODE>true</CODE> if the system of constraints is minimized.
-  /*!
-    Note that only \em weak minimization is entailed, so that
-    an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
-  */
-  bool constraints_are_minimized() const;
+  // Being lazy here is only harmful.
+  // We close.
+  x.strong_closure_assign();
+  // The difference of an empty octagon and of an octagon `p' is empty.
+  if (x.marked_empty())
+    return;
+  // The difference of a octagon `p' and an empty octagon is `p'.
+  if (y.marked_empty())
+    return;
 
-  //! Returns <CODE>true</CODE> if the system of generators is minimized.
-  /*!
-    Note that only \em weak minimization is entailed, so that
-    an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
-  */
-  bool generators_are_minimized() const;
+  // If both octagons are zero-dimensional,
+  // then at this point they are necessarily universe octagons,
+  // so that their difference is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
 
-  //! Returns <CODE>true</CODE> if there are pending constraints.
-  bool has_pending_constraints() const;
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
 
-  //! Returns <CODE>true</CODE> if there are pending generators.
-  bool has_pending_generators() const;
+  Octagonal_Shape new_oct(space_dim, EMPTY);
+  // We take a constraint of the octagon y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementaries with the octagon x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the octagon `x' is included the octagon defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty octagon, and as we would obtain
+    // a result that is less precise than the oct_difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    Octagonal_Shape z = x;
+    const Linear_Expression e = Linear_Expression(c);
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_oct.oct_hull_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_oct.oct_hull_assign(z);
+    }
+  }
+  *this = new_oct;
+  assert(OK());
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if there are
-    either pending constraints or pending generators.
-  */
-  bool has_something_pending() const;
+template <typename T>
+bool
+Octagonal_Shape<T>
+::simplify_using_context_assign(const Octagonal_Shape& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
 
-  //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
-  bool can_have_something_pending() const;
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_embed(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if the saturation matrix \p sat_c
-    is up-to-date.
-  */
-  bool sat_c_is_up_to_date() const;
+  const dimension_type new_dim = space_dim + m;
+  const bool was_zero_dim_univ = !marked_empty() && space_dim == 0;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if the saturation matrix \p sat_g
-    is up-to-date.
-  */
-  bool sat_g_is_up_to_date() const;
+  // To embed an n-dimension space octagon in a (n+m)-dimension space,
+  // we just add `m' variables in the matrix of constraints.
+  matrix.grow(new_dim);
+  space_dim = new_dim;
+  // If `*this' was the zero-dim space universe octagon,
+  // then we can set the strongly closure flag.
+  if (was_zero_dim_univ)
+    set_strongly_closed();
 
-  //@} // Private Verifiers: Verify if Individual Flags are Set
+  assert(OK());
+}
 
-  //! \name State Flag Setters: Set Only the Specified Flags
-  //@{
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_project(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
 
-  /*! \brief
-    Sets \p status to express that the polyhedron is the universe
-    0-dimension vector space, clearing all corresponding matrices.
-  */
-  void set_zero_dim_univ();
+  const dimension_type n = matrix.num_rows();
+
+  // To project an n-dimension space OS in a (space_dim+m)-dimension space,
+  // we just add `m' columns and rows in the matrix of constraints.
+  add_space_dimensions_and_embed(m);
+  // We insert 0 where it needs.
+  // Attention: now num_rows of matrix is update!
+  for (typename OR_Matrix<N>::row_iterator i = matrix.row_begin() + n,
+         matrix_row_end =  matrix.row_end(); i != matrix_row_end; i += 2) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i;
+    typename OR_Matrix<N>::row_reference_type x_ci = *(i+1);
+    const dimension_type ind = i.index();
+    assign_r(x_i[ind+1], 0, ROUND_NOT_NEEDED);
+    assign_r(x_ci[ind], 0, ROUND_NOT_NEEDED);
+  }
 
-  /*! \brief
-    Sets \p status to express that the polyhedron is empty,
-    clearing all corresponding matrices.
-  */
-  void set_empty();
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
 
-  //! Sets \p status to express that constraints are up-to-date.
-  void set_constraints_up_to_date();
+template <typename T>
+void
+Octagonal_Shape<T>
+::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a octagon in a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
 
-  //! Sets \p status to express that generators are up-to-date.
-  void set_generators_up_to_date();
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_removed.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
 
-  //! Sets \p status to express that constraints are minimized.
-  void set_constraints_minimized();
+  const dimension_type new_space_dim = space_dim - to_be_removed.size();
 
-  //! Sets \p status to express that generators are minimized.
-  void set_generators_minimized();
+  strong_closure_assign();
+  // When removing _all_ dimensions from an octagon,
+  // we obtain the zero-dimensional octagon.
+  if (new_space_dim == 0) {
+    matrix.shrink(0);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    space_dim = 0;
+    assert(OK());
+    return;
+  }
 
-  //! Sets \p status to express that constraints are pending.
-  void set_constraints_pending();
+  // We consider every variable and we check if it is to be removed.
+  // If it is to be removed, we pass to the successive one, elsewhere
+  // we move its elements in the right position.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  dimension_type ftr = *tbr;
+  dimension_type ftr_size = 2*ftr*(ftr+1);
+  typename OR_Matrix<N>::element_iterator
+    iter = matrix.element_begin()+ftr_size;
+
+  dimension_type i = ftr + 1;
+  while (i < space_dim) {
+    if (to_be_removed.count(i) != 0)
+      ++i;
+    else {
+      typename OR_Matrix<N>::row_iterator
+        row_iter = matrix.row_begin()+2*i;
+      typename OR_Matrix<N>::row_reference_type
+        row_ref = *row_iter;
+      typename OR_Matrix<N>::row_reference_type
+        row_ref1 = *(++row_iter);
+      // If variable(j) is to remove, we pass another variable,
+      // else we shift its cells to up right.
+      // Attention: first we shift the cells corrispondent to the first
+      // row of variable(j), then we shift the cells corrispondent to the
+      // second row. We recall that every variable is represented
+      // in the `matrix' by two rows and two rows.
+      for (dimension_type j = 0; j <= i; ++j)
+        if (to_be_removed.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref[2*j]);
+          assign_or_swap(*(iter++), row_ref[2*j+1]);
+        }
+      for (dimension_type j = 0; j <= i; ++j)
+        if (to_be_removed.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref1[2*j]);
+          assign_or_swap(*(iter++), row_ref1[2*j+1]);
+        }
+      ++i;
+    }
+  }
+  // Update the space dimension.
+  matrix.shrink(new_space_dim);
+  space_dim = new_space_dim;
+  assert(OK());
+}
 
-  //! Sets \p status to express that generators are pending.
-  void set_generators_pending();
+template <typename T>
+template <typename Partial_Function>
+void
+Octagonal_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
 
-  //! Sets \p status to express that \p sat_c is up-to-date.
-  void set_sat_c_up_to_date();
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the octagon becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
 
-  //! Sets \p status to express that \p sat_g is up-to-date.
-  void set_sat_g_up_to_date();
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    strong_closure_assign();
 
-  //@} // State Flag Setters: Set Only the Specified Flags
+  // If the octagon is empty, then it is sufficient to adjust
+  // the space dimension of the octagon.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
 
-  //! \name State Flag Cleaners: Clear Only the Specified Flag
-  //@{
+  // We create a new matrix with the new space dimension.
+  OR_Matrix<N> x(new_space_dim);
 
-  //! Clears the \p status flag indicating that the polyhedron is empty.
-  void clear_empty();
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
 
-  //! Sets \p status to express that constraints are no longer up-to-date.
-  /*!
-    This also implies that they are neither minimized
-    and both saturation matrices are no longer meaningful.
-  */
-  void clear_constraints_up_to_date();
+  Row_Iterator m_begin = x.row_begin();
+  Row_Iterator m_end = x.row_end();
 
-  //! Sets \p status to express that generators are no longer up-to-date.
-  /*!
-    This also implies that they are neither minimized
-    and both saturation matrices are no longer meaningful.
-  */
-  void clear_generators_up_to_date();
+  for (Row_Iterator i_iter = matrix.row_begin(), i_end = matrix.row_end();
+       i_iter != i_end; i_iter += 2) {
+    dimension_type new_i;
+    dimension_type i = i_iter.index()/2;
+    // We copy and place in the position into `x' the only cells of
+    // the `matrix' that refer to both mapped variables,
+    // the variable `i' and `j'.
+    if (pfunc.maps(i, new_i)) {
+      Row_Reference r_i = *i_iter;
+      Row_Reference r_ii = *(i_iter + 1);
+      dimension_type double_new_i = 2*new_i;
+      Row_Iterator x_iter = m_begin + double_new_i;
+      Row_Reference x_i = *x_iter;
+      Row_Reference x_ii = *(x_iter + 1);
+      for (dimension_type j = 0; j <= i; ++j) {
+        dimension_type new_j;
+        // If also the second variable is mapped, we work.
+        if (pfunc.maps(j, new_j)) {
+          dimension_type dj = 2*j;
+          dimension_type double_new_j = 2*new_j;
+          // Mapped the constraints, exchanging the indexes.
+          // Attention: our matrix is pseudo-triangular.
+          // If new_j > new_i, we must consider, as rows, the rows of
+          // the variable new_j, and not of new_i ones.
+          if (new_i >= new_j) {
+            assign_or_swap(x_i[double_new_j], r_i[dj]);
+            assign_or_swap(x_ii[double_new_j], r_ii[dj]);
+            assign_or_swap(x_ii[double_new_j+1], r_ii[dj + 1]);
+            assign_or_swap(x_i[double_new_j+1], r_i[dj + 1]);
+          }
+          else {
+            Row_Iterator xj_iter = m_begin + double_new_j;
+            Row_Reference x_j = *xj_iter;
+            Row_Reference x_jj = *(xj_iter + 1);
+            assign_or_swap(x_jj[double_new_i+1], r_i[dj]);
+            assign_or_swap(x_jj[double_new_i], r_ii[dj]);
+            assign_or_swap(x_j[double_new_i+1], r_i[dj+1]);
+            assign_or_swap(x_j[double_new_i], r_ii[dj+1]);
+          }
+
+        }
+      }
+    }
+  }
 
-  //! Sets \p status to express that constraints are no longer minimized.
-  void clear_constraints_minimized();
+  std::swap(matrix, x);
+  space_dim = new_space_dim;
+  assert(OK());
+}
 
-  //! Sets \p status to express that generators are no longer minimized.
-  void clear_generators_minimized();
+template <typename T>
+void
+Octagonal_Shape<T>::intersection_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", y);
 
-  //! Sets \p status to express that there are no longer pending constraints.
-  void clear_pending_constraints();
+  // If one of the two octagons is empty, the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+  // If both octagons are zero-dimensional,then at this point
+  // they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
 
-  //! Sets \p status to express that there are no longer pending generators.
-  void clear_pending_generators();
+  // To intersect two octagons we compare the constraints
+  // and we choose the less values.
+  bool changed = false;
 
-  //! Sets \p status to express that \p sat_c is no longer up-to-date.
-  void clear_sat_c_up_to_date();
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+    const N& y_elem = *j;
+    if (y_elem < elem) {
+      elem = y_elem;
+      changed = true;
+    }
+  }
 
-  //! Sets \p status to express that \p sat_g is no longer up-to-date.
-  void clear_sat_g_up_to_date();
+  // This method not preserve the closure.
+  if (changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
 
-  //@} // State Flag Cleaners: Clear Only the Specified Flag
+template <typename T>
+template <typename Iterator>
+void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                              Iterator first, Iterator last,
+                                              unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
 
-  //! \name The Handling of Pending Rows
-  //@{
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-  /*! \brief
-    Processes the pending rows of either description of the polyhedron
-    and obtains a minimized polyhedron.
+  // If both octagons are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
 
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
+  strong_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.strong_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
 
-    It is assumed that the polyhedron does have some constraints or
-    generators pending.
-  */
-  bool process_pending() const;
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
 
-  //! Processes the pending constraints and obtains a minimized polyhedron.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    const N& y_elem = *j;
+    N& elem = *i;
+    if (y_elem < elem) {
+      Iterator k = std::lower_bound(first, last, elem);
+      if (k != last) {
+        if (elem < *k)
+          assign_r(elem, *k, ROUND_UP);
+      }
+      else
+assign_r(        elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
 
-    It is assumed that the polyhedron does have some pending constraints.
-  */
-  bool process_pending_constraints() const;
+  reset_strongly_closed();
+  assert(OK());
+}
 
-  //! Processes the pending generators and obtains a minimized polyhedron.
-  /*!
-    It is assumed that the polyhedron does have some pending generators.
-  */
-  void process_pending_generators() const;
+template <typename T>
+void
+Octagonal_Shape<T>
+::get_limiting_octagon(const Constraint_System& cs,
+                       Octagonal_Shape& limiting_octagon) const {
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  assert(cs_space_dim <= space_dim);
 
-  /*! \brief
-    Lazily integrates the pending descriptions of the polyhedron
-    to obtain a constraint system without pending rows.
+  strong_closure_assign();
+  bool is_oct_changed = false;
 
-    It is assumed that the polyhedron does have some constraints or
-    generators pending.
-  */
-  void remove_pending_to_obtain_constraints() const;
+  // Allocate temporaries outside of the loop.
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(term);
+  DIRTY_TEMP(N, d);
 
-  /*! \brief
-    Lazily integrates the pending descriptions of the polyhedron
-    to obtain a generator system without pending rows.
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not octagonal differences are ignored.
+    if (!extract_octagonal_difference(c, cs_space_dim, num_vars, i, j,
+                                      coeff, term))
+      continue;
 
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
+    typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+    typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+    typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+    typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+    Row_iterator m_begin = matrix.row_begin();
+    // Select the cell to be modified for the "<=" part of the constraint.
+    Row_iterator i_iter = m_begin + i;
+    Row_reference m_i = *i_iter;
+    OR_Matrix<N>& lo_mat = limiting_octagon.matrix;
+    Row_Iterator lo_iter = lo_mat.row_begin() + i;
+    Row_Reference lo_m_i = *lo_iter;
+    N& lo_m_i_j = lo_m_i[j];
+    if (coeff < 0)
+      neg_assign(coeff);
+    // Compute the bound for `m_i_j', rounding towards plus infinity.
+    div_round_up(d, term, coeff);
+    if (m_i[j] <= d)
+      if (c.is_inequality()) {
+        if (lo_m_i_j > d) {
+          lo_m_i_j = d;
+          is_oct_changed = true;
+        }
+        else {
+          // Select the right row of the cell.
+          if (i%2 == 0) {
+            ++i_iter;
+            ++lo_iter;
+          }
+          else {
+            --i_iter;
+            --lo_iter;
+          }
+          Row_reference m_ci = *i_iter;
+          Row_Reference lo_m_ci = *lo_iter;
+          // Select the right column of the cell.
+          dimension_type cj = coherent_index(j);
+          N& lo_m_ci_cj = lo_m_ci[cj];
+          neg_assign(term);
+          div_round_up(d, term, coeff);
+          if (m_ci[cj] <= d && lo_m_ci_cj > d) {
+            lo_m_ci_cj = d;
+            is_oct_changed = true;
+          }
+        }
+      }
+  }
+  // In general, adding a constraint does not preserve the strongly
+  // closure of the octagon.
+  if (is_oct_changed && limiting_octagon.marked_strongly_closed())
+    limiting_octagon.reset_strongly_closed();
+}
 
-    It is assumed that the polyhedron does have some constraints or
-    generators pending.
-  */
-  bool remove_pending_to_obtain_generators() const;
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                    const Constraint_System& cs,
+                                    unsigned* tp) {
 
-  //@} // The Handling of Pending Rows
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
 
-  //! \name Updating and Sorting Matrices
-  //@{
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
 
-  //! Updates constraints starting from generators and minimizes them.
-  /*!
-    The resulting system of constraints is only partially sorted:
-    the equalities are in the upper part of the matrix,
-    while the inequalities in the lower part.
-  */
-  void update_constraints() const;
+  // The limited CC76-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
 
-  //! Updates generators starting from constraints and minimizes them.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-    The resulting system of generators is only partially sorted:
-    the lines are in the upper part of the matrix,
-    while rays and points are in the lower part.
-    It is illegal to call this method when the Status field
-    already declares the polyhedron to be empty.
-  */
-  bool update_generators() const;
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
 
-  //! Updates \p sat_c using the updated constraints and generators.
-  /*!
-    It is assumed that constraints and generators are up-to-date
-    and minimized and that the Status field does not already flag
-    \p sat_c to be up-to-date.
-    The values of the saturation matrix are computed as follows:
-    \f[
-      \begin{cases}
-        sat\_c[i][j] = 0,
-          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
-        sat\_c[i][j] = 1,
-          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
-      \end{cases}
-    \f]
-  */
-  void update_sat_c() const;
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
 
-  //! Updates \p sat_g using the updated constraints and generators.
-  /*!
-    It is assumed that constraints and generators are up-to-date
-    and minimized and that the Status field does not already flag
-    \p sat_g to be up-to-date.
-    The values of the saturation matrix are computed as follows:
-    \f[
-      \begin{cases}
-        sat\_g[i][j] = 0,
-          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
-        sat\_g[i][j] = 1,
-          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
-      \end{cases}
-    \f]
-  */
-  void update_sat_g() const;
+template <typename T>
+void
+Octagonal_Shape<T>::BHMZ05_widening_assign(const Octagonal_Shape& y,
+                                           unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
 
-  //! Sorts the matrix of constraints keeping status consistency.
-  /*!
-    It is assumed that constraints are up-to-date.
-    If at least one of the saturation matrices is up-to-date,
-    then \p sat_g is kept consistent with the sorted matrix
-    of constraints.
-    The method is declared \p const because reordering
-    the constraints does not modify the polyhedron
-    from a \e logical point of view.
-  */
-  void obtain_sorted_constraints() const;
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-  //! Sorts the matrix of generators keeping status consistency.
-  /*!
-    It is assumed that generators are up-to-date.
-    If at least one of the saturation matrices is up-to-date,
-    then \p sat_c is kept consistent with the sorted matrix
-    of generators.
-    The method is declared \p const because reordering
-    the generators does not modify the polyhedron
-    from a \e logical point of view.
-  */
-  void obtain_sorted_generators() const;
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
 
-  //! Sorts the matrix of constraints and updates \p sat_c.
-  /*!
-    It is assumed that both constraints and generators
-    are up-to-date and minimized.
-    The method is declared \p const because reordering
-    the constraints does not modify the polyhedron
-    from a \e logical point of view.
-  */
-  void obtain_sorted_constraints_with_sat_c() const;
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  assert(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
 
-  //! Sorts the matrix of generators and updates \p sat_g.
-  /*!
-    It is assumed that both constraints and generators
-    are up-to-date and minimized.
-    The method is declared \p const because reordering
-    the generators does not modify the polyhedron
-    from a \e logical point of view.
-  */
-  void obtain_sorted_generators_with_sat_g() const;
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
 
-  //@} // Updating and Sorting Matrices
+  // Here no token is available.
+  assert(marked_strongly_closed() && y.marked_strongly_closed());
+  // Minimize `y'.
+  y.strong_reduction_assign();
+
+  // Extrapolate unstable bounds.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+       matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+    if (*j != elem)
+      assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  reset_strongly_closed();
+  assert(OK());
+}
 
-  //! \name Weak and Strong Minimization of Descriptions
-  //@{
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                      const Constraint_System& cs,
+                                      unsigned* tp) {
 
-  //! Applies (weak) minimization to both the constraints and generators.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
 
-    Minimization is not attempted if the Status field already declares
-    both systems to be minimized.
-  */
-  bool minimize() const;
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
 
-  //! Applies strong minimization to the constraints of an NNC polyhedron.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
-  */
-  bool strongly_minimize_constraints() const;
+  // The limited BHMZ05-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
 
-  //! Applies strong minimization to the generators of an NNC polyhedron.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty polyhedron.
-  */
-  bool strongly_minimize_generators() const;
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-  //@} // Weak and Strong Minimization of Descriptions
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
 
-  enum Three_Valued_Boolean {
-    TVB_TRUE,
-    TVB_FALSE,
-    TVB_DONT_KNOW
-  };
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
 
-  //! Polynomial but incomplete equivalence test between polyhedra.
-  Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+template <typename T>
+void
+Octagonal_Shape<T>::CC76_narrowing_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
-  bool is_included_in(const Polyhedron& y) const;
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const Octagonal_Shape x_copy = *this;
+    const Octagonal_Shape y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
 
-  //! Checks if and how \p expr is bounded in \p *this.
-  /*!
-    Returns <CODE>true</CODE> if and only if \p from_above is
-    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
-    or \p from_above is <CODE>false</CODE> and \p expr is bounded
-    from below in \p *this.
+  // If both octagons are zero-dimensional, since `*this' contains `y',
+  // we simply return '*this'.
+  if (space_dim == 0)
+    return;
 
-    \param expr
-    The linear expression to test;
+  y.strong_closure_assign();
+  // If `y' is empty, since `y' contains `*this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
 
-    \param from_above
-    <CODE>true</CODE> if and only if the boundedness of interest is
-    "from above".
+  // We consider a constraint of `*this', if its value is `plus_infinity',
+  // we take the value of the corresponding constraint of `y'.
+  bool is_oct_changed = false;
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+       matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+     if (!is_plus_infinity(*i)
+         && !is_plus_infinity(*j)
+         && *i != *j) {
+      *i = *j;
+      is_oct_changed = true;
+    }
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
-  */
-  bool bounds(const Linear_Expression& expr, bool from_above) const;
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
+}
 
-  //! Maximizes or minimizes \p expr subject to \p *this.
-  /*!
-    \param expr
-    The linear expression to be maximized or minimized subject to \p
-    *this;
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_v_pm_u_bounds(const dimension_type v_id,
+                       const dimension_type last_id,
+                       const Linear_Expression& sc_expr,
+                       Coefficient_traits::const_reference sc_den,
+                       const N& ub_v) {
+  // Private method: the caller has to ensure the following.
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(ub_v));
 
-    \param maximize
-    <CODE>true</CODE> if maximization is what is wanted;
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
 
-    \param ext_n
-    The numerator of the extremum value;
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_cv = matrix[n_v+1];
+
+  // Speculatively allocate temporaries out of the loop.
+  DIRTY_TEMP(N, half);
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, minus_q);
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP0(mpq_class, lb_u);
+  DIRTY_TEMP(N, up_approx);
+  TEMP_INTEGER(minus_expr_u);
+
+  for (dimension_type u_id = last_id+1; u_id-- > 0; ) {
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id));
+    // Skip the case when `expr_u == 0'.
+    if (expr_u == 0)
+      continue;
 
-    \param ext_d
-    The denominator of the extremum value;
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `v - u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_den) {
+        // Here q >= 1: deducing `v - u <= ub_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_cu_u / 2.
+        div2exp_assign_r(half, matrix[n_u+1][n_u], 1, ROUND_UP);
+        N& m_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v] : m_cv[n_u+1];
+        sub_assign_r(m_v_minus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u+1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v - u' is
+          // computed as `ub_v - (q * ub_u + (1-q) * lb_u)',
+          // i.e., `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+          assign_r(minus_lb_u, m_u_cu, ROUND_NOT_NEEDED);
+          div2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(ub_u, matrix[n_u+1][n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+          N& m_v_minus_u = (n_v < n_u) ? m_u[n_v] : m_cv[n_u+1];
+          add_assign_r(m_v_minus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      assert(expr_u < 0);
+      // If `expr_u' is negative, we can improve `v + u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_den) {
+        // Here q <= -1: Deducing `v + u <= ub_v + lb_u'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_u_cu / 2.
+        div2exp_assign_r(half, matrix[n_u][n_u+1], 1, ROUND_UP);
+        N& m_v_plus_u = (n_v < n_u) ? matrix[n_u+1][n_v] : m_cv[n_u];
+        sub_assign_r(m_v_plus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u+1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v + u' is
+          // computed as `ub_v + ((-q) * lb_u + (1+q) * ub_u)',
+          // i.e., `ub_v + ub_u + (-q) * (lb_u - ub_u)'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(minus_q, minus_expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(minus_q, minus_q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED);
+          div2exp_assign_r(lb_u, lb_u, 1, ROUND_NOT_NEEDED);
+          neg_assign_r(lb_u, lb_u, ROUND_NOT_NEEDED);
+          // Compute `lb_u - ub_u'.
+          sub_assign_r(lb_u, lb_u, ub_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u + (-q) * (lb_u - ub_u)'.
+          add_mul_assign_r(ub_u, minus_q, lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `v + u <= ub_v + ((-q) * lb_u + (1+q) * ub_u)'.
+          N& m_v_plus_u = (n_v < n_u) ? m_cu[n_v] : m_cv[n_u];
+          add_assign_r(m_v_plus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
 
-    \param included
-    <CODE>true</CODE> if and only if the extremum of \p expr can
-    actually be reached in \p * this;
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_minus_v_pm_u_bounds(const dimension_type v_id,
+                             const dimension_type last_id,
+                             const Linear_Expression& sc_expr,
+                             Coefficient_traits::const_reference sc_den,
+                             const N& minus_lb_v) {
+  // Private method: the caller has to ensure the following.
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(minus_lb_v));
 
-    \param point
-    When maximization or minimization succeeds, will be assigned
-    a point or closure point where \p expr reaches the
-    corresponding extremum value.
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_v = matrix[n_v];
+
+  // Speculatively allocate temporaries out of the loop.
+  DIRTY_TEMP(N, half);
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP(N, up_approx);
+  TEMP_INTEGER(minus_expr_u);
+
+  for (dimension_type u_id = last_id+1; u_id-- > 0; ) {
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id));
+    // Skip the case when `expr_u == 0'.
+    if (expr_u == 0)
+      continue;
 
-    If \p *this is empty or \p expr is not bounded in the appropriate
-    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
-    \p included and \p point are left untouched.
-  */
-  bool max_min(const Linear_Expression& expr,
-	       const bool maximize,
-	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
-	       Generator& point) const;
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `-v + u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_den) {
+        // Here q >= 1: deducing `-v + u <= lb_u - lb_v',
+        // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_u_cu / 2.
+        div2exp_assign_r(half, matrix[n_u][n_u+1], 1, ROUND_UP);
+        N& m_u_minus_v = (n_v < n_u) ? matrix[n_u+1][n_v+1] : m_v[n_u];
+        sub_assign_r(m_u_minus_v, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u+1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `u - v' is
+          // computed as `(q * lb_u + (1-q) * ub_u) - lb_v',
+          // i.e., `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED);
+          div2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(minus_lb_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `u - v <= -lb_v - (q * lb_u + (1-q) * ub_u)'.
+          N& m_u_minus_v = (n_v < n_u) ? m_cu[n_v+1] : m_v[n_u];
+          add_assign_r(m_u_minus_v, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      assert(expr_u < 0);
+      // If `expr_u' is negative, we can improve `-v - u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_den) {
+        // Here q <= -1: Deducing `-v - u <= -lb_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_cu_u / 2.
+        div2exp_assign_r(half, matrix[n_u+1][n_u], 1, ROUND_UP);
+        N& m_minus_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v+1] : m_v[n_u+1];
+        sub_assign_r(m_minus_v_minus_u, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u+1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `-v - u' is
+          // computed as `-lb_v - ((-q)*ub_u + (1+q)*lb_u)',
+          // i.e., `minus_lb_v - lb_u + q*(ub_u - lb_u)'.
+          assign_r(ub_u, matrix[n_u+1][n_u], ROUND_NOT_NEEDED);
+          div2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, m_u[n_u+1], ROUND_NOT_NEEDED);
+          div2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `-lb_u + q*(ub_u - lb_u)'.
+          add_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `-v - u <= -lb_v - ((-q) * ub_u + (1+q) * lb_u)'.
+          N& m_minus_v_minus_u = (n_v < n_u) ? m_u[n_v+1] : m_v[n_u+1];
+          add_assign_r(m_minus_v_minus_u, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
 
-  //! \name Widening- and Extrapolation-Related Functions
-  //@{
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_all_octagonal_constraints(const dimension_type v_id) {
+  assert(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    assign_r(r_v[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
 
-  /*! \brief
-    Copies to \p cs_selection the constraints of \p y corresponding
-    to the definition of the CH78-widening of \p *this and \p y.
-  */
-  void select_CH78_constraints(const Polyhedron& y,
-			       Constraint_System& cs_selected) const;
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_binary_octagonal_constraints(const dimension_type v_id) {
+  assert(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type k = n_v; k-- > 0; ) {
+    assign_r(r_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
 
-  /*! \brief
-    Splits the constraints of `x' into two subsets, depending on whether
-    or not they are selected to compute the \ref H79_widening "H79-widening"
-    of \p *this and \p y.
-  */
-  void select_H79_constraints(const Polyhedron& y,
-			      Constraint_System& cs_selected,
-			      Constraint_System& cs_not_selected) const;
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type dim = var.id();
+  if (space_dimension() < dim)
+    throw_dimension_incompatible("unconstrain(var)", dim);
 
-  bool BHRZ03_combining_constraints(const Polyhedron& y,
-				    const BHRZ03_Certificate& y_cert,
- 				    const Polyhedron& H79,
-				    const Constraint_System& x_minus_H79_con_sys);
+  // Enforce strong closure for precision.
+  strong_closure_assign();
 
-  bool BHRZ03_evolving_points(const Polyhedron& y,
-			      const BHRZ03_Certificate& y_cert,
-			      const Polyhedron& H79);
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
 
-  bool BHRZ03_evolving_rays(const Polyhedron& y,
-			    const BHRZ03_Certificate& y_cert,
-			    const Polyhedron& H79);
+  forget_all_octagonal_constraints(dim);
+  // Strong closure is preserved.
+  assert(OK());
+}
 
-  //@} // Widening- and Extrapolation-Related Functions
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
 
-  //! Adds new space dimensions to the given matrices.
-  /*!
-    \param mat1
-    The matrix to which columns are added;
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
 
-    \param mat2
-    The matrix to which rows and columns are added;
+  // Enforce strong closure for precision.
+  strong_closure_assign();
 
-    \param sat1
-    The saturation matrix whose columns are indexed by the rows of
-    matrix \p mat1. On entry it is up-to-date;
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
 
-    \param sat2
-    The saturation matrix whose columns are indexed by the rows of \p
-    mat2;
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu)
+    forget_all_octagonal_constraints(*tbu);
+  // Strong closure is preserved.
+  assert(OK());
+}
 
-    \param add_dim
-    The number of space dimensions to add.
+template <typename T>
+void
+Octagonal_Shape<T>::refine(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  assert(denominator != 0);
+  const dimension_type expr_space_dim = expr.space_dimension();
+  assert(space_dim >= expr_space_dim);
+  const dimension_type var_id = var.id();
+  assert(var_id <= space_dim);
+  assert(expr.coefficient(var) == 0);
+  assert(relsym != LESS_THAN && relsym != GREATER_THAN);
 
-    Adds new space dimensions to the vector space modifying the matrices.
-    This function is invoked only by
-    <CODE>add_space_dimensions_and_embed()</CODE> and
-    <CODE>add_space_dimensions_and_project()</CODE>, passing the matrix of
-    constraints and that of generators (and the corresponding saturation
-    matrices) in different order (see those methods for details).
-  */
-  static void add_space_dimensions(Linear_System& mat1,
-				   Linear_System& mat2,
-				   Saturation_Matrix& sat1,
-				   Saturation_Matrix& sat2,
-				   dimension_type add_dim);
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
 
-  //! \name Minimization-Related Static Member Functions
-  //@{
+  // Variable index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
 
-  //! Builds and simplifies constraints from generators (or vice versa).
-  // Detailed Doxygen comment to be found in file minimize.cc.
-  static bool minimize(bool con_to_gen,
-		       Linear_System& source,
-		       Linear_System& dest,
-		       Saturation_Matrix& sat);
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
 
-  /*! \brief
-    Adds given constraints and builds minimized corresponding generators
-    or vice versa.
-  */
-  // Detailed Doxygen comment to be found in file minimize.cc.
-  static bool add_and_minimize(bool con_to_gen,
-			       Linear_System& source1,
-			       Linear_System& dest,
-			       Saturation_Matrix& sat,
-			       const Linear_System& source2);
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*j + b, where `j != v';
+  // - If t == 2, the `expr' is of the general form.
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
 
-  /*! \brief
-    Adds given constraints and builds minimized corresponding generators
-    or vice versa. The given constraints are in \p source.
-  */
-  // Detailed Doxygen comment to be found in file minimize.cc.
-  static bool add_and_minimize(bool con_to_gen,
-			       Linear_System& source,
-			       Linear_System& dest,
-			       Saturation_Matrix& sat);
+  const Row_Iterator m_begin = matrix.row_begin();
+  const dimension_type n_var = 2*var_id;
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
 
-  //! Performs the conversion from constraints to generators and vice versa.
-  // Detailed Doxygen comment to be found in file conversion.cc.
-  static dimension_type conversion(Linear_System& source,
-				   dimension_type start,
-				   Linear_System& dest,
-				   Saturation_Matrix& sat,
-				   dimension_type num_lines_or_equalities);
+  // Since we are only able to record octagonal differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.coefficient(Variable(w_id)) != denominator
+      && expr.coefficient(Variable(w_id)) != minus_den)
+    t = 2;
 
-  /*! \brief
-    Uses Gauss' elimination method to simplify the result of
-    <CODE>conversion()</CODE>.
-  */
-  // Detailed Doxygen comment to be found in file simplify.cc.
-  static int simplify(Linear_System& mat, Saturation_Matrix& sat);
+  if (t == 0) {
+    // Case 1: expr == b.
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+      add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  else if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    const dimension_type n_w = 2*w_id;
+    switch (relsym) {
+    case EQUAL:
+      if (w_coeff == denominator)
+        // Add the new constraint `var - w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w, n_var, b, denominator);
+          add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+        }
+        else {
+          add_octagonal_constraint(n_var+1, n_w+1, b, denominator);
+          add_octagonal_constraint(n_var, n_w, b, minus_den);
+        }
+      else
+        // Add the new constraint `var + w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w+1, n_var, b, denominator);
+          add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+        }
+        else {
+          add_octagonal_constraint(n_var+1, n_w, b, denominator);
+          add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+        }
+      break;
+    case LESS_OR_EQUAL:
+      {
+        DIRTY_TEMP(N, d);
+        div_round_up(d, b, denominator);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraints `v - w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var, d);
+          else
+            add_octagonal_constraint(n_var+1, n_w+1, d);
+        }
+        else if (w_coeff == minus_den) {
+          // Add the new constraints `v + w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w+1, n_var, d);
+          else
+            add_octagonal_constraint(n_var+1, n_w, d);
+        }
+        break;
+      }
 
-  //@} // Minimization-Related Static Member Functions
+    case GREATER_OR_EQUAL:
+      {
+        DIRTY_TEMP(N, d);
+        div_round_up(d, b, minus_den);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraint `v - w >= b/denominator',
+          // i.e.,  `-v + w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w+1, n_var+1, d);
+          else
+            add_octagonal_constraint(n_var, n_w, d);
+        }
+        else if (w_coeff == minus_den) {
+          // Add the new constraints `v + w >= b/denominator',
+          // i.e.,  `-v - w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var+1, d);
+          else
+            add_octagonal_constraint(n_var, n_w+1, d);
+        }
+        break;
+      }
 
-  template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
-  friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
-  friend class Parma_Polyhedra_Library::H79_Certificate;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  else {
+    // Here t == 2, so that
+    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+    const bool is_sc = (denominator > 0);
+    TEMP_INTEGER(minus_b);
+    neg_assign(minus_b, b);
+    const Coefficient& sc_b = is_sc ? b : minus_b;
+    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+    const Coefficient& sc_den = is_sc ? denominator : minus_den;
+    const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+    // when `denominator' is negative. Do not use it unless you are sure
+    // it has been correctly assigned.
+    Linear_Expression minus_expr;
+    if (!is_sc)
+      minus_expr = -expr;
+    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
+    DIRTY_TEMP(N, sum);
+    // Index of variable that is unbounded in `this'.
+    // (The initialization is just to quiet a compiler warning.)
+    dimension_type pinf_index = 0;
+    // Number of unbounded variables found.
+    dimension_type pinf_count = 0;
 
-  //! \name Exception Throwers
-  //@{
-protected:
-  void throw_runtime_error(const char* method) const;
-  void throw_invalid_argument(const char* method, const char* reason) const;
+    switch (relsym) {
+    case EQUAL:
+      {
+        DIRTY_TEMP(N, neg_sum);
+        // Index of variable that is unbounded in `this'.
+        // (The initialization is just to quiet a compiler warning.)
+        dimension_type neg_pinf_index = 0;
+        // Number of unbounded variables found.
+        dimension_type neg_pinf_count = 0;
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+        assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        DIRTY_TEMP(N, coeff_i);
+        DIRTY_TEMP(N, half);
+        TEMP_INTEGER(minus_sc_i);
+        DIRTY_TEMP(N, minus_coeff_i);
+        // Note: indices above `w' can be disregarded, as they all have
+        // a zero coefficient in `sc_expr'.
+        for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_reference m_i = *m_iter;
+          ++m_iter;
+          Row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i > 0) {
+            assign_r(coeff_i, sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i+1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+          else if (sign_i < 0) {
+            neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+            assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i+1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+        }
+        // Return immediately if no approximation could be computed.
+        if (pinf_count > 1 && neg_pinf_count > 1) {
+          assert(OK());
+          return;
+        }
+
+        // In the following, strong closure will be definitely lost.
+        reset_strongly_closed();
+
+        // Exploit the upper approximation, if possible.
+        if (pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_den != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_den' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_den'
+            // and negating again the result.
+            DIRTY_TEMP(N, down_sc_den);
+            assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+            neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+            div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+          }
+          // Add the upper bound constraint, if meaningful.
+          if (pinf_count == 0) {
+            // Add the constraint `v <= sum'.
+            DIRTY_TEMP(N, double_sum);
+            mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+            matrix[n_var+1][n_var] = double_sum;
+            // Deduce constraints of the form `v +/- u', where `u != v'.
+            deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, sum);
+          }
+          else
+            // Here `pinf_count == 1'.
+            if (pinf_index != var_id) {
+              const Coefficient& ppi =
+                sc_expr.coefficient(Variable(pinf_index));
+              if (ppi == sc_den)
+                // Add the constraint `v - pinf_index <= sum'.
+                if (var_id < pinf_index)
+                  matrix[2*pinf_index][n_var] = sum;
+                else
+                  matrix[n_var+1][2*pinf_index+1] = sum;
+              else
+                if (ppi == minus_sc_den) {
+                  // Add the constraint `v + pinf_index <= sum'.
+                  if (var_id < pinf_index)
+                    matrix[2*pinf_index+1][n_var] = sum;
+                  else
+                    matrix[n_var+1][2*pinf_index] = sum;
+                }
+            }
+        }
+
+        // Exploit the lower approximation, if possible.
+        if (neg_pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_den != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_den' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_den'
+            // and negating again the result.
+            DIRTY_TEMP(N, down_sc_den);
+            assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+            neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+            div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+          }
+          // Add the lower bound constraint, if meaningful.
+          if (neg_pinf_count == 0) {
+            // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+            DIRTY_TEMP(N, double_neg_sum);
+            mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE);
+            matrix[n_var][n_var+1] = double_neg_sum;
+            // Deduce constraints of the form `-v +/- u', where `u != v'.
+            deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, neg_sum);
+          }
+          else
+            // Here `neg_pinf_count == 1'.
+            if (neg_pinf_index != var_id) {
+              const Coefficient& npi =
+                sc_expr.coefficient(Variable(neg_pinf_index));
+              if (npi == sc_den)
+                // Add the constraint `v - neg_pinf_index >= -neg_sum',
+                // i.e., `neg_pinf_index - v <= neg_sum'.
+                if (neg_pinf_index < var_id)
+                  matrix[n_var][2*neg_pinf_index] = neg_sum;
+                else
+                  matrix[2*neg_pinf_index+1][n_var+1] = neg_sum;
+              else
+                if (npi == minus_sc_den) {
+                  // Add the constraint `v + neg_pinf_index >= -neg_sum',
+                  // i.e., `-neg_pinf_index - v <= neg_sum'.
+                  if (neg_pinf_index < var_id)
+                    matrix[n_var][2*neg_pinf_index+1] = neg_sum;
+                  else
+                    matrix[2*neg_pinf_index][n_var+1] = neg_sum;
+                }
+            }
+        }
+        break;
+      }
 
-  void throw_topology_incompatible(const char* method,
-				   const char* ph_name,
-				   const Polyhedron& ph) const;
-  void throw_topology_incompatible(const char* method,
-				   const char* c_name,
-				   const Constraint& c) const;
-  void throw_topology_incompatible(const char* method,
-				   const char* g_name,
-				   const Generator& g) const;
-  void throw_topology_incompatible(const char* method,
-				   const char* cs_name,
-				   const Constraint_System& cs) const;
-  void throw_topology_incompatible(const char* method,
-				   const char* gs_name,
-				   const Generator_System& gs) const;
+    case LESS_OR_EQUAL:
+      {
+        // Compute an upper approximation for `expr' into `sum',
+        // taking into account the sign of `denominator'.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        DIRTY_TEMP(N, coeff_i);
+        DIRTY_TEMP(N, approx_i);
+        TEMP_INTEGER(minus_sc_i);
+        // Note: indices above `w_id' can be disregarded, as they all have
+        // a zero coefficient in `expr'.
+        for (Row_Iterator m_iter = m_begin, m_end = m_iter + (2*w_id) + 2;
+             m_iter != m_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_Reference m_i = *m_iter;
+          ++m_iter;
+          Row_Reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i+1];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_den != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_den' is known to be
+          // positive, this amounts to rounding downwards, which is achieved
+          // by rounding upwards `minus_sc-den' and negating again the result.
+          DIRTY_TEMP(N, down_sc_den);
+          assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+          neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          DIRTY_TEMP(N, double_sum);
+          mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+          add_octagonal_constraint(n_var+1, n_var, double_sum);
+          // Deduce constraints of the form `v +/- u', where `u != v'.
+          deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              add_octagonal_constraint(pinf_ind, n_var, sum);
+            else
+              add_octagonal_constraint(n_var+1, pinf_ind+1, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_den) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                add_octagonal_constraint(pinf_ind+1, n_var, sum);
+              else
+                add_octagonal_constraint(n_var+1, pinf_ind, sum);
+            }
+          }
+        }
+        break;
+      }
 
-  void throw_dimension_incompatible(const char* method,
-				    const char* other_name,
-				    dimension_type other_dim) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* ph_name,
-				    const Polyhedron& ph) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* e_name,
-				    const Linear_Expression& e) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* c_name,
-				    const Constraint& c) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* g_name,
-				    const Generator& g) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* cg_name,
-				    const Congruence& cg) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* cs_name,
-				    const Constraint_System& cs) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* gs_name,
-				    const Generator_System& gs) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* cgs_name,
-				    const Congruence_System& cgs) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* var_name,
-				    const Variable var) const;
-  void throw_dimension_incompatible(const char* method,
-				    dimension_type required_space_dim) const;
+    case GREATER_OR_EQUAL:
+      {
+        // Compute an upper approximation for `-sc_expr' into `sum'.
+        // Note: approximating `-sc_expr' from above and then negating the
+        // result is the same as approximating `sc_expr' from below.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `-sc_expr'.
+        DIRTY_TEMP(N, coeff_i);
+        DIRTY_TEMP(N, approx_i);
+        TEMP_INTEGER(minus_sc_i);
+        for (Row_Iterator m_iter = m_begin, m_end = m_iter + (2*w_id) + 2;
+             m_iter != m_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_Reference m_i = *m_iter;
+          ++m_iter;
+          Row_Reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `-sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_i[n_i+1] : m_ci[n_i];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_den != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_den' is known to be positive,
+          // this amounts to rounding downwards, which is achieved by rounding
+          // upwards `minus_sc_den' and negating again the result.
+          DIRTY_TEMP(N, down_sc_den);
+          assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+          neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          DIRTY_TEMP(N, double_sum);
+          mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+          add_octagonal_constraint(n_var, n_var+1, double_sum);
+          // Deduce constraints of the form `-v +/- u', where `u != v'.
+          deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_den, sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              add_octagonal_constraint(n_var, pinf_ind, sum);
+            else
+              add_octagonal_constraint(pinf_ind+1, n_var, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_den) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                add_octagonal_constraint(n_var, pinf_ind+1, sum);
+              else
+                add_octagonal_constraint(pinf_ind, n_var+1, sum);
+            }
+          }
+        }
+        break;
+      }
 
-  // Note: it has to be a static method, because it can be called inside
-  // constructors (before actually constructing the polyhedron object).
-  static void throw_space_dimension_overflow(Topology topol,
-					     const char* method,
-					     const char* reason);
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+}
 
-  void throw_invalid_generator(const char* method,
-			       const char* g_name) const;
-  void throw_invalid_generators(const char* method,
-				const char* gs_name) const;
-  //@} // Exception Throwers
+template <typename T>
+void
+Octagonal_Shape<T>::affine_image(const Variable var,
+                                 const Linear_Expression& expr,
+                                 Coefficient_traits::const_reference
+                                 denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
 
-};
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
 
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id()+1);
 
-namespace std {
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Polyhedron */
-void swap(Parma_Polyhedra_Library::Polyhedron& x,
-	  Parma_Polyhedra_Library::Polyhedron& y);
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
 
-} // namespace std
+  // Get information about the number of non-zero coefficients in `expr'.
+  // The `expr' must not be in two or plus variables.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
 
-// Automatically generated from PPL source file ../src/Ph_Status.inlines.hh line 1
-/* Polyhedron::Status class implementation: inline functions.
-*/
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
 
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  TEMP_INTEGER(minus_den);
+  neg_assign_r(minus_den, denominator, ROUND_NOT_NEEDED);
 
-namespace Parma_Polyhedra_Library {
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
 
-inline
-Polyhedron::Status::Status(flags_t mask)
-  : flags(mask) {
-}
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    // Add the constraint `var == b/denominator'.
+    add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+    add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+    assert(OK());
+    return;
+  }
 
-inline
-Polyhedron::Status::Status()
-  : flags(ZERO_DIM_UNIV) {
-}
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_den) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Here `expr' is of the form: +/- denominator * v + b.
+        if (w_coeff == denominator) {
+          if (b == 0)
+            // The transformation is the identity function.
+            return;
+          else {
+            // Translate all the constraints on `var' adding or
+            // subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            DIRTY_TEMP(N, minus_d);
+            div_round_up(minus_d, b, minus_den);
+            Row_Iterator m_iter = m_begin + n_var;
+            N& m_v_cv = (*m_iter)[n_var+1];
+            ++m_iter;
+            N& m_cv_v = (*m_iter)[n_var];
+            ++m_iter;
+            // NOTE: delay update of m_v_cv and m_cv_v.
+            for ( ;m_iter != m_end; ++m_iter) {
+              Row_Reference m_i = *m_iter;
+              N& m_i_v = m_i[n_var];
+              add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+              N& m_i_cv = m_i[n_var+1];
+              add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+            }
+            // Now update m_v_cv and m_cv_v.
+            mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+            add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+            mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE);
+            add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+           }
+          reset_strongly_closed();
+        }
+
+        else {
+          // Here `w_coeff == -denominator'.
+          // Remove the binary constraints on `var'.
+          forget_binary_octagonal_constraints(var_id);
+           Row_Iterator m_iter = m_begin + n_var;
+          N& m_v_cv = (*m_iter)[n_var+1];
+          ++m_iter;
+          N& m_cv_v = (*m_iter)[n_var];
+          // Swap the unary constraints on `var'.
+          std::swap(m_v_cv, m_cv_v);
+          // Strong closure is not preserved.
+          reset_strongly_closed();
+          if (b != 0) {
+            // Translate all the constraints on `var' adding or
+            // subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            DIRTY_TEMP(N, minus_d);
+            div_round_up(minus_d, b, minus_den);
+            ++m_iter;
+            for ( ;m_iter != m_end; ++m_iter) {
+              Row_Reference m_i = *m_iter;
+              N& m_i_v = m_i[n_var];
+              add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+              N& m_i_cv = m_i[n_var+1];
+              add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+            }
+            mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+            add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+            mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE);
+            add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+          }
+          incremental_strong_closure_assign(var);
+         }
+      }
 
-inline bool
-Polyhedron::Status::test_all(flags_t mask) const {
-  return (flags & mask) == mask;
-}
+      else {
+        // Here `w != var', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w = b/denominator'.
+        if (w_coeff == denominator)
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w, n_var, b, denominator);
+            add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+          }
+          else {
+            add_octagonal_constraint(n_var+1, n_w+1, b, denominator);
+            add_octagonal_constraint(n_var, n_w, b, minus_den);
+          }
+        else
+          // Add the new constraint `var + w = b/denominator'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w+1, n_var, b, denominator);
+            add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+          }
+          else {
+            add_octagonal_constraint(n_var+1, n_w, b, denominator);
+            add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+          }
+        incremental_strong_closure_assign(var);
+      }
+      assert(OK());
+      return;
+    }
+  }
 
-inline bool
-Polyhedron::Status::test_any(flags_t mask) const {
-  return flags & mask;
-}
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
 
-inline void
-Polyhedron::Status::set(flags_t mask) {
-  flags |= mask;
-}
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
 
-inline void
-Polyhedron::Status::reset(flags_t mask) {
-  flags &= ~mask;
-}
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-inline bool
-Polyhedron::Status::test_zero_dim_univ() const {
-  return flags == ZERO_DIM_UNIV;
-}
+  DIRTY_TEMP(N, pos_sum);
+  DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
 
-inline void
-Polyhedron::Status::reset_zero_dim_univ() {
-  // This is a no-op if the current status is not zero-dim.
-  if (flags == ZERO_DIM_UNIV)
-    // In the zero-dim space, if it is not the universe it is empty.
-    flags = EMPTY;
-}
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
 
-inline void
-Polyhedron::Status::set_zero_dim_univ() {
-  // Zero-dim universe is incompatible with anything else.
-  flags = ZERO_DIM_UNIV;
-}
+  // Approximate the homogeneous part of `sc_expr'.
+  DIRTY_TEMP(N, coeff_i);
+  DIRTY_TEMP(N, minus_coeff_i);
+  DIRTY_TEMP(N, half);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i+1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i+1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
 
-inline bool
-Polyhedron::Status::test_empty() const {
-  return test_any(EMPTY);
-}
+  // Remove all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    assert(OK());
+    return;
+  }
 
-inline void
-Polyhedron::Status::reset_empty() {
-  reset(EMPTY);
-}
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
 
-inline void
-Polyhedron::Status::set_empty() {
-  flags = EMPTY;
-}
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      DIRTY_TEMP(N, double_pos_sum);
+      mul2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_IGNORE);
+      matrix[n_var+1][n_var] = double_pos_sum;
+      // Deduce constraints of the form `v +/- u', where `u != v'.
+      deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != var_id) {
+        const Coefficient& ppi = sc_expr.coefficient(Variable(pos_pinf_index));
+        if (ppi == sc_den)
+          // Add the constraint `v - pos_pinf_index <= pos_sum'.
+          if (var_id < pos_pinf_index)
+            matrix[2*pos_pinf_index][n_var] = pos_sum;
+          else
+            matrix[n_var+1][2*pos_pinf_index+1] = pos_sum;
+        else
+          if (ppi == minus_sc_den) {
+            // Add the constraint `v + pos_pinf_index <= pos_sum'.
+            if (var_id < pos_pinf_index)
+              matrix[2*pos_pinf_index+1][n_var] = pos_sum;
+            else
+              matrix[n_var+1][2*pos_pinf_index] = pos_sum;
+          }
+      }
+  }
 
-inline bool
-Polyhedron::Status::test_c_up_to_date() const {
-  return test_any(C_UP_TO_DATE);
-}
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DIRTY_TEMP(N, double_neg_sum);
+      mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE);
+      matrix[n_var][n_var+1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_den)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index+1][n_var+1] = neg_sum;
+        else
+          if (npi == minus_sc_den) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index+1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var+1] = neg_sum;
+          }
+      }
+  }
 
-inline void
-Polyhedron::Status::reset_c_up_to_date() {
-  reset(C_UP_TO_DATE);
+  incremental_strong_closure_assign(var);
+  assert(OK());
 }
 
-inline void
-Polyhedron::Status::set_c_up_to_date() {
-  set(C_UP_TO_DATE);
-}
+template <typename T>
+void
+Octagonal_Shape<T>::affine_preimage(const Variable var,
+                                    const Linear_Expression& expr,
+                                    Coefficient_traits::const_reference
+                                    denominator) {
 
-inline bool
-Polyhedron::Status::test_g_up_to_date() const {
-  return test_any(G_UP_TO_DATE);
-}
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
 
-inline void
-Polyhedron::Status::reset_g_up_to_date() {
-  reset(G_UP_TO_DATE);
-}
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
 
-inline void
-Polyhedron::Status::set_g_up_to_date() {
-  set(G_UP_TO_DATE);
-}
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id()+1);
 
-inline bool
-Polyhedron::Status::test_c_minimized() const {
-  return test_any(C_MINIMIZED);
-}
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
 
-inline void
-Polyhedron::Status::reset_c_minimized() {
-  reset(C_MINIMIZED);
-}
+  const Coefficient& b = expr.inhomogeneous_term();
 
-inline void
-Polyhedron::Status::set_c_minimized() {
-  set(C_MINIMIZED);
-}
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
 
-inline bool
-Polyhedron::Status::test_g_minimized() const {
-  return test_any(G_MINIMIZED);
-}
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
 
-inline void
-Polyhedron::Status::reset_g_minimized() {
-  reset(G_MINIMIZED);
-}
+  // Get information about the number of the non-zero coefficients of `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
 
-inline void
-Polyhedron::Status::set_g_minimized() {
-  set(G_MINIMIZED);
-}
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
 
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    assert(OK());
+    return;
+  }
 
-inline bool
-Polyhedron::Status::test_c_pending() const {
-  return test_any(CS_PENDING);
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == -denominator) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, w_coeff);
+      }
+      else {
+        // `expr == w_coeff*w + b', where `w != var'.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        assert(OK());
+      }
+      return;
+    }
+  }
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& coeff_v = expr.coefficient(var);
+  if (coeff_v != 0) {
+    if (coeff_v > 0) {
+      // The transformation is invertible.
+      Linear_Expression inverse = ((coeff_v + denominator)*var);
+      inverse -= expr;
+      affine_image(var, inverse, coeff_v);
+    }
+    else {
+      // The transformation is invertible.
+      TEMP_INTEGER(minus_coeff_v);
+      neg_assign(minus_coeff_v, coeff_v);
+      Linear_Expression inverse = ((minus_coeff_v - denominator)*var);
+      inverse += expr;
+      affine_image(var, inverse, minus_coeff_v);
+    }
+  }
+  else {
+    // The transformation is not invertible: all constraints on `var' are lost.
+    forget_all_octagonal_constraints(var_id);
+    assert(OK());
+  }
 }
 
-inline void
-Polyhedron::Status::reset_c_pending() {
-  reset(CS_PENDING);
-}
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression&  expr ,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
 
-inline void
-Polyhedron::Status::set_c_pending() {
-  set(CS_PENDING);
-}
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", "e",
+                                 expr);
 
-inline bool
-Polyhedron::Status::test_g_pending() const {
-  return test_any(GS_PENDING);
-}
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var.id()+1);
 
-inline void
-Polyhedron::Status::reset_g_pending() {
-  reset(GS_PENDING);
-}
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+                    "r is a strict relation symbol and "
+                    "*this is an Octagonal_Shape");
 
-inline void
-Polyhedron::Status::set_g_pending() {
-  set(GS_PENDING);
-}
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
 
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
 
-inline bool
-Polyhedron::Status::test_sat_c_up_to_date() const {
-  return test_any(SAT_C_UP_TO_DATE);
-}
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = 0;
 
-inline void
-Polyhedron::Status::reset_sat_c_up_to_date() {
-  reset(SAT_C_UP_TO_DATE);
-}
+  // Get information about the number of non-zero coefficients in `expr'.
+  // The `expr' must not be in two or plus variables.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
 
-inline void
-Polyhedron::Status::set_sat_c_up_to_date() {
-  set(SAT_C_UP_TO_DATE);
-}
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
 
-inline bool
-Polyhedron::Status::test_sat_g_up_to_date() const {
-  return test_any(SAT_G_UP_TO_DATE);
-}
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  TEMP_INTEGER(minus_den);
+  neg_assign_r(minus_den, denominator, ROUND_NOT_NEEDED);
 
-inline void
-Polyhedron::Status::reset_sat_g_up_to_date() {
-  reset(SAT_G_UP_TO_DATE);
-}
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
 
-inline void
-Polyhedron::Status::set_sat_g_up_to_date() {
-  set(SAT_G_UP_TO_DATE);
-}
+  if (t == 0) {
+    // Case 1: expr = b.
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    // Strong closure is lost.
+    reset_strongly_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var+1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= n/denominator',
+      // i.e., `-var <= -b/denominator'.
+      add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    assert(OK());
+    return;
+  }
 
-} // namespace Parma_Polyhedra_Library
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_den) {
+      // Case 2: expr == w_coeff*w + b, with w_coeff == +/- denominator.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        {
+          DIRTY_TEMP(N, d);
+          div_round_up(d, b, denominator);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate all the constraints of the form `v - w <= cost'
+              // into the constraint `v - w <= cost + b/denominator';
+              // forget each constraint `w - v <= cost1'.
+              Row_Iterator m_iter = m_begin + n_var;
+              Row_Reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var+1];
+              ++m_iter;
+              Row_Reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ;m_iter != m_end; ++m_iter) {
+                Row_Reference m_i = *m_iter;
+                N& m_i_v = m_i[n_var];
+                add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+                assign_r(m_i[n_var+1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                assign_r(m_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_cv[k], m_cv[k], d, ROUND_UP);
+              }
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_v_cv = matrix[n_var][n_var+1];
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(matrix[n_var+1][n_var], m_v_cv, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is the form
+            // +/- denominator*w + b.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            if (w_coeff == denominator) {
+              // Add the new constraint `v - w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var+1, n_w+1, b, denominator);
+            }
+            else {
+              // Add the new constraint `v + w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w+1, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var+1, n_w, b, denominator);
+            }
+          }
+          break;
+        }
+
+      case GREATER_OR_EQUAL:
+        {
+          DIRTY_TEMP(N, d);
+          div_round_up(d, b, minus_den);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate each constraint `w - v <= cost'
+              // into the constraint `w - v <= cost - b/denominator';
+              // forget each constraint `v - w <= cost1'.
+              Row_Iterator m_iter = m_begin + n_var;
+              Row_Reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var+1];
+              ++m_iter;
+              Row_Reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ;m_iter != m_end; ++m_iter) {
+                Row_Reference m_i = *m_iter;
+                assign_r(m_i[n_var], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_i[n_var+1], m_i[n_var+1], d, ROUND_UP);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                add_assign_r(m_v[k], m_v[k], d, ROUND_UP);
+                assign_r(m_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(m_v_cv, m_v_cv, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_cv_v = matrix[n_var+1][n_var];
+              mul2exp_assign_r(d, d, 1, ROUND_IGNORE);
+              add_assign_r(matrix[n_var][n_var+1], m_cv_v, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is of the form
+            // +/-denominator * w + b, with `w != v'.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            // We have got an expression of the following form:
+            // var1 + n, with `var1' != `var'.
+            // We remove all constraints of the form `var (+/- var1) >= const'
+            // and we add the new constraint `var +/- var1 >= n/denominator'.
+            if (w_coeff == denominator) {
+              // Add the new constraint `var - w >= b/denominator',
+              // i.e., `w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+              else
+                add_octagonal_constraint(n_var, n_w, b, minus_den);
+            }
+            else {
+              // Add the new constraint `var + w >= b/denominator',
+              // i.e., `-w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+              else
+                add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+            }
+          }
+          break;
+        }
 
-// Automatically generated from PPL source file ../src/Polyhedron.inlines.hh line 1
-/* Polyhedron class implementation: inline functions.
-*/
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      assert(OK());
+      return;
+    }
+  }
 
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-// Automatically generated from PPL source file ../src/Polyhedron.inlines.hh line 29
-#include <algorithm>
-#include <deque>
+  DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->matrix'.
+  // (The initialization is just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
 
-namespace Parma_Polyhedra_Library {
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    {
+      // Compute an upper approximation for `sc_expr' into `sum'.
 
-inline memory_size_type
-Polyhedron::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      // Approximate the homogeneous part of `sc_expr'.
+      DIRTY_TEMP(N, coeff_i);
+      DIRTY_TEMP(N, approx_i);
+      TEMP_INTEGER(minus_sc_i);
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i+1];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+      // Remove all constraints on `v'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        assert(OK());
+        return;
+      }
 
-inline dimension_type
-Polyhedron::max_space_dimension() {
-  using std::min;
-  // One dimension is reserved to have a value of type dimension_type
-  // that does not represent a legal dimension.
-  return min(std::numeric_limits<dimension_type>::max() - 1,
-	     min(Constraint_System::max_space_dimension(),
-		 Generator_System::max_space_dimension()
-		 )
-	     );
-}
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_den' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_den' and negating again the result.
+        DIRTY_TEMP(N, down_sc_den);
+        assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+        neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
 
-inline Topology
-Polyhedron::topology() const {
-  // We can check either one of the two matrices.
-  // (`con_sys' is slightly better, since it is placed at offset 0.)
-  return con_sys.topology();
-}
+      if (pinf_count == 0) {
+        // Add the constraint `v <= pos_sum'.
+        DIRTY_TEMP(N, double_sum);
+        mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+        matrix[n_var+1][n_var] = double_sum;
+        // Deduce constraints of the form `v +/- u', where `u != v'.
+        deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              matrix[2*pinf_index][n_var] = sum;
+            else
+              matrix[n_var+1][2*pinf_index+1] = sum;
+          }
+          else {
+            if (pi == minus_den) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                matrix[2*pinf_index+1][n_var] = sum;
+              else
+                matrix[n_var+1][2*pinf_index] = sum;
+            }
+          }
+        }
+      break;
+    }
 
-inline bool
-Polyhedron::is_necessarily_closed() const {
-  // We can check either one of the two matrices.
-  // (`con_sys' is slightly better, since it is placed at offset 0.)
-  return con_sys.is_necessarily_closed();
-}
+  case GREATER_OR_EQUAL:
+    {
+      // Compute an upper approximation for `-sc_expr' into `sum'.
+      // Note: approximating `-sc_expr' from above and then negating the
+      // result is the same as approximating `sc_expr' from below.
 
-inline dimension_type
-Polyhedron::space_dimension() const {
-  return space_dim;
-}
+      // Approximate the inhomogeneous term.
+      assign_r(sum, minus_sc_b, ROUND_UP);
+      DIRTY_TEMP(N, coeff_i);
+      TEMP_INTEGER(minus_sc_i);
+      DIRTY_TEMP(N, approx_i);
+      // Approximate the homogeneous part of `-sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `-sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_i[n_i+1] : m_ci[n_i];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
 
-inline void
-Polyhedron::upper_bound_assign(const Polyhedron& y) {
-  poly_hull_assign(y);
-}
+      // Remove all constraints on `var'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        assert(OK());
+        return;
+      }
 
-inline void
-Polyhedron::difference_assign(const Polyhedron& y) {
-  poly_difference_assign(y);
-}
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_den' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_den' and negating again the result.
+        DIRTY_TEMP(N, down_sc_den);
+        assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+        neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
 
-inline
-Polyhedron::~Polyhedron() {
-}
+      if (pinf_count == 0) {
+        // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+        DIRTY_TEMP(N, double_sum);
+        mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE);
+        matrix[n_var][n_var+1] = double_sum;
+        // Deduce constraints of the form `-v +/- u', where `u != v'.
+        deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              matrix[n_var][2*pinf_index] = sum;
+            else
+              matrix[2*pinf_index+1][n_var+1] = sum;
+          }
+          else {
+            if (pi == minus_den) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                matrix[n_var][2*pinf_index+1] = sum;
+              else
+                matrix[2*pinf_index][n_var+1] = sum;
+            }
+          }
+        }
+      break;
+    }
 
-inline void
-Polyhedron::swap(Polyhedron& y) {
-  if (topology() != y.topology())
-    throw_topology_incompatible("swap(y)", "y", y);
-  std::swap(con_sys, y.con_sys);
-  std::swap(gen_sys, y.gen_sys);
-  std::swap(sat_c, y.sat_c);
-  std::swap(sat_g, y.sat_g);
-  std::swap(status, y.status);
-  std::swap(space_dim, y.space_dim);
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+  }
+  incremental_strong_closure_assign(var);
+  assert(OK());
 }
 
-} // namespace Parma_Polyhedra_Library
+template <typename T>
+void
+Octagonal_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                             const Relation_Symbol relsym,
+                                             const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
 
-/*! \relates Parma_Polyhedra_Library::Polyhedron */
-inline void
-std::swap(Parma_Polyhedra_Library::Polyhedron& x,
-	  Parma_Polyhedra_Library::Polyhedron& y) {
-  x.swap(y);
-}
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
 
-namespace Parma_Polyhedra_Library {
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is an Octagonal_Shape");
 
-inline bool
-Polyhedron::marked_empty() const {
-  return status.test_empty();
-}
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
 
-inline bool
-Polyhedron::constraints_are_up_to_date() const {
-  return status.test_c_up_to_date();
-}
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
 
-inline bool
-Polyhedron::generators_are_up_to_date() const {
-  return status.test_g_up_to_date();
-}
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
+    }
 
-inline bool
-Polyhedron::constraints_are_minimized() const {
-  return status.test_c_minimized();
-}
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
 
-inline bool
-Polyhedron::generators_are_minimized() const {
-  return status.test_g_minimized();
-}
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is an octagonal difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs' or
+    // `rhs == a*v + a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not an octagonal difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
 
-inline bool
-Polyhedron::sat_c_is_up_to_date() const {
-  return status.test_sat_c_up_to_date();
-}
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, den);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
 
-inline bool
-Polyhedron::sat_g_is_up_to_date() const {
-  return status.test_sat_g_up_to_date();
-}
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
 
-inline bool
-Polyhedron::has_pending_constraints() const {
-  return status.test_c_pending();
-}
+#if 1 // Simplified computation (see the TODO note below).
 
-inline bool
-Polyhedron::has_pending_generators() const {
-  return status.test_g_pending();
-}
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
 
-inline bool
-Polyhedron::has_something_pending() const {
-  return status.test_c_pending() || status.test_g_pending();
-}
+#else // Currently unnecessarily complex computation.
 
-inline bool
-Polyhedron::can_have_something_pending() const {
-  return constraints_are_minimized()
-    && generators_are_minimized()
-    && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
-}
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
 
-inline void
-Polyhedron::set_constraints_up_to_date() {
-  status.set_c_up_to_date();
-}
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // an octagonal difference (since it has 3 variables at least).
+      // Thus, the method add_constraint() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= new_var);
+        break;
+      case EQUAL:
+        add_constraint(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
 
-inline void
-Polyhedron::set_generators_up_to_date() {
-  status.set_g_up_to_date();
+  assert(OK());
 }
 
-inline void
-Polyhedron::set_constraints_minimized() {
-  set_constraints_up_to_date();
-  status.set_c_minimized();
-}
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_image(const Variable var,
+                                         const Linear_Expression& lb_expr,
+                                         const Linear_Expression& ub_expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 var.id()+1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
 
-inline void
-Polyhedron::set_generators_minimized() {
-  set_generators_up_to_date();
-  status.set_g_minimized();
-}
+  // Number of non-zero coefficients in `lb_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `lb_expr', if any.
+  dimension_type w_id = 0;
 
-inline void
-Polyhedron::set_constraints_pending() {
-  status.set_c_pending();
-}
+  // Get information about the number of non-zero coefficients in `lb_expr'.
+  // The `expr' must not be in two or plus variables.
+  for (dimension_type i = lb_space_dim; i-- > 0; )
+    if (lb_expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
 
-inline void
-Polyhedron::set_generators_pending() {
-  status.set_g_pending();
-}
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
 
-inline void
-Polyhedron::set_sat_c_up_to_date() {
-  status.set_sat_c_up_to_date();
-}
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = lb_expr.inhomogeneous_term();
+  TEMP_INTEGER(minus_den);
+  neg_assign_r(minus_den, denominator, ROUND_NOT_NEEDED);
 
-inline void
-Polyhedron::set_sat_g_up_to_date() {
-  status.set_sat_g_up_to_date();
-}
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `lb_expr':
+  // - If t == 0, then lb_expr == b, with `b' a constant;
+  // - If t == 1, then lb_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `lb_expr' is of the general form.
 
-inline void
-Polyhedron::clear_empty() {
-  status.reset_empty();
-}
+  if (t == 0) {
+    // Case 1: lb_expr == b.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    TEMP_INTEGER(two_b);
+    two_b = 2*b;
+    // Add the constraint `var >= b/denominator'.
+    add_octagonal_constraint(n_var, n_var+1, two_b, minus_den);
+    assert(OK());
+    return;
+  }
 
-inline void
-Polyhedron::clear_constraints_minimized() {
-  status.reset_c_minimized();
-}
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `lb_expr'.
+    const Coefficient& w_coeff = lb_expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_den) {
+      // Case 2: lb_expr = w_coeff*w + b, with w_coeff = +/- denominator.
+     if (w_id == var_id) {
+        // Here `var' occurs in `lb_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var = Variable(space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `lb_expr'.
+        // Here `lb_expr' is of the form: +/- denominator * v + b.
+        affine_image(new_var, lb_expr, denominator);
+        // Enforce the strong closure for precision.
+        strong_closure_assign();
+        assert(!marked_empty());
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Now apply the affine lower bound, as recorded in `new_var'
+        add_constraint(var >= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(space_dim-1);
+        return;
+      }
+      else {
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Here `w != var', so that `lb_expr' is of the form
+        // +/-denominator * w + b.
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w >= b/denominator'.
+        if (w_coeff == denominator)
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w+1, n_var+1, b, minus_den);
+          else
+            add_octagonal_constraint(n_var, n_w, b, minus_den);
+        else {
+          // Add the new constraint `var + w >= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var+1, b, minus_den);
+          else
+            add_octagonal_constraint(n_var, n_w+1, b, minus_den);
+        }
+        assert(OK());
+        return;
+      }
+    }
+  }
 
-inline void
-Polyhedron::clear_generators_minimized() {
-  status.reset_g_minimized();
-}
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
 
-inline void
-Polyhedron::clear_pending_constraints() {
-  status.reset_c_pending();
-}
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
 
-inline void
-Polyhedron::clear_pending_generators() {
-  status.reset_g_pending();
-}
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -lb_expr;
+  const Linear_Expression& sc_expr = is_sc ? lb_expr : minus_expr;
 
-inline void
-Polyhedron::clear_sat_c_up_to_date() {
-  status.reset_sat_c_up_to_date();
-  // Can get rid of sat_c here.
-}
+  DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type neg_pinf_count = 0;
 
-inline void
-Polyhedron::clear_sat_g_up_to_date() {
-  status.reset_sat_g_up_to_date();
-  // Can get rid of sat_g here.
-}
+  // Approximate the inhomogeneous term.
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
 
-inline void
-Polyhedron::clear_constraints_up_to_date() {
-  clear_pending_constraints();
-  clear_constraints_minimized();
-  clear_sat_c_up_to_date();
-  clear_sat_g_up_to_date();
-  status.reset_c_up_to_date();
-  // Can get rid of con_sys here.
-}
+  // Approximate the homogeneous part of `sc_expr'.
+  DIRTY_TEMP(N, coeff_i);
+  DIRTY_TEMP(N, minus_coeff_i);
+  DIRTY_TEMP(N, half);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_iter + (2*w_id) + 2;
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i+1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
 
-inline void
-Polyhedron::clear_generators_up_to_date() {
-  clear_pending_generators();
-  clear_generators_minimized();
-  clear_sat_c_up_to_date();
-  clear_sat_g_up_to_date();
-  status.reset_g_up_to_date();
-  // Can get rid of gen_sys here.
-}
+  // Apply the affine upper bound.
+  generalized_affine_image(var,
+                           LESS_OR_EQUAL,
+                           ub_expr,
+                           denominator);
 
-inline bool
-Polyhedron::process_pending() const {
-  assert(space_dim > 0 && !marked_empty());
-  assert(has_something_pending());
+  // Return immediately if no approximation could be computed.
+  if (neg_pinf_count > 1) {
+    return;
+  }
 
-  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
 
-  if (x.has_pending_constraints())
-    return x.process_pending_constraints();
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DIRTY_TEMP(N, double_neg_sum);
+      mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE);
+      matrix[n_var][n_var+1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_den)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index+1][n_var+1] = neg_sum;
+        else
+          if (npi == minus_sc_den) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index+1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var+1] = neg_sum;
+          }
+      }
+  }
 
-  assert(x.has_pending_generators());
-  x.process_pending_generators();
-  return true;
+  assert(OK());
 }
 
-inline bool
-Polyhedron::is_empty() const {
-  if (marked_empty())
-    return true;
-  // Try a fast-fail test: if generators are up-to-date and
-  // there are no pending constraints, then the generator system
-  // (since it is well formed) contains a point.
-  if (generators_are_up_to_date() && !has_pending_constraints())
-    return false;
-  return !minimize();
-}
 
-inline bool
-Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
-  return bounds(expr, true);
-}
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference
+                              denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
 
-inline bool
-Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
-  return bounds(expr, false);
-}
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
 
-inline bool
-Polyhedron::maximize(const Linear_Expression& expr,
-		     Coefficient& sup_n, Coefficient& sup_d,
-		     bool& maximum) const {
-  Generator g(point());
-  return max_min(expr, true, sup_n, sup_d, maximum, g);
-}
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var.id()+1);
 
-inline bool
-Polyhedron::maximize(const Linear_Expression& expr,
-		     Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-		     Generator& g) const {
-  return max_min(expr, true, sup_n, sup_d, maximum, g);
-}
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                    "r is a strict relation symbol and "
+                    "*this is an Octagonal_Shape");
 
-inline bool
-Polyhedron::minimize(const Linear_Expression& expr,
-		     Coefficient& inf_n, Coefficient& inf_d,
-		     bool& minimum) const {
-  Generator g(point());
-  return max_min(expr, false, inf_n, inf_d, minimum, g);
-}
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
 
-inline bool
-Polyhedron::minimize(const Linear_Expression& expr,
-		     Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-		     Generator& g) const {
-  return max_min(expr, false, inf_n, inf_d, minimum, g);
-}
+  // The image of an empty octagon is empty too.
+  strong_closure_assign();
+  if (marked_empty())
+    return;
 
-/*! \relates Polyhedron */
-inline bool
-operator!=(const Polyhedron& x, const Polyhedron& y) {
-  return !(x == y);
-}
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    TEMP_INTEGER(inverse_den);
+    neg_assign(inverse_den, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+    return;
+  }
 
-inline bool
-Polyhedron::strictly_contains(const Polyhedron& y) const {
-  const Polyhedron& x = *this;
-  return x.contains(y) && !y.contains(x);
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the Octagonal_Shape by adding the constraint induced
+  // by the affine relation.
+  refine(var, relsym, expr, denominator);
+
+  // If the shrunk OS is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  assert(OK());
 }
 
-} // namespace Parma_Polyhedra_Library
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
 
-// Automatically generated from PPL source file ../src/Polyhedron.templates.hh line 1
-/* Polyhedron class implementation: non-inline template functions.
-*/
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is an Octagonal_Shape");
 
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
 
-// Automatically generated from PPL source file ../src/Polyhedron.templates.hh line 29
-#include <algorithm>
-#include <deque>
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
 
-namespace Parma_Polyhedra_Library {
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
+    }
 
-template <typename Box>
-Polyhedron::Polyhedron(Topology topol, const Box& box)
-  : con_sys(topol),
-    gen_sys(topol),
-    sat_c(),
-    sat_g() {
-  // Initialize the space dimension as indicated by the box.
-  space_dim = box.space_dimension();
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
 
-  // Check for emptiness.
-  if (box.is_empty()) {
-    set_empty();
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // in this case, preimage and image happen to be the same.
+  if (t_lhs == 0) {
+    generalized_affine_image(lhs, relsym, rhs);
     return;
   }
 
-  // Zero-dim universe polyhedron.
-  if (space_dim == 0) {
-    set_zero_dim_univ();
-    return;
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, den);
   }
 
-  // Insert a dummy constraint of the highest dimension to avoid the
-  // need of resizing the matrix of constraints later;
-  // this constraint will be removed at the end.
-  con_sys.insert(Variable(space_dim - 1) >= 0);
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
 
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    // See if we have a valid lower bound.
-    bool l_closed = false;
-    Coefficient l_n, l_d;
-    bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
-    if (l_bounded && topol == NECESSARILY_CLOSED && !l_closed)
-      throw_invalid_argument("C_Polyhedron(const Box& box):",
-			     " box has an open lower bound");
-    // See if we have a valid upper bound.
-    bool u_closed = false;
-    Coefficient u_n, u_d;
-    bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
-    if (u_bounded && topol == NECESSARILY_CLOSED && !u_closed)
-      throw_invalid_argument("C_Polyhedron(const Box& box):",
-			     " box has an open upper bound");
-
-    // See if we have an implicit equality constraint.
-    if (l_bounded && u_bounded
-	&& l_closed && u_closed
-	&& l_n == u_n && l_d == u_d) {
-      // Add the constraint `l_d*v_k == l_n'.
-      con_sys.insert(l_d * Variable(k) == l_n);
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+
+      // Any image of an empty octagon is empty.
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
     }
     else {
-      // Check if a lower bound constraint is required.
-      if (l_bounded) {
-       if (l_closed)
-	 // Add the constraint `l_d*v_k >= l_n'.
-	 con_sys.insert(l_d * Variable(k) >= l_n);
-       else
-	 // Add the constraint `l_d*v_k > l_n'.
-	 con_sys.insert(l_d * Variable(k) > l_n);
+      // Some variables in `lhs' also occur in `rhs'.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not an octagonal difference.
+      affine_image(new_var, lhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
       }
-      // Check if an upper bound constraint is required.
-      if (u_bounded) {
-       if (u_closed)
-	 // Add the constraint `u_d*v_k <= u_n'.
-	 con_sys.insert(u_d * Variable(k) <= u_n);
-       else
-	 // Add the constraint `u_d*v_k < u_n'.
-	 con_sys.insert(u_d * Variable(k) < u_n);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == v + b_rhs' or `rhs == -v + b_rhs' or `rhs == b_rhs',
+      // one of the following constraints will be added, because they
+      // are octagonal differences.
+      // Else the following constraints are NOT octagonal differences,
+      // so the method add_constraint() will ignore them.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(new_var <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
       }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
     }
   }
-
-  // Adding the low-level constraints.
-  con_sys.add_low_level_constraints();
-  // Now removing the dummy constraint inserted before.
-  dimension_type n_rows = con_sys.num_rows() - 1;
-  con_sys[0].swap(con_sys[n_rows]);
-  con_sys.set_sorted(false);
-  // NOTE: here there are no pending constraints.
-  con_sys.set_index_first_pending_row(n_rows);
-  con_sys.erase_to_end(n_rows);
-
-  // Constraints are up-to-date.
-  set_constraints_up_to_date();
   assert(OK());
 }
 
-template <typename Box>
+template <typename T>
 void
-Polyhedron::shrink_bounding_box(Box& box, Complexity_Class complexity) const {
-  bool reduce_complexity = (complexity != ANY_COMPLEXITY);
-  if (!reduce_complexity
-      || (!has_something_pending() && constraints_are_minimized())) {
-    // If the constraint system is minimized, the test `is_universe()'
-    // is not exponential.
-    if (is_universe())
-      return;
+Octagonal_Shape<T>::bounded_affine_preimage(const Variable var,
+                                            const Linear_Expression& lb_expr,
+                                            const Linear_Expression& ub_expr,
+                                            Coefficient_traits::const_reference
+                                            denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 var.id()+1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
   }
-  if (reduce_complexity) {
-    if (marked_empty()
-	|| (generators_are_up_to_date() && gen_sys.num_rows() == 0)) {
-      box.set_empty();
-      return;
-    }
-    else if (constraints_are_up_to_date()) {
-      // See if there is at least one inconsistent constraint in `con_sys'.
-      for (Constraint_System::const_iterator i = con_sys.begin(),
-	     cs_end = con_sys.end(); i != cs_end; ++i)
-	if (i->is_inconsistent()) {
-	  box.set_empty();
-	  return;
-	}
-      // If `complexity' allows it, use the LP_Problem solver to determine
-      // whether or not the polyhedron is empty.
-      if (complexity == SIMPLEX_COMPLEXITY
-	  // TODO: find a workaround for NNC polyhedra.
-	  && is_necessarily_closed()) {
-	LP_Problem lp(con_sys);
-	if (!lp.is_satisfiable()) {
-	  box.set_empty();
-	  return;
-	}
-      }
-    }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
   }
+
+  const Coefficient& expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var = Variable(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (expr_v + denominator)*var;
+  TEMP_INTEGER(inverse_den);
+  neg_assign(inverse_den, expr_v);
+  affine_image(new_var, lb_inverse, inverse_den);
+  strong_closure_assign();
+  assert(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(inverse_den))
+    add_constraint(var >= new_var) ;
   else
-    // The flag `reduce_complexity' is `false'.
-    // Note that the test `is_empty()' is exponential in the worst case.
-    if (is_empty()) {
-      box.set_empty();
-      return;
-    }
+    add_constraint(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim-1);
+  return;
+}
 
-  if (space_dim == 0)
-    return;
+template <typename T>
+Constraint_System
+Octagonal_Shape<T>::constraints() const {
+  Constraint_System cs;
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
 
-  // The following vectors will store the lower and upper bound
-  // for each dimension.
-  // Lower bounds are initialized to open plus infinity.
-  std::vector<LBoundary>
-    lower_bound(space_dim,
-		LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN));
-  // Upper bounds are initialized to open minus infinity.
-  std::vector<UBoundary>
-    upper_bound(space_dim,
-		UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN));
-
-  if (!reduce_complexity && has_something_pending())
-    process_pending();
-
-  // TODO: use simplex to derive variable bounds, if the complexity
-  // is SIMPLEX_COMPLEXITY.
-
-  if (reduce_complexity &&
-       (!generators_are_up_to_date() || has_pending_constraints())) {
-    // Extract easy-to-find bounds from constraints.
-    assert(constraints_are_up_to_date());
-
-    // We must copy `con_sys' to a temporary matrix,
-    // as we need to simplify all of the matrix
-    // (not just the non-pending part of it).
-    Constraint_System cs(con_sys);
-    if (cs.num_pending_rows() > 0)
-      cs.unset_pending_rows();
-    if (has_pending_constraints() || !constraints_are_minimized())
-      cs.simplify();
-
-    const Constraint_System::const_iterator cs_begin = cs.begin();
-    const Constraint_System::const_iterator cs_end = cs.end();
-
-    for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i) {
-      dimension_type varid = space_dim;
-      const Constraint& c = *i;
-      // After `simplify()' some constraints may have become inconsistent.
-      if (c.is_inconsistent()) {
-	box.set_empty();
-	return;
-      }
-      for (dimension_type j = space_dim; j-- > 0; ) {
-	// We look for constraints of the form `Variable(j) == k',
-	// `Variable(j) >= k', and `Variable(j) > k'.
-	if (c.coefficient(Variable(j)) != 0)
-	  if (varid != space_dim) {
-	    varid = space_dim;
-	    break;
-	  }
-	  else
-	    varid = j;
-      }
-      if (varid != space_dim) {
-	Coefficient_traits::const_reference d = c.coefficient(Variable(varid));
-	Coefficient_traits::const_reference n = c.inhomogeneous_term();
-	// The constraint `c' is of the form
-	// `Variable(varid) + n / d rel 0', where
-	// `rel' is either the relation `==', `>=', or `>'.
-	// For the purpose of shrinking intervals, this is
-	// (morally) turned into `Variable(varid) rel -n/d'.
-	mpq_class q;
-	assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-	assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-	q.canonicalize();
-	// Turn `n/d' into `-n/d'.
-	q = -q;
-	const ERational r(q, ROUND_NOT_NEEDED);
-	const Constraint::Type c_type = c.type();
-	switch (c_type) {
-	case Constraint::EQUALITY:
-	  lower_bound[varid] = LBoundary(r, LBoundary::CLOSED);
-	  upper_bound[varid] = UBoundary(r, UBoundary::CLOSED);
-	  break;
-	case Constraint::NONSTRICT_INEQUALITY:
-	case Constraint::STRICT_INEQUALITY:
-	  if (d > 0)
-	  // If `d' is strictly positive, we have a constraint of the
-	  // form `Variable(varid) >= k' or `Variable(varid) > k'.
-	    lower_bound[varid]
-	      = LBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
-			      ? LBoundary::CLOSED
-			      : LBoundary::OPEN));
-	  else {
-	    // Otherwise, we are sure that `d' is strictly negative
-	    // and, in this case, we have a constraint of the form
-	    // `Variable(varid) <= k' or `Variable(varid) < k'.
-	    assert(d < 0);
-	    upper_bound[varid]
-	      = UBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
-			      ? UBoundary::CLOSED
-			      : UBoundary::OPEN));
-	  }
-	  break;
-	}
+    typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+    typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+    Row_Iterator m_begin = matrix.row_begin();
+    Row_Iterator m_end = matrix.row_end();
+
+    TEMP_INTEGER(a);
+    TEMP_INTEGER(b);
+
+    // Go through all the unary constraints in `matrix'.
+    for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+      const dimension_type i = i_iter.index();
+      const Variable x(i/2);
+      const N& c_i_ii = (*i_iter)[i+1];
+      ++i_iter;
+      const N& c_ii_i = (*i_iter)[i];
+      ++i_iter;
+      // Go through unary constraints.
+      if (is_additive_inverse(c_i_ii, c_ii_i)) {
+        // We have a unary equality constraint.
+        numer_denom(c_ii_i, b, a);
+        a *= 2;
+        cs.insert(a*x == b);
+      }
+      else {
+        // We have 0, 1 or 2 inequality constraints.
+        if (!is_plus_infinity(c_i_ii)) {
+          numer_denom(c_i_ii, b, a);
+          a *= 2;
+          cs.insert(-a*x <= b);
+        }
+        if (!is_plus_infinity(c_ii_i)) {
+          numer_denom(c_ii_i, b, a);
+          a *= 2;
+          cs.insert(a*x <= b);
+        }
       }
     }
-  }
-  else {
-    // We are in the case where either the generators are up-to-date
-    // or reduced complexity is not required.
-    // Get the generators for *this.
-
-    // We have not to copy `gen_sys', because in this case
-    // we only read the generators.
-    const Generator_System& gs = gen_sys;
-
-    // We first need to identify those axes that are unbounded below
-    // and/or above.
-    for (Generator_System::const_iterator i = gs.begin(),
-	   gs_end = gs.end(); i != gs_end; ++i) {
-      // Note: using an iterator, we read also the pending part of the matrix.
-      const Generator& g = *i;
-      Generator::Type g_type = g.type();
-      switch (g_type) {
-      case Generator::LINE:
-	// Any axes `j' in which the coefficient is non-zero is unbounded
-	// both below and above.
-	for (dimension_type j = space_dim; j-- > 0; )
-	  if (g.coefficient(Variable(j)) != 0) {
-	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
-				       LBoundary::OPEN);
-	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
-				       UBoundary::OPEN);
-	  }
-	break;
-      case Generator::RAY:
-	// Axes in which the coefficient is negative are unbounded below.
-	// Axes in which the coefficient is positive are unbounded above.
-	for (dimension_type j = space_dim; j-- > 0; ) {
-	  int sign = sgn(g.coefficient(Variable(j)));
-	  if (sign < 0)
-	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
-				       LBoundary::OPEN);
-	  else if (sign > 0)
-	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
-				       UBoundary::OPEN);
-	}
-	break;
-      case Generator::POINT:
-      case Generator::CLOSURE_POINT:
-	{
-	  Coefficient_traits::const_reference d = g.divisor();
-	  for (dimension_type j = space_dim; j-- > 0; ) {
-	    Coefficient_traits::const_reference n = g.coefficient(Variable(j));
-	    mpq_class q;
-	    assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
-	    assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
-	    q.canonicalize();
-	    const ERational r(q, ROUND_NOT_NEEDED);
-	    LBoundary lb(r,(g_type == Generator::CLOSURE_POINT
-			    ? LBoundary::OPEN
-			    : LBoundary::CLOSED));
-	    if (lb < lower_bound[j])
-	      lower_bound[j] = lb;
-	    UBoundary ub(r, (g_type == Generator::CLOSURE_POINT
-			     ? UBoundary::OPEN
-			     : UBoundary::CLOSED));
-	    if (ub > upper_bound[j])
-	      upper_bound[j] = ub;
-	  }
-	}
-	break;
+    //  Go through all the binary constraints in `matrix'.
+    for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+      const dimension_type i = i_iter.index();
+      Row_Reference r_i = *i_iter;
+      ++i_iter;
+      Row_Reference r_ii = *i_iter;
+      ++i_iter;
+      const Variable y(i/2);
+      for (dimension_type j = 0; j < i; j += 2) {
+        const N& c_i_j = r_i[j];
+        const N& c_ii_jj = r_ii[j+1];
+        const Variable x(j/2);
+        if (is_additive_inverse(c_ii_jj, c_i_j)) {
+          // We have an equality constraint of the form ax - ay = b.
+          numer_denom(c_i_j, b, a);
+          cs.insert(a*x - a*y == b);
+        }
+        else {
+          // We have 0, 1 or 2 inequality constraints.
+          if (!is_plus_infinity(c_i_j)) {
+            numer_denom(c_i_j, b, a);
+            cs.insert(a*x - a*y <= b);
+          }
+          if (!is_plus_infinity(c_ii_jj)) {
+            numer_denom(c_ii_jj, b, a);
+            cs.insert(a*y - a*x <= b);
+          }
+        }
+
+        const N& c_ii_j = r_ii[j];
+        const N& c_i_jj = r_i[j+1];
+        if (is_additive_inverse(c_i_jj, c_ii_j)) {
+          // We have an equality constraint of the form ax + ay = b.
+          numer_denom(c_ii_j, b, a);
+          cs.insert(a*x + a*y == b);
+        }
+        else {
+          // We have 0, 1 or 2 inequality constraints.
+          if (!is_plus_infinity(c_i_jj)) {
+            numer_denom(c_i_jj, b, a);
+            cs.insert(-a*x - a*y <= b);
+          }
+          if (!is_plus_infinity(c_ii_j)) {
+            numer_denom(c_ii_j, b, a);
+            cs.insert(a*x + a*y <= b);
+          }
+        }
       }
     }
   }
+  return cs;
+}
 
-  TEMP_INTEGER(n);
-  TEMP_INTEGER(d);
+template <typename T>
+void
+Octagonal_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  // `var' should be one of the dimensions of the vector space.
+  const dimension_type var_id = var.id();
+  if (var_id+1 > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", var_id+1);
+
+  // The space dimension of the resulting octagon should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_generic("expand_dimension(v, m)",
+                  "adding m new space dimensions exceeds "
+                  "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
 
-  // Now shrink the bounded axes.
-  for (dimension_type j = space_dim; j-- > 0; ) {
-    // Lower bound.
-    const LBoundary& lb = lower_bound[j];
-    const ERational& lr = lb.bound();
-    if (!is_plus_infinity(lr) && !is_minus_infinity(lr)) {
-      n = raw_value(lr).get_num();
-      d = raw_value(lr).get_den();
-      box.raise_lower_bound(j, lb.is_closed(), n, d);
+  // Keep track of the dimension before adding the new ones.
+  const dimension_type old_num_rows = matrix.num_rows();
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  Row_iterator v_iter = m_begin + n_var;
+  Row_reference m_v = *v_iter;
+  Row_reference m_cv = *(v_iter+1);
+
+  for (Row_Iterator i_iter = m_begin + old_num_rows; i_iter != m_end;
+       i_iter += 2) {
+    Row_Reference m_i = *i_iter;
+    Row_Reference m_ci = *(i_iter+1);
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = i+1;
+    m_i[ci] = m_v[n_var+1];
+    m_ci[i] = m_cv[n_var];
+    for (dimension_type j = 0; j < n_var; ++j) {
+      m_i[j] = m_v[j];
+      m_ci[j] = m_cv[j];
     }
-
-    // Upper bound.
-    const UBoundary& ub = upper_bound[j];
-    const ERational& ur = ub.bound();
-    if (!is_plus_infinity(ur) && !is_minus_infinity(ur)) {
-      n = raw_value(ur).get_num();
-      d = raw_value(ur).get_den();
-      box.lower_upper_bound(j, ub.is_closed(), n, d);
+    for (dimension_type j = n_var+2; j < old_num_rows; ++j) {
+      Row_Iterator j_iter = m_begin + j;
+      Row_Reference m_j = *j_iter;
+      Row_Reference m_cj = (j%2) ? *(j_iter-1) : *(j_iter+1);
+      m_i[j] = m_cj[n_var+1];
+      m_ci[j] = m_cj[n_var];
     }
   }
+  // In general, adding a constraint does not preserve the strong closure
+  // of the octagon.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  assert(OK());
 }
 
-template <typename Partial_Function>
+template <typename T>
 void
-Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
-  if (space_dim == 0)
+Octagonal_Shape<T>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                          Variable var) {
+  // `var' should be one of the dimensions of the octagon.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
     return;
 
-  if (pfunc.has_empty_codomain()) {
-    // All dimensions vanish: the polyhedron becomes zero_dimensional.
-    if (marked_empty()
-	|| (has_pending_constraints()
-	    && !remove_pending_to_obtain_generators())
-	|| (!generators_are_up_to_date() && !update_generators())) {
-      // Removing all dimensions from the empty polyhedron.
-      space_dim = 0;
-      con_sys.clear();
+  // All variables in `to_be_folded' should be dimensions of the octagon.
+  if (to_be_folded.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, ...)",
+                                 to_be_folded.space_dimension());
+
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
+    throw_generic("fold_space_dimensions(tbf, v)",
+                  "v should not occur in tbf");
+
+  // Recompute the elements of the row and the column corresponding
+  // to variable `var' by taking the join of their value with the
+  // value of the corresponding elements in the row and column of the
+  // variable `to_be_folded'.
+  typedef typename OR_Matrix<N>::row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::row_reference_type Row_Reference;
+
+  const Row_Iterator m_begin = matrix.row_begin();
+  const Row_Iterator m_end = matrix.row_end();
+
+  strong_closure_assign();
+  const dimension_type n_rows = matrix.num_rows();
+  const dimension_type n_var = 2*var.id();
+  Row_Iterator v_iter = m_begin + n_var;
+  Row_Reference m_v = *v_iter;
+  Row_Reference m_cv = *(v_iter+1);
+  for (Variables_Set::const_iterator i = to_be_folded.begin(),
+         tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+    const dimension_type tbf_id = *i;
+    const dimension_type tbf_var = 2*tbf_id;
+    Row_Iterator tbf_iter = m_begin + tbf_var;
+    Row_Reference m_tbf = *tbf_iter;
+    Row_Reference m_ctbf = *(tbf_iter+1);
+    max_assign(m_v[n_var+1], m_tbf[tbf_var+1]);
+    max_assign(m_cv[n_var], m_ctbf[tbf_var]);
+
+    const dimension_type min_id = std::min(n_var, tbf_var);
+    const dimension_type max_id = std::max(n_var, tbf_var);
+
+    for (dimension_type j = 0; j < min_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      max_assign(m_v[j], m_tbf[j]);
+      max_assign(m_cv[j], m_ctbf[j]);
+      max_assign(m_cv[cj], m_ctbf[cj]);
+      max_assign(m_v[cj], m_tbf[cj]);
     }
-    else
-      // Removing all dimensions from a non-empty polyhedron.
-      set_zero_dim_univ();
-
-    assert(OK());
-    return;
-  }
-
-  const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
-
-  if (new_space_dimension == space_dim) {
-    // The partial function `pfunc' is indeed total and thus specifies
-    // a permutation, that is, a renaming of the dimensions.  For
-    // maximum efficiency, we will simply permute the columns of the
-    // constraint system and/or the generator system.
-
-    // We first compute suitable permutation cycles for the columns of
-    // the `con_sys' and `gen_sys' matrices.  We will represent them
-    // with a linear array, using 0 as a terminator for each cycle
-    // (notice that the columns with index 0 of `con_sys' and
-    // `gen_sys' represent the inhomogeneous terms, and thus are
-    // unaffected by the permutation of dimensions).
-    // Cycles of length 1 will be omitted so that, in the worst case,
-    // we will have `space_dim' elements organized in `space_dim/2'
-    // cycles, which means we will have at most `space_dim/2'
-    // terminators.
-    std::vector<dimension_type> cycles;
-    cycles.reserve(space_dim + space_dim/2);
-
-    // Used to mark elements as soon as they are inserted in a cycle.
-    std::deque<bool> visited(space_dim);
-
-    for (dimension_type i = space_dim; i-- > 0; ) {
-      if (!visited[i]) {
-	dimension_type j = i;
-	do {
-	  visited[j] = true;
-	  // The following initialization is only to make the compiler happy.
-	  dimension_type k = 0;
-	  if (!pfunc.maps(j, k))
-	    throw_invalid_argument("map_space_dimensions(pfunc)",
-				   " pfunc is inconsistent");
-	  if (k == j)
-	    // Cycle of length 1: skip it.
-	    goto skip;
-
-	  cycles.push_back(j+1);
-	  // Go along the cycle.
-	  j = k;
-	} while (!visited[j]);
-	// End of cycle: mark it.
-	cycles.push_back(0);
-      skip:
-	;
+    for (dimension_type j = min_id+2; j < max_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      Row_Iterator j_iter = m_begin + j;
+      Row_Reference m_j = *j_iter;
+      Row_Reference m_cj = (j%2) ? *(j_iter-1) : *(j_iter+1);
+      if (n_var == min_id) {
+        max_assign(m_cj[n_var+1], m_tbf[j]);
+        max_assign(m_cj[n_var], m_ctbf[j]);
+        max_assign(m_j[n_var], m_ctbf[cj]);
+        max_assign(m_j[n_var+1], m_tbf[cj]);
+      }
+      else {
+        max_assign(m_v[j], m_cj[tbf_var+1]);
+        max_assign(m_cv[j], m_cj[tbf_var]);
+        max_assign(m_cv[cj], m_j[tbf_var]);
+        max_assign(m_v[cj], m_j[tbf_var+1]);
       }
     }
-
-    // If `cycles' is empty then `pfunc' is the identity.
-    if (cycles.empty())
-      return;
-
-    // Permute all that is up-to-date.  Notice that the contents of
-    // the saturation matrices is unaffected by the permutation of
-    // columns: they remain valid, if they were so.
-    if (constraints_are_up_to_date())
-      con_sys.permute_columns(cycles);
-
-    if (generators_are_up_to_date())
-      gen_sys.permute_columns(cycles);
-
-    assert(OK());
-    return;
+    for (dimension_type j = max_id+2; j < n_rows; ++j) {
+      Row_Iterator j_iter = m_begin + j;
+      Row_Reference m_j = *j_iter;
+      Row_Reference m_cj = (j%2) ? *(j_iter-1) : *(j_iter+1);
+      max_assign(m_cj[n_var+1], m_cj[tbf_var+1]);
+      max_assign(m_cj[n_var], m_cj[tbf_var]);
+      max_assign(m_j[n_var], m_j[tbf_var]);
+      max_assign(m_j[n_var+1], m_j[tbf_var+1]);
+    }
   }
+  remove_space_dimensions(to_be_folded);
+}
 
-  // If control gets here, then `pfunc' is not a permutation and some
-  // dimensions must be projected away.
-
-  // If there are pending constraints, using `generators()' we process them.
-  const Generator_System& old_gensys = generators();
-
-  if (old_gensys.num_rows() == 0) {
-    // The polyhedron is empty.
-    Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
-    std::swap(*this, new_polyhedron);
-    assert(OK());
-    return;
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape<T>& x) {
+  // Handle special cases first.
+  if (x.marked_empty()) {
+    s << "false";
+    return s;
   }
-
-  // Make a local copy of the partial function.
-  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
-  for (dimension_type j = space_dim; j-- > 0; ) {
-    dimension_type pfunc_j;
-    if (pfunc.maps(j, pfunc_j))
-      pfunc_maps[j] = pfunc_j;
+  if (x.is_universe()) {
+    s << "true";
+    return s;
   }
 
-  Generator_System new_gensys;
-  for (Generator_System::const_iterator i = old_gensys.begin(),
-	 old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
-    const Generator& old_g = *i;
-    Linear_Expression e(0 * Variable(new_space_dimension-1));
-    bool all_zeroes = true;
-    for (dimension_type j = space_dim; j-- > 0; ) {
-      if (old_g.coefficient(Variable(j)) != 0
-	  && pfunc_maps[j] != not_a_dimension()) {
-	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
-	all_zeroes = false;
+  typedef typename Octagonal_Shape<T>::coefficient_type N;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_Iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_Reference;
+
+  // Records whether or not we still have to print the first constraint.
+  bool first = true;
+
+  Row_Iterator m_begin = x.matrix.row_begin();
+  Row_Iterator m_end = x.matrix.row_end();
+
+  // Temporaries.
+  DIRTY_TEMP(N, negation);
+  DIRTY_TEMP(N, half);
+  // Go through all the unary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i = Variable(i/2);
+    const N& x_i_ii = (*i_iter)[i+1];
+    ++i_iter;
+    const N& x_ii_i = (*i_iter)[i];
+    ++i_iter;
+    // Check whether or not it is an equality constraint.
+    if (is_additive_inverse(x_i_ii, x_ii_i)) {
+      // It is an equality.
+      assert(!is_plus_infinity(x_i_ii) && !is_plus_infinity(x_ii_i));
+      if (first)
+        first = false;
+      else
+        s << ", ";
+      // If the value bound can NOT be divided by 2 exactly,
+      // then we output the constraint `2*v_i == bound'.
+      if (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ)
+        s << v_i << " == " << half;
+      else
+        s << "2*" << v_i << " == " << x_ii_i;
+    }
+    else {
+      // We will print unary non-strict inequalities, if any.
+      if (!is_plus_infinity(x_i_ii)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        neg_assign_r(negation, x_i_ii, ROUND_NOT_NEEDED);
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i >= negation'.
+        if (div2exp_assign_r(half, negation, 1, ROUND_UP) == V_EQ)
+          s << v_i << " >= " << half;
+        else
+          s << "2*" << v_i << " >= " << negation;
+      }
+      if (!is_plus_infinity(x_ii_i)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i <= bound'.
+        if (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ)
+          s << v_i << " <= " << half;
+        else
+          s << "2*" << v_i << " <= " << x_ii_i;
       }
     }
-    switch (old_g.type()) {
-    case Generator::LINE:
-      if (!all_zeroes)
-	new_gensys.insert(line(e));
-      break;
-    case Generator::RAY:
-      if (!all_zeroes)
-	new_gensys.insert(ray(e));
-      break;
-    case Generator::POINT:
-      // A point in the origin has all zero homogeneous coefficients.
-      new_gensys.insert(point(e, old_g.divisor()));
-      break;
-    case Generator::CLOSURE_POINT:
-      // A closure point in the origin has all zero homogeneous coefficients.
-      new_gensys.insert(closure_point(e, old_g.divisor()));
-      break;
+  }
+
+  // Go through all the binary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (Row_Iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i = Variable(i/2);
+    Row_Reference r_i = *i_iter;
+    ++i_iter;
+    Row_Reference r_ii = *i_iter;
+    ++i_iter;
+
+    for (dimension_type j = 0; j < i; j += 2) {
+      const Variable v_j = Variable(j/2);
+      // Print binary differences.
+      const N& x_ii_jj = r_ii[j+1];
+      const N& x_i_j = r_i[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(x_ii_jj, x_i_j)) {
+        // It is an equality.
+        assert(!is_plus_infinity(x_i_j) && !is_plus_infinity(x_ii_jj));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        if (sgn(x_i_j) >= 0)
+          s << v_j << " - " << v_i << " == " << x_i_j;
+        else
+          s << v_i << " - " << v_j << " == " << x_ii_jj;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(x_i_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(x_i_j) >= 0)
+            s << v_j << " - " << v_i << " <= " << x_i_j;
+          else {
+            neg_assign_r(negation, x_i_j, ROUND_DOWN);
+            s << v_i << " - " << v_j << " >= " << negation;
+          }
+        }
+        if (!is_plus_infinity(x_ii_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(x_ii_jj) >= 0)
+            s << v_i << " - " << v_j << " <= " << x_ii_jj;
+          else {
+            neg_assign_r(negation, x_ii_jj, ROUND_DOWN);
+            s << v_j << " - " << v_i << " >= " << negation;
+          }
+        }
+      }
+      // Print binary sums.
+      const N& x_i_jj = r_i[j+1];
+      const N& x_ii_j = r_ii[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(x_i_jj, x_ii_j)) {
+        // It is an equality.
+        assert(!is_plus_infinity(x_i_jj) && !is_plus_infinity(x_ii_j));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        s << v_j << " + " << v_i << " == " << x_ii_j;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(x_i_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          neg_assign_r(negation, x_i_jj, ROUND_DOWN);
+          s << v_j << " + " << v_i << " >= " << negation;
+        }
+        if (!is_plus_infinity(x_ii_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          s << v_j << " + " << v_i << " <= " << x_ii_j;
+        }
+      }
     }
   }
-  Polyhedron new_polyhedron(topology(), new_gensys);
-  std::swap(*this, new_polyhedron);
-  assert(OK(true));
+  return s;
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 2474
+template <typename T>
+void
+Octagonal_Shape<T>::ascii_dump(std::ostream& s) const {
+  s << "space_dim "
+    << space_dim
+    << "\n";
+  status.ascii_dump(s);
+  s << "\n";
+  matrix.ascii_dump(s);
+}
 
-// Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 27
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, Octagonal_Shape<T>)
 
-namespace Parma_Polyhedra_Library {
+template <typename T>
+bool
+Octagonal_Shape<T>::ascii_load(std::istream& s) {
+  std::string str;
 
-inline
-H79_Certificate::H79_Certificate()
-  : affine_dim(0), num_constraints(0) {
-  // This is the certificate for a zero-dim universe polyhedron.
-}
+  if (!(s >> str) || str != "space_dim")
+    return false;
 
-inline
-H79_Certificate::H79_Certificate(const H79_Certificate& y)
-  : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
-}
+  if (!(s >> space_dim))
+    return false;
 
-inline
-H79_Certificate::~H79_Certificate() {
-}
+  if (!status.ascii_load(s))
+    return false;
 
-inline bool
-H79_Certificate::Compare::operator()(const H79_Certificate& x,
-				     const H79_Certificate& y) const {
-  // For an efficient evaluation of the multiset ordering based
-  // on this lgo relation, we want larger elements to come first.
-  return x.compare(y) == 1;
-}
+  if (!matrix.ascii_load(s))
+    return false;
 
-template <typename PH>
-inline
-H79_Certificate::H79_Certificate(const PH& ph)
-  : affine_dim(0), num_constraints(0) {
-  H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
-  affine_dim = cert.affine_dim;
-  num_constraints = cert.num_constraints;
+  assert(OK());
+  return true;
 }
 
-template <typename PH>
-inline int
-H79_Certificate::compare(const PH& ph) const {
-  return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+template <typename T>
+memory_size_type
+Octagonal_Shape<T>::external_memory_in_bytes() const {
+  return matrix.external_memory_in_bytes();
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 96
-
-// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 1
-/* Grid_Certificate class declaration.
-*/
-
-
-// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 27
-
-// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 30
-#include <cassert>
-#include <vector>
-
-//! The convergence certificate for the Grid widening operator.
-/*! \ingroup PPL_CXX_interface
-  Convergence certificates are used to instantiate the BHZ03 framework
-  so as to define widening operators for the finite powerset domain.
-
-  \note
-  Each convergence certificate has to be used together with a
-  compatible widening operator. In particular, Grid_Certificate can
-  certify the Grid widening.
-*/
-class Parma_Polyhedra_Library::Grid_Certificate {
-public:
-  //! Default constructor.
-  Grid_Certificate();
+template <typename T>
+bool
+Octagonal_Shape<T>::OK() const {
+  // Check whether the matrix is well-formed.
+  if (!matrix.OK())
+    return false;
 
-  //! Constructor: computes the certificate for \p gr.
-  Grid_Certificate(const Grid& gr);
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
 
-  //! Copy constructor.
-  Grid_Certificate(const Grid_Certificate& y);
+  // All empty octagons are OK.
+  if (marked_empty())
+    return true;
 
-  //! Destructor.
-  ~Grid_Certificate();
+  // 0-dim universe octagon is OK.
+  if (space_dim == 0)
+    return true;
 
-  //! The comparison function for certificates.
-  /*!
-    \return
-    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
-    is smaller than, equal to, or greater than \p y, respectively.
-  */
-  int compare(const Grid_Certificate& y) const;
+  // MINUS_INFINITY cannot occur at all.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (is_minus_infinity(x_i[j])) {
+#ifndef NDEBUG
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        std::cerr << "Octagonal_Shape::"
+                  << "matrix[" << i.index() << "][" << j << "] = "
+                  << x_i[j] << "!"
+                  << std::endl;
+#endif
+        return false;
+      }
+  }
 
-  //! Compares \p *this with the certificate for grid \p gr.
-  int compare(const Grid& gr) const;
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         m_end = matrix.row_end(); i != m_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type r = *i;
+    const N& m_i_i = r[i.index()];
+    if (!is_plus_infinity(m_i_i)) {
+#ifndef NDEBUG
+      const dimension_type j = i.index();
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "Octagonal_Shape::matrix[" << j << "][" << j << "] = "
+                << m_i_i << "!  (+inf was expected.)\n";
+#endif
+      return false;
+    }
+  }
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the certificate for grid
-    \p gr is strictly smaller than \p *this.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool is_stabilizing(const Grid& gr) const;
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise strong closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the closure information is legal.
+    if (marked_strongly_closed()) {
+      Octagonal_Shape x = *this;
+      x.reset_strongly_closed();
+      x.strong_closure_assign();
+      if (x.matrix != matrix) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is marked as strongly closed "
+                  << "but it is not!\n";
+#endif
+        return false;
+      }
+    }
 
-  //! A total ordering on Grid certificates.
-  /*!
-    This binary predicate defines a total ordering on Grid certificates
-    which is used when storing information about sets of grids.
-  */
-  struct Compare {
-    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
-    bool operator()(const Grid_Certificate& x,
-		    const Grid_Certificate& y) const;
-  };
+    // A closed octagon must be strong-coherent.
+    if (marked_strongly_closed())
+      if (!is_strong_coherent()) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is not strong-coherent!\n";
+#endif
+        return false;
+      }
+  }
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! Check if gathered information is meaningful.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool OK() const;
+  // All checks passed.
+  return true;
+}
 
-private:
-  //! Number of a equalities in a minimized congruence system for the
-  //! grid.
-  dimension_type num_equalities;
-  //! Number of a proper congruences in a minimized congruence system
-  //! for the grid.
-  dimension_type num_proper_congruences;
-};
 
-// Automatically generated from PPL source file ../src/Grid_Certificate.inlines.hh line 1
-/* Grid_Certificate class implementation: inline functions.
-*/
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const Octagonal_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
 
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
 
-namespace Parma_Polyhedra_Library {
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
 
-inline
-Grid_Certificate::Grid_Certificate()
-  : num_equalities(0), num_proper_congruences(0) {
-  // This is the certificate for a zero-dim universe grid.
-  assert(OK());
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline
-Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
-  : num_equalities(y.num_equalities),
-    num_proper_congruences(y.num_proper_congruences) {
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline
-Grid_Certificate::~Grid_Certificate() {
+template <typename T>
+void
+Octagonal_Shape<T>::throw_constraint_incompatible(const char* method) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
 }
 
-inline bool
-Grid_Certificate::is_stabilizing(const Grid& gr) const {
-  return compare(gr) == 1;
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_expression_too_complex(const char* method,
+                               const Linear_Expression& e) const {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
 }
 
-inline bool
-Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
-				      const Grid_Certificate& y) const {
-  // For an efficient evaluation of the multiset ordering based
-  // on this lgo relation, we want larger elements to come first.
-  return x.compare(y) == 1;
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const char* name_row,
+                               const Linear_Expression& y) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 102
 
-// Automatically generated from PPL source file ../src/Grid.defs.hh line 1
-/* Grid class declaration.
-*/
+template <typename T>
+void
+Octagonal_Shape<T>::throw_generic(const char* method,
+                                  const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << reason;
+  throw std::invalid_argument(s.str());
+}
 
+} // namespace Parma_Polyhedra_Library
 
-#define STRONG_REDUCTION
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Octagonal_Shape.defs.hh line 1979
 
-// Automatically generated from PPL source file ../src/Grid.defs.hh line 43
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.inlines.hh line 34
+#include <cassert>
 #include <vector>
-#include <iosfwd>
-
-// Dimension kind vector tracing
-#define print_dim_kinds(msg, dim_kinds)					\
-  std::cout << msg << "dim_kinds:";					\
-  for (Dimension_Kinds::iterator i = dim_kinds.begin(); i != dim_kinds.end(); ++i) \
-    std::cout << " " << *i;						\
-  std::cout << std::endl;
-#if 0
-#define trace_dim_kinds(msg, dim_kinds) print_dim_kinds(msg, dim_kinds)
-#else
-#define trace_dim_kinds(msg, dim_kinds)
-#endif
+#include <iostream>
+#include <algorithm>
 
 namespace Parma_Polyhedra_Library {
 
-namespace IO_Operators {
-
-//! Output operator.
-/*!
-  \relates Parma_Polyhedra_Library::Grid
-  Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
-  is written if \p gr is an empty grid; <CODE>true</CODE> is written
-  if \p gr is a universe grid; a minimized system of congruences
-  defining \p gr is written otherwise, all congruences in one row
-  separated by ", "s.
-*/
-std::ostream&
-operator<<(std::ostream& s, const Grid& gr);
-
-} // namespace IO_Operators
-
-/*! \brief
-  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
-  grid.
-
-  \relates Grid
-  Note that \p x and \p y may be dimension-incompatible grids: in
-  those cases, the value <CODE>false</CODE> is returned.
-*/
-bool operator==(const Grid& x, const Grid& y);
-
-/*! \brief
-  Returns <CODE>true</CODE> if and only if \p x and \p y are different
-  grids.
-
-  \relates Grid
-  Note that \p x and \p y may be dimension-incompatible grids: in
-  those cases, the value <CODE>true</CODE> is returned.
-*/
-bool operator!=(const Grid& x, const Grid& y);
-
-} // namespace Parma_Polyhedra_Library
-
-
-//! A grid.
-/*! \ingroup PPL_CXX_interface
-  An object of the class Grid represents a rational grid.
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(DB_Matrix<N>::max_num_rows() - 1,
+		  DB_Matrix<N>::max_num_columns() - 1);
+}
 
-  A grid can be specified as either a finite system of congruences
-  or a finite system of generators (see Section \ref
-  sect_rational_grids) and it is always possible to obtain either
-  representation.
-  That is, if we know the system of congruences, we can obtain
-  from this the system of generators that define the same grid
-  and vice versa.
-  These systems can contain redundant members, or they can be in the
-  minimal form.
-  Most operators on grids are provided with two implementations:
-  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
-  also enforces the minimization of the representations,
-  and returns the boolean value <CODE>false</CODE> whenever
-  the resulting grid turns out to be empty.
+template <typename T>
+inline bool
+BD_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
 
-  A key attributes of any grid is its space dimension (the dimension
-  \f$n \in \Nset\f$ of the enclosing vector space):
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
 
-  - all grids, the empty ones included, are endowed with a space
-    dimension;
-  - most operations working on a grid and another object (another
-    grid, a congruence, a generator, a set of variables, etc.) will
-    throw an exception if the grid and the object are not
-    dimension-compatible (see Section \ref Grid_Space_Dimensions);
-  - the only ways in which the space dimension of a grid can be
-    changed are with <EM>explicit</EM> calls to operators provided for
-    that purpose, and with standard copy, assignment and swap
-    operators.
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+  return status.test_shortest_path_closed();
+}
 
-  Note that two different grids can be defined on the zero-dimension
-  space: the empty grid and the universe grid \f$R^0\f$.
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+  return status.test_shortest_path_reduced();
+}
 
-  \par
-  In all the examples it is assumed that variables
-  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
-  used) as follows:
-  \code
-  Variable x(0);
-  Variable y(1);
-  \endcode
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
 
-  \par Example 1
-  The following code builds a grid corresponding to the even integer
-  pairs in \f$\Rset^2\f$, given as a system of congruences:
-  \code
-  Congruence_System cgs;
-  cgs.insert((x %= 0) / 2);
-  cgs.insert((y %= 0) / 2);
-  Grid gr(cgs);
-  \endcode
-  The following code builds the same grid as above, but starting
-  from a system of generators specifying three of the points:
-  \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*x + 0*y));
-  gs.insert(grid_point(0*x + 2*y));
-  gs.insert(grid_point(2*x + 0*y));
-  Grid gr(gs);
-  \endcode
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+  status.set_empty();
+}
 
-  \par Example 2
-  The following code builds a grid corresponding to a line in
-  \f$\Rset^2\f$ by adding a single congruence to the universe grid:
-  \code
-  Congruence_System cgs;
-  cgs.insert(x - y == 0);
-  Grid gr(cgs);
-  \endcode
-  The following code builds the same grid as above, but starting
-  from a system of generators specifying a point and a line:
-  \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*x + 0*y));
-  gs.insert(grid_line(x + y));
-  Grid gr(gs);
-  \endcode
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_closed() {
+  status.set_shortest_path_closed();
+}
 
-  \par Example 3
-  The following code builds a grid corresponding to the integral
-  points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
-  by adding an equality and congruence to the universe grid:
-  \code
-  Congruence_System cgs;
-  cgs.insert(x - y == 0);
-  cgs.insert(x %= 0);
-  Grid gr(cgs);
-  \endcode
-  The following code builds the same grid as above, but starting
-  from a system of generators specifying a point and a parameter:
-  \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*x + 0*y));
-  gs.insert(parameter(x + y));
-  Grid gr(gs);
-  \endcode
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_reduced() {
+  status.set_shortest_path_reduced();
+}
 
-  \par Example 4
-  The following code builds the grid corresponding to a plane by
-  creating the universe grid in \f$\Rset^2\f$:
-  \code
-  Grid gr(2);
-  \endcode
-  The following code builds the same grid as above, but starting
-  from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
-  generators (a point, and two lines).
-  \code
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(0*x + 0*y));
-  gr.add_generator(grid_line(x));
-  gr.add_generator(grid_line(y));
-  \endcode
-  Note that a generator system must contain a point when describing
-  a grid.  To ensure that this is always the case it is required
-  that the first generator inserted in an empty grid is a point
-  (otherwise, an exception is thrown).
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_closed() {
+  status.reset_shortest_path_closed();
+}
 
-  \par Example 5
-  The following code shows the use of the function
-  <CODE>add_space_dimensions_and_embed</CODE>:
-  \code
-  Grid gr(1);
-  gr.add_congruence(x == 2);
-  gr.add_space_dimensions_and_embed(1);
-  \endcode
-  We build the universe grid in the 1-dimension space \f$\Rset\f$.
-  Then we add a single equality congruence,
-  thus obtaining the grid corresponding to the singleton set
-  \f$\{ 2 \} \sseq \Rset\f$.
-  After the last line of code, the resulting grid is
-  \f[
-  \bigl\{\,
-  (2, y)^\transpose \in \Rset^2
-  \bigm|
-  y \in \Rset
-  \,\bigr\}.
-  \f]
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_reduced() {
+  status.reset_shortest_path_reduced();
+}
 
-  \par Example 6
-  The following code shows the use of the function
-  <CODE>add_space_dimensions_and_project</CODE>:
-  \code
-  Grid gr(1);
-  gr.add_congruence(x == 2);
-  gr.add_space_dimensions_and_project(1);
-  \endcode
-  The first two lines of code are the same as in Example 4 for
-  <CODE>add_space_dimensions_and_embed</CODE>.
-  After the last line of code, the resulting grid is
-  the singleton set
-  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+		      const Degenerate_Element kind)
+  : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+  if (kind == EMPTY)
+    set_empty();
+  else {
+    if (num_dimensions > 0)
+      // A (non zero-dim) universe BDS is closed.
+      set_shortest_path_closed();
+  }
+  assert(OK());
+}
 
-  \par Example 7
-  The following code shows the use of the function
-  <CODE>affine_image</CODE>:
-  \code
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(0*x + 0*y));
-  gr.add_generator(grid_point(4*x + 0*y));
-  gr.add_generator(grid_point(0*x + 2*y));
-  Linear_Expression expr = x + 3;
-  gr.affine_image(x, expr);
-  \endcode
-  In this example the starting grid is all the pairs of \f$x\f$ and
-  \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
-  and \f$y\f$ is an integer multiple of 2.  The considered variable
-  is \f$x\f$ and the affine expression is \f$x+3\f$.  The resulting
-  grid is the given grid translated 3 integers to the right (all the
-  pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
-  and \f$y\f$ is an integer multiple of 2).
-  Moreover, if the affine transformation for the same variable \p x
-  is instead \f$x+y\f$:
-  \code
-  Linear_Expression expr = x + y;
-  \endcode
-  the resulting grid is every second integral point along the \f$x=y\f$
-  line, with this line of points repeated at every fourth integral value
-  along the \f$x\f$ axis.
-  Instead, if we do not use an invertible transformation for the
-  same variable; for example, the affine expression \f$y\f$:
-  \code
-  Linear_Expression expr = y;
-  \endcode
-  the resulting grid is every second point along the \f$x=y\f$ line.
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y, Complexity_Class)
+  : dbm(y.dbm), status(y.status), redundancy_dbm() {
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+}
 
-  \par Example 8
-  The following code shows the use of the function
-  <CODE>affine_preimage</CODE>:
-  \code
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(0*x + 0*y));
-  gr.add_generator(grid_point(4*x + 0*y));
-  gr.add_generator(grid_point(0*x + 2*y));
-  Linear_Expression expr = x + 3;
-  gr.affine_preimage(x, expr);
-  \endcode
-  In this example the starting grid, \p var and the affine
-  expression and the denominator are the same as in Example 6, while
-  the resulting grid is similar but translated 3 integers to the
-  left (all the pairs \f$(x, y)\f$
-  where \f$x\f$ is -3 plus an integer multiple of 4 and
-  \f$y\f$ is an integer multiple of 2)..
-  Moreover, if the affine transformation for \p x is \f$x+y\f$
-  \code
-  Linear_Expression expr = x + y;
-  \endcode
-  the resulting grid is a similar grid to the result in Example 6,
-  only the grid is slanted along \f$x=-y\f$.
-  Instead, if we do not use an invertible transformation for the same
-  variable \p x, for example, the affine expression \f$y\f$:
-  \code
-  Linear_Expression expr = y;
-  \endcode
-  the resulting grid is every fourth line parallel to the \f$x\f$
-  axis.
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y, Complexity_Class)
+  : dbm(y.dbm), status(), redundancy_dbm() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
 
-  \par Example 9
-  For this example we also use the variables:
-  \code
-  Variable z(2);
-  Variable w(3);
-  \endcode
-  The following code shows the use of the function
-  <CODE>remove_space_dimensions</CODE>:
-  \code
-  Grid_Generator_System gs;
-  gs.insert(grid_point(3*x + y +0*z + 2*w));
-  Grid gr(gs);
-  Variables_Set to_be_removed;
-  to_be_removed.insert(y);
-  to_be_removed.insert(z);
-  gr.remove_space_dimensions(to_be_removed);
-  \endcode
-  The starting grid is the singleton set
-  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
-  the resulting grid is
-  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
-  Be careful when removing space dimensions <EM>incrementally</EM>:
-  since dimensions are automatically renamed after each application
-  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
-  results can be obtained.
-  For instance, by using the following code we would obtain
-  a different result:
-  \code
-  set<Variable> to_be_removed1;
-  to_be_removed1.insert(y);
-  gr.remove_space_dimensions(to_be_removed1);
-  set<Variable> to_be_removed2;
-  to_be_removed2.insert(z);
-  gr.remove_space_dimensions(to_be_removed2);
-  \endcode
-  In this case, the result is the grid
-  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
-  when removing the set of dimensions \p to_be_removed2
-  we are actually removing variable \f$w\f$ of the original grid.
-  For the same reason, the operator \p remove_space_dimensions
-  is not idempotent: removing twice the same non-empty set of dimensions
-  is never the same as removing them just once.
-*/
+template <typename T>
+inline Congruence_System
+BD_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
 
-class Parma_Polyhedra_Library::Grid {
-public:
-  //! Returns the maximum space dimension all kinds of Grid can handle.
-  static dimension_type max_space_dimension();
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
+  add_constraint(c);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
 
-  //! Builds a grid having the specified properties.
-  /*!
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the grid;
+template <typename T>
+inline bool
+BD_Shape<T>::add_congruence_and_minimize(const Congruence& cg) {
+  add_congruence(cg);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
 
-    \param kind
-    Specifies whether the universe or the empty grid has to be built.
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i)
+    add_constraint(*i);
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space
-    dimension.
-  */
-  explicit Grid(dimension_type num_dimensions = 0,
-		const Degenerate_Element kind = UNIVERSE);
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
+  add_constraints(cs);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
 
-  //! Builds a grid, copying a system of congruences.
-  /*!
-    The grid inherits the space dimension of the congruence system.
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
 
-    \param cgs
-    The system of congruences defining the grid.
+template <typename T>
+inline bool
+BD_Shape<T>::add_recycled_constraints_and_minimize(Constraint_System& cs) {
+  return add_constraints_and_minimize(cs);
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space
-    dimension.
-  */
-  explicit Grid(const Congruence_System& cgs);
+template <typename T>
+void
+BD_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  add_constraints(cs);
+}
 
-  //! Builds a grid, recycling a system of congruences.
-  /*!
-    The grid inherits the space dimension of the congruence system.
+template <typename T>
+inline bool
+BD_Shape<T>::add_congruences_and_minimize(const Congruence_System& cgs) {
+  add_congruences(cgs);
+  return !is_empty();
+}
 
-    \param cgs
-    The system of congruences defining the grid.  Its data-structures
-    will be recycled to build the grid.
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space
-    dimension.
-  */
-  explicit Grid(Congruence_System& cgs);
+template <typename T>
+inline bool
+BD_Shape<T>::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
+  return add_congruences_and_minimize(cgs);
+}
 
-  //! Builds a grid, copying a system of constraints.
-  /*!
-    The grid inherits the space dimension of the constraint system.
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i)
+    refine_with_constraint(*i);
+}
 
-    \param cs
-    The system of constraints defining the grid.
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  Constraint_System cs(cgs);
+  refine_with_constraints(cs);
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space
-    dimension.
-  */
-  explicit Grid(const Constraint_System& cs);
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
 
-  //! Builds a grid, recycling a system of constraints.
-  /*!
-    The grid inherits the space dimension of the constraint system.
 
-    \param cs
-    The system of constraints defining the grid.
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space
-    dimension.
-  */
-  explicit Grid(Constraint_System& cs);
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+  : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(cs);
+}
 
-  //! Builds a grid, copying a system of generators.
-  /*!
-    The grid inherits the space dimension of the generator system.
+template <typename T>
+template <typename Interval>
+inline
+BD_Shape<T>::BD_Shape(const Box<Interval>& box,
+                      Complexity_Class)
+  : dbm(box.space_dimension() + 1), status(), redundancy_dbm() {
+  if (box.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(box.constraints());
+  return;
+}
 
-    \param const_gs
-    The system of generators defining the grid.
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Grid& grid,
+                      Complexity_Class)
+  : dbm(grid.space_dimension() + 1), status(), redundancy_dbm() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_congruences(grid.congruences());
+  return;
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points.
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const Octagonal_Shape<U>& os,
+                      Complexity_Class)
+  : dbm(os.space_dimension() + 1), status(), redundancy_dbm() {
+  if (os.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(os.constraints());
+  return;
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space
-    dimension.
-  */
-  explicit Grid(const Grid_Generator_System& const_gs);
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+  dbm = y.dbm;
+  status = y.status;
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+  return *this;
+}
 
-  //! Builds a grid, recycling a system of generators.
-  /*!
-    The grid inherits the space dimension of the generator system.
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
 
-    \param gs
-    The system of generators defining the grid.  Its data-structures
-    will be recycled to build the grid.
+template <typename T>
+inline void
+BD_Shape<T>::swap(BD_Shape& y) {
+  std::swap(dbm, y.dbm);
+  std::swap(status, y.status);
+  std::swap(redundancy_dbm, y.redundancy_dbm);
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points.
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+  return dbm.num_rows() - 1;
+}
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
-  */
-  explicit Grid(Grid_Generator_System& gs);
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+  shortest_path_closure_assign();
+  return marked_empty();
+}
 
-  //! Builds a grid out of a generic, interval-based bounding box.
-  /*!
-    \param box
-    The bounding box representing the grid to be built.  The box can
-    contain only point and universe intervals;
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
 
-    \param dummy
-    A dummy tag to make this constructor syntactically unique.
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
 
-    \exception std::length_error
-    Thrown if the space dimension of \p box exceeds the maximum
-    allowed space dimension.
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+		      Coefficient& sup_n, Coefficient& sup_d,
+		      bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p box contains at least one interval with: a
-    topologically open bound, a single bound, or two bounds which have
-    space between them.
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+		      Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		      Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
 
-    The template class Box must provide the following methods.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the bounding box.
-    \code
-      bool is_empty() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the bounding box
-    describes the empty set.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
-  */
-  template <typename Box>
-  Grid(const Box& box, From_Bounding_Box dummy);
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+		      Coefficient& inf_n, Coefficient& inf_d,
+		      bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
 
-  //! Builds a grid out of a generic, interval-based covering box.
-  /*!
-    The covering box is a set of upper and lower values for each
-    dimension.  When a covering box is tiled onto empty space the
-    corners of the tiles form a rectilinear grid.
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+		      Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		      Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
 
-    A box interval with only one bound fixes the values of all grid
-    points in the dimension associated with the box to the value of
-    the bound.  A box interval which has upper and lower bounds of
-    equal value allows all grid points with any value in the dimension
-    associated with the interval.  The presence of a universe interval
-    results in the empty grid.  The empty box produces the empty grid
-    of the same dimension as the box.
+template <typename T>
+inline bool
+BD_Shape<T>::is_topologically_closed() const {
+  return true;
+}
 
-    \param box
-    The covering box representing the grid to be built;
+template <typename T>
+inline bool
+BD_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
 
-    \param dummy
-    A dummy tag to make this constructor syntactically unique.
+template <typename T>
+inline void
+BD_Shape<T>::topological_closure_assign() {
+  // Nothing to be done.
+  return;
+}
 
-    \exception std::length_error
-    Thrown if the space dimension of \p box exceeds the maximum
-    allowed space dimension.
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
 
-    \exception std::invalid_argument
-    Thrown if \p box contains any topologically open bounds.
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
 
-    The template class Box must provide the following methods.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the covering box.
-    \code
-      bool is_empty() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the covering box
-    describes the empty set.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
-  */
-  template <typename Box>
-  Grid(const Box& box, From_Covering_Box dummy);
+  // The exact equivalence test requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
 
-  //! Ordinary copy-constructor.
-  Grid(const Grid& y);
+  // If one of two BDSs is empty, then they are equal
+  // if and only if the other BDS is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Check for syntactic equivalence of the two (shortest-path closed)
+  // systems of bounded differences.
+  return x.dbm == y.dbm;
+}
 
-  /*! \brief
-    The assignment operator.  (\p *this and \p y can be
-    dimension-incompatible.)
-  */
-  Grid& operator=(const Grid& y);
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  return !(x == y);
+}
 
-  //! \name Member Functions that Do Not Modify the Grid
-  //@{
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-  /*! \brief
-    Returns \f$0\f$, if \p *this is empty; otherwise, returns
-    the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
-  */
-  dimension_type affine_dimension() const;
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
 
-  //! Returns the system of congruences.
-  const Congruence_System& congruences() const;
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
 
-  //! Returns the system of congruences in reduced form.
-  const Congruence_System& minimized_congruences() const;
+  return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
 
-  //! Returns the system of generators.
-  const Grid_Generator_System& generators() const;
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
 
-  //! Returns the minimized system of generators.
-  const Grid_Generator_System& minimized_generators() const;
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
 
-  //! Returns the relations holding between \p *this and \p cg.
-  /*
-    \exception std::invalid_argument
-    Thrown if \p *this and congruence \p cg are dimension-incompatible.
-  */
-  // FIXME: Poly_Con_Relation seems to encode exactly what we want
-  // here.  We must find a new name for that class.  Temporarily,
-  // we keep using it without changing the name.
-  Poly_Con_Relation relation_with(const Congruence& cg) const;
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
 
-  //! Returns the relations holding between \p *this and \p g.
-  /*
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are dimension-incompatible.
-  */
-  // FIXME: see the comment for Poly_Con_Relation above.
-  Poly_Gen_Relation
-  relation_with(const Grid_Generator& g) const;
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is an empty
-    grid.
-  */
-  bool is_empty() const;
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is a universe
-    grid.
-  */
-  bool is_universe() const;
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is a
-    topologically closed subset of the vector space.
-  */
-  bool is_topologically_closed() const;
+  return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this and \p y are
-    disjoint.
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p x and \p y are dimension-incompatible.
-  */
-  bool is_disjoint_from(const Grid& y) const;
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
-  /*!
-    A grid is discrete if it can be defined by a generator system which
-    contains only points and parameters.  This includes the empty grid
-    and any grid in dimension zero.
-  */
-  bool is_discrete() const;
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
-  bool is_bounded() const;
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
-  /*!
-    This method is the same as bounds_from_below.
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
-  */
-  bool bounds_from_above(const Linear_Expression& expr) const;
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+   return true;
+  }
 
-  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
-  /*!
-    This method is the same as bounds_from_above.
+  return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
-  */
-  bool bounds_from_below(const Linear_Expression& expr) const;
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  DIRTY_TEMP(Checked_Temp, tmp0);
+  DIRTY_TEMP(Checked_Temp, tmp1);
+  DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty and
-    \p expr is bounded from above in \p *this, in which case the
-    supremum value is computed.
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
 
-    \param expr
-    The linear expression to be maximized subject to \p *this;
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+				const dimension_type j,
+				const N& k) {
+  // Private method: the caller has to ensure the following.
+  assert(i <= space_dimension() && j <= space_dimension() && i != j);
+  N& dbm_ij = dbm[i][j];
+  if (dbm_ij > k) {
+    dbm_ij = k;
+    if (marked_shortest_path_closed())
+      reset_shortest_path_closed();
+  }
+}
 
-    \param sup_n
-    The numerator of the supremum value;
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+				const dimension_type j,
+				Coefficient_traits::const_reference num,
+				Coefficient_traits::const_reference den) {
+  // Private method: the caller has to ensure the following.
+  assert(i <= space_dimension() && j <= space_dimension() && i != j);
+  assert(den != 0);
+  DIRTY_TEMP(N, k);
+  div_round_up(k, num, den);
+  add_dbm_constraint(i, j, k);
+}
 
-    \param sup_d
-    The denominator of the supremum value;
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // See the polyhedra documentation.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.time_elapse_assign(py);
+  BD_Shape<T> x(px);
+  swap(x);
+  assert(OK());
+}
 
-    \param maximum
-    <CODE>true</CODE> if the supremum value can be reached in \p this.
-    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
-    interface compatibility with class Polyhedron, where closure
-    points can result in a value of false.
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_and_minimize(const BD_Shape& y) {
+  bds_hull_assign(y);
+  assert(marked_empty()
+	 || space_dimension() == 0 || marked_shortest_path_closed());
+  return !marked_empty();
+}
 
-    If \p *this is empty or \p expr is not bounded by \p *this,
-    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
-    maximum are left untouched.
-  */
-  bool maximize(const Linear_Expression& expr,
-		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+template <typename T>
+inline void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+  bds_hull_assign(y);
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty and
-    \p expr is bounded from above in \p *this, in which case the
-    supremum value and a point where \p expr reaches it are computed.
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
 
-    \param expr
-    The linear expression to be maximized subject to \p *this;
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+  return bds_hull_assign_if_exact(y);
+}
 
-    \param sup_n
-    The numerator of the supremum value;
+template <typename T>
+inline void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+  bds_difference_assign(y);
+}
 
-    \param sup_d
-    The denominator of the supremum value;
+template <typename T>
+inline void
+BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  if (new_dim > space_dimension())
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dim);
 
-    \param maximum
-    <CODE>true</CODE> if the supremum value can be reached in \p this.
-    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
-    interface compatibility with class Polyhedron, where closure
-    points can result in a value of false;
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space BDS.
+  if (new_dim == space_dimension()) {
+    assert(OK());
+    return;
+  }
 
-    \param point
-    When maximization succeeds, will be assigned a point where \p expr
-    reaches its supremum value.
+  // Shortest-path closure is necessary as in remove_space_dimensions().
+  shortest_path_closure_assign();
+  dbm.resize_no_copy(new_dim + 1);
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+  // Shortest-path closure is maintained.
+  // TODO: see whether or not reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
 
-    If \p *this is empty or \p expr is not bounded by \p *this,
-    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
-    and \p point are left untouched.
-  */
-  bool maximize(const Linear_Expression& expr,
-		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-		Grid_Generator& point) const;
+  // If we removed _all_ dimensions from a non-empty BDS,
+  // the zero-dim universe BDS has been obtained.
+  if (new_dim == 0 && !marked_empty())
+    set_zero_dim_univ();
+  assert(OK());
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty and
-    \p expr is bounded from below in \p *this, in which case the
-    infimum value is computed.
+template <typename T>
+inline bool
+BD_Shape<T>::intersection_assign_and_minimize(const BD_Shape& y) {
+  intersection_assign(y);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
 
-    \param expr
-    The linear expression to be minimized subject to \p *this;
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+			    stop_points,
+			    stop_points
+			    + sizeof(stop_points)/sizeof(stop_points[0]),
+			    tp);
+}
 
-    \param inf_n
-    The numerator of the infimum value;
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.H79_widening_assign(py, tp);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
 
-    \param inf_d
-    The denominator of the infimum value;
+template <typename T>
+inline void
+BD_Shape<T>::widening_assign(const BD_Shape& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
 
-    \param minimum
-    <CODE>true</CODE> if the is the infimum value can be reached in \p
-    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
-    Present for interface compatibility with class Polyhedron, where
-    closure points can result in a value of false.
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+					      const Constraint_System& cs,
+					      unsigned* tp) {
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.limited_H79_extrapolation_assign(py, cs, tp);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+template <typename T>
+inline memory_size_type
+BD_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-    If \p *this is empty or \p expr is not bounded from below,
-    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
-    and \p minimum are left untouched.
-  */
-  bool minimize(const Linear_Expression& expr,
-		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+template <typename T>
+inline int32_t
+BD_Shape<T>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is not empty and
-    \p expr is bounded from below in \p *this, in which case the
-    infimum value and a point where \p expr reaches it are computed.
+} // namespace Parma_Polyhedra_Library
 
-    \param expr
-    The linear expression to be minimized subject to \p *this;
+namespace std {
 
-    \param inf_n
-    The numerator of the infimum value;
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+     Parma_Polyhedra_Library::BD_Shape<T>& y) {
+  x.swap(y);
+}
 
-    \param inf_d
-    The denominator of the infimum value;
+} // namespace std
 
-    \param minimum
-    <CODE>true</CODE> if the is the infimum value can be reached in \p
-    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
-    Present for interface compatibility with class Polyhedron, where
-    closure points can result in a value of false;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.templates.hh line 1
+/* BD_Shape class implementation: non-inline template functions.
+*/
 
-    \param point
-    When minimization succeeds, will be assigned a point where \p expr
-    reaches its infimum value.
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.templates.hh line 36
+#include <cassert>
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
 
-    If \p *this is empty or \p expr is not bounded from below,
-    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
-    and \p point are left untouched.
-  */
-  bool minimize(const Linear_Expression& expr,
-		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-		Grid_Generator& point) const;
+namespace Parma_Polyhedra_Library {
 
-  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool contains(const Grid& y) const;
+template <typename T>
+BD_Shape<T>::BD_Shape(const Congruence_System& cgs)
+  : dbm(cgs.space_dimension() + 1),
+    status(),
+    redundancy_dbm() {
+  add_congruences(cgs);
+  return;
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this strictly
-    contains \p y.
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+  : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool strictly_contains(const Grid& y) const;
+  const dimension_type space_dim = space_dimension();
+  DB_Row<N>& dbm_0 = dbm[0];
+  DIRTY_TEMP(N, tmp);
 
-  //! Uses \p *this to shrink a generic, interval-based bounding box.
-  /*!
-    \param box
-    The bounding box to be shrunk.
+  bool dbm_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!dbm_initialized) {
+        // When handling the first (closure) point, we initialize the DBM.
+        dbm_initialized = true;
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.coefficient(Variable(i-1));
+          DB_Row<N>& dbm_i = dbm[i];
+          for (dimension_type j = space_dim; j > 0; --j)
+            if (i != j)
+              div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
+          div_round_up(dbm_i[0], -g_i, d);
+        }
+        for (dimension_type j = space_dim; j > 0; --j)
+          div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d);
+        // Note: no need to initialize the first element of the main diagonal.
+      }
+      else {
+        // This is not the first point: the DBM already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.coefficient(Variable(i-1));
+          DB_Row<N>& dbm_i = dbm[i];
+          // The loop correctly handles the case when i == j.
+          for (dimension_type j = space_dim; j > 0; --j) {
+            div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d);
+            max_assign(dbm_i[j], tmp);
+          }
+          div_round_up(tmp, -g_i, d);
+          max_assign(dbm_i[0], tmp);
+        }
+        for (dimension_type j = space_dim; j > 0; --j) {
+          div_round_up(tmp, g.coefficient(Variable(j-1)), d);
+          max_assign(dbm_0[j], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p box are dimension-incompatible, or if \p
-    box contains any topologically open bounds.
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
+                                "the non-empty generator system gs "
+                                "contains no points.");
 
-    The template class Box must provide the following methods
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the bounding box.
-    \code
-      bool get_lower_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from below, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the greatest lower bound of \f$I\f$.  The fraction
-    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
-    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
-    the unique representation for zero.
-    \code
-      bool get_upper_bound(dimension_type k, bool closed,
-                           Coefficient& n, Coefficient& d) const
-    \endcode
-    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
-    space dimension.  If \f$I\f$ is not bounded from above, simply return
-    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
-    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
-    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
-    is closed and is set to <CODE>false</CODE> otherwise;
-    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
-    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
-    corresponds to the least upper bound of \f$I\f$.
-    \code
-      set_empty()
-    \endcode
-    Causes the box to become empty, i.e., to represent the empty set.
-    \code
-      raise_lower_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-    \code
-      lower_upper_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-
-    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
-    will be called at most once for each possible value for <CODE>k</CODE>
-    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
-    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
-    is positive, \f$0/1\f$ being the unique representation for zero.
-    The same guarantee is offered for the function
-    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
-  */
-  template <typename Box>
-  void shrink_bounding_box(Box& box) const;
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (dimension_type i = space_dim; i > 0; --i) {
+        const Coefficient& g_i = g.coefficient(Variable(i-1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i != g.coefficient(Variable(j-1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i != 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+      for (dimension_type j = space_dim; j > 0; --j)
+        if (g.coefficient(Variable(j-1)) != 0)
+          assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      break;
+    case Generator::RAY:
+      for (dimension_type i = space_dim; i > 0; --i) {
+        const Coefficient& g_i = g.coefficient(Variable(i-1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i < g.coefficient(Variable(j-1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i < 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+      for (dimension_type j = space_dim; j > 0; --j)
+        if (g.coefficient(Variable(j-1)) > 0)
+          assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_shortest_path_closed();
+  assert(OK());
+}
 
-  //! Writes the covering box for \p *this into \p box.
-  /*!
-    The covering box is a set of upper and lower values for each
-    dimension.  When the covering box written into \p box is tiled
-    onto empty space the corners of the tiles form the sparsest
-    rectilinear grid that includes \p *this.
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+  : dbm(), status(), redundancy_dbm() {
+  const dimension_type num_dimensions = ph.space_dimension();
 
-    The value of the lower bound of each interval of the resulting \p
-    box are as close as possible to the origin, with positive values
-    taking preference when the lowest positive value equals the lowest
-    negative value.
+  if (ph.marked_empty()) {
+    *this = BD_Shape<T>(num_dimensions, EMPTY);
+    return;
+  }
 
-    If all the points have a single value in a particular dimension of
-    the grid then there is only a lower bound on the interval produced
-    in \p box, and the lower bound denotes the single value for the
-    dimension.  If the coordinates of the points in a particular
-    dimension include every value then the upper and lower bounds of
-    the associated interval in \p box are set equal.  The empty grid
-    produces the empty \p box.  The zero dimension universe grid
-    produces the zero dimension universe box.
+  if (num_dimensions == 0) {
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+    return;
+  }
 
-    \param box
-    The Box into which the covering box is written.
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = BD_Shape<T>(ph.generators());
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p box are dimension-incompatible.
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  assert(ph.constraints_are_up_to_date());
 
-    The template class Box must provide the following methods
-    \code
-      Box(dimension_type space_dimension)
-    \endcode
-    Creates a universe box of space_dimension dimensions.
-    \code
-      dimension_type space_dimension() const
-    \endcode
-    returns the dimension of the vector space enclosing the grid
-    represented by the covering box.
-    \code
-      set_empty()
-    \endcode
-    Causes the box to become empty, i.e., to represent the empty set.
-    \code
-      raise_lower_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-    \code
-      lower_upper_bound(dimension_type k, bool closed,
-                        Coefficient_traits::const_reference n,
-                        Coefficient_traits::const_reference d)
-    \endcode
-    intersects the interval corresponding to the <CODE>k</CODE>-th
-    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
-    always passed as <CODE>true</CODE>.
-
-    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
-    will be called at most once for each possible value for <CODE>k</CODE>
-    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
-    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
-    is positive, \f$0/1\f$ being the unique representation for zero.
-    The same guarantee is offered for the function
-    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
-  */
-  template <typename Box>
-  void get_covering_box(Box& box) const;
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
 
-  //! Checks if all the invariants are satisfied.
-  /*!
-    \return
-    <CODE>true</CODE> if and only if \p *this satisfies all the
-    invariants and either \p check_not_empty is <CODE>false</CODE> or
-    \p *this is not empty.
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
 
-    \param check_not_empty
-    <CODE>true</CODE> if and only if, in addition to checking the
-    invariants, \p *this must be checked to be not empty.
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our BDSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
 
-    The check is performed so as to intrude as little as possible.  If
-    the library has been compiled with run-time assertions enabled,
-    error messages are written on <CODE>std::cerr</CODE> in case
-    invariants are violated. This is useful for the purpose of
-    debugging the library.
-  */
-  bool OK(bool check_not_empty = false) const;
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality())
+          lp.add_constraint(Linear_Expression(c) >= 0);
+        else
+          lp.add_constraint(c);
+      }
 
-  //@} // Member Functions that Do Not Modify the Grid
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
 
-  //! \name Space Dimension Preserving Member Functions that May Modify the Grid
-  //@{
+    // Start with a universe BDS that will be refined by the simplex.
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 1; i <= num_dimensions; ++i) {
+      Variable x(i-1);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        div_round_up(dbm[0][i], num, den);
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 1; j <= num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j-1);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, num, den);
+          div_round_up(dbm[j][i], num, den);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, num, den);
+        div_round_up(dbm[i][0], num, den);
+      }
+    }
+    set_shortest_path_closed();
+    assert(OK());
+    return;
+  }
 
-  //! Adds a copy of congruence \p cg to \p *this.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and congruence \p cg are
-    dimension-incompatible.
-  */
-  void add_congruence(const Congruence& cg);
+  // Extract easy-to-find bounds from constraints.
+  *this = BD_Shape<T>(ph.constraints());
+}
 
-  //! Adds constraint \p c to \p *this.
-  /*!
-    The addition can only affect \p *this if \p c is an equality.
+template <typename T>
+dimension_type
+BD_Shape<T>::affine_dimension() const {
+  const dimension_type space_dim = space_dimension();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (space_dim == 0)
+    return 0;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible.
-  */
-  void add_congruence(const Constraint& c);
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return 0;
 
-  /*! \brief
-    Adds a copy of congruence \p cg to the system of congruences of \p
-    *this, reducing the result
+  // The vector `predecessor' is used to represent equivalence classes:
+  // `predecessor[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class);
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  // Due to the fictitious variable `0', the affine dimension is one
+  // less the number of equivalence classes.
+  dimension_type affine_dim = 0;
+  // Note: disregard the first equivalence class.
+  for (dimension_type i = 1; i <= space_dim; ++i)
+    if (predecessor[i] == i)
+      ++affine_dim;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and congruence \p cg are dimension-incompatible.
-  */
-  bool add_congruence_and_minimize(const Congruence& c);
+  return affine_dim;
+}
 
-  //! Adds a copy of constraint \p c to \p *this, reducing the result.
-  /*!
-    The addition can only affect \p *this if \p c is an equality.
+template <typename T>
+Congruence_System
+BD_Shape<T>::minimized_congruences() const {
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs;
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cgs.insert((0*Variable(space_dim-1) %= 1) / 0);
+  else {
+    // KLUDGE: in the future `cgs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cgs.insert(0*Variable(space_dim-1) == 0);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible.
-  */
-  bool add_congruence_and_minimize(const Constraint& c);
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
 
-  /*! \brief
-    Adds a copy of generator \p g to the system of generators of \p
-    *this.
+    // Compute leader information.
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are dimension-incompatible,
-    or if \p *this is an empty grid and \p g is not a point.
-  */
-  void add_generator(const Grid_Generator& g);
+    // Go through the non-leaders to generate equality constraints.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const dimension_type leader = leaders[i];
+      if (i != leader) {
+        // Generate the constraint relating `i' and its leader.
+        if (leader == 0) {
+          // A unary equality has to be generated.
+          assert(!is_plus_infinity(dbm_0[i]));
+          numer_denom(dbm_0[i], num, den);
+          cgs.insert(den*Variable(i-1) == num);
+        }
+        else {
+          // A binary equality has to be generated.
+          assert(!is_plus_infinity(dbm[i][leader]));
+          numer_denom(dbm[i][leader], num, den);
+          cgs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+        }
+      }
+    }
+  }
+  return cgs;
+}
 
-  /*! \brief
-    Adds a copy of generator \p g to the system of generators of \p
-    *this, reducing the result.
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+  // Strict inequalities are not allowed.
+  if (c.is_strict_inequality())
+    throw_constraint_incompatible("add_constraint(c)");
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    return;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are dimension-incompatible,
-    or if \p *this is an empty grid and \p g is not a point.
-  */
-  bool add_generator_and_minimize(const Grid_Generator& g);
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (c.is_equality() && c.inhomogeneous_term() != 0)
+      set_empty();
+    if (c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
 
-  //! Adds a copy of each congruence in \p cgs to \p *this.
-  /*!
-    \param cgs
-    Contains the congruences that will be added to the system of
-    congruences of \p *this.
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cgs are dimension-incompatible.
-  */
-  void add_congruences(const Congruence_System& cgs);
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
 
-  //! Adds a copy of each equality constraint in \p cs to \p *this.
-  /*!
-    \param cs
-    The congruences that will be considered for addition to the system
-    of congruences of \p *this.
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    TEMP_INTEGER(minus_c_term);
+    neg_assign(minus_c_term, c.inhomogeneous_term());
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cgs are dimension-incompatible.
-  */
-  void add_congruences(const Constraint_System& cs);
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
 
-  //! Adds the congruences in \p cgs to *this.
-  /*!
-    \param cgs
-    The congruence system that will be recycled, adding its
-    congruences to the system of congruences of \p *this.
+template <typename T>
+void
+BD_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    add_constraint(expr == 0);
+  }
+  assert(OK());
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
+template <typename T>
+void
+BD_Shape<T>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
 
-    \warning
-    The only assumption that can be made about \p cgs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  void add_recycled_congruences(Congruence_System& cgs);
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    return;
 
-  //! Adds the equality constraints in \p cs to \p *this.
-  /*!
-    \param cs
-    The constraint system from which constraints will be considered
-    for addition to the system of congruences of \p *this.
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (c.is_equality() && c.inhomogeneous_term() != 0)
+      set_empty();
+    if (c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
 
-    \warning
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  DIRTY_TEMP(N, d);
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
 
-    The only assumption that can be made about \p cs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  void add_recycled_congruences(Constraint_System& cs);
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    TEMP_INTEGER(minus_c_term);
+    neg_assign(minus_c_term, c.inhomogeneous_term());
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
 
-  /*! \brief
-    Adds a copy of the congruences in \p cgs to the system of
-    congruences of \p *this, reducing the result.
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  if (cg.is_equality()) {
+    Linear_Expression expr;
+    for (dimension_type i = cg_space_dim; i-- > 0; ) {
+      const Variable v(i);
+      expr += cg.coefficient(v) * v;
+    }
+    expr += cg.inhomogeneous_term();
+    refine_with_constraint(expr == 0);
+  }
+  assert(OK());
+}
 
-    \param cgs
-    Contains the congruences that will be added to the system of
-    congruences of \p *this.
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cgs are dimension-incompatible.
-  */
-  bool add_congruences_and_minimize(const Congruence_System& cgs);
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
 
-  /*! \brief
-    Adds a copy of each equality constraint in \p cs to \p *this,
-    reducing the result.
+  // If `y' is an empty 0-dim space bounded difference shape,
+  // let `*this' become empty.
+  if (y_space_dim == 0 && y.marked_empty()) {
+    set_empty();
+    return;
+  }
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x_space_dim == 0 && marked_empty()) {
+    dbm.grow(y_space_dim + 1);
+    assert(OK());
+    return;
+  }
+  // First we increase the space dimension of `x' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `y' in the lower right-hand side,
+  // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+  // placed in the right position on the new matrix.
+  add_space_dimensions_and_embed(y_space_dim);
+  const dimension_type new_space_dim = x_space_dim + y_space_dim;
+  for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+    DB_Row<N>& dbm_i = dbm[i];
+    dbm_i[0] = y.dbm[i - x_space_dim][0];
+    dbm[0][i] = y.dbm[0][i - x_space_dim];
+    for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+      dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+  }
 
-    \param cs
-    Contains the constraints that will be added to the system of
-    congruences of \p *this.
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
-  */
-  bool add_congruences_and_minimize(const Constraint_System& cs);
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
 
-  /*! \brief
-    Adds the congruences in \p cgs to the system of congruences of \p
-    *this, reducing the result.
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("contains(y)", y);
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  // The zero-dimensional universe shape contains any other
+  // dimension-compatible shape.
+  // The zero-dimensional empty shape only contains another
+  // zero-dimensional empty shape.
+  if (x_space_dim == 0) {
+    if (!marked_empty())
+      return true;
+    else
+      return y.marked_empty();
+  }
 
-    \param cgs
-    The congruence system that will be recycled, adding its
-    congruences to the system of congruences of \p *this.
+  /*
+    The `y' bounded difference shape need be closed.
+    In fact if, for example, in `*this' we have the constraints:
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cgs are dimension-incompatible.
+    x1 - x2 <= 1;
+    x1      <= 3;
+    x2      <= 2;
 
-    \warning
-    The only assumption that can be made about \p cgs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+    in `y' the constraints are:
 
-  //! Adds the equalities in \p cs to \p *this, reducing the result.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+    x1 - x2 <= 0;
+    x2      <= 1;
 
-    \param cs
-    The constraint system that will be recycled, adding its
-    equalities to the system of congruences of \p *this.
+    without closure it returns "false", instead if we close `y' we have
+    the implicit constraint
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
+    x1      <= 1;
 
-    \warning
-    The only assumption that can be made about \p cs upon successful
-    or exceptional return is that it can be safely destroyed.
+    and so we obtain the right result "true".
   */
-  bool add_recycled_congruences_and_minimize(Constraint_System& cs);
+  y.shortest_path_closure_assign();
 
-  //! Adds constraint \p c to \p *this.
-  /*!
-    The addition can only affect \p *this if \p c is an equality.
+  // An empty shape is contained in any other dimension-compatible shapes.
+  if (y.marked_empty())
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p c are dimension-incompatible.
-  */
-  void add_constraint(const Constraint& c);
+  // `*this' contains `y' if and only if every cell of `dbm'
+  // is greater than or equal to the correspondent one of `y.dbm'.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; )
+      if (x_dbm_i[j] < y_dbm_i[j])
+        return false;
+  }
+  return true;
+}
 
-  //! Adds constraint \p c to \p *this, reducing the result.
-  /*!
-    The addition can only affect \p *this if \p c is an equality.
+template <typename T>
+bool
+BD_Shape<T>::is_disjoint_from(const BD_Shape& y) const {
+  const dimension_type space_dim = space_dimension();
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  // If one of the two bounded difference shape is empty,
+  // then the two bounded difference shape are disjoint.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return true;
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p c are dimension-incompatible.
-  */
-  bool add_constraint_and_minimize(const Constraint& c);
+  // Two BDSs are disjoint when their intersection is empty.
+  // That is if and only if there exists at least a bounded difference
+  // such that the upper bound of the bounded difference in the first
+  // BD_Shape is strictly less than the lower bound of
+  // the corresponding bounded difference in the second BD_Shape
+  // or vice versa.
+  // For example: let be
+  // in `*this':    -a_j_i <= v_j - v_i <= a_i_j;
+  // and in `y':    -b_j_i <= v_j - v_i <= b_i_j;
+  // `*this' and `y' are disjoint if
+  // 1.) a_i_j < -b_j_i or
+  // 2.) b_i_j < -a_j_i.
+  DIRTY_TEMP(N, tmp);
+  for (dimension_type i = space_dim+1; i-- > 0; ) {
+    const DB_Row<N>& x_i = dbm[i];
+    for (dimension_type j = space_dim+1; j-- > 0; ) {
+      neg_assign_r(tmp, y.dbm[j][i], ROUND_UP);
+      if (x_i[j] < tmp)
+        return true;
+    }
+  }
 
-  //! Adds copies of the equality constraints in \p cs to \p *this.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
-  */
-  void add_constraints(const Constraint_System& cs);
+  return false;
+}
 
-  /*! \brief
-    Adds copies of the equality constraints in \p cs to \p *this,
-    reducing the result.
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+  if (marked_empty())
+    return false;
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  const dimension_type space_dim = space_dimension();
+  // If the BDS is non-empty and zero-dimensional,
+  // then it is necessarily the universe BDS.
+  if (space_dim == 0)
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
-  */
-  bool add_constraints_and_minimize(const Constraint_System& cs);
+  // A bounded difference shape defining the universe BDS can only
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (!is_plus_infinity(dbm_i[j]))
+        return false;
+  }
+  return true;
+}
 
-  //! Adds the equality constraints in \p cs to \p *this.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
+template <typename T>
+bool
+BD_Shape<T>::is_bounded() const {
+  shortest_path_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  // A zero-dimensional or empty BDS is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
 
-    \warning
-    The only assumption that can be made about \p cs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  void add_recycled_constraints(Constraint_System& cs);
+  // A bounded difference shape defining the bounded BDS never can
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (i != j)
+        if (is_plus_infinity(dbm_i[j]))
+          return false;
+  }
 
-  /*! \brief
+  return true;
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+template <typename T>
+bool
+BD_Shape<T>::contains_integer_point() const {
+  // Force shortest-path closure.
+  if (is_empty())
+    return false;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
 
-    \warning
-    The only assumption that can be made about \p cs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+  // A non-empty BD_Shape defined by integer constraints
+  // necessarily contains an integer point.
+  if (std::numeric_limits<T>::is_integer)
+    return true;
 
-  /*! \brief
-    Adds a copy of the generators in \p gs to the system of generators
-    of \p *this.
+  // Build an integer BD_Shape z with bounds at least as tight as
+  // those in *this and then recheck for emptiness.
+  BD_Shape<mpz_class> bds_z(space_dim);
+  typedef BD_Shape<mpz_class>::N Z;
+  bds_z.reset_shortest_path_closed();
+  DIRTY_TEMP(N, tmp);
+  bool all_integers = true;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<Z>& z_i = bds_z.dbm[i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      const N& dbm_i_j = dbm_i[j];
+      if (is_plus_infinity(dbm_i_j))
+        continue;
+      if (is_integer(dbm_i_j))
+        assign_r(z_i[j], dbm_i_j, ROUND_NOT_NEEDED);
+      else {
+        all_integers = false;
+        Z& z_i_j = z_i[j];
+        // Copy dbm_i_j into z_i_j, but rounding downwards.
+        neg_assign_r(tmp, dbm_i_j, ROUND_NOT_NEEDED);
+        assign_r(z_i_j, tmp, ROUND_UP);
+        neg_assign_r(z_i_j, z_i_j, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  return all_integers || !bds_z.is_empty();
+}
 
-    \param gs
-    Contains the generators that will be added to the system of
-    generators of \p *this.
+template <typename T>
+bool
+BD_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // A polyhedron known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are dimension-incompatible, or if
-    \p *this is empty and the system of generators \p gs is not empty,
-    but has no points.
-  */
-  void add_generators(const Grid_Generator_System& gs);
+  // Check whether `var' is syntactically constrained.
+  const DB_Row<N>& dbm_v = dbm[var_space_dim];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    if (!is_plus_infinity(dbm_v[i])
+        || !is_plus_infinity(dbm[i][var_space_dim]))
+      return true;
+  }
 
-  /*! \brief
-    Adds the generators in \p gs to the system of generators of \p
-    *this.
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
 
-    \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+  assert(!marked_empty() && marked_shortest_path_closed());
+  assert(predecessor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `predecessor' is used to indicate which variable
+  // immediately precedes a given one in the corresponding equivalence class.
+  // The `leader' of an equivalence class is the element having minimum
+  // index: leaders are their own predecessors.
+  const dimension_type pred_size = dbm.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  predecessor.reserve(pred_size);
+  for (dimension_type i = 0; i < pred_size; ++i)
+    predecessor.push_back(i);
+  // Now compute actual predecessors.
+  for (dimension_type i = pred_size; i-- > 1; )
+    if (i == predecessor[i]) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i; j-- > 0; )
+        if (j == predecessor[j]
+            && is_additive_inverse(dbm[j][i], dbm_i[j])) {
+          // Choose as predecessor the variable having the smaller index.
+          predecessor[i] = j;
+          break;
+        }
+    }
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are dimension-incompatible, or if
-    \p *this is empty and the system of generators \p gs is not empty,
-    but has no points.
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+  assert(!marked_empty() && marked_shortest_path_closed());
+  assert(leaders.size() == 0);
+  // Compute predecessor information.
+  compute_predecessors(leaders);
+  // Flatten the predecessor chains so as to obtain leaders.
+  assert(leaders[0] == 0);
+  for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) {
+    const dimension_type l_i = leaders[i];
+    assert(l_i <= i);
+    if (l_i != i) {
+      const dimension_type ll_i = leaders[l_i];
+      assert(ll_i == leaders[ll_i]);
+      leaders[i] = ll_i;
+    }
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+  // If the BDS is empty, it is also reduced.
+  if (marked_empty())
+    return true;
 
-    \warning
-    The only assumption that can be made about \p gs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  void add_recycled_generators(Grid_Generator_System& gs);
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return true;
 
-  /*! \brief
-    Adds a copy of the generators in \p gs to the system of generators
-    of \p *this, reducing the result.
+  // A shortest-path reduced dbm is just a dbm with an indication of
+  // those constraints that are redundant. If there is no indication
+  // of the redundant constraints, then it cannot be reduced.
+  if (!marked_shortest_path_reduced())
+    return false;
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  const BD_Shape x_copy = *this;
+  x_copy.shortest_path_closure_assign();
+  // If we just discovered emptiness, it cannot be reduced.
+  if (x_copy.marked_empty())
+    return false;
 
-    \param gs
-    Contains the generators that will be added to the system of
-    generators of \p *this.
+  // The vector `leader' is used to indicate which variables are equivalent.
+  std::vector<dimension_type> leader(space_dim + 1);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
-    *this is empty and the system of generators \p gs is not empty,
-    but has no points.
-  */
-  bool add_generators_and_minimize(const Grid_Generator_System& gs);
+  // We store the leader.
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    leader[i] = i;
 
-  /*! \brief
-    Adds the generators in \p gs to the system of generators of \p
-    *this, reducing the result.
+  // Step 1: we store really the leader with the corrected value.
+  // We search for the equivalent or zero-equivalent variables.
+  // The variable(i-1) and variable(j-1) are equivalent if and only if
+  // m_i_j == -(m_j_i).
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    const DB_Row<N>& x_copy_dbm_i = x_copy.dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j)
+      if (is_additive_inverse(x_copy.dbm[j][i], x_copy_dbm_i[j]))
+        // Two equivalent variables have got the same leader
+        // (the smaller variable).
+        leader[j] = leader[i];
+  }
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  // Step 2: we check if there are redundant constraints in the zero_cycle
+  // free bounded difference shape, considering only the leaders.
+  // A constraint `c' is redundant, when there are two constraints such that
+  // their sum is the same constraint with the inhomogeneous term
+  // less than or equal to the `c' one.
+  DIRTY_TEMP(N, c);
+  for (dimension_type k = 0; k <= space_dim; ++k)
+    if (leader[k] == k) {
+      const DB_Row<N>& x_k = x_copy.dbm[k];
+      for (dimension_type i = 0; i <= space_dim; ++i)
+        if (leader[i] == i) {
+          const DB_Row<N>& x_i = x_copy.dbm[i];
+          const Bit_Row& redundancy_i = redundancy_dbm[i];
+          const N& x_i_k = x_i[k];
+          for (dimension_type j = 0; j <= space_dim; ++j)
+            if (leader[j] == j) {
+              const N& x_i_j = x_i[j];
+              if (!is_plus_infinity(x_i_j)) {
+                add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+                if (x_i_j >= c && !redundancy_i[j])
+                  return false;
+              }
+            }
+        }
+    }
 
-    \param gs
-    The generator system that will be recycled, adding its generators
-    to the system of generators of \p *this.
+  // The vector `var_conn' is used to check if there is a single cycle
+  // that connected all zero-equivalent variables between them.
+  // The value `space_dim + 1' is used to indicate that the equivalence
+  // class contains a single variable.
+  std::vector<dimension_type> var_conn(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    var_conn[i] = space_dim + 1;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
-    *this is empty and the system of generators \p gs is not empty,
-    but has no points.
+  // Step 3: we store really the `var_conn' with the right value, putting
+  // the variable with the selected variable is connected:
+  // we check the row of each variable:
+  // a- each leader could be connected with only zero-equivalent one,
+  // b- each no-leader with only another zero-equivalent one.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    // It count with how many variables the selected variable is
+    // connected.
+    dimension_type t = 0;
+    dimension_type ld_i = leader[i];
+    // Case a: leader.
+    if (ld_i == i) {
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        dimension_type ld_j = leader[j];
+        // Only the connectedness with equivalent variables
+        // is considered.
+        if (j != ld_j)
+          if (!redundancy_dbm[i][j]) {
+            if (t == 1)
+              // Two no-leaders couldn't connected with the same leader.
+              return false;
+            else
+              if (ld_j != i)
+                // The variables isn't in the same equivalence class.
+                return false;
+              else {
+                ++t;
+                var_conn[i] = j;
+              }
+          }
+      }
+    }
+    // Case b: no-leader.
+    else {
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        if (!redundancy_dbm[i][j]) {
+          dimension_type ld_j = leader[j];
+          if (ld_i != ld_j)
+            // The variables isn't in the same equivalence class.
+            return false;
+          else {
+            if (t == 1)
+              // Two variables couldn't connected with the same leader.
+              return false;
+            else {
+              ++t;
+              var_conn[i] = j;
+            }
+          }
+          // A no-leader must be connected with
+          // another variable.
+          if (t == 0)
+            return false;
+        }
+      }
+    }
+  }
 
-    \warning
-    The only assumption that can be made about \p gs upon successful
-    or exceptional return is that it can be safely destroyed.
-  */
-  bool add_recycled_generators_and_minimize(Grid_Generator_System& gs);
+  // The vector `just_checked' is used to check if
+  // a variable is already checked.
+  std::vector<bool> just_checked(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    just_checked[i] = false;
 
-  /*! \brief
-    Assigns to \p *this the intersection of \p *this and \p y.  The
-    result is not guaranteed to be reduced.
+  // Step 4: we check if there are single cycles that
+  // connected all the zero-equivalent variables between them.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    bool jc_i = just_checked[i];
+    // We do not re-check the already considered single cycles.
+    if (!jc_i) {
+      dimension_type v_con = var_conn[i];
+      // We consider only the equivalence classes with
+      // 2 or plus variables.
+      if (v_con != space_dim + 1) {
+        // There is a single cycle if taken a variable,
+        // we return to this same variable.
+        while (v_con != i) {
+          just_checked[v_con] = true;
+          v_con = var_conn[v_con];
+          // If we re-pass to an already considered variable,
+          // then we haven't a single cycle.
+          if (just_checked[v_con])
+            return false;
+        }
+      }
+    }
+    just_checked[i] = true;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void intersection_assign(const Grid& y);
+  // The system bounded differences is just reduced.
+  return true;
+}
 
-  /*! \brief
-    Assigns to \p *this the intersection of \p *this and \p y,
-    reducing the result.
+template <typename T>
+bool
+BD_Shape<T>::bounds(const Linear_Expression& expr,
+                    const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+  shortest_path_closure_assign();
+  // A zero-dimensional or empty BDS bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool intersection_assign_and_minimize(const Grid& y);
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = from_above ? expr <= 0 : expr >= 0;
+  const dimension_type c_space_dim = c.space_dimension();
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Check if `c' is a BD constraint.
+  if (extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) {
+    if (num_vars == 0)
+      // Dealing with a trivial constraint.
+      return true;
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    return !is_plus_infinity(x);
+  }
+  else {
+    // Not a DB constraint: use the MIP solver.
+    Optimization_Mode mode_bounds
+      = from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    // Problem is known to be feasible.
+    return (mip.solve() == OPTIMIZED_MIP_PROBLEM);
+  }
+}
 
-  /*! \brief
-    Assigns to \p *this the join of \p *this and \p y.
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void join_assign(const Grid& y);
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
 
-  /*! \brief
-    Assigns to \p *this the join of \p *this and \p y, reducing the
-    result.
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = maximize ? expr <= 0 : expr >= 0;
+  const dimension_type c_space_dim = c.space_dimension();
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Check if `c' is a BD constraint.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) {
+    Optimization_Mode mode_max_min
+      = maximize ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // Here `expr' is a bounded difference.
+    if (num_vars == 0) {
+      // Dealing with a trivial expression.
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    if (!is_plus_infinity(x)) {
+      // Compute the maximize/minimize of `expr'.
+      DIRTY_TEMP(N, d);
+      const Coefficient& b = expr.inhomogeneous_term();
+      TEMP_INTEGER(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of
+      // a variable in `expr'.
+      DIRTY_TEMP(N, coeff_expr);
+      const Coefficient& coeff_i = expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        TEMP_INTEGER(minus_coeff_i);
+        neg_assign(minus_coeff_i, coeff_i);
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      add_mul_assign_r(d, coeff_expr, x, ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool join_assign_and_minimize(const Grid& y);
+    // `expr' is unbounded.
+    return false;
+  }
+}
 
-  //! Same as join_assign(y).
-  void upper_bound_assign(const Grid& y);
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included,
+                     Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
 
-  /*! \brief
-    If the join of \p *this and \p y is exact it is assigned to \p
-    *this and <CODE>true</CODE> is returned, otherwise
-    <CODE>false</CODE> is returned.
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool join_assign_if_exact(const Grid& y);
+  Optimization_Mode mode_max_min
+    = maximize ? MAXIMIZATION : MINIMIZATION;
+  MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+  if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+    g = mip.optimizing_point();
+    mip.evaluate_objective_function(g, ext_n, ext_d);
+    included = true;
+    return true;
+  }
+  // Here `expr' is unbounded in `*this'.
+  return false;
+}
 
-  //! Same as join_assign_if_exact(y).
-  bool upper_bound_assign_if_exact(const Grid& y);
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  const dimension_type space_dim = space_dimension();
 
-  /*! \brief
-    Assigns to \p *this the \ref Grid_Difference "grid-difference" of
-    \p *this and \p y.
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
 
-    The grid difference between grids x and y is the smallest grid
-    containing all the points from x and y that are only in x.
+  // If the congruence is a bounded difference equality,
+  // find the relation with the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    TEMP_INTEGER(coeff);
+    if (extract_bounded_difference(c, cg_space_dim, num_vars,
+                                    i, j, coeff))
+      return relation_with(c);
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void grid_difference_assign(const Grid& y);
+  shortest_path_closure_assign();
 
-  //! Same as grid_difference_assign(y).
-  void difference_assign(const Grid& y);
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
 
-  /*! \brief
-    Assigns to \p *this the \ref Grid_Affine_Transformation
-    "affine image" of \p
-    *this under the function mapping variable \p var to the affine
-    expression specified by \p expr and \p denominator.
+  if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
 
-    \param var
-    The variable to which the affine expression is assigned;
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  TEMP_INTEGER(mod);
+  mod = cg.modulus();
+  Linear_Expression le;
+  for (dimension_type i = cg_space_dim; i-- > 0; )
+    le += cg.coefficient(Variable(i)) * Variable(i);
+  bool bounded_below = minimize(le, min_num, min_den, min_included);
+
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  TEMP_INTEGER(v);
+  TEMP_INTEGER(lower_num);
+  TEMP_INTEGER(lower_den);
+  TEMP_INTEGER(lower);
+  assign_r(lower_num, min_num, ROUND_NOT_NEEDED);
+  assign_r(lower_den, min_den, ROUND_NOT_NEEDED);
+  v -= cg.inhomogeneous_term();
+  lower = lower_num / lower_den;
+  v += ((lower / mod) * mod);
+  if (v * lower_den < lower_num)
+    v += mod;
+  const Constraint& c(le == v);
+  return relation_with(c);
+}
 
-    \param expr
-    The numerator of the affine expression;
 
-    \param denominator
-    The denominator of the affine expression (optional argument with
-    default value 1).
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of
-    \p *this.
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
 
-    \if Include_Implementation_Details
+  shortest_path_closure_assign();
 
-    When considering the generators of a grid, the
-    affine transformation
-    \f[
-      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
-    \f]
-    is assigned to \p var where \p expr is
-    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
-    (\f$b\f$ is the inhomogeneous term).
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
 
-    If congruences are up-to-date, it uses the specialized function
-    affine_preimage() (for the system of congruences)
-    and inverse transformation to reach the same result.
-    To obtain the inverse transformation we use the following observation.
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
 
-    Observation:
-    -# The affine transformation is invertible if the coefficient
-       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
-       is different from zero.
-    -# If the transformation is invertible, then we can write
-       \f[
-  	 \mathrm{denominator} * {x'}_\mathrm{var}
-	   = \sum_{i = 0}^{n - 1} a_i x_i + b
-	   = a_\mathrm{var} x_\mathrm{var}
-	     + \sum_{i \neq var} a_i x_i + b,
-       \f]
-       so that the inverse transformation is
-       \f[
-	 a_\mathrm{var} x_\mathrm{var}
-           = \mathrm{denominator} * {x'}_\mathrm{var}
-             - \sum_{i \neq j} a_i x_i - b.
-       \f]
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) {
+    // Constraints that are not bounded differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le;
+    for (dimension_type k = c_space_dim; k-- > 0; ) {
+      Variable vk(k);
+      le += c.coefficient(vk) * vk;
+    }
+    DIRTY_TEMP(Coefficient, max_num);
+    DIRTY_TEMP(Coefficient, max_den);
+    bool max_included;
+    DIRTY_TEMP(Coefficient, min_num);
+    DIRTY_TEMP(Coefficient, min_den);
+    bool min_included;
+    bool bounded_above = maximize(le, max_num, max_den, max_included);
+    bool bounded_below = minimize(le, min_num, min_den, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(min_num)) {
+      case 1:
+        if (c.is_equality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return  Poly_Con_Relation::strictly_intersects();
+        return  Poly_Con_Relation::is_included();
+      case -1:
+        return  Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_num += c.inhomogeneous_term() * max_den;
+      switch (sgn(max_num)) {
+      case 1:
+        return  Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_num += c.inhomogeneous_term() * max_den;
+      min_num += c.inhomogeneous_term() * min_den;
+      switch (sgn(max_num)) {
+      case 1:
+        switch (sgn(min_num)) {
+        case 1:
+          if (c.is_equality())
+            return  Poly_Con_Relation::is_disjoint();
+          return  Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return  Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::strictly_intersects();
+          return  Poly_Con_Relation::is_included();
+        case -1:
+          return  Poly_Con_Relation::strictly_intersects();
+        }
+     case 0:
+        if (min_num == 0) {
+          if (c.is_strict_inequality())
+            return  Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return  Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return  Poly_Con_Relation::is_disjoint();
+        return  Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return  Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
 
-    Then, if the transformation is invertible, all the entities that
-    were up-to-date remain up-to-date. Otherwise only generators remain
-    up-to-date.
+  // Constraints that are bounded differences.
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
 
-    \endif
-  */
-  void affine_image(Variable var,
-		    const Linear_Expression& expr,
-		    Coefficient_traits::const_reference denominator
-		    = Coefficient_one());
+  // Select the cell to be checked for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  const N& x = negative ? dbm[i][j] : dbm[j][i];
+  const N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+  // Deduce the relation/s of the constraint `c' of the form
+  // `coeff*v - coeff*u </<=/== c.inhomogeneous_term()'
+  // with the respectively constraints in `*this'
+  // `-y <= v - u <= x'.
+  // Let `d == c.inhomogeneous_term()/coeff'
+  // and `d1 == -c.inhomogeneous_term()/coeff'.
+  // The following variables of mpq_class type are used to be precise
+  // when the bds is defined by integer constraints.
+  DIRTY_TEMP0(mpq_class, q_x);
+  DIRTY_TEMP0(mpq_class, q_y);
+  DIRTY_TEMP0(mpq_class, d);
+  DIRTY_TEMP0(mpq_class, d1);
+  DIRTY_TEMP0(mpq_class, c_den);
+  DIRTY_TEMP0(mpq_class, q_den);
+  assign_r(c_den, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_den, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_den, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(x)) {
+    if (!is_plus_infinity(y)) {
+      // `*this' is in the following form:
+      // `-y <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+      // `y < d1' (`y <= d1' if c is a strict equality).
+      TEMP_INTEGER(numer);
+      TEMP_INTEGER(denom);
+      numer_denom(y, numer, denom);
+      assign_r(q_den, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
 
-  /*! \brief
-    Assigns to \p *this the \ref Grid_Affine_Transformation
-    "affine preimage" of
-    \p *this under the function mapping variable \p var to the affine
-    expression specified by \p expr and \p denominator.
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
 
-    \param var
-    The variable to which the affine expression is substituted;
+  // Here `x' is not plus-infinity.
+  TEMP_INTEGER(numer);
+  TEMP_INTEGER(denom);
+  numer_denom(x, numer, denom);
+  assign_r(q_den, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(y)) {
+    numer_denom(y, numer, denom);
+    assign_r(q_den, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_den, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+    // `y < d1' (`y <= d1' if c is a strict equality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
 
-    \param expr
-    The numerator of the affine expression;
+  // Here `y' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `x < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
 
-    \param denominator
-    The denominator of the affine expression (optional argument with
-    default value 1).
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
 
-    \if Include_Implementation_Details
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
 
-    When considering congruences of a grid, the affine transformation
-    \f[
-      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
-    \f]
-    is assigned to \p var where \p expr is
-    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
-    (\f$b\f$ is the inhomogeneous term).
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
 
-    If generators are up-to-date, then the specialized function
-    affine_image() is used (for the system of generators)
-    and inverse transformation to reach the same result.
-    To obtain the inverse transformation, we use the following observation.
+  shortest_path_closure_assign();
+  // The empty BDS cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
 
-    Observation:
-    -# The affine transformation is invertible if the coefficient
-       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
-       is different from zero.
-    -# If the transformation is invertible, then we can write
-       \f[
-  	 \mathrm{denominator} * {x'}_\mathrm{var}
-	   = \sum_{i = 0}^{n - 1} a_i x_i + b
-           = a_\mathrm{var} x_\mathrm{var}
-               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
-       \f],
-       the inverse transformation is
-       \f[
-	 a_\mathrm{var} x_\mathrm{var}
-           = \mathrm{denominator} * {x'}_\mathrm{var}
-               - \sum_{i \neq j} a_i x_i - b.
-       \f].
+  // A universe BDS in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
 
-    Then, if the transformation is invertible, all the entities that
-    were up-to-date remain up-to-date. Otherwise only congruences remain
-    up-to-date.
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
 
-    \endif
-  */
-  void affine_preimage(Variable var,
-		       const Linear_Expression& expr,
-		       Coefficient_traits::const_reference denominator
-		         = Coefficient_one());
+  // The relation between the BDS and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the BDS.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the BDS.
 
-  /*! \brief
-    Assigns to \p *this the image of \p *this with respect to
-    the \ref Grid_Generalized_Image "generalized affine relation"
-    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
-    \pmod{\mathrm{modulus}}\f$.
+  // Allocation of temporaries done once and for all.
+  TEMP_INTEGER(num);
+  TEMP_INTEGER(den);
+  TEMP_INTEGER(product);
+  // We find in `*this' all the constraints.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    const Coefficient& g_coeff_y = (i > g_space_dim || i == 0)
+      ? Coefficient(0) : g.coefficient(Variable(i-1));
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Coefficient& g_coeff_x = (j > g_space_dim)
+        ? Coefficient(0) : g.coefficient(Variable(j-1));
+      const N& dbm_ij = dbm_i[j];
+      const N& dbm_ji = dbm[j][i];
+      if (is_additive_inverse(dbm_ji, dbm_ij)) {
+        // We have one equality constraint: den*x - den*y = num.
+        // Compute the scalar product.
+        numer_denom(dbm_ij, num, den);
+        product = 0;
+        add_mul_assign(product, den, g_coeff_y);
+        add_mul_assign(product, -den, g_coeff_x);
+        if (!is_line_or_ray)
+          add_mul_assign(product, num, g.divisor());
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        // We have 0, 1 or 2 binary inequality constraint/s.
+        if (!is_plus_infinity(dbm_ij)) {
+          // We have the binary inequality constraint: den*x - den*y <= num.
+          // Compute the scalar product.
+          numer_denom(dbm_ij, num, den);
+          product = 0;
+          add_mul_assign(product, den, g_coeff_y);
+          add_mul_assign(product, -den, g_coeff_x);
+          if (!is_line_or_ray)
+            add_mul_assign(product, num, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+
+        if (!is_plus_infinity(dbm_ji)) {
+          // We have the binary inequality constraint: den*y - den*x <= b.
+          // Compute the scalar product.
+          numer_denom(dbm_ji, num, den);
+          product = 0;
+          add_mul_assign(product, den, g_coeff_x);
+          add_mul_assign(product, -den, g_coeff_y);
+          if (!is_line_or_ray)
+            add_mul_assign(product, num, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
 
-    \param var
-    The left hand side variable of the generalized affine relation;
+  // The generator satisfies all the constraints.
+  return Poly_Gen_Relation::subsumes();
+}
 
-    \param expr
-    The numerator of the right hand side affine expression;
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  // Zero-dimensional BDSs are necessarily shortest-path closed.
+  if (num_dimensions == 0)
+    return;
 
-    \param denominator
-    The denominator of the right hand side affine expression.
-    Optional argument with an automatic value of one;
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
 
-    \param modulus
-    The modulus of the congruence lhs %= rhs.  A modulus of zero
-    indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    assert(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of \p
-    *this.
-  */
-  void generalized_affine_image(Variable var,
-				const Linear_Expression& expr,
-				Coefficient_traits::const_reference denominator
-				= Coefficient_one(),
-				Coefficient_traits::const_reference modulus
-				= Coefficient_one());
+  DIRTY_TEMP(N, sum);
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    const DB_Row<N>& x_dbm_k = x.dbm[k];
+    for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+      DB_Row<N>& x_dbm_i = x.dbm[i];
+      const N& x_dbm_i_k = x_dbm_i[k];
+      if (!is_plus_infinity(x_dbm_i_k))
+        for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+          const N& x_dbm_k_j = x_dbm_k[j];
+          if (!is_plus_infinity(x_dbm_k_j)) {
+            // Rounding upward for correctness.
+            add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+            min_assign(x_dbm_i[j], sum);
+          }
+        }
+    }
+  }
+
+  // Check for emptiness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (sgn(x_dbm_hh) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      assert(sgn(x_dbm_hh) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
 
-  /*! \brief
-    Assigns to \p *this the preimage of \p *this with respect to the
-    \ref Grid_Generalized_Image "generalized affine relation"
-    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
-    \pmod{\mathrm{modulus}}\f$.
+  // The BDS is not empty and it is now shortest-path closed.
+  x.set_shortest_path_closed();
+}
 
-    \param var
-    The left hand side variable of the generalized affine relation;
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+  // Do something only if necessary.
+  if (marked_shortest_path_reduced())
+    return;
 
-    \param expr
-    The numerator of the right hand side affine expression;
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return;
 
-    \param denominator
-    The denominator of the right hand side affine expression.
-    Optional argument with an automatic value of one;
+  // First find the tightest constraints for this BDS.
+  shortest_path_closure_assign();
 
-    \param modulus
-    The modulus of the congruence lhs %= rhs.  A modulus of zero
-    indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this are
-    dimension-incompatible or if \p var is not a space dimension of \p
-    *this.
-  */
-  void generalized_affine_preimage(Variable var,
-				   const Linear_Expression& expr,
-				   Coefficient_traits::const_reference denominator
-				   = Coefficient_one(),
-				   Coefficient_traits::const_reference modulus
-				   = Coefficient_one());
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is shortest-path
+  // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+  std::vector<dimension_type> leaders;
+  compute_leader_indices(predecessor, leaders);
+  const dimension_type num_leaders = leaders.size();
 
-  /*! \brief
-    Assigns to \p *this the image of \p *this with respect to
-    the \ref Grid_Generalized_Image "generalized affine relation"
-    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+  Bit_Matrix redundancy(space_dim + 1, space_dim + 1);
+  // Init all constraints to be redundant.
+  // TODO: provide an appropriate method to set multiple bits.
+  Bit_Row& red_0 = redundancy[0];
+  for (dimension_type j = space_dim + 1; j-- > 0; )
+    red_0.set(j);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    redundancy[i] = red_0;
 
-    \param lhs
-    The left hand side affine expression.
+  // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+  // subsystem of bounded differences having only leaders as variables.
+  DIRTY_TEMP(N, c);
+  for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leaders[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    Bit_Row& redundancy_i = redundancy[i];
+    for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leaders[l_j];
+      if (redundancy_i[j]) {
+        const N& dbm_i_j = dbm_i[j];
+        redundancy_i.clear(j);
+        for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+          const dimension_type k = leaders[l_k];
+          add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+          if (dbm_i_j >= c) {
+            redundancy_i.set(j);
+            break;
+          }
+        }
+      }
+    }
+  }
 
-    \param rhs
-    The right hand side affine expression.
+  // Step 3: flag non-redundant constraints in zero-equivalence classes.
+  // Each equivalence class must have a single 0-cycle connecting
+  // all the equivalent variables in increasing order.
+  std::deque<bool> dealt_with(space_dim + 1, false);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    // We only need to deal with non-singleton zero-equivalence classes
+    // that haven't already been dealt with.
+    if (i != predecessor[i] && !dealt_with[i]) {
+      dimension_type j = i;
+      while (true) {
+        const dimension_type pred_j = predecessor[j];
+        if (j == pred_j) {
+          // We finally found the leader of `i'.
+          assert(redundancy[i][j]);
+          redundancy[i].clear(j);
+          // Here we dealt with `j' (i.e., `pred_j'), but it is useless
+          // to update `dealt_with' because `j' is a leader.
+          break;
+        }
+        // We haven't found the leader of `i' yet.
+        assert(redundancy[pred_j][j]);
+        redundancy[pred_j].clear(j);
+        dealt_with[pred_j] = true;
+        j = pred_j;
+      }
+    }
 
-    \param modulus
-    The modulus of the congruence lhs %= rhs.  A modulus of zero
-    indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+  // Even though shortest-path reduction is not going to change the BDS,
+  // it might change its internal representation.
+  BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+  std::swap(x.redundancy_dbm, redundancy);
+  x.set_shortest_path_reduced();
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p lhs or \p
-    rhs.
-  */
-  void generalized_affine_image(const Linear_Expression& lhs,
-				const Linear_Expression& rhs,
-				Coefficient_traits::const_reference modulus
-				= Coefficient_one());
+  assert(is_shortest_path_reduced());
+}
 
-  /*! \brief
-    Assigns to \p *this the preimage of \p *this with respect to the
-    \ref Grid_Generalized_Image "generalized affine relation"
-    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+template <typename T>
+void
+BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
 
-    \param lhs
-    The left hand side affine expression;
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("bds_hull_assign(y)", y);
 
-    \param rhs
-    The right hand side affine expression;
+  // The poly-hull of a polyhedron `bd' with an empty polyhedron is `bd'.
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
 
-    \param modulus
-    The modulus of the congruence lhs %= rhs.  A modulus of zero
-    indicates lhs == rhs.  Optional argument with an automatic value
-    of one.
+  // The bds-hull consists in constructing `*this' with the maximum
+  // elements selected from `*this' and `y'.
+  assert(space_dim == 0 || marked_shortest_path_closed());
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij < y_dbm_ij)
+        dbm_ij = y_dbm_ij;
+    }
+  }
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  assert(OK());
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p lhs or \p
-    rhs.
-  */
-  void generalized_affine_preimage(const Linear_Expression& lhs,
-				   const Linear_Expression& rhs,
-				   Coefficient_traits::const_reference modulus
-				   = Coefficient_one());
+template <typename T>
+void
+BD_Shape<T>::bds_difference_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
 
-  /*! \brief
-    Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
-    "time-elapse" between \p *this and \p y.
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("bds_difference_assign(y)", y);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void time_elapse_assign(const Grid& y);
+  BD_Shape new_bd_shape(space_dim, EMPTY);
 
-  //! Assigns to \p *this its topological closure.
-  void topological_closure_assign();
+  BD_Shape& x = *this;
 
-  /*! \brief
-    Assigns to \p *this the result of computing the \ref Grid_Widening
-    "Grid widening" between \p *this and \p y.
+  x.shortest_path_closure_assign();
+  // The difference of an empty bounded difference shape
+  // and of a bounded difference shape `p' is empty.
+  if (x.marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // The difference of a bounded difference shape `p'
+  // and an empty bounded difference shape is `p'.
+  if (y.marked_empty())
+    return;
 
-    \param y
-    A grid that <EM>must</EM> be contained in \p *this;
+  // If both bounded difference shapes are zero-dimensional,
+  // then at this point they are necessarily universe system of
+  // bounded differences, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void widening_assign(const Grid& y, unsigned* tp = NULL);
+  // We take a constraint of the system y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementaries with the system x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the bounded difference shape `x' is included
+    // in the bounded difference shape defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty bounded difference shape,
+    // and as we would obtain a result that is less precise
+    // than the bds-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    BD_Shape z = x;
+    const Linear_Expression e = Linear_Expression(c);
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_bd_shape.bds_hull_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_bd_shape.bds_hull_assign(z);
+    }
+  }
+  *this = new_bd_shape;
+  assert(OK());
+}
 
-  /*! \brief
-    Improves the result of the \ref Grid_Widening "Grid widening"
-    computation by also enforcing those congruences in \p cgs that are
-    satisfied by all the points of \p *this.
+template <typename T>
+bool
+BD_Shape<T>::simplify_using_context_assign(const BD_Shape& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
 
-    \param y
-    A grid that <EM>must</EM> be contained in \p *this;
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
 
-    \param cgs
-    The system of congruences used to improve the widened grid;
+  const dimension_type space_dim = space_dimension();
+  const dimension_type new_space_dim = space_dim + m;
+  const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+  // To embed an n-dimension space BDS in a (n+m)-dimension space,
+  // we just add `m' rows and columns in the bounded difference shape,
+  // initialized to PLUS_INFINITY.
+  dbm.grow(new_space_dim + 1);
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
-  */
-  void limited_extrapolation_assign(const Grid& y,
-				    const Congruence_System& cgs,
-				    unsigned* tp = NULL);
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
 
-  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+  // If `*this' was the zero-dim space universe BDS,
+  // the we can set the shortest-path closure flag.
+  if (was_zero_dim_univ)
+    set_shortest_path_closed();
 
-  //! \name Member Functions that May Modify the Dimension of the Vector Space
-  //@{
+  assert(OK());
+}
 
-  /*! \brief
-    Adds \p m new space dimensions and embeds the old grid in the new
-    vector space.
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
 
-    \param m
-    The number of dimensions to add.
+  const dimension_type space_dim = space_dimension();
 
-    \exception std::length_error
-    Thrown if adding \p m new space dimensions would cause the vector
-    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  // If `*this' was zero-dimensional, then we add `m' rows and columns.
+  // If it also was non-empty, then we zero all the added elements
+  // and set the flag for shortest-path closure.
+  if (space_dim == 0) {
+    dbm.grow(m + 1);
+    if (!marked_empty()) {
+      for (dimension_type i = m + 1; i-- > 0; ) {
+        DB_Row<N>& dbm_i = dbm[i];
+        for (dimension_type j = m + 1; j-- > 0; )
+          if (i != j)
+            assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+      }
+      set_shortest_path_closed();
+    }
+    assert(OK());
+    return;
+  }
 
-    The new space dimensions will be those having the highest indexes
-    in the new grid, which is characterized by a system of congruences
-    in which the variables which are the new dimensions can have any
-    value.  For instance, when starting from the grid \f$\cL \sseq
-    \Rset^2\f$ and adding a third space dimension, the result will be
-    the grid
-    \f[
-      \bigl\{\,
-        (x, y, z)^\transpose \in \Rset^3
-      \bigm|
-        (x, y)^\transpose \in \cL
-      \,\bigr\}.
-    \f]
-  */
-  void add_space_dimensions_and_embed(dimension_type m);
+  // To project an n-dimension space bounded difference shape
+  // in a (n+m)-dimension space, we add `m' rows and columns.
+  // In the first row and column of the matrix we add `zero' from
+  // the (n+1)-th position to the end.
+  const dimension_type new_space_dim = space_dim + m;
+  dbm.grow(new_space_dim + 1);
 
-  /*! \brief
-    Adds \p m new space dimensions to the grid and does not embed it
-    in the new vector space.
+  // Bottom of the matrix and first row.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+    assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+    assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+  }
 
-    \param m
-    The number of space dimensions to add.
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
 
-    \exception std::length_error
-    Thrown if adding \p m new space dimensions would cause the
-    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a BDS in a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
 
-    The new space dimensions will be those having the highest indexes
-    in the new grid, which is characterized by a system of congruences
-    in which the variables running through the new dimensions are all
-    constrained to be equal to 0.  For instance, when starting from
-    the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
-    dimension, the result will be the grid
-    \f[
-      \bigl\{\,
-        (x, y, 0)^\transpose \in \Rset^3
-      \bigm|
-        (x, y)^\transpose \in \cL
-      \,\bigr\}.
-    \f]
-  */
-  void add_space_dimensions_and_project(dimension_type m);
+  const dimension_type old_space_dim = space_dimension();
 
-  /*! \brief
-    Assigns to \p *this the \ref Grid_Concatenate "concatenation" of
-    \p *this and \p y, taken in this order.
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_removed.space_dimension();
+  if (old_space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
 
-    \exception std::length_error
-    Thrown if the concatenation would cause the vector space
-    to exceed dimension <CODE>max_space_dimension()</CODE>.
-  */
-  void concatenate_assign(const Grid& y);
+  // Shortest-path closure is necessary to keep precision.
+  shortest_path_closure_assign();
 
-  //! Removes all the specified dimensions from the vector space.
-  /*!
-    \param to_be_removed
-    The set of Variable objects corresponding to the space dimensions
-    to be removed.
+  // When removing _all_ dimensions from a BDS, we obtain the
+  // zero-dimensional BDS.
+  const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
+  if (new_space_dim == 0) {
+    dbm.resize_no_copy(1);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    assert(OK());
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with one of the
-    Variable objects contained in \p to_be_removed.
-  */
-  void remove_space_dimensions(const Variables_Set& to_be_removed);
+  // Handle the case of an empty BD_Shape.
+  if (marked_empty()) {
+    dbm.resize_no_copy(new_space_dim + 1);
+    assert(OK());
+    return;
+  }
 
-  /*! \brief
-    Removes the higher dimensions of the vector space so that the
-    resulting space will have dimension \p new_dimension.
+  // Shortest-path closure is maintained.
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
 
-    \exception std::invalid_argument
-    Thrown if \p new_dimensions is greater than the space dimension of
-    \p *this.
-  */
-  void remove_higher_space_dimensions(dimension_type new_dimension);
+  // For each variable to remove, we fill the corresponding column and
+  // row by shifting respectively left and above those
+  // columns and rows, that will not be removed.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst = *tbr + 1;
+  dimension_type src = dst + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    const dimension_type tbr_next = *tbr + 1;
+    // All other columns and rows are moved respectively to the left
+    // and above.
+    while (src < tbr_next) {
+      std::swap(dbm[dst], dbm[src]);
+      for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+        DB_Row<N>& dbm_i = dbm[i];
+        assign_or_swap(dbm_i[dst], dbm_i[src]);
+      }
+      ++dst;
+      ++src;
+    }
+    ++src;
+  }
 
-  /*! \brief
-    Remaps the dimensions of the vector space according to
-    a \ref Grid_Map_Space_Dimensions "partial function".
+  // Moving the remaining rows and columns.
+  while (src <= old_space_dim) {
+    std::swap(dbm[dst], dbm[src]);
+    for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+      DB_Row<N>& dbm_i = dbm[i];
+      assign_or_swap(dbm_i[dst], dbm_i[src]);
+    }
+    ++src;
+    ++dst;
+  }
 
-    If \p pfunc maps only some of the dimensions of \p *this then the
-    rest will be projected away.
+  // Update the space dimension.
+  dbm.resize_no_copy(new_space_dim + 1);
+  assert(OK());
+}
 
-    If the highest dimension mapped to by \p pfunc is higher than the
-    highest dimension in \p *this then the number of dimensions in \p
-    *this will be increased to the highest dimension mapped to by \p
-    pfunc.
+template <typename T>
+template <typename Partial_Function>
+void
+BD_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  // TODO: this implementation is just an executable specification.
+  if (space_dim == 0)
+    return;
 
-    \param pfunc
-    The partial function specifying the destiny of each space
-    dimension.
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the BDS becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
 
-    The template class Partial_Function must provide the following
-    methods.
-    \code
-      bool has_empty_codomain() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the represented partial
-    function has an empty codomain (i.e., it is always undefined).
-    The <CODE>has_empty_codomain()</CODE> method will always be called
-    before the methods below.  However, if
-    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
-    of the functions below will be called.
-    \code
-      dimension_type max_in_codomain() const
-    \endcode
-    returns the maximum value that belongs to the codomain of the
-    partial function.
-    The <CODE>max_in_codomain()</CODE> method is called at most once.
-    \code
-      bool maps(dimension_type i, dimension_type& j) const
-    \endcode
-    Let \f$f\f$ be the represented function and \f$k\f$ be the value
-    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
-    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
-    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
-    This method is called at most \f$n\f$ times, where \f$n\f$ is the
-    dimension of the vector space enclosing the grid.
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    shortest_path_closure_assign();
 
-    The result is undefined if \p pfunc does not encode a partial
-    function with the properties described in the
-    \ref Grid_Map_Space_Dimensions "specification of the mapping operator".
-  */
-  template <typename Partial_Function>
-  void map_space_dimensions(const Partial_Function& pfunc);
+  // If the BDS is empty, then it is sufficient to adjust the
+  // space dimension of the bounded difference shape.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // We create a new matrix with the new space dimension.
+  DB_Matrix<N> x(new_space_dim+1);
+  // First of all we must map the unary constraints, because
+  // there is the fictitious variable `zero', that can't be mapped
+  // at all.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& x_0 = x[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    dimension_type new_j;
+    if (pfunc.maps(j - 1, new_j)) {
+      assign_or_swap(x_0[new_j + 1], dbm_0[j]);
+      assign_or_swap(x[new_j + 1][0], dbm[j][0]);
+    }
+  }
+  // Now we map the binary constraints, exchanging the indexes.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i - 1, new_i)) {
+      DB_Row<N>& dbm_i = dbm[i];
+      ++new_i;
+      DB_Row<N>& x_new_i = x[new_i];
+      for (dimension_type j = i+1; j <= space_dim; ++j) {
+        dimension_type new_j;
+        if (pfunc.maps(j - 1, new_j)) {
+          ++new_j;
+          assign_or_swap(x_new_i[new_j], dbm_i[j]);
+          assign_or_swap(x[new_j][new_i], dbm[j][i]);
+        }
+      }
+    }
+  }
 
-  //! Creates \p m copies of the space dimension corresponding to \p var.
-  /*!
-    \param var
-    The variable corresponding to the space dimension to be replicated;
+  std::swap(dbm, x);
+  assert(OK());
+}
 
-    \param m
-    The number of replicas to be created.
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
 
-    \exception std::invalid_argument
-    Thrown if \p var does not correspond to a dimension of the vector
-    space.
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("intersection_assign(y)", y);
 
-    \exception std::length_error
-    Thrown if adding \p m new space dimensions would cause the vector
-    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  // If one of the two bounded difference shapes is empty,
+  // the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
 
-    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
-    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
-    then the \f$k\f$-th space dimension is
-    \ref Grid_Expand_Space_Dimension "expanded" to \p m new space dimensions
-    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
-  */
-  void expand_space_dimension(Variable var, dimension_type m);
+  // If both bounded difference shapes are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
 
-  //! Folds the space dimensions in \p to_be_folded into \p var.
-  /*!
-    \param to_be_folded
-    The set of Variable objects corresponding to the space dimensions
-    to be folded;
+  // To intersect two bounded difference shapes we compare
+  // the constraints and we choose the less values.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij > y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
+      }
+    }
+  }
 
-    \param var
-    The variable corresponding to the space dimension that is the
-    destination of the folding operation.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p var or with
-    one of the Variable objects contained in \p to_be_folded.  Also
-    thrown if \p var is contained in \p to_be_folded.
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+                                       Iterator first, Iterator last,
+                                       unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
 
-    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
-    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
-    \p to_be_folded is a set of variables whose maximum space dimension
-    is also less than or equal to \f$n\f$, and \p var is not a member
-    of \p to_be_folded, then the space dimensions corresponding to
-    variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded"
-    into the \f$k\f$-th space dimension.
-  */
-  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
 
-  //@} // Member Functions that May Modify the Dimension of the Vector Space
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-  friend bool Parma_Polyhedra_Library::operator==(const Grid& x,
-						  const Grid& y);
+  // If both bounded difference shapes are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
 
-  friend class Parma_Polyhedra_Library::Grid_Certificate;
+  shortest_path_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
 
-  //! \name Miscellaneous Member Functions
-  //@{
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
 
-  //! Destructor.
-  ~Grid();
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (y_dbm_ij < dbm_ij) {
+        Iterator k = std::lower_bound(first, last, dbm_ij);
+        if (k != last) {
+          if (dbm_ij < *k)
+            assign_r(dbm_ij, *k, ROUND_UP);
+        }
+        else
+          assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  reset_shortest_path_closed();
+  assert(OK());
+}
 
-  /*! \brief
-    Swaps \p *this with grid \p y.  (\p *this and \p y can be
-    dimension-incompatible.)
-  */
-  void swap(Grid& y);
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+                                BD_Shape& limiting_shape) const {
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  assert(cs_space_dim <= space_dimension());
 
-  PPL_OUTPUT_DECLARATIONS;
+  shortest_path_closure_assign();
+  bool changed = false;
+  TEMP_INTEGER(coeff);
+  TEMP_INTEGER(minus_c_term);
+  DIRTY_TEMP(N, d);
+  DIRTY_TEMP(N, d1);
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not bounded differences are ignored.
+    if (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) {
+      // Select the cell to be modified for the "<=" part of the constraint,
+      // and set `coeff' to the absolute value of itself.
+      const bool negative = (coeff < 0);
+      const N& x = negative ? dbm[i][j] : dbm[j][i];
+      const N& y = negative ? dbm[j][i] : dbm[i][j];
+      DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+      N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+      N& ls_y = negative ? ls_dbm[j][i] : ls_dbm[i][j];
+      if (negative)
+        neg_assign(coeff);
+      // Compute the bound for `x', rounding towards plus infinity.
+      div_round_up(d, c.inhomogeneous_term(), coeff);
+      if (x <= d) {
+        if (c.is_inequality()) {
+          if (ls_x > d) {
+            ls_x = d;
+            changed = true;
+          }
+	}
+        else {
+          // Compute the bound for `y', rounding towards plus infinity.
+          neg_assign(minus_c_term, c.inhomogeneous_term());
+          div_round_up(d1, minus_c_term, coeff);
+          if (y <= d1)
+	    if((ls_x >= d && ls_y > d1) || (ls_x > d && ls_y >= d1)) {
+	      ls_x = d;
+	      ls_y = d1;
+	      changed = true;
+          }
+        }
+      }
+    }
+  }
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by
-    \ref ascii_dump) and sets \p *this accordingly.
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure of the bounded difference shape.
+  if (changed && limiting_shape.marked_shortest_path_closed())
+    limiting_shape.reset_shortest_path_closed();
+}
 
-     \return
-     <CODE>true</CODE> if successful, else <CODE>false</CODE>.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+                                               const Constraint_System& cs,
+                                               unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
 
-  //! Returns the total size in bytes of the memory occupied by \p *this.
-  memory_size_type total_memory_in_bytes() const;
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
 
-  //! Returns the size in bytes of the memory managed by \p *this.
-  memory_size_type external_memory_in_bytes() const;
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
 
-  //@} // Miscellaneous Member Functions
+  // The limited CC76-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
 
-private:
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-  //! The system of congruences.
-  Congruence_System con_sys;
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
 
-  //! The system of generators.
-  Grid_Generator_System gen_sys;
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_shape);
+}
 
-#define PPL_IN_Grid_CLASS
-// Automatically generated from PPL source file ../src/Grid_Status.idefs.hh line 1
-/* Grid::Status class declaration.
-*/
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
 
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
 
-#ifndef PPL_IN_Grid_CLASS
-#error "Do not include Grid_Status.idefs.hh directly; use Grid.defs.hh instead."
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
 #endif
 
-//! A conjunctive assertion about a grid.
-/*!
-  The assertions supported that are in use are:
-  - <EM>zero-dim universe</EM>: the grid is the zero-dimension
-    vector space \f$\Rset^0 = \{\cdot\}\f$;
-  - <EM>empty</EM>: the grid is the empty set;
-  - <EM>congruences up-to-date</EM>: the grid is correctly
-    characterized by the attached system of congruences, modulo the
-    processing of pending generators;
-  - <EM>generators up-to-date</EM>: the grid is correctly
-    characterized by the attached system of generators, modulo the
-    processing of pending congruences;
-  - <EM>congruences minimized</EM>: the non-pending part of the system
-    of congruences attached to the grid is in minimal form;
-  - <EM>generators minimized</EM>: the non-pending part of the system
-    of generators attached to the grid is in minimal form.
-
-  Other supported assertions are:
-  - <EM>congruences pending</EM>
-  - <EM>generators pending</EM>
-  - <EM>congruences' saturation matrix up-to-date</EM>
-  - <EM>generators' saturation matrix up-to-date</EM>.
-
-  Not all the conjunctions of these elementary assertions constitute
-  a legal Status.  In fact:
-  - <EM>zero-dim universe</EM> excludes any other assertion;
-  - <EM>empty</EM>: excludes any other assertion;
-  - <EM>congruences pending</EM> and <EM>generators pending</EM>
-    are mutually exclusive;
-  - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
-    and <EM>generators minimized</EM>;
-  - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
-    and <EM>generators minimized</EM>;
-  - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
-  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
-  - <EM>congruences' saturation matrix up-to-date</EM> implies both
-    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
-  - <EM>generators' saturation matrix up-to-date</EM> implies both
-    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
-*/
-class Status {
-public:
-  //! By default Status is the <EM>zero-dim universe</EM> assertion.
-  Status();
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
 
-  //! \name Test, remove or add an individual assertion from the conjunction
-  //@{
-  bool test_zero_dim_univ() const;
-  void reset_zero_dim_univ();
-  void set_zero_dim_univ();
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  assert(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
 
-  bool test_empty() const;
-  void reset_empty();
-  void set_empty();
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
 
-  bool test_c_up_to_date() const;
-  void reset_c_up_to_date();
-  void set_c_up_to_date();
+  // Here no token is available.
+  assert(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+  // Minimize `y'.
+  y.shortest_path_reduction_assign();
 
-  bool test_g_up_to_date() const;
-  void reset_g_up_to_date();
-  void set_g_up_to_date();
+  // Extrapolate unstable bounds, taking into account redundancy in `y'.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    const Bit_Row& y_redundancy_i = y.redundancy_dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+      if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+        assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+  // NOTE: this will also reset the shortest-path reduction flag,
+  // even though the dbm is still in reduced form. However, the
+  // current implementation invariant requires that any reduced dbm
+  // is closed too.
+  reset_shortest_path_closed();
+  assert(OK());
+}
 
-  bool test_c_minimized() const;
-  void reset_c_minimized();
-  void set_c_minimized();
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+                                                 const Constraint_System& cs,
+                                                 unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+                                  "(y, cs)");
 
-  bool test_g_minimized() const;
-  void reset_g_minimized();
-  void set_g_minimized();
+  // Strict inequalities are not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+                                  "(y, cs)");
 
-  bool test_sat_c_up_to_date() const;
-  void reset_sat_c_up_to_date();
-  void set_sat_c_up_to_date();
+  // The limited BHMZ05-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
 
-  bool test_sat_g_up_to_date() const;
-  void reset_sat_g_up_to_date();
-  void set_sat_g_up_to_date();
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
 
-  bool test_c_pending() const;
-  void reset_c_pending();
-  void set_c_pending();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
 
-  bool test_g_pending() const;
-  void reset_g_pending();
-  void set_g_pending();
-  //@} // Test, remove or add an individual assertion from the conjunction
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_shape);
+}
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
 
-  PPL_OUTPUT_DECLARATIONS;
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
 
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns
-    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-  bool ascii_load(std::istream& s);
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
 
-private:
-  //! Status is implemented by means of a finite bitset.
-  typedef unsigned int flags_t;
+  // If both bounded difference shapes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
 
-  //! \name Bitmasks for the individual assertions
-  //@{
-  static const flags_t ZERO_DIM_UNIV    = 0U;
-  static const flags_t EMPTY            = 1U << 0;
-  static const flags_t C_UP_TO_DATE     = 1U << 1;
-  static const flags_t G_UP_TO_DATE     = 1U << 2;
-  static const flags_t C_MINIMIZED      = 1U << 3;
-  static const flags_t G_MINIMIZED      = 1U << 4;
-  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
-  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
-  static const flags_t CS_PENDING       = 1U << 7;
-  static const flags_t GS_PENDING       = 1U << 8;
-  //@} // Bitmasks for the individual assertions
+  y.shortest_path_closure_assign();
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
 
-  //! This holds the current bitset.
-  flags_t flags;
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (!is_plus_infinity(dbm_ij)
+          && !is_plus_infinity(y_dbm_ij)
+          && dbm_ij != y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
+      }
+    }
+  }
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
+}
 
-  //! Construct from a bitmask.
-  Status(flags_t mask);
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_den,
+                          const N& ub_v) {
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(ub_v));
+  // Deduce constraints of the form `v - u', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+  // played an active role in the computation of the upper bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/den' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `v - u <= ub_v - ub_u';
+  // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP(N, up_approx);
+  // No need to consider indices greater than `last_v'.
+  for (dimension_type u = last_v; u > 0; --u)
+    if (u != v) {
+      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+      if (expr_u > 0) {
+        if (expr_u >= sc_den)
+          // Deducing `v - u <= ub_v - ub_u'.
+          sub_assign_r(dbm[u][v], ub_v, dbm_0[u], ROUND_UP);
+        else {
+          DB_Row<N>& dbm_u = dbm[u];
+          const N& dbm_u0 = dbm_u[0];
+          if (!is_plus_infinity(dbm_u0)) {
+            // Let `ub_u' and `lb_u' be the known upper and lower bound
+            // for `u', respectively. Letting `q = expr_u/sc_den' be the
+            // rational coefficient of `u' in `sc_expr/sc_den',
+            // the upper bound for `v - u' is computed as
+            // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+            // `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+            assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+            assign_r(q, expr_u, ROUND_NOT_NEEDED);
+            div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+            assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED);
+            // Compute `ub_u - lb_u'.
+            add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+            // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+            sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+            assign_r(up_approx, minus_lb_u, ROUND_UP);
+            // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+            add_assign_r(dbm_u[v], ub_v, up_approx, ROUND_UP);
+          }
+        }
+      }
+    }
+}
 
-  //! Check whether <EM>all</EM> bits in \p mask are set.
-  bool test_all(flags_t mask) const;
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_den,
+                          const N& minus_lb_v) {
+  assert(sc_den > 0);
+  assert(!is_plus_infinity(minus_lb_v));
+  // Deduce constraints of the form `u - v', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+  // played an active role in the computation of the lower bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/den' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `u - v <= lb_u - lb_v';
+  // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+  DIRTY_TEMP0(mpq_class, mpq_sc_den);
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP0(mpq_class, ub_u);
+  DIRTY_TEMP0(mpq_class, q);
+  DIRTY_TEMP0(mpq_class, minus_lb_u);
+  DIRTY_TEMP(N, up_approx);
+  // No need to consider indices greater than `last_v'.
+  for (dimension_type u = last_v; u > 0; --u)
+    if (u != v) {
+      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+      if (expr_u > 0) {
+        if (expr_u >= sc_den)
+          // Deducing `u - v <= lb_u - lb_v',
+          // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+          sub_assign_r(dbm_v[u], minus_lb_v, dbm[u][0], ROUND_UP);
+        else {
+          const N& dbm_0u = dbm_0[u];
+          if (!is_plus_infinity(dbm_0u)) {
+            // Let `ub_u' and `lb_u' be the known upper and lower bound
+            // for `u', respectively. Letting `q = expr_u/sc_den' be the
+            // rational coefficient of `u' in `sc_expr/sc_den',
+            // the upper bound for `u - v' is computed as
+            // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+            // `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+            assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+            assign_r(q, expr_u, ROUND_NOT_NEEDED);
+            div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+            assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED);
+            // Compute `ub_u - lb_u'.
+            add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+            // Compute `ub_u - q * (ub_u - lb_u)'.
+            sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+            assign_r(up_approx, ub_u, ROUND_UP);
+            // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+            add_assign_r(dbm_v[u], up_approx, minus_lb_v, ROUND_UP);
+          }
+        }
+      }
+    }
+}
 
-  //! Check whether <EM>at least one</EM> bit in \p mask is set.
-  bool test_any(flags_t mask) const;
+template <typename T>
+void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
 
-  //! Set the bits in \p mask.
-  void set(flags_t mask);
+template <typename T>
+void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
 
-  //! Reset the bits in \p mask.
-  void reset(flags_t mask);
-};
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type dim = var.id();
+  if (space_dimension() < dim)
+    throw_dimension_incompatible("unconstrain(var)", dim);
 
-// Automatically generated from PPL source file ../src/Grid.defs.hh line 1959
-#undef PPL_IN_Grid_CLASS
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
 
-  //! The status flags to keep track of the grid's internal state.
-  Status status;
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
 
-  //! The number of dimensions of the enclosing vector space.
-  dimension_type space_dim;
+  forget_all_dbm_constraints(dim+1);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  assert(OK());
+}
 
-  enum Dimension_Kind {
-    PARAMETER,
-    LINE,
-    GEN_VIRTUAL,
-    PROPER_CONGRUENCE = PARAMETER,
-    CON_VIRTUAL = LINE,
-    EQUALITY = GEN_VIRTUAL
-  };
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
 
-  typedef std::vector<Dimension_Kind> Dimension_Kinds;
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
 
-  // The type of row associated with each dimension.  If the virtual
-  // rows existed then the reduced systems would be square and upper
-  // or lower triangular, and the rows in each would have the types
-  // given in this vector.  As the congruence system is reduced to an
-  // upside-down lower triangular form the ordering of the congruence
-  // types is last to first.
-  Dimension_Kinds dim_kinds;
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
 
-  //! Builds a grid from a system of congruences.
-  /*!
-    The grid inherits the space dimension of the congruence system.
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
 
-    \param cgs
-    The system of congruences defining the grid.
-  */
-  void construct(const Congruence_System& cgs);
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu)
+    forget_all_dbm_constraints(*tbu + 1);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  assert(OK());
+}
 
-  //! Builds a grid from a system of generators.
-  /*!
-    The grid inherits the space dimension of the generator system.
+template <typename T>
+void
+BD_Shape<T>::refine(const Variable var,
+                    const Relation_Symbol relsym,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator) {
+  assert(denominator != 0);
+  const dimension_type expr_space_dim = expr.space_dimension();
+  assert(space_dimension() >= expr_space_dim);
+  const dimension_type v = var.id() + 1;
+  assert(v <= space_dimension());
+  assert(expr.coefficient(var) == 0);
+  assert(relsym != LESS_THAN && relsym != GREATER_THAN);
 
-    \param gs
-    The system of generators defining the grid;
-  */
-  void construct(const Grid_Generator_System& gs);
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
 
-  //! \name Private Verifiers: Verify if Individual Flags are Set
-  //@{
+  // Since we are only able to record bounded differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.coefficient(Variable(w-1)) != denominator)
+    t = 2;
 
-  //! Returns <CODE>true</CODE> if the grid is known to be empty.
-  /*!
-    The return value <CODE>false</CODE> does not necessarily
-    implies that \p *this is non-empty.
-  */
-  bool marked_empty() const;
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w != v' and `a == denominator';
+  // - If t == 2, the `expr' is of the general form.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
 
-  //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
-  bool congruences_are_up_to_date() const;
+  if (t == 0) {
+    // Case 1: expr == b.
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    return;
+  }
 
-  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
-  bool generators_are_up_to_date() const;
+  if (t == 1) {
+    // Case 2: expr == a*w + b, w != v, a == denominator.
+    assert(expr.coefficient(Variable(w-1)) == denominator);
+    DIRTY_TEMP(N, d);
+    switch (relsym) {
+    case EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_den);
+      add_dbm_constraint(v, w, d);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_den);
+      add_dbm_constraint(v, w, d);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    return;
+  }
 
-  //! Returns <CODE>true</CODE> if the system of congruences is minimized.
-  bool congruences_are_minimized() const;
+  // Here t == 2, so that either
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, or
+  // expr == a*w + b, w != v and a != denominator.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-  //! Returns <CODE>true</CODE> if the system of generators is minimized.
-  bool generators_are_minimized() const;
+  DIRTY_TEMP(N, sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
 
-  //@} // Private Verifiers: Verify if Individual Flags are Set
+  // Speculative allocation of temporaries that are used in most
+  // of the computational traces starting from this point (also loops).
+  TEMP_INTEGER(minus_sc_i);
+  DIRTY_TEMP(N, coeff_i);
 
-  //! \name State Flag Setters: Set Only the Specified Flags
-  //@{
+  switch (relsym) {
+  case EQUAL:
+    {
+      DIRTY_TEMP(N, neg_sum);
+      // Indices of the variables that are unbounded in `this->dbm'.
+      // (The initializations are just to quiet a compiler warning.)
+      dimension_type neg_pinf_index = 0;
+      // Number of unbounded variables found.
+      dimension_type neg_pinf_count = 0;
 
-  /*! \brief
-    Sets \p status to express that the grid is the universe
-    0-dimension vector space, clearing all corresponding matrices.
-  */
-  void set_zero_dim_univ();
+      // Compute an upper approximation for `expr' into `sum',
+      // taking into account the sign of `denominator'.
 
-  /*! \brief
-    Sets \p status to express that the grid is empty, clearing all
-    corresponding matrices.
-  */
-  void set_empty();
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      assign_r(neg_sum, minus_sc_b, ROUND_UP);
 
-  //! Sets \p status to express that congruences are up-to-date.
-  void set_congruences_up_to_date();
+      // Approximate the homogeneous part of `sc_expr'.
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `expr'.
+      for (dimension_type i = w; i > 0; --i) {
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        if (sign_i > 0) {
+          assign_r(coeff_i, sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_i = dbm_0[i];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i;
+            }
+          }
+        }
+        else if (sign_i < 0) {
+          neg_assign(minus_sc_i, sc_i);
+          // Note: using temporary named `coeff_i' to store -coeff_i.
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_i = dbm_0[i];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i;
+            }
+          }
+        }
+      }
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1 && neg_pinf_count > 1) {
+        assert(OK());
+        return;
+      }
 
-  //! Sets \p status to express that generators are up-to-date.
-  void set_generators_up_to_date();
+      // In the following, shortest-path closure will be definitely lost.
+      reset_shortest_path_closed();
 
-  //! Sets \p status to express that congruences are minimized.
-  void set_congruences_minimized();
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
 
-  //! Sets \p status to express that generators are minimized.
-  void set_generators_minimized();
+      // Exploit the upper approximation, if possible.
+      if (pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_den != 1)
+          div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+        // Add the upper bound constraint, if meaningful.
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          dbm[0][v] = sum;
+          // Deduce constraints of the form `v - u', where `u != v'.
+          deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+        }
+        else
+          // Here `pinf_count == 1'.
+          if (pinf_index != v
+              && sc_expr.coefficient(Variable(pinf_index-1)) == sc_den)
+            // Add the constraint `v - pinf_index <= sum'.
+            dbm[pinf_index][v] = sum;
+      }
 
-  //@} // State Flag Setters: Set Only the Specified Flags
+      // Exploit the lower approximation, if possible.
+      if (neg_pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_den != 1)
+          div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+        // Add the lower bound constraint, if meaningful.
+        if (neg_pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          DB_Row<N>& dbm_v = dbm[v];
+          dbm_v[0] = neg_sum;
+          // Deduce constraints of the form `u - v', where `u != v'.
+          deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+        }
+        else
+          // Here `neg_pinf_count == 1'.
+          if (neg_pinf_index != v
+              && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+            // Add the constraint `v - neg_pinf_index >= -neg_sum',
+            // i.e., `neg_pinf_index - v <= neg_sum'.
+            dbm[v][neg_pinf_index] = neg_sum;
+      }
+    }
+    break;
 
-  //! \name State Flag Cleaners: Clear Only the Specified Flag
-  //@{
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `expr' into `sum',
+    // taking into account the sign of `denominator'.
 
-  //! Clears the \p status flag indicating that the grid is empty.
-  void clear_empty();
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
 
-  //! Sets \p status to express that congruences are out of date.
-  void clear_congruences_up_to_date();
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+        continue;
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
 
-  //! Sets \p status to express that parameters are out of date.
-  void clear_generators_up_to_date();
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_den' is known to be
+      // positive, this amounts to rounding downwards, which is achieved
+      // by rounding upwards `minus_sc-den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
 
-  //! Sets \p status to express that congruences are no longer minimized.
-  void clear_congruences_minimized();
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+      break;
 
-  //! Sets \p status to express that generators are no longer minimized.
-  void clear_generators_minimized();
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
 
-  //@} // State Flag Cleaners: Clear Only the Specified Flag
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
 
-  //! \name Updating Matrices
-  //@{
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+        continue;
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
 
-  //! Updates and minimizes the congruences from the generators.
-  /*!
-    \return
-    Always <CODE>true</CODE>.
-  */
-  bool update_congruences() const;
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_den' is known to be positive,
+      // this amounts to rounding downwards, which is achieved by rounding
+      // upwards `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
 
-  //! Updates and minimizes the generators from the congruences.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty grid.
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+          && expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
 
-    It is illegal to call this method when the Status field already
-    declares the grid to be empty.
-  */
-  bool update_generators() const;
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+  }
 
-  //@} // Updating Matrices
+  assert(OK());
+}
 
-  //! \name Minimization of Descriptions
-  //@{
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
 
-  //! Minimizes both the congruences and the generators.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if \p *this turns out to be an
-    empty grid.
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
 
-    Minimization is performed on each system only if the minimized
-    Status field is clear.
-  */
-  bool minimize() const;
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
 
-  //@} // Minimization of Descriptions
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-  enum Three_Valued_Boolean {
-    TVB_TRUE,
-    TVB_FALSE,
-    TVB_DONT_KNOW
-  };
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
 
-  //! Polynomial but incomplete equivalence test between grids.
-  Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
-  bool is_included_in(const Grid& y) const;
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Add the constraint `var == b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    add_dbm_constraint(v, 0, b, minus_den);
+    assert(OK());
+    return;
+  }
 
-  //! Checks if and how \p expr is bounded in \p *this.
-  /*!
-    Returns <CODE>true</CODE> if and only if \p from_above is
-    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
-    or \p from_above is <CODE>false</CODE> and \p expr is bounded
-    from below in \p *this.
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // `expr' is of the form: a*v + b.
+        if (a == denominator) {
+          if (b == 0)
+            // The transformation is the identity function.
+            return;
+          else {
+            // Translate all the constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_den);
+            DB_Row<N>& dbm_v = dbm[v];
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+            }
+            // Both shortest-path closure and reduction are preserved.
+          }
+        }
+        else {
+          // Here `a == -denominator'.
+          // Remove the binary constraints on `var'.
+          forget_binary_dbm_constraints(v);
+          // Swap the unary constraints on `var'.
+          std::swap(dbm[v][0], dbm[0][v]);
+          // Shortest-path closure is not preserved.
+          reset_shortest_path_closed();
+          if (b != 0) {
+            // Translate the unary constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_den);
+            N& dbm_v0 = dbm[v][0];
+            add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            N& dbm_0v = dbm[0][v];
+            add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+          }
+        }
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+          add_dbm_constraint(v, w, b, minus_den);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+          const N& dbm_0w = dbm[0][w];
+          if (!is_plus_infinity(dbm_0w)) {
+            // Add the constraint `v >= b/denominator - upper_w'.
+            DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_den);
+            add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+      }
+      assert(OK());
+      return;
+    }
+  }
 
-    \param expr
-    The linear expression to test;
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
 
-    \param method_call
-    The call description of the public parent method, for example
-    "bounded_from_above(e)".  Passed to throw_dimension_incompatible,
-    as the first argument.
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
-  */
-  bool bounds(const Linear_Expression& expr, const char* method_call) const;
+  DIRTY_TEMP(N, pos_sum);
+  DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
 
-  //! Maximizes or minimizes \p expr subject to \p *this.
-  /*!
-    \param expr
-    The linear expression to be maximized or minimized subject to \p
-    *this;
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
 
-    \param method_call
-    The call description of the public parent method, for example
-    "maximize(e)".  Passed to throw_dimension_incompatible, as the
-    first argument;
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP(N, coeff_i);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (dimension_type i = w; i > 0; --i) {
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i;
+        }
+      }
+    }
+  }
 
-    \param ext_n
-    The numerator of the extremum value;
+  // Remove all constraints on 'v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    assert(OK());
+    return;
+  }
 
-    \param ext_d
-    The denominator of the extremum value;
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
 
-    \param included
-    <CODE>true</CODE> if and only if the extremum of \p expr in \p
-    *this can actually be reached (which is always the case);
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
 
-    \param point
-    When maximization or minimization succeeds, will be assigned the
-    point where \p expr reaches the extremum value.
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DB_Row<N>& dbm_v = dbm[v];
+      dbm_v[0] = neg_sum;
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != v
+          && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+        // Add the constraint `v - neg_pinf_index >= -neg_sum',
+        // i.e., `neg_pinf_index - v <= neg_sum'.
+        dbm[v][neg_pinf_index] = neg_sum;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p expr and \p *this are dimension-incompatible.
+  assert(OK());
+}
 
-    If \p *this is empty or \p expr is not bounded in the appropriate
-    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
-    \p included and \p point are left untouched.
-  */
-  bool max_min(const Linear_Expression& expr,
-	       char* method_call,
-	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
-	       Grid_Generator* point = NULL) const;
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+                             const Linear_Expression& expr,
+                             Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
 
-  //! \name Widening- and Extrapolation-Related Functions
-  //@{
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
 
-  //! Copies a widened selection of congruences from \p y to \p selected_cgs.
-  void select_wider_congruences(const Grid& y,
-				Congruence_System& selected_cgs) const;
+  // `var' should be one of the dimensions of
+  // the bounded difference shapes.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
 
-  //@} // Widening- and Extrapolation-Related Functions
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-  //! Adds new space dimensions to the given systems.
-  /*!
-    \param cgs
-    A congruence system, to which columns are added;
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        j = i;
+    }
 
-    \param gs
-    A generator system, to which rows and columns are added;
+  // Now we know the form of `expr':
+  // - If t == 0, then expr = b, with `b' a constant;
+  // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t > 1, the `expr' is of the general form.
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    assert(OK());
+    return;
+  }
 
-    \param dims
-    The number of space dimensions to add.
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(j));
+    if (a == denominator || a == -denominator) {
+      // Case 2: expr = a*w + b, with a = +/- denominator.
+      if (j == var.id())
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, a);
+      else {
+        // `expr == a*w + b', where `w != v'.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        assert(OK());
+      }
+      return;
+    }
+  }
 
-    This method is invoked only by
-    <CODE>add_space_dimensions_and_embed()</CODE>.
-  */
-  void add_space_dimensions(Congruence_System& cgs,
-			    Grid_Generator_System& gs,
-			    const dimension_type dims);
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    // The transformation is invertible.
+    Linear_Expression inverse((expr_v + denominator)*var);
+    inverse -= expr;
+    affine_image(var, inverse, expr_v);
+  }
+  else {
+    // Transformation not invertible: all constraints on `var' are lost.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+  }
+  assert(OK());
+}
 
-  //! Adds new space dimensions to the given systems.
-  /*!
-    \param gs
-    A generator system, to which columns are added;
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_image(v, lb, ub, d)", "d == 0");
 
-    \param cgs
-    A congruence system, to which rows and columns are added;
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > bds_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (bds_space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (bds_space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  // Any image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-    \param dims
-    The number of space dimensions to add.
+  const Coefficient& b = ub_expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `ub_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `ub_expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = ub_space_dim; i-- > 0; )
+    if (ub_expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
 
-    This method is invoked only by
-    <CODE>add_space_dimensions_and_project()</CODE>.
-  */
-  void add_space_dimensions(Grid_Generator_System& gs,
-			    Congruence_System& cgs,
-			    const dimension_type dims);
+  // Now we know the form of `ub_expr':
+  // - If t == 0, then ub_expr == b, with `b' a constant;
+  // - If t == 1, then ub_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `ub_expr' is of the general form.
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
 
-  //! \name Minimization-related Static Member Functions
-  //@{
+  if (t == 0) {
+    // Case 1: ub_expr == b.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    // Add the constraint `var <= b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    assert(OK());
+    return;
+  }
 
-  //! Normalizes the divisors in \p sys.
-  /*!
-    Converts \p sys to an equivalent system in which the divisors are
-    of equal value.
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `ub_expr'.
+    const Coefficient& a = ub_expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // Here `var' occurs in `ub_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var = Variable(bds_space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `ub_expr'.
+        affine_image(new_var, ub_expr, denominator);
+        // NOTE: enforce shortest-path closure for precision.
+        shortest_path_closure_assign();
+        assert(!marked_empty());
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        // Now apply the affine upper bound, as recorded in `new_var'.
+        add_constraint(var <= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(bds_space_dim);
+        return;
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+        assert(OK());
+        return;
+      }
+    }
+  }
 
-    \return
-    The new system divisor, or zero if \p divisor was zero.
+  // General case.
+  // Either t == 2, so that
+  // ub_expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, ub_expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
 
-    \param sys
-    The generator system to be normalized.
+  // Compute upper approximations for `ub_expr' into `pos_sum'
+  // taking into account the sign of `denominator'.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -ub_expr;
+  const Linear_Expression& sc_expr = is_sc ? ub_expr : minus_expr;
 
-    \param divisor
-    An extra divisor to include in the calculation of the common
-    divisor of \p sys.
+  DIRTY_TEMP(N, pos_sum);
+  // Index of the variable that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
 
-    \param first_point
-    If \p first_point has a value other than NULL then it is taken as
-    the first point in \p sys, and it is assumed that any following
-    points have the same divisor as \p first_point.
-  */
-  static Coefficient
-  normalize_divisors(Grid_Generator_System& sys,
-		     Coefficient_traits::const_reference divisor
-		     = Coefficient_one(),
-		     Grid_Generator* first_point = NULL);
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
 
-  //! Normalize all the divisors in \p sys and \p gen_sys.
-  /*!
-    Modify \p sys and \p gen_sys to use the same single divisor value
-    for all generators, leaving each system representing the grid it
-    represented originally.
-  */
-  static void normalize_divisors(Grid_Generator_System& sys,
-				 Grid_Generator_System& gen_sys);
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  DIRTY_TEMP(N, coeff_i);
+  TEMP_INTEGER(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (dimension_type i = w; i > 0; --i) {
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i;
+        }
+      }
+    }
+  }
+  // Apply the affine lower bound.
+  generalized_affine_image(var,
+                           GREATER_OR_EQUAL,
+                           lb_expr,
+                           denominator);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1) {
+    return;
+  }
 
-  /*! \brief
-    Converts generator system \p dest to be equivalent to congruence
-    system \p source.
-  */
-  static void conversion(Congruence_System& source,
-			 Grid_Generator_System& dest,
-			 Dimension_Kinds& dim_kinds);
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
 
-  /*! \brief
-    Converts congruence system \p dest to be equivalent to generator
-    system \p source.
-  */
-  static void conversion(Grid_Generator_System& source,
-			 Congruence_System& dest,
-			 Dimension_Kinds& dim_kinds);
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_den != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
+  assert(OK());
+}
 
-  //! Converts \p cgs to upper triangular (i.e. minimized) form.
-  /*!
-    Returns <CODE>true</CODE> if \p cgs represents the empty set,
-    otherwise returns <CODE>false</CODE>.
-  */
-  static bool simplify(Congruence_System& cgs,
-		       Dimension_Kinds& dim_kinds);
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
 
-  //! Converts \p gs to lower triangular (i.e. minimized) form.
-  /*!
-    Expects \p gs to contain at least one point.
-  */
-  static void simplify(Grid_Generator_System& gs,
-		       Dimension_Kinds& dim_kinds);
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-  //! Reduces the line \p row using the line \p pivot.
-  /*!
-    Uses the line \p pivot to change the representation of the line \p
-    row so that the element at index \p col of \p row is zero.
-  */
-  // A member of Grid for access to Matrix::rows.
-  static void reduce_line_with_line(Grid_Generator& row,
-				    Grid_Generator& pivot,
-				    dimension_type col);
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
+  }
 
-  //! Reduces the equality \p row using the equality \p pivot.
-  /*!
-    Uses the equality \p pivot to change the representation of the
-    equality \p row so that the element at index \p col of \p row is
-    zero.
-  */
-  // A member of Grid for access to Matrix::rows.
-  static void reduce_equality_with_equality(Congruence& row,
-					    Congruence& pivot,
-					    dimension_type col);
+  const Coefficient& lb_expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var = Variable(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (lb_expr_v + denominator)*var;
+  TEMP_INTEGER(lb_inverse_den);
+  neg_assign(lb_inverse_den, lb_expr_v);
+  affine_image(new_var, lb_inverse, lb_inverse_den);
+  shortest_path_closure_assign();
+  assert(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(lb_inverse_den))
+    add_constraint(var >= new_var);
+  else
+    add_constraint(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim);
+  return;
+}
 
-  //! Reduces \p row using \p pivot.
-  /*!
-    Uses the point, parameter or proper congruence at \p pivot to
-    change the representation of the point, parameter or proper
-    congruence at \p row so that the element at index \p col of \p row
-    is zero.  Only elements from index \p start to index \p end are
-    modified (i.e. it is assumed that all other elements are zero).
-  */
-  // Part of Grid for access to Matrix::rows.
-  template <typename R>
-  static void reduce_pc_with_pc(R& row,
-				R& pivot,
-				dimension_type col,
-				dimension_type start,
-				dimension_type end);
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& expr,
+                                      Coefficient_traits::const_reference
+                                      denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
 
-  //! Reduce \p row using \p pivot.
-  /*!
-    Use the line \p pivot to change the representation of the
-    parameter \p row such that the element at index \p col of \p row
-    is zero.
-  */
-  // A member of Grid for access to Matrix::rows.
-  static void reduce_parameter_with_line(Grid_Generator& row,
-					 Grid_Generator& pivot,
-					 dimension_type col,
-					 Grid_Generator_System& sys);
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "e", expr);
 
-  //! Reduce \p row using \p pivot.
-  /*!
-    Use the equality \p pivot to change the representation of the
-    congruence \p row such that element at index \p col of \p row is
-    zero.
-  */
-  // A member of Grid for access to Matrix::rows.
-  static void reduce_congruence_with_equality(Congruence& row,
-					      Congruence& pivot,
-					      dimension_type col,
-					      Congruence_System& sys);
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var.id());
 
-  //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
-  /*!
-    Only consider from index \p start to index \p end of the row at \p
-    pivot_index.  Flag \p generators indicates whether \p sys is a
-    congruence or generator system.
-  */
-  template <typename M, typename R>
-  static void reduce_reduced(M& sys, dimension_type dim,
-			     dimension_type pivot_index,
-			     dimension_type start, dimension_type end,
-			     Dimension_Kinds& dim_kinds,
-			     bool generators = true);
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+                    "r is a strict relation symbol and "
+                    "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
 
-  //! Multiply the elements of \p dest by \p multiplier.
-  // A member of Grid for access to Matrix::rows and cgs::operator[].
-  static void multiply_grid(const Coefficient& multiplier,
-			    Congruence& cg, Congruence_System& dest,
-			    const dimension_type num_rows,
-			    const dimension_type num_dims);
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
 
-  //! Multiply the elements of \p dest by \p multiplier.
-  // A member of Grid for access to Grid_Generator::operator[].
-  static void multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
-			    Grid_Generator_System& dest, const dimension_type num_rows,
-			    const dimension_type num_dims);
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-  /*! \brief
-    If \p sys is lower triangular return <CODE>true</CODE>, else
-    return <CODE>false</CODE>.
-  */
-  static bool lower_triangular(const Congruence_System& sys,
-			       const Dimension_Kinds& dim_kinds);
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w = i+1;
+    }
 
-  /*! \brief
-    If \p sys is upper triangular return <CODE>true</CODE>, else
-    return <CODE>false</CODE>.
-  */
-  static bool upper_triangular(const Grid_Generator_System& sys,
-			       const Dimension_Kinds& dim_kinds);
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
 
-#ifndef NDEBUG
-  //! Checks that trailing rows contain only zero terms.
-  /*!
-    If all columns contain zero in the rows of \p system from row
-    index \p first to row index \p last then return <code>true</code>,
-    else return <code>false</code>.  \p row_size gives the number of
-    columns in each row.
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Both shortest-path closure and reduction are lost.
+    reset_shortest_path_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+    assert(OK());
+    return;
+  }
 
-    This method is only used in assertions in the simplify methods.
-  */
-  template <typename M, typename R>
-  static bool rows_are_zero(M& system,
-			    dimension_type first,
-			    dimension_type last,
-			    dimension_type row_size);
-#endif
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      DIRTY_TEMP(N, d);
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        div_round_up(d, b, denominator);
+        if (w == v) {
+          // `expr' is of the form: a*v + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `v - w <= dbm_wv'
+            // into the constraint `v - w <= dbm_wv + b/denominator';
+            // forget each constraint `w - v <= dbm_vw'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+              assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+            N& dbm_v0 = dbm_v[0];
+            add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_v0, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w <= b/denominator'.
+            add_dbm_constraint(w, v, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v <= b/denominator - w'.
+            // Approximate it by computing a lower bound for `w'.
+            const N& dbm_w0 = dbm[w][0];
+            if (!is_plus_infinity(dbm_w0)) {
+              // Add the constraint `v <= b/denominator - lb_w'.
+              add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
+
+      case GREATER_OR_EQUAL:
+        div_round_up(d, b, minus_den);
+        if (w == v) {
+          // `expr' is of the form: a*w + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `w - v <= dbm_vw'
+            // into the constraint `w - v <= dbm_vw - b/denominator';
+            // forget each constraint `v - w <= dbm_wv'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+              assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_0v - b/denominator'.
+            N& dbm_0v = dbm_0[v];
+            add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_0v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w >= b/denominator',
+            // i.e., `w - v <= -b/denominator'.
+            add_dbm_constraint(v, w, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v >= -w + b/denominator',
+            // i.e., `-v <= w - b/denominator'.
+            // Approximate it by computing an upper bound for `w'.
+            const N& dbm_0w = dbm_0[w];
+            if (!is_plus_infinity(dbm_0w)) {
+              // Add the constraint `-v <= ub_w - b/denominator'.
+              add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
 
-  //@} // Minimization-Related Static Member Functions
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      assert(OK());
+      return;
+    }
+  }
 
-  //! \name Exception Throwers
-  //@{
-protected:
-  void throw_runtime_error(const char* method) const;
-  void throw_invalid_argument(const char* method, const char* reason) const;
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-  void throw_dimension_incompatible(const char* method,
-				    const char* other_name,
-				    dimension_type other_dim) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* gr_name,
-				    const Grid& gr) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* e_name,
-				    const Linear_Expression& e) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* cg_name,
-				    const Congruence& cg) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* c_name,
-				    const Constraint& c) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* g_name,
-				    const Grid_Generator& g) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* cgs_name,
-				    const Congruence_System& cgs) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* cs_name,
-				    const Constraint_System& cs) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* gs_name,
-				    const Grid_Generator_System& gs) const;
-  void throw_dimension_incompatible(const char* method,
-				    const char* var_name,
-				    const Variable var) const;
-  void throw_dimension_incompatible(const char* method,
-				    dimension_type required_space_dim) const;
+  DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->dbm'.
+  // (The initialization is just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
 
-  // Note: it has to be a static method, because it can be called inside
-  // constructors (before actually constructing the grid object).
-  static void throw_space_dimension_overflow(const char* method,
-					     const char* reason);
+  // Speculative allocation of temporaries to be used in the following loops.
+  DIRTY_TEMP(N, coeff_i);
+  TEMP_INTEGER(minus_sc_i);
 
-  void throw_invalid_generator(const char* method,
-			       const char* g_name) const;
-  void throw_invalid_generators(const char* method,
-				const char* gs_name) const;
-  //@} // Exception Throwers
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `sc_expr' into `sum'.
 
-};
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `sc_expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+        continue;
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
 
+    // Remove all constraints on `v'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      assert(OK());
+      return;
+    }
 
-namespace std {
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Grid */
-void swap(Parma_Polyhedra_Library::Grid& x,
-	  Parma_Polyhedra_Library::Grid& y);
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+          && expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+    break;
 
-} // namespace std
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
 
-// Automatically generated from PPL source file ../src/Grid_Status.inlines.hh line 1
-/* Grid::Status class implementation: inline functions.
-*/
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (dimension_type i = expr_space_dim + 1; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+        continue;
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
 
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      assert(OK());
+      return;
+    }
 
-namespace Parma_Polyhedra_Library {
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      DIRTY_TEMP(N, down_sc_den);
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
 
-inline
-Grid::Status::Status(flags_t mask)
-  : flags(mask) {
-}
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+          && expr.coefficient(Variable(pinf_index-1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
 
-inline
-Grid::Status::Status()
-  : flags(ZERO_DIM_UNIV) {
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+  }
+  assert(OK());
 }
 
-inline bool
-Grid::Status::test_all(flags_t mask) const {
-  return (flags & mask) == mask;
-}
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
 
-inline bool
-Grid::Status::test_any(flags_t mask) const {
-  return flags & mask;
-}
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
 
-inline void
-Grid::Status::set(flags_t mask) {
-  flags |= mask;
-}
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
 
-inline void
-Grid::Status::reset(flags_t mask) {
-  flags &= ~mask;
-}
+  // The image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-inline bool
-Grid::Status::test_zero_dim_univ() const {
-  return flags == ZERO_DIM_UNIV;
-}
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
+    }
 
-inline void
-Grid::Status::reset_zero_dim_univ() {
-  // This is a no-op if the current status is not zero-dim.
-  if (flags == ZERO_DIM_UNIV)
-    // In the zero-dim space, if it is not the universe it is empty.
-    flags = EMPTY;
-}
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
 
-inline void
-Grid::Status::set_zero_dim_univ() {
-  // Zero-dim universe is incompatible with anything else.
-  flags = ZERO_DIM_UNIV;
-}
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is a bounded difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not a bounded difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, den);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
 
-inline bool
-Grid::Status::test_empty() const {
-  return test_any(EMPTY);
-}
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
 
-inline void
-Grid::Status::reset_empty() {
-  reset(EMPTY);
-}
+#if 1 // Simplified computation (see the TODO note below).
 
-inline void
-Grid::Status::set_empty() {
-  flags = EMPTY;
-}
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
 
-inline bool
-Grid::Status::test_c_up_to_date() const {
-  return test_any(C_UP_TO_DATE);
-}
+#else // Currently unnecessarily complex computation.
 
-inline void
-Grid::Status::reset_c_up_to_date() {
-  reset(C_UP_TO_DATE);
-}
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
 
-inline void
-Grid::Status::set_c_up_to_date() {
-  set(C_UP_TO_DATE);
-}
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // a bounded differences (since it has 3 variables at least).
+      // Thus, the method add_constraint() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= new_var);
+        break;
+      case EQUAL:
+        add_constraint(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
 
-inline bool
-Grid::Status::test_g_up_to_date() const {
-  return test_any(G_UP_TO_DATE);
+  assert(OK());
 }
 
-inline void
-Grid::Status::reset_g_up_to_date() {
-  reset(G_UP_TO_DATE);
-}
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
 
-inline void
-Grid::Status::set_g_up_to_date() {
-  set(G_UP_TO_DATE);
-}
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
 
-inline bool
-Grid::Status::test_c_minimized() const {
-  return test_any(C_MINIMIZED);
-}
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var.id());
 
-inline void
-Grid::Status::reset_c_minimized() {
-  reset(C_MINIMIZED);
-}
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                    "r is a strict relation symbol and "
+                    "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
 
-inline void
-Grid::Status::set_c_minimized() {
-  set(C_MINIMIZED);
-}
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
 
-inline bool
-Grid::Status::test_g_minimized() const {
-  return test_any(G_MINIMIZED);
-}
+  // The preimage of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-inline void
-Grid::Status::reset_g_minimized() {
-  reset(G_MINIMIZED);
-}
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    TEMP_INTEGER(inverse_den);
+    neg_assign(inverse_den, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+    return;
+  }
 
-inline void
-Grid::Status::set_g_minimized() {
-  set(G_MINIMIZED);
+  refine(var, relsym, expr, denominator);
+  // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  assert(OK());
 }
 
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (bds_space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
 
-inline bool
-Grid::Status::test_c_pending() const {
-  return test_any(CS_PENDING);
-}
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (bds_space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
 
-inline void
-Grid::Status::reset_c_pending() {
-  reset(CS_PENDING);
-}
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(e1, r, e2)",
+                  "r is a strict relation symbol and "
+                  "*this is a BD_Shape");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_preimage(e1, r, e2)",
+                    "r is the disequality relation symbol and "
+                    "*this is a BD_Shape");
+
+  // The preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
 
-inline void
-Grid::Status::set_c_pending() {
-  set(CS_PENDING);
-}
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      if (t_lhs++ == 1)
+        break;
+      else
+        j_lhs = i;
+    }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In this case, preimage and image happen to be the same.
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, den);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+        lhs_vars.push_back(Variable(i));
+        if (rhs.coefficient(Variable(i)) != 0)
+          lhs_vars_intersects_rhs_vars = true;
+      }
 
-inline bool
-Grid::Status::test_g_pending() const {
-  return test_any(GS_PENDING);
-}
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
 
-inline void
-Grid::Status::reset_g_pending() {
-  reset(GS_PENDING);
-}
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(lhs <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
 
-inline void
-Grid::Status::set_g_pending() {
-  set(GS_PENDING);
-}
+      // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+    }
+    else {
 
+      // Some variables in `lhs' also occur in `rhs'.
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(bds_space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `lhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, lhs);
+      // Existentiallly quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == a_rhs*v + b_rhs' where `a_rhs' is in {0, 1},
+      // then one of the following constraints will be added,
+      // since it is a bounded difference. Else the method add_constraint()
+      // will ignore it, 'cause the constraint is NOT a bounded
+      // difference.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        add_constraint(new_var <= rhs);
+        break;
+      case EQUAL:
+        add_constraint(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        add_constraint(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        throw std::runtime_error("PPL internal error");
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(bds_space_dim);
+    }
+  }
 
-inline bool
-Grid::Status::test_sat_c_up_to_date() const {
-  return test_any(SAT_C_UP_TO_DATE);
+  assert(OK());
 }
 
-inline void
-Grid::Status::reset_sat_c_up_to_date() {
-  reset(SAT_C_UP_TO_DATE);
-}
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else if (marked_shortest_path_reduced())
+    // Disregard redundant constraints.
+    cs = minimized_constraints();
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
 
-inline void
-Grid::Status::set_sat_c_up_to_date() {
-  set(SAT_C_UP_TO_DATE);
-}
+    TEMP_INTEGER(a);
+    TEMP_INTEGER(b);
+    // Go through all the unary constraints in `dbm'.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type j = 1; j <= space_dim; ++j) {
+      const Variable x(j-1);
+      const N& dbm_0j = dbm_0[j];
+      const N& dbm_j0 = dbm[j][0];
+      if (is_additive_inverse(dbm_j0, dbm_0j)) {
+        // We have a unary equality constraint.
+        numer_denom(dbm_0j, b, a);
+        cs.insert(a*x == b);
+      }
+      else {
+        // We have 0, 1 or 2 unary inequality constraints.
+        if (!is_plus_infinity(dbm_0j)) {
+          numer_denom(dbm_0j, b, a);
+          cs.insert(a*x <= b);
+        }
+        if (!is_plus_infinity(dbm_j0)) {
+          numer_denom(dbm_j0, b, a);
+          cs.insert(-a*x <= b);
+        }
+      }
+    }
 
-inline bool
-Grid::Status::test_sat_g_up_to_date() const {
-  return test_any(SAT_G_UP_TO_DATE);
+    // Go through all the binary constraints in `dbm'.
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const Variable y(i-1);
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i + 1; j <= space_dim; ++j) {
+        const Variable x(j-1);
+        const N& dbm_ij = dbm_i[j];
+        const N& dbm_ji = dbm[j][i];
+        if (is_additive_inverse(dbm_ji, dbm_ij)) {
+          // We have a binary equality constraint.
+          numer_denom(dbm_ij, b, a);
+          cs.insert(a*x - a*y == b);
+        }
+        else {
+          // We have 0, 1 or 2 binary inequality constraints.
+          if (!is_plus_infinity(dbm_ij)) {
+            numer_denom(dbm_ij, b, a);
+            cs.insert(a*x - a*y <= b);
+          }
+          if (!is_plus_infinity(dbm_ji)) {
+            numer_denom(dbm_ji, b, a);
+            cs.insert(a*y - a*x <= b);
+          }
+        }
+      }
+    }
+  }
+  return cs;
 }
 
-inline void
-Grid::Status::reset_sat_g_up_to_date() {
-  reset(SAT_G_UP_TO_DATE);
-}
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+  shortest_path_reduction_assign();
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
 
-inline void
-Grid::Status::set_sat_g_up_to_date() {
-  set(SAT_G_UP_TO_DATE);
-}
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
 
-} // namespace Parma_Polyhedra_Library
+    // Compute leader information.
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
+    std::vector<dimension_type> leader_indices;
+    compute_leader_indices(leaders, leader_indices);
+    const dimension_type num_leaders = leader_indices.size();
 
-// Automatically generated from PPL source file ../src/Grid.inlines.hh line 1
-/* Grid class implementation: inline functions.
-*/
+    // Go through the non-leaders to generate equality constraints.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const dimension_type leader = leaders[i];
+      if (i != leader) {
+        // Generate the constraint relating `i' and its leader.
+        if (leader == 0) {
+          // A unary equality has to be generated.
+          assert(!is_plus_infinity(dbm_0[i]));
+          numer_denom(dbm_0[i], num, den);
+          cs.insert(den*Variable(i-1) == num);
+        }
+        else {
+          // A binary equality has to be generated.
+          assert(!is_plus_infinity(dbm[i][leader]));
+          numer_denom(dbm[i][leader], num, den);
+          cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+        }
+      }
+    }
 
+    // Go through the leaders to generate inequality constraints.
+    // First generate all the unary inequalities.
+    const Bit_Row& red_0 = redundancy_dbm[0];
+    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+      const dimension_type i = leader_indices[l_i];
+      if (!red_0[i]) {
+        numer_denom(dbm_0[i], num, den);
+        cs.insert(den*Variable(i-1) <= num);
+      }
+      if (!redundancy_dbm[i][0]) {
+        numer_denom(dbm[i][0], num, den);
+        cs.insert(-den*Variable(i-1) <= num);
+      }
+    }
+    // Then generate all the binary inequalities.
+    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+      const dimension_type i = leader_indices[l_i];
+      const DB_Row<N>& dbm_i = dbm[i];
+      const Bit_Row& red_i = redundancy_dbm[i];
+      for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+        const dimension_type j = leader_indices[l_j];
+        if (!red_i[j]) {
+          numer_denom(dbm_i[j], num, den);
+          cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
+        }
+        if (!redundancy_dbm[j][i]) {
+          numer_denom(dbm[j][i], num, den);
+          cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
+        }
+      }
+    }
+  }
+  return cs;
+}
 
-// Automatically generated from PPL source file ../src/Grid.inlines.hh line 28
-#include <algorithm>
+template <typename T>
+void
+BD_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  dimension_type old_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > old_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting BDS should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_generic("expand_dimension(v, m)",
+                  "adding m new space dimensions exceeds "
+                  "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
 
-namespace Parma_Polyhedra_Library {
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
 
-inline dimension_type
-Grid::max_space_dimension() {
-  using std::min;
-  // One dimension is reserved to have a value of type dimension_type
-  // that does not represent a legal dimension.
-  return min(std::numeric_limits<dimension_type>::max() - 1,
-	     min(Congruence_System::max_space_dimension(),
-		 Grid_Generator_System::max_space_dimension()
-		 )
-	     );
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  const dimension_type v_id = var.id() + 1;
+  const DB_Row<N>& dbm_v = dbm[v_id];
+  for (dimension_type i = old_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const N& dbm_i_v = dbm[i][v_id];
+    const N& dbm_v_i = dbm_v[i];
+    for (dimension_type j = old_dim+1; j < old_dim+m+1; ++j) {
+      dbm_i[j] = dbm_i_v;
+      dbm[j][i] = dbm_v_i;
+    }
+  }
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  assert(OK());
 }
 
-inline void
-Grid::set_congruences_up_to_date() {
-  status.set_c_up_to_date();
-}
+template <typename T>
+void
+BD_Shape<T>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                   Variable var) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the BDS.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
+                                 "v", var);
 
-inline
-Grid::Grid(const Congruence_System& ccgs) {
-  if (ccgs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(ccgs)",
-				   "the space dimension of ccgs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(ccgs);
-}
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
+    return;
 
-inline
-Grid::Grid(Congruence_System& cgs) {
-  if (cgs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(cgs)",
-				   "the space dimension of cgs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(cgs);
-}
+  // All variables in `to_be_folded' should be dimensions of the BDS.
+  if (to_be_folded.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, ...)",
+                                 to_be_folded.space_dimension());
 
-inline
-Grid::Grid(const Grid_Generator_System& gs) {
-  if (gs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(gs)",
-				   "the space dimension of gs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(gs);
-}
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
+    throw_generic("fold_space_dimensions(tbf, v)",
+                  "v should not occur in tbf");
 
-inline
-Grid::Grid(Grid_Generator_System& gs) {
-  if (gs.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(gs)",
-				   "the space dimension of gs "
-				   "exceeds the maximum allowed "
-				   "space dimension");
-  construct(gs);
+  shortest_path_closure_assign();
+  if (!marked_empty()) {
+    // Recompute the elements of the row and the column corresponding
+    // to variable `var' by taking the join of their value with the
+    // value of the corresponding elements in the row and column of the
+    // variable `to_be_folded'.
+    const dimension_type v_id = var.id() + 1;
+    DB_Row<N>& dbm_v = dbm[v_id];
+    for (Variables_Set::const_iterator i = to_be_folded.begin(),
+           tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+      const dimension_type tbf_id = *i + 1;
+      const DB_Row<N>& dbm_tbf = dbm[tbf_id];
+      for (dimension_type j = space_dim + 1; j-- > 0; ) {
+        max_assign(dbm[j][v_id], dbm[j][tbf_id]);
+        max_assign(dbm_v[j], dbm_tbf[j]);
+      }
+    }
+  }
+  remove_space_dimensions(to_be_folded);
 }
 
-inline
-Grid::~Grid() {
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
+  typedef typename BD_Shape<T>::coefficient_type N;
+  if (c.is_universe())
+    s << "true";
+  else {
+    // We control empty bounded difference shape.
+    dimension_type n = c.space_dimension();
+    if (c.marked_empty())
+      s << "false";
+    else {
+      DIRTY_TEMP(N, v);
+      bool first = true;
+      for (dimension_type i = 0; i <= n; ++i)
+        for (dimension_type j = i + 1; j <= n; ++j) {
+          const N& c_i_j = c.dbm[i][j];
+          const N& c_j_i = c.dbm[j][i];
+          if (is_additive_inverse(c_j_i, c_i_j)) {
+            // We will print an equality.
+            if (first)
+              first = false;
+            else
+              s << ", ";
+            if (i == 0) {
+              // We have got a equality constraint with one Variable.
+              s << Variable(j - 1);
+              s << " == " << c_i_j;
+            }
+            else {
+              // We have got a equality constraint with two Variables.
+              if (sgn(c_i_j) >= 0) {
+                s << Variable(j - 1);
+                s << " - ";
+                s << Variable(i - 1);
+                s << " == " << c_i_j;
+              }
+              else {
+                s << Variable(i - 1);
+                s << " - ";
+                s << Variable(j - 1);
+                s << " == " << c_j_i;
+              }
+            }
+          }
+          else {
+            // We will print a non-strict inequality.
+            if (!is_plus_infinity(c_j_i)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with an only Variable.
+                s << Variable(j - 1);
+                neg_assign_r(v, c_j_i, ROUND_DOWN);
+                s << " >= " << v;
+              }
+              else {
+                // We have got a constraint with two Variables.
+                if (sgn(c_j_i) >= 0) {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  s << " <= " << c_j_i;
+                }
+                else {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  neg_assign_r(v, c_j_i, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+            if (!is_plus_infinity(c_i_j)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with an only Variable.
+                s << Variable(j - 1);
+                s << " <= " << c_i_j;
+              }
+              else {
+                // We have got a constraint with two Variables.
+                if (sgn(c_i_j) >= 0) {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  s << " <= " << c_i_j;
+                }
+                else {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  neg_assign_r(v, c_i_j, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+          }
+        }
+    }
+  }
+  return s;
 }
 
-inline memory_size_type
-Grid::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+  status.ascii_dump(s);
+  s << "\n";
+  dbm.ascii_dump(s);
+  s << "\n";
+  redundancy_dbm.ascii_dump(s);
 }
 
-inline dimension_type
-Grid::space_dimension() const {
-  return space_dim;
-}
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>)
 
-inline void
-Grid::upper_bound_assign(const Grid& y) {
-  join_assign(y);
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+  if (!dbm.ascii_load(s))
+    return false;
+  if (!redundancy_dbm.ascii_load(s))
+    return false;
+  return true;
 }
 
-inline bool
-Grid::upper_bound_assign_if_exact(const Grid& y) {
-  return join_assign_if_exact(y);
+template <typename T>
+memory_size_type
+BD_Shape<T>::external_memory_in_bytes() const {
+  return dbm.external_memory_in_bytes()
+    + redundancy_dbm.external_memory_in_bytes();
 }
 
-inline void
-Grid::difference_assign(const Grid& y) {
-  grid_difference_assign(y);
-}
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+  // Check whether the difference-bound matrix is well-formed.
+  if (!dbm.OK())
+    return false;
 
-inline void
-Grid::swap(Grid& y) {
-  std::swap(con_sys, y.con_sys);
-  std::swap(gen_sys, y.gen_sys);
-  std::swap(status, y.status);
-  std::swap(space_dim, y.space_dim);
-  std::swap(dim_kinds, y.dim_kinds);
-}
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
 
-} // namespace Parma_Polyhedra_Library
+  // An empty BDS is OK.
+  if (marked_empty())
+    return true;
 
-/*! \relates Parma_Polyhedra_Library::Grid */
-inline void
-std::swap(Parma_Polyhedra_Library::Grid& x,
-	  Parma_Polyhedra_Library::Grid& y) {
-  x.swap(y);
-}
+  // MINUS_INFINITY cannot occur at all.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    for (dimension_type j = dbm.num_rows(); j-- > 0; )
+    if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                << dbm[i][j] << "!"
+                << std::endl;
+#endif
+      return false;
+    }
 
-namespace Parma_Polyhedra_Library {
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+                << dbm[i][i] << "!  (+inf was expected.)"
+                << std::endl;
+#endif
+      return false;
+    }
 
-inline bool
-Grid::marked_empty() const {
-  return status.test_empty();
-}
+  // Check whether the shortest-path closure information is legal.
+  if (marked_shortest_path_closed()) {
+    BD_Shape x = *this;
+    x.reset_shortest_path_closed();
+    x.shortest_path_closure_assign();
+    if (x.dbm != dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as closed but it is not!"
+                << std::endl;
+#endif
+      return false;
+    }
+  }
 
-inline bool
-Grid::congruences_are_up_to_date() const {
-  return status.test_c_up_to_date();
-}
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise shortest-path closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the shortest-path reduction information is legal.
+    if (marked_shortest_path_reduced()) {
+      // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+      for (dimension_type i = dbm.num_rows(); i-- > 0; )
+        for (dimension_type j = dbm.num_rows(); j-- > 0; )
+          if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+            using namespace Parma_Polyhedra_Library::IO_Operators;
+            std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                      << dbm[i][j] << " is marked as non-redundant!"
+                      << std::endl;
+#endif
+            return false;
+          }
 
-inline bool
-Grid::generators_are_up_to_date() const {
-  return status.test_g_up_to_date();
-}
+      BD_Shape x = *this;
+      x.reset_shortest_path_reduced();
+      x.shortest_path_reduction_assign();
+      if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+        std::cerr << "BD_Shape is marked as reduced but it is not!"
+                  << std::endl;
+#endif
+        return false;
+      }
+    }
+  }
 
-inline bool
-Grid::congruences_are_minimized() const {
-  return status.test_c_minimized();
+  // All checks passed.
+  return true;
 }
 
-inline bool
-Grid::generators_are_minimized() const {
-  return status.test_g_minimized();
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const BD_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::set_generators_up_to_date() {
-  status.set_g_up_to_date();
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::set_congruences_minimized() {
-  set_congruences_up_to_date();
-  status.set_c_minimized();
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::set_generators_minimized() {
-  set_generators_up_to_date();
-  status.set_g_minimized();
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::clear_empty() {
-  status.reset_empty();
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::clear_congruences_minimized() {
-  status.reset_c_minimized();
+template <typename T>
+void
+BD_Shape<T>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::clear_generators_minimized() {
-  status.reset_g_minimized();
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+                                          const Linear_Expression& e) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
 }
 
-inline void
-Grid::clear_congruences_up_to_date() {
-  clear_congruences_minimized();
-  status.reset_c_up_to_date();
-  // Can get rid of con_sys here.
-}
 
-inline void
-Grid::clear_generators_up_to_date() {
-  clear_generators_minimized();
-  status.reset_g_up_to_date();
-  // Can get rid of gen_sys here.
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const char* name_row,
+                                          const Linear_Expression& y) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-inline bool
-Grid::bounds_from_above(const Linear_Expression& expr) const {
-  return bounds(expr, "bounds_from_above(e)");
+template <typename T>
+void
+BD_Shape<T>::throw_generic(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
 }
 
-inline bool
-Grid::bounds_from_below(const Linear_Expression& expr) const {
-  return bounds(expr, "bounds_from_below(e)");
-}
+} // namespace Parma_Polyhedra_Library
 
-inline bool
-Grid::maximize(const Linear_Expression& expr,
-	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
-  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BD_Shape.defs.hh line 2115
 
-inline bool
-Grid::maximize(const Linear_Expression& expr,
-	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
-	       Grid_Generator& point) const {
-  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rational_Interval.hh line 1
+/* Rational_Interval class declaration and implementation.
+*/
 
-inline bool
-Grid::minimize(const Linear_Expression& expr,
-	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
-  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
-}
 
-inline bool
-Grid::minimize(const Linear_Expression& expr,
-	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
-	       Grid_Generator& point) const {
-  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rational_Interval.hh line 27
+#include <gmpxx.h>
 
-/*! \relates Grid */
-inline bool
-operator!=(const Grid& x, const Grid& y) {
-  return !(x == y);
-}
+namespace Parma_Polyhedra_Library {
 
-inline bool
-Grid::strictly_contains(const Grid& y) const {
-  const Grid& x = *this;
-  return x.contains(y) && !y.contains(x);
-}
+struct Rational_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
 
-inline void
-Grid::topological_closure_assign() {
-  return;
-}
+typedef
+Interval_Restriction_None<Interval_Info_Bitset<unsigned int,
+                                               Rational_Interval_Info_Policy> >
+Rational_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpq_class, Rational_Interval_Info> Rational_Interval;
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Grid.templates.hh line 1
-/* Grid class implementation: inline functions.
-*/
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.templates.hh line 39
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
 
+template <typename ITV>
+inline
+Box<ITV>::Box(dimension_type num_dimensions, Degenerate_Element kind)
+  : seq(num_dimensions <= max_space_dimension()
+	? num_dimensions
+	: (throw_space_dimension_overflow("Box(n, k)",
+					  "n exceeds the maximum "
+					  "allowed space dimension"),
+	   num_dimensions)),
+    status() {
+  // In a box that is marked empty the intervals are completely
+  // meaningless: we exploit this by avoiding their initialization.
+  if (kind == UNIVERSE) {
+    for (dimension_type i = num_dimensions; i-- > 0; )
+      seq[i].assign(UNIVERSE);
+    set_empty_up_to_date();
+  }
+  else
+    set_empty();
+  assert(OK());
+}
 
-// Automatically generated from PPL source file ../src/Grid.templates.hh line 29
-#include <algorithm>
-#include <deque>
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs)
+  : seq(cs.space_dimension() <= max_space_dimension()
+	? cs.space_dimension()
+	: (throw_space_dimension_overflow("Box(cs)",
+					  "cs exceeds the maximum "
+					  "allowed space dimension"),
+	   cs.space_dimension())),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_constraints_no_check(cs);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs)
+  : seq(cgs.space_dimension() <= max_space_dimension()
+	? cgs.space_dimension()
+	: (throw_space_dimension_overflow("Box(cgs)",
+					  "cgs exceeds the maximum "
+					  "allowed space dimension"),
+	   cgs.space_dimension())),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cgs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_congruences_no_check(cgs);
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Box(const Box<Other_ITV>& y, Complexity_Class)
+  : seq(y.space_dimension()),
+    // FIXME: why the following does not work?
+    // status(y.status) {
+    status() {
+  // FIXME: remove when the above is fixed.
+  if (y.marked_empty())
+    set_empty();
 
-namespace Parma_Polyhedra_Library {
+  if (!y.marked_empty())
+    for (dimension_type k = y.space_dimension(); k-- > 0; )
+      seq[k].assign(y.seq[k]);
+  assert(OK());
+}
 
-template <typename Box>
-Grid::Grid(const Box& box, From_Bounding_Box dummy)
-  : con_sys(),
-    gen_sys(NECESSARILY_CLOSED) {
-  used(dummy);
+template <typename ITV>
+Box<ITV>::Box(const Generator_System& gs)
+  : seq(gs.space_dimension() <= max_space_dimension()
+	? gs.space_dimension()
+	: (throw_space_dimension_overflow("Box(gs)",
+					  "gs exceeds the maximum "
+					  "allowed space dimension"),
+	   gs.space_dimension())),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty box.
+    set_empty();
+    return;
+  }
 
-  if (box.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(box, from_bounding_box)",
-				   "the space dimension of box "
-				   "exceeds the maximum allowed "
-				   "space dimension");
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
 
-  space_dim = box.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  DIRTY_TEMP0(mpq_class, q);
+  bool point_seen = false;
+  // Going through all the points.
+  for (Generator_System::const_iterator
+	 gs_i = gs_begin; gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    if (g.is_point()) {
+      const Coefficient& d = g.divisor();
+      if (point_seen) {
+	// This is not the first point: `seq' already contains valid values.
+	for (dimension_type i = space_dim; i-- > 0; ) {
+	  assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+	  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	  q.canonicalize();
+	  seq[i].join_assign(q);
+	}
+      }
+      else {
+	// This is the first point seen: initialize `seq'.
+	point_seen = true;
+	for (dimension_type i = space_dim; i-- > 0; ) {
+	  assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+	  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	  q.canonicalize();
+	  seq[i].assign(q);
+	}
+      }
+    }
+  }
 
-  TEMP_INTEGER(l_n);
-  TEMP_INTEGER(l_d);
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::Box<ITV>::Box(gs):\n"
+				"the non-empty generator system gs "
+				"contains no points.");
 
-  // Check that all bounds are closed.  This must be done before the
-  // empty check below, in case an open bound makes the grid empty.
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    bool closed;
-    // FIXME: Perhaps introduce box::is_bounded_and_closed.
-    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
-    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+  // Going through all the lines, rays and closure points.
+  ITV q_interval;
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (dimension_type i = space_dim; i-- > 0; )
+	if (g.coefficient(Variable(i)) != 0)
+	  seq[i].assign(UNIVERSE);
+      break;
+    case Generator::RAY:
+      for (dimension_type i = space_dim; i-- > 0; )
+	switch (sgn(g.coefficient(Variable(i)))) {
+	case 1:
+	  seq[i].upper_set(UNBOUNDED);
+	  break;
+	case -1:
+	  seq[i].lower_set(UNBOUNDED);
+	  break;
+	default:
+	  break;
+	}
+      break;
+    case Generator::CLOSURE_POINT:
+      {
+	const Coefficient& d = g.divisor();
+	for (dimension_type i = space_dim; i-- > 0; ) {
+	  assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+	  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	  q.canonicalize();
+	  ITV& seq_i = seq[i];
+	  seq_i.lower_widen(q, true);
+	  seq_i.upper_widen(q, true);
+	}
+      }
+      break;
+    default:
+      // Points already dealt with.
+      break;
+    }
   }
+  assert(OK());
+}
 
-  if (box.is_empty()) {
-    // Empty grid.
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const BD_Shape<T>& bds, Complexity_Class)
+  : seq(bds.space_dimension() <= max_space_dimension()
+	? bds.space_dimension()
+	: (throw_space_dimension_overflow("Box(bds)",
+					  "bds exceeds the maximum "
+					  "allowed space dimension"),
+	   bds.space_dimension())),
+    status() {
+  // Expose all the interval constraints.
+  bds.shortest_path_closure_assign();
+  if (bds.marked_empty()) {
     set_empty();
     assert(OK());
     return;
   }
 
-  if (space_dim == 0)
-    set_zero_dim_univ();
-  else {
-    // Initialize the space dimension as indicated by the box.
-    con_sys.increase_space_dimension(space_dim);
-    // Add congruences according to `box'.
-    TEMP_INTEGER(u_n);
-    TEMP_INTEGER(u_d);
-    for (dimension_type k = space_dim; k-- > 0; ) {
-      bool closed;
-      // TODO: Consider producing the system(s) in minimized form.
-      // FIXME: Also create the generator system.
-      if (box.get_lower_bound(k, closed, l_n, l_d)) {
-	if (box.get_upper_bound(k, closed, u_n, u_d))
-	  if (l_n * u_d == u_n * l_d) {
-	    // A point interval sets dimension k of every point to a
-	    // single value.
-	    con_sys.insert(l_d * Variable(k) == l_n);
-	    continue;
-	  }
-	// The only valid bounded interval is a point interval.
-	throw_invalid_argument("Grid(box, from_bounding_box)", "box");
-      }
-      else if (box.get_upper_bound(k, closed, u_n, u_d))
-	// An interval can only be a point or the universe.
-	throw_invalid_argument("Grid(box, from_covering_box)",
-			       "box");
-      // A universe interval allows any value in dimension k.
-    }
-    set_congruences_up_to_date();
-    gen_sys.unset_pending_rows();
-    gen_sys.set_sorted(false);
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    assert(OK());
+    return;
   }
 
+  DIRTY_TEMP(typename BD_Shape<T>::coefficient_type, tmp);
+  const DB_Row<typename BD_Shape<T>::coefficient_type>& dbm_0 = bds.dbm[0];
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    // Set the upper bound.
+    const typename BD_Shape<T>::coefficient_type& u = dbm_0[i+1];
+    if (is_plus_infinity(u))
+      seq_i.upper_set_uninit(UNBOUNDED);
+    else
+      seq_i.upper_set_uninit(u);
+
+    // Set the lower bound.
+    const typename BD_Shape<T>::coefficient_type& negated_l = bds.dbm[i+1][0];
+    if (is_plus_infinity(negated_l))
+      seq_i.lower_set_uninit(UNBOUNDED);
+    else {
+      neg_assign_r(tmp, negated_l, ROUND_DOWN);
+      seq_i.lower_set_uninit(tmp);
+    }
+
+    // Complete the interval initialization.
+    seq_i.complete_init();
+  }
   assert(OK());
 }
 
-template <typename Box>
-Grid::Grid(const Box& box, From_Covering_Box dummy)
-  : con_sys(),
-    gen_sys(NECESSARILY_CLOSED) {
-  used(dummy);
-
-  if (box.space_dimension() > max_space_dimension())
-    throw_space_dimension_overflow("Grid(box, from_covering_box)",
-				   "the space dimension of box "
-				   "exceeds the maximum allowed "
-				   "space dimension");
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const Octagonal_Shape<T>& oct, Complexity_Class)
+  : seq(oct.space_dimension() <= max_space_dimension()
+	? oct.space_dimension()
+	: (throw_space_dimension_overflow("Box(oct)",
+					  "oct exceeds the maximum "
+					  "allowed space dimension"),
+	   oct.space_dimension())),
+    status() {
+  // Expose all the interval constraints.
+  oct.strong_closure_assign();
+  if (oct.marked_empty()) {
+    set_empty();
+    return;
+  }
 
-  space_dim = box.space_dimension();
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
 
-  TEMP_INTEGER(l_n);
-  TEMP_INTEGER(l_d);
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
 
-  // Check that all bounds are closed.  This must be done before the
-  // empty check below, in case an open bound makes the grid empty.
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    bool closed;
-    // FIXME: Perhaps introduce box::is_bounded_and_closed.
-    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("Grid(box, from_covering_box)", "box");
-    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+  DIRTY_TEMP0(mpq_class, bound);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    const dimension_type ii = 2*i;
+    const dimension_type cii = ii + 1;
+
+    // Set the upper bound.
+    const typename Octagonal_Shape<T>::coefficient_type& twice_ub
+      = oct.matrix[cii][ii];
+    if (!is_plus_infinity(twice_ub)) {
+      assign_r(bound, twice_ub, ROUND_NOT_NEEDED);
+      div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED);
+      seq_i.upper_set_uninit(bound);
+    }
+    else
+      seq_i.upper_set_uninit(UNBOUNDED);
+
+    // Set the lower bound.
+    const typename Octagonal_Shape<T>::coefficient_type& twice_lb
+      = oct.matrix[ii][cii];
+    if (!is_plus_infinity(twice_lb)) {
+      assign_r(bound, twice_lb, ROUND_NOT_NEEDED);
+      neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+      div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED);
+      seq_i.lower_set_uninit(bound);
+    }
+    else
+      seq_i.lower_set_uninit(UNBOUNDED);
+    seq_i.complete_init();
   }
+}
 
-  if (box.is_empty()) {
-    // Empty grid.
+template <typename ITV>
+Box<ITV>::Box(const Polyhedron& ph, Complexity_Class complexity)
+  : seq(ph.space_dimension() <= max_space_dimension()
+	? ph.space_dimension()
+	: (throw_space_dimension_overflow("Box(ph)",
+					  "ph exceeds the maximum "
+					  "allowed space dimension"),
+	   ph.space_dimension())),
+    status() {
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  // We do not need to bother about `complexity' if:
+  // a) the polyhedron is already marked empty; or ...
+  if (ph.marked_empty()) {
     set_empty();
-    assert(OK());
     return;
   }
 
+  // b) the polyhedron is zero-dimensional; or ...
+  const dimension_type space_dim = ph.space_dimension();
   if (space_dim == 0)
-    set_zero_dim_univ();
-  else {
-    // Initialize the space dimension as indicated by the box.
-    con_sys.increase_space_dimension(space_dim);
-    // Add congruences according to `box'.
-    TEMP_INTEGER(u_n);
-    TEMP_INTEGER(u_d);
-    TEMP_INTEGER(d);
-    for (dimension_type k = space_dim; k-- > 0; ) {
-      bool closed;
-      // TODO: Consider producing the system(s) in minimized form.
-      // FIXME: Also create the generator system.
-      if (box.get_lower_bound(k, closed, l_n, l_d)) {
-	if (box.get_upper_bound(k, closed, u_n, u_d)) {
-	  if (l_n * u_d == u_n * l_d)
-	    // A point interval allows any point along the dimension
-	    // k axis.
-	    continue;
-	  gcd_assign(d, l_d, u_d);
-	  // `d' is the gcd of the divisors.
-	  l_n *= (u_d / d);
-	  d = l_d / d;
-	  // `d' is now the smallest integer expression of the size
-	  // of l_d relative to u_d.  `d * u_d' is the lcm of the
-	  // divisors.
-	  con_sys.insert((d * u_d * Variable(k) %= l_n) / ((u_n * d) - l_n));
-	}
+    return;
+
+  // c) the polyhedron is already described by a generator system.
+  if (ph.generators_are_up_to_date() && !ph.has_pending_constraints()) {
+    Box tmp(ph.generators());
+    swap(tmp);
+    return;
+  }
+
+  // Here generators are not up-to-date or there are pending constraints.
+  assert(ph.constraints_are_up_to_date());
+
+  if (complexity == POLYNOMIAL_COMPLEXITY) {
+    // Extract easy-to-find bounds from constraints.
+    Box tmp(ph.simplified_constraints(), Recycle_Input());
+    swap(tmp);
+  }
+  else if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(space_dim);
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+	     ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+	const Constraint& c = *i;
+	if (c.is_strict_inequality())
+	  lp.add_constraint(Linear_Expression(c) >= 0);
 	else
-	  // An interval bounded only from below produces an
-	  // equality.
-	  con_sys.insert(l_d * Variable(k) == l_n);
+	  lp.add_constraint(c);
+      }
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      set_empty();
+      return;
+    }
+    // Get all the bounds for the space dimensions.
+    Generator g(point());
+    DIRTY_TEMP0(mpq_class, bound);
+    DIRTY_TEMP(Coefficient, bound_num);
+    DIRTY_TEMP(Coefficient, bound_den);
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      ITV& seq_i = seq[i];
+      lp.set_objective_function(Variable(i));
+      // Evaluate upper bound.
+      lp.set_optimization_mode(MAXIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, bound_num, bound_den);
+	assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED);
+	assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED);
+	assert(is_canonical(bound));
+	seq_i.upper_set_uninit(bound);
       }
       else
-	if (box.get_upper_bound(k, closed, u_n, u_d))
-	  // An interval bounded only from above produces an equality.
-	  con_sys.insert(u_d * Variable(k) == u_n);
-	else {
-	  // Any universe interval produces an empty grid.
-	  set_empty();
-	  assert(OK());
-	  return;
-	}
+	seq_i.upper_set_uninit(UNBOUNDED);
+      // Evaluate optimal lower bound.
+      lp.set_optimization_mode(MINIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, bound_num, bound_den);
+	assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED);
+	assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED);
+	assert(is_canonical(bound));
+	seq_i.lower_set_uninit(bound);
+      }
+      else
+	seq_i.lower_set_uninit(UNBOUNDED);
+      seq_i.complete_init();
+    }
+  }
+  else {
+    assert(complexity == ANY_COMPLEXITY);
+    if (ph.is_empty())
+      set_empty();
+    else {
+      Box tmp(ph.generators());
+      swap(tmp);
     }
-    set_congruences_up_to_date();
-    gen_sys.set_sorted(false);
-    gen_sys.unset_pending_rows();
   }
-
-  assert(OK());
 }
 
-template <typename Box>
-void
-Grid::shrink_bounding_box(Box& box) const {
-  // Dimension-compatibility check.
-  if (space_dim > box.space_dimension())
-    throw_dimension_incompatible("shrink_bounding_box(box)", "box",
-				 box.space_dimension());
-
-  TEMP_INTEGER(l_n);
-  TEMP_INTEGER(l_d);
+template <typename ITV>
+Box<ITV>::Box(const Grid& gr, Complexity_Class)
+  : seq(gr.space_dimension() <= max_space_dimension()
+	? gr.space_dimension()
+	: (throw_space_dimension_overflow("Box(gr)",
+					  "gr exceeds the maximum "
+					  "allowed space dimension"),
+	   gr.space_dimension())),
+    status() {
 
-  // Check that all bounds are closed.
-  for (dimension_type k = space_dim; k-- > 0; ) {
-    bool closed;
-    // FIXME: Perhaps introduce box::is_bounded_and_closed.
-    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("shrink_bounding_box(box)", "box");
-    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
-      throw_invalid_argument("shrink_bounding_box(box)", "box");
-  }
+  // FIXME: here we are not taking advantage of intervals with restrictions!
 
-  if (marked_empty()) {
-    box.set_empty();
+  if (gr.marked_empty()) {
+    set_empty();
     return;
   }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  dimension_type space_dim = gr.space_dimension();
+
   if (space_dim == 0)
     return;
-  if (!generators_are_up_to_date() && !update_generators()) {
+
+  if (!gr.generators_are_up_to_date() && !gr.update_generators()) {
     // Updating found the grid empty.
-    box.set_empty();
+    set_empty();
     return;
   }
 
-  assert(gen_sys.num_generators() > 0);
-
-  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
-  dimension_type num_rows = gen_sys.num_generators();
+  assert(!gr.gen_sys.empty());
 
   // Create a vector to record which dimensions are bounded.
-  std::vector<bool> bounded_interval(num_dims, true);
+  std::vector<bool> bounded_interval(space_dim, true);
 
-  const Grid_Generator *first_point = NULL;
+  const Grid_Generator *first_point = 0;
   // Clear the bound flag in `bounded_interval' for all dimensions in
   // which a line or sequence of points extends away from a single
   // value in the dimension.
-  for (dimension_type row = 0; row < num_rows; ++row) {
-    Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
-    if (gen.is_point()) {
-      if (first_point == NULL) {
-	first_point = &gen_sys[row];
+  // FIXME: this computation should be provided by the Grid class.
+  // FIXME: remove the declaration making Box a friend of Grid_Generator
+  //        when this is done.
+  for (Grid_Generator_System::const_iterator gs_i = gr.gen_sys.begin(),
+	 gs_end = gr.gen_sys.end(); gs_i != gs_end; ++gs_i) {
+    Grid_Generator& g = const_cast<Grid_Generator&>(*gs_i);
+    if (g.is_point()) {
+      if (first_point == 0) {
+	first_point = &g;
 	continue;
       }
       const Grid_Generator& point = *first_point;
-      // Convert the point `gen' to a parameter.
-      for (dimension_type dim = 0; dim < num_dims; ++dim)
-	gen[dim] -= point[dim];
-      gen.divisor() = point.divisor();
+      // Convert the point `g' to a parameter.
+      for (dimension_type dim = space_dim; dim-- > 0; )
+	g[dim] -= point[dim];
+      g.set_divisor(point.divisor());
     }
-    for (dimension_type col = num_dims; col > 0; )
-      if (gen[col--] != 0)
+    for (dimension_type col = space_dim; col > 0; )
+      if (g[col--] != 0)
 	bounded_interval[col] = false;
   }
 
-  // Attempt to set both bounds of each boundable interval to the
-  // value of the associated coefficient in the point.
+  // For each dimension that is bounded by the grid, set both bounds
+  // of the interval to the value of the associated coefficient in a
+  // generator point.
+  assert(first_point != 0);
   const Grid_Generator& point = *first_point;
-  TEMP_INTEGER(divisor);
-  TEMP_INTEGER(gcd);
-  TEMP_INTEGER(bound);
-  TEMP_INTEGER(reduced_divisor);
-  divisor = point.divisor();
-  for (dimension_type dim = 0; dim < num_dims; ++dim)
-    if (bounded_interval[dim]) {
-      // Reduce the bound fraction first.
-      gcd_assign(gcd, point[dim+1], divisor);
-      exact_div_assign(bound, point[dim+1], gcd);
-      exact_div_assign(reduced_divisor, divisor, gcd);
-      box.raise_lower_bound(dim, true, bound, reduced_divisor);
-      box.lower_upper_bound(dim, true, bound, reduced_divisor);
+  DIRTY_TEMP0(mpq_class, bound);
+  const Coefficient& divisor = point.divisor();
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    if (bounded_interval[i]) {
+      assign_r(bound.get_num(), point[i+1], ROUND_NOT_NEEDED);
+      assign_r(bound.get_den(), divisor, ROUND_NOT_NEEDED);
+      bound.canonicalize();
+      seq_i.assign(bound);
     }
+    else
+      seq_i.assign(UNIVERSE);
+  }
 }
 
-template <typename Box>
-void
-Grid::get_covering_box(Box& box) const {
-  // Dimension-compatibility check.
-  if (space_dim > box.space_dimension())
-    throw_dimension_incompatible("get_covering_box(box)", "box",
-				 box.space_dimension());
+template <typename ITV>
+template <typename D1, typename D2, typename R>
+Box<ITV>::Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+              Complexity_Class complexity)
+  : seq(dp.space_dimension() <= max_space_dimension()
+	? dp.space_dimension()
+	: (throw_space_dimension_overflow("Box(dp)",
+					  "dp exceeds the maximum "
+					  "allowed space dimension"),
+	   dp.space_dimension())),
+    status() {
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
 
-  Box new_box(box.space_dimension());
+  for (dimension_type i = dp.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
 
-  if (marked_empty()) {
-    box = new_box;
-    box.set_empty();
-    return;
-  }
-  if (space_dim == 0) {
-    return;
-  }
-  if (!generators_are_up_to_date() && !update_generators()) {
-    // Updating found the grid empty.
-    box = new_box;
-    box.set_empty();
-    return;
+  {
+    Box tmp(dp.domain1(), complexity);
+    intersection_assign(tmp);
   }
 
-  assert(gen_sys.num_generators() > 0);
-
-  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
-  dimension_type num_rows = gen_sys.num_generators();
-
-  TEMP_INTEGER(divisor);
-  TEMP_INTEGER(gcd);
-  TEMP_INTEGER(bound);
-  TEMP_INTEGER(reduced_divisor);
-
-  if (num_rows > 1) {
-    Row interval_sizes(num_dims, Row::Flags());
-    std::vector<bool> interval_emptiness(num_dims, false);
-
-    // Store in `interval_sizes', for each column (that is, for each
-    // dimension), the GCD of all the values in that column where the
-    // row is of type parameter.
-
-    for (dimension_type dim = num_dims; dim-- > 0; )
-      interval_sizes[dim] = 0;
-    const Grid_Generator *first_point = NULL;
-    for (dimension_type row = 0; row < num_rows; ++row) {
-      Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
-      if (gen.is_line()) {
-	for (dimension_type dim = 0; dim < num_dims; ++dim)
-	  if (!interval_emptiness[dim] && gen[dim+1] != 0) {
-	    // Empty interval, set both bounds for associated
-      	    // dimension to zero.
-	    new_box.lower_upper_bound(dim, true, 0, 1);
-	    new_box.raise_lower_bound(dim, true, 0, 1);
-	    interval_emptiness[dim] = true;
-	  }
-	continue;
-      }
-      if (gen.is_point()) {
-	if (first_point == NULL) {
-	  first_point = &gen_sys[row];
-	  continue;
-	}
-	const Grid_Generator& point = *first_point;
-	// Convert the point `gen' to a parameter.
-	for (dimension_type dim = 0; dim <= num_dims; ++dim)
-	  gen[dim] -= point[dim];
-	gen.divisor() = point.divisor();
-      }
-      for (dimension_type dim = 0; dim < num_dims; ++dim)
-	if (!interval_emptiness[dim])
-	  gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
-    }
-
-    // For each dimension set the lower bound of the interval to the
-    // grid value closest to the origin, and the upper bound to the
-    // addition of the lower bound and the shortest distance in the
-    // given dimension between any two grid points.
-    const Grid_Generator& point = *first_point;
-    divisor = point.divisor();
-    TEMP_INTEGER(lower_bound);
-    for (dimension_type dim = 0; dim < num_dims; ++dim) {
-      if (interval_emptiness[dim])
-	continue;
-
-      lower_bound = point[dim+1];
-
-      // If the interval size is zero then all points have the same
-      // value in this dimension, so set only the lower bound.
-      if (interval_sizes[dim] != 0) {
-	// Make the lower bound as close as possible to the origin,
-	// leaving the sign the same.
-	lower_bound %= interval_sizes[dim];
-	// Check if the lowest value the other side of the origin is
-	// closer to the origin, prefering the lowest positive if they
-	// are equal.
-	if (lower_bound > 0) {
-	  if (interval_sizes[dim] - lower_bound < lower_bound)
-	    lower_bound -= interval_sizes[dim];
-	}
-	else if (lower_bound < 0
-		 && interval_sizes[dim] + lower_bound < - lower_bound)
-	  lower_bound += interval_sizes[dim];
-
-	// Reduce the bound fraction first.
-	bound = interval_sizes[dim] + lower_bound;
-	gcd_assign(gcd, bound, divisor);
-	exact_div_assign(bound, bound, gcd);
-	exact_div_assign(reduced_divisor, divisor, gcd);
-	new_box.lower_upper_bound(dim, true, bound, reduced_divisor);
-      }
-
-      // Reduce the bound fraction first.
-      gcd_assign(gcd, lower_bound, divisor);
-      exact_div_assign(lower_bound, lower_bound, gcd);
-      exact_div_assign(reduced_divisor, divisor, gcd);
-      new_box.raise_lower_bound(dim, true, lower_bound, reduced_divisor);
-    }
-  }
-  else {
-    const Grid_Generator& point = gen_sys[0];
-    divisor = point.divisor();
-    // The covering box of a single point has only lower bounds.
-    for (dimension_type dim = 0; dim < num_dims; ++dim) {
-      // Reduce the bound fraction first.
-      gcd_assign(gcd, point[dim+1], divisor);
-      exact_div_assign(bound, point[dim+1], gcd);
-      exact_div_assign(reduced_divisor, divisor, gcd);
-      new_box.raise_lower_bound(dim, true, bound, reduced_divisor);
-    }
+  {
+    Box tmp(dp.domain2(), complexity);
+    intersection_assign(tmp);
   }
-
-  box = new_box;
 }
 
-template <typename Partial_Function>
-void
-Grid::map_space_dimensions(const Partial_Function& pfunc) {
-  if (space_dim == 0)
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
     return;
 
-  if (pfunc.has_empty_codomain()) {
-    // All dimensions vanish: the grid becomes zero_dimensional.
-    if (marked_empty()
-	|| (!generators_are_up_to_date() && !update_generators())) {
-      // Removing all dimensions from the empty grid.
-      space_dim = 0;
-      set_empty();
-    }
-    else
-      // Removing all dimensions from a non-empty grid.
-      set_zero_dim_univ();
+  // To embed an n-dimension space box in a (n+m)-dimension space,
+  // we just add `m' new universe elements to the sequence.
+  seq.insert(seq.end(), m, ITV());
+  for (dimension_type sz = seq.size(), i = sz - m; i < sz; ++i)
+    seq[i].assign(UNIVERSE);
+  assert(OK());
+}
 
-    assert(OK());
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
     return;
-  }
 
-  dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+  // A add `m' new zero elements to the sequence.
+  seq.insert(seq.end(), m, ITV());
+  for (dimension_type sz = seq.size(), i = sz - m; i < sz; ++i)
+    seq[i].assign(0);
 
-  if (new_space_dimension == space_dim) {
-    // The partial function `pfunc' is indeed total and thus specifies
-    // a permutation, that is, a renaming of the dimensions.  For
-    // maximum efficiency, we will simply permute the columns of the
-    // constraint system and/or the generator system.
+  assert(OK());
+}
 
-    // We first compute suitable permutation cycles for the columns of
-    // the `con_sys' and `gen_sys' matrices.  We will represent them
-    // with a linear array, using 0 as a terminator for each cycle
-    // (notice that the columns with index 0 of `con_sys' and
-    // `gen_sys' represent the inhomogeneous terms, and thus are
-    // unaffected by the permutation of dimensions).
-    // Cycles of length 1 will be omitted so that, in the worst case,
-    // we will have `space_dim' elements organized in `space_dim/2'
-    // cycles, which means we will have at most `space_dim/2'
-    // terminators.
-    std::vector<dimension_type> cycles;
-    cycles.reserve(space_dim + space_dim/2);
+template <typename ITV>
+bool
+operator==(const Box<ITV>& x, const Box<ITV>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
 
-    // Used to mark elements as soon as they are inserted in a cycle.
-    std::deque<bool> visited(space_dim);
+  if (x.is_empty())
+    return y.is_empty();
 
-    for (dimension_type i = space_dim; i-- > 0; ) {
-      if (!visited[i]) {
-	dimension_type j = i;
-	do {
-	  visited[j] = true;
-	  dimension_type k;
-	  (void) pfunc.maps(j, k);
-	  if (k == j)
-	    // Cycle of length 1: skip it.
-	    goto skip;
+  if (y.is_empty())
+    return x.is_empty();
 
-	  cycles.push_back(j+1);
-	  // Go along the cycle.
-	  j = k;
-	} while (!visited[j]);
-	// End of cycle: mark it.
-	cycles.push_back(0);
-      skip:
-	;
-      }
-    }
+  for (dimension_type k = x_space_dim; k-- > 0; )
+    if (x.seq[k] != y.seq[k])
+      return false;
+  return true;
+}
 
-    // If `cycles' is empty then `pfunc' is the identity.
-    if (cycles.empty())
-      return;
+template <typename ITV>
+bool
+Box<ITV>::bounds(const Linear_Expression& expr, const bool from_above) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+				  ? "bounds_from_above(e)"
+				  : "bounds_from_below(e)"), "e", expr);
+  // A zero-dimensional or empty Box bounds everything.
+  if (space_dim == 0 || is_empty())
+    return true;
 
-    // Permute all that is up-to-date.
-    if (congruences_are_up_to_date()) {
-      con_sys.permute_columns(cycles);
-      clear_congruences_minimized();
+  const int from_above_sign = from_above ? 1 : -1;
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    switch (sgn(expr.coefficient(Variable(i))) * from_above_sign) {
+    case 1:
+      if (seq[i].upper_is_unbounded())
+	return false;
+      break;
+    case 0:
+      // Nothing to do.
+      break;
+    case -1:
+      if (seq[i].lower_is_unbounded())
+	return false;
+      break;
     }
+  return true;
+}
 
-    if (generators_are_up_to_date()) {
-      gen_sys.permute_columns(cycles);
-      clear_generators_minimized();
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+		  const Constraint::Type constraint_type,
+		  Coefficient_traits::const_reference num,
+		  Coefficient_traits::const_reference den) {
+
+  if (i.is_universe())
+    return Poly_Con_Relation::strictly_intersects();
+
+  DIRTY_TEMP0(mpq_class, bound);
+  assign_r(bound.get_num(), num, ROUND_NOT_NEEDED);
+  assign_r(bound.get_den(), den, ROUND_NOT_NEEDED);
+  bound.canonicalize();
+  neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+  const bool is_lower_bound = (den > 0);
+
+  DIRTY_TEMP0(mpq_class, bound_diff);
+  if (constraint_type == Constraint::EQUALITY) {
+    if (i.lower_is_unbounded()) {
+      assert(!i.upper_is_unbounded());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::strictly_intersects();
+      case 0:
+	return i.upper_is_open()
+	  ? Poly_Con_Relation::is_disjoint()
+	  : Poly_Con_Relation::strictly_intersects();
+      case -1:
+	return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::is_disjoint();
+      case 0:
+	if (i.lower_is_open())
+	  return Poly_Con_Relation::is_disjoint();
+        if (i.is_singleton())
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+	if (i.upper_is_unbounded())
+	  return Poly_Con_Relation::strictly_intersects();
+	else {
+	  assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+	  sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+	  switch (sgn(bound_diff)) {
+	  case 1:
+	    return Poly_Con_Relation::strictly_intersects();
+	  case 0:
+	    if (i.upper_is_open())
+	      return Poly_Con_Relation::is_disjoint();
+	    else
+	      return Poly_Con_Relation::strictly_intersects();
+	  case -1:
+	    return Poly_Con_Relation::is_disjoint();
+	  }
+	}
+      }
     }
-
-    assert(OK());
-    return;
-  }
-
-  // If control gets here, then `pfunc' is not a permutation and some
-  // dimensions must be projected away.
-
-  const Grid_Generator_System& old_gensys = generators();
-
-  if (old_gensys.num_generators() == 0) {
-    // The grid is empty.
-    Grid new_grid(new_space_dimension, EMPTY);
-    std::swap(*this, new_grid);
-    assert(OK());
-    return;
   }
 
-  // Make a local copy of the partial function.
-  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
-  for (dimension_type j = space_dim; j-- > 0; ) {
-    dimension_type pfunc_j;
-    if (pfunc.maps(j, pfunc_j))
-      pfunc_maps[j] = pfunc_j;
+  assert(constraint_type != Constraint::EQUALITY);
+  if (is_lower_bound) {
+    if (i.lower_is_unbounded()) {
+      assert(!i.upper_is_unbounded());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::strictly_intersects();
+      case 0:
+	if (constraint_type == Constraint::STRICT_INEQUALITY
+	    || i.upper_is_open())
+	  return Poly_Con_Relation::is_disjoint();
+	else
+	  return Poly_Con_Relation::strictly_intersects();
+      case -1:
+	return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+	return Poly_Con_Relation::is_included();
+      case 0:
+	if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+	    || i.lower_is_open()) {
+	  Poly_Con_Relation result = Poly_Con_Relation::is_included();
+	  if (i.is_singleton())
+	    result = result && Poly_Con_Relation::saturates();
+	  return result;
+	}
+	else {
+	  assert(constraint_type == Constraint::STRICT_INEQUALITY
+		 && !i.lower_is_open());
+	  if (i.is_singleton())
+	    return Poly_Con_Relation::is_disjoint()
+	      && Poly_Con_Relation::saturates();
+	  else
+	    return Poly_Con_Relation::strictly_intersects();
+	}
+      case -1:
+	if (i.upper_is_unbounded())
+	  return Poly_Con_Relation::strictly_intersects();
+	else {
+	  assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+	  sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+	  switch (sgn(bound_diff)) {
+	  case 1:
+	    return Poly_Con_Relation::strictly_intersects();
+	  case 0:
+	    if (constraint_type == Constraint::STRICT_INEQUALITY
+		|| i.upper_is_open())
+	      return Poly_Con_Relation::is_disjoint();
+	    else
+	      return Poly_Con_Relation::strictly_intersects();
+	  case -1:
+	    return Poly_Con_Relation::is_disjoint();
+	  }
+	}
+      }
+    }
   }
-
-  Grid_Generator_System new_gensys;
-  // Set sortedness, for the assertion met via gs::insert.
-  new_gensys.set_sorted(false);
-  // Get the divisor of the first point.
-  Grid_Generator_System::const_iterator i;
-  Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
-  for (i = old_gensys.begin(); i != old_gensys_end; ++i)
-    if (i->is_point())
-      break;
-  assert(i != old_gensys_end);
-  Coefficient_traits::const_reference system_divisor = i->divisor();
-  for (Grid_Generator_System::const_iterator i = old_gensys.begin();
-       i != old_gensys_end;
-       ++i) {
-    const Grid_Generator& old_g = *i;
-    Linear_Expression e(0 * Variable(new_space_dimension-1));
-    bool all_zeroes = true;
-    for (dimension_type j = space_dim; j-- > 0; ) {
-      if (old_g.coefficient(Variable(j)) != 0
-	  && pfunc_maps[j] != not_a_dimension()) {
-	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
-	all_zeroes = false;
+  else {
+    // `c' is an upper bound.
+    if (i.upper_is_unbounded())
+      return Poly_Con_Relation::strictly_intersects();
+    else {
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case -1:
+	return Poly_Con_Relation::is_included();
+      case 0:
+	if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+	    || i.upper_is_open()) {
+	  Poly_Con_Relation result = Poly_Con_Relation::is_included();
+	  if (i.is_singleton())
+	    result = result && Poly_Con_Relation::saturates();
+	  return result;
+	}
+	else {
+	  assert(constraint_type == Constraint::STRICT_INEQUALITY
+		 && !i.upper_is_open());
+	  if (i.is_singleton())
+	    return Poly_Con_Relation::is_disjoint()
+	      && Poly_Con_Relation::saturates();
+	  else
+	    return Poly_Con_Relation::strictly_intersects();
+	}
+      case 1:
+	if (i.lower_is_unbounded())
+	  return Poly_Con_Relation::strictly_intersects();
+	else {
+	  assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+	  sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+	  switch (sgn(bound_diff)) {
+	  case -1:
+	    return Poly_Con_Relation::strictly_intersects();
+	  case 0:
+	    if (constraint_type == Constraint::STRICT_INEQUALITY
+		|| i.lower_is_open())
+	      return Poly_Con_Relation::is_disjoint();
+	    else
+	      return Poly_Con_Relation::strictly_intersects();
+	  case 1:
+	    return Poly_Con_Relation::is_disjoint();
+	  }
+	}
       }
     }
-    switch (old_g.type()) {
-    case Grid_Generator::LINE:
-      if (!all_zeroes)
-	new_gensys.insert(grid_line(e));
-      break;
-    case Grid_Generator::PARAMETER:
-      if (!all_zeroes)
-	new_gensys.insert(parameter(e, system_divisor));
-      break;
-    case Grid_Generator::POINT:
-      new_gensys.insert(grid_point(e, old_g.divisor()));
-      break;
-    case Grid_Generator::CLOSURE_POINT:
-    default:
-      assert(0);
-    }
   }
 
-  Grid new_grid(new_gensys);
-  std::swap(*this, new_grid);
-
-  assert(OK(true));
+  // Quiet a compiler warning: this program point is unreachable.
+  throw std::runtime_error("PPL internal error");
 }
 
-} // namespace Parma_Polyhedra_Library
-
-// Automatically generated from PPL source file ../src/Grid.defs.hh line 2484
-
-// Automatically generated from PPL source file ../src/C_Polyhedron.defs.hh line 1
-/* C_Polyhedron class declaration.
-*/
-
-
-// Automatically generated from PPL source file ../src/C_Polyhedron.defs.hh line 29
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  const dimension_type space_dim = space_dimension();
 
-//! A closed convex polyhedron.
-/*! \ingroup PPL_CXX_interface
-    An object of the class C_Polyhedron represents a
-    <EM>topologically closed</EM> convex polyhedron
-    in the vector space \f$\Rset^n\f$.
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
 
-    When building a closed polyhedron starting from
-    a system of constraints, an exception is thrown if the system
-    contains a <EM>strict inequality</EM> constraint.
-    Similarly, an exception is thrown when building a closed polyhedron
-    starting from a system of generators containing a <EM>closure point</EM>.
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
 
-    \note
-    Such an exception will be obtained even if the system of
-    constraints (resp., generators) actually defines
-    a topologically closed subset of the vector space, i.e.,
-    even if all the strict inequalities (resp., closure points)
-    in the system happen to be redundant with respect to the
-    system obtained by removing all the strict inequality constraints
-    (resp., all the closure points).
-    In contrast, when building a closed polyhedron starting from
-    an object of the class NNC_Polyhedron,
-    the precise topological closure test will be performed.
-*/
+   if (space_dim == 0) {
+    if (cg.is_trivial_false())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+  }
 
-class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
-public:
-  //! Builds either the universe or the empty C polyhedron.
-  /*!
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the C polyhedron;
+  if (cg.is_equality()) {
+    const Constraint c(cg);
+    return relation_with(c);
+  }
 
-    \param kind
-    Specifies whether a universe or an empty C polyhedron should be built.
+  DIRTY_TEMP0(Rational_Interval, r);
+  DIRTY_TEMP0(Rational_Interval, t);
+  DIRTY_TEMP0(mpq_class, m);
+  r = 0;
+  for (dimension_type i = cg.space_dimension(); i-- > 0; ) {
+    const Coefficient& cg_i = cg.coefficient(Variable(i));
+    if (sgn(cg_i) != 0) {
+      assign_r(m, cg_i, ROUND_NOT_NEEDED);
+      // FIXME: an add_mul_assign() method would come handy here.
+      t = seq[i];
+      t *= m;
+      r += t;
+    }
+  }
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  if (r.lower_is_unbounded() || r.upper_is_unbounded())
+    return Poly_Con_Relation::strictly_intersects();
 
-    Both parameters are optional:
-    by default, a 0-dimension space universe C polyhedron is built.
-  */
-  explicit C_Polyhedron(dimension_type num_dimensions = 0,
-			Degenerate_Element kind = UNIVERSE);
 
-  //! Builds a C polyhedron from a system of constraints.
-  /*!
-    The polyhedron inherits the space dimension of the constraint system.
+  // Find the value that satisfies the congruence and is
+  // nearest to the lower bound such that the point lies on or above it.
 
-    \param cs
-    The system of constraints defining the polyhedron.
+  TEMP_INTEGER(lower);
+  TEMP_INTEGER(mod);
+  TEMP_INTEGER(v);
+  mod = cg.modulus();
+  v = cg.inhomogeneous_term() % mod;
+  assign_r(lower, r.lower(), ROUND_DOWN);
+  v -= ((lower / mod) * mod);
+  if (v + lower > 0)
+    v -= mod;
+  return interval_relation(r, Constraint::EQUALITY, v);
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of constraints contains strict inequalities.
-  */
-  explicit C_Polyhedron(const Constraint_System& cs);
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
 
-  //! Builds a C polyhedron recycling a system of constraints.
-  /*!
-    The polyhedron inherits the space dimension of the constraint system.
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
 
-    \param cs
-    The system of constraints defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
 
-    \exception std::invalid_argument
-    Thrown if the system of constraints contains strict inequalities.
-  */
-  explicit C_Polyhedron(Constraint_System& cs);
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+	|| (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
 
-  //! Builds a C polyhedron from a system of generators.
-  /*!
-    The polyhedron inherits the space dimension of the generator system.
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+
+  if (extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var))
+    if (c_num_vars == 0)
+      // c is a trivial constraint.
+      switch (sgn(c.inhomogeneous_term())) {
+      case -1:
+	return Poly_Con_Relation::is_disjoint();
+      case 0:
+	if (c.is_strict_inequality())
+	  return Poly_Con_Relation::saturates()
+	    && Poly_Con_Relation::is_disjoint();
+	else
+	  return Poly_Con_Relation::saturates()
+	    && Poly_Con_Relation::is_included();
+      case 1:
+	return Poly_Con_Relation::is_included();
+      }
+    else {
+      // c is an interval constraint.
+      return interval_relation(seq[c_only_var],
+			       c.type(),
+			       c.inhomogeneous_term(),
+			       c.coefficient(Variable(c_only_var)));
+    }
+  else {
+    // Deal with a non-trivial and non-interval constraint.
+    DIRTY_TEMP0(Rational_Interval, r);
+    DIRTY_TEMP0(Rational_Interval, t);
+    DIRTY_TEMP0(mpq_class, m);
+    r = 0;
+    for (dimension_type i = c.space_dimension(); i-- > 0; ) {
+      const Coefficient& c_i = c.coefficient(Variable(i));
+      if (sgn(c_i) != 0) {
+        assign_r(m, c_i, ROUND_NOT_NEEDED);
+	// FIXME: an add_mul_assign() method would come handy here.
+	t = seq[i];
+	t *= m;
+	r += t;
+      }
+    }
+    return interval_relation(r,
+			     c.type(),
+			     c.inhomogeneous_term());
+  }
 
-    \param gs
-    The system of generators defining the polyhedron.
+  // Quiet a compiler warning: this program point is unreachable.
+  throw std::runtime_error("PPL internal error");
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points,
-    or if it contains closure points.
-  */
-  explicit C_Polyhedron(const Generator_System& gs);
+template <typename ITV>
+Poly_Gen_Relation
+Box<ITV>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
 
-  //! Builds a C polyhedron recycling a system of generators.
-  /*!
-    The polyhedron inherits the space dimension of the generator system.
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
 
-    \param gs
-    The system of generators defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
+  // The empty box cannot subsume a generator.
+  if (is_empty())
+    return Poly_Gen_Relation::nothing();
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points,
-    or if it contains closure points.
-  */
-  explicit C_Polyhedron(Generator_System& gs);
+  // A universe box in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
 
-  //! Builds a C polyhedron from a system of congruences.
-  /*!
-    The polyhedron inherits the space dimension of the congruence system.
+  if (g.is_line_or_ray()) {
+    if (g.is_line()) {
+      for (dimension_type i = g_space_dim; i-- > 0; )
+	if (g.coefficient(Variable(i)) != 0 && !seq[i].is_universe())
+	  return Poly_Gen_Relation::nothing();
+      return Poly_Gen_Relation::subsumes();
+    }
+    else {
+      assert(g.is_ray());
+      for (dimension_type i = g_space_dim; i-- > 0; )
+	switch (sgn(g.coefficient(Variable(i)))) {
+	case 1:
+	  if (!seq[i].upper_is_unbounded())
+	    return Poly_Gen_Relation::nothing();
+	  break;
+	case 0:
+	  break;
+	case -1:
+	  if (!seq[i].lower_is_unbounded())
+	    return Poly_Gen_Relation::nothing();
+	  break;
+	}
+      return Poly_Gen_Relation::subsumes();
+    }
+  }
 
-    \param cgs
-    The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
-  */
-  explicit C_Polyhedron(const Congruence_System& cgs);
+  // Here `g' is a point or closure point.
+  const Coefficient& g_divisor = g.divisor();
+  DIRTY_TEMP0(mpq_class, g_coord);
+  DIRTY_TEMP0(mpq_class, bound);
+  for (dimension_type i = g_space_dim; i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    if (seq_i.is_universe())
+      continue;
+    assign_r(g_coord.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    assign_r(g_coord.get_den(), g_divisor, ROUND_NOT_NEEDED);
+    g_coord.canonicalize();
+    // Check lower bound.
+    if (!seq_i.lower_is_unbounded()) {
+      assign_r(bound, seq_i.lower(), ROUND_NOT_NEEDED);
+      if (g_coord <= bound) {
+	if (seq_i.lower_is_open()) {
+	  if (g.is_point() || g_coord != bound)
+	    return Poly_Gen_Relation::nothing();
+	}
+	else if (g_coord != bound)
+	  return Poly_Gen_Relation::nothing();
+      }
+    }
+    // Check upper bound.
+    if (!seq_i.upper_is_unbounded()) {
+      assign_r(bound, seq_i.upper(), ROUND_NOT_NEEDED);
+      if (g_coord >= bound) {
+	if (seq_i.upper_is_open()) {
+	  if (g.is_point() || g_coord != bound)
+	    return Poly_Gen_Relation::nothing();
+	}
+	else if (g_coord != bound)
+	  return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+  return Poly_Gen_Relation::subsumes();
+}
 
-  //! Builds an C polyhedron recycling a system of congruences.
-  /*!
-    The polyhedron inherits the space dimension of the congruence
-    system.
 
-    \param cgs
-    The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
-  */
-  explicit C_Polyhedron(Congruence_System& cgs);
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+				  ? "maximize(e, ...)"
+				  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim Box first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
 
-  /*! \brief
-    Builds a C polyhedron representing the topological closure
-    of the NNC polyhedron \p y.
-  */
-  explicit C_Polyhedron(const NNC_Polyhedron& y);
+  // For an empty Box we simply return false.
+  if (is_empty())
+    return false;
 
-  //! Builds a C polyhedron out of a generic, interval-based bounding box.
-  /*!
-    For a description of the methods that should be provided by
-    the template class Box, see the documentation of the protected method:
-      template \<typename Box\>
-      Polyhedron::Polyhedron(Topology topol, const Box& box);
+  DIRTY_TEMP0(mpq_class, result);
+  assign_r(result, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  bool is_included = true;
+  const int maximize_sign = maximize ? 1 : -1;
+  DIRTY_TEMP0(mpq_class, bound_i);
+  DIRTY_TEMP0(mpq_class, expr_i);
+  for (dimension_type i = expr_space_dim; i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    assign_r(expr_i, expr.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    switch (sgn(expr_i) * maximize_sign) {
+    case 1:
+      if (seq_i.upper_is_unbounded())
+	return false;
+      assign_r(bound_i, seq_i.upper(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.upper_is_open())
+	is_included = false;
+      break;
+    case 0:
+      // Nothing to do.
+      break;
+    case -1:
+      if (seq_i.lower_is_unbounded())
+	return false;
+      assign_r(bound_i, seq_i.lower(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.lower_is_open())
+	is_included = false;
+      break;
+    }
+  }
+  // Extract output info.
+  assert(is_canonical(result));
+  ext_n = result.get_num();
+  ext_d = result.get_den();
+  included = is_included;
+  return true;
+}
 
-    \param box
-    The bounding box representing the polyhedron to be built;
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included,
+                  Generator& g) const {
+  if (!max_min(expr, maximize, ext_n, ext_d, included))
+    return false;
 
-    \param dummy
-    A dummy tag to syntactically differentiate this one from the other
-    constructors.
+  // Compute generator `g'.
+  Linear_Expression g_expr;
+  DIRTY_TEMP(Coefficient, g_divisor);
+  g_divisor = 1;
+  const int maximize_sign = maximize ? 1 : -1;
+  DIRTY_TEMP0(mpq_class, g_coord);
+  DIRTY_TEMP(Coefficient, num);
+  DIRTY_TEMP(Coefficient, den);
+  DIRTY_TEMP(Coefficient, lcm);
+  DIRTY_TEMP(Coefficient, factor);
+  for (dimension_type i = space_dimension(); i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    switch (sgn(expr.coefficient(Variable(i))) * maximize_sign) {
+    case 1:
+      assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+      break;
+    case 0:
+      // If 0 belongs to the interval, choose it
+      // (and directly proceed to the next iteration).
+      // FIXME: name qualification issue.
+      if (seq_i.contains(0))
+	continue;
+      if (!seq_i.lower_is_unbounded())
+	if (seq_i.lower_is_open())
+	  if (!seq_i.upper_is_unbounded())
+	    if (seq_i.upper_is_open()) {
+	      // Bounded and open interval: compute middle point.
+	      assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+	      DIRTY_TEMP0(mpq_class, q_seq_i_upper);
+	      assign_r(q_seq_i_upper, seq_i.upper(), ROUND_NOT_NEEDED);
+	      g_coord += q_seq_i_upper;
+	      g_coord /= 2;
+	    }
+	    else
+	      // The upper bound is in the interval.
+	      assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+	  else {
+	    // Lower is open, upper is unbounded.
+	    assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+	    ++g_coord;
+	  }
+	else
+	  // The lower bound is in the interval.
+	  assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      else {
+	// Lower is unbounded, hence upper is bounded
+	// (since we know that 0 does not belong to the interval).
+	assert(!seq_i.upper_is_unbounded());
+	assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+	if (seq_i.upper_is_open())
+	  --g_coord;
+      }
+      break;
+    case -1:
+      assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      break;
+    }
+    // Add g_coord * Variable(i) to the generator.
+    assign_r(den, g_coord.get_den(), ROUND_NOT_NEEDED);
+    lcm_assign(lcm, g_divisor, den);
+    exact_div_assign(factor, lcm, g_divisor);
+    g_expr *= factor;
+    exact_div_assign(factor, lcm, den);
+    assign_r(num, g_coord.get_num(), ROUND_NOT_NEEDED);
+    num *= factor;
+    g_expr += num * Variable(i);
+    g_divisor = lcm;
+  }
+  g = Generator::point(g_expr, g_divisor);
+  return true;
+}
 
-    \exception std::length_error
-    Thrown if the space dimension of \p box exceeds the maximum allowed
-    space dimension.
+template <typename ITV>
+bool
+Box<ITV>::contains(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("contains(y)", y);
 
-    \exception std::invalid_argument
-    Thrown if \p box has intervals that are not topologically closed
-    (i.e., having some finite but open bounds).
-  */
-  template <typename Box>
-  C_Polyhedron(const Box& box, From_Bounding_Box dummy);
+  // If `y' is empty, then `x' contains `y'.
+  if (y.is_empty())
+    return true;
 
-  //! Ordinary copy-constructor.
-  C_Polyhedron(const C_Polyhedron& y);
+  // If `x' is empty, then `x' cannot contain `y'.
+  if (x.is_empty())
+    return false;
 
-  /*! \brief
-    The assignment operator.
-    (\p *this and \p y can be dimension-incompatible.)
-  */
-  C_Polyhedron& operator=(const C_Polyhedron& y);
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (!x.seq[k].contains(y.seq[k]))
+      return false;
+  return true;
+}
 
-  //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
-  C_Polyhedron& operator=(const NNC_Polyhedron& y);
+template <typename ITV>
+bool
+Box<ITV>::is_disjoint_from(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("is_disjoint_from(y)", y);
 
-  //! Destructor.
-  ~C_Polyhedron();
+  // If any of `x' or `y' is marked empty, then they are disjoint.
+  // Note: no need to use `is_empty', as the following loop is anyway correct.
+  if (x.marked_empty() || y.marked_empty())
+    return true;
 
-  /*! \brief
-    If the poly-hull of \p *this and \p y is exact it is assigned
-    to \p *this and <CODE>true</CODE> is returned,
-    otherwise <CODE>false</CODE> is returned.
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (x.seq[k].is_disjoint_from(y.seq[k]))
+      return true;
+  return false;
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+template <typename ITV>
+bool
+Box<ITV>::OK() const {
+  if (status.test_empty_up_to_date() && !status.test_empty()) {
+    Box tmp = *this;
+    tmp.reset_empty_up_to_date();
+    if (tmp.check_empty()) {
+#ifndef NDEBUG
+      std::cerr << "The box is empty, but it is marked as non-empty."
+		<< std::endl;
+#endif // NDEBUG
+      return false;
+    }
+  }
 
-  //! Same as poly_hull_assign_if_exact(y).
-  bool upper_bound_assign_if_exact(const C_Polyhedron& y);
-};
+  // A box that is not marked empty must have meaningful intervals.
+  if (!marked_empty()) {
+    for (dimension_type k = seq.size(); k-- > 0; )
+      if (!seq[k].OK())
+	return false;
+  }
 
-// Automatically generated from PPL source file ../src/C_Polyhedron.inlines.hh line 1
-/* C_Polyhedron class implementation: inline functions.
-*/
+  return true;
+}
 
+template <typename ITV>
+dimension_type
+Box<ITV>::affine_dimension() const {
+  dimension_type d = space_dimension();
+  // A zero-space-dim box always has affine dimension zero.
+  if (d == 0)
+    return 0;
 
-#include <algorithm>
-#include <stdexcept>
+  // An empty box has affine dimension zero.
+  if (is_empty())
+    return 0;
 
-namespace Parma_Polyhedra_Library {
+  for (dimension_type k = d; k-- > 0; )
+    if (seq[k].is_singleton())
+      --d;
 
-inline
-C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
-			   Degenerate_Element kind)
-  : Polyhedron(NECESSARILY_CLOSED,
-	       num_dimensions <= max_space_dimension()
-	       ? num_dimensions
-	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(n, k)",
-						 "n exceeds the maximum "
-						 "allowed space dimension"),
-		  num_dimensions),
-	       kind) {
+  return d;
 }
 
-inline
-C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
-  : Polyhedron(NECESSARILY_CLOSED,
-	       cs.space_dimension() <= max_space_dimension()
-	       ? cs
-	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
-						 "the space dimension of cs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), cs)) {
+template <typename ITV>
+bool
+Box<ITV>::check_empty() const {
+  assert(!marked_empty());
+  Box<ITV>& x = const_cast<Box<ITV>&>(*this);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (seq[k].is_empty()) {
+      x.set_empty();
+      return true;
+    }
+  x.set_nonempty();;
+  return false;
 }
 
-inline
-C_Polyhedron::C_Polyhedron(Constraint_System& cs)
-  : Polyhedron(NECESSARILY_CLOSED,
-	       cs.space_dimension() <= max_space_dimension()
-	       ? cs
-	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
-						 "the space dimension of cs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), cs)) {
+template <typename ITV>
+bool
+Box<ITV>::is_universe() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_universe())
+      return false;
+  return true;
 }
 
-inline
-C_Polyhedron::C_Polyhedron(const Generator_System& gs)
-  : Polyhedron(NECESSARILY_CLOSED,
-	       gs.space_dimension() <= max_space_dimension()
-	       ? gs
-	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
-						 "the space dimension of gs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), gs)){
-}
+template <typename ITV>
+bool
+Box<ITV>::is_topologically_closed() const {
+  if (!ITV::info_type::store_open || is_empty())
+    return true;
 
-inline
-C_Polyhedron::C_Polyhedron(Generator_System& gs)
-  : Polyhedron(NECESSARILY_CLOSED,
-	       gs.space_dimension() <= max_space_dimension()
-	       ? gs
-	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(cs)",
-						 "the space dimension of gs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), gs)){
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_topologically_closed())
+      return false;
+  return true;
 }
 
-template <typename Box>
-inline
-C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
-  : Polyhedron(NECESSARILY_CLOSED,
-	       box.space_dimension() <= max_space_dimension()
-	       ? box
-	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
-						 "C_Polyhedron(box): ",
-						 "the space dimension of box "
-						 "exceeds the maximum allowed "
-						 "space dimension"), box)) {
+template <typename ITV>
+bool
+Box<ITV>::is_discrete() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_singleton())
+      return false;
+  return true;
 }
 
-inline
-C_Polyhedron::C_Polyhedron(const C_Polyhedron& y)
-  : Polyhedron(y) {
+template <typename ITV>
+bool
+Box<ITV>::is_bounded() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (seq[k].is_unbounded())
+      return false;
+  return true;
 }
 
-inline C_Polyhedron&
-C_Polyhedron::operator=(const C_Polyhedron& y) {
-  Polyhedron::operator=(y);
-  return *this;
+template <typename ITV>
+bool
+Box<ITV>::contains_integer_point() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].contains_integer_point())
+      return false;
+  return true;
 }
 
-inline C_Polyhedron&
-C_Polyhedron::operator=(const NNC_Polyhedron& y) {
-  C_Polyhedron c_y(y);
-  swap(c_y);
-  return *this;
-}
+template <typename ITV>
+bool
+Box<ITV>::constrains(Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
 
-inline
-C_Polyhedron::~C_Polyhedron() {
+  if (marked_empty() || !seq[var_space_dim-1].is_universe())
+    return true;
+  // Now force an emptiness check.
+  return is_empty();
 }
 
-inline bool
-C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
-  return poly_hull_assign_if_exact(y);
-}
+template <typename ITV>
+void
+Box<ITV>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  // The cylindrification wrt no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a box in a 0-dim space.
+  if (to_be_unconstrained.empty())
+    return;
 
-} // namespace Parma_Polyhedra_Library
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = to_be_unconstrained.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
 
-// Automatically generated from PPL source file ../src/C_Polyhedron.defs.hh line 212
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
 
-// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 1
-/* NNC_Polyhedron class declaration.
-*/
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for each of the variables in
+  // `to_be_unconstrained' before cylindrification.
+  for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(),
+         tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) {
+    ITV& seq_tbu = seq[*tbu];
+    if (!seq_tbu.is_empty())
+      seq_tbu.assign(UNIVERSE);
+    else {
+      set_empty();
+      break;
+    }
+  }
+  assert(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::topological_closure_assign() {
+  if (!ITV::info_type::store_open || is_empty())
+    return;
 
+  for (dimension_type k = seq.size(); k-- > 0; )
+    seq[k].topological_closure_assign();
+}
 
-// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 29
+template <typename ITV>
+void
+Box<ITV>::intersection_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type space_dim = space_dimension();
 
-//! A not necessarily closed convex polyhedron.
-/*! \ingroup PPL_CXX_interface
-    An object of the class NNC_Polyhedron represents a
-    <EM>not necessarily closed</EM> (NNC) convex polyhedron
-    in the vector space \f$\Rset^n\f$.
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("intersection_assign(y)", y);
 
-    \note
-    Since NNC polyhedra are a generalization of closed polyhedra,
-    any object of the class C_Polyhedron can be (explicitly) converted
-    into an object of the class NNC_Polyhedron.
-    The reason for defining two different classes is that objects of
-    the class C_Polyhedron are characterized by a more efficient
-    implementation, requiring less time and memory resources.
-*/
-class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
-public:
-  //! Builds either the universe or the empty NNC polyhedron.
-  /*!
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the NNC polyhedron;
+  // If one of the two boxes is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
 
-    \param kind
-    Specifies whether a universe or an empty NNC polyhedron should be built.
+  // If both boxes are zero-dimensional, then at this point they are
+  // necessarily non-empty, so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
 
-    \exception std::length_error
-    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  // FIXME: here we may conditionally exploit a capability of the
+  // underlying interval to eagerly detect empty results.
+  reset_empty_up_to_date();
 
-    Both parameters are optional:
-    by default, a 0-dimension space universe NNC polyhedron is built.
-  */
-  explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
-			  Degenerate_Element kind = UNIVERSE);
+  for (dimension_type k = space_dim; k-- > 0; )
+    x.seq[k].intersect_assign(y.seq[k]);
 
-  //! Builds an NNC polyhedron from a system of constraints.
-  /*!
-    The polyhedron inherits the space dimension of the constraint system.
+  assert(x.OK());
+}
 
-    \param cs
-    The system of constraints defining the polyhedron.
-  */
-  explicit NNC_Polyhedron(const Constraint_System& cs);
+template <typename ITV>
+void
+Box<ITV>::box_hull_assign(const Box& y) {
+  Box& x = *this;
 
-  //! Builds an NNC polyhedron recycling a system of constraints.
-  /*!
-    The polyhedron inherits the space dimension of the constraint system.
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("box_hull_assign(y)", y);
 
-    \param cs
-    The system of constraints defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
-  */
-  explicit NNC_Polyhedron(Constraint_System& cs);
+  // The hull of a box with an empty box is equal to the first box.
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty()) {
+    x = y;
+    return;
+  }
 
-  //! Builds an NNC polyhedron from a system of generators.
-  /*!
-    The polyhedron inherits the space dimension of the generator system.
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    x.seq[k].join_assign(y.seq[k]);
 
-    \param gs
-    The system of generators defining the polyhedron.
+  assert(x.OK());
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points.
-  */
-  explicit NNC_Polyhedron(const Generator_System& gs);
+template <typename ITV>
+void
+Box<ITV>::concatenate_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
 
-  //! Builds an NNC polyhedron recycling a system of generators.
-  /*!
-    The polyhedron inherits the space dimension of the generator system.
+  // If `y' is marked empty, the result will be empty too.
+  if (y.marked_empty())
+    x.set_empty();
 
-    \param gs
-    The system of generators defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
+  // If `y' is a 0-dim space box, there is nothing left to do.
+  if (y_space_dim == 0)
+    return;
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points.
-  */
-  explicit NNC_Polyhedron(Generator_System& gs);
+  // Here `y_space_dim > 0', so that a non-trivial concatenation will occur:
+  // make sure that reallocation will occur once at most.
+  x.seq.reserve(x_space_dim + y_space_dim);
 
-  //! Builds an NNC polyhedron from a system of congruences.
-  /*!
-    The polyhedron inherits the space dimension of the congruence system.
+  // If `x' is marked empty, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x.marked_empty()) {
+    x.seq.insert(x.seq.end(), y_space_dim, ITV());
+    assert(x.OK());
+    return;
+  }
 
-    \param cgs
-    The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
-  */
-  explicit NNC_Polyhedron(const Congruence_System& cgs);
+  // Here neither `x' nor `y' are marked empty: concatenate them.
+  std::copy(y.seq.begin(), y.seq.end(),
+	    std::back_insert_iterator<Sequence>(x.seq));
+  // Update the `empty_up_to_date' flag.
+  if (!y.status.test_empty_up_to_date())
+    reset_empty_up_to_date();
 
-  //! Builds an NNC polyhedron recycling a system of congruences.
-  /*!
-    The polyhedron inherits the space dimension of the congruence
-    system.
+  assert(x.OK());
+}
 
-    \param cgs
-    The system of congruences defining the polyhedron.  It is not
-    declared <CODE>const</CODE> because its data-structures will be
-    recycled to build the polyhedron.
-  */
-  explicit NNC_Polyhedron(Congruence_System& cgs);
+template <typename ITV>
+void
+Box<ITV>::box_difference_assign(const Box& y) {
+  const dimension_type space_dim = space_dimension();
 
-  //! Builds an NNC polyhedron from the C polyhedron \p y.
-  explicit NNC_Polyhedron(const C_Polyhedron& y);
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("box_difference_assign(y)", y);
 
-  //! Builds an NNC polyhedron out of a generic, interval-based bounding box.
-  /*!
-    For a description of the methods that should be provided by
-    the template class Box, see the documentation of the protected method:
-      template \<typename Box\>
-      Polyhedron::Polyhedron(Topology topol, const Box& box);
+  Box& x = *this;
+  if (x.is_empty() || y.is_empty())
+    return;
 
-    \param box
-    The bounding box representing the polyhedron to be built;
+  // If `x' is zero-dimensional, then at this point both `x' and `y'
+  // are the universe box, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
 
-    \param dummy
-    A dummy tag to syntactically differentiate this one from the other
-    constructors.
+  dimension_type index_non_contained = space_dim;
+  dimension_type number_non_contained = 0;
+  for (dimension_type i = space_dim; i-- > 0; )
+    if (!y.seq[i].contains(x.seq[i])) {
+      if (++number_non_contained == 1)
+	index_non_contained = i;
+      else
+	break;
+    }
 
-    \exception std::length_error
-    Thrown if the space dimension of \p box exceeds the maximum allowed
-    space dimension.
-  */
-  template <typename Box>
-  NNC_Polyhedron(const Box& box, From_Bounding_Box dummy);
+  switch (number_non_contained) {
+  case 0:
+    // `y' covers `x': the difference is empty.
+    x.set_empty();
+    break;
+  case 1:
+    x.seq[index_non_contained].difference_assign(y.seq[index_non_contained]);
+    break;
+  default:
+    // Nothing to do: the difference is `x'.
+    break;
+  }
+  assert(OK());
+}
 
-  //! Ordinary copy-constructor.
-  NNC_Polyhedron(const NNC_Polyhedron& y);
+template <typename ITV>
+bool
+Box<ITV>::simplify_using_context_assign(const Box& y) {
+  // FIXME: provide a real implementation.
+  used(y);
+  return true;
+}
 
-  /*! \brief
-    The assignment operator.
-    (\p *this and \p y can be dimension-incompatible.)
-  */
-  NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+template <typename ITV>
+void
+Box<ITV>::time_elapse_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
 
-  //! Assigns to \p *this the C polyhedron \p y.
-  NNC_Polyhedron& operator=(const C_Polyhedron& y);
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("time_elapse_assign(y)", y);
 
-  //! Destructor.
-  ~NNC_Polyhedron();
+  // Dealing with the zero-dimensional case.
+  if (x_space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
 
-  /*! \brief
-    If the poly-hull of \p *this and \p y is exact it is assigned
-    to \p *this and <CODE>true</CODE> is returned,
-    otherwise <CODE>false</CODE> is returned.
+  // If either one of `x' or `y' is empty, the result is empty too.
+  // Note: if possible, avoid cost of checking for emptiness.
+  if (x.marked_empty() || y.marked_empty()
+      || x.is_empty() || y.is_empty()) {
+    x.set_empty();
+    return;
+  }
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    ITV& x_seq_i = x.seq[i];
+    const ITV& y_seq_i = y.seq[i];
+    if (!x_seq_i.lower_is_unbounded())
+      if (y_seq_i.lower_is_unbounded() || y_seq_i.lower() < 0)
+	x_seq_i.lower_set(UNBOUNDED);
+    if (!x_seq_i.upper_is_unbounded())
+      if (y_seq_i.upper_is_unbounded() || y_seq_i.upper() > 0)
+	x_seq_i.upper_set(UNBOUNDED);
+  }
+  assert(x.OK());
+}
 
-  //! Same as poly_hull_assign_if_exact(y).
-  bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
-};
+template <typename ITV>
+inline void
+Box<ITV>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a box in a zero-dimensional space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
 
-// Automatically generated from PPL source file ../src/NNC_Polyhedron.inlines.hh line 1
-/* NNC_Polyhedron class implementation: inline functions.
-*/
+  const dimension_type old_space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  const dimension_type tbr_space_dim = to_be_removed.space_dimension();
+  if (old_space_dim < tbr_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)",
+				 tbr_space_dim);
 
+  const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
 
-// Automatically generated from PPL source file ../src/NNC_Polyhedron.inlines.hh line 27
+  // If the box is empty (this must be detected), then resizing is all
+  // what is needed.  If it is not empty and we are removing _all_ the
+  // dimensions then, again, resizing suffices.
+  if (is_empty() || new_space_dim == 0) {
+    seq.resize(new_space_dim);
+    assert(OK());
+    return;
+  }
 
-namespace Parma_Polyhedra_Library {
+  // For each variable to be removed, we fill the corresponding interval
+  // by shifting left those intervals that will not be removed.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst = *tbr;
+  dimension_type src = dst + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    const dimension_type tbr_next = *tbr;
+    // All intervals in between are moved to the left.
+    while (src < tbr_next)
+      seq[dst++].swap(seq[src++]);
+    ++src;
+  }
+  // Moving the remaining intervals.
+  while (src < old_space_dim)
+    seq[dst++].swap(seq[src++]);
 
-inline
-NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
-			       Degenerate_Element kind)
-  : Polyhedron(NOT_NECESSARILY_CLOSED,
-	       num_dimensions <= max_space_dimension()
-	       ? num_dimensions
-	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(n, k)",
-						 "n exceeds the maximum "
-						 "allowed space dimension"),
-		  num_dimensions),
-	       kind) {
-}
+  assert(dst == new_space_dim);
+  seq.resize(new_space_dim);
 
-inline
-NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
-  : Polyhedron(NOT_NECESSARILY_CLOSED,
-	       cs.space_dimension() <= max_space_dimension()
-	       ? cs
-	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(cs)",
-						 "the space dimension of cs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), cs)) {
+  assert(OK());
 }
 
-inline
-NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs)
-  : Polyhedron(NOT_NECESSARILY_CLOSED,
-	       cs.space_dimension() <= max_space_dimension()
-	       ? cs
-	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(cs)",
-						 "the space dimension of cs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), cs)) {
-}
+template <typename ITV>
+void
+Box<ITV>::remove_higher_space_dimensions(const dimension_type new_dim) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  const dimension_type old_dim = space_dimension();
+  if (new_dim > old_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dim);
 
-inline
-NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
-  : Polyhedron(NOT_NECESSARILY_CLOSED,
-	       gs.space_dimension() <= max_space_dimension()
-	       ? gs
-	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(gs)",
-						 "the space dimension of gs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), gs)) {
-}
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space box.
+  if (new_dim == old_dim) {
+    assert(OK());
+    return;
+  }
 
-inline
-NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs)
-  : Polyhedron(NOT_NECESSARILY_CLOSED,
-	       gs.space_dimension() <= max_space_dimension()
-	       ? gs
-	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(gs)",
-						 "the space dimension of gs "
-						 "exceeds the maximum allowed "
-						 "space dimension"), gs)) {
+  seq.erase(seq.begin() + new_dim, seq.end());
+  assert(OK());
 }
 
-template <typename Box>
-inline
-NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
-  : Polyhedron(NOT_NECESSARILY_CLOSED,
-	       box.space_dimension() <= max_space_dimension()
-	       ? box
-	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
-						 "NNC_Polyhedron(box)",
-						 "the space dimension of box "
-						 "exceeds the maximum allowed "
-						 "space dimension"), box)) {
-}
+template <typename ITV>
+template <typename Partial_Function>
+void
+Box<ITV>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
 
-inline
-NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y)
-  : Polyhedron(y) {
-}
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the box becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
 
-inline NNC_Polyhedron&
-NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
-  Polyhedron::operator=(y);
-  return *this;
-}
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If the box is empty, then simply adjust the space dimension.
+  if (is_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
 
-inline NNC_Polyhedron&
-NNC_Polyhedron::operator=(const C_Polyhedron& y) {
-  NNC_Polyhedron nnc_y(y);
-  swap(nnc_y);
-  return *this;
+  // We create a new Box with the new space dimension.
+  Box<ITV> tmp(new_space_dim);
+  // Map the intervals, exchanging the indexes.
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i, new_i))
+      seq[i].swap(tmp.seq[new_i]);
+  }
+  swap(tmp);
+  assert(OK());
 }
 
-inline
-NNC_Polyhedron::~NNC_Polyhedron() {
-}
+template <typename ITV>
+void
+Box<ITV>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                const Variable var) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the box.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
 
-inline bool
-NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
-  return poly_hull_assign_if_exact(y);
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
+    return;
+
+  // All variables in `to_be_folded' should be dimensions of the box.
+  if (to_be_folded.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, ...)",
+				 to_be_folded.space_dimension());
+
+  // Moreover, `var.id()' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var.id()) != to_be_folded.end())
+    throw_generic("fold_space_dimensions(tbf, v)",
+		  "v should not occur in tbf");
+
+  // Note: the check for emptiness is needed for correctness.
+  if (!is_empty()) {
+    // Join the interval corresponding to variable `var' with the intervals
+    // corresponding to the variables in `to_be_folded'.
+    ITV& seq_v = seq[var.id()];
+    for (Variables_Set::const_iterator i = to_be_folded.begin(),
+	   tbf_end = to_be_folded.end(); i != tbf_end; ++i)
+      seq_v.join_assign(seq[*i]);
+  }
+  remove_space_dimensions(to_be_folded);
 }
 
-} // namespace Parma_Polyhedra_Library
+template <typename ITV>
+void
+Box<ITV>::add_constraint_no_check(const Constraint& c) {
+  assert(!marked_empty());
 
-// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 186
+  const dimension_type c_space_dim = c.space_dimension();
+  assert(c_space_dim <= space_dimension());
 
-// Automatically generated from PPL source file ../src/Widening_Function.types.hh line 1
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+  // Constraints that are not interval constraints are ignored.
+  if (!extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var))
+    return;
 
+  if (c_num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+	|| c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
 
-namespace Parma_Polyhedra_Library {
+  assert(c_num_vars == 1);
+  const Coefficient& d = c.coefficient(Variable(c_only_var));
+  const Coefficient& n = c.inhomogeneous_term();
+  // The constraint `c' is of the form
+  // `Variable(c_only_var-1) + n / d rel 0', where
+  // `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining intervals, this is
+  // (morally) turned into `Variable(c_only_var-1) rel -n/d'.
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `n/d' into `-n/d'.
+  q = -q;
 
-template <typename PH>
-class Widening_Function;
+  ITV& seq_c = seq[c_only_var];
+  const Constraint::Type c_type = c.type();
+  switch (c_type) {
+  case Constraint::EQUALITY:
+    seq_c.refine_existential(EQUAL, q);
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    seq_c.refine_existential((d > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL, q);
+    // FIXME: this assertion fails due to a bug in refine.
+    assert(seq_c.OK());
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    seq_c.refine_existential((d > 0) ? GREATER_THAN : LESS_THAN, q);
+    break;
+  }
+  // FIXME: do check the value returned by `refine' and
+  // set `empty' and `empty_up_to_date' as appropriate.
+  reset_empty_up_to_date();
+  assert(OK());
+}
 
-template <typename PH, typename CS>
-class Limited_Widening_Function;
+template <typename ITV>
+void
+Box<ITV>::add_constraints_no_check(const Constraint_System& cs) {
+  assert(cs.space_dimension() <= space_dimension());
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    add_constraint_no_check(*i);
+  assert(OK());
+}
 
-} // namespace Parma_Polyhedra_Library
+template <typename ITV>
+void
+Box<ITV>::add_congruence_no_check(const Congruence& cg) {
+  assert(!marked_empty());
 
-// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 1
-/* Widening_Function class declaration.
-*/
+  const dimension_type cg_space_dim = cg.space_dimension();
+  assert(cg_space_dim <= space_dimension());
 
+  // Only equality congruences can be intervals.
+  if (!cg.is_equality())
+    return;
 
-// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 28
+  dimension_type cg_num_vars = 0;
+  dimension_type cg_only_var = 0;
+  // Congruences that are not interval congruences are ignored.
+  if (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var))
+    return;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Wraps a widening method into a function object.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename PH>
-class Parma_Polyhedra_Library::Widening_Function {
-public:
-  //! The (parametric) type of a widening method.
-  typedef void (PH::* Widening_Method)(const PH&, unsigned*);
+  if (cg_num_vars == 0) {
+    // Dealing with a trivial congruence.
+    if (cg.inhomogeneous_term() != 0)
+      set_empty();
+    return;
+  }
 
-  //! Explicit unary constructor.
-  explicit
-  Widening_Function(Widening_Method wm);
+  assert(cg_num_vars == 1);
+  const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+  const Coefficient& n = cg.inhomogeneous_term();
+  // The congruence `cg' is of the form
+  // `Variable(cg_only_var-1) + n / d rel 0', where
+  // `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining intervals, this is
+  // (morally) turned into `Variable(cg_only_var-1) rel -n/d'.
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `n/d' into `-n/d'.
+  q = -q;
+
+  ITV& seq_c = seq[cg_only_var];
+  seq_c.refine_existential(EQUAL, q);
+  // FIXME: do check the value returned by `refine' and
+  // set `empty' and `empty_up_to_date' as appropriate.
+  reset_empty_up_to_date();
+  assert(OK());
+}
 
-  //! Function-application operator.
-  /*!
-    Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
-    method stored at construction time.
-  */
-  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+template <typename ITV>
+void
+Box<ITV>::add_congruences_no_check(const Congruence_System& cgs) {
+  assert(cgs.space_dimension() <= space_dimension());
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    add_congruence_no_check(*i);
+  assert(OK());
+}
 
-private:
-  //! The widening method.
-  Widening_Method w_method;
-};
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence& cg) {
+  assert(!marked_empty());
 
+  const dimension_type cg_space_dim = cg.space_dimension();
+  assert(cg_space_dim <= space_dimension());
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Wraps a limited widening method into a function object.
-/*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename PH, typename CS>
-class Parma_Polyhedra_Library::Limited_Widening_Function {
-public:
-  //! The (parametric) type of a limited widening method.
-  typedef void (PH::* Limited_Widening_Method)(const PH&,
-					       const CS&,
-					       unsigned*);
+  // Only equality congruences can be intervals.
+  if (!cg.is_equality())
+    return;
 
-  //! Constructor.
-  /*!
-    \param lwm
-    The limited widening method.
+  dimension_type cg_num_vars = 0;
+  dimension_type cg_only_var = 0;
+  // Congruences that are not interval congruences are ignored.
+  if (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var))
+    return;
 
-    \param cs
-    The constraint system limiting the widening.
-  */
-  Limited_Widening_Function(Limited_Widening_Method lwm,
-			    const CS& cs);
+  if (cg_num_vars == 0) {
+    // Dealing with a trivial congruence.
+    if (cg.inhomogeneous_term() != 0)
+      set_empty();
+    return;
+  }
 
-  //! Function-application operator.
-  /*!
-    Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
-    are the limited widening method and the constraint system stored
-    at construction time.
-  */
-  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+  assert(cg_num_vars == 1);
+  const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+  const Coefficient& n = cg.inhomogeneous_term();
+  // The congruence `cg' is of the form
+  // `Variable(cg_only_var-1) + n / d rel 0', where
+  // `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining intervals, this is
+  // (morally) turned into `Variable(cg_only_var-1) rel -n/d'.
+  DIRTY_TEMP0(mpq_class, q);
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `n/d' into `-n/d'.
+  q = -q;
+
+  ITV& seq_c = seq[cg_only_var];
+  seq_c.refine_existential(EQUAL, q);
+  // FIXME: do check the value returned by `refine' and
+  // set `empty' and `empty_up_to_date' as appropriate.
+  reset_empty_up_to_date();
+  assert(OK());
+}
 
-private:
-  //! The limited widening method.
-  Limited_Widening_Method lw_method;
-  //! A constant reference to the constraint system limiting the widening.
-  const CS& limiting_cs;
-};
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence_System& cgs) {
+  assert(cgs.space_dimension() <= space_dimension());
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+  assert(OK());
+}
 
-namespace Parma_Polyhedra_Library {
+#if 1
+namespace {
 
-//! Wraps a widening method into a function object.
-/*!
-  \relates Polyhedra_Powerset
+inline bool
+refine_no_check_check_result(Result r, Ternary& open) {
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_POS_OVERFLOW:
+  case V_UNKNOWN_NEG_OVERFLOW:
+  case V_UNKNOWN_POS_OVERFLOW:
+    return true;
+  case V_LT:
+  case V_GT:
+    open = T_YES;
+    return false;
+  case V_LE:
+  case V_GE:
+    if (open == T_NO)
+      open = T_MAYBE;
+    return false;
+  case V_EQ:
+    return false;
+  default:
+    assert(false);
+    return true;
+  }
+}
 
-  \param wm
-  The widening method.
-*/
-template <typename PH>
-Widening_Function<PH>
-widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
+} // namespace
 
-//! Wraps a limited widening method into a function object.
-/*!
-  \relates Polyhedra_Powerset
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+  assert(c.space_dimension() <= space_dimension());
 
-  \param lwm
-  The limited widening method.
+  typedef
+    typename Select_Temp_Boundary_Type<typename ITV::boundary_type>::type
+    Temp_Boundary_Type;
 
-  \param cs
-  The constraint system limiting the widening.
-*/
-template <typename PH, typename CS>
-Limited_Widening_Function<PH, CS>
-widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
-	      const CS& cs);
+  dimension_type c_space_dim = c.space_dimension();
+  Constraint::Type c_type = c.type();
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+  Result r;
+  Temp_Boundary_Type t_bound;
+  Temp_Boundary_Type t_a;
+  Temp_Boundary_Type t_x;
+  Ternary open;
+  for (dimension_type k = c_space_dim; k-- > 0; ) {
+    const Coefficient& a_k = c.coefficient(Variable(k));
+    int sgn_a_k = sgn(a_k);
+    if (sgn_a_k == 0)
+      continue;
+    if (sgn_a_k > 0) {
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+	maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.lower_is_unbounded())
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.upper_is_unbounded())
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_1;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_1;
+
+      // Refine the lower bound of `seq[k]' with `t_bound'.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].lower_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    maybe_refine_upper_1:
+      if (c_type != Constraint::EQUALITY)
+	continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.upper_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.lower_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].upper_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    }
+    else {
+      assert(sgn_a_k < 0);
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+	maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.lower_is_unbounded())
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.upper_is_unbounded())
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto maybe_refine_upper_2;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto maybe_refine_upper_2;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].upper_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    maybe_refine_upper_2:
+      if (c_type != Constraint::EQUALITY)
+	continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      for (dimension_type i = c_space_dim; i-- > 0; ) {
+	if (i == k)
+	  continue;
+	const Coefficient& a_i = c.coefficient(Variable(i));
+	int sgn_a_i = sgn(a_i);
+	if (sgn_a_i == 0)
+	  continue;
+	ITV& x_i = seq[i];
+	if (sgn_a_i < 0) {
+	  if (x_i.upper_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.upper(), ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.upper_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+	else {
+	  assert(sgn_a_i > 0);
+	  if (x_i.lower_is_unbounded())
+	    goto next_k;
+	  r = assign_r(t_a, a_i, ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	  if (x_i.lower_is_open())
+	    open = T_YES;
+	  r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+	  if (refine_no_check_check_result(r, open))
+	    goto next_k;
+	}
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (refine_no_check_check_result(r, open))
+	goto next_k;
+
+      // Refine the lower bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+	  && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+	open = T_YES;
+      seq[k].lower_narrow(t_bound, open == T_YES);
+      reset_empty_up_to_date();
+    }
+  next_k:
+    ;
+  }
+}
 
-} // namespace Parma_Polyhedra_Library
+#else
 
-// Automatically generated from PPL source file ../src/Widening_Function.inlines.hh line 1
-/* Widening_Function class implementation: inline functions.
-*/
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+  assert(c.space_dimension() <= space_dimension());
+
+  dimension_type c_space_dim = c.space_dimension();
+  ITV k[c_space_dim];
+  ITV p[c_space_dim];
+  for (dimension_type i = c_space_dim; i-- > 0; ) {
+    k[i] = c.coefficient(Variable(i));
+    ITV& p_i = p[i];
+    p_i = seq[i];
+    p_i.mul_assign(p_i, k[i]);
+  }
+  const Coefficient& inhomogeneous_term = c.inhomogeneous_term();
+  for (dimension_type i = c_space_dim; i-- > 0; ) {
+    int sgn_coefficient_i = sgn(c.coefficient(Variable(i)));
+    if (sgn_coefficient_i == 0)
+      continue;
+    ITV q(inhomogeneous_term);
+    for (dimension_type j = c_space_dim; j-- > 0; ) {
+      if (i == j)
+	continue;
+      q.add_assign(q, p[j]);
+    }
+    q.div_assign(q, k[i]);
+    q.neg_assign(q);
+    Relation_Symbol rel;
+    switch (c.type()) {
+    case Constraint::EQUALITY:
+      rel = EQUAL;
+      break;
+    case Constraint::NONSTRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_THAN : LESS_THAN;
+      break;
+    }
+    seq[i].refine_existential(rel, q);
+    // FIXME: could/should we exploit the return value of refine_existential,
+    //        in case it is available?
+    // FIMXE: should we instead be lazy and do not even bother about
+    //        the possibility the interval becomes empty apart from setting
+    //        empty_up_to_date = false?
+    if (seq[i].is_empty()) {
+      set_empty();
+      break;
+    }
+  }
 
+  assert(OK());
+}
 
-#include <cassert>
+#endif
 
-namespace Parma_Polyhedra_Library {
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint_System& cs) {
+  assert(cs.space_dimension() <= space_dimension());
 
-template <typename PH>
-Widening_Function<PH>::Widening_Function(Widening_Method wm)
-  : w_method(wm) {
-}
+  bool changed;
+  do {
+    Sequence copy(seq);
+    for (Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i)
+      refine_no_check(*i);
 
-template <typename PH>
-inline void
-Widening_Function<PH>::
-operator()(PH& x, const PH& y, unsigned* tp) const {
-  (x.*w_method)(y, tp);
-}
+    // Check if the client has requested abandoning all expensive
+    // computations.  If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
 
-template <typename PH, typename CS>
-Limited_Widening_Function<PH, CS>::
-Limited_Widening_Function(Limited_Widening_Method lwm,
-			  const CS& cs)
-  : lw_method(lwm), limiting_cs(cs) {
+    changed = (copy != seq);
+  } while (changed);
 }
 
-template <typename PH, typename CS>
-inline void
-Limited_Widening_Function<PH, CS>::
-operator()(PH& x, const PH& y, unsigned* tp) const {
-  (x.*lw_method)(y, limiting_cs, tp);
-}
+template <typename ITV>
+void
+Box<ITV>::affine_image(const Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
 
-/*! \relates Polyhedra_Powerset */
-template <typename PH>
-inline Widening_Function<PH>
-widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
-  return Widening_Function<PH>(wm);
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  Tmp_Interval_Type expr_value, temp0, temp1;
+  expr_value.assign(expr.inhomogeneous_term());
+  for (dimension_type i = expr_space_dim; i-- > 0; ) {
+    const Coefficient& coeff = expr.coefficient(Variable(i));
+    if (coeff != 0) {
+      temp0.assign(coeff);
+      temp1.assign(seq[i]);
+      temp0.mul_assign(temp0, temp1);
+      expr_value.add_assign(expr_value, temp0);
+    }
+  }
+  if (denominator != 1) {
+    temp0.assign(denominator);
+    expr_value.div_assign(expr_value, temp0);
+  }
+  seq[var.id()].assign(expr_value);
+
+  assert(OK());
 }
 
-/*! \relates Polyhedra_Powerset */
-template <typename PH, typename CS>
-inline Limited_Widening_Function<PH, CS>
-widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
-	      const CS& cs) {
-  return Limited_Widening_Function<PH, CS>(lwm, cs);
+template <typename ITV>
+void
+Box<ITV>::affine_preimage(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference
+                          denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type x_space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (x_space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x_space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  const Coefficient& expr_v = expr.coefficient(var);
+  const bool invertible = (expr_v != 0);
+  if (!invertible) {
+    Tmp_Interval_Type expr_value, temp0, temp1;
+    expr_value.assign(expr.inhomogeneous_term());
+    for (dimension_type i = expr_space_dim; i-- > 0; ) {
+      const Coefficient& coeff = expr.coefficient(Variable(i));
+      if (coeff != 0) {
+	temp0.assign(coeff);
+	temp1.assign(seq[i]);
+	temp0.mul_assign(temp0, temp1);
+	expr_value.add_assign(expr_value, temp0);
+      }
+    }
+    if (denominator != 1) {
+      temp0.assign(denominator);
+      expr_value.div_assign(expr_value, temp0);
+    }
+    ITV& x_seq_v = seq[var.id()];
+    expr_value.intersect_assign(x_seq_v);
+    if (expr_value.is_empty())
+      set_empty();
+    else
+      x_seq_v.assign(UNIVERSE);
+  }
+  else {
+    // The affine transformation is invertible.
+    // CHECKME: for efficiency, would it be meaningful to avoid
+    // the computation of inverse by partially evaluating the call
+    // to affine_image?
+    Linear_Expression inverse;
+    inverse -= expr;
+    inverse += (expr_v + denominator) * var;
+    affine_image(var, inverse, expr_v);
+  }
+  assert(OK());
 }
 
-} // namespace Parma_Polyhedra_Library
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("bounded_affine_image(v, lb, ub, d)", "d == 0");
 
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+				 "ub", ub_expr);
+    // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
 
-// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 125
+  // Add the constraint implied by the `lb_expr' and `ub_expr'.
+  if (denominator > 0)
+    add_constraint(lb_expr <= ub_expr);
+  else
+    add_constraint(lb_expr >= ub_expr);
+
+  // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+  if (lb_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `ub_expr'.
+    generalized_affine_image(var,
+			     LESS_OR_EQUAL,
+			     ub_expr,
+			     denominator);
+    if (denominator > 0)
+      add_constraint(lb_expr <= denominator*var);
+    else
+      add_constraint(denominator*var <= lb_expr);
+  }
+  else if (ub_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `lb_expr'.
+    generalized_affine_image(var,
+			     GREATER_OR_EQUAL,
+			     lb_expr,
+			     denominator);
+    if (denominator > 0)
+      add_constraint(denominator*var <= ub_expr);
+    else
+      add_constraint(ub_expr <= denominator*var);
+  }
+  else {
+    // Here `var' occurs in both `lb_expr' and `ub_expr'.  As boxes
+    // can only use the non-relational constraints, we find the
+    // maximum/minimum values `ub_expr' and `lb_expr' obtain with the
+    // box and use these instead of the `ub-expr' and `lb-expr'.
+    DIRTY_TEMP(Coefficient, max_num);
+    DIRTY_TEMP(Coefficient, max_den);
+    bool max_included;
+    DIRTY_TEMP(Coefficient, min_num);
+    DIRTY_TEMP(Coefficient, min_den);
+    bool min_included;
+    ITV& seq_v = seq[var.id()];
+    if (maximize(ub_expr, max_num, max_den, max_included)) {
+      if (minimize(lb_expr, min_num, min_den, min_included)) {
+	// The `ub_expr' has a maximum value and the `lb_expr'
+	// has a minimum value for the box.
+	// Set the bounds for `var' using the minimum for `lb_expr'.
+	min_den *= denominator;
+	DIRTY_TEMP0(mpq_class, q);
+	assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	(denominator > 0)
+	  ? seq_v.lower_set(q, !min_included)
+	  : seq_v.upper_set(q, !min_included);
+	// Now make the maximum of lb_expr the upper bound.  If the
+	// maximum is not at a box point, then inequality is strict.
+	max_den *= denominator;
+	assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	(denominator > 0)
+	  ? seq_v.upper_set(q, !max_included)
+	  : seq_v.lower_set(q, !max_included);
+      }
+      else {
+	// The `ub_expr' has a maximum value but the `lb_expr'
+	// has no minimum value for the box.
+	// Set the bounds for `var' using the maximum for `lb_expr'.
+	DIRTY_TEMP0(mpq_class, q);
+	max_den *= denominator;
+	assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	if (denominator > 0) {
+	  seq_v.lower_set(UNBOUNDED);
+	  seq_v.upper_set(q, !max_included);
+	}
+	else {
+	  seq_v.upper_set(UNBOUNDED);
+	  seq_v.lower_set(q, !max_included);
+	}
+      }
+    }
+    else if (minimize(lb_expr, min_num, min_den, min_included)) {
+	// The `ub_expr' has no maximum value but the `lb_expr'
+	// has a minimum value for the box.
+	// Set the bounds for `var' using the minimum for `lb_expr'.
+	min_den *= denominator;
+	DIRTY_TEMP0(mpq_class, q);
+	assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	if (denominator > 0) {
+	  seq_v.upper_set(UNBOUNDED);
+	  seq_v.lower_set(q, !min_included);
+	}
+	else {
+	  seq_v.lower_set(UNBOUNDED);
+	  seq_v.upper_set(q, !min_included);
+	}
+    }
+    else {
+      // The `ub_expr' has no maximum value and the `lb_expr'
+      // has no minimum value for the box.
+      // So we set the bounds to be unbounded.
+      seq_v.upper_set(UNBOUNDED);
+      seq_v.lower_set(UNBOUNDED);
+    }
+  }
+  assert(OK());
+}
 
-// Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 1
-/* Ptr_Iterator class declaration.
-*/
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  const dimension_type space_dim = space_dimension();
+  if (denominator == 0)
+    throw_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
 
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+				 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
 
-// Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 27
-#include <iterator>
+  const bool negative_denom = (denominator < 0);
+  const Coefficient& lb_var_coeff = lb_expr.coefficient(var);
+  const Coefficient& ub_var_coeff = ub_expr.coefficient(var);
 
-namespace Parma_Polyhedra_Library {
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // independent of `var', then impose it now.
+  if (lb_var_coeff == ub_var_coeff) {
+    if (negative_denom)
+      add_constraint(lb_expr >= ub_expr);
+    else
+      add_constraint(lb_expr <= ub_expr);
+  }
 
-namespace Implementation {
+  ITV& seq_var = seq[var.id()];
+  if (!seq_var.is_universe()) {
+    // We want to work with a positive denominator,
+    // so the sign and its (unsigned) value are separated.
+    TEMP_INTEGER(pos_denominator);
+    pos_denominator = denominator;
+    if (negative_denom)
+      neg_assign(pos_denominator, pos_denominator);
+    // Store all the information about the upper and lower bounds
+    // for `var' before making this interval unbounded.
+    bool open_lower = seq_var.lower_is_open();
+    bool unbounded_lower = seq_var.lower_is_unbounded();
+    DIRTY_TEMP0(mpq_class, q_seq_var_lower);
+    DIRTY_TEMP(Coefficient, num_lower);
+    DIRTY_TEMP(Coefficient, den_lower);
+    if (!unbounded_lower) {
+      assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED);
+      assign_r(num_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED);
+      assign_r(den_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(den_lower, den_lower);
+      num_lower *= pos_denominator;
+      seq_var.lower_set(UNBOUNDED);
+    }
+    bool open_upper = seq_var.upper_is_open();
+    bool unbounded_upper = seq_var.upper_is_unbounded();
+    DIRTY_TEMP0(mpq_class, q_seq_var_upper);
+    DIRTY_TEMP(Coefficient, num_upper);
+    DIRTY_TEMP(Coefficient, den_upper);
+    if (!unbounded_upper) {
+      assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED);
+      assign_r(num_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED);
+      assign_r(den_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(den_upper, den_upper);
+      num_upper *= pos_denominator;
+      seq_var.upper_set(UNBOUNDED);
+    }
 
-template<typename Q, typename R>
-bool operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+    if (!unbounded_lower) {
+      // `lb_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the lower bound for `var',
+      // and adding the lower bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_lb_expr(ub_expr);
+      revised_lb_expr -= ub_var_coeff * var;
+      DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, den_lower);
+      revised_lb_expr *= d;
+      revised_lb_expr += num_lower;
+
+      // Find the minimum value for the revised lower bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      DIRTY_TEMP(Coefficient, den);
+      if (minimize(revised_lb_expr, num_lower, den, included)) {
+        den_lower *= (den * ub_var_coeff);
+        DIRTY_TEMP0(mpq_class, q);
+        assign_r(q.get_num(), num_lower, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), den_lower, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        open_lower |= !included;
+        if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom)
+          seq_var.lower_narrow(q, open_lower);
+        else
+          seq_var.upper_narrow(q, open_lower);
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
 
-template<typename Q, typename R>
-bool operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+    if (!unbounded_upper) {
+      // `ub_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the upper bound for `var',
+      // and adding the upper bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_ub_expr(lb_expr);
+      revised_ub_expr -= lb_var_coeff * var;
+      DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, den_upper);
+      revised_ub_expr *= d;
+      revised_ub_expr += num_upper;
+
+      // Find the maximum value for the revised upper bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      DIRTY_TEMP(Coefficient, den);
+      if (maximize(revised_ub_expr, num_upper, den, included)) {
+        den_upper *= (den * lb_var_coeff);
+        DIRTY_TEMP0(mpq_class, q);
+        assign_r(q.get_num(), num_upper, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), den_upper, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        open_upper |= !included;
+        if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom)
+          seq_var.upper_narrow(q, open_upper);
+        else
+          seq_var.lower_narrow(q, open_upper);
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+  }
 
-template<typename Q, typename R>
-bool operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // dependent on `var', then impose on the new box.
+  if (lb_var_coeff != ub_var_coeff) {
+    if (denominator > 0)
+      add_constraint(lb_expr <= ub_expr);
+    else
+      add_constraint(lb_expr >= ub_expr);
+  }
 
-template<typename Q, typename R>
-bool operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  assert(OK());
+}
 
-template<typename Q, typename R>
-bool operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
 
-template<typename Q, typename R>
-bool operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "v", var);
 
-template<typename Q, typename R>
-typename Ptr_Iterator<Q>::difference_type operator-(const Ptr_Iterator<Q>& x,
-						    const Ptr_Iterator<R>& y);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+		  "r is the disequality relation symbol");
 
-template<typename P>
-Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
-			  const Ptr_Iterator<P>& y);
+  // First compute the affine image.
+  affine_image(var, expr, denominator);
 
-} // namespace Implementation
+  if (relsym == EQUAL)
+    // The affine relation is indeed an affine function.
+    return;
 
-} // namespace Parma_Polyhedra_Library
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A class to define STL const and non-const iterators from pointer types.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename P>
-class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
-  : public std::iterator<typename std::iterator_traits<P>::iterator_category,
-			 typename std::iterator_traits<P>::value_type,
-			 typename std::iterator_traits<P>::difference_type,
-			 typename std::iterator_traits<P>::pointer,
-			 typename std::iterator_traits<P>::reference> {
-public:
-  typedef typename std::iterator_traits<P>::difference_type difference_type;
-  typedef typename std::iterator_traits<P>::reference reference;
-  typedef typename std::iterator_traits<P>::pointer pointer;
+  ITV& seq_var = seq[var.id()];
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    seq_var.lower_set(UNBOUNDED);
+    break;
+  case LESS_THAN:
+    seq_var.lower_set(UNBOUNDED);
+    if (!seq_var.upper_is_unbounded())
+      seq_var.refine_existential(LESS_THAN, seq_var.upper());
+    break;
+  case GREATER_OR_EQUAL:
+    seq_var.upper_set(UNBOUNDED);
+    break;
+  case GREATER_THAN:
+    seq_var.upper_set(UNBOUNDED);
+    if (!seq_var.lower_is_unbounded())
+      seq_var.refine_existential(GREATER_THAN, seq_var.lower());
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    throw std::runtime_error("PPL internal error");
+  }
+  assert(OK());
+}
 
-  //! Default constructor: no guarantees.
-  Ptr_Iterator();
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator)
+{
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+			   "d == 0");
 
-  //! Construct an iterator pointing at \p q.
-  explicit Ptr_Iterator(const P& q);
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "v", var);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+                  "r is the disequality relation symbol");
 
-  /*! \brief
-    Copy-constructor allowing the construction of a const_iterator
-    from a non-const iterator.
-  */
-  template<typename Q>
-  Ptr_Iterator(const Ptr_Iterator<Q>& q);
+  // Check whether the affine relation is indeed an affine function.
+  if (relsym == EQUAL) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
 
-  //! Dereference operator.
-  reference operator*() const;
+  // Compute the reversed relation symbol to simplify later coding.
+  Relation_Symbol reversed_relsym;
+  switch (relsym) {
+  case LESS_THAN:
+    reversed_relsym = GREATER_THAN;
+    break;
+  case LESS_OR_EQUAL:
+    reversed_relsym = GREATER_OR_EQUAL;
+    break;
+  case GREATER_OR_EQUAL:
+    reversed_relsym = LESS_OR_EQUAL;
+    break;
+  case GREATER_THAN:
+    reversed_relsym = LESS_THAN;
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    throw std::runtime_error("PPL internal error");
+  }
 
-  //! Indirect member selector.
-  pointer operator->() const;
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_coefficient != 0) {
+    Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    TEMP_INTEGER(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
+    Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denominator))
+      ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse_expr,
+			     inverse_denominator);
+    return;
+  }
 
-  //! Subscript operator.
-  reference operator[](const difference_type m) const;
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the box by adding the constraint induced
+  // by the affine relation.
+  // First, compute the maximum and minimum value reached by
+  // `denominator*var' on the box as we need to use non-relational
+  // expressions.
+  DIRTY_TEMP(Coefficient, max_num);
+  DIRTY_TEMP(Coefficient, max_den);
+  bool max_included;
+  bool bound_above = maximize(denominator*var, max_num, max_den, max_included);
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  bool bound_below = minimize(denominator*var, min_num, min_den, min_included);
+  // Use the correct relation symbol
+  const Relation_Symbol corrected_relsym
+    = (denominator > 0) ? relsym : reversed_relsym;
+  // Revise the expression to take into account the denominator of the
+  // maximum/minimim value for `var'.
+  DIRTY_TEMP(Linear_Expression, revised_expr);
+  dimension_type dim = space_dim;
+  TEMP_INTEGER(d);
+  if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) {
+    if (bound_below) {
+      for ( ; dim > 0; dim--) {
+        d = min_den * expr.coefficient(Variable(dim - 1));
+        revised_expr
+          += d * Variable(dim - 1);
+      }
+    }
+  }
+  else {
+    if (bound_above) {
+      for ( ; dim > 0; dim--) {
+        d = max_den * expr.coefficient(Variable(dim - 1));
+        revised_expr
+          += d * Variable(dim - 1);
+      }
+    }
+  }
 
-  //! Prefix increment operator.
-  Ptr_Iterator& operator++();
+  switch (corrected_relsym) {
+  case LESS_THAN:
+    if (bound_below)
+      add_constraint(min_num < revised_expr);
+    break;
+  case LESS_OR_EQUAL:
+    if (bound_below)
+      (min_included)
+        ? add_constraint(min_num <= revised_expr)
+        : add_constraint(min_num < revised_expr);
+    break;
+  case GREATER_OR_EQUAL:
+    if (bound_above)
+      (max_included)
+        ? add_constraint(max_num >= revised_expr)
+        : add_constraint(max_num > revised_expr);
+    break;
+  case GREATER_THAN:
+    if (bound_above)
+      add_constraint(max_num > revised_expr);
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    throw std::runtime_error("PPL internal error");
+  }
+  // If the shrunk box is empty, its preimage is empty too.
+  if (is_empty())
+    return;
+  ITV& seq_v = seq[var.id()];
+  seq_v.lower_set(UNBOUNDED);
+  seq_v.upper_set(UNBOUNDED);
+  assert(OK());
+}
 
-  //! Postfix increment operator.
-  Ptr_Iterator operator++(int);
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
 
-  //! Prefix decrement operator
-  Ptr_Iterator& operator--();
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is the disequality relation symbol");
 
-  //! Postfix decrement operator.
-  Ptr_Iterator operator--(int);
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
 
-  //! Assignment-increment operator.
-  Ptr_Iterator& operator+=(const difference_type m);
+  // Compute the maximum and minimum value reached by the rhs on the box.
+  DIRTY_TEMP(Coefficient, max_num);
+  DIRTY_TEMP(Coefficient, max_den);
+  bool max_included;
+  bool max_rhs = maximize(rhs, max_num, max_den, max_included);
+  DIRTY_TEMP(Coefficient, min_num);
+  DIRTY_TEMP(Coefficient, min_den);
+  bool min_included;
+  bool min_rhs = minimize(rhs, min_num, min_den, min_included);
+
+  // Check whether there is 0, 1 or more thna one variable in the lhs
+  // and record the variable with the highest dimension; set the box
+  // intervals to be unbounded for all other dimensions with non-zero
+  // coefficients in the lhs.
+  bool has_var = false;
+  bool has_more_than_one_var = false;
+  // Initialization is just to avoid an annoying warning.
+  dimension_type has_var_id = 0;
+  for ( ; lhs_space_dim > 0; --lhs_space_dim)
+    if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0) {
+      if (has_var) {
+        ITV& seq_i = seq[lhs_space_dim - 1];
+        seq_i.lower_set(UNBOUNDED);
+        seq_i.upper_set(UNBOUNDED);
+        has_more_than_one_var = true;
+      }
+      else {
+        has_var = true;
+        has_var_id = lhs_space_dim - 1;
+      }
+    }
 
-  //! Assignment-decrement operator.
-  Ptr_Iterator& operator-=(const difference_type m);
+  if (has_more_than_one_var) {
+    // There is more than one dimension with non-zero coefficient, so
+    // we cannot have any information about the dimensions in the lhs.
+    // Since all but the highest dimension with non-zero coefficient
+    // in the lhs have been set unbounded, it remains to set the
+    // highest dimension in the lhs unbounded.
+    ITV& seq_var = seq[has_var_id];
+    seq_var.lower_set(UNBOUNDED);
+    seq_var.upper_set(UNBOUNDED);
+    assert(OK());
+    return;
+  }
 
-  //! Returns the difference between \p *this and \p y.
-  difference_type operator-(const Ptr_Iterator& y) const;
+  if (has_var) {
+    // There is exactly one dimension with non-zero coefficient.
+    ITV& seq_var = seq[has_var_id];
+
+    // Compute the new bounds for this dimension defined by the rhs
+    // expression.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    const Coefficient& coeff = lhs.coefficient(Variable(has_var_id));
+    DIRTY_TEMP0(mpq_class, q_max);
+    DIRTY_TEMP0(mpq_class, q_min);
+    if (max_rhs) {
+      max_num -= inhomo * max_den;
+      max_den *= coeff;
+      assign_r(q_max.get_num(), max_num, ROUND_NOT_NEEDED);
+      assign_r(q_max.get_den(), max_den, ROUND_NOT_NEEDED);
+      q_max.canonicalize();
+    }
+    if (min_rhs) {
+      min_num -= inhomo * min_den;
+      min_den *= coeff;
+      assign_r(q_min.get_num(), min_num, ROUND_NOT_NEEDED);
+      assign_r(q_min.get_den(), min_den, ROUND_NOT_NEEDED);
+      q_min.canonicalize();
+    }
 
-  //! Returns the sum of \p *this and \p m.
-  Ptr_Iterator operator+(const difference_type m) const;
+    // The choice as to which bounds should be set depends on the sign
+    // of the coefficient of the dimension `has_var_id' in the lhs.
+    if (coeff > 0)
+      // The coefficient of the dimension in the lhs is +ve.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        seq_var.lower_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.upper_set(q_max, !max_included)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case LESS_THAN:
+        seq_var.lower_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.upper_set(q_max, true)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case EQUAL:
+        max_rhs
+          ? seq_var.upper_set(q_max, !max_included)
+          : seq_var.upper_set(UNBOUNDED);
+          min_rhs
+            ? seq_var.lower_set(q_min, !min_included)
+            : seq_var.lower_set(UNBOUNDED);
+          break;
+      case GREATER_OR_EQUAL:
+        seq_var.upper_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.lower_set(q_min, !min_included)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      case GREATER_THAN:
+        seq_var.upper_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.lower_set(q_min, true)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        throw std::runtime_error("PPL internal error");
+      }
+    else
+      // The coefficient of the dimension in the lhs is -ve.
+      switch (relsym) {
+      case GREATER_OR_EQUAL:
+        seq_var.lower_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.upper_set(q_min, !min_included)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case GREATER_THAN:
+        seq_var.lower_set(UNBOUNDED);
+        min_rhs
+          ? seq_var.upper_set(q_min, true)
+          : seq_var.upper_set(UNBOUNDED);
+        break;
+      case EQUAL:
+        max_rhs
+          ? seq_var.lower_set(q_max, !max_included)
+          : seq_var.lower_set(UNBOUNDED);
+          min_rhs
+            ? seq_var.upper_set(q_min, !min_included)
+            : seq_var.upper_set(UNBOUNDED);
+          break;
+      case LESS_OR_EQUAL:
+        seq_var.upper_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.lower_set(q_max, !max_included)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      case LESS_THAN:
+        seq_var.upper_set(UNBOUNDED);
+        max_rhs
+          ? seq_var.lower_set(q_max, true)
+          : seq_var.lower_set(UNBOUNDED);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        throw std::runtime_error("PPL internal error");
+      }
+  }
 
-  //! Returns the difference of \p *this and \p m.
-  Ptr_Iterator operator-(const difference_type m) const;
+  else {
+    // The lhs is a constant value, so we just need to add the
+    // appropriate constraint.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    switch (relsym) {
+    case LESS_THAN:
+      add_constraint(inhomo < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      add_constraint(inhomo <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(inhomo == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      add_constraint(inhomo >= rhs);
+      break;
+    case GREATER_THAN:
+      add_constraint(inhomo > rhs);
+      break;
+    default:
+      // The NOT_EQUAL case has been already dealt with.
+      throw std::runtime_error("PPL internal error");
+    }
+  }
+  assert(OK());
+}
 
-private:
-  //! The base pointer implementing the iterator.
-  P p;
+template <typename ITV>
+void
+Box<ITV>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
 
-  //! Returns the hidden pointer.
-  const P& base() const;
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+                  "r is the disequality relation symbol");
 
-  template <typename Q, typename R>
-  friend bool Parma_Polyhedra_Library::Implementation::
-  operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
 
-  template <typename Q, typename R>
-  friend bool Parma_Polyhedra_Library::Implementation::
-  operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  // For any dimension occurring in the lhs, swap and change the sign
+  // of this component for the rhs and lhs.  Then use these in a call
+  // to generalized_affine_image/3.
+  Linear_Expression revised_lhs = lhs;
+  Linear_Expression revised_rhs = rhs;
+  for (dimension_type d = lhs_space_dim; d-- > 0; ) {
+    const Variable& var = Variable(d);
+    if (lhs.coefficient(var) != 0) {
+      DIRTY_TEMP(Coefficient, temp);
+      temp = rhs.coefficient(var) + lhs.coefficient(var);
+      revised_rhs -= temp * var;
+      revised_lhs -= temp * var;
+    }
+  }
+  generalized_affine_image(revised_lhs, relsym, revised_rhs);
+  assert(OK());
+}
 
-  template<typename Q, typename R>
-  friend bool Parma_Polyhedra_Library::Implementation::
-  operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+template <typename ITV>
+template <typename Iterator>
+void
+Box<ITV>::CC76_widening_assign(const Box& y, Iterator first, Iterator last) {
+  if (y.is_empty())
+    return;
 
-  template<typename Q, typename R>
-  friend bool Parma_Polyhedra_Library::Implementation::
-  operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  for (dimension_type i = seq.size(); i-- > 0; )
+    seq[i].CC76_widening_assign(y.seq[i], first, last);
 
-  template<typename Q, typename R>
-  friend bool Parma_Polyhedra_Library::Implementation::
-  operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  assert(OK());
+}
 
-  template<typename Q, typename R>
-  friend bool Parma_Polyhedra_Library::Implementation::
-  operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+template <typename ITV>
+void
+Box<ITV>::CC76_widening_assign(const Box& y, unsigned* tp) {
+  static typename ITV::boundary_type stop_points[] = {
+    typename ITV::boundary_type(-2),
+    typename ITV::boundary_type(-1),
+    typename ITV::boundary_type(0),
+    typename ITV::boundary_type(1),
+    typename ITV::boundary_type(2)
+  };
 
-  template<typename Q, typename R>
-  friend typename Ptr_Iterator<Q>::difference_type
-  Parma_Polyhedra_Library::Implementation::
-  operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+  Box& x = *this;
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Box<ITV> x_tmp(x);
+    x_tmp.CC76_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!x.contains(x_tmp))
+      --(*tp);
+    return;
+  }
+  x.CC76_widening_assign(y,
+			 stop_points,
+			 stop_points
+			 + sizeof(stop_points)/sizeof(stop_points[0]));
+}
 
-  friend Ptr_Iterator<P>
-  Parma_Polyhedra_Library::Implementation::
-  operator+<>(typename Ptr_Iterator<P>::difference_type m,
-	      const Ptr_Iterator<P>& y);
-};
+template <typename ITV>
+void
+Box<ITV>::limited_CC76_extrapolation_assign(const Box& y,
+                                            const Constraint_System& cs,
+                                            unsigned* tp) {
+  // FIXME: should take into account cs.
+  used(cs);
+  Box& x = *this;
+  x.CC76_widening_assign(y, tp);
+}
 
-// Automatically generated from PPL source file ../src/Ptr_Iterator.inlines.hh line 1
-/* Ptr_Iterator class implementation: inline functions.
-*/
+template <typename ITV>
+void
+Box<ITV>::CC76_narrowing_assign(const Box& y) {
+  const dimension_type space_dim = space_dimension();
 
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
 
-#include <algorithm>
-#include <cassert>
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const Box x_copy = *this;
+    const Box y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
 
-namespace Parma_Polyhedra_Library {
+  // If both boxes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
 
-namespace Implementation {
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.is_empty())
+    return;
+  // If `*this' is empty, we return.
+  if (is_empty())
+    return;
 
-template <typename P>
-inline const P&
-Ptr_Iterator<P>::base() const {
-  return p;
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& x_i = seq[i];
+    const ITV& y_i = y.seq[i];
+    if (!x_i.lower_is_unbounded()
+	&& !y_i.lower_is_unbounded()
+	&& x_i.lower() != y_i.lower())
+      x_i.lower() = y_i.lower();
+    if (!x_i.upper_is_unbounded()
+	&& !y_i.upper_is_unbounded()
+	&& x_i.upper() != y_i.upper())
+      x_i.upper() = y_i.upper();
+  }
+  assert(OK());
 }
 
-template <typename P>
-inline
-Ptr_Iterator<P>::Ptr_Iterator()
-  : p(P()) {
-}
+template <typename ITV>
+Constraint_System
+Box<ITV>::constraints() const {
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
 
-template <typename P>
-inline
-Ptr_Iterator<P>::Ptr_Iterator(const P& q)
-  : p(q) {
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      DIRTY_TEMP(Coefficient, n);
+      DIRTY_TEMP(Coefficient, d);
+      if (get_lower_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) >= n);
+	else
+	  cs.insert(d*Variable(k) > n);
+      }
+      if (get_upper_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) <= n);
+	else
+	  cs.insert(d*Variable(k) < n);
+      }
+    }
+  }
+  return cs;
 }
 
-template <typename P>
-template <typename Q>
-inline
-Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& y)
-  : p(y.base()) {
-}
+template <typename ITV>
+Constraint_System
+Box<ITV>::minimized_constraints() const {
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  // Make sure emptiness is detected.
+  else if (is_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
 
-template <typename P>
-inline typename Ptr_Iterator<P>::reference
-Ptr_Iterator<P>::operator*() const {
-  return *p;
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      DIRTY_TEMP(Coefficient, n);
+      DIRTY_TEMP(Coefficient, d);
+      if (get_lower_bound(k, closed, n, d)) {
+	if (closed)
+	  // Make sure equality constraints are detected.
+	  if (seq[k].is_singleton()) {
+	    cs.insert(d*Variable(k) == n);
+	    continue;
+	  }
+	  else
+	    cs.insert(d*Variable(k) >= n);
+	else
+	  cs.insert(d*Variable(k) > n);
+      }
+      if (get_upper_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) <= n);
+	else
+	  cs.insert(d*Variable(k) < n);
+      }
+    }
+  }
+  return cs;
 }
 
-template <typename P>
-inline typename Ptr_Iterator<P>::pointer
-Ptr_Iterator<P>::operator->() const {
-  return p;
+template <typename ITV>
+Congruence_System
+Box<ITV>::congruences() const {
+  Congruence_System cgs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+  }
+  // Make sure emptiness is detected.
+  else if (is_empty())
+    cgs.insert((0*Variable(space_dim-1) %= -1) / 0);
+  else {
+    // KLUDGE: in the future `cgs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cgs.insert(0*Variable(space_dim-1) %= 0);
+
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      DIRTY_TEMP(Coefficient, n);
+      DIRTY_TEMP(Coefficient, d);
+      if (get_lower_bound(k, closed, n, d) && closed)
+	  // Make sure equality congruences are detected.
+	  if (seq[k].is_singleton())
+	    cgs.insert((d*Variable(k) %= n) / 0);
+    }
+  }
+  return cgs;
 }
 
-template <typename P>
-inline typename Ptr_Iterator<P>::reference
-Ptr_Iterator<P>::operator[](const difference_type m) const {
-  return p[m];
+template <typename ITV>
+memory_size_type
+Box<ITV>::external_memory_in_bytes() const {
+  memory_size_type n = seq.capacity() * sizeof(ITV);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    n += seq[k].external_memory_in_bytes();
+  return n;
 }
 
-template <typename P>
-inline Ptr_Iterator<P>&
-Ptr_Iterator<P>::operator++() {
-  ++p;
-  return *this;
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Box<ITV>& box) {
+  if (box.is_empty())
+    s << "false";
+  else if (box.is_universe())
+    s << "true";
+  else
+    for (dimension_type k = 0,
+	   space_dim = box.space_dimension(); k < space_dim; ) {
+      s << Variable(k) << " in " << box[k];
+      ++k;
+      if (k < space_dim)
+	s << ", ";
+      else
+	break;
+    }
+  return s;
 }
 
-template <typename P>
-inline Ptr_Iterator<P>
-Ptr_Iterator<P>::operator++(int) {
-  return Ptr_Iterator(p++);
+template <typename ITV>
+void
+Box<ITV>::ascii_dump(std::ostream& s) const {
+  const char separator = ' ';
+  status.ascii_dump(s);
+  const dimension_type space_dim = space_dimension();
+  s << "space_dim" << separator << space_dim;
+  s << "\n";
+  for (dimension_type i = 0; i < space_dim;  ++i)
+    seq[i].ascii_dump(s);
 }
 
-template <typename P>
-inline Ptr_Iterator<P>&
-Ptr_Iterator<P>::operator--() {
-  --p;
-  return *this;
-}
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(ITV, Box<ITV>)
 
-template <typename P>
-inline Ptr_Iterator<P>
-Ptr_Iterator<P>::operator--(int) {
-  return Ptr_Iterator(p--);
-}
+template <typename ITV>
+bool
+Box<ITV>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
 
+  std::string str;
+  dimension_type space_dim;
+  if (!(s >> str) || str != "space_dim")
+    return false;
+  if (!(s >> space_dim))
+    return false;
 
-template <typename P>
-inline Ptr_Iterator<P>&
-Ptr_Iterator<P>::operator+=(const difference_type m) {
-  p += m;
-  return *this;
-}
+  seq.clear();
+  ITV seq_i;
+  for (dimension_type i = 0; i < space_dim;  ++i) {
+    if (seq_i.ascii_load(s))
+      seq.push_back(seq_i);
+    else
+      return false;
+  }
 
-template <typename P>
-inline Ptr_Iterator<P>&
-Ptr_Iterator<P>::operator-=(const difference_type m) {
-  p -= m;
-  return *this;
+  // Check invariants.
+  assert(OK());
+  return true;
 }
 
-template <typename P>
-inline typename Ptr_Iterator<P>::difference_type
-Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
-  return p - y.p;
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Box& y) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << this->space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template <typename P>
-inline Ptr_Iterator<P>
-Ptr_Iterator<P>::operator+(const difference_type m) const {
-  return Ptr_Iterator(p + m);
+template <typename ITV>
+void
+Box<ITV>
+::throw_dimension_incompatible(const char* method,
+			       dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template <typename P>
-inline Ptr_Iterator<P>
-Ptr_Iterator<P>::operator-(const difference_type m) const {
-  return Ptr_Iterator(p - m);
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline bool
-operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() == y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline bool
-operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() != y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint_System& cs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cs->space_dimension == " << cs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline bool
-operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() < y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence_System& cgs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cgs->space_dimension == " << cgs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline bool
-operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() <= y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline bool
-operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() > y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline bool
-operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() >= y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_expression_too_complex(const char* method,
+                                       const Linear_Expression& e) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P, typename Q>
-inline typename Ptr_Iterator<P>::difference_type
-operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
-  return x.base() - y.base();
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const char* name_row,
+                                       const Linear_Expression& e) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << e.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
 }
 
-template<typename P>
-inline Ptr_Iterator<P>
-operator+(typename Ptr_Iterator<P>::difference_type m,
-	  const Ptr_Iterator<P>& y) {
-  return Ptr_Iterator<P>(m + y.base());
+template <typename ITV>
+void
+Box<ITV>::throw_generic(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
 }
 
-} // namespace Implementation
+template <typename ITV>
+void
+Box<ITV>::throw_space_dimension_overflow(const char* method,
+                                         const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << reason;
+  throw std::length_error(s.str());
+}
 
-} // namespace Parma_Polyhedra_Library
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+	  typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const Box<ITV>& x, const Box<ITV>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0, Temp& tmp1, Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
 
-// Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 170
+  // Zero-dim boxes are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
 
-// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 1
-/* DB_Row class declaration.
-*/
+  // The distance computation requires a check for emptiness.
+  (void) x.is_empty();
+  (void) y.is_empty();
+  // If one of two boxes is empty, then they are equal if and only if
+  // the other box is empty too.
+  if (x.marked_empty() || y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty()) {
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+      return true;
+    }
+    else
+      goto pinf;
+  }
 
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    const ITV& x_i = x.seq[i];
+    const ITV& y_i = y.seq[i];
+    // Dealing with the lower bounds.
+    if (x_i.lower_is_unbounded()) {
+      if (!y_i.lower_is_unbounded())
+	goto pinf;
+    }
+    else if (y_i.lower_is_unbounded())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.lower() > y_i.lower()) {
+	maybe_assign(tmp1p, tmp1, x_i.lower(), dir);
+	maybe_assign(tmp2p, tmp2, y_i.lower(), inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i.lower(), dir);
+	maybe_assign(tmp2p, tmp2, x_i.lower(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+    // Dealing with the lower bounds.
+    if (x_i.upper_is_unbounded())
+      if (y_i.upper_is_unbounded())
+	continue;
+      else
+	goto pinf;
+    else if (y_i.upper_is_unbounded())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.upper() > y_i.upper()) {
+	maybe_assign(tmp1p, tmp1, x_i.upper(), dir);
+	maybe_assign(tmp2p, tmp2, y_i.upper(), inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i.upper(), dir);
+	maybe_assign(tmp2p, tmp2, x_i.upper(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
 
-// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 29
-#include <cstddef>
-#include <vector>
+ pinf:
+  assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  return true;
+}
 
-#ifndef EXTRA_ROW_DEBUG
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  When EXTRA_ROW_DEBUG evaluates to <CODE>true</CODE>, each instance
-  of the class DB_Row carries its own capacity; this enables extra
-  consistency checks to be performed.
-  \ingroup PPL_CXX_interface
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-#define EXTRA_ROW_DEBUG 0
-#endif
+} // namespace Parma_Polyhedra_Library
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Box.defs.hh line 1997
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The handler of the actual DB_Row implementation.
-/*! \ingroup PPL_CXX_interface
-  Exception-safety is the only responsibility of this class: it has
-  to ensure that its \p impl member is correctly deallocated.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rational_Box.hh line 1
+/* Rational_Box class declaration and implementation.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
-public:
-  //! Default constructor.
-  DB_Row_Impl_Handler();
-
-  //! Destructor.
-  ~DB_Row_Impl_Handler();
-
-  class Impl;
 
-  //! A pointer to the actual implementation.
-  Impl* impl;
-
-#if EXTRA_ROW_DEBUG
-  //! The capacity of \p impl (only available during debugging).
-  dimension_type capacity_;
-#endif // EXTRA_ROW_DEBUG
 
-private:
-  //! Private and unimplemented: copy construction is not allowed.
-  DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Rational_Box.hh line 28
 
-  //! Private and unimplemented: copy assignment is not allowed.
-  DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
-};
+namespace Parma_Polyhedra_Library {
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The base class for the single rows of matrices.
-/*! \ingroup PPL_CXX_interface
-  The class template DB_Row<T> allows for the efficient representation of
-  the single rows of a DB_Matrix. It contains elements of type T stored
-  as a vector. The class T is a family of extended numbers that
-  must provide representation for
-  \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
-  <EM>not a number</EM>, since this arises as the ``result'' of
-  undefined sums like \f$ +\infty + (-\infty) \f$).
+//! A box with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Box<Rational_Interval> Rational_Box;
 
-  The class T must provide the following methods:
+} // namespace Parma_Polyhedra_Library
 
-  \code
-    T()
-  \endcode
-  is the default constructor: no assumption is made on the particular
-  object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
-  (see below).
-  \code
-    ~T()
-  \endcode
-  is the destructor.
-  \code
-    bool is_nan() const
-  \endcode
-  returns <CODE>true</CODE> if and only \p *this represents
-  the  <EM>not a number</EM> value.
-  \code
-    bool OK() const
-  \endcode
-  returns <CODE>true</CODE> if and only if \p *this satisfies all
-  its invariants.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Init.defs.hh line 1
+/* Init class declaration.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
-public:
-  //! Pre-constructs a row: construction must be completed by construct().
-  DB_Row();
-
-  //! \name Post-constructors.
-  //@{
-  //! Constructs properly a default-constructed element.
-  /*!
-    Builds a row with size \p sz and minimum capacity.
-  */
-  void construct(dimension_type sz);
-
-  //! Constructs properly a default-constructed element.
-  /*!
-    \param sz
-    The size of the row that will be constructed.
-
-    \param capacity
-    The minimum capacity of the row that will be constructed.
-
-    The row that we are constructing has a minimum capacity of
-    (i.e., it can contain at least) \p elements, \p sz of which
-    will be constructed now.
-  */
-  void construct(dimension_type sz, dimension_type capacity);
 
-  //! Constructs properly a conservative approximation of \p y.
-  /*!
-    \param y
-    A row containing the elements whose upward approximations will
-    be used to properly construct \p *this.
 
-    \param capacity
-    The capacity of the constructed row.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Init.defs.hh line 28
 
-    It is assumed that \p capacity is greater than or equal to the
-    size of \p y.
-  */
-  template <typename U>
-  void construct_upward_approximation(const DB_Row<U>& y,
-				      dimension_type capacity);
+namespace Parma_Polyhedra_Library {
 
-  //@}
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
 
-  //! Tight constructor: resizing will require reallocation.
-  DB_Row(dimension_type sz);
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+void set_rounding_for_PPL();
 
-  //! Sizing constructor with capacity.
-  DB_Row(dimension_type sz, dimension_type capacity);
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
 
-  //! Ordinary copy constructor.
-  DB_Row(const DB_Row& y);
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+void restore_pre_PPL_rounding();
 
-  //! Copy constructor with specified capacity.
-  /*!
-    It is assumed that \p capacity is greater than or equal to \p y size.
-  */
-  DB_Row(const DB_Row& y, dimension_type capacity);
+} // namespace Parma_Polyhedra_Library
 
-  //! Copy constructor with specified size and capacity.
-  /*!
-    It is assumed that \p sz is greater than or equal to the size of \p y
-    and, of course, that \p sz is less than or equal to \p capacity.
-    Any new position is initialized to \f$+\infty\f$.
-  */
-  DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+  <EM>Nifty Counter</EM> initialization class,
+  ensuring that the library is initialized only once
+  and before its first use.
+  A count of the number of translation units using the library
+  is maintained. A static object of Init type will be declared
+  by each translation unit using the library.  As a result,
+  only one of them will initialize and properly finalize
+  the library.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Init {
+public:
+  //! Initializes the PPL.
+  Init();
 
-  //! Destructor.
-  ~DB_Row();
+  //! Finalizes the PPL.
+  ~Init();
 
-  //! Assignment operator.
-  DB_Row& operator=(const DB_Row& y);
+private:
+  //! Count the number of objects created.
+  static unsigned int count;
+  static fpu_rounding_direction_type old_rounding_direction;
 
-  //! Swaps \p *this with \p y.
-  void swap(DB_Row& y);
+  friend void set_rounding_for_PPL();
+  friend void restore_pre_PPL_rounding();
+};
 
-  //! Assigns the implementation of \p y to \p *this.
-  void assign(DB_Row& y);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Init.inlines.hh line 1
+/* Init class implementation: inline functions.
+*/
 
-  /*! \brief
-    Allocates memory for a default constructed DB_Row object,
-    allowing for \p capacity coefficients at most.
 
-    It is assumed that no allocation has been performed before
-    (otherwise, a memory leak will occur).
-    After execution, the size of the DB_Row object is zero.
-  */
-  void allocate(dimension_type capacity);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Init.inlines.hh line 28
 
-  //! Expands the row to size \p new_size.
-  /*!
-    Adds new positions to the implementation of the row
-    obtaining a new row with size \p new_size.
-    It is assumed that \p new_size is between the current size
-    and capacity of the row. The new positions are initialized
-    to \f$+\infty\f$.
-  */
-  void expand_within_capacity(dimension_type new_size);
+namespace Parma_Polyhedra_Library {
 
-  //! Shrinks the row by erasing elements at the end.
-  /*!
-    Destroys elements of the row implementation
-    from position \p new_size to the end.
-    It is assumed that \p new_size is not greater than the current size.
-  */
-  void shrink(dimension_type new_size);
+inline void
+set_rounding_for_PPL() {
+#if PPL_CAN_CONTROL_FPU
+    fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+#endif
+}
 
-  //! Returns the size() of the largest possible DB_Row.
-  static dimension_type max_size();
+inline void
+restore_pre_PPL_rounding() {
+#if PPL_CAN_CONTROL_FPU
+  fpu_set_rounding_direction(Init::old_rounding_direction);
+#endif
+}
 
-  //! Gives the number of coefficients currently in use.
-  dimension_type size() const;
+} // namespace Parma_Polyhedra_Library
 
-  //! \name Subscript operators.
-  //@{
-  //! Returns a reference to the element of the row indexed by \p k.
-  T& operator[](dimension_type k);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Init.defs.hh line 84
 
-  //! Returns a constant reference to the element of the row indexed by \p k.
-  const T& operator[](dimension_type k) const;
-  //@}
 
-  //! A (non const) random access iterator to access the row's elements.
-  typedef Implementation::Ptr_Iterator<T*> iterator;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/initializer.hh line 1
+/* Nifty counter object for the initialization of the library.
+*/
 
-  //! A const random access iterator to access the row's elements.
-  typedef Implementation::Ptr_Iterator<const T*> const_iterator;
 
-  /*! \brief
-    Returns the const iterator pointing to the first element,
-    if \p *this is not empty;
-    otherwise, returns the past-the-end const iterator.
-  */
-  iterator begin();
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/initializer.hh line 27
 
-  //! Returns the past-the-end iterator.
-  iterator end();
+#ifndef PPL_NO_AUTOMATIC_INITIALIZATION
+namespace {
 
-  /*! \brief
-    Returns the const iterator pointing to the first element,
-    if \p *this is not empty;
-    otherwise, returns the past-the-end const iterator.
-  */
-  const_iterator begin() const;
+Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
 
-  //! Returns the past-the-end const iterator.
-  const_iterator end() const;
+} // namespace
+#else
+namespace {
 
-  //! Checks if all the invariants are satisfied.
-  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p;
 
-private:
-  template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+} // namespace
+#endif
 
-  //! Exception-safe copy construction mechanism for coefficients.
-  void copy_construct_coefficients(const DB_Row& y);
+namespace Parma_Polyhedra_Library {
 
-#if EXTRA_ROW_DEBUG
-  //! Returns the capacity of the row (only available during debugging).
-  dimension_type capacity() const;
-#endif // defined(EXTRA_ROW_DEBUG)
-};
+//! Initializes the library.
+inline void
+initialize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  if (Parma_Polyhedra_Library_initializer_p == 0)
+    Parma_Polyhedra_Library_initializer_p = new Init();
+#endif
+}
 
-namespace Parma_Polyhedra_Library {
+//! Finalizes the library.
+inline void
+finalize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  assert(Parma_Polyhedra_Library_initializer_p != 0);
+  delete Parma_Polyhedra_Library_initializer_p;
+  Parma_Polyhedra_Library_initializer_p = 0;
+#endif
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! \name Classical comparison operators.
-//@{
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Row */
-template <typename T>
-bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+} //namespace Parma_Polyhedra_Library
 
-/*! \relates DB_Row */
-template <typename T>
-bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//@}
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Scalar_Products.defs.hh line 1
+/* Scalar_Products class definition.
+*/
 
-} // namespace Parma_Polyhedra_Library
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Scalar_Products.defs.hh line 34
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The real implementation of a DB_Row object.
+//! A class implementing various scalar product functions.
 /*! \ingroup PPL_CXX_interface
-  The class DB_Row_Impl_Handler::Impl provides the implementation of
-  DB_Row objects and, in particular, of the corresponding memory
-  allocation functions.
+  When computing the scalar product of (Linear_Row or Constraint or
+  Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+  that the space dimension of the first object <CODE>x</CODE> is less
+  than or equal to the space dimension of the second object <CODE>y</CODE>.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Scalar_Products {
 public:
-  //! \name Custom allocator and deallocator.
-  //@{
+  //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+  static void assign(Coefficient& z, const Linear_Row& x, const Linear_Row& y);
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+  //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+  static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Constraint& c, const Grid_Generator& g);
+  //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Grid_Generator& g, const Congruence& cg);
+  //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Congruence& cg, const Grid_Generator& g);
+
+  //! Returns the sign of the scalar product between \p x and \p y.
+  static int sign(const Linear_Row& x, const Linear_Row& y);
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Generator& g);
+  //! Returns the sign of the scalar product between \p g and \p c.
+  static int sign(const Generator& g, const Constraint& c);
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Grid_Generator& g);
 
   /*! \brief
-    Allocates a chunk of memory able to contain \p capacity T objects
-    beyond the specified \p fixed_size and returns a pointer to the new
-    allocated memory.
+    Computes the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored,
+    and assigns the result to \p z.
   */
-  static void* operator new(size_t fixed_size, dimension_type capacity);
-
-  //! Uses the standard delete operator to free the memory \p p points to.
-  static void operator delete(void* p);
+  static void reduced_assign(Coefficient& z,
+			     const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Computes the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Constraint& c, const Generator& g);
+  /*! \brief
+    Computes the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Generator& g, const Constraint& c);
+  //! \brief
+  //! Computes the \e reduced scalar product of \p g and \p cg,
+  //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+  //! and assigns the result to \p z.
+  static void reduced_assign(Coefficient& z,
+			     const Grid_Generator& g, const Congruence& cg);
 
   /*! \brief
-    Placement version: uses the standard operator delete to free
-    the memory \p p points to.
+    Returns the sign of the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored.
+  */
+  static int reduced_sign(const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored.
+  */
+  static int reduced_sign(const Constraint& c, const Generator& g);
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored.
   */
-  static void operator delete(void* p, dimension_type capacity);
-  //@}
-
-  //! Default constructor.
-  Impl();
+  static int reduced_sign(const Generator& g, const Constraint& c);
 
-  //! Destructor.
-  /*!
-    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
-    to delete all the row elements.
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
   */
-  ~Impl();
-
-  //! Expands the row to size \p new_size.
-  /*!
-    It is assumed that \p new_size is between the current size and capacity.
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
   */
-  void expand_within_capacity(dimension_type new_size);
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Expression& e,
+				 const Generator& g);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p c,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Grid_Generator& g, const Constraint& c);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p cg,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Grid_Generator& g, const Congruence& cg);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Expression& e,
+				 const Grid_Generator& g);
 
-  //! Shrinks the row by erasing elements at the end.
-  /*!
-    It is assumed that \p new_size is not greater than the current size.
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored.
   */
-  void shrink(dimension_type new_size);
-
-  //! Exception-safe copy construction mechanism for coefficients.
-  void copy_construct_coefficients(const Impl& y);
-
+  static int homogeneous_sign(const Linear_Row& x, const Linear_Row& y);
   /*! \brief
-    Exception-safe upward approximation construction mechanism
-    for coefficients.
+    Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored.
   */
-  template <typename U>
-  void construct_upward_approximation(const U& y);
-
-  //! Returns the size() of the largest possible Impl.
-  static dimension_type max_size();
-
-  //! \name Size accessors.
-  //@{
-  //! Returns the actual size of \p this.
-  dimension_type size() const;
-
-  //! Sets to \p new_sz the actual size of \p *this.
-  void set_size(dimension_type new_sz);
-
-  //! Increments the size of \p *this by 1.
-  void bump_size();
-  //@}
+  static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Linear_Expression& e,
+			      const Grid_Generator& g);
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p g and \p c,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Grid_Generator& g, const Constraint& c);
+};
 
-  //! \name Subscript operators.
-  //@{
-  //! Returns a reference to the element of \p *this indexed by \p k.
-  T& operator[](dimension_type k);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+  //! Constructs the function object according to the topology of \p c.
+  Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+  //! Constructs the function object according to the topology of \p g.
+  Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
 
-  //! Returns a constant reference to the element of \p *this indexed by \p k.
-  const T& operator[](dimension_type k) const;
-  //@}
+  //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+  int operator()(const Constraint&, const Generator&) const;
+  //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+  int operator()(const Generator&, const Constraint&) const;
 
 private:
-  //! The number of coefficients in the row.
-  dimension_type size_;
-
-  //! The vector of coefficients.
-  T vec_[
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-	       1
-#endif
-  ];
-
-  //! Private and unimplemented: copy construction is not allowed.
-  Impl(const Impl& y);
-
-  //! Private and unimplemented: assignment is not allowed.
-  Impl& operator=(const Impl&);
+  //! The type of the scalar product sign function pointer.
+  typedef int (*SPS_type)(const Linear_Row&, const Linear_Row&);
 
-  //! Exception-safe copy construction mechanism.
-  void copy_construct(const Impl& y);
+  //! The scalar product sign function pointer.
+  SPS_type sps_fp;
 };
 
-namespace std {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::DB_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
-	  Parma_Polyhedra_Library::DB_Row<T>& y);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Scalar_Products.inlines.hh line 1
+/* Scalar_Products class implementation (inline functions).
+*/
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::iter_swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::DB_Row */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
-	       ::iterator x,
-	       typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
-	       ::iterator y);
 
-} // namespace std
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Scalar_Products.inlines.hh line 32
 
-// Automatically generated from PPL source file ../src/DB_Row.inlines.hh line 1
-/* DB_Row class implementation: inline functions.
-*/
+namespace Parma_Polyhedra_Library {
 
+inline int
+Scalar_Products::sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  assign(z, x, y);
+  return sgn(z);
+}
 
-#include <cassert>
-#include <algorithm>
-#include <iostream>
-// Automatically generated from PPL source file ../src/DB_Row.inlines.hh line 30
+inline int
+Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  reduced_assign(z, x, y);
+  return sgn(z);
+}
 
-namespace Parma_Polyhedra_Library {
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  homogeneous_assign(z, x, y);
+  return sgn(z);
+}
 
-template <typename T>
-inline void*
-DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
-					   const dimension_type capacity) {
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  return ::operator new(fixed_size + capacity*sizeof(T));
-#else
-  assert(capacity >= 1);
-  return ::operator new(fixed_size + (capacity-1)*sizeof(T));
-#endif
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+  return sign(static_cast<const Linear_Row&>(c),
+	      static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
-inline void
-DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
-  ::operator delete(p);
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+  return sign(static_cast<const Linear_Row&>(g),
+	      static_cast<const Linear_Row&>(c));
 }
 
-template <typename T>
-inline void
-DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
-  ::operator delete(p);
+inline int
+Scalar_Products::sign(const Constraint& c, const Grid_Generator& g) {
+  TEMP_INTEGER(z);
+  assign(z, c, g);
+  return sgn(z);
 }
 
-template <typename T>
-inline dimension_type
-DB_Row_Impl_Handler<T>::Impl::max_size() {
-  return size_t(-1)/sizeof(T);
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+  return reduced_sign(static_cast<const Linear_Row&>(c),
+		      static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
-inline dimension_type
-DB_Row_Impl_Handler<T>::Impl::size() const {
-  return size_;
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+  return reduced_sign(static_cast<const Linear_Row&>(g),
+		      static_cast<const Linear_Row&>(c));
 }
 
-template <typename T>
 inline void
-DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
-  size_ = new_sz;
+Scalar_Products::homogeneous_assign(Coefficient& z,
+				    const Linear_Expression& e,
+				    const Generator& g) {
+  homogeneous_assign(z,
+		     static_cast<const Linear_Row&>(e),
+		     static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
 inline void
-DB_Row_Impl_Handler<T>::Impl::bump_size() {
-  ++size_;
+Scalar_Products::homogeneous_assign(Coefficient& z,
+				    const Linear_Expression& e,
+				    const Grid_Generator& g) {
+  homogeneous_assign(z,
+		     static_cast<const Linear_Row&>(e),
+		     static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
-inline
-DB_Row_Impl_Handler<T>::Impl::Impl()
-  : size_(0) {
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+				  const Generator& g) {
+  return homogeneous_sign(static_cast<const Linear_Row&>(e),
+			  static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
-inline
-DB_Row_Impl_Handler<T>::Impl::~Impl() {
-  shrink(0);
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+				  const Grid_Generator& g) {
+  return homogeneous_sign(static_cast<const Linear_Row&>(e),
+			  static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
-inline
-DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
-  : impl(0) {
-#if EXTRA_ROW_DEBUG
-  capacity_ = 0;
-#endif
+inline int
+Scalar_Products::homogeneous_sign(const Grid_Generator& g,
+				  const Constraint& c) {
+  TEMP_INTEGER(z);
+  homogeneous_assign(z, g, c);
+  return sgn(z);
 }
 
-template <typename T>
-template <typename U>
-void
-DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
-  const dimension_type y_size = y.size();
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0; i < y_size; ++i) {
-    construct(vec_[i], y[i], ROUND_UP);
-    bump_size();
-  }
-#else
-  assert(y_size > 0);
-  if (y_size > 0) {
-    vec_[0] = y[0];
-    bump_size();
-    // Construct in direct order: will destroy in reverse order.
-    for (dimension_type i = 1; i < y_size; ++i) {
-      construct(vec_[i], y[i], ROUND_UP);
-      bump_size();
-    }
-  }
-#endif
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+  : sps_fp(c.is_necessarily_closed()
+	   ? static_cast<SPS_type>(&Scalar_Products::sign)
+	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
 }
 
-template <typename T>
 inline
-DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
-  delete impl;
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+  : sps_fp(g.is_necessarily_closed()
+	   ? static_cast<SPS_type>(&Scalar_Products::sign)
+	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
 }
 
-template <typename T>
-inline T&
-DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
-  assert(k < size());
-  return vec_[k];
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+						  const Generator& g) const {
+  assert(c.space_dimension() <= g.space_dimension());
+  assert(sps_fp == (c.is_necessarily_closed()
+		    ? static_cast<SPS_type>(&Scalar_Products::sign)
+		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(static_cast<const Linear_Row&>(c),
+		static_cast<const Linear_Row&>(g));
 }
 
-template <typename T>
-inline const T&
-DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
-  assert(k < size());
-  return vec_[k];
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+						  const Constraint& c) const {
+  assert(g.space_dimension() <= c.space_dimension());
+  assert(sps_fp == (g.is_necessarily_closed()
+		    ? static_cast<SPS_type>(&Scalar_Products::sign)
+		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(static_cast<const Linear_Row&>(g),
+		static_cast<const Linear_Row&>(c));
 }
 
-template <typename T>
-inline dimension_type
-DB_Row<T>::max_size() {
-  return DB_Row_Impl_Handler<T>::Impl::max_size();
-}
+} // namespace Parma_Polyhedra_Library
 
-template <typename T>
-inline dimension_type
-DB_Row<T>::size() const {
-  return this->impl->size();
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Scalar_Products.defs.hh line 196
 
-#if EXTRA_ROW_DEBUG
-template <typename T>
-inline dimension_type
-DB_Row<T>::capacity() const {
-  return this->capacity_;
-}
-#endif // EXTRA_ROW_DEBUG
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BHRZ03_Certificate.defs.hh line 1
+/* BHRZ03_Certificate class declaration.
+*/
 
-template <typename T>
-inline
-DB_Row<T>::DB_Row()
-  : DB_Row_Impl_Handler<T>() {
-}
 
-template <typename T>
-inline void
-DB_Row<T>::allocate(
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-	       const
-#endif
-	       dimension_type capacity) {
-  DB_Row<T>& x = *this;
-  assert(capacity <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  if (capacity == 0)
-    ++capacity;
-#endif
-  assert(x.impl == 0);
-  x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
-#if EXTRA_ROW_DEBUG
-  assert(x.capacity_ == 0);
-  x.capacity_ = capacity;
-#endif
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BHRZ03_Certificate.defs.hh line 29
+#include <cassert>
+#include <vector>
 
-template <typename T>
-inline void
-DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
-  DB_Row<T>& x = *this;
-  assert(x.impl);
-#if EXTRA_ROW_DEBUG
-  assert(new_size <= x.capacity_);
-#endif
-  x.impl->expand_within_capacity(new_size);
-}
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
 
-template <typename T>
-inline void
-DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
-  DB_Row<T>& x = *this;
-  assert(x.impl && y.impl);
-#if EXTRA_ROW_DEBUG
-  assert(y.size() <= x.capacity_);
-#endif
-  x.impl->copy_construct_coefficients(*(y.impl));
-}
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, BHRZ03_Certificate
+  can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+  //! Default constructor.
+  BHRZ03_Certificate();
 
-template <typename T>
-template <typename U>
-inline void
-DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
-					  const dimension_type capacity) {
-  DB_Row<T>& x = *this;
-  assert(y.size() <= capacity && capacity <= max_size());
-  allocate(capacity);
-  assert(y.impl);
-  x.impl->construct_upward_approximation(*(y.impl));
-}
+  //! Constructor: computes the certificate for \p ph.
+  BHRZ03_Certificate(const Polyhedron& ph);
 
-template <typename T>
-inline void
-DB_Row<T>::construct(const dimension_type sz,
-		     const dimension_type capacity) {
-  assert(sz <= capacity && capacity <= max_size());
-  allocate(capacity);
-  expand_within_capacity(sz);
-}
+  //! Copy constructor.
+  BHRZ03_Certificate(const BHRZ03_Certificate& y);
 
-template <typename T>
-inline void
-DB_Row<T>::construct(const dimension_type sz) {
-  construct(sz, sz);
-}
+  //! Destructor.
+  ~BHRZ03_Certificate();
 
-template <typename T>
-inline
-DB_Row<T>::DB_Row(const dimension_type sz,
-		  const dimension_type capacity)
-  : DB_Row_Impl_Handler<T>() {
-  construct(sz, capacity);
-}
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
 
-template <typename T>
-inline
-DB_Row<T>::DB_Row(const dimension_type sz) {
-  construct(sz);
-}
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    BHRZ03 widening.
+  */
+  int compare(const BHRZ03_Certificate& y) const;
 
-template <typename T>
-inline
-DB_Row<T>::DB_Row(const DB_Row& y)
-  : DB_Row_Impl_Handler<T>() {
-  if (y.impl) {
-    allocate(compute_capacity(y.size(), max_size()));
-    copy_construct_coefficients(y);
-  }
-}
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
 
-template <typename T>
-inline
-DB_Row<T>::DB_Row(const DB_Row& y,
-		  const	dimension_type capacity)
-  : DB_Row_Impl_Handler<T>() {
-  assert(y.impl);
-  assert(y.size() <= capacity && capacity <= max_size());
-  allocate(capacity);
-  copy_construct_coefficients(y);
-}
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for
+    polyhedron \p ph is strictly smaller than \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_stabilizing(const Polyhedron& ph) const;
+
+  //! A total ordering on BHRZ03 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on BHRZ03 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const BHRZ03_Certificate& x,
+		    const BHRZ03_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Dimension of the lineality space of the polyhedron.
+  dimension_type lin_space_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+  /*! \brief
+    Number of non-redundant points in a generator system
+    for the polyhedron.
+  */
+  dimension_type num_points;
+  /*! \brief
+    A vector containing, for each index `0 <= i < space_dim',
+    the number of non-redundant rays in a generator system of the
+    polyhedron having exactly `i' null coordinates.
+  */
+  std::vector<dimension_type> num_rays_null_coord;
+};
 
-template <typename T>
-inline
-DB_Row<T>::DB_Row(const DB_Row& y,
-		  const dimension_type sz,
-		  const	dimension_type capacity)
-  : DB_Row_Impl_Handler<T>() {
-  assert(y.impl);
-  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
-  allocate(capacity);
-  copy_construct_coefficients(y);
-  expand_within_capacity(sz);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BHRZ03_Certificate.inlines.hh line 1
+/* BHRZ03_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
 
-template <typename T>
 inline
-DB_Row<T>::~DB_Row() {
+BHRZ03_Certificate::BHRZ03_Certificate()
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+    num_rays_null_coord() {
+  // This is the certificate for a zero-dim universe polyhedron.
+  assert(OK());
 }
 
-template <typename T>
-inline void
-DB_Row<T>::shrink(const dimension_type new_size) {
-  DB_Row<T>& x = *this;
-  assert(x.impl);
-  x.impl->shrink(new_size);
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+  : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+    num_constraints(y.num_constraints), num_points(y.num_points),
+    num_rays_null_coord(y.num_rays_null_coord) {
 }
 
-template <typename T>
-inline void
-DB_Row<T>::swap(DB_Row& y) {
-  DB_Row<T>& x = *this;
-  std::swap(x.impl, y.impl);
-#if EXTRA_ROW_DEBUG
-  std::swap(x.capacity_, y.capacity_);
-#endif
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
 }
 
-template <typename T>
-inline void
-DB_Row<T>::assign(DB_Row& y) {
-  DB_Row<T>& x = *this;
-  x.impl = y.impl;
-#if EXTRA_ROW_DEBUG
-  x.capacity_ = y.capacity_;
-#endif
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+  return compare(ph) == 1;
 }
 
-template <typename T>
-inline DB_Row<T>&
-DB_Row<T>::operator=(const DB_Row& y) {
-  // Copy-construct `tmp' from `y'.
-  DB_Row tmp(y);
-  // Swap the implementation of `*this' with the one of `tmp'.
-  swap(tmp);
-  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
-  return *this;
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+					const BHRZ03_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
 }
 
-template <typename T>
-inline T&
-DB_Row<T>::operator[](const dimension_type k) {
-  DB_Row<T>& x = *this;
-  return (*x.impl)[k];
-}
+} // namespace Parma_Polyhedra_Library
 
-template <typename T>
-inline const T&
-DB_Row<T>::operator[](const dimension_type k) const {
-  const DB_Row<T>& x = *this;
-  return (*x.impl)[k];
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/BHRZ03_Certificate.defs.hh line 116
 
-template <typename T>
-inline void
-DB_Row_Impl_Handler<T>::
-Impl::expand_within_capacity(const dimension_type new_size) {
-  assert(size() <= new_size && new_size <= max_size());
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // vec_[0] is already constructed.
-  if (size() == 0 && new_size > 0)
-    bump_size();
-#endif
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = size(); i < new_size; ++i) {
-    new (&vec_[i]) T(PLUS_INFINITY);
-    bump_size();
-  }
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/H79_Certificate.defs.hh line 1
+/* H79_Certificate class declaration.
+*/
 
-template <typename T>
-void
-DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
-  const dimension_type old_size = size();
-  assert(new_size <= old_size);
-  // Since ~T() does not throw exceptions, nothing here does.
-  set_size(new_size);
-#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // Make sure we do not try to destroy vec_[0].
-  if (new_size == 0)
-    ++new_size;
-#endif
-  // We assume construction was done "forward".
-  // We thus perform destruction "backward".
-  for (dimension_type i = old_size; i-- > new_size; )
-    vec_[i].~T();
-}
 
-template <typename T>
-void
-DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
-  const dimension_type y_size = y.size();
-#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0; i < y_size; ++i) {
-    new (&vec_[i]) T(y.vec_[i]);
-    bump_size();
-  }
-#else
-  assert(y_size > 0);
-  if (y_size > 0) {
-    vec_[0] = y.vec_[0];
-    bump_size();
-    // Construct in direct order: will destroy in reverse order.
-    for (dimension_type i = 1; i < y_size; ++i) {
-      new (&vec_[i]) T(y.vec_[i]);
-      bump_size();
-    }
-  }
-#endif
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/H79_Certificate.defs.hh line 29
+#include <cassert>
+#include <vector>
 
-template <typename T>
-typename DB_Row<T>::iterator
-DB_Row<T>::begin() {
-  DB_Row<T>& x = *this;
-  return iterator(x.impl->vec_);
-}
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+  \note
+  The convergence of the H79 widening can also be certified by
+  BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+  //! Default constructor.
+  H79_Certificate();
 
-template <typename T>
-typename DB_Row<T>::iterator
-DB_Row<T>::end() {
-  DB_Row<T>& x = *this;
-  return iterator(x.impl->vec_ + x.impl->size_);
-}
+  //! Constructor: computes the certificate for \p ph.
+  template <typename PH>
+  H79_Certificate(const PH& ph);
 
-template <typename T>
-typename DB_Row<T>::const_iterator
-DB_Row<T>::begin() const {
-  const DB_Row<T>& x = *this;
-  return const_iterator(x.impl->vec_);
-}
+  //! Constructor: computes the certificate for \p ph.
+  H79_Certificate(const Polyhedron& ph);
 
-template <typename T>
-typename DB_Row<T>::const_iterator
-DB_Row<T>::end() const {
-  const DB_Row<T>& x = *this;
-  return const_iterator(x.impl->vec_ + x.impl->size_);
-}
+  //! Copy constructor.
+  H79_Certificate(const H79_Certificate& y);
 
-template <typename T>
-inline bool
-DB_Row<T>::OK(const dimension_type row_size,
-	      const dimension_type
-#if EXTRA_ROW_DEBUG
-	      row_capacity
-#endif
-	      ) const {
-#ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
-#endif
+  //! Destructor.
+  ~H79_Certificate();
 
-  const DB_Row<T>& x = *this;
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
 
-  bool is_broken = false;
-#if EXTRA_ROW_DEBUG
-# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
-  if (x.capacity_ == 0) {
-    cerr << "Illegal row capacity: is 0, should be at least 1"
-	 << endl;
-    is_broken = true;
-  }
-  else if (x.capacity_ == 1 && row_capacity == 0)
-    // This is fine.
-    ;
-  else
-# endif
-  if (x.capacity_ != row_capacity) {
-    cerr << "DB_Row capacity mismatch: is " << x.capacity_
-	 << ", should be " << row_capacity << "."
-	 << endl;
-    is_broken = true;
-  }
-#endif
-  if (x.size() != row_size) {
-#ifndef NDEBUG
-    cerr << "DB_Row size mismatch: is " << x.size()
-	 << ", should be " << row_size << "."
-	 << endl;
-#endif
-    is_broken = true;
-  }
-#if EXTRA_ROW_DEBUG
-  if (x.capacity_ < x.size()) {
-#ifndef NDEBUG
-    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
-	 << ", size is " << x.size() << "."
-	 << endl;
-#endif
-    is_broken = true;
-  }
-#endif
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    H79 widening.
+  */
+  int compare(const H79_Certificate& y) const;
 
-  for (dimension_type i = x.size(); i-- > 0; ) {
-    const T& element = x[i];
-    // Not OK is bad.
-    if (!element.OK()) {
-      is_broken = true;
-      break;
-    }
-    // In addition, nans should never occur.
-    if (is_not_a_number(element)) {
-#ifndef NDEBUG
-      cerr << "Not-a-number found in DB_Row."
-	   << endl;
-#endif
-      is_broken = true;
-      break;
-    }
-  }
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  template <typename PH>
+  int compare(const PH& ph) const;
 
-  return !is_broken;
-}
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
 
+  //! A total ordering on H79 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on H79 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const H79_Certificate& x,
+		    const H79_Certificate& y) const;
+  };
 
-/*! \relates DB_Row */
-template <typename T>
-inline bool
-operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
-  if (x.size() != y.size())
-    return false;
-  for (dimension_type i = x.size(); i-- > 0; )
-    if (x[i] != y[i])
-      return false;
-  return true;
-}
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+};
 
-/*! \relates DB_Row */
-template <typename T>
-inline bool
-operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
-  return !(x == y);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/H79_Certificate.inlines.hh line 1
+/* H79_Certificate class implementation: inline functions.
+*/
 
-} // namespace Parma_Polyhedra_Library
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/H79_Certificate.inlines.hh line 27
 
-namespace std {
+namespace Parma_Polyhedra_Library {
 
-/*! \relates Parma_Polyhedra_Library::DB_Row */
-template <typename T>
-inline void
-swap(Parma_Polyhedra_Library::DB_Row<T>& x,
-     Parma_Polyhedra_Library::DB_Row<T>& y) {
-  x.swap(y);
+inline
+H79_Certificate::H79_Certificate()
+  : affine_dim(0), num_constraints(0) {
+  // This is the certificate for a zero-dim universe polyhedron.
 }
 
-/*! \relates Parma_Polyhedra_Library::DB_Row */
-template <typename T>
-inline void
-iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
-	  ::iterator x,
-	  typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
-	  ::iterator y) {
-  swap(*x, *y);
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+  : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
 }
 
-} // namespace std
-
-// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 430
+inline
+H79_Certificate::~H79_Certificate() {
+}
 
-// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 1
-/* DB_Matrix class declaration.
-*/
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+				     const H79_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
 
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+  : affine_dim(0), num_constraints(0) {
+  H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+  affine_dim = cert.affine_dim;
+  num_constraints = cert.num_constraints;
+}
 
-// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 31
-#include <vector>
-#include <cstddef>
-#include <iosfwd>
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+  return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
 
-namespace Parma_Polyhedra_Library {
+} // namespace Parma_Polyhedra_Library
 
-namespace IO_Operators {
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/H79_Certificate.defs.hh line 96
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-std::ostream&
-operator<<(std::ostream& s, const DB_Matrix<T>& c);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Certificate.defs.hh line 1
+/* Grid_Certificate class declaration.
+*/
 
-} // namespace IO_Operators
 
-} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Certificate.defs.hh line 27
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Certificate.defs.hh line 30
+#include <cassert>
+#include <vector>
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! The base class for the square matrices.
+//! The convergence certificate for the Grid widening operator.
 /*! \ingroup PPL_CXX_interface
-  The templatic class DB_Matrix<T> allows for the representation of
-  a square matrix of T objects.
-  Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, Grid_Certificate can
+  certify the Grid widening.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-class Parma_Polyhedra_Library::DB_Matrix {
+class Parma_Polyhedra_Library::Grid_Certificate {
 public:
-  //! Returns the maximum number of rows a DB_Matrix can handle.
-  static dimension_type max_num_rows();
-
-  //! Returns the maximum number of columns a DB_Matrix can handle.
-  static dimension_type max_num_columns();
-
-  //! Builds an empty matrix.
-  /*!
-    DB_Rows' size and capacity are initialized to \f$0\f$.
-  */
-  DB_Matrix();
-
-  //! Builds a square matrix having the specified dimension.
-  explicit DB_Matrix(dimension_type n_rows);
+  //! Default constructor.
+  Grid_Certificate();
 
-  //! Copy-constructor.
-  DB_Matrix(const DB_Matrix& y);
+  //! Constructor: computes the certificate for \p gr.
+  Grid_Certificate(const Grid& gr);
 
-  //! Constructs a conservative approximation of \p y.
-  template <typename U>
-  explicit DB_Matrix(const DB_Matrix<U>& y);
+  //! Copy constructor.
+  Grid_Certificate(const Grid_Certificate& y);
 
   //! Destructor.
-  ~DB_Matrix();
+  ~Grid_Certificate();
 
-  //! Assignment operator.
-  DB_Matrix& operator=(const DB_Matrix& y);
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+  */
+  int compare(const Grid_Certificate& y) const;
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! A read-only iterator over the rows of the matrix.
-  /*! \ingroup PPL_CXX_interface */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  class const_iterator {
-  private:
-    typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
-    //! The const iterator on the rows' vector \p rows.
-    Iter i;
+  //! Compares \p *this with the certificate for grid \p gr.
+  int compare(const Grid& gr) const;
 
-  public:
-    typedef std::forward_iterator_tag iterator_category;
-    typedef typename std::iterator_traits<Iter>::value_type value_type;
-    typedef typename std::iterator_traits<Iter>::difference_type
-    difference_type;
-    typedef typename std::iterator_traits<Iter>::pointer pointer;
-    typedef typename std::iterator_traits<Iter>::reference reference;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for grid
+    \p gr is strictly smaller than \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_stabilizing(const Grid& gr) const;
 
-    //! Default constructor.
-    const_iterator();
+  //! A total ordering on Grid certificates.
+  /*!
+    This binary predicate defines a total ordering on Grid certificates
+    which is used when storing information about sets of grids.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const Grid_Certificate& x,
+		    const Grid_Certificate& y) const;
+  };
 
-    /*! \brief
-      Builds a const iterator on the matrix starting from
-      an iterator \p b on the elements of the vector \p rows.
-    */
-    explicit const_iterator(const Iter& b);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
 
-    //! Ordinary copy-constructor.
-    const_iterator(const const_iterator& y);
+private:
+  //! Number of a equalities in a minimized congruence system for the
+  //! grid.
+  dimension_type num_equalities;
+  //! Number of a proper congruences in a minimized congruence system
+  //! for the grid.
+  dimension_type num_proper_congruences;
+};
 
-    //! Assignment operator.
-    const_iterator& operator=(const const_iterator& y);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Certificate.inlines.hh line 1
+/* Grid_Certificate class implementation: inline functions.
+*/
 
-    //! Dereference operator.
-    reference operator*() const;
 
-    //! Indirect member selector.
-    pointer operator->() const;
+namespace Parma_Polyhedra_Library {
 
-    //! Prefix increment operator.
-    const_iterator& operator++();
+inline
+Grid_Certificate::Grid_Certificate()
+  : num_equalities(0), num_proper_congruences(0) {
+  // This is the certificate for a zero-dim universe grid.
+  assert(OK());
+}
 
-    //! Postfix increment operator.
-    const_iterator operator++(int);
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+  : num_equalities(y.num_equalities),
+    num_proper_congruences(y.num_proper_congruences) {
+}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are identical.
-    */
-    bool operator==(const const_iterator& y) const;
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
 
-    /*! \brief
-      Returns <CODE>true</CODE> if and only if
-      \p *this and \p y are different.
-    */
-    bool operator!=(const const_iterator& y) const;
-  };
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+  return compare(gr) == 1;
+}
 
-  /*! \brief
-    Returns the const_iterator pointing to the first row,
-    if \p *this is not empty;
-    otherwise, returns the past-the-end const_iterator.
-  */
-  const_iterator begin() const;
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+				      const Grid_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+} // namespace Parma_Polyhedra_Library
 
-private:
-  template <typename U> friend class DB_Matrix;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Grid_Certificate.defs.hh line 102
 
-  //! The rows of the matrix.
-  std::vector<DB_Row<T> > rows;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/NNC_Polyhedron.defs.hh line 1
+/* NNC_Polyhedron class declaration.
+*/
 
-  //! Size of the initialized part of each row.
-  dimension_type row_size;
 
-  /*! \brief
-    Capacity allocated for each row, i.e., number of
-    <CODE>long</CODE> objects that each row can contain.
-  */
-  dimension_type row_capacity;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/NNC_Polyhedron.defs.hh line 30
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class NNC_Polyhedron represents a
+    <EM>not necessarily closed</EM> (NNC) convex polyhedron
+    in the vector space \f$\Rset^n\f$.
 
+    \note
+    Since NNC polyhedra are a generalization of closed polyhedra,
+    any object of the class C_Polyhedron can be (explicitly) converted
+    into an object of the class NNC_Polyhedron.
+    The reason for defining two different classes is that objects of
+    the class C_Polyhedron are characterized by a more efficient
+    implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
 public:
-  //! Swaps \p *this with \p y.
-  void swap(DB_Matrix& y);
+  //! Builds either the universe or the empty NNC polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the NNC polyhedron;
 
+    \param kind
+    Specifies whether a universe or an empty NNC polyhedron should be built.
 
-  //! Makes the matrix grow by adding more rows and more columns.
-  /*!
-    \param new_n_rows
-    The number of rows and columns of the resized matrix.
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
 
-    A new matrix, with the specified dimension, is created.
-    The contents of the old matrix are copied in the upper, left-hand
-    corner of the new matrix, which is then assigned to \p *this.
+    Both parameters are optional:
+    by default, a 0-dimension space universe NNC polyhedron is built.
   */
-  void grow(dimension_type new_n_rows);
+  explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+			  Degenerate_Element kind = UNIVERSE);
 
-  //! Resizes the matrix without worrying about the old contents.
+  //! Builds an NNC polyhedron from a system of constraints.
   /*!
-    \param new_n_rows
-    The number of rows and columns of the resized matrix.
+    The polyhedron inherits the space dimension of the constraint system.
 
-    A new matrix, with the specified dimension, is created without copying
-    the content of the old matrix and assigned to \p *this.
+    \param cs
+    The system of constraints defining the polyhedron.
   */
-  void resize_no_copy(dimension_type new_n_rows);
-
-  //! Returns the number of rows in the matrix.
-  dimension_type num_rows() const;
-
-  //! \name Subscript operators.
-  //@{
-  //! Returns a reference to the \p k-th row of the matrix.
-  DB_Row<T>& operator[](dimension_type k);
+  explicit NNC_Polyhedron(const Constraint_System& cs);
 
-  //! Returns a constant reference to the \p k-th row of the matrix.
-  const DB_Row<T>& operator[](dimension_type k) const;
-  //@}
+  //! Builds an NNC polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
 
-  PPL_OUTPUT_DECLARATIONS;
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
 
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE>
-    if successful, <CODE>false</CODE> otherwise.
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
   */
-  bool ascii_load(std::istream& s);
-
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
-};
-
-namespace std {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
-	  Parma_Polyhedra_Library::DB_Matrix<T>& y);
-
-} // namespace std
+  NNC_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
 
+  //! Builds an NNC polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
 
-namespace Parma_Polyhedra_Library {
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
-
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+    \param gs
+    The system of generators defining the polyhedron.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
-/*! \relates DB_Matrix
-  If the rectilinear distance between \p x and \p y is defined,
-  stores an approximation of it into to \p r
-  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(const Generator_System& gs);
 
-  The direction of the approximation is specified by \p dir.
+  //! Builds an NNC polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
 
-  All computations are performed using the temporary variables
-  \p tmp0, \p tmp1 and \p tmp2.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Temp, typename To, typename T>
-bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const DB_Matrix<T>& x,
-				 const DB_Matrix<T>& y,
-				 const Rounding_Dir dir,
-				 Temp& tmp0,
-				 Temp& tmp1,
-				 Temp& tmp2);
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Computes the euclidean distance between \p x and \p y.
-/*! \relates DB_Matrix
-  If the Euclidean distance between \p x and \p y is defined,
-  stores an approximation of it into to \p r
-  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
 
-  The direction of the approximation is specified by \p dir.
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  NNC_Polyhedron(Generator_System& gs, Recycle_Input dummy);
 
-  All computations are performed using the temporary variables
-  \p tmp0, \p tmp1 and \p tmp2.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Temp, typename To, typename T>
-bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const DB_Matrix<T>& x,
-			       const DB_Matrix<T>& y,
-			       const Rounding_Dir dir,
-			       Temp& tmp0,
-			       Temp& tmp1,
-			       Temp& tmp2);
+  //! Builds an NNC polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
-/*! \relates DB_Matrix
-  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
-  stores an approximation of it into to \p r
-  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Congruence_System& cgs);
 
-  The direction of the approximation is specified by \p dir.
+  //! Builds an NNC polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
 
-  All computations are performed using the temporary variables
-  \p tmp0, \p tmp1 and \p tmp2.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Temp, typename To, typename T>
-bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const DB_Matrix<T>& x,
-				 const DB_Matrix<T>& y,
-				 const Rounding_Dir dir,
-				 Temp& tmp0,
-				 Temp& tmp1,
-				 Temp& tmp2);
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
 
-} // namespace Parma_Polyhedra_Library
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  NNC_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
 
-// Automatically generated from PPL source file ../src/DB_Matrix.inlines.hh line 1
-/* DB_Matrix class implementation: inline functions.
-*/
+  //! Builds an NNC polyhedron from the C polyhedron \p y.
+  /*!
+    \param y
+    The C polyhedron to be used;
 
+    \param complexity
+    This argument is ignored.
+  */
+  explicit NNC_Polyhedron(const C_Polyhedron& y,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
 
-// Automatically generated from PPL source file ../src/DB_Matrix.inlines.hh line 28
-#include <cassert>
-#include <iostream>
+  //! Builds an NNC polyhedron out of a box.
+  /*!
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
 
-namespace Parma_Polyhedra_Library {
+    \param box
+    The box representing the polyhedron to be built;
 
-template <typename T>
-inline void
-DB_Matrix<T>::swap(DB_Matrix& y) {
-  std::swap(rows, y.rows);
-  std::swap(row_size, y.row_size);
-  std::swap(row_capacity, y.row_capacity);
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
 
-template <typename T>
-inline dimension_type
-DB_Matrix<T>::max_num_rows() {
-  return std::vector<DB_Row<T> >().max_size();
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Interval>
+  explicit NNC_Polyhedron(const Box<Interval>& box,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline dimension_type
-DB_Matrix<T>::max_num_columns() {
-  return DB_Row<T>::max_size();
-}
+  //! Builds an NNC polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
 
-template <typename T>
-inline
-DB_Matrix<T>::const_iterator::const_iterator()
-  : i(Iter()) {
-}
+    \param grid
+    The grid used to build the polyhedron.
 
-template <typename T>
-inline
-DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
-  : i(b) {
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit NNC_Polyhedron(const Grid& grid,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline
-DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
-  : i(y.i) {
-}
+  //! Builds a NNC polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BD shape
+    and is the most precise that includes the BD shape.
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator&
-DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
-  i = y.i;
-  return *this;
-}
+    \param bd
+    The BD shape used to build the polyhedron.
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator::reference
-DB_Matrix<T>::const_iterator::operator*() const {
-  return *i;
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const BD_Shape<U>& bd,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator::pointer
-DB_Matrix<T>::const_iterator::operator->() const {
-  return &*i;
-}
+  //! Builds a NNC polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator&
-DB_Matrix<T>::const_iterator::operator++() {
-  ++i;
-  return *this;
-}
+    \param os
+    The octagonal shape used to build the polyhedron.
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator
-DB_Matrix<T>::const_iterator::operator++(int) {
-  return const_iterator(i++);
-}
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const Octagonal_Shape<U>& os,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline bool
-DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
-  return i == y.i;
-}
+  //! Ordinary copy-constructor.
+  NNC_Polyhedron(const NNC_Polyhedron& y,
+                 Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline bool
-DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
-  return !operator==(y);
-}
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator
-DB_Matrix<T>::begin() const {
-  return const_iterator(rows.begin());
-}
+  //! Assigns to \p *this the C polyhedron \p y.
+  NNC_Polyhedron& operator=(const C_Polyhedron& y);
 
-template <typename T>
-inline typename DB_Matrix<T>::const_iterator
-DB_Matrix<T>::end() const {
-  return const_iterator(rows.end());
-}
+  //! Destructor.
+  ~NNC_Polyhedron();
 
-template <typename T>
-inline
-DB_Matrix<T>::DB_Matrix()
-  : rows(),
-    row_size(0),
-    row_capacity(0) {
-}
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
 
-template <typename T>
-inline
-DB_Matrix<T>::~DB_Matrix() {
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
 
-template <typename T>
-inline DB_Row<T>&
-DB_Matrix<T>::operator[](const dimension_type k) {
-  assert(k < rows.size());
-  return rows[k];
-}
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+};
 
-template <typename T>
-inline const DB_Row<T>&
-DB_Matrix<T>::operator[](const dimension_type k) const {
-  assert(k < rows.size());
-  return rows[k];
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/NNC_Polyhedron.inlines.hh line 1
+/* NNC_Polyhedron class implementation: inline functions.
+*/
 
-template <typename T>
-inline dimension_type
-DB_Matrix<T>::num_rows() const {
-  return rows.size();
-}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-inline bool
-operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
-  return !(x == y);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/NNC_Polyhedron.inlines.hh line 27
 
-template <typename T>
-inline
-DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
-  : rows(n_rows),
-    row_size(n_rows),
-    row_capacity(compute_capacity(n_rows, max_num_columns())) {
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0; i < n_rows; ++i)
-    rows[i].construct(n_rows, row_capacity);
-  assert(OK());
-}
+namespace Parma_Polyhedra_Library {
 
-template <typename T>
 inline
-DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
-  : rows(y.rows),
-    row_size(y.row_size),
-    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+NNC_Polyhedron::~NNC_Polyhedron() {
 }
 
-template <typename T>
-template <typename U>
 inline
-DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
-  : rows(y.rows.size()),
-    row_size(y.row_size),
-    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
-  // Construct in direct order: will destroy in reverse order.
-  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
-    rows[i].construct_upward_approximation(y[i], row_capacity);
-  assert(OK());
-}
-
-template <typename T>
-inline DB_Matrix<T>&
-DB_Matrix<T>::operator=(const DB_Matrix& y) {
-  // Without the following guard against auto-assignments we would
-  // recompute the row capacity based on row size, possibly without
-  // actually increasing the capacity of the rows.  This would lead to
-  // an inconsistent state.
-  if (this != &y) {
-    // The following assignment may do nothing on auto-assignments...
-    rows = y.rows;
-    row_size = y.row_size;
-    // ... hence the following assignment must not be done on
-    // auto-assignments.
-    row_capacity = compute_capacity(y.row_size, max_num_columns());
-  }
-  return *this;
-}
-
-template <typename T>
-void
-DB_Matrix<T>::grow(const dimension_type new_n_rows) {
-  const dimension_type old_n_rows = rows.size();
-  assert(new_n_rows >= old_n_rows);
-
-  if (new_n_rows > old_n_rows) {
-    if (new_n_rows <= row_capacity) {
-      // We can recycle the old rows.
-      if (rows.capacity() < new_n_rows) {
-	// Reallocation will take place.
-	std::vector<DB_Row<T> > new_rows;
-	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
-	// Construct the new rows.
-	dimension_type i = new_n_rows;
-	while (i-- > old_n_rows)
-	  new_rows[i].construct(new_n_rows, row_capacity);
-	// Steal the old rows.
-	++i;
-	while (i-- > 0)
-	  new_rows[i].swap(rows[i]);
-	// Put the new vector into place.
-	std::swap(rows, new_rows);
-      }
-      else {
-	// Reallocation will NOT take place.
-	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
-	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
-	  rows[i].construct(new_n_rows, row_capacity);
-      }
-    }
-    else {
-      // We cannot even recycle the old rows.
-      DB_Matrix new_matrix;
-      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
-      // Construct the new rows.
-      new_matrix.row_size = new_n_rows;
-      new_matrix.row_capacity = compute_capacity(new_n_rows,
-						 max_num_columns());
-      dimension_type i = new_n_rows;
-      while (i-- > old_n_rows)
-	new_matrix.rows[i].construct(new_matrix.row_size,
-				     new_matrix.row_capacity);
-      // Copy the old rows.
-      ++i;
-      while (i-- > 0) {
-	DB_Row<T> new_row(rows[i],
-			  new_matrix.row_size,
-			  new_matrix.row_capacity);
-	std::swap(new_matrix.rows[i], new_row);
-      }
-      // Put the new vector into place.
-      swap(new_matrix);
-      return;
-    }
-  }
-  // Here we have the right number of rows.
-  if (new_n_rows > row_size) {
-    // We need more columns.
-    if (new_n_rows <= row_capacity)
-      // But we have enough capacity: we resize existing rows.
-      for (dimension_type i = old_n_rows; i-- > 0; )
-	rows[i].expand_within_capacity(new_n_rows);
-    else {
-      // Capacity exhausted: we must reallocate the rows and
-      // make sure all the rows have the same capacity.
-      const dimension_type new_row_capacity
-	= compute_capacity(new_n_rows, max_num_columns());
-      for (dimension_type i = old_n_rows; i-- > 0; ) {
-	DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
-	std::swap(rows[i], new_row);
-      }
-      row_capacity = new_row_capacity;
-    }
-    // Rows have grown or shrunk.
-    row_size = new_n_rows;
-  }
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+			       Degenerate_Element kind)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       num_dimensions <= max_space_dimension()
+	       ? num_dimensions
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(n, k)",
+						 "n exceeds the maximum "
+						 "allowed space dimension"),
+		  num_dimensions),
+	       kind) {
 }
 
-template <typename T>
-void
-DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
-  dimension_type old_n_rows = rows.size();
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
 
-  if (new_n_rows > old_n_rows) {
-    // Rows will be inserted.
-    if (new_n_rows <= row_capacity) {
-      // We can recycle the old rows.
-      if (rows.capacity() < new_n_rows) {
-	// Reallocation (of vector `rows') will take place.
-	std::vector<DB_Row<T> > new_rows;
-	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
-	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
-	// Construct the new rows (be careful: each new row must have
-	// the same capacity as each one of the old rows).
-	dimension_type i = new_n_rows;
-	while (i-- > old_n_rows)
-	  new_rows[i].construct(new_n_rows, row_capacity);
-	// Steal the old rows.
-	++i;
-	while (i-- > 0)
-	  new_rows[i].swap(rows[i]);
-	// Put the new vector into place.
-	std::swap(rows, new_rows);
-      }
-      else {
-	// Reallocation (of vector `rows') will NOT take place.
-	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
-	// Be careful: each new row must have
-	// the same capacity as each one of the old rows.
-	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
-	  rows[i].construct(new_n_rows, row_capacity);
-      }
-    }
-    else {
-      // We cannot even recycle the old rows: allocate a new matrix and swap.
-      DB_Matrix new_matrix(new_n_rows);
-      swap(new_matrix);
-      return;
-    }
-  }
-  else if (new_n_rows < old_n_rows) {
-    // Drop some rows.
-    rows.erase(rows.begin() + new_n_rows, rows.end());
-    // Shrink the existing rows.
-    for (dimension_type i = new_n_rows; i-- > 0; )
-      rows[i].shrink(new_n_rows);
-    old_n_rows = new_n_rows;
-  }
-  // Here we have the right number of rows.
-  if (new_n_rows > row_size) {
-    // We need more columns.
-    if (new_n_rows <= row_capacity)
-      // But we have enough capacity: we resize existing rows.
-      for (dimension_type i = old_n_rows; i-- > 0; )
-	rows[i].expand_within_capacity(new_n_rows);
-    else {
-      // Capacity exhausted: we must reallocate the rows and
-      // make sure all the rows have the same capacity.
-      const dimension_type new_row_capacity
-	= compute_capacity(new_n_rows, max_num_columns());
-      for (dimension_type i = old_n_rows; i-- > 0; ) {
-	DB_Row<T> new_row(new_n_rows, new_row_capacity);
-	std::swap(rows[i], new_row);
-      }
-      row_capacity = new_row_capacity;
-    }
-  }
-  // DB_Rows have grown or shrunk.
-  row_size = new_n_rows;
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cs, recycle)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs),
+	       Recycle_Input()) {
 }
 
-template <typename T>
-void
-DB_Matrix<T>::ascii_dump(std::ostream& s) const {
-  const DB_Matrix<T>& x = *this;
-  const char separator = ' ';
-  const dimension_type nrows = x.num_rows();
-  s << nrows << separator << "\n";
-  for (dimension_type i = 0; i < nrows;  ++i) {
-    for (dimension_type j = 0; j < nrows; ++j) {
-      using namespace IO_Operators;
-      s << x[i][j] << separator;
-    }
-    s << "\n";
-  }
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(gs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)) {
 }
 
-PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>);
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(gs, recycle)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs),
+	       Recycle_Input()) {
+}
 
-template <typename T>
-bool
-DB_Matrix<T>::ascii_load(std::istream& s) {
-  dimension_type nrows;
-   if (!(s >> nrows))
-    return false;
-  resize_no_copy(nrows);
-  DB_Matrix& x = *this;
-  for (dimension_type i = 0; i < nrows;  ++i)
-    for (dimension_type j = 0; j < nrows; ++j) {
-      Result r = input(x[i][j], s, ROUND_UP);
-      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
-      if (!s || r == V_CVT_STR_UNK)
-	return false;
-    }
-  // Check for well-formedness.
-  assert(OK());
-  return true;
+template <typename Interval>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>& box, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       box.space_dimension() <= max_space_dimension()
+	       ? box
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(box)",
+						 "the space dimension of box "
+						 "exceeds the maximum allowed "
+						 "space dimension"), box)) {
 }
 
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       bd.space_dimension() <= max_space_dimension()
+	       ? bd.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(bd): ",
+						 "the space dimension of bd "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-inline bool
-operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
-  const dimension_type x_num_rows = x.num_rows();
-  if (x_num_rows != y.num_rows())
-    return false;
-  for (dimension_type i = x_num_rows; i-- > 0; )
-    if (x[i] != y[i])
-      return false;
-  return true;
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       os.space_dimension() <= max_space_dimension()
+	       ? os.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(os): ",
+						 "the space dimension of os "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+               UNIVERSE) {
+  add_constraints(os.constraints());
 }
 
-template <typename To, typename From>
-struct maybe_assign_struct {
-  static inline Result
-  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
-    // When `To' and `From' are different types, we make the conversion
-    // and use `tmp'.
-    top = &tmp;
-    return assign_r(tmp, from, dir);
-  }
-};
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+  : Polyhedron(y) {
+}
 
-template <typename Type>
-struct maybe_assign_struct<Type, Type> {
-  static inline Result
-  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
-    // When the types are the same, conversion is unnecessary.
-    top = &from;
-    return V_EQ;
-  }
-};
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Assigns to \p top a pointer to a location that holds the
-  conversion, according to \p dir, of \p from to type \p To.  When
-  necessary, and only when necessary, the variable \p tmp is used to
-  hold the result of conversion.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename To, typename From>
-inline Result
-maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
-  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+  NNC_Polyhedron nnc_y(y);
+  swap(nnc_y);
+  return *this;
 }
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Specialization, typename Temp, typename To, typename T>
 inline bool
-l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-		    const DB_Matrix<T>& x,
-		    const DB_Matrix<T>& y,
-		    const Rounding_Dir dir,
-		    Temp& tmp0,
-		    Temp& tmp1,
-		    Temp& tmp2) {
-  const dimension_type x_num_rows = x.num_rows();
-  if (x_num_rows != y.num_rows())
-    return false;
-  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
-  for (dimension_type i = x_num_rows; i-- > 0; ) {
-    const DB_Row<T>& x_i = x[i];
-    const DB_Row<T>& y_i = y[i];
-    for (dimension_type j = x_num_rows; j-- > 0; ) {
-      const T& x_i_j = x_i[j];
-      const T& y_i_j = y_i[j];
-      if (is_plus_infinity(x_i_j)) {
-	if (is_plus_infinity(y_i_j))
-	  continue;
-	else {
-	pinf:
-	  r = PLUS_INFINITY;
-	  return true;
-	}
-      }
-      else if (is_plus_infinity(y_i_j))
-	goto pinf;
-
-      const Temp* tmp1p;
-      const Temp* tmp2p;
-      if (x_i_j > y_i_j) {
-	maybe_assign(tmp1p, tmp1, x_i_j, dir);
-	maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
-      }
-      else {
-	maybe_assign(tmp1p, tmp1, y_i_j, dir);
-	maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
-      }
-      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
-      assert(tmp1 >= 0);
-      Specialization::combine(tmp0, tmp1, dir);
-    }
-  }
-  Specialization::finalize(tmp0, dir);
-  assign_r(r, tmp0, dir);
-  return true;
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
 }
 
-template <typename Temp>
-struct Rectilinear_Distance_Specialization {
-  static inline void
-  combine(Temp& running, const Temp& current, Rounding_Dir dir) {
-    add_assign_r(running, running, current, dir);
-  }
+} // namespace Parma_Polyhedra_Library
 
-  static inline void
-  finalize(Temp&, Rounding_Dir) {
-  }
-};
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/NNC_Polyhedron.defs.hh line 254
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Widening_Function.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Widening_Function;
+
+template <typename PH, typename CS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Widening_Function.defs.hh line 1
+/* Widening_Function class declaration.
+*/
+
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Widening_Function.defs.hh line 28
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Temp, typename To, typename T>
-inline bool
-rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			    const DB_Matrix<T>& x,
-			    const DB_Matrix<T>& y,
-			    const Rounding_Dir dir,
-			    Temp& tmp0,
-			    Temp& tmp1,
-			    Temp& tmp2) {
-  return
-    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
-								    dir,
-								    tmp0,
-								    tmp1,
-								    tmp2);
-}
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+  //! The (parametric) type of a widening method.
+  typedef void (PH::* Widening_Method)(const PH&, unsigned*);
 
+  //! Explicit unary constructor.
+  explicit
+  Widening_Function(Widening_Method wm);
 
-template <typename Temp>
-struct Euclidean_Distance_Specialization {
-  static inline void
-  combine(Temp& running, Temp& current, Rounding_Dir dir) {
-    mul_assign_r(current, current, current, dir);
-    add_assign_r(running, running, current, dir);
-  }
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+    method stored at construction time.
+  */
+  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
 
-  static inline void
-  finalize(Temp& running, Rounding_Dir dir) {
-    sqrt_assign_r(running, running, dir);
-  }
+private:
+  //! The widening method.
+  Widening_Method w_method;
 };
 
+
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Temp, typename To, typename T>
-inline bool
-euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			  const DB_Matrix<T>& x,
-			  const DB_Matrix<T>& y,
-			  const Rounding_Dir dir,
-			  Temp& tmp0,
-			  Temp& tmp1,
-			  Temp& tmp2) {
-  return
-    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
-								  dir,
-								  tmp0,
-								  tmp1,
-								  tmp2);
-}
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH, typename CS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+  //! The (parametric) type of a limited widening method.
+  typedef void (PH::* Limited_Widening_Method)(const PH&,
+					       const CS&,
+					       unsigned*);
 
+  //! Constructor.
+  /*!
+    \param lwm
+    The limited widening method.
 
-template <typename Temp>
-struct L_Infinity_Distance_Specialization {
-  static inline void
-  combine(Temp& running, const Temp& current, Rounding_Dir) {
-    if (current > running)
-      running = current;
-  }
+    \param cs
+    The constraint system limiting the widening.
+  */
+  Limited_Widening_Function(Limited_Widening_Method lwm,
+			    const CS& cs);
 
-  static inline void
-  finalize(Temp&, Rounding_Dir) {
-  }
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+    are the limited widening method and the constraint system stored
+    at construction time.
+  */
+  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+
+private:
+  //! The limited widening method.
+  Limited_Widening_Method lw_method;
+  //! A constant reference to the constraint system limiting the widening.
+  const CS& limiting_cs;
 };
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename Temp, typename To, typename T>
-inline bool
-l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			   const DB_Matrix<T>& x,
-			   const DB_Matrix<T>& y,
-			   const Rounding_Dir dir,
-			   Temp& tmp0,
-			   Temp& tmp1,
-			   Temp& tmp2) {
-  return
-    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
-								   dir,
-								   tmp0,
-								   tmp1,
-								   tmp2);
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+  \relates Pointset_Powerset
+
+  \param wm
+  The widening method.
+*/
+template <typename PH>
+Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+  \relates Pointset_Powerset
+
+  \param lwm
+  The limited widening method.
+
+  \param cs
+  The constraint system limiting the widening.
+*/
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+	      const CS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Widening_Function.inlines.hh line 1
+/* Widening_Function class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+Widening_Function<PH>::Widening_Function(Widening_Method wm)
+  : w_method(wm) {
 }
 
-template <typename T>
-bool
-DB_Matrix<T>::OK() const {
-#ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
-#endif
+template <typename PH>
+inline void
+Widening_Function<PH>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+  (x.*w_method)(y, tp);
+}
 
-  // The matrix must be square.
-  if (num_rows() != row_size) {
-#ifndef NDEBUG
-    cerr << "DB_Matrix has fewer columns than rows:\n"
-	 << "row_size is " << row_size
-	 << ", num_rows() is " << num_rows() << "!"
-	 << endl;
-#endif
-    return false;
-  }
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+			  const CS& cs)
+  : lw_method(lwm), limiting_cs(cs) {
+}
 
-  const DB_Matrix& x = *this;
-  const dimension_type n_rows = x.num_rows();
-  for (dimension_type i = 0; i < n_rows; ++i) {
-    if (!x[i].OK(row_size, row_capacity))
-      return false;
-  }
+template <typename PH, typename CS>
+inline void
+Limited_Widening_Function<PH, CS>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+  (x.*lw_method)(y, limiting_cs, tp);
+}
 
-  // All checks passed.
-  return true;
+/*! \relates Pointset_Powerset */
+template <typename PH>
+inline Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
+  return Widening_Function<PH>(wm);
 }
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates Parma_Polyhedra_Library::DB_Matrix */  //FIXME!!
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-std::ostream&
-IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
-  const dimension_type n = c.num_rows();
-  for (dimension_type i = 0; i < n; ++i) {
-    for (dimension_type j = 0; j < n; ++j)
-      s << c[i][j] << " ";
-    s << "\n";
-  }
-  return s;
+/*! \relates Pointset_Powerset */
+template <typename PH, typename CS>
+inline Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+	      const CS& cs) {
+  return Limited_Widening_Function<PH, CS>(lwm, cs);
 }
 
 } // namespace Parma_Polyhedra_Library
 
-namespace std {
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \relates Parma_Polyhedra_Library::DB_Matrix */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T>
-inline void
-swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
-     Parma_Polyhedra_Library::DB_Matrix<T>& y) {
-  x.swap(y);
-}
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Widening_Function.defs.hh line 125
 
-} // namespace std
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Determinate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PS>
+class Determinate;
 
-// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 323
+} // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1
-/* BD_Shape class declaration.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Determinate.defs.hh line 1
+/* Determinate class declaration.
 */
 
 
-// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 40
-#include <cstddef>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Determinate.defs.hh line 31
 #include <iosfwd>
-#include <vector>
-#include <deque>
-
+#include <cassert>
 
 namespace Parma_Polyhedra_Library {
 
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same domain element.
+
+  \relates Determinate
+*/
+template <typename PS>
+bool operator==(const Determinate<PS>& x, const Determinate<PS>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different domain elements.
+
+  \relates Determinate
+*/
+template <typename PS>
+bool operator!=(const Determinate<PS>& x, const Determinate<PS>& y);
+
 namespace IO_Operators {
 
 //! Output operator.
-/*! \relates Parma_Polyhedra_Library::BD_Shape
-  Writes a textual representation of \p bds on \p s:
-  <CODE>false</CODE> is written if \p bds is an empty polyhedron;
-  <CODE>true</CODE> is written if \p bds is the universe polyhedron;
-  a system of constraints defining \p bds is written otherwise,
-  all constraints separated by ", ".
-*/
-template <typename T>
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PS>
 std::ostream&
-operator<<(std::ostream& s, const BD_Shape<T>& bds);
+operator<<(std::ostream&, const Determinate<PS>&);
 
 } // namespace IO_Operators
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
-/*!
-  \relates BD_Shape
-  Note that \p x and \p y may be dimension-incompatible shapes:
-  in this case, the value <CODE>false</CODE> is returned.
-*/
-template <typename T>
-bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+} // namespace Parma_Polyhedra_Library
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same BDS.
-/*!
- \relates BD_Shape
-  Note that \p x and \p y may be dimension-incompatible shapes:
-  in this case, the value <CODE>true</CODE> is returned.
-*/
-template <typename T>
-bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+//! Wraps a PPL class into a determinate constraint system interface.
+/*! \ingroup PPL_CXX_interface */
+template <typename PS>
+class Parma_Polyhedra_Library::Determinate {
+public:
+  //! \name Constructors and Destructor
+  //@{
 
-//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the rectilinear distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  /*! \brief
+    Injection operator: builds the determinate constraint system element
+    corresponding to the base-level element \p p.
+  */
+  Determinate(const PS& p);
 
-  The direction of the approximation is specified by \p dir.
+  /*! \brief
+    Injection operator: builds the determinate constraint system element
+    corresponding to the base-level element represented by \p cs.
+  */
+  Determinate(const Constraint_System& cs);
 
-  All computations are performed using variables of type
-  Checked_Number<To, Extended_Number_Policy>.
-*/
-template <typename To, typename T>
-bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const BD_Shape<T>& x,
-				 const BD_Shape<T>& y,
-				 const Rounding_Dir dir);
+  //! \brief
+  //! Injection operator: builds the determinate constraint system element
+  //! corresponding to the base-level element represented by \p cgs.
+  Determinate(const Congruence_System& cgs);
 
-//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the rectilinear distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  //! Copy constructor.
+  Determinate(const Determinate& y);
 
-  The direction of the approximation is specified by \p dir.
+  //! Destructor.
+  ~Determinate();
 
-  All computations are performed using variables of type
-  Checked_Number<Temp, Extended_Number_Policy>.
-*/
-template <typename Temp, typename To, typename T>
-bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const BD_Shape<T>& x,
-				 const BD_Shape<T>& y,
-				 const Rounding_Dir dir);
+  //@} // Constructors and Destructor
 
-//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the rectilinear distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  //! \name Member Functions that Do Not Modify the Domain Element
+  //@{
 
-  The direction of the approximation is specified by \p dir.
+  //! Returns a const reference to the embedded element.
+  const PS& element() const;
 
-  All computations are performed using the temporary variables
-  \p tmp0, \p tmp1 and \p tmp2.
-*/
-template <typename Temp, typename To, typename T>
-bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				 const BD_Shape<T>& x,
-				 const BD_Shape<T>& y,
-				 const Rounding_Dir dir,
-				 Temp& tmp0,
-				 Temp& tmp1,
-				 Temp& tmp2);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top of the
+    determinate constraint system (i.e., the whole vector space).
+  */
+  bool is_top() const;
 
-//! Computes the euclidean distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the euclidean distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    of the determinate constraint system.
+  */
+  bool is_bottom() const;
 
-  The direction of the approximation is specified by \p dir.
+  //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+  bool definitely_entails(const Determinate& y) const;
 
-  All computations are performed using variables of type
-  Checked_Number<To, Extended_Number_Policy>.
-*/
-template <typename To, typename T>
-bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const BD_Shape<T>& x,
-			       const BD_Shape<T>& y,
-			       const Rounding_Dir dir);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent.
+  */
+  bool is_definitely_equivalent_to(const Determinate& y) const;
 
-//! Computes the euclidean distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the euclidean distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
 
-  The direction of the approximation is specified by \p dir.
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
 
-  All computations are performed using variables of type
-  Checked_Number<Temp, Extended_Number_Policy>.
-*/
-template <typename Temp, typename To, typename T>
-bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const BD_Shape<T>& x,
-			       const BD_Shape<T>& y,
-			       const Rounding_Dir dir);
+  /*!
+    Returns <CODE>true</CODE> if and only if this domain
+    has a nontrivial weakening operator.
+  */
+  static bool has_nontrivial_weakening();
 
-//! Computes the euclidean distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the euclidean distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-  The direction of the approximation is specified by \p dir.
+  //@} // Member Functions that Do Not Modify the Domain Element
 
-  All computations are performed using the temporary variables
-  \p tmp0, \p tmp1 and \p tmp2.
-*/
-template <typename Temp, typename To, typename T>
-bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			       const BD_Shape<T>& x,
-			       const BD_Shape<T>& y,
-			       const Rounding_Dir dir,
-			       Temp& tmp0,
-			       Temp& tmp1,
-			       Temp& tmp2);
 
-//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  //! \name Member Functions that May Modify the Domain Element
+  //@{
 
-  The direction of the approximation is specified by \p dir.
+  //! Assigns to \p *this the upper bound of \p *this and \p y.
+  void upper_bound_assign(const Determinate& y);
 
-  All computations are performed using variables of type
-  Checked_Number<To, Extended_Number_Policy>.
-*/
-template <typename To, typename T>
-bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				const BD_Shape<T>& x,
-				const BD_Shape<T>& y,
-				const Rounding_Dir dir);
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Determinate& y);
 
-//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+  //! Assigns to \p *this the result of weakening \p *this with \p y.
+  void weakening_assign(const Determinate& y);
 
-  The direction of the approximation is specified by \p dir.
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+  */
+  void concatenate_assign(const Determinate& y);
 
-  All computations are performed using variables of type
-  Checked_Number<Temp, Extended_Number_Policy>.
-*/
-template <typename Temp, typename To, typename T>
-bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				const BD_Shape<T>& x,
-				const BD_Shape<T>& y,
-				const Rounding_Dir dir);
+  //! Returns a reference to the embedded element.
+  PS& element();
 
-//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
-/*! \relates BD_Shape
-  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
-  stores an approximation of it into \p r and returns <CODE>true</CODE>;
-  returns <CODE>false</CODE> otherwise.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    On return from this method, the representation of \p *this
+    is not shared by different Determinate objects.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  void mutate();
 
-  The direction of the approximation is specified by \p dir.
+  //! Assignment operator.
+  Determinate& operator=(const Determinate& y);
 
-  All computations are performed using the temporary variables
-  \p tmp0, \p tmp1 and \p tmp2.
-*/
-template <typename Temp, typename To, typename T>
-bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-				const BD_Shape<T>& x,
-				const BD_Shape<T>& y,
-				const Rounding_Dir dir,
-				Temp& tmp0,
-				Temp& tmp1,
-				Temp& tmp2);
+  //! Swaps \p *this with \p y.
+  void swap(Determinate& y);
+
+  //@} // Member Functions that May Modify the Domain Element
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Decodes the constraint \p c as a bounded difference.
-/*!
-  \return
-  <CODE>true</CODE> if the constraint \p c is a
-  \ref Bounded_Difference_Shapes "bounded difference";
-  <CODE>false</CODE> otherwise.
+  //! A function adapter for the Determinate class.
+  /*! \ingroup PPL_CXX_interface
+    It lifts a Binary_Operator_Assign function object, taking arguments
+    of type PS, producing the corresponding function object taking
+    arguments of type Determinate<PS>.
 
-  \param c
-  The constraint to be decoded.
+    The template parameter Binary_Operator_Assign is supposed to
+    implement an <EM>apply and assign</EM> function, i.e., a function
+    having signature <CODE>void foo(PS& x, const PS& y)</CODE> that
+    applies an operator to \c x and \c y and assigns the result to \c x.
+    For instance, such a function object is obtained by
+    <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  template <typename Binary_Operator_Assign>
+  class Binary_Operator_Assign_Lifter {
+  public:
+    //! Explicit unary constructor.
+    explicit
+    Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
 
-  \param c_space_dim
-  The space dimension of the constraint \p c (it is <EM>assumed</EM>
-  to match the actual space dimension of \p c).
+    //! Function-application operator.
+    void operator()(Determinate& x, const Determinate& y) const;
 
-  \param c_num_vars
-  If <CODE>true</CODE> is returned, then it will be set to the number
-  of variables having a non-zero coefficient. The only legal values
-  will therefore be 0, 1 and 2.
+  private:
+    //! The function object to be lifted.
+    Binary_Operator_Assign op_assign_;
+  };
 
-  \param c_first_var
-  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
-  then it will be set to the index of the first variable having
-  a non-zero coefficient in \p c.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Helper function returning a Binary_Operator_Assign_Lifter object,
+    also allowing for the deduction of template arguments.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  template <typename Binary_Operator_Assign>
+  static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+  lift_op_assign(Binary_Operator_Assign op_assign);
 
-  \param c_second_var
-  If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
-  then it will be set to the index of the second variable having
-  a non-zero coefficient in \p c.
+private:
+  //! The possibly shared representation of a Determinate object.
+  /*! \ingroup PPL_CXX_interface
+    By adopting the <EM>copy-on-write</EM> technique, a single
+    representation of the base-level object may be shared by more than
+    one object of the class Determinate.
+  */
+  class Rep {
+  private:
+    /*! \brief
+      Count the number of references:
+      -   0: leaked, \p ph is non-const;
+      -   1: one reference, \p ph is non-const;
+      - > 1: more than one reference, \p ph is const.
+    */
+    mutable unsigned long references;
 
-  \param c_coeff
-  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
-  then it will be set to the value of the first non-zero coefficient
-  in \p c.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-bool extract_bounded_difference(const Constraint& c,
-				const dimension_type c_space_dim,
-				dimension_type& c_num_vars,
-				dimension_type& c_first_var,
-				dimension_type& c_second_var,
-				Coefficient& c_coeff);
+    //! Private and unimplemented: assignment not allowed.
+    Rep& operator=(const Rep& y);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Extracts leader indices from the predecessor relation.
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-void compute_leader_indices(const std::vector<dimension_type>& predecessor,
-			    std::vector<dimension_type>& indices);
+    //! Private and unimplemented: copies not allowed.
+    Rep(const Rep& y);
 
-} // namespace Parma_Polyhedra_Library
+    //! Private and unimplemented: default construction not allowed.
+    Rep();
 
-//! A bounded difference shape.
-/*! \ingroup PPL_CXX_interface
-  The class template BD_Shape<T> allows for the efficient representation
-  of a restricted kind of <EM>topologically closed</EM> convex polyhedra
-  called <EM>bounded difference shapes</EM> (BDSs, for short).
-  The name comes from the fact that the closed affine half-spaces that
-  characterize the polyhedron can be expressed by constraints of the form
-  \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
-  term \f$k\f$ is a rational number.
+  public:
+    //! A possibly shared base-level domain element.
+    PS ph;
 
-  Based on the class template type parameter \p T, a family of extended
-  numbers is built and used to approximate the inhomogeneous term of
-  bounded differences. These extended numbers provide a representation
-  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
-  implementations for several arithmetic functions.
-  The value of the type parameter \p T may be one of the following:
-    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
-    - a bounded precision floating point type (e.g., \c float or \c double);
-    - an unbounded integer or rational type, as provided by GMP
-      (i.e., \c mpz_class or \c mpq_class).
+    /*! \brief
+      Builds a new representation by creating a domain element
+      of the specified kind, in the specified vector space.
+    */
+    Rep(dimension_type num_dimensions, Degenerate_Element kind);
 
-  The user interface for BDSs is meant to be as similar as possible to
-  the one developed for the polyhedron class C_Polyhedron.  At the
-  interface level, bounded differences are specified using objects of
-  type Constraint: such a constraint is a bounded difference if it is
-  of the form
-    \f[
-      a_i x_i - a_j x_j \relsym b
-    \f]
-  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
-  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
-  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
-  The user is warned that the above Constraint object will be mapped
-  into a <EM>correct</EM> approximation that, depending on the expressive
-  power of the chosen template argument \p T, may loose some precision.
-  In particular, constraint objects that do not encode a bounded difference
-  will be simply (and safely) ignored.
+    //! Builds a new representation by copying base-level element \p p.
+    Rep(const PS& p);
 
-  For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
-  approximated by:
-    - \f$x - y \leq 1\f$,
-      if \p T is a (bounded or unbounded) integer type;
-    - \f$x - y \leq \frac{1}{3}\f$,
-      if \p T is the unbounded rational type \c mpq_class;
-    - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
-      if \p T is a floating point type (having no exact representation
-      for \f$\frac{1}{3}\f$).
+    //! Builds a new representation by copying the constraints in \p cs.
+    Rep(const Constraint_System& cs);
 
-  On the other hand, a Constraint object encoding \f$3x - y \leq 1\f$
-  will be safely ignored in all of the above cases.
+    //! Builds a new representation by copying the constraints in \p cgs.
+    Rep(const Congruence_System& cgs);
 
-  In the following examples it is assumed that the type argument \p T
-  is one of the possible instances listed above and that variables
-  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
-  (where they are used) as follows:
-  \code
-    Variable x(0);
-    Variable y(1);
-    Variable z(2);
-  \endcode
+    //! Destructor.
+    ~Rep();
 
-  \par Example 1
-  The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
-  given as a system of constraints:
-  \code
-    Constraint_System cs;
-    cs.insert(x >= 0);
-    cs.insert(x <= 1);
-    cs.insert(y >= 0);
-    cs.insert(y <= 1);
-    cs.insert(z >= 0);
-    cs.insert(z <= 1);
-    BD_Shape<T> bd(cs);
-  \endcode
-  Since only those constraints having the syntactic form of a
-  <EM>bounded difference</EM> are considered, the following code
-  will build the same BDS as above (i.e., the constraints 7, 8, and 9
-  are ignored):
-  \code
-    Constraint_System cs;
-    cs.insert(x >= 0);
-    cs.insert(x <= 1);
-    cs.insert(y >= 0);
-    cs.insert(y <= 1);
-    cs.insert(z >= 0);
-    cs.insert(z <= 1);
-    cs.insert(x + y <= 0);      // 7
-    cs.insert(x - z + x >= 0);  // 8
-    cs.insert(3*z - y <= 1);    // 9
-    BD_Shape<T> bd(cs);
-  \endcode
-*/
-template <typename T>
-class Parma_Polyhedra_Library::BD_Shape {
-private:
-  /*! \brief
-    The (extended) numeric type of the inhomogeneous term of
-    the inequalities defining a BDS.
-  */
-  typedef Checked_Number<T, Extended_Number_Policy> N;
+    //! Registers a new reference.
+    void new_reference() const;
 
-public:
-  //! The numeric base type upon which bounded differences are built.
-  typedef T base_type;
+    /*! \brief
+      Unregisters one reference; returns <CODE>true</CODE> if and only if
+      the representation has become unreferenced.
+    */
+    bool del_reference() const;
+
+    //! True if and only if this representation is currently shared.
+    bool is_shared() const;
+
+    /*! \brief
+      Returns a lower bound to the total size in bytes of the memory
+      occupied by \p *this.
+    */
+    memory_size_type total_memory_in_bytes() const;
+
+    /*! \brief
+      Returns a lower bound to the size in bytes of the memory
+      managed by \p *this.
+    */
+    memory_size_type external_memory_in_bytes() const;
+  };
 
   /*! \brief
-    The (extended) numeric type of the inhomogeneous term of the
-    inequalities defining a BDS.
+    A pointer to the possibly shared representation of
+    the base-level domain element.
   */
-  typedef N coefficient_type;
+  Rep* prep;
 
-  //! Returns the maximum space dimension that a BDS can handle.
-  static dimension_type max_space_dimension();
+  friend bool
+  operator==<PS>(const Determinate<PS>& x, const Determinate<PS>& y);
+  friend bool
+  operator!=<PS>(const Determinate<PS>& x, const Determinate<PS>& y);
+};
 
-  //! \name Constructors, Assignment, Swap and Destructor
-  //@{
 
-  //! Builds a universe or empty BDS of the specified space dimension.
-  /*!
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the BDS;
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PS>
+void swap(Parma_Polyhedra_Library::Determinate<PS>& x,
+	  Parma_Polyhedra_Library::Determinate<PS>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Determinate.inlines.hh line 1
+/* Determinate class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PS>
+inline
+Determinate<PS>::Rep::Rep(dimension_type num_dimensions,
+			  Degenerate_Element kind)
+  : references(0), ph(num_dimensions, kind) {
+}
+
+template <typename PS>
+inline
+Determinate<PS>::Rep::Rep(const PS& p)
+  : references(0), ph(p) {
+}
+
+template <typename PS>
+inline
+Determinate<PS>::Rep::Rep(const Constraint_System& cs)
+  : references(0), ph(cs) {
+}
+
+template <typename PS>
+inline
+Determinate<PS>::Rep::Rep(const Congruence_System& cgs)
+  : references(0), ph(cgs) {
+}
+
+template <typename PS>
+inline
+Determinate<PS>::Rep::~Rep() {
+  assert(references == 0);
+}
+
+template <typename PS>
+inline void
+Determinate<PS>::Rep::new_reference() const {
+  ++references;
+}
+
+template <typename PS>
+inline bool
+Determinate<PS>::Rep::del_reference() const {
+  return --references == 0;
+}
+
+template <typename PS>
+inline bool
+Determinate<PS>::Rep::is_shared() const {
+  return references > 1;
+}
+
+template <typename PS>
+inline memory_size_type
+Determinate<PS>::Rep::external_memory_in_bytes() const {
+  return ph.external_memory_in_bytes();
+}
 
-    \param kind
-    Specifies whether the universe or the empty BDS has to be built.
-  */
-  explicit BD_Shape(dimension_type num_dimensions = 0,
-		    Degenerate_Element kind = UNIVERSE);
+template <typename PS>
+inline memory_size_type
+Determinate<PS>::Rep::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-  //! Ordinary copy-constructor.
-  BD_Shape(const BD_Shape& y);
+template <typename PS>
+inline
+Determinate<PS>::Determinate(const PS& ph)
+  : prep(new Rep(ph)) {
+  prep->new_reference();
+}
 
-  //! Builds a conservative, upward approximation of \p y.
-  template <typename U>
-  explicit BD_Shape(const BD_Shape<U>& y);
+template <typename PS>
+inline
+Determinate<PS>::Determinate(const Constraint_System& cs)
+  : prep(new Rep(cs)) {
+  prep->new_reference();
+}
 
-  //! Builds a BDS from the system of constraints \p cs.
-  /*!
-    The BDS inherits the space dimension of \p cs.
+template <typename PS>
+inline
+Determinate<PS>::Determinate(const Congruence_System& cgs)
+  : prep(new Rep(cgs)) {
+  prep->new_reference();
+}
 
-    \param cs
-    A system of constraints: constraints that are not
-    \ref Bounded_Difference_Shapes "bounded differences"
-    are ignored (even though they may have contributed
-    to the space dimension).
+template <typename PS>
+inline
+Determinate<PS>::Determinate(const Determinate& y)
+  : prep(y.prep) {
+  prep->new_reference();
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of constraints \p cs contains strict inequalities.
-  */
-  BD_Shape(const Constraint_System& cs);
+template <typename PS>
+inline
+Determinate<PS>::~Determinate() {
+  if (prep->del_reference())
+    delete prep;
+}
 
-  //! Builds a BDS from the system of generators \p gs.
-  /*!
-    Builds the smallest BDS containing the polyhedron defined by \p gs.
-    The BDS inherits the space dimension of \p gs.
+template <typename PS>
+inline Determinate<PS>&
+Determinate<PS>::operator=(const Determinate& y) {
+  y.prep->new_reference();
+  if (prep->del_reference())
+    delete prep;
+  prep = y.prep;
+  return *this;
+}
 
-    \exception std::invalid_argument
-    Thrown if the system of generators is not empty but has no points.
-  */
-  BD_Shape(const Generator_System& gs);
+template <typename PS>
+inline void
+Determinate<PS>::swap(Determinate& y) {
+  std::swap(prep, y.prep);
+}
 
-  //! Builds a BDS from the polyhedron \p ph.
-  /*!
-    Builds a BDS containing \p ph using algorithms whose complexity
-    does not exceed the one specified by \p complexity.  If
-    \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
-    smallest one containing \p ph.
-  */
-  BD_Shape(const Polyhedron& ph, Complexity_Class complexity = ANY_COMPLEXITY);
+template <typename PS>
+inline void
+Determinate<PS>::mutate() {
+  if (prep->is_shared()) {
+    Rep* new_prep = new Rep(prep->ph);
+    (void) prep->del_reference();
+    new_prep->new_reference();
+    prep = new_prep;
+  }
+}
 
-  /*! \brief
-    The assignment operator
-    (\p *this and \p y can be dimension-incompatible).
-  */
-  BD_Shape& operator=(const BD_Shape& y);
+template <typename PS>
+inline const PS&
+Determinate<PS>::element() const {
+  return prep->ph;
+}
 
-  /*! \brief
-    Swaps \p *this with \p y
-    (\p *this and \p y can be dimension-incompatible).
-  */
-  void swap(BD_Shape& y);
+template <typename PS>
+inline PS&
+Determinate<PS>::element() {
+  mutate();
+  return prep->ph;
+}
 
-  //! Destructor.
-  ~BD_Shape();
+template <typename PS>
+inline void
+Determinate<PS>::upper_bound_assign(const Determinate& y) {
+  element().upper_bound_assign(y.element());
+}
 
-  //@} Constructors, Assignment, Swap and Destructor
+template <typename PS>
+inline void
+Determinate<PS>::meet_assign(const Determinate& y) {
+  element().intersection_assign(y.element());
+}
 
-  //! \name Member Functions that Do Not Modify the BD_Shape
-  //@{
+template <typename PS>
+inline bool
+Determinate<PS>::has_nontrivial_weakening() {
+  // FIXME
+  return true;
+}
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+template <typename PS>
+inline void
+Determinate<PS>::weakening_assign(const Determinate& y) {
+  // FIXME
+  element().difference_assign(y.element());
+}
 
-  /*! \brief
-    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
-    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
-    of \p *this.
-  */
-  dimension_type affine_dimension() const;
+template <typename PS>
+inline void
+Determinate<PS>::concatenate_assign(const Determinate& y) {
+  element().concatenate_assign(y.element());
+}
 
-  //! Returns a system of constraints defining \p *this.
-  Constraint_System constraints() const;
+template <typename PS>
+inline bool
+Determinate<PS>::definitely_entails(const Determinate& y) const {
+  return prep == y.prep || y.prep->ph.contains(prep->ph);
+}
 
-  //! Returns a minimized system of constraints defining \p *this.
-  Constraint_System minimized_constraints() const;
+template <typename PS>
+inline bool
+Determinate<PS>::is_definitely_equivalent_to(const Determinate& y) const {
+  return prep == y.prep || prep->ph == y.prep->ph;
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool contains(const BD_Shape& y) const;
+template <typename PS>
+inline bool
+Determinate<PS>::is_top() const {
+  return prep->ph.is_universe();
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool strictly_contains(const BD_Shape& y) const;
+template <typename PS>
+inline bool
+Determinate<PS>::is_bottom() const {
+  return prep->ph.is_empty();
+}
 
-  //! Returns the relations holding between \p *this and the constraint \p c.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible
-    or if \p c is a strict inequality or if \p c is not a bounded
-    difference constraint.
-  */
-  Poly_Con_Relation relation_with(const Constraint& c) const;
+template <typename PS>
+inline memory_size_type
+Determinate<PS>::external_memory_in_bytes() const {
+  return prep->total_memory_in_bytes();
+}
 
-  //! Returns the relations holding between \p *this and the generator \p g.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and generator \p g are dimension-incompatible.
-  */
-  Poly_Gen_Relation relation_with(const Generator& g) const;
+template <typename PS>
+inline memory_size_type
+Determinate<PS>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
-  bool is_empty() const;
+template <typename PS>
+inline bool
+Determinate<PS>::OK() const {
+  return prep->ph.OK();
+}
 
-  //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
-  bool is_universe() const;
+namespace IO_Operators {
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this satisfies
-    all its invariants.
-  */
-  bool OK() const;
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PS>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PS>& x) {
+  s << x.element();
+  return s;
+}
 
-  //@} Member Functions that Do Not Modify the BD_Shape
+} // namespace IO_Operators
 
-  //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
-  //@{
+/*! \relates Determinate */
+template <typename PS>
+inline bool
+operator==(const Determinate<PS>& x, const Determinate<PS>& y) {
+  return x.prep == y.prep || x.prep->ph == y.prep->ph;
+}
 
-  /*! \brief
-    Adds a copy of constraint \p c to the system of bounded differences
-    defining \p *this.
+/*! \relates Determinate */
+template <typename PS>
+inline bool
+operator!=(const Determinate<PS>& x, const Determinate<PS>& y) {
+  return x.prep != y.prep && x.prep->ph != y.prep->ph;
+}
 
-    \param c
-    The constraint to be added. If it is not a bounded difference, it
-    will be simply ignored.
+template <typename PS>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PS>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+  : op_assign_(op_assign) {
+}
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible,
-    or if \p c is a strict inequality.
-  */
-  void add_constraint(const Constraint& c);
+template <typename PS>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PS>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+  op_assign_(x.element(), y.element());
+}
 
-  /*! \brief
-    Adds a copy of constraint \p c to the system of bounded differences
-    defining \p *this.
+template <typename PS>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PS>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PS>::lift_op_assign(Binary_Operator_Assign op_assign) {
+  return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+} // namespace Parma_Polyhedra_Library
 
-    \param c
-    The constraint to be added. If it is not a bounded difference, it
-    will be simply ignored.
 
-    \exception std::invalid_argument
-    Thrown if \p *this and constraint \p c are dimension-incompatible,
-    or if \p c is a strict inequality.
-  */
-  bool add_constraint_and_minimize(const Constraint& c);
+namespace std {
 
-  /*! \brief
-    Adds the constraints in \p cs to the system of bounded differences
-    defining \p *this.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PS>
+inline void
+swap(Parma_Polyhedra_Library::Determinate<PS>& x,
+     Parma_Polyhedra_Library::Determinate<PS>& y) {
+  x.swap(y);
+}
 
-    \param  cs
-    The constraints that will be added. Constraints that are not bounded
-    differences will be simply ignored.
+} // namespace std
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible,
-    or if \p cs contains a strict inequality.
-  */
-  void add_constraints(const Constraint_System& cs);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Determinate.defs.hh line 324
 
-  /*! \brief
-    Adds the constraints in \p cs to the system of bounded differences
-    defining \p *this.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Powerset.defs.hh line 1
+/* Powerset class declaration.
+*/
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
 
-    \param  cs
-    The constraints that will be added. Constraints that are not bounded
-    differences will be simply ignored.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Powerset.defs.hh line 28
+#include <iosfwd>
+#include <iterator>
+#include <list>
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p cs are dimension-incompatible,
-    or if \p cs contains a strict inequality.
-  */
-  bool add_constraints_and_minimize(const Constraint_System& cs);
+namespace Parma_Polyhedra_Library {
 
-  //! Assigns to \p *this the intersection of \p *this and \p y.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void intersection_assign(const BD_Shape& y);
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
 
-  //! Assigns to \p *this the intersection of \p *this and \p y.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool intersection_assign_and_minimize(const BD_Shape& y);
+namespace IO_Operators {
 
-  /*! \brief
-    Assigns to \p *this the smallest BDS containing the convex union
-    of \p *this and \p y.
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void bds_hull_assign(const BD_Shape& y);
+} // namespace IO_Operators
 
-  /*! \brief
-    Assigns to \p *this the smallest BDS containing the convex union
-    of \p *this and \p y.
+} // namespace Parma_Polyhedra_Library
 
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool bds_hull_assign_and_minimize(const BD_Shape& y);
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+  This class offers a generic implementation of a
+  <EM>powerset</EM> domain as defined in Section \ref powerset.
 
-  //! Same as bds_hull_assign.
-  void upper_bound_assign(const BD_Shape& y);
+  Besides invoking the available methods on the disjuncts of a Powerset,
+  this class also provides bidirectional iterators that allow for a
+  direct inspection of these disjuncts. For a consistent handling of
+  Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+  that the disjuncts cannot be overwritten. Rather, by using the class
+  <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+  (possibly so as to later add back modified versions).  As an example
+  of iterator usage, the following template function drops from
+  powerset \p ps all the disjuncts that would have become redundant by
+  the addition of an external element \p d.
 
-  /*! \brief
-    If the bds-hull of \p *this and \p y is exact, it is assigned
-    to \p *this and <CODE>true</CODE> is returned,
-    otherwise <CODE>false</CODE> is returned.
+  \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+  for (typename Powerset<D>::iterator i = ps.begin(),
+         ps_end = ps.end(), i != ps_end; )
+    if (i->definitely_entails(d))
+      i = ps.drop_disjunct(i);
+    else
+      ++i;
+}
+  \endcode
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  bool bds_hull_assign_if_exact(const BD_Shape& y);
+  The template class D must provide the following methods.
+  \code
+    memory_size_type total_memory_in_bytes() const
+  \endcode
+  Returns a lower bound on the total size in bytes of the memory
+  occupied by the instance of D.
+  \code
+    bool is_top() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the top
+  element of the domain.
+  \code
+    bool is_bottom() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the
+  bottom element of the domain.
+  \code
+    bool definitely_entails(const D& y) const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D definitely entails
+  <CODE>y</CODE>.  Returns <CODE>false</CODE> if the instance may not
+  entail <CODE>y</CODE> (i.e., if the instance does not entail
+  <CODE>y</CODE> or if entailment could not be decided).
+  \code
+    void upper_bound_assign(const D& y)
+  \endcode
+  Assigns to the instance of D an upper bound of the instance and
+  <CODE>y</CODE>.
+  \code
+    void meet_assign(const D& y)
+  \endcode
+  Assigns to the instance of D the meet of the instance and
+  <CODE>y</CODE>.
+  \code
+    bool OK() const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D is in a consistent
+  state, else returns <CODE>false</CODE>.
 
-  //! Same as bds_hull_assign_if_exact.
-  bool upper_bound_assign_if_exact(const BD_Shape& y);
+  The following operators on the template class D must be defined.
+  \code
+    operator<<(std::ostream& s, const D& x)
+  \endcode
+  Writes a textual representation of the instance of D on
+  <CODE>s</CODE>.
+  \code
+    operator==(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are equivalent D's.
+  \code
+    operator!=(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+  //! \name Constructors and Destructor
+  //@{
 
   /*! \brief
-    Assigns to \p *this
-    the \ref Convex_Polyhedral_Difference "poly-difference"
-    of \p *this and \p y.
-
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
+    Default constructor: builds the bottom of the powerset constraint
+    system (i.e., the empty powerset).
   */
-  void bds_difference_assign(const BD_Shape& y);
+  Powerset();
 
-  //! Same as bds_difference_assign.
-  void difference_assign(const BD_Shape& y);
+  //! Copy constructor.
+  Powerset(const Powerset& y);
 
   /*! \brief
-    Assigns to \p *this the
-    \ref Single_Update_Affine_Functions "affine image"
-    of \p *this under the function mapping variable \p var into the
-    affine expression specified by \p expr and \p denominator.
+    If \p d is not bottom, builds a powerset containing only \p d.
+    Builds the empty powerset otherwise.
+  */
+  explicit Powerset(const D& d);
 
-    \param var
-    The variable to which the affine expression is assigned.
+  //! Destructor.
+  ~Powerset();
 
-    \param expr
-    The numerator of the affine expression.
+  //@} // Constructors and Destructor
 
-    \param denominator
-    The denominator of the affine expression.
+  //! \name Member Functions that Do Not Modify the Powerset Object
+  //@{
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this
-    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+    Returns <CODE>false</CODE> if \p *this may not entail \p y
+    (i.e., if \p *this does not entail \p y or if entailment could
+    not be decided).
   */
-  void affine_image(Variable var,
-		    const Linear_Expression& expr,
-		    Coefficient_traits::const_reference denominator
-		    = Coefficient_one());
+  bool definitely_entails(const Powerset& y) const;
 
   /*! \brief
-    Assigns to \p *this the
-    \ref Single_Update_Affine_Functions "affine preimage"
-    of \p *this under the function mapping variable \p var into the
-    affine expression specified by \p expr and \p denominator.
-
-    \param var
-    The variable to which the affine expression is substituted.
-
-    \param expr
-    The numerator of the affine expression.
-
-    \param denominator
-    The denominator of the affine expression.
-
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this
-    are dimension-incompatible or if \p var is not a dimension of \p *this.
+    Returns <CODE>true</CODE> if and only if \p *this is the top
+    element of the powerset constraint system (i.e., it represents
+    the universe).
   */
-  void affine_preimage(Variable var,
-		       const Linear_Expression& expr,
-		       Coefficient_traits::const_reference denominator
-		       = Coefficient_one());
+  bool is_top() const;
 
   /*! \brief
-    Assigns to \p *this the image of \p *this with respect to the
-    \ref Generalized_Affine_Relations "affine relation"
-    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
-    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-    by \p relsym.
-
-    \param var
-    The left hand side variable of the generalized affine transfer function.
-
-    \param relsym
-    The relation symbol.
-
-    \param expr
-    The numerator of the right hand side affine expression.
-
-    \param denominator
-    The denominator of the right hand side affine expression.
-
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this
-    are dimension-incompatible or if \p var is not a dimension
-    of \p *this or if \p relsym is a strict relation symbol.
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    element of the powerset constraint system (i.e., it represents
+    the empty set).
   */
-  void generalized_affine_image(Variable var,
-				Relation_Symbol relsym,
-				const Linear_Expression& expr,
-				Coefficient_traits::const_reference denominator
-				= Coefficient_one());
+  bool is_bottom() const;
 
   /*! \brief
-    Assigns to \p *this the image of \p *this with respect to the
-    \ref Generalized_Affine_Relations "affine relation"
-    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
-    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
 
-    \param lhs
-    The left hand side affine expression.
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
 
-    \param relsym
-    The relation symbol.
+  //! Checks if all the invariants are satisfied.
+  // FIXME: document and perhaps use an enum instead of a bool.
+  bool OK(bool disallow_bottom = false) const;
 
-    \param rhs
-    The right hand side affine expression.
+  //@} // Member Functions that Do Not Modify the Powerset Object
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
-    or if \p relsym is a strict relation symbol.
+protected:
+  //! A powerset is implemented as a sequence of elements.
+  /*!
+    The particular sequence employed must support efficient deletion
+    in any position and efficient back insertion.
   */
-  void generalized_affine_image(const Linear_Expression& lhs,
-				Relation_Symbol relsym,
-				const Linear_Expression& rhs);
-
-  /*! \brief
-    Assigns to \p *this the preimage of \p *this with respect to the
-    \ref Generalized_Affine_Relations "affine relation"
-    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
-    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
-    by \p relsym.
+  typedef std::list<D> Sequence;
 
-    \param var
-    The left hand side variable of the generalized affine transfer function.
+  //! Alias for the low-level iterator on the disjuncts.
+  typedef typename Sequence::iterator Sequence_iterator;
 
-    \param relsym
-    The relation symbol.
+  //! Alias for the low-level %const_iterator on the disjuncts.
+  typedef typename Sequence::const_iterator Sequence_const_iterator;
 
-    \param expr
-    The numerator of the right hand side affine expression.
+  //! The sequence container holding powerset's elements.
+  Sequence sequence;
 
-    \param denominator
-    The denominator of the right hand side affine expression.
+  //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+  mutable bool reduced;
 
-    \exception std::invalid_argument
-    Thrown if \p denominator is zero or if \p expr and \p *this
-    are dimension-incompatible or if \p var is not a dimension
-    of \p *this or if \p relsym is a strict relation symbol.
-  */
-  void generalized_affine_preimage(Variable var,
-				   Relation_Symbol relsym,
-				   const Linear_Expression& expr,
-				   Coefficient_traits::const_reference
-				   denominator = Coefficient_one());
+public:
+  // Sequence manipulation types, accessors and modifiers
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::value_type value_type;
 
   /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+    Alias for a <EM>read-only</EM> bidirectional %iterator on the
+    disjuncts of a Powerset element.
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
+    By using this iterator type, the disjuncts cannot be overwritten,
+    but they can be removed using methods
+    <CODE>drop_disjunct(iterator position)</CODE> and
+    <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+    while still ensuring a correct handling of Omega-reduction.
   */
-  void time_elapse_assign(const BD_Shape& y);
+  typedef iterator_to_const<Sequence> iterator;
 
-  /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+  //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+  typedef const_iterator_to_const<Sequence> const_iterator;
 
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
+  //! The reverse iterator type built from Powerset::iterator.
+  typedef std::reverse_iterator<iterator> reverse_iterator;
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  //! The reverse iterator type built from Powerset::const_iterator.
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
-  */
-  void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+  //! \name Member Functions for the Direct Manipulation of Disjuncts
+  //@{
 
   /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
-
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
-
-    \param first
-    An iterator referencing the first stop-point.
+    Drops from the sequence of disjuncts in \p *this all the
+    non-maximal elements so that \p *this is non-redundant.
 
-    \param last
-    An iterator referencing one past the last stop-point.
+    This method is declared <CODE>const</CODE> because, even though
+    Omega-reduction may change the syntactic representation of \p *this,
+    its semantics will be unchanged.
+  */
+  void omega_reduce() const;
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  //! Returns the number of disjuncts.
+  size_type size() const;
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there are no disjuncts in
+    \p *this.
   */
-  template <typename Iterator>
-  void CC76_extrapolation_assign(const BD_Shape& y,
-				 Iterator first, Iterator last,
-				 unsigned* tp = 0);
+  bool empty() const;
 
   /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
-
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
+    Returns an iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end iterator.
+  */
+  iterator begin();
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  //! Returns the past-the-end iterator.
+  iterator end();
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
+  /*! \brief
+    Returns a const_iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end const_iterator.
   */
-  void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
 
   /*! \brief
-    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this.
+    Returns a reverse_iterator pointing to the last disjunct, if \p *this
+    is not empty; otherwise, returns the before-the-start reverse_iterator.
+  */
+  reverse_iterator rbegin();
 
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
+  //! Returns the before-the-start reverse_iterator.
+  reverse_iterator rend();
 
-    \param cs
-    The system of constraints used to improve the widened BDS.
+  /*! \brief
+    Returns a const_reverse_iterator pointing to the last disjunct,
+    if \p *this is not empty; otherwise, returns the before-the-start
+    const_reverse_iterator.
+  */
+  const_reverse_iterator rbegin() const;
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  //! Returns the before-the-start const_reverse_iterator.
+  const_reverse_iterator rend() const;
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
-    if \p cs contains a strict inequality.
-  */
-  void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
-					   const Constraint_System& cs,
-					   unsigned* tp = 0);
+  //! Adds to \p *this the disjunct \p d.
+  void add_disjunct(const D& d);
 
   /*! \brief
-    Assigns to \p *this the result of restoring in \p y the constraints
-    of \p *this that were lost by
-    \ref CC76_extrapolation "CC76-extrapolation" applications.
+    Drops the disjunct in \p *this pointed to by \p position, returning
+    an iterator to the disjunct following \p position.
+  */
+  iterator drop_disjunct(iterator position);
 
-    \param y
-    A BDS that <EM>must</EM> contain \p *this.
+  //! Drops all the disjuncts from \p first to \p last (excluded).
+  void drop_disjuncts(iterator first, iterator last);
 
-    \exception std::invalid_argument
-    Thrown if \p *this and \p y are dimension-incompatible.
+  //! Drops all the disjuncts, making \p *this an empty powerset.
+  void clear();
 
-    \note
-    As was the case for widening operators, the argument \p y is meant to
-    denote the value computed in the previous iteration step, whereas
-    \p *this denotes the value computed in the current iteration step
-    (in the <EM>descreasing</EM> iteration sequence). Hence, the call
-    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
-    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
-  */
-  void CC76_narrowing_assign(const BD_Shape& y);
+  //@} // Member Functions for the Direct Manipulation of Disjuncts
 
-  /*! \brief
-    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this.
+  //! \name Member Functions that May Modify the Powerset Object
+  //@{
 
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
+  //! The assignment operator.
+  Powerset& operator=(const Powerset& y);
 
-    \param cs
-    The system of constraints used to improve the widened BDS.
+  //! Swaps \p *this with \p y.
+  void swap(Powerset& y);
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+  //! Assigns to \p *this the least upper bound of \p *this and \p y.
+  void least_upper_bound_assign(const Powerset& y);
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
-    if \p cs contains a strict inequality.
+  //! Assigns to \p *this an upper bound of \p *this and \p y.
+  /*!
+    The result will be the least upper bound of \p *this and \p y.
   */
-  void limited_CC76_extrapolation_assign(const BD_Shape& y,
-					 const Constraint_System& cs,
-					 unsigned* tp = 0);
+  void upper_bound_assign(const Powerset& y);
 
   /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref H79_widening "H79-widening" between \p *this and \p y.
-
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
-
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+    Assigns to \p *this the least upper bound of \p *this and \p y
+    and returns \c true.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p y are dimension-incompatible.
   */
-  void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+  bool upper_bound_assign_if_exact(const Powerset& y);
 
-  /*! \brief
-    Improves the result of the \ref H79_widening "H79-widening"
-    computation by also enforcing those constraints in \p cs that are
-    satisfied by all the points of \p *this.
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Powerset& y);
 
-    \param y
-    A BDS that <EM>must</EM> be contained in \p *this.
+  /*! \brief
+    If \p *this is not empty (i.e., it is not the bottom element),
+    it is reduced to a singleton obtained by computing an upper-bound
+    of all the disjuncts.
+  */
+  void collapse();
 
-    \param cs
-    The system of constraints used to improve the widened BDS.
+  //@} // Member Functions that May Modify the Powerset element
 
-    \param tp
-    An optional pointer to an unsigned variable storing the number of
-    available tokens (to be used when applying the
-    \ref Widening_with_Tokens "widening with tokens" delay technique).
+protected:
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this does not contain
+    non-maximal elements.
+  */
+  bool is_omega_reduced() const;
 
-    \exception std::invalid_argument
-    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  /*! \brief Upon return, \p *this will contain at most \p
+    max_disjuncts elements; the set of disjuncts in positions greater
+    than or equal to \p max_disjuncts, will be replaced at that
+    position by their upper-bound.
   */
-  void limited_H79_extrapolation_assign(const BD_Shape& y,
-					const Constraint_System& cs,
-					unsigned* tp = 0);
+  void collapse(unsigned max_disjuncts);
 
-  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element and ensuring
+    partial Omega-reduction.
 
-  //! \name Member Functions that May Modify the Dimension of the Vector Space
-  //@{
+    If \p d is not the bottom element and is not Omega-redundant with
+    respect to elements in positions between \p first and \p last, all
+    elements in these positions that would be made Omega-redundant by the
+    addition of \p d are dropped and \p d is added to the reduced
+    sequence.
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
+  */
+  iterator add_non_bottom_disjunct_preserve_reduction(const D& d,
+						      iterator first,
+						      iterator last);
 
-  //! Adds \p m new dimensions and embeds the old BDS into the new space.
-  /*!
-    \param m
-    The number of dimensions to add.
+  /*! \brief
+    Adds to \p *this the disjunct \p d, assuming \p d is not the
+    bottom element and preserving Omega-reduction.
 
-    The new dimensions will be those having the highest indexes in the new
-    BDS, which is defined by a system of bounded differences in which the
-    variables running through the new dimensions are unconstrained.
-    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
-    and adding a third dimension, the result will be the BDS
-    \f[
-      \bigl\{\,
-        (x, y, z)^\transpose \in \Rset^3
-      \bigm|
-        (x, y)^\transpose \in \cB
-      \,\bigr\}.
-    \f]
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
   */
-  void add_space_dimensions_and_embed(dimension_type m);
+  void add_non_bottom_disjunct_preserve_reduction(const D& d);
 
   /*! \brief
-    Adds \p m new dimensions to the BDS and does not embed it in
-    the new vector space.
-
-    \param m
-    The number of dimensions to add.
+    Assigns to \p *this the result of applying \p op_assign pairwise
+    to the elements in \p *this and \p y.
 
-    The new dimensions will be those having the highest indexes in the
-    new BDS, which is defined by a system of bounded differences in
-    which the variables running through the new dimensions are all
-    constrained to be equal to 0.
-    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
-    and adding a third dimension, the result will be the BDS
-    \f[
-      \bigl\{\,
-        (x, y, 0)^\transpose \in \Rset^3
-      \bigm|
-        (x, y)^\transpose \in \cB
-      \,\bigr\}.
-    \f]
+    The elements of the powerset result are obtained by applying
+    \p op_assign to each pair of elements whose components are drawn
+    from \p *this and \p y, respectively.
   */
-  void add_space_dimensions_and_project(dimension_type m);
+  template <typename Binary_Operator_Assign>
+  void pairwise_apply_assign(const Powerset& y,
+			     Binary_Operator_Assign op_assign);
 
+private:
   /*! \brief
-    Seeing a BDS as a set of tuples (its points),
-    assigns to \p *this all the tuples that can be obtained by concatenating,
-    in the order given, a tuple of \p *this with a tuple of \p y.
+    Does the hard work of checking whether \p *this contains non-maximal
+    elements and returns <CODE>true</CODE> if and only if it does not.
+  */
+  bool check_omega_reduced() const;
 
-    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the BDSs
-    corresponding, on entry, to \p *this and \p y, respectively.
-    Upon successful completion, \p *this will represent the BDS
-    \f$R \sseq \Rset^{n+m}\f$ such that
-    \f[
-      R \defeq
-          \Bigl\{\,
-            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
-          \Bigm|
-            (x_1, \ldots, x_n)^\transpose \in B,
-            (y_1, \ldots, y_m)^\transpose \in D
-          \,\Bigl\}.
-    \f]
-    Another way of seeing it is as follows: first increases the space
-    dimension of \p *this by adding \p y.space_dimension() new
-    dimensions; then adds to the system of constraints of \p *this a
-    renamed-apart version of the constraints of \p y.
+  /*! \brief
+    Replaces the disjunct \p *sink by an upper bound of itself and
+    all the disjuncts following it.
   */
-  void concatenate_assign(const BD_Shape& y);
+  void collapse(Sequence_iterator sink);
+};
 
-  //! Removes all the specified dimensions.
-  /*!
-    \param to_be_removed
-    The set of Variable objects corresponding to the dimensions to be removed.
+namespace std {
 
-    \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with one of the Variable
-    objects contained in \p to_be_removed.
-  */
-  void remove_space_dimensions(const Variables_Set& to_be_removed);
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+void swap(Parma_Polyhedra_Library::Powerset<D>& x,
+	  Parma_Polyhedra_Library::Powerset<D>& y);
 
-  /*! \brief
-    Removes the higher dimensions so that the resulting space
-    will have dimension \p new_dimension.
+} // namespace std
 
-    \exception std::invalid_argument
-    Thrown if \p new_dimension is greater than the space dimension
-    of \p *this.
-  */
-  void remove_higher_space_dimensions(dimension_type new_dimension);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Powerset.inlines.hh line 1
+/* Powerset class implementation: inline functions.
+*/
 
-  /*! \brief
-    Remaps the dimensions of the vector space according to
-    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
 
-    \param pfunc
-    The partial function specifying the destiny of each dimension.
+#include <algorithm>
+#include <cassert>
 
-    The template class PartialFunction must provide the following
-    methods.
-    \code
-      bool has_empty_codomain() const
-    \endcode
-    returns <CODE>true</CODE> if and only if the represented partial
-    function has an empty co-domain (i.e., it is always undefined).
-    The <CODE>has_empty_codomain()</CODE> method will always be called
-    before the methods below.  However, if
-    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
-    of the functions below will be called.
-    \code
-      dimension_type max_in_codomain() const
-    \endcode
-    returns the maximum value that belongs to the co-domain
-    of the partial function.
-    \code
-      bool maps(dimension_type i, dimension_type& j) const
-    \endcode
-    Let \f$f\f$ be the represented function and \f$k\f$ be the value
-    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
-    assigned to \p j and <CODE>true</CODE> is returned.
-    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
-    returned.
+namespace Parma_Polyhedra_Library {
 
-    The result is undefined if \p pfunc does not encode a partial
-    function with the properties described in the
-    \ref Mapping_the_Dimensions_of_the_Vector_Space
-    "specification of the mapping operator".
-  */
-  template <typename PartialFunction>
-  void map_space_dimensions(const PartialFunction& pfunc);
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+  return sequence.begin();
+}
 
-  //@} // Member Functions that May Modify the Dimension of the Vector Space
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+  return sequence.end();
+}
 
-  PPL_OUTPUT_DECLARATIONS;
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+  return sequence.begin();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
-    <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+  return sequence.end();
+}
 
-  friend bool Parma_Polyhedra_Library::operator==<T>(const BD_Shape<T>& x,
-						     const BD_Shape<T>& y);
-  template <typename Temp, typename To, typename U>
-  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
-  (Checked_Number<To, Extended_Number_Policy>& r,
-   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
-   Temp& tmp0, Temp& tmp1, Temp& tmp2);
-  template <typename Temp, typename To, typename U>
-  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
-  (Checked_Number<To, Extended_Number_Policy>& r,
-   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
-   Temp& tmp0, Temp& tmp1, Temp& tmp2);
-  template <typename Temp, typename To, typename U>
-  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
-  (Checked_Number<To, Extended_Number_Policy>& r,
-   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
-   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+  return reverse_iterator(end());
+}
 
-private:
-  template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+  return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+  return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+  return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+  return sequence.size();
+}
 
-  //! The matrix representing the system of bounded differences.
-  DB_Matrix<N> dbm;
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+  return sequence.empty();
+}
 
-#define PPL_IN_BD_Shape_CLASS
-// Automatically generated from PPL source file ../src/BDS_Status.idefs.hh line 1
-/* BD_Shape<T>::Status class declaration.
-*/
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+  return sequence.erase(position.base);
+}
 
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+  sequence.erase(first.base, last.base);
+}
 
-#ifndef PPL_IN_BD_Shape_CLASS
-#error "Do not include BDS_Status.idefs.hh directly; use BD_Shape.defs.hh instead."
-#endif
+template <typename D>
+inline void
+Powerset<D>::clear() {
+  sequence.clear();
+}
 
-//! A conjunctive assertion about a BD_Shape<T> object.
-/*! \ingroup PPL_CXX_interface
-  The assertions supported are:
-  - <EM>zero-dim universe</EM>: the BDS is the zero-dimension
-    vector space \f$\Rset^0 = \{\cdot\}\f$;
-  - <EM>empty</EM>: the BDS is the empty set;
-  - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
-    closed system of bounded differences, so that all the constraints are
-    as tight as possible;
-  - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
-    closed system of bounded differences and each constraint in such a system
-    is marked as being either redundant or non-redundant.
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+  : sequence(y.sequence), reduced(y.reduced) {
+}
 
-  Not all the conjunctions of these elementary assertions constitute
-  a legal Status.  In fact:
-  - <EM>zero-dim universe</EM> excludes any other assertion;
-  - <EM>empty</EM>: excludes any other assertion;
-  - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
-*/
-class Status {
-public:
-  //! By default Status is the <EM>zero-dim universe</EM> assertion.
-  Status();
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+  sequence = y.sequence;
+  reduced = y.reduced;
+  return *this;
+}
 
-  //! \name Test, remove or add an individual assertion from the conjunction.
-  //@{
-  bool test_zero_dim_univ() const;
-  void reset_zero_dim_univ();
-  void set_zero_dim_univ();
+template <typename D>
+inline void
+Powerset<D>::swap(Powerset& y) {
+  std::swap(sequence, y.sequence);
+  std::swap(reduced, y.reduced);
+}
 
-  bool test_empty() const;
-  void reset_empty();
-  void set_empty();
+template <typename D>
+inline
+Powerset<D>::Powerset()
+  : sequence(), reduced(true) {
+}
 
-  bool test_shortest_path_closed() const;
-  void reset_shortest_path_closed();
-  void set_shortest_path_closed();
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+  : sequence(), reduced(false) {
+  sequence.push_back(d);
+  assert(OK());
+}
 
-  bool test_shortest_path_reduced() const;
-  void reset_shortest_path_reduced();
-  void set_shortest_path_reduced();
-  //@}
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
 
-  //! Checks if all the invariants are satisfied.
-  bool OK() const;
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d) {
+  // !d.is_bottom() is asserted by the callee.
+  add_non_bottom_disjunct_preserve_reduction(d, begin(), end());
+}
 
-  PPL_OUTPUT_DECLARATIONS;
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+  sequence.push_back(d);
+  reduced = false;
+}
 
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
-    and sets \p *this accordingly.
-    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
-  */
-  bool ascii_load(std::istream& s);
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+  return !(x == y);
+}
 
-private:
-  //! Status is implemented by means of a finite bitset.
-  typedef unsigned int flags_t;
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  const_iterator xi = begin();
+  const_iterator x_end = end();
+  return xi != x_end && xi->is_top() && ++xi == x_end;
+}
 
-  //! \name Bit-masks for the individual assertions.
-  //@{
-  static const flags_t ZERO_DIM_UNIV         = 0U;
-  static const flags_t EMPTY                 = 1U << 0;
-  static const flags_t SHORTEST_PATH_CLOSED  = 1U << 1;
-  static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
-  //@}
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  return empty();
+}
 
-  //! This holds the current bitset.
-  flags_t flags;
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+  if (!empty())
+    collapse(sequence.begin());
+}
 
-  //! Construct from a bit-mask.
-  Status(flags_t mask);
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+  pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
 
-  //! Check whether <EM>all</EM> bits in \p mask are set.
-  bool test_all(flags_t mask) const;
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+  least_upper_bound_assign(y);
+}
 
-  //! Check whether <EM>at least one</EM> bit in \p mask is set.
-  bool test_any(flags_t mask) const;
+template <typename D>
+inline bool
+Powerset<D>::upper_bound_assign_if_exact(const Powerset& y) {
+  least_upper_bound_assign(y);
+  return true;
+}
 
-  //! Set the bits in \p mask.
-  void set(flags_t mask);
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-  //! Reset the bits in \p mask.
-  void reset(flags_t mask);
-};
+} // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1158
-#undef PPL_IN_BD_Shape_CLASS
 
-  //! The status flags to keep track of the internal state.
-  Status status;
+namespace std {
 
-  //! A matrix of Booleans indicating which constraints are redundant.
-  std::vector<std::deque<bool> > redundancy_dbm;
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+inline void
+swap(Parma_Polyhedra_Library::Powerset<D>& x,
+     Parma_Polyhedra_Library::Powerset<D>& y) {
+  x.swap(y);
+}
 
-  //! Returns <CODE>true</CODE> if the BDS is known to be empty.
-  /*!
-    The return value <CODE>false</CODE> does not necessarily
-    implies that \p *this is non-empty.
-  */
-  bool marked_empty()const;
+} // namespace std
 
-  /*! \brief
-    Returns <CODE>true</CODE> if the system of bounded differences
-    is known to be shortest-path closed.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Powerset.templates.hh line 1
+/* Powerset class implementation: non-inline template functions.
+*/
 
-    The return value <CODE>false</CODE> does not necessarily
-    implies that <CODE>this->dbm</CODE> is not shortest-path closed.
-  */
-  bool marked_shortest_path_closed()const;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if the system of bounded differences
-    is known to be shortest-path reduced.
+#include <algorithm>
+#include <cassert>
+#include <iostream>
 
-    The return value <CODE>false</CODE> does not necessarily
-    implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
-  */
-  bool marked_shortest_path_reduced()const;
+namespace Parma_Polyhedra_Library {
 
-  //! Turns \p *this into an empty BDS.
-  void set_empty();
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+  assert(sink != sequence.end());
+  D& d = *sink;
+  iterator x_sink = sink;
+  iterator next_x_sink = x_sink;
+  ++next_x_sink;
+  iterator x_end = end();
+  for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+    d.upper_bound_assign(*xi);
+  // Drop the surplus disjuncts.
+  drop_disjuncts(next_x_sink, x_end);
 
-  //! Turns \p *this into an zero-dimensional universe BDS.
-  void set_zero_dim_univ();
+  // Ensure omega-reduction.
+  for (iterator xi = begin(); xi != x_sink; )
+    if (xi->definitely_entails(d))
+      xi = drop_disjunct(xi);
+    else
+      ++xi;
 
-  //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
-  void shortest_path_closure_assign() const;
+  assert(OK());
+}
 
-  /*! \brief
-    Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
-    records into <CODE>this->redundancy_dbm</CODE> which of the entries
-    in <CODE>this->dbm</CODE> are redundant.
-  */
-  void shortest_path_reduction_assign() const;
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+  if (reduced)
+    return;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
-    is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
-    correctly flags the redundant entries in <CODE>this->dbm</CODE>.
-  */
-  bool is_shortest_path_reduced() const;
+  Powerset& x = const_cast<Powerset&>(*this);
+  // First remove all bottom elements.
+  for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+    if (xi->is_bottom())
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+  // Then remove non-maximal elements.
+  for (iterator xi = x.begin(); xi != x.end(); ) {
+    const D& xv = *xi;
+    bool dropping_xi = false;
+    for (iterator yi = x.begin(); yi != x.end(); )
+      if (xi == yi)
+	++yi;
+      else {
+	const D& yv = *yi;
+	if (yv.definitely_entails(xv))
+	  yi = x.drop_disjunct(yi);
+	else if (xv.definitely_entails(yv)) {
+	  dropping_xi = true;
+	  break;
+	}
+	else
+	  ++yi;
+      }
+    if (dropping_xi)
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+    if (abandon_expensive_computations && xi != x.end()) {
+      // Hurry up!
+      x.collapse(xi.base);
+      break;
+    }
+  }
+  reduced = true;
+  assert(OK());
+}
 
-  //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
-  void add_dbm_constraint(dimension_type i, dimension_type j, N k);
-  //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
-  void add_dbm_constraint(dimension_type i, dimension_type j,
-			  Coefficient_traits::const_reference num,
-			  Coefficient_traits::const_reference den);
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+  assert(max_disjuncts > 0);
+  // Omega-reduce before counting the number of disjuncts.
+  omega_reduce();
+  size_type n = size();
+  if (n > max_disjuncts) {
+    // Let `i' point to the last disjunct that will survive.
+    iterator i = begin();
+    std::advance(i, max_disjuncts-1);
+    // This disjunct will be assigned an upper-bound of itself and of
+    // all the disjuncts that follow.
+    collapse(i.base);
+  }
+  assert(OK());
+  assert(is_omega_reduced());
+}
 
-  //! Removes all the constraints on row/column \p v.
-  void forget_all_dbm_constraints(dimension_type v);
-  //! Removes all binary constraints on row/column \p v.
-  void forget_binary_dbm_constraints(dimension_type v);
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+  for (const_iterator x_begin = begin(), x_end = end(),
+	 xi = x_begin; xi != x_end; ++xi) {
+    const D& xv = *xi;
+    if (xv.is_bottom())
+      return false;
+    for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+      if (xi == yi)
+	continue;
+      const D& yv = *yi;
+      if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+	return false;
+    }
+  }
+  return true;
+}
 
-  //! An helper function for the computation of affine relations.
-  /*!
-    For each dbm index \p u (less than or equal to \p last_v and different
-    from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
-    starting from \p pos_sum which is an upper bound for \p v.
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+  if (!reduced && check_omega_reduced())
+    reduced = true;
+  return reduced;
+}
 
-    The shortest-path closure is able to deduce the constraint
-    <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
-    \p u played an active role in the computation of the upper bound for
-    \p v, i.e., if the corresponding coefficient
-    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero. In particular:
-      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
-      - if <CODE>0 \< q \< 1</CODE>, then
-        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
-  */
-  void deduce_v_minus_u_bounds(dimension_type v,
-			       dimension_type last_v,
-			       const Linear_Expression& sc_expr,
-			       Coefficient_traits::const_reference sc_den,
-			       const N& pos_sum);
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d,
+							iterator first,
+							iterator last) {
+  assert(!d.is_bottom());
+  for (iterator xi = first; xi != last; ) {
+    const D& xv = *xi;
+    if (d.definitely_entails(xv))
+      return first;
+    else if (xv.definitely_entails(d)) {
+      if (xi == first)
+	++first;
+      xi = drop_disjunct(xi);
+    }
+    else
+      ++xi;
+  }
+  sequence.push_back(d);
+  assert(OK());
+  return first;
+}
 
-  //! An helper function for the computation of affine relations.
-  /*!
-    For each dbm index \p u (less than or equal to \p last_v and different
-    from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
-    starting from \p neg_sum which is a lower bound for \p v.
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+  const Powerset<D>& x = *this;
+  bool found = true;
+  for (const_iterator xi = x.begin(),
+	 x_end = x.end(); found && xi != x_end; ++xi) {
+    found = false;
+    for (const_iterator yi = y.begin(),
+	   y_end = y.end(); !found && yi != y_end; ++yi)
+      found = (*xi).definitely_entails(*yi);
+  }
+  return found;
+}
 
-    The shortest-path closure is able to deduce the constraint
-    <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
-    \p u played an active role in the computation of the lower bound for
-    \p v, i.e., if the corresponding coefficient
-    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero.
-    In particular:
-      - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
-      - if <CODE>0 \< q \< 1</CODE>, then
-        <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
-  */
-  void deduce_u_minus_v_bounds(dimension_type v,
-			       dimension_type last_v,
-			       const Linear_Expression& sc_expr,
-			       Coefficient_traits::const_reference sc_den,
-			       const N& neg_sum);
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+  x.omega_reduce();
+  y.omega_reduce();
+  if (x.size() != y.size())
+    return false;
+  // Take a copy of `y' and work with it.
+  Powerset<D> yy = y;
+  for (typename Powerset<D>::const_iterator xi = x.begin(),
+	 x_end = x.end(); xi != x_end; ++xi) {
+    typename Powerset<D>::iterator yyi = yy.begin();
+    typename Powerset<D>::iterator yy_end = yy.end();
+    yyi = std::find(yyi, yy_end, *xi);
+    if (yyi == yy_end)
+      return false;
+    else
+      yy.drop_disjunct(yyi);
+  }
+  return true;
+}
 
-  /*! \brief
-    Adds to \p limiting_shape the bounded differences in \p cs
-    that are satisfied by \p *this.
-  */
-  void get_limiting_shape(const Constraint_System& cs,
-			  BD_Shape& limiting_shape) const;
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+				   Binary_Operator_Assign op_assign) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence;
+  for (const_iterator xi = begin(), x_end = end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      D zi = *xi;
+      op_assign(zi, *yi);
+      if (!zi.is_bottom())
+	new_sequence.push_back(zi);
+    }
+  // Put the new sequence in place.
+  std::swap(sequence, new_sequence);
+  reduced = false;
+  assert(OK());
+}
 
-  //! Compute the (zero-equivalence classes) predecessor relation.
-  /*!
-    It is assumed that the BDS is not empty and shortest-path closed.
-  */
-  void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  iterator old_begin = begin();
+  iterator old_end = end();
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    old_begin = add_non_bottom_disjunct_preserve_reduction(*i,
+							   old_begin,
+							   old_end);
+  assert(OK());
+}
 
-  //! Compute the leaders of zero-equivalence classes.
-  /*!
-    It is assumed that the BDS is not empty and shortest-path closed.
-  */
-  void compute_leaders(std::vector<dimension_type>& leaders) const;
+namespace IO_Operators {
 
-#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
-  friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<<>(std::ostream& s,
-						      const BD_Shape<T>& c);
-#else
-  // This is too lax than wanted.
-  template <typename U>
-  friend std::ostream&
-  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
-						    const BD_Shape<U>& c);
-#endif
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+  if (x.is_bottom())
+    s << "false";
+  else if (x.is_top())
+    s << "true";
+  else
+    for (typename Powerset<D>::const_iterator i = x.begin(),
+	   x_end = x.end(); i != x_end; ) {
+      s << "{ " << *i++ << " }";
+      if (i != x_end)
+	s << ", ";
+    }
+  return s;
+}
 
-  //! \name Exception Throwers
-  //@{
-  void throw_dimension_incompatible(const char* method,
-				    const BD_Shape& x) const;
+} // namespace IO_Operators
 
-  void throw_dimension_incompatible(const char* method,
-				    dimension_type required_dim) const;
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+  memory_size_type bytes = 0;
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    bytes += xi->total_memory_in_bytes();
+    // We assume there is at least a forward and a backward link, and
+    // that the pointers implementing them are at least the size of
+    // pointers to `D'.
+    bytes += 2*sizeof(D*);
+  }
+  return bytes;
+}
 
-  void throw_dimension_incompatible(const char* method,
-				    const Constraint& c) const;
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    if (!xi->OK())
+      return false;
+    if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+      std::cerr << "Bottom element in powerset!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+    std::cerr << "Powerset claims to be reduced, but it is not!"
+	      << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
 
-  void throw_dimension_incompatible(const char* method,
-				    const Generator& g) const;
+} // namespace Parma_Polyhedra_Library
 
-  void throw_dimension_incompatible(const char* method,
-				    const char* name_row,
-				    const Linear_Expression& y) const;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Powerset.defs.hh line 452
 
-  static void throw_constraint_incompatible(const char* method);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.types.hh line 1
 
-  static void throw_expression_too_complex(const char* method,
-					   const Linear_Expression& e);
 
-  static void throw_generic(const char* method, const char* reason);
-  //@} // Exception Throwers
-};
+namespace Parma_Polyhedra_Library {
 
+template <typename PH>
+class Pointset_Powerset;
 
-namespace std {
+} // namespace Parma_Polyhedra_Library
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-template <typename T>
-void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
-	  Parma_Polyhedra_Library::BD_Shape<T>& y);
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.defs.hh line 1
+/* Pointset_Powerset class declaration.
+*/
 
-} // namespace std
 
-// Automatically generated from PPL source file ../src/BDS_Status.inlines.hh line 1
-/* BD_Shape<T>::Status class implementation: inline functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.defs.hh line 1
+/* Partially_Reduced_Product class declaration.
 */
 
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.defs.hh line 40
+
 namespace Parma_Polyhedra_Library {
 
-template <typename T>
-inline
-BD_Shape<T>::Status::Status(flags_t mask)
-  : flags(mask) {
-}
+namespace IO_Operators {
 
-template <typename T>
-inline
-BD_Shape<T>::Status::Status()
-  : flags(ZERO_DIM_UNIV) {
-}
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Partially_Reduced_Product
+  Writes a textual representation of \p dp on \p s.
+*/
+template <typename D1, typename D2, typename R>
+std::ostream&
+operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
 
-template <typename T>
-inline bool
-BD_Shape<T>::Status::test_all(flags_t mask) const {
-  return (flags & mask) == mask;
-}
+} // namespace IO_Operators
 
-template <typename T>
-inline bool
-BD_Shape<T>::Status::test_any(flags_t mask) const {
-  return flags & mask;
-}
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are pairwise equal.
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::set(flags_t mask) {
-  flags |= mask;
-}
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+		const Partially_Reduced_Product<D1, D2, R>& y);
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::reset(flags_t mask) {
-  flags &= ~mask;
-}
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are not pairwise equal.
 
-template <typename T>
-inline bool
-BD_Shape<T>::Status::test_zero_dim_univ() const {
-  return flags == ZERO_DIM_UNIV;
-}
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+		const Partially_Reduced_Product<D1, D2, R>& y);
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::reset_zero_dim_univ() {
-  // This is a no-op if the current status is not zero-dim.
-  if (flags == ZERO_DIM_UNIV)
-    // In the zero-dim space, if it is not the universe it is empty.
-    flags = EMPTY;
-}
+} // namespace Parma_Polyhedra_Library
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::set_zero_dim_univ() {
-  // Zero-dim universe is incompatible with anything else.
-  flags = ZERO_DIM_UNIV;
-}
 
-template <typename T>
-inline bool
-BD_Shape<T>::Status::test_empty() const {
-  return test_any(EMPTY);
-}
+/*! \brief
+  This class provides the reduction method for the Smash_Product
+  domain.
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::reset_empty() {
-  reset(EMPTY);
-}
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class propagates emptiness between its components.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Smash_Reduction {
+public:
+  //! Default constructor.
+  Smash_Reduction();
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::set_empty() {
-  flags = EMPTY;
-}
+  /*! brief
+    The smash reduction operator for propagating emptiness between the
+    domain elements \p d1 and \p d2.
 
-template <typename T>
-inline bool
-BD_Shape<T>::Status::test_shortest_path_closed() const {
-  return test_any(SHORTEST_PATH_CLOSED);
-}
+    If either of the the domain elements \p d1 or \p d2 is empty
+    then the other is also set empty.
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::reset_shortest_path_closed() {
-  // A system is reduced only if it is also closed.
-  reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
-}
+    \param d1
+    A pointset domain element;
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::set_shortest_path_closed() {
-  set(SHORTEST_PATH_CLOSED);
-}
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
 
-template <typename T>
-inline bool
-BD_Shape<T>::Status::test_shortest_path_reduced() const {
-  return test_any(SHORTEST_PATH_REDUCED);
-}
+  //! Destructor.
+  ~Smash_Reduction();
+};
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::reset_shortest_path_reduced() {
-  reset(SHORTEST_PATH_REDUCED);
-}
+/*! \brief
+  This class provides the reduction method for the Constraints_Product
+  domain.
 
-template <typename T>
-inline void
-BD_Shape<T>::Status::set_shortest_path_reduced() {
-  assert(test_shortest_path_closed());
-  set(SHORTEST_PATH_REDUCED);
-}
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class adds the constraints defining each of the component
+  domains to the other component.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Constraints_Reduction {
+public:
+  //! Default constructor.
+  Constraints_Reduction();
 
-template <typename T>
-bool
-BD_Shape<T>::Status::OK() const {
-  if (test_zero_dim_univ())
-    // Zero-dim universe is OK.
-    return true;
+  /*! brief
+    The constraints reduction operator for sharing constraints between the
+    domains.
 
-  if (test_empty()) {
-    Status copy = *this;
-    copy.reset_empty();
-    if (copy.test_zero_dim_univ())
-      return true;
-    else {
-#ifndef NDEBUG
-      std::cerr << "The empty flag is incompatible with any other one."
-		<< std::endl;
-#endif
-      return false;
-    }
-  }
+    The minimized constraint system defining the domain element \p d1
+    is added to \p d2 and the minimized constraint system  defining \p d2
+    is added to \p d1.
+    In each case, the donor domain must provide a constraint system
+    in minimal form; this must define a polyhedron in which the
+    donor element is contained.
+    The recipient domain selects a subset of these constraints
+    that it can add to the recipient element.
+    For example: if the domain \p D1 is the Grid domain and \p D2
+    the NNC Polyhedron domain, then only the equality constraints are copied
+    from \p d1 to \p d2 and from \p d2 to \p d1.
 
-  // Shortest-path reduction implies shortest-path closure.
-  if (test_shortest_path_reduced())
-    if (test_shortest_path_closed())
-      return true;
-    else {
-#ifndef NDEBUG
-      std::cerr << "The shortest-path reduction flag should also imply "
-		<< "the closure flag."
-		<< std::endl;
-#endif
-      return false;
-    }
+    \param d1
+    A pointset domain element;
 
-  // Any other case is OK.
-  return true;
-}
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
 
+  //! Destructor.
+  ~Constraints_Reduction();
+};
 
-namespace Implementation {
+/*! brief
+  This class provides the reduction method for the Direct_Product domain.
 
-namespace BD_Shapes {
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain template parameter \p R. This class does no reduction at all.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::No_Reduction {
+public:
+  //! Default constructor.
+  No_Reduction();
 
-// These are the keywords that indicate the individual assertions.
-const std::string zero_dim_univ = "ZE";
-const std::string empty = "EM";
-const std::string sp_closed = "SPC";
-const std::string sp_reduced = "SPR";
-const char yes = '+';
-const char no = '-';
-const char sep = ' ';
+  /*! \brief
+    The null reduction operator.
 
-/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
-  Reads a keyword and its associated on/off flag from \p s.
-  Returns <CODE>true</CODE> if the operation is successful,
-  returns <CODE>false</CODE> otherwise.
-  When successful, \p positive is set to <CODE>true</CODE> if the flag
-  is on; it is set to <CODE>false</CODE> otherwise.
-*/
-inline bool
-get_field(std::istream& s, const std::string& keyword, bool& positive) {
-  std::string str;
-  if (!(s >> str)
-      || (str[0] != yes && str[0] != no)
-      || str.substr(1) != keyword)
-    return false;
-  positive = (str[0] == yes);
-  return true;
-}
+    The parameters \p d1 and \p d2 are ignored.
+  */
+  void product_reduce(D1& d1, D2& d2);
 
-} // namespace BD_Shapes
+  //! Destructor.
+  ~No_Reduction();
+};
 
-} // namespace Implementation
+//! The partially reduced product of two abstractions.
+/*! \ingroup PPL_CXX_interface
 
-template <typename T>
-void
-BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
-  using namespace Implementation::BD_Shapes;
-  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << sep
-    << (test_empty() ? yes : no) << empty << sep
-    << sep
-    << (test_shortest_path_closed() ? yes : no) << sp_closed << sep
-    << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
-}
+  \warning
+  At present, the supported instantiations for the
+  two domain templates \p D1 and \p D2 are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape<T></CODE>,
+  <CODE>BD_Shape<T></CODE>,
+  <CODE>Box<T></CODE>.
+
+  An object of the class <CODE>Partially_Reduced_Product<D1, D2, R></CODE>
+  represents the (partially reduced) product of two pointset domains \p D1
+  and \p D2 where the form of any reduction is defined by the
+  reduction class \p R.
+
+  Suppose \f$D_1\f$ and \f$D_2\f$ are two abstract domains
+  with concretization functions:
+  \f$\fund{\gamma_1}{D_1}{\Rset^n}\f$ and
+  \f$\fund{\gamma_2}{D_2}{\Rset^n}\f$, respectively.
+
+  The partially reduced product \f$D = D_1 \times D_2\f$,
+  for any reduction class \p R, has a concretization
+  \f$\fund{\gamma}{D}{\Rset^n}\f$
+  where, if \f$d = (d_1, d_2) \in D\f$
+  \f[
+    \gamma(d) = \gamma_1(d_1) \inters \gamma_2(d_2).
+  \f]
 
-PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status);
+  The operations are defined to be the result of applying the corresponding
+  operations on each of the components provided the product is already reduced
+  by the reduction method defined by \p R.
+  In particular, if \p R is the <CODE>No_Reduction<D1, D2></CODE> class,
+  then the class <CODE>Partially_Reduced_Product<D1, D2, R></CODE> domain
+  is the direct product as defined in \ref CC79 "[CC79]".
+
+  How the results on the components are interpreted and
+  combined depend on the specific test.
+  For example, the test for emptiness will first make sure
+  the product is reduced (using the reduction method provided by \p R
+  if it is not already known to be reduced) and then test if either component
+  is empty; thus, if \p R defines no reduction between its components and
+  \f$d = (G, P) \in (\Gset \times \Pset)\f$
+  is a direct product in one dimension where \f$G\f$ denotes the set of
+  numbers that are integral multiples of 3 while \f$P\f$ denotes the
+  set of numbers between 1 and 2, then an operation that tests for
+  emptiness should return false.
+  However, the test for the universe returns true if and only if the
+  test <CODE>is_universe()</CODE> on both components returns true.
 
-template <typename T>
-bool
-BD_Shape<T>::Status::ascii_load(std::istream& s) {
-  using namespace Implementation::BD_Shapes;
-  bool positive;
+  \par
+  In all the examples it is assumed that the template \c R is the
+  <CODE>No_Reduction<D1, D2></CODE> class and that variables
+  \c x and \c y are defined (where they are used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
 
-  if (!get_field(s, zero_dim_univ, positive))
-    return false;
-  if (positive)
-    set_zero_dim_univ();
+  \par Example 1
+  The following code builds a direct product of a Grid and NNC Polyhedron,
+  corresponding to the positive even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> >
+    dp(cgs);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  \endcode
 
-  if (!get_field(s, empty, positive))
-    return false;
-  if (positive)
-    set_empty();
+  \par Example 2
+  The following code builds the same product
+  in \f$\Rset^2\f$:
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(2);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((y %= 0) / 2);
+  \endcode
 
-  if (!get_field(s, sp_closed, positive))
-    return false;
-  if (positive)
-    set_shortest_path_closed();
+  \par Example 3
+  The following code will write "dp is empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((x %= 1) / 2);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
   else
-    reset_shortest_path_closed();
+    cout << "dp is not empty." << endl;
+  \endcode
 
-  if (!get_field(s, sp_reduced, positive))
-    return false;
-  if (positive)
-    set_shortest_path_reduced();
+  \par Example 4
+  The following code will write "dp is not empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_constraint(x >= 1);
+  dp.add_constraint(x <= 1);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
   else
-    reset_shortest_path_reduced();
+    cout << "dp is not empty." << endl;
+  \endcode
+*/
 
-  // Check for well-formedness.
-  assert(OK());
-  return true;
-}
+template <typename D1, typename D2, typename R>
+class Parma_Polyhedra_Library::Partially_Reduced_Product {
+public:
+  /*! brief
+    Returns the maximum space dimension this product
+    can handle.
+  */
+  static dimension_type max_space_dimension();
 
-} // namespace Parma_Polyhedra_Library
+  //! Builds an object having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the pair;
 
-// Automatically generated from PPL source file ../src/BD_Shape.inlines.hh line 1
-/* BD_Shape class implementation: inline functions.
-*/
+    \param kind
+    Specifies whether a universe or an empty pair has to be built.
 
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(dimension_type num_dimensions = 0,
+				     Degenerate_Element kind = UNIVERSE);
 
-// Automatically generated from PPL source file ../src/BD_Shape.inlines.hh line 29
-#include <cassert>
-#include <vector>
-#include <iostream>
-#include <algorithm>
+  //! Builds a pair, copying a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
 
-namespace Parma_Polyhedra_Library {
+    \param cgs
+    The system of congruences to be approximated by the pair.
 
-namespace Implementation {
-namespace BD_Shapes {
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Congruence_System& cgs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Extract the numerator and denominator components of \p from.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T, typename Policy>
-inline void
-numer_denom(const Checked_Number<T, Policy>& from,
-	    Coefficient& num, Coefficient& den) {
-  assert(!is_not_a_number(from)
-	 && !is_minus_infinity(from)
-	 && !is_plus_infinity(from));
-  mpq_class q;
-  assign_r(q, from, ROUND_NOT_NEEDED);
-  num = q.get_num();
-  den = q.get_den();
-}
+  //! Builds a pair, recycling a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename T, typename Policy>
-inline void
-div_round_up(Checked_Number<T, Policy>& to,
-	     Coefficient_traits::const_reference x,
-	     Coefficient_traits::const_reference y) {
-  mpq_class qx;
-  mpq_class qy;
-  // Note: this code assumes that a Coefficient is always convertible
-  // to an mpq_class without loss of precision.
-  assign_r(qx, x, ROUND_NOT_NEEDED);
-  assign_r(qy, y, ROUND_NOT_NEEDED);
-  div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
-  assign_r(to, qx, ROUND_UP);
-}
+    \param cgs
+    The system of congruences to be approximates by the pair.
+    Its data-structures may be recycled to build the pair.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Assigns to \p x the minimum between \p x and \p y.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename N>
-inline void
-min_assign(N& x, const N& y) {
-  if (x > y)
-    x = y;
-}
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(Congruence_System& cgs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Assigns to \p x the maximum between \p x and \p y.
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename N>
-inline void
-max_assign(N& x, const N& y) {
-  if (x < y)
-    x = y;
-}
+  //! Builds a pair, copying a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
 
-} // namespace BD_Shapes
-} // namespace Implementation
+    \param cs
+    The system of constraints to be approximated by the pair.
 
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Constraint_System& cs);
 
-template <typename T>
-inline dimension_type
-BD_Shape<T>::max_space_dimension() {
-  // One dimension is reserved to have a value of type dimension_type
-  // that does not represent a legal dimension.
-  return std::min(DB_Matrix<N>::max_num_rows() - 1,
-		  DB_Matrix<N>::max_num_columns() - 1);
-}
+  //! Builds a pair, recycling a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
 
-template <typename T>
-inline bool
-BD_Shape<T>::marked_empty() const {
-  return status.test_empty();
-}
+    \param cs
+    The system of constraints to be approximated by the pair.
 
-template <typename T>
-inline void
-BD_Shape<T>::set_empty() {
-  status.set_empty();
-  assert(OK());
-  assert(marked_empty());
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p cs exceeds the maximum allowed
+    space dimension.
+  */
+  explicit Partially_Reduced_Product(Constraint_System& cs);
 
-template <typename T>
-inline void
-BD_Shape<T>::set_zero_dim_univ() {
-  status.set_zero_dim_univ();
-}
+  //! Builds a product, from a C polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
 
-template <typename T>
-inline bool
-BD_Shape<T>::marked_shortest_path_closed() const {
-  return status.test_shortest_path_closed();
-}
+    \param ph
+    The polyhedron to be approximated by the product.
 
-template <typename T>
-inline bool
-BD_Shape<T>::marked_shortest_path_reduced() const {
-  return status.test_shortest_path_reduced();
-}
+    \param complexity
+    The complexity that will not be exceeded.
 
-template <typename T>
-inline
-BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
-		      const Degenerate_Element kind)
-  : dbm(num_dimensions + 1), status(), redundancy_dbm() {
-  if (kind == EMPTY)
-    set_empty();
-  else {
-    if (num_dimensions > 0)
-      // A (non zero-dim) universe BDS is closed.
-      status.set_shortest_path_closed();
-  }
-  assert(OK());
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline
-BD_Shape<T>::BD_Shape(const BD_Shape& y)
-  : dbm(y.dbm), status(y.status), redundancy_dbm() {
-  if (y.marked_shortest_path_reduced())
-    redundancy_dbm = y.redundancy_dbm;
-}
+  //! Builds a product, from an NNC polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
 
-template <typename T>
-template <typename U>
-inline
-BD_Shape<T>::BD_Shape(const BD_Shape<U>& y)
-  : dbm(y.dbm), status(), redundancy_dbm() {
-  // TODO: handle flags properly, possibly taking special cases into account.
-  if (y.marked_empty())
-    set_empty();
-  else if (y.status.test_zero_dim_univ())
-    set_zero_dim_univ();
-}
+    \param ph
+    The polyhedron to be approximated by the product.
 
-template <typename T>
-inline bool
-BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
-  add_constraint(c);
-  shortest_path_closure_assign();
-  return !marked_empty();
-}
+    \param complexity
+    The complexity that will not be exceeded.
 
-template <typename T>
-inline void
-BD_Shape<T>::add_constraints(const Constraint_System& cs) {
-  for (Constraint_System::const_iterator i = cs.begin(),
-	 iend = cs.end(); i != iend; ++i)
-    add_constraint(*i);
-  assert(OK());
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline bool
-BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
-  add_constraints(cs);
-  shortest_path_closure_assign();
-  return !marked_empty();
-}
+  //! Builds a product, from a grid.
+  /*!
+    Builds a product containing \p gr.
+    The product inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be approximated by the product.
 
-template <typename T>
-inline
-BD_Shape<T>::BD_Shape(const Constraint_System& cs)
-  : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
-  if (cs.space_dimension() > 0)
-    // A (non zero-dim) universe BDS is shortest-path closed.
-    status.set_shortest_path_closed();
-  add_constraints(cs);
-  assert(OK());
-}
+    \param complexity
+    The complexity is ignored.
 
-template <typename T>
-inline dimension_type
-BD_Shape<T>::affine_dimension() const {
-  const dimension_type space_dim = space_dimension();
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const Grid& gr,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-  // Shortest-path closure is necessary to detect emptiness
-  // and all (possibly implicit) equalities.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return 0;
+  //! Builds a product out of a box.
+  /*!
+    Builds a product containing \p box.
+    The product inherits the space dimension of the box.
 
-  // The vector `predecessor' is used to represent equivalence classes:
-  // `predecessor[i] == i' if and only if `i' is the leader of its
-  // equivalence class (i.e., the minimum index in the class);
-  std::vector<dimension_type> predecessor;
-  compute_predecessors(predecessor);
+    \param box
+    The box representing the pair to be built.
 
-  // Due to the fictitious variable `0', the affine dimension is one
-  // less the number of equivalence classes.
-  dimension_type affine_dim = 0;
-  // Note: disregard the first equivalence class.
-  for (dimension_type i = 1; i <= space_dim; ++i)
-    if (predecessor[i] == i)
-      ++affine_dim;
+    \param complexity
+    The complexity is ignored.
 
-  return affine_dim;
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  Partially_Reduced_Product(const Box<Interval>& box,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline BD_Shape<T>&
-BD_Shape<T>::operator=(const BD_Shape& y) {
-  dbm = y.dbm;
-  status = y.status;
-  if (y.marked_shortest_path_reduced())
-    redundancy_dbm = y.redundancy_dbm;
-  return *this;
-}
+  //! Builds a product out of a BD shape.
+  /*!
+    Builds a product containing \p bd.
+    The product inherits the space dimension of the BD shape.
 
-template <typename T>
-inline
-BD_Shape<T>::~BD_Shape() {
-}
+    \param bd
+    The BD shape representing the product to be built.
 
-template <typename T>
-inline void
-BD_Shape<T>::swap(BD_Shape& y) {
-  std::swap(dbm, y.dbm);
-  std::swap(status, y.status);
-  std::swap(redundancy_dbm, y.redundancy_dbm);
-}
+    \param complexity
+    The complexity is ignored.
 
-template <typename T>
-inline dimension_type
-BD_Shape<T>::space_dimension() const {
-  return dbm.num_rows() - 1;
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const BD_Shape<U>& bd,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline bool
-BD_Shape<T>::is_empty() const {
-  shortest_path_closure_assign();
-  return marked_empty();
-}
+  //! Builds a product out of an octagonal shape.
+  /*!
+    Builds a product containing \p os.
+    The product inherits the space dimension of the octagonal shape.
 
-template <typename T>
-inline bool
-operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
-  const dimension_type x_space_dim = x.space_dimension();
-  // Dimension-compatibility check.
-  if (x_space_dim != y.space_dimension())
-    return false;
+    \param os
+    The octagonal shape representing the product to be built.
 
-  // Zero-dim BDSs are equal if and only if they are both empty or universe.
-  if (x_space_dim == 0)
-    if (x.marked_empty())
-      return y.marked_empty();
-    else
-      return !y.marked_empty();
+    \param complexity
+    The complexity is ignored.
 
-  // The exact equivalence test requires shortest-path closure.
-  x.shortest_path_closure_assign();
-  y.shortest_path_closure_assign();
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const Octagonal_Shape<U>& os,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-  // If one of two BDSs is empty, then they are equal
-  // if and only if the other BDS is empty too.
-  if (x.marked_empty())
-    return y.marked_empty();
-  if (y.marked_empty())
-    return false;
-  // Check for syntactic equivalence of the two (shortest-path closed)
-  // systems of bounded differences.
-  return x.dbm == y.dbm;
-}
+  //! Ordinary copy-constructor.
+  Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-inline bool
-operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
-  return !(x == y);
-}
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename E1, typename E2, typename S>
+  explicit
+  Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
 
-/*! \relates BD_Shape */
-template <typename Temp, typename To, typename T>
-inline bool
-rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			    const BD_Shape<T>& x,
-			    const BD_Shape<T>& y,
-			    const Rounding_Dir dir,
-			    Temp& tmp0,
-			    Temp& tmp1,
-			    Temp& tmp2) {
-  const dimension_type x_space_dim = x.space_dimension();
-  // Dimension-compatibility check.
-  if (x_space_dim != y.space_dimension())
-    return false;
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Partially_Reduced_Product& operator=(const Partially_Reduced_Product& y);
 
-  // Zero-dim BDSs are equal if and only if they are both empty or universe.
-  if (x_space_dim == 0) {
-    if (x.marked_empty() == y.marked_empty())
-      assign_r(r, 0, ROUND_NOT_NEEDED);
-    else
-      r = PLUS_INFINITY;
-    return true;
-  }
+  //! \name Member Functions that Do Not Modify the Partially_Reduced_Product
+  //@{
 
-  // The distance computation requires shortest-path closure.
-  x.shortest_path_closure_assign();
-  y.shortest_path_closure_assign();
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-  // If one of two BDSs is empty, then they are equal if and only if
-  // the other BDS is empty too.
-  if (x.marked_empty() ||  y.marked_empty()) {
-   if (x.marked_empty() == y.marked_empty())
-      assign_r(r, 0, ROUND_NOT_NEEDED);
-    else
-      r = PLUS_INFINITY;
-   return true;
-  }
+  /*! \brief
+    Returns the minimum \ref Affine_Independence_and_Affine_Dimension
+    "affine dimension"
+    (see also \ref Grid_Affine_Dimension "grid affine dimension")
+    of the components of \p *this.
+  */
+  dimension_type affine_dimension() const;
 
-  return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
-}
+  //! Returns a constant reference to the first of the pair.
+  const D1& domain1() const;
 
-/*! \relates BD_Shape */
-template <typename Temp, typename To, typename T>
-inline bool
-rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			    const BD_Shape<T>& x,
-			    const BD_Shape<T>& y,
-			    const Rounding_Dir dir) {
-  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
-  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
-}
+  //! Returns a constant reference to the second of the pair.
+  const D2& domain2() const;
 
-/*! \relates BD_Shape */
-template <typename To, typename T>
-inline bool
-rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			    const BD_Shape<T>& x,
-			    const BD_Shape<T>& y,
-			    const Rounding_Dir dir) {
-  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
-}
+  //! Returns a system of constraints which approximates \p *this.
+  Constraint_System constraints() const;
 
-/*! \relates BD_Shape */
-template <typename Temp, typename To, typename T>
-inline bool
-euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			  const BD_Shape<T>& x,
-			  const BD_Shape<T>& y,
-			  const Rounding_Dir dir,
-			  Temp& tmp0,
-			  Temp& tmp1,
-			  Temp& tmp2) {
-  const dimension_type x_space_dim = x.space_dimension();
-  // Dimension-compatibility check.
-  if (x_space_dim != y.space_dimension())
-    return false;
+  /*! \brief
+    Returns a system of constraints which approximates \p *this, in
+    reduced form.
+  */
+  Constraint_System minimized_constraints() const;
 
-  // Zero-dim BDSs are equal if and only if they are both empty or universe.
-  if (x_space_dim == 0) {
-    if (x.marked_empty() == y.marked_empty())
-      assign_r(r, 0, ROUND_NOT_NEEDED);
-    else
-      r = PLUS_INFINITY;
-    return true;
-  }
+  //! Returns a system of congruences which approximates \p *this.
+  Congruence_System congruences() const;
 
-  // The distance computation requires shortest-path closure.
-  x.shortest_path_closure_assign();
-  y.shortest_path_closure_assign();
+  /*! \brief
+    Returns a system of congruences which approximates \p *this, in
+    reduced form.
+  */
+  Congruence_System minimized_congruences() const;
 
-  // If one of two BDSs is empty, then they are equal if and only if
-  // the other BDS is empty too.
-  if (x.marked_empty() ||  y.marked_empty()) {
-   if (x.marked_empty() == y.marked_empty())
-      assign_r(r, 0, ROUND_NOT_NEEDED);
-    else
-      r = PLUS_INFINITY;
-   return true;
-  }
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
 
-  return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
-}
+    Returns the Poly_Con_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r implies <CODE>is_included()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_included()</CODE>;
+    \p r implies <CODE>saturates()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>saturates()</CODE>;
+    \p r implies <CODE>is_disjoint()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_disjoint()</CODE>;
+    and \p r implies <CODE>nothing()</CODE>
+    if and only if both \p r1 and \p r2 imply
+    <CODE>strictly_intersects()</CODE>.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
 
-/*! \relates BD_Shape */
-template <typename Temp, typename To, typename T>
-inline bool
-euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			  const BD_Shape<T>& x,
-			  const BD_Shape<T>& y,
-			  const Rounding_Dir dir) {
-  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
-  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
-}
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
 
-/*! \relates BD_Shape */
-template <typename To, typename T>
-inline bool
-euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			  const BD_Shape<T>& x,
-			  const BD_Shape<T>& y,
-			  const Rounding_Dir dir) {
-  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
-}
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
 
-/*! \relates BD_Shape */
-template <typename Temp, typename To, typename T>
-inline bool
-l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			   const BD_Shape<T>& x,
-			   const BD_Shape<T>& y,
-			   const Rounding_Dir dir,
-			   Temp& tmp0,
-			   Temp& tmp1,
-			   Temp& tmp2) {
-  const dimension_type x_space_dim = x.space_dimension();
-  // Dimension-compatibility check.
-  if (x_space_dim != y.space_dimension())
-    return false;
+    Returns the Poly_Gen_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r = <CODE>subsumes()</CODE>
+    if and only if \p r1 = \p r2 = <CODE>subsumes()</CODE>;
+    and \p r = <CODE>nothing()</CODE>
+    if and only if one or both of \p r1 and \p r2 = <CODE>nothing()</CODE>;
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
 
-  // Zero-dim BDSs are equal if and only if they are both empty or universe.
-  if (x_space_dim == 0) {
-    if (x.marked_empty() == y.marked_empty())
-      assign_r(r, 0, ROUND_NOT_NEEDED);
-    else
-      r = PLUS_INFINITY;
-    return true;
-  }
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if either of the components
+    of \p *this are empty.
+  */
+  bool is_empty() const;
 
-  // The distance computation requires shortest-path closure.
-  x.shortest_path_closure_assign();
-  y.shortest_path_closure_assign();
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are the universe.
+  */
+  bool is_universe() const;
 
-  // If one of two BDSs is empty, then they are equal if and only if
-  // the other BDS is empty too.
-  if (x.marked_empty() ||  y.marked_empty()) {
-   if (x.marked_empty() == y.marked_empty())
-      assign_r(r, 0, ROUND_NOT_NEEDED);
-    else
-      r = PLUS_INFINITY;
-   return true;
-  }
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are topologically closed subsets of the vector space.
+  */
+  bool is_topologically_closed() const;
 
-  return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    componentwise disjoint.
 
-/*! \relates BD_Shape */
-template <typename Temp, typename To, typename T>
-inline bool
-l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			   const BD_Shape<T>& x,
-			   const BD_Shape<T>& y,
-			   const Rounding_Dir dir) {
-  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
-  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
-  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
-}
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Partially_Reduced_Product& y) const;
 
-/*! \relates BD_Shape */
-template <typename To, typename T>
-inline bool
-l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
-			   const BD_Shape<T>& x,
-			   const BD_Shape<T>& y,
-			   const Rounding_Dir dir) {
-  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is discrete.
+  */
+  bool is_discrete() const;
 
-template <typename T>
-inline void
-BD_Shape<T>::add_dbm_constraint(const dimension_type i,
-				const dimension_type j,
-				N k) {
-  // Private method: the caller has to ensure the following.
-  assert(i <= space_dimension() && j <= space_dimension() && i != j);
-  N& dbm_ij = dbm[i][j];
-  if (dbm_ij > k) {
-    dbm_ij = k;
-    if (marked_shortest_path_closed())
-      status.reset_shortest_path_closed();
-  }
-  assert(OK());
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is bounded.
+  */
+  bool is_bounded() const;
 
-template <typename T>
-inline void
-BD_Shape<T>::add_dbm_constraint(const dimension_type i,
-				const dimension_type j,
-				Coefficient_traits::const_reference num,
-				Coefficient_traits::const_reference den) {
-  // Private method: the caller has to ensure the following.
-  assert(i <= space_dimension() && j <= space_dimension() && i != j);
-  assert(den != 0);
-  N k;
-  Implementation::BD_Shapes::div_round_up(k, num, den);
-  add_dbm_constraint(i, j, k);
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
 
-template <typename T>
-inline bool
-BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
-  const BD_Shape<T>& x = *this;
-  return x.contains(y) && !y.contains(x);
-}
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
 
-template <typename T>
-inline bool
-BD_Shape<T>::bds_hull_assign_and_minimize(const BD_Shape& y) {
-  bds_hull_assign(y);
-  assert(marked_empty()
-	 || space_dimension() == 0 || marked_shortest_path_closed());
-  return !marked_empty();
-}
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
 
-template <typename T>
-inline void
-BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
-  bds_hull_assign(y);
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
 
-template <typename T>
-inline bool
-BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) {
-  // TODO: this must be properly implemented.
-  return false;
-}
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
 
-template <typename T>
-inline bool
-BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
-  return bds_hull_assign_if_exact(y);
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
 
-template <typename T>
-inline void
-BD_Shape<T>::difference_assign(const BD_Shape& y) {
-  bds_difference_assign(y);
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
 
-template <typename T>
-inline void
-BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
-  // Dimension-compatibility check: the variable having
-  // maximum index is the one occurring last in the set.
-  if (new_dim > space_dimension())
-    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
-				 new_dim);
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-  // The removal of no dimensions from any BDS is a no-op.
-  // Note that this case also captures the only legal removal of
-  // dimensions from a zero-dim space BDS.
-  if (new_dim == space_dimension()) {
-    assert(OK());
-    return;
-  }
+    \param sup_n
+    The numerator of the supremum value;
 
-  // Shortest-path closure is necessary as in remove_space_dimensions().
-  shortest_path_closure_assign();
-  dbm.resize_no_copy(new_dim + 1);
+    \param sup_d
+    The denominator of the supremum value;
 
-  // Shortest-path closure is maintained.
-  // TODO: see whether or not reduction can be (efficiently!) maintained too.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
 
-  // If we removed _all_ dimensions from a non-empty BDS,
-  // the zero-dim universe BDS has been obtained.
-  if (new_dim == 0 && !marked_empty())
-    set_zero_dim_univ();
-  assert(OK());
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-template <typename T>
-inline bool
-BD_Shape<T>::intersection_assign_and_minimize(const BD_Shape& y) {
-  intersection_assign(y);
-  shortest_path_closure_assign();
-  return !marked_empty();
-}
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
 
-template <typename T>
-inline void
-BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
-  static N stop_points[] = {
-    N(-2, ROUND_UP),
-    N(-1, ROUND_UP),
-    N( 0, ROUND_UP),
-    N( 1, ROUND_UP),
-    N( 2, ROUND_UP)
-  };
-  CC76_extrapolation_assign(y,
-			    stop_points,
-			    stop_points
-			    + sizeof(stop_points)/sizeof(stop_points[0]),
-			    tp);
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
 
-template <typename T>
-inline void
-BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
-  // See the documentation for polyhedra.
-  C_Polyhedron px(constraints());
-  C_Polyhedron py(y.constraints());
-  px.H79_widening_assign(py, tp);
-  BD_Shape x(px);
-  swap(x);
-  assert(OK());
-}
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-template <typename T>
-inline void
-BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
-					      const Constraint_System& cs,
-					      unsigned* tp) {
-  // See the documentation for polyhedra.
-  C_Polyhedron px(constraints());
-  C_Polyhedron py(y.constraints());
-  px.limited_H79_extrapolation_assign(py, cs, tp);
-  BD_Shape x(px);
-  swap(x);
-  assert(OK());
-}
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
 
-template <typename T>
-inline void
-BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
-  // Dimension-compatibility check.
-  if (space_dimension() != y.space_dimension())
-    throw_dimension_incompatible("time_elapse_assign(y)", y);
-  // See the documentation for polyhedra.
-  C_Polyhedron px(constraints());
-  C_Polyhedron py(y.constraints());
-  px.time_elapse_assign(py);
-  BD_Shape x(px);
-  swap(x);
-  assert(OK());
-}
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
 
-template <typename T>
-inline void
-BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
-  assert(0 < v && v <= dbm.num_rows());
-  DB_Row<N>& dbm_v = dbm[v];
-  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
-    dbm_v[i] = PLUS_INFINITY;
-    dbm[i][v] = PLUS_INFINITY;
-  }
-}
+    \param point
+    When maximization succeeds, will be assigned a generator point
+    where \p expr reaches its supremum value.
 
-template <typename T>
-inline void
-BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
-  assert(0 < v && v <= dbm.num_rows());
-  DB_Row<N>& dbm_v = dbm[v];
-  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
-    dbm_v[i] = PLUS_INFINITY;
-    dbm[i][v] = PLUS_INFINITY;
-  }
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-} // namespace Parma_Polyhedra_Library
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& point) const;
 
-namespace std {
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below i \p *this, in which case the
+    infimum value is computed.
 
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-template <typename T>
-inline void
-swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
-     Parma_Polyhedra_Library::BD_Shape<T>& y) {
-  x.swap(y);
-}
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-} // namespace std
+    \param inf_n
+    The numerator of the infimum value;
 
-// Automatically generated from PPL source file ../src/BD_Shape.templates.hh line 1
-/* BD_Shape class implementation: non-inline template functions.
-*/
+    \param inf_d
+    The denominator of the infimum value;
 
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
 
-// Automatically generated from PPL source file ../src/BD_Shape.templates.hh line 29
-#include <cassert>
-#include <vector>
-#include <deque>
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
-#include <algorithm>
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-namespace Parma_Polyhedra_Library {
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
 
-template <typename T>
-BD_Shape<T>::BD_Shape(const Generator_System& gs)
-  : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
-  using Implementation::BD_Shapes::max_assign;
-  using Implementation::BD_Shapes::div_round_up;
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
 
-  const Generator_System::const_iterator gs_begin = gs.begin();
-  const Generator_System::const_iterator gs_end = gs.end();
-  if (gs_begin == gs_end) {
-    // An empty generator system defines the empty polyhedron.
-    set_empty();
-    assert(OK());
-    return;
-  }
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-  const dimension_type space_dim = space_dimension();
-  DB_Row<N>& dbm_0 = dbm[0];
-  N tmp;
+    \param inf_n
+    The numerator of the infimum value;
 
-  bool dbm_initialized = false;
-  bool point_seen = false;
-  // Going through all the points and closure points.
-  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
-    const Generator& g = *i;
-    switch (g.type()) {
-    case Generator::POINT:
-      point_seen = true;
-      // Intentionally fall through.
-    case Generator::CLOSURE_POINT:
-      if (!dbm_initialized) {
-	// When handling the first (closure) point, we initialize the DBM.
-	dbm_initialized = true;
-	const Coefficient& d = g.divisor();
-	for (dimension_type i = space_dim; i > 0; --i) {
-	  const Coefficient& g_i = g.coefficient(Variable(i-1));
-	  DB_Row<N>& dbm_i = dbm[i];
-	  for (dimension_type j = space_dim; j > 0; --j)
-	    if (i != j)
-	      div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
-	  div_round_up(dbm_i[0], -g_i, d);
-	}
-	for (dimension_type j = space_dim; j > 0; --j)
-	  div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d);
-	// Note: no need to initialize the first element of the main diagonal.
-      }
-      else {
-	// This is not the first point: the DBM already contains
-	// valid values and we must compute maxima.
-	const Coefficient& d = g.divisor();
-	for (dimension_type i = space_dim; i > 0; --i) {
-	  const Coefficient& g_i = g.coefficient(Variable(i-1));
-	  DB_Row<N>& dbm_i = dbm[i];
-	  // The loop correctly handles the case when i == j.
-	  for (dimension_type j = space_dim; j > 0; --j) {
-	    div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d);
-	    max_assign(dbm_i[j], tmp);
-	  }
-	  div_round_up(tmp, -g_i, d);
-	  max_assign(dbm_i[0], tmp);
-	}
-	for (dimension_type j = space_dim; j > 0; --j) {
-	  div_round_up(tmp, g.coefficient(Variable(j-1)), d);
-	  max_assign(dbm_0[j], tmp);
-	}
-      }
-      break;
-    default:
-      // Lines and rays temporarily ignored.
-      break;
-    }
-  }
+    \param inf_d
+    The denominator of the infimum value;
 
-  if (!point_seen)
-    // The generator system is not empty, but contains no points.
-    throw std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
-				"the non-empty generator system gs "
-				"contains no points.");
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
 
-  // Going through all the lines and rays.
-  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
-    const Generator& g = *i;
-    switch (g.type()) {
-    case Generator::LINE:
-      for (dimension_type i = space_dim; i > 0; --i) {
-	const Coefficient& g_i = g.coefficient(Variable(i-1));
-	DB_Row<N>& dbm_i = dbm[i];
-	// The loop correctly handles the case when i == j.
-	for (dimension_type j = space_dim; j > 0; --j)
-	  if (g_i != g.coefficient(Variable(j-1)))
-	    dbm_i[j] = PLUS_INFINITY;
-	if (g_i != 0)
-	  dbm_i[0] = PLUS_INFINITY;
-      }
-      for (dimension_type j = space_dim; j > 0; --j)
-	if (g.coefficient(Variable(j-1)) != 0)
-	  dbm_0[j] = PLUS_INFINITY;
-      break;
-    case Generator::RAY:
-      for (dimension_type i = space_dim; i > 0; --i) {
-	const Coefficient& g_i = g.coefficient(Variable(i-1));
-	DB_Row<N>& dbm_i = dbm[i];
-	// The loop correctly handles the case when i == j.
-	for (dimension_type j = space_dim; j > 0; --j)
-	  if (g_i < g.coefficient(Variable(j-1)))
-	    dbm_i[j] = PLUS_INFINITY;
-	if (g_i < 0)
-	  dbm_i[0] = PLUS_INFINITY;
-      }
-      for (dimension_type j = space_dim; j > 0; --j)
-	if (g.coefficient(Variable(j-1)) > 0)
-	  dbm_0[j] = PLUS_INFINITY;
-      break;
-    default:
-      // Points and closure points already dealt with.
-      break;
-    }
-  }
-  status.set_shortest_path_closed();
-  assert(OK());
-}
+    \param point
+    When minimization succeeds, will be assigned a generator point
+    where \p expr reaches its infimum value.
 
-template <typename T>
-BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
-  : dbm(), status(), redundancy_dbm() {
-  using Implementation::BD_Shapes::div_round_up;
-  const dimension_type num_dimensions = ph.space_dimension();
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-  if (ph.marked_empty()) {
-    *this = BD_Shape(num_dimensions, EMPTY);
-    return;
-  }
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& point) const;
 
-  if (num_dimensions == 0) {
-    *this = BD_Shape(num_dimensions, UNIVERSE);
-    return;
-  }
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    contains the corresponding component of \p y.
 
-  // Build from generators when we do not care about complexity
-  // or when the process has polynomial complexity.
-  if (complexity == ANY_COMPLEXITY
-      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
-    *this = BD_Shape(ph.generators());
-    return;
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Partially_Reduced_Product& y) const;
 
-  // We cannot afford exponential complexity, we do not have a complete set
-  // of generators for the polyhedron, and the polyhedron is not trivially
-  // empty or zero-dimensional.  Constraints, however, are up to date.
-  assert(ph.constraints_are_up_to_date());
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    strictly contains the corresponding component of \p y.
 
-  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
-    // If the constraint system of the polyhedron is minimized,
-    // the test `is_universe()' has polynomial complexity.
-    if (ph.is_universe()) {
-      *this = BD_Shape(num_dimensions, UNIVERSE);
-      return;
-    }
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Partially_Reduced_Product& y) const;
 
-  // See if there is at least one inconsistent constraint in `ph.con_sys'.
-  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
-	 cs_end = ph.con_sys.end(); i != cs_end; ++i)
-    if (i->is_inconsistent()) {
-      *this = BD_Shape(num_dimensions, EMPTY);
-      return;
-    }
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
 
-  // If `complexity' allows it, use simplex to derive the exact (modulo
-  // the fact that our BDSs are topologically closed) variable bounds.
-  if (complexity == SIMPLEX_COMPLEXITY) {
-    LP_Problem lp;
-    lp.set_optimization_mode(MAXIMIZATION);
+  //@} // Member Functions that Do Not Modify the Partially_Reduced_Product
 
-    const Constraint_System& ph_cs = ph.constraints();
-    if (!ph_cs.has_strict_inequalities())
-      lp.add_constraints(ph_cs);
-    else
-      // Adding to `lp' a topologically closed version of `ph_cs'.
-      for (Constraint_System::const_iterator i = ph_cs.begin(),
-	     iend = ph_cs.end(); i != iend; ++i) {
-	const Constraint& c = *i;
-	lp.add_constraint(c.is_equality()
-			  ? (Linear_Expression(c) == 0)
-			  : (Linear_Expression(c) >= 0));
-      }
+  //! \name Space Dimension Preserving Member Functions that May Modify the Partially_Reduced_Product
+  //@{
 
-    // Check for unsatisfiability.
-    if (!lp.is_satisfiable()) {
-      *this = BD_Shape(num_dimensions, EMPTY);
-      return;
-    }
+  //! Adds constraint \p c to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
 
-    // Get all the upper bounds.
-    LP_Problem_Status lp_status;
-    Generator g(point());
-    TEMP_INTEGER(num);
-    TEMP_INTEGER(den);
-    for (dimension_type i = 1; i <= num_dimensions; ++i) {
-      Variable x(i-1);
-      // Evaluate optimal upper bound for `x <= ub'.
-      lp.set_objective_function(x);
-      lp_status = lp.solve();
-      if (lp_status == UNBOUNDED_LP_PROBLEM)
-	dbm[0][i] = PLUS_INFINITY;
-      else {
-	assert(lp_status == OPTIMIZED_LP_PROBLEM);
-	g = lp.optimizing_point();
-	lp.evaluate_objective_function(g, num, den);
-	div_round_up(dbm[0][i], num, den);
-      }
-      // Evaluate optimal upper bound for `x - y <= ub'.
-      for (dimension_type j = 1; j <= num_dimensions; ++j) {
-	if (i == j)
-	  continue;
-	Variable y(j-1);
-	lp.set_objective_function(x - y);
-	lp_status = lp.solve();
-	if (lp_status == UNBOUNDED_LP_PROBLEM)
-	  dbm[j][i] = PLUS_INFINITY;
-	else {
-	  assert(lp_status == OPTIMIZED_LP_PROBLEM);
-	  g = lp.optimizing_point();
-	  lp.evaluate_objective_function(g, num, den);
-	  div_round_up(dbm[j][i], num, den);
-	}
-      }
-      // Evaluate optimal upper bound for `-x <= ub'.
-      lp.set_objective_function(-x);
-      lp_status = lp.solve();
-      if (lp_status == UNBOUNDED_LP_PROBLEM)
-	dbm[i][0] = PLUS_INFINITY;
-      else {
-	assert(lp_status == OPTIMIZED_LP_PROBLEM);
-	g = lp.optimizing_point();
-	lp.evaluate_objective_function(g, num, den);
-	div_round_up(dbm[i][0], num, den);
-      }
-    }
-    status.set_shortest_path_closed();
-    return;
-  }
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
 
-  // Extract easy-to-find bounds from constraints.
-  *this = BD_Shape(ph.con_sys);
-}
+    \param c
+    The constraint to be used for refinement.
 
-template <typename T>
-void
-BD_Shape<T>::add_constraint(const Constraint& c) {
-  using Implementation::BD_Shapes::div_round_up;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
 
-  const dimension_type c_space_dim = c.space_dimension();
-  // Dimension-compatibility check.
-  if (c_space_dim > space_dimension())
-    throw_dimension_incompatible("add_constraint(c)", c);
-  // Strict inequalities are not allowed.
-  if (c.is_strict_inequality())
-    throw_constraint_incompatible("add_constraint(c)");
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
 
-  dimension_type num_vars = 0;
-  dimension_type i = 0;
-  dimension_type j = 0;
-  TEMP_INTEGER(coeff);
-  // Constraints that are not bounded differences are ignored.
-  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
-    return;
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
 
-  if (num_vars == 0) {
-    // Dealing with a trivial constraint.
-    if (c.inhomogeneous_term() < 0)
-      set_empty();
-    return;
-  }
+    \param cg
+    The congruence to be used for refinement.
 
-  // Select the cell to be modified for the "<=" part of the constraint,
-  // and set `coeff' to the absolute value of itself.
-  N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
-  N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
-  if (coeff < 0)
-    coeff = -coeff;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
 
-  bool changed = false;
-  // Compute the bound for `x', rounding towards plus infinity.
-  N d;
-  div_round_up(d, c.inhomogeneous_term(), coeff);
-  if (x > d) {
-    x = d;
-    changed = true;
-  }
+  //! Adds a copy of the congruences in \p cgs to \p *this.
+  /*!
+    \param cgs
+    The congruence system to be added.
 
-  if (c.is_equality()) {
-    // Also compute the bound for `y', rounding towards plus infinity.
-    div_round_up(d, -c.inhomogeneous_term(), coeff);
-    if (y > d) {
-      y = d;
-      changed = true;
-    }
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
 
-  // In general, adding a constraint does not preserve the shortest-path
-  // closure or reduction of the system of bounded differences.
-  if (changed && marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
-  assert(OK());
-}
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
 
-template <typename T>
-void
-BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
-  BD_Shape& x = *this;
+    \param  cgs
+    The congruences to be used for refinement.
 
-  const dimension_type x_space_dim = x.space_dimension();
-  const dimension_type y_space_dim = y.space_dimension();
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
 
-  // If `y' is an empty 0-dim space system of bounded differences,
-  // let `*this' become empty.
-  if (y_space_dim == 0 && y.marked_empty()) {
-    set_empty();
-    assert(OK());
-    return;
-  }
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added that may be recycled.
 
-  // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
-  // the dimension of the vector space.
-  if (x_space_dim == 0 && marked_empty()) {
-    dbm.grow(y_space_dim + 1);
-    assert(OK());
-    return;
-  }
-  // First we increase the space dimension of `x' by adding
-  // `y.space_dimension()' new dimensions.
-  // The matrix for the new system of constraints is obtained
-  // by leaving the old system of constraints in the upper left-hand side
-  // and placing the constraints of `y' in the lower right-hand side,
-  // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
-  // placed in the right position on the new matrix.
-  add_space_dimensions_and_embed(y_space_dim);
-  const dimension_type new_space_dim = x_space_dim + y_space_dim;
-  for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
-    DB_Row<N>& dbm_i = dbm[i];
-    dbm_i[0] = y.dbm[i - x_space_dim][0];
-    dbm[0][i] = y.dbm[0][i - x_space_dim];
-    for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
-      dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-  if (marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
-  assert(OK());
-}
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
 
-template <typename T>
-bool
-BD_Shape<T>::contains(const BD_Shape& y) const {
-  const BD_Shape<T>& x = *this;
-  const dimension_type x_space_dim = x.space_dimension();
+  //! Adds a copy of the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added.
 
-  // Dimension-compatibility check.
-  if (x_space_dim != y.space_dimension())
-    throw_dimension_incompatible("contains(y)", y);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
 
-  // The zero-dimensional universe shape contains any other
-  // dimension-compatible shape.
-  // The zero-dimensional empty shape only contains another
-  // zero-dimensional empty shape.
-  if (x_space_dim == 0) {
-    if (!marked_empty())
-      return true;
-    else
-      return y.marked_empty();
-  }
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
 
-  /*
-    The `y' system of bounded differences need be closed.
-    In fact if, for example, in `*this' we have the constraints:
+    \param  cs
+     The constraints to be used for refinement.
 
-    x1 - x2 <= 1;
-    x1      <= 3;
-    x2      <= 2;
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
 
-    in `y' the constraints are:
+  //! Adds the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added that may be recycled.
 
-    x1 - x2 <= 0;
-    x2      <= 1;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
 
-    without closure it returns "false", instead if we close `y' we have
-    the implicit constraint
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
 
-    x1      <= 1;
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
 
-    and so we obtain the right result "true".
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
   */
-  y.shortest_path_closure_assign();
+  void unconstrain(Variable var);
 
-  // An empty shape is contained in any other dimension-compatible shapes.
-  if (y.marked_empty())
-    return true;
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
 
-  // `*this' contains `y' if and only if every cell of `dbm'
-  // is greater than or equal to the correspondent one of `y.dbm'.
-  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
-    const DB_Row<N>& x_dbm_i = x.dbm[i];
-    const DB_Row<N>& y_dbm_i = y.dbm[i];
-    for (dimension_type j = x_space_dim + 1; j-- > 0; )
-      if (x_dbm_i[j] < y_dbm_i[j])
-	return false;
-  }
-  return true;
-}
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
 
-template <typename T>
-bool
-BD_Shape<T>::is_universe() const {
-  if (marked_empty())
-    return false;
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
 
-  const dimension_type space_dim = space_dimension();
-  // If the BDS is non-empty and zero-dimensional,
-  // then it is necessarily the universe BDS.
-  if (space_dim == 0)
-    return true;
+  /*! \brief
+    Assigns to \p *this the componentwise intersection of \p *this and \p y.
 
-  // A system of bounded differences defining the universe BDS can only
-  // contain trivial constraints.
-  for (dimension_type i = space_dim + 1; i-- > 0; ) {
-    const DB_Row<N>& dbm_i = dbm[i];
-    for (dimension_type j = space_dim + 1; j-- > 0; )
-      if (!is_plus_infinity(dbm_i[j]))
-	return false;
-  }
-  return true;
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Partially_Reduced_Product& y);
 
-template <typename T>
-void
-BD_Shape<T>
-::compute_predecessors(std::vector<dimension_type>& predecessor) const {
-  assert(!marked_empty() && marked_shortest_path_closed());
-  assert(predecessor.size() == 0);
-  // Variables are ordered according to their index.
-  // The vector `predecessor' is used to indicate which variable
-  // immediately precedes a given one in the corresponding equivalence class.
-  // The `leader' of an equivalence class is the element having minimum
-  // index: leaders are their own predecessors.
-  const dimension_type pred_size = dbm.num_rows();
-  // Initially, each variable is leader of its own zero-equivalence class.
-  predecessor.reserve(pred_size);
-  for (dimension_type i = 0; i < pred_size; ++i)
-    predecessor.push_back(i);
-  // Now compute actual predecessors.
-  for (dimension_type i = pred_size; i-- > 1; )
-    if (i == predecessor[i]) {
-      const DB_Row<N>& dbm_i = dbm[i];
-      for (dimension_type j = i; j-- > 0; )
-	if (j == predecessor[j]) {
-	  N negated_dbm_ji;
-	  if (neg_assign_r(negated_dbm_ji, dbm[j][i], ROUND_NOT_NEEDED) == V_EQ
-	      && negated_dbm_ji == dbm_i[j]) {
-	    // Choose as predecessor the variable having the smaller index.
-	    predecessor[i] = j;
-	    break;
-	  }
-	}
-    }
-}
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
 
-template <typename T>
-void
-BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
-  assert(!marked_empty() && marked_shortest_path_closed());
-  assert(leaders.size() == 0);
-  // Compute predecessor information.
-  compute_predecessors(leaders);
-  // Flatten the predecessor chains so as to obtain leaders.
-  assert(leaders[0] == 0);
-  for (dimension_type i = 1, iend = leaders.size(); i != iend; ++i) {
-    const dimension_type l_i = leaders[i];
-    assert(l_i <= i);
-    if (l_i != i) {
-      const dimension_type ll_i = leaders[l_i];
-      assert(ll_i == leaders[ll_i]);
-      leaders[i] = ll_i;
-    }
-  }
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Partially_Reduced_Product& y);
 
-template <typename T>
-bool
-BD_Shape<T>::is_shortest_path_reduced() const {
-  // If the BDS is empty, it is also reduced.
-  if (marked_empty())
-    return true;
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+    If it is exact on each of the components of \p *this, <CODE>true</CODE>
+    is returned, otherwise <CODE>false</CODE> is returned.
 
-  // A shortest-path reduced dbm is just a dbm with an indication of
-  // those constraints that are redundant. If there is no indication
-  // of the redundant constraints, then it cannot be reduced.
-  if (!marked_shortest_path_reduced())
-    return false;
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Partially_Reduced_Product& y);
 
-  const BD_Shape x_copy = *this;
-  const dimension_type x_space_dim = x_copy.space_dimension();
-  x_copy.shortest_path_closure_assign();
-  // If we just discovered emptyness, it cannot be reduced.
-  if (x_copy.marked_empty())
-    return false;
+  /*! \brief
+    Assigns to \p *this an approximation of the set-theoretic difference
+    of \p *this and \p y.
 
-  // The vector `leader' is used to indicate which variables are equivalent.
-  std::vector<dimension_type> leader(x_space_dim + 1);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Partially_Reduced_Product& y);
 
-  // We store the leader.
-  for (dimension_type i = x_space_dim + 1; i-- > 0; )
-    leader[i] = i;
+  /*! \brief
+    Assigns to \p *this the \ref Single_Update_Affine_Functions
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
 
-  // Step 1: we store really the leader with the corrected value.
-  // We search for the equivalent or zero-equivalent variables.
-  // The variable(i-1) and variable(j-1) are equivalent if and only if
-  // m_i_j == -(m_j_i).
-  for (dimension_type i = 0; i < x_space_dim; ++i) {
-    const DB_Row<N>& xdbm_i = x_copy.dbm[i];
-    for (dimension_type j = i + 1; j <= x_space_dim; ++j) {
-      N negated_xdbm_ji;
-      if (neg_assign_r(negated_xdbm_ji, x_copy.dbm[j][i],
-		       ROUND_NOT_NEEDED) == V_EQ
-	  && negated_xdbm_ji == xdbm_i[j])
-	// Two equivalent variables have got the same leader
-	// (the smaller variable).
-	leader[j] = leader[i];
-    }
-  }
+    \param var
+    The variable to which the affine expression is assigned;
 
-  // Step 2: we check if there are redundant constraints in the zero_cycle
-  // free systems of bounded differences, considering only the leaders.
-  // A constraint `c' is redundant, when there are two constraints such that
-  // their sum is the same constraint with the inhomogeneous term
-  // less than or equal to the `c' one.
-  N c;
-  for (dimension_type k = 0; k <= x_space_dim; ++k)
-    if (leader[k] == k) {
-      const DB_Row<N>& x_k = x_copy.dbm[k];
-      for (dimension_type i = 0; i <= x_space_dim; ++i)
-	if (leader[i] == i) {
-	  const DB_Row<N>& x_i = x_copy.dbm[i];
-	  const std::deque<bool>& redundancy_i = redundancy_dbm[i];
-	  const N& x_i_k = x_i[k];
-	  for (dimension_type j = 0; j <= x_space_dim; ++j)
-	    if (leader[j] == j) {
-	      const N& x_i_j = x_i[j];
-	      if (!is_plus_infinity(x_i_j)) {
-		add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
-		if (x_i_j >= c && !redundancy_i[j])
-		  return false;
-	      }
-	    }
-	}
-    }
+    \param expr
+    The numerator of the affine expression;
 
-  // The vector `var_conn' is used to check if there is a single cycle
-  // that connected all zero-equivalent variables between them.
-  // The value `space_dim + 1' is used to indicate that the equivalence
-  // class contains a single variable.
-  std::vector<dimension_type> var_conn(x_space_dim + 1);
-  for (dimension_type i = x_space_dim + 1; i-- > 0; )
-    var_conn[i] = x_space_dim + 1;
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-  // Step 3: we store really the `var_conn' with the right value, putting
-  // the variable with the selected variable is connected:
-  // we check the row of each variable:
-  // a- each leader could be connected with only zero-equivalent one,
-  // b- each no-leader with only another zero-equivalent one.
-  for (dimension_type i = 0; i <= x_space_dim; ++i) {
-    // It count with how many variables the selected variable is
-    // connected.
-    dimension_type t = 0;
-    dimension_type ld_i = leader[i];
-    // Case a: leader.
-    if (ld_i == i) {
-      for (dimension_type j = 0; j <= x_space_dim; ++j) {
-	dimension_type ld_j = leader[j];
-	// Only the connectedness with equivalent variables
-	// is considered.
-	if (j != ld_j)
-	  if (!redundancy_dbm[i][j]) {
-	    if (t == 1)
-	      // Two no-leaders couldn't connected with the same leader.
-	      return false;
-	    else
-	      if (ld_j != i)
-		// The variables isn't in the same equivalence class.
-		return false;
-	      else {
-		++t;
-		var_conn[i] = j;
-	      }
-	  }
-      }
-    }
-    // Case b: no-leader.
-    else {
-      for (dimension_type j = 0; j <= x_space_dim; ++j) {
-	if (!redundancy_dbm[i][j]) {
-	  dimension_type ld_j = leader[j];
-	  if (ld_i != ld_j)
-	    // The variables isn't in the same equivalence class.
-	    return false;
-	  else {
-	    if (t == 1)
-	      // Two variables couldn't connected with the same leader.
-	      return false;
-	    else {
-	      ++t;
-	      var_conn[i] = j;
-	    }
-	  }
-	  // A no-leader must be connected with
-	  // another variable.
-	  if (t == 0)
-	    return false;
-	}
-      }
-    }
-  }
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
 
-  // The vector `just_checked' is used to check if
-  // a variable is already checked.
-  std::vector<bool> just_checked(x_space_dim + 1);
-  for (dimension_type i = x_space_dim + 1; i-- > 0; )
-    just_checked[i] = false;
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
 
-  // Step 4: we check if there are single cycles that
-  // connected all the zero-equivalent variables between them.
-  for (dimension_type i = 0; i <= x_space_dim; ++i) {
-    bool jc_i = just_checked[i];
-    // We do not re-check the already considered single cycles.
-    if (!jc_i) {
-      dimension_type v_con = var_conn[i];
-      // We consider only the equivalence classes with
-      // 2 or plus variables.
-      if (v_con != x_space_dim + 1) {
-	// There is a single cycle if taken a variable,
-	// we return to this same variable.
-	while (v_con != i) {
-	  just_checked[v_con] = true;
-	  v_con = var_conn[v_con];
-	  // If we re-pass to an already considered variable,
-	  // then we haven't a single cycle.
-	  if (just_checked[v_con])
-	    return false;
-	}
-      }
-    }
-    just_checked[i] = true;
-  }
+  /*! \brief
+    Assigns to \p *this the \ref  Single_Update_Affine_Functions
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
 
-  // The system bounded differences is just reduced.
-  return true;
-}
+    \param var
+    The variable to which the affine expression is substituted;
 
-template <typename T>
-Poly_Con_Relation
-BD_Shape<T>::relation_with(const Constraint& c) const {
-  using Implementation::BD_Shapes::div_round_up;
+    \param expr
+    The numerator of the affine expression;
 
-  const dimension_type c_space_dim = c.space_dimension();
-  const dimension_type space_dim = space_dimension();
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-  // Dimension-compatibility check.
-  if (c_space_dim > space_dim)
-    throw_dimension_incompatible("relation_with(c)", c);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
 
-  shortest_path_closure_assign();
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym
+    (see also \ref Grid_Generalized_Image "generalized affine relation".)
 
-  if (marked_empty())
-    return Poly_Con_Relation::saturates()
-      && Poly_Con_Relation::is_included()
-      && Poly_Con_Relation::is_disjoint();
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-  if (space_dim == 0) {
-    if ((c.is_equality() && c.inhomogeneous_term() != 0)
-	|| (c.is_inequality() && c.inhomogeneous_term() < 0))
-      return Poly_Con_Relation::is_disjoint();
-    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
-      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
-      // thus, the zero-dimensional point also saturates it.
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_disjoint();
-    else if (c.is_equality() || c.inhomogeneous_term() == 0)
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_included();
-    else
-      // The zero-dimensional point saturates
-      // neither the positivity constraint 1 >= 0,
-      // nor the strict positivity constraint 1 > 0.
-      return Poly_Con_Relation::is_included();
-  }
+    \param relsym
+    The relation symbol;
 
-  dimension_type num_vars = 0;
-  dimension_type i = 0;
-  dimension_type j = 0;
-  TEMP_INTEGER(coeff);
-  // Constraints that are not bounded differences are not compatible.
-  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
-    throw_constraint_incompatible("relation_with(c)");
+    \param expr
+    The numerator of the right hand side affine expression;
 
-  if (num_vars == 0) {
-    // Dealing with a trivial constraint.
-    switch (sgn(c.inhomogeneous_term())) {
-    case -1:
-      return Poly_Con_Relation::is_disjoint();
-    case 0:
-      if (c.is_strict_inequality())
-	return Poly_Con_Relation::saturates()
-	  && Poly_Con_Relation::is_disjoint();
-      else
-	return Poly_Con_Relation::saturates()
-	  && Poly_Con_Relation::is_included();
-    case 1:
-      return Poly_Con_Relation::is_included();
-    }
-  }
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-  // Select the cell to be checked for the "<=" part of the constraint,
-  // and set `coeff' to the absolute value of itself.
-  const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
-  const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
-  if (coeff < 0)
-    coeff = -coeff;
-  N d;
-  div_round_up(d, c.inhomogeneous_term(), coeff);
-  N d1;
-  div_round_up(d1, -c.inhomogeneous_term(), coeff);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one());
 
-  switch (c.type()) {
-  case Constraint::EQUALITY:
-    if (d == x && d1 == y)
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_included();
-    else if (d < y && d1 > x)
-      return Poly_Con_Relation::is_disjoint();
-    else
-      return Poly_Con_Relation::strictly_intersects();
-  case Constraint::NONSTRICT_INEQUALITY:
-    if (d >= x && d1 >= y)
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_included();
-    else if (d >= x)
-      return Poly_Con_Relation::is_included();
-    else if (d < x && d1 > y)
-      return Poly_Con_Relation::is_disjoint();
-    else
-      return Poly_Con_Relation::strictly_intersects();
-  case Constraint::STRICT_INEQUALITY:
-    if (d >= x && d1 >= y)
-      return Poly_Con_Relation::saturates()
-	&& Poly_Con_Relation::is_disjoint();
-    else if (d > x)
-      return Poly_Con_Relation::is_included();
-    else if (d <= x && d1 >= y)
-      return Poly_Con_Relation::is_disjoint();
-    else
-      return Poly_Con_Relation::strictly_intersects();
-  }
-  // Quiet a compiler warning: this program point is unreachable.
-  throw std::runtime_error("PPL internal error");
-}
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
 
-template <typename T>
-Poly_Gen_Relation
-BD_Shape<T>::relation_with(const Generator& g) const {
-  const dimension_type space_dim = space_dimension();
-  const dimension_type g_space_dim = g.space_dimension();
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-  // Dimension-compatibility check.
-  if (space_dim < g_space_dim)
-    throw_dimension_incompatible("relation_with(g)", g);
+    \param relsym
+    The relation symbol;
 
-  // The empty bdiff cannot subsume a generator.
-  if (marked_empty())
-    return Poly_Gen_Relation::nothing();
+    \param expr
+    The numerator of the right hand side affine expression;
 
-  // A universe BD shape in a zero-dimensional space subsumes
-  // all the generators of a zero-dimensional space.
-  if (space_dim == 0)
-    return Poly_Gen_Relation::subsumes();
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-  const bool is_line = g.is_line();
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
 
-  // The relation between the bdiff and the given generator is obtained
-  // checking if the generator satisfies all the constraints in the bdiff.
-  // To check if the generator satisfies all the constraints it's enough
-  // studying the sign of the scalar product between the generator and
-  // all the constraints in the bdiff.
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
 
-  // We find in `*this' all the constraints.
-  for (dimension_type i = 0; i <= space_dim; ++i) {
-    for (dimension_type j = i + 1; j <= space_dim; ++j) {
-      const Variable x(j - 1);
-      const bool x_dimension_incompatible = x.space_dimension() > g_space_dim;
-      const N& dbm_ij = dbm[i][j];
-      const N& dbm_ji = dbm[j][i];
-      N negated_dbm_ji;
-      const bool is_equality
-	= neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
-	&& negated_dbm_ji == dbm_ij;
-      const bool dbm_ij_is_infinity = is_plus_infinity(dbm_ij);
-      const bool dbm_ji_is_infinity = is_plus_infinity(dbm_ji);
-      if (i != 0) {
-	const Variable y(i - 1);
-	const bool y_dimension_incompatible
-	  = y.space_dimension() > g_space_dim;
-	const bool is_trivial_zero
-	  = (x_dimension_incompatible && g.coefficient(y) == 0)
-	  || (y_dimension_incompatible && g.coefficient(x) == 0)
-	  || (x_dimension_incompatible && y_dimension_incompatible);
-	if (is_equality) {
-	  // We have one equality constraint.
-	  // The constraint has form ax - ay = b.
-	  // The scalar product has the form
-	  // 'a * y_i - a * x_j'
-	  // where y_i = g.coefficient(y) and x_j = g.coefficient(x).
-	  // It is not zero when both the coefficients of the
-	  // variables x and y are not zero or when these coefficients
- 	  if (!is_trivial_zero && g.coefficient(x) != g.coefficient(y))
-	    return Poly_Gen_Relation::nothing();
-	}
-	else
-	  // We have the binary inequality constraints.
-	  if (!dbm_ij_is_infinity) {
-	  // The constraint has form ax - ay <= b.
-	  // The scalar product has the form
-	  // 'a * y_i - a * x_j'
-	    if (is_line
-		&& !is_trivial_zero
-		&& g.coefficient(x) != g.coefficient(y))
-	      return Poly_Gen_Relation::nothing();
-	    else
-	      if (g.coefficient(y) < g.coefficient(x))
-		return Poly_Gen_Relation::nothing();
-	  }
-	  else if (!dbm_ji_is_infinity) {
-	    // The constraint has form ay - ax <= b.
-	    // The scalar product has the form
-	    // 'a * x_j - a* y_i'.
-	    if (is_line
-		&& !is_trivial_zero
-		&& g.coefficient(x) != g.coefficient(y))
-	      return Poly_Gen_Relation::nothing();
-	    else if (g.coefficient(x) < g.coefficient(y))
-	      return Poly_Gen_Relation::nothing();
-	  }
-      }
-      else {
-	// Here i == 0.
-	if (is_equality) {
-	  // The constraint has form ax = b.
-	  // To satisfy the constraint it's necessary that the scalar product
-	  // is not zero.It happens when the coefficient of the variable 'x'
-	  // in the generator is not zero, because the scalar
-	  // product has the form:
-	  // 'a * x_i' where x_i = g.coefficient(x)..
-	  if (!x_dimension_incompatible && g.coefficient(x) != 0)
-	    return Poly_Gen_Relation::nothing();
-	}
-	else
-	  // We have the unary inequality constraints.
-	  if (!dbm_ij_is_infinity) {
-	    // The constraint has form ax <= b.
-	    // The scalar product has the form:
-	    // '-a * x_i' where x_i = g.coefficient(x).
-	    if (is_line
-		&& !x_dimension_incompatible
-		&& g.coefficient(x) != 0)
-	      return Poly_Gen_Relation::nothing();
-	    else if (g.coefficient(x) > 0)
-	      return Poly_Gen_Relation::nothing();
-	  }
-	  else if (!dbm_ji_is_infinity) {
-	    // The constraint has form -ax <= b.
-	    // The scalar product has the form:
-	    // 'a * x_i' where x_i = g.coefficient(x).
-	    if (is_line
-		&& !x_dimension_incompatible
-		&& g.coefficient(x) != 0)
-	      return Poly_Gen_Relation::nothing();
-	    else if (g.coefficient(x) < 0)
-	      return Poly_Gen_Relation::nothing();
-	  }
-      }
-    }
-  }
-  return Poly_Gen_Relation::subsumes();
-}
+    \param lhs
+    The left hand side affine expression;
 
-template <typename T>
-void
-BD_Shape<T>::shortest_path_closure_assign() const {
-  using Implementation::BD_Shapes::min_assign;
+    \param relsym
+    The relation symbol;
 
-  // Do something only if necessary.
-  if (marked_empty() || marked_shortest_path_closed())
-    return;
-  const dimension_type num_dimensions = space_dimension();
-  // Zero-dimensional BDSs are necessarily shortest-path closed.
-  if (num_dimensions == 0)
-    return;
+    \param rhs
+    The right hand side affine expression.
 
-  // Even though the BDS will not change, its internal representation
-  // is going to be modified by the Floyd-Warshall algorithm.
-  BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
 
-  // Fill the main diagonal with zeros.
-  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
-    assert(is_plus_infinity(x.dbm[h][h]));
-    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
-  }
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
 
-  N sum;
-  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
-    const DB_Row<N>& xdbm_k = x.dbm[k];
-    for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
-      DB_Row<N>& xdbm_i = x.dbm[i];
-      const N& xdbm_i_k = xdbm_i[k];
-      if (!is_plus_infinity(xdbm_i_k))
-	for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
-	  const N& xdbm_k_j = xdbm_k[j];
-	  if (!is_plus_infinity(xdbm_k_j)) {
-	    // Rounding upward for correctness.
-	    add_assign_r(sum, xdbm_i_k, xdbm_k_j, ROUND_UP);
-	    min_assign(xdbm_i[j], sum);
-	  }
-	}
-    }
-  }
+    \param lhs
+    The left hand side affine expression;
 
-  // Check for emptyness: the BDS is empty if and only if there is a
-  // negative value on the main diagonal of `dbm'.
-  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
-    N& x_dbm_hh = x.dbm[h][h];
-    if (x_dbm_hh < 0) {
-      x.status.set_empty();
-      return;
-    }
-    else {
-      assert(x_dbm_hh == 0);
-      // Restore PLUS_INFINITY on the main diagonal.
-      x_dbm_hh = PLUS_INFINITY;
-    }
-  }
+    \param relsym
+    The relation symbol;
 
-  // The BDS is not empty and it is now shortest-path closed.
-  x.status.set_shortest_path_closed();
-}
+    \param rhs
+    The right hand side affine expression.
 
-template <typename T>
-void
-BD_Shape<T>::shortest_path_reduction_assign() const {
-  // Do something only if necessary.
-  if (marked_shortest_path_reduced())
-    return;
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
 
-  // First find the tighest constraints for this BDS.
-  shortest_path_closure_assign();
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-  // If `*this' is empty, then there is nothing to reduce.
-  if (marked_empty())
-    return;
+    \param var
+    The variable updated by the affine relation;
 
-  // Step 1: compute zero-equivalence classes.
-  // Variables corresponding to indices `i' and `j' are zero-equivalent
-  // if they lie on a zero-weight loop; since the matrix is shortest-path
-  // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
-  std::vector<dimension_type> predecessor;
-  compute_predecessors(predecessor);
-  std::vector<dimension_type> leaders;
-  compute_leader_indices(predecessor, leaders);
-  const dimension_type num_leaders = leaders.size();
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-  const dimension_type space_dim = space_dimension();
-  // TODO: directly work on `redundancy_dbm' so as to minimize allocations.
-  std::deque<bool> redundancy_row(space_dim + 1, true);
-  std::vector<std::deque<bool> > redundancy(space_dim + 1, redundancy_row);
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-  // Step 2: flag non-redundant constraints in the (zero-cycle-free)
-  // subsystem of bounded differences having only leaders as variables.
-  N c;
-  for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
-    const dimension_type i = leaders[l_i];
-    const DB_Row<N>& dbm_i = dbm[i];
-    std::deque<bool>& redundancy_i = redundancy[i];
-    for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
-      const dimension_type j = leaders[l_j];
-      if (redundancy_i[j]) {
-	const N& dbm_i_j = dbm_i[j];
-	redundancy_i[j] = false;
-	for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
-	  const dimension_type k = leaders[l_k];
-	  add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
-	  if (dbm_i_j >= c) {
-	    redundancy_i[j] = true;
-	    break;
-	  }
-	}
-      }
-    }
-  }
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-  // Step 3: flag non-redundant constraints in zero-equivalence classes.
-  // Each equivalence class must have a single 0-cycle connecting
-  // all the equivalent variables in increasing order.
-  std::deque<bool> dealt_with(space_dim + 1, false);
-  for (dimension_type i = space_dim + 1; i-- > 0; )
-    // We only need to deal with non-singleton zero-equivalence classes
-    // that haven't already been dealt with.
-    if (i != predecessor[i] && !dealt_with[i]) {
-      dimension_type j = i;
-      while (true) {
-	const dimension_type pred_j = predecessor[j];
-	if (j == pred_j) {
-	  // We finally found the leader of `i'.
-	  assert(redundancy[i][j]);
-	  redundancy[i][j] = false;
-	  // Here we dealt with `j' (i.e., `pred_j'), but it is useless
-	  // to update `dealt_with' because `j' is a leader.
-	  break;
-	}
-	// We haven't found the leader of `i' yet.
-	assert(redundancy[pred_j][j]);
-	redundancy[pred_j][j] = false;
-	dealt_with[pred_j] = true;
-	j = pred_j;
-      }
-    }
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
 
-  // Even though shortest-path reduction is not going to change the BDS,
-  // it might change its internal representation.
-  BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
-  std::swap(x.redundancy_dbm, redundancy);
-  x.status.set_shortest_path_reduced();
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-  assert(is_shortest_path_reduced());
-}
+    \param var
+    The variable updated by the affine relation;
 
-template <typename T>
-void
-BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
-  const dimension_type space_dim = space_dimension();
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-  // Dimension-compatibility check.
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("bds_hull_assign(y)", y);
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-  // The poly-hull of a polyhedron `bd' with an empty polyhedron is `bd'.
-  y.shortest_path_closure_assign();
-  if (y.marked_empty())
-    return;
-  shortest_path_closure_assign();
-  if (marked_empty()) {
-    *this = y;
-    return;
-  }
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-  // The bds-hull consists in constructing `*this' with the maximum
-  // elements selected from `*this' and `y'.
-  assert(space_dim == 0 || marked_shortest_path_closed());
-  for (dimension_type i = space_dim + 1; i-- > 0; ) {
-    DB_Row<N>& dbm_i = dbm[i];
-    const DB_Row<N>& y_dbm_i = y.dbm[i];
-    for (dimension_type j = space_dim + 1; j-- > 0; ) {
-      N& dbm_ij = dbm_i[j];
-      const N& y_dbm_ij = y_dbm_i[j];
-      if (dbm_ij < y_dbm_ij)
-	dbm_ij = y_dbm_ij;
-    }
-  }
-  // The result is still closed.
-  assert(OK());
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Time_Elapse_Operator
+    "time-elapse" between \p *this and \p y.
+    (See also \ref Grid_Time_Elapse "time-elapse".)
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Partially_Reduced_Product& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  // TODO: Add a way to call other widenings.
 
-template <typename T>
-void
-BD_Shape<T>::bds_difference_assign(const BD_Shape& y) {
-  const dimension_type space_dim = space_dimension();
+  // CHECKME: This may not be a real widening; it depends on the reduction
+  //          class R and the widening used.
 
-  // Dimension-compatibility check.
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("bds_difference_assign(y)", y);
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    "widening" between \p *this and \p y.
 
-  BD_Shape new_bdiffs(space_dim, EMPTY);
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
 
-  BD_Shape& x = *this;
+    \param y
+    A product that <EM>must</EM> be contained in \p *this;
 
-  x.shortest_path_closure_assign();
-  // The difference of an empty system of bounded differences
-  // and of a system of bounded differences `p' is empty.
-  if (x.marked_empty())
-    return;
-  y.shortest_path_closure_assign();
-  // The difference of a system of bounded differences `p'
-  // and an empty system of bounded differences is `p'.
-  if (y.marked_empty())
-    return;
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-  // If both systems of bounded differences are zero-dimensional,
-  // then at this point they are necessarily universe system of
-  // bounded differences, so that their difference is empty.
-  if (space_dim == 0) {
-    x.set_empty();
-    return;
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Partially_Reduced_Product& y,
+                       unsigned* tp = NULL);
 
-  // TODO: This is just an executable specification.
-  //       Have to find a more efficient method.
-  if (y.contains(x)) {
-    x.set_empty();
-    return;
-  }
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
 
-  // We take a constraint of the system y at the time and we
-  // consider its complementary. Then we intersect the union
-  // of these complementaries with the system x.
-  const Constraint_System& y_cs = y.constraints();
-  for (Constraint_System::const_iterator i = y_cs.begin(),
-	 y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
-    const Constraint& c = *i;
-    // If the system of bounded differences `x' is included
-    // in the system of bounded differences defined by `c',
-    // then `c' _must_ be skipped, as adding its complement to `x'
-    // would result in the empty system of bounded differences,
-    // and as we would obtain a result that is less precise
-    // than the bds-difference.
-    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
-      continue;
-    BD_Shape z = x;
-    const Linear_Expression e = Linear_Expression(c);
-    bool change = false;
-    if (c.is_nonstrict_inequality())
-      change = z.add_constraint_and_minimize(e <= 0);
-    if (c.is_equality()) {
-      BD_Shape w = x;
-      if (w.add_constraint_and_minimize(e <= 0))
-	new_bdiffs.bds_hull_assign(w);
-      change = z.add_constraint_and_minimize(e >= 0);
-    }
-    if (change)
-      new_bdiffs.bds_hull_assign(z);
-  }
-  *this = new_bdiffs;
-  // The result is still closed, because both bds_hull_assign() and
-  // add_constraint_and_minimize() preserve closure.
-  assert(OK());
-}
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-template <typename T>
-void
-BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
-  // Adding no dimensions is a no-op.
-  if (m == 0)
-    return;
+  /*! \brief
+    Adds \p m new space dimensions and embeds the components
+    of \p *this in the new vector space.
 
-  const dimension_type space_dim = space_dimension();
-  const dimension_type new_space_dim = space_dim + m;
-  const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+    \param m
+    The number of dimensions to add.
 
-  // To embed an n-dimension space BDS in a (n+m)-dimension space,
-  // we just add `m' rows and columns in the system of bounded differences,
-  // initialized to PLUS_INFINITY.
-  dbm.grow(new_space_dim + 1);
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+  void add_space_dimensions_and_embed(dimension_type m);
 
-  // Shortest-path closure is maintained (if it was holding).
-  // TODO: see whether reduction can be (efficiently!) maintained too.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+  /*! \brief
+    Adds \p m new space dimensions and does not embed the components
+    in the new vector space.
 
-  // If `*this' was the zero-dim space universe BDS,
-  // the we can set the shortest-path closure flag.
-  if (was_zero_dim_univ)
-    status.set_shortest_path_closed();
+    \param m
+    The number of space dimensions to add.
 
-  assert(OK());
-}
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
 
-template <typename T>
-void
-BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
-  // Adding no dimensions is a no-op.
-  if (m == 0)
-    return;
+  /*! \brief
+    Assigns to the first (resp., second) component of \p *this
+    the "concatenation" of the first (resp., second) components
+    of \p *this and \p y, taken in this order.
+    See also \ref Concatenating_Polyhedra and \ref Grid_Concatenate.
 
-  const dimension_type space_dim = space_dimension();
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Partially_Reduced_Product& y);
 
-  // If `*this' was zero-dimensional, then we add `m' rows and columns.
-  // If it also was non-empty, then we zero all the added elements
-  // and set the flag for shortest-path closure.
-  if (space_dim == 0) {
-    dbm.grow(m + 1);
-    if (!marked_empty()) {
-      for (dimension_type i = m + 1; i-- > 0; ) {
-	DB_Row<N>& dbm_i = dbm[i];
-	for (dimension_type j = m + 1; j-- > 0; )
-	  if (i != j)
-	    assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
-      }
-      status.set_shortest_path_closed();
-    }
-    assert(OK());
-    return;
-  }
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
 
-  // To project an n-dimension space system of bounded differences
-  // in a (n+m)-dimension space, we add `m' rows and columns.
-  // In the first row and column of the matrix we add `zero' from
-  // the (n+1)-th position to the end.
-  const dimension_type new_space_dim = space_dim + m;
-  dbm.grow(new_space_dim + 1);
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
 
-  // Bottom of the matrix and first row.
-  DB_Row<N>& dbm_0 = dbm[0];
-  for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
-    assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
-    assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
-  }
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
 
-  if (marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
-  assert(OK());
-}
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-template <typename T>
-void
-BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
-  // The removal of no dimensions from any BDS is a no-op.
-  // Note that this case also captures the only legal removal of
-  // space dimensions from a BDS in a 0-dim space.
-  if (to_be_removed.empty()) {
-    assert(OK());
-    return;
-  }
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
 
-  // Dimension-compatibility check: the variable having
-  // maximum cardinality is the one occurring last in the set.
-  const dimension_type max_dim_to_be_removed = to_be_removed.rbegin()->id();
-  const dimension_type old_space_dim = space_dimension();
-  if (max_dim_to_be_removed >= old_space_dim)
-    throw_dimension_incompatible("remove_space_dimensions(vs)",
-				 max_dim_to_be_removed);
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
 
-  // Shortest-path closure is necessary to keep precision.
-  shortest_path_closure_assign();
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
 
-  // When removing _all_ dimensions from a BDS,
-  // we obtain the zero-dimensional BDS.
-  const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
-  if (new_space_dim == 0) {
-    dbm.resize_no_copy(1);
-    if (!marked_empty())
-      // We set the zero_dim_univ flag.
-      set_zero_dim_univ();
-    assert(OK());
-    return;
-  }
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
 
-  // Shortest-path closure is maintained.
-  // TODO: see whether reduction can be (efficiently!) maintained too.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    The template class <CODE>Partial_Function</CODE> must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing \p *this.
 
-  // For each variable to remove, we erase the corresponding column and
-  // row by shifting the other columns and rows, than are not removed,
-  // respectively left and above.
-  Variables_Set::const_iterator tbr = to_be_removed.begin();
-  Variables_Set::const_iterator tbr_end = to_be_removed.end();
-  dimension_type dst = tbr->id() + 1;
-  dimension_type src = dst + 1;
-  for (++tbr; tbr != tbr_end; ++tbr) {
-    const dimension_type tbr_next = tbr->id() + 1;
-    // All other columns and rows are moved respectively to the left
-    // and above.
-    while (src < tbr_next) {
-      dbm[dst] = dbm[src];
-      for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
-	DB_Row<N>& dbm_i = dbm[i];
-	dbm_i[dst] = dbm_i[src];
-      }
-      ++dst;
-      ++src;
-    }
-    ++src;
-  }
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
 
-  // Moving the remaining rows and columns.
-  while (src <= old_space_dim) {
-    dbm[dst] = dbm[src];
-    for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
-      DB_Row<N>& dbm_i = dbm[i];
-      dbm_i[dst] = dbm_i[src];
-    }
-    ++src;
-    ++dst;
-  }
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
 
-  // Update the space dimension.
-  dbm.resize_no_copy(new_space_dim + 1);
-  assert(OK());
-}
+    \param m
+    The number of replicas to be created.
 
-template <typename T>
-template <typename PartialFunction>
-void
-BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
-  const dimension_type space_dim = space_dimension();
-  // TODO: this implementation is just an executable specification.
-  if (space_dim == 0)
-    return;
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
 
-  if (pfunc.has_empty_codomain()) {
-    // All dimensions vanish: the BDS becomes zero_dimensional.
-    remove_higher_space_dimensions(0);
-    assert(OK());
-    return;
-  }
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
-  // If we are going to actually reduce the space dimension,
-  // then shortest-path closure is required to keep precision.
-  if (new_space_dim < space_dim)
-    shortest_path_closure_assign();
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
 
-  // If the BDS is empty, then it is sufficient to adjust the
-  // space dimension of the system of bounded differences.
-  if (marked_empty()) {
-    remove_higher_space_dimensions(new_space_dim);
-    return;
-  }
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
 
-  // Shortest-path closure is maintained (if it was holding).
-  // TODO: see whether reduction can be (efficiently!) maintained too.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
 
-  // We create a new matrix with the new space dimension.
-  DB_Matrix<N> x(new_space_dim+1);
-  // First of all we must map the unary constraints, because
-  // there is the fictitious variable `zero', that can't be mapped
-  // at all.
-  const DB_Row<N>& dbm_0 = dbm[0];
-  DB_Row<N>& x_0 = x[0];
-  for (dimension_type j = 1; j <= space_dim; ++j) {
-    dimension_type new_j;
-    if (pfunc.maps(j - 1, new_j)) {
-      x_0[new_j + 1] = dbm_0[j];
-      x[new_j + 1][0] = dbm[j][0];
-    }
-  }
-  // Now we map the binary constraints, exchanging the indexes.
-  for (dimension_type i = 1; i <= space_dim; ++i) {
-    dimension_type new_i;
-    if (pfunc.maps(i - 1, new_i)) {
-      const DB_Row<N>& dbm_i = dbm[i];
-      ++new_i;
-      DB_Row<N>& x_new_i = x[new_i];
-      for (dimension_type j = i+1; j <= space_dim; ++j) {
-	dimension_type new_j;
-	if (pfunc.maps(j - 1, new_j)) {
-	  ++new_j;
-	  x_new_i[new_j] = dbm_i[j];
-	  x[new_j][new_i] = dbm[j][i];
-	}
-      }
-    }
-  }
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
 
-  std::swap(dbm, x);
-  assert(OK());
-}
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-template <typename T>
-void
-BD_Shape<T>::intersection_assign(const BD_Shape& y) {
-  const dimension_type space_dim = space_dimension();
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  // Dimension-compatibility check.
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("intersection_assign(y)", y);
+  friend bool operator==<>(const Partially_Reduced_Product<D1, D2, R>& x,
+			   const Partially_Reduced_Product<D1, D2, R>& y);
 
-  // If one of the two systems of bounded differences is empty,
-  // the intersection is empty.
-  if (marked_empty())
-    return;
-  if (y.marked_empty()) {
-    set_empty();
-    return;
-  }
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::
+  operator<<<>(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
 
-  // If both systems of bounded differences are zero-dimensional,
-  // then at this point they are necessarily non-empty,
-  // so that their intersection is non-empty too.
-  if (space_dim == 0)
-    return;
+  //! \name Miscellaneous Member Functions
+  //@{
 
-  // To intersect two systems of bounded differences we compare
-  // the constraints and we choose the less values.
-  bool changed = false;
-  for (dimension_type i = space_dim + 1; i-- > 0; ) {
-    DB_Row<N>& dbm_i = dbm[i];
-    const DB_Row<N>& y_dbm_i = y.dbm[i];
-    for (dimension_type j = space_dim + 1; j-- > 0; ) {
-      N& dbm_ij = dbm_i[j];
-      const N& y_dbm_ij = y_dbm_i[j];
-      if (dbm_ij > y_dbm_ij) {
-	dbm_ij = y_dbm_ij;
-	changed = true;
-      }
-    }
-  }
+  //! Destructor.
+  ~Partially_Reduced_Product();
 
-  if (changed && marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
-  assert(OK());
-}
+  /*! \brief
+    Swaps \p *this with product \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void swap(Partially_Reduced_Product& y);
 
-template <typename T>
-template <typename Iterator>
-void
-BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
-				       Iterator first, Iterator last,
-				       unsigned* tp) {
-  const dimension_type space_dim = space_dimension();
+  PPL_OUTPUT_DECLARATIONS
 
-  // Dimension-compatibility check.
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' is contained in or equal to `*this'.
-    const BD_Shape x_copy = *this;
-    const BD_Shape y_copy = y;
-    assert(x_copy.contains(y_copy));
-  }
-#endif
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
 
-  // If both systems of bounded differences are zero-dimensional,
-  // since `*this' contains `y', we simply return `*this'.
-  if (space_dim == 0)
-    return;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
 
-  shortest_path_closure_assign();
-  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
-  if (marked_empty())
-    return;
-  y.shortest_path_closure_assign();
-  // If `y' is empty, we return.
-  if (y.marked_empty())
-    return;
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
 
-  // If there are tokens available, work on a temporary copy.
-  if (tp != 0 && *tp > 0) {
-    BD_Shape<T> x_tmp(*this);
-    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
-    // If the widening was not precise, use one of the available tokens.
-    if (!contains(x_tmp))
-      --(*tp);
-    return;
-  }
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
 
-  // Compare each constraint in `y' to the corresponding one in `*this'.
-  // The constraint in `*this' is kept as is if it is stronger than or
-  // equal to the constraint in `y'; otherwise, the inhomogeneous term
-  // of the constraint in `*this' is further compared with elements taken
-  // from a sorted container (the stop-points, provided by the user), and
-  // is replaced by the first entry, if any, which is greater than or equal
-  // to the inhomogeneous term. If no such entry exists, the constraint
-  // is removed altogether.
-  for (dimension_type i = space_dim + 1; i-- > 0; ) {
-    DB_Row<N>& dbm_i = dbm[i];
-    const DB_Row<N>& y_dbm_i = y.dbm[i];
-    for (dimension_type j = space_dim + 1; j-- > 0; ) {
-      N& dbm_ij = dbm_i[j];
-      const N& y_dbm_ij = y_dbm_i[j];
-      if (y_dbm_ij < dbm_ij) {
-	Iterator k = std::lower_bound(first, last, dbm_ij);
-	if (k != last) {
-	  if (dbm_ij < *k)
-	    assign_r(dbm_ij, *k, ROUND_UP);
-	}
-	else
-	  dbm_ij = PLUS_INFINITY;
-      }
-    }
-  }
-  status.reset_shortest_path_closed();
-  assert(OK());
-}
+  //@} // Miscellaneous Member Functions
 
-template <typename T>
-void
-BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
-				BD_Shape& limiting_shape) const {
-  using Implementation::BD_Shapes::div_round_up;
+  //! Reduce.
+  /*
+    \return
+    <CODE>true</CODE> if and only if either of the resulting component
+    is strictly contained in the respective original.
+  */
+  bool reduce() const;
 
-  const dimension_type cs_space_dim = cs.space_dimension();
-  // Private method: the caller has to ensure the following.
-  assert(cs_space_dim <= space_dimension());
+protected:
+  //! The type of the first component.
+  typedef D1 Domain1;
 
-  bool changed = false;
-  for (Constraint_System::const_iterator i = cs.begin(),
-	 iend = cs.end(); i != iend; ++i) {
-    const Constraint& c = *i;
-    dimension_type num_vars = 0;
-    dimension_type i = 0;
-    dimension_type j = 0;
-    TEMP_INTEGER(coeff);
-    // Constraints that are not bounded differences are ignored.
-    if (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) {
-      // Select the cell to be modified for the "<=" part of the constraint,
-      // and set `coeff' to the absolute value of itself.
-      const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
-      const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
-      DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
-      N& ls_x = (coeff < 0) ? ls_dbm[i][j] : ls_dbm[j][i];
-      N& ls_y = (coeff < 0) ? ls_dbm[j][i] : ls_dbm[i][j];
-      if (coeff < 0)
-	coeff = -coeff;
-      // Compute the bound for `x', rounding towards plus infinity.
-      N d;
-      div_round_up(d, c.inhomogeneous_term(), coeff);
-      if (x <= d)
-	if (c.is_inequality())
-	  if (ls_x > d) {
-	    ls_x = d;
-	    changed = true;
-	  }
-	else {
-	  // Compute the bound for `y', rounding towards plus infinity.
-	  div_round_up(d, -c.inhomogeneous_term(), coeff);
-	  if (y <= d)
-	    if (ls_y > d) {
-	      ls_y = d;
-	      changed = true;
-	    }
+  //! The type of the second component.
+  typedef D2 Domain2;
 
-	}
-    }
-  }
+  //! The first component.
+  D1 d1;
 
-  // In general, adding a constraint does not preserve the shortest-path
-  // closure of the system of bounded differences.
-  if (changed && limiting_shape.marked_shortest_path_closed())
-    limiting_shape.status.reset_shortest_path_closed();
-}
+  //! The second component.
+  D2 d2;
 
-template <typename T>
-void
-BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
-					       const Constraint_System& cs,
-					       unsigned* tp) {
-  // Dimension-compatibility check.
-  const dimension_type space_dim = space_dimension();
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
-				 y);
+protected:
+  //! Clears the reduced flag.
+  void clear_reduced_flag() const;
 
-  // `cs' must be dimension-compatible with the two systems
-  // of bounded differences.
-  const dimension_type cs_space_dim = cs.space_dimension();
-  if (space_dim < cs_space_dim)
-    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+  //! Sets the reduced flag.
+  void set_reduced_flag() const;
 
-  // Strict inequalities not allowed.
-  if (cs.has_strict_inequalities())
-    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+  //! Return <CODE>true</CODE> if and only if the reduced flag is set.
+  bool is_reduced() const;
+
+  /*! \brief
+    Flag to record whether the components are reduced with respect
+    to each other and the reduction class.
+  */
+  bool reduced;
+};
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  This class is temporary and will be removed when template typedefs will
+  be supported in C++.
+
+  When template typedefs will be supported in C++, what now is verbosely
+  denoted by Domain_Product<Domain1, Domain2>::Direct_Product will simply
+  be denoted by Direct_Product<Domain1, Domain2>.
+*/
+template <typename D1, typename D2>
+class Domain_Product {
+public:
+  typedef Partially_Reduced_Product<D1, D2, No_Reduction<D1, D2> >
+  Direct_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Smash_Reduction<D1, D2> >
+  Smash_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Constraints_Reduction<D1, D2> >
+  Constraints_Product;
+};
 
-  // The limited CC76-extrapolation between two systems of bounded
-  // differences in a zero-dimensional space is a system of bounded
-  // differences in a zero-dimensional space, too.
-  if (space_dim == 0)
-    return;
+} // namespace Parma_Polyhedra_Library
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' is contained in or equal to `*this'.
-    const BD_Shape x_copy = *this;
-    const BD_Shape y_copy = y;
-    assert(x_copy.contains(y_copy));
-  }
-#endif
+namespace std {
 
-  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
-  if (marked_empty())
-    return;
-  // If `y' is empty, we return.
-  if (y.marked_empty())
-    return;
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+  template <typename D1, typename D2, typename R>
+void swap(Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& x,
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& y);
 
-  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
-  get_limiting_shape(cs, limiting_shape);
-  CC76_extrapolation_assign(y, tp);
-  intersection_assign(limiting_shape);
-  assert(OK());
-}
+} // namespace std
 
-template <typename T>
-void
-BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
-  const dimension_type space_dim = space_dimension();
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.inlines.hh line 1
+/* Partially_Reduced_Product class implementation: inline functions.
+*/
 
-  // Dimension-compatibility check.
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' is contained in or equal to `*this'.
-    const BD_Shape x_copy = *this;
-    const BD_Shape y_copy = y;
-    assert(x_copy.contains(y_copy));
-  }
-#endif
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.inlines.hh line 27
 
-  // Compute the affine dimension of `y'.
-  const dimension_type y_affine_dim = y.affine_dimension();
-  // If the affine dimension of `y' is zero, then either `y' is
-  // zero-dimensional, or it is empty, or it is a singleton.
-  // In all cases, due to the inclusion hypothesis, the result is `*this'.
-  if (y_affine_dim == 0)
-    return;
+namespace Parma_Polyhedra_Library {
 
-  // If the affine dimension has changed, due to the inclusion hypothesis,
-  // the result is `*this'.
-  const dimension_type x_affine_dim = affine_dimension();
-  assert(x_affine_dim >= y_affine_dim);
-  if (x_affine_dim != y_affine_dim)
-    return;
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::max_space_dimension() {
+  return std::min(D1::max_space_dimension(), D2::max_space_dimension());
+}
 
-  // If there are tokens available, work on a temporary copy.
-  if (tp != 0 && *tp > 0) {
-    BD_Shape<T> x_tmp(*this);
-    x_tmp.BHMZ05_widening_assign(y, 0);
-    // If the widening was not precise, use one of the available tokens.
-    if (!contains(x_tmp))
-      --(*tp);
-    return;
-  }
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(dimension_type num_dimensions,
+			    const Degenerate_Element kind)
+  : d1(num_dimensions, kind), d2(num_dimensions, kind) {
+  set_reduced_flag();
+}
 
-  // Here no token is available.
-  assert(marked_shortest_path_closed() && y.marked_shortest_path_closed());
-  // Minimize `y'.
-  y.shortest_path_reduction_assign();
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Congruence_System& ccgs)
+  : d1(ccgs), d2(ccgs) {
+  clear_reduced_flag();
+}
 
-  // Extrapolate unstable bounds, taking into account redundancy in `y'.
-  for (dimension_type i = space_dim + 1; i-- > 0; ) {
-    DB_Row<N>& dbm_i = dbm[i];
-    const DB_Row<N>& y_dbm_i = y.dbm[i];
-    const std::deque<bool>& y_redundancy_i = y.redundancy_dbm[i];
-    for (dimension_type j = space_dim + 1; j-- > 0; ) {
-      N& dbm_ij = dbm_i[j];
-      // Note: in the following line the use of `!=' (as opposed to
-      // the use of `<' that would seem -but is not- equivalent) is
-      // intentional.
-      if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
-	dbm_ij = PLUS_INFINITY;
-    }
-  }
-  // NOTE: this will also reset the shortest-path reduction flag,
-  // even though the dbm is still in reduced form. However, the
-  // current implementation invariant requires that any reduced dbm
-  // is closed too.
-  status.reset_shortest_path_closed();
-  assert(OK());
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Congruence_System& cgs)
+  : d1(const_cast<const Congruence_System&>(cgs)), d2(cgs) {
+  clear_reduced_flag();
 }
 
-template <typename T>
-void
-BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
-						 const Constraint_System& cs,
-						 unsigned* tp) {
-  // Dimension-compatibility check.
-  const dimension_type space_dim = space_dimension();
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
-				 y);
-  // `cs' must be dimension-compatible with the two systems
-  // of bounded differences.
-  const dimension_type cs_space_dim = cs.space_dimension();
-  if (space_dim < cs_space_dim)
-    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
-				  "(y, cs)");
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Constraint_System& ccs)
+  : d1(ccs), d2(ccs) {
+  clear_reduced_flag();
+}
 
-  // Strict inequalities are not allowed.
-  if (cs.has_strict_inequalities())
-    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
-				  "(y, cs)");
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Constraint_System& cs)
+  : d1(const_cast<const Constraint_System&>(cs)), d2(cs) {
+  clear_reduced_flag();
+}
 
-  // The limited BHMZ05-extrapolation between two systems of bounded
-  // differences in a zero-dimensional space is a system of bounded
-  // differences in a zero-dimensional space, too.
-  if (space_dim == 0)
-    return;
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' is contained in or equal to `*this'.
-    const BD_Shape x_copy = *this;
-    const BD_Shape y_copy = y;
-    assert(x_copy.contains(y_copy));
-  }
-#endif
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
 
-  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
-  if (marked_empty())
-    return;
-  // If `y' is empty, we return.
-  if (y.marked_empty())
-    return;
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Grid& gr, Complexity_Class)
+  : d1(gr), d2(gr) {
+  set_reduced_flag();
+}
 
-  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
-  get_limiting_shape(cs, limiting_shape);
-  BHMZ05_widening_assign(y, tp);
-  intersection_assign(limiting_shape);
-  assert(OK());
+template <typename D1, typename D2, typename R>
+template <typename Interval>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Box<Interval>& box, Complexity_Class)
+  : d1(box), d2(box) {
+  set_reduced_flag();
 }
 
-template <typename T>
-void
-BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
-  const dimension_type space_dim = space_dimension();
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const BD_Shape<U>& bd, Complexity_Class)
+  : d1(bd), d2(bd) {
+  set_reduced_flag();
+}
 
-  // Dimension-compatibility check.
-  if (space_dim != y.space_dimension())
-    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Octagonal_Shape<U>& os, Complexity_Class)
+  : d1(os), d2(os) {
+  set_reduced_flag();
+}
 
-#ifndef NDEBUG
-  {
-    // We assume that `*this' is contained in or equal to `y'.
-    const BD_Shape x_copy = *this;
-    const BD_Shape y_copy = y;
-    assert(y_copy.contains(x_copy));
-  }
-#endif
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class)
+  : d1(y.d1), d2(y.d2) {
+  reduced = y.reduced;
+}
 
-  // If both systems of bounded differences are zero-dimensional,
-  // since `y' contains `*this', we simply return `*this'.
-  if (space_dim == 0)
-    return;
+template <typename D1, typename D2, typename R>
+template <typename E1, typename E2, typename S>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity)
+  : d1(y.domain1(), complexity), d2(y.domain2(), complexity) {
+  /* Even if y is reduced, the built product may not be reduced as
+     the reduction method may have changed (i.e., S != R). */
+  clear_reduced_flag();
+}
 
-  y.shortest_path_closure_assign();
-  // If `y' is empty, since `y' contains `this', `*this' is empty too.
-  if (y.marked_empty())
-    return;
-  shortest_path_closure_assign();
-  // If `*this' is empty, we return.
-  if (marked_empty())
-    return;
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>::~Partially_Reduced_Product() {
+}
 
-  // Replace each constraint in `*this' by the corresponding constraint
-  // in `y' if the corresponding inhomogeneous terms are both finite.
-  bool changed = false;
-  for (dimension_type i = space_dim + 1; i-- > 0; ) {
-    DB_Row<N>& dbm_i = dbm[i];
-    const DB_Row<N>& y_dbm_i = y.dbm[i];
-    for (dimension_type j = space_dim + 1; j-- > 0; ) {
-      N& dbm_ij = dbm_i[j];
-      const N& y_dbm_ij = y_dbm_i[j];
-      if (!is_plus_infinity(dbm_ij)
-	  && !is_plus_infinity(y_dbm_ij)
-	  && dbm_ij != y_dbm_ij) {
-	dbm_ij = y_dbm_ij;
-	changed = true;
-      }
-    }
-  }
-  if (changed && marked_shortest_path_closed())
-    status.reset_shortest_path_closed();
-  assert(OK());
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::external_memory_in_bytes() const {
+  return d1.external_memory_in_bytes() + d2.external_memory_in_bytes();
 }
 
-template <typename T>
-void
-BD_Shape<T>
-::deduce_v_minus_u_bounds(const dimension_type v,
-			  const dimension_type last_v,
-			  const Linear_Expression& sc_expr,
-			  Coefficient_traits::const_reference sc_den,
-			  const N& pos_sum) {
-  // Deduce constraints of the form `v - u', where `u != v'.
-  // Note: the shortest-path closure is able to deduce the constraint
-  // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
-  // played an active role in the computation of the upper bound for `v',
-  // i.e., if the corresponding coefficient `q == expr_u/den' is
-  // greater than zero. In particular:
-  // if `q >= 1',    then `v - u <= ub_v - ub_u';
-  // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
-  mpq_class mpq_sc_den;
-  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
-  const DB_Row<N>& dbm_0 = dbm[0];
-  // No need to consider indices greater than `last_v'.
-  for (dimension_type u = last_v; u > 0; --u)
-    if (u != v) {
-      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
-      if (expr_u > 0)
-	if (expr_u >= sc_den)
-	  // Deducing `v - u <= ub_v - ub_u'.
-	  sub_assign_r(dbm[u][v], pos_sum, dbm_0[u], ROUND_UP);
-	else {
-	  DB_Row<N>& dbm_u = dbm[u];
-	  const N& dbm_u0 = dbm_u[0];
-	  if (!is_plus_infinity(dbm_u0)) {
-	    // Let `ub_u' and `lb_u' be the known upper and lower bound
-	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
-	    // rational coefficient of `u' in `sc_expr/sc_den',
-	    // the upper bound for `v - u' is computed as
-	    // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
-	    // `pos_sum + (-lb_u) - q * (ub_u + (-lb_u))'.
-	    mpq_class minus_lb_u;
-	    assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
-	    mpq_class q;
-	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
-	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
-	    mpq_class ub_u;
-	    assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED);
-	    // Compute `ub_u - lb_u'.
-	    add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
-	    // Compute `(-lb_u) - q * (ub_u - lb_u)'.
-	    sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
-	    N up_approx;
-	    assign_r(up_approx, minus_lb_u, ROUND_UP);
-	    // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
-	    add_assign_r(dbm_u[v], pos_sum, up_approx, ROUND_UP);
-	  }
-	}
-    }
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
 }
 
-template <typename T>
-void
-BD_Shape<T>
-::deduce_u_minus_v_bounds(const dimension_type v,
-			  const dimension_type last_v,
-			  const Linear_Expression& sc_expr,
-			  Coefficient_traits::const_reference sc_den,
-			  const N& neg_sum) {
-  // Deduce constraints of the form `u - v', where `u != v'.
-  // Note: the shortest-path closure is able to deduce the constraint
-  // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
-  // played an active role in the computation of the lower bound for `v',
-  // i.e., if the corresponding coefficient `q == expr_u/den' is
-  // greater than zero. In particular:
-  // if `q >= 1',    then `u - v <= lb_u - lb_v';
-  // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
-  mpq_class mpq_sc_den;
-  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
-  DB_Row<N>& dbm_0 = dbm[0];
-  DB_Row<N>& dbm_v = dbm[v];
-  // No need to consider indices greater than `last_v'.
-  for (dimension_type u = last_v; u > 0; --u)
-    if (u != v) {
-      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
-      if (expr_u > 0)
-	if (expr_u >= sc_den)
-	  // Deducing `u - v <= lb_u - lb_v',
-	  // i.e., `u - v <= (-lb_v) - (-lb_u)'.
-	  sub_assign_r(dbm_v[u], neg_sum, dbm[u][0], ROUND_UP);
-	else {
-	  const N& dbm_0u = dbm_0[u];
-	  if (!is_plus_infinity(dbm_0u)) {
-	    // Let `ub_u' and `lb_u' be the known upper and lower bound
-	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
-	    // rational coefficient of `u' in `sc_expr/sc_den',
-	    // the upper bound for `u - v' is computed as
-	    // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
-	    // `ub_u - q * (ub_u + (-lb_u)) + neg_sum'.
-	    mpq_class ub_u;
-	    assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
-	    mpq_class q;
-	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
-	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
-	    mpq_class minus_lb_u;
-	    assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED);
-	    // Compute `ub_u - lb_u'.
-	    add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
-	    // Compute `ub_u - q * (ub_u - lb_u)'.
-	    sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
-	    N up_approx;
-	    assign_r(up_approx, ub_u, ROUND_UP);
-	    // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
-	    add_assign_r(dbm_v[u], up_approx, neg_sum, ROUND_UP);
-	  }
-	}
-    }
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::space_dimension() const {
+  assert(d1.space_dimension() == d2.space_dimension());
+  return d1.space_dimension();
 }
 
-template <typename T>
-void
-BD_Shape<T>::affine_image(const Variable var,
-			  const Linear_Expression& expr,
-			  Coefficient_traits::const_reference denominator) {
-  using Implementation::BD_Shapes::div_round_up;
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::affine_dimension() const {
+  reduce();
+  const dimension_type d1_dim = d1.affine_dimension();
+  const dimension_type d2_dim = d2.affine_dimension();
+  return std::min(d1_dim, d2_dim);
+}
 
-  // The denominator cannot be zero.
-  if (denominator == 0)
-    throw_generic("affine_image(v, e, d)", "d == 0");
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variable var) {
+  reduce();
+  d1.unconstrain(var);
+  d2.unconstrain(var);
+}
 
-  // Dimension-compatibility checks.
-  // The dimension of `expr' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type space_dim = space_dimension();
-  const dimension_type expr_space_dim = expr.space_dimension();
-  if (space_dim < expr_space_dim)
-    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variables_Set& to_be_unconstrained) {
+  reduce();
+  d1.unconstrain(to_be_unconstrained);
+  d2.unconstrain(to_be_unconstrained);
+}
 
-  // `var' should be one of the dimensions of the shape.
-  const dimension_type v = var.id() + 1;
-  if (v > space_dim)
-    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::intersection_assign(const Partially_Reduced_Product& y) {
+  d1.intersection_assign(y.d1);
+  d2.intersection_assign(y.d2);
+  clear_reduced_flag();
+}
 
-  // The image of an empty BDS is empty too.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::difference_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.difference_assign(y.d1);
+  d2.difference_assign(y.d2);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
 
-  const Coefficient& b = expr.inhomogeneous_term();
-  // Number of non-zero coefficients in `expr': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t = 0;
-  // Index of the last non-zero coefficient in `expr', if any.
-  dimension_type w = 0;
-  // Get information about the number of non-zero coefficients in `expr'.
-  for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
-      if (t++ == 1)
-	break;
-      else
-	w = i+1;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.upper_bound_assign(y.d1);
+  d2.upper_bound_assign(y.d2);
+  // CHECKME: if upper_bound_assign is not a least_upper_bound
+  //          it may not be reduced.
+  // clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign_if_exact(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  D1 d1_copy = d1;
+  bool ub_exact = d1_copy.upper_bound_assign_if_exact(y.d1);
+  if (!ub_exact)
+    return false;
+  ub_exact = d2.upper_bound_assign_if_exact(y.d2);
+  if (!ub_exact)
+    return false;
+  std::swap(d1,d1_copy);
+  return true;
+}
 
-  // Now we know the form of `expr':
-  // - If t == 0, then expr == b, with `b' a constant;
-  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
-  //   variable; in this second case we have to check whether `a' is
-  //   equal to `denominator' or `-denominator', since otherwise we have
-  //   to fall back on the general form;
-  // - If t == 2, the `expr' is of the general form.
-  TEMP_INTEGER(minus_den);
-  neg_assign(minus_den, denominator);
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_image(Variable var,
+	       const Linear_Expression& expr,
+	       Coefficient_traits::const_reference denominator) {
+  d1.affine_image(var, expr, denominator);
+  d2.affine_image(var, expr, denominator);
+}
 
-  if (t == 0) {
-    // Case 1: expr == b.
-    // Remove all constraints on `var'.
-    forget_all_dbm_constraints(v);
-    // Shortest-path closure is preserved, but not reduction.
-    if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
-    // Add the constraint `var == b/denominator'.
-    add_dbm_constraint(0, v, b, denominator);
-    add_dbm_constraint(v, 0, b, minus_den);
-    assert(OK());
-    return;
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_preimage(Variable var,
+		  const Linear_Expression& expr,
+		  Coefficient_traits::const_reference denominator) {
+  d1.affine_preimage(var, expr, denominator);
+  d2.affine_preimage(var, expr, denominator);
+}
 
-  if (t == 1) {
-    // Value of the one and only non-zero coefficient in `expr'.
-    const Coefficient& a = expr.coefficient(Variable(w-1));
-    if (a == denominator || a == minus_den) {
-      // Case 2: expr == a*w + b, with a == +/- denominator.
-      if (w == v) {
-	// `expr' is of the form: a*v + b.
-	if (a == denominator) {
-	  if (b == 0)
-	    // The transformation is the identity function.
-	    return;
-	  else {
-	    // Translate all the constraints on `var',
-	    // adding or subtracting the value `b/denominator'.
-	    N d;
-	    div_round_up(d, b, denominator);
-	    N c;
-	    div_round_up(c, b, minus_den);
-	    DB_Row<N>& dbm_v = dbm[v];
-	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
-	      N& dbm_vi = dbm_v[i];
-	      add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
-	      N& dbm_iv = dbm[i][v];
-	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
-	    }
-	    // Both shortest-path closure and reduction are preserved.
-	  }
-	}
-	else {
-	  // Here `a == -denominator'.
-	  // Remove the binary constraints on `var'.
-	  forget_binary_dbm_constraints(v);
-	  // Swap the unary constraints on `var'.
-	  std::swap(dbm[v][0], dbm[0][v]);
-	  // Shortest-path closure is not preserved.
-	  status.reset_shortest_path_closed();
-	  if (b != 0) {
-	    // Translate the unary constraints on `var',
-	    // adding or subtracting the value `b/denominator'.
-	    N c;
-	    div_round_up(c, b, minus_den);
-	    N& dbm_v0 = dbm[v][0];
-	    add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
-	    N d;
-	    div_round_up(d, b, denominator);
-	    N& dbm_0v = dbm[0][v];
-	    add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
-	  }
-	}
-      }
-      else {
-	// Here `w != v', so that `expr' is of the form
-	// +/-denominator * w + b.
-	// Remove all constraints on `var'.
-	forget_all_dbm_constraints(v);
-	// Shortest-path closure is preserved, but not reduction.
-	if (marked_shortest_path_reduced())
-	  status.reset_shortest_path_reduced();
-	if (a == denominator) {
-	  // Add the new constraint `v - w == b/denominator'.
-	  add_dbm_constraint(w, v, b, denominator);
-	  add_dbm_constraint(v, w, b, minus_den);
-	}
-	else {
-	  // Here a == -denominator, so that we should be adding
-	  // the constraint `v + w == b/denominator'.
-	  // Approximate it by computing lower and upper bounds for `w'.
-	  const N& dbm_w0 = dbm[w][0];
-	  if (!is_plus_infinity(dbm_w0)) {
-	    // Add the constraint `v <= b/denominator - lower_w'.
-	    N d;
-	    div_round_up(d, b, denominator);
-	    add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
-	    status.reset_shortest_path_closed();
-	  }
-	  const N& dbm_0w = dbm[0][w];
-	  if (!is_plus_infinity(dbm_0w)) {
-	    // Add the constraint `v >= b/denominator - upper_w'.
-	    N c;
-	    div_round_up(c, b, minus_den);
-	    add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
-	    status.reset_shortest_path_closed();
-	  }
-	}
-      }
-      assert(OK());
-      return;
-    }
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(Variable var,
+			   const Relation_Symbol relsym,
+			   const Linear_Expression& expr,
+			   Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_image(var, relsym, expr, denominator);
+  d2.generalized_affine_image(var, relsym, expr, denominator);
+}
 
-  // General case.
-  // Either t == 2, so that
-  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
-  // or t == 1, expr == a*w + b, but a <> +/- denominator.
-  // We will remove all the constraints on `var' and add back
-  // constraints providing upper and lower bounds for `var'.
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(Variable var,
+			      const Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_preimage(var, relsym, expr, denominator);
+  d2.generalized_affine_preimage(var, relsym, expr, denominator);
+}
 
-  // Compute upper approximations for `expr' and `-expr'
-  // into `pos_sum' and `neg_sum', respectively, taking into account
-  // the sign of `denominator'.
-  // Note: approximating `-expr' from above and then negating the
-  // result is the same as approximating `expr' from below.
-  const bool is_sc = (denominator > 0);
-  TEMP_INTEGER(minus_b);
-  neg_assign(minus_b, b);
-  const Coefficient& sc_b = is_sc ? b : minus_b;
-  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
-  const Coefficient& sc_den = is_sc ? denominator : minus_den;
-  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
-  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
-  // when `denominator' is negative. Do not use it unless you are sure
-  // it has been correctly assigned.
-  Linear_Expression minus_expr;
-  if (!is_sc)
-    minus_expr = -expr;
-  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(const Linear_Expression& lhs,
+			   const Relation_Symbol relsym,
+			   const Linear_Expression& rhs) {
+  d1.generalized_affine_image(lhs, relsym, rhs);
+  d2.generalized_affine_image(lhs, relsym, rhs);
+}
 
-  N pos_sum;
-  N neg_sum;
-  // Indices of the variables that are unbounded in `this->dbm'.
-  // (The initializations are just to quiet a compiler warning.)
-  dimension_type pos_pinf_index = 0;
-  dimension_type neg_pinf_index = 0;
-  // Number of unbounded variables found.
-  dimension_type pos_pinf_count = 0;
-  dimension_type neg_pinf_count = 0;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  d1.generalized_affine_preimage(lhs, relsym, rhs);
+  d2.generalized_affine_preimage(lhs, relsym, rhs);
+}
 
-  // Approximate the inhomogeneous term.
-  assign_r(pos_sum, sc_b, ROUND_UP);
-  assign_r(neg_sum, minus_sc_b, ROUND_UP);
 
-  // Approximate the homogeneous part of `sc_expr'.
-  // Note: indices above `w' can be disregarded, as they all have
-  // a zero coefficient in `sc_expr'.
-  const DB_Row<N>& dbm_0 = dbm[0];
-  for (dimension_type i = w; i > 0; --i) {
-    const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-    const int sign_i = sgn(sc_i);
-    if (sign_i > 0) {
-      N coeff_i;
-      assign_r(coeff_i, sc_i, ROUND_UP);
-      // Approximating `sc_expr'.
-      if (pos_pinf_count <= 1) {
-	const N& up_approx_i = dbm_0[i];
-	if (!is_plus_infinity(up_approx_i))
-	  add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
-	else {
-	  ++pos_pinf_count;
-	  pos_pinf_index = i;
-	}
-      }
-      // Approximating `-sc_expr'.
-      if (neg_pinf_count <= 1) {
-	const N& up_approx_minus_i = dbm[i][0];
-	if (!is_plus_infinity(up_approx_minus_i))
-	  add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
-	else {
-	  ++neg_pinf_count;
-	  neg_pinf_index = i;
-	}
-      }
-    }
-    else if (sign_i < 0) {
-      TEMP_INTEGER(minus_sc_i);
-      neg_assign(minus_sc_i, sc_i);
-      N minus_coeff_i;
-      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
-      // Approximating `sc_expr'.
-      if (pos_pinf_count <= 1) {
-	const N& up_approx_minus_i = dbm[i][0];
-	if (!is_plus_infinity(up_approx_minus_i))
-	  add_mul_assign_r(pos_sum,
-			   minus_coeff_i, up_approx_minus_i, ROUND_UP);
-	else {
-	  ++pos_pinf_count;
-	  pos_pinf_index = i;
-	}
-      }
-      // Approximating `-sc_expr'.
-      if (neg_pinf_count <= 1) {
-	const N& up_approx_i = dbm_0[i];
-	if (!is_plus_infinity(up_approx_i))
-	  add_mul_assign_r(neg_sum, minus_coeff_i, up_approx_i, ROUND_UP);
-	else {
-	  ++neg_pinf_count;
-	  neg_pinf_index = i;
-	}
-      }
-    }
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::time_elapse_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  d1.time_elapse_assign(y.d1);
+  d2.time_elapse_assign(y.d2);
+  // FIXME: check this.
+  clear_reduced_flag();
+}
 
-  // Remove all constraints on 'v'.
-  forget_all_dbm_constraints(v);
-  // Shortest-path closure is maintained, but not reduction.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
-  // Return immediately if no approximation could be computed.
-  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
-    assert(OK());
-    return;
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::topological_closure_assign() {
+  d1.topological_closure_assign();
+  d2.topological_closure_assign();
+}
 
-  // In the following, shortest-path closure will be definitely lost.
-  status.reset_shortest_path_closed();
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::swap(Partially_Reduced_Product& y) {
+  std::swap(d1, y.d1);
+  std::swap(d2, y.d2);
+  std::swap(reduced, y.reduced);
+}
 
-  // Before computing quotients, the denominator should be approximated
-  // towards zero. Since `sc_den' is known to be positive, this amounts to
-  // rounding downwards, which is achieved as usual by rounding upwards
-  // `minus_sc_den' and negating again the result.
-  N down_sc_den;
-  assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-  neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_constraint(const Constraint& c) {
+  d1.add_constraint(c);
+  d2.add_constraint(c);
+  clear_reduced_flag();
+}
 
-  // Exploit the upper approximation, if possible.
-  if (pos_pinf_count <= 1) {
-    // Compute quotient (if needed).
-    if (down_sc_den != 1)
-      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
-    // Add the upper bound constraint, if meaningful.
-    if (pos_pinf_count == 0) {
-      // Add the constraint `v <= pos_sum'.
-      DB_Row<N>& dbm_0 = dbm[0];
-      assign_r(dbm_0[v], pos_sum, ROUND_UP);
-      // Deduce constraints of the form `v - u', where `u != v'.
-      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
-    }
-    else
-      // Here `pos_pinf_count == 1'.
-      if (pos_pinf_index != v
-	  && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
-	// Add the constraint `v - pos_pinf_index <= pos_sum'.
-	assign_r(dbm[pos_pinf_index][v], pos_sum, ROUND_UP);
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_constraint(const Constraint& c) {
+  d1.refine_with_constraint(c);
+  d2.refine_with_constraint(c);
+  clear_reduced_flag();
+}
 
-  // Exploit the lower approximation, if possible.
-  if (neg_pinf_count <= 1) {
-    // Compute quotient (if needed).
-    if (down_sc_den != 1)
-      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
-    // Add the lower bound constraint, if meaningful.
-    if (neg_pinf_count == 0) {
-      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
-      DB_Row<N>& dbm_v = dbm[v];
-      assign_r(dbm_v[0], neg_sum, ROUND_UP);
-      // Deduce constraints of the form `u - v', where `u != v'.
-      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
-    }
-    else
-      // Here `neg_pinf_count == 1'.
-      if (neg_pinf_index != v
-	  && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
-	// Add the constraint `v - neg_pinf_index >= -neg_sum',
-	// i.e., `neg_pinf_index - v <= neg_sum'.
-	assign_r(dbm[v][neg_pinf_index], neg_sum, ROUND_UP);
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_congruence(const Congruence& cg) {
+  d1.add_congruence(cg);
+  d2.add_congruence(cg);
+  clear_reduced_flag();
+}
 
-  assert(OK());
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_congruence(const Congruence& cg) {
+  d1.refine_with_congruence(cg);
+  d2.refine_with_congruence(cg);
+  clear_reduced_flag();
 }
 
-template <typename T>
-void
-BD_Shape<T>::affine_preimage(const Variable var,
-			     const Linear_Expression& expr,
-			     Coefficient_traits::const_reference denominator) {
-  // The denominator cannot be zero.
-  if (denominator == 0)
-    throw_generic("affine_preimage(v, e, d)", "d == 0");
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_constraints(const Constraint_System& cs) {
+  d1.add_constraints(cs);
+  d2.add_constraints(cs);
+  clear_reduced_flag();
+}
 
-  // Dimension-compatibility checks.
-  // The dimension of `expr' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type space_dim = space_dimension();
-  const dimension_type expr_space_dim = expr.space_dimension();
-  if (space_dim < expr_space_dim)
-    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_constraints(const Constraint_System& cs) {
+  d1.refine_with_constraints(cs);
+  d2.refine_with_constraints(cs);
+  clear_reduced_flag();
+}
 
-  // `var' should be one of the dimensions of
-  // the systems of bounded differences.
-  const dimension_type v = var.id() + 1;
-  if (v > space_dim)
-    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_congruences(const Congruence_System& cgs) {
+  d1.add_congruences(cgs);
+  d2.add_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_congruences(const Congruence_System& cgs) {
+  d1.refine_with_congruences(cgs);
+  d2.refine_with_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline Partially_Reduced_Product<D1, D2, R>&
+Partially_Reduced_Product<D1, D2, R>
+::operator=(const Partially_Reduced_Product& y) {
+  d1 = y.d1;
+  d2 = y.d2;
+  reduced = y.reduced;
+  return *this;
+}
 
-  // The image of an empty BDS is empty too.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return;
+template <typename D1, typename D2, typename R>
+inline const D1&
+Partially_Reduced_Product<D1, D2, R>::domain1() const {
+  reduce();
+  return d1;
+}
 
-  const Coefficient& b = expr.inhomogeneous_term();
-  // Number of non-zero coefficients in `expr': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t = 0;
-  // Index of the last non-zero coefficient in `expr', if any.
-  dimension_type j = 0;
-  // Get information about the number of non-zero coefficients in `expr'.
-  for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
-      if (t++ == 1)
-	break;
-      else
-        j = i;
+template <typename D1, typename D2, typename R>
+inline const D2&
+Partially_Reduced_Product<D1, D2, R>::domain2() const {
+  reduce();
+  return d2;
+}
 
-  // Now we know the form of `expr':
-  // - If t == 0, then expr = b, with `b' a constant;
-  // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
-  //   variable; in this second case we have to check whether `a' is
-  //   equal to `denominator' or `-denominator', since otherwise we have
-  //   to fall back on the general form;
-  // - If t > 1, the `expr' is of the general form.
-  if (t == 0) {
-    // Case 1: expr = n; remove all constraints on `var'.
-    forget_all_dbm_constraints(v);
-    // Shortest-path closure is preserved, but not reduction.
-    if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
-    assert(OK());
-    return;
-  }
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_empty() const {
+  reduce();
+  return d1.is_empty() || d2.is_empty();
+}
 
-  if (t == 1) {
-    // Value of the one and only non-zero coefficient in `expr'.
-    const Coefficient& a = expr.coefficient(Variable(j));
-    if (a == denominator || a == -denominator) {
-      // Case 2: expr = a*w + b, with a = +/- denominator.
-      if (j == var.id())
-	// Apply affine_image() on the inverse of this transformation.
-	affine_image(var, a*var - b, denominator);
-      else {
-	// `expr == a*w + b', where `w != v'.
-	// Remove all constraints on `var'.
-	forget_all_dbm_constraints(v);
-	// Shortest-path closure is preserved, but not reduction.
-	if (marked_shortest_path_reduced())
-	  status.reset_shortest_path_reduced();
-      }
-      assert(OK());
-      return;
-    }
-  }
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_universe() const {
+  return d1.is_universe() && d2.is_universe();
+}
 
-  // General case.
-  // Either t == 2, so that
-  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
-  // or t = 1, expr = a*w + b, but a <> +/- denominator.
-  const Coefficient& expr_v = expr.coefficient(var);
-  if (expr_v != 0) {
-    // The transformation is invertible.
-    Linear_Expression inverse((expr_v + denominator)*var);
-    inverse -= expr;
-    affine_image(var, inverse, expr_v);
-  }
-  else {
-    // Transformation not invertible: all constraints on `var' are lost.
-    forget_all_dbm_constraints(v);
-    // Shortest-path closure is preserved, but not reduction.
-    if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
-  }
-  assert(OK());
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_topologically_closed() const {
+  reduce();
+  return d1.is_topologically_closed() && d2.is_topologically_closed();
 }
 
-template <typename T>
-void
-BD_Shape<T>::generalized_affine_image(const Variable var,
-				      const Relation_Symbol relsym,
-				      const Linear_Expression& expr,
-				      Coefficient_traits::const_reference
-				      denominator) {
-  using Implementation::BD_Shapes::div_round_up;
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::is_disjoint_from(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.is_disjoint_from(y.d1) || d2.is_disjoint_from(y.d2);
+}
 
-  // The denominator cannot be zero.
-  if (denominator == 0)
-    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_discrete() const {
+  reduce();
+  return d1.is_discrete() || d2.is_discrete();
+}
 
-  // Dimension-compatibility checks.
-  // The dimension of `expr' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type space_dim = space_dimension();
-  const dimension_type expr_space_dim = expr.space_dimension();
-  if (space_dim < expr_space_dim)
-    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
-				 "e", expr);
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_bounded() const {
+  reduce();
+  return d1.is_bounded() || d2.is_bounded();
+}
 
-  // `var' should be one of the dimensions of the BDS.
-  const dimension_type v = var.id() + 1;
-  if (v > space_dim)
-    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
-				 var.id());
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_above(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_above(expr) || d2.bounds_from_above(expr);
+}
 
-  // The relation symbol cannot be a strict relation symbol.
-  if (relsym == LESS_THAN || relsym == GREATER_THAN)
-    throw_generic("generalized_affine_image(v, r, e, d)",
-  		  "r is a strict relation symbol and "
-  		  "*this is a BD_Shape");
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_below(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_below(expr) || d2.bounds_from_below(expr);
+}
 
-  if (relsym == EQUAL) {
-    // The relation symbol is "==":
-    // this is just an affine image computation.
-    affine_image(var, expr, denominator);
-    assert(OK());
-    return;
-  }
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::constrains(Variable var) const {
+  reduce();
+  return d1.constrains(var) || d2.constrains(var);
+}
 
-  // The image of an empty BDS is empty too.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::widening_assign(const Partially_Reduced_Product& y,
+                  unsigned* tp) {
+  // FIXME: In general this is _NOT_ a widening since the reduction
+  //        may mean that the sequence does not satisfy the ascending
+  //        chain condition.
+  //        However, for the direct, smash and constraints product
+  //        it may be ok - but this still needs checking.
+  reduce();
+  y.reduce();
+  d1.widening_assign(y.d1, tp);
+  d2.widening_assign(y.d2, tp);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_embed(dimension_type m) {
+  d1.add_space_dimensions_and_embed(m);
+  d2.add_space_dimensions_and_embed(m);
+}
 
-  const Coefficient& b = expr.inhomogeneous_term();
-  // Number of non-zero coefficients in `expr': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t = 0;
-  // Index of the last non-zero coefficient in `expr', if any.
-  dimension_type w = 0;
-  // Get information about the number of non-zero coefficients in `expr'.
-  for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
-      if (t++ == 1)
-	break;
-      else
-	w = i+1;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_project(dimension_type m) {
+  d1.add_space_dimensions_and_project(m);
+  d2.add_space_dimensions_and_project(m);
+}
 
-  // Now we know the form of `expr':
-  // - If t == 0, then expr == b, with `b' a constant;
-  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
-  //   variable; in this second case we have to check whether `a' is
-  //   equal to `denominator' or `-denominator', since otherwise we have
-  //   to fall back on the general form;
-  // - If t == 2, the `expr' is of the general form.
-  DB_Row<N>& dbm_0 = dbm[0];
-  DB_Row<N>& dbm_v = dbm[v];
-  TEMP_INTEGER(minus_den);
-  neg_assign(minus_den, denominator);
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::concatenate_assign(const Partially_Reduced_Product& y) {
+  d1.concatenate_assign(y.d1);
+  d2.concatenate_assign(y.d2);
+  if (!is_reduced() || !y.is_reduced())
+    clear_reduced_flag();
+}
 
-  if (t == 0) {
-    // Case 1: expr == b.
-    // Remove all constraints on `var'.
-    forget_all_dbm_constraints(v);
-    // Both shortest-path closure and reduction are lost.
-    status.reset_shortest_path_closed();
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      // Add the constraint `var <= b/denominator'.
-      add_dbm_constraint(0, v, b, denominator);
-      break;
-    case GREATER_THAN_OR_EQUAL:
-      // Add the constraint `var >= b/denominator',
-      // i.e., `-var <= -b/denominator',
-      add_dbm_constraint(v, 0, b, minus_den);
-      break;
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
-    }
-    assert(OK());
-    return;
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  d1.remove_space_dimensions(to_be_removed);
+  d2.remove_space_dimensions(to_be_removed);
+}
 
-  if (t == 1) {
-    // Value of the one and only non-zero coefficient in `expr'.
-    const Coefficient& a = expr.coefficient(Variable(w-1));
-    if (a == denominator || a == minus_den) {
-      // Case 2: expr == a*w + b, with a == +/- denominator.
-      N d;
-      switch (relsym) {
-      case LESS_THAN_OR_EQUAL:
-	div_round_up(d, b, denominator);
-	if (w == v) {
-	  // `expr' is of the form: a*v + b.
-	  // Shortest-path closure and reduction are not preserved.
-	  status.reset_shortest_path_closed();
-	  if (a == denominator) {
-	    // Translate each constraint `v - w <= dbm_wv'
-	    // into the constraint `v - w <= dbm_wv + b/denominator';
-	    // forget each constraint `w - v <= dbm_vw'.
-	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
-	      N& dbm_iv = dbm[i][v];
-	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
-	      dbm_v[i] = PLUS_INFINITY;
-	    }
-	  }
-	  else {
-	    // Here `a == -denominator'.
-	    // Translate the constraint `0 - v <= dbm_v0'
-	    // into the constraint `0 - v <= dbm_v0 + b/denominator'.
-	    N& dbm_v0 = dbm_v[0];
-	    add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
-	    // Forget all the other constraints on `v'.
-	    dbm_v0 = PLUS_INFINITY;
-	    forget_binary_dbm_constraints(v);
-	  }
-	}
-	else {
-	  // Here `w != v', so that `expr' is of the form
-	  // +/-denominator * w + b, with `w != v'.
-	  // Remove all constraints on `v'.
-	  forget_all_dbm_constraints(v);
-	  // Shortest-path closure is preserved, but not reduction.
-	  if (marked_shortest_path_reduced())
-	    status.reset_shortest_path_reduced();
-	  if (a == denominator)
-	    // Add the new constraint `v - w <= b/denominator'.
-	    add_dbm_constraint(w, v, d);
-	  else {
-	    // Here a == -denominator, so that we should be adding
-	    // the constraint `v <= b/denominator - w'.
-	    // Approximate it by computing a lower bound for `w'.
-	    const N& dbm_w0 = dbm[w][0];
-	    if (!is_plus_infinity(dbm_w0)) {
-	      // Add the constraint `v <= b/denominator - lb_w'.
-	      add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
-	      // Shortest-path closure is not preserved.
-	      status.reset_shortest_path_closed();
-	    }
-	  }
-	}
-	break;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  d1.remove_higher_space_dimensions(new_dimension);
+  d2.remove_higher_space_dimensions(new_dimension);
+}
 
-      case GREATER_THAN_OR_EQUAL:
-	div_round_up(d, b, minus_den);
-	if (w == v) {
-	  // `expr' is of the form: a*w + b.
-	  // Shortest-path closure and reduction are not preserved.
-	  status.reset_shortest_path_closed();
-	  if (a == denominator) {
-	    // Translate each constraint `w - v <= dbm_vw'
-	    // into the constraint `w - v <= dbm_vw - b/denominator';
-	    // forget each constraint `v - w <= dbm_wv'.
-	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
-	      N& dbm_vi = dbm_v[i];
-	      add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
-	      dbm[i][v] = PLUS_INFINITY;
-	    }
-	  }
-	  else {
-	    // Here `a == -denominator'.
-	    // Translate the constraint `0 - v <= dbm_v0'
-	    // into the constraint `0 - v <= dbm_0v - b/denominator'.
-	    N& dbm_0v = dbm_0[v];
-	    add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
-	    // Forget all the other constraints on `v'.
-	    dbm_0v = PLUS_INFINITY;
-	    forget_binary_dbm_constraints(v);
-	  }
-	}
-	else {
-	  // Here `w != v', so that `expr' is of the form
-	  // +/-denominator * w + b, with `w != v'.
-	  // Remove all constraints on `v'.
-	  forget_all_dbm_constraints(v);
-	  // Shortest-path closure is preserved, but not reduction.
-	  if (marked_shortest_path_reduced())
-	    status.reset_shortest_path_reduced();
-	  if (a == denominator)
-	    // Add the new constraint `v - w >= b/denominator',
-	    // i.e., `w - v <= -b/denominator'.
-	    add_dbm_constraint(v, w, d);
-	  else {
-	    // Here a == -denominator, so that we should be adding
-	    // the constraint `v >= -w + b/denominator',
-	    // i.e., `-v <= w - b/denominator'.
-	    // Approximate it by computing an upper bound for `w'.
-	    const N& dbm_0w = dbm_0[w];
-	    if (!is_plus_infinity(dbm_0w)) {
-	      // Add the constraint `-v <= ub_w - b/denominator'.
-	      add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
-	      // Shortest-path closure is not preserved.
-	      status.reset_shortest_path_closed();
-	    }
-	  }
-	}
-	break;
+template <typename D1, typename D2, typename R>
+template <typename Partial_Function>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::map_space_dimensions(const Partial_Function& pfunc) {
+  d1.map_space_dimensions(pfunc);
+  d2.map_space_dimensions(pfunc);
+}
 
-      default:
-	// We already dealt with the other cases.
-	throw std::runtime_error("PPL internal error");
-	break;
-      }
-      assert(OK());
-      return;
-    }
-  }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::expand_space_dimension(Variable var, dimension_type m) {
+  d1.expand_space_dimension(var, m);
+  d2.expand_space_dimension(var, m);
+}
 
-  // General case.
-  // Either t == 2, so that
-  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
-  // or t == 1, expr == a*w + b, but a <> +/- denominator.
-  // We will remove all the constraints on `v' and add back
-  // a constraint providing an upper or a lower bound for `v'
-  // (depending on `relsym').
-  const bool is_sc = (denominator > 0);
-  TEMP_INTEGER(minus_b);
-  neg_assign(minus_b, b);
-  const Coefficient& sc_b = is_sc ? b : minus_b;
-  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
-  const Coefficient& sc_den = is_sc ? denominator : minus_den;
-  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
-  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
-  // when `denominator' is negative. Do not use it unless you are sure
-  // it has been correctly assigned.
-  Linear_Expression minus_expr;
-  if (!is_sc)
-    minus_expr = -expr;
-  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::fold_space_dimensions(const Variables_Set& to_be_folded,
+			Variable var) {
+  d1.fold_space_dimensions(to_be_folded, var);
+  d2.fold_space_dimensions(to_be_folded, var);
+}
 
-  N sum;
-  // Index of variable that is unbounded in `this->dbm'.
-  // (The initialization is just to quiet a compiler warning.)
-  dimension_type pinf_index = 0;
-  // Number of unbounded variables found.
-  dimension_type pinf_count = 0;
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.contains(y.d1) && d2.contains(y.d2);
+}
 
-  switch (relsym) {
-  case LESS_THAN_OR_EQUAL:
-    // Compute an upper approximation for `sc_expr' into `sum'.
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::strictly_contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return (d1.contains(y.d1) && d2.strictly_contains(y.d2))
+    || (d2.contains(y.d2) && d1.strictly_contains(y.d1));
+}
 
-    // Approximate the inhomogeneous term.
-    assign_r(sum, sc_b, ROUND_UP);
-    // Approximate the homogeneous part of `sc_expr'.
-    // Note: indices above `w' can be disregarded, as they all have
-    // a zero coefficient in `sc_expr'.
-    for (dimension_type i = w; i > 0; --i) {
-      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-      const int sign_i = sgn(sc_i);
-      if (sign_i == 0)
-	continue;
-      // Choose carefully: we are approximating `sc_expr'.
-      const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
-      if (is_plus_infinity(approx_i)) {
-	if (++pinf_count > 1)
-	  break;
-	pinf_index = i;
-	continue;
-      }
-      N coeff_i;
-      if (sign_i > 0)
-	assign_r(coeff_i, sc_i, ROUND_UP);
-      else {
-	TEMP_INTEGER(minus_sc_i);
-	neg_assign(minus_sc_i, sc_i);
-	assign_r(coeff_i, minus_sc_i, ROUND_UP);
-      }
-      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
-    }
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::reduce() const {
+  Partially_Reduced_Product& dp
+    = const_cast<Partially_Reduced_Product&>(*this);
+  if (dp.is_reduced())
+    return false;
+  R r;
+  r.product_reduce(dp.d1, dp.d2);
+  set_reduced_flag();
+  return true;
+}
 
-    // Remove all constraints on `v'.
-    forget_all_dbm_constraints(v);
-    // Shortest-path closure is preserved, but not reduction.
-    if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
-    // Return immediately if no approximation could be computed.
-    if (pinf_count > 1) {
-      assert(OK());
-      return;
-    }
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_reduced() const {
+  return reduced;
+}
 
-    // Divide by the (sign corrected) denominator (if needed).
-    if (sc_den != 1) {
-      // Before computing the quotient, the denominator should be approximated
-      // towards zero. Since `sc_den' is known to be positive, this amounts to
-      // rounding downwards, which is achieved as usual by rounding upwards
-      // `minus_sc_den' and negating again the result.
-      N down_sc_den;
-      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
-      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
-    }
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::clear_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = false;
+}
 
-    if (pinf_count == 0) {
-      // Add the constraint `v <= sum'.
-      add_dbm_constraint(0, v, sum);
-      // Deduce constraints of the form `v - u', where `u != v'.
-      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
-    }
-    else if (pinf_count == 1)
-      if (pinf_index != v
-	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
-	// Add the constraint `v - pinf_index <= sum'.
-	add_dbm_constraint(pinf_index, v, sum);
-    break;
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::set_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = true;
+}
 
-  case GREATER_THAN_OR_EQUAL:
-    // Compute an upper approximation for `-sc_expr' into `sum'.
-    // Note: approximating `-sc_expr' from above and then negating the
-    // result is the same as approximating `sc_expr' from below.
+// FIXME: Improve this name.
+PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product)
 
-    // Approximate the inhomogeneous term.
-    assign_r(sum, minus_sc_b, ROUND_UP);
-    // Approximate the homogeneous part of `-sc_expr'.
-    for (dimension_type i = expr_space_dim + 1; i > 0; --i) {
-      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-      const int sign_i = sgn(sc_i);
-      if (sign_i == 0)
-	continue;
-      // Choose carefully: we are approximating `-sc_expr'.
-      const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
-      if (is_plus_infinity(approx_i)) {
-	if (++pinf_count > 1)
-	  break;
-	pinf_index = i;
-	continue;
-      }
-      N coeff_i;
-      if (sign_i > 0)
-	assign_r(coeff_i, sc_i, ROUND_UP);
-      else {
-	TEMP_INTEGER(minus_sc_i);
-	neg_assign(minus_sc_i, sc_i);
-	assign_r(coeff_i, minus_sc_i, ROUND_UP);
-      }
-      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
-    }
+  template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const {
+  s << "Domain 1:\n";
+  d1.ascii_dump(s);
+  s << "Domain 2:\n";
+  d2.ascii_dump(s);
+}
 
-    // Remove all constraints on `var'.
-    forget_all_dbm_constraints(v);
-    // Shortest-path closure is preserved, but not reduction.
-    if (marked_shortest_path_reduced())
-      status.reset_shortest_path_reduced();
-    // Return immediately if no approximation could be computed.
-    if (pinf_count > 1) {
-      assert(OK());
-      return;
-    }
+template <typename D1, typename D2, typename R>
+inline int32_t
+Partially_Reduced_Product<D1, D2, R>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
 
-    // Divide by the (sign corrected) denominator (if needed).
-    if (sc_den != 1) {
-      // Before computing the quotient, the denominator should be approximated
-      // towards zero. Since `sc_den' is known to be positive, this amounts to
-      // rounding downwards, which is achieved as usual by rounding upwards
-      // `minus_sc_den' and negating again the result.
-      N down_sc_den;
-      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
-      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
-    }
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+	   const Partially_Reduced_Product<D1, D2, R>& y) {
+  x.reduce();
+  y.reduce();
+  return x.d1 == y.d1 && x.d2 == y.d2;
+}
 
-    if (pinf_count == 0) {
-      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
-      add_dbm_constraint(v, 0, sum);
-      // Deduce constraints of the form `u - v', where `u != v'.
-      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum);
-    }
-    else if (pinf_count == 1)
-      if (pinf_index != v
-	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
-	// Add the constraint `v - pinf_index >= -sum',
-	// i.e., `pinf_index - v <= sum'.
-	add_dbm_constraint(v, pinf_index, sum);
-    break;
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+	   const Partially_Reduced_Product<D1, D2, R>& y) {
+  return !(x == y);
+}
 
-  default:
-    // We already dealt with the other cases.
-    throw std::runtime_error("PPL internal error");
-    break;
-  }
-  assert(OK());
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& pd) {
+  return s << "Domain 1:\n"
+	   << pd.d1
+	   << "Domain 2:\n"
+	   << pd.d2;
 }
 
-template <typename T>
-void
-BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
-				      const Relation_Symbol relsym,
-				      const Linear_Expression& rhs) {
-  // Dimension-compatibility checks.
-  // The dimension of `lhs' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type space_dim = space_dimension();
-  const dimension_type lhs_space_dim = lhs.space_dimension();
-  if (space_dim < lhs_space_dim)
-    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
-				 "e1", lhs);
+} // namespace Parma_Polyhedra_Library
 
-  // The dimension of `rhs' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type rhs_space_dim = rhs.space_dimension();
-  if (space_dim < rhs_space_dim)
-    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
-				 "e2", rhs);
+namespace Parma_Polyhedra_Library {
 
-  // Strict relation symbols are not admitted for BDSs.
-  if (relsym == LESS_THAN || relsym == GREATER_THAN)
-    throw_generic("generalized_affine_image(e1, r, e2)",
-		  "r is a strict relation symbol and "
-		  "*this is a BD_Shape");
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::No_Reduction() {
+}
 
-  // The image of an empty BDS is empty.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return;
+template <typename D1, typename D2>
+void No_Reduction<D1, D2>::product_reduce(D1&, D2&) {
+}
 
-  // Number of non-zero coefficients in `lhs': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t_lhs = 0;
-  // Index of the last non-zero coefficient in `lhs', if any.
-  dimension_type j_lhs = 0;
-  // Compute the number of the non-zero components of `lhs'.
-  for (dimension_type i = lhs_space_dim; i-- > 0; )
-    if (lhs.coefficient(Variable(i)) != 0)
-      if (t_lhs++ == 1)
-	break;
-      else
-	j_lhs = i;
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::~No_Reduction() {
+}
 
-  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::Constraints_Reduction() {
+}
 
-  if (t_lhs == 0) {
-    // `lhs' is a constant.
-    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
-    // Note that this constraint is a bounded difference if `t_rhs <= 1'
-    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
-    // more general form, it will be simply ignored.
-    // TODO: if it is not a bounded difference, should we compute
-    // approximations for this constraint?
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      add_constraint(lhs <= rhs);
-      break;
-    case EQUAL:
-      add_constraint(lhs == rhs);
-      break;
-    case GREATER_THAN_OR_EQUAL:
-      add_constraint(lhs >= rhs);
-      break;
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
+template <typename D1, typename D2>
+void Constraints_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d2.is_empty()) {
+    if (!d1.is_empty()) {
+      D1 new_d1(d1.space_dimension(), EMPTY);
+      std::swap(d1, new_d1);
     }
   }
-  else if (t_lhs == 1) {
-    // Here `lhs == a_lhs * v + b_lhs'.
-    // Independently from the form of `rhs', we can exploit the
-    // method computing generalized affine images for a single variable.
-    Variable v(j_lhs);
-    // Compute a sign-corrected relation symbol.
-    const Coefficient& den = lhs.coefficient(v);
-    Relation_Symbol new_relsym = relsym;
-    if (den < 0)
-      if (relsym == LESS_THAN_OR_EQUAL)
-	new_relsym = GREATER_THAN_OR_EQUAL;
-      else if (relsym == GREATER_THAN_OR_EQUAL)
-	new_relsym = LESS_THAN_OR_EQUAL;
-    Linear_Expression expr = rhs - b_lhs;
-    generalized_affine_image(v, new_relsym, expr, den);
+  else if (d1.is_empty()) {
+    D2 new_d2(d2.space_dimension(), EMPTY);
+    std::swap(d2, new_d2);
   }
   else {
-    // Here `lhs' is of the general form, having at least two variables.
-    // Compute the set of variables occurring in `lhs'.
-    bool lhs_vars_intersects_rhs_vars = false;
-    std::vector<Variable> lhs_vars;
-    for (dimension_type i = lhs_space_dim; i-- > 0; )
-      if (lhs.coefficient(Variable(i)) != 0) {
-	lhs_vars.push_back(Variable(i));
-	if (rhs.coefficient(Variable(i)) != 0)
-	  lhs_vars_intersects_rhs_vars = true;
-      }
-
-    if (!lhs_vars_intersects_rhs_vars) {
-      // `lhs' and `rhs' variables are disjoint.
-      // Cylindrificate on all variables in the lhs.
-      for (dimension_type i = lhs_vars.size(); i-- > 0; )
-	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
-      // Constrain the left hand side expression so that it is related to
-      // the right hand side expression as dictated by `relsym'.
-      // TODO: if the following constraint is NOT a bounded difference,
-      // it will be simply ignored. Should we compute approximations for it?
-      switch (relsym) {
-      case LESS_THAN_OR_EQUAL:
-	add_constraint(lhs <= rhs);
-	break;
-      case EQUAL:
-	add_constraint(lhs == rhs);
-	break;
-      case GREATER_THAN_OR_EQUAL:
-	add_constraint(lhs >= rhs);
-	break;
-      default:
-	// We already dealt with the other cases.
-	throw std::runtime_error("PPL internal error");
-	break;
-      }
-    }
-    else {
-      // Some variables in `lhs' also occur in `rhs'.
+    d1.add_constraints(d2.minimized_constraints());
+    d2.add_constraints(d1.minimized_constraints());
+  }
+}
 
-#if 1 // Simplified computation (see the TODO note below).
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::~Constraints_Reduction() {
+}
 
-      for (dimension_type i = lhs_vars.size(); i-- > 0; )
-	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+} // namespace Parma_Polyhedra_Library
 
-#else // Currently unnecessarily complex computation.
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline void
+std::swap(Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& x,
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& y) {
+  x.swap(y);
+}
 
-      // More accurate computation that is worth doing only if
-      // the following TODO note is accurately dealt with.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.defs.hh line 1534
 
-      // To ease the computation, we add an additional dimension.
-      const Variable new_var = Variable(space_dim);
-      add_space_dimensions_and_embed(1);
-      // Constrain the new dimension to be equal to `rhs'.
-      // NOTE: calling affine_image() instead of add_constraint()
-      // ensures some approximation is tried even when the constraint
-      // is not a bounded difference.
-      affine_image(new_var, rhs);
-      // Cylindrificate on all variables in the lhs.
-      // NOTE: enforce shortest-path closure for precision.
-      shortest_path_closure_assign();
-      assert(!marked_empty());
-      for (dimension_type i = lhs_vars.size(); i-- > 0; )
-	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
-      // Constrain the new dimension so that it is related to
-      // the left hand side as dictated by `relsym'.
-      // TODO: each one of the following constraints is definitely NOT
-      // a bounded differences (since it has 3 variables at least).
-      // Thus, the method add_constraint() will simply ignore it.
-      // Should we compute approximations for this constraint?
-      switch (relsym) {
-      case LESS_THAN_OR_EQUAL:
-	add_constraint(lhs <= new_var);
-	break;
-      case EQUAL:
-	add_constraint(lhs == new_var);
-	break;
-      case GREATER_THAN_OR_EQUAL:
-	add_constraint(lhs >= new_var);
-	break;
-      default:
-	// We already dealt with the other cases.
-	throw std::runtime_error("PPL internal error");
-	break;
-      }
-      // Remove the temporarily added dimension.
-      remove_higher_space_dimensions(space_dim-1);
-#endif // Currently unnecessarily complex computation.
-    }
-  }
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.defs.hh line 43
+#include <iosfwd>
+#include <list>
+#include <map>
 
-  assert(OK());
-}
+//! The powerset construction instantiated on PPL polyhedra.
+/*! \ingroup PPL_CXX_interface */
+/*!
+  \warning
+  At present, the supported instantiations for the
+  disjunct domain template \p PS are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape<T></CODE>,
+  <CODE>BD_Shape<T></CODE>,
+  <CODE>Box<T></CODE>.
+*/
+template <typename PS>
+class Parma_Polyhedra_Library::Pointset_Powerset
+  : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PS> > {
+public:
+  typedef PS element_type;
 
-template <typename T>
-void
-BD_Shape<T>::generalized_affine_preimage(const Variable var,
-					 const Relation_Symbol relsym,
-					 const Linear_Expression& expr,
-					 Coefficient_traits::const_reference
-					 denominator) {
-  using Implementation::BD_Shapes::div_round_up;
+private:
+  typedef Determinate<PS> CS;
+  typedef Powerset<CS> Base;
 
-  // The denominator cannot be zero.
-  if (denominator == 0)
-    throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
+public:
+  //! Returns the maximum space dimension a Pointset_Powerset<PS> can handle.
+  static dimension_type max_space_dimension();
 
-  // Dimension-compatibility checks.
-  // The dimension of `expr' should not be greater than the dimension
-  // of `*this'.
-  const dimension_type space_dim = space_dimension();
-  const dimension_type expr_space_dim = expr.space_dimension();
-  if (space_dim < expr_space_dim)
-    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
-				 "e", expr);
+  //! \name Constructors
+  //@{
 
-  // `var' should be one of the dimensions of the BDS.
-  const dimension_type v = var.id() + 1;
-  if (v > space_dim)
-    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
-				 var.id());
+  //! Builds a universe (top) or empty (bottom) Pointset_Powerset.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the powerset;
 
-  // The relation symbol cannot be a strict relation symbol.
-  if (relsym == LESS_THAN || relsym == GREATER_THAN)
-    throw_generic("generalized_affine_preimage(v, r, e, d)",
-  		  "r is a strict relation symbol and "
-  		  "*this is a BD_Shape");
+    \param kind
+    Specifies whether the universe or the empty powerset has to be built.
+  */
+  explicit
+  Pointset_Powerset(dimension_type num_dimensions = 0,
+		    Degenerate_Element kind = UNIVERSE);
 
-  if (relsym == EQUAL) {
-    // The relation symbol is "==":
-    // this is just an affine preimage computation.
-    affine_preimage(var, expr, denominator);
-    assert(OK());
-    return;
-  }
+  //! Ordinary copy-constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Pointset_Powerset(const Pointset_Powerset& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
 
-  // The image of an empty BDS is empty too.
-  shortest_path_closure_assign();
-  if (marked_empty())
-    return;
+  /*! \brief
+    Conversion constructor: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PS</CODE>.
 
-  // Check whether the preimage of this affine relation can be easily
-  // computed as the image of its inverse relation.
-  const Coefficient& expr_v = expr.coefficient(var);
-  if (expr_v != 0) {
-    const Relation_Symbol reversed_relsym = (relsym == LESS_THAN_OR_EQUAL)
-      ? GREATER_THAN_OR_EQUAL : LESS_THAN_OR_EQUAL;
-    const Linear_Expression inverse
-      = expr - (expr_v + denominator)*var;
-    TEMP_INTEGER(inverse_den);
-    neg_assign(inverse_den, expr_v);
-    const Relation_Symbol inverse_relsym
-      = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
-    generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
-    return;
-  }
+    \param y
+    The powerset to be used to build the new powerset.
 
-  // Here `var_coefficient == 0', so that the preimage cannot
-  // be easily computed by inverting the affine relation.
-  // Shrink the BD shape by adding the constraint induced
-  // by the affine relation.
-  const Coefficient& b = expr.inhomogeneous_term();
-  // Number of non-zero coefficients in `expr': will be set to
-  // 0, 1, or 2, the latter value meaning any value greater than 1.
-  dimension_type t = 0;
-  // Index of the last non-zero coefficient in `expr', if any.
-  dimension_type j = 0;
-  // Get information about the number of non-zero coefficients in `expr'.
-  for (dimension_type i = expr_space_dim; i-- > 0; )
-    if (expr.coefficient(Variable(i)) != 0)
-      if (t++ == 1)
-	break;
-      else
-	j = i+1;
+    \param complexity
+    The maximal complexity of any algorithms used.
+  */
+  template <typename QH>
+  explicit Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-  // Now we know the form of `expr':
-  // - If t == 0, then expr == b, with `b' a constant;
-  // - If t == 1, then expr == a*j + b, where `j != v';
-  // - If t == 2, the `expr' is of the general form.
-  DB_Row<N>& dbm_0 = dbm[0];
+  /*! \brief
+    Creates a Pointset_Powerset from a product
+    This will be craeted as a single disjunct of type PS that
+    approximates the product.
+  */
+   template <typename QH1, typename QH2, typename R>
+   explicit
+     Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                       Complexity_Class complexity = ANY_COMPLEXITY);
 
-  if (t == 0) {
-    // Case 1: expr == b.
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      // Add the constraint `var <= b/denominator'.
-      add_dbm_constraint(0, v, b, denominator);
-      break;
-    case GREATER_THAN_OR_EQUAL:
-      // Add the constraint `var >= b/denominator',
-      // i.e., `-var <= -b/denominator',
-      add_dbm_constraint(v, 0, -b, denominator);
-      break;
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
-    }
-  }
-  else if (t == 1) {
-    // Value of the one and only non-zero coefficient in `expr'.
-    const Coefficient& expr_j = expr.coefficient(Variable(j-1));
-    N d;
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      div_round_up(d, b, denominator);
-      // Note that: `j != v', so that `expr' is of the form
-      // expr_j * j + b, with `j != v'.
-      if (expr_j == denominator)
-	// Add the new constraint `v - j <= b/denominator'.
-	add_dbm_constraint(j, v, d);
-      else {
-	// Here expr_j != denominator, so that we should be adding
-	// the constraint `v <= b/denominator - j'.
-	N sum;
-	// Approximate the homogeneous part of `expr'.
-	const int sign_j = sgn(expr_j);
-	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
-	if (!is_plus_infinity(approx_j)) {
-	  N coeff_j;
-	  if (sign_j > 0)
-	    assign_r(coeff_j, expr_j, ROUND_UP);
-	  else {
-	    TEMP_INTEGER(minus_expr_j);
-	    neg_assign(minus_expr_j, expr_j);
-	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
-	  }
-	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
-	  add_dbm_constraint(0, v, sum);
-	}
-      }
-      break;
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of constraints \p cs.
+  */
+  explicit Pointset_Powerset(const Constraint_System& cs);
 
-    case GREATER_THAN_OR_EQUAL:
-      div_round_up(d, -b, denominator);
-      // Note that: `j != v', so that `expr' is of the form
-      // expr_j * j + b, with `j != v'.
-      if (expr_j == denominator)
-	// Add the new constraint `v - j >= b/denominator'.
-	add_dbm_constraint(j, v, d);
-      else {
-	// Here expr_j != denominator, so that we should be adding
-	// the constraint `v <= b/denominator - j'.
-	N sum;
-	// Approximate the homogeneous part of `expr_j'.
-	const int sign_j = sgn(expr_j);
-	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
-	if (!is_plus_infinity(approx_j)) {
-	  N coeff_j;
-	  if (sign_j > 0)
-	    assign_r(coeff_j, expr_j, ROUND_UP);
-	  else {
-	    TEMP_INTEGER(minus_expr_j);
-	    neg_assign(minus_expr_j, expr_j);
-	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
-	  }
-	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
-	  add_dbm_constraint(0, v, sum);
-	}
-      }
-      break;
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of congruences \p cgs.
+  */
+  explicit Pointset_Powerset(const Congruence_System& cgs);
 
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
-    }
-  }
-  else {
-    // Here t == 2, so that
-    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
-    const bool is_sc = (denominator > 0);
-    TEMP_INTEGER(minus_b);
-    neg_assign(minus_b, b);
-    const Coefficient& sc_b = is_sc ? b : minus_b;
-    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
-    TEMP_INTEGER(minus_den);
-    neg_assign(minus_den, denominator);
-    const Coefficient& sc_den = is_sc ? denominator : minus_den;
-    const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
-    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
-    // when `denominator' is negative. Do not use it unless you are sure
-    // it has been correctly assigned.
-    Linear_Expression minus_expr;
-    if (!is_sc)
-      minus_expr = -expr;
-    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
 
-    N sum;
-    // Index of variable that is unbounded in `this->dbm'.
-    // (The initialization is just to quiet a compiler warning.)
-    dimension_type pinf_index = 0;
-    // Number of unbounded variables found.
-    dimension_type pinf_count = 0;
+  //! Builds a pointset_powerset out of a closed polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
 
-    switch (relsym) {
-    case LESS_THAN_OR_EQUAL:
-      // Compute an upper approximation for `expr' into `sum',
-      // taking into account the sign of `denominator'.
+    \param ph
+    The closed polyhedron to be used to build the powerset.
 
-      // Approximate the inhomogeneous term.
-      assign_r(sum, sc_b, ROUND_UP);
+    \param complexity
+    The maximal complexity of any algorithms used.
 
-      // Approximate the homogeneous part of `sc_expr'.
-      // Note: indices above `w' can be disregarded, as they all have
-      // a zero coefficient in `expr'.
-      for (dimension_type i = j; i > 0; --i) {
-	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-	const int sign_i = sgn(sc_i);
-	if (sign_i == 0)
-	  continue;
-	// Choose carefully: we are approximating `sc_expr'.
-	const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
-	if (is_plus_infinity(approx_i)) {
-	  if (++pinf_count > 1)
-	    break;
-	  pinf_index = i;
-	  continue;
-	}
-	N coeff_i;
-	if (sign_i > 0)
-	  assign_r(coeff_i, sc_i, ROUND_UP);
-	else {
-	  TEMP_INTEGER(minus_sc_i);
-	  neg_assign(minus_sc_i, sc_i);
-	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
-	}
-	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
-      }
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const C_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-      // Divide by the (sign corrected) denominator (if needed).
-      if (sc_den != 1) {
-	// Before computing the quotient, the denominator should be
-	// approximated towards zero. Since `sc_den' is known to be
-	// positive, this amounts to rounding downwards, which is achieved
-	// by rounding upwards `minus_sc-den' and negating again the result.
-	N down_sc_den;
-	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
-	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
-      }
+  //! Builds a pointset_powerset out of an nnc polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
 
-      if (pinf_count == 0) {
-	// Add the constraint `v <= sum'.
-	add_dbm_constraint(0, v, sum);
-	// Deduce constraints of the form `v - u', where `u != v'.
-	deduce_v_minus_u_bounds(v, j, sc_expr, sc_den, sum);
-      }
-      else if (pinf_count == 1)
-	if (expr.coefficient(Variable(pinf_index-1)) == denominator)
-	  // Add the constraint `v - pinf_index <= sum'.
-	  add_dbm_constraint(pinf_index, v, sum);
-      break;
+    \param ph
+    The closed polyhedron to be used to build the powerset.
 
-    case GREATER_THAN_OR_EQUAL:
-      // Compute an upper approximation for `-sc_expr' into `sum'.
-      // Note: approximating `-sc_expr' from above and then negating the
-      // result is the same as approximating `sc_expr' from below.
+    \param complexity
+    The maximal complexity of any algorithms used.
 
-      // Approximate the inhomogeneous term.
-      assign_r(sum, minus_sc_b, ROUND_UP);
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const NNC_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-      // Approximate the homogeneous part of `-sc_expr'.
-      for (dimension_type i = j; i > 0; --i) {
-	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
-	const int sign_i = sgn(sc_i);
-	if (sign_i == 0)
-	  continue;
-	// Choose carefully: we are approximating `-sc_expr'.
-	const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
-	if (is_plus_infinity(approx_i)) {
-	  if (++pinf_count > 1)
-	    break;
-	  pinf_index = i;
-	  continue;
-	}
-	N coeff_i;
-	if (sign_i > 0)
-	  assign_r(coeff_i, sc_i, ROUND_UP);
-	else {
-	  TEMP_INTEGER(minus_sc_i);
-	  neg_assign(minus_sc_i, sc_i);
-	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
-	}
-	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
-      }
 
-      // Divide by the (sign corrected) denominator (if needed).
-      if (sc_den != 1) {
-	// Before computing the quotient, the denominator should be
-	// approximated towards zero. Since `sc_den' is known to be positive,
-	// this amounts to rounding downwards, which is achieved by rounding
-	// upwards `minus_sc_den' and negating again the result.
-	N down_sc_den;
-	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
-	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
-	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
-      }
+  //! Builds a pointset_powerset out of a grid.
+  /*!
+    If the grid is nonempty, builds a powerset containing a single
+    disjunct approximating the grid. Builds the empty powerset
+    otherwise. The powerset inherits the space dimension of the grid.
 
-      if (pinf_count == 0) {
-	// Add the constraint `v >= -sum', i.e., `-v <= sum'.
-	add_dbm_constraint(v, 0, sum);
-	// Deduce constraints of the form `u - v', where `u != v'.
-	deduce_u_minus_v_bounds(v, j, sc_expr, sc_den, sum);
-      }
-      else if (pinf_count == 1)
-	if (pinf_index != v
-	    && expr.coefficient(Variable(pinf_index-1)) == denominator)
-	  // Add the constraint `v - pinf_index >= -sum',
-	  // i.e., `pinf_index - v <= sum'.
-	  add_dbm_constraint(v, pinf_index, sum);
-      break;
+    \param gr
+    The grid to be used to build the powerset.
 
-    default:
-      // We already dealt with the other cases.
-      throw std::runtime_error("PPL internal error");
-      break;
-    }
-  }
+    \param complexity
+    This argument is ignored.
 
-  // If the shrunk BD_Shape is empty, its preimage is empty too.
-  if (is_empty())
-    return;
-  forget_all_dbm_constraints(v);
-  // Shortest-path closure is preserved, but not reduction.
-  if (marked_shortest_path_reduced())
-    status.reset_shortest_path_reduced();
-  assert(OK());
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const Grid& gr,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-Constraint_System
-BD_Shape<T>::constraints() const {
-  using Implementation::BD_Shapes::numer_denom;
+  //! Builds a pointset_powerset out of an octagonal shape.
+  /*!
+    If the octagonal shape is nonempty, builds a powerset
+    containing a single disjunct approximating the octagonal
+    shape. Builds the empty powerset otherwise. The powerset
+    inherits the space dimension of the octagonal shape.
 
-  Constraint_System cs;
-  const dimension_type space_dim = space_dimension();
-  if (space_dim == 0) {
-    if (marked_empty())
-      cs = Constraint_System::zero_dim_empty();
-  }
-  else if (marked_empty())
-    cs.insert(0*Variable(space_dim-1) <= -1);
-  else if (marked_shortest_path_reduced())
-    // Disregard redundant constraints.
-    cs = minimized_constraints();
-  else {
-    // KLUDGE: in the future `cs' will be constructed of the right dimension.
-    // For the time being, we force the dimension with the following line.
-    cs.insert(0*Variable(space_dim-1) <= 0);
+    \param os
+    The octagonal shape to be used to build the powerset.
 
-    TEMP_INTEGER(a);
-    TEMP_INTEGER(b);
-    // Go through all the unary constraints in `dbm'.
-    const DB_Row<N>& dbm_0 = dbm[0];
-    for (dimension_type j = 1; j <= space_dim; ++j) {
-      const Variable x(j-1);
-      const N& dbm_0j = dbm_0[j];
-      const N& dbm_j0 = dbm[j][0];
-      N negated_dbm_j0;
-      if (neg_assign_r(negated_dbm_j0, dbm_j0, ROUND_NOT_NEEDED) == V_EQ
-	  && negated_dbm_j0 == dbm_0j) {
-	// We have a unary equality constraint.
-	numer_denom(dbm_0j, b, a);
-	cs.insert(a*x == b);
-      }
-      else {
-	// We have 0, 1 or 2 unary inequality constraints.
-	if (!is_plus_infinity(dbm_0j)) {
-	  numer_denom(dbm_0j, b, a);
-	  cs.insert(a*x <= b);
-	}
-	if (!is_plus_infinity(dbm_j0)) {
-	  numer_denom(dbm_j0, b, a);
-	  cs.insert(-a*x <= b);
-	}
-      }
-    }
+    \param complexity
+    This argument is ignored.
 
-    // Go through all the binary constraints in `dbm'.
-    for (dimension_type i = 1; i <= space_dim; ++i) {
-      const Variable y(i-1);
-      const DB_Row<N>& dbm_i = dbm[i];
-      for (dimension_type j = i + 1; j <= space_dim; ++j) {
-	const Variable x(j-1);
-	const N& dbm_ij = dbm_i[j];
-	const N& dbm_ji = dbm[j][i];
-	N negated_dbm_ji;
-	if (neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
-	    && negated_dbm_ji == dbm_ij) {
-	  // We have a binary equality constraint.
-	  numer_denom(dbm_ij, b, a);
-	  cs.insert(a*x - a*y == b);
-	}
-	else {
-	  // We have 0, 1 or 2 binary inequality constraints.
-	  if (!is_plus_infinity(dbm_ij)) {
-	    numer_denom(dbm_ij, b, a);
-	    cs.insert(a*x - a*y <= b);
-	  }
-	  if (!is_plus_infinity(dbm_ji)) {
-	    numer_denom(dbm_ji, b, a);
-	    cs.insert(a*y - a*x <= b);
-	  }
-	}
-      }
-    }
-  }
-  return cs;
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const Octagonal_Shape<T>& os,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-template <typename T>
-Constraint_System
-BD_Shape<T>::minimized_constraints() const {
-  using Implementation::BD_Shapes::numer_denom;
+  //! Builds a pointset_powerset out of a bd shape.
+  /*!
+    If the bd shape is nonempty, builds a powerset containing a
+    single disjunct approximating the bd shape. Builds the empty
+    powerset otherwise.  The powerset inherits the space dimension
+    of the bd shape.
 
-  shortest_path_reduction_assign();
-  Constraint_System cs;
-  const dimension_type space_dim = space_dimension();
-  if (space_dim == 0) {
-    if (marked_empty())
-      cs = Constraint_System::zero_dim_empty();
-  }
-  else if (marked_empty())
-    cs.insert(0*Variable(space_dim-1) <= -1);
-  else {
-    // KLUDGE: in the future `cs' will be constructed of the right dimension.
-    // For the time being, we force the dimension with the following line.
-    cs.insert(0*Variable(space_dim-1) <= 0);
+    \param bds
+    The bd shape to be used to build the powerset.
 
-    TEMP_INTEGER(num);
-    TEMP_INTEGER(den);
+    \param complexity
+    This argument is ignored.
 
-    // Compute leader information.
-    std::vector<dimension_type> leaders;
-    compute_leaders(leaders);
-    std::vector<dimension_type> leader_indices;
-    compute_leader_indices(leaders, leader_indices);
-    const dimension_type num_leaders = leader_indices.size();
+    \exception std::length_error
+    Thrown if the space dimension of \p bdss exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const BD_Shape<T>& bds,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-    // Go through the non-leaders to generate equality constraints.
-    const DB_Row<N>& dbm_0 = dbm[0];
-    for (dimension_type i = 1; i <= space_dim; ++i) {
-      const dimension_type leader = leaders[i];
-      if (i != leader)
-	// Generate the constraint relating `i' and its leader.
-	if (leader == 0) {
-	  // A unary equality has to be generated.
-	  assert(!is_plus_infinity(dbm_0[i]));
-	  numer_denom(dbm_0[i], num, den);
-	  cs.insert(den*Variable(i-1) == num);
-	}
-	else {
-	  // A binary equality has to be generated.
-	  assert(!is_plus_infinity(dbm[i][leader]));
-	  numer_denom(dbm[i][leader], num, den);
-	  cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
-	}
-    }
+  //! Builds a pointset_powerset out of a box.
+  /*!
+    If the box is nonempty, builds a powerset containing a single
+    disjunct approximating the box. Builds the empty powerset
+    otherwise.  The powerset inherits the space dimension of the box.
 
-    // Go through the leaders to generate inequality constraints.
-    // First generate all the unary inequalities.
-    const std::deque<bool>& red_0 = redundancy_dbm[0];
-    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
-      const dimension_type i = leader_indices[l_i];
-      if (!red_0[i]) {
-	numer_denom(dbm_0[i], num, den);
-	cs.insert(den*Variable(i-1) <= num);
-      }
-      if (!redundancy_dbm[i][0]) {
-	numer_denom(dbm[i][0], num, den);
-	cs.insert(-den*Variable(i-1) <= num);
-      }
-    }
-    // Then generate all the binary inequalities.
-    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
-      const dimension_type i = leader_indices[l_i];
-      const DB_Row<N>& dbm_i = dbm[i];
-      const std::deque<bool>& red_i = redundancy_dbm[i];
-      for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
-	const dimension_type j = leader_indices[l_j];
-	if (!red_i[j]) {
-	  numer_denom(dbm_i[j], num, den);
-	  cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
-	}
-	if (!redundancy_dbm[j][i]) {
-	  numer_denom(dbm[j][i], num, den);
-	  cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
-	}
-      }
-    }
-  }
-  return cs;
-}
+    \param box
+    The box to be used to build the powerset.
 
-/*! \relates Parma_Polyhedra_Library::BD_Shape */
-template <typename T>
-std::ostream&
-IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
-  typedef typename BD_Shape<T>::coefficient_type N;
-  if (c.is_universe())
-    s << "true";
-  else {
-    // We control empty system of bounded differences.
-    dimension_type n = c.space_dimension();
-    if (c.marked_empty())
-      s << "false";
-    else {
-      bool first = true;
-      for (dimension_type i = 0; i <= n; ++i)
-	for (dimension_type j = i + 1; j <= n; ++j) {
-	  const N& c_i_j = c.dbm[i][j];
-	  const N& c_j_i = c.dbm[j][i];
-	  N negated_c_ji;
-	  if (neg_assign_r(negated_c_ji, c_j_i, ROUND_NOT_NEEDED) == V_EQ
-	      && negated_c_ji == c_i_j) {
-	    // We will print an equality.
-	    if (first)
-	      first = false;
-	    else
-	      s << ", ";
-	    if (i == 0) {
-	      // We have got a equality constraint with one Variable.
-	      s << Variable(j - 1);
-	      s << " == " << c_i_j;
-	    }
-	    else {
-	      // We have got a equality constraint with two Variables.
-	      if (c_i_j >= 0) {
-		s << Variable(j - 1);
-		s << " - ";
-		s << Variable(i - 1);
-		s << " == " << c_i_j;
-	      }
-	      else {
-		s << Variable(i - 1);
-		s << " - ";
-		s << Variable(j - 1);
-		s << " == " << c_j_i;
-	      }
-	    }
-	  }
-	  else {
-	    // We will print a non-strict inequality.
-	    if (!is_plus_infinity(c_j_i)) {
-	      if (first)
-		first = false;
-	      else
-		s << ", ";
-	      if (i == 0) {
-		// We have got a constraint with an only Variable.
-		s << Variable(j - 1);
-		N v;
-		neg_assign_r(v, c_j_i, ROUND_DOWN);
-		s << " >= " << v;
-	      }
-	      else {
-		// We have got a constraint with two Variables.
-		if (c_j_i >= 0) {
-		  s << Variable(i - 1);
-		  s << " - ";
-		  s << Variable(j - 1);
-		  s << " <= " << c_j_i;
-		}
-		else {
-		  s << Variable(j - 1);
-		  s << " - ";
-		  s << Variable(i - 1);
-		  N v;
-		  neg_assign_r(v, c_j_i, ROUND_DOWN);
-		  s << " >= " << v;
-		}
-	      }
-	    }
-	    if (!is_plus_infinity(c_i_j)) {
-	      if (first)
-		first = false;
-	      else
-		s << ", ";
-	      if (i == 0) {
-		// We have got a constraint with an only Variable.
-		s << Variable(j - 1);
-		s << " <= " << c_i_j;
-	      }
-	      else {
-		// We have got a constraint with two Variables.
-		if (c_i_j >= 0) {
-		  s << Variable(j - 1);
-		  s << " - ";
-		  s << Variable(i - 1);
-		  s << " <= " << c_i_j;
-		}
-		else {
-		  s << Variable(i - 1);
-		  s << " - ";
-		  s << Variable(j - 1);
-		  N v;
-		  neg_assign_r(v, c_i_j, ROUND_DOWN);
-		  s << " >= " << v;
-		}
-	      }
-	    }
-	  }
-	}
-    }
-  }
-  return s;
-}
+    \param complexity
+    This argument is ignored.
 
-template <typename T>
-void
-BD_Shape<T>::ascii_dump(std::ostream& s) const {
-  status.ascii_dump(s);
-  s << "\n";
-  dbm.ascii_dump(s);
-  // Redundancy info.
-  s << "\n";
-  const char separator = ' ';
-  const dimension_type nrows = redundancy_dbm.size();
-  s << nrows << separator << "\n";
-  for (dimension_type i = 0; i < nrows;  ++i) {
-    for (dimension_type j = 0; j < nrows; ++j)
-      s << redundancy_dbm[i][j] << separator;
-    s << "\n";
-  }
-}
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Pointset_Powerset(const Box<Interval>& box,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
 
-PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>);
+  //@} // Constructors and Destructor
 
-template <typename T>
-bool
-BD_Shape<T>::ascii_load(std::istream& s) {
-  if (!status.ascii_load(s))
-    return false;
-  if (!dbm.ascii_load(s))
-    return false;
-  // Load redundancy info.
-  dimension_type nrows;
-   if (!(s >> nrows))
-    return false;
-  redundancy_dbm.clear();
-  redundancy_dbm.reserve(nrows);
-  std::deque<bool> redundancy_row(nrows, false);
-  for (dimension_type i = 0; i < nrows;  ++i) {
-    for (dimension_type j = 0; j < nrows; ++j)
-      if (!(s >> redundancy_row[j]))
-	return false;
-    redundancy_dbm.push_back(redundancy_row);
-  }
-  return true;
-}
+  //! \name Member Functions that Do Not Modify the Pointset_Powerset
+  //@{
 
-template <typename T>
-bool
-BD_Shape<T>::OK() const {
-  // Check whether the difference-bound matrix is well-formed.
-  if (!dbm.OK())
-    return false;
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
 
-  // Check whether the status information is legal.
-  if (!status.OK())
-    return false;
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type affine_dimension() const;
 
-  // An empty BDS is OK.
-  if (marked_empty())
-    return true;
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty powerset.
+  */
+  bool is_empty() const;
 
-  // MINUS_INFINITY cannot occur at all.
-  for (dimension_type i = dbm.num_rows(); i-- > 0; )
-    for (dimension_type j = dbm.num_rows(); j-- > 0; )
-    if (is_minus_infinity(dbm[i][j])) {
-#ifndef NDEBUG
-      using namespace Parma_Polyhedra_Library::IO_Operators;
-      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
-		<< dbm[i][i] << "!"
-		<< std::endl;
-#endif
-      return false;
-    }
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is the top element of the powerser lattice.
+  */
+  bool is_universe() const;
 
-  // On the main diagonal only PLUS_INFINITY can occur.
-  for (dimension_type i = dbm.num_rows(); i-- > 0; )
-    if (!is_plus_infinity(dbm[i][i])) {
-#ifndef NDEBUG
-      using namespace Parma_Polyhedra_Library::IO_Operators;
-      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
-		<< dbm[i][i] << "!  (+inf was expected.)"
-		<< std::endl;
-#endif
-      return false;
-    }
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the disjuncts
+    in \p *this are topologically closed.
+  */
+  bool is_topologically_closed() const;
 
-  // Check whether the shortest-path closure information is legal.
-  if (marked_shortest_path_closed()) {
-    BD_Shape x = *this;
-    x.status.reset_shortest_path_closed();
-    x.shortest_path_closure_assign();
-    if (x.dbm != dbm) {
-#ifndef NDEBUG
-      std::cerr << "BD_Shape is marked as closed but it is not!"
-		<< std::endl;
-#endif
-      return false;
-    }
-  }
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all elements in \p *this
+    are bounded.
+  */
+  bool is_bounded() const;
 
-  // Check whether the shortest-path reduction information is legal.
-  if (marked_shortest_path_reduced()) {
-    // A non-redundant constraint cannot be equal to PLUS_INFINITY.
-    for (dimension_type i = dbm.num_rows(); i-- > 0; )
-      for (dimension_type j = dbm.num_rows(); j-- > 0; )
-	if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
-#ifndef NDEBUG
-	  using namespace Parma_Polyhedra_Library::IO_Operators;
-	  std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
-		    << dbm[i][i] << " is marked as non-redundant!"
-		    << std::endl;
-#endif
-	  return false;
-	}
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Pointset_Powerset& y) const;
 
-    BD_Shape x = *this;
-    x.status.reset_shortest_path_reduced();
-    x.shortest_path_reduction_assign();
-    if (x.redundancy_dbm != redundancy_dbm) {
-#ifndef NDEBUG
-      std::cerr << "BD_Shape is marked as reduced but it is not!"
-		<< std::endl;
-#endif
-      return false;
-    }
-  }
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
 
-  // All checks passed.
-  return true;
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+
+    \note
+    A variable is constrained if there exists a non-redundant disjunct
+    that is constraining the variable: this definition relies on the
+    powerset lattice structure and may be somewhat different from the
+    geometric intuition.
+    For instance, variable \f$x\f$ is constrained in the powerset
+    \f[
+      \mathit{ps} = \bigl\{ \{ x \geq 0 \}, \{ x \leq 0 \} \bigr\},
+    \f]
+    even though \f$\mathit{ps}\f$ is geometrically equal to the
+    whole vector space.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
 
-template <typename T>
-void
-BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const BD_Shape& y) const {
-  std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
-    << "this->space_dimension() == " << space_dimension()
-    << ", y->space_dimension() == " << y.space_dimension() << ".";
-  throw std::invalid_argument(s.str());
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
 
-template <typename T>
-void
-BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  dimension_type required_dim) const {
-  std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
-    << "this->space_dimension() == " << space_dimension()
-    << ", required dimension == " << required_dim << ".";
-  throw std::invalid_argument(s.str());
-}
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-template <typename T>
-void
-BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const Constraint& c) const {
-  std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
-    << "this->space_dimension() == " << space_dimension()
-    << ", c->space_dimension == " << c.space_dimension() << ".";
-  throw std::invalid_argument(s.str());
-}
+    \param sup_n
+    The numerator of the supremum value;
 
-template <typename T>
-void
-BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const Generator& g) const {
-  std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
-    << "this->space_dimension() == " << space_dimension()
-    << ", g->space_dimension == " << g.space_dimension() << ".";
-  throw std::invalid_argument(s.str());
-}
+    \param sup_d
+    The denominator of the supremum value;
 
-template <typename T>
-void
-BD_Shape<T>::throw_constraint_incompatible(const char* method) {
-  std::ostringstream s;
-  s << "PPL::BD_Shape::" << method << ":" << std::endl
-    << "the constraint is incompatible.";
-  throw std::invalid_argument(s.str());
-}
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
 
-template <typename T>
-void
-BD_Shape<T>::throw_expression_too_complex(const char* method,
-					  const Linear_Expression& e) {
-  using namespace IO_Operators;
-  std::ostringstream s;
-  s << "PPL::BD_Shape::" << method << ":" << std::endl
-    << e << " is too complex.";
-  throw std::invalid_argument(s.str());
-}
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
 
-template <typename T>
-void
-BD_Shape<T>::throw_dimension_incompatible(const char* method,
-					  const char* name_row,
-					  const Linear_Expression& y) const {
-  std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
-    << "this->space_dimension() == " << space_dimension()
-    << ", " << name_row << "->space_dimension() == "
-    << y.space_dimension() << ".";
-  throw std::invalid_argument(s.str());
-}
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
 
+    \param expr
+    The linear expression to be maximized subject to \p *this;
 
-template <typename T>
-void
-BD_Shape<T>::throw_generic(const char* method, const char* reason) {
-  std::ostringstream s;
-  s << "PPL::";
-  s << "BD_Shape::" << method << ":" << std::endl
-    << reason;
-  throw std::invalid_argument(s.str());
-}
+    \param sup_n
+    The numerator of the supremum value;
 
-} // namespace Parma_Polyhedra_Library
+    \param sup_d
+    The denominator of the supremum value;
 
-// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1341
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
 
-// Automatically generated from PPL source file ../src/Determinate.types.hh line 1
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
 
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-namespace Parma_Polyhedra_Library {
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& g) const;
 
-template <typename PH>
-class Determinate;
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
 
-} // namespace Parma_Polyhedra_Library
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-// Automatically generated from PPL source file ../src/Determinate.defs.hh line 1
-/* Determinate class declaration.
-*/
+    \param inf_n
+    The numerator of the infimum value;
 
+    \param inf_d
+    The denominator of the infimum value;
 
-// Automatically generated from PPL source file ../src/Determinate.defs.hh line 31
-#include <iosfwd>
-#include <cassert>
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-/*! \brief
-  Returns <CODE>true</CODE> if and only if
-  \p x and \p y are the same domain element.
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
 
-  \relates Determinate
-*/
-template <typename PH>
-bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
 
-/*! \brief
-  Returns <CODE>true</CODE> if and only if
-  \p x and \p y are different domain elements.
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
 
-  \relates Determinate
-*/
-template <typename PH>
-bool operator!=(const Determinate<PH>& x, const Determinate<PH>& y);
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-namespace IO_Operators {
+    \param inf_n
+    The numerator of the infimum value;
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
-std::ostream&
-operator<<(std::ostream&, const Determinate<PH>&);
+    \param inf_d
+    The denominator of the infimum value;
 
-} // namespace IO_Operators
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
 
-} // namespace Parma_Polyhedra_Library
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
 
-//! Wraps a PPL class into a determinate constraint system interface.
-/*! \ingroup PPL_CXX_interface */
-template <typename PH>
-class Parma_Polyhedra_Library::Determinate {
-public:
-  //! \name Constructors and Destructor
-  //@{
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-  /*! \brief
-    Injection operator: builds the determinate constraint system element
-    corresponding to the base-level element \p p.
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
   */
-  Determinate(const PH& p);
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& g) const;
 
   /*! \brief
-    Injection operator: builds the determinate constraint system element
-    corresponding to the base-level element represented by \p cs.
+    Returns <CODE>true</CODE> if and only if \p *this geometrically
+    covers \p y, i.e., if any point (in some element) of \p y is also
+    a point (of some element) of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
   */
-  Determinate(const Constraint_System& cs);
+  bool geometrically_covers(const Pointset_Powerset& y) const;
 
-  //! \brief
-  //! Injection operator: builds the determinate constraint system element
-  //! corresponding to the base-level element represented by \p cgs.
-  Determinate(const Congruence_System& cgs);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is geometrically
+    equal to \p y, i.e., if (the elements of) \p *this and \p y
+    contain the same set of points.
 
-  //! Copy constructor.
-  Determinate(const Determinate& y);
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-  //! Destructor.
-  ~Determinate();
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_equals(const Pointset_Powerset& y) const;
 
-  //@} // Constructors and Destructor
+  /*! brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is contained in a disjunct of \p *this.
 
-  //! \name Member Functions that Do Not Modify the Domain Element
-  //@{
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Pointset_Powerset& y) const;
 
-  //! Returns a const reference to the embedded element.
-  const PH& element() const;
+  /*! brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is strictly contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Pointset_Powerset& y) const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is the top of the
-    determinate constraint system (i.e., the whole vector space).
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
   */
-  bool is_top() const;
+  bool contains_integer_point() const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is the bottom
-    of the determinate constraint system.
+    Returns the relations holding between the powerset \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
   */
-  bool is_bottom() const;
+  Poly_Con_Relation relation_with(const Constraint& c) const;
 
-  //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
-  bool definitely_entails(const Determinate& y) const;
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
 
   /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this and \p y
-    are equivalent.
+    Returns the relations holding between the powerset \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
   */
-  bool is_definitely_equivalent_to(const Determinate& y) const;
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
 
   /*! \brief
     Returns a lower bound to the total size in bytes of the memory
@@ -37939,3155 +70641,4566 @@ public:
   */
   memory_size_type external_memory_in_bytes() const;
 
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
   //! Checks if all the invariants are satisfied.
   bool OK() const;
 
-  //@} // Member Functions that Do Not Modify the Domain Element
-
+  //@} // Member Functions that Do Not Modify the Pointset_Powerset
 
-  //! \name Member Functions that May Modify the Domain Element
+  //! \name Space Dimension Preserving Member Functions that May Modify the Pointset_Powerset
   //@{
 
-  //! Assigns to \p *this the upper bound of \p *this and \p y.
-  void upper_bound_assign(const Determinate& y);
+  //! Adds to \p *this the disjunct \p ph.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p ph are dimension-incompatible.
+  */
+  void add_disjunct(const PS& ph);
 
-  //! Assigns to \p *this the meet of \p *this and \p y.
-  void meet_assign(const Determinate& y);
+  //! Intersects \p *this with constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
 
   /*! \brief
-    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
-    of \p *this and \p y, taken in this order.
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
   */
-  void concatenate_assign(const Determinate& y);
+  void refine_with_constraint(const Constraint& c);
 
-  //! Returns a reference to the embedded element.
-  PH& element();
+  //! Intersects \p *this with the constraint \p c, minimizing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  //! Intersects \p *this with the constraints in \p cs.
+  /*!
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    On return from this method, the representation of \p *this
-    is not shared by different Determinate objects.
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  void mutate();
+  void refine_with_constraints(const Constraint_System& cs);
 
-  //! Assignment operator.
-  Determinate& operator=(const Determinate& y);
+  /*! \brief
+    Intersects \p *this with the constraints in \p cs,
+    minimizing the result.
 
-  //! Swaps \p *this with \p y.
-  void swap(Determinate& y);
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
 
-  //@} // Member Functions that May Modify the Domain Element
+    \param cs
+    The constraints to intersect with.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  //! A function adapter for the Determinate class.
-  /*! \ingroup PPL_CXX_interface
-    It lifts a Binary_Operator_Assign function object, taking arguments
-    of type PH, producing the corresponding function object taking
-    arguments of type Determinate<PH>.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
 
-    The template parameter Binary_Operator_Assign is supposed to
-    implement an <EM>apply and assign</EM> function, i.e., a function
-    having signature <CODE>void foo(PH& x, const PH& y)</CODE> that
-    applies an operator to \c x and \c y and assigns the result to \c x.
-    For instance, such a function object is obtained by
-    <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  template <typename Binary_Operator_Assign>
-  class Binary_Operator_Assign_Lifter {
-  public:
-    //! Explicit unary constructor.
-    explicit
-    Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+  bool add_constraints_and_minimize(const Constraint_System& cs);
 
-    //! Function-application operator.
-    void operator()(Determinate& x, const Determinate& y) const;
+  //! Intersects \p *this with congruence \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_congruence(const Congruence& c);
 
-  private:
-    //! The function object to be lifted.
-    Binary_Operator_Assign op_assign_;
-  };
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Intersects \p *this with the congruence \p c, minimizing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool add_congruence_and_minimize(const Congruence& c);
+
+  //! Intersects \p *this with the congruences in \p cgs.
+  /*!
+    \param cgs
+    The congruences to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
   /*! \brief
-    Helper function returning a Binary_Operator_Assign_Lifter object,
-    also allowing for the deduction of template arguments.
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
   */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  template <typename Binary_Operator_Assign>
-  static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
-  lift_op_assign(Binary_Operator_Assign op_assign);
+  void refine_with_congruences(const Congruence_System& cgs);
 
-private:
-  //! The possibly shared representation of a Determinate object.
-  /*! \ingroup PPL_CXX_interface
-    By adopting the <EM>copy-on-write</EM> technique, a single
-    representation of the base-level object may be shared by more than
-    one object of the class Determinate.
+  /*! \brief
+    Intersects \p *this with the congruences in \p cs,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The congruences to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
   */
-  class Rep {
-  private:
-    /*! \brief
-      Count the number of references:
-      -   0: leaked, \p ph is non-const;
-      -   1: one reference, \p ph is non-const;
-      - > 1: more than one reference, \p ph is const.
-    */
-    mutable unsigned long references;
+  bool add_congruences_and_minimize(const Congruence_System& cs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
+
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void unconstrain(const Variables_Set& to_be_unconstrained);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each disjunct in \p *this
+    with each disjunct in \p y and collecting all these intersections.
+  */
+  void intersection_assign(const Pointset_Powerset& y);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each disjunct in \p *this
+    with each disjunct in \p y, minimizing the result
+    and collecting all these intersections.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \deprecated
+    See \ref A_Note_on_the_Implementation_of_the_Operators.
+  */
+  bool intersection_assign_and_minimize(const Pointset_Powerset& y);
+
+  //! Assigns to \p *this the difference of \p *this and \p y.
+  // FIXME: document the intended semantics.
+  void poly_difference_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this an (a smallest)
+    over-approximation as a powerset of the disjunct domain of the
+    set-theoretical difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Powerset_Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_preimage(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
 
-    //! Private and unimplemented: assignment not allowed.
-    Rep& operator=(const Rep& y);
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-    //! Private and unimplemented: copies not allowed.
-    Rep(const Rep& y);
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-    //! Private and unimplemented: default construction not allowed.
-    Rep();
+    \param relsym
+    The relation symbol;
 
-  public:
-    //! A possibly shared base-level domain element.
-    PH ph;
+    \param expr
+    The numerator of the right hand side affine expression;
 
-    /*! \brief
-      Builds a new representation by creating a domain element
-      of the specified kind, in the specified vector space.
-    */
-    Rep(dimension_type num_dimensions, Degenerate_Element kind);
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-    //! Builds a new representation by copying base-level element \p p.
-    Rep(const PH& p);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				  = Coefficient_one());
 
-    //! Builds a new representation by copying the constraints in \p cs.
-    Rep(const Constraint_System& cs);
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-    //! Builds a new representation by copying the constraints in \p cgs.
-    Rep(const Congruence_System& cgs);
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-    //! Destructor.
-    ~Rep();
+    \param relsym
+    The relation symbol;
 
-    //! Registers a new reference.
-    void new_reference() const;
+    \param expr
+    The numerator of the right hand side affine expression;
 
-    /*! \brief
-      Unregisters one reference; returns <CODE>true</CODE> if and only if
-      the representation has become unreferenced.
-    */
-    bool del_reference() const;
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-    //! True if and only if this representation is currently shared.
-    bool is_shared() const;
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
 
-    /*! \brief
-      Returns a lower bound to the total size in bytes of the memory
-      occupied by \p *this.
-    */
-    memory_size_type total_memory_in_bytes() const;
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-    /*! \brief
-      Returns a lower bound to the size in bytes of the memory
-      managed by \p *this.
-    */
-    memory_size_type external_memory_in_bytes() const;
-  };
+    \param lhs
+    The left hand side affine expression;
 
-  /*! \brief
-    A pointer to the possibly shared representation of
-    the base-level domain element.
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
   */
-  Rep* prep;
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
 
-  friend bool
-  operator==<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
-  friend bool
-  operator!=<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
-};
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
+    \param lhs
+    The left hand side affine expression;
 
-namespace std {
+    \param relsym
+    The relation symbol;
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
-void swap(Parma_Polyhedra_Library::Determinate<PH>& x,
-	  Parma_Polyhedra_Library::Determinate<PH>& y);
+    \param rhs
+    The right hand side affine expression.
 
-} // namespace std
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
 
-// Automatically generated from PPL source file ../src/Determinate.inlines.hh line 1
-/* Determinate class implementation: inline functions.
-*/
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
+    \param var
+    The variable updated by the affine relation;
 
-#include <cassert>
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-namespace Parma_Polyhedra_Library {
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-template <typename PH>
-inline
-Determinate<PH>::Rep::Rep(dimension_type num_dimensions,
-			  Degenerate_Element kind)
-  : references(0), ph(num_dimensions, kind) {
-}
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-template <typename PH>
-inline
-Determinate<PH>::Rep::Rep(const PH& p)
-  : references(0), ph(p) {
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
 
-template <typename PH>
-inline
-Determinate<PH>::Rep::Rep(const Constraint_System& cs)
-  : references(0), ph(cs) {
-}
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-template <typename PH>
-inline
-Determinate<PH>::Rep::Rep(const Congruence_System& cgs)
-  : references(0), ph(cgs) {
-}
+    \param var
+    The variable updated by the affine relation;
 
-template <typename PH>
-inline
-Determinate<PH>::Rep::~Rep() {
-  assert(references == 0);
-}
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-template <typename PH>
-inline void
-Determinate<PH>::Rep::new_reference() const {
-  ++references;
-}
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-template <typename PH>
-inline bool
-Determinate<PH>::Rep::del_reference() const {
-  return --references == 0;
-}
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-template <typename PH>
-inline bool
-Determinate<PH>::Rep::is_shared() const {
-  return references > 1;
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
 
-template <typename PH>
-inline memory_size_type
-Determinate<PH>::Rep::external_memory_in_bytes() const {
-  return ph.external_memory_in_bytes();
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
 
-template <typename PH>
-inline memory_size_type
-Determinate<PH>::Rep::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+    The result is obtained by computing the pairwise
+    \ref Time_Elapse_Operator "time elapse" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void time_elapse_assign(const Pointset_Powerset& y);
 
-template <typename PH>
-inline
-Determinate<PH>::Determinate(const PH& ph)
-  : prep(new Rep(ph)) {
-  prep->new_reference();
-}
+  /*! \brief
+    Assign to \p *this the result of (recursively) merging together
+    the pairs of disjuncts whose upper-bound is the same as their
+    set-theoretical union.
 
-template <typename PH>
-inline
-Determinate<PH>::Determinate(const Constraint_System& cs)
-  : prep(new Rep(cs)) {
-  prep->new_reference();
-}
+    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different disjuncts
+    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+  */
+  void pairwise_reduce();
 
-template <typename PH>
-inline
-Determinate<PH>::Determinate(const Congruence_System& cgs)
-  : prep(new Rep(cgs)) {
-  prep->new_reference();
-}
+  /*! \brief
+    Assigns to \p *this the result of applying the
+    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+    to \p *this and \p y, using the widening function \p wf
+    and the cardinality threshold \p max_disjuncts.
 
-template <typename PH>
-inline
-Determinate<PH>::Determinate(const Determinate& y)
-  : prep(y.prep) {
-  prep->new_reference();
-}
+    \param y
+    A powerset that <EM>must</EM> definitely entail \p *this;
 
-template <typename PH>
-inline
-Determinate<PH>::~Determinate() {
-  if (prep->del_reference())
-    delete prep;
-}
+    \param wf
+    The widening function to be used on polyhedra objects. It is obtained
+    from the corresponding widening method by using the helper function
+    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
 
-template <typename PH>
-inline Determinate<PH>&
-Determinate<PH>::operator=(const Determinate& y) {
-  y.prep->new_reference();
-  if (prep->del_reference())
-    delete prep;
-  prep = y.prep;
-  return *this;
-}
+    \param max_disjuncts
+    The maximum number of disjuncts occurring in the powerset \p *this
+    <EM>before</EM> starting the computation. If this number is exceeded,
+    some of the disjuncts in \p *this are collapsed (i.e., joined together).
 
-template <typename PH>
-inline void
-Determinate<PH>::swap(Determinate& y) {
-  std::swap(prep, y.prep);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-template <typename PH>
-inline void
-Determinate<PH>::mutate() {
-  if (prep->is_shared()) {
-    Rep* new_prep = new Rep(prep->ph);
-    (void) prep->del_reference();
-    new_prep->new_reference();
-    prep = new_prep;
-  }
-}
+    For a description of the extrapolation operator,
+    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+  */
+  template <typename Widening>
+  void BGP99_extrapolation_assign(const Pointset_Powerset& y,
+				  Widening wf,
+				  unsigned max_disjuncts);
 
-template <typename PH>
-inline const PH&
-Determinate<PH>::element() const {
-  return prep->ph;
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref pps_certificate_widening "BHZ03-widening"
+    between \p *this and \p y, using the widening function \p wf
+    certified by the convergence certificate \p Cert.
 
-template <typename PH>
-inline PH&
-Determinate<PH>::element() {
-  mutate();
-  return prep->ph;
-}
+    \param y
+    The finite powerset computed in the previous iteration step.
+    It <EM>must</EM> definitely entail \p *this;
 
-template <typename PH>
-inline void
-Determinate<PH>::upper_bound_assign(const Determinate& y) {
-  element().upper_bound_assign(y.element());
-}
+    \param wf
+    The widening function to be used on disjuncts.
+    It is obtained from the corresponding widening method by using
+    the helper function widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
 
-template <typename PH>
-inline void
-Determinate<PH>::meet_assign(const Determinate& y) {
-  element().intersection_assign(y.element());
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
 
-template <typename PH>
-inline void
-Determinate<PH>::concatenate_assign(const Determinate& y) {
-  element().concatenate_assign(y.element());
-}
+    \warning
+    In order to obtain a proper widening operator, the template parameter
+    \p Cert should be a finite convergence certificate for the base-level
+    widening function \p wf; otherwise, an extrapolation operator is
+    obtained.
+    For a description of the methods that should be provided
+    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+  */
+  template <typename Cert, typename Widening>
+  void BHZ03_widening_assign(const Pointset_Powerset& y, Widening wf);
 
-template <typename PH>
-inline bool
-Determinate<PH>::definitely_entails(const Determinate& y) const {
-  return prep == y.prep || y.prep->ph.contains(prep->ph);
-}
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
 
-template <typename PH>
-inline bool
-Determinate<PH>::is_definitely_equivalent_to(const Determinate& y) const {
-  return prep == y.prep || prep->ph == y.prep->ph;
-}
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-template <typename PH>
-inline bool
-Determinate<PH>::is_top() const {
-  return prep->ph.is_universe();
-}
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Pointset_Powerset& operator=(const Pointset_Powerset& y);
 
-template <typename PH>
-inline bool
-Determinate<PH>::is_bottom() const {
-  return prep->ph.is_empty();
-}
+  /*! \brief
+    Conversion assignment: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PS</CODE>
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  template <typename QH>
+  Pointset_Powerset& operator=(const Pointset_Powerset<QH>& y);
 
-template <typename PH>
-inline memory_size_type
-Determinate<PH>::external_memory_in_bytes() const {
-  return prep->total_memory_in_bytes();
-}
+  //! Swaps \p *this with \p y.
+  void swap(Pointset_Powerset& y);
 
-template <typename PH>
-inline memory_size_type
-Determinate<PH>::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    and embeds each disjunct in \p *this in the new space.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
 
-template <typename PH>
-inline bool
-Determinate<PH>::OK() const {
-  return prep->ph.OK();
-}
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    without embedding the disjuncts in \p *this in the new space.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
 
-namespace IO_Operators {
+  //! Assigns to \p *this the concatenation of \p *this and \p y.
+  /*!
+    The result is obtained by computing the pairwise
+    \ref Concatenating_Polyhedra "concatenation" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void concatenate_assign(const Pointset_Powerset& y);
 
-/*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
-inline std::ostream&
-operator<<(std::ostream& s, const Determinate<PH>& x) {
-  s << x.element();
-  return s;
-}
+  //! Removes all the specified space dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
 
-} // namespace IO_Operators
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
 
-/*! \relates Determinate */
-template <typename PH>
-inline bool
-operator==(const Determinate<PH>& x, const Determinate<PH>& y) {
-  return x.prep == y.prep || x.prep->ph == y.prep->ph;
-}
+  /*! \brief
+    Removes the higher space dimensions so that the resulting space
+    will have dimension \p new_dimension.
 
-/*! \relates Determinate */
-template <typename PH>
-inline bool
-operator!=(const Determinate<PH>& x, const Determinate<PH>& y) {
-  return x.prep != y.prep && x.prep->ph != y.prep->ph;
-}
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
 
-template <typename PH>
-template <typename Binary_Operator_Assign>
-inline
-Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
-Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
-  : op_assign_(op_assign) {
-}
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a partial function.
 
-template <typename PH>
-template <typename Binary_Operator_Assign>
-inline void
-Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
-operator()(Determinate& x, const Determinate& y) const {
-  op_assign_(x.element(), y.element());
-}
+    See also Polyhedron::map_space_dimensions.
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
 
-template <typename PH>
-template <typename Binary_Operator_Assign>
-inline
-Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
-Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
-  return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
-}
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
 
-} // namespace Parma_Polyhedra_Library
+    \param m
+    The number of replicas to be created.
 
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
 
-namespace std {
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-/*! \relates Parma_Polyhedra_Library::Determinate */
-template <typename PH>
-inline void
-swap(Parma_Polyhedra_Library::Determinate<PH>& x,
-     Parma_Polyhedra_Library::Determinate<PH>& y) {
-  x.swap(y);
-}
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
 
-} // namespace std
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
 
-// Automatically generated from PPL source file ../src/Determinate.defs.hh line 315
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-// Automatically generated from PPL source file ../src/Powerset.types.hh line 1
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
+public:
+  typedef typename Base::size_type size_type;
+  typedef typename Base::value_type value_type;
+  typedef typename Base::iterator iterator;
+  typedef typename Base::const_iterator const_iterator;
+  typedef typename Base::reverse_iterator reverse_iterator;
+  typedef typename Base::const_reverse_iterator const_reverse_iterator;
 
-namespace Parma_Polyhedra_Library {
+  PPL_OUTPUT_DECLARATIONS
 
-template <typename D>
-class Powerset;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-} // namespace Parma_Polyhedra_Library
+private:
+  typedef typename Base::Sequence Sequence;
+  typedef typename Base::Sequence_iterator Sequence_iterator;
+  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
 
-// Automatically generated from PPL source file ../src/Powerset.defs.hh line 1
-/* Powerset class declaration.
-*/
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
 
+  /*! \brief
+    Assigns to \p to_be_enlarged a
+    \ref Powerset_Meet_Preserving_Simplification
+    "powerset meet-preserving enlargement" of itself with respect to \p *this.
+    If \c false is returned, then the intersection is empty.
 
-// Automatically generated from PPL source file ../src/Powerset.defs.hh line 27
-#include <iosfwd>
-#include <iterator>
-#include <list>
+    \note
+    It is assumed that \p *this and \p to_be_enlarged are
+    topology-compatible and dimension-compatible.
+  */
+  bool intersection_preserving_enlarge_element(PS& to_be_enlarged) const;
 
-namespace Parma_Polyhedra_Library {
+  /*! \brief
+    Assigns to \p *this the result of applying the BGP99 heuristics
+    to \p *this and \p y, using the widening function \p wf.
+  */
+  template <typename Widening>
+  void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf);
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
-/*! \relates Powerset */
-template <typename D>
-bool
-operator==(const Powerset<D>& x, const Powerset<D>& y);
+  //! Records in \p cert_ms the certificates for this set of disjuncts.
+  template <typename Cert>
+  void collect_certificates(std::map<Cert, size_type,
+			             typename Cert::Compare>& cert_ms) const;
 
-//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
-/*! \relates Powerset */
-template <typename D>
-bool
-operator!=(const Powerset<D>& x, const Powerset<D>& y);
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the current set of dijsuncts
+    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+  */
+  template <typename Cert>
+  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                                                   typename Cert::Compare>&
+				    y_cert_ms) const;
 
-namespace IO_Operators {
+  // FIXME: here it should be enough to befriend the template constructor
+  // template <typename QH>
+  // Pointset_Powerset(const Pointset_Powerset<QH>&),
+  // but, apparently, this cannot be done.
+  friend class Pointset_Powerset<NNC_Polyhedron>;
+};
 
-//! Output operator.
-/*! \relates Parma_Polyhedra_Library::Powerset */
-template <typename D>
-std::ostream&
-operator<<(std::ostream& s, const Powerset<D>& x);
+namespace Parma_Polyhedra_Library {
 
-} // namespace IO_Operators
+//! Partitions \p q with respect to \p p.
+/*! \relates Pointset_Powerset
+  Let \p p and \p q be two polyhedra.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PS, Pointset_Powerset\<NNC_Polyhedron\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p;
+  - the set-theoretical union of <CODE>r.first</CODE> with all the
+    elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
 
-} // namespace Parma_Polyhedra_Library
+  \if Include_Implementation_Details
 
+  See
+  <A HREF="http://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
+  this paper</A> for more information about the implementation.
+  \endif
+*/
+template <typename PS>
+std::pair<PS, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PS& p, const PS& q);
 
-//! The powerset construction on a base-level domain.
-/*! \ingroup PPL_CXX_interface
-  This class offers a generic implementation of a
-  <EM>powerset</EM> domain as defined in Section \ref powerset.
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
 
-  Besides invoking the available methods on the disjuncts of a Powerset,
-  this class also provides bidirectional iterators that allow for a
-  direct inspection of these disjuncts. For a consistent handling of
-  Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
-  that the disjuncts cannot be overwritten. Rather, by using the class
-  <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
-  (possibly so as to later add back modified versions).  As an example
-  of iterator usage, the following templatic function drops from
-  powerset \p ps all the disjuncts that would have become redundant by
-  the addition of an external element \p d.
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+		  const Pointset_Powerset<NNC_Polyhedron>& ps);
 
-  \code
-template <typename D>
-void
-drop_subsumed(Powerset<D>& ps, const D& d) {
-  for (typename Powerset<D>::iterator i = ps.begin(),
-         ps_end = ps.end(), i != ps_end; )
-    if (i->definitely_entails(d))
-      i = ps.drop_disjunct(i);
-    else
-      ++i;
-}
-  \endcode
 
-  The template class D must provide the following methods.
-  \code
-    memory_size_type total_memory_in_bytes() const
-  \endcode
-  Returns a lower bound on the total size in bytes of the memory
-  occupied by the instance of D.
-  \code
-    bool is_top() const
-  \endcode
-  Returns <CODE>true</CODE> if and only if the instance of D is the top
-  element of the domain.
-  \code
-    bool is_bottom() const
-  \endcode
-  Returns <CODE>true</CODE> if and only if the instance of D is the
-  bottom element of the domain.
-  \code
-    bool definitely_entails(const D& y) const
-  \endcode
-  Returns <CODE>true</CODE> if the instance of D definitely entails
-  <CODE>y</CODE>.  Returns <CODE>false</CODE> if the instance may not
-  entail <CODE>y</CODE> (i.e., if the instance does not entail
-  <CODE>y</CODE> or if entailment could not be decided).
-  \code
-    void upper_bound_assign(const D& y)
-  \endcode
-  Assigns to the instance of D an upper bound of the instance and
-  <CODE>y</CODE>.
-  \code
-    void meet_assign(const D& y)
-  \endcode
-  Assigns to the instance of D the meet of the instance and
-  <CODE>y</CODE>.
-  \code
-    bool OK() const
-  \endcode
-  Returns <CODE>true</CODE> if the instance of D is in a consistent
-  state, else returns <CODE>false</CODE>.
+/*! \brief
+  Partitions the grid \p q with respect to grid \p p if and only if
+  such a partition is finite.
 
-  The following operators on the template class D must be defined.
-  \code
-    operator<<(std::ostream& s, const D& x)
-  \endcode
-  Writes a textual representation of the instance of D on
-  <CODE>s</CODE>.
-  \code
-    operator==(const D& x, const D& y)
-  \endcode
-  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
-  <CODE>y</CODE> are equivalent D's.
-  \code
-    operator!=(const D& x, const D& y)
-  \endcode
-  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
-  <CODE>y</CODE> are different D's.
+  \relates Parma_Polyhedra_Library::Pointset_Powerset
+  Let \p p and \p q be two grids.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PS, Pointset_Powerset\<Grid\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - If there is a finite partition of \p q wrt \p p
+    the Boolean <CODE>finite_partition</CODE> is set to true and
+    <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p and the set-theoretical
+    union of <CODE>r.first</CODE> with all the elements of
+    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+  - Otherwise the Boolean <CODE>finite_partition</CODE> is set to false
+    and the singleton set that contains \p q is stored in
+    <CODE>r.second</CODE>r.
 */
-template <typename D>
-class Parma_Polyhedra_Library::Powerset {
-public:
-  //! \name Constructors and Destructor
-  //@{
+std::pair<Grid, Pointset_Powerset<Grid> >
+approximate_partition(const Grid& p, const Grid& q, bool& finite_partition);
 
-  /*! \brief
-    Default constructor: builds the bottom of the powerset constraint
-    system (i.e., the empty powerset).
-  */
-  Powerset();
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the grids \p ps contains the grid \p g.
 
-  //! Copy constructor.
-  Powerset(const Powerset& y);
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const Grid& ph,
+		  const Pointset_Powerset<Grid>& ps);
 
-  /*! \brief
-    If \p d is not bottom, builds a powerset containing only \p d.
-    Builds the empty powerset otherwise.
-  */
-  explicit Powerset(const D& d);
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the objects in \p ps contains \p ph.
 
-  //! Destructor.
-  ~Powerset();
+  \relates Pointset_Powerset
+  \note
+  It is assumed that the template parameter PS can be converted
+  without precision loss into an NNC_Polyhedron; otherwise,
+  an incorrect result might be obtained.
+*/
+template <typename PS>
+bool
+check_containment(const PS& ph, const Pointset_Powerset<PS>& ps);
 
-  //@} // Constructors and Destructor
+// CHECKME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class);
 
-  //! \name Member Functions that Do Not Modify the Powerset Element
-  //@{
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+                    Complexity_Class);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if \p *this definitely entails \p y.
-    Returns <CODE>false</CODE> if \p *this may not entail \p y
-    (i.e., if \p *this does not entail \p y or if entailment could
-    not be decided).
-  */
-  bool definitely_entails(const Powerset& y) const;
+template <>
+template <>
+Pointset_Powerset<C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+                    Complexity_Class);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is the top
-    element of the powerset constraint system (i.e., it represents
-    the universe).
-  */
-  bool is_top() const;
+template <>
+void
+Pointset_Powerset<NNC_Polyhedron>
+::poly_difference_assign(const Pointset_Powerset& y);
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is the bottom
-    element of the powerset constraint system (i.e., it represents
-    the empty set).
-  */
-  bool is_bottom() const;
+template <>
+void
+Pointset_Powerset<Grid>
+::poly_difference_assign(const Pointset_Powerset& y);
 
-  /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
-  */
-  memory_size_type total_memory_in_bytes() const;
+template <>
+bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const;
 
-  /*! \brief
-    Returns a lower bound to the size in bytes of the memory
-    managed by \p *this.
-  */
-  memory_size_type external_memory_in_bytes() const;
+template <>
+bool
+Pointset_Powerset<Grid>
+::geometrically_covers(const Pointset_Powerset& y) const;
 
-  //! Checks if all the invariants are satisfied.
-  // FIXME: document and perhaps use an enum instead of a bool.
-  bool OK(bool disallow_bottom = false) const;
+} // namespace Parma_Polyhedra_Library
 
-  //@} // Member Functions that Do Not Modify the Powerset Element
 
-protected:
-  //! A powerset is implemented as a sequence of elements.
-  /*!
-    The particular sequence employed must support efficient deletion
-    in any position and efficient back insertion.
-  */
-  typedef std::list<D> Sequence;
+namespace std {
 
-  //! Alias for the low-level iterator on the disjuncts.
-  typedef typename Sequence::iterator Sequence_iterator;
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+template <typename PS>
+void swap(Parma_Polyhedra_Library::Pointset_Powerset<PS>& x,
+	  Parma_Polyhedra_Library::Pointset_Powerset<PS>& y);
 
-  //! Alias for the low-level %const_iterator on the disjuncts.
-  typedef typename Sequence::const_iterator Sequence_const_iterator;
+} // namespace std
 
-  //! The sequence container holding powerset's elements.
-  Sequence sequence;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.inlines.hh line 1
+/* Pointset_Powerset class implementation: inline functions.
+*/
 
-  //! If <CODE>true</CODE>, \p *this is Omega-reduced.
-  mutable bool reduced;
 
-public:
-  // Sequence manipulation types, accessors and modifiers
-  typedef typename Sequence::size_type size_type;
-  typedef typename Sequence::value_type value_type;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.inlines.hh line 34
+#include <algorithm>
+#include <deque>
 
-  class omega_iterator;
-  class omega_const_iterator;
+namespace Parma_Polyhedra_Library {
 
-  /*! \brief
-    Alias for a <EM>read-only</EM> bidirectional %iterator on the
-    disjuncts of a Powerset element.
+template <typename PS>
+inline dimension_type
+Pointset_Powerset<PS>::space_dimension() const {
+  return space_dim;
+}
 
-    By using this iterator type, the disjuncts cannot be overwritten,
-    but they can be removed using methods
-    <CODE>drop_disjunct(iterator position)</CODE> and
-    <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
-    while still ensuring a correct handling of Omega-reduction.
-  */
-  typedef omega_iterator iterator;
-  //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
-  typedef omega_const_iterator const_iterator;
+template <typename PS>
+inline dimension_type
+Pointset_Powerset<PS>::max_space_dimension() {
+  return PS::max_space_dimension();
+}
 
-  //! The reverse iterator type built from Powerset::iterator.
-  typedef std::reverse_iterator<iterator> reverse_iterator;
-  //! The reverse iterator type built from Powerset::const_iterator.
-  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(dimension_type num_dimensions,
+					 Degenerate_Element kind)
+  : Base(), space_dim(num_dimensions) {
+  Pointset_Powerset& x = *this;
+  if (kind == UNIVERSE)
+    x.sequence.push_back(Determinate<PS>(PS(num_dimensions, kind)));
+  assert(x.OK());
+}
 
-  //! \name Member Functions for the Direct Manipulation of Disjuncts
-  //@{
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Pointset_Powerset& y,
+                                         Complexity_Class)
+  : Base(y), space_dim(y.space_dim) {
+}
 
-  /*! \brief
-    Drops from the sequence of disjuncts in \p *this all the
-    non-maximal elements so that \p *this is non-redundant.
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const C_Polyhedron& ph,
+                                         Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PS>(PS(ph, complexity)));
+  x.reduced = false;
+  assert(OK());
+}
 
-    This method is declared <CODE>const</CODE> because, even though
-    Omega-reduction may change the syntactic representation of \p *this,
-    its semantics will be unchanged.
-  */
-  void omega_reduce() const;
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const NNC_Polyhedron& ph,
+                                         Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PS>(PS(ph, complexity)));
+  assert(OK());
+}
 
-  //! Returns the number of disjuncts.
-  size_type size() const;
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Grid& gr,
+                                         Complexity_Class)
+  : Base(), space_dim(gr.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!gr.is_empty()) {
+    x.sequence.push_back(Determinate<PS>(PS(gr)));
+  }
+  assert(OK());
+}
 
-  //! Returns <CODE>true</CODE> if and only if there are no disjuncts.
-  bool empty() const;
+template <typename PS>
+template <typename QH1, typename QH2, typename R>
+inline
+Pointset_Powerset<PS>
+::Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                    Complexity_Class complexity)
+  : Base(), space_dim(prp.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (prp.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PS>(PS(prp, complexity)));
+  x.reduced = false;
+  assert(OK());
+}
 
-  /*! \brief
-    Returns an iterator pointing to the first disjunct, if \p *this
-    is not empty; otherwise, returns the past-the-end iterator.
-  */
-  iterator begin();
+template <typename PS>
+template <typename Interval>
+Pointset_Powerset<PS>::Pointset_Powerset(const Box<Interval>& box,
+                                         Complexity_Class)
+  : Base(), space_dim(box.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!box.is_empty())
+    x.sequence.push_back(Determinate<PS>(PS(box)));
+  assert(OK());
+}
 
-  //! Returns the past-the-end iterator.
-  iterator end();
+template <typename PS>
+template <typename T>
+Pointset_Powerset<PS>::Pointset_Powerset(const Octagonal_Shape<T>& os,
+                                         Complexity_Class)
+  : Base(), space_dim(os.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!os.is_empty())
+    x.sequence.push_back(Determinate<PS>(PS(os)));
+  assert(OK());
+}
 
-  /*! \brief
-    Returns a const_iterator pointing to the first disjunct, if \p *this
-    is not empty; otherwise, returns the past-the-end const_iterator.
-  */
-  const_iterator begin() const;
+template <typename PS>
+template <typename T>
+Pointset_Powerset<PS>::Pointset_Powerset(const BD_Shape<T>& bds,
+                                         Complexity_Class)
+  : Base(), space_dim(bds.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!bds.is_empty())
+    x.sequence.push_back(Determinate<PS>(PS(bds)));
+  assert(OK());
+}
 
-  //! Returns the past-the-end const_iterator.
-  const_iterator end() const;
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Constraint_System& cs)
+  : Base(Determinate<PS>(cs)), space_dim(cs.space_dimension()) {
+  assert(OK());
+}
 
-  /*! \brief
-    Returns a reverse_iterator pointing to the last disjunct, if \p *this
-    is not empty; otherwise, returns the before-the-start reverse_iterator.
-  */
-  reverse_iterator rbegin();
-  //! Returns the before-the-start reverse_iterator.
-  reverse_iterator rend();
-  /*! \brief
-    Returns a const_reverse_iterator pointing to the last disjunct,
-    if \p *this is not empty; otherwise, returns the before-the-start
-    const_reverse_iterator.
-  */
-  const_reverse_iterator rbegin() const;
-  //! Returns the before-the-start const_reverse_iterator.
-  const_reverse_iterator rend() const;
+template <typename PS>
+inline
+Pointset_Powerset<PS>::Pointset_Powerset(const Congruence_System& cgs)
+  : Base(Determinate<PS>(cgs)), space_dim(cgs.space_dimension()) {
+  assert(OK());
+}
 
-  //! Adds to \p *this the disjunct \p d.
-  void add_disjunct(const D& d);
+template <typename PS>
+inline Pointset_Powerset<PS>&
+Pointset_Powerset<PS>::operator=(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::operator=(y);
+  x.space_dim = y.space_dim;
+  return x;
+}
 
-  /*! \brief
-    Drops the disjunct in \p *this pointed to by \p position, returning
-    an iterator to the disjunct following \p position.
-  */
-  iterator drop_disjunct(iterator position);
+template <typename PS>
+inline void
+Pointset_Powerset<PS>::swap(Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::swap(y);
+  std::swap(x.space_dim, y.space_dim);
+}
 
-  //! Drops all the disjuncts from \p first to \p last (excluded).
-  void drop_disjuncts(iterator first, iterator last);
+template <typename PS>
+template <typename QH>
+inline Pointset_Powerset<PS>&
+Pointset_Powerset<PS>::operator=(const Pointset_Powerset<QH>& y) {
+  Pointset_Powerset& x = *this;
+  Pointset_Powerset<PS> pps(y);
+  x.swap(pps);
+  return x;
+}
 
-  //! Drops all the disjuncts, making \p *this an empty powerset.
-  void clear();
+template <typename PS>
+inline void
+Pointset_Powerset<PS>::intersection_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PS::intersection_assign)));
+}
 
-  //@} // Member Functions for the Direct Manipulation of Disjuncts
+template <typename PS>
+inline bool
+Pointset_Powerset<PS>
+::intersection_assign_and_minimize(const Pointset_Powerset& y) {
+  intersection_assign(y);
+  return !is_empty();
+}
 
-  //! \name Member Functions that May Modify the Powerset Element
-  //@{
+template <typename PS>
+inline void
+Pointset_Powerset<PS>::time_elapse_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PS::time_elapse_assign)));
+}
 
-  //! The assignment operator.
-  Powerset& operator=(const Powerset& y);
+template <typename PS>
+inline bool
+Pointset_Powerset<PS>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy);
+}
 
-  //! Swaps \p *this with \p y.
-  void swap(Powerset& y);
+template <typename PS>
+inline bool
+Pointset_Powerset<PS>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
 
-  //! Assigns to \p *this the least upper bound of \p *this and \p y.
-  void least_upper_bound_assign(const Powerset& y);
+template <>
+inline bool
+Pointset_Powerset<Grid>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
 
-  //! Assigns to \p *this an upper bound of \p *this and \p y.
-  /*!
-    The result will be the least upper bound of \p *this and \p y.
-  */
-  void upper_bound_assign(const Powerset& y);
+template <>
+inline bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
 
-  //! Assigns to \p *this the meet of \p *this and \p y.
-  void meet_assign(const Powerset& y);
+template <typename PS>
+inline memory_size_type
+Pointset_Powerset<PS>::external_memory_in_bytes() const {
+  return Base::external_memory_in_bytes();
+}
 
-  /*! \brief
-    If \p *this is not empty (i.e., it is not the bottom element),
-    it is reduced to a singleton obtained by computing an upper-bound
-    of all the disjuncts.
-  */
-  void collapse();
+template <typename PS>
+inline memory_size_type
+Pointset_Powerset<PS>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
 
-  //@} // Member Functions that May Modify the Powerset element
+template <typename PS>
+inline int32_t
+Pointset_Powerset<PS>::hash_code() const {
+  return space_dimension() & 0x7fffffff;
+}
 
-protected:
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this does not contain
-    non-maximal elements.
-  */
-  bool is_omega_reduced() const;
+template <typename PS>
+inline void
+Pointset_Powerset<PS>
+::poly_difference_assign(const Pointset_Powerset& y) {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  Pointset_Powerset<NNC_Polyhedron> nnc_this(*this);
+  Pointset_Powerset<NNC_Polyhedron> nnc_y(y);
+  nnc_this.poly_difference_assign(nnc_y);
+  *this = nnc_this;
+}
 
-  /*! \brief Upon return, \p *this will contain at most \p
-    max_disjuncts elements; the set of disjuncts in positions greater
-    than or equal to \p max_disjuncts, will be replaced at that
-    position by their upper-bound.
-  */
-  void collapse(unsigned max_disjuncts);
+template <typename PS>
+inline void
+Pointset_Powerset<PS>
+::difference_assign(const Pointset_Powerset& y) {
+  poly_difference_assign(y);
+}
 
-  /*! \brief
-    Adds to \p *this the disjunct \p d,
-    assuming \p d is not the bottom element and ensuring
-    partial Omega-reduction.
+/*! \relates Pointset_Powerset */
+template <typename PS>
+inline bool
+check_containment(const PS& ph, const Pointset_Powerset<PS>& ps) {
+  // This code is only used when PS is an abstraction of NNC_Polyhedron.
+  const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
+  const Pointset_Powerset<NNC_Polyhedron> pps(ps);
+  return check_containment(pph, pps);
+}
 
-    If \p d is not the bottom element and is not Omega-redundant with
-    respect to elements in positions between \p first and \p last, all
-    elements in these positions that would be made Omega-redundant by the
-    addition of \p d are dropped and \p d is added to the reduced
-    sequence.
-  */
-  iterator add_non_bottom_disjunct(const D& d,
-				   iterator first,
-				   iterator last);
+/*! \relates Pointset_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+		  const Pointset_Powerset<C_Polyhedron>& ps) {
+  return check_containment(NNC_Polyhedron(ph),
+			   Pointset_Powerset<NNC_Polyhedron>(ps));
+}
 
-  /*! \brief
-    Adds to \p *this the disjunct \p d,
-    assuming \p d is not the bottom element.
-  */
-  void add_non_bottom_disjunct(const D& d);
+} // namespace Parma_Polyhedra_Library
 
-  /*! \brief
-    Assigns to \p *this the result of applying \p op_assign pairwise
-    to the elements in \p *this and \p y.
 
-    The elements of the powerset result are obtained by applying
-    \p op_assign to each pair of elements whose components are drawn
-    from \p *this and \p y, respectively.
-  */
-  template <typename Binary_Operator_Assign>
-  void pairwise_apply_assign(const Powerset& y,
-			     Binary_Operator_Assign op_assign);
+namespace std {
 
-private:
-  /*! \brief
-    Does the hard work of checking whether \p *this contains non-maximal
-    elements and returns <CODE>true</CODE> if and only if it does not.
-  */
-  bool check_omega_reduced() const;
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+template <typename PS>
+inline void
+swap(Parma_Polyhedra_Library::Pointset_Powerset<PS>& x,
+     Parma_Polyhedra_Library::Pointset_Powerset<PS>& y) {
+  x.swap(y);
+}
 
-  /*! \brief
-    Replaces the disjunct \p *sink by an upper bound of itself and
-    all the disjuncts following it.
-  */
-  void collapse(Sequence_iterator sink);
-};
+} // namespace std
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! A %const_iterator on the disjuncts of a Powerset element.
-/*! \ingroup PPL_CXX_interface
-  This class implements a read-only bidirectional iterator
-  on the sequence of disjuncts.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.templates.hh line 1
+/* Pointset_Powerset class implementation: non-inline template functions.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-class Parma_Polyhedra_Library::Powerset<D>::omega_const_iterator {
-protected:
-  //! The type of the underlying %const_iterator.
-  typedef typename Powerset::Sequence::const_iterator Base;
 
-  //! A shortcut for naming traits.
-  typedef typename std::iterator_traits<Base> Traits;
 
-  //! A %const_iterator on the sequence of elements.
-  Base base;
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.templates.hh line 32
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
 
-  //! Constructs from the lower-level const_iterator.
-  omega_const_iterator(const Base& b);
+namespace Parma_Polyhedra_Library {
 
-  friend class Powerset;
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_disjunct(const PS& ph) {
+  Pointset_Powerset& x = *this;
+  if (x.space_dimension() != ph.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PS>::add_disjunct(ph):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "ph.space_dimension() == " << ph.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  x.sequence.push_back(Determinate<PS>(ph));
+  x.reduced = false;
+  assert(x.OK());
+}
 
-public:
-  // Same traits of the underlying const_iterator.
-  typedef typename Traits::iterator_category iterator_category;
-  typedef typename Traits::value_type value_type;
-  typedef typename Traits::difference_type difference_type;
-  typedef typename Traits::pointer pointer;
-  typedef typename Traits::reference reference;
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+			 (NNC_Polyhedron(i->element(), complexity)));
+  // FIXME: the following is a bug!
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
 
-  //! Default constructor.
-  omega_const_iterator();
+template <typename PS>
+template <typename QH>
+Pointset_Powerset<PS>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<PS>(PS(i->element(), complexity)));
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of PS may have made
+  // different QH elements to become comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  //! Copy constructor.
-  omega_const_iterator(const omega_const_iterator& y);
+template <typename PS>
+void
+Pointset_Powerset<PS>::concatenate_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  x.omega_reduce();
+  y.omega_reduce();
+  Pointset_Powerset<PS> new_x(x.space_dim + y.space_dim, EMPTY);
+  for (const_iterator xi = x.begin(), x_end = x.end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      CS zi = *xi;
+      zi.concatenate_assign(*yi);
+      assert(!zi.is_bottom());
+      new_x.sequence.push_back(zi);
+    }
+    ++xi;
+    if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
+      // Hurry up!
+      PS xph = xi->element();
+      for (++xi; xi != x_end; ++xi)
+	xph.upper_bound_assign(xi->element());
+      const_iterator yi = y_begin;
+      PS yph = yi->element();
+      for (++yi; yi != y_end; ++yi)
+	yph.upper_bound_assign(yi->element());
+      xph.concatenate_assign(yph);
+      x.swap(new_x);
+      x.add_disjunct(xph);
+      assert(x.OK());
+      return;
+    }
+  }
+  x.swap(new_x);
+  assert(x.OK());
+}
 
-  //! Constructs from the corresponding non-const iterator.
-  omega_const_iterator(const omega_iterator& y);
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraint(c);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  //! Dereference operator.
-  reference operator*() const;
+template <typename PS>
+bool
+Pointset_Powerset<PS>::add_constraint_and_minimize(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraint_and_minimize(c))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
 
-  //! Indirect member selector.
-  pointer operator->() const;
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_constraint(c);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  //! Prefix increment operator.
-  omega_const_iterator& operator++();
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraints(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  //! Postfix increment operator.
-  omega_const_iterator operator++(int);
+template <typename PS>
+bool
+Pointset_Powerset<PS>::
+add_constraints_and_minimize(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraints_and_minimize(cs))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
 
-  //! Prefix decrement operator.
-  omega_const_iterator& operator--();
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_constraints(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  //! Postfix decrement operator.
-  omega_const_iterator operator--(int);
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_congruence(const Congruence& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_congruence(c);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are identical.
-  */
-  bool operator==(const omega_const_iterator& y) const;
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_congruence(const Congruence& cg) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_congruence(cg);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are different.
-  */
-  bool operator!=(const omega_const_iterator& y) const;
-};
+template <typename PS>
+bool
+Pointset_Powerset<PS>::add_congruence_and_minimize(const Congruence& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_congruence_and_minimize(c))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! An iterator on the disjuncts of a Powerset element.
-/*! \ingroup PPL_CXX_interface
-  This class implements a <EM>read-only</EM> bidirectional iterator
-  on the sequence of disjuncts. That is, by using an instance of
-  this iterator class it is not possible to overwrite the disjuncts
-  contained in a Powerset element. However, using such an instance
-  allows for the removal of disjuncts by using methods
-  <CODE>Powerset::drop_disjunct(iterator position)</CODE> and
-  <CODE>Powerset::drop_disjuncts(iterator first, iterator last)</CODE>.
-  Such a policy is needed to allow for a reliable use of the Boolean
-  flag <CODE>Powerset::reduced</CODE>.
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_congruences(const Congruence_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_congruences(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  \note
-  For any developers' need, (low-level) iterators on the sequence of
-  disjuncts are still available by accessing the protected member
-  <CODE>Powerset::sequence</CODE>.
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-class Parma_Polyhedra_Library::Powerset<D>::omega_iterator {
-protected:
-  //! The type of the underlying mutable iterator.
-  typedef typename Powerset::Sequence::iterator Base;
+template <typename PS>
+void
+Pointset_Powerset<PS>::refine_with_congruences(const Congruence_System& cgs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().refine_with_congruences(cgs);
+  x.reduced = false;
+  assert(x.OK());
+}
 
-  //! A shortcut for naming the const_iterator traits.
-  typedef typename
-  std::iterator_traits<typename Powerset::Sequence::const_iterator> Traits;
+template <typename PS>
+bool
+Pointset_Powerset<PS>::
+add_congruences_and_minimize(const Congruence_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_congruences_and_minimize(cs))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
 
-  //! A (mutable) iterator on the sequence of elements.
-  Base base;
+template <typename PS>
+void
+Pointset_Powerset<PS>::unconstrain(const Variable var) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().unconstrain(var);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  //! Constructs from the lower-level iterator.
-  omega_iterator(const Base& b);
+template <typename PS>
+void
+Pointset_Powerset<PS>::unconstrain(const Variables_Set& to_be_unconstrained) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().unconstrain(to_be_unconstrained);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_space_dimensions_and_embed(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_embed(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
 
-  friend class Powerset;
-  friend Powerset<D>::omega_const_iterator
-  ::omega_const_iterator(const omega_iterator& y);
+template <typename PS>
+void
+Pointset_Powerset<PS>::add_space_dimensions_and_project(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_project(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
 
-public:
-  // Same traits of the const_iterator, therefore
-  // forbidding the direct modification of sequence elements.
-  typedef typename Traits::iterator_category iterator_category;
-  typedef typename Traits::value_type value_type;
-  typedef typename Traits::difference_type difference_type;
-  typedef typename Traits::pointer pointer;
-  typedef typename Traits::reference reference;
+template <typename PS>
+void
+Pointset_Powerset<PS>::
+remove_space_dimensions(const Variables_Set& to_be_removed) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_removed = to_be_removed.size();
+  if (num_removed > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_space_dimensions(to_be_removed);
+      x.reduced = false;
+    }
+    x.space_dim -= num_removed;
+    assert(x.OK());
+  }
+}
 
-  //! Default constructor.
-  omega_iterator();
+template <typename PS>
+void
+Pointset_Powerset<PS>::remove_higher_space_dimensions(dimension_type
+						      new_dimension) {
+  Pointset_Powerset& x = *this;
+  if (new_dimension < x.space_dim) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_higher_space_dimensions(new_dimension);
+      x.reduced = false;
+    }
+    x.space_dim = new_dimension;
+    assert(x.OK());
+  }
+}
 
-  //! Copy constructor.
-  omega_iterator(const omega_iterator& y);
+template <typename PS>
+template <typename Partial_Function>
+void
+Pointset_Powerset<PS>::map_space_dimensions(const Partial_Function& pfunc) {
+  Pointset_Powerset& x = *this;
+  if (x.is_bottom()) {
+    dimension_type n = 0;
+    for (dimension_type i = x.space_dim; i-- > 0; ) {
+      dimension_type new_i;
+      if (pfunc.maps(i, new_i))
+	++n;
+    }
+    x.space_dim = n;
+  }
+  else {
+    Sequence_iterator s_begin = x.sequence.begin();
+    for (Sequence_iterator si = s_begin,
+	   s_end = x.sequence.end(); si != s_end; ++si)
+      si->element().map_space_dimensions(pfunc);
+    x.space_dim = s_begin->element().space_dimension();
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  //! Dereference operator.
-  reference operator*() const;
+template <typename PS>
+void
+Pointset_Powerset<PS>::expand_space_dimension(Variable var,
+                                              dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().expand_space_dimension(var, m);
+  x.space_dim += m;
+  assert(x.OK());
+}
 
-  //! Indirect access operator.
-  pointer operator->() const;
+template <typename PS>
+void
+Pointset_Powerset<PS>::fold_space_dimensions(const Variables_Set& to_be_folded,
+                                             Variable var) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_folded = to_be_folded.size();
+  if (num_folded > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si)
+      si->element().fold_space_dimensions(to_be_folded, var);
+  }
+  x.space_dim -= num_folded;
+  assert(x.OK());
+}
 
-  //! Prefix increment operator.
-  omega_iterator& operator++();
+template <typename PS>
+void
+Pointset_Powerset<PS>::affine_image(Variable var,
+                                    const Linear_Expression& expr,
+                                    Coefficient_traits::const_reference
+                                    denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().affine_image(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  //! Postfix increment operator.
-  omega_iterator operator++(int);
+template <typename PS>
+void
+Pointset_Powerset<PS>::affine_preimage(Variable var,
+                                       const Linear_Expression& expr,
+                                       Coefficient_traits::const_reference
+                                       denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().affine_preimage(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  //! Prefix decrement operator.
-  omega_iterator& operator--();
 
-  //! Postfix decrement operator.
-  omega_iterator operator--(int);
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_image(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are identical.
-  */
-  bool operator==(const omega_iterator& y) const;
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_preimage(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if
-    \p *this and \p y are different.
-  */
-  bool operator!=(const omega_iterator& y) const;
-};
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_image(Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_image(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-namespace Parma_Polyhedra_Library {
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::generalized_affine_preimage(Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator) {  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().generalized_affine_preimage(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Mixed comparison operator: returns <CODE>true</CODE> if and only
-  if (the const version of) \p x is identical to \p y.
 
-  \relates Powerset::omega_const_iterator
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
-bool
-operator==(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y);
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().bounded_affine_image(var, lb_expr, ub_expr, denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-/*! \brief
-  Mixed comparison operator: returns <CODE>true</CODE> if and only
-  if (the const version of) \p x is different from \p y.
+template <typename PS>
+void
+Pointset_Powerset<PS>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->element().bounded_affine_preimage(var, lb_expr, ub_expr,
+                                          denominator);
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
 
-  \relates Powerset::omega_const_iterator
-*/
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename D>
+template <typename PS>
+dimension_type
+Pointset_Powerset<PS>::affine_dimension() const {
+  // The affine dimension of the powerset is the affine dimension of
+  // the smallest vector space in which it can be embedded.
+  const Pointset_Powerset& x = *this;
+  C_Polyhedron x_ph(space_dim, EMPTY);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    PS pi(si->element());
+    if (!pi.is_empty()) {
+      C_Polyhedron phi(space_dim);
+      const Constraint_System& cs = pi.minimized_constraints();
+      for (Constraint_System::const_iterator i = cs.begin(),
+             cs_end = cs.end(); i != cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_equality())
+          phi.add_constraint(c);
+      }
+      x_ph.poly_hull_assign(phi);
+    }
+  }
+
+  return x_ph.affine_dimension();
+}
+
+template <typename PS>
 bool
-operator!=(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y);
+Pointset_Powerset<PS>::is_universe() const {
+  const Pointset_Powerset& x = *this;
+  // Exploit omega-reduction, if already computed.
+  if (x.is_omega_reduced())
+    return x.size() == 1 && x.begin()->element().is_universe();
+
+  // A powerset is universe iff one of its disjuncts is.
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->element().is_universe()) {
+      // Speculative omega-reduction, if it is worth.
+      if (x.size() > 1) {
+        Pointset_Powerset<PS> universe(x.space_dimension(), UNIVERSE);
+        Pointset_Powerset& xx = const_cast<Pointset_Powerset&>(x);
+        xx.swap(universe);
+      }
+      return true;
+    }
+  return false;
+}
 
-} // namespace Parma_Polyhedra_Library
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_empty() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_empty())
+      return false;
+  return true;
+}
 
-namespace std {
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_discrete() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_discrete())
+      return false;
+  return true;
+}
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Powerset */
-template <typename D>
-void swap(Parma_Polyhedra_Library::Powerset<D>& x,
-	  Parma_Polyhedra_Library::Powerset<D>& y);
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_topologically_closed() const {
+  const Pointset_Powerset& x = *this;
+  // The powerset must be omega-reduced before checking
+  // topological closure.
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_topologically_closed())
+      return false;
+  return true;
+}
 
-} // namespace std
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_bounded() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().is_bounded())
+      return false;
+  return true;
+}
 
-// Automatically generated from PPL source file ../src/Powerset.inlines.hh line 1
-/* Powerset class implementation: inline functions.
-*/
+template <typename PS>
+bool
+Pointset_Powerset<PS>::constrains(Variable var) const {
+  const Pointset_Powerset& x = *this;
+  // `var' should be one of the dimensions of the powerset.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x.space_dimension() < var_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PS>::constrains(v):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "v.space_dimension() == " << var_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // omega_reduction needed, since a redundant disjunct may constrain var.
+  x.omega_reduce();
+  // An empty powerset constrains all variables.
+  if (x.is_empty())
+    return true;
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->element().constrains(var))
+      return true;
+  return false;
+}
 
+template <typename PS>
+bool
+Pointset_Powerset<PS>::is_disjoint_from(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    const PS& pi = si->element();
+    for (Sequence_const_iterator sj = y.sequence.begin(),
+           s_end = y.sequence.end(); sj != s_end; ++sj) {
+      const PS& pj = sj->element();
+      if (!pi.is_disjoint_from(pj))
+        return false;
+    }
+  }
+  return true;
+}
 
-#include <algorithm>
-#include <cassert>
+template <typename PS>
+void
+Pointset_Powerset<PS>::topological_closure_assign() {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().topological_closure_assign();
+  assert(x.OK());
+}
 
-namespace Parma_Polyhedra_Library {
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::intersection_preserving_enlarge_element(PS& to_be_enlarged) const {
+  // FIXME: this is just an executable specification.
+  const Pointset_Powerset& context = *this;
+  assert(context.space_dimension() == to_be_enlarged.space_dimension());
+  bool nonempty_intersection = false;
+  // TODO: maybe use a *sorted* constraint system?
+  PS enlarged(context.space_dimension(), UNIVERSE);
+  for (Sequence_const_iterator si = context.sequence.begin(),
+         s_end = context.sequence.end(); si != s_end; ++si) {
+    PS context_i(si->element());
+    context_i.intersection_assign(enlarged);
+    PS enlarged_i(to_be_enlarged);
+    nonempty_intersection
+      |= enlarged_i.simplify_using_context_assign(context_i);
+    // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'?
+    enlarged.intersection_assign(enlarged_i);
+  }
+  to_be_enlarged.swap(enlarged);
+  return nonempty_intersection;
+}
 
-template <typename D>
-inline
-Powerset<D>::omega_iterator::omega_iterator()
-  : base() {
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::simplify_using_context_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ) {
+    // TODO: check whether it would be useful (i.e., more efficient)
+    // to eagerly test whether *si is omega-redundant due to any of
+    // the elements preceding it (which have been already enlarged).
+    if (y.intersection_preserving_enlarge_element(si->element()))
+      ++si;
+    else
+      // Intersection with `*si' is empty: drop the disjunct.
+      si = x.sequence.erase(si);
+  }
+  x.reduced = false;
+  assert(x.OK());
+  return !x.sequence.empty();
 }
 
-template <typename D>
-inline
-Powerset<D>::omega_iterator::omega_iterator(const omega_iterator& y)
-  : base(y.base) {
+template <typename PS>
+bool
+Pointset_Powerset<PS>::contains(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         s_end = y.sequence.end(); si != s_end; ++si) {
+    const PS& pi = si->element();
+    bool pi_is_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           s_end = x.sequence.end();
+         (sj != s_end && !pi_is_contained); ++sj) {
+      const PS& pj = sj->element();
+      if (pj.contains(pi))
+        pi_is_contained = true;
+    }
+    if (!pi_is_contained)
+      return false;
+  }
+  return true;
 }
 
-template <typename D>
-inline
-Powerset<D>::omega_iterator::omega_iterator(const Base& b)
-  : base(b) {
+template <typename PS>
+bool
+Pointset_Powerset<PS>::strictly_contains(const Pointset_Powerset& y) const {
+  /* omega reduction ensures that a disjunct of y cannot be strictly
+     contained in one disjunct and also contained but not strictly
+     contained in another disjunct of *this */
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         s_end = y.sequence.end(); si != s_end; ++si) {
+    const PS& pi = si->element();
+    bool pi_is_strictly_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           s_end = x.sequence.end();
+         (sj != s_end && !pi_is_strictly_contained); ++sj) {
+      const PS& pj = sj->element();
+      if (pj.strictly_contains(pi))
+        pi_is_strictly_contained = true;
+    }
+    if (!pi_is_strictly_contained)
+      return false;
+  }
+  return true;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_iterator::reference
-Powerset<D>::omega_iterator::operator*() const {
-  return *base;
+template <typename PS>
+Poly_Con_Relation
+Pointset_Powerset<PS>::relation_with(const Congruence& cg) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in cg if every disjunct is included in cg */
+  bool is_included = true;
+  /* *this is disjoint with cg if every disjunct is disjoint with cg */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with cg if some disjunct strictly
+     intersects with cg */
+  bool is_strictly_intersecting = false;
+  /* *this saturates cg if some disjunct saturates cg and
+     every disjunct is either disjoint from cg or saturates cg */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->element().relation_with(cg);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_iterator::pointer
-Powerset<D>::omega_iterator::operator->() const {
-  return &*base;
+template <typename PS>
+Poly_Con_Relation
+Pointset_Powerset<PS>::relation_with(const Constraint& c) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in c if every disjunct is included in c */
+  bool is_included = true;
+  /* *this is disjoint with c if every disjunct is disjoint with c */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with c if some disjunct strictly
+     intersects with c */
+  bool is_strictly_intersecting = false;
+  /* *this saturates c if some disjunct saturates c and
+     every disjunct is either disjoint from c or saturates c */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->element().relation_with(c);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_iterator&
-Powerset<D>::omega_iterator::operator++() {
-  ++base;
-  return *this;
-}
+template <typename PS>
+Poly_Gen_Relation
+Pointset_Powerset<PS>::relation_with(const Generator& g) const {
+  const Pointset_Powerset& x = *this;
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Gen_Relation relation_i = si->element().relation_with(g);
+    if (relation_i.implies(Poly_Gen_Relation::subsumes()))
+      return Poly_Gen_Relation::subsumes();
+  }
 
-template <typename D>
-inline typename Powerset<D>::omega_iterator
-Powerset<D>::omega_iterator::operator++(int) {
-  omega_iterator tmp = *this;
-  operator++();
-  return tmp;
+  return Poly_Gen_Relation::nothing();
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_iterator&
-Powerset<D>::omega_iterator::operator--() {
-  --base;
-  return *this;
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::bounds_from_above(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().bounds_from_above(expr))
+      return false;
+  return true;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_iterator
-Powerset<D>::omega_iterator::operator--(int) {
-  omega_iterator tmp = *this;
-  operator--();
-  return tmp;
+template <typename PS>
+bool
+Pointset_Powerset<PS>
+::bounds_from_below(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->element().bounds_from_below(expr))
+      return false;
+  return true;
 }
 
-template <typename D>
-inline bool
-Powerset<D>::omega_iterator::operator==(const omega_iterator& y) const {
-  return base == y.base;
-}
+template <typename PS>
+bool
+Pointset_Powerset<PS>::maximize(const Linear_Expression& expr,
+                                Coefficient& sup_n,
+                                Coefficient& sup_d,
+                                bool& maximum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
 
-template <typename D>
-inline bool
-Powerset<D>::omega_iterator::operator!=(const omega_iterator& y) const {
-  return !operator==(y);
-}
+  Coefficient supt_n = 0;
+  Coefficient supt_d = 1;
+  bool maxt = 0;
 
-template <typename D>
-inline
-Powerset<D>::omega_const_iterator::omega_const_iterator()
-  : base() {
-}
+  Coefficient supi_n = 0;
+  Coefficient supi_d = 1;
+  bool maxi = 0;
+  TEMP_INTEGER(tmp);
 
-template <typename D>
-inline
-Powerset<D>
-::omega_const_iterator::omega_const_iterator(const omega_const_iterator& y)
-  : base(y.base) {
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().maximize(expr, supi_n, supi_d, maxi))
+      return false;
+    else
+      if (first) {
+        first = false;
+        supt_n = supi_n;
+        supt_d = supi_d;
+        maxt = maxi;
+      }
+      else {
+        tmp = (supt_n * supi_d) - (supi_n * supt_d);
+        if (tmp < 0) {
+          supt_n = supi_n;
+          supt_d = supi_d;
+          maxt = maxi;
+        }
+        else if (tmp == 0)
+          maxt = maxt || maxi;
+      }
+  }
+  sup_n = supt_n;
+  sup_d = supt_d;
+  maximum = maxt;
+  return true;
 }
 
-template <typename D>
-inline
-Powerset<D>::omega_const_iterator::omega_const_iterator(const Base& b)
-  : base(b) {
+template <typename PS>
+bool
+Pointset_Powerset<PS>::maximize(const Linear_Expression& expr,
+                                Coefficient& sup_n,
+                                Coefficient& sup_d,
+                                bool& maximum,
+                                Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
+
+  Coefficient supt_n = 0;
+  Coefficient supt_d = 1;
+  bool maxt = 0;
+  Generator gt = point();
+
+  Coefficient supi_n = 0;
+  Coefficient supi_d = 1;
+  bool maxi = 0;
+  Generator gi = point();
+  TEMP_INTEGER(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().maximize(expr, supi_n, supi_d, maxi, gi))
+      return false;
+    else
+      if (first) {
+        first = false;
+        supt_n = supi_n;
+        supt_d = supi_d;
+        maxt = maxi;
+        gt = gi;
+      }
+      else {
+        tmp = (supt_n * supi_d) - (supi_n * supt_d);
+        if (tmp < 0) {
+          supt_n = supi_n;
+          supt_d = supi_d;
+          maxt = maxi;
+          gt = gi;
+        }
+        else if (tmp == 0) {
+          maxt = maxt || maxi;
+          gt = gi;
+        }
+      }
+  }
+  sup_n = supt_n;
+  sup_d = supt_d;
+  maximum = maxt;
+  g = gt;
+  return true;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator::reference
-Powerset<D>::omega_const_iterator::operator*() const {
-  return *base;
-}
+template <typename PS>
+bool
+Pointset_Powerset<PS>::minimize(const Linear_Expression& expr,
+                                Coefficient& inf_n,
+                                Coefficient& inf_d,
+                                bool& minimum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
 
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator::pointer
-Powerset<D>::omega_const_iterator::operator->() const {
-  return &*base;
-}
+  Coefficient inft_n = 0;
+  Coefficient inft_d = 1;
+  bool mint = 0;
 
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator&
-Powerset<D>::omega_const_iterator::operator++() {
-  ++base;
-  return *this;
-}
+  Coefficient infi_n = 0;
+  Coefficient infi_d = 1;
+  bool mini = 0;
+  TEMP_INTEGER(tmp);
 
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator
-Powerset<D>::omega_const_iterator::operator++(int) {
-  omega_const_iterator tmp = *this;
-  operator++();
-  return tmp;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().minimize(expr, infi_n, infi_d, mini))
+      return false;
+    else
+      if (first) {
+        first = false;
+        inft_n = infi_n;
+        inft_d = infi_d;
+        mint = mini;
+      }
+      else {
+        tmp = (inft_n * infi_d) - (infi_n * inft_d);
+        if (tmp > 0) {
+          inft_n = infi_n;
+          inft_d = infi_d;
+          mint = mini;
+        }
+        else if (tmp == 0)
+          mint = mint || mini;
+      }
+  }
+  inf_n = inft_n;
+  inf_d = inft_d;
+  minimum = mint;
+  return true;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator&
-Powerset<D>::omega_const_iterator::operator--() {
-  --base;
-  return *this;
+template <typename PS>
+bool
+Pointset_Powerset<PS>::minimize(const Linear_Expression& expr,
+                                Coefficient& inf_n,
+                                Coefficient& inf_d,
+                                bool& minimum,
+                                Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  bool first = true;
+
+  Coefficient inft_n = 0;
+  Coefficient inft_d = 1;
+  bool mint = 0;
+  Generator gt = point();
+
+  Coefficient infi_n = 0;
+  Coefficient infi_d = 1;
+  bool mini = 0;
+  Generator gi = point();
+  TEMP_INTEGER(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->element().minimize(expr, infi_n, infi_d, mini, gi))
+      return false;
+    else
+      if (first) {
+        first = false;
+        inft_n = infi_n;
+        inft_d = infi_d;
+        mint = mini;
+        gt = gi;
+      }
+      else {
+        tmp = (inft_n * infi_d) - (infi_n * inft_d);
+        if (tmp > 0) {
+          inft_n = infi_n;
+          inft_d = infi_d;
+          mint = mini;
+          gt = gi;
+        }
+        else if (tmp == 0) {
+          mint = mint || mini;
+          gt = gi;
+        }
+      }
+  }
+  inf_n = inft_n;
+  inf_d = inft_d;
+  minimum = mint;
+  g = gt;
+  return true;
 }
 
-template <typename D>
-inline typename Powerset<D>::omega_const_iterator
-Powerset<D>::omega_const_iterator::operator--(int) {
-  omega_const_iterator tmp = *this;
-  operator--();
-  return tmp;
+template <typename PS>
+bool
+Pointset_Powerset<PS>::contains_integer_point() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (si->element().contains_integer_point())
+      return true;
+  return false;
 }
 
-template <typename D>
-inline bool
-Powerset<D>
-::omega_const_iterator::operator==(const omega_const_iterator& y) const {
-  return base == y.base;
-}
+template <typename PS>
+void
+Pointset_Powerset<PS>::pairwise_reduce() {
+  Pointset_Powerset& x = *this;
+  // It is wise to omega-reduce before pairwise-reducing.
+  x.omega_reduce();
 
-template <typename D>
-inline bool
-Powerset<D>
-::omega_const_iterator::operator!=(const omega_const_iterator& y) const {
-  return !operator==(y);
+  size_type n = x.size();
+  size_type deleted;
+  do {
+    Pointset_Powerset new_x(x.space_dim, EMPTY);
+    std::deque<bool> marked(n, false);
+    deleted = 0;
+    Sequence_iterator s_begin = x.sequence.begin();
+    Sequence_iterator s_end = x.sequence.end();
+    unsigned si_index = 0;
+    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+      if (marked[si_index])
+	continue;
+      PS& pi = si->element();
+      Sequence_const_iterator sj = si;
+      unsigned sj_index = si_index;
+      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+	if (marked[sj_index])
+	  continue;
+	const PS& pj = sj->element();
+	if (pi.upper_bound_assign_if_exact(pj)) {
+	  marked[si_index] = marked[sj_index] = true;
+	  // FIXME: check whether the preservation of reduction was
+	  // actually meant here.
+	  new_x.add_non_bottom_disjunct_preserve_reduction(pi);
+	  ++deleted;
+	  goto next;
+	}
+      }
+    next:
+      ;
+    }
+    iterator nx_begin = new_x.begin();
+    iterator nx_end = new_x.end();
+    unsigned xi_index = 0;
+    for (const_iterator xi = x.begin(),
+	   x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+      if (!marked[xi_index])
+	nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*xi,
+								    nx_begin,
+								    nx_end);
+    std::swap(x.sequence, new_x.sequence);
+    n -= deleted;
+  } while (deleted > 0);
+  assert(x.OK());
 }
 
-template <typename D>
-inline
-Powerset<D>
-::omega_const_iterator::omega_const_iterator(const omega_iterator& y)
-  : base(y.base) {
-}
+template <typename PS>
+template <typename Widening>
+void
+Pointset_Powerset<PS>::
+BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
 
-/*! \relates Powerset::omega_const_iterator */
-template <typename D>
-inline bool
-operator==(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y) {
-  return Powerset<D>::omega_const_iterator(x).operator==(y);
-}
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PS> x_copy = x;
+    const Pointset_Powerset<PS> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
 
-/*! \relates Powerset::omega_const_iterator */
-template <typename D>
-inline bool
-operator!=(const typename Powerset<D>::omega_iterator& x,
-	   const typename Powerset<D>::omega_const_iterator& y) {
-  return !(x == y);
+  size_type n = x.size();
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  std::deque<bool> marked(n, false);
+  const_iterator x_begin = x.begin();
+  const_iterator x_end = x.end();
+  unsigned i_index = 0;
+  for (const_iterator i = x_begin,
+	 y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+    for (const_iterator j = y_begin; j != y_end; ++j) {
+      const PS& pi = i->element();
+      const PS& pj = j->element();
+      if (pi.contains(pj)) {
+	PS pi_copy = pi;
+	wf(pi_copy, pj);
+	// FIXME: check whether the preservation of reduction was
+	// actually meant here.
+	new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy);
+	marked[i_index] = true;
+      }
+    }
+  iterator nx_begin = new_x.begin();
+  iterator nx_end = new_x.end();
+  i_index = 0;
+  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+    if (!marked[i_index])
+      nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*i,
+								  nx_begin,
+								  nx_end);
+  std::swap(x.sequence, new_x.sequence);
+  assert(x.OK());
+  assert(x.is_omega_reduced());
 }
 
-template <typename D>
-inline typename Powerset<D>::iterator
-Powerset<D>::begin() {
-  return sequence.begin();
-}
+template <typename PS>
+template <typename Widening>
+void
+Pointset_Powerset<PS>::
+BGP99_extrapolation_assign(const Pointset_Powerset& y,
+			   Widening wf,
+			   unsigned max_disjuncts) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
 
-template <typename D>
-inline typename Powerset<D>::iterator
-Powerset<D>::end() {
-  return sequence.end();
-}
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PS> x_copy = x;
+    const Pointset_Powerset<PS> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
 
-template <typename D>
-inline typename Powerset<D>::const_iterator
-Powerset<D>::begin() const {
-  return sequence.begin();
+  x.pairwise_reduce();
+  if (max_disjuncts != 0)
+    x.collapse(max_disjuncts);
+  x.BGP99_heuristics_assign(y, wf);
 }
 
-template <typename D>
-inline typename Powerset<D>::const_iterator
-Powerset<D>::end() const {
-  return sequence.end();
+template <typename PS>
+template <typename Cert>
+void
+Pointset_Powerset<PS>::
+collect_certificates(std::map<Cert, size_type,
+                     typename Cert::Compare>& cert_ms) const {
+  const Pointset_Powerset& x = *this;
+  assert(x.is_omega_reduced());
+  assert(cert_ms.size() == 0);
+  for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
+    Cert ph_cert(i->element());
+    ++cert_ms[ph_cert];
+  }
 }
 
-template <typename D>
-inline typename Powerset<D>::reverse_iterator
-Powerset<D>::rbegin() {
-  return reverse_iterator(end());
-}
+template <typename PS>
+template <typename Cert>
+bool
+Pointset_Powerset<PS>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                             typename Cert::Compare>& y_cert_ms
+			     ) const {
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset x_cert_ms;
+  collect_certificates(x_cert_ms);
+  typename Cert_Multiset::const_iterator
+    xi = x_cert_ms.begin(),
+    x_cert_ms_end = x_cert_ms.end(),
+    yi = y_cert_ms.begin(),
+    y_cert_ms_end = y_cert_ms.end();
+  while (xi != x_cert_ms_end && yi != y_cert_ms_end) {
+    const Cert& xi_cert = xi->first;
+    const Cert& yi_cert = yi->first;
+    switch (xi_cert.compare(yi_cert)) {
+    case 0:
+      // xi_cert == yi_cert: check the number of multiset occurrences.
+      {
+	const size_type& xi_count = xi->second;
+	const size_type& yi_count = yi->second;
+	if (xi_count == yi_count) {
+	  // Same number of occurrences: compare the next pair.
+	  ++xi;
+	  ++yi;
+	}
+	else
+	  // Different number of occurrences: can decide ordering.
+	  return xi_count < yi_count;
+	break;
+      }
+    case 1:
+      // xi_cert > yi_cert: it is not stabilizing.
+      return false;
 
-template <typename D>
-inline typename Powerset<D>::reverse_iterator
-Powerset<D>::rend() {
-  return reverse_iterator(begin());
+    case -1:
+      // xi_cert < yi_cert: it is stabilizing.
+      return true;
+    }
+  }
+  // Here xi == x_cert_ms_end or yi == y_cert_ms_end.
+  // Stabilization is achieved if `y_cert_ms' still has other elements.
+  return yi != y_cert_ms_end;
 }
 
-template <typename D>
-inline typename Powerset<D>::const_reverse_iterator
-Powerset<D>::rbegin() const {
-  return const_reverse_iterator(end());
-}
+template <typename PS>
+template <typename Cert, typename Widening>
+void
+Pointset_Powerset<PS>::BHZ03_widening_assign(const Pointset_Powerset& y,
+                                             Widening wf) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
 
-template <typename D>
-inline typename Powerset<D>::const_reverse_iterator
-Powerset<D>::rend() const {
-  return const_reverse_iterator(begin());
-}
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PS> x_copy = x;
+    const Pointset_Powerset<PS> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
 
-template <typename D>
-inline typename Powerset<D>::size_type
-Powerset<D>::size() const {
-  return sequence.size();
-}
+  // First widening technique: do nothing.
 
-template <typename D>
-inline bool
-Powerset<D>::empty() const {
-  return sequence.empty();
-}
+  // If `y' is the empty collection, do nothing.
+  assert(x.size() > 0);
+  if (y.size() == 0)
+    return;
 
-template <typename D>
-inline typename Powerset<D>::iterator
-Powerset<D>::drop_disjunct(iterator position) {
-  return sequence.erase(position.base);
-}
+  // Compute the poly-hull of `x'.
+  PS x_hull(x.space_dim, EMPTY);
+  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+    x_hull.upper_bound_assign(i->element());
 
-template <typename D>
-inline void
-Powerset<D>::drop_disjuncts(iterator first, iterator last) {
-  sequence.erase(first.base, last.base);
-}
+  // Compute the poly-hull of `y'.
+  PS y_hull(y.space_dim, EMPTY);
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    y_hull.upper_bound_assign(i->element());
+  // Compute the certificate for `y_hull'.
+  const Cert y_hull_cert(y_hull);
 
-template <typename D>
-inline void
-Powerset<D>::clear() {
-  sequence.clear();
-}
+  // If the hull is stabilizing, do nothing.
+  int hull_stabilization = y_hull_cert.compare(x_hull);
+  if (hull_stabilization == 1)
+    return;
 
-template <typename D>
-inline
-Powerset<D>::Powerset(const Powerset& y)
-  : sequence(y.sequence), reduced(y.reduced) {
-}
+  // Multiset ordering is only useful when `y' is not a singleton.
+  const bool y_is_not_a_singleton = y.size() > 1;
 
-template <typename D>
-inline Powerset<D>&
-Powerset<D>::operator=(const Powerset& y) {
-  sequence = y.sequence;
-  reduced = y.reduced;
-  return *this;
-}
+  // The multiset certificate for `y':
+  // we want to be lazy about its computation.
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset y_cert_ms;
+  bool y_cert_ms_computed = false;
 
-template <typename D>
-inline void
-Powerset<D>::swap(Powerset& y) {
-  std::swap(sequence, y.sequence);
-  std::swap(reduced, y.reduced);
-}
+  if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // Collect the multiset certificate for `y'.
+    y.collect_certificates(y_cert_ms);
+    y_cert_ms_computed = true;
+    // If multiset ordering is stabilizing, do nothing.
+    if (x.is_cert_multiset_stabilizing(y_cert_ms))
+      return;
+  }
 
-template <typename D>
-inline
-Powerset<D>::Powerset()
-  : sequence(), reduced(true) {
-}
+  // Second widening technique: try the BGP99 powerset heuristics.
+  Pointset_Powerset<PS> bgp99_heuristics = x;
+  bgp99_heuristics.BGP99_heuristics_assign(y, wf);
 
-template <typename D>
-inline
-Powerset<D>::Powerset(const D& d)
-  : sequence(), reduced(true) {
-  if (!d.is_bottom())
-    sequence.push_back(d);
-  assert(OK());
-}
+  // Compute the poly-hull of `bgp99_heuristics'.
+  PS bgp99_heuristics_hull(x.space_dim, EMPTY);
+  for (const_iterator i = bgp99_heuristics.begin(),
+	 bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
+    bgp99_heuristics_hull.upper_bound_assign(i->element());
 
-template <typename D>
-inline
-Powerset<D>::~Powerset() {
-}
+  // Check for stabilization and, if successful,
+  // commit to the result of the extrapolation.
+  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+  if (hull_stabilization == 1) {
+    // The poly-hull is stabilizing.
+    std::swap(x, bgp99_heuristics);
+    return;
+  }
+  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // If not already done, compute multiset certificate for `y'.
+    if (!y_cert_ms_computed) {
+      y.collect_certificates(y_cert_ms);
+      y_cert_ms_computed = true;
+    }
+    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, bgp99_heuristics);
+      return;
+    }
+    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+    // Note that pairwise-reduction does not affect the computation
+    // of the poly-hulls, so that we only have to check the multiset
+    // certificate relation.
+    Pointset_Powerset<PS> reduced_bgp99_heuristics(bgp99_heuristics);
+    reduced_bgp99_heuristics.pairwise_reduce();
+    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, reduced_bgp99_heuristics);
+      return;
+    }
+  }
 
-template <typename D>
-inline void
-Powerset<D>::add_non_bottom_disjunct(const D& d) {
-  assert(!d.is_bottom());
-  add_non_bottom_disjunct(d, begin(), end());
-}
+  // Fourth widening technique: this is applicable only when
+  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+    // Compute (y_hull \widen bgp99_heuristics_hull).
+    PS ph = bgp99_heuristics_hull;
+    wf(ph, y_hull);
+    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+    ph.difference_assign(bgp99_heuristics_hull);
+    x.add_disjunct(ph);
+    return;
+  }
 
-template <typename D>
-inline void
-Powerset<D>::add_disjunct(const D& d) {
-  if (!d.is_bottom())
-    add_non_bottom_disjunct(d);
+  // Fall back to the computation of the poly-hull.
+  Pointset_Powerset<PS> x_hull_singleton(x.space_dim, EMPTY);
+  x_hull_singleton.add_disjunct(x_hull);
+  std::swap(x, x_hull_singleton);
 }
 
-/*! \relates Powerset */
-template <typename D>
-inline
-bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
-  return !(x == y);
+template <typename PS>
+void
+Pointset_Powerset<PS>::ascii_dump(std::ostream& s) const {
+  const Pointset_Powerset& x = *this;
+  s << "size " << x.size()
+    << "\nspace_dim " << x.space_dim
+    << "\n";
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+    xi->element().ascii_dump(s);
 }
 
-template <typename D>
-inline bool
-Powerset<D>::is_top() const {
-  // Must perform omega-reduction for correctness.
-  omega_reduce();
-  const_iterator xi = begin();
-  const_iterator x_end = end();
-  return xi != x_end && xi->is_top() && ++xi == x_end;
-}
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PS, Pointset_Powerset<PS>)
 
-template <typename D>
-inline bool
-Powerset<D>::is_bottom() const {
-  // Must perform omega-reduction for correctness.
-  omega_reduce();
-  return empty();
-}
+  template <typename PS>
+bool
+Pointset_Powerset<PS>::ascii_load(std::istream& s) {
+  Pointset_Powerset& x = *this;
+  std::string str;
 
-template <typename D>
-inline void
-Powerset<D>::collapse() {
-  if (!empty())
-    collapse(sequence.begin());
-}
+  if (!(s >> str) || str != "size")
+    return false;
 
-template <typename D>
-inline void
-Powerset<D>::meet_assign(const Powerset& y) {
-  pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+  size_type sz;
+
+  if (!(s >> sz))
+    return false;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> x.space_dim))
+    return false;
+
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  while (sz-- > 0) {
+    PS ph;
+    if (!ph.ascii_load(s))
+      return false;
+    new_x.add_disjunct(ph);
+  }
+  x.swap(new_x);
+
+  // Check invariants.
+  assert(x.OK());
+  return true;
 }
 
-template <typename D>
-inline void
-Powerset<D>::upper_bound_assign(const Powerset& y) {
-  least_upper_bound_assign(y);
+template <typename PS>
+bool
+Pointset_Powerset<PS>::OK() const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+    const PS& pi = xi->element();
+    if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+		<< " in an element of the sequence,\nshould be "
+		<< x.space_dim << "."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  return x.Base::OK();
 }
 
-template <typename D>
-inline memory_size_type
-Powerset<D>::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
+namespace Implementation {
+
+namespace Pointset_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p qq according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p qq and constraint \p c is stored
+  in \p qq, whereas the intersection of \p qq with the negation of \p c
+  is added as a new disjunct of the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PS>
+void
+linear_partition_aux(const Constraint& c,
+		     PS& qq,
+		     Pointset_Powerset<NNC_Polyhedron>& r) {
+  Linear_Expression le(c);
+  const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+  NNC_Polyhedron qqq(qq);
+  qqq.add_constraint(neg_c);
+  if (!qqq.is_empty())
+    r.add_disjunct(qqq);
+  qq.add_constraint(c);
 }
 
-} // namespace Parma_Polyhedra_Library
+} // namespace Pointset_Powersets
+
+} // namespace Implementation
 
 
-namespace std {
+/*! \relates Pointset_Powerset */
+template <typename PS>
+std::pair<PS, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PS& p, const PS& q) {
+  using Implementation::Pointset_Powersets::linear_partition_aux;
 
-/*! \relates Parma_Polyhedra_Library::Powerset */
-template <typename D>
-inline void
-swap(Parma_Polyhedra_Library::Powerset<D>& x,
-     Parma_Polyhedra_Library::Powerset<D>& y) {
-  x.swap(y);
+  Pointset_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+  PS qq = q;
+  const Constraint_System& pcs = p.constraints();
+  for (Constraint_System::const_iterator i = pcs.begin(),
+	 pcs_end = pcs.end(); i != pcs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality()) {
+      Linear_Expression le(c);
+      linear_partition_aux(le <= 0, qq, r);
+      linear_partition_aux(le >= 0, qq, r);
+    }
+    else
+      linear_partition_aux(c, qq, r);
+  }
+  return std::make_pair(qq, r);
 }
 
-} // namespace std
+} // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Powerset.templates.hh line 1
-/* Powerset class implementation: non-inline template functions.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Pointset_Powerset.defs.hh line 1448
+
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.templates.hh line 1
+/* Partially_Reduced_Product class implementation:
+   non-inline template functions.
 */
 
 
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Partially_Reduced_Product.templates.hh line 30
 #include <algorithm>
-#include <cassert>
-#include <iostream>
+#include <deque>
 
 namespace Parma_Polyhedra_Library {
 
-template <typename D>
-void
-Powerset<D>::collapse(const Sequence_iterator sink) {
-  assert(sink != sequence.end());
-  D& d = *sink;
-  iterator x_sink = sink;
-  iterator next_x_sink = x_sink;
-  ++next_x_sink;
-  iterator x_end = end();
-  for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
-    d.upper_bound_assign(*xi);
-  // Drop the surplus disjuncts.
-  drop_disjuncts(next_x_sink, x_end);
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+	 cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  return cs;
+}
 
-  // Ensure omega-reduction.
-  for (iterator xi = begin(); xi != x_sink; )
-    if (xi->definitely_entails(d))
-      xi = drop_disjunct(xi);
-    else
-      ++xi;
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::minimized_constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+	 cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  if (cs.has_strict_inequalities()) {
+    NNC_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+  else {
+    C_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+}
 
-  assert(OK());
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+	 cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  return cgs;
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::minimized_congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+	 cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  Grid gr(cgs);
+  return gr.minimized_congruences();
 }
 
-template <typename D>
+template <typename D1, typename D2, typename R>
 void
-Powerset<D>::omega_reduce() const {
-  if (reduced)
-    return;
-
-  Powerset& x = const_cast<Powerset&>(*this);
-  // First remove all bottom elements.
-  for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
-    if (xi->is_bottom())
-      xi = x.drop_disjunct(xi);
-    else
-      ++xi;
-  // Then remove non-maximal elements.
-  for (iterator xi = x.begin(); xi != x.end(); ) {
-    const D& xv = *xi;
-    bool dropping_xi = false;
-    for (iterator yi = x.begin(); yi != x.end(); )
-      if (xi == yi)
-	++yi;
-      else {
-	const D& yv = *yi;
-	if (yv.definitely_entails(xv))
-	  yi = x.drop_disjunct(yi);
-	else if (xv.definitely_entails(yv)) {
-	  dropping_xi = true;
-	  break;
-	}
-	else
-	  ++yi;
-      }
-    if (dropping_xi)
-      xi = x.drop_disjunct(xi);
-    else
-      ++xi;
-    if (abandon_expensive_computations && xi != x.end()) {
-      // Hurry up!
-      x.collapse(xi.base);
-      break;
-    }
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_constraints(Constraint_System& cs) {
+  if (d1.can_recycle_constraint_systems()) {
+    d2.add_constraints(cs);
+    d1.add_recycled_constraints(cs);
   }
-  reduced = true;
-  assert(OK());
+  else
+    if (d2.can_recycle_constraint_systems()) {
+      d1.add_constraints(cs);
+      d2.add_recycled_constraints(cs);
+    }
+    else {
+      d1.add_constraints(cs);
+      d2.add_constraints(cs);
+    }
+  clear_reduced_flag();
 }
 
-template <typename D>
+template <typename D1, typename D2, typename R>
 void
-Powerset<D>::collapse(const unsigned max_disjuncts) {
-  assert(max_disjuncts > 0);
-  // Omega-reduce before counting the number of disjuncts.
-  omega_reduce();
-  size_type n = size();
-  if (n > max_disjuncts) {
-    // Let `i' point to the last disjunct that will survive.
-    iterator i = begin();
-    std::advance(i, max_disjuncts-1);
-    // This disjunct will be assigned an upper-bound of itself and of
-    // all the disjuncts that follow.
-    collapse(i.base);
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_congruences(Congruence_System& cgs) {
+  if (d1.can_recycle_congruence_systems()) {
+    d2.add_congruences(cgs);
+    d1.add_recycled_congruences(cgs);
   }
-  assert(OK());
-  assert(is_omega_reduced());
+  else
+    if (d2.can_recycle_congruence_systems()) {
+      d1.add_congruences(cgs);
+      d2.add_recycled_congruences(cgs);
+    }
+    else {
+      d1.add_congruences(cgs);
+      d2.add_congruences(cgs);
+    }
+  clear_reduced_flag();
 }
 
-template <typename D>
+template <typename D1, typename D2, typename R>
+Poly_Gen_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Generator& g) const {
+  reduce();
+  if (Poly_Gen_Relation::nothing() == d1.relation_with(g)
+      || Poly_Gen_Relation::nothing() == d2.relation_with(g))
+    return Poly_Gen_Relation::nothing();
+  else
+    return Poly_Gen_Relation::subsumes();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Constraint& c) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(c);
+  Poly_Con_Relation relation2 = d2.relation_with(c);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Congruence& cg) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(cg);
+  Poly_Con_Relation relation2 = d2.relation_with(cg);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
 bool
-Powerset<D>::check_omega_reduced() const {
-  for (const_iterator x_begin = begin(), x_end = end(),
-	 xi = x_begin; xi != x_end; ++xi) {
-    const D& xv = *xi;
-    if (xv.is_bottom())
-      return false;
-    for (const_iterator yi = x_begin; yi != x_end; ++yi) {
-      if (xi == yi)
-	continue;
-      const D& yv = *yi;
-      if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
-	return false;
-    }
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+	   Coefficient& sup_n,
+	   Coefficient& sup_d,
+	   bool& maximum) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient sup1_n;
+  Coefficient sup1_d;
+  Coefficient sup2_n;
+  Coefficient sup2_d;
+  bool maximum1;
+  bool maximum2;
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
   }
   return true;
-}
+ }
 
-template <typename D>
+template <typename D1, typename D2, typename R>
 bool
-Powerset<D>::is_omega_reduced() const {
-  if (!reduced && check_omega_reduced())
-    reduced = true;
-  return reduced;
-}
-
-template <typename D>
-typename Powerset<D>::iterator
-Powerset<D>::add_non_bottom_disjunct(const D& d,
-				      iterator first,
-				      iterator last) {
-  for (iterator xi = first; xi != last; ) {
-    const D& xv = *xi;
-    if (d.definitely_entails(xv))
-      return first;
-    else if (xv.definitely_entails(d)) {
-      if (xi == first)
-	++first;
-      xi = drop_disjunct(xi);
-    }
-    else
-      ++xi;
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+	   Coefficient& inf_n,
+	   Coefficient& inf_d,
+	   bool& minimum) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient inf1_n;
+  Coefficient inf1_d;
+  Coefficient inf2_n;
+  Coefficient inf2_d;
+  bool minimum1;
+  bool minimum2;
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    return true;
   }
-  sequence.push_back(d);
-  return first;
-}
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+  }
+  return true;
+ }
 
-template <typename D>
+template <typename D1, typename D2, typename R>
 bool
-Powerset<D>::definitely_entails(const Powerset& y) const {
-  const Powerset<D>& x = *this;
-  bool found = true;
-  for (const_iterator xi = x.begin(),
-	 x_end = x.end(); found && xi != x_end; ++xi) {
-    found = false;
-    for (const_iterator yi = y.begin(),
-	   y_end = y.end(); !found && yi != y_end; ++yi)
-      found = (*xi).definitely_entails(*yi);
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+	   Coefficient& sup_n,
+	   Coefficient& sup_d,
+	   bool& maximum,
+	   Generator& pnt) const {
+  reduce();
+  if (is_empty())
+    return false;
+  Coefficient sup1_n;
+  Coefficient sup1_d;
+  Coefficient sup2_n;
+  Coefficient sup2_d;
+  bool maximum1;
+  bool maximum2;
+  Generator pnt1(point());
+  Generator pnt2(point());
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, pnt1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, pnt2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    pnt = pnt2;
+    return true;
   }
-  return found;
-}
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    pnt = pnt1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    pnt = pnt1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    pnt = pnt2;
+  }
+  return true;
+ }
 
-/*! \relates Powerset */
-template <typename D>
+template <typename D1, typename D2, typename R>
 bool
-operator==(const Powerset<D>& x, const Powerset<D>& y) {
-  x.omega_reduce();
-  y.omega_reduce();
-  if (x.size() != y.size())
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+	   Coefficient& inf_n,
+	   Coefficient& inf_d,
+	   bool& minimum,
+	   Generator& pnt) const {
+  reduce();
+  if (is_empty())
     return false;
-  // Take a copy of `y' and work with it.
-  Powerset<D> yy = y;
-  for (typename Powerset<D>::const_iterator xi = x.begin(),
-	 x_end = x.end(); xi != x_end; ++xi) {
-    typename Powerset<D>::iterator yyi = yy.begin();
-    typename Powerset<D>::iterator yy_end = yy.end();
-    yyi = std::find(yyi, yy_end, *xi);
-    if (yyi == yy_end)
-      return false;
-    else
-      yy.drop_disjunct(yyi);
+  Coefficient inf1_n;
+  Coefficient inf1_d;
+  Coefficient inf2_n;
+  Coefficient inf2_d;
+  bool minimum1;
+  bool minimum2;
+  Generator pnt1(point());
+  Generator pnt2(point());
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, pnt1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, pnt2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    pnt = pnt2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    pnt = pnt1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    pnt = pnt1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    pnt = pnt2;
   }
   return true;
-}
+ }
 
-template <typename D>
-template <typename Binary_Operator_Assign>
-void
-Powerset<D>::pairwise_apply_assign(const Powerset& y,
-				    Binary_Operator_Assign op_assign) {
-  // Ensure omega-reduction here, since what follows has quadratic complexity.
-  omega_reduce();
-  y.omega_reduce();
-  Sequence new_sequence;
-  for (const_iterator xi = begin(), x_end = end(),
-	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
-    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
-      D zi = *xi;
-      op_assign(zi, *yi);
-      if (!zi.is_bottom())
-	new_sequence.push_back(zi);
-    }
-  // Put the new sequence in place.
-  std::swap(sequence, new_sequence);
-  reduced = false;
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::OK() const {
+  if (reduced) {
+    Partially_Reduced_Product<D1, D2, R> pd1 = *this;
+    Partially_Reduced_Product<D1, D2, R> pd2 = *this;
+    /* Force pd1 reduction */
+    pd1.clear_reduced_flag();
+    pd1.reduce();
+    if (pd1 != pd2)
+      return false;
+  }
+  return d1.OK() && d2.OK();
 }
 
-template <typename D>
-void
-Powerset<D>::least_upper_bound_assign(const Powerset& y) {
-  // Ensure omega-reduction here, since what follows has quadratic complexity.
-  omega_reduce();
-  y.omega_reduce();
-  iterator old_begin = begin();
-  iterator old_end = end();
-  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
-    old_begin = add_non_bottom_disjunct(*i, old_begin, old_end);
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>::ascii_load(std::istream& s) {
+  std::string str;
+  return ((s >> str) && str == "Domain"
+	  && (s >> str) && str == "1:"
+	  && d1.ascii_load(s)
+	  && (s >> str) && str == "Domain"
+	  && (s >> str) && str == "2:"
+	  && d2.ascii_load(s));
 }
 
-namespace IO_Operators {
-
-/*! \relates Parma_Polyhedra_Library::Powerset */
-template <typename D>
-std::ostream&
-operator<<(std::ostream& s, const Powerset<D>& x) {
-  if (x.is_bottom())
-    s << "false";
-  else if (x.is_top())
-    s << "true";
-  else
-    for (typename Powerset<D>::const_iterator i = x.begin(),
-	   x_end = x.end(); i != x_end; ) {
-      s << "{ " << *i++ << " }";
-      if (i != x_end)
-	s << ", ";
-    }
-  return s;
-}
+} // namespace Parma_Polyhedra_Library
 
-} // namespace IO_Operators
+namespace Parma_Polyhedra_Library {
 
-template <typename D>
-memory_size_type
-Powerset<D>::external_memory_in_bytes() const {
-  memory_size_type bytes = 0;
-  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
-    bytes += xi->total_memory_in_bytes();
-    // We assume there is at least a forward and a backward link, and
-    // that the pointers implementing them are at least the size of
-    // pointers to `D'.
-    bytes += 2*sizeof(D*);
-  }
-  return bytes;
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::Smash_Reduction() {
 }
 
-template <typename D>
-bool
-Powerset<D>::OK(const bool disallow_bottom) const {
-  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
-    if (!xi->OK())
-      return false;
-    if (disallow_bottom && xi->is_bottom()) {
-#ifndef NDEBUG
-      std::cerr << "Bottom element in powerset!"
-		<< std::endl;
-#endif
-      return false;
+template <typename D1, typename D2>
+void Smash_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d2.is_empty()) {
+    if (!d1.is_empty()) {
+      D1 new_d1(d1.space_dimension(), EMPTY);
+      std::swap(d1, new_d1);
     }
   }
-  if (reduced && !check_omega_reduced()) {
-#ifndef NDEBUG
-    std::cerr << "Powerset claims to be reduced, but it is not!"
-	      << std::endl;
-#endif
-    return false;
+  else if (d1.is_empty()) {
+    D2 new_d2(d2.space_dimension(), EMPTY);
+    std::swap(d2, new_d2);
   }
-  return true;
 }
 
-} // namespace Parma_Polyhedra_Library
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::~Smash_Reduction() {
+}
 
-// Automatically generated from PPL source file ../src/Powerset.defs.hh line 619
+} // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.types.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Any_Pointset.types.hh line 1
 
 
 namespace Parma_Polyhedra_Library {
 
-template <typename PH>
-class Polyhedra_Powerset;
+class Any_Pointset;
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 1
-/* Polyhedra_Powerset class declaration.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Any_Pointset.defs.hh line 1
+/* Any_Pointset class declaration.
 */
 
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 39
-#include <iosfwd>
-#include <list>
-#include <map>
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Any_Pointset.defs.hh line 33
 
-//! The powerset construction instantiated on PPL polyhedra.
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Any_Pointset
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty pointset;
+  <CODE>true</CODE> is written if \p ph is a universe pointset;
+  a minimized system of constraints and congruences \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Any_Pointset& ph);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same pointset.
+
+  \relates Any_Pointset
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  pointsets: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Any_Pointset& x, const Any_Pointset& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different pointsets.
+
+  \relates Any_Pointset
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  pointsets: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Any_Pointset& x, const Any_Pointset& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! Any PPL pointset.
 /*! \ingroup PPL_CXX_interface */
-template <typename PH>
-class Parma_Polyhedra_Library::Polyhedra_Powerset
-  : public Parma_Polyhedra_Library::Powerset
-<Parma_Polyhedra_Library::Determinate<PH> > {
+class Parma_Polyhedra_Library::Any_Pointset {
 public:
-  typedef PH element_type;
+#if 0
+  //! Returns the maximum space dimension all pointsets can handle.
+  static dimension_type max_space_dimension();
+#endif
 
-private:
-  typedef Determinate<PH> CS;
-  typedef Powerset<CS> Base;
+  //! Default constructor.
+  Any_Pointset();
+
+  //! Ordinary copy-constructor.
+  Any_Pointset(const Any_Pointset& y);
+
+  //! \name Member Functions that Do Not Modify the Pointset
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  virtual dimension_type space_dimension() const = 0;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  virtual dimension_type affine_dimension() const = 0;
+
+  //! Returns a system of constraints that \p *this satisfies.
+  virtual Constraint_System constraints() const = 0;
+
+#if 0
+  //! Returns a system of congruences that \p *this satisfies.
+  virtual Congruence_System congruences() const = 0;
+#endif
+
+  /*! \brief
+    Returns the relations holding between the pointset \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the pointset \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty pointset.
+  */
+  virtual bool is_empty() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe pointset.
+  */
+  virtual bool is_universe() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  virtual bool is_topologically_closed() const = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  virtual bool is_discrete() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded pointset.
+  */
+  virtual bool is_bounded() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  virtual bool contains_integer_point() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  virtual bool bounds_from_above(const Linear_Expression& expr) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  virtual bool bounds_from_below(const Linear_Expression& expr) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  virtual bool
+  maximize(const Linear_Expression& expr,
+	   Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param point
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  virtual bool maximize(const Linear_Expression& expr,
+			Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+			Generator& point) const = 0;
 
-public:
-  //! Returns the maximum space dimension a Polyhedra_Powerset<PH> can handle.
-  static dimension_type max_space_dimension();
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
 
-  //! \name Constructors
-  //@{
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-  //! Builds a universe (top) or empty (bottom) Polyhedra_Powerset.
-  /*!
-    \param num_dimensions
-    The number of dimensions of the vector space enclosing the powerset;
+    \param inf_n
+    The numerator of the infimum value;
 
-    \param kind
-    Specifies whether the universe or the empty powerset has to be built.
-  */
-  explicit
-  Polyhedra_Powerset(dimension_type num_dimensions = 0,
-		     Degenerate_Element kind = UNIVERSE);
+    \param inf_d
+    The denominator of the infimum value;
 
-  //! Ordinary copy-constructor.
-  Polyhedra_Powerset(const Polyhedra_Powerset& y);
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
 
-  /*! \brief
-    If \p ph is nonempty, builds a powerset containing only \p ph.
-    Builds the empty powerset otherwise.
-  */
-  explicit Polyhedra_Powerset(const PH& ph);
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-  /*! \brief
-    Copy-constructor allowing a source powerset with elements of a
-    different polyhedron kind.
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
   */
-  template <typename QH>
-  explicit Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+  virtual bool
+  minimize(const Linear_Expression& expr,
+	   Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const = 0;
 
   /*! \brief
-    Creates a Polyhedra_Powerset with a single polyhedron
-    with the same information contents as \p cs.
-  */
-  explicit Polyhedra_Powerset(const Constraint_System& cs);
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
 
-  //! Creates a Polyhedra_Powerset with a single polyhedron
-  //! with the same information contents as \p cgs.
-  explicit Polyhedra_Powerset(const Congruence_System& cgs);
+    \param expr
+    The linear expression to be minimized subject to \p *this;
 
-  //@} // Constructors and Destructor
+    \param inf_n
+    The numerator of the infimum value;
 
-  //! \name Member Functions that Do Not Modify the Powerset of Polyhedra
-  //@{
+    \param inf_d
+    The denominator of the infimum value;
 
-  //! Returns the dimension of the vector space enclosing \p *this.
-  dimension_type space_dimension() const;
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this geometrically
-    covers \p y, i.e., if any point (in some element) of \p y is also
-    a point (of some element) of \p *this.
+    \param point
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
+    Thrown if \p expr and \p *this are dimension-incompatible.
 
-    \warning
-    This may be <EM>really</EM> expensive!
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
   */
-  bool geometrically_covers(const Polyhedra_Powerset& y) const;
-
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if \p *this is geometrically
-    equal to \p y, i.e., if (the elements of) \p *this and \p y
-    contain the same set of points.
+  virtual bool minimize(const Linear_Expression& expr,
+			Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+			Generator& point) const = 0;
 
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
     \exception std::invalid_argument
     Thrown if \p *this and \p y are topology-incompatible or
     dimension-incompatible.
-
-    \warning
-    This may be <EM>really</EM> expensive!
   */
-  bool geometrically_equals(const Polyhedra_Powerset& y) const;
+  virtual bool contains(const Any_Pointset& y) const = 0;
 
-  /*! \brief
-    Returns a lower bound to the total size in bytes of the memory
-    occupied by \p *this.
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
   */
-  memory_size_type total_memory_in_bytes() const;
+  virtual bool strictly_contains(const Any_Pointset& y) const = 0;
 
-  /*! \brief
-    Returns a lower bound to the size in bytes of the memory
-    managed by \p *this.
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
   */
-  memory_size_type external_memory_in_bytes() const;
+  virtual bool is_disjoint_from(const Any_Pointset& y) const = 0;
 
   //! Checks if all the invariants are satisfied.
-  bool OK() const;
+  virtual bool OK() const = 0;
 
-  //@} // Member Functions that Do Not Modify the Powerset
+  //@} // Member Functions that Do Not Modify the Any_Pointset
 
-  //! \name Space Dimension Preserving Member Functions that May Modify the Powerset of Polyhedra
+  //! \name Space Dimension Preserving Member Functions that May Modify the Any_Pointset
   //@{
 
-  //! Adds to \p *this the disjunct \p ph.
-  /*!
-    \exception std::invalid_argument
-    Thrown if \p *this and \p ph are dimension-incompatible.
-  */
-  void add_disjunct(const PH& ph);
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
 
-  //! Intersects \p *this with constraint \p c.
-  /*!
     \exception std::invalid_argument
     Thrown if \p *this and constraint \p c are topology-incompatible
     or dimension-incompatible.
   */
-  void add_constraint(const Constraint& c);
+  virtual void add_constraint(const Constraint& c) = 0;
 
-  //! Intersects \p *this with the constraint \p c, minimizing the result.
-  /*!
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+#if 0
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p c are topology-incompatible or
-    dimension-incompatible.
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty pointset and
+    \p g is not a point.
   */
-  bool add_constraint_and_minimize(const Constraint& c);
+  virtual void add_generator(const Generator& g) = 0;
 
-  //! Intersects \p *this with the constraints in \p cs.
-  /*!
-    \param cs
-    The constraints to intersect with.
+  //! Domain compatibility method.
+  virtual void add_grid_generator(const Grid_Generator& g) const = 0;
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p cs are topology-incompatible or
-    dimension-incompatible.
+    Thrown if \p *this and congruence \p cg are topology-incompatible
+    or dimension-incompatible.
   */
-  void add_constraints(const Constraint_System& cs);
+  virtual void add_congruence(const Congruence& cg) = 0;
+#endif
 
   /*! \brief
-    Intersects \p *this with the constraints in \p cs,
-    minimizing the result.
-
-    \return
-    <CODE>false</CODE> if and only if the result is empty.
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
 
     \param cs
-    The constraints to intersect with.
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
 
     \exception std::invalid_argument
     Thrown if \p *this and \p cs are topology-incompatible or
     dimension-incompatible.
   */
-  bool add_constraints_and_minimize(const Constraint_System& cs);
-
-  /*! \brief
-    Assign to \p *this the result of (recursively) merging together
-    the pairs of polyhedra whose poly-hull is the same as their
-    set-theoretical union.
-
-    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different polyhedra
-    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
-  */
-  void pairwise_reduce();
+  virtual void add_constraints(const Constraint_System& cs) = 0;
 
+#if 0
   /*! \brief
-    Assigns to \p *this the result of applying the
-    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
-    to \p *this and \p y, using the widening function \p wf
-    and the cardinality threshold \p max_disjuncts.
-
-    \param y
-    A finite powerset of polyhedra.
-    It <EM>must</EM> definitely entail \p *this;
-
-    \param wf
-    The widening function to be used on polyhedra objects. It is obtained
-    from the corresponding widening method by using the helper function
-    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
-    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
-    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
 
-    \param max_disjuncts
-    The maximum number of disjuncts occurring in the powerset \p *this
-    <EM>before</EM> starting the computation. If this number is exceeded,
-    some of the disjuncts in \p *this are collapsed (i.e., joined together).
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
-    dimension-incompatible.
-
-    For a description of the extrapolation operator,
-    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
   */
-  template <typename Widening>
-  void BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
-				  Widening wf,
-				  unsigned max_disjuncts);
+  virtual void add_generators(const Generator_System& gs) = 0;
 
   /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref pps_certificate_widening "BHZ03-widening"
-    between \p *this and \p y, using the widening function \p wf
-    certified by the convergence certificate \p Cert.
-
-    \param y
-    The finite powerset of polyhedra computed in the previous iteration step.
-    It <EM>must</EM> definitely entail \p *this;
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
 
-    \param wf
-    The widening function to be used on polyhedra objects.
-    It is obtained from the corresponding widening method by using
-    the helper function widen_fun_ref. Legal values are, e.g.,
-    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
-    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
 
     \exception std::invalid_argument
-    Thrown if \p *this and \p y are topology-incompatible or
+    Thrown if \p *this and \p cgs are topology-incompatible or
     dimension-incompatible.
-
-    \warning
-    In order to obtain a proper widening operator, the template parameter
-    \p Cert should be a finite convergence certificate for the base-level
-    widening function \p wf; otherwise, an extrapolation operator is
-    obtained.
-    For a description of the methods that should be provided
-    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
   */
-  template <typename Cert, typename Widening>
-  void BHZ03_widening_assign(const Polyhedra_Powerset& y, Widening wf);
+  virtual void add_congruences(const Congruence_System& cgs) = 0;
+#endif
 
-  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
 
-  //! \name Member Functions that May Modify the Dimension of the Vector Space
-  //@{
+    \param var
+    The space dimension that will be unconstrained.
 
-  /*! \brief
-    The assignment operator
-    (\p *this and \p y can be dimension-incompatible).
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
   */
-  Polyhedra_Powerset& operator=(const Polyhedra_Powerset& y);
+  virtual void unconstrain(Variable var) = 0;
 
   /*! \brief
-    Assignment operator allowing a source powerset with elements of a
-    different polyhedron kind
-    (\p *this and \p y can be dimension-incompatible).
-  */
-  template <typename QH>
-  Polyhedra_Powerset& operator=(const Polyhedra_Powerset<QH>& y);
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p to_be_unconstrained,
+    assigning the result to \p *this.
 
-  //! Swaps \p *this with \p y.
-  void swap(Polyhedra_Powerset& y);
+    \param to_be_unconstrained
+    The set of space dimension that will be unconstrained.
 
-  /*! \brief
-    Adds \p m new dimensions to the vector space containing \p *this
-    and embeds each polyhedron in \p *this in the new space.
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
   */
-  void add_space_dimensions_and_embed(dimension_type m);
+  virtual void unconstrain(const Variables_Set& to_be_unconstrained) = 0;
 
   /*! \brief
-    Adds \p m new dimensions to the vector space containing \p *this
-    without embedding the polyhedra in \p *this in the new space.
-  */
-  void add_space_dimensions_and_project(dimension_type m);
-
-  //! Assigns to \p *this the intersection of \p *this and \p y.
-  /*!
-    The result is obtained by intersecting each polyhedron in \p *this
-    with each polyhedron in \p y and collecting all these intersections.
-  */
-  void intersection_assign(const Polyhedra_Powerset& y);
+    Assigns to \p *this the intersection of \p *this and \p y.
+    The result is not guaranteed to be minimized.
 
-  //! Assigns to \p *this the difference of \p *this and \p y.
-  /*!
-    The result is obtained by computing the
-    \ref Convex_Polyhedral_Difference "poly-difference" of each polyhedron
-    in \p *this with each polyhedron in \p y and collecting all these
-    differences.
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
   */
-  void poly_difference_assign(const Polyhedra_Powerset& y);
+  virtual void intersection_assign(const Any_Pointset& y) = 0;
 
-  //! Assigns to \p *this the concatenation of \p *this and \p y.
-  /*!
-    The result is obtained by computing the pairwise
-    \ref Concatenating_Polyhedra "concatenation" of each polyhedron
-    in \p *this with each polyhedron in \p y.
-  */
-  void concatenate_assign(const Polyhedra_Powerset& y);
 
   /*! \brief
-    Assigns to \p *this the result of computing the
-    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
-
-    The result is obtained by computing the pairwise
-    \ref Time_Elapse_Operator "time elapse" of each polyhedron
-    in \p *this with each polyhedron in \p y.
-  */
-  void time_elapse_assign(const Polyhedra_Powerset& y);
-
-  //! Removes all the specified space dimensions.
-  /*!
-    \param to_be_removed
-    The set of Variable objects corresponding to the space dimensions
-    to be removed.
+    Assigns to \p *this the smallest pointset, in the class of
+    \p *this and \p y, that contains both \p *this and \p y.
 
     \exception std::invalid_argument
-    Thrown if \p *this is dimension-incompatible with one of the
-    Variable objects contained in \p to_be_removed.
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
   */
-  void remove_space_dimensions(const Variables_Set& to_be_removed);
+  virtual void upper_bound_assign(const Any_Pointset& y) = 0;
 
   /*! \brief
-    Removes the higher space dimensions so that the resulting space
-    will have dimension \p new_dimension.
+    Assigns to \p *this the smallest pointset, in the class of \p
+    *this and \p y, that contains the set-theoretic difference of \p
+    *this and \p y.
 
     \exception std::invalid_argument
-    Thrown if \p new_dimensions is greater than the space dimension
-    of \p *this.
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
   */
-  void remove_higher_space_dimensions(dimension_type new_dimension);
+  virtual void difference_assign(const Any_Pointset& y) = 0;
 
   /*! \brief
-    Remaps the dimensions of the vector space according to
-    a partial function.
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
 
-    See also Polyhedron::map_space_dimensions.
-  */
-  template <typename Partial_Function>
-  void map_space_dimensions(const Partial_Function& pfunc);
+    \param var
+    The variable to which the affine expression is assigned;
 
-  //@} // Member Functions that May Modify the Dimension of the Vector Space
+    \param expr
+    The numerator of the affine expression;
 
-public:
-  typedef typename Base::size_type size_type;
-  typedef typename Base::value_type value_type;
-  typedef typename Base::iterator iterator;
-  typedef typename Base::const_iterator const_iterator;
-  typedef typename Base::reverse_iterator reverse_iterator;
-  typedef typename Base::const_reverse_iterator const_reverse_iterator;
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-  PPL_OUTPUT_DECLARATIONS;
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  /*! \brief
-    Loads from \p s an ASCII representation (as produced by \ref
-    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
-    if successful, <CODE>false</CODE> otherwise.
-  */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-  bool ascii_load(std::istream& s);
+    \if Include_Implementation_Details
 
-private:
-  typedef typename Base::Sequence Sequence;
-  typedef typename Base::Sequence_iterator Sequence_iterator;
-  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+    When considering the generators of a pointset, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
 
-  //! The number of dimensions of the enclosing vector space.
-  dimension_type space_dim;
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
 
-  /*! \brief
-    Assigns to \p *this the result of applying the BGP99 heuristics
-    to \p *this and \p y, using the widening function \p wf.
-  */
-  template <typename Widening>
-  void BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf);
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
 
-  //! Records in \p cert_ms the certificates for this set of polyhedra.
-  template <typename Cert>
-  void collect_certificates(std::map<Cert, size_type,
-		                     typename Cert::Compare>& cert_ms) const;
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
 
-  /*! \brief
-    Returns <CODE>true</CODE> if and only if the current set of polyhedra
-    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the pointset, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the pointset and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+	    \vect{\lambda} \in \Rset^{m_1}_+,
+	    \vect{\mu} \in \Rset^{m_2}_+,
+	    \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting pointset is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
+
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
   */
-  template <typename Cert>
-  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
-                                                   typename Cert::Compare>&
-				    y_cert_ms) const;
+  virtual void affine_image(Variable var,
+			    const Linear_Expression& expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one()) = 0;
 
-  // FIXME: here it should be enough to befriend the templatic constructor
-  //   template <typename QH>
-  //   Polyhedra_Powerset(const Polyhedra_Powerset<QH>&)
-  // but, apparently, this cannot be done.
-  // As a workaround, we could use
-  //   friend class Polyhedra_Powerset<NNC_Polyhedron>
-  // but GCC 3.3.3 has a bug that causes its rejection.
-  // So, temporarily, we make all Polyhedra_Powerset's friends of each other.
-  template <typename QH> friend class Polyhedra_Powerset;
-};
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
 
+    \param var
+    The variable to which the affine expression is substituted;
 
-namespace Parma_Polyhedra_Library {
+    \param expr
+    The numerator of the affine expression;
 
-//! Partitions \p q with respect to \p p.
-/*! \relates Polyhedra_Powerset
-  Let \p p and \p q be two polyhedra.
-  The function returns an object <CODE>r</CODE> of type
-  <CODE>std::pair\<PH, Polyhedra_Powerset\<NNC_Polyhedron\> \></CODE>
-  such that
-  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
-  - <CODE>r.second</CODE> has the property that all its elements are
-    pairwise disjoint and disjoint from \p p;
-  - the union of <CODE>r.first</CODE> with all the elements of
-    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE> is the
-    representation of a partition of \p q).
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
 
-  \if Include_Implementation_Details
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
 
-  See
-  <A HREF="http://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
-  this paper</A> for more information about the implementation.
-  \endif
-*/
-template <typename PH>
-std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
-linear_partition(const PH& p, const PH& q);
+    \if Include_Implementation_Details
 
-/*! \brief
-  Returns <CODE>true</CODE> if and only if the union of
-  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+    When considering constraints of a pointset, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
 
-  \relates Polyhedra_Powerset
-*/
-bool
-check_containment(const NNC_Polyhedron& ph,
-		  const Polyhedra_Powerset<NNC_Polyhedron>& ps);
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
 
-/*! \brief
-  Returns <CODE>true</CODE> if and only if the union of
-  the objects in \p ps contains \p ph.
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
 
-  \relates Polyhedra_Powerset
-  \note
-  It is assumed that the template parameter PH can be converted
-  without precision loss into an NNC_Polyhedron; otherwise,
-  an incorrect result might be obtained.
-*/
-template <typename PH>
-bool
-check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps);
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
 
-// CHECK ME: according to the Intel compiler, the declaration of the
-// following specialization (of the class template parameter) should come
-// before the declaration of the corresponding full specialization
-// (where the member template parameter is specialized too).
-template <>
-template <typename QH>
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the pointset, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting pointset is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  virtual void affine_preimage(Variable var,
+			       const Linear_Expression& expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one()) = 0;
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
 
-// CHECK ME: according to the Intel compiler, the declaration of the
-// following specialization (of the class template parameter) should come
-// before the declaration of the corresponding full specialization
-// (where the member template parameter is specialized too).
-template <>
-template <typename QH>
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+    \param expr
+    The numerator of the right hand side affine expression;
 
-// Non-inline full specializations should be declared here
-// so as to inhibit multiple instantiations of the generic template.
-template <>
-template <>
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y);
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-template <>
-template <>
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one()) = 0;
 
-template <>
-void
-Polyhedra_Powerset<NNC_Polyhedron>
-::poly_difference_assign(const Polyhedra_Powerset& y);
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
 
-template <>
-bool
-Polyhedra_Powerset<NNC_Polyhedron>
-::geometrically_covers(const Polyhedra_Powerset& y) const;
+    \param var
+    The left hand side variable of the generalized affine relation;
 
-} // namespace Parma_Polyhedra_Library
+    \param relsym
+    The relation symbol;
 
+    \param expr
+    The numerator of the right hand side affine expression;
 
-namespace std {
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
 
-//! Specializes <CODE>std::swap</CODE>.
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
-template <typename PH>
-void swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
-	  Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y);
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual void
+  generalized_affine_preimage(Variable var,
+			      Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one()) = 0;
 
-} // namespace std
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.inlines.hh line 1
-/* Polyhedra_Powerset class implementation: inline functions.
-*/
+    \param lhs
+    The left hand side affine expression;
 
+    \param relsym
+    The relation symbol;
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.inlines.hh line 34
-#include <algorithm>
-#include <deque>
+    \param rhs
+    The right hand side affine expression.
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual void generalized_affine_image(const Linear_Expression& lhs,
+					Relation_Symbol relsym,
+					const Linear_Expression& rhs) = 0;
 
-template <typename PH>
-inline dimension_type
-Polyhedra_Powerset<PH>::space_dimension() const {
-  return space_dim;
-}
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
 
-template <typename PH>
-inline dimension_type
-Polyhedra_Powerset<PH>::max_space_dimension() {
-  return PH::max_space_dimension();
-}
+    \param lhs
+    The left hand side affine expression;
 
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(dimension_type num_dimensions,
-					   Degenerate_Element kind)
-  : Base(), space_dim(num_dimensions) {
-  Polyhedra_Powerset& x = *this;
-  if (kind == UNIVERSE)
-    x.sequence.push_back(Determinate<PH>(PH(num_dimensions, kind)));
-  assert(x.OK());
-}
+    \param relsym
+    The relation symbol;
 
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Polyhedra_Powerset& y)
-  : Base(y), space_dim(y.space_dim) {
-}
+    \param rhs
+    The right hand side affine expression.
 
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const PH& ph)
-  : Base(ph), space_dim(ph.space_dimension()) {
-}
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Any_Pointset and \p relsym is a strict
+    relation symbol.
+  */
+  virtual void generalized_affine_preimage(const Linear_Expression& lhs,
+					   Relation_Symbol relsym,
+					   const Linear_Expression& rhs) = 0;
 
-// FIXME: This full specialization is declared inline and placed here
-// just as a workaround to a bug in GCC 3.3.3. In principle, it should
-// not be declared inline and moved in Polyhedra_Powerset.cc.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
-template <>
-template <>
-inline
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (Polyhedra_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<NNC_Polyhedron>(
-                           NNC_Polyhedron(i->element()))
-			 );
-  x.reduced = y.reduced;
-  assert(x.OK());
-}
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-// FIXME: This full specialization is declared inline and placed here
-// just as a workaround to a bug in GCC 3.3.3. In principle, it should
-// not be declared inline and moved in Polyhedra_Powerset.cc.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
-template <>
-template <>
-inline
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<C_Polyhedron>(
-                           C_Polyhedron(i->element()))
-			 );
-  // Note: this might be non-reduced even when `y' is known to be
-  // omega-reduced, because the constructor of C_Polyhedron, by
-  // enforcing topological closure, may have made different elements
-  // comparable.
-  x.reduced = false;
-  assert(x.OK());
-}
+    \param var
+    The variable updated by the affine relation;
 
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs)
-  // FIXME: calling Base(Determinate<PH>(cs)) will automatically handle
-  // the flag `reduced', but it will also force a non-emptiness test
-  // on the constraint system `cs'.
-  : Base(), space_dim(cs.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  x.sequence.push_back(Determinate<PH>(cs));
-  x.reduced = false;
-  assert(x.OK());
-}
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-template <typename PH>
-inline
-Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Congruence_System& cgs)
-  // FIXME: calling Base(Determinate<PH>(cgs)) will automatically handle
-  // the flag `reduced', but it will also force a non-emptiness test
-  // on the congruence system `cgs'.
-  : Base(), space_dim(cgs.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  x.sequence.push_back(Determinate<PH>(cgs));
-  x.reduced = false;
-  assert(OK());
-}
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-template <typename PH>
-inline Polyhedra_Powerset<PH>&
-Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.Base::operator=(y);
-  x.space_dim = y.space_dim;
-  return x;
-}
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-template <typename PH>
-inline void
-Polyhedra_Powerset<PH>::swap(Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.Base::swap(y);
-  std::swap(x.space_dim, y.space_dim);
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  virtual
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one()) = 0;
 
-template <typename PH>
-template <typename QH>
-inline Polyhedra_Powerset<PH>&
-Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset<QH>& y) {
-  Polyhedra_Powerset& x = *this;
-  Polyhedra_Powerset<PH> pps(y);
-  x.swap(pps);
-  return x;
-}
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
 
-template <typename PH>
-inline void
-Polyhedra_Powerset<PH>::intersection_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.pairwise_apply_assign
-    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::intersection_assign)));
-}
+    \param var
+    The variable updated by the affine relation;
 
-template <typename PH>
-inline void
-Polyhedra_Powerset<PH>::time_elapse_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  x.pairwise_apply_assign
-    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::time_elapse_assign)));
-}
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
 
-template <typename PH>
-inline bool
-Polyhedra_Powerset<PH>
-::geometrically_covers(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
-  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
-  return xx.geometrically_covers(yy);
-}
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
 
-template <typename PH>
-inline bool
-Polyhedra_Powerset<PH>
-::geometrically_equals(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
-  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
-  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
-}
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
 
-template <>
-inline bool
-Polyhedra_Powerset<NNC_Polyhedron>
-::geometrically_equals(const Polyhedra_Powerset& y) const {
-  const Polyhedra_Powerset& x = *this;
-  return x.geometrically_covers(y) && y.geometrically_covers(x);
-}
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  virtual
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one()) = 0;
 
-template <typename PH>
-inline memory_size_type
-Polyhedra_Powerset<PH>::external_memory_in_bytes() const {
-  return Base::external_memory_in_bytes();
-}
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
 
-template <typename PH>
-inline memory_size_type
-Polyhedra_Powerset<PH>::total_memory_in_bytes() const {
-  return sizeof(*this) + external_memory_in_bytes();
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  virtual void time_elapse_assign(const Any_Pointset& y) = 0;
 
-template <>
-inline void
-Polyhedra_Powerset<C_Polyhedron>
-::poly_difference_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset<NNC_Polyhedron> nnc_this(*this);
-  Polyhedra_Powerset<NNC_Polyhedron> nnc_y(y);
-  nnc_this.poly_difference_assign(nnc_y);
-  *this = nnc_this;
-}
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
 
-/*! \relates Polyhedra_Powerset */
-template <typename PH>
-inline bool
-check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps) {
-  const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
-  const Polyhedra_Powerset<NNC_Polyhedron> pps(ps);
-  return check_containment(pph, pps);
-}
+#if 0
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const Any_Pointset& y, unsigned* tp = 0);
 
-/*! \relates Polyhedra_Powerset */
-template <>
-inline bool
-check_containment(const C_Polyhedron& ph,
-		  const Polyhedra_Powerset<C_Polyhedron>& ps) {
-  return check_containment(NNC_Polyhedron(ph),
-			   Polyhedra_Powerset<NNC_Polyhedron>(ps));
-}
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
 
-} // namespace Parma_Polyhedra_Library
+    \param y
+    A pointset that <EM>must</EM> be contained in \p *this;
 
+    \param cs
+    The system of constraints used to improve the widened pointset;
 
-namespace std {
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
-template <typename PH>
-inline void
-swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
-     Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y) {
-  x.swap(y);
-}
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Any_Pointset& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
 
-} // namespace std
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.templates.hh line 1
-/* Polyhedra_Powerset class implementation: non-inline template functions.
-*/
+    \param y
+    A pointset that <EM>must</EM> be contained in \p *this;
 
+    \param cs
+    The system of constraints used to improve the widened pointset;
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.templates.hh line 31
-#include <algorithm>
-#include <deque>
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
 
-namespace Parma_Polyhedra_Library {
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Any_Pointset& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+#endif
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_disjunct(const PH& ph) {
-  Polyhedra_Powerset& x = *this;
-  if (x.space_dimension() != ph.space_dimension()) {
-    std::ostringstream s;
-    s << "PPL::Polyhedra_Powerset<PH>::add_disjunct(ph):\n"
-      << "this->space_dimension() == " << x.space_dimension() << ", "
-      << "ph.space_dimension() == " << ph.space_dimension() << ".";
-    throw std::invalid_argument(s.str());
-  }
-  x.sequence.push_back(Determinate<PH>(ph));
-  x.reduced = false;
-  assert(x.OK());
-}
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
 
-template <>
-template <typename QH>
-Polyhedra_Powerset<NNC_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<NNC_Polyhedron>(
-                           NNC_Polyhedron(i->element().constraints()))
-			 );
-  x.reduced = y.reduced;
-  assert(x.OK());
-}
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
 
-template <>
-template <typename QH>
-Polyhedra_Powerset<C_Polyhedron>
-::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
-  : Base(), space_dim(y.space_dimension()) {
-  Polyhedra_Powerset& x = *this;
-  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
-	 y_end = y.end(); i != y_end; ++i)
-    x.sequence.push_back(Determinate<C_Polyhedron>(
-                           C_Polyhedron(i->element().constraints()))
-			 );
-  // Note: this might be non-reduced even when `y' is known to be
-  // omega-reduced, because the constructor of C_Polyhedron, by
-  // enforcing topological closure, may have made different elements
-  // comparable.
-  x.reduced = false;
-  assert(x.OK());
-}
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old pointset
+    in the new vector space.
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::concatenate_assign(const Polyhedra_Powerset& y) {
-  Polyhedra_Powerset& x = *this;
-  // Ensure omega-reduction here, since what follows has quadratic complexity.
-  x.omega_reduce();
-  y.omega_reduce();
-  Polyhedra_Powerset<PH> new_x(x.space_dim + y.space_dim, EMPTY);
-  for (const_iterator xi = x.begin(), x_end = x.end(),
-	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
-    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
-      CS zi = *xi;
-      zi.concatenate_assign(*yi);
-      assert(!zi.is_bottom());
-      new_x.sequence.push_back(zi);
-    }
-    ++xi;
-    if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
-      // Hurry up!
-      PH xph = xi->element();
-      for (++xi; xi != x_end; ++xi)
-	xph.upper_bound_assign(xi->element());
-      const_iterator yi = y_begin;
-      PH yph = yi->element();
-      for (++yi; yi != y_end; ++yi)
-	yph.upper_bound_assign(yi->element());
-      xph.concatenate_assign(yph);
-      x.swap(new_x);
-      x.add_disjunct(xph);
-      assert(x.OK());
-      return;
-    }
-  }
-  x.swap(new_x);
-  assert(x.OK());
-}
+    \param m
+    The number of dimensions to add.
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_constraint(const Constraint& c) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_constraint(c);
-  x.reduced = false;
-  assert(x.OK());
-}
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::add_constraint_and_minimize(const Constraint& c) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; )
-    if (!si->element().add_constraint_and_minimize(c))
-      si = x.sequence.erase(si);
-    else {
-      x.reduced = false;
-      ++si;
-    }
-  assert(x.OK());
-  return !x.empty();
-}
+    The new space dimensions will be those having the highest indexes
+    in the new pointset, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the pointset \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the pointset
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  virtual void add_space_dimensions_and_embed(dimension_type m) = 0;
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_constraints(const Constraint_System& cs) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_constraints(cs);
-  x.reduced = false;
-  assert(x.OK());
-}
+  /*! \brief
+    Adds \p m new space dimensions to the pointset
+    and does not embed it in the new vector space.
 
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::
-add_constraints_and_minimize(const Constraint_System& cs) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; )
-    if (!si->element().add_constraints_and_minimize(cs))
-      si = x.sequence.erase(si);
-    else {
-      x.reduced = false;
-      ++si;
-    }
-  assert(x.OK());
-  return !x.empty();
-}
+    \param m
+    The number of space dimensions to add.
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_space_dimensions_and_embed(dimension_type m) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_space_dimensions_and_embed(m);
-  x.space_dim += m;
-  assert(x.OK());
-}
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::add_space_dimensions_and_project(dimension_type m) {
-  Polyhedra_Powerset& x = *this;
-  for (Sequence_iterator si = x.sequence.begin(),
-	 s_end = x.sequence.end(); si != s_end; ++si)
-    si->element().add_space_dimensions_and_project(m);
-  x.space_dim += m;
-  assert(x.OK());
-}
+    The new space dimensions will be those having the highest indexes
+    in the new pointset, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the pointset \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the pointset
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  virtual void add_space_dimensions_and_project(dimension_type m) = 0;
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::
-remove_space_dimensions(const Variables_Set& to_be_removed) {
-  Polyhedra_Powerset& x = *this;
-  Variables_Set::size_type num_removed = to_be_removed.size();
-  if (num_removed > 0) {
-    for (Sequence_iterator si = x.sequence.begin(),
-	   s_end = x.sequence.end(); si != s_end; ++si) {
-      si->element().remove_space_dimensions(to_be_removed);
-      x.reduced = false;
-    }
-    x.space_dim -= num_removed;
-    assert(x.OK());
-  }
-}
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::remove_higher_space_dimensions(dimension_type
-						       new_dimension) {
-  Polyhedra_Powerset& x = *this;
-  if (new_dimension < x.space_dim) {
-    for (Sequence_iterator si = x.sequence.begin(),
-	   s_end = x.sequence.end(); si != s_end; ++si) {
-      si->element().remove_higher_space_dimensions(new_dimension);
-      x.reduced = false;
-    }
-    x.space_dim = new_dimension;
-    assert(x.OK());
-  }
-}
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
 
-template <typename PH>
-template <typename Partial_Function>
-void
-Polyhedra_Powerset<PH>::map_space_dimensions(const Partial_Function& pfunc) {
-  Polyhedra_Powerset& x = *this;
-  if (x.is_bottom()) {
-    dimension_type n = 0;
-    for (dimension_type i = x.space_dim; i-- > 0; ) {
-      dimension_type new_i;
-      if (pfunc.maps(i, new_i))
-	++n;
-    }
-    x.space_dim = n;
-  }
-  else {
-    Sequence_iterator s_begin = x.sequence.begin();
-    for (Sequence_iterator si = s_begin,
-	   s_end = x.sequence.end(); si != s_end; ++si)
-      si->element().map_space_dimensions(pfunc);
-    x.space_dim = s_begin->element().space_dimension();
-    x.reduced = false;
-  }
-  assert(x.OK());
-}
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  virtual void concatenate_assign(const Any_Pointset& y) = 0;
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::pairwise_reduce() {
-  Polyhedra_Powerset& x = *this;
-  // It is wise to omega-reduce before pairwise-reducing.
-  x.omega_reduce();
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
 
-  size_type n = x.size();
-  size_type deleted;
-  do {
-    Polyhedra_Powerset new_x(x.space_dim, EMPTY);
-    std::deque<bool> marked(n, false);
-    deleted = 0;
-    Sequence_iterator s_begin = x.sequence.begin();
-    Sequence_iterator s_end = x.sequence.end();
-    unsigned si_index = 0;
-    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
-      if (marked[si_index])
-	continue;
-      PH& pi = si->element();
-      Sequence_const_iterator sj = si;
-      unsigned sj_index = si_index;
-      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
-	if (marked[sj_index])
-	  continue;
-	const PH& pj = sj->element();
-	if (pi.upper_bound_assign_if_exact(pj)) {
-	  marked[si_index] = marked[sj_index] = true;
-	  new_x.add_non_bottom_disjunct(pi);
-	  ++deleted;
-	  goto next;
-	}
-      }
-    next:
-      ;
-    }
-    iterator nx_begin = new_x.begin();
-    iterator nx_end = new_x.end();
-    unsigned xi_index = 0;
-    for (const_iterator xi = x.begin(),
-	   x_end = x.end(); xi != x_end; ++xi, ++xi_index)
-      if (!marked[xi_index])
-	nx_begin = new_x.add_non_bottom_disjunct(*xi, nx_begin, nx_end);
-    std::swap(x.sequence, new_x.sequence);
-    n -= deleted;
-  } while (deleted > 0);
-  assert(x.OK());
-}
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  virtual void remove_space_dimensions(const Variables_Set& to_be_removed) = 0;
 
-template <typename PH>
-template <typename Widening>
-void
-Polyhedra_Powerset<PH>::
-BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf) {
-  // `x' is the current iteration value.
-  Polyhedra_Powerset& x = *this;
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' entails `x'.
-    const Polyhedra_Powerset<PH> x_copy = x;
-    const Polyhedra_Powerset<PH> y_copy = y;
-    assert(y_copy.definitely_entails(x_copy));
-  }
-#endif
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  virtual
+  void remove_higher_space_dimensions(dimension_type new_dimension) = 0;
 
-  size_type n = x.size();
-  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
-  std::deque<bool> marked(n, false);
-  const_iterator x_begin = x.begin();
-  const_iterator x_end = x.end();
-  unsigned i_index = 0;
-  for (const_iterator i = x_begin,
-	 y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
-    for (const_iterator j = y_begin; j != y_end; ++j) {
-      const PH& pi = i->element();
-      const PH& pj = j->element();
-      if (pi.contains(pj)) {
-	PH pi_copy = pi;
-	wf(pi_copy, pj);
-	new_x.add_non_bottom_disjunct(pi_copy);
-	marked[i_index] = true;
-      }
-    }
-  iterator nx_begin = new_x.begin();
-  iterator nx_end = new_x.end();
-  i_index = 0;
-  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
-    if (!marked[i_index])
-      nx_begin = new_x.add_non_bottom_disjunct(*i, nx_begin, nx_end);
-  std::swap(x.sequence, new_x.sequence);
-  assert(x.OK());
-  assert(x.is_omega_reduced());
-}
+#if 0
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
 
-template <typename PH>
-template <typename Widening>
-void
-Polyhedra_Powerset<PH>::
-BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
-			   Widening wf,
-			   unsigned max_disjuncts) {
-  // `x' is the current iteration value.
-  Polyhedra_Powerset& x = *this;
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' entails `x'.
-    const Polyhedra_Powerset<PH> x_copy = x;
-    const Polyhedra_Powerset<PH> y_copy = y;
-    assert(y_copy.definitely_entails(x_copy));
-  }
-#endif
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the pointset.
 
-  x.pairwise_reduce();
-  if (max_disjuncts != 0)
-    x.collapse(max_disjuncts);
-  x.BGP99_heuristics_assign(y, wf);
-}
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+#endif
 
-template <typename PH>
-template <typename Cert>
-void
-Polyhedra_Powerset<PH>::
-collect_certificates(std::map<Cert, size_type,
-		              typename Cert::Compare>& cert_ms) const {
-  const Polyhedra_Powerset& x = *this;
-  assert(x.is_omega_reduced());
-  assert(cert_ms.size() == 0);
-  for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
-    Cert ph_cert(i->element());
-    ++cert_ms[ph_cert];
-  }
-}
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
 
-template <typename PH>
-template <typename Cert>
-bool
-Polyhedra_Powerset<PH>::
-is_cert_multiset_stabilizing(const std::map<Cert, size_type,
-			                    typename Cert::Compare>& y_cert_ms
-			     ) const {
-  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
-  Cert_Multiset x_cert_ms;
-  collect_certificates(x_cert_ms);
-  typename Cert_Multiset::const_iterator
-    xi = x_cert_ms.begin(),
-    xend = x_cert_ms.end(),
-    yi = y_cert_ms.begin(),
-    yend = y_cert_ms.end();
-  while (xi != xend && yi != yend) {
-    const Cert& xi_cert = xi->first;
-    const Cert& yi_cert = yi->first;
-    switch (xi_cert.compare(yi_cert)) {
-    case 0:
-      // xi_cert == yi_cert: check the number of multiset occurrences.
-      {
-	const size_type& xi_count = xi->second;
-	const size_type& yi_count = yi->second;
-	if (xi_count == yi_count) {
-	  // Same number of occurrences: compare the next pair.
-	  ++xi;
-	  ++yi;
-	}
-	else
-	  // Different number of occurrences: can decide ordering.
-	  return xi_count < yi_count;
-	break;
-      }
-    case 1:
-      // xi_cert > yi_cert: it is not stabilizing.
-      return false;
+    \param m
+    The number of replicas to be created.
 
-    case -1:
-      // xi_cert < yi_cert: it is stabilizing.
-      return true;
-    }
-  }
-  // Here xi == xend or yi == yend.
-  // Stabilization is achieved if `y_cert_ms' still has other elements.
-  return yi != yend;
-}
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
 
-template <typename PH>
-template <typename Cert, typename Widening>
-void
-Polyhedra_Powerset<PH>::BHZ03_widening_assign(const Polyhedra_Powerset& y,
-					      Widening wf) {
-  // `x' is the current iteration value.
-  Polyhedra_Powerset& x = *this;
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
 
-#ifndef NDEBUG
-  {
-    // We assume that `y' entails `x'.
-    const Polyhedra_Powerset<PH> x_copy = x;
-    const Polyhedra_Powerset<PH> y_copy = y;
-    assert(y_copy.definitely_entails(x_copy));
-  }
-#endif
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
 
-  // First widening technique: do nothing.
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
 
-  // If `y' is the empty collection, do nothing.
-  assert(x.size() > 0);
-  if (y.size() == 0)
-    return;
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
 
-  // Compute the poly-hull of `x'.
-  PH x_hull(x.space_dim, EMPTY);
-  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
-    x_hull.upper_bound_assign(i->element());
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
 
-  // Compute the poly-hull of `y'.
-  PH y_hull(y.space_dim, EMPTY);
-  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
-    y_hull.upper_bound_assign(i->element());
-  // Compute the certificate for `y_hull'.
-  const Cert y_hull_cert(y_hull);
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
 
-  // If the hull is stabilizing, do nothing.
-  int hull_stabilization = y_hull_cert.compare(x_hull);
-  if (hull_stabilization == 1)
-    return;
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
 
-  // Multiset ordering is only useful when `y' is not a singleton.
-  const bool y_is_not_a_singleton = y.size() > 1;
+#if 0
+  friend bool Parma_Polyhedra_Library::operator==(const Any_Pointset& x,
+						  const Any_Pointset& y);
+#endif
 
-  // The multiset certificate for `y':
-  // we want to be lazy about its computation.
-  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
-  Cert_Multiset y_cert_ms;
-  bool y_cert_ms_computed = false;
+  //! \name Miscellaneous Member Functions
+  //@{
 
-  if (hull_stabilization == 0 && y_is_not_a_singleton) {
-    // Collect the multiset certificate for `y'.
-    y.collect_certificates(y_cert_ms);
-    y_cert_ms_computed = true;
-    // If multiset ordering is stabilizing, do nothing.
-    if (x.is_cert_multiset_stabilizing(y_cert_ms))
-      return;
-  }
+  //! Destructor.
+  virtual ~Any_Pointset();
 
-  // Second widening technique: try the BGP99 powerset heuristics.
-  Polyhedra_Powerset<PH> bgp99_heuristics = x;
-  bgp99_heuristics.BGP99_heuristics_assign(y, wf);
+  /*! \brief
+    Swaps \p *this with pointset \p y.
+    (\p *this and \p y can be dimension-incompatible.)
 
-  // Compute the poly-hull of `bgp99_heuristics'.
-  PH bgp99_heuristics_hull(x.space_dim, EMPTY);
-  for (const_iterator i = bgp99_heuristics.begin(),
-	 bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
-    bgp99_heuristics_hull.upper_bound_assign(i->element());
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void swap(Any_Pointset& y);
 
-  // Check for stabilization and, if successful,
-  // commit to the result of the extrapolation.
-  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
-  if (hull_stabilization == 1) {
-    // The poly-hull is stabilizing.
-    std::swap(x, bgp99_heuristics);
-    return;
-  }
-  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
-    // If not already done, compute multiset certificate for `y'.
-    if (!y_cert_ms_computed) {
-      y.collect_certificates(y_cert_ms);
-      y_cert_ms_computed = true;
-    }
-    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
-      std::swap(x, bgp99_heuristics);
-      return;
-    }
-    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
-    // Note that pairwise-reduction does not affect the computation
-    // of the poly-hulls, so that we only have to check the multiset
-    // certificate relation.
-    Polyhedra_Powerset<PH> reduced_bgp99_heuristics(bgp99_heuristics);
-    reduced_bgp99_heuristics.pairwise_reduce();
-    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
-      std::swap(x, reduced_bgp99_heuristics);
-      return;
-    }
-  }
+  PPL_OUTPUT_DECLARATIONS
 
-  // Fourth widening technique: this is applicable only when
-  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
-  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
-    // Compute (y_hull \widen bgp99_heuristics_hull).
-    PH ph = bgp99_heuristics_hull;
-    wf(ph, y_hull);
-    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
-    ph.difference_assign(bgp99_heuristics_hull);
-    x.add_disjunct(ph);
-    return;
-  }
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
 
-  // Fall back to the computation of the poly-hull.
-  Polyhedra_Powerset<PH> x_hull_singleton(x.space_dim, EMPTY);
-  x_hull_singleton.add_disjunct(x_hull);
-  std::swap(x, x_hull_singleton);
-}
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const = 0;
 
-template <typename PH>
-void
-Polyhedra_Powerset<PH>::ascii_dump(std::ostream& s) const {
-  const Polyhedra_Powerset& x = *this;
-  s << "size " << x.size()
-    << "\nspace_dim " << x.space_dim
-    << "\n";
-  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
-    xi->element().ascii_dump(s);
-}
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const = 0;
 
-PPL_OUTPUT_TEMPLATE_DEFINITIONS(PH, Polyhedra_Powerset<PH>);
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
 
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::ascii_load(std::istream& s) {
-  Polyhedra_Powerset& x = *this;
-  std::string str;
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  virtual int32_t hash_code() const = 0;
 
-  if (!(s >> str) || str != "size")
-    return false;
+  //@} // Miscellaneous Member Functions
+};
 
-  size_type sz;
 
-  if (!(s >> sz))
-    return false;
+namespace std {
 
-  if (!(s >> str) || str != "space_dim")
-    return false;
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Any_Pointset */
+void swap(Parma_Polyhedra_Library::Any_Pointset& x,
+	  Parma_Polyhedra_Library::Any_Pointset& y);
 
-  if (!(s >> x.space_dim))
-    return false;
+} // namespace std
 
-  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
-  while (sz-- > 0) {
-    PH ph;
-    if (!ph.ascii_load(s))
-      return false;
-    new_x.add_disjunct(ph);
-  }
-  x.swap(new_x);
+#define PPL_ANY_POINTSET_WRAPPER_CLASS(TEMPLATE, WRAPPER_NAME, BASE_CLASS) \
+TEMPLATE								\
+class WRAPPER_NAME : public Any_Pointset {				\
+ private:								\
+  BASE_CLASS x;								\
+ public:								\
+  explicit WRAPPER_NAME(const C_Polyhedron& y)				\
+    : x(y) {								\
+  }									\
+  explicit WRAPPER_NAME(const NNC_Polyhedron& y)			\
+    : x(y) {								\
+  }									\
+  template <typename U>							\
+  explicit WRAPPER_NAME(const Box<U>& y)				\
+    : x(y) {								\
+  }									\
+  template <typename U>							\
+  explicit WRAPPER_NAME(const BD_Shape<U>& y)				\
+    : x(y) {								\
+  }									\
+  template <typename U>					                \
+  explicit WRAPPER_NAME(const Octagonal_Shape<U>& y)			\
+    : x(y) {								\
+  }									\
+									\
+  explicit WRAPPER_NAME(const Constraint_System& y)			\
+    : x(y) {								\
+  }									\
+  explicit WRAPPER_NAME(const Congruence_System& y)			\
+    : x(y) {								\
+  }									\
+									\
+  ~WRAPPER_NAME() {							\
+  }									\
+									\
+  dimension_type space_dimension() const {				\
+    return x.space_dimension();						\
+  }									\
+  dimension_type affine_dimension() const {				\
+    return x.space_dimension();						\
+  }									\
+  Constraint_System constraints() const {				\
+    return x.constraints();						\
+  }									\
+  Congruence_System congruences() const {				\
+    return x.congruences();						\
+  }									\
+									\
+  bool is_empty() const {						\
+    return x.is_empty();						\
+  }									\
+  bool is_universe() const {						\
+    return x.is_universe();						\
+  }									\
+  bool is_bounded() const {						\
+    return x.is_bounded();						\
+  }									\
+  bool is_topologically_closed() const {				\
+    return x.is_topologically_closed();					\
+  }									\
+  bool is_discrete() const {						\
+    return x.is_discrete();						\
+  }									\
+  bool contains_integer_point() const {					\
+    return x.contains_integer_point();					\
+  }									\
+									\
+  bool contains(const Any_Pointset& y) const {				\
+    return x.contains(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  bool strictly_contains(const Any_Pointset& y) const {			\
+    return x.strictly_contains(dynamic_cast<const BASE_CLASS&>(y));	\
+  }									\
+  bool is_disjoint_from(const Any_Pointset& y) const {			\
+    return x.is_disjoint_from(dynamic_cast<const BASE_CLASS&>(y));	\
+  }									\
+									\
+  void add_space_dimensions_and_embed(dimension_type m) {		\
+    return x.add_space_dimensions_and_embed(m);				\
+  }									\
+  void add_space_dimensions_and_project(dimension_type m) {		\
+    return x.add_space_dimensions_and_project(m);			\
+  }									\
+  void remove_space_dimensions(const Variables_Set& to_be_removed) {	\
+    x.remove_space_dimensions(to_be_removed);				\
+  }									\
+  void remove_higher_space_dimensions(dimension_type new_dimension) {	\
+    x.remove_higher_space_dimensions(new_dimension);			\
+  }									\
+									\
+  void add_constraint(const Constraint& c) {				\
+    x.add_constraint(c);						\
+  }									\
+									\
+  void add_constraints(const Constraint_System& cs) {			\
+    x.add_constraints(cs);						\
+  }									\
+									\
+  void intersection_assign(const Any_Pointset& y) {			\
+    x.intersection_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void upper_bound_assign(const Any_Pointset& y) {			\
+    x.upper_bound_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void difference_assign(const Any_Pointset& y) {			\
+    x.difference_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void concatenate_assign(const Any_Pointset& y) {			\
+    x.concatenate_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+  void time_elapse_assign(const Any_Pointset& y) {			\
+    x.time_elapse_assign(dynamic_cast<const BASE_CLASS&>(y));		\
+  }									\
+									\
+  void affine_image(Variable var,					\
+		    const Linear_Expression& expr,			\
+		    Coefficient_traits::const_reference denominator	\
+		    = Coefficient_one()) {				\
+    x.affine_image(var, expr, denominator);				\
+  }									\
+  void affine_preimage(Variable var,					\
+		       const Linear_Expression& expr,			\
+		       Coefficient_traits::const_reference denominator	\
+		       = Coefficient_one()) {				\
+    x.affine_image(var, expr, denominator);				\
+  }									\
+  void generalized_affine_image(Variable var,				\
+				Relation_Symbol relsym,			\
+				const Linear_Expression& expr,		\
+				Coefficient_traits::const_reference	\
+				denominator = Coefficient_one()) {	\
+    x.generalized_affine_image(var, relsym, expr, denominator);		\
+  }									\
+  void									\
+  generalized_affine_preimage(Variable var,				\
+			      Relation_Symbol relsym,			\
+			      const Linear_Expression& expr,		\
+			      Coefficient_traits::const_reference denominator \
+			      = Coefficient_one()) {			\
+    x.generalized_affine_preimage(var, relsym, expr, denominator);	\
+  }									\
+  virtual void generalized_affine_image(const Linear_Expression& lhs,	\
+					Relation_Symbol relsym,		\
+					const Linear_Expression& rhs) { \
+    x.generalized_affine_image(lhs, relsym, rhs);			\
+  }									\
+  void generalized_affine_preimage(const Linear_Expression& lhs,	\
+				   Relation_Symbol relsym,		\
+				   const Linear_Expression& rhs) {	\
+    x.generalized_affine_preimage(lhs, relsym, rhs);			\
+  }									\
+									\
+  void bounded_affine_image(Variable var,				\
+			    const Linear_Expression& lb_expr,		\
+			    const Linear_Expression& ub_expr,		\
+			    Coefficient_traits::const_reference		\
+			    denominator = Coefficient_one()) {		\
+    x.bounded_affine_image(var, lb_expr, ub_expr, denominator);		\
+  }									\
+  void bounded_affine_preimage(Variable var,				\
+			       const Linear_Expression& lb_expr,	\
+			       const Linear_Expression& ub_expr,	\
+			       Coefficient_traits::const_reference	\
+			       denominator = Coefficient_one()) {	\
+    x.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);	\
+  }									\
+									\
+  bool bounds_from_above(const Linear_Expression& expr) const {		\
+    return x.bounds_from_above(expr);					\
+  }									\
+  bool bounds_from_below(const Linear_Expression& expr) const {		\
+    return x.bounds_from_below(expr);					\
+  }									\
+  bool maximize(const Linear_Expression& expr,				\
+		Coefficient& sup_n, Coefficient& sup_d,			\
+		bool& maximum) const {					\
+    return maximize(expr, sup_n, sup_d, maximum);			\
+  }									\
+  bool maximize(const Linear_Expression& expr,				\
+		Coefficient& sup_n, Coefficient& sup_d,			\
+		bool& maximum, Generator& point) const {		\
+    return maximize(expr, sup_n, sup_d, maximum, point);		\
+  }									\
+  bool minimize(const Linear_Expression& expr,				\
+		Coefficient& inf_n, Coefficient& inf_d,			\
+		bool& minimum) const {					\
+    return minimize(expr, inf_n, inf_d, minimum);			\
+  }									\
+  bool minimize(const Linear_Expression& expr,				\
+		Coefficient& inf_n, Coefficient& inf_d,			\
+		bool& minimum, Generator& point) const {		\
+    return minimize(expr, inf_n, inf_d, minimum, point);		\
+  }									\
+									\
+  memory_size_type total_memory_in_bytes() const {			\
+    return x.total_memory_in_bytes();					\
+  }									\
+  memory_size_type external_memory_in_bytes() const {			\
+    return x.total_memory_in_bytes();					\
+  }									\
+									\
+  int32_t hash_code() const {						\
+    return x.hash_code();						\
+  }									\
+									\
+  bool OK() const {							\
+    return x.OK();							\
+  }									\
+};
 
-  // Check for well-formedness.
-  assert(x.OK());
-  return true;
-}
+namespace Parma_Polyhedra_Library {
 
-template <typename PH>
-bool
-Polyhedra_Powerset<PH>::OK() const {
-  const Polyhedra_Powerset& x = *this;
-  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
-    const PH& pi = xi->element();
-    if (pi.space_dimension() != x.space_dim) {
-#ifndef NDEBUG
-      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
-		<< " in an element of the sequence,\nshould be "
-		<< x.space_dim << "."
-		<< std::endl;
-#endif
-      return false;
-    }
-  }
-  return x.Base::OK();
-}
+PPL_ANY_POINTSET_WRAPPER_CLASS(, C_Polyhedron_Pointset, C_Polyhedron)
+PPL_ANY_POINTSET_WRAPPER_CLASS(, NNC_Polyhedron_Pointset, NNC_Polyhedron)
+//PPL_ANY_POINTSET_WRAPPER_CLASS(, Grid_Pointset, Grid)
 
+PPL_ANY_POINTSET_WRAPPER_CLASS(template <typename T>, Box_Pointset, Box<T>)
+PPL_ANY_POINTSET_WRAPPER_CLASS(template <typename T>, BD_Shape_Pointset, BD_Shape<T>)
+PPL_ANY_POINTSET_WRAPPER_CLASS(template <typename T>, Octagonal_Shape_Pointset, Octagonal_Shape<T>)
 
-namespace Implementation {
+//C_Polyhedron_Pointset a(C_Polyhedron(3));
+//Octagonal_Shape_Pointset<double> b(C_Polyhedron(3));
+//BD_Shape_Pointset<double> c(C_Polyhedron(3));
 
-namespace Polyhedra_Powersets {
+} // namespace Parma_Polyhedra_Library
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Partitions polyhedron \p qq according to constraint \p c.
-/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset
-  On exit, the intersection of \p qq and constraint \p c is stored
-  in \p qq, whereas the intersection of \p qq with the negation of \p c
-  is added as a new disjunct of the powerset \p r.
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Any_Pointset.inlines.hh line 1
+/* Any_Pointset class implementation: inline functions.
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-template <typename PH>
-void
-linear_partition_aux(const Constraint& c,
-		     PH& qq,
-		     Polyhedra_Powerset<NNC_Polyhedron>& r) {
-  Linear_Expression le(c);
-  Constraint neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
-  NNC_Polyhedron qqq(qq);
-  if (qqq.add_constraint_and_minimize(neg_c))
-    r.add_disjunct(qqq);
-  qq.add_constraint(c);
-}
 
-} // namespace Polyhedra_Powersets
-
-} // namespace Implementation
 
+namespace Parma_Polyhedra_Library {
 
-/*! \relates Polyhedra_Powerset */
-template <typename PH>
-std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
-linear_partition(const PH& p, const PH& q) {
-  using Implementation::Polyhedra_Powersets::linear_partition_aux;
+inline
+Any_Pointset::Any_Pointset() {
+}
 
-  Polyhedra_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
-  PH qq = q;
-  const Constraint_System& pcs = p.constraints();
-  for (Constraint_System::const_iterator i = pcs.begin(),
-	 pcs_end = pcs.end(); i != pcs_end; ++i) {
-    const Constraint c = *i;
-    if (c.is_equality()) {
-      Linear_Expression le(c);
-      linear_partition_aux(le <= 0, qq, r);
-      linear_partition_aux(le >= 0, qq, r);
-    }
-    else
-      linear_partition_aux(c, qq, r);
-  }
-  return std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >(qq, r);
+inline
+Any_Pointset::~Any_Pointset() {
 }
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 552
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/Any_Pointset.defs.hh line 1380
+//#include "Any_Pointset.templates.hh"
 
-// Automatically generated from PPL source file ../src/max_space_dimension.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/max_space_dimension.hh line 1
 /* Definition of functions yielding maximal space dimensions.
 */
 
 
-// Automatically generated from PPL source file ../src/max_space_dimension.hh line 30
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/max_space_dimension.hh line 33
 #include <algorithm>
 
 namespace Parma_Polyhedra_Library {
@@ -41095,23 +75208,48 @@ namespace Parma_Polyhedra_Library {
 //! Returns the maximum space dimension this library can handle.
 inline dimension_type
 max_space_dimension() {
-  using std::min;
-  return
-    min(Polyhedron::max_space_dimension(),
-	min(Polyhedra_Powerset<C_Polyhedron>::max_space_dimension(),
-	    Polyhedra_Powerset<NNC_Polyhedron>::max_space_dimension()
-	    )
-	);
+  // Note: we assume that the powerset and the ask-and-tell construction
+  // do not limit the space dimension more than their parameters.
+  static bool computed = false;
+  static dimension_type d = not_a_dimension();
+  if (!computed) {
+    d = Variable::max_space_dimension();
+    d = std::min(d, C_Polyhedron::max_space_dimension());
+    d = std::min(d, NNC_Polyhedron::max_space_dimension());
+    d = std::min(d, Grid::max_space_dimension());
+    // FIXME: what about all other boxes?
+    d = std::min(d, Rational_Box::max_space_dimension());
+    d = std::min(d, BD_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<float>::max_space_dimension());
+    d = std::min(d, BD_Shape<double>::max_space_dimension());
+    d = std::min(d, BD_Shape<long double>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpq_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<float>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<long double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpq_class>::max_space_dimension());
+    computed = true;
+  }
+  return d;
 }
 
 } // namespace Parma_Polyhedra_Library
 
-// Automatically generated from PPL source file ../src/algorithms.hh line 1
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/algorithms.hh line 1
 /* A collection of useful convex polyhedra algorithms: inline functions.
 */
 
 
-// Automatically generated from PPL source file ../src/algorithms.hh line 28
+// Automatically generated from PPL source file /home/roberto/ppl/ppl/src/algorithms.hh line 28
 #include <utility>
 #include <cassert>
 
@@ -41125,24 +75263,24 @@ namespace Parma_Polyhedra_Library {
 
   \relates Polyhedron
 */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename PH>
 bool
 poly_hull_assign_if_exact(PH& p, const PH& q);
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \relates Polyhedron */
-#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 template <typename PH>
 bool
 poly_hull_assign_if_exact(PH& p, const PH& q) {
   PH phull = p;
   NNC_Polyhedron nnc_p(p);
   phull.poly_hull_assign(q);
-  std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+  std::pair<PH, Pointset_Powerset<NNC_Polyhedron> >
     partition = linear_partition(q, phull);
-  const Polyhedra_Powerset<NNC_Polyhedron>& s = partition.second;
-  typedef Polyhedra_Powerset<NNC_Polyhedron>::const_iterator iter;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
   for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
     // The polyhedral hull is exact if and only if all the elements
     // of the partition of the polyhedral hull of `p' and `q' with
@@ -41156,20 +75294,28 @@ poly_hull_assign_if_exact(PH& p, const PH& q) {
 } // namespace Parma_Polyhedra_Library
 
 
+#ifdef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS
+#endif
+#ifdef PPL_SAVE_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS PPL_SAVE_STDC_LIMIT_MACROS
+# undef PPL_SAVE_STDC_LIMIT_MACROS
+#endif
+
 #ifdef PPL_SAVE_NDEBUG
-# define NDEBUG 1
+# ifndef NDEBUG
+#  define NDEBUG PPL_SAVE_NDEBUG
+# endif
 # undef PPL_SAVE_NDEBUG
 #else
-# undef NDEBUG
+# ifdef NDEBUG
+#  undef NDEBUG
+# endif
 #endif
 #include <cassert>
 
-#undef PACKAGE
-#undef PACKAGE_BUGREPORT
-#undef PACKAGE_NAME
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-#undef VERSION
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION
+#endif
 
 #endif
diff --git a/src/ppl_header.hh b/src/ppl_header.hh
index b24a9b1..f955266 100644
--- a/src/ppl_header.hh
+++ b/src/ppl_header.hh
@@ -1,11 +1,11 @@
 /* This is the header file of the Parma Polyhedra Library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,28 +24,40 @@ site: http://www.cs.unipr.it/ppl/ . */
 #define PPL_ppl_hh 1
 
 #ifdef NDEBUG
-# define PPL_SAVE_NDEBUG 1
+# define PPL_SAVE_NDEBUG NDEBUG
 # undef NDEBUG
 #endif
 
-#include "config.h"
+#ifdef __STDC_LIMIT_MACROS
+# define PPL_SAVE_STDC_LIMIT_MACROS __STDC_LIMIT_MACROS
+#endif
+
+#include "ppl-config.h"
 #include "version.hh"
 #include "ppl_include_files.hh"
 
+#ifdef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS
+#endif
+#ifdef PPL_SAVE_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS PPL_SAVE_STDC_LIMIT_MACROS
+# undef PPL_SAVE_STDC_LIMIT_MACROS
+#endif
+
 #ifdef PPL_SAVE_NDEBUG
-# define NDEBUG 1
+# ifndef NDEBUG
+#  define NDEBUG PPL_SAVE_NDEBUG
+# endif
 # undef PPL_SAVE_NDEBUG
 #else
-# undef NDEBUG
+# ifdef NDEBUG
+#  undef NDEBUG
+# endif
 #endif
 #include <cassert>
 
-#undef PACKAGE
-#undef PACKAGE_BUGREPORT
-#undef PACKAGE_NAME
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-#undef VERSION
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION
+#endif
 
 #endif
diff --git a/src/simplify.cc b/src/simplify.cc
index 6d8b45e..c25a283 100644
--- a/src/simplify.cc
+++ b/src/simplify.cc
@@ -1,11 +1,11 @@
 /* Polyhedron class implementation: simplify().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,12 +20,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "Linear_Row.defs.hh"
 #include "Linear_System.defs.hh"
-#include "Saturation_Row.defs.hh"
-#include "Saturation_Matrix.defs.hh"
+#include "Bit_Matrix.defs.hh"
 #include "Polyhedron.defs.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
@@ -78,10 +77,11 @@ namespace PPL = Parma_Polyhedra_Library;
   \f]
   where \f$\lambda_1, \lambda_2\f$ can be any real number.
 */
-int
-PPL::Polyhedron::simplify(Linear_System& sys, Saturation_Matrix& sat) {
+PPL::dimension_type
+PPL::Polyhedron::simplify(Linear_System& sys, Bit_Matrix& sat) {
   // This method is only applied to a well-formed system `sys'.
   assert(sys.OK(true));
+  assert(sys.num_columns() >= 1);
 
   dimension_type num_rows = sys.num_rows();
   const dimension_type num_columns = sys.num_columns();
@@ -95,8 +95,15 @@ PPL::Polyhedron::simplify(Linear_System& sys, Saturation_Matrix& sat) {
 
   // `num_saturators[i]' will contain the number of generators
   // that saturate the constraint `sys[i]'.
-  static std::vector<dimension_type> num_saturators;
-  num_saturators.reserve(num_rows);
+  if (num_rows > simplify_num_saturators_size) {
+    delete [] simplify_num_saturators_p;
+    simplify_num_saturators_p = 0;
+    simplify_num_saturators_size = 0;
+    size_t new_size = compute_capacity(num_rows);
+    simplify_num_saturators_p = new dimension_type[new_size];
+    simplify_num_saturators_size = new_size;
+  }
+  dimension_type* num_saturators = simplify_num_saturators_p;
 
   // Computing the number of saturators for each inequality,
   // possibly identifying and swapping those that happen to be
diff --git a/src/swapping_sort.icc b/src/swapping_sort.icc
index a5de46b..80b2913 100644
--- a/src/swapping_sort.icc
+++ b/src/swapping_sort.icc
@@ -1,11 +1,11 @@
 /* Sorting objects for which copies cost more than swaps.  -*- C++ -*-
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,10 +34,10 @@ namespace {
 
   Moreover, the algorithm always uses std:iter_swap() instead of
   std::swap() so as to behave as expected when instantiated on
-  Linear_System::With_Saturation_Matrix_iterator. Namely, using a sorting
+  Linear_System::With_Bit_Matrix_iterator. Namely, using a sorting
   routine that either copies objects or directly swaps them
   (i.e., without calling std::iter_swap) would not be correct
-  when using Linear_System::With_Saturation_Matrix_iterator.
+  when using Linear_System::With_Bit_Matrix_iterator.
 */
 
 template <typename Value_Type, typename Compare>
diff --git a/src/version.cc b/src/version.cc
index 72cbeab..37f156b 100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -1,11 +1,11 @@
 /* Definition of functions providing version and licensing information.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,18 +20,18 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 #include "version.hh"
 
 namespace PPL = Parma_Polyhedra_Library;
 
 namespace {
 
-const char version_string[] = PACKAGE_VERSION;
+const char version_string[] = PPL_PACKAGE_VERSION;
 
 const char banner_string[] =
-"This is "PACKAGE_NAME" (PPL) version "PACKAGE_VERSION".\n"
-"Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>.\n"
+"This is "PPL_PACKAGE_NAME" (PPL) version "PPL_PACKAGE_VERSION".\n"
+"Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>.\n"
 "The PPL is free software; see the source for copying conditions.\n"
 "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
 "PARTICULAR PURPOSE.\n"
@@ -46,7 +46,7 @@ const char banner_string[] =
 #define xstr(s) str(s)
 "Compiled by the Comeau C++ compiler version "xstr(__COMO_VERSION__)".\n"
 #endif
-"Report bugs to "PACKAGE_BUGREPORT".\n"
+"Report bugs to "PPL_PACKAGE_BUGREPORT".\n"
 "For the most up-to-date information see the Parma Polyhedra Library\n"
 "site: http://www.cs.unipr.it/ppl/ .\n";
 
diff --git a/src/version.hh.in b/src/version.hh.in
index 01d76d8..5c29f66 100644
--- a/src/version.hh.in
+++ b/src/version.hh.in
@@ -1,12 +1,12 @@
 /* Declaration of macros and functions providing version  -*- C++ -*-
    and licensing information.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/BBox.cc b/tests/BBox.cc
deleted file mode 100644
index a113b88..0000000
--- a/tests/BBox.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Implementation of class BBox (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include <config.h>
-
-#include "globals.defs.hh"
-#include "Coefficient.defs.hh"
-#include "BBox.hh"
-
-#include "Variable.defs.hh"
-#include <iostream>
-
-using namespace Parma_Polyhedra_Library;
-using namespace Parma_Polyhedra_Library::IO_Operators;
-
-void
-BInterval::raise_lower_bound(bool closed,
-			     Coefficient_traits::const_reference c,
-			     Coefficient_traits::const_reference d) {
-  assert(d > 0 && ld >= 0);
-  if ((closed && lc*d <= c*ld) || (!closed && lc*d < c*ld))  {
-    lc = c;
-    ld = d;
-    lclosed = closed;
-  }
-}
-
-void
-BInterval::lower_upper_bound(bool closed,
-			     Coefficient_traits::const_reference c,
-			     Coefficient_traits::const_reference d) {
-  assert(d > 0 && ud >= 0);
-  if ((!closed && uc*d >= c*ud) || (closed && uc*d > c*ud))  {
-    uc = c;
-    ud = d;
-    uclosed = closed;
-  }
-}
-
-void
-BInterval::set_empty() {
-  uc = -1;
-  lc = 1;
-  ud = 1;
-  ld = 1;
-}
-
-static void
-print_rational(std::ostream& s,
-	       Coefficient_traits::const_reference c,
-	       Coefficient_traits::const_reference d) {
-  s << c;
-  if (d != 1)
-    s << "/" << d;
-}
-
-void
-BInterval::print(std::ostream& s) const {
-  if (ld != 0) {
-    s << (lclosed ? "[" : "(");
-    print_rational(s, lc, ld);
-  }
-  else
-    s << "(-inf";
-  s << ", ";
-  if (ud != 0) {
-    print_rational(s, uc, ud);
-    s << (uclosed ? "]" : ")");
-  }
-  else
-    s << "+inf)";
-}
-
-bool
-operator==(const BInterval& x, const BInterval& y) {
-  return x.lclosed == y.lclosed
-    && x.uclosed == y.uclosed
-    && x.lc*y.ld == y.lc*x.ld
-    && x.uc*y.ud == y.uc*x.ud;
-}
-
-bool
-operator<=(const BInterval& x, const BInterval& y) {
-  int l_sign = sgn(x.ld) * sgn(y.ld);
-  int u_sign = sgn(x.ud) * sgn(y.ud);
-  if (y.lclosed || (!x.lclosed && !y.lclosed)) {
-    if (l_sign > 0 && x.lc * y.ld < y.lc * x.ld)
-      return false;
-    if (l_sign < 0 && x.lc * y.ld > y.lc * x.ld)
-      return false;
-    if (l_sign == 0)
-      if (x.ld == 0 && x.lc < 0 && (y.ld != 0 || (y.ld == 0 && y.ld > 0)))
-	return false;
-  }
-  else {
-    assert(!y.lclosed && x.lclosed);
-    if (l_sign > 0 && x.lc * y.ld <= y.lc * x.ld)
-      return false;
-    if (l_sign < 0 && x.lc * y.ld >= y.lc * x.ld)
-      return false;
-    if (l_sign == 0)
-      if (x.ld == 0 && x.lc < 0)
-	return false;
-  }
-  if (y.uclosed || (!x.uclosed && !y.uclosed)) {
-    if (u_sign > 0 && x.uc * y.ud > y.uc * x.ud)
-      return false;
-    if (u_sign < 0 && x.uc * y.ud < y.uc * x.ud)
-      return false;
-    if (u_sign == 0)
-      if (x.ud == 0 && x.uc > 0 && (y.ud != 0 || (y.ud == 0 && y.ud < 0)))
-	return false;
-  }
-  else {
-    assert(!y.uclosed && x.uclosed);
-    if (u_sign > 0 && x.uc * y.ud >= y.uc * x.ud)
-      return false;
-    if (u_sign < 0 && x.uc * y.ud <= y.uc * x.ud)
-      return false;
-    if (u_sign == 0)
-      if (x.ud == 0 && x.uc > 0)
-	return false;
-  }
-  return true;
-}
-
-void
-BBox::print(std::ostream& s, const std::string& intro) const {
-  if (!intro.empty())
-    s << intro << std::endl;
-  dimension_type dim = box.size();
-  for (dimension_type j = 0; j != dim ; j++) {
-    s << Variable(j) << ": ";
-    box[j].print(s);
-    s << std::endl;
-  }
-}
-
-void
-BBox::set_empty() {
-  for (dimension_type k = box.size(); k-- > 0; )
-    box[k].set_empty();
-}
-
-bool
-operator==(const BBox& x, const BBox& y) {
-  dimension_type dimension = x.space_dimension();
-  if (dimension != y.space_dimension())
-    return false;
-
-  for (dimension_type i = dimension; i-- > 0; )
-    if (x[i] != y[i])
-      return false;
-
-  return true;
-}
-
-bool
-operator<=(const BBox& x, const BBox& y) {
-  dimension_type dimension = x.space_dimension();
-  if (dimension > y.space_dimension())
-    return false;
-
-  for (dimension_type i = dimension; i-- > 0; )
-    if (!(x[i] <= y[i]))
-      return false;
-
-  return true;
-}
diff --git a/tests/BBox.hh b/tests/BBox.hh
deleted file mode 100644
index ff3327b..0000000
--- a/tests/BBox.hh
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Declarations and inline functions for class BBox, a toy bounding box.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#ifndef PPL_BBox_hh
-#define PPL_BBox_hh 1
-
-#include <iosfwd>
-#include <vector>
-
-class BInterval {
-public:
-  BInterval();
-  void raise_lower_bound
-  (bool closed,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
-  void lower_upper_bound
-  (bool closed,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
-  void set_empty();
-  void print(std::ostream& s) const;
-
-private:
-  bool uclosed;
-  Parma_Polyhedra_Library::Coefficient uc;
-  Parma_Polyhedra_Library::Coefficient ud;
-  bool lclosed;
-  Parma_Polyhedra_Library::Coefficient lc;
-  Parma_Polyhedra_Library::Coefficient ld;
-
-  friend bool operator==(const BInterval& x, const BInterval& y);
-  friend bool operator<=(const BInterval& x, const BInterval& y);
-};
-
-inline
-BInterval::BInterval()
-  : uclosed(true), uc(1), ud(0), lclosed(true), lc(-1), ld(0) {
-}
-
-inline bool
-operator!=(const BInterval& x, const BInterval& y) {
-  return !(x == y);
-}
-
-class BBox {
-public:
-  BBox(Parma_Polyhedra_Library::dimension_type dimension);
-  Parma_Polyhedra_Library::dimension_type space_dimension() const;
-  const BInterval& operator[](Parma_Polyhedra_Library::dimension_type k) const;
-  void print(std::ostream& s, const std::string& intro = "") const;
-  void raise_lower_bound
-  (Parma_Polyhedra_Library::dimension_type k, bool closed,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
-  void lower_upper_bound
-  (Parma_Polyhedra_Library::dimension_type k, bool closed,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
-   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
-  void set_empty();
-
-private:
-  std::vector<BInterval> box;
-};
-
-inline
-BBox::BBox(Parma_Polyhedra_Library::dimension_type dimension) {
-  box.resize(dimension);
-}
-
-inline Parma_Polyhedra_Library::dimension_type
-BBox::space_dimension() const {
-  return box.size();
-}
-
-inline const BInterval&
-BBox::operator[](Parma_Polyhedra_Library::dimension_type k) const {
-  return box[k];
-}
-
-inline void
-BBox::raise_lower_bound
-(Parma_Polyhedra_Library::dimension_type k, bool closed,
- Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
- Parma_Polyhedra_Library::Coefficient_traits::const_reference d) {
-  assert(k < box.size());
-  box[k].raise_lower_bound(closed, c, d);
-}
-
-inline void
-BBox::lower_upper_bound
-(Parma_Polyhedra_Library::dimension_type k, bool closed,
- Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
- Parma_Polyhedra_Library::Coefficient_traits::const_reference d) {
-  assert(k < box.size());
-  box[k].lower_upper_bound(closed, c, d);
-}
-
-bool
-operator==(const BBox& x, const BBox& y);
-
-bool
-operator<=(const BBox& x, const BBox& y);
-
-inline bool
-operator!=(const BBox& x, const BBox& y) {
-  return !(x == y);
-}
-
-#endif // !defined(PPL_BBox_hh)
diff --git a/tests/BD_Shape/Makefile.am b/tests/BD_Shape/Makefile.am
index ff2ab73..a6157c9 100644
--- a/tests/BD_Shape/Makefile.am
+++ b/tests/BD_Shape/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,10 +20,10 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-#CHECKER =
-CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
 
-TESTS_ENVIRONMENT = CHEKER="$(CHECKER)"
+TESTS_ENVIRONMENT = CHECKER="$(CHECKER)"
 
 AM_CPPFLAGS = \
 $(TEST_CPPFLAGS) \
@@ -41,49 +41,76 @@ $(top_builddir)/src/libppl.la \
 @extra_libraries@
 
 check_PROGRAMS = \
-	addconstraints1 \
-	addspacedims1 \
-	affinedimension1 \
-	affineimage1 affineimage2 \
-	affinepreimage1 affinepreimage2 \
-	ascii_dump_load1 \
-	bdsdifference1 \
-	bdshull1 \
-	bgp99extrapolation1 \
-	bhmz05widening1 \
-	bhz03widening1 \
-	cc76narrowing1 \
-	cc76extrapolation1 \
-	closure1 \
-	concatenate1 \
-	constraints1 \
-	contains1 \
-	empty1 \
-	equality1 \
-	fromgensys1 \
-	generalizedaffineimage1 generalizedaffineimage2 \
-	generalizedaffinepreimage1 generalizedaffinepreimage2 \
-	geomcovers1 \
-	h79widening1 \
-	intersection1 \
-	limitedbhmz05extrapolation1 \
-	limitedcc76extrapolation1 \
-	limitedh79extrapolation1 \
-	mapspacedims1 \
-	maxspacedim \
-	minconstraints1 \
-	relations1 relations2 relations3 \
-	removespacedims1 \
-	timeelapse1 \
-	universe1 \
-	writebdshape1
-
-# This will be overriden by the `run_tests' script.
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+ascii_dump_load1 \
+bdsdifference1 \
+bdshull1 \
+bgp99extrapolation1 \
+bhmz05widening1 \
+bhz03widening1 \
+bounded1 \
+bounds1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76extrapolation1 \
+closure1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+geomcovers1 \
+h79widening1 \
+intersection1 \
+limitedbhmz05extrapolation1 \
+limitedcc76extrapolation1 \
+limitedh79extrapolation1 \
+mapspacedims1 \
+max_min1 max_min2 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+pointsetpowerset1 \
+relations1 relations2 relations3 relations4 \
+removespacedims1 \
+timeelapse1 \
+unconstrain1 \
+universe1 \
+writebdshape1
+
+# This will be overridden by the `run_tests' script.
 TEST_CPPFLAGS=-DBD_SHAPE_INSTANCE=mpq_class
 
 dist_check_SCRIPTS = run_tests
 
-TESTS = $(dist_check_SCRIPTS)
+TESTS = run_tests.stamp
+
+run_tests.stamp: run_tests
+	+$(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
 
 XFAIL_TESTS =
 
@@ -129,7 +156,6 @@ affineimage1_SOURCES = affineimage1.cc
 affineimage2_SOURCES = affineimage2.cc
 
 affinepreimage1_SOURCES = affinepreimage1.cc
-affinepreimage2_SOURCES = affinepreimage2.cc
 
 ascii_dump_load1_SOURCES = ascii_dump_load1.cc
 
@@ -143,6 +169,14 @@ bhmz05widening1_SOURCES = bhmz05widening1.cc
 
 bhz03widening1_SOURCES = bhz03widening1.cc
 
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
 cc76narrowing1_SOURCES = cc76narrowing1.cc
 
 cc76extrapolation1_SOURCES = cc76extrapolation1.cc
@@ -151,21 +185,48 @@ closure1_SOURCES = closure1.cc
 
 concatenate1_SOURCES = concatenate1.cc
 
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
 constraints1_SOURCES = constraints1.cc
 
 contains1_SOURCES = contains1.cc
 
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
 empty1_SOURCES = empty1.cc
 
 equality1_SOURCES = equality1.cc
 
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
 fromgensys1_SOURCES = fromgensys1.cc
 
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
 generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
 
 generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
 generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
 
 geomcovers1_SOURCES = geomcovers1.cc
 
@@ -181,18 +242,28 @@ limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
 
 mapspacedims1_SOURCES = mapspacedims1.cc
 
-maxspacedim_SOURCES = maxspacedim.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+membytes1_SOURCES = membytes1.cc
 
 minconstraints1_SOURCES = minconstraints1.cc
 
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+
 relations1_SOURCES = relations1.cc
 relations2_SOURCES = relations2.cc
 relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
 
 removespacedims1_SOURCES = removespacedims1.cc
 
 timeelapse1_SOURCES = timeelapse1.cc
 
+unconstrain1_SOURCES = unconstrain1.cc
+
 universe1_SOURCES = universe1.cc
 
 writebdshape1_SOURCES = writebdshape1.cc
@@ -200,3 +271,6 @@ writebdshape1_SOURCES = writebdshape1.cc
 
 MOSTLYCLEANFILES = \
 ascii_dump_load1.dat
+
+DISTCLEANFILES = \
+run_tests.stamp
diff --git a/tests/BD_Shape/Makefile.in b/tests/BD_Shape/Makefile.in
index 147ca7c..f7ff28e 100644
--- a/tests/BD_Shape/Makefile.in
+++ b/tests/BD_Shape/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -60,30 +56,43 @@ host_triplet = @host@
 check_PROGRAMS = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
 	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
 	affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
-	affinepreimage2$(EXEEXT) ascii_dump_load1$(EXEEXT) \
-	bdsdifference1$(EXEEXT) bdshull1$(EXEEXT) \
-	bgp99extrapolation1$(EXEEXT) bhmz05widening1$(EXEEXT) \
-	bhz03widening1$(EXEEXT) cc76narrowing1$(EXEEXT) \
-	cc76extrapolation1$(EXEEXT) closure1$(EXEEXT) \
-	concatenate1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
-	empty1$(EXEEXT) equality1$(EXEEXT) fromgensys1$(EXEEXT) \
+	ascii_dump_load1$(EXEEXT) bdsdifference1$(EXEEXT) \
+	bdshull1$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
+	bhmz05widening1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) bounds1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	cc76narrowing1$(EXEEXT) cc76extrapolation1$(EXEEXT) \
+	closure1$(EXEEXT) concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+	constrains1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+	disjoint1$(EXEEXT) empty1$(EXEEXT) equality1$(EXEEXT) \
+	expandspacedim1$(EXEEXT) foldspacedims1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgensys1$(EXEEXT) \
+	fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) fromspacedim1$(EXEEXT) \
 	generalizedaffineimage1$(EXEEXT) \
 	generalizedaffineimage2$(EXEEXT) \
 	generalizedaffinepreimage1$(EXEEXT) \
-	generalizedaffinepreimage2$(EXEEXT) geomcovers1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) geomcovers1$(EXEEXT) \
 	h79widening1$(EXEEXT) intersection1$(EXEEXT) \
 	limitedbhmz05extrapolation1$(EXEEXT) \
 	limitedcc76extrapolation1$(EXEEXT) \
 	limitedh79extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
-	maxspacedim$(EXEEXT) minconstraints1$(EXEEXT) \
-	relations1$(EXEEXT) relations2$(EXEEXT) relations3$(EXEEXT) \
+	max_min1$(EXEEXT) max_min2$(EXEEXT) maxspacedim1$(EXEEXT) \
+	membytes1$(EXEEXT) minconstraints1$(EXEEXT) \
+	pointsetpowerset1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) relations4$(EXEEXT) \
 	removespacedims1$(EXEEXT) timeelapse1$(EXEEXT) \
-	universe1$(EXEEXT) writebdshape1$(EXEEXT)
+	unconstrain1$(EXEEXT) universe1$(EXEEXT) \
+	writebdshape1$(EXEEXT)
+XFAIL_TESTS =
 subdir = tests/BD_Shape
 DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -93,8 +102,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -137,12 +156,6 @@ affinepreimage1_LDADD = $(LDADD)
 affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
-affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
-affinepreimage2_LDADD = $(LDADD)
-affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
 am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
 ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
 ascii_dump_load1_LDADD = $(LDADD)
@@ -180,6 +193,32 @@ bhz03widening1_LDADD = $(LDADD)
 bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
 cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
 cc76extrapolation1_LDADD = $(LDADD)
@@ -205,6 +244,18 @@ concatenate1_LDADD = $(LDADD)
 concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_constraints1_OBJECTS = constraints1.$(OBJEXT)
 constraints1_OBJECTS = $(am_constraints1_OBJECTS)
 constraints1_LDADD = $(LDADD)
@@ -217,6 +268,25 @@ contains1_LDADD = $(LDADD)
 contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_empty1_OBJECTS = empty1.$(OBJEXT)
 empty1_OBJECTS = $(am_empty1_OBJECTS)
 empty1_LDADD = $(LDADD)
@@ -229,12 +299,61 @@ equality1_LDADD = $(LDADD)
 equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
 fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
 fromgensys1_LDADD = $(LDADD)
 fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_generalizedaffineimage1_OBJECTS =  \
 	generalizedaffineimage1.$(OBJEXT)
 generalizedaffineimage1_OBJECTS =  \
@@ -271,6 +390,15 @@ generalizedaffinepreimage2_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS =  \
+	generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS =  \
+	$(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
 geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
 geomcovers1_LDADD = $(LDADD)
@@ -322,10 +450,28 @@ mapspacedims1_LDADD = $(LDADD)
 mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_maxspacedim_OBJECTS = maxspacedim.$(OBJEXT)
-maxspacedim_OBJECTS = $(am_maxspacedim_OBJECTS)
-maxspacedim_LDADD = $(LDADD)
-maxspacedim_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min2_OBJECTS = max_min2.$(OBJEXT)
+max_min2_OBJECTS = $(am_max_min2_OBJECTS)
+max_min2_LDADD = $(LDADD)
+max_min2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
 am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
@@ -334,6 +480,12 @@ minconstraints1_LDADD = $(LDADD)
 minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_pointsetpowerset1_OBJECTS = pointsetpowerset1.$(OBJEXT)
+pointsetpowerset1_OBJECTS = $(am_pointsetpowerset1_OBJECTS)
+pointsetpowerset1_LDADD = $(LDADD)
+pointsetpowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_relations1_OBJECTS = relations1.$(OBJEXT)
 relations1_OBJECTS = $(am_relations1_OBJECTS)
 relations1_LDADD = $(LDADD)
@@ -352,6 +504,12 @@ relations3_LDADD = $(LDADD)
 relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_relations4_OBJECTS = relations4.$(OBJEXT)
+relations4_OBJECTS = $(am_relations4_OBJECTS)
+relations4_LDADD = $(LDADD)
+relations4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
 removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
 removespacedims1_LDADD = $(LDADD)
@@ -364,6 +522,12 @@ timeelapse1_LDADD = $(LDADD)
 timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_universe1_OBJECTS = universe1.$(OBJEXT)
 universe1_OBJECTS = $(am_universe1_OBJECTS)
 universe1_LDADD = $(LDADD)
@@ -376,100 +540,104 @@ writebdshape1_LDADD = $(LDADD)
 writebdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
 	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
 	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
-	$(affinepreimage2_SOURCES) $(ascii_dump_load1_SOURCES) \
-	$(bdsdifference1_SOURCES) $(bdshull1_SOURCES) \
-	$(bgp99extrapolation1_SOURCES) $(bhmz05widening1_SOURCES) \
-	$(bhz03widening1_SOURCES) $(cc76extrapolation1_SOURCES) \
-	$(cc76narrowing1_SOURCES) $(closure1_SOURCES) \
-	$(concatenate1_SOURCES) $(constraints1_SOURCES) \
-	$(contains1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
-	$(fromgensys1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bdsdifference1_SOURCES) \
+	$(bdshull1_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bhmz05widening1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(closure1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
 	$(generalizedaffineimage2_SOURCES) \
 	$(generalizedaffinepreimage1_SOURCES) \
-	$(generalizedaffinepreimage2_SOURCES) $(geomcovers1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(geomcovers1_SOURCES) \
 	$(h79widening1_SOURCES) $(intersection1_SOURCES) \
 	$(limitedbhmz05extrapolation1_SOURCES) \
 	$(limitedcc76extrapolation1_SOURCES) \
 	$(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
-	$(maxspacedim_SOURCES) $(minconstraints1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(pointsetpowerset1_SOURCES) \
 	$(relations1_SOURCES) $(relations2_SOURCES) \
-	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
-	$(timeelapse1_SOURCES) $(universe1_SOURCES) \
+	$(relations3_SOURCES) $(relations4_SOURCES) \
+	$(removespacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
 	$(writebdshape1_SOURCES)
 DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
 	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
 	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
-	$(affinepreimage2_SOURCES) $(ascii_dump_load1_SOURCES) \
-	$(bdsdifference1_SOURCES) $(bdshull1_SOURCES) \
-	$(bgp99extrapolation1_SOURCES) $(bhmz05widening1_SOURCES) \
-	$(bhz03widening1_SOURCES) $(cc76extrapolation1_SOURCES) \
-	$(cc76narrowing1_SOURCES) $(closure1_SOURCES) \
-	$(concatenate1_SOURCES) $(constraints1_SOURCES) \
-	$(contains1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
-	$(fromgensys1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bdsdifference1_SOURCES) \
+	$(bdshull1_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bhmz05widening1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(closure1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
 	$(generalizedaffineimage2_SOURCES) \
 	$(generalizedaffinepreimage1_SOURCES) \
-	$(generalizedaffinepreimage2_SOURCES) $(geomcovers1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(geomcovers1_SOURCES) \
 	$(h79widening1_SOURCES) $(intersection1_SOURCES) \
 	$(limitedbhmz05extrapolation1_SOURCES) \
 	$(limitedcc76extrapolation1_SOURCES) \
 	$(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
-	$(maxspacedim_SOURCES) $(minconstraints1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(pointsetpowerset1_SOURCES) \
 	$(relations1_SOURCES) $(relations2_SOURCES) \
-	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
-	$(timeelapse1_SOURCES) $(universe1_SOURCES) \
+	$(relations3_SOURCES) $(relations4_SOURCES) \
+	$(removespacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
 	$(writebdshape1_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -479,53 +647,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -534,56 +700,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -595,10 +735,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -607,29 +751,46 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-
-#CHECKER =
-CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
-TESTS_ENVIRONMENT = CHEKER="$(CHECKER)"
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = CHECKER="$(CHECKER)"
 AM_CPPFLAGS = \
 $(TEST_CPPFLAGS) \
 -I$(top_builddir)/src \
@@ -646,11 +807,10 @@ $(top_builddir)/src/libppl.la \
 @extra_libraries@
 
 
-# This will be overriden by the `run_tests' script.
+# This will be overridden by the `run_tests' script.
 TEST_CPPFLAGS = -DBD_SHAPE_INSTANCE=mpq_class
 dist_check_SCRIPTS = run_tests
-TESTS = $(dist_check_SCRIPTS)
-XFAIL_TESTS = 
+TESTS = run_tests.stamp
 @SUPPORTED_FLOAT_TRUE at FLOAT_INSTANCE = float
 @SUPPORTED_DOUBLE_TRUE at DOUBLE_INSTANCE = double
 @SUPPORTED_LONG_DOUBLE_TRUE at LONG_DOUBLE_INSTANCE = long_double
@@ -677,26 +837,43 @@ affinedimension1_SOURCES = affinedimension1.cc
 affineimage1_SOURCES = affineimage1.cc
 affineimage2_SOURCES = affineimage2.cc
 affinepreimage1_SOURCES = affinepreimage1.cc
-affinepreimage2_SOURCES = affinepreimage2.cc
 ascii_dump_load1_SOURCES = ascii_dump_load1.cc
 bdsdifference1_SOURCES = bdsdifference1.cc
 bdshull1_SOURCES = bdshull1.cc
 bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
 bhmz05widening1_SOURCES = bhmz05widening1.cc
 bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
 cc76narrowing1_SOURCES = cc76narrowing1.cc
 cc76extrapolation1_SOURCES = cc76extrapolation1.cc
 closure1_SOURCES = closure1.cc
 concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
 constraints1_SOURCES = constraints1.cc
 contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
 empty1_SOURCES = empty1.cc
 equality1_SOURCES = equality1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
 fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
 generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
 generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
 generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
 geomcovers1_SOURCES = geomcovers1.cc
 h79widening1_SOURCES = h79widening1.cc
 intersection1_SOURCES = intersection1.cc
@@ -704,18 +881,27 @@ limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
 limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
 limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
 mapspacedims1_SOURCES = mapspacedims1.cc
-maxspacedim_SOURCES = maxspacedim.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+membytes1_SOURCES = membytes1.cc
 minconstraints1_SOURCES = minconstraints1.cc
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
 relations1_SOURCES = relations1.cc
 relations2_SOURCES = relations2.cc
 relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
 removespacedims1_SOURCES = removespacedims1.cc
 timeelapse1_SOURCES = timeelapse1.cc
+unconstrain1_SOURCES = unconstrain1.cc
 universe1_SOURCES = universe1.cc
 writebdshape1_SOURCES = writebdshape1.cc
 MOSTLYCLEANFILES = \
 ascii_dump_load1.dat
 
+DISTCLEANFILES = \
+run_tests.stamp
+
 all: all-am
 
 .SUFFIXES:
@@ -758,130 +944,199 @@ clean-checkPROGRAMS:
 	done
 addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
 	@rm -f addconstraints1$(EXEEXT)
-	$(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
 addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
 	@rm -f addspacedims1$(EXEEXT)
-	$(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
 affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) 
 	@rm -f affinedimension1$(EXEEXT)
-	$(CXXLINK) $(affinedimension1_LDFLAGS) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+	$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
 affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
 	@rm -f affineimage1$(EXEEXT)
-	$(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
 affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
 	@rm -f affineimage2$(EXEEXT)
-	$(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
 affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
 	@rm -f affinepreimage1$(EXEEXT)
-	$(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
-affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) 
-	@rm -f affinepreimage2$(EXEEXT)
-	$(CXXLINK) $(affinepreimage2_LDFLAGS) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
 ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
 	@rm -f ascii_dump_load1$(EXEEXT)
-	$(CXXLINK) $(ascii_dump_load1_LDFLAGS) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+	$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
 bdsdifference1$(EXEEXT): $(bdsdifference1_OBJECTS) $(bdsdifference1_DEPENDENCIES) 
 	@rm -f bdsdifference1$(EXEEXT)
-	$(CXXLINK) $(bdsdifference1_LDFLAGS) $(bdsdifference1_OBJECTS) $(bdsdifference1_LDADD) $(LIBS)
+	$(CXXLINK) $(bdsdifference1_OBJECTS) $(bdsdifference1_LDADD) $(LIBS)
 bdshull1$(EXEEXT): $(bdshull1_OBJECTS) $(bdshull1_DEPENDENCIES) 
 	@rm -f bdshull1$(EXEEXT)
-	$(CXXLINK) $(bdshull1_LDFLAGS) $(bdshull1_OBJECTS) $(bdshull1_LDADD) $(LIBS)
+	$(CXXLINK) $(bdshull1_OBJECTS) $(bdshull1_LDADD) $(LIBS)
 bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) 
 	@rm -f bgp99extrapolation1$(EXEEXT)
-	$(CXXLINK) $(bgp99extrapolation1_LDFLAGS) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
 bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) 
 	@rm -f bhmz05widening1$(EXEEXT)
-	$(CXXLINK) $(bhmz05widening1_LDFLAGS) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
 bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
 	@rm -f bhz03widening1$(EXEEXT)
-	$(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
 cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) 
 	@rm -f cc76extrapolation1$(EXEEXT)
-	$(CXXLINK) $(cc76extrapolation1_LDFLAGS) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
 cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) 
 	@rm -f cc76narrowing1$(EXEEXT)
-	$(CXXLINK) $(cc76narrowing1_LDFLAGS) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+	$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
 closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) 
 	@rm -f closure1$(EXEEXT)
-	$(CXXLINK) $(closure1_LDFLAGS) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+	$(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
 concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
 	@rm -f concatenate1$(EXEEXT)
-	$(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+	$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
 constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
 	@rm -f constraints1$(EXEEXT)
-	$(CXXLINK) $(constraints1_LDFLAGS) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
 contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
 	@rm -f contains1$(EXEEXT)
-	$(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+	$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
 empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) 
 	@rm -f empty1$(EXEEXT)
-	$(CXXLINK) $(empty1_LDFLAGS) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+	$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
 equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) 
 	@rm -f equality1$(EXEEXT)
-	$(CXXLINK) $(equality1_LDFLAGS) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+	$(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
 fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) 
 	@rm -f fromgensys1$(EXEEXT)
-	$(CXXLINK) $(fromgensys1_LDFLAGS) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+	$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) 
+	@rm -f fromspacedim1$(EXEEXT)
+	$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
 generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
 	@rm -f generalizedaffineimage1$(EXEEXT)
-	$(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
 generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
 	@rm -f generalizedaffineimage2$(EXEEXT)
-	$(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
 generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
 	@rm -f generalizedaffinepreimage1$(EXEEXT)
-	$(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
 generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
 	@rm -f generalizedaffinepreimage2$(EXEEXT)
-	$(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage3$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
 geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) 
 	@rm -f geomcovers1$(EXEEXT)
-	$(CXXLINK) $(geomcovers1_LDFLAGS) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+	$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
 h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) 
 	@rm -f h79widening1$(EXEEXT)
-	$(CXXLINK) $(h79widening1_LDFLAGS) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
 intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
 	@rm -f intersection1$(EXEEXT)
-	$(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+	$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
 limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) 
 	@rm -f limitedbhmz05extrapolation1$(EXEEXT)
-	$(CXXLINK) $(limitedbhmz05extrapolation1_LDFLAGS) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
 limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) 
 	@rm -f limitedcc76extrapolation1$(EXEEXT)
-	$(CXXLINK) $(limitedcc76extrapolation1_LDFLAGS) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
 limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) 
 	@rm -f limitedh79extrapolation1$(EXEEXT)
-	$(CXXLINK) $(limitedh79extrapolation1_LDFLAGS) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
 mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
 	@rm -f mapspacedims1$(EXEEXT)
-	$(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
-maxspacedim$(EXEEXT): $(maxspacedim_OBJECTS) $(maxspacedim_DEPENDENCIES) 
-	@rm -f maxspacedim$(EXEEXT)
-	$(CXXLINK) $(maxspacedim_LDFLAGS) $(maxspacedim_OBJECTS) $(maxspacedim_LDADD) $(LIBS)
+	$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) 
+	@rm -f max_min2$(EXEEXT)
+	$(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS)
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
 minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) 
 	@rm -f minconstraints1$(EXEEXT)
-	$(CXXLINK) $(minconstraints1_LDFLAGS) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+pointsetpowerset1$(EXEEXT): $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_DEPENDENCIES) 
+	@rm -f pointsetpowerset1$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_LDADD) $(LIBS)
 relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
 	@rm -f relations1$(EXEEXT)
-	$(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+	$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
 relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
 	@rm -f relations2$(EXEEXT)
-	$(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+	$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
 relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) 
 	@rm -f relations3$(EXEEXT)
-	$(CXXLINK) $(relations3_LDFLAGS) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+	$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) 
+	@rm -f relations4$(EXEEXT)
+	$(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS)
 removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
 	@rm -f removespacedims1$(EXEEXT)
-	$(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
 timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
 	@rm -f timeelapse1$(EXEEXT)
-	$(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+	$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
 universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) 
 	@rm -f universe1$(EXEEXT)
-	$(CXXLINK) $(universe1_LDFLAGS) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+	$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
 writebdshape1$(EXEEXT): $(writebdshape1_OBJECTS) $(writebdshape1_DEPENDENCIES) 
 	@rm -f writebdshape1$(EXEEXT)
-	$(CXXLINK) $(writebdshape1_LDFLAGS) $(writebdshape1_OBJECTS) $(writebdshape1_LDADD) $(LIBS)
+	$(CXXLINK) $(writebdshape1_OBJECTS) $(writebdshape1_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -895,26 +1150,43 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdsdifference1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshull1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closure1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
@@ -922,33 +1194,39 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations4.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebdshape1.Po at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -959,17 +1237,13 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -981,8 +1255,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -992,13 +1266,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -1012,9 +1285,9 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
 	srcdir=$(srcdir); export srcdir; \
-	list='$(TESTS)'; \
+	list=' $(TESTS) '; \
 	if test -n "$$list"; then \
 	  for tst in $$list; do \
 	    if test -f ./$$tst; then dir=./; \
@@ -1023,7 +1296,7 @@ check-TESTS: $(TESTS)
 	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
 	      all=`expr $$all + 1`; \
 	      case " $(XFAIL_TESTS) " in \
-	      *" $$tst "*) \
+	      *$$ws$$tst$$ws*) \
 		xpass=`expr $$xpass + 1`; \
 		failed=`expr $$failed + 1`; \
 		echo "XPASS: $$tst"; \
@@ -1035,7 +1308,7 @@ check-TESTS: $(TESTS)
 	    elif test $$? -ne 77; then \
 	      all=`expr $$all + 1`; \
 	      case " $(XFAIL_TESTS) " in \
-	      *" $$tst "*) \
+	      *$$ws$$tst$$ws*) \
 		xfail=`expr $$xfail + 1`; \
 		echo "XFAIL: $$tst"; \
 	      ;; \
@@ -1085,22 +1358,21 @@ check-TESTS: $(TESTS)
 	else :; fi
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -1139,6 +1411,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -1152,7 +1425,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -1166,12 +1439,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -1192,20 +1473,29 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
 	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am
+	tags uninstall uninstall-am
+
 
+run_tests.stamp: run_tests
+	+$(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
 
 print_check_PROGRAMS:
 	echo $(check_PROGRAMS)
diff --git a/tests/BD_Shape/addconstraints1.cc b/tests/BD_Shape/addconstraints1.cc
index fa79a46..8ba01d3 100644
--- a/tests/BD_Shape/addconstraints1.cc
+++ b/tests/BD_Shape/addconstraints1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::add_constraints_and_minimize().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -33,17 +33,17 @@ test01() {
   cs.insert(A >= 0);
   cs.insert(B == 5);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraints_and_minimize(cs);
+  TBD_Shape bds(2);
+  bds.add_constraints_and_minimize(cs);
 
-  print_constraints(bd1, "*** bd1.add_constraints_and_minimize(cs) ***");
+  print_constraints(bds, "*** bds.add_constraints_and_minimize(cs) ***");
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 0);
   known_result.add_constraint(B == 5);
   known_result.add_constraint(B - A <= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
   print_constraints(known_result, "*** known_result ***");
 
@@ -55,22 +55,22 @@ test02() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
+  TBD_Shape bds(2);
 
   try {
-    // This is an invalid use of function
+    // This is an invalid use of method
     // BD_Shape::add_constraint: it is illegal
     // to add a strict inequality.
-    bd1.add_constraint(x <= 0);
-    bd1.add_constraint(y < 0);
+    bds.add_constraint(x <= 0);
+    bds.add_constraint(y < 0);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -79,142 +79,94 @@ test03() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(2);
+  TBD_Shape bds(2);
 
   try {
-    // This is an invalid use of function
+    // This is an invalid use of method
     // BD_Shape::add_constraint: it is illegal
     // to add a constraint with bigger dimension.
-    bd1.add_constraint(x <= 0);
-    bd1.add_constraint(y - x + z >= 0);
+    bds.add_constraint(x <= 0);
+    bds.add_constraint(y - x + z >= 0);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
 test04() {
   Variable x(0);
   Variable y(1);
-  Variable z(2);
-
-  TBD_Shape bd1(3);
-
-  try {
-    // This is an invalid use of function
-    // BD_Shape::add_constraint: it is illegal
-    // to add a constraint with three dimension.
-    bd1.add_constraint(x <= 0);
-    bd1.add_constraint(y - x + z >= 0);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-bool
-test05() {
-  Variable x(0);
-  Variable y(1);
-  // Variable z(2);
 
-  TBD_Shape bd1(3);
+  TBD_Shape bds(1);
 
   try {
-    // This is an invalid use of function
-    // BD_Shape::add_constraint: it is illegal
-    // to add a constraint with two different coefficients.
-    bd1.add_constraint(x <= 0);
-    bd1.add_constraint(2*y - 3*x <= 0);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-bool
-test06() {
-  Variable x(0);
-  Variable y(1);
-
-  TBD_Shape bd(1);
-
-  try {
-    // This is an invalid use of the function
+    // This is an invalid use of the method
     // BD_Shape::add_constraints_and_minimize(cs): it is illegal to
     // add a system of constraints that is not dimensional incompatible
     // with the polyhedron.
     Constraint_System cs;
     cs.insert(x - y >= 0);
-    bd.add_constraints_and_minimize(cs);
+    bds.add_constraints_and_minimize(cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
-test07() {
+test05() {
   Variable y(1);
 
-  TBD_Shape bd(1);
+  TBD_Shape bds(1);
 
   try {
-    // This is an invalid use of the function
-    // RBD_Shape::add_constraint(c): it is illegal to insert a
+    // This is an invalid use of the method
+    // BD_Shape::add_constraint(c): it is illegal to insert a
     // constraints that contains a variable that is not in the space
     // of the polyhedron.
-    bd.add_constraint(y >= 0);
+    bds.add_constraint(y >= 0);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
-test08() {
+test06() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(1);
+  TBD_Shape bds(1);
 
   try {
-    // This is an invalid use of the function
+    // This is an invalid use of the method
     // BD_Shape::add_constraints(cs): it is illegal to add a system
     // of constraints that is dimensional incompatible with the
     // polyhedron.
     Constraint_System cs;
     cs.insert(x - y == 0);
-    bd.add_constraints(cs);
+    bds.add_constraints(cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
@@ -226,6 +178,4 @@ BEGIN_MAIN
   DO_TEST(test04);
   DO_TEST(test05);
   DO_TEST(test06);
-  DO_TEST(test07);
-  DO_TEST(test08);
 END_MAIN
diff --git a/tests/BD_Shape/addspacedims1.cc b/tests/BD_Shape/addspacedims1.cc
index ee7852a..40b1680 100644
--- a/tests/BD_Shape/addspacedims1.cc
+++ b/tests/BD_Shape/addspacedims1.cc
@@ -1,12 +1,12 @@
 /* Test BD_Shape::add_space_dimensions_and_embed():
    we add two variables to a BD_Shape.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,59 +31,59 @@ test01() {
   //Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 2);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.add_space_dimensions_and_embed(2);
-  bd.add_constraint(z <= 2);
+  bds.add_space_dimensions_and_embed(2);
+  bds.add_constraint(z <= 2);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(x <= 2);
   known_result.add_constraint(z <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.add_space_dimensions_and_embed(2) "
-		    "and bd.add_constraint(z <= 2) ***");
+  print_constraints(bds,
+                    "*** bds.add_space_dimensions_and_embed(2) "
+                    "and bds.add_constraint(z <= 2) ***");
 
   return ok;
 }
 
 bool
 test02() {
-  TBD_Shape bd1(0, EMPTY);
-  TBD_Shape bd2(1, EMPTY);
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(1, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.add_space_dimensions_and_embed(2);
-  bd2.add_space_dimensions_and_embed(1);
+  bds1.add_space_dimensions_and_embed(2);
+  bds2.add_space_dimensions_and_embed(1);
 
-  bool ok = (bd1 == bd2) ;
+  bool ok = (bds1 == bds2);
 
-  print_constraints(bd1, "*** bd1.add_space_dimensions_and_embed(2) ***");
-  print_constraints(bd2, "*** bd2.add_space_dimensions_and_embed(1) ***");
+  print_constraints(bds1, "*** bds1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(bds2, "*** bds2.add_space_dimensions_and_embed(1) ***");
 
   return ok;
 }
 
 bool
 test03() {
-  TBD_Shape bd1(0, UNIVERSE);
+  TBD_Shape bds(0, UNIVERSE);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_space_dimensions_and_embed(3);
+  bds.add_space_dimensions_and_embed(3);
 
   BD_Shape<mpq_class> known_result(3, UNIVERSE);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.add_space_dimension_and_embed(3) ***");
+  print_constraints(bds, "*** bds.add_space_dimension_and_embed(3) ***");
 
   return ok;
 }
@@ -95,11 +95,11 @@ test04() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd1(0);
+  TBD_Shape bds(0);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_space_dimensions_and_project(4);
+  bds.add_space_dimensions_and_project(4);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(A == 0);
@@ -107,9 +107,9 @@ test04() {
   known_result.add_constraint(C == 0);
   known_result.add_constraint(D == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(4) ***");
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(4) ***");
 
   return ok;
 }
@@ -120,19 +120,19 @@ test05() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A == 1);
-  bd1.add_constraint(C - B >= 9);
+  TBD_Shape bds(3);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(C - B >= 9);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_space_dimensions_and_project(0);
+  bds.add_space_dimensions_and_project(0);
 
-  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(0) ***");
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(0) ***");
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
   return ok;
 }
@@ -144,32 +144,32 @@ test06() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd1(1);
+  TBD_Shape bds(1);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_space_dimensions_and_project(3);
+  bds.add_space_dimensions_and_project(3);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(B == 0);
   known_result.add_constraint(C == 0);
   known_result.add_constraint(D == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(3) ***");
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(3) ***");
 
   return ok;
 }
 
 bool
 test07() {
-  TBD_Shape bd(10, UNIVERSE);
+  TBD_Shape bds(10, UNIVERSE);
 
-  bd.remove_higher_space_dimensions(5);
-  bd.add_space_dimensions_and_embed(6);
+  bds.remove_higher_space_dimensions(5);
+  bds.add_space_dimensions_and_embed(6);
 
-  return bd == TBD_Shape(11, UNIVERSE);
+  return bds == TBD_Shape(11, UNIVERSE);
 }
 
 bool
@@ -179,57 +179,57 @@ test08() {
   Variable z(2);
   Variable w(3);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 2);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.add_space_dimensions_and_project(2);
+  bds.add_space_dimensions_and_project(2);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(x <= 2);
   known_result.add_constraint(w == 0);
   known_result.add_constraint(z == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.add_space_dimensions_and_project(2) ***");
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(2) ***");
 
   return ok;
 }
 
 bool
 test09() {
-  TBD_Shape bd1(0, EMPTY);
-  TBD_Shape bd2(1, EMPTY);
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(1, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.add_space_dimensions_and_project(2);
-  bd2.add_space_dimensions_and_project(1);
+  bds1.add_space_dimensions_and_project(2);
+  bds2.add_space_dimensions_and_project(1);
 
-  bool ok = (bd1 == bd2) ;
+  bool ok = (bds1 == bds2);
 
-  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(2) ***");
-  print_constraints(bd2, "*** bd2.add_space_dimensions_and_project(1) ***");
+  print_constraints(bds1, "*** bds1.add_space_dimensions_and_project(2) ***");
+  print_constraints(bds2, "*** bds2.add_space_dimensions_and_project(1) ***");
 
   return ok;
 }
 
 bool
 test10() {
-  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bds(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_space_dimensions_and_project(3);
+  bds.add_space_dimensions_and_project(3);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.add_space_dimension_and_project(3) ***");
+  print_constraints(bds, "*** bds.add_space_dimension_and_project(3) ***");
 
   return ok;
 }
@@ -241,11 +241,11 @@ test11() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd1(0);
+  TBD_Shape bds(0);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_space_dimensions_and_project(4);
+  bds.add_space_dimensions_and_project(4);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(A == 0);
@@ -253,9 +253,63 @@ test11() {
   known_result.add_constraint(C == 0);
   known_result.add_constraint(D == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(4) ***");
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(A <= 2);
+
+  TBD_Shape bds2(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.add_space_dimensions_and_project(0);
+  bds1.add_space_dimensions_and_embed(0);
+
+  bool ok = (bds1 == bds2);
+
+  print_constraints(bds1, "*** bds1.add_space_dimensions_and_project(0) ***");
+  print_constraints(bds2, "*** bds2.add_space_dimensions_and_embed(0) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 2);
+
+  TBD_Shape bds(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.minimized_constraints();
+  bds.add_space_dimensions_and_embed(3);
+  bds.add_constraint(z <= 2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(bds, known_result) ;
+
+  print_constraints(bds,
+                    "*** bds.add_space_dimensions_and_embed(2) "
+                    "and bds.add_constraint(z <= 2) ***");
 
   return ok;
 }
@@ -274,4 +328,6 @@ BEGIN_MAIN
   DO_TEST(test09);
   DO_TEST(test10);
   DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
 END_MAIN
diff --git a/tests/BD_Shape/affinedimension1.cc b/tests/BD_Shape/affinedimension1.cc
index 2958abb..6255dd1 100644
--- a/tests/BD_Shape/affinedimension1.cc
+++ b/tests/BD_Shape/affinedimension1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::affine_dimension().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,33 +29,23 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
+  TBD_Shape bds(3);
 
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y == 3);
-  bd1.add_constraint(y <= 2);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y == 3);
+  bds.add_constraint(y <= 2);
 
-  TBD_Shape bd2(2);
+  print_constraints(bds, "*** bds ***");
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
-
-  dimension_type affine_dim1 = bd1.affine_dimension();
-  dimension_type affine_dim2 = bd2.affine_dimension();
-
-  nout << endl
-       << "The affine dimension of a system of `bd1' "
-       << endl
-       << affine_dim1
-       << endl;
+  dimension_type affine_dim = bds.affine_dimension();
 
   nout << endl
-       << "The affine dimension of a system of `bd2' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim2
+       << affine_dim
        << endl;
 
-  bool ok = (affine_dim1 == affine_dim2);
+  bool ok = (affine_dim == 2);
 
   return ok;
 }
@@ -68,38 +58,24 @@ test02() {
   Variable D(3);
   Variable E(4);
 
-  TBD_Shape bd1(5);
-
-  bd1.add_constraint(A <= 5);
-  bd1.add_constraint(A - B == 3);
-  bd1.add_constraint(C <= 2);
-  bd1.add_constraint(E - D == 2);
+  TBD_Shape bds(5);
 
-  TBD_Shape bd2(4);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
 
-  bd2.add_constraint(A <= 1);
-  bd2.add_constraint(A - D == 8);
-  bd2.add_constraint(B <= 7);
+  print_constraints(bds, "*** bds ***");
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
-
-  dimension_type affine_dim1 = bd1.affine_dimension();
-  dimension_type affine_dim2 = bd2.affine_dimension();
-
-  nout << endl
-       << "The affine dimension of a system of `bd1' "
-       << endl
-       << affine_dim1
-       << endl;
+  dimension_type affine_dim = bds.affine_dimension();
 
   nout << endl
-       << "The affine dimension of a system of `bd2' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim2
+       << affine_dim
        << endl;
 
-  bool ok = (affine_dim1 == affine_dim2);
+  bool ok = (affine_dim == 3);
 
   return ok;
 }
@@ -112,118 +88,205 @@ test03() {
   Variable D(3);
   Variable E(4);
 
-  TBD_Shape bd1(5);
+  TBD_Shape bds(5);
 
-  bd1.add_constraint(A == 5);
-  bd1.add_constraint(A - B == 3);
-  bd1.add_constraint(C <= 2);
-  bd1.add_constraint(E - D == 2);
+  bds.add_constraint(A == 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
 
-  TBD_Shape bd2(5);
+  print_constraints(bds, "*** bds ***");
 
-  bd2.add_constraint(A == 1);
-  bd2.add_constraint(E == 1);
-  bd2.add_constraint(A - D == 8);
-  bd2.add_constraint(B <= 7);
-
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
-
-  dimension_type affine_dim1 = bd1.affine_dimension();
-  dimension_type affine_dim2 = bd2.affine_dimension();
+  dimension_type affine_dim = bds.affine_dimension();
 
   nout << endl
-       << "The affine dimension of a system of `bd1' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim1
+       << affine_dim
        << endl;
 
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B - A <= -5);
+  bds.add_constraint(-B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
   nout << endl
-       << "The affine dimension of a system of `bd2' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim2
+       << affine_dim
        << endl;
 
-  bool ok = (affine_dim1 == affine_dim2);
+  bool ok = (affine_dim == 0);
 
   return ok;
 }
 
 bool
-test04() {
-  Variable A(0);
-  Variable B(1);
+test05() {
+  TBD_Shape bds(2, EMPTY);
 
-  TBD_Shape bd1(2);
+  print_constraints(bds, "*** bds ***");
 
-  bd1.add_constraint(A <= 3);
-  bd1.add_constraint(B - A <= -5);
-  bd1.add_constraint(-B <= 2);
+  dimension_type affine_dim = bds.affine_dimension();
 
-  TBD_Shape bd2(2);
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
 
-  bd2.add_constraint(A == 0);
-  bd2.add_constraint(B == 2);
+  bool ok = (affine_dim == 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
 
-  dimension_type affine_dim1 = bd1.affine_dimension();
-  dimension_type affine_dim2 = bd2.affine_dimension();
+  dimension_type affine_dim = bds.affine_dimension();
 
   nout << endl
-       << "The affine dimension of a system of `bd1' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim1
+       << affine_dim
        << endl;
 
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
   nout << endl
-       << "The affine dimension of a system of `bd2' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim2
+       << affine_dim
        << endl;
 
-  bool ok = (affine_dim1 == affine_dim2);
+  bool ok = (affine_dim == 3);
 
   return ok;
 }
 
 bool
-test05() {
+test08() {
   Variable A(0);
   Variable B(1);
+  Variable D(3);
+  Variable E(4);
 
-  TBD_Shape bd1(2, EMPTY);
+  TBD_Shape bds(5);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(E == 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
 
-  TBD_Shape bd2(7);
+  print_constraints(bds, "*** bds ***");
 
-  bd2.add_constraint(A <= 1);
-  bd2.add_constraint(B == 2);
-  bd2.add_constraint(B - A <= -6);
+  dimension_type affine_dim = bds.affine_dimension();
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
 
-  dimension_type affine_dim1 = bd1.affine_dimension();
-  dimension_type affine_dim2 = bd2.affine_dimension();
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
 
   nout << endl
-       << "The affine dimension of a system of `bd1' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim1
+       << affine_dim
        << endl;
 
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(7);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B == 2);
+  bds.add_constraint(B - A <= -6);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
   nout << endl
-       << "The affine dimension of a system of `bd2' "
+       << "The affine dimension of a system of `bds' "
        << endl
-       << affine_dim2
+       << affine_dim
        << endl;
 
-  bool ok = (affine_dim1 == affine_dim2);
+   bool ok = (affine_dim == 0);
 
   return ok;
 }
 
+bool
+test11() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  const dimension_type affine_dim = bds.affine_dimension();
+
+  print_constraints(bds, "*** bds ***");
+
+  return (affine_dim == 0);
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -232,5 +295,12 @@ BEGIN_MAIN
   DO_TEST(test03);
   DO_TEST(test04);
   DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
 END_MAIN
 
+
diff --git a/tests/BD_Shape/affineimage1.cc b/tests/BD_Shape/affineimage1.cc
index 540f84b..c8e8781 100644
--- a/tests/BD_Shape/affineimage1.cc
+++ b/tests/BD_Shape/affineimage1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,22 +29,22 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_image(x, y);
+  bds.affine_image(x, y);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(x - y == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(x, y) ***");
+  print_constraints(bds, "*** bds.affine_image(x, y) ***");
 
   return ok;
 }
@@ -54,23 +54,23 @@ test02() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_image(x, x + 4);
+  bds.affine_image(x, x + 4);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(x - y <= 7);
   known_result.add_constraint(x <= 6);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(x, x + 4) ***");
+  print_constraints(bds, "*** bds.affine_image(x, x + 4) ***");
 
   return ok;
 }
@@ -80,22 +80,22 @@ test03() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_image(x, Linear_Expression(4));
+  bds.affine_image(x, Linear_Expression(4));
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(x == 4);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(x, 4) ***");
+  print_constraints(bds, "*** bds.affine_image(x, 4) ***");
 
   return ok;
 }
@@ -105,20 +105,20 @@ test04() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd1.affine_image(x, x);
+  bds.affine_image(x, x);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(x, x) ***");
+  print_constraints(bds, "*** bds.affine_image(x, x) ***");
 
   return ok;
 }
@@ -128,23 +128,23 @@ test05() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_image(x, 2*x - 2, 2);
+  bds.affine_image(x, 2*x - 2, 2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 1);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(x - y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(x, 2*x - 2, 2) ***");
+  print_constraints(bds, "*** bds.affine_image(x, 2*x - 2, 2) ***");
 
   return ok;
 }
@@ -154,22 +154,22 @@ test06() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_image(y, 2*x, 2);
+  bds.affine_image(y, 2*x, 2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 2);
   known_result.add_constraint(y - x == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(y, 2*x, 2) ***");
+  print_constraints(bds, "*** bds.affine_image(y, 2*x, 2) ***");
 
   return ok;
 }
@@ -179,22 +179,22 @@ test07() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_image(y, 3*x + 3, 3);
+  bds.affine_image(y, 3*x + 3, 3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 2);
   known_result.add_constraint(y - x == 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_image(y, 3*x + 3, 3) ***");
+  print_constraints(bds, "*** bds.affine_image(y, 3*x + 3, 3) ***");
 
   return ok;
 }
@@ -204,15 +204,15 @@ test08() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -2*x - 3*y + 1, -5);
+  bds.affine_image(x, -2*x - 3*y + 1, -5);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(5*x >= -4);
@@ -222,9 +222,9 @@ test08() {
   known_result.add_constraint(y - x <= 1);
   known_result.add_constraint(5*x - 5*y <= 3);
 
-  bool ok = check_result(bd, known_result, "3.70e-7", "2.10e-7", "1.44e-7");
+  bool ok = check_result(bds, known_result, "3.70e-7", "2.10e-7", "1.44e-7");
 
-  print_constraints(bd, "*** bd.affine_image(x, -2*x - 3*y + 1, -5) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -2*x - 3*y + 1, -5) ***");
 
   return ok;
 }
@@ -235,23 +235,23 @@ test09() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(z >= 3);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z >= 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(z, x + 2*y -3*z + 2, 4);
+  bds.affine_image(z, x + 2*y -3*z + 2, 4);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 1);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(2*z <= -1);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(z, x + 2*y -3*z + 2, 4) ***");
+  print_constraints(bds, "*** bds.affine_image(z, x + 2*y -3*z + 2, 4) ***");
 
   return ok;
 }
@@ -263,16 +263,16 @@ test10() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd(4);
-  bd.add_constraint(A <= 1);
-  bd.add_constraint(B <= 2);
-  bd.add_constraint(B >= 1);
-  bd.add_constraint(C <= 0);
-  bd.add_constraint(D == 3);
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(B >= 1);
+  bds.add_constraint(C <= 0);
+  bds.add_constraint(D == 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(A, -B + 2*C + 1, -3);
+  bds.affine_image(A, -B + 2*C + 1, -3);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(A >= 0);
@@ -282,9 +282,9 @@ test10() {
   known_result.add_constraint(D == 3);
   known_result.add_constraint(3*B - 3*A <= 5);
 
-  bool ok = check_result(bd, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+  bool ok = check_result(bds, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
 
-  print_constraints(bd, "*** bd.affine_image(A, -B + 2*C + 1, -3) ***");
+  print_constraints(bds, "*** bds.affine_image(A, -B + 2*C + 1, -3) ***");
 
   return ok;
 }
@@ -295,20 +295,20 @@ test11() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, 2*y + z + 2, 4);
+  bds.affine_image(x, 2*y + z + 2, 4);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, 2*y + z + 2, 4) ***");
+  print_constraints(bds, "*** bds.affine_image(x, 2*y + z + 2, 4) ***");
 
   return ok;
 }
@@ -318,28 +318,28 @@ test12() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x - y >= 0);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(x <= 2);
+  TBD_Shape bds(2);
+  bds.add_constraint(x - y >= 0);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x <= 2);
 
   Linear_Expression coeff1 = x + 1;
 
   try {
-    // This is an incorrect use of function
-    // BD_Shape::affine_image(v, expr,d): it is illegal applying
-    // the function with a linear expression with the denominator equal to
+    // This is an incorrect use of method
+    // BD_Shape::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
     // zero.
     Coefficient d = 0;
-    bd.affine_image(x, coeff1, d);
+    bds.affine_image(x, coeff1, d);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -347,23 +347,23 @@ test13() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(1);
-  bd.add_constraint(x >= 1);
+  TBD_Shape bds(1);
+  bds.add_constraint(x >= 1);
 
   try {
-    // This is an invalid used of the function
+    // This is an invalid used of the method
     // BD_Shape::affine_image(v, expr, d): it is illegal to
-    // apply this function to a variable that is not in the space of
+    // apply this method to a variable that is not in the space of
     // the polyhedron.
-    bd.affine_image(y, x + 1);
+    bds.affine_image(y, x + 1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -372,24 +372,24 @@ test14() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= 1);
-  bd.add_constraint(y >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 1);
+  bds.add_constraint(y >= 1);
 
   try {
-    // This is an invalid used of the function
+    // This is an invalid used of the method
     // BD_Shape::affine_image(v, expr, d): it is illegal to
     // use a variable in the expression that does not appear in the
     // space of the polyhedron.
-    bd.affine_image(y, x + z + 1);
+    bds.affine_image(y, x + z + 1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -397,52 +397,28 @@ test15() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x - y >= 0);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(x <= 2);
+  TBD_Shape bds(2);
+  bds.add_constraint(x - y >= 0);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x <= 2);
 
   Linear_Expression coeff1 = 2*x + 1;
 
   try {
-    // This is an incorrect use of function
-    // BD_Shape::affine_image(v, expr,d): it is illegal applying
-    // the function with a linear expression with the denominator equal to
+    // This is an incorrect use of method
+    // BD_Shape::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
     // zero.
-    Coefficient d = 3;
-    bd.affine_image(x, coeff1, d);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-bool
-test16() {
-  Variable x(0);
-  Variable y(1);
-
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= 1);
-  bd.add_constraint(y >= 1);
-
-  try {
-    // This is an invalid used of the function
-    // BD_Shape::affine_image(v, expr, d): it is illegal to
-    // use two variables in the expression.
-    bd.affine_image(y, y - x);
+    Coefficient d = 0;
+    bds.affine_image(x, coeff1, d);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
@@ -463,5 +439,4 @@ BEGIN_MAIN
   DO_TEST(test13);
   DO_TEST(test14);
   DO_TEST(test15);
-  DO_TEST(test16);
 END_MAIN
diff --git a/tests/BD_Shape/affineimage2.cc b/tests/BD_Shape/affineimage2.cc
index 4099504..cd2b019 100644
--- a/tests/BD_Shape/affineimage2.cc
+++ b/tests/BD_Shape/affineimage2.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,23 +30,23 @@ test01() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(z >= 3);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z >= 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -x);
+  bds.affine_image(x, -x);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x >= -1);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(z >= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, -x) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -x) ***");
 
   return ok;
 }
@@ -57,23 +57,23 @@ test02() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(z >= 3);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z >= 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -z);
+  bds.affine_image(x, -z);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= -3);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(z >= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, -z) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -z) ***");
 
   return ok;
 }
@@ -83,14 +83,14 @@ test03() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -y + 1);
+  bds.affine_image(x, -y + 1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 0);
@@ -98,9 +98,9 @@ test03() {
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(y >= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, -y + 1) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -y + 1) ***");
 
   return ok;
 }
@@ -110,23 +110,23 @@ test04() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -2*y + 1, -2);
+  bds.affine_image(x, -2*y + 1, -2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(2*x - 2*y == -1);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(y >= 1);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, -2*y + 1, -2) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -2*y + 1, -2) ***");
 
   return ok;
 }
@@ -136,14 +136,14 @@ test05() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -2*y + 1, 2);
+  bds.affine_image(x, -2*y + 1, 2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(2*x <= -1);
@@ -151,9 +151,9 @@ test05() {
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(y >= 1);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, -2*y + 1, 2) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -2*y + 1, 2) ***");
 
   return ok;
 }
@@ -163,15 +163,15 @@ test06() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, 2*x + y + 1);
+  bds.affine_image(x, 2*x + y + 1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 5);
@@ -181,9 +181,9 @@ test06() {
   known_result.add_constraint(x - y <= 3);
   known_result.add_constraint(x - y >= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, 2*x + y + 1) ***");
+  print_constraints(bds, "*** bds.affine_image(x, 2*x + y + 1) ***");
 
   return ok;
 }
@@ -193,15 +193,15 @@ test07() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -2*x + y + 1);
+  bds.affine_image(x, -2*x + y + 1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 3);
@@ -211,9 +211,9 @@ test07() {
   known_result.add_constraint(x - y <= 1);
   known_result.add_constraint(x - y >= -1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_image(x, -2*x + y + 1) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -2*x + y + 1) ***");
 
   return ok;
 }
@@ -223,15 +223,15 @@ test08() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, 2*x - 3*y + 1, 5);
+  bds.affine_image(x, 2*x - 3*y + 1, 5);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(5*x <= 6);
@@ -239,9 +239,9 @@ test08() {
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(y >= -1);
 
-  bool ok = check_result(bd, known_result, "9.54e-8", "6.75e-8", "4.77e-8");
+  bool ok = check_result(bds, known_result, "9.54e-8", "6.75e-8", "4.77e-8");
 
-  print_constraints(bd, "*** bd.affine_image(x, 2*x - 3*y + 1, 5) ***");
+  print_constraints(bds, "*** bds.affine_image(x, 2*x - 3*y + 1, 5) ***");
 
   return ok;
 }
@@ -251,15 +251,15 @@ test09() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, -2*x - 3*y + 1, 5);
+  bds.affine_image(x, -2*x - 3*y + 1, 5);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(5*x <= 4);
@@ -267,9 +267,9 @@ test09() {
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(y >= -1);
 
-  bool ok = check_result(bd, known_result, "2.15e-7", "1.36e-7", "9.54e-8");
+  bool ok = check_result(bds, known_result, "2.15e-7", "1.36e-7", "9.54e-8");
 
-  print_constraints(bd, "*** bd.affine_image(x, -2*x - 3*y + 1, 5) ***");
+  print_constraints(bds, "*** bds.affine_image(x, -2*x - 3*y + 1, 5) ***");
 
   return ok;
 }
@@ -279,15 +279,15 @@ test10() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(x >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(y >= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, 2*x - 3*y + 1, -5);
+  bds.affine_image(x, 2*x - 3*y + 1, -5);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 1);
@@ -297,9 +297,9 @@ test10() {
   known_result.add_constraint(5*x - 5*y <= 1);
   known_result.add_constraint(5*x - 5*y >= -7);
 
-  bool ok = check_result(bd, known_result, "1.91e-7", "1.17e-7", "9.54e-8");
+  bool ok = check_result(bds, known_result, "1.91e-7", "1.17e-7", "9.54e-8");
 
-  print_constraints(bd, "*** bd.affine_image(x, 2*x - 3*y + 1, -5) ***");
+  print_constraints(bds, "*** bds.affine_image(x, 2*x - 3*y + 1, -5) ***");
 
   return ok;
 }
@@ -310,14 +310,14 @@ test11() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(y >= 0);
-  bd.add_constraint(y <= 2);
-  bd.add_constraint(z <= 3);
+  TBD_Shape bds(3);
+  bds.add_constraint(y >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z <= 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_image(x, y + 5*z, 3);
+  bds.affine_image(x, y + 5*z, 3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*x <= 17);
@@ -327,9 +327,9 @@ test11() {
   known_result.add_constraint(x - y <= 5);
   known_result.add_constraint(3*x - 3*z <= 8);
 
-  bool ok = check_result(bd, known_result, "1.12e-6", "6.56e-7", "4.77e-7");
+  bool ok = check_result(bds, known_result, "1.12e-6", "6.56e-7", "4.77e-7");
 
-  print_constraints(bd, "*** bd.affine_image(x, y + 5*z, 3) ***");
+  print_constraints(bds, "*** bds.affine_image(x, y + 5*z, 3) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/affinepreimage1.cc b/tests/BD_Shape/affinepreimage1.cc
index 6eb17b9..d617bd3 100644
--- a/tests/BD_Shape/affinepreimage1.cc
+++ b/tests/BD_Shape/affinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,21 +29,21 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x - y <= 3);
-  bd1.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.affine_preimage(x, y);
+  bds.affine_preimage(x, y);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.affine_preimage(x, y) ***");
+  print_constraints(bds, "*** bds.affine_preimage(x, y) ***");
 
   return ok;
 }
@@ -53,21 +53,21 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 0);
-  bd.add_constraint(A - B - 3 >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B - 3 >= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_preimage(A, B-1);
+  bds.affine_preimage(A, B-1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(B >= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_preimage(A, B-1) ***");
+  print_constraints(bds, "*** bds.affine_preimage(A, B-1) ***");
 
   return ok;
 }
@@ -77,21 +77,21 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 2);
-  bd.add_constraint(B >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(B >= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_preimage(A, 2*A + 2, 2);
+  bds.affine_preimage(A, 2*A + 2, 2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 1);
   known_result.add_constraint(B >= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_preimage(A, 2*A + 2, 2) ***");
+  print_constraints(bds, "*** bds.affine_preimage(A, 2*A + 2, 2) ***");
 
   return ok;
 }
@@ -101,20 +101,20 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 2);
-  bd.add_constraint(B >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(B >= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.affine_preimage(B, Linear_Expression(3));
+  bds.affine_preimage(B, Linear_Expression(3));
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.affine_preimage(B, 3) ***");
+  print_constraints(bds, "*** bds.affine_preimage(B, 3) ***");
 
   return ok;
 }
@@ -124,24 +124,24 @@ test05() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= y);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::affine_preimage(v, expr, d): it is illegal
-    // to apply to a expression with the denominator
+    // to apply it to a expression with the denominator
     // equal to zero.
     Coefficient d = 0;
-    bd.affine_preimage(x, x + 1, d);
+    bds.affine_preimage(x, x + 1, d);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -150,23 +150,286 @@ test06() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= y);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::affine_preimage(v, expr, d): it is illegal
     // to apply it to an expression whose space dimension is
-    // greather than the space dimension of the BDS.
-    bd.affine_preimage(y, z);
+    // greater than the space dimension of the BDS.
+    bds.affine_preimage(y, z);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 2*A + 3*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, -3*A + C - 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 3*A + C - 1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 3*A + C - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, -3*A + C - 1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, -3*A + C - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A == 2);
+  bds.add_constraint(B == 0);
+  bds.add_constraint(C >= -3);
+  bds.add_constraint(D <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 2);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C >= -3);
+  known_result.add_constraint(5*D <= 14);
+
+  bool ok = check_result(bds, known_result, "7.63e-7", "3.82e-7", "1.91e-7");
+
+  print_constraints(bds, "*** bds.affine_preimage"
+                        "(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(B, -B);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, -B) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.affine_preimage(B, -B, -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, -B, -1) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 0);
+
+  bds.affine_preimage(B, -3*B + 6, 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, -3*B + 6, 3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  BD_Shape<float> bds(1);
+  bds.add_constraint(A <= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(A, 2*A, 3);
+
+  BD_Shape<mpq_class> mpq_known_result(1);
+  mpq_known_result.add_constraint(3*A <= -2);
+
+  bool ok = check_result(bds, mpq_known_result,
+                         "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(bds, "*** bds.affine_image(A, 2*A, 3) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -178,4 +441,14 @@ BEGIN_MAIN
   DO_TEST(test04);
   DO_TEST(test05);
   DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
 END_MAIN
diff --git a/tests/BD_Shape/affinepreimage2.cc b/tests/BD_Shape/affinepreimage2.cc
deleted file mode 100644
index d37c10a..0000000
--- a/tests/BD_Shape/affinepreimage2.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-/* Test BD_Shape::affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-namespace {
-
-bool
-test01() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(A, 4*B + 6*C + 2, -2);
-
-  BD_Shape<mpq_class> known_result(3);
-  known_result.add_constraint(B <= 0);
-  known_result.add_constraint(C >= 0);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
-
-  return ok;
-}
-
-bool
-test02() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(A, 2*A + 3*C + 2, 2);
-
-  BD_Shape<mpq_class> known_result(3);
-  known_result.add_constraint(A <= -2);
-  known_result.add_constraint(B <= 0);
-  known_result.add_constraint(C >= 0);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(A, 2*A + 3*C + 2, 2) ***");
-
-  return ok;
-}
-
-bool
-test03() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(A, 2*A + 3*C + 2, 2);
-
-  BD_Shape<mpq_class> known_result(3);
-  known_result.add_constraint(A <= -2);
-  known_result.add_constraint(B <= 0);
-  known_result.add_constraint(C >= 0);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(A, -3*A + C - 1, 2) ***");
-
-  return ok;
-}
-
-bool
-test04() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(A, 3*A + C - 1, -2);
-
-  BD_Shape<mpq_class> known_result(3);
-  known_result.add_constraint(B <= 0);
-  known_result.add_constraint(C >= 0);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(A, 3*A + C - 1, -2) ***");
-
-  return ok;
-}
-
-bool
-test05() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(A, -3*A + C - 1, -2);
-
-  BD_Shape<mpq_class> known_result(3);
-  known_result.add_constraint(B <= 0);
-  known_result.add_constraint(C >= 0);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(A, -3*A + C - 1, -2) ***");
-
-  return ok;
-}
-
-bool
-test06() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  TBD_Shape bd(4);
-  bd.add_constraint(A == 2);
-  bd.add_constraint(B == 0);
-  bd.add_constraint(C >= -3);
-  bd.add_constraint(D <= 5);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
-
-  BD_Shape<mpq_class> known_result(4);
-  known_result.add_constraint(A == 2);
-  known_result.add_constraint(B == 0);
-  known_result.add_constraint(C >= -3);
-  known_result.add_constraint(5*D <= 14);
-
-  bool ok = check_result(bd, known_result, "7.63e-7", "3.82e-7", "1.91e-7");
-
-  print_constraints(bd, "*** bd.affine_preimage"
-		        "(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
-
-  return ok;
-}
-
-bool
-test07() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  bd.affine_preimage(B, -B);
-
-  BD_Shape<mpq_class> known_result(3);
-  known_result.add_constraint(A <= -1);
-  known_result.add_constraint(B >= 0);
-  known_result.add_constraint(C >= 0);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(B, -B) ***");
-
-  return ok;
-}
-
-bool
-test08() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  TBD_Shape bd(3);
-  bd.add_constraint(A <= -1);
-  bd.add_constraint(B <= 0);
-  bd.add_constraint(C >= 0);
-
-  print_constraints(bd, "*** bd ***");
-
-  BD_Shape<mpq_class> known_result(bd);
-
-  bd.affine_preimage(B, -B, -1);
-
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
-
-  print_constraints(bd, "*** bd.affine_preimage(B, -B, -1) ***");
-
-  return ok;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-  DO_TEST(test02);
-  DO_TEST(test03);
-  DO_TEST(test04);
-  DO_TEST(test05);
-  DO_TEST(test06);
-  DO_TEST(test07);
-  DO_TEST(test08);
-END_MAIN
-
diff --git a/tests/BD_Shape/ascii_dump_load1.cc b/tests/BD_Shape/ascii_dump_load1.cc
index 78db9a0..4c39ece 100644
--- a/tests/BD_Shape/ascii_dump_load1.cc
+++ b/tests/BD_Shape/ascii_dump_load1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::ascii_dump() and BD_Shape::ascii_load().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -42,13 +42,13 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 0);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
 
   fstream f;
   open(f, my_file, ios_base::out);
-  bd.ascii_dump(f);
+  bds1.ascii_dump(f);
   close(f);
 
   open(f, my_file, ios_base::in | ios_base::out);
@@ -61,8 +61,8 @@ test01() {
   close(f);
 
   open(f, my_file, ios_base::in);
-  TBD_Shape bd2;
-  bool ok = !bd2.ascii_load(f);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
   close(f);
 
   return ok;
@@ -76,13 +76,13 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 1);
 
   fstream f;
   open(f, my_file, ios_base::out);
-  bd.ascii_dump(f);
+  bds1.ascii_dump(f);
   close(f);
 
   open(f, my_file, ios_base::in | ios_base::out);
@@ -95,8 +95,8 @@ test02() {
   close(f);
 
   open(f, my_file, ios_base::in);
-  TBD_Shape bd2;
-  bool ok = !bd2.ascii_load(f);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
   close(f);
 
   return ok;
@@ -110,13 +110,13 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 2);
 
   fstream f;
   open(f, my_file, ios_base::out);
-  bd.ascii_dump(f);
+  bds1.ascii_dump(f);
   close(f);
 
   open(f, my_file, ios_base::in | ios_base::out);
@@ -129,8 +129,8 @@ test03() {
   close(f);
 
   open(f, my_file, ios_base::in);
-  TBD_Shape bd2;
-  bool ok = !bd2.ascii_load(f);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
   close(f);
 
   return ok;
@@ -144,13 +144,13 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 3);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 3);
 
   fstream f;
   open(f, my_file, ios_base::out);
-  bd.ascii_dump(f);
+  bds1.ascii_dump(f);
   close(f);
 
   open(f, my_file, ios_base::in | ios_base::out);
@@ -163,8 +163,8 @@ test04() {
   close(f);
 
   open(f, my_file, ios_base::in);
-  TBD_Shape bd2;
-  bool ok = !bd2.ascii_load(f);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
   close(f);
 
   return ok;
@@ -178,13 +178,13 @@ test05() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 3);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 3);
 
   fstream f;
   open(f, my_file, ios_base::out);
-  bd.ascii_dump(f);
+  bds1.ascii_dump(f);
   close(f);
 
   open(f, my_file, ios_base::in | ios_base::out);
@@ -200,8 +200,8 @@ test05() {
   close(f);
 
   open(f, my_file, ios_base::in);
-  TBD_Shape bd2;
-  bool ok = !bd2.ascii_load(f);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
   close(f);
 
   return ok;
@@ -212,24 +212,24 @@ test06() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A - B >= 2);
-  bd1.add_constraint(B >= 0);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B >= 2);
+  bds1.add_constraint(B >= 0);
 
   fstream f;
   open(f, my_file, ios_base::out);
-  bd1.ascii_dump(f);
+  bds1.ascii_dump(f);
   close(f);
 
   open(f, my_file, ios_base::in);
-  TBD_Shape bd2;
-  bd2.ascii_load(f);
+  TBD_Shape bds2;
+  bds2.ascii_load(f);
   close(f);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bool ok = (bd1 == bd2) ;
+  bool ok = (bds1 == bds2);
 
   return ok;
 }
diff --git a/tests/BD_Shape/bdsdifference1.cc b/tests/BD_Shape/bdsdifference1.cc
index 8b3f64f..7606b17 100644
--- a/tests/BD_Shape/bdsdifference1.cc
+++ b/tests/BD_Shape/bdsdifference1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::bds_difference_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,48 +29,48 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(A <= -2);
-  bd1.add_constraint(B == 0);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(A <= -2);
+  bds1.add_constraint(B == 0);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A >= 0);
-  bd2.add_constraint(A <= 2);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(B <= 2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(A <= 2);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** ph2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** ph2 ***");
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(ph2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(ph2) ***");
 
   return ok;
 }
 
 bool
 test02() {
-  TBD_Shape bd1;
-  TBD_Shape bd2;
+  TBD_Shape bds1;
+  TBD_Shape bds2;
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
   Constraint_System cs;
   cs.insert(Linear_Expression(-4) >= 0);
   BD_Shape<mpq_class> known_result(cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(bds2) ***");
 
   return ok;
 }
@@ -80,22 +80,22 @@ test03() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 2);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(y <= 5);
-  bd1.add_constraint(y >= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 2);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y <= 5);
+  bds1.add_constraint(y >= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(x >= 1);
-  bd2.add_constraint(y <= 4);
-  bd2.add_constraint(y >= 1);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(x >= 1);
+  bds2.add_constraint(y <= 4);
+  bds2.add_constraint(y >= 1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x >= 0);
@@ -104,9 +104,9 @@ test03() {
   known_result.add_constraint(y >= 2);
   known_result.add_constraint(y - x >= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(bds2) ***");
 
   return ok;
 }
@@ -116,28 +116,28 @@ test04() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 8);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(y <= 7);
-  bd1.add_constraint(y >= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 8);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y <= 7);
+  bds1.add_constraint(y >= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(x >= 1);
-  bd2.add_constraint(y <= 0);
-  bd2.add_constraint(y >= 1);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(x >= 1);
+  bds2.add_constraint(y <= 0);
+  bds2.add_constraint(y >= 1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(bds2) ***");
 
   return ok;
 }
@@ -147,28 +147,28 @@ test05() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 8);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(y <= 7);
-  bd1.add_constraint(y >= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 8);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y <= 7);
+  bds1.add_constraint(y >= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x <= 9);
-  bd2.add_constraint(x >= 0);
-  bd2.add_constraint(y <= 8);
-  bd2.add_constraint(y >= 1);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 9);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y <= 8);
+  bds2.add_constraint(y >= 1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(bds2) ***");
 
   return ok;
 }
@@ -179,21 +179,21 @@ test06() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 8);
-  bd1.add_constraint(y <= 7);
-  bd1.add_constraint(y >= 1);
-  bd1.add_constraint(z <= 2);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 8);
+  bds1.add_constraint(y <= 7);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(z <= 2);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(x == 8);
-  bd2.add_constraint(y <= 2);
-  bd2.add_constraint(y >= 1);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x == 8);
+  bds2.add_constraint(y <= 2);
+  bds2.add_constraint(y >= 1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 8);
@@ -201,9 +201,9 @@ test06() {
   known_result.add_constraint(y >= 1);
   known_result.add_constraint(z <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(bds2) ***");
 
   return ok;
 }
@@ -213,20 +213,20 @@ test07() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(B <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A >= 2);
-  bd2.add_constraint(A <= 4);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(B <= 2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A >= 2);
+  bds2.add_constraint(A <= 4);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 0);
@@ -234,11 +234,11 @@ test07() {
   known_result.add_constraint(B >= 0);
   known_result.add_constraint(B <= 2);
 
-  bd1.bds_difference_assign(bd2);
+  bds1.bds_difference_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.bds_difference_assign(bds2) ***");
   print_constraints(known_result, "*** known_result ***");
 
   return ok;
@@ -246,22 +246,22 @@ test07() {
 
 bool
 test08() {
-  TBD_Shape bd1(3);
-  TBD_Shape bd2(5);
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(5);
 
   try {
-    // This is an incorrect use of function
-    // BD_Shape::bds_difference_assign(bd2): it is impossible to apply
-    // this function to two polyhedra of different dimensions.
-    bd1.bds_difference_assign(bd2);
+    // This is an incorrect use of method
+    // BD_Shape::bds_difference_assign(bds2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    bds1.bds_difference_assign(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/bdshull1.cc b/tests/BD_Shape/bdshull1.cc
index 5163992..91059ef 100644
--- a/tests/BD_Shape/bdshull1.cc
+++ b/tests/BD_Shape/bdshull1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::bds_hull_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,29 +31,29 @@ test01() {
   Variable x3(2);
   Variable x4(3);
 
-  TBD_Shape bd1(5);
-  bd1.add_constraint(x1 <= 5);
-  bd1.add_constraint(x2 <= -1);
-  bd1.add_constraint(x1 -x2 <= 10);
+  TBD_Shape bds1(5);
+  bds1.add_constraint(x1 <= 5);
+  bds1.add_constraint(x2 <= -1);
+  bds1.add_constraint(x1 -x2 <= 10);
 
-  TBD_Shape bd2(5);
-  bd2.add_constraint(x1  <= 2);
-  bd2.add_constraint(x4 <= 7);
-  bd2.add_constraint(x1 - x2 <= 20);
-  bd2.add_constraint(x4 - x3 <= 3);
+  TBD_Shape bds2(5);
+  bds2.add_constraint(x1  <= 2);
+  bds2.add_constraint(x4 <= 7);
+  bds2.add_constraint(x1 - x2 <= 20);
+  bds2.add_constraint(x4 - x3 <= 3);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_hull_assign(bd2);
+  bds1.bds_hull_assign(bds2);
 
   BD_Shape<mpq_class> known_result(5);
   known_result.add_constraint(x1 <= 5);
   known_result.add_constraint(x1 - x2 <= 20);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.bds_hull_assign(bds2) ***");
 
   return ok;
 }
@@ -63,22 +63,22 @@ test02() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 4);
-  bd1.add_constraint(-x <= -1);
-  bd1.add_constraint(y <= 3);
-  bd1.add_constraint(-y <= -1);
-  bd1.add_constraint(x - y <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(-x <= -1);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(-y <= -1);
+  bds1.add_constraint(x - y <= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(-y <= 5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(-y <= 5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_hull_assign(bd2);
+  bds1.bds_hull_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 4);
@@ -88,9 +88,9 @@ test02() {
   known_result.add_constraint(x - y <= 8);
   known_result.add_constraint(y - x <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.bds_hull_assign(bds2) ***");
 
   return ok;
 }
@@ -100,28 +100,28 @@ test03() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 4);
-  bd1.add_constraint(-x <= -1);
-  bd1.add_constraint(y <= 3);
-  bd1.add_constraint(-y <= -1);
-  bd1.add_constraint(x - y <= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(-x <= -1);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(-y <= -1);
+  bds1.add_constraint(x - y <= 1);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(x >= 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(x >= 5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.bds_hull_assign(bd2);
+  bds1.bds_hull_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.bds_hull_assign(bds2) ***");
 
   return ok;
 }
@@ -131,22 +131,22 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(A >= 1);
-  bd1.add_constraint(B <= 3);
-  bd1.add_constraint(-B <= -1);
-  bd1.add_constraint(A - B <= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(A >= 1);
+  bds1.add_constraint(B <= 3);
+  bds1.add_constraint(-B <= -1);
+  bds1.add_constraint(A - B <= 1);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(B - A <= -1);
-  bd2.add_constraint(A <= 3);
-  bd2.add_constraint(-B <= 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(B - A <= -1);
+  bds2.add_constraint(A <= 3);
+  bds2.add_constraint(-B <= 5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.bds_hull_assign_and_minimize(bd2);
+  bds1.bds_hull_assign_and_minimize(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A <= 4);
@@ -156,31 +156,31 @@ test04() {
   known_result.add_constraint(A - B <= 8);
   known_result.add_constraint(B - A <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.bds_hull_assign_and_minimize(bd2) ***");
+  print_constraints(bds1, "*** bds1.bds_hull_assign_and_minimize(bds2) ***");
 
   return ok;
 }
 
 bool
 test05() {
-  TBD_Shape bd1(12);
-  TBD_Shape bd2(5);
+  TBD_Shape bds1(12);
+  TBD_Shape bds2(5);
 
   try {
-    // This is an incorrect use of function
-    // BD_Shape::bds_hull_assign(bd2): it is impossible to apply
-    // this function to two polyhedra of different dimensions.
-    bd1.bds_hull_assign(bd2);
+    // This is an incorrect use of method
+    // BD_Shape::bds_hull_assign(bds2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    bds1.bds_hull_assign(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -188,24 +188,82 @@ test06() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x >= y);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= y);
 
-  TBD_Shape bd2(3);
+  TBD_Shape bds2(3);
 
   try {
-    // This is an invalid use of function
-    // BD_Shape::bds_hull_assign_and_minimize(bd2): it is illegal
-    // to apply this function to two polyhedra of different dimensions.
-    bd1.bds_hull_assign_and_minimize(bd2);
+    // This is an invalid use of method
+    // BD_Shape::bds_hull_assign_and_minimize(bds2): it is illegal
+    // to apply the method to two polyhedra of different dimensions.
+    bds1.bds_hull_assign_and_minimize(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds1(1);
+  bds1.add_constraint(A <= 0);
+  bds1.add_constraint(A >= 1);
+
+  TBD_Shape bds2(1);
+  bds2.add_constraint(A <= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.bds_hull_assign_and_minimize(bds2);
+
+  BD_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.bds_hull_assign_and_minimize(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(A - B <= 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= 0);
+  bds2.add_constraint(A - B <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  (void) bds1.minimized_constraints();
+
+  bds1.bds_hull_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(A - B <= 0);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.bds_hull_assign_and_minimize(bds2) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -217,4 +275,6 @@ BEGIN_MAIN
   DO_TEST(test04);
   DO_TEST(test05);
   DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
 END_MAIN
diff --git a/tests/BD_Shape/bgp99extrapolation1.cc b/tests/BD_Shape/bgp99extrapolation1.cc
index 0cdcd94..bde7e03 100644
--- a/tests/BD_Shape/bgp99extrapolation1.cc
+++ b/tests/BD_Shape/bgp99extrapolation1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<PH>::BGP99_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,7 +26,7 @@ namespace {
 
 bool
 test01() {
-  typedef Polyhedra_Powerset<TBD_Shape> BDS_Set;
+  typedef Pointset_Powerset<TBD_Shape> BDS_Set;
 
   Variable A(0);
   Variable B(1);
diff --git a/tests/BD_Shape/bhmz05widening1.cc b/tests/BD_Shape/bhmz05widening1.cc
index 2619918..d84ee00 100644
--- a/tests/BD_Shape/bhmz05widening1.cc
+++ b/tests/BD_Shape/bhmz05widening1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::BHMZ05_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,47 +29,47 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 1);
-  bd1.add_constraint(x - y <= 2);
-  bd1.add_constraint(y - x <= 7);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(x - y <= 2);
+  bds1.add_constraint(y - x <= 7);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y <= 2);
-  bd2.add_constraint(-x <= 3);
-  bd2.add_constraint(x <= 0);
-  bd2.add_constraint(y - x <= 2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(x <= 0);
+  bds2.add_constraint(y - x <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.BHMZ05_widening_assign(bd2);
+  bds1.BHMZ05_widening_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x - y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
 
   return ok;
 }
 
 bool
 test02() {
-  TBD_Shape bd1;
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds1;
+  TBD_Shape bds2(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.BHMZ05_widening_assign(bd2);
+  bds1.BHMZ05_widening_assign(bds2);
 
   BD_Shape<mpq_class> known_result;
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** After bd1.BHMZ05_widening_assign(bd2) ***");
+  print_constraints(bds1, "*** after bds1.BHMZ05_widening_assign(bds2) ***");
 
   return ok;
 }
@@ -82,30 +82,30 @@ test03() {
   Variable D(3);
   Variable E(4);
 
-  TBD_Shape bd1(5);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(C >= 1);
-  bd1.add_constraint(D >= 0);
-  bd1.add_constraint(E >= 0);
-  bd1.add_constraint(C - D <= 76);
-  bd1.add_constraint(C - E <= 76);
-  bd1.add_constraint(E - D == 0);
-
-  TBD_Shape bd2(5);
-  bd2.add_constraint(A >= 0);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(C >= 1);
-  bd2.add_constraint(D >= 0);
-  bd2.add_constraint(E >= 0);
-  bd2.add_constraint(C - D <= 75);
-  bd2.add_constraint(C - E <= 75);
-  bd2.add_constraint(E - D == 0);
-
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
-
-  bd1.BHMZ05_widening_assign(bd2);
+  TBD_Shape bds1(5);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(C >= 1);
+  bds1.add_constraint(D >= 0);
+  bds1.add_constraint(E >= 0);
+  bds1.add_constraint(C - D <= 76);
+  bds1.add_constraint(C - E <= 76);
+  bds1.add_constraint(E - D == 0);
+
+  TBD_Shape bds2(5);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(C >= 1);
+  bds2.add_constraint(D >= 0);
+  bds2.add_constraint(E >= 0);
+  bds2.add_constraint(C - D <= 75);
+  bds2.add_constraint(C - E <= 75);
+  bds2.add_constraint(E - D == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.BHMZ05_widening_assign(bds2);
 
   BD_Shape<mpq_class> known_result(5);
   known_result.add_constraint(A >= 0);
@@ -114,9 +114,9 @@ test03() {
   known_result.add_constraint(D >= 0);
   known_result.add_constraint(E - D == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
 
   return ok;
 }
@@ -127,24 +127,24 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A - B <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B <= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(A - B <= 1);
-  bd2.add_constraint(A - C <= 1);
-  bd2.add_constraint(C - B <= 0);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(A - C <= 1);
+  bds2.add_constraint(C - B <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.BHMZ05_widening_assign(bd2);
+  bds1.BHMZ05_widening_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
 
   return ok;
 }
@@ -155,55 +155,55 @@ test05() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A - B <= 1);
-  bd1.add_constraint(A - B >= 2);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B <= 1);
+  bds1.add_constraint(A - B >= 2);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(A - B <= 1);
-  bd2.add_constraint(A - B >= 2);
-  bd2.add_constraint(A - C <= 1);
-  bd2.add_constraint(C - B <= 0);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(A - B >= 2);
+  bds2.add_constraint(A - C <= 1);
+  bds2.add_constraint(C - B <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.BHMZ05_widening_assign(bd2);
+  bds1.BHMZ05_widening_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
 
   return ok;
 }
 
 TBD_Shape
 aux_test06(int i, Variable a, Variable b, Variable c) {
-  TBD_Shape bd(3);
+  TBD_Shape bds(3);
   if (i == 0) {
-    bd.add_constraint(0 <= a-b);
-    bd.add_constraint(     a-b <= 0);
-    bd.add_constraint(-1 <= b-c);
-    bd.add_constraint(      b-c <= 1);
+    bds.add_constraint(0 <= a-b);
+    bds.add_constraint(     a-b <= 0);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
   }
   else {
-    bd.add_constraint(-i <= a-b);
-    bd.add_constraint(      a-b <= i);
-    bd.add_constraint(-1 <= b-c);
-    bd.add_constraint(      b-c <= 1);
-    bd.add_constraint(-i <= a-c);
-    bd.add_constraint(      a-c <= i);
+    bds.add_constraint(-i <= a-b);
+    bds.add_constraint(      a-b <= i);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
+    bds.add_constraint(-i <= a-c);
+    bds.add_constraint(      a-c <= i);
   }
 
   using namespace IO_Operators;
   nout << "*** n_" << i << " ***" << endl
-       << bd << endl;
+       << bds << endl;
 
   // Force closure.
-  (void) (bd == bd);
-  return bd;
+  (void) (bds == bds);
+  return bds;
 }
 
 bool
@@ -218,7 +218,7 @@ test06() {
 
     using namespace IO_Operators;
     nout << "*** m_" << i << " ***" << endl
-	 << m_i << endl;
+         << m_i << endl;
 
     m_i_next = aux_test06(++i, a, b, c);
     m_i_next.bds_hull_assign(m_i);
@@ -230,10 +230,10 @@ test06() {
       known_result.add_constraint(-1 <= b-c);
       known_result.add_constraint(      b-c <= 1);
 
-      bool ok = (BD_Shape<mpq_class>(m_i) == known_result) ;
+      bool ok = (BD_Shape<mpq_class>(m_i) == known_result);
 
       nout << "*** m_" << i << " (fixpoint) ***" << endl
-	   << m_i << endl;
+           << m_i << endl;
       print_constraints(known_result, "*** known_result ***");
 
       return ok;
@@ -250,25 +250,25 @@ test07() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A - B <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B <= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(A - B <= 1);
-  bd2.add_constraint(A - B >= 2);
-  bd2.add_constraint(A - C <= 1);
-  bd2.add_constraint(C - B <= 0);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(A - B >= 2);
+  bds2.add_constraint(A - C <= 1);
+  bds2.add_constraint(C - B <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.BHMZ05_widening_assign(bd2);
+  bds1.BHMZ05_widening_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
 
   return ok;
 }
@@ -283,49 +283,49 @@ test08() {
   cs1.insert(x <= 1);
   cs1.insert(y == 0);
 
-  TBD_Shape bd1(cs1);
+  TBD_Shape bds1(cs1);
 
   Constraint_System cs2;
   cs2.insert(x <= 1);
   cs2.insert(y >= 0);
   cs2.insert(y - x <= 0);
 
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds2(cs2);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd2);
+  BD_Shape<mpq_class> known_result(bds2);
 
-  bd2.BHMZ05_widening_assign(bd1);
+  bds2.BHMZ05_widening_assign(bds1);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2,
-		    "*** bd2.BHMZ05_widening_assign(bd1) ***");
+  print_constraints(bds2,
+                    "*** bds2.BHMZ05_widening_assign(bds1) ***");
 
   return ok;
 }
 
 bool
 test09() {
-  TBD_Shape bd1(5);
-  TBD_Shape bd2(10);
+  TBD_Shape bds1(5);
+  TBD_Shape bds2(10);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::BHMZ05_widening_assign(bd1): it is illegal to apply
-    // this function to two polyhedra that are not dimensional
+    // This is an invalid use of the method
+    // BD_Shape::BHMZ05_widening_assign(bds1): it is illegal to apply
+    // the method to two polyhedra that are not dimensional
     // compatible.
-    bd2.BHMZ05_widening_assign(bd1);
+    bds2.BHMZ05_widening_assign(bds1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/bhz03widening1.cc b/tests/BD_Shape/bhz03widening1.cc
index b7dcfe0..a6caecf 100644
--- a/tests/BD_Shape/bhz03widening1.cc
+++ b/tests/BD_Shape/bhz03widening1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<PH>::BHZ03_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,7 +29,7 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  typedef Polyhedra_Powerset<TBD_Shape> PSet;
+  typedef Pointset_Powerset<TBD_Shape> PSet;
 
   TBD_Shape p(2);
   TBD_Shape q(2);
diff --git a/tests/BD_Shape/bounded1.cc b/tests/BD_Shape/bounded1.cc
new file mode 100644
index 0000000..91529b7
--- /dev/null
+++ b/tests/BD_Shape/bounded1.cc
@@ -0,0 +1,96 @@
+/* Test BD_Shape::is_bounded().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  // This is a non-bounded BDS.
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return !bds.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded BDS (it is a square);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(y >= 2);
+  bds.add_constraint(x <= 4);
+  bds.add_constraint(y <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+bool
+test03() {
+  // This is a universal, zero-dimensional BDS.
+  TBD_Shape bds;
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+bool
+test04() {
+  // This is an empty, zero-dimensional BDS.
+  TBD_Shape bds;
+  bds.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+bool
+test05() {
+  // This is an empty BDS.
+  TBD_Shape bds(4, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/boundedaffineimage1.cc b/tests/BD_Shape/boundedaffineimage1.cc
new file mode 100644
index 0000000..eeb090d
--- /dev/null
+++ b/tests/BD_Shape/boundedaffineimage1.cc
@@ -0,0 +1,487 @@
+/* Test BD_Shape::bounded_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, y, y);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, y, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, x + 4, x + 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 7);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, x + 4, x + 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, Linear_Expression(4), Linear_Expression(4));
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x == 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, 4, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.bounded_affine_image(x, x, x);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, x, x) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, 2*x - 2, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(x, 2*x-2, 2*x-2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(y, 2*x, 2*x, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(y, 2*x, 2*x, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(x - y <= 1);
+  known_result.add_constraint(x - y >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(x, -2*x+y+1, -2*x+y+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A - B <= 0);
+  bds.add_constraint(B - C == 2);
+  bds.add_constraint(C - A <= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(B, Linear_Expression(-1), D + E);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(A - C == 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(B, -1, D + E) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(C, 3*D - E, 2*C + 1, 5);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(5*C <= 7);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(C, "
+                    "3*D - E, 2*C + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable F(5);
+
+  TBD_Shape bds(6);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(A >= -6);
+  bds.add_constraint(B == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(A, -A - 3, B - C + 6*D + F);
+
+  BD_Shape<mpq_class> known_result(6);
+  known_result.add_constraint(A >= -7);
+  known_result.add_constraint(B == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(A, "
+                    "-A - 3, B - C + 6*D + F) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(B, -B - 2, 7*D - E + 5, 3);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(B >= -1);
+  known_result.add_constraint(C - A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(B, "
+                    "-B - 2, 7*D - E + 5, 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C - A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(B, "
+                    "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the BDS's space dimension.
+    bds.bounded_affine_image(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the BDS's space dimension.
+    bds.bounded_affine_image(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    bds.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_epxr, d): it is illegal to
+    // apply the method to a variable that is not in the space of
+    // the polyhedron.
+    bds.bounded_affine_image(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/boundedaffinepreimage1.cc b/tests/BD_Shape/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..8328421
--- /dev/null
+++ b/tests/BD_Shape/boundedaffinepreimage1.cc
@@ -0,0 +1,359 @@
+/* Test BD_Shape::bounded_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3));
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 7, 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7));
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, 7) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7),
+                              -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, 7, -1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(7),
+                              Linear_Expression(3), -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 7, 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(B - A <= 3);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), A+2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, A+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), -A+2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, -A+2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), B+5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, B+5) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*B <= 8);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), B-5, -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, B-5, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");;
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(B - A) <= 21);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 2, 4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 2, "
+                    "4*A + 3*B - 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+
+  bds.bounded_affine_preimage(A, A, A);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, A, A) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/bounds1.cc b/tests/BD_Shape/bounds1.cc
new file mode 100644
index 0000000..272d8a6
--- /dev/null
+++ b/tests/BD_Shape/bounds1.cc
@@ -0,0 +1,272 @@
+/* Test BD_Shape::bounds_from_below() and BD_Shape::bounds_from_above().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds1;
+  TBD_Shape bds2(2, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = bds1.bounds_from_above(Linear_Expression(3))
+    && bds2.bounds_from_below(A);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A + B) && bds.bounds_from_below(A + B);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A - B) && !bds.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A + B - C)
+    && !bds.bounds_from_below(A + B - C);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+  bds.add_constraint(E - D <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A + B - C + 2*E - 2*D)
+    && !bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A + B - C + 2*E - 2*D)
+    && bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(B - C <= -1);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A + B - C + 2*E - 2*D)
+    && bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(Linear_Expression(3))
+    && bds.bounds_from_below(Linear_Expression(3));
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.bounds_from_below(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.bounds_from_above(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A - B) && !bds.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A + B) && !bds.bounds_from_below(A + B);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/cc76extrapolation1.cc b/tests/BD_Shape/cc76extrapolation1.cc
index 9246220..e060142 100644
--- a/tests/BD_Shape/cc76extrapolation1.cc
+++ b/tests/BD_Shape/cc76extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::CC76_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,29 +29,29 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 1);
-  bd1.add_constraint(x - y <= 2);
-  bd1.add_constraint(y - x <= 7);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(x - y <= 2);
+  bds1.add_constraint(y - x <= 7);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(x - y <= 2);
-  bd2.add_constraint(-x <= 3);
-  bd2.add_constraint(x <= 0);
-  bd2.add_constraint(y - x <= 2);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(x <= 0);
+  bds2.add_constraint(y - x <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 1);
   known_result.add_constraint(x - y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -63,40 +63,40 @@ test02() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd1(4);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(B <= 25);
-  bd1.add_constraint(C >= 0);
-  bd1.add_constraint(C <= 29);
-  bd1.add_constraint(D >= 0);
-  bd1.add_constraint(D <= 27);
-  bd1.add_constraint(B - A <= 25);
-  bd1.add_constraint(C - A <= 29);
-  bd1.add_constraint(D - A <= 27);
-  bd1.add_constraint(B - C <= 2);
-  bd1.add_constraint(C - B <= 6);
-  bd1.add_constraint(B - D <= 2);
-  bd1.add_constraint(D - B <= 4);
-  bd1.add_constraint(C - D <= 4);
-  bd1.add_constraint(D - C <= 4);
-
-  TBD_Shape bd2(4);
-  bd2.add_constraint(A >= 0);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(B <= 26);
-  bd2.add_constraint(C >= 3);
-  bd2.add_constraint(C <= 29);
-  bd2.add_constraint(D >= 2);
-  bd2.add_constraint(D <= 28);
-  bd2.add_constraint(B - A <= 26);
-  bd2.add_constraint(C - A <= 29);
-  bd2.add_constraint(D - A <= 28);
-  bd2.add_constraint(B - C <= 0);
-  bd2.add_constraint(C - B <= 6);
-  bd2.add_constraint(B - D == 2);
-  bd2.add_constraint(C - D <= 4);
-  bd2.add_constraint(D - C <= 2);
+  TBD_Shape bds1(4);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 25);
+  bds1.add_constraint(C >= 0);
+  bds1.add_constraint(C <= 29);
+  bds1.add_constraint(D >= 0);
+  bds1.add_constraint(D <= 27);
+  bds1.add_constraint(B - A <= 25);
+  bds1.add_constraint(C - A <= 29);
+  bds1.add_constraint(D - A <= 27);
+  bds1.add_constraint(B - C <= 2);
+  bds1.add_constraint(C - B <= 6);
+  bds1.add_constraint(B - D <= 2);
+  bds1.add_constraint(D - B <= 4);
+  bds1.add_constraint(C - D <= 4);
+  bds1.add_constraint(D - C <= 4);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 26);
+  bds2.add_constraint(C >= 3);
+  bds2.add_constraint(C <= 29);
+  bds2.add_constraint(D >= 2);
+  bds2.add_constraint(D <= 28);
+  bds2.add_constraint(B - A <= 26);
+  bds2.add_constraint(C - A <= 29);
+  bds2.add_constraint(D - A <= 28);
+  bds2.add_constraint(B - C <= 0);
+  bds2.add_constraint(C - B <= 6);
+  bds2.add_constraint(B - D == 2);
+  bds2.add_constraint(C - D <= 4);
+  bds2.add_constraint(D - C <= 2);
 
   Constraint_System cs;
   cs.insert(A >= 0);
@@ -104,13 +104,13 @@ test02() {
   cs.insert(C >= 0);
   cs.insert(D >= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.bds_hull_assign(bd2);
+  bds1.bds_hull_assign(bds2);
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(A >= 0);
@@ -123,10 +123,10 @@ test02() {
   known_result.add_constraint(B - D <= 2);
   known_result.add_constraint(C - D <= 4);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -138,44 +138,44 @@ test03() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd1(4);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(B <= 39);
-  bd1.add_constraint(C >= 0);
-  bd1.add_constraint(C <= 40);
-  bd1.add_constraint(D >= 0);
-  bd1.add_constraint(D <= 40);
-  bd1.add_constraint(B - A <= 39);
-  bd1.add_constraint(C - A <= 40);
-  bd1.add_constraint(D - A <= 40);
-  bd1.add_constraint(B - C <= 0);
-  bd1.add_constraint(C - B <= 1);
-  bd1.add_constraint(B - D <= 0);
-  bd1.add_constraint(D - B <= 2);
-  bd1.add_constraint(C - D <= 0);
-  bd1.add_constraint(D - C <= 1);
-
-  TBD_Shape bd2(4);
-  bd2.add_constraint(A >= 0);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(B <= 38);
-  bd2.add_constraint(C >= 0);
-  bd2.add_constraint(C <= 39);
-  bd2.add_constraint(D >= 0);
-  bd2.add_constraint(D <= 40);
-  bd2.add_constraint(B - A <= 38);
-  bd2.add_constraint(C - A <= 39);
-  bd2.add_constraint(D - A <= 40);
-  bd2.add_constraint(B - C <= 0);
-  bd2.add_constraint(C - B <= 1);
-  bd2.add_constraint(B - D <= 0);
-  bd2.add_constraint(D - B <= 2);
-  bd2.add_constraint(C - D <= 0);
-  bd2.add_constraint(D - C <= 1);
-
-  // Force the closure of `bd1'.
-  bd1 == bd2;
+  TBD_Shape bds1(4);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 39);
+  bds1.add_constraint(C >= 0);
+  bds1.add_constraint(C <= 40);
+  bds1.add_constraint(D >= 0);
+  bds1.add_constraint(D <= 40);
+  bds1.add_constraint(B - A <= 39);
+  bds1.add_constraint(C - A <= 40);
+  bds1.add_constraint(D - A <= 40);
+  bds1.add_constraint(B - C <= 0);
+  bds1.add_constraint(C - B <= 1);
+  bds1.add_constraint(B - D <= 0);
+  bds1.add_constraint(D - B <= 2);
+  bds1.add_constraint(C - D <= 0);
+  bds1.add_constraint(D - C <= 1);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 38);
+  bds2.add_constraint(C >= 0);
+  bds2.add_constraint(C <= 39);
+  bds2.add_constraint(D >= 0);
+  bds2.add_constraint(D <= 40);
+  bds2.add_constraint(B - A <= 38);
+  bds2.add_constraint(C - A <= 39);
+  bds2.add_constraint(D - A <= 40);
+  bds2.add_constraint(B - C <= 0);
+  bds2.add_constraint(C - B <= 1);
+  bds2.add_constraint(B - D <= 0);
+  bds2.add_constraint(D - B <= 2);
+  bds2.add_constraint(C - D <= 0);
+  bds2.add_constraint(D - C <= 1);
+
+  // Force the closure of `bds1'.
+  bds1 == bds2;
 
   BD_Shape<mpq_class> known_widening(4);
   known_widening.add_constraint(A >= 0);
@@ -191,19 +191,19 @@ test03() {
   known_widening.add_constraint(C - D <= 0);
   known_widening.add_constraint(D - C <= 1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
-  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
-  // Force the closure of `bd1'.
-  bd1 == bd2;
+  // Force the closure of `bds1'.
+  bds1 == bds2;
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_widening) ;
+  bool ok = (BD_Shape<mpq_class>(bds1) == known_widening);
 
-  print_constraints(bd1, "*** bd1.closure_assign() ***");
+  print_constraints(bds1, "*** bds1.closure_assign() ***");
 
   return ok;
 }
@@ -213,57 +213,57 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(B <= 2);
-  bd1.add_constraint(B - A <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 2);
+  bds1.add_constraint(B - A <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A <= 0);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(B <= 1);
-  bd2.add_constraint(B - A <= 1);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 1);
+  bds2.add_constraint(B - A <= 1);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
 
 TBD_Shape
 aux_test05(int i, Variable a, Variable b, Variable c) {
-  TBD_Shape bd(3);
+  TBD_Shape bds(3);
   if (i == 0) {
-    bd.add_constraint(0 <= a-b);
-    bd.add_constraint(     a-b <= 0);
-    bd.add_constraint(-1 <= b-c);
-    bd.add_constraint(      b-c <= 1);
+    bds.add_constraint(0 <= a-b);
+    bds.add_constraint(     a-b <= 0);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
   }
   else {
-    bd.add_constraint(-i <= a-b);
-    bd.add_constraint(      a-b <= i);
-    bd.add_constraint(-1 <= b-c);
-    bd.add_constraint(      b-c <= 1);
-    bd.add_constraint(-i <= a-c);
-    bd.add_constraint(      a-c <= i);
+    bds.add_constraint(-i <= a-b);
+    bds.add_constraint(      a-b <= i);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
+    bds.add_constraint(-i <= a-c);
+    bds.add_constraint(      a-c <= i);
   }
 
   using namespace IO_Operators;
   nout << "*** n_" << i << " ***" << endl
-       << bd << endl;
+       << bds << endl;
 
   // Force closure.
-  (void) (bd == bd);
-  return bd;
+  (void) (bds == bds);
+  return bds;
 }
 
 bool
@@ -278,10 +278,10 @@ test05() {
 
     using namespace IO_Operators;
     nout << "*** m_" << i << " ***" << endl
-	 << m_i << endl;
+         << m_i << endl;
 
     m_i_next = aux_test05(++i, a, b, c);
-    TBD_Shape::base_type* no_stop_points = 0;
+    TBD_Shape::coefficient_type_base* no_stop_points = 0;
     m_i_next.CC76_extrapolation_assign(m_i, no_stop_points, no_stop_points);
     m_i_next.bds_hull_assign(m_i);
     // Force closure.
@@ -289,7 +289,7 @@ test05() {
     if (m_i == m_i_next) {
 
       nout << "*** m_" << i << " (fixpoint) ***" << endl
-	   << m_i << endl;
+           << m_i << endl;
 
       return false;
     }
@@ -300,40 +300,40 @@ test05() {
 
 bool
 test06() {
-  TBD_Shape bd1(0);
+  TBD_Shape bds1(0);
 
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds2(0, EMPTY);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
 
 bool
 test07() {
-  TBD_Shape bd1(2, EMPTY);
-  TBD_Shape bd2(2, EMPTY);
-  BD_Shape<mpq_class> known_result(bd2);
+  TBD_Shape bds1(2, EMPTY);
+  TBD_Shape bds2(2, EMPTY);
+  BD_Shape<mpq_class> known_result(bds2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.CC76_extrapolation_assign(bd1);
+  bds2.CC76_extrapolation_assign(bds1);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2,
-		    "*** bd2.CC76_extrapolation_assign(bd1) ***");
+  print_constraints(bds2,
+                    "*** bds2.CC76_extrapolation_assign(bds1) ***");
 
   return ok;
 }
@@ -344,27 +344,27 @@ test08() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A - B >= 2);
-  bd1.add_constraint(B - C >= -1);
-  bd1.add_constraint(C - A >= -3);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B >= 2);
+  bds1.add_constraint(B - C >= -1);
+  bds1.add_constraint(C - A >= -3);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(A - B >= 2);
-  bd2.add_constraint(B - C >= 1);
-  bd2.add_constraint(C - A >= 3);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B >= 2);
+  bds2.add_constraint(B - C >= 1);
+  bds2.add_constraint(C - A >= 3);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -374,24 +374,24 @@ test09() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A <= 1);
-  bd2.add_constraint(B == -1);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= 1);
+  bds2.add_constraint(B == -1);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -402,72 +402,72 @@ test10() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(C <= 4);
-  bd1.add_constraint(B >= 2);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(C <= 4);
+  bds1.add_constraint(B >= 2);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(C == 3);
-  bd2.add_constraint(A - C >= 0);
-  bd2.add_constraint(B - A >= 1);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(C == 3);
+  bds2.add_constraint(A - C >= 0);
+  bds2.add_constraint(B - A >= 1);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(B >= 2);
   known_result.add_constraint(C - B <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.CC76_extrapolation_assign(bd2);
+  bds1.CC76_extrapolation_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
 
 bool
 test11() {
-  TBD_Shape bd1(1);
-  TBD_Shape bd2(2);
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::CC76_extrapolation_assign(bd): it is
-    // illegal to apply this function to two polyhedra that are not
+    // This is an invalid use of the method
+    // BD_Shape::CC76_extrapolation_assign(bds): it is
+    // illegal to apply this method to two polyhedra that are not
     // dimension-compatible.
-    bd2.CC76_extrapolation_assign(bd1);
+    bds2.CC76_extrapolation_assign(bds1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
 test12() {
-  TBD_Shape bd1(5);
-  TBD_Shape bd2(10);
+  TBD_Shape bds1(5);
+  TBD_Shape bds2(10);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::CC76_widening_assign(bd2): it is illegal to apply
-    // this function to two polyhedra that are not dimensional
+    // This is an invalid use of the method
+    // BD_Shape::CC76_widening_assign(bds2): it is illegal to apply
+    // this method to two polyhedra that are not dimensional
     // compatible.
-    bd2.CC76_extrapolation_assign(bd1);
+    bds2.CC76_extrapolation_assign(bds1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/cc76narrowing1.cc b/tests/BD_Shape/cc76narrowing1.cc
index 46f4d68..53e5f25 100644
--- a/tests/BD_Shape/cc76narrowing1.cc
+++ b/tests/BD_Shape/cc76narrowing1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::CC76_narrowing_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,21 +29,21 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 1);
-  bd1.add_constraint(y - x <= 7);
-  bd1.add_constraint(x - y <= 6);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(y - x <= 7);
+  bds1.add_constraint(x - y <= 6);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(-x <= 3);
-  bd2.add_constraint(y - x <= 2);
-  bd2.add_constraint(x - y <= 5);
-  bd2.add_constraint(x <= 0);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(y - x <= 2);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(x <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.CC76_narrowing_assign(bd1);
+  bds2.CC76_narrowing_assign(bds1);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 1);
@@ -53,9 +53,9 @@ test01() {
   known_result.add_constraint(-y <= 8);
   known_result.add_constraint(y <= 8);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
 
   return ok;
 }
@@ -66,20 +66,20 @@ test02() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(4);
-  bd1.add_constraint(z <= 1);
+  TBD_Shape bds1(4);
+  bds1.add_constraint(z <= 1);
 
-  TBD_Shape bd2(4);
-  bd2.add_constraint(-y <= 3);
-  bd2.add_constraint(-x <= 2);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y - x <= 4);
-  bd2.add_constraint(z <= 0);
+  TBD_Shape bds2(4);
+  bds2.add_constraint(-y <= 3);
+  bds2.add_constraint(-x <= 2);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y - x <= 4);
+  bds2.add_constraint(z <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.CC76_narrowing_assign(bd1);
+  bds2.CC76_narrowing_assign(bds1);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(z <= 1);
@@ -92,9 +92,9 @@ test02() {
   known_result.add_constraint(z - y <= 3);
   known_result.add_constraint(z - x <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
 
   return ok;
 }
@@ -105,26 +105,26 @@ test03() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(3);
-  TBD_Shape bd2(3);
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(3);
 
-  bd1.add_constraint(z <= 1);
+  bds1.add_constraint(z <= 1);
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bd2.add_constraint(-y <= 3);
-  bd2.add_constraint(x >= 4);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y - x <= 4);
-  bd2.add_constraint(z <= 0);
+  bds2.add_constraint(-y <= 3);
+  bds2.add_constraint(x >= 4);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y - x <= 4);
+  bds2.add_constraint(z <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.CC76_narrowing_assign(bd1);
+  bds2.CC76_narrowing_assign(bds1);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
 
   return ok;
 }
@@ -135,45 +135,45 @@ test04() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(z <= 1);
-  bd1.add_constraint(z >= 3);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(z <= 1);
+  bds1.add_constraint(z >= 3);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(-y <= 3);
-  bd2.add_constraint(x >= 4);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y - x <= 4);
-  bd2.add_constraint(z <= 0);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(-y <= 3);
+  bds2.add_constraint(x >= 4);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y - x <= 4);
+  bds2.add_constraint(z <= 0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.CC76_narrowing_assign(bd1);
+  bds2.CC76_narrowing_assign(bds1);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
 
   return ok;
 }
 
 bool
 test05() {
-  TBD_Shape bd1;
-  TBD_Shape bd2(0, EMPTY);
-  BD_Shape<mpq_class> known_result(bd2);
+  TBD_Shape bds1;
+  TBD_Shape bds2(0, EMPTY);
+  BD_Shape<mpq_class> known_result(bds2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.CC76_narrowing_assign(bd1);
+  bds2.CC76_narrowing_assign(bds1);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
 
   return ok;
 }
@@ -182,26 +182,26 @@ bool
 test06() {
   Variable y(1);
 
-  TBD_Shape bd1(1);
-  TBD_Shape bd2(2);
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
 
   Constraint_System cs;
   cs.insert(y >= 6);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::CC76_narrowing_assign(bd2, cs): it is
-    // illegal to apply this function to two polyhedra that are not
+    // This is an invalid use of the method
+    // BD_Shape::CC76_narrowing_assign(bds2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
     // dimension-compatible.
-    bd2.CC76_narrowing_assign(bd1);
+    bds2.CC76_narrowing_assign(bds1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/closure1.cc b/tests/BD_Shape/closure1.cc
index 4deacea..e9f4917 100644
--- a/tests/BD_Shape/closure1.cc
+++ b/tests/BD_Shape/closure1.cc
@@ -1,11 +1,11 @@
 /* Test shortest path closure.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -323,7 +323,7 @@ perturbate(unsigned long a) {
 
 template <typename T>
 void
-add_edges(BD_Shape<T>& bd, const Edge* edges, unsigned n) {
+add_edges(BD_Shape<T>& bds, const Edge* edges, unsigned n) {
   for (unsigned i = 0; i < n; ++i) {
     const mpq_class& q = perturbate(edges[i].distance);
     Coefficient a;
@@ -333,36 +333,35 @@ add_edges(BD_Shape<T>& bd, const Edge* edges, unsigned n) {
 
     nout << "a = " << a << "; b = " << b << endl;
 
-    bd.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to)
-		      <= b);
+    bds.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to)
+                      <= b);
   }
 }
 
-} // namespace
-
-#define DISTANCE(To, Temp)			       \
+#define DISTANCE(To, Temp)                             \
   do { \
     Checked_Number<To, Extended_Number_Policy> distance; \
-    rectilinear_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+    rectilinear_distance_assign<Temp>(distance, qbds1, qbds2, ROUND_UP); \
     nout << "Rectilinear distance<" #To ", " #Temp "> = " << distance \
          << endl; \
-    euclidean_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+    euclidean_distance_assign<Temp>(distance, qbds1, qbds2, ROUND_UP); \
     nout << "Euclidean distance<" #To ", " #Temp "> = " << distance \
          << endl; \
-    l_infinity_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+    l_infinity_distance_assign<Temp>(distance, qbds1, qbds2, ROUND_UP); \
     nout << "L-infinity distance<" #To ", " #Temp "> = " << distance \
          << endl; \
   } while (0)
 
-bool test01() {
-  BD_Shape<mpq_class> qbd1(126);
-  add_edges(qbd1, hawaii, sizeof(hawaii)/sizeof(Edge));
+bool
+test01() {
+  BD_Shape<mpq_class> qbds1(126);
+  add_edges(qbds1, hawaii, sizeof(hawaii)/sizeof(Edge));
 
-  TBD_Shape tbd(126);
-  add_edges(tbd, hawaii, sizeof(hawaii)/sizeof(Edge));
+  TBD_Shape tbds(126);
+  add_edges(tbds, hawaii, sizeof(hawaii)/sizeof(Edge));
 
-  BD_Shape<mpq_class> qbd2(tbd);
-  if (!qbd2.contains(qbd1))
+  BD_Shape<mpq_class> qbds2(tbds);
+  if (!qbds2.contains(qbds1))
     return false;
 
   // FIXME!!!
@@ -374,6 +373,185 @@ bool test01() {
   return true;
 }
 
+bool
+test02() {
+  // This test shows that the Floyd-Warshall algorithm does not compute
+  // the shortest path closure when using a floating point datatype.
+  // In particular, here it is shown that FW is not idempotent.
+  typedef BD_Shape<float> BDS;
+  typedef BDS::coefficient_type Float;
+
+  Float f_1, f_2, f_3, f_1_2, f_1_3;
+  assign_r(f_1, (float) 1.0, ROUND_UP);
+  assign_r(f_2, (float) 2.0, ROUND_DOWN);
+  assign_r(f_3, (float) 3.0, ROUND_DOWN);
+  div_assign_r(f_1_2, f_1, f_2, ROUND_UP);
+  div_assign_r(f_1_3, f_1, f_3, ROUND_UP);
+
+  nout << "*** Floating point up approx ***\n";
+  nout << "1/2 = " << f_1_2 << "\n";
+  nout << "1/3 = " << f_1_3 << "\n";
+
+  mpq_class q_1_2, q_1_3;
+  assign_r(q_1_2, f_1_2, ROUND_NOT_NEEDED);
+  assign_r(q_1_3, f_1_3, ROUND_NOT_NEEDED);
+
+  nout << "\n*** Corresponding mpq_class values ***\n";
+  nout << "up(1/2) = " << q_1_2 << "\n";
+  nout << "up(1/3) = " << q_1_3 << "\n\n";
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  BDS bds1(4);
+  Constraint_System cs;
+  Coefficient numer, denom;
+
+  numer = q_1_3.get_num();
+  denom = q_1_3.get_den();
+  cs.insert(denom*A - denom*B >= numer);
+  cs.insert(denom*B - denom*C >= -numer);
+
+  numer = q_1_2.get_num();
+  denom = q_1_2.get_den();
+  cs.insert(denom*C - denom*D >= -numer);
+
+  bds1.add_constraints(cs);
+
+  print_constraints(bds1.constraints(), "*** BEFORE FIRST Floyd-Warshall ***");
+  nout << "\n";
+
+  // Force application of Floyd-Warshall.
+  bds1.is_empty();
+
+  print_constraints(bds1.constraints(), "*** AFTER FIRST Floyd-Warshall ***");
+  nout << "\n";
+
+  // Copy constraints (so that the BDS is marked as not closed)
+  // and then force again application of Floyd-Warshall.
+  BDS bds2(bds1.constraints());
+  bds2.is_empty();
+
+  print_constraints(bds2.constraints(), "*** AFTER SECOND Floyd-Warshall ***");
+
+  bool ok = bds1.contains(bds2) && !bds2.contains(bds1);
+
+  return ok;
+}
+
+bool
+test03() {
+  // This test shows that the Floyd-Warshall algorithm does not compute
+  // the shortest path closure when using a floating point datatype.
+  // In particular, here it is shown that even two applications of FW
+  // are not enough to obtain idempotency.
+  typedef BD_Shape<float> BDS;
+  typedef BDS::coefficient_type Float;
+
+  Float f_1, f_2, f_3, f_5, f_7;
+  Float f_1_2, f_1_3, f_1_5, f_1_7;
+  assign_r(f_1, (float) 1.0, ROUND_UP);
+  assign_r(f_2, (float) 2.0, ROUND_DOWN);
+  assign_r(f_3, (float) 3.0, ROUND_DOWN);
+  assign_r(f_5, (float) 5.0, ROUND_DOWN);
+  assign_r(f_7, (float) 7.0, ROUND_DOWN);
+  div_assign_r(f_1_2, f_1, f_2, ROUND_UP);
+  div_assign_r(f_1_3, f_1, f_3, ROUND_UP);
+  div_assign_r(f_1_5, f_1, f_5, ROUND_UP);
+  div_assign_r(f_1_7, f_1, f_7, ROUND_UP);
+
+  nout << "*** Floating point up approx ***\n";
+  nout << "1/2 = " << f_1_2 << "\n";
+  nout << "1/3 = " << f_1_3 << "\n";
+  nout << "1/5 = " << f_1_5 << "\n";
+  nout << "1/7 = " << f_1_7 << "\n";
+
+  mpq_class q_1_2, q_1_3, q_1_5, q_1_7;
+  assign_r(q_1_2, f_1_2, ROUND_NOT_NEEDED);
+  assign_r(q_1_3, f_1_3, ROUND_NOT_NEEDED);
+  assign_r(q_1_5, f_1_5, ROUND_NOT_NEEDED);
+  assign_r(q_1_7, f_1_7, ROUND_NOT_NEEDED);
+
+  nout << "\n*** Corresponding mpq_class values ***\n";
+  nout << "1/2 = " << q_1_2 << "\n";
+  nout << "1/3 = " << q_1_3 << "\n";
+  nout << "1/5 = " << q_1_5 << "\n";
+  nout << "1/7 = " << q_1_7 << "\n\n";
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+
+  Constraint_System cs;
+  Coefficient numer, denom;
+
+  numer = q_1_3.get_num();
+  denom = q_1_3.get_den();
+  cs.insert(denom*B - denom*A <= -numer);
+  cs.insert(denom*C - denom*B <= numer);
+  cs.insert(denom*G - denom*F <= -numer);
+  cs.insert(denom*H - denom*G <= numer);
+
+  numer = q_1_2.get_num();
+  denom = q_1_2.get_den();
+  cs.insert(denom*D - denom*C <= numer);
+
+  numer = q_1_5.get_num();
+  denom = q_1_5.get_den();
+  cs.insert(denom*J - denom*I <= numer);
+  cs.insert(denom*E - denom*D <= numer);
+  cs.insert(denom*I - denom*H <= numer);
+
+  numer = q_1_7.get_num();
+  denom = q_1_7.get_den();
+  cs.insert(denom*F - denom*E <= -numer);
+
+  BDS bds1(10);
+  bds1.add_constraints(cs);
+  print_constraints(bds1.constraints(), "*** BEFORE FIRST Floyd-Warshall ***");
+  nout << "\n";
+
+  // Force application of Floyd-Warshall.
+  bds1.is_empty();
+
+  print_constraints(bds1.constraints(), "*** AFTER FIRST Floyd-Warshall ***");
+  nout << "\n";
+
+  // Copy constraints (so that the BDS is marked as not closed)
+  // and then force again application of Floyd-Warshall.
+  BDS bds2(bds1.constraints());
+  bds2.is_empty();
+
+  print_constraints(bds2.constraints(), "*** AFTER SECOND Floyd-Warshall ***");
+  nout << "\n";
+
+  // Copy constraints (so that the BDS is marked as not closed)
+  // and then force once again application of Floyd-Warshall.
+  BDS bds3(bds2.constraints());
+  bds3.is_empty();
+
+  print_constraints(bds2.constraints(), "*** AFTER THIRD Floyd-Warshall ***");
+  nout << "\n";
+
+  bool ok = bds1.contains(bds2) && bds2.contains(bds3)
+    && !bds2.contains(bds1) && !bds3.contains(bds2);
+
+  return ok;
+}
+
+} // namespace
+
 BEGIN_MAIN
   DO_TEST(test01);
+  DO_TEST_F16(test02);
+  DO_TEST_F16(test03);
 END_MAIN
diff --git a/tests/BD_Shape/concatenate1.cc b/tests/BD_Shape/concatenate1.cc
index 3ddda80..48660f6 100644
--- a/tests/BD_Shape/concatenate1.cc
+++ b/tests/BD_Shape/concatenate1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::concatenate_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,20 +36,20 @@ test01() {
   Variable x8(7);
   Variable x9(8);
 
-  TBD_Shape bd1(6);
-  bd1.add_constraint(x2 - x3 <= 0);
-  bd1.add_constraint(x3 <= 2);
-  bd1.add_constraint(x6 - x5 <= 2);
-  bd1.add_constraint(x5 <= 3);
+  TBD_Shape bds1(6);
+  bds1.add_constraint(x2 - x3 <= 0);
+  bds1.add_constraint(x3 <= 2);
+  bds1.add_constraint(x6 - x5 <= 2);
+  bds1.add_constraint(x5 <= 3);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(x2 - x3 <= 2);
-  bd2.add_constraint(x3 <= 7);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x2 - x3 <= 2);
+  bds2.add_constraint(x3 <= 7);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.concatenate_assign(bd2);
+  bds1.concatenate_assign(bds2);
 
   BD_Shape<mpq_class> known_result(9);
   known_result.add_constraint(x2 - x3 <= 0);
@@ -59,9 +59,9 @@ test01() {
   known_result.add_constraint(x8 - x9 <= 2);
   known_result.add_constraint(x9 <= 7);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
 
   return ok;
 }
@@ -71,22 +71,22 @@ test02() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 3);
-  bd1.add_constraint(x - y <= 4);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
 
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds2(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.concatenate_assign(bd1);
+  bds2.concatenate_assign(bds1);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.concatenate_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.concatenate_assign(bds1) ***");
 
   return ok;
 }
@@ -101,24 +101,24 @@ test03() {
   cs.insert(y == 3);
   cs.insert(3*x - 3*y <= 5);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraints(cs);
+  TBD_Shape bds1(2);
+  bds1.add_constraints(cs);
 
-  TBD_Shape bd2(0);
+  TBD_Shape bds2(0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.concatenate_assign(bd2);
+  bds1.concatenate_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 0);
   known_result.add_constraint(y == 3);
   known_result.add_constraint(x - y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
 
   return ok;
 }
@@ -131,23 +131,23 @@ test04() {
   Variable D(3);
   Variable E(4);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint_and_minimize(C >= 0);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint_and_minimize(C >= 0);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A >= 0);
-  bd2.add_constraint(A <= 1);
-  bd2.add_constraint(B >= 0);
-  bd2.add_constraint(B <= 2);
-  bd2.add_constraint(A - B <= 0);
-  bd2.add_constraint_and_minimize(B - A <= 1);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(A <= 1);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 2);
+  bds2.add_constraint(A - B <= 0);
+  bds2.add_constraint_and_minimize(B - A <= 1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.concatenate_assign(bd2);
+  bds1.concatenate_assign(bds2);
 
   BD_Shape<mpq_class> known_result(5);
   known_result.add_constraint(A >= 0);
@@ -160,9 +160,9 @@ test04() {
   known_result.add_constraint(D - E <= 0);
   known_result.add_constraint(E - D <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
 
   return ok;
 }
@@ -172,22 +172,22 @@ test05() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 3);
-  bd1.add_constraint(x - y <= 4);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
 
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds2(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.concatenate_assign(bd2);
+  bds1.concatenate_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/congruences1.cc b/tests/BD_Shape/congruences1.cc
new file mode 100644
index 0000000..8270873
--- /dev/null
+++ b/tests/BD_Shape/congruences1.cc
@@ -0,0 +1,223 @@
+/* Test BD_Shape::congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds1(2);
+  bds1.add_congruence((0*A %= 1) / 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Constraint_System cs = bds1.minimized_constraints();
+
+  print_constraints(cs, "*** cs ***");
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1(3, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_congruence((x %= 1) / 0);
+  bds1.add_congruence((y %= 3) / 2);
+  bds1.add_congruence((y - z %= 0) / 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(3);
+  bds2.add_congruences(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBD_Shape bds1(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  print_constraints(bds1, "*** bds1 ***");
+  TBD_Shape bds2(cgs.space_dimension(), EMPTY);
+
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds1(0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_congruence((x %= 1) / 0);
+  bds1.add_congruence((y %= 3) / 2);
+  bool b1 =
+    bds1.add_congruence_and_minimize((y + z %= 0) / 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(3);
+  bool b2 =
+    bds2.add_congruences_and_minimize(cgs);
+
+  bool ok = b1 && b2 && check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bds1(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs.space_dimension(), EMPTY);
+  bool b = bds2.add_congruences_and_minimize(cgs);
+
+  bool ok = !b && check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.refine_with_congruence((x %= 1) / 0);
+  bds1.refine_with_congruence((y %= 3) / 2);
+  bds1.refine_with_congruence((y - z %= 0) / 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(3);
+  bds2.add_congruences(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/BD_Shape/constrains1.cc b/tests/BD_Shape/constrains1.cc
new file mode 100644
index 0000000..a9d1ec0
--- /dev/null
+++ b/tests/BD_Shape/constrains1.cc
@@ -0,0 +1,228 @@
+/* Test BD_Shape::constrains().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)		\
+  if (!pred) {					\
+    nout << "!" #pred << endl;			\
+    ok = false;					\
+  }
+
+#define TEST_PREDICATE_FALSE(pred)		\
+  if (pred) {					\
+    nout << #pred << endl;			\
+    ok = false;					\
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TBD_Shape(2);
+  bds.add_constraint(A == B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TBD_Shape(2);
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds.add_constraint(A <= B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TBD_Shape bds(0);
+  bds.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) bds.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 0);
+  bds.unconstrain(A);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= A);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= B+1);
+  bds.add_constraint(A <= B);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= B);
+  bds.add_constraint(A <= B-1);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/constraints1.cc b/tests/BD_Shape/constraints1.cc
index 6e3569c..a6f5663 100644
--- a/tests/BD_Shape/constraints1.cc
+++ b/tests/BD_Shape/constraints1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::constraints().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,17 +26,17 @@ namespace {
 
 bool
 test01() {
-  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bds1(0, EMPTY);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  Constraint_System cs = bd1.constraints();
-  TBD_Shape bd2(cs);
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
   return ok;
@@ -44,17 +44,17 @@ test01() {
 
 bool
 test02() {
-  TBD_Shape bd1(0, UNIVERSE);
+  TBD_Shape bds1(0, UNIVERSE);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  Constraint_System cs = bd1.constraints();
-  TBD_Shape bd2(cs);
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
   return ok;
@@ -66,23 +66,23 @@ test03() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(B - C >= 1);
-  bd1.add_constraint(C - A <= 9);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B - C >= 1);
+  bds1.add_constraint(C - A <= 9);
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.contains(bd1);
+  bds1.contains(bds1);
 
-  Constraint_System cs = bd1.constraints();
-  TBD_Shape bd2(cs);
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
   return ok;
@@ -94,22 +94,93 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A >= 0);
-  bd1.add_constraint(B >= 0);
-  bd1.add_constraint(B - C == 1);
-  bd1.add_constraint(C - A <= 9);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B - C == 1);
+  bds1.add_constraint(C - A <= 9);
 
-  Constraint_System cs = bd1.constraints();
-  TBD_Shape bd2(cs);
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+
+  TBD_Shape bds1(0);
+  bds1.add_constraint(Linear_Expression(1) == 0);
+
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.refine_with_constraint(A > 0);
+  bds.refine_with_constraint(B < 0);
+  bds.refine_with_constraint(2*B - 2*C < 1);
+  bds.refine_with_constraint(A - C > 2);
+  bds.refine_with_constraint(A + 2*D >= 5);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(2*B - 2*C <= 1);
+  known_result.add_constraint(A - C >= 2);
+  known_result.add_constraint(A + 2*D >= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs(A > 0);
+  cs.insert(2*B - 2*C <= 1);
+  cs.insert(A - 5*C > 4);
+
+  TBD_Shape bds(3);
+  bds.refine_with_constraints(cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(2*B - 2*C <= 1);
+  known_result.add_constraint(A - 5*C >= 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
 
   return ok;
 }
@@ -121,4 +192,7 @@ BEGIN_MAIN
   DO_TEST(test02);
   DO_TEST(test03);
   DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
 END_MAIN
diff --git a/tests/BD_Shape/contains1.cc b/tests/BD_Shape/contains1.cc
index 6d4afa6..7151ca8 100644
--- a/tests/BD_Shape/contains1.cc
+++ b/tests/BD_Shape/contains1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::contains().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,21 +30,21 @@ test01() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x - y <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x - y <= 1);
 
   // The BD_Shape is empty, because it has got a negative cycle.
-  TBD_Shape bd2(3);
-  bd2.add_constraint(x - y <= 2);
-  bd2.add_constraint(y - z <= 2);
-  bd2.add_constraint(z - x <= -5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(y - z <= 2);
+  bds2.add_constraint(z - x <= -5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bool ok = bd1.contains(bd2);
+  bool ok = bds1.contains(bds2);
 
-  nout << "*** bd1.contains(bd2) ***"
+  nout << "*** bds1.contains(bds2) ***"
        << endl
        << (ok ? "true" : "false")
        << endl;
@@ -54,15 +54,15 @@ test01() {
 
 bool
 test02() {
-  TBD_Shape bd1;
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds1;
+  TBD_Shape bds2(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bool ok = bd1.contains(bd2);
+  bool ok = bds1.contains(bds2);
 
-  nout << "*** bd1.contains(bd2) ***"
+  nout << "*** bds1.contains(bds2) ***"
        << endl
        << (ok ? "true" : "false")
        << endl;
@@ -72,15 +72,15 @@ test02() {
 
 bool
 test03() {
-  TBD_Shape bd1(0, EMPTY);
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bool ok = bd1.contains(bd2);
+  bool ok = bds1.contains(bds2);
 
-  nout << "*** bd1.contains(bd2) ***"
+  nout << "*** bds1.contains(bds2) ***"
        << endl
        << (ok ? "true" : "false")
        << endl;
@@ -93,25 +93,82 @@ test04() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x - y >= 0);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x - y >= 0);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y == 0);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y == 0);
 
   try {
     // This is an invalid use of Polyhedron::contains(): it is
     // illegal to apply this method to two polyhedra that are not
     // dimension-compatible.
-    bd1.contains(bd2);
+    bds1.contains(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(D >= 0);
+  cs.insert(C >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  TBD_Shape bds1(cs);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(cs);
+  bds2.add_constraint(A - B >= 0);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool contained = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(C <= 0);
+  bds1.add_constraint(B - C <= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A == 0);
+  bds2.add_constraint(C <= 0);
+  bds2.add_constraint(B - C <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool contained = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***" << endl;
+  nout << (!contained ? "true" : "false") << endl;
+
+  return !contained;
 }
 
 } // namespace
@@ -121,4 +178,6 @@ BEGIN_MAIN
   DO_TEST(test02);
   DO_TEST(test03);
   DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
 END_MAIN
diff --git a/tests/BD_Shape/containsintegerpoint1.cc b/tests/BD_Shape/containsintegerpoint1.cc
new file mode 100644
index 0000000..2deeb24
--- /dev/null
+++ b/tests/BD_Shape/containsintegerpoint1.cc
@@ -0,0 +1,134 @@
+/* Test BD_Shape::contains_integer_point().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  BD_Shape<mpz_class> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  BD_Shape<mpq_class> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  BD_Shape<float> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y - 3*z <= 2);
+  cs.insert(8*z - 8*y >= 7);
+
+  BD_Shape<mpq_class> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/discrete1.cc b/tests/BD_Shape/discrete1.cc
new file mode 100644
index 0000000..aa6e716
--- /dev/null
+++ b/tests/BD_Shape/discrete1.cc
@@ -0,0 +1,214 @@
+/* Test BD_Shape::is_discrete().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y == 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+
+  bds.add_constraint(A == 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B - A <= -5);
+  bds.add_constraint(-B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(E == 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(7);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B == 2);
+  bds.add_constraint(B - A <= -6);
+
+  print_constraints(bds, "*** bds ***");
+
+   bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/BD_Shape/disjoint1.cc b/tests/BD_Shape/disjoint1.cc
new file mode 100644
index 0000000..5a9951f
--- /dev/null
+++ b/tests/BD_Shape/disjoint1.cc
@@ -0,0 +1,192 @@
+/* Test BD_Shape::is_disjoint_from(const BD_Shape& y).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(B == 0);
+  bds1.add_constraint(A >= 1);
+  bds1.add_constraint(A <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == 0);
+  bds2.add_constraint(B >= 1);
+  bds2.add_constraint(B <= 2);
+
+  bool ok = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(3);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A <= 3);
+  bds2.add_constraint(B - A <= -1);
+  bds2.add_constraint(B >= -5);
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return !disjoint;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+
+  Constraint_System cs1;
+  cs1.insert(x1 >= -4);
+  cs1.insert(x2 - x1 <= 0);
+  cs1.insert(x1 - x2 <= -5);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraints(cs1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(2*x1 >= 1);
+  cs2.insert(2*x1 <= 3);
+  cs2.insert(6*x2 <= 1);
+  cs2.insert(3*x2 >= -2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraints(cs2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  return disjoint;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= y);
+
+  TBD_Shape bds2(3);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::is_disjoint_from(bds2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    bds1.is_disjoint_from(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2, EMPTY);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A - B <= 5);
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return disjoint;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= -4);
+
+  TBD_Shape bds2(2, EMPTY);
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return disjoint;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A == 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == 1);
+
+  bool ok = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/empty1.cc b/tests/BD_Shape/empty1.cc
index 37e7806..fd52e91 100644
--- a/tests/BD_Shape/empty1.cc
+++ b/tests/BD_Shape/empty1.cc
@@ -1,11 +1,11 @@
 /* Different ways of creating an empty BD_Shape.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,26 +30,26 @@ test01() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(4);
-  TBD_Shape bd2(4);
+  TBD_Shape bds1(4);
+  TBD_Shape bds2(4);
 
-  bd1.add_constraint(-x <= 4);
-  bd1.add_constraint(y - x <= 0);
-  bd1.add_constraint(x - y <= -5);
+  bds1.add_constraint(-x <= 4);
+  bds1.add_constraint(y - x <= 0);
+  bds1.add_constraint(x - y <= -5);
 
-  bool empty = bd1.is_empty();
+  bool empty = bds1.is_empty();
 
-  nout << "*** bd1.is_empty() ***" << endl;
+  nout << "*** bds1.is_empty() ***" << endl;
   nout << (empty ? "true" : "false ") << endl;
 
-  bd2.add_constraint(-x <= 4);
-  bd2.add_constraint(y - x <= 0);
-  bd2.add_constraint(x - y <= 5);
-  bd2.add_constraint(z - x <= 1);
+  bds2.add_constraint(-x <= 4);
+  bds2.add_constraint(y - x <= 0);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(z - x <= 1);
 
-  bool empty1 = bd2.is_empty();
+  bool empty1 = bds2.is_empty();
 
-  nout << "*** bd2.is_empty() ***" << endl;
+  nout << "*** bds2.is_empty() ***" << endl;
   nout << (empty1 ? "true" : "false") << endl;
 
   return !empty1 && empty;
@@ -62,28 +62,28 @@ test02() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(4);
-  TBD_Shape bd2(4);
+  TBD_Shape bds1(4);
+  TBD_Shape bds2(4);
 
-  bd1.add_constraint(-x <= 2);
-  bd1.add_constraint(y - x <= -9);
-  bd1.add_constraint(x - y <= -7);
+  bds1.add_constraint(-x <= 2);
+  bds1.add_constraint(y - x <= -9);
+  bds1.add_constraint(x - y <= -7);
 
-  bool empty = bd1.is_empty();
+  bool empty = bds1.is_empty();
 
-  print_constraints(bd1, "*** bd1 ***");
-  nout << "*** bd1.is_empty() ***" << endl;
+  print_constraints(bds1, "*** bds1 ***");
+  nout << "*** bds1.is_empty() ***" << endl;
   nout << (empty ? "true" : "false") << endl;
 
-  bd2.add_constraint(-x <= 7);
-  bd2.add_constraint(y - x <= 1);
-  bd2.add_constraint(-y <= 2);
-  bd2.add_constraint(z - x <= 1);
+  bds2.add_constraint(-x <= 7);
+  bds2.add_constraint(y - x <= 1);
+  bds2.add_constraint(-y <= 2);
+  bds2.add_constraint(z - x <= 1);
 
-  bool empty1 = bd2.is_empty();
+  bool empty1 = bds2.is_empty();
 
-  print_constraints(bd2, "*** bd2 ***");
-  nout << "*** bd2.is_empty() ***" << endl;
+  print_constraints(bds2, "*** bds2 ***");
+  nout << "*** bds2.is_empty() ***" << endl;
   nout << (empty1 ? "true" : "false") << endl;
 
   return !empty1 && empty;
@@ -98,43 +98,43 @@ test03() {
   Variable x5(4);
   // Variable x6(5);
 
-  TBD_Shape bd1(6);
-  TBD_Shape bd2(6);
-
-  bd1.add_constraint(x1 <= 3);
-  bd1.add_constraint(x4 <= 3);
-  bd1.add_constraint(x2 - x1 <= 0);
-  bd1.add_constraint(x3 - x1 <= -2);
-  bd1.add_constraint(x5 - x1 <= 2);
-  bd1.add_constraint(-x2 <= 0);
-  bd1.add_constraint(x3 - x2 <= 5);
-  bd1.add_constraint(x4 - x3 <= -6);
-  bd1.add_constraint(x1 - x4 <= 5);
-  bd1.add_constraint(x5 - x4 <= 2);
-  bd1.add_constraint(-x5 <= -5);
-  bd1.add_constraint(x3 - x5 <= 7);
-
-  bool empty = bd1.is_empty();
-
-  nout << "*** bd1.is_empty() ***" << endl;
+  TBD_Shape bds1(6);
+  TBD_Shape bds2(6);
+
+  bds1.add_constraint(x1 <= 3);
+  bds1.add_constraint(x4 <= 3);
+  bds1.add_constraint(x2 - x1 <= 0);
+  bds1.add_constraint(x3 - x1 <= -2);
+  bds1.add_constraint(x5 - x1 <= 2);
+  bds1.add_constraint(-x2 <= 0);
+  bds1.add_constraint(x3 - x2 <= 5);
+  bds1.add_constraint(x4 - x3 <= -6);
+  bds1.add_constraint(x1 - x4 <= 5);
+  bds1.add_constraint(x5 - x4 <= 2);
+  bds1.add_constraint(-x5 <= -5);
+  bds1.add_constraint(x3 - x5 <= 7);
+
+  bool empty = bds1.is_empty();
+
+  nout << "*** bds1.is_empty() ***" << endl;
   nout << (empty ? "true" : "false") << endl;
 
-  bd2.add_constraint(x1 <= 3);
-  bd2.add_constraint(x4 <= 3);
-  bd2.add_constraint(x2 - x1 <= 0);
-  bd2.add_constraint(x3 - x1 <= 2);
-  bd2.add_constraint(x5 - x1 <= 2);
-  bd2.add_constraint(-x2 <= 0);
-  bd2.add_constraint(x3 - x2 <= 5);
-  bd2.add_constraint(x4 - x3 <= 6);
-  bd2.add_constraint(x1 - x4 <= 5);
-  bd2.add_constraint(x5 - x4 <= 2);
-  bd2.add_constraint(-x5 <= 5);
-  bd2.add_constraint(x3 - x5 <= 7);
-
-  bool empty1 = bd2.is_empty();
-
-  nout << "*** bd2.is_empty() ***" << endl;
+  bds2.add_constraint(x1 <= 3);
+  bds2.add_constraint(x4 <= 3);
+  bds2.add_constraint(x2 - x1 <= 0);
+  bds2.add_constraint(x3 - x1 <= 2);
+  bds2.add_constraint(x5 - x1 <= 2);
+  bds2.add_constraint(-x2 <= 0);
+  bds2.add_constraint(x3 - x2 <= 5);
+  bds2.add_constraint(x4 - x3 <= 6);
+  bds2.add_constraint(x1 - x4 <= 5);
+  bds2.add_constraint(x5 - x4 <= 2);
+  bds2.add_constraint(-x5 <= 5);
+  bds2.add_constraint(x3 - x5 <= 7);
+
+  bool empty1 = bds2.is_empty();
+
+  nout << "*** bds2.is_empty() ***" << endl;
   nout << (empty1 ? "true" : "false") << endl;
 
   return !empty1 && empty;
@@ -146,16 +146,16 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
+  TBD_Shape bds(3);
 
-  bd.add_constraint(A == 0);
-  bd.add_constraint(C >= 0);
-  bd.add_constraint(B - C >= 1);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(B - C >= 1);
 
-  bool empty = bd.is_empty();
+  bool empty = bds.is_empty();
 
-  print_constraints(bd, "*** bd ***");
-  nout << "*** bd.is_empty() ***"
+  print_constraints(bds, "*** bds ***");
+  nout << "*** bds.is_empty() ***"
        << endl
        << (empty ? "true" : "false") << endl;
 
@@ -170,7 +170,7 @@ test05() {
   Variable x4(3);
   Variable x5(4);
 
-  TBD_Shape bd(5);
+  TBD_Shape bds(5);
 
   Coefficient a;
   if (std::numeric_limits<Coefficient>::is_bounded)
@@ -178,17 +178,17 @@ test05() {
   else
     a = 1300000000;
 
-  bd.add_constraint(x1 - x2 <= -a);
-  bd.add_constraint(x2 - x3 <= -a);
-  bd.add_constraint(x3 - x4 <= a);
-  bd.add_constraint(x4 - x5 <= a);
-  bd.add_constraint(x5 - x1 <= a);
+  bds.add_constraint(x1 - x2 <= -a);
+  bds.add_constraint(x2 - x3 <= -a);
+  bds.add_constraint(x3 - x4 <= a);
+  bds.add_constraint(x4 - x5 <= a);
+  bds.add_constraint(x5 - x1 <= a);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bool empty = bd.is_empty();
+  bool empty = bds.is_empty();
 
-  nout << "*** bd.is_empty() ***" << endl;
+  nout << "*** bds.is_empty() ***" << endl;
   nout << (empty ? "true" : "false") << endl;
 
   return !empty;
diff --git a/tests/BD_Shape/equality1.cc b/tests/BD_Shape/equality1.cc
index 19d1fb7..8115086 100644
--- a/tests/BD_Shape/equality1.cc
+++ b/tests/BD_Shape/equality1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::operator==().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,48 +30,48 @@ test01() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd1(3);
-  TBD_Shape bd2(2);
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(2);
 
-  bd1.add_constraint(x <= 3);
-  bd1.add_constraint(x - y <= 4);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
 
-  bd2.add_constraint(x - y <= 5);
-  bd2.add_constraint(-y <= -2);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(-y <= -2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
   bool known_result = false;
-  bool ok = ((bd1 == bd2) == known_result);
+  bool ok = ((bds1 == bds2) == known_result);
 
   return ok;
 }
 
 bool
 test02() {
-  TBD_Shape bd1(0, EMPTY);
-  TBD_Shape bd2(0);
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(0);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
   bool known_result = false;
-  bool ok = ((bd1 == bd2) == known_result);
+  bool ok = ((bds1 == bds2) == known_result);
 
   return ok;
 }
 
 bool
 test03() {
-  TBD_Shape bd1(0);
-  TBD_Shape bd2(0, EMPTY);
+  TBD_Shape bds1(0);
+  TBD_Shape bds2(0, EMPTY);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
   bool known_result = false;
-  bool ok = ((bd1 == bd2) == known_result);
+  bool ok = ((bds1 == bds2) == known_result);
 
   return ok;
 }
@@ -81,19 +81,19 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A - B <= 1);
-  bd1.add_constraint(B - A <= -2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A - B <= 1);
+  bds1.add_constraint(B - A <= -2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A - B <= 1);
-  bd2.add_constraint(B - A <= 2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(B - A <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
   bool known_result = false;
-  bool ok = ((bd1 == bd2) == known_result);
+  bool ok = ((bds1 == bds2) == known_result);
 
   return ok;
 }
@@ -103,19 +103,19 @@ test05() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A - B <= 1);
-  bd1.add_constraint(B - A <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A - B <= 1);
+  bds1.add_constraint(B - A <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A - B <= 1);
-  bd2.add_constraint(B - A <= -2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(B - A <= -2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
   bool known_result = false;
-  bool ok = ((bd1 == bd2) == known_result);
+  bool ok = ((bds1 == bds2) == known_result);
 
   return ok;
 }
diff --git a/tests/BD_Shape/expandspacedim1.cc b/tests/BD_Shape/expandspacedim1.cc
new file mode 100644
index 0000000..6ee635c
--- /dev/null
+++ b/tests/BD_Shape/expandspacedim1.cc
@@ -0,0 +1,245 @@
+/* Test BD_Shape::expand_space_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds(3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+
+  TBD_Shape known_result(4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** After bds.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(3, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(B, 1);
+
+  TBD_Shape known_result(4, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 0);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2, EMPTY);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+
+  TBD_Shape known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+
+  TBD_Shape known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 2);
+
+  TBD_Shape known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(C == 1);
+  bds.add_constraint(A - B >= 1);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+  bds.expand_space_dimension(C, 1);
+
+  TBD_Shape known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D - B >= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.expand_space_dimension(A, 1);"
+                    " bds.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2, EMPTY);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(A - B >= 1);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(B, 1);
+
+  TBD_Shape known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/foldspacedims1.cc b/tests/BD_Shape/foldspacedims1.cc
new file mode 100644
index 0000000..15345af
--- /dev/null
+++ b/tests/BD_Shape/foldspacedims1.cc
@@ -0,0 +1,337 @@
+/* Test BD_Shape::fold_space_dimensions().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(3);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(3, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - C <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - C <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B >= 7);
+  bds.add_constraint(B <= 12);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B >= 7);
+  bds.add_constraint(B <= 12);
+  bds.add_constraint(C == 15);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  bds.fold_space_dimensions(to_fold, C);
+
+  TBD_Shape known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A, B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(C - B <= 2);
+  bds.add_constraint(D >= 0);
+  bds.add_constraint(D - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  bds.fold_space_dimensions(to_fold, A);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {C, D} into A ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B == 0);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(C - B <= 2);
+  bds.add_constraint(D >= 0);
+  bds.add_constraint(D - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  bds.fold_space_dimensions(to_fold, C);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+
+  bds.fold_space_dimensions(to_fold, A);
+
+  TBD_Shape known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.OK();
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(1, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(1, EMPTY);
+
+  bds.add_space_dimensions_and_embed(1);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.OK();
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(1, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/frombdshape1.cc b/tests/BD_Shape/frombdshape1.cc
new file mode 100644
index 0000000..008a925
--- /dev/null
+++ b/tests/BD_Shape/frombdshape1.cc
@@ -0,0 +1,132 @@
+/* Test BD_Shape copy construct, construction from other
+   BD shapes and assignment.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  TBD_Shape bds(bds1);
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  TBD_Shape bds = bds1;
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  TBD_Shape bds(1);
+  bds = bds1;
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  BD_Shape<mpq_class> bds(bds1);
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/frombox1.cc b/tests/BD_Shape/frombox1.cc
new file mode 100644
index 0000000..94f83ee
--- /dev/null
+++ b/tests/BD_Shape/frombox1.cc
@@ -0,0 +1,357 @@
+/* Test BD_Shape::BD_Shape(const Box<Interval>&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+  Rational_Box box(2);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*B == 2);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(3*B == 2);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(B == -10);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(3*A == -2);
+  known_bds.add_constraint(B == -10);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+  print_constraints(known_bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Rational_Box box(3);
+  box.add_constraint(5*C == 15);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(3);
+  known_bds.add_constraint(5*C == 15);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+  Rational_Box box(0);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds;
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2, EMPTY);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Rational_Box box(4);
+  box.add_constraint(D == 4);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(4);
+  known_bds.add_constraint(D == 4);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Unit square.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(A >= 0);
+  known_bds.add_constraint(A <= 1);
+  known_bds.add_constraint(B >= 0);
+  known_bds.add_constraint(B <= 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(2*B == 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(A >= 0);
+  known_bds.add_constraint(2*B == 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(2*B == 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(7*A <= 3);
+  known_bds.add_constraint(2*B == 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(2*B <= 0);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(7*A == 3);
+  known_bds.add_constraint(2*B >= 1);
+  known_bds.add_constraint(2*B <= 0);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+  Rational_Box box(0);
+  box.set_empty();
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(0, EMPTY);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Rational_Box box(6);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(4*B == -11);
+  box.add_constraint(3*D == 18);
+  box.add_constraint(7*E == 15);
+  box.add_constraint(7*F == -15);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(6);
+  known_bds.add_constraint(3*A == -2);
+  known_bds.add_constraint(4*B == -11);
+  known_bds.add_constraint(3*D == 18);
+  known_bds.add_constraint(7*E == 15);
+  known_bds.add_constraint(7*F == -15);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(B >= 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(7*A == 3);
+  known_bds.add_constraint(2*B >= 1);
+  known_bds.add_constraint(B >= 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/BD_Shape/fromgensys1.cc b/tests/BD_Shape/fromgensys1.cc
index 1294e03..071ee89 100644
--- a/tests/BD_Shape/fromgensys1.cc
+++ b/tests/BD_Shape/fromgensys1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::BD_Shape(const Generator_System&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,13 +27,13 @@ namespace {
 bool
 test01() {
   Generator_System gs;
-  TBD_Shape bd(gs);
+  TBD_Shape bds(gs);
 
   BD_Shape<mpq_class> known_result(0, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
   return ok;
 }
@@ -48,19 +48,15 @@ test02() {
   try {
     // It is illegal to build a BD_Shape starting from a non-empty
     // generator system having no points.
-    TBD_Shape bd(gs);
-
-    // It is an error if the exception is not thrown.
-    return false;
+    TBD_Shape bds(gs);
   }
   catch (std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    // It is an error if the wrong exception is thrown.
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -73,19 +69,15 @@ test03() {
   try {
     // It is illegal to build a BD_Shape starting from a non-empty
     // generator system having no points.
-    TBD_Shape bd(gs);
-
-    // It is an error if the exception is not thrown.
-    return false;
+    TBD_Shape bds(gs);
   }
   catch (std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+    nout << "std::invalid_argument: " << e.what() << endl;
     return true;
   }
   catch (...) {
-    // It is an error if the wrong exception is thrown.
-    return false;
   }
+  return false;
 }
 
 bool
@@ -99,7 +91,7 @@ test04() {
   gs.insert(ray(A + B));
   gs.insert(point(1*A + 2*B + 3*C + 4*D));
   gs.insert(point(2*A + 3*B + 4*C + 5*D));
-  TBD_Shape bd(gs);
+  TBD_Shape bds(gs);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(A >= 1);
@@ -112,9 +104,9 @@ test04() {
   known_result.add_constraint(C == D-1);
   known_result.add_constraint(C <= A+2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
   return ok;
 }
@@ -133,7 +125,7 @@ test05() {
   ph.add_constraint(D >= 4);
   ph.add_constraint(A-D <= 50);
 
-  TBD_Shape bd(ph.generators());
+  TBD_Shape bds(ph.generators());
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(C <= 30);
@@ -145,9 +137,9 @@ test05() {
   known_result.add_constraint(C - D <= 23);
   known_result.add_constraint(C - D >= 8);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/fromgrid1.cc b/tests/BD_Shape/fromgrid1.cc
new file mode 100644
index 0000000..fefe66b
--- /dev/null
+++ b/tests/BD_Shape/fromgrid1.cc
@@ -0,0 +1,201 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x - y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x - y %= 0) / 0);
+  gr.add_congruence((y - z %= 0) / 0);
+  gr.add_congruence((z %= 0) / 1);
+
+  TBD_Shape bds(gr);
+
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+  known_bds.add_constraint(x - y == 0);
+  known_bds.add_constraint(y - z == 0);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+  Grid gr(2);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 3);
+  gr.add_congruence((y - z %= 2) / 5);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+  Grid gr(0);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds;
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(2, EMPTY);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x - y %= 1) / 0);
+  gr.add_congruence((y %= 0) / 0);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+  known_bds.add_constraint(x == 1);
+  known_bds.add_constraint(y == 0);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(0, EMPTY);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+  Grid gr(2);
+  Constraint_System cs = gr.constraints();
+
+  TBD_Shape bds(cs);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/fromoctagonalshape1.cc b/tests/BD_Shape/fromoctagonalshape1.cc
new file mode 100644
index 0000000..9a4005e
--- /dev/null
+++ b/tests/BD_Shape/fromoctagonalshape1.cc
@@ -0,0 +1,55 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os(cs);
+
+  TBD_Shape bds(os);
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/frompolyhedron1.cc b/tests/BD_Shape/frompolyhedron1.cc
new file mode 100644
index 0000000..98f3b68
--- /dev/null
+++ b/tests/BD_Shape/frompolyhedron1.cc
@@ -0,0 +1,64 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B <= 5);
+  cs.insert(A + 2*B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(3*A - 5*B <= 18);
+  C_Polyhedron ph(cs);
+
+  TBD_Shape bds1(ph, SIMPLEX_COMPLEXITY);
+  TBD_Shape bds2(ph, ANY_COMPLEXITY);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(11*A <= 61);
+  known_result.add_constraint(2*B <= 5);
+  known_result.add_constraint(5*B >= -18);
+  known_result.add_constraint(11*A - 11*B <= 64);
+
+  bool ok = (bds1 == bds2
+             && check_result(bds1, known_result,
+                             "7.50e-7", "4.89e-7", "4.34e-7"));
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/BD_Shape/fromspacedim1.cc b/tests/BD_Shape/fromspacedim1.cc
new file mode 100644
index 0000000..79c6c24
--- /dev/null
+++ b/tests/BD_Shape/fromspacedim1.cc
@@ -0,0 +1,122 @@
+/* Test BD_Shape::BD_Shape(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bds(0, EMPTY);
+
+  bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  bool ok = (bds.OK() && bds.is_universe() && bds.space_dimension() == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bds(4, EMPTY);
+
+  bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBD_Shape bds(4, UNIVERSE);
+
+  bool ok = (bds.OK() && bds.is_universe() && bds.space_dimension() == 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(C >= 1);
+
+  bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(C >= 1);
+
+  bool ok = (bds.OK() && bds.space_dimension() == 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage1.cc b/tests/BD_Shape/generalizedaffineimage1.cc
index 18b4a29..76183fb 100644
--- a/tests/BD_Shape/generalizedaffineimage1.cc
+++ b/tests/BD_Shape/generalizedaffineimage1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::generalized_affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,25 +29,25 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
-  bd.add_constraint(A <= B);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A <= B);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2);
+  bds.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 0);
   known_result.add_constraint(A <= 4);
   known_result.add_constraint(B - A >= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image"
-		        "(B, GREATER_THAN_OR_EQUAL, A+2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image"
+                        "(B, GREATER_OR_EQUAL, A+2) ***");
 
   return ok;
 }
@@ -57,22 +57,22 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(B >= 0);
-  bd.add_constraint(A - B >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B >= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd.generalized_affine_image(A, EQUAL, A + 2);
+  bds.generalized_affine_image(A, EQUAL, A + 2);
 
   known_result.affine_image(A, A + 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image"
-		    "(A, EQUAL, A + 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
 
   return ok;
 }
@@ -82,18 +82,18 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2, EMPTY);
+  TBD_Shape bds(2, EMPTY);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B + 1);
+  bds.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image"
-		    "(A, LESS_THAN_OR_EQUAL, B + 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
 
   return ok;
 }
@@ -103,15 +103,15 @@ test04() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(3);
+  TBD_Shape bds(3);
 
-  bd.add_constraint(x >= 2);
-  bd.add_constraint(x - y <= 3);
-  bd.add_constraint(y <= 2);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(x,GREATER_THAN_OR_EQUAL, 2*x - 2, 2);
+  bds.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x >= 1);
@@ -119,10 +119,10 @@ test04() {
   known_result.add_constraint(- y <= 1);
   known_result.add_constraint(x - y >= -1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(x, "
-                        "GREATER_THAN_OR_EQUAL, 2*x - 2, 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(x, "
+                        "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
 
   return ok;
 }
@@ -132,24 +132,24 @@ test05() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x >= 2);
-  bd.add_constraint(x - y <= 3);
-  bd.add_constraint(y <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(y,GREATER_THAN_OR_EQUAL, 2*x - 2, 2);
+  bds.generalized_affine_image(y, GREATER_OR_EQUAL, 2*x - 2, 2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x >= 2);
   known_result.add_constraint(x <= 5);
   known_result.add_constraint(y >= x - 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(y, "
-                        "GREATER_THAN_OR_EQUAL, 2*x - 2, 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(y, "
+                        "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
 
   return ok;
 }
@@ -161,25 +161,25 @@ test06() {
   Linear_Expression e1(A);
   Linear_Expression e2(A);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
-  bd.add_constraint(A <= B);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A <= B);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(e1, GREATER_THAN_OR_EQUAL, e2);
+  bds.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 0);
   known_result.add_constraint(B >= 0);
   known_result.add_constraint(B <= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(A, "
-                        "GREATER_THAN_OR_EQUAL, A) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "GREATER_OR_EQUAL, A) ***");
 
   return ok;
 }
@@ -189,25 +189,25 @@ test07() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
-  bd.add_constraint(A - B <= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A - B <= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, Linear_Expression(1));
+  bds.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(1));
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 1);
   known_result.add_constraint(B >= 0);
   known_result.add_constraint(B <= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(A, "
-                        "GREATER_THAN_OR_EQUAL, 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "GREATER_OR_EQUAL, 1) ***");
 
   return ok;
 }
@@ -218,17 +218,17 @@ test08() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
-  bd.add_constraint(A - B <= 0);
-  bd.add_constraint(B - C == 2);
-  bd.add_constraint(C - A <= -2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A - B <= 0);
+  bds.add_constraint(B - C == 2);
+  bds.add_constraint(C - A <= -2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(-B, LESS_THAN_OR_EQUAL, Linear_Expression(1));
+  bds.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A >= 0);
@@ -238,10 +238,10 @@ test08() {
   known_result.add_constraint(C <= 2);
   known_result.add_constraint(B >= -1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(-B, "
-                        "LESS_THAN_OR_EQUAL, 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(-B, "
+                        "LESS_OR_EQUAL, 1) ***");
 
   return ok;
 }
@@ -254,16 +254,16 @@ test09() {
   Linear_Expression e1(C);
   Linear_Expression e2(A + 1);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
-  bd.add_constraint(C <= 2);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(e1, LESS_THAN_OR_EQUAL, e2);
+  bds.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A >= 0);
@@ -271,10 +271,10 @@ test09() {
   known_result.add_constraint(B <= 5);
   known_result.add_constraint(C - A <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(C, "
-                        "LESS_THAN_OR_EQUAL, A + 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(C, "
+                        "LESS_OR_EQUAL, A + 1) ***");
 
   return ok;
 }
@@ -284,23 +284,23 @@ test10() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(A, LESS_THAN_OR_EQUAL, Linear_Expression(1));
+  bds.generalized_affine_image(A, LESS_OR_EQUAL, Linear_Expression(1));
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A <= 1);
   known_result.add_constraint(B <= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(A, "
-                        "LESS_THAN_OR_EQUAL, 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "LESS_OR_EQUAL, 1) ***");
 
   return ok;
 }
@@ -310,23 +310,23 @@ test11() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x == 4);
-  bd.add_constraint(y <= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 4);
+  bds.add_constraint(y <= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(3*x + 2, LESS_THAN_OR_EQUAL, 2*x - 3);
+  bds.generalized_affine_image(3*x + 2, LESS_OR_EQUAL, 2*x - 3);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 1);
   known_result.add_constraint(y <= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_image(3*x + 2, "
-		    "LESS_THAN_OR_EQUAL, 2*x - 3) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(3*x + 2, "
+                    "LESS_OR_EQUAL, 2*x - 3) ***");
 
   return ok;
 }
@@ -336,22 +336,22 @@ test12() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x - y <= 7);
-  bd.add_constraint(y >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x - y <= 7);
+  bds.add_constraint(y >= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+  bds.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
 
   known_result.add_constraint(3*x == 10);
 
-  bool ok = check_result(bd, known_result, "3.98e-7", "2.39e-7", "1.59e-7");
+  bool ok = check_result(bds, known_result, "3.98e-7", "2.39e-7", "1.59e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
 
   return ok;
 }
@@ -361,21 +361,21 @@ test13() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(2*B + 3*A,
-			      LESS_THAN_OR_EQUAL, Linear_Expression(1));
+  bds.generalized_affine_image(2*B + 3*A,
+                              LESS_OR_EQUAL, Linear_Expression(1));
 
   BD_Shape<mpq_class> known_result(2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(3*A + 2*B, "
-                        "LESS_THAN_OR_EQUAL, 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(3*A + 2*B, "
+                        "LESS_OR_EQUAL, 1) ***");
 
   return ok;
 }
@@ -385,23 +385,23 @@ test14() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A == 0);
-  bd.add_constraint(B >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B >= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+  bds.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
 
   known_result.affine_image(A, 4*B + 5, 2);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_image(-2*A + 5, "
-		    "EQUAL, -4*B) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
 
   return ok;
 }
@@ -411,20 +411,20 @@ test15() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(A + 2*B - 5, GREATER_THAN_OR_EQUAL, 3*B);
+  bds.generalized_affine_image(A + 2*B - 5, GREATER_OR_EQUAL, 3*B);
 
   BD_Shape<mpq_class> known_result(2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(A + 2*B - 5, "
-                        "GREATER_THAN_OR_EQUAL, 3*B) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(A + 2*B - 5, "
+                        "GREATER_OR_EQUAL, 3*B) ***");
 
   return ok;
 }
@@ -435,23 +435,23 @@ test16() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(2*B + C + 1, LESS_THAN_OR_EQUAL, A - 3*B + 2*C);
+  bds.generalized_affine_image(2*B + C + 1, LESS_OR_EQUAL, A - 3*B + 2*C);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_image(2*B + C + 1, "
-		    "LESS_THAN_OR_EQUAL, A - 3*B + 2*C) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(2*B + C + 1, "
+                    "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
 
   return ok;
 }
@@ -462,23 +462,22 @@ test17() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(2*B + C + 1,
-			      GREATER_THAN_OR_EQUAL, A - 3*B + 2*C);
+  bds.generalized_affine_image(2*B + C + 1, GREATER_OR_EQUAL, A - 3*B + 2*C);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(2*B + C + 1, "
-		        "GREATER_THAN_OR_EQUAL, A - 3*B + 2*C) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(2*B + C + 1, "
+                        "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
 
   return ok;
 }
@@ -489,23 +488,23 @@ test18() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(-2*A - B - 1,
-			      GREATER_THAN_OR_EQUAL, 3*A + B + 4*C - 2);
+  bds.generalized_affine_image(-2*A - B - 1,
+                              GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(C <= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(-2*A - B - 1, "
-                        "GREATER_THAN_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(-2*A - B - 1, "
+                        "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
 
   return ok;
 }
@@ -516,24 +515,24 @@ test19() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(-2*C + 3, LESS_THAN_OR_EQUAL, -3*B + 4);
+  bds.generalized_affine_image(-2*C + 3, LESS_OR_EQUAL, -3*B + 4);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A - B == 0);
   known_result.add_constraint(B <= 1);
   known_result.add_constraint(A <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(-2*C + 3, "
-                        "LESS_THAN_OR_EQUAL, -3*B + 4) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(-2*C + 3, "
+                        "LESS_OR_EQUAL, -3*B + 4) ***");
 
   return ok;
 }
@@ -544,24 +543,24 @@ test20() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C + A <=2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C + A <=2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(Linear_Expression(3),
-			      GREATER_THAN_OR_EQUAL,
-			      Linear_Expression(4));
+  bds.generalized_affine_image(Linear_Expression(3),
+                              GREATER_OR_EQUAL,
+                              Linear_Expression(4));
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_image(3, "
-		    "GREATER_THAN_OR_EQUAL, 4) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(3, "
+                    "GREATER_OR_EQUAL, 4) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/generalizedaffineimage2.cc b/tests/BD_Shape/generalizedaffineimage2.cc
index a467da6..0abc5d1 100644
--- a/tests/BD_Shape/generalizedaffineimage2.cc
+++ b/tests/BD_Shape/generalizedaffineimage2.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::generalized_affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,24 +29,24 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 4);
-  bd.add_constraint(x >= -6);
-  bd.add_constraint(y == 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 4);
+  bds.add_constraint(x >= -6);
+  bds.add_constraint(y == 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(y, LESS_THAN_OR_EQUAL, -y + 1);
+  bds.generalized_affine_image(y, LESS_OR_EQUAL, -y + 1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 4);
   known_result.add_constraint(x >= -6);
   known_result.add_constraint(y <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(y, "
-                        "LESS_THAN_OR_EQUAL, -y + 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(y, "
+                        "LESS_OR_EQUAL, -y + 1) ***");
 
   return ok;
 }
@@ -56,23 +56,23 @@ test02() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 4);
-  bd.add_constraint(x >= -6);
-  bd.add_constraint(y == 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 4);
+  bds.add_constraint(x >= -6);
+  bds.add_constraint(y == 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(x, GREATER_THAN_OR_EQUAL, -x - 3);
+  bds.generalized_affine_image(x, GREATER_OR_EQUAL, -x - 3);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x >= -7);
   known_result.add_constraint(y == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(x, "
-		        "GREATER_THAN_OR_EQUAL, -x - 3) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(x, "
+                        "GREATER_OR_EQUAL, -x - 3) ***");
 
   return ok;
 }
@@ -82,22 +82,22 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(B <= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B <= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(B, LESS_THAN_OR_EQUAL, 3*B + 1, 2);
+  bds.generalized_affine_image(B, LESS_OR_EQUAL, 3*B + 1, 2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 0);
   known_result.add_constraint(B <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(B, "
-		        "LESS_THAN_OR_EQUAL, 3*B + 1, 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "LESS_OR_EQUAL, 3*B + 1, 2) ***");
 
   return ok;
 }
@@ -107,22 +107,22 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A == 0);
-  bd.add_constraint(B >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B >= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, B - 2);
+  bds.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A == 0);
   known_result.add_constraint(B >= -1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(B, "
-		        "GREATER_THAN_OR_EQUAL, B - 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "GREATER_OR_EQUAL, B - 2) ***");
 
   return ok;
 }
@@ -132,22 +132,22 @@ test05() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(A - B == 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(A - B == 0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, 2*A + 3, 2);
+  bds.generalized_affine_image(A, GREATER_OR_EQUAL, 2*A + 3, 2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(B <= 1);
   known_result.add_constraint(2*B - 2*A <= -3);
 
-  bool ok = check_result(bd, known_result, "7.63e-17", "3.82e-17", "1.91e-17");
+  bool ok = check_result(bds, known_result, "7.63e-17", "3.82e-17", "1.91e-17");
 
-  print_constraints(bd, "*** bd.generalized_affine_image(A, "
-		        "GREATER_THAN_OR_EQUAL, 2*A + 3, 2) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "GREATER_OR_EQUAL, 2*A + 3, 2) ***");
 
   return ok;
 }
@@ -158,14 +158,14 @@ test06() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(C, LESS_THAN_OR_EQUAL, 2*C + 1, 5);
+  bds.generalized_affine_image(C, LESS_OR_EQUAL, 2*C + 1, 5);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A - B == 0);
@@ -173,10 +173,10 @@ test06() {
   known_result.add_constraint(5*C <= 7);
   known_result.add_constraint(A <= 1);
 
-  bool ok = check_result(bd, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+  bool ok = check_result(bds, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
 
-  print_constraints(bd, "*** bd.generalized_affine_image(C, "
-                        "LESS_THAN_OR_EQUAL, 2*C + 1, 5) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(C, "
+                        "LESS_OR_EQUAL, 2*C + 1, 5) ***");
 
   return ok;
 }
@@ -187,23 +187,23 @@ test07() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+  bds.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
 
   known_result.affine_image(C, 5*C - 3, 4);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(C, "
-		        "EQUAL, 5*C - 3, 4) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(C, "
+                        "EQUAL, 5*C - 3, 4) ***");
 
   return ok;
 }
@@ -214,24 +214,24 @@ test08() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, -B - 2, 3);
+  bds.generalized_affine_image(B, GREATER_OR_EQUAL, -B - 2, 3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(B >= -1);
   known_result.add_constraint(C - A <= 2);
   known_result.add_constraint(A <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(B, "
-                        "GREATER_THAN_OR_EQUAL, -B - 2, 3) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "GREATER_OR_EQUAL, -B - 2, 3) ***");
 
   return ok;
 }
@@ -242,23 +242,23 @@ test09() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(B, LESS_THAN_OR_EQUAL, 4*A -2*C + 3, -3);
+  bds.generalized_affine_image(B, LESS_OR_EQUAL, 4*A -2*C + 3, -3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A <= 1);
   known_result.add_constraint(C - A <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(B, "
-                        "LESS_THAN_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "LESS_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
 
   return ok;
 }
@@ -269,23 +269,23 @@ test10() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A - B == 0);
-  bd.add_constraint(B <= 1);
-  bd.add_constraint(C - A <=2);
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <=2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+  bds.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
 
   known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(B, "
-		        "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "EQUAL, 2*A - 4*B + C + 3, 3) ***");
 
   return ok;
 }
@@ -297,22 +297,22 @@ test11() {
   Linear_Expression e1(A);
   Linear_Expression e2(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(e1, EQUAL, e2);
+  bds.generalized_affine_image(e1, EQUAL, e2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A == 1);
   known_result.add_constraint(B <= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(A, EQUAL, 1) ***");
+  print_constraints(bds, "*** bds.generalized_affine_image(A, EQUAL, 1) ***");
 
   return ok;
 }
@@ -324,23 +324,24 @@ test12() {
   Linear_Expression e1(B - 3);
   Linear_Expression e2(B + 1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
-  bd.add_constraint(A <= 4);
-  bd.add_constraint(B <= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_image(e1, EQUAL, e2);
+  bds.generalized_affine_image(e1, EQUAL, e2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(A >= 0);
   known_result.add_constraint(A <= 4);
   known_result.add_constraint(B <= 9);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.generalized_affine_image(B-3,EQUAL, B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(B-3, EQUAL, B+1) ***");
 
   return ok;
 }
@@ -350,22 +351,22 @@ test13() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= y);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
     // to use a strict relation symbol.
-    bd.generalized_affine_image(x, LESS_THAN, x + 1);
+    bds.generalized_affine_image(x, LESS_THAN, x + 1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -373,22 +374,22 @@ test14() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= y);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
     // to use a strict relation symbol.
-    bd.generalized_affine_image(x, GREATER_THAN, x + 1);
+    bds.generalized_affine_image(x, GREATER_THAN, x + 1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -396,24 +397,24 @@ test15() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= y);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
-    // to apply to a expression with the denominator
+    // to apply it to a expression with the denominator
     // equal to zero.
     Coefficient d = 0;
-    bd.generalized_affine_image(x, LESS_THAN_OR_EQUAL, x + 1, d);
+    bds.generalized_affine_image(x, LESS_OR_EQUAL, x + 1, d);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -422,23 +423,23 @@ test16() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x >= y);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
     // to apply it to an expression whose space dimension is
-    // greather than the BDS's space dimension.
-    bd.generalized_affine_image(y, GREATER_THAN_OR_EQUAL, z);
+    // greater than the BDS's space dimension.
+    bds.generalized_affine_image(y, GREATER_OR_EQUAL, z);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -447,24 +448,24 @@ test17() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
 
   try {
-    // This is an incorrect use of the function
+    // This is an incorrect use of the method
     // BD_Shape::generalized_affine_image(lhs, r, rhs):
     // it is illegal to use a variable in the `rhs' expression that
     // does not appear in the BDS.
 
-    bd.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, B + C);
+    bds.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -473,23 +474,23 @@ test18() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
 
   try {
-    // This is an incorrect use of function
+    // This is an incorrect use of method
     // BD_Shape::generalized_affine_image(lhs, r, rhs):
     // it is illegal to use a variable in the `lhs' expression that
     // does not appear in the BDS.
-    bd.generalized_affine_image(B + C, LESS_THAN_OR_EQUAL, A + 1);
+    bds.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/generalizedaffinepreimage1.cc b/tests/BD_Shape/generalizedaffinepreimage1.cc
index 3fb01e8..6c890e2 100644
--- a/tests/BD_Shape/generalizedaffinepreimage1.cc
+++ b/tests/BD_Shape/generalizedaffinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::generalized_affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,23 +30,22 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(2*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL,
-				 Linear_Expression(-1));
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(2*A == 1);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "GREATER_THAN_OR_EQUAL, -1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
 
   return ok;
 }
@@ -56,21 +55,21 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(2*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, Linear_Expression(-1));
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
 
   return ok;
 }
@@ -80,23 +79,23 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(4*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(4*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -B+1);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(4*A == 1);
   known_result.add_constraint(-B >= 4);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
 
   return ok;
 }
@@ -106,23 +105,23 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(4*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(4*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, B+1);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(4*A == 1);
   known_result.add_constraint(B >= 4);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
 
   return ok;
 }
@@ -132,23 +131,23 @@ test05() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(7*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(7*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, 2*B+1);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(7*A == 1);
   known_result.add_constraint(B >= 2);
 
-  bool ok = check_result(bd, known_result, "2.13e-8", "1.25e-8", "8.52e-9");
+  bool ok = check_result(bds, known_result, "2.13e-8", "1.25e-8", "8.52e-9");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, 2*B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
 
   return ok;
 }
@@ -158,23 +157,23 @@ test06() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(5*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(5*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -2*B+1);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(5*A == 1);
   known_result.add_constraint(-B >= 2);
 
-  bool ok = check_result(bd, known_result, "2.69e-8", "1.72e-8", "1.20e-8");
+  bool ok = check_result(bds, known_result, "2.69e-8", "1.72e-8", "1.20e-8");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -2*B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
 
   return ok;
 }
@@ -184,23 +183,23 @@ test07() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, 3*A-2*B+1);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(3*A == 1);
   known_result.add_constraint(-2*B >= 3);
 
-  bool ok = check_result(bd, known_result, "2.89e-7", "1.85e-7", "1.40e-7");
+  bool ok = check_result(bds, known_result, "2.89e-7", "1.85e-7", "1.40e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, 3*A-2*B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 3*A-2*B+1) ***");
 
   return ok;
 }
@@ -210,23 +209,23 @@ test08() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(B >= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(B >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B+1);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(3*A == 1);
   known_result.add_constraint(-2*B >= 5);
 
-  bool ok = check_result(bd, known_result, "5.27e-7", "3.53e-7", "2.59e-7");
+  bool ok = check_result(bds, known_result, "5.27e-7", "3.53e-7", "2.59e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -3*A-2*B+1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
 
   return ok;
 }
@@ -237,14 +236,14 @@ test09() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B >= 7);
-  bd.add_constraint(3*C <= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
@@ -253,11 +252,11 @@ test09() {
   known_result.add_constraint(3*B - 3*C <= 7);
   known_result.add_constraint(3*C <= 7);
 
-  bool ok = check_result(bd, known_result, "5.48e-6", "2.97e-6", "1.77e-6");
+  bool ok = check_result(bds, known_result, "5.48e-6", "2.97e-6", "1.77e-6");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
 
   return ok;
 }
@@ -267,22 +266,22 @@ test10() {
   // If the Coefficient type is not wide enough, do nothing.
   if (std::numeric_limits<Coefficient>::is_bounded
       && (std::numeric_limits<Coefficient>::min() > -203
-	  || std::numeric_limits<Coefficient>::max() < 629))
+          || std::numeric_limits<Coefficient>::max() < 629))
     return true;
 
   Variable A(0);
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B >= 7);
-  bd.add_constraint(3*C <= 7);
-  bd.add_constraint(5*C >= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
@@ -292,11 +291,11 @@ test10() {
   known_result.add_constraint(3*C <= 7);
   known_result.add_constraint(5*C >= 7);
 
-  bool ok = check_result(bd, known_result, "4.48e-6", "2.36e-6", "1.36e-6");
+  bool ok = check_result(bds, known_result, "4.48e-6", "2.36e-6", "1.36e-6");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
 
   return ok;
 }
@@ -307,24 +306,24 @@ test11() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B >= 7);
-  bd.add_constraint(3*C <= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
   known_result.add_constraint(3*C <= 7);
 
-  bool ok = check_result(bd, known_result, "3.68e-7", "2.41e-7", "1.79e-7");
+  bool ok = check_result(bds, known_result, "3.68e-7", "2.41e-7", "1.79e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
 
   return ok;
 }
@@ -335,15 +334,15 @@ test12() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B >= 7);
-  bd.add_constraint(3*C <= 7);
-  bd.add_constraint(5*C >= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
@@ -353,11 +352,11 @@ test12() {
   known_result.add_constraint(3*C <= 7);
   known_result.add_constraint(5*C >= 7);
 
-  bool ok = check_result(bd, known_result, "5.13e-6", "2.73e-6", "1.67e-6");
+  bool ok = check_result(bds, known_result, "5.13e-6", "2.73e-6", "1.67e-6");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
 
   return ok;
 }
@@ -368,14 +367,14 @@ test13() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B <= 7);
-  bd.add_constraint(3*C <= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B <= 7);
+  bds.add_constraint(3*C <= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
@@ -384,11 +383,11 @@ test13() {
   known_result.add_constraint(3*B - 3*C <= 28);
   known_result.add_constraint(3*C <= 7);
 
-  bool ok = check_result(bd, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+  bool ok = check_result(bds, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "GREATER_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
 
   return ok;
 }
@@ -399,15 +398,15 @@ test14() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B <= 7);
-  bd.add_constraint(3*C <= 7);
-  bd.add_constraint(5*C >= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B <= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
@@ -417,11 +416,11 @@ test14() {
   known_result.add_constraint(3*C <= 7);
   known_result.add_constraint(5*C >= 7);
 
-  bool ok = check_result(bd, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+  bool ok = check_result(bds, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
 
   return ok;
 }
@@ -432,26 +431,26 @@ test15() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(3*A == 1);
-  bd.add_constraint(2*B >= 7);
-  bd.add_constraint(3*C <= 7);
-  bd.add_constraint(5*C >= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(3*A == 1);
   known_result.add_constraint(3*C <= 7);
   known_result.add_constraint(5*C >= 7);
 
-  bool ok = check_result(bd, known_result, "4.26e-7", "2.44e-7", "1.79e-7");
+  bool ok = check_result(bds, known_result, "4.26e-7", "2.44e-7", "1.79e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/generalizedaffinepreimage2.cc b/tests/BD_Shape/generalizedaffinepreimage2.cc
index f55e894..4582ff1 100644
--- a/tests/BD_Shape/generalizedaffinepreimage2.cc
+++ b/tests/BD_Shape/generalizedaffinepreimage2.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::generalized_affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,26 +30,26 @@ test01() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(2*A == 1);
-  bd.add_constraint(B >= 5);
-  bd.add_constraint(3*C <= 7);
-  bd.add_constraint(5*C >= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B >= 5);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, EQUAL, 3*A+2);
+  bds.generalized_affine_preimage(B, EQUAL, 3*A+2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(2*A == 1);
   known_result.add_constraint(3*C <= 7);
   known_result.add_constraint(5*C >= 7);
 
-  bool ok = check_result(bd, known_result, "3.66e-7", "2.28e-7", "1.59e-7");
+  bool ok = check_result(bds, known_result, "3.66e-7", "2.28e-7", "1.59e-7");
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "EQUAL, -1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "EQUAL, -1) ***");
 
   return ok;
 }
@@ -59,23 +59,22 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(2*A == 1);
-  bd.add_constraint(B <= 5);
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B <= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL,
-				 Linear_Expression(-1));
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(2*A == 1);
 
-  bool ok = check_result(bd, known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "GREATER_THAN_OR_EQUAL, -1) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
 
   return ok;
 }
@@ -86,23 +85,498 @@ test03() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(2*A == 1);
-  bd.add_constraint(B <= 5);
-  bd.add_constraint(3*C <= 8);
-  bd.add_constraint(2*C >= 7);
+  TBD_Shape bds(3);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(3*C <= 8);
+  bds.add_constraint(2*C >= 7);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.generalized_affine_preimage(B, EQUAL, 3*A+2);
+  bds.generalized_affine_preimage(B, EQUAL, 3*A+2);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = check_result(bd,  known_result);
+  bool ok = check_result(bds,  known_result);
 
-  print_constraints(bd,
-		    "*** bd.generalized_affine_preimage(B, "
-		    "EQUAL, 3*A+2) ***");
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "EQUAL, 3*A+2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(A, LESS_OR_EQUAL, B, 5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B, 5) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 3);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(B + 3);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(B + C + 2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "GREATER_OR_EQUAL, B + C + 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(C + 2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "GREATER_OR_EQUAL, C + 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(0);
+  Linear_Expression e2(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(0, "
+                    "GREATER_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(B + C);
+  Linear_Expression e2(3);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B + C, "
+                    "GREATER_OR_EQUAL, 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(B + C);
+  Linear_Expression e2(B + C);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(B - C <= 3);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B + C, "
+                    "GREATER_OR_EQUAL, B + C) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(A);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A >= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B - A, "
+                    "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(2*A);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A >= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B - A, "
+                    "EQUAL, 2*A) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(B - C);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(C >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= -2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "LESS_OR_EQUAL, B - C) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + B);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 5);
+  known_result.add_constraint(A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, A + B) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 2*B + C);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A - B <= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(C, "
+                    "EQUAL, A + 2*B + C) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(10);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(A - B >= 11);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "LESS_OR_EQUAL, 10) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression e1(2*A - 2*C);
+  Linear_Expression e2(6);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(D - A <= 1);
+  bds.add_constraint(C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(D - B <= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(2*A - 2*C, "
+                    "LESS_OR_EQUAL, 6) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression e1(4*A - 2*B + 3*C);
+  Linear_Expression e2(1 + C);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(D - A <= 1);
+  bds.add_constraint(C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(4*A - 2*B + 3*C, "
+                    "EQUAL, 1 + C) ***");
 
   return ok;
 }
@@ -115,4 +589,21 @@ BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
   DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
 END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage3.cc b/tests/BD_Shape/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..655382d
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage3.cc
@@ -0,0 +1,173 @@
+/* Test BD_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression e1(3*B + C);
+  Linear_Expression e2(2*A);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 13);
+  bds.add_constraint(C <= 5);
+  bds.add_constraint(D <= 2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 9);
+  bds.add_constraint(C >= 3);
+  bds.add_constraint(D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(D <= 2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(D >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(3*B + C, "
+                    "EQUAL, 2*A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the BDS.
+
+    bds.generalized_affine_preimage(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the BDS.
+    bds.generalized_affine_preimage(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a strict relation symbol.
+    bds.generalized_affine_preimage(A + B, GREATER_THAN, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a strict relation symbol.
+    bds.generalized_affine_preimage(B + C, LESS_THAN, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/geomcovers1.cc b/tests/BD_Shape/geomcovers1.cc
index 15a1696..0463318 100644
--- a/tests/BD_Shape/geomcovers1.cc
+++ b/tests/BD_Shape/geomcovers1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<BD_Shape>::geometrically_covers().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<BD_Shape>::geometrically_covers().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,14 +35,16 @@ test01() {
   cs2.insert(x <= 6);
   cs3.insert(x >= 1);
   cs3.insert(x <= 5);
-  TBD_Shape bd1(cs1), bd2(cs2), bd3(cs3);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+  TBD_Shape bds3(cs3);
 
-  Polyhedra_Powerset<TBD_Shape> ps12(1, EMPTY);
-  ps12.add_disjunct(bd1);
-  ps12.add_disjunct(bd2);
+  Pointset_Powerset<TBD_Shape> ps12(1, EMPTY);
+  ps12.add_disjunct(bds1);
+  ps12.add_disjunct(bds2);
 
-  Polyhedra_Powerset<TBD_Shape> ps3(1, EMPTY);
-  ps3.add_disjunct(bd3);
+  Pointset_Powerset<TBD_Shape> ps3(1, EMPTY);
+  ps3.add_disjunct(bds3);
 
   using namespace IO_Operators;
   nout << "ps12 = " << ps12 << endl
diff --git a/tests/BD_Shape/h79widening1.cc b/tests/BD_Shape/h79widening1.cc
index 3b36700..678b6ce 100644
--- a/tests/BD_Shape/h79widening1.cc
+++ b/tests/BD_Shape/h79widening1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::H79_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,28 +29,28 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x <= 1);
-  bd1.add_constraint(x - y <= 2);
-  bd1.add_constraint(y - x <= 7);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(x - y <= 2);
+  bds1.add_constraint(y - x <= 7);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y <= 2);
-  bd2.add_constraint(-x <= 3);
-  bd2.add_constraint(x <= 0);
-  bd2.add_constraint(y - x <= 2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(x <= 0);
+  bds2.add_constraint(y - x <= 2);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.H79_widening_assign(bd2);
+  bds1.H79_widening_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x - y <= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/intersection1.cc b/tests/BD_Shape/intersection1.cc
index 83b5ea7..632bc1d 100644
--- a/tests/BD_Shape/intersection1.cc
+++ b/tests/BD_Shape/intersection1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::intersection_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,27 +29,27 @@ test01() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 3);
-  bd1.add_constraint(x - y <= 4);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(-y <= -2);
-  bd2.add_constraint(x - y <= 5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(-y <= -2);
+  bds2.add_constraint(x - y <= 5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.intersection_assign(bd2);
+  bds1.intersection_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 3);
   known_result.add_constraint(-y <= -2);
   known_result.add_constraint(x - y <= 4);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -60,20 +60,20 @@ test02() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(4);
-  bd1.add_constraint(x - y <= 4);
-  bd1.add_constraint(x <= 3);
+  TBD_Shape bds1(4);
+  bds1.add_constraint(x - y <= 4);
+  bds1.add_constraint(x <= 3);
 
-  TBD_Shape bd2(4);
-  bd2.add_constraint(x - y <= 5);
-  bd2.add_constraint(-y <= -2);
-  bd2.add_constraint(z - x <= 0);
-  bd2.add_constraint(y - z <= -1);
+  TBD_Shape bds2(4);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(-y <= -2);
+  bds2.add_constraint(z - x <= 0);
+  bds2.add_constraint(y - z <= -1);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.intersection_assign(bd2);
+  bds1.intersection_assign(bds2);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(x - y <= 4);
@@ -82,9 +82,9 @@ test02() {
   known_result.add_constraint(z - x <= 0);
   known_result.add_constraint(y - z <= -1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -95,22 +95,22 @@ test03() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 4);
-  bd1.add_constraint(-x <= -1);
-  bd1.add_constraint(y <= 3);
-  bd1.add_constraint(-y <= -1);
-  bd1.add_constraint(x - y <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(-x <= -1);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(-y <= -1);
+  bds1.add_constraint(x - y <= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(-y <= 5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(-y <= 5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.intersection_assign(bd2);
+  bds1.intersection_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x <= 3);
@@ -120,9 +120,9 @@ test03() {
   known_result.add_constraint(y - x <= -1);
   known_result.add_constraint(x - y <= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -133,28 +133,28 @@ test04() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 4);
-  bd1.add_constraint(x >= 5);
-  bd1.add_constraint(y <= 3);
-  bd1.add_constraint(y >= 1);
-  bd1.add_constraint(x - y <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(x >= 5);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(x - y <= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y >= -5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.intersection_assign(bd2);
+  bds1.intersection_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -165,47 +165,47 @@ test05() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(x <= 4);
-  bd1.add_constraint(x >= 5);
-  bd1.add_constraint(y <= 3);
-  bd1.add_constraint(y >= 1);
-  bd1.add_constraint(x - y <= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(x >= 5);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(x - y <= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y >= -5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd2.intersection_assign(bd1);
+  bds2.intersection_assign(bds1);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+  bool ok = check_result(bds2, known_result);
 
-  print_constraints(bd2, "*** bd2.intersection_assign(bd1) ***");
+  print_constraints(bds2, "*** bds2.intersection_assign(bds1) ***");
 
   return ok;
 }
 
 bool
 test06() {
-  TBD_Shape bd1;
-  TBD_Shape bd2;
+  TBD_Shape bds1;
+  TBD_Shape bds2;
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  bd1.intersection_assign(bd2);
+  bds1.intersection_assign(bds2);
 
   BD_Shape<mpq_class> known_result;
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -216,23 +216,23 @@ test07() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd1(3);
+  TBD_Shape bds1(3);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y >= -5);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd2);
+  BD_Shape<mpq_class> known_result(bds2);
 
-  bd1.intersection_assign(bd2);
+  bds1.intersection_assign(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -243,22 +243,22 @@ test08() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd1(3);
-  TBD_Shape bd2(3);
-  bd2.add_constraint(y - x <= -1);
-  bd2.add_constraint(x <= 3);
-  bd2.add_constraint(y >= -5);
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd2);
+  BD_Shape<mpq_class> known_result(bds2);
 
-  bd1.intersection_assign_and_minimize(bd2);
+  bds1.intersection_assign_and_minimize(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
 
   return ok;
 }
@@ -268,44 +268,82 @@ test09() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x >= y);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= y);
 
-  TBD_Shape bd2(3);
+  TBD_Shape bds2(3);
 
   try {
-    // This is an invalid use of function
-    // BD_Shape::intersection_assign_and_minimize(bd2): it is illegal
-    // to apply this function to two polyhedra of different dimensions.
-    bd1.intersection_assign_and_minimize(bd2);
+    // This is an invalid use of method
+    // BD_Shape::intersection_assign_and_minimize(bds2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    bds1.intersection_assign_and_minimize(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
 test10() {
-  TBD_Shape bd1(7);
-  TBD_Shape bd2(15);
+  TBD_Shape bds1(7);
+  TBD_Shape bds2(15);
 
   try {
-    // This is an invalid use of function
-    // BD_Shape::intersection_assign(bd2): it is illegal
-    // to apply this function to two polyhedra of different dimensions.
-    bd1.intersection_assign(bd2);
+    // This is an invalid use of method
+    // BD_Shape::intersection_assign(bds2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    bds1.intersection_assign(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test11() {
+  TBD_Shape bds1(3, EMPTY);
+  TBD_Shape bds2(3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(3, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -321,4 +359,6 @@ BEGIN_MAIN
   DO_TEST(test08);
   DO_TEST(test09);
   DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
 END_MAIN
diff --git a/tests/BD_Shape/limitedbhmz05extrapolation1.cc b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
index ba1e521..b206c49 100644
--- a/tests/BD_Shape/limitedbhmz05extrapolation1.cc
+++ b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::limited_BHMZ05_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,26 +37,26 @@ test01() {
   cs2.insert(x <= 0);
   cs2.insert(y >= 5);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 20);
   cs.insert(y >= 3);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(y >= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ****");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -78,8 +78,8 @@ test02() {
   cs2.insert(y >= 0);
   cs2.insert(x - y >= 0);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 0);
@@ -87,11 +87,11 @@ test02() {
   cs.insert(x <= 5);
   cs.insert(y <= 5);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(y >= 0);
@@ -99,10 +99,10 @@ test02() {
   known_result.add_constraint(y - x <= 0);
   known_result.add_constraint(x >= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -124,8 +124,8 @@ test03() {
   cs2.insert(y >= 0);
   cs2.insert(x - y >= 0);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 0);
@@ -133,18 +133,18 @@ test03() {
   cs.insert(x <= 5);
   cs.insert(y <= 5);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
-  BD_Shape<mpq_class> known_result(bd2);
+  BD_Shape<mpq_class> known_result(bds2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -174,42 +174,42 @@ test04() {
   cs.insert(x <= 5);
   cs.insert(y <= 5);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
-  BD_Shape<mpq_class> known_result(bd1);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
 
 bool
 test05() {
-  TBD_Shape bd1;
-  TBD_Shape bd2;
+  TBD_Shape bds1;
+  TBD_Shape bds2;
   Constraint_System cs;
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result;
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -234,8 +234,8 @@ test06() {
   cs2.insert(x - y >= 0);
   cs2.insert(z <= 0);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 0);
@@ -244,11 +244,11 @@ test06() {
   cs.insert(y <= 5);
   cs.insert(x - y + z <= 5);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y >= 0);
@@ -257,10 +257,10 @@ test06() {
   known_result.add_constraint(x >= 0);
   known_result.add_constraint(z <= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -283,8 +283,8 @@ test07() {
   cs2.insert(x - y >= 0);
   cs2.insert(z <= -1);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x == 0);
@@ -292,21 +292,21 @@ test07() {
   cs.insert(y <= 5);
   cs.insert(x - y + z <= 5);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y >= 0);
   known_result.add_constraint(y - x <= 0);
   known_result.add_constraint(x == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -331,8 +331,8 @@ test08() {
   cs2.insert(x - y >= 0);
   cs2.insert(z <= 0);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 0);
@@ -341,11 +341,11 @@ test08() {
   cs.insert(y <= 5);
   cs.insert(2*x - 3*y <= 5);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y >= 0);
@@ -354,10 +354,10 @@ test08() {
   known_result.add_constraint(x >= 0);
   known_result.add_constraint(z <= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -382,8 +382,8 @@ test09() {
   cs2.insert(x - y >= 0);
   cs2.insert(z <= 0);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 0);
@@ -392,11 +392,11 @@ test09() {
   cs.insert(y <= 5);
   cs.insert(x - y >= 0);
 
-  print_constraints(bd1, "*** bd1 ****");
-  print_constraints(bd2, "*** bd2 ****");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(y >= 0);
@@ -405,10 +405,10 @@ test09() {
   known_result.add_constraint(x >= 0);
   known_result.add_constraint(z <= 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -419,59 +419,59 @@ test10() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x - y >= 0);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(x <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y >= 0);
-  bd2.add_constraint(x >= 0);
-  bd2.add_constraint(x <= 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
 
   Constraint_System cs;
   cs.insert(z <= 5);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::limited_BHMZ05_extrapolation_assign(bd, cs): it is
-    // illegal to apply this function to a system of constraints that
+    // This is an invalid use of the method
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
     // is not dimension-compatible with the two polyhedra.
-    bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+    bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
 test11() {
   Variable y(1);
 
-  TBD_Shape bd1(1);
-  TBD_Shape bd2(2);
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
 
   Constraint_System cs;
   cs.insert(y <= 9);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::limited_BHMZ05_extrapolation_assign(bd2, cs): it is
-    // illegal to apply this function to two polyhedra that are not
+    // This is an invalid use of the method
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bds2, cs): it is
+    // illegal to apply the method to two polyhedra that are not
     // dimension-compatible.
-    bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+    bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -479,33 +479,33 @@ test12() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x - y >= 0);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(x <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y >= 0);
-  bd2.add_constraint(x >= 0);
-  bd2.add_constraint(x <= 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
 
   Constraint_System cs;
   cs.insert(x < 5);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::limited_BHMZ05_extrapolation_assign(bd, cs): it is
-    // illegal to apply this function to a system of constraints that
+    // This is an invalid use of the method
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
     // has a strict-inequality.
-    bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+    bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/limitedcc76extrapolation1.cc b/tests/BD_Shape/limitedcc76extrapolation1.cc
index a8bcc01..b0f26e3 100644
--- a/tests/BD_Shape/limitedcc76extrapolation1.cc
+++ b/tests/BD_Shape/limitedcc76extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::limited_CC76_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,21 +26,21 @@ namespace {
 
 bool
 test01() {
-  TBD_Shape bd1(0);
-  TBD_Shape bd2(0);
+  TBD_Shape bds1(0);
+  TBD_Shape bds2(0);
   Constraint_System cs;
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -50,29 +50,29 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A == -2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A == -2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A == -2);
-  bd2.add_constraint(B == 3);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == -2);
+  bds2.add_constraint(B == 3);
 
   Constraint_System cs;
   cs.insert(A <= 0);
   cs.insert(A - B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -82,28 +82,28 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 4);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A == -2);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == -2);
 
   Constraint_System cs;
   cs.insert(A <= 0);
   cs.insert(A - B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -114,32 +114,32 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd1(3);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(B >= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
 
-  TBD_Shape bd2(3);
-  bd2.add_constraint(A <= -2);
-  bd2.add_constraint(B >= 4);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(B >= 4);
 
   Constraint_System cs;
   cs.insert(A <= 5);
   cs.insert(A - B + C <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A <= 5);
   known_result.add_constraint(B >= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -149,31 +149,31 @@ test05() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(B >= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A <= -2);
-  bd2.add_constraint(B >= 4);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(B >= 4);
 
   Constraint_System cs;
   cs.insert(A >= 0);
   cs.insert(A + B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(B >= 1);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -183,31 +183,32 @@ test06() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(B >= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A <= -2);
-  bd2.add_constraint(B >= 4);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(B >= 4);
 
   Constraint_System cs;
   cs.insert(A >= 0);
   cs.insert(A - B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(B >= 1);
+  known_result.add_constraint(A - B <= 6);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -217,32 +218,32 @@ test07() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(A >= 5);
-  bd1.add_constraint(B >= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(A >= 5);
+  bds1.add_constraint(B >= 1);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A <= -2);
-  bd2.add_constraint(A >= 3);
-  bd2.add_constraint(B >= 4);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(A >= 3);
+  bds2.add_constraint(B >= 4);
 
   Constraint_System cs;
   cs.insert(A >= 0);
   cs.insert(A - B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -252,31 +253,31 @@ test08() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(B >= 1);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(A <= -2);
-  bd2.add_constraint(A >= 3);
-  bd2.add_constraint(B >= 4);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(A >= 3);
+  bds2.add_constraint(B >= 4);
 
   Constraint_System cs;
   cs.insert(A >= 0);
   cs.insert(A - B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -288,35 +289,35 @@ test09() {
   Variable C(2);
   Variable D(3);
 
-  TBD_Shape bd1(4);
-  bd1.add_constraint(A <= 4);
-  bd1.add_constraint(B <= 6);
-  bd1.add_constraint(C - D == 5);
+  TBD_Shape bds1(4);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B <= 6);
+  bds1.add_constraint(C - D == 5);
 
-  TBD_Shape bd2(4);
-  bd2.add_constraint(A <= 4);
-  bd2.add_constraint(C - D == 5);
-  bd2.add_constraint(B <= 5);
+  TBD_Shape bds2(4);
+  bds2.add_constraint(A <= 4);
+  bds2.add_constraint(C - D == 5);
+  bds2.add_constraint(B <= 5);
 
   Constraint_System cs;
   cs.insert(A == 4);
   cs.insert(C - D == 5);
   cs.insert(A - B <= 6);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(A <= 4);
   known_result.add_constraint(C - D == 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
 
   return ok;
 }
@@ -334,28 +335,28 @@ test10() {
   cs2.insert(x == 0);
   cs2.insert(y >= 5);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
 
   Constraint_System cs;
   cs.insert(x >= 20);
   cs.insert(y >= 3);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
-  print_constraints(cs, "*** cs ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 1);
   known_result.add_constraint(y >= 3);
   known_result.add_constraint(y - x >= 2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -365,25 +366,25 @@ test11() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(3, EMPTY);
-  TBD_Shape bd2(3, EMPTY);
+  TBD_Shape bds1(3, EMPTY);
+  TBD_Shape bds2(3, EMPTY);
 
   Constraint_System cs;
   cs.insert(x <= 1);
   cs.insert(y >= 4);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs, "*** cs ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
 
   return ok;
 }
@@ -398,25 +399,25 @@ test12() {
   cs1.insert(y >= 4);
   cs1.insert(x - y >= 2);
 
-  TBD_Shape bd1(cs1);
-  TBD_Shape bd2(2, EMPTY);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(2, EMPTY);
 
   Constraint_System cs2;
   cs2.insert(x <= 0);
   cs2.insert(y >= 3);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
   print_constraints(cs2, "*** cs2 ***");
 
-  BD_Shape<mpq_class> known_result(bd1);
+  BD_Shape<mpq_class> known_result(bds1);
 
-  bd1.limited_CC76_extrapolation_assign(bd2, cs2);
+  bds1.limited_CC76_extrapolation_assign(bds2, cs2);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs2) ***");
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs2) ***");
 
   return ok;
 }
@@ -425,26 +426,26 @@ bool
 test13() {
   Variable y(1);
 
-  TBD_Shape bd1(1);
-  TBD_Shape bd2(2);
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
 
   Constraint_System cs;
   cs.insert(y <= 9);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::limited_CC76_extrapolation_assign(bd2, cs): it is
-    // illegal to apply this function to two polyhedra that are not
+    // This is an invalid use of the method
+    // BD_Shape::limited_CC76_extrapolation_assign(bds2, cs): it is
+    // illegal to apply the method to two polyhedra that are not
     // dimension-compatible.
-    bd2.limited_CC76_extrapolation_assign(bd1, cs);
+    bds2.limited_CC76_extrapolation_assign(bds1, cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -453,33 +454,33 @@ test14() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x - y >= 0);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(x <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y >= 0);
-  bd2.add_constraint(x >= 0);
-  bd2.add_constraint(x <= 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
 
   Constraint_System cs;
   cs.insert(z <= 5);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
-    // illegal to apply this function to a system of constraints that
+    // This is an invalid use of the method
+    // BD_Shape::limited_CC76_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
     // is not dimension-compatible with the two polyhedra.
-    bd2.limited_CC76_extrapolation_assign(bd1, cs);
+    bds2.limited_CC76_extrapolation_assign(bds1, cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -487,33 +488,33 @@ test15() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd1(2);
-  bd1.add_constraint(x - y >= 0);
-  bd1.add_constraint(x >= 0);
-  bd1.add_constraint(x <= 2);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
 
-  TBD_Shape bd2(2);
-  bd2.add_constraint(x - y >= 0);
-  bd2.add_constraint(x >= 0);
-  bd2.add_constraint(x <= 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
 
   Constraint_System cs;
   cs.insert(x < 5);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
-    // illegal to apply this function to a system of constraints that
+    // This is an invalid use of the method
+    // BD_Shape::limited_CC76_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
     // in which there is a strict inequality.
-    bd2.limited_CC76_extrapolation_assign(bd1, cs);
+    bds2.limited_CC76_extrapolation_assign(bds1, cs);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/limitedh79extrapolation1.cc b/tests/BD_Shape/limitedh79extrapolation1.cc
index 3128732..07566dd 100644
--- a/tests/BD_Shape/limitedh79extrapolation1.cc
+++ b/tests/BD_Shape/limitedh79extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::limited_H79_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -33,17 +33,17 @@ test01() {
   cs1.insert(x <= 1);
   cs1.insert(y >= 4);
 
-  TBD_Shape bd1(cs1);
+  TBD_Shape bds1(cs1);
 
-  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bds1, "*** bds1 ***");
 
   Constraint_System cs2;
   cs2.insert(x == 0);
   cs2.insert(y >= 5);
 
-  TBD_Shape bd2(cs2);
+  TBD_Shape bds2(cs2);
 
-  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(bds2, "*** bds2 ***");
 
   Constraint_System cs;
   cs.insert(x >= 20);
@@ -51,14 +51,14 @@ test01() {
 
   print_constraints(cs, "*** cs ***");
 
-  bd1.limited_H79_extrapolation_assign(bd2, cs);
+  bds1.limited_H79_extrapolation_assign(bds2, cs);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(y >= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(bd1, "*** bd1.limited_H79_extrapolation_assign(bd2) ****");
+  print_constraints(bds1, "*** bds1.limited_H79_extrapolation_assign(bds2) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/mapspacedims1.cc b/tests/BD_Shape/mapspacedims1.cc
index 5c14a34..04e67b2 100644
--- a/tests/BD_Shape/mapspacedims1.cc
+++ b/tests/BD_Shape/mapspacedims1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::map_space_dimensions().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,18 +28,18 @@ bool
 test01() {
   Partial_Function function;
 
-  TBD_Shape bd1(3);
+  TBD_Shape bds(3);
 
   print_function(function, "*** function ***");
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result;
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -48,18 +48,18 @@ bool
 test02() {
   Partial_Function function;
 
-  TBD_Shape bd1(3, EMPTY);
+  TBD_Shape bds(3, EMPTY);
 
   print_function(function, "*** function ***");
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(0, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -70,18 +70,18 @@ test03() {
   function.insert(0, 1);
   function.insert(1, 0);
 
-  TBD_Shape bd1(3, EMPTY);
+  TBD_Shape bds(3, EMPTY);
 
   print_function(function, "*** function ***");
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(2, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -100,20 +100,21 @@ test04() {
   cs.insert(x == 1);
   cs.insert(z - x <= 3);
 
-  TBD_Shape bd1(cs);
+  TBD_Shape bds(cs);
 
   print_function(function, "*** function ***");
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.map_space_dimensions(function);
+  cs = bds.minimized_constraints();
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x == 1);
   known_result.add_constraint(y - x <= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -133,19 +134,19 @@ test05() {
   cs.insert(z - y <= 7);
   cs.insert(y - x <= 2);
 
-  TBD_Shape bd1(cs);
+  TBD_Shape bds(cs);
 
   print_function(function, "*** function ***");
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(1);
   known_result.add_constraint(x <= 4);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -166,21 +167,21 @@ test06() {
   cs.insert(z - y <= 7);
   cs.insert(y - x <= 1);
 
-  TBD_Shape bd1(cs);
+  TBD_Shape bds(cs);
 
   print_function(function, "*** function ***");
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd1.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= 2);
   known_result.add_constraint(y <= 2);
   known_result.add_constraint(y - x <= 7);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -194,24 +195,24 @@ test07() {
   function.insert(0, 1);
   function.insert(1, 0);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x <= 1);
-  bd.add_constraint(y <= -1);
-  bd.add_constraint(y - x <= 3);
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= -1);
+  bds.add_constraint(y - x <= 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   print_function(function, "*** function ***");
 
-  bd.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x <= -1);
   known_result.add_constraint(y <= 1);
   known_result.add_constraint(x - y <= 3);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.map_space_dimension(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimension(function) ***");
 
   return ok;
 }
@@ -229,7 +230,7 @@ test08() {
   cs.insert(C >= 0);
   cs.insert(D == 0);
   cs.insert(B - A == 0);
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
   Partial_Function function;
   function.insert(0, 2);
@@ -237,9 +238,9 @@ test08() {
   function.insert(3, 0);
 
   print_function(function, "*** function ***");
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(A == 0);
@@ -247,9 +248,9 @@ test08() {
   known_result.add_constraint(C >= 0);
   known_result.add_constraint(B - C == 0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.map_space_dimensions(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -260,18 +261,18 @@ test09() {
   function.insert(0, 1);
   function.insert(1, 0);
 
-  TBD_Shape bd(0);
+  TBD_Shape bds(0);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   print_function(function, "*** function ***");
 
-  bd.map_space_dimensions(function);
+  bds.map_space_dimensions(function);
 
   BD_Shape<mpq_class> known_result(0);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.map_space_dimension(function) ***");
+  print_constraints(bds, "*** bds.map_space_dimension(function) ***");
 
   return ok;
 }
diff --git a/tests/BD_Shape/max_min1.cc b/tests/BD_Shape/max_min1.cc
new file mode 100644
index 0000000..91a2df2
--- /dev/null
+++ b/tests/BD_Shape/max_min1.cc
@@ -0,0 +1,780 @@
+/* Test BD_Shape::maximize(const Linear_Expression&, ...)
+   and BD_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !bds.maximize(x1-2*x2, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(x1-2*x2, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !bds.maximize(-10*x1-6*x2+4, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(-10*x1-6*x2+4, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  TBD_Shape bds(0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B);
+  bool ok = !bds.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 2 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A - B);
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C);
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+  bds.add_constraint(E - D <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = !bds.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(B - C <= -1);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = !bds.maximize(LE, num, den, included, g)
+    && ! bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(Linear_Expression(3));
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(z);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::minimize(LE, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.minimize(LE, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(z);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::maximize(LE, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.maximize(LE, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A-2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A-2, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A+2, num, den, included)
+    && num == 7 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A+2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A+2, num, den, included)
+    && num == 2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A+2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A-2, num, den, included)
+    && num == -2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A-2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A - B - 2, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A - B - 2, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A - B + 2, num, den, included)
+    && num == 8 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A - B + 2, num, den, included)
+    && num == 0 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A + B + 2, num, den, included)
+    && num == 57 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A + B + 2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A + B - 2, num, den, included)
+    && num == 53 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A + B - 2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);;
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/max_min2.cc b/tests/BD_Shape/max_min2.cc
new file mode 100644
index 0000000..a90a6d1
--- /dev/null
+++ b/tests/BD_Shape/max_min2.cc
@@ -0,0 +1,439 @@
+/* Test BD_Shape::maximize(const Linear_Expression&, ...)
+   and BD_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(Linear_Expression(3));
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+  bool ok = !bds.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  BD_Shape<mpq_class> bds(1);
+  bds.add_constraint(5*A <= 2);
+  bds.add_constraint(5*A >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Linear_Expression LE(3*A);
+
+  bool ok = bds.maximize(LE, num, den, included)
+    && num == 6 && den == 5 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included)
+    && num == 3 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  BD_Shape<mpq_class> bds(1);
+  bds.add_constraint(5*A <= 2);
+  bds.add_constraint(3*A >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Linear_Expression LE(-7*A);
+
+  bool ok = bds.maximize(LE, num, den, included)
+    && num == -7 && den == 3 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included)
+    && num == -14 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A >= 1);
+  bds.add_constraint(B >= 1);
+  bds.add_constraint(2*A <= 3);
+  bds.add_constraint(B <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + 4*B - 1);
+
+  Checked_Number<mpq_class, Extended_Number_Policy> divisor;
+  assign_r(divisor, 2, ROUND_NOT_NEEDED);
+  Checked_Number<mpq_class, Extended_Number_Policy> known_max_value;
+  assign_r(known_max_value, 33, ROUND_NOT_NEEDED);
+  div_assign_r(known_max_value, known_max_value, divisor, ROUND_NOT_NEEDED);
+  Generator known_max_location = point(3*A + 8*B, 2);
+
+  bool ok_max = bds.maximize(LE, num, den, included, g);
+  Checked_Number<mpq_class, Extended_Number_Policy> max_value;
+  assign_r(max_value, num, ROUND_NOT_NEEDED);
+  assign_r(divisor, den, ROUND_NOT_NEEDED);
+  div_assign_r(max_value, max_value, divisor, ROUND_NOT_NEEDED);
+  ok_max &= included && g.is_point()
+    && check_result(max_value, known_max_value, "0.5")
+    && check_result(g, known_max_location, "0.5", "0.5", "0.5");
+
+  nout << (included ? "maximum" : "supremum") << " = " << max_value;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  Checked_Number<mpq_class, Extended_Number_Policy> known_min_value;
+  assign_r(known_min_value, 7, ROUND_NOT_NEEDED);
+  assign_r(divisor, 2, ROUND_NOT_NEEDED);
+  div_assign_r(known_min_value, known_min_value, divisor, ROUND_NOT_NEEDED);
+  Generator known_min_location = point(A + 2*B, 2);
+
+  bool ok_min = bds.minimize(LE, num, den, included, g);
+  Checked_Number<mpq_class, Extended_Number_Policy> min_value;
+  assign_r(min_value, num, ROUND_NOT_NEEDED);
+  assign_r(divisor, den, ROUND_NOT_NEEDED);
+  div_assign_r(min_value, min_value, divisor, ROUND_NOT_NEEDED);
+  ok_min &= included && g.is_point()
+    && check_result(min_value, known_min_value, "0.5")
+    && check_result(g, known_min_location, "0.5", "0.5", "0.5");
+
+  nout << (included ? "minimum" : "infinum") << " = " << min_value;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok_max && ok_min;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/maxspacedim.cc b/tests/BD_Shape/maxspacedim.cc
deleted file mode 100644
index 010b314..0000000
--- a/tests/BD_Shape/maxspacedim.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Test BD_Shape::max_space_dimension().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-namespace {
-
-bool
-test01() {
-  BD_Shape<mpq_class> bd1(1);
-  BD_Shape<long> bd2(1);
-  BD_Shape<int> bd3(1);
-  BD_Shape<signed char> bd4(1);
-
-  dimension_type max_spacedim1 = bd1.max_space_dimension();
-  dimension_type max_spacedim2 = bd2.max_space_dimension();
-  dimension_type max_spacedim3 = bd3.max_space_dimension();
-  dimension_type max_spacedim4 = bd4.max_space_dimension();
-
-  nout << endl
-       << "The maximum space-dimension of a system of bounded differences "
-       << endl
-       << "of Rational is: "
-       << endl
-       << max_spacedim1
-       << endl;
-
-  nout << endl
-       << "The maximum space-dimension of a system of bounded differences "
-       << endl
-       << "of long: "
-       << endl
-       << max_spacedim2
-       << endl;
-
-  nout << endl
-       << "The maximum space-dimension of a system of bounded differences "
-       << endl
-       << "of int: "
-       << endl
-       << max_spacedim3
-       << endl;
-
-  nout << endl
-       << "The maximum space-dimension of a system of bounded differences "
-       << endl
-       << "of signed char"
-       << endl
-       << max_spacedim4
-       << endl;
-
-  if (max_spacedim1 < max_spacedim2) {
-
-    print_constraints(bd1, "*** bd1 ***");
-    print_constraints(bd2, "*** bd2 ***");
-
-  }
-
-  if (max_spacedim3 < max_spacedim4) {
-
-    print_constraints(bd3, "*** bd3 ***");
-    print_constraints(bd4, "*** bd4 ***");
-
-  }
-  // FIXME!!!
-  return true;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-END_MAIN
diff --git a/tests/BD_Shape/maxspacedim1.cc b/tests/BD_Shape/maxspacedim1.cc
new file mode 100644
index 0000000..862383f
--- /dev/null
+++ b/tests/BD_Shape/maxspacedim1.cc
@@ -0,0 +1,85 @@
+/* Test BD_Shape::max_space_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  nout << BD_Shape<signed char>::max_space_dimension() << " (signed char)"
+       << endl
+       << BD_Shape<short>::max_space_dimension() << " (short)"
+       << endl
+       << BD_Shape<int>::max_space_dimension() << " (int)"
+       << endl
+       << BD_Shape<long>::max_space_dimension() << " (long)"
+       << endl
+       << BD_Shape<long long>::max_space_dimension() << " (long long)"
+       << endl
+       << BD_Shape<float>::max_space_dimension() << " (float)"
+       << endl
+       << BD_Shape<double>::max_space_dimension() << " (double)"
+       << endl
+       << BD_Shape<long double>::max_space_dimension() << " (long double)"
+       << endl
+       << BD_Shape<mpz_class>::max_space_dimension() << " (mpz_class)"
+       << endl
+       << BD_Shape<mpq_class>::max_space_dimension() << " (mpq_class)"
+       << endl;
+
+  if (BD_Shape<signed char>::max_space_dimension()
+      < BD_Shape<short>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<short>::max_space_dimension()
+      < BD_Shape<int>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<int>::max_space_dimension()
+      < BD_Shape<long>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<long>::max_space_dimension()
+      < BD_Shape<long long>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<float>::max_space_dimension()
+      < BD_Shape<double>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<double>::max_space_dimension()
+      < BD_Shape<long double>::max_space_dimension())
+    return false;
+
+  if (2*BD_Shape<mpz_class>::max_space_dimension()
+      < BD_Shape<mpq_class>::max_space_dimension())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/membytes1.cc b/tests/BD_Shape/membytes1.cc
new file mode 100644
index 0000000..067116a
--- /dev/null
+++ b/tests/BD_Shape/membytes1.cc
@@ -0,0 +1,246 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(TBD_Shape& bds, const Constraint& c) {
+  const memory_size_type bd_memory_before = bds.total_memory_in_bytes();
+  const memory_size_type c_memory = c.total_memory_in_bytes();
+  bds.add_constraint(c);
+  const memory_size_type bd_memory_after = bds.total_memory_in_bytes();
+
+  nout << bd_memory_before
+       << " + " << c_memory
+       << " -> " << bd_memory_after
+       << endl;
+}
+
+void
+minimize(TBD_Shape& bds) {
+  const memory_size_type bd_memory_before = bds.total_memory_in_bytes();
+  (void) bds.minimized_constraints();
+  const memory_size_type bd_memory_after = bds.total_memory_in_bytes();
+
+  nout << bd_memory_before
+       << " -m-> " << bd_memory_after
+       << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  using namespace test01_namespace;
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le -= 4*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 4;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding constraints to a bounded difference shape ***" << endl;
+
+  TBD_Shape bds(3);
+  add_constraint(bds, 2*x - 2*y >= 0);
+  add_constraint(bds, 4*x - 2*y - z + 2 >= 0);
+  add_constraint(bds, x - y - 1 <= 0);
+  add_constraint(bds, x >= 0);
+  minimize(bds);
+  add_constraint(bds, x + 1 >= 0);
+  add_constraint(bds, x - z - 1 >= 0);
+  add_constraint(bds, 2*x - 2*z + 7 >= 0);
+  add_constraint(bds, y - 2*z + 1 >= 0);
+  minimize(bds);
+  add_constraint(bds, x - y + 5 >= 0);
+  add_constraint(bds, 2*x - 2*z + 13 >= 0);
+  add_constraint(bds, -2*x + 2*z + 1 >= 0);
+  add_constraint(bds, -x + y - 1 >= 0);
+  minimize(bds);
+  add_constraint(bds, -x + y + 7 >= 0);
+  add_constraint(bds, -4*x + 4*y - 4 >= 0);
+  add_constraint(bds, -2*x + 2*z - 5 >= 0);
+  add_constraint(bds, -x + 1 >= 0);
+  minimize(bds);
+  add_constraint(bds, -x - z + 5 >= 0);
+  add_constraint(bds, -4*x - 2*y + z + 8 >= 0);
+  add_constraint(bds, -x + y + 5 >= 0);
+  add_constraint(bds, -x - y -2*z +13 >= 0);
+  minimize(bds);
+
+  const memory_size_type bd_total_size = bds.total_memory_in_bytes();
+  const memory_size_type bd_external_size = bds.external_memory_in_bytes();
+  const Constraint_System& cs = bds.constraints();
+  const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+  const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+
+  nout << endl;
+
+  nout << "*** Size of the user-visible polyhedra components ***"
+       << endl
+       << "bds.total_memory_in_bytes() = " << bd_total_size
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl
+       << "bds.external_memory_in_bytes() = " << bd_external_size
+       << endl
+       << "cs.external_memory_in_bytes() = " << cs_external_size
+       << endl << endl;
+
+  nout << "*** Size of a constraint system vs size of contained constraints"
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl;
+
+  memory_size_type cs_elements_size = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained constraints = " << cs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(4*x - 4*y + 14 >= 0);
+  bds.add_constraint(x - z + 2 >= 0);
+  bds.add_constraint(x + y - 1 >= 0);
+  bds.add_constraint(y - z - 5 >= 0);
+
+  const memory_size_type bd_total_size = bds.total_memory_in_bytes();
+  const memory_size_type bd_external_size = bds.external_memory_in_bytes();
+
+  Determinate<TBD_Shape> dbds(bds);
+
+  const memory_size_type dbd_total_size = dbds.total_memory_in_bytes();
+  const memory_size_type dbd_external_size = dbds.external_memory_in_bytes();
+
+  nout << "bds.total_memory_in_bytes() = " << bd_total_size
+       << endl
+       << "bds.external_memory_in_bytes() = " << bd_external_size
+       << endl
+       << "dbds.total_memory_in_bytes() = " << dbd_total_size
+       << endl
+       << "dbds.external_memory_in_bytes() = " << dbd_external_size
+       << endl;
+
+  Pointset_Powerset<TBD_Shape> pbds(bds);
+
+  TBD_Shape qbds(3);
+  qbds.add_constraint(x >= 0);
+  qbds.add_constraint(y >= 0);
+  qbds.add_constraint(z >= 0);
+  qbds.add_constraint(x <= 1);
+  qbds.add_constraint(y <= 1);
+  qbds.add_constraint(z <= 1);
+  Pointset_Powerset<TBD_Shape> pqbds(qbds);
+
+  Pointset_Powerset<TBD_Shape> prbds = pqbds;
+  prbds.poly_difference_assign(pbds);
+
+  const memory_size_type pbd_total_size = pbds.total_memory_in_bytes();
+  const memory_size_type pbd_external_size = pbds.external_memory_in_bytes();
+  const memory_size_type pqbd_total_size = pqbds.total_memory_in_bytes();
+  const memory_size_type pqbd_external_size = pqbds.external_memory_in_bytes();
+  const memory_size_type prbd_total_size = prbds.total_memory_in_bytes();
+  const memory_size_type prbd_external_size = prbds.external_memory_in_bytes();
+
+  nout << "pbds.total_memory_in_bytes() = " << pbd_total_size
+       << endl
+       << "pbds.external_memory_in_bytes() = " << pbd_external_size
+       << endl
+       << "pqbds.total_memory_in_bytes() = " << pqbd_total_size
+       << endl
+       << "pqbds.external_memory_in_bytes() = " << pqbd_external_size
+       << endl
+       << "prbds.total_memory_in_bytes() = " << prbd_total_size
+       << endl
+       << "prbds.external_memory_in_bytes() = " << prbd_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/minconstraints1.cc b/tests/BD_Shape/minconstraints1.cc
index d3afe13..2e62390 100644
--- a/tests/BD_Shape/minconstraints1.cc
+++ b/tests/BD_Shape/minconstraints1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape<T>::minimized_constraints().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,42 +29,66 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 1);
-  bd.add_constraint(B >= 0);
-  bd.add_constraint(A - B >= -2);
-  bd.add_constraint(A >= -3);
-  bd.add_constraint(A <= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B >= -2);
+  bds.add_constraint(A >= -3);
+  bds.add_constraint(A <= 1);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  const Constraint_System cs = bd.minimized_constraints();
+  const Constraint_System cs = bds.minimized_constraints();
 
   using namespace IO_Operators;
-  nout << "*** bd.minimized_constraints() ***" << endl;
+  nout << "*** bds.minimized_constraints() ***" << endl;
 
   dimension_type num_constraints = 0;
   for (Constraint_System::const_iterator i = cs.begin(),
-	 iend = cs.end(); i != iend; ++i) {
+         iend = cs.end(); i != iend; ++i) {
     nout << *i << endl;
     ++num_constraints;
   }
 
   nout << "num_constraints == " << num_constraints << endl;
 
-  C_Polyhedron ph_bd(cs);
+  C_Polyhedron ph_bds(cs);
   C_Polyhedron known_result(2);
   known_result.add_constraint(A == 1);
   known_result.add_constraint(B >= 0);
   known_result.add_constraint(B <= 3);
 
-  bool ok = (num_constraints == 3 && known_result == ph_bd) ;
+  bool ok = (num_constraints == 3 && ph_bds == known_result);
 
   return ok;
 }
 
+bool
+test02() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  print_constraints(bds, "*** bds ***");
+
+  const Constraint_System cs = bds.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** bds.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  return num_constraints == 0;
+}
+
 } // namespace
 
 BEGIN_MAIN
   DO_TEST(test01);
+  DO_TEST(test02);
 END_MAIN
diff --git a/tests/BD_Shape/pointsetpowerset1.cc b/tests/BD_Shape/pointsetpowerset1.cc
new file mode 100644
index 0000000..4c89aa0
--- /dev/null
+++ b/tests/BD_Shape/pointsetpowerset1.cc
@@ -0,0 +1,565 @@
+/* Test Pointset_Powerset<BD_Shape<> >.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of bd shapes from an bd shape.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(x - y <= 4);
+  bds.add_constraint(z == 1);
+
+  Pointset_Powerset<TBD_Shape> pps1(bds);
+  Pointset_Powerset<TBD_Shape> pps2(4, EMPTY);
+  pps2.add_disjunct(bds);
+
+  bool ok = (pps1 == pps2);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps1.begin();
+  TBD_Shape bdsi = i->element();
+  print_constraints(bdsi, "*** bdsi ***");
+  Pointset_Powerset<TBD_Shape>::const_iterator i2 = pps2.begin();
+  TBD_Shape bdsi2 = i2->element();
+  print_constraints(bdsi2, "*** bdsi2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of bd shapes from an empty bd shape.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(bds);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+
+// Constructs the powerset of bd shapes from a polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 3);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the implied equalities 4*x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<TBD_Shape> pps(ph);
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->element();
+
+  BD_Shape<mpq_class> known_bdsi(4);
+  known_bdsi.add_constraint(3*x == 2);
+  known_bdsi.add_constraint(z == 1);
+
+  bool ok = check_result(bdsi, known_bdsi, "5.97e-8", "3.15e-8", "1.99e-8");
+
+  print_constraints(bdsi, "*** bdsi ***");
+  print_constraints(known_bdsi, "*** known_bdsi ***");
+
+  // With the polynomial complexity, implied equalities are not found.
+  Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->element();
+
+  BD_Shape<mpq_class> known_bdsi1(4);
+  known_bdsi1.add_constraint(3*x >= 2);
+  known_bdsi1.add_constraint(z >= 1);
+
+  ok = check_result(bdsi1, known_bdsi1, "3.98e-8", "3.98e-8", "3.98e-8") && ok;
+
+  print_constraints(bdsi1, "*** bdsi1 ***");
+  print_constraints(known_bdsi1, "*** known_bds1i ***");
+
+  ok = ok && pps.OK() && pps1.OK();
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_ok = pps.begin();
+  TBD_Shape bdsi_ok = i_ok->element();
+  Pointset_Powerset<TBD_Shape>::const_iterator i1_ok = pps1.begin();
+  TBD_Shape bdsi1_ok = i1_ok->element();
+
+  print_constraints(bdsi_ok, "*** bdsi after OK() ***");
+  print_constraints(bdsi1_ok, "*** bdsi1 after OK() ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 2);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<TBD_Shape> pps(ph);
+  // With the polynomial complexity, the built powerset is non-empty.
+  Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  BD_Shape<mpq_class> known_bds1(4);
+  known_bds1.add_constraint(3*x >= 2);
+  known_bds1.add_constraint(z >= 1);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->element();
+
+  bool ok = check_result(bdsi1, known_bds1, "1.92e-7", "8.89e-8", "7.95e-8")
+    && pps.is_empty();
+
+  print_constraints(bdsi1, "*** bdsi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+#if 0
+// Constructs the powerset of bd shapes from a polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 3);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the implied equalities 3*x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<TBD_Shape> pps(ph);
+  // With the polynomial complexity, implied equalities are not found.
+  Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(4);
+  known_pps.add_constraint(3*x == 2);
+  known_pps.add_constraint(z == 1);
+  Pointset_Powerset<TBD_Shape> known_pps1(4);
+  known_pps1.add_constraint(3*x >= 2);
+  known_pps1.add_constraint(z >= 1);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->element();
+  print_constraints(bdsi, "*** bdsi ***");
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->element();
+  print_constraints(bdsi1, "*** bdsi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of bd shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 2);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<TBD_Shape> pps(ph);
+  // With the polynomial complexity, the built powerset is non-empty.
+  Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(4, EMPTY);
+  Pointset_Powerset<TBD_Shape> known_pps1(4);
+  known_pps1.add_constraint(3*x >= 2);
+  known_pps1.add_constraint(z >= 1);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->element();
+  print_constraints(bdsi1, "*** bdsi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+#endif
+
+// Constructs the powerset of bd shapes from an empty polyhedron.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(ph);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an octagonal shape.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x == 0);
+  os.add_constraint(x + y <= 3);
+  os.add_constraint(y >= 1);
+
+  Pointset_Powerset<TBD_Shape> pps(os);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x == 0);
+  known_pps.add_constraint(y >= 1);
+  known_pps.add_constraint(y <= 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->element();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty octagonal shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(os);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a box.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->element();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty box.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(box);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a grid.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TBD_Shape> pps(gr);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->element();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty grid.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(gr);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of
+// bd shapes.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bds(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bds(bds, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(pps_bds, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator j = pps.begin();
+  TBD_Shape bdsj = j->element();
+  print_constraints(bdsj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of polyhedra.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<TBD_Shape> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TBD_Shape> pps2(pps2_c);
+
+  Pointset_Powerset<TBD_Shape> known_pps1(2);
+  known_pps1.add_constraint(2*x >= 1);
+  known_pps1.add_constraint(y >= 0);
+  Pointset_Powerset<TBD_Shape> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->element();
+  print_constraints(bdsi1, "*** bdsi1 ***");
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i2 = pps2.begin();
+  TBD_Shape bdsi2 = i2->element();
+  print_constraints(bdsi2, "*** bdsi2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of octagonal shapes.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_bds = pps.begin();
+  TBD_Shape bdsi = i_bds->element();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of boxes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_bds = pps.begin();
+  TBD_Shape bdsi = i_bds->element();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of grids.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(gr);
+
+  Pointset_Powerset<TBD_Shape> pps(pps_gr);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->element();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/relations1.cc b/tests/BD_Shape/relations1.cc
index 8dea47f..4fc110c 100644
--- a/tests/BD_Shape/relations1.cc
+++ b/tests/BD_Shape/relations1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::relation_with().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,13 +28,13 @@ bool
 test01() {
   Variable A(0);
 
-  TBD_Shape bd(2, EMPTY);
+  TBD_Shape bds(2, EMPTY);
 
-  Poly_Con_Relation rel = bd.relation_with(A >= 0);
+  Poly_Con_Relation rel = bds.relation_with(A >= 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A >= 0) == " << rel << endl;
+  nout << "bds.relation_with(A >= 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_included()
@@ -48,16 +48,16 @@ test02() {
   // Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(y <= -1);
+  TBD_Shape bds(2);
+  bds.add_constraint(y <= -1);
 
   Constraint c(y >= 0);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -70,16 +70,16 @@ test03() {
   Variable y(1);
   // Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(y <= 1);
+  TBD_Shape bds(3);
+  bds.add_constraint(y <= 1);
 
   Constraint c(y >= 0);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
 
@@ -92,16 +92,16 @@ test04() {
   // Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(z >= 1);
+  TBD_Shape bds(3);
+  bds.add_constraint(z >= 1);
 
   Constraint c(z >= 0);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
 
@@ -113,16 +113,16 @@ test05() {
   Variable x(0);
   // Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x == 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 1);
 
   Constraint c(x >= 1);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_included();
@@ -136,18 +136,18 @@ test06() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x == 1);
-  bd.add_constraint(y <= 0);
-  bd.add_constraint(z >= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x == 1);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
 
   Constraint c(x == 1);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_included();
@@ -161,18 +161,18 @@ test07() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x >= 3);
-  bd.add_constraint(y <= 0);
-  bd.add_constraint(z >= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x >= 3);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
 
   Constraint c(x == 2);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -185,18 +185,18 @@ test08() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x <= 3);
-  bd.add_constraint(y <= 0);
-  bd.add_constraint(z >= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 3);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
 
   Constraint c(x == 2);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
 
@@ -209,18 +209,18 @@ test09() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x <= 3);
-  bd.add_constraint(y <= 0);
-  bd.add_constraint(z >= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 3);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
 
   Constraint c(-x >= 2);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
 
@@ -230,12 +230,12 @@ test09() {
 bool
 test10() {
   // The zero-dim universe BDS.
-  TBD_Shape bd(0);
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= 0);
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(0 >= 0) == " << rel << endl;
+  nout << "bds.relation_with(0 >= 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
     && Poly_Con_Relation::saturates();
@@ -246,12 +246,12 @@ test10() {
 bool
 test11() {
   // The zero-dim universe BDS.
-  TBD_Shape bd(0);
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= 1);
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(0 >= 1) == " << rel << endl;
+  nout << "bds.relation_with(0 >= 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -261,12 +261,12 @@ test11() {
 bool
 test12() {
   // The zero-dim universe BDS.
-  TBD_Shape bd;
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) >= 0);
+  TBD_Shape bds;
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) >= 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(1 >= 0) == " << rel << endl;
+  nout << "bds.relation_with(1 >= 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
 
@@ -278,16 +278,16 @@ test13() {
   Variable x(0);
   // Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x == 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 1);
 
   Constraint c(x > 1);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_disjoint();
@@ -301,18 +301,18 @@ test14() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x == 1);
-  bd.add_constraint(y <= 0);
-  bd.add_constraint(z >= 2);
+  TBD_Shape bds(3);
+  bds.add_constraint(x == 1);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
 
   Constraint c(x > 1);
-  Poly_Con_Relation rel = bd.relation_with(c);
+  Poly_Con_Relation rel = bds.relation_with(c);
 
-  print_constraints(bd, "--- bd ---");
-  print_constraint(c, "--- c ---");
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(c) == " << rel << endl;
+  nout << "bds.relation_with(c) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_disjoint();
@@ -325,15 +325,15 @@ test15() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x == 0);
-  bd.add_constraint(y >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(y >= 1);
 
-  Poly_Con_Relation rel = bd.relation_with(-y >= -1);
+  Poly_Con_Relation rel = bds.relation_with(-y >= -1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(-y >= -1) == " << rel << endl;
+  nout << "bds.relation_with(-y >= -1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
 
@@ -346,17 +346,17 @@ test16() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
+  TBD_Shape bds(3);
 
-  bd.add_constraint(x - y <= 2);
-  bd.add_constraint(x - z >= -1);
-  bd.add_constraint(y <= 3);
+  bds.add_constraint(x - y <= 2);
+  bds.add_constraint(x - z >= -1);
+  bds.add_constraint(y <= 3);
 
-  Poly_Con_Relation rel = bd.relation_with(y > 3);
+  Poly_Con_Relation rel = bds.relation_with(y > 3);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(y > 3) == " << rel << endl;
+  nout << "bds.relation_with(y > 3) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -369,17 +369,17 @@ test17() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape bd(3);
+  TBD_Shape bds(3);
 
-  bd.add_constraint(x - y <= 2);
-  bd.add_constraint(x - z >= -1);
-  bd.add_constraint(y <= 3);
+  bds.add_constraint(x - y <= 2);
+  bds.add_constraint(x - z >= -1);
+  bds.add_constraint(y <= 3);
 
-  Poly_Con_Relation rel = bd.relation_with(-y >= -4);
+  Poly_Con_Relation rel = bds.relation_with(-y >= -4);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(1 >= 0) == " << rel << endl;
+  nout << "bds.relation_with(1 >= 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
 
@@ -390,15 +390,15 @@ bool
 test18() {
   Variable A(0);
 
-  TBD_Shape bd(1);
-  bd.add_constraint(A <= 0);
-  bd.add_constraint(A >= -2);
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(A >= -2);
 
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= -1);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= -1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(0 >= -1) == " << rel << endl;
+  nout << "bds.relation_with(0 >= -1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
 
@@ -410,15 +410,15 @@ test19() {
   // We verify that a generator is not subsumed by an empty BDS.
   Variable x(0);
 
-  TBD_Shape bd(2, EMPTY);
+  TBD_Shape bds(2, EMPTY);
 
   Generator g = point(x);
-  Poly_Gen_Relation rel = bd.relation_with(g);
+  Poly_Gen_Relation rel = bds.relation_with(g);
 
-  print_constraints(bd, "--- bd ---");
-  print_generator(g, "--- g ---");
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(v(A)) == " << rel << endl;
+  nout << "bds.relation_with(v(A)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -429,15 +429,15 @@ bool
 test20() {
   // We verify that a zero-dimensional generator is subsumed
   // by a zero-dimensional, universal BDS.
-  TBD_Shape bd;
+  TBD_Shape bds;
 
   Generator g = point();
-  Poly_Gen_Relation rel = bd.relation_with(g);
+  Poly_Gen_Relation rel = bds.relation_with(g);
 
-  print_constraints(bd, "--- bd ---");
-  print_generator(g, "--- g ---");
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(v()) == " << rel << endl;
+  nout << "bds.relation_with(v()) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
 
diff --git a/tests/BD_Shape/relations2.cc b/tests/BD_Shape/relations2.cc
index b519c46..e2589b5 100644
--- a/tests/BD_Shape/relations2.cc
+++ b/tests/BD_Shape/relations2.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::relation_with().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,12 +27,12 @@ namespace {
 bool
 test01() {
   // The zero-dim universe BDS.
-  TBD_Shape bd(0);
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) > 0);
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) > 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(0 > 0) == " << rel << endl;
+  nout << "bds.relation_with(0 > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_disjoint();
@@ -43,12 +43,12 @@ test01() {
 bool
 test02() {
   // The zero-dim universe BDS.
-  TBD_Shape bd(0);
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) > 1);
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) > 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(0 > 1) == " << rel << endl;
+  nout << "bds.relation_with(0 > 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -58,12 +58,12 @@ test02() {
 bool
 test03() {
   // The zero-dim universe BDS.
-  TBD_Shape bd(0);
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) > 0);
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) > 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(1 > 0) == " << rel << endl;
+  nout << "bds.relation_with(1 > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
 
@@ -73,16 +73,16 @@ test03() {
 bool
 test04() {
   // An empty BDS.
-  TBD_Shape bd(1);
-  bd.add_constraint(Linear_Expression(0) >= 1);
+  TBD_Shape bds(1);
+  bds.add_constraint(Linear_Expression(0) >= 1);
 
   Variable A(0);
 
-  Poly_Con_Relation rel = bd.relation_with(A > 0);
+  Poly_Con_Relation rel = bds.relation_with(A > 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A > 0) = " << rel << endl;
+  nout << "bds.relation_with(A > 0) = " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_included()
@@ -96,13 +96,13 @@ test05() {
   Variable A(0);
   Variable B(1);
   Constraint_System cs(A - B == 3);
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
-  Poly_Con_Relation rel = bd.relation_with(A - B > 3);
+  Poly_Con_Relation rel = bds.relation_with(A - B > 3);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A - B > 3) == " << rel << endl;
+  nout << "bds.relation_with(A - B > 3) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_disjoint();
@@ -115,13 +115,13 @@ test06() {
   Variable A(0);
   Variable B(1);
   Constraint_System cs(A - B <= 3);
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
-  Poly_Con_Relation rel = bd.relation_with(A - B > 3);
+  Poly_Con_Relation rel = bds.relation_with(A - B > 3);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A - B > 3) == " << rel << endl;
+  nout << "bds.relation_with(A - B > 3) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -135,13 +135,13 @@ test07() {
   Constraint_System cs;
   cs.insert(A <= 1);
 
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
-  Poly_Con_Relation rel = bd.relation_with(A > 0);
+  Poly_Con_Relation rel = bds.relation_with(A > 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A > 0) == " << rel << endl;
+  nout << "bds.relation_with(A > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
 
@@ -158,13 +158,13 @@ test08() {
   cs.insert(B >= 0);
   cs.insert(A - B <= 3);
 
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
-  Poly_Con_Relation rel = bd.relation_with(A - B > 1);
+  Poly_Con_Relation rel = bds.relation_with(A - B > 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A - B > 1) == " << rel << endl;
+  nout << "bds.relation_with(A - B > 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
 
@@ -181,13 +181,13 @@ test09() {
   cs.insert(B >= 0);
   cs.insert(A - B <= 3);
 
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
-  Poly_Con_Relation rel = bd.relation_with(A > 0);
+  Poly_Con_Relation rel = bds.relation_with(A > 0);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(A > 0) == " << rel << endl;
+  nout << "bds.relation_with(A > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
 
@@ -204,13 +204,13 @@ test10() {
   cs.insert(B <= -1);
   cs.insert(A - B <= 2);
 
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
-  Poly_Con_Relation rel = bd.relation_with(B - A > 1);
+  Poly_Con_Relation rel = bds.relation_with(B - A > 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(B - A > 1) == " << rel << endl;
+  nout << "bds.relation_with(B - A > 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
 
@@ -221,14 +221,14 @@ bool
 test11() {
   Variable A(0);
 
-  TBD_Shape bd(1);
-  bd.add_constraint(A >= 0);
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
 
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) >= 1);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) >= 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(1 >= 1) == " << rel << endl;
+  nout << "bds.relation_with(1 >= 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_included();
@@ -241,15 +241,15 @@ test12() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A == 1);
-  bd.add_constraint(B >= 2);
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(B >= 2);
 
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) > 1);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) > 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(1 > 1) == " << rel << endl;
+  nout << "bds.relation_with(1 > 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_disjoint();
@@ -263,16 +263,16 @@ test13() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A == 1);
-  bd.add_constraint(B >= 2);
-  bd.add_constraint(C <= 1);
+  TBD_Shape bds(3);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(B >= 2);
+  bds.add_constraint(C <= 1);
 
-  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) == 1);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) == 1);
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(1 == 1) == " << rel << endl;
+  nout << "bds.relation_with(1 == 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
     && Poly_Con_Relation::is_included();
@@ -285,17 +285,17 @@ test14() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A - B >= 0);
-  bd.add_constraint(B >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B >= 0);
+  bds.add_constraint(B >= 0);
 
-  Poly_Gen_Relation rel1 = bd.relation_with(point(B));
-  Poly_Gen_Relation rel2 = bd.relation_with(point(-B));
+  Poly_Gen_Relation rel1 = bds.relation_with(point(B));
+  Poly_Gen_Relation rel2 = bds.relation_with(point(-B));
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(point(B)) == " << rel1 << endl;
-  nout << "bd.relation_with(point(-B)) == " << rel2 << endl;
+  nout << "bds.relation_with(point(B)) == " << rel1 << endl;
+  nout << "bds.relation_with(point(-B)) == " << rel2 << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -306,14 +306,14 @@ bool
 test15() {
   Variable A(0);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
 
-  Poly_Gen_Relation rel = bd.relation_with(ray(-A));
+  Poly_Gen_Relation rel = bds.relation_with(ray(-A));
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(ray(-A)) == " << rel << endl;
+  nout << "bds.relation_with(ray(-A)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -324,14 +324,14 @@ bool
 test16() {
   Variable A(0);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
 
-  Poly_Gen_Relation rel = bd.relation_with(line(A));
+  Poly_Gen_Relation rel = bds.relation_with(line(A));
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(line(A)) == " << rel << endl;
+  nout << "bds.relation_with(line(A)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -343,15 +343,15 @@ test17() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A == 0);
-  bd.add_constraint(B == 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 0);
 
-  Poly_Gen_Relation rel = bd.relation_with(closure_point(A));
+  Poly_Gen_Relation rel = bds.relation_with(closure_point(A));
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(closure_point(A)) == " << rel << endl;
+  nout << "bds.relation_with(closure_point(A)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -363,15 +363,15 @@ test18() {
   Variable A(0);
   Variable B(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 2);
-  bd.add_constraint(B == 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(B == 0);
 
-  Poly_Gen_Relation rel = bd.relation_with(ray(A + B));
+  Poly_Gen_Relation rel = bds.relation_with(ray(A + B));
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(ray(A + B)) == " << rel << endl;
+  nout << "bds.relation_with(ray(A + B)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -384,14 +384,14 @@ test19() {
   // an equality and the generator `g' is a point.
   Variable A(0);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A == 0);
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
 
-  Poly_Gen_Relation rel = bd.relation_with(point(2*A));
+  Poly_Gen_Relation rel = bds.relation_with(point(2*A));
 
-  print_constraints(bd, "--- bd ---");
+  print_constraints(bds, "*** bds ***");
   using namespace IO_Operators;
-  nout << "bd.relation_with(point(2*A)) == " << rel << endl;
+  nout << "bds.relation_with(point(2*A)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
 
@@ -404,23 +404,18 @@ test20() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A >= 1);
-
-  try {
-    // This is an incorrect use of function
-    // BD_Shape::relation_with(c):
-    // it is illegal to use a constraint with three
-    // dimensions.
-    Poly_Con_Relation rel = bd.relation_with(A - C - B <= 2);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - C - B <= 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
 }
 
 } // namespace
diff --git a/tests/BD_Shape/relations3.cc b/tests/BD_Shape/relations3.cc
index 0557ddd..890a3b9 100644
--- a/tests/BD_Shape/relations3.cc
+++ b/tests/BD_Shape/relations3.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::relation_with().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,23 +30,23 @@ test01() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
 
   try {
-    // This is an incorrect use of function
+    // This is an incorrect use of method
     // BD_Shape::relation_with(c):
     // it is illegal to use a constraint that is
     // dimensional incompatible with the BDS.
-    Poly_Con_Relation rel = bd.relation_with(C - B <= 2);
+    Poly_Con_Relation rel = bds.relation_with(C - B <= 2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -55,23 +55,14 @@ test02() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(A >= 1);
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
 
-  try {
-    // This is an incorrect use of function
-    // BD_Shape::relation_with(c):
-    // it is illegal to use a constraint that is
-    // not a bounded difference.
-    Poly_Con_Relation rel = bd.relation_with(A - 2*B <= 2);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
+  Poly_Con_Relation rel = bds.relation_with(A - 2*B <= 2);
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  print_constraints(bds, "*** bds ***");
+
+  return rel == known_result;
 }
 
 bool
@@ -80,23 +71,368 @@ test03() {
   Variable B(1);
   Variable C(2);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(A >= 1);
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
 
   try {
-    // This is an incorrect use of function
+    // This is an incorrect use of method
     // BD_Shape::relation_with(c):
     // it is illegal to use a generator that is
     // dimensional incompatible with the BDS.
-    Poly_Gen_Relation rel = bd.relation_with(ray(C));
+    Poly_Gen_Relation rel = bds.relation_with(ray(C));
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A <= -2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A <= -2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A == -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included() &&
+    Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B <= -2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A <= -2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B == -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included() &&
+    Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B == -2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  // A 1D empty BDS that is not in minimal form and the point is the origin.
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(A >= 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == 1);
+
+  Generator g = point(3*A, 2);
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  BD_Shape<mpz_class> bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 1);
+
+  Constraint c(2*A == 1);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 1);
+
+  Constraint c(Linear_Expression(1) == 0);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 1);
+
+  Congruence cg((A %= 0) / 0);
+  Poly_Con_Relation rel = bds.relation_with(cg);
+
+  print_constraints(bds, "--- bds ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 1) / 10);
+  Poly_Con_Relation rel = bds.relation_with(cg);
+
+  print_constraints(bds, "--- bds ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "bds.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 10) / 11);
+  Poly_Con_Relation rel = bds.relation_with(cg);
+
+  print_constraints(bds, "--- bds ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "bds.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
 }
 
 } // namespace
@@ -105,4 +441,21 @@ BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
   DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
 END_MAIN
diff --git a/tests/BD_Shape/relations4.cc b/tests/BD_Shape/relations4.cc
new file mode 100644
index 0000000..0d46995
--- /dev/null
+++ b/tests/BD_Shape/relations4.cc
@@ -0,0 +1,435 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B <= -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= -1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B - 4*A >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B - 4*A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B + 4*A == 5);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B + 4*A == 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B + 4*A > 14);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B + 4*A > 14) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B + 4*A >= 15);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B + 4*A >= 15) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+  test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B == 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 3);
+  cs.insert(B <= 3);
+  cs.insert(B >= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 6);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 6);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 8);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 8) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A - B == 3);
+  cs.insert(B == 1);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A - 2*B > 2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - 2*B > 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B <= 3);
+  cs.insert(A <= 1);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(2*A - B > 4);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(2*A - B > 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B >= 3);
+  cs.insert(A >= 1);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(2*A - B < 4);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(2*A - B < 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/BD_Shape/removespacedims1.cc b/tests/BD_Shape/removespacedims1.cc
index 86ea205..71db1c2 100644
--- a/tests/BD_Shape/removespacedims1.cc
+++ b/tests/BD_Shape/removespacedims1.cc
@@ -1,11 +1,11 @@
 /* Remove some variables from the space.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -33,28 +33,28 @@ test01() {
   Variable x5(4);
   Variable x6(5);
 
-  TBD_Shape bd1(6);
-  bd1.add_constraint(x2 - x3 <= 0);
-  bd1.add_constraint(x3 <= 2);
-  bd1.add_constraint(x6 - x5 <= 2);
-  bd1.add_constraint(x5 <= 3);
+  TBD_Shape bds(6);
+  bds.add_constraint(x2 - x3 <= 0);
+  bds.add_constraint(x3 <= 2);
+  bds.add_constraint(x6 - x5 <= 2);
+  bds.add_constraint(x5 <= 3);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
   // This is the set of the variables that we want to remove.
   Variables_Set to_be_removed;
   to_be_removed.insert(x3);
   to_be_removed.insert(x5);
 
-  bd1.remove_space_dimensions(to_be_removed);
+  bds.remove_space_dimensions(to_be_removed);
 
   BD_Shape<mpq_class> known_result(4);
   known_result.add_constraint(x2 <= 2);
   known_result.add_constraint(x4 <= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.remove_space_dimensions({x3,x5}) ***");
+  print_constraints(bds, "*** bds.remove_space_dimensions({x3, x5}) ***");
 
   return ok;
 }
@@ -70,15 +70,15 @@ test02() {
   Variable x7(6);
   Variable x8(7);
 
-  TBD_Shape bd1(8);
-  bd1.add_constraint(x7 - x3 <= 0);
-  bd1.add_constraint(x1 <= 2);
-  bd1.add_constraint(x4 - x8 <= 2);
-  bd1.add_constraint(x5 <= 7);
-  bd1.add_constraint(x2 <= 10);
-  bd1.add_constraint(x6 - x8 <= 4);
+  TBD_Shape bds(8);
+  bds.add_constraint(x7 - x3 <= 0);
+  bds.add_constraint(x1 <= 2);
+  bds.add_constraint(x4 - x8 <= 2);
+  bds.add_constraint(x5 <= 7);
+  bds.add_constraint(x2 <= 10);
+  bds.add_constraint(x6 - x8 <= 4);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
   // This is the set of the variables that we want to remove.
   Variables_Set to_be_removed;
@@ -91,15 +91,15 @@ test02() {
   to_be_removed.insert(x7);
   to_be_removed.insert(x8);
 
-  bd1.remove_space_dimensions(to_be_removed);
+  bds.remove_space_dimensions(to_be_removed);
 
   BD_Shape<mpq_class> known_result(0);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1,
-		    "*** bd1.remove_space_dimensions"
-		    "({x1,x2,x3,x4,x5,x6,x7,x8}) ***");
+  print_constraints(bds,
+                    "*** bds.remove_space_dimensions"
+                    "({x1, x2, x3, x4, x5, x6, x7, x8}) ***");
 
   return ok;
 }
@@ -111,27 +111,27 @@ test03() {
   Variable x3(2);
   Variable x4(3);
 
-  TBD_Shape bd1(4);
-  bd1.add_constraint(x1 - x2 <=1);
-  bd1.add_constraint(x2 - x3 <= -2);
-  bd1.add_constraint(x3 - x1 <= 0);
-  bd1.add_constraint(x2 >= 5);
-  bd1.add_constraint(x4 >= 3);
+  TBD_Shape bds(4);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= -2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+  bds.add_constraint(x4 >= 3);
 
-  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bds, "*** bds ***");
 
   Variables_Set to_be_removed;
   to_be_removed.insert(x1);
   to_be_removed.insert(x3);
   to_be_removed.insert(x4);
 
-  bd1.remove_space_dimensions(to_be_removed);
+  bds.remove_space_dimensions(to_be_removed);
 
   BD_Shape<mpq_class> known_result(1, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd1, "*** bd1.remove_space_dimensions({x1,x3,x4}) ***");
+  print_constraints(bds, "*** bds.remove_space_dimensions({x1, x3, x4}) ***");
 
   return ok;
 }
@@ -141,19 +141,19 @@ test04() {
   Variable x1(0);
   Variable x2(1);
 
-  TBD_Shape bd(2);
-  bd.add_constraint(x1 <= 2);
-  bd.add_constraint(x2 <= 10);
+  TBD_Shape bds(2);
+  bds.add_constraint(x1 <= 2);
+  bds.add_constraint(x2 <= 10);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.remove_higher_space_dimensions(0);
+  bds.remove_higher_space_dimensions(0);
 
   BD_Shape<mpq_class> known_result(0, UNIVERSE);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.remove_higher_space_dimensions(0) ***");
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(0) ***");
 
   return ok;
 }
@@ -165,22 +165,22 @@ test05() {
   Variable x3(2);
   Variable x4(3);
 
-  TBD_Shape bd(4);
-  bd.add_constraint(x1 - x2 <=1);
-  bd.add_constraint(x2 - x3 <= -2);
-  bd.add_constraint(x3 - x1 <= 0);
-  bd.add_constraint(x2 >= 5);
-  bd.add_constraint(x4 >= 3);
+  TBD_Shape bds(4);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= -2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+  bds.add_constraint(x4 >= 3);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.remove_higher_space_dimensions(1);
+  bds.remove_higher_space_dimensions(1);
 
   BD_Shape<mpq_class> known_result(1, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.remove_higher_space_dimensions(1) ***");
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(1) ***");
 
   return ok;
 }
@@ -193,17 +193,17 @@ test06() {
   Variable x4(3);
   Variable x5(4);
 
-  TBD_Shape bd(5);
-  bd.add_constraint(x1 - x2 <=1);
-  bd.add_constraint(x2 - x3 <= 2);
-  bd.add_constraint(x3 - x1 <= 0);
-  bd.add_constraint(x2 >= 5);
-  bd.add_constraint(x4 >= 3);
-  bd.add_constraint(x5 - x3 == 2);
+  TBD_Shape bds(5);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= 2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+  bds.add_constraint(x4 >= 3);
+  bds.add_constraint(x5 - x3 == 2);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  bd.remove_higher_space_dimensions(3);
+  bds.remove_higher_space_dimensions(3);
 
   BD_Shape<mpq_class> known_result(3);
   known_result.add_constraint(x1 - x2 <=1);
@@ -211,9 +211,9 @@ test06() {
   known_result.add_constraint(x3 - x1 <= 0);
   known_result.add_constraint(x2 >= 5);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.remove_higher_space_dimensions(3) ***");
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
 
   return ok;
 }
@@ -224,42 +224,42 @@ test07() {
   Variable x2(1);
   Variable x3(2);
 
-  TBD_Shape bd(3);
-  bd.add_constraint(x1 - x2 <=1);
-  bd.add_constraint(x2 - x3 <= 2);
-  bd.add_constraint(x3 - x1 <= 0);
-  bd.add_constraint(x2 >= 5);
+  TBD_Shape bds(3);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= 2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
 
-  print_constraints(bd, "*** bd ***");
+  print_constraints(bds, "*** bds ***");
 
-  BD_Shape<mpq_class> known_result(bd);
+  BD_Shape<mpq_class> known_result(bds);
 
-  bd.remove_higher_space_dimensions(3);
+  bds.remove_higher_space_dimensions(3);
 
-  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+  bool ok = check_result(bds, known_result);
 
-  print_constraints(bd, "*** bd.remove_higher_space_dimensions(3) ***");
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
 
   return ok;
 }
 
 bool
 test08() {
-  TBD_Shape bd(5);
+  TBD_Shape bds(5);
 
   try {
-    // This is an invalid use of the function
+    // This is an invalid use of the method
     // BD_Shape::remove_higher_dimensions(n): it is illegal to erase
     // a variable that is not in the space of the polyhedron.
-    bd.remove_higher_space_dimensions(7);
+    bds.remove_higher_space_dimensions(7);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 bool
@@ -271,29 +271,103 @@ test09() {
   Constraint_System cs;
   cs.insert(x <= 3);
   cs.insert(y - z <= 2);
-  TBD_Shape bd(cs);
+  TBD_Shape bds(cs);
 
   Variables_Set to_be_removed;
   to_be_removed.insert(z);
 
-  bd.remove_space_dimensions(to_be_removed);
+  bds.remove_space_dimensions(to_be_removed);
 
   try {
     to_be_removed.insert(x);
-    // This is an incorrect use use of function
+    // This is an incorrect use use of method
     // BD_Shape::remove_dimensions(to_be_remove).
     // Here the set `to_be_removed' still contains variable `z'.
     // This variable is now beyond the space dimension,
     // so that a dimension-incompatibility exception is obtained.
-    bd.remove_space_dimensions(to_be_removed);
+    bds.remove_space_dimensions(to_be_removed);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x1 - x2 <= 1);
+  cs.insert(x2 - x3 <= 3);
+  cs.insert(x3 - x1 <= 0);
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 - x3 == 3);
+  TBD_Shape bds(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  cs = bds.minimized_constraints();
+  bds.remove_higher_space_dimensions(3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 3);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x1 - x2 <= 1);
+  cs.insert(x2 - x3 <= 3);
+  cs.insert(x3 - x1 <= 0);
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 - x3 == 3);
+  TBD_Shape bds(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+
+  cs = bds.minimized_constraints();
+  bds.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 3);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_space_dimensions({x4, x5}) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -308,4 +382,6 @@ BEGIN_MAIN
   DO_TEST(test07);
   DO_TEST(test08);
   DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
 END_MAIN
diff --git a/tests/BD_Shape/run_tests b/tests/BD_Shape/run_tests
index 438d552..67b472d 100755
--- a/tests/BD_Shape/run_tests
+++ b/tests/BD_Shape/run_tests
@@ -1,5 +1,27 @@
 #!/bin/sh
 
+# Run the BD_Shape tests.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
 mpz_class_XFAIL_TESTS=
 mpq_class_XFAIL_TESTS=
 int8_t_XFAIL_TESTS=
diff --git a/tests/BD_Shape/timeelapse1.cc b/tests/BD_Shape/timeelapse1.cc
index 7296067..afe92b4 100644
--- a/tests/BD_Shape/timeelapse1.cc
+++ b/tests/BD_Shape/timeelapse1.cc
@@ -1,11 +1,11 @@
 /* Test time_elapse_assign() for particular polyhedra.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,27 +26,26 @@ namespace {
 
 bool
 test01() {
-  TBD_Shape oc1(2, EMPTY);
-  TBD_Shape oc2(2);
+  TBD_Shape bds1(2, EMPTY);
+  TBD_Shape bds2(2);
 
-  print_constraints(oc1, "**** oc1 ****");
-  print_constraints(oc2, "**** oc2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  oc1.time_elapse_assign(oc2);
+  bds1.time_elapse_assign(bds2);
 
-  TBD_Shape oc3(2);
-  TBD_Shape oc4(2, EMPTY);
+  TBD_Shape bds3(2);
+  TBD_Shape bds4(2, EMPTY);
 
-  print_constraints(oc3, "**** oc3 ****");
-  print_constraints(oc4, "**** oc4 ****");
+  print_constraints(bds3, "*** bds3 ***");
+  print_constraints(bds4, "*** bds4 ***");
 
-  oc3.time_elapse_assign(oc4);
+  bds3.time_elapse_assign(bds4);
 
-  bool ok = (oc1.is_empty()
-		&& oc3.is_empty()) ;
+  bool ok = (bds1.is_empty() && bds3.is_empty());
 
-  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
-  print_constraints(oc3, "**** oc3_time_elapse_assign(oc4) ****");
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+  print_constraints(bds3, "*** bds3_time_elapse_assign(bds4) ***");
 
   return ok;
 }
@@ -56,28 +55,28 @@ test02() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape oc1(2);
-  oc1.add_constraint(x >= 0);
-  oc1.add_constraint(y >= 0);
-  oc1.add_constraint(x + y - 2 <= 0);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(x + y - 2 <= 0);
 
-  TBD_Shape oc2(2);
-  oc2.add_constraint(x >= 2);
-  oc2.add_constraint(x <= 4);
-  oc2.add_constraint(y == 3);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x >= 2);
+  bds2.add_constraint(x <= 4);
+  bds2.add_constraint(y == 3);
 
-  print_constraints(oc1, "**** oc1 ****");
-  print_constraints(oc2, "**** oc2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  oc1.time_elapse_assign(oc2);
+  bds1.time_elapse_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(x >= 0);
   known_result.add_constraint(y >= 0);
 
-  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
 
   return ok;
 }
@@ -87,26 +86,26 @@ test03() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape oc1(2);
-  oc1.add_constraint(x >= 1);
-  oc1.add_constraint(x <= 3);
-  oc1.add_constraint(y >= 1);
-  oc1.add_constraint(y <= 3);
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= 1);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(y <= 3);
 
-  TBD_Shape oc2(2);
-  oc2.add_constraint(y == 5);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(y == 5);
 
-  print_constraints(oc1, "**** oc1 ****");
-  print_constraints(oc2, "**** oc2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  oc1.time_elapse_assign(oc2);
+  bds1.time_elapse_assign(bds2);
 
   BD_Shape<mpq_class> known_result(2);
   known_result.add_constraint(y >= 1);
 
-  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
 
   return ok;
 }
@@ -116,24 +115,24 @@ test04() {
   Variable x(0);
   Variable y(1);
 
-  TBD_Shape oc1(3);
-  oc1.add_constraint(x <= 3);
-  oc1.add_constraint(y <= 5);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(y <= 5);
 
-  TBD_Shape oc2(3);
-  oc2.add_constraint(x <= 2);
-  oc2.add_constraint(y <= 3);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y <= 3);
 
-  print_constraints(oc1, "**** oc1 ****");
-  print_constraints(oc2, "**** oc2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  oc1.time_elapse_assign(oc2);
+  bds1.time_elapse_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3);
 
-  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
 
   return ok;
 }
@@ -144,30 +143,30 @@ test05() {
   Variable y(1);
   Variable z(2);
 
-  TBD_Shape oc1(3);
-  oc1.add_constraint(x <= 2);
-  oc1.add_constraint(x >= 1);
-  oc1.add_constraint(y <= 5);
-  oc1.add_constraint(y >= 10);
-  oc1.add_constraint(z >= 1);
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 2);
+  bds1.add_constraint(x >= 1);
+  bds1.add_constraint(y <= 5);
+  bds1.add_constraint(y >= 10);
+  bds1.add_constraint(z >= 1);
 
-  TBD_Shape oc2(3);
-  oc2.add_constraint(x <= 9);
-  oc2.add_constraint(x >= 0);
-  oc2.add_constraint(y <= 3);
-  oc2.add_constraint(y >= -1);
-  oc2.add_constraint(z >= 2);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x <= 9);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y <= 3);
+  bds2.add_constraint(y >= -1);
+  bds2.add_constraint(z >= 2);
 
-  print_constraints(oc1, "**** oc1 ****");
-  print_constraints(oc2, "**** oc2 ****");
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
 
-  oc1.time_elapse_assign(oc2);
+  bds1.time_elapse_assign(bds2);
 
   BD_Shape<mpq_class> known_result(3, EMPTY);
 
-  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+  bool ok = check_result(bds1, known_result);
 
-  print_constraints(oc1, "**** oc1.time_elapse_assign(oc2) ****");
+  print_constraints(bds1, "*** bds1.time_elapse_assign(bds2) ***");
 
   return ok;
 }
@@ -176,25 +175,59 @@ bool
 test06() {
   Variable x(0);
 
-  TBD_Shape bd1(1);
-  bd1.add_constraint(x == 1);
+  TBD_Shape bds1(1);
+  bds1.add_constraint(x == 1);
 
-  TBD_Shape bd2(2);
+  TBD_Shape bds2(2);
 
   try {
-    // This is an invalid use of the function
-    // BD_Shape::time_elapse_assign(bd2): it is
-    // illegal to apply this function to two polyhedra that are not
-    // dimension-compatible.
-    bd1.time_elapse_assign(bd2);
+    // This is an invalid use of the method
+    // BD_Shape::time_elapse_assign(bds2): it is illegal to apply the
+    // method to two polyhedra that are not dimension-compatible.
+    bds1.time_elapse_assign(bds2);
   }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x >= 1);
+  bds1.add_constraint(y <= 5);
+  bds1.add_constraint(y >= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y <= 3);
+  bds2.add_constraint(y >= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.time_elapse_assign(bds2) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -206,4 +239,5 @@ BEGIN_MAIN
   DO_TEST(test04);
   DO_TEST(test05);
   DO_TEST(test06);
+  DO_TEST(test07);
 END_MAIN
diff --git a/tests/BD_Shape/unconstrain1.cc b/tests/BD_Shape/unconstrain1.cc
new file mode 100644
index 0000000..02003ce
--- /dev/null
+++ b/tests/BD_Shape/unconstrain1.cc
@@ -0,0 +1,228 @@
+/* Test BD_Shape::unconstrain().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+  print_constraints(bds, "*** bds ***");
+
+  bds.unconstrain(A);
+
+  TBD_Shape known_result(2, EMPTY);
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs(A, B);
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(2, EMPTY);
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == B);
+  bds.add_constraint(B >= 0);
+  print_constraints(bds, "*** bds ***");
+
+  bds.unconstrain(B);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == B);
+  bds.add_constraint(B >= 0);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs(B);
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds(0, EMPTY);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs;
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(0, EMPTY);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds(0);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs;
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    TBD_Shape bds(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    bds.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    TBD_Shape bds(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    bds.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 9);
+  bds.add_constraint(A >= D + 2);
+  bds.add_constraint(C <= D);
+  bds.add_constraint(E <= B);
+  bds.add_constraint(E >= 0);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(5);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/universe1.cc b/tests/BD_Shape/universe1.cc
index 34d48e3..7e382f8 100644
--- a/tests/BD_Shape/universe1.cc
+++ b/tests/BD_Shape/universe1.cc
@@ -1,11 +1,11 @@
 /* Test BD_Shape::is_universe().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,30 +28,62 @@ bool
 test01() {
   Variable x(0);
   Variable y(1);
-  // Variable z(2);
 
-  TBD_Shape bd1(4);
-  TBD_Shape bd2(4);
+  TBD_Shape bds(4);
 
-  bd1.add_constraint(-x <= 4);
-  bd1.add_constraint(y - x <= 0);
-  bd1.add_constraint(x - y <= -5);
+  bds.add_constraint(-x <= 4);
+  bds.add_constraint(y - x <= 0);
+  bds.add_constraint(x - y <= -5);
 
-  bool universe1 = bd1.is_universe();
+  bool universe = bds.is_universe();
 
-  nout << "*** bd1.is_universe() ***" << endl;
-  nout << (universe1 ? "true" : "false") << endl;
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
 
-  bool universe2 = bd2.is_universe();
+  return !universe;
+}
+
+bool
+test02() {
+  TBD_Shape bds(4);
+
+  bool universe = bds.is_universe();
+
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test03() {
+  TBD_Shape bds(0);
+
+  bool universe = bds.is_universe();
+
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test04() {
+  TBD_Shape bds(20, EMPTY);
+
+  bool universe = bds.is_universe();
 
-  nout << "*** bd2.is_universe() ***" << endl;
-  nout << (universe2 ? "true" : "false") << endl;
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
 
-  return universe1 != universe2;
+  return !universe;
 }
 
 } // namespace
 
 BEGIN_MAIN
   DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
 END_MAIN
diff --git a/tests/BD_Shape/writebdshape1.cc b/tests/BD_Shape/writebdshape1.cc
index 0b4009e..a164c13 100644
--- a/tests/BD_Shape/writebdshape1.cc
+++ b/tests/BD_Shape/writebdshape1.cc
@@ -1,11 +1,11 @@
 /* Test operator<<(ostream&, const BD_Shape&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,6 +21,7 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
+#include <sstream>
 
 namespace {
 
@@ -28,44 +29,91 @@ bool
 test01() {
   Variable x(0);
   Variable y(1);
+  Variable z(2);
 
-  TBD_Shape bd1(3);
-  TBD_Shape bd2(3);
+  std::stringstream s;
+  using namespace IO_Operators;
 
-  bd1.add_constraint(x <= 3);
-  bd1.add_constraint(x - y <= 4);
+  TBD_Shape bds(3, UNIVERSE);
 
-  bd2.add_constraint(x - y <= 5);
-  bd2.add_constraint(-y <= -2);
+  s << bds;
+  if (s.str() != "true")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
+  bds.add_constraint(x <= 3);
+
+  s << bds;
+  if (s.str() != "A <= 3")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(x - y <= 4);
+
+  s << bds;
+  if (s.str() != "A <= 3, A - B <= 4")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(-y <= -2);
+
+  s << bds;
+  if (s.str() != "A <= 3, B >= 2, A - B <= 4")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(x-z <= 0);
+
+  s << bds;
+  if (s.str() != "A <= 3, B >= 2, A - B <= 4, A - C <= 0")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
 
-  // FIXME!!!
   return true;
 }
 
 bool
 test02() {
-  Variable x(0);
-  Variable y(1);
+  std::stringstream s;
+  using namespace IO_Operators;
+
+  TBD_Shape bds1(0, EMPTY);
+
+  s << bds1;
+  if (s.str() != "false")
+    return false;
+  print_constraints(bds1, "*** bds1 ***");
+  s.str("");
+
+  TBD_Shape bds2(0, UNIVERSE);
+
+  s << bds2;
+  if (s.str() != "true")
+    return false;
+  print_constraints(bds2, "*** bds2 ***");
+  s.str("");
 
-  TBD_Shape bd1(0, EMPTY);
-  TBD_Shape bd2(3);
-  TBD_Shape bd3(3);
+  TBD_Shape bds3(1, EMPTY);
 
-  bd2.add_constraint(x - y <= 5);
-  bd2.add_constraint(-y <= -2);
+  s << bds3;
+  if (s.str() != "false")
+    return false;
+  print_constraints(bds3, "*** bds3 ***");
+  s.str("");
 
-  bd3.add_constraint(x <= 0);
-  bd3.add_constraint(-x <= -1);
-  bd3.add_constraint(y <= 3);
+  TBD_Shape bds4(1, UNIVERSE);
 
-  print_constraints(bd1, "*** bd1 ***");
-  print_constraints(bd2, "*** bd2 ***");
-  print_constraints(bd3, "*** bd3 ***");
+  s << bds4;
+  if (s.str() != "true")
+    return false;
+  print_constraints(bds4, "*** bds4 ***");
+  s.str("");
 
-  // FIXME!!!
   return true;
 }
 
diff --git a/tests/Box/Makefile.am b/tests/Box/Makefile.am
new file mode 100644
index 0000000..e1fa269
--- /dev/null
+++ b/tests/Box/Makefile.am
@@ -0,0 +1,304 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = CHECKER="$(CHECKER)"
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+# Tests that do not compile yet.
+#closure1
+
+# Tests that do not succeed yet (maybe even known result is wrong).
+#interval1 interval2
+
+ORIGINAL_TESTS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boxdifference1 \
+boxhull1 \
+cc76narrowing1 \
+cc76widening \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+frompartiallyreducedproduct1 \
+frompolyhedron1 \
+frompolyhedron2 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 \
+geomcovers1 \
+intersection1 \
+mapspacedims1 \
+max_min1 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+pointsetpowerset1 pointsetpowerset2 \
+relations1 relations2 relations3 relations4 \
+refinewithconstraint1 refinewithconstraint2 \
+refinewithconstraints1 \
+refinewithcongruences1 \
+removespacedims1 \
+timeelapse1 \
+topclosed1 \
+unconstrain1 \
+universe1 \
+writebox1
+
+DERIVED_TESTS = \
+nnc_frompolyhedron1
+
+ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DBOX_INSTANCE=rt_r_oc
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+run_tests.stamp: run_tests
+	+$(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCES=fl_r_oc
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCES=db_r_oc
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCES=ld_r_oc
+endif
+
+# NOTE: rt_r_oc must be the first in the list.
+INSTANCES = \
+rt_r_oc \
+$(LONG_DOUBLE_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(FLOAT_INSTANCES)
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+boxdifference1_SOURCES = boxdifference1.cc
+
+boxhull1_SOURCES = boxhull1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76widening_SOURCES = cc76widening.cc
+
+#closure1_SOURCES = closure1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+frompolyhedron2_SOURCES = frompolyhedron2.cc
+
+frompartiallyreducedproduct1_SOURCES = frompartiallyreducedproduct1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+#interval1_SOURCES = interval1.cc
+#interval2_SOURCES = interval2.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+max_min1_SOURCES = max_min1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+pointsetpowerset2_SOURCES = pointsetpowerset2.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraint2_SOURCES = refinewithconstraint2.cc
+
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+writebox1_SOURCES = writebox1.cc
+
+refinewithconstraints2_SRCS = refinewithconstraints2.cc
+
+if BUILD_WATCHDOG_LIBRARY
+WATCHDOG_TESTS = refinewithconstraints2
+
+refinewithconstraints2_SOURCES = $(refinewithconstraints2_SRCS)
+refinewithconstraints2_CPPFLAGS = \
+$(AM_CPPFLAGS) \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src
+refinewithconstraints2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+
+endif BUILD_WATCHDOG_LIBRARY
+
+#
+# Sources and compilation flags for the derived check programs
+#
+
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+
+nnc_frompolyhedron1_SOURCES = frompolyhedron1.cc
+nnc_frompolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+BUGS =
+
+check_PROGRAMS = $(ALL_TESTS) $(BUGS)
+
+EXTRA_DIST = $(refinewithconstraints2_SRCS)
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+DISTCLEANFILES = \
+run_tests.stamp
diff --git a/tests/Box/Makefile.in b/tests/Box/Makefile.in
new file mode 100644
index 0000000..94fd3d1
--- /dev/null
+++ b/tests/Box/Makefile.in
@@ -0,0 +1,1598 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5)
+subdir = tests/Box
+DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
+	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+	affinepreimage1$(EXEEXT) ascii_dump_load1$(EXEEXT) \
+	bgp99extrapolation1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) boundedaffineimage1$(EXEEXT) \
+	boundedaffinepreimage1$(EXEEXT) boxdifference1$(EXEEXT) \
+	boxhull1$(EXEEXT) cc76narrowing1$(EXEEXT) \
+	cc76widening$(EXEEXT) concatenate1$(EXEEXT) \
+	congruences1$(EXEEXT) constrains1$(EXEEXT) \
+	constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+	disjoint1$(EXEEXT) empty1$(EXEEXT) equality1$(EXEEXT) \
+	expandspacedim1$(EXEEXT) foldspacedims1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgensys1$(EXEEXT) \
+	fromgrid1$(EXEEXT) frompartiallyreducedproduct1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) frompolyhedron2$(EXEEXT) \
+	fromspacedim1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) geomcovers1$(EXEEXT) \
+	intersection1$(EXEEXT) mapspacedims1$(EXEEXT) \
+	max_min1$(EXEEXT) maxspacedim1$(EXEEXT) membytes1$(EXEEXT) \
+	minconstraints1$(EXEEXT) pointsetpowerset1$(EXEEXT) \
+	pointsetpowerset2$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) relations4$(EXEEXT) \
+	refinewithconstraint1$(EXEEXT) refinewithconstraint2$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) \
+	refinewithcongruences1$(EXEEXT) removespacedims1$(EXEEXT) \
+	timeelapse1$(EXEEXT) topclosed1$(EXEEXT) unconstrain1$(EXEEXT) \
+	universe1$(EXEEXT) writebox1$(EXEEXT)
+am__EXEEXT_2 = nnc_frompolyhedron1$(EXEEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am__EXEEXT_3 =  \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	refinewithconstraints2$(EXEEXT)
+am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+am__EXEEXT_5 =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boxdifference1_OBJECTS = boxdifference1.$(OBJEXT)
+boxdifference1_OBJECTS = $(am_boxdifference1_OBJECTS)
+boxdifference1_LDADD = $(LDADD)
+boxdifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boxhull1_OBJECTS = boxhull1.$(OBJEXT)
+boxhull1_OBJECTS = $(am_boxhull1_OBJECTS)
+boxhull1_LDADD = $(LDADD)
+boxhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76widening_OBJECTS = cc76widening.$(OBJEXT)
+cc76widening_OBJECTS = $(am_cc76widening_OBJECTS)
+cc76widening_LDADD = $(LDADD)
+cc76widening_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equality1_OBJECTS = equality1.$(OBJEXT)
+equality1_OBJECTS = $(am_equality1_OBJECTS)
+equality1_LDADD = $(LDADD)
+equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompartiallyreducedproduct1_OBJECTS =  \
+	frompartiallyreducedproduct1.$(OBJEXT)
+frompartiallyreducedproduct1_OBJECTS =  \
+	$(am_frompartiallyreducedproduct1_OBJECTS)
+frompartiallyreducedproduct1_LDADD = $(LDADD)
+frompartiallyreducedproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron2_OBJECTS = frompolyhedron2.$(OBJEXT)
+frompolyhedron2_OBJECTS = $(am_frompolyhedron2_OBJECTS)
+frompolyhedron2_LDADD = $(LDADD)
+frompolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_frompolyhedron1_OBJECTS =  \
+	nnc_frompolyhedron1-frompolyhedron1.$(OBJEXT)
+nnc_frompolyhedron1_OBJECTS = $(am_nnc_frompolyhedron1_OBJECTS)
+nnc_frompolyhedron1_LDADD = $(LDADD)
+nnc_frompolyhedron1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_frompolyhedron1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_pointsetpowerset1_OBJECTS = pointsetpowerset1.$(OBJEXT)
+pointsetpowerset1_OBJECTS = $(am_pointsetpowerset1_OBJECTS)
+pointsetpowerset1_LDADD = $(LDADD)
+pointsetpowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset2_OBJECTS = pointsetpowerset2.$(OBJEXT)
+pointsetpowerset2_OBJECTS = $(am_pointsetpowerset2_OBJECTS)
+pointsetpowerset2_LDADD = $(LDADD)
+pointsetpowerset2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraint1_OBJECTS = refinewithconstraint1.$(OBJEXT)
+refinewithconstraint1_OBJECTS = $(am_refinewithconstraint1_OBJECTS)
+refinewithconstraint1_LDADD = $(LDADD)
+refinewithconstraint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraint2_OBJECTS = refinewithconstraint2.$(OBJEXT)
+refinewithconstraint2_OBJECTS = $(am_refinewithconstraint2_OBJECTS)
+refinewithconstraint2_LDADD = $(LDADD)
+refinewithconstraint2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am__refinewithconstraints2_SOURCES_DIST = refinewithconstraints2.cc
+am__objects_1 =  \
+	refinewithconstraints2-refinewithconstraints2.$(OBJEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_refinewithconstraints2_OBJECTS =  \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(am__objects_1)
+refinewithconstraints2_OBJECTS = $(am_refinewithconstraints2_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+ at BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_DEPENDENCIES =  \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(am__DEPENDENCIES_1) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations4_OBJECTS = relations4.$(OBJEXT)
+relations4_OBJECTS = $(am_relations4_OBJECTS)
+relations4_LDADD = $(LDADD)
+relations4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writebox1_OBJECTS = writebox1.$(OBJEXT)
+writebox1_OBJECTS = $(am_writebox1_OBJECTS)
+writebox1_LDADD = $(LDADD)
+writebox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affinepreimage1_SOURCES) $(ascii_dump_load1_SOURCES) \
+	$(bgp99extrapolation1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(boxdifference1_SOURCES) \
+	$(boxhull1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(cc76widening_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(frompartiallyreducedproduct1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(frompolyhedron2_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) $(geomcovers1_SOURCES) \
+	$(intersection1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(membytes1_SOURCES) $(minconstraints1_SOURCES) \
+	$(nnc_frompolyhedron1_SOURCES) $(pointsetpowerset1_SOURCES) \
+	$(pointsetpowerset2_SOURCES) $(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraint2_SOURCES) \
+	$(refinewithconstraints1_SOURCES) \
+	$(refinewithconstraints2_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(relations4_SOURCES) $(removespacedims1_SOURCES) \
+	$(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(writebox1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affinepreimage1_SOURCES) $(ascii_dump_load1_SOURCES) \
+	$(bgp99extrapolation1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(boxdifference1_SOURCES) \
+	$(boxhull1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(cc76widening_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(frompartiallyreducedproduct1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(frompolyhedron2_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) $(geomcovers1_SOURCES) \
+	$(intersection1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(membytes1_SOURCES) $(minconstraints1_SOURCES) \
+	$(nnc_frompolyhedron1_SOURCES) $(pointsetpowerset1_SOURCES) \
+	$(pointsetpowerset2_SOURCES) $(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraint2_SOURCES) \
+	$(refinewithconstraints1_SOURCES) \
+	$(am__refinewithconstraints2_SOURCES_DIST) \
+	$(relations1_SOURCES) $(relations2_SOURCES) \
+	$(relations3_SOURCES) $(relations4_SOURCES) \
+	$(removespacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(unconstrain1_SOURCES) \
+	$(universe1_SOURCES) $(writebox1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = CHECKER="$(CHECKER)"
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# Tests that do not compile yet.
+#closure1
+
+# Tests that do not succeed yet (maybe even known result is wrong).
+#interval1 interval2
+ORIGINAL_TESTS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boxdifference1 \
+boxhull1 \
+cc76narrowing1 \
+cc76widening \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+frompartiallyreducedproduct1 \
+frompolyhedron1 \
+frompolyhedron2 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 \
+geomcovers1 \
+intersection1 \
+mapspacedims1 \
+max_min1 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+pointsetpowerset1 pointsetpowerset2 \
+relations1 relations2 relations3 relations4 \
+refinewithconstraint1 refinewithconstraint2 \
+refinewithconstraints1 \
+refinewithcongruences1 \
+removespacedims1 \
+timeelapse1 \
+topclosed1 \
+unconstrain1 \
+universe1 \
+writebox1
+
+DERIVED_TESTS = \
+nnc_frompolyhedron1
+
+ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DBOX_INSTANCE=rt_r_oc
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCES = fl_r_oc
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCES = db_r_oc
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCES = ld_r_oc
+
+# NOTE: rt_r_oc must be the first in the list.
+INSTANCES = \
+rt_r_oc \
+$(LONG_DOUBLE_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(FLOAT_INSTANCES)
+
+
+#
+# Sources for the tests
+#
+addconstraints1_SOURCES = addconstraints1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+boxdifference1_SOURCES = boxdifference1.cc
+boxhull1_SOURCES = boxhull1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76widening_SOURCES = cc76widening.cc
+
+#closure1_SOURCES = closure1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+frompolyhedron2_SOURCES = frompolyhedron2.cc
+frompartiallyreducedproduct1_SOURCES = frompartiallyreducedproduct1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+geomcovers1_SOURCES = geomcovers1.cc
+intersection1_SOURCES = intersection1.cc
+
+#interval1_SOURCES = interval1.cc
+#interval2_SOURCES = interval2.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+max_min1_SOURCES = max_min1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+pointsetpowerset2_SOURCES = pointsetpowerset2.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraint2_SOURCES = refinewithconstraint2.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+removespacedims1_SOURCES = removespacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+writebox1_SOURCES = writebox1.cc
+refinewithconstraints2_SRCS = refinewithconstraints2.cc
+ at BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = refinewithconstraints2
+ at BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_SOURCES = $(refinewithconstraints2_SRCS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_CPPFLAGS = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(AM_CPPFLAGS) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog/src
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+
+#
+# Sources and compilation flags for the derived check programs
+#
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+nnc_frompolyhedron1_SOURCES = frompolyhedron1.cc
+nnc_frompolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+BUGS = 
+EXTRA_DIST = $(refinewithconstraints2_SRCS)
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+DISTCLEANFILES = \
+run_tests.stamp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Box/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Box/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f bgp99extrapolation1$(EXEEXT)
+	$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+boxdifference1$(EXEEXT): $(boxdifference1_OBJECTS) $(boxdifference1_DEPENDENCIES) 
+	@rm -f boxdifference1$(EXEEXT)
+	$(CXXLINK) $(boxdifference1_OBJECTS) $(boxdifference1_LDADD) $(LIBS)
+boxhull1$(EXEEXT): $(boxhull1_OBJECTS) $(boxhull1_DEPENDENCIES) 
+	@rm -f boxhull1$(EXEEXT)
+	$(CXXLINK) $(boxhull1_OBJECTS) $(boxhull1_LDADD) $(LIBS)
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) 
+	@rm -f cc76narrowing1$(EXEEXT)
+	$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+cc76widening$(EXEEXT): $(cc76widening_OBJECTS) $(cc76widening_DEPENDENCIES) 
+	@rm -f cc76widening$(EXEEXT)
+	$(CXXLINK) $(cc76widening_OBJECTS) $(cc76widening_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) 
+	@rm -f equality1$(EXEEXT)
+	$(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) 
+	@rm -f fromgensys1$(EXEEXT)
+	$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+frompartiallyreducedproduct1$(EXEEXT): $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_DEPENDENCIES) 
+	@rm -f frompartiallyreducedproduct1$(EXEEXT)
+	$(CXXLINK) $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_LDADD) $(LIBS)
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+frompolyhedron2$(EXEEXT): $(frompolyhedron2_OBJECTS) $(frompolyhedron2_DEPENDENCIES) 
+	@rm -f frompolyhedron2$(EXEEXT)
+	$(CXXLINK) $(frompolyhedron2_OBJECTS) $(frompolyhedron2_LDADD) $(LIBS)
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) 
+	@rm -f fromspacedim1$(EXEEXT)
+	$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) 
+	@rm -f geomcovers1$(EXEEXT)
+	$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+nnc_frompolyhedron1$(EXEEXT): $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_DEPENDENCIES) 
+	@rm -f nnc_frompolyhedron1$(EXEEXT)
+	$(nnc_frompolyhedron1_LINK) $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_LDADD) $(LIBS)
+pointsetpowerset1$(EXEEXT): $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_DEPENDENCIES) 
+	@rm -f pointsetpowerset1$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_LDADD) $(LIBS)
+pointsetpowerset2$(EXEEXT): $(pointsetpowerset2_OBJECTS) $(pointsetpowerset2_DEPENDENCIES) 
+	@rm -f pointsetpowerset2$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset2_OBJECTS) $(pointsetpowerset2_LDADD) $(LIBS)
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) 
+	@rm -f refinewithconstraint1$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS)
+refinewithconstraint2$(EXEEXT): $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_DEPENDENCIES) 
+	@rm -f refinewithconstraint2$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_LDADD) $(LIBS)
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+refinewithconstraints2$(EXEEXT): $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_DEPENDENCIES) 
+	@rm -f refinewithconstraints2$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) 
+	@rm -f relations4$(EXEEXT)
+	$(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+writebox1$(EXEEXT): $(writebox1_OBJECTS) $(writebox1_DEPENDENCIES) 
+	@rm -f writebox1$(EXEEXT)
+	$(CXXLINK) $(writebox1_OBJECTS) $(writebox1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boxdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boxhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76widening.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompartiallyreducedproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebox1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+nnc_frompolyhedron1-frompolyhedron1.o: frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frompolyhedron1-frompolyhedron1.o -MD -MP -MF $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo -c -o nnc_frompolyhedron1-frompolyhedron1.o `test -f 'frompolyhedron1.cc' || echo '$(srcdir)/'`frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frompolyhedron1-frompolyhedron1.o `test -f 'frompolyhedron1.cc' || echo '$(srcdir)/'`frompolyhedron1.cc
+
+nnc_frompolyhedron1-frompolyhedron1.obj: frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frompolyhedron1-frompolyhedron1.obj -MD -MP -MF $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo -c -o nnc_frompolyhedron1-frompolyhedron1.obj `if test -f 'frompolyhedron1.cc'; then $(CYGPATH_W) 'frompolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/frompolyhedron1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frompolyhedron1-frompolyhedron1.obj `if test -f 'frompolyhedron1.cc'; then $(CYGPATH_W) 'frompolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/frompolyhedron1.cc'; fi`
+
+refinewithconstraints2-refinewithconstraints2.o: refinewithconstraints2.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT refinewithconstraints2-refinewithconstraints2.o -MD -MP -MF $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo -c -o refinewithconstraints2-refinewithconstraints2.o `test -f 'refinewithconstraints2.cc' || echo '$(srcdir)/'`refinewithconstraints2.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='refinewithconstraints2.cc' object='refinewithconstraints2-refinewithconstraints2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o refinewithconstraints2-refinewithconstraints2.o `test -f 'refinewithconstraints2.cc' || echo '$(srcdir)/'`refinewithconstraints2.cc
+
+refinewithconstraints2-refinewithconstraints2.obj: refinewithconstraints2.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT refinewithconstraints2-refinewithconstraints2.obj -MD -MP -MF $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo -c -o refinewithconstraints2-refinewithconstraints2.obj `if test -f 'refinewithconstraints2.cc'; then $(CYGPATH_W) 'refinewithconstraints2.cc'; else $(CYGPATH_W) '$(srcdir)/refinewithconstraints2.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='refinewithconstraints2.cc' object='refinewithconstraints2-refinewithconstraints2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o refinewithconstraints2-refinewithconstraints2.obj `if test -f 'refinewithconstraints2.cc'; then $(CYGPATH_W) 'refinewithconstraints2.cc'; else $(CYGPATH_W) '$(srcdir)/refinewithconstraints2.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am
+
+
+run_tests.stamp: run_tests
+	+$(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Box/addconstraints1.cc b/tests/Box/addconstraints1.cc
new file mode 100644
index 0000000..6761461
--- /dev/null
+++ b/tests/Box/addconstraints1.cc
@@ -0,0 +1,288 @@
+/* Test Box::add_constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 5);
+
+  TBox box(2);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.add_constraint(B - A <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::add_constraint: it is illegal
+    // to add a constraint with bigger dimension.
+    box.add_constraint(x <= 0);
+    box.add_constraint(y - x + z >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_constraints(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    box.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    box.add_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    box.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.add_constraints(cs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.add_recycled_constraints(cs);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.add_recycled_constraints(cs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 4);
+
+  TBox box(2);
+  box.add_constraints(cs);
+  bool ok = box.is_empty();
+
+  Rational_Box known_result(2, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+  cs.insert(A + 3 <= 2);
+
+  TBox box(2);
+  box.add_recycled_constraints(cs);
+  bool ok = box.is_empty();
+
+  Rational_Box known_result(2, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Box/addspacedims1.cc b/tests/Box/addspacedims1.cc
new file mode 100644
index 0000000..cb9ffaf
--- /dev/null
+++ b/tests/Box/addspacedims1.cc
@@ -0,0 +1,333 @@
+/* Test Box::add_space_dimensions_and_embed():
+   we add two variables to a Box.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_embed(2);
+  box.add_constraint(z <= 2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.add_space_dimensions_and_embed(2) "
+                    "and box.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1(0, EMPTY);
+  TBox box2(1, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.add_space_dimensions_and_embed(2);
+  box2.add_space_dimensions_and_embed(1);
+
+  bool ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(box2, "*** box2.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box(0, UNIVERSE);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_embed(3);
+
+  Rational_Box known_result(3, UNIVERSE);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimension_and_embed(3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(4);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(C - B >= 9);
+
+  Rational_Box known_result(box);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(0);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(0) ***");
+
+  bool ok = check_result(box, known_result);
+
+  return ok;
+}
+
+bool
+test06() {
+  //Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(1);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(3);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBox box(10, UNIVERSE);
+
+  box.remove_higher_space_dimensions(5);
+  box.add_space_dimensions_and_embed(6);
+
+  return box == TBox(11, UNIVERSE);
+}
+
+bool
+test08() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBox box(2);
+  box.add_constraint(x <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(z == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TBox box1(0, EMPTY);
+  TBox box2(1, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.add_space_dimensions_and_project(2);
+  box2.add_space_dimensions_and_project(1);
+
+  bool ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1.add_space_dimensions_and_project(2) ***");
+  print_constraints(box2, "*** box2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TBox box(0, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(3);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimension_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(4);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 2);
+
+  TBox box2(box1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.add_space_dimensions_and_project(0);
+  box1.add_space_dimensions_and_embed(0);
+
+  bool ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1.add_space_dimensions_and_project(0) ***");
+  print_constraints(box2, "*** box2.add_space_dimensions_and_embed(0) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 2);
+
+  TBox box(cs);
+
+  print_constraints(box, "*** box ***");
+
+  box.minimized_constraints();
+  box.add_space_dimensions_and_embed(3);
+  box.add_constraint(z <= 2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(box, known_result) ;
+
+  print_constraints(box,
+                    "*** box.add_space_dimensions_and_embed(2) "
+                    "and box.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Box/affinedimension1.cc b/tests/Box/affinedimension1.cc
new file mode 100644
index 0000000..25235d5
--- /dev/null
+++ b/tests/Box/affinedimension1.cc
@@ -0,0 +1,291 @@
+/* Test Box::affine_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of `box' is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A <= 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 5);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A == 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 4);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 3);
+  box.add_constraint(-B <= 2);
+  box.add_constraint(B <= -2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 1);
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A <= 1);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B == 0);
+  box.add_constraint(C == 7);
+  box.add_constraint(D <= 9);
+  box.add_constraint(-D <= -9);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A == 1);
+  box.add_constraint(E == 1);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(7, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+   bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test11() {
+  TBox box(0, UNIVERSE);
+
+  const dimension_type affine_dim = box.affine_dimension();
+
+  print_constraints(box, "*** box ***");
+
+  return (affine_dim == 0);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
+
+
diff --git a/tests/Box/affineimage1.cc b/tests/Box/affineimage1.cc
new file mode 100644
index 0000000..ee0bca4
--- /dev/null
+++ b/tests/Box/affineimage1.cc
@@ -0,0 +1,437 @@
+/* Test Box::affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, B);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B <= 4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, B) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(A - B <= 3);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, A + 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A - B <= 7);
+  known_result.add_constraint(A <= 6);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, A + 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(A - B <= 3);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, Linear_Expression(4));
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A == 4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(A - B <= 3);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.affine_image(A, A);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, A) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(A - B <= 3);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, 2*A - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, 2*A - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(B, 2*A, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(B, 2*A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(B, 3*A + 3, 3);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(B, 3*A + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B <= 2);
+  box.add_constraint(B >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, -2*A - 3*B + 1, -5);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(5*A >= -4);
+  known_result.add_constraint(5*A <= 7);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = check_result(box, known_result, "1.08e-7", "9.62e-8", "9.54e-8");
+
+  print_constraints(box, "*** box.affine_image(A, -2*A - 3*B + 1, -5) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 2);
+  box.add_constraint(C >= 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(C, A + 2*B -3*C + 2, 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(2*C <= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(C, A + 2*B -3*C + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 2);
+  box.add_constraint(B >= 1);
+  box.add_constraint(C <= 0);
+  box.add_constraint(D == 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, -B + 2*C + 1, -3);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C <= 0);
+  known_result.add_constraint(D == 3);
+  known_result.add_constraint(3*B - 3*A <= 5);
+
+  bool ok = check_result(box, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+  print_constraints(box, "*** box.affine_image(A, -B + 2*C + 1, -3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, 2*B + C + 2, 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, 2*B + C + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A - B >= 0);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 2);
+
+  Linear_Expression coeff1 = A + 1;
+
+  try {
+    // This is an incorrect use of method
+    // Box::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    box.affine_image(A, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(1);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    box.affine_image(B, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    box.affine_image(B, A + C + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A - B >= 0);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 2);
+
+  Linear_Expression coeff1 = 2*A + 1;
+
+  try {
+    // This is an incorrect use of method
+    // Box::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    box.affine_image(A, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/affinepreimage1.cc b/tests/Box/affinepreimage1.cc
new file mode 100644
index 0000000..5bf6b16
--- /dev/null
+++ b/tests/Box/affinepreimage1.cc
@@ -0,0 +1,181 @@
+/* Test Box::affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(x - y <= 3);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(x, y);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A - B - 3 >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(A, B-1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(A, B-1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(A, 2*A + 2, 2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(B, Linear_Expression(3));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(B, 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::affine_preimage(v, expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    box.affine_preimage(x, x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::affine_preimage(v, expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the box.
+    box.affine_preimage(y, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/ascii_dump_load1.cc b/tests/Box/ascii_dump_load1.cc
new file mode 100644
index 0000000..3a127fa
--- /dev/null
+++ b/tests/Box/ascii_dump_load1.cc
@@ -0,0 +1,252 @@
+/* Test Box::ascii_dump() and Box::ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-EUP");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 1);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-EM");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-UN");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= -10);
+  box.add_constraint(A <= 10);
+  box.add_constraint(B >= 3);
+  box.add_constraint(B <= 6);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "lower");
+  f.seekp(0, ios_base::cur);
+  f << "Z(";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 2);
+  box1.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = box2.ascii_load(f);
+  close(f);
+
+  if (!ok) {
+    nout << "ascii_load() failed" << endl;
+    return false;
+  }
+
+  ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(3*A + C == 5);
+  TBox box1(cs);
+
+  print_constraints(box1, "*** box1(cs) ***");
+
+  box1.difference_assign(box1);
+
+  print_constraints(box1, "*** box1.difference_assign(box1) ***");
+
+  box1.concatenate_assign(box1);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box1) ***");
+
+  nout << "box1.space_dimension() = " << box1.space_dimension() << endl;
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = box2.ascii_load(f);
+  close(f);
+
+  if (!ok) {
+    nout << "ascii_load() failed" << endl;
+    return false;
+  }
+
+  ok = (box1 == box2);
+
+  nout << "box2.space_dimension() = " << box2.space_dimension() << endl;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+//   DO_TEST(test01);
+//   DO_TEST(test02);
+//   DO_TEST(test03);
+  DO_TEST(test04);
+//  DO_TEST(test05);
+//   DO_TEST(test06);
+//   DO_TEST(test07);
+END_MAIN
diff --git a/tests/Box/bgp99extrapolation1.cc b/tests/Box/bgp99extrapolation1.cc
new file mode 100644
index 0000000..0aca378
--- /dev/null
+++ b/tests/Box/bgp99extrapolation1.cc
@@ -0,0 +1,94 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  typedef Pointset_Powerset<TBox> Box_Set;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(-A + B >= 2);
+  box1.add_constraint(A - B >= -4);
+  box1.add_constraint(A >= 0);
+  TBox box2(2);
+  box2.add_constraint(-A + B >= 3);
+  box2.add_constraint(A - B >= -8);
+  box2.add_constraint(A >= 1);
+  TBox box3(2);
+  box3.add_constraint(-A + B >= 4);
+  box3.add_constraint(A - B >= -12);
+  box3.add_constraint(A >= 2);
+  TBox box4(2);
+  box4.add_constraint(-A + B >= 6);
+  box4.add_constraint(A - B >= -16);
+  box4.add_constraint(A >= 3);
+
+  Box_Set box_set1(2, EMPTY);
+  box_set1.add_disjunct(box1);
+  box_set1.add_disjunct(box2);
+  box_set1.add_disjunct(box3);
+
+  Box_Set box_set2(box_set1);
+  box_set1.add_disjunct(box4);
+
+  using namespace IO_Operators;
+  nout << "*** box_set1 ***" << endl
+       << box_set1 << endl;
+  nout << "*** box_set2 ***" << endl
+       << box_set2 << endl;
+
+  TBox box5(2);
+  box5.add_constraint(-A + B >= 4);
+  box5.add_constraint(A >= 2);
+  box5.add_constraint(B >= 6);
+
+  Box_Set known_result(2, EMPTY);
+  known_result.add_disjunct(box1);
+  known_result.add_disjunct(box2);
+  known_result.add_disjunct(box5);
+
+  typedef void (TBox::*Widening_Member)(const TBox&, unsigned*);
+  Widening_Member wm = &TBox::CC76_widening_assign;
+  box_set1.BGP99_extrapolation_assign(box_set2, widen_fun_ref(wm), 3);
+
+  bool ok = box_set1.geometrically_equals(known_result);
+
+  nout
+    << "*** box_set1.BGP99_extrapolation_assign"
+    << "(box_set2, widen_fun_ref(&CC76_widening_assign), 3) ***"
+    << endl
+    << box_set1 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/bhz03widening1.cc b/tests/Box/bhz03widening1.cc
new file mode 100644
index 0000000..efeec9a
--- /dev/null
+++ b/tests/Box/bhz03widening1.cc
@@ -0,0 +1,78 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  typedef Pointset_Powerset<TBox> PSet;
+
+  TBox p(2);
+  TBox q(2);
+  TBox r(2);
+  TBox s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  PSet P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  PSet Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  using namespace IO_Operators;
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  PSet old_P = P;
+  typedef void (TBox::*Widening_Member)(const TBox&, unsigned*);
+  Widening_Member wm = &TBox::CC76_widening_assign;
+  // FIXME: provide a widening certificate for CC76.
+  P.BHZ03_widening_assign<H79_Certificate>(Q, widen_fun_ref(wm));
+
+  nout << "P.BHZ03(Q, CC76)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/bounded1.cc b/tests/Box/bounded1.cc
new file mode 100644
index 0000000..2537f17
--- /dev/null
+++ b/tests/Box/bounded1.cc
@@ -0,0 +1,96 @@
+/* Test Box::is_bounded().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  // This is a non-bounded box.
+  TBox box(2);
+  box.add_constraint(x >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  return !box.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded box (it is a square);
+  TBox box(2);
+  box.add_constraint(x >= 2);
+  box.add_constraint(y >= 2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+bool
+test03() {
+  // This is a universal, zero-dimensional box.
+  TBox box;
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+bool
+test04() {
+  // This is an empty, zero-dimensional box.
+  TBox box;
+  box.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+bool
+test05() {
+  // This is an empty box.
+  TBox box(4, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Box/boundedaffineimage1.cc b/tests/Box/boundedaffineimage1.cc
new file mode 100644
index 0000000..841518f
--- /dev/null
+++ b/tests/Box/boundedaffineimage1.cc
@@ -0,0 +1,515 @@
+/* Test Box::bounded_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Affine image variable is neither expression, denominator 1.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, y, y);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(x, y, y) ***");
+
+  return ok;
+}
+
+// Affine image variable is in neither ub_expr nor lb_expr, negative
+// denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(B, "
+                        "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+// Affine image variable is in lb_expr but not ub_expr, negative denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(C, 3*D - E, 2*C + 1, -5);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(C, "
+                        "3*D - E, 2*C + 1, -5) ***");
+
+  return ok;
+}
+
+// Affine image variable is in ub_expr but not lb_expr, positive denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(B, -B - 2, 7*D - E + 5, 3);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(B, "
+                        "-B - 2, 7*D - E + 5, 3) ***");
+
+  return ok;
+}
+
+// Affine image variable is in ub_expr but not lb_expr, negative denominator.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable F(5);
+
+  TBox box(6);
+  box.add_constraint(A <= 4);
+  box.add_constraint(A >= -6);
+  box.add_constraint(B == 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(A, -A - 3, B - C + 6*D + F, -1);
+
+  Rational_Box known_result(6);
+  known_result.add_constraint(A >= -3);
+  known_result.add_constraint(B == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(A, "
+                        "-A - 3, B - C + 6*D + F, -1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, -2*x+y+1, -2*x+y+1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, negative denominator.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+  ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(x >= -3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+  print_constraints(ph,
+                    "*** ph.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, lower is open.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x > 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x < 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum, negative denominator.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(3*x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  box.bounded_affine_image(x, x + 4, x + 4, -1);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(3*x >= -14);
+
+  bool ok = check_result(box, known_result, "3.18e-7", "3.18e-7", "3.18e-7");
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image("
+                    "x, x + 4, x + 4, -1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value (which is open) but the lb_expr has no minimum.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(3*x < 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  box.bounded_affine_image(x, x + 4, x + 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(3*x < 14);
+
+  bool ok = check_result(box, known_result, "3.18e-7", "3.18e-7", "3.18e-7");
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, x + 4, x + 4) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is closed
+// and the affine image has a denominator > 1.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(y, 2*x, 2*x, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(y, 2*x, 2*x, 2) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is not closed
+// and the affine image has a denominator > 1.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x < 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, 2*x - 2, 2*x - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x < 1);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, 2*x-2, 2*x-2, 2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_image(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_image(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    box.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_epxr, d): it is illegal to
+    // apply the method to a variable that is not in the space of
+    // the polyhedron.
+    box.bounded_affine_image(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+
+  TBox box(1);
+
+  print_constraints(box, "*** box ***");
+  box.bounded_affine_image(x, 3*x, 3*x);
+
+  Rational_Box known_result(1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, 3*x, 3*x) ***");
+
+  return ok;
+
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test09, TBox);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test10, TBox);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Box/boundedaffinepreimage1.cc b/tests/Box/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..60f9875
--- /dev/null
+++ b/tests/Box/boundedaffinepreimage1.cc
@@ -0,0 +1,518 @@
+/* Test Box::bounded_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Affine image variable is neither expression, denominator 1.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(x, y, y+1);
+  ph.bounded_affine_preimage(x, y, y+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(x, y, y+1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph.bounded_affine_preimage("
+                    "x, y, y+1)) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in the lb_expr but not the ub_expr;
+// negative denominator.
+
+// Illustrates where, when the corresponding polyhedron (still with
+// non-relational constraints) is used to compute the
+// transformation, we get more precise results.  This is due to the
+// relational constraint obtained from comparing the lhs expression
+// with the rhs expression.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(B <= 0);
+  box.add_constraint(B >= -2);
+  box.add_constraint(C <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+  ph.bounded_affine_preimage(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(C <= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_preimage(B, "
+                    "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph.bounded_affine_preimage(B, "
+                    "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3)) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in lb_expr but not ub_expr, negative
+// denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C == 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(C, 3*D - E, 2*C + 1, -5);
+  ph.bounded_affine_preimage(C, 3*D - E, 2*C + 1, -5);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(C, "
+                    "3*D - E, 2*C + 1, -5) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage(C, "
+                    "3*D - E, 2*C + 1, -5) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in ub_expr but not lb_expr, positive
+// denominator and negative coefficient for the transformed variable.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 15);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(B, -B - 2, 7*D - E + 5, 3);
+  ph.bounded_affine_preimage(B, -B - 2, 7*D - E + 5, 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(B, "
+                    "-B - 2, 7*D - E + 5, 3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage(B, "
+                    "-B - 2, 7*D - E + 5, 3) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in ub_expr but not lb_expr, negative
+// denominator and negative coefficient for the transformed variable.
+bool
+test05() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A <= 4);
+  box.add_constraint(A >= -6);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(A, A - 3, A, -1);
+  ph.bounded_affine_preimage(A, A - 3, A, -1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(A, "
+                    "A - 3, A, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage(A, "
+                    "A - 3, A, -1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, and negative coefficient for the
+// transformed variable.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(x, -2*x + 1, -2*x + 2);
+  ph.bounded_affine_preimage(x, -2*x + 1, -2*x + 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -2*x+1, -2*x+2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -2*x+1, -2*x+2) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, negative denominator.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, x + y, x + y, -1);
+  ph.bounded_affine_preimage(x, x + y, x + y, -1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, lower bound is open.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x > 0);
+  box.add_constraint(y <= 3);
+  box.add_constraint(y >= -8);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, -2*x + y, -2*x + 2*y + 1);
+  ph.bounded_affine_preimage(x, -2*x + y, -2*x + 2*y + 1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -2*x+y, -2*x+2*y+1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -2*x+y, -2*x+2*y+1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum, negative denominator.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(10*x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, x + 5, x + 4, -1);
+  ph.bounded_affine_preimage(x, x + 5, x + 4, -1);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "2.84e-07", "2.84e-07", "2.84e-07");
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, x + 5, x + 4, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, x + 5, x + 4, -1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has
+// a maximum value (which is open) but the lb_expr has no minimum
+// Negative coefficient for the transformed variable and negative
+// denominator.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x < 2);
+  box.add_constraint(x > 0);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, -x + 5, -x + 4, -1);
+  ph.bounded_affine_preimage(x, -x + 5, -x + 4, -1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -x + 5, x + 4, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -x + 5, x + 4, -1) ***");
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is closed
+// and the affine preimage has a denominator > 1.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_preimage(y, 2*x, 2*x, 2);
+  ph.bounded_affine_preimage(y, 2*x, 2*x, 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "y, 2*x, 2*x, 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "y, 2*x, 2*x, 2) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is not closed
+// and the affine preimage has a denominator > 1.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x < 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, 2*x - 2, 5*x + 2, 2);
+  ph.bounded_affine_preimage(x, 2*x - 2, 5*x + 2, 2);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "3.98e-08", "3.98e-08", "3.98e-08");
+
+  print_constraints(box,
+                    "*** box .bounded_affine_preimage("
+                    "x, 2*x-2, 5*x+2, 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, 2*x-2, 5*x+2, 2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is
+    // illegal to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_preimage(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_preimage(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    box.bounded_affine_preimage(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_epxr, d): it is illegal to
+    // apply the method to a variable that is not in the space of
+    // the polyhedron.
+    box.bounded_affine_preimage(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+DO_TEST(test01);
+DO_TEST(test02);
+DO_TEST(test03);
+DO_TEST(test04);
+DO_TEST(test05);
+DO_TEST(test06);
+DO_TEST(test07);
+DO_TEST(test08);
+DO_TEST_MAY_OVERFLOW_IF_INEXACT(test09, TBox);
+DO_TEST(test10);
+DO_TEST(test11);
+DO_TEST(test12);
+DO_TEST(test13);
+DO_TEST(test14);
+DO_TEST(test15);
+DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/boxdifference1.cc b/tests/Box/boxdifference1.cc
new file mode 100644
index 0000000..393f2cc
--- /dev/null
+++ b/tests/Box/boxdifference1.cc
@@ -0,0 +1,457 @@
+/* Test Box::box_difference_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Difference of an empty with a non-empty box.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= -2);
+  print_constraints(box1, "*** box1 ***");
+  box1.add_constraint(B == 0);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 0);
+  box2.add_constraint(A <= 2);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** ph2 ***");
+
+  box1.box_difference_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+// Difference of a non-empty with an empty box.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 2);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** ph2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.box_difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test03() {
+  TBox box1;
+  TBox box2;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_difference_assign(box2);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-4) >= 0);
+  Rational_Box known_result(cs);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Intersecting rectangles; difference leaves the original box unchanged.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y <= 5);
+  box1.add_constraint(y >= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(x >= 1);
+  box2.add_constraint(y <= 4);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_difference_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 5);
+  known_result.add_constraint(y >= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Both are rectangles, second strictly included in first;
+// so the first box is unchanged.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 8);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(y >= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(x >= 1);
+  box2.add_constraint(y <= 0);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.box_difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Both rectangles; original box unchanged.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 8);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(y >= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 9);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(y <= 8);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_difference_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Unbounded boxes in 3D; original box is unchanged.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 8);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(z <= 2);
+
+  TBox box2(3);
+  box2.add_constraint(x == 8);
+  box2.add_constraint(y <= 2);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_difference_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 8);
+  known_result.add_constraint(y <= 7);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Both closed rectangles; the difference makes the first strictly smaller.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 2);
+  box2.add_constraint(A <= 4);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.box_difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Both rectangles; difference removes an open section of the original box.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A > 2);
+  box2.add_constraint(A <= 8);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.box_difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Both rectangles; difference removes a closed section of the original box.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 2);
+  box2.add_constraint(A <= 8);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.box_difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= -2);
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** ph2 ***");
+
+  box1.box_difference_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+// Find difference of a rectangle and a boundary edge.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A == 4);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.box_difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.box_difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Different number of dimensions.
+bool
+test13() {
+  TBox box1(3);
+  TBox box2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Box::box_difference_assign(box2): it is impossible to apply
+    // this method to two boxes of different dimensions.
+    box1.box_difference_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Box/boxhull1.cc b/tests/Box/boxhull1.cc
new file mode 100644
index 0000000..26b43a2
--- /dev/null
+++ b/tests/Box/boxhull1.cc
@@ -0,0 +1,265 @@
+/* Test Box::box_hull_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBox box1(5);
+  box1.add_constraint(x1 <= 5);
+  box1.add_constraint(x2 <= -1);
+  box1.add_constraint(x1 -x2 <= 10);
+
+  TBox box2(5);
+  box2.add_constraint(x1  <= 2);
+  box2.add_constraint(x4 <= 7);
+  box2.add_constraint(x1 - x2 <= 20);
+  box2.add_constraint(x4 - x3 <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_hull_assign(box2);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(x1 <= 5);
+  known_result.add_constraint(x1 - x2 <= 20);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.box_hull_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(-x <= -1);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(-y <= -1);
+  box1.add_constraint(x - y <= 1);
+
+  TBox box2(3);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(-y <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_hull_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y >= -5);
+  known_result.add_constraint(x >= -4);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(x - y <= 8);
+  known_result.add_constraint(y - x <= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.box_hull_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(-x <= -1);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(-y <= -1);
+  box1.add_constraint(x - y <= 1);
+
+  TBox box2(2);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(x >= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.box_hull_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.box_hull_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(A >= 1);
+  box1.add_constraint(B <= 3);
+  box1.add_constraint(-B <= -1);
+  box1.add_constraint(A - B <= 1);
+
+  TBox box2(2);
+  box2.add_constraint(B - A <= -1);
+  box2.add_constraint(A <= 3);
+  box2.add_constraint(-B <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_hull_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= -5);
+  known_result.add_constraint(A >= -4);
+  known_result.add_constraint(B <= 3);
+  known_result.add_constraint(A - B <= 8);
+  known_result.add_constraint(B - A <= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.box_hull_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box1(12);
+  TBox box2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Box::box_hull_assign(box2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    box1.box_hull_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= y);
+
+  TBox box2(3);
+
+  try {
+    // This is an invalid use of method
+    // Box::box_hull_assign(box2): it is illegal
+    // to apply the method to two polyhedra of different dimensions.
+    box1.box_hull_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBox box1(1);
+  box1.add_constraint(A <= 0);
+  box1.add_constraint(A >= 1);
+
+  TBox box2(1);
+  box2.add_constraint(A <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_hull_assign(box2);
+
+  Rational_Box known_result(1);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = check_result(box1, known_result) ;
+
+  print_constraints(box1, "*** box1.box_hull_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x1(0);
+
+  TBox box1(1);
+  box1.add_constraint(x1 <= 5);
+
+  TBox box2(1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.box_hull_assign(box2);
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+//   DO_TEST(test01);
+//   DO_TEST(test02);
+//   DO_TEST(test03);
+//   DO_TEST(test04);
+//   DO_TEST(test05);
+//   DO_TEST(test06);
+//   DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/cc76narrowing1.cc b/tests/Box/cc76narrowing1.cc
new file mode 100644
index 0000000..518dbed
--- /dev/null
+++ b/tests/Box/cc76narrowing1.cc
@@ -0,0 +1,208 @@
+/* Test Box::CC76_narrowing_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 1);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(-y <= 6);
+
+  TBox box2(3);
+  box2.add_constraint(-x <= 3);
+  box2.add_constraint(y <= 2);
+  box2.add_constraint(-y <= 5);
+  box2.add_constraint(x <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(-x <= 3);
+  known_result.add_constraint(-y <= 6);
+  known_result.add_constraint(y <= 7);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  box1.add_constraint(z <= 1);
+
+  TBox box2(4);
+  box2.add_constraint(-y <= 3);
+  box2.add_constraint(-x <= 2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(z <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(z <= 1);
+  known_result.add_constraint(-y <= 3);
+  known_result.add_constraint(-x <= 2);
+  known_result.add_constraint(x <= 3);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  TBox box2(3);
+
+  box1.add_constraint(z <= 1);
+  Rational_Box known_result(3, EMPTY);
+
+  box2.add_constraint(-y <= 3);
+  box2.add_constraint(x >= 4);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y - x <= 4);
+  box2.add_constraint(z <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(z <= 1);
+  box1.add_constraint(z >= 3);
+
+  TBox box2(3);
+  box2.add_constraint(-y <= 3);
+  box2.add_constraint(x >= 4);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y - x <= 4);
+  box2.add_constraint(z <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box1;
+  TBox box2(0, EMPTY);
+  Rational_Box known_result(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable y(1);
+
+  TBox box1(1);
+  TBox box2(2);
+
+  Constraint_System cs;
+  cs.insert(y >= 6);
+
+  try {
+    // This is an invalid use of the method
+    // Box::CC76_narrowing_assign(box2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    box2.CC76_narrowing_assign(box1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/cc76widening.cc b/tests/Box/cc76widening.cc
new file mode 100644
index 0000000..01e63bf
--- /dev/null
+++ b/tests/Box/cc76widening.cc
@@ -0,0 +1,86 @@
+/* Test Box::CC76_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(2);
+  box2.add_constraint(-x <= 3);
+  box2.add_constraint(x <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.CC76_widening_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(2);
+  box2.add_constraint(-x <= 3);
+  box2.add_constraint(x <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.widening_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/concatenate1.cc b/tests/Box/concatenate1.cc
new file mode 100644
index 0000000..19f6f75
--- /dev/null
+++ b/tests/Box/concatenate1.cc
@@ -0,0 +1,237 @@
+/* Test Box::concatenate_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  // Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  // Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TBox box1(6);
+  box1.add_constraint(x2 - x3 <= 0);
+  box1.add_constraint(x3 <= 2);
+  box1.add_constraint(x6 - x5 <= 2);
+  box1.add_constraint(x5 <= 3);
+
+  TBox box2(3);
+  box2.add_constraint(x2 - x3 <= 2);
+  box2.add_constraint(x3 <= 7);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(9);
+  known_result.add_constraint(x2 - x3 <= 0);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(x - y <= 4);
+
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.concatenate_assign(box1);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.concatenate_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x <= 0);
+  cs.insert(y == 3);
+  cs.insert(3*x - 3*y <= 5);
+
+  TBox box1(2);
+  box1.add_constraints(cs);
+
+  TBox box2(0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(y == 3);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(C >= 0);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 0);
+  box2.add_constraint(A <= 1);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 2);
+  box2.add_constraint(A - B <= 0);
+  box2.add_constraint(B - A <= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(E >= 0);
+  known_result.add_constraint(E <= 2);
+  known_result.add_constraint(D - E <= 0);
+  known_result.add_constraint(E - D <= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(x - y <= 4);
+
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+/* Concatenate an empty box to a universe */
+/*
+   This shows a bug in either concatenate_assign() or OK()
+   When executing box1.concatenate_assign(box2),
+   the assertion `box1.OK()' fails.
+*/
+bool
+test06() {
+  Variable x(0);
+
+  TBox box1(1);
+
+  TBox box2(1);
+  box2.add_constraint(x <= 0);
+  box2.add_constraint(x >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.OK();
+  box2.OK();
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/congruences1.cc b/tests/Box/congruences1.cc
new file mode 100644
index 0000000..de59b00
--- /dev/null
+++ b/tests/Box/congruences1.cc
@@ -0,0 +1,537 @@
+/* Test Box::Box(const Generator_System&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Universe Box constructed from empty congruences
+bool
+test01() {
+  Congruence_System cgs;
+  TBox box(cgs);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences and add_congruences()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  cgs.insert((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+  TBox box(cgs);
+
+  Rational_Box known_result(4);
+  known_result.add_congruences(cgs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// CHECKME: is this a duplicate of test03 ?
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.add_congruences(cgs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_recycled_congruences()
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  cgs.insert((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+  TBox box(4);
+  box.add_recycled_congruences(cgs);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(1*A + 2*B + 3*C + 4*D == 0);
+  known_result.add_constraint(2*A + 3*B + 4*C + 5*D == 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_recycled_congruences()
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.add_recycled_congruences(cgs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences; congruences().
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  // This inconsistent equality is ignored when congruences
+  // are added to the box.
+  cgs.insert((A + B %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B == 3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_congruences() for inconsistent equality congruences
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.add_congruences(cgs);
+  bool ok = box.is_empty();
+
+  Rational_Box known_result(3, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_congruence()
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_congruence((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  box.add_congruence((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// CHECKME: is this a duplicate test?
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_congruence((A %= 7) / 0);
+  bool ok = !box.is_empty();
+  box.add_congruence((A %= 2) / 3);
+  ok = ok && !box.is_empty();
+  // Inconsistency in the two non-relational additions should
+  // not be detected.
+  box.add_congruence((A + B %= 2) / 0);
+  ok = ok && !box.is_empty();
+  box.add_congruence((A + B %= 3) / 0);
+  ok = ok && !box.is_empty();
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_congruence()
+bool
+test12() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_congruence((A %= 7) / 0);
+  bool ok = !box.is_empty();
+  box.add_congruence((A %= 2) / 0);
+  ok = ok && box.is_empty();
+
+  Rational_Box known_result(1, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+
+// Non-empty box; congruences().
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Non-empty Box; minimized_congruences().
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((C %= 3) / 5);
+
+  TBox box(cgs);
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B == 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Empty Box; minimized_congruences().
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.add_congruences(cgs);
+
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension universe; congruences()
+bool
+test16() {
+  TBox box(0);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension empty; congruences()
+bool
+test17() {
+  TBox box(0, EMPTY);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::add_congruence: it is illegal
+    // to add a congruence with bigger dimension.
+    box1.add_congruence(x %= 0);
+    box1.add_congruence(y - x + z %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_congruences(cs): it is illegal to
+    // add a system of congruences that is dimensional incompatible
+    // with the box.
+    Congruence_System cgs;
+    cgs.insert(x - y %= 0);
+    box.add_congruences(cgs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test20() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_congruence(c): it is illegal to insert a
+    // congruence that contains a variable that is not in the space
+    // of the box.
+    box.add_congruence((y %= 0) / 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/constrains1.cc b/tests/Box/constrains1.cc
new file mode 100644
index 0000000..d88e980
--- /dev/null
+++ b/tests/Box/constrains1.cc
@@ -0,0 +1,187 @@
+/* Test Box::constrains().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)		\
+  if (!pred) {					\
+    nout << "!" #pred << endl;			\
+    ok = false;					\
+  }
+
+#define TEST_PREDICATE_FALSE(pred)		\
+  if (pred) {					\
+    nout << #pred << endl;			\
+    ok = false;					\
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_FALSE(box.constrains(B));
+
+  box.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  box = TBox(2);
+  box.add_constraint(A == 2);
+  box.add_constraint(B == 4);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  box = TBox(2);
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_FALSE(box.constrains(B));
+
+  box.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_FALSE(box.constrains(B));
+
+  box.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  box.add_constraint(A <= 2);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+  TEST_PREDICATE_TRUE(box.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TBox box(0);
+  box.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) box.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 0);
+  box.unconstrain(A);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(C >= 1);
+  box.add_constraint(C <= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(box.constrains(C));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+  TEST_PREDICATE_TRUE(box.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/constraints1.cc b/tests/Box/constraints1.cc
new file mode 100644
index 0000000..9744e8e
--- /dev/null
+++ b/tests/Box/constraints1.cc
@@ -0,0 +1,165 @@
+/* Test Box::constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box1(0, EMPTY);
+
+  Rational_Box known_result(box1);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1(0, UNIVERSE);
+
+  Rational_Box known_result(box1);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B - C >= 1);
+  box1.add_constraint(C - A <= 9);
+
+  Rational_Box known_result(box1);
+
+  box1.contains(box1);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B - C == 1);
+  box1.add_constraint(C - A <= 9);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(box1);
+
+  bool ok = check_result(box2, known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  Constraint_System cs(Linear_Expression(0) == -1);
+
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs);
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  Constraint_System cs(Linear_Expression(0) == -1);
+  cs.insert(A >= 0);
+
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/contains1.cc b/tests/Box/contains1.cc
new file mode 100644
index 0000000..d4035db
--- /dev/null
+++ b/tests/Box/contains1.cc
@@ -0,0 +1,179 @@
+/* Test Box::contains().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 1);
+  box1.add_constraint(x >= 7);
+
+  // The Box is empty, because it has got a negative cycle.
+  TBox box2(3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = !box1.contains(box2);
+
+  nout << "*** !box1.contains(box2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1;
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box1(0, EMPTY);
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x - y >= 0);
+
+  TBox box2(2);
+  box2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    box1.contains(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(D >= 0);
+  cs.insert(C >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  TBox box1(cs);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(cs);
+  box2.add_constraint(A - B >= 0);
+
+  print_constraints(box2, "*** box2 ***");
+
+  bool contained = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(C <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(3);
+  box2.add_constraint(A == 0);
+  box2.add_constraint(C <= 0);
+
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***" << endl;
+  nout << (ok ? "true" : "false") << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/containsintegerpoint1.cc b/tests/Box/containsintegerpoint1.cc
new file mode 100644
index 0000000..b42f68d
--- /dev/null
+++ b/tests/Box/containsintegerpoint1.cc
@@ -0,0 +1,219 @@
+/* Test Box::contains_integer_point().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x < 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(8*z >= 7);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x < 1);
+
+  TBox box(1);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+  return !contains;
+}
+
+bool
+test05() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(2*x < 1);
+
+  TBox box(1);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= -7);
+
+  TBox box(1);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test07() {
+  TBox box(1);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test08() {
+  Variable x(0);
+
+  TBox box(1);
+  box.add_constraint(x >= 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test09() {
+  Variable x(0);
+
+  TBox box(1);
+  box.add_constraint(x > 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/discrete1.cc b/tests/Box/discrete1.cc
new file mode 100644
index 0000000..199a2c0
--- /dev/null
+++ b/tests/Box/discrete1.cc
@@ -0,0 +1,205 @@
+/* Test Box::is_discrete().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_discrete();
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A <= 5);
+  box.add_constraint(A == 3);
+  box.add_constraint(B == 0);
+  box.add_constraint(C <= 2);
+  box.add_constraint(D == -7);
+  box.add_constraint(E == 1);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_discrete();
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B <= -5);
+  box.add_constraint(A >= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_discrete();
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A <= 1);
+  box.add_constraint(A - D == 8);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return !ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A == 1);
+  box.add_constraint(E == 1);
+  box.add_constraint(A - D == 8);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return !ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(7);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B == 2);
+  box.add_constraint(A >= 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/Box/disjoint1.cc b/tests/Box/disjoint1.cc
new file mode 100644
index 0000000..68e13aa
--- /dev/null
+++ b/tests/Box/disjoint1.cc
@@ -0,0 +1,191 @@
+/* Test Box::is_disjoint_from(const Box& y).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(B == 0);
+  box1.add_constraint(A >= 1);
+  box1.add_constraint(A <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A == 0);
+  box2.add_constraint(B >= 1);
+  box2.add_constraint(B <= 2);
+
+  bool ok = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(3);
+
+  TBox box2(3);
+  box2.add_constraint(A <= 3);
+  box2.add_constraint(B - A <= -1);
+  box2.add_constraint(B >= -5);
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return !disjoint;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+
+  Constraint_System cs1;
+  cs1.insert(x1 >= -4);
+
+  TBox box1(2);
+  box1.add_constraints(cs1);
+
+  print_constraints(box1, "*** box1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(2*x1 >= 1);
+  cs2.insert(2*x1 <= 3);
+  cs2.insert(6*x2 <= 1);
+  cs2.insert(3*x2 >= -2);
+
+  TBox box2(2);
+  box2.add_constraints(cs2);
+
+  print_constraints(box2, "*** box2 ***");
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  return !disjoint;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= y);
+
+  TBox box2(3);
+
+  try {
+    // This is an invalid use of method
+    // Box::is_disjoint_from(box2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    box1.is_disjoint_from(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2, EMPTY);
+
+  TBox box2(2);
+  box2.add_constraint(A - B <= 5);
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return disjoint;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= -4);
+
+  TBox box2(2, EMPTY);
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return disjoint;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBox box1(2);
+  box1.add_constraint(A == 0);
+
+  TBox box2(2);
+  box2.add_constraint(A == 1);
+
+  bool ok = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Box/empty1.cc b/tests/Box/empty1.cc
new file mode 100644
index 0000000..ec5f4e0
--- /dev/null
+++ b/tests/Box/empty1.cc
@@ -0,0 +1,225 @@
+/* Different ways of creating an empty Box.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  TBox box2(4);
+
+  box1.add_constraint(-x <= 4);
+  box1.add_constraint(y - x <= 0);
+  box1.add_constraint(x - y <= -5);
+
+  bool empty = box1.is_empty();
+
+  nout << "*** box1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false ") << endl;
+
+  box2.add_constraint(-x <= 4);
+  box2.add_constraint(y - x <= 0);
+  box2.add_constraint(x - y <= 5);
+  box2.add_constraint(z - x <= 1);
+
+  bool empty1 = box2.is_empty();
+
+  nout << "*** box2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  TBox box2(4);
+
+  box1.add_constraint(-x <= 2);
+  box1.add_constraint(y - x <= -9);
+  box1.add_constraint(x - y <= -7);
+
+  bool empty = box1.is_empty();
+
+  print_constraints(box1, "*** box1 ***");
+  nout << "*** box1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  box2.add_constraint(-x <= 7);
+  box2.add_constraint(y - x <= 1);
+  box2.add_constraint(-y <= 2);
+  box2.add_constraint(z - x <= 1);
+
+  bool empty1 = box2.is_empty();
+
+  print_constraints(box2, "*** box2 ***");
+  nout << "*** box2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  // Variable x6(5);
+
+  TBox box1(6);
+  TBox box2(6);
+
+  box1.add_constraint(x1 <= 3);
+  box1.add_constraint(x4 <= 3);
+  box1.add_constraint(x2 - x1 <= 0);
+  box1.add_constraint(x3 - x1 <= -2);
+  box1.add_constraint(x5 - x1 <= 2);
+  box1.add_constraint(-x2 <= 0);
+  box1.add_constraint(x3 - x2 <= 5);
+  box1.add_constraint(x4 - x3 <= -6);
+  box1.add_constraint(x1 - x4 <= 5);
+  box1.add_constraint(x5 - x4 <= 2);
+  box1.add_constraint(-x5 <= -5);
+  box1.add_constraint(x3 - x5 <= 7);
+
+  bool empty = box1.is_empty();
+
+  nout << "*** box1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  box2.add_constraint(x1 <= 3);
+  box2.add_constraint(x4 <= 3);
+  box2.add_constraint(x2 - x1 <= 0);
+  box2.add_constraint(x3 - x1 <= 2);
+  box2.add_constraint(x5 - x1 <= 2);
+  box2.add_constraint(-x2 <= 0);
+  box2.add_constraint(x3 - x2 <= 5);
+  box2.add_constraint(x4 - x3 <= 6);
+  box2.add_constraint(x1 - x4 <= 5);
+  box2.add_constraint(x5 - x4 <= 2);
+  box2.add_constraint(-x5 <= 5);
+  box2.add_constraint(x3 - x5 <= 7);
+
+  bool empty1 = box2.is_empty();
+
+  nout << "*** box2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+
+  box.add_constraint(A == 0);
+  box.add_constraint(C >= 0);
+  box.add_constraint(B - C >= 1);
+
+  bool empty = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+  nout << "*** box.is_empty() ***"
+       << endl
+       << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBox box(5);
+
+  Coefficient a;
+  if (std::numeric_limits<Coefficient>::is_bounded)
+    a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+  else
+    a = 1300000000;
+
+  box.add_constraint(x1 - x2 <= -a);
+  box.add_constraint(x2 - x3 <= -a);
+  box.add_constraint(x3 - x4 <= a);
+  box.add_constraint(x4 - x5 <= a);
+  box.add_constraint(x5 - x1 <= a);
+
+  print_constraints(box, "*** box ***");
+
+  bool empty = box.is_empty();
+
+  nout << "*** box.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(3*x >= 7);
+  box.add_constraint(3*x <= 7);
+  box.add_constraint(2*y > 1);
+  box.add_constraint(2*y <= 1);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  //DO_TEST(test01);
+  //DO_TEST(test02);
+  //DO_TEST(test03);
+  //DO_TEST(test04);
+  //DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
+
diff --git a/tests/Box/equality1.cc b/tests/Box/equality1.cc
new file mode 100644
index 0000000..6e1c4c5
--- /dev/null
+++ b/tests/Box/equality1.cc
@@ -0,0 +1,130 @@
+/* Test Box::operator==().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  TBox box2(2);
+
+  box1.add_constraint(x == 3);
+
+  box2.add_constraint(x == 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = false;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1(0, EMPTY);
+  TBox box2(0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = false;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box1(0);
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = false;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 7);
+  box1.add_constraint(B <= -2);
+  box1.add_constraint(A >= 9);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 9);
+  box2.add_constraint(B <= -2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = true;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A <= 1);
+  box1.add_constraint(A >= 7);
+
+  TBox box2(2);
+  box2.add_constraint(B <= 5);
+  box2.add_constraint(B >= 10);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = true;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Box/expandspacedim1.cc b/tests/Box/expandspacedim1.cc
new file mode 100644
index 0000000..9efeae6
--- /dev/null
+++ b/tests/Box/expandspacedim1.cc
@@ -0,0 +1,244 @@
+/* Test Box::expand_space_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBox box(3);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+
+  TBox known_result(4);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TBox box(3, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(B, 1);
+
+  TBox known_result(4, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A - B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 0);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2, EMPTY);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+
+  TBox known_result(3, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A - B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+
+  TBox known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A - B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 2);
+
+  TBox known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - B <= 2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(C == 1);
+  box.add_constraint(A - B >= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+  box.expand_space_dimension(C, 1);
+
+  TBox known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D - B >= 1);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box,
+                    "*** box.expand_space_dimension(A, 1);"
+                    " box.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2, EMPTY);
+  box.add_constraint(A <= 2);
+  box.add_constraint(A - B >= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(B, 1);
+
+  TBox known_result(3, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/foldspacedims1.cc b/tests/Box/foldspacedims1.cc
new file mode 100644
index 0000000..0f6c40e
--- /dev/null
+++ b/tests/Box/foldspacedims1.cc
@@ -0,0 +1,276 @@
+/* Test Box::fold_space_dimensions().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(2, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A - C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - C <= 2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B >= 7);
+  box.add_constraint(B <= 12);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B >= 7);
+  box.add_constraint(B <= 12);
+  box.add_constraint(C == 15);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  box.fold_space_dimensions(to_fold, C);
+
+  TBox known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A, B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A - B <= 2);
+  box.add_constraint(C >= 0);
+  box.add_constraint(C - B <= 2);
+  box.add_constraint(D >= 0);
+  box.add_constraint(D - B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  box.fold_space_dimensions(to_fold, A);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {C, D} into A ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B == 0);
+  box.add_constraint(C >= 0);
+  box.add_constraint(D >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  box.fold_space_dimensions(to_fold, C);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= -1);
+  box.add_constraint(A - B <= 2);
+  box.add_constraint(C >= 0);
+  box.add_constraint(C - B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+
+  box.fold_space_dimensions(to_fold, A);
+
+  TBox known_result(2, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/frombdshape1.cc b/tests/Box/frombdshape1.cc
new file mode 100644
index 0000000..4208cb9
--- /dev/null
+++ b/tests/Box/frombdshape1.cc
@@ -0,0 +1,87 @@
+/* Test Box::Box(const BD_Shape&, Complexity_Class).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x - y <= 2);
+  bd.add_constraint(y - x <= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  TBox box(bd, SIMPLEX_COMPLEXITY);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x - y <= 2);
+  bd.add_constraint(-x <= 3);
+  bd.add_constraint(x <= 0);
+  bd.add_constraint(y - x <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  TBox box(bd, SIMPLEX_COMPLEXITY);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x >= -3);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(y >= -5);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/frombox1.cc b/tests/Box/frombox1.cc
new file mode 100644
index 0000000..d2d15be
--- /dev/null
+++ b/tests/Box/frombox1.cc
@@ -0,0 +1,158 @@
+/* Test Box<Interval>::Box(const Box<Other_Interval>&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox src(0, EMPTY);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox src(0, UNIVERSE);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox src(24, EMPTY);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBox src(24, UNIVERSE);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  typedef Checked_Number<mpq_class> Q;
+  Rational_Box src(10, UNIVERSE);
+  Q k;
+  Q a;
+  k = 2;
+  sqrt_assign(a, k);
+  Q y = a;
+  k = 1;
+  y -= k;
+  // Now y ~= sqrt(2) - 1.
+  k = -4;
+  a *= k;
+  k = 6;
+  a += k;
+  // Now a ~= 6 - 4*sqrt(2).
+  Q s;
+  Q m;
+  Q d;
+  for (int n = 1; n <= 10; ++n) {
+    s = y;
+    s *= s;
+    s *= s;
+    neg_assign(s, s);
+    // Now s ~= -y^4.
+    k = 1;
+    s += k;
+    sqrt_assign(s, s);
+    sqrt_assign(s, s);
+    // Now s ~= sqrt(sqrt(1-y^4)).
+    m = k;
+    m -= s;
+    // Now m ~= 1 - sqrt(sqrt(1-y^4)).
+    d = k;
+    d += s;
+    // Now d ~= 1 + sqrt(sqrt(1-y^4)).
+    y = m/d;
+    // Now y ~= (1 - sqrt(sqrt(1-y^4)))/(1 + sqrt(sqrt(1-y^4))).
+    s = y;
+    s += k;
+    s *= s;
+    s *= s;
+    // Now s ~= (1 + y)^4.
+    a *= s;
+    s = y;
+    s *= s;
+    s += y;
+    s += k;
+    s *= y;
+    // Now s ~= y*(1 + y + y^2).
+    k = 1ULL << (2*n+3);
+    s *= k;
+    a *= s;
+    m = 1;
+    m /= a;
+    Coefficient num;
+    Coefficient den;
+    numer_denom(m, num, den);
+    src.add_constraint(den*Variable(n-1) == num);
+  }
+
+  TBox dst(src);
+
+  bool ok = check_result(dst, src, "1.91e-6", "1.35e-6", "9.66e-7");
+
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F64(test05);
+END_MAIN
diff --git a/tests/Box/fromgensys1.cc b/tests/Box/fromgensys1.cc
new file mode 100644
index 0000000..40a1530
--- /dev/null
+++ b/tests/Box/fromgensys1.cc
@@ -0,0 +1,181 @@
+/* Test Box::Box(const Generator_System&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Generator_System gs;
+  TBox box(gs);
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(closure_point(V));
+
+  try {
+    // It is illegal to build a Box starting from a non-empty
+    // generator system having no points.
+    TBox box(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(ray(V));
+
+  try {
+    // It is illegal to build a Box starting from a non-empty
+    // generator system having no points.
+    TBox box(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(ray(A + B));
+  gs.insert(point(1*A + 2*B + 3*C + 4*D));
+  gs.insert(point(2*A + 3*B + 4*C + 5*D));
+  TBox box(gs);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 2*C);
+  ph.add_constraint(C >= 3*D);
+  ph.add_constraint(D >= 4);
+  ph.add_constraint(A-D <= 50);
+
+  TBox box(ph.generators());
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A >= 24);
+  known_result.add_constraint(A <= 60);
+  known_result.add_constraint(B >= 24);
+  known_result.add_constraint(B <= 60);
+  known_result.add_constraint(C >= 12);
+  known_result.add_constraint(C <= 30);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 10);
+
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph(4);
+  ph.add_constraint(A == 7);
+  ph.add_constraint(B < 3);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(C < 7);
+
+  TBox box(ph.generators());
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B < 3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C < 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/fromgrid1.cc b/tests/Box/fromgrid1.cc
new file mode 100644
index 0000000..dea6cef
--- /dev/null
+++ b/tests/Box/fromgrid1.cc
@@ -0,0 +1,486 @@
+/* Test Box::Box(const Grid&, Complexity_Class).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Minimized rectilinear grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_point(3*A + B));
+  gr.add_grid_generator(grid_point(3*A + 3*B));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(2, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(  A +   B));
+  gr.add_grid_generator(grid_point(2*A + 3*B));
+  gr.add_grid_generator(grid_point(  A + 4*B));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(2, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point(  A + 2*B, 2));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(2, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Grid containing a line.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A + 2*B));
+  gr.add_grid_generator(grid_point(C, 2));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+  Grid gr(3, UNIVERSE);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(7*A == 16);
+  known_box.add_constraint(7*B == 6);
+  known_box.add_constraint(7*C == -6);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+  Grid gr1(3, EMPTY);
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3, EMPTY);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// A grid with redundant generators.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(2*A));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(C == 0);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A + 2*C %= 0) / 2);
+  gr.add_congruence((A %= 0) / 5);
+  gr.add_congruence(2*B == 3);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(2*B == 3);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Grid which is a single point.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(16*A + 14*B - 6*C, 7));
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(7*A == 16);
+  known_box.add_constraint(B == 2);
+  known_box.add_constraint(7*C == -6);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// An empty grid defined by congruences.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((A %= 1) / 2);
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3, EMPTY);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// Simple grid where all the points have the same value in one of the
+// dimensions (B).
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(C));
+  gr.add_grid_generator(grid_point(D));
+
+  print_generators(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(4);
+  known_box.add_constraint(B == 0);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Simple grid, with a divisor, such that the fractions for some
+// intervals (B and C) will be reduced before being assigned to the
+// intervals.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point(  A + 2*B + 4*C, 4));
+  gr.add_grid_generator(grid_point(2*A + 2*B + 4*C, 4));
+  gr.add_grid_generator(grid_point(  A + 2*B + 4*C + D, 4));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(4, UNIVERSE);
+  known_box.add_constraint(2*B == 1);
+  known_box.add_constraint(C == 1);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test14() {
+  Grid gr(0, EMPTY);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(0, EMPTY);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test15() {
+  Grid gr(0, UNIVERSE);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(0, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/frompartiallyreducedproduct1.cc b/tests/Box/frompartiallyreducedproduct1.cc
new file mode 100644
index 0000000..4c6c2c1
--- /dev/null
+++ b/tests/Box/frompartiallyreducedproduct1.cc
@@ -0,0 +1,136 @@
+/* Test Box::Box(const Direct_Product<D1, D2>&, Complexity_Class).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+typedef Domain_Product<C_Polyhedron, Grid>::Direct_Product DProduct;
+typedef Domain_Product<C_Polyhedron, Grid>::Smash_Product SProduct;
+typedef Domain_Product<C_Polyhedron, Grid>::Constraints_Product CProduct;
+
+bool
+test01() {
+  Variable A(0);
+
+  DProduct dp(1);
+  dp.add_constraint(A <= 4);
+  dp.add_constraint(A >= 2);
+  dp.add_congruence((A %= 1) / 5);
+
+  print_congruences(dp, "*** dp.congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  Rational_Box box(dp);
+
+  Rational_Box known_box(1);
+  known_box.add_constraint(A >= 2);
+  known_box.add_constraint(A <= 4);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  DProduct dp(1);
+  dp.add_constraint(A <= 4);
+  dp.add_constraint(A >= 2);
+  dp.add_congruence((A %= 0) / 3);
+
+  Rational_Box box(dp);
+  box.add_constraint(3*A >= 2);
+  box.add_constraint(A <= 6);
+
+  print_congruences(dp, "*** dp.congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  Rational_Box known_box(1);
+  known_box.add_constraint(A >= 2);
+  known_box.add_constraint(A <= 4);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  SProduct sp(1);
+  sp.add_constraint(A >= 4);
+  sp.add_constraint(A <= 2);
+  sp.add_congruence((A %= 0) / 3);
+
+  Rational_Box box(sp);
+
+  print_congruences(sp, "*** sp.congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  CProduct cp(1);
+  cp.add_constraint(A <= 4);
+  cp.add_constraint(A >= 4);
+  cp.add_congruence((A %= 0) / 3);
+
+  Rational_Box box(cp);
+
+  print_congruences(cp, "*** cp.congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  Rational_Box known_box(1, EMPTY);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/frompolyhedron1.cc b/tests/Box/frompolyhedron1.cc
new file mode 100644
index 0000000..34b21f2
--- /dev/null
+++ b/tests/Box/frompolyhedron1.cc
@@ -0,0 +1,526 @@
+/* Test Box::Box(const Polyhedron&, Complexity_Class).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A non-bounded closed polyhedron consisting of the line x = y.
+// The bounding box is the xy plane - the universal polyhedron.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x - y >= 0);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2, UNIVERSE);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A non-bounded closed polyhedron  in 2D consisting of a wedge bounded
+// by y >= 0 and x >= y.
+// The resulting bounding box depends on the complexity class.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= y);
+  ph.add_constraint(y >= 0);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_nbox(2);
+  known_nbox.add_constraint(x >= 0);
+  known_nbox.add_constraint(y >= 0);
+
+  TBox known_pbox(2);
+  known_pbox.add_constraint(y >= 0);
+
+  bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox));
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_nbox, "*** known_nbox ***");
+  print_constraints(known_pbox, "*** known_pbox ***");
+
+  return ok;
+}
+
+// A bounded non-rectangular closed polyhedron in 2D.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_nbox(2);
+  known_nbox.add_constraint(3*x >= -2);
+  known_nbox.add_constraint(x <= 4);
+  known_nbox.add_constraint(y >= -10);
+  known_nbox.add_constraint(y <= 4);
+
+  TBox known_pbox(2);
+  known_pbox.add_constraint(x <= 4);
+  known_pbox.add_constraint(y <= 4);
+
+  bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox));
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_nbox, "*** known_nbox ***");
+  print_constraints(known_pbox, "*** known_pbox ***");
+
+  return ok;
+}
+
+// An unbounded closed polyhedron in 4D but bounded in 2D.
+bool
+test04() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+  ph.add_constraint(z >= 5);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_nbox(4);
+  known_nbox.add_constraint(3*x >= -2);
+  known_nbox.add_constraint(x <= 4);
+  known_nbox.add_constraint(y >= -10);
+  known_nbox.add_constraint(3*y <= 12);
+  known_nbox.add_constraint(3*z >= 15);
+
+  TBox known_pbox(4);
+  known_pbox.add_constraint(x <= 4);
+  known_pbox.add_constraint(y <= 4);
+  known_pbox.add_constraint(z >= 5);
+
+  bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox));
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_nbox, "*** known_nbox ***");
+  print_constraints(known_pbox, "*** known_pbox ***");
+
+  return ok;
+}
+
+// This is the universal, 2-dimensional closed polyhedron.
+bool
+test05() {
+  C_Polyhedron ph(2);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2, UNIVERSE);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A zero-dimensional closed polyhedron.
+bool
+test06() {
+  C_Polyhedron ph;
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(0);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// An empty closed polyhedron in 2D.
+bool
+test07() {
+  C_Polyhedron ph(2, EMPTY);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(ph.space_dimension(), EMPTY);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded polyhedron that is a single point.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 2);
+  ph.add_constraint(y == 4);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x == 2);
+  known_box.add_constraint(y == 4);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A unit square closed polyhedron.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  C_Polyhedron ph(cs);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x >= 0);
+  known_box.add_constraint(x <= 1);
+  known_box.add_constraint(y >= 0);
+  known_box.add_constraint(y <= 1);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded rectangular closed polyhedron;
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y <= 3);
+  ph.add_constraint(y >= 1);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x >= 1);
+  known_box.add_constraint(x <= 3);
+  known_box.add_constraint(y <= 3);
+  known_box.add_constraint(y >= 1);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded polyhedron having redundant constraints.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 3);
+  ph.add_constraint(y == 1);
+  ph.add_constraint(x + y == 4);
+  ph.add_constraint(x - y == 2);
+  ph.add_constraint(3*x + y == 10);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 5);
+  ph.add_constraint(x + 2*y >= 5);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox known_box(2);
+  known_box.add_constraint(x == 3);
+  known_box.add_constraint(y == 1);
+
+  bool ok = (pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B <= 5);
+  cs.insert(A + 2*B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(3*A - 5*B <= 18);
+  C_Polyhedron ph(cs);
+
+  TBox sbox(ph, SIMPLEX_COMPLEXITY);
+  TBox nbox(ph, ANY_COMPLEXITY);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(11*A <= 61);
+  known_result.add_constraint(2*B <= 5);
+  known_result.add_constraint(5*B >= -18);
+
+  bool ok = (sbox == nbox
+             && check_result(sbox, known_result,
+                             "7.50e-7", "4.89e-7", "4.34e-7"));
+
+  print_constraints(sbox, "*** sbox ***");
+  print_constraints(nbox, "*** nbox ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  C_Polyhedron ph(1, EMPTY);
+
+  TBox box(ph);
+
+  TBox known_box(1, EMPTY);
+
+  bool ok (box == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(box, "*** box ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable X01(0);
+  Variable X02(1);
+  Variable X03(2);
+  Variable X04(3);
+  Variable X05(4);
+  Variable X06(5);
+  Variable X07(6);
+  Variable X08(7);
+  Variable X09(8);
+  Variable X10(9);
+  Variable X11(10);
+  Variable X12(11);
+  Variable X13(12);
+  Variable X14(13);
+  Variable X15(14);
+  Variable X16(15);
+  Variable X17(16);
+  Variable X18(17);
+  Variable X19(18);
+  Variable X20(19);
+  Variable X21(20);
+  Variable X22(21);
+  Variable X23(22);
+  Variable X24(23);
+  Variable X25(24);
+  Variable X26(25);
+  Variable X27(26);
+  Variable X28(27);
+  Variable X29(28);
+  Variable X30(29);
+  Variable X31(30);
+  Variable X32(31);
+  Variable X33(32);
+  Variable X34(33);
+  Variable X35(34);
+  Variable X36(35);
+  Variable X37(36);
+  Variable X38(37);
+  Variable X39(38);
+
+  Constraint_System cs;
+  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+  cs.insert(-X01 >= -80);
+  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+  cs.insert(Coefficient("2386907802506363")*X06
+            + Coefficient("2386907802506363")*X07
+            + Coefficient("1080863910568919")*X08
+            + Coefficient("7746191359077253")*X09
+            - X16 == 0);
+  cs.insert(-X06 + X10 >= -80);
+  cs.insert(-X07 + X11 >= 0);
+  cs.insert(-X08 + X12 >= 0);
+  cs.insert(-X09 + X13 >= 0);
+  cs.insert(X22 - X23 - X24 - X25 == 0);
+  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+  cs.insert(-X22 >= -500);
+  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+  cs.insert(Coefficient("7746191359077253")*X28
+            + Coefficient("7746191359077253")*X29
+            + Coefficient("3512807709348987")*X30
+            + Coefficient("3332663724254167")*X31
+            - X38 == 0);
+  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+  cs.insert(-X28 + X32 >= -500);
+  cs.insert(-X29 + X33 >= 0);
+  cs.insert(-X30 + X34 >= 0);
+  cs.insert(-X31 + X35 >= 0);
+  cs.insert(Coefficient("-2661627379775963")*X10
+            - Coefficient("2686397177726501")*X11
+            - Coefficient("5422333951354077")*X12
+            - Coefficient("5469621747441467")*X13
+            + X25
+            - Coefficient("2466846695892189")*X32
+            - Coefficient("4996743786567565")*X33
+            - Coefficient("5064297780978123")*X34
+            - Coefficient("641481471923585")*X35 >= 0);
+  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+  cs.insert(X15
+            - Coefficient("7854277750134145")*X28
+            - Coefficient("7782220156096217")*X29
+            - Coefficient("7782220156096217")*X30
+            - Coefficient("7710162562058289")*X31 >= 0);
+  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+  cs.insert(X21 >= 2);
+  cs.insert(-X16 - X38 >= -300);
+  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  C_Polyhedron ph(cs);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+  TBox sbox(ph, SIMPLEX_COMPLEXITY);
+  TBox nbox(ph, ANY_COMPLEXITY);
+
+  Rational_Box known_result(2);
+
+  bool ok = true;
+
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(sbox, "*** sbox ***");
+  print_constraints(nbox, "*** nbox ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST_F8(test12);
+  DO_TEST(test13);
+  DO_TEST_F64(test14);
+END_MAIN
diff --git a/tests/Box/frompolyhedron2.cc b/tests/Box/frompolyhedron2.cc
new file mode 100644
index 0000000..1aef6bd
--- /dev/null
+++ b/tests/Box/frompolyhedron2.cc
@@ -0,0 +1,141 @@
+/* Test Box::Box(const NNC_Polyhedron&, Complexity_Class).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// An unbounded NNC polyhedron in 4D but bounded in 2D
+// with strict inequality and closure points at the lower bound.
+bool
+test01() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  NNC_Polyhedron ph(4);
+  ph.add_constraint(3 * x + y > 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+  ph.add_constraint(z >= 5);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_nbox(4);
+  known_nbox.add_constraint(3*x > -2);
+  known_nbox.add_constraint(x <= 4);
+  known_nbox.add_constraint(y > -10);
+  known_nbox.add_constraint(y <= 4);
+  known_nbox.add_constraint(z >= 5);
+
+  TBox known_pbox(4);
+  known_pbox.add_constraint(x <= 4);
+  known_pbox.add_constraint(y <= 4);
+  known_pbox.add_constraint(z >= 5);
+
+  bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox));
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+
+  print_constraints(known_nbox, "*** known_nbox ***");
+  print_constraints(known_pbox, "*** known_pbox ***");
+
+  return ok;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(3 * x + y >= 2);
+  ph.add_constraint(x < 4);
+  ph.add_constraint(y <= 4);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_nbox(2);
+  known_nbox.add_constraint(3*x >= -2);
+  known_nbox.add_constraint(x < 4);
+  known_nbox.add_constraint(y > -10);
+  known_nbox.add_constraint(y <= 4);
+
+  TBox known_pbox(2);
+  known_pbox.add_constraint(x < 4);
+  known_pbox.add_constraint(y <= 4);
+
+  bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox));
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+
+  print_constraints(known_nbox, "*** known_nbox ***");
+  print_constraints(known_pbox, "*** known_pbox ***");
+
+  return ok;
+}
+
+// An empty polyhedron in 2D defined using strict constraints.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(x > 0);
+  ph.add_constraint(x < 0);
+  ph.add_constraint(y > 0);
+  ph.add_constraint(y < 0);
+
+  Rational_Box pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  Rational_Box nbox(ph);
+
+  NNC_Polyhedron known_ph(2, EMPTY);
+  NNC_Polyhedron known_pph(pbox);
+  NNC_Polyhedron known_nph(nbox);
+
+  bool ok = (ph == known_ph && ph == known_nph && ph == known_ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_pph, "*** known_pph ***");
+  print_generators(known_nph, "*** known_nph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/fromspacedim1.cc b/tests/Box/fromspacedim1.cc
new file mode 100644
index 0000000..c9ccf32
--- /dev/null
+++ b/tests/Box/fromspacedim1.cc
@@ -0,0 +1,110 @@
+/* Test Box::Box(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box(0, EMPTY);
+
+  bool ok = (box.OK() && box.is_empty() && box.space_dimension() == 0);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box(0, UNIVERSE);
+
+  bool ok = (box.OK() && box.is_universe() && box.space_dimension() == 0);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box(4, EMPTY);
+
+  bool ok = (box.OK() && box.is_empty() && box.space_dimension() == 4);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBox box(4, UNIVERSE);
+
+  bool ok = (box.OK() && box.is_universe() && box.space_dimension() == 4);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  try {
+    TBox box(not_a_dimension(), EMPTY);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test06() {
+  try {
+    TBox box(not_a_dimension(), UNIVERSE);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/generalizedaffineimage1.cc b/tests/Box/generalizedaffineimage1.cc
new file mode 100644
index 0000000..e58cb92
--- /dev/null
+++ b/tests/Box/generalizedaffineimage1.cc
@@ -0,0 +1,632 @@
+/* Test Box::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B >= 2);
+
+  Rational_Box known_result(cs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image"
+                    "(B, GREATER_OR_EQUAL, A+2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x >= 2);
+  box.add_constraint(x <= 5);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(x, "
+                    "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x >= 2);
+  box.add_constraint(x <= 5);
+  box.add_constraint(y >= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(y, GREATER_THAN, 2*x - 2, -2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y > -4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(y, "
+                    "GREATER_THAN, 2*x - 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_THAN, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A < 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(A, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(A);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+  ph.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, A) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+  box.add_constraint(C >= -2);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+  ph.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-B, "
+                    "LESS_OR_EQUAL, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** ph.generalized_affine_image(-B, "
+                    "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 1);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+  ph.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(C, "
+                    "LESS_OR_EQUAL, A + 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(C, "
+                    "LESS_OR_EQUAL, A + 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 4);
+  box.add_constraint(y <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(3*x + 2, GREATER_OR_EQUAL, 2*x - 3);
+  ph.generalized_affine_image(3*x + 2, GREATER_OR_EQUAL, 2*x - 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3*x + 2, "
+                    "GREATER_OR_EQUAL, 2*x - 3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*x + 2, "
+                    "GREATER_OR_EQUAL, 2*x - 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 7);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+  ph.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "2.39e-7", "1.78e-7", "1.59e-7");
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "6, EQUAL, 3*x - 4) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(2*B + 3*A,
+                              LESS_OR_EQUAL, Linear_Expression(1));
+  ph.generalized_affine_image(2*B + 3*A,
+                              LESS_OR_EQUAL, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3*A + 2*B, "
+                    "LESS_OR_EQUAL, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*A + 2*B, "
+                    "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+  ph.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(2*B - 5, EQUAL, 3*B);
+  ph.generalized_affine_image(2*B - 5, EQUAL, 3*B);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(2*B - 5, "
+                    "EQUAL, 3*B) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "2*B - 5, EQUAL, 3*B) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(-4),
+                               LESS_OR_EQUAL, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(-4),
+                               LESS_OR_EQUAL, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-4, "
+                    "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-4, LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(2),
+                              GREATER_OR_EQUAL, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(2),
+                              GREATER_OR_EQUAL, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(2, "
+                    "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "2, GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 1);
+  box.add_constraint(B >= 2);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*A - B - 1,
+                              GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+  ph.generalized_affine_image(-2*A - B - 1,
+                              GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-2*A - B - 1, "
+                    "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-2*A - B - 1, GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*C + 3, GREATER_OR_EQUAL, -3*B + 4);
+  ph.generalized_affine_image(-2*C + 3, GREATER_OR_EQUAL, -3*B + 4);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-2*C + 3, "
+                    "GREATER_OR_EQUAL, -3*B + 4) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(-2*C + 3, "
+                    "GREATER_OR_EQUAL, -3*B + 4) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(Linear_Expression(3),
+                              GREATER_OR_EQUAL,
+                              Linear_Expression(4));
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3, "
+                    "GREATER_OR_EQUAL, 4) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/generalizedaffineimage2.cc b/tests/Box/generalizedaffineimage2.cc
new file mode 100644
index 0000000..e2675e3
--- /dev/null
+++ b/tests/Box/generalizedaffineimage2.cc
@@ -0,0 +1,608 @@
+/* Test Box::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(B, GREATER_THAN, A+2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B > 2);
+
+  Rational_Box known_result(cs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image"
+                    "(B, GREATER_THAN, A+2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_THAN, B + 1);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image"
+                    "(A, LESS_THAN, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 5);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(x, GREATER_THAN, 2*x - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(x, "
+                    "GREATER_THAN, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x >= 2);
+  box.add_constraint(x <= 5);
+  box.add_constraint(y >= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(y, GREATER_THAN, 2*x - 2, -2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y > -4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(y, "
+                    "GREATER_THAN, 2*x - 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_THAN, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A < 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(A, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, GREATER_THAN, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A > 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(A, "
+                        "GREATER_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(A);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, GREATER_THAN, e2);
+  ph.generalized_affine_image(e1, GREATER_THAN, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(A, "
+                    "GREATER_THAN, A) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(A, "
+                    "GREATER_THAN, A) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+  box.add_constraint(C >= -2);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(-B, LESS_THAN, Linear_Expression(1));
+  ph.generalized_affine_image(-B, LESS_THAN, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-B, "
+                    "LESS_THAN, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** ph.generalized_affine_image(-B, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 1);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, LESS_THAN, e2);
+  ph.generalized_affine_image(e1, LESS_THAN, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(C, "
+                    "LESS_THAN, A + 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(C, "
+                    "LESS_THAN, A + 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 4);
+  box.add_constraint(B <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(3*A + 2, GREATER_THAN, 2*A - 3);
+  ph.generalized_affine_image(3*A + 2, GREATER_THAN, 2*A - 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3*A + 2, "
+                    "GREATER_THAN, 2*A - 3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*A + 2, "
+                    "GREATER_THAN, 2*A - 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(2*B + 3*A,
+                              LESS_THAN, Linear_Expression(1));
+  ph.generalized_affine_image(2*B + 3*A,
+                              LESS_THAN, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(3*A + 2*B, "
+                    "LESS_THAN, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*A + 2*B, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(-4),
+                               LESS_THAN, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(-4),
+                               LESS_THAN, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-4, "
+                    "LESS_THAN, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-4, LESS_THAN, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(2),
+                              GREATER_THAN, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(2),
+                              GREATER_THAN, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(2, "
+                    "GREATER_THAN, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "2, GREATER_THAN, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 1);
+  box.add_constraint(B >= 2);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*A - B - 1,
+                              GREATER_THAN, 3*A + B + 4*C - 2);
+  ph.generalized_affine_image(-2*A - B - 1,
+                              GREATER_THAN, 3*A + B + 4*C - 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(-2*A - B - 1, "
+                        "GREATER_THAN, 3*A + B + 4*C - 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-2*A - B - 1, GREATER_THAN, 3*A + B + 4*C - 2) ***");
+
+  return ok;
+}
+
+bool
+  test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*C + 3, GREATER_THAN, -3*B + 4);
+  ph.generalized_affine_image(-2*C + 3, GREATER_THAN, -3*B + 4);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(-2*C + 3, "
+                        "GREATER_THAN, -3*B + 4) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(-2*C + 3, "
+                        "GREATER_THAN, -3*B + 4) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(Linear_Expression(3),
+                              GREATER_THAN,
+                              Linear_Expression(4));
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3, "
+                    "GREATER_THAN, 4) ***");
+
+  return ok;
+}
+
+bool
+  test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::generalized_affine_image(): it is illegal
+    // for either expression to have space dimension
+    // greater than the box's space dimension.
+    box.generalized_affine_image(B, EQUAL, C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::generalized_affine_image(): it is illegal
+    // for either expression to have space dimension
+    // greater than the box's space dimension.
+    box.generalized_affine_image(C + 1, GREATER_THAN, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::generalized_affine_image(): it is illegal to apply it with
+    // the denominator equal to zero.
+    box.generalized_affine_image(C, GREATER_OR_EQUAL, B, 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/generalizedaffinepreimage1.cc b/tests/Box/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..c4d864c
--- /dev/null
+++ b/tests/Box/generalizedaffinepreimage1.cc
@@ -0,0 +1,474 @@
+/*Test Box::generalized_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL,
+                                  Linear_Expression(-1));
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL,
+                                 Linear_Expression(-1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(4*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(4*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(5*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(5*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "6.71e-8", "6.71e-8", "6.71e-8");
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(2*C <= 1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // If the Coefficient type is not wide enough, do nothing.
+  if (std::numeric_limits<Coefficient>::is_bounded
+      && (std::numeric_limits<Coefficient>::min() > -203
+          || std::numeric_limits<Coefficient>::max() < 629))
+    return true;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 7);
+  box.add_constraint(C >= 7);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(4*A == 1);
+  box.add_constraint(2*B >= 7);
+  box.add_constraint(5*C <= 7);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 7);
+  box.add_constraint(C >= 0);
+  box.add_constraint(C <= 1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -2);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B <= 4);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+C+1, -2);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+C+1, -2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+C+1, -2) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(2*B <= 3);
+  box.add_constraint(C <= 9);
+  box.add_constraint(C >= 7);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-C+1, -3);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-C+1, -3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-C+1, -3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(2*B >= 7);
+  box.add_constraint(C <= 7);
+  box.add_constraint(5*C >= 7);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+DO_TEST(test01);
+DO_TEST(test02);
+DO_TEST(test03);
+DO_TEST(test04);
+DO_TEST(test05);
+DO_TEST_MAY_OVERFLOW_IF_INEXACT(test06, TBox);
+DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test07, TBox);
+DO_TEST(test08);
+DO_TEST(test09);
+DO_TEST(test10);
+DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test11, TBox);
+DO_TEST(test12);
+DO_TEST(test13);
+DO_TEST(test14);
+DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test15, TBox);
+END_MAIN
diff --git a/tests/Box/geomcovers1.cc b/tests/Box/geomcovers1.cc
new file mode 100644
index 0000000..3fcf29a
--- /dev/null
+++ b/tests/Box/geomcovers1.cc
@@ -0,0 +1,71 @@
+/* Test Pointset_Powerset<Box>::geometrically_covers().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  Constraint_System cs1, cs2, cs3, cs4;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 4);
+  cs2.insert(x >= 4);
+  cs2.insert(x <= 6);
+  cs3.insert(x >= 1);
+  cs3.insert(x <= 5);
+  TBox box1(cs1);
+  TBox box2(cs2);
+  TBox box3(cs3);
+
+  Pointset_Powerset<TBox> ps12(1, EMPTY);
+  ps12.add_disjunct(box1);
+  ps12.add_disjunct(box2);
+
+  Pointset_Powerset<TBox> ps3(1, EMPTY);
+  ps3.add_disjunct(box3);
+
+  using namespace IO_Operators;
+  nout << "ps12 = " << ps12 << endl
+       << " ps3 = " << ps3 << endl;
+
+  if (ps12.geometrically_covers(ps3)) {
+
+    nout << "ps12 covers ps3." << endl;
+
+    return true;
+  }
+  else {
+
+    nout << "ps12 does not cover ps3." << endl;
+
+    return false;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/intersection1.cc b/tests/Box/intersection1.cc
new file mode 100644
index 0000000..0b381ec
--- /dev/null
+++ b/tests/Box/intersection1.cc
@@ -0,0 +1,462 @@
+/* Test Box::intersection_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(x - y <= 4);
+
+  TBox box2(3);
+  box2.add_constraint(-y <= -2);
+  box2.add_constraint(x - y <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(x - y <= 4);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  box1.add_constraint(x - y <= 4);
+  box1.add_constraint(x <= 3);
+
+  TBox box2(4);
+  box2.add_constraint(x - y <= 5);
+  box2.add_constraint(-y <= -2);
+  box2.add_constraint(z - x <= 0);
+  box2.add_constraint(y - z <= -1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x - y <= 4);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(z - x <= 0);
+  known_result.add_constraint(y - z <= -1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(-x <= -1);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(-y <= -1);
+  box1.add_constraint(x - y <= 1);
+
+  TBox box2(3);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(-y <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-x <= -1);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(-y <= -1);
+  known_result.add_constraint(y - x <= -1);
+  known_result.add_constraint(x - y <= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(x >= 5);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(x - y <= 1);
+
+  TBox box2(3);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(x >= 5);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(x - y <= 1);
+
+  TBox box2(3);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.intersection_assign(box1);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.intersection_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box1;
+  TBox box2;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result;
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+
+  TBox box2(3);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box2);
+
+  box1.intersection_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  TBox box2(3);
+  box2.add_constraint(y - x <= -1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box2);
+
+  box1.intersection_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= y);
+
+  TBox box2(3);
+
+  try {
+    // This is an invalid use of method
+    // Box::intersection_assign(box2): it is illegal
+    // to apply this method to two shapes having different dimensions.
+    box1.intersection_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  TBox box1(7);
+  TBox box2(15);
+
+  try {
+    // This is an invalid use of method
+    // Box::intersection_assign(box2): it is illegal
+    // to apply this method to two shapes having different dimensions.
+    box1.intersection_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  TBox box1(3, EMPTY);
+  TBox box2(3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result) ;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  TBox box1(3);
+  TBox box2(3, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result) ;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x > 0);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(1);
+  box2.add_constraint(x == 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  if (box1.is_empty())
+    return false;
+
+  box1.intersection_assign(box2);
+
+  TBox known_result(1, EMPTY);
+
+  bool ok = (known_result == box1) ;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x > 0);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(1);
+  box2.add_constraint(x == 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  if (box1.is_empty())
+    return false;
+
+  box1.intersection_assign(box2);
+  bool non_empty = !box1.is_empty();
+
+  TBox known_result(1, EMPTY);
+
+  bool ok = (known_result == box1) && !non_empty;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(y <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x == 1);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  if (box1.is_empty())
+    return false;
+
+  box1.intersection_assign(box2);
+  bool non_empty = !box1.is_empty();
+
+  TBox known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = (known_result == box1) && non_empty;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/mapspacedims1.cc b/tests/Box/mapspacedims1.cc
new file mode 100644
index 0000000..9d4d9a8
--- /dev/null
+++ b/tests/Box/mapspacedims1.cc
@@ -0,0 +1,288 @@
+/* Test Box::map_space_dimensions().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  TBox box(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result;
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  TBox box(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBox box(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+
+  TBox box(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  cs = box.minimized_constraints();
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y - x <= 3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 2);
+
+  TBox box(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 1);
+
+  TBox box(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(y <= -1);
+  box.add_constraint(y - x <= 3);
+
+  print_constraints(box, "*** box ***");
+  print_function(function, "*** function ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= -1);
+  known_result.add_constraint(y <= 1);
+  known_result.add_constraint(x - y <= 3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D == 0);
+  cs.insert(B - A == 0);
+  TBox box(cs);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(1, 1);
+  function.insert(3, 0);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B - C == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+  print_function(function, "*** function ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/max_min1.cc b/tests/Box/max_min1.cc
new file mode 100644
index 0000000..60bb124
--- /dev/null
+++ b/tests/Box/max_min1.cc
@@ -0,0 +1,773 @@
+/* Test Box::maximize(const Linear_Expression&, ...)
+   and Box::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !box.maximize(x1-2*x2, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(x1-2*x2, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !box.maximize(-10*x1-6*x2+4, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(-10*x1-6*x2+4, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le;
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A + B);
+  bool ok = !box.maximize(le, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    && num == 2 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A - B <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A - B);
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 0);
+  box.add_constraint(C >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A + B - C);
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(3*A == 1);
+  box.add_constraint(B < 5);
+  box.add_constraint(B > 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(12*A);
+  bool ok = box.maximize(le, num, den, included, g)
+      // FIXME: check the result for floating point computations.
+      //    && num == 4 && den == 1 && included
+      && g.is_point()
+      && g.divisor() != 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(3*A == 1);
+  box.add_constraint(B > 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(12*A);
+
+  bool ok = box.maximize(le, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    // FIXME: check the result for floating point computations.
+    //    && num == 4 && den == 1 && included
+    && g.is_point()
+    && g.divisor() != 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B - C >= 0);
+  box.add_constraint(B - C <= -1);
+  box.add_constraint(E - D >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A + B - C + 2*E - 2*D);
+  bool ok = !box.maximize(le, num, den, included, g)
+    && ! box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B - C >= 0);
+  box.add_constraint(E - D >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(Linear_Expression(3));
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(z);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::minimize(le, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BOXS.
+    box.minimize(le, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(z);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::maximize(le, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BOXS.
+    box.maximize(le, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+  box.add_constraint(A - B <= 6);
+  box.add_constraint(B - A <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A-2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A-2, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+  box.add_constraint(A - B <= 6);
+  box.add_constraint(B - A <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A+2, num, den, included)
+    && num == 7 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A+2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A+2, num, den, included)
+    && num == 2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A+2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A-2, num, den, included)
+    && num == -2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A-2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A - B - 2, num, den, included)
+    && num == 8 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A - B - 2, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A - B + 2, num, den, included)
+    && num == 12 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A - B + 2, num, den, included)
+    && num == 0 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A + B + 2, num, den, included)
+    && num == 57 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A + B + 2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A + B - 2, num, den, included)
+    && num == 53 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A + B - 2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test07, TBox);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test08, TBox);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/maxspacedim1.cc b/tests/Box/maxspacedim1.cc
new file mode 100644
index 0000000..4812824
--- /dev/null
+++ b/tests/Box/maxspacedim1.cc
@@ -0,0 +1,58 @@
+/* Test Box::max_space_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  nout << Box<fl_r_oc>::max_space_dimension() << " (fl_r_oc)"
+       << endl
+       << Box<db_r_oc>::max_space_dimension() << " (db_r_oc)"
+       << endl
+       << Box<ld_r_oc>::max_space_dimension() << " (ld_r_oc)"
+       << endl
+       << Box<rt_r_oc>::max_space_dimension() << " (rt_r_oc)"
+       << endl;
+
+  if (Box<fl_r_oc>::max_space_dimension()
+      < Box<db_r_oc>::max_space_dimension())
+    return false;
+
+  if (Box<db_r_oc>::max_space_dimension()
+      < Box<ld_r_oc>::max_space_dimension())
+    return false;
+
+  // CHECKME: is this a valid assertion?
+  if (Box<ld_r_oc>::max_space_dimension()
+      < Box<rt_r_oc>::max_space_dimension())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/membytes1.cc b/tests/Box/membytes1.cc
new file mode 100644
index 0000000..28c2b19
--- /dev/null
+++ b/tests/Box/membytes1.cc
@@ -0,0 +1,111 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <cmath>
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.refine_with_constraint(x >= 0);
+  box.refine_with_constraint(x < 7);
+  box.refine_with_constraint(z < 3);
+  box.refine_with_constraint(x - y - 1 <= 0);
+  box.refine_with_constraint(2*x - 2*y >= 0);
+  box.refine_with_constraint(4*x - 2*y - z + 2 >= 0);
+
+  using namespace IO_Operators;
+  nout << "box = " << box << endl;
+
+  const memory_size_type box_total_size = box.total_memory_in_bytes();
+  const memory_size_type box_external_size = box.external_memory_in_bytes();
+
+  nout << "box.total_memory_in_bytes() = " << box_total_size
+       << endl
+       << "box.external_memory_in_bytes() = " << box_external_size
+       << endl
+       << endl;
+
+  return true;
+}
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<TBox> pbox(2, EMPTY);
+  TBox box(2);
+  TBox::interval_type ix;
+  TBox::interval_type iy;
+
+  for (double d = -M_PI; d <= M_PI; d += 0.01) {
+    ix.assign(EMPTY);
+    ix.join_assign(d-0.015);
+    ix.join_assign(d+0.015);
+
+    iy.assign(EMPTY);
+    iy.join_assign(sin(d-0.015));
+    iy.join_assign(sin(d+0.015));
+
+    box.set_interval(x, ix);
+    box.set_interval(y, iy);
+
+    pbox.add_disjunct(box);
+  }
+
+  using namespace IO_Operators;
+  nout << "pbox = " << pbox << endl;
+
+  nout << "pbox.total_memory_in_bytes() = "
+       << pbox.total_memory_in_bytes()
+       << endl
+       << "pbox.external_memory_in_bytes() = "
+       << pbox.external_memory_in_bytes()
+       << endl;
+
+  pbox.refine_with_constraint(x < y);
+
+  using namespace IO_Operators;
+  nout << "pbox = " << pbox << endl;
+
+  nout << "pbox.total_memory_in_bytes() = "
+       << pbox.total_memory_in_bytes()
+       << endl
+       << "pbox.external_memory_in_bytes() = "
+       << pbox.external_memory_in_bytes()
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/minconstraints1.cc b/tests/Box/minconstraints1.cc
new file mode 100644
index 0000000..de3e5bb
--- /dev/null
+++ b/tests/Box/minconstraints1.cc
@@ -0,0 +1,94 @@
+/* Test Box<T>::minimized_constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+  box.add_constraint(A >= -3);
+  box.add_constraint(A <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  const Constraint_System cs = box.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** box.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_box(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_box);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box(0, UNIVERSE);
+
+  print_constraints(box, "*** box ***");
+
+  const Constraint_System cs = box.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** box.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  return num_constraints == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/pointsetpowerset1.cc b/tests/Box/pointsetpowerset1.cc
new file mode 100644
index 0000000..7691224
--- /dev/null
+++ b/tests/Box/pointsetpowerset1.cc
@@ -0,0 +1,544 @@
+/* Test Pointset_Powerset<PH> with boxes.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Construct powerset from zero dimension empty constraint system.
+bool
+test01() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<TBox> ps(cs);
+
+  print_constraints(ps, "*** ps ***");
+
+  return ps.OK();
+}
+
+// add_disjunct(), affine_image() and intersection_assign().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<TBox> ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps1.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  ps1.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> ps2(ps1);
+  ps2.affine_image(x, 2*x+1, 2);
+
+  print_constraints(ps1, "*** ps1 ***");
+  print_constraints(ps2, "*** ps2 ***");
+
+  ps1.intersection_assign(ps2);
+
+  Pointset_Powerset<TBox> known_result(1, EMPTY);
+  TBox box(1);
+  box.add_constraint(2*x >= 1);
+  box.add_constraint(2*x <= 2);
+  known_result.add_disjunct(box);
+
+  bool ok = (ps1 == known_result);
+
+  print_constraints(ps1, "*** ps1.intersect_assign(ps2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  Pointset_Powerset<TBox> ps(1, EMPTY);
+  Constraint_System cs;
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 2);
+  ps.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  ps.add_disjunct(TBox(cs));
+
+  print_constraints(ps, "*** ps ***");
+
+  ps.add_constraint(x == 1);
+
+  Pointset_Powerset<TBox> known_result(1, EMPTY);
+  TBox box(1);
+  box.add_constraint(x == 1);
+  known_result.add_disjunct(box);
+
+  bool ok = (ps == known_result);
+
+  print_constraints(ps, "*** ps.add_constraint(x == 1) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// add_disjunct() and concatenate_assign().
+bool
+test04() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+
+  pps_box.concatenate_assign(pps_box);
+
+  return pps_box.OK();
+}
+
+// total_memory_in_bytes() and external_memory_in_bytes().
+bool
+test05() {
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+
+  bool ok = pps_box.is_bottom();
+
+  pps_box.add_disjunct(TBox(1, UNIVERSE));
+
+  bool ok1 = pps_box.is_top();
+
+  pps_box.total_memory_in_bytes();
+  pps_box.external_memory_in_bytes();
+
+  return ok && ok1;
+}
+
+// definitely_entails().
+bool
+test06() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  pps_box1.add_disjunct(TBox(cs1));
+
+  bool ok = pps_box1.definitely_entails(pps_box);
+
+  return ok;
+}
+
+// size().
+bool
+test07() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+
+  bool ok = (pps_box.size() == 2);
+
+  return ok;
+}
+
+// omega_reduce().
+bool
+test08() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+  pps_box.omega_reduce();
+
+  bool ok = (pps_box.size() == 1);
+
+  return ok;
+}
+
+// space_dimension().
+bool
+test09() {
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  bool ok = (pps_box.space_dimension() == 1);
+  return ok;
+}
+
+// add_disjunct(), drop_disjuncts(), empty().
+bool
+test10() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  Constraint_System cs1 = cs;
+  pps_box.add_disjunct(TBox(cs));
+  pps_box.drop_disjunct(pps_box.begin());
+
+  bool ok = pps_box.empty();
+
+  Constraint_System cs2 = cs1;
+  pps_box.add_disjunct(TBox(cs1));
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+  pps_box.drop_disjuncts(pps_box.begin(), pps_box.end());
+
+  bool ok1 = pps_box.empty();
+
+  return ok && ok1;
+}
+
+// !empty().
+bool
+test11() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1;
+  pps_box1 = pps_box;
+
+  bool ok = !pps_box.empty();
+  return ok;
+}
+
+// swap().
+bool
+test12() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  pps_box.swap(pps_box1);
+
+  bool ok = (pps_box.empty() && !pps_box1.empty());
+  return ok;
+}
+
+// least_upper_bound_assign().
+bool
+test13() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  pps_box1.add_disjunct(TBox(cs));
+  pps_box.least_upper_bound_assign(pps_box1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box2(1, EMPTY);
+  pps_box2.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box2);
+  bool ok1 = !pps_box2.definitely_entails(pps_box);
+
+  return ok && ok1;
+}
+
+// upper_bound_assign().
+bool
+test14() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  pps_box1.add_disjunct(TBox(cs));
+  pps_box.upper_bound_assign(pps_box1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box2(1, EMPTY);
+  pps_box2.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box2);
+  bool ok1 = !pps_box2.definitely_entails(pps_box);
+
+  return ok && ok1;
+}
+
+// meet_assign().
+bool
+test15() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  pps_box.meet_assign(pps_box1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<TBox> pps_box_expected(1, EMPTY);
+  pps_box_expected.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box_expected);
+  bool ok1 = !pps_box_expected.definitely_entails(pps_box);
+
+  return ok && ok1;
+}
+
+// collapse().
+bool
+test16() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+
+  pps_box.collapse();
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  Pointset_Powerset<TBox> pps_box_expected(1, EMPTY);
+  pps_box_expected.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box_expected);
+  bool ok1 = pps_box_expected.definitely_entails(pps_box);
+  bool ok2 = (pps_box.size() == 1);
+
+  return ok && ok1 && ok2;
+}
+// box_hull_assign().
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<TBox> pps_box(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  TBox box(2);
+  box.add_constraints(cs);
+  pps_box.add_disjunct(box);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  TBox box1(2);
+  box1.add_constraints(cs1);
+  pps_box.add_disjunct(box1);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps_box.begin();
+  TBox pps_boxi = i->element();
+  i++;
+  TBox pps_boxi1 = i->element();
+
+  bool ok = pps_boxi.OK() && pps_boxi == box;
+
+  print_constraints(box, "*** box ***");
+  print_constraints(pps_boxi, "*** pps_boxi ***");
+
+  bool ok1 = pps_boxi1.OK() && pps_boxi1 == box1;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(pps_boxi1, "*** pps_boxi1 ***");
+
+  pps_boxi.box_hull_assign(pps_boxi1);
+  print_constraints(pps_boxi, "*** pps_boxi ***");
+
+  return ok && ok1;
+}
+
+// geometrically_equals().
+bool
+test18() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1);
+  Constraint_System cs;
+  cs.insert(x >= 5);
+  cs.insert(x <= 3);
+  pps_box.add_constraints(cs);
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+
+  // pps_box.ascii_dump();
+  // pps_box1.ascii_dump();
+
+  bool ok = pps_box.geometrically_equals(pps_box1);
+  bool ok1 = pps_box.geometrically_equals(pps_box1);
+
+  return ok && ok1;
+}
+
+// geometrically_equals().
+bool
+test19() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1);
+  Constraint_System cs;
+  cs.insert(x >= 5);
+  cs.insert(x >= 8);
+  pps_box.add_constraints(cs);
+
+  Pointset_Powerset<TBox> pps_box1(1);
+  cs.clear();
+  cs.insert(x >= 8);
+  pps_box1.add_constraints(cs);
+
+  // pps_box.ascii_dump();
+  // pps_box1.ascii_dump();
+
+  bool ok = pps_box.geometrically_equals(pps_box1);
+  bool ok1 = pps_box.geometrically_equals(pps_box1);
+
+  return ok && ok1;
+}
+
+// set_interval(), get_interval() and affine_image().
+bool
+test20() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Pointset_Powerset<TBox> ps(3, EMPTY);
+  for (int i = -10; i <= 9; ++i) {
+    TBox pps_box(3, UNIVERSE);
+    pps_box.add_constraint(i <= x);
+    pps_box.add_constraint(x <= i+1);
+    const TBox::interval_type& ix = pps_box.get_interval(x);
+    TBox::interval_type iy = ix*ix;
+    pps_box.set_interval(y, iy);
+    ps.add_disjunct(pps_box);
+  }
+
+  print_constraints(ps, "*** ps ***");
+
+  ps.affine_image(z, y+2*x+1, 2);
+  ps.add_constraint(z == y);
+
+  print_constraints(ps, "*** ps ***");
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/pointsetpowerset2.cc b/tests/Box/pointsetpowerset2.cc
new file mode 100644
index 0000000..27aba1c
--- /dev/null
+++ b/tests/Box/pointsetpowerset2.cc
@@ -0,0 +1,478 @@
+/* Test Pointset_Powerset<Box<> >.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of boxes from a box.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBox box(4);
+  box.add_constraint(x >= 2);
+  box.add_constraint(z == 1);
+
+  Pointset_Powerset<TBox> pps1(box);
+  Pointset_Powerset<TBox> pps2(4, EMPTY);
+  pps2.add_disjunct(box);
+
+  bool ok = (pps1 == pps2);
+
+  print_constraints(box, "*** box ***");
+  Pointset_Powerset<TBox>::const_iterator i = pps1.begin();
+  TBox boxi = i->element();
+  print_constraints(boxi, "*** boxi ***");
+  Pointset_Powerset<TBox>::const_iterator i2 = pps2.begin();
+  TBox boxi2 = i2->element();
+  print_constraints(boxi2, "*** boxi2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty box.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(box);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + z <= 3);
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x >= 2);
+  ph1.add_constraint(z >= 1);
+  ph1.add_constraint(x + z <= 3);
+
+  // With the default complexity, the implied equalities x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<TBox> pps(ph);
+  // With the polynomial complexity, implied equalities are not found.
+  Pointset_Powerset<TBox> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(4);
+  known_pps.add_constraint(x == 2);
+  known_pps.add_constraint(z == 1);
+  Pointset_Powerset<TBox> known_pps1(4);
+  known_pps1.add_constraint(x >= 2);
+  known_pps1.add_constraint(z >= 1);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox boxi = i->element();
+  print_constraints(boxi, "*** boxi ***");
+  Pointset_Powerset<TBox>::const_iterator i1 = pps1.begin();
+  TBox boxi1 = i1->element();
+  print_constraints(boxi1, "*** boxi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of boxes from a polyhedron whose constraints
+// are inconsistent (i.e., is empty but not marked as empty).
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + z <= 2);
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x >= 2);
+  ph1.add_constraint(z >= 1);
+  ph1.add_constraint(x + z <= 2);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<TBox> pps(ph);
+  // With the polynomial complexity, the built powerset is non-empty.
+  Pointset_Powerset<TBox> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(4, EMPTY);
+  Pointset_Powerset<TBox> known_pps1(4);
+  known_pps1.add_constraint(x >= 2);
+  known_pps1.add_constraint(z >= 1);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<TBox>::const_iterator i1 = pps1.begin();
+  TBox boxi1 = i1->element();
+  print_constraints(boxi1, "*** boxi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty polyhedron.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(ph);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a bd shape.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<TBox> pps(bds);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 0);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an empty bd shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(bds);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an octagonal shape.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x >= 0);
+  os.add_constraint(x + y <= 4);
+  os.add_constraint(x - y == 3);
+  os.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<TBox> pps(os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x >= 3);
+  known_pps.add_constraint(2*x <= 7);
+  known_pps.add_constraint(y >= 0);
+  known_pps.add_constraint(2*y <= 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an empty octagonal shape.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(os);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a grid.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TBox> pps(gr);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an empty grid.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(gr);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of boxes.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator j = pps.begin();
+  TBox boxj = j->element();
+  print_constraints(boxj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of polyhedra.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<TBox> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TBox> pps2(pps2_c);
+
+  Pointset_Powerset<TBox> known_pps1(2);
+  known_pps1.add_constraint(2*x >= 1);
+  known_pps1.add_constraint(y >= 0);
+  Pointset_Powerset<TBox> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<TBox>::const_iterator i1 = pps1.begin();
+  TBox boxi1 = i1->element();
+  print_constraints(boxi1, "*** boxi1 ***");
+
+  Pointset_Powerset<TBox>::const_iterator i2 = pps2.begin();
+  TBox boxi2 = i2->element();
+  print_constraints(boxi2, "*** boxi2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of bd shapes.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bd(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i_box = pps.begin();
+  TBox boxi = i_box->element();
+  print_constraints(boxi, "*** boxi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of octagonal shapes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i_box = pps.begin();
+  TBox boxi = i_box->element();
+  print_constraints(boxi, "*** boxi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of grids.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TBox> pps_box(gr);
+
+  Pointset_Powerset<TBox> pps(pps_box);
+
+  Pointset_Powerset<TBox> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox boxi = i->element();
+  print_constraints(boxi, "*** boxi ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/refinewithcongruences1.cc b/tests/Box/refinewithcongruences1.cc
new file mode 100644
index 0000000..5774a1c
--- /dev/null
+++ b/tests/Box/refinewithcongruences1.cc
@@ -0,0 +1,403 @@
+/* Test Box::Box(const Generator_System&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Universe Box constructed from empty congruences
+bool
+test01() {
+  Congruence_System cgs;
+  TBox box(cgs);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences and refine_with_congruences()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  cgs.insert((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+  TBox box(cgs);
+
+  Rational_Box known_result(4);
+  known_result.add_congruences(cgs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+#if 0
+// refine_with_recycled_congruences()
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  cgs.insert((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+  TBox box(4);
+  box.refine_with_recycled_congruences(cgs);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(1*A + 2*B + 3*C + 4*D == 0);
+  known_result.add_constraint(2*A + 3*B + 4*C + 5*D == 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+#endif
+
+// Box constructed from non-empty congruences; congruences().
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  // This inconsistent equality is ignored when congruences
+  // are added to the box.
+  cgs.insert((A + B %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B == 3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// refine_with_congruence()
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.refine_with_congruence((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  box.refine_with_congruence((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Non-empty box; congruences().
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Non-empty Box; minimized_congruences().
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((C %= 3) / 5);
+
+  TBox box(cgs);
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B == 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Empty Box; minimized_congruences().
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension universe; congruences()
+bool
+test11() {
+  TBox box(0);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension empty; congruences()
+bool
+test12() {
+  TBox box(0, EMPTY);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::refine_with_congruence: it is illegal
+    // to refine with a congruence with bigger dimension.
+    box1.refine_with_congruence(x %= 0);
+    box1.refine_with_congruence(y - x + z %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_congruences(cs): it is illegal to
+    // refine with a system of congruences that is dimensional incompatible
+    // with the box.
+    Congruence_System cgs;
+    cgs.insert(x - y %= 0);
+    box.refine_with_congruences(cgs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_congruence(c): it is illegal to refine with a
+    // congruence that contains a variable that is not in the space
+    // of the box.
+    box.refine_with_congruence((y %= 0) / 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+#if 0
+  DO_TEST(test04);
+#endif
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/refinewithconstraint1.cc b/tests/Box/refinewithconstraint1.cc
new file mode 100644
index 0000000..355a76e
--- /dev/null
+++ b/tests/Box/refinewithconstraint1.cc
@@ -0,0 +1,127 @@
+/* Test Box::refine_with_constraint(const Constraint&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.refine_with_constraint(A >= 0);
+
+  print_constraints(box, "*** box.refine_with_constraint(A >= 0) ***");
+
+  box.refine_with_constraint(B >= A);
+
+  print_constraints(box, "*** box.refine_with_constraint(B >= A) ***");
+
+  box.refine_with_constraint(11*A < 127);
+
+  print_constraints(box, "*** box.refine_with_constraint(11*A < 127) ***");
+
+  box.refine_with_constraint(7*A - 15*B > 8);
+
+  print_constraints(box, "*** box.refine_with_constraint(7*A - 15*B > 8) ***");
+
+  box.refine_with_constraint(3*B > 2*A);
+
+  print_constraints(box, "*** box.refine_with_constraint(3*B > 2*A) ***");
+
+  box.refine_with_constraint(A == B);
+
+  print_constraints(box, "*** box.refine_with_constraint(A == B) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(7*A > 8);
+  known_result.add_constraint(55*A < 267);
+  known_result.add_constraint(7*B > 8);
+  known_result.add_constraint(55*B < 267);
+
+  bool ok = check_result(box, known_result, "2.33e-6", "1.55e-6", "1.10e-6");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= -2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.refine_with_constraint(A - 2*B >= 0);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= -4);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.refine_with_constraint(A - 2*B >= 0) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  Constraint_System cs;
+
+  TBox box(1);
+  print_constraints(box, "*** box ***");
+
+  Constraint c(A == 1);
+  print_constraint(c, "*** c ***");
+
+  box.refine_with_constraint(c);
+
+  Rational_Box known_result(1);
+  known_result.add_constraint(A == 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.refine_with_constraint(c) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/refinewithconstraint2.cc b/tests/Box/refinewithconstraint2.cc
new file mode 100644
index 0000000..a099669
--- /dev/null
+++ b/tests/Box/refinewithconstraint2.cc
@@ -0,0 +1,80 @@
+/* Test Box::refine_with_constraint(const Constraint&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Unsigned_Integer_Closed_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Restriction_None
+<Interval_Info_Bitset<unsigned int,
+                      Unsigned_Integer_Closed_Interval_Info_Policy> >
+Unsigned_Integer_Closed_Interval_Info;
+
+typedef Interval<unsigned long long, Unsigned_Integer_Closed_Interval_Info>
+Unsigned_Integer_Closed_Interval;
+
+typedef Box<Unsigned_Integer_Closed_Interval> UILL_Box;
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  UILL_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.refine_with_constraint(A == B);
+
+  print_constraints(box, "*** box.refine_with_constraint(A == B) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/refinewithconstraints1.cc b/tests/Box/refinewithconstraints1.cc
new file mode 100644
index 0000000..bb51169
--- /dev/null
+++ b/tests/Box/refinewithconstraints1.cc
@@ -0,0 +1,611 @@
+/* Test Box::refine_with_constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 5);
+
+  TBox box(2);
+  box.refine_with_constraints(cs);
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.refine_with_constraint(B - A <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::refine_with_constraint: it is illegal
+    // to add a constraint with bigger dimension.
+    box.refine_with_constraint(x <= 0);
+    box.refine_with_constraint(y - x + z >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_constraints(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    box.refine_with_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    box.refine_with_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    box.refine_with_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+#if 0
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.refine_with_recycled_constraints(cs);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+#endif
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= A);
+  cs.insert(11*A < 127);
+  cs.insert(7*A - 15*B > 8);
+  cs.insert(3*B > 2*A);
+  cs.insert(A == B);
+
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(2);
+  box.refine_with_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variable G1(32);
+  Variable H1(33);
+
+  Constraint_System cs;
+  cs.insert(A + C - Q == 130);
+  cs.insert(B + D - R == 190);
+  cs.insert(-450*A1 - 45*B1 >= -4);
+  cs.insert(-90*C1 - 9*D1 >= -8000);
+  cs.insert(-30*E1 - 3*F1 >= -3500);
+  cs.insert(-30*G1 - 3*H1 >= -3500);
+  cs.insert(-E - G >= -1000);
+  cs.insert(-F - H >= -1000);
+  cs.insert(E + I - 6*A1 == 0);
+  cs.insert(G + K - 6*E1 == 0);
+  cs.insert(F + J - 6*C1 == 0);
+  cs.insert(H + L - 6*G1 == 0);
+  cs.insert(A + W - A1 == 5);
+  cs.insert(B - W + X - C1 == 0);
+  cs.insert(C + Y - E1 == 2);
+  cs.insert(D - Y + Z - G1 == 0);
+  cs.insert(M + S + A1 - B1 == 6);
+  cs.insert(N - O - S + T + C1 - D1 == 0);
+  cs.insert(O + U + E1 - F1 == 4);
+  cs.insert(M - P + U - V - G1 + H1 == 0);
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+  cs.insert(E >= 0);
+  cs.insert(F >= 0);
+  cs.insert(G >= 0);
+  cs.insert(H >= 0);
+  cs.insert(I >= 0);
+  cs.insert(J >= 0);
+  cs.insert(K >= 0);
+  cs.insert(L >= 0);
+  cs.insert(M >= 0);
+  cs.insert(N >= 0);
+  cs.insert(O >= 0);
+  cs.insert(P >= 0);
+  cs.insert(Q >= 0);
+  cs.insert(R >= 0);
+  cs.insert(S >= 0);
+  cs.insert(T >= 0);
+  cs.insert(U >= 0);
+  cs.insert(V >= 0);
+  cs.insert(W >= 0);
+  cs.insert(X >= 0);
+  cs.insert(Y >= 0);
+  cs.insert(Z >= 0);
+  cs.insert(A1 >= 0);
+  cs.insert(B1 >= 0);
+  cs.insert(C1 >= 0);
+  cs.insert(D1 >= 0);
+  cs.insert(E1 >= 0);
+  cs.insert(F1 >= 0);
+  cs.insert(G1 >= 0);
+  cs.insert(H1 >= 0);
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs.space_dimension());
+  box.refine_with_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variable G1(32);
+  Variable H1(33);
+  Variable I1(34);
+  Variable J1(35);
+  Variable K1(36);
+  Variable L1(37);
+  Variable M1(38);
+  Variable N1(39);
+  Variable O1(40);
+  Variable P1(41);
+  Variable Q1(42);
+  Variable R1(43);
+  Variable S1(44);
+  Variable T1(45);
+  Variable U1(46);
+  Variable V1(47);
+  Variable W1(48);
+  Variable X1(49);
+  Variable Y1(50);
+  Variable Z1(51);
+  Variable A2(52);
+  Variable B2(53);
+  Variable C2(54);
+  Variable D2(55);
+  Variable E2(56);
+  Variable F2(57);
+  Variable G2(58);
+  Variable H2(59);
+  Variable I2(60);
+  Variable J2(61);
+  Variable K2(62);
+  Variable L2(63);
+  Variable M2(64);
+  Variable N2(65);
+  Variable O2(66);
+  Variable P2(67);
+  Variable Q2(68);
+  Variable R2(69);
+  Variable S2(70);
+  Variable T2(71);
+  Variable U2(72);
+  Variable V2(73);
+  Variable W2(74);
+  Variable X2(75);
+  Variable Y2(76);
+  Variable Z2(77);
+  Variable A3(78);
+  Variable B3(79);
+  Variable C3(80);
+  Variable D3(81);
+  Variable E3(82);
+  Variable F3(83);
+  Variable G3(84);
+  Variable H3(85);
+  Variable I3(86);
+  Variable J3(87);
+  Variable K3(88);
+
+  Constraint_System cs;
+  cs.insert(A + F - M1 - O1 - Q1 - S1 == 0);
+  cs.insert(S - U1 - D2 - P2 - V2 == 0);
+  cs.insert(B + G - U1 - X1 - A2 == 0);
+  cs.insert(T - M1 - H2 - R2 - Z2 == 0);
+  cs.insert(C + H - D2 - H2 - L2 == 0);
+  cs.insert(U - O1 - X1 - T2 - D3 == 0);
+  cs.insert(D - P2 - R2 - T2 == 0);
+  cs.insert(V - Q1 - A2 - L2 - H3 == 0);
+  cs.insert(E - V2 - Z2 - D3 - H3 == 0);
+  cs.insert(W - S1 == 0);
+  cs.insert(X - V1 - E2 - W2 == 0);
+  cs.insert(I - V1 - Y1 - B2 == 0);
+  cs.insert(Y - I2 - A3 == 0);
+  cs.insert(J - E2 - I2 - M2 == 0);
+  cs.insert(Z - Y1 - E3 == 0);
+  cs.insert(A1 - B2 - M2 - I3 == 0);
+  cs.insert(K - W2 - A3 - E3 - I3 == 0);
+  cs.insert(B1 == 0);
+  cs.insert(L - N1 - P1 - R1 - T1 == 0);
+  cs.insert(C1 - W1 - F2 - Q2 - X2 == 0);
+  cs.insert(M - W1 - Z1 - C2 == 0);
+  cs.insert(D1 - N1 - J2 - S2 - B3 == 0);
+  cs.insert(N - F2 - J2 - N2 == 0);
+  cs.insert(E1 - P1 - Z1 - U2 - F3 == 0);
+  cs.insert(O - Q2 - S2 - U2 == 0);
+  cs.insert(F1 - R1 - C2 - N2 - J3 == 0);
+  cs.insert(P - X2 - B3 - F3 - J3 == 0);
+  cs.insert(G1 - T1 == 0);
+  cs.insert(H1 - G2 - Y2 == 0);
+  cs.insert(I1 - K2 - C3 == 0);
+  cs.insert(Q - G2 - K2 - O2 == 0);
+  cs.insert(J1 - G3 == 0);
+  cs.insert(K1 - O2 - K3 == 0);
+  cs.insert(R - Y2 - C3 - G3 - K3 == 0);
+  cs.insert(L1 == 0);
+  cs.insert(A >= 0);
+  cs.insert(-A >= -100);
+  cs.insert(B >= 0);
+  cs.insert(-B >= -100);
+  cs.insert(C >= 0);
+  cs.insert(-C >= -90);
+  cs.insert(D >= 0);
+  cs.insert(-D >= -50);
+  cs.insert(E >= 0);
+  cs.insert(-E >= -10);
+  cs.insert(F >= 0);
+  cs.insert(-F >= -200);
+  cs.insert(G >= 0);
+  cs.insert(-G >= -100);
+  cs.insert(H >= 0);
+  cs.insert(I >= 0);
+  cs.insert(-I >= -25);
+  cs.insert(J >= 0);
+  cs.insert(-J >= -10);
+  cs.insert(K >= 0);
+  cs.insert(L >= 0);
+  cs.insert(-L >= -50);
+  cs.insert(M >= 0);
+  cs.insert(-M >= -40);
+  cs.insert(N >= 0);
+  cs.insert(-N >= -20);
+  cs.insert(O >= 0);
+  cs.insert(-O >= -5);
+  cs.insert(P >= 0);
+  cs.insert(Q >= 0);
+  cs.insert(-Q >= -30);
+  cs.insert(R >= 0);
+  cs.insert(S >= 100);
+  cs.insert(T >= 100);
+  cs.insert(U >= 90);
+  cs.insert(V >= 50);
+  cs.insert(W >= 10);
+  cs.insert(X >= 20);
+  cs.insert(Y >= 25);
+  cs.insert(Z >= 10);
+  cs.insert(A1 >= 15);
+  cs.insert(B1 >= 5);
+  cs.insert(C1 >= 50);
+  cs.insert(D1 >= 40);
+  cs.insert(E1 >= 20);
+  cs.insert(F1 >= 5);
+  cs.insert(G1 >= 15);
+  cs.insert(H1 >= 20);
+  cs.insert(I1 >= 25);
+  cs.insert(J1 >= 30);
+  cs.insert(K1 >= 20);
+  cs.insert(L1 >= 10);
+  cs.insert(M1 >= 0);
+  cs.insert(N1 >= 0);
+  cs.insert(O1 >= 0);
+  cs.insert(P1 >= 0);
+  cs.insert(Q1 >= 0);
+  cs.insert(R1 >= 0);
+  cs.insert(S1 >= 0);
+  cs.insert(T1 >= 0);
+  cs.insert(U1 >= 0);
+  cs.insert(V1 >= 0);
+  cs.insert(W1 >= 0);
+  cs.insert(X1 >= 0);
+  cs.insert(Y1 >= 0);
+  cs.insert(Z1 >= 0);
+  cs.insert(A2 >= 0);
+  cs.insert(B2 >= 0);
+  cs.insert(C2 >= 0);
+  cs.insert(D2 >= 0);
+  cs.insert(E2 >= 0);
+  cs.insert(F2 >= 0);
+  cs.insert(G2 >= 0);
+  cs.insert(H2 >= 0);
+  cs.insert(I2 >= 0);
+  cs.insert(J2 >= 0);
+  cs.insert(K2 >= 0);
+  cs.insert(L2 >= 0);
+  cs.insert(M2 >= 0);
+  cs.insert(N2 >= 0);
+  cs.insert(O2 >= 0);
+  cs.insert(P2 >= 0);
+  cs.insert(Q2 >= 0);
+  cs.insert(R2 >= 0);
+  cs.insert(S2 >= 0);
+  cs.insert(T2 >= 0);
+  cs.insert(U2 >= 0);
+  cs.insert(V2 >= 0);
+  cs.insert(W2 >= 0);
+  cs.insert(X2 >= 0);
+  cs.insert(Y2 >= 0);
+  cs.insert(Z2 >= 0);
+  cs.insert(A3 >= 0);
+  cs.insert(B3 >= 0);
+  cs.insert(C3 >= 0);
+  cs.insert(D3 >= 0);
+  cs.insert(E3 >= 0);
+  cs.insert(F3 >= 0);
+  cs.insert(G3 >= 0);
+  cs.insert(H3 >= 0);
+  cs.insert(I3 >= 0);
+  cs.insert(J3 >= 0);
+  cs.insert(K3 >= 0);
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs.space_dimension());
+  box.refine_with_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  Constraint_System cs;
+  cs.insert(-A >= -20);
+  cs.insert(-B - C >= -20);
+  cs.insert(-D >= -20);
+  cs.insert(A + B - E - F == 0);
+  cs.insert(C + D - G - H == 0);
+  cs.insert(E >= 10);
+  cs.insert(F + G >= 20);
+  cs.insert(H >= 30);
+  cs.insert(A >= 0);
+  cs.insert(-A >= -30);
+  cs.insert(B >= 0);
+  cs.insert(-B >= -20);
+  cs.insert(C >= 0);
+  cs.insert(-C >= -10);
+  cs.insert(D >= 0);
+  cs.insert(-D >= -10);
+  cs.insert(E >= 0);
+  cs.insert(-E >= -10);
+  cs.insert(F >= 0);
+  cs.insert(-F >= -2);
+  cs.insert(G >= 0);
+  cs.insert(-G >= -20);
+  cs.insert(H >= 0);
+  cs.insert(-H >= -30);
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs.space_dimension());
+  box.refine_with_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+#if 0
+  DO_TEST(test06);
+#endif
+  DO_TEST(test07);
+  DO_TEST_F8(test08);
+  DO_TEST_F8(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Box/refinewithconstraints2.cc b/tests/Box/refinewithconstraints2.cc
new file mode 100644
index 0000000..33abcff
--- /dev/null
+++ b/tests/Box/refinewithconstraints2.cc
@@ -0,0 +1,444 @@
+/* Test Box::refine_with_constraints(const Constraint_System&) with
+   instances that may require a watchdog timer.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "pwl.hh"
+#include <sstream>
+
+namespace {
+
+class Timeout : virtual public std::exception,
+                public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "Timeout in refine1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  Timeout() {
+  }
+
+  ~Timeout() throw() {
+  }
+};
+
+Timeout t;
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= -5);
+  cs.insert(A <= 5);
+  cs.insert(A == B);
+  cs.insert(A == 2*B);
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  print_constraints(known_result, "*** known_result ***");
+
+  TBox box(2);
+
+  bool ok = false;
+
+  typedef TBox::interval_type::boundary_type boundary_type;
+  if (std::numeric_limits<boundary_type>::is_exact
+      && !std::numeric_limits<boundary_type>::is_integer) {
+    // With interval boundaries made of rational numbers, this
+    // refinement instance does not terminate: we use a watchdog timer.
+    try {
+      // Set a 0.1 seconds timeout.
+      Parma_Watchdog_Library::Watchdog
+        w(10, abandon_expensive_computations, t);
+
+      box.refine_with_constraints(cs);
+
+      // We should never get here.
+      abandon_expensive_computations = 0;
+      nout << "unexpected termination" << endl;
+      ok = false;
+    }
+    catch (const Timeout&) {
+      abandon_expensive_computations = 0;
+      nout << "timeout, as expected" << endl;
+
+      // The box will have been shrunk, nonetheless.
+      ok = check_result(box, known_result, "1.0e-6", "1.0e-6", "1.0e-6");
+    }
+    catch (...) {
+      abandon_expensive_computations = 0;
+      nout << "unexpected exception" << endl;
+      ok = false;
+    }
+  }
+  else {
+    // With interval boundaries other than rational numbers, this instance
+    // of refinement terminates rather quickly: no timer is necessary.
+    box.refine_with_constraints(cs);
+
+    ok = check_result(box, known_result, "5.61e-45", "2.81e-45", "1.41e-45");
+  }
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  std::stringstream ss;
+  ss.str("topology NECESSARILY_CLOSED\n"
+         "175 x 80 (not_sorted)\n"
+         "index_first_pending 175\n"
+         "0 -292733975779082240 -24769797950537728 -3602879701896397 -20266198323167232 -6755399441055744 -27021597764222976 -14861878770322636 -26120877838748876 0 49539595901075456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 -18014398509481984 -12249790986447750 0 -4863887597560136 -2161727821137838 -3422735716801577 -1261007895663739 -9007199254740992 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 18014398509481984 17293822569102704 0 17473966554197524 6485183463413514 6305039478318694 5224175567749775 11168927075878830 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 9007199254740992 9007199254740992 7025615418697974 9007199254740992 8556839292003942 8016407336719483 8736983277098762 8827055269646172 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 219325301852943168 189151184349560832 197933203622933312 220451201759785792 136459068709326032 213470622337361504 220451201759785792 217298682020626432 4728779608739021 -225179981368524800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 449909602774312576 396767127171340672 373348409109014144 451711042625260736 343624651568368832 435047724003989888 451711042625260736 441803123445045632 3152519739159347 -450359962737049600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 94237822202727632 89396452603304352 83992133050459744 106960491150049280 77236733609404000 94350412193411888 106960491150049280 90972712472884016 2589569785738035 -101330991615836160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 5981343255101440 5854679515581645 5671720780719718 6896136929411072 5404319552844595 6108006994621235 6896136929411072 5735052650479616 70368744177664 -6333186975989760 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 -292733975779082240 -24769797950537728 -3602879701896397 -6755399441055744 -12159718993900340 -26120877838748876 0 49539595901075456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 -18014398509481984 -10268207150404730 0 -2161727821137838 -2341871806232658 -8286623314361713 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 576460752303423488 576460752303423488 5764607523034235 207525870829232448 161409010644958592 386228704043293760 0 -288230376151711744 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 8827055269646172 8556839292003942 7115687411245384 9007199254740992 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 13707831365808948 11821949021847552 12370825226433332 8528691794332877 10963450342880052 13581167626289152 492581209243648 -12525636463624192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 224954801387156288 198383563585670336 186674204554507072 171812325784184416 183296504833979200 220901561722522816 4278419646001971 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 188475644405455264 178792905206608704 167984266100919488 154473467218808000 158977066846178496 181945424945768032 7656119366529843 -184647584722190336 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 382805968326492160 374699488997225280 362990129966061952 345876451382054080 333266372425416704 367043369630695424 8106479329266893 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -78812993478983680 -10696049115004928 -3039929748475085 -12159718993900340 -1688849860263936 -6980579422424269 -6755399441055744 -5066549580791808 -6192449487634432 -7318349394477056 0 12384898975268864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -18014398509481984 -12610078956637388 -2341871806232658 -17473966554197524 -2161727821137838 -3422735716801577 -3422735716801577 -4863887597560136 -12249790986447750 -8646911284551352 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 7475975381435023 2522015791327478 9007199254740992 3242591731706757 3152519739159347 3152519739159347 8736983277098762 8646911284551352 5044031582654956 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7115687411245384 9007199254740992 8556839292003942 8016407336719483 8016407336719483 9007199254740992 9007199254740992 8736983277098762 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220226021778417248 200635363399355584 175415205486080832 190502264237771968 136459068709326032 215947602132415296 213470622337361504 220451201759785792 189151184349560832 217298682020626432 4278419646001971 -225179981368524800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 921436483760003456 828662331436171264 733186019335916800 807945773150267008 687249303136737664 879102647262720768 870095448007979776 903422085250521472 793534254342681344 874599047635350272 8106479329266893 -900719925474099200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 213470622337361504 174289305579238208 158977066846178496 188250464424086720 154473467218808000 192303704088720192 188700824386823776 213920982300098560 178792905206608704 185097944684927392 5404319552844595 -202661983231672320 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 898918485623150976 721476660304753408 666532744850833408 805243613373844736 691752902764108160 790832094566259072 781824895311518080 882705526964617216 749398977994450560 750299697919924608 8106479329266893 -810647932926689280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -78812993478983680 -10696049115004928 -3039929748475085 -12159718993900340 -6980579422424269 -7318349394477056 -1688849860263936 -6192449487634432 0 12384898975268864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -36028797018963968 -24499581972895500 -3242591731706757 -33506781227636492 -5404319552844595 -16212958658533786 -4323455642275676 -24499581972895500 0 18014398509481984 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18014398509481984 16212958658533786 6665327448508334 18014398509481984 8106479329266893 11349071060973650 6485183463413514 17293822569102704 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 8286623314361713 9007199254740992 8827055269646172 9007199254740992 8556839292003942 9007199254740992 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220226021778417248 200635363399355584 175415205486080832 190502264237771968 215947602132415296 217298682020626432 136459068709326032 189151184349560832 8782019273372467 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230359120940000864 207165582859042816 183296504833979200 201986443287566752 219775661815680192 218649761908837568 171812325784184416 198383563585670336 3152519739159347 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6670956948042547 5446540799351194 4968033338943078 5882827013252710 6009490752772506 5784310771403981 4827295850587750 5587278287706522 246290604621824 -5770237022568448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 449459242811575488 360738330152376704 333266372425416704 402621806686922368 395416047283129536 375149848959962304 345876451382054080 374699488997225280 5854679515581645 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -252201579132747776 -8106479329266893 -6305039478318694 -47738156050127256 -11258999068426240 -51791395714760704 -6755399441055744 -18915118434956084 -19365478397693132 0 45035996273704960 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -72057594037927936 0 0 -48999163945791000 0 -55484347409204512 -8646911284551352 -5764607523034235 -5044031582654956 0 36028797018963968 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18014398509481984 0 0 15672526703249326 0 16753390613818246 6485183463413514 5404319552844595 4863887597560136 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 4863887597560136 9007199254740992 5854679515581645 9007199254740992 8556839292003942 8196551321814303 8106479329266893 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223828901480313664 197933203622933312 194105143939668384 224954801387156288 201761263306198208 179018085187977216 136459068709326032 224054081461682176 228332501107684160 3602879701896397 -227431781182210048 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 463870761619161088 412529725867137408 405323966463344640 452161402587997824 412980085829874496 383256328289229184 343624651568368832 449909602774312576 457115362178105344 3602879701896397 -454863562364420096 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6804657561980109 6199486362052198 6192449487634432 5685794529555251 5580241413288755 5643573283048653 4827295850587750 6164301989963366 6262818231812096 140737488355328 -6403555720167424 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 455764282289894208 414331165718085632 411178645978926272 367944089556169536 369745529407117696 388210287879336768 345876451382054080 400820366835974144 406224686388818752 3602879701896397 -409827566090715136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -126100789566373888 -23869078025063628 -5629499534213120 -8106479329266893 -25895697857380352 -4503599627370496 -32876277279804620 -13735978863480012 -9457559217478042 0 24769797950537728 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -144115188075855872 -56204923349583792 0 -38911100780481088 -105204087295374784 0 -144115188075855872 -47558012065032440 -5764607523034235 0 72057594037927936 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 0 9007199254740992 8827055269646172 3422735716801577 9007199254740992 5854679515581645 3242591731706757 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7836263351624663 9007199254740992 9007199254740992 9007199254740992 9007199254740992 9007199254740992 8827055269646172 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110000420898524368 110563370851945680 98966601811466656 88720912659198768 88045372715093200 75322703767771552 84104723041144016 79601123413773520 110113010889208624 3715469692580659 -100205091708993536 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226531061256735936 220676381741154304 201085723362092640 186223844591770016 186223844591770016 160778506697126720 179693625132082784 170911605858710336 219550481834311680 3602879701896397 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106397541196627968 88495732677830240 86806882817566304 84555083003881056 87820192733724672 76110833702561376 87032062798934832 78362633516246624 96151852044360096 4728779608739021 -92323792361095168 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 443604563295993856 355784370562269184 357585810413217408 362539770003324928 376050568885436416 332365652499942592 373798769071751168 339121051940998336 388660647842073792 7656119366529843 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "7 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "7 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "31525197391593472 0 0 0 0 -4503599627370496 -4953959590107546 -5404319552844595 0 0 0 0 0 0 0 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "21 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "31525197391593472 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4503599627370496 -5404319552844595 -4953959590107546 0 0 0 0 0 0 0 0 0 0 -4953959590107546 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 >=\n"
+         "10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 >=\n"
+         "17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 >=\n"
+         "58546795155816448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4503599627370496 -4953959590107546 -5404319552844595 0 0 0 0 0 0 0 0 0 0 -4953959590107546 0 0 0 0 0 0 0 0 0 0 0 -4953959590107546 -5404319552844595 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 >=\n"
+         "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 >=\n"
+         "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "-15 0 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-20 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "1 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -126100789566373888 -23869078025063628 -5629499534213120 -8106479329266893 -25895697857380352 -4503599627370496 -32876277279804620 -9457559217478042 -9682739198846566 0 22517998136852480 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -144115188075855872 -56204923349583792 0 -38911100780481088 -105204087295374784 0 -144115188075855872 -5764607523034235 -10088063165309912 0 72057594037927936 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 0 9007199254740992 8827055269646172 3422735716801577 9007199254740992 3242591731706757 2431943798780068 0 -4503599627370496 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7836263351624663 9007199254740992 9007199254740992 9007199254740992 9007199254740992 8827055269646172 8106479329266893 0 -8106479329266893 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110000420898524368 110563370851945680 98966601811466656 88720912659198768 88045372715093200 75322703767771552 84104723041144016 110113010889208624 114166250553842080 3715469692580659 -101330991615836160 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226531061256735936 220676381741154304 201085723362092640 186223844591770016 186223844591770016 160778506697126720 179693625132082784 219550481834311680 228557681089052672 3602879701896397 -202661983231672320 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106397541196627968 88495732677830240 86806882817566304 84555083003881056 87820192733724672 76110833702561376 87032062798934832 96151852044360096 100205091708993536 4728779608739021 -93449692267937792 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 443604563295993856 355784370562269184 357585810413217408 362539770003324928 376050568885436416 332365652499942592 373798769071751168 388660647842073792 406224686388818752 7656119366529843 -373798769071751168 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 =\n"
+         "0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 >=\n");
+  Constraint_System cs;
+  cs.ascii_load(ss);
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(cs.space_dimension());
+  ss.str("+EUP -EM -UN space_dim 79\n"
+         "[0, 10314880348817334512601175099915806371166908797205087714999656461/4472327120746785297653956552193407232008520545204266972149396275]\n"
+         "[0, 13845204640026631030889305159390169337029989311711657705741484032/5852044125547558797457743823140996705204670473363875812631956685]\n"
+         "[0, 6922602320013315515444652579695084668514994655855828852870742016/4472327120746785297653956552193407232008520545204266972149396275]\n"
+         "[0, 1]\n"
+         "[0, 183286621582592395603923918336706397030221465067768516480006942467094251874476342276273313773966732258762031104/201947514318058825266405552296969018502505571136310660027103675348978638253530036293093560899136162654074928785]\n"
+         "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/288082953845409310261586095056492490791362249192985502452443896193756261634064606718440121711088142441174012160]\n"
+         "[2686500548319859668267236271679836106854450377612806461753177278269968849965950567943501971086918159087023381675088683299453183/778446170153986271646293722222758610239588615644139185506718044413398598788584196557239652607927138993387106707838558560137600, 31525197391593472/5404319552844595]\n"
+         "[808260464002815979451978388304660281069312131948424687841199686824624428575770834454261530624/151009237862627616327241484028267709860068350280703545777427164042459931581501950526059886939, 73859033888876134/5404319552844595]\n"
+         "[226618556208645903758643992043214159409275947657289604887186627910330909797925643152677900801504922848811608768/10961195840757945196265067281093921849892738542919421265335678633895419160365563327020735054453549917239687515, 79624855970192365478639383910721447943227661124538323699857998144/1170408825109511759491548764628199341040934094672775162526391337]\n"
+         "[15, 26541618656730788492879794636907149314409220374846107899952666048/1170408825109511759491548764628199341040934094672775162526391337]\n"
+         "[0, 8985486280088112100506563167484159198795208954754480462056795993/1170408825109511759491548764628199341040934094672775162526391337]\n"
+         "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/139580617693730330144431108207543093864914258318465321284436138492151206127797310314742739840929485352303263010]\n"
+         "[0, 303804758953955866721752289291478575769374180673152882292480754701942640399851473710715528744543627330227738410675228287069127359/114636083423731409790347440941157613447471749368242157860749224890585062371407435860707842957895607705984937192636439527142281664]\n"
+         "[0, 7]\n"
+         "[0, 7]\n"
+         "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/386268417790710553084111681668112997768232491914126126127983236005267549264797679992985537041321412971263426560]\n"
+         "[0, 3]\n"
+         "[0, 177573125946037698558604385378801413571089307288393133079217002458991879409204238029/17892588555239238988473154459237463544171166888738351339728888719297576255502553600]\n"
+         "[25839794736957542736653447787390098039029695261748271831543709793310100059819748166779436608293786761483582251489687769847889922549/3692318603621377070171731880846638790832352647482537903463700684578188218693428418242417440634684128553797348741645618454197176800, 60]\n"
+         "[15, 20]\n"
+         "[0, 72409676610081820024337606323284033316057667404425726484298112/61528739464365799250640879039394801804157129845741815314149415]\n"
+         "[0, 215364736487606238026344927308510412614242449964/134794645266934963747177709084220527189140255405]\n"
+         "[0, 2061072662362948098854568832072986384021826066051896235110957056/3670355764874540374735204645644094629677039803631891367408505105]\n"
+         "[0, 515268165590737024713642208018246596005456516512974058777739264/430701176250560594754486153275763612629099908920192707199045905]\n"
+         "[0, 3661200520289306046447863764244677014442121649388/8769571208077881580806264580025357648475702951979]\n"
+         "[0, 31525197391593472/5404319552844595]\n"
+         "[0, 15762598695796736/2476979795053773]\n"
+         "[0, 1]\n"
+         "[0, 915300130072326511611965941061169253610530412347/914192110113563926269710132379456852481344786795]\n"
+         "[100569907736012592200176731907593393653603286897200373375948598819289159112952295415766216387512943/146346253870074105858602763694412510197753270126660267092506527819743231998370774150586226021951840, 1423138307257267058304665020078992042801252847756788883057586059/184586218393097397751922637118184405412471389537225445942448245]\n"
+         "[14869667571313552605650378924578127204258391821680034719538033247871471932211925243936500890280188256699229259926555073134812416/718752927277209687656244167506910570008434195163317640707227921525181116141905353375202615336471652237552905414680120645944371, 21857749969521291174186682493347326296602048361498167335484176256/430701176250560594754486153275763612629099908920192707199045905]\n"
+         "[8570646096554564291866668301938830916818802465337146975839074062/1170408825109511759491548764628199341040934094672775162526391337, 21857749969521291174186682493347326296602048361498167335484176256/1292103528751681784263458459827290837887299726760578121597137715]\n"
+         "[0, 8797647701304867238000079012369780913937948508972739599385139620161632864004094691936722362939144743295396038778/1399148734839437673237156659726880257722168016620759104314518136891683218621465660068206424960522725506715274445]\n"
+         "[0, 2669624945007775364069874412248427045229215715349940210565159012362111738459851082209412940870318845779551526695718690690481550044170778794259142059204115616411333581967780864779/1708360668329758714025236540492916320511806002258624502201417631387139555375059087959692708852788041301919137087636450154229857124447755653498823376904941199764632073673925197824]\n"
+         "[0, 3]\n"
+         "[0, 3]\n"
+         "[0, 3]\n"
+         "[0, 4398823850652433619000039506184890456968974254486369799692569810080816432002047345968361181469572371647698019389/1157782275275578837083828258845188344809959076054449796563020342561686251725343246520483048742598889585601640032]\n"
+         "[0, 177573125946037698558604385378801413571089307288393133079217002458991879409204238029/17892588555239238988473154459237463544171166888738351339728888719297576255502553600]\n"
+         "[0, 4398823850652433619000039506184890456968974254486369799692569810080816432002047345968361181469572371647698019389/1052529341159617039636766879026295001378528414597855069798212223052291123121300381836309227297285312255918866432]\n"
+         "[0, 7]\n"
+         "[0, 1498223798318303919831024844733424211709929066732763569681630325246353050135890887826963426113547608433634486015043774792176591439896471154476282777/26847311172107165218056405640147044592053233844602064424295328321862465989246561483111745735713688610433228398430982602027530225437614337760952320]\n"
+         "[0, 499407932772767973277008281577808070569976355577587856560543441748784350045296962608987808704515869477878162005014591597392197146632157051492094259/26847311172107165218056405640147044592053233844602064424295328321862465989246561483111745735713688610433228398430982602027530225437614337760952320]\n"
+         "[0, 5]\n"
+         "[1088990638376279656349232564077841878585326883393145232156543106725860769701036461875975422248087277562164759965636299994676381419779389192434465452555574437/2258962538374806529068089961097446198274435865824587927247946112063701506797953147532001062632455227539779726419333176316008587778726957833593452101170626560, 7771524006488802993376382138936142531043834044589401854804790150420533543300059/4977137688523269900666388869765991278013084676989364557386155543450133944795744]\n"
+         "[0, 3/2]\n"
+         "[0, 3/2]\n"
+         "[1344731246397095180937221057427674208422663814958361282355618977488441268849128875802333363211497752676459590600393921949694634262748267846174416688274480521783/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400, 2926486520230784671697951406927216601955418993295/524827521561835640889301183905776373669342216192]\n"
+         "[0, 8098698173131643610422973994024390152024259063050436511914034781041627844575232/7928431521824465019198574989109348959534008394399277106209182654398428320014455]\n"
+         "[255625743144916938376557465993431512631549899985942527668219134605026453252022742017194652158692271084961998287730522703741817071443625417096646865856016016637/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880, 7170392166438080056989470254311656820039851912472813793909407744/2245971024645116171876361734571755974833113225752842920420057075]\n"
+         "[0, 226537011835850170920922349483199724532147106658753468864728245623542037610496/295286773686929687042241100901562780978972101417629942418684891714427504870407]\n"
+         "[0, 29273397577908224/2476979795053773]\n"
+         "[0, 58546795155816448/5404319552844595]\n"
+         "[4886121758410660121399898393468498287761348147836794297860689782559815498292668383511688347221116029983439921364194244223876464951616007309127944670355058347958525880280511104/161787872311589039754537174148841335581508847196926049073414475652896143384975252871620319949599560382345933056706166004377459069700243126385807323566214512647413320655096595, 60]\n"
+         "[19185326995483886226743054182167824240505411823442442486905223117672031508425218509427406136271309766838909450122/1399148734839437673237156659726880257722168016620759104314518136891683218621465660068206424960522725506715274445, 20]\n"
+         "[0, 538537423212680385284373989330528551512140313847671962569697057921440092965209437981361342634620164343644389826716557499329872961929701779022177574622920411231181548734688467653205269453086868420694127457409/216325670355300629343398793111970587004244916598977668851214602484751463124754806790692265920288849668696149072929310323627620010574599881816934452674152407689569704749716632512928181545672403224920682659840]\n"
+         "[0, 8530429548948577812392471568766864753432684932156578782588494538357728952510598196566154421789823375667005355303957367615430968404251800329750037977078972822217/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400]\n"
+         "[0, 10]\n"
+         "[0, 3/2]\n"
+         "[0, 12227674224491803626313043714346181343779060314673535520783949892529360855505503390416812664545409703371081188658346474560138706204060423720825144460158631811843/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880]\n"
+         "[0, 3/2]\n"
+         "[0, 1]\n"
+         "[0, 1]\n"
+         "[0, 5015518816216880836227562971795126288850074754377521725169510371984550419411570290926991422560225824756813804684469870576416363836800284814252084824351761391267887183715721855/939707401646611517828337186389124783204238566165786389129683484730581046324608742585765514020780418411169290173914166419503216856559045828015278273579257936090154907695639808]\n"
+         "[0, 60]\n"
+         "[103329071798316531709026909095463703501013053247478398826357779304145021771658399939262244128683394924564952448387225814185493208137888063349687824244782667478861/79269283303952994524846315029296066792799612173049976075893590468760030484709218718674284127122889338165671718089949371224177700480858989945121469063628471664640, 20]\n"
+         "[0, 5]\n"
+         "[0, 20]\n"
+         "[0, +inf)\n"
+         "[0, 8530429548948577812392471568766864753432684932156578782588494538357728952510598196566154421789823375667005355303957367615430968404251800329750037977078972822217/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400]\n"
+         "[0, 10]\n"
+         "[0, 3/2]\n"
+         "[0, 12227674224491803626313043714346181343779060314673535520783949892529360855505503390416812664545409703371081188658346474560138706204060423720825144460158631811843/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880]\n"
+         "[0, 3/2]\n"
+         "[0, 1]\n"
+         "[0, 5015518816216880836227562971795126288850074754377521725169510371984550419411570290926991422560225824756813804684469870576416363836800284814252084824351761391267887183715721855/939707401646611517828337186389124783204238566165786389129683484730581046324608742585765514020780418411169290173914166419503216856559045828015278273579257936090154907695639808]\n"
+         "[0, 1003103763243376167245512594359025257770014950875504345033902074396910083882314058185398284512045164951362760936893974115283272767360056962850416964870352278253577436743144371/205027069450169761565873382712224453082020642139182002012346602023286123956967691684038960374515291662700700381411197137724083103996816374687476082968091232453611203577584512]\n"
+         "[0, +inf)\n"
+         "[0, +inf)\n");
+  known_result.ascii_load(ss);
+  print_constraints(known_result, "*** known_result ***");
+
+  TBox box(cs.space_dimension());
+
+  bool ok = false;
+
+  typedef TBox::interval_type::boundary_type boundary_type;
+  if (std::numeric_limits<boundary_type>::is_exact
+      && !std::numeric_limits<boundary_type>::is_integer) {
+    // With interval boundaries made of rational numbers, this
+    // refinement instance either does not terminate or terminates
+    // very slowly: we use a watchdog timer.
+    try {
+      // Set a 0.5 seconds timeout.
+      Parma_Watchdog_Library::Watchdog
+        w(50, abandon_expensive_computations, t);
+
+      box.refine_with_constraints(cs);
+
+      // We should never get here.
+      abandon_expensive_computations = 0;
+      nout << "unexpected termination" << endl;
+      ok = false;
+    }
+    catch (const Timeout&) {
+      abandon_expensive_computations = 0;
+      nout << "timeout, as expected" << endl;
+
+      // The box will have been shrunk, but no bounds on the distances
+      // can be set: we check containment though.
+      ok = check_result(box, known_result, "+inf", "+inf", "+inf");
+    }
+    catch (...) {
+      abandon_expensive_computations = 0;
+      nout << "unexpected exception" << endl;
+      ok = false;
+    }
+  }
+  else {
+    // With interval boundaries other than rational numbers, this instance
+    // of refinement terminates: no timer is necessary.
+    box.refine_with_constraints(cs);
+
+    ok = check_result(box, known_result, "624", "158", "121");
+  }
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  // Temporarily always failing.
+  // (Wait for ascii_dump/load to stabilize before correct/restore test.)
+  // DO_TEST_F32(test02);
+  DO_TEST_F(test02);
+END_MAIN
diff --git a/tests/Box/relations1.cc b/tests/Box/relations1.cc
new file mode 100644
index 0000000..54ea86c
--- /dev/null
+++ b/tests/Box/relations1.cc
@@ -0,0 +1,470 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBox box(2, EMPTY);
+
+  Poly_Con_Relation rel = box.relation_with(A >= 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(y <= -1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(y <= 1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // Variable x(0);
+  // Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(z >= 1);
+
+  Constraint c(z >= 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 1);
+
+  Constraint c(x >= 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x == 1);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x == 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x >= 3);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x <= 3);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x <= 3);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(-x >= 2);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // The zero-dim universe box.
+  TBox box;
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) >= 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 1);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x == 1);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 0);
+  box.add_constraint(y >= 1);
+
+  Poly_Con_Relation rel = box.relation_with(-y >= -1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(-y >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+
+  box.add_constraint(x - y <= 2);
+  box.add_constraint(x - z >= -1);
+  box.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = box.relation_with(y > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(y > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+
+  box.add_constraint(x - y <= 2);
+  box.add_constraint(x - z >= -1);
+  box.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = box.relation_with(-y >= -4);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A <= 0);
+  box.add_constraint(A >= -2);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= -1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // We verify that a generator is not subsumed by an empty box.
+  Variable x(0);
+
+  TBox box(2, EMPTY);
+
+  Generator g = point(x);
+  Poly_Gen_Relation rel = box.relation_with(g);
+
+  print_constraints(box, "*** box ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(v(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // We verify that a zero-dimensional generator is subsumed
+  // by a zero-dimensional, universal box.
+  TBox box;
+
+  Generator g = point();
+  Poly_Gen_Relation rel = box.relation_with(g);
+
+  print_constraints(box, "*** box ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/relations2.cc b/tests/Box/relations2.cc
new file mode 100644
index 0000000..65fab58
--- /dev/null
+++ b/tests/Box/relations2.cc
@@ -0,0 +1,442 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // The zero-dim universe BDS.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // An empty box.
+  TBox box(1);
+  box.add_constraint(Linear_Expression(0) >= 1);
+
+  Variable A(0);
+
+  Poly_Con_Relation rel = box.relation_with(A > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 0) = " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A == 3);
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A <= 3);
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A <= 1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A - B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(B > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A >= 0);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) >= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 2);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 2);
+  box.add_constraint(C <= 1);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) == 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel1 = box.relation_with(point(B));
+  Poly_Gen_Relation rel2 = box.relation_with(point(-B));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(point(B)) == " << rel1 << endl;
+  nout << "box.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = box.relation_with(ray(-A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = box.relation_with(line(A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = box.relation_with(closure_point(A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(closure_point(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = box.relation_with(ray(A + B));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(ray(A + B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // The system of constraints of the box contains only
+  // an equality and the generator `g' is a point.
+  Variable A(0);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+
+  Poly_Gen_Relation rel = box.relation_with(point(2*A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // The relation is on a variable (B) other than the first.
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  Poly_Con_Relation rel = box.relation_with(B > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(B > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/relations3.cc b/tests/Box/relations3.cc
new file mode 100644
index 0000000..fb4405a
--- /dev/null
+++ b/tests/Box/relations3.cc
@@ -0,0 +1,401 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A == 3);
+  TBox box(2);
+  box.add_constraints(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A <= 3);
+  TBox box(2);
+  box.add_constraints(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B >= 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == 7);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == 7) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == -1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A < 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B >= 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B <= 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B <= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 3);
+  cs.insert(B == 3);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B <= 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B <= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + 2*B > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + 2*B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A > 1);
+  cs.insert(B > 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= -1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(2*B - 3*A  > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(2*B - 3*A  > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = box.relation_with(A - C - B <= 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A - C - B <= 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(1);
+  box.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = box.relation_with(A == 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A == 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 1);
+
+  Constraint c(A == 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "--- oc ---");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B >= 1);
+  box.add_constraint(B <= 4);
+
+  Constraint c(A == 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "--- oc ---");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/relations4.cc b/tests/Box/relations4.cc
new file mode 100644
index 0000000..e6154ab
--- /dev/null
+++ b/tests/Box/relations4.cc
@@ -0,0 +1,485 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A == 3);
+  TBox box(2);
+  box.add_constraints(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B %= 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B %= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 2) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 2) / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= -7) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 7 / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A < 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 6) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 6 / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 3);
+  cs.insert(B <= 3);
+  cs.insert(B >= 3);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 0) / 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+
+  TBox box(0);
+
+  Poly_Con_Relation rel = box.relation_with((Linear_Expression(1) %= 0) / 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((Linear_Expression(1) %= 0) / 2) == "
+       << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+
+  Poly_Con_Relation rel = box.relation_with(A - 2*B %= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + 2*B %= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A > 0);
+  cs.insert(3*A < 1);
+  cs.insert(B < 1);
+  cs.insert(2*B > 1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(2*B - 3*A  %= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(2*B - 3*A  %= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  // The zero-dim universe box.
+  TBox box(0);
+
+  Congruence c(Linear_Expression(0) == 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 %= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B == 0);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A %= 2) / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B >= 1);
+  box.add_constraint(B <= 2);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A %= 2) / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 4);
+  box.add_constraint(A <= 7);
+  box.add_constraint(B == 0);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 2) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 2) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B == 0);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A - 2*B %= -9) / 8);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 4) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 24) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(3*A >= 1);
+  box.add_constraint(7*A <= 20);
+  box.add_constraint(11*B >= 5);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 9);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 9) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(3*A >= 1);
+  box.add_constraint(7*A <= 20);
+  box.add_constraint(11*B >= 5);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 10);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(1);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This tests the space dimension exception..
+   Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 9);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test20() {
+  // The zero-dim empty box.
+  TBox box(0, EMPTY);
+  Poly_Con_Relation rel = box.relation_with((Linear_Expression(0) %= 1) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 %= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    =  Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/removespacedims1.cc b/tests/Box/removespacedims1.cc
new file mode 100644
index 0000000..fca712a
--- /dev/null
+++ b/tests/Box/removespacedims1.cc
@@ -0,0 +1,367 @@
+/* Remove some variables from the space.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TBox box(6);
+  box.add_constraint(x3 <= 2);
+  box.add_constraint(x5 <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x5);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_space_dimensions({x3, x5}) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+
+  TBox box(8);
+  box.add_constraint(x1 <= 2);
+  box.add_constraint(x5 <= 7);
+  box.add_constraint(x2 <= 10);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x2);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+  to_be_removed.insert(x6);
+  to_be_removed.insert(x7);
+  to_be_removed.insert(x8);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.remove_space_dimensions"
+                    "({x1, x2, x3, x4, x5, x6, x7, x8}) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBox box(4);
+  box.add_constraint(x2 >= 5);
+  box.add_constraint(x4 >= 3);
+  box.add_constraint(x4 <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.remove_space_dimensions({x1, x3, x4}) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBox box(2);
+  box.add_constraint(x1 <= 2);
+  box.add_constraint(x2 <= 10);
+
+  print_constraints(box, "*** box ***");
+
+  box.remove_higher_space_dimensions(0);
+
+  Rational_Box known_result(0, UNIVERSE);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBox box(4);
+  box.add_constraint(x2 >= 5);
+  box.add_constraint(x2 <= 0);
+  box.add_constraint(x4 >= 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.remove_higher_space_dimensions(1);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBox box(5);
+  box.add_constraint(x2 >= 5);
+  box.add_constraint(x4 >= 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.remove_higher_space_dimensions(3);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x2 >= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TBox box(3);
+  box.add_constraint(x2 >= 5);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.remove_higher_space_dimensions(3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TBox box(5);
+
+  try {
+    // This is an invalid use of the method
+    // Box::remove_higher_dimensions(n): it is illegal to erase
+    // a variable that is not in the space of the polyhedron.
+    box.remove_higher_space_dimensions(7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(y - z <= 2);
+  TBox box(cs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of method
+    // Box::remove_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    box.remove_space_dimensions(to_be_removed);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x1 - x2 <= 1);
+  cs.insert(x2 - x3 <= 3);
+  cs.insert(x3 - x1 <= 0);
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 - x3 == 3);
+  TBox box(cs);
+
+  print_constraints(box, "*** box ***");
+
+  cs = box.minimized_constraints();
+  box.remove_higher_space_dimensions(3);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 3);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x1 - x2 <= 1);
+  cs.insert(x2 - x3 <= 3);
+  cs.insert(x3 - x1 <= 0);
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 - x3 == 3);
+  TBox box(cs);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+
+  cs = box.minimized_constraints();
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 3);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_space_dimensions({x4, x5}) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Box/run_tests b/tests/Box/run_tests
new file mode 100755
index 0000000..a165c07
--- /dev/null
+++ b/tests/Box/run_tests
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Run the Box tests.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DBOX_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
diff --git a/tests/Box/timeelapse1.cc b/tests/Box/timeelapse1.cc
new file mode 100644
index 0000000..e539092
--- /dev/null
+++ b/tests/Box/timeelapse1.cc
@@ -0,0 +1,207 @@
+/* Test Box<Interval>::time_elapse_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box1(2, EMPTY);
+  TBox box2(2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  TBox box3(2);
+  TBox box4(2, EMPTY);
+
+  print_constraints(box3, "*** box3 ***");
+  print_constraints(box4, "*** box4 ***");
+
+  box3.time_elapse_assign(box4);
+
+  bool ok = (box1.is_empty() && box3.is_empty());
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+  print_constraints(box3, "*** box3_time_elapse_assign(box4) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y >= 0);
+  box1.add_constraint(x + y - 2 <= 0);
+
+  TBox box2(2);
+  box2.add_constraint(x >= 2);
+  box2.add_constraint(x <= 4);
+  box2.add_constraint(y == 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 1);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(y <= 3);
+
+  TBox box2(2);
+  box2.add_constraint(y == 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(y <= 5);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 2);
+  box2.add_constraint(y <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(x >= 1);
+  box1.add_constraint(y <= 5);
+  box1.add_constraint(y >= 10);
+  box1.add_constraint(z >= 1);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 9);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(y <= 3);
+  box2.add_constraint(y >= -1);
+  box2.add_constraint(z >= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x == 1);
+
+  TBox box2(2);
+
+  try {
+    // This is an invalid use of the method Box::time_elapse_assign(box2):
+    // it is illegal to apply the method to two boxes that are not
+    // dimension-compatible.
+    box1.time_elapse_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/topclosed1.cc b/tests/Box/topclosed1.cc
new file mode 100644
index 0000000..4403a63
--- /dev/null
+++ b/tests/Box/topclosed1.cc
@@ -0,0 +1,205 @@
+/* Test Box::is_topologically_closed().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+/* unbounded 2-dimensional box */
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* bounded 5-dimensional box */
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A <= 5);
+  box.add_constraint(A >= 3);
+  box.add_constraint(B == 0);
+  box.add_constraint(C <= 2);
+  box.add_constraint(C >= 1);
+  box.add_constraint(D == -7);
+  box.add_constraint(E == 1);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 0-dimensional universe box */
+bool
+test03() {
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 2-dimensional empty box */
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B <= -5);
+  box.add_constraint(A >= 3);
+  box.add_constraint(B > -5);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 2-dimensional empty box */
+bool
+test05() {
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 2-dimensional universe box */
+bool
+test06() {
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 4-dimensional topologically open box */
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A < 1);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 0-dimensional empty box */
+bool
+test08() {
+
+  TBox box(0, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(7);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B == 2);
+  box.add_constraint(A >= 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/Box/unconstrain1.cc b/tests/Box/unconstrain1.cc
new file mode 100644
index 0000000..d7249af
--- /dev/null
+++ b/tests/Box/unconstrain1.cc
@@ -0,0 +1,229 @@
+/* Test Box::unconstrain().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+  print_constraints(box, "*** box ***");
+
+  box.unconstrain(A);
+
+  TBox known_result(2, EMPTY);
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs(A, B);
+  box.unconstrain(vs);
+
+  TBox known_result(2, EMPTY);
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.refine_with_constraint(A == B);
+  print_constraints(box, "*** box ***");
+
+  box.unconstrain(B);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.refine_with_constraint(A == B);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs(B);
+  box.unconstrain(vs);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box(0, EMPTY);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs;
+  box.unconstrain(vs);
+
+  TBox known_result(0, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box(0);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs;
+  box.unconstrain(vs);
+
+  TBox known_result(0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    TBox box(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    box.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    TBox box(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    box.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A == 9);
+  box.add_constraint(E >= 0);
+  box.refine_with_constraint(A >= D + 2);
+  box.refine_with_constraint(C <= D);
+  box.refine_with_constraint(E <= B);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  box.unconstrain(vs);
+
+  TBox known_result(5);
+  known_result.add_constraint(C <= 7);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/universe1.cc b/tests/Box/universe1.cc
new file mode 100644
index 0000000..1ea19e4
--- /dev/null
+++ b/tests/Box/universe1.cc
@@ -0,0 +1,89 @@
+/* Test Box::is_universe().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(4);
+
+  box.add_constraint(-x <= 4);
+  box.add_constraint(y - x <= 0);
+  box.add_constraint(x - y <= -5);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test02() {
+  TBox box(4);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test03() {
+  TBox box(0);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test04() {
+  TBox box(20, EMPTY);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/writebox1.cc b/tests/Box/writebox1.cc
new file mode 100644
index 0000000..dd6f672
--- /dev/null
+++ b/tests/Box/writebox1.cc
@@ -0,0 +1,78 @@
+/* Test operator<<(ostream&, const Box&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox bd1(3);
+  TBox bd2(3);
+
+  bd1.add_constraint(x <= 3);
+  bd1.add_constraint(x - y <= 4);
+
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(-y <= -2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  // FIXME!!!
+  return true;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox bd1(0, EMPTY);
+  TBox bd2(3);
+  TBox bd3(3);
+
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(-y <= -2);
+
+  bd3.add_constraint(x <= 0);
+  bd3.add_constraint(-x <= -1);
+  bd3.add_constraint(y <= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bd3, "*** bd3 ***");
+
+  // FIXME!!!
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/FCAIBVP.cc b/tests/FCAIBVP.cc
new file mode 100644
index 0000000..0734e5b
--- /dev/null
+++ b/tests/FCAIBVP.cc
@@ -0,0 +1,47 @@
+/* Implementation of class FCAIBVP (non-inline functions).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+#include "FCAIBVP.defs.hh"
+#include <stdexcept>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const FCAIBVP& x) {
+  s << "{";
+  for (FCAIBVP::Set::const_iterator i = x.set.begin(),
+	 x_end = x.set.end(); i != x_end; ) {
+    const Variable& v = Variable(*i++);
+#if 0 // Old compilers may not understand the following.
+    using IO_Operators::operator<<;
+    s << v;
+#else
+    Parma_Polyhedra_Library::IO_Operators::operator<<(s, v);
+#endif
+    if (i != x_end)
+      s << ", ";
+  }
+  s << "}";
+  return s;
+}
diff --git a/tests/FCAIBVP.defs.hh b/tests/FCAIBVP.defs.hh
new file mode 100644
index 0000000..cf96fdf
--- /dev/null
+++ b/tests/FCAIBVP.defs.hh
@@ -0,0 +1,94 @@
+/* FCAIBVP class declaration.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_FCAIBVP_defs_hh
+#define PPL_FCAIBVP_defs_hh 1
+
+#include "FCAIBVP.types.hh"
+#include "ppl.hh"
+
+namespace Parma_Polyhedra_Library {
+
+bool
+operator==(const FCAIBVP& x, const FCAIBVP& y);
+
+bool
+operator!=(const FCAIBVP& x, const FCAIBVP& y);
+
+namespace IO_Operators {
+
+std::ostream&
+operator<<(std::ostream& s, const FCAIBVP& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \brief
+  A class for representing Finite Conjunctions of Attribute
+  Independent Boolean Variable Properties.
+*/
+class Parma_Polyhedra_Library::FCAIBVP {
+private:
+  typedef std::set<dimension_type> Set;
+
+  Set set;
+
+public:
+  FCAIBVP();
+
+  explicit FCAIBVP(const Variable& x);
+
+  explicit FCAIBVP(const Variables_Set& y);
+
+  FCAIBVP(const FCAIBVP& y, unsigned offset);
+
+  memory_size_type total_memory_in_bytes() const;
+
+  memory_size_type external_memory_in_bytes() const;
+
+  bool is_top() const;
+
+  bool is_bottom() const;
+
+  bool definitely_entails(const FCAIBVP& y) const;
+
+  void upper_bound_assign(const FCAIBVP& y);
+
+  void difference_assign(const FCAIBVP& y);
+
+  void meet_assign(const FCAIBVP& y);
+
+  void weakening_assign(const FCAIBVP& y);
+
+  static bool has_nontrivial_weakening();
+
+  bool OK() const;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const FCAIBVP& x);
+};
+
+#include "FCAIBVP.inlines.hh"
+
+#endif // !defined(PPL_FCAIBVP_defs_hh)
diff --git a/tests/FCAIBVP.inlines.hh b/tests/FCAIBVP.inlines.hh
new file mode 100644
index 0000000..62c0c23
--- /dev/null
+++ b/tests/FCAIBVP.inlines.hh
@@ -0,0 +1,129 @@
+/* FCAIBVP class implementation: inline functions.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_FCAIBVP_inlines_hh
+#define PPL_FCAIBVP_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+FCAIBVP::FCAIBVP()
+  : set() {
+}
+
+inline
+FCAIBVP::FCAIBVP(const Variable& x)
+  : set() {
+  set.insert(x.id());
+}
+
+inline
+FCAIBVP::FCAIBVP(const Variables_Set& y)
+  : set() {
+  for (Variables_Set::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    set.insert(*i);
+}
+
+inline
+FCAIBVP::FCAIBVP(const FCAIBVP& y, unsigned offset)
+  : set() {
+  for (Set::const_iterator i = y.set.begin(),
+	 y_set_end = y.set.end(); i != y_set_end; ++i)
+    set.insert(*i + offset);
+}
+
+inline memory_size_type
+FCAIBVP::total_memory_in_bytes() const {
+  return 1;
+}
+
+inline bool
+FCAIBVP::is_top() const {
+  return set.empty();
+}
+
+inline bool
+FCAIBVP::is_bottom() const {
+  return false;
+}
+
+inline bool
+FCAIBVP::definitely_entails(const FCAIBVP& y) const{
+  const FCAIBVP& x = *this;
+  return std::includes(x.set.begin(), x.set.end(),
+		       y.set.begin(), y.set.end());
+}
+
+inline void
+FCAIBVP::upper_bound_assign(const FCAIBVP& y) {
+  FCAIBVP& x = *this;
+  FCAIBVP z;
+  std::set_intersection(x.set.begin(), x.set.end(),
+			y.set.begin(), y.set.end(),
+			std::inserter(z.set, z.set.begin()));
+  std::swap(x, z);
+}
+
+inline void
+FCAIBVP::difference_assign(const FCAIBVP& y) {
+  FCAIBVP& x = *this;
+  FCAIBVP z;
+  std::set_difference(x.set.begin(), x.set.end(),
+		      y.set.begin(), y.set.end(),
+		      std::inserter(z.set, z.set.begin()));
+  std::swap(x, z);
+}
+
+inline void
+FCAIBVP::meet_assign(const FCAIBVP& y) {
+  set.insert(y.set.begin(), y.set.end());
+}
+
+inline void
+FCAIBVP::weakening_assign(const FCAIBVP& y) {
+  difference_assign(y);
+}
+
+inline bool
+FCAIBVP::has_nontrivial_weakening() {
+  return true;
+}
+
+inline bool
+FCAIBVP::OK() const {
+  return true;
+}
+
+inline bool
+operator==(const FCAIBVP& x, const FCAIBVP& y) {
+  return x.definitely_entails(y) && y.definitely_entails(x);
+}
+
+inline bool
+operator!=(const FCAIBVP& x, const FCAIBVP& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_FCAIBVP_inlines_hh)
diff --git a/tests/FCAIBVP.types.hh b/tests/FCAIBVP.types.hh
new file mode 100644
index 0000000..eb760f2
--- /dev/null
+++ b/tests/FCAIBVP.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author 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. */
+
+#ifndef PPL_FCAIBVP_types_hh
+#define PPL_FCAIBVP_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class FCAIBVP;
+
+}
+
+#endif // !defined(PPL_FCAIBVP_types_hh)
diff --git a/tests/Grid/Makefile.am b/tests/Grid/Makefile.am
index 192b06d..85604dc 100644
--- a/tests/Grid/Makefile.am
+++ b/tests/Grid/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -50,49 +50,68 @@ addspacedims1 \
 affinedim1 \
 affineimage1 affineimage2 \
 affinepreimage1 affinepreimage2 \
-asciidumpload1 \
+asciidumpload1 asciidumpload2 asciidumpload3 asciidumpload4 asciidumpload5 \
+asciidumpload6 asciidumpload7 \
 bhz03widening1 \
 bounded1 \
-boundingbox1 boundingbox2 \
+boundingbox1 \
 bounds1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
 certificate1 \
 concatenate1 \
 congruence1 \
 congruences1 \
-congruencesystem1 \
+congruences2 \
+constraints1 \
 contains1 \
-copyconstruct1 \
+containsintegerpoint1 \
 coveringbox1 coveringbox2 \
 discrete1 \
 disjoint1 \
 equals1 \
 expandspacedim1 \
 foldspacedims1 \
-generalizedaffineimage1 generalizedaffineimage2 \
+frombdshape1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+generalizedaffineimage1 generalizedaffineimage2 generalizedaffineimage3 \
 generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
 generator1 \
-generators1 \
+generators1 generators2 \
 grid1 grid2 grid3 \
 griddifference1 \
 intersection1 \
 isempty1 \
 isuniverse1 \
 join1 join2 \
-limitedextrapolation1 \
+limitedextrapolation1 limitedextrapolation2 limitedextrapolation3 \
 mapspacedims1 \
 maxmin1 \
 membytes1 \
 mingenerators1 \
 mincongruences1 \
-outputoperator1 \
-relations1 relations2 \
-removespacedims1 \
+outputoperator1 outputoperator2 outputoperator3 \
+partition1 \
+powersetdifference1 \
+powersetgeometricallycovers1 \
+powersetgeometricallyequals1 \
+pointsetpowerset1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
 timeelapse1 \
 topclosed1 \
 topclosure1 \
-widening1 \
+unconstrain1 \
+widening1 widening2  widening3\
 writecongruencesystem
 
+XFAIL_TESTS =
+
 #
 # Sources for the tests
 #
@@ -120,16 +139,25 @@ affinepreimage1_SOURCES = affinepreimage1.cc
 affinepreimage2_SOURCES = affinepreimage2.cc
 
 asciidumpload1_SOURCES = asciidumpload1.cc
+asciidumpload2_SOURCES = asciidumpload2.cc
+asciidumpload3_SOURCES = asciidumpload3.cc
+asciidumpload4_SOURCES = asciidumpload4.cc
+asciidumpload5_SOURCES = asciidumpload5.cc
+asciidumpload6_SOURCES = asciidumpload6.cc
+asciidumpload7_SOURCES = asciidumpload7.cc
 
 bhz03widening1_SOURCES = bhz03widening1.cc
 
 bounded1_SOURCES = bounded1.cc
 
 boundingbox1_SOURCES = boundingbox1.cc
-boundingbox2_SOURCES = boundingbox2.cc
 
 bounds1_SOURCES = bounds1.cc
 
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
 certificate1_SOURCES = certificate1.cc
 
 concatenate1_SOURCES = concatenate1.cc
@@ -137,12 +165,13 @@ concatenate1_SOURCES = concatenate1.cc
 congruence1_SOURCES = congruence1.cc
 
 congruences1_SOURCES = congruences1.cc
+congruences2_SOURCES = congruences2.cc
 
-congruencesystem1_SOURCES = congruencesystem1.cc
+constraints1_SOURCES = constraints1.cc
 
 contains1_SOURCES = contains1.cc
 
-copyconstruct1_SOURCES = copyconstruct1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
 
 discrete1_SOURCES = discrete1.cc
 
@@ -152,17 +181,28 @@ equals1_SOURCES = equals1.cc
 
 expandspacedim1_SOURCES = expandspacedim1.cc
 
+frombdshape1_SOURCES = frombdshape1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
 foldspacedims1_SOURCES = foldspacedims1.cc
 
 generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
 
 generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
 generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
 
 generator1_SOURCES = generator1.cc
 
 generators1_SOURCES = generators1.cc
+generators2_SOURCES = generators2.cc
 
 coveringbox1_SOURCES = coveringbox1.cc
 coveringbox2_SOURCES = coveringbox2.cc
@@ -183,6 +223,8 @@ join1_SOURCES = join1.cc
 join2_SOURCES = join2.cc
 
 limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+limitedextrapolation2_SOURCES = limitedextrapolation2.cc
+limitedextrapolation3_SOURCES = limitedextrapolation3.cc
 
 mapspacedims1_SOURCES = mapspacedims1.cc
 
@@ -195,11 +237,26 @@ mincongruences1_SOURCES = mincongruences1.cc
 mingenerators1_SOURCES = mingenerators1.cc
 
 outputoperator1_SOURCES = outputoperator1.cc
+outputoperator2_SOURCES = outputoperator2.cc
+outputoperator3_SOURCES = outputoperator3.cc
+
+partition1_SOURCES = partition1.cc
+
+powersetdifference1_SOURCES = powersetdifference1.cc
+powersetgeometricallycovers1_SOURCES = powersetgeometricallycovers1.cc
+powersetgeometricallyequals1_SOURCES = powersetgeometricallyequals1.cc
+
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
 
 relations1_SOURCES = relations1.cc
 relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
 
 removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
 
 timeelapse1_SOURCES = timeelapse1.cc
 
@@ -207,55 +264,21 @@ topclosed1_SOURCES = topclosed1.cc
 
 topclosure1_SOURCES = topclosure1.cc
 
+unconstrain1_SOURCES = unconstrain1.cc
+
 widening1_SOURCES = widening1.cc
+widening2_SOURCES = widening2.cc
+widening3_SOURCES = widening3.cc
 
 writecongruencesystem_SOURCES = writecongruencesystem.cc
 
-XFAIL_ALWAYS =
-
-XFAIL_WITH_INT64 = \
-$(XFAIL_ALWAYS)
-
-XFAIL_WITH_INT32 = \
-$(XFAIL_WITH_INT64)
-
-XFAIL_WITH_INT16 = \
-$(XFAIL_WITH_INT32)
-
-XFAIL_WITH_INT8 = \
-$(XFAIL_WITH_INT16)
-
-if USE_INT64
-
-XFAIL_SET = $(XFAIL_WITH_INT64)
-
-else !USE_INT64
-if USE_INT32
-
-XFAIL_SET = $(XFAIL_WITH_INT32)
-
-else !USE_INT32
-if USE_INT16
-
-XFAIL_SET = $(XFAIL_WITH_INT16)
-
-else !USE_INT16
-if USE_INT8
-
-XFAIL_SET = $(XFAIL_WITH_INT8)
-
-else !USE_INT8
-
-XFAIL_SET = $(XFAIL_ALWAYS)
-
-endif !USE_INT8
-endif !USE_INT16
-endif !USE_INT32
-endif !USE_INT64
-
-XFAIL_TESTS = $(XFAIL_SET)
-
 check_PROGRAMS = $(TESTS)
 
 MOSTLYCLEANFILES = \
-writecongruencesystem.dat
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+ascii_dump_load4.dat \
+ascii_dump_load5.dat \
+ascii_dump_load6.dat \
+ascii_dump_load7.dat
diff --git a/tests/Grid/Makefile.in b/tests/Grid/Makefile.in
index 229b9e0..a800fcc 100644
--- a/tests/Grid/Makefile.in
+++ b/tests/Grid/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -58,11 +54,58 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+TESTS = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+	addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \
+	addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+	asciidumpload1$(EXEEXT) asciidumpload2$(EXEEXT) \
+	asciidumpload3$(EXEEXT) asciidumpload4$(EXEEXT) \
+	asciidumpload5$(EXEEXT) asciidumpload6$(EXEEXT) \
+	asciidumpload7$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) boundingbox1$(EXEEXT) bounds1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+	congruence1$(EXEEXT) congruences1$(EXEEXT) \
+	congruences2$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) coveringbox1$(EXEEXT) \
+	coveringbox2$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+	equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frombdshape1$(EXEEXT) \
+	fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffineimage3$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) generator1$(EXEEXT) \
+	generators1$(EXEEXT) generators2$(EXEEXT) grid1$(EXEEXT) \
+	grid2$(EXEEXT) grid3$(EXEEXT) griddifference1$(EXEEXT) \
+	intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+	join1$(EXEEXT) join2$(EXEEXT) limitedextrapolation1$(EXEEXT) \
+	limitedextrapolation2$(EXEEXT) limitedextrapolation3$(EXEEXT) \
+	mapspacedims1$(EXEEXT) maxmin1$(EXEEXT) membytes1$(EXEEXT) \
+	mingenerators1$(EXEEXT) mincongruences1$(EXEEXT) \
+	outputoperator1$(EXEEXT) outputoperator2$(EXEEXT) \
+	outputoperator3$(EXEEXT) partition1$(EXEEXT) \
+	powersetdifference1$(EXEEXT) \
+	powersetgeometricallycovers1$(EXEEXT) \
+	powersetgeometricallyequals1$(EXEEXT) \
+	pointsetpowerset1$(EXEEXT) refinewithcongruences1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+	timeelapse1$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+	unconstrain1$(EXEEXT) widening1$(EXEEXT) widening2$(EXEEXT) \
+	widening3$(EXEEXT) writecongruencesystem$(EXEEXT)
+XFAIL_TESTS =
 check_PROGRAMS = $(am__EXEEXT_1)
 subdir = tests/Grid
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +115,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -86,28 +139,45 @@ am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
 	addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
 	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
 	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
-	asciidumpload1$(EXEEXT) bhz03widening1$(EXEEXT) \
-	bounded1$(EXEEXT) boundingbox1$(EXEEXT) boundingbox2$(EXEEXT) \
-	bounds1$(EXEEXT) certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+	asciidumpload1$(EXEEXT) asciidumpload2$(EXEEXT) \
+	asciidumpload3$(EXEEXT) asciidumpload4$(EXEEXT) \
+	asciidumpload5$(EXEEXT) asciidumpload6$(EXEEXT) \
+	asciidumpload7$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) boundingbox1$(EXEEXT) bounds1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	certificate1$(EXEEXT) concatenate1$(EXEEXT) \
 	congruence1$(EXEEXT) congruences1$(EXEEXT) \
-	congruencesystem1$(EXEEXT) contains1$(EXEEXT) \
-	copyconstruct1$(EXEEXT) coveringbox1$(EXEEXT) \
+	congruences2$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) coveringbox1$(EXEEXT) \
 	coveringbox2$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \
 	equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
-	foldspacedims1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frombdshape1$(EXEEXT) \
+	fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
 	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffineimage3$(EXEEXT) \
 	generalizedaffinepreimage1$(EXEEXT) \
-	generalizedaffinepreimage2$(EXEEXT) generator1$(EXEEXT) \
-	generators1$(EXEEXT) grid1$(EXEEXT) grid2$(EXEEXT) \
-	grid3$(EXEEXT) griddifference1$(EXEEXT) intersection1$(EXEEXT) \
-	isempty1$(EXEEXT) isuniverse1$(EXEEXT) join1$(EXEEXT) \
-	join2$(EXEEXT) limitedextrapolation1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) generator1$(EXEEXT) \
+	generators1$(EXEEXT) generators2$(EXEEXT) grid1$(EXEEXT) \
+	grid2$(EXEEXT) grid3$(EXEEXT) griddifference1$(EXEEXT) \
+	intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+	join1$(EXEEXT) join2$(EXEEXT) limitedextrapolation1$(EXEEXT) \
+	limitedextrapolation2$(EXEEXT) limitedextrapolation3$(EXEEXT) \
 	mapspacedims1$(EXEEXT) maxmin1$(EXEEXT) membytes1$(EXEEXT) \
 	mingenerators1$(EXEEXT) mincongruences1$(EXEEXT) \
-	outputoperator1$(EXEEXT) relations1$(EXEEXT) \
-	relations2$(EXEEXT) removespacedims1$(EXEEXT) \
+	outputoperator1$(EXEEXT) outputoperator2$(EXEEXT) \
+	outputoperator3$(EXEEXT) partition1$(EXEEXT) \
+	powersetdifference1$(EXEEXT) \
+	powersetgeometricallycovers1$(EXEEXT) \
+	powersetgeometricallyequals1$(EXEEXT) \
+	pointsetpowerset1$(EXEEXT) refinewithcongruences1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
 	timeelapse1$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
-	widening1$(EXEEXT) writecongruencesystem$(EXEEXT)
+	unconstrain1$(EXEEXT) widening1$(EXEEXT) widening2$(EXEEXT) \
+	widening3$(EXEEXT) writecongruencesystem$(EXEEXT)
 am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
 addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
 addcongruence1_LDADD = $(LDADD)
@@ -186,6 +256,42 @@ asciidumpload1_LDADD = $(LDADD)
 asciidumpload1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_asciidumpload2_OBJECTS = asciidumpload2.$(OBJEXT)
+asciidumpload2_OBJECTS = $(am_asciidumpload2_OBJECTS)
+asciidumpload2_LDADD = $(LDADD)
+asciidumpload2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload3_OBJECTS = asciidumpload3.$(OBJEXT)
+asciidumpload3_OBJECTS = $(am_asciidumpload3_OBJECTS)
+asciidumpload3_LDADD = $(LDADD)
+asciidumpload3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload4_OBJECTS = asciidumpload4.$(OBJEXT)
+asciidumpload4_OBJECTS = $(am_asciidumpload4_OBJECTS)
+asciidumpload4_LDADD = $(LDADD)
+asciidumpload4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload5_OBJECTS = asciidumpload5.$(OBJEXT)
+asciidumpload5_OBJECTS = $(am_asciidumpload5_OBJECTS)
+asciidumpload5_LDADD = $(LDADD)
+asciidumpload5_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload6_OBJECTS = asciidumpload6.$(OBJEXT)
+asciidumpload6_OBJECTS = $(am_asciidumpload6_OBJECTS)
+asciidumpload6_LDADD = $(LDADD)
+asciidumpload6_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload7_OBJECTS = asciidumpload7.$(OBJEXT)
+asciidumpload7_OBJECTS = $(am_asciidumpload7_OBJECTS)
+asciidumpload7_LDADD = $(LDADD)
+asciidumpload7_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
 bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
 bhz03widening1_LDADD = $(LDADD)
@@ -198,18 +304,26 @@ bounded1_LDADD = $(LDADD)
 bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_boundingbox1_OBJECTS = boundingbox1.$(OBJEXT)
 boundingbox1_OBJECTS = $(am_boundingbox1_OBJECTS)
 boundingbox1_LDADD = $(LDADD)
 boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_boundingbox2_OBJECTS = boundingbox2.$(OBJEXT)
-boundingbox2_OBJECTS = $(am_boundingbox2_OBJECTS)
-boundingbox2_LDADD = $(LDADD)
-boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
 am_bounds1_OBJECTS = bounds1.$(OBJEXT)
 bounds1_OBJECTS = $(am_bounds1_OBJECTS)
 bounds1_LDADD = $(LDADD)
@@ -240,10 +354,16 @@ congruences1_LDADD = $(LDADD)
 congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_congruencesystem1_OBJECTS = congruencesystem1.$(OBJEXT)
-congruencesystem1_OBJECTS = $(am_congruencesystem1_OBJECTS)
-congruencesystem1_LDADD = $(LDADD)
-congruencesystem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+am_congruences2_OBJECTS = congruences2.$(OBJEXT)
+congruences2_OBJECTS = $(am_congruences2_OBJECTS)
+congruences2_LDADD = $(LDADD)
+congruences2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
 am_contains1_OBJECTS = contains1.$(OBJEXT)
@@ -252,10 +372,11 @@ contains1_LDADD = $(LDADD)
 contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_copyconstruct1_OBJECTS = copyconstruct1.$(OBJEXT)
-copyconstruct1_OBJECTS = $(am_copyconstruct1_OBJECTS)
-copyconstruct1_LDADD = $(LDADD)
-copyconstruct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
 am_coveringbox1_OBJECTS = coveringbox1.$(OBJEXT)
@@ -300,6 +421,31 @@ foldspacedims1_LDADD = $(LDADD)
 foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_generalizedaffineimage1_OBJECTS =  \
 	generalizedaffineimage1.$(OBJEXT)
 generalizedaffineimage1_OBJECTS =  \
@@ -318,6 +464,15 @@ generalizedaffineimage2_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage3_OBJECTS =  \
+	generalizedaffineimage3.$(OBJEXT)
+generalizedaffineimage3_OBJECTS =  \
+	$(am_generalizedaffineimage3_OBJECTS)
+generalizedaffineimage3_LDADD = $(LDADD)
+generalizedaffineimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_generalizedaffinepreimage1_OBJECTS =  \
 	generalizedaffinepreimage1.$(OBJEXT)
 generalizedaffinepreimage1_OBJECTS =  \
@@ -336,6 +491,15 @@ generalizedaffinepreimage2_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS =  \
+	generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS =  \
+	$(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_generator1_OBJECTS = generator1.$(OBJEXT)
 generator1_OBJECTS = $(am_generator1_OBJECTS)
 generator1_LDADD = $(LDADD)
@@ -348,6 +512,12 @@ generators1_LDADD = $(LDADD)
 generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_generators2_OBJECTS = generators2.$(OBJEXT)
+generators2_OBJECTS = $(am_generators2_OBJECTS)
+generators2_LDADD = $(LDADD)
+generators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_grid1_OBJECTS = grid1.$(OBJEXT)
 grid1_OBJECTS = $(am_grid1_OBJECTS)
 grid1_LDADD = $(LDADD)
@@ -409,6 +579,20 @@ limitedextrapolation1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_limitedextrapolation2_OBJECTS = limitedextrapolation2.$(OBJEXT)
+limitedextrapolation2_OBJECTS = $(am_limitedextrapolation2_OBJECTS)
+limitedextrapolation2_LDADD = $(LDADD)
+limitedextrapolation2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedextrapolation3_OBJECTS = limitedextrapolation3.$(OBJEXT)
+limitedextrapolation3_OBJECTS = $(am_limitedextrapolation3_OBJECTS)
+limitedextrapolation3_LDADD = $(LDADD)
+limitedextrapolation3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
 mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
 mapspacedims1_LDADD = $(LDADD)
@@ -445,6 +629,69 @@ outputoperator1_LDADD = $(LDADD)
 outputoperator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_outputoperator2_OBJECTS = outputoperator2.$(OBJEXT)
+outputoperator2_OBJECTS = $(am_outputoperator2_OBJECTS)
+outputoperator2_LDADD = $(LDADD)
+outputoperator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_outputoperator3_OBJECTS = outputoperator3.$(OBJEXT)
+outputoperator3_OBJECTS = $(am_outputoperator3_OBJECTS)
+outputoperator3_LDADD = $(LDADD)
+outputoperator3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_partition1_OBJECTS = partition1.$(OBJEXT)
+partition1_OBJECTS = $(am_partition1_OBJECTS)
+partition1_LDADD = $(LDADD)
+partition1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset1_OBJECTS = pointsetpowerset1.$(OBJEXT)
+pointsetpowerset1_OBJECTS = $(am_pointsetpowerset1_OBJECTS)
+pointsetpowerset1_LDADD = $(LDADD)
+pointsetpowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powersetdifference1_OBJECTS = powersetdifference1.$(OBJEXT)
+powersetdifference1_OBJECTS = $(am_powersetdifference1_OBJECTS)
+powersetdifference1_LDADD = $(LDADD)
+powersetdifference1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powersetgeometricallycovers1_OBJECTS =  \
+	powersetgeometricallycovers1.$(OBJEXT)
+powersetgeometricallycovers1_OBJECTS =  \
+	$(am_powersetgeometricallycovers1_OBJECTS)
+powersetgeometricallycovers1_LDADD = $(LDADD)
+powersetgeometricallycovers1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powersetgeometricallyequals1_OBJECTS =  \
+	powersetgeometricallyequals1.$(OBJEXT)
+powersetgeometricallyequals1_OBJECTS =  \
+	$(am_powersetgeometricallyequals1_OBJECTS)
+powersetgeometricallyequals1_LDADD = $(LDADD)
+powersetgeometricallyequals1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_relations1_OBJECTS = relations1.$(OBJEXT)
 relations1_OBJECTS = $(am_relations1_OBJECTS)
 relations1_LDADD = $(LDADD)
@@ -457,12 +704,24 @@ relations2_LDADD = $(LDADD)
 relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
 removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
 removespacedims1_LDADD = $(LDADD)
 removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_removespacedims2_OBJECTS = removespacedims2.$(OBJEXT)
+removespacedims2_OBJECTS = $(am_removespacedims2_OBJECTS)
+removespacedims2_LDADD = $(LDADD)
+removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
 timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
 timeelapse1_LDADD = $(LDADD)
@@ -481,12 +740,30 @@ topclosure1_LDADD = $(LDADD)
 topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_widening1_OBJECTS = widening1.$(OBJEXT)
 widening1_OBJECTS = $(am_widening1_OBJECTS)
 widening1_LDADD = $(LDADD)
 widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_widening2_OBJECTS = widening2.$(OBJEXT)
+widening2_OBJECTS = $(am_widening2_OBJECTS)
+widening2_LDADD = $(LDADD)
+widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_widening3_OBJECTS = widening3.$(OBJEXT)
+widening3_OBJECTS = $(am_widening3_OBJECTS)
+widening3_LDADD = $(LDADD)
+widening3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_writecongruencesystem_OBJECTS = writecongruencesystem.$(OBJEXT)
 writecongruencesystem_OBJECTS = $(am_writecongruencesystem_OBJECTS)
 writecongruencesystem_LDADD = $(LDADD)
@@ -494,48 +771,67 @@ writecongruencesystem_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
 	$(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
 	$(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
 	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
 	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
-	$(asciidumpload1_SOURCES) $(bhz03widening1_SOURCES) \
-	$(bounded1_SOURCES) $(boundingbox1_SOURCES) \
-	$(boundingbox2_SOURCES) $(bounds1_SOURCES) \
-	$(certificate1_SOURCES) $(concatenate1_SOURCES) \
-	$(congruence1_SOURCES) $(congruences1_SOURCES) \
-	$(congruencesystem1_SOURCES) $(contains1_SOURCES) \
-	$(copyconstruct1_SOURCES) $(coveringbox1_SOURCES) \
+	$(asciidumpload1_SOURCES) $(asciidumpload2_SOURCES) \
+	$(asciidumpload3_SOURCES) $(asciidumpload4_SOURCES) \
+	$(asciidumpload5_SOURCES) $(asciidumpload6_SOURCES) \
+	$(asciidumpload7_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(boundingbox1_SOURCES) \
+	$(bounds1_SOURCES) $(certificate1_SOURCES) \
+	$(concatenate1_SOURCES) $(congruence1_SOURCES) \
+	$(congruences1_SOURCES) $(congruences2_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(coveringbox1_SOURCES) \
 	$(coveringbox2_SOURCES) $(discrete1_SOURCES) \
 	$(disjoint1_SOURCES) $(equals1_SOURCES) \
 	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
 	$(generalizedaffineimage1_SOURCES) \
 	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
 	$(generalizedaffinepreimage1_SOURCES) \
-	$(generalizedaffinepreimage2_SOURCES) $(generator1_SOURCES) \
-	$(generators1_SOURCES) $(grid1_SOURCES) $(grid2_SOURCES) \
-	$(grid3_SOURCES) $(griddifference1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(generator1_SOURCES) \
+	$(generators1_SOURCES) $(generators2_SOURCES) $(grid1_SOURCES) \
+	$(grid2_SOURCES) $(grid3_SOURCES) $(griddifference1_SOURCES) \
 	$(intersection1_SOURCES) $(isempty1_SOURCES) \
 	$(isuniverse1_SOURCES) $(join1_SOURCES) $(join2_SOURCES) \
-	$(limitedextrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(limitedextrapolation1_SOURCES) \
+	$(limitedextrapolation2_SOURCES) \
+	$(limitedextrapolation3_SOURCES) $(mapspacedims1_SOURCES) \
 	$(maxmin1_SOURCES) $(membytes1_SOURCES) \
 	$(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
-	$(outputoperator1_SOURCES) $(relations1_SOURCES) \
-	$(relations2_SOURCES) $(removespacedims1_SOURCES) \
+	$(outputoperator1_SOURCES) $(outputoperator2_SOURCES) \
+	$(outputoperator3_SOURCES) $(partition1_SOURCES) \
+	$(pointsetpowerset1_SOURCES) $(powersetdifference1_SOURCES) \
+	$(powersetgeometricallycovers1_SOURCES) \
+	$(powersetgeometricallyequals1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
 	$(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
-	$(topclosure1_SOURCES) $(widening1_SOURCES) \
+	$(topclosure1_SOURCES) $(unconstrain1_SOURCES) \
+	$(widening1_SOURCES) $(widening2_SOURCES) $(widening3_SOURCES) \
 	$(writecongruencesystem_SOURCES)
 DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
@@ -543,69 +839,66 @@ DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
 	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
 	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
-	$(asciidumpload1_SOURCES) $(bhz03widening1_SOURCES) \
-	$(bounded1_SOURCES) $(boundingbox1_SOURCES) \
-	$(boundingbox2_SOURCES) $(bounds1_SOURCES) \
-	$(certificate1_SOURCES) $(concatenate1_SOURCES) \
-	$(congruence1_SOURCES) $(congruences1_SOURCES) \
-	$(congruencesystem1_SOURCES) $(contains1_SOURCES) \
-	$(copyconstruct1_SOURCES) $(coveringbox1_SOURCES) \
+	$(asciidumpload1_SOURCES) $(asciidumpload2_SOURCES) \
+	$(asciidumpload3_SOURCES) $(asciidumpload4_SOURCES) \
+	$(asciidumpload5_SOURCES) $(asciidumpload6_SOURCES) \
+	$(asciidumpload7_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(boundingbox1_SOURCES) \
+	$(bounds1_SOURCES) $(certificate1_SOURCES) \
+	$(concatenate1_SOURCES) $(congruence1_SOURCES) \
+	$(congruences1_SOURCES) $(congruences2_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(coveringbox1_SOURCES) \
 	$(coveringbox2_SOURCES) $(discrete1_SOURCES) \
 	$(disjoint1_SOURCES) $(equals1_SOURCES) \
 	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
 	$(generalizedaffineimage1_SOURCES) \
 	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
 	$(generalizedaffinepreimage1_SOURCES) \
-	$(generalizedaffinepreimage2_SOURCES) $(generator1_SOURCES) \
-	$(generators1_SOURCES) $(grid1_SOURCES) $(grid2_SOURCES) \
-	$(grid3_SOURCES) $(griddifference1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(generator1_SOURCES) \
+	$(generators1_SOURCES) $(generators2_SOURCES) $(grid1_SOURCES) \
+	$(grid2_SOURCES) $(grid3_SOURCES) $(griddifference1_SOURCES) \
 	$(intersection1_SOURCES) $(isempty1_SOURCES) \
 	$(isuniverse1_SOURCES) $(join1_SOURCES) $(join2_SOURCES) \
-	$(limitedextrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(limitedextrapolation1_SOURCES) \
+	$(limitedextrapolation2_SOURCES) \
+	$(limitedextrapolation3_SOURCES) $(mapspacedims1_SOURCES) \
 	$(maxmin1_SOURCES) $(membytes1_SOURCES) \
 	$(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
-	$(outputoperator1_SOURCES) $(relations1_SOURCES) \
-	$(relations2_SOURCES) $(removespacedims1_SOURCES) \
+	$(outputoperator1_SOURCES) $(outputoperator2_SOURCES) \
+	$(outputoperator3_SOURCES) $(partition1_SOURCES) \
+	$(pointsetpowerset1_SOURCES) $(powersetdifference1_SOURCES) \
+	$(powersetgeometricallycovers1_SOURCES) \
+	$(powersetgeometricallyequals1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
 	$(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
-	$(topclosure1_SOURCES) $(widening1_SOURCES) \
+	$(topclosure1_SOURCES) $(unconstrain1_SOURCES) \
+	$(widening1_SOURCES) $(widening2_SOURCES) $(widening3_SOURCES) \
 	$(writecongruencesystem_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -615,53 +908,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -670,56 +961,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -731,10 +996,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -743,24 +1012,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 CHECKER = 
 #CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
@@ -778,60 +1065,6 @@ $(top_builddir)/tests/libppl_tests.a \
 $(top_builddir)/src/libppl.la \
 @extra_libraries@
 
-TESTS = \
-addcongruence1 \
-addcongruences1 \
-addconstraint1 \
-addconstraints1 \
-addgenerator1 \
-addgenerators1 \
-addspacedims1 \
-affinedim1 \
-affineimage1 affineimage2 \
-affinepreimage1 affinepreimage2 \
-asciidumpload1 \
-bhz03widening1 \
-bounded1 \
-boundingbox1 boundingbox2 \
-bounds1 \
-certificate1 \
-concatenate1 \
-congruence1 \
-congruences1 \
-congruencesystem1 \
-contains1 \
-copyconstruct1 \
-coveringbox1 coveringbox2 \
-discrete1 \
-disjoint1 \
-equals1 \
-expandspacedim1 \
-foldspacedims1 \
-generalizedaffineimage1 generalizedaffineimage2 \
-generalizedaffinepreimage1 generalizedaffinepreimage2 \
-generator1 \
-generators1 \
-grid1 grid2 grid3 \
-griddifference1 \
-intersection1 \
-isempty1 \
-isuniverse1 \
-join1 join2 \
-limitedextrapolation1 \
-mapspacedims1 \
-maxmin1 \
-membytes1 \
-mingenerators1 \
-mincongruences1 \
-outputoperator1 \
-relations1 relations2 \
-removespacedims1 \
-timeelapse1 \
-topclosed1 \
-topclosure1 \
-widening1 \
-writecongruencesystem
-
 
 #
 # Sources for the tests
@@ -849,29 +1082,44 @@ affineimage2_SOURCES = affineimage2.cc
 affinepreimage1_SOURCES = affinepreimage1.cc
 affinepreimage2_SOURCES = affinepreimage2.cc
 asciidumpload1_SOURCES = asciidumpload1.cc
+asciidumpload2_SOURCES = asciidumpload2.cc
+asciidumpload3_SOURCES = asciidumpload3.cc
+asciidumpload4_SOURCES = asciidumpload4.cc
+asciidumpload5_SOURCES = asciidumpload5.cc
+asciidumpload6_SOURCES = asciidumpload6.cc
+asciidumpload7_SOURCES = asciidumpload7.cc
 bhz03widening1_SOURCES = bhz03widening1.cc
 bounded1_SOURCES = bounded1.cc
 boundingbox1_SOURCES = boundingbox1.cc
-boundingbox2_SOURCES = boundingbox2.cc
 bounds1_SOURCES = bounds1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
 certificate1_SOURCES = certificate1.cc
 concatenate1_SOURCES = concatenate1.cc
 congruence1_SOURCES = congruence1.cc
 congruences1_SOURCES = congruences1.cc
-congruencesystem1_SOURCES = congruencesystem1.cc
+congruences2_SOURCES = congruences2.cc
+constraints1_SOURCES = constraints1.cc
 contains1_SOURCES = contains1.cc
-copyconstruct1_SOURCES = copyconstruct1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
 discrete1_SOURCES = discrete1.cc
 disjoint1_SOURCES = disjoint1.cc
 equals1_SOURCES = equals1.cc
 expandspacedim1_SOURCES = expandspacedim1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
 foldspacedims1_SOURCES = foldspacedims1.cc
 generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
 generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
 generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
 generator1_SOURCES = generator1.cc
 generators1_SOURCES = generators1.cc
+generators2_SOURCES = generators2.cc
 coveringbox1_SOURCES = coveringbox1.cc
 coveringbox2_SOURCES = coveringbox2.cc
 grid1_SOURCES = grid1.cc
@@ -884,41 +1132,44 @@ isuniverse1_SOURCES = isuniverse1.cc
 join1_SOURCES = join1.cc
 join2_SOURCES = join2.cc
 limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+limitedextrapolation2_SOURCES = limitedextrapolation2.cc
+limitedextrapolation3_SOURCES = limitedextrapolation3.cc
 mapspacedims1_SOURCES = mapspacedims1.cc
 maxmin1_SOURCES = maxmin1.cc
 membytes1_SOURCES = membytes1.cc
 mincongruences1_SOURCES = mincongruences1.cc
 mingenerators1_SOURCES = mingenerators1.cc
 outputoperator1_SOURCES = outputoperator1.cc
+outputoperator2_SOURCES = outputoperator2.cc
+outputoperator3_SOURCES = outputoperator3.cc
+partition1_SOURCES = partition1.cc
+powersetdifference1_SOURCES = powersetdifference1.cc
+powersetgeometricallycovers1_SOURCES = powersetgeometricallycovers1.cc
+powersetgeometricallyequals1_SOURCES = powersetgeometricallyequals1.cc
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
 relations1_SOURCES = relations1.cc
 relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
 removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
 timeelapse1_SOURCES = timeelapse1.cc
 topclosed1_SOURCES = topclosed1.cc
 topclosure1_SOURCES = topclosure1.cc
+unconstrain1_SOURCES = unconstrain1.cc
 widening1_SOURCES = widening1.cc
+widening2_SOURCES = widening2.cc
+widening3_SOURCES = widening3.cc
 writecongruencesystem_SOURCES = writecongruencesystem.cc
-XFAIL_ALWAYS = 
-XFAIL_WITH_INT64 = \
-$(XFAIL_ALWAYS)
-
-XFAIL_WITH_INT32 = \
-$(XFAIL_WITH_INT64)
-
-XFAIL_WITH_INT16 = \
-$(XFAIL_WITH_INT32)
-
-XFAIL_WITH_INT8 = \
-$(XFAIL_WITH_INT16)
-
- at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_FALSE at XFAIL_SET = $(XFAIL_ALWAYS)
- at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8)
- at USE_INT16_TRUE@@USE_INT32_FALSE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT16)
- at USE_INT32_TRUE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT32)
- at USE_INT64_TRUE@XFAIL_SET = $(XFAIL_WITH_INT64)
-XFAIL_TESTS = $(XFAIL_SET)
 MOSTLYCLEANFILES = \
-writecongruencesystem.dat
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+ascii_dump_load4.dat \
+ascii_dump_load5.dat \
+ascii_dump_load6.dat \
+ascii_dump_load7.dat
 
 all: all-am
 
@@ -962,190 +1213,283 @@ clean-checkPROGRAMS:
 	done
 addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) 
 	@rm -f addcongruence1$(EXEEXT)
-	$(CXXLINK) $(addcongruence1_LDFLAGS) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+	$(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
 addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) 
 	@rm -f addcongruences1$(EXEEXT)
-	$(CXXLINK) $(addcongruences1_LDFLAGS) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+	$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
 addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) 
 	@rm -f addconstraint1$(EXEEXT)
-	$(CXXLINK) $(addconstraint1_LDFLAGS) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+	$(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
 addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
 	@rm -f addconstraints1$(EXEEXT)
-	$(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
 addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) 
 	@rm -f addgenerator1$(EXEEXT)
-	$(CXXLINK) $(addgenerator1_LDFLAGS) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+	$(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
 addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) 
 	@rm -f addgenerators1$(EXEEXT)
-	$(CXXLINK) $(addgenerators1_LDFLAGS) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+	$(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
 addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
 	@rm -f addspacedims1$(EXEEXT)
-	$(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
 affinedim1$(EXEEXT): $(affinedim1_OBJECTS) $(affinedim1_DEPENDENCIES) 
 	@rm -f affinedim1$(EXEEXT)
-	$(CXXLINK) $(affinedim1_LDFLAGS) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS)
+	$(CXXLINK) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS)
 affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
 	@rm -f affineimage1$(EXEEXT)
-	$(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
 affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
 	@rm -f affineimage2$(EXEEXT)
-	$(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
 affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
 	@rm -f affinepreimage1$(EXEEXT)
-	$(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
 affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) 
 	@rm -f affinepreimage2$(EXEEXT)
-	$(CXXLINK) $(affinepreimage2_LDFLAGS) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
 asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) 
 	@rm -f asciidumpload1$(EXEEXT)
-	$(CXXLINK) $(asciidumpload1_LDFLAGS) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+	$(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+asciidumpload2$(EXEEXT): $(asciidumpload2_OBJECTS) $(asciidumpload2_DEPENDENCIES) 
+	@rm -f asciidumpload2$(EXEEXT)
+	$(CXXLINK) $(asciidumpload2_OBJECTS) $(asciidumpload2_LDADD) $(LIBS)
+asciidumpload3$(EXEEXT): $(asciidumpload3_OBJECTS) $(asciidumpload3_DEPENDENCIES) 
+	@rm -f asciidumpload3$(EXEEXT)
+	$(CXXLINK) $(asciidumpload3_OBJECTS) $(asciidumpload3_LDADD) $(LIBS)
+asciidumpload4$(EXEEXT): $(asciidumpload4_OBJECTS) $(asciidumpload4_DEPENDENCIES) 
+	@rm -f asciidumpload4$(EXEEXT)
+	$(CXXLINK) $(asciidumpload4_OBJECTS) $(asciidumpload4_LDADD) $(LIBS)
+asciidumpload5$(EXEEXT): $(asciidumpload5_OBJECTS) $(asciidumpload5_DEPENDENCIES) 
+	@rm -f asciidumpload5$(EXEEXT)
+	$(CXXLINK) $(asciidumpload5_OBJECTS) $(asciidumpload5_LDADD) $(LIBS)
+asciidumpload6$(EXEEXT): $(asciidumpload6_OBJECTS) $(asciidumpload6_DEPENDENCIES) 
+	@rm -f asciidumpload6$(EXEEXT)
+	$(CXXLINK) $(asciidumpload6_OBJECTS) $(asciidumpload6_LDADD) $(LIBS)
+asciidumpload7$(EXEEXT): $(asciidumpload7_OBJECTS) $(asciidumpload7_DEPENDENCIES) 
+	@rm -f asciidumpload7$(EXEEXT)
+	$(CXXLINK) $(asciidumpload7_OBJECTS) $(asciidumpload7_LDADD) $(LIBS)
 bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
 	@rm -f bhz03widening1$(EXEEXT)
-	$(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
 bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
 	@rm -f bounded1$(EXEEXT)
-	$(CXXLINK) $(bounded1_LDFLAGS) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+	$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
 boundingbox1$(EXEEXT): $(boundingbox1_OBJECTS) $(boundingbox1_DEPENDENCIES) 
 	@rm -f boundingbox1$(EXEEXT)
-	$(CXXLINK) $(boundingbox1_LDFLAGS) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
-boundingbox2$(EXEEXT): $(boundingbox2_OBJECTS) $(boundingbox2_DEPENDENCIES) 
-	@rm -f boundingbox2$(EXEEXT)
-	$(CXXLINK) $(boundingbox2_LDFLAGS) $(boundingbox2_OBJECTS) $(boundingbox2_LDADD) $(LIBS)
+	$(CXXLINK) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
 bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) 
 	@rm -f bounds1$(EXEEXT)
-	$(CXXLINK) $(bounds1_LDFLAGS) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+	$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
 certificate1$(EXEEXT): $(certificate1_OBJECTS) $(certificate1_DEPENDENCIES) 
 	@rm -f certificate1$(EXEEXT)
-	$(CXXLINK) $(certificate1_LDFLAGS) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS)
+	$(CXXLINK) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS)
 concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
 	@rm -f concatenate1$(EXEEXT)
-	$(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+	$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
 congruence1$(EXEEXT): $(congruence1_OBJECTS) $(congruence1_DEPENDENCIES) 
 	@rm -f congruence1$(EXEEXT)
-	$(CXXLINK) $(congruence1_LDFLAGS) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS)
+	$(CXXLINK) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS)
 congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
 	@rm -f congruences1$(EXEEXT)
-	$(CXXLINK) $(congruences1_LDFLAGS) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
-congruencesystem1$(EXEEXT): $(congruencesystem1_OBJECTS) $(congruencesystem1_DEPENDENCIES) 
-	@rm -f congruencesystem1$(EXEEXT)
-	$(CXXLINK) $(congruencesystem1_LDFLAGS) $(congruencesystem1_OBJECTS) $(congruencesystem1_LDADD) $(LIBS)
+	$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+congruences2$(EXEEXT): $(congruences2_OBJECTS) $(congruences2_DEPENDENCIES) 
+	@rm -f congruences2$(EXEEXT)
+	$(CXXLINK) $(congruences2_OBJECTS) $(congruences2_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
 contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
 	@rm -f contains1$(EXEEXT)
-	$(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
-copyconstruct1$(EXEEXT): $(copyconstruct1_OBJECTS) $(copyconstruct1_DEPENDENCIES) 
-	@rm -f copyconstruct1$(EXEEXT)
-	$(CXXLINK) $(copyconstruct1_LDFLAGS) $(copyconstruct1_OBJECTS) $(copyconstruct1_LDADD) $(LIBS)
+	$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
 coveringbox1$(EXEEXT): $(coveringbox1_OBJECTS) $(coveringbox1_DEPENDENCIES) 
 	@rm -f coveringbox1$(EXEEXT)
-	$(CXXLINK) $(coveringbox1_LDFLAGS) $(coveringbox1_OBJECTS) $(coveringbox1_LDADD) $(LIBS)
+	$(CXXLINK) $(coveringbox1_OBJECTS) $(coveringbox1_LDADD) $(LIBS)
 coveringbox2$(EXEEXT): $(coveringbox2_OBJECTS) $(coveringbox2_DEPENDENCIES) 
 	@rm -f coveringbox2$(EXEEXT)
-	$(CXXLINK) $(coveringbox2_LDFLAGS) $(coveringbox2_OBJECTS) $(coveringbox2_LDADD) $(LIBS)
+	$(CXXLINK) $(coveringbox2_OBJECTS) $(coveringbox2_LDADD) $(LIBS)
 discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) 
 	@rm -f discrete1$(EXEEXT)
-	$(CXXLINK) $(discrete1_LDFLAGS) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+	$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
 disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
 	@rm -f disjoint1$(EXEEXT)
-	$(CXXLINK) $(disjoint1_LDFLAGS) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+	$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
 equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) 
 	@rm -f equals1$(EXEEXT)
-	$(CXXLINK) $(equals1_LDFLAGS) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+	$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
 expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
 	@rm -f expandspacedim1$(EXEEXT)
-	$(CXXLINK) $(expandspacedim1_LDFLAGS) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+	$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
 foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
 	@rm -f foldspacedims1$(EXEEXT)
-	$(CXXLINK) $(foldspacedims1_LDFLAGS) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
 generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
 	@rm -f generalizedaffineimage1$(EXEEXT)
-	$(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
 generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
 	@rm -f generalizedaffineimage2$(EXEEXT)
-	$(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) 
+	@rm -f generalizedaffineimage3$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS)
 generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
 	@rm -f generalizedaffinepreimage1$(EXEEXT)
-	$(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
 generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
 	@rm -f generalizedaffinepreimage2$(EXEEXT)
-	$(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage3$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
 generator1$(EXEEXT): $(generator1_OBJECTS) $(generator1_DEPENDENCIES) 
 	@rm -f generator1$(EXEEXT)
-	$(CXXLINK) $(generator1_LDFLAGS) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS)
+	$(CXXLINK) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS)
 generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) 
 	@rm -f generators1$(EXEEXT)
-	$(CXXLINK) $(generators1_LDFLAGS) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+	$(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+generators2$(EXEEXT): $(generators2_OBJECTS) $(generators2_DEPENDENCIES) 
+	@rm -f generators2$(EXEEXT)
+	$(CXXLINK) $(generators2_OBJECTS) $(generators2_LDADD) $(LIBS)
 grid1$(EXEEXT): $(grid1_OBJECTS) $(grid1_DEPENDENCIES) 
 	@rm -f grid1$(EXEEXT)
-	$(CXXLINK) $(grid1_LDFLAGS) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS)
+	$(CXXLINK) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS)
 grid2$(EXEEXT): $(grid2_OBJECTS) $(grid2_DEPENDENCIES) 
 	@rm -f grid2$(EXEEXT)
-	$(CXXLINK) $(grid2_LDFLAGS) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS)
+	$(CXXLINK) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS)
 grid3$(EXEEXT): $(grid3_OBJECTS) $(grid3_DEPENDENCIES) 
 	@rm -f grid3$(EXEEXT)
-	$(CXXLINK) $(grid3_LDFLAGS) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS)
+	$(CXXLINK) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS)
 griddifference1$(EXEEXT): $(griddifference1_OBJECTS) $(griddifference1_DEPENDENCIES) 
 	@rm -f griddifference1$(EXEEXT)
-	$(CXXLINK) $(griddifference1_LDFLAGS) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS)
+	$(CXXLINK) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS)
 intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
 	@rm -f intersection1$(EXEEXT)
-	$(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+	$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
 isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) 
 	@rm -f isempty1$(EXEEXT)
-	$(CXXLINK) $(isempty1_LDFLAGS) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+	$(CXXLINK) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
 isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) 
 	@rm -f isuniverse1$(EXEEXT)
-	$(CXXLINK) $(isuniverse1_LDFLAGS) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+	$(CXXLINK) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
 join1$(EXEEXT): $(join1_OBJECTS) $(join1_DEPENDENCIES) 
 	@rm -f join1$(EXEEXT)
-	$(CXXLINK) $(join1_LDFLAGS) $(join1_OBJECTS) $(join1_LDADD) $(LIBS)
+	$(CXXLINK) $(join1_OBJECTS) $(join1_LDADD) $(LIBS)
 join2$(EXEEXT): $(join2_OBJECTS) $(join2_DEPENDENCIES) 
 	@rm -f join2$(EXEEXT)
-	$(CXXLINK) $(join2_LDFLAGS) $(join2_OBJECTS) $(join2_LDADD) $(LIBS)
+	$(CXXLINK) $(join2_OBJECTS) $(join2_LDADD) $(LIBS)
 limitedextrapolation1$(EXEEXT): $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_DEPENDENCIES) 
 	@rm -f limitedextrapolation1$(EXEEXT)
-	$(CXXLINK) $(limitedextrapolation1_LDFLAGS) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS)
+limitedextrapolation2$(EXEEXT): $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_DEPENDENCIES) 
+	@rm -f limitedextrapolation2$(EXEEXT)
+	$(CXXLINK) $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_LDADD) $(LIBS)
+limitedextrapolation3$(EXEEXT): $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_DEPENDENCIES) 
+	@rm -f limitedextrapolation3$(EXEEXT)
+	$(CXXLINK) $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_LDADD) $(LIBS)
 mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
 	@rm -f mapspacedims1$(EXEEXT)
-	$(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
 maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) 
 	@rm -f maxmin1$(EXEEXT)
-	$(CXXLINK) $(maxmin1_LDFLAGS) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+	$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
 membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
 	@rm -f membytes1$(EXEEXT)
-	$(CXXLINK) $(membytes1_LDFLAGS) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+	$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
 mincongruences1$(EXEEXT): $(mincongruences1_OBJECTS) $(mincongruences1_DEPENDENCIES) 
 	@rm -f mincongruences1$(EXEEXT)
-	$(CXXLINK) $(mincongruences1_LDFLAGS) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS)
+	$(CXXLINK) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS)
 mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) 
 	@rm -f mingenerators1$(EXEEXT)
-	$(CXXLINK) $(mingenerators1_LDFLAGS) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+	$(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
 outputoperator1$(EXEEXT): $(outputoperator1_OBJECTS) $(outputoperator1_DEPENDENCIES) 
 	@rm -f outputoperator1$(EXEEXT)
-	$(CXXLINK) $(outputoperator1_LDFLAGS) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS)
+	$(CXXLINK) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS)
+outputoperator2$(EXEEXT): $(outputoperator2_OBJECTS) $(outputoperator2_DEPENDENCIES) 
+	@rm -f outputoperator2$(EXEEXT)
+	$(CXXLINK) $(outputoperator2_OBJECTS) $(outputoperator2_LDADD) $(LIBS)
+outputoperator3$(EXEEXT): $(outputoperator3_OBJECTS) $(outputoperator3_DEPENDENCIES) 
+	@rm -f outputoperator3$(EXEEXT)
+	$(CXXLINK) $(outputoperator3_OBJECTS) $(outputoperator3_LDADD) $(LIBS)
+partition1$(EXEEXT): $(partition1_OBJECTS) $(partition1_DEPENDENCIES) 
+	@rm -f partition1$(EXEEXT)
+	$(CXXLINK) $(partition1_OBJECTS) $(partition1_LDADD) $(LIBS)
+pointsetpowerset1$(EXEEXT): $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_DEPENDENCIES) 
+	@rm -f pointsetpowerset1$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_LDADD) $(LIBS)
+powersetdifference1$(EXEEXT): $(powersetdifference1_OBJECTS) $(powersetdifference1_DEPENDENCIES) 
+	@rm -f powersetdifference1$(EXEEXT)
+	$(CXXLINK) $(powersetdifference1_OBJECTS) $(powersetdifference1_LDADD) $(LIBS)
+powersetgeometricallycovers1$(EXEEXT): $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_DEPENDENCIES) 
+	@rm -f powersetgeometricallycovers1$(EXEEXT)
+	$(CXXLINK) $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_LDADD) $(LIBS)
+powersetgeometricallyequals1$(EXEEXT): $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_DEPENDENCIES) 
+	@rm -f powersetgeometricallyequals1$(EXEEXT)
+	$(CXXLINK) $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_LDADD) $(LIBS)
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
 relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
 	@rm -f relations1$(EXEEXT)
-	$(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+	$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
 relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
 	@rm -f relations2$(EXEEXT)
-	$(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+	$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
 removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
 	@rm -f removespacedims1$(EXEEXT)
-	$(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) 
+	@rm -f removespacedims2$(EXEEXT)
+	$(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
 timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
 	@rm -f timeelapse1$(EXEEXT)
-	$(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+	$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
 topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) 
 	@rm -f topclosed1$(EXEEXT)
-	$(CXXLINK) $(topclosed1_LDFLAGS) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+	$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
 topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) 
 	@rm -f topclosure1$(EXEEXT)
-	$(CXXLINK) $(topclosure1_LDFLAGS) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+	$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
 widening1$(EXEEXT): $(widening1_OBJECTS) $(widening1_DEPENDENCIES) 
 	@rm -f widening1$(EXEEXT)
-	$(CXXLINK) $(widening1_LDFLAGS) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS)
+widening2$(EXEEXT): $(widening2_OBJECTS) $(widening2_DEPENDENCIES) 
+	@rm -f widening2$(EXEEXT)
+	$(CXXLINK) $(widening2_OBJECTS) $(widening2_LDADD) $(LIBS)
+widening3$(EXEEXT): $(widening3_OBJECTS) $(widening3_DEPENDENCIES) 
+	@rm -f widening3$(EXEEXT)
+	$(CXXLINK) $(widening3_OBJECTS) $(widening3_LDADD) $(LIBS)
 writecongruencesystem$(EXEEXT): $(writecongruencesystem_OBJECTS) $(writecongruencesystem_DEPENDENCIES) 
 	@rm -f writecongruencesystem$(EXEEXT)
-	$(CXXLINK) $(writecongruencesystem_LDFLAGS) $(writecongruencesystem_OBJECTS) $(writecongruencesystem_LDADD) $(LIBS)
+	$(CXXLINK) $(writecongruencesystem_OBJECTS) $(writecongruencesystem_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -1166,18 +1510,26 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload6.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload7.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/certificate1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruence1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruencesystem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/copyconstruct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/coveringbox1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/coveringbox2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
@@ -1185,12 +1537,19 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generator1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid3.Po at am__quote@
@@ -1201,38 +1560,54 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/join1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/join2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mincongruences1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetgeometricallycovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetgeometricallyequals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writecongruencesystem.Po at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -1243,17 +1618,13 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -1265,8 +1636,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -1276,13 +1647,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -1296,9 +1666,9 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
 	srcdir=$(srcdir); export srcdir; \
-	list='$(TESTS)'; \
+	list=' $(TESTS) '; \
 	if test -n "$$list"; then \
 	  for tst in $$list; do \
 	    if test -f ./$$tst; then dir=./; \
@@ -1307,7 +1677,7 @@ check-TESTS: $(TESTS)
 	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
 	      all=`expr $$all + 1`; \
 	      case " $(XFAIL_TESTS) " in \
-	      *" $$tst "*) \
+	      *$$ws$$tst$$ws*) \
 		xpass=`expr $$xpass + 1`; \
 		failed=`expr $$failed + 1`; \
 		echo "XPASS: $$tst"; \
@@ -1319,7 +1689,7 @@ check-TESTS: $(TESTS)
 	    elif test $$? -ne 77; then \
 	      all=`expr $$all + 1`; \
 	      case " $(XFAIL_TESTS) " in \
-	      *" $$tst "*) \
+	      *$$ws$$tst$$ws*) \
 		xfail=`expr $$xfail + 1`; \
 		echo "XFAIL: $$tst"; \
 	      ;; \
@@ -1369,22 +1739,21 @@ check-TESTS: $(TESTS)
 	else :; fi
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -1435,7 +1804,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -1449,12 +1818,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -1475,19 +1852,23 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
 	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am
+	tags uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/Grid/addcongruence1.cc b/tests/Grid/addcongruence1.cc
index 176dbe1..664535c 100644
--- a/tests/Grid/addcongruence1.cc
+++ b/tests/Grid/addcongruence1.cc
@@ -1,11 +1,11 @@
 /* Test methods which add a single congruence to a grid.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,8 +39,7 @@ test01() {
 
   gr.add_congruence((A + B %= 0) / 6);
 
-  print_congruences(gr,
-		    "*** gr.add_congruence((A + B %= 0) / 6) ***");
+  print_congruences(gr, "*** gr.add_congruence((A + B %= 0) / 6) ***");
 
   gr.add_congruence_and_minimize((A + B %= 0) / 3);
 
@@ -50,7 +49,7 @@ test01() {
   bool ok = (gr == known_gr) ;
 
   print_congruences(gr,
-	"*** gr.add_congruence_and_minimize((A + B %= 0) / 3) ***");
+		    "*** gr.add_congruence_and_minimize((A + B %= 0) / 3) ***");
 
   return ok;
 }
@@ -89,10 +88,10 @@ test03() {
   gr.add_congruence((A %= 0) / 7);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(parameter(7*A));
-  known_gr.add_generator(parameter(7*B));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(7*A));
+  known_gr.add_grid_generator(parameter(7*B));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
@@ -113,10 +112,10 @@ test04() {
   gr.add_congruence_and_minimize((A %= 0) / 7);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(parameter(7*A));
-  known_gr.add_generator(parameter(7*B));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(7*A));
+  known_gr.add_grid_generator(parameter(7*B));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
@@ -125,6 +124,26 @@ test04() {
   return ok;
 }
 
+// Space dimension exception.
+static bool
+test05() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.add_congruence(A + C %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -132,4 +151,5 @@ BEGIN_MAIN
   DO_TEST(test02);
   DO_TEST(test03);
   DO_TEST(test04);
+  DO_TEST(test05);
 END_MAIN
diff --git a/tests/Grid/addcongruences1.cc b/tests/Grid/addcongruences1.cc
index e449d19..2c7537f 100644
--- a/tests/Grid/addcongruences1.cc
+++ b/tests/Grid/addcongruences1.cc
@@ -1,11 +1,11 @@
 /* Test methods which can add multiple congruences to a grid.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -97,8 +97,8 @@ test03() {
   gr.add_congruences_and_minimize(cgs);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(2*A - 2*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(2*A - 2*B));
 
   bool ok = (gr == known_gr);
 
@@ -124,13 +124,13 @@ test04() {
   gr.add_recycled_congruences_and_minimize(cgs);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(2*A + 2*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(2*A + 2*B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
 
   return ok;
 }
@@ -152,11 +152,11 @@ test05() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_congruences(cgs) -- space dimension exception
@@ -175,11 +175,11 @@ test06() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_recycled_congruences_and_minimize(cgs) -- space dimension
@@ -198,11 +198,11 @@ test07() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_recycled_congruences, empty grid.
@@ -239,7 +239,7 @@ test09() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point(3*A + B));
+  gr.add_grid_generator(grid_point(3*A + B));
 
   Grid known_gr = gr;
 
@@ -250,7 +250,7 @@ test09() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_congruences_and_minimize(cgs ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cgs ***");
 
   return ok;
 }
@@ -274,7 +274,7 @@ test10() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
 
   return ok;
 }
@@ -299,7 +299,7 @@ test11() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
 
   return ok;
 }
@@ -314,7 +314,7 @@ test12() {
 
   // Ensure both systems are up to date with only generators minimal.
   gr.affine_image(A, 1*A);
-  gr.minimized_generators();
+  gr.minimized_grid_generators();
 
   print_congruences(gr, "*** gr ***");
 
@@ -327,7 +327,7 @@ test12() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
 
   return ok;
 }
@@ -354,7 +354,7 @@ test13() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
 
   return ok;
 }
@@ -372,13 +372,13 @@ test14() {
   cgs.insert((A %= 0) / 7);
 
   gr1.add_recycled_congruences_and_minimize(cgs);
-  print_generators(gr1, "gr1: ");
-  print_congruences(gr1, "gr1: ");
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(2);
   gr2.add_congruence((A %= 0) / 7);
-  print_generators(gr2, "gr2: ");
-  print_congruences(gr2, "gr2: ");
+  print_generators(gr2, "*** gr2 ***");
+  print_congruences(gr2, "*** gr2 ***");
 
   Grid known_gr = gr2;
 
@@ -389,6 +389,36 @@ test14() {
   return ok;
 }
 
+// add_recycled_congruences_and_minimize, add empty system to grid
+// with minimized congruences and up to date generators.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator_and_minimize(parameter(3*A));
+
+  // Ensure both systems are up to date with only congruences minimal.
+  gr.affine_image(A, 1*A);
+  gr.minimized_congruences();
+
+  print_congruences(gr, "*** gr ***");
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -406,4 +436,5 @@ BEGIN_MAIN
   DO_TEST(test12);
   DO_TEST(test13);
   DO_TEST(test14);
+  DO_TEST(test15);
 END_MAIN
diff --git a/tests/Grid/addconstraint1.cc b/tests/Grid/addconstraint1.cc
index 3aa5af0..e3c771b 100644
--- a/tests/Grid/addconstraint1.cc
+++ b/tests/Grid/addconstraint1.cc
@@ -1,11 +1,11 @@
 /* Test adding single constraints to grids.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -71,7 +71,7 @@ test02() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_constraint(*ph.constraints().begin()) ***");
+		    "*** gr.add_constraint(*ph.constraints().begin()) ***");
 
   return ok;
 }
@@ -185,8 +185,7 @@ test07() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_congruence_and_minimize(C > 4*A) ***");
+  print_congruences(gr, "*** gr.add_congruence_and_minimize(C > 4*A) ***");
 
   return ok;
 }
@@ -203,11 +202,11 @@ test08() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_constraint_and_minimize -- space dimension exception
@@ -222,11 +221,11 @@ test09() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/addconstraints1.cc b/tests/Grid/addconstraints1.cc
index 65b7ecf..f96e787 100644
--- a/tests/Grid/addconstraints1.cc
+++ b/tests/Grid/addconstraints1.cc
@@ -1,11 +1,11 @@
 /* Test adding constraints to a grid.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -190,7 +190,7 @@ test06() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_congruences_and_minimize(cs) ***");
+		    "*** gr.add_recycled_congruences_and_minimize(cs) ***");
 
   return ok;
 }
@@ -278,7 +278,7 @@ test09() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_constraints_and_minimize(cs) ***");
+		    "*** gr.add_recycled_constraints_and_minimize(cs) ***");
 
   return ok;
 }
@@ -299,11 +299,11 @@ test10() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_congruences(cs) -- space dimension exception
@@ -322,11 +322,11 @@ test11() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_recycled_congruences_and_minimize(cs) -- space dimension
@@ -346,11 +346,11 @@ test12() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_congruences_and_minimize(cs) -- space dimension exception
@@ -369,11 +369,11 @@ test13() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_constraints(cs) -- space dimension exception
@@ -392,11 +392,11 @@ test14() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_constraints(cs) -- space dimension exception
@@ -415,11 +415,11 @@ test15() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_recycled_constraints(cs) -- space dimension exception
@@ -438,11 +438,11 @@ test16() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_recycled_constraints_and_minimize(cs) -- space dimension
@@ -462,11 +462,11 @@ test17() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // add_constraints_and_minimize(cs) -- space dimension exception
@@ -485,11 +485,44 @@ test18() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+// Construct a congruence system from a constraint system
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  Congruence_System cgs(cs);
+
+  Grid gr(3);
+  Grid gr1(3);
+
+  gr.add_constraints(cs);
+  gr1.add_congruences(cgs);
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+  print_congruences(gr1, "*** gr1.add_congruences(cgs) ***");
+  bool ok = (gr1 == gr);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(B == 0);
+
+  ok &= (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -513,4 +546,5 @@ BEGIN_MAIN
   DO_TEST(test16);
   DO_TEST(test17);
   DO_TEST(test18);
+  DO_TEST(test19);
 END_MAIN
diff --git a/tests/Grid/addgenerator1.cc b/tests/Grid/addgenerator1.cc
index 5b6f7e9..37c81f5 100644
--- a/tests/Grid/addgenerator1.cc
+++ b/tests/Grid/addgenerator1.cc
@@ -1,11 +1,11 @@
-/* Test Grid::add_generator*().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Grid::add_grid_generator*().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,7 +22,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-// grid1.cc also tests add_generator_and_minimize.
+// grid1.cc also tests add_grid_generator_and_minimize.
 
 // One dimension.
 bool
@@ -33,15 +33,14 @@ test01() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point(-A));
+  gr.add_grid_generator(grid_point(-A));
 
   Grid known_gr(1);
   known_gr.add_congruence((A == -1) / 0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(grid_point(-A)) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point(-A)) ***");
 
   return ok;
 }
@@ -55,7 +54,7 @@ test02() {
   Grid gr(2, EMPTY);
 
   print_congruences(gr, "*** gr ***");
-  gr.add_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(A + B));
 
   Grid known_gr(2);
   known_gr.add_congruence((A == 1) / 0);
@@ -63,8 +62,7 @@ test02() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(grid_point(A + B)) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point(A + B)) ***");
 
   return ok;
 }
@@ -80,31 +78,29 @@ test03() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A + 2*B));
-  gr.add_generator(grid_point(A + B));
-  gr.add_generator(grid_point(2*A + 2*B));
-  gr.add_generator(grid_line(A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A + 2*B));
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_line(A));
 
   Grid known_gr(2);
   known_gr.add_congruence(B %= 0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(...) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(...) ***");
 
   return ok;
 }
 
-// Add NNC generators.
+// Add generators where one has a divisor.
 bool
 test04() {
   Variable A(0);
   Variable B(1);
 
   Grid_Generator_System gs;
-  //gs.insert(closure_point(3*A, 4)); // FIX
   gs.insert(grid_point(7*A, 4));
   gs.insert(grid_line(A - B));
 
@@ -114,15 +110,14 @@ test04() {
 
   for (Grid_Generator_System::const_iterator i = gs.begin(),
 	 gs_end = gs.end(); i != gs_end; ++i)
-    gr.add_generator(*i);
+    gr.add_grid_generator(*i);
 
   Grid known_gr(2);
   known_gr.add_congruence((4*A + 4*B == 7) / 0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(*i) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(*i) ***");
 
   return ok;
 }
@@ -138,9 +133,9 @@ test05() {
   Grid gr(4, EMPTY);
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point(7*A, 3));
-  print_congruences(gr, "*** gr.add_generator(grid_point(7*A, 3)) ***");
-  gr.add_generator(grid_line(A - B));
+  gr.add_grid_generator(grid_point(7*A, 3));
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point(7*A, 3)) ***");
+  gr.add_grid_generator(grid_line(A - B));
 
   Grid known_gr(4);
 
@@ -150,27 +145,26 @@ test05() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(grid_line(A - B)) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(grid_line(A - B)) ***");
 
   return ok;
 }
 
-// add_generator_and_minimize
+// add_grid_generator_and_minimize
 bool
 test06() {
   Variable A(0);
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A + 2*B));
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point(8*A + 8*B));
+  gr.add_grid_generator(grid_point(8*A + 8*B));
 
-  gr.add_generator_and_minimize(grid_line(A));
+  gr.add_grid_generator_and_minimize(grid_line(A));
 
   Grid known_gr(2);
   known_gr.add_congruence((B %= 0) / 2);
@@ -178,7 +172,7 @@ test06() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_generator_and_minimize(grid_line(A)) ***");
+		    "*** gr.add_grid_generator_and_minimize(grid_line(A)) ***");
 
   return ok;
 }
@@ -195,20 +189,20 @@ test07() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point(12*A + 7*D));
+  gr.add_grid_generator(grid_point(12*A + 7*D));
 
   Grid known_gr(4);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "***  ***");
+		    "*** gr.add_grid_generator(grid_point(12*A + 7*D)) ***");
 
   return ok;
 }
 
-// add_generator_and_minimize, adding a generator with a divisor to a
-// grid of many generators.
+// add_grid_generator_and_minimize, adding a generator with a divisor
+// to a grid of many generators.
 bool
 test08() {
   Variable A(0);
@@ -216,14 +210,14 @@ test08() {
 
   Grid gr(2, EMPTY);
 
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
 
   print_congruences(gr, "*** gr ***");
 
   // Minimize the grid.
 
-  gr.add_generator_and_minimize(grid_point(B, 3));
+  gr.add_grid_generator_and_minimize(grid_point(B, 3));
 
   Grid known_gr(2);
   known_gr.add_congruence(A %= 0);
@@ -232,7 +226,7 @@ test08() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_generator_and_minimize(grid_point(B, 3)) ***");
+		    "*** gr.add_grid_generator_and_minimize(grid_point(B, 3)) ***");
 
   return ok;
 }
@@ -246,15 +240,15 @@ test09() {
   Grid gr(2);
 
   try {
-    gr.add_generator(grid_point(A + C));
+    gr.add_grid_generator(grid_point(A + C));
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Zero dimensions empty.
@@ -264,14 +258,13 @@ test10() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point());
+  gr.add_grid_generator(grid_point());
 
   Grid known_gr(0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(grid_point()) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point()) ***");
 
   return ok;
 }
@@ -283,14 +276,13 @@ test11() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.add_generator(grid_point());
+  gr.add_grid_generator(grid_point());
 
   Grid known_gr(0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_generator(grid_point()) ***");
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point()) ***");
 
   return ok;
 }
@@ -303,15 +295,15 @@ test12() {
   Grid gr(2, EMPTY);
 
   try {
-    gr.add_generator(grid_line(A));
+    gr.add_grid_generator(grid_line(A));
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Try add parameter to empty grid.
@@ -320,15 +312,15 @@ test13() {
   Grid gr(2, EMPTY);
 
   try {
-    gr.add_generator(parameter());
+    gr.add_grid_generator(parameter());
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Try add parameter to zero dimension empty grid.
@@ -337,15 +329,15 @@ test14() {
   Grid gr(0, EMPTY);
 
   try {
-    gr.add_generator(parameter());
+    gr.add_grid_generator(parameter());
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 BEGIN_MAIN
diff --git a/tests/Grid/addgenerators1.cc b/tests/Grid/addgenerators1.cc
index 28374b1..1bcee86 100644
--- a/tests/Grid/addgenerators1.cc
+++ b/tests/Grid/addgenerators1.cc
@@ -1,11 +1,11 @@
 /* Test methods which can add multiple generators to a grid.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,9 +24,9 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace {
 
-// grid1*.cc use add_generators_and_minimize often.
+// grid1*.cc use add_grid_generators_and_minimize often.
 
-// add_recycled_generators -- space dimension exception.
+// add_recycled_grid_generators -- space dimension exception.
 bool
 test01() {
   Variable A(0);
@@ -38,18 +38,18 @@ test01() {
   Grid gr(1);
 
   try {
-    gr.add_recycled_generators(gs);
+    gr.add_recycled_grid_generators(gs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
-// add_recycled_generators_and_minimize -- space dimension exception.
+// add_recycled_grid_generators_and_minimize -- space dimension exception.
 bool
 test02() {
   Variable A(0);
@@ -61,18 +61,18 @@ test02() {
   Grid gr(1);
 
   try {
-    gr.add_recycled_generators_and_minimize(gs);
+    gr.add_recycled_grid_generators_and_minimize(gs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
-// add_recycled_generators -- zero dimension universe.
+// add_recycled_grid_generators -- zero dimension universe.
 bool
 test03() {
   Grid_Generator_System gs;
@@ -82,19 +82,18 @@ test03() {
 
   print_generators(gr, "*** gr ***");
 
-  gr.add_recycled_generators(gs);
+  gr.add_recycled_grid_generators(gs);
 
   Grid known_gr(0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_recycled_generators(gs) ***");
+  print_congruences(gr, "*** gr.add_recycled_grid_generators(gs) ***");
 
   return ok;
 }
 
-// add_recycled_generators -- zero dimension empty.
+// add_recycled_grid_generators -- zero dimension empty.
 bool
 test04() {
   Grid_Generator_System gs;
@@ -104,19 +103,21 @@ test04() {
 
   print_generators(gr, "*** gr ***");
 
-  gr.add_recycled_generators(gs);
+  gr.add_recycled_grid_generators(gs);
 
   Grid known_gr(0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-      "*** gr.add_recycled_generators(gs) ***");
+  print_congruences(gr, "*** gr.add_recycled_grid_generators(gs) ***");
 
   return ok;
 }
 
-// add_recycled_generators -- add system with a single parameter
+#if 0
+// Grid_Generator_System::remove_space_dimensions is now private.
+
+// add_recycled_grid_generators -- add system with a single parameter
 // generator to the zero dimension empty grid.
 bool
 test05() {
@@ -135,19 +136,19 @@ test05() {
   Grid gr(0, EMPTY);
 
   try {
-    gr.add_recycled_generators(gs);
+    gr.add_recycled_grid_generators(gs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
-// add_recycled_generators_and_minimize -- add system with a single
-// parameter generator to the zero dimension empty grid.
+// add_recycled_grid_generators_and_minimize -- add system with a
+// single parameter generator to the zero dimension empty grid.
 bool
 test06() {
   Variable A(0);
@@ -165,18 +166,19 @@ test06() {
   Grid gr(0, EMPTY);
 
   try {
-    gr.add_recycled_generators_and_minimize(gs);
+    gr.add_recycled_grid_generators_and_minimize(gs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
+#endif
 
-// add_recycled_generators -- add system with a single parameter
+// add_recycled_grid_generators -- add system with a single parameter
 // generator to the empty grid.
 bool
 test07() {
@@ -188,25 +190,25 @@ test07() {
   Grid gr(2, EMPTY);
 
   try {
-    gr.add_recycled_generators(gs);
+    gr.add_recycled_grid_generators(gs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
-// add_recycled_generators_and_minimize -- add to the zero dim grid.
+// add_recycled_grid_generators_and_minimize -- add to the zero dim grid.
 bool
 test08() {
   Grid_Generator_System gs;
   gs.insert(grid_point());
 
   Grid gr(0, EMPTY);
-  gr.add_recycled_generators_and_minimize(gs);
+  gr.add_recycled_grid_generators_and_minimize(gs);
 
   print_generators(gr, "*** gr ***");
 
@@ -215,12 +217,12 @@ test08() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-      "*** gr.add_recycled_generators_and_minimize(gs) ***");
+		    "*** gr.add_recycled_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// add_recycled_generators_and_minimize -- try add system with a
+// add_recycled_grid_generators_and_minimize -- try add system with a
 // single parameter generator to the empty grid.
 bool
 test09() {
@@ -232,35 +234,107 @@ test09() {
   Grid gr(2, EMPTY);
 
   try {
-    gr.add_recycled_generators_and_minimize(gs);
+    gr.add_recycled_grid_generators_and_minimize(gs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
-// add_recycled_generators_and_minimize -- add an empty system.
+// add_recycled_grid_generators_and_minimize -- add an empty system.
 bool
 test10() {
   Grid_Generator_System gs;
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
+  gr.add_grid_generator(grid_point());
 
   print_generators(gr, "*** gr ***");
 
   Grid known_gr = gr;
 
-  gr.add_recycled_generators_and_minimize(gs);
+  gr.add_recycled_grid_generators_and_minimize(gs);
 
   bool ok = (gr == known_gr);
 
   print_generators(gr,
-      "*** gr.add_recycled_generators_and_minimize(gs) ***");
+		   "*** gr.add_recycled_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// add_grid_generators -- add a zero dimension universe system.
+bool
+test11() {
+  Grid gr(0);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.add_grid_generators(Grid_Generator_System::zero_dim_univ());
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+		   "*** gr.add_grid_generators(Grid_Generator_System::zero_dim_univ()) ***");
+
+  return ok;
+}
+
+// add_grid_generators -- add to a grid where the generator system of the
+// grid starts with a parameter (test point finding loop in
+// Grid::normalize_divisors(gs, gs)).
+bool
+test12() {
+  Variable A(0);
+
+  Grid_Generator_System gs1;
+  gs1.insert(parameter(2*A));
+  gs1.insert(grid_point());
+
+  Grid gr(gs1);
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point());
+  gs2.insert(parameter(A));
+
+  gr.add_grid_generators(gs2);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(A));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_grid_generators_and_minimize -- add to a zero
+// dimension universe grid.
+bool
+test13() {
+  Grid gr(0);
+
+  Grid_Generator_System gs2(grid_point());
+
+  gr.add_recycled_grid_generators_and_minimize(gs2);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_grid_generators(gs) ***");
 
   return ok;
 }
@@ -272,10 +346,11 @@ BEGIN_MAIN
   DO_TEST(test02);
   DO_TEST(test03);
   DO_TEST(test04);
-  DO_TEST(test05);
-  DO_TEST(test06);
   DO_TEST(test07);
   DO_TEST(test08);
   DO_TEST(test09);
   DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
 END_MAIN
diff --git a/tests/Grid/addspacedims1.cc b/tests/Grid/addspacedims1.cc
index 92b2580..7428081 100644
--- a/tests/Grid/addspacedims1.cc
+++ b/tests/Grid/addspacedims1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::add_space_dimensions_and_embed().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -45,8 +45,7 @@ test01() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "***  ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -64,8 +63,7 @@ test02() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(3) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(3) ***");
 
   return ok;
 }
@@ -83,8 +81,7 @@ test03() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(4) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(4) ***");
 
   return ok;
 }
@@ -116,8 +113,7 @@ test04() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
 
   return ok;
 }
@@ -149,8 +145,7 @@ test05() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
 
   return ok;
 }
@@ -165,11 +160,11 @@ test06() {
   }
   catch (const std::length_error& e) {
     nout << "max_space_dimension_exceeded: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Zero dimension universe grid.
@@ -185,8 +180,7 @@ test07() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(13) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(13) ***");
 
   return ok;
 }
@@ -210,8 +204,7 @@ test08() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
 
   return ok;
 }
@@ -226,22 +219,22 @@ test09() {
   Variable D(3);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_line(A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(A));
 
-  gr.minimized_generators();
+  gr.minimized_grid_generators();
 
-  print_congruences(gr, "*** gr ***");
+  print_generators(gr, "*** gr ***");
 
   gr.add_space_dimensions_and_embed(2);
 
   Grid known_gr(4);
-  known_gr.add_congruence(B == 0);
+  known_gr.add_congruence(B %= 0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_embed(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
 
   return ok;
 }
@@ -272,8 +265,7 @@ test10() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
 
   return ok;
 }
@@ -291,8 +283,7 @@ test11() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(3) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(3) ***");
 
   return ok;
 }
@@ -321,8 +312,7 @@ test12() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(4) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(4) ***");
 
   return ok;
 }
@@ -347,8 +337,7 @@ test13() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "***  ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -383,8 +372,7 @@ test14() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
 
   return ok;
 }
@@ -423,8 +411,7 @@ test15() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
 
   return ok;
 }
@@ -435,14 +422,15 @@ test16() {
   Grid gr(10);
 
   try {
+    gr.add_space_dimensions_and_project(Grid::max_space_dimension());
   }
   catch (const std::length_error& e) {
-    nout << "invalid_argument: " << e.what() << endl;
+    nout << "max_space_dimension_exceeded: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Zero dimension universe grid.
@@ -458,8 +446,7 @@ test17() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(13) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(13) ***");
 
   return ok;
 }
@@ -480,14 +467,13 @@ test18() {
   gr.add_space_dimensions_and_project(2);
 
   Grid known_gr(4, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(parameter(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
 
   return ok;
 }
@@ -502,10 +488,10 @@ test19() {
   Variable D(3);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_line(A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A));
 
-  gr.minimized_generators();
+  gr.minimized_grid_generators();
 
   print_generators(gr, "*** gr ***");
 
@@ -518,8 +504,7 @@ test19() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.add_space_dimensions_and_project(2) ***");
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
 
   return ok;
 }
diff --git a/tests/Grid/affinedim1.cc b/tests/Grid/affinedim1.cc
index 18f1685..854da00 100644
--- a/tests/Grid/affinedim1.cc
+++ b/tests/Grid/affinedim1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::affine_dimension().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -67,17 +67,17 @@ test04() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 0
     && gr_gs_needs_min.affine_dimension() == 0
@@ -99,19 +99,19 @@ test05() {
   Variable D(3);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 1
     && gr_gs_needs_min.affine_dimension() == 1
@@ -133,20 +133,20 @@ test06() {
   Variable D(3);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + B));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
   gr_cgs_needs_min.add_congruence(C == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 1
     && gr_gs_needs_min.affine_dimension() == 1
@@ -168,21 +168,21 @@ test07() {
   Variable D(3);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator(grid_point(3*A + B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 2
     && gr_gs_needs_min.affine_dimension() == 2
@@ -204,21 +204,21 @@ test08() {
   Variable D(3);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 2
     && gr_gs_needs_min.affine_dimension() == 2
@@ -240,23 +240,23 @@ test09() {
   Variable D(3);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator(grid_line(C));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_line(C));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 3
     && gr_gs_needs_min.affine_dimension() == 3
@@ -278,21 +278,21 @@ test10() {
   Variable D(3);
 
   Grid gr_gs_min(4, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(4, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(4);
   gr_cgs_needs_min.add_congruence(A == 0);
   gr_cgs_needs_min.add_congruence(D == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.affine_dimension() == 2
     && gr_gs_needs_min.affine_dimension() == 2
diff --git a/tests/Grid/affineimage1.cc b/tests/Grid/affineimage1.cc
index 9c96d5c..7262cc3 100644
--- a/tests/Grid/affineimage1.cc
+++ b/tests/Grid/affineimage1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -40,12 +40,11 @@ test01() {
   gr.affine_image(B, A + 2, 1);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(2*B - 2*C));
+  known_gr.add_grid_generator(grid_point(2*B - 2*C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(B, A + 2, 1) ***");
+  print_congruences(gr, "*** gr.affine_image(B, A + 2, 1) ***");
 
   return ok;
 }
@@ -66,14 +65,13 @@ test02() {
   gr.affine_image(A, A + B + 1);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(7*A + 3*B));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(7*A + 3*B));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_image(A, A + B + 1) ***");
+  print_generators(gr, "*** gr.affine_image(A, A + B + 1) ***");
 
   return ok;
 }
@@ -94,13 +92,12 @@ test03() {
   gr.affine_image(A, A + 1, 2);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(2*A + 2*B));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(2*A + 2*B));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, A + 1, 2) ***");
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 2) ***");
 
   return ok;
 }
@@ -122,14 +119,13 @@ test04() {
   gr.affine_image(A, A + 1, 3);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(4*A + 6*B, 3));
-  known_gr.add_generator(grid_point(9*A + 6*B, 3));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
 
   return ok;
 }
@@ -142,23 +138,22 @@ test05() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(3*A + 2*B));
-  gr.add_generator(grid_point(8*A + 2*B));
-  gr.add_generator(grid_line(C));
+  gr.add_grid_generator(grid_point(3*A + 2*B));
+  gr.add_grid_generator(grid_point(8*A + 2*B));
+  gr.add_grid_generator(grid_line(C));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_image(A, A + 1, 3);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(4*A + 6*B, 3));
-  known_gr.add_generator(grid_point(9*A + 6*B, 3));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
 
   return ok;
 }
@@ -180,14 +175,13 @@ test06() {
   gr.affine_image(A, A + 1, 3);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(4*A + 6*B, 3));
-  known_gr.add_generator(grid_point(9*A + 6*B, 3));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
 
   return ok;
 }
@@ -200,23 +194,22 @@ test07() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(B));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_image(A, 3*A + 2*B + 4);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(4*A));
-  known_gr.add_generator(grid_point(7*A));
-  known_gr.add_generator(grid_point(6*A + B));
+  known_gr.add_grid_generator(grid_point(4*A));
+  known_gr.add_grid_generator(grid_point(7*A));
+  known_gr.add_grid_generator(grid_point(6*A + B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+  print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
 
   return ok;
 }
@@ -237,14 +230,13 @@ test08() {
   gr.affine_image(A, 3*A + 2*B + 4);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(4*A));
-  known_gr.add_generator(grid_point(7*A));
-  known_gr.add_generator(grid_point(6*A + B));
+  known_gr.add_grid_generator(grid_point(4*A));
+  known_gr.add_grid_generator(grid_point(7*A));
+  known_gr.add_grid_generator(grid_point(6*A + B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+  print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
 
   return ok;
 }
@@ -256,8 +248,8 @@ test09() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
 
   print_generators(gr, "*** gr ***");
 
@@ -268,8 +260,7 @@ test09() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, 2*A) ***");
+  print_congruences(gr, "*** gr.affine_image(A, 2*A) ***");
 
   return ok;
 }
@@ -292,8 +283,7 @@ test10() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, 2*A) ***");
+  print_congruences(gr, "*** gr.affine_image(A, 2*A) ***");
 
   return ok;
 }
@@ -308,23 +298,22 @@ test11() {
   Variable C(2);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(3*A));
-  gr.add_generator(grid_point(3*B));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(3*B));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_image(A, 3*A + 2*B + 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(7*A + 3*B));
-  known_gr.add_generator(grid_point(10*A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(7*A + 3*B));
+  known_gr.add_grid_generator(grid_point(10*A));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, 3*A + 2*B + 1) ***");
+  print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 1) ***");
 
   return ok;
 }
@@ -336,22 +325,21 @@ test12() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(3*A));
-  gr.add_generator(grid_point(3*B));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(3*B));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_image(A, B);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(3*A + 3*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A + 3*B));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_image(A, B) ***");
+  print_generators(gr, "*** gr.affine_image(A, B) ***");
 
   return ok;
 }
@@ -372,13 +360,12 @@ test13() {
   gr.affine_image(A, B);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(3*A + 3*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A + 3*B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, B) ***");
+  print_congruences(gr, "*** gr.affine_image(A, B) ***");
 
   return ok;
 }
diff --git a/tests/Grid/affineimage2.cc b/tests/Grid/affineimage2.cc
index cabe44a..d4ae8cd 100644
--- a/tests/Grid/affineimage2.cc
+++ b/tests/Grid/affineimage2.cc
@@ -1,11 +1,11 @@
 /* Test Grid::affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -44,14 +44,13 @@ test01() {
   gr.affine_image(A, 2*A, 5);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(2*A, 15));
-  known_gr.add_generator(grid_point(5*B, 10));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(2*A, 15));
+  known_gr.add_grid_generator(grid_point(5*B, 10));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_image(A, 2*A, 5) ***");
+  print_generators(gr, "*** gr.affine_image(A, 2*A, 5) ***");
 
   return ok;
 }
@@ -63,19 +62,18 @@ test02() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(A));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_image(A, B + 2, -3);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-2*A, 3));
+  known_gr.add_grid_generator(grid_point(-2*A, 3));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_image(A, B + 2, -3) ***");
+  print_generators(gr, "*** gr.affine_image(A, B + 2, -3) ***");
 
   return ok;
 }
@@ -96,8 +94,7 @@ test03() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, 2*A + B + 1) ***");
+  print_congruences(gr, "*** gr.affine_image(A, 2*A + B + 1) ***");
 
   return ok;
 }
@@ -123,8 +120,7 @@ test04() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, A + 3) ***");
+  print_congruences(gr, "*** gr.affine_image(A, A + 3) ***");
 
   return ok;
 }
@@ -150,8 +146,7 @@ test05() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, A + B) ***");
+  print_congruences(gr, "*** gr.affine_image(A, A + B) ***");
 
   return ok;
 }
@@ -177,8 +172,7 @@ test06() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_image(A, B) ***");
+  print_congruences(gr, "*** gr.affine_image(A, B) ***");
 
   return ok;
 }
@@ -199,11 +193,11 @@ test07() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expression of a greater space dimension than the grid.
@@ -223,11 +217,11 @@ test08() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Variable of a greater space dimension than the grid.
@@ -247,11 +241,11 @@ test09() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
@@ -263,7 +257,7 @@ test10() {
   Variable D(3);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(2*A + 0*B));
+  gr.add_grid_generator(grid_point(2*A + 0*B));
 
   print_congruences(gr, "*** gr ***");
 
@@ -271,8 +265,8 @@ test10() {
 
   Grid gr1 = gr;  // second grid - initial state
 
-  gr1.generalized_affine_image(B, 18*A + B, 1, 0);
-  gr1.generalized_affine_image(A, 15*A, 1, 0);
+  gr1.generalized_affine_image(B, EQUAL, 18*A + B, 1, 0);
+  gr1.generalized_affine_image(A, EQUAL, 15*A, 1, 0);
                   // second grid - 1 pass through procedure
 
   Grid gr2 = gr;  // third grid - initial state
@@ -283,8 +277,7 @@ test10() {
 
   gr.join_assign(gr1); // join of gr0 and gr1
 
-  print_congruences(gr,
-        "*** gr.join_assign(gr1) ***");
+  print_congruences(gr, "*** gr.join_assign(gr1) ***");
 
   gr.join_assign(gr2); // join of gr0, gr1 and gr2
 
@@ -295,8 +288,93 @@ test10() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.join_assign(gr2) ***");
+  print_congruences(gr, "*** gr.join_assign(gr2) ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test11() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(A + 0*B));
+
+  Grid gr1(ggs);
+  Grid gr(2, EMPTY);
+
+  for(int j = 0; j < 4; j++) {
+    gr.add_grid_generators_and_minimize(ggs);
+
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, 3*A);
+      gr.affine_image(B, B + A);
+    }
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, 5*A);
+      gr.affine_image(B, B + A);
+    }
+    gr1.join_assign(gr);
+  }
+
+  gr.add_grid_generators_and_minimize(ggs);
+
+  bool ok = (gr == gr1);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr, "*** gr ***");
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl ESOP 2005 paper
+bool
+test12() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Coefficient* tem1 = new Coefficient("7654321");
+  Coefficient* tem2 = new Coefficient("69246289");
+  Coefficient* tem3 = new Coefficient("4294967296");
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(A));
+  ggs.insert(parameter(*tem3*A));
+  ggs.insert(parameter(*tem3*B));
+
+  Grid gr1(ggs);
+  Grid gr(2, EMPTY);
+
+  for(int j = 0; j < 3; j++) {
+    gr.add_grid_generators_and_minimize(ggs);
+
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, *tem1*A);
+      gr.affine_image(B, B + A);
+    }
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, *tem2*A);
+      gr.affine_image(B, B + A);
+    }
+    gr1.join_assign(gr);
+  }
+
+  gr.add_grid_generators_and_minimize(ggs);
+
+  delete tem1; delete tem2; delete tem3;
+
+  bool ok = (gr == gr1);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr, "*** gr ***");
+  print_generators(gr, "*** gr ***");
 
   return ok;
 }
@@ -314,4 +392,6 @@ BEGIN_MAIN
   DO_TEST(test08);
   DO_TEST(test09);
   DO_TEST_F16A(test10);
+  DO_TEST_F16(test11);
+  DO_TEST_F64(test12);
 END_MAIN
diff --git a/tests/Grid/affinepreimage1.cc b/tests/Grid/affinepreimage1.cc
index f5f441f..b00cc7e 100644
--- a/tests/Grid/affinepreimage1.cc
+++ b/tests/Grid/affinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,7 +36,7 @@ test01() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(2*B - 2*C));
+  gr.add_grid_generator(grid_point(2*B - 2*C));
 
   print_generators(gr, "*** gr ***");
 
@@ -48,8 +48,7 @@ test01() {
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(B, A + 2, 1) ***");
+  print_generators(gr, "*** gr.affine_preimage(B, A + 2, 1) ***");
 
   return ok;
 }
@@ -75,8 +74,7 @@ test02() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, A + B + 1) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, A + B + 1) ***");
 
   return ok;
 }
@@ -89,8 +87,8 @@ test03() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(2*A + 2*B));
-  gr.add_generator(grid_line(C));
+  gr.add_grid_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_line(C));
 
   print_generators(gr, "*** gr ***");
 
@@ -102,8 +100,7 @@ test03() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, A + 1, 2) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 2) ***");
 
   return ok;
 }
@@ -129,14 +126,13 @@ test04() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
 
   return ok;
 }
 
 // Simple invertible transformation with denominator and modulus.
-// Congruences are out-of-date
+// Congruences are out-of-date.
 bool
 test05() {
   Variable A(0);
@@ -144,29 +140,28 @@ test05() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(4*A + 6*B, 3));
-  gr.add_generator(grid_point(9*A + 6*B, 3));
-  gr.add_generator(grid_line(C));
+  gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  gr.add_grid_generator(grid_line(C));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_preimage(A, A + 1, 3);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(3*A + 2*B));
-  known_gr.add_generator(grid_point(8*A + 2*B));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(3*A + 2*B));
+  known_gr.add_grid_generator(grid_point(8*A + 2*B));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(A, A + 1, 3) ***");
+  print_generators(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
 
   return ok;
 }
 
 // Simple invertible transformation with denominator and modulus.
-// Congruences are up-to-date
+// Congruences are up-to-date.
 bool
 test06() {
   Variable A(0);
@@ -182,49 +177,47 @@ test06() {
   gr.affine_preimage(A, A + 1, 3);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(3*A + 2*B));
-  known_gr.add_generator(grid_point(8*A + 2*B));
-  known_gr.add_generator(grid_line(C));
+  known_gr.add_grid_generator(grid_point(3*A + 2*B));
+  known_gr.add_grid_generator(grid_point(8*A + 2*B));
+  known_gr.add_grid_generator(grid_line(C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
 
   return ok;
 }
 
 // Invertible transformation which changes the modulus.
-// Congruences are out-of-date
+// Congruences are out-of-date.
 bool
 test07() {
   Variable A(0);
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(4*A));
-  gr.add_generator(grid_point(7*A));
-  gr.add_generator(grid_point(6*A + B));
+  gr.add_grid_generator(grid_point(4*A));
+  gr.add_grid_generator(grid_point(7*A));
+  gr.add_grid_generator(grid_point(6*A + B));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_preimage(A, 3*A + 2*B + 4);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+  print_generators(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
 
   return ok;
 }
 
 // Invertible transformation which changes the modulus.
-// Congruences are up-to-date
+// Congruences are up-to-date.
 bool
 test08() {
   Variable A(0);
@@ -239,46 +232,44 @@ test08() {
   gr.affine_preimage(A, 3*A + 2*B + 4);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
 
   return ok;
 }
 
 // One dimension.
-// Congruences are out-of-date
+// Congruences are out-of-date.
 bool
 test09() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_preimage(A, 2*A);
 
   Grid known_gr(1, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(A, 2*A) ***");
+  print_generators(gr, "*** gr.affine_preimage(A, 2*A) ***");
 
   return ok;
 }
 
 // One dimension.
-// Congruences are up-to-date
+// Congruences are up-to-date.
 bool
 test10() {
   Variable A(0);
@@ -291,59 +282,56 @@ test10() {
   gr.affine_preimage(A, 2*A);
 
   Grid known_gr(1, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, 2*A) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, 2*A) ***");
 
   return ok;
 }
 
 // The first affine_image example described at anchor
 // grid_affine_transformation in definitions.dox.
-// Congruences are out-of-date
+// Congruences are out-of-date.
 bool
 test11() {
   Variable A(0);
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(7*A + 3*B));
-  gr.add_generator(grid_point(10*A));
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(7*A + 3*B));
+  gr.add_grid_generator(grid_point(10*A));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_preimage(A, 3*A + 2*B + 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(3*A));
-  known_gr.add_generator(grid_point(3*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A));
+  known_gr.add_grid_generator(grid_point(3*B));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+  print_generators(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
 
   return ok;
 }
 
 // The first affine_image example described at anchor
 // grid_affine_transformation in definitions.dox.
-// Congruences are up-to-date
+// Congruences are up-to-date.
 bool
 test12() {
   Variable A(0);
   Variable B(1);
 
   Grid gr = Grid(2);
-  // FIX Confirm that this should fail when Grid_nonpublic.cc
-  //     BE_LAZY=0.
-  //gr.add_congruence((3*A - 6*B %= 3) / 9);
+
+  gr.add_congruence((3*A - 6*B %= 3) / 9);
   gr.add_congruence((A - 2*B %= 1) / 9);
   gr.add_congruence((B %= 0) / 3);
 
@@ -352,50 +340,48 @@ test12() {
   gr.affine_preimage(A, 3*A + 2*B + 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(3*A));
-  known_gr.add_generator(grid_point(3*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A));
+  known_gr.add_grid_generator(grid_point(3*B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
 
   return ok;
 }
 
 // The second affine_image example described at anchor
 // grid_affine_transformation in definitions.dox.
-// Congruences are out-of-date
+// Congruences are out-of-date.
 bool
 test13() {
   Variable A(0);
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(3*A + 3*B));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(3*A + 3*B));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_preimage(A, B);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A));
-  known_gr.add_generator(grid_point(3*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point(3*B));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "***  ***");
+  print_generators(gr, "*** gr ***");
 
   return ok;
 }
 
 // The second affine_image example described at anchor
 // grid_affine_transformation in definitions.dox.
-// Congruences are up-to-date
+// Congruences are up-to-date.
 bool
 test14() {
   Variable A(0);
@@ -410,14 +396,13 @@ test14() {
   gr.affine_preimage(A, B);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A));
-  known_gr.add_generator(grid_point(3*B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point(3*B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, B) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, B) ***");
 
   return ok;
 }
diff --git a/tests/Grid/affinepreimage2.cc b/tests/Grid/affinepreimage2.cc
index 56dda2c..e1c801c 100644
--- a/tests/Grid/affinepreimage2.cc
+++ b/tests/Grid/affinepreimage2.cc
@@ -1,11 +1,11 @@
 /* Test Grid::affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -44,14 +44,13 @@ test01() {
   gr.affine_preimage(A, 2*A, 5);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A, 3));
-  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A, 3));
+  known_gr.add_grid_generator(grid_point(B, 2));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(A, 2*A, 5) ***");
+  print_generators(gr, "*** gr.affine_preimage(A, 2*A, 5) ***");
 
   return ok;
 }
@@ -63,20 +62,19 @@ test02() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(-2*A, 3));
+  gr.add_grid_generator(grid_point(-2*A, 3));
 
   gr.affine_preimage(A, B + 2, -3);
 
   print_generators(gr, "*** gr ***");
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(A, B + 2, -3) ***");
+  print_generators(gr, "*** gr.affine_preimage(A, B + 2, -3) ***");
 
   return ok;
 }
@@ -97,8 +95,7 @@ test03() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, 11*A - B + 1) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, 11*A - B + 1) ***");
 
   return ok;
 }
@@ -112,19 +109,18 @@ test04() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(5*A + 4*B, 7));
+  gr.add_grid_generator(grid_point(5*A + 4*B, 7));
 
   print_generators(gr, "*** gr ***");
 
   gr.affine_preimage(B, A - B, -1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(5*A + 9*B, 7));
+  known_gr.add_grid_generator(grid_point(5*A + 9*B, 7));
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr,
-        "*** gr.affine_preimage(B, A - B, -1) ***");
+  print_generators(gr, "*** gr.affine_preimage(B, A - B, -1) ***");
 
   return ok;
 }
@@ -146,12 +142,11 @@ test05() {
   gr.affine_preimage(B, A - B, -1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(5*A + 9*B, 7));
+  known_gr.add_grid_generator(grid_point(5*A + 9*B, 7));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(B, A - B, -1) ***");
+  print_congruences(gr, "*** gr.affine_preimage(B, A - B, -1) ***");
 
   return ok;
 }
@@ -176,8 +171,7 @@ test06() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, A + 3) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 3) ***");
 
   return ok;
 }
@@ -201,8 +195,7 @@ test07() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, A + B) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, A + B) ***");
 
   return ok;
 }
@@ -226,8 +219,7 @@ test08() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(A, B) ***");
+  print_congruences(gr, "*** gr.affine_preimage(A, B) ***");
 
   return ok;
 }
@@ -250,8 +242,7 @@ test09() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(B, A) ***");
+  print_congruences(gr, "*** gr.affine_preimage(B, A) ***");
 
   return ok;
 }
@@ -275,8 +266,7 @@ test10() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.affine_preimage(B, A) ***");
+  print_congruences(gr, "*** gr.affine_preimage(B, A) ***");
 
   return ok;
 }
@@ -297,11 +287,11 @@ test11() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expression of a greater space dimension than the grid.
@@ -321,11 +311,11 @@ test12() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Variable of a greater space dimension than the grid.
@@ -345,11 +335,11 @@ test13() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/asciidumpload1.cc b/tests/Grid/asciidumpload1.cc
index c54c35a..89bffdb 100644
--- a/tests/Grid/asciidumpload1.cc
+++ b/tests/Grid/asciidumpload1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::ascii_dump() and Grid::ascii_load().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,6 +22,16 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
+#include "files.hh"
+#include <string>
+#include <fstream>
+#include <sstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+using std::stringstream;
+
 namespace {
 
 // One dimension universe and empty.
@@ -109,8 +119,8 @@ test04() {
   Variable C(2);
 
   Grid gr1(4, EMPTY);
-  gr1.add_generator(grid_point(3*A + C));
-  gr1.add_generator(parameter(3*A));
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
 
   print_generators(gr1, "*** gr1 ***");
 
@@ -142,8 +152,8 @@ test05() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*A + C));
-  gr1.add_generator(parameter(3*A));
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
 
   print_generators(gr1, "*** gr1 ***");
 
@@ -167,6 +177,430 @@ test05() {
   return ok;
 }
 
+// ascii_load failure.
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_err 2\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM +err +CM +GM  +CS +GS  -CP -GP  -SC -SG\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "err_sys (up-to-date)";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-err)";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test13() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "0 1 m 1\n"
+    << "1 0 m 1\n"
+    << "err_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test14() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-err)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test15() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test16() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test17() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x err\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test18() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n"
+    << "dimerrnsion_kinds 0 0\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test19() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n"
+    << "dimension_kinds 0\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test20() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n"
+    << "dimension_kinds 0 700\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test21() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS err  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test22() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  err -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test23() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP err  -SC -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test24() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  err -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test25() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC err\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok =! gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -175,4 +609,24 @@ BEGIN_MAIN
   DO_TEST(test03);
   DO_TEST(test04);
   DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
 END_MAIN
diff --git a/tests/Grid/asciidumpload2.cc b/tests/Grid/asciidumpload2.cc
new file mode 100644
index 0000000..13a9f4f
--- /dev/null
+++ b/tests/Grid/asciidumpload2.cc
@@ -0,0 +1,494 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// ascii_load simple test of loading the result of ascii_dump()
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A - B %= 2) / 5);
+  gr1.add_congruence(B %= 0);
+
+  gr1.minimized_grid_generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 2) / 5);
+  gr1.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "space_dim");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-ZE");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "con_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "gen_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)" );
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)" );
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok =! gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok =! gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok =! gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test13() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// A grid with a virtual generator.
+bool
+test14() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A - B %= 2) / 5);
+  gr1.add_congruence(B %= 0);
+  gr1.add_congruence(C == 4);
+
+  gr1.minimized_grid_generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test15() {
+  const char* my_file = "ascii_dump_load2.dat";
+
+  Grid gr1(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test16() {
+  const char* my_file = "ascii_dump_load2.dat";
+
+  Grid gr1(0, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/asciidumpload3.cc b/tests/Grid/asciidumpload3.cc
new file mode 100644
index 0000000..4670e56
--- /dev/null
+++ b/tests/Grid/asciidumpload3.cc
@@ -0,0 +1,123 @@
+/* Test Congruence::ascii_dump() and Congruence::ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Congruence cg1 = (A - B %= 2) / 5;
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  cg1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg2(B == 0);
+  cg2.ascii_load(f);
+  close(f);
+
+  bool ok = (cg1 == cg2);
+
+  print_congruence(cg1, "*** cg1 ***");
+  print_congruence(cg2, "*** cg2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "size 2 1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg(0*A %= 0);
+  bool ok = !cg.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "size 3 1 0 err 1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg(0*A %= 0);
+  bool ok = !cg.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "size 3 1 0 m\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg(0*A %= 0);
+  bool ok = !cg.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/asciidumpload4.cc b/tests/Grid/asciidumpload4.cc
new file mode 100644
index 0000000..cc0f745
--- /dev/null
+++ b/tests/Grid/asciidumpload4.cc
@@ -0,0 +1,144 @@
+/* Test Congruence_System ascii_dump() and ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1((A + B %= 2) / 3);
+  cgs1.insert(A == 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  cgs1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs2;
+  cgs2.ascii_load(f);
+  close(f);
+
+  bool ok = (cgs1 == cgs2);
+
+  print_congruences(cgs1, "*** cgs1 ***");
+  print_congruences(cgs2, "*** cgs2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "err x 3\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok =! cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok =! cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok =! cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x 3\n"
+    << "size 3 0 1 err 1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok =! cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload5.cc b/tests/Grid/asciidumpload5.cc
new file mode 100644
index 0000000..2d7b472
--- /dev/null
+++ b/tests/Grid/asciidumpload5.cc
@@ -0,0 +1,154 @@
+/* Test Grid_Generator ascii_dump() and ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator g1 = grid_point(A - B);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  g1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g2(grid_point(0*B));
+  g2.ascii_load(f);
+  close(f);
+
+  bool ok = (g1 == g2);
+
+  print_generator(g1, "*** g1 ***");
+  print_generator(g2, "*** g2 ***");
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test02() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g(grid_point(0*A));
+  bool ok =! g.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test03() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "1 0 3\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g(grid_point(0*A));
+  bool ok =! g.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test04() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "1 0 1 err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g(grid_point(0*A));
+  bool ok =! g.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Load and dump a line.
+bool
+test05() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+  Variable B(0);
+
+  Grid_Generator g1 = grid_line(2*A - B);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  g1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g2(grid_point(0*B));
+  g2.ascii_load(f);
+  close(f);
+
+  bool ok = (g1 == g2);
+
+  print_generator(g1, "*** g1 ***");
+  print_generator(g2, "*** g2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload6.cc b/tests/Grid/asciidumpload6.cc
new file mode 100644
index 0000000..1bcb647
--- /dev/null
+++ b/tests/Grid/asciidumpload6.cc
@@ -0,0 +1,144 @@
+/* Test Generator_System ascii_dump() and ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs1(grid_point());
+  gs1.insert(parameter(A + B));
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gs1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs2;
+  gs2.ascii_load(f);
+  close(f);
+
+  bool ok = (gs1 == gs2);
+
+  print_generators(gs1, "*** gs1 ***");
+  print_generators(gs2, "*** gs2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "err x 3\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok =! gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok =! gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok =! gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x 3\n"
+    << "1 0 0 err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok =! gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload7.cc b/tests/Grid/asciidumpload7.cc
new file mode 100644
index 0000000..91fee3d
--- /dev/null
+++ b/tests/Grid/asciidumpload7.cc
@@ -0,0 +1,239 @@
+/* Test Direct_Product<nnc_ph, gr> ascii_dump() and ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+typedef Domain_Product<Grid, NNC_Polyhedron>::Direct_Product
+No_Reduction_Product;
+
+namespace {
+
+// Universe.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load7.dat";
+
+  No_Reduction_Product dp1(3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Congruence.
+bool
+test02() {
+  const char* my_file = "ascii_dump_load7.dat";
+  Variable A(0);
+
+  No_Reduction_Product dp1(3);
+  dp1.add_congruence((2*A %= 3) / 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Constraint.
+bool
+test03() {
+  const char* my_file = "ascii_dump_load7.dat";
+  Variable A(0);
+
+  No_Reduction_Product dp1(3);
+  dp1.add_constraint(3*A > 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Congruence and constraint.
+bool
+test04() {
+  const char* my_file = "ascii_dump_load7.dat";
+  Variable A(0);
+  Variable B(1);
+
+  No_Reduction_Product dp1(3);
+  dp1.add_constraint(3*B > 2);
+  dp1.add_congruence((A %= 0) / 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Many dimensions.
+bool
+test05() {
+  const char* my_file = "ascii_dump_load7.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  No_Reduction_Product dp1(4);
+  dp1.add_constraint(3*A + D > 2);
+  dp1.add_congruence((A - 3*C %= 0) / 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(4);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Empty.
+bool
+test06() {
+  const char* my_file = "ascii_dump_load7.dat";
+
+  No_Reduction_Product dp1(7, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Zero-dimension empty.
+bool
+test07() {
+  const char* my_file = "ascii_dump_load7.dat";
+
+  No_Reduction_Product dp1(0, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Zero-dimension universe.
+bool
+test08() {
+  const char* my_file = "ascii_dump_load7.dat";
+
+  No_Reduction_Product dp1(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/bhz03widening1.cc b/tests/Grid/bhz03widening1.cc
index 58000fb..5adbab5 100644
--- a/tests/Grid/bhz03widening1.cc
+++ b/tests/Grid/bhz03widening1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<Grid>::BHZ03_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<Grid>::BHZ03_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,11 +24,11 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 using namespace Parma_Polyhedra_Library::IO_Operators;
 
-typedef Polyhedra_Powerset<Grid> GSet;
+typedef Pointset_Powerset<Grid> GSet;
 
 namespace {
 
-// Joins of grids in powersets shows that series is stabilising.
+// Joins of grids in powersets shows that series is stabilizing.
 bool
 test01() {
   Variable A(0);
@@ -105,6 +105,7 @@ test02() {
 }
 
 } // namespace
+
 BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
diff --git a/tests/Grid/bounded1.cc b/tests/Grid/bounded1.cc
index 53db200..67d194f 100644
--- a/tests/Grid/bounded1.cc
+++ b/tests/Grid/bounded1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::is_bounded().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,8 +31,7 @@ test01() {
 
   bool ok = (gr.is_bounded());
 
-  print_congruences(gr,
-        "*** gr ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -44,8 +43,7 @@ test02() {
 
   bool ok = (gr.is_bounded());
 
-  print_congruences(gr,
-        "*** gr ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -57,8 +55,7 @@ test03() {
 
   bool ok = (gr.is_bounded());
 
-  print_congruences(gr,
-        "*** gr ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -70,17 +67,17 @@ test04() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.is_bounded()
     && gr_gs_needs_min.is_bounded()
@@ -101,19 +98,19 @@ test05() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = !gr_gs_min.is_bounded()
     && !gr_gs_needs_min.is_bounded()
@@ -134,20 +131,20 @@ test06() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + B));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
   gr_cgs_needs_min.add_congruence(C == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = !gr_gs_min.is_bounded()
     && !gr_gs_needs_min.is_bounded()
@@ -168,21 +165,21 @@ test07() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator(grid_point(3*A + B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = !gr_gs_min.is_bounded()
     && !gr_gs_needs_min.is_bounded()
@@ -202,21 +199,21 @@ test08() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = !gr_gs_min.is_bounded()
     && !gr_gs_needs_min.is_bounded()
@@ -237,23 +234,22 @@ test09() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator(grid_line(C));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
-
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_line(C));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = !gr_gs_min.is_bounded()
     && !gr_gs_needs_min.is_bounded()
@@ -275,21 +271,21 @@ test10() {
   Variable D(3);
 
   Grid gr_gs_min(4, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(4, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(4);
   gr_cgs_needs_min.add_congruence(A == 0);
   gr_cgs_needs_min.add_congruence(D == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = !gr_gs_min.is_bounded()
     && !gr_gs_needs_min.is_bounded()
@@ -313,10 +309,10 @@ test11() {
   Variable F(5);
 
   Grid gr_gs_min(6, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
 
   Grid gr_gs_needs_min(6, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+  gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
 
   Grid gr_cgs_needs_min(6);
   gr_cgs_needs_min.add_congruence(A == 7);
@@ -326,8 +322,8 @@ test11() {
   gr_cgs_needs_min.add_congruence(E == 0);
   gr_cgs_needs_min.add_congruence(F == 19);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = gr_gs_min.is_bounded()
     && gr_gs_needs_min.is_bounded()
@@ -347,13 +343,12 @@ test12() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(3*A + 2*B));
-  gr.add_generator(grid_point(3*A + 2*B));
+  gr.add_grid_generator(grid_point(3*A + 2*B));
+  gr.add_grid_generator(grid_point(3*A + 2*B));
 
   bool ok = (gr.is_bounded());
 
-  print_congruences(gr,
-        "*** gr ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -372,8 +367,7 @@ test13() {
 
   bool ok = (!gr.is_bounded());
 
-  print_congruences(gr,
-        "*** gr ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
diff --git a/tests/Grid/boundedaffineimage1.cc b/tests/Grid/boundedaffineimage1.cc
new file mode 100644
index 0000000..1bdb27c
--- /dev/null
+++ b/tests/Grid/boundedaffineimage1.cc
@@ -0,0 +1,184 @@
+/* Test Grid::bounded_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Non-empty grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((B ==  0) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_image(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(-2*C));
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_image(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((A ==  1) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_image(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_image(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // any call with a denominator equal to zero is illegal.
+    Coefficient d = 0;
+    gr.bounded_affine_image(B, A - 7, B + 2, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the lower bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_image(A, B, A + 7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the upper bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_image(A, A + 7, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 1);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to bound a variable not occurring in the
+    // vector space embedding the grid.
+    gr.bounded_affine_image(B, A - 7, 2*A - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/boundedaffinepreimage1.cc b/tests/Grid/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..f604928
--- /dev/null
+++ b/tests/Grid/boundedaffinepreimage1.cc
@@ -0,0 +1,184 @@
+/* Test Grid::bounded_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Non-empty grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((B ==  0) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_preimage(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(-2*C));
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_preimage(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((A ==  1) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_preimage(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_preimage(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // any call with a denominator equal to zero is illegal.
+    Coefficient d = 0;
+    gr.bounded_affine_preimage(B, A - 7, B + 2, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the lower bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_preimage(A, B, A + 7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the upper bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_preimage(A, A + 7, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 1);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to bound a variable not occurring in the
+    // vector space embedding the grid.
+    gr.bounded_affine_preimage(B, A - 7, 2*A - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/boundingbox1.cc b/tests/Grid/boundingbox1.cc
index 51875c1..23845d0 100644
--- a/tests/Grid/boundingbox1.cc
+++ b/tests/Grid/boundingbox1.cc
@@ -1,11 +1,11 @@
-/* Test Grid::Grid(Box&, From_Bounding_Box).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Grid::Grid(const Box<Interval>&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,16 +29,15 @@ namespace {
 // Universe box.
 bool
 test01() {
-  Bounding_Box box(2);
+  Rational_Box box(2);
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(2);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box() ***");
+  print_congruences(gr, "*** gr(box ***");
 
   return ok;
 }
@@ -48,19 +47,17 @@ bool
 test02() {
   Variable B(1);
 
-  Bounding_Box box(2);
-  box.raise_lower_bound(1, true, 2, 3);
-  box.lower_upper_bound(1, true, 2, 3);
+  Rational_Box box(2);
+  box.add_constraint(3*B == 2);
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(2);
   known_gr.add_congruence(3*B == 2);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box() ***");
+  print_congruences(gr, "*** gr(box ***");
 
   return ok;
 }
@@ -71,21 +68,18 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, -2, 3);
-  box.lower_upper_bound(0, true, -2, 3);
-  box.raise_lower_bound(1, true, -10, 1);
-  box.lower_upper_bound(1, true, -10, 1);
+  Rational_Box box(2);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(B == -10);
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-2*A - 30*B, 3));
+  known_gr.add_grid_generator(grid_point(-2*A - 30*B, 3));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box() ***");
+  print_congruences(gr, "*** gr(box ***");
 
   return ok;
 }
@@ -97,21 +91,19 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box(3);
-  box.raise_lower_bound(2, true, 15, 5);
-  box.lower_upper_bound(2, true, 15, 5);
+  Rational_Box box(3);
+  box.add_constraint(5*C == 15);
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(3*C));
-  known_gr.add_generator(grid_line(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point(3*C));
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box() ***");
+  print_congruences(gr, "*** gr(box ***");
 
   return ok;
 }
@@ -119,16 +111,15 @@ test04() {
 // Zero-dimensional box.
 bool
 test05() {
-  Bounding_Box box(0);
+  Rational_Box box(0);
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr;
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box()) ***");
+  print_congruences(gr, "*** gr(box) ***");
 
   return ok;
 }
@@ -136,17 +127,16 @@ test05() {
 // Empty box in 2D.
 bool
 test06() {
-  Bounding_Box box(2);
+  Rational_Box box(2);
   box.set_empty();
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(2, EMPTY);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box()) ***");
+  print_congruences(gr, "*** gr(box) ***");
 
   return ok;
 }
@@ -159,19 +149,17 @@ test07() {
   Variable C(2);
   Variable D(3);
 
-  Bounding_Box box(4);
-  box.raise_lower_bound(3, true, 4, 1);
-  box.lower_upper_bound(3, true, 4, 1);
+  Rational_Box box(4);
+  box.add_constraint(D == 4);
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(4);
   known_gr.add_constraint(D == 4);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box()) ***");
+  print_congruences(gr, "*** gr(box) ***");
 
   return ok;
 }
@@ -179,100 +167,160 @@ test07() {
 // Unit square.
 bool
 test08() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.lower_upper_bound(0, true, 1, 1);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 1);
-
-  try {
-    Grid gr(box, From_Bounding_Box());
-  }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 1);
+
+  Grid gr(box);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box) ***");
+
+  return ok;
 }
 
 // Simple box with divisor and an interval bounded only from below.
 bool
 test09() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 2);
-
-  try {
-    Grid gr(box, From_Bounding_Box());
-  }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(2*B == 1);
+
+  Grid gr(box);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(2*B == 1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box) ***");
+
+  return ok;
 }
 
 // Box with a dimension bounded only from above.
 bool
 test10() {
-  Bounding_Box box(2);
-  box.lower_upper_bound(0, true, 3, 7);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 2);
-
-  try {
-    Grid gr(box, From_Bounding_Box());
-  }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(2*B == 1);
+
+  Grid gr(box);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(2*B == 1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box) ***");
+
+  return ok;
 }
 
-// An otherwise valid box having a dimension with an open bound, where
+// A box having a dimension with an open bound, where
 // the open bound makes the box empty.
 bool
 test11() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 3, 7);
-  box.lower_upper_bound(0, true, 3, 7);
-  box.raise_lower_bound(1, false, 1, 2);
-  box.lower_upper_bound(1, true, 1, 2);
-
-  try {
-    Grid gr(box, From_Bounding_Box());
-   }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B > 1);
+  box.add_constraint(2*B <= 0);
+
+  Grid gr(box);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box) ***");
+
+  return ok;
 }
 
 // Zero-dimensional empty box.
 bool
 test12() {
-  Bounding_Box box(0);
+  Rational_Box box(0);
   box.set_empty();
 
-  Grid gr(box, From_Bounding_Box());
+  Grid gr(box);
 
   Grid known_gr(0, EMPTY);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr(box, From_Bounding_Box()) ***");
+  print_congruences(gr, "*** gr(box) ***");
+
+  return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Rational_Box box(6);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(4*B == -11);
+  box.add_constraint(3*D == 18);
+  box.add_constraint(7*E == 15);
+  box.add_constraint(7*F == -15);
+
+  Grid gr(box);
+
+  Grid known_gr(6, EMPTY);
+  known_gr.add_grid_generator(grid_point(-56*A - 231*B + 504*D + 180*E - 180*F, 84));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B > 1);
+  box.add_constraint(B >= 1);
+
+  Grid gr(box);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(7*A == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box) ***");
 
   return ok;
 }
@@ -292,4 +340,6 @@ BEGIN_MAIN
   DO_TEST(test10);
   DO_TEST(test11);
   DO_TEST(test12);
+  DO_TEST_F8(test13);
+  DO_TEST(test14);
 END_MAIN
diff --git a/tests/Grid/boundingbox2.cc b/tests/Grid/boundingbox2.cc
deleted file mode 100644
index 30330ff..0000000
--- a/tests/Grid/boundingbox2.cc
+++ /dev/null
@@ -1,520 +0,0 @@
-/* Test Grid::shrink_bounding_box(Box&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-using namespace Parma_Polyhedra_Library::IO_Operators;
-
-namespace {
-
-bool
-operator==(const Bounding_Box& x, const Bounding_Box& y) {
-  dimension_type dimension = x.space_dimension();
-  if (dimension != y.space_dimension())
-    return false;
-
-  if (x.is_empty() && y.is_empty())
-    return true;
-
-  if (x.is_empty() || y.is_empty())
-    return false;
-
-  TEMP_INTEGER(n_x);
-  TEMP_INTEGER(n_y);
-  TEMP_INTEGER(d_x);
-  TEMP_INTEGER(d_y);
-
-  for (dimension_type i = dimension; i-- > 0; ) {
-    bool tem;
-    bool x_closed = x.get_lower_bound(i, tem, n_x, d_x);
-    bool y_closed = y.get_lower_bound(i, tem, n_y, d_y);
-    if (x_closed == y_closed) {
-      if (x_closed && (n_x != n_y || d_x != d_y))
-	return false;
-    }
-    else
-      return false;
-    x_closed = x.get_upper_bound(i, tem, n_x, d_x);
-    y_closed = y.get_upper_bound(i, tem, n_y, d_y);
-    if (x_closed == y_closed) {
-      if (x_closed && (n_x != n_y || d_x != d_y))
-	return false;
-    }
-    else
-      return false;
-  }
-
-  return true;
-}
-
-// Minimized rectilinear grid.
-bool
-test01() {
-  Variable A(0);
-  Variable B(1);
-
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.lower_upper_bound(0, true, 3, 1);
-  box.raise_lower_bound(1, true, 1, 1);
-  box.lower_upper_bound(1, true, 3, 1);
-
-  Bounding_Box known_box(box);
-
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(B));
-  gr.add_generator(grid_point(3*A + B));
-  gr.add_generator(grid_point(3*A + 3*B));
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Skew grid.
-bool
-test02() {
-  Variable A(0);
-  Variable B(1);
-
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 3, 2);
-  box.lower_upper_bound(0, true, 4, 2);
-  box.raise_lower_bound(1, true, 7, 1);
-  box.lower_upper_bound(1, true, 8, 1);
-
-  Bounding_Box known_box(box);
-
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(  A +   B));
-  gr.add_generator(grid_point(2*A + 3*B));
-  gr.add_generator(grid_point(  A + 4*B));
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Skew grid, with a divisor.
-bool
-test03() {
-  Variable A(0);
-  Variable B(1);
-
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 2);
-  box.lower_upper_bound(0, true, 1, 2);
-  box.raise_lower_bound(1, true, 0, 2);
-  box.lower_upper_bound(1, true, 2, 2);
-
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(2*A));
-  gr.add_generator(grid_point(  A + 2*B, 2));
-
-  Bounding_Box known_box(box);
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-  return ok;
-}
-
-// Grid containing a line.
-bool
-test04() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Bounding_Box box(3);
-
-  Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_line(A + 2*B));
-  gr.add_generator(grid_point(C, 2));
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  Bounding_Box known_box(3);
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Universe grid.
-bool
-test05() {
-  Bounding_Box box(3);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.lower_upper_bound(0, true, 0, 1);
-
-  Grid gr(3);
-
-  Bounding_Box known_box(box);
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Grid which is a single point.
-bool
-test06() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Bounding_Box box1(3);
-
-  Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(16*A + 6*B - 6*C, 7));
-
-  gr.shrink_bounding_box(box1);
-  nout << "*** box1 ***" << endl << box1 << endl;
-
-  Bounding_Box known_box(3);
-  known_box.raise_lower_bound(0, true, 16, 7);
-  known_box.lower_upper_bound(0, true, 16, 7);
-  known_box.raise_lower_bound(1, true, 6, 7);
-  known_box.lower_upper_bound(1, true, 6, 7);
-  known_box.raise_lower_bound(2, true, -6, 7);
-  known_box.lower_upper_bound(2, true, -6, 7);
-
-  bool ok = (box1 == known_box);
-  if (ok) {
-    Grid tem_gr(box1, From_Bounding_Box());
-    Bounding_Box box2(3);
-
-    tem_gr.shrink_bounding_box(box2);
-    nout << "*** box2 ***" << endl << box2 << endl;
-
-    ok = (box2 == known_box);
-  }
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box2) ***");
-
-  return ok;
-}
-
-// Empty grid.
-bool
-test07() {
-  Bounding_Box box1(3);
-
-  Grid gr(3, EMPTY);
-
-  gr.shrink_bounding_box(box1);
-  nout << "*** box1 ***" << endl << box1 << endl;
-
-  Bounding_Box known_box(3);
-  known_box.set_empty();
-
-  bool ok = (box1 == known_box);
-  if (ok) {
-    Grid tem_gr(box1, From_Bounding_Box());
-    Bounding_Box box2(3);
-
-    tem_gr.shrink_bounding_box(box2);
-    nout << "*** box2 ***" << endl << box2 << endl;
-
-    ok = (box2 == known_box);
-  }
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box2) ***");
-
-  return ok;
-}
-
-// A grid with redundant generators.
-bool
-test08() {
-  Variable A(0);
-  Variable B(1);
-
-  Bounding_Box box(3);
-
-  Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A + B));
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(2*A));
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  Bounding_Box known_box(3);
-  known_box.lower_upper_bound(2, true, 0, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// A grid defined by congruences.
-bool
-test09() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Bounding_Box box(3);
-
-  Grid gr(3);
-  gr.add_congruence((A + 2*C %= 0) / 2);
-  gr.add_congruence((A %= 0) / 5);
-  gr.add_congruence(2*B == 3);
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  Bounding_Box known_box(3);
-  known_box.raise_lower_bound(1, true, 3, 2);
-  known_box.lower_upper_bound(1, true, 3, 2);
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// An otherwise valid box having a dimension with an open bound, where
-// the open bound makes the box empty.
-bool
-test10() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 3, 7);
-  box.lower_upper_bound(0, true, 3, 7);
-  box.raise_lower_bound(1, false, 1, 2);
-  box.lower_upper_bound(1, true, 1, 2);
-
-  Grid gr(3);
-
-  try {
-    gr.shrink_bounding_box(box);
-    }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-// An empty grid defined by congruences.
-bool
-test11() {
-  Variable A(0);
-
-  Bounding_Box box1(3);
-
-  Grid gr(3);
-  gr.add_congruence((A %= 0) / 2);
-  gr.add_congruence((A %= 1) / 2);
-
-  gr.shrink_bounding_box(box1);
-  nout << "*** box1 ***" << endl << box1 << endl;
-
-  Bounding_Box known_box(3);
-  known_box.set_empty();
-
-  bool ok = (box1 == known_box);
-  if (ok) {
-    Grid tem_gr(box1, From_Bounding_Box());
-    Bounding_Box box2(3);
-
-    tem_gr.shrink_bounding_box(box2);
-    nout << "*** box2 ***" << endl << box2 << endl;
-
-    ok = (box2 == known_box);
-  }
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box2) ***");
-
-  return ok;
-}
-
-// Simple grid where all the points have the same value in one of the
-// dimensions (B).
-bool
-test12() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  Bounding_Box box1(4);
-
-  Grid gr(4, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(C));
-  gr.add_generator(grid_point(D));
-
-  print_generators(gr, "*** gr ***");
-
-  gr.shrink_bounding_box(box1);
-  nout << "*** box1 ***" << endl << box1 << endl;
-
-  Bounding_Box known_box(4);
-  known_box.lower_upper_bound(1, true, 0, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-
-  bool ok = (box1 == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Simple grid, with a divisor, such that the fractions for some
-// intervals (B and C) will be reduced before being assigned to the
-// intervals.
-bool
-test13() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  Bounding_Box box(4);
-
-  Grid gr(4, EMPTY);
-  gr.add_generator(grid_point(  A + 2*B + 4*C, 4));
-  gr.add_generator(grid_point(2*A + 2*B + 4*C, 4));
-  gr.add_generator(grid_point(  A + 2*B + 4*C + D, 4));
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  Bounding_Box known_box(4);
-  known_box.lower_upper_bound(1, true, 1, 2);
-  known_box.raise_lower_bound(1, true, 1, 2);
-  known_box.lower_upper_bound(2, true, 1, 1);
-  known_box.raise_lower_bound(2, true, 1, 1);
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Zero dimension empty grid.
-bool
-test14() {
-  Bounding_Box box(0);
-
-  Grid gr(0, EMPTY);
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  Bounding_Box known_box(0);
-  known_box.set_empty();
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-// Zero dimension universe grid.
-bool
-test15() {
-  Bounding_Box box(0);
-
-  Grid gr(0);
-
-  gr.shrink_bounding_box(box);
-  nout << "*** box ***" << endl << box << endl;
-
-  Bounding_Box known_box(0);
-
-  bool ok = (box == known_box);
-
-  print_congruences(gr,
-      "*** gr.shrink_bounding_box(box) ***");
-
-  return ok;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-  DO_TEST(test02);
-  DO_TEST(test03);
-  DO_TEST(test04);
-  DO_TEST(test05);
-  DO_TEST(test06);
-  DO_TEST(test07);
-  DO_TEST(test08);
-  DO_TEST(test09);
-  DO_TEST(test10);
-  DO_TEST(test11);
-  DO_TEST(test12);
-  DO_TEST(test13);
-  DO_TEST(test14);
-  DO_TEST(test15);
-END_MAIN
diff --git a/tests/Grid/bounds1.cc b/tests/Grid/bounds1.cc
index 26b15d9..fc6d4d9 100644
--- a/tests/Grid/bounds1.cc
+++ b/tests/Grid/bounds1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::bounds_from_above() and Grid::bounds_from_below().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -70,17 +70,17 @@ test04() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B, 3));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B, 3));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B, 3));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 1);
   gr_cgs_needs_min.add_congruence(3*B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = A + B;
   bool ok = gr_gs_min.bounds_from_above(le)
@@ -104,18 +104,18 @@ test05() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A - B;
 
@@ -140,18 +140,18 @@ test06() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_line(2*A + B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(2*A + B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(2*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(2*A + B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A - 2*B == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A + B;
   bool ok = !gr_gs_min.bounds_from_above(le)
@@ -175,18 +175,18 @@ test07() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_line(A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(A + 2*B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A + 2*B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(2*A - B == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A - B;
   bool ok = gr_gs_min.bounds_from_above(le)
@@ -211,19 +211,19 @@ test08() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_point(A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(A + 2*B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A + 2*B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(2*A - B == 0);
   gr_cgs_needs_min.add_congruence((B %= 0) / 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A - B;
   bool ok = gr_gs_min.bounds_from_above(le)
@@ -247,19 +247,19 @@ test09() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(A));
-  gr_gs_min.add_generator_and_minimize(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(A));
-  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
 
   Grid gr_cgs_needs_min(2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = A - B;
   bool ok = !gr_gs_min.bounds_from_above(le)
@@ -285,21 +285,21 @@ test10() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(A));
-  gr_gs_min.add_generator_and_minimize(grid_point(B + C));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(B + C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(A));
-  gr_gs_needs_min.add_generator(grid_point(B + C));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(B + C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(B - C == 0);
   gr_cgs_needs_min.add_congruence(B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A + B - C;
    bool ok = !gr_gs_min.bounds_from_above(le)
@@ -324,20 +324,20 @@ test11() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(3*B + C));
-  gr_gs_min.add_generator_and_minimize(grid_line(A - 2*B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(A - 2*B));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(3*B + C));
-  gr_gs_needs_min.add_generator(grid_line(A - 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_needs_min.add_grid_generator(grid_line(A - 2*B));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(2*A + B - 3*C == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A + B - 3*C;
   bool ok = gr_gs_min.bounds_from_above(le)
@@ -365,10 +365,10 @@ test12() {
   Variable F(5);
 
   Grid gr_gs_min(6, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
 
   Grid gr_gs_needs_min(6, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+  gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
 
   Grid gr_cgs_needs_min(6);
   gr_cgs_needs_min.add_congruence(A == 7);
@@ -378,8 +378,8 @@ test12() {
   gr_cgs_needs_min.add_congruence(E == 0);
   gr_cgs_needs_min.add_congruence(F == 19);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
   bool ok = gr_gs_min.bounds_from_above(le)
@@ -415,11 +415,11 @@ test13() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/certificate1.cc b/tests/Grid/certificate1.cc
index 03acf29..659890a 100644
--- a/tests/Grid/certificate1.cc
+++ b/tests/Grid/certificate1.cc
@@ -1,11 +1,11 @@
 /* Test class Grid_Certificate.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -40,8 +40,8 @@ test01() {
   Grid_Certificate grc1(gr1);
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(3*B + A));
-  gr2.add_generator(grid_point(3*B + A + C));
+  gr2.add_grid_generator(grid_point(3*B + A));
+  gr2.add_grid_generator(grid_point(3*B + A + C));
 
   Grid_Certificate grc2(gr2);
 
@@ -68,8 +68,8 @@ test02() {
   Grid_Certificate grc1(gr1);
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(3*B + A));
-  gr2.add_generator(grid_point(3*B + A + C));
+  gr2.add_grid_generator(grid_point(3*B + A));
+  gr2.add_grid_generator(grid_point(3*B + A + C));
 
   bool ok = grc1.compare(gr2) == -1;
 
@@ -93,9 +93,9 @@ test03() {
   Grid_Certificate grc1(gr1);
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(3*B));
-  gr2.add_generator(grid_line(A - C));
-  gr2.add_generator(grid_point(3*B + A));
+  gr2.add_grid_generator(grid_point(3*B));
+  gr2.add_grid_generator(grid_line(A - C));
+  gr2.add_grid_generator(grid_point(3*B + A));
 
   Grid_Certificate grc2(gr2);
 
@@ -116,8 +116,8 @@ test04() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*B + A));
-  gr1.add_generator(grid_point(3*B + A + C));
+  gr1.add_grid_generator(grid_point(3*B + A));
+  gr1.add_grid_generator(grid_point(3*B + A + C));
 
   Grid_Certificate grc1(gr1);
 
@@ -177,7 +177,7 @@ test06() {
 
   Grid_Certificate grc2(gr2);
 
-  bool ok (grc1.compare(grc2) == 0);
+  bool ok = (grc1.compare(grc2) == 0);
 
   print_congruences(gr1, "*** gr1 ***");
   print_congruences(gr2, "*** gr2 ***");
@@ -200,12 +200,12 @@ test07() {
   Grid_Certificate grc1(gr1);
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(3*B + A + C));
-  gr2.add_generator_and_minimize(grid_point(3*B + A));
+  gr2.add_grid_generator(grid_point(3*B + A + C));
+  gr2.add_grid_generator_and_minimize(grid_point(3*B + A));
 
   // Ensure up to date congruences and minimized generators.
   gr2.affine_image(A, 1*A);
-  gr2.minimized_generators();
+  gr2.minimized_grid_generators();
 
   bool ok = (grc1.compare(gr2) == -1);
 
diff --git a/tests/Grid/concatenate1.cc b/tests/Grid/concatenate1.cc
index 81f432b..bf79975 100644
--- a/tests/Grid/concatenate1.cc
+++ b/tests/Grid/concatenate1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::concatenate_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -180,8 +180,8 @@ test05() {
 
   Congruence_System known_cgs;
   known_cgs.insert((A == 1) / 0);
-  known_cgs.insert((C %= 0) / 1);
   known_cgs.insert((B == 0) / 0);
+  known_cgs.insert((C %= 0) / 1);
   known_cgs.insert((D == 0) / 0);
   known_cgs.insert((E %= 0) / 1);
 
@@ -299,7 +299,7 @@ test09() {
 
 // Space dimension exception.
 bool
-test10() {
+test11() {
   Grid gr1(7);
 
   Grid gr2(1);
@@ -310,19 +310,18 @@ test10() {
   // integrality congruence.  The presence of the integrality
   // congruence is required by the conversion.
 
-  gr2.add_space_dimensions_and_embed(Grid::max_space_dimension() - 1);
-  print_congruences(gr2, "*** gr2 ***");
+  gr2.add_space_dimensions_and_project(Grid::max_space_dimension() - 1);
 
   try {
     gr1.concatenate_assign(gr2);
   }
   catch (const std::length_error& e) {
     nout << "max_space_dimension_exceeded: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
@@ -337,5 +336,5 @@ BEGIN_MAIN
   DO_TEST(test07);
   DO_TEST(test08);
   DO_TEST(test09);
-  //  DO_TEST(test10);
+  // DO_TEST(test11);
 END_MAIN
diff --git a/tests/Grid/congruence1.cc b/tests/Grid/congruence1.cc
index be273a7..67f25de 100644
--- a/tests/Grid/congruence1.cc
+++ b/tests/Grid/congruence1.cc
@@ -1,11 +1,11 @@
 /* Test class Congruence.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -45,7 +45,7 @@ test01() {
   Test_Congruence b((A %= 5 - 3*C - 2*B) / 7);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -66,7 +66,7 @@ test02() {
   Test_Congruence b((A %= -5 - 3*C - 2*B) / 7);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -87,7 +87,7 @@ test03() {
   Test_Congruence b((16*A + 2*B %= - 64 - 8*C) / 4);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -108,7 +108,7 @@ test04() {
   Test_Congruence b((- A %= - 2*B + 5 - 3*C) / 7);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -132,7 +132,7 @@ test05() {
   Test_Congruence b(A + 4*B %= 5 - 3*C);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -153,7 +153,7 @@ test06() {
   Test_Congruence b((3*A + 24*B %= -19 - 3*C) / 0);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -174,7 +174,7 @@ test07() {
   Test_Congruence b((A + 4*B == 17 - 3*C) / 3);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -195,7 +195,7 @@ test08() {
   Test_Congruence b(A + 4*B == 17 - 3*C);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -218,7 +218,7 @@ test09() {
   b /= 3;
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -237,7 +237,8 @@ test10() {
 
   bool ok = (a.is_trivial_true()) && (!a.is_trivial_false());
 
-  print_congruence(a, "*** a(0*A + 0*B + 0*C %= 17) ***");
+  print_congruence(a,
+    "*** a(0*A + 0*B + 0*C %= 17) ***");
 
   a = Test_Congruence((0*A + 0*B + 0*C %= 0) / 3);
   ok &= a.is_trivial_true()
@@ -247,28 +248,39 @@ test10() {
   ok &= a.is_trivial_true()
     && !a.is_trivial_false();
 
-  print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4) ***");
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4) ***");
 
   a = Test_Congruence(0*A + 0*B %= 17);
   a /= 0;
   ok &= !a.is_trivial_true()
     && a.is_trivial_false();
 
-  print_congruence(a, "*** a = Test_Congruence(0*A + 0*B %= 17) ***");
+  print_congruence(a,
+    "*** a = Test_Congruence(0*A + 0*B %= 17) ***");
 
   a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0);
   a.strong_normalize();
   ok &= !a.is_trivial_true()
     && a.is_trivial_false();
 
-  print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0) ***");
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0) ***");
 
   a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3);
   a.strong_normalize();
   ok &= !a.is_trivial_true()
     && a.is_trivial_false();
 
-  print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3) ***");
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3) ***");
+
+  a = Test_Congruence((0*A + 1*B %= 1) / 3);
+  ok &= !a.is_trivial_true()
+    && !a.is_trivial_false();
+
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 1*B %= 1) / 3) ***");
 
   return ok;
 }
@@ -286,7 +298,7 @@ test11() {
   Test_Congruence b((A + 4*B %= -1 - 3*C) / -3);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -295,22 +307,21 @@ test11() {
 }
 
 // Negative modulus and negative first coefficient.
-
 static bool
 test12() {
-  Variable x0(0);
-  Variable x1(1);
-  Variable x2(2);
-  Variable x3(3);
-  Variable x4(4);
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
 
-  Test_Congruence a((-x0 + 4*x1 + 3*x2 + 17*x3 + 2*x4 %= -4) / -3);
+  Test_Congruence a((-A + 4*B + 3*C + 17*D + 2*E %= -4) / -3);
   a.strong_normalize();
 
-  Test_Congruence b((-x0 + 4*x1 %= - 3*x2 - 17*x3 - 2*x4 - 4) / -3);
+  Test_Congruence b((-A + 4*B %= - 3*C - 17*D - 2*E - 4) / -3);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -328,7 +339,7 @@ test13() {
   Test_Congruence b(le %= 0);
   b.strong_normalize();
 
-  bool ok (a == b);
+  bool ok = (a == b);
 
   print_congruence(a, "*** a ***");
   print_congruence(b, "*** b ***");
@@ -336,25 +347,92 @@ test13() {
   return ok;
 }
 
-// Space dimension exception.
+// Linear expressions on both sides.
 static bool
 test14() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
 
-  Grid gr(2);
+  Test_Congruence a((A - 5 %= 2*B + 3*C) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((-A %= -5 - 3*C - 2*B) / 7);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Try construct congruence from inequality constraint.
+static bool
+test15() {
+  Variable A(0);
+  Variable C(2);
+
+  try {
+    Congruence cg(A + C > 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Try access the coefficient of a space dimension higher than that of
+// a congruence.
+static bool
+test16() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence cg(A + C %= 0);
 
   try {
-    gr.add_congruence(A + C %= 0);
+    cg.coefficient(Variable(3));
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+// Check if the congruences are equivalent.
+static bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 2*B + 3*C %= 5) / 7);
+
+  Test_Congruence b((A + 2*B + 3*C %= 12) / 7);
+
+  Test_Congruence c((2*A + 4*B + 6*C %= 10) / 14);
+
+  bool ok = (a == b);
+  ok &= (a == c);
+
+  Test_Congruence d((2*A + 4*B + 6*C %= 10) / 7);
+
+  ok &= (a != d);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+  print_congruence(c, "*** c ***");
+  print_congruence(d, "*** d ***");
+
+  return ok;
 }
 
 } // namespace
@@ -374,4 +452,7 @@ BEGIN_MAIN
   DO_TEST(test12);
   DO_TEST(test13);
   DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
 END_MAIN
diff --git a/tests/Grid/congruences1.cc b/tests/Grid/congruences1.cc
index b827194..79769b2 100644
--- a/tests/Grid/congruences1.cc
+++ b/tests/Grid/congruences1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::congruences().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -132,8 +132,8 @@ test06() {
   Variable B(1);
 
   Grid gr1(3);
-  gr1.add_generator(grid_point(10*B));
-  gr1.add_generator(grid_point(10*A + 10*B));
+  gr1.add_grid_generator(grid_point(10*B));
+  gr1.add_grid_generator(grid_point(10*A + 10*B));
 
   Grid known_gr = gr1;
 
@@ -199,6 +199,187 @@ test08() {
   return ok;
 }
 
+// add congruence systems to a congruence system with smaller space
+// dimension.
+// This test showed a bug in Congruence_System insert(), now corrected.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  Congruence_System cgs1;
+  cgs1.insert((A %= 0) / 2);
+  cgs.insert(cgs1);
+  cgs1.insert((A + B %= 0) / 2);
+  cgs.recycling_insert(cgs1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add congruence systems to a congruence system
+// with larger space dimension.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  Congruence_System cgs1;
+  cgs.insert((A + B %= 0) / 2);
+  cgs1.insert((A %= 0) / 2);
+  cgs.insert(cgs1);
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Test is_equal_to() for same congruence systems.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1;
+  cgs1.insert((A %= 0) / 2);
+  cgs1.insert((A + B %= 0) / 2);
+  Congruence_System cgs(cgs1);
+  bool ok = cgs.is_equal_to(cgs1);
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  return ok;
+}
+
+// Test is_equal_to() for congruence systems with different numbers
+// numbers of congruences.
+// This test showed a bug in Congruence_System is_equal_to(), now corrected.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1;
+  cgs1.insert((A %= 0) / 2);
+  cgs1.insert((A + B %= 0) / 2);
+  Congruence_System cgs(cgs1);
+  cgs1.insert((B %= 0) / 2);
+
+  bool ok = !cgs.is_equal_to(cgs1);
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  return ok;
+}
+
+// Test is_equal_to() for different congruence systems with the same
+// number of congruences.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1;
+  Congruence_System cgs2;
+  cgs1.insert((A %= 0) / 2);
+  cgs1.insert((A + B %= 0) / 2);
+  cgs2.insert((B %= 0) / 2);
+  cgs2.insert((A + B %= 0) / 2);
+  bool ok = !cgs1.is_equal_to(cgs2);
+  print_congruences(cgs1, "*** cgs1 ***");
+  print_congruences(cgs2, "*** cgs2 ***");
+
+  return ok;
+}
+
+// Test has_linear_equalities() for congruence systems.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+  print_congruences(cgs, "*** cgs.insert((A + B %= 0) / 2) ***");
+  bool ok = !cgs.has_linear_equalities();
+
+  cgs.insert(A == 0);
+  print_congruences(cgs, "*** cgs.insert(A == 0) ***");
+  ok &= cgs.has_linear_equalities();
+
+  return ok;
+}
+
+// Test num_equalities() for congruence systems.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+  cgs.insert(A == 0);
+  print_congruences(cgs, "*** cgs ***");
+
+  bool ok = ((cgs.num_equalities() == 1)
+               && (cgs.num_proper_congruences() == 1));
+
+  return ok;
+}
+
+// Add to a non-empty congruence system a nonempty constraint system
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B == 0);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(B == 0);
+  known_cgs.insert(A %= 0);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  Grid gr(cgs);
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -210,4 +391,12 @@ BEGIN_MAIN
   DO_TEST(test06);
   DO_TEST(test07);
   DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
 END_MAIN
diff --git a/tests/Grid/congruences2.cc b/tests/Grid/congruences2.cc
new file mode 100644
index 0000000..aa7f9f8
--- /dev/null
+++ b/tests/Grid/congruences2.cc
@@ -0,0 +1,336 @@
+/* Test Congruence_System::satisfies_all_congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+class Test_Congruence_System : public Congruence_System {
+public:
+  Test_Congruence_System() : Congruence_System() {}
+  Test_Congruence_System(Congruence_System cgs) : Congruence_System(cgs) {}
+  Test_Congruence_System(Congruence cg) : Congruence_System(cg) {}
+  bool
+  satisfies_all_congruences(const Grid_Generator& g) const {
+    return Congruence_System::satisfies_all_congruences(g);
+  }
+};
+
+// Public constructors.
+bool
+test01() {
+  Test_Congruence_System cgs0;
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  Test_Congruence_System cgs1(cgs0);
+
+  bool ok = (cgs1 == cgs0);
+
+  print_congruences(cgs1, "*** cgs1(cgs0) ***");
+
+  if (ok) {
+    Variable A(0);
+    Variable B(1);
+
+    Test_Congruence_System cgs2((A - 3*B %= 5) / 2);
+
+    ok &= !(cgs2 == cgs0) && !(cgs2 == cgs1);
+
+    print_congruences(cgs2, "*** cgs2((A - 3*B %= 5) / 2) ***");
+  };
+
+  return ok;
+}
+
+// operator=
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0;
+
+  Test_Congruence_System cgs1((A - 3*B + 21*C %= 5) / 2);
+
+  cgs0 = cgs1;
+
+  bool ok = (cgs0 == cgs1);
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  return ok;
+}
+
+// space_dimension
+bool
+test03() {
+  Variable A(3);
+  Variable B(7);
+  Variable C(4);
+
+  Test_Congruence_System cgs0((A - 3*B + 21*C %= 55) / 21);
+
+  bool ok = (cgs0.space_dimension() == 8);
+
+  print_congruences(cgs0, "*** cgs0((A - 3*B + 21*C %= 55) / 21) ***");
+
+  return ok;
+}
+
+// clear
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - 3*B %= 5) / 7);
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  cgs0.clear();
+
+  bool ok = (cgs0.space_dimension() == 0);
+
+  print_congruences(cgs0, "*** cgs0.clear() ***");
+
+  return ok;
+}
+
+// insert
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Test_Congruence_System cgs0((A - 3*B + C - 18*D %= 5) / 7);
+  cgs0.insert((A %= 0) / 3);
+  cgs0.insert((A + B %= 3) / 5);
+
+  dimension_type tem = cgs0.num_proper_congruences();
+  bool ok = (tem == 3);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+// num_[non_]equalities
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0((-A - B + 13*C %= 6) / 7);
+  cgs0.insert((A %= 0) / 0);
+  cgs0.insert((A + B %= 3) / 0);
+
+  dimension_type neqs = cgs0.num_equalities();
+  dimension_type npcgs = cgs0.num_proper_congruences();
+  bool ok = (neqs == 2 && npcgs == 1);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+// insert, including a row with all terms zero and an equality.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0(0*A + 0*B %= -1);
+  cgs0.insert((A + 0*B %= 1) / 0);
+  cgs0.insert(0*A + 1*B %= 1);
+
+  dimension_type neqs = cgs0.num_equalities();
+  dimension_type npcgs = cgs0.num_proper_congruences();
+  bool ok = (neqs == 1 && npcgs == 2);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+/* If EXPECTED is true:
+     If G satisfies CGS, then return true, else print an error message
+     and return false.
+
+   And if EXPECTED is false:
+     If G satisfies CGS, then print an error message and return false,
+     else return true.
+*/
+bool
+satisfies(const Grid_Generator& g,
+	  const Test_Congruence_System& cgs,
+	  bool expected = true) {
+  if (cgs.satisfies_all_congruences(g) == expected)
+    return true;
+
+  nout << g << " should";
+  expected || nout << "fail to";
+  nout << " satisfy " << cgs << "." << endl
+       << "ASCII dump of " << g << ":" << endl;
+  g.ascii_dump(nout);
+  nout << "ASCII dump of " << cgs << ":" << endl;
+  cgs.ascii_dump(nout);
+
+  return false;
+}
+
+inline bool
+fails_to_satisfy(const Grid_Generator& g,
+		 const Congruence_System& cgs) {
+  return satisfies(g, cgs, false);
+}
+
+// Divisor of 1.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - B %= 0) / 7);
+  print_congruences(cgs0, "*** cgs0((A - B %= 0) / 7) ***");
+
+  // Points.
+
+  bool ok = (satisfies(grid_point(), cgs0));
+
+  ok &= (satisfies(grid_point(A + B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(A + 2*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(5*A + 2*B), cgs0));
+
+  ok &= (satisfies(grid_point(5*A - 2*B), cgs0));
+
+  // Parameters.
+
+  ok &= (satisfies(parameter(3*A + 3*B), cgs0));
+
+  ok &= (satisfies(parameter(0*A + 14*B), cgs0));
+
+  ok &= (satisfies(parameter(-A + 13*B), cgs0));
+
+  // Lines.
+
+  ok &= (satisfies(grid_line(13*A + 13*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(18*A + 14*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(14*A - 21*B), cgs0));
+
+  cgs0.insert((A %= 0) / 2);
+  ok &= (fails_to_satisfy(grid_line(3*A), cgs0));
+  print_congruences(cgs0,
+		    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+
+  return ok;
+}
+
+// Divisors greater than 1.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - B %= 0) / 7);
+  print_congruences(cgs0,
+		    "*** cgs0((A - B %= 0) / 7) ***");
+
+  // Points.
+
+  bool ok = (satisfies(grid_point(A + B, 3), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(A + 2*B, 3), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(5*A + 2*B, 5), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(5*A - 2*B, 7), cgs0));
+
+  // Parameters.
+
+  ok &= (satisfies(parameter(3*A + 3*B, 4), cgs0));
+
+  ok &= (fails_to_satisfy(parameter(A + 14*B, 5), cgs0));
+
+  ok &= (satisfies(parameter(-A + 13*B, 2), cgs0));
+
+  // Lines.
+
+  ok &= (satisfies(grid_line(13*A + 13*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(18*A + 14*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(14*A - 21*B), cgs0));
+
+  cgs0.clear();
+  cgs0.insert((A %= 0) / 2);
+  ok &= (fails_to_satisfy(grid_line(3*A), cgs0));
+  print_congruences(cgs0,
+		    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+
+  return ok;
+}
+
+// clear empty congruence system
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0;
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  cgs0.clear();
+
+  bool ok = (cgs0.space_dimension() == 0);
+
+  print_congruences(cgs0, "*** cgs0.clear() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/congruencesystem1.cc b/tests/Grid/congruencesystem1.cc
deleted file mode 100644
index bef0083..0000000
--- a/tests/Grid/congruencesystem1.cc
+++ /dev/null
@@ -1,419 +0,0 @@
-/* Test Congruence_System::satisfies_all_congruences().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-using namespace Parma_Polyhedra_Library::IO_Operators;
-
-namespace {
-
-class Test_Congruence_System : public Congruence_System {
-public:
-  Test_Congruence_System() : Congruence_System() {}
-  Test_Congruence_System(Congruence_System cgs) : Congruence_System(cgs) {}
-  Test_Congruence_System(Congruence cg) : Congruence_System(cg) {}
-  bool
-  satisfies_all_congruences(const Grid_Generator& g) const {
-    return Congruence_System::satisfies_all_congruences(g);
-  }
-};
-
-// Public constructors.
-bool
-test01() {
-  Test_Congruence_System cgs0;
-
-  print_congruences(cgs0, "*** cgs0 ***");
-
-  Test_Congruence_System cgs1(cgs0);
-
-  bool ok = (cgs1 == cgs0);
-
-  print_congruences(cgs1, "*** cgs1(cgs0) ***");
-
-  if (ok) {
-    Variable A(0);
-    Variable B(1);
-
-    Test_Congruence_System cgs2((A - 3*B %= 5) / 2);
-
-    ok &= !(cgs2 == cgs0) && !(cgs2 == cgs1);
-
-    print_congruences(cgs2, "*** cgs2((A - 3*B %= 5) / 2) ***");
-  };
-
-  return ok;
-}
-
-// operator=
-bool
-test02() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Test_Congruence_System cgs0;
-
-  Test_Congruence_System cgs1((A - 3*B + 21*C %= 5) / 2);
-
-  cgs0 = cgs1;
-
-  bool ok = (cgs0 == cgs1);
-
-  print_congruences(cgs0, "*** cgs0 ***");
-
-  return ok;
-}
-
-// space_dimension
-bool
-test03() {
-  Variable A(3);
-  Variable B(7);
-  Variable C(4);
-
-  Test_Congruence_System cgs0((A - 3*B + 21*C %= 55) / 21);
-
-  bool ok = (cgs0.space_dimension() == 8);
-
-  print_congruences(cgs0, "*** cgs0((A - 3*B + 21*C %= 55) / 21) ***");
-
-  return ok;
-}
-
-// clear
-bool
-test04() {
-  Variable A(0);
-  Variable B(1);
-
-  Test_Congruence_System cgs0((A - 3*B %= 5) / 7);
-
-  print_congruences(cgs0, "*** cgs0 ***");
-
-  cgs0.clear();
-
-  bool ok = (cgs0.space_dimension() == 0);
-
-  print_congruences(cgs0, "*** cgs0.clear() ***");
-
-  return ok;
-}
-
-// insert
-bool
-test05() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  Test_Congruence_System cgs0((A - 3*B + C - 18*D %= 5) / 7);
-  cgs0.insert((A %= 0) / 3);
-  cgs0.insert((A + B %= 3) / 5);
-
-  dimension_type tem = cgs0.num_proper_congruences();
-  bool ok = (tem == 3);
-
-  print_congruences(cgs0, "*** cgs0.insert ***");
-
-  return ok;
-}
-
-// num_[non_]equalities
-bool
-test06() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Test_Congruence_System cgs0((-A - B + 13*C %= 6) / 7);
-  cgs0.insert((A %= 0) / 0);
-  cgs0.insert((A + B %= 3) / 0);
-
-  dimension_type neqs = cgs0.num_equalities();
-  dimension_type npcgs = cgs0.num_proper_congruences();
-  bool ok = (neqs == 2 && npcgs == 1);
-
-  print_congruences(cgs0, "*** cgs0.insert ***");
-
-  return ok;
-}
-
-// insert, including a row with all terms zero and an equality.
-bool
-test07() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Test_Congruence_System cgs0(0*A + 0*B %= -1);
-  cgs0.insert((A + 0*B %= 1) / 0);
-  cgs0.insert(0*A + 1*B %= 1);
-
-  dimension_type neqs = cgs0.num_equalities();
-  dimension_type npcgs = cgs0.num_proper_congruences();
-  bool ok = (neqs == 1 && npcgs == 2);
-
-  print_congruences(cgs0, "*** cgs0.insert ***");
-
-  return ok;
-}
-
-/* If PASS_EXPECTED is true:
-     If the first generator in GS satifies CGS, then return true, else
-     print an error message and return false.
-
-   And, symmetrically, if PASS_EXPECTED is false:
-     If the first generator in GS fails to satify CGS, then return
-     false, else print an error message and return true.
-
-   FIXME: If Generator::ascii_dump was public this could take a
-          Generator.
-*/
-bool
-fulfils(const Grid_Generator_System& gs,
-	const Test_Congruence_System& cgs,
-	bool pass_expected = false) {
-  Grid_Generator_System::const_iterator gi = gs.begin();
-
-  if (cgs.satisfies_all_congruences(*gi) == pass_expected)
-    return pass_expected;
-
-  nout << *gi << " should";
-  pass_expected || nout << "fail to";
-  nout << " satisfy " << cgs << "." << endl
-       << "ASCII dump of system holding " << *gi << ":" << endl;
-  gs.ascii_dump(nout);
-  nout << "ASCII dump of " << cgs << ":" << endl;
-  cgs.ascii_dump(nout);
-
-  return !pass_expected;
-}
-
-#define satisfies fulfils
-
-inline bool
-fails_to_satisfy(const Grid_Generator_System& gs,
-		 const Congruence_System& cgs) {
-  if (fulfils(gs, cgs, true))
-    return false;
-  return true;
-}
-
-// Divisor of 1.
-bool
-test08() {
-  Variable A(0);
-  Variable B(1);
-
-  Test_Congruence_System cgs0((A - B %= 0) / 7);
-  print_congruences(cgs0, "*** cgs0((A - B %= 0) / 7) ***");
-
-  Grid_Generator_System gs0;
-
-  // Points.
-
-  gs0.insert(grid_point());
-  bool ok = (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0, "*** gs0.insert(grid_point()) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(A + B));
-  ok &= (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(A + B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(A + 2*B));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(A + 2*B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(5*A + 2*B));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(5*A + 2*B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(5*A - 2*B));
-  ok &= (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(5*A - 2*B)) ***");
-
-  // Parameters.
-
-  gs0.clear();
-  gs0.insert(parameter(3*A + 3*B));
-  ok &= (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(parameter(3*A + 3*B)) ***");
-
-  gs0.clear();
-  gs0.insert(parameter(A + 14*B));
-  ok &= (satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(parameter(A + 14*B)) ***");
-
-  gs0.clear();
-  gs0.insert(parameter(-A + 13*B));
-  ok = (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(parameter(-A + 13*B)) ***");
-
-  // Lines.
-
-  gs0.clear();
-  gs0.insert(grid_line(13*A + 13*B));
-  ok = (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(13*A + 13*B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_line(18*A + 14*B));
-  ok = (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(18*A + 14*B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_line(14*A - 21*B));
-  ok = (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(14*A - 21*B)) ***");
-
-  cgs0.clear();
-  cgs0.insert((A %= 0) / 2);
-  gs0.clear();
-  gs0.insert(grid_line(3*A));
-  ok = (!satisfies(gs0, cgs0));
-  print_congruences(cgs0,
-    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(3*A)) ***");
-
-  return ok;
-}
-
-// Divisors greater than 1.
-bool
-test09() {
-  Variable A(0);
-  Variable B(1);
-
-  Test_Congruence_System cgs0((A - B %= 0) / 7);
-  print_congruences(cgs0,
-    "*** cgs0((A - B %= 0) / 7) ***");
-
-  Grid_Generator_System gs0;
-
-  // Points.
-  gs0.clear();
-  gs0.insert(grid_point(A + B, 3));
-  bool ok = (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(A + B, 3)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(A + 2*B, 3));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(A + 2*B, 3)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(5*A + 2*B, 5));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(5*A + 2*B, 5)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_point(5*A - 2*B, 7));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_point(5*A - 2*B, 7)) ***");
-
-  // Parameters.
-
-  gs0.clear();
-  gs0.insert(parameter(3*A + 3*B, 4));
-  ok &= (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(parameter(3*A + 3*B, 4)) ***");
-
-  gs0.clear();
-  gs0.insert(parameter(A + 14*B, 5));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(parameter(A + 14*B, 5)) ***");
-
-  gs0.clear();
-  gs0.insert(parameter(-A + 13*B, 2));
-  ok &= (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(parameter(-A + 13*B, 2)) ***");
-
-  // Lines.
-
-  gs0.clear();
-  gs0.insert(grid_line(13*A + 13*B));
-  ok &= (!fails_to_satisfy(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(13*A + 13*B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_line(18*A + 14*B));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(18*A + 14*B)) ***");
-
-  gs0.clear();
-  gs0.insert(grid_line(14*A - 21*B));
-  ok &= (!satisfies(gs0, cgs0));
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(14*A - 21*B)) ***");
-
-  cgs0.clear();
-  cgs0.insert((A %= 0) / 2);
-  gs0.clear();
-  gs0.insert(grid_line(3*A));
-  ok &= (!satisfies(gs0, cgs0));
-  print_congruences(cgs0,
-    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
-  print_generators(gs0,
-    "*** gs0.clear(); gs0.insert(grid_line(3*A)) ***");
-
-  return ok;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-  DO_TEST(test02);
-  DO_TEST(test03);
-  DO_TEST(test04);
-  DO_TEST(test05);
-  DO_TEST(test06);
-  DO_TEST(test07);
-  DO_TEST(test08);
-  DO_TEST(test09);
-END_MAIN
diff --git a/tests/Grid/constraints1.cc b/tests/Grid/constraints1.cc
new file mode 100644
index 0000000..26c7a62
--- /dev/null
+++ b/tests/Grid/constraints1.cc
@@ -0,0 +1,353 @@
+/* Test Grid::congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(7);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid known_gr(Constraint_System::zero_dim_empty());
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(0);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 7);
+  gr1.add_congruence((A %= 0) / 5);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 7);
+  gr2.add_congruence((A %= 0) / 5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Single point in 2D
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 0);
+  gr1.add_congruence((A %= 0) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Linear points in 2D
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 2);
+  gr1.add_congruence((A %= 0) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test08() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test09() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(7);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test10() {
+  Grid gr1(0, EMPTY);
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid known_gr(Constraint_System::zero_dim_empty());
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test11() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(0);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 7);
+  gr1.add_congruence((A %= 0) / 5);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 7);
+  gr2.add_congruence((A %= 0) / 5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Single point in 2D
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 0);
+  gr1.add_congruence((A %= 0) / 0);
+  gr1.add_congruence((B %= 3) / 0);
+  gr1.add_congruence((A - B %= -3) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Linear points in 2D
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 2);
+  gr1.add_congruence((A %= 0) / 0);
+  gr1.add_congruence((3*A %= 0) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/contains1.cc b/tests/Grid/contains1.cc
index 4791e85..267ed80 100644
--- a/tests/Grid/contains1.cc
+++ b/tests/Grid/contains1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::contains().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -125,8 +125,8 @@ test06() {
   gr1.add_congruence(C %= 0);
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point());
-  gr2.add_generator(grid_point(2*A + 2*B + 2*C));
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_point(2*A + 2*B + 2*C));
 
   bool ok = (gr1.contains(gr2));
 
@@ -144,8 +144,8 @@ test07() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_point(2*A + 2*B + 2*C));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(2*A + 2*B + 2*C));
 
   Grid gr2(3);
   gr2.add_congruence(A - B %= 0);
@@ -165,10 +165,10 @@ test08() {
   Variable A(0);
 
   Grid gr1(1, EMPTY);
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
 
   Grid gr2(1, EMPTY);
-  gr2.add_generator(grid_point(A));
+  gr2.add_grid_generator(grid_point(A));
 
   bool ok = !gr1.contains(gr2) && !gr2.contains(gr1);
 
@@ -182,7 +182,7 @@ test08() {
 bool
 test09() {
   Grid gr1(1, EMPTY);
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
 
   Grid gr2(21, EMPTY);
 
@@ -191,11 +191,11 @@ test09() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/containsintegerpoint1.cc b/tests/Grid/containsintegerpoint1.cc
new file mode 100644
index 0000000..ff46ada
--- /dev/null
+++ b/tests/Grid/containsintegerpoint1.cc
@@ -0,0 +1,289 @@
+/* Test Grid::contains_integer_point().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <iostream>
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (!gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+
+  Grid gr(0, EMPTY);
+
+  bool ok = (!gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B));
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.contains_integer_point())
+    && (gr_gs_needs_min.contains_integer_point())
+    && (gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(5*A == 3);
+  gr_cgs_needs_min.add_congruence(5*B == 2);
+
+  Grid gr_cgs_min(3);
+  gr_cgs_min.add_congruence(5*A == 3);
+  gr_cgs_min.add_congruence(5*B == 2);
+  // Minimize the congruences.
+  gr_cgs_min.minimized_congruences();
+
+  // Grids gr_gs_min, gr_gs_needs_min, gr_cgs_needs_min and gr_cgs_min
+  // are the same grids.
+
+  bool ok = (!gr_gs_min.contains_integer_point())
+    && (!gr_gs_needs_min.contains_integer_point())
+    && (!gr_cgs_needs_min.contains_integer_point())
+    && (!gr_cgs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+  print_congruences(gr_cgs_min, "*** gr_cgs_min ***");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + B, 5));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B, 5));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(5*A == 3);
+  gr_cgs_needs_min.add_congruence(5*B %= 0);
+  gr_cgs_needs_min.add_congruence(C == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (!gr_gs_min.contains_integer_point())
+    && (!gr_gs_needs_min.contains_integer_point())
+    && (!gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B, 3));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B, 3));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 1);
+  gr_cgs_needs_min.add_congruence(3*B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.contains_integer_point())
+    && (gr_gs_needs_min.contains_integer_point())
+    && (gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.contains_integer_point())
+    && (gr_gs_needs_min.contains_integer_point())
+    && (gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(3);
+  gr.add_congruence(A == 1);
+  gr.add_congruence(A == 2);
+
+  bool ok = (!gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(4*A %= 0);
+
+  Grid gr_copy = gr;
+
+  bool ok = (gr.contains_integer_point() && gr == gr_copy);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(gr_copy, "*** gr_copy ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/copyconstruct1.cc b/tests/Grid/copyconstruct1.cc
deleted file mode 100644
index dd7699b..0000000
--- a/tests/Grid/copyconstruct1.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Test copy construction of grids.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-namespace {
-
-// Universe and empty grids of the first ten dimensions.
-
-bool
-test01() {
-  bool ok = true;
-  for (unsigned int dim = 0; dim < 10; ++dim) {
-
-    nout << "dimension: " << dim << endl;
-
-    // Universe.
-
-    Grid gr(dim);
-    print_congruences(gr, "*** gr ***");
-
-    Grid gr_copy = gr;
-    print_congruences(gr_copy, "*** gr_copy ***");
-
-    Grid known_gr(dim);
-
-    ok &= (gr_copy == known_gr);
-    if (ok) {
-
-      // Empty.
-
-      gr = Grid(dim, EMPTY);
-      print_generators(gr, "*** gr ***");
-
-      Grid gr_copy = gr;
-      print_generators(gr_copy, "*** gr_copy ***");
-
-      Grid known_gr(dim, EMPTY);
-
-      ok &= (gr_copy == known_gr);
-    }
-  };
-
-  return ok;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-END_MAIN
diff --git a/tests/Grid/coveringbox1.cc b/tests/Grid/coveringbox1.cc
index 9097e2b..1030c97 100644
--- a/tests/Grid/coveringbox1.cc
+++ b/tests/Grid/coveringbox1.cc
@@ -1,11 +1,11 @@
 /* Test Grid(Box& box, From_Covering_Box()).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,7 +31,7 @@ namespace {
 // Universe box.
 bool
 test01() {
-  Bounding_Box box(SPACE_DIM);
+  Rational_Box box(SPACE_DIM);
 
   Grid gr(box, From_Covering_Box());
 
@@ -50,9 +50,9 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box(SPACE_DIM);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.raise_lower_bound(1, true, 0, 1);
+  Rational_Box box(SPACE_DIM);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
 
   Grid gr(box, From_Covering_Box());
 
@@ -73,11 +73,11 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box(SPACE_DIM);
-  box.raise_lower_bound(0, true, -2, 3);
-  box.lower_upper_bound(0, true, 4, 1);
-  box.raise_lower_bound(1, true, -10, 1);
-  box.lower_upper_bound(1, true, 12, 3);
+  Rational_Box box(SPACE_DIM);
+  box.add_constraint(3*A >= -2);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B >= -10);
+  box.add_constraint(3*B <= 12);
 
   Grid gr(box, From_Covering_Box());
 
@@ -99,19 +99,19 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box(3);
-  box.raise_lower_bound(0, true, -2, 3);
-  box.lower_upper_bound(0, true, 4, 1);
-  box.raise_lower_bound(1, true, -10, 1);
-  box.lower_upper_bound(1, true, 12, 3);
-  box.raise_lower_bound(2, true, 15, 3);
+  Rational_Box box(3);
+  box.add_constraint(3*A >= -2);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B >= -10);
+  box.add_constraint(3*B <= 12);
+  box.add_constraint(3*C >= 15);
 
   Grid gr(box, From_Covering_Box());
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(-2*A - 30*B + 15*C, 3));
-  known_gr.add_generator(grid_point(4*A - 10*B + 5*C));
-  known_gr.add_generator(grid_point(-2*A + 12*B + 15*C, 3));
+  known_gr.add_grid_generator(grid_point(-2*A - 30*B + 15*C, 3));
+  known_gr.add_grid_generator(grid_point(4*A - 10*B + 5*C));
+  known_gr.add_grid_generator(grid_point(-2*A + 12*B + 15*C, 3));
 
   bool ok = (gr == known_gr);
 
@@ -123,7 +123,7 @@ test04() {
 // Zero-dimensional box.
 bool
 test05() {
-  Bounding_Box box(0);
+  Rational_Box box(0);
 
   Grid gr(box, From_Covering_Box());
 
@@ -139,7 +139,7 @@ test05() {
 // Empty box in 2D.
 bool
 test06() {
-  Bounding_Box box(2);
+  Rational_Box box(2);
   box.set_empty();
 
   Grid gr(box, From_Covering_Box());
@@ -156,11 +156,12 @@ test06() {
 // A box which is a point.
 bool
 test07() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 2, 1);
-  box.lower_upper_bound(0, true, 2, 1);
-  box.raise_lower_bound(1, true, 4, 1);
-  box.lower_upper_bound(1, true, 4, 1);
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A == 2);
+  box.add_constraint(B == 4);
 
   Grid gr(box, From_Covering_Box());
 
@@ -179,11 +180,11 @@ test08() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.lower_upper_bound(0, true, 1, 1);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 1);
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
 
   Grid gr(box, From_Covering_Box());
 
@@ -206,10 +207,10 @@ test09() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 2);
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+  box.add_constraint(2*B <= 1);
 
   Grid gr(box, From_Covering_Box());
 
@@ -230,10 +231,10 @@ test10() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box(2);
-  box.lower_upper_bound(0, true, 3, 7);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 2);
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(B >= 0);
+  box.add_constraint(2*B <= 1);
 
   Grid gr(box, From_Covering_Box());
 
@@ -252,28 +253,31 @@ test10() {
 // makes the box empty.
 bool
 test11() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(0, true, 3, 7);
-  box.raise_lower_bound(1, false, 1, 2);
-  box.lower_upper_bound(1, true, 1, 2);
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(B >= 0);
+  box.add_constraint(2*B < 1);
+  box.add_constraint(2*B >= 1);
 
   try {
     Grid gr(box, From_Covering_Box());
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Zero-dimensional empty box.
 bool
 test12() {
-  Bounding_Box box(0);
+  Rational_Box box(0);
   box.set_empty();
 
   Grid gr(box, From_Covering_Box());
@@ -287,6 +291,42 @@ test12() {
   return ok;
 }
 
+// A box from a higher dimension.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Rational_Box box(6);
+  box.add_constraint(3*A >= -2);
+  box.add_constraint(A <= 5);
+  box.add_constraint(4*B >= -11);
+  box.add_constraint(3*B <= 12);
+  box.add_constraint(3*C >= 15);
+  box.add_constraint(3*D <= 18);
+  box.add_constraint(7*E >= 15);
+  box.add_constraint(7*F >= -15);
+  box.add_constraint(7*F <= 15);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(6, EMPTY);
+  known_gr.add_grid_generator(grid_point(-56*A - 231*B + 420*C + 504*D + 180*E - 180*F, 84));
+  known_gr.add_grid_generator(parameter(17*A, 3));
+  known_gr.add_grid_generator(parameter(81*B, 12));
+  known_gr.add_grid_generator(parameter(30*F, 7));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -302,4 +342,5 @@ BEGIN_MAIN
   DO_TEST(test10);
   DO_TEST(test11);
   DO_TEST(test12);
+  DO_TEST_F16(test13);
 END_MAIN
diff --git a/tests/Grid/coveringbox2.cc b/tests/Grid/coveringbox2.cc
index 68bd1a0..312c23f 100644
--- a/tests/Grid/coveringbox2.cc
+++ b/tests/Grid/coveringbox2.cc
@@ -1,11 +1,11 @@
  /* Test Grid::get_covering_box().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,46 +28,6 @@ namespace {
 
 #define SPACE_DIM 2
 
-bool
-operator==(const Bounding_Box& x, const Bounding_Box& y) {
-  dimension_type dimension = x.space_dimension();
-  if (dimension != y.space_dimension())
-    return false;
-
-  if (x.is_empty() && y.is_empty())
-    return true;
-
-  if (x.is_empty() || y.is_empty())
-    return false;
-
-  TEMP_INTEGER(n_x);
-  TEMP_INTEGER(n_y);
-  TEMP_INTEGER(d_x);
-  TEMP_INTEGER(d_y);
-
-  for (dimension_type i = dimension; i-- > 0; ) {
-    bool tem;
-    bool x_closed = x.get_lower_bound(i, tem, n_x, d_x);
-    bool y_closed = y.get_lower_bound(i, tem, n_y, d_y);
-    if (x_closed == y_closed) {
-      if (x_closed && (n_x != n_y || d_x != d_y))
-	return false;
-    }
-    else
-      return false;
-    x_closed = x.get_upper_bound(i, tem, n_x, d_x);
-    y_closed = y.get_upper_bound(i, tem, n_y, d_y);
-    if (x_closed == y_closed) {
-      if (x_closed && (n_x != n_y || d_x != d_y))
-	return false;
-    }
-    else
-      return false;
-  }
-
-  return true;
-}
-
 // Rectilinear grid defined by points with the origin
 // not a point of the grid or a point of the covering box..
 bool
@@ -75,20 +35,20 @@ test01() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point(B));
-  gr.add_generator(grid_point(3*A + B));
-  gr.add_generator(grid_point(3*A + 3*B));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_point(3*A + B));
+  gr.add_grid_generator(grid_point(3*A + 3*B));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 3, 1);
-  known_box.raise_lower_bound(1, true, 1, 1);
-  known_box.lower_upper_bound(1, true, 3, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 3);
+  known_box.add_constraint(B >= 1);
+  known_box.add_constraint(B <= 3);
 
   bool ok = (box1 == known_box);
 
@@ -97,7 +57,7 @@ test01() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -114,20 +74,20 @@ test02() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point(  A +   B));
-  gr.add_generator(grid_point(2*A + 3*B));
-  gr.add_generator(grid_point(  A + 4*B));
+  gr.add_grid_generator(grid_point(  A +   B));
+  gr.add_grid_generator(grid_point(2*A + 3*B));
+  gr.add_grid_generator(grid_point(  A + 4*B));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 1);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(B <= 1);
 
   bool ok = (box1 == known_box);
 
@@ -136,7 +96,7 @@ test02() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -153,20 +113,20 @@ test03() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(2*A));
-  gr.add_generator(grid_point(  A + 2*B, 2));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point(  A + 2*B, 2));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 2);
-  known_box.lower_upper_bound(0, true, 1, 2);
-  known_box.raise_lower_bound(1, true, 0, 2);
-  known_box.lower_upper_bound(1, true, 2, 2);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(2*A >= 0);
+  known_box.add_constraint(2*A <= 1);
+  known_box.add_constraint(2*B >= 0);
+  known_box.add_constraint(2*B <= 2);
 
   bool ok = (box1 == known_box);
 
@@ -175,7 +135,7 @@ test03() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -196,22 +156,20 @@ test04() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_line(A + 2*B));
-  gr.add_generator(grid_point(C, 2));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A + 2*B));
+  gr.add_grid_generator(grid_point(C, 2));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 0, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 0, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 1, 2);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A == 0);
+  known_box.add_constraint(B == 0);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(2*C <= 1);
 
   bool ok = (box1 == known_box);
 
@@ -220,7 +178,7 @@ test04() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -234,19 +192,20 @@ test04() {
 // Universe grid.
 bool
 test05() {
-  Bounding_Box box1(SPACE_DIM);
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM);
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 0, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 0, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 0, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A == 0);
+  known_box.add_constraint(B == 0);
+  known_box.add_constraint(C == 0);
 
   bool ok = (box1 == known_box);
 
@@ -255,7 +214,7 @@ test05() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -273,17 +232,17 @@ test06() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point(16*A + 6*B - 6*C, 7));
+  gr.add_grid_generator(grid_point(16*A + 6*B - 6*C, 7));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 16, 7);
-  known_box.raise_lower_bound(1, true, 6, 7);
-  known_box.raise_lower_bound(2, true, -6, 7);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(7*A >= 16);
+  known_box.add_constraint(7*B >= 6);
+  known_box.add_constraint(7*C >= -6);
 
   bool ok = (box1 == known_box);
 
@@ -292,7 +251,7 @@ test06() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -306,17 +265,21 @@ test06() {
 // Empty grid.
 bool
 test07() {
-  Bounding_Box box1(SPACE_DIM);
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Rational_Box box1(SPACE_DIM);
   // Set bounds, to check that get_covering_box clears them.
-  box1.raise_lower_bound(0, true, 16, 7);
-  box1.raise_lower_bound(1, true, 6, 7);
-  box1.raise_lower_bound(2, true, -6, 7);
+  box1.add_constraint(7*A >= 16);
+  box1.add_constraint(7*B >= 6);
+  box1.add_constraint(7*C >= -6);
 
   Grid gr(SPACE_DIM, EMPTY);
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
+  Rational_Box known_box(SPACE_DIM);
   known_box.set_empty();
 
   bool ok = (box1 == known_box);
@@ -327,11 +290,11 @@ test07() {
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
 
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     // Set bounds, to check that get_covering_box clears them.
-    box2.raise_lower_bound(0, true, 1, 3);
-    box2.raise_lower_bound(1, true, 2, 2);
-    box2.raise_lower_bound(2, true, 3, 1);
+    box2.add_constraint(3*A >= 1);
+    box2.add_constraint(2*B >= 2);
+    box2.add_constraint(C >= 3);
 
     tem_gr.get_covering_box(box2);
 
@@ -350,24 +313,24 @@ test08() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A + B));
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(2*A));
-  gr.add_generator(grid_point(C));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point(C));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 1, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 1);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(B <= 1);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(C <= 1);
 
   bool ok = (box1 == known_box);
 
@@ -376,7 +339,7 @@ test08() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -394,7 +357,7 @@ test09() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM);
   gr.add_congruence((A + 2*B %= 0) / 2);
@@ -402,13 +365,13 @@ test09() {
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 5, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 2);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 0, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 5);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(2*B <= 1);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(C <= 0);
 
   bool ok = (box1 == known_box);
 
@@ -417,7 +380,7 @@ test09() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -435,23 +398,22 @@ test10() {
   Variable B(1);
   Variable C(2);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(B));
-  gr.add_generator(grid_line(C));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 0, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 1);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(B <= 1);
+  known_box.add_constraint(C == 0);
 
   bool ok = (box1 == known_box);
 
@@ -460,7 +422,7 @@ test10() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -484,26 +446,26 @@ test11() {
   Variable C(2);
   Variable D(3);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A + 2*D));
-  gr.add_generator(grid_point(B + 4*D));
-  gr.add_generator(grid_point(C + 8*D));
-  gr.add_generator(grid_point(16*D));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A + 2*D));
+  gr.add_grid_generator(grid_point(B + 4*D));
+  gr.add_grid_generator(grid_point(C + 8*D));
+  gr.add_grid_generator(grid_point(16*D));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 1, 1);
-  known_box.raise_lower_bound(3, true, 0, 1);
-  known_box.lower_upper_bound(3, true, 2, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 1);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(B <= 1);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(C <= 1);
+  known_box.add_constraint(D >= 0);
+  known_box.add_constraint(D <= 2);
 
   bool ok = (box1 == known_box);
 
@@ -513,7 +475,7 @@ test11() {
   if (ok) {
 
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -533,24 +495,24 @@ test12() {
   Variable C(2);
   Variable D(3);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(C));
-  gr.add_generator(grid_point(D));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(C));
+  gr.add_grid_generator(grid_point(D));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 1, 1);
-  known_box.raise_lower_bound(3, true, 0, 1);
-  known_box.lower_upper_bound(3, true, 1, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 1);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(C <= 1);
+  known_box.add_constraint(D >= 0);
+  known_box.add_constraint(D <= 1);
 
   bool ok = (box1 == known_box);
 
@@ -559,7 +521,7 @@ test12() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -574,12 +536,14 @@ test12() {
 bool
 test13() {
   Variable A(0);
+  Variable B(1);
+  Variable C(2);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
   // Set bounds, to check that get_covering_box clears them.
-  box1.raise_lower_bound(0, true, 1, 7);
-  box1.raise_lower_bound(1, true, 2, 7);
-  box1.raise_lower_bound(2, true, 3, 7);
+  box1.add_constraint(7*A >= 1);
+  box1.add_constraint(7*B >= 2);
+  box1.add_constraint(7*C >= 3);
 
   Grid gr(SPACE_DIM);
   gr.add_congruence((A %= 0) / 2);
@@ -587,7 +551,7 @@ test13() {
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
+  Rational_Box known_box(SPACE_DIM);
   known_box.set_empty();
 
   bool ok = (box1 == known_box);
@@ -598,11 +562,11 @@ test13() {
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
 
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     // Set bounds, to check that get_covering_box clears them.
-    box2.raise_lower_bound(0, true, 3, 7);
-    box2.raise_lower_bound(1, true, 1, 7);
-    box2.raise_lower_bound(2, true, 2, 7);
+    box2.add_constraint(7*A >= 3);
+    box2.add_constraint(7*B >= 1);
+    box2.add_constraint(7*C >= 2);
 
     tem_gr.get_covering_box(box2);
 
@@ -622,19 +586,20 @@ test14() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
+  Variable D(3);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point(16*A + 14*B - 7*C, 7));
+  gr.add_grid_generator(grid_point(16*A + 14*B - 7*C, 7));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 16, 7);
-  known_box.raise_lower_bound(1, true, 2, 1);
-  known_box.raise_lower_bound(2, true, -1, 1);
-  known_box.raise_lower_bound(3, true, 0, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(7*A >= 16);
+  known_box.add_constraint(B >= 2);
+  known_box.add_constraint(C >= -1);
+  known_box.add_constraint(D >= 0);
 
   bool ok = (box1 == known_box);
 
@@ -643,7 +608,7 @@ test14() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -662,25 +627,26 @@ test15() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
+  Variable D(3);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A, 6));
-  gr.add_generator(grid_point(B, 3));
-  gr.add_generator(grid_point(C, 2));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A, 6));
+  gr.add_grid_generator(grid_point(B, 3));
+  gr.add_grid_generator(grid_point(C, 2));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 6);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 3);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 1, 2);
-  known_box.raise_lower_bound(3, true, 0, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(6*A <= 1);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(3*B <= 1);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(2*C <= 1);
+  known_box.add_constraint(D >= 0);
 
   bool ok = (box1 == known_box);
 
@@ -689,7 +655,7 @@ test15() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -706,13 +672,13 @@ test15() {
 // Zero dimension empty grid.
 bool
 test16() {
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
+  Rational_Box known_box(SPACE_DIM);
   known_box.set_empty();
 
   bool ok = (box1 == known_box);
@@ -722,7 +688,7 @@ test16() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -736,13 +702,13 @@ test16() {
 // Zero dimension universe grid.
 bool
 test17() {
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM);
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
+  Rational_Box known_box(SPACE_DIM);
 
   bool ok = (box1 == known_box);
 
@@ -751,7 +717,7 @@ test17() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -772,20 +738,20 @@ test18() {
   Variable A(0);
   Variable B(1);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point(B));
-  gr.add_generator(parameter(3*A));
-  gr.add_generator(parameter(3*A + 2*B));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(parameter(3*A));
+  gr.add_grid_generator(parameter(3*A + 2*B));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 3, 1);
-  known_box.raise_lower_bound(1, true, 1, 1);
-  known_box.lower_upper_bound(1, true, 3, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 3);
+  known_box.add_constraint(B >= 1);
+  known_box.add_constraint(B <= 3);
 
   bool ok = (box1 == known_box);
 
@@ -794,7 +760,7 @@ test18() {
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
@@ -814,40 +780,41 @@ test19() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
+  Variable D(3);
 
-  Bounding_Box box1(SPACE_DIM);
+  Rational_Box box1(SPACE_DIM);
 
   Grid gr(SPACE_DIM, EMPTY);
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(7*A));
-  gr.add_generator(parameter(5*B-3*A));
-  gr.add_generator(parameter(3*A));
-  gr.add_generator(grid_point(C+A));
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(7*A));
+  gr.add_grid_generator(parameter(5*B-3*A));
+  gr.add_grid_generator(parameter(3*A));
+  gr.add_grid_generator(grid_point(C+A));
 
   gr.get_covering_box(box1);
 
-  Bounding_Box known_box(SPACE_DIM);
-  known_box.raise_lower_bound(0, true, 1, 1);
-  known_box.lower_upper_bound(0, true, 4, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 5, 1);
-  known_box.raise_lower_bound(2, true, 0, 1);
-  known_box.lower_upper_bound(2, true, 1, 1);
-  known_box.raise_lower_bound(3, true, 0, 1);
+  Rational_Box known_box(SPACE_DIM);
+  known_box.add_constraint(A >= 1);
+  known_box.add_constraint(A <= 4);
+  known_box.add_constraint(B >= 0);
+  known_box.add_constraint(B <= 5);
+  known_box.add_constraint(C >= 0);
+  known_box.add_constraint(C <= 1);
+  known_box.add_constraint(D >= 0);
 
   bool ok = (box1 == known_box);
 
   print_generators(gr, "*** gr ***");
-  nout << "box1:" << endl << box1;
+  nout << "box1:" << endl << box1 << endl;
 
   if (ok) {
     Grid tem_gr(box1, From_Covering_Box());
-    Bounding_Box box2(SPACE_DIM);
+    Rational_Box box2(SPACE_DIM);
     tem_gr.get_covering_box(box2);
 
     ok = (box2 == known_box);
 
-    nout << "box2:" << endl << box2;
+    nout << "box2:" << endl << box2 << endl;
   }
 
   return ok;
diff --git a/tests/Grid/discrete1.cc b/tests/Grid/discrete1.cc
index 1154679..4800581 100644
--- a/tests/Grid/discrete1.cc
+++ b/tests/Grid/discrete1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::is_pointed().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -68,17 +68,17 @@ test04() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (gr_gs_min.is_discrete())
     && (gr_gs_needs_min.is_discrete())
@@ -99,12 +99,12 @@ test05() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
@@ -116,9 +116,8 @@ test05() {
   // Minimize the congruences.
   gr_cgs_min.minimized_congruences();
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
-  assert(copy_compare(gr_cgs_needs_min, gr_cgs_min));
+  // Grids gr_gs_min, gr_gs_needs_min, gr_cgs_needs_min and gr_cgs_min
+  // are the same grids.
 
   bool ok = (!gr_gs_min.is_discrete())
     && (!gr_gs_needs_min.is_discrete())
@@ -141,20 +140,20 @@ test06() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + B));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
   gr_cgs_needs_min.add_congruence(C == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (gr_gs_min.is_discrete())
     && (gr_gs_needs_min.is_discrete())
@@ -175,21 +174,21 @@ test07() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator(grid_point(3*A + B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (!gr_gs_min.is_discrete())
     && (!gr_gs_needs_min.is_discrete())
@@ -209,21 +208,21 @@ test08() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (gr_gs_min.is_discrete())
     && (gr_gs_needs_min.is_discrete())
@@ -244,23 +243,23 @@ test09() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator(grid_line(C));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_line(C));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (!gr_gs_min.is_discrete())
     && (!gr_gs_needs_min.is_discrete())
@@ -282,21 +281,21 @@ test10() {
   Variable D(3);
 
   Grid gr_gs_min(4, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(4, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(4);
   gr_cgs_needs_min.add_congruence(A == 0);
   gr_cgs_needs_min.add_congruence(D == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (!gr_gs_min.is_discrete())
     && (!gr_gs_needs_min.is_discrete())
@@ -318,7 +317,7 @@ test11() {
   gr.add_congruence(A == 1);
   gr.add_congruence(A == 2);
 
-  bool ok (gr.is_discrete());
+  bool ok = (gr.is_discrete());
 
   print_congruences(gr, "*** gr ***");
 
diff --git a/tests/Grid/disjoint1.cc b/tests/Grid/disjoint1.cc
index c1eaf1d..c13ce9e 100644
--- a/tests/Grid/disjoint1.cc
+++ b/tests/Grid/disjoint1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::is_disjoint_from().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -122,10 +122,10 @@ test06() {
   gr1.add_congruence((C %= 0) / 2);
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(C));
-  gr2.add_generator(grid_line(A + B));
-  gr2.add_generator(grid_point(C + B));
-  gr2.add_generator(grid_point(3*C));
+  gr2.add_grid_generator(grid_point(C));
+  gr2.add_grid_generator(grid_line(A + B));
+  gr2.add_grid_generator(grid_point(C + B));
+  gr2.add_grid_generator(grid_point(3*C));
 
   bool ok = (gr1.is_disjoint_from(gr2));
   print_congruences(gr1, "*** gr1 ***");
@@ -142,8 +142,8 @@ test07() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(A + B + C));
-  gr1.add_generator(grid_point(3*A + 3*B + 3*C));
+  gr1.add_grid_generator(grid_point(A + B + C));
+  gr1.add_grid_generator(grid_point(3*A + 3*B + 3*C));
 
   Grid gr2(3);
   gr2.add_congruence(A - B %= 0);
@@ -164,8 +164,8 @@ test08() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(A + B + C));
-  gr1.add_generator(grid_line(3*A + 3*B + 3*C));
+  gr1.add_grid_generator(grid_point(A + B + C));
+  gr1.add_grid_generator(grid_line(3*A + 3*B + 3*C));
 
   Grid gr2(3);
   gr2.add_congruence(A - B %= 0);
@@ -184,12 +184,12 @@ test09() {
   Variable A(0);
 
   Grid gr1(1, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.minimized_generators();
+  gr1.add_grid_generator(grid_point());
+  gr1.minimized_grid_generators();
 
   Grid gr2(1, EMPTY);
-  gr2.add_generator(grid_point(A));
-  gr2.minimized_generators();
+  gr2.add_grid_generator(grid_point(A));
+  gr2.minimized_grid_generators();
 
   bool ok = (gr1.is_disjoint_from(gr2));
   print_congruences(gr2, "*** gr2 ***");
@@ -202,7 +202,7 @@ test09() {
 bool
 test10() {
   Grid gr1(1, EMPTY);
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
 
   Grid gr2(19, EMPTY);
 
@@ -211,11 +211,30 @@ test10() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+// Both empty and both not in minimal form.
+bool
+test11() {
+  Variable A(0);
+  Grid gr1(1);
+  gr1.add_congruence((A %= 1) / 2);
+  gr1.add_congruence((A %= 0) / 2);
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
 }
 
 } // namespace
@@ -231,4 +250,5 @@ BEGIN_MAIN
   DO_TEST(test08);
   DO_TEST(test09);
   DO_TEST(test10);
+  DO_TEST(test11);
 END_MAIN
diff --git a/tests/Grid/equals1.cc b/tests/Grid/equals1.cc
index 42862ed..781892b 100644
--- a/tests/Grid/equals1.cc
+++ b/tests/Grid/equals1.cc
@@ -1,12 +1,12 @@
 /* Test operator==(const Grid&, const Grid&)
    and operator!=(const Grid&, const Grid&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,7 +25,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace {
 
-// Grids the same, gr defined by generatorss and known_gr by congruences.
+// Grids the same, gr defined by generators and known_gr by congruences.
 bool
 test01() {
   Variable A(0);
@@ -165,15 +165,15 @@ test06() {
   Variable A(0);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
 
-  gr1.minimized_generators();
+  gr1.minimized_grid_generators();
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point());
-  gr2.add_generator(grid_line(A));
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_line(A));
 
-  gr2.minimized_generators();
+  gr2.minimized_grid_generators();
 
   bool ok = (gr1 != gr2);
   print_congruences(gr1, "*** gr1 ***");
@@ -190,16 +190,16 @@ test07() {
   Variable B(1);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(parameter(B));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(B));
 
-  gr1.minimized_generators();
+  gr1.minimized_grid_generators();
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point());
-  gr2.add_generator(grid_line(A));
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_line(A));
 
-  gr2.minimized_generators();
+  gr2.minimized_grid_generators();
 
   bool ok = (gr1 != gr2);
   print_congruences(gr1, "*** gr1 ***");
@@ -217,20 +217,20 @@ test08() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(parameter(A));
-  gr1.add_generator(parameter(B));
-  gr1.add_generator(parameter(C));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A));
+  gr1.add_grid_generator(parameter(B));
+  gr1.add_grid_generator(parameter(C));
 
-  gr1.minimized_generators();
+  gr1.minimized_grid_generators();
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point());
-  gr2.add_generator(parameter(2*A));
-  gr2.add_generator(parameter(2*B));
-  gr2.add_generator(parameter(2*C));
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(2*A));
+  gr2.add_grid_generator(parameter(2*B));
+  gr2.add_grid_generator(parameter(2*C));
 
-  gr2.minimized_generators();
+  gr2.minimized_grid_generators();
 
   bool ok = (gr1 != gr2);
   print_congruences(gr1, "*** gr1 ***");
@@ -239,6 +239,37 @@ test08() {
   return ok;
 }
 
+// No equalities and no lines, number of congruences and generators
+// are the same. But the generators are syntactically the same.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A));
+  gr1.add_grid_generator(parameter(B));
+  gr1.add_grid_generator(parameter(C));
+
+  gr1.minimized_grid_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A));
+  gr2.add_grid_generator(parameter(B));
+  gr2.add_grid_generator(parameter(C));
+
+  gr2.minimized_grid_generators();
+
+  bool ok = (gr1 == gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -250,4 +281,5 @@ BEGIN_MAIN
   DO_TEST(test06);
   DO_TEST(test07);
   DO_TEST(test08);
+  DO_TEST(test09);
 END_MAIN
diff --git a/tests/Grid/expandspacedim1.cc b/tests/Grid/expandspacedim1.cc
index fc1f423..56a416c 100644
--- a/tests/Grid/expandspacedim1.cc
+++ b/tests/Grid/expandspacedim1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::expand_space_dimension().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -90,18 +90,18 @@ test04() {
   Variable C(2);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(A + 2*B));
-  gr.add_generator(grid_point());
-  print_generators(gr, "***  ***");
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(A + 2*B));
+  gr.add_grid_generator(grid_point());
+  print_generators(gr, "*** gr ***");
 
   gr.expand_space_dimension(A, 1);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(A + 2*B));
-  known_gr.add_generator(grid_point(C));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(A + 2*B));
+  known_gr.add_grid_generator(grid_point(C));
 
   bool ok = (gr == known_gr);
   print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
@@ -197,11 +197,11 @@ test08() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Add more dimensions than are available.
@@ -216,11 +216,11 @@ test09() {
   }
   catch (const std::length_error& e) {
     nout << "length_error: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/foldspacedims1.cc b/tests/Grid/foldspacedims1.cc
index a244896..490277a 100644
--- a/tests/Grid/foldspacedims1.cc
+++ b/tests/Grid/foldspacedims1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::fold_space_dimensions().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -125,9 +125,9 @@ test05() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(A + 2*B + 2*C));
-  gr.add_generator(grid_point(A + 2*B + 4*C));
-  gr.add_generator(grid_point(A + 6*B + 2*C));
+  gr.add_grid_generator(grid_point(A + 2*B + 2*C));
+  gr.add_grid_generator(grid_point(A + 2*B + 4*C));
+  gr.add_grid_generator(grid_point(A + 6*B + 2*C));
   print_generators(gr, "*** gr ***");
 
   Variables_Set to_fold;
@@ -136,8 +136,8 @@ test05() {
   gr.fold_space_dimensions(to_fold, B);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(A + 2*B));
-  known_gr.add_generator(grid_point(A + 4*B));
+  known_gr.add_grid_generator(grid_point(A + 2*B));
+  known_gr.add_grid_generator(grid_point(A + 4*B));
 
   bool ok = (gr == known_gr);
   print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
@@ -311,7 +311,7 @@ test11() {
   return ok;
 }
 
-// Second parameer of greater dimension than grid.
+// Second parameter of greater dimension than grid.
 bool
 test12() {
   Variable A(0);
@@ -327,11 +327,11 @@ test12() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Highest variable in set of greater dimension than grid.
@@ -349,11 +349,11 @@ test13() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Dimension of highest variable in set greater than dimension of
@@ -373,11 +373,11 @@ test14() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/frombdshape1.cc b/tests/Grid/frombdshape1.cc
new file mode 100644
index 0000000..c336c29
--- /dev/null
+++ b/tests/Grid/frombdshape1.cc
@@ -0,0 +1,53 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B == 5);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TBD_Shape bd(cs);
+
+  Grid gr(bd);
+
+  Grid known_result(cs);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/fromgrid1.cc b/tests/Grid/fromgrid1.cc
new file mode 100644
index 0000000..49858ae
--- /dev/null
+++ b/tests/Grid/fromgrid1.cc
@@ -0,0 +1,101 @@
+/* Test copy construction and assignment for grids.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Assignment for universe and empty grids of the first ten dimensions.
+
+bool
+test01() {
+  bool ok = true;
+  for (unsigned int dim = 0; dim < 10; ++dim) {
+
+    nout << "dimension: " << dim << endl;
+    // Universe.
+    Grid gr(dim);
+    print_congruences(gr, "*** gr ***");
+
+    Grid gr_copy(0);
+    gr_copy = gr;
+
+    Grid known_gr(dim);
+    ok &= (gr_copy == known_gr);
+    print_congruences(gr_copy, "*** gr_copy ***");
+
+    if (ok) {
+      // Empty.
+      gr = Grid(dim, EMPTY);
+      print_generators(gr, "*** gr ***");
+
+      Grid gr_copy(0);
+      gr_copy = gr;
+
+      Grid known_gr(dim, EMPTY);
+      ok &= (gr_copy == known_gr);
+      print_generators(gr_copy, "*** gr_copy ***");
+    }
+  };
+
+  return ok;
+}
+
+// Copy construct for universe and empty grids of the first ten dimensions.
+bool
+test02() {
+  bool ok = true;
+  for (unsigned int dim = 0; dim < 10; ++dim) {
+
+    nout << "dimension: " << dim << endl;
+    // Universe.
+    Grid gr(dim);
+    print_congruences(gr, "*** gr ***");
+
+    Grid gr_copy(gr);
+
+    Grid known_gr(dim);
+    ok &= (gr_copy == known_gr);
+    print_congruences(gr_copy, "*** gr_copy ***");
+
+    if (ok) {
+      // Empty.
+      gr = Grid(dim, EMPTY);
+      print_generators(gr, "*** gr ***");
+
+      Grid gr_copy(gr);
+
+      Grid known_gr(dim, EMPTY);
+      ok &= (gr_copy == known_gr);
+      print_generators(gr_copy, "*** gr_copy ***");
+    }
+  };
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/fromoctagonalshape1.cc b/tests/Grid/fromoctagonalshape1.cc
new file mode 100644
index 0000000..1af6986
--- /dev/null
+++ b/tests/Grid/fromoctagonalshape1.cc
@@ -0,0 +1,53 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B == 5);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TOctagonal_Shape os(cs);
+
+  Grid gr(os);
+
+  Grid known_result(cs);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/frompolyhedron1.cc b/tests/Grid/frompolyhedron1.cc
new file mode 100644
index 0000000..25d6c89
--- /dev/null
+++ b/tests/Grid/frompolyhedron1.cc
@@ -0,0 +1,342 @@
+/* Test construction of grids from polyhedron.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(ph) - non-empty polyhedron
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  NNC_Polyhedron ph(cs);
+  Grid gr(ph);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - empty polyhedron
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(B >= 1);
+  cs.insert(C > 0);
+
+  NNC_Polyhedron ph(cs);
+  Grid gr(ph);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - zero dimension universe polyhedron
+bool
+test03() {
+
+  NNC_Polyhedron ph(0);
+  Grid gr(ph);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - zero dimension empty polyhedron
+bool
+test04() {
+
+  NNC_Polyhedron ph(0, EMPTY);
+  Grid gr(ph);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - non-empty polyhedron constructed from generators
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B, 3));
+  cs.insert(ray(A - C));
+  cs.insert(point());
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(A - B + C == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from generators */
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B, 3));
+  cs.insert(line(A - C));
+  cs.insert(point(3 * C, 2));
+
+  C_Polyhedron ph(cs);
+
+  Grid gr(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  Grid known_gr(3);
+  known_gr.add_congruence(2*A + 7*B + 2*C == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  print_congruences(known_gr, "*** known_gr(ph) ***");
+  print_generators(known_gr, "*** known_gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - universe grid built from
+   non-universe C_polyhedron constructed from generators */
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B, 3));
+  cs.insert(point(3 * A, 2));
+  cs.insert(point(B, 7));
+  cs.insert(point(5 * C));
+
+  C_Polyhedron ph(cs);
+
+  Grid gr(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - universe polyhedron
+bool
+test08() {
+
+  NNC_Polyhedron ph(5);
+  Grid gr(ph);
+
+  Grid known_gr(5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from generators; The complexity
+   limit allows the detection of implicit equalities from
+   any generator system*/
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B));
+  cs.insert(line(A - C));
+  cs.insert(point(3 * C));
+
+  C_Polyhedron ph(cs);
+
+  Grid gr(ph, POLYNOMIAL_COMPLEXITY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Grid known_gr(3);
+  known_gr.add_congruence(A + 2*B + C == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  print_congruences(known_gr, "*** known_gr(ph) ***");
+  print_generators(known_gr, "*** known_gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from constraints; The complexity
+   is unlimited so it is able to detect the implicit equality */
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph, ANY_COMPLEXITY);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from constraints; The complexity
+   is limited to be polynomial so it is unable to detect the
+   implicit equality */
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph, POLYNOMIAL_COMPLEXITY);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from constraints; The complexity
+   is limited to that of simplex so it is unable to detect the
+   implicit equality */
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph, SIMPLEX_COMPLEXITY);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST_F8(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage1.cc b/tests/Grid/generalizedaffineimage1.cc
index 292fbb2..e86fe28 100644
--- a/tests/Grid/generalizedaffineimage1.cc
+++ b/tests/Grid/generalizedaffineimage1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::generalized_affine_image(var, ...).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,16 +34,16 @@ test01() {
   gr.add_congruence(A %= 0);
   gr.add_congruence((B %= 0) / 2);
 
-  gr.generalized_affine_image(B, Linear_Expression::zero(), 1, 0);
+  gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 1, 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-    "*** gr.generalized_affine_image(B, Linear_Expression::zero(), 1, 0) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 1, 0) ***");
 
   return ok;
 }
@@ -60,17 +60,17 @@ test02() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(B, Linear_Expression::zero(), 2);
+  gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 2, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-    "*** gr.generalized_affine_image(B, Linear_Expression::zero(), 2) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 2, 1) ***");
 
   return ok;
 }
@@ -87,17 +87,17 @@ test03() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(B, A + 1);
+  gr.generalized_affine_image(B, EQUAL, A + 1, 1, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A - B));
-  known_gr.add_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A - B));
+  known_gr.add_grid_generator(grid_point(B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(B, A + 1) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, A + 1, 1, 1) ***");
 
   return ok;
 }
@@ -114,17 +114,17 @@ test04() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(B, A + 1, 2);
+  gr.generalized_affine_image(B, EQUAL, A + 1, 2, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(B, 2));
-  known_gr.add_generator(grid_point(B + A));
-  known_gr.add_generator(grid_point(3*B, 2));
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(B + A));
+  known_gr.add_grid_generator(grid_point(3*B, 2));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(B, A + 1, 2) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, A + 1, 2, 1) ***");
 
   return ok;
 }
@@ -141,17 +141,17 @@ test05() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(B, A + 1, 2, 3);
+  gr.generalized_affine_image(B, EQUAL, A + 1, 2, 3);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(B, 2));
-  known_gr.add_generator(grid_point(A + B));
-  known_gr.add_generator(grid_point(7*B, 2));
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(7*B, 2));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(B, A + 1, 2, 3) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, A + 1, 2, 3) ***");
 
   return ok;
 }
@@ -168,17 +168,17 @@ test06() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(B, A + 2, -2);
+  gr.generalized_affine_image(B, EQUAL, A + 2, -2, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-B));
-  known_gr.add_generator(grid_point(-3*B + 2*A, 2));
-  known_gr.add_generator(grid_point(-2*B));
+  known_gr.add_grid_generator(grid_point(-B));
+  known_gr.add_grid_generator(grid_point(-3*B + 2*A, 2));
+  known_gr.add_grid_generator(grid_point(-2*B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(B, A + 2, -2) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, A + 2, -2, 1) ***");
 
   return ok;
 }
@@ -195,17 +195,17 @@ test07() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(B, A + 2, 1, -7);
+  gr.generalized_affine_image(B, EQUAL, A + 2, 1, -7);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(2*B));
-  known_gr.add_generator(grid_point(A + 3*B));
-  known_gr.add_generator(grid_point(9*B));
+  known_gr.add_grid_generator(grid_point(2*B));
+  known_gr.add_grid_generator(grid_point(A + 3*B));
+  known_gr.add_grid_generator(grid_point(9*B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(B, A + 2, 1, -7) ***");
+		    "*** gr.generalized_affine_image(B, EQUAL, A + 2, 1, -7) ***");
 
   return ok;
 }
@@ -223,19 +223,19 @@ test08() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A, A - C + 2, 1, 5);
+  gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 5);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(2*A));
-  known_gr.add_generator(grid_point(2*A + 3*B));
-  known_gr.add_generator(grid_line(A + C));
-  known_gr.add_generator(grid_point(4*A));  // Original modulus.
-  known_gr.add_generator(grid_point(7*A));  // Transformation modulus.
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + 3*B));
+  known_gr.add_grid_generator(grid_line(A + C));
+  known_gr.add_grid_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_grid_generator(grid_point(7*A));  // Transformation modulus.
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A, A - C + 2, 1, 5) ***");
+		    "*** gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 5) ***");
 
   return ok;
 }
@@ -254,7 +254,7 @@ test09() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A, A - C + 2, 1, 0);
+  gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 0);
 
   Grid known_gr = Grid(3);
   known_gr.add_congruence((B %= 0) / 3);
@@ -265,7 +265,7 @@ test09() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A, A - C + 2, 1, 0) ***");
+		    "*** gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 0) ***");
 
   return ok;
 }
@@ -281,14 +281,14 @@ test10() {
 
   print_generators(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A, A - 2*C + 3, 4, 7);
+  gr.generalized_affine_image(A, EQUAL, A - 2*C + 3, 4, 7);
 
   Grid known_gr(5, EMPTY);
 
   bool ok = (gr == known_gr);
 
   print_generators(gr,
-        "*** gr.generalized_affine_image(A, A - 2*C + 3, 4, 7) ***");
+		   "*** gr.generalized_affine_image(A, EQUAL, A - 2*C + 3, 4, 7) ***");
 
   return ok;
 }
@@ -304,14 +304,14 @@ test11() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A, A + 2);
+  gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1);
 
   Grid known_gr(1, EMPTY);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A, A + 2) ***");
+		    "*** gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1) ***");
 
   return ok;
 }
@@ -325,14 +325,14 @@ test12() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A, A + 2);
+  gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1);
 
   Grid known_gr(1);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A, A + 2) ***");
+		    "*** gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1) ***");
 
   return ok;
 }
@@ -349,15 +349,15 @@ test13() {
   gr.add_congruence((A ==  0) / 0);
 
   try {
-    gr.generalized_affine_image(B, A + 2, 0);
+    gr.generalized_affine_image(B, EQUAL, A + 2, 0, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expression of a greater space dimension than the grid.
@@ -373,15 +373,15 @@ test14() {
   gr.add_congruence((A ==  0) / 0);
 
   try {
-    gr.generalized_affine_image(B, D + 2);
+    gr.generalized_affine_image(B, EQUAL, D + 2, 1, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Variable of a greater space dimension than the grid.
@@ -397,15 +397,15 @@ test15() {
   gr.add_congruence((A ==  0) / 0);
 
   try {
-    gr.generalized_affine_image(D, A + 2);
+    gr.generalized_affine_image(D, EQUAL, A + 2, 1, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expressions having common variables.
@@ -421,14 +421,14 @@ test16() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A - B + C, 2*A - B - C, 5);
+  gr.generalized_affine_image(A - B + C, EQUAL, 2*A - B - C, 5);
 
   Grid known_gr(3);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A - B + C, 2*A - B - C, 5) ***");
+		    "*** gr.generalized_affine_image(A - B + C, EQUAL, 2*A - B - C, 5) ***");
 
   return ok;
 }
@@ -445,7 +445,7 @@ test17() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A - B, 2*A - 2*B, 5);
+  gr.generalized_affine_image(A - B, EQUAL, 2*A - 2*B, 5);
 
   Grid known_gr(2);
   known_gr.add_congruence((A - B %= 0) / 5);
@@ -453,7 +453,7 @@ test17() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A - B, 2*A - 2*B, 5) ***");
+		    "*** gr.generalized_affine_image(A - B, EQUAL, 2*A - 2*B, 5) ***");
 
   return ok;
 }
@@ -469,7 +469,7 @@ test18() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(2*A - 2*B, A - B, 5);
+  gr.generalized_affine_image(2*A - 2*B, EQUAL, A - B, 5);
 
   Grid known_gr(2);
   known_gr.add_congruence((2*A - 2*B %= 0) / 5);
@@ -477,7 +477,7 @@ test18() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(2*A - 2*B, A - B, 5) ***");
+		    "*** gr.generalized_affine_image(2*A - 2*B, EQUAL, A - B, 5) ***");
 
   return ok;
 }
@@ -495,15 +495,15 @@ test19() {
   gr.add_congruence(C %= -2);
 
   try {
-    gr.generalized_affine_image(B + C, D + 2);
+    gr.generalized_affine_image(B + C, EQUAL, D + 2, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Left hand side expression of space dimension greater than the grid.
@@ -518,15 +518,15 @@ test20() {
   gr.add_congruence((C == -2) / 0);
 
   try {
-    gr.generalized_affine_image(A + D, A + 2);
+    gr.generalized_affine_image(A + D, EQUAL, A + 2, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/generalizedaffineimage2.cc b/tests/Grid/generalizedaffineimage2.cc
index 9ec43d3..3faa6d9 100644
--- a/tests/Grid/generalizedaffineimage2.cc
+++ b/tests/Grid/generalizedaffineimage2.cc
@@ -1,11 +1,11 @@
 /* Test Grid::generalized_affine_image(lhs, rhs, modulus).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,16 +39,16 @@ test01() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0);
+  gr.generalized_affine_image(1*B, EQUAL, Linear_Expression::zero(), 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-   "*** gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0) ***");
+		    "*** gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0) ***");
 
   return ok;
 }
@@ -65,17 +65,17 @@ test02() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(2*B, Linear_Expression::zero());
+  gr.generalized_affine_image(2*B, EQUAL, Linear_Expression::zero(), 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B, 2));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-    "*** gr.generalized_affine_image(2*B, Linear_Expression::zero()) ***");
+		    "*** gr.generalized_affine_image(2*B, Linear_Expression::zero()) ***");
 
   return ok;
 }
@@ -92,17 +92,16 @@ test03() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*B, A + 1);
+  gr.generalized_affine_image(1*B, EQUAL, A + 1, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A - B));
-  known_gr.add_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A - B));
+  known_gr.add_grid_generator(grid_point(B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(1*B, A + 1) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(1*B, A + 1) ***");
 
   return ok;
 }
@@ -119,17 +118,16 @@ test04() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(2*B, A + 1);
+  gr.generalized_affine_image(2*B, EQUAL, A + 1, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B, 2));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(2*B, A + 1) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1) ***");
 
   return ok;
 }
@@ -146,17 +144,16 @@ test05() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(2*B, A + 1, 3);
+  gr.generalized_affine_image(2*B, EQUAL, A + 1, 3);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(B, 2));
-  known_gr.add_generator(grid_point(A + B));
-  known_gr.add_generator(grid_point(2*B));
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(2*B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
 
   return ok;
 }
@@ -173,17 +170,16 @@ test06() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(2*B, A + 1, 3);
+  gr.generalized_affine_image(2*B, EQUAL, A + 1, 3);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(B, 2));
-  known_gr.add_generator(grid_point(A + B));
-  known_gr.add_generator(grid_point(2*B));
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(2*B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
 
   return ok;
 }
@@ -200,17 +196,16 @@ test07() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(-2*B, A + 2);
+  gr.generalized_affine_image(-2*B, EQUAL, A + 2, 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-B, 2));
-  known_gr.add_generator(grid_point(2*A + -3*B, 2));
-  known_gr.add_generator(grid_point(-B));
+  known_gr.add_grid_generator(grid_point(-B, 2));
+  known_gr.add_grid_generator(grid_point(2*A + -3*B, 2));
+  known_gr.add_grid_generator(grid_point(-B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(-2*B, A + 2) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(-2*B, A + 2) ***");
 
   return ok;
 }
@@ -227,17 +222,16 @@ test08() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*B, A + 2, -7);
+  gr.generalized_affine_image(1*B, EQUAL, A + 2, -7);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(2*B));
-  known_gr.add_generator(grid_point(A + 3*B));
-  known_gr.add_generator(grid_point(9*B));
+  known_gr.add_grid_generator(grid_point(2*B));
+  known_gr.add_grid_generator(grid_point(A + 3*B));
+  known_gr.add_grid_generator(grid_point(9*B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(1*B, A + 2, -7) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(1*B, A + 2, -7) ***");
 
   return ok;
 }
@@ -255,19 +249,19 @@ test09() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*A, A - C + 2, 5);
+  gr.generalized_affine_image(1*A, EQUAL, A - C + 2, 5);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(2*A));
-  known_gr.add_generator(grid_point(2*A + 3*B));
-  known_gr.add_generator(grid_line(A + C));
-  known_gr.add_generator(grid_point(4*A));  // Original modulus.
-  known_gr.add_generator(grid_point(7*A));  // Transformation modulus.
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + 3*B));
+  known_gr.add_grid_generator(grid_line(A + C));
+  known_gr.add_grid_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_grid_generator(grid_point(7*A));  // Transformation modulus.
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(1*A, A - C + 2, 5) ***");
+		    "*** gr.generalized_affine_image(1*A, A - C + 2, 5) ***");
 
   return ok;
 }
@@ -285,7 +279,7 @@ test10() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*A, A - C + 2, 0);
+  gr.generalized_affine_image(1*A, EQUAL, A - C + 2, 0);
 
   Grid known_gr = Grid(3);
   known_gr.add_congruence((B %= 0) / 3);
@@ -296,7 +290,7 @@ test10() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(1*A, A - C + 2, 0) ***");
+		    "*** gr.generalized_affine_image(1*A, A - C + 2, 0) ***");
 
   return ok;
 }
@@ -312,14 +306,13 @@ test11() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(4*A, A - 2*C + 3, 7);
+  gr.generalized_affine_image(4*A, EQUAL, A - 2*C + 3, 7);
 
   Grid known_gr(5, EMPTY);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(1*A, A + 2) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
 
   return ok;
 }
@@ -335,14 +328,13 @@ test12() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*A, A + 2);
+  gr.generalized_affine_image(1*A, EQUAL, A + 2, 1);
 
   Grid known_gr(1, EMPTY);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(1*A, A + 2) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
 
   return ok;
 }
@@ -356,14 +348,13 @@ test13() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(1*A, A + 2);
+  gr.generalized_affine_image(1*A, EQUAL, A + 2, 1);
 
   Grid known_gr(1);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "*** gr.generalized_affine_image(1*A, A + 2) ***");
+  print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
 
   return ok;
 }
@@ -379,18 +370,18 @@ test14() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(Linear_Expression::zero(),
-			      Linear_Expression(1));
+  gr.generalized_affine_image(Linear_Expression::zero(), EQUAL,
+			      Linear_Expression(1), 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-    "*** gr.generalized_affine_image(Linear_Expression::zero(), Linear_Expression(1)) ***");
+		    "*** gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, Linear_Expression(1), 1) ***");
 
   return ok;
 }
@@ -406,17 +397,17 @@ test15() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(Linear_Expression::zero(), A - B, 5);
+  gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, A - B, 5);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A + B));
-  known_gr.add_generator(grid_point(5*A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(5*A));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-   "*** gr.generalized_affine_image(Linear_Expression::zero(), A - B, 5) ***");
+		    "*** gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, A - B, 5) ***");
 
   return ok;
 }
@@ -434,18 +425,18 @@ test16() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A - B, C);
+  gr.generalized_affine_image(A - B, EQUAL, C, 1);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A + B));
-  known_gr.add_generator(grid_point(B));
-  known_gr.add_generator(grid_point(3*C));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A + B));
+  known_gr.add_grid_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point(3*C));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A - B, C) ***");
+		    "*** gr.generalized_affine_image(A - B, EQUAL, C, 1) ***");
 
   return ok;
 }
@@ -461,14 +452,14 @@ test17() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A - B, A, 0);
+  gr.generalized_affine_image(A - B, EQUAL, A);
 
   Grid known_gr(2);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A - B, A, 0) ***");
+		    "*** gr.generalized_affine_image(A - B, EQUAL, A) ***");
 
   return ok;
 }
@@ -485,17 +476,17 @@ test18() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A + 2*B, A - B, 3);
+  gr.generalized_affine_image(A + 2*B, EQUAL, A - B, 3);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(B, 2));
-  known_gr.add_generator(grid_line(2*A - B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_line(2*A - B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A + 2*B, A - B, 3) ***");
+		    "*** gr.generalized_affine_image(A + 2*B, EQUAL, A - B, 3) ***");
 
   return ok;
 }
@@ -514,7 +505,7 @@ test19() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_image(A - C, B + 3, 0);
+  gr.generalized_affine_image(A - C, EQUAL, B + 3, 0);
 
   Grid known_gr(3);
   known_gr.add_congruence(A - C == B + 3);
@@ -522,7 +513,7 @@ test19() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_image(A - C, B + 3, 0) ***");
+		    "*** gr.generalized_affine_image(A - C, EQUAL, B + 3, 0) ***");
 
   return ok;
 }
diff --git a/tests/Grid/generalizedaffineimage3.cc b/tests/Grid/generalizedaffineimage3.cc
new file mode 100644
index 0000000..c72fd41
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage3.cc
@@ -0,0 +1,376 @@
+/* Test Grid::generalized_affine_image(var, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.generalized_affine_image(B, LESS_OR_EQUAL, Linear_Expression::zero());
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_image(B, LESS_OR_EQUAL, Linear_Expression::zero()) ***");
+
+  return ok;
+}
+
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, GREATER_OR_EQUAL, A - 2*C + 3, 4);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+		   "*** gr.generalized_affine_image(A, GREATER_OR_EQUAL, A - 2*C + 3, 4) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, LESS_THAN, A + 2, 1, 0);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_image(A, LESS_THAN, A + 2, 1, 0) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, GREATER_OR_EQUAL, D + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(D, GREATER_OR_EQUAL, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The expression is not EQUAL and there is a non-zero modulus.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(A, GREATER_OR_EQUAL, A + 2, 1, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expressions having common variables.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_congruence(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B + C, GREATER_THAN, 2*A - B - C);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_image(A - B + C, GREATER_THAN, 2*A - B - C) ***");
+
+  return ok;
+}
+
+// Expressions where one variable is unaffected.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence(C == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, GREATER_THAN, 2*A - 2*B, 0);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_image(A - B, GREATER_THAN, 2*A - 2*B, 0) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_image(B + C, GREATER_THAN, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_image(A + D, GREATER_THAN, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Universe.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, GREATER_THAN, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_image(A, GREATER_THAN , A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// The relation is not EQUAL and there is a non-zero modulus.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_image(A + D, GREATER_THAN, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty with congruences.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A + B, LESS_THAN, A + 2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_image(A, LESS_THAN, A + 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage1.cc b/tests/Grid/generalizedaffinepreimage1.cc
index 5da113d..9dff169 100644
--- a/tests/Grid/generalizedaffinepreimage1.cc
+++ b/tests/Grid/generalizedaffinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::generalized_affine_preimage(var, ...).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,28 +39,26 @@ test01() {
   Grid gr2 = gr1;
 
   // Equality expression.
-  gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0);
+  gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr1 == known_gr);
 
-  print_congruences(gr1,
-    "*** gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0 ***");
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 0 ***");
 
   if (ok) {
     print_congruences(gr2, "*** gr2 ***");
 
     // Congruence expression.
-    gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 2);
+    gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 2);
     ok = (gr2 == known_gr);
   }
 
-  print_congruences(gr2,
-    "*** gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 2) ***");
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 2) ***");
 
   return ok;
 }
@@ -80,28 +78,26 @@ test02() {
   Grid gr2 = gr1;
 
   // Equality expression.
-  gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0);
+  gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr1 == known_gr);
 
-  print_congruences(gr1,
-    "*** gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0) ***");
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1) ***");
 
   if (ok) {
     print_congruences(gr2, "*** gr2 ***");
 
     // Congruence expression.
-    gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 3);
+    gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 3);
     ok = (gr2 == known_gr);
   }
 
-  print_congruences(gr2,
-    "*** gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 3) ***");
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 3) ***");
 
   return ok;
 }
@@ -121,30 +117,28 @@ test03() {
   Grid gr2 = gr1;
 
   // Equality expression.
-  gr1.generalized_affine_preimage(B, A + 1, 1, 0);
+  gr1.generalized_affine_preimage(B, EQUAL, A + 1, 1, 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-A));
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point(-A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr1 == known_gr);
 
-  print_congruences(gr1,
-        "*** gr1.generalized_affine_preimage(B, A + 1, 1, 0) ***");
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 1, 0) ***");
 
   if (ok) {
     print_congruences(gr2, "*** gr2 ***");
 
-    known_gr.add_generator(grid_point());
+    known_gr.add_grid_generator(grid_point());
 
     // Congruence expression.
-    gr2.generalized_affine_preimage(B, A + 1, 1, -7);
+    gr2.generalized_affine_preimage(B, EQUAL, A + 1, 1, -7);
     ok = (gr2 == known_gr);
   }
 
-  print_congruences(gr2,
-    "*** gr2.generalized_affine_preimage(B, A + 1, 1, -7) ***");
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 1, 1, -7) ***");
 
   return ok;
 }
@@ -164,30 +158,28 @@ test04() {
   Grid gr2 = gr1;
 
   // Equality expression.
-  gr1.generalized_affine_preimage(B, A + 1, 2, 0);
+  gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-3*A));
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point(-3*A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr1 == known_gr);
 
-  print_congruences(gr1,
-        "*** gr1.generalized_affine_preimage(B, A + 1, 2, 0) ***");
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0) ***");
 
   if (ok) {
     print_congruences(gr2, "*** gr2 ***");
 
-    known_gr.add_generator(grid_point(-A));
+    known_gr.add_grid_generator(grid_point(-A));
 
     // Congruence expression.
-    gr2.generalized_affine_preimage(B, A + 1, 2, 3);
+    gr2.generalized_affine_preimage(B, EQUAL, A + 1, 2, 3);
     ok = (gr2 == known_gr);
   }
 
-  print_congruences(gr2,
-    "*** gr2.generalized_affine_preimage(B, A + 1, 2, 3) ***");
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 1, 2, 3) ***");
 
   return ok;
 }
@@ -207,30 +199,28 @@ test05() {
   Grid gr2 = gr1;
 
   // Equality expression.
-  gr1.generalized_affine_preimage(B, A + 2, -2, 0);
+  gr1.generalized_affine_preimage(B, EQUAL, A + 2, -2, 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(-2*A));
-  known_gr.add_generator(grid_point(2*A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point(-2*A));
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr1 == known_gr);
 
-  print_congruences(gr1,
-        "*** gr1.generalized_affine_preimage(B, A + 2, -2, 0) ***");
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 2, -2, 0) ***");
 
   if (ok) {
     print_congruences(gr2, "*** gr2 ***");
 
-    known_gr.add_generator(grid_point());
+    known_gr.add_grid_generator(grid_point());
 
     // Congruence expression.
-    gr2.generalized_affine_preimage(B, A + 2, -2);
+    gr2.generalized_affine_preimage(B, EQUAL, A + 2, -2, 1);
     ok = (gr2 == known_gr);
   }
 
-  print_congruences(gr2,
-    "*** gr2.generalized_affine_preimage(B, A + 1, 2, 3) ***");
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 2, -2, 1) ***");
 
   return ok;
 }
@@ -248,19 +238,19 @@ test06() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A, A - C + 2, 1, 5);
+  gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 5);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(2*A));
-  known_gr.add_generator(grid_point(2*A + 3*B));
-  known_gr.add_generator(grid_line(3*A + C));
-  known_gr.add_generator(grid_point(4*A));  // Original modulus.
-  known_gr.add_generator(grid_point(7*A));  // Transformation modulus.
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + 3*B));
+  known_gr.add_grid_generator(grid_line(3*A + C));
+  known_gr.add_grid_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_grid_generator(grid_point(7*A));  // Transformation modulus.
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A, A - C + 2, 1, 5) ***");
+		    "*** gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 5) ***");
 
   return ok;
 }
@@ -278,7 +268,7 @@ test07() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A, A - C + 2, 1, 0);
+  gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 0);
 
   Grid known_gr = Grid(3);
   known_gr.add_congruence((B %= 0) / 3);
@@ -289,7 +279,7 @@ test07() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A, A - C + 2, 1, 0) ***");
+		    "*** gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 0) ***");
 
   return ok;
 }
@@ -305,14 +295,14 @@ test08() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A, A - 2*C + 3, 4, 7);
+  gr.generalized_affine_preimage(A, EQUAL, A - 2*C + 3, 4, 7);
 
   Grid known_gr(5, EMPTY);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A, A - 2*C + 3, 4, 7) ***");
+		    "*** gr.generalized_affine_preimage(A, EQUAL, A - 2*C + 3, 4, 7) ***");
 
   return ok;
 }
@@ -328,14 +318,14 @@ test09() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A, A + 2);
+  gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1);
 
   Grid known_gr(1, EMPTY);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A, A + 2) ***");
+		    "*** gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1) ***");
 
   return ok;
 }
@@ -349,14 +339,14 @@ test10() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A, A + 2);
+  gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1);
 
   Grid known_gr(1);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A, A + 2) ***");
+		    "*** gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1) ***");
 
   return ok;
 }
@@ -373,15 +363,15 @@ test11() {
   gr.add_congruence((A ==  0) / 0);
 
   try {
-    gr.generalized_affine_preimage(B, A + 2, 0);
+    gr.generalized_affine_preimage(B, EQUAL, A + 2, 0);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expression of a greater space dimension than the grid.
@@ -397,15 +387,15 @@ test12() {
   gr.add_congruence((A ==  0) / 0);
 
   try {
-    gr.generalized_affine_preimage(B, D + 2);
+    gr.generalized_affine_preimage(B, EQUAL, D + 2, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Variable of a greater space dimension than the grid.
@@ -421,15 +411,15 @@ test13() {
   gr.add_congruence((A ==  0) / 0);
 
   try {
-    gr.generalized_affine_preimage(D, A + 2);
+    gr.generalized_affine_preimage(D, EQUAL, A + 2, 1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expression with a 0 modulus, where the variable occurs in
@@ -446,20 +436,19 @@ test14() {
   print_congruences(gr, "*** gr ***");
 
   // Equality expression.
-  gr.generalized_affine_preimage(B, A + B, 1, 0);
+  gr.generalized_affine_preimage(B, EQUAL, A + B, 1, 0);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(parameter(2*B));
-  known_gr.add_generator(parameter(A + B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(2*B));
+  known_gr.add_grid_generator(parameter(A + B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(B, A + B, 1, 0) ***");
+		    "*** gr.generalized_affine_preimage(B, EQUAL, A + B, 1, 0) ***");
 
   return ok;
-
 }
 
 // Expression with a negative modulus, where the variable occurs in
@@ -475,23 +464,58 @@ test15() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(B, A + B, 1, -7);
+  gr.generalized_affine_preimage(B, EQUAL, A + B, 1, -7);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(parameter(2*B));
-  known_gr.add_generator(parameter(A + B));
-  known_gr.add_generator(parameter(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(2*B));
+  known_gr.add_grid_generator(parameter(A + B));
+  known_gr.add_grid_generator(parameter(B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(B, A + B, 1, -7) ***");
+		    "*** gr.generalized_affine_preimage(B, EQUAL, A + B, 1, -7) ***");
 
   return ok;
+}
+
+// Test similar to test01 in
+// tests/Polyhedron/generalizedaffinepreimage2.cc
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_point(3*A + B));
 
+  Grid known_gr(gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(B, EQUAL, B+2, 1, 5);
+
+  // A longer way of computing the generalized affine preimage below.
+  known_gr.add_space_dimensions_and_embed(1);
+  known_gr.add_congruence((B %= C+2) / 5);
+  Variables_Set vset;
+  vset.insert(B);
+  known_gr.remove_space_dimensions(vset);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A + 2*B, EQUAL, A - B, 3) ***");
+
+  return ok;
 }
 
+
 } // namespace
 
 
@@ -511,4 +535,5 @@ BEGIN_MAIN
   DO_TEST(test13);
   DO_TEST(test14);
   DO_TEST(test15);
+  DO_TEST(test16);
 END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage2.cc b/tests/Grid/generalizedaffinepreimage2.cc
index becf9b6..aae8337 100644
--- a/tests/Grid/generalizedaffinepreimage2.cc
+++ b/tests/Grid/generalizedaffinepreimage2.cc
@@ -1,11 +1,11 @@
 /* Test Grid::generalized_affine_preimage(lhs, rhs, modulus).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,18 +35,18 @@ test01() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(Linear_Expression::zero(),
-				 Linear_Expression(1));
+  gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL,
+				 Linear_Expression(1), 1);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), Linear_Expression(1)) ***");
+		    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, Linear_Expression(1), 1) ***");
 
   return ok;
 }
@@ -62,17 +62,17 @@ test02() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(Linear_Expression::zero(), A - B, 5);
+  gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, A - B, 5);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A + B));
-  known_gr.add_generator(grid_point(5*A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(5*A));
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), A - B, 5) ***");
+		    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, A - B, 5) ***");
 
   return ok;
 }
@@ -90,18 +90,17 @@ test03() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A - B, C);
+  gr.generalized_affine_preimage(A - B, EQUAL, C, 1);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A));
-  known_gr.add_generator(grid_line(B));
-  known_gr.add_generator(grid_point(3*C));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point(3*C));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "***  ***");
+  print_congruences(gr, "*** gr ***");
 
   return ok;
 }
@@ -117,7 +116,7 @@ test04() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A - B, A, 0);
+  gr.generalized_affine_preimage(A - B, EQUAL, A, 0);
 
   Grid known_gr(2);
   known_gr.add_congruence(A == 0);
@@ -125,7 +124,7 @@ test04() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A - B, A, 0) ***");
+		    "*** gr.generalized_affine_preimage(A - B, EQUAL, A, 0) ***");
 
   return ok;
 }
@@ -142,60 +141,23 @@ test05() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A + 2*B, A - B, 3);
+  gr.generalized_affine_preimage(A + 2*B, EQUAL, A - B, 3);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_line(A + B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(A + B));
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-        "***  ***");
-
-  return ok;
-}
-
-// Test0 similar to the test in
-// ppl/test0s/Polyhedron/generalizedaffinepreimage4.cc
-bool
-test06() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(A + B));
-  gr.add_generator(grid_point(2*A));
-  gr.add_generator(grid_point(2*A + 2*B));
-  gr.add_generator(grid_point(3*A + B));
-
-  Grid known_gr(gr);
-
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(B, B+2, 1, 5);
-
-// A longer way of computing the generalized affine preimage below.
-  known_gr.add_space_dimensions_and_embed(1);
-  known_gr.add_congruence((B %= C+2) / 5);
-  Variables_Set vset;
-  vset.insert(B);
-  known_gr.remove_space_dimensions(vset);
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A + 2*B, A - B, 3) ***");
-
   return ok;
 }
 
-
 // Expressions having common variables.
 bool
-test07() {
+test06() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -206,14 +168,14 @@ test07() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A - B + C, 2*A - B - C, 5);
+  gr.generalized_affine_preimage(A - B + C, EQUAL, 2*A - B - C, 5);
 
   Grid known_gr(3);
 
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A - B + C, 2*A - B - C, 5) ***");
+		    "*** gr.generalized_affine_preimage(A - B + C, EQUAL, 2*A - B - C, 5) ***");
 
   return ok;
 }
@@ -221,7 +183,7 @@ test07() {
 // Expressions having common variables, where
 // generalized_affine_preimage must minimize the grid.
 bool
-test08() {
+test07() {
   Variable A(0);
   Variable B(1);
 
@@ -230,7 +192,7 @@ test08() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A - B, 2*A - 2*B, 5);
+  gr.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B, 5);
 
   Grid known_gr(2);
   known_gr.add_congruence((2*A - 2*B %= 0) / 5);
@@ -238,7 +200,7 @@ test08() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A - B, 2*A - 2*B, 5) ***");
+		    "*** gr.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B, 5) ***");
 
   return ok;
 }
@@ -246,7 +208,7 @@ test08() {
 // Expressions having common variables, where
 // generalized_affine_preimage must minimize the grid.
 bool
-test09() {
+test08() {
   Variable A(0);
   Variable B(1);
 
@@ -255,7 +217,7 @@ test09() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(2*A - 2*B, A - B, 5);
+  gr.generalized_affine_preimage(2*A - 2*B, EQUAL, A - B, 5);
 
   Grid known_gr(2);
   known_gr.add_congruence((A - B %= 0) / 5);
@@ -263,7 +225,7 @@ test09() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(2*A - 2*B, A - B, 5) ***");
+		    "*** gr.generalized_affine_preimage(2*A - 2*B, EQUAL, A - B, 5) ***");
 
   return ok;
 }
@@ -271,7 +233,7 @@ test09() {
 // Right hand side expression of greater space dimension than the
 // grid.
 bool
-test10() {
+test09() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -281,20 +243,20 @@ test10() {
   gr.add_congruence(C %= -2);
 
   try {
-    gr.generalized_affine_preimage(B + C, D + 2);
+    gr.generalized_affine_preimage(B + C, EQUAL, D + 2, 1);
  }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Left hand side expression of space dimension greater than the grid.
 bool
-test11() {
+test10() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -304,20 +266,20 @@ test11() {
   gr.add_congruence((C == -2) / 0);
 
   try {
-    gr.generalized_affine_preimage(A + D, A + 2);
+    gr.generalized_affine_preimage(A + D, EQUAL, A + 2);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Expressions having common variables, with a negative modulus.
 bool
-test12() {
+test11() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -328,7 +290,7 @@ test12() {
 
   print_congruences(gr, "*** gr ***");
 
-  gr.generalized_affine_preimage(A - B, C, -5);
+  gr.generalized_affine_preimage(A - B, EQUAL, C, -5);
 
   Grid known_gr(3);
   known_gr.add_congruence((C %= 0) / 15);
@@ -336,7 +298,7 @@ test12() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-        "*** gr.generalized_affine_preimage(A - B, C, -5) ***");
+		    "*** gr.generalized_affine_preimage(A - B, EQUAL, C, -5) ***");
 
   return ok;
 }
@@ -355,5 +317,4 @@ BEGIN_MAIN
   DO_TEST(test09);
   DO_TEST(test10);
   DO_TEST(test11);
-  DO_TEST(test12);
 END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage3.cc b/tests/Grid/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..c64017f
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage3.cc
@@ -0,0 +1,461 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence(B %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression::zero());
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression::zero() ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-3*A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, LESS_OR_EQUAL, A - 2*C + 3, 4);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A, LESS_OR_EQUAL, A - 2*C + 3, 4) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A, LESS_THAN A + 2, 1) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test05() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, GREATER_OR_EQUAL, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, GREATER_OR_EQUAL, D + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(D, GREATER_OR_EQUAL, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The expression is not EQUAL and there is a non-zero modulus.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A, GREATER_OR_EQUAL, A + 2, 1, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The variable occurs in the expression.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+  gr.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  // Equality expression.
+  gr.generalized_affine_preimage(B, GREATER_THAN, A + B);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(2*B));
+  known_gr.add_grid_generator(parameter(A));
+  known_gr.add_grid_generator(parameter(3*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(B, GREATER_THAN, A + B) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_congruence(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B + C, GREATER_THAN, 2*A - B - C);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A - B + C, GREATER_THAN, 2*A - B - C) ***");
+
+  return ok;
+}
+
+// Expressions where one variable is unaffected.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence(C == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, GREATER_THAN, 2*A - 2*B, 0);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A - B, GREATER_THAN, 2*A - 2*B, 0) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_preimage(B + C, GREATER_THAN, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A + D, GREATER_THAN, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Universe.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, GREATER_THAN, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A, GREATER_THAN , A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// The relation is not EQUAL and there is a non-zero modulus.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A + D, GREATER_THAN, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty with congruences.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A + B, LESS_THAN, A + 2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+		    "*** gr.generalized_affine_preimage(A, LESS_THAN, A + 2) ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/generator1.cc b/tests/Grid/generator1.cc
index 1f98103..0f65267 100644
--- a/tests/Grid/generator1.cc
+++ b/tests/Grid/generator1.cc
@@ -1,11 +1,11 @@
 /* Test class Grid_Generator.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -195,7 +195,293 @@ test09() {
   return ok;
 }
 
+// Parameter with negative divisor.
+static bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(-A - 2*B - 3*C, -4));
+
+  Grid_Generator b(parameter(6*B + 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Point with negative divisor.
+static bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(A + 2*B + 3*C, 5));
+
+  Grid_Generator b(grid_point(-15*C - 5*A - 10*B, -25));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter with zero divisor.
+static bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  try {
+    Grid_Generator a(parameter(-A - 2*B - 3*C, 0));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Point with zero divisor.
+static bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  try {
+    Grid_Generator a(grid_point(A + 2*B + 3*C, 0));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Line.
+static bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  try {
+    Grid_Generator a(grid_line(0*A + 0*B + 0*C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// is_equivalent_to() and is_equal_to(): generators have different types
+static bool
+test15() {
+  Variable A(0);
+
+  Grid_Generator a(grid_point(A));
+  Grid_Generator b(grid_point(A, 2));
+  Grid_Generator c(parameter(A));
+  Grid_Generator d(grid_line(A));
+  Grid_Generator e(grid_point(2*A, 4));
+  Grid_Generator f(parameter(2*A, 2));
+
+  bool ok = (!c.is_equivalent_to(d));
+  ok &= (!a.is_equivalent_to(b));
+  ok &= (!c.is_equal_to(d));
+  ok &= (!a.is_equal_to(b));
+  ok &= (b.is_equal_to(e));
+  ok &= (!c.is_equal_to(f));
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+  print_generator(c, "*** c ***");
+  print_generator(d, "*** d ***");
+  print_generator(e, "*** e ***");
+  print_generator(f, "*** f ***");
+
+  return ok;
+}
+
+// is_equivalent_to(): generators have different space dimensions
+static bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator a(grid_point(A));
+  Grid_Generator b(grid_point(B));
+  Grid_Generator c(parameter(A));
+  Grid_Generator d(parameter(B));
+  Grid_Generator e(grid_line(B));
+  Grid_Generator f(grid_line(A));
+
+  bool ok = (!a.is_equivalent_to(b));
+  ok &= (!c.is_equivalent_to(d));
+  ok &= (!e.is_equivalent_to(f));
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+  print_generator(c, "*** c ***");
+  print_generator(d, "*** d ***");
+  print_generator(e, "*** e ***");
+  print_generator(f, "*** f ***");
+
+  return ok;
+}
+
+// Getting coefficients of dimensions and rebuilding a generator from
+// them. This is based on Example 6 in Grid_Generator.defs.hh
+static bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(2*A - B + 3*C, 2));
+  print_generator(a, "*** a ***");
+
+  Linear_Expression e;
+
+  for (dimension_type i = a.space_dimension(); i-- > 0; )
+    e += (i + 1) * a.coefficient(Variable(i)) * Variable(i);
+  Grid_Generator b = parameter(e, 2);
+
+  Grid_Generator c(parameter(2*A - 2*B + 9*C, a.divisor()));
+
+  bool ok = (b.is_equivalent_to(c));
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Copy construction of a grid generator.
+static bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(A - 2*B + 3*C, -2));
+
+  Grid_Generator b(a);
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Method zero_dim_point.
+static bool
+test19() {
+  Grid_Generator a(Grid_Generator::zero_dim_point());
+
+  Grid_Generator b(grid_point());
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Method `type'.
+static bool
+test20() {
+  Variable C(2);
+
+  Grid_Generator::Type a = grid_point(2*C).type();
+
+  Grid_Generator::Type b = grid_point(3*C).type();
+
+  bool ok = (a == b);
+
+  nout << "*** a ***" << a << std::endl;
+  nout << "*** b ***" << b << std::endl;
+
+  return ok;
+}
+
+#if 0 // scale_to_divisor is now private.
+// Exception in method scale_to_divisor.
+static bool
+test21() {
+  Variable C(2);
+
+  Grid_Generator a = grid_point(2*C, 3);
+
+  print_generator(a, "*** a ***");
+
+  try {
+    a.scale_to_divisor(0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+#endif
+
+// Exception when trying to get the divisor of a line.
+static bool
+test22() {
+  Variable C(2);
+
+  Grid_Generator a = grid_line(2*C);
+
+  print_generator(a, "*** a ***");
+
+  try {
+    a.divisor();
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Method zero_dim_point.
+static bool
+test23() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression le(grid_point(A - B - 2*C));
+
+  bool ok = (grid_point(A - B - 2*C) == grid_point(A - B - 2*C));
+
+  return ok;
+}
+
 } // namespace
+
 BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
@@ -206,4 +492,18 @@ BEGIN_MAIN
   DO_TEST(test07);
   DO_TEST(test08);
   DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  //DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
 END_MAIN
diff --git a/tests/Grid/generators1.cc b/tests/Grid/generators1.cc
index 1efe24a..35b14cc 100644
--- a/tests/Grid/generators1.cc
+++ b/tests/Grid/generators1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,7 +31,7 @@ test01() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -49,7 +49,7 @@ test02() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -67,7 +67,7 @@ test03() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -85,7 +85,7 @@ test04() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -100,18 +100,18 @@ test04() {
 bool
 test05() {
   Variable A(0);
-  Variable C(2);
   Variable B(1);
+  Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*B));
-  gr1.add_generator(grid_point(5*A + 2*B));
-  gr1.add_generator(grid_point(7*B));
-  gr1.add_generator(grid_line(C));
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(grid_point(7*B));
+  gr1.add_grid_generator(grid_line(C));
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -134,7 +134,7 @@ test06() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -151,11 +151,11 @@ bool
 test07() {
   Grid gr1(3, EMPTY);
 
-  const Grid_Generator_System& gs = gr1.generators();
+  const Grid_Generator_System& gs = gr1.grid_generators();
 
   // Add a point.  The idea is to check that `gs' still refers to a
   // generator system that matches the grid.
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
 
   Grid known_gr = gr1;
 
@@ -174,7 +174,7 @@ bool
 test08() {
   Grid gr1(0);
 
-  const Grid_Generator_System& gs = gr1.generators();
+  const Grid_Generator_System& gs = gr1.grid_generators();
 
   // Empty the grid.  The idea is to check that `gs' still refers to a
   // generator system that matches the grid.
@@ -202,7 +202,7 @@ test09() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -221,14 +221,14 @@ test10() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*B, 2));
-  gr1.add_generator(grid_point(5*A + 2*B));
-  gr1.add_generator(parameter(11*B, 2));
-  gr1.add_generator(grid_line(C));
+  gr1.add_grid_generator(grid_point(3*B, 2));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(parameter(11*B, 2));
+  gr1.add_grid_generator(grid_line(C));
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -247,14 +247,14 @@ test11() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*B));
-  gr1.add_generator(grid_point(5*A + 2*B));
-  gr1.add_generator(parameter(11*B, 2));
-  gr1.add_generator(grid_line(C));
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(parameter(11*B, 2));
+  gr1.add_grid_generator(grid_line(C));
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -273,14 +273,14 @@ test12() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*B));
-  gr1.add_generator(grid_point(5*A + 2*B));
-  gr1.add_generator(parameter(11*B));
-  gr1.add_generator(grid_line(C));
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(parameter(11*B));
+  gr1.add_grid_generator(grid_line(C));
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.generators();
+  Grid_Generator_System gs = gr1.grid_generators();
 
   Grid gr2(gs);
 
@@ -291,6 +291,161 @@ test12() {
   return ok;
 }
 
+// inserted generator system has more space dimensions that
+// the old generator system.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A, 2));
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(5*A + 2*B, 3));
+  gs1.insert(parameter(11*C, 2));
+
+  gs.recycling_insert(gs1);
+
+  Grid gr(gs);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*A, 2));
+  known_gr.add_grid_generator(grid_point(5*A + 2*B, 3));
+  known_gr.add_grid_generator(parameter(11*C, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// test clear() for nonempty generator system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A, 2));
+  gs.insert(grid_point(5*A + 2*B, 3));
+  gs.insert(parameter(11*C, 2));
+
+  print_generators(gs, "*** gs ***");
+
+  gs.clear();
+
+  Grid gr(gs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+  nout << "gr.space_dimension = " << gr.space_dimension() << endl;
+
+  return ok;
+}
+
+// test clear() for empty generator system.
+// This test showed a bug in the code for clear() in
+// Grid_Generator_System.inlines.hh which is now corrected.
+bool
+test15() {
+  Grid_Generator_System gs;
+
+  print_generators(gs, "*** gs ***");
+
+  gs.clear();
+
+  Grid gr(gs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+  nout << "gr.space_dimension = " << gr.space_dimension() << endl;
+
+  return ok;
+}
+
+// space_dimension
+bool
+test16() {
+  Variable A(3);
+  Variable B(7);
+  Variable C(4);
+
+  Grid_Generator_System ggs(grid_point(A - 3*B + 21*C, 21));
+
+  bool ok = (ggs.space_dimension() == 8);
+
+  print_generators(ggs, "*** ggs ***");
+
+  return ok;
+}
+
+// Recycling_insert
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System ggs1;
+  ggs1.insert(parameter(11*B));
+  ggs1.insert(grid_line(C));
+  ggs1.insert(grid_point(3*B));
+
+  Grid_Generator_System ggs;
+  ggs.recycling_insert(ggs1);
+  print_generators(ggs, "*** ggs ***");
+
+  Grid gr(ggs);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*B));
+  known_gr.add_grid_generator(parameter(11*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(ggs} ***");
+
+  return ok;
+}
+
+// Comparing Systems with different space dimensions
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable E(4);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(3*B));
+  ggs.insert(grid_line(E));
+  print_generators(ggs, "*** ggs ***");
+
+  Grid gr(ggs);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*B));
+  known_gr.add_grid_generator(parameter(11*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr != known_gr);
+
+  print_generators(gr, "*** gr(ggs} ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -306,4 +461,10 @@ BEGIN_MAIN
   DO_TEST(test10);
   DO_TEST(test11);
   DO_TEST(test12);
+  DO_TEST_F8(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
 END_MAIN
diff --git a/tests/Grid/generators2.cc b/tests/Grid/generators2.cc
new file mode 100644
index 0000000..901fe18
--- /dev/null
+++ b/tests/Grid/generators2.cc
@@ -0,0 +1,55 @@
+/* Test class Grid_Generator_System.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// recycling_insert(g) where the dimension of g is greater than the
+// generator system.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs(1);
+
+  Grid_Generator g = grid_point(A + B);
+
+  gs.recycling_insert(g);
+
+  print_generators(gs, "*** gs ***");
+
+  Grid_Generator_System known_gs(grid_point(A + B));
+
+  bool ok = (gs == known_gs);
+
+  print_generators(known_gs, "*** known_gs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/grid1.cc b/tests/Grid/grid1.cc
index 4bad322..999b6dd 100644
--- a/tests/Grid/grid1.cc
+++ b/tests/Grid/grid1.cc
@@ -1,11 +1,11 @@
 /* Test reduction and conversion of grids created from generators.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,7 +24,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace {
 
-// add_generator_and_minimize, one variable.
+// add_grid_generator_and_minimize, one variable.
 bool
 test01() {
   Variable A(0);
@@ -35,7 +35,7 @@ test01() {
   Grid gr(gs);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generator_and_minimize(grid_point(2*A));
+  gr.add_grid_generator_and_minimize(grid_point(2*A));
 
   Congruence_System known_cgs;
   known_cgs.insert(A %= 0);
@@ -45,12 +45,12 @@ test01() {
   bool ok = (gr == known_gr);
 
   print_congruences(gr,
-     "*** gr.add_generator_and_minimize(grid_point(2*A)) ***");
+		    "*** gr.add_grid_generator_and_minimize(grid_point(2*A)) ***");
 
   return ok;
 }
 
-// add_generator_and_minimize, two variables.
+// add_grid_generator_and_minimize, two variables.
 bool
 test02() {
   Variable A(0);
@@ -63,7 +63,7 @@ test02() {
   print_generators(gr, "*** gr ***");
 
   Grid_Generator g(grid_point(A + 2*B));
-  gr.add_generator_and_minimize(g);
+  gr.add_grid_generator_and_minimize(g);
 
   Congruence_System known_cgs;
   known_cgs.insert( 0*A + 0*B %= -1);
@@ -74,13 +74,12 @@ test02() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-     "*** gr.add_generator_and_minimize(g) ***");
+  print_congruences(gr, "*** gr.add_grid_generator_and_minimize(g) ***");
 
   return ok;
 }
 
-// add_generators_and_minimize
+// add_grid_generators_and_minimize
 bool
 test03() {
   Variable A(0);
@@ -94,7 +93,7 @@ test03() {
   Grid gr(2, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Grid_Generator_System known_gs;
   known_gs.insert(grid_line(0*A +   B));
@@ -105,13 +104,11 @@ test03() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-     "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// test from Chiara conversion_test.cc
 bool
 test04() {
   Variable A(0);
@@ -127,7 +124,7 @@ test04() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert(( 0*A + 0*B + 0*C %= -2) / 2);
@@ -138,13 +135,11 @@ test04() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-     "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// test1 from Chiara conversion_test.cc.
 bool
 test05() {
   Variable A(0);
@@ -159,7 +154,7 @@ test05() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert(0*A + 0*B + 0*C %= -1);
@@ -169,13 +164,11 @@ test05() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-     "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// test2 from Chiara conversion_test.cc.
 bool
 test06() {
   Variable A(0);
@@ -191,7 +184,7 @@ test06() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((  0*A + 0*B + 0*C %=  15) / 15);
@@ -202,13 +195,11 @@ test06() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr,
-     "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// test3 from Chiara conversion_test.cc.
 bool
 test07() {
   Variable A(0);
@@ -223,7 +214,7 @@ test07() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert(( 0*A + 0*B + 0*C %= -10) / 10);
@@ -234,12 +225,11 @@ test07() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// param_test1 from Chiara Convert_Test.cc.
 bool
 test08() {
   Variable A(0);
@@ -255,7 +245,7 @@ test08() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert(A %= 0);
@@ -266,12 +256,11 @@ test08() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// param_test2 from Chiara Convert_Test.cc.
 bool
 test09() {
   Variable A(0);
@@ -285,7 +274,7 @@ test09() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((A %= 1) / 0);
@@ -296,12 +285,11 @@ test09() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// param_test3 from Chiara Convert_Test.cc.
 bool
 test10() {
   Variable A(0);
@@ -316,7 +304,7 @@ test10() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((A %=  1) / 0);
@@ -327,12 +315,11 @@ test10() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// param_test5 from Chiara Convert_Test.cc.
 bool
 test11() {
   Variable A(0);
@@ -347,7 +334,7 @@ test11() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert(( 0*A + 0*B + 0*C %= -1) / 1);
@@ -357,12 +344,11 @@ test11() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// param_test6 from Chiara Convert_Test.cc.
 bool
 test12() {
   Variable A(0);
@@ -377,7 +363,7 @@ test12() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((-4*A + 6*B + 0*C %= 1) / 0);
@@ -386,7 +372,7 @@ test12() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
@@ -419,9 +405,6 @@ test14() {
   return ok;
 }
 
-// Bigger values (param_test7a from Chiara Convert_Test.cc) -- in
-// grid1_64.cc.
-// Test reduce_line_with_line (param_test9 from Chiara Convert_Test.cc).
 bool
 test15() {
   Variable A(0);
@@ -436,7 +419,7 @@ test15() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((4*A + 0*B + 0*C %= -1) / 0);
@@ -446,13 +429,11 @@ test15() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// Grids from a water monitor example (from param_test10 from Chiara
-// Convert_test.cc).
 bool
 test16() {
   Variable A(0);
@@ -470,7 +451,7 @@ test16() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((C %= 0) / 0);
@@ -482,12 +463,11 @@ test16() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
 
-// param_test11 from Chiara Convert_Test.cc.
 bool
 test17() {
   Variable A(0);
@@ -503,7 +483,7 @@ test17() {
   Grid gr(3, EMPTY);
   print_generators(gr, "*** gr ***");
 
-  gr.add_generators_and_minimize(gs);
+  gr.add_grid_generators_and_minimize(gs);
 
   Congruence_System known_cgs;
   known_cgs.insert((-9*A + 6*B + 0*C %= 0) / 2);
@@ -513,7 +493,7 @@ test17() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
 
   return ok;
 }
@@ -560,6 +540,270 @@ test20() {
   return ok;
 }
 
+// Using large values for the coordinates
+bool
+test21() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-9933*A + 2000*B + 3953*C, 9113));
+  gs.insert(grid_point(    0*A +    0*B + 8888*C, 7302));
+  gs.insert(grid_point(   29*A +   23*B + 1111*C, 1010));
+  gs.insert(grid_point( 2394*A + 7273*B +    0*C,   30));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+
+  // Create coefficients with string constructors as they're too big
+  // for the long type.
+
+  // 37315344498526  0  0  0  congruence, modulus = 37315344498526
+  // 0  343455281759218112380  0  0  congruence, modulus = 37315344498526
+  // 0  -133815138923073144612  223892066991156  0  congruence, modulus = 37315344498526
+  // -22220  -31385495955559489171  93798931757298  18255  congruence, modulus = 37315344498526
+
+  Coefficient* tem1 = new Coefficient("37315344498526");
+  known_cgs.insert((     0*A +     0*B +     0*C %= -*tem1) / *tem1);
+
+  Coefficient* tem2 = new Coefficient("343455281759218112380");
+  known_cgs.insert(( *tem2*A +     0*B +     0*C %= 0) / *tem1);
+  delete tem2;
+
+  tem2 = new Coefficient("-133815138923073144612");
+  Coefficient* tem3 = new Coefficient("223892066991156");
+  known_cgs.insert(( *tem2*A + *tem3*B +     0*C %= 0) / *tem1);
+  delete tem2; delete tem3;
+
+  tem2 = new Coefficient("-31385495955559489171");
+  tem3 = new Coefficient("93798931757298");
+  known_cgs.insert(( *tem2*A + *tem3*B + 18255*C %= 22220) / *tem1);
+  delete tem1; delete tem2; delete tem3;
+
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  //print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Using large values for the coefficients.
+bool
+test22() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-93*A +   0*B +  39*C, 113));
+  gs.insert(grid_line( 29*A +  23*B + 111*C));
+  gs.insert(grid_point(117*A + 200*B +  88*C, 33));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((       0*A +       0*B +      0*C %=  280730) / 280730);
+  known_cgs.insert((  -85767*A +  108141*B +      0*C %=   70587) / 280730);
+  known_cgs.insert((-2309489*A + 1557137*B + 280730*C %= 1997619) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+bool
+test23() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( 3*A +   B + 0*C, 4));
+  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A +  0*B +  0*C %= -40) / 40);
+  known_cgs.insert((20*A +  0*B +  0*C %=  15) / 40);
+  known_cgs.insert((-4*A + 32*B +  0*C %=   5) / 40);
+  known_cgs.insert(( 0*A +  0*B + 80*C %=   0) / 40);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+bool
+test24() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( 3*A +   B + 0*C, 4));
+  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((20*A +  0*B        %= 15) / 40);
+  known_cgs.insert((-4*A + 32*B        %=  5) / 40);
+  known_cgs.insert((              80*C %=  0) / 40);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// add_grid_generators_and_minimize, with more rows than columns.
+bool
+test25() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A + 7*B - 2*C + 3*D));
+  gs.insert(grid_point(0*A + 0*B +   C +   D));
+  gs.insert(grid_point(3*A + 4*B + 2*C + 0*D));
+  gs.insert(grid_point(3*A + 2*B +   C + 2*D));
+  gs.insert(grid_point(9*A + 0*B + 4*C +   D));
+
+  Grid gr(4, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((  9*A +   0*B +  0*C + 0*D %=   0) / 27);
+  known_cgs.insert((-18*A +  27*B +  0*C + 0*D %=   0) / 27);
+  known_cgs.insert((-90*A + 135*B + 27*C + 0*D %=  27) / 27);
+  known_cgs.insert((-17*A +  25*B +  6*C +   D %=   7) / 27);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test26() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(2*A + 0*B));
+  gs.insert(grid_point(30*A + 36*B));
+  gs.insert(grid_point(450*A + 564*B));
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 2) / 28);
+  known_cgs.insert((B %= 0) / 12);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// A generator system with only a line.
+bool
+test27() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_line(0*A + 2*B + 0*C));
+
+  try {
+    Grid gr(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// A generator system containing a parameter.
+bool
+test28() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*C));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(parameter(-C));
+
+  Grid gr(gs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(gs) ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -583,4 +827,12 @@ BEGIN_MAIN
   DO_TEST(test18);
   DO_TEST(test19);
   DO_TEST(test20);
+  DO_TEST_F64(test21);
+  DO_TEST_F32(test22);
+  DO_TEST_F8(test23);
+  DO_TEST_F8(test24);
+  DO_TEST_F8(test25);
+  DO_TEST_F8(test26);
+  DO_TEST(test27);
+  DO_TEST(test28);
 END_MAIN
diff --git a/tests/Grid/grid2.cc b/tests/Grid/grid2.cc
index e816177..8f50b99 100644
--- a/tests/Grid/grid2.cc
+++ b/tests/Grid/grid2.cc
@@ -1,11 +1,11 @@
 /* Test reduction and conversion of grids created from congruences.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -157,8 +157,6 @@ test05() {
   return ok;
 }
 
-// cong_test0 from Chiara Convert_Test.cc.
-
 bool
 test06() {
   Variable A(0);
@@ -189,7 +187,6 @@ test06() {
   return ok;
 }
 
-// cong_test1 from Chiara Convert_Test.cc.
 bool
 test07() {
   Variable A(0);
@@ -220,7 +217,7 @@ test07() {
   return ok;
 }
 
-// Adding a false equality (cong_test2 from Chiara Convert_Test.cc).
+// Adding a false equality.
 bool
 test08() {
   Variable A(0);
@@ -242,7 +239,6 @@ test08() {
   return ok;
  }
 
-// cong_test3 from Chiara Convert_Test.cc.
 bool
 test09() {
   Variable A(0);
@@ -273,9 +269,6 @@ test09() {
   return ok;
 }
 
-// cong_test4 from Chiara Convert_Test.cc -- in grid4.cc.
-
-// cong_test5 from Chiara Convert_Test.cc.
 bool
 test10() {
   Variable A(0);
@@ -308,7 +301,6 @@ test10() {
   return ok;
 }
 
-// cong_test6 from Chiara Convert_Test.cc.
 bool
 test11() {
   Variable A(0);
@@ -339,7 +331,6 @@ test11() {
   return ok;
 }
 
-// cong_test7 from Chiara Convert_Test.cc.
 bool
 test12() {
   Variable A(0);
@@ -367,7 +358,6 @@ test12() {
   return ok;
 }
 
-// cong_test8 from Chiara Convert_Test.cc.
 bool
 test13() {
   Variable A(0);
@@ -476,7 +466,6 @@ test16() {
 }
 
 // Zero dimension universe grid.
-
 bool
 test17() {
   Congruence_System cgs;
@@ -495,7 +484,6 @@ test17() {
 
 // add_recycled_congruence, add empty system to zero dimension
 // universe.
-
 bool
 test18() {
   Grid gr(0);
@@ -513,7 +501,6 @@ test18() {
 }
 
 // add_recycled_congruence, zero dimension empty.
-
 bool
 test19() {
   Grid gr(0);
@@ -533,6 +520,91 @@ test19() {
   return ok;
 }
 
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A             %= -2) / 3);
+  cgs.insert((5*A + 9*B +   C %= -1) / 3);
+  cgs.insert((        B + 3*C %= -2) / 3);
+  cgs.insert((      2*B + 3*C %= -2) / 3);
+
+  Grid gr(3);
+
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(-2*A + 0*B +  7*C, 3));
+  known_gs.insert(grid_point( 1*A + 0*B +    C, 3));
+  known_gs.insert(grid_point(-2*A + 9*B +  7*C, 3));
+  known_gs.insert(grid_point(-2*A + 0*B + 16*C, 3));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// OK(true) and OK(false) test.
+bool
+test21() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A %= 2) / 3);
+
+  Grid gr(3);
+
+  gr.add_congruences_and_minimize(cgs);
+
+  bool ok = (gr.OK(true) && gr.OK(false));
+  print_generators(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  Grid gr1(1, EMPTY);
+
+  if (ok)
+    ok = (gr1.OK(false));
+  print_generators(gr1, "*** gr1(1, EMPTY) ***");
+
+  Grid gr2(0);
+
+  if (ok)
+    ok = (gr2.OK(true) && gr2.OK(false));
+  print_generators(gr2, "*** gr2(0) ***");
+
+  return ok;
+}
+
+// Non-zero dimension universe when there are two congruences.
+// This showed a bug in Grid_simplify which is now corrected.
+bool
+test22() {
+  Variable A(0);
+  Variable B(1);;
+
+  Congruence_System cgs1(0*A == 0);
+  cgs1.insert(0*B == 0);
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  Grid gr(cgs1);
+  print_congruences(gr, "*** gr(cgs1) ***");
+
+  Grid known_gr(2);
+  print_congruences(known_gr, "*** known_gr ***");
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -555,4 +627,7 @@ BEGIN_MAIN
   DO_TEST(test17);
   DO_TEST(test18);
   DO_TEST(test19);
+  DO_TEST_F8(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
 END_MAIN
diff --git a/tests/Grid/grid3.cc b/tests/Grid/grid3.cc
index f04ca0e..7c9d46f 100644
--- a/tests/Grid/grid3.cc
+++ b/tests/Grid/grid3.cc
@@ -1,11 +1,11 @@
 /* Test construction of grids from constraints.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -48,7 +48,7 @@ test01() {
   return ok;
 }
 
-// Grid(cs), resulting grid empty.
+// Grid(cs), resulting grid universe.
 bool
 test02() {
   Variable A(0);
@@ -71,9 +71,27 @@ test02() {
   return ok;
 }
 
-// Grid(const cs)
+// Grid(cs), cs empty and resulting grid universe.
 bool
 test03() {
+
+  Constraint_System cs;
+  print_constraints(cs, "*** cs ***");
+
+  Grid gr(cs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  return ok;
+}
+
+// Grid(const cs)
+bool
+test04() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -99,7 +117,7 @@ test03() {
 
 // Grid(const cs), resulting grid empty.
 bool
-test04() {
+test05() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -124,345 +142,119 @@ test04() {
 
 // Space dimension exception.
 bool
-test05() {
+test06() {
   try {
     Grid gr(Constraint_System::max_space_dimension() + 1);
   }
   catch (const std::length_error& e) {
     nout << "length_error: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
-}
-
-// Even bigger values (param_test8 from Chiara Convert_Test.cc).
-bool
-test06() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point(-9933*A + 2000*B + 3953*C, 9113));
-  gs.insert(grid_point(    0*A +    0*B + 8888*C, 7302));
-  gs.insert(grid_point(   29*A +   23*B + 1111*C, 1010));
-  gs.insert(grid_point( 2394*A + 7273*B +    0*C,   30));
-
-  Grid gr(3, EMPTY);
-  print_generators(gr, "*** gr ***");
-
-  gr.add_generators_and_minimize(gs);
-
-  Congruence_System known_cgs;
-
-  // Create coefficients with string constructors as they're too big
-  // for the long type.
-
-  // 37315344498526  0  0  0  congruence, modulus = 37315344498526
-  // 0  343455281759218112380  0  0  congruence, modulus = 37315344498526
-  // 0  -133815138923073144612  223892066991156  0  congruence, modulus = 37315344498526
-  // -22220  -31385495955559489171  93798931757298  18255  congruence, modulus = 37315344498526
-
-  Coefficient* tem1 = new Coefficient("37315344498526");
-  known_cgs.insert((     0*A +     0*B +     0*C %= -*tem1) / *tem1);
-
-  Coefficient* tem2 = new Coefficient("343455281759218112380");
-  known_cgs.insert(( *tem2*A +     0*B +     0*C %= 0) / *tem1);
-  delete tem2;
-
-  tem2 = new Coefficient("-133815138923073144612");
-  Coefficient* tem3 = new Coefficient("223892066991156");
-  known_cgs.insert(( *tem2*A + *tem3*B +     0*C %= 0) / *tem1);
-  delete tem2; delete tem3;
-
-  tem2 = new Coefficient("-31385495955559489171");
-  tem3 = new Coefficient("93798931757298");
-  known_cgs.insert(( *tem2*A + *tem3*B + 18255*C %= 22220) / *tem1);
-  delete tem1; delete tem2; delete tem3;
-
-
-  Grid known_gr(known_cgs);
-
-  bool ok = (gr == known_gr);
-
-  //  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
-
-  return ok;
+  return false;
 }
 
-// Bigger values (param_test7a from Chiara Convert_Test.cc).
+// Assignment of universe grid, zero dimensions.
 bool
 test07() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point(-93*A +   0*B +  39*C, 113));
-  gs.insert(grid_line( 29*A +  23*B + 111*C));
-  gs.insert(grid_point(117*A + 200*B +  88*C, 33));
-
-  Grid gr(3, EMPTY);
-  print_generators(gr, "*** gr ***");
-
-  gr.add_generators_and_minimize(gs);
+  Grid gr(0, EMPTY);
 
-  Congruence_System known_cgs;
-  known_cgs.insert((       0*A +       0*B +      0*C %=  280730) / 280730);
-  known_cgs.insert((  -85767*A +  108141*B +      0*C %=   70587) / 280730);
-  known_cgs.insert((-2309489*A + 1557137*B + 280730*C %= 1997619) / 0);
+  gr = Grid(0);
 
-  Grid known_gr(known_cgs);
+  Grid known_gr(0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+  print_generators(gr, "*** gr ***");
 
   return ok;
 }
 
-// test4 from Chiara conversion_test.cc.
+// Space dimension exception.
 bool
-test08 () {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point( 3*A +   B + 0*C, 4));
-  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
-  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
-  gs.insert(grid_point( 3*A +   B + 2*C, 4));
-
-  Grid gr(3, EMPTY);
-  print_generators(gr, "*** gr ***");
-
-  gr.add_generators_and_minimize(gs);
-
-  Congruence_System known_cgs;
-  known_cgs.insert(( 0*A +  0*B +  0*C %= -40) / 40);
-  known_cgs.insert((20*A +  0*B +  0*C %=  15) / 40);
-  known_cgs.insert((-4*A + 32*B +  0*C %=   5) / 40);
-  known_cgs.insert(( 0*A +  0*B + 80*C %=   0) / 40);
-
-  Grid known_gr(known_cgs);
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
-
-  return ok;
+test08() {
+  try {
+    Grid gr(Grid::max_space_dimension() + 1);
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
 }
 
-// param_test4 from Chiara Convert_Test.cc.
+// Create grid from empty zero dimension constraint system.
 bool
 test09() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point( 3*A +   B + 0*C, 4));
-  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
-  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
-  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+  Constraint_System cs(Constraint::zero_dim_false());
 
-  Grid gr(3, EMPTY);
-  print_generators(gr, "*** gr ***");
+  Grid gr(cs);
 
-  gr.add_generators_and_minimize(gs);
+  print_congruences(gr, "*** gr(cs) ***");
 
-  Congruence_System known_cgs;
-  known_cgs.insert((20*A +  0*B        %= 15) / 40);
-  known_cgs.insert((-4*A + 32*B        %=  5) / 40);
-  known_cgs.insert((              80*C %=  0) / 40);
+  Grid known_gr(0, EMPTY);
 
-  Grid known_gr(known_cgs);
+  print_congruences(known_gr, "*** known_gr ***");
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
-
   return ok;
 }
 
-// add_generators_and_minimize, with more rows than columns.
+// Create grid from universe zero dimension constraint system.
 bool
 test10() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
+  Constraint_System cs(Constraint::zero_dim_positivity());
 
-  Grid_Generator_System gs;
-  gs.insert(grid_point(3*A + 7*B - 2*C + 3*D));
-  gs.insert(grid_point(0*A + 0*B +   C +   D));
-  gs.insert(grid_point(3*A + 4*B + 2*C + 0*D));
-  gs.insert(grid_point(3*A + 2*B +   C + 2*D));
-  gs.insert(grid_point(9*A + 0*B + 4*C +   D));
-
-  Grid gr(4, EMPTY);
-  print_generators(gr, "*** gr ***");
+  Grid gr(cs);
 
-  gr.add_generators_and_minimize(gs);
+  print_congruences(gr, "*** gr(cs) ***");
 
-  Congruence_System known_cgs;
-  known_cgs.insert((  9*A +   0*B +  0*C + 0*D %=   0) / 27);
-  known_cgs.insert((-18*A +  27*B +  0*C + 0*D %=   0) / 27);
-  known_cgs.insert((-90*A + 135*B + 27*C + 0*D %=  27) / 27);
-  known_cgs.insert((-17*A +  25*B +  6*C +   D %=   7) / 27);
+  Grid known_gr(0);
 
-  Grid known_gr(known_cgs);
+  print_congruences(known_gr, "*** known_gr ***");
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
-
   return ok;
 }
 
-// Example from Muller-Olm and Seidl SAS 2005 paper
+// Create grid from const empty zero dimension constraint system.
 bool
 test11() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point(2*A + 0*B));
-  gs.insert(grid_point(30*A + 36*B));
-  gs.insert(grid_point(450*A + 564*B));
+  const Constraint_System cs(Constraint::zero_dim_false());
 
-  Grid gr(2, EMPTY);
-  print_generators(gr, "*** gr ***");
+  Grid gr(cs);
 
-  gr.add_generators_and_minimize(gs);
+  print_congruences(gr, "*** gr(cs) ***");
 
-  Congruence_System known_cgs;
-  known_cgs.insert((A %= 2) / 28);
-  known_cgs.insert((B %= 0) / 12);
+  Grid known_gr(0, EMPTY);
 
-  Grid known_gr(known_cgs);
+  print_congruences(known_gr, "*** known_gr ***");
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
-
   return ok;
 }
 
-// A generator system with only a line.
+// Create grid from const universe zero dimension constraint system.
 bool
 test12() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_line(0*A + 2*B + 0*C));
-
-  try {
-    Grid gr(gs);
-  }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-// A generator system containing a parameter.
-bool
-test13() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*C));
-  gs.insert(grid_line(A));
-  gs.insert(grid_line(B));
-  gs.insert(parameter(-C));
-
-  Grid gr(gs);
-
-  Grid known_gr(3);
-  known_gr.add_congruence(C %= 0);
-
-  bool ok = (gr == known_gr);
+  const Constraint_System cs(Constraint::zero_dim_positivity());
 
-  print_generators(gr, "*** gr(gs) ***");
-
-  return ok;
-}
-
-// Assignment of universe grid, zero dimensions.
-bool
-test14() {
-  Grid gr(0, EMPTY);
+  Grid gr(cs);
 
-  gr = Grid(0);
+  print_congruences(gr, "*** gr(cs) ***");
 
   Grid known_gr(0);
 
-  bool ok = (gr == known_gr);
-
-  print_generators(gr, "*** gr ***");
-
-  return ok;
-}
-
-// Space dimension exception.
-bool
-test15() {
-  try {
-    Grid gr(Grid::max_space_dimension() + 1);
-  }
-  catch (const std::length_error& e) {
-    nout << "length_error: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-// cong_test4 from Chiara Convert_Test.cc.
-bool
-test16() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Congruence_System cgs;
-  cgs.insert((3*A             %= -2) / 3);
-  cgs.insert((5*A + 9*B +   C %= -1) / 3);
-  cgs.insert((        B + 3*C %= -2) / 3);
-  cgs.insert((      2*B + 3*C %= -2) / 3);
-
-  Grid gr(3);
-
-  gr.add_congruences_and_minimize(cgs);
-
-  Grid_Generator_System known_gs;
-  known_gs.insert(grid_point(-2*A + 0*B +  7*C, 3));
-  known_gs.insert(grid_point( 1*A + 0*B +    C, 3));
-  known_gs.insert(grid_point(-2*A + 9*B +  7*C, 3));
-  known_gs.insert(grid_point(-2*A + 0*B + 16*C, 3));
-
-  Grid known_gr(known_gs);
+  print_congruences(known_gr, "*** known_gr ***");
 
   bool ok = (gr == known_gr);
 
-  print_generators(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
-
   return ok;
 }
 
@@ -474,15 +266,11 @@ BEGIN_MAIN
   DO_TEST(test03);
   DO_TEST(test04);
   DO_TEST(test05);
-  DO_TEST_F64(test06);
-  DO_TEST_F32(test07);
-  DO_TEST_F8(test08);
-  DO_TEST_F8(test09);
-  DO_TEST_F8(test10);
-  DO_TEST_F8(test11);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
   DO_TEST(test12);
-  DO_TEST(test13);
-  DO_TEST(test14);
-  DO_TEST(test15);
-  DO_TEST_F8(test16);
 END_MAIN
diff --git a/tests/Grid/griddifference1.cc b/tests/Grid/griddifference1.cc
index 17d2e8a..f914307 100644
--- a/tests/Grid/griddifference1.cc
+++ b/tests/Grid/griddifference1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::grid_difference_assign() (a.k.a. Grid::difference_assign()).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,8 +39,8 @@ test01() {
   gr1.grid_difference_assign(gr2);
 
   Grid known_gr(1, EMPTY);
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(3*A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(3*A));
 
   bool ok = (gr1 == known_gr);
 
@@ -171,16 +171,16 @@ test07() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_point(A - 2*C));
-  gr1.add_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(A - 2*C));
+  gr1.add_grid_generator(grid_point(3*B));
   print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(A));
-  gr2.add_generator(grid_point(A + 2*C));
-  gr2.add_generator(grid_point(3*A));
-  gr2.add_generator(grid_point(A + 3*B));
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(grid_point(A + 2*C));
+  gr2.add_grid_generator(grid_point(3*A));
+  gr2.add_grid_generator(grid_point(A + 3*B));
 
   gr1.grid_difference_assign(gr2);
 
@@ -222,9 +222,9 @@ test09() {
   Variable B(1);
 
   Grid gr1(2, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_line(A));
-  gr1.add_generator(grid_point(B));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_line(A));
+  gr1.add_grid_generator(grid_point(B));
   print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(2);
@@ -249,9 +249,9 @@ test10() {
   Variable B(1);
 
   Grid gr1(2, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_point(A));
-  gr1.add_generator(grid_point(B));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(grid_point(B));
   print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(2);
@@ -325,11 +325,11 @@ test12() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 } // namespace
diff --git a/tests/Grid/intersection1.cc b/tests/Grid/intersection1.cc
index fbf90a3..2facfc8 100644
--- a/tests/Grid/intersection1.cc
+++ b/tests/Grid/intersection1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::intersection_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -239,7 +239,7 @@ test08() {
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generators(gs2);
+  gr2.add_grid_generators(gs2);
   print_generators(gr2, "*** gr2 ***");
 
   gr1.intersection_assign(gr2);
@@ -262,7 +262,7 @@ test08() {
 bool
 test09() {
   Grid gr1(1, EMPTY);
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
 
   Grid gr2(3);
 
@@ -271,11 +271,11 @@ test09() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // intersection_assign_and_minimize: Simple grids, one dimension.
@@ -459,7 +459,7 @@ test16() {
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generators(gs2);
+  gr2.add_grid_generators(gs2);
   print_generators(gr2, "*** gr2 ***");
 
   gr1.intersection_assign_and_minimize(gr2);
@@ -478,6 +478,25 @@ test16() {
   return ok;
 }
 
+// Both empty and both not in minimal form.
+bool
+test17() {
+  Variable A(0);
+  Grid gr1(1);
+  gr1.add_congruence((A %= 1) / 2);
+  gr1.add_congruence((A %= 0) / 2);
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((A %= 0) / 2);
+
+  bool ok = (!gr1.intersection_assign_and_minimize(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -497,4 +516,5 @@ BEGIN_MAIN
   DO_TEST(test14);
   DO_TEST(test15);
   DO_TEST(test16);
+  DO_TEST(test17);
 END_MAIN
diff --git a/tests/Grid/isempty1.cc b/tests/Grid/isempty1.cc
index efbde6e..f38e454 100644
--- a/tests/Grid/isempty1.cc
+++ b/tests/Grid/isempty1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::is_empty().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -156,7 +156,7 @@ test09() {
   gs.insert(grid_line(E));
 
   Grid gr(5);
-  gr.add_generators(gs);
+  gr.add_grid_generators(gs);
 
   bool ok = (!gr.is_empty());
 
diff --git a/tests/Grid/isuniverse1.cc b/tests/Grid/isuniverse1.cc
index 2171295..23a8a59 100644
--- a/tests/Grid/isuniverse1.cc
+++ b/tests/Grid/isuniverse1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::is_universe().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Grid/join1.cc b/tests/Grid/join1.cc
index 48b7263..57e2c8d 100644
--- a/tests/Grid/join1.cc
+++ b/tests/Grid/join1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::join_assign() (a.k.a. Grid::upper_bound_assign()).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -119,7 +119,7 @@ test04() {
 
   Grid gr1(gs1);
 
-  gr1.add_generator(parameter(-C));
+  gr1.add_grid_generator(parameter(-C));
   print_generators(gr1, "*** gr1 ***");
 
   Grid_Generator_System gs2;
@@ -140,45 +140,9 @@ test04() {
   return ok;
 }
 
-// join_assign_and_minimize - Divisor normalization.
-bool
-test05() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid_Generator_System gs1;
-  gs1.insert(grid_point(0*C));
-  gs1.insert(grid_line(A));
-  gs1.insert(grid_line(B));
-
-  Grid gr1(gs1);
-  print_generators(gr1, "*** gr1 ***");
-
-  Grid_Generator_System gs2;
-  gs2.insert(grid_point());
-  gs2.insert(grid_point(C, 3));
-
-  Grid gr2(gs2);
-  print_generators(gr2, "*** gr2 ***");
-
-  gr1.join_assign_and_minimize(gr2);
-
-  Congruence_System known_cgs;
-  known_cgs.insert((3*C %= 0) / 1);
-
-  Grid known_gr(known_cgs);
-
-  bool ok = (gr1 == known_gr);
-
-  print_congruences(gr1, "*** gr1.join_assign_and_minimize(gr2) ***");
-
-  return ok;
-}
-
 // Out-of-date generators in the first grid.
 bool
-test06() {
+test05() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -212,7 +176,7 @@ test06() {
 
 // Out-of-date generators in the second grid.
 bool
-test07() {
+test06() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -246,7 +210,7 @@ test07() {
 
 // Space dimension exception.
 bool
-test08() {
+test07() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -266,16 +230,16 @@ test08() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Out-of-date generators in the first grid, which is empty.
 bool
-test09() {
+test08() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -306,56 +270,51 @@ test09() {
 // Here there is an input and output version of each variable
 // A, B being input and A1, B1 the output.
 bool
-test10() {
+test09() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
   Variable D(3);
 
-  Grid gr0(4); // initial point
+  // initial point
+  Grid gr0(4);
   gr0.add_congruence(A == 2);
   gr0.add_congruence(B == 0);
 
-  Grid gr1(4); // a pass through the procedure may do nothing
+  // a pass through the procedure may do nothing
+  Grid gr1(gr0);
   gr1.add_congruence(A == C);
   gr1.add_congruence(B == D);
 
-  gr1.intersection_assign(gr0); // add the inital point
-  print_congruences(gr1, "*** gr1 ***");
-
-  Grid gr2(4); // one non-trivial pass through procedure
+  // one non-trivial pass through procedure
+  Grid gr2(gr0);
   gr2.add_congruence(15 * A == C);
   gr2.add_congruence(18 * A + B == D);
+  // combine alternative paths 1 and 2
+  gr2.join_assign(gr1);
 
-  gr2.intersection_assign(gr0); // add the inital point
-  print_congruences(gr2, "*** gr2 ***");
-
-  Grid gr3(4); // two non-trivial passes through procedure
+  // two non-trivial passes through procedure
+  Grid gr3(gr0);
   gr3.add_congruence(225 * A == C);
   gr3.add_congruence(282 * A + B == D);
-
-  gr3.intersection_assign(gr0); // add the inital point
-  print_congruences(gr3, "*** gr3 ***");
-
-  gr1.join_assign(gr2); // combine alternative paths 1 and 2
-  print_generators(gr1, "*** gr1.join_assign(gr2) ***");
-  gr1.join_assign(gr3); // combine alternative paths 1, 2 and 3
-  print_generators(gr1, "*** gr1.join_assign(gr3) ***");
+  // combine alternative paths 1, 2 and 3
+  gr3.join_assign(gr2);
 
   Variables_Set vars;
   vars.insert(A);
   vars.insert(B);
 
-  gr1.remove_space_dimensions(vars);
+  gr3.remove_space_dimensions(vars);
 
-  Grid known_gr(2); // as in paper
+  // as in paper
+  Grid known_gr(2);
 
   known_gr.add_congruence((A %= 2) / 28);
   known_gr.add_congruence((B %= 0) / 12);
 
-  bool ok = (gr1 == known_gr);
+  bool ok = (gr3 == known_gr);
 
-  print_congruences(gr1, "*** gr1.remove_space_dimensions(vars) ***");
+  print_congruences(gr3, "*** gr3.remove_space_dimensions(vars) ***");
 
   return ok;
 }
@@ -371,6 +330,5 @@ BEGIN_MAIN
   DO_TEST(test06);
   DO_TEST(test07);
   DO_TEST(test08);
-  DO_TEST(test09);
-  DO_TEST_F8(test10);
+  DO_TEST_F8(test09);
 END_MAIN
diff --git a/tests/Grid/join2.cc b/tests/Grid/join2.cc
index ceb4537..83788d2 100644
--- a/tests/Grid/join2.cc
+++ b/tests/Grid/join2.cc
@@ -1,11 +1,11 @@
 /* Test Grid::join_assign_and_minimize().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -110,7 +110,7 @@ test04() {
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(4, EMPTY);
-  gr2.add_generator(grid_point(2*A));
+  gr2.add_grid_generator(grid_point(2*A));
   print_generators(gr2, "*** gr2 ***");
 
   Grid known_gr = gr2;
@@ -131,8 +131,8 @@ test05() {
   Variable B(1);
 
   Grid gr1(4, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_line(B));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_line(B));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(4, EMPTY);
@@ -301,11 +301,83 @@ test11() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
+}
+
+// join_assign_and_minimize - Divisor normalization.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(0*C));
+  gs1.insert(grid_line(A));
+  gs1.insert(grid_line(B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point());
+  gs2.insert(grid_point(C, 3));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((3*C %= 0) / 1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// Previous test using upper_bound_assign_and_minimize.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(0*C));
+  gs1.insert(grid_line(A));
+  gs1.insert(grid_line(B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point());
+  gs2.insert(grid_point(C, 3));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((3*C %= 0) / 1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_and_minimize(gr2) ***");
+
+  return ok;
 }
 
 } // namespace
@@ -322,4 +394,6 @@ BEGIN_MAIN
   DO_TEST(test09);
   DO_TEST(test10);
   DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
 END_MAIN
diff --git a/tests/Grid/limitedextrapolation1.cc b/tests/Grid/limitedextrapolation1.cc
index 69da938..1a88366 100644
--- a/tests/Grid/limitedextrapolation1.cc
+++ b/tests/Grid/limitedextrapolation1.cc
@@ -1,11 +1,11 @@
-/* Test Grid::limited_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Grid::limited_congruence_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -40,11 +40,11 @@ test01() {
 
   Grid known_gr = gr2;
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -67,11 +67,11 @@ test02() {
 
   Grid known_gr = gr2;
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -96,11 +96,11 @@ test03() {
 
   Congruence_System cgs(B %= 0);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -127,11 +127,11 @@ test04() {
 
   Congruence_System cgs(C %= 0);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -159,11 +159,11 @@ test05() {
 
   Grid known_gr = gr2;
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -179,13 +179,13 @@ test06() {
 
   Congruence_System cgs(0*E %= 0);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   Grid known_gr(5);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -210,13 +210,13 @@ test07() {
   cgs.insert(A %= 0);
   cgs.insert(B %= 0);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   Grid known_gr(cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -242,7 +242,7 @@ test08() {
 
   Grid known_gr = gr2;
 
-  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens);
 
 #undef TOKENS
 #define TOKENS 5
@@ -251,8 +251,7 @@ test08() {
 
   nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
 
-  print_congruences(gr2,
-     "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens) ***");
 
   return ok;
 }
@@ -281,14 +280,13 @@ test09() {
 
   Grid known_gr(2);
 
-  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens);
 
   bool ok = (gr2 == known_gr) && (tokens == TOKENS);
 
   nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
 
-  print_congruences(gr2,
-     "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens) ***");
 
   return ok;
 }
@@ -305,13 +303,13 @@ test10() {
   Congruence_System cgs(
      (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   Grid known_gr(0);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -335,7 +333,7 @@ test11() {
   Congruence_System cgs;
   cgs.insert((A - B == 0) / 3);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   Grid known_gr(2);
   known_gr.add_congruence(A %= 0);
@@ -343,7 +341,7 @@ test11() {
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -356,15 +354,15 @@ test12() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(C, 3));
-  gr1.add_generator(grid_line(A - 2*B));
-  gr1.add_generator(grid_point(C + 3*A + 3*C, 3));
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_line(A - 2*B));
+  gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(C, 3));
-  gr2.add_generator(grid_line(A - 2*B));
-  gr2.add_generator(grid_line(A + C));
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_line(A - 2*B));
+  gr2.add_grid_generator(grid_line(A + C));
   print_generators(gr2, "*** gr2 ***");
 
   Grid known_gr = gr2;
@@ -372,11 +370,11 @@ test12() {
   Congruence_System cgs;
   cgs.insert(A - 0*C == 3);
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
@@ -389,28 +387,28 @@ test13() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(C, 3));
-  gr1.add_generator(grid_point(C + A - 2*B, 3));
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(5, EMPTY);
-  gr2.add_generator(grid_point(C, 3));
-  gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
   print_generators(gr2, "*** gr2 ***");
 
   Congruence_System cgs;
   cgs.insert(A - 0*C == 3);
 
   try {
-    gr2.limited_extrapolation_assign(gr1, cgs);
+    gr2.limited_congruence_extrapolation_assign(gr1, cgs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Exception due to space dimension of congruence system.
@@ -421,28 +419,28 @@ test14() {
   Variable C(2);
 
   Grid gr1(2, EMPTY);
-  gr1.add_generator(grid_point(A));
-  gr1.add_generator(parameter(B, 3));
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(parameter(B, 3));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(2, EMPTY);
-  gr2.add_generator(grid_point(A));
-  gr2.add_generator(parameter(B, 6));
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(parameter(B, 6));
   print_generators(gr2, "*** gr2 ***");
 
   Congruence_System cgs;
   cgs.insert(A - 0*C == 3);
 
   try {
-    gr2.limited_extrapolation_assign(gr1, cgs);
+    gr2.limited_congruence_extrapolation_assign(gr1, cgs);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Limit with an empty congruence system.
@@ -451,26 +449,26 @@ test15() {
   Variable A(0);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(parameter(A, 3));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A, 3));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point());
-  gr2.add_generator(parameter(A, 6));
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A, 6));
   print_generators(gr2, "*** gr2 ***");
 
   Congruence_System cgs;
 
-  gr2.limited_extrapolation_assign(gr1, cgs);
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
 
   Grid known_gr = gr2;
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
 
   return ok;
 }
diff --git a/tests/Grid/limitedextrapolation2.cc b/tests/Grid/limitedextrapolation2.cc
new file mode 100644
index 0000000..e90982a
--- /dev/null
+++ b/tests/Grid/limitedextrapolation2.cc
@@ -0,0 +1,498 @@
+/* Test Grid::limited_generator_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// These tests are clones of tests in limitedextrapolation1.cc but
+// using the generator_widening_assign() instead of the
+// congruence_widening_assign().
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 3);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(B == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B %= 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(B %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(C %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(A + 0*C %= 0);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test06() {
+  Variable E(4);
+
+  Grid gr1(5);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(5);
+
+  Congruence_System cgs(0*E %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 6;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned int tokens = TOKENS;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr(2);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens);
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(
+     (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B == 0) / 27);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 9);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A - B == 0) / 3);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_line(A - 2*B));
+  gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_line(A - 2*B));
+  gr2.add_grid_generator(grid_line(A + C));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(5, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_generator_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(parameter(B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(parameter(B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_generator_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation3.cc b/tests/Grid/limitedextrapolation3.cc
new file mode 100644
index 0000000..8f30359
--- /dev/null
+++ b/tests/Grid/limitedextrapolation3.cc
@@ -0,0 +1,498 @@
+/* Test Grid::limited_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// These tests are clones of tests in limitedextrapolation1.cc but
+// using the widening_assign() instead of the
+// congruence_widening_assign().
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 3);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(B == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B %= 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(B %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(C %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(A + 0*C %= 0);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test06() {
+  Variable E(4);
+
+  Grid gr1(5);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(5);
+
+  Congruence_System cgs(0*E %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 6;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned int tokens = TOKENS;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr(2);
+
+  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(
+     (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B == 0) / 27);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 9);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A - B == 0) / 3);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_line(A - 2*B));
+  gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_line(A - 2*B));
+  gr2.add_grid_generator(grid_line(A + C));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(5, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(parameter(B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(parameter(B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/mapspacedims1.cc b/tests/Grid/mapspacedims1.cc
index 4543c3e..9ce725f 100644
--- a/tests/Grid/mapspacedims1.cc
+++ b/tests/Grid/mapspacedims1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::map_space_dimensions().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -199,10 +199,10 @@ test06() {
   gr.map_space_dimensions(function);
 
   Grid known_gr(4, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(B));
-  known_gr.add_generator(grid_point(2*A));
-  known_gr.add_generator(grid_point(2*A + B));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + B));
 
   bool ok = (gr == known_gr);
 
@@ -234,8 +234,8 @@ test07() {
   gr.map_space_dimensions(function);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
 
   bool ok = (gr == known_gr);
 
@@ -278,18 +278,18 @@ test09() {
   function.insert(1, 0);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(4*A, 2));
-  gr.add_generator(grid_point(4*A + B, 2));
+  gr.add_grid_generator(grid_point(4*A, 2));
+  gr.add_grid_generator(grid_point(4*A + B, 2));
 
   // Force minimization.
-  gr.minimized_generators();
+  gr.minimized_grid_generators();
   print_generators(gr, "*** gr ***");
 
   gr.map_space_dimensions(function);
 
   Grid known_gr(2, EMPTY);
-  known_gr.add_generator(grid_point(4*B, 2));
-  known_gr.add_generator(grid_point(4*B + A, 2));
+  known_gr.add_grid_generator(grid_point(4*B, 2));
+  known_gr.add_grid_generator(grid_point(4*B + A, 2));
 
   bool ok = (gr == known_gr);
 
diff --git a/tests/Grid/maxmin1.cc b/tests/Grid/maxmin1.cc
index 462027a..7b0cf55 100644
--- a/tests/Grid/maxmin1.cc
+++ b/tests/Grid/maxmin1.cc
@@ -1,12 +1,12 @@
 /* Test Grid::maximize(const Linear_Expression&, ...)
    and Grid::minimize(const Linear_Expression&, ...).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,19 +22,21 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
+#include <string>
 
 using namespace Parma_Polyhedra_Library::IO_Operators;
 
 namespace {
 
 bool
-check_both(Grid& gr, Linear_Expression& le, string grid_name) {
-  Grid_Generator ext_pnt(grid_point());
+check_both(Grid& gr, const Linear_Expression& le,
+	   const std::string grid_name) {
+  Generator ext_pnt(point());
   bool dummy;
   Coefficient ext_n, ext_d;
 
-  bool ok = (!gr.minimize(le, ext_n, ext_d, dummy, ext_pnt)
-      && !gr.maximize(le, ext_n, ext_d, dummy, ext_pnt));
+  bool ok = (!gr.maximize(le, ext_n, ext_d, dummy, ext_pnt)
+	     && !gr.minimize(le, ext_n, ext_d, dummy, ext_pnt));
 
   if (!ok)
     nout << grid_name << " bounded expr" << endl;
@@ -43,43 +45,47 @@ check_both(Grid& gr, Linear_Expression& le, string grid_name) {
 }
 
 bool
-check_minimize(Grid& gr, Linear_Expression& le,
-	       Coefficient expected_n, Coefficient expected_d,
-	       Grid_Generator& expected_pnt, string grid_name) {
-  Grid_Generator inf_pnt(grid_point());
+check_minimize(Grid& gr, const Linear_Expression& le,
+	       Coefficient_traits::const_reference expected_n,
+	       Coefficient_traits::const_reference expected_d,
+	       const Generator& expected_pnt,
+	       const std::string grid_name) {
+  Generator inf_pnt(point());
 
   bool dummy;
   Coefficient inf_n, inf_d;
 
   bool ok = (gr.minimize(le, inf_n, inf_d, dummy, inf_pnt)
-    && inf_n == expected_n
-    && inf_d == expected_d
-    && inf_pnt == expected_pnt);
+	     && inf_n == expected_n
+	     && inf_d == expected_d
+	     && inf_pnt == expected_pnt);
 
   if (!ok)
     nout << "grid name " << grid_name << " min point " << inf_pnt
-	        << " (expected " << expected_pnt << ")" << endl;
+	 << " (expected " << expected_pnt << ")" << endl;
 
   return ok;
 }
 
 bool
-check_maximize(Grid& gr, Linear_Expression& le,
-	       Coefficient expected_n, Coefficient expected_d,
-	       Grid_Generator& expected_pnt, string grid_name) {
-  Grid_Generator sup_pnt(grid_point());
+check_maximize(Grid& gr, const Linear_Expression& le,
+	       Coefficient_traits::const_reference expected_n,
+	       Coefficient_traits::const_reference expected_d,
+	       const Generator& expected_pnt,
+	       const std::string grid_name) {
+  Generator sup_pnt(point());
 
   bool dummy;
   Coefficient sup_n, sup_d;
 
   bool ok = (gr.maximize(le, sup_n, sup_d, dummy, sup_pnt)
-    && sup_n == expected_n
-    && sup_d == expected_d
+	     && sup_n == expected_n
+	     && sup_d == expected_d
 	     && sup_pnt == expected_pnt);
 
   if (!ok)
     nout << "grid name " << grid_name << " max point " << sup_pnt
-	        << " (expected " << expected_pnt << ")" << endl;
+	 << " (expected " << expected_pnt << ")" << endl;
 
   return ok;
 }
@@ -91,7 +97,7 @@ test01() {
 
   Coefficient extr_n, extr_d;
   bool dummy;
-  Grid_Generator pnt(grid_point());
+  Generator pnt(point());
 
   bool ok = (!gr.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt)
 	     && !gr.minimize(Linear_Expression(0), extr_n, extr_d, dummy, pnt));
@@ -117,7 +123,7 @@ test03() {
 
   Linear_Expression le = Linear_Expression::zero();
 
-  Grid_Generator exp_pnt(grid_point());
+  Generator exp_pnt(point());
 
   bool ok = check_maximize(gr, le, 0, 1, exp_pnt, "gr")
     && check_minimize(gr, le, 0, 1, exp_pnt, "gr");
@@ -132,11 +138,11 @@ test04() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B, 3));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B, 3));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B, 3));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(2);
@@ -144,12 +150,12 @@ test04() {
   gr_cgs_needs_min.add_congruence(3*B == 2);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = A + B;
 
-  Grid_Generator exp_pnt(grid_point(3*A + 2*B, 3));
+  Generator exp_pnt(point(3*A + 2*B, 3));
 
   bool ok = check_maximize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min")
     && check_minimize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min");
@@ -172,21 +178,21 @@ test05() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(B));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 0);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A - B;
 
@@ -204,21 +210,21 @@ test06() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_line(2*A + B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(2*A + B));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(2*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(2*A + B));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A - 2*B == 0);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A + B;
 
@@ -236,25 +242,25 @@ test07() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_line(A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(A + 2*B));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A + 2*B));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(2*A - B == 0);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A - B;
 
-  Grid_Generator exp_pnt(grid_point(0*B));
+  Generator exp_pnt(point(0*B));
 
   bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
     && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
@@ -277,13 +283,13 @@ test08() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator_and_minimize(grid_point(A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(A + 2*B));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A + 2*B));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(2);
@@ -291,12 +297,12 @@ test08() {
   gr_cgs_needs_min.add_congruence((B %= 0) / 2);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A - B;
 
-  Grid_Generator exp_pnt(grid_point(0*B));
+  Generator exp_pnt(point(0*B));
 
   bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
     && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
@@ -319,22 +325,22 @@ test09() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(A));
-  gr_gs_min.add_generator_and_minimize(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(B));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(A));
-  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(2);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = A - B;
 
@@ -354,15 +360,15 @@ test10() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(A));
-  gr_gs_min.add_generator_and_minimize(grid_point(B + C));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(B + C));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(A));
-  gr_gs_needs_min.add_generator(grid_point(B + C));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(B + C));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(3);
@@ -370,8 +376,8 @@ test10() {
   gr_cgs_needs_min.add_congruence(B %= 0);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A + B - C;
 
@@ -390,27 +396,27 @@ test11() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator(grid_line(3*B + C));
-  gr_gs_min.add_generator_and_minimize(grid_line(A - 2*B));
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(A - 2*B));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_line(3*B + C));
-  gr_gs_needs_min.add_generator(grid_line(A - 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_needs_min.add_grid_generator(grid_line(A - 2*B));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(2*A + B - 3*C - 2 == 0);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = 2*A + B - 3*C;
 
-  Grid_Generator exp_pnt1(grid_point(2*B + 0*C));
+  Generator exp_pnt1(point(2*B + 0*C));
 
   bool ok = check_maximize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min")
     && check_minimize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min");
@@ -418,7 +424,7 @@ test11() {
   ok &= check_maximize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min")
     &&check_minimize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min");
 
-  Grid_Generator exp_pnt2(grid_point(-2*C, 3));
+  Generator exp_pnt2(point(-2*C, 3));
 
   ok &= check_maximize(
           gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min")
@@ -439,11 +445,11 @@ test12() {
   Variable F(5);
 
   Grid gr_gs_min(6, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
   print_generators(gr_gs_min, "*** gr_gs_min ***");
 
   Grid gr_gs_needs_min(6, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+  gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
 
   Grid gr_cgs_needs_min(6);
@@ -455,12 +461,12 @@ test12() {
   gr_cgs_needs_min.add_congruence(F == 19);
   print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
 
-  Grid_Generator exp_pnt(grid_point(7*A - 11*B + 19*F));
+  Generator exp_pnt(point(7*A - 11*B + 19*F));
 
   bool ok = check_maximize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min")
     && check_minimize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min");
diff --git a/tests/Grid/membytes1.cc b/tests/Grid/membytes1.cc
index 9a2d3de..861a49a 100644
--- a/tests/Grid/membytes1.cc
+++ b/tests/Grid/membytes1.cc
@@ -1,12 +1,12 @@
 /* Test Grid::total_memory_in_bytes() and
    Grid::external_memory_in_bytes().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,10 +38,10 @@ add_congruence(Grid& gr, const Congruence& cg) {
 }
 
 void
-add_generator(Grid& gr, const Grid_Generator& g) {
+add_grid_generator(Grid& gr, const Grid_Generator& g) {
   const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
   const memory_size_type g_memory = g.total_memory_in_bytes();
-  gr.add_generator(g);
+  gr.add_grid_generator(g);
   const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
   nout << gr_memory_before
        << " + " << g_memory
@@ -52,7 +52,7 @@ add_generator(Grid& gr, const Grid_Generator& g) {
 void
 minimize(Grid& gr) {
   const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
-  (void) gr.minimized_generators();
+  (void) gr.minimized_grid_generators();
   const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
   nout << gr_memory_before
        << " -m-> " << gr_memory_after
@@ -142,7 +142,7 @@ test01() {
   const Congruence_System& cgs = gr1.congruences();
   const memory_size_type cgs_total_size = cgs.total_memory_in_bytes();
   const memory_size_type cgs_external_size = cgs.external_memory_in_bytes();
-  const Grid_Generator_System& gs = gr1.generators();
+  const Grid_Generator_System& gs = gr1.grid_generators();
   const memory_size_type gs_total_size = gs.total_memory_in_bytes();
   const memory_size_type gs_external_size = gs.external_memory_in_bytes();
 
@@ -168,7 +168,7 @@ test01() {
   unsigned n = 0;
   for (Grid_Generator_System::const_iterator i = gs.begin(),
 	 gs_end = gs.end(); i != gs_end; ++i) {
-    add_generator(gr2, *i);
+    add_grid_generator(gr2, *i);
     if (++n % 4 == 0)
       minimize(gr2);
   }
@@ -231,7 +231,7 @@ test02() {
        << "dgr.external_memory_in_bytes() = " << dgr_external_size
        << endl;
 
-  Polyhedra_Powerset<Grid> pgr1(gr1);
+  Pointset_Powerset<Grid> pgr1(gr1);
 
   Grid gr2(3);
   gr2.add_constraint(x >= 0);
@@ -240,23 +240,17 @@ test02() {
   gr2.add_constraint(x <= 1);
   gr2.add_constraint(y <= 1);
   gr2.add_constraint(z <= 1);
-  Polyhedra_Powerset<Grid> pgr2(gr2);
+  Pointset_Powerset<Grid> pgr2(gr2);
 
-  // TODO: Include these sections when poly_difference_assign is
-  //       defined for Grid.
-#if 0
-  Polyhedra_Powerset<Grid> p2gr2 = pgr2;
+  Pointset_Powerset<Grid> p2gr2 = pgr2;
   p2gr2.poly_difference_assign(pgr1);
-#endif
 
   const memory_size_type pgr1_total_size = pgr1.total_memory_in_bytes();
   const memory_size_type pgr1_external_size = pgr1.external_memory_in_bytes();
   const memory_size_type pgr2_total_size = pgr2.total_memory_in_bytes();
   const memory_size_type pgr2_external_size = pgr2.external_memory_in_bytes();
-#if 0
   const memory_size_type p2gr2_total_size = p2gr2.total_memory_in_bytes();
   const memory_size_type p2gr2_external_size = p2gr2.external_memory_in_bytes();
-#endif
 
   nout << "pgr1.total_memory_in_bytes() = " << pgr1_total_size
        << endl
@@ -265,12 +259,10 @@ test02() {
        << "pgr2.total_memory_in_bytes() = " << pgr2_total_size
        << endl
        << "pgr2.external_memory_in_bytes() = " << pgr2_external_size
-#if 0
        << endl
        << "p2gr2.total_memory_in_bytes() = " << p2gr2_total_size
        << endl
        << "p2gr2.external_memory_in_bytes() = " << p2gr2_external_size
-#endif
        << endl;
 
   return true;
diff --git a/tests/Grid/mincongruences1.cc b/tests/Grid/mincongruences1.cc
index aeab564..e3e6c92 100644
--- a/tests/Grid/mincongruences1.cc
+++ b/tests/Grid/mincongruences1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::minimized_congruences().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -73,6 +73,10 @@ test03() {
 
   Congruence_System cgs = gr1.minimized_congruences();
 
+  gr1.OK();
+
+  print_congruences(gr1, "*** gr1(cgs) ***");
+
   Grid gr2(cgs);
 
   bool ok = (gr2 == known_gr);
@@ -92,6 +96,10 @@ test04() {
 
   Congruence_System cgs = gr1.minimized_congruences();
 
+  gr1.OK();
+
+  print_congruences(gr1, "*** gr1(cgs) ***");
+
   Grid gr2(cgs);
 
   bool ok = (gr2 == known_gr);
@@ -177,7 +185,6 @@ test07() {
 }
 
 // Empty grid, where minimizing the congruences finds the grid empty.
-
 bool
 test08() {
   Variable A(0);
diff --git a/tests/Grid/mingenerators1.cc b/tests/Grid/mingenerators1.cc
index 55b3b8b..a48ccb4 100644
--- a/tests/Grid/mingenerators1.cc
+++ b/tests/Grid/mingenerators1.cc
@@ -1,11 +1,11 @@
-/* Test Grid::minimized_generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Grid::minimized_grid_generators().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -32,7 +32,7 @@ test01() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
@@ -52,7 +52,7 @@ test02() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
@@ -70,7 +70,7 @@ test03() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
@@ -89,7 +89,7 @@ test04() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
@@ -108,17 +108,17 @@ test05() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*B));
-  gr1.add_generator(grid_point(5*A + 2*B));
-  gr1.add_generator(grid_point(10*A + B));
-  gr1.add_generator(grid_point(7*B));
-  gr1.add_generator(grid_point(3*B + 4*C));
-  gr1.add_generator(grid_line(C));
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(grid_point(10*A + B));
+  gr1.add_grid_generator(grid_point(7*B));
+  gr1.add_grid_generator(grid_point(3*B + 4*C));
+  gr1.add_grid_generator(grid_line(C));
   print_generators(gr1, "*** gr1 ***");
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
@@ -142,7 +142,7 @@ test06() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
@@ -159,11 +159,11 @@ bool
 test07() {
   Grid gr1(2, EMPTY);
 
-  const Grid_Generator_System& gs = gr1.minimized_generators();
+  const Grid_Generator_System& gs = gr1.minimized_grid_generators();
 
   // Add a point.  The idea is to check that `gs' still refers to a
   // generator system that matches the grid.
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
   print_generators(gr1, "*** gr1 ***");
 
   Grid known_gr = gr1;
@@ -183,7 +183,7 @@ bool
 test08() {
   Grid gr1(0);
 
-  const Grid_Generator_System& gs = gr1.minimized_generators();
+  const Grid_Generator_System& gs = gr1.minimized_grid_generators();
 
   // Empty the grid.  The idea is to check that `gs' still refers to a
   // generator system that matches the grid.
@@ -213,7 +213,7 @@ test09() {
 
   Grid known_gr = gr1;
 
-  Grid_Generator_System gs = gr1.minimized_generators();
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
 
   Grid gr2(gs);
 
diff --git a/tests/Grid/outputoperator1.cc b/tests/Grid/outputoperator1.cc
index 726c35c..ed5a5c3 100644
--- a/tests/Grid/outputoperator1.cc
+++ b/tests/Grid/outputoperator1.cc
@@ -1,11 +1,11 @@
 /* Test IO_Operators::operator<<(s, gr).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,6 +21,7 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
+#include <sstream>
 
 using namespace Parma_Polyhedra_Library::IO_Operators;
 
@@ -31,12 +32,12 @@ bool
 test01() {
   Grid gr1(1, EMPTY);
 
-  stringstream ss1;
+  std::stringstream ss1;
   ss1 << gr1;
 
   Grid gr2(1);
 
-  stringstream ss2;
+  std::stringstream ss2;
   ss2 << gr2;
 
   bool ok = (ss2.str().compare(ss1.str()));
@@ -49,12 +50,12 @@ bool
 test02() {
   Grid gr1(3, EMPTY);
 
-  stringstream ss1;
+  std::stringstream ss1;
   ss1 << gr1;
 
   Grid gr2(3);
 
-  stringstream ss2;
+  std::stringstream ss2;
   ss2 << gr2;
 
   bool ok = (ss2.str().compare(ss1.str()));
@@ -67,12 +68,12 @@ bool
 test03() {
   Grid gr1(4, EMPTY);
 
-  stringstream ss1;
+  std::stringstream ss1;
   ss1 << gr1;
 
   Grid gr2(3);
 
-  stringstream ss2;
+  std::stringstream ss2;
   ss2 << gr2;
 
   bool ok = (ss2.str().compare(ss1.str()));
@@ -87,16 +88,16 @@ test04() {
   Variable C(2);
 
   Grid gr1(4, EMPTY);
-  gr1.add_generator(grid_point(3*A + C));
-  gr1.add_generator(parameter(3*A));
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
 
-  stringstream ss1;
+  std::stringstream ss1;
   ss1 << gr1;
 
   Grid gr2(4);
   gr2.add_congruence(3*A == 0);
 
-  stringstream ss2;
+  std::stringstream ss2;
   ss2 << gr2;
 
   bool ok = (ss2.str().compare(ss1.str()));
@@ -111,16 +112,16 @@ test05() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(3*A + C));
-  gr1.add_generator(parameter(3*A));
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
 
-  stringstream ss1;
+  std::stringstream ss1;
   ss1 << gr1;
 
   Grid gr2(4);
   gr2.add_congruence(3*A == 0);
 
-  stringstream ss2;
+  std::stringstream ss2;
   ss2 << gr2;
 
   bool ok = (ss2.str().compare(ss1.str()));
diff --git a/tests/Grid/outputoperator2.cc b/tests/Grid/outputoperator2.cc
new file mode 100644
index 0000000..c59769b
--- /dev/null
+++ b/tests/Grid/outputoperator2.cc
@@ -0,0 +1,99 @@
+/* Test Grid_Generator IO operators.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Point.
+bool
+test01() {
+  std::stringstream ss1;
+  ss1 << grid_point();
+
+  std::stringstream ss2;
+  ss2 << Grid_Generator::zero_dim_point();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Point type.
+bool
+test02() {
+  std::stringstream ss1;
+  ss1 << grid_point().type();
+
+  std::stringstream ss2;
+  ss2 << Grid_Generator::zero_dim_point().type();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Parameter type.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  std::stringstream ss1;
+  ss1 << parameter(B).type();
+
+  std::stringstream ss2;
+  ss2 << parameter(A).type();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Line type.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  std::stringstream ss1;
+  ss1 << grid_line(2*A).type();
+
+  std::stringstream ss2;
+  ss2 << grid_line(3*A).type();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/outputoperator3.cc b/tests/Grid/outputoperator3.cc
new file mode 100644
index 0000000..aafb892
--- /dev/null
+++ b/tests/Grid/outputoperator3.cc
@@ -0,0 +1,90 @@
+/* Test Grid_Generator_System IO operators.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Single point.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs1(grid_point(A + 7*B));
+
+  std::stringstream ss1;
+  ss1 << gs1;
+
+  print_generators(gs1, "*** gs1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A + 7*B));
+
+  std::stringstream ss2;
+  ss2 << gs2;
+
+  print_generators(gs2, "*** gs2 ***");
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Many generators.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1(grid_point(A + 7*B));
+  gs1.insert(parameter(2*C));
+
+  std::stringstream ss1;
+  ss1 << gs1;
+
+  print_generators(gs1, "*** gs1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A + 7*B));
+  gs2.insert(parameter(2*C));
+
+  std::stringstream ss2;
+  ss2 << gs2;
+
+  print_generators(gs2, "*** gs2 ***");
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/partition1.cc b/tests/Grid/partition1.cc
new file mode 100644
index 0000000..764881e
--- /dev/null
+++ b/tests/Grid/partition1.cc
@@ -0,0 +1,108 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions the grid \p qq according to the congruence \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p qq and congruence \p c is stored
+  in \p qq, whereas the intersection of \p qq with the negation of \p c
+  is added, as a set of new disjuncts, to the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+partition_aux(const Congruence& c,
+	      Grid& qq,
+	      Pointset_Powerset<Grid>& r) {
+  const Coefficient& c_modulus = c.modulus();
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+  Linear_Expression le(c);
+  le -= c_inhomogeneous_term;
+  TEMP_INTEGER(n);
+  rem_assign(n, c_inhomogeneous_term, c_modulus);
+  TEMP_INTEGER(i);
+  for (i = c_modulus; i-- > 0; )
+    if (i != n) {
+      Grid qqq(qq);
+      if (qqq.add_congruence_and_minimize((le+i %= 0) / c_modulus))
+	r.add_disjunct(qqq);
+    }
+  qq.add_congruence(c);
+}
+
+/*! \relates Pointset_Powerset */
+std::pair<Grid, Pointset_Powerset<Grid> >
+partition(const Grid& p, const Grid& q) {
+  Pointset_Powerset<Grid> r(p.space_dimension(), EMPTY);
+  Grid qq = q;
+  const Congruence_System& pcs = p.congruences();
+  for (Congruence_System::const_iterator i = pcs.begin(),
+	 pcs_end = pcs.end(); i != pcs_end; ++i)
+    partition_aux(*i, qq, r);
+  return std::pair<Grid, Pointset_Powerset<Grid> >(qq, r);
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  Grid q(2);
+  q.add_congruence((x %= 4) / 9);
+
+  nout << "q = " << q << endl;
+
+  std::pair<Grid, Pointset_Powerset<Grid> >
+    result = partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+#if 0
+  if (!aux_test03(p, q, result))
+    return false;
+#endif
+
+  result = partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+#if 0
+  return aux_test03(q, p, result);
+#endif
+
+  return true;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/pointsetpowerset1.cc b/tests/Grid/pointsetpowerset1.cc
new file mode 100644
index 0000000..3671240
--- /dev/null
+++ b/tests/Grid/pointsetpowerset1.cc
@@ -0,0 +1,481 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of grids from a grid.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(4);
+  gr.add_congruence(x %= 2);
+  gr.add_congruence(z == 1);
+
+  Pointset_Powerset<Grid> pps1(gr);
+  Pointset_Powerset<Grid> pps2(4, EMPTY);
+  pps2.add_disjunct(gr);
+
+  bool ok = (pps1 == pps2);
+
+  print_congruences(gr, "*** gr ***");
+  Pointset_Powerset<Grid>::const_iterator i = pps1.begin();
+  Grid gri = i->element();
+  print_congruences(gri, "*** gri ***");
+  Pointset_Powerset<Grid>::const_iterator i2 = pps2.begin();
+  Grid gri2 = i2->element();
+  print_congruences(gri2, "*** gri2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of grids from an empty grid.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(gr);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + z <= 3);
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x >= 2);
+  ph1.add_constraint(z >= 1);
+  ph1.add_constraint(x + z <= 3);
+
+  // With the default complexity, the implied equalities x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<Grid> pps(ph);
+  // With the polynomial complexity, no implied equalities are found.
+  Pointset_Powerset<Grid> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(4);
+  known_pps.add_congruence((x %= 2) / 0);
+  known_pps.add_congruence((z %= 1) / 0);
+  Pointset_Powerset<Grid> known_pps1(4);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid gri = i->element();
+  print_congruences(gri, "*** gri ***");
+  Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+  Grid gri1 = i1->element();
+  print_congruences(gri1, "*** gri1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of grids from a polyhedron whose constraints
+// are inconsistent (i.e., is empty but not marked as empty).
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + z <= 2);
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x >= 2);
+  ph1.add_constraint(z >= 1);
+  ph1.add_constraint(x + z <= 2);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<Grid> pps(ph);
+  // With the polynomial complexity, the built powerset is the universe.
+  Pointset_Powerset<Grid> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(4, EMPTY);
+  Pointset_Powerset<Grid> known_pps1(4);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+  Grid gri1 = i1->element();
+  print_congruences(gri1, "*** gri1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of grids from an empty polyhedron.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(ph);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a bd shape.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<Grid> pps(bds);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_congruence((x %= 0) / 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid phi = i->element();
+  print_congruences(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an empty bd shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(bds);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an octagonal shape.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x >= 0);
+  os.add_constraint(x + y <= 4);
+  os.add_constraint(x - y == 3);
+  os.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<Grid> pps(os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x - y == 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid phi = i->element();
+  print_congruences(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an empty octagonal shape.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(os);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a box.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x == 1);
+  box.add_constraint(y >= 0);
+
+  Pointset_Powerset<Grid> pps(box);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid phi = i->element();
+  print_congruences(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an empty box.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(box);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of grids.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2);
+  grid.add_congruence((2*x %= 1) / 0);
+  grid.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(grid);
+
+  Pointset_Powerset<Grid> pps(pps_gr);
+
+  Pointset_Powerset<Grid> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+  known_pps.add_congruence(y %= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid gri = i->element();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of polyhedra.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<Grid> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<Grid> pps2(pps2_c);
+
+  Pointset_Powerset<Grid> known_pps1(2);
+  Pointset_Powerset<Grid> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+  Grid gri1 = i1->element();
+  print_congruences(gri1, "*** gri1 ***");
+
+  Pointset_Powerset<Grid>::const_iterator i2 = pps2.begin();
+  Grid gri2 = i2->element();
+  print_congruences(gri2, "*** gri2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of bd shapes.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bd(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_bd = pps_bd.begin();
+  TBD_Shape bdi = i_bd->element();
+  print_constraints(bdi, "*** bdi ***");
+
+  // The complexity should be ignored.
+  Pointset_Powerset<Grid> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+  Grid gri = i_gr->element();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of octagonal shapes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps_os.begin();
+  TOctagonal_Shape osi = i_os->element();
+  print_constraints(osi, "*** osi ***");
+
+  // The complexity should be ignored.
+  Pointset_Powerset<Grid> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+  Grid gri = i_gr->element();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of boxes.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox>::const_iterator i_box = pps_box.begin();
+  TBox boxi = i_box->element();
+  print_constraints(boxi, "*** boxi ***");
+
+  // The complexity should be ignored.
+  Pointset_Powerset<Grid> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+  Grid gri = i_gr->element();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/powersetdifference1.cc b/tests/Grid/powersetdifference1.cc
new file mode 100644
index 0000000..73594a7
--- /dev/null
+++ b/tests/Grid/powersetdifference1.cc
@@ -0,0 +1,314 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 1) / 3);
+  q.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+
+  Grid known_gr1(2);
+  known_gr1.add_congruence((x %= 0) / 1);
+  known_gr1.add_congruence((y %= 0) / 2);
+
+  Grid known_gr2(2);
+  known_gr2.add_congruence((x %= 2) / 3);
+  known_gr2.add_congruence((y %= 1) / 2);
+
+  Grid known_gr3(2);
+  known_gr3.add_congruence((x %= 0) / 3);
+  known_gr3.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> known_qs(2, EMPTY);
+  known_qs.add_disjunct(known_gr1);
+  known_qs.add_disjunct(known_gr2);
+  known_qs.add_disjunct(known_gr3);
+
+  bool ok = (ps == known_qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(x == 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+  print_congruences(ps, "*** ps.poly_difference(qs) ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((x %= 0) / 1);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return (i->element() == known_gr);
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x == 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(x %= 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+  print_congruences(ps, "*** ps.poly_difference(qs) ***");
+
+  return (ps.begin() == ps.end());
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+  print_congruences(ps, "*** ps.poly_difference(qs) ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((x %= 0) / 1);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return (i->element() == known_gr);
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+  print_congruences(ps, "*** ps.poly_difference(qs) ***");
+
+  return (ps.begin() == ps.end());
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+  print_congruences(ps, "*** ps.poly_difference(qs) ***");
+
+  Grid known_gr(p);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return (i->element() == known_gr);
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.poly_difference_assign(qs);
+  print_congruences(ps, "*** ps.poly_difference(qs) ***");
+
+  Grid known_gr(p);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return (i->element() == known_gr);
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 1) / 3);
+  q.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+
+  Grid known_gr1(2);
+  known_gr1.add_congruence((x %= 0) / 1);
+  known_gr1.add_congruence((y %= 0) / 2);
+
+  Grid known_gr2(2);
+  known_gr2.add_congruence((x %= 2) / 3);
+  known_gr2.add_congruence((y %= 1) / 2);
+
+  Grid known_gr3(2);
+  known_gr3.add_congruence((x %= 0) / 3);
+  known_gr3.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> known_qs(2, EMPTY);
+  known_qs.add_disjunct(known_gr1);
+  known_qs.add_disjunct(known_gr2);
+  known_qs.add_disjunct(known_gr3);
+
+  bool ok = (ps == known_qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x == 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 0) / 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return (ps.is_empty());
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/powersetgeometricallycovers1.cc b/tests/Grid/powersetgeometricallycovers1.cc
new file mode 100644
index 0000000..c997513
--- /dev/null
+++ b/tests/Grid/powersetgeometricallycovers1.cc
@@ -0,0 +1,180 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 1) / 3);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(x == 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_covers(qs) && qs.geometrically_covers(ps);
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+  Grid p3(2);
+  p3.add_congruence((x %= 2) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+  ps.add_disjunct(p3);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_covers(qs);
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+  Grid p3(2);
+  p3.add_congruence((x %= 2) / 3);
+  p3.add_congruence((y %= 2) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+  ps.add_disjunct(p3);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_covers(qs);
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/powersetgeometricallyequals1.cc b/tests/Grid/powersetgeometricallyequals1.cc
new file mode 100644
index 0000000..7e70dee
--- /dev/null
+++ b/tests/Grid/powersetgeometricallyequals1.cc
@@ -0,0 +1,113 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 2);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 2);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_equals(qs);
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_equals(qs);
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+  Grid p3(2);
+  p3.add_congruence((x %= 2) / 3);
+  p3.add_congruence((y %= 2) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+  ps.add_disjunct(p3);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+  q.add_congruence((y %= 1) / 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_equals(qs);
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Grid/refinewithcongruences1.cc b/tests/Grid/refinewithcongruences1.cc
new file mode 100644
index 0000000..3bf408e
--- /dev/null
+++ b/tests/Grid/refinewithcongruences1.cc
@@ -0,0 +1,135 @@
+/* Test refine_with_congruence() and refine_with_congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// refine_with_congruence()
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B %= 1) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruence((A %= 0) / 2);
+  gr.refine_with_congruence((B %= 1) / 2);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_congruence() ***");
+
+  return ok;
+}
+
+// refine_with_congruences()
+bool
+test02() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B %= 4) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 4) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.refine_with_congruence(A + C %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Space dimension exception.
+bool
+test04() {
+  Variable A(0);
+  Variable B(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B %= 4) / 2);
+
+  Grid gr(1);
+
+  try {
+    gr.refine_with_congruences(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/refinewithconstraints1.cc b/tests/Grid/refinewithconstraints1.cc
new file mode 100644
index 0000000..a7503fd
--- /dev/null
+++ b/tests/Grid/refinewithconstraints1.cc
@@ -0,0 +1,132 @@
+/* Test refine_with_constraint() and refine_with_constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// refine_with_constraint()
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 2) / 0);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraint(A >= 2);
+  gr.refine_with_constraint(B == 2);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+  return ok;
+}
+
+// refine_with_constraints()
+bool
+test02() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 3);
+  cs.insert(2*B == 3);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraints(cs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((2*B %= 3) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.refine_with_constraint(A + C >= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Space dimension exception.
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + C >= 0);
+
+  Grid gr(2);
+
+  try {
+    gr.refine_with_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/relations1.cc b/tests/Grid/relations1.cc
index 3972058..f4286f9 100644
--- a/tests/Grid/relations1.cc
+++ b/tests/Grid/relations1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::relation_with(g).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -71,23 +71,21 @@ test03() {
 }
 
 // Equality and point.
-
 bool
 test04() {
   Variable A(0);
 
   Grid gr(2);
-  gr.add_congruence((A %= 0) / 0);
+  gr.add_congruence(A == 0);
   print_congruences(gr, "*** gr ***");
 
   bool ok
-     = (gr.relation_with(grid_point(2*A)) == Poly_Gen_Relation::nothing());
+    = (gr.relation_with(grid_point(2*A)) == Poly_Gen_Relation::nothing());
 
   return ok;
 }
 
 // Congruences and points.
-
 bool
 test05() {
   Variable A(0);
@@ -99,13 +97,12 @@ test05() {
   print_congruences(gr, "*** gr ***");
 
   bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::nothing()
-       && gr.relation_with(grid_point(-B)) == Poly_Gen_Relation::nothing());
+	     && gr.relation_with(grid_point(-B)) == Poly_Gen_Relation::nothing());
 
   return ok;
 }
 
 // Congruence and parameter.
-
 bool
 test06() {
   Variable A(0);
@@ -121,7 +118,6 @@ test06() {
 }
 
 // Congruence and line.
-
 bool
 test07() {
   Variable A(0);
@@ -148,11 +144,11 @@ test08() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Zero dimension universe grid.
@@ -165,6 +161,185 @@ test09() {
   return ok;
 }
 
+// Empty grid and point.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(2, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(point(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Universe and point.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(point(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and point.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(point(A + B)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Equality and point.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(A == 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(point(2*A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruences and points.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A - B %= 1) / 2);
+  gr.add_congruence((A %= 1) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(point()) == Poly_Gen_Relation::nothing()
+	     && gr.relation_with(point(-B)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruence and parameter.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(ray(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruence and line.
+bool
+test16() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(line(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test17() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.relation_with(line(A + C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Zero dimension universe grid.
+bool
+test18() {
+  Grid gr(0);
+
+  bool ok = (gr.relation_with(point()) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and line.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(line(A + B)) == Poly_Gen_Relation::nothing()
+       && gr.relation_with(line(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and line.
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(closure_point(A + B)) == Poly_Gen_Relation::subsumes()
+       && gr.relation_with(closure_point(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -177,4 +352,15 @@ BEGIN_MAIN
   DO_TEST(test07);
   DO_TEST(test08);
   DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
 END_MAIN
diff --git a/tests/Grid/relations2.cc b/tests/Grid/relations2.cc
index 42b7d46..baea3b7 100644
--- a/tests/Grid/relations2.cc
+++ b/tests/Grid/relations2.cc
@@ -1,11 +1,11 @@
 /* Test Grid::relation_with(cg).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,7 +31,7 @@ test01() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(A - B));
+  gr.add_grid_generator(grid_point(A - B));
   print_generators(gr, "*** gr ***");
 
   bool ok
@@ -46,8 +46,8 @@ test02() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(4*A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(4*A));
   print_generators(gr, "*** gr ***");
 
   bool ok
@@ -63,12 +63,13 @@ test03() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
   print_generators(gr, "*** gr ***");
 
   bool ok
-    =  (gr.relation_with((A + C %= 0) / 3) == Poly_Con_Relation::strictly_intersects());
+    =  (gr.relation_with((A + C %= 0) / 3)
+        == Poly_Con_Relation::strictly_intersects());
 
   return ok;
 }
@@ -80,25 +81,27 @@ test04() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_line(A));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A));
   print_generators(gr, "*** gr ***");
 
   bool ok
-     = (gr.relation_with((A + 0*B %= 0) / 0) == Poly_Con_Relation::strictly_intersects()
-	&& gr.relation_with((B + 0*B %= -2) / 0) == Poly_Con_Relation::is_disjoint());
+    = (gr.relation_with((A + 0*B %= 0) / 0)
+         == Poly_Con_Relation::strictly_intersects()
+       && gr.relation_with((B + 0*B %= -2) / 0)
+         == Poly_Con_Relation::is_disjoint());
 
   return ok;
 }
 
-// Inclusion of a point.
+// Inclusion of a point grid.
 bool
 test05() {
   Variable A(0);
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(A + B));
   print_generators(gr, "*** gr ***");
 
   bool ok
@@ -117,8 +120,9 @@ test06() {
   print_generators(gr, "*** gr ***");
 
   bool ok = (gr.relation_with((B %= 0) / 2)
-      == (Poly_Con_Relation::is_included()
-	  && Poly_Con_Relation::is_disjoint()));
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+		 && Poly_Con_Relation::saturates()));
 
   return ok;
 }
@@ -131,26 +135,30 @@ test07() {
 
   bool ok
     = (// Trivially false congruence.
-      gr.relation_with(Congruence::zero_dim_false())
-      == Poly_Con_Relation::is_disjoint()
-      // False congruence.
-      && gr.relation_with((Linear_Expression(5) %= 1) / 3)
-      == Poly_Con_Relation::is_disjoint()
-      // False equality.
-      && gr.relation_with((Linear_Expression(1) %= 0) / 0)
-      == Poly_Con_Relation::is_disjoint()
-      // Proper congruence.
-      && gr.relation_with(Linear_Expression(1) %= 1)
-      == Poly_Con_Relation::is_included()
-      // Proper congruence.
-      && gr.relation_with((Linear_Expression(5) %= 1) / 4)
-      == Poly_Con_Relation::is_included()
-      // Equality.
-      && gr.relation_with(Linear_Expression(1) %= 1)
-      == Poly_Con_Relation::is_included()
-      // Integrality congruence.
-      && gr.relation_with(Congruence::zero_dim_integrality())
-      == Poly_Con_Relation::is_included());
+       gr.relation_with(Congruence::zero_dim_false())
+       == Poly_Con_Relation::is_disjoint()
+       // False congruence.
+       && gr.relation_with((Linear_Expression(5) %= 1) / 3)
+       == Poly_Con_Relation::is_disjoint()
+       // False equality.
+       && gr.relation_with((Linear_Expression(1) %= 0) / 0)
+       == Poly_Con_Relation::is_disjoint()
+       // Proper congruence.
+       && gr.relation_with(Linear_Expression(1) %= 1)
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::saturates())
+       // Proper congruence.
+       && gr.relation_with((Linear_Expression(5) %= 1) / 4)
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::saturates())
+       // Equality.
+       && gr.relation_with(Linear_Expression(1) %= 1)
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::saturates())
+       // Integrality congruence.
+       && gr.relation_with(Congruence::zero_dim_integrality())
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::saturates()));
 
   return ok;
 }
@@ -162,13 +170,13 @@ test08() {
   Variable B(1);
 
   Grid gr(2, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(2*A + 5*B));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A + 5*B));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with((5*A - 2*B == 1) / 0)
-      == Poly_Con_Relation::is_disjoint());
+       == Poly_Con_Relation::is_disjoint());
 
   return ok;
 }
@@ -195,32 +203,33 @@ test10() {
   Variable A(0);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point(A, 2));
+  gr.add_grid_generator(grid_point(A, 2));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with((A %= 3) / 0)
-      == Poly_Con_Relation::is_disjoint()
-      && gr.relation_with((2*A %= 1) / 0)
-      == Poly_Con_Relation::is_included()
-      && gr.relation_with(2*A %= 1)
-      == Poly_Con_Relation::is_included());
+       == Poly_Con_Relation::is_disjoint()
+       && gr.relation_with((2*A %= 1) / 0)
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::saturates())
+       && gr.relation_with(2*A %= 1)
+       == Poly_Con_Relation::is_included());
 
   return ok;
 }
 
-// Grid with a divisor that is greater than zero: seperate spaces.
+// Grid with a divisor that is greater than zero: separate spaces.
 bool
 test11() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(parameter(A, 5));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
   print_generators(gr, "*** gr ***");
 
   bool ok = (gr.relation_with((10*A %= 1) / 0)
-      == Poly_Con_Relation::is_disjoint());
+	     == Poly_Con_Relation::is_disjoint());
 
   return ok;
 }
@@ -231,13 +240,13 @@ test12() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(parameter(A, 5));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with((10*A %= 0) / 1)
-      == Poly_Con_Relation::is_included());
+       == Poly_Con_Relation::is_included());
 
   return ok;
 }
@@ -248,13 +257,13 @@ test13() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(parameter(A, 5));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with(A %= 0)
-      == Poly_Con_Relation::strictly_intersects());
+       == Poly_Con_Relation::strictly_intersects());
 
   return ok;
 }
@@ -273,11 +282,11 @@ test14() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Empty grid, where updating finds the grid empty.
@@ -293,8 +302,9 @@ test15() {
 
   bool ok
     = (gr.relation_with((B %= 0) / 2)
-        == (Poly_Con_Relation::is_included()
-	    && Poly_Con_Relation::is_disjoint()));
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::is_disjoint()
+	   && Poly_Con_Relation::saturates()));
 
   return ok;
 }
@@ -305,13 +315,13 @@ test16() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point(A));
-  gr.add_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(3*A));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with((A %= 0) / 4)
-      == Poly_Con_Relation::is_disjoint());
+       == Poly_Con_Relation::is_disjoint());
 
   return ok;
 }
@@ -323,13 +333,13 @@ test17() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point(3*A));
-  gr.add_generator(grid_point(6*A));
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(6*A));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with((A %= 0) / 8)
-      == Poly_Con_Relation::strictly_intersects());
+       == Poly_Con_Relation::strictly_intersects());
 
   return ok;
 }
@@ -341,13 +351,48 @@ test18() {
   Variable A(0);
 
   Grid gr(1, EMPTY);
-  gr.add_generator(grid_point(3*A));
-  gr.add_generator(parameter(3*A));
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(parameter(3*A));
   print_generators(gr, "*** gr ***");
 
   bool ok
     = (gr.relation_with((A %= 0) / 8)
-      == Poly_Con_Relation::strictly_intersects());
+       == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// generators are not up-to-date and the grid is empty.
+bool
+test19() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 8)
+       == (Poly_Con_Relation::is_included()
+	   && Poly_Con_Relation::is_disjoint()
+	   && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Grid strictly intersects where the inhomogeneous term is non-zero.
+bool
+test20() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence((A %= 0) / 1);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((2*A %= 1) / 3)
+       == (Poly_Con_Relation::strictly_intersects()));
 
   return ok;
 }
@@ -373,4 +418,6 @@ BEGIN_MAIN
   DO_TEST(test16);
   DO_TEST(test17);
   DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
 END_MAIN
diff --git a/tests/Grid/relations3.cc b/tests/Grid/relations3.cc
new file mode 100644
index 0000000..05d895a
--- /dev/null
+++ b/tests/Grid/relations3.cc
@@ -0,0 +1,462 @@
+/* Test Grid::relation_with(const Constraint&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A point and an inequality.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A - B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = gr.relation_with(A - B >= 1) == Poly_Con_Relation::is_included();
+
+  return ok;
+}
+
+// A line.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A));
+  print_generators(gr, "*** gr ***");
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+
+  bool ok = (gr.relation_with(A + 0*B == 0)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(B > -2)
+	     == Poly_Con_Relation::is_included()
+ 	     && gr.relation_with(B > 2)
+ 	     == Poly_Con_Relation::is_disjoint()
+ 	     && gr.relation_with(B >= 2)
+ 	     == Poly_Con_Relation::is_disjoint()
+ 	     && gr.relation_with(B < -2)
+ 	     == Poly_Con_Relation::is_disjoint()
+ 	     && gr.relation_with(B <= -2)
+ 	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(B == -2)
+	     == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Inclusion of a point grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A + B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(B == 1)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Empty grid.
+
+bool
+test04() {
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(B == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates())
+	     && gr.relation_with(B > 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test05() {
+  Grid gr;
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (// False.
+	     gr.relation_with(Linear_Expression(1) == 0)
+	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(Linear_Expression(0) > 0)
+	     == (Poly_Con_Relation::saturates()
+		 && Poly_Con_Relation::is_disjoint())
+	     // True.
+	     && gr.relation_with(Linear_Expression(1) == 1)
+	     == (Poly_Con_Relation::saturates()
+		 && Poly_Con_Relation::is_included())
+	     && gr.relation_with(Linear_Expression(0) >= 0)
+	     == (Poly_Con_Relation::saturates()
+		 && Poly_Con_Relation::is_included())
+	     // False.
+	     && gr.relation_with(Linear_Expression(1) < 0)
+	     == Poly_Con_Relation::is_disjoint()
+	     // True.
+	     && gr.relation_with(Linear_Expression(1) >= 0)
+	     == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// A disjoint grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A + 5*B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(5*A - 2*B == 1)
+	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(5*A - 2*B > 1)
+	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(5*A - 2*B >= 1)
+	     == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Point with a divisor that is greater than zero.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A == 3)
+	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(2*A == 1)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates())
+	     && gr.relation_with(2*A < 1)
+	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(2*A >= 1)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: separate spaces.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(10*A == 1)
+	     == Poly_Con_Relation::is_disjoint()
+	     && gr.relation_with(Linear_Expression(10) > 10)
+	     == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: inclusion.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(Linear_Expression(10) == 10)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates())
+	     && gr.relation_with(Linear_Expression(10) >= 10)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: strict intersection.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 0)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(A + B >= 0)
+	     == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.relation_with(A + B >= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A == 1);
+  gr.add_congruence(A == 2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(B == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates())
+	     && gr.relation_with(B >= 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A == 0)
+	     == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(6*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 0)
+	     == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation, with a parameter.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(parameter(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 0)
+	     == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// generators are out of date and the grid is empty.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 8)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates())
+	     && gr.relation_with(A + B > 8)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// A simple example.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(parameter(A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A > 1)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(A >= 1)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(A < 1)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(A <= 1)
+	     == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// A grid in 3D.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  // Regularly spaced parallel lines along a slanted plane in 3D.
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(A + B + C));
+  gr.add_grid_generator(grid_line(A - 2*B + 3*C));
+  gr.add_grid_generator(parameter(A - B, 3));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B + C == 0)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(A + B == 0)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(A == 0)
+	     == Poly_Con_Relation::strictly_intersects()
+	     && gr.relation_with(Linear_Expression(0) == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test19() {
+  Grid gr(0, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (// False.
+	     gr.relation_with(Linear_Expression(1) == 0)
+	     == (Poly_Con_Relation::is_disjoint()
+		 && Poly_Con_Relation::is_included()
+	         && Poly_Con_Relation::saturates())
+	     // True.
+	     && gr.relation_with(Linear_Expression(1) == 1)
+	     == (Poly_Con_Relation::is_disjoint()
+		 && Poly_Con_Relation::is_included()
+	         && Poly_Con_Relation::saturates())
+	     // False.
+	     && gr.relation_with(Linear_Expression(1) < 0)
+	     == (Poly_Con_Relation::is_disjoint()
+		 && Poly_Con_Relation::is_included()
+	         && Poly_Con_Relation::saturates())
+	     // True.
+	     && gr.relation_with(Linear_Expression(1) >= 0)
+	     == (Poly_Con_Relation::is_disjoint()
+		 && Poly_Con_Relation::is_included()
+	         && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/removespacedims1.cc b/tests/Grid/removespacedims1.cc
index 44ea452..db1d1f0 100644
--- a/tests/Grid/removespacedims1.cc
+++ b/tests/Grid/removespacedims1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::remove_space_dimensions().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,6 +24,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace {
 
+// Testing remove_space_dimensions
+
 // Simple grid.
 bool
 test01() {
@@ -33,7 +35,7 @@ test01() {
   Grid gr(2);
   gr.add_congruence(A - B == 0);
   gr.add_congruence(A %= 0);
-  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+  print_congruences(gr, "*** gr ***");
 
   Variables_Set vars;
   vars.insert(B);
@@ -56,7 +58,7 @@ test02() {
   Variable B(1);
 
   Grid gr(4, EMPTY);
-  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+  print_congruences(gr, "*** gr ***");
 
   Variables_Set vars;
   vars.insert(B);
@@ -73,7 +75,6 @@ test02() {
 }
 
 // Universe grid.
-
 bool
 test03() {
   Variable C(2);
@@ -102,13 +103,13 @@ test04() {
   Variable A(0);
   Variable B(1);
 
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*A));
-  gs.insert(grid_point(2*A));
-  gs.insert(grid_point(3*B));
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(0*A));
+  ggs.insert(grid_point(2*A));
+  ggs.insert(grid_point(3*B));
 
-  Grid gr(gs);
-  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+  Grid gr(ggs);
+  print_generators(gr, "*** gr ***");
 
   Variables_Set vars;
   vars.insert(B);
@@ -145,17 +146,17 @@ test05() {
   cgs.insert((B - E %= 0) / 2);
 
   Grid gr(cgs);
-  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+  print_congruences(gr, "*** gr ***");
 
   gr.remove_space_dimensions(vars);
 
-  Grid_Generator_System known_gs;
-  known_gs.insert(grid_point());
-  known_gs.insert(grid_line(2*A - B));
-  known_gs.insert(grid_point(3*B, 2));
-  known_gs.insert(grid_line(C));
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point());
+  known_ggs.insert(grid_line(2*A - B));
+  known_ggs.insert(grid_point(3*B, 2));
+  known_ggs.insert(grid_line(C));
 
-  Grid known_gr(known_gs);
+  Grid known_gr(known_ggs);
 
   bool ok = (gr == known_gr);
 
@@ -174,6 +175,7 @@ test06() {
   Grid gr(3);
   gr.add_congruence(A - B == 0);
   gr.add_congruence(A %= 0);
+  print_congruences(gr, "*** gr ***");
 
   Variables_Set vars;
   vars.insert(A);
@@ -186,7 +188,7 @@ test06() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr ***");
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
 
   return ok;
 }
@@ -199,11 +201,11 @@ test07() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator_and_minimize(grid_point(B));
-  gr.add_generator(grid_line(C));
-  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator_and_minimize(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
 
   Variables_Set vars;
   vars.insert(B);
@@ -215,13 +217,12 @@ test07() {
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr ***");
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
 
   return ok;
 }
 
-// Empty variable set.
-
+// The resulting grid contains a line that is all zeros.
 bool
 test08() {
   Variable A(0);
@@ -229,18 +230,21 @@ test08() {
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator_and_minimize(grid_point(B));
-  gr.add_generator(grid_line(C));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(parameter(B));
+  gr.add_grid_generator(grid_line(C));
   print_generators(gr, "*** gr ***");
 
   Variables_Set vars;
-
-  Grid known_gr = gr;
+  vars.insert(C);
 
   gr.remove_space_dimensions(vars);
 
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(B %= 0);
+
   bool ok = (gr == known_gr);
 
   print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
@@ -248,52 +252,25 @@ test08() {
   return ok;
 }
 
-// Space dimension exception.
-
+// Empty variable set.
 bool
 test09() {
-  Variable B(1);
-
-  Grid gr(1, EMPTY);
-  print_congruences(gr, "*** gr ***");
-
-  Variables_Set vars;
-  vars.insert(B);
-
-  try {
-    gr.remove_space_dimensions(vars);
-  }
-  catch (const std::invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl;
-  }
-  catch (...) {
-    return false;
-  }
-  return true;
-}
-
-// Zero dimension universe resulting grid.
-bool
-test10() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
 
   Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator_and_minimize(grid_point(B));
-  gr.add_generator(grid_line(C));
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator_and_minimize(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
   print_generators(gr, "*** gr ***");
 
   Variables_Set vars;
-  vars.insert(A);
-  vars.insert(B);
-  vars.insert(C);
 
-  gr.remove_space_dimensions(vars);
+  Grid known_gr = gr;
 
-  Grid known_gr(0);
+  gr.remove_space_dimensions(vars);
 
   bool ok = (gr == known_gr);
 
@@ -302,163 +279,57 @@ test10() {
   return ok;
 }
 
-// From congruences.
+// Zero dimension universe resulting grid.
 bool
-test11() {
+test10() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
 
-  Congruence_System cgs;
-  cgs.insert((A + 2*C %= 0) / 3);
-
-  Grid gr(cgs);
-  print_generators(gr, "*** gr ***");
-
-  gr.remove_higher_space_dimensions(2);
-
-  Grid_Generator_System known_gs;
-  known_gs.insert(grid_point(0*B));
-  known_gs.insert(grid_line(A));
-  known_gs.insert(grid_line(B));
-
-  Grid known_gr(known_gs);
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
-
-  return ok;
-}
-
-// Empty grid.
-bool
-test12() {
-  Grid gr(2, EMPTY);
-  print_generators(gr, "*** gr ***");
-
-  gr.remove_higher_space_dimensions(1);
-
-  Grid known_gr(1, EMPTY);
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
-
-  return ok;
-}
-
-// Universe grid.
-bool
-test13() {
-  Grid gr(7);
-
-  gr.remove_higher_space_dimensions(3);
-
-  Grid known_gr(3);
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr, "*** gr.remove_higher_space_dimensions(3) ***");
-
-  return ok;
-}
-
-// From generators.
-bool
-test14() {
-  Variable A(0);
-  Variable B(1);
-
-  Grid_Generator_System gs;
-  gs.insert(grid_point(0*A));
-  gs.insert(grid_point(2*A));
-  gs.insert(grid_point(3*B));
-
-  Grid gr(gs);
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator_and_minimize(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
   print_generators(gr, "*** gr ***");
 
-  gr.remove_higher_space_dimensions(1);
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(B);
+  vars.insert(C);
 
-  Congruence_System known_cgs;
-  known_cgs.insert((A %= 0) / 2);
+  gr.remove_space_dimensions(vars);
 
-  Grid known_gr(known_cgs);
+  Grid known_gr(0);
 
   bool ok = (gr == known_gr);
 
-  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
 
   return ok;
 }
 
-// Resulting grid the same.
-
+// Space dimension exception.
 bool
-test15() {
-  Variable A(0);
+test11() {
   Variable B(1);
-  Variable C(2);
-
-  Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator_and_minimize(grid_point(B));
-  gr.add_generator(grid_line(C));
-  print_generators(gr, "*** gr ***");
-
-  Grid known_gr = gr;
-
-  gr.remove_higher_space_dimensions(gr.space_dimension());
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr, "*** gr.remove_higher_space_dimensions() ***");
 
-  return ok;
-}
-
-// Space dimension exception.
-bool
-test16() {
   Grid gr(1, EMPTY);
-  print_generators(gr, "*** gr ***");
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
 
   try {
-    gr.remove_higher_space_dimensions(6);
+    gr.remove_space_dimensions(vars);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
-}
-
-// Zero dimension universe resulting grid.
-bool
-test17() {
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-
-  Grid gr(3, EMPTY);
-  gr.add_generator(grid_point());
-  gr.add_generator(grid_point(A));
-  gr.add_generator_and_minimize(grid_point(B));
-  gr.add_generator(grid_line(C));
-  print_generators(gr, "*** gr ***");
-
-  gr.remove_higher_space_dimensions(0);
-
-  Grid known_gr(0);
-
-  bool ok = (gr == known_gr);
-
-  print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
-
-  return ok;
+  return false;
 }
 
 } // namespace
@@ -475,10 +346,4 @@ BEGIN_MAIN
   DO_TEST(test09);
   DO_TEST(test10);
   DO_TEST(test11);
-  DO_TEST(test12);
-  DO_TEST(test13);
-  DO_TEST(test14);
-  DO_TEST(test15);
-  DO_TEST(test16);
-  DO_TEST(test17);
 END_MAIN
diff --git a/tests/Grid/removespacedims2.cc b/tests/Grid/removespacedims2.cc
new file mode 100644
index 0000000..f3c0d7c
--- /dev/null
+++ b/tests/Grid/removespacedims2.cc
@@ -0,0 +1,334 @@
+/* Test Grid::remove_higher_space_dimensions().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// From congruences.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*C %= 0) / 3);
+
+  Grid gr(cgs);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point(0*B));
+  known_ggs.insert(grid_line(A));
+  known_ggs.insert(grid_line(B));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test03() {
+  Grid gr(7);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(3);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(0*A));
+  ggs.insert(grid_point(2*A));
+  ggs.insert(grid_point(3*B));
+
+  Grid gr(ggs);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+// Resulting grid the same.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator_and_minimize(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.remove_higher_space_dimensions(gr.space_dimension());
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions() ***");
+
+  return ok;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator_and_minimize(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+#if 0
+// Grid_Generator_System::remove_higher_space_dimensions is now private.
+
+// Remove all space dimensions from a nonempty generator system.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point());
+  ggs.insert(grid_point(A));
+  ggs.insert(grid_point(B));
+  ggs.insert(grid_line(C));
+  print_generators(ggs, "*** ggs ***");
+
+  ggs.remove_higher_space_dimensions(0);
+  print_generators(ggs, "*** ggs.remove_higher_space_dimensions(0) ***");
+
+  Grid gr(ggs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+// Remove all space dimensions from an empty generator system.
+// Showed a bug in remove_higher_space_dimensions() which is now corrected.
+bool
+test08() {
+  Grid_Generator_System ggs;
+  print_generators(ggs, "*** ggs ***");
+
+  ggs.remove_higher_space_dimensions(0);
+  print_generators(ggs, "*** ggs.remove_higher_space_dimensions(0) ***");
+
+  Grid gr(ggs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+#endif
+
+// Space dimension exception.
+bool
+test09() {
+  Grid gr(1, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.remove_higher_space_dimensions(6);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// From congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(B - C == 0);
+  gr.add_congruence(B %= 0);
+  gr.add_congruence(A == 4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point(4*A));
+  known_ggs.insert(parameter(B));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(B - C == 0);
+  gr.add_congruence(B %= 0);
+  gr.add_congruence(A == 4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point(4*A));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// Where the redundant row with the lowest dim_kinds entry is a
+// congruence or equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A - C %= 0) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  //DO_TEST(test07);
+  //DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/timeelapse1.cc b/tests/Grid/timeelapse1.cc
index 8b50902..2fa7ee4 100644
--- a/tests/Grid/timeelapse1.cc
+++ b/tests/Grid/timeelapse1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::time_elapse_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -119,7 +119,7 @@ test05() {
   print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(2, EMPTY);
-  gr2.add_generator(grid_point());
+  gr2.add_grid_generator(grid_point());
   print_generators(gr2, "*** gr2 ***");
 
   Grid known_gr(gr1);
@@ -220,22 +220,22 @@ test09() {
   Variable D(3);
 
   Grid gr1(4, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_point(2*A));
-  gr1.add_generator(grid_point(4*A));
-  gr1.add_generator(grid_point(D));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(2*A));
+  gr1.add_grid_generator(grid_point(4*A));
+  gr1.add_grid_generator(grid_point(D));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(4, EMPTY);
-  gr2.add_generator(grid_point(A));
+  gr2.add_grid_generator(grid_point(A));
   print_generators(gr2, "*** gr2 ***");
 
   gr1.time_elapse_assign(gr2);
 
   Grid known_gr(4, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A));
-  known_gr.add_generator(grid_point(D));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(D));
 
   bool ok = (gr1 == known_gr);
 
@@ -274,7 +274,7 @@ test10() {
 bool
 test11() {
   Grid gr1(1, EMPTY);
-  gr1.add_generator(grid_point());
+  gr1.add_grid_generator(grid_point());
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(19, EMPTY);
@@ -285,11 +285,11 @@ test11() {
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Multi-dimension grids with denominators.
@@ -300,20 +300,20 @@ test12() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point());
-  gr1.add_generator(grid_point(A + 2*B - 3*C, 3));
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(A + 2*B - 3*C, 3));
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(3*A - B + 4*C, 7));
+  gr2.add_grid_generator(grid_point(3*A - B + 4*C, 7));
   print_generators(gr2, "*** gr2 ***");
 
   gr1.time_elapse_assign(gr2);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point());
-  known_gr.add_generator(grid_point(A + 2*B - 3*C, 3));
-  known_gr.add_generator(grid_point(3*A - B + 4*C, 7));
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A + 2*B - 3*C, 3));
+  known_gr.add_grid_generator(grid_point(3*A - B + 4*C, 7));
 
   bool ok = (gr1 == known_gr);
 
diff --git a/tests/Grid/topclosed1.cc b/tests/Grid/topclosed1.cc
index 3c73ba1..b9dd1a7 100644
--- a/tests/Grid/topclosed1.cc
+++ b/tests/Grid/topclosed1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::is_topologically_closed().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -70,17 +70,17 @@ test04() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 2*B));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (gr_gs_min.is_topologically_closed())
     && (gr_gs_needs_min.is_topologically_closed())
@@ -102,19 +102,19 @@ test05() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B == 2);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (gr_gs_min.is_topologically_closed())
     && (gr_gs_needs_min.is_topologically_closed())
@@ -135,24 +135,24 @@ test06() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + B));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
   gr_cgs_needs_min.add_congruence(C == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
-  bool ok = (!gr_gs_min.is_topologically_closed())
-    && (!gr_gs_needs_min.is_topologically_closed())
-    && (!gr_cgs_needs_min.is_topologically_closed());
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
 
   print_generators(gr_gs_min, "*** gr_gs_min ***");
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
@@ -169,25 +169,25 @@ test07() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_min.add_generator(grid_point(3*A + B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
-  gr_gs_needs_min.add_generator(grid_point(3*A + B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence(A == 3);
   gr_cgs_needs_min.add_congruence(B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
-  bool ok = (!gr_gs_min.is_topologically_closed())
-    && (!gr_gs_needs_min.is_topologically_closed())
-    && (!gr_cgs_needs_min.is_topologically_closed());
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
 
   print_generators(gr_gs_min, "*** gr_gs_min ***");
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
@@ -203,25 +203,25 @@ test08() {
   Variable B(1);
 
   Grid gr_gs_min(2, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(2, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(2);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
-  bool ok = (!gr_gs_min.is_topologically_closed())
-    && (!gr_gs_needs_min.is_topologically_closed())
-    && (!gr_cgs_needs_min.is_topologically_closed());
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
 
   print_generators(gr_gs_min, "*** gr_gs_min ***");
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
@@ -238,27 +238,27 @@ test09() {
   Variable C(2);
 
   Grid gr_gs_min(3, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_point(A));
-  gr_gs_min.add_generator(grid_line(C));
-  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator_and_minimize(grid_point(3*A + 3*B, 4));
 
   Grid gr_gs_needs_min(3, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_point(A));
-  gr_gs_needs_min.add_generator(grid_line(C));
-  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
 
   Grid gr_cgs_needs_min(3);
   gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
   gr_cgs_needs_min.add_congruence(A - B %= 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
-  bool ok = (!gr_gs_min.is_topologically_closed())
-    && (!gr_gs_needs_min.is_topologically_closed())
-    && (!gr_cgs_needs_min.is_topologically_closed());
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
 
   print_generators(gr_gs_min, "*** gr_gs_min ***");
   print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
@@ -276,21 +276,21 @@ test10() {
   Variable D(3);
 
   Grid gr_gs_min(4, EMPTY);
-  gr_gs_min.add_generator(grid_point());
-  gr_gs_min.add_generator(grid_line(B));
-  gr_gs_min.add_generator_and_minimize(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator_and_minimize(grid_line(C));
 
   Grid gr_gs_needs_min(4, EMPTY);
-  gr_gs_needs_min.add_generator(grid_point());
-  gr_gs_needs_min.add_generator(grid_line(B));
-  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
 
   Grid gr_cgs_needs_min(4);
   gr_cgs_needs_min.add_congruence(A == 0);
   gr_cgs_needs_min.add_congruence(D == 0);
 
-  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
-  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
 
   bool ok = (gr_gs_min.is_topologically_closed())
     && (gr_gs_needs_min.is_topologically_closed())
diff --git a/tests/Grid/topclosure1.cc b/tests/Grid/topclosure1.cc
index 9e92d21..dd7f6e9 100644
--- a/tests/Grid/topclosure1.cc
+++ b/tests/Grid/topclosure1.cc
@@ -1,11 +1,11 @@
 /* Test Grid::topological_closure_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Grid/unconstrain1.cc b/tests/Grid/unconstrain1.cc
new file mode 100644
index 0000000..a9805a1
--- /dev/null
+++ b/tests/Grid/unconstrain1.cc
@@ -0,0 +1,229 @@
+/* Test Grid::unconstrain().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.unconstrain(A);
+
+  Grid known_result(2, EMPTY);
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs(A, B);
+  gr.unconstrain(vs);
+
+  Grid known_result(2, EMPTY);
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == B);
+  gr.add_congruence(B %= 0);
+  print_generators(gr, "*** gr ***");
+
+  gr.unconstrain(B);
+
+  Grid known_result(2);
+  known_result.add_congruence(A %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= B) / 0);
+  gr.add_congruence(B %= 0);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs(B);
+  gr.unconstrain(vs);
+
+  Grid known_result(2);
+  known_result.add_congruence(A %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Grid gr(0, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs;
+  gr.unconstrain(vs);
+
+  Grid known_result(0, EMPTY);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Grid gr(0);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs;
+  gr.unconstrain(vs);
+
+  Grid known_result(0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    Grid gr(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    gr.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    Grid gr(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    gr.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid gr(5);
+  gr.add_congruence((A + 3*B - 7 %= 9) / 0);
+  gr.add_congruence(A - 3*B - D + E %= 0);
+  gr.add_congruence(C %= D);
+  gr.add_congruence(E %= 2*B + D);
+  gr.add_congruence(E %= 0);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  gr.unconstrain(vs);
+
+  Grid known_result(5);
+  known_result.add_congruence((2*C %= 0) / 1);
+  known_result.add_congruence(E %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/widening1.cc b/tests/Grid/widening1.cc
index db4ba7b..e4690bb 100644
--- a/tests/Grid/widening1.cc
+++ b/tests/Grid/widening1.cc
@@ -1,11 +1,11 @@
-/* Test Grid::widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Grid::congruence_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -40,12 +40,11 @@ test01() {
 
   Grid known_gr = gr2;
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -68,12 +67,11 @@ test02() {
 
   Grid known_gr = gr2;
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -95,12 +93,11 @@ test03() {
 
   Grid known_gr = gr2;
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -125,12 +122,11 @@ test04() {
 
   Grid known_gr = gr2;
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -157,12 +153,11 @@ test05() {
 
   Grid known_gr = gr2;
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -188,7 +183,7 @@ test06() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(3);
   known_gr.add_congruence((B %= 0) / 2);
@@ -196,8 +191,7 @@ test06() {
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -223,15 +217,14 @@ test07() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(3);
   known_gr.add_congruence((B %= 0) / 2);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -246,20 +239,18 @@ test08() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(5);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
 
 // Widening when increasing to universe.
-
 bool
 test09() {
   Variable A(0);
@@ -273,14 +264,13 @@ test09() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(4);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -306,14 +296,13 @@ test10() {
 
   Grid known_gr = gr2;
 
-  gr2.widening_assign(gr1, &tokens);
+  gr2.congruence_widening_assign(gr1, &tokens);
 
   bool ok = ((gr2 == known_gr) && (tokens == 3));
 
   nout << "*** `tokens' should be 3 ***" << tokens << endl;
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1, &tokens) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1, &tokens) ***");
 
   return ok;
 }
@@ -329,14 +318,13 @@ test11() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(0);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -351,23 +339,22 @@ test12() {
   gr1.add_congruence(5*A + B %= 0);
   gr1.add_congruence(22*A %= 0);
 
-  print_congruences(gr1, "gr1: ");
+  print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(2);
   gr2.add_congruence(5*A + B %= 0);
   gr2.add_congruence(44*A %= 0);
 
-  print_congruences(gr2, "gr2: ");
+  print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(2);
   known_gr.add_congruence(5*A + B %= 0);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -382,23 +369,22 @@ test13() {
   gr1.add_congruence(9*A + B %= 0);
   gr1.add_congruence(22*A %= 0);
 
-  print_congruences(gr1, "gr1: ");
+  print_congruences(gr1, "*** gr1 ***");
 
   Grid gr2(2);
   gr2.add_congruence(9*A + B %= 0);
   gr2.add_congruence(44*A %= 0);
 
-  print_congruences(gr2, "gr2: ");
+  print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(2);
   known_gr.add_congruence(9*A + B %= 0);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -421,15 +407,14 @@ test14() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(2);
   known_gr.add_congruence((A + B %= 0) / 2);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -452,15 +437,14 @@ test15() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(2);
   known_gr.add_congruence((A + B %= 0) / 2);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -483,15 +467,14 @@ test16() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(2);
   known_gr.add_congruence((A - B == 0) / 3);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -504,27 +487,26 @@ test17() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(C, 3));
-  gr1.add_generator(grid_point(C + A - 2*B, 3));
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
 
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(3, EMPTY);
-  gr2.add_generator(grid_point(C, 3));
-  gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
 
   print_generators(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(3, EMPTY);
-  known_gr.add_generator(grid_point(C, 3));
-  known_gr.add_generator(grid_line(A - 2*B));
+  known_gr.add_grid_generator(grid_point(C, 3));
+  known_gr.add_grid_generator(grid_line(A - 2*B));
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
@@ -538,27 +520,27 @@ test18() {
   Variable C(2);
 
   Grid gr1(3, EMPTY);
-  gr1.add_generator(grid_point(C, 3));
-  gr1.add_generator(grid_point(C + A - 2*B, 3));
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
 
   print_generators(gr1, "*** gr1 ***");
 
   Grid gr2(4, EMPTY);
-  gr2.add_generator(grid_point(C, 3));
-  gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
 
   print_generators(gr2, "*** gr2 ***");
 
   try {
-    gr2.widening_assign(gr1);
+    gr2.congruence_widening_assign(gr1);
   }
   catch (const std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl;
+    return true;
   }
   catch (...) {
-    return false;
   }
-  return true;
+  return false;
 }
 
 // Minimizing the first congruence system finds the empty grid.
@@ -578,14 +560,13 @@ test19() {
 
   print_congruences(gr2, "*** gr2 ***");
 
-  gr2.widening_assign(gr1);
+  gr2.congruence_widening_assign(gr1);
 
   Grid known_gr(3, EMPTY);
 
   bool ok = (gr2 == known_gr);
 
-  print_congruences(gr2,
-        "*** gr2.widening_assign(gr1) ***");
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
 
   return ok;
 }
diff --git a/tests/Grid/widening2.cc b/tests/Grid/widening2.cc
new file mode 100644
index 0000000..e994e36
--- /dev/null
+++ b/tests/Grid/widening2.cc
@@ -0,0 +1,485 @@
+/* Test Grid::generator_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_point(A));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Initially non-empty changing to the universe.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1, EMPTY);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// An extra affine dimension as a parameter.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(B));
+  gr1.add_grid_generator(parameter(A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(B));
+  gr2.add_grid_generator(parameter(A));
+  gr2.add_grid_generator(parameter(A + B));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Widening does not change the grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(A, 2));
+  gr1.add_grid_generator(grid_point(B, 2));
+  gr1.add_grid_generator(grid_point(C));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(A, 2));
+  gr2.add_grid_generator(grid_point(B, 2));
+  gr2.add_grid_generator(grid_point(C));
+  gr2.add_grid_generator(grid_point(4*C + A, 4));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Widening adds a line.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(A, 2));
+  gr1.add_grid_generator(parameter(B));
+  gr1.add_grid_generator(parameter(C));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(A, 2));
+  gr2.add_grid_generator(parameter(B, 2));
+  gr2.add_grid_generator(parameter(C, 2));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// The next two tests are based on an example in [BagnaraDHMZ06a].
+// Widening should only be applied where the grid to be widened is in
+// strong minimal form.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// This uses the same grids as before but with the given representation
+// not in strong minimal form.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((3*A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Token used.
+bool
+test09() {
+  using namespace IO_Operators;
+
+  Variable A(0);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+  nout << "*** `tokens' (which should be 3), are = *** " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Token not used.
+bool
+test10() {
+  //  using namespace IO_Operators;
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence(B %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 4));
+
+  nout << "*** `tokens' (which should be 4), are = *** " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test11() {
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// First case of Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(5*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(5*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(5*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Second case in Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(9*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(9*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(9*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr2.generator_widening_assign(gr1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Grid gr1(1);
+  gr1.add_congruence((A %= 1) / 2);
+  gr1.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2.generator_widening_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST_F8(test12);
+  DO_TEST_F8(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/widening3.cc b/tests/Grid/widening3.cc
new file mode 100644
index 0000000..6c315c4
--- /dev/null
+++ b/tests/Grid/widening3.cc
@@ -0,0 +1,314 @@
+/* Test Grid::widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test03() {
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// The next set of tests use the widening example in fm06.
+
+// Both congruence systems are up-to-date.
+// Neither generator systems are up-to-date.
+// Should use the congruence widening..
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Initial grid - only the congruence system is up-to-date but not minimized.
+// Second grid - only the generator system is up-to-date but not minimized.
+// Should use the congruence widening..
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(2*A));
+  gr2.add_grid_generator(parameter(A + B));
+  gr2.add_grid_generator(parameter(3*A + B));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Initial grid - only the generator system is up-to-date but not minimized.
+// Second grid - only the congruence system is up-to-date but not minimized.
+// Should use the congruence widening..
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(2*A));
+  gr1.add_grid_generator(parameter(2*B));
+  gr1.add_grid_generator(parameter(2*A + 2*B));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+  gr2.add_congruence((A + B %= 0));
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Neither congruence systems are up-to-date.
+// Should use the generator widening..
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(2*A));
+  gr1.add_grid_generator(parameter(2*B));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(2*A));
+  gr2.add_grid_generator(parameter(A + B));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  using namespace IO_Operators;
+
+  Variable A(0);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+  nout << "*** `tokens' which should be should be 3 are *** "
+       << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr2.widening_assign(gr1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/writecongruencesystem.cc b/tests/Grid/writecongruencesystem.cc
index 3ee674b..0e34adf 100644
--- a/tests/Grid/writecongruencesystem.cc
+++ b/tests/Grid/writecongruencesystem.cc
@@ -1,11 +1,11 @@
 /* Test operator<<(std::ostream&, const Congruence_System&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,6 +21,7 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
+#include <sstream>
 
 using namespace Parma_Polyhedra_Library::IO_Operators;
 
@@ -35,7 +36,7 @@ test01() {
 
   bool ok = (cgs.OK());
 
-  stringstream ss;
+  std::stringstream ss;
   ss << cgs;
   ok &= (!ss.str().compare("true"));
 
diff --git a/tests/MIP_Problem/Makefile.am b/tests/MIP_Problem/Makefile.am
new file mode 100644
index 0000000..55d54c0
--- /dev/null
+++ b/tests/MIP_Problem/Makefile.am
@@ -0,0 +1,85 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+ascii_dump_load1 \
+exceptions1 \
+mipproblem1 \
+mipproblem2 \
+mipproblem3
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+
+mipproblem1_SOURCES = mipproblem1.cc
+
+mipproblem2_SRCS = mipproblem2.cc
+
+mipproblem3_SOURCES = mipproblem3.cc
+
+if BUILD_WATCHDOG_LIBRARY
+WATCHDOG_TESTS = mipproblem2
+
+mipproblem2_SOURCES = $(mipproblem2_SRCS)
+mipproblem2_CPPFLAGS = \
+$(AM_CPPFLAGS) \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src
+mipproblem2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+
+endif BUILD_WATCHDOG_LIBRARY
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+EXTRA_DIST = $(mipproblem2_SRCS)
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
diff --git a/tests/MIP_Problem/Makefile.in b/tests/MIP_Problem/Makefile.in
new file mode 100644
index 0000000..4fc75de
--- /dev/null
+++ b/tests/MIP_Problem/Makefile.in
@@ -0,0 +1,717 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+	mipproblem1$(EXEEXT) mipproblem2$(EXEEXT) mipproblem3$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/MIP_Problem
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+	mipproblem1$(EXEEXT) mipproblem2$(EXEEXT) mipproblem3$(EXEEXT)
+am__EXEEXT_2 =
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mipproblem1_OBJECTS = mipproblem1.$(OBJEXT)
+mipproblem1_OBJECTS = $(am_mipproblem1_OBJECTS)
+mipproblem1_LDADD = $(LDADD)
+mipproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am__mipproblem2_SOURCES_DIST = mipproblem2.cc
+am__objects_1 = mipproblem2-mipproblem2.$(OBJEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_mipproblem2_OBJECTS =  \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(am__objects_1)
+mipproblem2_OBJECTS = $(am_mipproblem2_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+ at BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_DEPENDENCIES =  \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(am__DEPENDENCIES_1) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am_mipproblem3_OBJECTS = mipproblem3.$(OBJEXT)
+mipproblem3_OBJECTS = $(am_mipproblem3_OBJECTS)
+mipproblem3_LDADD = $(LDADD)
+mipproblem3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+	$(mipproblem1_SOURCES) $(mipproblem2_SOURCES) \
+	$(mipproblem3_SOURCES)
+DIST_SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+	$(mipproblem1_SOURCES) $(am__mipproblem2_SOURCES_DIST) \
+	$(mipproblem3_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS = 
+
+#
+# Sources for the tests
+#
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+exceptions1_SOURCES = exceptions1.cc
+mipproblem1_SOURCES = mipproblem1.cc
+mipproblem2_SRCS = mipproblem2.cc
+mipproblem3_SOURCES = mipproblem3.cc
+ at BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = mipproblem2
+ at BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_SOURCES = $(mipproblem2_SRCS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_CPPFLAGS = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(AM_CPPFLAGS) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog/src
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+EXTRA_DIST = $(mipproblem2_SRCS)
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/MIP_Problem/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/MIP_Problem/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) 
+	@rm -f exceptions1$(EXEEXT)
+	$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+mipproblem1$(EXEEXT): $(mipproblem1_OBJECTS) $(mipproblem1_DEPENDENCIES) 
+	@rm -f mipproblem1$(EXEEXT)
+	$(CXXLINK) $(mipproblem1_OBJECTS) $(mipproblem1_LDADD) $(LIBS)
+mipproblem2$(EXEEXT): $(mipproblem2_OBJECTS) $(mipproblem2_DEPENDENCIES) 
+	@rm -f mipproblem2$(EXEEXT)
+	$(CXXLINK) $(mipproblem2_OBJECTS) $(mipproblem2_LDADD) $(LIBS)
+mipproblem3$(EXEEXT): $(mipproblem3_OBJECTS) $(mipproblem3_DEPENDENCIES) 
+	@rm -f mipproblem3$(EXEEXT)
+	$(CXXLINK) $(mipproblem3_OBJECTS) $(mipproblem3_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem2-mipproblem2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem3.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mipproblem2-mipproblem2.o: mipproblem2.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mipproblem2-mipproblem2.o -MD -MP -MF $(DEPDIR)/mipproblem2-mipproblem2.Tpo -c -o mipproblem2-mipproblem2.o `test -f 'mipproblem2.cc' || echo '$(srcdir)/'`mipproblem2.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/mipproblem2-mipproblem2.Tpo $(DEPDIR)/mipproblem2-mipproblem2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mipproblem2.cc' object='mipproblem2-mipproblem2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mipproblem2-mipproblem2.o `test -f 'mipproblem2.cc' || echo '$(srcdir)/'`mipproblem2.cc
+
+mipproblem2-mipproblem2.obj: mipproblem2.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mipproblem2-mipproblem2.obj -MD -MP -MF $(DEPDIR)/mipproblem2-mipproblem2.Tpo -c -o mipproblem2-mipproblem2.obj `if test -f 'mipproblem2.cc'; then $(CYGPATH_W) 'mipproblem2.cc'; else $(CYGPATH_W) '$(srcdir)/mipproblem2.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/mipproblem2-mipproblem2.Tpo $(DEPDIR)/mipproblem2-mipproblem2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mipproblem2.cc' object='mipproblem2-mipproblem2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mipproblem2-mipproblem2.obj `if test -f 'mipproblem2.cc'; then $(CYGPATH_W) 'mipproblem2.cc'; else $(CYGPATH_W) '$(srcdir)/mipproblem2.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/MIP_Problem/ascii_dump_load1.cc b/tests/MIP_Problem/ascii_dump_load1.cc
new file mode 100644
index 0000000..826abcd
--- /dev/null
+++ b/tests/MIP_Problem/ascii_dump_load1.cc
@@ -0,0 +1,417 @@
+/* Test MIP_Problem::ascii_dump() and MIP_Problem::ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 2);
+  cs.insert(B >= 0);
+
+  Linear_Expression cost(A + 2*B);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(10*A - B >= 11);
+  cs.insert(B >= 0);
+
+  Linear_Expression cost(17*A + 2*B);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  f.seekp(0);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = !mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(1);
+
+  Constraint_System cs;
+  cs.insert(15*A - C >= 11);
+  cs.insert(B >= 0);
+  cs.insert(C <= 11);
+
+  Linear_Expression cost(17*A + 2*B -2*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "opt_mode");
+  f.seekp(0, ios_base::cur);
+  f << " Q";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = !mip2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 10);
+  cs.insert(A <= 5);
+  cs.insert(C <= 11);
+
+  Linear_Expression cost(A + 2*B + 3*C);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 123);
+  cs.insert(A + 2*B + 11*C <= 5434);
+  cs.insert(C <= 11);
+
+  Linear_Expression cost(A - 11*B);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "base(");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = !mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+// Unfeasible problem, not solved.
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B >= 10);
+  cs.insert(B + C <= 15);
+
+  Linear_Expression cost(A + 2*B);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Unbounded problem, not solved.
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+
+  cs.insert(A >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + A <= 15);
+
+  Linear_Expression cost(1*C);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  MIP_Problem mip2;
+  open(f, my_file, ios_base::in);
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Problem with optimum, not solved.
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + C <= 15);
+  cs.insert(A <= 30);
+  cs.insert(B <= 50);
+
+  Linear_Expression cost(1*C + 2*B);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) &&
+    mip1.optimizing_point() == mip2.optimizing_point();
+  close(f);
+  return ok;
+}
+
+// Unfeasible problem, solved.
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B >= 10);
+  cs.insert(B + C <= 15);
+
+  Linear_Expression cost(A + 2*B);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Unbounded problem, solved.
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+
+  cs.insert(A >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + A <= 15);
+
+  Linear_Expression cost(1*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  MIP_Problem mip2;
+  open(f, my_file, ios_base::in);
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Problem with optimum, solved.
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + C <= 15);
+  cs.insert(A <= 30);
+  cs.insert(B <= 50);
+
+  Linear_Expression cost(1*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) &&
+    mip1.optimizing_point() == mip2.optimizing_point();
+  close(f);
+  return ok;
+}
+
+// Problem with optimum and integer variables, solved.
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + C <= 15);
+  cs.insert(A <= 20);
+  cs.insert(B <= 40);
+
+  Linear_Expression cost(1*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.add_to_integer_space_dimensions(Variables_Set(A,C));
+  mip1.solve();
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) &&
+    mip1.optimizing_point() == mip2.optimizing_point();
+  close(f);
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+  DO_TEST_F16(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/MIP_Problem/exceptions1.cc b/tests/MIP_Problem/exceptions1.cc
new file mode 100644
index 0000000..19c2dee
--- /dev/null
+++ b/tests/MIP_Problem/exceptions1.cc
@@ -0,0 +1,507 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A > -6);
+  MIP_Problem mip(cs.space_dimension());
+
+  try {
+    // This tries to build an invalid MIP_Problem object: the feasible
+    // region can not be defined using strict inequalities.
+    mip.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable A(0);
+  MIP_Problem mip;
+
+  try {
+    // This tries to build an invalid MIP_Problem object: the space dimension
+    // of the objective function can not be greater than the space dimension
+    // of the feasible region.
+    mip.set_objective_function(A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+
+  try {
+    // We cannot extract a feasible point from an unsatisfiable MIP_Problem.
+    Generator fp = mip.feasible_point();
+  }
+  catch (std::domain_error& e) {
+    nout << "domain_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+
+  try {
+    // We cannot extract an optimizing point from an unbounded MIP_Problem.
+    Generator fp = mip.optimizing_point();
+  }
+  catch (std::domain_error& e) {
+    nout << "domain_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+  Generator p = point(A + B);
+  Coefficient num;
+  Coefficient den;
+
+  try {
+    // This tries to evaluate the objective function on a space-dimension
+    // incompatible generator.
+    mip.evaluate_objective_function(p, num, den);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+  Generator r = ray(A);
+  Coefficient num;
+  Coefficient den;
+
+  try {
+    // This tries to evaluate the objective function on a ray.
+    mip.evaluate_objective_function(r, num, den);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  try {
+    // This tries to overflow the maximum space dimension.
+    MIP_Problem mip(MIP_Problem::max_space_dimension() + 1);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test08() {
+  MIP_Problem mip(1);
+  try {
+    // This tries to overflow the maximum space dimension.
+    mip.add_space_dimensions_and_embed(MIP_Problem::max_space_dimension());
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to make the cost function incompatible with the MIP_Problem
+    // space dimension.
+    MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to overflow the maximum space dimension.
+    MIP_Problem mip(MIP_Problem::max_space_dimension() + 1,
+		    cs, cost, MAXIMIZATION);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A < 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to build an MIP_Problem with strict inequalities.
+    MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // This tries to add Constraint that exceeds the MIP_Problem
+    // space dimension.
+    mip.add_constraint(C >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // This tries to add a strict inequality.
+    mip.add_constraint(B > 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  Constraint_System incompatible_cs;
+  incompatible_cs.insert(C >= 6);
+  incompatible_cs.insert(D <= 0);
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // Adds a Constraint_System that exceeds the space dimension of the
+    // MIP_Problem.
+    mip.add_constraints(incompatible_cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  Constraint_System incompatible_cs;
+  incompatible_cs.insert(A >= 10);
+  incompatible_cs.insert(B < 22 );
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // This tries to add Constraint_System that contains a strict inequality.
+    mip.add_constraints(incompatible_cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to overflow the maximum space dimension.
+    MIP_Problem mip(MIP_Problem::max_space_dimension() + 1,
+		    cs.begin(), cs.end(),
+		    A + B, MAXIMIZATION);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to let exceed the objective function space dimension.
+    MIP_Problem mip(cs.space_dimension(),
+		    cs.begin(), cs.end(),
+		    A + B + C, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B < 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to build an MIP_Problem with strict inequalities..
+    MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(),
+		    A + B, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to build an MIP_Problem with a wrong space dimension.
+    MIP_Problem mip(cs.space_dimension() - 1, cs.begin(), cs.end(),
+		    A + B, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem1.cc b/tests/MIP_Problem/mipproblem1.cc
new file mode 100644
index 0000000..22cd602
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem1.cc
@@ -0,0 +1,1699 @@
+/* Test the MIP_Problem class.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable X01(0);
+  Variable X02(1);
+  Variable X03(2);
+  Variable X04(3);
+  Variable X05(4);
+  Variable X06(5);
+  Variable X07(6);
+  Variable X08(7);
+  Variable X09(8);
+  Variable X10(9);
+  Variable X11(10);
+  Variable X12(11);
+  Variable X13(12);
+  Variable X14(13);
+  Variable X15(14);
+  Variable X16(15);
+  Variable X17(16);
+  Variable X18(17);
+  Variable X19(18);
+  Variable X20(19);
+  Variable X21(20);
+  Variable X22(21);
+  Variable X23(22);
+  Variable X24(23);
+  Variable X25(24);
+  Variable X26(25);
+  Variable X27(26);
+  Variable X28(27);
+  Variable X29(28);
+  Variable X30(29);
+  Variable X31(30);
+  Variable X32(31);
+  Variable X33(32);
+  Variable X34(33);
+  Variable X35(34);
+  Variable X36(35);
+  Variable X37(36);
+  Variable X38(37);
+  Variable X39(38);
+
+  Constraint_System cs;
+  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+  cs.insert(-X01 >= -80);
+  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+  cs.insert(Coefficient("2386907802506363")*X06
+	    + Coefficient("2386907802506363")*X07
+	    + Coefficient("1080863910568919")*X08
+	    + Coefficient("7746191359077253")*X09
+	    - X16 == 0);
+  cs.insert(-X06 + X10 >= -80);
+  cs.insert(-X07 + X11 >= 0);
+  cs.insert(-X08 + X12 >= 0);
+  cs.insert(-X09 + X13 >= 0);
+  cs.insert(X22 - X23 - X24 - X25 == 0);
+  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+  cs.insert(-X22 >= -500);
+  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+  cs.insert(Coefficient("7746191359077253")*X28
+	    + Coefficient("7746191359077253")*X29
+	    + Coefficient("3512807709348987")*X30
+	    + Coefficient("3332663724254167")*X31
+	    - X38 == 0);
+  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+  cs.insert(-X28 + X32 >= -500);
+  cs.insert(-X29 + X33 >= 0);
+  cs.insert(-X30 + X34 >= 0);
+  cs.insert(-X31 + X35 >= 0);
+  cs.insert(Coefficient("-2661627379775963")*X10
+	    - Coefficient("2686397177726501")*X11
+	    - Coefficient("5422333951354077")*X12
+	    - Coefficient("5469621747441467")*X13
+	    + X25
+	    - Coefficient("2466846695892189")*X32
+	    - Coefficient("4996743786567565")*X33
+	    - Coefficient("5064297780978123")*X34
+	    - Coefficient("641481471923585")*X35 >= 0);
+  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+  cs.insert(X15
+	    - Coefficient("7854277750134145")*X28
+	    - Coefficient("7782220156096217")*X29
+	    - Coefficient("7782220156096217")*X30
+	    - Coefficient("7710162562058289")*X31 >= 0);
+  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+  cs.insert(X21 >= 2);
+  cs.insert(-X16 - X38 >= -300);
+  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  // Cost function.
+  Linear_Expression cost(-10*X02 - 8*X14 - 15*X23 - 12*X36 + 250*X39);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  // Computed numerator and denominator.
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 11000;
+  Coefficient den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // The feasible / optimizing point.
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(2*X21 + 44*X39);
+  if (pg != pg_kr)
+    return false;
+
+  // Making mip unfeasible.
+  Constraint_System further_cs;
+  further_cs.insert(X05 >= 5);
+  further_cs.insert(X05 <= 3);
+  mip.add_constraints(further_cs);
+
+  return !mip.is_satisfiable();
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  // Cost function
+  Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A - B + C >= 24);
+  cs.insert(B <= 320);
+  cs.insert(A + B + 2*D == 23);
+  cs.insert(A + 2*B + E == 4112);
+  cs.insert(7*A + 5*B + F <= 200);
+  cs.insert(138*A + 2*G == 25);
+  cs.insert(23*A + 342*B - 34*H == 99);
+  for (dimension_type i = A.id(); i <= H.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+  if (pg != pg_kr)
+    return false;
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 1084869;
+  Coefficient den_kr = 76;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize using another objective function.
+  Linear_Expression new_cost = -51*A + 632*B;
+  mip.set_objective_function(new_cost);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 14536;
+  den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize after changing optimization mode.
+  mip.set_optimization_mode(MINIMIZATION);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(17100*A + 26174*B + 2274482*C
+		+ 1063871*D + 388070456*E + 18627830*F + 0*H,
+		94392);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 3917467;
+  den_kr = 23598;
+
+  return num == num_kr && den == den_kr;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+	    >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    + Coefficient("3643488632714799")*B
+	    - Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A +
+	    Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C >=
+	    Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+	    - Coefficient("1125899906842624")*B
+	    + Coefficient("1821744319735099")*D
+	    >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+	    - Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    - Coefficient("3643488630462999")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= Coefficient("-9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("11790576865778496")*C
+	    >= Coefficient("-38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576870282096")*C
+	    >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    + Coefficient("2947644226577723")*D
+	    >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("2947644226577723")*
+	    D >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("2947644228829523")*D
+	    >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644228829523")*D
+	    >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    + Coefficient("5895288468918045")*C
+	    >= Coefficient("-19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288468918045")*C
+	    >= Coefficient("-19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+	    - Coefficient("11790576906310892")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+	    - Coefficient("5895288446400047")*B
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*B
+	    + Coefficient("7286977179861205")*C
+	    >= Coefficient("-38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576766699304")*B
+	    - Coefficient("7286977179861205")*C
+	    >= Coefficient("-38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("7286977157343207")*B
+	    + Coefficient("11790576712656108")*D
+	    >= Coefficient("-38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("3643488592182402")*B
+	    - Coefficient("5895288374342453")*D
+	    >= Coefficient("-19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*C
+	    + Coefficient("7286977175357605")*D
+	    >= Coefficient("-38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("5895288390105051")*C
+	    - Coefficient("3643488594434202")*D
+	    >= Coefficient("-19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288421630249")*C
+	    + Coefficient("3643488619204000")*D
+	    >= Coefficient("-19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576865778496")*C
+	    - Coefficient("7286977247415199")*D
+	    >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("7286977247415199")*B
+	    + Coefficient("11790576888296494")*D
+	    >= Coefficient("-38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("3643488639470198")*B
+	    - Coefficient("5895288464414445")*D
+	    >= Coefficient("-19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288428385648")*B
+	    + Coefficient("3643488630462999")*C
+	    >= Coefficient("-19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576843260498")*B
+	    - Coefficient("7286977224897201")*C
+	    >= Coefficient("-38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+	    >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488630462999")*D
+	    >= Coefficient("-19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488628211199")*D
+	    >= Coefficient("-19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977269933197")*D
+	    >= Coefficient("-38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    - Coefficient("2251799813685248")*C
+	    - Coefficient("3643488632714799")*D
+	    >= Coefficient("-19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+	    + Coefficient("11790576919821692")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+	    + Coefficient("5895288486932443")*C
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+	    - Coefficient("5895288446400047")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+	    - Coefficient("11790576937836090")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977247415199")*C
+	    + Coefficient("11790576883792894")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977251918799")*C
+	    - Coefficient("11790576883792894")*D
+	    >= Coefficient("-38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    + Coefficient("11790576852267696")*D
+	    >= Coefficient("-38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    - Coefficient("11790576852267696")*D
+	    >= Coefficient("-38155108167840592"));
+  cs.insert(Coefficient("-2251799813685248")*D
+	    >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+	    >= Coefficient("-5895288446400047"));
+  cs.insert(Coefficient("-2251799813685248")*C
+	    >= Coefficient("-5895288444148247"));
+  cs.insert(Coefficient("-1125899906842624")*B
+	    + Coefficient("1821744321986899")*C
+	    + Coefficient("2947644226577723")*D
+	    >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("-3643488607945001")*B
+	    + Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-4503599627370496")*B
+	    + Coefficient("7286977292451195")*C
+	    - Coefficient("11790576906310892")*D
+	    >= Coefficient("-38155108343480984"));
+  cs.insert(Coefficient("-7286977220393601")*B
+	    + Coefficient("11790576829749698")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108086775800"));
+  cs.insert(Coefficient("-4503599627370496")*B
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("11790576901807292")*D
+	    >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("-3643488605693201")*B
+	    - Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-1125899906842624")*B
+	    - Coefficient("1821744319735099")*C
+	    - Coefficient("2947644225451823")*D
+	    >= Coefficient("-9538777079114846"));
+  cs.insert(Coefficient("-7286977220393601")*B
+	    - Coefficient("11790576834253298")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108113797400"));
+  cs.insert(Coefficient("-5895288462162645")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488639470198")*D
+	    >= Coefficient("-19077554144718892"));
+  cs.insert(Coefficient("-11790576924325290")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977292451195")*D
+	    >= Coefficient("-38155108320962984"));
+  cs.insert(Coefficient("-5895288468918045")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488641721998")*D
+	    >= Coefficient("-19077554160481492"));
+  cs.insert(Coefficient("-11790576928828890")*B
+	    - Coefficient("4503599627370496")*C
+	    - Coefficient("7286977292451195")*D
+	    >= Coefficient("-38155108329970184"));
+  cs.insert(Coefficient("-281474976710656")*B
+	    >= Coefficient("-736911053829681"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("11790576658612912")*B
+	    + Coefficient("7286977125818009")*C
+	    >= Coefficient("-38155107627408640"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    + Coefficient("5895288336061856")*B
+	    - Coefficient("3643488560657205")*C
+	    >= Coefficient("-19077553829466920"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    + Coefficient("3643488535887407")*B
+	    + Coefficient("5895288288774060")*D
+	    >= Coefficient("-19077553683099932"));
+  cs.insert(Coefficient("-7286977274436797")*A
+	    + Coefficient("11790576766699304")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108032732608"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("7286977098796411")*B
+	    - Coefficient("11790576609073318")*D
+	    >= Coefficient("-38155107483293448"));
+  cs.insert(Coefficient("-7286977301458395")*A
+	    + Coefficient("11790576735174106")*B
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155107983193008"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("11790576708152508")*C
+	    + Coefficient("7286977148336007")*D
+	    >= Coefficient("-38155107771523824"));
+  cs.insert(Coefficient("-281474976710656")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    + Coefficient("281474976710656")*D
+	    >= Coefficient("-1473822119481311"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("2947644178164027")*C
+	    - Coefficient("1821744285958102")*D
+	    >= Coefficient("-9538776941755056"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576856771296")*C
+	    + Coefficient("7286977247415199")*D
+	    >= Coefficient("-38155108221883792"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-140737488355328")*A
+	    - Coefficient("368455526774103")*C
+	    - Coefficient("227718038700250")*D
+	    >= Coefficient("-1192347131793131"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-3643488643973798")*A
+	    + Coefficient("2251799813685248")*B
+	    + Coefficient("5895288441896447")*C
+	    >= Coefficient("-19077554158229692"));
+  cs.insert(Coefficient("-7286977296954795")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576892800094")*C
+	    >= Coefficient("-38155108352488176"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("7286977269933197")*B
+	    + Coefficient("11790576924325290")*D
+	    >= Coefficient("-38155108411034976"));
+  cs.insert(Coefficient("-3643488639470198")*A
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("5895288466666245")*D
+	    >= Coefficient("-19077554219028288"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("7286977296954795")*B
+	    - Coefficient("11790576955850488")*D
+	    >= Coefficient("-38155108514617768"));
+  cs.insert(Coefficient("-7286977251918799")*A
+	    + Coefficient("4503599627370496")*C
+	    - Coefficient("11790576892800094")*D
+	    >= Coefficient("-38155108311955784"));
+  cs.insert(Coefficient("-3643488655232797")*A
+	    - Coefficient("2251799813685248")*C
+	    + Coefficient("5895288480177044")*D
+	    >= Coefficient("-19077554264064284"));
+  cs.insert(Coefficient("-1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644229955423")*D
+	    >= Coefficient("-9538777099381044"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576874785696")*B
+	    + Coefficient("7286977269933197")*C
+	    >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-7286977274436797")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("11790576937836090")*C
+	    >= Coefficient("-38155108424545776"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576802728102")*B
+	    - Coefficient("7286977197875603")*C
+	    >= Coefficient("-38155108019221808"));
+  cs.insert(Coefficient("-3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288493687843")*C
+	    >= Coefficient("-19077554284330480"));
+  cs.insert(Coefficient("-562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644250784571"));
+  cs.insert(Coefficient("-281474976710656")*A
+	    - Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    - Coefficient("281474976710656")*D
+	    >= Coefficient("-1473822131021785"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288468918045"));
+  cs.insert(Coefficient("-3643488412038417")*A
+	    - Coefficient("5895288318047457")*B
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077553665085532"));
+  cs.insert(Coefficient("-1821744199263809")*A
+	    - Coefficient("2947644153394229")*B
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-9538776813402468"));
+  cs.insert(Coefficient("-5895288378846052")*A
+	    + Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554023121704"));
+  cs.insert(Coefficient("-11790576834253298")*A
+	    + Coefficient("7286977314969193")*B
+	    - Coefficient("4503599627370496")*C
+	    >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-736911041726257")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("455436077400500")*D
+	    >= Coefficient("-2384694241068264"));
+  cs.insert(Coefficient("-5895288347320855")*A
+	    + Coefficient("2251799813685248")*B
+	    - Coefficient("3643488616952200")*D
+	    >= Coefficient("-19077553951064108"));
+  cs.insert(Coefficient("-2947644201807925")*A
+	    + Coefficient("1821744319735099")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-9538777048715548"));
+  cs.insert(Coefficient("-11790576820742500")*A
+	    + Coefficient("7286977296954795")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108248905384"));
+  cs.insert(Coefficient("-11790576996382886")*A
+	    - Coefficient("7286977251918799")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108523624968"));
+  cs.insert(Coefficient("-5895288507198642")*A
+	    - Coefficient("3643488632714799")*C
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554291085880"));
+  cs.insert(Coefficient("-11790577113476476")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("7286977319472793")*D
+	    >= Coefficient("-38155108861394936"));
+  cs.insert(Coefficient("-5895288572500836")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("3643488652980997")*D
+	    >= Coefficient("-19077554450963668"));
+  cs.insert(Coefficient("-5895288484680644")*A
+	    - Coefficient("3643488607945001")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554212272888"));
+  cs.insert(Coefficient("-2947644274991419")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= Coefficient("-9538777190578936"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    >= Coefficient("-5895288448651847"));
+
+  // Cost function
+  Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point obtained by simplex:\n";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "\nOptimum value = " << num << "/" << den << endl;
+
+  C_Polyhedron ph(cs);
+  Coefficient num1;
+  Coefficient den1;
+  bool maximum;
+  Generator pg1 = point();
+  ph.maximize(cost, num1, den1, maximum, pg1);
+
+  nout << "\nOptimizing point obtained by enumeration:\n";
+  print_generator(pg1);
+  nout << "\nOptimum value = " << num1 << "/" << den1 << endl;
+
+  return maximum && num == num1 && den == den1 && pg == pg1;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  // Cost function
+  Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A - B + C >= 24);
+  cs.insert(B <= 320);
+  cs.insert(A + B + 2*D == 23);
+  cs.insert(A + 2*B + E == 4112);
+  cs.insert(7*A + 5*B + F <= 200);
+  cs.insert(138*A + 2*G == 25);
+  cs.insert(23*A + 342*B - 34*H == 99);
+  for (dimension_type i = A.id(); i <= H.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+  if (pg != pg_kr)
+    return false;
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 1084869;
+  Coefficient den_kr = 76;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize using another objective function.
+  Linear_Expression new_cost = -51*A + 632*B;
+  mip.set_objective_function(new_cost);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 14536;
+  den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize after changing optimization mode.
+  mip.set_optimization_mode(MINIMIZATION);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(17100*A + 26174*B + 2274482*C
+		+ 1063871*D + 388070456*E + 18627830*F + 0*H,
+		94392);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 3917467;
+  den_kr = 23598;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+	    >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    + Coefficient("3643488632714799")*B
+	    - Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A +
+	    Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C >=
+	    Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+	    - Coefficient("1125899906842624")*B
+	    + Coefficient("1821744319735099")*D
+	    >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+	    - Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    - Coefficient("3643488630462999")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= Coefficient("-9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("11790576865778496")*C
+	    >= Coefficient("-38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576870282096")*C
+	    >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    + Coefficient("2947644226577723")*D
+	    >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("2947644226577723")*
+	    D >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("2947644228829523")*D
+	    >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644228829523")*D
+	    >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    + Coefficient("5895288468918045")*C
+	    >= Coefficient("-19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288468918045")*C
+	    >= Coefficient("-19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+	    - Coefficient("11790576906310892")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+	    - Coefficient("5895288446400047")*B
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*B
+	    + Coefficient("7286977179861205")*C
+	    >= Coefficient("-38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576766699304")*B
+	    - Coefficient("7286977179861205")*C
+	    >= Coefficient("-38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("7286977157343207")*B
+	    + Coefficient("11790576712656108")*D
+	    >= Coefficient("-38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("3643488592182402")*B
+	    - Coefficient("5895288374342453")*D
+	    >= Coefficient("-19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*C
+	    + Coefficient("7286977175357605")*D
+	    >= Coefficient("-38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("5895288390105051")*C
+	    - Coefficient("3643488594434202")*D
+	    >= Coefficient("-19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288421630249")*C
+	    + Coefficient("3643488619204000")*D
+	    >= Coefficient("-19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576865778496")*C
+	    - Coefficient("7286977247415199")*D
+	    >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("7286977247415199")*B
+	    + Coefficient("11790576888296494")*D
+	    >= Coefficient("-38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("3643488639470198")*B
+	    - Coefficient("5895288464414445")*D
+	    >= Coefficient("-19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288428385648")*B
+	    + Coefficient("3643488630462999")*C
+	    >= Coefficient("-19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576843260498")*B
+	    - Coefficient("7286977224897201")*C
+	    >= Coefficient("-38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+	    >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488630462999")*D
+	    >= Coefficient("-19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488628211199")*D
+	    >= Coefficient("-19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977269933197")*D
+	    >= Coefficient("-38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    - Coefficient("2251799813685248")*C
+	    - Coefficient("3643488632714799")*D
+	    >= Coefficient("-19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+	    + Coefficient("11790576919821692")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+	    + Coefficient("5895288486932443")*C
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+	    - Coefficient("5895288446400047")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+	    - Coefficient("11790576937836090")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977247415199")*C
+	    + Coefficient("11790576883792894")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977251918799")*C
+	    - Coefficient("11790576883792894")*D
+	    >= Coefficient("-38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    + Coefficient("11790576852267696")*D
+	    >= Coefficient("-38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    - Coefficient("11790576852267696")*D
+	    >= Coefficient("-38155108167840592"));
+  cs.insert(Coefficient("-2251799813685248")*D
+	    >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+	    >= Coefficient("-5895288446400047"));
+  cs.insert(Coefficient("-2251799813685248")*C
+	    >= Coefficient("-5895288444148247"));
+  cs.insert(Coefficient("-1125899906842624")*B
+	    + Coefficient("1821744321986899")*C
+	    + Coefficient("2947644226577723")*D
+	    >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("-3643488607945001")*B
+	    + Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-4503599627370496")*B
+	    + Coefficient("7286977292451195")*C
+	    - Coefficient("11790576906310892")*D
+	    >= Coefficient("-38155108343480984"));
+  cs.insert(Coefficient("-7286977220393601")*B
+	    + Coefficient("11790576829749698")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108086775800"));
+  cs.insert(Coefficient("-4503599627370496")*B
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("11790576901807292")*D
+	    >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("-3643488605693201")*B
+	    - Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-1125899906842624")*B
+	    - Coefficient("1821744319735099")*C
+	    - Coefficient("2947644225451823")*D
+	    >= Coefficient("-9538777079114846"));
+  cs.insert(Coefficient("-7286977220393601")*B
+	    - Coefficient("11790576834253298")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108113797400"));
+  cs.insert(Coefficient("-5895288462162645")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488639470198")*D
+	    >= Coefficient("-19077554144718892"));
+  cs.insert(Coefficient("-11790576924325290")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977292451195")*D
+	    >= Coefficient("-38155108320962984"));
+  cs.insert(Coefficient("-5895288468918045")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488641721998")*D
+	    >= Coefficient("-19077554160481492"));
+  cs.insert(Coefficient("-11790576928828890")*B
+	    - Coefficient("4503599627370496")*C
+	    - Coefficient("7286977292451195")*D
+	    >= Coefficient("-38155108329970184"));
+  cs.insert(Coefficient("-281474976710656")*B
+	    >= Coefficient("-736911053829681"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("11790576658612912")*B
+	    + Coefficient("7286977125818009")*C
+	    >= Coefficient("-38155107627408640"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    + Coefficient("5895288336061856")*B
+	    - Coefficient("3643488560657205")*C
+	    >= Coefficient("-19077553829466920"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    + Coefficient("3643488535887407")*B
+	    + Coefficient("5895288288774060")*D
+	    >= Coefficient("-19077553683099932"));
+  cs.insert(Coefficient("-7286977274436797")*A
+	    + Coefficient("11790576766699304")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108032732608"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("7286977098796411")*B
+	    - Coefficient("11790576609073318")*D
+	    >= Coefficient("-38155107483293448"));
+  cs.insert(Coefficient("-7286977301458395")*A
+	    + Coefficient("11790576735174106")*B
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155107983193008"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("11790576708152508")*C
+	    + Coefficient("7286977148336007")*D
+	    >= Coefficient("-38155107771523824"));
+  cs.insert(Coefficient("-281474976710656")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    + Coefficient("281474976710656")*D
+	    >= Coefficient("-1473822119481311"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("2947644178164027")*C
+	    - Coefficient("1821744285958102")*D
+	    >= Coefficient("-9538776941755056"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576856771296")*C
+	    + Coefficient("7286977247415199")*D
+	    >= Coefficient("-38155108221883792"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-140737488355328")*A
+	    - Coefficient("368455526774103")*C
+	    - Coefficient("227718038700250")*D
+	    >= Coefficient("-1192347131793131"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-3643488643973798")*A
+	    + Coefficient("2251799813685248")*B
+	    + Coefficient("5895288441896447")*C
+	    >= Coefficient("-19077554158229692"));
+  cs.insert(Coefficient("-7286977296954795")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576892800094")*C
+	    >= Coefficient("-38155108352488176"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("7286977269933197")*B
+	    + Coefficient("11790576924325290")*D
+	    >= Coefficient("-38155108411034976"));
+  cs.insert(Coefficient("-3643488639470198")*A
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("5895288466666245")*D
+	    >= Coefficient("-19077554219028288"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("7286977296954795")*B
+	    - Coefficient("11790576955850488")*D
+	    >= Coefficient("-38155108514617768"));
+  cs.insert(Coefficient("-7286977251918799")*A
+	    + Coefficient("4503599627370496")*C
+	    - Coefficient("11790576892800094")*D
+	    >= Coefficient("-38155108311955784"));
+  cs.insert(Coefficient("-3643488655232797")*A
+	    - Coefficient("2251799813685248")*C
+	    + Coefficient("5895288480177044")*D
+	    >= Coefficient("-19077554264064284"));
+  cs.insert(Coefficient("-1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644229955423")*D
+	    >= Coefficient("-9538777099381044"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576874785696")*B
+	    + Coefficient("7286977269933197")*C
+	    >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-7286977274436797")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("11790576937836090")*C
+	    >= Coefficient("-38155108424545776"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576802728102")*B
+	    - Coefficient("7286977197875603")*C
+	    >= Coefficient("-38155108019221808"));
+  cs.insert(Coefficient("-3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288493687843")*C
+	    >= Coefficient("-19077554284330480"));
+  cs.insert(Coefficient("-562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644250784571"));
+  cs.insert(Coefficient("-281474976710656")*A
+	    - Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    - Coefficient("281474976710656")*D
+	    >= Coefficient("-1473822131021785"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288468918045"));
+  cs.insert(Coefficient("-3643488412038417")*A
+	    - Coefficient("5895288318047457")*B
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077553665085532"));
+  cs.insert(Coefficient("-1821744199263809")*A
+	    - Coefficient("2947644153394229")*B
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-9538776813402468"));
+  cs.insert(Coefficient("-5895288378846052")*A
+	    + Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554023121704"));
+  cs.insert(Coefficient("-11790576834253298")*A
+	    + Coefficient("7286977314969193")*B
+	    - Coefficient("4503599627370496")*C
+	    >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-736911041726257")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("455436077400500")*D
+	    >= Coefficient("-2384694241068264"));
+  cs.insert(Coefficient("-5895288347320855")*A
+	    + Coefficient("2251799813685248")*B
+	    - Coefficient("3643488616952200")*D
+	    >= Coefficient("-19077553951064108"));
+  cs.insert(Coefficient("-2947644201807925")*A
+	    + Coefficient("1821744319735099")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-9538777048715548"));
+  cs.insert(Coefficient("-11790576820742500")*A
+	    + Coefficient("7286977296954795")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108248905384"));
+  cs.insert(Coefficient("-11790576996382886")*A
+	    - Coefficient("7286977251918799")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108523624968"));
+  cs.insert(Coefficient("-5895288507198642")*A
+	    - Coefficient("3643488632714799")*C
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554291085880"));
+  cs.insert(Coefficient("-11790577113476476")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("7286977319472793")*D
+	    >= Coefficient("-38155108861394936"));
+  cs.insert(Coefficient("-5895288572500836")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("3643488652980997")*D
+	    >= Coefficient("-19077554450963668"));
+  cs.insert(Coefficient("-5895288484680644")*A
+	    - Coefficient("3643488607945001")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554212272888"));
+  cs.insert(Coefficient("-2947644274991419")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= Coefficient("-9538777190578936"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    >= Coefficient("-5895288448651847"));
+
+  // Cost function
+  Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+
+  return true;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression cost(A + B);
+  Constraint_System cs;
+  cs.insert(-A - B >= -8);
+  cs.insert(-A - 3*B >= -18);
+  cs.insert(-A + B >= -4);
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  const Coefficient num_kr = 8;
+  const Coefficient den_kr = 1;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(6*A + 2*B);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression cost(A + B);
+  Constraint_System cs;
+  cs.insert(-A - 3*B >= -4);
+  cs.insert(-5*A - B >= -5);
+  cs.insert(-3*A - 2*B >= -2);
+  cs.insert(A + 3*B >= -1);
+  cs.insert(2*A - B >= -2);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Coefficient num_kr = 8;
+  Coefficient den_kr = 7;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(-2*A + 10*B, 7);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 1;
+  den_kr = 1;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(B);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression cost(12*A + 6*B + 4*C + 3*D);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+  cs.insert(3008*A + 20980*B - 97775*C - 101225*D >= 0);
+  cs.insert(3985*A + 25643*B - 135871*C - 130580*D >= 0);
+  cs.insert(4324*A + 26978*B - 133655*C - 168473*D >= 0);
+  cs.insert(3534*A + 25361*B - 46243*C - 100407*D >= 0);
+  cs.insert(8836*A + 40796*B - 176661*C - 215616*D >= 0);
+  cs.insert(5376*A + 37562*B - 182576*C - 217615*D >= 0);
+  cs.insert(2491*A + 16544*B - 49440*C - 83639*D >= 0);
+  cs.insert(4775*A + 39122*B - 136701*C - 193393*D >= 0);
+  cs.insert(8046*A + 42958*B - 225138*C - 256575*D >= 0);
+  cs.insert(8554*A + 48955*B - 257370*C - 312877*D >= 0);
+  cs.insert(6147*A + 45514*B - 165274*C - 227099*D >= 0);
+  cs.insert(8366*A + 55140*B - 203989*C - 321623*D >= 0);
+  cs.insert(13479*A + 68037*B - 174270*C - 341743*D >= 0);
+  cs.insert(21808*A + 78302*B - 322990*C - 487539*D >= 0);
+  cs.insert(-8554*A - 48955*B >= -10000);
+  cs.insert(-257370*C - 312877*D >= -10000);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Coefficient num_kr = Coefficient("8231960000");
+  Coefficient den_kr = 581120267;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(679355000*A + 19925000*C + 0*D, 581120267);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = Coefficient("81926256268");
+  den_kr = Coefficient("6651564805");
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(Coefficient("6651564805")*A + 196469466*B + 232165453*C + 0*D,
+		Coefficient("6651564805"));
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 1646392;
+  den_kr = 135871;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(135871*A + 3985*C + 0*D, 135871);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable C to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(C));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 2335041;
+  den_kr = 193393;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(193393*A + 4775*D, 193393);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable D to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(D));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 12;
+  den_kr = 1;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(A + 0*D);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression cost(A + B + C);
+  Constraint_System cs;
+  cs.insert(A >= -1);
+  cs.insert(B >= -1);
+  cs.insert(C >= -1);
+  cs.insert(-A >= -1);
+  cs.insert(-B >= -1);
+  cs.insert(-C >= -1);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Coefficient num_kr = 3;
+  Coefficient den_kr = 1;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(A + B + C);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable C to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(C));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A + B <= 1);
+  cs.insert(A + C <= 1);
+  cs.insert(B + C <= 1);
+
+  // All integer variables.
+  Variables_Set ivs(A, C);
+
+  // Cost function.
+  Linear_Expression cost(-2*A - 3*B - 4*C);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+		  MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return true;
+}
+
+}
+
+// namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+  DO_TEST_F32(test02);
+  DO_TEST_F64(test03);
+  DO_TEST_F32(test04);
+  DO_TEST_F64(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_F64(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem2.cc b/tests/MIP_Problem/mipproblem2.cc
new file mode 100644
index 0000000..b6509f6
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem2.cc
@@ -0,0 +1,157 @@
+/* Test the MIP_Problem class with instances that require a watchdog timer.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "pwl.hh"
+
+namespace {
+
+class Timeout : virtual public std::exception,
+		public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "Timeout in refine1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  Timeout() {
+  }
+
+  ~Timeout() throw() {
+  }
+};
+
+Timeout t;
+
+bool test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression cost(10*A + 3*B);
+  Constraint_System cs;
+  cs.insert(A + B >= 0);
+  cs.insert(B >= 0);
+  cs.insert(B == 3);
+  cs.insert(2*C + 2*D == 9);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MINIMIZATION);
+  Coefficient num_kr = -21;
+  Coefficient den_kr = 1;
+  Coefficient num;
+  Coefficient den;
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(-6*A + 6*B + 9*D, 2);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable C to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(C));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable D to be constrained to have an integer value.
+  // This will cause branch-and-bound not to terminate any longer.
+  mip.add_to_integer_space_dimensions(Variables_Set(D));
+
+  try {
+    // Set a 2 seconds timeout.
+    Parma_Watchdog_Library::Watchdog
+      w(200, abandon_expensive_computations, t);
+
+    pg = mip.optimizing_point();
+
+    // We should never get here.
+    abandon_expensive_computations = 0;
+    nout << "unexpected termination" << endl;
+    return false;
+  }
+  catch (const Timeout&) {
+    abandon_expensive_computations = 0;
+    nout << "timeout, as expected" << endl;
+    return true;
+  }
+  catch (const std::overflow_error&) {
+    abandon_expensive_computations = 0;
+    // Overflow errors should be propagated.
+    throw;
+  }
+  catch (...) {
+    abandon_expensive_computations = 0;
+    nout << "unexpected exception" << endl;
+    return false;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem3.cc b/tests/MIP_Problem/mipproblem3.cc
new file mode 100644
index 0000000..1a34a10
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem3.cc
@@ -0,0 +1,894 @@
+/* Test the MIP_Problem class.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(-2*A - B >= -5);
+  cs.insert(4*A -4*B >= -5);
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+
+  // All integer variables.
+  Variables_Set ivs(A, B);
+
+  // Objective function.
+  Linear_Expression cost(A - 2*B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+		  MAXIMIZATION);
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  mip.set_optimization_mode(MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return true;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(Coefficient("-3152519739159347")*A
+	    - Coefficient("4503599627370496")*B
+	    >= Coefficient("-2837267765243412480"));
+  cs.insert(Coefficient("-14411518807585588")*A
+	    - Coefficient("3602879701896397")*B
+	    >= Coefficient("-19455550390240542720"));
+  cs.insert(Coefficient("6325070415853456823515479584966165845298645305129441198653167438357198111499854590373761990669910140474596183259900372230931523043306046152094168748148078435047419508642698792639590866940413010663742739952273283392562733857021646831815729864036236135650314266011211548510419206725953204130822734645187695728365866909171712")*A
+	    >= Coefficient("134217729"));
+  cs.insert(B >= 20);
+  cs.insert(-B >= -500);
+
+  // Integer variables.
+  Variables_Set ivs(A);
+
+  // Cost function
+  Linear_Expression cost(-4*A - B);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(),
+				cs.begin(), cs.end(),
+				ivs,
+				cost,
+				MINIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+
+  return true;
+}
+
+bool
+test03() {
+  MIP_Problem mip = MIP_Problem();
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  if (pg != pg_kr)
+    return false;
+  return true;
+}
+
+bool
+test04() {
+  MIP_Problem mip = MIP_Problem();
+  mip.add_constraint(Linear_Expression::zero() <= 1);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  Generator pg_kr = point();
+  if (pg != pg_kr)
+    return false;
+  mip.add_constraint(Linear_Expression::zero() >= 1);
+  return !mip.is_satisfiable();
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(-A - B >= -8);
+  cs.insert(-A - 3*B >= -18);
+  cs.insert(-A + B >= -4);
+
+  // All integer variables.
+  Variables_Set ivs(A, B);
+
+  // Cost function.
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+		  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return pg == point(6*A + 2*B);
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(-A - 3*B >= -4);
+  cs.insert(-5*A - B >= -5);
+  cs.insert(-3*A - 2*B >= -2);
+  cs.insert(A + 3*B >= -1);
+  cs.insert(2*A - B >= -2);
+
+  // Cost function.
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+		  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return pg == point(-2*A + 10*B, 7);
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A + B >= 0);
+  cs.insert(B >= 0);
+  cs.insert(B == 3);
+  cs.insert(2*C + 2*D == 9);
+
+  // Cost function.
+  Linear_Expression cost(10*A + 6*B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+		  MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = -12;
+  Coefficient den_kr = 1;
+
+  return num == num_kr && den == den_kr;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+	    >= -Coefficient("5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    + Coefficient("3643488632714799")*B
+	    - Coefficient("2251799813685248")*C
+	    >= -Coefficient("19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    + Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C
+	    >= -Coefficient("19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("7286977274436797")*D
+	    >= -Coefficient("38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= -Coefficient("38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+	    - Coefficient("1125899906842624")*B
+	    + Coefficient("1821744319735099")*D
+	    >= -Coefficient("9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+	    - Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= -Coefficient("38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    - Coefficient("3643488630462999")*B
+	    + Coefficient("2251799813685248")*C
+	    >= -Coefficient("19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= -Coefficient("9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("11790576865778496")*C
+	    >= -Coefficient("38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576870282096")*C
+	    >= -Coefficient("38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    + Coefficient("2947644226577723")*D
+	    >= -Coefficient("9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("2947644226577723")*D
+	    >= -Coefficient("9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("2947644228829523")*D
+	    >= -Coefficient("9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644228829523")*D
+	    >= -Coefficient("9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    + Coefficient("5895288468918045")*C
+	    >= -Coefficient("19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288468918045")*C
+	    >= -Coefficient("19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+	    - Coefficient("11790576906310892")*B
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+	    - Coefficient("5895288446400047")*B
+	    - Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*B
+	    + Coefficient("7286977179861205")*C
+	    >= -Coefficient("38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576766699304")*B
+	    - Coefficient("7286977179861205")*C
+	    >= -Coefficient("38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("7286977157343207")*B
+	    + Coefficient("11790576712656108")*D
+	    >= -Coefficient("38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("3643488592182402")*B
+	    - Coefficient("5895288374342453")*D
+	    >= -Coefficient("19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*C
+	    + Coefficient("7286977175357605")*D
+	    >= -Coefficient("38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("5895288390105051")*C
+	    - Coefficient("3643488594434202")*D
+	    >= -Coefficient("19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288421630249")*C
+	    + Coefficient("3643488619204000")*D
+	    >= -Coefficient("19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576865778496")*C
+	    - Coefficient("7286977247415199")*D
+	    >= -Coefficient("38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("7286977247415199")*B
+	    + Coefficient("11790576888296494")*D
+	    >= -Coefficient("38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("3643488639470198")*B
+	    - Coefficient("5895288464414445")*D
+	    >= -Coefficient("19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288428385648")*B
+	    + Coefficient("3643488630462999")*C
+	    >= -Coefficient("19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576843260498")*B
+	    - Coefficient("7286977224897201")*C
+	    >= -Coefficient("38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+	    >= -Coefficient("2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488630462999")*D
+	    >= -Coefficient("19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488628211199")*D
+	    >= -Coefficient("19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977269933197")*D
+	    >= -Coefficient("38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    - Coefficient("2251799813685248")*C
+	    - Coefficient("3643488632714799")*D
+	    >= -Coefficient("19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+	    + Coefficient("11790576919821692")*C
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+	    + Coefficient("5895288486932443")*C
+	    - Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+	    - Coefficient("5895288446400047")*C
+	    + Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+	    - Coefficient("11790576937836090")*C
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977247415199")*C
+	    + Coefficient("11790576883792894")*D
+	    >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977251918799")*C
+	    - Coefficient("11790576883792894")*D
+	    >= -Coefficient("38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    + Coefficient("11790576852267696")*D
+	    >= -Coefficient("38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+	    >= -Coefficient("2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    - Coefficient("11790576852267696")*D
+	    >= -Coefficient("38155108167840592"));
+  cs.insert(-Coefficient("2251799813685248")*D
+	    >= -Coefficient("5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+	    >= -Coefficient("5895288446400047"));
+  cs.insert(-Coefficient("2251799813685248")*C
+	    >= -Coefficient("5895288444148247"));
+  cs.insert(-Coefficient("1125899906842624")*B
+	    + Coefficient("1821744321986899")*C
+	    + Coefficient("2947644226577723")*D
+	    >= -Coefficient("9538777088122044"));
+  cs.insert(-Coefficient("3643488607945001")*B
+	    + Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077554059150500"));
+  cs.insert(-Coefficient("4503599627370496")*B
+	    + Coefficient("7286977292451195")*C
+	    - Coefficient("11790576906310892")*D
+	    >= -Coefficient("38155108343480984"));
+  cs.insert(-Coefficient("7286977220393601")*B
+	    + Coefficient("11790576829749698")*C
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108086775800"));
+  cs.insert(-Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("11790576901807292")*D
+	    >= -Coefficient("38155108325466584"));
+  cs.insert(-Coefficient("3643488605693201")*B
+	    - Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077554059150500"));
+  cs.insert(-Coefficient("1125899906842624")*B
+	    - Coefficient("1821744319735099")*C
+	    - Coefficient("2947644225451823")*D
+	    >= -Coefficient("9538777079114846"));
+  cs.insert(-Coefficient("7286977220393601")*B
+	    - Coefficient("11790576834253298")*C
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108113797400"));
+  cs.insert(-Coefficient("5895288462162645")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488639470198")*D
+	    >= -Coefficient("19077554144718892"));
+  cs.insert(-Coefficient("11790576924325290")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977292451195")*D
+	    >= -Coefficient("38155108320962984"));
+  cs.insert(-Coefficient("5895288468918045")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488641721998")*D
+	    >= -Coefficient("19077554160481492"));
+  cs.insert(-Coefficient("11790576928828890")*B
+	    - Coefficient("4503599627370496")*C
+	    - Coefficient("7286977292451195")*D
+	    >= -Coefficient("38155108329970184"));
+  cs.insert(-Coefficient("281474976710656")*B
+	    >= -Coefficient("736911053829681"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    + Coefficient("11790576658612912")*B
+	    + Coefficient("7286977125818009")*C
+	    >= -Coefficient("38155107627408640"));
+  cs.insert(-Coefficient("2251799813685248")*A
+	    + Coefficient("5895288336061856")*B
+	    - Coefficient("3643488560657205")*C
+	    >= -Coefficient("19077553829466920"));
+  cs.insert(-Coefficient("2251799813685248")*A
+	    + Coefficient("3643488535887407")*B
+	    + Coefficient("5895288288774060")*D
+	    >= -Coefficient("19077553683099932"));
+  cs.insert(-Coefficient("7286977274436797")*A
+	    + Coefficient("11790576766699304")*B
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108032732608"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    + Coefficient("7286977098796411")*B
+	    - Coefficient("11790576609073318")*D
+	    >= -Coefficient("38155107483293448"));
+  cs.insert(-Coefficient("7286977301458395")*A
+	    + Coefficient("11790576735174106")*B
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155107983193008"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    + Coefficient("11790576708152508")*C
+	    + Coefficient("7286977148336007")*D
+	    >= -Coefficient("38155107771523824"));
+  cs.insert(-Coefficient("281474976710656")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    + Coefficient("281474976710656")*D
+	    >= -Coefficient("1473822119481311"));
+  cs.insert(-Coefficient("1125899906842624")*A
+	    + Coefficient("2947644178164027")*C
+	    - Coefficient("1821744285958102")*D
+	    >= -Coefficient("9538776941755056"));
+  cs.insert(-Coefficient("1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= -Coefficient("5895288471169845"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    - Coefficient("11790576856771296")*C
+	    + Coefficient("7286977247415199")*D
+	    >= -Coefficient("38155108221883792"));
+  cs.insert(-Coefficient("1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= -Coefficient("5895288471169845"));
+  cs.insert(-Coefficient("140737488355328")*A
+	    - Coefficient("368455526774103")*C
+	    - Coefficient("227718038700250")*D
+	    >= -Coefficient("1192347131793131"));
+  cs.insert(-Coefficient("1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= -Coefficient("5895288464414445"));
+  cs.insert(-Coefficient("3643488643973798")*A
+	    + Coefficient("2251799813685248")*B
+	    + Coefficient("5895288441896447")*C
+	    >= -Coefficient("19077554158229692"));
+  cs.insert(-Coefficient("7286977296954795")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576892800094")*C
+	    >= -Coefficient("38155108352488176"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    - Coefficient("7286977269933197")*B
+	    + Coefficient("11790576924325290")*D
+	    >= -Coefficient("38155108411034976"));
+  cs.insert(-Coefficient("3643488639470198")*A
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("5895288466666245")*D
+	    >= -Coefficient("19077554219028288"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    - Coefficient("7286977296954795")*B
+	    - Coefficient("11790576955850488")*D
+	    >= -Coefficient("38155108514617768"));
+  cs.insert(-Coefficient("7286977251918799")*A
+	    + Coefficient("4503599627370496")*C
+	    - Coefficient("11790576892800094")*D
+	    >= -Coefficient("38155108311955784"));
+  cs.insert(-Coefficient("3643488655232797")*A
+	    - Coefficient("2251799813685248")*C
+	    + Coefficient("5895288480177044")*D
+	    >= -Coefficient("19077554264064284"));
+  cs.insert(-Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644229955423")*D
+	    >= -Coefficient("9538777099381044"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    - Coefficient("11790576874785696")*B
+	    + Coefficient("7286977269933197")*C
+	    >= -Coefficient("38155108302948584"));
+  cs.insert(-Coefficient("7286977274436797")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("11790576937836090")*C
+	    >= -Coefficient("38155108424545776"));
+  cs.insert(-Coefficient("4503599627370496")*A
+	    - Coefficient("11790576802728102")*B
+	    - Coefficient("7286977197875603")*C
+	    >= -Coefficient("38155108019221808"));
+  cs.insert(-Coefficient("3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288493687843")*C
+	    >= -Coefficient("19077554284330480"));
+  cs.insert(-Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= -Coefficient("2947644250784571"));
+  cs.insert(-Coefficient("281474976710656")*A
+	    - Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    - Coefficient("281474976710656")*D
+	    >= -Coefficient("1473822131021785"));
+  cs.insert(-Coefficient("1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= -Coefficient("5895288464414445"));
+  cs.insert(-Coefficient("1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= -Coefficient("5895288468918045"));
+  cs.insert(-Coefficient("3643488412038417")*A
+	    - Coefficient("5895288318047457")*B
+	    + Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077553665085532"));
+  cs.insert(-Coefficient("1821744199263809")*A
+	    - Coefficient("2947644153394229")*B
+	    - Coefficient("1125899906842624")*D
+	    >= -Coefficient("9538776813402468"));
+  cs.insert(-Coefficient("5895288378846052")*A
+	    + Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C
+	    >= -Coefficient("19077554023121704"));
+  cs.insert(-Coefficient("11790576834253298")*A
+	    + Coefficient("7286977314969193")*B
+	    - Coefficient("4503599627370496")*C
+	    >= -Coefficient("38155108302948584"));
+  cs.insert(-Coefficient("736911041726257")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("455436077400500")*D
+	    >= -Coefficient("2384694241068264"));
+  cs.insert(-Coefficient("5895288347320855")*A
+	    + Coefficient("2251799813685248")*B
+	    - Coefficient("3643488616952200")*D
+	    >= -Coefficient("19077553951064108"));
+  cs.insert(-Coefficient("2947644201807925")*A
+	    + Coefficient("1821744319735099")*C
+	    + Coefficient("1125899906842624")*D
+	    >= -Coefficient("9538777048715548"));
+  cs.insert(-Coefficient("11790576820742500")*A
+	    + Coefficient("7286977296954795")*C
+	    - Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108248905384"));
+  cs.insert(-Coefficient("11790576996382886")*A
+	    - Coefficient("7286977251918799")*C
+	    + Coefficient("4503599627370496")*D
+	    >= -Coefficient("38155108523624968"));
+  cs.insert(-Coefficient("5895288507198642")*A
+	    - Coefficient("3643488632714799")*C
+	    - Coefficient("2251799813685248")*D
+	    >= -Coefficient("19077554291085880"));
+  cs.insert(-Coefficient("11790577113476476")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("7286977319472793")*D
+	    >= -Coefficient("38155108861394936"));
+  cs.insert(-Coefficient("5895288572500836")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("3643488652980997")*D
+	    >= -Coefficient("19077554450963668"));
+  cs.insert(-Coefficient("5895288484680644")*A
+	    - Coefficient("3643488607945001")*B
+	    + Coefficient("2251799813685248")*C
+	    >= -Coefficient("19077554212272888"));
+  cs.insert(-Coefficient("2947644274991419")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= -Coefficient("9538777190578936"));
+  cs.insert(-Coefficient("2251799813685248")*A
+	    >= -Coefficient("5895288448651847"));
+
+  // Cost function.
+  Linear_Expression cost(A + B + C + D);
+
+  // All integer variables.
+  Variables_Set ivs(A, D);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+		  MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = -5;
+  Coefficient den_kr = 1;
+
+  return pg == point(-2*A - B - C - D)
+    && num == num_kr && den == den_kr;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+  cs.insert(3008*A + 20980*B - 97775*C - 101225*D >= 0);
+  cs.insert(3985*A + 25643*B - 135871*C - 130580*D >= 0);
+  cs.insert(4324*A + 26978*B - 133655*C - 168473*D >= 0);
+  cs.insert(3534*A + 25361*B - 46243*C - 100407*D >= 0);
+  cs.insert(8836*A + 40796*B - 176661*C - 215616*D >= 0);
+  cs.insert(5376*A + 37562*B - 182576*C - 217615*D >= 0);
+  cs.insert(2491*A + 16544*B - 49440*C - 83639*D >= 0);
+  cs.insert(4775*A + 39122*B - 136701*C - 193393*D >= 0);
+  cs.insert(8046*A + 42958*B - 225138*C - 256575*D >= 0);
+  cs.insert(8554*A + 48955*B - 257370*C - 312877*D >= 0);
+  cs.insert(6147*A + 45514*B - 165274*C - 227099*D >= 0);
+  cs.insert(8366*A + 55140*B - 203989*C - 321623*D >= 0);
+  cs.insert(13479*A + 68037*B - 174270*C - 341743*D >= 0);
+  cs.insert(21808*A + 78302*B - 322990*C - 487539*D >= 0);
+  cs.insert(-8554*A - 48955*B >= -10000);
+  cs.insert(-257370*C - 312877*D >= -10000);
+
+  // Cost function.
+  Linear_Expression cost(12*A + 6*B + 4*C + 3*D);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+		  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = Coefficient("8231960000");
+  Coefficient den_kr = 581120267;
+
+  return pg == point(679355000*A + 19925000*C + 0*D, 581120267)
+    && num == num_kr && den == den_kr;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(Coefficient("-3152519739159347")*x1
+	    - Coefficient("4503599627370496")*x2
+	    >= Coefficient("-2837267765243412480"));
+  cs.insert(Coefficient("-14411518807585588")*x1
+	    - Coefficient("3602879701896397")*x2
+	    >= Coefficient("-19455550390240542720"));
+  cs.insert(Coefficient("25300281663413827294061918339864663381194581220517764794612669753428792445999418361495047962679640561898384733039601488923726092173224184608376674992592313740189678034570795170558363467761652042654970959809093133570250935428086587327262919456144944542601257064044846194041676826903812816523290938580750782913463467636686848")*x1
+	    >= Coefficient("17591821432561"));
+  cs.insert(x2 >= 20);
+  cs.insert(-x2 >= -500);
+
+  // Cost function.
+  Linear_Expression cost(4*x1 + x2);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+		  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Maximum value = " << num << "/" << den << endl;
+
+  if (pg != point(Coefficient("2747195772696002560")*x1
+		  + Coefficient("63050394783186940")*x2,
+		  Coefficient("3152519739159347"))
+      || num != Coefficient("11051833485567197180")
+      || den != Coefficient("3152519739159347"))
+    return false;
+
+  mip.set_optimization_mode(MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  mip.optimal_value(num, den);
+  nout << "Minimum value = " << num << "/" << den << endl;
+
+  if (pg != point(Coefficient("17591821432561")*x1 + Coefficient("506005633268276545881238366797293267623891624410355295892253395068575848919988367229900959253592811237967694660792029778474521843464483692167533499851846274803793560691415903411167269355233040853099419196181862671405018708561731746545258389122898890852025141280896923880833536538076256330465818771615015658269269352733736960")*x2, Coefficient("2530028166341382729406191833986466338119458122051776479461266975342879244599941836 [...]
+      || num != Coefficient("126501408317069136470309591699323316905972906102588823973063348767143962229997091807475239813398202809491923665198007444618630460866120923041883374962961568700948390172853975852791817338808260213274854799045465667851254677140432936636314597280724722713006285320224230970208384134519064082616454692903753914567334930004866801")
+      || den != Coefficient("6325070415853456823515479584966165845298645305129441198653167438357198111499854590373761990669910140474596183259900372230931523043306046152094168748148078435047419508642698792639590866940413010663742739952273283392562733857021646831815729864036236135650314266011211548510419206725953204130822734645187695728365866909171712"))
+    return false;
+
+  return true;
+}
+
+}
+
+// namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F64(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_F64(test08);
+  DO_TEST_F32(test09);
+  DO_TEST_F64(test10);
+END_MAIN
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e34e86d..3ecef76 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,17 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-SUBDIRS = . BD_Shape Polyhedron Grid
+SUBDIRS = \
+. \
+Powerset \
+Partially_Reduced_Product \
+Box \
+MIP_Problem \
+Octagonal_Shape \
+BD_Shape \
+Polyhedron \
+Grid
+#Ask_Tell
 
 AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
 
@@ -32,14 +42,16 @@ files.cc \
 print.hh \
 print.cc \
 ppl_test.cc \
-BBox.cc \
+FCAIBVP.cc \
 Partial_Function.cc
 
 LDADD = $(top_builddir)/src/libppl.la libppl_tests.a -lppl @extra_libraries@
 
 noinst_HEADERS = \
 ppl_test.hh \
-BBox.hh \
+FCAIBVP.defs.hh \
+FCAIBVP.inlines.hh \
+FCAIBVP.types.hh \
 Partial_Function.defs.hh \
 Partial_Function.inlines.hh \
 Partial_Function.types.hh \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 35de578..4267b5d 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,15 +36,11 @@
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -62,7 +58,8 @@ subdir = tests
 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -72,8 +69,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -84,74 +91,59 @@ ARFLAGS = cru
 libppl_tests_a_AR = $(AR) $(ARFLAGS)
 libppl_tests_a_LIBADD =
 am_libppl_tests_a_OBJECTS = files.$(OBJEXT) print.$(OBJEXT) \
-	ppl_test.$(OBJEXT) BBox.$(OBJEXT) Partial_Function.$(OBJEXT)
+	ppl_test.$(OBJEXT) FCAIBVP.$(OBJEXT) \
+	Partial_Function.$(OBJEXT)
 libppl_tests_a_OBJECTS = $(am_libppl_tests_a_OBJECTS)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(libppl_tests_a_SOURCES)
 DIST_SOURCES = $(libppl_tests_a_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
 HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -161,53 +153,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -216,56 +206,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -277,10 +241,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -289,26 +257,55 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
-SUBDIRS = . BD_Shape Polyhedron Grid
+SUBDIRS = \
+. \
+Powerset \
+Partially_Reduced_Product \
+Box \
+MIP_Problem \
+Octagonal_Shape \
+BD_Shape \
+Polyhedron \
+Grid
+
+#Ask_Tell
 AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
 check_LIBRARIES = libppl_tests.a
 libppl_tests_a_SOURCES = \
@@ -317,13 +314,15 @@ files.cc \
 print.hh \
 print.cc \
 ppl_test.cc \
-BBox.cc \
+FCAIBVP.cc \
 Partial_Function.cc
 
 LDADD = $(top_builddir)/src/libppl.la libppl_tests.a -lppl @extra_libraries@
 noinst_HEADERS = \
 ppl_test.hh \
-BBox.hh \
+FCAIBVP.defs.hh \
+FCAIBVP.inlines.hh \
+FCAIBVP.types.hh \
 Partial_Function.defs.hh \
 Partial_Function.inlines.hh \
 Partial_Function.types.hh \
@@ -379,29 +378,29 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BBox.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/FCAIBVP.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Partial_Function.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/files.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_test.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/print.Po at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -412,10 +411,6 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -447,8 +442,7 @@ $(RECURSIVE_TARGETS):
 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
 	fi; test -z "$$fail"
 
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
+$(RECURSIVE_CLEAN_TARGETS):
 	@failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
 	  case $$f in \
@@ -492,8 +486,8 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -518,8 +512,8 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -529,13 +523,12 @@ ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -549,22 +542,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -578,7 +570,7 @@ distdir: $(DISTFILES)
 	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
 	    distdir=`$(am__cd) $(distdir) && pwd`; \
 	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
@@ -586,6 +578,8 @@ distdir: $(DISTFILES)
 	      $(MAKE) $(AM_MAKEFLAGS) \
 	        top_distdir="$$top_distdir" \
 	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -630,7 +624,7 @@ distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-recursive
 
@@ -644,12 +638,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-recursive
+
 install-exec-am:
 
+install-html: install-html-recursive
+
 install-info: install-info-recursive
 
 install-man:
 
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -670,23 +672,25 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
 
-uninstall-info: uninstall-info-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
 
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-checkLIBRARIES clean-generic clean-libtool \
-	clean-recursive ctags ctags-recursive distclean \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-checkLIBRARIES \
+	clean-generic clean-libtool ctags ctags-recursive distclean \
 	distclean-compile distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic maintainer-clean-recursive \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
 	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am uninstall-info-am
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/Octagonal_Shape/Makefile.am b/tests/Octagonal_Shape/Makefile.am
new file mode 100644
index 0000000..71abd3a
--- /dev/null
+++ b/tests/Octagonal_Shape/Makefile.am
@@ -0,0 +1,277 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = CHECKER="$(CHECKER)"
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+check_PROGRAMS = \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affineimage2 \
+affinepreimage1 \
+affinepreimage2 \
+ascii_dump_load1 \
+bhz03widening1 \
+bhmz05widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+bounds1 \
+cc76extrapolation1 \
+cc76narrowing1 \
+chinainit \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+discrete1 \
+disjoint1 \
+empty1 \
+expandspacedim1 \
+foldspacedims1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedim1 \
+generalizedaffineimage1 \
+generalizedaffineimage2 \
+generalizedaffineimage3 \
+generalizedaffineimage4 \
+generalizedaffineimage5 \
+generalizedaffinepreimage1 \
+generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+generalizedaffinepreimage4 \
+intersection1 \
+limitedbhmz05extrapolation1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+max_min2 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+octdifference1 \
+octhull1 \
+pointsetpowerset1 \
+relatwithcons1 \
+relatwithcons2 \
+relatwithcons3 \
+relatwithgen1 \
+removespacedims1 \
+timeelapse1 \
+unconstrain1 \
+universe1 \
+writeoctagon1
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DOCTAGONAL_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+run_tests.stamp: run_tests
+	+$(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCE=float
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCE=double
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCE=long_double
+endif
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+chinainit_SOURCES = chinainit.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+empty1_SOURCES = empty1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffineimage4_SOURCES = generalizedaffineimage4.cc
+generalizedaffineimage5_SOURCES = generalizedaffineimage5.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generalizedaffinepreimage4_SOURCES = generalizedaffinepreimage4.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+octdifference1_SOURCES = octdifference1.cc
+
+octhull1_SOURCES = octhull1.cc
+
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+
+relatwithcons1_SOURCES = relatwithcons1.cc
+relatwithcons2_SOURCES = relatwithcons2.cc
+relatwithcons3_SOURCES = relatwithcons3.cc
+
+relatwithgen1_SOURCES = relatwithgen1.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+writeoctagon1_SOURCES = writeoctagon1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+DISTCLEANFILES = \
+run_tests.stamp
diff --git a/tests/Octagonal_Shape/Makefile.in b/tests/Octagonal_Shape/Makefile.in
new file mode 100644
index 0000000..aa561e7
--- /dev/null
+++ b/tests/Octagonal_Shape/Makefile.in
@@ -0,0 +1,1509 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = addspacedims1$(EXEEXT) affinedimension1$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+	ascii_dump_load1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bhmz05widening1$(EXEEXT) bounded1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	bounds1$(EXEEXT) cc76extrapolation1$(EXEEXT) \
+	cc76narrowing1$(EXEEXT) chinainit$(EXEEXT) \
+	concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+	constrains1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+	disjoint1$(EXEEXT) empty1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frombdshape1$(EXEEXT) \
+	frombox1$(EXEEXT) fromgensys1$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+	fromspacedim1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffineimage3$(EXEEXT) \
+	generalizedaffineimage4$(EXEEXT) \
+	generalizedaffineimage5$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) \
+	generalizedaffinepreimage4$(EXEEXT) intersection1$(EXEEXT) \
+	limitedbhmz05extrapolation1$(EXEEXT) \
+	limitedcc76extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+	max_min1$(EXEEXT) max_min2$(EXEEXT) maxspacedim1$(EXEEXT) \
+	membytes1$(EXEEXT) minconstraints1$(EXEEXT) \
+	octdifference1$(EXEEXT) octhull1$(EXEEXT) \
+	pointsetpowerset1$(EXEEXT) relatwithcons1$(EXEEXT) \
+	relatwithcons2$(EXEEXT) relatwithcons3$(EXEEXT) \
+	relatwithgen1$(EXEEXT) removespacedims1$(EXEEXT) \
+	timeelapse1$(EXEEXT) unconstrain1$(EXEEXT) universe1$(EXEEXT) \
+	writeoctagon1$(EXEEXT)
+XFAIL_TESTS =
+subdir = tests/Octagonal_Shape
+DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhmz05widening1_OBJECTS = bhmz05widening1.$(OBJEXT)
+bhmz05widening1_OBJECTS = $(am_bhmz05widening1_OBJECTS)
+bhmz05widening1_LDADD = $(LDADD)
+bhmz05widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
+cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
+cc76extrapolation1_LDADD = $(LDADD)
+cc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_chinainit_OBJECTS = chinainit.$(OBJEXT)
+chinainit_OBJECTS = $(am_chinainit_OBJECTS)
+chinainit_LDADD = $(LDADD)
+chinainit_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage3_OBJECTS =  \
+	generalizedaffineimage3.$(OBJEXT)
+generalizedaffineimage3_OBJECTS =  \
+	$(am_generalizedaffineimage3_OBJECTS)
+generalizedaffineimage3_LDADD = $(LDADD)
+generalizedaffineimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage4_OBJECTS =  \
+	generalizedaffineimage4.$(OBJEXT)
+generalizedaffineimage4_OBJECTS =  \
+	$(am_generalizedaffineimage4_OBJECTS)
+generalizedaffineimage4_LDADD = $(LDADD)
+generalizedaffineimage4_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage5_OBJECTS =  \
+	generalizedaffineimage5.$(OBJEXT)
+generalizedaffineimage5_OBJECTS =  \
+	$(am_generalizedaffineimage5_OBJECTS)
+generalizedaffineimage5_LDADD = $(LDADD)
+generalizedaffineimage5_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS =  \
+	generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS =  \
+	$(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage4_OBJECTS =  \
+	generalizedaffinepreimage4.$(OBJEXT)
+generalizedaffinepreimage4_OBJECTS =  \
+	$(am_generalizedaffinepreimage4_OBJECTS)
+generalizedaffinepreimage4_LDADD = $(LDADD)
+generalizedaffinepreimage4_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedbhmz05extrapolation1_OBJECTS =  \
+	limitedbhmz05extrapolation1.$(OBJEXT)
+limitedbhmz05extrapolation1_OBJECTS =  \
+	$(am_limitedbhmz05extrapolation1_OBJECTS)
+limitedbhmz05extrapolation1_LDADD = $(LDADD)
+limitedbhmz05extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS =  \
+	limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS =  \
+	$(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min2_OBJECTS = max_min2.$(OBJEXT)
+max_min2_OBJECTS = $(am_max_min2_OBJECTS)
+max_min2_LDADD = $(LDADD)
+max_min2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_octdifference1_OBJECTS = octdifference1.$(OBJEXT)
+octdifference1_OBJECTS = $(am_octdifference1_OBJECTS)
+octdifference1_LDADD = $(LDADD)
+octdifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_octhull1_OBJECTS = octhull1.$(OBJEXT)
+octhull1_OBJECTS = $(am_octhull1_OBJECTS)
+octhull1_LDADD = $(LDADD)
+octhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset1_OBJECTS = pointsetpowerset1.$(OBJEXT)
+pointsetpowerset1_OBJECTS = $(am_pointsetpowerset1_OBJECTS)
+pointsetpowerset1_LDADD = $(LDADD)
+pointsetpowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithcons1_OBJECTS = relatwithcons1.$(OBJEXT)
+relatwithcons1_OBJECTS = $(am_relatwithcons1_OBJECTS)
+relatwithcons1_LDADD = $(LDADD)
+relatwithcons1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithcons2_OBJECTS = relatwithcons2.$(OBJEXT)
+relatwithcons2_OBJECTS = $(am_relatwithcons2_OBJECTS)
+relatwithcons2_LDADD = $(LDADD)
+relatwithcons2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithcons3_OBJECTS = relatwithcons3.$(OBJEXT)
+relatwithcons3_OBJECTS = $(am_relatwithcons3_OBJECTS)
+relatwithcons3_LDADD = $(LDADD)
+relatwithcons3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithgen1_OBJECTS = relatwithgen1.$(OBJEXT)
+relatwithgen1_OBJECTS = $(am_relatwithgen1_OBJECTS)
+relatwithgen1_LDADD = $(LDADD)
+relatwithgen1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writeoctagon1_OBJECTS = writeoctagon1.$(OBJEXT)
+writeoctagon1_OBJECTS = $(am_writeoctagon1_OBJECTS)
+writeoctagon1_LDADD = $(LDADD)
+writeoctagon1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(addspacedims1_SOURCES) $(affinedimension1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bhmz05widening1_SOURCES) \
+	$(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(chinainit_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(empty1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
+	$(generalizedaffineimage4_SOURCES) \
+	$(generalizedaffineimage5_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) \
+	$(generalizedaffinepreimage4_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(octdifference1_SOURCES) \
+	$(octhull1_SOURCES) $(pointsetpowerset1_SOURCES) \
+	$(relatwithcons1_SOURCES) $(relatwithcons2_SOURCES) \
+	$(relatwithcons3_SOURCES) $(relatwithgen1_SOURCES) \
+	$(removespacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(writeoctagon1_SOURCES)
+DIST_SOURCES = $(addspacedims1_SOURCES) $(affinedimension1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bhmz05widening1_SOURCES) \
+	$(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(chinainit_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(empty1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
+	$(generalizedaffineimage4_SOURCES) \
+	$(generalizedaffineimage5_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) \
+	$(generalizedaffinepreimage4_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(octdifference1_SOURCES) \
+	$(octhull1_SOURCES) $(pointsetpowerset1_SOURCES) \
+	$(relatwithcons1_SOURCES) $(relatwithcons2_SOURCES) \
+	$(relatwithcons3_SOURCES) $(relatwithgen1_SOURCES) \
+	$(removespacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(writeoctagon1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = CHECKER="$(CHECKER)"
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DOCTAGONAL_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCE = long_double
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+
+#
+# Sources for the tests
+#
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+bounds1_SOURCES = bounds1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+chinainit_SOURCES = chinainit.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+empty1_SOURCES = empty1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffineimage4_SOURCES = generalizedaffineimage4.cc
+generalizedaffineimage5_SOURCES = generalizedaffineimage5.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generalizedaffinepreimage4_SOURCES = generalizedaffinepreimage4.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+octdifference1_SOURCES = octdifference1.cc
+octhull1_SOURCES = octhull1.cc
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+relatwithcons1_SOURCES = relatwithcons1.cc
+relatwithcons2_SOURCES = relatwithcons2.cc
+relatwithcons3_SOURCES = relatwithcons3.cc
+relatwithgen1_SOURCES = relatwithgen1.cc
+removespacedims1_SOURCES = removespacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+writeoctagon1_SOURCES = writeoctagon1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+DISTCLEANFILES = \
+run_tests.stamp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Octagonal_Shape/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Octagonal_Shape/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) 
+	@rm -f affinepreimage2$(EXEEXT)
+	$(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) 
+	@rm -f bhmz05widening1$(EXEEXT)
+	$(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) 
+	@rm -f cc76extrapolation1$(EXEEXT)
+	$(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) 
+	@rm -f cc76narrowing1$(EXEEXT)
+	$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+chinainit$(EXEEXT): $(chinainit_OBJECTS) $(chinainit_DEPENDENCIES) 
+	@rm -f chinainit$(EXEEXT)
+	$(CXXLINK) $(chinainit_OBJECTS) $(chinainit_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) 
+	@rm -f fromgensys1$(EXEEXT)
+	$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) 
+	@rm -f fromspacedim1$(EXEEXT)
+	$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) 
+	@rm -f generalizedaffineimage3$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS)
+generalizedaffineimage4$(EXEEXT): $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_DEPENDENCIES) 
+	@rm -f generalizedaffineimage4$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_LDADD) $(LIBS)
+generalizedaffineimage5$(EXEEXT): $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_DEPENDENCIES) 
+	@rm -f generalizedaffineimage5$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage3$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+generalizedaffinepreimage4$(EXEEXT): $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage4$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) 
+	@rm -f limitedbhmz05extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) 
+	@rm -f limitedcc76extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) 
+	@rm -f max_min2$(EXEEXT)
+	$(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS)
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+octdifference1$(EXEEXT): $(octdifference1_OBJECTS) $(octdifference1_DEPENDENCIES) 
+	@rm -f octdifference1$(EXEEXT)
+	$(CXXLINK) $(octdifference1_OBJECTS) $(octdifference1_LDADD) $(LIBS)
+octhull1$(EXEEXT): $(octhull1_OBJECTS) $(octhull1_DEPENDENCIES) 
+	@rm -f octhull1$(EXEEXT)
+	$(CXXLINK) $(octhull1_OBJECTS) $(octhull1_LDADD) $(LIBS)
+pointsetpowerset1$(EXEEXT): $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_DEPENDENCIES) 
+	@rm -f pointsetpowerset1$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_LDADD) $(LIBS)
+relatwithcons1$(EXEEXT): $(relatwithcons1_OBJECTS) $(relatwithcons1_DEPENDENCIES) 
+	@rm -f relatwithcons1$(EXEEXT)
+	$(CXXLINK) $(relatwithcons1_OBJECTS) $(relatwithcons1_LDADD) $(LIBS)
+relatwithcons2$(EXEEXT): $(relatwithcons2_OBJECTS) $(relatwithcons2_DEPENDENCIES) 
+	@rm -f relatwithcons2$(EXEEXT)
+	$(CXXLINK) $(relatwithcons2_OBJECTS) $(relatwithcons2_LDADD) $(LIBS)
+relatwithcons3$(EXEEXT): $(relatwithcons3_OBJECTS) $(relatwithcons3_DEPENDENCIES) 
+	@rm -f relatwithcons3$(EXEEXT)
+	$(CXXLINK) $(relatwithcons3_OBJECTS) $(relatwithcons3_LDADD) $(LIBS)
+relatwithgen1$(EXEEXT): $(relatwithgen1_OBJECTS) $(relatwithgen1_DEPENDENCIES) 
+	@rm -f relatwithgen1$(EXEEXT)
+	$(CXXLINK) $(relatwithgen1_OBJECTS) $(relatwithgen1_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+writeoctagon1$(EXEEXT): $(writeoctagon1_OBJECTS) $(writeoctagon1_DEPENDENCIES) 
+	@rm -f writeoctagon1$(EXEEXT)
+	$(CXXLINK) $(writeoctagon1_OBJECTS) $(writeoctagon1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/chinainit.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhmz05extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/octdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/octhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithgen1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeoctagon1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am
+
+
+run_tests.stamp: run_tests
+	+$(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Octagonal_Shape/addspacedims1.cc b/tests/Octagonal_Shape/addspacedims1.cc
new file mode 100644
index 0000000..9d4b860
--- /dev/null
+++ b/tests/Octagonal_Shape/addspacedims1.cc
@@ -0,0 +1,234 @@
+/* Test Octagonal_Shape::add_space_dimensions_and_embed() and
+   Octagonal_Shape::add_space_dimensions_and_project().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+//   Variable y(1);
+//   Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(x <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.add_space_dimensions_and_embed(2);
+  oc.add_constraint(w <= 2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc,
+                    "*** oc.add_space_dimensions_and_embed(2) "
+                    "and oc.add_constraint(w <= 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(1, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_embed(2);
+  oc2.add_space_dimensions_and_embed(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  //  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(x <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.add_space_dimensions_and_project(2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(z == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Constraint_System cs;
+  cs.insert(x >= 2);
+  cs.insert(y >= 2);
+  cs.insert(x <= 6);
+  cs.insert(y <= 6);
+
+  TOctagonal_Shape oc(cs);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.add_space_dimensions_and_project(2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(z == 0);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(x <= 6);
+  known_result.add_constraint(y <= 6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 2);
+
+  TOctagonal_Shape oc2(oc1);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_embed(0);
+  oc2.add_space_dimensions_and_project(0);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_embed(0) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(0) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(1, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_project(2);
+  oc2.add_space_dimensions_and_project(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TOctagonal_Shape oc1(0);
+  TOctagonal_Shape oc2(1);
+  oc2.add_constraint(A == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_project(2);
+  oc2.add_space_dimensions_and_project(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(1);
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(B == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_project(2);
+  oc2.add_space_dimensions_and_project(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinedimension1.cc b/tests/Octagonal_Shape/affinedimension1.cc
new file mode 100644
index 0000000..0742899
--- /dev/null
+++ b/tests/Octagonal_Shape/affinedimension1.cc
@@ -0,0 +1,305 @@
+/* Test Octagonal_Shape::affine_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(3);
+
+  oct.add_constraint(x <= 2);
+  oct.add_constraint(x - y == 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A <= 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A == 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 3);
+  oct.add_constraint(B - A <= -5);
+  oct.add_constraint(-B <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+ 
+  dimension_type affine_dim = oct.affine_dimension();
+ 
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(E == 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(7);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B == 2);
+  oct.add_constraint(B - A <= -6);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+   bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test11() {
+  TOctagonal_Shape oct(0, UNIVERSE);
+
+  const dimension_type affine_dim = oct.affine_dimension();
+
+  print_constraints(oct, "*** oct ***");
+
+  return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/affineimage1.cc b/tests/Octagonal_Shape/affineimage1.cc
new file mode 100644
index 0000000..fa619a6
--- /dev/null
+++ b/tests/Octagonal_Shape/affineimage1.cc
@@ -0,0 +1,459 @@
+/* Test Octagonal_Shape::affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, y);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, -y);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x + y == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, -y) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, x + 4);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 7);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, x + 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, Linear_Expression(4));
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x == 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, 4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oc1);
+
+  oc1.affine_image(x, x);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, x) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, 2*x - 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, 2*x -2, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(y, 2*x, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(y, 2*x, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(y, 3*x + 3, 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(y, 3*x+ 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+   print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, 2*A +2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+
+  Linear_Expression coeff1 = x + 1;
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_image(v, e, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    oct.affine_image(y, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x + y >= 2);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    oct.affine_image(y, z - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    oct.affine_image(x, y - z + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space
+    // of the polyhedron.
+    oct.affine_image(z, y - x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B - A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, 2*A +2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A <= 3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(B - A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -2*A + 3, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A <= -1);
+  known_result.add_constraint(2*A >= -3);
+  known_result.add_constraint(B >= 4);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -2*A + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(x <= 2);
+  oc.add_constraint(x - y <= 3);
+  oc.add_constraint(y <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(y, 2*x - 4, -2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x + y == 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc1.affine_image(y, 2*x - 4, -2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affineimage2.cc b/tests/Octagonal_Shape/affineimage2.cc
new file mode 100644
index 0000000..73ef506
--- /dev/null
+++ b/tests/Octagonal_Shape/affineimage2.cc
@@ -0,0 +1,553 @@
+/* Test Octagonal_Shape::affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C >= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, C + B, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(B - A <= -1);
+  known_result.add_constraint(C - A <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, C + B, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, C + B, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(A - B <= 1);
+  known_result.add_constraint(A - C >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, C + B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+  oc.add_constraint(A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -A, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(A <= -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -A, 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B <= 2);
+  oc.add_constraint(-A + B <= 1);
+  oc.add_constraint(A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -A, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(-A + B <= 2);
+  known_result.add_constraint(A + B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + C <= 3);
+  oc.add_constraint(A <= 2);
+  oc.add_constraint(A >= 1);
+  oc.add_constraint(D >= 1);
+  oc.add_constraint(D <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -A + 2*D, 1);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(D >= 1);
+  known_result.add_constraint(D <= 2);
+  known_result.add_constraint(A <= 3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - D <= 1);
+  known_result.add_constraint(D - A <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -A + 2*D, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= -1);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -C - B, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -1);
+  known_result.add_constraint(2*A <= 3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(C >= -1);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B + A) >= -3);
+  known_result.add_constraint(2*(C + A) >= -1);
+  known_result.add_constraint(2*(B + A) <= 1);
+  known_result.add_constraint(2*(C + A) <= 3);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -C - B, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -B, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B + A >= -1);
+  known_result.add_constraint(B + A <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -B, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, B + 3, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(2*A <= 3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) >= 3);
+  known_result.add_constraint(2*(A - B) <= 5);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, B + 1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= -1);
+  known_result.add_constraint(2*A <= 1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B + A) >= -3);
+  known_result.add_constraint(2*(B + A) <= -1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -B + 1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= -3);
+  known_result.add_constraint(2*A <= -1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) <= 1);
+  known_result.add_constraint(2*(B - A) <= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -B + 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= 0);
+  oc.add_constraint(C <= 10);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, -A + C + 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(-A - B <= -1);
+  known_result.add_constraint(A + B <= 11);
+  known_result.add_constraint(B - C >= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, -A + C +1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(C <= 10);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, -A + C + 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 11);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(-A - B <= -1);
+  known_result.add_constraint(A + B <= 11);
+  known_result.add_constraint(B - C <= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, -A + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A - B >= 0);
+  oc.add_constraint(C - B <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C - A <= 10);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, -A + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(C <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(C - A <= 10);
+  known_result.add_constraint(B - A <= 11);
+  known_result.add_constraint(B - C >= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, A + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(C <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1, -1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(C - A <= 10);
+  known_result.add_constraint(A + B >= -11);
+  known_result.add_constraint(B + C <= -1);
+
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, A + C + 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C >= 1);
+  oc.add_constraint(A <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(A <= 10);
+  known_result.add_constraint(B - A >= 2);
+  known_result.add_constraint(B - C <= 11);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C >= 1);
+  oc.add_constraint(A <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1, -1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(A <= 10);
+  known_result.add_constraint(B + A <= -2);
+  known_result.add_constraint(B + C >= -11);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + C + 1, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinepreimage1.cc b/tests/Octagonal_Shape/affinepreimage1.cc
new file mode 100644
index 0000000..6dd1f30
--- /dev/null
+++ b/tests/Octagonal_Shape/affinepreimage1.cc
@@ -0,0 +1,293 @@
+/* Test Octagonal_Shape::affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_preimage(x, y);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_preimage(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A - B - 3 >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, B - 1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, B-1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 2*A + 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, Linear_Expression(3));
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, B - 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x + y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(z <= 2);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_preimage(v, e, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    oct.affine_preimage(y, y + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 2);
+  oct.add_constraint(y <= 7);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::affine_preimage(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    oct.affine_preimage(x, z - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 2);
+  oct.add_constraint(y <= 7);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::affine_preimage(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    oct.affine_preimage(z, x - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B <= -2);
+  oc.add_constraint(B - A >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, A + 3);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Octagonal_Shape<float> oc(3);
+  oc.add_constraint(A <= -1);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 3*A, 2);
+
+  Octagonal_Shape<mpq_class> mpq_known_result(3);
+  mpq_known_result.add_constraint(3*A <= -2);
+
+  bool ok = check_result(oc, mpq_known_result,
+                         "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 3*A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinepreimage2.cc b/tests/Octagonal_Shape/affinepreimage2.cc
new file mode 100644
index 0000000..ea77ce9
--- /dev/null
+++ b/tests/Octagonal_Shape/affinepreimage2.cc
@@ -0,0 +1,425 @@
+/* Test Octagonal_Shape::affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, B + C - 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B + C >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, B + C - 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, -B + C - 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B - C <= -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, -B + C - 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, A - C + 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - A <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, A - C + 3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, -A - C + 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(A + C <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, -A - C + 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, B - C + 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, B - C + 3) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, 2*B - C - 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(2*B >= 1);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 2*B - C - 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, 2*B - 2*C - 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 2*B - 2*C - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, 2*B - 2*C - 2, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B >= -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 2*B - 2*C - 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(C, 4*B + 6*C + 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(6*C >= -2);
+
+  bool ok = check_result(oc, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oc, "*** oc.affine_preimage(C, 4*B + 6*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(C, 4*B + 6*C + 2, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(C, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, -2*A + 3*C + 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - A <= -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, -2*A + 3*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 3*A + C - 1, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A <= -1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+  bool ok = check_result(oc, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 3*A + C - 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(A == 2);
+  oc.add_constraint(B == 0);
+  oc.add_constraint(C >= -3);
+  oc.add_constraint(D <= 5);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 2);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C >= -3);
+  known_result.add_constraint(5*D <= 14);
+  bool ok = check_result(oc, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oc,
+                    "*** oc.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/ascii_dump_load1.cc b/tests/Octagonal_Shape/ascii_dump_load1.cc
new file mode 100644
index 0000000..f783eac
--- /dev/null
+++ b/tests/Octagonal_Shape/ascii_dump_load1.cc
@@ -0,0 +1,330 @@
+/* Test Octagonal_Shape::ascii_dump() and Octagonal_Shape::ascii_load().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+
+  nout << "test01()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A - B >= 2);
+  oc1.add_constraint(B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  oc2.ascii_load(f);
+  close(f);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool ok = (oc1 == oc2);
+
+  return ok;
+}
+
+bool
+test02() {
+
+  nout << "test02()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A - B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc1.ascii_dump(f);
+  f.seekp(0);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  nout << "test03()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while (str != "-EM");
+  f.seekp(0, std::ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+
+  nout << "test04()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 1);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "+ZE");
+  f.seekp(0, std::ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+
+ nout << "test05()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 2);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "-SC");
+  f.seekp(0, std::ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+
+  nout << "test06()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 3);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "+inf");
+  f.seekp(0, std::ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+
+  nout << "test07()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 3);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "+inf");
+  do
+    f >> str;
+  while(str != "+inf");
+  f.seekp(0, std::ios_base::cur);
+  f << " 3 ";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+
+  nout << "test08()" << endl;
+
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  oc2.ascii_load(f);
+  close(f);
+
+  bool ok = (oc1 == oc2);
+
+  return ok;
+}
+
+bool
+test09() {
+
+  nout << "test09()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while (str != "space_dim");
+  f.seekp(0, std::ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bhmz05widening1.cc b/tests/Octagonal_Shape/bhmz05widening1.cc
new file mode 100644
index 0000000..45a8d0b
--- /dev/null
+++ b/tests/Octagonal_Shape/bhmz05widening1.cc
@@ -0,0 +1,708 @@
+/* Test Octagonal_Shape::BHMZ05_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 1);
+  oc1.add_constraint(x - y <= 2);
+  oc1.add_constraint(y - x <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y <= 2);
+  oc2.add_constraint(-x <= 3);
+  oc2.add_constraint(x <= 0);
+  oc2.add_constraint(y - x <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc1;
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 1);
+  oc1.add_constraint(B >= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A - B >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(C >= 1);
+  oc1.add_constraint(D >= 0);
+  oc1.add_constraint(E >= 0);
+  oc1.add_constraint(C - D <= 76);
+  oc1.add_constraint(C - E <= 76);
+  oc1.add_constraint(E - D == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(C >= 1);
+  oc2.add_constraint(D >= 0);
+  oc2.add_constraint(E >= 0);
+  oc2.add_constraint(C - D <= 75);
+  oc2.add_constraint(C - E <= 75);
+  oc2.add_constraint(E - D == 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(E - D == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(B <= 39);
+  oc1.add_constraint(C >= 0);
+  oc1.add_constraint(C <= 40);
+  oc1.add_constraint(D >= 0);
+  oc1.add_constraint(D <= 40);
+  oc1.add_constraint(B - A <= 39);
+  oc1.add_constraint(C - A <= 40);
+  oc1.add_constraint(D - A <= 40);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - B <= 1);
+  oc1.add_constraint(B - D <= 0);
+  oc1.add_constraint(D - B <= 2);
+  oc1.add_constraint(C - D <= 0);
+  oc1.add_constraint(D - C <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(B <= 38);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(C <= 39);
+  oc2.add_constraint(D >= 0);
+  oc2.add_constraint(D <= 40);
+  oc2.add_constraint(B - A <= 38);
+  oc2.add_constraint(C - A <= 39);
+  oc2.add_constraint(D - A <= 40);
+  oc2.add_constraint(B - C <= 0);
+  oc2.add_constraint(C - B <= 1);
+  oc2.add_constraint(B - D <= 0);
+  oc2.add_constraint(D - B <= 2);
+  oc2.add_constraint(C - D <= 0);
+  oc2.add_constraint(D - C <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(B - C <= 0);
+  known_result.add_constraint(C - B <= 1);
+  known_result.add_constraint(C - D <= 0);
+  known_result.add_constraint(D - C <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(B <= 1);
+  oc1.add_constraint(C <= 7);
+  oc1.add_constraint(D >= 0);
+  oc1.add_constraint(A + B <= 10);
+  oc1.add_constraint(C - A <= 10);
+  oc1.add_constraint(D - A <= 10);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - B <= 1);
+  oc1.add_constraint(B - D <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(B <= 1);
+  oc2.add_constraint(C <= 7);
+  oc2.add_constraint(D >= 0);
+  oc2.add_constraint(A + B <= 9);
+  oc2.add_constraint(C - A <= 9);
+  oc2.add_constraint(D - A <= 10);
+  oc2.add_constraint(B - C <= 0);
+  oc2.add_constraint(C - B <= 1);
+  oc2.add_constraint(B - D <= 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C <= 7);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - A <= 10);
+  known_result.add_constraint(B - C <= 0);
+  known_result.add_constraint(C - B <= 1);
+  known_result.add_constraint(B - D <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A + B >= 9);
+  oc1.add_constraint(B + C >= 11);
+  oc1.add_constraint(C + D >= 12);
+  oc1.add_constraint(D + E >= 5);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A + B >= 10);
+  oc2.add_constraint(B + C >= 11);
+  oc2.add_constraint(C + D >= 12);
+  oc2.add_constraint(D + E >= 13);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(B + C >= 11);
+  known_result.add_constraint(C + D >= 12);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A - B <= 2);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - A <= -2);
+  oc1.add_constraint(A - D <= 2);
+  oc1.add_constraint(E - D <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A - B <= 2);
+  oc2.add_constraint(B - C <= 0);
+  oc2.add_constraint(C - A <= -2);
+  oc2.add_constraint(B - A <= 3);
+  oc2.add_constraint(A - D <= 1);
+  oc2.add_constraint(E - D <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(B - C <= 0);
+  known_result.add_constraint(C - A <= -2);
+  known_result.add_constraint(E - D <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A - B <= 2);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - A <= -2);
+  oc1.add_constraint(A - D <= 2);
+  oc1.add_constraint(E - D <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A - B <= 2);
+  oc2.add_constraint(B - A <= -7);
+  oc2.add_constraint(C - A == -2);
+  oc2.add_constraint(A - D <= 1);
+  oc2.add_constraint(E - D <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oc1);
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(B <= 0);
+  oc1.add_constraint(C <= -2);
+  oc1.add_constraint(D <= 2);
+  oc1.add_constraint(E <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(B <= -7);
+  oc2.add_constraint(C <= -2);
+  oc2.add_constraint(D <= 2);
+  oc2.add_constraint(E <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(C <= -2);
+  known_result.add_constraint(D <= 2);
+  known_result.add_constraint(E <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A + C <= -1);
+  oc1.add_constraint(A + D <= 1);
+  oc1.add_constraint(B <= 0);
+  oc1.add_constraint(C <= -3);
+  oc1.add_constraint(D <= 2);
+  oc1.add_constraint(E <= 4);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(A + D <= 1);
+  oc2.add_constraint(B <= -1);
+  oc2.add_constraint(C <= -3);
+  oc2.add_constraint(D <= 2);
+  oc2.add_constraint(E <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(A + D <= 1);
+  known_result.add_constraint(C <= -3);
+  known_result.add_constraint(D <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(C - A <= -1);
+  oc1.add_constraint(B <= 0);
+  oc1.add_constraint(C >= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+  TOctagonal_Shape oct2(cs2);
+
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct2.BHMZ05_widening_assign(oct1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2.BHMZ05_widening_assign(oct1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  TOctagonal_Shape oc1(5);
+  TOctagonal_Shape oc2(10);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::BHMZ05_widening_assign(oc2): it is illegal to apply
+    // this method to two polyhedra that are not dimensional
+    // compatible.
+    oc2.BHMZ05_widening_assign(oc1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  unsigned tokens = 6;
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 1);
+  oc1.add_constraint(B >= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A - B >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= 1);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens <<
+    endl;
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 1);
+  oc1.add_constraint(x - y <= 2);
+  oc1.add_constraint(y - x <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y <= 2);
+  oc2.add_constraint(-x <= 3);
+  oc2.add_constraint(x <= 0);
+  oc2.add_constraint(y - x <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned tokens = TOKENS;
+
+  oc1.BHMZ05_widening_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens <<
+    endl;
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  unsigned tokens = 6;
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+  TOctagonal_Shape oct2(cs2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct2.BHMZ05_widening_assign(oct1, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+#undef TOKENS
+#define TOKENS 6
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens <<
+    endl;
+
+  print_constraints(oct2, "*** oct2.BHMZ05_widening_assign(oct1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
+
+
diff --git a/tests/Octagonal_Shape/bhz03widening1.cc b/tests/Octagonal_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..4626cdf
--- /dev/null
+++ b/tests/Octagonal_Shape/bhz03widening1.cc
@@ -0,0 +1,76 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  typedef Pointset_Powerset<TOctagonal_Shape> PSet;
+
+  TOctagonal_Shape p(2);
+  TOctagonal_Shape q(2);
+  TOctagonal_Shape r(2);
+  TOctagonal_Shape s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  PSet P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  PSet Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  using namespace IO_Operators;
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  PSet old_P = P;
+  P.BHZ03_widening_assign<H79_Certificate>
+    (Q, widen_fun_ref(&TOctagonal_Shape::BHMZ05_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bounded1.cc b/tests/Octagonal_Shape/bounded1.cc
new file mode 100644
index 0000000..e4829e9
--- /dev/null
+++ b/tests/Octagonal_Shape/bounded1.cc
@@ -0,0 +1,130 @@
+/* Test Octagonal_Shape::is_bounded().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  // This is a non-bounded OS.
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  return !oct.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded OS (it is a square);
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 2);
+  oct.add_constraint(y >= 2);
+  oct.add_constraint(x <= 4);
+  oct.add_constraint(y <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test03() {
+  // This is a universal, zero-dimensional OS.
+  TOctagonal_Shape oct;
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test04() {
+  // This is an empty, zero-dimensional OS.
+  TOctagonal_Shape oct;
+  oct.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test05() {
+  // This is an empty OS.
+  TOctagonal_Shape oct(4, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x + y >= 2);
+  oct.add_constraint(x - y >= 2);
+  oct.add_constraint(x + y <= 4);
+  oct.add_constraint(x - y <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x + y >= 2);
+  oct.add_constraint(x <= 1);
+  oct.add_constraint(x + y <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Octagonal_Shape/boundedaffineimage1.cc b/tests/Octagonal_Shape/boundedaffineimage1.cc
new file mode 100644
index 0000000..fc579d2
--- /dev/null
+++ b/tests/Octagonal_Shape/boundedaffineimage1.cc
@@ -0,0 +1,601 @@
+/* Test Octagonal_Shape::bounded_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.bounded_affine_image(A, Linear_Expression(7), Linear_Expression(3));
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 7, 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 7);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, 7) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7), -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, 7, -1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -7);
+  known_result.add_constraint(A <= -3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_image(A, Linear_Expression(7), Linear_Expression(3), -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 7, 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(A <= 6);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A - B <= 4);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, A+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), -A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, -A+2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  TOctagonal_Shape oct1 = oct;
+  TOctagonal_Shape oct2 = oct;
+
+
+  oct.bounded_affine_image(A, Linear_Expression(3), B+5);
+
+  oct1.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(3));
+  oct2.generalized_affine_image(A, LESS_OR_EQUAL, B+5);
+  oct1.intersection_assign(oct2);
+
+  bool ok = (oct == oct1);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, B+5) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A + B <= 5);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), B-5, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, B-5, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(A <= 23);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A - B <= 19);
+
+  oct.bounded_affine_image(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 2, 4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(2*A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(2*(A + B) <= 5);
+
+  oct.bounded_affine_image(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 2, "
+                    "4*A + 3*B - 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -5);
+  known_result.add_constraint(A <= 23);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A - B <= 19);
+  known_result.add_constraint(B - A <= 5);
+
+  oct.bounded_affine_image(A, 4*A + 3*B - 5, 4*A + 3*B - 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 4*A + 3*B - 5, "
+                    "4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(C <= 5);
+  oct.add_constraint(C >= -1);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+  oct.add_constraint(A - C <= 3);
+  oct.add_constraint(B - C <= 7);
+  oct.add_constraint(A - C >= 1);
+  oct.add_constraint(B - C >= -8);
+
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  known_result.add_constraint(A <= 9);
+  known_result.add_constraint(A >= 4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(C <= 3);
+  known_result.add_constraint(C >= -1);
+  known_result.add_constraint(C - B <= 1);
+
+  oct.bounded_affine_image(A, 4*A + 4, Linear_Expression(9));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 4*A + 4, "
+                    "9) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(C <= 5);
+  oct.add_constraint(C >= -1);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+  oct.add_constraint(A - C <= 3);
+  oct.add_constraint(B - C <= 7);
+  oct.add_constraint(A - C >= 1);
+  oct.add_constraint(B - C >= -8);
+
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 9);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(C <= 3);
+  known_result.add_constraint(C >= -1);
+  known_result.add_constraint(A - C >= 0);
+  known_result.add_constraint(B - C >= -1);
+
+  oct.bounded_affine_image(A, 4*C + 3, Linear_Expression(9));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 4*C + 3, "
+                    "9) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.bounded_affine_image(A, A, A);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, A, A) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_image(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_image(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    oct.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_epxr, d):
+    // it is illegal to apply this method to a variable
+    // that is not in the space of the octagon.
+    oct.bounded_affine_image(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/boundedaffinepreimage1.cc b/tests/Octagonal_Shape/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..a9e1bd4
--- /dev/null
+++ b/tests/Octagonal_Shape/boundedaffinepreimage1.cc
@@ -0,0 +1,572 @@
+/* Test Octagonal_Shape::bounded_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 7, 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, 7) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7),
+                              -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, 7, -1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(7),
+                              Linear_Expression(3), -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 7, 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(B - A <= 3);
+  known_result.add_constraint(A + B >= 2);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, A+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), -A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, -A+2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), B+5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, B+5) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*B <= 7);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), B-5, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, B-5, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(B - A) <= 21);
+  known_result.add_constraint(4*(A + B) >= -5);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 2, "
+                    "4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(A + B) <= 9);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 2, "
+                    "4*A + 3*B - 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -7);
+  known_result.add_constraint(4*A <= 9);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(A + B) <= 13);
+  known_result.add_constraint(4*(B - A) <= 23);
+
+  oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 4*A + 3*B - 5);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+                    "4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.bounded_affine_preimage(A, A, A);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, A, A) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(4*A <= 9);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(4*B <= 11);
+  known_result.add_constraint(4*(A + B) <= 13);
+
+  oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 2*A - 5*B - 1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+                    "2*A - 5*B - 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -15);
+  known_result.add_constraint(2*A <= 21);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(A + B) >= -3);
+  known_result.add_constraint(2*(A - B) <= 13);
+
+  oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 2*A - 5*B - 1, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+                    "2*A - 5*B - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_preimage(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_preimage(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    oct.bounded_affine_preimage(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_epxr, d):
+    // it is illegal to apply this method to a variable
+    // that is not in the space of the octagon.
+    oct.bounded_affine_preimage(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bounds1.cc b/tests/Octagonal_Shape/bounds1.cc
new file mode 100644
index 0000000..a99dec9
--- /dev/null
+++ b/tests/Octagonal_Shape/bounds1.cc
@@ -0,0 +1,311 @@
+/* Test OctagonalShape::bounds_from_below() and
+   Octagonal_Shape::bounds_from_above().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1;
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = oct1.bounds_from_above(Linear_Expression(3))
+    && oct2.bounds_from_below(A);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B) &&
+    oct.bounds_from_below(A + B);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A - B) &&
+    !oct.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A + B - C)
+    && !oct.bounds_from_below(A + B - C);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+  oct.add_constraint(E - D <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A + B - C + 2*E - 2*D)
+    && !oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B - C + 2*E - 2*D)
+    && oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(B - C <= -1);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A + B - C + 2*E - 2*D)
+    && oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(Linear_Expression(3))
+    && oct.bounds_from_below(Linear_Expression(3));
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.bounds_from_below(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.bounds_from_above(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A - B) &&
+    !oct.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B) &&
+    !oct.bounds_from_below(A + B);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B + C) &&
+    !oct.bounds_from_below(A + B + C);
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(-A - B - C) &&
+    !oct.bounds_from_below(-A - B - C);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/cc76extrapolation1.cc b/tests/Octagonal_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..ebe85e7
--- /dev/null
+++ b/tests/Octagonal_Shape/cc76extrapolation1.cc
@@ -0,0 +1,516 @@
+/* Test Octagonal_Shape::CC76_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x <= 1);
+  oct1.add_constraint(x - y <= 2);
+  oct1.add_constraint(y - x <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x - y <= 2);
+  oct2.add_constraint(-x <= 3);
+  oct2.add_constraint(x <= 0);
+  oct2.add_constraint(y - x <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A + B >= 0);
+  oc1.add_constraint(A - B <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A + B >= 2);
+  oc2.add_constraint(A - B <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_extrapolation_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A + B >= 0);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 3);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A + B >= 0);
+  oc1.add_constraint(A + C >= 0);
+  oc1.add_constraint(A - D <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(A >= 1);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(A + B >= 2);
+  oc2.add_constraint(A + C >= 3);
+  oc2.add_constraint(A - D <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_extrapolation_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(D >= -1);
+  known_result.add_constraint(A + C >= 0);
+  known_result.add_constraint(A - D <= 1);
+  known_result.add_constraint(C + D >= -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oct1(0);
+  TOctagonal_Shape oct2(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct1(2, EMPTY);
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A - B >= -2);
+  oct1.add_constraint(B - A >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A - B >= 2);
+  oct2.add_constraint(B - A >= 1);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A - B >= -2);
+  known_result.add_constraint(B - A >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= 1);
+  oct2.add_constraint(B == -1);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(C <= 4);
+  oct1.add_constraint(B >= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(C <= 3);
+  oct2.add_constraint(B >= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  typedef TOctagonal_Shape::coefficient_type_base ctb;
+  ctb stop_points[] = { ctb(-2), ctb(-1), ctb(0), ctb(1), ctb(2) };
+
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x <= 1);
+  oct1.add_constraint(x - y <= 2);
+  oct1.add_constraint(y - x <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x - y <= 2);
+  oct2.add_constraint(-x <= 3);
+  oct2.add_constraint(x <= 0);
+  oct2.add_constraint(y - x <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2,
+                                 stop_points,
+                                 stop_points
+                                 + sizeof(stop_points)/sizeof(stop_points[0]));
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oc1(5);
+  TOctagonal_Shape oc2(10);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::CC76_extrapolation_assign(oc2): it is illegal
+    // to apply this method to two polyhedra that are not dimensional
+    // compatible.
+    oc2.CC76_extrapolation_assign(oc1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  unsigned tokens = 6;
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 1);
+  oc1.add_constraint(B >= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A - B >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= 1);
+
+#undef TOKENS
+#define TOKENS 6
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 1);
+  oc1.add_constraint(x - y <= 2);
+  oc1.add_constraint(y - x <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y <= 2);
+  oc2.add_constraint(-x <= 3);
+  oc2.add_constraint(x <= 0);
+  oc2.add_constraint(y - x <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned tokens = TOKENS;
+
+  oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+  TOctagonal_Shape oct2(cs2);
+
+  unsigned tokens = 6;
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct2.CC76_extrapolation_assign(oct1, &tokens);
+
+#undef TOKENS
+#define TOKENS 6
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oct2, "*** oct2.CC76_extrapolation_assign(oct1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 3);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A + B >= 0);
+  oc1.add_constraint(A + C >= 0);
+  oc1.add_constraint(A - D <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(A >= 1);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(A + B >= 2);
+  oc2.add_constraint(A + C >= 3);
+  oc2.add_constraint(A - D <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  unsigned tokens = 6;
+
+  oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A + C >= 0);
+  known_result.add_constraint(A - D <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/cc76narrowing1.cc b/tests/Octagonal_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..13cae1f
--- /dev/null
+++ b/tests/Octagonal_Shape/cc76narrowing1.cc
@@ -0,0 +1,264 @@
+/* Test Octagonal_Shape::CC76_narrowing_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc1(3, EMPTY);
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(0);
+
+#if NOISY
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+#endif
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oc1(2);
+  TOctagonal_Shape oc2(2);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(0);
+  TOctagonal_Shape oc2(0);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(B == 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A <= 3);
+  oc2.add_constraint(A + B <= 5);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 3);
+  known_result.add_constraint(A + B <= 5);
+  known_result.add_constraint(A - B <= 0);
+  known_result.add_constraint(B == 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(-x <= 3);
+  oc1.add_constraint(y - x <= 2);
+  oc1.add_constraint(x - y <= 5);
+  oc1.add_constraint(x <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x <= 1);
+  oc2.add_constraint(y - x <= 7);
+  oc2.add_constraint(x - y <= 6);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y - x <= 7);
+  known_result.add_constraint(-x <= 3);
+  known_result.add_constraint(x - y <= 6);
+  known_result.add_constraint(-y <= 8);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable y(1);
+
+  TOctagonal_Shape oc1(1);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(y >= 6);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::CC76_narrowing_assign(oc2): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc2.CC76_narrowing_assign(oc1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= 3);
+  oc1.add_constraint(y - x <= 2);
+  oc1.add_constraint(x - y <= 5);
+  oc1.add_constraint(x <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x <= 1);
+  oc2.add_constraint(y - x <= 7);
+  oc2.add_constraint(x - y <= 6);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
+
+
diff --git a/tests/Octagonal_Shape/chinainit.cc b/tests/Octagonal_Shape/chinainit.cc
new file mode 100644
index 0000000..f292b39
--- /dev/null
+++ b/tests/Octagonal_Shape/chinainit.cc
@@ -0,0 +1,75 @@
+/* Simulate the initialization phase of the China analyzer.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+TOctagonal_Shape
+init(dimension_type num_vars) {
+  TOctagonal_Shape oc(num_vars);
+  if (num_vars > 0) {
+    Constraint_System cs;
+    for (dimension_type i = num_vars; i-- > 0; )
+      cs.insert(Variable(i) >= 0);
+    oc = TOctagonal_Shape(cs);
+#if NOISY
+    print_constraints(oc, "*** oc ***");
+#endif
+  }
+  return oc;
+}
+
+bool
+test01(){
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+  function.insert(3, 2);
+  function.insert(5, 3);
+  function.insert(7, 4);
+  function.insert(9, 5);
+
+  print_function(function, "*** function ***");
+
+
+  TOctagonal_Shape known_result = init(6);
+
+  for (dimension_type i = 10; i < 50; ++i) {
+    TOctagonal_Shape oc = init(i);
+    oc.map_space_dimensions(function);
+    if (oc != known_result) {
+      print_constraints(oc, "*** oc ***");
+      print_constraints(known_result, "*** known_result ***");
+      return false;
+    }
+  }
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/concatenate1.cc b/tests/Octagonal_Shape/concatenate1.cc
new file mode 100644
index 0000000..9c7a92e
--- /dev/null
+++ b/tests/Octagonal_Shape/concatenate1.cc
@@ -0,0 +1,282 @@
+/* Test Octagonal_Shape::concatenate_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 - x3 <= 0);
+  oc1.add_constraint(x3 <= 2);
+  oc1.add_constraint(x6 - x5 <= 2);
+  oc1.add_constraint(x5 <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x2 - x3 <= 2);
+  oc2.add_constraint(x3 <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 - x3 <= 0);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x - y <= 4);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc2.concatenate_assign(oc1);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+  print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x <= 3);
+  oc2.add_constraint(x - y <= 4);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc2.concatenate_assign(oc1);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+  print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 + x3 <= 1);
+  oc1.add_constraint(x3 <= 2);
+  oc1.add_constraint(x6 - x5 <= 2);
+  oc1.add_constraint(x5 <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x2 + x3 <= 77);
+  oc2.add_constraint(x3 <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 + x3 <= 1);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 + x9 <= 77);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(4);
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0);
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A - B <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc2.concatenate_assign(oc1);
+
+  Octagonal_Shape<mpq_class> known_result(oc1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+  print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 - x3 <= 1);
+  oc1.add_constraint(x3 <= 12);
+  oc1.add_constraint(x6 - x5 <= 2);
+  oc1.add_constraint(x5 <= 23);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x2 - x3 <= 2);
+  oc2.add_constraint(x3 <= 8);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 - x3 <= 1);
+  known_result.add_constraint(x3 <= 12);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 23);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/congruences1.cc b/tests/Octagonal_Shape/congruences1.cc
new file mode 100644
index 0000000..7c4d1eb
--- /dev/null
+++ b/tests/Octagonal_Shape/congruences1.cc
@@ -0,0 +1,228 @@
+/* Test Octagonal_Shape::congruences(): we compute the system of
+   congruences of an octagon  that is defined by a system of
+   congruences that contains only a trivially false congruence.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_congruence((0*A %= 1) / 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.minimized_constraints();
+
+  print_constraints(cs, "*** cs ***");
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_congruence((x %= 1) / 0);
+  oct1.add_congruence((y %= 3) / 2);
+  oct1.add_congruence((y + z %= 0) / 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(3);
+  oct2.add_congruences(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oct1(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  print_constraints(oct1, "*** oct1 ***");
+  TOctagonal_Shape oct2(cgs.space_dimension(), EMPTY);
+
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct1(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+// CHECKME: is this a duplicate of test03? (was testing *_and_minimize)
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_congruence((x %= 1) / 0);
+  oct1.add_congruence((y %= 3) / 2);
+  oct1.add_congruence((y + z %= 0) / 3);
+  bool b1 = !oct1.is_empty();
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(3);
+  oct2.add_congruences(cgs);
+  bool b2 = !oct2.is_empty();
+
+  bool ok = b1 && b2 && (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+// CHECKME: is this a duplicate of test02? (was testing *_and_minimize)
+bool
+test07() {
+  TOctagonal_Shape oct1(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs.space_dimension(), EMPTY);
+  oct2.add_congruences(cgs);
+  bool b = !oct2.is_empty();
+
+  bool ok = !b && (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.refine_with_congruence((x %= 1) / 0);
+  oct1.refine_with_congruence((y %= 3) / 2);
+  oct1.refine_with_congruence((y + z %= 0) / 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(3);
+  oct2.refine_with_congruences(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/constrains1.cc b/tests/Octagonal_Shape/constrains1.cc
new file mode 100644
index 0000000..3c00ebf
--- /dev/null
+++ b/tests/Octagonal_Shape/constrains1.cc
@@ -0,0 +1,231 @@
+/* Test Octagonal_Shape::constrains().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)		\
+  if (!pred) {					\
+    nout << "!" #pred << endl;			\
+    ok = false;					\
+  }
+
+#define TEST_PREDICATE_FALSE(pred)		\
+  if (pred) {					\
+    nout << #pred << endl;			\
+    ok = false;					\
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape bds(2);
+  bds.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TOctagonal_Shape(2);
+  bds.add_constraint(A == B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TOctagonal_Shape(2);
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds.add_constraint(A <= B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape bds(0);
+  bds.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) bds.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape bds(2);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 0);
+  bds.add_constraint(A + C == 0);
+  bds.unconstrain(A);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= A);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3);
+  bds.add_constraint(A >= B+1);
+  bds.add_constraint(A <= B);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3);
+  bds.add_constraint(A >= B);
+  bds.add_constraint(A <= B-1);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/constraints1.cc b/tests/Octagonal_Shape/constraints1.cc
new file mode 100644
index 0000000..c3d556d
--- /dev/null
+++ b/tests/Octagonal_Shape/constraints1.cc
@@ -0,0 +1,375 @@
+/* Test Octagonal_Shape::constraints(): we compute the system of
+   constraints of an octagon  that is defined by a system of
+   constraints that contains only a trivially false constraint.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(0*A == 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x == 1);
+  oct1.add_constraint(y <= 3);
+  oct1.add_constraint(y - x >= 5);
+  oct1.add_constraint(z + x == 2);
+  oct1.add_constraint(z - y <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oct1(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs.space_dimension(), EMPTY);
+
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct1(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(B >= 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+
+  oct1.add_constraint(A == 0);
+  oct1.add_constraint(B >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+
+  oct1.add_constraint(A + B == 0);
+  oct1.add_constraint(B <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+
+  oct1.add_constraint(A - B == 0);
+  oct1.add_constraint(B <= 1);
+  oct1.add_constraint(C + A <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct1(5);
+  oct1.add_constraint(A == 1);
+  oct1.add_constraint(B + C == 1);
+  oct1.add_constraint(E - D == 1);
+  oct1.add_constraint(A + C <= 1);
+  oct1.add_constraint(B - D <= 1);
+  oct1.add_constraint(E + C >= -1);
+  oct1.add_constraint(A - D >= -1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+
+  oct1.add_constraint(A - B == 0);
+  oct1.add_constraint(B <= 1);
+  oct1.add_constraint(-C - A <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test12() {
+
+  TOctagonal_Shape oct1(0);
+  oct1.add_constraint(Linear_Expression(1) == 0);
+
+  TOctagonal_Shape oct2(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(3);
+
+  oct.refine_with_constraint(A > 0);
+  oct.refine_with_constraint(B < 0);
+  oct.refine_with_constraint(A + B > 1);
+  oct.refine_with_constraint(A + 2*B > 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(A + B >= 1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A > 0);
+  cs.insert(B < 0);
+  cs.insert(A + B > 1);
+  cs.insert(A + 2*B > 1);
+
+  TOctagonal_Shape oct(3);
+  oct.refine_with_constraints(cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(A + B >= 1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/contains1.cc b/tests/Octagonal_Shape/contains1.cc
new file mode 100644
index 0000000..b184229
--- /dev/null
+++ b/tests/Octagonal_Shape/contains1.cc
@@ -0,0 +1,349 @@
+/* Test Octagonal_Shape::contains().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc1;
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2;
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(C >= 0);
+  oc1.add_constraint(B + C >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(A == 0);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(B + C >= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(D >= 0);
+  cs.insert(C >= 0);
+  cs.insert(B >= 0);
+  cs.insert(A >= 0);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(cs);
+  oc2.add_constraint(A + B >= 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs1;
+  cs1.insert(A + D >= 0);
+  cs1.insert(C >= 0);
+  cs1.insert(B >= 0);
+  cs1.insert(A == 0);
+  TOctagonal_Shape oc1(cs1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(D == 0);
+  cs2.insert(C == 0);
+  cs2.insert(B == 0);
+  cs2.insert(A == 0);
+  TOctagonal_Shape oc2(cs2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(0);
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+  print_constraints(oc2, "*** oc2 ***");
+
+  TOctagonal_Shape oc3(0);
+  print_constraints(oc3, "*** oc3 ***");
+
+  bool contained1 = oc1.contains(oc2);
+  bool contained2 = oc1.contains(oc3);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained1 ? "true" : "false") << endl;
+  nout << "*** oc1.contains(oc3) ***" << endl;
+  nout << (contained2 ? "true" : "false") << endl;
+
+  return contained1 && contained2;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs1;
+  cs1.insert(C + D == 0);
+  cs1.insert(A - B <= 0);
+  cs1.insert(A == 0);
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraints(cs1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Constraint_System cs2(cs1);
+  cs2.insert(D == 0);
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraints(cs2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Constraint_System cs3(cs2);
+  cs3.insert(B == 0);
+  cs3.insert(B + C <= 0);
+  TOctagonal_Shape oc3(4);
+  oc3.add_constraints(cs3);
+
+  print_constraints(oc3, "*** oc3 ***");
+
+  bool contained1 = oc1.contains(oc2);
+  bool contained2 = oc1.contains(oc3);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained1 ? "true" : "false") << endl;
+  nout << "*** oc1.contains(oc3) ***" << endl;
+  nout << (contained2 ? "true" : "false") << endl;
+
+  return contained1 && contained2;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs1;
+  cs1.insert(A - B <= 0);
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraints(cs1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Constraint_System cs2(cs1);
+  cs2.insert(D == 0);
+  cs2.insert(A - B <= 0);
+  cs2.insert(B - C <= 3);
+  cs2.insert(C - D <= -1);
+  cs2.insert(D - A <= -3);
+  TOctagonal_Shape oc2(4);
+
+  // The octagon oc2 is empty, since it has a negative cycle.
+  oc2.add_constraints(cs2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Constraint_System cs3(cs1);
+  cs3.insert(B <= 2);
+  cs3.insert(B >= 5);
+  TOctagonal_Shape oc3(4);
+
+  // The octagon oc3 is empty.
+  oc3.add_constraints(cs3);
+
+  print_constraints(oc3, "*** oc3 ***");
+
+  bool contained1 = oc1.contains(oc2);
+  bool contained2 = oc1.contains(oc3);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained1 ? "true" : "false") << endl;
+  nout << "*** oc1.contains(oc3) ***" << endl;
+  nout << (contained2 ? "true" : "false") << endl;
+
+  return contained1 && contained2;
+}
+
+bool
+test08() {
+  TOctagonal_Shape oc1(0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x - y >= 0);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc1.contains(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (!contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(C <= 0);
+  oc1.add_constraint(B + C <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(A == 0);
+  oc2.add_constraint(C <= 0);
+  oc2.add_constraint(B + C <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (!contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Octagonal_Shape/containsintegerpoint1.cc b/tests/Octagonal_Shape/containsintegerpoint1.cc
new file mode 100644
index 0000000..c667eee
--- /dev/null
+++ b/tests/Octagonal_Shape/containsintegerpoint1.cc
@@ -0,0 +1,195 @@
+/* Test Octagonal_Shape::contains_integer_point().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  Octagonal_Shape<mpz_class> oct(2);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  Octagonal_Shape<mpq_class> oct(2);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  Octagonal_Shape<float> oct(3);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y - 3*z <= 2);
+  cs.insert(8*z - 8*y >= 7);
+
+  Octagonal_Shape<mpq_class> oct(3);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(3*y - 3*x <= 2);
+  cs.insert(8*x - 8*y >= 7);
+
+  Octagonal_Shape<mpz_class> oct(2);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.add_constraint(x <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  Octagonal_Shape<float> oct(3);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x);
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  oct.remove_space_dimensions(to_be_removed);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Octagonal_Shape/discrete1.cc b/tests/Octagonal_Shape/discrete1.cc
new file mode 100644
index 0000000..f8ab418
--- /dev/null
+++ b/tests/Octagonal_Shape/discrete1.cc
@@ -0,0 +1,212 @@
+/* Test Octagonal_Shape::is_discrete().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(3);
+
+  oct.add_constraint(x <= 2);
+  oct.add_constraint(x - y == 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A <= 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A == 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 3);
+  oct.add_constraint(B - A <= -5);
+  oct.add_constraint(-B <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+ 
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(E == 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(7);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B == 2);
+  oct.add_constraint(B - A <= -6);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/disjoint1.cc b/tests/Octagonal_Shape/disjoint1.cc
new file mode 100644
index 0000000..207d044
--- /dev/null
+++ b/tests/Octagonal_Shape/disjoint1.cc
@@ -0,0 +1,189 @@
+/* Test Polyhedron::is_disjoint_from(const Octagonal_Shape& y).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(B == 0);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(A <= 2);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == 0);
+  oct2.add_constraint(B >= 1);
+  oct2.add_constraint(B <= 2);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A + B == 1);
+  oct1.add_constraint(A <= 1);
+  oct1.add_constraint(B <= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A + B <= 2);
+  oct2.add_constraint(A >= 0);
+  oct2.add_constraint(B >= 3);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A - B <= 5);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A + B));
+  gs1.insert(ray(B));
+
+  TOctagonal_Shape oct1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(A + B));
+  gs2.insert(ray(-B));
+
+  TOctagonal_Shape oct2(gs2);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return !disjoint;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(B >= -4);
+
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= y);
+
+  TOctagonal_Shape oc2(3);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::is_disjoint_from(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.is_disjoint_from(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A == 0);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == 1);
+
+  bool ok = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/empty1.cc b/tests/Octagonal_Shape/empty1.cc
new file mode 100644
index 0000000..0187b05
--- /dev/null
+++ b/tests/Octagonal_Shape/empty1.cc
@@ -0,0 +1,130 @@
+/* Test Octagonal_Shape::is_empty() .
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2, EMPTY);
+
+  bool empty1 = oc1.is_empty();
+
+  nout << "*** oc1.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false ") << endl;
+
+  TOctagonal_Shape oc2(2, UNIVERSE);
+
+  bool empty2 = oc2.is_empty();
+
+  nout << "*** oc2.is_empty() ***" << endl;
+  nout << (empty2 ? "true" : "false") << endl;
+
+  return empty1 && !empty2;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+
+  oc.add_constraint(A == 0);
+  oc.add_constraint(C >= 0);
+  oc.add_constraint(B - C >= 1);
+
+  print_constraints(oc, "*** oc ***");
+
+  bool empty = oc.is_empty();
+
+  nout << "*** oc.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A <= 3);
+  oc1.add_constraint(D <= 3);
+  oc1.add_constraint(B - A <= 0);
+  oc1.add_constraint(C - A <= -2);
+  oc1.add_constraint(E - A <= 2);
+  oc1.add_constraint(-B <= 0);
+  oc1.add_constraint(C - B <= 5);
+  oc1.add_constraint(D - C <= -6);
+  oc1.add_constraint(A - D <= 5);
+  oc1.add_constraint(E - D <= 2);
+  oc1.add_constraint(-E <= -5);
+  oc1.add_constraint(C - E <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  bool empty = oc1.is_empty();
+
+  nout << "*** oc1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A <= 3);
+  oc2.add_constraint(D <= 3);
+  oc2.add_constraint(B - A <= 0);
+  oc2.add_constraint(C - A <= 2);
+  oc2.add_constraint(E - A <= 2);
+  oc2.add_constraint(-B <= 0);
+  oc2.add_constraint(C - B <= 5);
+  oc2.add_constraint(D - C <= 6);
+  oc2.add_constraint(A - D <= 5);
+  oc2.add_constraint(E - D <= 2);
+  oc2.add_constraint(-E <= 5);
+  oc2.add_constraint(C - E <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool empty1 = oc2.is_empty();
+
+  nout << "*** oc2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return empty && !empty1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Octagonal_Shape/expandspacedim1.cc b/tests/Octagonal_Shape/expandspacedim1.cc
new file mode 100644
index 0000000..a4cb196
--- /dev/null
+++ b/tests/Octagonal_Shape/expandspacedim1.cc
@@ -0,0 +1,294 @@
+/* Test Octagonal_Shape::expand_space_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+
+  TOctagonal_Shape known_result(4);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** after oct1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(B, 1);
+
+  TOctagonal_Shape known_result(4, EMPTY);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 0);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+  oct1.add_constraint(B >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+
+  TOctagonal_Shape known_result(3, EMPTY);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+
+  TOctagonal_Shape known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 2);
+
+  TOctagonal_Shape known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - B <= 2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A <= 1);
+  oct1.add_constraint(C == 1);
+  oct1.add_constraint(A - B >= 1);
+  oct1.add_constraint(B <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+  oct1.expand_space_dimension(C, 1);
+
+  TOctagonal_Shape known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D - B >= 1);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.expand_space_dimension(A, 1);"
+                    " oct1.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+  oct1.add_constraint(A <= 2);
+  oct1.add_constraint(A - B >= 1);
+  oct1.add_constraint(B <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(B, 1);
+
+  TOctagonal_Shape known_result(3, EMPTY);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::expand_space_dimension(v, m):
+    // it is illegal to apply this method to a variable
+    // that is not in the space of the octagon.
+    oct.expand_space_dimension(y, 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::expand_space_dimension(v, m):
+    // it is illegal to apply this method when the maximum allowed space
+    // dimension would be exceeded.
+    oct.expand_space_dimension(x, 40000);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/foldspacedims1.cc b/tests/Octagonal_Shape/foldspacedims1.cc
new file mode 100644
index 0000000..cb352c5
--- /dev/null
+++ b/tests/Octagonal_Shape/foldspacedims1.cc
@@ -0,0 +1,441 @@
+/* Test Octagonal_Shape::fold_space_dimensions().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - C <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - C <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(A <= 3);
+  oct1.add_constraint(B >= 7);
+  oct1.add_constraint(B <= 12);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(A <= 3);
+  oct1.add_constraint(B >= 7);
+  oct1.add_constraint(B <= 12);
+  oct1.add_constraint(C == 15);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  oct1.fold_space_dimensions(to_fold, C);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A, B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(4);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+  oct1.add_constraint(C >= 0);
+  oct1.add_constraint(C - B <= 2);
+  oct1.add_constraint(D >= 0);
+  oct1.add_constraint(D - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  oct1.fold_space_dimensions(to_fold, A);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {C, D} into A ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(4);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(B == 0);
+  oct1.add_constraint(A - B <= 2);
+  oct1.add_constraint(C >= 0);
+  oct1.add_constraint(C - B <= 2);
+  oct1.add_constraint(D >= 0);
+  oct1.add_constraint(D - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  oct1.fold_space_dimensions(to_fold, C);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A <= -1);
+  oct1.add_constraint(A - B <= 2);
+  oct1.add_constraint(C >= 0);
+  oct1.add_constraint(C - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+
+  oct1.fold_space_dimensions(to_fold, A);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  //  Variable G(6);
+
+  TOctagonal_Shape oc(5);
+  oc.add_constraint(A + D <= 2);
+  oc.add_constraint(B - E >= 2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(C);
+  to_be_folded.insert(D);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+    // it is illegal to fold a variable that is not in the space
+    // of the octagon.
+    oc.fold_space_dimensions(to_be_folded, F);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  // Variable D(3);
+  // Variable E(4);
+  Variable F(5);
+  // Variable G(6);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A + B <= 2);
+  oc.add_constraint(C - B >= 2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(C);
+
+  try {
+    to_be_folded.insert(F);
+    // This is an invalid use of the method
+    // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+    // it is illegal to insert in the set `to_be_folded' a variable
+    // that is not in the space of the octagon.
+    oc.fold_space_dimensions(to_be_folded, A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A + B <= 2);
+  oc.add_constraint(C - B >= 2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(C);
+
+  try {
+    to_be_folded.insert(A);
+    // This is an invalid use of the method
+    // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+    // it is illegal to insert in the set `to_be_folded' the variable
+    // `var' that is not in the space of the octagon.
+    oc.fold_space_dimensions(to_be_folded, A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.OK();
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(1, EMPTY);
+
+  oct1.add_space_dimensions_and_embed(1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.OK();
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frombdshape1.cc b/tests/Octagonal_Shape/frombdshape1.cc
new file mode 100644
index 0000000..5e994fc
--- /dev/null
+++ b/tests/Octagonal_Shape/frombdshape1.cc
@@ -0,0 +1,54 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B <= 5);
+  cs.insert(A - B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TBD_Shape bd(cs);
+
+  TOctagonal_Shape os(bd);
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frombox1.cc b/tests/Octagonal_Shape/frombox1.cc
new file mode 100644
index 0000000..9baff91
--- /dev/null
+++ b/tests/Octagonal_Shape/frombox1.cc
@@ -0,0 +1,357 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const Box<Interval>&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+  Rational_Box box(2);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*B == 2);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(3*B == 2);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(B == -10);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(3*A == -2);
+  known_oct.add_constraint(B == -10);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+  print_constraints(known_oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Rational_Box box(3);
+  box.add_constraint(5*C == 15);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(3);
+  known_oct.add_constraint(5*C == 15);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+  Rational_Box box(0);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct;
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2, EMPTY);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Rational_Box box(4);
+  box.add_constraint(D == 4);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(4);
+  known_oct.add_constraint(D == 4);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Unit square.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(A >= 0);
+  known_oct.add_constraint(A <= 1);
+  known_oct.add_constraint(B >= 0);
+  known_oct.add_constraint(B <= 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(2*B == 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(A >= 0);
+  known_oct.add_constraint(2*B == 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(2*B == 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(7*A <= 3);
+  known_oct.add_constraint(2*B == 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(2*B <= 0);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(7*A == 3);
+  known_oct.add_constraint(2*B >= 1);
+  known_oct.add_constraint(2*B <= 0);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+  Rational_Box box(0);
+  box.set_empty();
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(0, EMPTY);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Rational_Box box(6);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(4*B == -11);
+  box.add_constraint(3*D == 18);
+  box.add_constraint(7*E == 15);
+  box.add_constraint(7*F == -15);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(6);
+  known_oct.add_constraint(3*A == -2);
+  known_oct.add_constraint(4*B == -11);
+  known_oct.add_constraint(3*D == 18);
+  known_oct.add_constraint(7*E == 15);
+  known_oct.add_constraint(7*F == -15);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(7*A == 3);
+  known_oct.add_constraint(2*B >= 1);
+  known_oct.add_constraint(B >= 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromgensys1.cc b/tests/Octagonal_Shape/fromgensys1.cc
new file mode 100644
index 0000000..4bf889f
--- /dev/null
+++ b/tests/Octagonal_Shape/fromgensys1.cc
@@ -0,0 +1,270 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const Generator_System&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Generator_System gs;
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(closure_point(V));
+
+  try {
+    // It is illegal to build a Octagonal_Shape starting from a non-empty
+    // generator system having no points.
+    TOctagonal_Shape oct(gs);
+
+    // It is an error if the exception is not thrown.
+    return false;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    return false;
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(ray(V));
+
+  try {
+    // It is illegal to build a Octagonal_Shape starting from a non-empty
+    // generator system having no points.
+    TOctagonal_Shape oct(gs);
+
+    // It is an error if the exception is not thrown.
+    return false;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    return false;
+  }
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(ray(A + B));
+  gs.insert(point(1*A + 2*B + 3*C + 4*D));
+  gs.insert(point(2*A + 3*B + 4*C + 5*D));
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 5);
+  known_result.add_constraint(A == B-1);
+  known_result.add_constraint(C == D-1);
+  known_result.add_constraint(C <= A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 2*C);
+  ph.add_constraint(C >= 3*D);
+  ph.add_constraint(D >= 4);
+  ph.add_constraint(A-D <= 50);
+
+  TOctagonal_Shape oct(ph.generators());
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C <= 30);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 10);
+  known_result.add_constraint(B - A <= 0);
+  known_result.add_constraint(A - D <= 50);
+  known_result.add_constraint(B - C >= 12);
+  known_result.add_constraint(C - D <= 23);
+  known_result.add_constraint(C - D >= 8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(2*A + B));
+  gs.insert(ray(-3*A + D));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(-3*A + 4));
+  gs.insert(ray(-2*D - 4));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(line(2*A + B));
+  gs.insert(line(-3*A + D));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(line(2*A + 4));
+  gs.insert(line(D - 3));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromgrid1.cc b/tests/Octagonal_Shape/fromgrid1.cc
new file mode 100644
index 0000000..f16485d
--- /dev/null
+++ b/tests/Octagonal_Shape/fromgrid1.cc
@@ -0,0 +1,201 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x + y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 0) / 0);
+  gr.add_congruence((y - z %= 0) / 0);
+  gr.add_congruence((z %= 0) / 1);
+
+  TOctagonal_Shape oct(gr);
+
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+  known_oct.add_constraint(x + y == 0);
+  known_oct.add_constraint(y - z == 0);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+  Grid gr(2);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 3);
+  gr.add_congruence((y - z %= 2) / 5);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+  Grid gr(0);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct;
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(2, EMPTY);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x - y %= 1) / 0);
+  gr.add_congruence((y %= 0) / 0);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+  known_oct.add_constraint(x == 1);
+  known_oct.add_constraint(y == 0);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(0, EMPTY);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+  Grid gr(2);
+  Constraint_System cs = gr.constraints();
+
+  TOctagonal_Shape oct(cs);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromoctagonalshape1.cc b/tests/Octagonal_Shape/fromoctagonalshape1.cc
new file mode 100644
index 0000000..b70cfa4
--- /dev/null
+++ b/tests/Octagonal_Shape/fromoctagonalshape1.cc
@@ -0,0 +1,132 @@
+/* Test Octagonal_Shape copy construct, construction from other
+   Octagonal shapes and assignment.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape bds1(cs);
+
+  TOctagonal_Shape bds(bds1);
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os1(cs);
+
+  TOctagonal_Shape os = os1;
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os1(cs);
+
+  TOctagonal_Shape os(1);
+  os = os1;
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os1(cs);
+
+  Octagonal_Shape<mpq_class> os(os1);
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frompolyhedron1.cc b/tests/Octagonal_Shape/frompolyhedron1.cc
new file mode 100644
index 0000000..afc987c
--- /dev/null
+++ b/tests/Octagonal_Shape/frompolyhedron1.cc
@@ -0,0 +1,244 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B <= 5);
+  cs.insert(A + 2*B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(3*A - 5*B <= 18);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(11*A <= 61);
+  known_result.add_constraint(2*B <= 5);
+  known_result.add_constraint(5*B >= -18);
+  known_result.add_constraint(11*A - 11*B <= 64);
+  known_result.add_constraint(11*A + 11*B <= 58);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result,
+                             "1.21e-6", "5.76e-7", "3.91e-7"));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph(0, UNIVERSE);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+//   Variable A(0);
+//   Variable B(1);
+//   Variable C(2);
+//   Variable D(3);
+
+  C_Polyhedron ph(4, UNIVERSE);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(2*A - 3*B >= 4);
+  cs.insert(Linear_Expression(-3) >= 0);
+  cs.insert(Linear_Expression(7) == 0);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 4);
+  cs.insert(-C - D >= 0);
+  cs.insert(A + B - C == 0);
+  cs.insert(-A + B - C < 4);
+  cs.insert(A - B - C + D > 1);
+  NNC_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= -2);
+  known_result.add_constraint(4*B <= -5);
+  known_result.add_constraint(A - B >= 4);
+  known_result.add_constraint(4*(A - C) >= 5);
+  known_result.add_constraint(B + D <= 2);
+  known_result.add_constraint(B - C <= 2);
+  known_result.add_constraint(C + D <= 0);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(2*A - 3*B >= 4);
+  cs.insert(-3*A >= 0);
+  cs.insert(B + 2 == 0);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, POLYNOMIAL_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B == -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 4);
+  cs.insert(B >= 10);
+  cs.insert(B <= 0);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (oct1 == oct2
+             && Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromspacedim1.cc b/tests/Octagonal_Shape/fromspacedim1.cc
new file mode 100644
index 0000000..7ccfef4
--- /dev/null
+++ b/tests/Octagonal_Shape/fromspacedim1.cc
@@ -0,0 +1,122 @@
+/* Test Octagonal_Shape::Octagonal_Shape(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc(0, EMPTY);
+
+  bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc(0, UNIVERSE);
+
+  bool ok = (oc.OK() && oc.is_universe() && oc.space_dimension() == 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oc(4, EMPTY);
+
+  bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 4);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc(4, UNIVERSE);
+
+  bool ok = (oc.OK() && oc.is_universe() && oc.space_dimension() == 4);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C <= 2);
+  oc.add_constraint(C >= 1);
+
+  bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 4);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= 1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C <= 2);
+  oc.add_constraint(C >= 1);
+
+  bool ok = (oc.OK() && oc.space_dimension() == 3);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage1.cc b/tests/Octagonal_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..f1bb479
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,603 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B <= 5);
+  oct.add_constraint(A <= B);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B - A >= 2);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x >= 2);
+  oct.add_constraint(x - y <= 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(- y <= 1);
+
+  oct.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(x,"
+                         "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x >= 2);
+  oct.add_constraint(x - y <= 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(x - y <= 1);
+
+  oct.generalized_affine_image(y, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(y, "
+                         "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 4);
+  oct.add_constraint(x <= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2 , EMPTY);
+
+  oct.generalized_affine_image(y, LESS_OR_EQUAL, Linear_Expression(2));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(y, "
+                         "LESS_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  //  Variable y(1);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.generalized_affine_image(x, EQUAL, Linear_Expression(6));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(x, EQUAL, 6) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A <= 3);
+
+  oct.generalized_affine_image(A, LESS_OR_EQUAL, Linear_Expression(3));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A, "
+                         "LESS_OR_EQUAL, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(B, Linear_Expression(5));
+
+  oct.generalized_affine_image(B, EQUAL, Linear_Expression(5));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, EQUAL, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(2));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A, "
+                         "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C + A <= 3);
+  known_result.add_constraint(C + B <= 3);
+
+  oct.generalized_affine_image(C, LESS_OR_EQUAL, C + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                         "LESS_OR_EQUAL, C + 1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(C, C + 1);
+
+  oct.generalized_affine_image(C, EQUAL, C + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                    "EQUAL, C+1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B - A >= -2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C + A <= 2);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= C + 3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C + A <= 2);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, C + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, C + 3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(B, C + 3);
+
+  oct.generalized_affine_image(B, EQUAL, C + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, EQUAL, C+3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B <= 4);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, B + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B + C <= -3);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, C + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, C + 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(A + B <= -3);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, A + 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B - A >= 3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(A + B >= -3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 3, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage2.cc b/tests/Octagonal_Shape/generalizedaffineimage2.cc
new file mode 100644
index 0000000..9fc4171
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,356 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Linear_Expression e1(x + 2);
+  Linear_Expression e2(x - 2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 4);
+  oct.add_constraint(x <= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(x + 2, "
+                         "LESS_OR_EQUAL, x - 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Linear_Expression e1(6);
+  Linear_Expression e2(x - 4);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(6, "
+                    "EQUAL, x-4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B);
+  Linear_Expression e2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A + 5);
+  Linear_Expression e2(4);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(A, Linear_Expression(-1));
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A+5, "
+                    "EQUAL, 4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(2);
+  Linear_Expression e2(B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A + B == 0);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2, "
+                         "GREATER_OR_EQUAL, B) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C + 1);
+  Linear_Expression e2(A - 3);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C <= -3);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - C >= 4);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C + 1, "
+                         "LESS_OR_EQUAL, A - 3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C + 1);
+  Linear_Expression e2(A + 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(C, A + 1);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(C+1, EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(B - 1);
+  Linear_Expression e2(A - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B - A >= -1);
+  known_result.add_constraint(C + A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B - 1, "
+                         "GREATER_OR_EQUAL, A - 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(-C + 3);
+  Linear_Expression e2(-B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= B - 1);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C - A >= -1);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-C + 3, "
+                         "LESS_OR_EQUAL, -B + 4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(-C + 3);
+  Linear_Expression e2(-B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.add_constraint(C <= B - 1);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C + A <= 1);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B + A <= 2);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-C + 3, "
+                         "GREATER_OR_EQUAL, -B + 4) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(2);
+  Linear_Expression e2(B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A + B == 0);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2, "
+                         "LESS_OR_EQUAL, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage3.cc b/tests/Octagonal_Shape/generalizedaffineimage3.cc
new file mode 100644
index 0000000..6ca8ced
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage3.cc
@@ -0,0 +1,592 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x <= 4);
+  oct.add_constraint(x >= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(x >= -6);
+  known_result.add_constraint(y <= 1);
+
+  oct.generalized_affine_image(y, LESS_OR_EQUAL, -y + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(y, "
+                         "LESS_OR_EQUAL, -y + 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x <= 4);
+  oct.add_constraint(x >= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= -7);
+  known_result.add_constraint(y == 0);
+
+  oct.generalized_affine_image(x, GREATER_OR_EQUAL, -x - 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(x, "
+                    "GREATER_OR_EQUAL, -x - 3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, 3*B + 1, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, 3*B + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= -1);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression expr(2*A + 3);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A + B == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(2*(-A - B) <= -3);
+
+  oct.generalized_affine_image(A, GREATER_OR_EQUAL, 2*A + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, 2*A + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(C, LESS_OR_EQUAL, 2*C + 1, 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                         "LESS_OR_EQUAL, 2*C + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(C, 5*C - 3, 4);
+
+  oct.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                    "EQUAL, 5*C - 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -1);
+  known_result.add_constraint(C + A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, -B - 2, 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "GREATER_OR_EQUAL, -B - 2, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C + A <= 2);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, 4*A - 2*C + 3, -3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
+
+  oct.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x + y >= 0);
+  oct.add_constraint(y >= 0);
+  oct.add_constraint(z <= 2);
+  oct.add_constraint(z - x >= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::generalized_affine_image(v, e, d): it is illegal
+    // to apply the method to a linear expression
+    // with the denominator equal to zero.
+    Coefficient d = 0;
+    oct.generalized_affine_image(y, LESS_OR_EQUAL, y + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    oct.generalized_affine_image(x, LESS_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    oct.generalized_affine_image(x, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply this method to an expression having space dimension
+    // greater than the octagon's space dimension.
+    oct.generalized_affine_image(y, GREATER_OR_EQUAL, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply this method to a variable having space dimension
+    // greater than the octagon's space dimension.
+    oct.generalized_affine_image(z, GREATER_OR_EQUAL, y);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+  oct.add_constraint(1 >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(lhs, r, rhs): it is illegal
+    // to use a strict relation symbol.
+    oct.generalized_affine_image(y - 3, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(C + B >= -3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, C + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, C + 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B - C >= 3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, C + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, C + 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage4.cc b/tests/Octagonal_Shape/generalizedaffineimage4.cc
new file mode 100644
index 0000000..9d29cdd
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage4.cc
@@ -0,0 +1,380 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Linear_Expression e1(3*x + 2);
+  Linear_Expression e2(2*x - 3);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x == 4);
+  oct.add_constraint(y <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 0);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(3*x + 2, "
+                         "LESS_OR_EQUAL, 2*x - 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Linear_Expression e1(6);
+  Linear_Expression e2(3*x - 4);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y <= 7);
+  oct.add_constraint(y >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(x, Linear_Expression(10), 3);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct, "*** oct.generalized_affine_image(6, "
+                    "EQUAL, 3*x - 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(2*B + 3*A);
+  Linear_Expression e2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(3*A + 2*B, "
+                         "LESS_OR_EQUAL, 1) ***");
+
+   return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-2*A + 5);
+  Linear_Expression e2(-4*B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(A, 4*B + 5, 2);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+
+   return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(A + 2*B - 5);
+  Linear_Expression e2(3*B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A + 2*B - 5, "
+                         "GREATER_OR_EQUAL, 3*B) ***");
+
+   return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(2*B + C + 1);
+  Linear_Expression e2(A - 3*B + 2*C);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);;
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2*B + C + 1, "
+                         "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+   return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(2*B + C + 1);
+  Linear_Expression e2(A - 3*B + 2*C);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2*B + C + 1, "
+                         "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+   return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-2*A - B - 1);
+  Linear_Expression e2(3*A + B + 4*C - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-2*A - B - 1, "
+                         "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+   return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-2*C + 3);
+  Linear_Expression e2(-3*B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-2*C + 3, "
+                         "LESS_OR_EQUAL, -3*B + 4) ***");
+
+   return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(3);
+  Linear_Expression e2(4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(3, "
+                         "GREATER_OR_EQUAL, 4) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - 2*C + 3);
+  Linear_Expression e2(-3*B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A - 2*C + 3, "
+                         "GREATER_OR_EQUAL, -3*B + 4) ***");
+
+   return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - 2*C + 3);
+  Linear_Expression e2(-3*B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A - 2*C + 3, "
+                         "EQUAL, -3*B + 4) ***");
+
+   return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage5.cc b/tests/Octagonal_Shape/generalizedaffineimage5.cc
new file mode 100644
index 0000000..3aacffa
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage5.cc
@@ -0,0 +1,343 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*B <= 5);
+  known_result.add_constraint(4*(A + B) <= 51);
+  known_result.add_constraint(4*(C + B) <= 1);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, -2*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, -2*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(B - C <= 12);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B - A) <= 9);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, 4*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, 4*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(2*(B + C) <= -5);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 2*C + 3, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, A + 2*C + 3, -2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B + A) <= 9);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, -4*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, -4*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B - A) >= -3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, 4*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, 4*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(2*(B - C) >= 5);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B + A) >= -9);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, 4*A - 3*C + 3, -4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, 4*A - 3*C + 3, -4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(2*(B + C) >= 5);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A - 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A - 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage1.cc b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..a2ac4a3
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,617 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(4*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(-B >= 4);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(4*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(B >= 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(7*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(7*A == 1);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = check_result(oct, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(5*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*A == 1);
+  known_result.add_constraint(-B >= 2);
+
+  bool ok = check_result(oct, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 3);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 5);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 14);
+  known_result.add_constraint(3*B - 3*A <= 13);
+  known_result.add_constraint(3*B - 3*C <= 7);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // If the Coefficient type is not wide enough, do nothing.
+  if (std::numeric_limits<Coefficient>::is_bounded
+      && (std::numeric_limits<Coefficient>::min() > -203
+          || std::numeric_limits<Coefficient>::max() < 629))
+    return true;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= -203);
+  known_result.add_constraint(60*A - 60*B >= 629);
+  known_result.add_constraint(60*A + 60*B <= -589);
+  known_result.add_constraint(20*C - 20*B >= 231);
+  known_result.add_constraint(4*C + 4*B <= -35);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+  bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(12*B >= -35);
+  known_result.add_constraint(4*A - 4*B <= 13);
+  known_result.add_constraint(4*C - 4*B <= 21);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(oct, known_result, "1.16e-5", "5.04e-6", "3.50e-6");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B <= 7);
+  oct.add_constraint(3*C <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 35);
+  known_result.add_constraint(3*B - 3*A <= 34);
+  known_result.add_constraint(3*B - 3*C <= 28);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B <= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= 27);
+  known_result.add_constraint(60*B - 60*A <= 61);
+  known_result.add_constraint(60*A + 60*B <= 101);
+  known_result.add_constraint(20*C - 20*B >= 1);
+  known_result.add_constraint(4*C + 4*B <= 11);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  bool ok = check_result(oct, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B >= 5);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  oct.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B <= 5);
+  oct.add_constraint(3*C <= 8);
+  oct.add_constraint(2*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oct.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "EQUAL, 3*A+2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 2);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B, 5);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B, 5) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 2);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 3, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 3, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage2.cc b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..0780cf9
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,619 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x + y >= 0);
+  oct.add_constraint(y >= 0);
+  oct.add_constraint(z <= 2);
+  oct.add_constraint(z - x >= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, e, d):
+    // it is illegal to apply the method with denominator equal to zero.
+    Coefficient d = 0;
+    oct.generalized_affine_preimage(y, LESS_OR_EQUAL, y + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to use a strict relation symbol.
+    oct.generalized_affine_preimage(x, LESS_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to use a strict relation symbol.
+    oct.generalized_affine_preimage(x, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to apply the method to an expression having
+    // space dimension greater than the octagon's space dimension.
+    oct.generalized_affine_preimage(y, GREATER_OR_EQUAL, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to use a variable in the 'expr' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to apply the method to a variable having space dimension
+    // greater than the octagon's space dimension.
+    oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B - A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 4);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(2*B >= 3);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, -B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, -B + 3, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(2);
+  Linear_Expression e2(-B + 3);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B == 1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(2, "
+                    "GREATER_OR_EQUAL, -B + 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-3);
+  Linear_Expression e2(B + 12);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= -15);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(B - A >= 2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-3, "
+                    "LESS_OR_EQUAL, B + 12) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-3);
+  Linear_Expression e2(B + 12);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B == -15);
+  known_result.add_constraint(B - A >= 2);
+  known_result.add_constraint(B + A <= 0);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-3, "
+                    "EQUAL, B + 12) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(A - 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.generalized_affine_preimage(A, GREATER_OR_EQUAL, e2 + 1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - 1, "
+                    "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-A - 1);
+  Linear_Expression e2(2*C + B - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B - A <= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.generalized_affine_preimage(A, GREATER_OR_EQUAL,
+                                           2*C + B - 1, -1);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-A - 1, "
+                    "LESS_OR_EQUAL, 2*C + B - 2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(-A - 1);
+  Linear_Expression e2(D - 3*C - B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B + A <= 2);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(B - D >= 1);
+  oct.add_constraint(C <= 1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.generalized_affine_preimage(A, EQUAL, D - 3*C - B - 1, -1);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-A - 1, "
+                    "EQUAL, D - 3*C - B - 2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(B - A - 1);
+  Linear_Expression e2(3*C - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B + A <= 2);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(C <= 1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(C >= -2);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A - 1, "
+                    "GREATER_OR_EQUAL, 3*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(B - A - 1);
+  Linear_Expression e2(B + 3*C - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B + A <= 2);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(C <= 1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(C >= -2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A - 1, "
+                    "LESS_OR_EQUAL, B + 3*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(A);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 3);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A, "
+                    "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B <= 3);
+  oct.add_constraint(C <= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C <= -1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A, "
+                    "GREATER_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-C + B - 2);
+  Linear_Expression e2(B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B <= 3);
+  oct.add_constraint(C >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-C + B - 2, "
+                    "LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage3.cc b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..b7bf1cb
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc
@@ -0,0 +1,617 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - C + B - 2);
+  Linear_Expression e2(A + B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B <= 3);
+  oct.add_constraint(C >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - C + B - 2, "
+                    "LESS_OR_EQUAL, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_preimage(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_preimage(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(C + B >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a strict relation symbol.
+    oct.generalized_affine_preimage(B + C, LESS_THAN, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(2*A + 3*B - 1);
+  Linear_Expression e2(B - 1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -4);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(2*A + 3*B - 1, "
+                    "LESS_OR_EQUAL, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(A + B);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(A + B <= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + B, "
+                    "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A + B - 2*C + 2);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + B - 2*C + 2, "
+                    "LESS_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(A - B + 2);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= -1);
+  oct.add_constraint(D >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C <= -1);
+  known_result.add_constraint(D >= 2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - B + 2, "
+                    "LESS_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(C - D - 5);
+  Linear_Expression e2(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= -1);
+  oct.add_constraint(D >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4, EMPTY);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C - D - 5, "
+                    "GREATER_OR_EQUAL, 3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(C - D - 5);
+  Linear_Expression e2(-11);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= -1);
+  oct.add_constraint(D >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C - D - 5, "
+                    "GREATER_OR_EQUAL, -11) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-5);
+  Linear_Expression e2(-1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-5, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-5);
+  Linear_Expression e2(-1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-5, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= -4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, 2*B + 3, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, 2*B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -5);
+  known_result.add_constraint(A <= 10);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(4*B <= 5);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, 2*B + 3, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, 2*B + 3, -2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -6);
+  known_result.add_constraint(A <= 5);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -A + 3) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -6);
+  known_result.add_constraint(A <= 10);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, 2*B + 3, -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, 2*B + 3, -2) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= -1);
+  known_result.add_constraint(A <= 10);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, -A + 3);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -A + 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage4.cc b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc
new file mode 100644
index 0000000..3542f73
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc
@@ -0,0 +1,637 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 3*C + 2, 5);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 3*C + 2, 5) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+  oct.add_constraint(C >= -12);
+  oct.add_constraint(C - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(C >= -12);
+  known_result.add_constraint(C <= 14);
+
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B - 3*C + 2, 5);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B - 3*C + 2, 5) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C >= -31);
+  known_result.add_constraint(2*(B - C) <= 27);
+  known_result.add_constraint(2*(B + C) >= -35);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -31);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B - A) <= 27);
+  known_result.add_constraint(2*(B + A) >= -35);
+
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, B + 2*A + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C <= 31);
+  known_result.add_constraint(2*(C - B) <= 35);
+  known_result.add_constraint(2*(B + C) <= 27);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B - 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B - 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A <= 9);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) <= 27);
+  known_result.add_constraint(2*(B + A) <= 5);
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A <= 19);
+  known_result.add_constraint(2*(A - B) <= 23);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= -2);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -23);
+  known_result.add_constraint(2*(B - A) <= 19);
+  known_result.add_constraint(B <= -2);
+
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C <= 9);
+  known_result.add_constraint(2*(C - B) <= 13);
+  known_result.add_constraint(2*(B + C) <= 5);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A <= 17);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) <= 21);
+  known_result.add_constraint(2*(B + A) <= 45);
+
+
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, B + 2*A + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C >= -17);
+  known_result.add_constraint(2*(B - C) <= 45);
+  known_result.add_constraint(2*(B + C) >= -21);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B - 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B - 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -39);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B - A) <= 67);
+  known_result.add_constraint(2*(B + A) >= -43);
+
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, D + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, D + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, D + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, D + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - C + B - 2);
+  Linear_Expression e2(A + B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= -4);
+  oct.add_constraint(B - C <= -4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - C + B - 2, "
+                    "LESS_OR_EQUAL, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-B + 3);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-B + 3, "
+                    "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(A + 2*C - 3*D + 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B - D >= 2);
+  oct.add_constraint(C + A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + 2*C - 3*D + 1, "
+                    "EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(3*D + 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B - D >= 2);
+  oct.add_constraint(C + A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B - A >= 2);
+  known_result.add_constraint(C + A <= 1);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(3*D + 1, "
+                    "EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(A + 2*B - 3*D + 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B - D >= 2);
+  oct.add_constraint(C + A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + 2*B - 3*D + 1, "
+                    "EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Octagonal_Shape/intersection1.cc b/tests/Octagonal_Shape/intersection1.cc
new file mode 100644
index 0000000..47170c5
--- /dev/null
+++ b/tests/Octagonal_Shape/intersection1.cc
@@ -0,0 +1,376 @@
+/* Test Octagonal_Shape::intersection_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x - y <= 4);
+  oc1.add_constraint(x + y <= 6);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(-y <= -2);
+  oc2.add_constraint(x - y <= 5);
+  oc2.add_constraint(x + y <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(x - y <= 4);
+  known_result.add_constraint(x + y <= 6);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= -1);
+  oc1.add_constraint(A + B <= 10);
+  oc1.add_constraint(A + C <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(C <= 2);
+  oc2.add_constraint(A - B <= 5);
+  oc2.add_constraint(A - C <= 5);
+  oc2.add_constraint(A + B <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(A - B <= -1);
+  known_result.add_constraint(A + B <= 7);
+  known_result.add_constraint(A - C <= 5);
+  known_result.add_constraint(A + C <= 1);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 5);
+  oc1.add_constraint(A - B <= -1);
+  oc1.add_constraint(A + B <= -1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(C <= 2);
+  oc2.add_constraint(A - B <= 4);
+  oc2.add_constraint(A + B <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(A - B <= -1);
+  known_result.add_constraint(A + B <= -1);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 5);
+  oc1.add_constraint(A - B <= -1);
+  oc1.add_constraint(A - B >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(A - B <= 4);
+  oc2.add_constraint(A + B <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2;
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oc1;
+  TOctagonal_Shape oc2;
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+// CHECKME: is this now duplicating test01?
+// (was originally testing *_and_minimize)
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x - y <= 4);
+  oc1.add_constraint(x + y <= 6);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(-y <= -2);
+  oc2.add_constraint(x - y <= 5);
+  oc2.add_constraint(x + y <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.intersection_assign(oc2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(-y <= -2);
+  cs.insert(x - y <= 4);
+  cs.insert(x + y <= 6);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraints(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= y);
+
+  TOctagonal_Shape oc2(3);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::intersection_assign(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.intersection_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+// CHECKME: is this now duplicating test08?
+// (was originally testing *_and_minimize)
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(7);
+
+  TOctagonal_Shape oc2(15);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::intersection_assign(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.intersection_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  // Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 5);
+  oc1.add_constraint(A + B <= 1);
+  oc1.add_constraint(A + B >= -1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(A - B <= -1);
+  cs.insert(A + B <= -1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraints(cs);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(C <= 2);
+  oc2.add_constraint(A - B <= -2);
+  oc2.add_constraint(A + B <= -3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.intersection_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(A - B <= -2);
+  known_result.add_constraint(A + B <= -3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..8d49ed1
--- /dev/null
+++ b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,339 @@
+/* Test Octagonal_Shape::limited_BHMZ05_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+
+  TOctagonal_Shape oct1(cs1);
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+
+  TOctagonal_Shape oct2(cs2);
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(y <= -1);
+  cs.insert(x <= 5);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct2.limited_BHMZ05_extrapolation_assign(oct1, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2,
+                    "*** oct2.limited_BHMZ05_extrapolation_assign(oct1) ***");
+
+   return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  TOctagonal_Shape oct1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  TOctagonal_Shape oct2(cs2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oct1(0, EMPTY);
+  TOctagonal_Shape oct2(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A + B <= 0);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A - B <= 1);
+
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A - B <= 2);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+
+  TOctagonal_Shape oct1(7);
+  oct1.add_constraint(A - B <= 1);
+  oct1.add_constraint(A - C <= 2);
+  oct1.add_constraint(C - B <= 2);
+  oct1.add_constraint(D - E == 0);
+  oct1.add_constraint(G + F == 0);
+
+  TOctagonal_Shape oct2(7);
+  oct2.add_constraint(A - B <= 0);
+  oct2.add_constraint(A - C <= 1);
+  oct2.add_constraint(C - B <= 2);
+  oct2.add_constraint(D - E == 0);
+  oct2.add_constraint(G + F == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(C - B <= 2);
+  cs.insert(D - E == 0);
+  cs.insert(F + G == 0);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(7);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D - E == 0);
+  known_result.add_constraint(F + G == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable y(1);
+
+  TOctagonal_Shape oc1(1);
+  TOctagonal_Shape oc2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // has a strict-inequality.
+    oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/limitedcc76extrapolation1.cc b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..489ebce
--- /dev/null
+++ b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,660 @@
+/* Test Octagonal_Shape::limited_CC76_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+  TOctagonal_Shape oct1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+  TOctagonal_Shape oct2(cs2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 3);
+  known_result.add_constraint(y - x >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(0);
+  TOctagonal_Shape oct2(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A == -2);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == -2);
+  oct2.add_constraint(B == 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == -2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A + B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(A - B <= 6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(A >= 5);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(A >= 3);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(A >= 3);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(4);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B <= 6);
+  oct1.add_constraint(C - D == 5);
+
+  TOctagonal_Shape oct2(4);
+  oct2.add_constraint(A <= 4);
+  oct2.add_constraint(C - D == 5);
+  oct2.add_constraint(B <= 5);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A == 4);
+  cs.insert(C - D == 5);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(C - D == 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(A >= 3);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - 2*B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 2);
+  oct1.add_constraint(A >= 3);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= 1);
+  oct2.add_constraint(B == -1);
+  oct2.add_constraint(A >= 4);
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(C <= 4);
+  oct1.add_constraint(B >= 2);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(C <= 3);
+  oct2.add_constraint(B >= 3);
+  oct2.add_constraint(A <= 3);
+  oct2.add_constraint(A >= 5);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(C <= 2);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test14() {
+  Variable y(1);
+
+  TOctagonal_Shape oc1(1);
+  TOctagonal_Shape oc2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_CC76_extrapolation_assign(oc2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc2.limited_CC76_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_CC76_extrapolation_assign(oc, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    oc2.limited_CC76_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // has a strict-inequality.
+    oc2.limited_CC76_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A + B <= 0);
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A - B <= 1);
+
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A - B <= 2);
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/mapspacedims1.cc b/tests/Octagonal_Shape/mapspacedims1.cc
new file mode 100644
index 0000000..f5b8890
--- /dev/null
+++ b/tests/Octagonal_Shape/mapspacedims1.cc
@@ -0,0 +1,262 @@
+/* Test Octagonal_Shape::map_space_dimensions().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  TOctagonal_Shape oc1(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  TOctagonal_Shape oc1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TOctagonal_Shape oc1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y - x <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 2);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(x <= 4);
+
+#if 0
+  cout << "oc1" << endl;
+  oc1.ascii_dump(cout);
+
+  cout << "result" << endl;
+  known_result.ascii_dump(cout);
+#endif
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 1);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y - x <= 7);
+  known_result.add_constraint(x + y <= 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Partial_Function function;
+
+  TOctagonal_Shape oc1;
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+  function.insert(0, 2);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(y - z <= -3);
+  cs.insert(x - y <= 1);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oc1.map_space_dimensions(function);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/max_min1.cc b/tests/Octagonal_Shape/max_min1.cc
new file mode 100644
index 0000000..5e6f051
--- /dev/null
+++ b/tests/Octagonal_Shape/max_min1.cc
@@ -0,0 +1,691 @@
+/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...)
+   and Octagonal_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(-x1-x2 >= -5);
+  oct.add_constraint(x1-x2 >= -5);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x1-2*x2, num, den, included)
+    && num == 5 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x1-2*x2, num, den, included)
+    && num == -10 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(-x1-x2 >= -5);
+  oct.add_constraint(x1-x2 >= -5);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x1-x2, num, den, included)
+    && num == 5 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x1-x2, num, den, included)
+    && num == -5 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(-x1 - x2 >= -10);
+  oct.add_constraint(-10*x1 - 10*x3 >= -60);
+  oct.add_constraint(x1 + x3 >= -150);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+  oct.add_constraint(x3 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-10*x1-6*x2-4*x3+4, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-10*x1-6*x2-4*x3+4, num, den, included)
+    && num == -80 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(-x1 - x2 >= -10);
+  oct.add_constraint(-10*x1 - 10*x3 >= -60);
+  oct.add_constraint(x1 + x3 >= -150);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+  oct.add_constraint(x3 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x2-x3+5, num, den, included)
+    && num == 15 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x2-x3+5, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x1 - x2 <= 6);
+  oct.add_constraint(x1 + x2 <= 4);
+  oct.add_constraint(x1 >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x1-2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x1-2, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x1(0);
+
+  TOctagonal_Shape oct(1, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = !oct.maximize(x1-2, num, den, included);
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(x1-2, num, den, included);
+
+  return ok;
+}
+
+bool
+test07() {
+
+  TOctagonal_Shape oct(0, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = !oct.maximize(Linear_Expression(2), num, den, included);
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(Linear_Expression(2), num, den, included);
+
+  return ok;
+}
+
+bool
+test08() {
+
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(Linear_Expression(2), num, den, included)
+    && num == 2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(Linear_Expression(2), num, den, included);
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x1 <= x2 + 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Linear_Expression LE(x3);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::maximize(LE, num, den, included): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.minimize(LE, num, den, included);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B);
+  bool ok = !oct.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 2 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A - B);
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C);
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+  oct.add_constraint(E - D <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(Linear_Expression(3));
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(z);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::minimize(LE, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.minimize(LE, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+
+  Octagonal_Shape<mpq_class> oct(1);
+  oct.add_constraint(5*A <= 2);
+  oct.add_constraint(5*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(3*A, num, den, included)
+    && num == 6 && den == 5 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(3*A, num, den, included)
+    && num == 3 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  Octagonal_Shape<mpq_class> oct(1);
+  oct.add_constraint(5*A <= 2);
+  oct.add_constraint(3*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-7*A, num, den, included)
+    && num == -7 && den == 3 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-7*A, num, den, included)
+    && num == -14 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/max_min2.cc b/tests/Octagonal_Shape/max_min2.cc
new file mode 100644
index 0000000..971e62f
--- /dev/null
+++ b/tests/Octagonal_Shape/max_min2.cc
@@ -0,0 +1,310 @@
+/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...)
+   and Octagonal_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+  bool ok = !oct.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A >= 1);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(2*A <= 3);
+  oct.add_constraint(B <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + 4*B - 1);
+
+  bool ok_max = oct.maximize(LE, num, den, included, g)
+    && num == 33 && den == 2 && included
+    && g.is_point()
+    && g.coefficient(A) == 3 && g.coefficient(B) == 8
+    && g.divisor() == 2;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  bool ok_min = oct.minimize(LE, num, den, included, g)
+    && num == 7 && den == 2 && included
+    && g.is_point()
+    && g.coefficient(A) == 1 && g.coefficient(B) == 2
+    && g.divisor() == 2;
+
+  nout << (included ? "minimum" : "infinum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok_max && ok_min;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/maxspacedim1.cc b/tests/Octagonal_Shape/maxspacedim1.cc
new file mode 100644
index 0000000..5f2f0b9
--- /dev/null
+++ b/tests/Octagonal_Shape/maxspacedim1.cc
@@ -0,0 +1,86 @@
+/* Test Octagonal_Shape::max_space_dimension().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  nout << Octagonal_Shape<signed char>::max_space_dimension() << " (signed char)"
+       << endl
+       << Octagonal_Shape<short>::max_space_dimension() << " (short)"
+       << endl
+       << Octagonal_Shape<int>::max_space_dimension() << " (int)"
+       << endl
+       << Octagonal_Shape<long>::max_space_dimension() << " (long)"
+       << endl
+       << Octagonal_Shape<long long>::max_space_dimension() << " (long long)"
+       << endl
+       << Octagonal_Shape<float>::max_space_dimension() << " (float)"
+       << endl
+       << Octagonal_Shape<double>::max_space_dimension() << " (double)"
+       << endl
+       << Octagonal_Shape<long double>::max_space_dimension() << " (long double)"
+       << endl
+       << Octagonal_Shape<mpz_class>::max_space_dimension() << " (mpz_class)"
+       << endl
+       << Octagonal_Shape<mpq_class>::max_space_dimension() << " (mpq_class)"
+       << endl;
+
+  if (Octagonal_Shape<signed char>::max_space_dimension()
+      < Octagonal_Shape<short>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<short>::max_space_dimension()
+      < Octagonal_Shape<int>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<int>::max_space_dimension()
+      < Octagonal_Shape<long>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<long>::max_space_dimension()
+      < Octagonal_Shape<long long>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<float>::max_space_dimension()
+      < Octagonal_Shape<double>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<double>::max_space_dimension()
+      < Octagonal_Shape<long double>::max_space_dimension())
+    return false;
+
+  if (2*Octagonal_Shape<mpz_class>::max_space_dimension()
+      < Octagonal_Shape<mpq_class>::max_space_dimension())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/membytes1.cc b/tests/Octagonal_Shape/membytes1.cc
new file mode 100644
index 0000000..9236804
--- /dev/null
+++ b/tests/Octagonal_Shape/membytes1.cc
@@ -0,0 +1,233 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(TOctagonal_Shape& oct, const Constraint& c) {
+  const memory_size_type oct_memory_before = oct.total_memory_in_bytes();
+  const memory_size_type c_memory = c.total_memory_in_bytes();
+  oct.add_constraint(c);
+  const memory_size_type oct_memory_after = oct.total_memory_in_bytes();
+
+  nout << oct_memory_before
+       << " + " << c_memory
+       << " -> " << oct_memory_after
+       << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  using namespace test01_namespace;
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 2*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 4*z;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding constraints to an octagon ***" << endl;
+
+  TOctagonal_Shape oct(3);
+  add_constraint(oct, 4*x - 4*y + 14 >= 0);
+  add_constraint(oct, 4*x + 4*y + 2 >= 0);
+  add_constraint(oct, x + y - 1 >= 0);
+
+  add_constraint(oct, x + 1 >= 0);
+  add_constraint(oct, x + z - 1 >= 0);
+  add_constraint(oct, 2*x -2*z + 7 >= 0);
+  add_constraint(oct, x - y + 1 >= 0);
+
+  add_constraint(oct, x - y + 5 <= 0);
+  add_constraint(oct, 2*x - 2*z + 13 <= 0);
+  add_constraint(oct, -2*x + 2*z + 1 <= 0);
+  add_constraint(oct, -x + y - 1 <= 0);
+
+  add_constraint(oct, -x + y + 7 >= 0);
+  add_constraint(oct, -4*x + 4*y - 4 >= 0);
+  add_constraint(oct, -2*x + 2*z - 5 <= 0);
+  add_constraint(oct, -x + 1 >= 0);
+
+  add_constraint(oct, -x - z + 5 <= 0);
+  add_constraint(oct, -4*x - 2*y + 8 <= 0);
+  add_constraint(oct, -x - y + 5 <= 0);
+  add_constraint(oct, -x - y +13 <= 0);
+
+  const memory_size_type oct_total_size = oct.total_memory_in_bytes();
+  const memory_size_type oct_external_size = oct.external_memory_in_bytes();
+  const Constraint_System& cs = oct.constraints();
+  const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+  const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+
+  nout << endl;
+
+  nout << "*** Size of the user-visible octagons components ***"
+       << endl
+       << "oct.total_memory_in_bytes() = " << oct_total_size
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl
+       << "oct.external_memory_in_bytes() = " << oct_external_size
+       << endl
+       << "cs.external_memory_in_bytes() = " << cs_external_size
+       << endl << endl;
+
+  nout << "*** Size of a constraint system vs size of contained constraints"
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl;
+
+  memory_size_type cs_elements_size = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained constraints = " << cs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(4*x - 4*y + 14 >= 0);
+  oct.add_constraint(4*x + 4*y + 2 <= 0);
+  oct.add_constraint(x + y - 1 >= 0);
+  oct.add_constraint(x + y - 5 <= 0);
+
+  const memory_size_type oct_total_size = oct.total_memory_in_bytes();
+  const memory_size_type oct_external_size = oct.external_memory_in_bytes();
+
+  Determinate<TOctagonal_Shape> doct(oct);
+
+  const memory_size_type doct_total_size = doct.total_memory_in_bytes();
+  const memory_size_type doct_external_size = doct.external_memory_in_bytes();
+
+  nout << "oct.total_memory_in_bytes() = " << oct_total_size
+       << endl
+       << "oct.external_memory_in_bytes() = " << oct_external_size
+       << endl
+       << "doct.total_memory_in_bytes() = " << doct_total_size
+       << endl
+       << "doct.external_memory_in_bytes() = " << doct_external_size
+       << endl;
+
+  Pointset_Powerset<TOctagonal_Shape> poct(oct);
+
+  TOctagonal_Shape qoct(3);
+  qoct.add_constraint(x >= 0);
+  qoct.add_constraint(y >= 0);
+  qoct.add_constraint(z >= 0);
+  qoct.add_constraint(x <= 1);
+  qoct.add_constraint(y <= 1);
+  qoct.add_constraint(z <= 1);
+  Pointset_Powerset<TOctagonal_Shape> pqoct(qoct);
+
+  Pointset_Powerset<TOctagonal_Shape> proct = pqoct;
+  proct.poly_difference_assign(poct);
+
+  const memory_size_type poct_total_size = poct.total_memory_in_bytes();
+  const memory_size_type poct_external_size = poct.external_memory_in_bytes();
+  const memory_size_type pqoct_total_size = pqoct.total_memory_in_bytes();
+  const memory_size_type pqoct_external_size = pqoct.external_memory_in_bytes();
+  const memory_size_type proct_total_size = proct.total_memory_in_bytes();
+  const memory_size_type proct_external_size = proct.external_memory_in_bytes();
+
+  nout << "poct.total_memory_in_bytes() = " << poct_total_size
+       << endl
+       << "poct.external_memory_in_bytes() = " << poct_external_size
+       << endl
+       << "pqoct.total_memory_in_bytes() = " << pqoct_total_size
+       << endl
+       << "pqoct.external_memory_in_bytes() = " << pqoct_external_size
+       << endl
+       << "proct.total_memory_in_bytes() = " << proct_total_size
+       << endl
+       << "proct.external_memory_in_bytes() = " << proct_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Octagonal_Shape/minconstraints1.cc b/tests/Octagonal_Shape/minconstraints1.cc
new file mode 100644
index 0000000..db339ec
--- /dev/null
+++ b/tests/Octagonal_Shape/minconstraints1.cc
@@ -0,0 +1,134 @@
+/* Test Octagonal_Shape<T>::minimized_constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B >= -2);
+  oct.add_constraint(A >= -3);
+  oct.add_constraint(A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  const Constraint_System cs = oct.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** oct.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_oct(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_oct);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 2);
+  oct.add_constraint(B == 3);
+  oct.add_constraint(A - B == -1);
+  oct.add_constraint(A + B == 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  const Constraint_System cs = oct.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** oct.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_oct(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(A - B <= -1);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_oct);
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oc(0, UNIVERSE);
+
+  print_constraints(oc, "*** oc ***");
+
+  const Constraint_System cs = oc.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** oc.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  return num_constraints == 0;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Octagonal_Shape/octdifference1.cc b/tests/Octagonal_Shape/octdifference1.cc
new file mode 100644
index 0000000..655e7ae
--- /dev/null
+++ b/tests/Octagonal_Shape/octdifference1.cc
@@ -0,0 +1,257 @@
+/* Test Octagonal_Shape::oct_difference_assign(): if `oct1' is
+   contained in `oct2', the result of `oct1.oct_difference_assign(oct2)'
+   is an empty octagon.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A <= -2);
+  oct1.add_constraint(B == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A >= 0);
+  oct2.add_constraint(A <= 2);
+  oct2.add_constraint(B >= 0);
+  oct2.add_constraint(B <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_difference_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_difference_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(0);
+  TOctagonal_Shape oct2(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_difference_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(1);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(1);
+  oct2.add_constraint(A == 5);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_difference_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 7);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc1(3);
+  TOctagonal_Shape oc2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::oct_difference_assign(oc2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    oc1.oct_difference_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 0);
+  oct1.add_constraint(A >= -2);
+  oct1.add_constraint(B == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  oct1.oct_difference_assign(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_difference_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(D == 0);
+  oc1.add_constraint(C == 0);
+  oc1.add_constraint(B == 0);
+  oc1.add_constraint(A == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc1.add_constraint(A + D >= 0);
+  oc1.add_constraint(C >= 0);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A == 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(4, EMPTY);
+
+  oc1.oct_difference_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.oct_difference_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(B >= 0);
+  oct1.add_constraint(A + B <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A + B <= 10);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_difference_assign(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_difference_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A + B <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A + B >= 1);
+  oct2.add_constraint(A + B <= 10);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A + B <= 1);
+
+  oct1.oct_difference_assign(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_difference_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/octhull1.cc b/tests/Octagonal_Shape/octhull1.cc
new file mode 100644
index 0000000..5b855e9
--- /dev/null
+++ b/tests/Octagonal_Shape/octhull1.cc
@@ -0,0 +1,392 @@
+/* Test Octagonal_Shape::poly_hull_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x1 >= 1);
+  oct1.add_constraint(x1 - x2 <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x2 <= 1);
+  oct2.add_constraint(x1 - x2 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x1 - x2 <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x1 >= 0);
+  oct1.add_constraint(x1 + x2 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x2 >= 1);
+  oct2.add_constraint(x1 + x2 >= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x1 + x2 >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TOctagonal_Shape oct1(5);
+  oct1.add_constraint(x1 <= 5);
+  oct1.add_constraint(x2 <= -1);
+  oct1.add_constraint(x1 - x2 <= 10);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(5);
+  oct2.add_constraint(x1  <= 2);
+  oct2.add_constraint(x4 <= 7);
+  oct2.add_constraint(x1 - x2 <= 20);
+  oct2.add_constraint(x4 - x3 <= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(x1 <= 5);
+  known_result.add_constraint(x1 - x2 <= 20);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 <= 1);
+  oct1.add_constraint(- x1 - x2 >= 1);
+  oct1.add_constraint(x3 == 2 );
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(x2  >= 1);
+  oct2.add_constraint(x1 + x2 <= 2);
+  oct2.add_constraint(- x1 - x3 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 <= 1);
+  known_result.add_constraint(-x3 <= 3);
+  known_result.add_constraint(x1 + x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A <= 1);
+  oct1.add_constraint(B >= 7);
+  oct1.add_constraint(C <= 3);
+  oct1.add_constraint(A >= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(A  >= 1);
+  oct2.add_constraint(B <= 2);
+  oct2.add_constraint(C <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs1;
+  cs1.insert(A == 1);
+  cs1.insert(C - A <= 2);
+  cs1.insert(C - B <= 7);
+  cs1.insert(B - A <= 3);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(A == 1);
+  cs2.insert(C - A <= 3);
+  cs2.insert(C - A >= 7);
+  cs2.insert(B - A <= 2);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraints(cs2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(cs1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TOctagonal_Shape oct1(0, EMPTY);
+  TOctagonal_Shape oct2;
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TOctagonal_Shape oct1(8);
+  TOctagonal_Shape oct2(8);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 <= 2);
+  oct1.add_constraint(- x1 - x2 >= 1);
+  oct1.add_constraint(x1 + x2 + x3 <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(x2  >= 1);
+  oct2.add_constraint(x1 + x2 <= 2);
+  oct2.add_constraint(2*x2 + 3*x3 <= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 <= 2);
+  known_result.add_constraint(x1 + x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oc1(12);
+  TOctagonal_Shape oc2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::oct_hull_assign(oc2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    oc1.oct_hull_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+// CHEKME: is this a duplication of test10?
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= y);
+
+  TOctagonal_Shape oc2(3);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::oct_hull_assign(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.oct_hull_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 <= 1);
+  oct1.add_constraint(- x1 - x2 >= 1);
+  oct1.add_constraint(x3 == 2 );
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(x2  >= 1);
+  oct2.add_constraint(x1 + x2 <= 2);
+  oct2.add_constraint(- x1 - x3 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.oct_hull_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 <= 1);
+  known_result.add_constraint(-x3 <= 3);
+  known_result.add_constraint(x1 + x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.oct_hull_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/pointsetpowerset1.cc b/tests/Octagonal_Shape/pointsetpowerset1.cc
new file mode 100644
index 0000000..466a690
--- /dev/null
+++ b/tests/Octagonal_Shape/pointsetpowerset1.cc
@@ -0,0 +1,488 @@
+/* Test Pointset_Powerset<Octagonal_Shape<> >.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of octagonal_shapes from an octagonal shape.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape os(4);
+  os.add_constraint(x >= 2);
+  os.add_constraint(x + y <= 4);
+  os.add_constraint(z == 1);
+
+  Pointset_Powerset<TOctagonal_Shape> pps1(os);
+  Pointset_Powerset<TOctagonal_Shape> pps2(4, EMPTY);
+  pps2.add_disjunct(os);
+
+  bool ok = (pps1 == pps2);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps1.begin();
+  TOctagonal_Shape osi = i->element();
+  print_constraints(osi, "*** osi ***");
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i2 = pps2.begin();
+  TOctagonal_Shape osi2 = i2->element();
+  print_constraints(osi2, "*** osi2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of octagonal_shapes from an empty octagonal shape.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(os);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 3);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the implied equalities 4*x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<TOctagonal_Shape> pps(ph);
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->element();
+
+  Octagonal_Shape<mpq_class> known_osi(4);
+  known_osi.add_constraint(3*x == 2);
+  known_osi.add_constraint(z == 1);
+
+  bool ok = check_result(osi, known_osi, "1.193e-7", "5.45e-8", "3.98e-8");
+
+  print_constraints(osi, "*** osi ***");
+  print_constraints(known_osi, "*** known_osi ***");
+
+  // With the polynomial complexity, implied equalities are not found.
+  Pointset_Powerset<TOctagonal_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+  TOctagonal_Shape osi1 = i1->element();
+
+  Octagonal_Shape<mpq_class> known_osi1(4);
+  known_osi1.add_constraint(3*x >= 2);
+  known_osi1.add_constraint(z >= 1);
+
+  ok = check_result(osi1, known_osi1, "1.193e-7", "8.89e-8", "7.95e-8") && ok;
+
+  print_constraints(osi1, "*** osi1 ***");
+  print_constraints(known_osi1, "*** known_osi1 ***");
+
+  ok = ok && pps.OK() && pps1.OK();
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_ok = pps.begin();
+  TOctagonal_Shape osi_ok = i_ok->element();
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1_ok = pps1.begin();
+  TOctagonal_Shape osi1_ok = i1_ok->element();
+
+  print_constraints(osi_ok, "*** osi after OK() ***");
+  print_constraints(osi1_ok, "*** osi1 after OK() ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 2);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<TOctagonal_Shape> pps(ph);
+  // With the polynomial complexity, the built powerset is non-empty.
+  Pointset_Powerset<TOctagonal_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_os1(4);
+  known_os1.add_constraint(3*x >= 2);
+  known_os1.add_constraint(z >= 1);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+  TOctagonal_Shape osi1 = i1->element();
+
+  bool ok = check_result(osi1, known_os1, "1.92e-7", "8.89e-8", "7.95e-8")
+    && pps.is_empty();
+
+  print_constraints(osi1, "*** osi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of octagonal_shapes from an empty polyhedron.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(ph);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a bd shape.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(bds);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x == 0);
+  known_pps.add_constraint(x - y <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->element();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty bd shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(bds);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a box.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->element();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty box.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(box);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a grid.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(gr);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->element();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty grid.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(gr);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of
+// octagonal_shapes.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator j = pps.begin();
+  TOctagonal_Shape osj = j->element();
+  print_constraints(osj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of polyhedra.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<TOctagonal_Shape> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TOctagonal_Shape> pps2(pps2_c);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps1(2);
+  known_pps1.add_constraint(2*x >= 1);
+  known_pps1.add_constraint(y >= 0);
+  Pointset_Powerset<TOctagonal_Shape> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+  TOctagonal_Shape osi1 = i1->element();
+  print_constraints(osi1, "*** osi1 ***");
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i2 = pps2.begin();
+  TOctagonal_Shape osi2 = i2->element();
+  print_constraints(osi2, "*** osi2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of bd shapes.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bd(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps.begin();
+  TOctagonal_Shape osi = i_os->element();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of boxes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps.begin();
+  TOctagonal_Shape osi = i_os->element();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of grids.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(gr);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_gr);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->element();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithcons1.cc b/tests/Octagonal_Shape/relatwithcons1.cc
new file mode 100644
index 0000000..0f175d4
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons1.cc
@@ -0,0 +1,595 @@
+/* Test Octagonal_Shape::relation_with(c).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(y <= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(y >= 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(y <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(y >= 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(x + y == 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(x - y == 0);
+  oct.add_constraint(w <= 1);
+  oct.add_constraint(x + z >= 3);
+  oct.add_constraint(z - w <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(x + w >= 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 1);
+  cs.insert(y >= 5);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  // An equality constraint non-intersecting the octagon.
+  Constraint c(y == -1);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Constraint::zero_dim_false());
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(Constraint::zero_dim_false()) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x == 1);
+  oct.add_constraint(y <= 0);
+  oct.add_constraint(z >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(x > 1);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variable G1(32);
+  Variable H1(33);
+
+  TOctagonal_Shape oct(34);
+  oct.add_constraint(C >= 4);
+  oct.add_constraint(D >= 1);
+  oct.add_constraint(G == 0);
+  oct.add_constraint(L >= 5);
+  oct.add_constraint(O >= 1);
+  oct.add_constraint(A1 >= -1);
+  oct.add_constraint(A1 <= 511);
+  oct.add_constraint(C1 >= 0);
+  oct.add_constraint(H1 >= 1);
+  oct.add_constraint(C + D >= 5);
+  oct.add_constraint(E - F == 0);
+  oct.add_constraint(C - G >= 4);
+  oct.add_constraint(C + G >= 4);
+  oct.add_constraint(D - G >= 1);
+  oct.add_constraint(D + G >= 1);
+  oct.add_constraint(J - K == 0);
+  oct.add_constraint(L - C >= 1);
+  oct.add_constraint(C + L >= 9);
+  oct.add_constraint(D + L >= 6);
+  oct.add_constraint(L - G >= 5);
+  oct.add_constraint(G + L >= 5);
+  oct.add_constraint(M - N == 0);
+  oct.add_constraint(C + O >= 5);
+  oct.add_constraint(D + O >= 2);
+  oct.add_constraint(O - G >= 1);
+  oct.add_constraint(G + O >= 1);
+  oct.add_constraint(L + O >= 6);
+  oct.add_constraint(R - S == 0);
+  oct.add_constraint(U - V == 0);
+  oct.add_constraint(W - X == 0);
+  oct.add_constraint(Y - Z == 0);
+  oct.add_constraint(A1 - C <= 507);
+  oct.add_constraint(C + A1 >= 3);
+  oct.add_constraint(A1 - D <= 510);
+  oct.add_constraint(D + A1 >= 0);
+  oct.add_constraint(G - A1 <= 1);
+  oct.add_constraint(A1 - G <= 511);
+  oct.add_constraint(G + A1 >= -1);
+  oct.add_constraint(G + A1 <= 511);
+  oct.add_constraint(A1 - L <= 506);
+  oct.add_constraint(L + A1 >= 4);
+  oct.add_constraint(A1 - O <= 510);
+  oct.add_constraint(O + A1 >= 0);
+  oct.add_constraint(C + C1 >= 4);
+  oct.add_constraint(D + C1 >= 1);
+  oct.add_constraint(G -C1 <= 0);
+  oct.add_constraint(G + C1 >= 0);
+  oct.add_constraint(L + C1 >= 5);
+  oct.add_constraint(C1 - O <= 0);
+  oct.add_constraint(O + C1 >= 1);
+  oct.add_constraint(A1 - C1 <= 511);
+  oct.add_constraint(A1 + C1 >= -1);
+  oct.add_constraint(D1 - E1 == 0);
+  oct.add_constraint(C + H1 >= 5);
+  oct.add_constraint(D + H1 >= 2);
+  oct.add_constraint(H1 - G >= 1);
+  oct.add_constraint(G + H1 >= 1);
+  oct.add_constraint(L + H1 >= 6);
+  oct.add_constraint(O + H1 >= 2);
+  oct.add_constraint(A1 - H1 <= 510);
+  oct.add_constraint(A1 + H1 >= 0);
+  oct.add_constraint(C1 + H1 >= 1);
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(C1 >= 511);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A == 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+
+  // An empty octagon.
+  TOctagonal_Shape oct(1, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B == 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B >= 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B >= 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B <= 10);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B <= 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithcons2.cc b/tests/Octagonal_Shape/relatwithcons2.cc
new file mode 100644
index 0000000..f1a557c
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons2.cc
@@ -0,0 +1,475 @@
+/* Test Octagonal_Shape::relation_with(c).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) > 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) > 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  // An empty octagon.
+  TOctagonal_Shape oct(1, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A > 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B == 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B > 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B > 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B < 10);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B < 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(B >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(B >= 2);
+  oct.add_constraint(C <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) == 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= -1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagon::relation_with(c):
+    // it is illegal to use a constraint that is not dimension-compatible
+    // with the octagon.
+    Poly_Con_Relation rel = oc.relation_with(-C - B <= 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 3);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(A + B == 3);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = oct.relation_with(A == 0);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  Octagonal_Shape<mpz_class> oc(1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A <= 1);
+
+  Constraint c(2*A == 1);
+  Poly_Con_Relation rel = oc.relation_with(c);
+
+  print_constraints(oc, "--- oc ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TOctagonal_Shape oc(1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A <= 1);
+
+  Constraint c(Linear_Expression(1) == 0);
+  Poly_Con_Relation rel = oc.relation_with(c);
+
+  print_constraints(oc, "--- oc ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with(1 == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+
+  TOctagonal_Shape oc(1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A <= 1);
+
+  Congruence cg((A %= 0) / 0);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 0) / 1);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A %= 0)/1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/relatwithcons3.cc b/tests/Octagonal_Shape/relatwithcons3.cc
new file mode 100644
index 0000000..ccdb4b3
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons3.cc
@@ -0,0 +1,508 @@
+/* Test Octagonal_Shape::relation_with().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B == 0);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= -1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B == 0);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B - 4*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - 4*A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B + 4*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B + 4*A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B + 4*A == 5);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B + 4*A == 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B + 4*A >= 6);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B + 4*A >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+  test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B == 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 3);
+  cs.insert(B <= 3);
+  cs.insert(B >= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A - B >= 3);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A - B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A + B >= 9);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A + B >= 9) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A + B >= 10);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A + B >= 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A - B == 3);
+  cs.insert(B == 1);
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A - 2*B > 2);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A - 2*B > 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B <= 3);
+  cs.insert(A <= 1);
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A - B > 4);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A - B > 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B >= 3);
+  cs.insert(A >= 1);
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A - B < 4);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A - B < 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(2*A >= 1);
+  oc.add_constraint(B >= 1);
+
+  Congruence cg((A + 4*B %= 1) / 2);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 4*B %= 1)/2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 1);
+  oc.add_constraint(A <= 2);
+  oc.add_constraint(B >= 1);
+  oc.add_constraint(B <= 2);
+
+  Congruence cg((A + 4*B %= 1) / 10);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 4*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(2*A <= 1);
+  oc.add_constraint(B <= 1);
+
+  Congruence cg((A + 4*B %= 1) / 2);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 4*B %= 1)/2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(B <= 2);
+  oc.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 1) / 10);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithgen1.cc b/tests/Octagonal_Shape/relatwithgen1.cc
new file mode 100644
index 0000000..51677df
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithgen1.cc
@@ -0,0 +1,495 @@
+/* Test Octagonal_Shape::relation_with(g): we verify that a generator
+   is not subsumed by an empty octagon.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Generator g = point(x);
+
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct;
+  print_constraints(oct, "*** oct ***");
+
+  Generator g = point();
+
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(point(2*A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel1 = oct.relation_with(point(B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(B)) == " << rel1 << endl;
+
+  Poly_Gen_Relation rel2 = oct.relation_with(point(-B));
+
+  nout << "oct.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result1 = Poly_Gen_Relation::subsumes();
+  Poly_Gen_Relation known_result2 = Poly_Gen_Relation::nothing();
+
+  return rel1 == known_result1 && rel2 == known_result2;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B == 1);
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(-A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B == 1);
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(-A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= -1);
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(-A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct  (2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B == 2);
+
+  print_constraints(oct , "*** oct       ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(closure_point(A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(A + B <= 3);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(A + B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(A + B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(A + B <= 3);
+  oct.add_constraint(A - B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(-2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagon::relation_with(g):
+    // it is illegal to use a generator that is
+    // dimensional incompatible with the OS.
+    Poly_Gen_Relation rel = oc.relation_with(ray(C));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(A + B <= 3);
+  oct.add_constraint(A - B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(-2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 3);
+  oct.add_constraint(A - B == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(-2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A - B == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A - B <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(point(A + 2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(A + 2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(point(A + 2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(A + 2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(B - 3*A + 5));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(B - 3*A + 5)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // A 1D empty shape that is not in minimal form and the point is the origin.
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(A >= 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  print_constraints(oct, "*** oct ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test21() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A == 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  print_constraints(oct, "*** oct ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+END_MAIN
diff --git a/tests/Octagonal_Shape/removespacedims1.cc b/tests/Octagonal_Shape/removespacedims1.cc
new file mode 100644
index 0000000..8cc941d
--- /dev/null
+++ b/tests/Octagonal_Shape/removespacedims1.cc
@@ -0,0 +1,374 @@
+/* Remove the higher variables from the space.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x2(1);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x2 <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x2 <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x2(1);
+  Variable x3(2);
+  Variable x5(4);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 - x3 <= 0);
+  oc1.add_constraint(x3 <= 2);
+  oc1.add_constraint(x5 <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x5);
+  oc1.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oct1.remove_space_dimensions({x3, x5}) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TOctagonal_Shape oct1(6);
+  oct1.add_constraint(x1 >= 1);
+  oct1.add_constraint(x1 + x3 >= 2);
+  oct1.add_constraint(x2 - x3 <= 4);
+  oct1.add_constraint(x4 - x1  >= 0);
+  oct1.add_constraint(x6 <= 7);
+  oct1.add_constraint(x5 + x4 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 >= 1);
+  known_result.add_constraint(x1 + x3 >= 2);
+  known_result.add_constraint(x2 - x3 <= 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(6);
+
+  // A 10-dim space, empty polyhedron.
+  TOctagonal_Shape oc(10, EMPTY);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  // A 7-dim space, empty polyhedron.
+  Octagonal_Shape<mpq_class> known_result(7, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions({y, z, w}) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  // A 4-dim space, empty polyhedron.
+  TOctagonal_Shape oc(4, EMPTY);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+  to_be_removed.insert(x);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions({x, y, z, w}) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oc(5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::remove_higher_dimensions(n): it is illegal to erase
+    // a variable that is not in the space of the polyhedron.
+    oc.remove_higher_space_dimensions(7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(y - z <= 2);
+  TOctagonal_Shape oc(cs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of method
+    // Octagonal_Shape::remove_space_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    oc.remove_space_dimensions(to_be_removed);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(x - y <= 0);
+  oc.add_constraint(z <= 2);
+  oc.add_constraint(w >= 3);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(oc);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions() ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TOctagonal_Shape oc(0);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(oc);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions() ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TOctagonal_Shape oct1(6);
+  oct1.add_constraint(x1 >= 1);
+  oct1.add_constraint(x1 + x3 >= 2);
+  oct1.add_constraint(x2 - x3 <= 4);
+  oct1.add_constraint(x4 - x1  >= 0);
+  oct1.add_constraint(x6 <= 7);
+  oct1.add_constraint(x5 + x4 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(6);
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(6) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 - x2 >= 13);
+  oct1.add_constraint(x2 <= 3);
+  oct1.add_constraint(x2 + x3 == 5);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(0);
+
+  Octagonal_Shape<mpq_class> known_result(0, UNIVERSE);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(x - y <= 0);
+  oc.add_constraint(z <= 2);
+  oc.add_constraint(w >= 3);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x);
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(0, UNIVERSE);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions({x, y, z, w}) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/run_tests b/tests/Octagonal_Shape/run_tests
new file mode 100755
index 0000000..b6cb811
--- /dev/null
+++ b/tests/Octagonal_Shape/run_tests
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Run the Octagonal_Shape tests.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DOCTAGONAL_SHAPE_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
diff --git a/tests/Octagonal_Shape/timeelapse1.cc b/tests/Octagonal_Shape/timeelapse1.cc
new file mode 100644
index 0000000..1d042ef
--- /dev/null
+++ b/tests/Octagonal_Shape/timeelapse1.cc
@@ -0,0 +1,371 @@
+/* Test time_elapse_assign() for particular polyhedra.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc1(2, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+
+  TOctagonal_Shape oc3(2);
+
+  print_constraints(oc3, "*** oc3 ***");
+
+  TOctagonal_Shape oc4(2, EMPTY);
+
+  print_constraints(oc4, "*** oc4 ***");
+
+  oc3.time_elapse_assign(oc4);
+
+  print_constraints(oc3, "*** oc3.time_elapse_assign(oc4) ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result) &&
+    (Octagonal_Shape<mpq_class>(oc3) == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(y >= 0);
+  oc1.add_constraint(x + y - 2 <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x >= 2);
+  oc2.add_constraint(x <= 4);
+  oc2.add_constraint(y == 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(y >= 1);
+  oc1.add_constraint(y <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(y == 5);
+
+  oc1.time_elapse_assign(oc2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x == 3);
+  oc1.add_constraint(y >= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x >= 3);
+  oc2.add_constraint(y >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(y <= 5);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(y <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 5);
+  oc1.add_constraint(y >= 6);
+  oc1.add_constraint(z >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= 2);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 5);
+  oc1.add_constraint(y >= 1);
+  oc1.add_constraint(z >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= 2);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(z >= 1);
+  known_result.add_constraint(x - y <= 2);
+  known_result.add_constraint(x - z <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 7);
+  oc1.add_constraint(y >= 6);
+  oc1.add_constraint(z >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  // The octagon oc2 is empty.
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= 4);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(A - B <= 1);
+  oc1.add_constraint(C + D <= 3);
+  oc1.add_constraint(A + E <= 5);
+  oc1.add_constraint(E - F <= 7);
+  oc1.add_constraint(F + E <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(6);
+  oc2.add_constraint(A + B <= 0);
+  oc2.add_constraint(C + B <= 9);
+  oc2.add_constraint(A + E <= 5);
+  oc2.add_constraint(F + E <= 2);
+  oc2.add_constraint(E - F <= 8);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(1);
+  oct1.add_constraint(x == 1);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(y + z <= 6);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::time_elapse_assign(oct1): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oct2.time_elapse_assign(oct1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/unconstrain1.cc b/tests/Octagonal_Shape/unconstrain1.cc
new file mode 100644
index 0000000..fef5692
--- /dev/null
+++ b/tests/Octagonal_Shape/unconstrain1.cc
@@ -0,0 +1,228 @@
+/* Test Octagonal_Shape::unconstrain().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+  print_constraints(os, "*** os ***");
+
+  os.unconstrain(A);
+
+  TOctagonal_Shape known_result(2, EMPTY);
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs(A, B);
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(2, EMPTY);
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A == B);
+  os.add_constraint(B >= 0);
+  print_constraints(os, "*** os ***");
+
+  os.unconstrain(B);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A == B);
+  os.add_constraint(B >= 0);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs(B);
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape os(0, EMPTY);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs;
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(0, EMPTY);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape os(0);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs;
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    TOctagonal_Shape os(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    os.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    TOctagonal_Shape os(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    os.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape os(5);
+  os.add_constraint(A - B == 9);
+  os.add_constraint(A >= D + 2);
+  os.add_constraint(C <= D);
+  os.add_constraint(E <= B);
+  os.add_constraint(E >= 0);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(5);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/universe1.cc b/tests/Octagonal_Shape/universe1.cc
new file mode 100644
index 0000000..c326d66
--- /dev/null
+++ b/tests/Octagonal_Shape/universe1.cc
@@ -0,0 +1,111 @@
+/* Test Octagonal_Shape::is_universe().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(-x <= 4);
+  oc.add_constraint(y - x <= 0);
+  oc.add_constraint(x - y <= -5);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc(4);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x >= 1);
+  oc.add_constraint(y >= 1);
+  oc.add_constraint(x <= 4);
+  oc.add_constraint(y <= 4);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc(0);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test05() {
+  //  Variable x(0);
+
+  TOctagonal_Shape oc(1, EMPTY);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Octagonal_Shape/writeoctagon1.cc b/tests/Octagonal_Shape/writeoctagon1.cc
new file mode 100644
index 0000000..9bffb6c
--- /dev/null
+++ b/tests/Octagonal_Shape/writeoctagon1.cc
@@ -0,0 +1,210 @@
+/* Test operator<<(ostream&, const Octagonal_Shape&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x + y == 3);
+  oc.add_constraint(x - y == 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B == 4, A + B == 3";
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x - y == 5);
+  oc.add_constraint(x + y == -1);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B == 5, A + B == -1";
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(-x - y <= 3);
+  oc.add_constraint(-x + y <= 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "B - A <= 4, A + B >= -3";
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x - y <= 3);
+  oc.add_constraint(x + y <= 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B <= 3, A + B <= 4";
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+
+  oc.add_constraint(x - y >= 4);
+  oc.add_constraint(x - y <= 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B == 4";
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+
+  oc.add_constraint(x + y <= 3);
+  oc.add_constraint(x + y >= 3);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A + B == 3";
+}
+
+bool
+test07() {
+  TOctagonal_Shape oc(32, UNIVERSE);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "true";
+}
+
+bool
+test08() {
+  TOctagonal_Shape oc(32, EMPTY);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "false";
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oc(2);
+
+  oc.add_constraint(x + y == 2);
+  oc.add_constraint(x - y == 1);
+
+  (void) oc.is_empty();
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "2*A == 3, 2*B == 1, A - B == 1, A + B == 2";
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpq_class> oc(2);
+
+  oc.add_constraint(x + y == 2);
+  oc.add_constraint(x - y == 1);
+
+  (void) oc.is_empty();
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A == 3/2, B == 1/2, A - B == 1, A + B == 2";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Partial_Function.cc b/tests/Partial_Function.cc
index ee28c87..206337f 100644
--- a/tests/Partial_Function.cc
+++ b/tests/Partial_Function.cc
@@ -1,11 +1,11 @@
 /* Implementation of class Partial_Function (non-inline functions).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,6 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
+#include <ppl-config.h>
 #include "Partial_Function.defs.hh"
 #include <stdexcept>
 #include <iostream>
diff --git a/tests/Partial_Function.defs.hh b/tests/Partial_Function.defs.hh
index 232706c..0ed053e 100644
--- a/tests/Partial_Function.defs.hh
+++ b/tests/Partial_Function.defs.hh
@@ -1,11 +1,11 @@
 /* Partial_Function class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Partial_Function.inlines.hh b/tests/Partial_Function.inlines.hh
index 5583408..7080d86 100644
--- a/tests/Partial_Function.inlines.hh
+++ b/tests/Partial_Function.inlines.hh
@@ -1,11 +1,11 @@
 /* Partial_Function class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Partial_Function.types.hh b/tests/Partial_Function.types.hh
index 681fa5f..ac3103d 100644
--- a/tests/Partial_Function.types.hh
+++ b/tests/Partial_Function.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/tests/Partially_Reduced_Product/Makefile.am b/tests/Partially_Reduced_Product/Makefile.am
new file mode 100644
index 0000000..134dab4
--- /dev/null
+++ b/tests/Partially_Reduced_Product/Makefile.am
@@ -0,0 +1,68 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+directproduct1 directproduct2 directproduct3 directproduct4 \
+directproduct5 directproduct6 \
+partiallyreducedproduct1 partiallyreducedproduct2 partiallyreducedproduct3 \
+partiallyreducedproduct4
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+directproduct1_SOURCES = directproduct1.cc
+directproduct2_SOURCES = directproduct2.cc
+directproduct3_SOURCES = directproduct3.cc
+directproduct4_SOURCES = directproduct4.cc
+directproduct5_SOURCES = directproduct5.cc
+directproduct6_SOURCES = directproduct6.cc
+
+partiallyreducedproduct1_SOURCES = partiallyreducedproduct1.cc
+partiallyreducedproduct2_SOURCES = partiallyreducedproduct2.cc
+partiallyreducedproduct3_SOURCES = partiallyreducedproduct3.cc
+partiallyreducedproduct4_SOURCES = partiallyreducedproduct4.cc
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES =
diff --git a/tests/Partially_Reduced_Product/Makefile.in b/tests/Partially_Reduced_Product/Makefile.in
new file mode 100644
index 0000000..093bd53
--- /dev/null
+++ b/tests/Partially_Reduced_Product/Makefile.in
@@ -0,0 +1,769 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = directproduct1$(EXEEXT) directproduct2$(EXEEXT) \
+	directproduct3$(EXEEXT) directproduct4$(EXEEXT) \
+	directproduct5$(EXEEXT) directproduct6$(EXEEXT) \
+	partiallyreducedproduct1$(EXEEXT) \
+	partiallyreducedproduct2$(EXEEXT) \
+	partiallyreducedproduct3$(EXEEXT) \
+	partiallyreducedproduct4$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Partially_Reduced_Product
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 = directproduct1$(EXEEXT) directproduct2$(EXEEXT) \
+	directproduct3$(EXEEXT) directproduct4$(EXEEXT) \
+	directproduct5$(EXEEXT) directproduct6$(EXEEXT) \
+	partiallyreducedproduct1$(EXEEXT) \
+	partiallyreducedproduct2$(EXEEXT) \
+	partiallyreducedproduct3$(EXEEXT) \
+	partiallyreducedproduct4$(EXEEXT)
+am_directproduct1_OBJECTS = directproduct1.$(OBJEXT)
+directproduct1_OBJECTS = $(am_directproduct1_OBJECTS)
+directproduct1_LDADD = $(LDADD)
+directproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_directproduct2_OBJECTS = directproduct2.$(OBJEXT)
+directproduct2_OBJECTS = $(am_directproduct2_OBJECTS)
+directproduct2_LDADD = $(LDADD)
+directproduct2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_directproduct3_OBJECTS = directproduct3.$(OBJEXT)
+directproduct3_OBJECTS = $(am_directproduct3_OBJECTS)
+directproduct3_LDADD = $(LDADD)
+directproduct3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_directproduct4_OBJECTS = directproduct4.$(OBJEXT)
+directproduct4_OBJECTS = $(am_directproduct4_OBJECTS)
+directproduct4_LDADD = $(LDADD)
+directproduct4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_directproduct5_OBJECTS = directproduct5.$(OBJEXT)
+directproduct5_OBJECTS = $(am_directproduct5_OBJECTS)
+directproduct5_LDADD = $(LDADD)
+directproduct5_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_directproduct6_OBJECTS = directproduct6.$(OBJEXT)
+directproduct6_OBJECTS = $(am_directproduct6_OBJECTS)
+directproduct6_LDADD = $(LDADD)
+directproduct6_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_partiallyreducedproduct1_OBJECTS =  \
+	partiallyreducedproduct1.$(OBJEXT)
+partiallyreducedproduct1_OBJECTS =  \
+	$(am_partiallyreducedproduct1_OBJECTS)
+partiallyreducedproduct1_LDADD = $(LDADD)
+partiallyreducedproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_partiallyreducedproduct2_OBJECTS =  \
+	partiallyreducedproduct2.$(OBJEXT)
+partiallyreducedproduct2_OBJECTS =  \
+	$(am_partiallyreducedproduct2_OBJECTS)
+partiallyreducedproduct2_LDADD = $(LDADD)
+partiallyreducedproduct2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_partiallyreducedproduct3_OBJECTS =  \
+	partiallyreducedproduct3.$(OBJEXT)
+partiallyreducedproduct3_OBJECTS =  \
+	$(am_partiallyreducedproduct3_OBJECTS)
+partiallyreducedproduct3_LDADD = $(LDADD)
+partiallyreducedproduct3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_partiallyreducedproduct4_OBJECTS =  \
+	partiallyreducedproduct4.$(OBJEXT)
+partiallyreducedproduct4_OBJECTS =  \
+	$(am_partiallyreducedproduct4_OBJECTS)
+partiallyreducedproduct4_LDADD = $(LDADD)
+partiallyreducedproduct4_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(directproduct1_SOURCES) $(directproduct2_SOURCES) \
+	$(directproduct3_SOURCES) $(directproduct4_SOURCES) \
+	$(directproduct5_SOURCES) $(directproduct6_SOURCES) \
+	$(partiallyreducedproduct1_SOURCES) \
+	$(partiallyreducedproduct2_SOURCES) \
+	$(partiallyreducedproduct3_SOURCES) \
+	$(partiallyreducedproduct4_SOURCES)
+DIST_SOURCES = $(directproduct1_SOURCES) $(directproduct2_SOURCES) \
+	$(directproduct3_SOURCES) $(directproduct4_SOURCES) \
+	$(directproduct5_SOURCES) $(directproduct6_SOURCES) \
+	$(partiallyreducedproduct1_SOURCES) \
+	$(partiallyreducedproduct2_SOURCES) \
+	$(partiallyreducedproduct3_SOURCES) \
+	$(partiallyreducedproduct4_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+directproduct1_SOURCES = directproduct1.cc
+directproduct2_SOURCES = directproduct2.cc
+directproduct3_SOURCES = directproduct3.cc
+directproduct4_SOURCES = directproduct4.cc
+directproduct5_SOURCES = directproduct5.cc
+directproduct6_SOURCES = directproduct6.cc
+partiallyreducedproduct1_SOURCES = partiallyreducedproduct1.cc
+partiallyreducedproduct2_SOURCES = partiallyreducedproduct2.cc
+partiallyreducedproduct3_SOURCES = partiallyreducedproduct3.cc
+partiallyreducedproduct4_SOURCES = partiallyreducedproduct4.cc
+MOSTLYCLEANFILES = 
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Partially_Reduced_Product/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Partially_Reduced_Product/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+directproduct1$(EXEEXT): $(directproduct1_OBJECTS) $(directproduct1_DEPENDENCIES) 
+	@rm -f directproduct1$(EXEEXT)
+	$(CXXLINK) $(directproduct1_OBJECTS) $(directproduct1_LDADD) $(LIBS)
+directproduct2$(EXEEXT): $(directproduct2_OBJECTS) $(directproduct2_DEPENDENCIES) 
+	@rm -f directproduct2$(EXEEXT)
+	$(CXXLINK) $(directproduct2_OBJECTS) $(directproduct2_LDADD) $(LIBS)
+directproduct3$(EXEEXT): $(directproduct3_OBJECTS) $(directproduct3_DEPENDENCIES) 
+	@rm -f directproduct3$(EXEEXT)
+	$(CXXLINK) $(directproduct3_OBJECTS) $(directproduct3_LDADD) $(LIBS)
+directproduct4$(EXEEXT): $(directproduct4_OBJECTS) $(directproduct4_DEPENDENCIES) 
+	@rm -f directproduct4$(EXEEXT)
+	$(CXXLINK) $(directproduct4_OBJECTS) $(directproduct4_LDADD) $(LIBS)
+directproduct5$(EXEEXT): $(directproduct5_OBJECTS) $(directproduct5_DEPENDENCIES) 
+	@rm -f directproduct5$(EXEEXT)
+	$(CXXLINK) $(directproduct5_OBJECTS) $(directproduct5_LDADD) $(LIBS)
+directproduct6$(EXEEXT): $(directproduct6_OBJECTS) $(directproduct6_DEPENDENCIES) 
+	@rm -f directproduct6$(EXEEXT)
+	$(CXXLINK) $(directproduct6_OBJECTS) $(directproduct6_LDADD) $(LIBS)
+partiallyreducedproduct1$(EXEEXT): $(partiallyreducedproduct1_OBJECTS) $(partiallyreducedproduct1_DEPENDENCIES) 
+	@rm -f partiallyreducedproduct1$(EXEEXT)
+	$(CXXLINK) $(partiallyreducedproduct1_OBJECTS) $(partiallyreducedproduct1_LDADD) $(LIBS)
+partiallyreducedproduct2$(EXEEXT): $(partiallyreducedproduct2_OBJECTS) $(partiallyreducedproduct2_DEPENDENCIES) 
+	@rm -f partiallyreducedproduct2$(EXEEXT)
+	$(CXXLINK) $(partiallyreducedproduct2_OBJECTS) $(partiallyreducedproduct2_LDADD) $(LIBS)
+partiallyreducedproduct3$(EXEEXT): $(partiallyreducedproduct3_OBJECTS) $(partiallyreducedproduct3_DEPENDENCIES) 
+	@rm -f partiallyreducedproduct3$(EXEEXT)
+	$(CXXLINK) $(partiallyreducedproduct3_OBJECTS) $(partiallyreducedproduct3_LDADD) $(LIBS)
+partiallyreducedproduct4$(EXEEXT): $(partiallyreducedproduct4_OBJECTS) $(partiallyreducedproduct4_DEPENDENCIES) 
+	@rm -f partiallyreducedproduct4$(EXEEXT)
+	$(CXXLINK) $(partiallyreducedproduct4_OBJECTS) $(partiallyreducedproduct4_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct6.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partiallyreducedproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partiallyreducedproduct2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partiallyreducedproduct3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partiallyreducedproduct4.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Partially_Reduced_Product/directproduct1.cc b/tests/Partially_Reduced_Product/directproduct1.cc
new file mode 100644
index 0000000..b9f6536
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct1.cc
@@ -0,0 +1,606 @@
+/* Test Direct_Product<NNC_Polyhedron, Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+// #define PH_IS_FIRST
+
+// ONE AND ONLY ONE OF THESE MUST BE 1
+#define NNC_Poly_Class 1
+#define C_Poly_Class 0
+#define BD_Shape_Class 0
+#define Octagonal_Shape_Class 0
+#define Box_Class 0
+
+#if Box_Class
+typedef TBox Poly;
+#endif
+
+#if Octagonal_Shape_Class
+typedef TOctagonal_Shape Poly;
+#endif
+
+#if BD_Shape_Class
+typedef TBD_Shape Poly;
+#endif
+
+#if NNC_Poly_Class
+typedef NNC_Polyhedron Poly;
+#endif
+
+#if C_Poly_Class
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product Product;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product Product;
+#endif
+
+namespace {
+
+// Universe product in 0 dimensions
+bool
+test01() {
+  Product dp1;
+
+  Product dp2(0, UNIVERSE);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Empty product(dims, type)
+bool
+test02() {
+  Product dp1(3);
+
+  Product dp2(3, EMPTY);
+
+  bool ok = (dp1 != dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(cgs), add_congruence(cg)
+bool
+test03() {
+  Variable A(0);
+
+  const Congruence_System cgs((A %= 0) / 4);
+
+  Product dp1(cgs);
+
+  Product dp2(1);
+  dp2.add_congruence((A %= 0) / 4);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_constraints(dp1.minimized_constraints(), "*** dp1 minimized_constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(cgs), domain1(), domain2()
+bool
+test04() {
+  Variable A(0);
+
+  Congruence_System cgs((A %= 0) / 4);
+
+  Product dp(cgs);
+
+  Poly known_ph(1);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 4);
+
+#ifdef PH_IS_FIRST
+  bool ok = (dp.domain2() == known_gr
+	     && dp.domain1() == known_ph);
+#else
+  bool ok = (dp.domain1() == known_gr
+	     && dp.domain2() == known_ph);
+#endif
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// Product(cs), add_constraint(c)
+bool
+test05() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+
+  Product dp1(cs);
+
+  Product dp2(1);
+  dp2.add_constraint(static_cast<const Constraint>(A >= 0));
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(cs), add_congruence(c)
+bool
+test06() {
+  Variable A(0);
+
+  Constraint_System cs(A == 9);
+
+  Product dp1(cs);
+
+  Product dp2(1);
+  dp2.add_constraint(A == 9);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A == 9);
+
+#ifdef PH_IS_FIRST
+  bool ok = (dp1 == dp2 && dp1.domain2() == known_gr);
+#else
+  bool ok = (dp1 == dp2 && dp1.domain1() == known_gr);
+#endif
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(bounding_box)
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*B >= 2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(A <= 2);
+
+  Product dp(box);
+
+  Product known_dp(2);
+  known_dp.add_constraint(3*B >= 2);
+  known_dp.add_constraint(A == 2);
+
+  bool ok = (dp == known_dp) && dp.OK();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// FIXME: Waiting for covering box methods, details in
+//        Direct_Product.defs.hh.
+#if 0
+// Product(covering_box)
+bool
+test08() {
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(3*B >= 2);
+  box.add_constraint(3*B <= 3);
+
+  Product dp(box, From_Covering_Box());
+
+  Product known_dp(2);
+  known_dp.add_congruence(3*B %= 0);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+#endif
+
+// operator=
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A + B <= 9);
+
+  Product dp1(cs);
+  dp1.add_congruence((A %= 9) / 19);
+
+  Product dp2 = dp1;
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Copy constructor.
+bool
+test10() {
+  Variable A(0);
+  Variable B(2);
+
+  Constraint_System cs(A - B == 0);
+
+  Product dp1(cs);
+
+  Product dp2(dp1);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// congruences()
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence(A %= 9);
+  dp.add_congruence(B + C %= 3);
+
+  Congruence_System cgs;
+  cgs.insert(B + C %= 0);
+  cgs.insert(A %= 0);
+
+  Grid known_gr(cgs);
+
+  Grid gr(dp.congruences());
+
+  bool ok = gr == known_gr;
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// minimized_congruences()
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence(B + C %= 3);
+  dp.add_constraint(A >= 9);
+  dp.add_constraint(A <= 9);
+
+  Congruence_System cgs;
+  cgs.insert(B + C %= 3);
+  cgs.insert(A == 9);
+
+  Grid known_gr(cgs);
+
+  Grid gr(dp.minimized_congruences());
+
+  bool ok = gr == known_gr;
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// constraints()
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence((B + C %= 3) / 0);
+#if NNC_Poly_Class
+  dp.add_constraint(A > 9);
+#else
+  dp.add_constraint(A >= 9);
+#endif
+  dp.add_constraint(A <= 11);
+
+  Poly ph(dp.space_dimension());
+  ph.add_constraints(dp.constraints());
+
+  Poly known_ph(dp.space_dimension());
+  known_ph.add_constraint(B + C == 3);
+  known_ph.add_constraint(A <= 11);
+#if NNC_Poly_Class
+  known_ph.add_constraint(A > 9);
+#else
+  known_ph.add_constraint(A >= 9);
+#endif
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// minimized_constraints()
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence((B + C %= 3) / 0);
+#if NNC_Poly_Class
+  dp.add_constraint(A > 9);
+#else
+  dp.add_constraint(A >= 9);
+#endif
+  dp.add_constraint(A <= 11);
+
+  Poly ph(dp.space_dimension());
+  ph.add_constraints(dp.minimized_constraints());
+
+  Poly known_ph(dp.space_dimension());
+  known_ph.add_constraint(B + C == 3);
+#if NNC_Poly_Class
+  known_ph.add_constraint(A > 9);
+#else
+  known_ph.add_constraint(A >= 9);
+#endif
+  known_ph.add_constraint(A <= 11);
+
+  bool ok = (ph == known_ph);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// Product(c_polyhedron).
+bool
+test15() {
+  Variable A(0);
+
+  const Constraint_System cs(A == 0);
+
+  C_Polyhedron ph(cs);
+
+  Product dp1(ph);
+
+  Product dp2(1);
+  dp2.add_congruence((A %= 0) / 0);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(nnc_polyhedron).
+bool
+test16() {
+  Variable A(0);
+
+#if NNC_Poly_Class
+  const Constraint_System cs(A > 0);
+#else
+  const Constraint_System cs(A >= 0);
+#endif
+
+  NNC_Polyhedron ph(cs);
+
+  Product dp1(ph);
+
+  Product dp2(1);
+#if NNC_Poly_Class
+  dp2.add_constraint(A > 0);
+#else
+  dp2.add_constraint(A >= 0);
+#endif
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(grid).
+bool
+test17() {
+  Variable A(0);
+
+  const Congruence_System cgs(A %= 0);
+
+  Grid gr(cgs);
+
+  Product dp1(gr);
+
+  Product dp2(1);
+  dp2.add_congruence((A %= 0) / 1);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(box).
+bool
+test18() {
+  Variable A(0);
+
+  const Constraint_System cs(A > 0);
+
+  TBox box(cs);
+
+  Product dp1(box);
+
+  Product dp2(1);
+  dp2.add_constraint(A > 0);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(bds).
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A >= 0);
+  cs.insert(2*A - 2*B >= 5);
+
+  TBD_Shape bd(cs);
+
+  Product dp1(bd);
+
+  Product dp2(2);
+  dp2.add_constraint(A >= 0);
+  dp2.add_constraint(2*A - 2*B >= 5);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Product(os).
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A >= 0);
+  cs.insert(2*A + 2*B >= 5);
+
+  TOctagonal_Shape os(cs);
+
+  Product dp1(os);
+
+  Product dp2(2);
+  dp2.add_constraint(A >= 0);
+  dp2.add_constraint(2*A + 2*B >= 5);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+//  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct2.cc b/tests/Partially_Reduced_Product/directproduct2.cc
new file mode 100644
index 0000000..359c78f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct2.cc
@@ -0,0 +1,505 @@
+/* Test Direct_Product<NNC_Polyhedron, Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#define PH_IS_FIRST
+
+// ONE AND ONLY ONE OF THESE MUST BE 1
+#define NNC_Poly_Class 1
+#define C_Poly_Class 0
+#define BD_Shape_Class 0
+#define Octagonal_Shape_Class 0
+#define Box_Class 0
+
+#if Box_Class
+typedef TBox Poly;
+#endif
+
+#if Octagonal_Shape_Class
+typedef TOctagonal_Shape Poly;
+#endif
+
+#if BD_Shape_Class
+typedef BD_Shape<mpq_class> Poly;
+#endif
+
+#if NNC_Poly_Class
+typedef NNC_Polyhedron Poly;
+#endif
+
+#if C_Poly_Class
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product Product;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product Product;
+#endif
+
+namespace {
+
+// is_empty() where both domain objects have points.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence(A %= 9);
+  dp.add_congruence(B + C %= 3);
+
+  bool ok = !dp.is_empty();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_empty() where one domain object is empty.
+bool
+test02() {
+  Variable A(0);
+
+  Product dp(3);
+
+  dp.add_congruence((A %= 0) / 2);
+  dp.add_congruence((A %= 1) / 2);
+
+  bool ok = dp.is_empty();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_empty() where both domain objects are empty.
+bool
+test03() {
+  Variable A(0);
+
+  Product dp(3);
+  dp.add_constraint(A == 1);
+  dp.add_constraint(A == 3);
+
+  bool ok = dp.is_empty();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_universe() where both domain objects are empty.
+bool
+test04() {
+  Product dp(3, EMPTY);
+
+  bool ok = !dp.is_universe();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_universe() where one domain object is universe.
+bool
+test05() {
+  Variable A(0);
+
+  Product dp(3);
+  dp.add_congruence((A %= 0) / 2);
+  dp.add_congruence((A %= 1) / 2);
+
+  bool ok = !dp.is_universe();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_universe() where both domain objects are universe.
+bool
+test06() {
+  Product dp(3);
+
+  bool ok = dp.is_universe();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+#if !Box_Class
+// is_topologically_closed() where the NNC Polyhedron is topologically
+// open.
+bool
+test07() {
+  Variable A(0);
+
+  Product dp(3);
+#if NNC_Poly_Class
+  dp.add_constraint(A < 3);
+#else
+  dp.add_constraint(A <= 3);
+#endif
+  dp.add_congruence((A %= 0) / 3);
+
+#if NNC_Poly_Class
+  bool ok = !dp.is_topologically_closed();
+#else
+  bool ok = dp.is_topologically_closed();
+#endif
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_topologically_closed() where the Polyhedron is topologically
+// closed.
+bool
+test08() {
+  Variable A(0);
+
+  Product dp(3);
+  dp.add_constraint(A <= 3);
+  dp.add_congruence((A %= 0) / 3);
+
+  bool ok = dp.is_topologically_closed();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_topologically_closed() where the Polyhedron is topologically
+// open and the intersection is closed.
+bool
+test09() {
+  Variable A(0);
+
+  Product dp(3);
+  dp.add_congruence((A %= 0) / 4);
+#if NNC_Poly_Class
+  dp.add_constraint(A < 3);
+
+  bool ok = !dp.is_topologically_closed();
+#else
+  dp.add_constraint(A <= 3);
+
+  bool ok = dp.is_topologically_closed();
+#endif
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+#endif
+
+// is_disjoint_from(dp), due to the Polyhedra.
+bool
+test10() {
+  Variable B(1);
+
+  Product dp1(12);
+  Product dp2(12);
+#if NNC_Poly_Class
+  dp1.add_constraint(B < 3);
+  dp2.add_constraint(B > 3);
+  bool ok = dp1.is_disjoint_from(dp2);
+#else
+  dp1.add_constraint(B <= 3);
+  dp2.add_constraint(B >= 4);
+  bool ok = dp1.is_disjoint_from(dp2);
+#endif
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(dp), due to the Grids.
+bool
+test11() {
+  Variable A(0);
+
+  Product dp1(3);
+  dp1.add_congruence((A %= 0) / 7);
+
+  Product dp2(3);
+  dp2.add_congruence((A %= 1) / 7);
+
+  bool ok = dp1.is_disjoint_from(dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(dp), due to either.
+bool
+test12() {
+  Variable A(0);
+
+  Product dp1(3);
+  dp1.add_congruence((A %= 0) / 7);
+  Product dp2(3);
+  dp2.add_congruence((A %= 1) / 7);
+#if NNC_Poly_Class
+  dp1.add_constraint(A < 3);
+  dp2.add_constraint(A > 3);
+
+  bool ok = dp1.is_disjoint_from(dp2);
+#else
+  dp1.add_constraint(A <= 2);
+  dp2.add_constraint(A >= 4);
+
+  bool ok = dp1.is_disjoint_from(dp2);
+#endif
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(dp), due to both.
+bool
+test13() {
+  Variable A(0);
+
+  Product dp1(3);
+  dp1.add_congruence((A %= 1) / 7);
+  Product dp2(3);
+  dp2.add_congruence((A %= 1) / 14);
+#if NNC_Poly_Class
+  dp1.add_constraint(A < 6);
+  dp2.add_constraint(A > 3);
+
+  bool ok = !dp1.is_disjoint_from(dp2);
+#else
+  dp1.add_constraint(A <= 6);
+  dp2.add_constraint(A >= 3);
+
+  bool ok = !dp1.is_disjoint_from(dp2);
+#endif
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(dp), due to the intersection of the entire direct
+// products (i.e. the dp1 and dp2 polyhedron components intersect, as
+// do the grid components).
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp1(2);
+  dp1.add_constraint(A <= 4);
+  dp1.add_constraint(A >= 0);
+  dp1.add_constraint(A - B <= 0);
+  dp1.add_constraint(A - B >= 2);
+  dp1.add_congruence((A %= 0) / 2);
+  dp1.add_congruence((A %= 0) / 4);
+
+  Product dp2(2);
+  dp2.add_constraint(A <= 4);
+  dp2.add_constraint(A <= 0);
+  dp2.add_constraint(A + B >= 4);
+  dp2.add_constraint(A + B <= 6);
+  // Same grid as dp1.
+  dp2.add_congruence((A %= 0) / 2);
+  dp2.add_congruence((A %= 0) / 4);
+
+#if Box_Class
+  bool ok = !dp1.is_disjoint_from(dp2);
+#else
+  bool ok = dp1.is_disjoint_from(dp2);
+#endif
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// is_discrete(), due to grid.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(A == 1);
+  dp.add_constraint(B == 2);
+  dp.add_constraint(C <= 3);
+  dp.add_congruence((C %= 0) / 3);
+
+  bool ok = dp.is_discrete();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_discrete(), due to polyhedron.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(A <= 3);
+  dp.add_constraint(A >= 3);
+  dp.add_constraint(B == 0);
+
+  bool ok = dp.is_discrete();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_discrete() is false, as the components are not discrete
+// although the intersection is discrete..
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(3);
+  dp.add_congruence((A - B %= 0) / 0);
+  dp.add_constraint(B >= 0);
+  dp.add_constraint(B <= 0);
+
+  bool ok = !dp.is_discrete();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_bounded(), due to polyhedron.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_congruence((A %= 1) / 3);
+#if NNC_Poly_Class
+  dp.add_constraint(A > 1);
+  dp.add_constraint(A < 4);
+  dp.add_constraint(B > 1);
+  dp.add_constraint(B < 4);
+#else
+  dp.add_constraint(A >= 1);
+  dp.add_constraint(A <= 4);
+  dp.add_constraint(B >= 1);
+  dp.add_constraint(B <= 4);
+#endif
+
+  bool ok = dp.is_bounded();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// is_bounded(), due to grid.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_congruence((A %= 0) / 0);
+  dp.add_congruence((B %= 0) / 0);
+  dp.add_constraint(B <= 0);
+
+  bool ok = dp.is_bounded();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+#if !Box_Class
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+#endif
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct3.cc b/tests/Partially_Reduced_Product/directproduct3.cc
new file mode 100644
index 0000000..518247e
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct3.cc
@@ -0,0 +1,793 @@
+/* Test Direct_Product<NNC_Polyhedron, Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define PH_IS_FIRST
+
+// ONE AND ONLY ONE OF THESE MUST BE 1
+#define NNC_Poly_Class 1
+#define C_Poly_Class 0
+#define BD_Shape_Class 0
+#define Octagonal_Shape_Class 0
+#define Box_Class 0
+
+#if Box_Class
+typedef TBox Poly;
+#endif
+
+#if Octagonal_Shape_Class
+typedef TOctagonal_Shape Poly;
+#endif
+
+#if BD_Shape_Class
+typedef BD_Shape<mpq_class> Poly;
+#endif
+
+#if NNC_Poly_Class
+typedef NNC_Polyhedron Poly;
+#endif
+
+#if C_Poly_Class
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product Product;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product Product;
+#endif
+
+namespace {
+
+// space_dimension()
+bool
+test01() {
+  Variable A(0);
+  Variable E(4);
+
+#if NNC_Poly_Class
+  Constraint_System cs(A + E < 9);
+#else
+  Constraint_System cs(A + E <= 9);
+#endif
+
+  Product dp(cs);
+
+  bool ok = (dp.space_dimension() == 5);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+
+// affine_dimension()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+#if Box_Class
+  dp.add_constraint(A <= 9);
+  dp.add_constraint(A >= 9);
+#else
+  dp.add_constraint(A - C >= 9);
+  dp.add_constraint(A - C <= 9);
+#endif
+  dp.add_constraint(B >= 2);
+
+  bool ok;
+
+#ifdef PH_IS_FIRST
+  ok = (dp.domain2().affine_dimension() == 3
+	&& dp.domain1().affine_dimension() == 2);
+#else
+  ok = (dp.domain1().affine_dimension() == 2
+	&& dp.domain2().affine_dimension() == 3);
+#endif
+  ok = (ok && dp.affine_dimension() == 2);
+
+  if (!ok)
+    return false;
+
+  dp.add_constraint(C == 4);
+  dp.add_constraint(B == 2);
+
+#ifdef PH_IS_FIRST
+  ok = (dp.domain2().affine_dimension() == 1
+	&& dp.domain1().affine_dimension() == 0);
+#else
+  ok = (dp.domain1().affine_dimension() == 1
+	&& dp.domain2().affine_dimension() == 0);
+#endif
+
+  ok &= (ok && dp.affine_dimension() == 0);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// contains()
+bool
+test03() {
+  Variable A(0);
+
+  Product dp1(1);
+  dp1.add_constraint(A <= 3);
+  dp1.add_congruence((A %= 3) / 2);
+
+  Product dp2(1);
+  dp2.add_constraint(A <= 3);
+  dp2.add_congruence(A %= 3);
+
+  bool ok1 = !dp1.contains(dp2);
+
+  dp2.add_congruence((A %= 1) / 4);
+
+  bool ok2 = dp1.contains(dp2);
+
+  dp1.add_congruence((A == 1) / 0);
+  dp2.add_constraint(A <= 2);
+  dp2.add_constraint(A >= -1);
+  dp2.add_congruence((A %= 1) / 3);
+
+  bool ok3 = !dp1.contains(dp2);
+
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp1, "*** dp1 congruences ***");
+
+  return ok1 && ok2 && ok3;
+}
+
+// strictly_contains()
+bool
+test04() {
+  Variable A(0);
+
+  Product dp1(1);
+  dp1.add_constraint(A <= 2);
+  dp1.add_congruence(A %= 0);
+
+  Product dp2(1);
+  dp2.add_constraint(A <= 1);
+  dp2.add_congruence(A %= 0);
+
+  bool ok1 = dp1.strictly_contains(dp2);
+
+  dp1.add_constraint(A <= 1);
+  dp2.add_congruence((A %= 1) /2);
+
+  bool ok2 = dp1.strictly_contains(dp2);
+
+  dp1.add_congruence((A %= 1) /2);
+
+  bool ok3 = !dp1.strictly_contains(dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok1 && ok2 && ok3;
+}
+
+// FIXME: Waiting for covering box methods, details in
+//        Direct_Product.defs.hh.
+#if 0
+// get_covering_box(box), via grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(1);
+
+  Product dp(1);
+  dp.add_congruence((A %= 0) / 3);
+
+  dp.get_covering_box(box);
+
+  Rational_Box known_box(1);
+  known_box.add_constraint(A >= 0);
+  known_box.add_constraint(A <= 3);
+
+  bool ok = (box == known_box);
+
+  Rational_Box box1(1);
+
+  Product dp1(2);
+  dp1.add_constraint(B < 3);
+  dp1.add_constraint(B > 0);
+
+  dp1.get_covering_box(box1);
+
+  Rational_Box known_box1(1);
+  known_box1.add_constraint(B == 0 /* FIX */);
+
+  bool ok1 = (box1 == known_box1);
+
+  Rational_Box box2(2);
+
+  Product dp2(2);
+  dp2.add_constraint(B <= 0);
+  dp2.add_constraint(B >= 0);
+  dp2.add_congruence(A - B %= 0);
+
+  dp2.get_covering_box(box2);
+
+  Rational_Box known_box2(2);
+  known_box2.add_constraint(A >= 0);
+  known_box2.add_constraint(A <= 1);
+
+  bool ok2 = !(box2 == known_box2);
+
+  return ok && ok1 && ok2;
+}
+#endif
+
+// intersection_assign()
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp1(3);
+  dp1.add_constraint(A >= 0);
+  dp1.add_congruence((A %= 0) / 2);
+
+  Product dp2(3);
+  dp2.add_constraint(A <= 0);
+  dp2.add_congruence((A %= 0) / 7);
+
+  dp1.intersection_assign(dp2);
+
+  Product known_dp(3);
+  known_dp.add_congruence((A %= 0) / 14);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_constraint(A <= 0);
+
+  bool ok = (dp1 == known_dp);
+
+  if (!ok) {
+    print_congruences(dp1, "*** dp1 congruences ***");
+    print_constraints(dp1, "*** dp1 constraints ***");
+    print_congruences(dp2, "*** dp2 congruences ***");
+    print_constraints(dp2, "*** dp2 constraints ***");
+    return ok;
+  }
+
+  dp1.add_constraint(B <= 1);
+  dp2.add_constraint(B >= 1);
+  dp1.intersection_assign(dp2);
+  ok = !dp1.is_empty();
+
+  if (!ok) {
+    print_congruences(dp1, "*** dp1 congruences ***");
+    print_constraints(dp1, "*** dp1 constraints ***");
+    print_congruences(dp2, "*** dp2 congruences ***");
+    print_constraints(dp2, "*** dp2 constraints ***");
+    return ok;
+  }
+
+  dp2.add_constraint(B >= 2);
+  dp1.intersection_assign(dp2);
+  ok = dp1.is_empty();
+
+  if (!ok) {
+    print_congruences(dp1, "*** dp1 congruences ***");
+    print_constraints(dp1, "*** dp1 constraints ***");
+    print_congruences(dp2, "*** dp2 congruences ***");
+    print_constraints(dp2, "*** dp2 constraints ***");
+  }
+
+  return ok;
+}
+
+// upper_bound_assign(dp2)
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A == 9);
+
+  Product dp1(cs);
+
+  Product dp2(1);
+  dp2.add_constraint(A == 19);
+
+  dp1.upper_bound_assign(dp2);
+
+  Product known_dp(1);
+  known_dp.add_constraint(A >= 9);
+  known_dp.add_constraint(A <= 19);
+  known_dp.add_congruence((A %= 9) / 10);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp1(3);
+  dp1.add_constraint(B == 0);
+
+  Product dp2(3);
+  dp2.add_constraint(B == 0);
+  dp2.add_constraint(A == 12);
+  dp2.add_constraint(A == 16);
+
+  dp1.upper_bound_assign_if_exact(dp2);
+
+  Product known_dp(3);
+  known_dp.add_constraint(B == 0);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// difference_assign()
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp1(3);
+  dp1.add_constraint(A >= 0);
+  dp1.add_congruence((A - B %= 0) / 2);
+
+  Product dp2(3);
+  dp2.add_constraint(A >= 3);
+  dp2.add_congruence((A - B %= 0) / 4);
+
+  dp1.difference_assign(dp2);
+
+  Product known_dp(3);
+  known_dp.add_constraint(A >= 0);
+#if NNC_Poly_Class
+  known_dp.add_constraint(A < 3);
+#else
+#if !Box_Class
+// FIXME Box class returns the box unchanged.
+  known_dp.add_constraint(A <= 3);
+#endif
+#endif
+  known_dp.add_congruence((A - B %= 2) / 4);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1 ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2,  "*** dp2 ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// add_space_dimensions_and_embed()
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp1(2);
+  dp1.add_constraint(A >= 0);
+  dp1.add_congruence((A %= 0) / 2);
+
+  dp1.add_space_dimensions_and_embed(3);
+
+  Product known_dp(5);
+  known_dp.add_congruence((A %= 0) / 2);
+  known_dp.add_constraint(A >= 0);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+
+  return ok;
+}
+
+// add_space_dimensions_and_project()
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp1(2);
+  dp1.add_constraint(A >= 0);
+  dp1.add_congruence((A %= 0) / 2);
+
+  dp1.add_space_dimensions_and_project(1);
+
+  Product known_dp(3);
+  known_dp.add_congruence((A %= 0) / 2);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_constraint(C == 0);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+
+  return ok;
+}
+
+// concatenate_assign()
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Product dp1(2);
+  dp1.add_constraint(A >= 0);
+  dp1.add_congruence((A %= 0) / 2);
+
+  Product dp2(2);
+  dp2.add_constraint(A <= 1);
+  dp2.add_constraint(B >= 0);
+
+  dp1.concatenate_assign(dp2);
+
+  Product known_dp(4);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_congruence((A %= 0) / 2);
+  known_dp.add_constraint(C <= 1);
+  known_dp.add_constraint(D >= 0);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok;
+}
+
+// remove_space_dimensions()
+bool
+test13() {
+  Variable A(0);
+  Variable C(2);
+  Variable D(3);
+
+  Product dp(4);
+  dp.add_constraint(A >= 0);
+  dp.add_congruence((A %= 0) / 2);
+  dp.add_congruence((A - C %= 0) / 2);
+
+  Variables_Set vars;
+  vars.insert(C);
+  vars.insert(D);
+
+  dp.remove_space_dimensions(vars);
+
+  Product known_dp(2);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_congruence((A %= 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp ***");
+
+  return ok;
+}
+
+// remove_higher_space_dimensions()
+bool
+test14() {
+  Variable A(0);
+  Variable C(2);
+  Variable D(3);
+
+  Product dp(4);
+  dp.add_constraint(A >= 0);
+  dp.add_congruence((A %= 0) / 2);
+  dp.add_congruence((A - C %= 0) / 2);
+
+  dp.remove_higher_space_dimensions(2);
+
+  Product known_dp(2);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_congruence((A %= 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// map_space_dimensions()
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(A >= 0);
+  dp.add_congruence((A - B %= 0) / 2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  dp.map_space_dimensions(function);
+
+  Product known_dp(2);
+  known_dp.add_constraint(B >= 0);
+  known_dp.add_congruence((B - A %= 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// expand_space_dimension()
+bool
+  test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Product dp(3);
+  dp.add_congruence((A + B %= 2) / 7);
+  dp.add_constraint(A >= 0);
+
+  dp.expand_space_dimension(A, 1);
+
+  Product known_dp(4);
+  known_dp.add_congruence((A + B %= 2) / 7);
+  known_dp.add_congruence((D + B %= 2) / 7);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_constraint(D >= 0);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// fold_space_dimensions()
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence((A %= 2) / 7);
+  dp.add_congruence((B %= 2) / 14);
+  dp.add_congruence((C %= 2) / 21);
+  dp.add_constraint(A <= 5);
+  dp.add_constraint(B <= 10);
+  dp.add_constraint(C <= 0);
+  dp.add_constraint(C >= 0);
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(C);
+
+  dp.fold_space_dimensions(to_fold, B);
+
+  Product known_dp(1);
+  known_dp.add_congruence((A %= 2) / 7);
+  known_dp.add_constraint(A <= 10);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// time_elapse_assign(y)
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp1(3);
+  dp1.add_constraint(A >= 0);
+  dp1.add_constraint(B >= 0);
+  dp1.add_constraint(A + B >= 3);
+  dp1.add_constraint(2*A - B == 0);
+  dp1.add_constraint(3*A + C == 0);
+  dp1.add_congruence(3*A %= 0);
+
+  Product dp2(3);
+  dp2.add_constraint(7*C == 4);
+  dp2.add_constraint(7*B == -1);
+  dp2.add_constraint(7*A == 3);
+
+  dp1.time_elapse_assign(dp2);
+
+  Product known_dp(3);
+  known_dp.add_constraint(5*A - 13*B - 7*C == 0);
+  known_dp.add_constraint(3*A + C >= 0);
+  known_dp.add_constraint(A + B >= 3);
+  known_dp.add_constraint(4*A - 3*C >= 13);
+  known_dp.add_congruence((65*A - B %= 0) / 7);
+  known_dp.add_congruence(21*A %= 0);
+  known_dp.add_constraint(A >= 0);
+
+  bool ok = (dp1 == known_dp);
+
+  print_congruences(dp1, "*** dp1.time_elapse_assign(dp1) congruences ***");
+  print_constraints(dp1, "*** dp1.time_elapse_assign(dp1) constraints ***");
+  print_congruences(dp2, "*** dp2.time_elapse_assign(dp2) congruences ***");
+  print_constraints(dp2, "*** dp2.time_elapse_assign(dp2) constraints ***");
+
+  return ok;
+}
+
+// topological_closure_assign
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(B >= 0);
+  dp.add_constraint(3*A + C == 0);
+  dp.add_constraint(2*A - B == 0);
+  dp.add_congruence(3*A %= 0);
+#if NNC_Poly_Class
+  dp.add_constraint(A > 0);
+#else
+  dp.add_constraint(A >= 0);
+#endif
+
+#if !Box_Class
+  dp.topological_closure_assign();
+#endif
+
+  Product known_dp(3);
+  known_dp.add_constraint(B >= 0);
+  known_dp.add_constraint(3*A + C == 0);
+  known_dp.add_constraint(2*A - B == 0);
+  known_dp.add_congruence(3*A %= 0);
+  known_dp.add_constraint(A >= 0);
+
+  bool ok = (dp.is_topologically_closed() && dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// widening_assign
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp_prev(3);
+  dp_prev.add_constraint(C == 0);
+  dp_prev.add_constraint(A - B >= 1);
+  dp_prev.add_constraint(A <= 2);
+  dp_prev.add_constraint(B >= 0);
+  dp_prev.add_congruence((B %= 0) / 2);
+  dp_prev.add_congruence(3*A %= 0);
+
+  print_congruences(dp_prev, "*** dp_prev congruences ***");
+  print_constraints(dp_prev, "*** dp_prev constraints ***");
+
+  Product dp(3);
+  dp.add_constraint(C == 0);
+  dp.add_constraint(A <= 2);
+  dp.add_constraint(B >= 0);
+  dp.add_constraint(2*A - B >= 2);
+  dp.add_constraint(B >= 0);
+  dp.add_congruence(6*A %= 0);
+  dp.add_congruence((B %= 0) / 2);
+
+  dp.upper_bound_assign(dp_prev);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  dp.widening_assign(dp_prev);
+
+  Product known_dp(3);
+  known_dp.add_constraint(C == 0);
+  known_dp.add_constraint(A <= 2);
+  known_dp.add_constraint(B >= 0);
+  known_dp.add_congruence((B %= 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp.widening_assign(dp_prev) congruences ***");
+  print_constraints(dp, "*** dp.widening_assign(dp_prev) constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+#if 0
+  DO_TEST(test05);
+#endif
+  DO_TEST(test06);
+#if C_Poly_Class
+  DO_TEST_F8A(test07);
+#else
+  DO_TEST(test07);
+#endif
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST_F8(test18);
+//  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct4.cc b/tests/Partially_Reduced_Product/directproduct4.cc
new file mode 100644
index 0000000..17db261
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct4.cc
@@ -0,0 +1,358 @@
+/* Test Direct_Product<NNC_Polyhedron, Grid>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define PH_IS_FIRST
+
+// ONE AND ONLY ONE OF THESE MUST BE 1
+#define NNC_Poly_Class 1
+#define C_Poly_Class 0
+#define BD_Shape_Class 0
+#define Octagonal_Shape_Class 0
+#define Box_Class 0
+
+#if Box_Class
+typedef TBox Poly;
+#endif
+
+#if Octagonal_Shape_Class
+typedef TOctagonal_Shape Poly;
+#endif
+
+#if BD_Shape_Class
+typedef BD_Shape<mpq_class> Poly;
+#endif
+
+#if NNC_Poly_Class
+typedef NNC_Polyhedron Poly;
+#endif
+
+#if C_Poly_Class
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product Product;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product Product;
+#endif
+
+namespace {
+
+// affine_image()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence((B %= 2) / 14);
+  dp.add_constraint(A <= 5);
+  dp.add_constraint(B <= 10);
+
+  dp.affine_image(A, B + C);
+
+  Product known_dp(3);
+  known_dp.add_congruence((B %= 2) / 14);
+  known_dp.add_constraint(A - B - C == 0);
+  known_dp.add_constraint(A - C <= 10);
+  known_dp.add_constraint(B <= 10);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// affine_preimage()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(3);
+  dp.add_constraint(A - B == 0);
+  dp.add_congruence((A %= 0) / 3);
+
+  dp.affine_preimage(A, B);
+
+  Product known_dp(3);
+  known_dp.add_congruence((B %= 0) / 3);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+#if !Box_Class
+// generalized_affine_image(v, EQUAL, e)
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(3);
+  dp.add_congruence(A %= 0);
+  dp.add_congruence((A + B %= 0) / 2);
+  dp.add_constraint(B >= 0);
+  dp.add_constraint(A - B >= 0);
+
+  Linear_Expression le(A+2);
+
+  dp.generalized_affine_image(A, EQUAL, le);
+
+  Product known_dp(3);
+  known_dp.add_congruence(A %= 0);
+  known_dp.add_congruence((A + B %= 0) / 2);
+  known_dp.add_constraint(B >= 0);
+  known_dp.add_constraint(A - B >= 2);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_image(v, EQUAL, e, d)
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(3);
+  dp.add_congruence(A %= 0);
+  dp.add_congruence((A + B %= 0) / 2);
+  dp.add_constraint(A >= 3);
+
+  dp.generalized_affine_image(B, EQUAL, A + 1, 2);
+
+  Product known_dp(3);
+  known_dp.add_constraint(A - 2*B == -1);
+  known_dp.add_congruence(A %= 0);
+  known_dp.add_constraint(A >= 3);
+  known_dp.add_constraint(B >= 2);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(v, GREATER_OR_EQUAL, e)
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(3);
+  dp.add_constraint(A >= 0);
+  dp.add_constraint(A <= 4);
+  dp.add_constraint(B <= 5);
+  dp.add_constraint(A <= B);
+  dp.add_congruence(A %= B);
+
+  dp.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2);
+
+  Product known_dp(3);
+  known_dp.add_constraint(0 <= A);
+  known_dp.add_constraint(A <= 3);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(v, EQUAL, e, d),
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence(A %= 0);
+  dp.add_congruence((B %= 0) / 2);
+
+  dp.generalized_affine_preimage(B, EQUAL, A + B, 1);
+
+  Product known_dp(3);
+  known_dp.add_congruence((A + B %= 0) / 2);
+  known_dp.add_congruence(A %= 0);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_image(lhs, relsym, rhs)
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(3);
+  dp.add_congruence(A %= 0);
+  dp.add_constraint(B >= 0);
+  dp.add_constraint(A - B >= 1);
+
+  dp.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B);
+
+  Product known_dp(3);
+  known_dp.add_congruence(A %= 0);
+  known_dp.add_constraint(B >= 0);
+  known_dp.add_constraint(A - B >= 1);
+  known_dp.add_constraint(2 <= A + B);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_image(lhs, EQUAL, rhs),
+// add_congruences(cgs)
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cs;
+  cs.insert((A %= 0) / 1);
+  cs.insert((B %= 0) / 2);
+
+  Product dp(2);
+  dp.add_congruences(cs);
+  dp.add_constraint(A <= 3);
+
+  dp.generalized_affine_image(A + 2*B, EQUAL, A - B);
+
+  Product known_dp(2);
+  known_dp.add_congruence((A + 2*B %= 0) / 1);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(lhs, relsym, rhs), add_constraints(cs)
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B <= 5);
+  cs.insert(A <= B);
+
+  Product dp(3);
+  dp.add_constraints(cs);
+  dp.add_congruence(A %= B);
+
+  dp.generalized_affine_preimage(1*B, GREATER_OR_EQUAL, A+2);
+
+  Product known_dp(3);
+  known_dp.add_constraint(0 <= A);
+  known_dp.add_constraint(A <= 3);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(lhs, EQUAL, rhs)
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(A - B == 1);
+
+  dp.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B);
+
+  Product known_dp(3);
+  known_dp.add_congruence((2*A - 2*B %= 1) / 0);
+
+#if BD_Shape_Class || Octagonal_Shape_Class
+  #ifdef PH_IS_FIRST
+    bool ok = (dp.domain2() == known_dp.domain2()
+	       && dp.domain1().is_universe());
+  #else
+    bool ok = (dp.domain1() == known_dp.domain1()
+	       && dp.domain2().is_universe());
+  #endif
+#else
+  bool ok = (dp == known_dp);
+#endif
+
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+#endif
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+#if !Box_Class
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+#endif
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct5.cc b/tests/Partially_Reduced_Product/directproduct5.cc
new file mode 100644
index 0000000..6eba0bd
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct5.cc
@@ -0,0 +1,601 @@
+/* Test Grid::congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+// ONE AND ONLY ONE OF THESE MUST BE 1
+#define NNC_Poly_Class 1
+#define C_Poly_Class 0
+#define BD_Shape_Class 0
+#define Octagonal_Shape_Class 0
+#define Box_Class 0
+
+#if Box_Class
+typedef TBox Poly;
+#endif
+
+#if Octagonal_Shape_Class
+typedef TOctagonal_Shape Poly;
+#endif
+
+#if BD_Shape_Class
+typedef BD_Shape<mpq_class> Poly;
+#endif
+
+#if NNC_Poly_Class
+typedef NNC_Polyhedron Poly;
+#endif
+
+#if C_Poly_Class
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product Product;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product Product;
+#endif
+
+namespace {
+
+// add_constraints
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 0);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_constraints(cs);
+
+  Product known_dp(2);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_constraint(B == 0);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// add_recycled_constraints
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 0);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_recycled_constraints(cs);
+
+  Product known_dp(2);
+  known_dp.add_constraint(A + B <= 0);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// add_constraints
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A + B == 0);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_constraints(cs);
+  bool ok = !dp.is_empty();
+
+  Product known_dp(2);
+  known_dp.add_constraint(A >= 0);
+  known_dp.add_constraint(A + B == 0);
+
+  ok = ok && (dp == known_dp);
+
+  return ok;
+}
+
+// add_recycled_constraints
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(A - B == 0);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_recycled_constraints(cs);
+  bool ok = !dp.is_empty();
+
+  Product known_dp(2);
+  known_dp.add_constraint(B >= 0);
+  known_dp.add_constraint(A - B == 0);
+
+  ok = ok && (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// add_congruences
+bool
+test05() {
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B == 0) / 2);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_congruences(cgs);
+
+  Product known_dp(2);
+  known_dp.add_congruence((A %= 0) / 2);
+  known_dp.add_congruence((B == 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// add_congruences
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert(A + B == 0);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_congruences(cgs);
+  bool ok = !dp.is_empty();
+
+  Product known_dp(2);
+  known_dp.add_congruence((A %= 0) / 2);
+  known_dp.add_constraint(A + B == 0);
+
+  ok = ok && (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_recycled_congruences(cgs);
+
+  Product known_dp(2);
+  known_dp.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 0) / 2);
+  cgs.insert(A - B == 0);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.add_recycled_congruences(cgs);
+  bool ok = !dp.is_empty();
+
+  Product known_dp(2);
+  known_dp.add_congruence((B %= 0) / 2);
+  known_dp.add_constraint(A - B == 0);
+
+  ok = ok &&(dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+#if !Box_Class
+// relation_with a generator
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator pnt(point(A + B));
+
+  Product dp(2);
+
+  bool ok = Poly_Gen_Relation::subsumes() == dp.relation_with(pnt);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// relation_with a constraint
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint c(A == 2);
+
+  Product dp(2);
+
+  bool ok = Poly_Con_Relation::nothing() == dp.relation_with(c);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// Empty product; relation_with a constraint.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(A == 1);
+  dp.add_congruence((A %= 2) / 0);
+
+  bool ok = (dp.relation_with(B == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates())
+	     && dp.relation_with(B >= 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+#endif
+
+#if !Octagonal_Shape_Class && !BD_Shape_Class && !Box_Class
+// A product in 3D; relation_with a constraint.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(3*A + 3*B + C == 7);
+  dp.add_constraint(3*A - C >= 2);
+  dp.add_congruence(6*A + 3*B %= 0);
+
+  Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B >= 3);
+  Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B >= 3);
+#ifdef PH_IS_FIRST
+  bool okdp1 = (rel1 == Poly_Con_Relation::is_included());
+  bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects());
+#else
+  bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+  bool okdp2 = (rel2 == Poly_Con_Relation::is_included());
+#endif
+
+  if (!okdp1 || !okdp2) {
+    nout << "dp.domain1().relation_with(2*A + B >= 3) == " << rel1 << endl;
+    nout << "dp.domain2().relation_with(2*A + B >= 3) == " << rel2 << endl;
+    print_constraints(dp, "*** dp constraints ***");
+    print_congruences(dp, "*** dp congruences ***");
+    return false;
+  }
+
+  Poly_Con_Relation rel3 = dp.relation_with(A + B + C == 0);
+  Poly_Con_Relation rel4 = dp.relation_with(A + B == 0);
+  Poly_Con_Relation rel5 = dp.relation_with(A == 0);
+  Poly_Con_Relation rel6 = dp.relation_with(Linear_Expression(0) == 0);
+  Poly_Con_Relation rel7 = dp.relation_with(2*A + B >= 3);
+  Poly_Con_Relation rel8 = dp.relation_with(3*A + 3*B + C >= 7);
+  bool ok = (rel3 == Poly_Con_Relation::nothing()
+	     && rel4 == Poly_Con_Relation::nothing()
+	     && rel5 == Poly_Con_Relation::nothing()
+	     && rel6 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates())
+	     && rel7 == Poly_Con_Relation::is_included()
+	     && rel8 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates()));
+
+  nout << "dp.relation_with(A + B + C %= 0) == " << rel3 << endl;
+  nout << "dp.relation_with(A + B %= 0) == " << rel4 << endl;
+  nout << "dp.relation_with(A %= 0) == " << rel5 << endl;
+  nout << "dp.relation_with(Linear_Expression(0) %= 0) == " << rel6 << endl;
+  nout << "dp.relation_with(2*A + B %= 3) == " << rel7 << endl;
+  nout << "dp.relation_with(3*A + 3*B + C %= 7) == " << rel8 << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+  return ok;
+}
+
+// A product where the components strictly intersect the constraint.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(C == 0);
+  dp.add_congruence(6*A + 3*B %= 0);
+
+  Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B >= 3);
+  Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B >= 3);
+  bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+  bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects());
+
+  if (!okdp1 || !okdp2) {
+    nout << "dp.domain1().relation_with(2*A + B >= 3) == " << rel1 << endl;
+    nout << "dp.domain2().relation_with(2*A + B >= 3) == " << rel2 << endl;
+    print_constraints(dp, "*** dp constraints ***");
+    print_congruences(dp, "*** dp congruences ***");
+    return false;
+  }
+
+  Poly_Con_Relation rel3 = dp.relation_with(2*A + B >= 3);
+  bool ok = (rel3 == Poly_Con_Relation::nothing());
+
+  nout << "dp.relation_with(2*A + B >= 3) == " << rel3 << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// relation_with a congruence
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence cg(A %= 2);
+
+  Product dp(2);
+
+  Poly_Con_Relation rel = dp.relation_with(cg);
+  bool ok = Poly_Con_Relation::nothing() == rel;
+
+  nout << "dp.relation_with(A %= 2) == " << rel << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// Empty product; relation_with a congruence.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(A == 1);
+  dp.add_congruence((A %= 2) / 0);
+
+  Poly_Con_Relation rel = dp.relation_with(B %= 0);
+  bool ok = (rel == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  nout << "dp.relation_with(B %= 0) == " << rel << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// A product in 3D; relation_with a congruence.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(3*A + 3*B + C == 7);
+  dp.add_constraint(3*A - C >= 2);
+  dp.add_congruence((2*A + B %= 0) / 2);
+
+  Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B %= 3);
+  Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B %= 3);
+#ifdef PH_IS_FIRST
+  bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+  bool okdp2 = (rel2 == Poly_Con_Relation::is_included());
+#else
+  bool okdp1 = (rel2 == Poly_Con_Relation::strictly_intersects());
+  bool okdp2 = (rel1 == Poly_Con_Relation::is_included());
+#endif
+
+  if (!okdp2 || !okdp1) {
+    nout << "dp.domain1().relation_with(2*A + B %= 3) == " << rel1 << endl;
+    nout << "dp.domain2().relation_with(2*A + B %= 3) == " << rel2 << endl;
+    print_constraints(dp, "*** dp constraints ***");
+    print_congruences(dp, "*** dp congruences ***");
+    return false;
+  }
+
+  Poly_Con_Relation rel3 = dp.relation_with(A + B + C %= 0);
+  Poly_Con_Relation rel4 = dp.relation_with(A + B %= 0);
+  Poly_Con_Relation rel5 = dp.relation_with(A %= 0);
+  Poly_Con_Relation rel6 = dp.relation_with(Linear_Expression(0) %= 0);
+  Poly_Con_Relation rel7 = dp.relation_with(2*A + B %= 3);
+  Poly_Con_Relation rel8 = dp.relation_with(3*A + 3*B + C %= 7);
+  bool ok = (rel3 == Poly_Con_Relation::nothing()
+	     && rel4 == Poly_Con_Relation::nothing()
+	     && rel5 == Poly_Con_Relation::nothing()
+	     && rel6 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates())
+	     && rel7 == Poly_Con_Relation::is_included()
+	     && rel8 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates()));
+
+  nout << "dp.relation_with(A + B + C %= 0) == " << rel3 << endl;
+  nout << "dp.relation_with(A + B %= 0) == " << rel4 << endl;
+  nout << "dp.relation_with(A %= 0) == " << rel5 << endl;
+  nout << "dp.relation_with(Linear_Expression(0) %= 0) == " << rel6 << endl;
+  nout << "dp.relation_with(2*A + B %= 3) == " << rel7 << endl;
+  nout << "dp.relation_with(3*A + 3*B + C %= 7) == " << rel8 << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// A product where the components strictly intersect the congruence.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(C == 0);
+  dp.add_congruence(6*A + 3*B %= 0);
+
+  bool okdp1 = (dp.domain1().relation_with(2*A + B %= 3)
+		== Poly_Con_Relation::strictly_intersects());
+
+  bool okdp2 = (dp.domain2().relation_with(2*A + B %= 3)
+	       == Poly_Con_Relation::strictly_intersects());
+
+  Poly_Con_Relation rel = dp.relation_with(2*A + B %= 3);
+  bool ok = (okdp1 && okdp2
+	     && rel == Poly_Con_Relation::nothing());
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+  nout << "dp.relation_with(2*A + B %= 3) == " << rel << endl;
+
+  return ok;
+}
+#endif
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+#if !Box_Class
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+#endif
+#if !BD_Shape_Class && !Octagonal_Shape_Class && !Box_Class
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+#endif
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct6.cc b/tests/Partially_Reduced_Product/directproduct6.cc
new file mode 100644
index 0000000..2651813
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct6.cc
@@ -0,0 +1,640 @@
+/* Test Grid::congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .
+
+Tests bounds_from_above(), bounds_from_below(), maximize() and minimize()
+for the product domains */
+
+#include "ppl_test.hh"
+
+#define PH_IS_FIRST
+
+// ONE AND ONLY ONE OF THESE MUST BE 1
+#define NNC_Poly_Class 1
+#define C_Poly_Class 0
+#define BD_Shape_Class 0
+#define Octagonal_Shape_Class 0
+#define Box_Class 0
+
+#if Box_Class
+typedef TBox Poly;
+#endif
+
+#if Octagonal_Shape_Class
+typedef TOctagonal_Shape Poly;
+#endif
+
+#if BD_Shape_Class
+typedef BD_Shape<mpq_class> Poly;
+#endif
+
+#if NNC_Poly_Class
+typedef NNC_Polyhedron Poly;
+#endif
+
+#if C_Poly_Class
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product Product;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product Product;
+#endif
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Product dp(7, EMPTY);
+
+  bool ok = (dp.bounds_from_above(Linear_Expression(0))
+	     && dp.bounds_from_below(Linear_Expression(0)));
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Product dp(0, EMPTY);
+
+  bool ok = (dp.bounds_from_above(Linear_Expression(3))
+	     && dp.bounds_from_below(Linear_Expression(3)));
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Product dp(0);
+
+  bool ok = (dp.bounds_from_above(Linear_Expression(1))
+	     && dp.bounds_from_below(Linear_Expression(1)));
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(A == 1);
+  dp.add_constraint(3*B == 2);
+
+  Linear_Expression le = A + B;
+  bool ok = dp.bounds_from_above(le)
+    && dp.bounds_from_below(le);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+#if Box_Class
+  dp.add_constraint(A >= 1);
+  dp.add_constraint(A <= 1);
+  dp.add_constraint(B >= 1);
+  dp.add_constraint(B <= 0);
+#else
+  dp.add_constraint(A - B >= 1);
+  dp.add_constraint(A - B <= 1);
+#endif
+  dp.add_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+  bool ok = dp.bounds_from_above(le)
+    && dp.bounds_from_below(le);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(B == 1);
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !dp.bounds_from_above(le)
+    && !dp.bounds_from_below(le);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Empty. maximize() and minimize()
+bool
+test07() {
+  Product dp(7, EMPTY);
+
+  Coefficient extr_n;
+  Coefficient extr_d;
+  bool dummy;
+
+  bool ok = (!dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy));
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test08() {
+  Product dp(0, EMPTY);
+
+  Coefficient extr_n;
+  Coefficient extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = !dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+    && !dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test09() {
+  Product dp(0);
+
+  Coefficient extr_n, extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+    && dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(A == 1);
+  dp.add_constraint(3*B == 2);
+
+  Linear_Expression le = A + B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  Generator known_pnt(point(3*A + 2*B, 3));
+  bool max;
+  bool min;
+
+  bool ok = dp.maximize(le, max_n, max_d, max)
+    && dp.minimize(le, min_n, min_d, min)
+    && dp.maximize(le, max_n, max_d, max, pnt_max)
+    && dp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 5 && max_d == 3 && min_n == 5 && min_d == 3
+    && pnt_max == known_pnt && pnt_min == known_pnt;
+
+  print_generator(pnt_max, "*** max point ***");
+  print_generator(pnt_min, "*** min point ***");
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// only one component is bounded.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+#if Box_Class
+  dp.add_constraint(A >= 2);
+  dp.add_constraint(A <= 2);
+  dp.add_constraint(B >= 1);
+  dp.add_constraint(B <= 1);
+#else
+  dp.add_constraint(A - B >= 1);
+  dp.add_constraint(A - B <= 1);
+#endif
+  dp.add_congruence(3*B %= 2);
+;
+  Linear_Expression le = A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = dp.maximize(le, max_n, max_d, max)
+    && dp.minimize(le, min_n, min_d, min)
+    && dp.maximize(le, max_n, max_d, max, pnt_max)
+    && dp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+    && pnt_max == pnt_min;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.add_constraint(B == 1);
+
+  Linear_Expression le = 2*A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = !dp.maximize(le, max_n, max_d, max)
+    && !dp.minimize(le, min_n, min_d, min)
+    && !dp.maximize(le, max_n, max_d, max, pnt_max)
+    && !dp.minimize(le, min_n, min_d, min, pnt_min);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// only one component is strictly bounded.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+
+#if NNC_Poly_Class
+  dp.add_constraint(A - B > 0);
+  dp.add_constraint(A - B < 1);
+#else
+#if !Box_Class
+  dp.add_constraint(A - B >= 0);
+  dp.add_constraint(A - B <= 1);
+#else
+  dp.add_constraint(A >= 2);
+  dp.add_constraint(A <= 2);
+  dp.add_constraint(B <= 2);
+  dp.add_constraint(B >= 1);
+#endif
+#endif
+  dp.add_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+
+  bool max;
+  bool min;
+
+  bool ok = dp.maximize(le, max_n, max_d, max)
+    && dp.minimize(le, min_n, min_d, min)
+    && dp.maximize(le, max_n, max_d, max, pnt_max)
+    && dp.minimize(le, min_n, min_d, min, pnt_min);
+
+#if NNC_Poly_Class
+  ok = ok && !max && !min;
+#else
+  ok = ok && max && min;
+#endif
+
+  ok = ok && max_n == 1 && max_d == 1 && min_n == 0 && min_d == 1;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+#if !Box_Class
+// Non-empty product. bounded_affine_image/3
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence((A ==  0) / 0);
+  dp.add_congruence((B ==  0) / 0);
+  dp.add_congruence((C == -2) / 0);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  dp.bounded_affine_image(A, 7-B, B+3);
+
+  Product known_dp(3);
+  known_dp.add_constraint(C == -2);
+  known_dp.add_constraint(B == 0);
+  known_dp.add_constraint(A <= 3);
+  known_dp.add_constraint(A - B >= 7);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp,
+     "*** dp.bounded_affine_image(A, 7-B, B+3) congruences ***");
+  print_constraints(dp,
+     "*** dp.bounded_affine_image(A, 7-B, B+3) constraints ***");
+
+  return ok;
+}
+
+// Empty product component. bounded_affine_image/3
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(A ==  0);
+  dp.add_constraint(A ==  1);
+  dp.add_constraint(C == -2);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  dp.bounded_affine_image(A, 7-B, B+3);
+
+  Product known_dp(3, EMPTY);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Non-empty product. bounded_affine_preimage/3
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_congruence((A ==  0) / 0);
+  dp.add_congruence((B ==  0) / 0);
+  dp.add_congruence((C == -2) / 0);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  dp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Constraint_System cs;
+  cs.insert(C == -2);
+  cs.insert(B == 0);
+  cs.insert(C >= 3);
+
+  Product known_dp(3);
+  known_dp.add_constraints(cs);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+
+// Empty product. bounded_affine_preimage/3
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.add_constraint(A ==  0);
+  dp.add_constraint(A ==  1);
+  dp.add_constraint(C == -2);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  dp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Product known_dp(3, EMPTY);
+
+  bool ok = (dp == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok;
+}
+#endif
+
+typedef Domain_Product<TBox, Grid>::Direct_Product Box_Product;
+
+// Box_Product(nnc_polyhedron, POLYNOMIAL_COMPLEXITY).
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+
+  Box_Product pdp(ph, POLYNOMIAL_COMPLEXITY);
+
+  Box_Product ndp(ph);
+
+  Box_Product known_ndp(2);
+  known_ndp.add_constraint(3*x >= -2);
+  known_ndp.add_constraint(x <= 4);
+  known_ndp.add_constraint(y >= -10);
+  known_ndp.add_constraint(y <= 4);
+
+  Box_Product known_pdp(2);
+  known_pdp.add_constraint(x <= 4);
+  known_pdp.add_constraint(y <= 4);
+
+  bool ok = (ndp == known_ndp && pdp == known_pdp && pdp.contains(ndp));
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(ndp, "*** ndp ***");
+  print_congruences(ndp, "*** ndp ***");
+  print_constraints(pdp, "*** pdp ***");
+  print_congruences(pdp, "*** pdp ***");
+
+  return ok;
+}
+
+// Product(Product).
+bool
+test19() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+
+  Product src(cs);
+
+  Product dp(src, POLYNOMIAL_COMPLEXITY);
+
+  Product dp1(src);
+
+  Product known_dp(1);
+  known_dp.add_constraint(A >= 0);
+
+  bool ok = (dp == known_dp && dp1 == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+
+  return ok && dp.OK();
+}
+
+// Product(Box_Product).
+bool
+test20() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+
+  Box_Product src(cs);
+
+  Product dp(src, POLYNOMIAL_COMPLEXITY);
+
+  Product dp1(src);
+
+  Product known_dp(1);
+  known_dp.add_constraint(A >= 0);
+
+  bool ok = (dp == known_dp && dp1 == known_dp);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+#if !Box_Class
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+#endif
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/partiallyreducedproduct1.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
new file mode 100644
index 0000000..1b10133
--- /dev/null
+++ b/tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
@@ -0,0 +1,835 @@
+/* Test Partially_Reduced_Product<>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#define PH_IS_NNC
+// #define PH_IS_FIRST
+
+#ifdef PH_IS_NNC
+typedef NNC_Polyhedron Poly;
+#else
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product DProduct;
+typedef Domain_Product<Poly, Grid>::Smash_Product SProduct;
+typedef Domain_Product<Poly, Grid>::Constraints_Product CProduct;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product DProduct;
+typedef Domain_Product<Grid, Poly>::Smash_Product SProduct;
+typedef Domain_Product<Grid, Poly>::Constraints_Product CProduct;
+#endif
+
+namespace {
+
+// Product(dims, type); == and !=
+bool
+test01() {
+  Variable A(0);
+
+  SProduct sp1(3);
+  SProduct sp2(3, EMPTY);
+  CProduct cp1(3);
+  CProduct cp2(3);
+  cp2.add_constraint(A == 0);
+
+  bool ok = (sp1 != sp2 && cp1 != cp2);
+
+  if (!ok)
+    return false;
+
+  sp1.add_congruence((A %= 0) / 4);
+  sp1.add_congruence((A %= 1) / 4);
+
+  cp1.add_constraint(A >= 0);
+  cp1.add_constraint(A <= 0);
+
+  ok = (sp1 == sp2 && cp1 == cp2);
+
+  ok = ok && sp1.OK() && sp2.OK() && cp1.OK() && cp2.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+
+  return ok;
+}
+
+// operator=
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A + B <= 9);
+
+  SProduct sp1(cs);
+  sp1.add_congruence((A %= 9) / 19);
+  sp1.add_congruence((A %= 8) / 19);
+  SProduct sp2 = sp1;
+  CProduct cp1(cs);
+  cp1.add_constraint(A >= 9);
+  cp1.add_constraint(A <= 9);
+  CProduct cp2 = cp1;
+
+  bool ok =  (sp1 == sp2 && cp1 == cp2);
+
+  ok = ok && sp1.OK() && sp2.OK() && cp1.OK() && cp2.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+
+  return ok;
+}
+
+// Copy constructor.
+bool
+test03() {
+  Variable A(0);
+  Variable B(2);
+
+  Constraint_System cs(A - B == 0);
+
+  SProduct sp1(cs);
+  sp1.add_congruence((A %= 9) / 19);
+  sp1.add_congruence((A %= 8) / 19);
+  SProduct sp2(sp1);
+  CProduct cp1(cs);
+  cp1.add_constraint(A >= 9);
+  cp1.add_constraint(A <= 9);
+  CProduct cp2(cp1);
+
+  bool ok =  (sp1 == sp2 && cp1 == cp2);
+
+  ok = ok && sp1.OK() && sp2.OK() && cp1.OK() && cp2.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+
+  return ok;
+}
+
+// affine_dimension()
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A - C <= 9);
+  cs.insert(A - C >= 9);
+  cs.insert(B == 2);
+
+  SProduct sp(3);
+  sp.add_constraints(cs);
+  CProduct cp(3);
+  cp.add_constraints(cs);
+
+  bool ok = (sp.affine_dimension() == 1
+             && cp.affine_dimension() == 1
+	     && sp.domain1().affine_dimension() == 2
+	     && sp.domain2().affine_dimension() == 1
+	     && cp.domain1().affine_dimension() == 1
+	     && cp.domain2().affine_dimension() == 1);
+
+  ok = ok && sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// congruences()
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs1;
+  cs1.insert(A - C <= 8);
+  cs1.insert(A - C >= 9);
+  Constraint_System cs2;
+  cs2.insert(A - C <= 9);
+  cs2.insert(A - C >= 9);
+
+  SProduct sp(cs1);
+  CProduct cp(cs2);
+
+  DProduct known_dp1(3, EMPTY);
+  DProduct known_dp2(3);
+  known_dp2.add_constraint(A - C == 9);
+
+  DProduct dp1(sp.congruences());
+  DProduct dp2(cp.congruences());
+
+  bool ok = (dp1 == known_dp1 && dp2 == known_dp2);
+
+  ok = ok && sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// minimized_congruences()
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs1;
+  cs1.insert(A - C <= 8);
+  cs1.insert(A - C >= 9);
+  Constraint_System cs2;
+  cs2.insert(A - C <= 9);
+  cs2.insert(A - C >= 9);
+
+  SProduct sp(cs1);
+  CProduct cp(cs2);
+
+  DProduct known_dp1(3, EMPTY);
+  DProduct known_dp2(3);
+  known_dp2.add_constraint(A - C == 9);
+
+  DProduct dp1(sp.minimized_congruences());
+  DProduct dp2(cp.minimized_congruences());
+
+  bool ok = (dp1 == known_dp1 && dp2 == known_dp2);
+
+  ok = ok && sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// constraints()
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+#ifdef PH_IS_NNC
+  Constraint c(A > 9);
+#else
+  Constraint c(A >= 9);
+#endif
+
+  SProduct sp(3);
+  sp.add_congruence((B + C %= 3) / 0);
+  sp.add_constraint(c);
+  sp.add_constraint(A <= 8);
+  CProduct cp(3);
+  cp.add_congruence((B + C %= 3) / 0);
+  cp.add_constraint(c);
+  cp.add_constraint(B <= 11);
+  cp.add_constraint(B >= 11);
+
+  DProduct dp1(sp.space_dimension());
+  DProduct dp2(cp.space_dimension());
+
+  dp1.add_constraints(sp.constraints());
+  dp2.add_constraints(cp.constraints());
+
+  DProduct known_dp1(sp.space_dimension(), EMPTY);
+  DProduct known_dp2(sp.space_dimension());
+  known_dp2.add_constraint(C == -8);
+  known_dp2.add_constraint(c);
+  known_dp2.add_constraint(B == 11);
+
+  bool ok = (dp1 == known_dp1 && dp2 == known_dp2);
+
+  ok = ok && sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// minimized_constraints()
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+#ifdef PH_IS_NNC
+  Constraint c(A > 9);
+#else
+  Constraint c(A >= 9);
+#endif
+
+  SProduct sp(3);
+  sp.add_congruence((B + C %= 3) / 0);
+  sp.add_constraint(c);
+  sp.add_constraint(A <= 8);
+  CProduct cp(3);
+  cp.add_congruence((B + C %= 3) / 0);
+  cp.add_constraint(c);
+  cp.add_constraint(B <= 11);
+  cp.add_constraint(B >= 11);
+
+  DProduct dp1(sp.space_dimension());
+  DProduct dp2(cp.space_dimension());
+
+  dp1.add_constraints(sp.minimized_constraints());
+  dp2.add_constraints(cp.minimized_constraints());
+
+  DProduct known_dp1(sp.space_dimension(), EMPTY);
+  DProduct known_dp2(sp.space_dimension());
+  known_dp2.add_constraint(C == -8);
+  known_dp2.add_constraint(c);
+  known_dp2.add_constraint(B == 11);
+
+  bool ok = (dp1 == known_dp1 && dp2 == known_dp2);
+
+  ok = ok && sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// is_empty() where both domain objects have points.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_congruence(A %= 9);
+  sp.add_congruence(B + C %= 3);
+
+  bool smash_ok = !sp.is_empty();
+
+  smash_ok = smash_ok && sp.OK();
+
+  CProduct cp(3);
+  cp.add_congruence(A %= 9);
+  cp.add_congruence(B + C %= 3);
+
+  bool cons_ok = !cp.is_empty();
+
+  cons_ok = cons_ok && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return smash_ok && cons_ok;
+}
+
+// is_empty().
+bool
+test10() {
+  Variable A(0);
+
+  SProduct sp(3);
+  sp.add_constraint(A <= 1);
+  sp.add_constraint(A >= 3);
+
+  bool smash_ok = sp.is_empty();
+  smash_ok = smash_ok && sp.OK();
+
+  CProduct cp(3);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+  cp.add_congruence((A %= 3) / 0);
+
+  bool cons_ok = cp.is_empty();
+  cons_ok = cons_ok && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return smash_ok && cons_ok;
+}
+
+// is_topologically_closed().
+bool
+test11() {
+  Variable A(0);
+
+  SProduct sp(3);
+  bool smash_ok;
+  CProduct cp(3);
+  bool cons_ok;
+#ifdef PH_IS_NNC
+  sp.add_constraint(A < 3);
+  cp.add_constraint(A < 3);
+
+  smash_ok = !sp.is_topologically_closed();
+  cons_ok = !cp.is_topologically_closed();
+#else
+  sp.add_constraint(A <= 3);
+  cp.add_constraint(A <= 3);
+
+  smash_ok = sp.is_topologically_closed();
+  cons_ok = cp.is_topologically_closed();
+#endif
+  smash_ok = smash_ok && sp.OK();
+  cons_ok = cons_ok && cp.OK();
+
+  if (!smash_ok || !cons_ok) {
+    print_congruences(sp, "*** sp congruences non-empty ***");
+    print_constraints(sp, "*** sp constraints non-empty ***");
+    print_congruences(cp, "*** cp congruences non-empty ***");
+    print_constraints(cp, "*** cp constraints non-empty ***");
+    return false;
+  }
+
+  sp.add_congruence((A %= 0) / 2);
+  sp.add_congruence((A %= 1) / 2);
+#ifdef PH_IS_NNC
+  cp.add_congruence((A %= 2) / 0);
+#else
+  cp.add_congruence((A %= 2) / 0);
+#endif
+
+  smash_ok = sp.is_topologically_closed();
+  cons_ok = cp.is_topologically_closed();
+  smash_ok = smash_ok && sp.OK();
+  cons_ok = cons_ok && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return smash_ok && cons_ok;
+}
+
+// is_disjoint_from().
+bool
+test12() {
+  Variable B(1);
+
+  SProduct sp1(4);
+  sp1.add_constraint(B <= 3);
+  sp1.add_constraint(B >= 3);
+
+  SProduct sp2(4);
+  sp2.add_congruence((B %= 1) / 3);
+
+  bool ok = !sp1.is_disjoint_from(sp2);
+  ok = ok && sp1.OK() && sp2.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  if (!ok)
+    return false;
+
+  CProduct cp1(4);
+  cp1.add_constraint(B <= 3);
+  cp1.add_constraint(B >= 3);
+
+  CProduct cp2(4);
+  cp2.add_congruence((B %= 1) / 3);
+
+  ok = cp1.is_disjoint_from(cp2);
+  ok = ok && cp1.OK() && cp2.OK();
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  return ok;
+}
+
+// is_bounded().
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  bool ok;
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 0);
+  sp.add_congruence((A %= 1) / 3);
+
+  ok = sp.is_bounded();
+  ok = ok && sp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  if (!ok)
+    return false;
+
+  CProduct cp(2);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+  cp.add_congruence((A %= 1) / 3);
+  cp.add_congruence((B %= 1) / 0);
+
+  ok = cp.is_bounded();
+  ok = ok && cp.OK();
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// ok(), not reduced.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  bool ok;
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 0);
+  sp.add_congruence((A %= 1) / 3);
+
+  ok = sp.OK();
+
+#if PH_IS_FIRST
+  print_constraints(sp.domain1().constraints(),
+		    "*** sp,domain1() constraints ***");
+  print_congruences(sp.domain2().congruences(),
+		    "*** sp,domain2() congruences ***");
+#else
+  print_congruences(sp.domain1().congruences(),
+		    "*** sp,domain1() congruences ***");
+  print_constraints(sp.domain2().constraints(),
+		    "*** sp,domain2() constraints ***");
+#endif
+
+  if (!ok)
+    return false;
+
+  CProduct cp(2);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+  cp.add_congruence((A %= 1) / 3);
+  cp.add_congruence((B %= 1) / 0);
+
+  ok = cp.OK();
+
+#if PH_IS_FIRST
+  print_constraints(cp.domain1().constraints(),
+		    "*** cp,domain1() constraints ***");
+  print_congruences(cp.domain2().congruences(),
+		    "*** cp,domain2() congruences ***");
+#else
+  print_congruences(cp.domain1().congruences(),
+		    "*** cp,domain1() congruences ***");
+  print_constraints(cp.domain2().constraints(),
+		    "*** cp,domain2() constraints ***");
+#endif
+
+  return ok;
+}
+
+// ok(), is reduced.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  bool ok;
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 0);
+  sp.add_congruence((A %= 1) / 3);
+
+  // reduce the product
+  Constraint_System sp_cs = sp.constraints();
+
+  ok = sp.OK();
+
+  if (!ok) {
+    print_constraints(sp_cs, "*** sp.constraints(); ***");
+    return false;
+  }
+
+  Grid sp_gr(sp_cs);
+  ok = sp_gr.is_empty();
+
+#if PH_IS_FIRST
+  print_constraints(sp.domain1().constraints(),
+		    "*** sp.domain1() constraints ***");
+  print_congruences(sp.domain2().congruences(),
+		    "*** sp.domain2() congruences ***");
+#else
+  print_congruences(sp.domain1().congruences(),
+		    "*** sp.domain1() congruences ***");
+  print_constraints(sp.domain2().constraints(),
+		    "*** sp.domain2() constraints ***");
+#endif
+
+  if (!ok)
+    return false;
+
+  CProduct cp(2);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+  cp.add_congruence((A %= 1) / 3);
+  cp.add_congruence((B %= 1) / 0);
+
+  // reduce the product
+  Constraint_System cp_cs = sp.constraints();
+
+  ok = cp.OK();
+
+  if (!ok) {
+    print_constraints(cp_cs, "*** cp.constraints(); ***");
+    return false;
+  }
+
+  Grid cp_gr(cp_cs);
+  ok = (cp_gr.affine_dimension() == 0);
+
+#if PH_IS_FIRST
+  print_constraints(cp.domain1().constraints(),
+		    "*** cp.domain1() constraints ***");
+  print_congruences(cp.domain2().congruences(),
+		    "*** cp.domain2() congruences ***");
+#else
+  print_congruences(cp.domain1().congruences(),
+		    "*** cp.domain1() congruences ***");
+  print_constraints(cp.domain2().constraints(),
+		    "*** cp.domain2() constraints ***");
+#endif
+
+  return ok;
+}
+
+// Building from constraints()
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs1;
+  cs1.insert(A - C <= 8);
+  cs1.insert(A - C >= 9);
+  Constraint_System cs2;
+  cs2.insert(A - C <= 9);
+  cs2.insert(A - C >= 9);
+
+  SProduct sp(cs1);
+  CProduct cp(cs2);
+
+
+  bool ok = sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// Building from congruences()
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert((A - C %= 8) / 10);
+  cgs1.insert((A - C %= 9) / 10);
+  Congruence_System cgs2;
+  cgs2.insert(A - C %= 9);
+  cgs2.insert((B %= 21) / 0);
+
+  SProduct sp(cgs1);
+  CProduct cp(cgs2);
+
+
+  bool ok = sp.OK() && cp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// add_congruences
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((A + B %= 0) / 2);
+  cgs.insert((B %= 0) / 2);
+  cgs.insert(A + B == 0);
+
+  SProduct sp(2);
+  CProduct cp(2);
+
+  sp.add_congruences(cgs);
+  cp.add_congruences(cgs);
+
+  SProduct known_sp(cgs);
+  CProduct known_cp(cgs);
+
+  bool ok = (sp == known_sp && cp == known_cp);
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+  cgs.insert((A %= 0) / 0);
+
+  SProduct sp(2);
+  CProduct cp(2);
+
+  Congruence_System cgs_copy = cgs;
+  Congruence_System cgs_copy2 = cgs;
+
+  sp.add_recycled_congruences(cgs);
+  cp.add_recycled_congruences(cgs_copy);
+
+  SProduct known_sp(cgs_copy2);
+  CProduct known_cp(cgs_copy2);
+
+  bool ok = (sp == known_sp && cp == known_cp);
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 0) / 2);
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((A %= 0) / 1);
+  cgs.insert(A - B == 0);
+
+  SProduct sp(2);
+  CProduct cp(2);
+
+  Congruence_System cgs_copy = cgs;
+  Congruence_System cgs_copy2 = cgs;
+
+  sp.add_recycled_congruences(cgs);
+  cp.add_recycled_congruences(cgs_copy);
+
+  SProduct known_sp(cgs_copy2);
+  CProduct known_cp(cgs_copy2);
+
+  bool ok = (sp == known_sp && cp == known_cp);
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/partiallyreducedproduct2.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
new file mode 100644
index 0000000..57d2e28
--- /dev/null
+++ b/tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
@@ -0,0 +1,893 @@
+/* Test Partially_Reduced_Product<>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define PH_IS_NNC
+// #define PH_IS_FIRST
+
+#ifdef PH_IS_NNC
+typedef NNC_Polyhedron Poly;
+#else
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Smash_Product SProduct;
+typedef Domain_Product<Poly, Grid>::Constraints_Product CProduct;
+#else
+typedef Domain_Product<Grid, Poly>::Smash_Product SProduct;
+typedef Domain_Product<Grid, Poly>::Constraints_Product CProduct;
+#endif
+
+namespace {
+
+// Tests 1-10 are for just the Smash_Product domains.
+
+// space_dimension()
+bool
+test01() {
+  Variable A(0);
+  Variable E(4);
+
+#ifdef PH_IS_NNC
+  Constraint_System cs(A + E < 9);
+#else
+  Constraint_System cs(A + E <= 9);
+#endif
+
+  SProduct sp(cs);
+
+  bool smash_ok = (sp.space_dimension() == 5);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return smash_ok;
+}
+
+// affine_dimension()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_constraint(A - C <= 9);
+  sp.add_constraint(A - C >= 9);
+  sp.add_constraint(B >= 2);
+
+  bool smash_ok = sp.space_dimension() == 3;
+  smash_ok = smash_ok && sp.affine_dimension() == 2;
+
+  if (smash_ok) {
+    sp.add_constraint(A - C >= 4);
+    sp.add_constraint(A - C <= 4);
+
+    smash_ok = smash_ok && sp.affine_dimension() == 0;
+  }
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return smash_ok;
+}
+
+// contains()
+bool
+test03() {
+  Variable A(0);
+
+  SProduct sp1(1);
+  sp1.add_constraint(A <= 3);
+  sp1.add_congruence((A %= 1) / 2);
+
+  SProduct sp2(1);
+  sp2.add_constraint(A <= 3);
+  sp2.add_constraint(A >= 4);
+  sp2.add_congruence((A %= 0) / 2);
+
+  bool smash_ok1 = sp1.contains(sp2) && sp1.strictly_contains(sp2);
+
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp1, "*** sp1 congruences ***");
+
+  if (!smash_ok1)
+    return smash_ok1;
+
+  SProduct sp3(1);
+  sp3.add_constraint(A <= 3);
+  sp3.add_congruence((A %= 1) / 2);
+
+  SProduct sp4(1);
+  sp4.add_constraint(A <= 4);
+  sp4.add_congruence((A %= 0) / 2);
+  sp4.add_congruence((A %= 1) / 2);
+
+  bool smash_ok2 = sp3.contains(sp4) && sp3.strictly_contains(sp4);
+
+  print_constraints(sp3, "*** sp3 constraints ***");
+  print_congruences(sp3, "*** sp3 congruences ***");
+
+  if (!smash_ok2)
+    return smash_ok2;
+
+  SProduct sp5(1);
+  sp5.add_constraint(A <= 3);
+  sp5.add_constraint(A >= 4);
+  sp5.add_congruence((A %= 1) / 2);
+  sp5.add_congruence((A %= 0) / 2);
+
+  SProduct sp6(1, EMPTY);
+
+  bool smash_ok3 = sp5.contains(sp6) && !sp5.strictly_contains(sp6);
+
+  print_constraints(sp5, "*** sp5 constraints ***");
+  print_congruences(sp5, "*** sp5 congruences ***");
+
+  return smash_ok3;
+}
+
+// intersection_assign()
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp1(3);
+  sp1.add_constraint(A >= 0);
+  sp1.add_congruence((A %= 0) / 2);
+
+  SProduct sp2(3);
+  sp2.add_constraint(A <= 0);
+  sp2.add_congruence((A %= 0) / 1);
+
+  sp1.intersection_assign(sp2);
+
+  SProduct known_sp(3);
+  known_sp.add_constraint(A == 0);
+
+  bool smash_ok1 = !(sp1 == known_sp);
+  if (!smash_ok1) {
+    print_congruences(sp1, "*** sp1 congruences ***");
+    print_constraints(sp1, "*** sp1 constraints ***");
+    print_congruences(sp2, "*** sp2 congruences ***");
+    print_constraints(sp2, "*** sp2 constraints ***");
+    return smash_ok1;
+  }
+
+  sp2.add_constraint(A >= 1);
+  sp1.intersection_assign(sp2);
+
+  known_sp.add_constraint(A == 1);
+
+  bool smash_ok2 = (sp1 == known_sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok2;
+}
+
+// upper_bound_assign(sp2)
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(1);
+  sp.add_constraint(A <= 18);
+  sp.add_constraint(A >= 18);
+
+  SProduct sp1(sp);
+
+  SProduct sp2(1);
+  sp2.add_congruence((A %= 19) / 20);
+  sp2.add_congruence((A %= 18) / 20);
+
+  sp1.upper_bound_assign(sp2);
+
+  bool smash_ok = (sp1 == sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+
+  if (!smash_ok)
+    return false;
+
+  sp2.upper_bound_assign(sp1);
+
+  smash_ok = (sp2 == sp);
+
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(3);
+  sp.add_congruence((A %= 0) / 2);
+  sp.add_congruence((B %= 0) / 2);
+
+  SProduct sp1(sp);
+
+  SProduct sp2(3);
+  sp2.add_congruence((A %= 1) / 3);
+  sp2.add_congruence((B %= 1) / 3);
+
+  bool smash_ok = (!sp1.upper_bound_assign_if_exact(sp2)
+		   && !sp2.upper_bound_assign_if_exact(sp1));
+
+  if (!smash_ok) {
+    print_congruences(sp1, "*** sp1 congruences ub exact ***");
+    print_constraints(sp1, "*** sp1 constraints ub exact ***");
+    print_congruences(sp2, "*** sp2 congruences ub exact ***");
+    print_constraints(sp2, "*** sp2 constraints ub exact ***");
+    return false;
+  }
+
+  smash_ok = (sp == sp1);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  if (!smash_ok)
+    return false;
+
+  // The grid component is empty so that the smash product
+  // reduces the polyhedron component to empty.
+  sp1.add_congruence((B %= 1) / 2);
+  sp1.add_congruence((B %= 0) / 2);
+
+  // The polyhedron component is empty so that the smash product
+  // reduces the grid component to empty.
+  sp2.add_constraint(B >= 1);
+  sp2.add_constraint(B <= 0);
+
+  smash_ok = sp1.upper_bound_assign_if_exact(sp2)
+   && sp2.upper_bound_assign_if_exact(sp1);
+
+  if (!smash_ok)
+    return false;
+
+  SProduct known_sp(3, EMPTY);
+
+  smash_ok = (sp1 == known_sp) && (sp2 == known_sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return (smash_ok);
+}
+
+// difference_assign(sp2)
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(1);
+  sp.add_constraint(A <= 18);
+  sp.add_constraint(A >= 18);
+
+  SProduct sp1(sp);
+
+  SProduct sp2(1);
+  sp2.add_congruence((A %= 19) / 20);
+  sp2.add_congruence((A %= 18) / 20);
+
+  sp1.difference_assign(sp2);
+
+  bool smash_ok = (sp1 == sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+
+  if (!smash_ok)
+    return false;
+
+  sp2.difference_assign(sp1);
+
+  SProduct known_sp(1, EMPTY);
+
+  smash_ok = (sp2 == known_sp);
+
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok;
+}
+
+// time_elapse_assign(y)
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp1(3);
+  sp1.add_constraint(A >= 0);
+  sp1.add_constraint(B >= 0);
+  sp1.add_constraint(A + B >= 3);
+  sp1.add_constraint(2*A - B == 0);
+  sp1.add_constraint(3*A + C == 0);
+  sp1.add_congruence(3*A %= 0);
+
+  SProduct sp2(3);
+  sp2.add_constraint(7*C == 4);
+  sp2.add_constraint(7*B == -1);
+  sp2.add_constraint(7*A == 3);
+
+  sp1.time_elapse_assign(sp2);
+
+  SProduct known_sp(3);
+  known_sp.add_constraint(5*A - 13*B - 7*C == 0);
+  known_sp.add_constraint(3*A + C >= 0);
+  known_sp.add_constraint(A + B >= 3);
+  known_sp.add_constraint(4*A - 3*C >= 13);
+  known_sp.add_congruence((65*A - B %= 0) / 7);
+  known_sp.add_congruence(21*A %= 0);
+
+  bool smash_ok = (sp1 == known_sp);
+
+  print_congruences(sp1, "*** sp1.time_elapse_assign(sp2) congruences ***");
+  print_constraints(sp1, "*** sp1.time_elapse_assign(sp2) constraints ***");
+  print_congruences(sp2, "*** sp2.time_elapse_assign(sp2) congruences ***");
+  print_constraints(sp2, "*** sp2.time_elapse_assign(sp2) constraints ***");
+
+  return smash_ok;
+}
+
+// topological_closure_assign
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_constraint(B >= 0);
+  sp.add_constraint(3*A + C == 0);
+  sp.add_constraint(2*A - B == 0);
+  sp.add_congruence(3*A %= 0);
+#ifdef PH_IS_NNC
+  sp.add_constraint(A > 0);
+#else
+  sp.add_constraint(A >= 0);
+#endif
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  sp.topological_closure_assign();
+
+  SProduct known_sp(3);
+  known_sp.add_constraint(B >= 0);
+  known_sp.add_constraint(3*A + C == 0);
+  known_sp.add_constraint(2*A - B == 0);
+  known_sp.add_congruence(3*A %= 0);
+  known_sp.add_constraint(A >= 0);
+
+  bool smash_ok = (sp == known_sp);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return smash_ok;
+}
+
+// widening_assign
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp_prev(3);
+  sp_prev.add_constraint(C == 0);
+  sp_prev.add_constraint(A - B >= 1);
+  sp_prev.add_constraint(A <= 2);
+  sp_prev.add_constraint(B >= 0);
+  sp_prev.add_congruence((B %= 0) / 2);
+  sp_prev.add_congruence(3*A %= 0);
+
+  print_congruences(sp_prev, "*** sp_prev congruences ***");
+  print_constraints(sp_prev, "*** sp_prev constraints ***");
+
+  SProduct sp(3);
+  sp.add_constraint(C == 0);
+  sp.add_constraint(A <= 2);
+  sp.add_constraint(B >= 0);
+  sp.add_constraint(2*A - B >= 2);
+  sp.add_constraint(B >= 0);
+  sp.add_congruence(6*A %= 0);
+  sp.add_congruence((B %= 0) / 2);
+
+  sp.upper_bound_assign(sp_prev);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  sp.widening_assign(sp_prev);
+
+  SProduct known_sp(3);
+  known_sp.add_constraint(C == 0);
+  known_sp.add_constraint(A <= 2);
+  known_sp.add_constraint(B >= 0);
+  known_sp.add_congruence((B %= 0) / 2);
+
+  bool smash_ok = (sp == known_sp);
+
+  print_congruences(sp, "*** sp.widening_assign(sp_prev) congruences ***");
+  print_constraints(sp, "*** sp.widening_assign(sp_prev) constraints ***");
+
+  return smash_ok;
+}
+
+// Tests 11-20 are for just the Constraints_Product domain.
+
+// space_dimension()
+bool
+test11() {
+  Variable A(0);
+  Variable E(4);
+
+  Constraint_System cs;
+  cs.insert(A + E <= 9);
+  cs.insert(A + E >= 9);
+
+  CProduct cp(cs);
+
+  bool cons_ok = (cp.space_dimension() == 5);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return cons_ok;
+}
+
+// affine_dimension()
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp(3);
+  cp.add_constraint(A - C <= 9);
+  cp.add_constraint(A - C >= 9);
+  cp.add_constraint(B >= 2);
+
+  bool cons_ok = cp.space_dimension() == 3;
+  cons_ok = cons_ok && cp.affine_dimension() == 2;
+
+  if (cons_ok) {
+    cp.add_constraint(A - B >= 4);
+    cp.add_constraint(A - B <= 4);
+
+    cons_ok = cons_ok && cp.affine_dimension() == 1;
+  }
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return cons_ok;
+}
+
+// contains()
+bool
+test13() {
+  Variable A(0);
+
+  CProduct cp1(1);
+  cp1.add_constraint(A <= 3);
+  cp1.add_congruence((A %= 1) / 2);
+
+  CProduct cp2(1);
+  cp2.add_constraint(A <= 2);
+  cp2.add_constraint(A >= 2);
+  cp2.add_congruence((A %= 1) / 4);
+
+  bool cons_ok1 = cp1.contains(cp2) && cp1.strictly_contains(cp2);
+
+  print_constraints(cp1, "*** cp1 constraints ***");
+  print_congruences(cp1, "*** cp1 congruences ***");
+
+  if (!cons_ok1)
+    return cons_ok1;
+
+  CProduct cp3(1);
+  cp3.add_constraint(A <= 3);
+  cp3.add_congruence((A %= 1) / 0);
+
+  CProduct cp4(1);
+  cp4.add_constraint(A == 1);
+
+  bool cons_ok2 = cp3.contains(cp4) && !cp3.strictly_contains(cp4);
+
+  print_constraints(cp3, "*** cp3 constraints ***");
+  print_congruences(cp3, "*** cp3 congruences ***");
+
+  if (!cons_ok2)
+    return cons_ok2;
+
+  CProduct cp5(1);
+  cp5.add_constraint(A <= 3);
+  cp5.add_constraint(A >= 4);
+  cp5.add_congruence((A %= 1) / 2);
+  cp5.add_congruence((A %= 0) / 2);
+
+  CProduct cp6(1, EMPTY);
+
+  bool cons_ok3 = cp5.contains(cp6) && !cp5.strictly_contains(cp6);
+
+  print_constraints(cp5, "*** cp5 constraints ***");
+  print_congruences(cp5, "*** cp5 congruences ***");
+
+  return cons_ok3;
+}
+
+// intersection_assign()
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  CProduct cp1(3);
+  cp1.add_constraint(A >= 0);
+  cp1.add_congruence((A %= 0) / 2);
+
+  CProduct cp2(3);
+  cp2.add_constraint(A <= 0);
+  cp2.add_congruence((A %= 0) / 2);
+
+  cp1.intersection_assign(cp2);
+
+  CProduct known_cp(3);
+  known_cp.add_constraint(A == 0);
+  known_cp.add_congruence((A %= 0) / 2);
+
+  bool cons_ok1 = (cp1 == known_cp);
+  if (!cons_ok1) {
+    print_congruences(cp1, "*** cp1 congruences ***");
+    print_constraints(cp1, "*** cp1 constraints ***");
+    print_congruences(cp2, "*** cp2 congruences ***");
+    print_constraints(cp2, "*** cp2 constraints ***");
+    return cons_ok1;
+  }
+
+  cp2.add_constraint(A >= 1);
+  cp1.intersection_assign(cp2);
+
+  known_cp.add_constraint(A == 1);
+
+  bool cons_ok2 = (cp1 == known_cp);
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  return cons_ok2;
+}
+
+// upper_bound_assign(cp2)
+bool
+test15() {
+  Variable A(0);
+
+  CProduct cp(1);
+  cp.add_constraint(A <= 18);
+  cp.add_constraint(A >= 18);
+
+  CProduct cp1(cp);
+
+  CProduct cp2(1);
+  cp2.add_congruence((A %= 18) / 20);
+
+  cp1.upper_bound_assign(cp2);
+
+  CProduct known_cp(1);
+  known_cp.add_congruence((A %= 18) / 20);
+
+  bool cons_ok = (cp1 == known_cp);
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+
+  if (!cons_ok) {
+    return false;
+  }
+
+  cp2.upper_bound_assign(cp1);
+
+  cons_ok = (cp2 == known_cp);
+
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  return cons_ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  CProduct cp(3);
+  cp.add_congruence((A %= 0) / 2);
+  cp.add_congruence((B %= 0) / 2);
+
+  CProduct cp1(cp);
+
+  CProduct cp2(3);
+  cp2.add_congruence((A %= 1) / 3);
+  cp2.add_congruence((B %= 1) / 3);
+
+  bool cons_ok = (!cp1.upper_bound_assign_if_exact(cp2)
+		   && !cp2.upper_bound_assign_if_exact(cp1));
+
+  if (!cons_ok) {
+    print_congruences(cp1, "*** cp1 congruences ub exact ***");
+    print_constraints(cp1, "*** cp1 constraints ub exact ***");
+    print_congruences(cp2, "*** cp2 congruences ub exact ***");
+    print_constraints(cp2, "*** cp2 constraints ub exact ***");
+    return false;
+  }
+
+  cons_ok = (cp == cp1);
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  if (!cons_ok)
+    return false;
+
+  cp1.add_congruence((B %= 1) / 2);
+
+  cp2.add_constraint(B >= 1);
+  cp2.add_constraint(B <= 1);
+
+  cons_ok = cp1.upper_bound_assign_if_exact(cp2)
+   && cp2.upper_bound_assign_if_exact(cp1);
+
+  if (!cons_ok)
+    return false;
+
+  CProduct known_cp(3);
+  known_cp.add_congruence((B %= 1) / 0);
+  known_cp.add_congruence((A %= 1) / 3);
+
+  cons_ok = (cp1 == known_cp) && (cp2 == known_cp);
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  return (cons_ok);
+}
+
+// difference_assign(cp2)
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  CProduct cp(1);
+  cp.add_constraint(A <= 18);
+  cp.add_constraint(A >= 18);
+
+  CProduct cp1(cp);
+
+  CProduct cp2(1);
+  cp2.add_congruence((A %= 18) / 20);
+
+  cp1.difference_assign(cp2);
+
+  bool cons_ok = cp1.is_empty();
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+
+  if (!cons_ok)
+    return false;
+
+  cp2.difference_assign(cp1);
+
+  CProduct known_cp(1);
+  known_cp.add_congruence((A %= 18) / 20);
+
+  cons_ok = (cp2 == known_cp);
+
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  return cons_ok;
+}
+
+// time_elapse_assign(y)
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp1(3);
+  cp1.add_constraint(A >= 0);
+  cp1.add_constraint(B >= 0);
+  cp1.add_constraint(A + B >= 3);
+  cp1.add_constraint(2*A - B == 0);
+  cp1.add_constraint(3*A + C == 0);
+  cp1.add_congruence(3*A %= 0);
+
+  CProduct cp2(3);
+  cp2.add_constraint(7*C == 4);
+  cp2.add_constraint(7*B == -1);
+  cp2.add_constraint(7*A == 3);
+
+  cp1.time_elapse_assign(cp2);
+
+  CProduct known_cp(3);
+  known_cp.add_constraint(5*A - 13*B - 7*C == 0);
+  known_cp.add_constraint(3*A + C >= 0);
+  known_cp.add_constraint(A + B >= 3);
+  known_cp.add_constraint(4*A - 3*C >= 13);
+  known_cp.add_congruence((65*A - B %= 0) / 7);
+  known_cp.add_congruence(21*A %= 0);
+
+  bool cons_ok = (cp1 == known_cp);
+
+  print_congruences(cp1, "*** cp1.time_elapse_assign(cp2) congruences ***");
+  print_constraints(cp1, "*** cp1.time_elapse_assign(cp2) constraints ***");
+  print_congruences(cp2, "*** cp2.time_elapse_assign(cp2) congruences ***");
+  print_constraints(cp2, "*** cp2.time_elapse_assign(cp2) constraints ***");
+
+  return cons_ok;
+}
+
+// topological_closure_assign
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp(3);
+  cp.add_constraint(B >= 0);
+  cp.add_constraint(3*A + C == 0);
+  cp.add_constraint(2*A - B == 0);
+  cp.add_congruence(3*A %= 0);
+#ifdef PH_IS_NNC
+  cp.add_constraint(A > 0);
+#else
+  cp.add_constraint(A >= 0);
+#endif
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  cp.topological_closure_assign();
+
+  CProduct known_cp(3);
+  known_cp.add_constraint(B >= 0);
+  known_cp.add_constraint(3*A + C == 0);
+  known_cp.add_constraint(2*A - B == 0);
+  known_cp.add_congruence(3*A %= 0);
+  known_cp.add_constraint(A >= 0);
+
+  bool cons_ok = (cp == known_cp);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return cons_ok;
+}
+
+// widening_assign
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp_prev(3);
+  cp_prev.add_constraint(C == 0);
+  cp_prev.add_constraint(A - B >= 1);
+  cp_prev.add_constraint(A <= 2);
+  cp_prev.add_constraint(B >= 0);
+  cp_prev.add_congruence((B %= 0) / 2);
+  cp_prev.add_congruence(3*A %= 0);
+
+  print_congruences(cp_prev, "*** cp_prev congruences ***");
+  print_constraints(cp_prev, "*** cp_prev constraints ***");
+
+  CProduct cp(3);
+  cp.add_constraint(C == 0);
+  cp.add_constraint(A <= 2);
+  cp.add_constraint(B >= 0);
+  cp.add_constraint(2*A - B >= 2);
+  cp.add_constraint(B >= 0);
+  cp.add_congruence(6*A %= 0);
+  cp.add_congruence((B %= 0) / 2);
+
+  cp.upper_bound_assign(cp_prev);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  cp.widening_assign(cp_prev);
+
+  CProduct known_cp(3);
+  known_cp.add_constraint(C == 0);
+  known_cp.add_constraint(A <= 2);
+  known_cp.add_constraint(B >= 0);
+  known_cp.add_congruence((B %= 0) / 2);
+
+  bool cons_ok = (cp == known_cp);
+
+  print_congruences(cp, "*** cp.widening_assign(cp_prev) congruences ***");
+  print_constraints(cp, "*** cp.widening_assign(cp_prev) constraints ***");
+
+  return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_F8(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST_F8(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/partiallyreducedproduct3.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
new file mode 100644
index 0000000..31397ec
--- /dev/null
+++ b/tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
@@ -0,0 +1,755 @@
+/* Test Partially_Reduced_Product<>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#define PH_IS_NNC
+// #define PH_IS_FIRST
+
+#ifdef PH_IS_NNC
+typedef NNC_Polyhedron Poly;
+#else
+typedef C_Polyhedron Poly;
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product DProduct;
+typedef Domain_Product<Poly, Grid>::Smash_Product SProduct;
+typedef Domain_Product<Poly, Grid>::Constraints_Product CProduct;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product DProduct;
+typedef Domain_Product<Grid, Poly>::Smash_Product SProduct;
+typedef Domain_Product<Grid, Poly>::Constraints_Product CProduct;
+#endif
+
+namespace {
+
+// relation_with a generator
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator pnt(point(A + B));
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 1);
+  CProduct cp(2);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+
+  bool smash_ok = Poly_Gen_Relation::subsumes() == sp.relation_with(pnt);
+  bool cons_ok = Poly_Gen_Relation::subsumes() == cp.relation_with(pnt);
+
+  if (!smash_ok) {
+    print_constraints(sp, "*** sp constraints subsumes ***");
+    print_congruences(sp, "*** sp congruences subsumes ***");
+    return false;
+  }
+
+  if (!cons_ok) {
+    print_constraints(cp, "*** cp constraints subsumes ***");
+    print_congruences(cp, "*** cp congruences subsumes ***");
+    return false;
+  }
+
+  sp.add_congruence((A %= 0) / 2);
+  cp.add_congruence((A %= 0) / 2);
+
+  smash_ok = Poly_Gen_Relation::nothing() == sp.relation_with(pnt);
+  cons_ok = Poly_Gen_Relation::nothing() == cp.relation_with(pnt);
+
+  print_constraints(sp, "*** sp constraints nothing ***");
+  print_congruences(sp, "*** sp congruences nothing ***");
+  print_constraints(cp, "*** cp constraints nothing ***");
+  print_congruences(cp, "*** cp congruences nothing ***");
+
+  return smash_ok && cons_ok;
+}
+
+// Empty smash product; relation_with a constraint.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 1);
+  sp.add_congruence((A %= 2) / 0);
+
+  bool ok = (sp.relation_with(B == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates())
+	     && sp.relation_with(B >= 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+
+  return ok;
+}
+
+// Empty constraints product; relation_with a constraint.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  CProduct cp(2);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+  cp.add_congruence((A %= 0) / 2);
+
+  bool ok = (cp.relation_with(B == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates())
+	     && cp.relation_with(B >= 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::is_disjoint()
+	         && Poly_Con_Relation::saturates()));
+
+  print_constraints(cp, "*** cp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return ok;
+}
+
+// Non-empty smash product; relation_with a constraint.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_constraint(3*A + 3*B + C == 7);
+  sp.add_constraint(3*A - C >= 2);
+  sp.add_congruence(6*A + 3*B %= 0);
+
+  bool ok = (sp.relation_with(A + B + C == 0)
+	     == Poly_Con_Relation::nothing()
+	     && sp.relation_with(A + B == 0)
+	     == Poly_Con_Relation::nothing()
+	     && sp.relation_with(A == 0)
+	     == Poly_Con_Relation::nothing()
+	     && sp.relation_with(Linear_Expression(0) == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates())
+	     && sp.relation_with(2*A + B >= 3)
+	     == Poly_Con_Relation::is_included()
+	     && sp.relation_with(3*A + 3*B + C >= 7)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates())
+	     && sp.relation_with(3*A - C <= 3)
+	     == (Poly_Con_Relation::nothing()));
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+
+  return ok;
+}
+
+// A non-empty constraints product; relation_with a constraint.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp(3);
+  cp.add_constraint(3*A + 3*B + C >= 7);
+  cp.add_constraint(3*A + 3*B + C <= 7);
+  cp.add_constraint(3*A - C >= 2);
+  cp.add_congruence(6*A + 3*B %= 0);
+
+  bool ok = (cp.relation_with(A + B + C == 0)
+	     == Poly_Con_Relation::nothing()
+	     && cp.relation_with(A + B == 0)
+	     == Poly_Con_Relation::nothing()
+	     && cp.relation_with(A == 0)
+	     == Poly_Con_Relation::nothing()
+	     && cp.relation_with(Linear_Expression(0) == 0)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates())
+	     && cp.relation_with(2*A + B >= 3)
+	     == Poly_Con_Relation::is_included()
+	     && cp.relation_with(3*A + 3*B + C >= 7)
+	     == (Poly_Con_Relation::is_included()
+		 && Poly_Con_Relation::saturates())
+	     && cp.relation_with(3*A - C <= 3)
+	     == (Poly_Con_Relation::nothing()));
+
+  print_constraints(cp, "*** cp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return ok;
+}
+
+// Non-empty smash product; relation_with a congruence.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_constraint(3*A + 3*B + C == 7);
+  sp.add_constraint(3*A - C >= 2);
+  sp.add_congruence(6*A + 3*B %= 0);
+
+  Poly_Con_Relation rel1 = sp.relation_with(A + B + C %= 0);
+  Poly_Con_Relation rel2 = sp.relation_with(A + B %= 0);
+  Poly_Con_Relation rel3 = sp.relation_with(A %= 0);
+  Poly_Con_Relation rel4 = sp.relation_with(Linear_Expression(0) %= 0);
+  Poly_Con_Relation rel5 = sp.relation_with(2*A + B %= 3);
+  Poly_Con_Relation rel6 = sp.relation_with(3*A + 3*B + C %= 7);
+  Poly_Con_Relation rel7 = sp.relation_with(3*A - C %= 3);
+  bool ok = (rel1 == Poly_Con_Relation::nothing()
+	     && rel2 == Poly_Con_Relation::nothing()
+	     && rel3 == Poly_Con_Relation::nothing()
+	     && rel4 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates())
+	     && rel5 == Poly_Con_Relation::nothing()
+	     && rel6 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates())
+	     && rel7 == (Poly_Con_Relation::is_included()));
+
+  nout << "sp.relation_with(A + B + C %= 0) == " << rel1 << endl;
+  nout << "sp.relation_with(A + B %= 0) == " << rel2 << endl;
+  nout << "sp.relation_with(A %= 0) == " << rel3 << endl;
+  nout << "sp.relation_with(Linear_Expression(0) %= 0) == " << rel4 << endl;
+  nout << "sp.relation_with(2*A + B %= 3) == " << rel5 << endl;
+  nout << "sp.relation_with(3*A + 3*B + C %= 7) == " << rel6 << endl;
+  nout << "sp.relation_with(3*A - C %= 3) == " << rel7 << endl;
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+
+  return ok;
+}
+
+// A non-empty constraints product; relation_with a congruence.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp(3);
+  cp.add_constraint(3*A + 3*B + C >= 7);
+  cp.add_constraint(3*A + 3*B + C <= 7);
+  cp.add_constraint(3*A - C >= 2);
+  cp.add_congruence(6*A + 3*B %= 0);
+
+  Poly_Con_Relation rel1 = cp.relation_with(A + B + C %= 0);
+  Poly_Con_Relation rel2 = cp.relation_with(A + B %= 0);
+  Poly_Con_Relation rel3 = cp.relation_with(A %= 0);
+  Poly_Con_Relation rel4 = cp.relation_with(Linear_Expression(0) %= 0);
+  Poly_Con_Relation rel5 = cp.relation_with(2*A + B %= 3);
+  Poly_Con_Relation rel6 = cp.relation_with(3*A + 3*B + C %= 7);
+  Poly_Con_Relation rel7 = cp.relation_with(3*A - C %= 3);
+  bool ok = (rel1 == Poly_Con_Relation::nothing()
+	     && rel2 == Poly_Con_Relation::nothing()
+	     && rel3 == Poly_Con_Relation::nothing()
+	     && rel4 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates())
+	     && rel5 == Poly_Con_Relation::nothing()
+	     && rel6 == (Poly_Con_Relation::is_included()
+			 && Poly_Con_Relation::saturates())
+	     && rel7 == (Poly_Con_Relation::is_included()));
+
+  nout << "cp.relation_with(A + B + C %= 0) == " << rel1 << endl;
+  nout << "cp.relation_with(A + B %= 0) == " << rel2 << endl;
+  nout << "cp.relation_with(A %= 0) == " << rel3 << endl;
+  nout << "cp.relation_with(Linear_Expression(0) %= 0) == " << rel4 << endl;
+  nout << "cp.relation_with(2*A + B %= 3) == " << rel5 << endl;
+  nout << "cp.relation_with(3*A + 3*B + C %= 7) == " << rel6 << endl;
+  nout << "cp.relation_with(3*A - C %= 3) == " << rel7 << endl;
+  print_constraints(cp, "*** cp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return ok;
+}
+
+// Smash product; bounds_from_above() and bounds_from_below() when bounded.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 1);
+  sp.add_congruence((A %= 2) / 0);
+
+  Linear_Expression le = A + B;
+  bool ok = sp.bounds_from_above(le)
+    && sp.bounds_from_below(le);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// Constraints product; bounds_from_above() and bounds_from_below()
+// when bounded.
+bool
+  test09() {
+  Variable A(0);
+  Variable B(1);
+
+  CProduct cp(2);
+  cp.add_constraint(A >= 1);
+  cp.add_constraint(A <= 1);
+  cp.add_congruence((A %= 0) / 2);
+
+  Linear_Expression le = A + B;
+  bool ok = cp.bounds_from_above(le)
+    && cp.bounds_from_below(le);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// Smash product; bounds_from_above() and bounds_from_below()
+// when not bounded.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 1);
+  sp.add_congruence((A %= 0) / 2);
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !sp.bounds_from_above(le)
+    && !sp.bounds_from_below(le);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// Constraints product; bounds_from_above() and bounds_from_below()
+// when it is not bounded.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  sp.add_constraint(A >= 1);
+  sp.add_constraint(A <= 1);
+  sp.add_congruence((A %= 1) / 2);
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !sp.bounds_from_above(le)
+    && !sp.bounds_from_below(le);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// Smash product; maximize() and minimize() when bounded.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  sp.add_constraint(A + B >= 1);
+  sp.add_constraint(A + B <= 1);
+  sp.add_congruence(B %= 0);
+  sp.add_congruence((3*A %= 2) / 5);
+
+  Linear_Expression le = A + B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = sp.maximize(le, max_n, max_d, max)
+    && sp.minimize(le, min_n, min_d, min)
+    && sp.maximize(le, max_n, max_d, max, pnt_max)
+    && sp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+    && pnt_max == pnt_min;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// Constraints product; maximize() and minimize() when bounded.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  CProduct cp(2);
+  cp.add_constraint(A + B >= 1);
+  cp.add_constraint(A + B <= 1);
+  cp.add_congruence(B %= 0);
+
+  Linear_Expression le = A + B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = cp.maximize(le, max_n, max_d, max)
+    && cp.minimize(le, min_n, min_d, min)
+    && cp.maximize(le, max_n, max_d, max, pnt_max)
+    && cp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+    && pnt_max == pnt_min;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  if (!ok) {
+    print_congruences(cp, "*** cp congruences non-empty product ***");
+    print_constraints(cp, "*** cp constraints non-empty product ***");
+    return false;
+  }
+
+  cp.add_congruence((3*A %= 2) / 3);
+
+  ok = !cp.maximize(le, max_n, max_d, max)
+    && !cp.minimize(le, min_n, min_d, min)
+    && !cp.maximize(le, max_n, max_d, max, pnt_max)
+    && !cp.minimize(le, min_n, min_d, min, pnt_min);
+
+  print_congruences(cp, "*** cp congruences empty product ***");
+  print_constraints(cp, "*** cp constraints empty product ***");
+
+  return ok;
+}
+
+// Smash and constraints product; maximize() and minimize()
+// when not bounded.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  sp.add_constraint(B >= 1);
+  sp.add_constraint(B <= 2);
+  sp.add_congruence((B %= 3) / 5);
+
+  CProduct cp(2);
+  cp.add_constraint(B >= 1);
+  cp.add_constraint(B <= 2);
+  cp.add_congruence((B %= 3) / 5);
+
+  Linear_Expression le = 2*A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool smash_ok = !sp.maximize(le, max_n, max_d, max)
+    && !sp.minimize(le, min_n, min_d, min)
+    && !sp.maximize(le, max_n, max_d, max, pnt_max)
+    && !sp.minimize(le, min_n, min_d, min, pnt_min);
+
+  bool cons_ok = !cp.maximize(le, max_n, max_d, max)
+    && !cp.minimize(le, min_n, min_d, min)
+    && !cp.maximize(le, max_n, max_d, max, pnt_max)
+    && !cp.minimize(le, min_n, min_d, min, pnt_min);
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(cp, "*** cp congruences ***");
+  print_congruences(cp, "*** cp congruences ***");
+
+  return smash_ok && cons_ok;
+}
+
+// Smash product; bounded_affine_image/3
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_congruence((A ==  0) / 0);
+  sp.add_congruence((B ==  0) / 0);
+  sp.add_congruence((C == -2) / 0);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  sp.bounded_affine_image(A, 7-B, B+3);
+
+  SProduct known_sp(3);
+  known_sp.add_constraint(C == -2);
+  known_sp.add_constraint(B == 0);
+  known_sp.add_constraint(A <= 3);
+  known_sp.add_constraint(A + B >= 7);
+
+  bool ok = (sp == known_sp);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// Constraints product; bounded_affine_image/3.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp(3);
+  cp.add_constraint(A >=  0);
+  cp.add_constraint(A <=  0);
+  cp.add_constraint(B >=  0);
+  cp.add_constraint(B <=  0);
+  cp.add_congruence((C == -2) / 0);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  cp.bounded_affine_image(A, 7-B, B+3);
+
+  CProduct known_cp(3);
+  known_cp.add_constraint(C == -2);
+  known_cp.add_constraint(B == 0);
+  known_cp.add_constraint(A <= 3);
+  known_cp.add_constraint(A + B >= 7);
+
+  bool ok = (cp == known_cp);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// Smash product; bounded_affine_preimage/3.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.add_congruence((A ==  0) / 0);
+  sp.add_congruence((B ==  0) / 0);
+  sp.add_congruence((C == -2) / 0);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  sp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Constraint_System cs;
+  cs.insert(C == -2);
+  cs.insert(B == 0);
+  cs.insert(C >= 3);
+
+  SProduct known_sp(3);
+  known_sp.add_constraints(cs);
+
+  bool ok = (sp == known_sp);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// Constraints product; bounded_affine_preimage/3.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  CProduct cp(3);
+  cp.add_constraint(A >=  0);
+  cp.add_constraint(A <=  0);
+  cp.add_constraint(B >=  0);
+  cp.add_constraint(B <=  0);
+  cp.add_congruence((C == -2) / 0);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  cp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Constraint_System cs;
+  cs.insert(C == -2);
+  cs.insert(B == 0);
+  cs.insert(C >= 3);
+
+  CProduct known_cp(3);
+  known_cp.add_constraints(cs);
+
+  bool ok = (cp == known_cp);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok;
+}
+
+// concatenate_assign()
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  SProduct sp1(2);
+  sp1.add_constraint(A >= 0);
+  sp1.add_congruence((A %= 0) / 2);
+
+  // Make sure sp1 is reduced;
+  (void) sp1.is_topologically_closed();
+
+  SProduct sp2(2);
+  // Make sure sp2 is not reduced;
+  sp2.add_constraint(A <= 1);
+  sp2.add_constraint(A >= 2);
+  sp2.add_constraint(B >= 0);
+
+  sp1.concatenate_assign(sp2);
+
+  SProduct known_sp(4, EMPTY);
+
+  bool ok = (sp1 == known_sp) && sp1.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  CProduct cp1(2);
+  cp1.add_constraint(A >= 0);
+  cp1.add_congruence((A %= 0) / 2);
+
+  // Make sure cp1 is reduced;
+  (void) cp1.is_topologically_closed();
+
+  CProduct cp2(2);
+  // Make sure cp2 is not reduced;
+  cp2.add_constraint(A <= 1);
+  cp2.add_constraint(A >= 1);
+  cp2.add_constraint(B >= 0);
+
+  cp1.concatenate_assign(cp2);
+
+  CProduct known_cp(4);
+  known_cp.add_constraint(A >= 0);
+  known_cp.add_congruence((A %= 0) / 2);
+  known_cp.add_constraint(C == 1);
+  known_cp.add_constraint(D >= 0);
+
+  bool ok = (cp1 == known_cp) && cp1.OK();
+
+  print_congruences(cp1, "*** cp1 congruences ***");
+  print_constraints(cp1, "*** cp1 constraints ***");
+  print_congruences(cp2, "*** cp2 congruences ***");
+  print_constraints(cp2, "*** cp2 constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/partiallyreducedproduct4.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
new file mode 100644
index 0000000..cf12a89
--- /dev/null
+++ b/tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
@@ -0,0 +1,278 @@
+/* Test Partially_Reduced_Product<>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+// #define PH_IS_NNC
+// #define PH_IS_FIRST
+
+// #define PH_IS_BOX
+
+#ifdef PH_IS_NNC
+#define PH_IS_BOX_OR_NNC
+#endif
+#ifdef PH_IS_BOX
+#define PH_IS_BOX_OR_NNC
+#endif
+
+#ifdef PH_IS_BOX
+typedef TBox Poly;
+#else
+#ifdef PH_IS_NNC
+typedef NNC_Polyhedron Poly;
+#else
+typedef C_Polyhedron Poly;
+#endif
+#endif
+
+#ifdef PH_IS_FIRST
+typedef Domain_Product<Poly, Grid>::Direct_Product DProduct;
+typedef Domain_Product<Poly, Grid>::Smash_Product SProduct;
+typedef Domain_Product<Poly, Grid>::Constraints_Product CProduct;
+#else
+typedef Domain_Product<Grid, Poly>::Direct_Product DProduct;
+typedef Domain_Product<Grid, Poly>::Smash_Product SProduct;
+typedef Domain_Product<Grid, Poly>::Constraints_Product CProduct;
+#endif
+
+namespace {
+
+// remove_higher_dimensions()
+// The initial product is empty with 1 space dimension
+// and this dimension is removed.
+bool
+test01() {
+  Variable A(0);
+
+  SProduct sp1(1);
+  CProduct cp1(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 0);
+  sp1.add_constraints(cs);
+  cp1.add_constraints(cs);
+  SProduct sp2(sp1);
+  CProduct cp2(cp1);
+
+  bool ok1s = (sp1 == sp2 && sp2.is_empty());
+  if (!ok1s || !sp1.OK()) {
+    print_congruences(sp1, "*** after == check: sp1 congruences ***");
+    print_constraints(sp1, "*** after == check: sp1 constraints ***");
+    return false;
+  }
+
+  bool ok1 = (cp1 == cp2 && cp2.is_empty());
+  if (!ok1 || !cp1.OK()) {
+    print_congruences(cp1, "*** after == check: cp1 congruences ***");
+    print_constraints(cp1, "*** after == check: cp1 constraints ***");
+    return false;
+  }
+
+  sp1.remove_higher_space_dimensions(0);
+
+  if (!sp1.OK()) {
+    print_congruences(sp1, "*** remove all dimensions: sp1 congruences ***");
+    print_constraints(sp1, "*** remove all dimensions: sp1 constraints ***");
+    return false;
+  }
+
+  cp1.remove_higher_space_dimensions(0);
+
+  bool ok = cp1.OK();
+
+  print_congruences(cp1, "*** remove all dimensions: cp1 congruences ***");
+  print_constraints(cp1, "*** remove all dimensions: cp1 constraints ***");
+
+  return ok;
+}
+
+// upper_bound_assign(cp2)
+// The first product is empty and the second a single point in 1D
+bool
+test02() {
+  Variable A(0);
+
+  SProduct sp1(1);
+  CProduct cp1(1);
+  Constraint_System cs1;
+  cs1.insert(A >= 1);
+  cs1.insert(A <= 0);
+  sp1.add_constraints(cs1);
+  cp1.add_constraints(cs1);
+
+  SProduct sp2(1);
+  CProduct cp2(1);
+  Constraint_System cs2;
+  cs2.insert(A == 1);
+  sp2.add_constraints(cs2);
+  cp2.add_constraints(cs2);
+
+  SProduct sp1_copy(sp1);
+  CProduct cp1_copy(cp1);
+
+  sp1.upper_bound_assign(sp2);
+  cp1.upper_bound_assign(cp2);
+
+  if (!sp1.OK()) {
+    print_congruences(sp1, "*** after ok check: sp1 congruences ***");
+    print_constraints(sp1, "*** after ok check: sp1 constraints ***");
+    return false;
+  }
+
+  bool ok = cp1.OK();
+
+  print_congruences(cp1, "*** after OK() check: cp1 congruences ***");
+  print_constraints(cp1, "*** after OK() check: cp1 constraints ***");
+
+  return ok;
+}
+
+// refine_with_constraints() and refine_with_congruences()
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  CProduct cp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 6);
+  sp.add_constraints(cs);
+  cp.add_constraints(cs);
+
+  SProduct known_sp(sp);
+  CProduct known_cp(cp);
+
+  Constraint_System cs1;
+  cs1.insert(A > 2);
+  cs1.insert(B >= 2);
+  Congruence_System cgs1;
+  cgs1.insert((B %= 2) / 4);
+  cgs1.insert((A + B %= 6) / 0);
+  sp.refine_with_constraint(A > 2);
+  sp.refine_with_constraint(B >= 2);
+  sp.refine_with_congruence((B %= 2) / 4);
+  sp.refine_with_congruence((A + B %= 6) / 0);
+  cp.refine_with_constraint(A > 2);
+  cp.refine_with_constraint(B >= 2);
+  cp.refine_with_congruence((B %= 2) / 4);
+  cp.refine_with_congruence((A + B %= 6) / 0);
+
+  bool ok = sp.OK() && cp.OK();
+
+#ifdef PH_IS_BOX_OR_NNC
+  known_sp.add_constraint(A > 2);
+#else
+  known_sp.add_constraint(A >= 2);
+#endif
+  known_sp.add_constraint(B >= 2);
+  known_sp.add_congruence((B %= 2) / 4);
+  known_sp.add_congruence((A + B %= 6) / 0);
+#ifdef PH_IS_BOX_OR_NNC
+  known_cp.add_constraint(A > 2);
+#else
+  known_cp.add_constraint(A >= 2);
+#endif
+  known_cp.add_constraint(B >= 2);
+  known_cp.add_congruence((B %= 2) / 4);
+  known_cp.add_congruence((A + B %= 6) / 0);
+
+  ok = ok && sp == known_sp && cp == known_cp;
+
+  print_congruences(sp, "*** after ok check: sp congruences ***");
+  print_constraints(sp, "*** after ok check: sp constraints ***");
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  return ok;
+}
+
+// refine_with_constraints() and refine_with_congruences()
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(2);
+  CProduct cp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 6);
+  sp.add_constraints(cs);
+  cp.add_constraints(cs);
+
+  SProduct known_sp(sp);
+  CProduct known_cp(cp);
+
+  Constraint_System cs1;
+  cs1.insert(A > 2);
+  cs1.insert(B >= 2);
+  Congruence_System cgs1;
+  cgs1.insert((B %= 2) / 4);
+  cgs1.insert((A + B %= 6) / 0);
+  sp.refine_with_constraints(cs1);
+  sp.refine_with_congruences(cgs1);
+  cp.refine_with_constraints(cs1);
+  cp.refine_with_congruences(cgs1);
+
+  bool ok = sp.OK() && cp.OK();
+
+#ifdef PH_IS_BOX_OR_NNC
+  known_sp.add_constraint(A > 2);
+#else
+  known_sp.add_constraint(A >= 2);
+#endif
+  known_sp.add_constraint(B >= 2);
+  known_sp.add_congruence((B %= 2) / 4);
+  known_sp.add_congruence((A + B %= 6) / 0);
+#ifdef PH_IS_BOX_OR_NNC
+  known_cp.add_constraint(A > 2);
+#else
+  known_cp.add_constraint(A >= 2);
+#endif
+  known_cp.add_constraint(B >= 2);
+  known_cp.add_congruence((B %= 2) / 4);
+  known_cp.add_congruence((A + B %= 6) / 0);
+
+  ok = ok && sp == known_sp && cp == known_cp;
+
+  print_congruences(sp, "*** after ok check: sp congruences ***");
+  print_constraints(sp, "*** after ok check: sp constraints ***");
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/Makefile.am b/tests/Polyhedron/Makefile.am
index dc262ea..fbbd3ae 100644
--- a/tests/Polyhedron/Makefile.am
+++ b/tests/Polyhedron/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,8 +27,6 @@ TESTS_ENVIRONMENT = $(CHECKER)
 
 AM_CPPFLAGS = \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog \
--I$(top_builddir)/Watchdog/src \
 -I$(top_srcdir)/utils \
 -I$(top_srcdir)/tests \
 @extra_includes@ \
@@ -41,146 +39,165 @@ $(top_builddir)/src/libppl.la \
 @extra_libraries@
 
 ORIGINAL_TESTS = \
-	addcongruence1 \
-	addcongruences1 \
-	addconstraint1 \
-	addconstraints1 addconstraints2 \
-	addgenerator1 addgenerator2 \
-	addgenerators1 addgenerators2 \
-	addspacedims1 addspacedims2 \
-	affineimage1 affineimage2 \
-	affinepreimage1 \
-	affinetrans \
-	append1 append2 \
-	ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
-	bgp99extrapolation1 \
-	bhrz03widening1 bhrz03widening2 bhrz03widening3 \
-	bhz03widening1 \
-	bounded1 \
-	boundedaffineimage1 \
-	boundedaffinepreimage1 \
-	boundedbhrz03extrapolation1 \
-	boundedh79extrapolation1 \
-	boundingbox1 boundingbox2 boundingbox3 \
-	bounds1 \
-	cnncconversion1 \
-	concatenate1 \
-	congruences1 \
-	constraints1 \
-	contains1 contains2 \
-	disjoint1 disjoint2 \
-	dualhypercubes \
-	empty1 \
-	equals1 \
-	exceptions1 exceptions2  exceptions3 \
-	expandspacedim1 expandspacedim2 \
-	foldspacedims1 foldspacedims2 \
-	generalizedaffineimage1 generalizedaffineimage2 \
-	generalizedaffinepreimage1 generalizedaffinepreimage2 \
-	generators1 \
-	geomcovers1 \
-	h79widening1 h79widening2 \
-	intersection1 \
-	limitedbhrz03extrapolation1 \
-	limitedh79extrapolation1 \
-	linearpartition1 \
-	linexpression1 \
-	linearsystem1 \
-	lpproblem1 \
-	mapspacedims1 \
-	matrix1 \
-	max_min1 \
-	maxspacedim1 \
-	mc91 \
-	membytes1 membytes2 \
-	memory1 memory2 \
-	minconstraints1 minconstraints2 \
-	mingenerators1 mingenerators2 \
-	nncminimize1 nncminimize2 \
-	numberinput1 \
-	onepoint \
-	permute \
-	polydifference1 polydifference2 \
-	polyhull1 polyhull2 \
-	polypowerset1 \
-	powerset1 \
-	randphull1 randphull2 \
-	relations1 relations2 relations3 \
-	removespacedims1 removespacedims2 \
-	smm1 \
-	timeelapse1 timeelapse2 \
-	topclosed1 \
-	topclosure1 \
-	universe1 universe2 \
-	writeconsys1 \
-	writegensys1 \
-	writepolyhedron1 writepolyhedron2 \
-	writerelation1 \
-	writevariable1
+hybrid \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 addconstraints2 \
+addgenerator1 addgenerator2 \
+addgenerators1 addgenerators2 \
+addspacedims1 addspacedims2 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+affinetrans \
+append1 append2 \
+ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+bgp99extrapolation1 \
+bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boundedbhrz03extrapolation1 \
+boundedh79extrapolation1 \
+bounds1 \
+cnncconversion1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 contains2 \
+containsintegerpoint1 \
+disjoint1 disjoint2 \
+dualhypercubes \
+empty1 \
+equals1 \
+exceptions1 exceptions2  exceptions3 \
+expandspacedim1 expandspacedim2 \
+foldspacedims1 foldspacedims2 \
+frombdshape1 \
+frombox1 frombox2 \
+fromgrid1 \
+fromoctagonalshape1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generators1 \
+geomcovers1 \
+h79widening1 h79widening2 \
+intersection1 \
+simplifyusingcontext1 \
+limitedbhrz03extrapolation1 \
+limitedh79extrapolation1 \
+linearpartition1 \
+linexpression1 \
+linearsystem1 \
+mapspacedims1 \
+matrix1 \
+max_min1 \
+maxspacedim1 \
+mc91 \
+membytes1 \
+memory1 memory2 \
+minconstraints1 minconstraints2 \
+mingenerators1 mingenerators2 \
+nncminimize1 nncminimize2 \
+numberinput1 \
+onepoint \
+permute \
+polydifference1 polydifference2 \
+polyhull1 polyhull2 \
+randphull1 \
+refinewithconstraint1 \
+refinewithconstraints1 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+smm1 \
+timeelapse1 timeelapse2 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+universe1 universe2 \
+variablesset1 \
+writeconsys1 \
+writegensys1 \
+writepolyhedron1 writepolyhedron2 \
+writerelation1 \
+writevariable1
 
 DERIVED_TESTS = \
-	nnc_addcongruence1 \
-	nnc_addcongruences1 \
-	nnc_addconstraint1 \
-	nnc_addconstraints1 \
-	nnc_addgenerator1 \
-	nnc_addgenerators1 \
-	nnc_addspacedims1 \
-	nnc_affineimage1 \
-	nnc_affinepreimage1 \
-	nnc_affinetrans \
-	nnc_append1 nnc_append2 \
-	nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
-	nnc_bgp99extrapolation1 \
-	nnc_bhrz03widening1 nnc_bhrz03widening2 \
-	nnc_bounded1 \
-	nnc_boundedaffineimage1 \
-	nnc_boundedaffinepreimage1 \
-	nnc_boundedbhrz03extrapolation1 \
-	nnc_boundedh79extrapolation1 \
-	nnc_boundingbox1 nnc_boundingbox2 \
-	nnc_bounds1 \
-	nnc_concatenate1 \
-	nnc_congruences1 \
-	nnc_constraints1 \
-	nnc_contains1 \
-	nnc_disjoint1 \
-	nnc_empty1 \
-	nnc_equals1 \
-	nnc_exceptions1 nnc_exceptions3 \
-	nnc_expandspacedim1 \
-	nnc_foldspacedims1 \
-	nnc_generalizedaffineimage1 \
-	nnc_generalizedaffinepreimage1 \
-	nnc_generators1 \
-	nnc_geomcovers1 \
-	nnc_h79widening1 \
-	nnc_intersection1 \
-	nnc_limitedbhrz03extrapolation1 \
-	nnc_limitedh79extrapolation1 \
-	nnc_linearpartition1 \
-	nnc_mapspacedims1 \
-	nnc_max_min1 \
-	nnc_mc91 \
-	nnc_membytes1 nnc_membytes2 \
-	nnc_minconstraints1 \
-	nnc_mingenerators1 \
-	nnc_onepoint \
-	nnc_permute \
-	nnc_polydifference1 \
-	nnc_polyhull1 \
-	nnc_randphull1 nnc_randphull2 \
-	nnc_relations1 nnc_relations2 \
-	nnc_removespacedims1 \
-	nnc_smm1 \
-	nnc_timeelapse1 \
-	nnc_universe1 \
-	nnc_writepolyhedron1
+nnc_addcongruence1 \
+nnc_addcongruences1 \
+nnc_addconstraint1 \
+nnc_addconstraints1 \
+nnc_addgenerator1 \
+nnc_addgenerators1 \
+nnc_addspacedims1 \
+nnc_affineimage1 \
+nnc_affinepreimage1 \
+nnc_affinetrans \
+nnc_append1 nnc_append2 \
+nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+nnc_bgp99extrapolation1 \
+nnc_bhrz03widening1 nnc_bhrz03widening2 \
+nnc_bounded1 \
+nnc_boundedaffineimage1 \
+nnc_boundedaffinepreimage1 \
+nnc_boundedbhrz03extrapolation1 \
+nnc_boundedh79extrapolation1 \
+nnc_bounds1 \
+nnc_concatenate1 \
+nnc_congruences1 \
+nnc_constrains1 \
+nnc_constraints1 \
+nnc_contains1 \
+nnc_containsintegerpoint1 \
+nnc_disjoint1 \
+nnc_empty1 \
+nnc_equals1 \
+nnc_exceptions1 nnc_exceptions3 \
+nnc_expandspacedim1 \
+nnc_foldspacedims1 \
+nnc_frombdshape1 \
+nnc_frombox1 \
+nnc_fromgrid1 \
+nnc_fromoctagonalshape1 \
+nnc_generalizedaffineimage1 \
+nnc_generalizedaffinepreimage1 \
+nnc_generators1 \
+nnc_geomcovers1 \
+nnc_h79widening1 \
+nnc_intersection1 \
+nnc_simplifyusingcontext1 \
+nnc_limitedbhrz03extrapolation1 \
+nnc_limitedh79extrapolation1 \
+nnc_linearpartition1 \
+nnc_mapspacedims1 \
+nnc_max_min1 \
+nnc_mc91 \
+nnc_membytes1 \
+nnc_minconstraints1 \
+nnc_mingenerators1 \
+nnc_onepoint \
+nnc_permute \
+nnc_polydifference1 \
+nnc_polyhull1 \
+nnc_randphull1 \
+nnc_relations1 nnc_relations2 \
+nnc_removespacedims1 \
+nnc_smm1 \
+nnc_timeelapse1 \
+nnc_unconstrain1 \
+nnc_universe1 \
+nnc_writepolyhedron1
 
 #
 # Sources for the tests
 #
 
+hybrid_SOURCES = hybrid.cc
+
 addcongruence1_SOURCES = addcongruence1.cc
 
 addcongruences1_SOURCES = addcongruences1.cc
@@ -231,10 +248,6 @@ boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
 
 boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
 
-boundingbox1_SOURCES = boundingbox1.cc
-boundingbox2_SOURCES = boundingbox2.cc
-boundingbox3_SOURCES = boundingbox3.cc
-
 bounds1_SOURCES = bounds1.cc
 
 cnncconversion1_SOURCES = cnncconversion1.cc
@@ -243,11 +256,15 @@ concatenate1_SOURCES = concatenate1.cc
 
 congruences1_SOURCES = congruences1.cc
 
+constrains1_SOURCES = constrains1.cc
+
 constraints1_SOURCES = constraints1.cc
 
 contains1_SOURCES = contains1.cc
 contains2_SOURCES = contains2.cc
 
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
 disjoint1_SOURCES = disjoint1.cc
 disjoint2_SOURCES = disjoint2.cc
 
@@ -267,6 +284,15 @@ expandspacedim2_SOURCES = expandspacedim2.cc
 foldspacedims1_SOURCES = foldspacedims1.cc
 foldspacedims2_SOURCES = foldspacedims2.cc
 
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+frombox2_SOURCES = frombox2.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
 generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
 
@@ -282,6 +308,8 @@ h79widening2_SOURCES = h79widening2.cc
 
 intersection1_SOURCES = intersection1.cc
 
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
 limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
 
 limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
@@ -292,8 +320,6 @@ linexpression1_SOURCES = linexpression1.cc
 
 linearsystem1_SOURCES = linearsystem1.cc
 
-lpproblem1_SOURCES = lpproblem1.cc
-
 mapspacedims1_SOURCES = mapspacedims1.cc
 
 matrix1_SOURCES = matrix1.cc
@@ -305,7 +331,6 @@ maxspacedim1_SOURCES = maxspacedim1.cc
 mc91_SOURCES = mc91.cc
 
 membytes1_SOURCES = membytes1.cc
-membytes2_SOURCES = membytes2.cc
 
 memory1_SOURCES = memory1.cc
 memory2_SOURCES = memory2.cc
@@ -331,13 +356,13 @@ polydifference2_SOURCES = polydifference2.cc
 polyhull1_SOURCES = polyhull1.cc
 polyhull2_SOURCES = polyhull2.cc
 
-polypowerset1_SOURCES = polypowerset1.cc
-
-powerset1_SOURCES = powerset1.cc
-
 randphull1_SOURCES = randphull1.cc
-randphull2_SOURCES = randphull2.cc
-randphull2_LDADD = $(LDADD) -lm
+randphull1_LDADD = $(LDADD) -lm
+
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
 
 relations1_SOURCES = relations1.cc
 relations2_SOURCES = relations2.cc
@@ -355,9 +380,13 @@ topclosed1_SOURCES = topclosed1.cc
 
 topclosure1_SOURCES = topclosure1.cc
 
+unconstrain1_SOURCES = unconstrain1.cc
+
 universe1_SOURCES = universe1.cc
 universe2_SOURCES = universe2.cc
 
+variablesset1_SOURCES = variablesset1.cc
+
 writeconsys1_SOURCES = writeconsys1.cc
 
 writegensys1_SOURCES = writegensys1.cc
@@ -438,11 +467,6 @@ nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
 nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
-nnc_boundingbox1_SOURCES = boundingbox1.cc
-nnc_boundingbox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_boundingbox2_SOURCES = boundingbox2.cc
-nnc_boundingbox2_CXXFLAGS = $(DERIVED_CXXFLAGS)
-
 nnc_bounds1_SOURCES = bounds1.cc
 nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
@@ -452,12 +476,18 @@ nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_congruences1_SOURCES = congruences1.cc
 nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
+nnc_constrains1_SOURCES = constrains1.cc
+nnc_constrains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
 nnc_constraints1_SOURCES = constraints1.cc
 nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
 nnc_contains1_SOURCES = contains1.cc
 nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
+nnc_containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+nnc_containsintegerpoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
 nnc_disjoint1_SOURCES = disjoint1.cc
 nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
@@ -478,6 +508,18 @@ nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_foldspacedims1_SOURCES = foldspacedims1.cc
 nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
+nnc_frombdshape1_SOURCES = frombdshape1.cc
+nnc_frombdshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_frombox1_SOURCES = frombox1.cc
+nnc_frombox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_fromgrid1_SOURCES = fromgrid1.cc
+nnc_fromgrid1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+nnc_fromoctagonalshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
 nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
@@ -496,6 +538,9 @@ nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_intersection1_SOURCES = intersection1.cc
 nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
+nnc_simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+nnc_simplifyusingcontext1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
 nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
 nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
@@ -516,8 +561,6 @@ nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
 nnc_membytes1_SOURCES = membytes1.cc
 nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_membytes2_SOURCES = membytes2.cc
-nnc_membytes2_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
 nnc_minconstraints1_SOURCES = minconstraints1.cc
 nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
@@ -539,9 +582,7 @@ nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
 nnc_randphull1_SOURCES = randphull1.cc
 nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_randphull2_SOURCES = randphull2.cc
-nnc_randphull2_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_randphull2_LDADD = $(LDADD) -lm
+nnc_randphull1_LDADD = $(LDADD) -lm
 
 nnc_relations1_SOURCES = relations1.cc
 nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
@@ -557,6 +598,9 @@ nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_timeelapse1_SOURCES = timeelapse1.cc
 nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
+nnc_unconstrain1_SOURCES = unconstrain1.cc
+nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
 nnc_universe1_SOURCES = universe1.cc
 nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 
@@ -569,85 +613,23 @@ if BUILD_WATCHDOG_LIBRARY
 WATCHDOG_TESTS = watchdog1
 
 watchdog1_SOURCES = $(watchdog1_SRCS)
+watchdog1_CPPFLAGS = \
+$(AM_CPPFLAGS) \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src
 watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
 
 endif BUILD_WATCHDOG_LIBRARY
 
 TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
 
-XFAIL_ALWAYS =
-
-XFAIL_WITH_INT64 = \
-$(XFAIL_ALWAYS) \
-randphull2 \
-nnc_randphull2
-
-XFAIL_WITH_INT32 = \
-$(XFAIL_WITH_INT64)
-
-XFAIL_WITH_INT16 = \
-$(XFAIL_WITH_INT32)
-
-XFAIL_WITH_INT8 = \
-$(XFAIL_WITH_INT16) \
-membytes1 \
-randphull1 \
-smm1 \
-nnc_membytes1 \
-nnc_randphull1 \
-nnc_smm1
-
-XFAIL_WITH_INT8_A = \
-$(XFAIL_WITH_INT8) \
-membytes2 \
-nnc_membytes2
-
-if USE_INT64
-
-XFAIL_SET = $(XFAIL_WITH_INT64)
-
-else !USE_INT64
-if USE_INT32
-
-XFAIL_SET = $(XFAIL_WITH_INT32)
-
-else !USE_INT32
-if USE_INT16
-
-XFAIL_SET = $(XFAIL_WITH_INT16)
-
-else !USE_INT16
-if USE_INT8
-
-if ASSERTIONS_ENABLED
-
-XFAIL_SET = $(XFAIL_WITH_INT8_A)
-
-else !ASSERTIONS_ENABLED
-
-XFAIL_SET = $(XFAIL_WITH_INT8)
-
-endif !ASSERTIONS_ENABLED
-
-else !USE_INT8
-
-XFAIL_SET = $(XFAIL_ALWAYS)
-
-endif !USE_INT8
-endif !USE_INT16
-endif !USE_INT32
-endif !USE_INT64
-
-XFAIL_TESTS = $(XFAIL_SET)
+XFAIL_TESTS =
 
 check_PROGRAMS = $(TESTS) $(BUGS)
 
 EXTRA_DIST = $(watchdog1_SRCS)
 
-BUGS = bug2
-
-bug2_SOURCES = bug2.cc
-bug2_CXXFLAGS = -DSRCDIR=\"$(srcdir)\"
+BUGS =
 
 MOSTLYCLEANFILES = \
 ascii_dump_load1.dat \
@@ -655,9 +637,7 @@ ascii_dump_load2.dat \
 ascii_dump_load3.dat \
 matrix1.dat \
 linearsystem1.dat \
-writeconsys1.dat \
 writegensys1.dat \
 writepolyhedron1.dat \
 writepolyhedron2.dat \
-writerelation1.dat \
 writevariable1.dat
diff --git a/tests/Polyhedron/Makefile.in b/tests/Polyhedron/Makefile.in
index ac247c5..3dac32c 100644
--- a/tests/Polyhedron/Makefile.in
+++ b/tests/Polyhedron/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,15 +35,11 @@
 #
 # For the most up-to-date information see the Parma Polyhedra Library
 # site: http://www.cs.unipr.it/ppl/ .
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -57,11 +53,14 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+XFAIL_TESTS =
 check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5)
 subdir = tests/Polyhedron
 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -71,65 +70,79 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
-am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
-	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
-	addconstraints2$(EXEEXT) addgenerator1$(EXEEXT) \
-	addgenerator2$(EXEEXT) addgenerators1$(EXEEXT) \
-	addgenerators2$(EXEEXT) addspacedims1$(EXEEXT) \
-	addspacedims2$(EXEEXT) affineimage1$(EXEEXT) \
-	affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
-	affinetrans$(EXEEXT) append1$(EXEEXT) append2$(EXEEXT) \
-	ascii_dump_load1$(EXEEXT) ascii_dump_load2$(EXEEXT) \
-	ascii_dump_load3$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
-	bhrz03widening1$(EXEEXT) bhrz03widening2$(EXEEXT) \
-	bhrz03widening3$(EXEEXT) bhz03widening1$(EXEEXT) \
-	bounded1$(EXEEXT) boundedaffineimage1$(EXEEXT) \
-	boundedaffinepreimage1$(EXEEXT) \
+am__EXEEXT_1 = hybrid$(EXEEXT) addcongruence1$(EXEEXT) \
+	addcongruences1$(EXEEXT) addconstraint1$(EXEEXT) \
+	addconstraints1$(EXEEXT) addconstraints2$(EXEEXT) \
+	addgenerator1$(EXEEXT) addgenerator2$(EXEEXT) \
+	addgenerators1$(EXEEXT) addgenerators2$(EXEEXT) \
+	addspacedims1$(EXEEXT) addspacedims2$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinetrans$(EXEEXT) append1$(EXEEXT) \
+	append2$(EXEEXT) ascii_dump_load1$(EXEEXT) \
+	ascii_dump_load2$(EXEEXT) ascii_dump_load3$(EXEEXT) \
+	bgp99extrapolation1$(EXEEXT) bhrz03widening1$(EXEEXT) \
+	bhrz03widening2$(EXEEXT) bhrz03widening3$(EXEEXT) \
+	bhz03widening1$(EXEEXT) bounded1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
 	boundedbhrz03extrapolation1$(EXEEXT) \
-	boundedh79extrapolation1$(EXEEXT) boundingbox1$(EXEEXT) \
-	boundingbox2$(EXEEXT) boundingbox3$(EXEEXT) bounds1$(EXEEXT) \
+	boundedh79extrapolation1$(EXEEXT) bounds1$(EXEEXT) \
 	cnncconversion1$(EXEEXT) concatenate1$(EXEEXT) \
-	congruences1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
-	contains2$(EXEEXT) disjoint1$(EXEEXT) disjoint2$(EXEEXT) \
-	dualhypercubes$(EXEEXT) empty1$(EXEEXT) equals1$(EXEEXT) \
-	exceptions1$(EXEEXT) exceptions2$(EXEEXT) exceptions3$(EXEEXT) \
-	expandspacedim1$(EXEEXT) expandspacedim2$(EXEEXT) \
-	foldspacedims1$(EXEEXT) foldspacedims2$(EXEEXT) \
-	generalizedaffineimage1$(EXEEXT) \
+	congruences1$(EXEEXT) constrains1$(EXEEXT) \
+	constraints1$(EXEEXT) contains1$(EXEEXT) contains2$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) disjoint1$(EXEEXT) \
+	disjoint2$(EXEEXT) dualhypercubes$(EXEEXT) empty1$(EXEEXT) \
+	equals1$(EXEEXT) exceptions1$(EXEEXT) exceptions2$(EXEEXT) \
+	exceptions3$(EXEEXT) expandspacedim1$(EXEEXT) \
+	expandspacedim2$(EXEEXT) foldspacedims1$(EXEEXT) \
+	foldspacedims2$(EXEEXT) frombdshape1$(EXEEXT) \
+	frombox1$(EXEEXT) frombox2$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
 	generalizedaffineimage2$(EXEEXT) \
 	generalizedaffinepreimage1$(EXEEXT) \
 	generalizedaffinepreimage2$(EXEEXT) generators1$(EXEEXT) \
 	geomcovers1$(EXEEXT) h79widening1$(EXEEXT) \
 	h79widening2$(EXEEXT) intersection1$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) \
 	limitedbhrz03extrapolation1$(EXEEXT) \
 	limitedh79extrapolation1$(EXEEXT) linearpartition1$(EXEEXT) \
 	linexpression1$(EXEEXT) linearsystem1$(EXEEXT) \
-	lpproblem1$(EXEEXT) mapspacedims1$(EXEEXT) matrix1$(EXEEXT) \
-	max_min1$(EXEEXT) maxspacedim1$(EXEEXT) mc91$(EXEEXT) \
-	membytes1$(EXEEXT) membytes2$(EXEEXT) memory1$(EXEEXT) \
-	memory2$(EXEEXT) minconstraints1$(EXEEXT) \
+	mapspacedims1$(EXEEXT) matrix1$(EXEEXT) max_min1$(EXEEXT) \
+	maxspacedim1$(EXEEXT) mc91$(EXEEXT) membytes1$(EXEEXT) \
+	memory1$(EXEEXT) memory2$(EXEEXT) minconstraints1$(EXEEXT) \
 	minconstraints2$(EXEEXT) mingenerators1$(EXEEXT) \
 	mingenerators2$(EXEEXT) nncminimize1$(EXEEXT) \
 	nncminimize2$(EXEEXT) numberinput1$(EXEEXT) onepoint$(EXEEXT) \
 	permute$(EXEEXT) polydifference1$(EXEEXT) \
 	polydifference2$(EXEEXT) polyhull1$(EXEEXT) polyhull2$(EXEEXT) \
-	polypowerset1$(EXEEXT) powerset1$(EXEEXT) randphull1$(EXEEXT) \
-	randphull2$(EXEEXT) relations1$(EXEEXT) relations2$(EXEEXT) \
-	relations3$(EXEEXT) removespacedims1$(EXEEXT) \
-	removespacedims2$(EXEEXT) smm1$(EXEEXT) timeelapse1$(EXEEXT) \
-	timeelapse2$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
-	universe1$(EXEEXT) universe2$(EXEEXT) writeconsys1$(EXEEXT) \
-	writegensys1$(EXEEXT) writepolyhedron1$(EXEEXT) \
-	writepolyhedron2$(EXEEXT) writerelation1$(EXEEXT) \
-	writevariable1$(EXEEXT)
+	randphull1$(EXEEXT) refinewithconstraint1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) refinewithcongruence1$(EXEEXT) \
+	refinewithcongruences1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+	smm1$(EXEEXT) timeelapse1$(EXEEXT) timeelapse2$(EXEEXT) \
+	topclosed1$(EXEEXT) topclosure1$(EXEEXT) unconstrain1$(EXEEXT) \
+	universe1$(EXEEXT) universe2$(EXEEXT) variablesset1$(EXEEXT) \
+	writeconsys1$(EXEEXT) writegensys1$(EXEEXT) \
+	writepolyhedron1$(EXEEXT) writepolyhedron2$(EXEEXT) \
+	writerelation1$(EXEEXT) writevariable1$(EXEEXT)
 am__EXEEXT_2 = nnc_addcongruence1$(EXEEXT) \
 	nnc_addcongruences1$(EXEEXT) nnc_addconstraint1$(EXEEXT) \
 	nnc_addconstraints1$(EXEEXT) nnc_addgenerator1$(EXEEXT) \
@@ -142,33 +155,36 @@ am__EXEEXT_2 = nnc_addcongruence1$(EXEEXT) \
 	nnc_bounded1$(EXEEXT) nnc_boundedaffineimage1$(EXEEXT) \
 	nnc_boundedaffinepreimage1$(EXEEXT) \
 	nnc_boundedbhrz03extrapolation1$(EXEEXT) \
-	nnc_boundedh79extrapolation1$(EXEEXT) \
-	nnc_boundingbox1$(EXEEXT) nnc_boundingbox2$(EXEEXT) \
-	nnc_bounds1$(EXEEXT) nnc_concatenate1$(EXEEXT) \
-	nnc_congruences1$(EXEEXT) nnc_constraints1$(EXEEXT) \
-	nnc_contains1$(EXEEXT) nnc_disjoint1$(EXEEXT) \
-	nnc_empty1$(EXEEXT) nnc_equals1$(EXEEXT) \
-	nnc_exceptions1$(EXEEXT) nnc_exceptions3$(EXEEXT) \
-	nnc_expandspacedim1$(EXEEXT) nnc_foldspacedims1$(EXEEXT) \
+	nnc_boundedh79extrapolation1$(EXEEXT) nnc_bounds1$(EXEEXT) \
+	nnc_concatenate1$(EXEEXT) nnc_congruences1$(EXEEXT) \
+	nnc_constrains1$(EXEEXT) nnc_constraints1$(EXEEXT) \
+	nnc_contains1$(EXEEXT) nnc_containsintegerpoint1$(EXEEXT) \
+	nnc_disjoint1$(EXEEXT) nnc_empty1$(EXEEXT) \
+	nnc_equals1$(EXEEXT) nnc_exceptions1$(EXEEXT) \
+	nnc_exceptions3$(EXEEXT) nnc_expandspacedim1$(EXEEXT) \
+	nnc_foldspacedims1$(EXEEXT) nnc_frombdshape1$(EXEEXT) \
+	nnc_frombox1$(EXEEXT) nnc_fromgrid1$(EXEEXT) \
+	nnc_fromoctagonalshape1$(EXEEXT) \
 	nnc_generalizedaffineimage1$(EXEEXT) \
 	nnc_generalizedaffinepreimage1$(EXEEXT) \
 	nnc_generators1$(EXEEXT) nnc_geomcovers1$(EXEEXT) \
 	nnc_h79widening1$(EXEEXT) nnc_intersection1$(EXEEXT) \
+	nnc_simplifyusingcontext1$(EXEEXT) \
 	nnc_limitedbhrz03extrapolation1$(EXEEXT) \
 	nnc_limitedh79extrapolation1$(EXEEXT) \
 	nnc_linearpartition1$(EXEEXT) nnc_mapspacedims1$(EXEEXT) \
 	nnc_max_min1$(EXEEXT) nnc_mc91$(EXEEXT) nnc_membytes1$(EXEEXT) \
-	nnc_membytes2$(EXEEXT) nnc_minconstraints1$(EXEEXT) \
-	nnc_mingenerators1$(EXEEXT) nnc_onepoint$(EXEEXT) \
-	nnc_permute$(EXEEXT) nnc_polydifference1$(EXEEXT) \
-	nnc_polyhull1$(EXEEXT) nnc_randphull1$(EXEEXT) \
-	nnc_randphull2$(EXEEXT) nnc_relations1$(EXEEXT) \
+	nnc_minconstraints1$(EXEEXT) nnc_mingenerators1$(EXEEXT) \
+	nnc_onepoint$(EXEEXT) nnc_permute$(EXEEXT) \
+	nnc_polydifference1$(EXEEXT) nnc_polyhull1$(EXEEXT) \
+	nnc_randphull1$(EXEEXT) nnc_relations1$(EXEEXT) \
 	nnc_relations2$(EXEEXT) nnc_removespacedims1$(EXEEXT) \
 	nnc_smm1$(EXEEXT) nnc_timeelapse1$(EXEEXT) \
-	nnc_universe1$(EXEEXT) nnc_writepolyhedron1$(EXEEXT)
+	nnc_unconstrain1$(EXEEXT) nnc_universe1$(EXEEXT) \
+	nnc_writepolyhedron1$(EXEEXT)
 @BUILD_WATCHDOG_LIBRARY_TRUE at am__EXEEXT_3 = watchdog1$(EXEEXT)
 am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
-am__EXEEXT_5 = bug2$(EXEEXT)
+am__EXEEXT_5 =
 am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
 addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
 addcongruence1_LDADD = $(LDADD)
@@ -358,36 +374,12 @@ boundedh79extrapolation1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_boundingbox1_OBJECTS = boundingbox1.$(OBJEXT)
-boundingbox1_OBJECTS = $(am_boundingbox1_OBJECTS)
-boundingbox1_LDADD = $(LDADD)
-boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
-am_boundingbox2_OBJECTS = boundingbox2.$(OBJEXT)
-boundingbox2_OBJECTS = $(am_boundingbox2_OBJECTS)
-boundingbox2_LDADD = $(LDADD)
-boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
-am_boundingbox3_OBJECTS = boundingbox3.$(OBJEXT)
-boundingbox3_OBJECTS = $(am_boundingbox3_OBJECTS)
-boundingbox3_LDADD = $(LDADD)
-boundingbox3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
 am_bounds1_OBJECTS = bounds1.$(OBJEXT)
 bounds1_OBJECTS = $(am_bounds1_OBJECTS)
 bounds1_LDADD = $(LDADD)
 bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_bug2_OBJECTS = bug2-bug2.$(OBJEXT)
-bug2_OBJECTS = $(am_bug2_OBJECTS)
-bug2_LDADD = $(LDADD)
-bug2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
 am_cnncconversion1_OBJECTS = cnncconversion1.$(OBJEXT)
 cnncconversion1_OBJECTS = $(am_cnncconversion1_OBJECTS)
 cnncconversion1_LDADD = $(LDADD)
@@ -406,6 +398,12 @@ congruences1_LDADD = $(LDADD)
 congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_constraints1_OBJECTS = constraints1.$(OBJEXT)
 constraints1_OBJECTS = $(am_constraints1_OBJECTS)
 constraints1_LDADD = $(LDADD)
@@ -424,6 +422,13 @@ contains2_LDADD = $(LDADD)
 contains2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
 disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
 disjoint1_LDADD = $(LDADD)
@@ -496,6 +501,37 @@ foldspacedims2_LDADD = $(LDADD)
 foldspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox2_OBJECTS = frombox2.$(OBJEXT)
+frombox2_OBJECTS = $(am_frombox2_OBJECTS)
+frombox2_LDADD = $(LDADD)
+frombox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_generalizedaffineimage1_OBJECTS =  \
 	generalizedaffineimage1.$(OBJEXT)
 generalizedaffineimage1_OBJECTS =  \
@@ -556,6 +592,12 @@ h79widening2_LDADD = $(LDADD)
 h79widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_hybrid_OBJECTS = hybrid.$(OBJEXT)
+hybrid_OBJECTS = $(am_hybrid_OBJECTS)
+hybrid_LDADD = $(LDADD)
+hybrid_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_intersection1_OBJECTS = intersection1.$(OBJEXT)
 intersection1_OBJECTS = $(am_intersection1_OBJECTS)
 intersection1_LDADD = $(LDADD)
@@ -598,12 +640,6 @@ linexpression1_LDADD = $(LDADD)
 linexpression1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_lpproblem1_OBJECTS = lpproblem1.$(OBJEXT)
-lpproblem1_OBJECTS = $(am_lpproblem1_OBJECTS)
-lpproblem1_LDADD = $(LDADD)
-lpproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
 am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
 mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
 mapspacedims1_LDADD = $(LDADD)
@@ -640,12 +676,6 @@ membytes1_LDADD = $(LDADD)
 membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_membytes2_OBJECTS = membytes2.$(OBJEXT)
-membytes2_OBJECTS = $(am_membytes2_OBJECTS)
-membytes2_LDADD = $(LDADD)
-membytes2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
 am_memory1_OBJECTS = memory1.$(OBJEXT)
 memory1_OBJECTS = $(am_memory1_OBJECTS)
 memory1_LDADD = $(LDADD)
@@ -690,6 +720,10 @@ nnc_addcongruence1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addcongruence1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_addcongruences1_OBJECTS =  \
 	nnc_addcongruences1-addcongruences1.$(OBJEXT)
 nnc_addcongruences1_OBJECTS = $(am_nnc_addcongruences1_OBJECTS)
@@ -698,6 +732,10 @@ nnc_addcongruences1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addcongruences1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_addconstraint1_OBJECTS =  \
 	nnc_addconstraint1-addconstraint1.$(OBJEXT)
 nnc_addconstraint1_OBJECTS = $(am_nnc_addconstraint1_OBJECTS)
@@ -706,6 +744,10 @@ nnc_addconstraint1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addconstraint1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_addconstraints1_OBJECTS =  \
 	nnc_addconstraints1-addconstraints1.$(OBJEXT)
 nnc_addconstraints1_OBJECTS = $(am_nnc_addconstraints1_OBJECTS)
@@ -714,6 +756,10 @@ nnc_addconstraints1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addconstraints1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_addgenerator1_OBJECTS =  \
 	nnc_addgenerator1-addgenerator1.$(OBJEXT)
 nnc_addgenerator1_OBJECTS = $(am_nnc_addgenerator1_OBJECTS)
@@ -721,6 +767,10 @@ nnc_addgenerator1_LDADD = $(LDADD)
 nnc_addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addgenerator1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_addgenerators1_OBJECTS =  \
 	nnc_addgenerators1-addgenerators1.$(OBJEXT)
 nnc_addgenerators1_OBJECTS = $(am_nnc_addgenerators1_OBJECTS)
@@ -729,6 +779,10 @@ nnc_addgenerators1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addgenerators1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_addspacedims1_OBJECTS =  \
 	nnc_addspacedims1-addspacedims1.$(OBJEXT)
 nnc_addspacedims1_OBJECTS = $(am_nnc_addspacedims1_OBJECTS)
@@ -736,12 +790,20 @@ nnc_addspacedims1_LDADD = $(LDADD)
 nnc_addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_addspacedims1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_affineimage1_OBJECTS = nnc_affineimage1-affineimage1.$(OBJEXT)
 nnc_affineimage1_OBJECTS = $(am_nnc_affineimage1_OBJECTS)
 nnc_affineimage1_LDADD = $(LDADD)
 nnc_affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_affineimage1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_affinepreimage1_OBJECTS =  \
 	nnc_affinepreimage1-affinepreimage1.$(OBJEXT)
 nnc_affinepreimage1_OBJECTS = $(am_nnc_affinepreimage1_OBJECTS)
@@ -750,24 +812,38 @@ nnc_affinepreimage1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_affinepreimage1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_affinetrans_OBJECTS = nnc_affinetrans-affinetrans.$(OBJEXT)
 nnc_affinetrans_OBJECTS = $(am_nnc_affinetrans_OBJECTS)
 nnc_affinetrans_LDADD = $(LDADD)
 nnc_affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_affinetrans_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_append1_OBJECTS = nnc_append1-append1.$(OBJEXT)
 nnc_append1_OBJECTS = $(am_nnc_append1_OBJECTS)
 nnc_append1_LDADD = $(LDADD)
 nnc_append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_append1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_append1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_append2_OBJECTS = nnc_append2-append2.$(OBJEXT)
 nnc_append2_OBJECTS = $(am_nnc_append2_OBJECTS)
 nnc_append2_LDADD = $(LDADD)
 nnc_append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_append2_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_append2_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_ascii_dump_load1_OBJECTS =  \
 	nnc_ascii_dump_load1-ascii_dump_load1.$(OBJEXT)
 nnc_ascii_dump_load1_OBJECTS = $(am_nnc_ascii_dump_load1_OBJECTS)
@@ -776,6 +852,10 @@ nnc_ascii_dump_load1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_ascii_dump_load1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_ascii_dump_load2_OBJECTS =  \
 	nnc_ascii_dump_load2-ascii_dump_load2.$(OBJEXT)
 nnc_ascii_dump_load2_OBJECTS = $(am_nnc_ascii_dump_load2_OBJECTS)
@@ -784,6 +864,10 @@ nnc_ascii_dump_load2_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_ascii_dump_load2_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_bgp99extrapolation1_OBJECTS =  \
 	nnc_bgp99extrapolation1-bgp99extrapolation1.$(OBJEXT)
 nnc_bgp99extrapolation1_OBJECTS =  \
@@ -793,6 +877,10 @@ nnc_bgp99extrapolation1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_bgp99extrapolation1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_bhrz03widening1_OBJECTS =  \
 	nnc_bhrz03widening1-bhrz03widening1.$(OBJEXT)
 nnc_bhrz03widening1_OBJECTS = $(am_nnc_bhrz03widening1_OBJECTS)
@@ -801,6 +889,10 @@ nnc_bhrz03widening1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_bhrz03widening1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_bhrz03widening2_OBJECTS =  \
 	nnc_bhrz03widening2-bhrz03widening2.$(OBJEXT)
 nnc_bhrz03widening2_OBJECTS = $(am_nnc_bhrz03widening2_OBJECTS)
@@ -809,12 +901,19 @@ nnc_bhrz03widening2_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_bhrz03widening2_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_bounded1_OBJECTS = nnc_bounded1-bounded1.$(OBJEXT)
 nnc_bounded1_OBJECTS = $(am_nnc_bounded1_OBJECTS)
 nnc_bounded1_LDADD = $(LDADD)
 nnc_bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_bounded1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_bounded1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_boundedaffineimage1_OBJECTS =  \
 	nnc_boundedaffineimage1-boundedaffineimage1.$(OBJEXT)
 nnc_boundedaffineimage1_OBJECTS =  \
@@ -824,6 +923,10 @@ nnc_boundedaffineimage1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_boundedaffineimage1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_boundedaffinepreimage1_OBJECTS =  \
 	nnc_boundedaffinepreimage1-boundedaffinepreimage1.$(OBJEXT)
 nnc_boundedaffinepreimage1_OBJECTS =  \
@@ -833,6 +936,10 @@ nnc_boundedaffinepreimage1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_boundedaffinepreimage1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_boundedbhrz03extrapolation1_OBJECTS =  \
 	boundedbhrz03extrapolation1.$(OBJEXT)
 nnc_boundedbhrz03extrapolation1_OBJECTS =  \
@@ -850,78 +957,128 @@ nnc_boundedh79extrapolation1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_nnc_boundingbox1_OBJECTS = nnc_boundingbox1-boundingbox1.$(OBJEXT)
-nnc_boundingbox1_OBJECTS = $(am_nnc_boundingbox1_OBJECTS)
-nnc_boundingbox1_LDADD = $(LDADD)
-nnc_boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
-am_nnc_boundingbox2_OBJECTS = nnc_boundingbox2-boundingbox2.$(OBJEXT)
-nnc_boundingbox2_OBJECTS = $(am_nnc_boundingbox2_OBJECTS)
-nnc_boundingbox2_LDADD = $(LDADD)
-nnc_boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
+nnc_boundedh79extrapolation1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_bounds1_OBJECTS = nnc_bounds1-bounds1.$(OBJEXT)
 nnc_bounds1_OBJECTS = $(am_nnc_bounds1_OBJECTS)
 nnc_bounds1_LDADD = $(LDADD)
 nnc_bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_bounds1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_bounds1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_concatenate1_OBJECTS = nnc_concatenate1-concatenate1.$(OBJEXT)
 nnc_concatenate1_OBJECTS = $(am_nnc_concatenate1_OBJECTS)
 nnc_concatenate1_LDADD = $(LDADD)
 nnc_concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_concatenate1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_congruences1_OBJECTS = nnc_congruences1-congruences1.$(OBJEXT)
 nnc_congruences1_OBJECTS = $(am_nnc_congruences1_OBJECTS)
 nnc_congruences1_LDADD = $(LDADD)
 nnc_congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_congruences1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_constrains1_OBJECTS = nnc_constrains1-constrains1.$(OBJEXT)
+nnc_constrains1_OBJECTS = $(am_nnc_constrains1_OBJECTS)
+nnc_constrains1_LDADD = $(LDADD)
+nnc_constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_constrains1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_constraints1_OBJECTS = nnc_constraints1-constraints1.$(OBJEXT)
 nnc_constraints1_OBJECTS = $(am_nnc_constraints1_OBJECTS)
 nnc_constraints1_LDADD = $(LDADD)
 nnc_constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_constraints1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_contains1_OBJECTS = nnc_contains1-contains1.$(OBJEXT)
 nnc_contains1_OBJECTS = $(am_nnc_contains1_OBJECTS)
 nnc_contains1_LDADD = $(LDADD)
 nnc_contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_contains1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_contains1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_containsintegerpoint1_OBJECTS =  \
+	nnc_containsintegerpoint1-containsintegerpoint1.$(OBJEXT)
+nnc_containsintegerpoint1_OBJECTS =  \
+	$(am_nnc_containsintegerpoint1_OBJECTS)
+nnc_containsintegerpoint1_LDADD = $(LDADD)
+nnc_containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_containsintegerpoint1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_disjoint1_OBJECTS = nnc_disjoint1-disjoint1.$(OBJEXT)
 nnc_disjoint1_OBJECTS = $(am_nnc_disjoint1_OBJECTS)
 nnc_disjoint1_LDADD = $(LDADD)
 nnc_disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_disjoint1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_disjoint1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_empty1_OBJECTS = nnc_empty1-empty1.$(OBJEXT)
 nnc_empty1_OBJECTS = $(am_nnc_empty1_OBJECTS)
 nnc_empty1_LDADD = $(LDADD)
 nnc_empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_empty1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_empty1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_equals1_OBJECTS = nnc_equals1-equals1.$(OBJEXT)
 nnc_equals1_OBJECTS = $(am_nnc_equals1_OBJECTS)
 nnc_equals1_LDADD = $(LDADD)
 nnc_equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_equals1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_equals1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_exceptions1_OBJECTS = nnc_exceptions1-exceptions1.$(OBJEXT)
 nnc_exceptions1_OBJECTS = $(am_nnc_exceptions1_OBJECTS)
 nnc_exceptions1_LDADD = $(LDADD)
 nnc_exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_exceptions1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_exceptions3_OBJECTS = nnc_exceptions3-exceptions3.$(OBJEXT)
 nnc_exceptions3_OBJECTS = $(am_nnc_exceptions3_OBJECTS)
 nnc_exceptions3_LDADD = $(LDADD)
 nnc_exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_exceptions3_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_expandspacedim1_OBJECTS =  \
 	nnc_expandspacedim1-expandspacedim1.$(OBJEXT)
 nnc_expandspacedim1_OBJECTS = $(am_nnc_expandspacedim1_OBJECTS)
@@ -930,6 +1087,10 @@ nnc_expandspacedim1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_expandspacedim1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_foldspacedims1_OBJECTS =  \
 	nnc_foldspacedims1-foldspacedims1.$(OBJEXT)
 nnc_foldspacedims1_OBJECTS = $(am_nnc_foldspacedims1_OBJECTS)
@@ -938,6 +1099,51 @@ nnc_foldspacedims1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_foldspacedims1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_frombdshape1_OBJECTS = nnc_frombdshape1-frombdshape1.$(OBJEXT)
+nnc_frombdshape1_OBJECTS = $(am_nnc_frombdshape1_OBJECTS)
+nnc_frombdshape1_LDADD = $(LDADD)
+nnc_frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_frombdshape1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_frombox1_OBJECTS = nnc_frombox1-frombox1.$(OBJEXT)
+nnc_frombox1_OBJECTS = $(am_nnc_frombox1_OBJECTS)
+nnc_frombox1_LDADD = $(LDADD)
+nnc_frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_frombox1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_frombox1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_fromgrid1_OBJECTS = nnc_fromgrid1-fromgrid1.$(OBJEXT)
+nnc_fromgrid1_OBJECTS = $(am_nnc_fromgrid1_OBJECTS)
+nnc_fromgrid1_LDADD = $(LDADD)
+nnc_fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_fromgrid1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_fromgrid1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_fromoctagonalshape1_OBJECTS =  \
+	nnc_fromoctagonalshape1-fromoctagonalshape1.$(OBJEXT)
+nnc_fromoctagonalshape1_OBJECTS =  \
+	$(am_nnc_fromoctagonalshape1_OBJECTS)
+nnc_fromoctagonalshape1_LDADD = $(LDADD)
+nnc_fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_fromoctagonalshape1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_generalizedaffineimage1_OBJECTS =  \
 	nnc_generalizedaffineimage1-generalizedaffineimage1.$(OBJEXT)
 nnc_generalizedaffineimage1_OBJECTS =  \
@@ -947,6 +1153,10 @@ nnc_generalizedaffineimage1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_generalizedaffineimage1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_generalizedaffinepreimage1_OBJECTS = nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.$(OBJEXT)
 nnc_generalizedaffinepreimage1_OBJECTS =  \
 	$(am_nnc_generalizedaffinepreimage1_OBJECTS)
@@ -955,24 +1165,40 @@ nnc_generalizedaffinepreimage1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_generalizedaffinepreimage1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_generators1_OBJECTS = nnc_generators1-generators1.$(OBJEXT)
 nnc_generators1_OBJECTS = $(am_nnc_generators1_OBJECTS)
 nnc_generators1_LDADD = $(LDADD)
 nnc_generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_generators1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_generators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_geomcovers1_OBJECTS = nnc_geomcovers1-geomcovers1.$(OBJEXT)
 nnc_geomcovers1_OBJECTS = $(am_nnc_geomcovers1_OBJECTS)
 nnc_geomcovers1_LDADD = $(LDADD)
 nnc_geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_geomcovers1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_h79widening1_OBJECTS = nnc_h79widening1-h79widening1.$(OBJEXT)
 nnc_h79widening1_OBJECTS = $(am_nnc_h79widening1_OBJECTS)
 nnc_h79widening1_LDADD = $(LDADD)
 nnc_h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_h79widening1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_intersection1_OBJECTS =  \
 	nnc_intersection1-intersection1.$(OBJEXT)
 nnc_intersection1_OBJECTS = $(am_nnc_intersection1_OBJECTS)
@@ -980,6 +1206,10 @@ nnc_intersection1_LDADD = $(LDADD)
 nnc_intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_intersection1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_limitedbhrz03extrapolation1_OBJECTS = nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.$(OBJEXT)
 nnc_limitedbhrz03extrapolation1_OBJECTS =  \
 	$(am_nnc_limitedbhrz03extrapolation1_OBJECTS)
@@ -988,6 +1218,10 @@ nnc_limitedbhrz03extrapolation1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_limitedbhrz03extrapolation1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_limitedh79extrapolation1_OBJECTS = nnc_limitedh79extrapolation1-limitedh79extrapolation1.$(OBJEXT)
 nnc_limitedh79extrapolation1_OBJECTS =  \
 	$(am_nnc_limitedh79extrapolation1_OBJECTS)
@@ -996,6 +1230,10 @@ nnc_limitedh79extrapolation1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_limitedh79extrapolation1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_linearpartition1_OBJECTS =  \
 	nnc_linearpartition1-linearpartition1.$(OBJEXT)
 nnc_linearpartition1_OBJECTS = $(am_nnc_linearpartition1_OBJECTS)
@@ -1004,6 +1242,10 @@ nnc_linearpartition1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_linearpartition1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_mapspacedims1_OBJECTS =  \
 	nnc_mapspacedims1-mapspacedims1.$(OBJEXT)
 nnc_mapspacedims1_OBJECTS = $(am_nnc_mapspacedims1_OBJECTS)
@@ -1011,30 +1253,37 @@ nnc_mapspacedims1_LDADD = $(LDADD)
 nnc_mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_mapspacedims1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_max_min1_OBJECTS = nnc_max_min1-max_min1.$(OBJEXT)
 nnc_max_min1_OBJECTS = $(am_nnc_max_min1_OBJECTS)
 nnc_max_min1_LDADD = $(LDADD)
 nnc_max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_max_min1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_max_min1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_mc91_OBJECTS = nnc_mc91-mc91.$(OBJEXT)
 nnc_mc91_OBJECTS = $(am_nnc_mc91_OBJECTS)
 nnc_mc91_LDADD = $(LDADD)
 nnc_mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_mc91_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_mc91_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_membytes1_OBJECTS = nnc_membytes1-membytes1.$(OBJEXT)
 nnc_membytes1_OBJECTS = $(am_nnc_membytes1_OBJECTS)
 nnc_membytes1_LDADD = $(LDADD)
 nnc_membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_nnc_membytes2_OBJECTS = nnc_membytes2-membytes2.$(OBJEXT)
-nnc_membytes2_OBJECTS = $(am_nnc_membytes2_OBJECTS)
-nnc_membytes2_LDADD = $(LDADD)
-nnc_membytes2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
+nnc_membytes1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_membytes1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_minconstraints1_OBJECTS =  \
 	nnc_minconstraints1-minconstraints1.$(OBJEXT)
 nnc_minconstraints1_OBJECTS = $(am_nnc_minconstraints1_OBJECTS)
@@ -1043,6 +1292,10 @@ nnc_minconstraints1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_minconstraints1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_mingenerators1_OBJECTS =  \
 	nnc_mingenerators1-mingenerators1.$(OBJEXT)
 nnc_mingenerators1_OBJECTS = $(am_nnc_mingenerators1_OBJECTS)
@@ -1051,18 +1304,28 @@ nnc_mingenerators1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_mingenerators1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_onepoint_OBJECTS = nnc_onepoint-onepoint.$(OBJEXT)
 nnc_onepoint_OBJECTS = $(am_nnc_onepoint_OBJECTS)
 nnc_onepoint_LDADD = $(LDADD)
 nnc_onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_onepoint_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_onepoint_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_permute_OBJECTS = nnc_permute-permute.$(OBJEXT)
 nnc_permute_OBJECTS = $(am_nnc_permute_OBJECTS)
 nnc_permute_LDADD = $(LDADD)
 nnc_permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_permute_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_permute_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_polydifference1_OBJECTS =  \
 	nnc_polydifference1-polydifference1.$(OBJEXT)
 nnc_polydifference1_OBJECTS = $(am_nnc_polydifference1_OBJECTS)
@@ -1071,36 +1334,49 @@ nnc_polydifference1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_polydifference1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_polyhull1_OBJECTS = nnc_polyhull1-polyhull1.$(OBJEXT)
 nnc_polyhull1_OBJECTS = $(am_nnc_polyhull1_OBJECTS)
 nnc_polyhull1_LDADD = $(LDADD)
 nnc_polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_polyhull1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_polyhull1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_randphull1_OBJECTS = nnc_randphull1-randphull1.$(OBJEXT)
 nnc_randphull1_OBJECTS = $(am_nnc_randphull1_OBJECTS)
-nnc_randphull1_LDADD = $(LDADD)
-nnc_randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
-	$(top_builddir)/tests/libppl_tests.a \
-	$(top_builddir)/src/libppl.la
-am_nnc_randphull2_OBJECTS = nnc_randphull2-randphull2.$(OBJEXT)
-nnc_randphull2_OBJECTS = $(am_nnc_randphull2_OBJECTS)
 am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-nnc_randphull2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+nnc_randphull1_DEPENDENCIES = $(am__DEPENDENCIES_1)
+nnc_randphull1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_relations1_OBJECTS = nnc_relations1-relations1.$(OBJEXT)
 nnc_relations1_OBJECTS = $(am_nnc_relations1_OBJECTS)
 nnc_relations1_LDADD = $(LDADD)
 nnc_relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_relations1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_relations1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_relations2_OBJECTS = nnc_relations2-relations2.$(OBJEXT)
 nnc_relations2_OBJECTS = $(am_nnc_relations2_OBJECTS)
 nnc_relations2_LDADD = $(LDADD)
 nnc_relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_relations2_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_relations2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_removespacedims1_OBJECTS =  \
 	nnc_removespacedims1-removespacedims1.$(OBJEXT)
 nnc_removespacedims1_OBJECTS = $(am_nnc_removespacedims1_OBJECTS)
@@ -1109,24 +1385,61 @@ nnc_removespacedims1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_removespacedims1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_simplifyusingcontext1_OBJECTS =  \
+	nnc_simplifyusingcontext1-simplifyusingcontext1.$(OBJEXT)
+nnc_simplifyusingcontext1_OBJECTS =  \
+	$(am_nnc_simplifyusingcontext1_OBJECTS)
+nnc_simplifyusingcontext1_LDADD = $(LDADD)
+nnc_simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_simplifyusingcontext1_LINK = $(LIBTOOL) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_smm1_OBJECTS = nnc_smm1-smm1.$(OBJEXT)
 nnc_smm1_OBJECTS = $(am_nnc_smm1_OBJECTS)
 nnc_smm1_LDADD = $(LDADD)
 nnc_smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_smm1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_smm1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_timeelapse1_OBJECTS = nnc_timeelapse1-timeelapse1.$(OBJEXT)
 nnc_timeelapse1_OBJECTS = $(am_nnc_timeelapse1_OBJECTS)
 nnc_timeelapse1_LDADD = $(LDADD)
 nnc_timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_timeelapse1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_unconstrain1_OBJECTS = nnc_unconstrain1-unconstrain1.$(OBJEXT)
+nnc_unconstrain1_OBJECTS = $(am_nnc_unconstrain1_OBJECTS)
+nnc_unconstrain1_LDADD = $(LDADD)
+nnc_unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_unconstrain1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nnc_universe1_OBJECTS = nnc_universe1-universe1.$(OBJEXT)
 nnc_universe1_OBJECTS = $(am_nnc_universe1_OBJECTS)
 nnc_universe1_LDADD = $(LDADD)
 nnc_universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_universe1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_universe1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_nnc_writepolyhedron1_OBJECTS =  \
 	nnc_writepolyhedron1-writepolyhedron1.$(OBJEXT)
 nnc_writepolyhedron1_OBJECTS = $(am_nnc_writepolyhedron1_OBJECTS)
@@ -1135,6 +1448,10 @@ nnc_writepolyhedron1_DEPENDENCIES =  \
 	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+nnc_writepolyhedron1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_nncminimize1_OBJECTS = nncminimize1.$(OBJEXT)
 nncminimize1_OBJECTS = $(am_nncminimize1_OBJECTS)
 nncminimize1_LDADD = $(LDADD)
@@ -1189,27 +1506,37 @@ polyhull2_LDADD = $(LDADD)
 polyhull2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_polypowerset1_OBJECTS = polypowerset1.$(OBJEXT)
-polypowerset1_OBJECTS = $(am_polypowerset1_OBJECTS)
-polypowerset1_LDADD = $(LDADD)
-polypowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+am_randphull1_OBJECTS = randphull1.$(OBJEXT)
+randphull1_OBJECTS = $(am_randphull1_OBJECTS)
+randphull1_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_refinewithcongruence1_OBJECTS = refinewithcongruence1.$(OBJEXT)
+refinewithcongruence1_OBJECTS = $(am_refinewithcongruence1_OBJECTS)
+refinewithcongruence1_LDADD = $(LDADD)
+refinewithcongruence1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_powerset1_OBJECTS = powerset1.$(OBJEXT)
-powerset1_OBJECTS = $(am_powerset1_OBJECTS)
-powerset1_LDADD = $(LDADD)
-powerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_randphull1_OBJECTS = randphull1.$(OBJEXT)
-randphull1_OBJECTS = $(am_randphull1_OBJECTS)
-randphull1_LDADD = $(LDADD)
-randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+am_refinewithconstraint1_OBJECTS = refinewithconstraint1.$(OBJEXT)
+refinewithconstraint1_OBJECTS = $(am_refinewithconstraint1_OBJECTS)
+refinewithconstraint1_LDADD = $(LDADD)
+refinewithconstraint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-am_randphull2_OBJECTS = randphull2.$(OBJEXT)
-randphull2_OBJECTS = $(am_randphull2_OBJECTS)
-randphull2_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am_relations1_OBJECTS = relations1.$(OBJEXT)
 relations1_OBJECTS = $(am_relations1_OBJECTS)
 relations1_LDADD = $(LDADD)
@@ -1240,6 +1567,13 @@ removespacedims2_LDADD = $(LDADD)
 removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_smm1_OBJECTS = smm1.$(OBJEXT)
 smm1_OBJECTS = $(am_smm1_OBJECTS)
 smm1_LDADD = $(LDADD)
@@ -1270,6 +1604,12 @@ topclosure1_LDADD = $(LDADD)
 topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am_universe1_OBJECTS = universe1.$(OBJEXT)
 universe1_OBJECTS = $(am_universe1_OBJECTS)
 universe1_LDADD = $(LDADD)
@@ -1282,8 +1622,14 @@ universe2_LDADD = $(LDADD)
 universe2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
+am_variablesset1_OBJECTS = variablesset1.$(OBJEXT)
+variablesset1_OBJECTS = $(am_variablesset1_OBJECTS)
+variablesset1_LDADD = $(LDADD)
+variablesset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
 am__watchdog1_SOURCES_DIST = watchdog1.cc
-am__objects_1 = watchdog1.$(OBJEXT)
+am__objects_1 = watchdog1-watchdog1.$(OBJEXT)
 @BUILD_WATCHDOG_LIBRARY_TRUE at am_watchdog1_OBJECTS = $(am__objects_1)
 watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
 @BUILD_WATCHDOG_LIBRARY_TRUE at watchdog1_DEPENDENCIES =  \
@@ -1325,17 +1671,18 @@ writevariable1_LDADD = $(LDADD)
 writevariable1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
 	$(top_builddir)/tests/libppl_tests.a \
 	$(top_builddir)/src/libppl.la
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
 	$(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
@@ -1351,29 +1698,32 @@ SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
 	$(boundedaffinepreimage1_SOURCES) \
 	$(boundedbhrz03extrapolation1_SOURCES) \
-	$(boundedh79extrapolation1_SOURCES) $(boundingbox1_SOURCES) \
-	$(boundingbox2_SOURCES) $(boundingbox3_SOURCES) \
-	$(bounds1_SOURCES) $(bug2_SOURCES) $(cnncconversion1_SOURCES) \
-	$(concatenate1_SOURCES) $(congruences1_SOURCES) \
+	$(boundedh79extrapolation1_SOURCES) $(bounds1_SOURCES) \
+	$(cnncconversion1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
 	$(constraints1_SOURCES) $(contains1_SOURCES) \
-	$(contains2_SOURCES) $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+	$(contains2_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(disjoint1_SOURCES) $(disjoint2_SOURCES) \
 	$(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \
 	$(exceptions1_SOURCES) $(exceptions2_SOURCES) \
 	$(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \
 	$(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \
-	$(foldspacedims2_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(foldspacedims2_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(frombox2_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
 	$(generalizedaffineimage2_SOURCES) \
 	$(generalizedaffinepreimage1_SOURCES) \
 	$(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
 	$(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
-	$(h79widening2_SOURCES) $(intersection1_SOURCES) \
+	$(h79widening2_SOURCES) $(hybrid_SOURCES) \
+	$(intersection1_SOURCES) \
 	$(limitedbhrz03extrapolation1_SOURCES) \
 	$(limitedh79extrapolation1_SOURCES) \
 	$(linearpartition1_SOURCES) $(linearsystem1_SOURCES) \
-	$(linexpression1_SOURCES) $(lpproblem1_SOURCES) \
-	$(mapspacedims1_SOURCES) $(matrix1_SOURCES) \
-	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) $(mc91_SOURCES) \
-	$(membytes1_SOURCES) $(membytes2_SOURCES) $(memory1_SOURCES) \
+	$(linexpression1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(matrix1_SOURCES) $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(mc91_SOURCES) $(membytes1_SOURCES) $(memory1_SOURCES) \
 	$(memory2_SOURCES) $(minconstraints1_SOURCES) \
 	$(minconstraints2_SOURCES) $(mingenerators1_SOURCES) \
 	$(mingenerators2_SOURCES) $(nnc_addcongruence1_SOURCES) \
@@ -1389,14 +1739,16 @@ SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
 	$(nnc_boundedaffinepreimage1_SOURCES) \
 	$(nnc_boundedbhrz03extrapolation1_SOURCES) \
-	$(nnc_boundedh79extrapolation1_SOURCES) \
-	$(nnc_boundingbox1_SOURCES) $(nnc_boundingbox2_SOURCES) \
-	$(nnc_bounds1_SOURCES) $(nnc_concatenate1_SOURCES) \
-	$(nnc_congruences1_SOURCES) $(nnc_constraints1_SOURCES) \
-	$(nnc_contains1_SOURCES) $(nnc_disjoint1_SOURCES) \
-	$(nnc_empty1_SOURCES) $(nnc_equals1_SOURCES) \
-	$(nnc_exceptions1_SOURCES) $(nnc_exceptions3_SOURCES) \
-	$(nnc_expandspacedim1_SOURCES) $(nnc_foldspacedims1_SOURCES) \
+	$(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \
+	$(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \
+	$(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \
+	$(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \
+	$(nnc_disjoint1_SOURCES) $(nnc_empty1_SOURCES) \
+	$(nnc_equals1_SOURCES) $(nnc_exceptions1_SOURCES) \
+	$(nnc_exceptions3_SOURCES) $(nnc_expandspacedim1_SOURCES) \
+	$(nnc_foldspacedims1_SOURCES) $(nnc_frombdshape1_SOURCES) \
+	$(nnc_frombox1_SOURCES) $(nnc_fromgrid1_SOURCES) \
+	$(nnc_fromoctagonalshape1_SOURCES) \
 	$(nnc_generalizedaffineimage1_SOURCES) \
 	$(nnc_generalizedaffinepreimage1_SOURCES) \
 	$(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
@@ -1405,30 +1757,34 @@ SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(nnc_limitedh79extrapolation1_SOURCES) \
 	$(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
 	$(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
-	$(nnc_membytes1_SOURCES) $(nnc_membytes2_SOURCES) \
-	$(nnc_minconstraints1_SOURCES) $(nnc_mingenerators1_SOURCES) \
-	$(nnc_onepoint_SOURCES) $(nnc_permute_SOURCES) \
-	$(nnc_polydifference1_SOURCES) $(nnc_polyhull1_SOURCES) \
-	$(nnc_randphull1_SOURCES) $(nnc_randphull2_SOURCES) \
+	$(nnc_membytes1_SOURCES) $(nnc_minconstraints1_SOURCES) \
+	$(nnc_mingenerators1_SOURCES) $(nnc_onepoint_SOURCES) \
+	$(nnc_permute_SOURCES) $(nnc_polydifference1_SOURCES) \
+	$(nnc_polyhull1_SOURCES) $(nnc_randphull1_SOURCES) \
 	$(nnc_relations1_SOURCES) $(nnc_relations2_SOURCES) \
-	$(nnc_removespacedims1_SOURCES) $(nnc_smm1_SOURCES) \
-	$(nnc_timeelapse1_SOURCES) $(nnc_universe1_SOURCES) \
-	$(nnc_writepolyhedron1_SOURCES) $(nncminimize1_SOURCES) \
-	$(nncminimize2_SOURCES) $(numberinput1_SOURCES) \
-	$(onepoint_SOURCES) $(permute_SOURCES) \
+	$(nnc_removespacedims1_SOURCES) \
+	$(nnc_simplifyusingcontext1_SOURCES) $(nnc_smm1_SOURCES) \
+	$(nnc_timeelapse1_SOURCES) $(nnc_unconstrain1_SOURCES) \
+	$(nnc_universe1_SOURCES) $(nnc_writepolyhedron1_SOURCES) \
+	$(nncminimize1_SOURCES) $(nncminimize2_SOURCES) \
+	$(numberinput1_SOURCES) $(onepoint_SOURCES) $(permute_SOURCES) \
 	$(polydifference1_SOURCES) $(polydifference2_SOURCES) \
 	$(polyhull1_SOURCES) $(polyhull2_SOURCES) \
-	$(polypowerset1_SOURCES) $(powerset1_SOURCES) \
-	$(randphull1_SOURCES) $(randphull2_SOURCES) \
-	$(relations1_SOURCES) $(relations2_SOURCES) \
-	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
-	$(removespacedims2_SOURCES) $(smm1_SOURCES) \
+	$(randphull1_SOURCES) $(refinewithcongruence1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(smm1_SOURCES) \
 	$(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \
 	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
-	$(universe1_SOURCES) $(universe2_SOURCES) $(watchdog1_SOURCES) \
-	$(writeconsys1_SOURCES) $(writegensys1_SOURCES) \
-	$(writepolyhedron1_SOURCES) $(writepolyhedron2_SOURCES) \
-	$(writerelation1_SOURCES) $(writevariable1_SOURCES)
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(universe2_SOURCES) $(variablesset1_SOURCES) \
+	$(watchdog1_SOURCES) $(writeconsys1_SOURCES) \
+	$(writegensys1_SOURCES) $(writepolyhedron1_SOURCES) \
+	$(writepolyhedron2_SOURCES) $(writerelation1_SOURCES) \
+	$(writevariable1_SOURCES)
 DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
 	$(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
@@ -1444,29 +1800,32 @@ DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
 	$(boundedaffinepreimage1_SOURCES) \
 	$(boundedbhrz03extrapolation1_SOURCES) \
-	$(boundedh79extrapolation1_SOURCES) $(boundingbox1_SOURCES) \
-	$(boundingbox2_SOURCES) $(boundingbox3_SOURCES) \
-	$(bounds1_SOURCES) $(bug2_SOURCES) $(cnncconversion1_SOURCES) \
-	$(concatenate1_SOURCES) $(congruences1_SOURCES) \
+	$(boundedh79extrapolation1_SOURCES) $(bounds1_SOURCES) \
+	$(cnncconversion1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
 	$(constraints1_SOURCES) $(contains1_SOURCES) \
-	$(contains2_SOURCES) $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+	$(contains2_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(disjoint1_SOURCES) $(disjoint2_SOURCES) \
 	$(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \
 	$(exceptions1_SOURCES) $(exceptions2_SOURCES) \
 	$(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \
 	$(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \
-	$(foldspacedims2_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(foldspacedims2_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(frombox2_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
 	$(generalizedaffineimage2_SOURCES) \
 	$(generalizedaffinepreimage1_SOURCES) \
 	$(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
 	$(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
-	$(h79widening2_SOURCES) $(intersection1_SOURCES) \
+	$(h79widening2_SOURCES) $(hybrid_SOURCES) \
+	$(intersection1_SOURCES) \
 	$(limitedbhrz03extrapolation1_SOURCES) \
 	$(limitedh79extrapolation1_SOURCES) \
 	$(linearpartition1_SOURCES) $(linearsystem1_SOURCES) \
-	$(linexpression1_SOURCES) $(lpproblem1_SOURCES) \
-	$(mapspacedims1_SOURCES) $(matrix1_SOURCES) \
-	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) $(mc91_SOURCES) \
-	$(membytes1_SOURCES) $(membytes2_SOURCES) $(memory1_SOURCES) \
+	$(linexpression1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(matrix1_SOURCES) $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(mc91_SOURCES) $(membytes1_SOURCES) $(memory1_SOURCES) \
 	$(memory2_SOURCES) $(minconstraints1_SOURCES) \
 	$(minconstraints2_SOURCES) $(mingenerators1_SOURCES) \
 	$(mingenerators2_SOURCES) $(nnc_addcongruence1_SOURCES) \
@@ -1482,14 +1841,16 @@ DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
 	$(nnc_boundedaffinepreimage1_SOURCES) \
 	$(nnc_boundedbhrz03extrapolation1_SOURCES) \
-	$(nnc_boundedh79extrapolation1_SOURCES) \
-	$(nnc_boundingbox1_SOURCES) $(nnc_boundingbox2_SOURCES) \
-	$(nnc_bounds1_SOURCES) $(nnc_concatenate1_SOURCES) \
-	$(nnc_congruences1_SOURCES) $(nnc_constraints1_SOURCES) \
-	$(nnc_contains1_SOURCES) $(nnc_disjoint1_SOURCES) \
-	$(nnc_empty1_SOURCES) $(nnc_equals1_SOURCES) \
-	$(nnc_exceptions1_SOURCES) $(nnc_exceptions3_SOURCES) \
-	$(nnc_expandspacedim1_SOURCES) $(nnc_foldspacedims1_SOURCES) \
+	$(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \
+	$(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \
+	$(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \
+	$(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \
+	$(nnc_disjoint1_SOURCES) $(nnc_empty1_SOURCES) \
+	$(nnc_equals1_SOURCES) $(nnc_exceptions1_SOURCES) \
+	$(nnc_exceptions3_SOURCES) $(nnc_expandspacedim1_SOURCES) \
+	$(nnc_foldspacedims1_SOURCES) $(nnc_frombdshape1_SOURCES) \
+	$(nnc_frombox1_SOURCES) $(nnc_fromgrid1_SOURCES) \
+	$(nnc_fromoctagonalshape1_SOURCES) \
 	$(nnc_generalizedaffineimage1_SOURCES) \
 	$(nnc_generalizedaffinepreimage1_SOURCES) \
 	$(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
@@ -1498,27 +1859,30 @@ DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
 	$(nnc_limitedh79extrapolation1_SOURCES) \
 	$(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
 	$(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
-	$(nnc_membytes1_SOURCES) $(nnc_membytes2_SOURCES) \
-	$(nnc_minconstraints1_SOURCES) $(nnc_mingenerators1_SOURCES) \
-	$(nnc_onepoint_SOURCES) $(nnc_permute_SOURCES) \
-	$(nnc_polydifference1_SOURCES) $(nnc_polyhull1_SOURCES) \
-	$(nnc_randphull1_SOURCES) $(nnc_randphull2_SOURCES) \
+	$(nnc_membytes1_SOURCES) $(nnc_minconstraints1_SOURCES) \
+	$(nnc_mingenerators1_SOURCES) $(nnc_onepoint_SOURCES) \
+	$(nnc_permute_SOURCES) $(nnc_polydifference1_SOURCES) \
+	$(nnc_polyhull1_SOURCES) $(nnc_randphull1_SOURCES) \
 	$(nnc_relations1_SOURCES) $(nnc_relations2_SOURCES) \
-	$(nnc_removespacedims1_SOURCES) $(nnc_smm1_SOURCES) \
-	$(nnc_timeelapse1_SOURCES) $(nnc_universe1_SOURCES) \
-	$(nnc_writepolyhedron1_SOURCES) $(nncminimize1_SOURCES) \
-	$(nncminimize2_SOURCES) $(numberinput1_SOURCES) \
-	$(onepoint_SOURCES) $(permute_SOURCES) \
+	$(nnc_removespacedims1_SOURCES) \
+	$(nnc_simplifyusingcontext1_SOURCES) $(nnc_smm1_SOURCES) \
+	$(nnc_timeelapse1_SOURCES) $(nnc_unconstrain1_SOURCES) \
+	$(nnc_universe1_SOURCES) $(nnc_writepolyhedron1_SOURCES) \
+	$(nncminimize1_SOURCES) $(nncminimize2_SOURCES) \
+	$(numberinput1_SOURCES) $(onepoint_SOURCES) $(permute_SOURCES) \
 	$(polydifference1_SOURCES) $(polydifference2_SOURCES) \
 	$(polyhull1_SOURCES) $(polyhull2_SOURCES) \
-	$(polypowerset1_SOURCES) $(powerset1_SOURCES) \
-	$(randphull1_SOURCES) $(randphull2_SOURCES) \
-	$(relations1_SOURCES) $(relations2_SOURCES) \
-	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
-	$(removespacedims2_SOURCES) $(smm1_SOURCES) \
+	$(randphull1_SOURCES) $(refinewithcongruence1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(smm1_SOURCES) \
 	$(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \
 	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
-	$(universe1_SOURCES) $(universe2_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(universe2_SOURCES) $(variablesset1_SOURCES) \
 	$(am__watchdog1_SOURCES_DIST) $(writeconsys1_SOURCES) \
 	$(writegensys1_SOURCES) $(writepolyhedron1_SOURCES) \
 	$(writepolyhedron2_SOURCES) $(writerelation1_SOURCES) \
@@ -1527,39 +1891,18 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -1569,53 +1912,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -1624,56 +1965,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -1685,10 +2000,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -1697,32 +2016,48 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 CHECKER = 
 #CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
 TESTS_ENVIRONMENT = $(CHECKER)
 AM_CPPFLAGS = \
 -I$(top_builddir)/src \
--I$(top_builddir)/Watchdog \
--I$(top_builddir)/Watchdog/src \
 -I$(top_srcdir)/utils \
 -I$(top_srcdir)/tests \
 @extra_includes@ \
@@ -1735,146 +2070,164 @@ $(top_builddir)/src/libppl.la \
 @extra_libraries@
 
 ORIGINAL_TESTS = \
-	addcongruence1 \
-	addcongruences1 \
-	addconstraint1 \
-	addconstraints1 addconstraints2 \
-	addgenerator1 addgenerator2 \
-	addgenerators1 addgenerators2 \
-	addspacedims1 addspacedims2 \
-	affineimage1 affineimage2 \
-	affinepreimage1 \
-	affinetrans \
-	append1 append2 \
-	ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
-	bgp99extrapolation1 \
-	bhrz03widening1 bhrz03widening2 bhrz03widening3 \
-	bhz03widening1 \
-	bounded1 \
-	boundedaffineimage1 \
-	boundedaffinepreimage1 \
-	boundedbhrz03extrapolation1 \
-	boundedh79extrapolation1 \
-	boundingbox1 boundingbox2 boundingbox3 \
-	bounds1 \
-	cnncconversion1 \
-	concatenate1 \
-	congruences1 \
-	constraints1 \
-	contains1 contains2 \
-	disjoint1 disjoint2 \
-	dualhypercubes \
-	empty1 \
-	equals1 \
-	exceptions1 exceptions2  exceptions3 \
-	expandspacedim1 expandspacedim2 \
-	foldspacedims1 foldspacedims2 \
-	generalizedaffineimage1 generalizedaffineimage2 \
-	generalizedaffinepreimage1 generalizedaffinepreimage2 \
-	generators1 \
-	geomcovers1 \
-	h79widening1 h79widening2 \
-	intersection1 \
-	limitedbhrz03extrapolation1 \
-	limitedh79extrapolation1 \
-	linearpartition1 \
-	linexpression1 \
-	linearsystem1 \
-	lpproblem1 \
-	mapspacedims1 \
-	matrix1 \
-	max_min1 \
-	maxspacedim1 \
-	mc91 \
-	membytes1 membytes2 \
-	memory1 memory2 \
-	minconstraints1 minconstraints2 \
-	mingenerators1 mingenerators2 \
-	nncminimize1 nncminimize2 \
-	numberinput1 \
-	onepoint \
-	permute \
-	polydifference1 polydifference2 \
-	polyhull1 polyhull2 \
-	polypowerset1 \
-	powerset1 \
-	randphull1 randphull2 \
-	relations1 relations2 relations3 \
-	removespacedims1 removespacedims2 \
-	smm1 \
-	timeelapse1 timeelapse2 \
-	topclosed1 \
-	topclosure1 \
-	universe1 universe2 \
-	writeconsys1 \
-	writegensys1 \
-	writepolyhedron1 writepolyhedron2 \
-	writerelation1 \
-	writevariable1
+hybrid \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 addconstraints2 \
+addgenerator1 addgenerator2 \
+addgenerators1 addgenerators2 \
+addspacedims1 addspacedims2 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+affinetrans \
+append1 append2 \
+ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+bgp99extrapolation1 \
+bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boundedbhrz03extrapolation1 \
+boundedh79extrapolation1 \
+bounds1 \
+cnncconversion1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 contains2 \
+containsintegerpoint1 \
+disjoint1 disjoint2 \
+dualhypercubes \
+empty1 \
+equals1 \
+exceptions1 exceptions2  exceptions3 \
+expandspacedim1 expandspacedim2 \
+foldspacedims1 foldspacedims2 \
+frombdshape1 \
+frombox1 frombox2 \
+fromgrid1 \
+fromoctagonalshape1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generators1 \
+geomcovers1 \
+h79widening1 h79widening2 \
+intersection1 \
+simplifyusingcontext1 \
+limitedbhrz03extrapolation1 \
+limitedh79extrapolation1 \
+linearpartition1 \
+linexpression1 \
+linearsystem1 \
+mapspacedims1 \
+matrix1 \
+max_min1 \
+maxspacedim1 \
+mc91 \
+membytes1 \
+memory1 memory2 \
+minconstraints1 minconstraints2 \
+mingenerators1 mingenerators2 \
+nncminimize1 nncminimize2 \
+numberinput1 \
+onepoint \
+permute \
+polydifference1 polydifference2 \
+polyhull1 polyhull2 \
+randphull1 \
+refinewithconstraint1 \
+refinewithconstraints1 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+smm1 \
+timeelapse1 timeelapse2 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+universe1 universe2 \
+variablesset1 \
+writeconsys1 \
+writegensys1 \
+writepolyhedron1 writepolyhedron2 \
+writerelation1 \
+writevariable1
 
 DERIVED_TESTS = \
-	nnc_addcongruence1 \
-	nnc_addcongruences1 \
-	nnc_addconstraint1 \
-	nnc_addconstraints1 \
-	nnc_addgenerator1 \
-	nnc_addgenerators1 \
-	nnc_addspacedims1 \
-	nnc_affineimage1 \
-	nnc_affinepreimage1 \
-	nnc_affinetrans \
-	nnc_append1 nnc_append2 \
-	nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
-	nnc_bgp99extrapolation1 \
-	nnc_bhrz03widening1 nnc_bhrz03widening2 \
-	nnc_bounded1 \
-	nnc_boundedaffineimage1 \
-	nnc_boundedaffinepreimage1 \
-	nnc_boundedbhrz03extrapolation1 \
-	nnc_boundedh79extrapolation1 \
-	nnc_boundingbox1 nnc_boundingbox2 \
-	nnc_bounds1 \
-	nnc_concatenate1 \
-	nnc_congruences1 \
-	nnc_constraints1 \
-	nnc_contains1 \
-	nnc_disjoint1 \
-	nnc_empty1 \
-	nnc_equals1 \
-	nnc_exceptions1 nnc_exceptions3 \
-	nnc_expandspacedim1 \
-	nnc_foldspacedims1 \
-	nnc_generalizedaffineimage1 \
-	nnc_generalizedaffinepreimage1 \
-	nnc_generators1 \
-	nnc_geomcovers1 \
-	nnc_h79widening1 \
-	nnc_intersection1 \
-	nnc_limitedbhrz03extrapolation1 \
-	nnc_limitedh79extrapolation1 \
-	nnc_linearpartition1 \
-	nnc_mapspacedims1 \
-	nnc_max_min1 \
-	nnc_mc91 \
-	nnc_membytes1 nnc_membytes2 \
-	nnc_minconstraints1 \
-	nnc_mingenerators1 \
-	nnc_onepoint \
-	nnc_permute \
-	nnc_polydifference1 \
-	nnc_polyhull1 \
-	nnc_randphull1 nnc_randphull2 \
-	nnc_relations1 nnc_relations2 \
-	nnc_removespacedims1 \
-	nnc_smm1 \
-	nnc_timeelapse1 \
-	nnc_universe1 \
-	nnc_writepolyhedron1
+nnc_addcongruence1 \
+nnc_addcongruences1 \
+nnc_addconstraint1 \
+nnc_addconstraints1 \
+nnc_addgenerator1 \
+nnc_addgenerators1 \
+nnc_addspacedims1 \
+nnc_affineimage1 \
+nnc_affinepreimage1 \
+nnc_affinetrans \
+nnc_append1 nnc_append2 \
+nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+nnc_bgp99extrapolation1 \
+nnc_bhrz03widening1 nnc_bhrz03widening2 \
+nnc_bounded1 \
+nnc_boundedaffineimage1 \
+nnc_boundedaffinepreimage1 \
+nnc_boundedbhrz03extrapolation1 \
+nnc_boundedh79extrapolation1 \
+nnc_bounds1 \
+nnc_concatenate1 \
+nnc_congruences1 \
+nnc_constrains1 \
+nnc_constraints1 \
+nnc_contains1 \
+nnc_containsintegerpoint1 \
+nnc_disjoint1 \
+nnc_empty1 \
+nnc_equals1 \
+nnc_exceptions1 nnc_exceptions3 \
+nnc_expandspacedim1 \
+nnc_foldspacedims1 \
+nnc_frombdshape1 \
+nnc_frombox1 \
+nnc_fromgrid1 \
+nnc_fromoctagonalshape1 \
+nnc_generalizedaffineimage1 \
+nnc_generalizedaffinepreimage1 \
+nnc_generators1 \
+nnc_geomcovers1 \
+nnc_h79widening1 \
+nnc_intersection1 \
+nnc_simplifyusingcontext1 \
+nnc_limitedbhrz03extrapolation1 \
+nnc_limitedh79extrapolation1 \
+nnc_linearpartition1 \
+nnc_mapspacedims1 \
+nnc_max_min1 \
+nnc_mc91 \
+nnc_membytes1 \
+nnc_minconstraints1 \
+nnc_mingenerators1 \
+nnc_onepoint \
+nnc_permute \
+nnc_polydifference1 \
+nnc_polyhull1 \
+nnc_randphull1 \
+nnc_relations1 nnc_relations2 \
+nnc_removespacedims1 \
+nnc_smm1 \
+nnc_timeelapse1 \
+nnc_unconstrain1 \
+nnc_universe1 \
+nnc_writepolyhedron1
 
 
 #
 # Sources for the tests
 #
+hybrid_SOURCES = hybrid.cc
 addcongruence1_SOURCES = addcongruence1.cc
 addcongruences1_SOURCES = addcongruences1.cc
 addconstraint1_SOURCES = addconstraint1.cc
@@ -1905,16 +2258,15 @@ boundedaffineimage1_SOURCES = boundedaffineimage1.cc
 boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
 boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
 boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
-boundingbox1_SOURCES = boundingbox1.cc
-boundingbox2_SOURCES = boundingbox2.cc
-boundingbox3_SOURCES = boundingbox3.cc
 bounds1_SOURCES = bounds1.cc
 cnncconversion1_SOURCES = cnncconversion1.cc
 concatenate1_SOURCES = concatenate1.cc
 congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
 constraints1_SOURCES = constraints1.cc
 contains1_SOURCES = contains1.cc
 contains2_SOURCES = contains2.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
 disjoint1_SOURCES = disjoint1.cc
 disjoint2_SOURCES = disjoint2.cc
 dualhypercubes_SOURCES = dualhypercubes.cc
@@ -1927,6 +2279,11 @@ expandspacedim1_SOURCES = expandspacedim1.cc
 expandspacedim2_SOURCES = expandspacedim2.cc
 foldspacedims1_SOURCES = foldspacedims1.cc
 foldspacedims2_SOURCES = foldspacedims2.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+frombox2_SOURCES = frombox2.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
 generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
 generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
@@ -1936,19 +2293,18 @@ geomcovers1_SOURCES = geomcovers1.cc
 h79widening1_SOURCES = h79widening1.cc
 h79widening2_SOURCES = h79widening2.cc
 intersection1_SOURCES = intersection1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
 limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
 limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
 linearpartition1_SOURCES = linearpartition1.cc
 linexpression1_SOURCES = linexpression1.cc
 linearsystem1_SOURCES = linearsystem1.cc
-lpproblem1_SOURCES = lpproblem1.cc
 mapspacedims1_SOURCES = mapspacedims1.cc
 matrix1_SOURCES = matrix1.cc
 max_min1_SOURCES = max_min1.cc
 maxspacedim1_SOURCES = maxspacedim1.cc
 mc91_SOURCES = mc91.cc
 membytes1_SOURCES = membytes1.cc
-membytes2_SOURCES = membytes2.cc
 memory1_SOURCES = memory1.cc
 memory2_SOURCES = memory2.cc
 minconstraints1_SOURCES = minconstraints1.cc
@@ -1964,11 +2320,12 @@ polydifference1_SOURCES = polydifference1.cc
 polydifference2_SOURCES = polydifference2.cc
 polyhull1_SOURCES = polyhull1.cc
 polyhull2_SOURCES = polyhull2.cc
-polypowerset1_SOURCES = polypowerset1.cc
-powerset1_SOURCES = powerset1.cc
 randphull1_SOURCES = randphull1.cc
-randphull2_SOURCES = randphull2.cc
-randphull2_LDADD = $(LDADD) -lm
+randphull1_LDADD = $(LDADD) -lm
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
 relations1_SOURCES = relations1.cc
 relations2_SOURCES = relations2.cc
 relations3_SOURCES = relations3.cc
@@ -1979,8 +2336,10 @@ timeelapse1_SOURCES = timeelapse1.cc
 timeelapse2_SOURCES = timeelapse2.cc
 topclosed1_SOURCES = topclosed1.cc
 topclosure1_SOURCES = topclosure1.cc
+unconstrain1_SOURCES = unconstrain1.cc
 universe1_SOURCES = universe1.cc
 universe2_SOURCES = universe2.cc
+variablesset1_SOURCES = variablesset1.cc
 writeconsys1_SOURCES = writeconsys1.cc
 writegensys1_SOURCES = writegensys1.cc
 writepolyhedron1_SOURCES = writepolyhedron1.cc
@@ -2036,20 +2395,20 @@ nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
 nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
 nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_boundingbox1_SOURCES = boundingbox1.cc
-nnc_boundingbox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_boundingbox2_SOURCES = boundingbox2.cc
-nnc_boundingbox2_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_bounds1_SOURCES = bounds1.cc
 nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_concatenate1_SOURCES = concatenate1.cc
 nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_congruences1_SOURCES = congruences1.cc
 nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_constrains1_SOURCES = constrains1.cc
+nnc_constrains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_constraints1_SOURCES = constraints1.cc
 nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_contains1_SOURCES = contains1.cc
 nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+nnc_containsintegerpoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_disjoint1_SOURCES = disjoint1.cc
 nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_empty1_SOURCES = empty1.cc
@@ -2064,6 +2423,14 @@ nnc_expandspacedim1_SOURCES = expandspacedim1.cc
 nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_foldspacedims1_SOURCES = foldspacedims1.cc
 nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_frombdshape1_SOURCES = frombdshape1.cc
+nnc_frombdshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_frombox1_SOURCES = frombox1.cc
+nnc_frombox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_fromgrid1_SOURCES = fromgrid1.cc
+nnc_fromgrid1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+nnc_fromoctagonalshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
 nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
@@ -2076,6 +2443,8 @@ nnc_h79widening1_SOURCES = h79widening1.cc
 nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_intersection1_SOURCES = intersection1.cc
 nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+nnc_simplifyusingcontext1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
 nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
@@ -2090,8 +2459,6 @@ nnc_mc91_SOURCES = mc91.cc
 nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_membytes1_SOURCES = membytes1.cc
 nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_membytes2_SOURCES = membytes2.cc
-nnc_membytes2_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_minconstraints1_SOURCES = minconstraints1.cc
 nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_mingenerators1_SOURCES = mingenerators1.cc
@@ -2106,9 +2473,7 @@ nnc_polyhull1_SOURCES = polyhull1.cc
 nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_randphull1_SOURCES = randphull1.cc
 nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_randphull2_SOURCES = randphull2.cc
-nnc_randphull2_CXXFLAGS = $(DERIVED_CXXFLAGS)
-nnc_randphull2_LDADD = $(LDADD) -lm
+nnc_randphull1_LDADD = $(LDADD) -lm
 nnc_relations1_SOURCES = relations1.cc
 nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_relations2_SOURCES = relations2.cc
@@ -2119,6 +2484,8 @@ nnc_smm1_SOURCES = smm1.cc
 nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_timeelapse1_SOURCES = timeelapse1.cc
 nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_unconstrain1_SOURCES = unconstrain1.cc
+nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_universe1_SOURCES = universe1.cc
 nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
@@ -2126,56 +2493,23 @@ nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
 watchdog1_SRCS = watchdog1.cc
 @BUILD_WATCHDOG_LIBRARY_TRUE at WATCHDOG_TESTS = watchdog1
 @BUILD_WATCHDOG_LIBRARY_TRUE at watchdog1_SOURCES = $(watchdog1_SRCS)
- at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
-TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
-XFAIL_ALWAYS = 
-XFAIL_WITH_INT64 = \
-$(XFAIL_ALWAYS) \
-randphull2 \
-nnc_randphull2
-
-XFAIL_WITH_INT32 = \
-$(XFAIL_WITH_INT64)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_CPPFLAGS = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(AM_CPPFLAGS) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog/src
 
-XFAIL_WITH_INT16 = \
-$(XFAIL_WITH_INT32)
-
-XFAIL_WITH_INT8 = \
-$(XFAIL_WITH_INT16) \
-membytes1 \
-randphull1 \
-smm1 \
-nnc_membytes1 \
-nnc_randphull1 \
-nnc_smm1
-
-XFAIL_WITH_INT8_A = \
-$(XFAIL_WITH_INT8) \
-membytes2 \
-nnc_membytes2
-
- at ASSERTIONS_ENABLED_FALSE@@USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8)
- at ASSERTIONS_ENABLED_TRUE@@USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8_A)
- at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_FALSE at XFAIL_SET = $(XFAIL_ALWAYS)
- at USE_INT16_TRUE@@USE_INT32_FALSE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT16)
- at USE_INT32_TRUE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT32)
- at USE_INT64_TRUE@XFAIL_SET = $(XFAIL_WITH_INT64)
-XFAIL_TESTS = $(XFAIL_SET)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
 EXTRA_DIST = $(watchdog1_SRCS)
-BUGS = bug2
-bug2_SOURCES = bug2.cc
-bug2_CXXFLAGS = -DSRCDIR=\"$(srcdir)\"
+BUGS = 
 MOSTLYCLEANFILES = \
 ascii_dump_load1.dat \
 ascii_dump_load2.dat \
 ascii_dump_load3.dat \
 matrix1.dat \
 linearsystem1.dat \
-writeconsys1.dat \
 writegensys1.dat \
 writepolyhedron1.dat \
 writepolyhedron2.dat \
-writerelation1.dat \
 writevariable1.dat
 
 all: all-am
@@ -2220,538 +2554,568 @@ clean-checkPROGRAMS:
 	done
 addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) 
 	@rm -f addcongruence1$(EXEEXT)
-	$(CXXLINK) $(addcongruence1_LDFLAGS) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+	$(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
 addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) 
 	@rm -f addcongruences1$(EXEEXT)
-	$(CXXLINK) $(addcongruences1_LDFLAGS) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+	$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
 addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) 
 	@rm -f addconstraint1$(EXEEXT)
-	$(CXXLINK) $(addconstraint1_LDFLAGS) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+	$(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
 addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
 	@rm -f addconstraints1$(EXEEXT)
-	$(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
 addconstraints2$(EXEEXT): $(addconstraints2_OBJECTS) $(addconstraints2_DEPENDENCIES) 
 	@rm -f addconstraints2$(EXEEXT)
-	$(CXXLINK) $(addconstraints2_LDFLAGS) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS)
+	$(CXXLINK) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS)
 addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) 
 	@rm -f addgenerator1$(EXEEXT)
-	$(CXXLINK) $(addgenerator1_LDFLAGS) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+	$(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
 addgenerator2$(EXEEXT): $(addgenerator2_OBJECTS) $(addgenerator2_DEPENDENCIES) 
 	@rm -f addgenerator2$(EXEEXT)
-	$(CXXLINK) $(addgenerator2_LDFLAGS) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS)
+	$(CXXLINK) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS)
 addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) 
 	@rm -f addgenerators1$(EXEEXT)
-	$(CXXLINK) $(addgenerators1_LDFLAGS) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+	$(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
 addgenerators2$(EXEEXT): $(addgenerators2_OBJECTS) $(addgenerators2_DEPENDENCIES) 
 	@rm -f addgenerators2$(EXEEXT)
-	$(CXXLINK) $(addgenerators2_LDFLAGS) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS)
+	$(CXXLINK) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS)
 addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
 	@rm -f addspacedims1$(EXEEXT)
-	$(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
 addspacedims2$(EXEEXT): $(addspacedims2_OBJECTS) $(addspacedims2_DEPENDENCIES) 
 	@rm -f addspacedims2$(EXEEXT)
-	$(CXXLINK) $(addspacedims2_LDFLAGS) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS)
+	$(CXXLINK) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS)
 affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
 	@rm -f affineimage1$(EXEEXT)
-	$(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
 affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
 	@rm -f affineimage2$(EXEEXT)
-	$(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
 affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
 	@rm -f affinepreimage1$(EXEEXT)
-	$(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
 affinetrans$(EXEEXT): $(affinetrans_OBJECTS) $(affinetrans_DEPENDENCIES) 
 	@rm -f affinetrans$(EXEEXT)
-	$(CXXLINK) $(affinetrans_LDFLAGS) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS)
+	$(CXXLINK) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS)
 append1$(EXEEXT): $(append1_OBJECTS) $(append1_DEPENDENCIES) 
 	@rm -f append1$(EXEEXT)
-	$(CXXLINK) $(append1_LDFLAGS) $(append1_OBJECTS) $(append1_LDADD) $(LIBS)
+	$(CXXLINK) $(append1_OBJECTS) $(append1_LDADD) $(LIBS)
 append2$(EXEEXT): $(append2_OBJECTS) $(append2_DEPENDENCIES) 
 	@rm -f append2$(EXEEXT)
-	$(CXXLINK) $(append2_LDFLAGS) $(append2_OBJECTS) $(append2_LDADD) $(LIBS)
+	$(CXXLINK) $(append2_OBJECTS) $(append2_LDADD) $(LIBS)
 ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
 	@rm -f ascii_dump_load1$(EXEEXT)
-	$(CXXLINK) $(ascii_dump_load1_LDFLAGS) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+	$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
 ascii_dump_load2$(EXEEXT): $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_DEPENDENCIES) 
 	@rm -f ascii_dump_load2$(EXEEXT)
-	$(CXXLINK) $(ascii_dump_load2_LDFLAGS) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS)
+	$(CXXLINK) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS)
 ascii_dump_load3$(EXEEXT): $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_DEPENDENCIES) 
 	@rm -f ascii_dump_load3$(EXEEXT)
-	$(CXXLINK) $(ascii_dump_load3_LDFLAGS) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS)
+	$(CXXLINK) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS)
 bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) 
 	@rm -f bgp99extrapolation1$(EXEEXT)
-	$(CXXLINK) $(bgp99extrapolation1_LDFLAGS) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
 bhrz03widening1$(EXEEXT): $(bhrz03widening1_OBJECTS) $(bhrz03widening1_DEPENDENCIES) 
 	@rm -f bhrz03widening1$(EXEEXT)
-	$(CXXLINK) $(bhrz03widening1_LDFLAGS) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS)
 bhrz03widening2$(EXEEXT): $(bhrz03widening2_OBJECTS) $(bhrz03widening2_DEPENDENCIES) 
 	@rm -f bhrz03widening2$(EXEEXT)
-	$(CXXLINK) $(bhrz03widening2_LDFLAGS) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS)
+	$(CXXLINK) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS)
 bhrz03widening3$(EXEEXT): $(bhrz03widening3_OBJECTS) $(bhrz03widening3_DEPENDENCIES) 
 	@rm -f bhrz03widening3$(EXEEXT)
-	$(CXXLINK) $(bhrz03widening3_LDFLAGS) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS)
+	$(CXXLINK) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS)
 bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
 	@rm -f bhz03widening1$(EXEEXT)
-	$(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
 bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
 	@rm -f bounded1$(EXEEXT)
-	$(CXXLINK) $(bounded1_LDFLAGS) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+	$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
 boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) 
 	@rm -f boundedaffineimage1$(EXEEXT)
-	$(CXXLINK) $(boundedaffineimage1_LDFLAGS) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
 boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) 
 	@rm -f boundedaffinepreimage1$(EXEEXT)
-	$(CXXLINK) $(boundedaffinepreimage1_LDFLAGS) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
 boundedbhrz03extrapolation1$(EXEEXT): $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_DEPENDENCIES) 
 	@rm -f boundedbhrz03extrapolation1$(EXEEXT)
-	$(CXXLINK) $(boundedbhrz03extrapolation1_LDFLAGS) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS)
 boundedh79extrapolation1$(EXEEXT): $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_DEPENDENCIES) 
 	@rm -f boundedh79extrapolation1$(EXEEXT)
-	$(CXXLINK) $(boundedh79extrapolation1_LDFLAGS) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS)
-boundingbox1$(EXEEXT): $(boundingbox1_OBJECTS) $(boundingbox1_DEPENDENCIES) 
-	@rm -f boundingbox1$(EXEEXT)
-	$(CXXLINK) $(boundingbox1_LDFLAGS) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
-boundingbox2$(EXEEXT): $(boundingbox2_OBJECTS) $(boundingbox2_DEPENDENCIES) 
-	@rm -f boundingbox2$(EXEEXT)
-	$(CXXLINK) $(boundingbox2_LDFLAGS) $(boundingbox2_OBJECTS) $(boundingbox2_LDADD) $(LIBS)
-boundingbox3$(EXEEXT): $(boundingbox3_OBJECTS) $(boundingbox3_DEPENDENCIES) 
-	@rm -f boundingbox3$(EXEEXT)
-	$(CXXLINK) $(boundingbox3_LDFLAGS) $(boundingbox3_OBJECTS) $(boundingbox3_LDADD) $(LIBS)
+	$(CXXLINK) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS)
 bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) 
 	@rm -f bounds1$(EXEEXT)
-	$(CXXLINK) $(bounds1_LDFLAGS) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
-bug2$(EXEEXT): $(bug2_OBJECTS) $(bug2_DEPENDENCIES) 
-	@rm -f bug2$(EXEEXT)
-	$(CXXLINK) $(bug2_LDFLAGS) $(bug2_OBJECTS) $(bug2_LDADD) $(LIBS)
+	$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
 cnncconversion1$(EXEEXT): $(cnncconversion1_OBJECTS) $(cnncconversion1_DEPENDENCIES) 
 	@rm -f cnncconversion1$(EXEEXT)
-	$(CXXLINK) $(cnncconversion1_LDFLAGS) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS)
+	$(CXXLINK) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS)
 concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
 	@rm -f concatenate1$(EXEEXT)
-	$(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+	$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
 congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
 	@rm -f congruences1$(EXEEXT)
-	$(CXXLINK) $(congruences1_LDFLAGS) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+	$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
 constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
 	@rm -f constraints1$(EXEEXT)
-	$(CXXLINK) $(constraints1_LDFLAGS) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
 contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
 	@rm -f contains1$(EXEEXT)
-	$(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+	$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
 contains2$(EXEEXT): $(contains2_OBJECTS) $(contains2_DEPENDENCIES) 
 	@rm -f contains2$(EXEEXT)
-	$(CXXLINK) $(contains2_LDFLAGS) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS)
+	$(CXXLINK) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS)
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
 disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
 	@rm -f disjoint1$(EXEEXT)
-	$(CXXLINK) $(disjoint1_LDFLAGS) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+	$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
 disjoint2$(EXEEXT): $(disjoint2_OBJECTS) $(disjoint2_DEPENDENCIES) 
 	@rm -f disjoint2$(EXEEXT)
-	$(CXXLINK) $(disjoint2_LDFLAGS) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS)
+	$(CXXLINK) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS)
 dualhypercubes$(EXEEXT): $(dualhypercubes_OBJECTS) $(dualhypercubes_DEPENDENCIES) 
 	@rm -f dualhypercubes$(EXEEXT)
-	$(CXXLINK) $(dualhypercubes_LDFLAGS) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS)
+	$(CXXLINK) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS)
 empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) 
 	@rm -f empty1$(EXEEXT)
-	$(CXXLINK) $(empty1_LDFLAGS) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+	$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
 equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) 
 	@rm -f equals1$(EXEEXT)
-	$(CXXLINK) $(equals1_LDFLAGS) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+	$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
 exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) 
 	@rm -f exceptions1$(EXEEXT)
-	$(CXXLINK) $(exceptions1_LDFLAGS) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+	$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
 exceptions2$(EXEEXT): $(exceptions2_OBJECTS) $(exceptions2_DEPENDENCIES) 
 	@rm -f exceptions2$(EXEEXT)
-	$(CXXLINK) $(exceptions2_LDFLAGS) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS)
+	$(CXXLINK) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS)
 exceptions3$(EXEEXT): $(exceptions3_OBJECTS) $(exceptions3_DEPENDENCIES) 
 	@rm -f exceptions3$(EXEEXT)
-	$(CXXLINK) $(exceptions3_LDFLAGS) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS)
+	$(CXXLINK) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS)
 expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
 	@rm -f expandspacedim1$(EXEEXT)
-	$(CXXLINK) $(expandspacedim1_LDFLAGS) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+	$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
 expandspacedim2$(EXEEXT): $(expandspacedim2_OBJECTS) $(expandspacedim2_DEPENDENCIES) 
 	@rm -f expandspacedim2$(EXEEXT)
-	$(CXXLINK) $(expandspacedim2_LDFLAGS) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS)
+	$(CXXLINK) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS)
 foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
 	@rm -f foldspacedims1$(EXEEXT)
-	$(CXXLINK) $(foldspacedims1_LDFLAGS) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
 foldspacedims2$(EXEEXT): $(foldspacedims2_OBJECTS) $(foldspacedims2_DEPENDENCIES) 
 	@rm -f foldspacedims2$(EXEEXT)
-	$(CXXLINK) $(foldspacedims2_LDFLAGS) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS)
+	$(CXXLINK) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS)
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+frombox2$(EXEEXT): $(frombox2_OBJECTS) $(frombox2_DEPENDENCIES) 
+	@rm -f frombox2$(EXEEXT)
+	$(CXXLINK) $(frombox2_OBJECTS) $(frombox2_LDADD) $(LIBS)
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
 generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
 	@rm -f generalizedaffineimage1$(EXEEXT)
-	$(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
 generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
 	@rm -f generalizedaffineimage2$(EXEEXT)
-	$(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
 generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
 	@rm -f generalizedaffinepreimage1$(EXEEXT)
-	$(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
 generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
 	@rm -f generalizedaffinepreimage2$(EXEEXT)
-	$(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+	$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
 generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) 
 	@rm -f generators1$(EXEEXT)
-	$(CXXLINK) $(generators1_LDFLAGS) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+	$(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
 geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) 
 	@rm -f geomcovers1$(EXEEXT)
-	$(CXXLINK) $(geomcovers1_LDFLAGS) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+	$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
 h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) 
 	@rm -f h79widening1$(EXEEXT)
-	$(CXXLINK) $(h79widening1_LDFLAGS) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+	$(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
 h79widening2$(EXEEXT): $(h79widening2_OBJECTS) $(h79widening2_DEPENDENCIES) 
 	@rm -f h79widening2$(EXEEXT)
-	$(CXXLINK) $(h79widening2_LDFLAGS) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS)
+	$(CXXLINK) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS)
+hybrid$(EXEEXT): $(hybrid_OBJECTS) $(hybrid_DEPENDENCIES) 
+	@rm -f hybrid$(EXEEXT)
+	$(CXXLINK) $(hybrid_OBJECTS) $(hybrid_LDADD) $(LIBS)
 intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
 	@rm -f intersection1$(EXEEXT)
-	$(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+	$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
 limitedbhrz03extrapolation1$(EXEEXT): $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_DEPENDENCIES) 
 	@rm -f limitedbhrz03extrapolation1$(EXEEXT)
-	$(CXXLINK) $(limitedbhrz03extrapolation1_LDFLAGS) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS)
 limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) 
 	@rm -f limitedh79extrapolation1$(EXEEXT)
-	$(CXXLINK) $(limitedh79extrapolation1_LDFLAGS) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
 linearpartition1$(EXEEXT): $(linearpartition1_OBJECTS) $(linearpartition1_DEPENDENCIES) 
 	@rm -f linearpartition1$(EXEEXT)
-	$(CXXLINK) $(linearpartition1_LDFLAGS) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS)
+	$(CXXLINK) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS)
 linearsystem1$(EXEEXT): $(linearsystem1_OBJECTS) $(linearsystem1_DEPENDENCIES) 
 	@rm -f linearsystem1$(EXEEXT)
-	$(CXXLINK) $(linearsystem1_LDFLAGS) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS)
+	$(CXXLINK) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS)
 linexpression1$(EXEEXT): $(linexpression1_OBJECTS) $(linexpression1_DEPENDENCIES) 
 	@rm -f linexpression1$(EXEEXT)
-	$(CXXLINK) $(linexpression1_LDFLAGS) $(linexpression1_OBJECTS) $(linexpression1_LDADD) $(LIBS)
-lpproblem1$(EXEEXT): $(lpproblem1_OBJECTS) $(lpproblem1_DEPENDENCIES) 
-	@rm -f lpproblem1$(EXEEXT)
-	$(CXXLINK) $(lpproblem1_LDFLAGS) $(lpproblem1_OBJECTS) $(lpproblem1_LDADD) $(LIBS)
+	$(CXXLINK) $(linexpression1_OBJECTS) $(linexpression1_LDADD) $(LIBS)
 mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
 	@rm -f mapspacedims1$(EXEEXT)
-	$(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
 matrix1$(EXEEXT): $(matrix1_OBJECTS) $(matrix1_DEPENDENCIES) 
 	@rm -f matrix1$(EXEEXT)
-	$(CXXLINK) $(matrix1_LDFLAGS) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS)
+	$(CXXLINK) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS)
 max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) 
 	@rm -f max_min1$(EXEEXT)
-	$(CXXLINK) $(max_min1_LDFLAGS) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+	$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
 maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) 
 	@rm -f maxspacedim1$(EXEEXT)
-	$(CXXLINK) $(maxspacedim1_LDFLAGS) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+	$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
 mc91$(EXEEXT): $(mc91_OBJECTS) $(mc91_DEPENDENCIES) 
 	@rm -f mc91$(EXEEXT)
-	$(CXXLINK) $(mc91_LDFLAGS) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS)
+	$(CXXLINK) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS)
 membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
 	@rm -f membytes1$(EXEEXT)
-	$(CXXLINK) $(membytes1_LDFLAGS) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
-membytes2$(EXEEXT): $(membytes2_OBJECTS) $(membytes2_DEPENDENCIES) 
-	@rm -f membytes2$(EXEEXT)
-	$(CXXLINK) $(membytes2_LDFLAGS) $(membytes2_OBJECTS) $(membytes2_LDADD) $(LIBS)
+	$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
 memory1$(EXEEXT): $(memory1_OBJECTS) $(memory1_DEPENDENCIES) 
 	@rm -f memory1$(EXEEXT)
-	$(CXXLINK) $(memory1_LDFLAGS) $(memory1_OBJECTS) $(memory1_LDADD) $(LIBS)
+	$(CXXLINK) $(memory1_OBJECTS) $(memory1_LDADD) $(LIBS)
 memory2$(EXEEXT): $(memory2_OBJECTS) $(memory2_DEPENDENCIES) 
 	@rm -f memory2$(EXEEXT)
-	$(CXXLINK) $(memory2_LDFLAGS) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS)
+	$(CXXLINK) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS)
 minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) 
 	@rm -f minconstraints1$(EXEEXT)
-	$(CXXLINK) $(minconstraints1_LDFLAGS) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+	$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
 minconstraints2$(EXEEXT): $(minconstraints2_OBJECTS) $(minconstraints2_DEPENDENCIES) 
 	@rm -f minconstraints2$(EXEEXT)
-	$(CXXLINK) $(minconstraints2_LDFLAGS) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS)
+	$(CXXLINK) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS)
 mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) 
 	@rm -f mingenerators1$(EXEEXT)
-	$(CXXLINK) $(mingenerators1_LDFLAGS) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+	$(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
 mingenerators2$(EXEEXT): $(mingenerators2_OBJECTS) $(mingenerators2_DEPENDENCIES) 
 	@rm -f mingenerators2$(EXEEXT)
-	$(CXXLINK) $(mingenerators2_LDFLAGS) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS)
+	$(CXXLINK) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS)
 nnc_addcongruence1$(EXEEXT): $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_DEPENDENCIES) 
 	@rm -f nnc_addcongruence1$(EXEEXT)
-	$(CXXLINK) $(nnc_addcongruence1_LDFLAGS) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS)
+	$(nnc_addcongruence1_LINK) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS)
 nnc_addcongruences1$(EXEEXT): $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_DEPENDENCIES) 
 	@rm -f nnc_addcongruences1$(EXEEXT)
-	$(CXXLINK) $(nnc_addcongruences1_LDFLAGS) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS)
+	$(nnc_addcongruences1_LINK) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS)
 nnc_addconstraint1$(EXEEXT): $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_DEPENDENCIES) 
 	@rm -f nnc_addconstraint1$(EXEEXT)
-	$(CXXLINK) $(nnc_addconstraint1_LDFLAGS) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS)
+	$(nnc_addconstraint1_LINK) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS)
 nnc_addconstraints1$(EXEEXT): $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_DEPENDENCIES) 
 	@rm -f nnc_addconstraints1$(EXEEXT)
-	$(CXXLINK) $(nnc_addconstraints1_LDFLAGS) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS)
+	$(nnc_addconstraints1_LINK) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS)
 nnc_addgenerator1$(EXEEXT): $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_DEPENDENCIES) 
 	@rm -f nnc_addgenerator1$(EXEEXT)
-	$(CXXLINK) $(nnc_addgenerator1_LDFLAGS) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS)
+	$(nnc_addgenerator1_LINK) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS)
 nnc_addgenerators1$(EXEEXT): $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_DEPENDENCIES) 
 	@rm -f nnc_addgenerators1$(EXEEXT)
-	$(CXXLINK) $(nnc_addgenerators1_LDFLAGS) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS)
+	$(nnc_addgenerators1_LINK) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS)
 nnc_addspacedims1$(EXEEXT): $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_DEPENDENCIES) 
 	@rm -f nnc_addspacedims1$(EXEEXT)
-	$(CXXLINK) $(nnc_addspacedims1_LDFLAGS) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS)
+	$(nnc_addspacedims1_LINK) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS)
 nnc_affineimage1$(EXEEXT): $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_DEPENDENCIES) 
 	@rm -f nnc_affineimage1$(EXEEXT)
-	$(CXXLINK) $(nnc_affineimage1_LDFLAGS) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS)
+	$(nnc_affineimage1_LINK) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS)
 nnc_affinepreimage1$(EXEEXT): $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_DEPENDENCIES) 
 	@rm -f nnc_affinepreimage1$(EXEEXT)
-	$(CXXLINK) $(nnc_affinepreimage1_LDFLAGS) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS)
+	$(nnc_affinepreimage1_LINK) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS)
 nnc_affinetrans$(EXEEXT): $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_DEPENDENCIES) 
 	@rm -f nnc_affinetrans$(EXEEXT)
-	$(CXXLINK) $(nnc_affinetrans_LDFLAGS) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS)
+	$(nnc_affinetrans_LINK) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS)
 nnc_append1$(EXEEXT): $(nnc_append1_OBJECTS) $(nnc_append1_DEPENDENCIES) 
 	@rm -f nnc_append1$(EXEEXT)
-	$(CXXLINK) $(nnc_append1_LDFLAGS) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS)
+	$(nnc_append1_LINK) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS)
 nnc_append2$(EXEEXT): $(nnc_append2_OBJECTS) $(nnc_append2_DEPENDENCIES) 
 	@rm -f nnc_append2$(EXEEXT)
-	$(CXXLINK) $(nnc_append2_LDFLAGS) $(nnc_append2_OBJECTS) $(nnc_append2_LDADD) $(LIBS)
+	$(nnc_append2_LINK) $(nnc_append2_OBJECTS) $(nnc_append2_LDADD) $(LIBS)
 nnc_ascii_dump_load1$(EXEEXT): $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_DEPENDENCIES) 
 	@rm -f nnc_ascii_dump_load1$(EXEEXT)
-	$(CXXLINK) $(nnc_ascii_dump_load1_LDFLAGS) $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_LDADD) $(LIBS)
+	$(nnc_ascii_dump_load1_LINK) $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_LDADD) $(LIBS)
 nnc_ascii_dump_load2$(EXEEXT): $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_DEPENDENCIES) 
 	@rm -f nnc_ascii_dump_load2$(EXEEXT)
-	$(CXXLINK) $(nnc_ascii_dump_load2_LDFLAGS) $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_LDADD) $(LIBS)
+	$(nnc_ascii_dump_load2_LINK) $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_LDADD) $(LIBS)
 nnc_bgp99extrapolation1$(EXEEXT): $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_DEPENDENCIES) 
 	@rm -f nnc_bgp99extrapolation1$(EXEEXT)
-	$(CXXLINK) $(nnc_bgp99extrapolation1_LDFLAGS) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS)
+	$(nnc_bgp99extrapolation1_LINK) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS)
 nnc_bhrz03widening1$(EXEEXT): $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_DEPENDENCIES) 
 	@rm -f nnc_bhrz03widening1$(EXEEXT)
-	$(CXXLINK) $(nnc_bhrz03widening1_LDFLAGS) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS)
+	$(nnc_bhrz03widening1_LINK) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS)
 nnc_bhrz03widening2$(EXEEXT): $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_DEPENDENCIES) 
 	@rm -f nnc_bhrz03widening2$(EXEEXT)
-	$(CXXLINK) $(nnc_bhrz03widening2_LDFLAGS) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS)
+	$(nnc_bhrz03widening2_LINK) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS)
 nnc_bounded1$(EXEEXT): $(nnc_bounded1_OBJECTS) $(nnc_bounded1_DEPENDENCIES) 
 	@rm -f nnc_bounded1$(EXEEXT)
-	$(CXXLINK) $(nnc_bounded1_LDFLAGS) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS)
+	$(nnc_bounded1_LINK) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS)
 nnc_boundedaffineimage1$(EXEEXT): $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_DEPENDENCIES) 
 	@rm -f nnc_boundedaffineimage1$(EXEEXT)
-	$(CXXLINK) $(nnc_boundedaffineimage1_LDFLAGS) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS)
+	$(nnc_boundedaffineimage1_LINK) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS)
 nnc_boundedaffinepreimage1$(EXEEXT): $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_DEPENDENCIES) 
 	@rm -f nnc_boundedaffinepreimage1$(EXEEXT)
-	$(CXXLINK) $(nnc_boundedaffinepreimage1_LDFLAGS) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS)
+	$(nnc_boundedaffinepreimage1_LINK) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS)
 nnc_boundedbhrz03extrapolation1$(EXEEXT): $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_DEPENDENCIES) 
 	@rm -f nnc_boundedbhrz03extrapolation1$(EXEEXT)
-	$(CXXLINK) $(nnc_boundedbhrz03extrapolation1_LDFLAGS) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS)
+	$(CXXLINK) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS)
 nnc_boundedh79extrapolation1$(EXEEXT): $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_DEPENDENCIES) 
 	@rm -f nnc_boundedh79extrapolation1$(EXEEXT)
-	$(CXXLINK) $(nnc_boundedh79extrapolation1_LDFLAGS) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS)
-nnc_boundingbox1$(EXEEXT): $(nnc_boundingbox1_OBJECTS) $(nnc_boundingbox1_DEPENDENCIES) 
-	@rm -f nnc_boundingbox1$(EXEEXT)
-	$(CXXLINK) $(nnc_boundingbox1_LDFLAGS) $(nnc_boundingbox1_OBJECTS) $(nnc_boundingbox1_LDADD) $(LIBS)
-nnc_boundingbox2$(EXEEXT): $(nnc_boundingbox2_OBJECTS) $(nnc_boundingbox2_DEPENDENCIES) 
-	@rm -f nnc_boundingbox2$(EXEEXT)
-	$(CXXLINK) $(nnc_boundingbox2_LDFLAGS) $(nnc_boundingbox2_OBJECTS) $(nnc_boundingbox2_LDADD) $(LIBS)
+	$(nnc_boundedh79extrapolation1_LINK) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS)
 nnc_bounds1$(EXEEXT): $(nnc_bounds1_OBJECTS) $(nnc_bounds1_DEPENDENCIES) 
 	@rm -f nnc_bounds1$(EXEEXT)
-	$(CXXLINK) $(nnc_bounds1_LDFLAGS) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS)
+	$(nnc_bounds1_LINK) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS)
 nnc_concatenate1$(EXEEXT): $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_DEPENDENCIES) 
 	@rm -f nnc_concatenate1$(EXEEXT)
-	$(CXXLINK) $(nnc_concatenate1_LDFLAGS) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS)
+	$(nnc_concatenate1_LINK) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS)
 nnc_congruences1$(EXEEXT): $(nnc_congruences1_OBJECTS) $(nnc_congruences1_DEPENDENCIES) 
 	@rm -f nnc_congruences1$(EXEEXT)
-	$(CXXLINK) $(nnc_congruences1_LDFLAGS) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS)
+	$(nnc_congruences1_LINK) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS)
+nnc_constrains1$(EXEEXT): $(nnc_constrains1_OBJECTS) $(nnc_constrains1_DEPENDENCIES) 
+	@rm -f nnc_constrains1$(EXEEXT)
+	$(nnc_constrains1_LINK) $(nnc_constrains1_OBJECTS) $(nnc_constrains1_LDADD) $(LIBS)
 nnc_constraints1$(EXEEXT): $(nnc_constraints1_OBJECTS) $(nnc_constraints1_DEPENDENCIES) 
 	@rm -f nnc_constraints1$(EXEEXT)
-	$(CXXLINK) $(nnc_constraints1_LDFLAGS) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS)
+	$(nnc_constraints1_LINK) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS)
 nnc_contains1$(EXEEXT): $(nnc_contains1_OBJECTS) $(nnc_contains1_DEPENDENCIES) 
 	@rm -f nnc_contains1$(EXEEXT)
-	$(CXXLINK) $(nnc_contains1_LDFLAGS) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS)
+	$(nnc_contains1_LINK) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS)
+nnc_containsintegerpoint1$(EXEEXT): $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f nnc_containsintegerpoint1$(EXEEXT)
+	$(nnc_containsintegerpoint1_LINK) $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_LDADD) $(LIBS)
 nnc_disjoint1$(EXEEXT): $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_DEPENDENCIES) 
 	@rm -f nnc_disjoint1$(EXEEXT)
-	$(CXXLINK) $(nnc_disjoint1_LDFLAGS) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS)
+	$(nnc_disjoint1_LINK) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS)
 nnc_empty1$(EXEEXT): $(nnc_empty1_OBJECTS) $(nnc_empty1_DEPENDENCIES) 
 	@rm -f nnc_empty1$(EXEEXT)
-	$(CXXLINK) $(nnc_empty1_LDFLAGS) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS)
+	$(nnc_empty1_LINK) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS)
 nnc_equals1$(EXEEXT): $(nnc_equals1_OBJECTS) $(nnc_equals1_DEPENDENCIES) 
 	@rm -f nnc_equals1$(EXEEXT)
-	$(CXXLINK) $(nnc_equals1_LDFLAGS) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS)
+	$(nnc_equals1_LINK) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS)
 nnc_exceptions1$(EXEEXT): $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_DEPENDENCIES) 
 	@rm -f nnc_exceptions1$(EXEEXT)
-	$(CXXLINK) $(nnc_exceptions1_LDFLAGS) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS)
+	$(nnc_exceptions1_LINK) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS)
 nnc_exceptions3$(EXEEXT): $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_DEPENDENCIES) 
 	@rm -f nnc_exceptions3$(EXEEXT)
-	$(CXXLINK) $(nnc_exceptions3_LDFLAGS) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS)
+	$(nnc_exceptions3_LINK) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS)
 nnc_expandspacedim1$(EXEEXT): $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_DEPENDENCIES) 
 	@rm -f nnc_expandspacedim1$(EXEEXT)
-	$(CXXLINK) $(nnc_expandspacedim1_LDFLAGS) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS)
+	$(nnc_expandspacedim1_LINK) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS)
 nnc_foldspacedims1$(EXEEXT): $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_DEPENDENCIES) 
 	@rm -f nnc_foldspacedims1$(EXEEXT)
-	$(CXXLINK) $(nnc_foldspacedims1_LDFLAGS) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS)
+	$(nnc_foldspacedims1_LINK) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS)
+nnc_frombdshape1$(EXEEXT): $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_DEPENDENCIES) 
+	@rm -f nnc_frombdshape1$(EXEEXT)
+	$(nnc_frombdshape1_LINK) $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_LDADD) $(LIBS)
+nnc_frombox1$(EXEEXT): $(nnc_frombox1_OBJECTS) $(nnc_frombox1_DEPENDENCIES) 
+	@rm -f nnc_frombox1$(EXEEXT)
+	$(nnc_frombox1_LINK) $(nnc_frombox1_OBJECTS) $(nnc_frombox1_LDADD) $(LIBS)
+nnc_fromgrid1$(EXEEXT): $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_DEPENDENCIES) 
+	@rm -f nnc_fromgrid1$(EXEEXT)
+	$(nnc_fromgrid1_LINK) $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_LDADD) $(LIBS)
+nnc_fromoctagonalshape1$(EXEEXT): $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f nnc_fromoctagonalshape1$(EXEEXT)
+	$(nnc_fromoctagonalshape1_LINK) $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_LDADD) $(LIBS)
 nnc_generalizedaffineimage1$(EXEEXT): $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_DEPENDENCIES) 
 	@rm -f nnc_generalizedaffineimage1$(EXEEXT)
-	$(CXXLINK) $(nnc_generalizedaffineimage1_LDFLAGS) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS)
+	$(nnc_generalizedaffineimage1_LINK) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS)
 nnc_generalizedaffinepreimage1$(EXEEXT): $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_DEPENDENCIES) 
 	@rm -f nnc_generalizedaffinepreimage1$(EXEEXT)
-	$(CXXLINK) $(nnc_generalizedaffinepreimage1_LDFLAGS) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS)
+	$(nnc_generalizedaffinepreimage1_LINK) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS)
 nnc_generators1$(EXEEXT): $(nnc_generators1_OBJECTS) $(nnc_generators1_DEPENDENCIES) 
 	@rm -f nnc_generators1$(EXEEXT)
-	$(CXXLINK) $(nnc_generators1_LDFLAGS) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS)
+	$(nnc_generators1_LINK) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS)
 nnc_geomcovers1$(EXEEXT): $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_DEPENDENCIES) 
 	@rm -f nnc_geomcovers1$(EXEEXT)
-	$(CXXLINK) $(nnc_geomcovers1_LDFLAGS) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS)
+	$(nnc_geomcovers1_LINK) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS)
 nnc_h79widening1$(EXEEXT): $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_DEPENDENCIES) 
 	@rm -f nnc_h79widening1$(EXEEXT)
-	$(CXXLINK) $(nnc_h79widening1_LDFLAGS) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS)
+	$(nnc_h79widening1_LINK) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS)
 nnc_intersection1$(EXEEXT): $(nnc_intersection1_OBJECTS) $(nnc_intersection1_DEPENDENCIES) 
 	@rm -f nnc_intersection1$(EXEEXT)
-	$(CXXLINK) $(nnc_intersection1_LDFLAGS) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS)
+	$(nnc_intersection1_LINK) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS)
 nnc_limitedbhrz03extrapolation1$(EXEEXT): $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_DEPENDENCIES) 
 	@rm -f nnc_limitedbhrz03extrapolation1$(EXEEXT)
-	$(CXXLINK) $(nnc_limitedbhrz03extrapolation1_LDFLAGS) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS)
+	$(nnc_limitedbhrz03extrapolation1_LINK) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS)
 nnc_limitedh79extrapolation1$(EXEEXT): $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_DEPENDENCIES) 
 	@rm -f nnc_limitedh79extrapolation1$(EXEEXT)
-	$(CXXLINK) $(nnc_limitedh79extrapolation1_LDFLAGS) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS)
+	$(nnc_limitedh79extrapolation1_LINK) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS)
 nnc_linearpartition1$(EXEEXT): $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_DEPENDENCIES) 
 	@rm -f nnc_linearpartition1$(EXEEXT)
-	$(CXXLINK) $(nnc_linearpartition1_LDFLAGS) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS)
+	$(nnc_linearpartition1_LINK) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS)
 nnc_mapspacedims1$(EXEEXT): $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_DEPENDENCIES) 
 	@rm -f nnc_mapspacedims1$(EXEEXT)
-	$(CXXLINK) $(nnc_mapspacedims1_LDFLAGS) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS)
+	$(nnc_mapspacedims1_LINK) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS)
 nnc_max_min1$(EXEEXT): $(nnc_max_min1_OBJECTS) $(nnc_max_min1_DEPENDENCIES) 
 	@rm -f nnc_max_min1$(EXEEXT)
-	$(CXXLINK) $(nnc_max_min1_LDFLAGS) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS)
+	$(nnc_max_min1_LINK) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS)
 nnc_mc91$(EXEEXT): $(nnc_mc91_OBJECTS) $(nnc_mc91_DEPENDENCIES) 
 	@rm -f nnc_mc91$(EXEEXT)
-	$(CXXLINK) $(nnc_mc91_LDFLAGS) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS)
+	$(nnc_mc91_LINK) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS)
 nnc_membytes1$(EXEEXT): $(nnc_membytes1_OBJECTS) $(nnc_membytes1_DEPENDENCIES) 
 	@rm -f nnc_membytes1$(EXEEXT)
-	$(CXXLINK) $(nnc_membytes1_LDFLAGS) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS)
-nnc_membytes2$(EXEEXT): $(nnc_membytes2_OBJECTS) $(nnc_membytes2_DEPENDENCIES) 
-	@rm -f nnc_membytes2$(EXEEXT)
-	$(CXXLINK) $(nnc_membytes2_LDFLAGS) $(nnc_membytes2_OBJECTS) $(nnc_membytes2_LDADD) $(LIBS)
+	$(nnc_membytes1_LINK) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS)
 nnc_minconstraints1$(EXEEXT): $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_DEPENDENCIES) 
 	@rm -f nnc_minconstraints1$(EXEEXT)
-	$(CXXLINK) $(nnc_minconstraints1_LDFLAGS) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS)
+	$(nnc_minconstraints1_LINK) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS)
 nnc_mingenerators1$(EXEEXT): $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_DEPENDENCIES) 
 	@rm -f nnc_mingenerators1$(EXEEXT)
-	$(CXXLINK) $(nnc_mingenerators1_LDFLAGS) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS)
+	$(nnc_mingenerators1_LINK) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS)
 nnc_onepoint$(EXEEXT): $(nnc_onepoint_OBJECTS) $(nnc_onepoint_DEPENDENCIES) 
 	@rm -f nnc_onepoint$(EXEEXT)
-	$(CXXLINK) $(nnc_onepoint_LDFLAGS) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS)
+	$(nnc_onepoint_LINK) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS)
 nnc_permute$(EXEEXT): $(nnc_permute_OBJECTS) $(nnc_permute_DEPENDENCIES) 
 	@rm -f nnc_permute$(EXEEXT)
-	$(CXXLINK) $(nnc_permute_LDFLAGS) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS)
+	$(nnc_permute_LINK) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS)
 nnc_polydifference1$(EXEEXT): $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_DEPENDENCIES) 
 	@rm -f nnc_polydifference1$(EXEEXT)
-	$(CXXLINK) $(nnc_polydifference1_LDFLAGS) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS)
+	$(nnc_polydifference1_LINK) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS)
 nnc_polyhull1$(EXEEXT): $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_DEPENDENCIES) 
 	@rm -f nnc_polyhull1$(EXEEXT)
-	$(CXXLINK) $(nnc_polyhull1_LDFLAGS) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS)
+	$(nnc_polyhull1_LINK) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS)
 nnc_randphull1$(EXEEXT): $(nnc_randphull1_OBJECTS) $(nnc_randphull1_DEPENDENCIES) 
 	@rm -f nnc_randphull1$(EXEEXT)
-	$(CXXLINK) $(nnc_randphull1_LDFLAGS) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS)
-nnc_randphull2$(EXEEXT): $(nnc_randphull2_OBJECTS) $(nnc_randphull2_DEPENDENCIES) 
-	@rm -f nnc_randphull2$(EXEEXT)
-	$(CXXLINK) $(nnc_randphull2_LDFLAGS) $(nnc_randphull2_OBJECTS) $(nnc_randphull2_LDADD) $(LIBS)
+	$(nnc_randphull1_LINK) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS)
 nnc_relations1$(EXEEXT): $(nnc_relations1_OBJECTS) $(nnc_relations1_DEPENDENCIES) 
 	@rm -f nnc_relations1$(EXEEXT)
-	$(CXXLINK) $(nnc_relations1_LDFLAGS) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS)
+	$(nnc_relations1_LINK) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS)
 nnc_relations2$(EXEEXT): $(nnc_relations2_OBJECTS) $(nnc_relations2_DEPENDENCIES) 
 	@rm -f nnc_relations2$(EXEEXT)
-	$(CXXLINK) $(nnc_relations2_LDFLAGS) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS)
+	$(nnc_relations2_LINK) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS)
 nnc_removespacedims1$(EXEEXT): $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_DEPENDENCIES) 
 	@rm -f nnc_removespacedims1$(EXEEXT)
-	$(CXXLINK) $(nnc_removespacedims1_LDFLAGS) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS)
+	$(nnc_removespacedims1_LINK) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS)
+nnc_simplifyusingcontext1$(EXEEXT): $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f nnc_simplifyusingcontext1$(EXEEXT)
+	$(nnc_simplifyusingcontext1_LINK) $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_LDADD) $(LIBS)
 nnc_smm1$(EXEEXT): $(nnc_smm1_OBJECTS) $(nnc_smm1_DEPENDENCIES) 
 	@rm -f nnc_smm1$(EXEEXT)
-	$(CXXLINK) $(nnc_smm1_LDFLAGS) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS)
+	$(nnc_smm1_LINK) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS)
 nnc_timeelapse1$(EXEEXT): $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_DEPENDENCIES) 
 	@rm -f nnc_timeelapse1$(EXEEXT)
-	$(CXXLINK) $(nnc_timeelapse1_LDFLAGS) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS)
+	$(nnc_timeelapse1_LINK) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS)
+nnc_unconstrain1$(EXEEXT): $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_DEPENDENCIES) 
+	@rm -f nnc_unconstrain1$(EXEEXT)
+	$(nnc_unconstrain1_LINK) $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_LDADD) $(LIBS)
 nnc_universe1$(EXEEXT): $(nnc_universe1_OBJECTS) $(nnc_universe1_DEPENDENCIES) 
 	@rm -f nnc_universe1$(EXEEXT)
-	$(CXXLINK) $(nnc_universe1_LDFLAGS) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS)
+	$(nnc_universe1_LINK) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS)
 nnc_writepolyhedron1$(EXEEXT): $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_DEPENDENCIES) 
 	@rm -f nnc_writepolyhedron1$(EXEEXT)
-	$(CXXLINK) $(nnc_writepolyhedron1_LDFLAGS) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS)
+	$(nnc_writepolyhedron1_LINK) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS)
 nncminimize1$(EXEEXT): $(nncminimize1_OBJECTS) $(nncminimize1_DEPENDENCIES) 
 	@rm -f nncminimize1$(EXEEXT)
-	$(CXXLINK) $(nncminimize1_LDFLAGS) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS)
+	$(CXXLINK) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS)
 nncminimize2$(EXEEXT): $(nncminimize2_OBJECTS) $(nncminimize2_DEPENDENCIES) 
 	@rm -f nncminimize2$(EXEEXT)
-	$(CXXLINK) $(nncminimize2_LDFLAGS) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS)
+	$(CXXLINK) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS)
 numberinput1$(EXEEXT): $(numberinput1_OBJECTS) $(numberinput1_DEPENDENCIES) 
 	@rm -f numberinput1$(EXEEXT)
-	$(CXXLINK) $(numberinput1_LDFLAGS) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS)
+	$(CXXLINK) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS)
 onepoint$(EXEEXT): $(onepoint_OBJECTS) $(onepoint_DEPENDENCIES) 
 	@rm -f onepoint$(EXEEXT)
-	$(CXXLINK) $(onepoint_LDFLAGS) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS)
+	$(CXXLINK) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS)
 permute$(EXEEXT): $(permute_OBJECTS) $(permute_DEPENDENCIES) 
 	@rm -f permute$(EXEEXT)
-	$(CXXLINK) $(permute_LDFLAGS) $(permute_OBJECTS) $(permute_LDADD) $(LIBS)
+	$(CXXLINK) $(permute_OBJECTS) $(permute_LDADD) $(LIBS)
 polydifference1$(EXEEXT): $(polydifference1_OBJECTS) $(polydifference1_DEPENDENCIES) 
 	@rm -f polydifference1$(EXEEXT)
-	$(CXXLINK) $(polydifference1_LDFLAGS) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS)
+	$(CXXLINK) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS)
 polydifference2$(EXEEXT): $(polydifference2_OBJECTS) $(polydifference2_DEPENDENCIES) 
 	@rm -f polydifference2$(EXEEXT)
-	$(CXXLINK) $(polydifference2_LDFLAGS) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS)
+	$(CXXLINK) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS)
 polyhull1$(EXEEXT): $(polyhull1_OBJECTS) $(polyhull1_DEPENDENCIES) 
 	@rm -f polyhull1$(EXEEXT)
-	$(CXXLINK) $(polyhull1_LDFLAGS) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS)
+	$(CXXLINK) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS)
 polyhull2$(EXEEXT): $(polyhull2_OBJECTS) $(polyhull2_DEPENDENCIES) 
 	@rm -f polyhull2$(EXEEXT)
-	$(CXXLINK) $(polyhull2_LDFLAGS) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS)
-polypowerset1$(EXEEXT): $(polypowerset1_OBJECTS) $(polypowerset1_DEPENDENCIES) 
-	@rm -f polypowerset1$(EXEEXT)
-	$(CXXLINK) $(polypowerset1_LDFLAGS) $(polypowerset1_OBJECTS) $(polypowerset1_LDADD) $(LIBS)
-powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES) 
-	@rm -f powerset1$(EXEEXT)
-	$(CXXLINK) $(powerset1_LDFLAGS) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS)
+	$(CXXLINK) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS)
 randphull1$(EXEEXT): $(randphull1_OBJECTS) $(randphull1_DEPENDENCIES) 
 	@rm -f randphull1$(EXEEXT)
-	$(CXXLINK) $(randphull1_LDFLAGS) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS)
-randphull2$(EXEEXT): $(randphull2_OBJECTS) $(randphull2_DEPENDENCIES) 
-	@rm -f randphull2$(EXEEXT)
-	$(CXXLINK) $(randphull2_LDFLAGS) $(randphull2_OBJECTS) $(randphull2_LDADD) $(LIBS)
+	$(CXXLINK) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS)
+refinewithcongruence1$(EXEEXT): $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_DEPENDENCIES) 
+	@rm -f refinewithcongruence1$(EXEEXT)
+	$(CXXLINK) $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_LDADD) $(LIBS)
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) 
+	@rm -f refinewithconstraint1$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS)
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
 relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
 	@rm -f relations1$(EXEEXT)
-	$(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+	$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
 relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
 	@rm -f relations2$(EXEEXT)
-	$(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+	$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
 relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) 
 	@rm -f relations3$(EXEEXT)
-	$(CXXLINK) $(relations3_LDFLAGS) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+	$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
 removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
 	@rm -f removespacedims1$(EXEEXT)
-	$(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+	$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
 removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) 
 	@rm -f removespacedims2$(EXEEXT)
-	$(CXXLINK) $(removespacedims2_LDFLAGS) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+	$(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
 smm1$(EXEEXT): $(smm1_OBJECTS) $(smm1_DEPENDENCIES) 
 	@rm -f smm1$(EXEEXT)
-	$(CXXLINK) $(smm1_LDFLAGS) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS)
+	$(CXXLINK) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS)
 timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
 	@rm -f timeelapse1$(EXEEXT)
-	$(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+	$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
 timeelapse2$(EXEEXT): $(timeelapse2_OBJECTS) $(timeelapse2_DEPENDENCIES) 
 	@rm -f timeelapse2$(EXEEXT)
-	$(CXXLINK) $(timeelapse2_LDFLAGS) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS)
+	$(CXXLINK) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS)
 topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) 
 	@rm -f topclosed1$(EXEEXT)
-	$(CXXLINK) $(topclosed1_LDFLAGS) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+	$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
 topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) 
 	@rm -f topclosure1$(EXEEXT)
-	$(CXXLINK) $(topclosure1_LDFLAGS) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+	$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
 universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) 
 	@rm -f universe1$(EXEEXT)
-	$(CXXLINK) $(universe1_LDFLAGS) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+	$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
 universe2$(EXEEXT): $(universe2_OBJECTS) $(universe2_DEPENDENCIES) 
 	@rm -f universe2$(EXEEXT)
-	$(CXXLINK) $(universe2_LDFLAGS) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS)
+	$(CXXLINK) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS)
+variablesset1$(EXEEXT): $(variablesset1_OBJECTS) $(variablesset1_DEPENDENCIES) 
+	@rm -f variablesset1$(EXEEXT)
+	$(CXXLINK) $(variablesset1_OBJECTS) $(variablesset1_LDADD) $(LIBS)
 watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) 
 	@rm -f watchdog1$(EXEEXT)
-	$(CXXLINK) $(watchdog1_LDFLAGS) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+	$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
 writeconsys1$(EXEEXT): $(writeconsys1_OBJECTS) $(writeconsys1_DEPENDENCIES) 
 	@rm -f writeconsys1$(EXEEXT)
-	$(CXXLINK) $(writeconsys1_LDFLAGS) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS)
+	$(CXXLINK) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS)
 writegensys1$(EXEEXT): $(writegensys1_OBJECTS) $(writegensys1_DEPENDENCIES) 
 	@rm -f writegensys1$(EXEEXT)
-	$(CXXLINK) $(writegensys1_LDFLAGS) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS)
+	$(CXXLINK) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS)
 writepolyhedron1$(EXEEXT): $(writepolyhedron1_OBJECTS) $(writepolyhedron1_DEPENDENCIES) 
 	@rm -f writepolyhedron1$(EXEEXT)
-	$(CXXLINK) $(writepolyhedron1_LDFLAGS) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS)
+	$(CXXLINK) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS)
 writepolyhedron2$(EXEEXT): $(writepolyhedron2_OBJECTS) $(writepolyhedron2_DEPENDENCIES) 
 	@rm -f writepolyhedron2$(EXEEXT)
-	$(CXXLINK) $(writepolyhedron2_LDFLAGS) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS)
+	$(CXXLINK) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS)
 writerelation1$(EXEEXT): $(writerelation1_OBJECTS) $(writerelation1_DEPENDENCIES) 
 	@rm -f writerelation1$(EXEEXT)
-	$(CXXLINK) $(writerelation1_LDFLAGS) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS)
+	$(CXXLINK) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS)
 writevariable1$(EXEEXT): $(writevariable1_OBJECTS) $(writevariable1_DEPENDENCIES) 
 	@rm -f writevariable1$(EXEEXT)
-	$(CXXLINK) $(writevariable1_LDFLAGS) $(writevariable1_OBJECTS) $(writevariable1_LDADD) $(LIBS)
+	$(CXXLINK) $(writevariable1_OBJECTS) $(writevariable1_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -2789,17 +3153,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedbhrz03extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedh79extrapolation1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox2.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bug2-bug2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cnncconversion1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dualhypercubes.Po at am__quote@
@@ -2812,6 +3174,11 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
@@ -2820,20 +3187,19 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hybrid.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhrz03extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearpartition1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearsystem1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linexpression1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lpproblem1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/matrix1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mc91.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
@@ -2861,13 +3227,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounds1-bounds1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_concatenate1-concatenate1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_congruences1-congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constrains1-constrains1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constraints1-constraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_contains1-contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_disjoint1-disjoint1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_empty1-empty1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_equals1-equals1.Po at am__quote@
@@ -2875,6 +3241,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions3-exceptions3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frombdshape1-frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frombox1-frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_fromgrid1-fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generators1-generators1.Po at am__quote@
@@ -2888,7 +3258,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_max_min1-max_min1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mc91-mc91.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_membytes1-membytes1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_membytes2-membytes2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_onepoint-onepoint.Po at am__quote@
@@ -2896,12 +3265,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polydifference1-polydifference1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polyhull1-polyhull1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull1-randphull1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull2-randphull2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations1-relations1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations2-relations2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_smm1-smm1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_unconstrain1-unconstrain1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_universe1-universe1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize1.Po at am__quote@
@@ -2913,23 +3283,27 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull2.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polypowerset1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powerset1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull1.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/smm1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe2.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/variablesset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1-watchdog1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeconsys1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writegensys1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron1.Po at am__quote@
@@ -2938,953 +3312,1005 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writevariable1.Po at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
 
-bug2-bug2.o: bug2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -MT bug2-bug2.o -MD -MP -MF "$(DEPDIR)/bug2-bug2.Tpo" -c -o bug2-bug2.o `test -f 'bug2.cc' || echo '$(srcdir)/'`bug2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/bug2-bug2.Tpo" "$(DEPDIR)/bug2-bug2.Po"; else rm -f "$(DEPDIR)/bug2-bug2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bug2.cc' object='bug2-bug2.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -c -o bug2-bug2.o `test -f 'bug2.cc' || echo '$(srcdir)/'`bug2.cc
-
-bug2-bug2.obj: bug2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -MT bug2-bug2.obj -MD -MP -MF "$(DEPDIR)/bug2-bug2.Tpo" -c -o bug2-bug2.obj `if test -f 'bug2.cc'; then $(CYGPATH_W) 'bug2.cc'; else $(CYGPATH_W) '$(srcdir)/bug2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/bug2-bug2.Tpo" "$(DEPDIR)/bug2-bug2.Po"; else rm -f "$(DEPDIR)/bug2-bug2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bug2.cc' object='bug2-bug2.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -c -o bug2-bug2.obj `if test -f 'bug2.cc'; then $(CYGPATH_W) 'bug2.cc'; else $(CYGPATH_W) '$(srcdir)/bug2.cc'; fi`
-
 nnc_addcongruence1-addcongruence1.o: addcongruence1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.o -MD -MP -MF "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.o -MD -MP -MF $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
 
 nnc_addcongruence1-addcongruence1.obj: addcongruence1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.obj -MD -MP -MF "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.obj -MD -MP -MF $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
 
 nnc_addcongruences1-addcongruences1.o: addcongruences1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.o -MD -MP -MF "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.o -MD -MP -MF $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
 
 nnc_addcongruences1-addcongruences1.obj: addcongruences1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.obj -MD -MP -MF "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.obj -MD -MP -MF $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
 
 nnc_addconstraint1-addconstraint1.o: addconstraint1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.o -MD -MP -MF "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.o -MD -MP -MF $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
 
 nnc_addconstraint1-addconstraint1.obj: addconstraint1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.obj -MD -MP -MF "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.obj -MD -MP -MF $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
 
 nnc_addconstraints1-addconstraints1.o: addconstraints1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.o -MD -MP -MF "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.o -MD -MP -MF $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
 
 nnc_addconstraints1-addconstraints1.obj: addconstraints1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.obj -MD -MP -MF "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.obj -MD -MP -MF $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
 
 nnc_addgenerator1-addgenerator1.o: addgenerator1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.o -MD -MP -MF "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.o -MD -MP -MF $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
 
 nnc_addgenerator1-addgenerator1.obj: addgenerator1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.obj -MD -MP -MF "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.obj -MD -MP -MF $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
 
 nnc_addgenerators1-addgenerators1.o: addgenerators1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.o -MD -MP -MF "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.o -MD -MP -MF $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
 
 nnc_addgenerators1-addgenerators1.obj: addgenerators1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.obj -MD -MP -MF "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.obj -MD -MP -MF $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
 
 nnc_addspacedims1-addspacedims1.o: addspacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
 
 nnc_addspacedims1-addspacedims1.obj: addspacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
 
 nnc_affineimage1-affineimage1.o: affineimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.o -MD -MP -MF "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" "$(DEPDIR)/nnc_affineimage1-affineimage1.Po"; else rm -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.o -MD -MP -MF $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affineimage1.cc' object='nnc_affineimage1-affineimage1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
 
 nnc_affineimage1-affineimage1.obj: affineimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" "$(DEPDIR)/nnc_affineimage1-affineimage1.Po"; else rm -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affineimage1.cc' object='nnc_affineimage1-affineimage1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
 
 nnc_affinepreimage1-affinepreimage1.o: affinepreimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.o -MD -MP -MF "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
 
 nnc_affinepreimage1-affinepreimage1.obj: affinepreimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
 
 nnc_affinetrans-affinetrans.o: affinetrans.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.o -MD -MP -MF "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" "$(DEPDIR)/nnc_affinetrans-affinetrans.Po"; else rm -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.o -MD -MP -MF $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinetrans.cc' object='nnc_affinetrans-affinetrans.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
 
 nnc_affinetrans-affinetrans.obj: affinetrans.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.obj -MD -MP -MF "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" "$(DEPDIR)/nnc_affinetrans-affinetrans.Po"; else rm -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.obj -MD -MP -MF $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinetrans.cc' object='nnc_affinetrans-affinetrans.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
 
 nnc_append1-append1.o: append1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.o -MD -MP -MF "$(DEPDIR)/nnc_append1-append1.Tpo" -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append1-append1.Tpo" "$(DEPDIR)/nnc_append1-append1.Po"; else rm -f "$(DEPDIR)/nnc_append1-append1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.o -MD -MP -MF $(DEPDIR)/nnc_append1-append1.Tpo -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append1.cc' object='nnc_append1-append1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
 
 nnc_append1-append1.obj: append1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.obj -MD -MP -MF "$(DEPDIR)/nnc_append1-append1.Tpo" -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append1-append1.Tpo" "$(DEPDIR)/nnc_append1-append1.Po"; else rm -f "$(DEPDIR)/nnc_append1-append1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.obj -MD -MP -MF $(DEPDIR)/nnc_append1-append1.Tpo -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append1.cc' object='nnc_append1-append1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
 
 nnc_append2-append2.o: append2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.o -MD -MP -MF "$(DEPDIR)/nnc_append2-append2.Tpo" -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append2-append2.Tpo" "$(DEPDIR)/nnc_append2-append2.Po"; else rm -f "$(DEPDIR)/nnc_append2-append2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.o -MD -MP -MF $(DEPDIR)/nnc_append2-append2.Tpo -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append2.cc' object='nnc_append2-append2.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
 
 nnc_append2-append2.obj: append2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.obj -MD -MP -MF "$(DEPDIR)/nnc_append2-append2.Tpo" -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append2-append2.Tpo" "$(DEPDIR)/nnc_append2-append2.Po"; else rm -f "$(DEPDIR)/nnc_append2-append2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.obj -MD -MP -MF $(DEPDIR)/nnc_append2-append2.Tpo -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append2.cc' object='nnc_append2-append2.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
 
 nnc_ascii_dump_load1-ascii_dump_load1.o: ascii_dump_load1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.o -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.o -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
 
 nnc_ascii_dump_load1-ascii_dump_load1.obj: ascii_dump_load1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.obj -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.obj -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
 
 nnc_ascii_dump_load2-ascii_dump_load2.o: ascii_dump_load2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.o -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.o -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
 
 nnc_ascii_dump_load2-ascii_dump_load2.obj: ascii_dump_load2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.obj -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.obj -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
 
 nnc_bgp99extrapolation1-bgp99extrapolation1.o: bgp99extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
 
 nnc_bgp99extrapolation1-bgp99extrapolation1.obj: bgp99extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
 
 nnc_bhrz03widening1-bhrz03widening1.o: bhrz03widening1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.o -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.o -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
 
 nnc_bhrz03widening1-bhrz03widening1.obj: bhrz03widening1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.obj -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.obj -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
 
 nnc_bhrz03widening2-bhrz03widening2.o: bhrz03widening2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.o -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.o -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
 
 nnc_bhrz03widening2-bhrz03widening2.obj: bhrz03widening2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.obj -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.obj -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
 
 nnc_bounded1-bounded1.o: bounded1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.o -MD -MP -MF "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" "$(DEPDIR)/nnc_bounded1-bounded1.Po"; else rm -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.o -MD -MP -MF $(DEPDIR)/nnc_bounded1-bounded1.Tpo -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounded1.cc' object='nnc_bounded1-bounded1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
 
 nnc_bounded1-bounded1.obj: bounded1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.obj -MD -MP -MF "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" "$(DEPDIR)/nnc_bounded1-bounded1.Po"; else rm -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.obj -MD -MP -MF $(DEPDIR)/nnc_bounded1-bounded1.Tpo -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounded1.cc' object='nnc_bounded1-bounded1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
 
 nnc_boundedaffineimage1-boundedaffineimage1.o: boundedaffineimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.o -MD -MP -MF "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.o -MD -MP -MF $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
 
 nnc_boundedaffineimage1-boundedaffineimage1.obj: boundedaffineimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
 
 nnc_boundedaffinepreimage1-boundedaffinepreimage1.o: boundedaffinepreimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.o -MD -MP -MF "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
 
 nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj: boundedaffinepreimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`
 
 nnc_boundedh79extrapolation1-boundedh79extrapolation1.o: boundedh79extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
 
 nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj: boundedh79extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79e [...]
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79extrap [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79extrapolation1.cc'; fi`
 
-nnc_boundingbox1-boundingbox1.o: boundingbox1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox1-boundingbox1.o -MD -MP -MF "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" -c -o nnc_boundingbox1-boundingbox1.o `test -f 'boundingbox1.cc' || echo '$(srcdir)/'`boundingbox1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox1.cc' object='nnc_boundingbox1-boundingbox1.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox1-boundingbox1.o `test -f 'boundingbox1.cc' || echo '$(srcdir)/'`boundingbox1.cc
-
-nnc_boundingbox1-boundingbox1.obj: boundingbox1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox1-boundingbox1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" -c -o nnc_boundingbox1-boundingbox1.obj `if test -f 'boundingbox1.cc'; then $(CYGPATH_W) 'boundingbox1.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox1.cc' object='nnc_boundingbox1-boundingbox1.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox1-boundingbox1.obj `if test -f 'boundingbox1.cc'; then $(CYGPATH_W) 'boundingbox1.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox1.cc'; fi`
-
-nnc_boundingbox2-boundingbox2.o: boundingbox2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox2-boundingbox2.o -MD -MP -MF "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" -c -o nnc_boundingbox2-boundingbox2.o `test -f 'boundingbox2.cc' || echo '$(srcdir)/'`boundingbox2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox2.cc' object='nnc_boundingbox2-boundingbox2.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox2-boundingbox2.o `test -f 'boundingbox2.cc' || echo '$(srcdir)/'`boundingbox2.cc
-
-nnc_boundingbox2-boundingbox2.obj: boundingbox2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox2-boundingbox2.obj -MD -MP -MF "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" -c -o nnc_boundingbox2-boundingbox2.obj `if test -f 'boundingbox2.cc'; then $(CYGPATH_W) 'boundingbox2.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox2.cc' object='nnc_boundingbox2-boundingbox2.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox2-boundingbox2.obj `if test -f 'boundingbox2.cc'; then $(CYGPATH_W) 'boundingbox2.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox2.cc'; fi`
-
 nnc_bounds1-bounds1.o: bounds1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.o -MD -MP -MF "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" "$(DEPDIR)/nnc_bounds1-bounds1.Po"; else rm -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.o -MD -MP -MF $(DEPDIR)/nnc_bounds1-bounds1.Tpo -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounds1.cc' object='nnc_bounds1-bounds1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
 
 nnc_bounds1-bounds1.obj: bounds1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.obj -MD -MP -MF "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" "$(DEPDIR)/nnc_bounds1-bounds1.Po"; else rm -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.obj -MD -MP -MF $(DEPDIR)/nnc_bounds1-bounds1.Tpo -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounds1.cc' object='nnc_bounds1-bounds1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
 
 nnc_concatenate1-concatenate1.o: concatenate1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.o -MD -MP -MF "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" "$(DEPDIR)/nnc_concatenate1-concatenate1.Po"; else rm -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.o -MD -MP -MF $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='concatenate1.cc' object='nnc_concatenate1-concatenate1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
 
 nnc_concatenate1-concatenate1.obj: concatenate1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.obj -MD -MP -MF "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" "$(DEPDIR)/nnc_concatenate1-concatenate1.Po"; else rm -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.obj -MD -MP -MF $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='concatenate1.cc' object='nnc_concatenate1-concatenate1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
 
 nnc_congruences1-congruences1.o: congruences1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.o -MD -MP -MF "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" "$(DEPDIR)/nnc_congruences1-congruences1.Po"; else rm -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.o -MD -MP -MF $(DEPDIR)/nnc_congruences1-congruences1.Tpo -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='congruences1.cc' object='nnc_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
 
 nnc_congruences1-congruences1.obj: congruences1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.obj -MD -MP -MF "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" "$(DEPDIR)/nnc_congruences1-congruences1.Po"; else rm -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.obj -MD -MP -MF $(DEPDIR)/nnc_congruences1-congruences1.Tpo -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='congruences1.cc' object='nnc_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
 
+nnc_constrains1-constrains1.o: constrains1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constrains1-constrains1.o -MD -MP -MF $(DEPDIR)/nnc_constrains1-constrains1.Tpo -c -o nnc_constrains1-constrains1.o `test -f 'constrains1.cc' || echo '$(srcdir)/'`constrains1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='constrains1.cc' object='nnc_constrains1-constrains1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constrains1-constrains1.o `test -f 'constrains1.cc' || echo '$(srcdir)/'`constrains1.cc
+
+nnc_constrains1-constrains1.obj: constrains1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constrains1-constrains1.obj -MD -MP -MF $(DEPDIR)/nnc_constrains1-constrains1.Tpo -c -o nnc_constrains1-constrains1.obj `if test -f 'constrains1.cc'; then $(CYGPATH_W) 'constrains1.cc'; else $(CYGPATH_W) '$(srcdir)/constrains1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='constrains1.cc' object='nnc_constrains1-constrains1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constrains1-constrains1.obj `if test -f 'constrains1.cc'; then $(CYGPATH_W) 'constrains1.cc'; else $(CYGPATH_W) '$(srcdir)/constrains1.cc'; fi`
+
 nnc_constraints1-constraints1.o: constraints1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.o -MD -MP -MF "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" "$(DEPDIR)/nnc_constraints1-constraints1.Po"; else rm -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.o -MD -MP -MF $(DEPDIR)/nnc_constraints1-constraints1.Tpo -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='constraints1.cc' object='nnc_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
 
 nnc_constraints1-constraints1.obj: constraints1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.obj -MD -MP -MF "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" "$(DEPDIR)/nnc_constraints1-constraints1.Po"; else rm -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.obj -MD -MP -MF $(DEPDIR)/nnc_constraints1-constraints1.Tpo -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='constraints1.cc' object='nnc_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
 
 nnc_contains1-contains1.o: contains1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.o -MD -MP -MF "$(DEPDIR)/nnc_contains1-contains1.Tpo" -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_contains1-contains1.Tpo" "$(DEPDIR)/nnc_contains1-contains1.Po"; else rm -f "$(DEPDIR)/nnc_contains1-contains1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.o -MD -MP -MF $(DEPDIR)/nnc_contains1-contains1.Tpo -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='contains1.cc' object='nnc_contains1-contains1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
 
 nnc_contains1-contains1.obj: contains1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.obj -MD -MP -MF "$(DEPDIR)/nnc_contains1-contains1.Tpo" -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_contains1-contains1.Tpo" "$(DEPDIR)/nnc_contains1-contains1.Po"; else rm -f "$(DEPDIR)/nnc_contains1-contains1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.obj -MD -MP -MF $(DEPDIR)/nnc_contains1-contains1.Tpo -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='contains1.cc' object='nnc_contains1-contains1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
 
+nnc_containsintegerpoint1-containsintegerpoint1.o: containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_containsintegerpoint1-containsintegerpoint1.o -MD -MP -MF $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo -c -o nnc_containsintegerpoint1-containsintegerpoint1.o `test -f 'containsintegerpoint1.cc' || echo '$(srcdir)/'`containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_containsintegerpoint1-containsintegerpoint1.o `test -f 'containsintegerpoint1.cc' || echo '$(srcdir)/'`containsintegerpoint1.cc
+
+nnc_containsintegerpoint1-containsintegerpoint1.obj: containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_containsintegerpoint1-containsintegerpoint1.obj -MD -MP -MF $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo -c -o nnc_containsintegerpoint1-containsintegerpoint1.obj `if test -f 'containsintegerpoint1.cc'; then $(CYGPATH_W) 'containsintegerpoint1.cc'; else $(CYGPATH_W) '$(srcdir)/containsintegerpoint1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_containsintegerpoint1-containsintegerpoint1.obj `if test -f 'containsintegerpoint1.cc'; then $(CYGPATH_W) 'containsintegerpoint1.cc'; else $(CYGPATH_W) '$(srcdir)/containsintegerpoint1.cc'; fi`
+
 nnc_disjoint1-disjoint1.o: disjoint1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.o -MD -MP -MF "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" "$(DEPDIR)/nnc_disjoint1-disjoint1.Po"; else rm -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.o -MD -MP -MF $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='disjoint1.cc' object='nnc_disjoint1-disjoint1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
 
 nnc_disjoint1-disjoint1.obj: disjoint1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.obj -MD -MP -MF "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" "$(DEPDIR)/nnc_disjoint1-disjoint1.Po"; else rm -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.obj -MD -MP -MF $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='disjoint1.cc' object='nnc_disjoint1-disjoint1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
 
 nnc_empty1-empty1.o: empty1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.o -MD -MP -MF "$(DEPDIR)/nnc_empty1-empty1.Tpo" -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_empty1-empty1.Tpo" "$(DEPDIR)/nnc_empty1-empty1.Po"; else rm -f "$(DEPDIR)/nnc_empty1-empty1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.o -MD -MP -MF $(DEPDIR)/nnc_empty1-empty1.Tpo -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='empty1.cc' object='nnc_empty1-empty1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
 
 nnc_empty1-empty1.obj: empty1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.obj -MD -MP -MF "$(DEPDIR)/nnc_empty1-empty1.Tpo" -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_empty1-empty1.Tpo" "$(DEPDIR)/nnc_empty1-empty1.Po"; else rm -f "$(DEPDIR)/nnc_empty1-empty1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.obj -MD -MP -MF $(DEPDIR)/nnc_empty1-empty1.Tpo -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='empty1.cc' object='nnc_empty1-empty1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
 
 nnc_equals1-equals1.o: equals1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.o -MD -MP -MF "$(DEPDIR)/nnc_equals1-equals1.Tpo" -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_equals1-equals1.Tpo" "$(DEPDIR)/nnc_equals1-equals1.Po"; else rm -f "$(DEPDIR)/nnc_equals1-equals1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.o -MD -MP -MF $(DEPDIR)/nnc_equals1-equals1.Tpo -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='equals1.cc' object='nnc_equals1-equals1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
 
 nnc_equals1-equals1.obj: equals1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.obj -MD -MP -MF "$(DEPDIR)/nnc_equals1-equals1.Tpo" -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_equals1-equals1.Tpo" "$(DEPDIR)/nnc_equals1-equals1.Po"; else rm -f "$(DEPDIR)/nnc_equals1-equals1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.obj -MD -MP -MF $(DEPDIR)/nnc_equals1-equals1.Tpo -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='equals1.cc' object='nnc_equals1-equals1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
 
 nnc_exceptions1-exceptions1.o: exceptions1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.o -MD -MP -MF "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" "$(DEPDIR)/nnc_exceptions1-exceptions1.Po"; else rm -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.o -MD -MP -MF $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions1.cc' object='nnc_exceptions1-exceptions1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
 
 nnc_exceptions1-exceptions1.obj: exceptions1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.obj -MD -MP -MF "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" "$(DEPDIR)/nnc_exceptions1-exceptions1.Po"; else rm -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.obj -MD -MP -MF $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions1.cc' object='nnc_exceptions1-exceptions1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
 
 nnc_exceptions3-exceptions3.o: exceptions3.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.o -MD -MP -MF "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" "$(DEPDIR)/nnc_exceptions3-exceptions3.Po"; else rm -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.o -MD -MP -MF $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions3.cc' object='nnc_exceptions3-exceptions3.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
 
 nnc_exceptions3-exceptions3.obj: exceptions3.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.obj -MD -MP -MF "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" "$(DEPDIR)/nnc_exceptions3-exceptions3.Po"; else rm -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.obj -MD -MP -MF $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions3.cc' object='nnc_exceptions3-exceptions3.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
 
 nnc_expandspacedim1-expandspacedim1.o: expandspacedim1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.o -MD -MP -MF "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po"; else rm -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.o -MD -MP -MF $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
 
 nnc_expandspacedim1-expandspacedim1.obj: expandspacedim1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.obj -MD -MP -MF "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po"; else rm -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.obj -MD -MP -MF $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
 
 nnc_foldspacedims1-foldspacedims1.o: foldspacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
 
 nnc_foldspacedims1-foldspacedims1.obj: foldspacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
 
+nnc_frombdshape1-frombdshape1.o: frombdshape1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombdshape1-frombdshape1.o -MD -MP -MF $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo -c -o nnc_frombdshape1-frombdshape1.o `test -f 'frombdshape1.cc' || echo '$(srcdir)/'`frombdshape1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombdshape1-frombdshape1.o `test -f 'frombdshape1.cc' || echo '$(srcdir)/'`frombdshape1.cc
+
+nnc_frombdshape1-frombdshape1.obj: frombdshape1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombdshape1-frombdshape1.obj -MD -MP -MF $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo -c -o nnc_frombdshape1-frombdshape1.obj `if test -f 'frombdshape1.cc'; then $(CYGPATH_W) 'frombdshape1.cc'; else $(CYGPATH_W) '$(srcdir)/frombdshape1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombdshape1-frombdshape1.obj `if test -f 'frombdshape1.cc'; then $(CYGPATH_W) 'frombdshape1.cc'; else $(CYGPATH_W) '$(srcdir)/frombdshape1.cc'; fi`
+
+nnc_frombox1-frombox1.o: frombox1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombox1-frombox1.o -MD -MP -MF $(DEPDIR)/nnc_frombox1-frombox1.Tpo -c -o nnc_frombox1-frombox1.o `test -f 'frombox1.cc' || echo '$(srcdir)/'`frombox1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='frombox1.cc' object='nnc_frombox1-frombox1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombox1-frombox1.o `test -f 'frombox1.cc' || echo '$(srcdir)/'`frombox1.cc
+
+nnc_frombox1-frombox1.obj: frombox1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombox1-frombox1.obj -MD -MP -MF $(DEPDIR)/nnc_frombox1-frombox1.Tpo -c -o nnc_frombox1-frombox1.obj `if test -f 'frombox1.cc'; then $(CYGPATH_W) 'frombox1.cc'; else $(CYGPATH_W) '$(srcdir)/frombox1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='frombox1.cc' object='nnc_frombox1-frombox1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombox1-frombox1.obj `if test -f 'frombox1.cc'; then $(CYGPATH_W) 'frombox1.cc'; else $(CYGPATH_W) '$(srcdir)/frombox1.cc'; fi`
+
+nnc_fromgrid1-fromgrid1.o: fromgrid1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromgrid1-fromgrid1.o -MD -MP -MF $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo -c -o nnc_fromgrid1-fromgrid1.o `test -f 'fromgrid1.cc' || echo '$(srcdir)/'`fromgrid1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromgrid1-fromgrid1.o `test -f 'fromgrid1.cc' || echo '$(srcdir)/'`fromgrid1.cc
+
+nnc_fromgrid1-fromgrid1.obj: fromgrid1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromgrid1-fromgrid1.obj -MD -MP -MF $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo -c -o nnc_fromgrid1-fromgrid1.obj `if test -f 'fromgrid1.cc'; then $(CYGPATH_W) 'fromgrid1.cc'; else $(CYGPATH_W) '$(srcdir)/fromgrid1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromgrid1-fromgrid1.obj `if test -f 'fromgrid1.cc'; then $(CYGPATH_W) 'fromgrid1.cc'; else $(CYGPATH_W) '$(srcdir)/fromgrid1.cc'; fi`
+
+nnc_fromoctagonalshape1-fromoctagonalshape1.o: fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromoctagonalshape1-fromoctagonalshape1.o -MD -MP -MF $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.o `test -f 'fromoctagonalshape1.cc' || echo '$(srcdir)/'`fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.o `test -f 'fromoctagonalshape1.cc' || echo '$(srcdir)/'`fromoctagonalshape1.cc
+
+nnc_fromoctagonalshape1-fromoctagonalshape1.obj: fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromoctagonalshape1-fromoctagonalshape1.obj -MD -MP -MF $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.obj `if test -f 'fromoctagonalshape1.cc'; then $(CYGPATH_W) 'fromoctagonalshape1.cc'; else $(CYGPATH_W) '$(srcdir)/fromoctagonalshape1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.obj `if test -f 'fromoctagonalshape1.cc'; then $(CYGPATH_W) 'fromoctagonalshape1.cc'; else $(CYGPATH_W) '$(srcdir)/fromoctagonalshape1.cc'; fi`
+
 nnc_generalizedaffineimage1-generalizedaffineimage1.o: generalizedaffineimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.o -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.o -MD -MP -MF $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
 
 nnc_generalizedaffineimage1-generalizedaffineimage1.obj: generalizedaffineimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineima [...]
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineimage1.cc'; fi`
 
 nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o: generalizedaffinepreimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
 
 nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj: generalizedaffinepreimage1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(s [...]
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffinepreimage1.cc'; fi`
 
 nnc_generators1-generators1.o: generators1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.o -MD -MP -MF "$(DEPDIR)/nnc_generators1-generators1.Tpo" -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generators1-generators1.Tpo" "$(DEPDIR)/nnc_generators1-generators1.Po"; else rm -f "$(DEPDIR)/nnc_generators1-generators1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.o -MD -MP -MF $(DEPDIR)/nnc_generators1-generators1.Tpo -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generators1.cc' object='nnc_generators1-generators1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
 
 nnc_generators1-generators1.obj: generators1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.obj -MD -MP -MF "$(DEPDIR)/nnc_generators1-generators1.Tpo" -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generators1-generators1.Tpo" "$(DEPDIR)/nnc_generators1-generators1.Po"; else rm -f "$(DEPDIR)/nnc_generators1-generators1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.obj -MD -MP -MF $(DEPDIR)/nnc_generators1-generators1.Tpo -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generators1.cc' object='nnc_generators1-generators1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
 
 nnc_geomcovers1-geomcovers1.o: geomcovers1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.o -MD -MP -MF "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po"; else rm -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.o -MD -MP -MF $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
 
 nnc_geomcovers1-geomcovers1.obj: geomcovers1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.obj -MD -MP -MF "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po"; else rm -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.obj -MD -MP -MF $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
 
 nnc_h79widening1-h79widening1.o: h79widening1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.o -MD -MP -MF "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" "$(DEPDIR)/nnc_h79widening1-h79widening1.Po"; else rm -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.o -MD -MP -MF $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='h79widening1.cc' object='nnc_h79widening1-h79widening1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
 
 nnc_h79widening1-h79widening1.obj: h79widening1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.obj -MD -MP -MF "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" "$(DEPDIR)/nnc_h79widening1-h79widening1.Po"; else rm -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.obj -MD -MP -MF $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='h79widening1.cc' object='nnc_h79widening1-h79widening1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
 
 nnc_intersection1-intersection1.o: intersection1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.o -MD -MP -MF "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" "$(DEPDIR)/nnc_intersection1-intersection1.Po"; else rm -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.o -MD -MP -MF $(DEPDIR)/nnc_intersection1-intersection1.Tpo -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='intersection1.cc' object='nnc_intersection1-intersection1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
 
 nnc_intersection1-intersection1.obj: intersection1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.obj -MD -MP -MF "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" "$(DEPDIR)/nnc_intersection1-intersection1.Po"; else rm -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.obj -MD -MP -MF $(DEPDIR)/nnc_intersection1-intersection1.Tpo -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='intersection1.cc' object='nnc_intersection1-intersection1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
 
 nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o: limitedbhrz03extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
 
 nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj: limitedbhrz03extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPAT [...]
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPATH_W)  [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedbhrz03extrapolation1.cc'; fi`
 
 nnc_limitedh79extrapolation1-limitedh79extrapolation1.o: limitedh79extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
 
 nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj: limitedh79extrapolation1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79e [...]
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79extrap [...]
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79extrapolation1.cc'; fi`
 
 nnc_linearpartition1-linearpartition1.o: linearpartition1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.o -MD -MP -MF "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po"; else rm -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.o -MD -MP -MF $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
 
 nnc_linearpartition1-linearpartition1.obj: linearpartition1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.obj -MD -MP -MF "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po"; else rm -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.obj -MD -MP -MF $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
 
 nnc_mapspacedims1-mapspacedims1.o: mapspacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
 
 nnc_mapspacedims1-mapspacedims1.obj: mapspacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
 
 nnc_max_min1-max_min1.o: max_min1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.o -MD -MP -MF "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" "$(DEPDIR)/nnc_max_min1-max_min1.Po"; else rm -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.o -MD -MP -MF $(DEPDIR)/nnc_max_min1-max_min1.Tpo -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='max_min1.cc' object='nnc_max_min1-max_min1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
 
 nnc_max_min1-max_min1.obj: max_min1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.obj -MD -MP -MF "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" "$(DEPDIR)/nnc_max_min1-max_min1.Po"; else rm -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.obj -MD -MP -MF $(DEPDIR)/nnc_max_min1-max_min1.Tpo -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='max_min1.cc' object='nnc_max_min1-max_min1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
 
 nnc_mc91-mc91.o: mc91.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.o -MD -MP -MF "$(DEPDIR)/nnc_mc91-mc91.Tpo" -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mc91-mc91.Tpo" "$(DEPDIR)/nnc_mc91-mc91.Po"; else rm -f "$(DEPDIR)/nnc_mc91-mc91.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.o -MD -MP -MF $(DEPDIR)/nnc_mc91-mc91.Tpo -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mc91.cc' object='nnc_mc91-mc91.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
 
 nnc_mc91-mc91.obj: mc91.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.obj -MD -MP -MF "$(DEPDIR)/nnc_mc91-mc91.Tpo" -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mc91-mc91.Tpo" "$(DEPDIR)/nnc_mc91-mc91.Po"; else rm -f "$(DEPDIR)/nnc_mc91-mc91.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.obj -MD -MP -MF $(DEPDIR)/nnc_mc91-mc91.Tpo -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mc91.cc' object='nnc_mc91-mc91.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
 
 nnc_membytes1-membytes1.o: membytes1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.o -MD -MP -MF "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" "$(DEPDIR)/nnc_membytes1-membytes1.Po"; else rm -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.o -MD -MP -MF $(DEPDIR)/nnc_membytes1-membytes1.Tpo -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes1.cc' object='nnc_membytes1-membytes1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
 
 nnc_membytes1-membytes1.obj: membytes1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.obj -MD -MP -MF "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" "$(DEPDIR)/nnc_membytes1-membytes1.Po"; else rm -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.obj -MD -MP -MF $(DEPDIR)/nnc_membytes1-membytes1.Tpo -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes1.cc' object='nnc_membytes1-membytes1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
 
-nnc_membytes2-membytes2.o: membytes2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes2-membytes2.o -MD -MP -MF "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" -c -o nnc_membytes2-membytes2.o `test -f 'membytes2.cc' || echo '$(srcdir)/'`membytes2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" "$(DEPDIR)/nnc_membytes2-membytes2.Po"; else rm -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes2.cc' object='nnc_membytes2-membytes2.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes2-membytes2.o `test -f 'membytes2.cc' || echo '$(srcdir)/'`membytes2.cc
-
-nnc_membytes2-membytes2.obj: membytes2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes2-membytes2.obj -MD -MP -MF "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" -c -o nnc_membytes2-membytes2.obj `if test -f 'membytes2.cc'; then $(CYGPATH_W) 'membytes2.cc'; else $(CYGPATH_W) '$(srcdir)/membytes2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" "$(DEPDIR)/nnc_membytes2-membytes2.Po"; else rm -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes2.cc' object='nnc_membytes2-membytes2.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes2-membytes2.obj `if test -f 'membytes2.cc'; then $(CYGPATH_W) 'membytes2.cc'; else $(CYGPATH_W) '$(srcdir)/membytes2.cc'; fi`
-
 nnc_minconstraints1-minconstraints1.o: minconstraints1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.o -MD -MP -MF "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.o -MD -MP -MF $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
 
 nnc_minconstraints1-minconstraints1.obj: minconstraints1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.obj -MD -MP -MF "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.obj -MD -MP -MF $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
 
 nnc_mingenerators1-mingenerators1.o: mingenerators1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.o -MD -MP -MF "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po"; else rm -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.o -MD -MP -MF $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
 
 nnc_mingenerators1-mingenerators1.obj: mingenerators1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.obj -MD -MP -MF "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po"; else rm -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.obj -MD -MP -MF $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
 
 nnc_onepoint-onepoint.o: onepoint.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.o -MD -MP -MF "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" "$(DEPDIR)/nnc_onepoint-onepoint.Po"; else rm -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.o -MD -MP -MF $(DEPDIR)/nnc_onepoint-onepoint.Tpo -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='onepoint.cc' object='nnc_onepoint-onepoint.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
 
 nnc_onepoint-onepoint.obj: onepoint.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.obj -MD -MP -MF "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" "$(DEPDIR)/nnc_onepoint-onepoint.Po"; else rm -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.obj -MD -MP -MF $(DEPDIR)/nnc_onepoint-onepoint.Tpo -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='onepoint.cc' object='nnc_onepoint-onepoint.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
 
 nnc_permute-permute.o: permute.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.o -MD -MP -MF "$(DEPDIR)/nnc_permute-permute.Tpo" -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_permute-permute.Tpo" "$(DEPDIR)/nnc_permute-permute.Po"; else rm -f "$(DEPDIR)/nnc_permute-permute.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.o -MD -MP -MF $(DEPDIR)/nnc_permute-permute.Tpo -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='permute.cc' object='nnc_permute-permute.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
 
 nnc_permute-permute.obj: permute.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.obj -MD -MP -MF "$(DEPDIR)/nnc_permute-permute.Tpo" -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_permute-permute.Tpo" "$(DEPDIR)/nnc_permute-permute.Po"; else rm -f "$(DEPDIR)/nnc_permute-permute.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.obj -MD -MP -MF $(DEPDIR)/nnc_permute-permute.Tpo -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='permute.cc' object='nnc_permute-permute.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
 
 nnc_polydifference1-polydifference1.o: polydifference1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.o -MD -MP -MF "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" "$(DEPDIR)/nnc_polydifference1-polydifference1.Po"; else rm -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.o -MD -MP -MF $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polydifference1.cc' object='nnc_polydifference1-polydifference1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
 
 nnc_polydifference1-polydifference1.obj: polydifference1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.obj -MD -MP -MF "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" "$(DEPDIR)/nnc_polydifference1-polydifference1.Po"; else rm -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.obj -MD -MP -MF $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polydifference1.cc' object='nnc_polydifference1-polydifference1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
 
 nnc_polyhull1-polyhull1.o: polyhull1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.o -MD -MP -MF "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" "$(DEPDIR)/nnc_polyhull1-polyhull1.Po"; else rm -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.o -MD -MP -MF $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polyhull1.cc' object='nnc_polyhull1-polyhull1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
 
 nnc_polyhull1-polyhull1.obj: polyhull1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.obj -MD -MP -MF "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" "$(DEPDIR)/nnc_polyhull1-polyhull1.Po"; else rm -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.obj -MD -MP -MF $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polyhull1.cc' object='nnc_polyhull1-polyhull1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
 
 nnc_randphull1-randphull1.o: randphull1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.o -MD -MP -MF "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" "$(DEPDIR)/nnc_randphull1-randphull1.Po"; else rm -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.o -MD -MP -MF $(DEPDIR)/nnc_randphull1-randphull1.Tpo -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull1.cc' object='nnc_randphull1-randphull1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
 
 nnc_randphull1-randphull1.obj: randphull1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.obj -MD -MP -MF "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" "$(DEPDIR)/nnc_randphull1-randphull1.Po"; else rm -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.obj -MD -MP -MF $(DEPDIR)/nnc_randphull1-randphull1.Tpo -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull1.cc' object='nnc_randphull1-randphull1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
 
-nnc_randphull2-randphull2.o: randphull2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull2-randphull2.o -MD -MP -MF "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" -c -o nnc_randphull2-randphull2.o `test -f 'randphull2.cc' || echo '$(srcdir)/'`randphull2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" "$(DEPDIR)/nnc_randphull2-randphull2.Po"; else rm -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull2.cc' object='nnc_randphull2-randphull2.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull2-randphull2.o `test -f 'randphull2.cc' || echo '$(srcdir)/'`randphull2.cc
-
-nnc_randphull2-randphull2.obj: randphull2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull2-randphull2.obj -MD -MP -MF "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" -c -o nnc_randphull2-randphull2.obj `if test -f 'randphull2.cc'; then $(CYGPATH_W) 'randphull2.cc'; else $(CYGPATH_W) '$(srcdir)/randphull2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" "$(DEPDIR)/nnc_randphull2-randphull2.Po"; else rm -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull2.cc' object='nnc_randphull2-randphull2.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull2-randphull2.obj `if test -f 'randphull2.cc'; then $(CYGPATH_W) 'randphull2.cc'; else $(CYGPATH_W) '$(srcdir)/randphull2.cc'; fi`
-
 nnc_relations1-relations1.o: relations1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.o -MD -MP -MF "$(DEPDIR)/nnc_relations1-relations1.Tpo" -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations1-relations1.Tpo" "$(DEPDIR)/nnc_relations1-relations1.Po"; else rm -f "$(DEPDIR)/nnc_relations1-relations1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.o -MD -MP -MF $(DEPDIR)/nnc_relations1-relations1.Tpo -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations1.cc' object='nnc_relations1-relations1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
 
 nnc_relations1-relations1.obj: relations1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.obj -MD -MP -MF "$(DEPDIR)/nnc_relations1-relations1.Tpo" -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations1-relations1.Tpo" "$(DEPDIR)/nnc_relations1-relations1.Po"; else rm -f "$(DEPDIR)/nnc_relations1-relations1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.obj -MD -MP -MF $(DEPDIR)/nnc_relations1-relations1.Tpo -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations1.cc' object='nnc_relations1-relations1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
 
 nnc_relations2-relations2.o: relations2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.o -MD -MP -MF "$(DEPDIR)/nnc_relations2-relations2.Tpo" -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations2-relations2.Tpo" "$(DEPDIR)/nnc_relations2-relations2.Po"; else rm -f "$(DEPDIR)/nnc_relations2-relations2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.o -MD -MP -MF $(DEPDIR)/nnc_relations2-relations2.Tpo -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations2.cc' object='nnc_relations2-relations2.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
 
 nnc_relations2-relations2.obj: relations2.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.obj -MD -MP -MF "$(DEPDIR)/nnc_relations2-relations2.Tpo" -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations2-relations2.Tpo" "$(DEPDIR)/nnc_relations2-relations2.Po"; else rm -f "$(DEPDIR)/nnc_relations2-relations2.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.obj -MD -MP -MF $(DEPDIR)/nnc_relations2-relations2.Tpo -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations2.cc' object='nnc_relations2-relations2.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
 
 nnc_removespacedims1-removespacedims1.o: removespacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po"; else rm -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.o -MD -MP -MF $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
 
 nnc_removespacedims1-removespacedims1.obj: removespacedims1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po"; else rm -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
 
+nnc_simplifyusingcontext1-simplifyusingcontext1.o: simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -MT nnc_simplifyusingcontext1-simplifyusingcontext1.o -MD -MP -MF $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.o `test -f 'simplifyusingcontext1.cc' || echo '$(srcdir)/'`simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.o `test -f 'simplifyusingcontext1.cc' || echo '$(srcdir)/'`simplifyusingcontext1.cc
+
+nnc_simplifyusingcontext1-simplifyusingcontext1.obj: simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -MT nnc_simplifyusingcontext1-simplifyusingcontext1.obj -MD -MP -MF $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.obj `if test -f 'simplifyusingcontext1.cc'; then $(CYGPATH_W) 'simplifyusingcontext1.cc'; else $(CYGPATH_W) '$(srcdir)/simplifyusingcontext1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.obj `if test -f 'simplifyusingcontext1.cc'; then $(CYGPATH_W) 'simplifyusingcontext1.cc'; else $(CYGPATH_W) '$(srcdir)/simplifyusingcontext1.cc'; fi`
+
 nnc_smm1-smm1.o: smm1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.o -MD -MP -MF "$(DEPDIR)/nnc_smm1-smm1.Tpo" -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_smm1-smm1.Tpo" "$(DEPDIR)/nnc_smm1-smm1.Po"; else rm -f "$(DEPDIR)/nnc_smm1-smm1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.o -MD -MP -MF $(DEPDIR)/nnc_smm1-smm1.Tpo -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='smm1.cc' object='nnc_smm1-smm1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
 
 nnc_smm1-smm1.obj: smm1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.obj -MD -MP -MF "$(DEPDIR)/nnc_smm1-smm1.Tpo" -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_smm1-smm1.Tpo" "$(DEPDIR)/nnc_smm1-smm1.Po"; else rm -f "$(DEPDIR)/nnc_smm1-smm1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.obj -MD -MP -MF $(DEPDIR)/nnc_smm1-smm1.Tpo -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='smm1.cc' object='nnc_smm1-smm1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
 
 nnc_timeelapse1-timeelapse1.o: timeelapse1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.o -MD -MP -MF "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po"; else rm -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.o -MD -MP -MF $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
 
 nnc_timeelapse1-timeelapse1.obj: timeelapse1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.obj -MD -MP -MF "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po"; else rm -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.obj -MD -MP -MF $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
 
+nnc_unconstrain1-unconstrain1.o: unconstrain1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -MT nnc_unconstrain1-unconstrain1.o -MD -MP -MF $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo -c -o nnc_unconstrain1-unconstrain1.o `test -f 'unconstrain1.cc' || echo '$(srcdir)/'`unconstrain1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_unconstrain1-unconstrain1.o `test -f 'unconstrain1.cc' || echo '$(srcdir)/'`unconstrain1.cc
+
+nnc_unconstrain1-unconstrain1.obj: unconstrain1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -MT nnc_unconstrain1-unconstrain1.obj -MD -MP -MF $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo -c -o nnc_unconstrain1-unconstrain1.obj `if test -f 'unconstrain1.cc'; then $(CYGPATH_W) 'unconstrain1.cc'; else $(CYGPATH_W) '$(srcdir)/unconstrain1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_unconstrain1-unconstrain1.obj `if test -f 'unconstrain1.cc'; then $(CYGPATH_W) 'unconstrain1.cc'; else $(CYGPATH_W) '$(srcdir)/unconstrain1.cc'; fi`
+
 nnc_universe1-universe1.o: universe1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.o -MD -MP -MF "$(DEPDIR)/nnc_universe1-universe1.Tpo" -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_universe1-universe1.Tpo" "$(DEPDIR)/nnc_universe1-universe1.Po"; else rm -f "$(DEPDIR)/nnc_universe1-universe1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.o -MD -MP -MF $(DEPDIR)/nnc_universe1-universe1.Tpo -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='universe1.cc' object='nnc_universe1-universe1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
 
 nnc_universe1-universe1.obj: universe1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.obj -MD -MP -MF "$(DEPDIR)/nnc_universe1-universe1.Tpo" -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_universe1-universe1.Tpo" "$(DEPDIR)/nnc_universe1-universe1.Po"; else rm -f "$(DEPDIR)/nnc_universe1-universe1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.obj -MD -MP -MF $(DEPDIR)/nnc_universe1-universe1.Tpo -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='universe1.cc' object='nnc_universe1-universe1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
 
 nnc_writepolyhedron1-writepolyhedron1.o: writepolyhedron1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.o -MD -MP -MF "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po"; else rm -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.o -MD -MP -MF $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
 
 nnc_writepolyhedron1-writepolyhedron1.obj: writepolyhedron1.cc
- at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.obj -MD -MP -MF "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po"; else rm -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.obj -MD -MP -MF $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
 
+watchdog1-watchdog1.o: watchdog1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT watchdog1-watchdog1.o -MD -MP -MF $(DEPDIR)/watchdog1-watchdog1.Tpo -c -o watchdog1-watchdog1.o `test -f 'watchdog1.cc' || echo '$(srcdir)/'`watchdog1.cc
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/watchdog1-watchdog1.Tpo $(DEPDIR)/watchdog1-watchdog1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='watchdog1.cc' object='watchdog1-watchdog1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o watchdog1-watchdog1.o `test -f 'watchdog1.cc' || echo '$(srcdir)/'`watchdog1.cc
+
+watchdog1-watchdog1.obj: watchdog1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT watchdog1-watchdog1.obj -MD -MP -MF $(DEPDIR)/watchdog1-watchdog1.Tpo -c -o watchdog1-watchdog1.obj `if test -f 'watchdog1.cc'; then $(CYGPATH_W) 'watchdog1.cc'; else $(CYGPATH_W) '$(srcdir)/watchdog1.cc'; fi`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/watchdog1-watchdog1.Tpo $(DEPDIR)/watchdog1-watchdog1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='watchdog1.cc' object='watchdog1-watchdog1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o watchdog1-watchdog1.obj `if test -f 'watchdog1.cc'; then $(CYGPATH_W) 'watchdog1.cc'; else $(CYGPATH_W) '$(srcdir)/watchdog1.cc'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -3896,8 +4322,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -3907,13 +4333,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -3927,9 +4352,9 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
 	srcdir=$(srcdir); export srcdir; \
-	list='$(TESTS)'; \
+	list=' $(TESTS) '; \
 	if test -n "$$list"; then \
 	  for tst in $$list; do \
 	    if test -f ./$$tst; then dir=./; \
@@ -3938,7 +4363,7 @@ check-TESTS: $(TESTS)
 	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
 	      all=`expr $$all + 1`; \
 	      case " $(XFAIL_TESTS) " in \
-	      *" $$tst "*) \
+	      *$$ws$$tst$$ws*) \
 		xpass=`expr $$xpass + 1`; \
 		failed=`expr $$failed + 1`; \
 		echo "XPASS: $$tst"; \
@@ -3950,7 +4375,7 @@ check-TESTS: $(TESTS)
 	    elif test $$? -ne 77; then \
 	      all=`expr $$all + 1`; \
 	      case " $(XFAIL_TESTS) " in \
-	      *" $$tst "*) \
+	      *$$ws$$tst$$ws*) \
 		xfail=`expr $$xfail + 1`; \
 		echo "XFAIL: $$tst"; \
 	      ;; \
@@ -4000,22 +4425,21 @@ check-TESTS: $(TESTS)
 	else :; fi
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -4066,7 +4490,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -4080,12 +4504,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -4106,19 +4538,23 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
 	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
 	installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am
+	tags uninstall uninstall-am
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/Polyhedron/README b/tests/Polyhedron/README
index 9568d6c..729c344 100644
--- a/tests/Polyhedron/README
+++ b/tests/Polyhedron/README
@@ -1,4 +1,4 @@
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 See below for the copying conditions.
 
 How To Use the Test Programs (If You Really Want To Use Them)
@@ -84,7 +84,7 @@ f) Run `mytest' and enjoy!
 
 --------
 
-Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
@@ -97,7 +97,7 @@ of each distribution of the PPL in files called `fdl.*'.
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.  The license is included, in various
 formats, in the `doc' subdirectory of each distribution of the PPL in
 files are called `gpl.*'.
diff --git a/tests/Polyhedron/addcongruence1.cc b/tests/Polyhedron/addcongruence1.cc
index 027a9f4..5bec9e8 100644
--- a/tests/Polyhedron/addcongruence1.cc
+++ b/tests/Polyhedron/addcongruence1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_congruence().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,7 +30,7 @@ test01() {
   Variable B(1);
 
   C_Polyhedron ph(2);
-  ph.add_congruence(A %= 0);
+  ph.add_congruence(Linear_Expression(0) %= 0);
   ph.add_congruence((B == 5) / 0);
 
   C_Polyhedron known_result(2);
@@ -50,7 +50,7 @@ test02() {
 
   C_Polyhedron ph(2);
 
-  ph.add_congruence((A + B %= 3) / 4);
+  ph.add_congruence((0*(A + B) %= 0) / 4);
   ph.add_congruence((A == -1) / 0);
 
   C_Polyhedron known_result(2);
@@ -75,7 +75,7 @@ test03() {
   C_Polyhedron known_result(ph);
 
   ph.add_congruence((A - B == 0) / 0);
-  ph.add_congruence((A + B %= 1) / 2);
+  ph.add_congruence((Linear_Expression(0) %= 1) / 2);
 
   bool ok = (ph == known_result);
 
@@ -118,6 +118,102 @@ test05() {
   return ok;
 }
 
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_congruence(0*A %= 0);
+  bool b = ph.add_congruence_and_minimize((B == 5) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B == 5);
+
+  bool ok = b && (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_congruence((Linear_Expression(0) %= 8) / 4);
+  bool b = ph.add_congruence_and_minimize((A == -1) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == -1);
+
+  bool ok = b && (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_congruence((A - B == 0) / 0);
+  bool b = ph.add_congruence_and_minimize((Linear_Expression(0) %= 1) / 2);
+
+  bool ok = !b && (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruences ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(0);
+
+  bool b =
+    ph.add_congruence_and_minimize((Linear_Expression::zero() %= 0) / 2);
+
+  bool ok = b && (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool b =
+    ph.add_congruence_and_minimize((Linear_Expression::zero() %= 1) / 0);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = !b && (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -126,4 +222,9 @@ BEGIN_MAIN
   DO_TEST(test03);
   DO_TEST(test04);
   DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
 END_MAIN
diff --git a/tests/Polyhedron/addcongruences1.cc b/tests/Polyhedron/addcongruences1.cc
index 677a9fc..8c4eede 100644
--- a/tests/Polyhedron/addcongruences1.cc
+++ b/tests/Polyhedron/addcongruences1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_congruences().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,7 +35,7 @@ test01() {
   gs.insert(ray(x + y));
 
   Congruence_System cgs;
-  cgs.insert(x %= 3);
+  cgs.insert(0*x %= 0);
   cgs.insert(y == 3);
 
   C_Polyhedron ph(gs);
@@ -51,7 +51,7 @@ test01() {
 
   bool ok = (known_result == ph);
 
-  print_constraints(ph, "*** After add_congruences ***");
+  print_constraints(ph, "*** after add_congruences ***");
 
   return ok;
 }
@@ -64,7 +64,7 @@ test02() {
   C_Polyhedron ph1(2, EMPTY);
 
   Congruence_System cgs;
-  cgs.insert(A - B %= 0);
+  cgs.insert(Linear_Expression(0) %= 0);
   cgs.insert(B == 7);
 
   print_constraints(ph1, "*** ph1 ***");
@@ -76,7 +76,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.add_congruences(cgs) ***");
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
 
   return ok;
 }
@@ -90,14 +90,14 @@ test03() {
   ph.add_constraint(A >= 0);
   ph.add_constraint(B >= 0);
 
-  Constraint_System cs;
+  Congruence_System cgs;
 
   print_constraints(ph, "*** ph ***");
-  print_constraints(cs, "*** cs ***");
+  print_congruences(cgs, "*** cgs ***");
 
   C_Polyhedron known_result(ph);
 
-  ph.add_constraints(cs);
+  ph.add_congruences(cgs);
 
   bool ok = (ph == known_result);
 
@@ -127,7 +127,7 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.add_congruences(cgs) ***");
+  print_constraints(ph, "*** after ph.add_congruences(cgs) ***");
 
   return ok;
 }
@@ -149,7 +149,88 @@ bool test05() {
 
   bool ok = (known_result == ph);
 
-  print_constraints(ph, "*** After add_constraints ***");
+  print_constraints(ph, "*** after add_constraints ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(26) %= 0) / 13);
+  cgs.insert(B == 7);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_congruences_and_minimize(cgs);
+
+  C_Polyhedron known_result(cgs);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert(Linear_Expression(0) %= 0);
+  cgs.insert(B == 7);
+
+  Congruence_System cgs_copy = cgs;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_recycled_congruences(cgs);
+
+  C_Polyhedron known_result(cgs_copy);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(18) %= 3) / 5);
+  cgs.insert(A == 0);
+  cgs.insert(A + B == 7);
+  cgs.insert(B == 7);
+
+  Congruence_System cgs_copy = cgs;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_recycled_congruences_and_minimize(cgs);
+
+  C_Polyhedron known_result(cgs_copy);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
 
   return ok;
 }
@@ -162,5 +243,8 @@ BEGIN_MAIN
   DO_TEST(test03);
   DO_TEST(test04);
   DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
 END_MAIN
 
diff --git a/tests/Polyhedron/addconstraint1.cc b/tests/Polyhedron/addconstraint1.cc
index 2d3c83c..4010eed 100644
--- a/tests/Polyhedron/addconstraint1.cc
+++ b/tests/Polyhedron/addconstraint1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_constraint().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -66,7 +66,7 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.add_constraint(A == B) ***");
+  print_constraints(ph, "*** after ph.add_constraint(A == B) ***");
 
   return ok;
 }
@@ -93,7 +93,7 @@ test03() {
   bool ok = (ph == known_result);
 
   print_constraints(ph,
-		    "*** After ph.add_constraint_and_minimize(B >= 1) ***");
+		    "*** after ph.add_constraint_and_minimize(B >= 1) ***");
   return ok;
 }
 
diff --git a/tests/Polyhedron/addconstraints1.cc b/tests/Polyhedron/addconstraints1.cc
index 7354187..ffcef80 100644
--- a/tests/Polyhedron/addconstraints1.cc
+++ b/tests/Polyhedron/addconstraints1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_constrains().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -102,7 +102,7 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.add_constraints(cs2) ***");
+  print_constraints(ph, "*** after ph.add_constraints(cs2) ***");
 
   return ok;
 }
@@ -125,7 +125,7 @@ test04() {
   bool ok = (computed_result == ph);
 
   print_constraints(computed_result,
-		    "*** After add_constraints_and_minimize ***");
+		    "*** after add_constraints_and_minimize ***");
 
   return ok;
 }
@@ -148,7 +148,7 @@ test05() {
 
   bool ok = (ph == computed_result);
 
-  print_constraints(ph, "*** After add_constraints_and_minimize(cs) ***");
+  print_constraints(ph, "*** after add_constraints_and_minimize(cs) ***");
 
   return ok;
 }
@@ -175,7 +175,7 @@ test06() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After add_constraints_and_minimize(cs) ***");
+  print_constraints(ph, "*** after add_constraints_and_minimize(cs) ***");
 
   return ok;
 }
@@ -201,7 +201,7 @@ test07() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After add_constraints_and_minimize(cs) ***");
+  print_constraints(ph, "*** after add_constraints_and_minimize(cs) ***");
 
   return ok;
 }
@@ -223,7 +223,7 @@ test08() {
 
   bool ok = (known_result == ph);
 
-  print_constraints(ph, "*** After add_constraints ***");
+  print_constraints(ph, "*** after add_constraints ***");
 
   return ok;
 }
@@ -255,7 +255,7 @@ test09() {
 
   bool ok = (known_result == ph);
 
-  print_constraints(ph, "*** After add_constraints ***");
+  print_constraints(ph, "*** after add_constraints ***");
 
   return ok;
 }
@@ -279,7 +279,7 @@ test10() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.add_constraints(cs) ***");
+  print_constraints(ph1, "*** after ph1.add_constraints(cs) ***");
 
   return ok;
 }
@@ -304,9 +304,9 @@ test11() {
 
   bool ok = (ph == copy_ph);
 
-  print_constraints(ph, "*** After ph.add_constraints(cs1) ***");
+  print_constraints(ph, "*** after ph.add_constraints(cs1) ***");
   print_constraints(ph,
-		    "*** After copy_ph.add_constraints_and_minimize(cs2) ***");
+		    "*** after copy_ph.add_constraints_and_minimize(cs2) ***");
   return ok;
 }
 
@@ -338,9 +338,9 @@ test12() {
 
   bool ok = (ph1 == copy_ph1);
 
-  print_constraints(ph1, "*** After add_constraints_assign ***");
+  print_constraints(ph1, "*** after add_constraints_assign ***");
   print_constraints(copy_ph1,
-		    "*** After add_constraints_and_minimize ***");
+		    "*** after add_constraints_and_minimize ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/addconstraints2.cc b/tests/Polyhedron/addconstraints2.cc
index 1203f93..23eadff 100644
--- a/tests/Polyhedron/addconstraints2.cc
+++ b/tests/Polyhedron/addconstraints2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_constrains().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -49,7 +49,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.add_constraints_and_minimize(cs) ***");
+  print_constraints(ph1, "*** after ph1.add_constraints_and_minimize(cs) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/addgenerator1.cc b/tests/Polyhedron/addgenerator1.cc
index 66193f5..402754b 100644
--- a/tests/Polyhedron/addgenerator1.cc
+++ b/tests/Polyhedron/addgenerator1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_generator().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -49,7 +49,7 @@ test01() {
   bool ok = (ph == known_result);
 
   print_generators(ph,
-		    "*** After ph.add_generator_and_minimize(ray(A)) ***");
+		    "*** after ph.add_generator_and_minimize(ray(A)) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/addgenerator2.cc b/tests/Polyhedron/addgenerator2.cc
index 54ff899..4e4587c 100644
--- a/tests/Polyhedron/addgenerator2.cc
+++ b/tests/Polyhedron/addgenerator2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_generator().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -52,7 +52,7 @@ test01() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2add_generator(*i) ***");
+  print_generators(ph2, "*** after ph2add_generator(*i) ***");
 
   return ok;
 }
@@ -83,7 +83,7 @@ test02() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.add_generator(*i) ***");
+  print_generators(ph2, "*** after ph2.add_generator(*i) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/addgenerators1.cc b/tests/Polyhedron/addgenerators1.cc
index 2c6e813..3f9690d 100644
--- a/tests/Polyhedron/addgenerators1.cc
+++ b/tests/Polyhedron/addgenerators1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -97,7 +97,7 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After add_generators ***");
+  print_generators(ph, "*** after add_generators ***");
 
   return ok;
 }
@@ -127,7 +127,7 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After add_generators ***");
+  print_generators(ph, "*** after add_generators ***");
 
   return ok;
 }
@@ -147,7 +147,7 @@ test05() {
   gs.insert(ray(x + y));
   gs.insert(point());
 
-  print_generators(gs, "--- gs ---");
+  print_generators(gs, "*** gs ***");
 
   ph.add_generators_and_minimize(gs);
 
@@ -158,7 +158,7 @@ test05() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After add_generators_and_minimize ***");
+  print_generators(ph, "*** after add_generators_and_minimize ***");
 
   return ok;
 }
@@ -180,7 +180,7 @@ test06() {
   gs2.insert(ray(x));
   gs2.insert(point());
 
-  print_generators(gs2, "--- gs2 ---");
+  print_generators(gs2, "*** gs2 ***");
 
   ph.add_generators(gs2);
 
@@ -191,7 +191,7 @@ test06() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After add_generators ***");
+  print_generators(ph, "*** after add_generators ***");
 
   return ok;
 }
@@ -212,7 +212,7 @@ test07() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After ph .add_generators_and_minimize(gs)***");
+  print_generators(ph, "*** after ph .add_generators_and_minimize(gs) ***");
 
   return ok;
 }
@@ -234,7 +234,7 @@ test08() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After ph.add_generators(gs); ***");
+  print_generators(ph, "*** after ph.add_generators(gs); ***");
 
   return ok;
 }
@@ -258,9 +258,9 @@ test09() {
 
   bool ok = (ph == copy_ph);
 
-  print_generators(ph, "*** After ph.add_generators(gs1) ***");
+  print_generators(ph, "*** after ph.add_generators(gs1) ***");
   print_generators(ph,
-		   "*** After copy_ph.add_generators_and_minimize(gs2) ***");
+		   "*** after copy_ph.add_generators_and_minimize(gs2) ***");
 
   return ok;
 }
@@ -293,9 +293,9 @@ test10() {
 
   bool ok = (ph1 == copy_ph1);
 
-  print_generators(ph1, "*** After add_generators_assign ***");
+  print_generators(ph1, "*** after add_generators_assign ***");
   print_generators(copy_ph1,
-		    "*** After add_generators_and_minimize ***");
+		   "*** after add_generators_and_minimize ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/addgenerators2.cc b/tests/Polyhedron/addgenerators2.cc
index cdc521d..0c09fa2 100644
--- a/tests/Polyhedron/addgenerators2.cc
+++ b/tests/Polyhedron/addgenerators2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::add_generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -65,7 +65,7 @@ test01() {
   bool ok = (ph == known_result
 	     && closed_ph == closed_known_result);
 
-  print_generators(ph, "*** After add_generators_and_minimize(gs) ***");
+  print_generators(ph, "*** after add_generators_and_minimize(gs) ***");
   print_generators(closed_ph, "*** closed_ph ***");
 
   return ok;
diff --git a/tests/Polyhedron/addspacedims1.cc b/tests/Polyhedron/addspacedims1.cc
index 1baf500..b734315 100644
--- a/tests/Polyhedron/addspacedims1.cc
+++ b/tests/Polyhedron/addspacedims1.cc
@@ -1,12 +1,12 @@
 /* Test Polyhedron::add_space_dimensions_and_project()
    and  Polyhedron::add_space_dimensions_and_embed().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -50,7 +50,7 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After add_space_dimensions_and_project ***");
+  print_generators(ph, "*** after add_space_dimensions_and_project ***");
 
   return ok;
 }
@@ -99,7 +99,7 @@ test03() {
 
   ph.add_space_dimensions_and_embed(2);
 
-  print_generators(ph, "*** After add_space_dimensions_and_embed(2) ***");
+  print_generators(ph, "*** after add_space_dimensions_and_embed(2) ***");
 
   ph.add_space_dimensions_and_embed(2);
 
@@ -126,7 +126,7 @@ test04() {
 
   ph1.add_space_dimensions_and_project(3);
 
-  print_generators(ph1, "*** After add_space_dimensions_and_project(3) ***");
+  print_generators(ph1, "*** after add_space_dimensions_and_project(3) ***");
 
   C_Polyhedron ph2;
   Constraint_System cs = ph2.constraints();
@@ -137,7 +137,7 @@ test04() {
 
   bool ok = (ph1 == ph2);
 
-  print_generators(ph2, "*** After add_space_dimensions_and_project(3) ***");
+  print_generators(ph2, "*** after add_space_dimensions_and_project(3) ***");
 
   return ok;
 }
@@ -158,7 +158,7 @@ test05() {
   bool ok = (ph == known_result);
 
   print_constraints(ph,
-		    "*** After ph.add_space_dimensions_and_project(1) ***");
+		    "*** after ph.add_space_dimensions_and_project(1) ***");
 
   return ok;
 }
@@ -182,9 +182,9 @@ test06() {
   bool ok = (ph1 == ph2);
 
   print_constraints(ph1,
-		    "*** After ph1.add_space_dimensions_and_embed(0) ***");
+		    "*** after ph1.add_space_dimensions_and_embed(0) ***");
   print_constraints(ph2,
-		    "*** After ph2.add_space_dimensions_and_project(0) ***");
+		    "*** after ph2.add_space_dimensions_and_project(0) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/addspacedims2.cc b/tests/Polyhedron/addspacedims2.cc
index 1dc5cf6..096a2cf 100644
--- a/tests/Polyhedron/addspacedims2.cc
+++ b/tests/Polyhedron/addspacedims2.cc
@@ -1,12 +1,12 @@
 /* Test Polyhedron::add_space_dimensions_and_project()
    and  Polyhedron::add_space_dimensions_and_embed().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -57,8 +57,8 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After add_space_dimensions_and_project ***");
-  print_generators(ph, "*** After add_space_dimensions_and_project ***");
+  print_constraints(ph, "*** after add_space_dimensions_and_project ***");
+  print_generators(ph, "*** after add_space_dimensions_and_project ***");
 
   return ok;
 }
@@ -146,8 +146,8 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.add_space_dimensions_and_embed(1) ***");
-  print_generators(ph, "*** After ph.add_space_dimensions_and_embed(1) ***");
+  print_constraints(ph, "*** after ph.add_space_dimensions_and_embed(1) ***");
+  print_generators(ph, "*** after ph.add_space_dimensions_and_embed(1) ***");
 
   return ok;
 }
@@ -209,8 +209,8 @@ test06() {
   bool ok = (ph1 == known_result);
 
   print_constraints(ph1,
-		    "*** After ph1.add_space_dimensions_and_embed(1) ***");
-  print_generators(ph1, "*** After ph1.add_space_dimensions_and_embed(1) ***");
+		    "*** after ph1.add_space_dimensions_and_embed(1) ***");
+  print_generators(ph1, "*** after ph1.add_space_dimensions_and_embed(1) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/affineimage1.cc b/tests/Polyhedron/affineimage1.cc
index 8184a4a..00eaa85 100644
--- a/tests/Polyhedron/affineimage1.cc
+++ b/tests/Polyhedron/affineimage1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -34,7 +34,7 @@ test01() {
   ph.add_constraint(C == -2);
   ph.add_constraint(A == 0);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.affine_image(B, A+2, 1);
 
@@ -43,7 +43,7 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_image(B, A+2, 1) ---");
+  print_generators(ph, "*** ph after ph.affine_image(B, A+2, 1) ***");
 
   return ok;
 }
@@ -58,7 +58,7 @@ test02() {
   ph.add_constraint(B >= 0);
   ph.add_constraint(A <= 3);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.affine_image(A, A+B+1);
 
@@ -69,7 +69,7 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "--- ph after ph.affine_image(A, A+B+1) ---");
+  print_constraints(ph, "*** ph after ph.affine_image(A, A+B+1) ***");
 
   return ok;
 }
@@ -95,7 +95,7 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After ph.affine_image(A, A + 1, 2) ***");
+  print_generators(ph, "*** after ph.affine_image(A, A + 1, 2) ***");
 
   return ok;
 }
@@ -108,7 +108,7 @@ test04() {
   C_Polyhedron ph(2, EMPTY);
   ph.add_generator(point(A));
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.affine_image(A, B+2, -3);
 
@@ -117,7 +117,7 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_image(A, B+2, -3) ---");
+  print_generators(ph, "*** ph after ph.affine_image(A, B+2, -3) ***");
 
   return ok;
 }
@@ -133,7 +133,7 @@ test05() {
   ph.add_constraint(B >= 1);
   ph.add_constraint(2*A >= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.affine_image(B, A-B+2, -3);
 
@@ -145,7 +145,7 @@ test05() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_image(B, A-B+2, -3) ---");
+  print_generators(ph, "*** ph after ph.affine_image(B, A-B+2, -3) ***");
 
   return ok;
 }
@@ -165,7 +165,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.affine_image(A, 2*A + B + 1) ***");
+  print_constraints(ph1, "*** after ph1.affine_image(A, 2*A + B + 1) ***");
 
   return ok;
 }
@@ -195,7 +195,7 @@ test07() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After ph.affine_image(A, -A - 1, -1) ***");
+  print_generators(ph, "*** after ph.affine_image(A, -A - 1, -1) ***");
 
   return ok;
 }
@@ -218,9 +218,9 @@ test08() {
 
   bool ok = (ph == copy_ph);
 
-  print_generators(ph, "*** After ph.affine_image(A, A + 1) ***");
+  print_generators(ph, "*** after ph.affine_image(A, A + 1) ***");
   print_generators(copy_ph,
-		   "*** After copy_ph.affine_image(A, -A - 1, -1) ***");
+		   "*** after copy_ph.affine_image(A, -A - 1, -1) ***");
 
   return ok;
 }
@@ -243,9 +243,9 @@ test09() {
 
   bool ok = (ph == copy_ph);
 
-  print_generators(ph, "*** After ph.affine_image(B, A + 1) ***");
+  print_generators(ph, "*** after ph.affine_image(B, A + 1) ***");
   print_generators(copy_ph,
-		   "*** After copy_ph.affine_image(B, -A - 1, -1) ***");
+		   "*** after copy_ph.affine_image(B, -A - 1, -1) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/affineimage2.cc b/tests/Polyhedron/affineimage2.cc
index ffe4069..f381248 100644
--- a/tests/Polyhedron/affineimage2.cc
+++ b/tests/Polyhedron/affineimage2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/affinepreimage1.cc b/tests/Polyhedron/affinepreimage1.cc
index 91e6e23..4506234 100644
--- a/tests/Polyhedron/affinepreimage1.cc
+++ b/tests/Polyhedron/affinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,7 +36,7 @@ test01() {
 
   C_Polyhedron ph(gs);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   ph.affine_preimage(A, A+2);
 
@@ -49,7 +49,7 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_preimage(A, A+2) ---");
+  print_generators(ph, "*** ph after ph.affine_preimage(A, A+2) ***");
 
   return ok;
 }
@@ -65,7 +65,7 @@ test02() {
   ph.add_constraint(A + B >= 0);
   ph.add_constraint(A + B - 1 >= 0);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.affine_preimage(A, A + B);
 
@@ -76,7 +76,7 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "--- ph after ph.affine_preimage(A, A+B) ---");
+  print_constraints(ph, "*** ph after ph.affine_preimage(A, A+B) ***");
 
   return ok;
 }
@@ -91,7 +91,7 @@ test03() {
   ph.add_constraint(B >= 0);
   ph.add_constraint(A + B - 3 >= 0);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.affine_preimage(A, B+1);
 
@@ -102,7 +102,7 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_preimage(A, B+2) ---");
+  print_generators(ph, "*** ph after ph.affine_preimage(A, B+2) ***");
 
   return ok;
 }
@@ -128,7 +128,7 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After affine_preimage(x, y+1) ***");
+  print_constraints(ph, "*** after affine_preimage(x, y+1) ***");
 
   return ok;
 }
@@ -152,7 +152,7 @@ test05() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.affine_preimage(A, A + 1, 2) ***");
+  print_constraints(ph, "*** after ph.affine_preimage(A, A + 1, 2) ***");
 
   return ok;
 }
@@ -174,7 +174,7 @@ test06() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.affine_preimage(B, A + 1, 2) ***");
+  print_constraints(ph, "*** after ph.affine_preimage(B, A + 1, 2) ***");
 
   return ok;
 }
@@ -200,7 +200,7 @@ test07() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.affine_preimage(B, A - B, -1) ***");
+  print_constraints(ph, "*** after ph.affine_preimage(B, A - B, -1) ***");
 
   return ok;
 }
@@ -220,7 +220,7 @@ test08() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.affine_preimage(A, 2*A + B + 1) ***");
+  print_constraints(ph, "*** after ph.affine_preimage(A, 2*A + B + 1) ***");
 
   return ok;
 }
@@ -246,7 +246,7 @@ test09() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.affine_preimage(A, -A - 1, -1) ***");
+  print_constraints(ph, "*** after ph.affine_preimage(A, -A - 1, -1) ***");
 
   return ok;
 }
@@ -271,7 +271,7 @@ test10() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.affine_preimage(B, -A - 1, -1) ***");
+  print_constraints(ph, "*** after ph.affine_preimage(B, -A - 1, -1) ***");
 
   return ok;
 }
@@ -294,9 +294,9 @@ test11() {
 
   bool ok = (ph == copy_ph);
 
-  print_generators(ph, "*** After ph.affine_preimage(A, A + 1) ***");
+  print_generators(ph, "*** after ph.affine_preimage(A, A + 1) ***");
   print_generators(copy_ph,
-		   "*** After copy_ph.affine_preimage(A, -A - 1, -1) ***");
+		   "*** after copy_ph.affine_preimage(A, -A - 1, -1) ***");
   return ok;
 }
 
@@ -318,9 +318,9 @@ test12() {
 
   bool ok = (ph == copy_ph);
 
-  print_generators(ph, "*** After ph.affine_preimage(B, A + 1) ***");
+  print_generators(ph, "*** after ph.affine_preimage(B, A + 1) ***");
   print_generators(copy_ph,
-		   "*** After copy_ph.affine_preimage(B, -A - 1, -1) ***");
+		   "*** after copy_ph.affine_preimage(B, -A - 1, -1) ***");
   return ok;
 }
 
@@ -336,7 +336,7 @@ test13() {
 
   C_Polyhedron ph(gs);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   ph.affine_preimage(B, Linear_Expression(1));
 
@@ -349,7 +349,7 @@ test13() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_preimage(B, 1) ---");
+  print_generators(ph, "*** ph after ph.affine_preimage(B, 1) ***");
 
   return ok;
 }
@@ -369,17 +369,17 @@ test14() {
 
   C_Polyhedron known_result = ph;
 
-  print_generators(ph, "--- ph before ph.affine_image(A, A + 2*B + 4) ---");
+  print_generators(ph, "*** ph before ph.affine_image(A, A + 2*B + 4) ***");
 
   ph.affine_image(A, A + 2*B + 4);
 
-  print_generators(ph, "--- ph after ph.affine_image(A, A + 2*B + 4) ---");
+  print_generators(ph, "*** ph after ph.affine_image(A, A + 2*B + 4) ***");
 
   ph.affine_preimage(A, A + 2*B + 4);
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_preimage(A, A + 2*B + 4) ---");
+  print_generators(ph, "*** ph after ph.affine_preimage(A, A + 2*B + 4) ***");
 
   return ok;
 }
@@ -397,11 +397,11 @@ test15() {
 
   C_Polyhedron ph(gs);
 
-  print_generators(ph, "--- ph before ph.affine_image(A, B) ---");
+  print_generators(ph, "*** ph before ph.affine_image(A, B) ***");
 
   ph.affine_image(A, B);
 
-  print_generators(ph, "--- ph after ph.affine_image(A, B) ---");
+  print_generators(ph, "*** ph after ph.affine_image(A, B) ***");
 
   ph.affine_preimage(A, B);
 
@@ -411,7 +411,7 @@ test15() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after ph.affine_preimage(A, B) ---");
+  print_generators(ph, "*** ph after ph.affine_preimage(A, B) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/affinetrans.cc b/tests/Polyhedron/affinetrans.cc
index ac4b425..d68573c 100644
--- a/tests/Polyhedron/affinetrans.cc
+++ b/tests/Polyhedron/affinetrans.cc
@@ -1,11 +1,11 @@
 /* Use of the functions affine_image and affine_preimage.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/append1.cc b/tests/Polyhedron/append1.cc
index bb8af7f..c96be28 100644
--- a/tests/Polyhedron/append1.cc
+++ b/tests/Polyhedron/append1.cc
@@ -1,11 +1,11 @@
 /* An example of iteration to a post-fixpoint.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,10 +35,8 @@ shift_rename_add(const C_Polyhedron& p,
 
 } // namespace
 
-int
-main() TRY {
-  set_handlers();
-
+bool
+test01() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -92,7 +90,7 @@ main() TRY {
 
     current.poly_hull_assign_and_minimize(previous);
 
-    print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+    print_constraints(current, "*** after poly_hull_assign_and_minimize ***");
 
   } while (current != previous);
 
@@ -103,6 +101,11 @@ main() TRY {
 
   print_constraints(expected, "*** expected ***");
 
-  return current == expected ? 0 : 1;
+  return current == expected ? true : false;
 }
-CATCH
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
+
diff --git a/tests/Polyhedron/append2.cc b/tests/Polyhedron/append2.cc
index 342264a..bd41337 100644
--- a/tests/Polyhedron/append2.cc
+++ b/tests/Polyhedron/append2.cc
@@ -1,11 +1,11 @@
 /* An example of iteration to a post-fixpoint.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -100,7 +100,7 @@ fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
 
     current.poly_hull_assign_and_minimize(previous);
 
-    print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+    print_constraints(current, "*** after poly_hull_assign_and_minimize ***");
 
   } while (current != previous);
   finish = current;
@@ -108,10 +108,8 @@ fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
 
 } // namespace
 
-int
-main() TRY {
-  set_handlers();
-
+bool
+test01() {
   C_Polyhedron start;
   C_Polyhedron induct;
   C_Polyhedron expect;
@@ -122,8 +120,11 @@ main() TRY {
   C_Polyhedron final;
   fix_point(start, induct, final, recursive_offset, arity, num_vars);
 
-    print_constraints(expect, "*** expected ***");
+  print_constraints(expect, "*** expected ***");
 
-  return final == expect ? 0 : 1;
+  return final == expect ? true : false;
 }
-CATCH
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load1.cc b/tests/Polyhedron/ascii_dump_load1.cc
index bfe6d23..a4d47b4 100644
--- a/tests/Polyhedron/ascii_dump_load1.cc
+++ b/tests/Polyhedron/ascii_dump_load1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/ascii_dump_load2.cc b/tests/Polyhedron/ascii_dump_load2.cc
index 848528f..08246de 100644
--- a/tests/Polyhedron/ascii_dump_load2.cc
+++ b/tests/Polyhedron/ascii_dump_load2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/ascii_dump_load3.cc b/tests/Polyhedron/ascii_dump_load3.cc
index aee0efd..7f96094 100644
--- a/tests/Polyhedron/ascii_dump_load3.cc
+++ b/tests/Polyhedron/ascii_dump_load3.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/bgp99extrapolation1.cc b/tests/Polyhedron/bgp99extrapolation1.cc
index 3eb79a5..6560d64 100644
--- a/tests/Polyhedron/bgp99extrapolation1.cc
+++ b/tests/Polyhedron/bgp99extrapolation1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<PH>::BGP99_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -71,9 +71,9 @@ aux1_test01(unsigned n) {
   return p[n];
 }
 
-Polyhedra_Powerset<C_Polyhedron>
+Pointset_Powerset<C_Polyhedron>
 aux2_test01(unsigned n) {
-  Polyhedra_Powerset<C_Polyhedron> s(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
   if (n == 0) {
 
     nout << "S0 = { P0 }" << endl;
@@ -126,7 +126,7 @@ test01() {
   // Install the alternate output function.
   Variable::set_output_function(aux3_test01);
 
-  Polyhedra_Powerset<C_Polyhedron> T = aux2_test01(0);
+  Pointset_Powerset<C_Polyhedron> T = aux2_test01(0);
 
   using namespace Parma_Polyhedra_Library::IO_Operators;
 
@@ -134,7 +134,7 @@ test01() {
 
   bool converged = false;
   for (unsigned n = 1; !converged && n <= 20; ++n) {
-    Polyhedra_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+    Pointset_Powerset<C_Polyhedron> Sn = aux2_test01(n);
 
     nout << "S" << n << " = " << Sn << endl;
 
@@ -194,7 +194,7 @@ test02() {
   ps1_9.add_constraint(A - B >= -12);
   ps1_9.add_constraint(A >= 2);
 
-  Polyhedra_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
   ps1.add_disjunct(ps1_1);
   ps1.add_disjunct(ps1_2);
   ps1.add_disjunct(ps1_3);
@@ -222,7 +222,7 @@ test02() {
   ps2_4.add_constraint(A - B >= -16);
   ps2_4.add_constraint(A >= 3);
 
-  Polyhedra_Powerset<C_Polyhedron> ps2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
   ps2.add_disjunct(ps2_1);
   ps2.add_disjunct(ps2_2);
   ps2.add_disjunct(ps2_3);
@@ -237,7 +237,7 @@ test02() {
   ps1.BGP99_extrapolation_assign
     (ps2, widen_fun_ref(&Polyhedron::H79_widening_assign), 7);
 
-  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
   C_Polyhedron kr_1(2);
   kr_1.add_constraint(A - B >= -16);
   kr_1.add_constraint(A >= 3);
diff --git a/tests/Polyhedron/bhrz03widening1.cc b/tests/Polyhedron/bhrz03widening1.cc
index e8cf0fb..8ef21cd 100644
--- a/tests/Polyhedron/bhrz03widening1.cc
+++ b/tests/Polyhedron/bhrz03widening1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::BHRZ03_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -57,7 +57,7 @@ test01() {
 
   bool ok = (ph1 == ph1_copy);
 
-  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -83,7 +83,7 @@ test02() {
 
   bool ok = (ph1 == ph1_copy);
 
-  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -115,7 +115,7 @@ test03() {
 
   bool ok = (ph1 == ph1_copy);
 
-  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -148,7 +148,7 @@ test04() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -180,7 +180,7 @@ test05() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -209,7 +209,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -246,7 +246,7 @@ test07() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -282,7 +282,7 @@ test08() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -401,7 +401,7 @@ test10() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.H79_widening_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.H79_widening_assign(ph2) ***");
 
   return ok;
 }
@@ -427,7 +427,7 @@ test11() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.BHRZ03_widening_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.BHRZ03_widening_assign(ph2) ***");
 
   return ok;
 }
@@ -460,7 +460,7 @@ test12() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -493,7 +493,7 @@ test13() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -526,7 +526,7 @@ test14() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -559,7 +559,7 @@ test15() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -592,7 +592,7 @@ test16() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -625,7 +625,7 @@ test17() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -658,7 +658,7 @@ test18() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -691,7 +691,7 @@ test19() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -723,7 +723,7 @@ test20() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/bhrz03widening2.cc b/tests/Polyhedron/bhrz03widening2.cc
index 17b1895..bf32dcf 100644
--- a/tests/Polyhedron/bhrz03widening2.cc
+++ b/tests/Polyhedron/bhrz03widening2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::BHRZ03_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -51,7 +51,7 @@ test01() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -83,7 +83,7 @@ test02() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -115,7 +115,7 @@ test03() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -147,7 +147,7 @@ test04() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -179,7 +179,7 @@ test05() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -211,7 +211,7 @@ test06() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -243,7 +243,7 @@ test07() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/bhrz03widening3.cc b/tests/Polyhedron/bhrz03widening3.cc
index c27e09b..9d8e4e2 100644
--- a/tests/Polyhedron/bhrz03widening3.cc
+++ b/tests/Polyhedron/bhrz03widening3.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::BHRZ03_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -49,7 +49,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -88,7 +88,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
 
   return ok;
 }
@@ -467,7 +467,7 @@ test06() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -502,7 +502,7 @@ test07() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -550,8 +550,8 @@ test08() {
 
   bool ok = (ph2 == known_result);
 
-  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
-  print_constraints(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+  print_constraints(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -587,7 +587,45 @@ test09() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After  ph2.BHRZ03_widening_assign(ph1) ***");
+  print_constraints(ph2, "*** after  ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(B));
+  gs.insert(point(A + 2*B));
+  gs.insert(point(A + B));
+  NNC_Polyhedron ph(gs);
+
+  gs.clear();
+  gs.insert(point());
+  gs.insert(point(B));
+  gs.insert(point(A + 2*B));
+  gs.insert(closure_point(A));
+  NNC_Polyhedron ph1(gs);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.BHRZ03_widening_assign(ph);
+
+  gs.clear();
+  gs.insert(point());
+  gs.insert(point(B));
+  gs.insert(point(A + 2*B));
+  gs.insert(ray(-B));
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.BHRZ03_widening_assin(ph) ***");
 
   return ok;
 }
@@ -604,4 +642,5 @@ BEGIN_MAIN
   DO_TEST(test07);
   DO_TEST_F8(test08);
   DO_TEST(test09);
+  DO_TEST(test10);
 END_MAIN
diff --git a/tests/Polyhedron/bhz03widening1.cc b/tests/Polyhedron/bhz03widening1.cc
index 1c9d2c9..6c14541 100644
--- a/tests/Polyhedron/bhz03widening1.cc
+++ b/tests/Polyhedron/bhz03widening1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<PH>::BHZ03_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -73,9 +73,9 @@ aux1_test01(unsigned n) {
   return p[n];
 }
 
-Polyhedra_Powerset<C_Polyhedron>
+Pointset_Powerset<C_Polyhedron>
 aux2_test01(unsigned n) {
-  Polyhedra_Powerset<C_Polyhedron> s(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
   if (n == 0) {
 
     nout << "S0 = { P0 }" << endl;
@@ -128,13 +128,13 @@ test01() {
   // Install the alternate output function.
   Variable::set_output_function(aux3_test01);
 
-  Polyhedra_Powerset<C_Polyhedron> T = aux2_test01(0);
+  Pointset_Powerset<C_Polyhedron> T = aux2_test01(0);
 
   nout << "T0 = " << T << endl;
 
   bool converged = false;
   for (unsigned n = 1; !converged && n <= 20; ++n) {
-    Polyhedra_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+    Pointset_Powerset<C_Polyhedron> Sn = aux2_test01(n);
 
     nout << "S" << n << " = " << Sn << endl;
 
@@ -173,12 +173,12 @@ test02() {
   s.add_constraint(A >= 1);
   s.add_constraint(A <= 6);
   s.add_constraint(B == 1);
-  Polyhedra_Powerset<C_Polyhedron> P(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> P(2, EMPTY);
   P.add_disjunct(p);
   P.add_disjunct(q);
   P.add_disjunct(r);
   P.add_disjunct(s);
-  Polyhedra_Powerset<C_Polyhedron> Q(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> Q(2, EMPTY);
   Q.add_disjunct(p);
   Q.add_disjunct(q);
   Q.add_disjunct(s);
@@ -186,7 +186,7 @@ test02() {
   nout << "P = " << P << endl
        << "Q = " << Q << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_P = P;
+  Pointset_Powerset<C_Polyhedron> old_P = P;
   P.BHZ03_widening_assign<BHRZ03_Certificate>
     (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -218,7 +218,7 @@ test03() {
   p3.add_constraint(X <= 4);
   p3.add_constraint(Y <= 3);
 
-  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
   T1.add_disjunct(p1);
   T1.add_disjunct(p2);
   T1.add_disjunct(p3);
@@ -229,7 +229,7 @@ test03() {
   p4.add_constraint(X <= 2);
   p4.add_constraint(Y <= 5);
 
-  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
   T2.add_disjunct(p1);
   T2.add_disjunct(p2);
   T2.add_disjunct(p3);
@@ -238,7 +238,7 @@ test03() {
   nout << "T1 = " << T1 << endl
        << "T2 = " << T2 << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
   T2.BHZ03_widening_assign<BHRZ03_Certificate>
     (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -247,7 +247,7 @@ test03() {
   pd.add_constraint(X <= 4);
   pd.add_constraint(X + 2*Y >= 10);
 
-  Polyhedra_Powerset<C_Polyhedron> known_result = old_T2;
+  Pointset_Powerset<C_Polyhedron> known_result = old_T2;
   known_result.add_disjunct(pd);
 
   nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
@@ -303,9 +303,9 @@ aux1_test04(unsigned n) {
   return p[n];
 }
 
-Polyhedra_Powerset<C_Polyhedron>
+Pointset_Powerset<C_Polyhedron>
 aux2_test04(unsigned n) {
-  Polyhedra_Powerset<C_Polyhedron> s(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
   if (n == 0) {
 
     nout << "S0 = { P0 }" << endl;
@@ -358,13 +358,13 @@ test04() {
   // Install the alternate output function.
   Variable::set_output_function(aux3_test04);
 
-  Polyhedra_Powerset<C_Polyhedron> T = aux2_test04(0);
+  Pointset_Powerset<C_Polyhedron> T = aux2_test04(0);
 
   nout << "T0 = " << T << endl;
 
   bool converged = false;
   for (unsigned n = 1; !converged && n <= 20; ++n) {
-    Polyhedra_Powerset<C_Polyhedron> Sn = aux2_test04(n);
+    Pointset_Powerset<C_Polyhedron> Sn = aux2_test04(n);
 
     nout << "S" << n << " = " << Sn << endl;
 
@@ -403,12 +403,12 @@ test05() {
   s.add_constraint(A >= 1);
   s.add_constraint(A <= 6);
   s.add_constraint(B == 1);
-  Polyhedra_Powerset<C_Polyhedron> P(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> P(2, EMPTY);
   P.add_disjunct(p);
   P.add_disjunct(q);
   P.add_disjunct(r);
   P.add_disjunct(s);
-  Polyhedra_Powerset<C_Polyhedron> Q(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> Q(2, EMPTY);
   Q.add_disjunct(p);
   Q.add_disjunct(q);
   Q.add_disjunct(s);
@@ -416,7 +416,7 @@ test05() {
   nout << "P = " << P << endl
        << "Q = " << Q << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_P = P;
+  Pointset_Powerset<C_Polyhedron> old_P = P;
   P.BHZ03_widening_assign<H79_Certificate>
     (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -448,7 +448,7 @@ test06() {
   p4.add_constraint(X <= 2);
   p4.add_constraint(Y <= 5);
 
-  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
   T1.add_disjunct(p1);
   T1.add_disjunct(p3);
   T1.add_disjunct(p4);
@@ -459,7 +459,7 @@ test06() {
   p2.add_constraint(X <= 1);
   p2.add_constraint(Y <= 3);
 
-  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
   T2.add_disjunct(p1);
   T2.add_disjunct(p2);
   T2.add_disjunct(p3);
@@ -468,7 +468,7 @@ test06() {
   nout << "T1 = " << T1 << endl
        << "T2 = " << T2 << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
   T2.BHZ03_widening_assign<BHRZ03_Certificate>
     (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -480,7 +480,7 @@ test06() {
   phull_T2.add_constraint(X - 2*Y <= 2);
   phull_T2.add_constraint(X + Y <= 7);
 
-  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
   known_result.add_disjunct(phull_T2);
 
   nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
@@ -492,7 +492,7 @@ test06() {
 }
 
 // This tests the first case of the widening definition when the widening
-// does nothing as the lgo for the polyhull is decreasing.
+// does nothing as the lgo for the poly-hull is decreasing.
 bool
 test07() {
   Variable X(0);
@@ -521,7 +521,7 @@ test07() {
   p4.add_constraint(X <= 4);
   p4.add_constraint(Y <= 3);
 
-  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
   T1.add_disjunct(p1);
   T1.add_disjunct(p2);
   T1.add_disjunct(p3);
@@ -545,7 +545,7 @@ test07() {
   q3.add_constraint(X <= 6);
   q3.add_constraint(Y <= 2);
 
-  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
   T2.add_disjunct(q1);
   T2.add_disjunct(q2);
   T2.add_disjunct(q3);
@@ -553,7 +553,7 @@ test07() {
   nout << "T1 = " << T1 << endl
        << "T2 = " << T2 << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
   T2.BHZ03_widening_assign<BHRZ03_Certificate>
     (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -565,7 +565,7 @@ test07() {
 }
 
 // This tests the first case of the widening definition when the widening
-// does nothing; the polyhull is stable with respect to the certificate
+// does nothing; the poly-hull is stable with respect to the certificate
 // and the multiset ordering for this certificate is decreasing.
 bool
 test08() {
@@ -592,7 +592,7 @@ test08() {
   p3.add_constraint(X <= 7);
   p3.add_constraint(Y <= 3);
 
-  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
   T1.add_disjunct(p1);
   T1.add_disjunct(p2);
   T1.add_disjunct(p3);
@@ -615,7 +615,7 @@ test08() {
   q3.add_constraint(X <= 12);
   q3.add_constraint(Y <= 4);
 
-  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
   T2.add_disjunct(q1);
   T2.add_disjunct(q2);
   T2.add_disjunct(q3);
@@ -623,7 +623,7 @@ test08() {
   nout << "T1 = " << T1 << endl
        << "T2 = " << T2 << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
   T2.BHZ03_widening_assign<BHRZ03_Certificate>
     (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -665,7 +665,7 @@ test09() {
   p4.add_constraint(X <= 8);
   p4.add_constraint(Y <= 5);
 
-  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
   T1.add_disjunct(p1);
   T1.add_disjunct(p2);
   T1.add_disjunct(p3);
@@ -677,7 +677,7 @@ test09() {
   q1.add_constraint(Y - X <= 2);
   q1.add_constraint(X + Y <= 8);
 
-  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
   T2.add_disjunct(q1);
   T2.add_disjunct(p2);
   T2.add_disjunct(p3);
@@ -686,7 +686,7 @@ test09() {
   nout << "T1 = " << T1 << endl
        << "T2 = " << T2 << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
   T2.BHZ03_widening_assign<BHRZ03_Certificate>
     (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
 
@@ -695,7 +695,7 @@ test09() {
   r1.add_constraint(Y - X <= 2);
   r1.add_constraint(X + Y <= 8);
 
-  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
   known_result.add_disjunct(r1);
   known_result.add_disjunct(p2);
   known_result.add_disjunct(p3);
diff --git a/tests/Polyhedron/bounded1.cc b/tests/Polyhedron/bounded1.cc
index 96d0cf9..d240601 100644
--- a/tests/Polyhedron/bounded1.cc
+++ b/tests/Polyhedron/bounded1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::is_bounded().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/boundedaffineimage1.cc b/tests/Polyhedron/boundedaffineimage1.cc
index aaae9a5..bf58c98 100644
--- a/tests/Polyhedron/boundedaffineimage1.cc
+++ b/tests/Polyhedron/boundedaffineimage1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::bounded_affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,21 +37,21 @@ test01() {
   ph.add_constraint(A - B <= 2);
   ph.add_constraint(A - B >= -2);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   C_Polyhedron kr1 = ph;
   C_Polyhedron kr2 = ph;
 
   ph.bounded_affine_image(A, 7-B, B+3);
 
-  kr1.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, 7-B);
-  kr2.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B+3);
+  kr1.generalized_affine_image(A, GREATER_OR_EQUAL, 7-B);
+  kr2.generalized_affine_image(A, LESS_OR_EQUAL, B+3);
   kr1.intersection_assign(kr2);
 
   bool ok = (ph == kr1);
 
   print_generators(ph,
-		   "--- ph.bounded_affine_image(A, 7-B, B+3) ---");
+		   "*** ph.bounded_affine_image(A, 7-B, B+3) ***");
 
   return ok;
 }
@@ -69,21 +69,23 @@ test02() {
   ph.add_constraint(A - B <= 2);
   ph.add_constraint(A - B >= -2);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   C_Polyhedron kr1 = ph;
   C_Polyhedron kr2 = ph;
 
   ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3);
 
-  kr1.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, 7-3*A+2*B);
-  kr2.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B+5*A-3);
-  kr1.intersection_assign(kr2);
+  kr1.generalized_affine_image(A, GREATER_OR_EQUAL, 7-3*A+2*B);
+  kr2.generalized_affine_image(A, LESS_OR_EQUAL, B+5*A-3);
+  kr1.intersection_assign_and_minimize(kr2);
 
   bool ok = (ph == kr1);
 
   print_generators(ph,
-		   "--- ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ---");
+		   "*** ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ***");
+  print_generators(kr1,
+		   "*** kr1.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ***");
 
   return ok;
 }
@@ -98,7 +100,7 @@ test03() {
   ph.add_constraint(A <= 4);
   ph.add_constraint(A == B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.bounded_affine_image(A, A+5, B);
 
@@ -106,7 +108,109 @@ test03() {
 
   bool ok = (ph == kr1);
 
-  print_generators(ph, "--- ph.bounded_affine_image(A, A+5, B) ---");
+  print_generators(ph, "*** ph.bounded_affine_image(A, A+5, B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_constraint(x <= 1);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 2);
+  ph.add_constraint(y >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1(ph);
+  C_Polyhedron kr2(ph);
+
+  ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+
+  kr1.generalized_affine_image(x, GREATER_OR_EQUAL, -2*x + y + 1, -1);
+  kr2.generalized_affine_image(x, LESS_OR_EQUAL, -2*x + y + 1, -1);
+  kr1.intersection_assign_and_minimize(kr2);
+
+  bool ok = (kr1 == ph);
+
+  print_constraints(ph,
+		    "*** ph.bounded_affine_image("
+		    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+  print_constraints(kr1,
+		    "*** kr1 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_constraint(x <= 1);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 2);
+  ph.add_constraint(y >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1(ph);
+  C_Polyhedron kr2(ph);
+
+  ph.bounded_affine_image(x, 2*x + y + 1, 2*x + y + 1, -1);
+
+  kr1.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x + y + 1, -1);
+  kr2.generalized_affine_image(x, LESS_OR_EQUAL, 2*x + y + 1, -1);
+  kr1.intersection_assign_and_minimize(kr2);
+
+  bool ok = (kr1 == ph);
+
+  print_constraints(ph,
+		    "*** ph.bounded_affine_image("
+		    "x, 2*x+y+1, 2*x+y+1, -1) ***");
+  print_constraints(kr1,
+		    "*** kr1 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_constraint(x <= 1);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 2);
+  ph.add_constraint(y >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1(ph);
+  C_Polyhedron kr2(ph);
+
+  ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  kr1.generalized_affine_image(x, GREATER_OR_EQUAL, -2*x + y + 1);
+  kr2.generalized_affine_image(x, LESS_OR_EQUAL, -2*x + y + 1);
+  kr1.intersection_assign_and_minimize(kr2);
+
+  bool ok = (kr1 == ph);
+
+  print_constraints(ph,
+		    "*** ph.bounded_affine_image("
+		    "x, -2*x+y+1, -2*x+y+1) ***");
+  print_constraints(kr1,
+		    "*** kr1 ***");
 
   return ok;
 }
@@ -117,4 +221,7 @@ BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST_F8(test02);
   DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
 END_MAIN
diff --git a/tests/Polyhedron/boundedaffinepreimage1.cc b/tests/Polyhedron/boundedaffinepreimage1.cc
index d438f02..c798b21 100644
--- a/tests/Polyhedron/boundedaffinepreimage1.cc
+++ b/tests/Polyhedron/boundedaffinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::bounded_affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,7 +37,7 @@ test01() {
   ph.add_constraint(A - B <= 2);
   ph.add_constraint(A - B >= -2);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   // A longer way of computing the bounded affine preimage below.
   C_Polyhedron known_result(ph);
@@ -52,7 +52,7 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph.bounded_affine_preimage(B, 7-A, A+3) ---");
+  print_generators(ph, "*** ph.bounded_affine_preimage(B, 7-A, A+3) ***");
 
   return ok;
 }
@@ -70,7 +70,7 @@ test02() {
   ph.add_constraint(A - B <= 2);
   ph.add_constraint(A - B >= -2);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   // A longer way of computing the bounded affine preimage below.
   C_Polyhedron known_result(ph);
@@ -86,8 +86,8 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- "
-		   "ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3) ---");
+  print_generators(ph, "*** "
+		   "ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3) ***");
 
   return ok;
 }
@@ -102,7 +102,7 @@ test03() {
   ph.add_constraint(A <= 4);
   ph.add_constraint(A == B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.bounded_affine_preimage(A, B+5, A-3);
 
@@ -110,7 +110,7 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph.bounded_affine_preimage(A, B+5, A-3) ---");
+  print_generators(ph, "*** ph.bounded_affine_preimage(A, B+5, A-3) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/boundedbhrz03extrapolation1.cc b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
index 909744c..173f89c 100644
--- a/tests/Polyhedron/boundedbhrz03extrapolation1.cc
+++ b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::bounded_BHRZ03_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -107,5 +107,5 @@ test01() {
 } // namespace
 
 BEGIN_MAIN
-  DO_TEST_F8(test01);
+  DO_TEST_F8A(test01);
 END_MAIN
diff --git a/tests/Polyhedron/boundedh79extrapolation1.cc b/tests/Polyhedron/boundedh79extrapolation1.cc
index 3595dd8..59beb21 100644
--- a/tests/Polyhedron/boundedh79extrapolation1.cc
+++ b/tests/Polyhedron/boundedh79extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::bounded_H79_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -61,7 +61,7 @@ test01() {
   bool ok = (ph2 == known_result);
 
   print_constraints(ph2,
-		    "*** After ph2.bounded_H79_extrapolation_assign(ph1, cs) "
+		    "*** after ph2.bounded_H79_extrapolation_assign(ph1, cs) "
 		    "***");
 
   return ok;
diff --git a/tests/Polyhedron/boundingbox1.cc b/tests/Polyhedron/boundingbox1.cc
deleted file mode 100644
index 9750a9b..0000000
--- a/tests/Polyhedron/boundingbox1.cc
+++ /dev/null
@@ -1,594 +0,0 @@
-/* Test Polyhedron::shrink_bounding_box().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-#include "BBox.hh"
-
-namespace {
-
-// A non-bounded closed polyhedron consisting of the line x = y.
-// The bounding box is the xy plane - the universal polyhedron.
-bool
-test01() {
-  Variable x(0);
-  Variable y(1);
-  C_Polyhedron ph(2);
-  ph.add_constraint(x - y >= 0);
-
-  BBox pbox(2);
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(2);
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test01 ph ***");
-  nbox.print(nout, "*** test01 nbox ***");
-  pbox.print(nout, "*** test01 pbox ***");
-
-  BBox known_box(2);
-
-  known_box.print(nout, "*** test01 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// A non-bounded closed polyhedron  in 2D consisting of a wedge bounded
-// by y >= 0 and x >= y.
-// The resulting bounding box depends on the complexity class.
-bool
-test02() {
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron ph(2);
-  ph.add_constraint(x >= y);
-  ph.add_constraint(y >= 0);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test02 ph ***");
-  nbox.print(nout, "*** test02 nbox ***");
-  pbox.print(nout, "*** test02 pbox ***");
-
-  BBox known_nbox(2);
-  known_nbox.raise_lower_bound(0, true, 0, 1);
-  known_nbox.raise_lower_bound(1, true, 0, 1);
-
-  BBox known_pbox(2);
-  known_pbox.raise_lower_bound(1, true, 0, 1);
-
-  known_nbox.print(nout, "*** test02 known_nbox ***");
-  known_pbox.print(nout, "*** test02 known_pbox ***");
-
-  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
-}
-
-// A bounded non-rectangular closed polyhedron in 2D.
-bool
-test03() {
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron ph(2);
-  ph.add_constraint(3*x + y >= 2);
-  ph.add_constraint(x <= 4);
-  ph.add_constraint(y <= 4);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test03 ph ***");
-  nbox.print(nout, "*** test03 nbox ***");
-  pbox.print(nout, "*** test03 pbox ***");
-
-  BBox known_nbox(2);
-  known_nbox.raise_lower_bound(0, true, -2, 3);
-  known_nbox.lower_upper_bound(0, true, 4, 1);
-  known_nbox.raise_lower_bound(1, true, -10, 1);
-  known_nbox.lower_upper_bound(1, true, 12, 3);
-
-  BBox known_pbox(2);
-  known_pbox.lower_upper_bound(0, true, 4, 1);
-  known_pbox.lower_upper_bound(1, true, 4, 1);
-
-  known_nbox.print(nout, "*** test03 known_nbox ***");
-  known_pbox.print(nout, "*** test03 known_pbox ***");
-
-  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
-}
-
-// An unbounded closed polyhedron in 4D but bounded in 2D.
-bool
-test04() {
-  Variable x(1);
-  Variable y(2);
-  Variable z(3);
-
-  C_Polyhedron ph(4);
-  ph.add_constraint(3*x + y >= 2);
-  ph.add_constraint(x <= 4);
-  ph.add_constraint(y <= 4);
-  ph.add_constraint(z >= 5);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test04 ph ***");
-  nbox.print(nout, "*** test04 nbox ***");
-  pbox.print(nout, "*** test04 pbox ***");
-
-  BBox known_nbox(4);
-  known_nbox.raise_lower_bound(1, true, -2, 3);
-  known_nbox.lower_upper_bound(1, true, 4, 1);
-  known_nbox.raise_lower_bound(2, true, -10, 1);
-  known_nbox.lower_upper_bound(2, true, 12, 3);
-  known_nbox.raise_lower_bound(3, true, 15, 3);
-
-  BBox known_pbox(4);
-  known_pbox.lower_upper_bound(1, true, 4, 1);
-  known_pbox.lower_upper_bound(2, true, 4, 1);
-  known_pbox.raise_lower_bound(3, true, 5, 1);
-
-  known_nbox.print(nout, "*** test04 known_nbox ***");
-  known_pbox.print(nout, "*** test04 known_pbox ***");
-
-  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
-}
-
-// This is the universal, 2-dimensional closed polyhedron.
-bool
-test05() {
-  C_Polyhedron ph(2);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test05 ph ***");
-  nbox.print(nout, "*** test05 nbox ***");
-  pbox.print(nout, "*** test05 pbox ***");
-
-  BBox known_box(2);
-
-  known_box.print(nout, "*** test05 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// A zero-dimensional closed polyhedron.
-bool
-test06() {
-  C_Polyhedron ph;
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test06 ph ***");
-  nbox.print(nout, "*** test06 nbox ***");
-  pbox.print(nout, "*** test06 pbox ***");
-
-  BBox known_box(0);
-
-  known_box.print(nout, "*** test06 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// An empty closed polyhedron in 2D.
-bool
-test07() {
-  C_Polyhedron ph(2, EMPTY);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test07 ph ***");
-  nbox.print(nout, "*** test07 nbox ***");
-  pbox.print(nout, "*** test07 pbox ***");
-
-  BBox known_box(ph.space_dimension());
-  known_box.set_empty();
-
-  known_box.print(nout, "*** test07 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// A bounded polyhedron that is a single point.
-bool
-test08() {
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron ph(2);
-  ph.add_constraint(x == 2);
-  ph.add_constraint(y == 4);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test08 ph ***");
-  nbox.print(nout, "*** test08 nbox ***");
-  pbox.print(nout, "*** test08 pbox ***");
-
-  BBox known_box(2);
-  known_box.raise_lower_bound(0, true, 2, 1);
-  known_box.lower_upper_bound(0, true, 2, 1);
-  known_box.raise_lower_bound(1, true, 4, 1);
-  known_box.lower_upper_bound(1, true, 4, 1);
-
-  known_box.print(nout, "*** test08 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// A unit square closed polyhedron.
-bool
-test09() {
-  Variable x(0);
-  Variable y(1);
-
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  cs.insert(x <= 1);
-  cs.insert(y >= 0);
-  cs.insert(y <= 1);
-
-  C_Polyhedron ph(cs);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test09 ph ***");
-  nbox.print(nout, "*** test09 nbox ***");
-  pbox.print(nout, "*** test09 pbox ***");
-
-  BBox known_box(2);
-  known_box.raise_lower_bound(0, true, 0, 1);
-  known_box.lower_upper_bound(0, true, 1, 1);
-  known_box.raise_lower_bound(1, true, 0, 1);
-  known_box.lower_upper_bound(1, true, 1, 1);
-
-  known_box.print(nout, "*** test09 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// A bounded rectangular closed polyhedron;
-bool
-test10() {
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron ph(2);
-  ph.generators();
-  ph.add_constraint(x >= 1);
-  ph.add_constraint(x <= 3);
-  ph.add_constraint(y <= 3);
-  ph.add_constraint(y >= 1);
-
-  print_constraints(ph, "*** test10 ph ***");
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  nbox.print(nout, "*** test10 nbox ***");
-  pbox.print(nout, "*** test10 pbox ***");
-
-  BBox known_box(2);
-  known_box.raise_lower_bound(0, true, 1, 1);
-  known_box.lower_upper_bound(0, true, 3, 1);
-  known_box.raise_lower_bound(1, true, 1, 1);
-  known_box.lower_upper_bound(1, true, 3, 1);
-
-  known_box.print(nout, "*** test10 known_box ***");
-
-  return nbox == known_box && pbox == known_box;
-}
-
-// A bounded polyhedron having redundant constraints.
-bool
-test11() {
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron ph(2);
-  ph.add_constraint(x == 3);
-  ph.add_constraint(y == 1);
-  ph.add_constraint(x + y == 4);
-  ph.add_constraint(x - y == 2);
-  ph.add_constraint(3*x + y == 10);
-  ph.add_constraint(x >= 0);
-  ph.add_constraint(y <= 5);
-  ph.add_constraint(x + 2*y >= 5);
-
-  print_constraints(ph, "*** test11 ph ***");
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  pbox.print(nout, "*** test11 pbox ***");
-
-  BBox known_box(2);
-  known_box.raise_lower_bound(0, true, 3, 1);
-  known_box.lower_upper_bound(0, true, 3, 1);
-  known_box.raise_lower_bound(1, true, 1, 1);
-  known_box.lower_upper_bound(1, true, 1, 1);
-
-  known_box.print(nout, "*** test11 known_box ***");
-
-  return pbox == known_box;
-}
-
-// The box is the xy plane.
-bool
-test12() {
-  Bounding_Box box(2);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  C_Polyhedron known_ph(box.space_dimension());
-
-  print_generators(ph, "*** test12 ph ***");
-  print_generators(known_ph, "*** test12 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// This box is the closed +ve quadrant.
-bool
-test13() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.raise_lower_bound(1, true, 0, 1);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(x >= 0);
-  known_ph.add_constraint(y >= 0);
-
-  print_generators(ph, "*** test13 ph ***");
-  print_generators(known_ph, "*** test13 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// A bounded box in 2D.
-bool
-test14() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, -2, 3);
-  box.lower_upper_bound(0, true, 4, 1);
-  box.raise_lower_bound(1, true, -10, 1);
-  box.lower_upper_bound(1, true, 12, 3);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(3*x >= -2);
-  known_ph.add_constraint(x <= 4);
-  known_ph.add_constraint(y <= 4);
-  known_ph.add_constraint(y >= -10);
-
-  print_generators(ph, "*** test14 ph ***");
-  print_generators(known_ph, "*** test14 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// An unbounded closed box in 4D but bounded in 2D.
-bool
-test15() {
-  Bounding_Box box(4);
-  box.raise_lower_bound(1, true, -2, 3);
-  box.lower_upper_bound(1, true, 4, 1);
-  box.raise_lower_bound(2, true, -10, 1);
-  box.lower_upper_bound(2, true, 12, 3);
-  box.raise_lower_bound(3, true, 15, 3);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(1);
-  Variable y(2);
-  Variable z(3);
-
-  C_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(3*x >= -2);
-  known_ph.add_constraint(x <= 4);
-  known_ph.add_constraint(y <= 4);
-  known_ph.add_constraint(y >= -10);
-  known_ph.add_constraint(z >= 5);
-
-  print_generators(ph, "*** test15 ph ***");
-  print_generators(known_ph, "*** test15 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// A zero-dimensional box.
-bool
-test16() {
-  Bounding_Box box(0);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  C_Polyhedron known_ph;
-
-  print_generators(ph, "*** test16 ph ***");
-  print_generators(known_ph, "*** test16 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// An empty closed box in 2D.
-bool
-test17() {
-  Bounding_Box box(2);
-  box.set_empty();
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  print_constraints(ph, "*** test17 ph ***");
-
-  C_Polyhedron known_ph(2, EMPTY);
-
-  print_constraints(known_ph, "*** test17 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// A single point.
-bool
-test18() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 2, 1);
-  box.lower_upper_bound(0, true, 2, 1);
-  box.raise_lower_bound(1, true, 4, 1);
-  box.lower_upper_bound(1, true, 4, 1);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(x == 2);
-  known_ph.add_constraint(y == 4);
-
-  print_generators(ph, "*** test18 ph ***");
-  print_generators(known_ph, "*** test18 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// A closed unit square.
-bool
-test19() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.lower_upper_bound(0, true, 1, 1);
-  box.raise_lower_bound(1, true, 0, 1);
-  box.lower_upper_bound(1, true, 1, 1);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(0);
-  Variable y(1);
-
-  Constraint_System known_cs;
-  known_cs.insert(x >= 0);
-  known_cs.insert(x <= 1);
-  known_cs.insert(y >= 0);
-  known_cs.insert(y <= 1);
-
-  C_Polyhedron known_ph(known_cs);
-
-  print_generators(ph, "*** test19 ph generators ***");
-  print_generators(known_ph, "*** test19 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// Constructs the polyhedron { x >= 0, x <= 1/2, y >= 0 }
-// from the corresponding box.
-bool
-test20() {
-  Bounding_Box box(2);
-  box.raise_lower_bound(0, true, 0, 1);
-  box.lower_upper_bound(0, true, 1, 2);
-  box.raise_lower_bound(1, true, 0, 1);
-
-  C_Polyhedron ph(box, From_Bounding_Box());
-
-  print_generators(ph, "*** test20 ph ***");
-
-  Variable x(0);
-  Variable y(1);
-
-  C_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(x >= 0);
-  known_ph.add_constraint(2*x <= 1);
-  known_ph.add_constraint(y >= 0);
-
-  print_generators(known_ph, "*** test20 known_ph ***");
-
-  return ph == known_ph;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-  DO_TEST(test02);
-  DO_TEST(test03);
-  DO_TEST(test04);
-  DO_TEST(test05);
-  DO_TEST(test06);
-  DO_TEST(test07);
-  DO_TEST(test08);
-  DO_TEST(test09);
-  DO_TEST(test10);
-  DO_TEST(test11);
-  DO_TEST(test12);
-  DO_TEST(test13);
-  DO_TEST(test14);
-  DO_TEST(test15);
-  DO_TEST(test16);
-  DO_TEST(test17);
-  DO_TEST(test18);
-  DO_TEST(test19);
-  DO_TEST(test20);
-END_MAIN
diff --git a/tests/Polyhedron/boundingbox2.cc b/tests/Polyhedron/boundingbox2.cc
deleted file mode 100644
index 2fe0ded..0000000
--- a/tests/Polyhedron/boundingbox2.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Test Polyhedron::shrink_bounding_box().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-#include "BBox.hh"
-
-namespace {
-
-bool
-test01() {
-  C_Polyhedron ph(1, EMPTY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** ph ***");
-  nbox.print(nout, "*** nbox ***");
-
-  BBox known_box(ph.space_dimension());
-  known_box.set_empty();
-
-  known_box.print(nout, "*** known_box ***");
-
-  return nbox == known_box;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-END_MAIN
diff --git a/tests/Polyhedron/boundingbox3.cc b/tests/Polyhedron/boundingbox3.cc
deleted file mode 100644
index a43bcf3..0000000
--- a/tests/Polyhedron/boundingbox3.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/* Test NNC_Polyhedron::shrink_bounding_box().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-#include "BBox.hh"
-
-namespace {
-
-// An unbounded NNC polyhedron in 4D but bounded in 2D
-// with strict inequality and closure points at the lower bound.
-bool
-test01() {
-  Variable x(1);
-  Variable y(2);
-  Variable z(3);
-
-  NNC_Polyhedron ph(4);
-  ph.add_constraint(3 * x + y > 2);
-  ph.add_constraint(x <= 4);
-  ph.add_constraint(y <= 4);
-  ph.add_constraint(z >= 5);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test01 ph ***");
-  nbox.print(nout, "*** test01 nbox ***");
-  pbox.print(nout, "*** test01 pbox ***");
-
-  BBox known_nbox(4);
-  known_nbox.raise_lower_bound(1, false, -2, 3);
-  known_nbox.lower_upper_bound(1, true, 4, 1);
-  known_nbox.raise_lower_bound(2, false, -10, 1);
-  known_nbox.lower_upper_bound(2, true, 4, 1);
-  known_nbox.raise_lower_bound(3, true, 5, 1);
-
-  BBox known_pbox(4);
-  known_pbox.lower_upper_bound(1, true, 4, 1);
-  known_pbox.lower_upper_bound(2, true, 4, 1);
-  known_pbox.raise_lower_bound(3, true, 5, 1);
-
-  known_nbox.print(nout, "*** test9 known_nbox ***");
-  known_pbox.print(nout, "*** test9 known_pbox ***");
-
-  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
-}
-
-// A bounded NNC polyhedron with strict inequalities
-// causing upper and lower bounds of the box to be open.
-bool
-test02() {
-  Variable x(0);
-  Variable y(1);
-
-  NNC_Polyhedron ph(2);
-  ph.add_constraint(3 * x + y >= 2);
-  ph.add_constraint(x < 4);
-  ph.add_constraint(y <= 4);
-
-  BBox pbox(ph.space_dimension());
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  BBox nbox(ph.space_dimension());
-  ph.shrink_bounding_box(nbox);
-
-  print_constraints(ph, "*** test02 ph ***");
-  nbox.print(nout, "*** test02 nbox ***");
-  pbox.print(nout, "*** test02 pbox ***");
-
-  BBox known_nbox(2);
-  known_nbox.raise_lower_bound(0, true, -2, 3);
-  known_nbox.lower_upper_bound(0, false, 4, 1);
-  known_nbox.raise_lower_bound(1, false, -10, 1);
-  known_nbox.lower_upper_bound(1, true, 4, 1);
-
-  BBox known_pbox(2);
-  known_pbox.lower_upper_bound(0, false, 4, 1);
-  known_pbox.lower_upper_bound(1, true, 4, 1);
-
-  known_nbox.print(nout, "*** test02 known_nbox ***");
-  known_pbox.print(nout, "*** test02 known_pbox ***");
-
-  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
-}
-
-// An empty polyhedron in 2D defined using strict constraints.
-bool
-test03() {
-  Variable x(0);
-  Variable y(1);
-  NNC_Polyhedron ph(2);
-  ph.add_constraint(x > 0);
-  ph.add_constraint(x < 0);
-  ph.add_constraint(y > 0);
-  ph.add_constraint(y < 0);
-
-  Bounding_Box pbox(2);
-  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
-
-  Bounding_Box nbox(2);
-  ph.shrink_bounding_box(nbox);
-
-  NNC_Polyhedron known_ph(2, EMPTY);
-  NNC_Polyhedron known_pph(pbox, From_Bounding_Box());
-  NNC_Polyhedron known_nph(nbox, From_Bounding_Box());
-
-  print_generators(ph, "*** test03 ph ***");
-  print_generators(known_pph, "*** test03 known_pph ***");
-  print_generators(known_nph, "*** test03 known_nph ***");
-
-  return ph == known_ph && ph == known_nph && ph == known_ph;
-}
-
-// An unbounded box in 4D but bounded in 2D with strict inequalities.
-bool
-test04() {
-  Bounding_Box box(4);
-  box.raise_lower_bound(1, false, -2, 3);
-  box.lower_upper_bound(1, true, 4, 1);
-  box.raise_lower_bound(2, false, -10, 1);
-  box.lower_upper_bound(2, true, 12, 3);
-  box.raise_lower_bound(3, true, 15, 3);
-
-  NNC_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(1);
-  Variable y(2);
-  Variable z(3);
-
-  NNC_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(3*x > -2);
-  known_ph.add_constraint(x <= 4);
-  known_ph.add_constraint(y <= 4);
-  known_ph.add_constraint(y > -10);
-  known_ph.add_constraint(z >= 5);
-
-  print_generators(ph, "*** test04 ph ***");
-  print_generators(known_ph, "*** test04 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// A bounded NNC polyhedron with strict inequalities
-// causing upper and lower bounds of the box to be open.
-bool
-test05() {
-  Bounding_Box box(4);
-  box.raise_lower_bound(1, true, -2, 3);
-  box.lower_upper_bound(1, false, 4, 1);
-  box.raise_lower_bound(2, false, -10, 1);
-  box.lower_upper_bound(2, true, 12, 3);
-
-  NNC_Polyhedron ph(box, From_Bounding_Box());
-
-  Variable x(1);
-  Variable y(2);
-
-  NNC_Polyhedron known_ph(box.space_dimension());
-  known_ph.add_constraint(3*x >= -2);
-  known_ph.add_constraint(x < 4);
-  known_ph.add_constraint(y <= 4);
-  known_ph.add_constraint(y > -10);
-
-  print_generators(ph, "*** test05 ph ***");
-  print_generators(known_ph, "*** test05 known_ph ***");
-
-  return ph == known_ph;
-}
-
-// An empty box in 2D.
-bool
-test06() {
-  Bounding_Box box(2);
-  box.set_empty();
-
-  NNC_Polyhedron ph(box, From_Bounding_Box());
-
-  print_constraints(ph, "*** test06 ph ***");
-
-  NNC_Polyhedron known_ph(2, EMPTY);
-
-  print_constraints(known_ph, "*** test06 known_ph ***");
-
-  return ph == known_ph;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-  DO_TEST(test02);
-  DO_TEST(test03);
-  DO_TEST(test04);
-  DO_TEST_F8A(test05);
-  DO_TEST(test06);
-END_MAIN
diff --git a/tests/Polyhedron/bounds1.cc b/tests/Polyhedron/bounds1.cc
index bf82834..6f73632 100644
--- a/tests/Polyhedron/bounds1.cc
+++ b/tests/Polyhedron/bounds1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::bounds_from_below() and Polyhedron::bounds_from_above().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/bug2.cc b/tests/Polyhedron/bug2.cc
deleted file mode 100644
index f80e9eb..0000000
--- a/tests/Polyhedron/bug2.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Try to reproduce a strange behavior observed on MacOs X.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-#include <fstream>
-
-using namespace Parma_Polyhedra_Library::IO_Operators;
-
-int
-main() TRY {
-  std::ifstream s(SRCDIR "/bug2.dat");
-  if (!s) {
-    std::cerr << "Cannot open data file!!!" << endl;
-    exit(1);
-  }
-
-  NNC_Polyhedron ph;
-  ph.ascii_load(s);
-
-  const Constraint_System& cs = ph.constraints();
-  unsigned num_constraints = 0;
-  for (Constraint_System::const_iterator i = cs.begin(), cs_end = cs.end();
-       i != cs_end;
-       ++i)
-    ++num_constraints;
-  ph.ascii_dump(nout);
-  const Generator_System& gs = ph.generators();
-  unsigned num_points = 0;
-  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
-       i != gs_end;
-       ++i) {
-    if (i->type() != Generator::POINT) {
-
-      nout << "i->type() == " << i->type() << endl;
-
-      exit(1);
-    }
-    ++num_points;
-  }
-
-  return 0;
-}
-CATCH
diff --git a/tests/Polyhedron/cnncconversion1.cc b/tests/Polyhedron/cnncconversion1.cc
index b64a6a4..c9c33d4 100644
--- a/tests/Polyhedron/cnncconversion1.cc
+++ b/tests/Polyhedron/cnncconversion1.cc
@@ -1,11 +1,11 @@
 /* Test conversions between C_Polyhedron and NNC_Polyhedron.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -94,10 +94,60 @@ test03() {
   return ph2 == known_result;
 }
 
+bool
+test04() {
+
+  C_Polyhedron ph(4, UNIVERSE);
+
+  NNC_Polyhedron nnc_ph(ph, POLYNOMIAL_COMPLEXITY);
+
+  NNC_Polyhedron known_result(4);
+
+  bool ok = (known_result == nnc_ph);
+
+  print_constraints(nnc_ph, "*** nnc_ph ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A - B > 4);
+  cs.insert(-C - D >= 0);
+  cs.insert(A + B - C == 0);
+  cs.insert(-A + B - C < 4);
+  cs.insert(A - B - C + D > 1);
+  NNC_Polyhedron ph(cs);
+
+  C_Polyhedron c_ph(ph, SIMPLEX_COMPLEXITY);
+
+  Constraint_System cs1;
+  cs1.insert(A - B >= 4);
+  cs1.insert(-C - D >= 0);
+  cs1.insert(A + B - C == 0);
+  cs1.insert(-A + B - C <= 4);
+  cs1.insert(A - B - C + D >= 1);
+  C_Polyhedron  known_result(cs1);
+
+  bool ok = (known_result == c_ph);
+
+  print_constraints(c_ph, "*** c_ph ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
   DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
 END_MAIN
diff --git a/tests/Polyhedron/concatenate1.cc b/tests/Polyhedron/concatenate1.cc
index 11714e3..7ca65fc 100644
--- a/tests/Polyhedron/concatenate1.cc
+++ b/tests/Polyhedron/concatenate1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::concatenate_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -68,14 +68,14 @@ test02() {
 
   C_Polyhedron ph(2, EMPTY);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   Constraint_System cs;
   cs.insert(x >= y);
   cs.insert(x >= 2);
   C_Polyhedron qh(cs);
 
-  print_constraints(qh, "--- qh ---");
+  print_constraints(qh, "*** qh ***");
 
   ph.concatenate_assign(qh);
 
@@ -83,7 +83,7 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "--- After concatenate_assign(qh) ---");
+  print_constraints(ph, "*** after concatenate_assign(qh) ***");
 
   return ok;
 }
@@ -95,20 +95,20 @@ test03() {
 
   C_Polyhedron ph;
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   Constraint_System cs;
   cs.insert(x - 3 >= y);
   cs.insert(y >= 0);
   C_Polyhedron qh(cs);
 
-  print_constraints(qh, "--- qh ---");
+  print_constraints(qh, "*** qh ***");
 
   ph.concatenate_assign(qh);
 
   bool ok = (ph == qh);
 
-  print_constraints(ph, "--- After concatenate_assign(qh) ---");
+  print_constraints(ph, "*** after concatenate_assign(qh) ***");
 
   return ok;
 }
@@ -148,7 +148,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After concatenate_assign(ph2) ***");
+  print_constraints(ph1, "*** after concatenate_assign(ph2) ***");
 
   return ok;
 }
@@ -173,7 +173,7 @@ test05() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
 
   return ok;
 }
@@ -202,7 +202,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
 
   return ok;
 }
@@ -232,7 +232,7 @@ test07() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+  print_generators(ph1, "*** after ph1.concatenate_assign(ph2) ***");
 
   return ok;
 }
@@ -264,7 +264,7 @@ test08() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/congruences1.cc b/tests/Polyhedron/congruences1.cc
index 4bc5f07..02965a2 100644
--- a/tests/Polyhedron/congruences1.cc
+++ b/tests/Polyhedron/congruences1.cc
@@ -1,11 +1,11 @@
 /* Test C_Polyhedron(Congruence_System&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,12 +24,266 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace {
 
-bool test01() {
+// Empty polyhedron.
+bool
+test01() {
+  C_Polyhedron ph1(7, EMPTY);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Universe polyhedron.
+bool
+test02() {
+  C_Polyhedron ph1(7);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(7);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty polyhedron.
+bool
+test03() {
+  C_Polyhedron ph1(0, EMPTY);
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron known_ph(Congruence_System::zero_dim_empty());
+
+  bool ok = (ph1 == known_ph);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe polyhedron.
+bool
+test04() {
+  C_Polyhedron ph1(0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(0);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+  ph2.add_constraint(A + B >= 3);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D with implied equality.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A + B <= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Empty polyhedron.
+bool
+test07() {
+  C_Polyhedron ph1(7, EMPTY);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Universe polyhedron.
+bool
+test08() {
+  C_Polyhedron ph1(7);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(7);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty polyhedron.
+bool
+test09() {
+  C_Polyhedron ph1(0, EMPTY);
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron known_ph(Congruence_System::zero_dim_empty());
+
+  bool ok = (ph1 == known_ph);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe polyhedron.
+bool
+test10() {
+  C_Polyhedron ph1(0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(0);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+  ph2.add_constraint(A + B >= 3);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D with implied equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A + B <= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+bool test13() {
   Variable x(0);
   Variable y(1);
 
   Congruence_System cgs;
-  cgs.insert(x %= 3);
+  cgs.insert(0*x %= 3);
   cgs.insert(y == 3);
 
   C_Polyhedron ph(cgs);
@@ -41,7 +295,50 @@ bool test01() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After add_congruences ***");
+  print_constraints(ph, "*** after add_congruences ***");
+
+  return ok;
+}
+
+bool test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Congruence_System cgs;
+  cgs.insert((2*y %= 2) / 3);
+
+  Constraint_System cs(cgs);
+  print_constraints(cs, "*** cs ***");
+
+  cs.insert(0*x > -1);
+  print_constraints(cs, "*** cs.insert(0*x > -1) ***");
+
+  C_Polyhedron ph(cs);
+
+  bool ok = ph.is_universe();
+
+  print_constraints(ph, "*** ph(cs) ***");
+
+  return ok;
+}
+
+// A similar test to the previous test but with 0 dimensions.
+bool test15() {
+  Variable x(0);
+
+  Congruence_System cgs;
+
+  Constraint_System cs(cgs);
+  print_constraints(cs, "*** cs ***");
+
+  cs.insert(0*x > -1);
+  print_constraints(cs, "*** cs.insert(0*x > -1) ***");
+
+  C_Polyhedron ph(cs);
+
+  bool ok = ph.is_universe();
+
+  print_constraints(ph, "*** ph(cs) ***");
 
   return ok;
 }
@@ -49,5 +346,19 @@ bool test01() {
 } // namespace
 
 BEGIN_MAIN
-DO_TEST(test01);
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
 END_MAIN
diff --git a/tests/Polyhedron/constrains1.cc b/tests/Polyhedron/constrains1.cc
new file mode 100644
index 0000000..72ee015
--- /dev/null
+++ b/tests/Polyhedron/constrains1.cc
@@ -0,0 +1,232 @@
+/* Test Polyhedron::constrains().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)		\
+  if (!pred) {					\
+    nout << "!" #pred << endl;			\
+    ok = false;					\
+  }
+
+#define TEST_PREDICATE_FALSE(pred)		\
+  if (pred) {					\
+    nout << #pred << endl;			\
+    ok = false;					\
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  ph.add_generator(point());
+  ph.add_generator(line(A+B));
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  ph.add_generator(line(A-B));
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  ph.add_constraint(A <= B);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+  TEST_PREDICATE_TRUE(ph.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph(0);
+  ph.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) ph.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.generators();
+  ph.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point());
+  ph.constraints();
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(-A));
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint_and_minimize(A >= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(B >= A);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= B+1);
+  ph.add_constraint(A <= B);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(C));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= B);
+  ph.add_generator(point());
+  ph.generators();
+  ph.add_constraint(A <= B-1);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(C));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/constraints1.cc b/tests/Polyhedron/constraints1.cc
index 7254483..00a3fe0 100644
--- a/tests/Polyhedron/constraints1.cc
+++ b/tests/Polyhedron/constraints1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::constraints().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -31,7 +31,7 @@ test01() {
   C_Polyhedron ph1(2);
   ph1.add_constraint(0*A == 1);
 
-  print_constraints(ph1, "*** ph constraints ***");
+  print_constraints(ph1, "*** ph1 constraints ***");
 
   C_Polyhedron known_result = ph1;
 
diff --git a/tests/Polyhedron/contains1.cc b/tests/Polyhedron/contains1.cc
index e8768e1..c78363c 100644
--- a/tests/Polyhedron/contains1.cc
+++ b/tests/Polyhedron/contains1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::contains(const Polyhedron&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/contains2.cc b/tests/Polyhedron/contains2.cc
index ed2cd3d..21cd1b9 100644
--- a/tests/Polyhedron/contains2.cc
+++ b/tests/Polyhedron/contains2.cc
@@ -1,11 +1,11 @@
 /* Test NNC_Polyhedron::contains(const Polyhedron&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/containsintegerpoint1.cc b/tests/Polyhedron/containsintegerpoint1.cc
new file mode 100644
index 0000000..cc900a1
--- /dev/null
+++ b/tests/Polyhedron/containsintegerpoint1.cc
@@ -0,0 +1,127 @@
+/* Test C_Polyhedron::contains_integer_point().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y - 3*z <= 2);
+  cs.insert(8*z - 8*y >= 7);
+
+  C_Polyhedron ph(3);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(3*x - 3*y >= 1);
+  cs.insert(3*x - 3*y <= 2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(3*x + 3*y >= 13);
+  cs.insert(3*x + 3*y < 15);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+//   DO_TEST(test01);
+//   DO_TEST(test02);
+//   DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint1.cc b/tests/Polyhedron/disjoint1.cc
index ad2ce3b..66c0b49 100644
--- a/tests/Polyhedron/disjoint1.cc
+++ b/tests/Polyhedron/disjoint1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/disjoint2.cc b/tests/Polyhedron/disjoint2.cc
index a877ea7..0c7759f 100644
--- a/tests/Polyhedron/disjoint2.cc
+++ b/tests/Polyhedron/disjoint2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/dualhypercubes.cc b/tests/Polyhedron/dualhypercubes.cc
index 8904361..42fb42a 100644
--- a/tests/Polyhedron/dualhypercubes.cc
+++ b/tests/Polyhedron/dualhypercubes.cc
@@ -1,11 +1,11 @@
 /* Exploit smf when computing the intersection of NNC dual hypercubes.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,7 +23,13 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "ppl_test.hh"
 #include "timings.hh"
 #include <vector>
+#include <map>
 
+// Define EXP_EVAL to 1 if you want to reproduce the results
+// of the experimental evaluation reported in Table 2 of the paper:
+//   R. Bagnara, P.M. Hill, E. Zaffanella
+//   Not Necessarily Closed Convex Polyhedra and the Double Description Method.
+//   Formal Aspects of Computing, 17, 2 (2005), pp. 222-257.
 #ifndef EXP_EVAL
 #define EXP_EVAL 0
 #endif
@@ -107,7 +113,7 @@ NNC_dual_hypercube(const dimension_type dims,
 
 void
 build_polyhedra(const dimension_type dims,
-		const int perc,
+		const int percentage,
 		std::vector<NNC_Polyhedron>& ph) {
 
   Linear_Expression weight_center;
@@ -116,13 +122,13 @@ build_polyhedra(const dimension_type dims,
   weight_center = Linear_Expression(0);
   for (dimension_type axis = dims; axis-- > 0; )
     weight_center += Variable(axis);
-  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, perc));
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, percentage));
 
   // 2nd-polyhedron.
   weight_center = Linear_Expression(0);
   for (dimension_type axis = dims; axis-- > 0; )
     weight_center += 2*Variable(axis);
-  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, perc));
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, percentage));
 
   // 3rd-polyhedron.
   weight_center = Linear_Expression(0);
@@ -131,7 +137,7 @@ build_polyhedra(const dimension_type dims,
       weight_center += 10*Variable(axis);
     else
       weight_center += 2*Variable(axis);
-  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, perc));
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, percentage));
 
   // 4th-polyhedron.
   weight_center = Linear_Expression(0);
@@ -140,10 +146,10 @@ build_polyhedra(const dimension_type dims,
       weight_center += 10*Variable(axis);
     else
       weight_center += Variable(axis);
-  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, perc));
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, percentage));
 }
 
-void
+long
 computation(std::vector<NNC_Polyhedron>& ph, bool enhanced) {
   nout << endl;
   if (enhanced)
@@ -152,100 +158,149 @@ computation(std::vector<NNC_Polyhedron>& ph, bool enhanced) {
     nout << "Standard computation: ";
   nout << "working with 4 NNC dual hypercubes of dimension "
        << ph[0].space_dimension() << endl;
-  start_clock();
-
-  // Compute the intersection of ph[0] and ph[1].
-
-  // Print dimensions of arguments
-  // (being careful to override library laziness).
-  vnout << "Computing intersection of ph[0] and ph[1]:" << endl;
-  vnout << "===  ph[0] generators ===" << endl;
-  ph[0].generators().ascii_dump(vnout);
-  vnout << "===  ph[1] generators ===" << endl;
-  ph[1].generators().ascii_dump(vnout);
 
-  if (enhanced) {
-    ph[0].minimized_constraints();
-    ph[1].minimized_constraints();
+  start_clock();
 
-    // Print dimensions of arguments.
-    vnout << "After the computation of smf for constraints" << endl;
-  }
+  /**** Compute the intersection of ph[0] and ph[1]. ****/
+
+  // Print cardinalities of arguments.
+  nout << "  - Computing intersection of ph[0] and ph[1]:" << endl;
+  const Generator_System& gs_0 = ph[0].generators();
+  nout << "    # ph[0].generators() = "
+       << std::distance(gs_0.begin(), gs_0.end()) << endl;
+  const Generator_System& gs_1 = ph[1].generators();
+  nout << "    # ph[1].generators() = "
+       << std::distance(gs_1.begin(), gs_1.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[0] generators ***" << endl;
+  gs_0.ascii_dump(vnout);
+  vnout << "*** ph[1] generators ***" << endl;
+  gs_1.ascii_dump(vnout);
+  vnout << endl;
 
-  vnout << "===  ph[0] constraints ===" << endl;
-  ph[0].constraints().ascii_dump(vnout);
-  vnout << "===  ph[1] constraints ===" << endl;
-  ph[1].constraints().ascii_dump(vnout);
+  const Constraint_System& cs_0 = enhanced
+    ? ph[0].minimized_constraints()
+    : ph[0].constraints();
+  const Constraint_System& cs_1 = enhanced
+    ? ph[1].minimized_constraints()
+    : ph[1].constraints();
+
+  // Print cardinalities of constraint systems.
+  nout << "    # ph[0].constraints() = "
+       << std::distance(cs_0.begin(), cs_0.end()) << endl;
+  nout << "    # ph[1].constraints() = "
+       << std::distance(cs_1.begin(), cs_1.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[0] constraints ***" << endl;
+  cs_0.ascii_dump(vnout);
+  vnout << "*** ph[1] constraints ***" << endl;
+  cs_1.ascii_dump(vnout);
   vnout << endl;
 
   ph[0].intersection_assign(ph[1]);
 
-  // Compute the intersection of ph[2] and ph[3].
-
-  // Print dimensions of arguments
-  // (being careful to override library laziness).
-  vnout << "Computing intersection of ph[2] and ph[3]:" << endl;
-  vnout << "===  ph[2] generators ===" << endl;
-  ph[2].generators().ascii_dump(vnout);
-  vnout << "===  ph[3] generators ===" << endl;
-  ph[3].generators().ascii_dump(vnout);
-
-  if (enhanced) {
-    ph[2].minimized_constraints();
-    ph[3].minimized_constraints();
+  /**** Compute the intersection of ph[2] and ph[3]. ****/
+
+  // Print cardinalities of arguments.
+  nout << "  - Computing intersection of ph[2] and ph[3]:" << endl;
+  const Generator_System& gs_2 = ph[2].generators();
+  nout << "    # ph[2].generators() = "
+       << std::distance(gs_2.begin(), gs_2.end()) << endl;
+  const Generator_System& gs_3 = ph[3].generators();
+  nout << "    # ph[3].generators() = "
+       << std::distance(gs_3.begin(), gs_3.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[2] generators ***" << endl;
+  gs_2.ascii_dump(vnout);
+  vnout << "*** ph[3] generators ***" << endl;
+  gs_3.ascii_dump(vnout);
+  vnout << endl;
 
-    // Print dimensions of arguments.
-    vnout << "After the computation of smf for constraints" << endl;
-  }
-  vnout << "===  ph[2] constraints ===" << endl;
-  ph[2].constraints().ascii_dump(vnout);
-  vnout << "===  ph[3] constraints ===" << endl;
-  ph[3].constraints().ascii_dump(vnout);
+  const Constraint_System& cs_2 = enhanced
+    ? ph[2].minimized_constraints()
+    : ph[2].constraints();
+  const Constraint_System& cs_3 = enhanced
+    ? ph[3].minimized_constraints()
+    : ph[3].constraints();
+
+  // Print cardinalities of constraint systems.
+  nout << "    # ph[2].constraints() = "
+       << std::distance(cs_2.begin(), cs_2.end()) << endl;
+  nout << "    # ph[3].constraints() = "
+       << std::distance(cs_3.begin(), cs_3.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[2] constraints ***" << endl;
+  cs_2.ascii_dump(vnout);
+  vnout << "*** ph[3] constraints ***" << endl;
+  cs_3.ascii_dump(vnout);
   vnout << endl;
 
   ph[2].intersection_assign(ph[3]);
 
-  // Compute the poly-hull of ph[0] and ph[2].
-  vnout << "Computing poly-hull of ph[0] and ph[2]:" << endl;
-  if (enhanced) {
-    ph[0].minimized_generators();
-    ph[2].minimized_generators();
-
-    // Print dimensions of arguments.
-    vnout << "After the computation of smf for generators" << endl;
-  }
-
-  // Print dimensions of arguments
-  // (being careful to override library laziness).
-  vnout << "===  ph[0] generators ===" << endl;
-  ph[0].generators().ascii_dump(vnout);
-  vnout << "===  ph[2] generators ===" << endl;
-  ph[2].generators().ascii_dump(vnout);
+  /**** Compute the poly-hull of ph[0] and ph[2]. ****/
+
+  const Generator_System& gs_01 = enhanced
+    ? ph[0].minimized_generators()
+    : ph[0].generators();
+  const Generator_System& gs_23 = enhanced
+    ? ph[2].minimized_generators()
+    : ph[2].generators();
+
+  // Print cardinalities of arguments.
+  nout << "  - Computing poly-hull of ph[0] and ph[2]:" << endl;
+  nout << "    # ph[0].generators() = "
+       << std::distance(gs_01.begin(), gs_01.end()) << endl;
+  nout << "    # ph[2].generators() = "
+       << std::distance(gs_23.begin(), gs_23.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[0] generators ***" << endl;
+  gs_01.ascii_dump(vnout);
+  vnout << "*** ph[2] generators ***" << endl;
+  gs_23.ascii_dump(vnout);
   vnout << endl;
 
   ph[0].poly_hull_assign(ph[2]);
-  ph[0].constraints();
+
+  /**** Final conversion ****/
+
+  const Constraint_System& cs = ph[0].constraints();
 
   nout << "Wmf final result timing: ";
   print_clock(nout);
   nout << endl;
 
-  // How many constraints and generators obtained?
-  vnout << "Final result (wmf)" << endl;
-  vnout << "===  ph[0] constraints ===" << endl;
-  ph[0].constraints().ascii_dump(vnout);
+  // How many constraints obtained?
+  const long cs_cardinality = std::distance(cs.begin(), cs.end());
+
+  // Print cardinality of weakly-minimized final result.
+  nout << "  - Final (wmf) result is ph[0]:" << endl;
+  nout << "    # ph[0].constraints() = " << cs_cardinality << endl;
+  // Very noisy dump of weakly-minimized final result.
+  vnout << "*** ph[0] constraints ***" << endl;
+  cs.ascii_dump(vnout);
   vnout << endl;
 
+  /**** Final strong minimization ****/
+
   nout << "Smf (cons) final result timing: ";
   start_clock();
-  ph[0].minimized_constraints();
+  const Constraint_System& min_cs = ph[0].minimized_constraints();
   print_clock(nout);
   nout << endl;
 
-  // How many constraints and generators obtained?
-  vnout << "Final result (smf cons)" << endl;
-  vnout << "===  ph[0] constraints ===" << endl;
-  ph[0].constraints().ascii_dump(vnout);
+  // How many constraints obtained?
+  const long min_cs_cardinality = std::distance(min_cs.begin(), min_cs.end());
+
+  // Print cardinality of strongly-minimized final result.
+  nout << "  - Final (smf) result is ph[0]:" << endl;
+  nout << "    # ph[0].minimized_constraints() = "
+       << min_cs_cardinality << endl;
+  // Very noisy dump of strongly-minimized final result.
+  vnout << "*** ph[0] minimized constraints ***" << endl;
+  min_cs.ascii_dump(vnout);
+  vnout << endl;
+
+  return enhanced ? min_cs_cardinality : cs_cardinality;
 }
 
 bool
@@ -260,31 +315,77 @@ test01() {
   dimension_type last_dim = 4;
 #endif
 
+  // Storing cardinalities of known results.
+  // NOTE: the numbers reported here differ a little bit from those
+  // in the FAC paper in that here we do not count low-level constraints
+  // related to the epsilon dimension. The difference is at most 2
+  // (the eps_geq_zero and eps_leq_one constraints).
+  typedef std::map<std::pair<dimension_type, int>, long> My_Map;
+  My_Map::const_iterator known_result;
+  My_Map standard_cardinalities;
+  My_Map enhanced_cardinalities;
+
+  using std::make_pair;
+
+  standard_cardinalities[make_pair(4, 25)] = 331;  // FAC  332
+  enhanced_cardinalities[make_pair(4, 25)] =  31;  // FAC   33
+
+  standard_cardinalities[make_pair(4, 50)] = 519;  // FAC  520
+  enhanced_cardinalities[make_pair(4, 50)] =  41;  // FAC   43
+
+  standard_cardinalities[make_pair(5, 25)] = 2692; // FAC 2693
+  enhanced_cardinalities[make_pair(5, 25)] =  125; // FAC  127
+
+  standard_cardinalities[make_pair(5, 50)] = 4993; // FAC 4994
+  enhanced_cardinalities[make_pair(5, 50)] =  150; // FAC  152
+
+  int num_errors = 0;
+
   for (dimension_type dims = first_dim; dims <= last_dim; dims++)
-    for (int perc = 25; perc <= 50; perc += 25) {
+    for (int percentage = 25; percentage <= 50; percentage += 25) {
 
       nout << endl
-	   << "++++++++ DIM = " << dims << "  ++++++++"
+	   << "++++++++ DIMENSIONS = " << dims << "  ++++++++"
 	   << endl
-	   << "++++++++ PERC = " << perc << " ++++++++"
+	   << "++++++++ PERCENTAGE = " << percentage << " ++++++++"
 	   << endl;
 
       // Standard evaluation strategy.
       ph.clear();
-      build_polyhedra(dims, perc, ph);
-      computation(ph, false);
+      build_polyhedra(dims, percentage, ph);
+      const long standard_eval_card = computation(ph, false);
+
+      // Check if there is a known result.
+      known_result = standard_cardinalities.find(make_pair(dims, percentage));
+      if (known_result != standard_cardinalities.end()
+	  && known_result->second != standard_eval_card) {
+	++num_errors;
+	nout << "Cardinality mismatch: "
+	     << "expected " << known_result->second << ", "
+	     << "obtained " << standard_eval_card << ".\n";
+      }
 
       // Enhanced evaluation strategy.
       ph.clear();
-      build_polyhedra(dims, perc, ph);
-      computation(ph, true);
+      build_polyhedra(dims, percentage, ph);
+      const long enhanced_eval_card = computation(ph, true);
+
+      // Check if there is a known result.
+      known_result = enhanced_cardinalities.find(make_pair(dims, percentage));
+      if (known_result != enhanced_cardinalities.end()
+	  && known_result->second != enhanced_eval_card) {
+	++num_errors;
+	nout << "Cardinality mismatch: "
+	     << "expected " << known_result->second << ", "
+	     << "obtained " << enhanced_eval_card <<".\n";
+      }
+
     }
-  // FIXME: check the cardinalities of the results obtained.
-  return true;
+  return (num_errors == 0);
 }
 
 } // namespace
 
 BEGIN_MAIN
-  DO_TEST_F64(test01);
+  DO_TEST_F64A(test01);
 END_MAIN
diff --git a/tests/Polyhedron/empty1.cc b/tests/Polyhedron/empty1.cc
index 9491ab5..923e38a 100644
--- a/tests/Polyhedron/empty1.cc
+++ b/tests/Polyhedron/empty1.cc
@@ -1,11 +1,11 @@
 /* Different ways of creating an empty polyhedron.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/equals1.cc b/tests/Polyhedron/equals1.cc
index 66fca88..ad94a5c 100644
--- a/tests/Polyhedron/equals1.cc
+++ b/tests/Polyhedron/equals1.cc
@@ -1,11 +1,11 @@
 /* Test operator==(const Polyhedron&, const Polyhedron&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/exceptions1.cc b/tests/Polyhedron/exceptions1.cc
index 4544c64..c9d3302 100644
--- a/tests/Polyhedron/exceptions1.cc
+++ b/tests/Polyhedron/exceptions1.cc
@@ -1,11 +1,11 @@
 /* Test that the right exceptions are thrown in case of incorrect uses.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,12 +22,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-using std::invalid_argument;
-
 namespace {
 
-void
-error1() {
+bool
+test01() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -38,22 +36,18 @@ error1() {
     // it is illegal to build a point with the denominator
     // equal to zero.
     gs.insert(point(x + y + z, 0));
-
-    // It is an error if the exception is not thrown.
-    exit(1);
   }
-
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error2() {
+bool
+test02() {
   Variable x(0);
   Variable y(1);
 
@@ -70,18 +64,19 @@ error2() {
     // zero.
     Coefficient d = 0;
     ph.affine_image(x, coeff1, d);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
- catch (...) {
-    exit(1);
+  catch (...) {
   }
+  return false;
 }
 
-void
-error3() {
+
+bool
+test03() {
   Variable x(0);
   Variable y(1);
 
@@ -94,18 +89,18 @@ error3() {
     // C_Polyhedron::poly_hull_assign(p): it is illegal to use
     // it with two polyhedra of different dimensions.
     ph1.poly_hull_assign_and_minimize(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error4() {
+bool
+test04() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -119,18 +114,18 @@ error4() {
     // polyhedron starting from a system of generators that does not
     // contain a point.
     C_Polyhedron ph(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error5() {
+bool
+test05() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -152,18 +147,18 @@ error5() {
     // This variable is now beyond the space dimension,
     // so that a dimension-incompatibility exception is obtained.
     ph.remove_space_dimensions(to_be_removed);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error6() {
+bool
+test06() {
   Variable x(0);
   Variable y(1);
 
@@ -176,18 +171,18 @@ error6() {
     // apply this function to a variable that is not in the space of
     // the polyhedron.
     ph.affine_image(y, x + 1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error7() {
+bool
+test07() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -202,18 +197,18 @@ error7() {
     // use a variable in the expression that does not appear in the
     // space of the polyhedron.
     ph.affine_image(y, x + z + 1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error8() {
+bool
+test08() {
   Variable x(0);
   Variable y(1);
 
@@ -227,18 +222,18 @@ error8() {
     // equal to zero.
     Coefficient d = 0;
     ph.affine_preimage(x, coeff, d);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error9() {
+bool
+test09() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -255,18 +250,18 @@ error9() {
     // the transformation to a variable that is not in the space
     // of the polyhedron.
     ph.affine_preimage(z, x + 1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error10() {
+bool
+test10() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -283,18 +278,18 @@ error10() {
     // apply to a polyhedron an expression that contains a variable that
     // is not in the space of the polyhedron.
     ph.affine_preimage(y, x + z + 1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
-  }
+    return true;
+ }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error11() {
+bool
+test11() {
   Variable x(0);
   Variable y(1);
 
@@ -308,18 +303,18 @@ error11() {
     // C_Polyhedron::intersection_assign_and_minimize(ph2): it is illegal
     // to apply this function to two polyhedra of different dimensions.
     ph1.intersection_assign_and_minimize(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error12() {
+bool
+test12() {
   C_Polyhedron ph1(7);
 
   C_Polyhedron ph2(15);
@@ -329,18 +324,18 @@ error12() {
     // C_Polyhedron::intersection_assign(ph2): it is illegal to apply
     // this function to two polyhedron of different dimensions.
     ph1.intersection_assign(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error13() {
+bool
+test13() {
   Variable w(4);
 
   C_Polyhedron ph(2, EMPTY);
@@ -353,18 +348,18 @@ error13() {
     Generator_System gs;
     gs.insert(point(w));
     ph.add_generators_and_minimize(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error14() {
+bool
+test14() {
   C_Polyhedron ph(5);
 
   try {
@@ -372,18 +367,18 @@ error14() {
     // C_Polyhedron::remove_higher_space_dimensions(n): it is illegal to
     // erase a variable that is not in the space of the polyhedron.
     ph.remove_higher_space_dimensions(7);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error15() {
+bool
+test15() {
   Variable x(0);
   Variable y(1);
 
@@ -397,18 +392,18 @@ error15() {
     Constraint_System cs;
     cs.insert(x - y >= 0);
     ph.add_constraints_and_minimize(cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error16() {
+bool
+test16() {
   Variable y(1);
 
   C_Polyhedron ph(1);
@@ -419,18 +414,18 @@ error16() {
     // constraints that contains a variable that is not in the space
     // of the polyhedron.
     ph.add_constraint(y >= 0);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error17() {
+bool
+test17() {
   Variable x(0);
   Variable y(1);
 
@@ -444,18 +439,18 @@ error17() {
     Constraint_System cs;
     cs.insert(x - y == 0);
     ph.add_constraints(cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error18() {
+bool
+test18() {
   Variable x(0);
   Variable y(1);
 
@@ -476,18 +471,18 @@ error18() {
     // C_Polyhedron::poly_hull_assign(ph2): it is illegal to apply
     // this function to two polyhedra with different dimensions.
     ph1.poly_hull_assign(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error19() {
+bool
+test19() {
   Variable x(0);
   Variable y(1);
 
@@ -498,18 +493,18 @@ error19() {
     // it is illegal to insert a generator that is dimensional
     // incompatible with the polyhedron.
     ph.add_generator(point(x + y));
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error20() {
+bool
+test20() {
   Variable x(0);
   Variable y(1);
 
@@ -524,18 +519,18 @@ error20() {
     gs.insert(point());
     gs.insert(line(x + y));
     ph.add_generators(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error21() {
+bool
+test21() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -551,18 +546,18 @@ error21() {
     // incompatible with the polyhedron.
     Constraint c(z >= 0);
     ph.relation_with(c);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
-  }
+    return true;
+}
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error22() {
+bool
+test22() {
   Variable z(2);
 
   C_Polyhedron ph(2);
@@ -574,18 +569,18 @@ error22() {
     // the polyhedron.
     Generator g(point(z));
     ph.relation_with(g);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error23() {
+bool
+test23() {
   C_Polyhedron ph1(5);
   C_Polyhedron ph2(10);
 
@@ -595,18 +590,18 @@ error23() {
     // this function to two polyhedra that are not dimensional
     // compatible.
     ph2.H79_widening_assign(ph1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error24() {
+bool
+test24() {
   Variable y(1);
 
   C_Polyhedron ph1(1);
@@ -621,18 +616,18 @@ error24() {
     // illegal to apply this function to two polyhedra that are not
     // dimension-compatible.
     ph2.limited_H79_extrapolation_assign(ph1, cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error25() {
+bool
+test25() {
   Variable x(0);
   Variable y(1);
   Variable z(2);
@@ -656,18 +651,18 @@ error25() {
     // illegal to apply this function to a system of constraints that
     // is not dimension-compatible with the two polyhedra.
     ph2.limited_H79_extrapolation_assign(ph1, cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error26() {
+bool
+test26() {
   Variable x(0);
   Variable y(1);
 
@@ -682,18 +677,18 @@ error26() {
     // illegal to apply this method to two polyhedra that are not
     // dimension-compatible.
     ph1.contains(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error27() {
+bool
+test27() {
   Variable x(0);
 
   C_Polyhedron ph(2, EMPTY);
@@ -705,18 +700,18 @@ error27() {
     // polyhedron.
     Generator g(ray(x));
     ph.add_generator(g);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error28() {
+bool
+test28() {
   Variable x(0);
   Variable y(1);
 
@@ -730,18 +725,18 @@ error28() {
     gs.insert(ray(x + y));
     gs.insert(ray(x - y));
     ph.add_generators(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error29() {
+bool
+test29() {
   Variable x(0);
   Variable y(1);
 
@@ -756,18 +751,18 @@ error29() {
     gs.insert(line(x));
     gs.insert(line(y));
     ph.add_generators_and_minimize(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error30() {
+bool
+test30() {
 
   C_Polyhedron ph1(3);
   C_Polyhedron ph2(5);
@@ -777,18 +772,18 @@ error30() {
     // C_Polyhedron::poly_difference_assign(ph2): it is impossible to apply
     // this function to two polyhedra of different dimensions.
     ph1.poly_difference_assign(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error31() {
+bool
+test31() {
   C_Polyhedron ph1(3);
   C_Polyhedron ph2(8);
 
@@ -797,18 +792,18 @@ error31() {
     // C_Polyhedron::time_elapse_assign(p): it is illegal to use
     // it with two polyhedra of different dimensions.
     ph1.time_elapse_assign(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error32() {
+bool
+test32() {
   Variable A(0);
   Variable B(1);
 
@@ -826,18 +821,18 @@ error32() {
     // closed polyhedron starting from a constant system of
     // generators that does not contain points.
     C_Polyhedron ph2(gs2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error33() {
+bool
+test33() {
   Variable A(0);
 
   C_Polyhedron ph1(2, EMPTY);
@@ -849,18 +844,18 @@ error33() {
     // `add_generator(g)': it is illegal to add a
     // ray to an empty polyhedron.
     ph1.add_generator(ray(A));
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error34() {
+bool
+test34() {
   Variable A(0);
   Variable B(1);
 
@@ -874,18 +869,18 @@ error34() {
     // use a variable in the expression that does not appear in the
     // space of the polyhedron.
     ph.bounds_from_above(A + B);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error35() {
+bool
+test35() {
   Variable A(0);
   Variable B(1);
 
@@ -903,18 +898,18 @@ error35() {
     // add a system of generators that does not contain points
     // to an empty polyhedron.
     ph.add_generators_and_minimize(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error36() {
+bool
+test36() {
   Variable A(0);
   Variable B(1);
 
@@ -932,18 +927,18 @@ error36() {
     // add a system of generators that does not contain points
     // to an empty polyhedron.
     ph.add_generators(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error37() {
+bool
+test37() {
   C_Polyhedron ph1(5);
   C_Polyhedron ph2(10);
 
@@ -953,18 +948,18 @@ error37() {
     // this function to two polyhedra that are not dimensional
     // compatible.
     ph2.BHRZ03_widening_assign(ph1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error38() {
+bool
+test38() {
   Variable A(0);
   Variable B(1);
 
@@ -977,19 +972,19 @@ error38() {
     // applying the function with a linear expression with the denominator
     // equal to zero.
     Coefficient d = 0;
-    ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, B + 2, d);
-    exit(1);
+    ph.generalized_affine_image(B, GREATER_OR_EQUAL, B + 2, d);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
- catch (...) {
-    exit(1);
+  catch (...) {
   }
+  return false;
 }
 
-void
-error39() {
+bool
+test39() {
   Variable A(0);
   Variable B(1);
 
@@ -1000,19 +995,19 @@ error39() {
     // This is an incorrect use of function
     // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
     // use a variable in the expression that does not appear in the polyhedron.
-    ph.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, B);
-    exit(1);
+    ph.generalized_affine_image(A, GREATER_OR_EQUAL, B);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error40() {
+bool
+test40() {
   Variable A(0);
   Variable B(1);
 
@@ -1024,19 +1019,19 @@ error40() {
     // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
     // apply this function to a variable that is not in the space of
     // the polyhedron.
-    ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL, A + 1);
-    exit(1);
+    ph.generalized_affine_image(B, LESS_OR_EQUAL, A + 1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error41() {
+bool
+test41() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -1049,19 +1044,19 @@ error41() {
     // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
     // it is illegal to use a variable in the `rhs' expression that
     // does not appear in the polyhedron.
-    ph.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, B + C);
-    exit(1);
+    ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error42() {
+bool
+test42() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -1074,19 +1069,19 @@ error42() {
     // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
     // it is illegal to use a variable in the `lhs' expression that
     // does not appear in the polyhedron.
-    ph.generalized_affine_image(B + C, LESS_THAN_OR_EQUAL, A + 1);
-    exit(1);
+    ph.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error43() {
+bool
+test43() {
   Generator_System gs;
   Linear_Expression e;
   try {
@@ -1094,18 +1089,18 @@ error43() {
     // Generator::ray(e):
     // the origin can not be a ray.
     gs.insert(ray(e));
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error44() {
+bool
+test44() {
   Generator_System gs;
   Linear_Expression e;
   try {
@@ -1113,18 +1108,18 @@ error44() {
     // Generator::line(e):
     // the origin can not be a line.
     gs.insert(line(e));
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error45() {
+bool
+test45() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -1137,18 +1132,18 @@ error45() {
     // of a variable that is not in the space of the
     // generator.
     g.coefficient(C);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error46() {
+bool
+test46() {
   Variable A(0);
   Variable B(1);
 
@@ -1157,18 +1152,18 @@ error46() {
     // This is an incorrect use of method Generator::divisor(): it is
     // illegal to ask for the divisor of a line.
     g.divisor();
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error47() {
+bool
+test47() {
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -1181,18 +1176,18 @@ error47() {
     // of a variable that is not in the space of the
     // constraint.
     c.coefficient(C);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error48() {
+bool
+test48() {
   Variable A(0);
   Variable B(1);
 
@@ -1205,18 +1200,18 @@ error48() {
     // any call with a denominator equal to zero is illegal.
     Coefficient d = 0;
     ph.bounded_affine_image(B, A - 7, B + 2, d);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
- catch (...) {
-    exit(1);
+  catch (...) {
   }
+  return false;
 }
 
-void
-error49() {
+bool
+test49() {
   Variable A(0);
   Variable B(1);
 
@@ -1229,18 +1224,18 @@ error49() {
     // it is illegal to use a variable in the lower bounding expression
     // that does not appear in the polyhedron.
     ph.bounded_affine_image(A, B, A + 7);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error50() {
+bool
+test50() {
   Variable A(0);
   Variable B(1);
 
@@ -1253,18 +1248,18 @@ error50() {
     // it is illegal to use a variable in the upper bounding expression
     // that does not appear in the polyhedron.
     ph.bounded_affine_image(A, A + 7, B);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error51() {
+bool
+test51() {
   Variable A(0);
   Variable B(1);
 
@@ -1277,99 +1272,190 @@ error51() {
     // it is illegal to bound a variable not occurring in the
     // vector space embedding the polyhedron.
     ph.bounded_affine_image(B, A - 7, 2*A - 2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error52() {
+bool
+test52() {
   Variable A(0);
 
   C_Polyhedron ph(1);
   ph.add_constraint(A >= 1);
 
-  Polyhedra_Powerset<C_Polyhedron> ps(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
 
   try {
     // This is an incorrect use of function
-    // Polyhedra_Powerset::add_disjunct(ph): the powerset and
+    // Pointset_Powerset::add_disjunct(ph): the powerset and
     // the added disjunct should have the same space dimension.
     ps.add_disjunct(ph);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-} // namespace
-
-int
-main() TRY {
-  set_handlers();
-
-  error1();
-  error2();
-  error3();
-  error4();
-  error5();
-  error6();
-  error7();
-  error8();
-  error9();
-  error10();
-  error11();
-  error12();
-  error13();
-  error14();
-  error15();
-  error16();
-  error17();
-  error18();
-  error19();
-  error20();
-  error21();
-  error22();
-  error23();
-  error24();
-  error25();
-  error26();
-  error27();
-  error28();
-  error29();
-  error30();
-  error31();
-  error32();
-  error33();
-  error34();
-  error35();
-  error36();
-  error37();
-  error38();
-  error39();
-  error40();
-  error41();
-  error42();
-  error43();
-  error44();
-  error45();
-  error46();
-  error47();
-  error48();
-  error49();
-  error50();
-  error51();
-  error52();
-
-  return 0;
+bool
+test53() {
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_constraint(c): it is illegal to insert a
+    // constraint that contains a variable that is not in the space
+    // of the polyhedron.
+    ph.refine_with_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test54() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_constraints(cs): it is illegal to
+    // refine with a system of constraints that is dimensionally
+    // incompatible with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    ph.refine_with_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+}
+bool
+test55() {
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_congruence(cg): it is illegal to insert a
+    // congruence that contains a variable that is not in the space
+    // of the polyhedron.
+    ph.refine_with_congruence(y %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test56() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_congruences(cgs): it is illegal to
+    // refine with a system of congruences that is dimensionally
+    // incompatible with the polyhedron.
+    Congruence_System cgs;
+    cgs.insert(x - y == 0);
+    ph.refine_with_congruences(cgs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
 }
-CATCH
+ // namespace
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
+  DO_TEST(test26);
+  DO_TEST(test27);
+  DO_TEST(test28);
+  DO_TEST(test29);
+  DO_TEST(test30);
+  DO_TEST(test31);
+  DO_TEST(test32);
+  DO_TEST(test33);
+  DO_TEST(test34);
+  DO_TEST(test35);
+  DO_TEST(test36);
+  DO_TEST(test37);
+  DO_TEST(test38);
+  DO_TEST(test39);
+  DO_TEST(test40);
+  DO_TEST(test41);
+  DO_TEST(test42);
+  DO_TEST(test43);
+  DO_TEST(test44);
+  DO_TEST(test45);
+  DO_TEST(test46);
+  DO_TEST(test47);
+  DO_TEST(test48);
+  DO_TEST(test49);
+  DO_TEST(test50);
+  DO_TEST(test51);
+  DO_TEST(test52);
+  DO_TEST(test53);
+  DO_TEST(test54);
+  DO_TEST(test55);
+  DO_TEST(test56);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions2.cc b/tests/Polyhedron/exceptions2.cc
index 400d1ee..1245fcb 100644
--- a/tests/Polyhedron/exceptions2.cc
+++ b/tests/Polyhedron/exceptions2.cc
@@ -1,11 +1,11 @@
 /* Test that the right exceptions are thrown in case of incorrect uses.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,13 +22,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-using std::invalid_argument;
-using std::domain_error;
-
 namespace {
 
-void
-error1() {
+bool
+test01() {
   Variable x(0);
   Variable y(1);
 
@@ -41,21 +38,19 @@ error1() {
     // it is illegal to build a closed polyhedron starting from
     // a system of constraints that contains strict-inequalities.
     C_Polyhedron ph(cs);
-
-    // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error2() {
+bool
+test02() {
   Variable x(0);
   Variable y(1);
 
@@ -72,16 +67,17 @@ error2() {
     C_Polyhedron ph(gs);
     exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error3() {
+bool
+test03() {
   Variable x(0);
   Variable y(1);
 
@@ -92,18 +88,18 @@ error3() {
     // illegal to insert a strict-inequality into a system of
     // constraints of a closed polyhedron.
     ph.add_constraint(x - y > 0);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error4() {
+bool
+test04() {
   C_Polyhedron ph(3, EMPTY);
 
   try {
@@ -111,18 +107,18 @@ error4() {
     // is illegal to insert a closure-point into a system of
     // generators of a closed polyhedron.
     ph.add_generator(closure_point(Linear_Expression(2)));
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error5() {
+bool
+test05() {
   Variable x(0);
   Variable y(1);
 
@@ -139,18 +135,18 @@ error5() {
     // add_constraints_and_minimize(cs): it is illegal to add a system of
     // constraints that contains strict-inequalities to a closed polyhedron.
     ph.add_constraints_and_minimize(cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error6() {
+bool
+test06() {
   Variable x(0);
   Variable y(1);
 
@@ -164,18 +160,18 @@ error6() {
     // it is illegal to add a system of constraints that contains
     // strict-inequalities to a closed polyhedron.
     ph.add_constraints(cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
-  }
+    return true;
+}
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error7() {
+bool
+test07() {
   Variable x(0);
   Variable y(1);
 
@@ -191,18 +187,18 @@ error7() {
     // is illegal to apply this method to a closed polyhedron with a
     // NNC Polyhedron.
     ph.concatenate_assign(qh);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error8() {
+bool
+test08() {
   Variable x(0);
   Variable y(1);
 
@@ -219,18 +215,18 @@ error8() {
     // system of generators that contains closure-points to a closed
     // polyhedron.
     ph.add_generators_and_minimize(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error9() {
+bool
+test09() {
   Variable x(0);
   Variable y(1);
 
@@ -245,18 +241,18 @@ error9() {
     // illegal to add a system of generators that contains closure-points
     // to a closed polyhedron.
     ph.add_generators(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error10() {
+bool
+test10() {
   Variable A(0);
   Variable B(1);
 
@@ -270,18 +266,18 @@ error10() {
     // `GREATER_THAN' is an illegal relation for necessarily closed
     // polyhedron.
     ph.generalized_affine_image(A + B, GREATER_THAN, A - B);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error11() {
+bool
+test11() {
   Variable A(0);
   Variable B(1);
 
@@ -300,18 +296,18 @@ error11() {
     // `intersection_assign_and_minimize': it is illegal to apply
     // to a closed polyhedron and a non-closed polyhedron.
     ph1.intersection_assign_and_minimize(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error12() {
+bool
+test12() {
   Variable A(0);
   Variable B(1);
 
@@ -330,18 +326,18 @@ error12() {
     // `intersection_assign': it is illegal to apply this function
     // to a closed polyhedron and a non-closed polyhedron.
     ph1.intersection_assign(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error13() {
+bool
+test13() {
   Variable A(0);
   Variable B(1);
 
@@ -365,18 +361,18 @@ error13() {
      // this function to a closed polyhedron and a
      // non-closed polyhedron.
     ph1.poly_hull_assign_and_minimize(ph2);
-    exit(1);
-  }
-  catch (invalid_argument& e) {
+   }
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+   return false;
 }
 
-void
-error14() {
+bool
+test14() {
   Variable A(0);
   Variable B(1);
 
@@ -399,18 +395,18 @@ error14() {
     // `poly_hull_assign': it is illegal to apply this function
     // to a closed polyhedron and a non-closed polyhedron.
     ph1.poly_hull_assign(ph2);
-    exit(1);
-  }
-  catch (invalid_argument& e) {
+   }
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+   return false;
 }
 
-void
-error15() {
+bool
+test15() {
   Variable A(0);
   Variable B(1);
 
@@ -434,18 +430,18 @@ error15() {
     // `poly_difference_assign': it is illegal to apply this function
     // to a closed polyhedron and a non-closed polyhedron.
     ph1.poly_difference_assign(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error16() {
+bool
+test16() {
   Variable A(0);
   Variable B(1);
 
@@ -467,18 +463,18 @@ error16() {
     // `H79_widening_assign': it is illegal to apply this function
     // to a closed polyhedron and a non-closed polyhedron.
     ph2.H79_widening_assign(ph1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error17() {
+bool
+test17() {
   Variable A(0);
   Variable B(1);
 
@@ -505,18 +501,18 @@ error17() {
     // apply this function to a closed polyhedron and
     // a non-closed polyhedron.
     ph2.limited_H79_extrapolation_assign(ph1, cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error18() {
+bool
+test18() {
   Variable A(0);
   Variable B(1);
 
@@ -543,18 +539,18 @@ error18() {
     // apply this function to two closed polyhedra and
     // to a non-closed system of constraints.
     ph2.limited_H79_extrapolation_assign(ph1, cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
-  }
+    return true;
+}
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error19() {
+bool
+test19() {
   Variable A(0);
   Variable B(1);
 
@@ -577,18 +573,18 @@ error19() {
     // apply this function to a closed polyhedron and
     // a non-closed polyhedron.
     ph1.time_elapse_assign(ph2);
-    exit(1);
-  }
-  catch (invalid_argument& e) {
+ }
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
-  }
+    return true;
+ }
   catch (...) {
-    exit(1);
   }
+ return false;
 }
 
-void
-error20() {
+bool
+test20() {
   Variable A(0);
 
   C_Polyhedron ph1(1);
@@ -605,18 +601,18 @@ error20() {
     // illegal to apply this method to a closed polyhedron and a
     // non-closed polyhedron.
     ph1.contains(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error21() {
+bool
+test21() {
   Variable A(0);
   Variable B(1);
 
@@ -634,18 +630,18 @@ error21() {
     // closed polyhedron starting from a system of constraints
     // that contains strict inequalities.
     C_Polyhedron ph2(cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error22() {
+bool
+test22() {
   Variable A(0);
 
   Generator_System gs1;
@@ -663,18 +659,18 @@ error22() {
     // a closed polyhedron starting from a constant non-closed
     // system of generators.
     C_Polyhedron ph2(gs2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error23() {
+bool
+test23() {
   NNC_Polyhedron ph(0, EMPTY);
 
   try {
@@ -682,18 +678,18 @@ error23() {
     // `add_generator(g)': it is illegal add a closure point
     // to a zero-dimensional and empty non-closed polyhedron.
     ph.add_generator(closure_point());
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error24() {
+bool
+test24() {
   NNC_Polyhedron ph(0, EMPTY);
 
   print_constraints(ph, "*** ph ***");
@@ -707,18 +703,18 @@ error24() {
     // add a system of generators that does not contain points
     // to an empty zero-dimensional polyhedron.
     ph.add_generators_and_minimize(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error25() {
+bool
+test25() {
   NNC_Polyhedron ph(0, EMPTY);
 
   print_constraints(ph, "*** ph ***");
@@ -732,18 +728,18 @@ error25() {
     // add a system of generators that does not contain points
     // to an empty zero-dimensional polyhedron.
     ph.add_generators(gs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error26() {
+bool
+test26() {
   Variable A(0);
 
   NNC_Polyhedron ph1(1);
@@ -760,18 +756,18 @@ error26() {
     // it is illegal to apply this method to a
     // closed polyhedron and a non-closed polyhedron.
     ph2.contains(ph1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error27() {
+bool
+test27() {
   Variable A(0);
   Variable B(1);
 
@@ -799,18 +795,18 @@ error27() {
     // a non-closed polyhedron and a system of
     // constraints that contains strict inequalities.
     ph2.limited_H79_extrapolation_assign(ph1, cs);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error28() {
+bool
+test28() {
   Variable A(0);
   Variable B(1);
 
@@ -830,18 +826,18 @@ error28() {
     // apply this function to a non-closed polyhedron and
     // a non-closed polyhedron.
     ph2.BHRZ03_widening_assign(ph1);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error29() {
+bool
+test29() {
   Variable A(0);
   Variable B(1);
 
@@ -852,18 +848,18 @@ error29() {
     // it is illegal to use a denominator
     // equal to zero.
     gs.insert(closure_point(A + 2*B, 0));
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error30() {
+bool
+test30() {
   Variable A(0);
   Variable B(1);
 
@@ -879,18 +875,18 @@ error30() {
     // to apply this function to a closed and a
     // not necessarily closed polyhedron.
     ph1.swap(ph2);
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
   }
+  return false;
 }
 
-void
-error31() {
+bool
+test31() {
   Variable A(0);
 
   C_Polyhedron ph(1);
@@ -902,197 +898,48 @@ error31() {
     // `GREATER_THAN' is an illegal relation for necessarily closed
     // polyhedron.
     ph.generalized_affine_image(A, GREATER_THAN, A + 1);
-    exit(1);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl << endl;
-  }
-  catch (...) {
-    exit(1);
-  }
-}
-
-void
-error32() {
-  Variable A(0);
-  LP_Problem lp;
-  Constraint_System cs;
-  cs.insert(A >= 6);
-  cs.insert(A > -6);
-
-  try {
-    // This tries to build an invalid LP_Problem object: the feasible
-    // region can not be defined using strict inequalities.
-    lp.add_constraints(cs);
-
-    exit(1);
   }
-  catch (invalid_argument& e) {
+  catch (std::invalid_argument& e) {
     nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
-    exit(1);
-  }
-}
-
-void
-error33() {
-  Variable A(0);
-  LP_Problem lp;
-
-  try {
-    // This tries to build an invalid LP_Problem object: the space dimension
-    // of the objective function can not be greater than the space dimension
-    // of the feasible region.
-    lp.set_objective_function(A);
-
-    exit(1);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl << endl;
-  }
-  catch (...) {
-    exit(1);
-  }
-}
-
-void
-error34() {
-  Variable A(0);
-  Constraint_System cs;
-  cs.insert(A >= 6);
-  cs.insert(A <= 0);
-  LP_Problem lp(cs, A, MAXIMIZATION);
-
-  try {
-    // We cannot extract a feasible point from an unsatisfiable LP_Problem.
-    Generator fp = lp.feasible_point();
-
-    exit(1);
-  }
-  catch (domain_error& e) {
-    nout << "domain_error: " << e.what() << endl << endl;
-  }
-  catch (...) {
-    exit(1);
-  }
-}
-
-void
-error35() {
-  Variable A(0);
-  Constraint_System cs;
-  cs.insert(A >= 6);
-  LP_Problem lp(cs, A, MAXIMIZATION);
-
-  try {
-    // We cannot extract an optimizing point from an unbounded LP_Problem.
-    Generator fp = lp.optimizing_point();
-
-    exit(1);
-  }
-  catch (domain_error& e) {
-    nout << "domain_error: " << e.what() << endl << endl;
-  }
-  catch (...) {
-    exit(1);
-  }
-}
-
-void
-error36() {
-  Variable A(0);
-  Variable B(1);
-  Constraint_System cs;
-  cs.insert(A >= 6);
-  LP_Problem lp(cs, A, MAXIMIZATION);
-  Generator p = point(A + B);
-  Coefficient num;
-  Coefficient den;
-
-  try {
-    // This tries to evaluate the objective function on a space dimension
-    // incompatible generator.
-    lp.evaluate_objective_function(p, num, den);
-
-    exit(1);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl << endl;
-  }
-  catch (...) {
-    exit(1);
-  }
-}
-
-void
-error37() {
-  Variable A(0);
-  Constraint_System cs;
-  cs.insert(A >= 6);
-  LP_Problem lp(cs, A, MAXIMIZATION);
-  Generator r = ray(A);
-  Coefficient num;
-  Coefficient den;
-
-  try {
-    // This tries to evaluate the objective function on a ray.
-    lp.evaluate_objective_function(r, num, den);
-
-    exit(1);
-  }
-  catch (invalid_argument& e) {
-    nout << "invalid_argument: " << e.what() << endl << endl;
-  }
-  catch (...) {
-    exit(1);
   }
+  return false;
 }
 
 } // namespace
 
-int
-main() TRY {
-  set_handlers();
-
-  error1();
-  error2();
-  error3();
-  error4();
-  error5();
-  error6();
-  error7();
-  error8();
-  error9();
-  error10();
-  error11();
-  error12();
-  error13();
-  error14();
-  error15();
-  error16();
-  error17();
-  error18();
-  error19();
-  error20();
-  error21();
-  error22();
-  error23();
-  error24();
-  error25();
-  error26();
-  error27();
-  error28();
-  error29();
-  error30();
-  error31();
-  error32();
-  error33();
-  error34();
-  error35();
-  error36();
-  error37();
-
-  return 0;
-}
-CATCH
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
+  DO_TEST(test26);
+  DO_TEST(test27);
+  DO_TEST(test28);
+  DO_TEST(test29);
+  DO_TEST(test30);
+  DO_TEST(test31);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions3.cc b/tests/Polyhedron/exceptions3.cc
index b25df41..8f43f40 100644
--- a/tests/Polyhedron/exceptions3.cc
+++ b/tests/Polyhedron/exceptions3.cc
@@ -1,11 +1,11 @@
 /* Test that the right exceptions are thrown in case of incorrect uses.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,12 +22,10 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-using std::length_error;
-
 namespace {
 
-void
-error1() {
+bool
+test01() {
   try {
     // This is an invalid use of the constructor of a Variable:
     // it is illegal to (try to) build a variable with an id()
@@ -38,19 +36,19 @@ error1() {
     (void) v.id();
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error2() {
+bool
+test02() {
   try {
     Variable v(Linear_Expression::max_space_dimension());
     // This is an invalid use of the constructor of a Linear_Expression:
@@ -58,20 +56,20 @@ error2() {
     // greater than Linear_Expression::max_space_dimension().
     Linear_Expression e(v);
 
-    // It is an error if the exception is not thrown.
-    exit(1);
+   // It is an error if the exception is not thrown.
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error3() {
+bool
+test03() {
   try {
     Variable v(Linear_Expression::max_space_dimension());
     // This is an invalid use of the constructor of a Linear_Expression:
@@ -81,19 +79,19 @@ error3() {
     e += v;
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
-  }
+   }
+  return false;
 }
 
-void
-error4() {
+bool
+test04() {
   try {
     Variable v(Linear_Expression::max_space_dimension());
     // This is an invalid use of the constructor of a Linear_Expression:
@@ -103,19 +101,19 @@ error4() {
     e -= v;
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
-  }
+   }
+  return false;
 }
 
-void
-error5() {
+bool
+test05() {
   try {
     // This is an invalid use of the constructor of a polyhedron:
     // it is illegal to (try to) build a polyhedron with a dimensions
@@ -123,19 +121,19 @@ error5() {
     C_Polyhedron ph(C_Polyhedron::max_space_dimension() + 1);
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error6() {
+bool
+test06() {
   try {
     C_Polyhedron ph(1);
     // This is an invalid use of the method for adding dimensions:
@@ -144,19 +142,19 @@ error6() {
     ph.add_space_dimensions_and_embed(C_Polyhedron::max_space_dimension());
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error7() {
+bool
+test07() {
   try {
     C_Polyhedron ph(1);
     // This is an invalid use of the method for adding dimensions:
@@ -165,19 +163,19 @@ error7() {
     ph.add_space_dimensions_and_project(C_Polyhedron::max_space_dimension());
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error8() {
+bool
+test08() {
   try {
     C_Polyhedron ph(C_Polyhedron::max_space_dimension(), EMPTY);
     // This is an invalid use of the method for concatenating polyhedra:
@@ -187,19 +185,19 @@ error8() {
     ph.concatenate_assign(C_Polyhedron(1));
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
-void
-error9() {
+bool
+test09() {
   try {
     C_Polyhedron ph(1);
     // This is an invalid use of the method for expanding space dimensions:
@@ -210,33 +208,27 @@ error9() {
 			      C_Polyhedron::max_space_dimension());
 
     // It is an error if the exception is not thrown.
-    exit(1);
   }
-  catch (length_error& e) {
+  catch (std::length_error& e) {
     nout << "length_error: " << e.what() << endl << endl;
+    return true;
   }
   catch (...) {
     // It is an error if the wrong exception is thrown.
-    exit(1);
   }
+  return false;
 }
 
 } // namespace
 
-int
-main() TRY {
-  set_handlers();
-
-  error1();
-  error2();
-  error3();
-  error4();
-  error5();
-  error6();
-  error7();
-  error8();
-  error9();
-
-  return 0;
-}
-CATCH
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/expandspacedim1.cc b/tests/Polyhedron/expandspacedim1.cc
index db0e3e5..771fa44 100644
--- a/tests/Polyhedron/expandspacedim1.cc
+++ b/tests/Polyhedron/expandspacedim1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::expand_space_dimension().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,7 +39,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 1) ***");
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
 
   return ok;
 }
@@ -60,7 +60,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.expand_space_dimension(B, 1) ***");
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 1) ***");
 
   return ok;
 }
@@ -88,7 +88,7 @@ test03() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 0) ***");
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 0) ***");
 
   return ok;
 }
@@ -118,7 +118,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "***  After ph1.expand_space_dimension(A, 1) ***");
+  print_generators(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
 
   return ok;
 }
@@ -146,7 +146,7 @@ test05() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 1) ***");
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
 
   return ok;
 }
@@ -177,7 +177,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 2) ***");
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
 
   return ok;
 }
@@ -214,7 +214,7 @@ test07() {
   bool ok = (ph1 == known_result);
 
   print_constraints(ph1,
-		    "***  After ph1.expand_space_dimension(A, 1);"
+		    "*** after ph1.expand_space_dimension(A, 1);"
 		    " ph1.expand_space_dimension(C, 1) ***");
 
   return ok;
@@ -249,7 +249,7 @@ test08() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "***  After ph1.expand_space_dimension(A, 2) ***");
+  print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/expandspacedim2.cc b/tests/Polyhedron/expandspacedim2.cc
index 3834b9a..6c79d74 100644
--- a/tests/Polyhedron/expandspacedim2.cc
+++ b/tests/Polyhedron/expandspacedim2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::expand_space_dimension().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -54,7 +54,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.expand_space_dimension(B, 2) ***");
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 2) ***");
 
   return ok;
 }
@@ -89,7 +89,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "***  After ph1.expand_space_dimension(A, 2) ***");
+  print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/foldspacedims1.cc b/tests/Polyhedron/foldspacedims1.cc
index 33fb5fd..8e4ad81 100644
--- a/tests/Polyhedron/foldspacedims1.cc
+++ b/tests/Polyhedron/foldspacedims1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::fold_space_dimensions().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -44,7 +44,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After folding {A} into B ***");
+  print_generators(ph1, "*** after folding {A} into B ***");
 
   return ok;
 }
@@ -69,7 +69,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After folding {A} into B ***");
+  print_constraints(ph1, "*** after folding {A} into B ***");
 
   return ok;
 }
@@ -98,7 +98,7 @@ test03() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After folding {} into B ***");
+  print_constraints(ph1, "*** after folding {} into B ***");
 
   return ok;
 }
@@ -129,7 +129,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {A} into B ***");
+  print_constraints(ph1, "*** after folding {A} into B ***");
 
   return ok;
 }
@@ -169,7 +169,7 @@ test05() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "***  After folding {C} into B ***");
+  print_generators(ph1, "*** after folding {C} into B ***");
 
   return ok;
 }
@@ -203,7 +203,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {A,B} into C ***");
+  print_constraints(ph1, "*** after folding {A,B} into C ***");
 
   return ok;
 }
@@ -236,7 +236,7 @@ test07() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "***  After folding {C} into B ***");
+  print_generators(ph1, "*** after folding {C} into B ***");
 
   return ok;
 }
@@ -272,7 +272,7 @@ test08() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {C,D} into A ***");
+  print_constraints(ph1, "*** after folding {C,D} into A ***");
 
   return ok;
 }
@@ -311,7 +311,7 @@ test09() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {B,D} into C ***");
+  print_constraints(ph1, "*** after folding {B,D} into C ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/foldspacedims2.cc b/tests/Polyhedron/foldspacedims2.cc
index 3083d0d..4a53f80 100644
--- a/tests/Polyhedron/foldspacedims2.cc
+++ b/tests/Polyhedron/foldspacedims2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::fold_space_dimensions() for non-closed polyhedra.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -44,7 +44,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After folding {A} into B ***");
+  print_constraints(ph1, "*** after folding {A} into B ***");
 
   return ok;
 }
@@ -73,7 +73,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After folding {} into B ***");
+  print_constraints(ph1, "*** after folding {} into B ***");
 
   return ok;
 }
@@ -104,7 +104,7 @@ test03() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {A} into B ***");
+  print_constraints(ph1, "*** after folding {A} into B ***");
 
   return ok;
 }
@@ -138,7 +138,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {A,B} into C ***");
+  print_constraints(ph1, "*** after folding {A,B} into C ***");
 
   return ok;
 }
@@ -174,7 +174,7 @@ test05() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {C,D} into A ***");
+  print_constraints(ph1, "*** after folding {C,D} into A ***");
 
   return ok;
 }
@@ -213,7 +213,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "***  After folding {B,D} into C ***");
+  print_constraints(ph1, "*** after folding {B,D} into C ***");
 
   return ok;
 }
@@ -224,7 +224,7 @@ BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
   DO_TEST_F8(test03);
-  DO_TEST_F8A(test04);
+  DO_TEST(test04);
   DO_TEST(test05);
   DO_TEST(test06);
 END_MAIN
diff --git a/tests/Polyhedron/frombdshape1.cc b/tests/Polyhedron/frombdshape1.cc
new file mode 100644
index 0000000..e3be530
--- /dev/null
+++ b/tests/Polyhedron/frombdshape1.cc
@@ -0,0 +1,56 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B <= 5);
+  cs.insert(A - B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TBD_Shape bd(cs);
+
+  C_Polyhedron ph(bd);
+
+  C_Polyhedron known_result(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/frombox1.cc b/tests/Polyhedron/frombox1.cc
new file mode 100644
index 0000000..e19c1e7
--- /dev/null
+++ b/tests/Polyhedron/frombox1.cc
@@ -0,0 +1,258 @@
+/* Test C_Polyhedron::C_Polyhedron(const Box<Interval>&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x >= 0, x <= 1/2, y >= 0 }
+// from the corresponding box.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x <= 1);
+  box.add_constraint(y >= 0);
+
+  C_Polyhedron ph(box);
+
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x >= 0);
+  known_ph.add_constraint(2*x <= 1);
+  known_ph.add_constraint(y >= 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// The box is the xy plane.
+bool
+test02() {
+  Rational_Box box(2);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// This box is the closed +ve quadrant.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 0);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x >= 0);
+  known_ph.add_constraint(y >= 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A bounded box in 2D.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+
+  Rational_Box box(2);
+  box.add_constraint(3*x >= -2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y >= -10);
+  box.add_constraint(3*y <= 12);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y >= -10);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An unbounded closed box in 4D but bounded in 2D.
+bool
+test05() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  Rational_Box box(4);
+  box.add_constraint(3*x >= -2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y >= -10);
+  box.add_constraint(3*y <= 12);
+  box.add_constraint(3*z >= 15);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y >= -10);
+  known_ph.add_constraint(z >= 5);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A zero-dimensional box.
+bool
+test06() {
+  Rational_Box box(0);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph;
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An empty closed box in 2D.
+bool
+test07() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(2, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x == 2);
+  box.add_constraint(y == 4);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x == 2);
+  known_ph.add_constraint(y == 4);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A closed unit square.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(x <= 1);
+  box.add_constraint(y >= 0);
+  box.add_constraint(y <= 1);
+
+  C_Polyhedron ph(box);
+
+  Constraint_System known_cs;
+  known_cs.insert(x >= 0);
+  known_cs.insert(x <= 1);
+  known_cs.insert(y >= 0);
+  known_cs.insert(y <= 1);
+
+  C_Polyhedron known_ph(known_cs);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph generators ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/frombox2.cc b/tests/Polyhedron/frombox2.cc
new file mode 100644
index 0000000..0a114be
--- /dev/null
+++ b/tests/Polyhedron/frombox2.cc
@@ -0,0 +1,111 @@
+/* Test NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// An unbounded box in 4D but bounded in 2D with strict inequalities.
+bool
+test01() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  Rational_Box box(4);
+  box.add_constraint(3*x > -2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y > -10);
+  box.add_constraint(3*y <= 12);
+  box.add_constraint(3*z >= 15);
+
+  NNC_Polyhedron ph(box);
+
+  NNC_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x > -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y > -10);
+  known_ph.add_constraint(z >= 5);
+
+  bool ok = (ph == known_ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+  Variable x(1);
+  Variable y(2);
+
+  Rational_Box box(4);
+  box.add_constraint(3*x >= -2);
+  box.add_constraint(x < 4);
+  box.add_constraint(y > -10);
+  box.add_constraint(3*y <= 12);
+
+  NNC_Polyhedron ph(box);
+
+  NNC_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x < 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y > -10);
+
+  bool ok = (ph == known_ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An empty box in 2D.
+bool
+test03() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  NNC_Polyhedron ph(box);
+
+  NNC_Polyhedron known_ph(2, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8A(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/fromgrid1.cc b/tests/Polyhedron/fromgrid1.cc
new file mode 100644
index 0000000..22b3505
--- /dev/null
+++ b/tests/Polyhedron/fromgrid1.cc
@@ -0,0 +1,201 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x + y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 0) / 0);
+  gr.add_congruence((y - z %= 0) / 0);
+  gr.add_congruence((z %= 0) / 1);
+
+  C_Polyhedron ph(gr);
+
+
+  C_Polyhedron known_ph(gr.space_dimension());
+  known_ph.add_constraint(x + y == 0);
+  known_ph.add_constraint(y - z == 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+  Grid gr(2);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 3);
+  gr.add_congruence((y - z %= 2) / 5);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+  Grid gr(0);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph;
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(2, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 0);
+  gr.add_congruence((y %= 0) / 0);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+  known_ph.add_constraint(x == 1);
+  known_ph.add_constraint(y == 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(0, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+  Grid gr(2);
+  Constraint_System cs = gr.constraints();
+
+  C_Polyhedron ph(cs);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/fromoctagonalshape1.cc b/tests/Polyhedron/fromoctagonalshape1.cc
new file mode 100644
index 0000000..139bfd0
--- /dev/null
+++ b/tests/Polyhedron/fromoctagonalshape1.cc
@@ -0,0 +1,55 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -8);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 10);
+  TOctagonal_Shape os(cs);
+
+  C_Polyhedron ph(os);
+
+  C_Polyhedron known_result(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage1.cc b/tests/Polyhedron/generalizedaffineimage1.cc
index fc8250a..ba5f742 100644
--- a/tests/Polyhedron/generalizedaffineimage1.cc
+++ b/tests/Polyhedron/generalizedaffineimage1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::generalized_affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,9 +35,9 @@ test01() {
   ph.add_constraint(B <= 5);
   ph.add_constraint(A <= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2);
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
 
   C_Polyhedron known_result(2, EMPTY);
   known_result.add_generator(point(2*B));
@@ -46,9 +46,9 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2)"
-		   " ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2)"
+		   " ***");
 
   return ok;
 }
@@ -64,9 +64,9 @@ test02() {
   ph.add_constraint(B <= 5);
   ph.add_constraint(A <= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2, -2);
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2, -2);
 
   C_Polyhedron known_result(2, EMPTY);
   known_result.add_generator(point(-B));
@@ -75,9 +75,9 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL,"
-		   " A+2, -2) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+		   " A+2, -2) ***");
 
   return ok;
 }
@@ -93,9 +93,9 @@ test03() {
   ph.add_constraint(3*B >= 1);
   ph.add_constraint(2*A >= B);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
-  ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL, A-B+2, -3);
+  ph.generalized_affine_image(B, LESS_OR_EQUAL, A-B+2, -3);
 
   C_Polyhedron known_result(2, EMPTY);
   known_result.add_generator(point(9*A - B, 6));
@@ -104,9 +104,9 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL,"
-		   " A-B+2, -3) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, LESS_OR_EQUAL,"
+		   " A-B+2, -3) ***");
 
   return ok;
 }
@@ -131,7 +131,7 @@ test04() {
   bool ok = (ph == known_result);
 
   print_generators(ph,
-		   "*** After ph.generalized_affine_image"
+		   "*** after ph.generalized_affine_image"
 		   "(A, EQUAL, A + 2) ***");
 
   return ok;
@@ -153,13 +153,13 @@ test05() {
   C_Polyhedron known_result(2);
   known_result.add_constraint(A + B >= 1);
 
-  ph.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2);
+  ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, 2*A - B + 2);
 
   bool ok = (ph == known_result);
 
   print_generators(ph,
-		   "*** After ph.generalized_affine_image"
-		   "(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2) ***");
+		   "*** after ph.generalized_affine_image"
+		   "(A + B, GREATER_OR_EQUAL, 2*A - B + 2) ***");
 
   return ok;
 }
@@ -173,14 +173,14 @@ test06() {
 
   print_constraints(ph1, "*** ph1 ***");
 
-  ph1.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B + 1);
+  ph1.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
 
   C_Polyhedron known_result(2, EMPTY);
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.generalized_affine_image"
-		    "(A, LESS_THAN_OR_EQUAL, B + 1) ***");
+  print_constraints(ph1, "*** after ph1.generalized_affine_image"
+		    "(A, LESS_OR_EQUAL, B + 1) ***");
 
   return ok;
 }
@@ -194,14 +194,14 @@ test07() {
 
   print_constraints(ph1, "*** ph1 ***");
 
-  ph1.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, A + B + 1);
+  ph1.generalized_affine_image(A + B, GREATER_OR_EQUAL, A + B + 1);
 
   C_Polyhedron known_result(2, EMPTY);
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.generalized_affine_image"
-		    "(A + B, GREATER_THAN_OR_EQUAL, A + B + 1) ***");
+  print_constraints(ph1, "*** after ph1.generalized_affine_image"
+		    "(A + B, GREATER_OR_EQUAL, A + B + 1) ***");
 
   return ok;
 }
@@ -214,17 +214,17 @@ test08() {
   ph.add_constraint(A >= 0);
   ph.add_constraint(A <= -2);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, A+2);
+  ph.generalized_affine_image(A, GREATER_OR_EQUAL, A+2);
 
   C_Polyhedron known_result(1, EMPTY);
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, A+2)"
-		   " ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(A, GREATER_OR_EQUAL, A+2)"
+		   " ***");
 
   return ok;
 }
@@ -237,18 +237,18 @@ test09() {
   ph.add_constraint(A >= 0);
   ph.add_constraint(A <= -2);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_image(A+1, GREATER_THAN_OR_EQUAL, A+2);
+  ph.generalized_affine_image(A+1, GREATER_OR_EQUAL, A+2);
 
   C_Polyhedron known_result(1, EMPTY);
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
+  print_generators(ph, "*** ph after "
 		   "ph.generalized_affine_image"
-                   "(A+1, GREATER_THAN_OR_EQUAL, A+2)"
-		   " ---");
+                   "(A+1, GREATER_OR_EQUAL, A+2)"
+		   " ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/generalizedaffineimage2.cc b/tests/Polyhedron/generalizedaffineimage2.cc
index b834409..b63b3c5 100644
--- a/tests/Polyhedron/generalizedaffineimage2.cc
+++ b/tests/Polyhedron/generalizedaffineimage2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::generalized_affine_image().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,7 +35,7 @@ test01() {
   ph.add_generator(closure_point(2*A + 2*B));
   ph.add_generator(closure_point(3*A + B));
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.generalized_affine_image(B, LESS_THAN, B+2);
 
@@ -48,8 +48,8 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, LESS_THAN, B+2) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, LESS_THAN, B+2) ***");
 
   return ok;
 }
@@ -65,18 +65,18 @@ test02() {
   ph.add_constraint(B <= 5);
   ph.add_constraint(A <= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   C_Polyhedron ph2 = ph;
 
-  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2);
-  ph2.generalized_affine_image(-2*B, LESS_THAN_OR_EQUAL, -2*(A+2));
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+  ph2.generalized_affine_image(-2*B, LESS_OR_EQUAL, -2*(A+2));
 
   bool ok = (ph == ph2);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL,"
-		   " A+2) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+		   " A+2) ***");
 
   return ok;
 }
@@ -92,18 +92,18 @@ test03() {
   ph.add_constraint(B <= 5);
   ph.add_constraint(A <= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   C_Polyhedron ph2 = ph;
 
-  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2, -2);
-  ph2.generalized_affine_image(-2*B, LESS_THAN_OR_EQUAL, A+2);
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2, -2);
+  ph2.generalized_affine_image(-2*B, LESS_OR_EQUAL, A+2);
 
   bool ok = (ph == ph2);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL,"
-		   " A+2, -2) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+		   " A+2, -2) ***");
 
   return ok;
 }
@@ -119,18 +119,18 @@ test04() {
   ph.add_constraint(3*B >= 1);
   ph.add_constraint(2*A >= B);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   C_Polyhedron ph2 = ph;
 
-  ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL, A-B+2, -3);
-  ph2.generalized_affine_image(-3*B, GREATER_THAN_OR_EQUAL, A-B+2);
+  ph.generalized_affine_image(B, LESS_OR_EQUAL, A-B+2, -3);
+  ph2.generalized_affine_image(-3*B, GREATER_OR_EQUAL, A-B+2);
 
   bool ok = (ph == ph2);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL,"
-		   " A-B+2, -3) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, LESS_OR_EQUAL,"
+		   " A-B+2, -3) ***");
 
   return ok;
 }
@@ -146,7 +146,7 @@ test05() {
   ph.add_generator(closure_point(2*A + 2*B));
   ph.add_generator(closure_point(3*A + B));
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   NNC_Polyhedron ph2 = ph;
 
@@ -155,8 +155,8 @@ test05() {
 
   bool ok = (ph == ph2);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_image(B, LESS_THAN, B+2) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_image(B, LESS_THAN, B+2) ***");
 
   return ok;
 }
@@ -180,7 +180,7 @@ test06() {
   bool ok = (ph == ph2);
 
   print_generators(ph,
-		   "*** After ph.generalized_affine_image"
+		   "*** after ph.generalized_affine_image"
 		   "(A, EQUAL, A + 2) ***");
 
   return ok;
@@ -201,16 +201,16 @@ test07() {
 
   C_Polyhedron ph2 = ph;
 
-  ph.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2);
+  ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, 2*A - B + 2);
   ph2.generalized_affine_image(-3*(A + B),
-			       LESS_THAN_OR_EQUAL,
+			       LESS_OR_EQUAL,
 			       -3*(2*A - B + 2));
 
   bool ok = (ph == ph2);
 
   print_generators(ph,
-		   "*** After ph.generalized_affine_image"
-		   "(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2) ***");
+		   "*** after ph.generalized_affine_image"
+		   "(A + B, GREATER_OR_EQUAL, 2*A - B + 2) ***");
 
   return ok;
 }
@@ -236,9 +236,9 @@ test08() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(B, GREATER_THAN, A + B + 1) ***");
-  print_generators(ph, "*** After ph.generalized_affine_image"
+  print_generators(ph, "*** after ph.generalized_affine_image"
 		   "(B, PPLGT, A + B + 1) ***");
 
   return ok;
@@ -263,7 +263,7 @@ test09() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(Linear_Expression(2), EQUAL, A + B) ***");
 
   return ok;
@@ -283,15 +283,15 @@ test10() {
   print_constraints(ph, "*** ph ***");
 
   ph.generalized_affine_image(Linear_Expression(2),
-			      GREATER_THAN_OR_EQUAL,
+			      GREATER_OR_EQUAL,
 			      A + B);
 
   known_result.add_constraint(2 >= A + B);
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
-		    "(Linear_Expression(2), GREATER_THAN_OR_EQUAL, A + B)"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+		    "(Linear_Expression(2), GREATER_OR_EQUAL, A + B)"
 		    "***");
   return ok;
 }
@@ -309,14 +309,14 @@ test11() {
 
   print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_image(Linear_Expression(2), LESS_THAN_OR_EQUAL, A + B);
+  ph.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B);
 
   known_result.add_constraint(2 <= A + B);
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
-		    "(Linear_Expression(2), LESS_THAN_OR_EQUAL, A + B) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+		    "(Linear_Expression(2), LESS_OR_EQUAL, A + B) ***");
 
   return ok;
 }
@@ -340,7 +340,7 @@ test12() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(Linear_Expression(2), GREATER_THAN, A + B) ***");
 
   return ok;
@@ -365,7 +365,7 @@ test13() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(Linear_Expression(2), LESS_THAN, A + B) ***");
 
   return ok;
@@ -391,9 +391,9 @@ test14() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After ph.generalized_affine_image"
+  print_generators(ph, "*** after ph.generalized_affine_image"
 		    "(A - C, EQUAL, B + 3) ***");
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(A - C, EQUAL, B + 3) ***");
 
   return ok;
@@ -412,17 +412,17 @@ test15() {
   print_constraints(ph, "*** ph ***");
   print_generators(ph, "*** ph ***");
 
-  ph.generalized_affine_image(A - C, GREATER_THAN_OR_EQUAL, B + 3);
+  ph.generalized_affine_image(A - C, GREATER_OR_EQUAL, B + 3);
 
   C_Polyhedron known_result(3);
   known_result.add_constraint(A - B - C >= 3);
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
-		    "(A - C, GREATER_THAN_OR_EQUAL, B + 3) ***");
-  print_generators(ph, "*** After ph.generalized_affine_image"
-		    "(A - C, GREATER_THAN_OR_EQUAL, B + 3) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+		    "(A - C, GREATER_OR_EQUAL, B + 3) ***");
+  print_generators(ph, "*** after ph.generalized_affine_image"
+		    "(A - C, GREATER_OR_EQUAL, B + 3) ***");
 
   return ok;
 }
@@ -439,17 +439,17 @@ test16() {
 
   print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_image(A - C, LESS_THAN_OR_EQUAL, B - 1);
+  ph.generalized_affine_image(A - C, LESS_OR_EQUAL, B - 1);
 
   C_Polyhedron known_result(ph);
   known_result.add_constraint(A - B - C <= 1);
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
-		    "(A - C, LESS_THAN_OR_EQUAL, B - 1) ***");
-  print_constraints(ph, "*** After ph.generalized_affine_image"
-		    "(A - C, LESS_THAN_OR_EQUAL, B - 1) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+		    "(A - C, LESS_OR_EQUAL, B - 1) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+		    "(A - C, LESS_OR_EQUAL, B - 1) ***");
 
   return ok;
 }
@@ -473,9 +473,9 @@ test17() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(A - 2*C, LESS_THAN, B - 1) ***");
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(A - 2*C, LESS_THAN, B - 1) ***");
 
   return ok;
@@ -500,9 +500,9 @@ test18() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
 
   return ok;
@@ -528,7 +528,7 @@ test19() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.generalized_affine_image"
+  print_constraints(ph, "*** after ph.generalized_affine_image"
 		    "(A + B, LESS_THAN, 2*A - 3*B) ***");
 
   return ok;
diff --git a/tests/Polyhedron/generalizedaffinepreimage1.cc b/tests/Polyhedron/generalizedaffinepreimage1.cc
index cf45fe8..243e0d5 100644
--- a/tests/Polyhedron/generalizedaffinepreimage1.cc
+++ b/tests/Polyhedron/generalizedaffinepreimage1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::generalized_affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,9 +35,9 @@ test01() {
   ph.add_constraint(B <= 5);
   ph.add_constraint(A <= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, A+2);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2);
 
   C_Polyhedron known_result(2, UNIVERSE);
   known_result.add_constraint(0 <= A);
@@ -45,9 +45,9 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
+  print_generators(ph, "*** ph after "
 		   "ph.generalized_affine_preimage"
-		   "(B, GREATER_THAN_OR_EQUAL, A+2) ---");
+		   "(B, GREATER_OR_EQUAL, A+2) ***");
 
   return ok;
 }
@@ -63,9 +63,9 @@ test02() {
   ph.add_constraint(B <= 5);
   ph.add_constraint(A <= B);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
-  ph.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, A+2, -2);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2, -2);
 
   C_Polyhedron known_result(2, EMPTY);
   known_result.add_generator(point());
@@ -74,9 +74,9 @@ test02() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
+  print_generators(ph, "*** ph after "
 		   "ph.generalized_affine_preimage"
-                   "(B, GREATER_THAN_OR_EQUAL, A+2, -2) ---");
+                   "(B, GREATER_OR_EQUAL, A+2, -2) ***");
 
   return ok;
 }
@@ -92,7 +92,7 @@ test03() {
   ph.add_constraint(3*B >= 1);
   ph.add_constraint(2*A >= B);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   // A longer way of computing the generalized affine preimage below.
   C_Polyhedron known_result(ph);
@@ -103,13 +103,13 @@ test03() {
   vset.insert(B);
   known_result.remove_space_dimensions(vset);
 
-  ph.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, A-B+2, -3);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, A-B+2, -3);
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
+  print_generators(ph, "*** ph after "
 		   "ph.generalized_affine_preimage"
-		   "(B, LESS_THAN_OR_EQUAL, A-B+2, -3) ---");
+		   "(B, LESS_OR_EQUAL, A-B+2, -3) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/generalizedaffinepreimage2.cc b/tests/Polyhedron/generalizedaffinepreimage2.cc
index a689517..6b8a4e9 100644
--- a/tests/Polyhedron/generalizedaffinepreimage2.cc
+++ b/tests/Polyhedron/generalizedaffinepreimage2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::generalized_affine_preimage().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -35,7 +35,7 @@ test01() {
   ph.add_generator(closure_point(2*A + 2*B));
   ph.add_generator(closure_point(3*A + B));
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   // A longer way of computing the generalized affine preimage below.
   NNC_Polyhedron known_result(ph);
@@ -50,8 +50,8 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "--- ph after "
-		   "ph.generalized_affine_preimage(B, LESS_THAN, B+2) ---");
+  print_generators(ph, "*** ph after "
+		   "ph.generalized_affine_preimage(B, LESS_THAN, B+2) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/generators1.cc b/tests/Polyhedron/generators1.cc
index 2387c7c..5d6661f 100644
--- a/tests/Polyhedron/generators1.cc
+++ b/tests/Polyhedron/generators1.cc
@@ -1,11 +1,11 @@
 /* Test the construction of a polyhedron using generators.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/geomcovers1.cc b/tests/Polyhedron/geomcovers1.cc
index e828ca2..1eb18e6 100644
--- a/tests/Polyhedron/geomcovers1.cc
+++ b/tests/Polyhedron/geomcovers1.cc
@@ -1,11 +1,11 @@
-/* Test Polyhedra_Powerset<PH>::geometrically_covers().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test Pointset_Powerset<PH>::geometrically_covers().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,11 +37,11 @@ test01() {
   cs3.insert(x <= 5);
   C_Polyhedron ph1(cs1), ph2(cs2), ph3(cs3);
 
-  Polyhedra_Powerset<C_Polyhedron> ps12(1, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps12(1, EMPTY);
   ps12.add_disjunct(ph1);
   ps12.add_disjunct(ph2);
 
-  Polyhedra_Powerset<C_Polyhedron> ps3(1, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps3(1, EMPTY);
   ps3.add_disjunct(ph3);
 
   bool ok = ps12.geometrically_covers(ps3);
diff --git a/tests/Polyhedron/h79widening1.cc b/tests/Polyhedron/h79widening1.cc
index 295afd0..2828019 100644
--- a/tests/Polyhedron/h79widening1.cc
+++ b/tests/Polyhedron/h79widening1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::H79_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,47 +25,38 @@ site: http://www.cs.unipr.it/ppl/ . */
 namespace {
 
 bool
-aux_test01(C_Polyhedron& ph1, const C_Polyhedron& ph2,
-	   // Note intentional call-by-value!
-	   C_Polyhedron known_result) {
-  print_constraints(ph1, "*** ph1 ***");
-  print_constraints(ph2, "*** ph2 ***");
-
-  ph1.H79_widening_assign(ph2);
-
-  print_generators(ph1, "*** After H79_widening_assign ***");
-
-  return ph1 == known_result;
-}
-
-bool
 test01() {
   Variable x(0);
   Variable y(1);
 
-  C_Polyhedron ph1_1(2);
-  ph1_1.add_constraint(x >= 0);
-  ph1_1.add_constraint(y >= 0);
-  ph1_1.add_constraint(x <= 2);
-  ph1_1.add_constraint(y <= 2);
-  C_Polyhedron ph1_2(ph1_1);
-
-  C_Polyhedron ph2_1(2);
-  ph2_1.add_constraint(x+y <= 0);
-  ph2_1.add_constraint(x+y >= 2);
-  C_Polyhedron ph2_2(ph2_1);
-  C_Polyhedron ph2_3(ph2_1);
-  C_Polyhedron ph2_4(ph2_1);
-
-  bool ok = aux_test01(ph1_1, ph2_1, ph1_1)
-    && aux_test01(ph2_3, ph2_4, ph2_3);
-
-  // FIXME: this must be reactivated (in some form) when we will
-  //        have a decent error policy for H79_widening_assign().
-#if 0
-  if (!try_H79_widening_assign(ph2_2, ph1_2, ph1_2))
-    return false;
-#endif
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x <= 2);
+  ph1.add_constraint(y <= 2);
+
+  C_Polyhedron ph2(2);
+  // Add inconsistent constraints to ph2.
+  ph2.add_constraint(x+y <= 0);
+  ph2.add_constraint(x+y >= 2);
+
+  C_Polyhedron ph1_1(ph1);
+  print_constraints(ph1_1, "*** ph1_1 ***");
+  C_Polyhedron ph2_1(ph2);
+  print_constraints(ph2_1, "*** ph2_1 ***");
+  ph1_1.H79_widening_assign(ph2_1);
+  print_generators(ph1_1, "*** after H79_widening_assign ***");
+  C_Polyhedron ph1_2(ph1);
+  bool ok = (ph1_1 == ph1_2);
+
+  C_Polyhedron ph2_2(ph2);
+  print_constraints(ph2_2, "*** ph2_2 ***");
+  C_Polyhedron ph2_3(ph2);
+  print_constraints(ph2_3, "*** ph2_3 ***");
+  ph2_2.H79_widening_assign(ph2_3);
+  print_generators(ph2_2, "*** after H79_widening_assign ***");
+  C_Polyhedron ph2_4(ph2);
+  ok = ok && (ph2_2 == ph2_4);
 
   return ok;
 }
@@ -94,7 +85,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After H79_widening_assign ***");
+  print_constraints(ph1, "*** after H79_widening_assign ***");
 
   return ok;
 }
@@ -126,7 +117,7 @@ test03() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After ph2.H79_widening_assign(ph1) ***");
+  print_constraints(ph2, "*** after ph2.H79_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -146,7 +137,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.H79_widening_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.H79_widening_assign(ph2) ***");
 
   return ok;
 }
@@ -177,7 +168,7 @@ test05() {
 
   bool ok = (ph2 == known_result);
 
-  print_constraints(ph2, "*** After ph2.H79_widening_assign(ph1) ***");
+  print_constraints(ph2, "*** after ph2.H79_widening_assign(ph1) ***");
 
   return ok;
 }
@@ -203,7 +194,7 @@ test06() {
 
   bool ok = ph1.is_universe();
 
-  print_constraints(ph1, "*** After H79_widening_assign ***");
+  print_constraints(ph1, "*** after H79_widening_assign ***");
 
   return ok;
 }
@@ -236,7 +227,7 @@ test07() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After H79_widening_assign ***");
+  print_constraints(ph1, "*** after H79_widening_assign ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/h79widening2.cc b/tests/Polyhedron/h79widening2.cc
index 856b162..6a5920d 100644
--- a/tests/Polyhedron/h79widening2.cc
+++ b/tests/Polyhedron/h79widening2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::H79_widening_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -51,7 +51,7 @@ test01() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After H79_widening_assign ***");
+  print_constraints(ph, "*** after H79_widening_assign ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/hybrid.cc b/tests/Polyhedron/hybrid.cc
new file mode 100644
index 0000000..ac569b2
--- /dev/null
+++ b/tests/Polyhedron/hybrid.cc
@@ -0,0 +1,868 @@
+
+/* Test three examples for linear hybrid systems.
+   These are based on the examples in HalbwachsPR94
+   and HalbwachsPR97 papers.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+  // The water monitor example.
+  // Note that we have had to add a closure operator as an action
+  // for each of the transitions. Without this, the results are empty.
+bool
+test01() {
+  Variable w(0);
+  Variable x(1);
+  NNC_Polyhedron ph0(2, EMPTY);
+  NNC_Polyhedron ph0_prev(2, EMPTY);
+  NNC_Polyhedron ph1(2, EMPTY);
+  NNC_Polyhedron ph2(2, EMPTY);
+  NNC_Polyhedron ph3(2, EMPTY);
+
+  NNC_Polyhedron ph0_init(2);
+  ph0_init.add_constraint(w == 1);
+
+  NNC_Polyhedron ph_tea01(2);
+  ph_tea01.add_constraint(w == 1);
+  ph_tea01.add_constraint(x == 1);
+
+  NNC_Polyhedron ph_tea23(2);
+  ph_tea23.add_constraint(w == -2);
+  ph_tea23.add_constraint(x == 1);
+
+  NNC_Polyhedron ph_tmp(2);
+
+  while (true) {
+    ph0_prev = ph0;
+
+    // ph0
+    ph0 = ph0_init;
+    ph_tmp = ph3;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l3 to l0.
+    ph_tmp.topological_closure_assign();
+    // add constraint for the transition from l3 to l0
+    ph_tmp.add_constraint(x == 2);
+    // add invariant constraint for l0
+    ph_tmp.add_constraint(w < 10);
+    // join with the Init(l0)
+    ph0.poly_hull_assign(ph_tmp);
+    // time elaspe for l0
+    ph0.time_elapse_assign(ph_tea01);
+    // add invariant constraint for l0
+    ph0.add_constraint(w < 10);
+
+    ph0.H79_widening_assign(ph0_prev);
+
+    if (ph0 == ph0_prev) {
+
+      NNC_Polyhedron known_result0(2);
+      known_result0.add_constraint(1 <= w);
+      known_result0.add_constraint(w < 10);
+      bool ok = (ph0 == known_result0);
+
+      print_constraints(ph0, "*** ph0 final ***");
+
+      NNC_Polyhedron known_result1(2);
+      known_result1.add_constraint(w - x == 10);
+      known_result1.add_constraint(x >= 0);
+      known_result1.add_constraint(x < 2);
+      ok = ok && (ph1 == known_result1);
+
+      print_constraints(ph1, "*** ph1 final ***");
+
+      NNC_Polyhedron known_result2(2);
+      known_result2.add_constraint(w + 2*x == 16);
+      known_result2.add_constraint(x >= 2);
+      known_result2.add_constraint(w > 5);
+      ok = ok && (ph2 == known_result2);
+
+      print_constraints(ph2, "*** ph2 final ***");
+
+      NNC_Polyhedron known_result3(2);
+      known_result3.add_constraint(w + 2*x == 5);
+      known_result3.add_constraint(w <= 5);
+      known_result3.add_constraint(w > 1);
+      ok = ok && (ph3 == known_result3);
+
+      print_constraints(ph3, "*** ph3 final ***");
+
+      return ok;
+    }
+
+    print_constraints(ph0, "*** ph0 ***");
+    // ph1
+    // The only incoming transition is from l0.
+    ph1 = ph0;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l0 to l1.
+    ph1.topological_closure_assign();
+    // add constraint for the transition from l0 to l1
+    ph1.add_constraint(w == 10);
+    // do the action for the transition from l0 to l1
+    ph1.affine_image(x, 0*x);
+    // add invariant constraint for l1
+    ph1.add_constraint(x < 2);
+    // time elaspe for l1
+    ph1.time_elapse_assign(ph_tea01);
+    // add invariant constraint for l1
+    print_constraints(ph1, "*** ph1 before time elapse ***");
+    // add invariant constraint for l1
+    ph1.add_constraint(x < 2);
+
+    // The only incoming transition is from l1.
+    ph2 = ph1;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l1 to l2.
+    ph2.topological_closure_assign();
+    // add constraint for the transition from l1 to l2
+    ph2.add_constraint(x == 2);
+    // there is no action for the transition from l1 to l2
+    // add invariant constraint for l2
+    ph2.add_constraint(w > 5);
+    // time elaspe for l2
+    ph2.time_elapse_assign(ph_tea23);
+    // add invariant constraint for l2
+    ph2.add_constraint(w > 5);
+
+    // The only incoming transition is from l2.
+    ph3 = ph2;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l2 to l3.
+    ph3.topological_closure_assign();
+    // add constraint for the transition from l2 to l3
+    ph3.add_constraint(w == 5);
+    // do the action for the transition from l2 to l3
+    ph3.affine_image(x, 0*x);
+    // add invariant constraint for l3
+    ph3.add_constraint(x < 2);
+    // time elaspe for l3
+    ph3.time_elapse_assign(ph_tea23);
+    // add invariant constraint for l3
+    ph3.add_constraint(x < 2);
+  }
+  return false;
+}
+
+  // the Fischer protocol example where we make the exclusion variable
+  // one of the variables of the automaton.
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable a(2);
+  Variable b(3);
+  Variable k(4);
+
+  NNC_Polyhedron ph0(5, EMPTY);
+  NNC_Polyhedron ph1(5, EMPTY);
+  NNC_Polyhedron ph2(5, EMPTY);
+  NNC_Polyhedron ph3(5, EMPTY);
+  NNC_Polyhedron ph4(5, EMPTY);
+  NNC_Polyhedron ph5(5, EMPTY);
+
+  NNC_Polyhedron ph0_Init(5);
+  ph0_Init.add_constraint(a >= 0);
+  ph0_Init.add_constraint(b >= 0);
+  ph0_Init.add_constraint(k >= 0);
+  ph0_Init.add_constraint(k <= 2);
+
+  NNC_Polyhedron ph0_prev(5, EMPTY);
+
+  // The derivative polyhedron is the same at all locations.
+  NNC_Polyhedron ph_tea(5);
+  ph_tea.add_constraint(a == 0);
+  ph_tea.add_constraint(b == 0);
+  ph_tea.add_constraint(x1 == 1);
+  ph_tea.add_constraint(10*x2 >= 9);
+  ph_tea.add_constraint(10*x2 <= 11);
+
+  NNC_Polyhedron ph_tmp(5);
+
+  while (true) {
+    //    nout << "next iteration" << "\n";
+
+    // location l0
+    ph0 = ph0_Init;
+    ph_tmp = ph3;
+    ph_tmp.add_constraint(x1 >= b);
+    ph_tmp.add_constraint(k >= 0);
+    ph_tmp.add_constraint(k <= 2);
+    ph0.poly_hull_assign(ph_tmp);
+    ph_tmp = ph4;
+    ph_tmp.affine_image(k, Linear_Expression(0));
+    ph_tmp.add_constraint(k >= 0);
+    ph_tmp.add_constraint(k <= 2);
+    ph0.poly_hull_assign(ph_tmp);
+    ph_tmp = ph5;
+    ph_tmp.add_constraint(k >= 0);
+    ph_tmp.add_constraint(k <= 2);
+    ph0.poly_hull_assign(ph_tmp);
+    ph0.time_elapse_assign(ph_tea);
+    ph0.add_constraint(k >= 0);
+    ph0.add_constraint(k <= 2);
+
+    // location l1
+    ph1 = ph0;
+    ph1.add_constraint(k == 0);
+    ph1.affine_image(x1, Linear_Expression(0));
+    ph1.add_constraint(x1 <= a);
+    ph1.add_constraint(k == 0);
+    ph1.time_elapse_assign(ph_tea);
+    ph1.add_constraint(k == 0);
+    ph1.add_constraint(x1 <= a);
+
+    // location l2
+    ph2 = ph1;
+    ph2.affine_image(x1, Linear_Expression(0));
+    ph2.affine_image(x2, Linear_Expression(0));
+    ph2.affine_image(k, Linear_Expression(1));
+    ph2.add_constraint(k == 1);
+    ph2.time_elapse_assign(ph_tea);
+    ph2.add_constraint(k == 1);
+
+    // location l3
+    ph3 = ph2;
+    ph3.add_constraint(x2 <= a);
+    ph3.add_constraint(x1 < b);
+    ph3.affine_image(k, Linear_Expression(2));
+    ph3.add_constraint(k == 2);
+    ph3.time_elapse_assign(ph_tea);
+    ph3.add_constraint(k == 2);
+
+    // location l4
+    ph4 = ph2;
+    ph4.add_constraint(x1 >= b);
+    ph4.add_constraint(k == 1);
+    ph4.time_elapse_assign(ph_tea);
+    ph4.add_constraint(k == 1);
+
+    // location l5
+    ph5 = ph4;
+    ph5.add_constraint(x2 <= a);
+    ph5.affine_image(k, Linear_Expression(2));
+    ph5.add_constraint(k == 2);
+    ph5.time_elapse_assign(ph_tea);
+    ph5.add_constraint(k == 2);
+
+    // When we have a fixpoint, check and print results.
+    if (ph0 == ph0_prev) {
+
+      NNC_Polyhedron known_result0(5);
+      known_result0.add_constraint(a >= 0);
+      known_result0.add_constraint(b >= 0);
+      known_result0.add_constraint(k >= 0);
+      known_result0.add_constraint(k <= 2);
+      bool ok = (ph0 == known_result0);
+
+      print_constraints(ph0, "*** ph0 final ***");
+
+      NNC_Polyhedron known_result1(5);
+      known_result1.add_constraint(a >= 0);
+      known_result1.add_constraint(b >= 0);
+      known_result1.add_constraint(x1 >= 0);
+      known_result1.add_constraint(x1 <= a);
+      known_result1.add_constraint(k == 0);
+      ok = ok && (ph1 == known_result1);
+
+      print_constraints(ph1, "*** ph1 final ***");
+
+      NNC_Polyhedron known_result2(5);
+      known_result2.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result2.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result2.add_constraint(a >= 0);
+      known_result2.add_constraint(b >= 0);
+      known_result2.add_constraint(k == 1);
+      ok = ok && (ph2 == known_result2);
+
+      print_constraints(ph2, "*** ph2 final ***");
+
+      NNC_Polyhedron known_result3(5);
+      known_result3.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result3.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result3.add_constraint(a >= 0);
+      known_result3.add_constraint(b > 0);
+      known_result3.add_constraint(k == 2);
+      ok = ok && (ph3 == known_result3);
+
+      print_constraints(ph3, "*** ph3 final ***");
+
+      NNC_Polyhedron known_result4(5);
+      known_result4.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result4.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result4.add_constraint(a >= 0);
+      known_result4.add_constraint(b >= 0);
+      known_result4.add_constraint(x1 >= b);
+      known_result4.add_constraint(k == 1);
+      ok = ok && (ph4 == known_result4);
+
+      print_constraints(ph4, "*** ph4 final ***");
+
+      NNC_Polyhedron known_result5(5);
+      known_result5.add_constraint(9*b - 10*a <= 0);
+      known_result5.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result5.add_constraint(11*x1 - 10*x2 + 10*a - 11*b >= 0);
+      known_result5.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result5.add_constraint(b >= 0);
+      known_result5.add_constraint(x1 >= b);
+      known_result5.add_constraint(k == 2);
+      ok = ok && (ph5 == known_result5);
+
+      print_constraints(ph5, "*** ph5 final ***");
+
+      return ok;
+    }
+
+    ph0.poly_hull_assign_and_minimize(ph0_prev);
+    // ph0.H79_widening_assign(ph0_prev);
+
+    ph0_prev = ph0;
+  }
+  return true;
+}
+
+  // the Scheduler example using the Polyhedron domain.
+bool
+test03() {
+  Variable c1(0);
+  Variable c2(1);
+  Variable x1(2);
+  Variable x2(3);
+  Variable k1(4);
+  Variable k2(5);
+
+  NNC_Polyhedron ph_idle_Init(6);
+  ph_idle_Init.add_constraint(c1 >= 0);
+  ph_idle_Init.add_constraint(c2 >= 0);
+  ph_idle_Init.add_constraint(x1 == 0);
+  ph_idle_Init.add_constraint(x2 == 0);
+  ph_idle_Init.add_constraint(k1 == 0);
+  ph_idle_Init.add_constraint(k2 == 0);
+
+  NNC_Polyhedron ph_idle(6, EMPTY);
+  NNC_Polyhedron ph_t1(6, EMPTY);
+  NNC_Polyhedron ph_t2(6, EMPTY);
+
+  NNC_Polyhedron ph_idle_prev(6, EMPTY);
+  NNC_Polyhedron ph_t1_prev(6, EMPTY);
+  NNC_Polyhedron ph_t2_prev(6, EMPTY);
+
+  // The time elapse polyhedron at location Task1
+  NNC_Polyhedron ph_tea1(6);
+  ph_tea1.add_constraint(c1 == 1);
+  ph_tea1.add_constraint(c2 == 1);
+  ph_tea1.add_constraint(x1 == 1);
+  ph_tea1.add_constraint(x2 == 0);
+  ph_tea1.add_constraint(k1 == 0);
+  ph_tea1.add_constraint(k2 == 0);
+
+  // The time elapse polyhedron at location Task2
+  NNC_Polyhedron ph_tea2(6);
+  ph_tea2.add_constraint(c1 == 1);
+  ph_tea2.add_constraint(c2 == 1);
+  ph_tea2.add_constraint(x1 == 0);
+  ph_tea2.add_constraint(x2 == 1);
+  ph_tea2.add_constraint(k1 == 0);
+  ph_tea2.add_constraint(k2 == 0);
+
+  NNC_Polyhedron ph_tmp(6);
+
+  while (true) {
+
+    // location Idle
+    ph_idle.poly_hull_assign(ph_idle_Init);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 <= 1);
+    ph_tmp.affine_image(k1, k1 - 1);
+    ph_tmp.affine_image(x1, Linear_Expression(0));
+    ph_idle.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 == 0);
+    ph_tmp.affine_image(k2, k2 - 1);
+    ph_tmp.affine_image(x2, Linear_Expression(0));
+    ph_idle.poly_hull_assign(ph_tmp);
+
+    // location Task1
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c1 >= 10);
+    ph_tmp.affine_image(c1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, Linear_Expression(1));
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c1 >= 10);
+    ph_tmp.affine_image(c1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, k1 + 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 >= 2);
+    ph_tmp.affine_image(x1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, k1 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x1 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 >= 1);
+    ph_tmp.affine_image(x2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, k2 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.poly_hull_assign(ph_tmp);
+    ph_t1.time_elapse_assign(ph_tea1);
+    ph_t1.add_constraint(x1 <= 4);
+
+    // location Task2
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c2 >= 20);
+    ph_tmp.affine_image(c2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c2 >= 20);
+    ph_tmp.affine_image(c2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, k2 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c1 >= 10);
+    ph_tmp.affine_image(c1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, k1 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 >= 2);
+    ph_tmp.affine_image(x2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, k2 - 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.poly_hull_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c2 >= 20);
+    ph_tmp.affine_image(c2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.poly_hull_assign(ph_tmp);
+    ph_t2.time_elapse_assign(ph_tea2);
+    ph_t2.add_constraint(x2 <= 8);
+
+    ph_t2.H79_widening_assign(ph_t2_prev);
+
+    if (ph_idle == ph_idle_prev
+	&& ph_t1 == ph_t1_prev
+	&& ph_t2 == ph_t2_prev) {
+
+      NNC_Polyhedron known_result_idle(6);
+      known_result_idle.add_constraint(c2 >= 0);
+      known_result_idle.add_constraint(x1 == 0);
+      known_result_idle.add_constraint(x2 == 0);
+      known_result_idle.add_constraint(k1 == 0);
+      known_result_idle.add_constraint(k2 == 0);
+      bool ok = (ph_idle == known_result_idle);
+
+      print_constraints(ph_idle, "*** ph_idle final ***");
+
+      NNC_Polyhedron known_result_t1(6);
+      known_result_t1.add_constraint(c1 <= c2);
+      known_result_t1.add_constraint(c1 >= 0);
+      known_result_t1.add_constraint(c1 <= 4);
+      known_result_t1.add_constraint(x1 == c1);
+      known_result_t1.add_constraint(x2 == 0);
+      known_result_t1.add_constraint(k1 == 1);
+      known_result_t1.add_constraint(k2 == 0);
+      ok = ok &&  (ph_t1 == known_result_t1);
+
+      print_constraints(ph_t1, "*** ph_t1 final ***");
+
+      NNC_Polyhedron known_result_t2(6);
+      known_result_t2.add_constraint(c2 >= 0);
+      known_result_t2.add_constraint(x1 >= 0);
+      known_result_t2.add_constraint(x1 <= 4*k1);
+      known_result_t2.add_constraint(c2 <= 8);
+      known_result_t2.add_constraint(x2 == c2);
+      known_result_t2.add_constraint(k2 == 1);
+      ok = ok &&  (ph_t2 == known_result_t2);
+
+      print_constraints(ph_t2, "*** ph_t2 final ***");
+
+      return ok;
+    }
+
+    ph_idle_prev = ph_idle;
+    ph_t1_prev = ph_t1;
+    ph_t2_prev = ph_t2;
+  }
+  return false;
+}
+
+  // Additional procedures needed for the Scheduler example using powersets
+
+  // Compute the time_elapse() for each element of the powerset.
+void
+time_elapse(
+	    Pointset_Powerset<NNC_Polyhedron>& ps, const NNC_Polyhedron& ph) {
+
+  Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+  for (Pointset_Powerset<NNC_Polyhedron>::const_iterator i = ps.begin(),
+                                    ps_end = ps.end(); i != ps_end; ++i) {
+    NNC_Polyhedron di = i->element();
+    NNC_Polyhedron d(di);
+    d.time_elapse_assign(ph);
+    ps_result.add_disjunct(d);
+  }
+  ps = ps_result;
+}
+
+  // Compute the affine_image() for each element of the powerset.
+void
+affine_image(
+	    Pointset_Powerset<NNC_Polyhedron>& ps, Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+	                 = Coefficient_one()) {
+  Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+  for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps.begin(),
+                                   ps_end = ps.end(); i != ps_end; ++i) {
+    NNC_Polyhedron phi = i->element();
+    NNC_Polyhedron ph(phi);
+    ph.affine_image(var, expr, denominator);
+    ps_result.add_disjunct(ph);
+  }
+  ps = ps_result;
+}
+
+  // Compute the poly_hull of the powerset.
+void
+powerset_poly_hull(
+	    Pointset_Powerset<NNC_Polyhedron>& ps, NNC_Polyhedron& ph) {
+  Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+  for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps.begin(),
+                                   ps_end = ps.end(); i != ps_end; ++i) {
+    NNC_Polyhedron phi = i->element();
+    ph.poly_hull_assign_and_minimize(phi);
+  }
+}
+
+  // This has been added to replace the expensive geometrically_covers()
+  // test at each cycle of the iteration and intended to speed up the
+  // computation.
+  //
+  // Check if every disjunct of the 2nd powerset is contained in an
+  // disjunct of the first powerset.
+  // If this succeeds then geometrically covers() will also hold.
+bool
+disjunct_covers(
+	    Pointset_Powerset<NNC_Polyhedron>& ps1,
+              Pointset_Powerset<NNC_Polyhedron>& ps2) {
+  for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps2.begin(),
+                                   ps2_end = ps2.end(); i != ps2_end; ++i) {
+    bool is_contained = false;
+    NNC_Polyhedron ph2 = i->element();
+    for (Pointset_Powerset<NNC_Polyhedron>::iterator j = ps1.begin(),
+                                   ps1_end = ps1.end(); j != ps1_end; ++j) {
+      NNC_Polyhedron ph1 = j->element();
+      if (ph1.contains(ph2)) {
+        is_contained = true;
+        break;
+      }
+    }
+    if (!is_contained)
+      return false;
+  }
+  return true;
+}
+
+  // the Scheduler example using powersets
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable k1(2);
+  Variable k2(3);
+  Variable c1(4);
+  Variable c2(5);
+
+  Pointset_Powerset<NNC_Polyhedron> ph_idle(6);
+  ph_idle.add_constraint(c1 >= 0);
+  ph_idle.add_constraint(c2 >= 0);
+  ph_idle.add_constraint(x1 == 0);
+  ph_idle.add_constraint(x2 == 0);
+  ph_idle.add_constraint(k1 == 0);
+  ph_idle.add_constraint(k2 == 0);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t1 = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t2 = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_idle_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t1_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t2_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+
+  NNC_Polyhedron ph_tea1(6);
+  ph_tea1.add_constraint(c1 == 1);
+  ph_tea1.add_constraint(c2 == 1);
+  ph_tea1.add_constraint(x1 == 1);
+  ph_tea1.add_constraint(x2 == 0);
+  ph_tea1.add_constraint(k1 == 0);
+  ph_tea1.add_constraint(k2 == 0);
+  NNC_Polyhedron ph_tea2(6);
+  ph_tea2.add_constraint(c1 == 1);
+  ph_tea2.add_constraint(c2 == 1);
+  ph_tea2.add_constraint(x1 == 0);
+  ph_tea2.add_constraint(x2 == 1);
+  ph_tea2.add_constraint(k1 == 0);
+  ph_tea2.add_constraint(k2 == 0);
+
+  Pointset_Powerset<NNC_Polyhedron> ph_tmp(6);
+
+  while (true) {
+    //    nout << "next iteration" << std::endl;
+
+    // ph_idle
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 <= 1);
+    affine_image(ph_tmp, k1, k1 - 1);
+    affine_image(ph_tmp, x1, Linear_Expression(0));
+    ph_idle.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 == 0);
+    affine_image(ph_tmp, k2, k2 - 1);
+    affine_image(ph_tmp, x2, Linear_Expression(0));
+    ph_idle.upper_bound_assign(ph_tmp);
+
+    //ph_t1
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c1 >= 10);
+    affine_image(ph_tmp, c1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, Linear_Expression(1));
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c1 >= 10);
+    affine_image(ph_tmp, c1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, k1 + 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 >= 2);
+    affine_image(ph_tmp, x1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, k1 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x1 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 >= 1);
+    affine_image(ph_tmp, x2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, k2 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    time_elapse(ph_t1, ph_tea1);
+    ph_t1.add_constraint_and_minimize(x1 <= 4);
+
+
+    //ph_t2
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c2 >= 20);
+    affine_image(ph_tmp, c2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c2 >= 20);
+    affine_image(ph_tmp, c2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, k2 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c1 >= 10);
+    affine_image(ph_tmp, c1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, k1 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 >= 2);
+    affine_image(ph_tmp, x2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, k2 - 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c2 >= 20);
+    affine_image(ph_tmp, c2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    time_elapse(ph_t2, ph_tea2);
+    ph_t2.add_constraint(x2 <= 8);
+
+    // Note that widening is not needed and the iteration terminates
+    // with the ph_t2 consisting of 4 polyhedra
+    // The results without any widening are:
+
+    // ph_idle = { F = 0, E = 0, D = 0, C = 0, B >= 0, A >= 0 }
+
+    // ph_t1 =
+    // { F = 0, E = 1, D = 0, A - C = 0, -A + B >= 0, A >= 0, -A >= -4 }
+
+    // ph_t2 =
+    // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+    // { F = 1, E = 1, B - D = 0, A - B - C = 0, -A + B >= -4, -B >= -8,
+    //                                             B >= 0, A - B >= 0 },
+    // { F = 1, E = 1, C = 0, B - D = 0, -A + B >= 0, -B >= -8, A >= 0 },
+    // { F = 1, E = 2, B - D = 0, -A + B + C >= 10, -C >= -4, -B >= -8,
+    //                                                          A >= 0 }
+
+
+    // However, for ph_t2, a number of different
+    // widening and extrapolation options have been tested.
+    //
+    //
+    //    ph_t2.BGP99_extrapolation_assign(
+    //      ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign), 3);
+    // The BGP99 extrapolation with the max number 3 keeps the information
+    // that k1 <= 2 as well as that k2 = 1:
+    // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+    // { F = 1, E = 1, B - D = 0, A - B - C = 0, -A + B >= -4, -B >= -8,
+    //                                             B >= 0, A - B >= 0 },
+    // { F = 1, B - D = 0, -A + B + C - 10*E >= -10, -C + 4*E >= 4,
+    //                      -E >= -2, C - 2*E >= -2, -B >= -8, A >= 0 }
+
+    //    ph_t2.BGP99_extrapolation_assign(
+    //      ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign), 2);
+    // If we reduce the number 3 to 2, then we lose the constraint k1 <= 2:
+    // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+    // { F = 1, B - D = 0, -A + B + C - 10*E >= -10, -C >= -4, E >= 1,
+    //  C - 2*E >= -2, A - B - 3*C + 12*E >= 4, -B >= -8, A - C + 4*E >= 4 }
+
+    //   ph_t2.BHZ03_widening_assign<BHRZ03_Certificate>
+    //     (ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign));
+    // The BHZ03 widening loses the information that k1 <=2
+    // because there is no "with tokens" option:
+    // { F = 1, B - D = 0, -C + 4*E >= 0, C >= 0, B >= 0, -B >= -8 }
+
+    // The simpler test disjunct_covers() which is sufficient here
+    // should be more efficient than geometrically_covers().
+    if (disjunct_covers(ph_idle_prev, ph_idle)
+ 	 && disjunct_covers(ph_t1_prev, ph_t1)
+  	 && disjunct_covers(ph_t2_prev, ph_t2)) {
+
+      //  if (ph_idle_prev.geometrically_covers(ph_idle)
+      //       && ph_t1_prev.geometrically_covers(ph_t1)
+      //       && ph_t2_prev.geometrically_covers(ph_t2)) {
+
+
+      print_constraints(ph_idle, "*** ph_idle final ***");
+
+      print_constraints(ph_t1, "*** ph_t1 final ***");
+
+      print_constraints(ph_t2, "*** ph_t2 final ***");
+
+      // We project away the variables c1 and C2
+      // only compare the poly_hulls of the powerset with the
+      // expected result.
+
+      Variables_Set vs;
+      vs.insert(c1);
+      vs.insert(c2);
+
+      NNC_Polyhedron ph_idle_hull(6, EMPTY);
+      powerset_poly_hull(ph_idle, ph_idle_hull);
+
+      ph_idle_hull.remove_space_dimensions(vs);
+
+      NNC_Polyhedron known_result_idle(4);
+      known_result_idle.add_constraint(x1 == 0);
+      known_result_idle.add_constraint(x2 == 0);
+      known_result_idle.add_constraint(k1 == 0);
+      known_result_idle.add_constraint(k2 == 0);
+      bool ok = (ph_idle_hull == known_result_idle);
+
+      print_constraints(ph_idle_hull, "*** ph_idle_hull final projected ***");
+
+      NNC_Polyhedron ph_t1_hull(6, EMPTY);
+      powerset_poly_hull(ph_t1, ph_t1_hull);
+      ph_t1_hull.remove_space_dimensions(vs);
+
+      NNC_Polyhedron known_result_t1(4);
+      known_result_t1.add_constraint(x1 >= 0);
+      known_result_t1.add_constraint(x1 <= 4);
+      known_result_t1.add_constraint(x2 == 0);
+      known_result_t1.add_constraint(k1 == 1);
+      known_result_t1.add_constraint(k2 == 0);
+      ok = ok &&  (ph_t1_hull == known_result_t1);
+
+      print_constraints(ph_t1_hull, "*** ph_t1_hull final projected ***");
+
+      NNC_Polyhedron ph_t2_hull(6, EMPTY);
+      powerset_poly_hull(ph_t2, ph_t2_hull);
+      ph_t2_hull.remove_space_dimensions(vs);
+
+      NNC_Polyhedron known_result_t2(4);
+      known_result_t2.add_constraint(k2 == 1);
+      known_result_t2.add_constraint(k1 <= 2);
+      known_result_t2.add_constraint(x1 >= 0);
+      known_result_t2.add_constraint(x1 <= 4);
+      known_result_t2.add_constraint(x1 >= 0);
+      known_result_t2.add_constraint(x2 <= 8);
+      known_result_t2.add_constraint(x2 >= 0);
+      known_result_t2.add_constraint(x1 <= 4*k1);
+      known_result_t2.add_constraint(2*k1 - x1 <= 2);
+      known_result_t2.add_constraint(x1 + x2 >= 10*k1 -10);
+      known_result_t2.add_constraint(x2 >= 6*k1 - 6);
+      ok = ok &&  (ph_t2_hull == known_result_t2);
+
+      print_constraints(ph_t2_hull, "*** ph_t2_hull final projected ***");
+
+      return ok;
+    }
+
+    ph_idle_prev = ph_idle;
+    ph_t1_prev = ph_t1;
+    ph_t2_prev = ph_t2;
+  }
+
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST_F8A(test04);
+END_MAIN
diff --git a/tests/Polyhedron/intersection1.cc b/tests/Polyhedron/intersection1.cc
index cd773a6..d7f6cab 100644
--- a/tests/Polyhedron/intersection1.cc
+++ b/tests/Polyhedron/intersection1.cc
@@ -1,11 +1,11 @@
 /* Testing Polyhedron::intersection_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -80,6 +80,7 @@ test01() {
   print_constraints(icosahedron, "*** icosahedron ***");
   print_constraints(column, "*** column ***");
   print_constraints(computed_result, "*** computed_result ***");
+  print_constraints(known_result, "*** known_result ***");
 
   return ok;
 }
@@ -201,7 +202,7 @@ test03() {
 
   bool ok = (computed_result == known_result);
 
-  print_constraints(computed_result, "*** After intersection_assign ***");
+  print_constraints(computed_result, "*** after intersection_assign ***");
 
   return ok;
 }
@@ -233,8 +234,8 @@ test04() {
 	     && computed_result2 == known_result);
 
   print_constraints(computed_result1,
-		    "*** After intersection_assign_and_minimize ***");
-  print_constraints(computed_result2, "*** After intersection_assign ***");
+		    "*** after intersection_assign_and_minimize ***");
+  print_constraints(computed_result2, "*** after intersection_assign ***");
 
   return ok;
 }
@@ -263,7 +264,7 @@ test05() {
 
   bool ok = (known_result == ph1);
 
-  print_constraints(ph1, "*** After intersection_assign_and_minimize ***");
+  print_constraints(ph1, "*** after intersection_assign_and_minimize ***");
 
   return ok;
 }
@@ -300,7 +301,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After intersection_assign ***");
+  print_constraints(ph1, "*** after intersection_assign ***");
 
   return ok;
 }
@@ -316,7 +317,7 @@ aux_test07(C_Polyhedron& ph1,
 
   ph1.intersection_assign_and_minimize(ph2);
 
-  print_generators(ph1, "*** After intersection_assign ***");
+  print_generators(ph1, "*** after intersection_assign ***");
 
   return ph1 == known_result;
 }
@@ -365,7 +366,7 @@ test08() {
   bool ok = (ph1 == known_result);
 
   print_constraints(ph1,
-		    "*** After ph1.intersection_assign_and_minimize(ph2) ***");
+		    "*** after ph1.intersection_assign_and_minimize(ph2) ***");
 
   return ok;
 }
@@ -386,7 +387,7 @@ test09() {
   bool ok = (ph1 == known_result);
 
   print_constraints(ph1,
-		    "*** After ph1.intersection_assign_and_minimize(ph2) ***");
+		    "*** after ph1.intersection_assign_and_minimize(ph2) ***");
 
   return ok;
 }
@@ -409,7 +410,7 @@ test10() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.intersection_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
 
   return ok;
 }
@@ -428,7 +429,7 @@ test11() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.intersection_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
 
   return ok;
 }
@@ -456,9 +457,9 @@ test12() {
 
   bool ok = (ph1 == copy_ph1);
 
-  print_constraints(ph1, "*** After intersection_assign ***");
+  print_constraints(ph1, "*** after intersection_assign ***");
   print_constraints(copy_ph1,
-		    "*** After intersection_assign_and_minimize ***");
+		    "*** after intersection_assign_and_minimize ***");
 
   return ok;
 }
@@ -490,9 +491,9 @@ test13() {
 
   bool ok = (ph1 == copy_ph1);
 
-  print_constraints(ph1, "*** After intersection_assign ***");
+  print_constraints(ph1, "*** after intersection_assign ***");
   print_constraints(copy_ph1,
-		    "*** After intersection_assign_and_minimize ***");
+		    "*** after intersection_assign_and_minimize ***");
 
   return ok;
 }
@@ -500,7 +501,7 @@ test13() {
 } // namespace
 
 BEGIN_MAIN
-  DO_TEST_F8A(test01);
+  DO_TEST(test01);
   DO_TEST_F8A(test02);
   DO_TEST(test03);
   DO_TEST(test04);
diff --git a/tests/Polyhedron/limitedbhrz03extrapolation1.cc b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
index 061e86c..061ee5c 100644
--- a/tests/Polyhedron/limitedbhrz03extrapolation1.cc
+++ b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::limited_BHRZ03_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,10 +22,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-int
-main() TRY {
-  set_handlers();
-
+bool
+test01() {
   Variable A(0);
   Variable B(1);
 
@@ -57,10 +55,13 @@ main() TRY {
   known_result.add_constraint(B <= 4);
   known_result.add_constraint(A <= 5);
 
-  int retval = (ph2 == known_result) ? 0 : 1;
+  bool ok = (ph2 == known_result) ? true : false;
 
-  print_constraints(ph2, "*** After ph2.limited_BHRZ03_widening(ph1, cs)***");
+  print_constraints(ph2, "*** after ph2.limited_BHRZ03_widening(ph1, cs) ***");
 
-  return retval;
+  return ok;
 }
-CATCH
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/limitedh79extrapolation1.cc b/tests/Polyhedron/limitedh79extrapolation1.cc
index deddc79..fc6fbbd 100644
--- a/tests/Polyhedron/limitedh79extrapolation1.cc
+++ b/tests/Polyhedron/limitedh79extrapolation1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::limited_H79_extrapolation_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,7 +37,7 @@ test01() {
 
   C_Polyhedron ph1(cs1);
 
-  print_constraints(ph1, "*** ph1 ****");
+  print_constraints(ph1, "*** ph1 ***");
 
   Constraint_System cs2;
   cs2.insert(x >= 0);
@@ -47,7 +47,7 @@ test01() {
 
   C_Polyhedron ph2(cs2);
 
-  print_constraints(ph2, "*** ph2 ****");
+  print_constraints(ph2, "*** ph2 ***");
 
   Constraint_System cs;
   cs.insert(x >= 0);
@@ -55,7 +55,7 @@ test01() {
   cs.insert(x <= 5);
   cs.insert(y <= 5);
 
-  print_constraints(cs, "*** cs ****");
+  print_constraints(cs, "*** cs ***");
 
   C_Polyhedron computed_result = ph2;
   computed_result.limited_H79_extrapolation_assign(ph1, cs);
@@ -66,7 +66,7 @@ test01() {
   known_result.add_constraint(x <= 5);
 
   print_constraints(computed_result,
-		    "*** After limited_H79_extrapolation_assign ****");
+		    "*** after limited_H79_extrapolation_assign ***");
 
   return computed_result == known_result;
 }
@@ -83,7 +83,7 @@ test02() {
 
   C_Polyhedron ph1(cs1);
 
-  print_constraints(ph1, "*** ph1 ****");
+  print_constraints(ph1, "*** ph1 ***");
 
   Constraint_System cs2;
   cs2.insert(x <= 2);
@@ -92,13 +92,13 @@ test02() {
 
   C_Polyhedron ph2(cs2);
 
-  print_constraints(ph2, "*** ph2 ****");
+  print_constraints(ph2, "*** ph2 ***");
 
   Constraint_System cs;
   cs.insert(y <= -1);
   cs.insert(x <= 5);
 
-  print_constraints(cs, "*** cs ****");
+  print_constraints(cs, "*** cs ***");
 
   C_Polyhedron computed_result = ph2;
   computed_result.limited_H79_extrapolation_assign(ph1, cs);
@@ -108,7 +108,7 @@ test02() {
   known_result.add_generator(point(5*x + 5*y));
 
   print_constraints(computed_result,
-		    "*** After limited_H79_extrapolation_assign ****");
+		    "*** after limited_H79_extrapolation_assign ***");
 
   return computed_result == known_result;
 }
@@ -122,18 +122,18 @@ test03() {
   cs1.insert(x <= 1);
   C_Polyhedron ph1(cs1);
 
-  print_constraints(ph1, "*** ph1 ****");
+  print_constraints(ph1, "*** ph1 ***");
 
   Constraint_System cs2;
   cs2.insert(x == 0);
   C_Polyhedron ph2(cs2);
 
-  print_constraints(ph2, "*** ph2 ****");
+  print_constraints(ph2, "*** ph2 ***");
 
   Constraint_System cs;
   cs.insert(x >= 0);
 
-  print_constraints(cs, "*** cs ****");
+  print_constraints(cs, "*** cs ***");
 
   C_Polyhedron computed_result = ph1;
   computed_result.limited_H79_extrapolation_assign(ph2, cs);
@@ -141,7 +141,7 @@ test03() {
   C_Polyhedron known_result(cs);
 
   print_constraints(computed_result,
-		    "*** After limited_H79_extrapolation_assign ****");
+		    "*** after limited_H79_extrapolation_assign ***");
 
   return computed_result == known_result;
 }
@@ -172,7 +172,7 @@ test04() {
   bool ok = (ph2 == known_result);
 
   print_constraints(ph2,
-		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
 		    " ***");
   return ok;
 }
@@ -199,7 +199,7 @@ test05() {
   bool ok = (ph2 == known_result);
 
   print_constraints(ph2,
-		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
 		    " ***");
   return ok;
 }
@@ -224,7 +224,7 @@ test06() {
   bool ok = (ph2 == known_result);
 
   print_constraints(ph2,
-		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
 		    " ***");
   return ok;
 }
@@ -255,7 +255,7 @@ test07() {
   bool ok = (ph2 == known_result);
 
   print_constraints(ph2,
-		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
 		    " ***");
   return ok;
 }
diff --git a/tests/Polyhedron/linearpartition1.cc b/tests/Polyhedron/linearpartition1.cc
index 4a9361a..73ea147 100644
--- a/tests/Polyhedron/linearpartition1.cc
+++ b/tests/Polyhedron/linearpartition1.cc
@@ -1,11 +1,11 @@
 /* Test linear_partition().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -28,17 +28,17 @@ bool
 aux_test01(const C_Polyhedron& p,
 	   const C_Polyhedron& q,
 	   const std::pair<C_Polyhedron,
-	   Powerset<Determinate<NNC_Polyhedron> > >& partition) {
+	   Pointset_Powerset<NNC_Polyhedron> >& partition) {
   const C_Polyhedron& r = partition.first;
   // `r' must be a subset of or equal to `q'.
   if (!q.contains(r))
     return false;
-  const Powerset<Determinate<NNC_Polyhedron> >& s = partition.second;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
   NNC_Polyhedron the_union(r);
   // These are the NNC versions of `p' and `q'.
   NNC_Polyhedron nnc_p(p);
   NNC_Polyhedron nnc_q(q);
-  typedef Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
   for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
     const NNC_Polyhedron& a = i->element();
     // All elements of `s' must be disjoint from `p'.
@@ -78,12 +78,12 @@ test01() {
 
   nout << "q = " << q << endl;
 
-  std::pair<C_Polyhedron, Powerset<Determinate<NNC_Polyhedron> > >
+  std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
     result = linear_partition(p, q);
 
   nout << "*** q partition ***" << endl;
-  nout << "  === p inters q === " << endl << "  " << result.first << endl;
-  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
 
   if (!aux_test01(p, q, result))
     return false;
@@ -91,8 +91,8 @@ test01() {
   result = linear_partition(q, p);
 
   nout << "*** p partition ***" << endl;
-  nout << "  === q inters p === " << endl << "  " << result.first << endl;
-  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
 
   return aux_test01(q, p, result);
 }
@@ -101,17 +101,17 @@ bool
 aux_test02(const C_Polyhedron& p,
 	   const C_Polyhedron& q,
 	   const std::pair<C_Polyhedron,
-	   Powerset<Determinate<NNC_Polyhedron> > >& partition) {
+	   Pointset_Powerset<NNC_Polyhedron> >& partition) {
   const C_Polyhedron& r = partition.first;
   // `r' must be a subset of or equal to `q'.
   if (!q.contains(r))
     return false;
-  const Powerset<Determinate<NNC_Polyhedron> >& s = partition.second;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
   NNC_Polyhedron the_union(r);
   // These are the NNC versions of `p' and `q'.
   NNC_Polyhedron nnc_p(p);
   NNC_Polyhedron nnc_q(q);
-  typedef Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
   for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
     const NNC_Polyhedron& a = i->element();
     // All elements of `s' must be disjoint from `p'.
@@ -151,12 +151,12 @@ test02() {
 
   nout << "q = " << q << endl;
 
-  std::pair<C_Polyhedron, Powerset<Determinate<NNC_Polyhedron> > >
+  std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
     result = linear_partition(p, q);
 
   nout << "*** q partition ***" << endl;
-  nout << "  === p inters q === " << endl << "  " << result.first << endl;
-  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
 
   if (!aux_test01(p, q, result))
     return false;
@@ -164,8 +164,8 @@ test02() {
   result = linear_partition(q, p);
 
   nout << "*** p partition ***" << endl;
-  nout << "  === q inters p === " << endl << "  " << result.first << endl;
-  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
 
   return aux_test02(q, p, result);
 }
@@ -174,17 +174,17 @@ bool
 aux_test03(const C_Polyhedron& p,
 	   const C_Polyhedron& q,
 	   const std::pair<C_Polyhedron,
-	   Powerset<Determinate<NNC_Polyhedron> > >& partition) {
+	   Pointset_Powerset<NNC_Polyhedron> >& partition) {
   const C_Polyhedron& r = partition.first;
   // `r' must be a subset of or equal to `q'.
   if (!q.contains(r))
     return false;
-  const Powerset<Determinate<NNC_Polyhedron> >& s = partition.second;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
   NNC_Polyhedron the_union(r);
   // These are the NNC versions of `p' and `q'.
   NNC_Polyhedron nnc_p(p);
   NNC_Polyhedron nnc_q(q);
-  typedef Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
   for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
     const NNC_Polyhedron& a = i->element();
     // All elements of `s' must be disjoint from `p'.
@@ -225,12 +225,12 @@ test03() {
 
   nout << "q = " << q << endl;
 
-  std::pair<C_Polyhedron, Powerset<Determinate<NNC_Polyhedron> > >
+  std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
     result = linear_partition(p, q);
 
   nout << "*** q partition ***" << endl;
-  nout << "  === p inters q === " << endl << "  " << result.first << endl;
-  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
 
   if (!aux_test03(p, q, result))
     return false;
@@ -238,17 +238,17 @@ test03() {
   result = linear_partition(q, p);
 
   nout << "*** p partition ***" << endl;
-  nout << "  === q inters p === " << endl << "  " << result.first << endl;
-  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
 
   return aux_test03(q, p, result);
 }
 
 // Compute the complement.
 template <typename PH>
-Polyhedra_Powerset<NNC_Polyhedron>
+Pointset_Powerset<NNC_Polyhedron>
 aux_test04(const PH& ph) {
-  std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> > partition
+  std::pair<PH, Pointset_Powerset<NNC_Polyhedron> > partition
     = linear_partition(ph, PH(ph.space_dimension(), UNIVERSE));
   return partition.second;
 }
@@ -265,12 +265,30 @@ test04() {
   p.add_generator(point(-y));
 
   using namespace IO_Operators;
+
   nout << "p = " << p << endl;
 
-  Polyhedra_Powerset<NNC_Polyhedron> p_c = aux_test04(p);
+  Pointset_Powerset<NNC_Polyhedron> p_c = aux_test04(p);
 
   nout << "complement(p) = " << p_c << endl;
 
+  Pointset_Powerset<NNC_Polyhedron> p_p(p.space_dimension(), EMPTY);
+  p_p.add_disjunct(NNC_Polyhedron(p));
+  p_p.intersection_assign(p_c);
+
+  nout << "p intersected with complement(p) = " << p_p << endl;
+
+  if (!p_p.empty())
+    return false;
+
+  p_c.add_disjunct(NNC_Polyhedron(p));
+  p_c.pairwise_reduce();
+
+  nout << "p added to complement(p), pairwise reduced = " << p_c << endl;
+
+  if (!p_c.is_top())
+    return false;
+
   C_Polyhedron q(2);
   q.add_constraint(x >= -1);
   q.add_constraint(x <=  1);
@@ -279,11 +297,26 @@ test04() {
 
   nout << "q = " << q << endl;
 
-  Polyhedra_Powerset<NNC_Polyhedron> q_c = aux_test04(q);
+  Pointset_Powerset<NNC_Polyhedron> q_c = aux_test04(q);
 
   nout << "complement(q) = " << q_c << endl;
 
-  // FIXME
+  Pointset_Powerset<NNC_Polyhedron> q_p(q.space_dimension(), EMPTY);
+  q_p.add_disjunct(NNC_Polyhedron(q));
+  q_p.intersection_assign(q_c);
+
+  nout << "q intersected with complement(q) = " << q_p << endl;
+
+  if (!q_p.empty())
+    return false;
+
+  q_c.add_disjunct(NNC_Polyhedron(q));
+  q_c.pairwise_reduce();
+
+  nout << "q added to complement(q), pairwise reduced = " << q_c << endl;
+
+  if (!q_c.is_top())
+    return false;
 
   return true;
 }
diff --git a/tests/Polyhedron/linearsystem1.cc b/tests/Polyhedron/linearsystem1.cc
index 5172e6c..7cb567b 100644
--- a/tests/Polyhedron/linearsystem1.cc
+++ b/tests/Polyhedron/linearsystem1.cc
@@ -1,11 +1,11 @@
 /* Test some functionality of class Linear_System.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -47,7 +47,6 @@ test01() {
 #define COLS 3
 
   Linear_System ls1(NOT_NECESSARILY_CLOSED);
-  TEMP_INTEGER(tem);
   for (dimension_type rowi = 0; rowi < ROWS; ++rowi) {
     Linear_Row row(COLS,
 		   Linear_Row::Flags(NOT_NECESSARILY_CLOSED,
@@ -59,7 +58,7 @@ test01() {
       if (std::numeric_limits<Coefficient>::is_bounded
 	  && row[col] == std::numeric_limits<Coefficient>::min())
 	// Here the randomly generated coefficients is equal to the
-	// allowed minimum value for a signed integer datatype that
+	// allowed minimum value for a signed integer data type that
 	// might adopt the 2's complement representation
 	// (e.g., -128 for 8 bit signed integers).
 	// Thus, it would cause a positive overflow during the normalization
diff --git a/tests/Polyhedron/linexpression1.cc b/tests/Polyhedron/linexpression1.cc
index a340f05..688fe1e 100644
--- a/tests/Polyhedron/linexpression1.cc
+++ b/tests/Polyhedron/linexpression1.cc
@@ -1,11 +1,11 @@
 /* Testing Linear_Expression.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/lpproblem1.cc b/tests/Polyhedron/lpproblem1.cc
deleted file mode 100644
index 631a0ce..0000000
--- a/tests/Polyhedron/lpproblem1.cc
+++ /dev/null
@@ -1,764 +0,0 @@
-/* Test the LP_Problem class.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-namespace {
-
-bool
-test01() {
-  // Variable declaration.
-  Variable X01(0);
-  Variable X02(1);
-  Variable X03(2);
-  Variable X04(3);
-  Variable X05(4);
-  Variable X06(5);
-  Variable X07(6);
-  Variable X08(7);
-  Variable X09(8);
-  Variable X10(9);
-  Variable X11(10);
-  Variable X12(11);
-  Variable X13(12);
-  Variable X14(13);
-  Variable X15(14);
-  Variable X16(15);
-  Variable X17(16);
-  Variable X18(17);
-  Variable X19(18);
-  Variable X20(19);
-  Variable X21(20);
-  Variable X22(21);
-  Variable X23(22);
-  Variable X24(23);
-  Variable X25(24);
-  Variable X26(25);
-  Variable X27(26);
-  Variable X28(27);
-  Variable X29(28);
-  Variable X30(29);
-  Variable X31(30);
-  Variable X32(31);
-  Variable X33(32);
-  Variable X34(33);
-  Variable X35(34);
-  Variable X36(35);
-  Variable X37(36);
-  Variable X38(37);
-  Variable X39(38);
-
-  Constraint_System cs;
-  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
-  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
-  cs.insert(-X01 >= -80);
-  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
-  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
-  cs.insert(Coefficient("2386907802506363")*X06
-	    + Coefficient("2386907802506363")*X07
-	    + Coefficient("1080863910568919")*X08
-	    + Coefficient("7746191359077253")*X09
-	    - X16 == 0);
-  cs.insert(-X06 + X10 >= -80);
-  cs.insert(-X07 + X11 >= 0);
-  cs.insert(-X08 + X12 >= 0);
-  cs.insert(-X09 + X13 >= 0);
-  cs.insert(X22 - X23 - X24 - X25 == 0);
-  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
-  cs.insert(-X22 >= -500);
-  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
-  cs.insert(Coefficient("7746191359077253")*X28
-	    + Coefficient("7746191359077253")*X29
-	    + Coefficient("3512807709348987")*X30
-	    + Coefficient("3332663724254167")*X31
-	    - X38 == 0);
-  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
-  cs.insert(-X28 + X32 >= -500);
-  cs.insert(-X29 + X33 >= 0);
-  cs.insert(-X30 + X34 >= 0);
-  cs.insert(-X31 + X35 >= 0);
-  cs.insert(Coefficient("-2661627379775963")*X10
-	    - Coefficient("2686397177726501")*X11
-	    - Coefficient("5422333951354077")*X12
-	    - Coefficient("5469621747441467")*X13
-	    + X25
-	    - Coefficient("2466846695892189")*X32
-	    - Coefficient("4996743786567565")*X33
-	    - Coefficient("5064297780978123")*X34
-	    - Coefficient("641481471923585")*X35 >= 0);
-  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
-  cs.insert(X15
-	    - Coefficient("7854277750134145")*X28
-	    - Coefficient("7782220156096217")*X29
-	    - Coefficient("7782220156096217")*X30
-	    - Coefficient("7710162562058289")*X31 >= 0);
-  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
-  cs.insert(X21 >= 2);
-  cs.insert(-X16 - X38 >= -300);
-  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
-    cs.insert(Variable(i) >= 0);
-
-  // Cost function.
-  Linear_Expression cost(-10*X02 - 8*X14 - 15*X23 - 12*X36 + 250*X39);
-
-  LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
-
-  if (lp.solve() != OPTIMIZED_LP_PROBLEM)
-    return false;
-
-  // Computed numerator and denominator.
-  Coefficient num;
-  Coefficient den;
-  lp.optimal_value(num, den);
-  nout << "Optimum value = " << num << "/" << den << endl;
-  Coefficient num_kr = 11000;
-  Coefficient den_kr = 1;
-  if (num != num_kr || den != den_kr)
-    return false;
-
-  // The feasible / optimizing point.
-  Generator pg = lp.optimizing_point();
-  nout << "Optimizing point = ";
-  print_generator(pg);
-  Generator pg_kr = point(300*X06 + 300*X15
-			  + Coefficient("716072340751908900")*X16
-			  + Coefficient("4773815605012726")*X21
-			  + Coefficient("105023943310279972")*X39,
-			  Coefficient("2386907802506363"));
-  if (pg != pg_kr)
-    return false;
-
-  // Making lp unfeasible.
-  Constraint_System further_cs;
-  further_cs.insert(X05 >= 5);
-  further_cs.insert(X05 <= 3);
-  lp.add_constraints(further_cs);
-
-  return !lp.is_satisfiable();
-}
-
-bool
-test02() {
-  // Variable definition.
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-  Variable E(4);
-  Variable F(5);
-  Variable G(6);
-  Variable H(7);
-
-  // Cost function
-  Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
-
-  // Feasible region.
-  Constraint_System cs;
-  cs.insert(A - B + C >= 24);
-  cs.insert(B <= 320);
-  cs.insert(A + B + 2*D == 23);
-  cs.insert(A + 2*B + E == 4112);
-  cs.insert(7*A + 5*B + F <= 200);
-  cs.insert(138*A + 2*G == 25);
-  cs.insert(23*A + 342*B - 34*H == 99);
-  for (dimension_type i = A.id(); i <= H.id(); ++i)
-    cs.insert(Variable(i) >= 0);
-
-  LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
-
-  Generator pg = lp.optimizing_point();
-  nout << "Optimizing point = ";
-  print_generator(pg);
-  Generator pg_kr = point();
-  pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
-  if (pg != pg_kr)
-    return false;
-
-  Coefficient num;
-  Coefficient den;
-  lp.evaluate_objective_function(pg, num, den);
-  nout << "Optimum value = " << num << "/" << den << endl;
-  Coefficient num_kr = 1084869;
-  Coefficient den_kr = 76;
-  if (num != num_kr || den != den_kr)
-    return false;
-
-  // Reoptimizing using another objective function.
-  Linear_Expression new_cost = -51*A + 632*B;
-  lp.set_objective_function(new_cost);
-  pg = lp.optimizing_point();
-  nout << "Optimizing point = ";
-  print_generator(pg);
-  pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
-  if (pg != pg_kr)
-    return false;
-
-  lp.evaluate_objective_function(pg, num, den);
-  nout << "Optimum value = " << num << "/" << den << endl;
-  num_kr = 14536;
-  den_kr = 1;
-  if (num != num_kr || den != den_kr)
-    return false;
-
-  // Reoptimizing after changing optimization mode.
-  lp.set_optimization_mode(MINIMIZATION);
-  pg = lp.optimizing_point();
-  nout << "Optimizing point = ";
-  print_generator(pg);
-  pg_kr = point(17100*A + 26174*B + 2274482*C
-		+ 1063871*D + 388070456*E + 18627830*F + 0*H,
-		94392);
-  if (pg != pg_kr)
-    return false;
-
-  lp.evaluate_objective_function(pg, num, den);
-  nout << "Optimum value = " << num << "/" << den << endl;
-  num_kr = 3917467;
-  den_kr = 23598;
-
-  return num == num_kr && den == den_kr;
-}
-
-bool
-test03() {
-  // Variable declaration.
-  Variable A(0);
-  Variable B(1);
-  Variable C(2);
-  Variable D(3);
-  Constraint_System cs;
-  cs.insert(Coefficient("2251799813685248")*A
-	    >= Coefficient("-5895288448651847"));
-  cs.insert(Coefficient("5895288437392848")*A
-	    + Coefficient("3643488632714799")*B
-	    - Coefficient("2251799813685248")*C
-	    >= Coefficient("-19077554137963492"));
-  cs.insert(Coefficient("5895288437392848")*A +
-	    Coefficient("3643488632714799")*B
-	    + Coefficient("2251799813685248")*C >=
-	    Coefficient("-19077554137963492"));
-  cs.insert(Coefficient("11790576874785696")*A
-	    + Coefficient("4503599627370496")*B
-	    + Coefficient("7286977274436797")*D
-	    >= Coefficient("-38155108284934184"));
-  cs.insert(Coefficient("11790576874785696")*A
-	    + Coefficient("4503599627370496")*B
-	    - Coefficient("7286977274436797")*D
-	    >= Coefficient("-38155108284934184"));
-  cs.insert(Coefficient("11790576879289294")*A
-	    + Coefficient("7286977274436797")*C
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108289437784"));
-  cs.insert(Coefficient("11790576879289294")*A
-	    + Coefficient("7286977274436797")*C
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108289437784"));
-  cs.insert(Coefficient("11790576879289294")*A
-	    - Coefficient("7286977274436797")*C
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108289437784"));
-  cs.insert(Coefficient("11790576879289294")*A
-	    - Coefficient("7286977274436797")*C
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108289437784"));
-  cs.insert(Coefficient("2947644225451823")*A
-	    - Coefficient("1125899906842624")*B
-	    + Coefficient("1821744319735099")*D
-	    >= Coefficient("-9538777088122044"));
-  cs.insert(Coefficient("11790576892800094")*A
-	    - Coefficient("4503599627370496")*B
-	    - Coefficient("7286977274436797")*D
-	    >= Coefficient("-38155108325466584"));
-  cs.insert(Coefficient("5895288437392848")*A
-	    - Coefficient("3643488630462999")*B
-	    + Coefficient("2251799813685248")*C
-	    >= Coefficient("-19077554133459892"));
-  cs.insert(Coefficient("2947644218696424")*A
-	    - Coefficient("1821744320860999")*B
-	    - Coefficient("1125899906842624")*C
-	    >= Coefficient("-9538777072359446"));
-  cs.insert(Coefficient("7286977269933197")*A
-	    + Coefficient("11790576924325290")*B
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108379509776"));
-  cs.insert(Coefficient("7286977269933197")*A
-	    + Coefficient("11790576924325290")*B
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108379509776"));
-  cs.insert(Coefficient("562949953421312")*A
-	    + Coefficient("562949953421312")*B
-	    + Coefficient("562949953421312")*C
-	    + Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644226577723"));
-  cs.insert(Coefficient("562949953421312")*A
-	    + Coefficient("562949953421312")*B
-	    + Coefficient("562949953421312")*C
-	    - Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644226577723"));
-  cs.insert(Coefficient("562949953421312")*A
-	    + Coefficient("562949953421312")*B
-	    - Coefficient("562949953421312")*C
-	    + Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644225451823"));
-  cs.insert(Coefficient("562949953421312")*A
-	    + Coefficient("562949953421312")*B
-	    - Coefficient("562949953421312")*C
-	    - Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644225451823"));
-  cs.insert(Coefficient("7286977269933197")*A
-	    + Coefficient("4503599627370496")*B
-	    + Coefficient("11790576865778496")*C
-	    >= Coefficient("-38155108266919784"));
-  cs.insert(Coefficient("7286977251918799")*A
-	    + Coefficient("4503599627370496")*B
-	    - Coefficient("11790576870282096")*C
-	    >= Coefficient("-38155108244401792"));
-  cs.insert(Coefficient("1821744320860999")*A
-	    + Coefficient("1125899906842624")*C
-	    + Coefficient("2947644226577723")*D
-	    >= Coefficient("-9538777093751544"));
-  cs.insert(Coefficient("1821744320860999")*A
-	    + Coefficient("1125899906842624")*C
-	    - Coefficient("2947644226577723")*
-	    D >= Coefficient("-9538777093751544"));
-  cs.insert(Coefficient("1821744320860999")*A
-	    - Coefficient("1125899906842624")*C
-	    + Coefficient("2947644228829523")*D
-	    >= Coefficient("-9538777096003344"));
-  cs.insert(Coefficient("1821744320860999")*A
-	    - Coefficient("1125899906842624")*C
-	    - Coefficient("2947644228829523")*D
-	    >= Coefficient("-9538777096003344"));
-  cs.insert(Coefficient("3643488664239996")*A
-	    - Coefficient("2251799813685248")*B
-	    + Coefficient("5895288468918045")*C
-	    >= Coefficient("-19077554257308884"));
-  cs.insert(Coefficient("3643488652980997")*A
-	    - Coefficient("2251799813685248")*B
-	    - Coefficient("5895288468918045")*C
-	    >= Coefficient("-19077554232539084"));
-  cs.insert(Coefficient("562949953421312")*A
-	    - Coefficient("562949953421312")*B
-	    + Coefficient("562949953421312")*C
-	    + Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644226577723"));
-  cs.insert(Coefficient("562949953421312")*A
-	    - Coefficient("562949953421312")*B
-	    + Coefficient("562949953421312")*C
-	    - Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644229392473"));
-  cs.insert(Coefficient("562949953421312")*A
-	    - Coefficient("562949953421312")*B
-	    - Coefficient("562949953421312")*C
-	    + Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644227140673"));
-  cs.insert(Coefficient("562949953421312")*A
-	    - Coefficient("562949953421312")*B
-	    - Coefficient("562949953421312")*C
-	    - Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644227703623"));
-  cs.insert(Coefficient("7286977314969193")*A
-	    - Coefficient("11790576906310892")*B
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108447063768"));
-  cs.insert(Coefficient("3643488655232797")*A
-	    - Coefficient("5895288446400047")*B
-	    - Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077554203265688"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    + Coefficient("11790576753188506")*B
-	    + Coefficient("7286977179861205")*C
-	    >= Coefficient("-38155107920142616"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    + Coefficient("11790576766699304")*B
-	    - Coefficient("7286977179861205")*C
-	    >= Coefficient("-38155107965178608"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    + Coefficient("7286977157343207")*B
-	    + Coefficient("11790576712656108")*D
-	    >= Coefficient("-38155107816559824"));
-  cs.insert(Coefficient("2251799813685248")*A
-	    + Coefficient("3643488592182402")*B
-	    - Coefficient("5895288374342453")*D
-	    >= Coefficient("-19077553960071308"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    + Coefficient("11790576753188506")*C
-	    + Coefficient("7286977175357605")*D
-	    >= Coefficient("-38155107924646216"));
-  cs.insert(Coefficient("2251799813685248")*A
-	    + Coefficient("5895288390105051")*C
-	    - Coefficient("3643488594434202")*D
-	    >= Coefficient("-19077553996100104"));
-  cs.insert(Coefficient("2251799813685248")*A
-	    - Coefficient("5895288421630249")*C
-	    + Coefficient("3643488619204000")*D
-	    >= Coefficient("-19077554088423896"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    - Coefficient("11790576865778496")*C
-	    - Coefficient("7286977247415199")*D
-	    >= Coefficient("-38155108244401792"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    - Coefficient("7286977247415199")*B
-	    + Coefficient("11790576888296494")*D
-	    >= Coefficient("-38155108307452184"));
-  cs.insert(Coefficient("2251799813685248")*A
-	    - Coefficient("3643488639470198")*B
-	    - Coefficient("5895288464414445")*D
-	    >= Coefficient("-19077554210021088"));
-  cs.insert(Coefficient("2251799813685248")*A
-	    - Coefficient("5895288428385648")*B
-	    + Coefficient("3643488630462999")*C
-	    >= Coefficient("-19077554131208092"));
-  cs.insert(Coefficient("4503599627370496")*A
-	    - Coefficient("11790576843260498")*B
-	    - Coefficient("7286977224897201")*C
-	    >= Coefficient("-38155108163336992"));
-  cs.insert(Coefficient("1125899906842624")*B
-	    >= Coefficient("-2947644227703623"));
-  cs.insert(Coefficient("5895288459910846")*B
-	    + Coefficient("2251799813685248")*C
-	    + Coefficient("3643488630462999")*D
-	    >= Coefficient("-19077554198762088"));
-  cs.insert(Coefficient("5895288457659046")*B
-	    + Coefficient("2251799813685248")*C
-	    - Coefficient("3643488628211199")*D
-	    >= Coefficient("-19077554189754888"));
-  cs.insert(Coefficient("11790576915318092")*B
-	    - Coefficient("4503599627370496")*C
-	    + Coefficient("7286977269933197")*D
-	    >= Coefficient("-38155108393020576"));
-  cs.insert(Coefficient("5895288457659046")*B
-	    - Coefficient("2251799813685248")*C
-	    - Coefficient("3643488632714799")*D
-	    >= Coefficient("-19077554187503088"));
-  cs.insert(Coefficient("7286977292451195")*B
-	    + Coefficient("11790576919821692")*C
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108433552976"));
-  cs.insert(Coefficient("3643488664239996")*B
-	    + Coefficient("5895288486932443")*C
-	    - Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077554304596680"));
-  cs.insert(Coefficient("3643488643973798")*B
-	    - Coefficient("5895288446400047")*C
-	    + Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077554180747688"));
-  cs.insert(Coefficient("7286977314969193")*B
-	    - Coefficient("11790576937836090")*C
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108510114168"));
-  cs.insert(Coefficient("4503599627370496")*B
-	    + Coefficient("7286977247415199")*C
-	    + Coefficient("11790576883792894")*D
-	    >= Coefficient("-38155108289437784"));
-  cs.insert(Coefficient("4503599627370496")*B
-	    + Coefficient("7286977251918799")*C
-	    - Coefficient("11790576883792894")*D
-	    >= Coefficient("-38155108280430584"));
-  cs.insert(Coefficient("4503599627370496")*B
-	    - Coefficient("7286977229400801")*C
-	    + Coefficient("11790576852267696")*D
-	    >= Coefficient("-38155108181351392"));
-  cs.insert(Coefficient("1125899906842624")*D
-	    >= Coefficient("-2947644225451823"));
-  cs.insert(Coefficient("4503599627370496")*B
-	    - Coefficient("7286977229400801")*C
-	    - Coefficient("11790576852267696")*D
-	    >= Coefficient("-38155108167840592"));
-  cs.insert(Coefficient("-2251799813685248")*D
-	    >= Coefficient("-5895288448651847"));
-  cs.insert(Coefficient("2251799813685248")*C
-	    >= Coefficient("-5895288446400047"));
-  cs.insert(Coefficient("-2251799813685248")*C
-	    >= Coefficient("-5895288444148247"));
-  cs.insert(Coefficient("-1125899906842624")*B
-	    + Coefficient("1821744321986899")*C
-	    + Coefficient("2947644226577723")*D
-	    >= Coefficient("-9538777088122044"));
-  cs.insert(Coefficient("-3643488607945001")*B
-	    + Coefficient("5895288414874849")*C
-	    + Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077554059150500"));
-  cs.insert(Coefficient("-4503599627370496")*B
-	    + Coefficient("7286977292451195")*C
-	    - Coefficient("11790576906310892")*D
-	    >= Coefficient("-38155108343480984"));
-  cs.insert(Coefficient("-7286977220393601")*B
-	    + Coefficient("11790576829749698")*C
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108086775800"));
-  cs.insert(Coefficient("-4503599627370496")*B
-	    - Coefficient("7286977274436797")*C
-	    + Coefficient("11790576901807292")*D
-	    >= Coefficient("-38155108325466584"));
-  cs.insert(Coefficient("-3643488605693201")*B
-	    - Coefficient("5895288414874849")*C
-	    + Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077554059150500"));
-  cs.insert(Coefficient("-1125899906842624")*B
-	    - Coefficient("1821744319735099")*C
-	    - Coefficient("2947644225451823")*D
-	    >= Coefficient("-9538777079114846"));
-  cs.insert(Coefficient("-7286977220393601")*B
-	    - Coefficient("11790576834253298")*C
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108113797400"));
-  cs.insert(Coefficient("-5895288462162645")*B
-	    + Coefficient("2251799813685248")*C
-	    + Coefficient("3643488639470198")*D
-	    >= Coefficient("-19077554144718892"));
-  cs.insert(Coefficient("-11790576924325290")*B
-	    - Coefficient("4503599627370496")*C
-	    + Coefficient("7286977292451195")*D
-	    >= Coefficient("-38155108320962984"));
-  cs.insert(Coefficient("-5895288468918045")*B
-	    + Coefficient("2251799813685248")*C
-	    - Coefficient("3643488641721998")*D
-	    >= Coefficient("-19077554160481492"));
-  cs.insert(Coefficient("-11790576928828890")*B
-	    - Coefficient("4503599627370496")*C
-	    - Coefficient("7286977292451195")*D
-	    >= Coefficient("-38155108329970184"));
-  cs.insert(Coefficient("-281474976710656")*B
-	    >= Coefficient("-736911053829681"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    + Coefficient("11790576658612912")*B
-	    + Coefficient("7286977125818009")*C
-	    >= Coefficient("-38155107627408640"));
-  cs.insert(Coefficient("-2251799813685248")*A
-	    + Coefficient("5895288336061856")*B
-	    - Coefficient("3643488560657205")*C
-	    >= Coefficient("-19077553829466920"));
-  cs.insert(Coefficient("-2251799813685248")*A
-	    + Coefficient("3643488535887407")*B
-	    + Coefficient("5895288288774060")*D
-	    >= Coefficient("-19077553683099932"));
-  cs.insert(Coefficient("-7286977274436797")*A
-	    + Coefficient("11790576766699304")*B
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108032732608"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    + Coefficient("7286977098796411")*B
-	    - Coefficient("11790576609073318")*D
-	    >= Coefficient("-38155107483293448"));
-  cs.insert(Coefficient("-7286977301458395")*A
-	    + Coefficient("11790576735174106")*B
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155107983193008"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    + Coefficient("11790576708152508")*C
-	    + Coefficient("7286977148336007")*D
-	    >= Coefficient("-38155107771523824"));
-  cs.insert(Coefficient("-281474976710656")*A
-	    + Coefficient("281474976710656")*B
-	    + Coefficient("281474976710656")*C
-	    + Coefficient("281474976710656")*D
-	    >= Coefficient("-1473822119481311"));
-  cs.insert(Coefficient("-1125899906842624")*A
-	    + Coefficient("2947644178164027")*C
-	    - Coefficient("1821744285958102")*D
-	    >= Coefficient("-9538776941755056"));
-  cs.insert(Coefficient("-1125899906842624")*A
-	    + Coefficient("1125899906842624")*B
-	    + Coefficient("1125899906842624")*C
-	    - Coefficient("1125899906842624")*D
-	    >= Coefficient("-5895288471169845"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    - Coefficient("11790576856771296")*C
-	    + Coefficient("7286977247415199")*D
-	    >= Coefficient("-38155108221883792"));
-  cs.insert(Coefficient("-1125899906842624")*A
-	    + Coefficient("1125899906842624")*B
-	    - Coefficient("1125899906842624")*C
-	    + Coefficient("1125899906842624")*D
-	    >= Coefficient("-5895288471169845"));
-  cs.insert(Coefficient("-140737488355328")*A
-	    - Coefficient("368455526774103")*C
-	    - Coefficient("227718038700250")*D
-	    >= Coefficient("-1192347131793131"));
-  cs.insert(Coefficient("-1125899906842624")*A
-	    + Coefficient("1125899906842624")*B
-	    - Coefficient("1125899906842624")*C
-	    - Coefficient("1125899906842624")*D
-	    >= Coefficient("-5895288464414445"));
-  cs.insert(Coefficient("-3643488643973798")*A
-	    + Coefficient("2251799813685248")*B
-	    + Coefficient("5895288441896447")*C
-	    >= Coefficient("-19077554158229692"));
-  cs.insert(Coefficient("-7286977296954795")*A
-	    + Coefficient("4503599627370496")*B
-	    - Coefficient("11790576892800094")*C
-	    >= Coefficient("-38155108352488176"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    - Coefficient("7286977269933197")*B
-	    + Coefficient("11790576924325290")*D
-	    >= Coefficient("-38155108411034976"));
-  cs.insert(Coefficient("-3643488639470198")*A
-	    + Coefficient("2251799813685248")*C
-	    + Coefficient("5895288466666245")*D
-	    >= Coefficient("-19077554219028288"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    - Coefficient("7286977296954795")*B
-	    - Coefficient("11790576955850488")*D
-	    >= Coefficient("-38155108514617768"));
-  cs.insert(Coefficient("-7286977251918799")*A
-	    + Coefficient("4503599627370496")*C
-	    - Coefficient("11790576892800094")*D
-	    >= Coefficient("-38155108311955784"));
-  cs.insert(Coefficient("-3643488655232797")*A
-	    - Coefficient("2251799813685248")*C
-	    + Coefficient("5895288480177044")*D
-	    >= Coefficient("-19077554264064284"));
-  cs.insert(Coefficient("-1821744320860999")*A
-	    - Coefficient("1125899906842624")*C
-	    - Coefficient("2947644229955423")*D
-	    >= Coefficient("-9538777099381044"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    - Coefficient("11790576874785696")*B
-	    + Coefficient("7286977269933197")*C
-	    >= Coefficient("-38155108302948584"));
-  cs.insert(Coefficient("-7286977274436797")*A
-	    - Coefficient("4503599627370496")*B
-	    + Coefficient("11790576937836090")*C
-	    >= Coefficient("-38155108424545776"));
-  cs.insert(Coefficient("-4503599627370496")*A
-	    - Coefficient("11790576802728102")*B
-	    - Coefficient("7286977197875603")*C
-	    >= Coefficient("-38155108019221808"));
-  cs.insert(Coefficient("-3643488664239996")*A
-	    - Coefficient("2251799813685248")*B
-	    - Coefficient("5895288493687843")*C
-	    >= Coefficient("-19077554284330480"));
-  cs.insert(Coefficient("-562949953421312")*A
-	    - Coefficient("562949953421312")*B
-	    + Coefficient("562949953421312")*C
-	    + Coefficient("562949953421312")*D
-	    >= Coefficient("-2947644250784571"));
-  cs.insert(Coefficient("-281474976710656")*A
-	    - Coefficient("281474976710656")*B
-	    + Coefficient("281474976710656")*C
-	    - Coefficient("281474976710656")*D
-	    >= Coefficient("-1473822131021785"));
-  cs.insert(Coefficient("-1125899906842624")*A
-	    - Coefficient("1125899906842624")*B
-	    - Coefficient("1125899906842624")*C
-	    + Coefficient("1125899906842624")*D
-	    >= Coefficient("-5895288464414445"));
-  cs.insert(Coefficient("-1125899906842624")*A
-	    - Coefficient("1125899906842624")*B
-	    - Coefficient("1125899906842624")*C
-	    - Coefficient("1125899906842624")*D
-	    >= Coefficient("-5895288468918045"));
-  cs.insert(Coefficient("-3643488412038417")*A
-	    - Coefficient("5895288318047457")*B
-	    + Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077553665085532"));
-  cs.insert(Coefficient("-1821744199263809")*A
-	    - Coefficient("2947644153394229")*B
-	    - Coefficient("1125899906842624")*D
-	    >= Coefficient("-9538776813402468"));
-  cs.insert(Coefficient("-5895288378846052")*A
-	    + Coefficient("3643488632714799")*B
-	    + Coefficient("2251799813685248")*C
-	    >= Coefficient("-19077554023121704"));
-  cs.insert(Coefficient("-11790576834253298")*A
-	    + Coefficient("7286977314969193")*B
-	    - Coefficient("4503599627370496")*C
-	    >= Coefficient("-38155108302948584"));
-  cs.insert(Coefficient("-736911041726257")*A
-	    + Coefficient("281474976710656")*B
-	    + Coefficient("455436077400500")*D
-	    >= Coefficient("-2384694241068264"));
-  cs.insert(Coefficient("-5895288347320855")*A
-	    + Coefficient("2251799813685248")*B
-	    - Coefficient("3643488616952200")*D
-	    >= Coefficient("-19077553951064108"));
-  cs.insert(Coefficient("-2947644201807925")*A
-	    + Coefficient("1821744319735099")*C
-	    + Coefficient("1125899906842624")*D
-	    >= Coefficient("-9538777048715548"));
-  cs.insert(Coefficient("-11790576820742500")*A
-	    + Coefficient("7286977296954795")*C
-	    - Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108248905384"));
-  cs.insert(Coefficient("-11790576996382886")*A
-	    - Coefficient("7286977251918799")*C
-	    + Coefficient("4503599627370496")*D
-	    >= Coefficient("-38155108523624968"));
-  cs.insert(Coefficient("-5895288507198642")*A
-	    - Coefficient("3643488632714799")*C
-	    - Coefficient("2251799813685248")*D
-	    >= Coefficient("-19077554291085880"));
-  cs.insert(Coefficient("-11790577113476476")*A
-	    - Coefficient("4503599627370496")*B
-	    + Coefficient("7286977319472793")*D
-	    >= Coefficient("-38155108861394936"));
-  cs.insert(Coefficient("-5895288572500836")*A
-	    - Coefficient("2251799813685248")*B
-	    - Coefficient("3643488652980997")*D
-	    >= Coefficient("-19077554450963668"));
-  cs.insert(Coefficient("-5895288484680644")*A
-	    - Coefficient("3643488607945001")*B
-	    + Coefficient("2251799813685248")*C
-	    >= Coefficient("-19077554212272888"));
-  cs.insert(Coefficient("-2947644274991419")*A
-	    - Coefficient("1821744320860999")*B
-	    - Coefficient("1125899906842624")*C
-	    >= Coefficient("-9538777190578936"));
-  cs.insert(Coefficient("-2251799813685248")*A
-	    >= Coefficient("-5895288448651847"));
-
-  // Cost function
-  Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
-
-  LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
-
-  Generator pg = lp.optimizing_point();
-  nout << "Optimizing point obtained by simplex:\n";
-  print_generator(pg);
-
-  Coefficient num;
-  Coefficient den;
-  lp.evaluate_objective_function(pg, num, den);
-  nout << "\nOptimum value = " << num << "/" << den << endl;
-
-  C_Polyhedron ph(cs);
-  Coefficient num1;
-  Coefficient den1;
-  bool maximum;
-  Generator pg1 = point();
-  ph.maximize(cost, num1, den1, maximum, pg1);
-
-  nout << "\nOptimizing point obtained by enumeration:\n";
-  print_generator(pg1);
-  nout << "\nOptimum value = " << num1 << "/" << den1 << endl;
-
-  return maximum && num == num1 && den == den1 && pg == pg1;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST_F64(test01);
-  DO_TEST_F64(test02);
-  DO_TEST_F64(test03);
-END_MAIN
diff --git a/tests/Polyhedron/mapspacedims1.cc b/tests/Polyhedron/mapspacedims1.cc
index 66cea1b..0e7d838 100644
--- a/tests/Polyhedron/mapspacedims1.cc
+++ b/tests/Polyhedron/mapspacedims1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::map_space_dimensions().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -39,7 +39,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -59,7 +59,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -95,7 +95,7 @@ test03() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -130,7 +130,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -162,7 +162,7 @@ test05() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -192,7 +192,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -229,7 +229,7 @@ test07() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -263,7 +263,7 @@ test08() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -285,7 +285,7 @@ test09() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.map_space_dimensions(function) ***");
+  print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -388,7 +388,7 @@ test11() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.map_space_dimensions(rotate_right) ***");
+  print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***");
 
   return ok;
 }
@@ -415,7 +415,44 @@ test12() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.map_space_dimensions(rotate_right) ***");
+  print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(1, 3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(2*B));
+  gs.insert(point(A + 2*B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(4, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(C));
+  known_result.add_generator(point(2*D));
+  known_result.add_generator(point(C + 2*D));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
 
   return ok;
 }
@@ -440,4 +477,5 @@ BEGIN_MAIN
 #endif // !defined(DERIVED_TEST)
   DO_TEST(test11);
   DO_TEST(test12);
+  DO_TEST(test13);
 END_MAIN
diff --git a/tests/Polyhedron/matrix1.cc b/tests/Polyhedron/matrix1.cc
index a1a8b3c..853b938 100644
--- a/tests/Polyhedron/matrix1.cc
+++ b/tests/Polyhedron/matrix1.cc
@@ -1,11 +1,11 @@
 /* Test some functionality of class Matrix.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,18 +24,14 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "files.hh"
 #include <fstream>
 
-using std::fstream;
-using std::ios_base;
-
 namespace {
 
-const char* data_file = "matrix1.dat";
-
-void
-ascii_dump_load() {
+bool
+test01() {
   Variable A(0);
   Variable B(1);
   Random_Number_Generator r;
+  const char* data_file = "matrix1.dat";
 
   for (dimension_type num_rows = 0; num_rows <= 3; ++num_rows)
     for (dimension_type num_cols = 0; num_cols <= 3; ++num_cols) {
@@ -44,12 +40,12 @@ ascii_dump_load() {
 	for (dimension_type col = 0; col < num_cols; ++col)
 	  r.get(m1[row][col], 0);
 
-      fstream f;
-      open(f, data_file, ios_base::out);
+      std::fstream f;
+      open(f, data_file, std::ios_base::out);
       m1.ascii_dump(f);
       close(f);
 
-      open(f, data_file, ios_base::in);
+      open(f, data_file, std::ios_base::in);
       Matrix m2;
       m2.ascii_load(f);
       close(f);
@@ -62,19 +58,14 @@ ascii_dump_load() {
 	nout << "m2.ascii_dump() gives" << endl;
 	m2.ascii_dump(nout);
 
-	exit(1);
+	return false;
       }
     }
+  return true;
 }
 
 } // namespace
 
-int
-main() TRY {
-  set_handlers();
-
-  ascii_dump_load();
-
-  return 0;
-}
-CATCH
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/max_min1.cc b/tests/Polyhedron/max_min1.cc
index b87c1f8..079915f 100644
--- a/tests/Polyhedron/max_min1.cc
+++ b/tests/Polyhedron/max_min1.cc
@@ -1,12 +1,12 @@
 /* Test Polyhedron::maximize(const Linear_Expression&, ...)
    and Polyhedron::minimize(const Linear_Expression&, ...).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -130,9 +130,52 @@ test02() {
   return ok;
 }
 
+bool
+test03() {
+
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = ph.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = ph.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST_F8(test02);
+  DO_TEST(test03);
 END_MAIN
diff --git a/tests/Polyhedron/maxspacedim1.cc b/tests/Polyhedron/maxspacedim1.cc
index 2fea90a..2821c57 100644
--- a/tests/Polyhedron/maxspacedim1.cc
+++ b/tests/Polyhedron/maxspacedim1.cc
@@ -1,11 +1,11 @@
 /* Test the *::max_space_dimension() methods.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,41 +22,80 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-template <typename T>
-dimension_type foo() {
-  return T::max_space_dimension();
-}
+#define test01_DO_CLASS(T)				\
+  nout << #T "::max_space_dimension() = "		\
+    << T::max_space_dimension() << endl;		\
+  if (T::max_space_dimension() < max_space_dimension())	\
+    return false
+
+#define test01_DO_WRD(WRD)			\
+  test01_DO_CLASS(WRD<int8_t>);			\
+  test01_DO_CLASS(WRD<int16_t>);		\
+  test01_DO_CLASS(WRD<int32_t>);		\
+  test01_DO_CLASS(WRD<int64_t>);		\
+  test01_DO_CLASS(WRD<mpz_class>);		\
+  test01_DO_CLASS(WRD<mpq_class>);		\
+  test01_DO_CLASS(WRD<float>);			\
+  test01_DO_CLASS(WRD<double>);			\
+  test01_DO_CLASS(WRD<long double>)
+
+#define test01_DO_CONSTR_CLASS(CONSTR, T)				\
+  nout << #CONSTR "<" #T ">::max_space_dimension() = "			\
+       << CONSTR<T>::max_space_dimension() << endl;			\
+  if (CONSTR<T>::max_space_dimension() < max_space_dimension())		\
+    return false
+
+#define test01_DO_CONSTR_WRD(CONSTR, WRD)			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int8_t>);			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int16_t>);			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int32_t>);			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int64_t>);			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<mpz_class>);		\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<mpq_class>);		\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<float>);			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<double>);			\
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<long double>)
 
-template dimension_type foo<Variable>();
-template dimension_type foo<Linear_Expression>();
-template dimension_type foo<Constraint>();
-template dimension_type foo<Generator>();
-template dimension_type foo<Constraint_System>();
-template dimension_type foo<Generator_System>();
-template dimension_type foo<C_Polyhedron>();
-template dimension_type foo<NNC_Polyhedron>();
-template dimension_type foo<Polyhedra_Powerset<C_Polyhedron> >();
-template dimension_type foo<Polyhedra_Powerset<NNC_Polyhedron> >();
-
-#define PRINT(T) \
-nout << #T "::max_space_dimension() = " << T::max_space_dimension() << endl
-
-int
-main() TRY {
-  set_handlers();
-
-  PRINT(Variable);
-  PRINT(Linear_Expression);
-  PRINT(Constraint);
-  PRINT(Generator);
-  PRINT(Constraint_System);
-  PRINT(Generator_System);
-  PRINT(C_Polyhedron);
-  PRINT(NNC_Polyhedron);
-  PRINT(Polyhedra_Powerset<C_Polyhedron>);
-  PRINT(Polyhedra_Powerset<NNC_Polyhedron>);
-
-  // FIXME.
-  return 0;
+bool
+test01() {
+  test01_DO_CLASS(Variable);
+  test01_DO_CLASS(Variables_Set);
+  test01_DO_CLASS(Linear_Expression);
+  test01_DO_CLASS(Constraint);
+  test01_DO_CLASS(Congruence);
+  test01_DO_CLASS(Generator);
+  test01_DO_CLASS(Grid_Generator);
+  test01_DO_CLASS(Constraint_System);
+  test01_DO_CLASS(Congruence_System);
+  test01_DO_CLASS(Generator_System);
+  test01_DO_CLASS(Grid_Generator_System);
+  test01_DO_CLASS(C_Polyhedron);
+  test01_DO_CLASS(NNC_Polyhedron);
+  test01_DO_CLASS(Grid);
+  // FIXME: what about all other boxes?
+  test01_DO_CLASS(Rational_Box);
+  test01_DO_WRD(BD_Shape);
+  test01_DO_WRD(Octagonal_Shape);
+  test01_DO_CONSTR_CLASS(Pointset_Powerset, C_Polyhedron);
+  test01_DO_CONSTR_CLASS(Pointset_Powerset, NNC_Polyhedron);
+  test01_DO_CONSTR_CLASS(Pointset_Powerset, Grid);
+  test01_DO_CONSTR_WRD(Pointset_Powerset, BD_Shape);
+  test01_DO_CONSTR_WRD(Pointset_Powerset, Octagonal_Shape);
+  //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, C_Polyhedron);
+  //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, NNC_Polyhedron);
+  //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, Grid);
+  //test01_DO_CONSTR_WRD(Pointset_Ask_Tell, BD_Shape);
+  //test01_DO_CONSTR_WRD(Pointset_Ask_Tell, Octagonal_Shape);
+
+  nout << "Parma_Polyhedra_Library::max_space_dimension() = "
+       << max_space_dimension() << endl;
+
+  // 9458 is the value of max_space_dimension()
+  // computed on a 32bit architecture.
+  return (max_space_dimension() >= 9458);
 }
-CATCH
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Polyhedron/mc91.cc b/tests/Polyhedron/mc91.cc
index d02df7b..6e37518 100644
--- a/tests/Polyhedron/mc91.cc
+++ b/tests/Polyhedron/mc91.cc
@@ -1,11 +1,11 @@
-/* Test the Polyhedra_Powerset construction with McCarthy's 91 function.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Test the Pointset_Powerset construction with McCarthy's 91 function.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -26,7 +26,7 @@ namespace {
 
 bool
 test01() {
-  typedef Polyhedra_Powerset<C_Polyhedron> PCS;
+  typedef Pointset_Powerset<C_Polyhedron> PCS;
 
   Variable A(0);
   Variable B(1);
@@ -67,11 +67,11 @@ test01() {
   do {
     previous = current;
     current = inductive;
-    Polyhedra_Powerset<C_Polyhedron> b1(2);
+    Pointset_Powerset<C_Polyhedron> b1(2);
     b1.concatenate_assign(previous);
     b1.add_space_dimensions_and_embed(2);
     current.intersection_assign(b1);
-    Polyhedra_Powerset<C_Polyhedron> b2(4);
+    Pointset_Powerset<C_Polyhedron> b2(4);
     b2.concatenate_assign(previous);
     current.intersection_assign(b2);
 
@@ -99,7 +99,7 @@ test01() {
   C_Polyhedron expected_ph(2);
   expected_ph.add_constraint(A - B <= 10);
   expected_ph.add_constraint(B >= 91);
-  Polyhedra_Powerset<C_Polyhedron> expected(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> expected(2, EMPTY);
   expected.add_disjunct(expected_ph);
 
   bool ok = (expected == current);
diff --git a/tests/Polyhedron/membytes1.cc b/tests/Polyhedron/membytes1.cc
index 2952e5b..1f5a8c0 100644
--- a/tests/Polyhedron/membytes1.cc
+++ b/tests/Polyhedron/membytes1.cc
@@ -1,11 +1,11 @@
 /* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -24,6 +24,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 namespace {
 
+namespace test01_namespace {
+
 void
 add_constraint(C_Polyhedron& ph, const Constraint& c) {
   const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
@@ -61,11 +63,11 @@ minimize(C_Polyhedron& ph) {
        << endl;
 }
 
-} // namespace
+} // namespace test01_namespace
 
-int
-main() TRY {
-  set_handlers();
+bool
+test01() {
+  using namespace test01_namespace;
 
   Variable x(0);
   Variable y(1);
@@ -213,6 +215,77 @@ main() TRY {
   nout << "Sum of sizes of contained generators = " << gs_elements_size
        << endl << endl;
 
-  return 0;
+  return true;
 }
-CATCH
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(4*x - 2*y - z + 14 >= 0);
+  ph.add_constraint(4*x + 2*y - z + 2 >= 0);
+  ph.add_constraint(x + y - 1 >= 0);
+  ph.add_constraint(x + y + 2*z - 5 >= 0);
+
+  const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+  const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+
+  Determinate<C_Polyhedron> dph(ph);
+
+  const memory_size_type dph_total_size = dph.total_memory_in_bytes();
+  const memory_size_type dph_external_size = dph.external_memory_in_bytes();
+
+  nout << "ph.total_memory_in_bytes() = " << ph_total_size
+       << endl
+       << "ph.external_memory_in_bytes() = " << ph_external_size
+       << endl
+       << "dph.total_memory_in_bytes() = " << dph_total_size
+       << endl
+       << "dph.external_memory_in_bytes() = " << dph_external_size
+       << endl;
+
+  Pointset_Powerset<C_Polyhedron> pph(ph);
+
+  C_Polyhedron qh(3);
+  qh.add_constraint(x >= 0);
+  qh.add_constraint(y >= 0);
+  qh.add_constraint(z >= 0);
+  qh.add_constraint(x <= 1);
+  qh.add_constraint(y <= 1);
+  qh.add_constraint(z <= 1);
+  Pointset_Powerset<C_Polyhedron> pqh(qh);
+
+  Pointset_Powerset<C_Polyhedron> prh = pqh;
+  prh.poly_difference_assign(pph);
+
+  const memory_size_type pph_total_size = pph.total_memory_in_bytes();
+  const memory_size_type pph_external_size = pph.external_memory_in_bytes();
+  const memory_size_type pqh_total_size = pqh.total_memory_in_bytes();
+  const memory_size_type pqh_external_size = pqh.external_memory_in_bytes();
+  const memory_size_type prh_total_size = prh.total_memory_in_bytes();
+  const memory_size_type prh_external_size = prh.external_memory_in_bytes();
+
+  nout << "pph.total_memory_in_bytes() = " << pph_total_size
+       << endl
+       << "pph.external_memory_in_bytes() = " << pph_external_size
+       << endl
+       << "pqh.total_memory_in_bytes() = " << pqh_total_size
+       << endl
+       << "pqh.external_memory_in_bytes() = " << pqh_external_size
+       << endl
+       << "prh.total_memory_in_bytes() = " << prh_total_size
+       << endl
+       << "prh.external_memory_in_bytes() = " << prh_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8A(test02);
+END_MAIN
diff --git a/tests/Polyhedron/membytes2.cc b/tests/Polyhedron/membytes2.cc
deleted file mode 100644
index f729bdc..0000000
--- a/tests/Polyhedron/membytes2.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-int
-main() TRY {
-  set_handlers();
-
-  Variable x(0);
-  Variable y(1);
-  Variable z(2);
-
-  C_Polyhedron ph(3);
-  ph.add_constraint(4*x - 2*y - z + 14 >= 0);
-  ph.add_constraint(4*x + 2*y - z + 2 >= 0);
-  ph.add_constraint(x + y - 1 >= 0);
-  ph.add_constraint(x + y + 2*z - 5 >= 0);
-
-  const memory_size_type ph_total_size = ph.total_memory_in_bytes();
-  const memory_size_type ph_external_size = ph.external_memory_in_bytes();
-
-  Determinate<C_Polyhedron> dph(ph);
-
-  const memory_size_type dph_total_size = dph.total_memory_in_bytes();
-  const memory_size_type dph_external_size = dph.external_memory_in_bytes();
-
-  nout << "ph.total_memory_in_bytes() = " << ph_total_size
-       << endl
-       << "ph.external_memory_in_bytes() = " << ph_external_size
-       << endl
-       << "dph.total_memory_in_bytes() = " << dph_total_size
-       << endl
-       << "dph.external_memory_in_bytes() = " << dph_external_size
-       << endl;
-
-  Polyhedra_Powerset<C_Polyhedron> pph(ph);
-
-  C_Polyhedron qh(3);
-  qh.add_constraint(x >= 0);
-  qh.add_constraint(y >= 0);
-  qh.add_constraint(z >= 0);
-  qh.add_constraint(x <= 1);
-  qh.add_constraint(y <= 1);
-  qh.add_constraint(z <= 1);
-  Polyhedra_Powerset<C_Polyhedron> pqh(qh);
-
-  Polyhedra_Powerset<C_Polyhedron> prh = pqh;
-  prh.poly_difference_assign(pph);
-
-  const memory_size_type pph_total_size = pph.total_memory_in_bytes();
-  const memory_size_type pph_external_size = pph.external_memory_in_bytes();
-  const memory_size_type pqh_total_size = pqh.total_memory_in_bytes();
-  const memory_size_type pqh_external_size = pqh.external_memory_in_bytes();
-  const memory_size_type prh_total_size = prh.total_memory_in_bytes();
-  const memory_size_type prh_external_size = prh.external_memory_in_bytes();
-
-  nout << "pph.total_memory_in_bytes() = " << pph_total_size
-       << endl
-       << "pph.external_memory_in_bytes() = " << pph_external_size
-       << endl
-       << "pqh.total_memory_in_bytes() = " << pqh_total_size
-       << endl
-       << "pqh.external_memory_in_bytes() = " << pqh_external_size
-       << endl
-       << "prh.total_memory_in_bytes() = " << prh_total_size
-       << endl
-       << "prh.external_memory_in_bytes() = " << prh_external_size
-       << endl;
-
-  return 0;
-}
-CATCH
diff --git a/tests/Polyhedron/memory1.cc b/tests/Polyhedron/memory1.cc
index f210872..d462f5e 100644
--- a/tests/Polyhedron/memory1.cc
+++ b/tests/Polyhedron/memory1.cc
@@ -1,11 +1,11 @@
 /* Test the allocation error recovery facility of the library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,32 +25,32 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <cstring>
 #include <cerrno>
 
-#ifdef HAVE_SYS_TYPES_H
+#ifdef PPL_HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
 
-#ifdef HAVE_SYS_TIME_H
+#ifdef PPL_HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_RESOURCE_H
+#ifdef PPL_HAVE_SYS_RESOURCE_H
 // This should be included after <time.h> and <sys/time.h> so as to make
 // sure we have the definitions for, e.g., `ru_utime'.
 # include <sys/resource.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
+#ifdef PPL_HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 
 // If GMP does not support exceptions the test is pointless.
 // Cygwin has an almost dummy definition of setrlimit().
 // For some reason, this test does not work on Alpha machines.
-#if !GMP_SUPPORTS_EXCEPTIONS				\
-  || defined(__CYGWIN__)				\
-  || defined(__alpha)					\
-  || !(HAVE_DECL_RLIMIT_DATA || HAVE_DECL_RLIMIT_RSS	\
-       || HAVE_DECL_RLIMIT_VMEM || HAVE_DECL_RLIMIT_AS)
+#if !PPL_GMP_SUPPORTS_EXCEPTIONS					\
+  || defined(__CYGWIN__)					\
+  || defined(__alpha)						\
+  || !(PPL_HAVE_DECL_RLIMIT_DATA || PPL_HAVE_DECL_RLIMIT_RSS	\
+       || PPL_HAVE_DECL_RLIMIT_VMEM || PPL_HAVE_DECL_RLIMIT_AS)
 
 int
 main() TRY {
@@ -58,7 +58,7 @@ main() TRY {
 }
 CATCH
 
-#else // GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
+#else // PPL_GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
 
 namespace {
 
@@ -74,34 +74,34 @@ compute_open_hypercube_generators(dimension_type dimension) {
 }
 
 #define LIMIT(WHAT) \
-do { \
-  if (getrlimit(WHAT, &t) != 0) { \
-    std::cerr << "getrlimit failed: " << strerror(errno) << endl;	\
-    exit(1); \
-  } \
-  t.rlim_cur = bytes; \
-  if (setrlimit(WHAT, &t) != 0) { \
-    std::cerr << "setrlimit failed: " << strerror(errno) << endl;	\
-    exit(1); \
-  } \
-} while (0)
+  do {									\
+    if (getrlimit(WHAT, &t) != 0) {					\
+      std::cerr << "getrlimit failed: " << strerror(errno) << endl;	\
+      exit(1);								\
+    }									\
+    t.rlim_cur = bytes;							\
+    if (setrlimit(WHAT, &t) != 0) {					\
+      std::cerr << "setrlimit failed: " << strerror(errno) << endl;	\
+      exit(1);								\
+    }									\
+  } while (0)
 
 void
 limit_memory(unsigned long bytes) {
   struct rlimit t;
-#if HAVE_DECL_RLIMIT_DATA
+#if PPL_HAVE_DECL_RLIMIT_DATA
   // Limit heap size.
   LIMIT(RLIMIT_DATA);
 #endif
-#if HAVE_DECL_RLIMIT_RSS
+#if PPL_HAVE_DECL_RLIMIT_RSS
   // Limit resident set size.
   LIMIT(RLIMIT_RSS);
 #endif
-#if HAVE_DECL_RLIMIT_VMEM
+#if PPL_HAVE_DECL_RLIMIT_VMEM
   // Limit mapped memory (brk + mmap).
   LIMIT(RLIMIT_VMEM);
 #endif
-#if HAVE_DECL_RLIMIT_AS
+#if PPL_HAVE_DECL_RLIMIT_AS
   // Limit virtual memory.
   LIMIT(RLIMIT_AS);
 #endif
@@ -192,4 +192,4 @@ main() TRY {
 }
 CATCH
 
-#endif // GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
+#endif // PPL_GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
diff --git a/tests/Polyhedron/memory2.cc b/tests/Polyhedron/memory2.cc
index a4d55e2..8dfd4e8 100644
--- a/tests/Polyhedron/memory2.cc
+++ b/tests/Polyhedron/memory2.cc
@@ -1,11 +1,11 @@
 /* Test the allocation error recovery facility of the library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,7 +25,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <limits>
 
 // If GMP does not support exceptions the test is pointless.
-#if !GMP_SUPPORTS_EXCEPTIONS
+#if !PPL_GMP_SUPPORTS_EXCEPTIONS
 
 int
 main() TRY {
@@ -33,7 +33,7 @@ main() TRY {
 }
 CATCH
 
-#else // GMP_SUPPORTS_EXCEPTIONS
+#else // PPL_GMP_SUPPORTS_EXCEPTIONS
 
 namespace {
 
@@ -196,12 +196,12 @@ test3() {
 
 } // namespace
 
-#define IGNORE_OVERFLOWS(fun) \
-try { \
-  fun; \
-} \
-catch (const std::overflow_error&) { \
-}
+#define IGNORE_OVERFLOWS(fun)			\
+  try {						\
+    fun;					\
+  }						\
+  catch (const std::overflow_error&) {		\
+  }
 
 int
 main() TRY {
@@ -219,4 +219,4 @@ main() TRY {
 }
 CATCH
 
-#endif // GMP_SUPPORTS_EXCEPTIONS
+#endif // PPL_GMP_SUPPORTS_EXCEPTIONS
diff --git a/tests/Polyhedron/minconstraints1.cc b/tests/Polyhedron/minconstraints1.cc
index 22cac6f..9ee7870 100644
--- a/tests/Polyhedron/minconstraints1.cc
+++ b/tests/Polyhedron/minconstraints1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::minimized_constraints().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/minconstraints2.cc b/tests/Polyhedron/minconstraints2.cc
index 14c671a..6d0c5df 100644
--- a/tests/Polyhedron/minconstraints2.cc
+++ b/tests/Polyhedron/minconstraints2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::minimized_constraints().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/mingenerators1.cc b/tests/Polyhedron/mingenerators1.cc
index 23e7fa7..ebb77f4 100644
--- a/tests/Polyhedron/mingenerators1.cc
+++ b/tests/Polyhedron/mingenerators1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::minimized_generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/mingenerators2.cc b/tests/Polyhedron/mingenerators2.cc
index df77663..278d4f3 100644
--- a/tests/Polyhedron/mingenerators2.cc
+++ b/tests/Polyhedron/mingenerators2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::minimized_generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/nncminimize1.cc b/tests/Polyhedron/nncminimize1.cc
index 7dd050f..2274ded 100644
--- a/tests/Polyhedron/nncminimize1.cc
+++ b/tests/Polyhedron/nncminimize1.cc
@@ -1,11 +1,11 @@
 /* Test minimization of NNC polyhedra.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -52,7 +52,7 @@ test01() {
 
   ph.add_constraints_and_minimize(cs);
 
-  nout << "After vertices removal" << endl;
+  nout << "After vertices removal:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -75,7 +75,7 @@ test01() {
   const Generator_System& min_gs = ph.minimized_generators();
   bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
 
-  nout << "After NNC minimization" << endl;
+  nout << "After NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -109,7 +109,7 @@ test02() {
 
   ph.add_constraints_and_minimize(cs);
 
-  nout << "After vertices removal" << endl;
+  nout << "After vertices removal:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -132,7 +132,7 @@ test02() {
   const Generator_System& min_gs = ph.minimized_generators();
   bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
 
-  nout << "After NNC minimization" << endl;
+  nout << "After NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
   nout << endl;
@@ -170,7 +170,7 @@ test03() {
 
   ph.add_constraints_and_minimize(cs);
 
-  nout << "After vertices removal" << endl;
+  nout << "After vertices removal:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -184,7 +184,7 @@ test03() {
 
   ph.intersection_assign(ph2);
 
-  nout << "After intersection" << endl;
+  nout << "After intersection:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -202,7 +202,7 @@ test03() {
   const Generator_System& min_gs = ph.minimized_generators();
   bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 4);
 
-  nout << "After NNC minimization" << endl;
+  nout << "After NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -237,13 +237,13 @@ test04() {
 
   NNC_Polyhedron ph(gs);
 
-  nout << endl << "Before NNC minimization" << endl;
+  nout << endl << "Before NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
   ph.minimized_constraints();
 
-  nout << endl << "After NNC minimization" << endl;
+  nout << endl << "After NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -301,7 +301,7 @@ test05() {
   const int num_minimized_constraints = std::distance(ph1_min_cs.begin(),
 						      ph1_min_cs.end());
 
-  print_constraints(ph1, "*** After ph1.minimized_constraints() ***");
+  print_constraints(ph1, "*** after ph1.minimized_constraints() ***");
   nout << "num_constraints = " << num_constraints << endl;
   nout << "num_minimized_constraints = "
        << num_minimized_constraints << endl;
@@ -324,7 +324,7 @@ test05() {
 	     && num_points == num_minimized_points + 1);
 
   print_generators(copy_ph1,
-		   "*** After copy_ph1_minimized_generators() ***");
+		   "*** after copy_ph1_minimized_generators() ***");
   nout << "num_points = " << num_points << endl;
   nout << "num_minimized_points = "
        << num_minimized_points << endl;
@@ -347,7 +347,7 @@ test06() {
 
   ph.add_constraints(cs);
 
-  nout << endl << "Before NNC minimization" << endl;
+  nout << endl << "Before NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
@@ -359,7 +359,7 @@ test06() {
 
   bool ok = (ph == known_result);
 
-  nout << endl << "After NNC minimization" << endl;
+  nout << endl << "After NNC minimization:" << endl;
   print_constraints(ph.constraints(), "*** ph constraints ***");
   print_generators(ph.generators(), "*** ph generators ***");
 
diff --git a/tests/Polyhedron/nncminimize2.cc b/tests/Polyhedron/nncminimize2.cc
index 5b2f9de..8da1478 100644
--- a/tests/Polyhedron/nncminimize2.cc
+++ b/tests/Polyhedron/nncminimize2.cc
@@ -1,11 +1,11 @@
 /* Test NNC_Polyhedron::ph.minimized_generators().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/numberinput1.cc b/tests/Polyhedron/numberinput1.cc
index e0d718f..8a3a981 100644
--- a/tests/Polyhedron/numberinput1.cc
+++ b/tests/Polyhedron/numberinput1.cc
@@ -1,11 +1,11 @@
 /* Test number input.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -30,18 +30,18 @@ namespace {
 using namespace Checked;
 
 struct Test_Extended_Number_Policy {
-  static const int check_overflow = 1;
-  static const int check_inf_add_inf = 0;
-  static const int check_inf_sub_inf = 0;
-  static const int check_inf_mul_zero = 0;
-  static const int check_div_zero = 0;
-  static const int check_inf_div_inf = 0;
-  static const int check_inf_mod = 0;
-  static const int check_sqrt_neg = 0;
-  static const int handle_nan = 1;
-  static const int handle_infinity = 1;
-  static const int fpu_check_inexact = 0;
-  static const int check_nan_args = 1;
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+  const_bool_nodef(fpu_check_inexact, false);
+  const_bool_nodef(check_nan_result, true);
   static const Rounding_Dir ROUND_DEFAULT = ROUND_UP;
   static void handle_result(Result r);
 };
@@ -71,16 +71,16 @@ aux_test(std::string input_string,
 	     && residual == expected_residual
 	     && output == expected_output);
 
-  nout << "input = " << input_string
+  nout << "input = \"" << input_string << "\""
        << endl
        << "expected result = " << expected_result
        << ", actual result = " << result
        << endl
-       << "expected value = " << expected_output
-       << ", actual value = " << output
+       << "expected value = \"" << expected_output << "\""
+       << ", actual value = \"" << output << "\""
        << endl
-       << "expected residual = " << expected_residual
-       << ", actual residual = " << residual
+       << "expected residual = \"" << expected_residual << "\""
+       << ", actual residual = \"" << residual << "\""
        << endl;
 
   return ok;
diff --git a/tests/Polyhedron/onepoint.cc b/tests/Polyhedron/onepoint.cc
index a16680b..f7ca4a2 100644
--- a/tests/Polyhedron/onepoint.cc
+++ b/tests/Polyhedron/onepoint.cc
@@ -1,11 +1,11 @@
 /* Creation of a one-point polyhedron.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/permute.cc b/tests/Polyhedron/permute.cc
index c593207..447eb10 100644
--- a/tests/Polyhedron/permute.cc
+++ b/tests/Polyhedron/permute.cc
@@ -1,11 +1,11 @@
 /* An example of iteration to a post-fixpoint.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -100,7 +100,7 @@ fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
 
     current.poly_hull_assign_and_minimize(previous);
 
-    print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+    print_constraints(current, "*** after poly_hull_assign_and_minimize ***");
 
     current.H79_widening_assign(previous);
 
diff --git a/tests/Polyhedron/polydifference1.cc b/tests/Polyhedron/polydifference1.cc
index 86034ac..4d78e8e 100644
--- a/tests/Polyhedron/polydifference1.cc
+++ b/tests/Polyhedron/polydifference1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::poly_difference_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -66,7 +66,7 @@ test01() {
 
   bool ok = (computed_result == known_result);
 
-  print_generators(computed_result, "*** After poly_difference_assign ***");
+  print_generators(computed_result, "*** after poly_difference_assign ***");
   print_generators(known_result, "*** known_result ***");
 
   return ok;
@@ -88,7 +88,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
 
   return ok;
 }
@@ -118,7 +118,7 @@ test03() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
 
   return ok;
 }
@@ -142,8 +142,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1,
-		    "**After ph1.poly_difference_assign(ph2)**");
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
 
   return ok;
 }
@@ -166,7 +165,7 @@ test05() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
 
   return ok;
 }
@@ -189,7 +188,7 @@ test06() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
 
   return ok;
 }
@@ -209,14 +208,14 @@ aux_test07(int lx, int ly, int dx, int dy) {
 
 bool
 test07() {
-  Polyhedra_Powerset<C_Polyhedron> cross(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> cross(2, EMPTY);
   cross.add_disjunct(aux_test07(0, 3, 9, 3));
   cross.add_disjunct(aux_test07(3, 0, 3, 9));
 
   using namespace IO_Operators;
   nout << "cross = " << cross << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> squares(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> squares(2, EMPTY);
   squares.add_disjunct(aux_test07(1, 4, 1, 1));
   squares.add_disjunct(aux_test07(4, 4, 1, 1));
   squares.add_disjunct(aux_test07(7, 4, 1, 1));
@@ -225,21 +224,21 @@ test07() {
 
   nout << "squares = " << squares << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> difference = cross;
+  Pointset_Powerset<C_Polyhedron> difference = cross;
   difference.poly_difference_assign(squares);
 
   nout << "cross - squares = " << difference << endl;
 
-  Polyhedra_Powerset<C_Polyhedron> intersection = difference;
+  Pointset_Powerset<C_Polyhedron> intersection = difference;
   intersection.meet_assign(squares);
 
   nout << "(cross - squares) inters squares = " << intersection << endl;
 
-  // When using Polyhedra_Powerset<NNC_Polyhedron>, intersection will be
-  // empty.  When using Polyhedra_Powerset<C_Polyhedron>,
+  // When using Pointset_Powerset<NNC_Polyhedron>, intersection will be
+  // empty.  When using Pointset_Powerset<C_Polyhedron>,
   // intersection will consist of objects of affine dimension at most 1.
   bool ok1 = true;
-  for (Polyhedra_Powerset<C_Polyhedron>::const_iterator
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator
 	 i = intersection.begin(), in_end = intersection.end();
        i != in_end; ++i)
     if (i->element().affine_dimension() > 1) {
@@ -248,7 +247,7 @@ test07() {
       ok1 = false;
     }
 
-  Polyhedra_Powerset<C_Polyhedron> re_union = difference;
+  Pointset_Powerset<C_Polyhedron> re_union = difference;
   re_union.upper_bound_assign(squares);
 
   nout << "(cross - squares) union squares = " << re_union << endl;
diff --git a/tests/Polyhedron/polydifference2.cc b/tests/Polyhedron/polydifference2.cc
index 98979bd..038c3ea 100644
--- a/tests/Polyhedron/polydifference2.cc
+++ b/tests/Polyhedron/polydifference2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::poly_difference_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -60,7 +60,7 @@ test01() {
 
   bool ok = (computed_result == known_result);
 
-  print_generators(computed_result, "*** After poly_difference_assign ***");
+  print_generators(computed_result, "*** after poly_difference_assign ***");
   print_generators(known_result, "*** known_result ***");
 
   return ok;
@@ -91,7 +91,7 @@ test02() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
 
   return ok;
 }
@@ -135,16 +135,41 @@ test03() {
 
   bool ok = (computed_result == known_result);
 
-  print_constraints(computed_result, "*** After poly_difference_assign ***");
+  print_constraints(computed_result, "*** after poly_difference_assign ***");
   print_constraints(known_result, "*** known_result ***");
 
   return ok;
 }
 
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(A >= 1);
+  ph2.add_constraint(A <= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.poly_difference_assign(ph2);
+
+  C_Polyhedron known_result(1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.poly_difference_assign(ph2) ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
   DO_TEST(test01);
   DO_TEST(test02);
   DO_TEST(test03);
+  DO_TEST(test04);
 END_MAIN
diff --git a/tests/Polyhedron/polyhull1.cc b/tests/Polyhedron/polyhull1.cc
index 9576c94..ca57f1d 100644
--- a/tests/Polyhedron/polyhull1.cc
+++ b/tests/Polyhedron/polyhull1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::poly_hull_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -92,8 +92,8 @@ test02() {
 	     && computed_result2 == known_result);
 
   print_generators(computed_result1,
-		   "*** After poly_hull_assign_and_minimize ***");
-  print_generators(computed_result2, "*** After poly_hull_assign ***");
+		   "*** after poly_hull_assign_and_minimize ***");
+  print_generators(computed_result2, "*** after poly_hull_assign ***");
 
   return ok;
 }
@@ -120,7 +120,7 @@ test03() {
 
   ph1.poly_hull_assign(ph2);
 
-  print_generators(ph1, "*** After poly_hull_assign ***");
+  print_generators(ph1, "*** after poly_hull_assign ***");
 
   C_Polyhedron known_result(2, EMPTY);
   known_result.add_generator(point());
@@ -142,7 +142,7 @@ aux_test04(C_Polyhedron& ph1, const C_Polyhedron& ph2,
 
   ph1.poly_hull_assign_and_minimize(ph2);
 
-  print_generators(ph1, "*** After poly_hull_assign ***");
+  print_generators(ph1, "*** after poly_hull_assign ***");
 
   return ph1 == known_result;
 }
@@ -194,7 +194,7 @@ test05() {
   bool ok = (ph1 == known_result);
 
   print_generators(ph1,
-		   "*** After ph1.poly_hull_assign_and_minimize(ph2) ***");
+		   "*** after ph1.poly_hull_assign_and_minimize(ph2) ***");
 
   return ok;
 }
@@ -214,7 +214,7 @@ test06() {
   bool ok = (ph1 == known_result);
 
   print_generators(ph1,
-		   "*** After ph1.poly_hull_assign_and_minimize(ph2) ***");
+		   "*** after ph1.poly_hull_assign_and_minimize(ph2) ***");
 
   return ok;
 }
@@ -250,7 +250,7 @@ test07() {
   bool ok = (ph1 == known_result);
 
   print_generators(ph1,
-		   "*** After ph1.poly_hull_assugn_and_minimize(ph2) ***");
+		   "*** after ph1.poly_hull_assign_and_minimize(ph2) ***");
 
   return ok;
 }
@@ -273,7 +273,7 @@ test08() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_hull_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_hull_assign(ph2) ***");
 
   return ok;
 }
@@ -292,7 +292,7 @@ test09() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.poly_hull_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.poly_hull_assign(ph2) ***");
 
   return ok;
 }
@@ -320,9 +320,9 @@ test10() {
 
   bool ok = (ph1 == copy_ph1);
 
-  print_generators(ph1, "*** After poly_hull_assign ***");
+  print_generators(ph1, "*** after poly_hull_assign ***");
   print_generators(copy_ph1,
-		    "*** After poly_hull_assign_and_minimize ***");
+		    "*** after poly_hull_assign_and_minimize ***");
 
   return ok;
 }
@@ -354,9 +354,9 @@ test11() {
 
   bool ok = (ph1 == copy_ph1);
 
-  print_generators(ph1, "*** After poly_hull_assign ***");
+  print_generators(ph1, "*** after poly_hull_assign ***");
   print_generators(copy_ph1,
-		    "*** After poly_hull_assign_and_minimize ***");
+		    "*** after poly_hull_assign_and_minimize ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/polyhull2.cc b/tests/Polyhedron/polyhull2.cc
index 9010abe..54e8ec0 100644
--- a/tests/Polyhedron/polyhull2.cc
+++ b/tests/Polyhedron/polyhull2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::poly_hull_assign_and_minimize().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/polypowerset1.cc b/tests/Polyhedron/polypowerset1.cc
deleted file mode 100644
index 6f4ca8a..0000000
--- a/tests/Polyhedron/polypowerset1.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-/* Test Polyhedra_Powerset<PH>.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-
-namespace {
-
-bool
-test01() {
-  Constraint_System cs = Constraint_System::zero_dim_empty();
-  Polyhedra_Powerset<C_Polyhedron> ps(cs);
-  return ps.OK();
-}
-
-bool
-test02() {
-  Variable x(0);
-  Constraint_System cs;
-  Polyhedra_Powerset<NNC_Polyhedron> nnc_ps(1, EMPTY);
-
-  cs.clear();
-  cs.insert(x > 0);
-  cs.insert(x <= 1);
-  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 0);
-  cs.insert(x < 1);
-  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps(nnc_ps);
-
-  return c_ps.OK();
-}
-
-bool
-test03() {
-  Variable x(0);
-  Constraint_System cs;
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-
-  cs.clear();
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  c_ps.add_constraint(x == 1);
-
-  Polyhedra_Powerset<NNC_Polyhedron> nnc_ps(c_ps);
-
-  return nnc_ps.OK();
-}
-
-bool
-test04() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  c_ps.concatenate_assign(c_ps);
-
-  return c_ps.OK();
-}
-
-bool
-test05() {
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-
-  bool ok = c_ps.is_bottom();
-
-  c_ps.add_disjunct(C_Polyhedron(1, UNIVERSE));
-
-  bool ok1 = c_ps.is_top();
-
-  c_ps.total_memory_in_bytes();
-  c_ps.external_memory_in_bytes();
-
-  return ok && ok1;
-}
-
-bool
-test06() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
-  Constraint_System cs1;
-  cs1.insert(x >= 0);
-  cs1.insert(x <= 2);
-  c_ps1.add_disjunct(C_Polyhedron(cs1));
-
-  bool ok = c_ps1.definitely_entails(c_ps);
-
-  return ok;
-}
-
-bool
-test07() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  bool ok = (c_ps.size() == 2);
-
-  return ok;
-}
-
-bool
-test08() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-  c_ps.omega_reduce();
-
-  bool ok = (c_ps.size() == 1);
-
-  return ok;
-}
-
-bool
-test09() {
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  bool ok = (c_ps.space_dimension() == 1);
-  return ok;
-}
-
-bool
-test10() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  Constraint_System cs1 = cs;
-  c_ps.add_disjunct(C_Polyhedron(cs));
-  c_ps.drop_disjunct(c_ps.begin());
-
-  bool ok = c_ps.empty();
-
-  Constraint_System cs2 = cs1;
-  c_ps.add_disjunct(C_Polyhedron(cs1));
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-  c_ps.drop_disjuncts(c_ps.begin(), c_ps.end());
-
-  bool ok1 = c_ps.empty();
-
-  return ok && ok1;
-}
-
-bool
-test11() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps1;
-  c_ps1 = c_ps;
-
-  bool ok = !c_ps.empty();
-  return ok;
-}
-
-bool
-test12() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
-  c_ps.swap(c_ps1);
-
-  bool ok = (c_ps.empty() && !c_ps1.empty());
-  return ok;
-}
-
-bool
-test13() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
-  c_ps1.add_disjunct(C_Polyhedron(cs));
-  c_ps.least_upper_bound_assign(c_ps1);
-
-  cs.clear();
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
-  c_ps2.add_disjunct(C_Polyhedron(cs));
-
-  bool ok = c_ps.definitely_entails(c_ps2);
-  bool ok1 = !c_ps2.definitely_entails(c_ps);
-
-  return ok && ok1;
-}
-
-bool
-test14() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
-  c_ps1.add_disjunct(C_Polyhedron(cs));
-  c_ps.upper_bound_assign(c_ps1);
-
-  cs.clear();
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
-  c_ps2.add_disjunct(C_Polyhedron(cs));
-
-  bool ok = c_ps.definitely_entails(c_ps2);
-  bool ok1 = !c_ps2.definitely_entails(c_ps);
-
-  return ok && ok1;
-}
-
-bool
-test15() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-
-  c_ps.meet_assign(c_ps1);
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 2);
-  Polyhedra_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
-  c_ps_expected.add_disjunct(C_Polyhedron(cs));
-
-  bool ok = c_ps.definitely_entails(c_ps_expected);
-  bool ok1 = !c_ps_expected.definitely_entails(c_ps);
-
-  return ok && ok1;
-}
-
-bool
-test16() {
-  Variable x(0);
-  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
-  Constraint_System cs;
-
-  cs.insert(x >= 0);
-  cs.insert(x <= 2);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  cs.clear();
-  cs.insert(x >= 1);
-  cs.insert(x <= 3);
-  c_ps.add_disjunct(C_Polyhedron(cs));
-
-  c_ps.collapse();
-
-  cs.clear();
-  cs.insert(x >= 0);
-  cs.insert(x <= 3);
-  Polyhedra_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
-  c_ps_expected.add_disjunct(C_Polyhedron(cs));
-
-  bool ok = c_ps.definitely_entails(c_ps_expected);
-  bool ok1 = c_ps_expected.definitely_entails(c_ps);
-  bool ok2 = (c_ps.size() == 1);
-
-  return ok && ok1 && ok2;
-}
-
-} // namespace
-
-BEGIN_MAIN
-  DO_TEST(test01);
-  DO_TEST(test02);
-  DO_TEST(test03);
-  DO_TEST(test04);
-  DO_TEST(test05);
-  DO_TEST(test06);
-  DO_TEST(test07);
-  DO_TEST(test08);
-  DO_TEST(test09);
-  DO_TEST(test10);
-  DO_TEST(test11);
-  DO_TEST(test12);
-  DO_TEST(test13);
-  DO_TEST(test14);
-  DO_TEST(test15);
-  DO_TEST(test16);
-END_MAIN
diff --git a/tests/Polyhedron/powerset1.cc b/tests/Polyhedron/powerset1.cc
deleted file mode 100644
index 43ebc31..0000000
--- a/tests/Polyhedron/powerset1.cc
+++ /dev/null
@@ -1,249 +0,0 @@
-/* Test Powerset<CS>.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-#include <algorithm>
-#include <set>
-
-namespace {
-
-class Fcaibvp;
-
-bool operator==(const Fcaibvp& x, const Fcaibvp& y);
-bool operator!=(const Fcaibvp& x, const Fcaibvp& y);
-
-std::ostream& operator<<(std::ostream& s, const Fcaibvp& x);
-
-// A class for representing Finite Conjunctions of Attribute
-// Independent Boolean Variable Properties.
-class Fcaibvp {
-private:
-  typedef Variable::Compare Compare;
-  typedef std::set<Variable, Compare> Set;
-
-  Set set;
-
-public:
-  Fcaibvp()
-    : set() {
-  }
-
-  explicit Fcaibvp(const Variable& x)
-    : set() {
-    set.insert(x);
-  }
-
-  memory_size_type total_memory_in_bytes() const {
-    return 1;
-  }
-
-  bool is_top() const {
-    return set.empty();
-  }
-
-  bool is_bottom() const {
-    return false;
-  }
-
-  bool definitely_entails(const Fcaibvp& y) const{
-    const Fcaibvp& x = *this;
-    return std::includes(x.set.begin(), x.set.end(),
-			 y.set.begin(), y.set.end(),
-			 Compare());
-  }
-
-  void upper_bound_assign(const Fcaibvp& y) {
-    set.insert(y.set.begin(), y.set.end());
-  }
-
-  void meet_assign(const Fcaibvp& y) {
-    Fcaibvp& x = *this;
-    Fcaibvp z;
-    std::set_intersection(x.set.begin(), x.set.end(),
-			  y.set.begin(), y.set.end(),
-			  std::inserter(z.set, z.set.begin()),
-			  Compare());
-    std::swap(x, z);
-  }
-
-  bool OK() const {
-    return true;
-  }
-
-  friend std::ostream& operator<<(std::ostream& s, const Fcaibvp& x);
-};
-
-std::ostream&
-operator<<(std::ostream& s, const Fcaibvp& x) {
-  s << "{";
-  for (Fcaibvp::Set::const_iterator i = x.set.begin(),
-	 x_end = x.set.end(); i != x_end; ++i) {
-    const Variable& v = *i;
-#if 0 // Old compilers may not understand the following.
-    using IO_Operators::operator<<;
-    s << v;
-#else
-    Parma_Polyhedra_Library::IO_Operators::operator<<(s, v);
-#endif
-    if (i != x_end)
-      s << ", ";
-  }
-  s << "}";
-  return s;
-}
-
-bool
-operator==(const Fcaibvp& x, const Fcaibvp& y) {
-  return x.definitely_entails(y) && y.definitely_entails(x);
-}
-
-bool
-operator!=(const Fcaibvp& x, const Fcaibvp& y) {
-  return !(x == y);
-}
-
-} // namespace
-
-int
-main() TRY {
-  set_handlers();
-
-  // Use every public Powerset method.
-
-  typedef Powerset<Fcaibvp> PS;
-
-  Variable A(0);
-
-  PS ps1;
-  ps1.add_disjunct(Fcaibvp(A));
-
-  PS ps2 = ps1;
-
-  if (ps2 != ps1 || !(ps2 == ps1))
-    exit(1);
-
-  using namespace Parma_Polyhedra_Library::IO_Operators;
-  nout << "ps1:" << std::endl << ps1 << std::endl;
-
-  Fcaibvp d(A);
-  PS ps3(d);
-
-  if (!ps1.definitely_entails(ps3))
-    exit(1);
-
-  if (ps3.is_top())
-    exit(1);
-
-  if (ps1.is_bottom())
-    exit(1);
-
-  nout << "Total memory: " << ps3.total_memory_in_bytes() << std::endl
-       << "External memory: " << ps3.external_memory_in_bytes() << std::endl;
-
-  ps3.omega_reduce();
-
-  if (ps3.size() == 0)
-    exit(1);
-
-  if (ps3.empty())
-    exit(1);
-
-  // Iterator.
-  dimension_type count = 0;
-  for (PS::iterator i = ps3.begin(); i != ps3.end(); ++i)
-    ++count;
-  if (count != 1)
-    exit(1);
-
-  // Constant iterator.
-  count = 0;
-  for (PS::const_iterator i = ps3.begin(); i != ps3.end(); ++i)
-    ++count;
-  if (count != 1)
-    exit(1);
-
-  // Reverse iterator.
-  count = 0;
-  for (PS::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i)
-    ++count;
-  if (count != 1)
-    exit(1);
-
-  // Constant reverse iterator.
-  count = 0;
-  for (PS::const_reverse_iterator i = ps3.rbegin(),
-	 ps3_rend = ps3.rend(); i != ps3_rend; ++i)
-    ++count;
-  if (count != 1)
-    exit(1);
-
-  // Omega iterator typedef.
-  count = 0;
-  for (PS::omega_iterator i = ps3.begin(); i != ps3.end(); ++i)
-    ++count;
-  if (count != 1)
-    exit(1);
-
-  ps2 = ps3;
-  PS ps_empty;
-  ps2.drop_disjunct(ps2.begin());
-  if (ps2 != ps_empty)
-    exit(1);
-
-  ps2 = ps3;
-  ps2.drop_disjuncts(ps2.begin(),ps2.end());
-  if (ps2 != ps_empty)
-    exit(1);
-
-  ps2 = ps3;
-  ps2.clear();
-  if (ps2 != ps_empty)
-    exit(1);
-
-  ps3.swap(ps2);
-  ps3.swap(ps2);
-  if (ps3 != ps1 || ps2 != ps_empty)
-    exit(1);
-
-  ps2 = ps_empty;
-  ps2.least_upper_bound_assign(ps3);
-  if (ps2 != ps3)
-    exit(1);
-
-  ps2 = ps_empty;
-  ps2.upper_bound_assign(ps3);
-  if (ps2 != ps3)
-    exit(1);
-
-  Variable B(1);
-  ps2 = ps1;
-  ps2.meet_assign(ps3);
-  if (ps2 != ps3)
-    exit(1);
-
-  ps3.collapse();
-  if (ps3.size() != 1)
-    exit(1);
-
-  return 0;
-}
-CATCH
diff --git a/tests/Polyhedron/randphull1.cc b/tests/Polyhedron/randphull1.cc
index 31b8416..4bd77ac 100644
--- a/tests/Polyhedron/randphull1.cc
+++ b/tests/Polyhedron/randphull1.cc
@@ -1,11 +1,11 @@
 /* Compute poly-hulls of random polytopes.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,30 +21,32 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
+#include <vector>
+#include <cmath>
+
+#ifndef M_PI
+# define M_PI           3.14159265358979323846  /* pi */
+#endif
 
 namespace {
 
+namespace test01_namespace {
+
 int
 count_points(const C_Polyhedron& ph) {
-  if (ph.is_empty() || ph.space_dimension() == 0)
-    return 0;
-
   int count = 0;
-  const Generator_System& gs = ph.generators();
-  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
-       i != gs_end;
-       ++i)
+  const Generator_System& gs = ph.minimized_generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
     if (i->type() == Generator::POINT)
       ++count;
   return count;
 }
 
-} // namespace
-
-int
-main() TRY {
-  set_handlers();
+} // namespace test01_namespace
 
+bool
+test01() {
   // Set up a random numbers' generator.
   gmp_randclass rg(gmp_randinit_default);
 
@@ -54,15 +56,135 @@ main() TRY {
 
   const int maxc = 10000;
   C_Polyhedron ph(3, EMPTY);
-  nout << count_points(ph) << endl;
+  nout << test01_namespace::count_points(ph) << endl;
   for (int n = 1; n <= 200; ++n) {
     const Coefficient cx = mpz_class(rg.get_z_range(maxc));
     const Coefficient cy = mpz_class(rg.get_z_range(maxc));
     const Coefficient cz = mpz_class(rg.get_z_range(maxc));
-    ph.add_generator(point(cx*x + cy*y + cz*z));
-    nout << count_points(ph) << endl;
+    if (!ph.add_generator_and_minimize(point(cx*x + cy*y + cz*z)))
+      return false;
+    nout << test01_namespace::count_points(ph) << endl;
   }
+  return true;
+}
+
 
-  return 0;
+namespace test02_namespace {
+
+// Compute random polytopes by generating points on the surface
+// of an n-dimensional sphere.
+
+// Please note: the following function picks up random point on the
+// n-dimensional sphere, but they are not uniformly distributed.
+// See the following paper on how to obtain a uniform distribution:
+
+// J. S. Hicks, R. F. Wheeling.
+// An efficient method for generating uniformly distributed points
+// on the surface of an n-dimensional sphere,
+// Communications of the ACM, Volume 2, Issue 4, pp. 17-19, April 1959.
+//
+// M. E. Muller.
+// A note on a method for generating points uniformly on n-dimensional spheres,
+// Communications of the ACM, Volume 2 Issue 4, pp. 19-20, April 1959.
+//
+// G. F. Schrack.
+// Remark on algorithm 381 [G5],
+// Communications of the ACM, Volume 15 Issue 6, p. 468, June 1972.
+
+void
+point_on_the_unit_n_sphere(unsigned n,
+			   const std::vector<float>& theta,
+			   std::vector<float>& coordinate) {
+  assert(n >= 2);
+  if (n == 2) {
+    coordinate[0] *= sin(theta[0]);
+    coordinate[1] *= cos(theta[0]);
+  }
+  else {
+    point_on_the_unit_n_sphere(n-1, theta, coordinate);
+    float sin_theta_n_2 = sin(theta[n-2]);
+    for (unsigned i = n-1; i-- > 0; )
+      coordinate[i] *= sin_theta_n_2;
+    coordinate[n-1] *= cos(theta[n-2]);
+  }
 }
-CATCH
+
+void
+random_polytope(C_Polyhedron& ph,
+		unsigned dimension,
+		unsigned num_points,
+		float radius = 1.0) {
+  assert(dimension >= 2);
+
+  // This setting and resetting of the rounding mode was prompted by
+  // the GLIBC bug http://sources.redhat.com/bugzilla/show_bug.cgi?id=6869 .
+  // However, even when this bug will be fixed, we want to keep this
+  // rounding mode setting/resetting code, so that it gets tested.
+  restore_pre_PPL_rounding();
+
+  std::vector<float> theta(dimension-1);
+  std::vector<float> coordinate(dimension);
+
+  for (unsigned n = num_points; n > 0; --n) {
+    // Compute n-1 random angles.
+    for (unsigned i = dimension-1; i-- > 0; )
+      theta[i] = 2.0*M_PI*static_cast<double>(rand())/RAND_MAX;
+    // Compute float coordinates.
+    for (unsigned i = dimension; i-- > 0; )
+      coordinate[i] = radius;
+    point_on_the_unit_n_sphere(dimension, theta, coordinate);
+
+    Linear_Expression le;
+    for (unsigned i = dimension; i-- > 0; )
+      le += Variable(i)*Coefficient(coordinate[i]*1000000.0);
+    ph.add_generator(point(le));
+  }
+
+  // Restore the rounding mode as needed by the PPL.
+  set_rounding_for_PPL();
+}
+
+} // namespace test02_namespace
+
+bool
+test02() {
+  for (unsigned dimension = 2;
+#ifdef NDEBUG
+       dimension <= 6;
+#else
+       dimension <= 4;
+#endif
+       ++dimension) {
+    C_Polyhedron ph(dimension, EMPTY);
+    test02_namespace::random_polytope(ph, dimension, dimension*dimension);
+    // Count the number of constraints.
+    const Constraint_System& cs = ph.minimized_constraints();
+    unsigned num_constraints = 0;
+    for (Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i)
+      ++num_constraints;
+    // Count the number of generators.
+    const Generator_System& gs = ph.minimized_generators();
+    unsigned num_points = 0;
+    for (Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i)
+      if (i->type() == Generator::POINT)
+	++num_points;
+      else {
+	using namespace Parma_Polyhedra_Library::IO_Operators;
+	nout << "i->type() == " << i->type() << endl;
+	return false;
+      }
+    nout << "dimension = " << dimension
+	 << ", points = " << num_points << " (" << dimension*dimension << ")"
+	 << ", constraints = " << num_constraints << endl;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+  DO_TEST_F64(test02);
+END_MAIN
diff --git a/tests/Polyhedron/randphull2.cc b/tests/Polyhedron/randphull2.cc
deleted file mode 100644
index b41809d..0000000
--- a/tests/Polyhedron/randphull2.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Compute random polytopes by generating points on the surface
-   of an n-dimensional sphere.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
-
-This file is part of the Parma Polyhedra Library (PPL).
-
-The PPL 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.
-
-The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
-
-For the most up-to-date information see the Parma Polyhedra Library
-site: http://www.cs.unipr.it/ppl/ . */
-
-#include "ppl_test.hh"
-#include <vector>
-#include <cmath>
-
-using std::vector;
-
-using namespace Parma_Polyhedra_Library::IO_Operators;
-
-#ifndef M_PI
-# define M_PI           3.14159265358979323846  /* pi */
-#endif
-
-// Please note: the following function picks up random point on the
-// n-dimensional sphere, but they are not uniformly distributed.
-// See the following paper on how to obtain a uniform distribution:
-
-// J. S. Hicks, R. F. Wheeling.
-// An efficient method for generating uniformly distributed points
-// on the surface of an n-dimensional sphere,
-// Communications of the ACM, Volume 2, Issue 4, pp. 17-19, April 1959.
-//
-// M. E. Muller.
-// A note on a method for generating points uniformly on n-dimensional spheres,
-// Communications of the ACM, Volume 2 Issue 4, pp. 19-20, April 1959.
-//
-// G. F. Schrack.
-// Remark on algorithm 381 [G5],
-// Communications of the ACM, Volume 15 Issue 6, p. 468, June 1972.
-
-namespace {
-
-void
-point_on_the_unit_n_sphere(unsigned n,
-			   const vector<float>& theta,
-			   vector<float>& coordinate) {
-  assert(n >= 2);
-  if (n == 2) {
-    coordinate[0] *= sin(theta[0]);
-    coordinate[1] *= cos(theta[0]);
-  }
-  else {
-    point_on_the_unit_n_sphere(n-1, theta, coordinate);
-    float sin_theta_n_2 = sin(theta[n-2]);
-    for (unsigned i = n-1; i-- > 0; )
-      coordinate[i] *= sin_theta_n_2;
-    coordinate[n-1] *= cos(theta[n-2]);
-  }
-}
-
-void
-random_polytope(C_Polyhedron& ph, unsigned dimension, unsigned num_points,
-		float radius = 1.0) {
-  if (dimension < 2)
-    abort();
-
-  vector<float> theta(dimension-1);
-  vector<float> coordinate(dimension);
-
-  for (unsigned n = num_points; n > 0; --n) {
-    // Compute n-1 random angles.
-    for (unsigned i = dimension-1; i-- > 0; )
-      theta[i] = 2.0*M_PI*static_cast<double>(rand())/RAND_MAX;
-    // Compute float coordinates.
-    for (unsigned i = dimension; i-- > 0; )
-      coordinate[i] = radius;
-    point_on_the_unit_n_sphere(dimension, theta, coordinate);
-
-    Linear_Expression le;
-    for (unsigned i = dimension; i-- > 0; )
-      le += Variable(i)*Coefficient(coordinate[i]*1000000.0);
-    ph.add_generator(point(le));
-  }
-}
-
-} // namespace
-
-int
-main() TRY {
-  set_handlers();
-
-  for (int dimension = 2; dimension <= 6; ++dimension) {
-    C_Polyhedron ph(dimension, EMPTY);
-    random_polytope(ph, dimension, dimension*dimension);
-    const Constraint_System& cs = ph.constraints();
-    unsigned num_constraints = 0;
-    for (Constraint_System::const_iterator i = cs.begin(), cs_end = cs.end();
-	 i != cs_end;
-	 ++i)
-      ++num_constraints;
-    const Generator_System& gs = ph.generators();
-    unsigned num_points = 0;
-    for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
-	 i != gs_end;
-	 ++i) {
-      if (i->type() != Generator::POINT) {
-	nout << "i->type() == " << i->type() << endl;
-	exit(1);
-      }
-      ++num_points;
-    }
-
-    nout << "dimension = " << dimension
-	 << ", points = " << num_points << " (" << dimension*dimension << ")"
-	 << ", constraints = " << num_constraints << endl;
-  }
-  return 0;
-}
-CATCH
diff --git a/tests/Polyhedron/refinewithcongruence1.cc b/tests/Polyhedron/refinewithcongruence1.cc
new file mode 100644
index 0000000..3c26642
--- /dev/null
+++ b/tests/Polyhedron/refinewithcongruence1.cc
@@ -0,0 +1,105 @@
+/* Test Polyhedron::refine_with_congruence().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph1(3);
+  ph1.refine_with_congruence((A %= 0) / 2);
+  ph1.refine_with_congruence((B %= 5) / 0);
+  ph1.refine_with_congruence(A + B %= 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(ph1);
+  ph2.refine_with_congruence((A %= 1) / 0);
+  ph2.refine_with_congruence((B + C %= 4) / 5);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B == 5);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.refine_with_congruence((A %= B) / 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+                    "*** after ph.refine_with_congruence((A %= B) / 0) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_congruence((A %= 0) / 4);
+  ph.refine_with_congruence((A + B %= 2) / 5);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.refine_with_congruence((B %= 1) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B == 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+		    "*** after ph.refine_with_congruence(B >= 1) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithcongruences1.cc b/tests/Polyhedron/refinewithcongruences1.cc
new file mode 100644
index 0000000..59c93f8
--- /dev/null
+++ b/tests/Polyhedron/refinewithcongruences1.cc
@@ -0,0 +1,336 @@
+/* Test Polyhedron::refine_with_congruences().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_congruence(A %= 0);
+  ph.refine_with_congruence(B %= 0);
+
+  Congruence_System cgs;
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  C_Polyhedron known_result(2);
+
+  ph.refine_with_congruences(cgs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs1;
+  cs1.insert(A + B >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Congruence_System cgs2;
+  cgs2.insert((e %= 0) / 0);
+  ph.refine_with_congruences(cgs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.refine_with_congruences(cgs2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph(3);
+  ph.refine_with_congruence(A %= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron computed_result(3);
+
+  bool ok = (computed_result == ph);
+
+  print_constraints(computed_result,
+		    "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  Congruence_System cgs;
+  cgs.insert(A %= 4);
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron computed_result(3, EMPTY);
+
+  bool ok = (ph == computed_result);
+
+  print_constraints(ph, "*** after refine_with_congruences(cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph;
+  ph.refine_with_congruence(Linear_Expression(-2) %= 0);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(-1) %= 0) / 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(0);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+
+  C_Polyhedron ph(gs);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 3) / 2);
+
+  print_generators(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert(A - B == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 0) / 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 1) / 0);
+  cgs.insert(A + B %= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 0) / 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+
+  NNC_Polyhedron ph1(2);
+  Congruence_System cgs;
+  cgs.insert((A - B %= 1) / 0);
+  cgs.insert(A + B %= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  C_Polyhedron ph;
+  ph.refine_with_congruence(Linear_Expression(-2) %= 0);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(-1) %= 0) / 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithconstraint1.cc b/tests/Polyhedron/refinewithconstraint1.cc
new file mode 100644
index 0000000..d2bd788
--- /dev/null
+++ b/tests/Polyhedron/refinewithconstraint1.cc
@@ -0,0 +1,108 @@
+/* Test Polyhedron::refine_with_constraint().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.refine_with_constraint(A > 0);
+  ph1.refine_with_constraint(B == 5);
+  ph1.refine_with_constraint(A + B < 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  for (Constraint_System::const_iterator i = ph1.constraints().begin(),
+	 cs_end = ph1.constraints().end(); i != cs_end; ++i)
+    ph2.refine_with_constraint(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.refine_with_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.refine_with_constraint(A == B) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_constraint(A >= 0);
+  ph.refine_with_constraint(A <= 2);
+  ph.refine_with_constraint(A >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.refine_with_constraint(B > 1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+		    "*** after ph.refine_with_constraint(B >= 1) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithconstraints1.cc b/tests/Polyhedron/refinewithconstraints1.cc
new file mode 100644
index 0000000..4eedd1b
--- /dev/null
+++ b/tests/Polyhedron/refinewithconstraints1.cc
@@ -0,0 +1,322 @@
+/* Test Polyhedron::refine_with_constraints().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_constraint(A >= 0);
+  ph.refine_with_constraint(B >= 0);
+
+  Constraint_System cs;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.refine_with_constraints(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs1;
+  cs1.insert(A + B >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Constraint_System cs2;
+  cs2.insert(e == 0);
+  ph.refine_with_constraints(cs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.refine_with_constraints(cs2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(3);
+  ph.refine_with_constraint(A >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+
+  C_Polyhedron computed_result(ph);
+
+  computed_result.add_constraints(cs);
+
+  bool ok = (computed_result == ph);
+
+  print_constraints(computed_result,
+		    "*** after refine_with_constraints ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(A >= 4);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.refine_with_constraints(cs);
+
+  C_Polyhedron computed_result(3, EMPTY);
+
+  bool ok = (ph == computed_result);
+
+  print_constraints(ph, "*** after refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph;
+  ph.refine_with_constraint(Linear_Expression(-2) >= 0);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-1) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_constraints ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+
+  C_Polyhedron ph(gs);
+
+  Constraint_System cs;
+  cs.insert(A < 3);
+
+  print_generators(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_constraints ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B > 1);
+  cs.insert(A + B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(A + B >= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B > 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+
+  NNC_Polyhedron ph1(2);
+  Constraint_System cs;
+  cs.insert(A - B > 1);
+  cs.insert(A + B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B > 1);
+  known_result.add_constraint(A + B >= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/relations1.cc b/tests/Polyhedron/relations1.cc
index 4d4ef3c..bc7e6f5 100644
--- a/tests/Polyhedron/relations1.cc
+++ b/tests/Polyhedron/relations1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::relation_with(g) and Polyhedron::relation_with(c).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -55,10 +55,10 @@ test02() {
   Variable x(0);
 
   C_Polyhedron ph(2, EMPTY);
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   Generator g = point(x);
-  print_generator(g, "--- g ---");
+  print_generator(g, "*** g ***");
 
   Poly_Gen_Relation rel = ph.relation_with(g);
 
@@ -73,10 +73,10 @@ test02() {
 bool
 test03() {
   C_Polyhedron ph;
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   Generator g = point();
-  print_generator(g, "--- g ---");
+  print_generator(g, "*** g ***");
 
   Poly_Gen_Relation rel = ph.relation_with(g);
 
@@ -98,10 +98,10 @@ test04() {
   gs.insert(ray(y));
   gs.insert(line(x));
   C_Polyhedron ph(gs);
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   Generator g = point(x + y);
-  print_generator(g, "--- g ---");
+  print_generator(g, "*** g ***");
 
   Poly_Gen_Relation rel = ph.relation_with(g);
 
@@ -121,7 +121,7 @@ test05() {
   Generator_System gs;
   gs.insert(point(1*A + 1*B));
   C_Polyhedron ph(gs);
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   Poly_Con_Relation rel = ph.relation_with(A >= 0);
 
@@ -138,10 +138,10 @@ test06() {
   Variable y(1);
 
   C_Polyhedron ph(2, EMPTY);
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   Constraint c(y >= 0);
-  print_constraint(c, "--- c ---");
+  print_constraint(c, "*** c ***");
 
   Poly_Con_Relation rel = ph.relation_with(c);
 
@@ -161,11 +161,11 @@ test07() {
   Poly_Con_Relation known_result = Poly_Con_Relation::nothing();
 
   C_Polyhedron ph;
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   // A false inequality constraint.
   Constraint c_false1(Linear_Expression(-1) >= 0);
-  print_constraint(c_false1, "--- c_false1 ---");
+  print_constraint(c_false1, "*** c_false1 ***");
 
   rel = ph.relation_with(c_false1);
 
@@ -176,7 +176,7 @@ test07() {
 
   // A false equality constraint.
   Constraint c_false2(Linear_Expression(5) == -2);
-  print_constraint(c_false2, "--- c_false2 ---");
+  print_constraint(c_false2, "*** c_false2 ***");
 
   rel = ph.relation_with(c_false2);
 
@@ -187,7 +187,7 @@ test07() {
 
   // A saturated inequality.
   Constraint c_saturated1(Linear_Expression(3) >= 3);
-  print_constraint(c_saturated1, "--- c_saturated1 ---");
+  print_constraint(c_saturated1, "*** c_saturated1 ***");
 
   rel = ph.relation_with(c_saturated1);
 
@@ -199,7 +199,7 @@ test07() {
 
   // A saturated equality.
   Constraint c_saturated2(Linear_Expression(1) == 1);
-  print_constraint(c_saturated2, "--- c_saturated2 ---");
+  print_constraint(c_saturated2, "*** c_saturated2 ***");
 
   rel = ph.relation_with(c_saturated2);
 
@@ -211,7 +211,7 @@ test07() {
 
   // A satisfied inequality which is not saturated.
   Constraint c_satisfied(Linear_Expression(7) >= 5);
-  print_constraint(c_satisfied, "--- c_satisfied ---");
+  print_constraint(c_satisfied, "*** c_satisfied ***");
 
   rel = ph.relation_with(c_satisfied);
 
@@ -234,12 +234,12 @@ test08() {
 
   C_Polyhedron ph(cs);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   // An equality constraint non-intersecting the polyhedron.
   Constraint c(y == -1);
 
-  print_constraint(c, "--- c ---");
+  print_constraint(c, "*** c ***");
 
   Poly_Con_Relation rel = ph.relation_with(c);
 
@@ -255,7 +255,7 @@ test09() {
   C_Polyhedron ph;
   Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 0);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(0 > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
@@ -270,7 +270,7 @@ test10() {
   C_Polyhedron ph;
   Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 1);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(0 > 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
@@ -284,7 +284,7 @@ test11() {
   C_Polyhedron ph;
   Poly_Con_Relation rel = ph.relation_with(Linear_Expression(1) > 0);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(1 > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
@@ -300,7 +300,7 @@ test12() {
   Variable A(0);
   Poly_Con_Relation rel = ph.relation_with(A > 0);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(A > 0) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
@@ -319,7 +319,7 @@ test13() {
 
   Poly_Con_Relation rel = ph.relation_with(A + B > 3);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(A + B > 3) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
@@ -337,7 +337,7 @@ test14() {
 
   Poly_Con_Relation rel = ph.relation_with(A + B > 3);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(A + B > 3) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
@@ -357,7 +357,7 @@ test15() {
 
   Poly_Con_Relation rel = ph.relation_with(A + 2*B < 10);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(A + 2*B < 10) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
@@ -377,7 +377,7 @@ test16() {
 
   Poly_Con_Relation rel = ph.relation_with(A + B > 1);
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(A + B > 1) == " << rel << endl;
 
   Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
@@ -394,7 +394,7 @@ test17() {
 
   Poly_Gen_Relation rel = ph.relation_with(point(2*A));
 
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
   nout << "ph.relation_with(point(2*A)) == " << rel << endl;
 
   Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
diff --git a/tests/Polyhedron/relations2.cc b/tests/Polyhedron/relations2.cc
index b30a4d1..5c153ff 100644
--- a/tests/Polyhedron/relations2.cc
+++ b/tests/Polyhedron/relations2.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -118,6 +118,100 @@ test04() {
   return ok;
 }
 
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(line(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(ray(A));
+  gs2.insert(point(B));
+  gs2.insert(point(-B));
+  C_Polyhedron ph2(gs2);
+
+  Poly_Con_Relation rel1 = ph1.relation_with((A %= 0) / 5);
+  Poly_Con_Relation rel2 = ph2.relation_with((A %= 0) / 5);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  nout << "ph1.relation_with((A %= 0) / 5) == " << rel1 << endl;
+  nout << "ph2.relation_with((A %= 0) / 5) == " << rel2 << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A));
+  C_Polyhedron ph(gs);
+
+  Poly_Con_Relation rel = ph.relation_with(A %= 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A %= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(A <= 4);
+
+  Poly_Con_Relation rel = ph.relation_with((A %= 1) / 4);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with((A %= 1) / 4) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(2*A, 3));
+//  ph.add_generator(point(-A));
+  ph.add_generator(ray(B));
+
+  Poly_Con_Relation rel1 = ph.relation_with(A %= 0);
+
+  Poly_Con_Relation rel2 = ph.relation_with((A %= 1) / 5);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel1 == known_rel && rel2 == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(A %= 0) == " << rel1 << endl;
+  nout << "ph.relation_with((A %= 1) / 5) == " << rel2 << endl;
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -125,4 +219,8 @@ BEGIN_MAIN
   DO_TEST(test02);
   DO_TEST(test03);
   DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
 END_MAIN
diff --git a/tests/Polyhedron/relations3.cc b/tests/Polyhedron/relations3.cc
index ddacb5f..990eb13 100644
--- a/tests/Polyhedron/relations3.cc
+++ b/tests/Polyhedron/relations3.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -277,6 +277,27 @@ test11() {
   return rel == known_result;
 }
 
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= B);
+  ph.add_generator(point());
+  ph.generators();
+  ph.add_constraint(A <= B-1);
+
+  Poly_Gen_Relation rel = ph.relation_with(line(C));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(line(C)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+  return rel == known_result;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -291,4 +312,5 @@ BEGIN_MAIN
   DO_TEST(test09);
   DO_TEST(test10);
   DO_TEST(test11);
+  DO_TEST(test12);
 END_MAIN
diff --git a/tests/Polyhedron/removespacedims1.cc b/tests/Polyhedron/removespacedims1.cc
index fea3341..f82c481 100644
--- a/tests/Polyhedron/removespacedims1.cc
+++ b/tests/Polyhedron/removespacedims1.cc
@@ -1,11 +1,11 @@
 /* Removing space dimensions from a polyhedron.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -156,7 +156,7 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_generators(ph, "*** After remove_higher_space_dimensions(2) ***");
+  print_generators(ph, "*** after remove_higher_space_dimensions(2) ***");
 
   return ok;
 }
@@ -165,7 +165,7 @@ bool
 test05() {
   C_Polyhedron ph(4, EMPTY);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   ph.remove_higher_space_dimensions(0);
 
@@ -173,7 +173,7 @@ test05() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "--- ph after remove_higher_space_dimensions(0)---");
+  print_constraints(ph, "*** ph after remove_higher_space_dimensions(0) ***");
 
   return ok;
 }
@@ -232,7 +232,7 @@ test07() {
   bool ok = (ph == known_result);
 
   print_constraints(ph,
-		    "*** After ph.remove_space_dimensions(to_be_removed) ***");
+		    "*** after ph.remove_space_dimensions(to_be_removed) ***");
 
   return ok;
 }
@@ -252,7 +252,7 @@ test08() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.remove_higher_space_dimensions(2) ***");
+  print_constraints(ph, "*** after ph.remove_higher_space_dimensions(2) ***");
 
   return ok;
 }
@@ -274,7 +274,7 @@ test09() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.remove_higher_space_dimensions(1) ***");
+  print_constraints(ph, "*** after ph.remove_higher_space_dimensions(1) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/removespacedims2.cc b/tests/Polyhedron/removespacedims2.cc
index c51c98c..df09b66 100644
--- a/tests/Polyhedron/removespacedims2.cc
+++ b/tests/Polyhedron/removespacedims2.cc
@@ -1,11 +1,11 @@
 /* Removing space dimensions form an NNC polyhedron.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -52,9 +52,9 @@ test01() {
 
   bool ok = (ph1 == ph2);
 
-  print_constraints(ph1, "*** After remove_higher_space_dimensions(1) ***");
+  print_constraints(ph1, "*** after remove_higher_space_dimensions(1) ***");
   print_constraints(ph2,
-		    "*** After remove_space_dimensions(to_be_removed) ***");
+		    "*** after remove_space_dimensions(to_be_removed) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/simplifyusingcontext1.cc b/tests/Polyhedron/simplifyusingcontext1.cc
new file mode 100644
index 0000000..c9c9b5d
--- /dev/null
+++ b/tests/Polyhedron/simplifyusingcontext1.cc
@@ -0,0 +1,644 @@
+/* Test Polyhedron::simplify_using_context_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron icosahedron(3);
+  icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0);
+  icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0);
+  icosahedron.add_constraint(x + y - 1 >= 0);
+  icosahedron.add_constraint(x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(x + 1 >= 0);
+  icosahedron.add_constraint(x + z - 1 >= 0);
+  icosahedron.add_constraint(2*x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(x - y + 5 >= 0);
+  icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0);
+  icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(-x + y - 1 >= 0);
+  icosahedron.add_constraint(-x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0);
+  icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(-x + 1 >= 0);
+  icosahedron.add_constraint(-x - z + 5 >= 0);
+  icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0);
+  icosahedron.add_constraint(-x - y + 5 >= 0);
+  icosahedron.add_constraint(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron column(3);
+  column.add_constraint(y >= 2);
+  column.add_constraint(y <= 4);
+  column.add_constraint(x >= 0);
+  column.add_constraint(x <= 1);
+
+  C_Polyhedron computed_result = icosahedron;
+  computed_result.simplify_using_context_assign(column);
+
+#if 0
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-4*x - 2*y + z >= -8);
+  known_result.add_constraint(-4*x + 2*y + z >= 4);
+  known_result.add_constraint(-2*x - y + 2*z >= -1);
+  known_result.add_constraint(-2*x + y + 2*z >= 5);
+  known_result.add_constraint(-x - y - 2*z >= -13);
+  known_result.add_constraint(-x - z >= -5);
+  known_result.add_constraint(-x >= -1);
+  known_result.add_constraint(-x + y - 2*z >= -7);
+  known_result.add_constraint(-y >= -4);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = (computed_result == known_result);
+#endif
+
+  print_constraints(icosahedron, "*** icosahedron ***");
+  print_constraints(column, "*** column ***");
+  print_constraints(computed_result, "*** computed_result ***");
+#if 0
+  print_constraints(known_result, "*** known_result ***");
+#endif
+  return true;
+  //return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron icosahedron1(3);
+  icosahedron1.add_constraint(4*x - 2*y - z + 14 >= 0);
+  icosahedron1.add_constraint(4*x + 2*y - z + 2 >= 0);
+  icosahedron1.add_constraint(x + y - 1 >= 0);
+  icosahedron1.add_constraint(x + y + 2*z - 5 >= 0);
+  icosahedron1.add_constraint(x + 1 >= 0);
+  icosahedron1.add_constraint(x + z - 1 >= 0);
+  icosahedron1.add_constraint(2*x + y -2*z + 7 >= 0);
+  icosahedron1.add_constraint(x - y + 2*z + 1 >= 0);
+  icosahedron1.add_constraint(x - y + 5 >= 0);
+  icosahedron1.add_constraint(2*x - y - 2*z + 13 >= 0);
+  icosahedron1.add_constraint(-2*x - y + 2*z + 1 >= 0);
+  icosahedron1.add_constraint(-x + y - 1 >= 0);
+  icosahedron1.add_constraint(-x + y -2*z + 7 >= 0);
+  icosahedron1.add_constraint(-4*x + 2*y + z - 4 >= 0);
+  icosahedron1.add_constraint(-2*x + y + 2*z - 5 >= 0);
+  icosahedron1.add_constraint(-x + 1 >= 0);
+  icosahedron1.add_constraint(-x - z + 5 >= 0);
+  icosahedron1.add_constraint(-4*x - 2*y + z + 8 >= 0);
+  icosahedron1.add_constraint(-x - y + 5 >= 0);
+  icosahedron1.add_constraint(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron icosahedron2 = icosahedron1;
+  icosahedron2.affine_image(x, x+5);
+
+
+  C_Polyhedron computed_result = icosahedron1;
+  computed_result.simplify_using_context_assign(icosahedron2);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-4*x - 2*y + z >= -8);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(icosahedron1, "*** icosahedron1 ***");
+  print_constraints(icosahedron2, "*** icosahedron2 ***");
+  print_constraints(computed_result, "*** computed_result ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+#if 0
+int
+aux_test02(const C_Polyhedron& ph) {
+  if (ph.is_empty() || ph.space_dimension() == 0)
+    return 0;
+
+  int count = 0;
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i)
+    if (i->type() == Generator::POINT)
+      ++count;
+  return count;
+}
+
+// Intersection of a pyramid with an half-space of variable height.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  // This is the height of the pyramid.
+  const Coefficient pyramid_height = 16;
+
+  // We will intersect it with the half-spaces `z <= k' and `z >= k'
+  // with k = i*(height/4) for i = -1, 0, 1, ..., 5.
+  struct {
+    Coefficient plane_height;
+    int num_points_above;
+    int num_points_below;
+  } ph_nv[]
+      = { {-1*(pyramid_height/4), 5, 0},
+	  { 0*(pyramid_height/4), 5, 4},
+	  { 1*(pyramid_height/4), 5, 8},
+	  { 2*(pyramid_height/4), 5, 8},
+	  { 3*(pyramid_height/4), 5, 8},
+	  { 4*(pyramid_height/4), 1, 5},
+	  { 5*(pyramid_height/4), 0, 5}
+      };
+
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y + 0*z));
+  gs.insert(point(2*x + 0*y + 0*z));
+  gs.insert(point(0*x + 2*y + 0*z));
+  gs.insert(point(2*x + 2*y + 0*z));
+  gs.insert(point(x + y + pyramid_height*z));
+  C_Polyhedron pyramid(gs);
+
+    print_constraints(pyramid, "*** pyramid constraints ***");
+    print_generators(pyramid, "*** pyramid generators ***");
+
+  bool ok = true;
+
+  for (dimension_type i = 0; i <= 6; ++i) {
+    // Above.
+    C_Polyhedron hyper_space_above(3);
+    hyper_space_above.add_constraint(z >= ph_nv[i].plane_height);
+
+    C_Polyhedron computed_result = pyramid;
+    computed_result.intersection_assign_and_minimize(hyper_space_above);
+
+    if (ok
+	&& aux_test02(computed_result) != ph_nv[i].num_points_above)
+      ok = false;
+
+    print_constraints(hyper_space_above, "*** hyper_space_above ***");
+    print_generators(computed_result, "*** computed_result ***");
+
+    // Below.
+    C_Polyhedron hyper_space_below(3);
+    hyper_space_below.add_constraint(z <= ph_nv[i].plane_height);
+
+    computed_result = pyramid;
+    computed_result.intersection_assign_and_minimize(hyper_space_below);
+
+    if (ok
+	&& aux_test02(computed_result) != ph_nv[i].num_points_below)
+      ok = false;
+
+    print_constraints(hyper_space_below, "*** hyper_space_below ***");
+    print_generators(computed_result, "*** computed_result ***");
+
+  }
+  return ok;
+}
+#endif
+
+bool
+test03() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 5);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.simplify_using_context_assign(ph2);
+
+  C_Polyhedron known_result(1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result,
+                    "*** ph1.simplify_using_context_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph1 = C_Polyhedron(3, UNIVERSE);
+  ph1.add_constraint(i >= 1);
+  ph1.add_constraint(i <= 10);
+  ph1.add_constraint(j >= 1);
+  ph1.add_constraint(j <= 10);
+  ph1.add_constraint(k == 0);
+
+  C_Polyhedron ph2 = C_Polyhedron(3, UNIVERSE);
+  ph2.add_constraint(i >= 0);
+  ph2.add_constraint(i <= 2);
+  ph2.add_constraint(j >= 2);
+  ph2.add_constraint(j <= 9);
+  ph2.add_constraint(k == 0);
+
+  print_constraints(ph1, "=== ph1 ===");
+  print_constraints(ph2, "=== ph2 ===");
+
+  C_Polyhedron known_result = C_Polyhedron(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "=== ph1.simplify_using_context_assign(ph2) ===");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(i == 1);
+  ph1.add_constraint(j + 1 == 0);
+  ph1.add_constraint(k == 3);
+
+  C_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(i == 1);
+  ph2.add_constraint(j + k == 2);
+  ph2.add_constraint(k >= 0);
+  ph2.add_constraint(k <= 3);
+
+  C_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(k == 3);
+  // known_result.add_constraint(j + 1 == 0);
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "=== ph1.simplify_using_context_assign(ph2) ===");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(A == 0);
+  ph1.add_constraint(B == C);
+  ph1.add_constraint(B >= 2);
+  print_constraints(ph1, "\n=== ph1 ===");
+
+  C_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(A == 0);
+  ph2.add_constraint(C >= 2);
+  print_constraints(ph2, "\n=== ph2 ===");
+
+  ph1.simplify_using_context_assign(ph2);
+
+  C_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(B == C);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "\n=== ph1.simplify_using_context_assign(ph2) ===");
+
+  return ok;
+}
+
+#if 0
+bool
+aux_test07(C_Polyhedron& ph1,
+	   const C_Polyhedron& ph2,
+	   // Note intentional call-by-value!
+	   C_Polyhedron known_result) {
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  print_generators(ph1, "*** after intersection_assign ***");
+
+  return ph1 == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1_1(2);
+  ph1_1.add_constraint(x >= 0);
+  ph1_1.add_constraint(y >= 0);
+  ph1_1.add_constraint(x <= 2);
+  ph1_1.add_constraint(y <= 2);
+  C_Polyhedron ph1_2(ph1_1);
+
+  C_Polyhedron ph2_1(2);
+  ph2_1.add_constraint(x+y <= 0);
+  ph2_1.add_constraint(x+y >= 2);
+  C_Polyhedron ph2_2(ph2_1);
+  C_Polyhedron ph2_3(ph2_1);
+  C_Polyhedron ph2_4(ph2_1);
+
+  bool ok = aux_test07(ph1_1, ph2_1, ph2_1)
+    && aux_test07(ph2_2, ph1_2, ph2_2)
+    && aux_test07(ph2_3, ph2_4, ph2_3);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "*** after ph1.intersection_assign_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+  ph2.add_generator(point());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "*** after ph1.intersection_assign_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == B);
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A >= B + 1);
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+  copy_ph1.intersection_assign_and_minimize(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** after intersection_assign ***");
+  print_constraints(copy_ph1,
+		    "*** after intersection_assign_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+  copy_ph1.intersection_assign_and_minimize(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** after intersection_assign ***");
+  print_constraints(copy_ph1,
+		    "*** after intersection_assign_and_minimize ***");
+
+  return ok;
+}
+#endif
+
+bool
+test14() {
+  C_Polyhedron ph1(0, EMPTY);
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+            "*** after ph1.simplify_using_context_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  C_Polyhedron ph2(1);
+
+  ph2.add_constraint( A == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+                    "*** after ph1.simplify_using_context_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(i >= 1);
+  ph1.add_constraint(i <= 10);
+  ph1.add_constraint(j >= 1);
+  ph1.add_constraint(j <= 10);
+  ph1.add_constraint(k == 0);
+
+  C_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(i <= 25);
+  ph2.add_constraint(j <= 25);
+  ph2.add_constraint(i + j >= 25);
+  ph2.add_constraint(k == 0);
+
+  // CHECKME: C_Polyhedron known_result(3, EMPTY); ?
+  C_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(i <= 10);
+  known_result.add_constraint(j <= 10);
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+#if 0
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+#endif
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Polyhedron/smm1.cc b/tests/Polyhedron/smm1.cc
index 1674cac..d8158de 100644
--- a/tests/Polyhedron/smm1.cc
+++ b/tests/Polyhedron/smm1.cc
@@ -1,11 +1,11 @@
 /* SEND + MORE = MONEY.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,13 +22,15 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-using namespace Parma_Polyhedra_Library::IO_Operators;
-
 namespace Parma_Polyhedra_Library {
   // Import all the output operators into the main PPL namespace.
   using IO_Operators::operator<<;
 }
 
+namespace {
+
+namespace test01_namespace {
+
 // The classic cryptarithmetic puzzle:
 //
 //      S E N D
@@ -36,8 +38,6 @@ namespace Parma_Polyhedra_Library {
 //    ---------
 //    M O N E Y
 
-namespace {
-
 void
 less_than(C_Polyhedron& ph, Variable X, Variable Y) {
   ph.add_constraint(X+1 <= Y);
@@ -90,12 +90,10 @@ constraints(C_Polyhedron& ph,
   less_than(ph, R, S);
 }
 
-} // namespace
-
-int
-main() TRY {
-  set_handlers();
+} // namespace test01_namespace
 
+bool
+test01() {
   Variable S(0);
   Variable E(1);
   Variable N(2);
@@ -112,38 +110,42 @@ main() TRY {
       for (int C3 = 0; C3 <= 1; ++C3)
 	for (int C4 = 0; C4 <= 1; ++C4) {
 	  C_Polyhedron ph(8);
-	  constraints(ph,
-		      S, E, N, D, M, O, R, Y,
-		      C1, C2, C3, C4);
-	  if (!ph.is_empty()) {
-	    nout << "Solution constraints" << endl;
-	    const Constraint_System& cs = ph.constraints();
-	    std::copy(cs.begin(), cs.end(),
-		      std::ostream_iterator<Constraint>(nout, "\n"));
-	    nout << "Solution generators" << endl;
-	    const Generator_System& gs = ph.generators();
-	    std::copy(gs.begin(), gs.end(),
-		      std::ostream_iterator<Generator>(nout, "\n"));
-
-	    if (solution_found)
-	      return 1;
-
-	    solution_found = true;
-
-	    C_Polyhedron expected(8);
-	    expected.add_constraint(S == 9);
-	    expected.add_constraint(E == 5);
-	    expected.add_constraint(N == 6);
-	    expected.add_constraint(D == 7);
-	    expected.add_constraint(M == 1);
-	    expected.add_constraint(O == 0);
-	    expected.add_constraint(R == 8);
-	    expected.add_constraint(Y == 2);
-
-	    if (ph != expected)
-	      return 1;
-	  }
+	  test01_namespace::constraints(ph,
+					S, E, N, D, M, O, R, Y,
+					C1, C2, C3, C4);
+	  if (ph.is_empty())
+	    continue;
+
+	  nout << "Solution constraints" << endl;
+	  const Constraint_System& cs = ph.constraints();
+	  std::copy(cs.begin(), cs.end(),
+		    std::ostream_iterator<Constraint>(nout, "\n"));
+	  nout << "Solution generators" << endl;
+	  const Generator_System& gs = ph.generators();
+	  std::copy(gs.begin(), gs.end(),
+		    std::ostream_iterator<Generator>(nout, "\n"));
+	  if (solution_found)
+	    return true;
+	  solution_found = true;
+
+	  C_Polyhedron expected(8);
+	  expected.add_constraint(S == 9);
+	  expected.add_constraint(E == 5);
+	  expected.add_constraint(N == 6);
+	  expected.add_constraint(D == 7);
+	  expected.add_constraint(M == 1);
+	  expected.add_constraint(O == 0);
+	  expected.add_constraint(R == 8);
+	  expected.add_constraint(Y == 2);
+
+	  if (ph != expected)
+	    return false;
 	}
-  return 0;
+  return true;
 }
-CATCH
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/timeelapse1.cc b/tests/Polyhedron/timeelapse1.cc
index 9d624c7..16621f4 100644
--- a/tests/Polyhedron/timeelapse1.cc
+++ b/tests/Polyhedron/timeelapse1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::time_elapse_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -38,8 +38,8 @@ test01() {
   C_Polyhedron ph2(2);
   ph2.add_constraint(y == 5);
 
-  print_constraints(ph1, "**** ph1 ****");
-  print_constraints(ph2, "**** ph2 ****");
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
 
   ph1.time_elapse_assign(ph2);
 
@@ -50,7 +50,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
 
   return ok;
 }
@@ -60,32 +60,32 @@ test02() {
   C_Polyhedron ph1(0, EMPTY);
   C_Polyhedron ph2;
 
-  print_constraints(ph1, "**** ph1 ****");
-  print_constraints(ph2, "**** ph2 ****");
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
 
   ph1.time_elapse_assign(ph2);
 
   C_Polyhedron ph3(2, EMPTY);
   C_Polyhedron ph4(2);
 
-  print_constraints(ph3, "**** ph3 ****");
-  print_constraints(ph4, "**** ph4 ****");
+  print_constraints(ph3, "*** ph3 ***");
+  print_constraints(ph4, "*** ph4 ***");
 
   ph3.time_elapse_assign(ph4);
 
   C_Polyhedron ph5(2);
   C_Polyhedron ph6(2, EMPTY);
 
-  print_constraints(ph5, "**** ph5 ****");
-  print_constraints(ph6, "**** ph6 ****");
+  print_constraints(ph5, "*** ph5 ***");
+  print_constraints(ph6, "*** ph6 ***");
 
   ph5.time_elapse_assign(ph6);
 
   bool ok = ph1.is_empty() && ph3.is_empty() && ph5.is_empty();
 
-  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
-  print_generators(ph3, "**** ph3_time_elapse_assign(ph4) ****");
-  print_generators(ph5, "**** ph5_time_elapse_assign(ph6) ****");
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+  print_generators(ph3, "*** ph3_time_elapse_assign(ph4) ***");
+  print_generators(ph5, "*** ph5_time_elapse_assign(ph6) ***");
 
   return ok;
 }
@@ -132,7 +132,7 @@ test04() {
 
   bool ok = (ph1 == known_result);
 
-  print_constraints(ph1, "*** After ph1.time_elapse_assign(ph2) ***");
+  print_constraints(ph1, "*** after ph1.time_elapse_assign(ph2) ***");
 
   return ok;
 }
@@ -171,8 +171,8 @@ test05() {
 
   bool ok = (ph1 ==  ph3);
 
-  print_generators(ph1, "*** After ph1.time_elapse_assign(ph2) ***");
-  print_generators(ph3, "*** After ph3.time_elapse_assign(ph4) ***");
+  print_generators(ph1, "*** after ph1.time_elapse_assign(ph2) ***");
+  print_generators(ph3, "*** after ph3.time_elapse_assign(ph4) ***");
 
   return ok;
 }
@@ -193,7 +193,7 @@ test06() {
   ph2.add_constraint(x == -1);
   ph2.add_constraint(y == -1);
 
-  Polyhedra_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
   ps1.add_disjunct(ph1);
   ps1.add_disjunct(ph2);
 
@@ -203,11 +203,11 @@ test06() {
   ph3.add_constraint(x <= 4);
   ph3.add_constraint(y == 3);
 
-  Polyhedra_Powerset<C_Polyhedron> ps2(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
   ps2.add_disjunct(ph3);
 
-  print_constraints(ps1, "=== ps1 ===");
-  print_constraints(ps2, "=== ps2 ===");
+  print_constraints(ps1, "*** ps1 ***");
+  print_constraints(ps2, "*** ps2 ***");
 
   ps1.time_elapse_assign(ps2);
 
@@ -226,14 +226,14 @@ test06() {
   known_gs.insert(ray(4*x + 3*y));
   C_Polyhedron known_ph2(known_gs);
 
-  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
   // Inserting out of order on purpose.
   known_result.add_disjunct(known_ph2);
   known_result.add_disjunct(known_ph1);
 
   bool ok = (ps1 == known_result);
 
-  print_constraints(ps1, "=== ps1.time_elapse_assign(ps2) ===");
+  print_constraints(ps1, "*** ps1.time_elapse_assign(ps2) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/timeelapse2.cc b/tests/Polyhedron/timeelapse2.cc
index a20455b..0fbd2c9 100644
--- a/tests/Polyhedron/timeelapse2.cc
+++ b/tests/Polyhedron/timeelapse2.cc
@@ -1,11 +1,11 @@
 /* Test time_elapse_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -41,8 +41,8 @@ test01() {
   ph2.add_constraint(x < 4);
   ph2.add_constraint(y == 3);
 
-  print_constraints(ph1, "**** ph1 ****");
-  print_constraints(ph2, "**** ph2 ****");
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
 
   ph1.time_elapse_assign(ph2);
 
@@ -57,7 +57,7 @@ test01() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
 
   return ok;
 }
@@ -78,14 +78,14 @@ test02() {
   gs.insert(point(x + y));
   NNC_Polyhedron ph2(gs);
 
-  print_constraints(ph1, "**** ph1 ****");
-  print_generators(ph2, "**** ph2 ****");
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
 
   ph1.time_elapse_assign(ph2);
 
   bool ok = (ph1 == ph);
 
-  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
 
  return ok;
 }
@@ -103,8 +103,8 @@ test03() {
   ph2.add_constraint(x > 3);
   ph2.add_constraint(y > 2);
 
-  print_constraints(ph1, "**** ph1 ****");
-  print_constraints(ph2, "**** ph2 ****");
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
 
   ph1.time_elapse_assign(ph2);
 
@@ -118,7 +118,7 @@ test03() {
 
   bool ok = (ph1 == known_result);
 
-  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/topclosed1.cc b/tests/Polyhedron/topclosed1.cc
index 2c0c473..6af108a 100644
--- a/tests/Polyhedron/topclosed1.cc
+++ b/tests/Polyhedron/topclosed1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::is_topologically_closed().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/topclosure1.cc b/tests/Polyhedron/topclosure1.cc
index a80bc6d..3bf7b80 100644
--- a/tests/Polyhedron/topclosure1.cc
+++ b/tests/Polyhedron/topclosure1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::topological_closure_assign().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -47,8 +47,8 @@ test01() {
 
   bool ok = (ph1 == ph2);
 
-  print_constraints(ph1, "*** After ph1.topological_closure_assign() ***");
-  print_generators(ph2, "*** After ph2.topological_closure_assign() ***");
+  print_constraints(ph1, "*** after ph1.topological_closure_assign() ***");
+  print_generators(ph2, "*** after ph2.topological_closure_assign() ***");
 
   return ok;
 }
@@ -69,8 +69,8 @@ test02() {
 
   bool ok = (ph1 == known_result1 && ph2 == known_result2);
 
-  print_constraints(ph1, "*** After ph1.topological_closure_assign() ***");
-  print_constraints(ph2, "*** After ph2.topological_closure_assign() ***");
+  print_constraints(ph1, "*** after ph1.topological_closure_assign() ***");
+  print_constraints(ph2, "*** after ph2.topological_closure_assign() ***");
 
   return ok;
 }
@@ -92,7 +92,7 @@ test03() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.topological_closure_assign() ***");
+  print_constraints(ph, "*** after ph.topological_closure_assign() ***");
 
   return ok;
 }
@@ -117,7 +117,7 @@ test04() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.topological_closure_assign() ***");
+  print_constraints(ph, "*** after ph.topological_closure_assign() ***");
 
   return ok;
 }
@@ -144,7 +144,7 @@ test05() {
 
   bool ok = (ph == known_result);
 
-  print_constraints(ph, "*** After ph.topological_closure_assign() ***");
+  print_constraints(ph, "*** after ph.topological_closure_assign() ***");
 
   return ok;
 }
diff --git a/tests/Polyhedron/unconstrain1.cc b/tests/Polyhedron/unconstrain1.cc
new file mode 100644
index 0000000..15c8350
--- /dev/null
+++ b/tests/Polyhedron/unconstrain1.cc
@@ -0,0 +1,228 @@
+/* Test Polyhedron::unconstrain().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  ph.unconstrain(A);
+
+  C_Polyhedron known_result(2, EMPTY);
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs(A, B);
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(2, EMPTY);
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == B);
+  ph.add_constraint(B >= 0);
+  print_generators(ph, "*** ph ***");
+
+  ph.unconstrain(B);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == B);
+  ph.add_constraint(B >= 0);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs(B);
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(0, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs;
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph(0);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs;
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    ph.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    ph.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph(5);
+  ph.add_constraint(A + 3*B - 7 == 9);
+  ph.add_constraint(A - 3*B - D + E >= 0);
+  ph.add_constraint(C <= D);
+  ph.add_constraint(E <= 2*B + D);
+  ph.add_constraint(E >= 0);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(5);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/universe1.cc b/tests/Polyhedron/universe1.cc
index 1713ae1..41c9cae 100644
--- a/tests/Polyhedron/universe1.cc
+++ b/tests/Polyhedron/universe1.cc
@@ -1,11 +1,11 @@
 /* Test Polyhedron::is_universe().
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,7 +27,7 @@ namespace {
 bool
 test01() {
   C_Polyhedron ph(3);
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   bool universe = ph.is_universe();
 
@@ -48,7 +48,7 @@ test02() {
   ph.add_constraint(x >= z);
   ph.add_constraint(z == 3);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   bool universe = ph.is_universe();
 
@@ -71,7 +71,7 @@ test03() {
   ph.add_constraint(x <= 3);
 
   Constraint_System cs = ph.constraints();
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   bool universe = ph.is_universe();
 
@@ -95,7 +95,7 @@ test04() {
   ph.add_constraint(y <= 4);
 
   Constraint_System cs = ph.constraints();
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   bool universe = ph.is_universe();
 
@@ -116,7 +116,7 @@ test05() {
   C_Polyhedron ph(3);
   ph.add_constraint(x - y - z >= 0);
 
-  print_constraints(ph, "--- ph ---");
+  print_constraints(ph, "*** ph ***");
 
   bool universe = ph.is_universe();
 
@@ -140,7 +140,7 @@ test06() {
   gs.insert(ray(x - y));
 
   C_Polyhedron ph(gs);
-  print_generators(ph, "--- ph ---");
+  print_generators(ph, "*** ph ***");
 
   bool universe = ph.is_universe();
 
diff --git a/tests/Polyhedron/universe2.cc b/tests/Polyhedron/universe2.cc
index a2d8be1..b47b9e8 100644
--- a/tests/Polyhedron/universe2.cc
+++ b/tests/Polyhedron/universe2.cc
@@ -1,11 +1,11 @@
 /* Test the function is_universe() for a NNC_polyhedron.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -36,10 +36,10 @@ test01() {
   Constraint_System cs;
   NNC_Polyhedron ph4(cs);
 
-  print_constraints(ph1, "--- ph1 ---");
-  print_constraints(ph2, "--- ph2 ---");
-  print_constraints(ph3, "--- ph3 ---");
-  print_constraints(ph4, "--- ph4 ---");
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(ph3, "*** ph3 ***");
+  print_constraints(ph4, "*** ph4 ***");
 
   bool universe1 = ph1.is_universe();
 
diff --git a/tests/Polyhedron/variablesset1.cc b/tests/Polyhedron/variablesset1.cc
new file mode 100644
index 0000000..d924102
--- /dev/null
+++ b/tests/Polyhedron/variablesset1.cc
@@ -0,0 +1,159 @@
+/* Test the Variables_Set class.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+
+  Variables_Set v_set(A, F);
+  v_set.insert(C);
+  v_set.insert(B);
+  v_set.insert(G);
+
+  Variables_Set known_result(A, G);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+  nout << "*** known_result ***" << endl << known_result << endl;
+
+  return v_set == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Variables_Set v_set(F, A);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+
+  return v_set.empty();
+}
+
+bool
+test03() {
+  Variable first(Variable::max_space_dimension()-1);
+  Variable last(0);
+
+  Variables_Set v_set(first, last);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+
+  return v_set.empty();
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+
+  Variables_Set vs1(A, C);
+  Variables_Set vs2(C, I);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** vs1 ***" << endl << vs1 << endl;
+  nout << "*** vs2 ***" << endl << vs2 << endl;
+
+  Variables_Set vs_union;
+  Variables_Set vs_difference;
+  Variables_Set vs_intersection;
+
+  std::set_union(vs1.begin(), vs1.end(),
+		 vs2.begin(), vs2.end(),
+		 std::inserter(vs_union, vs_union.begin()));
+  nout << "*** vs_union ***" << endl << vs_union << endl;
+  if (vs_union != Variables_Set(A, I))
+    return false;
+
+  std::set_difference(vs1.begin(), vs1.end(),
+		      vs2.begin(), vs2.end(),
+		      std::inserter(vs_difference, vs_difference.begin()));
+  nout << "*** vs_difference ***" << endl << vs_difference << endl;
+  if (vs_difference != Variables_Set(A, B))
+    return false;
+
+  std::set_intersection(vs1.begin(), vs1.end(),
+			vs2.begin(), vs2.end(),
+			std::inserter(vs_intersection,
+				      vs_intersection.begin()));
+  nout << "*** vs_intersection ***" << endl << vs_intersection << endl;
+  if (vs_intersection != Variables_Set(C))
+    return false;
+
+  return true;
+}
+
+
+bool
+test05() {
+  Variable A(0);
+
+  Variables_Set v_set;
+
+  if (!v_set.empty())
+    return false;
+
+  v_set.insert(Variable(A));
+  if (v_set.space_dimension() != 1)
+    return false;
+
+  v_set.insert(Variable(Variable::max_space_dimension()-1));
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+
+  return v_set.space_dimension() == Variable::max_space_dimension();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/watchdog1.cc b/tests/Polyhedron/watchdog1.cc
index 0b47a0d..8087cdd 100644
--- a/tests/Polyhedron/watchdog1.cc
+++ b/tests/Polyhedron/watchdog1.cc
@@ -1,11 +1,11 @@
 /* Test the timeout facility of the library.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Polyhedron/writeconsys1.cc b/tests/Polyhedron/writeconsys1.cc
index a7b322a..10269fc 100644
--- a/tests/Polyhedron/writeconsys1.cc
+++ b/tests/Polyhedron/writeconsys1.cc
@@ -1,11 +1,11 @@
 /* Test operator<<(std::ostream&, const Constraint_System&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,11 +21,6 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
-#include "files.hh"
-#include <fstream>
-
-using std::fstream;
-using std::ios_base;
 
 using namespace IO_Operators;
 
@@ -33,26 +28,55 @@ namespace {
 
 bool
 test01() {
-  const char* my_file = "writeconsys1.dat";
   Variable A(0);
   Variable B(1);
 
-  NNC_Polyhedron ph(2);
-  ph.add_constraint(A - 2*B > 2);
-  ph.add_constraint(Linear_Expression(0) <= -1);
-  ph.add_constraint(A == 2);
+  Constraint_System cs;
+  cs.insert(A - 2*B > 2);
+  cs.insert(Linear_Expression(0) <= -7);
+  cs.insert(A == 2);
+
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << cs;
+  nout << "*** s << cs ***" << endl << s.str() << endl;
+  return s.str() == "A - 2*B > 2, 0 >= 1, A = 2";
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << cs;
+  nout << "*** s << cs ***" << endl << s.str() << endl;
+  return s.str() == "true";
+}
+
+bool
+test03() {
+  Variable A(0);
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << ph.constraints() << endl;
-  close(f);
+  Constraint_System cs;
+  cs.insert(A > 2);
+  cs.insert(Linear_Expression(0) >= -1);
+  cs.insert(A == 2);
 
-  // FIXME.
-  return true;
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << cs;
+  nout << "*** s << cs ***" << endl << s.str() << endl;
+  return s.str() == "A > 2, A = 2";
 }
 
 } // namespace
 
 BEGIN_MAIN
   DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
 END_MAIN
diff --git a/tests/Polyhedron/writegensys1.cc b/tests/Polyhedron/writegensys1.cc
index 49cc20b..447105a 100644
--- a/tests/Polyhedron/writegensys1.cc
+++ b/tests/Polyhedron/writegensys1.cc
@@ -1,11 +1,11 @@
 /* Test operator<<(std::ostream&, const Generator_System&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -21,11 +21,6 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
-#include "files.hh"
-#include <fstream>
-
-using std::fstream;
-using std::ios_base;
 
 using namespace IO_Operators;
 
@@ -33,7 +28,6 @@ namespace {
 
 bool
 test01() {
-  const char* my_file = "writegensys1.dat";
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -45,32 +39,30 @@ test01() {
   gs.insert(ray(B + C));
   gs.insert(line(C));
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << gs << endl;
-  close(f);
-  // FIXME.
-  return true;
+  std::stringstream s;
+  s << gs;
+
+  nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "p(0), p(A - B), p(A + C), r(B + C), l(C)";
 }
 
 bool
 test02() {
-  const char* my_file = "writegensys1.dat";
   C_Polyhedron ph(3, EMPTY);
 
   Generator_System gs = ph.generators();
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << gs << endl;
-  close(f);
-  // FIXME.
-  return true;
+  std::stringstream s;
+  s << gs;
+
+  nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "false";
 }
 
 bool
 test03() {
-  const char* my_file = "writegensys1.dat";
   Variable A(0);
   Variable B(1);
 
@@ -80,12 +72,12 @@ test03() {
   gs.insert(ray(e1));
   gs.insert(point(3*A + B, 2));
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << gs << endl;
-  close(f);
-  // FIXME.
-  return true;
+  std::stringstream s;
+  s << gs;
+
+  nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "r(2*A + B), p((3*A + B)/2)";
 }
 
 } // namespace
diff --git a/tests/Polyhedron/writepolyhedron1.cc b/tests/Polyhedron/writepolyhedron1.cc
index 9a690b3..bfda837 100644
--- a/tests/Polyhedron/writepolyhedron1.cc
+++ b/tests/Polyhedron/writepolyhedron1.cc
@@ -1,11 +1,11 @@
 /* Test operator<<(std::ostream&, const Polyhedron&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,19 +22,12 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-#include "files.hh"
-#include <fstream>
-
-using std::fstream;
-using std::ios_base;
-
 using namespace IO_Operators;
 
 namespace {
 
 bool
 test01() {
-  const char* my_file = "writepolyhedron1.dat";
   Variable A(0);
   Variable B(1);
   Variable C(2);
@@ -46,27 +39,26 @@ test01() {
   ph.add_constraint(  A - B + 3*C >= 3);
   ph.add_constraint(3*A     + 2*C >= 3);
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << ph << endl;
-  close(f);
-  // FIXME.
-  return true;
+  std::stringstream s;
+  s << ph;
+
+  nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "false";
 }
 
 bool
 test02() {
-  const char* my_file = "writepolyhedron1.dat";
   NNC_Polyhedron ph1;
 
   C_Polyhedron ph(ph1.constraints());
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << ph << endl;
-  close(f);
-  // FIXME.
-  return true;
+  std::stringstream s;
+  s << ph;
+
+  nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "true";
 }
 
 } // namespace
diff --git a/tests/Polyhedron/writepolyhedron2.cc b/tests/Polyhedron/writepolyhedron2.cc
index b5a3696..7613043 100644
--- a/tests/Polyhedron/writepolyhedron2.cc
+++ b/tests/Polyhedron/writepolyhedron2.cc
@@ -1,11 +1,11 @@
 /* Test operator<<(std::ostream&, const Polyhedron&).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,19 +22,12 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 
-#include "files.hh"
-#include <fstream>
-
-using std::fstream;
-using std::ios_base;
-
 using namespace IO_Operators;
 
 namespace {
 
 bool
 test01() {
-  const char* my_file = "writepolyhedron2.dat";
   Variable x1(0);
   Variable x2(1);
   Variable x3(2);
@@ -56,12 +49,14 @@ test01() {
   ph.add_constraint(+  x1          <  1);
   ph.add_constraint(+  x1-x2+x3+x4 <= 2);
 
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << ph << endl;
-  close(f);
-  // FIXME.
-  return true;
+  std::stringstream s;
+  s << ph;
+
+  nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "-A > -1, -A + C + D >= 0, -A + B - C - D >= -2, -B >= -1,"
+    " -B + C + D >= 0, -C > -1, -D >= -1, 2*A - B - C + D > 0, C > 0, B > 0,"
+    " A - B - C >= -1, A - C + D > 0, A >= 0";
 }
 
 } // namespace
diff --git a/tests/Polyhedron/writerelation1.cc b/tests/Polyhedron/writerelation1.cc
index 8310444..e3ab851 100644
--- a/tests/Polyhedron/writerelation1.cc
+++ b/tests/Polyhedron/writerelation1.cc
@@ -1,12 +1,12 @@
 /* Test operator<<(std::ostream& s, const Poly_Con_Relation& r)
    and operator<<(std::ostream& s, const Poly_Gen_Relation& r).
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,67 +22,77 @@ For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
-#include "files.hh"
-#include <string>
-#include <fstream>
-
-using std::fstream;
-using std::ios_base;
-
-using namespace IO_Operators;
 
 namespace {
 
 bool
 test01() {
-  const char* my_file = "writerelation1.dat";
-  Poly_Con_Relation rel(Poly_Con_Relation::nothing());
-
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << rel << endl;
-  close(f);
-  // FIXME.
-  return true;
+  Poly_Con_Relation rel = Poly_Con_Relation::nothing();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "NOTHING";
 }
 
 bool
 test02() {
-  const char* my_file = "writerelation1.dat";
-  Poly_Gen_Relation rel(Poly_Gen_Relation::nothing());
-
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << rel << endl;
-  close(f);
-  // FIXME.
-  return true;
+  Poly_Con_Relation rel = Poly_Con_Relation::is_disjoint();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "IS_DISJOINT";
 }
 
 bool
 test03() {
-  const char* my_file = "writerelation1.dat";
-  Poly_Con_Relation rel(Poly_Con_Relation::is_disjoint());
-
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << rel << endl;
-  close(f);
-  // FIXME.
-  return true;
+  Poly_Con_Relation rel = Poly_Con_Relation::strictly_intersects();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "STRICTLY_INTERSECTS";
 }
 
 bool
 test04() {
-  const char* my_file = "writerelation1.dat";
-  Poly_Gen_Relation rel(Poly_Gen_Relation::subsumes());
-
-  fstream f;
-  open(f, my_file, ios_base::out);
-  f << rel << endl;
-  close(f);
-  // FIXME.
-  return true;
+  Poly_Con_Relation rel = Poly_Con_Relation::is_included();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "IS_INCLUDED";
+}
+
+bool
+test05() {
+  Poly_Con_Relation rel = Poly_Con_Relation::saturates();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "SATURATES";
+}
+
+bool
+test06() {
+  Poly_Gen_Relation rel = Poly_Gen_Relation::nothing();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "NOTHING";
+}
+
+bool
+test07() {
+  Poly_Gen_Relation rel = Poly_Gen_Relation::subsumes();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "SUBSUMES";
 }
 
 } // namespace
@@ -92,4 +102,7 @@ BEGIN_MAIN
   DO_TEST(test02);
   DO_TEST(test03);
   DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
 END_MAIN
diff --git a/tests/Polyhedron/writevariable1.cc b/tests/Polyhedron/writevariable1.cc
index be7dafb..de5ed2f 100644
--- a/tests/Polyhedron/writevariable1.cc
+++ b/tests/Polyhedron/writevariable1.cc
@@ -1,12 +1,12 @@
 /* Test operator<<(std::ostream& s, Variable v)
    and the related machinery.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Powerset/Makefile.am b/tests/Powerset/Makefile.am
new file mode 100644
index 0000000..4872ff2
--- /dev/null
+++ b/tests/Powerset/Makefile.am
@@ -0,0 +1,70 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+simplifyusingcontext1 \
+powerset1 \
+pointsetpowerset1 pointsetpowerset2 pointsetpowerset3 \
+pointsetpowerset4 pointsetpowerset5 pointsetpowerset6 \
+product1
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+powerset1_SOURCES = powerset1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+pointsetpowerset2_SOURCES = pointsetpowerset2.cc
+pointsetpowerset3_SOURCES = pointsetpowerset3.cc
+pointsetpowerset4_SOURCES = pointsetpowerset4.cc
+pointsetpowerset5_SOURCES = pointsetpowerset5.cc
+pointsetpowerset6_SOURCES = pointsetpowerset6.cc
+
+product1_SOURCES = product1.cc
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES =
diff --git a/tests/Powerset/Makefile.in b/tests/Powerset/Makefile.in
new file mode 100644
index 0000000..cb51167
--- /dev/null
+++ b/tests/Powerset/Makefile.in
@@ -0,0 +1,739 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in 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.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = simplifyusingcontext1$(EXEEXT) powerset1$(EXEEXT) \
+	pointsetpowerset1$(EXEEXT) pointsetpowerset2$(EXEEXT) \
+	pointsetpowerset3$(EXEEXT) pointsetpowerset4$(EXEEXT) \
+	pointsetpowerset5$(EXEEXT) pointsetpowerset6$(EXEEXT) \
+	product1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Powerset
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 = simplifyusingcontext1$(EXEEXT) powerset1$(EXEEXT) \
+	pointsetpowerset1$(EXEEXT) pointsetpowerset2$(EXEEXT) \
+	pointsetpowerset3$(EXEEXT) pointsetpowerset4$(EXEEXT) \
+	pointsetpowerset5$(EXEEXT) pointsetpowerset6$(EXEEXT) \
+	product1$(EXEEXT)
+am_pointsetpowerset1_OBJECTS = pointsetpowerset1.$(OBJEXT)
+pointsetpowerset1_OBJECTS = $(am_pointsetpowerset1_OBJECTS)
+pointsetpowerset1_LDADD = $(LDADD)
+pointsetpowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset2_OBJECTS = pointsetpowerset2.$(OBJEXT)
+pointsetpowerset2_OBJECTS = $(am_pointsetpowerset2_OBJECTS)
+pointsetpowerset2_LDADD = $(LDADD)
+pointsetpowerset2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset3_OBJECTS = pointsetpowerset3.$(OBJEXT)
+pointsetpowerset3_OBJECTS = $(am_pointsetpowerset3_OBJECTS)
+pointsetpowerset3_LDADD = $(LDADD)
+pointsetpowerset3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset4_OBJECTS = pointsetpowerset4.$(OBJEXT)
+pointsetpowerset4_OBJECTS = $(am_pointsetpowerset4_OBJECTS)
+pointsetpowerset4_LDADD = $(LDADD)
+pointsetpowerset4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset5_OBJECTS = pointsetpowerset5.$(OBJEXT)
+pointsetpowerset5_OBJECTS = $(am_pointsetpowerset5_OBJECTS)
+pointsetpowerset5_LDADD = $(LDADD)
+pointsetpowerset5_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pointsetpowerset6_OBJECTS = pointsetpowerset6.$(OBJEXT)
+pointsetpowerset6_OBJECTS = $(am_pointsetpowerset6_OBJECTS)
+pointsetpowerset6_LDADD = $(LDADD)
+pointsetpowerset6_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powerset1_OBJECTS = powerset1.$(OBJEXT)
+powerset1_OBJECTS = $(am_powerset1_OBJECTS)
+powerset1_LDADD = $(LDADD)
+powerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_product1_OBJECTS = product1.$(OBJEXT)
+product1_OBJECTS = $(am_product1_OBJECTS)
+product1_LDADD = $(LDADD)
+product1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(pointsetpowerset1_SOURCES) $(pointsetpowerset2_SOURCES) \
+	$(pointsetpowerset3_SOURCES) $(pointsetpowerset4_SOURCES) \
+	$(pointsetpowerset5_SOURCES) $(pointsetpowerset6_SOURCES) \
+	$(powerset1_SOURCES) $(product1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES)
+DIST_SOURCES = $(pointsetpowerset1_SOURCES) \
+	$(pointsetpowerset2_SOURCES) $(pointsetpowerset3_SOURCES) \
+	$(pointsetpowerset4_SOURCES) $(pointsetpowerset5_SOURCES) \
+	$(pointsetpowerset6_SOURCES) $(powerset1_SOURCES) \
+	$(product1_SOURCES) $(simplifyusingcontext1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+powerset1_SOURCES = powerset1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+pointsetpowerset1_SOURCES = pointsetpowerset1.cc
+pointsetpowerset2_SOURCES = pointsetpowerset2.cc
+pointsetpowerset3_SOURCES = pointsetpowerset3.cc
+pointsetpowerset4_SOURCES = pointsetpowerset4.cc
+pointsetpowerset5_SOURCES = pointsetpowerset5.cc
+pointsetpowerset6_SOURCES = pointsetpowerset6.cc
+product1_SOURCES = product1.cc
+MOSTLYCLEANFILES = 
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Powerset/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Powerset/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+pointsetpowerset1$(EXEEXT): $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_DEPENDENCIES) 
+	@rm -f pointsetpowerset1$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset1_OBJECTS) $(pointsetpowerset1_LDADD) $(LIBS)
+pointsetpowerset2$(EXEEXT): $(pointsetpowerset2_OBJECTS) $(pointsetpowerset2_DEPENDENCIES) 
+	@rm -f pointsetpowerset2$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset2_OBJECTS) $(pointsetpowerset2_LDADD) $(LIBS)
+pointsetpowerset3$(EXEEXT): $(pointsetpowerset3_OBJECTS) $(pointsetpowerset3_DEPENDENCIES) 
+	@rm -f pointsetpowerset3$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset3_OBJECTS) $(pointsetpowerset3_LDADD) $(LIBS)
+pointsetpowerset4$(EXEEXT): $(pointsetpowerset4_OBJECTS) $(pointsetpowerset4_DEPENDENCIES) 
+	@rm -f pointsetpowerset4$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset4_OBJECTS) $(pointsetpowerset4_LDADD) $(LIBS)
+pointsetpowerset5$(EXEEXT): $(pointsetpowerset5_OBJECTS) $(pointsetpowerset5_DEPENDENCIES) 
+	@rm -f pointsetpowerset5$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset5_OBJECTS) $(pointsetpowerset5_LDADD) $(LIBS)
+pointsetpowerset6$(EXEEXT): $(pointsetpowerset6_OBJECTS) $(pointsetpowerset6_DEPENDENCIES) 
+	@rm -f pointsetpowerset6$(EXEEXT)
+	$(CXXLINK) $(pointsetpowerset6_OBJECTS) $(pointsetpowerset6_LDADD) $(LIBS)
+powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES) 
+	@rm -f powerset1$(EXEEXT)
+	$(CXXLINK) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS)
+product1$(EXEEXT): $(product1_OBJECTS) $(product1_DEPENDENCIES) 
+	@rm -f product1$(EXEEXT)
+	$(CXXLINK) $(product1_OBJECTS) $(product1_LDADD) $(LIBS)
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pointsetpowerset6.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/product1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *$$ws$$tst$$ws*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Powerset/pointsetpowerset1.cc b/tests/Powerset/pointsetpowerset1.cc
new file mode 100644
index 0000000..3677f5c
--- /dev/null
+++ b/tests/Powerset/pointsetpowerset1.cc
@@ -0,0 +1,508 @@
+/* Test Pointset_Powerset<PH>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<C_Polyhedron> ps(cs);
+  return ps.OK();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> nnc_ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps(nnc_ps);
+
+  return c_ps.OK();
+}
+
+bool
+test03() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.add_constraint(x == 1);
+
+  Pointset_Powerset<NNC_Polyhedron> nnc_ps(c_ps);
+
+  return nnc_ps.OK();
+}
+
+bool
+test04() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.concatenate_assign(c_ps);
+
+  return c_ps.OK();
+}
+
+bool
+test05() {
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+  bool ok = c_ps.is_bottom();
+
+  c_ps.add_disjunct(C_Polyhedron(1, UNIVERSE));
+
+  bool ok1 = c_ps.is_top();
+
+  c_ps.total_memory_in_bytes();
+  c_ps.external_memory_in_bytes();
+
+  return ok && ok1;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  c_ps1.add_disjunct(C_Polyhedron(cs1));
+
+  bool ok = c_ps1.definitely_entails(c_ps);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = (c_ps.size() == 2);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.omega_reduce();
+
+  bool ok = (c_ps.size() == 1);
+
+  return ok;
+}
+
+bool
+test09() {
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  bool ok = (c_ps.space_dimension() == 1);
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  Constraint_System cs1 = cs;
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.drop_disjunct(c_ps.begin());
+
+  bool ok = c_ps.empty();
+
+  Constraint_System cs2 = cs1;
+  c_ps.add_disjunct(C_Polyhedron(cs1));
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.drop_disjuncts(c_ps.begin(), c_ps.end());
+
+  bool ok1 = c_ps.empty();
+
+  return ok && ok1;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1;
+  c_ps1 = c_ps;
+
+  bool ok = !c_ps.empty();
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps.swap(c_ps1);
+
+  bool ok = (c_ps.empty() && !c_ps1.empty());
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+  c_ps.least_upper_bound_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps2);
+  bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+  c_ps.upper_bound_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps2);
+  bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  c_ps.meet_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = !c_ps_expected.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.collapse();
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = c_ps_expected.definitely_entails(c_ps);
+  bool ok2 = (c_ps.size() == 1);
+
+  return ok && ok1 && ok2;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  phi.poly_hull_assign(phi1);
+  print_constraints(phi, "*** phi ***");
+
+  return ok && ok1;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps1(1);
+  Constraint_System cs;
+  cs.insert(x >= 5);
+  cs.insert(x <= 3);
+  c_ps1.add_constraints(cs);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+
+  bool ok1 = c_ps1.geometrically_equals(c_ps2);
+  bool ok2 = c_ps2.geometrically_equals(c_ps1);
+
+  return ok1 && ok2;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps1(1);
+  Constraint_System cs;
+  cs.insert(x >= 5);
+  cs.insert(x >= 8);
+  c_ps1.add_constraints(cs);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1);
+  cs.clear();
+  cs.insert(x >= 8);
+  c_ps2.add_constraints(cs);
+
+  bool ok1 = c_ps1.geometrically_equals(c_ps2);
+  bool ok2 = c_ps2.geometrically_equals(c_ps1);
+
+  return ok1 && ok2;
+}
+
+bool
+test20() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps1(2, UNIVERSE);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(2);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+  c_ps2.add_constraints(cs);
+
+  using namespace IO_Operators;
+  c_ps1.poly_difference_assign(c_ps2);
+
+  nout << c_ps1 << endl;
+
+  return true;
+}
+
+bool
+test21() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps1(2, UNIVERSE);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(2);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+  c_ps2.add_constraints(cs);
+
+  using namespace IO_Operators;
+  c_ps1.difference_assign(c_ps2);
+
+  nout << c_ps1 << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+END_MAIN
diff --git a/tests/Powerset/pointsetpowerset2.cc b/tests/Powerset/pointsetpowerset2.cc
new file mode 100644
index 0000000..3cc0ee0
--- /dev/null
+++ b/tests/Powerset/pointsetpowerset2.cc
@@ -0,0 +1,504 @@
+/* Test Pointset_Powerset<PH>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// affine_image
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.affine_image(x, x + y);
+
+  ph.affine_image(x, x + y);
+  ph1.affine_image(x, x + y);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// affine_preimage
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.affine_preimage(x, x + y);
+
+  ph.affine_preimage(x, x + y);
+  ph1.affine_preimage(x, x + y);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// generalized_affine_image/3
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+
+  ph.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+  ph1.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// generalized_affine_preimage
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+
+  ph.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+  ph1.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// generalized_affine_image/3
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.generalized_affine_image(x, GREATER_OR_EQUAL, Linear_Expression(3), 2);
+
+  ph.generalized_affine_image(x, GREATER_OR_EQUAL, Linear_Expression(3), 2);
+  ph1.generalized_affine_image(x, GREATER_OR_EQUAL, Linear_Expression(3), 2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// generalized_affine_preimage
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.generalized_affine_image(x, GREATER_OR_EQUAL, Linear_Expression(3), 2);
+
+  ph.generalized_affine_image(x, GREATER_OR_EQUAL, Linear_Expression(3), 2);
+  ph1.generalized_affine_image(x, GREATER_OR_EQUAL, Linear_Expression(3), 2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// generalized_affine_image/3
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+
+  ph.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+  ph1.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// generalized_affine_preimage
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.bounded_affine_preimage(y, x, 2*y, 5);
+
+  ph.bounded_affine_preimage(y, x, 2*y, 5);
+  ph1.bounded_affine_preimage(y, x, 2*y, 5);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// affine_dimension for powersets of C polyhedra
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(3, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  cs.insert(z <= 2);
+  cs.insert(z >= 2);
+  C_Polyhedron ph(3);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  cs1.insert(x == 6);
+  C_Polyhedron ph1(3);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  dimension_type d = c_ps.affine_dimension();
+
+
+  bool ok = (d == 3);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->element();
+  i++;
+  C_Polyhedron phi1 = i->element();
+
+  print_constraints(phi, "*** phi ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  c_ps.add_constraint(z == 2);
+
+  dimension_type d1 = c_ps.affine_dimension();
+
+  bool ok1 = (d1 == 2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator j = c_ps.begin();
+  C_Polyhedron phj = j->element();
+  j++;
+  C_Polyhedron phj1 = j->element();
+
+  print_constraints(phj, "*** phj ***");
+  print_constraints(phj1, "*** phj1 ***");
+
+  return ok && ok1;
+}
+
+// affine_dimension for powersets of NNC polyhedrs
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(1);
+  Pointset_Powerset<NNC_Polyhedron> c_ps(3, EMPTY);
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x <= 2);
+  cs.insert(z <= 2);
+  cs.insert(z >= 2);
+  NNC_Polyhedron ph(3);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  cs1.insert(x == 6);
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  dimension_type d = c_ps.affine_dimension();
+
+
+  bool ok = (d == 3);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = c_ps.begin();
+  NNC_Polyhedron phi = i->element();
+  i++;
+  NNC_Polyhedron phi1 = i->element();
+
+  print_constraints(phi, "*** phi ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  c_ps.add_constraint(z == 2);
+
+  dimension_type d1 = c_ps.affine_dimension();
+
+  bool ok1 = (d1 == 2);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator j = c_ps.begin();
+  NNC_Polyhedron phj = j->element();
+  j++;
+  NNC_Polyhedron phj1 = j->element();
+
+  print_constraints(phj, "*** phj ***");
+  print_constraints(phj1, "*** phj1 ***");
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+#if 0
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+#endif
+END_MAIN
diff --git a/tests/Powerset/pointsetpowerset3.cc b/tests/Powerset/pointsetpowerset3.cc
new file mode 100644
index 0000000..d6a7d51
--- /dev/null
+++ b/tests/Powerset/pointsetpowerset3.cc
@@ -0,0 +1,381 @@
+/* Test Pointset_Powerset<PH>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = !ps.is_universe();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool b1 = ps.is_universe();
+  return b && b1;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_universe();
+  return b;
+}
+
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = !ps.is_universe();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = ps.is_universe();
+  return b && b1;
+}
+
+bool
+test04() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_empty();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool b1 = !ps.is_empty();
+  return b && b1;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_empty();
+  return b;
+}
+
+bool
+test06() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_empty();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = !ps.is_empty();
+  return b && b1;
+}
+
+bool
+test07() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_topologically_closed();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool b1 = ps.is_topologically_closed();
+  return b && b1;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = ps.is_topologically_closed();
+  return b;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x < 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_topologically_closed();
+  return b;
+}
+
+bool
+test10() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_topologically_closed();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = ps.is_topologically_closed();
+  return b && b1;
+}
+
+bool
+test11() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_bounded();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  // A zero-dimension universe is bounded.
+  bool b1 = ps.is_bounded();
+  return b && b1;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_bounded();
+  return b;
+}
+
+bool
+test13() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_bounded();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = !ps.is_bounded();
+  return b && b1;
+}
+
+bool
+test14() {
+  Pointset_Powerset<C_Polyhedron> ps1(0, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> ps2(0, EMPTY);
+  bool b = ps1.is_disjoint_from(ps2);
+  bool c = ps2.is_disjoint_from(ps1);
+
+  ps1.add_disjunct(C_Polyhedron(0));
+  bool b1 = ps1.is_disjoint_from(ps2);
+  bool c1 = ps2.is_disjoint_from(ps1);
+
+  ps2.add_disjunct(C_Polyhedron(0));
+  bool b2 = !ps1.is_disjoint_from(ps2);
+  bool c2 = !ps2.is_disjoint_from(ps1);
+
+  return b && c && b1 && c1 && b2 && c2;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps1.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x == 2);
+  ps1.add_disjunct(NNC_Polyhedron(cs));
+
+  Pointset_Powerset<NNC_Polyhedron> ps2(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 2);
+  cs.insert(x <= 6);
+  ps2.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = ps1.is_disjoint_from(ps2);
+  bool c = ps2.is_disjoint_from(ps1);
+
+  cs.clear();
+  cs.insert(x >= 2);
+  ps2.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b1 = !ps1.is_disjoint_from(ps2);
+  bool c1 = !ps2.is_disjoint_from(ps1);
+
+  return b && c && b1 && c1;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<C_Polyhedron> ps1(1, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> ps2(1, EMPTY);
+  bool b = ps1.is_disjoint_from(ps2);
+  bool c = ps2.is_disjoint_from(ps1);
+
+  ps1.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = ps1.is_disjoint_from(ps2);
+  bool c1 = ps2.is_disjoint_from(ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool b2 = !ps1.is_disjoint_from(ps2);
+  bool c2 = !ps2.is_disjoint_from(ps1);
+
+  return b && c && b1 && c1 && b2 && c2;
+}
+
+bool
+test17() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_discrete();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  // A zero-dimension universe is discrete.
+  bool b1 = ps.is_discrete();
+  return b && b1;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x == 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = ps.is_discrete();
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b1 = !ps.is_discrete();
+  return b && b1;
+}
+
+bool
+test19() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_discrete();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = !ps.is_discrete();
+  return b && b1;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  bool b0 = !ps.is_universe();
+
+  Grid g(2);
+  g.add_congruence((A %= 0) / 2);
+  ps.add_disjunct(g);
+  bool b1 = !ps.is_universe();
+
+  g = Grid(2);
+  g.add_congruence((A + B %= 0) / 2);
+  ps.add_disjunct(g);
+  bool b2 = !ps.is_universe();
+
+  g = Grid(2);
+  ps.add_disjunct(g);
+  bool b3 = ps.is_universe();
+
+  return b0 && b1 && b2 && b3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Powerset/pointsetpowerset4.cc b/tests/Powerset/pointsetpowerset4.cc
new file mode 100644
index 0000000..9c65221
--- /dev/null
+++ b/tests/Powerset/pointsetpowerset4.cc
@@ -0,0 +1,686 @@
+/* Test Pointset_Powerset<PH>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  Linear_Expression LE;
+  bool ok1 = ps.bounds_from_above(LE);
+  bool ok2 = ps.bounds_from_below(LE);
+
+  if (!ok1 || !ok2)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(0));
+  ok1 = ps.bounds_from_above(LE);
+  ok2 = ps.bounds_from_below(LE);
+
+  return ok1 && ok2;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+  Linear_Expression LE = x;
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x > 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool ok1 = !ps.bounds_from_above(LE);
+  bool ok2 = ps.bounds_from_below(LE);
+
+  return ok1 && ok2;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  Linear_Expression LE = x;
+
+  bool ok1 = ps.bounds_from_above(LE);
+  bool ok2 = ps.bounds_from_below(LE);
+
+  if (!ok1 || !ok2)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  ok1 = !ps.bounds_from_above(LE);
+  ok2 = !ps.bounds_from_below(LE);
+
+  return ok1 && ok2;
+}
+
+bool
+test04() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = ps.maximize(LE, num, den, included)
+    && num == 0 && den == 1 && !included;
+  ok = ok && ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool ok1 = ps.maximize(LE, num, den, included)
+    && num == 0 && den == 1 && included;
+  ok1 = ok1 && ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok1;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Constraint_System cs;
+  Linear_Expression LE = x;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  bool max_included;
+  Generator max_g(point());
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(x < 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool ok = ps.maximize(LE, max_n, max_d, max_included)
+    && max_n == 14 && max_d == 1 && !max_included;
+  ok = ok && ps.maximize(LE, max_n, max_d, max_included, max_g)
+    && max_n == 14 && max_d == 1 && !max_included
+    && max_g.is_closure_point()
+    && max_g.divisor() == 1;
+
+  nout << max_n << "/" << max_d;
+  nout << " @ ";
+  print_generator(max_g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(x <= 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  ok = ps.maximize(LE, max_n, max_d, max_included)
+    && max_n == 14 && max_d == 1 && max_included;
+  ok = ok && ps.maximize(LE, max_n, max_d, max_included, max_g)
+    && max_n == 14 && max_d == 1 && max_included
+    && max_g.is_point()
+    && max_g.divisor() == 1;
+
+  nout << max_n << "/" << max_d;
+  nout << " @ ";
+  print_generator(max_g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Constraint_System cs;
+  Linear_Expression LE = 9*x + y;
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(3*x <= 14);
+  cs.insert(y >= 5);
+  cs.insert(11*y <= 87);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = ps.maximize(LE, num, den, included)
+    && num == 549 && den == 11 && included;
+  ok = ok && ps.maximize(LE, num, den, included, g)
+    && num == 549 && den == 11 && included
+    && g.is_point()
+    && g.divisor() == 33;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(x - 3*y >= 5);
+  cs.insert(x <= 28);
+  cs.insert(y >= 5);
+  cs.insert(4*y <= 85);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  ok = ps.maximize(LE, num, den, included)
+    && num == 779 && den == 3 && included;
+  ok = ok && ps.maximize(LE, num, den, included, g)
+    && num == 779 && den == 3 && included
+    && g.is_point()
+    && g.divisor() == 3;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Linear_Expression LE = x;
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  bool ok = ps.maximize(LE, num, den, included)
+    && num == 0 && den == 1 && !included;
+  ok = ok && ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(1));
+  ok = !ps.maximize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Linear_Expression LE;
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+  bool ok = ps.minimize(LE, num, den, included)
+    && num == 0 && den == 1 && !included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(0));
+  ok = ps.minimize(LE, num, den, included)
+    && num == 0 && den == 1 && included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Constraint_System cs;
+  Linear_Expression LE = x;
+
+  Coefficient min_n;
+  Coefficient min_d;
+  bool min_included;
+  Generator min_g(point());
+
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(2*x > 3);
+  cs.insert(x < 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool ok = ps.minimize(LE, min_n, min_d, min_included)
+    && min_n == 3 && min_d == 2 && !min_included;
+  ok = ok && ps.minimize(LE, min_n, min_d, min_included, min_g)
+    && min_n == 3 && min_d == 2 && !min_included
+    && min_g.is_closure_point()
+    && min_g.divisor() == 2;
+
+  nout << min_n << "/" << min_d;
+  nout << " @ ";
+  print_generator(min_g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(2*x >= 3);
+  cs.insert(x < 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  ok = ps.minimize(LE, min_n, min_d, min_included)
+    && min_n == 3 && min_d == 2 && min_included;
+  ok = ok && ps.minimize(LE, min_n, min_d, min_included, min_g)
+    && min_n == 3 && min_d == 2 && min_included
+    && min_g.is_point()
+    && min_g.divisor() == 2;
+
+  nout << min_n << "/" << min_d;
+  nout << " @ ";
+  print_generator(min_g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Constraint_System cs;
+  Linear_Expression LE = x + y;
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(x <= 4);
+  cs.insert(y >= 5);
+  cs.insert(y <= 8);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = ps.minimize(LE, num, den, included)
+    && num == 8 && den == 1 && included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 8 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(x - y >= 1);
+  cs.insert(x <= 8);
+  cs.insert(y >= 2);
+  cs.insert(y <= 10);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  ok = ps.minimize(LE, num, den, included)
+    && num == 5 && den == 1 && included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 5 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Linear_Expression LE = x;
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  bool ok = ps.minimize(LE, num, den, included)
+    && num == 0 && den == 1 && !included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(1));
+  ok = !ps.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Constraint c = (x >= 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraint(c);
+  Constraint c1 = (x >= 1);
+  bool ok = ps.add_constraint_and_minimize(c1);
+
+  return ok && ps.OK();
+}
+
+bool
+test13() {
+  Variable x(0);
+  Congruence cg = (Linear_Expression(0) %= 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_congruence(cg);
+  Congruence cg1 = ((Linear_Expression(25) %= 1) / 2);
+  ps.add_congruence(cg1);
+  bool ok = !ps.is_empty() && ps.OK();
+  return ok;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Constraint_System cs;
+  cs.insert(x >= 3);
+  cs.insert(x <= 4);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraints(cs);
+  cs.insert(x <= 3);
+  bool ok = ps.add_constraints_and_minimize(cs);
+  cs.insert(x <= 2);
+  ok &= !ps.add_constraints_and_minimize(cs);
+
+  return ok && ps.OK();
+}
+
+bool
+test15() {
+  Variable x(0);
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_congruences(cgs);
+  cgs.insert((x %= 0) / 0);
+  ps.add_congruences(cgs);
+  bool ok = !ps.is_empty();
+  cgs.insert((x %= 0) / 0);
+  cgs.insert((x %= 1) / 0);
+  ps.add_congruences(cgs);
+  ok &= ps.is_empty() && ps.OK();
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.intersection_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = c_ps_expected.definitely_entails(c_ps);
+
+  return ok && ok1 && c_ps.OK() && c_ps1.OK();
+}
+
+bool
+test17() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.intersection_assign_and_minimize(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok1 = c_ps.definitely_entails(c_ps_expected);
+  bool ok2 = c_ps_expected.definitely_entails(c_ps);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  cs.clear();
+  cs.insert(x == 4);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok3 = !c_ps2.intersection_assign_and_minimize(c_ps1);
+
+  return ok && ok1 && ok2 && ok3 && c_ps.OK() && c_ps1.OK() && c_ps2.OK();
+}
+
+bool
+test18() {
+  Pointset_Powerset<C_Polyhedron> ps1(1, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> ps2(1, EMPTY);
+  bool b = ps1.contains(ps2);
+  bool c = ps2.contains(ps1);
+  bool bs = ps1.strictly_contains(ps2);
+  bool cs = ps2.strictly_contains(ps1);
+
+  ps1.add_disjunct(C_Polyhedron(1));
+  bool b1 = ps1.contains(ps2);
+  bool c1 = !ps2.contains(ps1);
+  bool bs1 = ps1.strictly_contains(ps2);
+  bool cs1 = !ps2.strictly_contains(ps1);
+
+  ps2.add_disjunct(C_Polyhedron(1));
+  bool b2 = ps1.contains(ps2);
+  bool c2 = ps2.contains(ps1);
+  bool bs2 = !ps1.strictly_contains(ps2);
+  bool cs2 = !ps2.strictly_contains(ps1);
+
+  bool ok = b && c && b1 && c1 && b2 && c2;
+  bool oks = bs && cs && bs1 && cs1 && bs2 && cs2;
+
+  return ok && oks;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 4);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.contains(c_ps1)
+    && !c_ps1.contains(c_ps)
+    && c_ps.strictly_contains(c_ps1)
+    && !c_ps1.strictly_contains(c_ps);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 4);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  bool ok1 = c_ps.contains(c_ps1)
+    && !c_ps1.contains(c_ps)
+    && !c_ps.strictly_contains(c_ps1)
+    && !c_ps1.strictly_contains(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test20() {
+  Variable x(0);
+  Pointset_Powerset<NNC_Polyhedron> ps(1);
+  Constraint_System cs;
+  cs.clear();
+  cs.insert(x > 5);
+  cs.insert(x > 8);
+  ps.add_constraints(cs);
+
+  ps.topological_closure_assign();
+
+  bool ok = ps.OK();
+
+  Pointset_Powerset<NNC_Polyhedron> known_ps(1);
+  cs.clear();
+  cs.insert(x >= 5);
+  cs.insert(x >= 8);
+  known_ps.add_constraints(cs);
+
+  ok = ok && ps.contains(known_ps);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F8(test05);
+  DO_TEST_F8(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Powerset/pointsetpowerset5.cc b/tests/Powerset/pointsetpowerset5.cc
new file mode 100644
index 0000000..799cc8c
--- /dev/null
+++ b/tests/Powerset/pointsetpowerset5.cc
@@ -0,0 +1,629 @@
+/* Test Pointset_Powerset<PH>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Constraint c = (x == 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraint(c);
+  Congruence cg((x %= 0) / 0);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);;
+
+  return ok && ps.OK();
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Congruence cg((x %= 1) / 0);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Congruence cg((x %= 3) / 4);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test04() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x >= 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Congruence cg((x %= 3) / 4);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test05() {
+  Variable x(0);
+  Constraint c = (x == 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraint(c);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);;
+
+  return ok && ps.OK();
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Constraint c(x == 1);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test07() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Constraint c(x >= 3);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test08() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x >= 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Constraint c(x >= 3);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test09() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Generator g(point(x));
+  Poly_Gen_Relation rel = ps.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test10() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Generator g(line(3*x));
+  Poly_Gen_Relation rel = ps.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+bool
+test11() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  dimension_type m = 2;
+
+  ps.add_space_dimensions_and_embed(m);
+  bool ok = (ps.space_dimension() == 3 && ps.affine_dimension() == 3);
+
+  ps.add_space_dimensions_and_project(m);
+  bool ok1 = (ps.space_dimension() == 5 && ps.affine_dimension() == 3);
+
+  ps.remove_higher_space_dimensions(4);
+  bool ok2 = (ps.space_dimension() == 4 && ps.affine_dimension() == 3);
+
+  Pointset_Powerset<Rational_Box> psb(7, EMPTY);
+  Rational_Box b(7);
+  b.add_constraint(x >= 1);
+  b.add_constraint(x <= 0);
+  psb.add_disjunct(b);
+  bool ok3 = (psb.space_dimension() == 7 && psb.affine_dimension() == 0);
+
+  Pointset_Powerset<Grid> psg(7, EMPTY);
+  Grid g(7);
+  g.add_congruence((x %= 0) / 2);
+  g.add_congruence((x %= 1) / 2);
+  psg.add_disjunct(g);
+  bool ok4 = (psg.space_dimension() == 7 && psg.affine_dimension() == 0);
+
+  return ok && ok1 && ok2 && ok3 && ok4 && ps.OK();
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(z == 1);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(z == 1);
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(w);
+
+  ps.remove_space_dimensions(to_be_removed);
+  bool ok = (ps.space_dimension() == 2 && ps.affine_dimension() == 1);
+
+  return ok && ps.OK();
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(z == 1);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(z == 1);
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  ps.expand_space_dimension(y, 2);
+  bool ok = (ps.space_dimension() == 6 && ps.affine_dimension() == 5);
+
+  return ok && ps.OK();
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(z == 1);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(z == 1);
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(y);
+  to_be_folded.insert(w);
+
+  ps.fold_space_dimensions(to_be_folded, z);
+  bool ok = (ps.space_dimension() == 2 && ps.affine_dimension() == 2);
+
+  return ok && ps.OK();
+}
+
+// Constructs the powerset of one polyhedron { x >= 0, x <= 1/2, y >= 0 }
+// from the corresponding box.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x <= 1);
+  box.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(box);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(2*x <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of one polyhedron
+// from the empty box.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(box);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Uses refine_with_constraint and refine_with_congruence
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  ph2.add_constraint(B >= 2);
+  Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(pps);
+
+  pps.refine_with_constraint(C == 0);
+  pps.refine_with_constraint(D < 0);
+  pps.refine_with_congruence(B + D %= 2);
+  pps.refine_with_congruence((B - D %= 2) / 0);
+
+
+  known_pps.add_constraint(C == 0);
+  known_pps.add_constraint(A <= 2);
+  known_pps.add_constraint(B <= 2);
+  known_pps.add_constraint(B - D == 2);
+
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+  i++;
+  C_Polyhedron phi1 = i->element();
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok;
+}
+
+// Uses refine_with_constraints and refine_with_congruences
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(pps);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B >= 0);
+  cs.insert(B - C < 3);
+  cs.insert(D == 1);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((C %= 2) / 0);
+
+  pps.refine_with_constraints(cs);
+  pps.refine_with_congruences(cgs);
+
+  known_pps.add_constraint(C == 2);
+  known_pps.add_constraint(D == 1);
+  known_pps.add_constraint(A + 2*B >= 0);
+  known_pps.add_constraint(B - C <= 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// use of refine_with_constraints() makes the powerset empty.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B >= 0);
+  cs.insert(B - C < 3);
+  cs.insert(A > 1);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((B - C %= 4) / 0);
+
+  pps.refine_with_constraints(cs);
+  pps.refine_with_congruences(cgs);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(4, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Uses refine_with_constraints and refine_with_congruences
+// with NNC polyhedra
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(B >= 0);
+
+  NNC_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  ph2.add_constraint(B >= 2);
+  Pointset_Powerset<NNC_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Pointset_Powerset<NNC_Polyhedron> known_pps(pps);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B >= 0);
+  cs.insert(B - C < 3);
+  cs.insert(D == 1);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((C %= 2) / 0);
+
+  pps.refine_with_constraints(cs);
+  pps.refine_with_congruences(cgs);
+
+  known_pps.add_constraint(C == 2);
+  known_pps.add_constraint(D == 1);
+  known_pps.add_constraint(A + 2*B >= 0);
+  known_pps.add_constraint(B - C < 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+  NNC_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+  i++;
+  NNC_Polyhedron phi1 = i->element();
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Powerset/pointsetpowerset6.cc b/tests/Powerset/pointsetpowerset6.cc
new file mode 100644
index 0000000..91816e5
--- /dev/null
+++ b/tests/Powerset/pointsetpowerset6.cc
@@ -0,0 +1,372 @@
+/* Test Pointset_Powerset<PH>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a closed polyhedron.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron c_ph(4);
+  c_ph.add_constraint(x <= 2);
+  c_ph.add_constraint(z == 1);
+  NNC_Polyhedron nnc_ph(c_ph);
+
+  Pointset_Powerset<C_Polyhedron> c_pps1(c_ph);
+  Pointset_Powerset<C_Polyhedron> c_pps2(4, EMPTY);
+  c_pps2.add_disjunct(c_ph);
+
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps1(c_ph);
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps2(4, EMPTY);
+  nnc_pps2.add_disjunct(nnc_ph);
+
+  bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_pps1.begin();
+  C_Polyhedron c_phi = c_i->element();
+  print_constraints(c_phi, "*** c_phi ***");
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_pps1.begin();
+  NNC_Polyhedron nnc_phi = nnc_i->element();
+  print_constraints(nnc_phi, "*** nnc_phi ***");
+
+  return ok && c_pps1.OK() && nnc_pps1.OK();
+}
+
+// Constructs the powerset of polyhedra from an nnc polyhedron.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  NNC_Polyhedron nnc_ph(4);
+  nnc_ph.add_constraint(x <= 2);
+  nnc_ph.add_constraint(z == 1);
+  C_Polyhedron c_ph(nnc_ph);
+
+  Pointset_Powerset<C_Polyhedron> c_pps1(nnc_ph);
+  Pointset_Powerset<C_Polyhedron> c_pps2(4, EMPTY);
+  c_pps2.add_disjunct(c_ph);
+
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps1(nnc_ph);
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps2(4, EMPTY);
+  nnc_pps2.add_disjunct(nnc_ph);
+
+  bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_pps1.begin();
+  C_Polyhedron c_phi = c_i->element();
+  print_constraints(c_phi, "*** c_phi ***");
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_pps1.begin();
+  NNC_Polyhedron nnc_phi = nnc_i->element();
+  print_constraints(nnc_phi, "*** nnc_phi ***");
+
+  return ok && c_pps1.OK() && nnc_pps1.OK();
+}
+
+// Constructs the powerset of polyhedra from a grid.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2);
+  grid.add_congruence((2*x %= 1) / 0);
+  grid.add_congruence(y %= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(grid);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty grid.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(grid);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a bd shape.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(bds);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(x - y <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty bd shape.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(bds);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an octagonal shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x >= 0);
+  os.add_constraint(x + y <= 1);
+  os.add_constraint(x - y <= 3);
+  os.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(os);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(x + y <= 1);
+  known_pps.add_constraint(x - y <= 3);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty octagonal shape.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(os);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a box.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x <= 1);
+  box.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(box);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(2*x <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty box.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(box);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of grids.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2);
+  grid.add_congruence((2*x %= 1) / 0);
+  grid.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(grid);
+
+  Pointset_Powerset<C_Polyhedron> pps(pps_gr);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of nnc polyhedra from a powerset of
+// closed polyhedra.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*x == 1);
+  ph.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps_c(ph);
+
+  Pointset_Powerset<NNC_Polyhedron> pps(pps_c);
+
+  Pointset_Powerset<NNC_Polyhedron> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+  NNC_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of nnc polyhedra from a powerset of
+// closed polyhedra.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<C_Polyhedron> pps(2);
+
+  pps.add_constraint(x >= 1);
+  pps.add_constraint(x <= 1);
+  pps.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps1(pps, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i1 = pps.begin();
+  C_Polyhedron phi1 = i1->element();
+  print_constraints(phi1, "*** phi1 ***");
+
+  pps.OK();
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->element();
+  phi.OK();
+  print_constraints(phi, "*** phi after ok check ***");
+
+  bool ok = true;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Powerset/powerset1.cc b/tests/Powerset/powerset1.cc
new file mode 100644
index 0000000..964180c
--- /dev/null
+++ b/tests/Powerset/powerset1.cc
@@ -0,0 +1,177 @@
+/* Test Powerset<D>.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Uses every public Powerset method.
+bool
+test01() {
+  typedef Powerset<FCAIBVP> PS;
+
+  Variable A(0);
+
+  PS ps1;
+  ps1.add_disjunct(FCAIBVP(A));
+
+  PS ps2 = ps1;
+
+  if (ps2 != ps1 || !(ps2 == ps1))
+    return false;
+
+  using IO_Operators::operator<<;
+  nout << "ps1:" << endl << ps1 << endl;
+
+  FCAIBVP d(A);
+  PS ps3(d);
+
+  if (!ps1.definitely_entails(ps3))
+    return false;
+
+  if (ps3.is_top())
+    return false;
+
+  if (ps1.is_bottom())
+    return false;
+
+  nout << "Total memory: " << ps3.total_memory_in_bytes() << endl
+       << "External memory: " << ps3.external_memory_in_bytes() << endl;
+
+  ps3.omega_reduce();
+
+  if (ps3.size() == 0)
+    return false;
+
+  if (ps3.empty())
+    return false;
+
+  // Iterator.
+  dimension_type count = 0;
+  for (PS::iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  // Constant iterator.
+  count = 0;
+  for (PS::const_iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  // Reverse iterator.
+  count = 0;
+  for (PS::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  // Constant reverse iterator.
+  count = 0;
+  for (PS::const_reverse_iterator i = ps3.rbegin(),
+	 ps3_rend = ps3.rend(); i != ps3_rend; ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  ps2 = ps3;
+  PS ps_empty;
+  ps2.drop_disjunct(ps2.begin());
+  if (ps2 != ps_empty)
+    return false;
+
+  ps2 = ps3;
+  ps2.drop_disjuncts(ps2.begin(),ps2.end());
+  if (ps2 != ps_empty)
+    return false;
+
+  ps2 = ps3;
+  ps2.clear();
+  if (ps2 != ps_empty)
+    return false;
+
+  ps3.swap(ps2);
+  ps3.swap(ps2);
+  if (ps3 != ps1 || ps2 != ps_empty)
+    return false;
+
+  ps2 = ps_empty;
+  ps2.least_upper_bound_assign(ps3);
+  if (ps2 != ps3)
+    return false;
+
+  ps2 = ps_empty;
+  ps2.upper_bound_assign(ps3);
+  if (ps2 != ps3)
+    return false;
+
+  Variable B(1);
+  ps2 = ps1;
+  ps2.meet_assign(ps3);
+  if (ps2 != ps3)
+    return false;
+
+  ps3.collapse();
+  if (ps3.size() != 1)
+    return false;
+
+  return true;
+}
+
+bool
+test02() {
+  Variable X(0);
+  Variable Y(1);
+
+  FCAIBVP XY(X);
+  XY.meet_assign(FCAIBVP(Y));
+
+  Powerset<FCAIBVP> ps;
+
+  ps.add_disjunct(FCAIBVP(X));
+  ps.add_disjunct(XY);
+  return ps.OK();
+}
+
+bool
+test03() {
+  Variable X(0);
+  Variable Y(1);
+
+  FCAIBVP XY(X);
+  XY.meet_assign(FCAIBVP(Y));
+
+  Powerset<FCAIBVP> ps;
+
+  ps.add_disjunct(XY);
+  ps.add_disjunct(FCAIBVP(X));
+  return ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/product1.cc b/tests/Powerset/product1.cc
new file mode 100644
index 0000000..c1ed988
--- /dev/null
+++ b/tests/Powerset/product1.cc
@@ -0,0 +1,72 @@
+/* Test Pointset_Powerset<Pointset_Powerset<PH> >.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+typedef NNC_Polyhedron Poly;
+typedef Domain_Product<Poly, Grid>::Constraints_Product CProduct;
+
+namespace {
+
+bool
+test01() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<CProduct> pscp(cs);
+  return pscp.OK();
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  CProduct cp(1);
+  cp.add_constraint(A == 0);
+  Pointset_Powerset<CProduct> pscp(1);
+  pscp.add_disjunct(cp);
+  return pscp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+/*   DO_TEST(test03); */
+/*   DO_TEST(test04); */
+/*   DO_TEST(test05); */
+/*   DO_TEST(test06); */
+/*   DO_TEST(test07); */
+/*   DO_TEST(test08); */
+/*   DO_TEST(test09); */
+/*   DO_TEST(test10); */
+/*   DO_TEST(test11); */
+/*   DO_TEST(test12); */
+/*   DO_TEST(test13); */
+/*   DO_TEST(test14); */
+/*   DO_TEST(test15); */
+/*   DO_TEST(test16); */
+/*   DO_TEST(test17); */
+/*   DO_TEST(test18); */
+/*   DO_TEST(test19); */
+/*   DO_TEST(test20); */
+/*   DO_TEST(test21); */
+END_MAIN
diff --git a/tests/Powerset/simplifyusingcontext1.cc b/tests/Powerset/simplifyusingcontext1.cc
new file mode 100644
index 0000000..afb0a2d
--- /dev/null
+++ b/tests/Powerset/simplifyusingcontext1.cc
@@ -0,0 +1,392 @@
+/* Test Pointset_Powerset::simplify_using_context_assign().
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL 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 3 of the License, or (at your
+option) any later version.
+
+The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k >= 1);
+  ph.add_constraint(k <= 10);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(k == 0);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k >= 1);
+  ph.add_constraint(k <= 10);
+
+  ps1.add_disjunct(ph);
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(k >= 1);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i <= 25);
+  ph.add_constraint(j <= 25);
+  ph.add_constraint(i + j >= 25);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->element());
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i <= 25);
+  ph.add_constraint(j <= 25);
+  ph.add_constraint(i + j >= 25);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 0);
+  ph.add_constraint(i <= 2);
+  ph.add_constraint(j >= 2);
+  ph.add_constraint(j <= 9);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j <= 10);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->element());
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 28);
+  ph.add_constraint(i <= 31);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i <= 25);
+  ph.add_constraint(j <= 25);
+  ph.add_constraint(i + j >= 25);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 30);
+  ph.add_constraint(i <= 32);
+  ph.add_constraint(j >= 2);
+  ph.add_constraint(j <= 9);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 28);
+  ph.add_constraint(i <= 31);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->element());
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i == 1);
+  ph.add_constraint(j + 1 == 0);
+  ph.add_constraint(k == 3);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i == 1);
+  ph.add_constraint(j + k == 2);
+  ph.add_constraint(k >= 0);
+  ph.add_constraint(k <= 3);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(k == 3);
+  // ph.add_constraint(j + 1 == 0);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->element());
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable i(0);
+  Variable j(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(i <= j);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(i == j);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, UNIVERSE);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->element());
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A >= 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A <= 0);
+
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(B >= 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A >= 0);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->element());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F8(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Random_Number_Generator.defs.hh b/tests/Random_Number_Generator.defs.hh
index 154c668..9fc0135 100644
--- a/tests/Random_Number_Generator.defs.hh
+++ b/tests/Random_Number_Generator.defs.hh
@@ -1,11 +1,11 @@
 /* Random_Number_Generator class declaration.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/Random_Number_Generator.inlines.hh b/tests/Random_Number_Generator.inlines.hh
index d79654d..89485d1 100644
--- a/tests/Random_Number_Generator.inlines.hh
+++ b/tests/Random_Number_Generator.inlines.hh
@@ -1,11 +1,11 @@
 /* Random_Number_Generator class implementation: inline functions.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,6 +23,8 @@ site: http://www.cs.unipr.it/ppl/ . */
 #ifndef PPL_Random_Number_Generator_inlines_hh
 #define PPL_Random_Number_Generator_inlines_hh 1
 
+#include <ctime>
+
 namespace Parma_Polyhedra_Library {
 
 namespace Implementation {
diff --git a/tests/Random_Number_Generator.types.hh b/tests/Random_Number_Generator.types.hh
index 87f2f01..47a7f7b 100644
--- a/tests/Random_Number_Generator.types.hh
+++ b/tests/Random_Number_Generator.types.hh
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
diff --git a/tests/files.cc b/tests/files.cc
index efb5cb1..a307f43 100644
--- a/tests/files.cc
+++ b/tests/files.cc
@@ -1,11 +1,11 @@
 /* Definition of simple helper functions to open and close files.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -23,6 +23,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "files.hh"
 #include <fstream>
 #include <iostream>
+#include <cstdlib>
 
 using namespace std;
 
@@ -35,7 +36,7 @@ open(fstream& s, const char* path, ios_base::openmode mode) {
       cerr << " for reading";
     else if (mode == ios_base::out)
       cerr << " for writing";
-    else if (mode == ios_base::in | ios_base::out)
+    else if (mode == (ios_base::in | ios_base::out))
       cerr << " for reading/writing";
     cerr << endl;
     exit(1);
diff --git a/tests/files.hh b/tests/files.hh
index 6dd97d6..008e542 100644
--- a/tests/files.hh
+++ b/tests/files.hh
@@ -1,11 +1,11 @@
 /* Declaration of simple helper functions to open and close files.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/tests/ppl_test.cc b/tests/ppl_test.cc
index 15abd2e..ec6f8f9 100644
--- a/tests/ppl_test.cc
+++ b/tests/ppl_test.cc
@@ -1,11 +1,11 @@
-/* Implementation of simple print functions used in test programs.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+/* Implementation of utility functions used in test programs.
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -22,7 +22,9 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl_test.hh"
 #include <csignal>
-#ifdef HAVE_FENV_H
+#include <iostream>
+#include <exception>
+#ifdef PPL_HAVE_FENV_H
 #include <fenv.h>
 #endif
 
@@ -35,20 +37,21 @@ namespace {
 
 void
 unexpected_exception_handler() {
-  cerr << "unexpected exception thrown" << endl;
+  std::cerr << "unexpected exception thrown" << std::endl;
   exit(1);
 }
 
 void
 uncaught_exception_handler() {
-  cerr << "uncaught exception" << endl;
+  std::cerr << "uncaught exception" << std::endl;
   exit(1);
 }
 
 void
 fpe_handler(int sig, siginfo_t* sip, void*) {
   if (sig != SIGFPE) {
-    cerr << "fpe_handler called on signal different from SIGFPE" << endl;
+    std::cerr << "fpe_handler called on signal different from SIGFPE"
+	      << std::endl;
     exit(1);
   }
   const char* s = 0;
@@ -81,22 +84,27 @@ fpe_handler(int sig, siginfo_t* sip, void*) {
     break;
   }
   if (s != 0)
-    cerr << "SIGFPE caught (cause: " << s << ")" << endl;
+    std::cerr << "SIGFPE caught (cause: " << s << ")"
+	      << std::endl;
   else {
-    cerr << "SIGFPE caught (unknown si_code " << sip->si_code << ")" << endl;
-#ifdef HAVE_FENV_H
-    cerr << "Inquire with fetestexcept(): ";
+    std::cerr << "SIGFPE caught (unknown si_code " << sip->si_code << ")"
+	      << std::endl;
+    // FIXME: as of GCC 4.3.0, defined(PPL_HAVE_FENV_H) does not provide
+    // the information we need (fenv.h is present, but does not contain
+    // the required definitions).
+#if defined(PPL_HAVE_FENV_H) && !defined(__CYGWIN__)
+    std::cerr << "Inquire with fetestexcept(): ";
     if (fetestexcept(FE_INEXACT))
-      cerr << "FE_INEXACT ";
+      std::cerr << "FE_INEXACT ";
     if (fetestexcept(FE_DIVBYZERO))
-      cerr << "FE_DIVBYZERO ";
+      std::cerr << "FE_DIVBYZERO ";
     if (fetestexcept(FE_UNDERFLOW))
-      cerr << "FE_UNDERFLOW ";
+      std::cerr << "FE_UNDERFLOW ";
     if (fetestexcept(FE_OVERFLOW))
-      cerr << "FE_OVERFLOW ";
+      std::cerr << "FE_OVERFLOW ";
     if (fetestexcept(FE_INVALID))
-      cerr << "FE_INVALID ";
-    cerr << endl;
+      std::cerr << "FE_INVALID ";
+    std::cerr << std::endl;
 #endif
   }
   exit(1);
@@ -111,12 +119,13 @@ set_handlers() {
   sigemptyset(&action.sa_mask);
   action.sa_flags = SA_SIGINFO;
   if (sigaction(SIGFPE, &action, NULL) != 0) {
-    cerr << "sigaction() failed" << endl;
+    std::cerr << "sigaction() failed"
+	      << std::endl;
     abort();
   }
 
-  set_unexpected(unexpected_exception_handler);
-  set_terminate(uncaught_exception_handler);
+  std::set_unexpected(unexpected_exception_handler);
+  std::set_terminate(uncaught_exception_handler);
 }
 
 bool
@@ -129,7 +138,7 @@ PPL::check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
     Checked_Number<float, Extended_Number_Policy> dd(d, ROUND_UP);
     nout << "Excessive " << d_name << " distance " << dd
 	 << ": should be at most " << max_d << "."
-	 << endl;
+	 << std::endl;
     return false;
   }
   else
diff --git a/tests/ppl_test.hh b/tests/ppl_test.hh
index c9e5513..aaf40ba 100644
--- a/tests/ppl_test.hh
+++ b/tests/ppl_test.hh
@@ -1,11 +1,11 @@
 /* Header file for test programs.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -25,15 +25,16 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 #include "ppl.hh"
 #include "print.hh"
+#include "FCAIBVP.defs.hh"
 #include "Partial_Function.defs.hh"
 #include "Random_Number_Generator.defs.hh"
 #include <stdexcept>
 #include <sstream>
 #include <list>
+#include <iterator>
 #include <string>
-
-using namespace std;
-using namespace Parma_Polyhedra_Library;
+#include <algorithm>
+#include <typeinfo>
 
 void
 set_handlers();
@@ -58,15 +59,16 @@ int						\
 main() try {					\
   set_handlers();				\
   bool succeeded = false;			\
-  list<string> failed_tests;
+  bool overflow = false;			\
+  std::list<std::string> failed_tests;
 
 #define END_MAIN							\
   if (failed_tests.empty())						\
     return 0;								\
   else {								\
     std::cerr << "failed tests: ";					\
-    copy(failed_tests.begin(), failed_tests.end(),			\
-	 ostream_iterator<string>(cerr, " "));				\
+    std::copy(failed_tests.begin(), failed_tests.end(),			\
+	      std::ostream_iterator<std::string>(std::cerr, " "));	\
     std::cerr << std::endl;						\
     return 1;								\
   }									\
@@ -84,15 +86,17 @@ catch (const std::exception& e) {					\
 }
 
 #define ANNOUNCE_TEST(test)		 \
-  nout << "\n=== " #test " ===" << endl
+  nout << "\n=== " #test " ===" << std::endl
 
 #define RUN_TEST(test)							\
   try {									\
+    overflow = false;							\
     succeeded = test();							\
   }									\
   catch (const std::overflow_error& e) {				\
     nout << "arithmetic overflow (" << e.what() << ")"			\
 	 << std::endl;							\
+    overflow = true;							\
     succeeded = false;							\
   }									\
   catch (const std::exception& e) {					\
@@ -119,78 +123,280 @@ catch (const std::exception& e) {					\
   if (succeeded)			 \
     failed_tests.push_back(#test);
 
-#if COEFFICIENT_BITS == 0
+#define DO_TEST_OVERFLOW(test)		 \
+  ANNOUNCE_TEST(test);			 \
+  RUN_TEST(test);			 \
+  if (succeeded || !overflow)		 \
+    failed_tests.push_back(#test);
+
+#define DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)			\
+  ANNOUNCE_TEST(test);							\
+  RUN_TEST(test);							\
+  if (!succeeded)							\
+    if (!overflow || has_exact_coefficient_type(shape(0, EMPTY)))	\
+      failed_tests.push_back(#test);
+
+#if PPL_COEFFICIENT_BITS == 0
 
 #define DO_TEST_F64(test) DO_TEST(test)
+#define DO_TEST_F64A(test) DO_TEST(test)
 #define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F32A(test) DO_TEST(test)
 #define DO_TEST_F16(test) DO_TEST(test)
 #define DO_TEST_F16A(test) DO_TEST(test)
 #define DO_TEST_F8(test) DO_TEST(test)
 #define DO_TEST_F8A(test) DO_TEST(test)
 
-#elif COEFFICIENT_BITS == 64
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test)
+
+#elif PPL_COEFFICIENT_BITS == 64
 
-#define DO_TEST_F64(test) DO_TEST_F(test)
+#ifdef NDEBUG
+
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST(test)
 #define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F32A(test) DO_TEST(test)
 #define DO_TEST_F16(test) DO_TEST(test)
 #define DO_TEST_F16A(test) DO_TEST(test)
 #define DO_TEST_F8(test) DO_TEST(test)
 #define DO_TEST_F8A(test) DO_TEST(test)
 
-#elif COEFFICIENT_BITS == 32
-
-#define DO_TEST_F64(test) DO_TEST_F(test)
-#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
+#else // PPL_COEFFICIENT_BITS == 64 && !defined(NDEBUG)
+
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F32A(test) DO_TEST(test)
 #define DO_TEST_F16(test) DO_TEST(test)
 #define DO_TEST_F16A(test) DO_TEST(test)
 #define DO_TEST_F8(test) DO_TEST(test)
 #define DO_TEST_F8A(test) DO_TEST(test)
 
-#elif COEFFICIENT_BITS == 16
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
+#endif // !defined(NDEBUG)
+
+#elif PPL_COEFFICIENT_BITS == 32
 
 #ifdef NDEBUG
 
-#define DO_TEST_F64(test) DO_TEST_F(test)
-#define DO_TEST_F32(test) DO_TEST_F(test)
-#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A(test) DO_TEST(test)
+#define DO_TEST_F16(test) DO_TEST(test)
 #define DO_TEST_F16A(test) DO_TEST(test)
 #define DO_TEST_F8(test) DO_TEST(test)
 #define DO_TEST_F8A(test) DO_TEST(test)
 
-#else
-
-#define DO_TEST_F64(test) DO_TEST_F(test)
-#define DO_TEST_F32(test) DO_TEST_F(test)
-#define DO_TEST_F16(test) DO_TEST_F(test)
-#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
+#else // PPL_COEFFICIENT_BITS == 32 && !defined(NDEBUG)
+
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
 #define DO_TEST_F8(test) DO_TEST(test)
 #define DO_TEST_F8A(test) DO_TEST(test)
 
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
 #endif // !defined(NDEBUG)
 
-#elif COEFFICIENT_BITS == 8
+#elif PPL_COEFFICIENT_BITS == 16
 
 #ifdef NDEBUG
 
-#define DO_TEST_F64(test) DO_TEST_F(test)
-#define DO_TEST_F32(test) DO_TEST_F(test)
-#define DO_TEST_F16(test) DO_TEST_F(test)
-#define DO_TEST_F16A(test) DO_TEST_F(test)
-#define DO_TEST_F8(test) DO_TEST_F(test)
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
 #define DO_TEST_F8A(test) DO_TEST(test)
 
-#else
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
+#else // PPL_COEFFICIENT_BITS == 16 && !defined(NDEBUG)
+
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
+#endif // !defined(NDEBUG)
+
+#elif PPL_COEFFICIENT_BITS == 8
+
+#ifdef NDEBUG
+
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
 
-#define DO_TEST_F64(test) DO_TEST_F(test)
-#define DO_TEST_F32(test) DO_TEST_F(test)
-#define DO_TEST_F16(test) DO_TEST_F(test)
-#define DO_TEST_F16A(test) DO_TEST_F(test)
-#define DO_TEST_F8(test) DO_TEST_F(test)
-#define DO_TEST_F8A(test) DO_TEST_F(test)
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+
+#else // PPL_COEFFICIENT_BITS == 8 && !defined(NDEBUG)
+
+#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8(test) DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8A(test) DO_TEST_OVERFLOW(test)
+
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape)   \
+  DO_TEST_OVERFLOW(test)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape)  \
+  DO_TEST_OVERFLOW(test)
 
 #endif // !defined(NDEBUG)
 
-#endif // COEFFICIENT_BITS == 8
+#endif // PPL_COEFFICIENT_BITS == 8
 
 
 // Turn s into a string: PPL_TEST_STR(x + y) => "x + y".
@@ -209,18 +415,84 @@ using std::endl;
 #define C_Polyhedron NNC_Polyhedron
 #endif
 
+#ifndef BOX_INSTANCE
+#define BOX_INSTANCE rt_r_oc
+#endif
+
 #ifndef BD_SHAPE_INSTANCE
 #define BD_SHAPE_INSTANCE mpq_class
 #endif
 
+#ifndef OCTAGONAL_SHAPE_INSTANCE
+#define OCTAGONAL_SHAPE_INSTANCE mpq_class
+#endif
+
 namespace Parma_Polyhedra_Library {
 
 //! Utility typedef to allow a macro argument to denote the long double type.
 typedef long double long_double;
 
+struct Floating_Real_Open_Interval_Info_Policy {
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Restriction_None
+<Interval_Info_Bitset<unsigned int, Floating_Real_Open_Interval_Info_Policy> >
+Floating_Real_Open_Interval_Info;
+
+typedef Interval<float, Floating_Real_Open_Interval_Info> fl_r_oc;
+typedef Interval<double, Floating_Real_Open_Interval_Info> db_r_oc;
+typedef Interval<long double, Floating_Real_Open_Interval_Info> ld_r_oc;
+
+struct Rational_Real_Open_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Restriction_None
+<Interval_Info_Bitset<unsigned int, Rational_Real_Open_Interval_Info_Policy> >
+Rational_Real_Open_Interval_Info;
+
+typedef Interval<mpq_class, Rational_Real_Open_Interval_Info> rt_r_oc;
+
+//! The incarnation of Box under test.
+typedef Box<BOX_INSTANCE> TBox;
+
 //! The incarnation of BD_Shape under test.
 typedef BD_Shape<BD_SHAPE_INSTANCE> TBD_Shape;
 
+//! The incarnation of Octagonal_Shape under test.
+typedef Octagonal_Shape<OCTAGONAL_SHAPE_INSTANCE> TOctagonal_Shape;
+
+template <typename Shape>
+inline bool
+has_exact_coefficient_type(const Shape&) {
+  return std::numeric_limits<typename Shape::coefficient_type>::is_exact;
+}
+
+template <typename Interval>
+inline bool
+has_exact_coefficient_type(const Box<Interval>&) {
+  return std::numeric_limits<typename Interval::boundary_type>::is_exact;
+}
+
 bool
 check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
 	       const char* max_d_s, const char* d_name);
@@ -293,10 +565,122 @@ check_result(const BD_Shape<T>& computed_result,
 		     max_r_d_s, max_e_d_s, max_l_d_s);
 }
 
-template <>
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+	     const BD_Shape<T>& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using namespace IO_Operators;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+    return false;
+  }
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+	     const BD_Shape<mpq_class>& known_result) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
 inline bool
 check_result(const BD_Shape<mpq_class>& computed_result,
-	     const BD_Shape<mpq_class>& known_result,
+	     const BD_Shape<mpq_class>& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using namespace IO_Operators;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+    return false;
+  }
+}
+
+template <typename T>
+bool
+check_result_i(const Octagonal_Shape<T>& computed_result,
+	       const Octagonal_Shape<mpq_class>& known_result,
+	       const char* max_r_d_s,
+	       const char* max_e_d_s,
+	       const char* max_l_d_s) {
+  using namespace IO_Operators;
+  Octagonal_Shape<mpq_class> q_computed_result(computed_result);
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (q_computed_result != known_result) {
+      nout << "Equality does not hold:"
+	   << "\ncomputed result is\n"
+	   << q_computed_result
+	   << "\nknown result is\n"
+	   << known_result
+	   << endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  if (!q_computed_result.contains(known_result)) {
+    nout << "Containment does not hold:"
+	 << "\ncomputed result is\n"
+	 << q_computed_result
+	 << "\nknown result is\n"
+	 << known_result
+	 << endl;
+    return false;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    nout << "Computed result is\n"
+	 << q_computed_result
+	 << "\nknown result is\n"
+	 << known_result
+	 << endl;
+  }
+  return ok;
+}
+
+template <typename T>
+bool
+check_result(const Octagonal_Shape<T>& computed_result,
+	     const Octagonal_Shape<mpq_class>& known_result,
+	     const char* max_r_d_s,
+	     const char* max_e_d_s,
+	     const char* max_l_d_s) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result,
+		     "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result,
+		     max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <>
+inline bool
+check_result(const Octagonal_Shape<mpq_class>& computed_result,
+	     const Octagonal_Shape<mpq_class>& known_result,
 	     const char*,
 	     const char*,
 	     const char*) {
@@ -306,83 +690,210 @@ check_result(const BD_Shape<mpq_class>& computed_result,
 
 template <typename T>
 bool
-check_result(const BD_Shape<T>& computed_result,
-	     const BD_Shape<mpq_class>& known_result) {
+check_result(const Octagonal_Shape<T>& computed_result,
+	     const Octagonal_Shape<mpq_class>& known_result) {
   return std::numeric_limits<T>::is_integer
     ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
     : check_result_i(computed_result, known_result, 0, 0, 0);
 }
 
-//! Compare copies of \p a and \p b.
-/*!
-  Comparing temporary copies ensures that the underlying
-  representation of \p a and \p b stays the same.
-*/
-template <typename T>
-inline bool
-copy_compare(const T& a, const T& b) {
-  const T tem_a = a;
-  const T tem_b = b;
-  return tem_a == tem_b;
-}
 
-//! Look for variation in \p a.
-/*!
-  Return <CODE>true</CODE> if \p a contains variation from
-  consistency, else return <CODE>false</CODE>.  Variation can be found
-  via the OK method, or via a comparison between \p a and an object
-  created from the ASCII dump of \p a.
+template <typename Interval>
+bool
+check_result_i(const Box<Interval>& computed_result,
+	       const Rational_Box& known_result,
+	       const char* max_r_d_s,
+	       const char* max_e_d_s,
+	       const char* max_l_d_s) {
+  using namespace IO_Operators;
+  Rational_Box q_computed_result(computed_result);
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (q_computed_result != known_result) {
+      nout << "Equality does not hold:"
+	   << "\ncomputed result is\n"
+	   << q_computed_result
+	   << "\nknown result is\n"
+	   << known_result
+	   << endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  if (!q_computed_result.contains(known_result)) {
+    nout << "Containment does not hold:"
+	 << "\ncomputed result is\n"
+	 << q_computed_result
+	 << "\nknown result is\n"
+	 << known_result
+	 << endl;
+    nout << "Individual dimensions where containment does not hold"
+	 << "\n(Variable: computed-result known-result):\n";
+    for (dimension_type i = 0; i < computed_result.space_dimension(); ++i) {
+      if (!q_computed_result.get_interval(Variable(i)).contains(known_result.get_interval(Variable(i))))
+	nout << Variable(i) << ": "
+	     << q_computed_result.get_interval(Variable(i))
+	     << ' '
+	     << known_result.get_interval(Variable(i))
+	     << endl;
+    }
+    return false;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    nout << "Computed result is\n"
+	 << q_computed_result
+	 << "\nknown result is\n"
+	 << known_result
+	 << endl;
+  }
+  return ok;
+}
 
-  It is assumed that \p a is up to date.
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+	     const Rational_Box& known_result,
+	     const char* max_r_d_s,
+	     const char* max_e_d_s,
+	     const char* max_l_d_s) {
+  return std::numeric_limits<typename Interval::boundary_type>::is_integer
+    ? check_result_i(computed_result, known_result,
+		     "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result,
+		     max_r_d_s, max_e_d_s, max_l_d_s);
+}
 
-  If the loading of the ASCII dump fails then an error message is
-  printed and `exit' is called.
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+	     const Box<Interval>& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using namespace IO_Operators;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+    return false;
+  }
+}
 
-  \p T must provide:
-    void ascii_dump(std::ostream& s) const;
-    bool ascii_load(std::istream& s);
-  and there must be a:
-    bool operator==(const T& x, const T& y);
-*/
-template <typename T>
-static bool
-find_variation(T& a) {
-  using namespace Parma_Polyhedra_Library::IO_Operators;
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+	     const Rational_Box& known_result) {
+  return std::numeric_limits<typename Interval::boundary_type>::is_integer
+    ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result, 0, 0, 0);
+}
 
-  if (!a.OK()) {
-    nout << "OK() failed\nASCII dump:" << endl;
-    a.ascii_dump(nout);
+inline bool
+check_result(const Rational_Box& computed_result,
+	     const Rational_Box& known_result) {
+  if (computed_result == known_result)
     return true;
+  else {
+    using namespace IO_Operators;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+    return false;
+  }
+}
+
+inline bool
+check_result(const Generator& computed_result,
+             const Generator& known_result,
+             const char* max_r_d_s,
+             const char* max_e_d_s,
+             const char* max_l_d_s) {
+  using namespace IO_Operators;
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (computed_result != known_result) {
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << computed_result
+           << "\nknown result is\n"
+           << known_result
+           << endl;
+      return false;
+    }
+    else
+      return true;
   }
 
-  /* FIX In some PPL classes (e.g. Congruence) the simple constructors
-     are private. */
-  //T b;
-  T b(a);
-  stringstream dump;
-  a.ascii_dump(dump);
-  if (!b.ascii_load(dump)) {
-    nout << "Failed to load `b' from the ASCII dump of `a'." << endl;
-    nout << "ASCII dump of `a':" << endl;
-    nout << dump.str();
-    exit(1);
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    nout << "Computed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
   }
+  return ok;
+}
 
-  if (a == b)
-    return false;
+inline bool
+check_result(const Checked_Number<mpq_class, Extended_Number_Policy>& computed,
+             const Checked_Number<mpq_class, Extended_Number_Policy>& known,
+             const char* max_r_d_s) {
+  using namespace IO_Operators;
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0) {
+    if (computed != known) {
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << computed
+           << "\nknown result is\n"
+           << known
+           << endl;
+      return false;
+    }
+    else
+      return true;
+  }
 
-  nout << "`b' loaded from ASCII dump of `a' should equal `a'" << endl
-       << "ASCII dump of `a':" << endl
-       << "------------------" << endl;
-  a.ascii_dump(nout);
-  nout << "ASCII dump of `b' (after comparison):" << endl
-       << "-------------------------------------" << endl;
-  b.ascii_dump(nout);
-  nout << "ASCII dump of `a' (after comparison):" << endl
-       << "-------------------------------------" << endl;
-  a.ascii_dump(nout);
-
-  return true;
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  sub_assign_r(r_d, known, computed, ROUND_NOT_NEEDED);
+  abs_assign_r(r_d, r_d, ROUND_NOT_NEEDED);
+  bool ok = check_distance(r_d, max_r_d_s, "rectilinear");
+  if (!ok) {
+    nout << "Computed result is\n"
+         << computed
+         << "\nknown result is\n"
+         << known
+         << endl;
+  }
+  return ok;
 }
 
 } // namespace Parma_Polyhedra_Library
diff --git a/tests/print.cc b/tests/print.cc
index 48f62a7..6e8b290 100644
--- a/tests/print.cc
+++ b/tests/print.cc
@@ -1,11 +1,11 @@
 /* Implementation of simple print functions used in test programs.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -114,7 +114,7 @@ print_generators(const Polyhedron& ph,
 void
 print_generators(const Grid& gr,
 		 const std::string& intro, std::ostream& s) {
-  print_generators(gr.generators(), intro, s);
+  print_generators(gr.grid_generators(), intro, s);
 }
 
 void
diff --git a/tests/print.hh b/tests/print.hh
index 4f9bdf6..01290a5 100644
--- a/tests/print.hh
+++ b/tests/print.hh
@@ -1,11 +1,11 @@
 /* Declaration of simple print functions used in test programs.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -27,6 +27,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "Partial_Function.types.hh"
 #include <string>
 #include <iostream>
+#include <cstdlib>
 
 #ifndef NOISY
 #define NOISY 0
@@ -38,7 +39,7 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 static bool
 check_noisy(const char* environment_variable) {
-#if HAVE_DECL_GETENV 
+#if PPL_HAVE_DECL_GETENV
   return getenv(environment_variable) != 0;
 #else
 #if NOISY
@@ -78,13 +79,6 @@ public:
 static noisy_ostream<char> nout(std::cout, "PPL_NOISY_TESTS");
 static noisy_ostream<char> vnout(std::cout, "PPL_VERY_NOISY_TESTS");
 
-// FIX use inline function?
-#define dump_grids(grid,known_grid)			\
-  nout << endl << "ASCII dump of grid:" << endl;	\
-  grid.ascii_dump(nout);				\
-  nout << endl << "ASCII dump of known grid:" << endl;	\
-  known_grid.ascii_dump(nout);
-
 void
 print_constraint(const Parma_Polyhedra_Library::Constraint& c,
 		 const std::string& intro = "",
@@ -100,6 +94,17 @@ print_constraints(const Parma_Polyhedra_Library::Polyhedron& ph,
 		  const std::string& intro = "",
 		  std::ostream& s = nout);
 
+template <typename Interval>
+void
+print_constraints(const Parma_Polyhedra_Library::Box<Interval>& box,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!intro.empty())
+    s << intro << std::endl;
+  s << box << std::endl;
+}
+
 template <typename T>
 void
 print_constraints(const Parma_Polyhedra_Library::BD_Shape<T>& bd,
@@ -111,9 +116,20 @@ print_constraints(const Parma_Polyhedra_Library::BD_Shape<T>& bd,
   s << bd << std::endl;
 }
 
+template <typename T>
+void
+print_constraints(const Parma_Polyhedra_Library::Octagonal_Shape<T>& oc,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!intro.empty())
+    s << intro << std::endl;
+  s << oc << std::endl;
+}
+
 template <typename PH>
 void
-print_constraints(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
+print_constraints(const Parma_Polyhedra_Library::Pointset_Powerset<PH>& pps,
 		  const std::string& intro = "",
 		  std::ostream& s = nout) {
   using namespace Parma_Polyhedra_Library::IO_Operators;
@@ -124,7 +140,7 @@ print_constraints(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
 
 template <typename PH>
 void
-print_congruences(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
+print_congruences(const Parma_Polyhedra_Library::Pointset_Powerset<PH>& pps,
 		  const std::string& intro = "",
 		  std::ostream& s = nout) {
   using namespace Parma_Polyhedra_Library::IO_Operators;
@@ -133,6 +149,19 @@ print_congruences(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
   s << pps << std::endl;
 }
 
+/*
+template <typename PH>
+void
+print_constraints(const Parma_Polyhedra_Library::Pointset_Ask_Tell<PH>& pat,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!intro.empty())
+    s << intro << std::endl;
+  s << pat << std::endl;
+}
+*/
+
 void
 print_congruence(const Parma_Polyhedra_Library::Congruence& c,
 		 const std::string& intro = "",
@@ -178,6 +207,22 @@ print_generators(const Parma_Polyhedra_Library::Grid& gr,
 		 const std::string& intro = "",
 		 std::ostream& s = nout);
 
+template <typename D1, typename D2, typename R>
+void
+print_constraints(const Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& pd,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  print_constraints(pd.constraints(), intro, s);
+}
+
+template <typename D1, typename D2, typename R>
+void
+print_congruences(const Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>& pd,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  print_congruences(pd.congruences(), intro, s);
+}
+
 void
 print_function(const Parma_Polyhedra_Library::Partial_Function& function,
 	       const std::string& intro = "",
diff --git a/utils/Makefile.am b/utils/Makefile.am
index 364c235..7d12297 100644
--- a/utils/Makefile.am
+++ b/utils/Makefile.am
@@ -1,11 +1,11 @@
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -29,7 +29,9 @@ timings.cc
 
 dist_noinst_SCRIPTS = \
 build_header.in \
-text2cxxarray.in
+text2cxxarray.in \
+cm_cleaner.sh \
+cm_splitter.sh
 
 noinst_SCRIPTS = \
 build_header \
@@ -47,11 +49,11 @@ do not modify; modify the .in file instead.
 do_subst = sed -e 's,[@]PERL[@],$(PERL),g' \
 	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
 
-build_header: build_header.in Makefile
+build_header: build_header.in
 	$(do_subst) < $(srcdir)/build_header.in > build_header
 	chmod +x build_header
 
-text2cxxarray: text2cxxarray.in Makefile
+text2cxxarray: text2cxxarray.in
 	$(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
 	chmod +x text2cxxarray
 
diff --git a/utils/Makefile.in b/utils/Makefile.in
index 2375330..9814bd4 100644
--- a/utils/Makefile.in
+++ b/utils/Makefile.in
@@ -1,8 +1,8 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 # This Makefile.in 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.
@@ -15,13 +15,13 @@
 @SET_MAKE@
 
 # Automake source file for the Parma Polyhedra Library.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -37,15 +37,11 @@
 # site: http://www.cs.unipr.it/ppl/ .
 
 
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
 install_sh_SCRIPT = $(install_sh) -c
@@ -63,7 +59,8 @@ subdir = utils
 DIST_COMMON = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_check_gmp.m4 \
 	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
 	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
@@ -73,8 +70,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
 	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
 	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
 	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
-	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_remainder_bug.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 \
+	$(top_srcdir)/m4/ax_prefix_config_h.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -88,64 +95,45 @@ libppl_utils_a_LIBADD =
 am_libppl_utils_a_OBJECTS = timings.$(OBJEXT)
 libppl_utils_a_OBJECTS = $(am_libppl_utils_a_OBJECTS)
 SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 SOURCES = $(libppl_utils_a_SOURCES)
 DIST_SOURCES = $(libppl_utils_a_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
 AMTAR = @AMTAR@
 AR = @AR@
-AS = @AS@
-ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
-ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
-BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
-BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
-BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
-BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
-BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
-BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
-BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
-BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
-BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
-BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
-BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
-BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
-BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
-BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
-BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
-CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
-CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
@@ -155,53 +143,51 @@ CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
-ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
-ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
-ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
-ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
 EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FGREP = @FGREP@
 GNU_PROLOG = @GNU_PROLOG@
-HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
-HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
-HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
-HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
-HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
-HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
-HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
-HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
-HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
-HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
-HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
-HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+GREP = @GREP@
+INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBGMP = @LIBGMP@
 LIBGMPXX = @LIBGMPXX@
+LIBGMPXX_PREFIX = @LIBGMPXX_PREFIX@
+LIBGMP_PREFIX = @LIBGMP_PREFIX@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBGMP = @LTLIBGMP@
 LTLIBGMPXX = @LTLIBGMPXX@
 LTLIBOBJS = @LTLIBOBJS@
 MAKEINFO = @MAKEINFO@
 MD5SUM = @MD5SUM@
-NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
-NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OCAMLC = @OCAMLC@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 PACKAGE_NAME = @PACKAGE_NAME@
@@ -210,56 +196,30 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 PERL = @PERL@
-PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
 PPL_VERSION_BETA = @PPL_VERSION_BETA@
 PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
 PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
 PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
 STRIP = @STRIP@
-SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
-SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
-SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
-SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
-SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
-SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG = @SWI_PROLOG@
 SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
 TEXT_MD5SUM = @TEXT_MD5SUM@
-USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
-USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
-USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
-USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
-USE_INT16_FALSE = @USE_INT16_FALSE@
-USE_INT16_TRUE = @USE_INT16_TRUE@
-USE_INT32_FALSE = @USE_INT32_FALSE@
-USE_INT32_TRUE = @USE_INT32_TRUE@
-USE_INT64_FALSE = @USE_INT64_FALSE@
-USE_INT64_TRUE = @USE_INT64_TRUE@
-USE_INT8_FALSE = @USE_INT8_FALSE@
-USE_INT8_TRUE = @USE_INT8_TRUE@
-USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
-USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
-USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
-USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
 VERSION = @VERSION@
 XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
 YAP_PROLOG = @YAP_PROLOG@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -271,10 +231,14 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
 coefficient_mnemonic = @coefficient_mnemonic@
 datadir = @datadir@
+datarootdir = @datarootdir@
 debug_flag = @debug_flag@
 docdir = @docdir@
+dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 extra_includes = @extra_includes@
 extra_libraries = @extra_libraries@
@@ -283,24 +247,42 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
+localedir = @localedir@
 localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
+ocamlc_root = @ocamlc_root@
 oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
 subdirs = @subdirs@
 swi_prolog = @swi_prolog@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
 xsb_prolog = @xsb_prolog@
 AM_CPPFLAGS = @extra_includes@
 noinst_LIBRARIES = libppl_utils.a
@@ -310,7 +292,9 @@ timings.cc
 
 dist_noinst_SCRIPTS = \
 build_header.in \
-text2cxxarray.in
+text2cxxarray.in \
+cm_cleaner.sh \
+cm_splitter.sh
 
 noinst_SCRIPTS = \
 build_header \
@@ -373,22 +357,22 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timings.Po at am__quote@
 
 .cc.o:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
- at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
- at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
@@ -399,17 +383,13 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
@@ -421,8 +401,8 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
 	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
@@ -432,13 +412,12 @@ ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	tags=; \
-	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 	     $$tags $$unique
@@ -452,22 +431,21 @@ distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
 	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 	    fi; \
@@ -519,7 +497,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
+	distclean-tags
 
 dvi: dvi-am
 
@@ -533,12 +511,20 @@ info-am:
 
 install-data-am:
 
+install-dvi: install-dvi-am
+
 install-exec-am:
 
+install-html: install-html-am
+
 install-info: install-info-am
 
 install-man:
 
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -559,19 +545,22 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-info-am
+uninstall-am:
+
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
 	clean-libtool clean-noinstLIBRARIES ctags dist-hook distclean \
 	distclean-compile distclean-generic distclean-libtool \
 	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
 	install-strip installcheck installcheck-am installdirs \
 	maintainer-clean maintainer-clean-generic mostlyclean \
 	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-info-am
+	pdf pdf-am ps ps-am tags uninstall uninstall-am
 
 
 # Even if the scripts listed in noinst_SCRIPTS are not distributed
@@ -580,11 +569,11 @@ uninstall-am: uninstall-info-am
 # we came up with to obtain this effect.
 dist-hook: $(noinst_SCRIPTS)
 
-build_header: build_header.in Makefile
+build_header: build_header.in
 	$(do_subst) < $(srcdir)/build_header.in > build_header
 	chmod +x build_header
 
-text2cxxarray: text2cxxarray.in Makefile
+text2cxxarray: text2cxxarray.in
 	$(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
 	chmod +x text2cxxarray
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/utils/build_header.in b/utils/build_header.in
index 4ebe2f3..178cea1 100644
--- a/utils/build_header.in
+++ b/utils/build_header.in
@@ -6,13 +6,13 @@ eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
     if 0;
 
 # Builds a self-contained C++ header file by performing recursive inclusion.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/utils/cm_cleaner.sh b/utils/cm_cleaner.sh
new file mode 100755
index 0000000..ceaa0e9
--- /dev/null
+++ b/utils/cm_cleaner.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# Erases all files listed in the cutting markers found on stdin.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CUTTING_MARKER_PREFIX="%<--%<--%<-- "
+
+while IFS= read -r line
+do
+  case "$line" in
+      $CUTTING_MARKER_PREFIX*)
+	  read dummy file <<EOF
+$line
+EOF
+	  rm -f "$file"
+	  ;;
+  esac
+done
diff --git a/utils/cm_splitter.sh b/utils/cm_splitter.sh
new file mode 100755
index 0000000..a72fb8c
--- /dev/null
+++ b/utils/cm_splitter.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# Splits stdin according to cutting markers.
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL 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 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CUTTING_MARKER_PREFIX="%<--%<--%<-- "
+
+open="false"
+
+while IFS= read -r line
+do
+  case "$line" in
+      $CUTTING_MARKER_PREFIX*)
+	  read dummy file <<EOF
+$line
+EOF
+	  exec 3>> "$file"
+	  open="true"
+	  ;;
+      *)
+	  [ $open = "true" ] && echo "$line" >&3
+	  ;;
+  esac
+done
diff --git a/utils/text2cxxarray.in b/utils/text2cxxarray.in
index 2dcac65..4404447 100644
--- a/utils/text2cxxarray.in
+++ b/utils/text2cxxarray.in
@@ -6,13 +6,13 @@ eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
     if 0;
 
 # Convert an ASCII text into the declaration of a C++ array.
-# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 #
 # This file is part of the Parma Polyhedra Library (PPL).
 #
 # The PPL 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
+# Free Software Foundation; either version 3 of the License, or (at your
 # option) any later version.
 #
 # The PPL is distributed in the hope that it will be useful, but WITHOUT
diff --git a/utils/timings.cc b/utils/timings.cc
index 1c30d82..bc3bb36 100644
--- a/utils/timings.cc
+++ b/utils/timings.cc
@@ -1,11 +1,11 @@
 /* Definitions of simple functions for printing timings.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT
@@ -20,7 +20,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
 For the most up-to-date information see the Parma Polyhedra Library
 site: http://www.cs.unipr.it/ppl/ . */
 
-#include <config.h>
+#include <ppl-config.h>
 
 #include "timings.hh"
 #include <cassert>
@@ -29,12 +29,13 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include <iomanip>
 #include <cstring>
 #include <cerrno>
+#include <cstdlib>
 
-#ifdef HAVE_SYS_TIME_H
+#ifdef PPL_HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_RESOURCE_H
+#ifdef PPL_HAVE_SYS_RESOURCE_H
 // This should be included after <time.h> and <sys/time.h> so as to make
 // sure we have the definitions for, e.g., `ru_utime'.
 # include <sys/resource.h>
@@ -42,11 +43,14 @@ site: http://www.cs.unipr.it/ppl/ . */
 
 using namespace std;
 
+#ifdef PPL_HAVE_TIMEVAL
 // To save the time when start_clock is called.
 static struct timeval saved_ru_utime;
+#endif
 
 void
 start_clock() {
+#if defined(PPL_HAVE_DECL_GETRUSAGE) && defined(PPL_HAVE_TIMEVAL)
   struct rusage rsg;
   if (getrusage(RUSAGE_SELF, &rsg) != 0) {
     cerr << "getrusage failed: " << strerror(errno) << endl;
@@ -54,10 +58,12 @@ start_clock() {
   }
   else
     saved_ru_utime = rsg.ru_utime;
+#endif
 }
 
 void
 print_clock(ostream& s) {
+#if defined(PPL_HAVE_DECL_GETRUSAGE) && defined(PPL_HAVE_TIMEVAL)
   struct rusage rsg;
   if (getrusage(RUSAGE_SELF, &rsg) != 0) {
     cerr << "getrusage failed: " << strerror(errno) << endl;
@@ -78,11 +84,19 @@ print_clock(ostream& s) {
       else
 	hsecs = 0;
     }
-    else
+    else {
       hsecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+      if (hsecs == 100) {
+	++secs;
+	hsecs = 0;
+      }
+    }
     assert(hsecs >= 0 && hsecs < 100 && secs >= 0);
     int fill_char = s.fill();
     s << secs << "." << setfill('0') << setw(2) << hsecs;
     s.fill(fill_char);
   }
+#else
+  s << "(no clock available)";
+#endif
 }
diff --git a/utils/timings.hh b/utils/timings.hh
index 73a8fb4..3bdb1b6 100644
--- a/utils/timings.hh
+++ b/utils/timings.hh
@@ -1,11 +1,11 @@
 /* Declaration of simple functions for printing timings.
-   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2001-2008 Roberto Bagnara <bagnara at cs.unipr.it>
 
 This file is part of the Parma Polyhedra Library (PPL).
 
 The PPL 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
+Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.
 
 The PPL is distributed in the hope that it will be useful, but WITHOUT

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ppl.git



More information about the debian-science-commits mailing list